--- gcc-4.8-4.8.2.orig/debian/FAQ.gcj +++ gcc-4.8-4.8.2/debian/FAQ.gcj @@ -0,0 +1,494 @@ +The GCJ FAQ +=========== + + The latest version of this document is always available at + http://gcc.gnu.org/java/faq.html. + + General Questions + + What license is used for libgcj? + How can I report a bug in libgcj? + How can I contribute to libgcj + Is libgcj part of GCC? + Will gcj and libgcj work on my machine? + How can I debug my Java program? + Can I interface byte-compiled and native java code? + + + Java Feature Support + + What Java API's are supported? How complete is + the support? + Does GCJ support using straight C native methods + ala JNI? + Why does GCJ use CNI? + What is the state of AWT support? + How about support for Swing ? + What support is there for RMI ? + Can I use any code from other OpenSource projects + to supplement libgcj's current features ? + What features of the Java language are/arn't supported + + + Build Issues + + I need something more recent than the last release; how + should I build it? + Linker bug on Solaris + Can I configure/build in the source tree? + My libgcj build fails with "invalid use of undefined type + struct sigcontext_struct" + + + Gcj Compile/Link Questions + + Why do I get undefined reference to `main' errors? + Can GCJ only handle source code? + "gcj -C" Doesn't seem to work like javac/jikes. Whats going on? + Where does GCJ look for files? + How does gcj resolve wether to compile .class or .java files? + I'm getting link errors! + I'm getting 'undefined symbol: __dso_handle' + + + Runtime Questions + + My program is dumping core! What's going on? + When I run the debugger I get a SEGV in the GC! What's going on? + I have just compiled and benchmarked my Java application + and it seems to be running slower than than XXX JIT JVM. Is there + anything I can do to make it go faster? + Can I profile Garbage Collection? + How do I increase the runtime's initial and maximum heap sizes? + How can I profile my application? + My program seems to hang and doesn't produce any output + + + Programming Issues + + Are there any examples of how to use CNI? + Is it possible to invoke GCJ compiled Java code from a + C++ application? + +General Questions +================= + + 1.1 What license is used for libgcj? + + libgcj is distributed under the GPL, with the 'libgcc exception'. + This means that linking with libgcj does not by itself cause + your program to fall under the GPL. See LIBGCJ_LICENSE in + the source tree for more details. + + 1.2 How can I report a bug in libgcj? + + libgcj has a corresponding Gnats bug database which you can + browse. You can also submit new bug reports from the Gnats + page. + + 1.3 How can I contribute to libgcj? + + You can send simple bug fixes in as patches. Please follow + the GCC guidelines for submitting patches. For more complex + changes, you must sign copyright over to the Free Software + Foundation. See the contribution page for details. + + 1.4 Is libgcj part of GCC? + + Yes, libgcj is now part of GCC. It can be downloaded, + configured and built as one single tree. + + 1.5 Will gcj and libgcj work on my machine? + + Gcj and libgcj are known to work more or less with IA-32 and + Sparc Solaris, Tru64 Unix, as well as IA-32, IA-64, Alpha, + and PowerPC Linux. They might work on other + systems. Generally speaking, porting to a new system should + not be hard. This would be a good way to volunteer. + + 1.6 How can I debug my Java program? + + gdb 5.0 includes support for debugging gcj-compiled Java + programs. For more information please read Java Debugging + with gdb. + + 1.7 Can I interface byte-compiled and native java code + + libgcj has a bytecode interpreter that allows you to mix + .class files with compiled code. It works pretty + transparently: if a compiled version of a class is not found + in the application binary or linked shared libraries, the + class loader will search for a bytecode version in your + classpath, much like a VM would. Be sure to build libgcj + with the --enable-interpreter option to enable this + functionality. + + The program "gij" provides a front end to the interpreter + that behaves much like a traditional virtual machine. You + can even use "gij" to run a shared library which is compiled + from java code and contains a main method: + + $ gcj -shared -o lib-HelloWorld.so HelloWorld.java + $ gij HelloWorld + + This works because gij uses Class.forName, which knows how + to load shared objects. + +Java Feature Support +==================== + + 2.1 What Java API's are supported? How complete is + the support? + + Matt Welsh writes: + + Just look in the 'libjava' directory of libgcj and see + what classes are there. Most GUI stuff isn't there yet, + that's true, but many of the other classes are easy to add + if they don't yet exist. + + I think it's important to stress that there is a big + difference between Java and the many libraries which Java + supports. Unfortunately, Sun's promise of "write once, run + everywhere" assumes much more than a JVM: you also need + the full set of JDK libraries. Considering that new Java + APIs come out every week, it's going to be impossible to + track everything. + + To make things worse, you can't simply run Sun's JDK + classes on any old JVM -- they assume that a bunch of + native methods are also defined. Since this native method + requirement isn't defined by the JDK specs, you're + effectively constrained to using Sun's JVMs if you want to + use Sun's JDK libraries. Oh yes -- you could also + reimplement all of those native methods yourself, and make + sure they behave exactly as Sun's do. Note that they're + undocumented! + + 2.2 Does GCJ support using straight C native methods + ala JNI? + + Yes. libgcj now has experimental support for JNI, in + addition to its native Compiled Native Interface (CNI). gcjh + will generate JNI stubs and headers using the "-jni" + option. However, we do prefer CNI: it is more efficient, + easier to write, and (at least potentially) easier to debug. + + 2.3 Why does GCJ use CNI? + + Per Bothner explains: + + We use CNI because we think it is a better solution, + especially for a Java implementation that is based on the + idea that Java is just another programming language that + can be implemented using standard compilation + techniques. Given that, and the idea that languages + implemented using Gcc should be compatible where it makes + sense, it follows that the Java calling convention should + be as similar as practical to that used for other + languages, especially C++, since we can think of Java as a + subset of C++. CNI is just a set of helper functions and + conventions built on the idea that C++ and Java have the + *same* calling convention and object layout; they are + binary compatible. (This is a simplification, but close + enough.) + + 2.4 What is the state of AWT support? + + Work is in progress to implement AWT and Java2D. We intend + to support both GTK and xlib peers written using CNI. Some + components are already working atop the xlib peers. + + 2.5 How about support for Swing? + + Once AWT support is working then Swing support can be + considered. There is at least one free-software partial + implementations of Swing that may be usable. + + 2.6 What support is there for RMI? + + RMI code exists on the CVS trunk (aka gcc 3.1), but it has + not been heavily tested. This code was donated by + Transvirtual Technologies. + + 2.7 Can I use any code from other OpenSource + projects to supplement libgcj's current features? + + Certainly. However, in many cases, if you wanted to + contribute the code back into the official libgcj + distribution, we would require that the original author(s) + assign copyright to the Free Software Foundation. As of + March 6, 2000, libgcj has been relicenced, and copyright + has been assigned to the FSF. This allows us to share and + merge much of the libgcj codebase with the Classpath + project. Our eventual goal is for Classpath to be an + upstream source provider for libgcj, however it will be + some time before this becomes reality: libgcj and Classpath + have different implementations of many core java + classes. In order to merge them, we need to select the best + (most efficient, cleanest) implementation of each + method/class/package, resolve any conflicts created by the + merge, and test the final result. Needless to say, this is + a lot of work. If you can help out, please let us know! + + 2.8 What features of the Java language are/aren't supported. + + GCJ supports all Java language constructs as per the Java + language Specification. Recent GCJ snapshots have added + support for most JDK1.1 (and beyond) language features, + including inner classes. + +Build Issues +============ + + 3.1 I need something more recent than the last release. + How should I build it? + + Please read here: http://gcc.gnu.org/java/build-snapshot.html + + 3.2 Linker bug on Solaris + + There is a known problem with the native Solaris linker when + using gcc/gcj. A good indication you've run into this + problem is if you get an error that looks like the following + when building libgcj: + +ld: warning: option -o appears more than once, first setting taken +ld: fatal: file libfoo.so: cannot open file: No such file or directory +ld: fatal: File processing errors. No output written to .libs/libfoo.so +collect2: ld returned 1 exit status + + A known workaround for this and other reported link problems + on the various releases of Solaris is to build gcc/gcj with + the latest GNU binutils instead of the native Solaris + ld. The most straightforward way to do this is to build and + install binutils, and then reference it in the configure for + gcc via --with-ld=/path_to_binutils_install/bin/ld + (--with-as may also be similarly specified but is not + believed to be required). + + Please note, gcc/gcj must be built using GNU ld prior to + doing a clean build of libgcj! + + 3.3 Can I configure/build in the source tree? + + No. You cannot configure/build in the source tree. If you + try, you'll see something like: + + $ ./configure [...] + Configuring for a i686-pc-linux-gnu host. + *** Cannot currently configure in source tree. + + Instead, you must build in another directory. E.g.: + + $ mkdir build + $ cd build + $ ../configure [...] + + 3.4 My libgcj build fails with "invalid use of undefined type + struct sigcontext_struct" + + If you're using Linux, this probably means you need to + upgrade to a newwer, glibc (libc6) based Linux + distribution. libgcj does not support the older linux libc5. + It might be possible to get a working libgcj by changing + occurances of "sigcontext_struct" to "sigcontext", however + this has not been tested. Even if it works, it is likely + that there are other issues with older libc versions that + would prevent libgcj from working correctly (threads bugs, + for example). + +Gcj Compile/Link Questions +========================== + + 4.1 Why do I get undefined reference to `main' errors? + + When using gcj to link a Java program, you must use the --main= + option to indicate the class that has the desired main method. + This is because every Java class can have a main method, thus + you have to tell gcj which one to use. + + 4.2 Can GCJ only handle source code? + + GCJ will compile both source (.java) and bytecode (.class) + files. However, in many cases the native code produced by + compiling from source is better optimized than that compiled + from .class files. + + Per Bothner explains: + + The reason is that when you compile to bytecode you lose a + lot of information about program structure etc. That + information helps in generating better code. We can in + theory recover the information we need by analysing the + structure of the bytecodes, but it is sometimes difficult + - or sometimes it just that no-one has gotten around to + it. Specific examples include loop structure (gcc + generates better code with explicit loops rather than with + the equivalent spaghetti code), array initializers, and + the JDK 1.1 `CLASS.class' syntax, all of which are + represented using more low-level constructs in bytecode. + + 4.3 "gcj -C" Doesn't seem to work like javac/jikes. Whats going on? + + The behavior of "gcj -C" is not at all like javac or jikes, + which will compile (not just scan) all .java's which are out + of date with regard to their .class's. + + 4.4 Where does GCJ look for files? + + GCJ looks for classes to compile based on the CLASSPATH + environment variable. libgcj.jar and other files are found + relative to the path of the compiler itself, so it is safe + to move the entire compiler tree to a different path, and + there is no need to include libgcj.jar in your CLASSPATH. + + 4.5 How does gcj resolve whether to compile .class or .java files? + + GCJ compiles only the files presented to it on the command + line. However, it also needs to scan other files in order to + determine the layout of other classes and check for errors + in your code. For these dependencies, GCJ will favour + .class files if they are available because it is faster to + parse a class file than source code. + + 4.6 I'm getting link errors + + If you get errors at link time that refer to 'undefined + reference to `java::lang::Object type_info function', verify + that you have compiled any CNI C++ files with the -fno-rtti + option. This is only required for versions of GCJ earlier + than 3.0. + + 4.7 I'm getting 'undefined symbol: __dso_handle' + + Some versions of the GNU linker have broken support for the + '.hidden' directive, which results in problems with shared + libraries built with recent versions of gcc. + + There are three solutions: + + - downgrade to binutils that don't support .hidden at all, + - upgrade to a recent binutils, or + - undef the HAVE_GAS_HIDDEN definition in gcc's auto-host.h + (and rebuild gcc). + +Runtime Questions +================= + + 5.1 My program is dumping core! What's going on? + + It could be any number of things. One common mistake is + having your CLASSPATH environment variable pointing at a + third party's java.lang and friends. Either unset CLASSPATH, + or make sure it does not refer to core libraries other than + those found in libgcj.jar.Note that newwer versions of GCJ + will reject the core class library if it wasn't generated by + GCJ itself. + + 5.2 When I run the debugger I get a SEGV in the GC! What's going on? + + This is "normal"; the Garbage Collector (GC) uses it to + determine stack boundaries. It is ordinarily caught and + handled by the GC -- you can see this in the debugger by + using cont to continue to the "real" segv. + + 5.3 I have just compiled and benchmarked my Java application + and it seems to be running slower than than XXX JIT JVM. Is there + anything I can do to make it go faster? + + A few things: + + - If your programs allocate many small, short lived objects, + the heap could be filling and triggering GC too + regularly. Try increasing the initial and maximum heap sizes + as per 5.5 How do I increase the runtime's initial and + maximum heap size? + - RE - array accesses. We have sub-optimal runtime checking + code, and the compiler is still not so smart about + automatically removing array checks. If your code is ready, + and it doesn't rely on them, try compiling with + --no-bounds-check. + - Try static linking. On many platforms, dynamic (PIC) + function calls are more expensive than static ones. In + particular, the interaction with boehm-gc seems to incur + extra overhead when shared libraries are used. + - If your Java application doesn't need threads, try + building libgcj using --enable-threads=none. Portions of the + libgcj runtime are still more efficient when + single-threaded. + + 5.4 Can I profile Garbage Collection? + + It is possible to turn on verbose GC output by supressing + the -DSILENT flag during build. One way to do this is to + comment out the line with #define SILENT 1 from + boehm-gc/configure before configuring libgcj. The GC will + print collection statistics to stdout. (Rebuilding boehm-gc + alone without this flag doesn't seem to work.) + + 5.5 How do I increase the runtime's initial and maximum heap sizes? + + Some programs that allocate many small, short-lived objects + can cause the default-sized heap to fill quickly and GC + often. With the 2.95.1 release there is no means to adjust + the heap at runtime. Recent snapshots provide the -ms and + -mx arguments to gij to specify the initial and maximum heap + sizes, respectively. + + 5.6 How can I profile my application? + + Currently, only single threaded Java code may be used by the + profiler (gprof). POSIX threads seem to be incompatible with + the gmon stuff. A couple of other tools that have been + mentioned on the GCJ mailing list are sprof and cprof. The + former is part of GNU libc. + + 5.7 My program seems to hang and doesn't produce any output + + Some versions had a bug in the iconv support. You can work + around it by setting LANG=en_US.UTF-8 at runtime, or give + the following option during compile time + -Dfile.encoding=UTF-8. This problem should no longer occur + as of November 1, 2000. + +Programming Issues +================== + + 6.1 Are there any examples of how to use CNI? + + Glenn Chambers has created a couple of trivial examples for + version 2.95 and version 3.0. As a comparison, here is the + same example as a JNI application using Kaffe. The same + code will work with GCJ, as shown here. + + Note that for version 2.95, you must compile the C++ files + used for CNI with the -fno-rtti option. This constraint + does not apply in version 3.0 and later. + + The primary source of documentation for CNI is at + http://gcc.gnu.org/java/papers/cni/t1.html + + 6.2 Is it possible to invoke GCJ compiled Java code from a + C++ application? + + Yes, GCJ 3.1 supports a CNI-based invocation interface as + well as the traditional JNI invocation API. See the GCJ + Manual for more details on how to use the CNI interface. + +Please send FSF & GNU inquiries & questions tognu@gnu.org.There are +also other waysto contact the FSF. + +These pages are maintained by The GCC team. + +Please send comments on these web pages and GCC to our publicmailing +list at gcc@gnu.org orgcc@gcc.gnu.org, send other questions to +gnu@gnu.org. + +Copyright (C) Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111, USA. + +Verbatim copying and distribution of this entire article is permitted +in any medium, provided this notice is preserved. + +Last modified 2003-04-30 --- gcc-4.8-4.8.2.orig/debian/NEWS.gcc +++ gcc-4.8-4.8.2/debian/NEWS.gcc @@ -0,0 +1,751 @@ +GCC 4.8 Release Series -- Changes, New Features, and Fixes +========================================================== + + +Caveats +======= + +GCC now uses C++ as its implementation language. This means that to build GCC +from sources, you will need a C++ compiler that understands C++ 2003. For more +details on the rationale and specific changes, please refer to the C++ +conversion page. + +To enable the Graphite framework for loop optimizations you now need CLooG +version 0.18.0 and ISL version 0.11.1. Both can be obtained from the GCC +infrastructure directory. The installation manual contains more information +about requirements to build GCC. + +GCC now uses a more aggressive analysis to derive an upper bound for the +number of iterations of loops using constraints imposed by language standards. +This may cause non-conforming programs to no longer work as expected, such as +SPEC CPU 2006 464.h264ref and 416.gamess. A new option, -fno-aggressive-loop- +optimizations, was added to disable this aggressive analysis. In some loops +that have known constant number of iterations, but undefined behavior is known +to occur in the loop before reaching or during the last iteration, GCC will +warn about the undefined behavior in the loop instead of deriving lower upper +bound of the number of iterations for the loop. The warning can be disabled +with -Wno-aggressive-loop-optimizations. + +On ARM, a bug has been fixed in GCC's implementation of the AAPCS rules for +the layout of vectors that could lead to wrong code being generated. Vectors +larger than 8 bytes in size are now by default aligned to an 8-byte boundary. +This is an ABI change: code that makes explicit use of vector types may be +incompatible with binary objects built with older versions of GCC. Auto- +vectorized code is not affected by this change. + +On AVR, support has been removed for the command-line option -mshort-calls +deprecated in GCC 4.7. + +On AVR, the configure option --with-avrlibc supported since GCC 4.7.2 is +turned on per default for all non-RTEMS configurations. This option arranges +for a better integration of AVR_Libc with avr-gcc. For technical details, see +PR54461. To turn off the option in non-RTEMS configurations, use --with- +avrlibc=no. If the compiler is configured for RTEMS, the option is always +turned off. + +More information on porting to GCC 4.8 from previous versions of GCC can be +found in the porting guide (http://gcc.gnu.org/gcc-4.8/porting_to.html) for +this release. + +General Optimizer Improvements (and Changes) +============================================ + + - DWARF4 is now the default when generating DWARF debug information. When -g + is used on a platform that uses DWARF debugging information, GCC will now + default to -gdwarf-4 -fno-debug-types-section. + GDB 7.5, Valgrind 3.8.0 and elfutils 0.154 debug information consumers + support DWARF4 by default. Before GCC 4.8 the default version used was + DWARF2. To make GCC 4.8 generate an older DWARF version use -g together with + -gdwarf-2 or -gdwarf-3. The default for Darwin and VxWorks is still + -gdwarf-2 -gstrict-dwarf. + + - A new general optimization level, -Og, has been introduced. It addresses the + need for fast compilation and a superior debugging experience while + providing a reasonable level of runtime performance. Overall experience for + development should be better than the default optimization level -O0. + + - A new option -ftree-partial-pre was added to control the partial redundancy + elimination (PRE) optimization. This option is enabled by default at the -O3 + optimization level, and it makes PRE more aggressive. + + - The option -fconserve-space has been removed; it was no longer useful on + most targets since GCC supports putting variables into BSS without making + them common. + + - The struct reorg and matrix reorg optimizations (command-line-options + -fipa-struct-reorg and -fipa-matrix-reorg) have been -removed. They did not + always work correctly, nor did they work -with link-time optimization (LTO), + hence were only applicable to -programs consisting of a single translation + unit. + + - Several scalability bottle-necks have been removed from GCC's optimization + passes. Compilation of extremely large functions, e.g. due to the use of the + flatten attribute in the "Eigen" C++ linear algebra templates library, is + significantly faster than previous releases of GCC. + + - Link-time optimization (LTO) improvements: + + - LTO partitioning has been rewritten for better reliability and + maintanibility. Several important bugs leading to link failures have been + fixed. + + - Interprocedural optimization improvements: + + - A new symbol table has been implemented. It builds on existing callgraph + and varpool modules and provide a new API. Unusual symbol visibilities and + aliases are handled more consistently leading to, for example, more + aggressive unreachable code removal with LTO. + + - The inline heuristic can now bypass limits on the size of of inlined + functions when the inlining is particularly profitable. This happens, for + example, when loop bounds or array strides get propagated. + + - Values passed through aggregates (either by value or reference) are now + propagated at the inter-procedural level leading to better inlining + decisions (for example in the case of Fortran array descriptors) and + devirtualization. + + - AddressSanitizer, a fast memory error detector, has been added and can be + enabled via -fsanitize=address. Memory access instructions will be + instrumented to detect heap-, stack-, and global-buffer overflow as well as + use-after-free bugs. To get nicer stacktraces, use -fno-omit-frame-pointer. + The AddressSanitizer is available on IA-32/x86-64/x32/PowerPC/PowerPC64 GNU/ + Linux and on x86-64 Darwin. + + - ThreadSanitizer has been added and can be enabled via -fsanitize=thread. + Instructions will be instrumented to detect data races. The ThreadSanitizer + is available on x86-64 GNU/Linux. + + +New Languages and Language specific improvements +================================================ + + +C family +-------- + + - Each diagnostic emitted now includes the original source line and a caret + '^' indicating the column. The option -fno-diagnostics-show-caret suppresses + this information. + + - The option -ftrack-macro-expansion=2 is now enabled by default. This allows + the compiler to display the macro expansion stack in diagnostics. Combined + with the caret information, an example diagnostic showing these two features + is: + + t.c:1:94: error: invalid operands to binary < (have ‘struct mystruct’ and ‘float’) + #define MYMAX(A,B) __extension__ ({ __typeof__(A) __a = (A); + __typeof__(B) __b = (B); + __a < __b ? __b : __a; }) + ^ + t.c:7:7: note: in expansion of macro 'MYMAX' + X = MYMAX(P, F); + ^ + + - A new -Wsizeof-pointer-memaccess warning has been added (also enabled by + -Wall) to warn about suspicious length parameters to certain string and + memory built-in functions if the argument uses sizeof. This warning warns + e.g. about memset (ptr, 0, sizeof (ptr)); if ptr is not an array, but a + pointer, and suggests a possible fix, or about + memcpy (&foo, ptr, sizeof (&foo));. + + - The new option -Wpedantic is an alias for -pedantic, which is now + deprecated. The forms -Wno-pedantic, -Werror=pedantic, and -Wno- + error=pedantic work in the same way as for any other -W option. One caveat + is that -Werror=pedantic is not equivalent to -pedantic-errors, since the + latter makes into errors some warnings that are not controlled by + -Wpedantic, and the former only affects diagnostics that are disabled when + using -Wno-pedantic. + + - The option -Wshadow no longer warns if a declaration shadows a function + declaration, unless the former declares a function or pointer to function, + because this is a_common_and_valid_case_in_real-world_code. + + +C++ +--- + + - G++ now implements the C++11 thread_local keyword; this differs from the GNU + __thread keyword primarily in that it allows dynamic initialization and + destruction semantics. Unfortunately, this support requires a run-time + penalty for references to non-function-local thread_local variables defined + in a different translation unit even if they don't need dynamic + initialization, so users may want to continue to use __thread for TLS + variables with static initialization semantics. + + If the programmer can be sure that no use of the variable in a non-defining + TU needs to trigger dynamic initialization (either because the variable is + statically initialized, or a use of the variable in the defining TU will be + executed before any uses in another TU), they can avoid this overhead with + the -fno-extern-tls-init option. + + OpenMP threadprivate variables now also support dynamic initialization and + destruction by the same mechanism. + + - G++ now implements the C++11 attribute syntax, e.g. + + [[noreturn]] void f(); + + and also the alignment specifier, e.g. + + alignas(double) int i; + + - G++ now implements C++11 inheriting constructors, e.g. + + struct A { A(int); }; + struct B: A { using A::A; }; // defines B::B(int) + B b(42); // OK + + - As of GCC 4.8.1, G++ implements the change to decltype semantics from N3276. + + struct A f(); + decltype(f()) g(); // OK, return type of f() is not required + to be complete. + + - G++ now supports a -std=c++1y option for experimentation with features + proposed for the next revision of the standard, expected around 2017. + Currently the only difference from -std=c++11 is support for return type + deduction in normal functions, as proposed in N3386. + + - The G++ namespace association extension, __attribute ((strong)), has been + deprecated. Inline namespaces should be used instead. + + - G++ now supports a -fext-numeric-literal option to control whether GNU + numeric literal suffixes are accepted as extensions or processed as C++11 + user-defined numeric literal suffixes. The flag is on (use suffixes for GNU + literals) by default for -std=gnu++*, and -std=c++98. The flag is off (use + suffixes for user-defined literals) by default for -std=c++11 and later. + + +Runtime Library (libstdc++) +--------------------------- + + - Improved_experimental_support_for_the_new_ISO_C++_standard,_C++11, + including: + + - forward_list meets the allocator-aware container requirements; + + - this_thread::sleep_for(), this_thread::sleep_until() and this_thread:: + yield() are defined without requiring the configure option + --enable-libstdcxx-time; + + - Improvements to : + + - SSE optimized normal_distribution. + + - Use of hardware RNG instruction for random_device on new x86 processors + (requires the assembler to support the instruction.) + + and : + + - New random number engine simd_fast_mersenne_twister_engine with an + optimized SSE implementation. + + - New random number distributions beta_distribution, normal_mv_distribution, + rice_distribution, nakagami_distribution, pareto_distribution, + k_distribution, arcsine_distribution, hoyt_distribution. + + - Added --disable-libstdcxx-verbose configure option to disable diagnostic + messages issued when a process terminates abnormally. This may be useful for + embedded systems to reduce the size of executables that link statically to + the library. + + +Fortran +------- + + - Compatibility notice: + + - Module files: The version of module files (.mod) has been incremented. + Fortran MODULEs compiled by earlier GCC versions have to be recompiled, + when they are USEd by files compiled with GCC 4.8. GCC 4.8 is not able to + read .mod files created by earlier versions; attempting to do so gives an + error message. + Note: The ABI of the produced assembler data itself has not changed; + object files and libraries are fully compatible with older versions except + as noted below. + + - ABI: Some internal names (used in the assembler/object file) have changed + for symbols declared in the specification part of a module. If an affected + module - or a file using it via use association - is recompiled, the + module and all files which directly use such symbols have to be recompiled + as well. This change only affects the following kind of module symbols: + + - Procedure pointers. Note: C-interoperable function pointers (type + (c_funptr)) are not affected nor are procedure-pointer components. + - Deferred-length character strings. + + - The BACKTRACE intrinsic subroutine has been added. It shows a backtrace at + an arbitrary place in user code; program execution continues normally + afterwards. + + - The -Wc-binding-type warning option has been added (disabled by default). It + warns if the a variable might not be C interoperable; in particular, if the + variable has been declared using an intrinsic type with default kind instead + of using a kind parameter defined for C interoperability in the intrinsic + ISO_C_Binding module. Before, this warning was always printed. The + -Wc-binding-type option is enabled by -Wall. + + - The -Wrealloc-lhs and -Wrealloc-lhs-all warning command-line options have + been added, which diagnose when code to is inserted for automatic + (re)allocation of a variable during assignment. This option can be used to + decide whether it is safe to use -fno-realloc-lhs. Additionally, it can be + used to find automatic (re)allocation in hot loops. (For arrays, replacing + var= by var(:)= disables the automatic reallocation.) + + - The -Wcompare-reals command-line option has been added. When this is set, + warnings are issued when comparing REAL or COMPLEX types for equality and + inequality; consider replacing a == b by abs(a-b) < eps with a suitable eps. + -Wcompare-reals is enabled by -Wextra. + + - The -Wtarget-lifetime command-line option has been added (enabled with + -Wall), which warns if the pointer in a pointer assignment might outlive its + target. + + - Reading floating point numbers which use q for the exponential (such as + 4.0q0) is now supported as vendor extension for better compatibility with + old data files. It is strongly recommended to use for I/O the equivalent but + standard conforming e (such as 4.0e0). + (For Fortran source code, consider replacing the q in floating-point + literals by a kind parameter (e.g. 4.0e0_qp with a suitable qp). Note that - + in Fortran source code - replacing q by a simple e is not equivalent.) + + - The GFORTRAN_TMPDIR environment variable for specifying a non-default + directory for files opened with STATUS="SCRATCH", is not used anymore. + Instead gfortran checks the POSIX/GNU standard TMPDIR environment variable. + If TMPDIR is not defined, gfortran falls back to other methods to determine + the directory for temporary files as documented in the user_manual. + + - Fortran_2003: + + - Support for unlimited polymorphic variables (CLASS(*)) has been added. + Nonconstant character lengths are not yet supported. + + - TS_29113: + + - Assumed types (TYPE(*)) are now supported. + + - Experimental support for assumed-rank arrays (dimension(..)) has been + added. Note that currently gfortran's own array descriptor is used, which + is different from the one defined in TS29113, see gfortran's_header_file + or use the Chasm_Language_Interoperability_Tools. + + +Go +-- + + - GCC 4.8.0 implements a preliminary version of the upcoming Go 1.1 release. + The library support is not quite complete, due to release timing. + + - Go has been tested on GNU/Linux and Solaris platforms for various processors + including x86, x86_64, PowerPC, SPARC, and Alpha. It may work on other + platforms as well. + + +New Targets and Target Specific Improvements +============================================ + + +AArch64 +------- + + - A new port has been added to support AArch64, the new 64-bit architecture + from ARM. Note that this is a separate port from the existing 32-bit ARM + port. + - The port provides initial support for the Cortex-A53 and the Cortex-A57 + processors with the command line options -mcpu=cortex-a53 and + -mcpu=cortex-a57. + + +ARM +--- + + - Initial support has been added for the AArch32 extensions defined in the + ARMv8 architecture. + + - Code generation improvements for the Cortex-A7 and Cortex-A15 CPUs. + + - A new option, -mcpu=marvell-pj4, has been added to generate code for the + Marvell PJ4 processor. + + - The compiler can now automatically generate the VFMA, VFMS, REVSH and REV16 + instructions. + + - A new vectorizer cost model for Advanced SIMD configurations to improve the + auto-vectorization strategies used. + + - The scheduler now takes into account the number of live registers to reduce + the amount of spilling that can occur. This should improve code performance + in large functions. The limit can be removed by using the option -fno-sched- + pressure. + + - Improvements have been made to the Marvell iWMMX code generation and support + for the iWMMX2 SIMD unit has been added. The option -mcpu=iwmmxt2 can be + used to enable code generation for the latter. + + - A number of code generation improvements for Thumb2 to reduce code size when + compiling for the M-profile processors. + + - The RTEMS (arm-rtems) port has been updated to use the EABI. + + - Code generation support for the old FPA and Maverick floating-point + architectures has been removed. Ports that previously relied on these + features have also been removed. This includes the targets: + + - arm*-*-linux-gnu (use arm*-*-linux-gnueabi) + - arm*-*-elf (use arm*-*-eabi) + - arm*-*-uclinux* (use arm*-*-uclinux*eabi) + - arm*-*-ecos-elf (no alternative) + - arm*-*-freebsd (no alternative) + - arm*-wince-pe* (no alternative). + + +AVR +--- + + - Support for the "Embedded C" fixed-point has been added. For details, see + the GCC_wiki and the user_manual. The support is not complete. + - A new print modifier %r for register operands in inline assembler is + supported. It will print the raw register number without the register prefix + 'r': + + /* Return the most significant byte of 'val', a 64-bit value. */ + + unsigned char msb (long long val) + { + unsigned char c; + __asm__ ("mov %0, %r1+7" : "=r" (c) : "r" (val)); + return c; + } + + The inline assembler in this example will generate code like + + mov r24, 8+7 + + provided c is allocated to R24 and val is allocated to R8...R15. This works + because the GNU assembler accepts plain register numbers without register + prefix. + + - Static initializers with 3-byte symbols are supported now: + + extern const __memx char foo; + const __memx void *pfoo = &foo; + + This requires at least Binutils 2.23. + + +IA-32/x86-64 +------------ + + - Allow -mpreferred-stack-boundary=3 for the x86-64 architecture with SSE + extensions disabled. Since the x86-64 ABI requires 16 byte stack alignment, + this is ABI incompatible and intended to be used in controlled environments + where stack space is an important limitation. This option will lead to wrong + code when functions compiled with 16 byte stack alignment (such as functions + from a standard library) are called with misaligned stack. In this case, SSE + instructions may lead to misaligned memory access traps. In addition, + variable arguments will be handled incorrectly for 16 byte aligned objects + (including x87 long double and __int128), leading to wrong results. You must + build all modules with -mpreferred-stack-boundary=3, including any + libraries. This includes the system libraries and startup modules. + + - Support for the new Intel processor codename Broadwell with RDSEED, ADCX, + ADOX, PREFETCHW is available through -madx, -mprfchw, -mrdseed command-line + options. + + - Support for the Intel RTM and HLE intrinsics, built-in functions and code + generation is available via -mrtm and -mhle. + + - Support for the Intel FXSR, XSAVE and XSAVEOPT instruction sets. Intrinsics + and built-in functions are available via -mfxsr, -mxsave and -mxsaveopt + respectively. + + - New -maddress-mode=[short|long] options for x32. -maddress-mode=short + overrides default 64-bit addresses to 32-bit by emitting the 0x67 address- + size override prefix. This is the default address mode for x32. + + - New built-in functions to detect run-time CPU type and ISA: + + - A built-in function __builtin_cpu_is has been added to detect if the run- + time CPU is of a particular type. It returns a positive integer on a match + and zero otherwise. It accepts one string literal argument, the CPU name. + For example, __builtin_cpu_is("westmere") returns a positive integer if + the run-time CPU is an Intel Core i7 Westmere processor. Please refer to + the user_manual for the list of valid CPU names recognized. + + - A built-in function __builtin_cpu_supports has been added to detect if the + run-time CPU supports a particular ISA feature. It returns a positive + integer on a match and zero otherwise. It accepts one string literal + argument, the ISA feature. For example, __builtin_cpu_supports("ssse3") + returns a positive integer if the run-time CPU supports SSSE3 + instructions. Please refer to the user_manual for the list of valid ISA + names recognized. + + Caveat: If these built-in functions are called before any static + constructors are invoked, like during IFUNC initialization, then the CPU + detection initialization must be explicitly run using this newly provided + built-in function, __builtin_cpu_init. The initialization needs to be done + only once. For example, this is how the invocation would look like inside an + IFUNC initializer: + + static void (*some_ifunc_resolver(void))(void) + { + __builtin_cpu_init(); + if (__builtin_cpu_is("amdfam10h") ... + if (__builtin_cpu_supports("popcnt") ... + } + + - Function Multiversioning Support with G++: + It is now possible to create multiple function versions each targeting a + specific processor and/or ISA. Function versions have the same signature but + different target attributes. For example, here is a program with function + versions: + + __attribute__ ((target ("default"))) + int foo(void) + { + return 1; + } + + __attribute__ ((target ("sse4.2"))) + int foo(void) + { + return 2; + } + + int main (void) + { + int (*p) = &foo; + assert ((*p)() == foo()); + return 0; + } + + Please refer to this wiki for more information. + + - The x86 backend has been improved to allow option -fschedule-insns to work + reliably. This option can be used to schedule instructions better and leads + to improved performace in certain cases. + + - Windows MinGW-w64 targets (*-w64-mingw*) require at least r5437 from the + Mingw-w64 trunk. + + - Support for new AMD family 15h processors (Steamroller core) is now + available through the -march=bdver3 and -mtune=bdver3 options. + + - Support for new AMD family 16h processors (Jaguar core) is now available + through the -march=btver2 and -mtune=btver2 options. + + +FRV +--- + + - This target now supports the -fstack-usage command-line option. + + +MIPS +---- + + - GCC can now generate code specifically for the R4700, Broadcom XLP and MIPS + 34kn processors. The associated -march options are -march=r4700, -march=xlp + and -march=34kn respectively. + + - GCC now generates better DSP code for MIPS 74k cores thanks to further + scheduling optimizations. + + - The MIPS port now supports the -fstack-check option. + + - GCC now passes the -mmcu and -mno-mcu options to the assembler. + + - Previous versions of GCC would silently accept -fpic and -fPIC for + -mno-abicalls targets like mips*-elf. This combination was not intended or + supported, and did not generate position-independent code. GCC 4.8 now + reports an error when this combination is used. + + +PowerPC / PowerPC64 / RS6000 +---------------------------- + + - SVR4 configurations (GNU/Linux, FreeBSD, NetBSD) no longer save, restore or + update the VRSAVE register by default. The respective operating systems + manage the VRSAVE register directly. + + - Large TOC support has been added for AIX through the command line option + -mcmodel=large. + + - Native Thread-Local Storage support has been added for AIX. + + - VMX (Altivec) and VSX instruction sets now are enabled implicitly when + targetting processors that support those hardware features on AIX 6.1 and + above. + + +RX +-- + + - This target will now issue a warning message whenever multiple fast + interrupt handlers are found in the same cpmpilation unit. This feature can + be turned off by the new -mno-warn-multiple-fast-interrupts command-line + option. + + +S/390, System z +--------------- + + - Support for the IBM zEnterprise zEC12 processor has been added. When using + the -march=zEC12 option, the compiler will generate code making use of the + following new instructions: + + - load and trap instructions + - 2 new compare and trap instructions + - rotate and insert selected bits - without CC clobber + + The -mtune=zEC12 option enables zEC12 specific instruction scheduling + without making use of new instructions. + + - Register pressure sensitive instruction scheduling is enabled by default. + + - The ifunc function attribute is enabled by default. + + - memcpy and memcmp invokations on big memory chunks or with run time lengths + are not generated inline anymore when tuning for z10 or higher. The purpose + is to make use of the IFUNC optimized versions in Glibc. + + +SH +-- + + - The default alignment settings have been reduced to be less aggressive. This + results in more compact code for optimization levels other than -Os. + + - Improved support for the __atomic built-in functions: + + - A new option -matomic-model=model selects the model for the generated + atomic sequences. The following models are supported: + + soft-gusa + Software gUSA sequences (SH3* and SH4* only). On SH4A targets this + will now also partially utilize the movco.l and movli.l + instructions. This is the default when the target is sh3*-*-linux* + or sh4*-*-linux*. + hard-llcs + Hardware movco.l / movli.l sequences (SH4A only). + soft-tcb + Software thread control block sequences. + soft-imask + Software interrupt flipping sequences (privileged mode only). This + is the default when the target is sh1*-*-linux* or sh2*-*-linux*. + none + Generates function calls to the respective __atomic built-in + functions. This is the default for SH64 targets or when the target + is not sh*-*-linux*. + + - The option -msoft-atomic has been deprecated. It is now an alias for + -matomic-model=soft-gusa. + + - A new option -mtas makes the compiler generate the tas.b instruction for + the __atomic_test_and_set built-in function regardless of the selected + atomic model. + + - The __sync functions in libgcc now reflect the selected atomic model when + building the toolchain. + + - Added support for the mov.b and mov.w instructions with displacement + addressing. + + - Added support for the SH2A instructions movu.b and movu.w. + + - Various improvements to code generated for integer arithmetic. + + - Improvements to conditional branches and code that involves the T bit. A new + option -mzdcbranch tells the compiler to favor zero-displacement branches. + This is enabled by default for SH4* targets. + + - The pref instruction will now be emitted by the __builtin_prefetch built-in + function for SH3* targets. + + - The fmac instruction will now be emitted by the fmaf standard function and + the __builtin_fmaf built-in function. + + - The -mfused-madd option has been deprecated in favor of the machine- + independent -ffp-contract option. Notice that the fmac instruction will now + be generated by default for expressions like a * b + c. This is due to the + compiler default setting -ffp-contract=fast. + + - Added new options -mfsrra and -mfsca to allow the compiler using the fsrra + and fsca instructions on targets other than SH4A (where they are already + enabled by default). + + - Added support for the __builtin_bswap32 built-in function. It is now + expanded as a sequence of swap.b and swap.w instructions instead of a + library function call. + + - The behavior of the -mieee option has been fixed and the negative form + -mno-ieee has been added to control the IEEE conformance of floating point + comparisons. By default -mieee is now enabled and the option -ffinite-math- + only implicitly sets -mno-ieee. + + - Added support for the built-in functions __builtin_thread_pointer and + __builtin_set_thread_pointer. This assumes that GBR is used to hold the + thread pointer of the current thread. Memory loads and stores relative to + the address returned by __builtin_thread_pointer will now also utilize GBR + based displacement address modes. + + +SPARC +----- + + - Added optimized instruction scheduling for Niagara4. + + +TILE-Gx +------- + + - Added support for the -mcmodel=MODEL command-line option. The models + supported are small and large. + + +V850 +---- + + - This target now supports the E3V5 architecture via the use of the new + -mv850e3v5 command-line option. It also has experimental support for the e3v5 + LOOP instruction which can be enabled via the new -mloop command-line + option. + + +XStormy16 +--------- + + - This target now supports the -fstack-usage command-line option. + + +Operating Systems +================= + + +Windows (Cygwin) +---------------- + + - Executables are now linked against shared libgcc by default. The previous + default was to link statically, which can still be done by explicitly + specifying -static or -static-libgcc on the command line. However it is + strongly advised against, as it will cause problems for any application that + makes use of DLLs compiled by GCC. It should be alright for a monolithic + stand-alone application that only links against the Windows OS DLLs, but + offers little or no benefit. + + +For questions related to the use of GCC, please consult these web +pages and the GCC manuals. If that fails, the gcc-help@gcc.gnu.org +mailing list might help. Please send comments on these web pages and +the development of GCC to our developer list at gcc@gcc.gnu.org. All +of our lists have public archives. + +Copyright (C) Free Software Foundation, Inc. + +Verbatim copying and distribution of this entire article is +permitted in any medium, provided this notice is preserved. + +These pages are maintained by the GCC team. + +Last modified 2013-03-23. --- gcc-4.8-4.8.2.orig/debian/NEWS.html +++ gcc-4.8-4.8.2/debian/NEWS.html @@ -0,0 +1,927 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +GCC 4.8 Release Series — Changes, New Features, and Fixes +- GNU Project - Free Software Foundation (FSF) + + + + + + + + + +

GCC 4.8 Release Series
Changes, New Features, and Fixes

+ + +

Caveats

+

GCC now uses C++ as its implementation language. This means that +to build GCC from sources, you will need a C++ compiler that +understands C++ 2003. For more details on the rationale and specific +changes, please refer to the C++ conversion +page.

+ +

To enable the Graphite framework for loop optimizations you now +need CLooG version 0.18.0 and ISL version 0.11.1. Both can be obtained +from the +GCC infrastructure +directory. The installation manual contains +more information about requirements to build GCC.

+ +

GCC now uses a more aggressive analysis to derive an upper bound for +the number of iterations of loops using constraints imposed by language +standards. This may cause non-conforming programs to no longer work as +expected, such as SPEC CPU 2006 464.h264ref and 416.gamess. A new +option, -fno-aggressive-loop-optimizations, was added +to disable this aggressive analysis. In some loops that have known +constant number of iterations, but undefined behavior is known to occur +in the loop before reaching or during the last iteration, GCC will warn +about the undefined behavior in the loop instead of deriving lower upper +bound of the number of iterations for the loop. The warning +can be disabled with -Wno-aggressive-loop-optimizations.

+ +

On ARM, a bug has been fixed in GCC's implementation of the AAPCS +rules for the layout of vectors that could lead to wrong code being +generated. Vectors larger than 8 bytes in size are now by default +aligned to an 8-byte boundary. This is an ABI change: code that makes +explicit use of vector types may be incompatible with binary objects +built with older versions of GCC. Auto-vectorized code is not affected +by this change.

+ +

On AVR, support has been removed for the command-line + option -mshort-calls deprecated in GCC 4.7.

+ +

On AVR, the configure option --with-avrlibc supported since + GCC 4.7.2 is turned on per default for all non-RTEMS configurations. + This option arranges for a better integration of + AVR Libc with avr-gcc. + For technical details, see PR54461. + To turn off the option in non-RTEMS configurations, use + --with-avrlibc=no. If the compiler is configured for + RTEMS, the option is always turned off.

+ +

+ More information on porting to GCC 4.8 from previous versions + of GCC can be found in + the porting + guide for this release. +

+ +

General Optimizer Improvements (and Changes)

+ + + + +

New Languages and Language specific improvements

+ + + + +

C family

+ + + + + + +

C++

+ + +

Runtime Library (libstdc++)

+ + + +

Fortran

+ + +

Go

+ + + + +

New Targets and Target Specific Improvements

+ +

AArch64

+ + +

ARM

+ + +

AVR

+ + +

IA-32/x86-64

+ + +

FRV

+ + + +

MIPS

+ + +

PowerPC / PowerPC64 / RS6000

+ + +

RX

+ + +

S/390, System z

+ + +

SH

+ + +

SPARC

+ + + +

TILE-Gx

+ + + +

V850

+ + + +

XStormy16

+ + + +

Operating Systems

+ +

Windows (Cygwin)

+ + + + + + + + + + + + + + + + + + + + --- gcc-4.8-4.8.2.orig/debian/README.Bugs.m4 +++ gcc-4.8-4.8.2/debian/README.Bugs.m4 @@ -0,0 +1,333 @@ +Reporting Bugs in the GNU Compiler Collection for DIST +======================================================== + +Before reporting a bug, please +------------------------------ + +- Check that the behaviour really is a bug. Have a look into some + ANSI standards document. + +- Check the list of well known bugs: http://gcc.gnu.org/bugs.html#known + +- Try to reproduce the bug with a current GCC development snapshot. You + usually can get a recent development snapshot from the gcc-snapshot +ifelse(DIST,`Debian',`dnl + package in the unstable (or experimental) distribution. + + See: http://packages.debian.org/gcc-snapshot +', DIST, `Ubuntu',`dnl + package in the current development distribution. + + See: http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-snapshot/ +')dnl + +- Try to find out if the bug is a regression (an older GCC version does + not show the bug). + +- Check if the bug is already reported in the bug tracking systems. + +ifelse(DIST,`Debian',`dnl + Debian: http://bugs.debian.org/debian-gcc@lists.debian.org +', DIST, `Ubuntu',`dnl + Ubuntu: https://bugs.launchpad.net/~ubuntu-toolchain/+packagebugs + Debian: http://bugs.debian.org/debian-gcc@lists.debian.org +')dnl + Upstream: http://gcc.gnu.org/bugzilla/ + + +Where to report a bug +--------------------- + +ifelse(DIST,`Debian',`dnl +Please report bugs found in the packaging of GCC to the Debian bug tracking +system. See http://www.debian.org/Bugs/ for instructions (or use the +reportbug script). +', DIST, `Ubuntu',`dnl +Please report bugs found in the packaging of GCC to Launchpad. See below +how issues should be reported. +')dnl + +DIST's current policy is to closely follow the upstream development and +only apply a minimal set of patches (which are summarized in the README.Debian +document). + +ifelse(DIST,`Debian',`dnl +If you think you have found an upstream bug, you did check the section +above ("Before reporting a bug") and are able to provide a complete bug +report (see below "How to report a bug"), then you may help the Debian +GCC package maintainers, if you report the bug upstream and then submit +a bug report to the Debian BTS and tell us the upstream report number. +This way you are able to follow the upstream bug handling as well. If in +doubt, report the bug to the Debian BTS (but read "How to report a bug" +below). +', DIST, `Ubuntu',`dnl +If you think you have found an upstream bug, you did check the section +above ("Before reporting a bug") and are able to provide a complete bug +report (see below "How to report a bug"), then you may help the Ubuntu +GCC package maintainers, if you report the bug upstream and then submit +a bug report to Launchpad and tell us the upstream report number. +This way you are able to follow the upstream bug handling as well. If in +doubt, report the bug to Launchpad (but read "How to report a bug" below). + +Report the issue to https://bugs.launchpad.net/ubuntu/+source/SRCNAME. +')dnl + + +How to report a bug +------------------- + +There are complete instructions in the gcc info manual (found in the +gcc-doc package), section Bugs. + +The manual can be read using `M-x info' in Emacs, or if the GNU info +program is installed on your system by `info --node "(gcc)Bugs"'. Or see +the file BUGS included with the gcc source code. + +Online bug reporting instructions can be found at + + http://gcc.gnu.org/bugs.html + +[Some paragraphs taken from the above URL] + +The main purpose of a bug report is to enable us to fix the bug. The +most important prerequisite for this is that the report must be +complete and self-contained, which we explain in detail below. + +Before you report a bug, please check the list of well-known bugs and, +if possible in any way, try a current development snapshot. + +Summarized bug reporting instructions +------------------------------------- + +What we need + +Please include in your bug report all of the following items, the +first three of which can be obtained from the output of gcc -v: + + * the exact version of GCC; + * the system type; + * the options given when GCC was configured/built; + * the complete command line that triggers the bug; + * the compiler output (error messages, warnings, etc.); and + * the preprocessed file (*.i*) that triggers the bug, generated by + adding -save-temps to the complete compilation command, or, in + the case of a bug report for the GNAT front end, a complete set + of source files (see below). + +What we do not want + + * A source file that #includes header files that are left out + of the bug report (see above) + * That source file and a collection of header files. + * An attached archive (tar, zip, shar, whatever) containing all + (or some :-) of the above. + * A code snippet that won't cause the compiler to produce the + exact output mentioned in the bug report (e.g., a snippet with + just a few lines around the one that apparently triggers the + bug, with some pieces replaced with ellipses or comments for + extra obfuscation :-) + * The location (URL) of the package that failed to build (we won't + download it, anyway, since you've already given us what we need + to duplicate the bug, haven't you? :-) + * An error that occurs only some of the times a certain file is + compiled, such that retrying a sufficient number of times + results in a successful compilation; this is a symptom of a + hardware problem, not of a compiler bug (sorry) + * E-mail messages that complement previous, incomplete bug + reports. Post a new, self-contained, full bug report instead, if + possible as a follow-up to the original bug report + * Assembly files (*.s) produced by the compiler, or any binary files, + such as object files, executables, core files, or precompiled + header files + * Duplicate bug reports, or reports of bugs already fixed in the + development tree, especially those that have already been + reported as fixed last week :-) + * Bugs in the assembler, the linker or the C library. These are + separate projects, with separate mailing lists and different bug + reporting procedures + * Bugs in releases or snapshots of GCC not issued by the GNU + Project. Report them to whoever provided you with the release + * Questions about the correctness or the expected behavior of + certain constructs that are not GCC extensions. Ask them in + forums dedicated to the discussion of the programming language + + +Known Bugs and Non-Bugs +----------------------- + +[Please see /usr/share/doc/gcc/FAQ or http://gcc.gnu.org/faq.html first] + + +C++ exceptions don't work with C libraries +------------------------------------------ + +[Taken from the closed bug report #22769] C++ exceptions don't work +with C libraries, if the C code wasn't designed to be thrown through. +A solution could be to translate all C libraries with -fexceptions. +Mostly trying to throw an exception in a callback function (qsort, +Tcl command callbacks, etc ...). Example: + + #include + #include + + class A {}; + + static + int SortCondition(void const*, void const*) + { + printf("throwing 'sortcondition' exception\n"); + throw A(); + } + + int main(int argc, char *argv[]) + { + int list[2]; + + try { + SortCondition(NULL,NULL); + } catch (A) { + printf("caught test-sortcondition exception\n"); + } + try { + qsort(&list, sizeof(list)/sizeof(list[0]),sizeof(list[0]), + &SortCondition); + } catch (A) { + printf("caught real-sortcondition exception\n"); + } + return 0; +} + +Andrew Macleod responded: + +When compiled with the table driven exception handling, exception can only +be thrown through functions which have been compiled with the table driven EH. +If a function isn't compiled that way, then we do not have the frame +unwinding information required to restore the registers when unwinding. + +I believe the setjmp/longjmp mechanism will throw through things like this, +but its produces much messier code. (-fsjlj-exceptions) + +The C compiler does support exceptions, you just have to turn them on +with -fexceptions. + +Your main options are to: + a) Don't use callbacks, or at least don't throw through them. + b) Get the source and compile the library with -fexceptions (You have to + explicitly turn on exceptions in the C compiler) + c) always use -fsjlj-exceptions (boo, bad choice :-) + + +g++: "undefined reference" to static const array in class +--------------------------------------------------------- + +The following code compiles under GNU C++ 2.7.2 with correct results, +but produces the same linker error with GNU C++ 2.95.2. +Alexandre Oliva responded: + +All of them are correct. A static data member *must* be defined +outside the class body even if it is initialized within the class +body, but no diagnostic is required if the definition is missing. It +turns out that some releases do emit references to the missing symbol, +while others optimize it away. + +#include + +class Test +{ + public: + Test(const char *q); + protected: + static const unsigned char Jam_signature[4] = "JAM"; +}; + +Test::Test(const char *q) +{ + if (memcmp(q, Jam_signature, sizeof(Jam_signature)) != 0) + cerr << "Hello world!\n"; +} + +int main(void) +{ + Test::Test("JAM"); + return 0; +} + +g++: g++ causes passing non const ptr to ptr to a func with const arg + to cause an error (not a bug) +--------------------------------------------------------------------- + +Example: + +#include +void test(const char **b){ + printf ("%s\n",*b); +} +int main(void){ + char *test1="aoeu"; + test(&test1); +} + +make const +g++ const.cc -o const +const.cc: In function `int main()': +const.cc:7: passing `char **' as argument 1 of `test(const char **)' adds cv-quals without intervening `const' +make: *** [const] Error 1 + +Answer from "Martin v. Loewis" : + +> ok... maybe I missed something.. I haven't really kept up with the latest in +> C++ news. But I've never heard anything even remotly close to passing a non +> const var into a const arg being an error before. + +Thanks for your bug report. This is a not a bug in the compiler, but +in your code. The standard, in 4.4/4, puts it that way + +# A conversion can add cv-qualifiers at levels other than the first in +# multi-level pointers, subject to the following rules: +# Two pointer types T1 and T2 are similar if there exists a type T and +# integer n > 0 such that: +# T1 is cv(1,0) pointer to cv(1,1) pointer to ... cv(1,n-1) +# pointer to cv(1,n) T +# and +# T2 is cv(2,0) pointer to cv(2,1) pointer to ... cv(2,n-1) +# pointer to cv(2,n) T +# where each cv(i,j) is const, volatile, const volatile, or +# nothing. The n-tuple of cv-qualifiers after the first in a pointer +# type, e.g., cv(1,1) , cv(1,2) , ... , cv(1,n) in the pointer type +# T1, is called the cv-qualification signature of the pointer type. An +# expression of type T1 can be converted to type T2 if and only if the +# following conditions are satisfied: +# - the pointer types are similar. +# - for every j > 0, if const is in cv(1,j) then const is in cv(2,j) , +# and similarly for volatile. +# - if the cv(1,j) and cv(2,j) are different, then const is in every +# cv(2,k) for 0 < k < j. + +It is the last rule that your code violates. The standard gives then +the following example as a rationale: + +# [Note: if a program could assign a pointer of type T** to a pointer +# of type const T** (that is, if line //1 below was allowed), a +# program could inadvertently modify a const object (as it is done on +# line //2). For example, +# int main() { +# const char c = 'c'; +# char* pc; +# const char** pcc = &pc; //1: not allowed +# *pcc = &c; +# *pc = 'C'; //2: modifies a const object +# } +# - end note] + +If you question this line of reasoning, please discuss it in one of +the public C++ fora first, eg. comp.lang.c++.moderated, or +comp.std.c++. + + +cpp removes blank lines +----------------------- + +With the new cpp, you need to add -traditional to the "cpp -P" args, else +blank lines get removed. + +[EDIT ME: scan Debian bug reports and write some nice summaries ...] --- gcc-4.8-4.8.2.orig/debian/README.C++ +++ gcc-4.8-4.8.2/debian/README.C++ @@ -0,0 +1,35 @@ +libstdc++ is an implementation of the Standard C++ Library, including the +Standard Template Library (i.e. as specified by ANSI and ISO). + +Some notes on porting applications from libstdc++-2.90 (or earlier versions) +to libstdc++-v3 can be found in the libstdc++6-4.3-doc package. After the +installation of the package, look at: + + file:///usr/share/doc/gcc-4.3-base/libstdc++/html/17_intro/porting-howto.html + +On Debian GNU/Linux you find additional documentation in the +libstdc++6-4.3-doc package. After installing these packages, +point your browser to + + file:///usr/share/doc/libstdc++6-4.3-doc/libstdc++/html/index.html + +Other documentation can be found: + + http://www.sgi.com/tech/stl/ + +with a good, recent, book on C++. + +A great deal of useful C++ documentation can be found in the C++ FAQ-Lite, +maintained by Marshall Cline . It can be found at the +mirror sites linked from the following URL (this was last updated on +2010/09/11): + + http://www.parashift.com/c++-faq/ + +or use some search engin site to find it, e.g.: + + http://www.google.com/search?q=c%2B%2B+faq+lite + +Be careful not to use outdated mirors. + +Please send updates to this list as bug report for the g++ package. --- gcc-4.8-4.8.2.orig/debian/README.Debian +++ gcc-4.8-4.8.2/debian/README.Debian @@ -0,0 +1,45 @@ + The Debian GNU Compiler Collection setup + ======================================== + +Please see the README.Debian in /usr/share/doc/gcc, contained in the +gcc package for a description of the setup of the different compiler +versions. + +For general discussion about the Debian toolchain (GCC, glibc, binutils) +please use the mailing list debian-toolchain@lists.debian.org; for GCC +specific things, please use debian-gcc@lists.debian.org. When in doubt +use the debian-toolchain ML. + + +Maintainers of these packages +----------------------------- + +Matthias Klose +Ludovic Brenta (gnat) +Iain Buclaw (gdc) +Aurelien Jarno (mips*-linux) +Aurelien Jarno (s390X*-linux) + +The following ports lack maintenance in Debian: powerpc, ppc64, +sparc, sparc64 (unmentioned ports are usually handled by the Debian +porters). + +Former and/or inactive maintainers of these packages +---------------------------------------------------- + +Falk Hueffner (alpha-linux) +Ray Dassen +Jeff Bailey (hurd-i386) +Joel Baker (netbsd-i386) +Randolph Chung (ia64-linux) +Philip Blundell (arm-linux) +Ben Collins (sparc-linux) +Dan Jacobowitz (powerpc-linux) +Thiemo Seufer (mips*-linux) +Matt Taggart (hppa-linux) +Gerhard Tonn (s390-linux) +Roman Zippel (m68k-linux) +Arthur Loiret (gdc) + +=============================================================================== + --- gcc-4.8-4.8.2.orig/debian/README.Debian.ppc64el +++ gcc-4.8-4.8.2/debian/README.Debian.ppc64el @@ -0,0 +1,368 @@ + The Debian GNU Compiler Collection setup + ======================================== + +Please see the README.Debian in /usr/share/doc/gcc, contained in the +gcc package for a description of the setup of the different compiler +versions. + +For general discussion about the Debian toolchain (GCC, glibc, binutils) +please use the mailing list debian-toolchain@lists.debian.org; for GCC +specific things, please use debian-gcc@lists.debian.org. When in doubt +use the debian-toolchain ML. + + +Maintainers of these packages +----------------------------- + +Matthias Klose +Ludovic Brenta (gnat) +Iain Buclaw (gdc) +Aurelien Jarno (mips*-linux) +Aurelien Jarno (s390X*-linux) + +The following ports lack maintenance in Debian: powerpc, ppc64, +sparc, sparc64 (unmentioned ports are usually handled by the Debian +porters). + +Former and/or inactive maintainers of these packages +---------------------------------------------------- + +Falk Hueffner (alpha-linux) +Ray Dassen +Jeff Bailey (hurd-i386) +Joel Baker (netbsd-i386) +Randolph Chung (ia64-linux) +Philip Blundell (arm-linux) +Ben Collins (sparc-linux) +Dan Jacobowitz (powerpc-linux) +Thiemo Seufer (mips*-linux) +Matt Taggart (hppa-linux) +Gerhard Tonn (s390-linux) +Roman Zippel (m68k-linux) +Arthur Loiret (gdc) + +=============================================================================== + + +svn-updates: + updates from the 4.8 branch upto 20131220 (r206145). + +rename-info-files: + Allow transformations on info file names. Reference the + transformed info file names in the texinfo files. + +gcc-gfdl-build: + Build a dummy s-tm-texi without access to the texinfo sources + +gcc-textdomain: + Set gettext's domain and textdomain to the versioned package name. + +gcc-driver-extra-langs: + Add options and specs for languages that are not built from a source + (but built from separate sources). + +gcc-hash-style-gnu: + Link using --hash-style=gnu (aarch64, alpha, amd64, armel, armhf, ia64, + i386, powerpc, ppc64, s390, sparc) + +libstdc++-pic: + Build and install libstdc++_pic.a library. + +libstdc++-doclink: + adjust hrefs to point to the local documentation + +libstdc++-man-3cxx: + Install libstdc++ man pages with suffix .3cxx instead of .3 + +libstdc++-test-installed: + Add support to run the libstdc++-v3 testsuite using the + installed shared libraries. + +libjava-stacktrace: + libgcj: Lookup source file name and line number in separated + debug files found in /usr/lib/debug + +libjava-jnipath: + - Add /usr/lib/jni and /usr/lib//jni to java.library.path. + - When running the i386 binaries on amd64, look in + - /usr/lib32/gcj-x.y and /usr/lib32/jni instead. + +libjava-sjlj: + Don't try to use _Unwind_Backtrace on SJLJ targets. + See bug #387875, #388505, GCC PR 29206. + +libjava-disable-plugin: + Don't build the gcjwebplugin, even when configured with --enable-plugin + +alpha-no-ev4-directive: + never emit .ev4 directive. + +boehm-gc-getnprocs: + boehm-gc/pthread_support.c (GC_get_nprocs): Use sysconf as fallback. + +note-gnu-stack: + Add .note.GNU-stack sections for gcc's crt files, libffi and boehm-gc + Taken from FC. + +libgomp-omp_h-multilib: + Fix up omp.h for multilibs. + +sparc-force-cpu: + On sparc default to ultrasparc (v9a) in 32bit mode + +gccgo-version: + Omit the subminor number from the go libdir + +pr47818: + Fix PR ada/47818: Pragma Assert is rejected with No_Implementation_Pragmas restriction. + +pr49944: + apply proposed patch for PR ada/49444. + +gcc-base-version: + Set base version to 4.8, introduce full version 4.8.x. + +libgo-testsuite: + Only run the libgo testsuite for flags configured in RUNTESTFLAGS + +gcc-target-include-asm: + Search $(builddir)/sys-include for the asm header files + +libgo-revert-timeout-exp: + +arm-sanitizer: + Enable libsanitizer on ARM. + +libgo-setcontext-config: + libgo: Overwrite the setcontext_clobbers_tls check on mips* + +pr57211: + Fix PR c++/57211, don't warn about unused parameters of defaulted functions. + +gcc-auto-build: + Fix cross building a native compiler. + +kfreebsd-unwind: + DWARF2 EH unwinding support for AMD x86-64 and x86 KFreeBSD. + +libgcc-no-limits-h: + Don't include in libgcc/libgcc2.c. + +kfreebsd-boehm-gc: + boehm-gc: use mmap instead of brk also on kfreebsd-*. + +pr49847: + Proposed patch for PR rtl-optimization/49847 (cc0 targets). + +libffi-m68k: + Apply #660525 fix to in-tree libffi + +m68k-picflag: + backport of trunk r204854 + fixes relocation errors when linking large libs (smokeqt, python-qt4) + +sys-auxv-header: + Check for the sys/auxv.h header file. + +go-use-gold: + Pass -fuse-ld=gold to gccgo on targets supporting -fsplit-stack + +go-testsuite: + Skip Go testcase on AArch64 which hangs on the buildds. + +pr57363: + Fix PR libgcc/57363, taken from the trunk. + +libstdc++-python3: + Make the libstdc++-v3 pretty printer compatible with Python3. + +ada-driver-check: + Simplify Ada driver check (we always build using the required + Ada version. Needed for warnings on alpha. + +ada-gcc-name: + use gcc-4.8 instead of gcc as the command name. + +ada-default-project-path: + - Change the default search path for project files to the one specified + by the Debian Policy for Ada: /usr/share/ada/adainclude. + +ada-symbolic-tracebacks: + - Enable support for symbolic tracebacks in exceptions (delete the dummy + convert_addresses from adaint.c, and provide a real one separately.) + +ada-library-project-files-soname: + - in project files, use the exact Library_Version provided, if any, as + the soname of libraries; do not strip minor version numbers + (PR ada/40025). + +ada-ppc64: + +ada-link-lib: + - Install the shared Ada libraries as '.so.1', not '.so' to conform + to the Debian policy. + - Don't include a runtime link path (-rpath), when linking binaries. + - Build the shared libraries on hppa-linux. + - Instead of building libada as a target library only, build it as + both a host and, if different, target library. + - Build the GNAT tools in their top-level directory; do not use + recursive makefiles. + - Link the GNAT tools dynamically. + +ada-libgnatvsn: + - Introduce a new shared library named libgnatvsn, containing + common components of GNAT under the GNAT-Modified GPL, for + use in GNAT tools, ASIS, GLADE and GPS. Link the gnat tools + against this new library. + +ada-libgnatprj: + - Introduce a new shared library named libgnatprj, containing + the GNAT project file manager licensed under the pure GPL, for + use in GNAT tools, GLADE and GPS. Link the GNAT tools against + this new library. + +ada-acats: + - When running the ACATS, look for the gnat tools in their new + directory (build/gnattools), and for the shared libraries in + build/gcc/ada/rts-shared-zcx, build/libgnatvsn and build/libgnatprj. + +ada-link-shlib: + In gnatlink, pass the options and libraries after objects to the + linker to avoid link failures with --as-needed. Closes: #680292. + +gdc-updates: + gdc updates up to 20130611. + +gdc-4.8: + This implements D language support in the GCC back end, and adds + relevant documentation about the GDC front end (code part). + +gdc-versym-cpu: + Implements D CPU version conditions. + +gdc-versym-os: + Implements D OS version conditions. + +gdc-frontend-posix: + Fix build of the D frontend on the Hurd and KFreeBSD. + +gdc-4.8-doc: + This implements D language support in the GCC back end, and adds + relevant documentation about the GDC front end (documentation part). + +gdc-driver-nophobos: + Modify gdc driver to have no libphobos by default. + +disable-gdc-tests: + Disable D tests, hang on many buildds + +m68k-ada: + +m68k-revert-pr45144: + +pr52714: + Proposed fix for PR rtl-optimization/52714: + Revert gcc 4.8 to gcc the 4.5 version of the PR rtl-optimization/45695 fix: + +pr58369: + backport of trunk r204224 + fixes ICE during building boost 1.54 + + PR rtl-optimization/58369 + * reload1.c (compute_reload_subreg_offset): New function. + (choose_reload_regs): Use it to pass endian-correct + offset to subreg_regno_offset. + +pr52306: + Disable -fauto-inc-dec by default for m68k + since it can generate ICEs in C++ code, + until a fix is found. + +gcc-ppc64el: + Changes from the ibm/gcc-4_8-branch (20131212) + +gcc-ppc64el-doc: + Changes from the ibm/gcc-4_8-branch (documentation) + +gcc-sysroot: + Allow building --with-sysroot=/ + +goarch-aarch64: + Introduce the arm64 goarch. + +libgo-explicit-reservation: + Fix statically linked gccgo binaries on AArch64. + +ada-kfreebsd: + add support for GNU/kFreeBSD. + +arm-multilib-defaults: + Set MULTILIB_DEFAULTS for ARM multilib builds + +cross-fixes: + Fix the linker error when creating an xcc for ia64 + +cross-install-location: + +gcc-ice-hack: + Retry the build on an ice, save the calling options and preprocessed + source when the ice is reproducible. + +gcc-ice-apport: + Report an ICE to apport (if apport is available + and the environment variable GCC_NOAPPORT is not set) + +libjava-fixed-symlinks: + Remove unneed '..' elements from symlinks in JAVA_HOME + +libstdc++-arm-wno-abi: + Temporary work around: + On arm-linux-gnueabi run the libstdc++v3 testsuite with -Wno-abi + +ada-mips: + Improve support for mips. + +libffi-ro-eh_frame_sect: + PR libffi/47248, force a read only eh frame section. + +gcc-multiarch: + - Remaining multiarch patches, not yet submitted upstream. + - Add MULTIARCH_DIRNAME definitions for multilib configurations, + which are used for the non-multilib builds. + +libjava-multiarch: + Install libjava libraries to multiarch location + +libjava-nobiarch-check: + For biarch builds, disable the testsuite for the non-default architecture + for runtime libraries, which are not built by default (libjava). + +config-ml: + - Disable some biarch libraries for biarch builds. + - Fix multilib builds on kernels which don't support all multilibs. + +cross-no-locale-include: + Don't add /usr/local/include for cross compilers. Assume that + /usr/include is ready for multiarch, but not /usr/local/include. + +gcc-multilib-multiarch: + Don't auto-detect multilib osdirnames. + +powerpc64le-multilib-definitions: + +gcc-as-needed: + On linux targets pass --as-needed by default to the linker. + +mips-fix-loongson2f-nop: + On mips, pass -mfix-loongson2f-nop to as, if -mno-fix-loongson2f-nop + is not passed. + +libgomp-kfreebsd-testsuite: + Disable lock-2.c test on kfreebsd-* + +gcc-default-ssp: + Turn on -fstack-protector by default for C, C++, ObjC, ObjC++. + Build libgcc using -fno-stack-protector. + +gcc-default-format-security: + Turn on -Wformat -Wformat-security by default for C, C++, ObjC, ObjC++. --- gcc-4.8-4.8.2.orig/debian/README.cross +++ gcc-4.8-4.8.2/debian/README.cross @@ -0,0 +1,144 @@ +Building cross-compiler Debian packages +--------------------------------------- + +It is possible to build C and C++ cross compilers and support libraries +from gcc-4.0 source package. This document describes how to do so. +Cross-compiler build support is not perfect yet, please send fixes +and improvements to debian-gcc@lists.debian.org and +debian-embedded@lists.debian.org + +Before you start, you should probably check available pre-built +cross-toolchain debs. Available at http://www.emdebian.org + +Old patches could be reached at + http://zigzag.lvk.cs.msu.su/~nikita/debian/ + +If they are no longer there, you may check EmDebian web site at + http://www.emdebian.org/ +or ask debian-embedded@lists.debian.org for newer location. + +Please check http://bugs.debian.org/391445 if you are about building +gcc-4.3 or above. + +Most of them has been merged with gcc debian sources. + +0. What's wrong with toolchain-source approach + +Package toolchain-source contains sources for binutils and gcc, as well as +some support scripts to build cross-compiler packages. They seem to work. + +However, there is one fundamental problem with this approach. +Gcc package is actively maintained and frequently updated. These updates +do contain bug fixes and improvements, especially for non-x86 architectures. +Cross-compilers built using toolchain-source will not get those fixes unless +toolchain-source package is updated after each binutils and gcc update. +The later is not hapenning in real life. For example, toolchain-source +was upgraded from gcc-3.2 to gcc-3.3 half a year later than gcc-3.3 became +Debian default compiler. + +Keeping toolchain-source package up-to-date requires lots of work, and seems +to be a waste of time. It is much better to build cross-compilers directly +from gcc source package. + + +1. What is needed to build a cross-compiler from gcc-4.3 source + +1.1. dpkg-cross package + +Dpkg-cross package contains several tools to manage cross-compile environment. + +It can convert native debian library and lib-dev packages for the target +architecture to binary-all packages that keep libraries and headers under +/usr/$(TARGET)/. + +Also it contains helper tools for cross-compiling debian packages. Some of +these tools are used while building libgcc1 and libstdc++ library packages. +The resulting library packages follow the same convensions as library packages +converted by dpkg-cross. + +Currently, at least version 1.18 of dpkg-cross is needed for cross-gcc +package build. Version 1.32 of dpkg-cross is needed in order to build gcc-4.3. + +1.2. cross-binutils for the target + +You need cross-binutils for your target to build cross-compiler. +Binutils-multiarch package will not work because it does not provide cross- +assemblers. + +If you don't want to use pre-built cross-binutils packages, you may build +your own from binutils debian source package, using patches posted to +bug #231707. Please use the latest of patch versions available there. + +Alternatively, you may use toolchain-source package to build cross-binutils +(but in this case you will probably also want to use toolchain-source +to build cross-compiler itself). However, multilib'ed cross-compilers may +not build or work with these binutils. + +1.3. libc for target + +You also need libc library and development packages for the target +architecture installed. + +To get those, download linux-kernel-headers, libc6, and libc6-dev binary +debs for your target, convert those using dpkg-cross -b, and install +resulting -arch-cross debs. Consult dpkg-cross manual page for more +information. + +Building with/for alternative libc's is not supported yet (but this is in +TODO). + +Note that if you plan to use your cross-toolchain to develop kernel drivers +or similar low-level things, you will probably also need kernel headers +for the exact kernel version that your target hardware uses. + + +2. Building cross-compiler packages + +Get gcc-4.3 source package. + +Unpack it using dpkg-source -x, and cd to the package directory. + +Set GCC_TARGET environment variable to the target architectire name. Note +that currently you should use debian architecture name (i.e 'powerpc' or 'arm'), +not GNU system type (i.e. 'powerpc-linux' or 'arm-linux'). Setting GCC_TARGET +to GNU system type will cause cross-compiler build to fail. + +Instead of setting GCC_TARGET, target architecture name may be put into +debian/target file. If both GCC_TARGET is defined and debian/target file +exists, GCC_TARGET is used. + +Run debian/rules control. This will change debian/control file, +adjusting build-depends. By default, the packages will not depend on the +system -base package. A variable DEB_CROSS_INDEPENDENT has been merged with DEB_CROSS variable. + +You can then build with either + +$ GCC_TARGET=[arch] dpkg-buildpackage -rfakeroot + +3. Using crosshurd + +Jeff Bailey suggests alternate way to setup +environment to build cross-compiler, using 'crosshurd' package. +Crosshurd is like debootstrap but cross-arch, and works on the Hurd, +Linux and FreeBSD. (The name is historical). + +If you setup your environment with crosshurd, you will need to fix symlinks +in lib and usr/lib to be relative instead of absolute. For example: + +lrwxrwxrwx 1 root root 20 2004-05-06 23:02 libcom_err.so -> /lib/libcom_err.so.2 + +Needs to be changed to: + +lrwxrwxrwx 1 root root 20 2004-05-06 23:02 libcom_err.so -> ../../lib/libcom_err.so.2 + +Also, if you choose this method, set the environment variable 'with_sysroot' +to point to the ABSOLUTE PATH where the crosshurd was done. + +Note however that build-depends of cross-gcc and dependencies in generated +libgcc1 and libstdc++ packages assume that you use dpkg-cross to set up +your environment, and may be wrong or incomplete if you use alternate methods. +But probably you don't care. + +-- +Nikita V. Youshchenko - Jun 2004 +Hector Oron Martinez - Oct 2006 --- gcc-4.8-4.8.2.orig/debian/README.gnat +++ gcc-4.8-4.8.2/debian/README.gnat @@ -0,0 +1,22 @@ +If you want to develop Ada programs and libraries on Debian, please +read the Debian Policy for Ada: + +http://people.debian.org/~lbrenta/debian-ada-policy.html + +The default Ada compiler is and always will be the package `gnat'. +Debian contains many programs and libraries compiled with it, which +are all ABI-compatible. + +Starting with gnat-4.2, Debian provides both zero-cost and +setjump/longjump versions of the run-time library. The zero-cost +exception handling mechanism is the default as it provides the best +performance. The setjump/longjump exception handling mechanism is new +and only provided as a static library. It is necessary to use this +exception handling mechanism in distributed (annex E) programs. If +you wish to use the new sjlj library: + +1) call gnatmake with --RTS=sjlj +2) call gnatbind with -static + +Do NOT link your programs with libgnat-4.2.so, because it uses the ZCX +mechanism. --- gcc-4.8-4.8.2.orig/debian/README.libstdc++-baseline.in +++ gcc-4.8-4.8.2/debian/README.libstdc++-baseline.in @@ -0,0 +1,2 @@ +The libstdc++ baseline file is a list of symbols exported by the +libstdc++ library. --- gcc-4.8-4.8.2.orig/debian/README.maintainers +++ gcc-4.8-4.8.2/debian/README.maintainers @@ -0,0 +1,196 @@ +-*- Outline -*- + +Read this file if you are a Debian Developer or would like to become +one, or if you would like to create your own binary packages of GCC. + +* Overview + +From the GCC sources, Debian currently builds 3 source packages and +almost 100 binary packages, using a single set of build scripts. The +3 source packages are: + +gcc-x.y: C, C++, Fortran, Objective-C and Objective-C++, plus many + common libraries like libssp and libgcc. +gcj-x.y: Java. +gnat-x.y: Ada. + +The way we do this is quite peculiar, so listen up :) + +When we build from the gcc-x.y source package, we produce, among many +others, a gcc-x.y-source binary package that contains the pristine +upstream tarball and some Debian-specific patches. Any user can then +install this package on their Debian system, and will have the full +souces in /usr/src/gcc-x.y/gcc-.tar.bz2, along with the +Makefile snippets that unpack and patch them. + +The intended use for this package is twofold: (a) allow users to build +their own cross-compilers, and (b) build the other two packages, +gcj-x.y and gnat-x.y. + +- gcc-x.y requires only a C compiler to build and produces C, C++, + Fortran, Go and Objective-C compilers and libraries. It also + produces the binary package gcc-x.y-source containing all the + sources and patches in a tarball. + +- gcj-x.y build-depends on gcc-x.y-source and C++ and Java compilers. + Its .orig.tar.bz2 file only contains an empty directory; the real + sources from which it builds the binary packages are in + gcc-x.y-source. + +- gnat-x.y build-depends on gcc-x.y-source and an Ada compiler. It + does not even have an .orig.tar.bz2 package; it is a Debian native + package. + +The benefits of this split are many: + +- bootstrapping a subset of languages is much faster than + bootstrapping all languages and libraries (which can take a full + week on slow architectures like mips or arm) + +- the language maintainers don't have to wait for each other + +- for new ports, the absence of a port of, say, gnat-x.y does not + block the porting of gcc-x.y. + +gcc-x.y-source is also intended for interested users to build +cross-compiler packages. Debian cannot provide all possible +cross-compiler packages (i.e. all possible host, target, language and +library combinations), so instead tries to facilitate building them. + +* The build sequence + +As for all other Debian packages, you build GCC by calling +debian/rules. + +The first thing debian/rules does it to look at the top-most entry in +debian/changelog: this tells it which source package it is building. +For example, if the first entry in debian/changelog reads: + +gcj-4.3 (4.3-20070609-1) unstable; urgency=low + + * Upload as gcj-4.3. + + -- Ludovic Brenta Tue, 26 Jun 2007 00:26:42 +0200 + +then, debian/rules will build only the Java binary packages. + +The second step is to build debian/control from debian/control.m4 and +a complex set of rules specified in debian/rules.conf. The resulting +control file contains only the binary packages to be built. + +The third step is to select which patches to apply (this is done in +debian/rules.defs), and then to apply the selected patches (see +debian/rules.patch). The result of this step is a generated +debian/patches/series file for use by quilt. + +The fourth step is to unpack the GCC source tarball. This tarball is +either in the build directory (when building gcc-x.y), or in +/usr/src/gcc-x.y/gcc-x.y.z.tar.xz (when building the other source +packages). + +The fifth step is to apply all patches to the unpacked sources with +quilt. + +The sixth step is to create a "build" directory, cd into it, call +../src/configure, and bootstrap the compiler and libraries selected. +This is in debian/rules2. + +The seventh step is to call "make install" in the build directory: +this installs the compiler and libraries into debian/tmp +(i.e. debian/tmp/usr/bin/gcc, etc.) + +The eighth step is to run the GCC test suite. This actually takes at +least as much time as bootstrapping, and you can disable it by setting +WITHOUT_CHECK to "yes" in the environment. + +The ninth step is to build the binary packages, i.e. the .debs. This +is done by a set of language- and architecture-dependent Makefile +snippets in the debian/rules.d/ directory, which move files from the +debian/tmp tree to the debian/ trees. + +* Making your own packages + +In this example, we will build our own gnat-x.y package. + +1) Install gcc-x.y-source, which contains the real sources: + +# aptitude install gcc-x.y-source + +2) Create a build directory: + +$ mkdir gnat-x.y-x.y.z; cd gnat-x.y-x.y.z + +3) Checkout from Subversion: + +$ svn checkout svn://svn.debian.org/gcccvs/branches/sid/gcc-x.y/debian + +4) Edit the debian/changelog file, adding a new entry at the top that + starts with "gnat-x.y". + +5) Generate the debian/control file, adjusted for gnat: + +$ debian/rules control + +8) Build: + +$ dpkg-buildpackage + +* Hints + +You need a powerful machine to build GCC. The larger, the better. +The build scripts take advantage of as many CPU threads as are +available in your box (for example: 2 threads on a dual-core amd64; 4 +threads on a dual-core POWER5; 32 threads on an 8-core UltraSPARC T1, +etc.). + +If you have 2 GB or more of physical RAM, you can achieve maximum +performance by building in a tmpfs, like this: + +1) as root, create the new tmpfs: + +# mount -t tmpfs -o size=1280m none /home/lbrenta/src/debian/ram + +By default, the tmpfs will be limited to half your physical RAM. The +beauty of it is that it only consumes as much physical RAM as +necessary to hold the files in it; deleting files frees up RAM. + +2) As your regular user, create the working directory in the tmpfs + +$ cp --archive ~/src/debian/gcc-x.y-x.y.z ~/src/debian/ram + +3) Build in there. On my dual-core, 2 GHz amd64, it takes 34 minutes + to build gnat, and the tmpfs takes 992 MiB of physical RAM but + exceeds 1 GiB during the build. + +Note that the build process uses a lot of temporary files. Your $TEMP +directory should therefore also be in a ram disk. You can achieve +that either by mounting it as tmpfs, or by setting TEMP to point to +~/src/debian/ram. + +Also note that each thread in your processor(s) will run a compiler in +it and use up RAM. Therefore your physical memory should be: + +Physical_RAM >= 1.2 + 0.4 * Threads (in GiB) + +(this is an estimate; your mileage may vary). If you have less +physical RAM than recommended, reduce the number of threads allocated +to the build process, or do not use a tmpfs to build. + +* Patching GCC + +Debian applies a large number of patches to GCC as part of the build +process. It uses quilt but the necessary debian/patches/series is not +part of the packaging scripts; instead, "debian/rules patch" generates +this file by looking at debian/control (which is itself generated!), +debian/changelog and other files. Then it applies all the patches. +At this point, you can use quilt as usual: + +$ cd ~/src/debian/gcc-x.y +$ export QUILT_PATCHES=$PWD/debian/patches +$ quilt series + +If you add new patches, remember to add them to the version control +system too. + +-- +Ludovic Brenta, 2012-04-02. --- gcc-4.8-4.8.2.orig/debian/README.snapshot +++ gcc-4.8-4.8.2/debian/README.snapshot @@ -0,0 +1,36 @@ +Debian gcc-snapshot package +=========================== + +This package contains a recent development SNAPSHOT of all files +contained in the GNU Compiler Collection (GCC). + +DO NOT USE THIS SNAPSHOT FOR BUILDING DEBIAN PACKAGES! + +This package will NEVER hit the testing distribution. It's used for +tracking gcc bugs submitted to the Debian BTS in recent development +versions of gcc. + +To use this snapshot, you should set the following environment variables: + + LD_LIBRARY_PATH=/usr/lib/gcc-snapshot/lib:$LD_LIBRARY_PATH + PATH=/usr/lib/gcc-snapshot/bin:$PATH + +You might also like to use a shell script to wrap up this +funcationality, e.g. + +place in /usr/local/bin/gcc-snapshot and chmod +x it + +----------- snip ---------- +#! /bin/sh +LD_LIBRARY_PATH=/usr/lib/gcc-snapshot/lib:$LD_LIBRARY_PATH +PATH=/usr/lib/gcc-snapshot/bin:$PATH +gcc "$@" +----------- snip ---------- + +Make the same for g++, g77, gij, gcj, cpp, ... + +Don't forget the quotes around the $@ or gcc will not parse it's +command line correctly! + +Unset these variables before building Debian packages destined for an +upload to ftp-master.debian.org. --- gcc-4.8-4.8.2.orig/debian/README.source +++ gcc-4.8-4.8.2/debian/README.source @@ -0,0 +1,14 @@ +Patches applied to the Debian version of GCC +-------------------------------------------- + +Debian specific patches can be found in the debian/patches directory. +Quilt is used as the patch system. See /usr/share/doc/quilt/README.source +for details about quilt. + +Patches are applied by calling `debian/rules patch'. The `series' +file is constructed on the fly, configure scripts are regenerated +in the `patch' target. + +The source packages gcj-x.y and gnat-x.y do not contain copies of the +source code but build-depend on the appropriate gcc-x.y-source package +instead. --- gcc-4.8-4.8.2.orig/debian/README.ssp +++ gcc-4.8-4.8.2/debian/README.ssp @@ -0,0 +1,28 @@ +Stack smashing protection is a feature of GCC that enables a program to +detect buffer overflows and immediately terminate execution, rather than +continuing execution with corrupt internal data structures. It uses +"canaries" and local variable reordering to reduce the likelihood of +stack corruption through buffer overflows. + +Options that affect stack smashing protection: + +-fstack-protector + Enables protection for functions that are vulnerable to stack + smashing, such as those that call alloca() or use pointers. + +-fstack-protector-all + Enables protection for all functions. + +-Wstack-protector + Warns about functions that will not be protected. Only active when + -fstack-protector has been used. + +Applications built with stack smashing protection should link with the +ssp library by using the option "-lssp" for systems with glibc-2.3.x or +older; glibc-2.4 and newer versions provide this functionality in libc. + +The Debian architectures alpha, hppa, ia64, m68k, mips, mipsel do not +have support for stack smashing protection. + +More documentation can be found at the project's website: +http://researchweb.watson.ibm.com/trl/projects/security/ssp/ --- gcc-4.8-4.8.2.orig/debian/TODO +++ gcc-4.8-4.8.2/debian/TODO @@ -0,0 +1,50 @@ +(It is recommended to edit this file with emacs' todoo mode) +Last updated: 2008-05-02 + +* General + +- Clean up the sprawl of debian/rules. I'm sure there are neater + ways to do some of it; perhaps split it up into some more files? + Partly done. + +- Make debian/rules control build the control file without unpacking + the sources or applying patches. Currently, it unpacks the sources, + patches them, creates the control file, and a subsequent + dpkg-buildpackage deletes the sources, re-unpacks them, and + re-patches them. + +- Reorganise debian/rules.defs to decide which packages to build in a + more straightforward and less error-prone fashion: (1) start with + all languages; override the list of languages depending on the name + of the source package (gcc-4.3, gnat-4.3, gdc-4.3, gcj-4.3). (2) + filter the list of languages depending on the target platform; (3) + depending on the languages to build, decide on which libraries to + build. + +o [Ludovic Brenta] Ada + +- Done: Link the gnat tools with libgnat.so, instead of statically. + +- Done: Build libgnatvsn containing parts of the compiler (version + string, etc.) under GNAT-Modified GPL. Link the gnat tools with it. + +- Done: Build libgnatprj containing parts of the compiler (the project + manager) under pure GPL. Link the gnat tools with it. + +- Done: Build both the zero-cost and setjump/longjump exceptions + versions of libgnat. In particular, gnat-glade (distributed systems) + works best with SJLJ. + +- Done: Re-enable running the test suite. + +- Add support for building cross-compilers. + +- Add support for multilib (not yet supported upstream). + +* Fortran + +- gfortran man page generation + +* Java + +- build java-gcj-compat from the gcc source? --- gcc-4.8-4.8.2.orig/debian/acats-killer.sh +++ gcc-4.8-4.8.2/debian/acats-killer.sh @@ -0,0 +1,62 @@ +#! /bin/sh + +# on ia64 systems, the acats hangs in unaligned memory accesses. +# kill these testcases. + +pidfile=acats-killer.pid + +usage() +{ + echo >&2 "usage: `basename $0` [-p ] " + exit 1 +} + +while [ $# -gt 0 ]; do + case $1 in + -p) + pidfile=$2 + shift + shift + ;; + -*) + usage + ;; + *) + break + esac +done + +[ $# -eq 2 ] || usage + +logfile=$1 +stopfile=$2 +interval=30 + +echo $$ > $pidfile + +while true; do + if [ -f "$stopfile" ]; then + echo "`basename $0`: finished." + rm -f $pidfile + exit 0 + fi + sleep $interval + if [ ! -f "$logfile" ]; then + continue + fi + pids=$(ps aux | awk '/testsuite\/ada\/acats\/tests/ { print $2 }') + if [ -n "$pids" ]; then + sleep $interval + pids2=$(ps aux | awk '/testsuite\/ada\/acats\/tests/ { print $2 }') + if [ "$pids" = "$pids2" ]; then + #echo kill: $pids + kill $pids + sleep 1 + pids2=$(ps aux | awk '/testsuite\/ada\/acats\/tests/ { print $2 }') + if [ "$pids" = "$pids2" ]; then + #echo kill -9: $pids + kill -9 $pids + fi + fi + fi +done --- gcc-4.8-4.8.2.orig/debian/changelog +++ gcc-4.8-4.8.2/debian/changelog @@ -0,0 +1,11874 @@ +gcc-4.8 (4.8.2-19ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + - Don't build the libgcc packages, now built from gcc-4.9. + + -- Matthias Klose Fri, 04 Apr 2014 19:36:41 +0200 + +gcc-4.8 (4.8.2-19) unstable; urgency=medium + + * Update to SVN 20140404 (r209122) from the gcc-4_8-branch. + - Fix PR rtl-optimization/60700 (wrong code on x86), + PR rtl-optimization/57637 (wrong code on ARM in SPEC2000), + PR target/60039 (SH), PR ada/60703. + + [ Matthias Klose ] + * Include include and include-fixed header files into the stage1 + gcc-4.8 package. + * Explicitly configure with --disable-multilib on sparc64 when no + multilibs are requested (Helmut Grohne). Closes: #743342. + * Fix PR target/60034 (AArch64), taken from the trunk. LP: #1270789. + * Update ada-ppc64.diff from the gnat-4.9 package, fixing the gnat build + on powerpc. + * Fix PR target/60609 (ARM), proposed patch (Charles Baylis). LP: #1295653. + * Build libphobos for armel and armhf. + * Include the gnu triplet prefixed gcov and gcc-{ar,nm,ranlib} binaries. + * Stop building ppc64el from the ibm branch, now integrated in the fsf + branch. + + [ Iain Buclaw ] + * Update the GDC frontend (20140401). + + -- Matthias Klose Fri, 04 Apr 2014 19:32:58 +0200 + +gcc-4.8 (4.8.2-17ubuntu2) trusty; urgency=medium + + * Update to SVN 20140329 (r208938) from the gcc-4_8-branch. + - Fix PR libstdc++/60658 (std::atomic is unexpectedly not lock-free), + PR libstdc++/59548 (abort in debug mode), + PR rtl-optimization/60601 (ice), PR tree-optimization/60429 (wrong code + building Qt with -O3), PR rtl-optimization/60452 (wrong code with -O1 + and large offsets in the frame), + PR ipa/60419 (ice-on-valid-code with -O3, LP: #1286343), + PR fortran/60522 (ice-on-valid-code), PR fortran/60576 (wrong code), + PR fortran/60677 (wrong code). + * Don't ignore DEB_CROSS_NO_BIARCH=yes ignored for DEB_TARGET_ARCH=x32. + (Helmut Grohne). Closes: #742358. + * debian/patches/ada-ppc64.diff: Fix for ppc64el (Ulrich Weigand). + * Avoid clobbering stack pointer via P8 fusion peephole. fixing Ada build + on ppc64el (Ulrich Weigand). + * Fix cross building targeting x32 (Helmut Grohne). Closes: #742539. + + -- Matthias Klose Sat, 29 Mar 2014 16:32:05 +0100 + +gcc-4.8 (4.8.2-17ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Fri, 21 Mar 2014 17:46:46 +0100 + +gcc-4.8 (4.8.2-17) unstable; urgency=medium + + * Update to SVN 20140320 (r208738) from the gcc-4_8-branch. + * Update the Linaro support to the 4.8-2014.03 release. + * Update the ibm branch to SVN 20140320 (r208622). + * Fix PR target/58595, ARM TLS handling. Taken from the trunk. + * Create a dummy arm-acle-intrinsics.texi exists for AArch64 builds + (Wookey). Closes: #742165. + + -- Matthias Klose Fri, 21 Mar 2014 10:47:08 +0100 + +gcc-4.8 (4.8.2-16ubuntu6) trusty; urgency=medium + + * Update to SVN 20140306 (r208384) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140306 (r208322). + * Fix PR target/58595, ARM TLS handling. Taken from the trunk. + + -- Matthias Klose Thu, 06 Mar 2014 15:30:27 +0100 + +gcc-4.8 (4.8.2-16ubuntu5) trusty; urgency=medium + + * Update to SVN 20140303 (r208303) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140304 (r208291). + + -- Matthias Klose Tue, 04 Mar 2014 10:28:21 +0100 + +gcc-4.8 (4.8.2-16ubuntu4) trusty; urgency=medium + + * Update to SVN 20140226 (r208166) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140226 (r208166). + + -- Matthias Klose Wed, 26 Feb 2014 08:53:56 +0100 + +gcc-4.8 (4.8.2-16ubuntu3) trusty; urgency=medium + + * Update the ibm branch to SVN 20140224 (r208054). + * Re-add gcc-4.8 dependency on libgcc-4.8-dev. LP: #1283850. + + -- Matthias Klose Mon, 24 Feb 2014 11:40:55 +0100 + +gcc-4.8 (4.8.2-16ubuntu2) trusty; urgency=medium + + * Update to SVN 20140221 (r208010) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140221 (r207920). + * Enable SSP by default on AArch64. + * Build libgcc packages for cross builds in trusty. + + -- Matthias Klose Fri, 21 Feb 2014 19:42:07 +0100 + +gcc-4.8 (4.8.2-16ubuntu1) trusty; urgency=medium + + * Stop building the libgcc1 packages, now built by gccgo-4.9. + + -- Matthias Klose Tue, 18 Feb 2014 12:17:00 +0100 + +gcc-4.8 (4.8.2-16) unstable; urgency=medium + + * Update to SVN 20140217 (r207828) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140211 (r207700). + * Update the Linaro support to the 4.8-2014.02 release. + * Fix gij wrapper script on hppa. Closes: #739224. + + -- Matthias Klose Mon, 17 Feb 2014 21:46:34 +0100 + +gcc-4.8 (4.8.2-15ubuntu3) trusty; urgency=medium + + * Only build using the ibm branch on ppc64el. + + -- Matthias Klose Wed, 12 Feb 2014 00:16:44 +0100 + +gcc-4.8 (4.8.2-15ubuntu2) trusty; urgency=medium + + * Update to SVN 20140211 (r207700) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140211 (r207700). + + -- Matthias Klose Tue, 11 Feb 2014 23:41:13 +0100 + +gcc-4.8 (4.8.2-15ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Sun, 09 Feb 2014 12:36:11 +0100 + +gcc-4.8 (4.8.2-15) unstable; urgency=medium + + * Update to SVN 20140209 (r207641) from the gcc-4_8-branch. + - Fix inconsistent install paths between gccgo and go tool. LP: #1271340. + * Update the ibm branch to SVN 20140207 (r207580). + * armhf: Fix ffi_call_VFP with no VFP arguments (Will Newton). + * Apply proposed patch for PR target/59799, allow passing arrays in + registers on AArch64 (Michael Hudson). + * gcc-4.8-base: Update gcc-4.7-base breaks for updates from wheezy. + Closes: #736607. + + -- Matthias Klose Sun, 09 Feb 2014 11:18:55 +0100 + +gcc-4.8 (4.8.2-14ubuntu4) trusty; urgency=medium + + * Re-upload with the testsuite disabled (hangs on the AArch64 buildds). + + -- Matthias Klose Sat, 25 Jan 2014 00:24:02 +0100 + +gcc-4.8 (4.8.2-14ubuntu3) trusty; urgency=medium + + * Update to SVN 20140124 (r207027) from the gcc-4_8-branch. + - Fix inconsistent install paths between gccgo and go tool. LP: #1271340. + * armhf: Fix ffi_call_VFP with no VFP arguments (Will Newton). + * Apply proposed patch for PR target/59799, allow passing arrays in + registers on AArch64 (Michael Hudson). + + -- Matthias Klose Fri, 24 Jan 2014 14:03:17 +0100 + +gcc-4.8 (4.8.2-14ubuntu2) trusty; urgency=medium + + * Update to SVN 20140117 (r206726) from the gcc-4_8-branch. + * Update the ibm branch to SVN 20140117 (r206670). + + -- Matthias Klose Fri, 17 Jan 2014 19:58:09 +0100 + +gcc-4.8 (4.8.2-14ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Wed, 15 Jan 2014 15:44:15 +0100 + +gcc-4.8 (4.8.2-14) unstable; urgency=medium + + * Update to SVN 20140115 (r206629) from the gcc-4_8-branch. + * Fix call frame information in ffi_closure_SYSV on AArch64. + * Update powerpcspe patches (Roland Stigge). Closes: #735316. + + -- Matthias Klose Wed, 15 Jan 2014 14:12:09 +0100 + +gcc-4.8 (4.8.2-13ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Sun, 12 Jan 2014 14:16:19 +0100 + +gcc-4.8 (4.8.2-13) unstable; urgency=medium + + * Update to SVN 20140112 (r206564) from the gcc-4_8-branch. + - Fix miscompilation due to wrong RTL-optimization (see + PR rtl-optimization/59137). Closes: #716635. + + [ Aurelien Jarno ] + * Reenable the testsuite on mips. + + [ Matthias Klose ] + * Add libgcc, libstdc++, libgfortran symbols files for ppc64el. + * Update libitm symbols for non-default multilibs. + * Add libgcc, libstdc++, libgfortran symbols files for arm64. + * Fix PR target/59588 (AArch64), backport proposed patch. LP: #1263576. + * Fix PR target/59744 (AArch64), taken from the trunk. LP: #1267761. + + -- Matthias Klose Sun, 12 Jan 2014 14:14:42 +0100 + +gcc-4.8 (4.8.2-12ubuntu2) trusty; urgency=medium + + * Remove gnat build dependency. + + -- Matthias Klose Mon, 06 Jan 2014 03:00:48 +0100 + +gcc-4.8 (4.8.2-12ubuntu1) trusty; urgency=medium + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Mon, 06 Jan 2014 02:47:29 +0100 + +gcc-4.8 (4.8.2-12) unstable; urgency=medium + + * Update to SVN 20140106 (r206351) from the gcc-4_8-branch. + * Only apply m68k specific backports when targeting m68k. + + -- Matthias Klose Mon, 06 Jan 2014 02:35:00 +0100 + +gcc-4.8 (4.8.2-11) unstable; urgency=low + + * Update to SVN 20131230 (r206241) from the gcc-4_8-branch. + * Don't build x32 multilibs for wheezy backports. + * Set the goarch to arm64 for aarch64-linux-gnu. + * Fix statically linked gccgo binaries on AArch64 (Michael Hudson). + LP: #1261604. + * Merge accumulated Ada changes from gnat-4.8. + * Update gnat build dependencies when not built from a separate source. + * Default to -mieee on alpha again (Michael Cree). Closes: #733291. + * Prepare gnat package for cross builds. + + -- Matthias Klose Mon, 30 Dec 2013 08:52:29 +0100 + +gcc-4.8 (4.8.2-10ubuntu2) trusty; urgency=low + + * Update to SVN 20131220 (r206145) from the gcc-4_8-branch. + * Set the goarch to arm64 for aarch64-linux-gnu. + * Fix statically linked gccgo binaries on AArch64 (Michael Hudson). + LP: #1261604. + * Merge accumulated Ada changes from gnat-4.8. + * Update gnat build dependencies when not built from a separate source. + + -- Matthias Klose Fri, 20 Dec 2013 18:24:08 +0100 + +gcc-4.8 (4.8.2-10ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + * Re-enable running the testsuite. + + -- Matthias Klose Fri, 13 Dec 2013 01:22:20 +0100 + +gcc-4.8 (4.8.2-10) unstable; urgency=low + + * Update to SVN 20131213 (r205948) from the gcc-4_8-branch. + * Add missing commit in libjava for gcc-linaro. + + -- Matthias Klose Fri, 13 Dec 2013 01:01:47 +0100 + +gcc-4.8 (4.8.2-9ubuntu2) trusty; urgency=low + + * Add missing commit in libjava for gcc-linaro. + + -- Matthias Klose Thu, 12 Dec 2013 16:54:27 +0100 + +gcc-4.8 (4.8.2-9ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 12 Dec 2013 12:31:04 +0100 + +gcc-4.8 (4.8.2-9) unstable; urgency=low + + * Update to SVN 20131212 (r205924) from the gcc-4_8-branch. + + [ Matthias Klose ] + * Fix libitm symbols files for ppc64. + * Update libatomic symbol file for arm64 and ppc64. + * libgcj-dev: Drop dependencies on gcj-jre-lib and gcj-jdk. + * Fix permissions of some override files. + * Let cross compilers conflict with gcc-multilib (providing + /usr/include/asm for the non-default multilib). + * Configure --with-long-double-128 on powerpcspe (Roland Stigge). + Closes: #731941. + * Update the Linaro support to the 4.8-2013.12 release. + * Update the ibm branch to 20131212. + + [ Aurelien Jarno ] + * patches/note-gnu-stack.diff: restore and rebase lost parts. + + -- Matthias Klose Thu, 12 Dec 2013 12:34:55 +0100 + +gcc-4.8 (4.8.2-8ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Wed, 04 Dec 2013 01:22:24 +0100 + +gcc-4.8 (4.8.2-8) unstable; urgency=medium + + * Update to SVN 20131203 (r205647) from the gcc-4_8-branch. + * Fix PR libgcc/57363, taken from the trunk. + + -- Matthias Klose Wed, 04 Dec 2013 01:21:10 +0100 + +gcc-4.8 (4.8.2-7ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Fri, 29 Nov 2013 19:09:33 +0100 + +gcc-4.8 (4.8.2-7) unstable; urgency=low + + * Update to SVN 20131129 (r205535) from the gcc-4_8-branch. + * Introduce aarch64 goarch. + * libgo: Backport fix for calling a function or method that takes or returns + an empty struct via reflection. + * go frontend: Backport fix for the generated hash functions of types that + are aliases for structures containing unexported fields. + * Skip Go testcase on AArch64 which hangs on the buildds. + * Fix freetype includes in libjava/classpath. + + -- Matthias Klose Fri, 29 Nov 2013 18:19:12 +0100 + +gcc-4.8 (4.8.2-6ubuntu2) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 28 Nov 2013 15:41:43 +0100 + +gcc-4.8 (4.8.2-6) unstable; urgency=low + + * Update to SVN 20131128 (r205478) from the gcc-4_8-branch. + + [ Matthias Klose ] + * gcc-4.8-base: Breaks gcc-4.4-base (<< 4.4.7). Closes: #729963. + * Update the gcc-as-needed patch for mips*. Closes: #722067. + * Use dpkg-vendor information for distribution specific settings. + Closes: #697805. + * Check for the sys/auxv.h header file. + * On AArch64, make the frame grow downwards, taken from the trunk. + Enable ssp on AArch64. + * Pass -fuse-ld=gold to gccgo on targets supporting split-stack. + + [ Aurelien Jarno ] + * Update README.Debian for s390 and s390x. + + [ Thorsten Glaser ] + * m68k-ada.diff: Add gcc-4.8.0-m68k-ada-pr48835-2.patch and + gcc-4.8.0-m68k-ada-pr51483.patch by Mikael Pettersson, to + fix more CC0-specific and m68k/Ada-specific problems. + * m68k-picflag.diff: New, backport from trunk, by Andreas Schwab, + to avoid relocation errors when linking big shared objects. + * pr58369.diff: New, backport from trunk, by Jeffrey A. Law, + to fix ICE while building boost 1.54 on m68k. + * pr52306.diff: Disables -fauto-inc-dec by default on m68k to + work around ICE when building C++ code (e.g. Qt-related). + + -- Matthias Klose Thu, 28 Nov 2013 10:29:09 +0100 + +gcc-4.8 (4.8.2-5ubuntu3) trusty; urgency=low + + * Update to SVN 20131119 (r205005) from the gcc-4_8-branch. + + -- Matthias Klose Tue, 19 Nov 2013 08:12:38 +0100 + +gcc-4.8 (4.8.2-5ubuntu2) trusty; urgency=low + + * Fix build failure on powerpc. + + -- Matthias Klose Mon, 18 Nov 2013 08:14:00 +0100 + +gcc-4.8 (4.8.2-5ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Mon, 18 Nov 2013 06:29:52 +0100 + +gcc-4.8 (4.8.2-5) unstable; urgency=low + + * Update to SVN 20131115 (r204839) from the gcc-4_8-branch. + * Update the Linaro support to the 4.8-2013.11 release. + * Add missing replaces in libgcj14. Closes: #729022. + + -- Matthias Klose Sat, 16 Nov 2013 20:15:09 +0100 + +gcc-4.8 (4.8.2-4ubuntu1) trusty; urgency=low + + * Fix LP #1243656, miscompilation of tar on armhf. + + -- Matthias Klose Wed, 13 Nov 2013 10:12:35 +0100 + +gcc-4.8 (4.8.2-4) unstable; urgency=low + + * Really fix disabling the gdc tests. + + -- Matthias Klose Wed, 13 Nov 2013 00:44:35 +0100 + +gcc-4.8 (4.8.2-3) unstable; urgency=low + + * Update to SVN 20131112 (r204704) from the gcc-4_8-branch. + * Don't ship java.security in both libgcj14 and gcj-4.8-headless. + Closes: #729022. + * Disable gdc tests on architectures without libphobos port. + + -- Matthias Klose Tue, 12 Nov 2013 18:08:44 +0100 + +gcc-4.8 (4.8.2-2ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 07 Nov 2013 16:27:04 +0100 + +gcc-4.8 (4.8.2-2) unstable; urgency=low + + * Update to SVN 20131017 (r204496) from the gcc-4_8-branch. + * Build ObjC, Obj-C++ and Go for AArch64. + * Fix some gcj symlinks. Closes: #726792, #728403. + * Stop building libmudflap (removed in GCC 4.9). + + -- Matthias Klose Thu, 07 Nov 2013 01:40:15 +0100 + +gcc-4.8 (4.8.2-1ubuntu2) trusty; urgency=low + + * Build ObjC, Obj-C++ and Go for AArch64. + + -- Matthias Klose Mon, 21 Oct 2013 00:07:57 +0200 + +gcc-4.8 (4.8.2-1ubuntu1) trusty; urgency=low + + * Merge with Debian; remaining changes: + - Build from the upstream source. + + -- Matthias Klose Wed, 16 Oct 2013 13:43:20 +0200 + +gcc-4.8 (4.8.2-1) unstable; urgency=low + + * GCC 4.8.2 release. + + * Update to SVN 20131017 (r203751) from the gcc-4_8-branch. + * Update the Linaro support to the 4.8-2013.10 release. + * Fix PR c++/57850, option -fdump-translation-unit not working. + * Don't run the testsuite on aarch64. + * Fix PR target/58578, wrong-code regression on ARM. LP: #1232017. + * [ARM] Fix bug in add patterns due to commutativity modifier, + backport from trunk. LP: #1234060. + * Build libatomic on AArch64. + * Fix dependency generation for the cross gcc-4.8 package. + * Make the libstdc++ pretty printers compatible with Python3, if + gdb is built with Python3 support. + * Fix loading of libstdc++ pretty printers. Closes: #701935. + * Don't let gcc-snapshot build-depend on gnat on AArch64. + + -- Matthias Klose Thu, 17 Oct 2013 14:37:55 +0200 + +gcc-4.8 (4.8.1-10ubuntu7) saucy; urgency=low + + * Update to SVN 20131008 (r203273) from the gcc-4_8-branch. + - Fix PR libstdc++/57641, PR libstdc++/57465, PR libstdc++/58569. + - S390 updates, fix PR target/58460 (AArch64). + - Fix PR c++/58535 (ice on invalid), PR fortran/57697, PR fortran/58469. + - Go updates. + * Fix dependency generation for the cross gcc-4.8 package. + * Re-enable gcj on AArch64. + + -- Matthias Klose Tue, 08 Oct 2013 14:51:58 +0200 + +gcc-4.8 (4.8.1-10ubuntu6) saucy; urgency=low + + * [ARM] Fix bug in add patterns due to commutativity modifier, + backport from trunk. LP: #1234060. + * Build libatomic on AArch64. + + -- Matthias Klose Wed, 02 Oct 2013 14:57:31 +0200 + +gcc-4.8 (4.8.1-10ubuntu5) saucy; urgency=low + + * Update to SVN 20131001 (r203063) from the gcc-4_8-branch. + - Fix PR libstdc++/58437, PR middle-end/58463, PR tree-optimization/56716, + PR middle-end/58564, PR target/58574 (s390). + - Go updates. + * Fix PR target/58578, wrong-code regression on ARM. LP: #1232017. + + -- Matthias Klose Tue, 01 Oct 2013 18:48:31 +0200 + +gcc-4.8 (4.8.1-10ubuntu4) saucy; urgency=low + + * Update to SVN 20130927 (r202974) from the gcc-4_8-branch. + * Fix PR c++/57850, option -fdump-translation-unit not working. + * For a first arm64 build in launchpad, disable the testsuite + and don't build gcj packages. + + -- Matthias Klose Fri, 27 Sep 2013 19:00:06 +0200 + +gcc-4.8 (4.8.1-10ubuntu3) saucy; urgency=low + + * Update to SVN 20130915 (r202601) from the gcc-4_8-branch. + * Update the Linaro support to the 4.8-2013.09 release. + + -- Matthias Klose Mon, 16 Sep 2013 10:43:58 +0200 + +gcc-4.8 (4.8.1-10ubuntu2) saucy; urgency=low + + * Disable gcc-default-format-security on non-ssp arches, as it + appears to depend on the SSP patch also being applied to work. + + -- Adam Conrad Fri, 13 Sep 2013 21:19:05 -0400 + +gcc-4.8 (4.8.1-10ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 05 Sep 2013 00:36:37 +0200 + +gcc-4.8 (4.8.1-10) unstable; urgency=low + + * Update to SVN 20130904 (r202243) from the gcc-4_8-branch. + + [ Matthias Klose ] + * Don't rely on the most recent Debian release name for configuration + of the package. Addresses: #720263. Closes: #711824. + * Fix a cross build issue without DEB_* env vars set (Eleanor Chen). + Closes: #718614. + * Add packaging support for mips64(el) and mipsn32(el) including multilib + configurations (YunQiang Su). Addresses: #708143. + * Fix gcc dependencies for stage1 builds (YunQiang Su). Closes: #710240. + * Fix boehm-gc test failures with a linker defaulting to + --no-copy-dt-needed-entries. + * Fix libstdc++ and libjava test failures with a linker defaulting + to --as-needed. + * Mark the libjava/sourcelocation test as expected to fail on amd64 cpus. + * Fix some gcc and g++ test failures for a compiler with hardening + defaults enabled. + * Fix gcc-default-format-security.diff for GCC 4.8. + * Run the testsuite again on armel and armhf. + * Disable running the testsuite on mips. Fails on the buildds, preventing + migration to testing for three months. No feedback from the mips porters. + + [ Thorsten Glaser ] + * Merge several old m68k-specific patches from gcc-4.6 package: + - libffi-m68k: Rebased against gcc-4.8 and libffi 3.0.13-4. + - m68k-revert-pr45144: Needed for Ada. + - pr52714: Revert optimisation that breaks CC0 arch. + * Fix PR49847 (Mikael Pettersson). Closes: #711558. + * Use -fno-auto-inc-dec for PR52306 (Mikael Pettersson). + + -- Matthias Klose Wed, 04 Sep 2013 21:30:07 +0200 + +gcc-4.8 (4.8.1-9ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + * Re-enable running the testsuite on armhf. + + -- Matthias Klose Thu, 15 Aug 2013 14:40:11 +0200 + +gcc-4.8 (4.8.1-9) unstable; urgency=low + + * Update to SVN 20130815 (r201764) from the gcc-4_8-branch. + * Enable gomp on AArch64. + * Update the Linaro support to the 4.8-2013.08 release. + + -- Matthias Klose Thu, 15 Aug 2013 10:47:38 +0200 + +gcc-4.8 (4.8.1-8ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Tue, 23 Jul 2013 01:24:54 +0200 + +gcc-4.8 (4.8.1-8) unstable; urgency=low + + * Fix PR rtl-optimization/57878, taken from the 4.8 branch. + * Fix PR target/57909 (ARM), Linaro only. + + -- Matthias Klose Mon, 22 Jul 2013 13:03:57 +0200 + +gcc-4.8 (4.8.1-7ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 18 Jul 2013 02:12:56 +0200 + +gcc-4.8 (4.8.1-7) unstable; urgency=low + + * Update to SVN 20130717 (r200995) from the gcc-4_8-branch. + - Go 1.1.1 updates. + * Define CPP_SPEC for aarch64. + * Don't include in libgcc/libgcc2.c, taken from the trunk. + Closes: #696267. + * boehm-gc: use mmap instead of brk also on kfreebsd-* (Petr Salinger). + Closes: #717024. + + -- Matthias Klose Thu, 18 Jul 2013 02:02:13 +0200 + +gcc-4.8 (4.8.1-6ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Mon, 08 Jul 2013 18:19:02 +0200 + +gcc-4.8 (4.8.1-6) unstable; urgency=low + + * Update to SVN 20130709 (r200810) from the gcc-4_8-branch. + + [ Aurelien Jarno ] + * Add 32-bit biarch packages on sparc64. + + [ Matthias Klose ] + * Fix multiarch include path for aarch64. + * Update the Linaro support to the 4.8-2013.07 release. + * Revert the proposed fix for PR target/57637 (ARM only). + * Let gfortran-4.8 provide gfortran-mod-10. Addresses #714730. + + [ Iain Buclaw ] + * Avoid compiler warnings redefining D builtin macros. + + -- Matthias Klose Tue, 09 Jul 2013 16:18:16 +0200 + +gcc-4.8 (4.8.1-5ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Sat, 29 Jun 2013 20:16:01 +0200 + +gcc-4.8 (4.8.1-5) unstable; urgency=low + + * Update to SVN 20130629 (r200565) from the gcc-4_8-branch. + + [ Aurelien Jarno ] + * Don't pass --with-mips-plt on mips/mipsel. + + [ Matthias Klose ] + * Fix documentation builds with texinfo-5.1. + * Update the ARM libsanitizer backport from the 4.8 Linaro branch. + * libphobos-4.8-dev provides libphobos-dev (Peter de Wachter). + * The gdc cross compiler doesn't depend on libphobos-4.8-dev. + * Work around libgo build failure on ia64. PR 57689. #714090. + * Apply proposed fix for PR target/57637 (ARM only). + + -- Matthias Klose Sat, 29 Jun 2013 14:59:45 +0200 + +gcc-4.8 (4.8.1-4ubuntu2) saucy; urgency=low + + * Update to SVN 20130621 (r200293) from the gcc-4_8-branch. + * Fix documentation builds with texinfo-5.1. + + -- Matthias Klose Fri, 21 Jun 2013 13:50:16 +0200 + +gcc-4.8 (4.8.1-4ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 20 Jun 2013 00:09:01 +0200 + +gcc-4.8 (4.8.1-4) unstable; urgency=low + + * Update to SVN 20130619 (r200219) from the gcc-4_8-branch. + - Bump the libgo soname (change in type layout for functions that take + function arguments). + - Fix finding the liblto_plugin.so without x permissions set (see + PR driver/57651). Closes: #712704. + * Update maintainer list. + * Fall back to the binutils version of the binutils build dependency + if the binutils version used for the build cannot be determined. + * For ARM multilib builds, use libsf/libhf system directories to lookup + files for the non-default multilib (for now, only for the cross compilers). + * Split out a gcj-4.8 package, allow to build a gcj cross compiler. + * Allow to cross build gcj. + * Don't include object.di in the D cross compiler, but depend on gdc instead. + * Allow to cross build gdc. + * Pass --hash-style=gnu instead of --hash-style=both to the linker. + + -- Matthias Klose Wed, 19 Jun 2013 23:48:02 +0200 + +gcc-4.8 (4.8.1-3ubuntu3) saucy; urgency=low + + * Fix gcj cross build. + + -- Matthias Klose Wed, 19 Jun 2013 12:26:23 +0200 + +gcc-4.8 (4.8.1-3ubuntu2) saucy; urgency=low + + * Fall back to the binutils version of the binutils build dependency + if the binutils version used for the build cannot be determined. + * For ARM multilib builds, use libsf/libhf system directories to lookup + files for the non-default multilib (for now, only for the cross compilers). + * Split out a gcj-4.8 package, allow to build a gcj cross compiler. + * Allow to cross build gcj. + * Don't include object.di in the D cross compiler, but depend on gdc instead. + * Allow to cross build gdc. + + -- Matthias Klose Tue, 18 Jun 2013 12:07:04 +0200 + +gcc-4.8 (4.8.1-3ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Wed, 12 Jun 2013 17:21:50 +0200 + +gcc-4.8 (4.8.1-3) unstable; urgency=low + + * Update to SVN 20130612 (r200018) from the gcc-4_8-branch. + + [ Matthias Klose ] + * Prepare gdc for cross builds, and multiarch installation. + * Prepare gnat to build out of the gcc-4.8 source package, not + building the gnat-4.8-base package anymore. + * Don't build a gcj cross compiler by default (not yet tested). + * Disable D on s390 (doesn't terminate the D testsuite). + * Build libphobos on x32. + * Fix build with DEB_BUILD_OPTIONS="nolang=d". + * Disable D for arm64. + * Update the Linaro support to the 4.8-2013.06 release. + * Fix cross building a native compiler. + * Work around dh_shlibdeps not working on target libraries (see #698881). + * Add build dependency on kfreebsd-kernel-headers (>= 0.84) [kfreebsd-any]. + * Add handling for unwind inside signal trampoline for kfreebsd (Petr + Salinger). Closes: #712016. + * Let gcc depend on the binutils upstream version it was built with. + Addresses #710142. + * Force a build using binutils 2.23.52 in unstable. + + [ Iain Buclaw ] + * Update gdc to 20130610. + * Build libphobos on kFreeBSD. + + -- Matthias Klose Wed, 12 Jun 2013 16:47:25 +0200 + +gcc-4.8 (4.8.1-2ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Tue, 04 Jun 2013 17:30:35 +0200 + +gcc-4.8 (4.8.1-2) unstable; urgency=low + + * Update to SVN 20130643 (r199596) from the gcc-4_8-branch. + * Force arm mode for libjava on armhf. + * Fix gdc build failure on kFreeBSD and the Hurd. + + -- Matthias Klose Tue, 04 Jun 2013 17:28:06 +0200 + +gcc-4.8 (4.8.1-1ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Mon, 03 Jun 2013 18:01:09 +0200 + +gcc-4.8 (4.8.1-1) unstable; urgency=low + + * GCC 4.8.1 release. + Support for C++11 ref-qualifiers has been added to GCC 4.8.1, making G++ + the first C++ compiler to implement all the major language features of + the C++11 standard. + * Update to SVN 20130603 (r199596) from the gcc-4_8-branch. + * Build java packages from this source package. Works aroud ftp-master's + overly strict interpretation of the Built-Using attribute. + * Build D and libphobos packages from this source package. + * Disable the non-default multilib test runs for libjava and gnat. + + -- Matthias Klose Mon, 03 Jun 2013 09:28:11 +0200 + +gcc-4.8 (4.8.0-8ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Mon, 27 May 2013 20:07:08 +0200 + +gcc-4.8 (4.8.0-8) unstable; urgency=medium + + * Update to SVN 20130527 (r199350) from the gcc-4_8-branch (4.8.1 rc2). + - Fix PR tree-optimization/57230 (closes: #707118). + + * Remove gdc-doc.diff. + * libgo: Overwrite the setcontext_clobbers_tls check on mips*, fails + on some buildds. + * Update the Linaro support to the 4.8-2013.05 release. + * Use the %I spec when building the object file for the gcj main function. + * Fix PR c++/57211, don't warn about unused parameters of defaulted + functions. Taken from the trunk. Closes: #705066. + * Update symbols files for powerpcspe (Roland Stigge). Closes: #709383. + * Build zh_TW.UTF-8 locale to fix libstdc++ test failures. + * Keep prev-* symlinks to fix plugin.exp test failures. + + -- Matthias Klose Mon, 27 May 2013 15:43:08 +0200 + +gcc-4.8 (4.8.0-7ubuntu1) saucy; urgency=low + + * Update to SVN 20130517 (r199023) from the gcc-4_8-branch. + * Update the Linaro support to the 4.8-2013.05 release. + + -- Matthias Klose Sat, 18 May 2013 17:40:49 +0200 + +gcc-4.8 (4.8.0-7) unstable; urgency=medium + + * Update to SVN 20130512 (r198804) from the gcc-4_8-branch. + + [ Matthias Klose ] + * Revert the r195826 patch, backported for the 4.8 branch. + * Tighten build dependency on libmpc-dev to ensure using libmpc3. + * Re-add build dependency on locales. + * Enable multilib build for gdc. + * Add build-deps on libn32gcc1 and lib64gcc1 on mips/mipsel. + * Fix libgcc-dbg dependencies on hppa and m68k. Closes: #707745. + * Install host specific libstdc++ headers into the host include dir. + Closes: #707753. + * Enable Go for sparc64. + * Fix host specific c++ include dir on kfreebsd-amd64. Closes: #707957. + + [ Thorsten Glaser ] + * Regenerate m68k patches. Closes: #707766. + + [ Aurelien Jarno ] + * Fix libgcc1 symbols file for sparc64. + + -- Matthias Klose Sun, 12 May 2013 19:26:50 +0200 + +gcc-4.8 (4.8.0-6ubuntu1) saucy; urgency=low + + * Update to SVN 20130508 (r198714) from the gcc-4_8-branch. + + -- Matthias Klose Wed, 08 May 2013 18:39:15 +0200 + +gcc-4.8 (4.8.0-6) unstable; urgency=low + + * Update to SVN 20130507 (r198699) from the gcc-4_8-branch. + + [ Samuel Thibault ] + * Backport r195826 to fix gdb build on hurd-i386. + + [ Matthias Klose ] + * Drop build dependency on locales for this upload. + + -- Matthias Klose Wed, 08 May 2013 01:17:15 +0200 + +gcc-4.8 (4.8.0-5) unstable; urgency=low + + * Update to SVN 20130506 (r198641) from the gcc-4_8-branch. + + [ Matthias Klose ] + * Stop building the spu cross compilers on powerpc and ppc64. + * Merge back changes from gnat-4.8 4.8.0-1~exp2. + + [Ludovic Brenta] + * debian/patches/ada-libgnatprj.diff: do not include indepsw.o in the + library, it is used only in the gnattools. + + -- Matthias Klose Mon, 06 May 2013 21:49:44 +0200 + +gcc-4.8 (4.8.0-4ubuntu4) saucy; urgency=low + + * Update to SVN 20130503 (r198582) from the gcc-4_8-branch. + + -- Matthias Klose Fri, 03 May 2013 20:49:45 +0200 + +gcc-4.8 (4.8.0-4ubuntu3) saucy; urgency=low + + * Update to SVN 20130501 (r198500) from the gcc-4_8-branch. + + -- Matthias Klose Wed, 01 May 2013 19:12:39 +0200 + +gcc-4.8 (4.8.0-4ubuntu2) saucy; urgency=low + + * Update to SVN 20130426 (r198340) from the gcc-4_8-branch. + * Stop building the spu cross compilers on powerpc and ppc64. + * Merge back changes from gnat-4.8 4.8.0-1~exp2. + + -- Matthias Klose Fri, 26 Apr 2013 16:59:06 +0200 + +gcc-4.8 (4.8.0-4ubuntu1) saucy; urgency=low + + * Merge with Debian, remaining changes: + - Build from the upstream source. + + -- Matthias Klose Sun, 21 Apr 2013 19:11:42 +0200 + +gcc-4.8 (4.8.0-4) experimental; urgency=low + + * Update to SVN 20130421 (r198115) from the gcc-4_8-branch. + * Ignore the return value for dh_shlibdeps for builds on precise/ARM. + * Use target specific names for libstdc++ baseline files. LP: #1168267. + * Update gcc-d-lang.diff for GDC port. + * Don't use extended libstdc++-doc build dependencies for older releases. + * In gnatlink, pass the options and libraries after objects to the + linker to avoid link failures with --as-needed. Addresses: #680292. + * Build gcj for aarch64-linux-gnu. + * Update the Linaro support to the 4.8-2013.04 release. + + -- Matthias Klose Sun, 21 Apr 2013 15:38:07 +0200 + +gcc-4.8 (4.8.0-3ubuntu2) raring; urgency=low + + * Update to SVN 20130413 (r197943) from the gcc-4_8-branch. + * Use target specific names for libstdc++ baseline files. LP: #1168267. + * Update gcc-d-lang.diff for GDC port. + * Don't use extended libstdc++-doc build dependencies for older releases. + * In gnatlink, pass the options and libraries after objects to the + linker to avoid link failures with --as-needed. Closes: #680292. + * Build gcj for aarch64-linux-gnu. + + -- Matthias Klose Sat, 13 Apr 2013 16:05:13 +0200 + +gcc-4.8 (4.8.0-3ubuntu1) raring; urgency=low + + * Update to SVN 20130411 (r197832) from the gcc-4_8-branch. + * Ignore the return value for dh_shlibdeps for builds on precise/ARM. + + -- Matthias Klose Fri, 12 Apr 2013 01:27:34 +0200 + +gcc-4.8 (4.8.0-3) experimental; urgency=low + + * Update to SVN 20130411 (r197813) from the gcc-4_8-branch. + + [ Iain Buclaw ] + * Port GDC to GCC 4.8.0 release. + + -- Matthias Klose Thu, 11 Apr 2013 19:18:24 +0200 + +gcc-4.8 (4.8.0-2ubuntu1) raring; urgency=low + + * Merge with Debian; remaing changes: + - Build from the upstream source. + + -- Matthias Klose Thu, 28 Mar 2013 12:09:17 +0100 + +gcc-4.8 (4.8.0-2) experimental; urgency=low + + * Update to SVN 20130328 (r197185) from the gcc-4_8-branch. + * Update NEWS files. + * Apply proposed patch for PR c++/55951. Closes: #703945. + * Configure with --disable-libatomic for hppa64. Closes: #704020. + + -- Matthias Klose Thu, 28 Mar 2013 06:10:29 +0100 + +gcc-4.8 (4.8.0-1ubuntu1) raring; urgency=low + + * Merge with Debian; remaing changes: + - Build from the upstream source. + + -- Matthias Klose Fri, 22 Mar 2013 16:08:16 +0100 + +gcc-4.8 (4.8-20130319-0ubuntu1) raring; urgency=low + + * GCC snapshot 20130319, taken from the trunk. + - Fix the build failures on ARM. + * Install the libasan_preinit.o files. Closes: #703229. + + -- Matthias Klose Mon, 18 Mar 2013 16:18:25 -0700 + +gcc-4.8 (4.8-20130315-1ubuntu1) raring; urgency=low + + * GCC snapshot 20130315, taken from the trunk. + + -- Matthias Klose Fri, 15 Mar 2013 18:51:15 -0700 + +gcc-4.8 (4.8-20130308-1) experimental; urgency=low + + * GCC snapshot 20130308, taken from the trunk. + + -- Matthias Klose Fri, 08 Mar 2013 12:08:12 +0800 + +gcc-4.8 (4.8-20130222-1) experimental; urgency=low + + * GCC snapshot 20130222, taken from the trunk. + * Update libasan symbols files. + + -- Matthias Klose Sat, 23 Feb 2013 04:47:15 +0100 + +gcc-4.8 (4.8-20130217-1) experimental; urgency=low + + * GCC snapshot 20130217, taken from the trunk. + + * Update libasan symbols files. + * On alpha, link with --no-relax. Update libgcc1 symbols files (Michael + Cree). Closes: #699220. + + -- Matthias Klose Mon, 18 Feb 2013 03:12:31 +0100 + +gcc-4.8 (4.8-20130209-1) experimental; urgency=low + + * GCC snapshot 20130209, taken from the trunk. + + [ Matthias Klose ] + * Add a Build-Using attribute for each binary package, which can be + built from the gcc-4.7-source package (patch derived from a proposal by + Ansgar Burchardt). + - Use it for cross-compiler packages. + - Not yet used when building gcj, gdc or gnat using the gcc-source package. + These packages don't require an exact version of the gcc-source package, + but just a versions which is specified by the build dependencies. + * Fix dh_shlibdeps calls for the libgo packages. + * libstdc-doc: Depend on libjs-jquery. + * Update libstdc++ symbols files. + * Downgrade the priority of the non-default multilib libasan packages. + + [ Thibaut Girka ] + * Fix dh_shlibdeps and dh_gencontrol cross-build mangling for + libgfortran-dev packages. + + -- Matthias Klose Sat, 09 Feb 2013 17:00:06 +0100 + +gcc-4.8 (4.8-20130127-1) experimental; urgency=low + + * GCC snapshot 20130127, taken from the trunk. + + [ Matthias Klose ] + * Fix MULTILIB_OS_DIRNAME for the default multilib on x32. + + [ Thibaut Girka ] + * Fix installation path for libatomic and libsanitizer when building a + cross-compiler with with_deps_on_target_arch_pkgs. + * Fix regexp used to list patched autotools files. + + -- Matthias Klose Sun, 27 Jan 2013 21:02:34 +0100 + +gcc-4.8 (4.8-20130113-1) experimental; urgency=low + + * GCC snapshot 20130113, taken from the trunk. + * Always configure --with-system-zlib. + * Search library dependencies in the build-sysroot too. + * Don't complain about missing .substvars files when trying to mangle + these files. + * Add ARM multilib packages to the control file for staged cross builds. + * Fix ARM multilib shlibs dependency generation for cross builds. + * Don't call dh_shlibdeps for staged cross builds. These packages + are never shipped, and the information is irrelevant. + * Build the libasan and libtsan packages before libstdc++. + * Bump build dependencies on isl and cloog. + * Don't ship libiberty.a in gcc-4.8-hppa64. Closes: #659556. + + -- Matthias Klose Sun, 13 Jan 2013 16:42:33 +0100 + +gcc-4.8 (4.8-20130105-1) experimental; urgency=low + + * GCC snapshot 20130105, taken from the trunk. + * Keep the debug link for libstdc++6. Closes: #696854. + * Update libgfortran symbols file for the trunk. + * Fix libstdc++ symbols files for sparc 128bit symbols. + * Update libgcc and libstdc++ symbols files for s390. + * Keep the rt.jar symlink in the gcj-jre-headless package. + * Explicitly search multiarch and multilib system directories when + calling dh_shlibdeps. + * Let gjdoc accept -source 1.5|1.6|1.7. Addresses: #678945. + * Fix build configured with --enable-java-maintainer-mode. + * Don't ship .md5 files in the libstdc++-doc package. + + -- Matthias Klose Sat, 05 Jan 2013 13:47:51 +0100 + +gcc-4.8 (4.8-20130102-1) experimental; urgency=low + + * GCC snapshot 20130102, taken from the trunk. + + [ Matthias Klose ] + * Resolve libgo dependencies with the built runtime libraries. + * Fix g++-4.8-multilib dependencies. + + [ Thibaut Girka ] + * Prepare for optional dependencies on the packages built on the + target architecture. + * When using the above, + - use the same settings for gcc_lib_dir, sysroot, header and C++ header + locations as for the native build. + - install libraries into the multiarch directories. + - use cpp-4.x- instead of gcc-4.x-base to collect doc files. + + -- Matthias Klose Wed, 02 Jan 2013 14:51:59 +0100 + +gcc-4.8 (4.8-20121218-1) experimental; urgency=low + + * GCC snapshot 20121217, taken from the trunk. + * Fix dependency generation for asan and atomic multilibs. + * Fix libobjc-dbg dependencies on libgcc-dbg packages. + * Fix MULTIARCH_DIRNAME definition for powerpcspe (Roland Stigge). + Closes: #695661. + * Move .jar symlinks from the -jre-lib into the -jre-headless package. + + -- Matthias Klose Tue, 18 Dec 2012 16:44:42 +0100 + +gcc-4.8 (4.8-20121217-1) experimental; urgency=low + + * GCC snapshot 20121217, taken from the trunk. + * Fix package builds with the common libraries provided by a newer + gcc-X.Y package. + * Drop build-dependency on libelf. + * Drop the g++-multilib build dependency, use the built compiler to + check which multilib variants can be run. Provide an asm symlink for + the build. + * Stop configuring cross compilers --with-headers --with-libs. + * Always call dh_shlibdeps with -l, pointing to the correct dependency + packages. + * Fix cross build stage1 package installation, only including the target + files in the gcc package. + * Explicitly configure with --enable-multiarch when doing builds + supporting the multiarch layout. + * Only configure --with-sysroot, --with-build-sysroot when values are set. + * Revert: For stage1 builds, include gcc_lib_dir files in the gcc package. + * Allow multilib enabled stage1 and stage2 cross builds. + * Don't check glibc version to configure --with-long-double-128. + * Don't auto-detect multilib osdirnames. + * Don't set a LD_LIBRARY_PATH when calling dh_shlibdeps in cross builds. + * Allow building a gcj cross compiler. + * Pretend that wheezy has x32 support (sid is now known as wheezy :-/). + + -- Matthias Klose Mon, 17 Dec 2012 18:37:14 +0100 + +gcc-4.8 (4.8-20121211-1) experimental; urgency=low + + * GCC snapshot 20121211, taken from the trunk. + * Fix build failure on multilib configurations. + + -- Matthias Klose Tue, 11 Dec 2012 08:04:30 +0100 + +gcc-4.8 (4.8-20121210-1) experimental; urgency=low + + * GCC snapshot 20121210, taken from the trunk. + * For cross builds, don't use the multiarch location for the C++ headers. + * For cross builds, fix multilib inter package dependencies. + * For cross builds, fix libc6 dependencies for non-default multilib packages. + * Build libasan packages on powerpc, ppc64. + * Only run the libgo testsuite for flags configured in RUNTESTFLAGS. + * Remove the cross-includes patch, not needed anymore with --with-sysroot=/. + * For cross builds, install into /usr/lib/gcc-cross to avoid file conflicts + with the native compiler for the target architecture. + * For cross builds, don't add /usr/local/include to the standard include + path, however /usr/local/include/ is still on the path. + * For cross builds, provide symbols files based on the symbols files for + the native build. Not picked up by dh_makeshlibs yet. + * Drop the g++-multilib build dependency, use the built compiler to + check which multilib variants can be run. + * Fix spu cross build on powerpc/ppc64. + * Make libgcj packages Multi-Arch: same, append the Debian architecture + name to the gcj java home. + * Don't encode versioned build dependencies on binutils and dpkg-dev in + the control file (makes the package cross-buildable). + * Only include gengtype for native builds. Needs upstream changes. + See #645018. + * Fix cross build failure with --enable-libstdcxx-debug. + * Only install libbacktrace if it is built. + * When cross building the native compiler, configure --with-sysroot=/ + and without --without-isl. + + -- Matthias Klose Mon, 10 Dec 2012 14:40:14 +0100 + +gcc-4.8 (4.8-20121128-1) experimental; urgency=low + + [ Matthias Klose ] + * Update patches for GCC 4.8. + * Update debian/copyright for libatomic, libbacktrace, libsanitizer. + * Remove the soversion from the libstdc++*-dev packages. + * Build libatomic and libasan packages. + * Install the static libbacktrace library and header files. + * Update build-indep dependencies for building the libstdc++ docs. + * Fix build failure in libatomic with x32 multilibs, handle -mx32 like -m64. + * Apply proposed fix for PR fortran/55395, supposed to fix the build + failure on armhf and powerpc. + * For hardened builds, disable gcc-default-format-security for now, causing + build failure building the target libstdc++ library. + * Drop the gcc-no-add-needed patch, depend on binutils 2.22 instead. + * Fix gnat build failure on kfreebsd. + * Rename the gccgo info to gccgo-4.8 on installation. + * Install the libitm documentation (if built). + * Rename the gccgo info to gccgo-4.8 on installation, install into gccgo-4.8. + * Include libquadmath documentation in the gcc-4.8-doc package. + * Build libtsan packages. + * Add weak __aeabi symbols to the libgcc1 ARM symbol files. Closes: #677139. + * For stage1 builds, include gcc_lib_dir files in the gcc package. + * Point to gcc's README.Bugs when building gcj packages. Addresses: #623987. + + [ Thibaut Girka ] + * Fix libstdc++ multiarch include path for cross builds. + + -- Matthias Klose Sun, 28 Nov 2012 12:55:27 +0100 + +gcc-4.7 (4.7.2-12) experimental; urgency=low + + * Update to SVN 20121127 (r193840) from the gcc-4_7-branch. + - Fix PR middle-end/55331 (ice on valid), PR tree-optimization/54976 (ice + on valid), PR tree-optimization/54894 (ice on valid), + PR middle-end/54735 (ice on valid), PR c++/55446 (wrong code), + PR fortran/55314 (rejects valid). + + [ Matthias Klose ] + * Fix x32 multiarch name (x86_64-linux-gnux32). + * gcc-4.7-base: Add break to gcc-4.4-base (<< 4.4.7). Closes: #690172. + * Add weak __aeabi symbols to the libgcc1 ARM symbol files. Closes: #677139. + * For stage1 builds, include gcc_lib_dir files in the gcc package. + + [ Thibaut Girka ] + * Fix libstdc++ multiarch include path for cross builds. + + -- Matthias Klose Tue, 27 Nov 2012 11:02:10 +0100 + +gcc-4.7 (4.7.2-11) experimental; urgency=low + + * Update to SVN 20121124 (r193776) from the gcc-4_7-branch. + - Fix PR libgomp/55411, PR libstdc++/55413, PR middle-end/55142, + PR fortran/55352. + + * Update build-indep dependencies for building the libstdc++ docs. + * Drop the gcc-no-add-needed patch, depend on binutils 2.22 instead. + * Pass --hash-style=gnu instead of --hash-style=both. + * Link using --hash-style=gnu on arm64 by default. + * Split multiarch patches into local and upstreamed parts. + * Fix PR54974: Thumb literal pools don't handle PC rounding (Matthew + Gretton-Dann). LP: #1049614, #1065509. + * Rename the gccgo info to gccgo-4.7 on installation, install into gccgo-4.7. + * Include libquadmath documentation in the gcc-4.7-doc package. + * Don't pretend to understand .d files, no D frontend available for 4.7. + * Fix the multiarch c++ include path for multilib'd targets. LP: #1082344. + * Make explicit --{en,dis}able-multiarch options effecitive (Thorsten Glaser). + + -- Matthias Klose Sat, 24 Nov 2012 03:57:00 +0100 + +gcc-4.7 (4.7.2-10) experimental; urgency=low + + * Update to SVN 20121118 (r193598) from the gcc-4_7-branch. + - Fix PR target/54892 (ARM, LP: #1065122), PR rtl-optimization/54870, + PR rtl-optimization/53701, PR target/53975 (ia64), + PR tree-optimization/54902 (LP: #1065559), PR middle-end/54945, + PR target/55019 (ARM), PR c++/54984, PR target/55175, + PR tree-optimization/53708, PR tree-optimization/54985, + PR libstdc++/55169, PR libstdc++/55047, PR libstdc++/55123, + PR libstdc++/54075, PR libstdc++/28811, PR libstdc++/54482, + PR libstdc++/55028, PR libstdc++/55215, PR middle-end/55219, + PR tree-optimization/54986, PR target/55204, PR debug/54828, + PR tree-optimization/54877, PR c++/54988, PR other/52438, + PR fortran/54917, PR libstdc++/55320, PR libstdc++/53841. + + [ Matthias Klose ] + * Update the Linaro support to the 4.7-2012.11 release. + * Define MULTIARCH_DIRNAME for arm64 (Wookey). + * Let the lib*objc-dev packages depend on the lib*gcc-dev packages. + * Let the libstdc++-dev package depend on the libgcc-dev package. + * Drop the dependency of the libstdc++-dev package on g++, make + libstdc++-dev and libstdc++-pic Multi-Arch: same. Closes: #678623. + * Install override files before calling dh_fixperms. + * Backport the libffi arm64 port. + * Build libx32gcc-dev, libx32objc-dev and libx32gfortran-dev packages. + * Allow conditional building of the x32 multilibs. + * Fix libmudflap build failure for x32 multilibs. + * Fix dependency on glibc for triarch builds. + * Add build-{arch,indep} targets. + * Fix libquadmath x32 multilib builds on kernels which don't support x32. + * Fix location of x32 specific C++ header files. + * Turn on -D_FORTIFY_SOURCE=2 by default for C, C++, ObjC, ObjC++, + only if the optimization level is > 0. + * Keep the host alias when building multilib libraries which need to + be cross-built on some architectures/buildds. + * Update arm64 from the aarch64 branch 20121105. + * Fix PR other/54411, libiberty: objalloc_alloc integer overflows + (CVE-2012-3509). + * Use /usr/include//c++/4.x as the include directory + for host dependent c++ header files. + * Add alternative libelf-dev build dependency. Closes: #690952. + * Always build the aarch64-linux-gnu target from the Linaro branch. + * Add __gnu_* symbols to the libgcc1 symbols file for armel and armhf. + * For powerpcspe prevent floating point register handling when there + are none available (Roland Stigge). Closes: #693328. + * Don't apply hurd-pthread.diff for trunk builds, integrated + upstream (Samuel Thibault). Addresses: #692538. + * Again, suggest graphite runtime dependencies. + * Clean up libstdc++ man pages. Closes: #692445. + + [ Thibaut Girka ] + * Split out lib*gcc-dev packages. + * Split out lib*objc-dev packages. + * Split out lib*gfortran-dev packages. + + [ Daniel Schepler ] + * Add support for x32. Closes: #667005. + * New patch hjl-x32-gcc-4_7-branch.diff to incorporate changes from + that branch, including --with-abi=mx32 option. + * Split out lib*stdc++-dev packages. + + [ Marcin Juszkiewicz ] + * lib*-dev packages for cross builds are not Multi-Arch: same. LP: #1070694. + * Remove conflicts for armhf/armel cross packages. + + -- Matthias Klose Sun, 18 Nov 2012 17:54:15 +0100 + +gcc-4.7 (4.7.2-4) unstable; urgency=low + + * Fix PR c++/54858 (ice on valid), taken from the branch. + * Build again Go on armel and armhf. + + -- Matthias Klose Tue, 09 Oct 2012 12:00:59 +0200 + +gcc-4.7 (4.7.2-3) unstable; urgency=low + + * Revert the fix PR c/33763, and just disable the sorry message, + taken from the branch. Closes: #678589. LP: #1062343. + * Update libgo to 1.0.3. + * Go fixes: + - Fix a, b, c := b, a, 1 when a and b already exist. + - Fix some type reflection strings. + - Fix parse of (<- chan <- chan <- int)(x). + - Fix handling of omitted expression in switch. + - Better error for switch on non-comparable type. + * Fix PR debug/53135 (ice on valid), PR target/54703 (x86, wrong code), + PR c++/54777 (c++11, rejects valid), taken from the 4.7 branch. + * gcc-4.7-base: ensure smooth upgrades from squeeze by adding + Breaks: gcj-4.4-base (<< 4.4.6-9~), gnat-4.4-base (<< 4.4.6-3~) + as in gcc-4.4-base (multiarch patches re-worked in 4.6.1-8/4.4.6-9). + Fixes some squeeze->wheezy upgrade paths where apt chooses to hold back + gcc-4.4-base and keep gcj-4.4-base installed instead of upgrading + gcc-4.4-base and removing the obsolete gcj-4.4-base (Andreas Beckmann). + Closes: #677582. + * Add arm64 support, partly based on Wookey's patches (only applied for + arm64). Disabled for arm64 are ssp, gomp, mudflap, boehm-gc, Ada, ObjC, + Obj-C++ and Java). + + -- Matthias Klose Fri, 05 Oct 2012 20:00:30 +0200 + +gcc-4.7 (4.7.2-2) unstable; urgency=low + + * Fix PR tree-optimization/54563 (ice on valid), PR target/54564 (fma builtin + fix), PR c/54552 (ice on valid), PR lto/54312 (memory hog), PR c/54103 (ice + on valid), PR middle-end/54638 (memory corruption), taken from the 4.7 + branch. + * Go fixes, taken from the 4.7 branch. + * On ARM, don't warn anymore that 4.4 has changed the `va_list' mangling, + taken from the trunk. + * Mention the NEWS changes for all uploads. Closes: #688278. + + -- Matthias Klose Fri, 21 Sep 2012 11:58:10 +0200 + +gcc-4.7 (4.7.2-1) unstable; urgency=low + + * GCC 4.7.2 release. + * Issues addressed after the release candidate: + - PR c++/53661 (wrong warning), LTO backport from trunk, documentation fix. + * Update NEWS files. + + -- Matthias Klose Thu, 20 Sep 2012 12:19:07 +0200 + +gcc-4.7 (4.7.1-9) unstable; urgency=low + + * GCC 4.7.2 release candidate 1. + * Update to SVN 20120914 (r191306) from the gcc-4_7-branch. + - Fix PR libstdc++/54388, PR libstdc++/54172, PR libstdc++/54172, + PR debug/54534, PR target/54536 (AVR), PR middle-end/54515 (ice on valid), + PR c++/54506 (rejects valid), PR c++/54341 (ice on valid), + PR c++/54253 (ice on valid), PR c/54559 (closes: #687496), + PR gcov-profile/54487, PR c++/53839, PR c++/54511, PR c++/53836, + PR fortran/54556. + * Update the Linaro support to the 4.7-2012.09 release. + - Adds support for the NEON vext instruction when shuffling. + - Backports improvements to scheduling transfers between VFP and core + registers. + - Backports support for the UBFX instruction on certain bit extract idioms. + + -- Matthias Klose Fri, 14 Sep 2012 19:12:47 +0200 + +gcc-4.7 (4.7.1-8) unstable; urgency=low + + * Update to SVN 20120908 (r191092) from the gcc-4_7-branch. + - Fix PR libstdc++/54376, PR libstdc++/54297, PR libstdc++/54351, + PR libstdc++/54297, PR target/54461 (AVR), PR target/54476 (AVR), + PR target/54220 (AVR), PR fortran/54208 (rejects valid), + PR middle-end/53667 (wrong code), PR target/54252 (ARM, wrong code), + PR rtl-optimization/54455 (ice on valid), PR driver/54335 (docs), + PR tree-optimization/54498 (wrong code), PR target/45070 (wrong code), + PR tree-optimization/54494 (wrong code), PR target/54436 (x86), + PR c/54428 (ice on valid), PR c/54363 (ice on valid, closes: #684635), + PR rtl-optimization/54369 (mips, sparc, wrong code), PR middle-end/54146, + PR target/46254 (ice on valid), PR rtl-optimization/54088 (ice on valid), + PR target/54212 (ARM, wrong code), PR c++/54197 (wrong code), + PR lto/53572, PR tree-optimization/53922 (wrong code). + - Go fixes. + + [ Nobuhiro Iwamatsu ] + * Remove sh4-enable-ieee.diff, -mieee enabled by default. Closes: #685975. + + [ Matthias Klose ] + * Fix PR c++/54341, PR c++/54253, taken from the trunk. Closes: #685430. + * Update libitm package description. Closes: #686802. + + -- Matthias Klose Fri, 07 Sep 2012 22:16:55 +0200 + +gcc-4.7 (4.7.1-7) unstable; urgency=low + + * Update to SVN 20120814 (r190380) from the gcc-4_7-branch. + - Fix PR libstdc++/54036, PR target/53961 (x86), PR libstdc++/54185, + PR rtl-optimization/53942, PR rtl-optimization/54157. + + [ Thibaut Girka ] + * Fix cross compilers for 64bit architectures when using + DEB_CROSS_NO_BIARCH. + * Fix glibc dependency for multiarch enabled builds for architectures + with a different libc-dev package name. + + [ Aurelien Jarno ] + * powerpc64: Fix non-multilib builds. + + [ Matthias Klose ] + * Fix syntax error generating the control file for cross builds. + Closes: #682104. + * spu build: Move static libraries to version specific directories. + Closes: #680022. + * Don't run the libstdc++ tests on mipsel, times out on the buildds. + * Update the Linaro support to the 4.7-2012.08 release. + + -- Matthias Klose Tue, 14 Aug 2012 13:58:03 +0200 + +gcc-4.7 (4.7.1-6) unstable; urgency=low + + * Update to SVN 20120731 (r190015) from the gcc-4_7-branch. + - Fix PR libstdc++/54075, PR libstdc++/53270, PR libstdc++/53978, + PR target/33135 (SH), PR target/53877 (x86), PR rtl-optimization/52250, + PR middle-end/54017, PR target/54029, PR target/53961 (x86), + PR target/53110 (x86), PR rtl-optimization/53908, PR c++/54038, + PR c++/54026, PR c++/53995, PR c++/53989, PR c++/53549 (closes: #680931), + PR c++/53953. + + -- Matthias Klose Tue, 31 Jul 2012 20:00:56 +0200 + +gcc-4.7 (4.7.1-5) unstable; urgency=high + + * Update to SVN 20120713 (r189464) from the gcc-4_7-branch. + - Fix PR libstdc++/53657, PR c++/53733 (DR 1402), PR target/53811, + PR target/53853. + + -- Matthias Klose Fri, 13 Jul 2012 16:59:59 +0200 + +gcc-4.7 (4.7.1-4) unstable; urgency=medium + + * Update to SVN 20120709 (r189388) from the gcc-4_7-branch. + - Fix PR libstdc++/53872, PR libstdc++/53830, PR bootstrap/52947, + PR middle-end/52786, PR middle-end/50708, PR tree-optimization/53693, + PR middle-end/52621, PR middle-end/53433, PR fortran/53732, + PR libstdc++/53578, PR c++/53882 (closes: #680521), PR c++/53826. + * Update the Linaro support to the 4.7-2012.07 release. + * Fix build on pre-multiarch releases (based on a patch from Chip Salzenberg). + Closes: #680590. + + -- Matthias Klose Mon, 09 Jul 2012 18:58:47 +0200 + +gcc-4.7 (4.7.1-3) unstable; urgency=low + + * Update to SVN 20120703 (r189219) from the gcc-4_7-branch. + - Fix PR preprocessor/37215, PR middle-end/38474, PR target/53595 (AVR), + PR middle-end/53790, PR debug/53682, PR target/53759 (x86), + PR c++/53816, PR c++/53821, PR c++/51214, PR c++/53498, PR c++/53305, + PR c++/52988 (wrong code), PR c++/53202 (wrong code), PR c++/53594. + - The change for PR libstdc++/49561 was reverted. The std::list size is + now the same again in c++98 and c++11 mode. + * Revert the local std::list work around. + * Build using isl instead of ppl for snapshot builds. + + -- Matthias Klose Tue, 03 Jul 2012 15:07:14 +0200 + +gcc-4.7 (4.7.1-2) unstable; urgency=medium + + * Update to SVN 20120623 (r188906) from the gcc-4_7-branch. + - Fix PR rtl-optimization/53700 (closes: #677678), PR target/52908, + PR libstdc++/53270, PR libstdc++/53678, PR gcov-profile/53744, + PR c++/52637, PR middle-end/53470, PR c++/53651, PR c++/53137, + PR c++/53599, PR fortran/53691, PR fortran/53685, PR ada/53592. + * Update NEWS files for 4.7.1. + * Bump gcc/FULL-VERSION to 4.7.1. + * Update the Linaro support to the 4.7-2012.06 release. + * Restore std::list ABI compatibility in c++11 mode. The upstream behaviour + can be enabled defining __CXX0X_STD_LIST_ABI_INCOMPAT__. This work around + will be replaced with an upstream solution. + * Fix PR debug/53682, taken from the trunk. Closes: #677606. + * Use $(with_gccbase) and $(with_gccxbase) to determine whether to enable it + in the control file (Thibaut Girka). + * When building a cross-compiler, runtime libraries for the target + architecture may be cross-built. Tell debhelper/dpkg-dev those packages + are indeed for a foreign architecture (Thibaut Girka). + + -- Matthias Klose Sat, 23 Jun 2012 11:58:35 +0200 + +gcc-4.7 (4.7.1-1) unstable; urgency=low + + * GCC 4.7.1 release. + + -- Matthias Klose Fri, 15 Jun 2012 00:38:27 +0200 + +gcc-4.7 (4.7.0-13) unstable; urgency=low + + * Update to SVN 20120612 (r188457) from the gcc-4_7-branch. + - Fix PR c++/53602 (LP: #1007616). + + * Document the changed ssp-buffer-size default in Ubuntu 10.10 and + later (Kees Cook). LP: #990141. + * Fix PR c++/26155, ICE after error with namespace alias. LP: #321883. + * Fix PR c++/53599 (reverting the fix for PR c++/53137). + Closes: #676729. LP: #1010896. + * Fix manual page names for cross builds (Thibaut Girka). Closes: #675516. + * Remove dpkg-cross build dependency for cross builds (Thibaut Girka). + Closes: #675511. + + -- Matthias Klose Tue, 12 Jun 2012 15:47:57 +0200 + +gcc-4.7 (4.7.0-12) unstable; urgency=low + + * Update to SVN 20120606 (r188261) from the gcc-4_7-branch (release + candidate 1 or 4.7.1). + - Fix PR libstdc++/52007, PR c++/53524, PR target/53559, + PR middle-end/47530, PR middle-end/53471, PR middle-end/52979, + PR target/46261, PR tree-optimization/53550, PR middle-end/52080, + PR middle-end/52097, PR middle-end/48124, PR middle-end/53501, + PR target/52667, PR target/52642, PR middle-end/48493, PR c++/53524, + PR c++/52973, PR c++/52725, PR c++/53137, PR c++/53484, PR c++/53500, + PR c++/52905, PR fortran/53521. + - Go and libgo updates. + * Include README.Debian in README.Debian.. + * Fix PR c/33763, proposed patch from the issue. Closes: #672411. + * Fix build failure in libgo with hardening defaults. + + -- Matthias Klose Wed, 06 Jun 2012 13:22:27 +0200 + +gcc-4.7 (4.7.0-11) unstable; urgency=low + + * Update to SVN 20120530 (r188035) from the gcc-4_7-branch. + - Fix PR c++/53356, PR c++/53491, PR c++/53503, PR c++/53220, + PR middle-end/53501, PR rtl-optimization/53519, + PR tree-optimization/53516, PR tree-optimization/53438, + PR target/52999, PR middle-end/53008. + + [ Matthias Klose ] + * Build-depend on netbase when building Go. Closes: #674306. + + [ Marcin Juszkiewicz ] + * Use the multiarch default for staged builds. + + -- Matthias Klose Thu, 31 May 2012 08:25:08 +0800 + +gcc-4.7 (4.7.0-10) unstable; urgency=low + + * Update to SVN 20120528 (r187927) from the gcc-4_7-branch. + - Fix PR rtl-optimization/52528, PR lto/52178, PR target/53435, + PR ada/52362, PR target/53385, PR middle-end/53460, + PR tree-optimization/53465, PR target/53448, PR tree-optimization/53408, + PR ada/52362, PR fortran/53389. + * Fix warning building libiberty/md5.c. PR other/53285. Closes: #674830. + + -- Matthias Klose Mon, 28 May 2012 11:30:36 +0800 + +gcc-4.7 (4.7.0-9) unstable; urgency=low + + * Update to SVN 20120522 (r187756) from the gcc-4_7-branch. + - Fix PR bootstrap/53183, PR tree-optimization/53436, + PR tree-optimization/53366, PR tree-optimization/53409, + PR tree-optimization/53410, PR c/53418, PR target/53416, + PR middle-end/52584, PR debug/52727, PR tree-optimization/53364, + PR target/53358, PR rtl-optimization/52804, PR target/46098, + PR target/53256, PR c++/53209, PR c++/53301, PR ada/52494, + PR fortran/53310 + * Update the Linaro support to the 4.7-2012.05 release. + + -- Matthias Klose Tue, 22 May 2012 13:01:33 +0800 + +gcc-4.7 (4.7.0-8) unstable; urgency=low + + * Update to SVN 20120509 (r187339) from the gcc-4_7-branch. + - Fix PR libstdc++/53193, PR target/53272, PR tree-optimization/53239, + PR tree-optimization/53195, PR target/52999, PR target/53228, + PR tree-optimization/52633, PR tree-optimization/52870, PR target/48496, + PR target/53199, PR target/52684, PR lto/52605, PR plugins/53126, + PR debug/53174, PR target/53187, PR tree-optimization/53144, + PR c++/53186, PR fortran/53255, PR fortran/53111, PR fortran/52864. + - Fix plugin check in gcc-{ar,nm,ranlib}-4.7. + * Install man pages for gcc-{ar,nm,ranlib}-4.7. + + -- Matthias Klose Mon, 07 May 2012 21:56:42 +0200 + +gcc-4.7 (4.7.0-7) unstable; urgency=low + + * Update to SVN 20120502 (r187039) from the gcc-4_7-branch. + - Fix PR libstdc++/53115, PR tree-optimization/53163, + PR rtl-optimization/53160, PR middle-end/53136, PR fortran/53148. + - libgo fix for mips. + * Fix setting MULTILIB_DEFAULTS for ARM multilib builds. + * Build Go on mips. + * Revert: Don't build multilib gnat on armel and armhf. + * Fix multiarch patch for alpha (Michael Cree). Closes: #670571. + * Fix Go multilib packaging issue for mips and mipsel. + + -- Matthias Klose Wed, 02 May 2012 12:42:01 +0200 + +gcc-4.7 (4.7.0-6) unstable; urgency=low + + * Update to SVN 20120430 (r186964) from the gcc-4_7-branch. + - Fix PR target/53138. + * Build Go on ARM. + * Treat wheezy the same as sid in more places (Peter Green). + Addresses: #670821. + + -- Matthias Klose Mon, 30 Apr 2012 13:06:21 +0200 + +gcc-4.7 (4.7.0-5) unstable; urgency=medium + + * Update to SVN 20120428 (r186932) from the gcc-4_7-branch. + - Fix PR c/52880, PR target/53065, PR tree-optimization/53085, + PR c/51527, PR target/53120. + + [ Matthias Klose ] + * Don't build multilib gnat on armel and armhf. + * Don't try to run the libstdc++ testsuite if the C++ frontend isn't built. + * Install the unwind-arm-common.h header file. + * Fix ARM biarch package builds. + + [ Aurelien Jarno ] + * Reenable parallel builds on GNU/kFreeBSD. + * Fix libgcc building on MIPS N32/64. Closes: #669858. + * Add libn32gcc1 and lib64gcc1 symbols files on mips and mipsel. + + -- Matthias Klose Sat, 28 Apr 2012 11:59:36 +0200 + +gcc-4.7 (4.7.0-4) unstable; urgency=low + + * Update to SVN 20120424 (r186746) from the gcc-4_7-branch. + - Fix PR libstdc++/52924, PR libstdc++/52591, PR middle-end/52894, + PR testsuite/53046, PR libstdc++/53067, PR libstdc++/53027, + PR libstdc++/52839, PR bootstrap/52840, PR libstdc++/52689, + PR libstdc++/52699, PR libstdc++/52822, PR libstdc++/52942, + PR middle-end/53084, PR middle-end/52999, PR c/53060, + PR tree-optimizations/52891, PR target/53033, PR target/53020, + PR target/52932, PR middle-end/52939, PR tree-optimization/52969, + PR c/52862, PR target/52775, PR tree-optimization/52943, PR c++/53003, + PR c++/38543, PR c++/50830, PR c++/50303, PR c++/52292, PR c++/52380, + PR c++/52465, PR c++/52824, PR c++/52906. + + [ Matthias Klose ] + * Update the Linaro support to the 4.7-2012.04 release. + * Set the ARM hard-float linker path according to the consensus: + http://lists.linaro.org/pipermail/cross-distro/2012-April/000261.html + * Reenable the spu build on ppc64. Closes: #668272. + * Update and reenable the gcc-cloog-dl patch. + + [ Samuel Thibault ] + * ada-s-osinte-gnu.adb.diff, ada-s-osinte-gnu.ads.diff, + ada-s-taprop-gnu.adb.diff, gcc_ada_gcc-interface_Makefile.in.diff: + Add ada support for GNU/Hurd, thanks Svante Signell for the patches + and bootstrap! (Closes: #668426). + + -- Matthias Klose Tue, 24 Apr 2012 08:44:15 +0200 + +gcc-4.7 (4.7.0-3) unstable; urgency=low + + * Update to SVN 20120409 (r186249) from the gcc-4_7-branch. + - Fix PR libitm/52854, PR libstdc++/52476, PR target/52717, + PR tree-optimization/52406, PR c++/52596, PR c++/52796, + PR fortran/52893, PR fortran/52668. + + [ Matthias Klose ] + * Re-add missing dependency on libgcc in gcc-multilib. Closes: #667519. + * Add support for GNU locales for GNU/Hurd (Svante Signell). + Closes: #667662. + * Reenable the spu build on ppc64. Closes: #664617. + * Apply proposed patch for PR52894, stage1 bootstrap failure on hppa + (John David Anglin). Closes: #667969. + + [ Nobuhiro Iwamatsu ] + * Fix cross build targeting sh4. Closes: #663028. + * Enable -mieee by default on sh4. Closes: #665328. + + -- Matthias Klose Mon, 09 Apr 2012 22:24:14 +0200 + +gcc-4.7 (4.7.0-2) unstable; urgency=low + + * Update to SVN 20120403 (r186107) from the gcc-4_7-branch. + - Fix PR middle-end/52547, PR libstdc++/52540, PR libstdc++/52433, + PR target/52507, PR target/52505, PR target/52461, PR target/52508, + PR c/52682, PR target/52610, PR middle-end/52640, PR target/50310, + PR target/48596, PR target/48806, PR middle-end/52547, R target/52496, + PR rtl-optimization/52543, PR target/52461, PR target/52488, + PR target/52499, PR target/52148, PR target/52496, PR target/52484, + PR target/52506, PR target/52505, PR target/52461, PR other/52545, + PR c/52577, PR c++/52487, PR c++/52671, PR c++/52582, PR c++/52521, + PR fortran/52452, PR target/52737, PR target/52698, PR middle-end/52693, + PR middle-end/52691, PR middle-end/52750, PR target/52692, + PR middle-end/51893, PR target/52737, PR target/52736, PR middle-end/52720, + PR c++/52672, PR c++/52718, PR c++/52685, PR c++/52759, PR c++/52743, + PR c++/52746, PR libstdc++/52799, PR libgfortran/52758, + PR middle-end/52580, PR middle-end/52493, PR tree-optimization/52678, + PR tree-optimization/52701, PR tree-optimization/52754, + PR tree-optimization/52835. + + [ Matthias Klose ] + * Update NEWS files for 4.7. + * Include -print-multiarch option in gcc --help output. Closes: #656998. + * Don't build Go on MIPS. + * Update alpha-ieee.diff for 4.7. + * Update gcc-multiarch.diff for sh4 (untested). Closes: #665935. + * Update gcc-multiarch.diff for hppa (untested). Closes: #666162. + * Re-add build dependency on doxygen. + + [ Samuel Thibault ] + * debian/patches/ada-bug564232.diff: Enable on hurd too. + * debian/patches/ada-libgnatprj.diff: Add hurd configuration. + + -- Matthias Klose Tue, 03 Apr 2012 16:30:58 +0200 + +gcc-4.7 (4.7.0-1) unstable; urgency=low + + * GCC 4.7.0 release. + + -- Matthias Klose Fri, 23 Mar 2012 05:44:37 +0100 + +gcc-4.7 (4.7.0~rc2-1) experimental; urgency=low + + * GCC-4.7 release candidate 2 (r185376). + * libgo: Work around parse error of struct timex_ on ARM. + * Update libstdc++6 symbols files. + * Allow building Go from a separate source package. + * Don't configure with --enable-gnu-unique-object on kfreebsd and hurd. + * Include -print-multiarch option in gcc --help output. Closes: #656998. + * Disable Go on mips* (PR go/52586). + + -- Matthias Klose Wed, 14 Mar 2012 15:49:39 +0100 + +gcc-4.7 (4.7.0~rc1-2) experimental; urgency=low + + * Update to SVN 20120310 (r185183) from the gcc-4_6-branch. + * Always configure with --enable-gnu-unique-object. LP: #949805. + * Enable Go for ARM on releases with working getcontext/setcontext. + + -- Matthias Klose Sat, 10 Mar 2012 23:29:45 +0100 + +gcc-4.7 (4.7.0~rc1-1) experimental; urgency=low + + * GCC-4.7 release candidate 1 (r184777). + + [ Marcin Juszkiewicz ] + * Fix ARM sf/hf multilib dpkg-shlibdeps dependency generation. + + [ Matthias Klose ] + * PR go/52218, don't build Go on ARM, getcontext/setcontext exists, + but return ENOSYS. + * Fix multiarch build on ia64. + * Fix path calculation for the libstdc++ -gdb.py file when installed into + multiarch locations. Closes: #661385. LP: #908163. + * Disable Go on sparc (libgo getcontext/setcontext check failing). + + [ Thorsten Glaser ] + * Apply patch from Alan Hourihane to fix err_bad_abi testcase on m68k. + + [ Jonathan Nieder ] + * libstdc++6: Depends on libc (>= 2.11) for STB_GNU_UNIQUE support + (Eugene V. Lyubimkin). Closes: #584572. + * libstdc++6, libobjc2, libgfortran3, libmudflap0, libgomp1: Breaks + pre-multiarch gcc. Closes: #651550. + * libstdc++6: Lower priority from required to important. Closes: #661118. + + [Samuel Thibault] + * Remove local patch, integrated upstream. Closes: ##661859. + + -- Matthias Klose Fri, 02 Mar 2012 18:42:56 +0100 + +gcc-4.7 (4.7-20120210-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20120210 (r184114). + * kbsd-gnu.diff: Remove, integrated upstream. + * Strip whitespace from with_libssp definition. Closes: #653255. + * Remove soft-float symbols from 64bit powerpc libgcc1 symbols files. + * Fix control file generation for cross packages. LP: #913734. + + -- Matthias Klose Fri, 10 Feb 2012 21:38:12 +0100 + +gcc-4.7 (4.7-20120205-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20120205 (r183903). + * Enable Go on arm*, ia64, mips*, powerpc, s390*, sparc*. + * libgo: Fix ioctl macro extracton. + * Fix PR middle-end/52074, ICE in libgo on powerpc. + * Revert: * Install static libc++{98,11} libraries. + * Don't strip a `/' sysroot from the C++ include directories. + Closes: #658442. + + -- Matthias Klose Sun, 05 Feb 2012 09:16:03 +0100 + +gcc-4.7 (4.7-20120129-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20120129 (r183674). + * Configure --with-sysroot for wheezy and sid. + * Install static libc++{98,11} libraries. + * Install libstdc++ gdb.py file into /usr/lib/debug. + * Just copy libstdc++convenience.a for the libstdc++_pic installation. + * Remove trailing dir separator from system root. + + -- Matthias Klose Sun, 29 Jan 2012 08:19:27 +0100 + +gcc-4.7 (4.7-20120121-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20120121 (r183370). + + [ Matthias Klose ] + * Fix C++ include paths when configured --with-system-root. + + [ Marcin Juszkiewicz ] + * Fix control file generation for ARM multiarch cross builds. + + -- Matthias Klose Sat, 21 Jan 2012 20:24:29 +0100 + +gcc-4.7 (4.7-20120107-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20120107 (r182981). + + * On armel/armhf, allow g*-multilib installation using the runtime + libraries of the corresponding multiarch architecture. + * Fix location of .jinfo files. Addresses: #654579. + * Replace Fortran 95 with Fortran in package descriptions. + + -- Matthias Klose Sat, 07 Jan 2012 21:24:56 +0100 + +gcc-4.7 (4.7-20111231-1) experimental; urgency=low + + * GCC-4.7 snapshot build, taken from the trunk 20111231 (r182754). + + [ Aurelien Jarno ] + * Re-enable parallel builds on kfreebsd-i386, as the problem from bug + #637236 only affects kfreebsd-amd64. + + [ Matthias Klose ] + * Fix generating libphobos dependency for gdc. Addresses: #653078. + * Link libmudflapth.so with -lpthread. + + -- Matthias Klose Sat, 31 Dec 2011 09:42:13 +0100 + +gcc-4.7 (4.7-20111222-1) experimental; urgency=low + + * Update to SVN 20111222 (r182617) from the trunk. + + [Matthias Klose] + * Remove obsolete ARM patch. + * Install loongson.h header. + * Update libgcc and libstdc++ symbols files. + + [Samuel Thibault] + * Update hurd patch for 4.7, fixing build failure. Closes: #652693. + + [Robert Millan] + * Update kbsd-gnu.diff for the trunk. + + -- Matthias Klose Thu, 22 Dec 2011 10:52:01 +0100 + +gcc-4.7 (4.7-20111217-2) experimental; urgency=low + + * Don't provide 4.6.x symlinks. + * Disable multilib for armhf. + * Fix spu installation. + + -- Matthias Klose Sun, 18 Dec 2011 17:22:10 +0100 + +gcc-4.7 (4.7-20111217-1) experimental; urgency=low + + * GCC-4.7 snapshot build. + - Including the GFDL documentation; will stay in experimental + until the 4.7.0 release sometime next year. + * Update patches for the trunk. + * Update symbols files. + * Build libitm packages. + + -- Matthias Klose Sat, 17 Dec 2011 23:19:46 +0100 + +gcc-4.6 (4.6.2-9) unstable; urgency=medium + + * Update to SVN 20111217 (r182430) from the gcc-4_6-branch. + - Fix PR c++/51331. + * Fix build dependencies for armel/armhf. + + -- Matthias Klose Sat, 17 Dec 2011 10:40:26 +0100 + +gcc-4.6 (4.6.2-8) unstable; urgency=low + + * Update to SVN 20111216 (r182407) from the gcc-4_6-branch. + - Fix PR tree-optimization/51485, PR tree-optimization/50569, PR c++/51248, + PR c++/51406, PR c++/51161, PR rtl-optimization/49720, PR fortran/50923, + PR fortran/51338, PR fortran/51550, PR fortran/47545, PR fortran/49050, + PR fortran/51075. + + [ Matthias Klose ] + * gdc-4.6: Provide -{gdc,gdmd}-4.6 symlinks. + + [Ludovic Brenta] + Merge from gnat-4.6 (4.6.2-2) unstable; urgency=low + [Євгеній Мещеряков] + * debian/patches/pr47818.diff: new. Fixes: #614402. + * debian/rules.patch: apply it. + + Merge from gnat-4.6 (4.6.2-1) unstable; urgency=low + [Ludovic Brenta] + * Suggest ada-reference-manual-{html,info,pdf,text} instead of just + ada-reference-manual which no longer exists. + * Do not suggest gnat-gdb, superseded by gdb. + * Downgrade libgnat{vsn,prj}4.6-dev to priority extra; they conflict + with their 4.4 counterparts and priority optional packages may not + conflict with one another, per Policy 2.5. + + -- Matthias Klose Fri, 16 Dec 2011 16:59:30 +0100 + +gcc-4.6 (4.6.2-7) unstable; urgency=medium + + * Update to SVN 20111210 (r182189) from the gcc-4_6-branch. + - Fix PR rtl-optimization/51469, PR tree-optimization/51466, + PR tree-optimization/50078, PR target/51408, PR fortran/51310, + PR fortran/51448. + + -- Matthias Klose Sat, 10 Dec 2011 20:12:33 +0100 + +gcc-4.6 (4.6.2-6) unstable; urgency=low + + * Update to SVN 20111208 (r182120) from the gcc-4_6-branch. + - Fix PR c++/51265, PR bootstrap/50888, PR target/51393 (ix86), + PR target/51002 (AVR), PR target/51345 (AVR), PR debug/48190, + PR fortran/50684, PR fortran/51218, PR target/50906 (closes: #650318), + PR tree-optimization/51315 (closes: #635126), PR tree-optimization/50622, + PR fortran/51435, PR debug/51410, PR c/51339, PR rtl-optimization/48721, + PR middle-end/51323 (LP: #897583), PR middle-end/50074, + PR middle-end/50074. + + [ Matthias Klose ] + * Run the libstdc++ testsuite on all architectures again. Closes: #622699. + * Apply proposed patch for PR target/50906 (powerpcspe only). Closes: #650318. + * Fix PR target/49030 (ARM), taken from Linaro. Closes: #633479. + * Fix PR target/50193 (ARM), taken from Linaro. Closes: #642127. + * Install the libstdc++.so-gdb.py file. LP: #883269. + * Fix PR c++/50114, backport from trunk. LP: #827806. + * Merge changes to allow gcc-snapshot cross builds, taken from Linaro. + * Update the Linaro support to the 4.6 branch. + + [ Marcin Juszkiewicz ] + * Fix issues with gcc-snapshot cross builds. + * Allow building Linaro binary packages in a single package. + * Apply hardening patches for cross builds when enabled for native builds. + + -- Matthias Klose Thu, 08 Dec 2011 17:14:35 +0100 + +gcc-4.6 (4.6.2-5) unstable; urgency=low + + * Update to SVN 20111121 (r181596) from the gcc-4_6-branch. + - Fix PR c++/50870, PR c++/50608, PR target/47997, PR target/48108, + PR target/45233, PR middle-end/51077, PR target/30282, PR c++/50608, + PR target/50979, PR target/4810, PR rtl-optimization/51187, + PR target/50493, PR target/49992, PR target/49641, PR c++/51150, + PR target/50678, PR libstdc++/51142, PR libstdc++/51133. + + [ Matthias Klose ] + * Use the default gcc as stage1 compiler for all architectures. + + [ Marcin Juszkiewicz ] + * debian/control.m4: Use BASEDEP in more places. + * Work around debhelper not calling the correct strip for cross builds. + * Drop dpkg-cross build dependency for cross builds. + + -- Matthias Klose Mon, 21 Nov 2011 22:26:49 +0100 + +gcc-4.6 (4.6.2-4) unstable; urgency=low + + * Update to SVN 20111103 (r180830) from the gcc-4_6-branch. + - Fix PR target/50691, PR c++/50901, PR target/50945, + PR rtl-optimization/47918, PR libstdc++/50880. + + * Configure the armel build by explicitly passing --with-arch=armv4t + --with-float=soft. + * libffi: Simplify PowerPC assembly and avoid CPU-specific string + instructions (Kyle Moffett). + * Fix MULTIARCH_DIRNAME on powerpcspe (Kyle Moffett). Closes: #647324. + + -- Matthias Klose Thu, 03 Nov 2011 12:03:41 -0400 + +gcc-4.6 (4.6.2-3) unstable; urgency=low + + * disable parallel builds on kfreebsd-* even if DEB_BUILD_OPTIONS + enables them (continued investigation for #637236). + + -- Ludovic Brenta Sat, 29 Oct 2011 00:42:46 +0200 + +gcc-4.6 (4.6.2-2) unstable; urgency=low + + * Update to SVN 20111028 (r180603) from the gcc-4_6-branch. + - Fix PR target/50875. + + * Fix gcj, gdc and gnat builds, broken by the stage1 cross-compiler + package dependency fixes. + * Update the Linaro support to the 4.6 branch. + * Fix gcc-4.6-hppa64 installation. Closes: #646805. + * For ARM hard float, set the dynamic linker to + /lib/arm-linux-gnueabihf/ld-linux.so.3. + * Don't use parallel builds on kfreebsd. + + -- Matthias Klose Fri, 28 Oct 2011 16:36:55 +0200 + +gcc-4.6 (4.6.2-1) unstable; urgency=low + + * GCC 4.6.2 release. + + * Fix libgcc installation into /usr/lib/gcc//4.6. Closes: #645021. + * Fix stage1 cross-compiler package dependencies (Kyle Moffett). + Closes: #644439. + + -- Matthias Klose Wed, 26 Oct 2011 13:10:44 +0200 + +gcc-4.6 (4.6.1-16) unstable; urgency=medium + + * Update to SVN 20111019 (r180208) from the gcc-4_6-branch. + - Fix PR target/49967 (ia64), PR tree-optimization/50189, PR fortran/50273, + PR tree-optimization/50700, PR c/50565 (closes: #642144), + PR target/49965 (sparc), PR middle-end/49801, PR c++/49216, + PR c++/49855, PR c++/49896, PR c++/44473, PR c++/50611, PR fortran/50659, + PR tree-optimization/50723, PR tree-optimization/50712, PR obj-c++/48275, + PR c++/50618, PR fortran/47023, PR fortran/50570, PR fortran/50718, + PR libobjc/49883, PR libobjc/50002, PR target/50350, PR middle-end/50386, + PR middle-end/50326, PR target/50737, PR c++/50787, PR c++/50531, + PR fortran/50016, PR target/50737. + + [ Matthias Klose ] + * Fix libjava installation into /usr/lib/gcc//4.6. + * Fix powerpc and ppc64 libffi builds (Kyle Moffett). + * Apply proposed patch for PR target/50350. Closes: #642313. + * Re-apply the fix for PR tree-optimization/49911 on ia64. + * Apply proposed patch for PR target/50106 (ARM). + + [Xavier Grave] + * debian/patches/address-clauses-timed-entry-calls.diff: new; backport + bug fix about address clauses and timed entry calls. + + [Ludovic Brenta] + * debian/patches/ada-kfreebsd-gnu.diff: new; provide dummy + implementations of some optional POSIX Threads functions missing in + GNU/kFreeBSD. Closes: #642128. + + -- Matthias Klose Thu, 20 Oct 2011 00:24:13 +0200 + +gcc-4.6 (4.6.1-15) unstable; urgency=low + + * Update to SVN 20111010 (r179753) from the gcc-4_6-branch. + - Fix PR target/50652. + * Update the Linaro support to the 4.6-2011.10-1 release. + * Fix gcc-spu installation. + * Restore symlink for subminor GCC version. Closes: #644849. + + -- Matthias Klose Mon, 10 Oct 2011 17:10:40 +0200 + +gcc-4.6 (4.6.1-14) unstable; urgency=low + + * Update to SVN 20111008 (r179710) from the gcc-4_6-branch. + - Fix PR inline-asm/50571, PR c++/46105, PR c++/50508, PR libstdc++/50529, + PR libstdc++/49559, PR c++/40831, PR fortran/48706, PR target/49049, + PR tree-optimization/49279, PR fortran/50585, PR fortran/50625, + PR libstdc++/48698. + + [ Matthias Klose ] + * Configure and build to install into /usr/lib/gcc//4.6. + Closes: #643891. + * libgcc1: Versioned break to gcc-4.3. + * Fix gcc-multiarch for i386-linux-gnu with disabled multilibs. + * libffi: Fix PowerPC soft-floating-point support (Kyle Moffett). + + [ Marcin Juszkiewicz ] + * Enable gcc-snapshot cross builds. + + [ Iain Buclaw ] + * Port gdc to GCC-4.6. + + [ Aurelien Jarno ] + * Backport fix for PR target/49696 from the trunk (Closes: #633443). + + -- Matthias Klose Sat, 08 Oct 2011 14:40:49 +0200 + +gcc-4.6 (4.6.1-13) unstable; urgency=low + + * Update to SVN 20110926 (r179207) from the gcc-4_6-branch. + - Fix PR tree-optimization/50472, PR tree-optimization/50413, + PR tree-optimization/50412, PR c++/20039, PR c++/42844, + PR libstdc++/50510, PR libstdc++/50509. + * Revert the fix for PR tree-optimization/49911, bootstrap error on ia64. + * libffi: Define FFI_MMAP_EXEC_WRIT on kfreebsd-* (Petr Salinger). + + -- Matthias Klose Mon, 26 Sep 2011 19:59:55 +0200 + +gcc-4.6 (4.6.1-12) unstable; urgency=low + + * Update to SVN 20110924 (r179140) from the gcc-4_6-branch. + - Fix PR target/50464, PR target/50341, PR middle-end/49886, + PR target/50091, PR c++/50491, PR c++/50442 (Closes: #642176). + + -- Matthias Klose Sat, 24 Sep 2011 10:39:32 +0200 + +gcc-4.6 (4.6.1-11) unstable; urgency=low + + * Update to SVN 20110917 (r178926) from the gcc-4_6-branch. + - Fix PR c++/50424, PR c++/48320, PR fortran/49479. + + [ Matthias Klose ] + * Update the Linaro support to the 4.6-2011.09-1 release. + + [ Aurelien Jarno ] + * gcc.c (for_each_path): Allocate memory for multiarch suffix. + + -- Matthias Klose Sat, 17 Sep 2011 10:53:36 +0200 + +gcc-4.6 (4.6.1-10) unstable; urgency=medium + + * Update to SVN 20110910 (r178746) from the gcc-4_6-branch. + - Fix PR middle-end/50266, PR tree-optimization/49911, + PR tree-optimization/49518, PR tree-optimization/49628, + PR tree-optimization/49628, PR target/50310, PR target/50289, + PR c++/50255, PR c++/50309, PR c++/49267, PR libffi/49594. + - Revert fix for PR middle-end/49886, causing PR middle-end/50295. + + -- Matthias Klose Sat, 10 Sep 2011 03:38:48 +0200 + +gcc-4.6 (4.6.1-9) unstable; urgency=low + + * Update to SVN 20110903 (r178501) from the gcc-4_6-branch. + - Fix PR target/50090, PR middle-end/50116, PR target/50202, PR c/50179, + PR c++/50157, PR fortran/50163, PR libfortran/50192, + PR middle-end/49886, PR tree-optimization/50178, PR c++/50207, + PR c++/50089, PR c++/50220, PR c++/50234, PR c++/50224, + PR libstdc++/50268. + + [ Matthias Klose ] + * Fix gcc --print-multilib-osdir for non-biarch architectures. + * Fix multiarch for non-biarch builds. Closes: #635860. + * Move the lto plugin to the cpp packge. Closes: #639531. + + [ Thorsten Glaser ] + * [m68k] Disable multilib. Closes: #639303. + + -- Matthias Klose Sat, 03 Sep 2011 20:11:50 +0200 + +gcc-4.6 (4.6.1-8) unstable; urgency=low + + * Update to SVN 20110824 (r178027) from the gcc-4_6-branch. + Fix PR fortran/49792, PR tree-optimization/48739, PR target/50092, + PR c++/50086, PR c++/50054, PR fortran/50050, PR fortran/50130, + PR fortran/50129, PR fortran/49792, PR fortran/50109, PR c++/50024, + PR c++/46862. + + * Properly disable multilib builds for selected libraries on armel and armhf. + * Update and re-enable the gcc-ice patch. + * Update and re-enable the gcc-cloog-dl patch. + * Fix [ARM] PR target/50090: aliases in libgcc.a with default visibility, + taken from the trunk. + * Re-work the multiarch patches. + * Break older gcj-4.6 and gnat-4.6 versions, changed gcc_lib_dir. + * Omit the target alias from the go libdir. + * Linaro updates from the 4.6-2011.07-stable branch. + * Revert: + - libjava: Build with the system libffi PIC library. + * For native builds, gcc -print-file-name now resolve . and .., + and removes the subminor version number. + + -- Matthias Klose Wed, 24 Aug 2011 10:22:42 +0200 + +gcc-4.6 (4.6.1-7) unstable; urgency=low + + * Update to SVN 20110816 (r177780) from the gcc-4_6-branch. + - Fix PR middle-end/49923. + + [ Matthias Klose ] + * gcc-4.6-multilib: Depend on biarch quadmath library. Closes: #637174. + * Don't hard-code build dependency on gcc-multilib. + * Build-depends on python when building java. + * Fix thinko in java::lang::Class::finalize (taken from the trunk). + * Add support for ARM 64bit sync intrinsics (David Gilbert). Only + enable for armv7 or better. + * libjava: Build with the system libffi PIC library. + * Disable gnat multilib builds on armel and armhf. + + Merge from gnat-4.6 (4.6.1-4) unstable; urgency=low + + [Ludovic Brenta] + * debian/patches/ada-symbolic-tracebacks.diff + (src/gcc/ada/gcc-interface/Makefile.in): pass -iquote instead of -I- + to gnatgcc; fixes FTBFS on i386 and closes: #637418. + + Merge from gnat-4.6 (4.6.1-3) unstable; urgency=low + + [Євгеній Мещеряков] + * debian/patches/ada-mips.diff: do not use the alternate stack on mips, + as on mipsel. Closes: #566234. + + [Ludovic Brenta] + * debian/patches/pr49940.diff: new; copy the definition of function + lwp_self from s-osinte-freebsd.ads to s-osinte-kfreebsd-gnu.ads. + Closes: #636291. + * debian/patches/pr49944.diff: new. Closes: #636692. + * debian/patches/pr49819.diff: drop, merged upstream. + + -- Matthias Klose Tue, 16 Aug 2011 13:11:25 +0200 + +gcc-4.6 (4.6.1-6) unstable; urgency=low + + * Update to SVN 20110807 (r177547) from the gcc-4_6-branch. + - Fix PR rtl-optimization/49799, PR debug/49871, PR target/47364, + PR target/49866, PR tree-optimization/49671, PR target/39386, + PR ada/4981, PR fortran/45586, PR fortran/49791, PR middle-end/49897, + PR middle-end/49898, PR target/49920, PR target/47908 (closes: #635919), + PR c++/43886, PR c++/49593, PR c++/49803, PR c++/49924, PR c++/49260, + PR fortran/49885, PR fortran/48876, PR libstdc++/49925, PR target/50001, + PR tree-optimization/49948, PR c++/48993, PR c++/49921, PR c++/49669, + PR c++/49988, PR fortran/49112. + + [ Aurelien Jarno ] + * Update patches/kbsd-gnu.diff for recent changes. Closes: #635195. + * Add s390x support. + + [ Marcin Juszkiewicz ] + * Fixes for multilib cross builds. LP: #816852, #819147. + + [ Matthias Klose ] + * Fix libgo installation for cross builds. + * Only apply arm-multilib when building for multilib. + + -- Matthias Klose Sun, 07 Aug 2011 18:20:00 +0200 + +gcc-4.6 (4.6.1-5) unstable; urgency=low + + * Update to SVN 20110723 (r176672) from the gcc-4_6-branch. + - Fix PR target/49541, PR tree-optimization/49768, PR middle-end/49675, + PR target/49746, PR middle-end/49732, PR tree-optimization/49725, + PR target/49723, PR target/49541, PR tree-opt/49309, PR c++/49785, + PR ada/48711, PR ada/46350, PR fortran/49648, PR testsuite/49753, + PR tree-optimization/49309, PR tree-optimization/45819, PR target/49600, + PR fortran/49708, PR libstdc++/49293. + * Update the Linaro support to the 4.6-2011.07-0 release. + - Fix PR target/49335. LP: #791327. + * Update gcc-multiarch: + - Add -print-multiarch option. + - Fix library path for non-default multilib(s). + - Handle `.' in MULTILIB_DIRNAMES. + * Add support to build multilib on armel and armhf, only enable it for + Ubuntu/oneiric. LP: #810360. + * cpp-4.6: Add empty multiarch directories for the non-default multilibs, + needed for relative lookups from startfile_prefixes. + * Fix PR c++/49756, backport from trunk. LP: #721378. + * libgcc1: Add breaks to gcc-4.1 and gcc-4.3. Closes: #634821. + * Configure for DEB_TARGET_MULTIARCH defaults. + + -- Matthias Klose Sat, 23 Jul 2011 08:15:50 +0200 + +gcc-4.6 (4.6.1-4) unstable; urgency=low + + * Update to SVN 20110714 (r176280) from the gcc-4_6-branch. + - Fix PR tree-optimization/49094, PR target/39633, PR c++/49672, + PR fortran/49698, PR fortran/49690, PR fortran/49562, PR libfortran/49296, + PR target/49487, PR tree-optimization/49651, PR ada/48711. + + [ Matthias Klose ] + * Build Go on alpha for gcc-snapshot builds. + * For multicore ARM, clear both caches, not just the dcache (proposed + patch by Andrew Haley). + * Fix for PR rtl-optimization/{48830,48808,48792}, taken from the trunk. + LP: #807573. + * Fix PR tree-optimization/49169, optimisations strip the Thumb/ARM mode bit + off function pointers (Richard Sandiford). LP: #721531. + + [ Marcin Juszkiewicz ] + * Define DEB_TARGET_MULTIARCH macro. + * debian/rules2: Macro and configuration consolidation. + + -- Matthias Klose Thu, 14 Jul 2011 19:38:49 +0200 + +gcc-4.6 (4.6.1-3) unstable; urgency=medium + + * Update to SVN 20110709 (r176108) from the gcc-4_6-branch. + - Fix PR target/49335, PR tree-optimization/49618, PR c++/49598, + PR fortran/49479, PR target/49621, PR target/46779, PR target/49660, + PR c/49644, PR debug/49522, PR debug/49522, PR middle-end/49640, + PR c++/48157, PR c/49644, PR fortran/48926. + - Apparently fixes a boost issue. Closes: #632938. + * Apply proposed patch for PR fortran/49690. Closes: #631204. + + * README.Debian: New section 'Former and/or inactive maintainers'. + + -- Matthias Klose Sun, 10 Jul 2011 00:04:34 +0200 + +gcc-4.6 (4.6.1-2) unstable; urgency=medium + + * Update to SVN 20110705 (r175840) from the gcc-4_6-branch. + - Fix PR target/47997, PR c++/49528, PR c++/49440, PR c++/49418, + PR target/44643, PR tree-optimization/49615, PR tree-optimization/49572, + PR target/34734, PR tree-optimization/49539, PR tree-optimizations/49516, + PR target/49089, PR rtl-optimization/49014, PR target/48273, + PR fortran/49466, PR libfortran/49296, PR libffi/46660, PR debug/49262, + PR rtl-optimization/49472, PR rtl-optimization/49619, PR fortran/49623, + PR fortran/49540. + + [Ludovic Brenta, Євгеній Мещеряков, Xavier Grave] + * Adjust patches to GCC 4.6. + * Remove patches merged upstream: + - debian/patches/ada-arm-eabi.diff + - debian/patches/ada-bug589164.diff + - debian/patches/ada-bug601133.diff + - debian/patches/ada-gnatvsn.diff + - debian/patches/ada-mips.diff + - debian/patches/ada-polyorb-dsa.diff + + [Ludovic Brenta] + * debian/patches/ada-acats.diff: set LD_LIBRARY_PATH, ADA_INCLUDE_PATH + and ADA_OBJECTS_PATH so that the GNAT testsuite runs. + * debian/patches/adalibgnat{vsn,prj}.diff, + debian/rules.d/binary-ada.mk: install libgnat{vsn,prj}.so.* in the correct + multiarch directory. + * debian/control.m4, debian/rules.d/binary-ada.mk: move the SJLJ version + of the Ada run-time library to a new package, gnat-4.6-sjlj. + * debian/control.m4 (libgnatvsn4.6, libgnatvsn4.6-dbg, libgnatprj4.6, + libgnatprj4.6-dbg): pre-depend on multiarch-support and add + Multi-Arch: same. + + [Nicolas Boulenguez] + * debian/rules.d/binary-ada.mk: add gnathtml to the package gnat-4.6. + * debian/gnat.1: remove the version number of GCC. Mention gnathtml. + + [ Matthias Klose ] + * Do not install the spu and hppa64 cross compilers into the multiarch path. + * Update the Linaro support to 20110704. + + [ Thorsten Glaser ] + * Apply changes from src:gcc-4.4 for m68k support. Closes: #632380. + - debian/rules.defs: Remove m68k from locale_no_cpus. + - debian/patches/gcc-multiarch.diff: Add m68k multiarch_mappings. + - debian/patches/pr43804.diff: Fix backported from SVN. + - debian/rules.patch: Add pr43804. + + -- Matthias Klose Tue, 05 Jul 2011 10:45:56 +0200 + +gcc-4.6 (4.6.1-1) unstable; urgency=low + + * GCC 4.6.1 release. + + [Ludovic Brenta] + * debian/patches/ada-gnatvsn.diff, + debian/patches/ada-polyorb-dsa.diff: remove backports, no longer + needed. + + [ Matthias Klose ] + * Fix plugin header installation. Closes: #631082. + * Stop passing -Wno-error=unused-but-set-parameter and + -Wno-error=unused-but-set-variable if -Werror is present. + This was a temporary workaround introduced in 4.6.0~rc1-2. Closes: #615157. + * gcc-4.6-spu: Install the lto plugin. Closes: #631772. + + -- Matthias Klose Mon, 27 Jun 2011 13:54:04 +0200 + +gcc-4.6 (4.6.0-14) unstable; urgency=low + + * Update to SVN 20110616 (r175102) from the gcc-4_6-branch. + - Fix PR debug/48459, PR fortran/49103, PR rtl-optimization/49390, + PR c++/49117, PR c++/49369, PR c++/49290, PR target/44618, + PR tree-optimization/49419 (closes: #630567). + * Update the Linaro support to the 4.6-2011.06-0 release. + + -- Matthias Klose Thu, 16 Jun 2011 16:10:33 +0200 + +gcc-4.6 (4.6.0-13) unstable; urgency=low + + * Update to SVN 20110611 (r174958) from the gcc-4_6-branch. + * Extend multiarch support for mips/mipsel. + * Fix control files for gcj multiarch builds. + * Update libstdc++ symbols files. + + -- Matthias Klose Sat, 11 Jun 2011 20:49:42 +0200 + +gcc-4.6 (4.6.0-12) unstable; urgency=medium + + * Update to SVN 20110608 (r174800) from the gcc-4_6-branch. + - PR target/49186, PR rtl-optimization/49235, PR tree-optimization/48702, + PR tree-optimization/49243, PR c++/49134, PR target/49238, + PR gcov-profile/49299, PR c++/48780, PR c++/49298, PR fortran/49268. + * Fix c++ biarch header installation on i386. LP: #793411. + * Enable multiarch. + * Add multiarch attributes for gnat and libgnat packages. + * Add multiarch attributes for libgcj* packages. + * Adjust build dependency on multiarch glibc. + + -- Matthias Klose Wed, 08 Jun 2011 11:26:52 +0200 + +gcc-4.6 (4.6.0-11) unstable; urgency=low + + * Update to SVN 20110604 (r174637) from the gcc-4_6-branch. + - Fix PR c++/49165, PR tree-optimization/49218, PR target/45263, + PR target/43700, PR target/43995, PR tree-optimization/49217, + PR c++/49223, PR c++/47049, PR c++/47277, PR c++/48284, PR c++/48657, + PR c++/49176, PR fortran/48955, PR tree-optimization/49038, + PR tree-optimization/49093, PR middle-end/48985, PR middle-end/48953, + PR c++/49276, PR fortran/49265, PR fortran/45786. + * Configure the hppa64 and spu cross builds with --enable-plugin. + + -- Matthias Klose Sat, 04 Jun 2011 16:12:27 +0200 + +gcc-4.6 (4.6.0-10) unstable; urgency=high + + * Update to SVN 20110526 (r174290) from the gcc-4_6-branch. + - Fix PR target/44643, PR c++/49165, PR tree-optimization/49161, + PR target/49128, PR tree-optimization/44897, PR target/49133, + PR c++/44994, PR c++/49156, PR c++/45401, PR c++/44311, PR c++/44311, + PR c++/45698, PR c++/46145, PR c++/46245, PR c++/46696, PR c++/47184, + PR c++/48935, PR c++/45418, PR c++/45080, PR c++/48292, PR c++/49136, + PR c++/49042, PR c++/48884, PR c++/49105, PR c++/47263, PR c++/47336, + PR c++/47544, PR c++/48617, PR c++/48424, PR libstdc++/49141, + PR libobjc/48177. + * Proposed fix for PR tree-optimization/48702, PR tree-optimization/49144. + Closes: #627795. + * Proposed fix for PR fortran/PR48955. + * Add some conditionals to build the package on older releases. + + -- Matthias Klose Thu, 26 May 2011 16:00:49 +0200 + +gcc-4.6 (4.6.0-9) unstable; urgency=low + + * Update to SVN 20110524 (r174102) from the gcc-4_6-branch. + - Fix PR lto/49123, PR debug/49032, PR c/49120, PR middle-end/48973, + PR target/49104, PR middle-end/49029, PR c++/48647, PR c++/48945, + PR c++/48780, PR c++/49066, PR libstdc++/49058, PR target/49104. + * Use gcc-4.4 as the bootstrap compiler for kfreebsd to work around + a bootstrap issue. + + -- Matthias Klose Tue, 24 May 2011 09:41:35 +0200 + +gcc-4.6 (4.6.0-8) unstable; urgency=low + + * Update to SVN 20110521 (r173994) from the gcc-4_6-branch. + - Fix PR target/48986, PR preprocessor/48677, PR tree-optimization/48975, + PR tree-optimization/48822, PR debug/48967, PR debug/48159, + PR target/48857, PR target/48495, PR tree-optimization/48837, + PR tree-optimization/48611, PR tree-optimization/48794, PR c++/48859, + PR c++/48574, PR fortran/48889, PR target/49002, PR lto/48207, + PR tree-optimization/49039, PR tree-optimization/49018, PR lto/48703, + PR tree-optimization/48172, PR tree-optimization/48172, PR c++/48873, + PR tree-optimization/49000, PR c++/48869, PR c++/49043, PR c++/49082, + PR c++/48948, PR c++/48745, PR c++/48736, PR bootstrap/49086, + PR tree-optimization/49079, PR tree-optimization/49073. + * Update the Linaro support to the 4.6-2011.05-0 release. + * pr45979.diff: Update to the version from the trunk. + + -- Matthias Klose Sat, 21 May 2011 12:19:10 +0200 + +gcc-4.6 (4.6.0-7) unstable; urgency=low + + * Update to SVN 20110507 (r173528) from the gcc-4_6-branch. + - Fix PR middle-end/48597, PR c++/48656, PR fortran/48112, + PR fortran/48279, PR fortran/48788, PR tree-optimization/48809, + PR target/48262, PR fortran/48462, PR fortran/48746, + PR fortran/48810, PR fortran/48800, PR libstdc++/48760, + PR libgfortran/48030, PR preprocessor/48192, PR lto/48846, + PR target/48723, PR fortran/48894, PR target/48900, PR target/48252, + PR c++/40975, PR target/48252, PR target/48774, PR c++/48838, + PR c++/48749, PR ada/48844, PR fortran/48720, PR libstdc++/48750, + PR c++/48909, PR c++/48911, PR c++/48446, PR c++/48089. + + * Fix issue with volatile bitfields vs. inline asm memory constraints, + taken from the trunk, apply for ARM only. Addresses: #625825. + + -- Matthias Klose Sat, 07 May 2011 14:54:51 +0200 + +gcc-4.6 (4.6.0-6) unstable; urgency=low + + * Update to SVN 20110428 (r173059) from the gcc-4_6-branch. + - Fix PR c/48685 (closes: #623161), PR tree-optimization/48717, PR c/48716, + PR c/48742, PR debug/48768, PR tree-optimization/48734, + PR tree-optimization/48731, PR other/48748, PR c++/42687, PR c++/48726, + PR c++/48707, PR fortran/48588, PR libstdc++/48521, PR c++/48046, + PR preprocessor/48740. + * Update the ibm/gcc-4_6-branch to 20110428. + * Use gcc-4.6 as bootstrap compiler on kfreebsd-*. + + -- Matthias Klose Thu, 28 Apr 2011 10:33:52 +0200 + +gcc-4.6 (4.6.0-5) unstable; urgency=low + + * Update to SVN 20110421 (r172845) from the gcc-4_6-branch. + - Fix PR target/48288, PR tree-optimization/48611, PR lto/48148, + PR lto/48492, PR fortran/47976, PR c++/48594, PR c++/48657, + PR c++/46304, PR target/48708, PR middle-end/48695. + + * Update the Linaro support to the 4.6-2011.04-0 release. + + -- Matthias Klose Thu, 21 Apr 2011 22:50:25 +0200 + +gcc-4.6 (4.6.0-4) unstable; urgency=medium + + * Update to SVN 20110419 (r172584) from the gcc-4_6-branch. + - Fix PR target/48678, PR middle-end/48661, PR tree-optimization/48616, + PR lto/48538, PR c++/48537, PR c++/48632, PR testsuite/48675, + PR libstdc++/48635, PR libfortran/47571. + + [ Aurelien Jarno ] + * Enable SSP on mips/mipsel. + + [ Matthias Klose ] + * (Build-)depend on binutils 2.21.51. + + -- Matthias Klose Tue, 19 Apr 2011 23:45:16 +0200 + +gcc-4.6 (4.6.0-3) unstable; urgency=high + + * Update to SVN 20110416 (r172584) from the gcc-4_6-branch. + - Fix PR rtl-optimization/48143, PR target/48142, PR target/48349, + PR debug/48253, PR fortran/48291, PR target/16292, PR c++/48280, + PR c++/48212, PR c++/48369, PR c++/48281, PR c++/48265, PR lto/48246, + PR libstdc++/48398, PR bootstrap/48431, PR tree-optimization/48377, + PR debug/48343, PR rtl-optimization/48144, PR debug/48466, PR c/48517, + PR middle-end/48335, PR c++/48450, PR target/47829, PR c++/48534, + PR c++/48523, PR libstdc++/48566, PR libstdc++/48541, PR target/48366, + PR libstdc++/48465, PR middle-end/48591, PR target/48605, + PR middle-end/48591, PR target/48090, PR tree-optimization/48195, + PR rtl-optimization/48549, PR c++/48594, PR c++/48570, PR c++/48574, + PR fortran/48360, PR fortran/48456, PR libstdc++/48631, + PR libstdc++/48635, PR libstdc++/48476. + + [ Matthias Klose ] + * libjava-jnipath.diff: Add /usr/lib//jni as jnipath too. + * Add mudflap support for varargs (patch taken from the trunk). + * gcc-4.6-plugin-dev: Install gtype.state. + * Bootstrap with gcc-4.4 -g -O2 on armel. + * Fix linker plugin configuration. Closes: #620661. + * Update the Linaro support for GCC-4.6. + * gcc-snapshot builds: + - Fix build with multiarch changes. + - Use gcc-snapshot as the bootstrap compiler on armel. + - Re-enable building java in the gcc-snapshot package. + * Build supporting multiarch on wheezy/sid. + * Adjust (build)-dependency to new libgmp-dev name. + + [ Marcin Juszkiewicz ] + * Configure stage1 cross builds with --disable-libquadmath. + + -- Matthias Klose Sat, 16 Apr 2011 17:02:30 +0200 + +gcc-4.6 (4.6.0-2) unstable; urgency=low + + * Update to SVN 20110329 (r171700) from the gcc-4_6-branch. + - Fix PR bootstrap/48135, PR target/47553, PR middle-end/48269, + PR tree-optimization/48228, PR middle-end/48134, PR middle-end/48031, + PR other/48179, PR other/48221, PR other/48234, PR target/48237, + PR debug/48204, PR c/42544, PR c/48197, PR rtl-optimization/48141, + PR rtl-optimization/48141, PR c++/48166, PR c++/48296, PR c++/48289, + PR c++/47999, PR c++/48313, Core 1232, Core 1148, PR c++/47504, + PR c++/47570, PR preprocessor/48248, PR c++/48319. + + [ Matthias Klose ] + * Update NEWS files. + * Configure the hppa64 cross build with --disable-libquadmath. + * Don't build armhf from the Linaro branch. + * Don't try to build Go on sh4. + + [ Marcin Juszkiewicz ] + * Fixes issues with staged cross builds. LP: #741855, #741853. + * Fix libdir setting for multiarch enabled cross builds. LP: #741846. + * Drop alternatives for cross builds. LP: #676454. + + -- Matthias Klose Tue, 29 Mar 2011 23:22:07 +0200 + +gcc-4.6 (4.6.0-1) unstable; urgency=low + + * GCC 4.6.0 release. + + * Build the gold LTO plugin for ppc64 (Hiroyuki Yamamoto). Closes: #618865. + * Fix PR target/48226, Allow Iterator::vector vector on powerpc with VSX, + taken from the trunk. + * Fix PR target/47487 ICE building libgo, taken from the trunk. + * Merge multiarch changes from the gcc-4.5 package. + * Apply proposed patch to reduce the overhead of dwarf2 location tracking. + Addresses: #618748. + + -- Matthias Klose Sat, 26 Mar 2011 03:03:21 +0100 + +gcc-4.6 (4.6.0~rc1-3) experimental; urgency=low + + * GCC 4.6.0 release candidate 2. + + -- Matthias Klose Tue, 22 Mar 2011 22:11:42 +0100 + +gcc-4.6 (4.6.0~rc1-2) experimental; urgency=low + + [ Loic Minier ] + * Rework config/vxworks-dummy.h installation snippet to test + DEB_TARGET_GNU_CPU against patterns close to the upstream ones (arm% mips% + sh% sparc%) as to also install this header on other ports targetting the + relevant upstream CPUs such as armhf. Add a comment pointing at the + upstream bug. + * Update __aeabi symbol handling to test whether DEB_TARGET_GNU_TYPE matches + arm-linux-gnueabi% instead of testing whether DEB_TARGET_ARCH equals + armel. Add a comment pointing at the Debian bug and indicating that this + is only useful for older dpkg-dev versions. + * debian/rules.def: fix "armel" entry to "arm" in list of + DEB_TARGET_ARCH_CPUs for Debian experimental GCC 4.5/4.6 libraries. + * debian/rules2: drop commented out GCC #42509 workaround as this was fixed + upstream in 4.4+. + * Change bogus DEB_TARGET_GNU_CPU test on armel and armhf to just test for + arm as ths is what the Debian arm, armel and armhf port use. + * Rework snippet setting armv7 on Debian armhf / Ubuntu to avoid + duplication, as a comment called out for. + * Use "arm" instead of armel/armhf in DEB_TARGET_GNU_CPU test when deciding + whether to enable profiledbootstrap. + * Set DEJAGNU_TIMEOUT=600 on Ubuntu armhf as well. + * Fix a couple more uses of armel or armhf against DEB_TARGET_GNU_CPU. + * Patched a couple of comments mentioning armel to also mention armhf. + * Add patch armhf-triplet-backport, support for arm-linux-*eabi* backported + from a patch sent on the upstream mailing-list. + + [ Matthias Klose ] + * Update libstdc++ symbols files. + * Update libgfortran symbols files. + + -- Matthias Klose Sun, 20 Mar 2011 13:53:48 +0100 + +gcc-4.6 (4.6.0~rc1-2) experimental; urgency=low + + * Update to SVN 20110320 (r171192) from the gcc-4_6-branch. + + [ Matthias Klose ] + * Update gcc-default-ssp* patches for the release candidate. + * Pass -Wno-error=unused-but-set-parameter if -Werror is present (temporary + for rebuild tests). + * Always configure --with-plugin-ld, always install liblto_plugin.so. + + [ Marcin Juszkiewicz ] + * Add conflicts with -4.5-*dev packages. Closes: #618450. + + [ Petr Salinger] + * Disable lock-2.c test on kfreebsd-*. Closes: #618988. + * Re-enable parallel builds on kfreebsd. + * Package lto_plugin for kfreebsd-* and Hurd. + + -- Matthias Klose Sun, 20 Mar 2011 13:53:48 +0100 + +gcc-4.6 (4.6.0~rc1-1) experimental; urgency=low + + * Build from the GCC 4.6.0 release candidate tarball. + + [ Matthias Klose ] + * Disable Go on powerpc. Closes: #615827. + * Fix lintian errors for the -plugin-dev package. + * Update kbsd-gnu.diff (Petr Salinger). Closes: #615826. + * Disable parallel builds on kfreebsd (Petr Salinger). + * Update gmp (build) dependencies. + * Update GFDL compliant builds. Closes: #609161. + * For GFDL compliant builds, build a dummy s-tm-texi without access + to the texinfo sources. + + [ Aurelien Jarno ] + * Import symbol files for kfreebsd-amd64, kfreebsd-i386, sh4 and + sparc64 from gcc-4.5. + + -- Matthias Klose Mon, 14 Mar 2011 19:01:08 +0100 + +gcc-4.6 (4.6-20110227-1) experimental; urgency=low + + [ Matthias Klose ] + * Update libquadmath symbols file. + * gcc-4.6-plugin-dev: Install gengtype. + + [ Sebastian Andrzej Siewior ] + * Remove -many on powerpcspe (__SPE__). + * Remove classic FPU opcodes from libgcc if target has no support for them + (powerpcspe). + + -- Matthias Klose Sun, 27 Feb 2011 22:33:45 +0100 + +gcc-4.6 (4.6-20110216-1) experimental; urgency=low + + * GCC snapshot, taken from the trunk. + * Pass --no-add-needed by default to the linker. See + http://wiki.debian.org/ToolChain/DSOLinking, section "Not resolving symbols + in indirect dependent shared libraries" for more information. + + -- Matthias Klose Wed, 16 Feb 2011 23:55:32 +0100 + +gcc-4.6 (4.6-20110125-1) experimental; urgency=low + + * debian/copyright: Add unicode copyright for + libjava/classpath/resource/gnu/java/locale/* files. Addresses: #609161. + + -- Matthias Klose Wed, 26 Jan 2011 03:42:10 +0100 + +gcc-4.6 (4.6-20110123-1) experimental; urgency=low + + * GCC snapshot, taken from the trunk. + * Don't run the libstdc++ testsuite on mipsel, times out on the buildd. + + [ Marcin Juszkiewicz ] + * Fix biarch/triarch cross builds. + - dpkg-shlibdeps failed to find libraries for 64 or n32 builds + - LD_LIBRARY_PATH for dpkg-shlibdeps lacked host dirs. + + -- Matthias Klose Sun, 23 Jan 2011 12:14:49 +0100 + +gcc-4.6 (4.6-20110116-1) experimental; urgency=low + + * GCC snapshot, taken from the trunk. + * Update patches for the trunk. + * Pass -Wno-error=unused-but-set-variable if -Werror is present (temporary + for rebuild tests). + * Work around PR libffi/47248, force a read only eh frame section. + + -- Matthias Klose Sun, 16 Jan 2011 23:28:28 +0100 + +gcc-4.6 (4.6-20110105-1) experimental; urgency=low + + [ Matthias Klose ] + * Rename and update libobjc symbols files. + * Update cloog/ppl build dependencies. + * Adjust libstdc++ configure and paths for stylesheets and dtds. + * Update copyright for libquadmath, libgo, gcc/go/gofrontend. + * Enable Go for more architectures. + * DP: libgo: Fix GOARCH for i386 biarch, add GOARCH for powerpc + + [ Kees Cook ] + * Update hardening patches for GCC-4.6. LP: #696990. + + -- Matthias Klose Wed, 05 Jan 2011 22:29:57 +0100 + +gcc-4.6 (4.6-20101220-1) maverick; urgency=low + + * GCC snapshot, taken from the trunk. + + -- Matthias Klose Tue, 21 Dec 2010 00:16:19 +0100 + +gcc-4.5 (4.5.2-7) unstable; urgency=low + + * Update to SVN 20110323 (r171351) from the gcc-4_5-branch. + - Fix PR c++/47125, PR fortran/47348, PR libstdc++/48114, + PR libfortran/48066, PR target/48171, PR target/47862. + PR preprocessor/48192. + + [ Steve Langasek ] + * Make dpkg-dev versioned build-dependency conditional on whether we want + to build for multiarch. + * Add a new patch, gcc-multiarch+biarch.diff, used only when building for + multiarch to set our multilib paths to the correct relative directories. + * debian/rules.defs: support turning on multiarch build by architecture; + but don't enable this yet, we still need to wait for dpkg-dev. + * When DEB_HOST_MULTIARCH is available (i.e., with the next dpkg upload), + use it as our multiarch path. + * debian/rules.d/binary-java.mk: jvm-exports path is /usr/lib/jvm-exports, + not $(libdir)/jvm-exports. + * OTOH, libgcj_bc *is* in $(libdir). + * the spu build is not a multiarch build; look in the correct + non-multiarch directory. + * debian/rules2: pass --libdir also for stageX builds, needed in order to + successfully build for multiarch. + * debian/rules2: $(usr_lib) for a cross-build should not include the + multiarch dir as part of the path. + * debian/patches/gcc-multiarch+biarch.diff: restore the original intent of + the patch, namely, that the multilib dir for the default variant is + always equal to libdir (the multiarch dir), and we walk up the tree + to find lib for the secondary variant. + * debian/patches/gcc-multiarch+biarch32.diff: apply the same multilib + directory rewriting for biarch paths with multiarch as we do without; + still needed in the near term. + * Put our list of patches in README.Debian.$(DEB_TARGET_ARCH) instead of + in README.Debian, so that the individual files are architecture-neutral + and play nicely with multiarch. LP: #737846. + * Add a comment at the bottom of README.Debian with a pointer to the new + file listing the patches. + + [ Loic Minier ] + * Rework config/vxworks-dummy.h installation snippet to test + DEB_TARGET_GNU_CPU against patterns close to the upstream ones (arm% mips% + sh% sparc%) as to also install this header on other ports targetting the + relevant upstream CPUs such as armhf. Add a comment pointing at the + upstream bug. + * Update __aeabi symbol handling to test whether DEB_TARGET_GNU_TYPE matches + arm-linux-gnueabi% instead of testing whether DEB_TARGET_ARCH equals + armel. Add a comment pointing at the Debian bug and indicating that this + is only useful for older dpkg-dev versions. + * debian/rules.def: fix "armel" entry to "arm" in list of + DEB_TARGET_ARCH_CPUs for Debian experimental GCC 4.5/4.6 libraries. + * debian/rules2: drop commented out GCC #42509 workaround as this was fixed + upstream in 4.4+. + * Change bogus DEB_TARGET_GNU_CPU test on armel and armhf to just test for + arm as ths is what the Debian arm, armel and armhf port use. + * Rework snippet setting armv7 on Debian armhf / Ubuntu to avoid + duplication, as a comment called out for. + * Use "arm" instead of armel/armhf in DEB_TARGET_GNU_CPU test when deciding + whether to enable profiledbootstrap. + * Set DEJAGNU_TIMEOUT=600 on Ubuntu armhf as well. + * Fix a couple more uses of armel or armhf against DEB_TARGET_GNU_CPU. + * Patched a couple of comments mentioning armel to also mention armhf. + * Add patch armhf-triplet-backport, support for arm-linux-*eabi* backported + from a patch sent on the upstream mailing-list. + + [ Matthias Klose ] + * Fix PR target/48226, Allow Iterator::vector vector on powerpc with VSX, + taken from the trunk. + * Fix PR preprocessor/48192, make conditional macros not defined for + #ifdef, proposed patch. + * Build the gold LTO plugin for ppc64 (Hiroyuki Yamamoto). Closes: #618864. + * Fix issue with volatile bitfields, default to -fstrict-volatile-bitfields + again on armel for Linaro builds. LP: #675347. + + -- Matthias Klose Wed, 23 Mar 2011 15:44:01 +0100 + +gcc-4.5 (4.5.2-6) unstable; urgency=low + + * Update to SVN 20110312 (r170895) from the gcc-4_5-branch. + - Fix PR tree-optimization/45967, PR tree-optimization/47278, + PR target/47862, PR c++/44629, PR c++/45651, PR c++/47289, PR c++/47705, + PR c++/47488, PR libgfortran/47778, PR c++/48029. + + [ Steve Langasek ] + * Make sure our libs Pre-Depend on 'multiarch-support' when building for + multiarch. + * debian/patches/gcc-multiarch*, debian/rules.patch: use i386 in the + multiarch path for amd64 / kfreebsd-amd64, not i486 or i686. This lets + us use a common set of paths on both Debian and Ubuntu, regardless of + the target default optimization level. + * debian/rules.conf: when building for multiarch, we need to be sure we + are building against a libc-dev that supports the corresponding paths. + (the referenced version number for this needs to be bumped once this is + officially in the archive.) + + [ Matthias Klose ] + * Don't run the libmudflap testsuite on hppa; times out on the buildd. + * Don't run the libstdc++ testsuite on mipsel; times out on the buildd. + * Post Linaro 4.5-2011.03-0 release changes (up to 20110313). + * Undefine LINK_EH_SPEC before redefining it to turn off warnings on + powerpc. + * Update gmp (build) dependencies. + + [ Aurelien Jarno ] + * Add symbol files on kfreebsd-i386. + * Add symbol files on kfreebsd-amd64. + * Add symbol files on sparc64. + * Add symbol files on sh4. + + -- Matthias Klose Sun, 13 Mar 2011 17:30:48 +0100 + +gcc-4.5 (4.5.2-5) unstable; urgency=low + + * Update to SVN 20110305 (r170696) from the gcc-4_5-branch. + - Fix PR target/43810, PR fortran/47886, PR tree-optimization/47615, + PR middle-end/47639, PR tree-optimization/47890, PR libfortran/47830, + PR tree-optimization/46723, PR target/45261, PR target/45808, + PR c++/46159, PR c++/47904, PR fortran/47886, PR libstdc++/47433, + PR target/42240, PR fortran/47878, PR libfortran/47694. + * Update the Linaro support to the 4.5-2011.03-0 release. + - Fix LP: #705689, LP: #695302, LP: #710652, LP: #710623, LP: #721021, + LP: #721021, LP: #709453. + + -- Matthias Klose Sun, 06 Mar 2011 02:58:01 +0100 + +gcc-4.5 (4.5.2-4) unstable; urgency=low + + * Update to SVN 20110222 (r170382) from the gcc-4_5-branch. + - Fix PR target/43653, PR fortran/47775, PR target/47840, + PR libfortran/47830. + + [ Matthias Klose ] + * Don't apply a patch twice. + * Build libgcc_s with -fno-stack-protector, when not building from the + Linaro branch. + * Backport proposed fix for PR tree-optimization/46723 from the trunk. + + [ Steve Langasek ] + * debian/control.m4: add missing Multi-Arch: same for libgcc4; make sure + Multi-Arch: same doesn't get set for libmudflap when building an + Architecture: all cross-compiler package. + * debian/rules2: use $libdir for libiberty.a. + * debian/patches/gcc-multiarch-*.diff: make sure we're using the same + set_multiarch_path definition for all variants. + + [ Sebastian Andrzej Siewior ] + * PR target/44364 + * Remove -many on powerpcspe (__SPE__) + * Remove classic FPU opcodes from libgcc if target has no support for them + (powerpcspe) + + -- Matthias Klose Wed, 23 Feb 2011 00:35:54 +0100 + +gcc-4.5 (4.5.2-3) experimental; urgency=low + + * Update to SVN 20110215 (r170181) from the gcc-4_5-branch. + - Fix PR rtl-optimization/44469, PR tree-optimization/47411, + PR bootstrap/44699, PR target/44392, PR fortran/47331, PR fortran/47448, + PR pch/14940, PR rtl-optimization/47166, PR target/47272, PR target/47580, + PR tree-optimization/47541, PR target/44606, PR boehm-gc/34544, + PR fortran/47569, PR libstdc++/47709, PR libstdc++/46914, PR libffi/46661. + * Update the Linaro support to the 4.5 2011.02-0 release. + * Pass --no-add-needed by default to the linker. See + http://wiki.debian.org/ToolChain/DSOLinking, section "Not resolving symbols + in indirect dependent shared libraries" for more information. + + -- Matthias Klose Wed, 16 Feb 2011 15:29:26 +0100 + +gcc-4.5 (4.5.2-2) experimental; urgency=low + + * Update to SVN 20110123 (r169142) from the gcc-4_5-branch. + - Fix PR target/46915, PR target/46729, PR libgcj/46774, PR target/47038, + PR target/46685, PR target/45447, PR tree-optimization/46758, + PR tree-optimization/45552, PR tree-optimization/43023, + PR middle-end/46734, PR fortran/45338, PR preprocessor/39213, + PR target/43309, PR fortran/46874, PR tree-optimization/47286, + PR tree-optimization/44592, PR target/47201, PR c/47150, PR target/46880, + PR middle-end/45852, PR tree-optimization/43655, PR debug/46893, + PR rtl-optimization/46804, PR rtl-optimization/46865, PR target/41082, + PR tree-optimization/46864, PR fortran/45777, PR tree-optimization/47365, + PR tree-optimization/47167, PR target/47318, PR target/46655, + PR fortran/47394, PR libstdc++/47354. + + [ Matthias Klose ] + * Update the Linaro support to the 4.5 2011.01-1 release. + * Don't build packages now built from the gcc-4.6 package for architectures + with a sucessful gcc-4.6 build. + + [ Kees Cook ] + * debian/patches/gcc-default-ssp.patch: do not ignore -fstack-protector-all + (LP: #691722). + + [ Marcin Juszkiewicz ] + * Fix biarch/triarch cross builds. + - dpkg-shlibdeps failed to find libraries for 64 or n32 builds + - LD_LIBRARY_PATH for dpkg-shlibdeps lacked host dirs. + + -- Matthias Klose Sun, 23 Jan 2011 11:54:52 +0100 + +gcc-4.5 (4.5.2-1) experimental; urgency=low + + * GCC 4.5.2 release. + + -- Matthias Klose Sat, 18 Dec 2010 14:14:38 +0100 + +gcc-4.5 (4.5.1-12) experimental; urgency=low + + * Update to SVN 20101129 (r167272) from the gcc-4_5-branch. + - Fix PR fortran/45742, PR tree-optimization/46498, PR target/45807, + PR target/44266, PR rtl-optimization/46315, PR tree-optimization/44545, + PR tree-optimization/46491, PR rtl-optimization/46571, PR target/31100, + PR c/46547, PR fortran/46638, PR tree-optimization/46675, PR debug/46258, + PR ada/40777. + + [ Matthias Klose ] + * Use lib instead of lib64 as the 64bit system dir on biarch + architectures defaulting to 64bit. Closes: #603597. + * Fix powerpc and s390 builds when biarch is disabled. + * Backport PR bootstrap/44768, miscompilation of dpkg on ARM + with -O2 (Chung-Lin Tang). LP: #674146. + * Update libgcc2 symbols file. Closes: #602099. + + [ Marcin Juszkiewicz ] + * Do not depend on target mpfr and zlib -dev packages for cross builds. + LP: #676027. + + [ Konstantinos Margaritis ] + * Add support for new target architecture `armhf'. Closes: #603948. + + -- Matthias Klose Mon, 22 Nov 2010 08:12:08 +0100 + +gcc-4.5 (4.5.1-11) experimental; urgency=low + + * Update to SVN 20101114 (r166728) from the gcc-4_5-branch. + - Fix PR fortran/45742. + * Don't hardcode debian/patches when referencing patches. Closes: #600502. + + -- Matthias Klose Sun, 14 Nov 2010 08:36:27 +0100 + +gcc-4.5 (4.5.1-10) experimental; urgency=low + + * Update to SVN 20101112 (r166653) from the gcc-4_5-branch. + - Fix PR rtl-optimization/44691, PR tree-optimization/46355, + PR tree-optimization/46177, PR c/44772, PR tree-optimization/46099, + PR middle-end/43690, PR tree-optimization/46165, PR middle-end/46419, + PR tree-optimization/46107, PR tree-optimization/45314, PR debug/45939, + PR rtl-optimization/46237, PR middle-end/44569, PR middle-end/44569, + PR tree-optimization/45902, PR target/46153, PR rtl-optimization/46226, + PR tree-optimization/46167, PR target/46098, PR target/45946, + PR fortran/42169, PR middle-end/46019, PR c/45969, PR c++/45894, + PR c++/46160, PR c++/45983, PR fortran/46152, PR fortran/46140, + PR libstdc++/45999, PR libgfortran/46373, PR libgfortran/46010, + PR fortran/46007, PR c++/46024. + * Update the Linaro support to the 4.5 2010.11 release. + * Update gcc-4.5 source dependencies. Closes: #600503. + * ARM: Fix Thumb-1 reload ICE with nested functions (Julian Brown), + taken from the trunk. + * Fix earlyclobbers on some arm.md DImode shifts (may miscompile "x >> 1"), + taken from the trunk. Closes: #600888. + + -- Matthias Klose Fri, 12 Nov 2010 18:34:47 +0100 + +gcc-4.5 (4.5.1-9) experimental; urgency=low + + * Update to SVN 20101014 (r165474) from the gcc-4_5-branch. + - Fix PR target/45820, PR tree-optimization/45854, PR target/45843, + PR target/43764, PR rtl-optimization/43358, PR bootstrap/44621, + PR libffi/45677, PR middle-end/45869, PR middle-end/45569, + PR tree-optimization/45752, PR fortran/45748, PR libstdc++/45403, + PR libstdc++/45924, PR libfortran/45710, PR bootstrap/44455, + PR java/43839, PR debug/45656, PR debug/44832, PR libstdc++/45711, + PR tree-optimization/45982. + + [ Matthias Klose ] + * Update the Linaro support to the 4.5 2010.10 release. + * Just try to build java on mips/mipsel (was disabled in 4.5.0-9, when + java was built from the same source package). Addresses: #599976. + * Remove the gpc packaging support. + * Fix libmudflap.so symlink. Addresses: #600161. + * Fix pch test failures with heap randomization on armel (PR pch/45979). + + [ Kees Cook ] + * Don't enable -fstack-protector with -ffreestanding. + + -- Matthias Klose Thu, 14 Oct 2010 19:17:41 +0200 + +gcc-4.5 (4.5.1-8) experimental; urgency=low + + * Update to SVN 20100925 (r164618) from the gcc-4_5-branch. + - Fix PR middle-end/44763, PR java/44095, PR target/35664, + PR rtl-optimization/41085, PR rtl-optimization/45051, + PR target/45694, PR middle-end/45678, PR middle-end/45678, + PR middle-end/45704, PR rtl-optimization/45728, PR libfortran/45532, + PR rtl-optimization/45695, PR rtl-optimization/42775, PR target/45726, + PR tree-optimization/45623, PR tree-optimization/45709, PR debug/43628, + PR tree-optimization/45709, PR rtl-optimization/45593, PR fortran/45081, + * Find 32bit system libraries on sparc64, s390x. + * Remove README.Debian from the source package to avoid confusion for + readers of the packaging. + * Don't include info files and man pages in hppa64 and spu builds. + Closes: #597435. + * Apply proposed patch for PR mudflap/24619 (instrumentation of dlopen) + (Brian M. Carlson) Closes: #507514. + + -- Matthias Klose Sat, 25 Sep 2010 14:11:39 +0200 + +gcc-4.5 (4.5.1-7) experimental; urgency=low + + * Update to SVN 20100914 (r164279) from the gcc-4_5-branch. + - Fix PR target/40959, PR middle-end/45567, PR debug/45660, + PR rtl-optimization/41087, PR rtl-optimization/44919, PR target/36502, + PR target/42313, PR target/44651. + * Add support to build from the Linaro 4.5 2010.09 release. + * gcc-4.5-plugin-dev: Install config/arm/arm-cores.def. + * Remove non-existing URL's in README.c++ (Osamu Aoki). Closes: #596406. + * Don't provide c++abi2-dev for g++ cross builds. + * Don't pass -mimplicit-it=thumb if -mthumb to as on ARM, rejected upstream. + + -- Matthias Klose Tue, 14 Sep 2010 12:52:34 +0200 + +gcc-4.5 (4.5.1-6) experimental; urgency=low + + * Update to SVN 20100909 (r164132) from the gcc-4_5-branch. + - Fix PR middle-end/45312, PR bootstrap/43847, PR middle-end/44554, + PR middle-end/40386, PR other/45443, PR c++/45200, PR c++/45293, + PR c++/45558, PR fortran/45595, PR fortran/45530, PR fortran/45489, + PR fortran/45019, PR libstdc++/45398. + + [ Matthias Klose ] + * Tighten binutils dependencies to 2.20.1-14. + + [ Marcin Juszkiewicz ] + * Fix the gcc-4.5-plugin-dev package name for cross builds. LP: #631474. + * Build the gcc-4.5-plugin-dev for stage1 cross builds. + * Fix priorities and sections for some cross packages. + + [ Al Viro ] + * Fix installation of libgcc_s.so as a linker script for biarch builds. + + [ Kees Cook ] + * Push glibc stack traces into stderr when building the package. + * debian/patches/gcc-default-ssp.patch: Lower ssp-buffer-size to 4. + + -- Matthias Klose Fri, 10 Sep 2010 21:25:37 +0200 + +gcc-4.5 (4.5.1-5) experimental; urgency=low + + * Always add dependencies on multilib library packages in *-multilib + packages. + * Fix installation of libgcc_s.so on architectures when libgcc_s.so is + a linker script, not a symlink (Steve Langasek). Closes: #595474. + * Remove the lib32gcc1 preinst script. Closes: #595495. + + -- Matthias Klose Sat, 04 Sep 2010 12:41:40 +0200 + +gcc-4.5 (4.5.1-4) experimental; urgency=low + + * Update to SVN 20100903 (r163833) from the gcc-4_5-branch. + - Fix PR target/45070, PR middle-end/45458, PR rtl-optimization/45353, + PR middle-end/45423, PR c/45079, PR tree-optimization/45393, + PR c++/44991, PR middle-end/45484, PR debug/45500, PR lto/45496. + + [ Matthias Klose ] + * Install config/vxworks-dummy.h in the gcc-4.5-plugin-dev package + on armel, mipsel and sparc64 too. + * Cleanup packaging files in gcc-source package. + * [ARM] Provide __builtin_expect() hints in linux-atomic.c (backport). + + [ Al Viro ] + * Fix builds with disabled biarch library packages. + * New variables {usr_lib,gcc_lib_dir,libgcc_dir}{,32,64,n32}, and switch + to using them in rules.d/*; as the result, most of the explicit pathnames + in there are gone _and_ we get uniformity across different flavours. + * New variables {usr_lib,gcc_lib_dir,libgcc_dir}{,32,64,n32}, and switch + to using them in rules.d/*; as the result, most of the explicit pathnames + in there are gone _and_ we get uniformity across different flavours. + * Merge bi-/tri-arch stuff in binary-gcc.mk. + * Merge rules for libgcc biarch variants. + * Merge rules for libstdc++ biarch variants. Fix n32 variant of + libstdc++-dbg removing _pic.a from the wrong place. + * Merge libgfortran rules. + * Merge rules for cxx-multi and objc-multi packages. + * Enable gcc-hppa64 in cross-gcc-to-hppa build. + + [ Marcin Juszkiewicz ] + * Create libgcc1 and gcc-*-base packages for stage2 cross builds. + LP: #628855. + + -- Matthias Klose Fri, 03 Sep 2010 18:09:40 +0200 + +gcc-4.5 (4.5.1-3) experimental; urgency=low + + * Update to SVN 20100829 (r163627) from the gcc-4_5-branch. + - Fix PR target/45327, PR middle-end/45292, PR fortran/45344, + PR target/41484, PR rtl-optimization/44858, PR rtl-optimization/45400, + PR tree-optimization/45260, PR c++/45315. + + [ Matthias Klose ] + * Don't run the libstdc++ testsuite on armel on the buildds. + * Integrate and extend bi/tri-arch cross builds patches. + * Fix dependencies for mips* triarch library packages depend on *both* lib64* + and libn32* packages. Closes: #594540. + * Tighten binutils dependencies to 2.20.1-13. + * Update LAST_UPDATED file when applying upstream updates. + + [ Al Viro ] + * Bi/tri-arch cross builds patches. + * Fix installation paths in bi/tri-arch libobjc and libmudflap packages. + * Merge rules for all flavours of libgomp, libmudflap, libobjc. + * Crossbuild fix for lib32gomp (use $(PFL)/lib32 instead of $(lib32)). + * gcc-4.5: libgcc_s.so.1 symlink creation on cross-builds. + * Enable gcc-multilib for cross-builds and fix what needs fixing. + * Enable g++-multilib for cross-builds, fix pathnames. + * Enable gobjc/gobjc++ multilib for cross-builds, fixes. + * Enable gfortran multilib for cross-builds, fix paths. + * Multilib dependency fixes for cross-builds. + + -- Matthias Klose Sun, 29 Aug 2010 18:24:37 +0200 + +gcc-4.5 (4.5.1-2) experimental; urgency=low + + * Update to SVN 20100818 (r163323) from the gcc-4_5-branch. + - Fix PR target/41089, PR tree-optimization/44914, PR c++/45112, + PR fortran/44929, PR middle-end/45262, PR debug/45259, PR debug/45055, + PR target/44805, PR middle-end/45034, PR tree-optimization/45109, + PR target/44942, PR fortran/31588, PR fortran/43954, PR fortran/44660, + PR fortran/42051, PR fortran/44064, PR fortran/45151, PR libstdc++/44963, + PR tree-optimization/45241, PR middle-end/44632 (closes: #585925), + PR libstdc++/45283, PR target/45296. + + [ Matthias Klose ] + * Allow overwriting of the PF macro used in the build from the environment + (Jim Heck). Closes: #588381. + * Fix libc-dbg build dependency for java enabled builds. Addresses: #591424. + * gcj: Align data in .rodata.jutf8.* sections, patch taken from the trunk. + * Configure with --enable-checking+release. LP: #612822. + * Add the complete packaging to the -source package. LP: #608650. + * Drop the gcc-ix86-asm-generic32.diff patch. + * Tighten (build-) dependency on cloog-ppl (>= 0.15.9-2). + * Apply proposed patch for PR middle-end/45292. + * Re-enable running the libstdc++ testsuite on armel and ia64 on the buildds. + + [ Steve Langasek ] + * s,/lib/,/$(libdir)/, throughout debian/rules*; a no-op in the current + case, but required for us to find the libraries when building for + multiarch + * Don't append multiarch paths to any multilib paths except for the default; + our biarch (multilib) builds need to remain independent of multiarch in + the near term, so we want to make sure we can find /usr/lib32 without + /usr/lib/i486-linux-gnu being available. + * debian/control.m4, debian/rules.conf: conditionally set packages to be + Multi-Arch: yes when MULTIARCH is defined. + + [ Marcin Juszkiewicz ] + * Allow building intermediate stages for cross builds. LP: #603497. + + -- Matthias Klose Wed, 18 Aug 2010 07:00:12 +0200 + +gcc-4.5 (4.5.1-1) experimental; urgency=low + + * GCC-4.5.1 release. + * Update to SVN 20100731 (r162781) from the gcc-4_5-branch. + - Fix PR tree-optimization/45052, PR target/43698. + * Apply proposed fixes for PR c++/45112, PR c/45079. + * Install config/vxworks-dummy.h in the gcc-4.5-plugin-dev package + on armel, mips, mipsel, sh4, sparc, sparc64. Closes: #590054. + * Link executables statically when `static' is passed in DEB_BUILD_OPTIONS + (Jim Heck). Closes: #590102. + * Stop building java packages from the gcc-4.5 source package. + + -- Matthias Klose Sat, 31 Jul 2010 16:30:20 +0200 + +gcc-4.5 (4.5.0-10) experimental; urgency=low + + * Update to SVN 20100725 (r162508) from the gcc-4_5-branch. + - Fix PR tree-optimization/45047, PR c++/43016, PR c++/45008. + * Disable building gcj/libjava on mips/mipsel (fails to link libgcj). + * Update libstdc++6 symbols files. + + -- Matthias Klose Sun, 25 Jul 2010 16:39:11 +0200 + +gcc-4.5 (4.5.0-9) experimental; urgency=low + + * Update to SVN 20100723 (r162448) from the gcc-4_5-branch (post + GCC-4.5.1 release candidate 1). + - Fix PR debug/45015, PR target/44942, PR tree-optimization/44900, + PR tree-optimization/44977, PR c++/44996, PR fortran/44929, + PR fortran/30668, PR fortran/31346, PR fortran/34260, + PR fortran/40011. + + [ Marcin Juszkiewicz ] + * Fix dependencies on cross library packages. + * Copy all debian/rules* files to the -source package. + + [ Matthias Klose ] + * Fix versioned build dependency on gcc-4.x-source package for cross builds. + LP: #609060. + * Set Vcs attributes in control file. + + -- Matthias Klose Fri, 23 Jul 2010 13:08:07 +0200 + +gcc-4.5 (4.5.0-8) experimental; urgency=low + + * Update to SVN 20100718 (r161892) from the gcc-4_5-branch. + - Fixes: PR target/44531, PR bootstrap/44820, PR target/44597, + PR target/44705, PR middle-end/44777, PR debug/44694, PR c++/44039, + PR tree-optimization/43801, PR target/44575, PR debug/44104, + PR middle-end/44671, PR middle-end/44686, PR tree-optimization/44357, + PR debug/44694, PR middle-end/43866, PR debug/42278, PR c++/44059, + PR tree-optimization/43905, PR middle-end/44133, PR tree-optimize/44063, + PR tree-optimization/44683, PR rtl-optimization/43332, PR debug/44610, + PR middle-end/44684, PR tree-optimization/44393, PR middle-end/44674, + PR c++/44628, PR c++/44587, PR fortran/44582, PR fortran/43841, + PR fortran/43843, PR libstdc++/44708, PR tree-optimization/44886, + PR target/43888, PR tree-optimization/44284, PR middle-end/44828, + PR middle-end/41355, PR c++/44703, PR ada/43731, PR fortran/44773, + PR fortran/44847. + + [ Marcin Juszkiewicz ] + * debian/rules2: Merge rules.d includes. + * Properly -name -dbg packages for cross builds. + * Various cross build fixes. + * Build libmudflap packages for cross builds. + * Fix generation of maintainer scripts for cross packages. + * Build a gcc-base package for cross builds. + + [ Kees Cook ] + * Fix additional libstdc++ testsuite failures for hardening defaults. + + [ Samuel Thibault ] + * Update hurd patch for 4.5, fixing build failure. Closes: #584819. + + [ Matthias Klose ] + * gcc-arm-implicit-it.diff: Only pass -mimplicit-it=thumb when in + thumb mode (Andrew Stubbs). + + -- Matthias Klose Sun, 18 Jul 2010 10:53:51 +0200 + +gcc-4.5 (4.5.0-7) experimental; urgency=low + + * Update to SVN 20100625 (r161383) from the gcc-4_5-branch. + - Fixes: PR bootstrap/44426, PR target/44546, PR target/44261, + PR target/43740, PR libstdc++/44630 (closes: #577458), + PR c++/44627 (LP: #503668), PR target/39690, PR target/44615, + PR fortran/44556, PR c/44555. + - Update libstdc++'s pretty printer for python2.6. Closes: #585202. + + [ Matthias Klose ] + * Fix libstdc++ symbols files for powerpc and sparc. + * Add maintainer scripts for cross packages. + + [ Samuel Thibault ] + * Update hurd patch for 4.5, fixing build failure. Closes: #584454, + #584819. + + [ Marcin Juszkiewicz ] + * Merge the rules.d/binary-*-cross.mk files into rules.d/binary-*.mk. + + -- Matthias Klose Fri, 25 Jun 2010 15:57:38 +0200 + +gcc-4.5 (4.5.0-6) experimental; urgency=low + + [ Matthias Klose ] + + * Update to SVN 20100617 (r161901) from the gcc-4_5-branch. Fixes: + PR target/44169, PR bootstrap/43170, PR objc/35996, PR objc++/32052, + PR objc++/23716, PR lto/44464, PR rtl-optimization/42461, PR fortran/44536, + PR tree-optimization/44258, PR tree-optimization/44423, PR target/44534, + PR bootstrap/44426, PR tree-optimization/44508, PR tree-optimization/44507, + PR lto/42776, PR target/44481, PR debug/41371, PR bootstrap/37304, + PR target/44067, PR debug/41371, PR debug/41371, PR target/44075, + PR c++/44366, PR c++/44401, PR fortran/44347, PR fortran/44430, + PR lto/42776, PR libstdc++/44487, PR other/43838, PR libgcj/44216. + * debian/patches/cross-fixes.diff: Update for 4.5 (Marcin Juszkiewicz). + * debian/patches/libstdc++-pic.diff: Fix installation for cross builds. + * Fix PR bootstrap/43847, --enable-plugin for cross builds. + * Export long double versions of "C" math library for arm-linux-gnueabi, + m68k-linux-gnu (ColdFire), mips*-linux-gnu (o32 ABI), sh*-linux-gnu + (not 32 bit). Merge the libstdc++-*-ldbl-compat.diff patches. + * Merge binary-libgcc.mk packaging changes into binary-libgcc-cross.mk + (Loic Minier). + * Update libgcc and libstdc++ symbols files. + + [ Aurelien Jarno ] + + * libstdc++-mips-ldbl-compat.diff: On MIPS provide the long double + versions of "C" math functions in libstdc++ as we need to keep the + ABI. Closes: #584610. + + -- Matthias Klose Thu, 17 Jun 2010 14:56:14 +0200 + +gcc-4.5 (4.5.0-5) experimental; urgency=low + + * Update to SVN 20100602 (r160097) from the gcc-4_5-branch. Fixes: + PR target/44338, PR middle-end/44337, PR tree-optimization/44182, + PR target/44161, PR c++/44358, PR fortran/44360, PR lto/44385. + * Fix PR target/44261, taken from the trunk. Closes: #582787. + * Fix passing the expanded -iplugindir option. + * Disable broken profiled bootstrap on alpha. + * On ix86, pass -mtune=generic32 in 32bit mode to the assembler, when + configured for i586-linux-gnu or i686-linux-gnu. + + -- Matthias Klose Thu, 03 Jun 2010 00:44:37 +0200 + +gcc-4.5 (4.5.0-4) experimental; urgency=low + + * Update to SVN 20100527 (r160047) from the gcc-4_5-branch. Fixes: + PR rtl-optimization/44164, PR middle-end/44069, PR target/44199, + PR lto/44196, PR target/43733, PR target/44245, PR target/43869, + PR debug/44223, PR tree-optimization/44038, PR tree-optimization/43949, + PR debug/44205, PR debug/44178, PR bootstrap/43870, PR target/44202, + PR target/44074, PR lto/43455, PR lto/42653, PR lto/42425, PR lto/43080, + PR lto/43946, PR c++/43382, PR c++/41510, PR c++/44193, PR c++/44157, + PR c++/44158, PR lto/44256, PR libstdc++/44190, PR lto/44312, + PR target/43636, PR target/43726, PR c++/43555PR libstdc++/40497. + + [ Matthias Klose ] + + * Enable multilibs again on powerpcspe. Closes: #579780. + * Fix setting CC for REVERSE_CROSS build (host == target,host != build). + Closes: #579779. + * Fix setting biarch_cpu macro. + * Don't bother with un-normalized paths in .la files, just remove them. + * debian/locale-gen: Update locales needed for the libstdc++-v3 testsuite. + * If libstdc++6 is built from newer gcc-4.x source, run the libstdc++-v3 + testsuite against the installed lib too. + * Configure with --enable-secureplt on powerpcspe. + + [ Aurelien Jarno ] + + * Fix $(distrelease) on non-official archives. Fix powerpcspe, sh4 and + sparc64 builds. + + -- Matthias Klose Sun, 30 May 2010 12:52:02 +0200 + +gcc-4.5 (4.5.0-3) experimental; urgency=low + + * Update to SVN 20100519 (r159556) from the gcc-4_5-branch. Fixes: + PR c++/43704, PR fortran/43339, PR middle-end/43337, PR target/43635, + PR tree-optimization/43783, PR tree-optimization/43796, PR middle-end/43570, + PR libgomp/43706, PR libgomp/43569, PR middle-end/43835, PR c/43893, + PR tree-optimization/43572, PR tree-optimization/43845, PR libgcj/40860, + PR target/43744, PR debug/43370, PR c++/43880, PR middle-end/43671, + PR debug/43972, PR target/43921, PR c++/38064, PR c++/43953, + PR fortran/43985, PR fortran/43592, PR fortran/40539, PR c++/43787, + PR middle-end/44085, PR middle-end/44071, PR middle-end/43812, + PR debug/44028, PR rtl-optimization/44012, PR target/44046, + PR documentation/44016, PR fortran/44036, PR fortran/40728, + PR libstdc++/44014, PR lto/44184, PR bootstrap/42347, PR middle-end/44102, + PR c++/44127, PR debug/44136, PR target/44088, PR tree-optimization/44124, + PR fortran/43591, PR fortran/44135, PR libstdc++/43259. + + [ Matthias Klose ] + * Revert gcj-arm-no-merge-exidx-entries patch, fixed by PR libgcj/40860. + * Don't run the libstdc++-v3 testsuite on the ia64 buildds. Timeouts. + * Backport two libjava fixes from the trunk to run josm with gcj. + * Ubuntu only: + - Pass --hash-style=gnu instead of --hash-style=both to the linker. + * Preliminary architecture port for powerpcspe (Kyle Moffett). + Closes: #579780. + * Update configury to be able to target i686 instead of i486 on i386. + + [ Aurelien Jarno] + * Don't link with --hash-style=both on mips/mipsel as GNU hash is not + compatible with the MIPS ABI. + * Default to -mplt on mips(el), -march=mips2 and -mtune=mips32 on 32-bit + mips(el), -march=mips3 and -mtune=mips64 on 64-bit mips(el). + + -- Matthias Klose Wed, 19 May 2010 09:48:20 +0200 + +gcc-4.5 (4.5.0-2) experimental; urgency=low + + * Update to SVN 20100419 from the gcc-4_5-branch. + - Fix PR tree-optimization/43627, c++/43641, PR c++/43621, PR c++/43611, + PR fortran/31538, PR fortran/30073, PR target/43662, + PR tree-optimization/43572, PR tree-optimization/43771. + * Install the linker plugin. + * Search the linker plugin as a readable, not an executable file. + * Link with --hash-style=both on mips/mipsel. + * On mips, pass -mfix-loongson2f-nop to as, if -mno-fix-loongson2f-nop + is not passed. + * Sequel to PR40521, fix -g to generate .eh_frame on ARM. + * On ARM, let gcj pass --no-merge-exidx-entries to the linker. + * Build-depend/depend on binutils snapshot. + * Update NEWS.html and NEWS.gcc. + + -- Matthias Klose Mon, 19 Apr 2010 15:22:55 +0200 + +gcc-4.5 (4.5.0-1) experimental; urgency=low + + * GCC 4.5.0 release. + * Always apply biarch patches. + * Build the lto-linker plugin again. Closes: #575448. + * Run the libstdc++v3 testsuite on armel again. + * Fix --enable-libstdcxx-time documentation, show configure result. + * On linux targets always pass --no-add-needed to the linker. + * Update the patch to search for plugins in a default plugin directory. + * Fix java installations in snapshot builds. + * Configure --with-plugin-ld=ld.gold. + * Linker selection: ld is used by default, to use the gold linker, + pass -fuse-linker-plugin (no other side effects if -flto/-fwhopr + is not passed). To force ld.bfd or ld.gold, pass -B/usr/lib/compat-ld + for ld.bfd or /usr/lib/gold-ld for ld.gold. + * Don't apply the gold-and-ld patch for now. + * Stop building the documentation for dfsg compliant builds. Closes: #571759. + + -- Matthias Klose Wed, 14 Apr 2010 13:29:20 +0200 + +gcc-4.5 (4.5-20100404-1) experimental; urgency=low + + * Update to SVN 20100404 from the trunk. + * Fix build failures building cross compilers configure --with-ld. + * lib32gcc1: Set priority to `extra'. + * Apply proposed patch to search for plugins in a default plugin directory. + * In snapshot builds, use for javac/ecj1 the jvm provided by the package. + * libstdc++-arm-ldbl-compat.diff: On ARM provide the long double versions + of "C" math functions in libstdc++; these are dropped when built + against glibc-2.11. + + -- Matthias Klose Sun, 04 Apr 2010 15:51:25 +0200 + +gcc-4.5 (4.5-20100321-1) experimental; urgency=low + + * Update to SVN 20100321 from the trunk. + * gcj-4.5-jre-headless: Stop providing java-virtual-machine. + * gcj-4.5-plugin-dev: Don't suggest mudflap packages. + * Apply proposed patch to enable both gold and ld in a single toolchain. + New option -fuse-ld=ld.bfd, -fuse-ld=gold. + + -- Matthias Klose Sun, 21 Mar 2010 11:45:48 +0100 + +gcc-4.5 (4.5-20100227-1) experimental; urgency=low + + * Update to SVN 20100227 from the trunk. + * Don't run the libstdc++-v3 testsuite on arm*-*-linux-gnueabi, when + defaulting to thumb mode (Timeouts on the Ubuntu buildd). + + -- Matthias Klose Sat, 27 Feb 2010 08:29:55 +0100 + +gcc-4.5 (4.5-20100222-1) experimental; urgency=low + + * Update to SVN 20100222 from the trunk. + - Install additional header files needed by plugins. Closes: #562881. + * gcc-4.5-plugin-dev: Should depend on libgmp3-dev. Closes: #566366. + * Update libstdc++6 symbols files. + + -- Matthias Klose Tue, 23 Feb 2010 02:16:22 +0100 + +gcc-4.5 (4.5-20100216-0ubuntu1~ppa1) lucid; urgency=low + + * Update to SVN 20100216 from the trunk. + * Don't call dh_makeshlibs with -V for shared libraries with + symbol files. + * Don't run the libstdc++-v3 testsuite in thumb mode on armel + to work around buildd timeout (see PR target/42509). + + -- Matthias Klose Wed, 17 Feb 2010 02:06:02 +0100 + +gcc-4.5 (4.5-20100204-1) experimental; urgency=low + + * Update to SVN 20100204 from the trunk. + + -- Matthias Klose Thu, 04 Feb 2010 19:44:19 +0100 + +gcc-4.5 (4.5-20100202-1) experimental; urgency=low + + * Update to SVN 20100202 from the trunk. + - gcc-stack_chk_fail-check.diff: Remove, applied upstream. + * Update libstdc++6 symbol files. + * Build gnat in snapshot builds on arm. + * Configure with --enable-checking=yes for snapshot builds, and for + 4.5 builds before the release. + * Temporary workaround: On arm-linux-gnueabi run the libstdc++v3 testsuite + with -Wno-abi. + * When building the hppa64 cross compiler, add $(builddir)/gcc to + LD_LIBRARY_PATH to find the just built libgcc6. Closes: #565862. + * On sh4-linux, use sh as java architecture name instead of sh4. + * On armel, build gnat-4.5 using gcc-snapshot. + * Revert the bump of the libgcc soversion on hppa (6 -> 4). + + -- Matthias Klose Tue, 02 Feb 2010 19:35:25 +0100 + +gcc-4.5 (4.5-20100107-1) experimental; urgency=low + + [ Matthias Klose ] + * Update to SVN 20100107 from the trunk. + * Revert the workaround for the alpha build (PR bootstrap/42511 is fixed). + * testsuite-hardening-format.diff: Add a fix for the libstdc++ testsuite. + * Build-depend again on autogen. + * Work around PR lto/41569 (installation bug when configured with + --enabled-gold). + * On armel run the testsuite both in arm and thumb mode, when the + distribution is supporthing tumb processors. + * Work around PR target/42509 (armel), not setting BOOT_CFLAGS, but + applying libcpp-arm-workaround.diff. + + [ Nobuhiro Iwamatsu ] + * Update gcc-multiarch patch for sh4. + + -- Matthias Klose Thu, 07 Jan 2010 16:34:57 +0100 + +gcc-4.5 (4.5-20100106-0ubuntu1) lucid; urgency=low + + * Update to SVN 20100106 from the trunk. + * gcj-4.5-jdk: Include /usr/lib/jvm-exports. + * Rename libgcc symbols file for hppa. + * On alpha and armel, set BOOT_CFLAGS to -g -O1 to work around bootstrap + failures (see PR target/42509 (armel) and PR bootstrap/42511 (alpha)). + * Base the source build-dependency on the package version instead of the + gcc version. + + -- Matthias Klose Wed, 06 Jan 2010 14:17:29 +0100 + +gcc-4.5 (4.5-20100103-1) experimental; urgency=low + + * Update to SVN 20100103 from the trunk. + + [ Samuel Thibault ] + * Update hurd patch for 4.5. Closes: #562802. + + [ Aurelien Jarno ] + * Remove patches/kbsd-gnu-ada.diff (merged upstream). + + [ Matthias Klose ] + * libgcj11: Move .so symlinks into gcj-4.5-jdk. Addresses: #563280. + * gcc-snapshot: On sparc64, use gcc-snapshot as bootstrap compiler. + * Don't use expect-tcl8.3 on hppa anymore. + * Merge gnat-4.4 changes back from 4.4.2-5. + * Bump libgcc soversion on hppa (4 -> 6). + * Default to v9a (ultrasparc) on sparc*-linux. + + -- Matthias Klose Sun, 03 Jan 2010 17:25:27 +0100 + +gcc-4.5 (4.5-20091226-1) experimental; urgency=low + + * Update to SVN 20091226 from the trunk. + * Fix powerpc spu installation. + * Enable multiarch for sh4. + * Fix libffi multilib test runs. + * Configure the hppa -> hppa64 cross compiler --with-system-zlib. + * gcc-4.5-hppa64: Don't ship info dir file. + * lib32stdc++6{,-dbg}: Add dependency on 32bit glibc. + + -- Matthias Klose Sat, 26 Dec 2009 15:38:23 +0100 + +gcc-4.5 (4.5-20091223-1) experimental; urgency=low + + * Update to SVN 20091223 from the trunk. + + [ Matthias Klose ] + * Update hardening patches for 4.5. + * Don't call install-info directly, depend on dpkg | install-info instead. + * Add conflicts with packages built from GCC 4.4 sources. + * On ARM, pass --hash-style=both to ld. + * Update libgfortran3 symbols file. + * Update libstdc++6 symbols file. + + [ Arthur Loiret ] + * debian/rules.conf (gen_no_archs): Handle multiple arm ports. + + -- Matthias Klose Wed, 23 Dec 2009 18:02:24 +0100 + +gcc-4.5 (4.5-20091220-1) experimental; urgency=low + + * Update to SVN 20091220 from the trunk. + - Remove patches applied upstream: arm-boehm-gc-locks.diff, + arm-gcc-gcse.diff, deb-protoize.diff, gcc-arm-thumb2-sched.diff, + gcc-atom-doc.diff, gcc-atom.diff, gcc-build-id.diff, + gcc-unwind-debug-hook.diff, gcj-use-atomic-builtins-doc.diff, + gcj-use-atomic-builtins.diff, libjava-atomic-builtins-eabi.diff, + libjava-nobiarch-check-snap.diff, lp432222.diff, pr25509-doc.diff, + pr25509.diff, pr39429.diff, pr40133.diff, pr40134.diff, rev146451.diff, + s390-biarch-snap.diff, sh4-scheduling.diff, sh4_atomic_update.diff. + - Update patches: gcc-multiarch.diff, gcc-textdomain.diff, + libjava-nobiarch-check.diff, libjava-subdir.diff, libstdc++-doclink.diff, + libstdc++-man-3cxx.diff, libstdc++-pic.diff, note-gnu-stack.diff, + rename-info-files.diff, s390-biarch.diff. + * Stop building the protoize package, removed from the GCC 4.5 sources. + * gcc-4.5: Install lto1, lto-wrapper, and new header files for intrinsics. + * libstdc++6-4.5-dbg: Install the python files for use with gdb. + * Build java packages from the gcc-4.5 source package. + + -- Matthias Klose Sun, 20 Dec 2009 10:56:56 +0100 + +gcc-4.4 (4.4.2-6) unstable; urgency=low + + * Update to SVN 20091220 from the gcc-4_4-branch (r155367). + Fix PR c++/42387, PR c++/41183. + + [ Matthias Klose ] + * Apply svn-doc-updates.diff for non DFSG builds. + * gcc-snapshot: + - Remove patches integrated upstream: pr40133.diff. Closes: #561550. + + [ Nobuhiro Iwamatsu ] + * Backport linux atomic ops changes for sh4 from the trunk. Closes: #561550. + * Backport from trunk: [SH] Not run scheduling before reload as default. + Closes: #561429. + + [ Arthur Loiret ] + * Apply spu patches independently of the hardening patches; fix build + failure on powerpc. + + -- Matthias Klose Sun, 20 Dec 2009 10:20:19 +0100 + +gcc-4.4 (4.4.2-5) unstable; urgency=low + + * Update to SVN 20091212 from the gcc-4_4-branch (r155122). + Revert the fix for PR libstdc++/42261, fix PR fortran/42268, + PR target/42263, PR target/42263, PR target/41196, PR target/41939, + PR rtl-optimization/41574. + + [ Matthias Klose ] + * Regenerate svn-updates.diff. + * Disable biarch testsuite runs for libffi (broken and unused). + * Support xz compression of source tarballs. + * Fix typo in PR libstdc++/40133 to do the link tests. + * gcc-snapshot: + - Remove patches integrated upstream: pr40134-snap.diff. + - Update s390-biarch.diff for trunk. + + [ Aurelien Jarno ] + * Add sparc64 support: disable multilib and install the libraries + in /lib. + + -- Matthias Klose Sun, 13 Dec 2009 10:28:19 +0100 + +gcc-4.4 (4.4.2-4) unstable; urgency=low + + * Update to SVN 20091210 from the gcc-4_4-branch (r155122), Fixes: + PR target/42165, PR target/42113, PR libgfortran/42090, + PR middle-end/42049, PR c++/42234, PR fortran/41278, PR libstdc++/42261, + PR libstdc++/42273 PR java/41991. + + [ Matthias Klose ] + * gcc-arm-thumb2-sched.diff: Don't restrict reloads to LO_REGS for Thumb-2. + * PR target/40134: Don't redefine LIB_SPEC on hppa. + * PR target/42263, fix wrong code bugs in SMP support on ARM, backport from + the trunk. + * Pass -mimplicit-it=thumb to as by default on ARM, when configured + --with-mode=thumb. + * Fix boehm-gc build on ARM --with-mode=thumb. + * ARM: Don't copy uncopyable instructions in gcse.c (backport from trunk). + * Build the spu cross compiler for powerpc from the cell-4_4-branch. + * gcj: add option -fuse-atomic-builtins (backport from the trunk). + + [ Arthur Loiret ] + * Make svn update interdiffs more readable. + + -- Matthias Klose Thu, 10 Dec 2009 04:29:36 +0100 + +gcc-4.4 (4.4.2-3) unstable; urgency=low + + * Update to SVN 20091118 from the gcc-4_4-branch (r154294). + Fix PR PR c++/9381, PR c++/21008, PR c++/35067, PR c++/36912, PR c++/37037, + PR c++/37093, PR c++/38699, PR c++/39786, c++/36959, PR c++/41754, + PR c++/41876, PR c++/41967, PR c++/41972, PR c++/41994, PR c++/42059, + PR c++/42061, + PR fortran/41772, PR fortran/41850, PR fortran/41909, + PR middle-end/40946, PR middle-end/41317, R tree-optimization/41643, + PR target/41900, PR rtl-optimization/41917, PR middle-end/41963, + PR middle-end/42029. + * Snapshot builds: + - Patch updates. + - Configure with --disable-browser-plugin. + * Configure with --disable-libstdcxx-pch on hppa. + * Backport armel patches form the trunk: + - Fix PR objc/41848 - workaround ObjC and -fsection-anchors. + - Enable scheduling for Thumb-2, including the fix for PR target/42031. + - Fix PR target/41939, EABI violation in accessing values below the stack. + + -- Matthias Klose Wed, 18 Nov 2009 08:37:18 -0600 + +gcc-4.4 (4.4.2-2) unstable; urgency=low + + * Update to SVN 20091031 from the gcc-4_4-branch (r153603). + - Fix PR debug/40521, PR target/40913, PR middle-end/22072, + PR target/41665, PR c++/38798, PR c++/40092, PR c++/37875, + PR c++/37204, PR fortran/41755, PR libstdc++/40654, PR libstdc++/40826, + PR target/41702, PR c/41842, PR target/41762, PR c++/40808, + PR fortran/41777, PR libstdc++/40852. + * Snapshot builds: + - Configure with --enable-plugin, disable the gcjwebplugin by a patch. + Addresses: #551200. + - Proposed patch for PR lto/41652, compile lto-plugin with + -D_FILE_OFFSET_BITS=64 + - Allow disabling the ada build via DEB_BUILD_OPTIONS nolang=ada. + * Fixes for reverse cross builds. + * On sparc default to v9 in 32bit mode. + * Fix __stack_chk_fail check for cross builds configured --with-headers. + * Apply some fixes for uClibc cross builds (Jonas Meyer, Hector Oron). + + -- Matthias Klose Sat, 31 Oct 2009 14:16:03 +0100 + +gcc-4.4 (4.4.2-1) unstable; urgency=low + + * GCC 4.4.2 release. + - Fixes PR target/26515, PR target/41680, PR rtl-optimization/41646, + PR c++/39863, PR c++/41038. + * Fix setting timeout for testsuite runs. + * gcj-4.4/gcc-snapshot: Drop build-dependency on libgconf2-dev, disabled + by default. + * gcj-4.4: Run the libffi testsuite as well. + * Add explicit build dependency on zlib1g-dev. + * Fix cross builds, add support for gomp and gfortran (only tested for + non-biarch targets). + * (Build-)depend on binutils-2.20. + * Fix up omp.h for multilibs (taken from Fedora). + + -- Matthias Klose Sun, 18 Oct 2009 02:31:32 +0200 + +gcc-4.4 (4.4.1-6) unstable; urgency=low + + * Snapshot builds: + - Add build dependency on libelfg0-dev (>= 0.8.12). + - Add build dependency on binutils-gold where available. + - Suggest binutils-gold; not perfect, it is required when using + -use-linker-plugin. + - Work around installation failure in the lto-plugin (PR lto/41569). + - Install java home symlinks in /usr/lib/jvm. + - Revert the dwarf2cfi_asm workaround, obsoleted by PR debug/40521. + * PR debug/40521: + - Apply patch for PR debug/40521, taken from the trunk. + - Revert the dwarf2cfi_asm workaround, obsoleted by PR debug/40521. + - Depend on binutils (>= 2.19.91.20091005). + * Update to SVN 20091005 from the gcc-4_4-branch (r152450). + - Fixes PR fortran/41479. + * In the test summary, add more information about package versions + used for the build. + + -- Matthias Klose Wed, 07 Oct 2009 02:12:56 +0200 + +gcc-4.4 (4.4.1-5) unstable; urgency=medium + + * Update to SVN 20091003 from the gcc-4_4-branch (r152174). + - Fixes PR target/22093, PR c/39779, PR libffi/40242, PR target/40473, + PR debug/40521, PR c/41049, PR debug/41065, PR ada/41100, + PR tree-optimization/41101, PR libgfortran/41328, PR libffi/41443, + PR fortran/41515. + * Updates for snapshot builds: + - Fix build dependency on automake for snapshot builds. + - Update patches pr40134-snap and libjava-nobiarch-check-snap. + * Fix lintian errors in libstdc++ packages and lintian warnings in the + source package. + * Add debian/README.source. + * Don't apply PR libstdc++/39491 for the trunk anymore. + * Install java home symlinks for snapshot builds in /usr/lib/jvm, + including javac. Depend on ecj. Addresses #536102. + * Fix build failure on armel with -mfloat-abi=softfp. + * Don't pessimize the code for newer armv6 and armv7 processors. + * libjava: Use atomic builtins For Linux ARM/EABI, backported from the + trunk. + * Proposed patch to fix wrong-code on powerpc (Alan Modra). LP: #432222. + * Link against -ldl instead of -lcloog -lppl. Exit with an error when using + the Graphite loop transformation infrastructure without having the + libcloog-ppl0 package installed (patch taken from Fedora). Packages + using these optimizations should build-depend on libcloog-ppl0. + gcc-4.4: Suggest the cloog runtime libraries. + * Install a hook _Unwind_DebugHook, called during unwinding. Intended as + a hook for a debugger to intercept exceptions. CFA is the CFA of the + target frame. HANDLER is the PC to which control will be transferred + (patch taken from Fedora). + + -- Matthias Klose Sat, 03 Oct 2009 13:33:05 +0100 + +gcc-4.4 (4.4.1-4) unstable; urgency=low + + * Update to SVN 20090911 from the gcc-4_4-branch (r151649). + - Fixes PR target/34412, PR middle-end/41094, PR target/40718, + PR fortran/41062, PR libstdc++/41005, PR target/41184, + PR bootstrap/41180, PR c++/41127, PR fortran/41258, + PR rtl-optimization/40861, PR target/41315, PR fortran/39876. + + [ Matthias Klose ] + * Avoid underscores in doc-base document id's to workaround a + dh_installdocs bug. + * Update file names for the Ada user's guide. + * Set Homepage attribute for packages. + * Update the patch for gnat on armel. + * gcj-4.4-jdk: Depend on libantlr-java. Addresses: #546062. + * Backport patch for PR tree-optimization/41101 from the trunk. + Closes: #541816. + * Update libstdc++6.symbols for symbols introduced with the fix + for PR libstdc++/41005. + * Apply proposed patches for PR libstdc++/40133 and PR target/40134. + Add symbols exception propagation support in libstdc++ on armel + to the libstdc++6 symbols. + + [ Ludovic Brenta] + Merge from gnat-4.4 (4.4.1-3) unstable; urgency=low + * debian/rules.defs, debian/rules.d/binary-ada.mk, debian/rules.patch: + better support for architectures that support only one exception + handling mechanism (SJLJ or ZCX). + + -- Matthias Klose Sat, 12 Sep 2009 03:18:17 +0200 + +gcc-4.4 (4.4.1-3) unstable; urgency=low + + * Update to SVN 20090822 from the gcc-4_4-branch (r151011). + - Fixes PR tree-optimization/41016, PR tree-optimization/41011, + PR tree-optimization/41008, PR tree-optimization/40991, + PR tree-optimization/40964, PR target/8603 (closes: #161432), + PR target/41019, PR target/41015, PR target/40957, PR target/40934, + PR rtl-optimization/41033, PR middle-end/41047, PR middle-end/41006, + PR fortran/41070, PR fortran/40995, PR fortran/40847, PR debug/40990, + PR debug/37801, PR c/41046, PR c/40948, PR c/40866, PR bootstrap/41018, + PR middle-end/41123,PR target/40971, PR c++/41131, PR fortran/41102, + PR libfortran/40962. + + [ Arthur Loiret ] + * Only use -fno-stack-protector when known to the stage1 compiler. + + [ Aurelien Jarno ] + * lib32* packages: remove the Pre-Depends: libc6-i386 (>= 2.9-18) and + upgrade the Conflicts: libc6-i386 from (<< 2.9-18) to (<< 2.9-22). + Closes: #537466. + * kbsd-gnu-ada.dpatch: add support for kfreebsd-amd64. + + [ Matthias Klose ] + * Build gnat on armel, the gnat-4.4 build still failing, gcc-snapshot + builds good enough to build itself. + * Merge enough of the gnat-4.4 changes back to allow a combined build + from the gcc-4.4 source. + * Build libgnatprj for armel. + * On armel build just one version of the ada run-time library. + * Update auto* build dependencies for snapshot builds. + * Apply proposed patch for PR target/40718. + + -- Matthias Klose Sun, 23 Aug 2009 11:50:38 +0200 + +gcc-4.4 (4.4.1-2) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20090808 from the gcc-4_4-branch (r150577). + - Fixes PR target/40832, PR rtl-optimization/40710, + PR tree-optimization/40321, PR build/40010, PR fortran/40727, + PR build/40010, PR rtl-optimization/40924, PR c/39902, + PR middle-end/40943, PR target/40577, PR c++/39987, PR debug/39706, + PR c++/40948, PR c++/40749, PR fortran/40851, PR fortran/40878, + PR target/40906. + * Bump GCC version required in dependencies to 4.4.1. + * Enable Ada for snapshot builds on all archs with a gnat package + available in the archive. + * Build-depend on binutils 2.19.51.20090805, needed at least for armel. + + [ Aurelien Jarno ] + * kbsd-gnu-ada.dpatch: new patch to fix build on GNU/kFreeBSD. + + -- Matthias Klose Sat, 08 Aug 2009 10:17:39 +0200 + +gcc-4.4 (4.4.1-1) unstable; urgency=low + + * GCC 4.4.1 release. + - Fixes PR target/39943, PR tree-optimization/40792, PR c++/40780, + PR middle-end/40747, PR libstdc++/40691, PR libfortran/40714, + PR tree-optimization/40813 (ICE in OpenJDK build on sparc). + * Apply proposed patch for PR target/39429, an ARM wrong-code error. + * Fix a typo in the arm back-end (proposed patch). + * Build-depend on libmpc-dev for snapshot builds. + * Fix build failure in cross builds (Hector Oron). Closes: #522597. + * Run the testsuite as part of the build target, not the install target. + + -- Matthias Klose Wed, 22 Jul 2009 13:24:39 +0200 + +gcc-4.4 (4.4.0-11) unstable; urgency=medium + + [ Matthias Klose ] + * Update to SVN 20090715 from the gcc-4_4-branch (r149690). + - Corresponds to the 4.4.1 release candidate. + - Fixes PR target/38900, PR debug/40666, PR middle-end/40669, + PR middle-end/40328, PR target/40587, PR middle-end/40585, + PR c++/40566, PR tree-optimization/40542, PR c/39902, + PR tree-optimization/40579, PR tree-optimization/40550, PR c++/40684, + PR c++/35828, PR c++/37816, PR c++/40639, PR c++/40633, PR c++/40619, + PR c++/40595, PR fortran/40440, PR fortran/40551, PR fortran/40638, + PR fortran/40443, PR libstdc++/40600, PR rtl-optimization/40667, PR c++/40740, + PR c++/36628, PR c++/37206, PR c++/40689, PR c++/40502, PR middle-end/40747. + * Backport of PR c/25509, new option -Wno-unused-result. LP: #305176. + * gcc-4.4: Depend on libgomp1, even if not building the libgomp1 package. + * Add proposed patches for PR libstdc++/40133, PR target/40134; don't apply + yet. + + [Emilio Pozuelo Monfort] + * Backport build-id support, configure with --enable-linker-build-id. + + -- Matthias Klose Tue, 14 Jul 2009 16:09:33 -0400 + +gcc-4.4 (4.4.0-10) unstable; urgency=low + + [ Arthur Loiret ] + * debian/rules.patch: Record the auto* calls to run them once only. + + [ Matthias Klose ] + * Update to SVN 20090627 from the gcc-4_4-branch (r149023). + - Fixes PR other/40024. + * Fix typo, adding blacklisted symbols to the libgcc1 symbols file on armel. + * On mips/mipsel use -O2 in STAGE1_CFLAGS until binutils is updated. + + -- Matthias Klose Sun, 28 Jun 2009 10:13:08 +0200 + +gcc-4.4 (4.4.0-9) unstable; urgency=high + + * Update to SVN 20090624 from the gcc-4_4-branch (r148821). + - Fix PR objc/28050 (LP: #362217), PR libstdc++/40297, PR c++/40342. + * Continue the well planned lib32 transition on amd64, adding pre-dependencies + on libc6-i386 (>= 2.9-18) on Debian. Closes: #533767. + * Enable SSP on arm and armel, run the testsuite with -fstack-protector. + LP: #375189. + * Fix spu fortran build in gcc-snapshot builds. + * Add missing symbols for 64bit libgfortran library. + * Update libstdc++ symbol files for sparc 64bit, adding symbols + for exception propagation support. + * Explicitely add __aeabi symbols to the libgcc1 symbols file on armel. + Closes: #533843. + + -- Matthias Klose Wed, 24 Jun 2009 23:46:02 +0200 + +gcc-4.4 (4.4.0-8) unstable; urgency=medium + + * Let all 32bit libs conflict with libc6-i386 (<< 2.9-17). Closes: #533767. + * Update to SVN 20090620 from the gcc-4_4-branch (r148747). + - Fixes PR fortran/39800, PR fortran/40402. + * Work around tar bug on kfreebsd unpacking java class file updates (#533356). + + -- Matthias Klose Sat, 20 Jun 2009 15:15:22 +0200 + +gcc-4.4 (4.4.0-7) unstable; urgency=medium + + * Update to SVN 20090618 from the gcc-4_4-branch (r148685). + - Fixes PR middle-end/40446, PR middle-end/40389, PR middle-end/40460, + PR fortran/40168, PR target/40470. + * On amd64, install 32bit libraries into /lib32 and /usr/lib32. + * lib32gcc1, lib32gomp1, lib32stdc++6: Conflict with libc6-i386 (= 2.9-15), + libc6-i386 (= 2.9-16). + * Handle serialver alternative in -jdk install scripts, not in -jre-headless. + + -- Matthias Klose Fri, 19 Jun 2009 01:36:00 +0200 + +gcc-4.4 (4.4.0-6) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20090612 from the gcc-4_4-branch (r148433). + - Fixes PR c++/38064, PR c++/40139, PR target/40017, PR target/40266, + PR bootstrap/40027, PR tree-optimization/40087, PR target/39856, + PR rtl-optimization/40105, PR target/39942, PR middle-end/40204, + PR debug/40109, PR tree-optimization/39999, PR libfortran/37754, + PR fortran/22423, PR libfortran/39667, PR libfortran/39782, + PR libfortran/38668, PR libfortran/39665, PR libfortran/39702, + PR libfortran/39709, PR libfortran/39665i, PR libgfortran/39664, + PR fortran/38654, PR libfortran/37754, PR libfortran/37754, + PR libfortran/25561, PR libfortran/37754, PR middle-end/40291, + PR target/40017, PR middle-end/40340, PR c++/40308, PR c++/40311, + PR c++/40306, PR c++/40307, PR c++/40370, PR c++/40372, PR c++/40373, + PR c++/40381, PR fortran/40019, PR fortran/39893. + * gcj-4.4-jdk: Depend on libecj-java-gcj instead of libecj-java. + * Let gjdoc --version use the Configuration class instead of + version.properties (Alexander Sack). LP: #385682. + * Preserve libgcc_s.so linker scripts. Closes: #532263. + + [Ludovic Brenta] + * debian/patches/ppc64-ada.dpatch, + debian/patches/ada-mips.dpatch, + debian/patches/ada-mipsel.dpatch: remove, merged upstream. + * debian/patches/*ada*.dpatch: + - rename to *.diff; + - remove the dpatch prologue shell script + - refresh with quilt -p ab and without time stamps + - adjust to GCC 4.4 + * debian/patches/ada-library-project-files-soname.diff, + debian/patches/ada-polyorb-dsa.diff, + debian/patches/pr39856.diff: new. + * debian/rules.patch: adjust accordingly. + * debian/rules.defs: re-enable Ada. + * debian/rules2: do a lean bootstrap when building Ada. + * debian/rules.d/binary-ada.mk: do not build gnatbl or gprmake anymore, + removed upstream. + + -- Matthias Klose Fri, 12 Jun 2009 18:34:13 +0200 + +gcc-4.4 (4.4.0-5) unstable; urgency=medium + + * Update to SVN 20090517 from the gcc-4_4-branch (r147630). + - Fixes PR tree-optimization/40062, PR middle-end/39986, + PR middle-end/40057, PR fortran/39879, PR libstdc++/40038, + PR middle-end/40035, PR target/37179, PR middle-end/39666, + PR tree-optimization/40074, PR fortran/40018, PR fortran/38863, + PR middle-end/40147, PR fortran/40018, PR target/40153. + + [ Matthias Klose ] + * Update libstdc++ symbols files. + * Update libgcc, libobjc, libstdc++ symbols files for armel. + * Fix version symlink in gcc_lib_dir. Closes: #527837. + * Fix symlinks for javac and header files in /usr/lib/jvm. + Closes: #528084. + * Don't build the stage1 compiler with -O with recent binutils (trunk). + * Revert doing link tests to check for the atomic builtins, disabling + exception propagation support in libstdc++ on armel. See PR40133, PR40134. + * On mips/mipsel don't run the java testsuite with -mabi=64. + * Default to armv4 for the gcc-snapshot package as well. Closes: #523936. + * Mention GCC trunk in the gcc-snapshot package description. Closes: #526309. + * Remove unneed '..' elements from symlinks in JAVA_HOME. + * Fix some lintian warnings for gcc-snapshot. + + [ Arthur Loiret ] + * Add missing dir separator to multiarch path. Closes: #527537. + + -- Matthias Klose Sun, 17 May 2009 11:15:52 +0200 + +gcc-4.4 (4.4.0-4) unstable; urgency=medium + + * Update to SVN 20090506 from the gcc-4_4-branch (r147161). + - Fixes PR rtl-optimization/39914, PR testsuite/39776, + PR tree-optimization/40022, PR libstdc++/39909. + + [ Matthias Klose ] + * gcc-4.4-source: Don't depend on gcc-4.4-base, depend on quilt + and patchutils. + * On armel, link the shared libstdc++ with both -lgcc_s and -lgcc. + * Update libgcc and libstdc++ symbol files for mips and mipsel. + * Update libstdc++ symbol files for armel and hppa, adding symbols + for exception propagation support. + * Add ARM EABI symbols to libstdc++ symbol files for armel. + * Add libobjc symbols file for armel. + * Fix PR libstdc++/40038, missing ceill/tanhl symbols in libstdc++. + + [ Aurelien Jarno ] + * Fix libc name for biarch packages on kfreebsd-amd64. + + -- Matthias Klose Wed, 06 May 2009 15:10:36 +0200 + +gcc-4.4 (4.4.0-3) unstable; urgency=low + + * libstdc++-doc: Install the man pages again. + * Fix build configuration for the GC enabled ObjC runtime library. + * Fix thinko in autotools_files, resulting in autoconf not run in + some cases. + * Do link tests to check for the atomic builtins, enables exception + propagation support in libstdc++ on armel and hppa. + + -- Matthias Klose Sun, 03 May 2009 23:38:56 +0200 + +gcc-4.4 (4.4.0-2) unstable; urgency=low + + [ Samuel Thibault ] + * Enable java build on the hurd. + + [ Matthias Klose ] + * libobjc2.symbols.armel: Remove, use the default one. + * Address PR libstdc++/39491, removing __signbitl from the libstdc++6 + symbols file on hppa. + * libstdc++6.symbols.armel: Fix error introduced with copy from the + arm symbols file. + * libstdc++6.symbols.*: Don't assume exception propagation support + enabled for all architectures (although it should on armel, hppa, + sparc). + * Disable the build of the ObjC garbage collection library on mips*, + working around a build failure. + + -- Matthias Klose Sat, 02 May 2009 14:22:35 +0200 + +gcc-4.4 (4.4.0-1) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20090429 from the gcc-4_4-branch (r146989). + * Configure java enabled builds with --enable-java-home. + * Integrate the bits previously found in java-gcj-compat. + * Rename the packages using the naming schema used for OpenJDK: + gcj-X.Y-{jre-headless,jre,jre-lib,jdk,source}. The packages + {gij,gcj,gappletviewer}-X.Y and libgcjN-{jar,source} are gone. + * Build the libgcj documentation with the just built gjdoc. + * Don't use profiled bootstrap when building the gcj source. + * Apply proposed patch for PR target/39856. + * Fix some lintian warnings. + * Don't include debug symbols for libstdc++.so.6, if the library is + built by a newer GCC version. + * Adjust hrefs to point to the local libstdc++ documentation. LP: #365414. + * Update libgcc, libgfortran, libobjc, libstdc++ symbol files. + * gcc-4.4: Include libssp_nonshared.a. + * For ix86, set the java architecture directory to i386. + + [ Samuel Thibault ] + * Update Hurd changes. + * Configure with --enable-clocale=gnu on hurd-i386. + * debian/patches/hurd-pthread.diff: Reapply. + + -- Matthias Klose Thu, 30 Apr 2009 00:30:20 +0200 + +gcc-4.4 (4.4.0-1~exp2) experimental; urgency=low + + * Update to SVN 20090423 from the gcc-4_4-branch. + + [ Aurelien Jarno ] + * kbsd-gnu.diff: remove parts merged upstream. + + [ Matthias Klose ] + * Remove conflicts/replaces for *-spu packages. + * Configure the spu cross compiler without --with-sysroot and + --enable-multiarch. + * Fix and reenable the gfortran-spu build. + * Work around build failures with missing libstdc++ baseline files. + * Install gjdoc man page. + * Fix java configuration with --enable-java-home and include symlinks + for JAVA_HOME in /usr/lib/jvm. + * Apply proposed fix for PR middle-end/39794. + * Install libstdc++ man pages with suffix .3cxx instead of .3. + Closes: #525244. + * lib*stdc++6-{dbg,doc}: Add conflicts to the corresponding 4.3 packages. + + -- Matthias Klose Thu, 23 Apr 2009 18:11:49 +0200 + +gcc-4.4 (4.4.0-1~exp1) experimental; urgency=low + + * Final GCC 4.4.0 release. + + * Don't build the Fortran SPU cross compiler, currently broken. + * spu cross build: Build without spucache and spumea64. + * Configure --with-arch-32=i486 on amd64, i386, and kfreebsd-{amd64,i386}, + --with-arch-32=i586 on hurd-i386, --with-cpu=atom on lpia. + * Build using profiled bootstrap. + * Remove the gcc-4.4-base.postinst. Addresses: #524708. + * Update debian/copyright: Include runtime library exception, remove + D and Phobas license. + * Apply proposed patch for PR libstdc++/39491, missing symbol in libstdc++ + on hppa. + * Remove unsused soft-fp functions in the 64bit libgcc on powerpc (PR39828). + * Update NEWS files for 4.4. + * Build again libgfortran for the non-default multilib configuration. + * Restore missing chunks in note-gnu-stack.diff, lost during the conversion + to quilt. + + -- Matthias Klose Wed, 22 Apr 2009 00:53:16 +0200 + +gcc-4.4 (4.4-20090418-1) experimental; urgency=low + + * Update to SVN 20090418 from the gcc-4_4-branch. + + [ Arthur Loiret ] + * Update patches: + - boehm-gc-nocheck, cross-include, libjava-rpath, link-libs: + Rebase on trunk. + - gcc-m68k-pch, libjava-debuginfo, libjava-loading-constraints: + Remove, merged in trunk. + - cell-branch, cell-branch-doc: Remove, there is no upstream cell 4.4 + branch yet. + - gdc-fix-build-kbsd-gnu, svn-gdc-updates, gpc-4.1, gpc-gcc-4.x, + gpc-names: Remove, gpc and gdc are not ported to GCC 4.4 yet. + - svn-class-updates, svn-doc-updates, svn-updates: Make empty. + - Refresh all others, and convert them all to quilt. + + * Build system improvements: + - Partial rewrite/refactor of rules files. + - Switch patch system to quilt. + - Autogenerate debian/copyright. + - Use the autoconf2.59 package. + + * multilib/multiarch support improvements: Closes: #369064, #484589. + - mips-triarch.diff: Replace with a newer version (approved upstream). + - s390-biarch.diff: Ditto. + - debian/rules2: Configure with --enable-targets=all on mips-linux, + mipsel-linux and s390-linux. + - gcc-multiarch.diff: New, add multiarch include directories and + libraries path to the system paths. + - debian/rules2: Configure with --enable-multiarch. Configure spu build + with --with-multiarch-defaults=spu-elf. + - multiarch-include.diff: Remove. + - debian/multiarch.inc: Ditto. + + * cross-compilers changes: + - Never build a separated -base package, don't symlink any doc dir. + - Build gobjc again. + + * Run the 64-bit tests with -mabi=64 instead of -m64 on mips/mipsel to + hopefully fix the massive failure. + * Always set $(distribution) to "Debian" on mips/mipsel, workarounds FTBFS + on those archs due to a kernel bug triggered by lsb_release call. + Adresses: #524416. + * debian/rules.patch: Only apply the ada-nobiarch-check patch when ada is + enabled. Remove gpc and gdc patches. + * debian/rules.unpack (install_autotools_stamp): Remove. + * debian/rules.defs (configure_dependencies): Remove autotools dependency. + * debian/rules.conf: Add a copyright-file target. + * debian/control.m4: Build-Depends on autoconf2.59 and patchutils. + Make gcc-4.4-source Depends on autoconf2.59. + Add myself to Uploaders. + * debian/rules.d/binary-source.mk: Don't build and install an embedded + copy or autoconf2.59 in gcc-4.4-source. + * debian/copyright.in: New. + + [ Matthias Klose ] + * Build gcj on hppa. + * Add support to build vfp optimized runtime libraries on armel. + * gcc-4.4-spu: Depend on newlib-spu. + * Fix sections of -dbg and java packages. + * gcc-default-ssp.dpatch: Set the default as well, when calling the + preprocessor. LP: #346126. + * Build-depend on quilt. + * Keep the copyright file in the archive. + * Remove conflict of the gcc-X.Y-source packages. + * Update removal of gfdl doc files for 4.4. + * Don't re-run the autotools (introduced with the switch to quilt). + * On arm and armel, install the arm_neon.h header. LP: #360819. + * When hardening options are turned on by default, patch the testsuite + to handle the hardening defaults (Kees Cook). + * Only run the patch target once. Avoids multiple autotool runs, but + doesn't reflect changes in the series file anymore. + * libgcj-doc: Fix documentation title. + * Fix gcj source build with recent build changes. + * Don't check for libraries in DEB_BUILD_OPTIONS/nolang. + * gappletviewer: Include missing binary. + + [ Aurelien Jarno ] + * Remove: patches/kbsd-gnu-ada.dpatch (merged upstream). + * kbsd-gnu.diff: add fix for stuff broken by upstream. + + -- Matthias Klose Mon, 20 Apr 2009 01:34:26 +0200 + +gcc-4.4 (4.4-20090317-1) experimental; urgency=low + + * Initial upload of GCC-4.4, based on trunk 20090317 (r144904). + + [Matthias Klose] + * Branch from the gcc-4.3 packaging. + * Remove *-trunk patches, update remaining patches for the trunk. + * Remove patches integrated upstream: libobjc-gc-link, libjava-file-support, + libjava-realloc-leak, libjava-armel-ldflags, libstdc++-symbols-hppa, + gcc-m68k-pch, libjava-extra-cflags, libjava-javah-bridge-tgts, + hppa-atomic-builtins, armel-atomic-builtins, libssp-gnu, libobjc-armel, + gfortran-armel-updates, sparc-biarch, libjava-xulrunner-1.9. + * Update patches for 4.4, mostly using the patches converted for quilt by + Arthur Loiret. + * debian/patches/libjava-soname.dpatch: Remove, unmodifed upstream library. + * debian/patches/gcc-driver-extra-langs.dpatch: Search Ada files in subdir. + * debian/rules.unpack, debian/rules.d/binary-source.mk: Update for included + autoconf tarball. + * debian/rules.d/binary-{gcc,java}.mk: Install new header files. + * debian/libgfortran3.symbols.common: Remove symbol not generated by + gfortran (__iso_c_binding_c_f_procpointer@GFORTRAN_1.0), PR38871. + * debian/rules.conf: Update for 4.4. + * Fix build dependencies and configure options for 4.4, which were applied + for snapshot builds only. + + [Arthur Loiret] + * Update patches from debian/patches: + - Remove backported fixes: + PR ada: pr10768.dpatch, pr15808.dpatch, pr15915.dpatch, pr16086.dpatch, + pr16087.dpatch, pr16098.dpatch, pr17985.dpatch, pr18680.dpatch, + pr22255.dpatch, pr22387.dpatch, pr28305.dpatch, pr28733.dpatch, + pr29015.dpatch, pr30740.dpatch, pr30827.dpatch pr33688.dpatch, + pr34466.dpatch, pr35050.dpatch, pr35792.dpatch. + PR target: pr27880.dpatch, pr28102.dpatch, pr30961.dpatch, + pr35965.dpatch, pr37661.dpatch. + PR libgcj: pr24170.dpatch, pr35020.dpatch. + PR gcov-profile: pr38292.dpatch. + PR other: pr28322.dpatch. + * debian/rules.patch: Update. + * debian/symbols/libgomp1.symbols.common: Add new symbols from OpenMP 3.0. + + -- Matthias Klose Tue, 17 Mar 2009 02:28:01 +0100 + +gcc-4.3 (4.3.3-5) unstable; urgency=low + + Merge from gnat-4.3 (4.3.3-1): + + [Petr Salinger] + * debian/patches/ada-libgnatprj.dpatch: enable support for GNU/kFreeBSD. + Fixes: #512277. + + [Ludovic Brenta] + * debian/patches/ada-acats.dpatch: attempt to fix ACATS tests (not entirely + successful yet). + * New upstream version. Fixes: #514565. + + [Matthias Klose] + * Update to SVN 20090301 from the gcc-4_3-branch. + - Fix PR c/35446, PR c++/38950, PR fortran/38852, PR fortran/39006, + PR c++/39225 (closes: #516727), PR c++/38950, PR target/38056, + PR target/39228, PR middle-end/36578, PR inline-asm/39058, + PR middle-end/37861. + * Don't provide the 4.3.2 symlink in gcc_lib_dir anymore. + * Require binutils-2.19.1. + + -- Matthias Klose Sun, 01 Mar 2009 14:18:09 +0100 + +gcc-4.3 (4.3.3-4) unstable; urgency=low + + * Fix Fix PR gcov-profile/38292 (wrong profile information), taken + from the trunk. + * Update to SVN 20090215 from the gcc-4_3-branch. + Fix PR c/35435, PR tree-optimization/39100, PR rtl-optimization/39076, + PR c/35433, PR tree-optimization/39041, PR target/38988, + PR middle-end/38969, PR c++/36897, PR c++/39054, PR c/39035, PR c/35434, + PR c/36432, PR target/38991, PR c/39084, PR target/39118. + * Reapply the fix for PR middle-end/38615. + * Include autoconf-2.59 sources into the source package, and install as + part of the gcc-4.3-source package. + * Explicitely use autoconf-1.9. + * Disable building the gcjwebplugin. + * Don't configure with --enable-cld on amd64 and i386. + + -- Matthias Klose Sun, 15 Feb 2009 23:40:09 +0100 + +gcc-4.3 (4.3.3-3) unstable; urgency=medium + + * Revert fix for PR middle-end/38615. Closes: #513420. + + -- Matthias Klose Thu, 29 Jan 2009 07:05:15 +0100 + +gcc-4.3 (4.3.3-2) unstable; urgency=low + + * Update to SVN 20090127 from the gcc-4_3-branch. + - Fix PR tree-optimization/38359. Closes: #492505. + - Fix PR tree-optimization/38932 (ice-on-valid-code), PR target/38931 + (ice-on-valid-code), PR rtl-optimization/38879 (wrong-code), + PR c++/23287 (rejects-valid), PR fortran/38907 (ice-on-valid-code), + PR fortran/38859 (wrong-code), PR fortran/38657 (rejects-valid), + PR fortran/38672 (ice-on-valid-code). + * Fix PR middle-end/38969, taken from the trunk. Closes: #513007. + + -- Matthias Klose Tue, 27 Jan 2009 23:42:45 +0100 + +gcc-4.3 (4.3.3-1) unstable; urgency=low + + * GCC-4.3.3 release (no changes compared to the 4.3.2-4 upload). + * Fix PR middle-end/38615 (wrong code, taken from the trunk). + + -- Matthias Klose Sat, 24 Jan 2009 14:43:09 +0100 + +gcc-4.3 (4.3.2-4) unstable; urgency=medium + + * Update to SVN 20090119 from the gcc-4_3-branch. + - Fix PR tree-optimization/36765 (wrong code). + * Remove patch for PR 34571, applied upstream (fix build failure on alpha). + * Apply proposed patch for PR middle-end/38902 (wrong code). + + -- Matthias Klose Tue, 20 Jan 2009 00:22:41 +0100 + +gcc-4.3 (4.3.2-3) unstable; urgency=low + + * Update to SVN 20090117 from the gcc-4_3-branch (4.3.3 release candidate). + - Fix PR target/34571, PR debug/7055, PR tree-optimization/37194, + PR tree-optimization/38529, PR fortran/38763, PR fortran/38765, + PR fortran/38669, PR fortran/38487, PR fortran/35681, PR fortran/38657, + PR c++/36019, PR c++/31488, PR c++/37646, PR c++/36334, PR c++/38357, + PR c++/31260, PR c++/38877, PR libstdc++/36801, PR libgcj/38396. + - debian/patches/libgcj-bc.dpatch: Remove, applied upstream. + * Fix PR middle-end/38616 (wrong code with -fstack-protector). + * Update backport for PR28322 (Gunther Nikl). + + -- Matthias Klose Sat, 17 Jan 2009 21:09:35 +0100 + +gcc-4.3 (4.3.2-2) unstable; urgency=low + + * Update to SVN 20090110 from the gcc-4_3-branch. + - Fix PR target/36654, PR tree-optimization/38752, PR fortran/38675, + PR fortran/37469, PR libstdc++/38000. + + -- Matthias Klose Sat, 10 Jan 2009 18:32:34 +0100 + +gcc-4.3 (4.3.2-2~exp5) experimental; urgency=low + + * Adjust build-dependencies for cross builds. Closes: #499998. + * Update to SVN 20081231 from the gcc-4_3-branch. + - Fix PR middle-end/38565, PR target/38062, PR bootstrap/38383, + PR target/38402, PR testsuite/35677, PR tree-optimization/38478, + PR target/38054, PR middle-end/29056, PR testsuite/28870, + PR target/38254. + - Fix PR libstdc++/37144, PR c++/37582, PR libstdc++/38080. + - Fix PR fortran/38602, PR fortran/38602, PR fortran/38487, + PR fortran/38113, PR fortran/35983, PR fortran/35937, PR testsuite/36889. + * Update the spu cross compiler from the cell-gcc-4_3-branch 20081217. + * debian/patches/libobjc-armel.dpatch: Don't define EH_USES. + * Apply the Atomic builtins patch for PARISC. + + -- Matthias Klose Thu, 18 Dec 2008 00:34:46 +0100 + +gcc-4.3 (4.3.2-2~exp4) experimental; urgency=low + + * Update to SVN 20081130 from the gcc-4_3-branch. + - Fix PR bootstrap/33304, PR middle-end/37807, PR middle-end/37809, + PR rtl-optimization/37489, PR target/35574, PR c/37924, + PR tree-optimization/37879, PR middle-end/37858, PR middle-end/37870, + PR target/38016, PR target/37939, PR rtl-optimization/37769, + PR target/37909, PR fortran/37597, PR fortran/35820, PR fortran/37445, + PR fortran/PR35769, PR fortran/37903, PR fortran/37749. + - Fix PR target/37640, PR tree-optimization/37868, PR bootstrap/33100, + PR other/38214, PR c++/37142, PR c++/35405, PR c++/37563, PR c++/38030, + PR c++/37932, PR c++/38007. + - Fix PR fortran/37836, PR fortran/38171, PR fortran/35681, + PR fortran/37792, PR fortran/37926, PR fortran/38033, PR fortran/36526. + - Fix PR target/38287. Closes: #506713. + * Atomic builtins using kernel helpers for PARISC and ARM Linux/EABI, taken + from the trunk. + + -- Matthias Klose Mon, 01 Dec 2008 01:29:51 +0100 + +gcc-4.3 (4.3.2-2~exp3) experimental; urgency=low + + * Update to SVN 20081117 from the gcc-4_3-branch. + * Add build dependencies on spu packages for snapshot builds. + * Add build dependency on libantlr-java for snapshot builds. + * Disable fortran on spu for snapshot builds. + * Add dependency on binutils-{hppa64,spu} for snapshot builds. + + -- Matthias Klose Mon, 17 Nov 2008 21:57:51 +0100 + +gcc-4.3 (4.3.2-2~exp2) experimental; urgency=low + + * Update to SVN 20081023 from the gcc-4_3-branch. + - General regression fixes: PR rtl-optimization/37882 (wrong code), + - Fortran regression fixes: PR fortran/37787, PR fortran/37723. + * Use gij-4.3 for builds in java maintainer mode. + * Don't run the testsuite with -fstack-protector for snapshot builds. + * Update the spu cross compiler from the cell-gcc-4_3-branch 20081023. + Don't disable multilibs, install additional components in the gcc-4.3-spu + package. + * Enable building the spu cross compiler for powerpc and ppc64 snapshot + builds. + * Apply proposed patch for PR tree-optimization/37868 (wrong code). + * Apply proposed patch to parallelize make check. + * For biarch builds, disable the gnat testsuite for the non-default + architecture (no biarch support in gnat yet). + + -- Matthias Klose Thu, 23 Oct 2008 22:06:38 +0200 + +gcc-4.3 (4.3.2-2~exp1) experimental; urgency=low + + * Update to SVN 20081017 from the gcc-4_3-branch. + - General regression fixes: PR rtl-optimization/37408 (wrong code), + PR tree-optimization/36630, PR tree-optimization/37102 (wrong code), + PR c/35437 (ice on invalid code), PR middle-end/37731 (wrong code), + PR target/37603 (wrong code, hppa), PR tree-optimization/35737 (ice on + valid code), PR middle-end/36575 (wrong code), PR c/37645 (ice on valid + code), PR tree-optimization/37539 (compile time hog), PR middle-end/37236 + (ice on invalid code), PR tree-optimization/36343 (wrong code), + PR rtl-optimization/37544 (wrong code), PR target/35620 (ice on valid + code), PR target/35713 (ice on valid code, wrong code), PR c/35712 (wrong + code), PR target/37466 (wrong code, AVR). + - C++ regression fixes: PR c++/37389 (LP: #252301), PR c++/37555 (ice on + invalid code). + - Fortran regression fixes: PR fortran/37199, PR fortran/36214, + PR fortran/35770, PR fortran/36454, PR fortran/36374, PR fortran/37274, + PR fortran/37583, PR fortran/36700, PR fortran/35945, PR fortran/37626, + PR fortran/37504, PR fortran/37580, PR fortran/37706, PR fortran/35680, + PR fortran/37794. + * Remove obsolete patches: ada-driver.dpatch, pr33148.dpatch. + * Fix naming of bridge targets in gjavah (wrong header generation). + * Fix PR target/37661, SPARC64 int-to-TFmode conversions. + * Include the complete test summaries in a binary package, to allow + regression checking from the previous build. + * Tighten inter-package dependencies to (>= 4.3.2-1). + * Drop the 4.3.1 symlink in gcc_lib_dir, add a 4.3.3 symlink to 4.3. + + -- Matthias Klose Fri, 17 Oct 2008 23:26:50 +0200 + +gcc-4.3 (4.3.2-1) unstable; urgency=medium + + [Matthias Klose] + * Final gcc-4.3.2 release (regression fixes). + - Remove the generated install docs from the tarball (GFDL licensed). + - C++ regression fixes: PR debug/37156. + - general regression fixes: PR debug/37156, PR target/37101. + - Java regression fixes: PR libgcj/8995. + * Update to SVN 20080905 from the gcc-4_3-branch. + - C++ regression fixes: PR c++/36741 (wrong diagnostic), + - general regression fixes: PR target/37184 (ice on valid code), + PR target/37191 (ice on valid code), PR target/37197 (ice on valid code), + PR middle-end/36817 (ice on valid code), PR middle-end/36548 (wrong code), + PR middle-end/37125 (wrong code), PR c/37261 (wrong diagnostic), + PR target/37168 (ice on valid code), PR middle-end/36449 (wrong code), + PR middle-end/37248 (missed optimization), PR target/36332 (wrong code). + - Fortran regression fixes: PR fortran/37193 (rejects valid code). + * Move symlinks in gcc_lib_dir from cpp-4.3 to gcc-4.3-base. Closes: #497369. + * Don't build-depend on autogen on architectures where it is not installable + (needed for the fixincludes testsuite only); don't build-depend on it for + source packages not running the fixincludes testsuite. + + [Ludovic Brenta] + * Add sdefault.ads to libgnatprj4.3-dev. Fixes: #492866. + * turn gnatvsn.gpr and gnatprj.gpr into proper library project files. + * Unconditionally build-depend on gnat when building gnat-4.3. + Fixes: #487564. + * (debian/rules.d/binary-ada.mk): Add a symlink libgnat.so to + /usr/lib/libgnat-4.3.so in the adalib directory. Fixes: #493814. + * (debian/patches/ada-sjlj.dpatch): remove dangling symlinks from all + adalib directories. + * debian/patches/ada-alpha.dpatch: remove, applied upstream. + + [Samuel Tardieu, Ludovic Brenta] + * debian/patches/pr16086.dpatch: new; backport from GCC 4.4. + Closes: #248172. + * debian/patches/pr35792.dpatch: new; backport from GCC 4.4. + * debian/patches/pr15808.dpatch (fixes: #246392), + debian/patches/pr30827.dpatch: new; backport from the trunk. + + -- Matthias Klose Fri, 05 Sep 2008 22:52:58 +0200 + +gcc-4.3 (4.3.1-9) unstable; urgency=low + + * Update to SVN 20080814 from the gcc-4_3-branch. + - C++/libstdc++ regression fixes: PR c++/36688, PR c++/37016, PR c++/36999, + PR c++/36405, PR c++/36767, PR c++/36852. + - general regression fixes: PR target/36613, PR rtl-optimization/36998, + PR middle-end/37042, PR middle-end/35432, PR target/35659, + PR middle-end/37026, PR middle-end/36691, PR tree-optimization/36991, + PR rtl-optimization/35542, PR bootstrap/35752, PR rtl-optimization/36419, + PR debug/36278, PR preprocessor/36649, PR rtl-optimization/36929, + PR tree-optimization/36830, PR c/35746, PR middle-end/37014, + PR middle-end/37103. + - Fortran regression fixes: PR fortran/36132. + - Java regression fixes: PR libgcj/31890. + - Fixes PR middle-end/37090. Closes: #494815. + + -- Matthias Klose Thu, 14 Aug 2008 18:02:52 +0000 + +gcc-4.3 (4.3.1-8) unstable; urgency=low + + * Undo Revert PR tree-optimization/36262 on i386 (PR 36917 is invalid). + + -- Matthias Klose Fri, 25 Jul 2008 21:47:52 +0200 + +gcc-4.3 (4.3.1-7) unstable; urgency=low + + * Update to SVN 20080722 from the gcc-4_3-branch. + - Fix PR middle-end/36811, infinite loop building with -O3. + - C++/libstdc++ regression fixes: PR c++/36407, PR c++/34963, + PR libstdc++/36832, PR libstdc++/36552, PR libstdc++/36729. + - Fortran regression fixes: PR fortran/36366, PR fortran/36824. + - general regression fixes: PR middle-end/36877, PR target/36780, + PR target/36827, PR rtl-optimization/35281, PR rtl-optimization/36753, + PR target/36827, PR target/36784, PR target/36782, PR middle-end/36369, + PR target/36780, PR target/35492, PR middle-end/36811, + PR rtl-optimization/36419, PR target/35802, PR target/36736, + PR target/34780. + * Revert PR tree-optimization/36262 on i386, causing miscompilation of + OpenJDK hotspot. + * gij/gcj: Don't remove alternatives on upgrade. Addresses: #479950. + + -- Matthias Klose Tue, 22 Jul 2008 23:55:54 +0200 + +gcc-4.3 (4.3.1-6) unstable; urgency=low + + * Start the logwatch script on alpha as well to avoid timeouts in + the testsuite. + + -- Matthias Klose Mon, 07 Jul 2008 11:31:58 +0200 + +gcc-4.3 (4.3.1-5) unstable; urgency=low + + * Update to SVN 20080705 from the gcc-4_3-branch. + - Fix PR target/36634, wrong-code on powerpc with -msecure-plt. + * Fix PR target/35965, PIC + -fstack-protector on arm/armel. Closes: #469517. + * Don't run the libjava testsuite with -mabi=n32. + * Update patch for PR other/28322, that unknown -Wno-* options do not + cause errors, but warnings instead. + * On m68k, add -fgnu89-inline when in gnu99 mode (requested by Michael + Casadeval for the m68k port). Closes: #489234. + + -- Matthias Klose Sun, 06 Jul 2008 01:39:30 +0200 + +gcc-4.3 (4.3.1-4) unstable; urgency=low + + * Revert: debian/patches/gcc-multilib64dir.dpatch: Remove obsolete patch. + * Remove obsolete multiarch-lib patch. + + -- Matthias Klose Mon, 30 Jun 2008 23:05:17 +0200 + +gcc-4.3 (4.3.1-3) unstable; urgency=medium + + [Arthur Loiret] + * debian/rules2: + - configure sh4-linux with --with-multilib-list=m4,m4-nofpu + and --with-cpu=sh4. + - configure sparc-linux with --enable-targets=all on snapshot builds + (change already in 4.3.1-1). + * debian/rules.patch: Don't apply sh4-multilib.dpatch. + + [Matthias Klose] + * Update to SVN 20080628 from the gcc-4_3-branch. + - Fix PR target/36533, wrong-code with incorrectly assumed aligned_operand. + Closes: #487115. + * debian/rules.defs: Remove hurd-i386 from ssp_no_archs (Samuel Thibault). + Closes: #483613. + * Do not create a /usr/lib/gcc//4.3.0 symlink. + * debian/patches/gcc-multilib64dir.dpatch: Remove obsolete patch. + * libjava/classpath: Set and use EXTRA_CFLAGS (taken from the trunk). + + -- Matthias Klose Sat, 28 Jun 2008 16:00:38 +0200 + +gcc-4.3 (4.3.1-2) unstable; urgency=low + + * Update to SVN 20080610 from the gcc-4_3-branch. + - config.gcc: Fix quoting for in the enable_cld test. + * Use GNU locales on hurd-i386 (Samuel Thibault). Closes: #485395. + * libstdc++-doc: Fix URL's for locally installed docs. Closes: #485133. + * libjava: On armel apply kludge to fix unwinder infinitely looping 'til + it runs out of memory. + * Adjust dependencies to require GCC 4.3.1. + + -- Matthias Klose Wed, 11 Jun 2008 00:35:38 +0200 + +gcc-4.3 (4.3.1-1) unstable; urgency=high + + [Samuel Tardieu, Ludovic Brenta] + * debian/patches/pr16087.dpatch: new. Fixes: #248173. + * Correct the patches from the previous upload. + + [Ludovic Brenta] + * debian/patches/ada-acats.dpatch: really run the just-built gnat, not the + bootstrap gnat. + * debian/rules2: when running the Ada test suite, do not run the multilib + tests as gnat does not support multilib yet. + * Run the ACATS testsuite again (patch it so it correctly finds gnatmake). + + [Thiemo Seufer] + * debian/patches/ada-libgnatprj.dpatch, + debian/patches/ada-mips{,el}.dpatch: complete support for mips and mipsel. + Fixes: #482433. + + [Matthias Klose] + * GCC-4.3.1 release. + * Do not include standard system paths in libgcj pkgconfig file. + * Suggest the correct libmudflap0-dbg package. + * Fix PR libjava/35020, taken from the trunk. + * Apply proposed patch for PR tree-optimization/36343. + * On hurd-i386 with -fstack-protector do not link with libssp_nonshared + (Samuel Thibault). Closes: #483613. + * Apply proposed patch for PR tree-optimization/34244. + * Remove debian-revision in symbols files. + * Fix installation of all biarch -multilib packages which are not triarch. + * Fix some lintian warnings. + * Include library symlinks in gobjc and gfortran multilib packages, when + not building the library packages. + * Fix sections in doc-base files. + * Don't apply the sparc-biarch patch when building the gcc-snapshot package. + * libjava: Add @file support for gjavah & gjar. + * Apply patch for PR rtl-optimization/36111, taken from the trunk. + + * Closing reports reported against gcc-4.0 and fixed in gcc-4.3: + - General + + Fix PR optimization/3511, inlined strlen() could be smarter. + Close: #86251. + - C + + Fix PR c/9072, Split of -Wconversion in two different flags. + Closes: #128950, #226952. + - C++/libstdc++ + + PR libstdc++/24660, implement versioning weak symbols in libstdc++. + Closes: #328421. + - Architecture specific: + - mips + + PR target/26560, unable to find a register to spill in class + 'FP_REGS'. Closes: #354439. + - sparc + + Fix PR rtl-optimization/23454, ICE in invert_exp_1. Closes: #340951. + * Closing reports reported against gcc-4.1 and fixed in gcc-4.2: + - General + + PR tree-optimization/30132, ICE in find_lattice_value. Closes: #400484. + + PR other/29534, ICE in "gcc -O -ftrapv" with decreasing array index. + Closes: #405065. + + Incorrect SSE2 code generation for vector initialization. + Closes: #406442. + + Fix segfault in cc1 due to infinite loop in error() when using -ftrapv. + Closes: #458072. + + Fix regression in code size with -Os compared to GCC-3.3. + Closes: #348298. + - C++ + + Fix initialization of global variables with non-constant initializer. + Closes: #446067. + + Fix ICE building muse. Closes: #429385. + * Closing reports reported against gcc-4.1 and fixed in gcc-4.3: + - C++ + + PR c++/28705, ICE: in type_dependent_expression_p. Closes: #406324. + + PR c++/7302, -Wnon-virtual-dtor should't complain of protected dtor. + Closes: #356316. + + PR c++/28316, PR c++/24791, PR c++/20133, ICE in instantiate_decl. + Closes: #327346, #355909. + - Fortran + + PR fortran/31639, ICE in gfc_conv_constant. Closes: #401496. + - Java + + Fix ICE using gcj with --coverage. Closes: #416326. + + PR libgcj/29869, LogManager class loading failure. Closes: #399251 + + PR swing/29547 setText (String) of JButton does not work + with HTML code. Closes: #392791. + + PR libgcj/29178, CharsetEncoder.canEncode() gives different results + than Sun version. Closes: #388596. + + PR java/8923, ICE when modifying a variable decleared "final static". + Closes: #351512. + + PR java/22507, segfault building Apache Cocoon. Closes: #318534. + + PR java/2499, class members should be inherited from implemented + interfaces. Closes: #225434. + + PR java/10581, ICE compiling freenet. Closes: #186922. + + PR libgcj/28340, gij ignores -Djava.security.manager. Closes: #421098. + + PR java/32846, build failure on GNU/Hurd. Closes: #408888. + + PR java/29194, fails to import package from project. Closes: #369873. + + PR libgcj/31700, -X options not recognised by JNI_CreateJavaVM. + Closes: #426742. + + java.util.Calendar.setTimeZone fails to set ZONE_OFFSET. + Closes: #433636. + - Architecture specific: + - alpha + + C++, fix segfault in constructor with -Os. Closes: #438436. + - hppa + + PR target/30131, ICE in propagate_one_insn. Closes: #397341. + - m32r + + PR target/28508, assembler error (operand out of range). + Closes: #417542. + - m68k + + PR target/34688, ICE in output_operand. Closes: #459429. + * Closing reports reported against gcc-4.2 and fixed in gcc-4.3: + - General + + PR tree-optimization/33826, wrong code generation for infinitely + recursive functions. Closes: #445536. + - C++ + + PR c++/24791, ICE on invalid instantiation of template's static member. + Closes: #446698. + + [Aurelien Jarno] + * Really apply arm-funroll-loops.dpatch on arm and armel. Closes: #476460. + + -- Matthias Klose Sat, 07 Jun 2008 23:16:21 +0200 + +gcc-4.3 (4.3.0-5) unstable; urgency=medium + + * Update to SVN 20080523 from the gcc-4_3-branch. + - Remove gcc-i386-emit-cld patch. + - On Debian amd64 and i386 configure with --enable-cld. + * Fix PR tree-optimization/36129, ICE with -fprofile-use. + * Add spu build dependencies independent of the architecture. + * Move arm -funroll-loops fix to arm-funroll-loops from + gfortran-armel-updates. Apply it on both arm and armel. + Closes: #476460. + * Use iceape-dev as a build dependency for Java enabled builds. + * Build the sru cross compiler from a separate source dir without applying + the hardening patches. + + -- Matthias Klose Fri, 23 May 2008 10:12:02 +0200 + +gcc-4.3 (4.3.0-4) unstable; urgency=low + + [ Aurelien Jarno ] + * Fix gnat-4.3 build on mips/mipsel. + * Update libgcc1 symbols for hurd-i386. + + [ Arthur Loiret ] + * Make gcc-4.3-spu Recommends newlib-spu. Closes: #476088 + * Build depend on spu build dependencies only when building + as gcc-4.x source package. + * Disable spu for snapshot builds. + * Support sh4 targets: + - sh4-multilib.dpatch: Add, fix multilib (m4/m4-nofpu) for sh4-linux + - multiarch-include.dpatch: Don't apply on sh4. + + [ Matthias Klose ] + * Stop building libffi packages. + * Update to SVN 20080501 from the gcc-4_3-branch. + - Fix PR target/35662, wrong gfortran code on mips/mipsel. Closes: #476427. + - Fixes mplayer build on powerpc. Closes: #475153. + * Stop building gij/gcj on alpha, arm and hppa. Closes: #459560. + * libstdc++6-4.3-doc: Fix file location in doc-base file. Closes: #476253. + * debian/patches/template.dpatch: Remove the `exit 0' line. + * Fix alternative names for amd64 cross builds. Addresses: #466422. + * debian/copyright: Update to GPLv3, remove the text of the GFDL + and reference the copy in common-licenses. + * Generate the locale data for the testsuite, if the locales package + is installed (not a dependency on all archs). + * Update libgcc2 symbols for m68k, libstdc++6 symbols for arm, m68k, mips + and mipsel. + * Do not include a symbols file for libobjc_gc.so. + * Add four more symbols to libgcj_bc, patch taken from the trunk. + * Adjust names of manual pages in the spu build on powerpc. + * ARM EABI (armel) updates (Andrew Jenner, Julian Brown): + - Add Objective-C support. + - Fortran support patches. + - Fix ICE in gfortran.dg/vector_subscript_1.f90 for -Os -mthumb reload. + * Build ObjC and Obj-C++ packages on armel. + * Reenable running the testsuite on m68k. + + [Samuel Tardieu, Ludovic Brenta] + * debian/patches/gnalasup_to_lapack.dpatch: new. + * debian/patches/pr34466.dpatch, + debian/patches/pr22255.dpatch, + debian/patches/pr33688.dpatch, + debian/patches/pr10768.dpatch, + debian/patches/pr28305.dpatch, + debian/patches/pr17985.dpatch (#278685) + debian/patches/pr15915.dpatch, + debian/patches/pr16098.dpatch, + debian/patches/pr18680.dpatch, + debian/patches/pr28733.dpatch, + debian/patches/pr22387.dpatch, + debian/patches/pr29015.dpatch: new; backport Ada bug fixes from GCC 4.4. + * debian/patches/rules.patch: apply them. + * debian/patches/pr35050.dpatch: update. + + [Andreas Jochens] + * debian/patches/ppc64-ada.dpatch: update, adding support for ppc64. + (#476868). + + [Ludovic Brenta] + * Apply ppc64-ada.dpatch whenever we build libgnat, not just on ppc64. + * debian/patches/pr28322.dpatch: never pass -Wno-overlength-strings to + the bootstrap compiler, as the patch breaks the detection of whether + the bootstrap compiler supports this option or not. + Fixes: #471192. Works around #471767. + * Merge Aurélien Jarno's mips patch. Fixes: #472854. + + [ Samuel Tardieu ] + * debian/patches/pr30740.dpatch: new Ada bug fix. + * debian/patches/pr35050.dpatch: new Ada bug fix. + + [ Xavier Grave ] + * debian/patches/ada-mips{,el}.dpatch: new; split mips/mipsel support + into new patches, out of ada-sjlj.dpatch. + * debian/rules.d/binary-ada.mk: fix the version number of libgnarl-4.3.a. + + [Roman Zippel] + * PR target/25343, fix gcc.dg/pch/pch for m68k. + + -- Matthias Klose Thu, 01 May 2008 21:08:09 +0200 + +gcc-4.3 (4.3.0-3) unstable; urgency=medium + + [ Matthias Klose ] + * Update to SVN 20080401 from the gcc-4_3-branch. + - Fix PR middle-end/35705 (hppa only). + * Update libstdc++6 symbols for hurd-i386. Closes: #472334. + * Update symbol files for libgomp (ppc64). + * Only apply the gcc-i386-emit-cld patch on amd64 and i386 architectures. + * Update libstdc++ baseline symbols for hppa. + * Install powerpc specific header files new in 4.3. + * gcc-4.3-hppa64: Don't include the install tools in the package. + + [ Aurelien Jarno ] + * Fix gobjc-4.3-multilib dependencies. Closes: #473455. + * Fix gnat-4.3 build on mips/mipsel. + * patches/ada-alpha.dpatch: new patch to fix gnat-4.3 build on alpha. + Closes: #472852. + * patches/config-ml.dpatch: also check for n32 multidir. + + [ Arthur Loiret ] + * Build-Depends on binutils (>= 2.18.1~cvs20080103-2) on mips and mipsel, + required for triarch. + * libstdc++-pic.dpatch: Update, don't fail anymore if shared lib is disabled. + + [ Andreas Jochens ] + * Fix build failures on ppc64. Closes: #472917. + - gcc-multilib64dir.dpatch: Remove "msoft-float" and "nof" from MULTILIB + variables. + - Removed ppc64-biarch.dpatch. + - Add debian/lib32gfortan3.symbols.ppc64. + + [ Arthur Loiret, Matthias Klose ] + * Build compilers for spu-elf target on powerpc and ppc64. + - Add gcc-4.3-spu, g++-4.3-spu and gfortran-4.3-spu packages. + - Partly based on the work in Ubuntu on the spu toolchain. + + -- Matthias Klose Tue, 01 Apr 2008 23:29:21 +0000 + +gcc-4.3 (4.3.0-2) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20080321 from the gcc-4_3-branch. + - Remove some broken code that attempts to enforce linker + constraints. Closes: #432541. + * Temporary fix, will be removed once a fixed kernel is available + in testing: Emit cld instruction when stringops are used (i386). + Do not expose the -mcld option until added upstream. Closes: #469567. + * Update NEWS files. + * libjava: Don't leak upon failed realloc (taken from the trunk). + * debian/rules2: The build is not yet prepared to take variables from + the environment; unexport and unset those. + + [Arthur Loiret/Aurelien Jarno] + * MIPS tri-arch support: + - mips-triarch.dpatch: new patch to default to o32 and follow the + glibc convention for n32 & 64 bit names. + - Rename $(biarch) and related vars into $(biarch64). + - Fix biarchsubdir to allow triarch. + - Add biarchn32 support. + - Add mips and mipsel to biarch64 and biarchn32 archs. + - Update binary rules for biarchn32 and libn32 targets. + - Fix multilib deps for triarch. + - control.m4: Add libn32 packages. + + -- Matthias Klose Sat, 22 Mar 2008 00:06:33 +0100 + +gcc-4.3 (4.3.0-1) unstable; urgency=low + + [Matthias Klose] + * GCC-4.3.0, final release. + * Update to SVN 20080309 from the gcc-4_3-branch. + * Build from a modified tarball, without GFDL documentation with + invariant sections and cover texts. + * debian/rules.unpack: Avoid make warnings. + * debian/rules.d/binary-cpp.mk: Add 4.3.0 symlink in gcclibdir. + * Stop building treelang (removed upstream). + * gcj-4.3: Hardcode libgcj-bc dependency, don't run dh_shlibdeps on ecj1. + + [Aurelien Jarno] + * Update libssp-gnu.dpatch and reenable it. + + -- Matthias Klose Sun, 09 Mar 2008 15:18:08 +0100 + +gcc-4.3 (4.3.0~rc2-1) unstable; urgency=medium + + * Update to SVN 20080301 from the gcc-4_3-branch. + * Include the biarch libobjc_gc library in the packages. + * Link libobjc_gc with libgcjgc_convenience.la. + * Add new symbols to libstdc++6 symbol files, remove the symbols for + support (reverted upstream for the 4.3 branch). + * Disable running the testsuite on m68k. + * Update PR other/28322, ignore only unknown -W* options. + + -- Matthias Klose Sat, 01 Mar 2008 15:09:16 +0100 + +gcc-4.3 (4.3-20080227-1) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20080227 from the gcc-4_3-branch. + * Fix PR other/28322, GCC new warnings and compatibility. + Addresses: #367657. + + [Hector Oron] + * Fix cross-compile builds. Closes: #467471. + + -- Matthias Klose Thu, 28 Feb 2008 00:30:38 +0100 + +gcc-4.3 (4.3-20080219-1) unstable; urgency=medium + + [Matthias Klose] + * Update to SVN 20080219 from the gcc-4_3-branch. + * Apply proposed patch for PR target/34571 (alpha). + * libgcj9-dev: Don't claim that the package contains the static + libraries. + * libjava-xulrunner1.9.dpatch: Add configure check for xulrunner-1.9. + Name the alternative xulrunner-1.9-javaplugin.so. + * libgcj-doc: Don't include the examples; these cannot be built + with the existing Makefile anyway. Addresses: #449608. + * Manpages for gc-analyze and grmic are GFDL. Don't include these when + building DFSG compliant packages. + * Fix build failure building amd64 cross-target libstdc++ packages + (Tim Bagot). Addresses: #464365. + * Fix typos in rename-info-files patch (Richard Guenther). + * Fix PR libgcj/24170. + + [Aurelien Jarno] + * kbsd-gnu-ada.dpatch: new patch to fix build on GNU/kFreeBSD. + + [Ludovic Brenta] + * debian/rules.defs: Temporarily disable the testsuite when building gnat. + * debian/patches/libffi-configure.dpatch: run autoconf in the top-level + directory, where we've changed configure.ac; not in src/gcc. + * debian/patches/ada-sjlj.dpatch: do not run autoconf since we don't + change configure.ac. + * debian/control.m4 (gnat-4.3-doc): conflict with gnat-4.[12]-doc. + Closes: #464801. + + -- Matthias Klose Tue, 19 Feb 2008 23:20:45 +0000 + +gcc-4.3 (4.3-20080202-1) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20080202 from the trunk. + - Fix PR c/35017, pedwarns about valid code. Closes: #450506. + - Fix PR target/35045, wrong code generation with -O3 on i386. + Closes: #463478. + * gcj-4.3: On armel depend on g++-4.3. + * Re-enable build of libobjc_gc, using the internal version of boehm-gc. + Closes: #212248. + + [Ludovic Brenta] + * debian/patches/ada-default-project-path.dpatch, + debian/patches/ada-gcc-name.dpatch, + debian/patches/ada-symbolic-tracebacks.dpatch, + debian/patches/ada-link-lib.dpatch, + debian/patches/ada-libgnatvsn.dpatch, + debian/patches/ada-libgnatprj.dpatch, + debian/patches/ada-sjlj.dpatch: adjust to GCC 4.3. + * debian/README.gnat, debian/TODO, + debian/rules.d/binary-ada.mk: merge from gnat-4.2. + * debian/README.maintainers: add instructions for patching GCC. + * debian/patches/ada-driver.dpatch: remove, no longer used. + * debian/patches/libffi-configure.dpatch: do not patch the top-level + configure anymore; instead, rerun autoconf. This allows removing the + patch cleanly. + * debian/rules2: use gnatgcc as the bootstrap compiler, not gcc-4.2. + + -- Matthias Klose Sat, 02 Feb 2008 19:58:48 +0100 + +gcc-4.3 (4.3-20080127-1) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20080126 from the trunk. + * Tighten build dependency on doxygen. + * Update libstdc++ patches to current svn. + * gij-4.3: Provide java*-runtime-headless instead of java*-runtime. + + [ Aurelien Jarno] + * debian/multiarch.inc: change mipsel64 into mips64el. + + -- Matthias Klose Sun, 27 Jan 2008 01:33:35 +0100 + +gcc-4.3 (4.3-20080116-1) unstable; urgency=medium + + * Update to SVN 20080116 from the trunk. + * Update debian/watch. + * Build libgomp documentation without building libgomp. Addresses: #460660. + * Handle lzma compressed tarballs. + * Fix dependency generation for the gcc-snapshot package: Addresses: #454667. + * Restore lost chunk in libjava-subdir.dpatch. + + -- Matthias Klose Wed, 16 Jan 2008 20:33:50 +0100 + +gcc-4.3 (4.3-20080112-1) unstable; urgency=low + + * Update to SVN 20080112 from the trunk. + * Tighten build-dependency on dpkg-dev (closes: #458894). + * Update symbol definitions for alpha. + * Build-depend on libmpfr-dev for all source packages. + + -- Matthias Klose Sun, 13 Jan 2008 00:40:28 +0100 + +gcc-4.3 (4.3-20080104-1) unstable; urgency=low + + * Update to SVN 20080104 from the trunk. + * Update symbol definitions for alpha, hppa, ia64, mips, mipsel, powerpc, + s390, sparc. + + -- Matthias Klose Fri, 04 Jan 2008 07:34:15 +0100 + +gcc-4.3 (4.3-20080102-1) unstable; urgency=low + + [ Matthias Klose ] + * Update to SVN 20080102 from the trunk. + - Fix 64bit biarch builds (addresses: #447443). + * debian/rules.d/binary-java.mk: Reorder packaging to get shlibs + dependencies right. + * Use lib instead of lib64 as multilibdir on amd64 and ppc64. + * Build the java plugin always using libxul-dev. + * Add libgcj_bc to the libgcj9-0 shlibs file. + * Add symbol files for libgcc1, lib32gcc1, lib64gcc1, libstdc++6, + lib32stdc++6, lib64stdc++6, libgomp1, lib32gomp1, lib64gomp1, libffi4, + lib32ffi4, lib64ffi4, libobjc2, lib32objc2, lib64objc2, libgfortran3, + lib32gfortran3, lib64gfortran3. + Adjust build dependencies on dpkg-dev and debhelper. + * Do not build the java packages from the gcc-4.3 source package. + + [ Aurelien Jarno ] + * Disable amd64-biarch patch on kfreebsd-amd64. + + -- Matthias Klose Wed, 02 Jan 2008 23:48:14 +0100 + +gcc-4.3 (4.3-20071124-1) experimental; urgency=low + + [ Matthias Klose ] + * Update to SVN 20071124 from the trunk. + * Fix dependencies of lib*gcc1-dbg packages. + * gcjwebplugin: Fix path of the gcj subdirectory. LP: #149792. + * gij-hppa: Call gij-4.2, not gij-4.1. Addresses: #446282. + * Don't run the testsuite on hppa when expect-tcl8.3 is not available. + * Fix libgcc1-dbg doc directory symlink. Closes: #447969. + + [ Aurelien Jarno ] + * Update kbsd-gnu patch. + * Remove kbsd-gnu-ada patch (merged upstream). + + -- Matthias Klose Sat, 24 Nov 2007 13:14:29 +0100 + +gcc-4.3 (4.3-20070930-1) experimental; urgency=low + + [Matthias Klose] + * Update to SVN 20070929 from the trunk. + * Update debian patches to the current trunk. + * Regenerate the control file. + * On powerpc-linux-gnu and i486-linux-gnu cross-compile the 64bit + multilib libraries to allow a sucessful build on 32bit kernels + (our buildds). Although we won't get 64bit test results this way ... + * Remove the build dependency on expect-tcl8.3. + * Fix MULTILIB_OSDIRNAMES for cross builds targeted for amd64 and ppc64. + * When -fstack-protector is the default (Ubuntu), do not enable + -fstack-protector when -nostdlib is specified. LP: #77865. + * Always set STAGE1_CFLAGS to -g -O2, only pass other settings + when configuring when required. + * Configure --with-bugurl, adjust the bug reporting instructions. + * gcc-4.3: Install new cpuid.h header. + * Fix installation of the s390 libstdc++ biarch headers. + * Install new bmmintrin.h, mmintrin-common.h headers. + * Build -dbg packages for libgcc, libgomp, libmudflap, libffi, libobjc, + libgfortran. + * Downgrade libmudflap-dev recommendation to a suggestion. Closes: #443929. + + [Riku Voipio] + * Configure armeabi with --disable-sjlj-exceptions. + * armel testsuite takes ages, adjust build accordingly. + + -- Matthias Klose Sun, 30 Sep 2007 12:06:02 +0200 + +gcc-4.3 (4.3-20070902-1) experimental; urgency=low + + * Upload to experimental. + + -- Matthias Klose Sun, 2 Sep 2007 20:51:16 +0200 + +gcc-4.3 (4.3-20070902-0ubuntu1) gutsy; urgency=low + + * Update to SVN 20070902 from the trunk. + * Fix the build logic for the Ubuntu i386 buildd; we can't build biarch. + * Only remove libgcj9's classmap db if no other libgcj9* library is + installed. + * A lot more updates for 4.3 packaging. + + -- Matthias Klose Sat, 01 Sep 2007 21:01:43 +0200 + +gcc-4.3 (4.3-20070901-0ubuntu1) gutsy; urgency=low + + * Update to SVN 20070901 from the trunk. + * First gcc-4.3 package build. + - Update patches for the *-linux-gnu builds. + - Update build files for 4.3. + * Add proposed patch for PR middle-end/33029. + * gcj-4.3: Install gc-analyze. + + -- Matthias Klose Sat, 1 Sep 2007 20:52:16 +0200 + +gcc-4.2 (4.2.2-7) unstable; urgency=low + + * Update to SVN 20080114 from the ubuntu/gcc-4_2-branch. + - Fix PR middle-end/34762. LP: #182412. + * Update debian/watch. Closes: #459259. Addresses: #459391, #459392. + * Build libgomp documentation without building libgomp. Closes: #460660. + * Restore gomp development files. Closes: #460736. + + -- Matthias Klose Mon, 14 Jan 2008 23:20:04 +0100 + +gcc-4.2 (4.2.2-6) unstable; urgency=low + + * Update to SVN 20080113 from the ubuntu/gcc-4_2-branch. + * Adjust build-dependency on debhelper, dpkg-dev. + * Fix gnat-4.2 build failure (addresses: #456867). + * Do not build packages built from the gcc-4.3 source. + + -- Matthias Klose Sun, 13 Jan 2008 13:48:49 +0100 + +gcc-4.2 (4.2.2-5) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20080102 from the ubuntu/gcc-4_2-branch. + - Fix PR middle-end/32889, ICE in delete_output_reload. + Closes: #444873, #445336, #451047. + - Fix PR target/34215, ICE in assign_386_stack_local. + Closes: #446714, #452451. + - Fix PR target/33848, reference to non-existent label at -O1 on + mips/mipsel. Closes: #441633. + * debian/rules.d/binary-java.mk: dpkg-shlibsdeps can't handle the dangling + symlink to libgcj_bc.so.1. Remove it temporarily. + * Add libgcj_bc to the libgcj8-1 shlibs file. + * Fix build failures for gnat-4.2, gpc-4.2, gdc-4.2 introduced by recent + gdc changes. + * Add symbol files for libgcc1, lib32gcc1, lib64gcc1, libstdc++6, + lib32stdc++6, lib64stdc++6, libgomp1, lib32gomp1, lib64gomp1, libffi4, + lib32ffi4, lib64ffi4, libobjc2, lib32objc2, lib64objc2. Adjust build + dependencies on dpkg-dev and debhelper. + Adjust build-dependency on dpkg-dev. + + [Arthur Loiret] + * Fix gdc-4.2 build failure. + * Update gdc to upstream SVN 20071124. + - d-bi-attrs: Support attributes on declarations in other modules. + - d-codegen.cc (IRState::attributes): Support constant declarations as + string arguments. + * Enable libphobos: + - gdc-4.2.dpatch: Fix ICEs. + - gdc-4.2-build.dpatch: Update, make it cleaner. + * Install libphobos in the private gcc lib dir. + * gdc-4.2.dpatch: Update from gdc-4.1.dpatch. + - gcc/tree-sra.c: Do not use SRA on structs with aliased fields created + for anonymous unions. + - gcc/predict.c: Add null-pointer check. + * debian/rules.defs: Disable phobos on hurd-i386. + - gdc-hurd-proc_maps.dpatch: Remove. + + -- Matthias Klose Wed, 02 Jan 2008 15:49:30 +0100 + +gcc-4.2 (4.2.2-4) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20071123 from the ubuntu/gcc-4_2-branch. + - Fix PR middle-end/34130, wrong code with some __builtin_abs expressions. + Closes: #452108. + * Don't run the testsuite on hppa when expect-tcl8.3 is not available. + * Fix libgcc1-dbg doc directory symlink. Closes: #447969. + * Use gcc-multilib as build-dependency instead of gcc-4.1-mulitlib. + * Support for fast-math on hurd-i386 (Michael Banck). Closes: #451520. + * Fix again profiling support on the Hurd (Thomas Schwinge). Closes: #434937. + + [Arthur Loiret] + * Merge gdc-4.1 patches and build infrastructure: + - gdc-4.2.dpatch: Add, setup gcc-4.2.x for D. + - gdc-4.2-build.dpatch: Add, update gdc builtins and driver objs. + - gdc-driver-zlib.dpatch: Add, use up-to-date system zlib. + - gdc-driver-defaultlib.dpatch: Add, add -defaultlib/-debuglib switches. + - gdc-driver-nophobos.dpatch: Add, disable libphobos when unsupported. + - gdc-libphobos-build.dpatch: Add, enable libphobos build when supported. + - gdc-fix-build.dpatch: Add, fix build on non-biarched 64bits targets. + - gdc-libphobos-std-format.dpatch: Add, replace assert when formating a + struct on non-x86_64 archs by a FormatError. + - gdc-arm-unwind_ptr.dpatch: Add, fix build on arm. + - gdc-mips-gcc-config.dpatch: Add, fix build on mips. + - gdc-hurd-proc_maps.dpatch: Add, fix build on hurd. + + -- Matthias Klose Sat, 24 Nov 2007 12:01:06 +0100 + +gcc-4.2 (4.2.2-3) unstable; urgency=low + + * Update to SVN 20071014 from the ubuntu/gcc-4_2-branch. + - Fix build failure in libjava on mips/mipsel. + * Make 4.2.2-2 a requirement for frontends built from separate sources. + Addresses: #446596. + + -- Matthias Klose Sun, 14 Oct 2007 14:13:00 +0200 + +gcc-4.2 (4.2.2-2) unstable; urgency=low + + * Update to SVN 20071011 from the ubuntu/gcc-4_2-branch. + - Fix PR middle-end/33448, ICE in create_tmp_var. Closes: #439687. + - Remove debian/patches/pr31899.dpatch, applied upstream. + - Remove debian/patches/pr33381.dpatch, applied upstream. + * gij-hppa: Call gij-4.2, not gij-4.1. Addresses: #446282. + + -- Matthias Klose Thu, 11 Oct 2007 23:41:52 +0200 + +gcc-4.2 (4.2.2-1) unstable; urgency=low + + * Update to SVN 20071008 from the ubuntu/gcc-4_2-branch, corresponding + to the GCC-4.2.2 release. + * Fix dependencies of lib*gcc1-dbg packages. Closes: #445190. + * Remove libjava-armeabi patch integrated upstream. + * gcjwebplugin: Fix path of the gcj subdirectory. LP: #149792. + * Apply proposed patch for PR debug/31899. Closes: #445268. + + * Add niagara2 optimization support (David Miller). + + -- Matthias Klose Mon, 08 Oct 2007 21:12:41 +0200 + +gcc-4.2 (4.2.1-6) unstable; urgency=high + + [Matthias Klose] + * Update to SVN 20070929 from the ubuntu/gcc-4_2-branch. + - Fix PR middle-end/33382, ICE (closes: #441481). + - Fix PR tree-optimization/28544 (4.2.1, closes: #380482). + - Fix PR libffi/28313, port to mips64 (closes: #358235). + * Fix PR tree-optimization/33099, PR tree-optimization/33381, + wrong code generation with VRP/SCEV. Closes: #440545, #443576. + * Update Hurd fixes (Samuel Thibault). + * When -fstack-protector is the default (Ubuntu), do not enable + -fstack-protector when -nostdlib is specified. LP: #77865. + * Add -g to BOOT_CFLAGS, set STAGE1_CFLAGS to -g -O, only pass + other settings when required. + * Fix installation of the s390 libstdc++ biarch headers. + * Allow the powerpc build on a 32bit machine (without running the + biarch testsuite). + * Build -dbg packages for libgcc, libgomp, libmudflap, libffi, libobjc, + libgfortran. + * Drop the build dependency on expect-tcl8.3 (the hppa testsuite seems + to complete sucessfully with the expect package). + * Downgrade libmudflap-dev recommendation to a suggestion. Closes: #443929. + + * Closing reports reported against gcc-4.1 and fixed in gcc-4.2: + - General + + PR rtl-optimization/21299, error in invalid asm statement. + Closes: #380121. + - C++ + + PR libstdc++/19664, libstdc++ headers have pop/push of the visibility + around the declarations (closes: #307207, #324290, #423547). + + PR c++/21581, functions in anonymous namespaces default to "hidden" + visibility (closes: #278310). + + PR c++/4882, specialization of inner template using outer template + argument (closes: #269513). + + PR c++/6634, wrong parsing of "long long double" (closes: #247112). + + PR c++/10891, code using dynamic_cast causes segfaults when -fno-rtti + is used (closes: #188943). + + PR libstdc++/14991, stream::attach(int fd) porting entry out-of-date. + Closes: #178561. + + PR libstdc++/31638, string usage leads to warning with -Wcast-align. + Closes: #382153. + + Fix memory hog seen with g++-4.1. Closes: #411234. + - Fortran + + PR fortran/29228, ICE in gfc_trans_deferred_array (closes: #387222). + + PR fortran/24285, allow dollars everywhere in format (closes: #324600). + + PR libfortran/28354, 0.99999 printed as 0. instead of 1. by + format(f3.0). Closes: #397671. + + Fix ICE in gfc_get_extern_function_decl (closes: #396292). + - Architecture specific: + - i386 + + Fix error with -m64 (unable to find a register to spill in class + 'DIREG'). Closes: #430049. + - mips + + Fix ICE in tsubst (closes: #422303). + - s390 + + Fix ICE (segmentation fault) building dcmtk (closes: #435736). + + [Roman Zippel] + * Update the m68k patches. + + [Riku Voipio] + * Configure armeabi with --disable-sjlj-exceptions. + * armel testsuite takes ages, adjust build accordingly. + + [Ludovic Brenta and Xavier Grave] + * Add a version of the Ada run-time library using the setjump/longjump + exception handling mechanism (static library only). Use with + gnatmake --RTS=sjlj. Particularly useful for distributed (Annex E) + programs. + * Restore building libgnatvsn-dev and libgnatprj-dev. + + -- Matthias Klose Sat, 29 Sep 2007 11:19:40 +0200 + +gcc-4.2 (4.2.1-5) unstable; urgency=low + + * Update to SVN 20070825 from the ubuntu/gcc-4_2-branch. + - Fix PR debug/32610, LP: #121911. + * Apply proposed patches: + - Improve debug info for packed arrays with constant bounds + (PR fortran/22244). + - Fix ICE in rtl_for_decl_init on const vector initializers + (PR debug/32914). + - Fix (neg (lt X 0)) optimization (PR rtl-optimization/33148). + - Fix libgcc.a(tramp.o) on ppc32. + - Fix redundant reg/mem stores/moves (PR target/30961). + * Update the -fdirectives-only backport. + * gappletviewer-4.2: Include the gcjwebplugin binary. LP: #131114. + * Update gpc patches and build support (not yet enabled). + * Fix gcc-snapshot hppa64 install target. + * Set the priority of the source package to optional. + * Remove .la files from the biarch libstdc++ debug packages, + conflict with the 3.4 package. Closes: #440490. + + [Arthur Loiret] + * Add build support for GDC. + + -- Matthias Klose Mon, 27 Aug 2007 01:39:32 +0200 + +gcc-4.2 (4.2.1-4) unstable; urgency=medium + + * gcc-4.2: Include missing std*.h header files. + + -- Matthias Klose Tue, 14 Aug 2007 11:14:35 +0200 + +gcc-4.2 (4.2.1-3) unstable; urgency=low + + * Update to SVN 20070812 from the ubuntu/gcc-4_2-branch. + * debian/rules.defs: Fix typo, run the checks in biarch mode too. + * libgcj8-awt: Loosen dependency on gcj-4.2-base. + * Build only needed multilib libraries when building as gcj or gnat. + * Always build biarch libgomp in biarch builds. + * debian/rules2: Adjust testsuite logs files for logwatch.sh. + * Include header files from $/gcc_lib_dir)/include-fixed. + * Backport from trunk: -fdirectives-only (when preprocessing, handle + directives, but do not expand macros). + * Report an ICE to apport (if apport is available and the environment + variable GCC_NOAPPORT is not set) + * Fix gcj build failure on the Hurd (Samuel Thibault). Closes: #437470. + + -- Matthias Klose Sun, 12 Aug 2007 21:11:00 +0200 + +gcc-4.2 (4.2.1-2) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20070804 from the ubuntu/gcc-4_2-branch (20070804): + - Merge gcc-4_2-branch SVN 20070804. + - Imported classpath CVS 20070727. + - Bump the libgcj soname, add conflict with java-gcj-compat (<< 1.0.76-4). + - Remove patches integrated in the branches: pr32862. + - Update patches: libjava-subdir, libjava-jar. + - Add regenerated class files: svn-class-updates. + + * Fix profiling support on the Hurd (Michael Casadeval). Closes: #434937. + * Fix build on kfreebsd-amd64 (Aurelien Jarno). Closes: #435053. + * Period of grace is over, run the testsuite on m68k-linux again. + * Update infrastructure for the gcc-source package (Bastian Blank). + * Update profiling on the Hurd (Samuel Thibault, Michael Casadevall). + Closes: #433539. + * debian/rules2: Allow DEB_BUILD_OPTIONS=parallel= to overwrite NJOBS. + * Allow lang=, nolang= in DEB_BUILD_OPTIONS; deprecating + WITHOUT_LANG, and WITHOUT_CHECK. + * debian/rules.defs, debian/rules.conf: Cache some often used macros. + + * Preliminary work: Enable Java for ARM EABI (Andrew Haley), build + libffi for armel. + * gcj: Don't build the browser plugin in gcc-snapshot builds to get + rid of the xulrunner dependency. + * gcjwebplugin: Register for more browsers (package currently not built). + * gij/boehm-gc: Use sysconf as fallback, if reading /proc/stat fails. + Closes: #422469. + * libjava: Avoid dependency on MAXHOSTNAMELEN (Samuel Thibault). + * gcj: On arm and armel, use the ecj1 binary built from the ecj package. + * gcj: Don't require javac without java maintainer mode, remove build + dependencies on gcj and ecj, add build dependency on libecj-java. + + -- Matthias Klose Sun, 05 Aug 2007 15:56:07 +0200 + +gcc-4.2 (4.2.1-1) unstable; urgency=medium + + [Ludovic Brenta] + * debian/patches/ada-symbolic-tracebacks.c: remove all trace of + the function convert_addresses from adaint.c. Fixes FTBFS on alpha, + s390 and possibly other platforms. Closes: #433633. + * debian/control.m4: list myself as uploader if the source package name + is gnat. Relax build-dependency on gnat-4.2-source. + * debian/control.m4, debian/rules.conf: Build-depend on libmpfr-dev only + if building Fortran. + + [Matthias Klose] + * debian/rules.conf: Fix breakage of Fortran build dependencies introduced + by merge of the Ada bits. + * Don't include the gccbug binary anymore in the gcc package; upstream bug + reports should be reported to the upstream bug tracker at + http://gcc.gnu.org/bugzilla. + * Don't build and test libjava for the biarch architecture. + * Install gappletviewer man page. Addresses: #423094. + * debian/patches/m68k-java.dpatch: Readd. + * gjar: support @ arguments. + * Update to SVN 20070726 from the ubuntu/gcc-4_2-branch. + - Fix mips/mipsel builds. + * libmudflap0: Fix update leaving an empty doc dir. Closes: #428306. + * arm/armel doesn't have ssp support. Closes: #433172. + * Update kbsd-gnu-ada patch (Aurelien Jarno): Addresses: #434754. + * gcj-4.2: Build depend on gcj-4.2 to build the classpath examples files + for the binary-indep target. + * Fix PR java/32862, bugs in EnumMap implementation. Addresses: #423160. + + [Arthur Loiret] + * Fix cross builds targeting x86_64. Closes: LP: #121834. + + -- Matthias Klose Thu, 26 Jul 2007 21:46:03 +0200 + +gcc-4.2 (4.2.1-0) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20070719 from the ubuntu/gcc-4_2-branch, corresponding + to the GCC-4.2.1 release. + - debian/patches/arm-gij.dpatch: Remove. Closes: #433714. + * Apply proposed patch for PR tree-optimization/32723. + * Tighten build dependency on libmpfr-dev. + * On ia64, apply proposed patch for PR target/27880. Closes: #433719. + + [Hector Oron] + * Fix cross and reverse-cross builds. Closes: #432356. + + -- Matthias Klose Thu, 19 Jul 2007 17:59:37 +0200 + +gnat-4.2 (4.2-20070712-1) unstable; urgency=low + + * debian/rules.d/binary-ada.mk, debian/control.m4: + disable building libgnatvsn-dev and libgnatprj-dev, as they conflict + with packages from gnat-4.1. Will reenable them for the transition to + gnat-4.2. + * Upload as gnat-4.2. Closes: #432525. + + -- Ludovic Brenta Sat, 14 Jul 2007 15:12:34 +0200 + +gcc-4.2 (4.2-20070712-1) unstable; urgency=high + + [Matthias Klose] + * Update to SVN 20070712 from the ubuntu/gcc-4_2-branch. + - 4.2.1 RC2, built from SVN. + - same as gcc-4_2-branch, plus backport of gcc/java, boehm-gc, libffi, + libjava, zlib from the trunk. + - debian/patches/arm-libffi.dpatch: Remove. + - Fixes ICE in update_equiv_regs. Closes: #432604. + * debian/control.m4: Restore build dependency on dejagnu. + * debian/patches/arm-gij.dpatch: Update. + * i386-biarch.dpatch: Update for the backport for PR target/31868. + Closes: #432599. + + -- Matthias Klose Fri, 13 Jul 2007 08:07:51 +0200 + +gcc-4.2 (4.2-20070707-1) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20070707 from the ubuntu/gcc-4_2-branch. + - debian/patches/libjava-soname.dpatch: Remove. + - debian/patches/disable-configure-run-check.dpatch: Update. + * Only suggest multilib packages on multilib architectures. + * Point ICE messages to the 4.2 docdir. + * Explicitely use fastjar to build gcj-4.1. Addresses: #416001. + * Configure with --enable-libgcj on m32r (Kazuhiro Inaoka). + * Include the hppa64 cross compiler on hppa snapshot builds. + * debian/patches/arm-libffi.dpatch: Update. + * libgcj-doc: Include the generated documentation. + * Fix building the libjava/classpath examples. + * Support reverse cross builds (Neil Williams). Closes: #431086. + + -- Matthias Klose Sat, 07 Jul 2007 10:59:26 +0200 + +gcc-4.2 (4.2-20070627-1) unstable; urgency=high + + [Matthias Klose] + * Update to SVN gcc-4_2-branch/20070626. + * Update to SVN trunk/20070626 (gcc/java, libjava, libffi, boehm-gc). + * On mips*-linux, always imply -lpthread for -pthread (Thiemo Seufer). + Addresses: #428741. + * Fix libstdc++ cross builds (Arthur Loiret). Closes: #430395. + * README.Debian: Point to debian-toolchain for general toolchain topics. + * Use the generated locales for the libstdc++ build to fix the setting + of the gnu locale model. Closes: #428926, #429660. + * For ix86 lpia targets, configure --with-tune=i586. + * Make build dependency on gcc-4.1-multilib architecture specific. + * Do not ignore bootstrap comparision failure on ia64. + + [Ludovic Brenta] + * ada-link-lib.dpatch: update to apply cleanly on GCC 4.2. + * ada-libgnat{vsn,prj}.dpatch: adjust to GCC 4.2. Reenable in rules.patch. + * rules.conf: do not build libgomp as part of gnat-4.2. + * rules.conf, control.m4: build-depend on libz-dev, lib32z-dev or + lib64-dev only when building Java. + * rules2, rules.defs: $(with_mudflap): remove, use $(with_libmudflap) only. + * config.m4, binary-ada.mk: tighten dependencies; no Ada package depends + on gcc-4.2-base anymore. + * TODO: rewrite. + * README.gnat: include in gnat-4.2-base. Remove outdated information. + * README.maintainers: new. Include in gnat-4.2-base. + + [Hector Oron] + * Merge DEB_CROSS_INDEPENDENT with DEB_CROSS. + * Disables libssp0 for arm and armel targets when cross compiling. + * Updates README.cross. + * Fixes linker mapping problem on binary-libstdcxx-cross.mk. Closes: #430688. + + -- Matthias Klose Wed, 27 Jun 2007 21:54:08 +0200 + +gcc-4.2 (4.2-20070609-1) unstable; urgency=low + + * Update to SVN gcc-4_2-branch/20070609. + - Remove patches integrated upstream: pr30052, hppa-caller-save-pic-tls. + * Update to SVN trunk/20070609 (gcc/java, libjava, libffi, boehm-gc). + - Remove patches integrated upstream: libjava-qt-peer, + classpath-config-guess. + * Do not build with --enable-java-maintainer-mode. + * debian/rules.patch: Comment out m68k-peephole, requires m68k-split_shift. + * Add target to apply patches up to a specific patch (Wouter Verhelst). + Closes: #424855. + * libstdc++6-4.2-*: Add conflicts with 4.1 packages. Closes: #419511. + * Apply proposed fix for PR target/28102. Closes: #426905. + * Fix build failure for cross compiler builds (Jiri Palecek). Closes: #393897. + * Update build macros for kfreebsd-amd64. Closes: #424693. + + -- Matthias Klose Sat, 9 Jun 2007 06:54:13 +0200 + +gcc-4.2 (4.2-20070528-1) unstable; urgency=low + + * Update to SVN gcc-4_2-branch/20070528. + * Add backport for PR middle-end/20218. + * Add proposed PTA solver backport, PR tree-optimization/30052. + * Add backport for PR target/31868. + * Reenable the testsuite for arm, mips, mipsel. + + -- Matthias Klose Mon, 28 May 2007 09:03:04 +0200 + +gcc-4.2 (4.2-20070525-1) unstable; urgency=low + + * Update to SVN gcc-4_2-branch/20070525. + * Update to SVN trunk/20070520 (gcc/java, libjava, libffi, boehm-gc). + * Do not explicitely configure for __cxa_atexit. + * libstdc++6-4.2-doc: Conflict with libstdc++6-4.1-doc. Closes: #424896. + * Update m68k patches: + - Remove patches applied upstream: m68k-jumptable, m68k-gc, + - Reenable patches: m68k-save_pic, m68k-dwarf, m68k-limit_reload, + m68k-prevent-qipush, m68k-peephole, m68k-return, m68k-sig-unwind, + m68k-align-code m68k-align-stack, m68k-symbolic-operand, + m68k-bitfield-offset. + - Update: m68k-return, m68k-secondary-addr-reload, m68k-notice-move + m68k-secondary-addr-reload, m68k-notice-move. + - TODO: m68k-split_shift, m68k-dwarf3, m68k-fpcompare. + * Update the kfreebsd and arm patches (Aurelien Jarno). Closes: #425011. + * Temporarily disable the testsuite on slow architectures to get the + package built soon. + + -- Matthias Klose Fri, 25 May 2007 07:14:36 +0200 + +gcc-4.2 (4.2-20070516-1) unstable; urgency=low + + * Update to SVN gcc-4_2-branch/20070516. + * Update to SVN trunk/20070516 (gcc/java, libjava, libffi, boehm-gc). + * Merge changes from gcc-4.1_4.1.2-7. + * Update NEWS files. + + -- Matthias Klose Wed, 16 May 2007 02:33:57 +0200 + +gcc-4.2 (4.2-20070502-1) unstable; urgency=low + + * Update to SVN gcc-4_2-branch/20070502. + - Remove pr11953 patch, integrated upstream. + * Update to SVN trunk/20070502 (gcc/java, libjava, libffi, boehm-gc). + * Adjust tetex/tex-live build dependency. + * Fix gobjc-4.2's, gobjc++-4.2's dependency on libobjc2. + * Tighten (build) dependency on binutils. Addresses: #421197. + * gfortran-4.2: Depend on libgfortran2, provide the libgfortran.so + symlink. Adresses: #421362. + * Build-depend on gcc-multilib [amd64 i386 powerpc ppc64 s390 sparc]. + * (Build-) depend on glibc (>= 2.5) for all architectures. + * Remove libssp packages from the control file. + + -- Matthias Klose Wed, 2 May 2007 18:46:57 +0200 + +gcc-4.2 (4.2-20070405-1) experimental; urgency=low + + * Update to SVN gcc-4_2-branch/20070405. + * Update to SVN trunk/20070405 (gcc/java, libjava, libffi, boehm-gc). + * gcc-4.2-hppa64: Don't depend on libc6-dev. + * Robustify setting of make's -j flag. Closes: #410919. + * gcc-snapshot: Use the install_snap_stamp target for installation. + + -- Matthias Klose Thu, 5 Apr 2007 23:56:35 +0200 + +gcc-4.2 (4.2-20070307-1) experimental; urgency=low + + * Update to SVN gcc-4_2-branch/20070307. + * Update to SVN trunk/20070307 (gcc/java, libjava, libffi, boehm-gc). + * Build gnat from separate sources. + * Merge changes from gcc-4.1-4.1.2-1. + * Install into /usr/lib/gcc//4.2, to ease upgrades + between subminor versions. + * Configure --with-gxx-include-dir=/usr/include/c++/4.2 + + -- Matthias Klose Thu, 8 Mar 2007 02:52:00 +0100 + +gcc-4.2 (4.2-20070210-1) experimental; urgency=low + + * Merge Java backport from Ubuntu: + - Update to SVN gcc-4_2-branch/20070210. + - Update to SVN trunk/20070210 (gcc/java, libjava). + - Backout trunk specific gcc/java changes. + - Build-depend on gcj-4.1 and ecj-bootstrap. + - gcj-4.2: Depend on ecj-bootstrap, recommend ecj-bootstrap-gcj. + - Merge libgcj8-awt-gtk back into libgcj8-awt; the Qt peers + are disabled by upstream again. + - Generate manual pages for the classpath tools from the classpath + documentation. + - Adopt packaging for the merged libjava. + - Update patches for the merged libjava: libjava-lib32-properties, + i386-biarch, reporting, libjava-soname, libjava-subdir, + libjava-lib32subdir. + - Remove obsolete patches: libjava-plugin-binary, libjava-ia32fix, + libstdc++-docfixes. + + * Set priority of development packages to optional. + * debian/libgcjGCJ.postrm: Don't fail on purge when directories + don't exist anymore. Closes: #406017. + * debian/patches/gcc-textdomain.dpatch: Update for 4.2. + * Generate and install libgomp docs into gcc-4.2-doc. + + -- Matthias Klose Sat, 10 Feb 2007 16:53:11 +0100 + +gcc-4.2 (4.2-20070105-1) experimental; urgency=low + + * Update to SVN 20070105. + * Add tetex-extra to Build-Depend-Indep (libstd++ doxygen docs), + fix doxygen build (libstdc++-docfixes.dpatch). + * Enable parallel build by default on SMP machines. + + -- Matthias Klose Fri, 5 Jan 2007 22:42:18 +0100 + +gcc-4.2 (4.2-20061217-1) experimental; urgency=low + + * Update to SVN 20061217. + * Merge changes from gcc-4.1_4.1.1-16 to gcc-4.1_4.1.1-21. + * Update patches to the current branch. + * Add multilib packages for gcc, g++, gobjc, gobjc++, gfortran. + * Link using --hash-style=gnu (alpha, amd64, ia64, i386, powerpc, ppc64, + s390, sparc). + + -- Matthias Klose Sun, 17 Dec 2006 15:54:54 +0100 + +gcc-4.2 (4.2-20061003-1) experimental; urgency=low + + * libgcj.postinst: Remove /var/lib/gcj-4.2 on package removal. + * Don't install backup files in the doc directory, only one gcc-4.1 + upgrade was broken. Closes: #389366. + * Merge gcc-biarch-generic.dpatch into i386-biarch.dpatch. + * Update link-libs.dpatch. + * Merge libgfortran2-dev into gfortran-4.2. + + -- Matthias Klose Tue, 3 Oct 2006 16:26:38 +0000 + +gcc-4.2 (4.2-20060923-1) experimental; urgency=low + + * Update to SVN 20060923. + * Remove patches applied upstream: kbsd-gnu-java, kbsd-gnu. + + -- Matthias Klose Sat, 23 Sep 2006 15:11:36 +0200 + +gcc-4.2 (4.2-20060905-1) experimental; urgency=low + + * Update to SVN 20060905. + * Merge changes from gcc-4.1 (4.1.1-10 - 4.1.1-12). + * Move gomp development files into gcc and gfortran. + * Build-depend on binutils (>= 2.17). + + -- Matthias Klose Tue, 5 Sep 2006 03:33:00 +0200 + +gcc-4.2 (4.2-20060818-1) experimental; urgency=low + + * Update to SVN 20060818. + - libjava-libgcjbc.dpatch: Remove, applied upstream. + * Merge changes from the Ubuntu gcj-4.2 package: + - libjava-soname.dpatch: Remove, applied upstream. + - libjava-native-libdir.dpatch: update. + - libffi-without-libgcj.dpatch: Remove, new libffi-configure to + enable --disable-libffi. + - Changes required for the classpath-0.92 update: + - New packages gappletviewer-4.2, gcjwebplugin-4.2. + - gij-4.2: Add keytool alternative. + - gcj-4.2: Add jarsigner alternative. + - libgcj8-dev: Remove conflicts with older libgcjX-dev packages. + - lib32gcj8: Populate the /usr/lib32/gcj-4.2 directory. + - libjava-library-path.dpatch: + - When running the i386 binaries on amd64, look in + /usr/lib32/gcj-x.y and /usr/lib32/jni instead. + - Add /usr/lib/jni to java.library.path. Adresses: #364820. + - Add more debugging symbols to libgcj8-dbg. Adresses: #383705. + - Fix and renable the biarch build for sparc. + * Disable gnat for alpha, fails to build. + * Configure without --enable-objc-gc, fails to build. + + -- Matthias Klose Sat, 19 Aug 2006 18:25:50 +0200 + +gcc-4.2 (4.2-20060709-1) experimental; urgency=low + + * Test build, SVN trunk 20060709. + * Merge libssp0-dev into gcc-4.1 (-fstack-protector is a common option). + * Rename libmudflap0-dev to libmudflap0-4.2-dev. + * Ignore compiler warnings when checking whether compiler driver understands + Ada fails. + * Merge changes from the gcc-4.1 package. + + -- Matthias Klose Sun, 9 Jul 2006 14:28:03 +0200 + +gcc-4.2 (4.2-20060617-1) experimental; urgency=low + + * Test build, SVN trunk 20060617. + + [Matthias Klose] + * Configure using --enable-objc-gc, using the internal boehm-gc. + * Build-depend on bison (>= 1:2.3). + * Build the QT based awt peer library, not yet the same functionality + as the GTK based peer library. + * Update libjava-* patches. + + [Ludovic Brenta] + * Do not provide the symbolic link /usr/bin/gnatgcc; this will now + be provided by package gnat from the source package gcc-defaults. + * debian/control.m4, debian/control (gnat): conflict with gnat (<< 4.1), + not all versions of gnat, since gcc-defaults will now provide gnat (= 4.1) + which depends on gnat-4.1. + + [Bastian Blank] + * Make it possible to overwrite arch per DEB_TARGET_ARCH and + DEB_TARGET_GNU_TYPE. + * Disable biarch only on request for cross builds. + * Use correct source directory for tarballs. + * Produce correct multiarch.inc for source builds. + + -- Matthias Klose Sat, 17 Jun 2006 19:02:01 +0200 + +gcc-4.2 (4.2-20060606-1) experimental; urgency=low + + * Test build, SVN trunk 20060606. + * Remove obsolete patches, update patches for 4.2. + * Update the biarch-include patches to work with mips-triarch. + * Disable Ada, not yet updated. + * New packages: libgomp*. + * Remove fastjar, not included upstream anymore. + + -- Matthias Klose Tue, 6 Jun 2006 10:52:28 +0200 + +gcc-4.1 (4.1.2-12) unstable; urgency=high + + * i386-biarch.dpatch: Update for the backport for PR target/31868. + Closes: #427185. + * m68k-libffi2.dpatch: Update. Closes: #425399. + + -- Matthias Klose Mon, 4 Jun 2007 23:53:23 +0200 + +gcc-4.1 (4.1.2-11) unstable; urgency=low + + * Update to SVN 20070601. + * Build the libmudflap0-dev package again. + * Don't build libffi, when the packages are not built. + + -- Matthias Klose Fri, 1 Jun 2007 23:55:22 +0200 + +gcc-4.1 (4.1.2-10) unstable; urgency=low + + * Regenerate the control file. + + -- Matthias Klose Wed, 30 May 2007 00:29:29 +0200 + +gcc-4.1 (4.1.2-9) unstable; urgency=low + + * Update to SVN 20070528. + * Don't build packages now built from the gcc-4.2 source (arm, m68k, + mips, mipsel). + * Add backport for PR middle-end/20218. + * Add backport for PR target/31868. + + -- Matthias Klose Tue, 29 May 2007 00:01:12 +0200 + +gcc-4.1 (4.1.2-8) unstable; urgency=low + + * Update to SVN 20070518. + * Don't build packages now built from the gcc-4.2 source. + + [ Aurelian Jarno ] + * Update libffi patch for ARM. Closes: #425011. + * arm-pr30486, arm-pr28516, arm-unbreak-eabi-armv4t: New. + * Disable FFI, Java, ObjC for armel. + + -- Matthias Klose Sun, 20 May 2007 10:31:24 +0200 + +gcc-4.1 (4.1.2-7) unstable; urgency=low + + * Update to SVN 20070514. + * Link using --hash-style=both on supported architectures. Addresses: #421790. + * On hppa, build ecjx as a native binary. + * note-gnu-stack.dpatch: Fix ARM comment marker (Daniel Jacobowitz). + Closes: #422978. + * Add build dependency on libxul-dev for *-freebsd. Closes: #422995. + * Update config.guess/config.sub and build gcjwebplugin on GNU/kFreeBSD + (Aurelian Jarno). Closes: #422995. + * Disable ssp on hurd-i386. Closes: #423757. + + -- Matthias Klose Mon, 14 May 2007 08:40:08 +0200 + +gcc-4.1 (4.1.2-6) unstable; urgency=low + + * Update libjava from the gcc-4.1 Fedora branch 20070504. + * gfortran-4.1: Fix the target of the libgfortran.so symlink. + Closes: #421362. + * Build-depend on gcc-multilib [amd64 i386 powerpc ppc64 s390 sparc]. + * Readd build dependency on binutils on arm. + * (Build-) depend on glibc (>= 2.5) for all architectures. + * Remove libssp packages from the control file. + * Fix wrong code generation on hppa when TLS variables are used. + Closes: #422421. + + -- Matthias Klose Sun, 6 May 2007 10:00:23 +0200 + +gcc-4.1 (4.1.2-5) unstable; urgency=low + + * Update to SVN 20070429. + * Update libjava from the gcc-4.1 Fedora branch 20070428. + * Update m68k patches: + - Remove pr25514, pr27736, applied upstream. + - Update m68k-java. + * Link using --hash-style=gnu/both. + * Tighten (build) dependency on binutils. Closes: #421197. + * gij-4.1: Add a conflict with java-gcj-compat (<< 1.0.69). + * gfortran-4.1: Depend on libgfortran1, provide the libgfortran.so + symlink. Closes: #421362. + * gcc-4.1, gcc-4.1-multilib: Fix compatibility symlinks. Closes: #421382. + * Temporarily remove build dependency on locales on arm, hppa, m68k, mipsel. + * Temporarily remove build dependency on binutils on arm. + * Fix FTBFS on GNU/kFreeBSD (Aurelian Jarno). Closes: #421423. + * gij-4.1 postinst: Create /var/lib/gcj-4.1. Closes: #421526. + + -- Matthias Klose Mon, 30 Apr 2007 08:13:32 +0200 + +gcc-4.1 (4.1.2-4) unstable; urgency=medium + + * Update to SVN 20070423. + - Remove pr11953, applied upstream. + - Fix ld version detection in libstdc++v3. + * Update libjava from the gcc-4.1 Fedora branch 20070423. + * Merge libgfortran1-dev into gfortran-4.1. + * Add multilib packages for gcc, g++, gobjc, gobjc++, gfortran. + * Don't link using --hash-style=gnu/both; loosen dependency on binutils. + * Don't revert the patch to fix PR c++/27227. + + -- Matthias Klose Mon, 23 Apr 2007 23:13:14 +0200 + +gcc-4.1 (4.1.2-3) experimental; urgency=low + + * Update to SVN 20070405. + * Update libjava from the gcc-4.1 Fedora branch 20070405. + * Robustify setting of make's -j flag. Closes: #414316. + * Only build the libssp packages, when building the common libraries. + * gcc-4.1-hppa64: Don't depend on libc6-dev. + + -- Matthias Klose Fri, 6 Apr 2007 00:28:29 +0200 + +gcc-4.1 (4.1.2-2) experimental; urgency=low + + * Update to SVN 20070306. + * Update libjava from the gcc-4.1 Fedora branch 20070306. + + [Matthias Klose] + * Don't install gij-wrapper anymore, directly register gij as a java + alternative. + * Don't install gcjh-wrapper anymore. + * Don't use exact versioned dependencies on gcj-base for libgcj and + libgcj-awt. + * Fix glibc build dependency for alpha. + * Support -ffast-math on hurd-i386 (Samuel Thibault). Closes: #413342. + * Update kfreebsd-amd64 patches (Aurelien Jarno). Closes: #406015. + * gij: Consistently use $(dbexecdir) to reference the gcj sub dir. + * Install into /usr/lib/gcc//4.1, to ease upgrades + between minor versions. + Add compatibility symlinks in /4.1.2 to build gnat-4.1 + and gcj-4.1 from separate sources. + + -- Matthias Klose Wed, 7 Mar 2007 03:51:47 +0100 + +gcc-4.1 (4.1.2-1) experimental; urgency=low + + [Matthias Klose] + * Update to gcc-4.1.2. + * Update libjava backport patches, split out boehm-gc-backport patch. + * Enable the cpu-default-generic patch (i386, amd64), backport from 4.2. + * Correct mfctl instruction syntax (hppa), backport from the trunk. + * Backport PR java/9861 (name mangling updates). + * gcc.c (main): Call expandargv (backport from 4.2). + * Apply gcc dwarf2 unwinding patches from the trunk. + * Apply backport for PR 20208 on amd64 i386 powerpc ppc64 sparc s390. + * Apply patches from the 4.1 branch for PR rtl-optimization/28772, + PR middle-end/30313, PR middle-end/30473, PR c++/30536, PR debug/30189, + PR fortran/30478, PR rtl-optimization/30787, PR tree-optimization/30823, + PR rtl-optimization/28173, PR ada/30684, bug in pointer dependency test, + PR rtl-optimization/30931, PR fortran/25392, PR fortran/30400, + PR libgfortran/30910, PR libgfortran/30918, PR fortran/29441, + PR target/30634. + * Update NEWS files. + * Include a backport of the ecj+generics java updates as + gcj-ecj-20070215.tar.bz2. Install it into the gcc-4.1-source package. + * Do not build fastjar anymore from this source. + * debian/control.m4: Move expect-tcl8.3 before dejagnu. + * Work around firefox/icewhatever dropping plugin dependencies on xpcom. + * Refactor naming of libgcj packages in the build files. + * Make libstdc++-doc's build dependencies depending on the source package. + * Do not build packages on architectures, which are already built by gcc-4.2. + + * Merge the gcj generics backport from Ubuntu: + + - Merge the Java bits (eclipse based compiler, 1.5 compatibility, + classpath generics) from the gcc-4.1 Fedora branch. + - Drop all previous patches from the classpath-0.93 merge, keep + the boehm-gc backport (splitted out as a separate patch). + - Add a gcj-ecj-generics.tar.bz2 tarball, containing gcc/java, libjava, + config/unwind_ipinfo.m4, taken from the Fedora branch. + - Drop the libjava-hppa, libjava-plugin-binary, pr29362, pr29805 patches + integrated in the backport. + - Update patches for the merge: reporting, libjava-subdir, i386-biarch, + classpath-tooldoc, pr26885 + - Add libjava-dropped, libjava-install; dropped chunks from the merge. + - Add pr9861-nojava mangling changes, non-java parts for PR 9861. + - Add gcc-expandv, expand `@' parameters on the commandline; backport + from the trunk. + - Disable the m68k-gc patch, needs update for the merge. + - Configure --with-java-home set for 1.5.0. + - Configure with --enable-java-maintainer-mode to build the header + and class files on the fly. + - Add build dependency on ecj-bootstrap, configure --with-ecj-jar. + - Build an empty libgcj-doc package; gjdoc currently cannot handle + generics. + - Apply gcc dwarf2 unwinding patches from the trunk, allowing the Events + testcase to pass. + - Tighten dependencies on shared libraries. + - Use /usr/lib/gcj-4-1-71 as private gcj subdir. + - Bump the libgcj soversion to 71, rename the libgcj7-0 package + to libgcj7-1, rename the libgcj7-awt package to libgcj7-1-awt. + - gij-4.1: Add and provide alternatives for gorbd, grmid, gserialver. + - gcj-4.1: Remove gcjh, gcjh-wrapper, gjnih. + - gcj-4.1: Add and provide alternatives for jar, javah, native2ascii, + tnameserv. + - gcj-4.1: Add dependency on ecj-bootstrap, recommend fastjar, + ecj-bootstrap-gcj. + - Add build dependency on ecj-bootstrap version providing the GCCMain + class. + - libgcj7-1: Recommend libgcj7-1-awt. + - Add build dependency on libmagic-dev. + - Build-depend on gcj-4.1; build our own ecj1 and gjdoc before + starting the build. + - Make ecj1 available when running the testsuite. + - Fix build failure on sparc-linux. + - Fix gjavah compatibility problems (PR cp-tools/3070[67]). + - Fixed driver issue source files (PR driver/30714). + - Add (rudimentary) manual pages for classpath tools. + + [Kevin Brown] + * debian/control.m4, debian/rules.d/binary-ada.mk: provide new packages + containing debugging symbols for Ada libraries: libgnat-4.1-dbg, + libgnatprj4.1-dbg, and libgnatvsn4.1-dbg. Adresses: #401385. + + -- Matthias Klose Sat, 3 Mar 2007 23:12:08 +0100 + +gcc-4.1 (4.1.1ds2-30) experimental; urgency=low + + * Update to SVN 20070106. + * Do not revert the fixes for PR 25878, PR 29138, PR 29408. + * Don't build the packages built by gcc-4.2 source. + * debian/patches/note-gnu-stack.dpatch: Add .note.GNU-stack sections + for gcc's crt files, libffi and boehm-gc. Taken from FC. Closes: #382741. + * Merge from Ubuntu: + - Backport g++ visibility patches from the FC gcc-4_1-branch. + - Update the long-double patches; require glibc-2.4 as a build dependency + on alpha, powerpc, sparc, s390. Bump the shlibs dependencies to + require 4.1.1-21. + - On powerpc-linux configure using --enable-secureplt. Closes: #382748. + - When using the cpu-default-generic patch, build for generic x86-64 + on amd64 and i386 biarch. + - Link using --hash-style=both (alpha, amd64, ia64, i386, powerpc, ppc64, + s390, sparc). + * gij-4.1: Recommends libgcj7-awt instead of suggesting it. Closes: #394917. + * Split the gcc-long-double patch into a code and doc part. + * Set priority of development packages to optional. + * Add support for kfreebsd-amd64 (Aurelian Jarno). Closes: #406015. + + -- Matthias Klose Sat, 6 Jan 2007 10:35:42 +0100 + +gcc-4.1 (4.1.1ds2-22) unstable; urgency=high + + * Enable -pthread for GNU/Hurd (Michael Banck). Closes: #400031. + * Update the m68k-fpcompare patch (Roman Zippel). Closes: #401585. + + -- Matthias Klose Sun, 10 Dec 2006 12:35:06 +0100 + +gcc-4.1 (4.1.1ds2-20) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20061115. + - Fix PR tree-optimization/27891, ICE in tree_split_edge. + Closes: #370248, #391657, #394630. + - Fix PR tree-optimization/9814, duplicate of PR tree-optimization/29797. + Closes: #181096. + * Apply the libjava/net backport from the redhat/gcc-4_1-branch. + * Apply proposed patch for PR java/29805. + + [Roman Zippel] + * Build the ObjC and ObjC++ compilers in cross builds. + * debian/patches/m68k-symbolic-operand.dpatch: Better recognize + symbolic operands in addresses. + * debian/patches/m68k-bitfield-offset.dpatch: Only use constant offset + for register bitfields (combine expects shifts, but does a rotate). + * debian/patches/m68k-bitfield-offset.dpatch: Update and apply. + + [Daniel Jacobowitz] + * Don't try to use _Unwind_Backtrace on SJLJ targets. + See bug #387875, #388505, GCC PR 29206. + + -- Matthias Klose Wed, 15 Nov 2006 08:59:53 -0800 + +gcc-4.1 (4.1.1ds2-19) unstable; urgency=low + + * Fix typo in arm-pragma-pack.dpatch. + + -- Matthias Klose Sat, 28 Oct 2006 11:04:00 +0200 + +gcc-4.1 (4.1.1ds2-18) unstable; urgency=medium + + [Matthias Klose] + * Update to SVN 20061028. + * Fix #pragma pack on ARM (Paul Brook). Closes: #394703. + * Revert PR c++/29138, PR c++/29408. Closes: #392559. + * Revert PR c++/25878. Addresses: #387989. + * fastjar: Provide jar. Closes: #395397. + + [Ludovic Brenta] + * debian/control.m4 (libgnatprj-dev): depend on libgnatvsn-dev. + debian/gnatprj.gpr: with gnatvsn.gpr. Closes: #395000. + + -- Matthias Klose Thu, 26 Oct 2006 23:51:10 +0200 + +gcc-4.1 (4.1.1ds2-17) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20061020. + - Fix PR debug/26881, ICE in dwarf2out_finish. Closes: #377613. + - Fix PR PR c++/29408, parse error for valid code. Closes: #392327, #393010. + - Fix PR c++/29435, segfault with sizeof and templates. Closes: #393071. + - Fix PR target/29338, segfault with -finline-limit on arm. Closes: 390620. + - Fix 3.4/4.0 backwards compatibility problem in libstdc++. + * Fix PR classpath/29362, taken from the redhat/gcc-4_1-branch. + * Remove the INSTALL directory from the source tarball. Closes: #392974. + * Disable building the static libgcj; non-functional, and cutting + down build times. + * libgcj7-0: Tighten dependency on libgcj-common. + * libgcj7-dev: Install .pc file as libgcj-4.1.pc. + * README.cross: Updated (Hector Oron). Addresses: #380251. + * config-ml.dpatch: Use *-linux-gnu as *_GNU_TYPE. Closes: #394034. + + [Nikita V. Youshchenko] + * Fix typo in the cross build scripts. Closes: #391445. + + [Falk Hueffner] + * alpha-no-ev4-directive.dpatch: Fix kernel build failure. + + [Roman Zippel] + * debian/patches/m68k-align-code.dpatch: Use "move.l %a4,%a4" to advance + within code. + * debian/patches/m68k-align-stack.dpatch: Try to keep the stack word aligned. + * debian/patches/m68k-dwarf3.dpatch: Emit correct dwarf info for cfa offset + and register with -fomit-frame-pointer. + * debian/patches/m68k-fpcompare.dpatch: Bring fp compare early to its + desired form to relieve reload. Closes: #390879. + * debian/patches/m68k-prevent-swap.dpatch: Don't swap operands + during reloads. + * debian/patches/m68k-reg-inc.dpatch: Reinsert REG_INC notes after splitting + an instruction. + * debian/patches/m68k-secondary-addr-reload.dpatch: Add secondary reloads + to allow reload to get byte values into addr regs. Closes: #385327. + * debian/patches/m68k-symbolic-operand.dpatch: Better recognize symbolic + operands in addresses. + * debian/patches/m68k-limit_reload.dpatch: Remove, superseded by + m68k-secondary-addr-reload.dpatch. + * debian/patches/m68k-notice-move.dpatch: Apply, was checked in in -16. + * debian/patches/m68k-autoinc.dpatch: Updated, don't attempt to increment + the register, if it's used multiple times in the instruction . + + -- Matthias Klose Sat, 21 Oct 2006 00:25:05 +0200 + +gcc-4.1 (4.1.1ds1-16) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20061008. + - Fix PR c++/29226, ICE in make_decl_rtl. Closes: #388263. + * libgcj7-0: Fix package removal. Closes: #390874. + * Configure with --disable-libssp on architectures that don't + support it (alpha, hppa, ia64, m68k, mips, mipsel). + * On hppa, remove build-dependency on dash. + * gij/gcj: Do not install slave links for the non DFSG manpages. + Closes: #390425, #390532. + * libgcj-common: rebuild-gcj-db: Don't do anything, if no classmap + files are found. Closes: #390966. + * Fix PR libstdc++/11953, extended for all linux architectures. + Closes: #391268. + * libffi4-dev: Conflict with libffi. Closes: #387561. + * Backport PR target/27880 to the gcc-4_1-branch. Patch by Steve Ellcey. + Closes: #390693. + * On ia64, don't use _Unwind_GetIPInfo in libjava and libstdc++. + * Add a README.ssp with minimal documentation about stack smashing + protection. Closes: #366094. + * Do not build libgcj-common from the gcc-4.1/gcj-4.1 sources anymore. + + [Roman Zippel] + * debian/patches/m68k-notice-move.dpatch: Don't set cc_status + for fp move without fp register. + + -- Matthias Klose Sun, 8 Oct 2006 02:21:49 +0200 + +gcc-4.1 (4.1.1ds1-15) unstable; urgency=medium + + * Update to SVN 20060927. + - Fix PR debug/29132, exception handling on mips. Closes: #389468, #390042. + - Fix typo in gcc documentation. Closes: #386180. + - Fix PR target/29230, wrong code generation on arm. Closes: #385505. + * libgcj-common: Ignore exit value of gcj-dbtool in rebuild-gcj-db on + arm, m68k, hppa. Adresses: #388505. + * libgcj-common: Replaces java-gcj-compat-dev and java-gcj-compat. + Closes: #389539. + * libgcj-common: /usr/share/gcj/debian_defaults: Define gcj_native_archs. + * Update the java backport from the redhat/gcc-4_1-branch upto 2006-09-27; + remove libjava-str2double.dpatch, pr28661.dpatch. + * Disable ssp on hppa, not supported. + * i386-biarch.dpatch: Avoid warnings about macro redefinitions. + + -- Matthias Klose Fri, 29 Sep 2006 22:32:41 +0200 + +gcc-4.1 (4.1.1ds1-14) unstable; urgency=medium + + [Matthias Klose] + * Update to SVN 20060920. + - Fix PR c++/26957. Closes: #373257, #386910. + - Fix PR rtl-optimization/28243. Closes: #378325. + * Remove patch for PR rtl-optimization/28634, applied upstream. + * Fix FTBFS on GNU/kFreeBSD (fallout from the backport of classpath-0.92). + (Petr Salinger). Closes: #385974. + * Merge from Ubuntu: + - Do not encode the subminor version in the jar files. + - Fix typo for the versioned gcj subdirectory in lib32gcj-0. + - When running the i386 binaries on amd64, adjust the properties + java.home, gnu.classpath.home.url, sun.boot.class.path, + gnu.gcj.precompiled.db.path. + - Configure the 32bit build on amd64 + --with-java-home=/usr/lib32/jvm/java-1.4.2-gcj-4.1-1.4.2.0/jre. + - Configure --with-long-double-128 for glibc-2.4 on alpha, powerpc, ppc64, + s390, s390x, sparc, sparc64. + - Update the java backport from the redhat/gcc-4_1-branch upto 2006-09-20. + - Fix PR java/29013, invalid byte code generation. Closes: #386926. + - debian/patches/gcc-pfrs-2.dpatch: Apply a fix for a regression in the + backport of PR 28946 from the trunk (H.J. Lu). + * Backport PR classpath/28661 from the trunk. + * Don't ship the .la files for the java modules. Closes: #386228. + * gcj-4.1: Remove dangling symlink. Closes: #386430. + * gij: Suggest java-gcj-compat, gcj: Suggest java-gcj-compat-dev. + Closes: #361942. + * Fix infinite loop in string-to-double conversion on 64bit targets. + Closes: #348792. + * gij-4.1: Ignore exit value of gcj-dbtool in postinst. Adresses: #388505. + * libgcj-common: Move rebuild-gcj-db from java-gcj-compat into libgcj-common. + * On hppa, install a wrapper around gij-4.1 to ignore unaligned memory + accesses. Works around buildd configurations enabling this check by + default. Addresses: #364819. + + [Ludovic Brenta] + * debian/patches/ada-libgnatprj.dpatch: Build mlib-tgt-linux.adb instead of + mlib-tgt.adb. Closes: #387826. + * debian/patches/ada-pr15802.dpatch: Backport from the trunk. + Closes: #246384. + * debian/control.m4 (gnat-4.1): do not provide gnat (supplied by + gcc-defaults instead); conflict with gnat-4.2 which will soon be in + unstable. + + [Roman Zippel] + * debian/patches/m68k-dwarf2.dpatch: Recognize stack adjustments also + in the src of an instruction. + * debian/patches/m68k-jumptable.dpatch: Don't force byte offset when + accessing the jumptable, gas can generate the correct offset size instead. + * debian/patches/m68k-peephole.dpatch: Convert some text peepholes to rtl + peepholes, so the correct DWARF2 information can be generated for stack + manipulations (Keep a few peepholes temporarily disabled). + * debian/patches/m68k-peephole-note.dpatch: Don't choke on notes while + reinserting REG_EH_REGION notes. + * debian/patches/m68k-return.dpatch: Don't use single return if fp register + have to be restored. Closes: #386864. + * debian/patches/m68k-sig-unwind.dpatch: Add support for unwinding over + signal frames. + * Fix PR rtl-optimization/27736, backport from the trunk. + * Add java support for m68k. Closes: #312830, #340874, #381022. + + -- Matthias Klose Sun, 24 Sep 2006 19:36:31 +0200 + +gcc-4.1 (4.1.1ds1-13) unstable; urgency=medium + + * Update to SVN 20060901; remove patches applied upstream: + - PR target/24367. + - PR c++/26670. + * Apply proposed patch for PR fortran/28908. + * Fix biarch symlinks in lib64stdc++ for cross builds. + * Fix biarch symlinks in lib32objc on amd64. + + -- Matthias Klose Fri, 1 Sep 2006 00:04:05 +0200 + +gcc-4.1 (4.1.1ds1-12) unstable; urgency=medium + + [Matthias Klose] + * Update to SVN 20060830. + * Add backport of PR other/26208, bump libgcc1 shlibs dependency. + * Add backport of PR c++/26670. Closes: #356548. + * Apply proposed patch for PR target/24367 (s390). + * Add /usr/lib/jni to the libjava dlsearch path. Closes: #364820. + * Build without GFDL licensed docs. Closes: #384036. + - debian/patches/{svn-doc-updates,pr25524-doc,pr26885-doc}.dpatch: + Split out -doc specific patches. + - debian/*.texi, debian/porting.html: Add dummy documentation. + - debian/rules.unpack, debian/rules.patch: Update for non-gfdl build. + - fastjar.texi: Directly define the gcctabopt and gccoptlist macros. + + * Merge from Ubuntu: + - Backport the classpath-0.92, libjava, gcc/java merge from the + redhat/gcc-4_1-branch branch. + - Apply the proposed patch for PR libgcj/28698. + - Change the libgcj/libgij sonames. Rename libgcj7 to libgcj7-0. + - Do not remove the rpath from libjvm.so and libjawt.so. Some + configure scripts rely on being able to link that libraries + directly. + - When running the i386 binaries on amd64, look in + /usr/lib32/gcj-x.y and /usr/lib32/jni instead. + - Add /usr/lib/jni to java.library.path. Closes: #364820. + - Add debugging symbols for more binary packages to libgcj7-dbg. + Closes: #383705. + - libgcj7-dev: Remove conflicts with older libgcjX-dev packages. + - Do not build the libgcj-bc and lib32gcj-bc packages anymore from + the gcj-4.1 source. + + [Roman Zippel] + * debian/patches/m68k-limit_reload.dpatch: Correctly limit reload class. + Closes: #375522. + * debian/patches/m68k-split_shift.dpatch: Use correct predicates for long long + shifts and use more splits. Closes: #381572. + * debian/patches/m68k-prevent-qipush.dpatch: Prevent combine from creating + a byte push on the stack (invalid on m68k). Closes: #385021. + * debian/patches/m68k-autoinc.dpatch: Recognize a few more autoinc possibilities. + * debian/patches/pr25514.dpatch: Backport from the trunk. + * debian/patches/m68k-gc.dpatch: Change STACKBOTTOM to LINUX_STACKBOTTOM + so it works with 2.6 kernels. + * Other m68k bug reports fixed in 4.1.1-11 and 4.1.1-12: + Closes: #378599, #345574, #344041, #323426, #340293. + * Build the stage1 compiler using -g -O2; saves a few hours build time + and apparently is working at the moment. + + -- Matthias Klose Tue, 29 Aug 2006 21:37:28 +0200 + +gcc-4.1 (4.1.1-11) unstable; urgency=low + + * The "Our priority are our users, remove the documentation!" release. + + [Matthias Klose] + * Fix build failure building the hppa->hppa64 cross compiler. + * Update to SVN 20060814. + - Fix directory traversal vulnerability in fastjar. Closes: #368397. + CVE-2006-3619. + - Fix PR rtl-optimization/23454, ICE in invert_exp_1 on sparc. + Closes: #321215. + - Fix PR c++/26757, C++ front-end producing two DECLs with the same UID. + Closes: #356569. + * Remove patch for PR rtl-optimization/28075, applied upstream. + * Apply proposed patch for PR rtl-optimization/28634, rounding problem with + -fdelayed-branch on hppa/mips. Closes: #381710. + * Fixed at least in 4.1.1-10: boost::date_time build failure. + Closes: #382352. + * Build-depend on make (>= 3.81), add make (>= 3.81) as dependency to + gcc-4.1-source. Closes: #381117. + * Backport of libffi from the trunk; needed for the java backport in + experimental. + * libffi4-dev: Install the libffi_convenience library as libffi_pic.a. + * When building a package without the GFDL'd documentation, don't create + the alternative's slave links for manual pages for the java tools. + * Do not build the -doc packages and derived manual pages licensed under + the GFDL with invariant sections or cover texts. + * Only build the libssp package, if the target libc doesn't provide + ssp support. + * Run the complete testsuite, when building a standalone gcj package. + + [Roman Zippel] + * debian/patches/m68k-fjump.dpatch: + Always use as fjcc pseudo op, we rely heavily on as to generate the + right size for the jump instructions. Closes: #359281. + * debian/patches/m68k-gc.dpatch: + The thread suspend handler has to save all registers. + Reenable MPROTECT_VDB, it should work, otherwise it's probably a kernel bug. + * debian/patches/m68k-save_pic.dpatch: + Correctly save the pic register, when not done by reload(). + (fixes _Unwind_RaiseException and thus exception handling). + * debian/patches/m68k-libffi.dpatch: Add support for closures. + * debian/patches/m68k-bitfield.dpatch: Avoid propagation of mem expression + past a zero_extract lvalue. + * debian/patches/m68k-dwarf.dpatch: Correct the dwarf frame information, + but preserve compatibility. + + [Christian Aichinger] + * Fix building a cross compiler targeted for ia64. Closes: #382627. + + -- Matthias Klose Tue, 15 Aug 2006 00:41:00 +0200 + +gcc-4.1 (4.1.1-10) unstable; urgency=low + + * Update to SVN 20060729. + - Fix PR c++/28225, segfault in type_dependent_expression_p. + Closes: #376148. + * Apply proposed patch for PR rtl-optimization/28075. + Closes: #373820. + * Apply proposed backport and proposed patch for PR rtl-optimization/28221. + Closes: #376084. + * libgcj7-jar: Loosen dependency on gcj-4.1-base. + * Add ssp header files to the private gcc includedir. + * Do not build the Ada packages from the gcc-4.1 source, introducing + a new gnat-4.1 source package. + * Build libgnat on alpha and s390 as well. + * Do not build the gnat-4.1-doc package (GFDL with invariant sections or + cover texts). + * Remove references to the stl-manual package. Closes: #378698. + + -- Matthias Klose Sat, 29 Jul 2006 22:08:59 +0200 + +gcc-4.1 (4.1.1-9) unstable; urgency=low + + * Update to SVN 20060715. + - Fix PR c++/28016, do not emit uninstantiated static data members. + Closes: #373895, #376871. + * Revert the patch to fix PR c++/27227. Closes: #378321. + * multiarch-include.dpatch: Renamed from biarch-include.dpatch; + apply for all architectures. + * Do not build the java compiler in gcc-4.1 package, just include the + options and specs in the gcc driver. + * Remove gnat-4.0 as an alternative build dependency. + * Add a patch to enable -fstack-protector by default for C, C++, ObjC, ObjC++. + The patch is disabled by default. + + -- Matthias Klose Sat, 15 Jul 2006 17:07:29 +0200 + +gcc-4.1 (4.1.1-8) unstable; urgency=medium + + * Update to SVN 20060708. + - Fix typo in gcov documentation. Closes: #375140. + - Fix typo in gccint documentation. Closes: #376412. + - [alpha], Fix -fvisibility-inlines-hidden segfaults on reference to + static method. PR target/27082. Closes: #369642. + + * Fix ppc64 architecture string in debian/multiarch.inc. Closes: #374535. + * Fix conflict, replace and provide libssp0-dev for cross compilers. + Closes: #377012. + * Ignore compiler warnings when checking whether compiler driver understands + Ada fails. Closes: #376660. + * Backport fix for PR libmudflap/26864 from the trunk. Closes: #26864. + * README.C++: Remove non-existing URL. Closes: #347601. + * gij-4.1: Provide java2-runtime. Closes: #360906. + + * Closed reports reported against gcc-3.0 and fixed in gcc-4.1: + - C++ + + PR libstdc++/13943, call of overloaded `llabs(int)' is ambiguous. + Closes: #228645. + - Java + + Fixed segmentation fault on compiling bad program. Closes: #165635 + * Closed reports reported against gcc-3.3 and fixed in gcc-4.1: + - Stack protector available. Closes: #213994, #233208. + - Better documentation of -finline-limit option. Closes: #296047. + * Closed reports reported against gcc-3.4 and fixed in gcc-4.1: + - General + + Fixed [unit-at-a-time] Using -O2 cannot detect missing return + statement in a function. Closes: #276843. + - C++ + + PR13943, call of overloaded `llabs(int)' is ambiguous. Closes: #228645. + + PR c++/21280, #pragma interface, templates, and "inline function used + but never defined". Closes: #364412. + - Architecture specific: + - m68k + + Segfault building glibc. Closes: #353618. + + ICE when trying to build boost. Closes: #321486. + * Closed reports reported against gcc-4.0 and fixed in gcc-4.1: + - General + + Handling of #pragma GCC visibility for builtin functions. + Closes: #330279. + + gettext interpretation the two conditional strings as one. + Closes: #227193. + + ICE due to if-conversion. Closes: #335078. + + Fix unaligned accesses with __attribute__(packed) and memcpy. + Closes: #355297. + + Fix ICE in expand_expr_real_1, at expr.c. Closes: #369817. + - Ada + + Link error not finding -laddr2line. Closes: #322849. + + ICE on invalid code. Closes: #333564. + - C++ + + libstdc++: bad thousand separator with fr_FR.UTF-8. Closes: #351786. + + The Compiler uses less memory than 4.0. Closes: #336225. + + Fix "fails to compare reverse map iterators". Closes: #362840. + + Fix "fail to generate code for base destructor defined inline with + pragma interface". Closes: #356435. + + Fix ICE in cp_expr_size, at cp/cp-objcp-common.c. Closes: #317455. + + Fix wrong warning: control may reach end of non-void function. + Closes: #319309. + + Fix bogus warning "statement has no effect" with template and + statement-expression. Closes: #336915. + + Fixed segfault on syntax error. Closes: #349087. + + Fix ICE with __builtin_constant_p in template argument. + Closes: #353366. + + Implement DR280 (fixing "no operator!= for const_reverse_iterator"). + Closes: #244894. + - Fortran + + Fix wrong behaviour in unformatted writing. Closes: #369547. + - Java + + Fixed segfault on -fdump-tree-all-all. Closes: #344265. + + Fixed ant code completion in eclipse generating a nullpointer + exception. Closes: #337510. + + Fixed abort in gnu_java_awt_peer_gtk_GtkImage.c. Closes: #343112. + + Fixed assertion failure in gij with rhdb-explain. Closes: #335650. + + Fixed assertion failure when calling JTabbedPane.addTab(null, ...). + Closes: #314704. + + Fixed error when displaying empty window with bound larger than the + displayed content. Closes: #324502. + + Fixed: Exception in JComboBox.removeAllItems(). Closes: #314706. + + Fixed assertian error in gnu_java_awt_peer_gtk_GtkImage.c. + Closes: #333733. + - libmudflap + + PR libmudflap/23170, libmudflap should not use functions marked + obsolescent by POSIX/SUS. Closes: #320398. + - Architecture specific: + - m68k + + FTBFS building tin. Closes: #323016. + + ICE with -g -fomit-frame-pointer. Closes: #331150. + + ICE in instantiate_virtual_regs_lossage. Closes: #333536. + + Wrong code generation with loop unrolling. Closes: #342121. + + ICEs while building gst-ffmpeg. Closes: #343692. + - mips + + Fix gjdoc build failure. Closes: #344986. + + Fix link failure for static libs and object files when xgot + needs to be used. Closes: #274942. + * gnat bug reports fixed since gnat-3.15p: + - GNAT miscounts UTF8 characters in string with -gnaty. Closes: #66175. + - Bug box from "with Text_IO" when compiling optimized. Closes: #243795. + - Nonconforming parameter lists not detected. Closes: #243796. + - Illegal use clause not detected. Closes: #243797. + - Compiler enters infinite loop on illegal program with tagged records. + Closes: #243799. + - Compiler crashes on illegal program (missing discriminant, unconstrained + parent). Closes: #243800. + - Bug box at sinfo.adb:1215 on illegal program. Closes: #243801. + - Bug box at sinfo.adb:1651 on illegal program. Closes: #243802. + - Illegal program not detected (entry families). Closes: #243803. + - Illegal program not detected, RM 10.1.1(14). Closes: #243807. + - Bug box at exp_ch9.adb:7254 on illegal code. Closes: #243812. + - Illegal program not detected, RM 4.1.4(14). Closes: #243816. + - Bug box in Gigi, code=116, on legal program. Closes: #244225. + - Illegal program not detected, 12.7(10) (generic parameter is visible, + shouldn't be). Closes: #244483. + - Illegal program not detected, ambiguous aggregate. Closes: #244496. + - Bug box at sem_ch3.adb:8003. Closes: #244940. + - Bug box in Gigi, code=103, on illegal program. Closes: #244945. + - Legal program rejected, overloaded procedures. Closes: #246188. + - Bug box in Gigi, code=999, on legal program. Closes: #246388. + - Illegal program not detected, RM 10.1.6(3). Closes: #246389. + - Illegal program not detected, RM 3.10.2(24). Closes: #247014. + - Illegal program not detected, RM 3.9(17). Closes: #247015. + - Legal program rejected. Closes: #247016. + - Legal program rejected. Closes: #247021. + - Illegal program not detected, RM 4.7(3). Closes: #247022. + - Illegal program not detected, RM 3.10.2(27). Closes: #247562. + - Legal program rejected, "limited type has no stream attributes". + Closes: #247563. + - Wrong output from legal program. Closes: #247565. + - Compiler enters infinite loop on illegal program. Closes: #247567. + - Illegal program not detected, RM 8.6(31). Closes: #247568. + - Legal program rejected, visible declaration not seen. Closes: #247572. + - Illegal program not detected, RM 8.2(9). Closes: #247573. + - Wrong output from legal program, dereferencing access all T'Class. + Closes: #248171. + - Compiler crashes on illegal program, RM 5.2(6). Closes: #248174. + - Cannot find generic package body, RM 1.1.3(4). Closes: #248677. + - Illegal program not detected, RM 3.4.1(5). Closes: #248679. + - Compiler ignores legal override of abstract subprogram. Closes: #248686. + - Bug box, Assert_Failure at sinfo.adb:2365 on illegal program. + Closes: #251266. + - Ada.Numerics.Generic_Elementary_Functions.Log erroneout with -gnatN. + Closes: #263498. + - Bug box, Assert_Failure at atree.adb:2906 or Gigi abort, code=102 + with -gnat -gnatc. Closes: #267788. + - Bug box in Gigi, code=116, 'Unrestricted_Access of a protected + subprogram. Closes: #269775. + - Stack overflow on illegal program, AI-306. Closes: #276225. + - Illegal program not detected, RM B.1(24). Closes: #276226. + - Wrong code generated with -O -fPIC. Closes: #306833. + - Obsolete: bashism's in debian/rules file. Closes: #370681. + - Supports more debian architectures. Closes: #171477. + + -- Matthias Klose Sat, 8 Jul 2006 16:24:47 +0200 + +gcc-4.1 (4.1.1-7) unstable; urgency=low + + * Prefer gnat-4.1 over gnat-4.0 as a build dependency. + * libssp0: Set priority to standard. + + -- Matthias Klose Sun, 2 Jul 2006 10:22:50 +0000 + +gcc-4.1 (4.1.1-6) unstable; urgency=low + + [Ludovic Brenta] + * Do not provide the symbolic link /usr/bin/gnatgcc; this will now + be provided by package gnat from the source package gcc-defaults. + * debian/control.m4, debian/control (gnat): conflict with gnat (<< 4.1), + not all versions of gnat, since gcc-defaults will now provide gnat (= 4.1) + which depends on gnat-4.1. + + [Matthias Klose] + * libjava: Change the default for enable_hash_synchronization_default + on PA-RISC. Tighten the libgcj7 shlibs version on hppa. + * Update to SVN 20060630. + * Apply proposed patch for PR 26991. + * Don't use the version for the libstdc++ shlibs dependency for the libgcj + shlibs dependency. + * Merge from Ubuntu edgy: + - Fix %g7 usage in TLS, add patch sparc-g7.dpatch, fixes glibc-2.4 build + failure on sparc (Fabio M. Di Nitto). + - Merge libssp0-dev into gcc-4.1 (-fstack-protector is a common option). + - Run the testsuite with -fstack-protector as well. + + [Bastian Blank] + * Make it possible to overwrite arch per DEB_TARGET_ARCH and DEB_TARGET_GNU_TYPE. + * Disable biarch only on request for cross builds. + * Use correct source directory for tarballs. + * Produce correct multiarch.inc for source builds. + + -- Matthias Klose Sat, 1 Jul 2006 01:49:55 +0200 + +gcc-4.1 (4.1.1-5) unstable; urgency=low + + * Fix build error running with dpkg-buildpackage -rsudo. + + -- Matthias Klose Wed, 14 Jun 2006 01:54:13 +0200 + +gcc-4.1 (4.1.1-4) unstable; urgency=low + + * Really do not backout the fix for PR c++/26068. + Closes: #372152, #372559. + * Update fastjar version string to 4.1. + * Disable pascal again. + + -- Matthias Klose Mon, 12 Jun 2006 20:29:57 +0200 + +gcc-4.1 (4.1.1-3) unstable; urgency=low + + * Update to SVN 20060608, do not revert the fix for PR c++/26068. + Closes: #372152, #372559. + * Fix build failures for Pascal, enable Pascal on all architectures. + * Fix another build failure on GNU/kFreeBSD (Aurelien Jarno). + Closes: #370661. + * Fix build fauilure in gcc/p with parallel make. + * Remove cross-configure patch (Kazuhiro Inaoka). Closes: #370649. + * Only build the gcc-4.1-source package, when building from the gcc-4.1 + source. + * Fix upgrade problem from standalone gcj-4.1. + * Fix build error using bison-2.2, build-depend on bison (>= 2.3). + Closes: #372605. + * Backport PR libstdc++/25524 from the trunk, update the biarch-include + patch. mips triarch support can be added more easily. + + -- Matthias Klose Mon, 12 Jun 2006 00:23:45 +0200 + +gcc-4.1 (4.1.1-2) unstable; urgency=low + + * Update to SVN 20060604. + - Fix PR c++/26757, C++ front-end producing two DECLs with the same UID. + Closes: #356569. + - Fix PR target/27158, ICE in extract_insn with -maltivec. + Closes: #362307. + * Revert PR c++/26068 to work around PR c++/27884 (Martin Michlmayr). + Closes: #370308. + * Mention Ada in copyright, update copyright file (Ludovic Brenta). + Closes: #366744. + * Fix kbsd-gnu-java.dpatch (Petr Salinger). Closes: #370320. + * Don't include version control files in gcc-4.1-source. + + -- Matthias Klose Sun, 4 Jun 2006 19:13:37 +0000 + +gcc-4.1 (4.1.1-1) unstable; urgency=low + + [Matthias Klose] + * Update to SVN 20060601. + * Reenable the gpc build. + * PR libgcj/26483, libffi patch for IA-64 denorms, taken from trunk. + * Disable Ada for m32r targets. Closes: #367595. + * lib32gfortran1: Do not create empty directory /usr/lib32. Closes: #367999. + * gcc-4.1: Add a conflict to the gcj-4.1 version with a different + gcc_libdir. + * Build gij/gcj for GNU/k*BSD. Closes: #367166. + * Update hurd-changes patch (Michael Banck). Closes: #369690. + * debian/copyright: Add exception for the gpc runtime library. + * Update gpc/gpc-doc package descriptions. + + [Ludovic Brenta] + * patches/ada-libgnatprj.dpatch: add prj-pars.ad[bs] and sfn_scan.ad[bs] + to libgnatprj; remove them from gnatmake. + + -- Matthias Klose Thu, 1 Jun 2006 20:35:54 +0200 + +gcc-4.1 (4.1.0-4) unstable; urgency=low + + [Ludovic Brenta] + * Fix a stupid bug whereby fname.ad{b,s} would be included in both + libgnatvsn-dev and libgnatprj-dev, preventing use of gnatprj.gpr. + Closes: #366733. + + -- Matthias Klose Thu, 11 May 2006 04:34:50 +0200 + +gcc-4.1 (4.1.0-3) unstable; urgency=low + + * Update to SVN 20060507. + * debian/rules.d/binary-java.mk: Use $(lib32) everywhere. Closes: #365388. + * Always configure hppa64-linux-gnu with + --includedir=/usr/hppa64-linux-gnu/include. + * Make libgnatvsn4.1 and libgnatprj4.1 priority optional. Closes: #365900. + * Call autoconf2.13 explicitely in the Ada patches, build-depend on + autoconf2.13. Closes: #365780. + * Fix libgnatprj-dev and libgnatvsn-dev dependencies on their shared + libraries. + * Deduce softfloat and vfp (ARM) configure options (Pjotr Kourzanov). + * Update proposed patch for PR26885 (May 2 version). + * Build the libxxstdc++-dbg packages, when not building the library pacakges. + * Do not include the _pic library in the libxxstdc++-dbg packages. + + -- Matthias Klose Sun, 7 May 2006 15:29:53 +0200 + +gcc-4.1 (4.1.0-2) unstable; urgency=medium + + * Update to SVN 20060428. + * Apply proposed patches for PR26885. + + * Keep libffi doc files in its own directory. Closes: #360466. + * Update ppc64 patches for 4.1 (Andreas Jochens). Closes: #360498. + * Fix PR tree-optimization/26763, wrong-code, taken from the 4.1 branch. + Closes: #356896. CVE-2006-1902. + * hppa-cbranch, hppa-cbranch2 patches: Fix for PR target/26743, + PR target/11254, PR target/10274, backport from trunk (Randolph Chung). + * Let libgccN provide -dcv1 when cross-compiling (Pjotr Kourzanov). + Closes: #363289. + * (Build-)depend on glibc-2.3.6-7. Closes: #360895, #361904. + * Fix a pedantic report about a package description. Add a hint that + we do not like bug reports with locales other than "C". Closes: #361409. + * Enable the libjava interpreter on mips/mipsel. + * gcc-4.1-source: Depend on gcc-4.1-base. + * gnat-4.1: Fix permissions of .ali files. + * Build lib32gcj7 on amd64. + * debian/patches/ada-gnatvsn.dpatch: New. Apply proposed fix for + PR27194. + + [Ludovic Brenta] + * debian/patches/ada-default-project-path.dpatch: new. Change the + default search path for project files to the one specified + by the Debian Policy for Ada: /usr/share/ada/adainclude. + * debian/patches/ada-symbolic-tracebacks.dpatch: new. Enable support for + symbolic tracebacks in exceptions. + * debian/patches/ada-missing-lib.dpatch: remove, superseded by the above. + * debian/patches/ada-link-lib.dpatch: changed. + - Instead of building libada as a target library only, build it as + both a host and, if different, target library. + - Build the GNAT tools in their top-level directory; do not use + recursive makefiles. + - Link the GNAT tools dynamically against libgnat. + - Apply proposed fix for PR27300. + - Rerun autoconf (Matthias Klose). + * debian/patches/ada-libgnatvsn.dpatch: new. + - Introduce a new shared library named libgnatvsn, containing + common components of GNAT under the GNAT-Modified GPL, for + use in GNAT tools, ASIS, GLADE and GPS. + - Link the gnat tools against this new library. + - Rerun autoconf (Matthias Klose). + * debian/patches/ada-libgnatprj.dpatch: new. + - Introduce a new shared library named libgnatprj, containing the + GNAT Project Manager, i.e. the parts of GNAT that parses project + files (*.gpr). Licensed under pure GPL; for use in GLADE and GPS. + - Link the gnat tools against this new library. + - Rerun autoconf (Matthias Klose). + * debian/patches/ada-acats.dpatch: new. + - When running the ACATS, look for the gnat tools in their new + directory (build/gnattools), and for the shared libraries in + build/gcc/ada/rts, build/libgnatvsn and build/libgnatprj. + * debian/gnatvsn.gpr, debian/gnatprj.gpr: new. + * debian/rules.d/binary-ada.mk, debian/control.m4: new binary packages: + libgnatvsn-dev, libgnatvsn4.1, libgnatprj-dev, libgnatprj4.1. Place + the *.gpr files in their respective -dev packages. + + -- Matthias Klose Sat, 29 Apr 2006 00:32:09 +0200 + +gcc-4.1 (4.1.0-1) unstable; urgency=low + + * libstdc++CXX-BV-dev.preinst: Remove (handling of c++ include dir for 4.0). + * libgcj-common: Move removal of docdir from preinst into postinst. + * libgcj7: Move removal of docdir from preinst into postinst. + * Drop alternative build dependency on gnat-3.4, not built anymore. + * Fix PR libgcj/26103, wrong exception thrown (4.1 branch). + * debian/patches/libjava-stacktrace.dpatch: Add support to print file names + and line numbers in stacktraces. + * Add debugging symbols for libgcjawt and lib-gnu-java-awt-peer-gtk + in the libgcj7-dbg and lib32gcj7-dbg packages. + * Remove dependency of the libgcj-dbg packages on the libgcj-dev packages, + add recommendations on binutils and libgcj-dev. Mention the requirement + of binutils for the stacktraces. + * Fix upgrade from version 4.0.2-9, loosing the Debian changelog. + Closes: #355439. + * gij/gcj: Install one alternative for each command, do not use slave + links for rmiregistry, javah, rmic. Ubuntu #26781. Closes: #342557. + * Fix for PR tree-optimization/26587, taken from the 4.1 branch. + * Fix PR libstdc++/26526 (link failure when _GLIBCXX_DEBUG is defined). + * Configure with --enable-clocale=gnu, even if not building C++ packages. + * Remove runtime path from biarch libraries as well. + * PR middle-end/26557 (ice-on-vaild-code, regression), taken from + the gcc-4_1-branch. Closes: #349083. + * PR tree-optimization/26672 (ice-on-vaild-code, regression), taken from + the gcc-4_1-branch. Closes: #356231. + * PR middle-end/26004 (rejects-vaild-code, regression), taken from + the gcc-4_1-branch. + * When building as standalone gcj, build libgcc4 (hppa only) and fastjar. + * Configure --with-cpu=v8 on sparc. + * debian/patches/libjava-hppa.dpatch: pa/pa32-linux.h + (CRT_CALL_STATIC_FUNCTION): Define when CRTSTUFFS_O is defined. + (John David Anglin). Closes: #353346. + * Point to the 4.1 version of README.Bugs (closes: #356230). + * Disable the libmudflap testsuite on alpha (getting killed). + + -- Matthias Klose Sat, 18 Mar 2006 23:00:39 +0100 + +gcc-4.1 (4.1.0-0) experimental; urgency=low + + * GCC 4.1.0 final release. + * Build the packages for the Java language from a separate source. + * Update NEWS.html, NEWS.gcc. + * libgcj-doc: Auto generated API documentation for libgcj7, classpath + example programs. + * Add gjdoc to Build-Depends-Indep. + * On amd64, build-depend on libc6-dev-i386 instead of ia32-libs-dev. + * Internal ssp headers now installed in the gcc libdir. + * Do not build gcj-4.1-base when building the gcc-4.1 packages. + * When building as gcj-4.1, use the tarball from the gcc-4.1-source + package. + + [Ludovic Brenta] + * Allow to enable and disable NLS and bootstrapping from the environment. + - Adding "nls" to WITHOUT_LANG disables NLS support. + - If WITH_BOOTSTRAP is set, debian/rules2 calls configure + --enable-bootstrap=$(WITH_BOOTSTRAP) and just "make". If + WITH_BOOTSTRAP is unset, it calls configure without a bootstrapping + option and calls "make profiledbootstrap" or "make bootstrap-lean" + depending on the target CPU. + Currently overwritten to default to "bootstrap". + + -- Matthias Klose Thu, 2 Mar 2006 00:03:45 +0100 + +gcc-4.1 (4.1ds9-0exp9) experimental; urgency=low + + * Update to GCC 4.1.0 release candidate 1 (gcc-4.1.0-20060219 tarball). + * Update gcc-version patch for gcc-4.1. + * libgccN, libstdc++N*: Fix upgrade of /usr/share/doc symlinks. + * libjava awt & swing update, taken from trunk 2006-02-16. + * libgcj7-dev: Suggest libgcj-doc, built from a separate source package. + * Shorten build-dependency line (work around buildd problems + on arm* and mips*). + * New patch gcc-ice-hack (saving the preprocessed source on an ICE), + taken from Fedora. + + -- Matthias Klose Mon, 20 Feb 2006 10:07:23 +0100 + +gcc-4.1 (4.1ds8-0exp8) experimental; urgency=low + + * Update to SVN 20060212, taken from the 4.1 release branch. + * libgccN: Fix upgrade of /usr/share/doc/libgccN symlink. + + -- Matthias Klose Sun, 12 Feb 2006 19:48:31 +0000 + +gcc-4.1 (4.1ds7-0exp7) experimental; urgency=low + + * Update to SVN 20060127, taken from the 4.1 release branch. + - On hppa, bump the libgcc soversion to 4. + * Add an option not to depend on the system -base package for cross compiler + (Ian Wienand). Closes: #347484. + * Remove workaround increasing the stack size limit for some architectures, + not needed anymore on ia64. + * On amd64, build-depend on libc6-dev-i386, depend on libc6-i386, where + available. + * libstdc++6: Properly upgrade the doc directory. Closes: #346171. + * libstdc++6: Add a conflict to scim (<< 1.4.2-1). Closes: #343313. + * Set default 32bit ix86 architecture to i486. + + -- Matthias Klose Fri, 27 Jan 2006 22:23:22 +0100 + +gcc-4.1 (4.1ds6-0ubuntu6) experimental; urgency=low + + * Update to SVN 20060107, taken from the 4.1 release branch. + - Remove fix for PR ada/22533, fixed by patch for PR c++/23171. + * Remove binary packages from the control file, which aren't built + yet on any architecture. + * gcc-hppa64: Use /usr/hppa64-linux-gnu/include as location for the glibc + headers, tighten glibc (build-)dependency. + * libffi [arm]: Add support for closures, libjava [arm]: enable the gij + interpreter (Phil Blundell). Addresses: #337263. + * For the gcj standalone build, include cc1 into the gcj-4.1 package, + needed for linking java programs compiled to native code. + + -- Matthias Klose Sat, 7 Jan 2006 03:36:33 +0100 + +gcc-4.1 (4.1ds4-0exp4) experimental; urgency=low + + * Update to SVN 20051210, taken from the 4.1 release branch. + * Prepare to build the java packages from it's own source (merged + from Ubuntu). + - Build the java packages from the gcc-4.1 source, as long as packages + are prepared for experimental. + - When built as gcj, run only the libjava testsuite, don't build the + libstdc++ debug packages, don't package the gcc source. + - Loosen package dependencies, when java packages are built from + separate sources. + - Fix gcj hppa build, when java packages are built from separate sources. + - gij-4.1: Install test-summary, when doing separate builds. + - Allow java packages be installed independent from other packages built + from the source package. + - Rename libgcj7-common to libgcj7-jar. + - Introduce a gcj-4.1-base package to completely separate the two and not + duplicate the changelog in each gcj/gij package. + * Java related changes: + - libjava-xml-transform: Update from classpath trunk, needed for + eclipse (Michael Koch), applied upstream. + - Fix java wrapper scripts to point to 4.1 (closes: #341710). + - Reenable java on mips and mipsel. + - Fix libgcj6 dependency. Ubuntu #19935. + - Add libxt-dev as a java build dependency. autoconf explicitely checks + for X11/Intrinsic.h. + * Ada related changes: + - Apply proposed fix for PR ada/22533, reenable ada on alpha, powerpc, + mips, mipsel and s390. + - Add Ada support for GNU/kFreeBSD (Aurelien Jarno). Closes: #341356. + - Remove ada bootstrap workaround for alpha. + * Build a separate gcc-4.1-source package (Bastian Blank). Closes: #333922. + * Remove obsolete patch: libstdc++-automake. + * Remove patch integrated upstream: libffi-mips. + * Fix the installation of the hppa64 compiler in snapshot builds. + * Rename libgfortran0* to libgfortran1* (upstream soversion change). + * Add a dependency on libc-dev for all compilers / -dev packages except + gcc (which can be used for kernel builds without libc-dev). + * libffi4-dev: Fix package description. + * On amd64, install 32bit libraries into /emul/ia32-linux/usr/lib. + Addresses: #341147. + * Fix installation of biarch libstdc++ headers on amd64. + * Configure --with-tune=i686 on ix86 architectures (on Ubuntu with + -mtune=pentium4). Remove the cpu-default-* patches. + * debian/control.m4: Fix libxxgcc package names. + * Update the build infrastructure to build cross compilers + (Nikita V. Youshchenko). + * Tighten binutils (build-)dependency. Closes: #342484. + * Symlink more doc directories. + * debian/control.m4: Explicitely set Architecture for biarch packages. + + -- Matthias Klose Sat, 10 Dec 2005 16:56:45 +0100 + +gcc-4.1 (4.1ds1-0ubuntu1) UNRELEASED; urgency=low + + * Build Java packages only. + * Update to SVN 20051121, taken from the 4.1 release branch. + - Remove libjava-saxdriver-fix patch, applied upstream. + - Remove ada-gnat-version patch, applied upstream. + * Fix FTBFS in biarch builds on 32bit kernels. + * Update libstdc++-doc doc-base file (closes: #339046). + * Remove obsolete patch: gcc-alpha-ada_fix. + * Fix installation of biarch libstdc++ headers (Ubuntu #19655). + * Fix sparc and s390 biarch patches to build the 64bit libffi. + * Work around biarch build failure in libjava/classpath/native/jni/midi-alsa. + * Install spe.h header on powerpc. + * Add libasound build dependencies. + * libgcj: Fix installation of libgjsmalsa library. + * Remove patches not used anymore: libjava-no-rpath, i386-config-ml-nomf, + libobjc, multiarch-include, disable-biarch-check-mf, gpc-profiled, + gpc-no-gpidump, libgpc-shared, acats-expect. + * Fix references to manuals in gnat(1). Ubuntu #19772. + * Remove build dependency on xlibs-dev, add libxtst-dev. + * Do not configure with --disable-werror. + * Merge *-config-ml patches into one config-ml patch, configure the biarch + libs in debian/rules.defs. + * debian/gcj-wrapper: Accept -Xss. + * Do not build biarch java on Debian (missing biarch libasound). + * Do not build the java packages from this source package, avoiding + dependencies on X. + + -- Matthias Klose Mon, 21 Nov 2005 20:29:43 +0100 + +gcc-4.1 (4.1ds0-0exp0) experimental; urgency=low + + * Configure libstdc++ using the default allocator. + * Update to 20051112, taken from the svn trunk. + + -- Matthias Klose Sat, 12 Nov 2005 23:47:01 +0100 + +gcc-4.1 (4.1ds0-0ubuntu0) breezy; urgency=low + + * UNRELEASED + * First snapshot of gcc-4.1 (CVS 20051019). + - adds SSP support (closes: #213994, #233208). + * Remove patches applied upstream/not needed anymore. + * Update patches for 4.1: link-libs, gcc-textdomain, libjava-dlsearch-path, + rename-info-files, reporting, classmap-path, i386-biarch, sparc-biarch, + libjava-biarch-awt, ada-gcc-name. + * Disable patches: + - 323016, m68k, necessary for 4.1? + * debian/copyright: Update for 4.1. + * debian/control, debian/control.m4, debian/rules.defs, debian/rules.conf: + Update for 4.1, add support for Obj-C++ and SSP. + * Fix generation of Ada docs in info format. + * Set Ada library version to 4.1. + * Drop gnat-3.3 as an alternative build dependency. + * Use fortran instead of f95 for the build files. + * Update build support for awt peer libs. + * Add packaging support for SSP library. + * Add packaging support for Obj-C++. + * Run the testsuite for -march=i686 on i386 and amd64 as well. + * Fix generation of Pascal docs in html format. + * Update config-ml patches to build libssp biarch. + * Disable libssp for hppa64 build. + * libgcj7-dev: Install jni_md.h. + * Disable gnat for powerpc, currently fails to build. + * Add biarch runtime lib packages for ssp, mudflap, ffi. + * Do not explicitely configure with --enable-java-gc=boehm, which is the + default. + * libjava-saxdriver-fix: Fix a problem in the Aelfred2 SAX parser. + * libstdc++6-4.0-dev: Depend on the libc-dev package. Ubuntu #18885. + * Build-depend on expect-tcl8.3 on all architectures. + * Build-depend on lib32z1-dev on amd64 and ppc64, drop build dependency on + amd64-libs. + * Disable ada on alpha mips mipsel powerpc s390, currently broken. + + -- Matthias Klose Wed, 19 Oct 2005 11:02:31 +0200 + +gcc-4.0 (4.0.2-3) unstable; urgency=low + + * Update to CVS 20051015, taken from the gcc-4_0-branch. + - gcc man page fixes (closes: #327254, #330099). + - PR java/19870, PR java/20338, PR java/21844, PR java/21540: + Remove Debian patches. + - Applied libjava-echo-fix patch. + - Fix PR target/24284, ICE (Segmentation fault) on sparc-linux. + Closes: #329840. + - Fix PR c++/23797, ICE on typename outside template. Closes: #325545. + - Fix PR c++/22551, ICE in tree_low_cst. Closes: #318932. + * libstdc++6: Tighten libstdc++ shlibs version to 4.0.2-3 (new symbol). + * Update generated Ada files. + * Fix logic to disable mudflap and Obj-C++ via the environment. + * Remove f77 build bits. + * gij-4.0: Remove /var/lib/gcj-4.0/classmap.db on purge (closes: #330800). + * Let gcj-4.0 depend on libgcj6-dev, instead of recommending it. This is + not necessary for byte-code compilations, but for compilations to native + code. For compilations to byte-code, use a better compiler like ecj + for now (found in the ecj-bootstrap package). + * Disable biarch setup in cross compilers (Josh Triplett). Closes: #333952. + * Fix with_libnof logic for cross-compilations (Josh Triplett). + Closes: #333951. + * Depend on binutils (>= 2.16.1cvs20050902-1) on the alpha architecture. + Closes: #333954. + * On i386, build-depend on libc6-dev-amd64. Closes: #329108. + * (Build-)depend on glibc 2.3.5-5. + + -- Matthias Klose Sun, 2 Oct 2005 14:25:54 +0200 + +gcc-4.0 (4.0.2-2) unstable; urgency=low + + * Update to CVS 20051001, taken from the gcc-4_0-branch. Includes the + changes between 4.0.2 RC3 and the final 4.0.2 release, missing from + the upstream tarball. Remove patches applied upstream (gcc-c-decl, + pr23182, pr23043, pr23367, pr23891, pr21418, pr24018). + * On ix86 architectures run the testsuite for -march=i686 as well. + * Build libffi on the Hurd (closes: #328705). + * Add big-endian arm (armeb) support (Lennert Buytenhek). Closes: #330730. + * Update libjava xml to classpath CVS HEAD 20050930 (Michael Koch). + * Reapply patch to make -mieee the default on alpha-linux. Closes: #330826. + * Add workaround not to make libmudflap _start/_end not small data on + mips/mipsel, taken from CVS HEAD. + * Don't build the nof libraries on powerpc. + * Number crunching time on m68k, reenable gfortran on m68k-linux-gnu. + + -- Matthias Klose Sat, 1 Oct 2005 15:42:10 +0200 + +gcc-4.0 (4.0.2-1) unstable; urgency=low + + * GCC 4.0.2 release. + * lib64stdc++6: Set priority to optional. + * Fix bug in StreamSerializer, seen with eclipse-3.1 (Ubuntu 12744). + Backport from CVS HEAD, Michael Koch. + * Apply java patches, proposed for the 4.0 branch: PR java/24018, + PR libgcj/23182, PR java/19870, PR java/21844, PR libgcj/23367, + PR java/20338. + * Update the expect/pty test to actually call expect directly, rather + than test for the existence of PTYs, since a working expect is what + we really care about, not random device files (Adam Conrad). + Closes: #329715. + * Add build dependencies on lib64z1-dev. + * gcc-c-decl.dpatch: Fix C global decl handling regression in 4.0.2 from + 4.0.1 + + -- Matthias Klose Thu, 29 Sep 2005 19:50:08 +0200 + +gcc-4.0 (4.0.1-9) unstable; urgency=low + + * Update to CVS 20050922, taken from the gcc-4_0-branch (4.0.2 RC3). + * Apply patches: + - Fix PR java/21418: Order of source files matters when compiling, + backported from mainline. + - Fix for PR 23043, backported form mainline. + - Proposed patch for #323016 (m68k only). Patch by Roman Zippel. + * libstdc++6: Tighten libstdc++ shlibs version to 4.0.1-9 (new symbol). + * Fail the build early, if the system doesn't have any pty devices + created in /dev. Needed for running the testsuite. + * Update hurd changes again (closes: #328973). + + -- Matthias Klose Thu, 22 Sep 2005 07:28:18 +0200 + +gcc-4.0 (4.0.1-8) unstable; urgency=medium + + * Update to CVS 20050917, taken from the gcc-4_0-branch. + - Fix FTBFS for boost, introduced in 4.0.1-7 (closes: #328684). + * Fix PR java/23891, eclipse bootstrap. + * Set priority of gcc-4.0-hppa64 package to standard. + * Bump standards version to 3.6.2. + * Fix java wrapper script, mishandles command line options with arguments. + Patch from Olly Betts. Closes: #296456. + * Bump epoch of the lib32gcc1 package to the same epoch as for the the + libgcc1 and lib64gcc1 packages. + * Fix some lintian warnings. + * Build libffi on the Hurd (closes: #328705). + * For biarch builds, disable the testsuite for the non-default architecture + for runtime libraries, which are not built by default (libjava). + * Add gsfonts-x11 to Build-Depends-Indep to avoid warnings from doxygen. + * Install Ada .ali files read-only. + + -- Matthias Klose Sat, 17 Sep 2005 10:35:23 +0200 + +gcc-4.0 (4.0.1-7) unstable; urgency=low + + * Update to CVS 20050913, taken from the gcc-4_0-branch. + - Fix PR c++/19004, ICE in uses_template_parms (closes: #284777). + - Fix PR rtl-optimization/23454, ICE in invert_exp_1 on sparc. + Closes: #321215. + - Fix PR libstdc++/23417, make bits/stl_{list,tree}.h -Weffc++ clean. + Closes: ##322170. + * Install 'altivec.h' on ppc64 (closes: #323945). + * Install locale data with the versioned package name (closes: #321591). + * Fix fastjar build without building libjava. + * On hppa, don't build using gcc-3.3 when ada is disabled. + * On m68k, don't build the stage1 compiler using -O. + + * Ludovic Brenta + - Allow the choice whether or not to build with NLS. + - Fix a typo whereby libffi was always enabled on i386. + + -- Matthias Klose Tue, 13 Sep 2005 23:23:11 +0200 + +gcc-4.0 (4.0.1-6) unstable; urgency=low + + * Update to CVS 20050821, taken from the gcc-4_0-branch. + - debian/patches/pr21562.dpatch: Removed, applied upstream. + - debian/patches/libjava-awt-name.dpatch: Updated. + - debian/patches/classpath-20050618.dpatch: Updated. + * Use all available CPU's for the check target, unless USE_NJOBS == no. + * debian/patches/biarch-include.dpatch: Include + /usr/local/include/-linux-gnu before including /usr/local/include. + * Fix biarch system include directories for the non-default architecture. + * Prefer gnat-4.0 over gnat-3.4 over gnat-3.3 as a build-dependency. + + -- Matthias Klose Thu, 18 Aug 2005 18:36:23 +0200 + +gcc-4.0 (4.0.1-5) unstable; urgency=low + + * Update to CVS 20050816, taken from the gcc-4_0-branch. + - Fix PR middle-end/23369, wrong code generation for funcptr comparison + on hppa. Closes: #321785. + - Fix PR fortran/23368 ICE with NAG routines (closes: #322912). + * Build-depend on libcairo2-dev (they say, that's the final package name ...) + * libgcj: Search /usr/lib/gcj-4.0 for dlopened libraries, place a copy + of the .la files in the libgcj6 package into this directory. + Closes: #322576. + * Tighten the dependencies between the compiler packages to the same + version and release. Use some substitution variables for control file + generation. + * Remove build dependencies for gpc. + * Don't use '/emul/ia32-linux' on ppc64 (closes: #322890). + * Synchronize with Ubuntu. + + -- Matthias Klose Tue, 16 Aug 2005 22:45:47 +0200 + +gcc-4.0 (4.0.1-4ubuntu1) breezy; urgency=low + + * Jeff Bailey + + Enable i386 biarch using biarch glibc (not yet enabled for unstable). + - debian/rules.d/binary-libgcc.mk: Make i386 lib64gcc1 depend on + libc6-amd64 + - debian/control.m4: Suggest libc6-amd64 rather than amd64-libs. + - debian/rules.conf: Build-Dep on libc6-dev-amd64 [i386] + Build-Dep on binutils >= 2.16.1-2ubuntu3 + - debian/rules2: Enable biarch build in Ubuntu. + + * Matthias Klose + + - Add shlibs file and dependency information for the lib32gcc1 package. + - debian/patches/gcc-textdomain.dpatch: Update (closes: #321591). + - Set priority of gcc-4.0-base and libstdc++6 packages to `required'. + Closes: #321016. + - libffi-hppa.dpatch: Remove, applied upstream. + + -- Matthias Klose Mon, 8 Aug 2005 19:39:02 +0200 + +gcc-4.0 (4.0.1-4) unstable; urgency=low + + * Enable the biarch compiler for powerpc (closes: #268023). + * Update to CVS 20050806, taken from the gcc-4_0-branch. + * Build depend on libcairo0.6.0-dev (closes: #321540). + * Fix Ada build on the hurd (closes: #321350). + * Update libffi for mips (Thiemo Seufer). Closes: #321100. + * Fix segfault on 64bit archs in the AWT Gtk peer library (Dan Frazier). + Closes: #320915. + * Add libXXgcc1 build dependencies for biarch builds. + + -- Matthias Klose Sun, 7 Aug 2005 07:01:59 +0000 + +gcc-4.0 (4.0.1-3) unstable; urgency=medium + + * Update to CVS 20050725, taken from the gcc-4_0-branch. + - Fix ICE with -O and -mno-ieee-fp/-ffast-math (closes: #319087). + * Synchronize with Ubuntu. + * Fix applying hurd specific patches for the hurd build (closes: #318443). + * Do not build-depend on libmpfr-dev on architectures, where fortran + is not built. + * Apply biarch include patch on ppc64 as well (closes: #318603). + * Correct libstdc++-dev package description (closes: #319082). + * debian/rules.defs: Replace DEB_TARGET_GNU_CPU with DEB_TARGET_ARCH_CPU. + * gcc-4.0-hppa64: Rename hppa64-linux-gcc to hppa64-linux-gnu-gcc. + Closes: #319818. + + -- Matthias Klose Mon, 25 Jul 2005 10:43:06 +0200 + +gcc-4.0 (4.0.1-2ubuntu3) breezy; urgency=low + + * Update to CVS 20050720, taken from the gcc-4_0-branch. + - Fix PR22278, volatile issues, seen when building xorg. + * Build against new libcairo1-dev (0.5.2). + + -- Matthias Klose Wed, 20 Jul 2005 12:29:50 +0200 + +gcc-4.0 (4.0.1-2ubuntu2) breezy; urgency=low + + * Acknowledge that i386 biarch builds still need to be fixed for glibc-2.3.5. + + -- Matthias Klose Tue, 19 Jul 2005 08:29:30 +0000 + +gcc-4.0 (4.0.1-2ubuntu1) breezy; urgency=low + + * Synchronize with Debian. + * Update to CVS 20050718, taken from the gcc-4_0-branch. + - Fix PR c++/22132 (closes: #318488), upcasting a const class pointer + to struct the class derives from generates wrong code. + * Build biarch runtime libraries for Fortran and ObjC. + * Apply proposed patch for PR22309 (crash with mt_allocator if libstdc++ + is dlclosed). Closes: #293466. + + -- Matthias Klose Mon, 18 Jul 2005 17:10:18 +0200 + +gcc-4.0 (4.0.1-2) unstable; urgency=low + + * Don't apply the patch to make -mieee the default on alpha-linux-gnu. + Causes the bootstrap to fail on alpha-linux-gnu. + + -- Matthias Klose Tue, 12 Jul 2005 00:14:12 +0200 + +gcc-4.0 (4.0.1-1) unstable; urgency=high + + * GCC 4.0.1 final release. See /usr/share/doc/gcc-4.0/NEWS.{gcc,html}. + * Build fastjar on mips/mipsel, fix fastjar build without building java. + * Disable the comparision check on unstable/ia64. adaint.o differs, + currently cannot be reproduced with glibc-2.3.5 and binutils-2.16.1. + * libffi/hppa: Fix handling of 3 and 5-7 byte struct returns. + * amd64: Fix libgcc symlinks to point to /usr/lib32, instead of /lib32. + * On powerpc, don't build with -j >1, apparently doesn't succeeds + on the Debian buildd. + * Apply revised patch to make -mieee the default on alpha-linux, + and add -mieee-disable switch to turn the default off (Tyson Whitehead). + * Disable multiarch-includes; redo biarch-includes to include the paths + for the non-default biarch, when called with -m32/-m64. + * Move new java headers from libstdc++-dev to libgcj-dev, add replaces + line. + * Update classpath patch to work with cairo-0.5.1. Patch provided by + Michael Koch. + * Further classpath updates for gnu.xml and javax.swing.text.html. + Patch provided by Michael Koch. + * Require binutils (>= 2.16.1) as a build dependency and a dependency. + * On i386, require amd64-libs-dev (>= 1.2). + * Update debian/NEWS.{html,gcc}. + + * Closing bug reports reported against older gcc versions (some of them + still present in Debian, but not anymore as the default compiler). + Usually, forwarded bug reports are linked to + http://gcc.gnu.org/PR + The upstream bug number usually can be found in the Debian reports. + + * Closed reports reported against gcc-3.3 and fixed in gcc-3.4: + - General: + + PR rtl-optimization/2960: Duplicate loop conditions even with -Os + Closes: #94701. + + PR optimization/3995: i386 optimisation: joining tests. + Closes: #105309. + + PR rtl-optimization/11635: Unnecessary store onto stack, more + curefully expand union cast (closes: #202016). + + PR target/7618: vararg disallowed in virtual function. Closes: #205404. + + Large array problem on 64 bit platforms (closes: #209152). + + Mark more strings as translatable (closes: #227129). + + PR gcc/14711: ICE when compiling a huge source file Closes: #234711. + + Better code generation for if(!p) return NULL;return p; + Closes: #242318. + + PR rtl-optimization/16152: Perl ftbfs on {ia64,arm,m68k}-linux. + Closes: #255801. + + ICE (segfault) while compiling Linux 2.6.9 (closes: #277206). + + Link error building memtest (closes: #281445). + - Ada: + + PR ada/12450: Constraint error for valid input (closes: #210844). + + PR ada/13620: miscompilation of array initializer with + -O3 -fprofile-arcs. Closes: #226244. + - C: + + PR c/6897: Code produced with -fPIC reserves EBX, but compiles + bad __asm__ anyway (closes: #73065). + + PR c/9209: On i386, gcc-3.0 allows $ in indentifiers but not the asm. + Closes: #121282. + + PR c/11943: Accepts invalid declaration "int x[2, 3];" in C99 mode. + Closes: #177303. + + PR c/11942: restrict keyword broken in C99 mode. Closes: #187091. + + PR other/11370: -Wunreachable-code gives false complaints. + Closes: #196600. + + PR c/11369: Too relaxed checking with -Wstrict-prototypes. + Closes: #197504. + + PR c/11445: False positive warning with -Wunreachable-code. + Closes: #200140. + + PR c/11459: -stdc=c90 -pedantic warns about C90's non long-long + support when in C99 mode. Closes: #200392. + + PR c/456: Handling of constant expressions. Closes: #225935. + + ICE on invalid #define with -traditional (closes: #242916). + + No warning when initializing a variable with itself, new option + -Winit-self (closes: #293957). + - C++: + + C++ parse error (closes: #42946). + + PR libstdc++/9073: Replacement for __STL_ASSERTIONS (libstdc++v3 + debug mode). Closes: #128993. + + Parse errors in nested constructor calls (closes: #138561). + + PR optimization/1823: -ftrapv aborts with pointer difference due to + division optimization. Closes: #169862. + + ICE on invalid code (closes: #176101). + + PR c++/10199: ICE handling method parametrized by template. + Closes: #185604. + + High memory usage building packages OpenOffice.org and MythTV. + Closes: #194345, #194513. + + Improved documentation of std::lower_bound (closes: #196380). + + ICE in regenerate_decl_from_template (closes: #197674). + + PR c++/11444: Function fails to propagate up class tree + (template-related). Closes: #198042. + + ICE when using namespaced typedef of primitive type as struct. + Closes: #198261. + + Bug using streambuf / iostream to read from a named pipe. + Closes: #216105. + + PR c++/11437: ICE in lookup_name_real (closes: #200011). + + Add large file support (LFS) in libstdc++ (closes: #220000). + + PR c++/13621: ICE compiling a statement expression returning type + string (closes: #224413). + + g++ doesn't find inherited inner class after template instantiation. + Closes: #227518. + + PR libstdc++/13928: Add whatis info in man pages generated by doxygen. + Closes: #229642. + + Missing symbol _M_setstate in libstdc++ (closes: #232709). + + Unable to parse declaration of inline constructor explicit + specialization (closes: #234709). + + ICE (segfault) on invalid C++ code (closes: #246031). + + ICE in lookup_tempate_function (closes: #262441). + + Undefined symbols in libstdc++, when using specials char_traits. + Closes: #266110. + + PR libstdc++/16011: Outputting numbers with ostream in the locale fr_BE + causes infinite recursion (closes: #270795). + + ICE in tree_low_cst (closes: #276291). + + ICE in in expand_call (closes: #283503). + + typeof operator is misparsed in a template function (closes: #288555). + + ICE in tree_low_cs (closes: #291374). + + Improve uninformative error messages (closes: #292961, #293076). + + ICE on array initialization (closes: #294560). + + Failure to build xine-lib with -finline-functions (closes: #306854). + - Java: + + Fix error finding files in subdirectories (closes: #195480). + + Implement java.text.CollationElementIterator lacks getOffset(). + Closes: #259789. + - Treelang: + + Pointer truncation on 64bit architectures (closes: #308367). + - Architecture specific: + - alpha + + PR debug/10695: ICE on alpha while building agistudio. + Closes: #192568. + + ICE when building fceu (closes: #228018, #252764). + - amd64 + + Miscompilation of Objective-C code (closes: #250174). + + g++ hangs compiling k3d on amd64 (closes: #285364). + - arm + + PR target/19008: gcc -O3 -fPIC produces wrong code via auto inlining. + Closes: #285238. + - i386 + + PR target/4106: i386 -fPIC asm ebx clobber no error. + Closes: #153472. + + PR target/10984: x86/sse2 ICEs on vector intrinsics. Closes: #166940. + + Wrong code generation on at least ix86 (closes: #275655). + - m68k + + PR target/9201: ICE compiling octave-2.1 (closes: #175478). + + ICE in verify_initial_elim_offsets (closes: #204407, #257012). + + g77 generates invalid assembly code (closes: #225621). + + ICE in verify_local_live_at_start (closes #245584). + - powerpc + + PR optimization/12828: -floop-optimize is unstable on PowerPC (float + to int conversion problem). Closes: #218219. + + PR target/13619: ICE building altivec code in ffmpeg. + Closes: #226148. + + PR target/20046: Miscompilation of bind 9.3.0. Closes: #292958. + - sparc + + ICE (segfault) while building atlas3 on sparc32 (closes: #249108). + + Wrong optimization on sparc32 when building linux kernel. + Closes: #254626. + + * Closed reports reported against gcc-3.3 or gcc-3.4 and fixed in gcc-4.0: + - General: + + PR rtl-optimization/6901: Optimizer improvement (removing unused + local variables). Closes: #67206. + + PR middle-end/179: Failure to detect use of unitialized variable + with -O -Wall. Closes: #117765. + + ICE building glibc's nptl on amd64 (closes: #260710, #307993). + + PR middle-end/17827: ICE in make_decl_rtl. Closes: #270854. + + PR middle-end/21709: ICE on compile-time complex NaN. Closes: #305344. + - Ada: + + PR ada/10889: Convention Fortran matrices mishandled in generics. + Closes: #192135. + + PR ada/13897: Implement tasking on powerpc. Closes: #225346. + - C: + + PR c/13072: Bogus warning with VLA in switch. Closes: #218803. + + PR c/13519: typeof(nonconst+const) is const. Closes: #208981. + + PR c/12867: Incorrect warning message (void format, should be void* + format). Closes: #217360. + + PR c/16066: PR 16066] i386 loop strength reduction bug. + Closes: #254659. + - C++: + + PR c++/13518: -Wnon-virtual-dtor doesn't always work. Closes: #212260. + + PR translation/16025: ICE with unsupported locale(closes: #242158). + + PR c++/15125: -Wformat doesn't warn for different types in fprintf. + Closes: #243507. + + PR c++/15214: Warn only if the dtor is non-private or the class has + friends. (closes: #246639). + + PR libstdc++/17218: Unknown subjects in generated libstdc++ manpages. + Closes: #262934. + + PR libstdc++/17223: Missing .so references in generated libstdc++ + manpages. Closes: #262956. + + libstdc++-doc: Improve man pages (closes: #280910). + + PR c++/19006: ICE in tree_low_cst. Closes: #285692. + + g++ does not check arguments to fprintf. Closes: #281847. + - Java: + + PR java/7304: gcj ICE (closes: #152501). + + PR libgcj/7305: Installation of headers not directly in /usr/include. + Closes: #195483. + + PR libgcj/11941: libgcj timezone handling (closes: #203212). + + PR java/14709: gcj fails to wait for its child processes on exec(). + Closes: #238432. + + PR libgcj/21703: gcj hangs when rapidly calling String.intern(). + Closes: #275547. + + SocketChannel.get(ByteBuffer) returns 0 at EOF. Closes: #281602. + + PR java/19711: gcj segfaults instead of reporting the ambiguous + expression. Closes: #286715. + + Static libgcj contains repeated archive members (closes: #298263). + - Architecture specific: + - alpha + + Unaligned accesses with ?-operator (closes: #301983). + - arm + + Compilation error of glibc-2.3.4 on arm (closes: #298508). + - m68k + + ICE in add_insn_before (closes: #248432). + - mips + + Fix o32 ABI breakage in gcc 3.3/3.4 (closes: #270620). + - powerpc + + ICE in extract_insn (closes: #311128). + + * Closing bug reports as wontfix: + - g++ defines _GNU_SOURCE when using the libstdc++ header files. + Behaviour did change since 3.0. Closes: #126703, #164872. + + -- Matthias Klose Sat, 9 Jul 2005 17:10:54 +0000 + +gcc-4.0 (4.0.0ds2-12) unstable; urgency=high + + * Update to CVS 20050701, taken from the gcc-4_0-branch. + * Apply proposed patch for MMAP configure fix; aka PR 19877. Backport + from mainline. + * Disable Fortran on m68k. Currently FTBFS. + * Split multiarch-include/lib patches. Update multiarch-include patch. + * Fix FTBFS of the hppa64-linux cross compiler. Don't add the + multiarch include dirs when cross compiling. + * Configure --with-java-home, as used by java-gcj-compat. + Closes: #315646. + * Make libgcj-dbg packages priority extra. + * Set the path of classmap.db to /var/lib/gcj-@gcc_version@. + * On m68k, do not create the default classmap.db in the gcj postinst. + See #312830. + * On amd64, install the 32bit libraries into /emul/ia32-linux/usr/lib. + Restore the /usr/lib32 symlink. + * On amd64, don't reference lib64, but instead lib (lib64 is a symlink + to lib). Closes: #293050. + * Remove references to build directories from the .la files. + * Make cpp-X.Y conflict with earlier versions of gcc-X.Y, g++-X.Y, gobjc-X.Y, + gcj-X.Y, gfortran-X.Y, gnat-X.Y, treelang-X.Y, if a path component in + the gcc library path changes (i.e. version or target alias). + * Disable Ada for sh3 sh3eb sh4 sh4eb. + * For gcj-4.0, add a conflict to libgcj4-dev and libgcj5-dev. + Closes: #316499. + + -- Matthias Klose Sat, 2 Jul 2005 11:04:35 +0200 + +gcc-4.0 (4.0.0ds1-11) unstable; urgency=low + + * debian/rules.defs: Disable Ada for alpha. + * debian/rules.conf: Fix typo in type-handling replacement code. + * Don't ship an empty libgcj6-dbg package. + + -- Matthias Klose Thu, 23 Jun 2005 09:03:21 +0200 + +gcc-4.0 (4.0.0ds1-10) unstable; urgency=medium + + * debian/patches/libstdc++-api-compat.dpatch: Apply proposed patch + to fix libstdc++ 3.4.5/4.0 compatibility. + * type-handling output became insane. Don't use it anymore. + * Drop the reference to the stl-manual package (closes: #314983). + * Disable java on GNU/kFreeBSD targets, requested by Robert Millan. + Closes: #315140. + * Terminate the acats-killer process, even if the build is aborted + by the user (closes: #314405). + * debian/rules.defs: Define DEB_TARGET_ARCH_{OS,CPU}. + * Start converting the use of DEB_*_GNU_* to DEB_*_ARCH_* in the build + files. + * Do not configure with --enable-gtk-cairo. Needs newer gtk. Drop + build dependency on libcairo-dev. + * Fix setting of the system header directory for the hurd (Michael Banck). + Closes: #315386. + * Fix FTBFS on hurd-i386: MAXPATHLEN issue (Michael Banck). Closes: #315384. + + -- Matthias Klose Wed, 22 Jun 2005 19:45:50 +0200 + +gcc-4.0 (4.0.0ds1-9ubuntu2) breezy; urgency=low + + * Fix version number in libgcj shlibs file. + + -- Matthias Klose Sun, 19 Jun 2005 10:34:02 +0200 + +gcc-4.0 (4.0.0ds1-9ubuntu1) breezy; urgency=low + + * Update to 4.0.1, release candidate 2. + * libstdc++ shlibs file: Require 4.0.0ds1-9ubuntu1 as minimum version. + * Rename libawt to libgcjawt to avoid conflicts with other + libawt implementations (backport from HEAD). + * Update classpath awt, swing and xml parser for HTML support in swing. + Taken from classpath CVS HEAD 2005-06-18. Patch provided by Michael Koch. + * Remove the libgcj-buffer-strategy path, part of the classpath update. + * libgcj shlibs file: Require 4.0.0ds1-9ubuntu1 as minimum version. + * Require cairo-0.5 as build dependency. + * gij-4.0: Provide java1-runtime. + * gij-4.0: Provide an rmiregistry alternative (using grmiregistry-4.0). + * gcj-4.0: Provide an rmic alternative (using grmic-4.0). + * libgcj6-dev conflicts with libgcj5-dev, libgcj4-dev, not libgcj6. + Closes: #312741. + * libmudflap-entry-point.dpatch: Correct name of entry point on mips/mipsel. + * Apply proposed patch for PR 18421 and PR 18719 (m68k only). + * Apply proposed path for PR 21562. + * Add build dependency on dpkg (>= 1.13.7). + * On linux systems, configure for -linux-gnu. + * Configure the hppa64 cross compiler to target hppa64-linux-gnu. + * (Build-)depend on binutils-2.16.1. + * libstdc{32,64}++6-4.0-dbg: Depend on libstdc++6-4.0-dev. + * gnat-4.0: only depend on libgnat, when a shared libgnat is built. + * gfortran-4.0: Depend on libgmp3c2 | libgmp3. + * On hppa, explicitely use gcc-3.3 as a build dependency in the case + that Ada is disabled. + * libmudflap: Always build the library for the non-default biarch + architecture, or else the test results show link failures. + + -- Matthias Klose Sat, 18 Jun 2005 00:42:55 +0000 + +gcc-4.0 (4.0.0-9) unstable; urgency=low + + * Upload to unstable. + + -- Matthias Klose Wed, 25 May 2005 19:02:20 +0200 + +gcc-4.0 (4.0.0-8ubuntu3) breezy; urgency=low + + * debian/control: Regenerate. + + -- Matthias Klose Sat, 4 Jun 2005 10:56:27 +0200 + +gcc-4.0 (4.0.0-8ubuntu2) breezy; urgency=low + + * Fix powerpc-config-ml patch. + + -- Matthias Klose Fri, 3 Jun 2005 15:47:52 +0200 + +gcc-4.0 (4.0.0-8ubuntu1) breezy; urgency=low + + * powerpc biarch support: + - Enable powerpc biarch support, build lib64gcc1 on powerpc. + - Add patch to disable libstdc++'s configure checking, if it can't run + 64bit binaries on 32bit kernels (Sven Luther). + - Apply the same patch to the other runtime librararies as well. + - Run the testsuite with -m64, if we can execute 64bit binaries. + - Add libc6-dev-ppc64 as build dependency for powerpc. + * 32bit gcj libs for amd64. + * debian/logwatch.sh: Don't remove logwatch pid file on exit (suggested + by Ryan Murray). + * Update to CVS 20050603, taken from the gcc-4_0-branch. + * g++-4.0 provides c++abi2-dev. + * Loosen dependencies on packages of architecture `all' to not break + binary only uploads. + * Build libgfortran for biarch as well, else the testsuite will fail. + + -- Matthias Klose Fri, 3 Jun 2005 13:38:19 +0200 + +gcc-4.0 (4.0.0-8) experimental; urgency=low + + * Synchronize with Ubuntu. + + -- Matthias Klose Mon, 23 May 2005 01:56:28 +0000 + +gcc-4.0 (4.0.0-7ubuntu7) breezy; urgency=low + + * Fix build failures for builds with disabled testsuite. + * Adjust debian/rules conditionals to work with all dpkg versions. + * Build separate lib32stdc6-4.0-dbg/lib64stdc6-4.0-dbg packages. + * Add the debugging symbols of the optimzed libstdc++ build in the + lib*stdc++6-dbg packages as well. + * Build a libgcj6-dbg package. + * Update to CVS 20050522, taken from the gcc-4_0-branch. + * Add Ada support for the ppc64 architecture (Andreas Jochens): + * debian/patches/ppc64-ada.dpatch + - Add gcc/ada/system-linux-ppc64.ads, which has been copied from + gcc/ada/system-linux-ppc.ads and changed to use 'Word_Size' 64 + instead of 32. + - gcc/ada/Makefile.in: Use gcc/ada/system-linux-ppc64.ads on powerpc64. + * debian/rules.patch + - Use ppc64-ada patch on ppc64. + * debian/rules.d/binary-ada.mk + Place the symlinks libgnat.so, libgnat-4.0.so, libgnarl.so, + libgnarl-4.0.so in '/usr/lib' instead of '/adalib'. + Closes: #308948. + * Add libc6-dev-i386 as an alternative build dependency for amd64. + Closes: #305690. + + -- Matthias Klose Sun, 22 May 2005 22:14:20 +0200 + +gcc-4.0 (4.0.0-7ubuntu6) breezy; urgency=low + + * Don't trust dpkg-architecture (1.13.4), it "hurds" ... + + -- Matthias Klose Wed, 18 May 2005 11:36:38 +0200 + +gcc-4.0 (4.0.0-7ubuntu5) breezy; urgency=low + + * libgcj6-dev: Don't provide libgcj-dev. + + -- Matthias Klose Wed, 18 May 2005 00:30:32 +0000 + +gcc-4.0 (4.0.0-7ubuntu4) breezy; urgency=low + + * Update to CVS 20050517, taken from the gcc-4_0-branch. + * Apply proposed patch for PR21293. + + -- Matthias Klose Tue, 17 May 2005 23:05:40 +0000 + +gcc-4.0 (4.0.0-7ubuntu2) breezy; urgency=low + + * Update to CVS 20050515, taken from the gcc-4_0-branch. + + -- Matthias Klose Sun, 15 May 2005 23:48:00 +0200 + +gcc-4.0 (4.0.0-7ubuntu1) breezy; urgency=low + + * Synchronize with Debian. + + -- Matthias Klose Mon, 9 May 2005 19:35:29 +0200 + +gcc-4.0 (4.0.0-7) experimental; urgency=low + + * Update to CVS 20050509, taken from the gcc-4_0-branch. + * Remove the note from the fastjar package description, stating, that + fastjar is incomplete compared to the "standard" jar utility. + * Fix typo in build depends. dpkg-checkbuilddeps doesn't like a comma + inside []. + * Tighten shlibs dependencies to require the current version. + + -- Matthias Klose Mon, 9 May 2005 19:02:03 +0200 + +gcc-4.0 (4.0.0-6) experimental; urgency=low + + * Update to CVS 20050508, taken from the gcc-4_0-branch. + + -- Matthias Klose Sun, 8 May 2005 14:08:28 +0200 + +gcc-4.0 (4.0.0-5ubuntu1) breezy; urgency=low + + * Temporarily disable the i386 biarch build. Remove the amd64-libs-dev + build dependency, add (build-)conflict (<= 1.1ubuntu1). + + -- Matthias Klose Sat, 7 May 2005 16:56:21 +0200 + +gcc-4.0 (4.0.0-5) breezy; urgency=low + + * gnat-3.3 and gnat-4.0 are alternative build dependencies (closes: #308002). + * Update to CVS 20050507, taken from the gcc-4_0-branch. + * gcj-4.0: Install gjnih. + * Add libgcj buffer strategy framework (Thomas Fitzsimmons), needed for OOo2. + Backport from 4.1. + * Fix all lintian errors and most of the warnings. + + -- Matthias Klose Sat, 7 May 2005 12:26:15 +0200 + +gcc-4.0 (4.0.0-4) breezy; urgency=low + + * Still prefer gnat-3.3 over gnat-4.0 as a build dependency. + + -- Matthias Klose Fri, 6 May 2005 22:30:43 +0200 + +gcc-4.0 (4.0.0-3) breezy; urgency=low + + * Update to CVS 20050506, taken from the gcc-4_0-branch. + * Update priority of java alternatives to 40. + * Move gcj-dbtool to gij package, move the default classmap.db to + /var/lib/gcj-4.0/classmap.db. Create it in the postinst. + * Fix gcc-4.0-hppa64 postinst (closes: #307762). + * Fix gcc-4.0-hppa64, gij-4.0 and gcj-4.0 postinst, to not ignore errors + from update-alternatives. + * Fix gcc-4.0-hppa64, fastjar, gij-4.0 and gcj-4.0 prerm, + to not ignore errors from update-alternatives. + + -- Matthias Klose Fri, 6 May 2005 17:50:58 +0200 + +gcc-4.0 (4.0.0-2) experimental; urgency=low + + * GCC 4.0.0 release. + * Update to CVS 20050503, taken from the gcc-4_0-branch. + * Add gnat-4.0 as an alternative build dependency (closes: #305690). + + -- Matthias Klose Tue, 3 May 2005 15:41:26 +0200 + +gcc-4.0 (4.0.0-1) experimental; urgency=low + + * GCC 4.0.0 release. + + -- Matthias Klose Sun, 24 Apr 2005 11:28:42 +0200 + +gcc-4.0 (4.0ds11-0pre11) breezy; urgency=low + + * CVS 20050413, taken from the gcc-4_0-branch. + * Add proposed patches for PR20126, PR20490, PR20929. + + -- Matthias Klose Wed, 13 Apr 2005 09:43:00 +0200 + +gcc-4.0 (4.0ds10-0pre10) experimental; urgency=low + + * gcc-4.0.0-20050410 release candidate 1, built from the prerelease tarball. + - C++ fix for "optimizer breaks function inlining". Closes: #302989. + * Append the GCC version to the fastjar/grepjar version string. + * Use short file names in the libstdc++ docs (closes: #301140). + * Fix libstdc++-dbg dependencies (closes: #303866). + + -- Matthias Klose Mon, 11 Apr 2005 13:16:01 +0200 + +gcc-4.0 (4.0ds9-0pre9) experimental; urgency=low + + * CVS 20050326, taken from the gcc-4_0-branch. + * Reenable Ada on ia64. + * Build libgnat on hppa, sparc, s390 again. + * ppc64 support (Andreas Jochens): + * debian/control.m4 + - Add libc6-dev-powerpc [ppc64] to the Build-Depends. + - Change the Description for lib32gcc1: s/ia32/32 bit Version/ + * debian/rules.defs + - Define 'biarch_ia32' for ppc64 to use the same 32 bit multilib + facilities as amd64. + * debian/rules.d/binary-gcc.mk + - Correct an error in the 'files_gcc' definition for biarch_ia32 + (replace '64' by '32'). + * debian/rules2 + - Do not use '--disable-multilib' on powerpc64-linux. + Use '--disable-nof --disable-softfloat' instead. + * debian/rules.d/binary-libstdcxx.mk + - Put the 32 bit libstdc++ files in '/usr/lib32'. + * debian/rules.patch + - Apply 'ppc64-biarch' patch on ppc64. + * debian/patches/ppc64-biarch.dpatch + - MULTILIB_OSDIRNAMES: Use /lib for native 64 bit libraries and + /lib32 for 32 bit libraries. + - Add multilib handling to src/config-ml.in (taken from + amd64-biarch.dpatch). + * Rename biarch_ia32 to biarch32, as suggsted by Andreas. + * Use /bin/dash on hppa. + * Reenable the build of the hppa64 compiler. + * Enable parallel builds by defaults (set environment variale USE_NJOBS=no + or USE_NJOBS= to modify the default, which is to use the + number of available processors). + + -- Matthias Klose Sat, 26 Mar 2005 19:07:30 +0100 + +gcc-4.0 (4.0ds8-0pre8) experimental; urgency=low + + * CVS 20050322, taken from the gcc-4_0-branch. + - Add proposed fix for PR19406. + * Configure --with-gtk-cairo only if version 0.3.0 is found. + * Split out gcc-4.0-locales package. Better chance of getting + bug reports in english language. + + -- Matthias Klose Tue, 22 Mar 2005 14:20:24 +0100 + +gcc-4.0 (4.0ds7-0pre7) experimental; urgency=low + + * CVS 20050304, taken from the gcc-4_0-branch. + * Build the treelang compiler. + + -- Matthias Klose Fri, 4 Mar 2005 21:29:56 +0100 + +gcc-4.0 (4.0ds6-0pre6ubuntu6) hoary; urgency=low + + * Fix lib32gcc1 symlink on amd64. Ubuntu #7099. + + -- Matthias Klose Thu, 3 Mar 2005 00:17:26 +0100 + +gcc-4.0 (4.0ds6-0pre6ubuntu5) hoary; urgency=low + + * Add patch from PR20160, avoid creating archives with components + that have duplicate basenames. + + -- Matthias Klose Wed, 2 Mar 2005 14:22:04 +0100 + +gcc-4.0 (4.0ds6-0pre6ubuntu4) hoary; urgency=low + + * CVS 20050301, taken from the gcc-4_0-branch. + Test builds on i386, amd64, powerpc, ia64, check libgcc_s.so.1. + * Add fastjar-4.0 binary and manpage. Some java packages append it + for all java related tools. + * Add libgcj6-src package for source code availability in IDE's. + * On hppa, disable the build of the hppa64 cross compiler, disable + java, disable running the testsuite (request by Lamont). + * On amd64, lib32gcc1 replaces ia32-libs.openoffice.org (<< 1ubuntu3). + * Build-Depend on libcairo1-dev, configure with --enable-gtk-cairo. + Work around libtool problems install libjawt. + Install jawt header files in libgcj6-dev. + * Add workaround for PR debug/19769. + + -- Matthias Klose Tue, 1 Mar 2005 11:26:19 +0100 + +gcc-4.0 (4.0ds5-0pre6ubuntu3) hoary; urgency=low + + * Drop libgmp3-dev (<< 4.1.4-3) as an alterntative build dependency. + + -- Matthias Klose Thu, 10 Feb 2005 15:16:27 +0100 + +gcc-4.0 (4.0ds5-0pre6ubuntu2) hoary; urgency=low + + * Disable Ada for powerpc. + + -- Matthias Klose Wed, 9 Feb 2005 16:47:07 +0100 + +gcc-4.0 (4.0ds5-0pre6ubuntu1) hoary; urgency=low + + * Avoid build dependency on type-handling. + * Install 32bit libs on amd64 in /lib32 and /usr/lib32. + + -- Matthias Klose Wed, 9 Feb 2005 08:27:21 +0100 + +gcc-4.0 (4.0ds5-0pre6) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20050208. + * Build-depend on graphviz (moved to main), remove the pregenerated + libstdc++ docs from the diff. + * Fix PR19162, libobjc build failure on arm-linux (closes: #291497). + + -- Matthias Klose Tue, 8 Feb 2005 11:47:31 +0000 + +gcc-4.0 (4.0ds4-0pre5) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20050125. + * Call the 4.0 gcx versions in the java wrappers (closes: #291075). + * Correctly install libgij (closes: #291077). + * libgcj6-dev: Add conflicts to other libgcj-dev packages (closes: #290950). + + -- Matthias Klose Mon, 24 Jan 2005 23:59:54 +0100 + +gcc-4.0 (4.0ds3-0pre4) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20050115. + * Update cross build patches (Nikita V. Youshchenko). + * Enable Ada on i386, amd64, mips, mipsel, powerpc, sparc, s390. + Doesn't yet bootstrap on alpha, hppa, ia64. + + -- Matthias Klose Sat, 15 Jan 2005 18:44:03 +0100 + +gcc-4.0 (4.0ds2-0pre3) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20041224. + + -- Matthias Klose Wed, 22 Dec 2004 00:31:44 +0100 + +gcc-4.0 (4.0ds1-0pre2) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20041205. + * Lot's of merges and updates from the gcc-3.4 packages. + + -- Matthias Klose Sat, 04 Dec 2004 12:14:51 +0100 + +gcc-4.0 (4.0ds0-0pre1) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20041114. + - Addresses many issues with the libstdc++ man pages (closes: #278549). + * Disable Ada on hppa, ia64, mips, mipsel, powerpc, s390 and sparc, at least + these are known to be broken at the time of the snapshot. + * Minor kbsd.gnu build fixes (Robert Millan). Closes: #273004. + * For amd64, add missing libstdc++ files to 'libstdc++6-dev' package. + (Andreas Jochens). Fixes: #274362. + * Update libffi-mips patch (closes: #274096). + * Updated i386-biarch patch. Don't build 64bit libstdc++, ICE. + * Update sparc biarch patch. + * Fix symlinks for gfortran manpage (closes: #278548). + * Update cross build patches (Nikita V. Youshchenko). + * Update Ada patches (Ludovic Brenta). + + -- Matthias Klose Sat, 13 Nov 2004 10:38:25 +0100 + +gcc-4.0 (4.0-0pre0) experimental; urgency=low + + * gcc-4.0 snapshot, taken from the HEAD branch CVS 20040912. + + * Matthias Klose + + - Integrate accumulated packaging patches from gcc-3.4. + - Rename libstdc++6-* packages to libstdc++6-4-* (closes: #261693). + - libffi4-dev: conflict with libffi3-dev (closes: #265939). + + * Robert Millan + + * control.m4: + - s/locale_no_archs !hurd-i386/locale_no_archs/g + (This is now handled in rules.defs. [1]) + - s/procps [check_no_archs]/procps [linux_gnu_archs]/g [2] + - Add type-handling to build-deps. [3] + * rules.conf: + - Don't require (>= $(libc_ver)) for libc0.1-dev. [4] + - Generate *_no_archs variables with type-handling and use them for + for m4's -D parameters. [3] + * rules.defs: + - use filter instead of findstring [1]. + - s/netbsd-elf-gnu/netbsdelf-gnu/g [5]. + - enable java for kfreebsd-gnu [6] + - enable ffi for kfreebsd-gnu and knetbsd-gnu [6] + - enable libgc for kfreebsd-gnu [6] + - enable checks for kfreebsd-gnu and knetbsd-gnu [7] + - enable locales for kfreebsd-gnu and gnu [1] [8]. + * Closes: #264025. + + -- Matthias Klose Sun, 12 Sep 2004 12:52:56 +0200 + +gcc-3.5 (3.5ds1-0pre1) experimental; urgency=low + + * gcc-3.5 snapshot, taken from the HEAD branch CVS 20040724. + * Install locale data with versioned package name (closes: #260497). + * Fix libgnat symlinks. + + -- Matthias Klose Sat, 24 Jul 2004 21:26:23 +0200 + +gcc-3.5 (3.5-0pre0) experimental; urgency=low + + * gcc-3.5 snapshot, taken from the HEAD branch CVS 20040718. + + -- Matthias Klose Sun, 18 Jul 2004 12:26:00 +0200 + +gcc-3.4 (3.4.1-1) experimental; urgency=low + + * gcc-3.4.1 final release. + - configured wth --enable-libstdcxx-allocator=mt. + * Fixes for generating cross compiler packages (Jeff Bailey). + + -- Matthias Klose Fri, 2 Jul 2004 22:49:05 +0200 + +gcc-3.4 (3.4.0-4) experimental; urgency=low + + * gcc-3.4.1 release candidate 1. + * Add logic to build biarch compiler on powerpc (disabled, needs lib64c). + * Don't build the libg2c0 package on mipsel-linux (no clear answer on + debian-mips, if the libg2c0's built by gcc-3.3 and gcc-3.4 are compatible + (post-sarge issue). + * Don't use gcc-2.95 as bootstrap compiler on m68k anymore. + + -- Matthias Klose Sat, 26 Jun 2004 22:40:20 +0200 + +gcc-3.4 (3.4.0-3) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040613. + * On sparc, set the the build target to sparc64-linux, build with + switch defaulting to code generation for v7. To generate code for + sparc64, use the -m64 switch. + * Add missing doc-base files to -doc packages. + * Add portability patches and kbsd-gnu patch (Robert Millan). + Closes: #251293, #251294. + * Apply fixes for cross build (Nikita V. Youshchenko). + * Do not include the precompiled libstdc++ header files into the -dev + package (still experimental). Closes: #251707. + * Reflect renaming of Ada user's guide. + * Move AWT peer libraries for libgcj into it's own package (fixes: #247791). + + -- Matthias Klose Mon, 14 Jun 2004 00:03:18 +0200 + +gcc-3.4 (3.4.0-2) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040516. + * Do not provide the /usr/hppa64-linux/include in the gcc-hppa64 package, + migrated to libc6-dev. Adjust dependencies. + * Integrate gpc test results into the GCC test summary. + * gnatchop calls gcc-3.4 (closes: #245438). + * debian/locale-gen.sh: Update for recent libstdc+++ testsuite. + * debian/copyright: Add libstdc++-v3's exception clause. + * Add libffi update for mips (Thiemo Seufer). + * Reference Debian specific bug reporting instructions. + * Update README.Bugs. + * Fix FTBFS for libstdc++-doc. + * Update libjava patch for hppa (Randolph Chung). + * Fix installation of ffitarget.h header file. + * On amd64-linux, configure --without-multilib, disable Ada. + + -- Matthias Klose Sun, 16 May 2004 07:53:39 +0200 + +gcc-3.4 (3.4.0-1) experimental; urgency=low + + * gcc-3.4.0 final release. + + * Why experimental? + - Do not interfer with packages currently built from gcc-3.3 sources, + i.e. libgcc1, libobjc1, libffi2, libffi2-dev, libg2c0. + - Biarch sparc compiler doesn't built yet. + - Use of configure flags affecting binary ABI's not yet determined. + - Several ABI bugs have been fixed. Unfortunately, these changes will break + binary compatibility with earlier releases on several architectures: + alpha, mips, sparc, + - hppa and m68k changed sjlj based exception handling to dwarf2 based + exception handling. + + See NEWS.html or http://gcc.gnu.org/gcc-3.4/changes.html for more + specific information. + + -- Matthias Klose Tue, 20 Apr 2004 20:54:56 +0200 + +gcc-3.4 (3.4ds3-0pre4) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040403. + * Add gpc tarball, gpc patches for 3.4 (Waldek Hebisch). + * Reenable sparc-biarch patches (closes: #239856). + * Build the shared libgnat library, needed to fix FTBFS for some + Ada library packages (Ludovic Brenta). + Currently enabled for hppa, i386, ia64. + + -- Matthias Klose Sat, 3 Apr 2004 08:47:55 +0200 + +gcc-3.4 (3.4ds1-0pre2) experimental; urgency=low + + * Update to gcc-3.4 CVS 20040320. + * For libstdc++6-doc, add a conflict to libstdc++5-3.3-doc (closes: #236560). + * For libstdc++6-dbg, add a conflict to libstdc++5-3.3-dbg (closes: #236798). + * Reenable s390-biarch patches. + * Update the cross compiler build files (Nikita V. Youshchenko). + + -- Matthias Klose Sat, 20 Mar 2004 09:15:10 +0100 + +gcc-3.4 (3.4ds0-0pre1) experimental; urgency=low + + * Start gcc-3.4 packaging, get rid of the epoch for most of the + packages. + + -- Matthias Klose Sun, 22 Feb 2004 16:00:03 +0100 + +gcc-3.3 (1:3.3.3ds6-6) unstable; urgency=medium + + * Update to gcc-3_3-branch CVS 20040401. + - Fixed ICE in emit_move_insn_1 on legal code (closed: #223215). + - Fix PR 14755, miscompilation of loops with bitfield counter. + Closes: #241255. + - Fix PR 16040, crash in function initializing const data with + reinterpret_cast-ed pointer-to-member function crashes (closes: #238621). + - Remove patches integrated upstream. + * Reenable build of gpidump on powerpc and s390. + + -- Matthias Klose Thu, 1 Apr 2004 23:51:54 +0200 + +gcc-3.3 (1:3.3.3ds6-5) unstable; urgency=medium + + * Update to gcc-3_3-branch CVS 20040321. + - Fix PR target/13889 (ICE on valid code on m68k). + * Fix FTFBS on s390. Do not build gpc's gpidump on s390. + * Reenable gpc on arm. + + -- Matthias Klose Mon, 22 Mar 2004 07:37:26 +0100 + +gcc-3.3 (1:3.3.3ds6-4) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040320. + - Revert patch for PR14640 (with this, at least mozilla-firefox was + miscompiled on x86 (closes: #238621). + * Update the gpc tarball (there were two releases with the same name ...). + * Reenable gpc on alpha and ia64. + + -- Matthias Klose Sat, 20 Mar 2004 07:39:24 +0100 + +gcc-3.3 (1:3.3.3ds5-3) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040314. + - Fixes miscompilation with -O -funroll-loops on powerpc (closes: #229567). + - Fix ICE in dwarf-2 on code using altivec (closes: #203835). + * Update hurd-changes patch. + * Add libgcj4-dev as a recommendation for gcj (closes: #236547). + * debian/copyright: Added exemption to static linking of libgcc. + + * Phil Blundell: + - debian/patches/arm-ldm.dpatch, debian/patches/arm-gotoff.dpatch: Update. + + -- Matthias Klose Sun, 14 Mar 2004 09:56:06 +0100 + +gcc-3.3 (1:3.3.3ds5-2) unstable; urgency=low + + * Update to gcc-3_3-branch CVS 20040306. + - Fixes bootstrap comparision error on ia64. + - Allows ghc build with gcc-3.3. + - On amd64, don't imply 3DNow! for -m64 by default. + - Some arm specific changes + - Fix C++/13944: exception in constructor of a class to be thrown is not + caught. Closes: #228099. + * Enable the build of gcc-3.3-hppa64 on hppa. + Add symlinks for as and ld to point to hppa64-linux-{as,ld}. + * gcj-3.3 depends on g++-3.3, recommends gij-3.3. gij-3.3 suggests gcj-3.3. + * Fix libgc2c-pic compatibility links (closes: #234333). + The link will be removed for gcc-3.4. + * g77-3.3: Conflict with other g77-x.y packages. + * Tighten shlibs dependencies to latest released versions. + + * Phil Blundell: + - debian/patches/arm-233633.dpatch: New Fixes problems with half-word + loads on ARMv3 architecture. (Closes: #233633) + - debian/patches/arm-ldm.dpatch: New. Avoids inefficient epilogue for + leaf functions in PIC code on ARM. + + -- Matthias Klose Sat, 6 Mar 2004 10:57:14 +0100 + +gcc-3.3 (1:3.3.3ds5-1) unstable; urgency=medium + + * gcc-3.3.3 final release. + See /usr/share/doc/gcc-3.3/NEWS.{gcc,html}. + + -- Matthias Klose Mon, 16 Feb 2004 08:59:52 +0100 + +gcc-3.3 (1:3.3.3ds4-0pre4) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20040214 (2nd gcc-3.3.3 prerelease). + * Fix title of libstdc++'s html main index (closes: #196381). + * Move libg2c libraray files out of the gcc specific libdir to /usr/lib. + For g77-3.3 add conflicts to other g77 packages. Closes: #224848. + * Update the stack protector patch to 3.3-7, but don't apply it by default. + Closes: #230338. + * On arm, use arm6 as the cpu default (backport from mainline, PR12527). + * Add libffi and libjava support for hppa (Randolph Chung). Closes: #232615. + + -- Matthias Klose Sat, 14 Feb 2004 09:26:15 +0100 + +gcc-3.3 (1:3.3.3ds3-0pre3) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20040125. + - Fixed PR11350, undefined labels with -Os -fPIC (closes: #195911). + - Fixed PR11793, ICE in extract_insn, at recog.c (closes: #203835). + - Fixed PR13544, removed backport for PR12862. + - Integrated backport for PR12441. + * Fixed since 3.3: java: not implemented interface methods of abstract + classes not found (closes: #225438). + * Disable pascal on arm architecture (currently broken). + * Update the build files to build a cross compiler (Nikita V. Youshchenko). + See debian/README.cross in the source package. + * Apply revised patch to make -mieee the default on alpha-linux, + and add -mieee-disable switch to turn the default off (closes: #212912). + (Tyson Whitehead) + + -- Matthias Klose Sun, 25 Jan 2004 17:41:04 +0100 + +gcc-3.3 (1:3.3.3ds2-0pre2) unstable; urgency=medium + + * Update to gcc-3.3.3 CVS 20040110. + - Fixes compilation not terminating at -O1 on hppa (closes: #207516). + * Add backport to fix PR12441 (closes: #224576). + * Revert backport to 3.3 branch to fix PR12862, which introduced another + regression (PR13544). Closes: #225663. + * Tighten dependency of gnat-3.3 on gcc-3.3 (closes: #226273). + * Disable treelang build for cross compiler build. + * Disable pascal on alpha and ia64 architectures (currently broken). + + -- Matthias Klose Sat, 10 Jan 2004 12:33:59 +0100 + +gcc-3.3 (1:3.3.3ds1-0pre1) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20031229. + - Fixes bootstrap error on ia64-linux. + - Fix -pthread on mips{,el}-linux (closes: #224875). + - Fix -Wformat for C++ (closes: #217075). + * Backport from mainline: Preserve inline-ness when redeclaring + a function template (closes: #195264). + * Add missing intrinsics headers on ix86 (closes: #224593). + * Fix location of libg2c libdir in libg2c.la file (closes: #224848). + + -- Matthias Klose Mon, 29 Dec 2003 10:36:29 +0100 + +gcc-3.3 (1:3.3.3ds0-0pre0.1) unstable; urgency=high + + * NMU + * Fixed mips(el) spec file for -pthread: (Closes: #224875) + * [debian/patches/mips-pthread.dpatch] New. + * [debian/rules.patch] Added it to debian_patches. + + -- J.H.M. Dassen (Ray) Sat, 27 Dec 2003 15:51:47 +0100 + +gcc-3.3 (1:3.3.3ds0-0pre0) unstable; urgency=low + + * Update to gcc-3.3.3 CVS 20031206. + - Fixes ICE in verify_local_live_at_start (hppa). Closes: #201550. + - Fixes miscompilation of linux-2.6/sound/core/oss/rate.c. + Closes: #219949. + * Add missing unwind.h to gcc package (closes: #220846). + * Regenerate control file to fix build dependencies for m68k. + * More gpc only patches to fix test failures on m68k. + * Reenable gpc for the Hurd (closes: #189851). + + -- Matthias Klose Sat, 6 Dec 2003 10:29:07 +0100 + +gcc-3.3 (1:3.3.2ds5-4) unstable; urgency=low + + * Update libffi-dev package description (closes: #219508). + * For gij and libgcj fix dependency on the libstdc++ package, if + the latter isn't installed during the build. + * Apply patch to emit .note.GNU-stack section on linux arches + which by default need executable stack. + * Prefer gnat-3.3 over gnat-3.2 as a build dependency. + * Update the pascal tarball (different version released with the + same name). + * Add pascal patches to address various gpc testsuite failures. + On alpha and ia64, build gpc from the 20030830 version. Reenable + the build on m68k. + Remove the 20030507 gpc version from the tarball. + * Apply patch to build the shared ada libs and link the ada tools + against the shared libs. Not enabled by default, because gnat + and gnatlib are rebuilt during install. (Ludovic Brenta) + + -- Matthias Klose Sun, 9 Nov 2003 22:34:33 +0100 + +gcc-3.3 (1:3.3.2ds4-3) unstable; urgency=low + + * Fix rules to omit inclusion of gnatpsta in mips(el) gnat package. + + -- Matthias Klose Sun, 2 Nov 2003 14:29:59 +0100 + +gcc-3.3 (1:3.3.2ds4-2) unstable; urgency=medium + + * s390-ifcvt patch added. Fixes gcl miscompilation (closes: #217240). + (Gerhard Tonn) + * Fix an infinite loop in g++ compiling lufs, regression from 3.3.1. + * Fix a wrong code generation bug on alpha. + (Falk Hueffner) + * Update NEWS files. + * Add Falk Hueffner to the Debian GCC maintainers. + * Enable ada on mips and mipsel, but don't build the gnatpsta tool. + + -- Matthias Klose Wed, 29 Oct 2003 00:12:37 +0100 + +gcc-3.3 (1:3.3.2ds4-1) unstable; urgency=medium + + * Update to gcc-3.3.2. + * Update NEWS files. + * Miscompilation in the pari package at -O3 fixed (closes: #198172). + * On alpha-linux, revert -mieee as the default (Falk Hueffner). + Reopens: #212912. + * Add ia64-unwind patch (Jeff Bailey). + * Closed reports reported against gcc-2.96 (ia64), fixed at least in gcc-3.3: + - ICE in verify_local_live_at_start, at flow.c:2733 (closes: #135404). + - Compilation failure of stlport (closes: #135224). + - Infinite loop compiling cssc's pfile.cc with -O2 (closes: #115390). + - Added missing some string::compare() members (closes: #141199). + - header declares std::pow (closes: #161853). + - does have at() method (closes: #59776). + - Fixed error in stl_deque.h (closes: #69530). + - Fixed problem with bastring (closes: #75759, #96539). + - bad_alloc and std:: namespace problem (closes: #75120). + - Excessive warnings from headers with -Weffc++ (closes: #76827). + + -- Matthias Klose Fri, 17 Oct 2003 08:07:01 +0200 + +gcc-3.3 (1:3.3.2ds3-0pre5) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20031005. + - Fixes cpp inserting a spurious newline (closes: #210478, #210482). + - Fixes generation of unrecognizable insn compiling kernel source + on alpha (closes: #202762). + - Fixes ICE in add_abstract_origin_attribute (closes: #212406). + - Fixes forward declaration in libstdc++ (closes: #209386). + - Fixes ICE in in extract_insn, at recog.c on alpha (closes: #207564). + * Make libgcj-common architecture all (closes: #211909). + * Build depend on: flex-old | flex (<< 2.5.31). + * Fix spec linking libraries with -pthread on powerpc (closes: #211054). + * debian/patches/arm-gotoff.dpatch: fix two kinds of PIC lossage. + (Phil Blundell) + * debian/patches/arm-common.dpatch: fix excessive alignment of common + blocks causing binutils testsuite failures. + (Phil Blundell) + * Update priorities in debian/control to match the archive. + (Ryan Murray) + * s390-nonlocal-goto patch added. Fixes some pascal testcase failures. + (Gerhard Tonn) + * On alpha-linux, make -mieee default and add -mieee-disable switch + to turn default off (closes: #212912). + (Tyson Whitehead) + * Add gpc upstream patch for memory corruption fix. + + -- Matthias Klose Sun, 5 Oct 2003 19:53:49 +0200 + +gcc-3.3 (1:3.3.2ds2-0pre4) unstable; urgency=low + + * Add gcc-unsharing_lhs patch (closes: #210848) + + -- Ryan Murray Fri, 19 Sep 2003 22:51:19 -0600 + +gcc-3.3 (1:3.3.2ds2-0pre3) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20030908. + * PR11716 (Michael Eager, Dan Jacobowitz): + Make GCC think that the maximum length of a short branch is + 64K instead of 128K. It's a big hammer, but it works. + Closes: #207915. + * Downgrade gpc to 20030507 on alpha and ia64 (closes: #208717). + + -- Matthias Klose Mon, 8 Sep 2003 21:49:52 +0200 + +gcc-3.3 (1:3.3.2ds1-0pre2) unstable; urgency=low + + * Update to gcc-3.3.2 CVS 20030831. + - Fix java NullPointerException detection with 2.6 kernels. + Closes: #206377. + - Fix bug in C++ typedef handling (closes: #205402). + - Fix -Wunreachable-code giving false complaints (closes: #196600). + * Update to gpc-20030830. + * Don't include /usr/share/java/repository into the class path according + to the new version of th Debian Java policy (closes: #205643). + * Build-Depend/Depend on libgc-dev. + + -- Matthias Klose Sun, 31 Aug 2003 08:56:53 +0200 + +gcc-3.3 (1:3.3.2ds0-0pre1) unstable; urgency=low + + * Remove the build dependency on locales for now. + + -- Matthias Klose Fri, 15 Aug 2003 07:48:18 +0200 + +gcc-3.3 (1:3.3.2ds0-0pre0) unstable; urgency=medium + + * Update to gcc-3.3.2 CVS 20030812. + - Fixes generation of wrong code for XDM-AUTHORIZATION-1 key generation + and/or validation. Closes: #196090. + * Update NEWS files. + * Change ix86 default CPU type for code generation: + - i386-linux -> i486-linux + - i386-gnu -> i586-gnu + - i386-freebsd-gnu -> i486-freebsd-gnu + Use -march=i386 to target i386 CPUs. + + -- Matthias Klose Tue, 12 Aug 2003 10:31:28 +0200 + +gcc-3.3 (1:3.3.1ds3-1) unstable; urgency=low + + * gcc-3.3.1 (taken from CVS 20030805). + - C++: Fix declaration conflicts (closes: #203351). + - Fix ICE on ia64 (closes: #203840). + + -- Matthias Klose Tue, 5 Aug 2003 20:38:02 +0200 + +gcc-3.3 (1:3.3.1ds2-0rc2) unstable; urgency=low + + * Update to gcc-3.3.1 CVS 20030728. + - Fix ICE in extract_insn, at recog.c:2148 on m68k. + Closes: #177840, #180375, #190818. + - Fix ICE while building libquicktime on alpha (closes: #192576). + - Fix failure to deal with using and private inheritance (closes: #202696). + * On sparc, /usr/lib was added to the library search path. Fix it. + * Closed reports reported against gcc-3.2.x and fixed in gcc-3.3: + - Fix error building the gcl package on arm (closes: #199835). + + -- Matthias Klose Mon, 28 Jul 2003 20:39:07 +0200 + +gcc-3.3 (1:3.3.1ds1-0rc1) unstable; urgency=low + + * Update to gcc-3.3.1 CVS 20030722 (3.3.1 release candidate 1). + - Fix ICE in copy_to_mode_reg on 64-bit targets (closes: #189365). + - Remove documentation about multi-line strings (closes: #194391). + - Correctly document -falign-* parameters (closes: #198269). + - out-of-class specialization of a private nested template class. + Closes: #193830. + - Tighten shlibs dependency due to new symbols in libgcc. + * README.Debian for libg2c0, describing the need for g77-x.y when + working with the g2c header and library (closes: #189059). + * Call make with -j, if USE_NJOBS is set and non-empty + in the environment. + * Add another two m68k patches, partly replacing the workarounds provided + by Roman Zippel. + * Add the stack protector patch, but don't apply it by default. Edit + debian/rules.patch to apply it (closes: #171699, #189494). + * Remove wrong symlinks from gnat package (closes: #201882). + * Closed reports reported against gcc-2.95 and fixed in newer versions: + - SMP kernel compilation on alpha (closes: #134197, #146883). + - ICE on arm while building imagemagick (closes: #173475). + * Closed reports reported against gcc-3.2.x and fixed in gcc-3.3: + - Miscompilation of octave2.1 on hppa (closes: #192296, #193804). + + -- Matthias Klose Sun, 13 Jul 2003 10:26:30 +0200 + +gcc-3.3 (1:3.3.1ds0-0pre0) unstable; urgency=medium + + * Update to gcc-3.3.1 CVS 20030626. + - Fix ICE on arm compiling xfree86 (closes: #195424). + - Fix ICE on arm compiling fftw (closes: #186185). + - Fix ICE on arm in change_address_1, affecting a few packages. + Closes: #197099. + - Fix ICE in merge_assigned_reloads building Linux 2.4.2x sched.c. + Closes: #195237. + - Do not warn about failing to inline functions declared in system headers. + Closes: #193049. + - Fix ICE on mips{,el} in propagate_one_insn (closes: #194330, #196091). + - Fix ICE on m68k in reg_overlap_mentioned_p (closes: #194749). + - Build crtbeginT.o on m68k (closes: #197613). + * Fix g++ man page symlink (closes: #196271). + * mips/mipsel: Depend on binutils (>= 2.14.90.0.4). Closes: #196744. + * Disable treelang on powerpc (again). Closes: #196915. + * Pass -encoding in gcj-wrapper. + + -- Matthias Klose Fri, 27 Jun 2003 00:14:43 +0200 + +gcc-3.3 (1:3.3ds9-3) unstable; urgency=low + + * Closing more reports, fixed in 3.2/3.3: + - ICE building texmacs on m68k (closes: #177433). + - libstdc++: doesn't define trunc(...) (closes: #105285). + - libstdc++: setw is ignored for strings output (closes: #52382, #76645). + * Add build support to omit the manual pages and info docs from the + packages, disabled by default. Wait for a Debian statement, which can + be cited. Adresses: #193787. + * Reenable the m68k-const patch, don't run the g77 testsuite on m68k. + Addresses ICEs (#177840, #190818). + * Update arm-xscale patch. + * libstdc++: use __attribute__(__unknown__), instead of (unknown). + Closes: #195796. + * Build-Depend on glibc (>= 2.3.1) to prevent incorrect builds on woody. + Request from Adrian Bunk. + * Add treelang-update patch (Tim Josling), reenable treelang on powerpc. + * Add -{cpp,gcc,g++,gcj,g77} symlinks (addresses: #189466). + * Make sure not to build using binutils-2.14.90.0.[12]. + + -- Matthias Klose Mon, 2 Jun 2003 22:35:45 +0200 + +gcc-3.3 (1:3.3ds9-2) unstable; urgency=medium + + * Correct autoconf-related snafu in newly added ARM patches (Phil Blundell). + * Correct libgcc1 dependency (closes: #193689). + * Work around ldd/dpkg-shlibs failure on s390x. + + -- Matthias Klose Sun, 18 May 2003 09:40:15 +0200 + +gcc-3.3 (1:3.3ds9-1) unstable; urgency=low + + * gcc-3.3 final release. + See /usr/share/doc/gcc-3.3/NEWS.{gcc,html}. + * First merge of i386/x86-64 biarch support (Arnd Bergmann). + Disabled by default. Closes: #190066. + * New gpc-20030507 version. + * Upstream gpc update to fix netbsd build failure (closes: #191407). + * Add arm-xscale.dpatch, arm-10730.dpatch, arm-tune.dpatch, copied + from gcc-3.2 (Phil Blundell). + * Closing bug reports reported against older gcc versions (some of them + still present in Debian, but not anymore as the default compiler). + Usually, forwarded bug reports are linked to + http://gcc.gnu.org/PR + The upstream bug number usually can be found in the Debian reports. + + * Closed reports reported against gcc-3.1.x, gcc-3.2.x and fixed in gcc-3.3: + - General: + + GCC accepts multi-line strings without \ or " " &c (closes: #2910). + + -print-file-name sometimes fails (closes: #161615). + + ICE: reporting routines re-entered (closes: #179597, #180937). + + Misplaced paragraph in gcc documentation (closes: #179363). + + Error: suffix or operands invalid for `div' (closes: #150558). + + builtin memcmp() could be optimised (closes: #85535). + - Ada: + + Preelaborate, exceptions, and -gnatN (closes: #181679). + - C: + + Duplicate loop conditions even with -Os (closes: #94701). + + ICE (signal 11) (closes: #65686). + - C++: + + C++ error on virtual function which uses ... (closes: #165829). + + ICE when warning about cleanup nastiness in switch statements + (closes: #184108). + + Fails to compile virtual inheritance with variable number of + argument method (closes: #151357). + + xmmintrin.h broken for c++ (closes: #168310). + + Stack corruption with variable-length automatic arrays and virtual + destructors (closes: #188527). + + ICE on illegal code (closes: #184862). + + _attribute__((unused)) is ignored in C++ (closes: #45440). + + g++ handles &(void *)foo bizzarely (closes: #79225). + + ICE (with wrong code, though) (closes: #81122). + - Java: + + Broken zip file handling (closes: #180567). + - ObjC: + + @protocol forward definitions do not work (closes: #80468). + - Architecture specific: + - alpha + + va_start is off by one (closes: #186139). + + ICE while building kseg/ddd (closes: #184753). + + g++ -O2 optimization error (closes: #70743). + - arm + + ICE with -O2 in change_address_1 (closes: #180750). + + gcc optimization error with -O2, affecting bison (closes: #185903). + - hppa + + ICE in insn_default_length (closes: #186447). + - ia64 + + gcc-3.2 fails w/ optimization (closes: #178830). + - i386 + + unnecessary generation of instruction cwtl (closes: #95318). + + {athlon} ICE building mplayer (closes: #184800). + + {pentium4} ICE while compiling mozilla with -march=pentium4 + (closes: #187910). + + i386 optimisation: joining tests (closes: #105309). + - m68k + + ICE in instantiate_virtual_regs_1 (closes: #180493). + + gcc optimizer bug on m68k (closes: #64832). + - powerpc + + ICE in extract_insn, at recog.c:2175 building php3 (closes: #186299). + + ICE with -O -Wunreachable-code (closes: #189702). + - s390 + + Operand out of range at assembly time when using -O2 + (closes: #178596). + - sparc + + gcc-3.2 regression (wrong code) (closes: #176387). + + ICE in mem_loc_descriptor when optimizing (closes: #178909). + + ICE in gen_reg_rtx when optimizing (closes: #178965). + + Optimisation leads to unaligned access in memcpy (closes: #136659). + + * Closed reports reported against gcc-3.0 and fixed in gcc-3.2.x: + - General: + + Use mkstemp instead of mktemp (closed: #127802). + - Preprocessor: + + Fix redundant error message from cpp (closed: #100722). + - C: + + Optimization issue on ix86 (pointless moving) (closed: #97904). + + Miscompilation of allegro on ix86 (closed: #105741). + + Fix generation of ..ng references for static aliases (alpha-linux). + (closed: #108036). + + ICE compiling pari on hppa (closed: #111613). + + ICE on ia64 in instantiate_virtual_regs_1 (closed: #121668). + + ICE in c-typeck.c (closed: #123687). + + ICE in gen_subprogram_die on alpha (closed: #127890). + + SEGV in initialization of flexible char array member (closed: #131399). + + ICE on arm compiling lapack (closed: #135967). + + ICE in incomplete_type_error (closed: #140606). + + Fix -Wswitch (also part of -Wall) (closed: #140995). + + Wrong code in mke2fs on hppa (closed: #150232). + + sin(a) * sin(b) gives wrong result (closed: #164135). + - C++: + + Error in std library headers on arm (closed: #107633). + + ICE nr. 19970302 (closed: #119635). + + std::wcout does not perform encoding conversions (closed: #128026). + + SEGV, when compiling iostream.h with -fPIC (closed: #134315). + + Fixed segmentation fault in included code for (closed: #137017). + + Fix with exception handling and -O (closed: #144232). + + Fix octave-2.1 build failure on ia64 (closed: #144584). + + nonstandard overloads in num_get facet (closed: #155900). + + ICE in expand_end_loop with -O (closed: #158371). + - Fortran: + + Fix blas build failure on arm (closed: #137959). + - Java: + + Interface members are public by default (closed: #94974). + + Strange message with -fno-bounds-check in combination with -W. + (closed: #102353). + + Crash in FileWriter using IOException (closed: #116128). + + Fix ObjectInputStream.readObject() calling constructors. + (closed: #121636). + + gij: better error reporting on `class not found' (closed: #125649). + + Lockup during .java->.class compilation (closed: #141899). + + Compile breaks using temporary inner class instance (closed: #141900). + + Default constructor for inner class causes broken bytecode. + (closed: #141902). + + gij-3.2 linked against libgcc1 (closed: #165180). + + gij-wrapper understands -classpath parameter (closed: #146634). + + gij-3.2 doesn't ignore -jar when run as "java" (closed: #167673). + - ObjC: + + ICE on alpha (closed: #172353). + + * Closed reports reported against gcc-2.95 and fixed in newer versions: + - General: + + Undocumented option -pthread (closes: #165110). + + stdbool.h broken (closes: #167439). + + regparm/profiling breakage (closes: #20695). + + another gcc optimization error (closes: #51456). + + ICE in `output_fix_trunc' (closes: #55967). + + Fix "Unable to generate reloads for" (closes: #58219, #131890). + + gcc -c -MD x/y.c -o x/y.o leaves y.d in cwd (closes: #59232). + + Compiler error with -O2 (closes: #67631). + + ICE (unrecognizable insn) compiling php4 (closes: #83550, #84969). + + Another ICE (closes: #90666). + + man versus info inconsistency (-W and -Wall) (closes: #93708). + + ICE on invalid extended asm (closes: #136630). + + ICE in `emit_no_conflict_block' compiling perl (closes: #154599). + + ICE in `gen_tagged_type_instantiation_die'(closes: #166766). + + ICE on __builtin_memset(s, 0, -1) (closes: #170994). + + -Q option to gcc appears twice in the documentation (closes: #137382). + + New options for specifying targets:- -MQ and -MT (closes: #27878). + + Configure using --enable-nls (closes: #51651). + + gcc -dumpspecs undocumented (closes: #65406). + - Preprocessor: + + cpp fails to parse macros with varargs correctly(closes: #154767). + + __VA_ARGS__ stringification crashes preprocessor if __VA_ARGS__ is + empty (closes: #152709). + + gcc doesn't handle empty args in macro function if there is only + one arg(closes: #156450). + - C: + + Uncaught floating point exception causes ICE (closes: #33786). + + gcc -fpack-struct doesn't pack structs (closes: #64628). + + ICE in kernel (matroxfb) code (closes: #151196). + + gcc doesn't warn about unreachable code (closes: #158704). + + Fix docs for __builtin_return_address(closes: #165992). + + C99 symbols in limits.h not defined (closes: #168346). + + %zd printf spec generates warning, even in c9x mode (closes: #94891). + + Update GCC attribute syntax (closes: #12253, #43119). + - C++ & libstdc++-v3: + + template and virtual inheritance bug (closes: #152315). + + g++ has some troubles with nested templates (closes: #21255). + + vtable thunks implementation is broken (closes: #34876, #35477). + + ICE for templated friend (closes: #42662). + + ICE compiling mnemonic (closes: #42989). + + Deprecated: result naming doesn't work for functions defined in a + class (closes: #43170). + + volatile undefined ... (closes: #50529). + + ICE concerning templates (closes: #53698). + + Program compiled -O3 -malign-double segfaults in ofstream::~ofstream + (closes: #56867). + + __attribute__ ((constructor)) doesn't work with C++ (closes: #61806). + + Another ICE (closes: #65687). + + ICE in `const_hash' (closes: #72933). + + ICE on illegal code (closes: #83221). + + Wrong code with -O2 (closes: #83363). + + ICE on template class (closes: #85934). + + No warning for missing return in non-void member func (closes: #88260). + + Not a bug/fixed in libgcc1: libgcc.a symbols end up exported by + shared libraries (closes: #118670). + + ICE using nested templates (closes: #118781). + + Another ICE with templates (closes: #127489). + + More ICEs (closes: #140427, #141797). + + ICE when template declared after use(closes: #148603). + + template function default arguments are not handled (closes: #157292). + + Warning when including stl.h (closes: #162074). + + g++ -pedantic-errors -D_GNU_SOURCE cannot #include + (closes: #151671). + + c++ error message improvement suggestion (closes: #46181). + + Compilation error in stl_alloc.h with -fhonor-std (closes: #59005). + + libstdc++ has no method at() in stl_= (closes: #68963). + - Fortran: + + g77 crash (closes: #130415). + - ObjC: + + ICE: program cc1obj got fatal signal 11 (closes: #62309). + + Interface to garbage collector is undocumented. (closes: #68987). + - Architecture specific: + - alpha + + Can't compile with define gnu_source with stdio and curses + (closes: #97603). + + Header conflicts on alpha (closes: #134558). + + lapack-dev: cannot link on alpha (closes: #144602). + + ICE `fixup_var_refs_1' (closes: #43001). + + Mutt segv on viewing list of attachments (closes: #47981). + + ICE building open-amulet (closes: #48530). + + ICE compiling hatman (closes: #55291). + + dead code removal in switch() broken (closes: #142844). + - arm + + Miscompilation using -fPIC on arm (closes: #90363). + + infinite loop with -O on arm (closes: #151675). + - i386 + + ICE when using -mno-ieee-fp and -march=i686 (closes: #87540). + - m68k + + Optimization (-O2) broken on m68k (closes: #146006). + - mips + + g++ exception catching does not work... (closes: #105569). + + update-menus gets Bus Error (closes: #120333). + - mipsel + + aspell: triggers ICE on mipsel (closes: #128367). + - powerpc + + -O2 produces wrong code (gnuchess example) (closes: #131454). + - sparc + + Misleading documentation for -malign-{jump,loop,function}s + (closes: #114029). + + Sparc GCC issue with -mcpu=ultrasparc (closes: #172956). + + flightgear: build failure on sparc (closes: #88694). + + -- Matthias Klose Fri, 16 May 2003 07:13:57 +0200 + +gcc-3.3 (1:3.3ds8-0pre9) unstable; urgency=high + + * gcc-3.3 second prerelease. + - Fixing exception handling on s390 (urgency high). + * Reenabled gpc build (I had it disabled ...). Closes: #192347. + + -- Matthias Klose Fri, 9 May 2003 07:32:14 +0200 + +gcc-3.3 (1:3.3ds8-0pre8) unstable; urgency=low + + * gcc-3.3 prerelease. + - Fixes gcj ICE (closes: #189545). + * For libstdc++ use the i486 atomicity implementation, introduced with + 0pre6, left out in 0pre7 (closes: #191684). + * Add README.Debian for treelang (closes: #190812). + * Apply NetBSD changes (Joel Baker). Closes: #191551. + * New symbols in libgcc1, tighten the shlibs dependency. + * Disable testsuite run on mips/mipsel because of an outdated libc-dev + package. + * Do not build libffi with debug information, although configuring + with --enable-debug. + + -- Matthias Klose Tue, 6 May 2003 06:53:49 +0200 + +gcc-3.3 (1:3.3ds7-0pre7) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030429). + * Revert upstream libstdc++ change (closes: #191145, #191147, #191148, + #191149, #149159, #149151, and other reports). + Sorry for not detecting this before the upload, seems to be + broken on i386 "only". + * hurd-i386: Use /usr/include, not /include. + * Disable gpc on hurd-i386 (closes: #189851). + * Disable building the debug version of libstdc++ on powerpc-linux + (fixes about 200 java test cases). + * Install libstdc++v3 man pages (closes: #127263). + + -- Matthias Klose Tue, 29 Apr 2003 23:28:44 +0200 + +gcc-3.3 (1:3.3ds6-0pre6) unstable; urgency=high + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030426). + * libstdc++-doc: Fix index.html link (closes: #189424). + * Revert back to the i486 atomicity implementation, that was used + for gcc-3.2 as well. Reopens: #184446, #185662. Closes: #189983. + For this reason, tighten the libstdc++5 shlibs dependency. See + http://lists.debian.org/debian-devel/2003/debian-devel-200304/msg01895.html + Don't build the ix86 specfic libstdc++ libs anymore. + + -- Matthias Klose Sun, 27 Apr 2003 19:47:54 +0200 + +gcc-3.3 (1:3.3ds5-0pre5) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030415). + * Disable treelang on powerpc. + * Disable gpc on m68k. + * Install locale data. Conflict with gcc-3.2 (<= 1:3.2.3-0pre8). + * Fix generated bits/atomicity.h (closes: #189183). + * Tighten libgcc1 shlibs dependency (new symbol _Unwind_Backtrace). + + -- Matthias Klose Wed, 16 Apr 2003 00:37:05 +0200 + +gcc-3.3 (1:3.3ds4-0pre4) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030412). + * Avoid sparc64 dependencies for libgcc1 on sparc (Clint Adams). + * Make the default sparc 32bit target v8 instead of v7. This mainly + enables hardmul, which should speed up v8 and v9 systems by a large + margin (Ben Collins). + * Tighten binutils dependency for sparc. + * On i386, build libstdc++ optimized for i486 and above. The library + in /usr/lib is built for i386. Closes: #184446, #185662. + * Add gpc build (from gcc-snapshot package). + * debian/control: Include all packages, that _can_ be built from + this source package (except the cross packages). + * Add m68k patches: m68k-const, m68k-subreg, m68k-loop. + * Run the 3.3 testsuite a second time with the installed gcc-3.2 + to check for regressions (promised, only this time, and for the + final release ;). Add build dependencies (gobjc-3.2, g77-3.2, g++-3.2). + + -- Matthias Klose Sat, 12 Apr 2003 10:11:11 +0200 + +gcc-3.3 (1:3.3ds3-0pre3) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030331). + * Reenable java on arm. + * Build-Depend on binutils-2.13.90.0.18-1.3 on m68k. Fixes all + bprob/gcov testsuite failures. + * Enable C++ build on arm. + * Enable the sparc64 build. + + -- Matthias Klose Mon, 31 Mar 2003 23:24:54 +0200 + +gcc-3.3 (1:3.3ds2-0pre2) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030317). + * Disable building the gcc-3.3-nof package. + * Disable Ada on mips and mipsel. + * Remove the workaround to build Ada on powerpc. + * Add GNU Free documentation license to copyright file. + * Update the sparc64 build patches (Clint Adams). Not yet enabled. + * Disable C++ on arm (Not yet tested). + * Add fix for ICE on powerpc (see: #184684). + + -- Matthias Klose Sun, 16 Mar 2003 21:40:57 +0100 + +gcc-3.3 (1:3.3ds1-0pre1) unstable; urgency=low + + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030310). + * Add gccbug manpage. + * Don't build libgnat package (no shared library). + * Configure with --enable-sjlj-exceptions on hppa and m68k for + binary compatibility with libstdc++ built with gcc-3.2. + * Disable Java on arm-linux (never seen it sucessfully bootstrap). + * Install non-conflicting baseline README. + * multilib *.so and *.a moved to /usr/lib/gcc-lib/... , so that several + compiler versions can be installed concurrently. + * Remove libstdc++-incdir patch applied upstream. + * libstdc++ 64 bit development files now handled in -dev target. + (Gerhard Tonn) + * Drop build dependencies for gpc (tetex-bin, help2man, libncurses5-dev). + * Add libstdc++5-3.3-dev confict to libstdc++5-dev (<= 1:3.2.3-0pre3). + * Enable builds on m68k (all but C++ for the moment). gcc-3.3 bootstraps, + while gcc-3.2 doesn't. + + -- Matthias Klose Mon, 10 Mar 2003 23:41:00 +0100 + +gcc-3.3 (1:3.3ds0-0pre0) unstable; urgency=low + + * First gcc-3.3 package, built for s390 only. All other architectures + build the gcc-3.3-base package only. + To build the package on other architectures, edit debian/rules.defs + (macro no_dummy_archs). + * gcc-3.3 prerelease taken from the gcc-3_3-branch (CVS 20030301). + * Don't include the gcc locale files (would conflict with 3.2). + * Remove libffi-install-fix patch. + * Fix netbsd-i386 patches. + * Change priority of libstdc++5 and gcc-3.2-base to important. + * Install gcjh-wrapper for javah. + * gij suggests fastjar, gcj recommends fastjar. + * Allow builds using automake1.4 | automake (<< 1.5). + * Backport fix for to output more correct line numbers. + * Add help2man to build dependencies needed for some gpc man pages. + * gpc: Install binobj and gpidump binaries and man pages. + * Apply cross compilation patches submitted by Bastian Blank. + * Replace s390-biarch patch and copy s390-config-ml patch from 3.2 + (Gerhard Tonn). + * Configure using --enable-debug. + * Add infrastructure to only build a subset of binary packages. + * Rename libstdc++-{dev,dbg,pic,doc} packages. + * Build treelang compiler. + + -- Matthias Klose Sat, 1 Mar 2003 12:56:42 +0100 + +gcc-3.2 (1:3.2.3ds2-0pre3) unstable; urgency=low + + * gcc-3.2.3 prerelease (CVS 20030228) + - Fixes bootstrap failure on alpha-linux. + - Fixes ICE on m68k (closes: #177016). + * Build Pascal with -O1 on powerpc, disable Pascal on arm, m68k and + sparc (due to wrong code generation for fwrite in glibc, + see PR optimization/9279). + * Apply cross compilation patches submitted by Bastian Blank. + + -- Matthias Klose Fri, 28 Feb 2003 20:26:30 +0100 + +gcc-3.2 (1:3.2.3ds1-0pre2) unstable; urgency=medium + + * gcc-3.2.3 prerelease (CVS 20030221) + - Fixes ICE on hppa (closes: #181813). + * Patch for ffitest in s390-java.dpatch deleted, since already fixed + upstream. (Gerhard Tonn) + * Build crtbeginT.o on m68k-linux (closes: #179807). + * Install gcjh-wrapper for javah (closes: #180218). + * gij suggests fastjar, gcj recommends fastjar (closes: #179298). + * Allow builds using automake1.4 | automake (<< 1.5) (closes: #180048). + * Backport fix for to output more correct line numbers (closes: #153965). + * Add help2man to build dependencies needed for some gpc man pages. + * gpc: Install binobj and gpidump binaries and man pages. + * Disable gpc on arm due to wrong code generation for fwrite in + glibc (see PR optimization/9279). + + -- Matthias Klose Sat, 22 Feb 2003 19:58:20 +0100 + +gcc-3.2 (1:3.2.3ds0-0pre1) unstable; urgency=low + + * gcc-3.2.3 prerelease (CVS 20030210) + - Fixes long millicode calls on hppa (closes: #180520) + * New gpc-20030209 version. Remove gpc-update.dpatch and gpc-testsuite.dptch + as they are no longer needed. + * Fix netbsd-i386 patches (closes: #180129, #179931) + * m68k-bootstrap.dpatch: backport gcse.c changes from 3.3/MAIN to 3.2 + * Change priority of libstdc++5 and gcc-3.2-base to important. + + -- Ryan Murray Tue, 11 Feb 2003 06:18:09 -0700 + +gcc-3.2 (1:3.2.2ds8-1) unstable; urgency=low + + * gcc-3.2.2 release. + - Fixes ICE, regression from 2.95 (closes: #176117). + - Fixes ICE, regression from 2.95 (closes: #179161). + * libstdc++ for biarch installs now upstream to usr/lib64, + therefore mv usr/lib/64 usr/lib64 no longer necessary. (Gerhard Tonn) + + -- Ryan Murray Wed, 5 Feb 2003 01:35:29 -0700 + +gcc-3.2 (1:3.2.2ds7-0pre8) unstable; urgency=low + + * gcc-3.2.2 prerelease (CVS 20030130). + * update s390 libffi patch + * debian/control: add myself to uploaders and change libc12-dev depends to + libc-dev on i386 (closes: #179128) + * Build-Depend on procps so that ps is available for logwatch + + -- Ryan Murray Fri, 31 Jan 2003 04:00:15 -0700 + +gcc-3.2 (1:3.2.2ds6-0pre7) unstable; urgency=low + + * gcc-3.2.2 prerelease (CVS 20030128). + - Update needed for hppa. + - Fixes ICE on arm, regression from 2.95.x (closes: #168086). + - Can use default bison (1.875). + * Apply netbsd build patches (closes: #177674, #178328, #178325, + #178326, #178327). + * Run the logwatch script on "slow" architectures (arm, m68k) only. + * autoreconf.dpatch: Only update libtool.m4, which is newer conceptually + than libtool 1.4 (Ryan Murray). + * Apply autoreconf patch universally (Ryan Murray). + * More robust gij/gcj wrapper scripts, include /usr/lib/jni in default + JNI search path (Ben Burton). Closes: #167932. + * Build crtbeginT.o on m68k (closes: #177036). + * Fixed libc-dev source dependency (closes: #178602). + * Tighten shlib dependency to the current package version; should be + 1:3.2.2-1 for the final release (closes: #178867). + + -- Matthias Klose Tue, 28 Jan 2003 21:59:30 +0100 + +gcc-3.2 (1:3.2.2ds5-0pre6) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20030123). + * Build locales needed by the libstdc++ testsuite. + * Update config.{guess,sub} files from autotools-dev (closes: #177674). + * Disable Ada and Java on netbsd-i386 (closes: #177679). + * gnat: Add suggests for gnat-doc and ada-reference-manual. + + -- Matthias Klose Thu, 23 Jan 2003 22:16:53 +0100 + +gcc-3.2 (1:3.2.2ds4-0pre5.1) unstable; urgency=low + + * Readd build dependency `locales' on arm. locales is now installable + * Add autoreconf patch for mips{,el}. (closes: #176311) + + -- Ryan Murray Wed, 22 Jan 2003 14:31:14 -0800 + +gcc-3.2 (1:3.2.2ds4-0pre5) unstable; urgency=low + + * Remove build dependency `libc6-dev-sparc64 [sparc]' for now. + * Remove build dependency `locales' on arm. locales is uninstallable + on arm due to the missing glibc-2.3. + * Use bison-1.35. bison-1.875 causes an hard error on the reduce/reduce + conflict in objc-parse.y. + + -- Matthias Klose Fri, 10 Jan 2003 10:10:43 +0100 + +gcc-3.2 (1:3.2.2ds4-0pre4) unstable; urgency=low + + * Try building with gcc-2.95 on m68k-linux. Building gcc-3.2 with gcc-3.2 + does not work for me. m68k-linux doesn't look good at all ... + * Fix s390 build error. + * Add locales to build dependencies. A still unsolved issue is the + presence of the locales de_DE, en_PH, en_US, es_MX, fr_FR and it_IT, + or else some tests in the libstdc++ testsuite will fail. + * Put all -nof files in the -nof package (closes: #175253). + * Correctly exit logwatch script (closes: #175251). + * Install linker-map.gnu file for libstdc++_pic (closes: #175144). + * Install versioned gpcs docs only (closes: #173844). + * Include gpc test results in gpc package. + * Link local libstdc++ documentation to local source-level documentation. + * Clarify libstdc++ description (so version and library version). + Closes: #175799. + * Include library in libstdc++-dbg package (closes: #176005). + + -- Matthias Klose Wed, 8 Jan 2003 23:39:50 +0100 + +gcc-3.2 (1:3.2.2ds3-0pre3) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021231). + - Fix loop count computation for preconditioned unrolled loops. + Closes: #162919. + - Fix xmmintrin.h (_MM_TRANSPOSE4_PS) CVS 20021027 (closes: #163647). + - Fix [PR 8601] strlen/template interaction causes ICE CVS 20021201. + Closes: #166143. + * Watch the log files, which are written during the testsuite runs and print + out a message, if there is still activity. No more buildd timeouts on arm + and m68k ... + * Remove gpc's reference to librx1g-dev package (closes: #172953). + * Remove trailing dots on package descriptions. + * Fix external reference to cpp.info in gcc.info (closes: #174598). + + -- Matthias Klose Tue, 31 Dec 2002 13:47:52 +0100 + +gcc-3.2 (1:3.2.2ds2-0pre2) unstable; urgency=medium + + * Friday, 13th upload, so what do you expect ... + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021212). + * Fix gnat build (autobuild maintainers: please revert back to gnat-3.2 + (<= 1:3.2.1ds6-1) for building gnat-3.2, if the build fails building + gnatlib and gnattools). + * Really disable sparc64 support. + + -- Matthias Klose Fri, 13 Dec 2002 00:26:37 +0100 + +gcc-3.2 (1:3.2.2ds1-0pre1) unstable; urgency=low + + * A candidate for the transition ... + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021210). + - doc/invoke.texi: Remove last reference to -a (closes: #171748). + * Disable sparc64 support. For now please use egcs64 to build sparc64 + kernels. + * Disable Pascal on the sparc architecture (doesn't bootstrap). + + -- Matthias Klose Tue, 10 Dec 2002 22:33:13 +0100 + +gcc-3.2 (1:3.2.2ds0-0pre0) unstable; urgency=low + + * gcc-3.2 snapshot taken from the gcc-3_2-branch (CVS 20021202). + - Should fix _Pragma expansion within macros (closes: #157416). + * New gpc-20021128 version. Run check using EXTRA_TEST_PFLAGS=-g0 + * Add tetex-bin to build dependencies (gpc needs it). Closes: #171203. + + -- Matthias Klose Tue, 3 Dec 2002 08:22:33 +0100 + +gcc-3.2 (1:3.2.1ds6-1) unstable; urgency=low + + * gcc-3.2.1 final release. + * Build gpc-20021111 for all architectures. hppa and i386 are + known to work. For the other architectures, send the usual FTBFS ... + WARNING: this gpc version is an alpha version, especially debug info + doesn't work well, so use -g0 for compiling. If you need a stable + gpc compiler, use gpc-2.95. + * Encode the gpc upstream version in the package name, the gpc release + date in the version number (requested by gpc upstream). + * Added libncurses5-dev and libgmp3-dev as build dependencies for the + gpc tests and runtime. + * Clean CVS files as well (closes: #169101). + * s390-biarch.dpatch added, backported from CVS (Gerhard Tonn). + * s390-config-ml.dpatch added, disables biarch for java, + libffi and boehm-gc on s390. They need a 64 bit runtime + during build which is not yet available on s390 (Gerhard Tonn). + * Biarch support for packaging adapted (Gerhard Tonn). + biarch variable added and with-sparc64 variable substituted in + most places by biarch. + dh_shlibdeps is applied only to 32 bit libraries on s390, since + ldd for 64 bit libraries don't work on 32 bit runtime. + Build dependency to libc6-dev-s390x added. + + -- Matthias Klose Wed, 20 Nov 2002 00:20:58 +0100 + +gcc-3.2 (1:3.2.1ds5-0pre6) unstable; urgency=medium + + * gcc-3.2.1 prerelease. + * Removed arm patch integrated upstream. + * Adjust gnat build dependency (closes: #167116). + * Always configure with --enable-clocale=gnu. The autobuilders do have + locales installed, but not generated the "de_DE" locale needed for + the autoconf test in libstdcc++-v3/aclocal.m4. + * libstdc++ documentaion: Don't compresss '*.txt' referenced by html pages. + + -- Matthias Klose Tue, 12 Nov 2002 07:19:44 +0100 + +gcc-3.2 (1:3.2.1ds4-0pre5) unstable; urgency=medium + + * gcc-3.2.1 snapshot (CVS 20021103). + * sparc64-build.dpatch: Updated. Lets sparc boostrap again. + * s390-loop.dpatch removed, already fixed upstream (Gerhard Tonn). + * bison.dpatch: Removed, patch submitted upstream. + * backport-java-6865.dpatch: Apply again during build. + * Tighten glibc dependency (closes: #166703). + + -- Matthias Klose Sun, 3 Nov 2002 12:22:02 +0100 + +gcc-3.2 (1:3.2.1ds3-0pre4) unstable; urgency=high + + * gcc-3.2.1 snapshot (CVS 20021020). + - Expansion of _Pragma within macros fixed (closes: #157416). + * FTBFS: With the switch to bison-1.50 (and 1.75), gcc-3.2 fails to build from + source on Debian unstable systems. This is fixed in gcc HEAD, but not on + the current release branch. + HELP NEEDED: + - check what is missing from the patches in debian/patches/bison.dpatch. + This is a backport of the bison related patches, but showing regressions + in the gcc testsuite, so it cannot be applied. + - build gcc using byacc (bootstrap currently fails using byacc). + - build bison-1.35 in it's own package (the current 1.35-3 package fails + to build form source). + - and finally ask upstream to backport the patch to the branch. It's not + helpful not beeing able to follow the stable branch. Maybe we should + just switch to gcc HEAD as BSD does ... + As a terrible workaround, build the sources from CVS first on a machine, + with bison-1.35 installed, then package the tarball, so the bison + generated files are not rebuilt. + + * re-add lost patch: configure with --enable-__cxa_atexit (closes: #163422), + Therefore urgency high. + * gcj-wrapper, gij-wrapper: Accept names starting with `.' (closes: #163172, + #164009). + * Point g++ manpage to correct g++ version (closes: #162843). + * Support for i386-freebsd-gnu (closes: #163883). + * s390-java.dpatch replaced with backport from cvs head (Gerhard Tonn). + * Disable the testsuite run on the Hurd (closes: #159650). + * s390-loop.dpatch added, fixes runtime problem (Gerhard Tonn). + * debian/patches/bison.dpatch: Backport for bison-1.75 compatibility. + Don't use it due to regressions. + * debian/patches/backport-java-6865.dpatch: Directly applied in the + included tarball because of bison problems. + * Make fixincludes priority optional, so linda can depend on it. + * Tighten binutils dependency. + + -- Matthias Klose Sun, 20 Oct 2002 10:52:49 +0200 + +gcc-3.2 (1:3.2.1ds2-0pre3) unstable; urgency=low + + * gcc-3.2.1 snapshot (CVS 20020923). + * Run the libstdc++ check-abi script. Results are put into the file + /usr/share/doc/libstdc++5/README.libstdc++-baseline in the libstdc++5-dev + package. This file contains a new baseline, if no baseline for this + architecture is included in the gcc sources. + * gcj-wrapper: Accept files starting with an underscore, accept + path names (closes: #160859, #161517). + * Explicitely call automake-1.4 when rebuilding Makefiles (closes: #161438). + * Let installed fixincludes script find files in /usr/lib/fixincludes. + * debian/rules.patch: Add .NOTPARALLEL as target, so that patches are + applied sequentially (closes: #159395). + + -- Matthias Klose Tue, 24 Sep 2002 07:36:56 +0200 + +gcc-3.2 (1:3.2.1ds1-0pre2) unstable; urgency=low + + * gcc-3.2.1 snapshot (CVS 20020913). Welcome back m68k in bootstrap land! + * Fix arm-tune.dpatch (closes: #159354). + * Don't overwrite LD_LIBRARY_PATH in build (closes: #158459). + * --disable-__cxa_atexit on NetBSD (closes: #159620). + * Reenable installation of message catalogs (disabled in 3.2-0pre2). + Closes: #160175. + * Ben Collins + - Re-enable sparc64 build. This time, it's part of the default compiler. + I have disabled 64/alt libraries as they are too much overhead. All + libraries build 64bit, but currently only libgcc/libstdc++ include the + 64bit libraries. + Closes: #160404. + * Depend on autoconf2.13, instead of autoconf. + * Phil Blundell + - debian/patches/arm-update.dpatch: Fix python2.2 build failure. + + -- Matthias Klose Sat, 7 Sep 2002 08:05:02 +0200 + +gcc-3.2 (1:3.2.1ds0-0pre1) unstable; urgency=medium + + * gcc-3.2.1 snapshot (CVS 20020829). + New g++ option -Wabi: + Warn when G++ generates code that is probably not compatible with the + vendor-neutral C++ ABI. Although an effort has been made to warn about + all such cases, there are probably some cases that are not warned about, + even though G++ is generating incompatible code. There may also be + cases where warnings are emitted even though the code that is generated + will be compatible. + The current version of the ABI is 102, defined by the __GXX_ABI_VERSION + macro. + * debian/NEWS.*: Updated. + * Fix libstdc++-dev dependency on libc-dev for the Hurd (closes: #157004). + * Add versioned expect build dependency. + * Tighten binutils dependency to 2.13.90.0.4. + * debian/patches/arm-tune.dpatch: Increase stack limit for configure. + * 3.2-0pre4 did build gnat-3.2 compilers for all architectures. Build-Depend + on gnat-3.2 now (closes: #156734). + * Remove bashism's in gcj-wrapper (closes: #157982). + * Add -cp and -classpath options to gij(1). Backport from HEAD (#146634). + * Add fastjar documentation. + + -- Matthias Klose Fri, 30 Aug 2002 10:35:00 +0200 + +gcc-3.2 (1:3.2ds0-0pre4) unstable; urgency=low + + * Correct build dependency on gnat-3.1. + + -- Matthias Klose Mon, 12 Aug 2002 01:21:58 +0200 + +gcc-3.2 (1:3.2ds0-0pre3) unstable; urgency=low + + * gcc-3.2 upstream prerelease. + * Disable all configure options, which are standard: + --enable-threads=posix --enable-long-long, --enable-clocale=gnu + + -- Matthias Klose Fri, 9 Aug 2002 21:59:08 +0200 + +gcc-3.2 (1:3.2ds0-0pre2) unstable; urgency=low + + * gcc-3.2 snapshot (CVS 20020802). + * Fix g++-include dir. + * Don't install the locale files (temporarily, until we don't build + gcc-3.1 anymore). + * New package libgcj-common to avoid conflict with classpath package. + + -- Matthias Klose Sat, 3 Aug 2002 09:08:34 +0200 + +gcc-3.2 (1:3.2ds0-0pre1) unstable; urgency=low + + * gcc-3.2 snapshot (CVS 20020729). + + -- Matthias Klose Mon, 29 Jul 2002 20:36:54 +0200 + +gcc-3.1 (1:3.1.1ds3-1) unstable; urgency=low + + * gcc-3.1.1 release. Following this release we will have a gcc-3.2 + release soon, which is gcc-3.1.1 plus some C++ ABI changes. Once + gcc-3.2 hits the archives, gcc-3.1.1 will go away. + * Don't build the sparc64 compiler. The packaging/patches are + currently broken. + * Add missing headers on m68k and powerpc. + * Install libgcc_s_nof on powerpc. + * Install libffi's copyright and doc files (closes: #152198). + * Remove dangling symlink (closes: #149002). + * libgcj3: Add a conflict to the classpath package (closes: #148664). + * README.C++: Fix URLs. + * libstdc++-dbg: Install into /usr/lib/debug, document it. + * backport-java-6865.dpatch: backport from HEAD. + * Fix typo in gcj docs (closes: #148890). + * Change libstdc++ include dir: /usr/include/c++/3.1. + * libstdc++-codecvt.dpatch: New patch (closes: #149776). + * Build libstdc++-pic package. + * Move 64bit libgcc in its own package libgcc1-64 (closes: #147249). + * Tighten glibc dependency. + + -- Matthias Klose Mon, 29 Jul 2002 00:34:49 +0200 + +gcc-3.1 (1:3.1.1ds2-0pre3) unstable; urgency=low + + * Updated to CVS 2002-06-06 (gcc-3_1-branch). + * Updated s390-java patch (Gerhard Tonn). + * Don't use -O in STAGE1_FLAGS on m68k. + * Fix `-classpath' option in gcj-wrapper script (closes: #150142). + * Remove g++-cxa-atexit patch, use --enable-__cxa_atexit configure option. + + -- Matthias Klose Wed, 3 Jul 2002 23:52:58 +0200 + +gcc-3.1 (1:3.1.1ds1-0pre2) unstable; urgency=low + + * Updated to CVS 2002-06-06 (gcc-3_1-branch), fixing an ObjC regression. + * Welcome m68k to bootstrap land (thanks to Andreas Schwab). + * Add javac wrapper for gcj-3.1 (Michael Koch). + * Remove dangling symlink in /usr/share/doc/gcc-3.1 (closes: #149002). + + -- Matthias Klose Fri, 7 Jun 2002 00:26:05 +0200 + +gcc-3.1 (1:3.1.1ds0-0pre1) unstable; urgency=low + + * Updated to CVS 2002-05-31 (gcc-3_1-branch). + * Change priorities from fastjar and gij-wrapper-3.1 from 30 to 31. + * Update arm-tune patch. + * Install xmmintrin.h header on i386 (closes: #148181). + * Install altivec.h header on powerpc. + * Call correct gij in gij-wrapper (closes: #148662, #148682). + + -- Matthias Klose Wed, 29 May 2002 22:47:40 +0200 + +gcc-3.1 (1:3.1ds2-2) unstable; urgency=low + + * Tighten binutils dependency. + * Fix libstdc include dir for multilibs (Dan Jacobowitz). + + -- Matthias Klose Tue, 21 May 2002 08:03:49 +0200 + +gcc-3.1 (1:3.1ds2-1) unstable; urgency=low + + * GCC 3.1 release. + * Ada cannot be built by the autobuilders for the first time. Do it by hand. + gnatgcc and gnatbind need to be in the PATH. + * Build with CC=gnatgcc, when building the Ada compiler. + * Hurd fixes. + * Don't build the sparc64 compiler; the hack isn't up to date and glibc + isn't converted to use /lib64 and /usr/lib64. + * m68k-linux shows bootstrap comparision failures. If you want to build + the compiler anyway and ignore the bootstrap comparision failure, edit + debian/rules.patch and uncomment the patch to ignore the failure. See + /usr/share/doc/gcc-3.1/BOOTSTRAP_COMPARISION_FAILURE for the differences. + + -- Matthias Klose Wed, 15 May 2002 09:53:00 +0200 + +gcc-3.1 (1:3.1ds1-0pre6) unstable; urgency=low + + * Build from the "final prerelease" tarball (gcc-3.1-20020508.tar.gz). + * Build gnat-3.1-doc package. + * Build fastjar package without building java packages. + * Hurd fixes. + * Updated sparc64-build patch. + * Add s390-ada patch (Gerhard Tonn). + * Undo the dwarf2 support for hppa from -0pre5. + + -- Matthias Klose Thu, 9 May 2002 17:21:09 +0200 + +gcc-3.1 (1:3.1ds0-0pre5) unstable; urgency=low + + * Use /usr/include/g++-v3-3.1 as C++ include dir. + * Update s390-java patch (Gerhard Tonn). + * Tighten binutils dependency (gas patch for m68k-linux). + * Use gnat-3.1 as the gnat package name (as found in gcc/ada/gnatvsn.ads). + * dwarf2 support hppa: a snapshot of the gcc/config/pa directory + from the trunk dated 2002-05-02. + + -- Matthias Klose Fri, 3 May 2002 22:51:37 +0200 + +gcc-3.1 (1:3.1ds0-0pre4) unstable; urgency=low + + * Use gnat-5.00w as the gnat package name (as found in gcc/ada/gnatvsn.ads). + * Don't build the shared libgnat library. It assumes an existing shared + libiberty library. + * Don't install the libgcjgc library. + + -- Matthias Klose Thu, 25 Apr 2002 08:48:04 +0200 + +gcc-3.1 (1:3.1ds0-0pre3) unstable; urgency=low + + * Build fastjar on all architectures. + * Update m68k patches. + * Update s390-java patch (Gerhard Tonn). + + -- Matthias Klose Sun, 14 Apr 2002 15:34:47 +0200 + +gcc-3.1 (1:3.1ds0-0pre2) unstable; urgency=low + + * Add Ada support. To successfully build, a working gnatbind and gcc + driver with Ada support is needed. + * Apply needed arm patches from 3.0.4. + + -- Matthias Klose Sat, 6 Apr 2002 13:17:08 +0200 + +gcc-3.1 (1:3.1ds0-0pre1) unstable; urgency=low + + * First try for gcc-3.1. + + -- Matthias Klose Mon, 1 Apr 2002 23:39:30 +0200 + +gcc-3.0 (1:3.0.4ds3-6) unstable; urgency=medium + + * Second try at fixing sparc build problems. + + -- Phil Blundell Sun, 24 Mar 2002 14:49:26 +0000 + +gcc-3.0 (1:3.0.4ds3-5) unstable; urgency=medium + + * Enable java on ARM. + * Create missing directory to fix sparc build. + + -- Phil Blundell Fri, 22 Mar 2002 20:21:59 +0000 + +gcc-3.0 (1:3.0.4ds3-4) unstable; urgency=low + + * Link with system zlib (closes: #136359). + + -- Matthias Klose Tue, 12 Mar 2002 20:47:59 +0100 + +gcc-3.0 (1:3.0.4ds3-3) unstable; urgency=low + + * Build libf2c (pic and non-pic) with -mieee on alpha-linux. + + -- Matthias Klose Sun, 10 Mar 2002 00:37:24 +0100 + +gcc-3.0 (1:3.0.4ds3-2) unstable; urgency=medium + + * Apply hppa-build patch (Randolph Chung). Closes: #136731. + * Make libgcc1 conflict/replace with libgcc1-sparc64. Closes: #135709. + * gij-3.0 provides the `java' command. Closes: #128947. + * Depend on binutils (>= 2.11.93.0.2-2), allows stripping of libgcj.a + again. Closes: #99307. + * Update README.cross pointing to the README of the toolchain-source + package. + + -- Matthias Klose Wed, 6 Mar 2002 21:53:34 +0100 + +gcc-3.0 (1:3.0.4ds3-1) unstable; urgency=low + + * Final gcc-3.0.4 release. + * debian/rules.d/binary-java.mk: Fix dormant typo, exposed by removing the + duplicate libgcj dependency and adding the gij-3.0 package. + Closes: #134005. + * New patch by Phil Blundell to fix scalapack build error on m68k. + + -- Matthias Klose Wed, 20 Feb 2002 23:59:43 +0100 + +gcc-3.0 (1:3.0.4ds2-0pre020210) unstable; urgency=low + + * Make the base package dependent on the binary-arch target. Closes: #133433. + * Get libstdc++ on arm woring (define _GNU_SOURCE). Closes: #133435. + + -- Matthias Klose Mon, 11 Feb 2002 20:31:12 +0100 + +gcc-3.0 (1:3.0.4ds2-0pre020209) unstable; urgency=high + + * Update to CVS sources (20020209 gcc-3_0-branch). + * Apply patch to fix bootstrap error on arm-linux (submitted upstream + by Phil Blundell). Closes: #130422. + * Make base package architecture any. + * Decouple versioned shlib dependencies from release number for + libobjc as well. + + -- Matthias Klose Sat, 9 Feb 2002 01:30:11 +0100 + +gcc-3.0 (1:3.0.4ds1-0pre020203) unstable; urgency=medium + + * One release critical bug outstanding: + - bootstrap error on arm. + * Update to CVS sources (20020203 gcc-3_0-branch). + * Fixed upstream: PR c/3504: Correct documentation of __alignof__. + Closes: #85445. + * Remove libgcc-powerpc patch, integrated upstream (closes: #131977). + * Tighten binutils build dependency (to address #126162). + * Move jv-convert to gcj package (closes: #131985). + + -- Matthias Klose Sun, 3 Feb 2002 14:47:14 +0100 + +gcc-3.0 (1:3.0.4ds0-0pre020127) unstable; urgency=low + + * Two release critical bugs outstanding: + - bootstrap error on arm. + - bus errors for C++ and java executables on sparc (see the testsuite + results). + * Update to CVS sources (20020125 gcc-3_0-branch). + * Enable java support for s390 architecture (patch from Gerhard Tonn). + * Updated NEWS file for 3.0.3. + * Disable building the gcc-sparc64, but build a multilibbed compiler + for sparc as the default. + * Disabled the subreg-byte patch for sparc (request from Ben Collins). + * Fixed reference to libgcc1 package in README (closes: #126218). + * Do recommend libc-dev, not depend on it. For low-end or embedded systems + the dependency on libc-dev can make the difference between + having enough or having too little space to build a kernel. + * README.cross: Updated by Hakan Ardo. + * Decouple versioned shlib dependencies from release number. Closes: #118391. + * Fix diversions for gcc-3.0-sparc64 package (closes: #128178), + unconditionally remove `sparc64-linux-gcc' alternative. + * g77/README.libg2c.Debian: New file mentioning `libg2c-pic'. The next + g77 version (3.1) does build a static and shared library (closes: #104250). + * Fix formatting errors in the synopsis of the java man pages. Maybe the + reason for #127571. Closes: #127571. + * fastjar: Fail for the (currently incorrect) -u option. Addresses: #116145. + Add alternative for `jar' using priority 30 (closes: #118648). + * jv-convert: Add --help option and man page. Backport from HEAD branch. + * libgcj2-dev: Remove duplicate dependency (closes: #127805). + * Giving up and make just another new package gij-X.Y with only the gij-X.Y + binary for policy conformance (closes: #127111). + * gij: Provides an alternative for `java' (priority 30) using a wrapper + script (Stephen Zander) (closes: #128974). Added simple manpage. + + -- Matthias Klose Sun, 27 Jan 2002 13:33:41 +0100 + +gcc-3.0 (1:3.0.3ds3-1) unstable; urgency=low + + * Final gcc-3.0.3 release. + * Do not compress .txt files in libstdc++ docs referenced from html + pages (closes: #124136). + * libstdc++-dev suggests libstdc++-doc. + * debian/patches/gcc-ia64-NaT.dpatch: Update (closes: #123685). + + -- Matthias Klose Fri, 21 Dec 2001 02:54:11 +0100 + +gcc-3.0 (1:3.0.3ds2-0pre011215) unstable; urgency=low + + * Update to CVS sources (011215). + * libstdc++ documentation updated upstream (closes: #123790). + * debian/patches/gcc-ia64-NaT.dpatch: Disable. Fixes bootstrap error + on ia64 (#123685). + + -- Matthias Klose Sat, 15 Dec 2001 14:43:21 +0100 + +gcc-3.0 (1:3.0.3ds1-0pre011210) unstable; urgency=medium + + * Update to CVS sources (011208). + * Supposed to fix powerpc build error (closes: #123155). + + -- Matthias Klose Thu, 13 Dec 2001 07:26:05 +0100 + +gcc-3.0 (1:3.0.3ds0-0pre011209) unstable; urgency=medium + + * Update to CVS sources (011208). Frozen for upstream 3.0.3 release. + * Apply contrib/PR3145.patch, a backport of Nathan Sidwell's patch to + fix PR c++/3145, the infamous "virtual inheritance" bug. This affected + especially KDE2 (eg. artsd). Franz Sirl + * cc1plus segfault in strength reduction fixed upstream. Closes: #122547. + * debian/patches/gcc-ia64-NaT.dpatch: Add patch to avoid a bug that can + cause miscompiled userapps to crash the kernel. Closes: #121924. + * Reenable shared libgcc for powerpc. Fixed upstream. + http://gcc.gnu.org/ml/gcc-patches/2001-11/msg00340.html + debian/patches/libgcc-powerpc.dpatch: New patch. + * Add upstream changelogs. + * Remove gij alternative. Move to gij package. + + -- Matthias Klose Sun, 9 Dec 2001 09:36:48 +0100 + +gcc-3.0 (1:3.0.2ds4-4) unstable; urgency=medium + + * Disable building of libffi on mips and mipsel. + (closes: #117503). + * Enable building of shared libgcc on s390 + (closes: #120452). + + -- Christopher C. Chimelis Sat, 1 Dec 2001 06:15:29 -0500 + +gcc-3.0 (1:3.0.2ds4-3) unstable; urgency=medium + + * Fix logic to build libffi without java (closes: #117503). + + -- Matthias Klose Sun, 4 Nov 2001 14:34:50 +0100 + +gcc-3.0 (1:3.0.2ds4-2) unstable; urgency=medium + + * Enable java for ia64 (Jeff Licquia). Closes: #116798. + * Allow building of libffi without gcj (Jeff Licquia). + New libffi packages for arm hurd-i386 mips mipsel, + still missing: hppa, s390. + * debian/NEWS.gcc: Add 3.0.2 release notes. + * debian/patches/hppa-align.dpatch: New patch from Alan Modra, + submitted by Randolph Tausq. + + -- Matthias Klose Thu, 25 Oct 2001 23:59:31 +0200 + +gcc-3.0 (1:3.0.2ds4-1) unstable; urgency=medium + + * Final gcc-3.0.2 release. The source tarball is not the released + tarball, but taken from CVS 011024). + * Remove patch for s390, included upstream. + + -- Matthias Klose Wed, 24 Oct 2001 00:49:40 +0200 + +gcc-3.0 (1:3.0.2ds3-0pre011014) unstable; urgency=low + + * Update to CVS sources (011014). Frozen for upstream 3.0.2 release. + Closes: #109351, #114099, #114216, #105741 (allegro3938). + * Added debian/patches/fastjar.dpatch, which makes fastjar extract + filenames correctly (previously, some had incorrect names on extract). + Closes: #113236. + * Priorities fixed in the past (closes: #94404). + + -- Matthias Klose Sun, 14 Oct 2001 13:19:43 +0200 + +gcc-3.0 (1:3.0.2ds2-0pre010923) unstable; urgency=low + + * Bootstraps on powerpc again (closes: #112777). + + -- Matthias Klose Sun, 23 Sep 2001 01:32:11 +0200 + +gcc-3.0 (1:3.0.2ds2-0pre010922) unstable; urgency=low + + * Update to CVS sources (010922). + * Fixed upstream (closes: #111801). #105569 on hppa. + * Update hppa patch (Matt Taggart). + * Fix libstdc++-dev package description (closes: #112758). + * debian/rules.d/binary-objc.mk: Fix build error (closes: #112462). + * Make gobjc-3.0 conflict with gcc-3.0-sparc64 (closes: #111772). + + -- Matthias Klose Sat, 22 Sep 2001 09:34:49 +0200 + +gcc-3.0 (1:3.0.2ds1-0pre010908) unstable; urgency=low + + * Update to CVS sources (010908). + * Update hppa patch (Matt Taggart). + * Depend on libgc6-dev, not libgc5-dev, which got obsolete (during + the freeze ...). However adds s390 support (closes: #110189). + * debian/patches/m68k-reload.dpatch: New patch (Roman Zippel). + Fixes #89023. + * debian/patches/gcc-sparc.dpatch: New patch ("David S. Miller"). + Fixes libstdc++ testsuite failures on sparc. + + -- Matthias Klose Sat, 8 Sep 2001 14:26:20 +0200 + +gcc-3.0 (1:3.0.2ds0-0pre010826) unstable; urgency=low + + * gcc-3.0-nof: Fix symlink to gcc-3.0-base doc directory. + * debian/patches/gcj-without-rpath: New patch. + * Remove self dependency on libgcj package. + * Handle diversions for upgrades from 3.0 and 3.0.1 -> 3.0.2 + in gcc-3.0-sparc64 package. + * Build libg2c.a with -fPIC -DPIC and name the result libg2c-pic.a. + Link with this library to avoid linking with non-pic code. + Use this library when building dynamically loadable objects (python + modules, gimp plugins, ...), which need to be linked against g2c or + a library which is linked against g2c (i.e. lapack). + Packages needing '-lg2c-pic' must have a build dependency on + 'g77-3.0 (>= 1:3.0.2-0pre010826). + + -- Matthias Klose Sun, 26 Aug 2001 13:59:03 +0200 + +gcc-3.0 (1:3.0.2ds0-0pre010825) unstable; urgency=low + + * Update to CVS sources (010825). + * Add libc6-dev-sparc64 to gcc-3.0-sparc64 and to sparc build dependencies. + * Remove conflicts on egcc package (closes: #109718). + * Fix gcc-3.0-nof dependency. + * s390 patches against gcc-3.0.1 (Gerhard Tonn). + * debian/control: Require binutils (>= 2.11.90.0.27) + + -- Matthias Klose Sat, 25 Aug 2001 10:59:15 +0200 + +gcc-3.0 (1:3.0.1ds3-1) unstable; urgency=low + + * Final gcc-3.0.1 release. + * Changed upstream: default of -flimit-inline is 600 (closes: #106716). + * Add fastjar man page (submitted by "The Missing Man Pages Project", + http://www.netmeister.org/misc/m2p2i/) (closes: #103051). + * Fixed in last upload as well: #105246. + * debian/patches/cpp-memory-leak.dpatch: New patch + * Disable installation of shared libgcc on s390 (Gerhard Tonn). + + -- Matthias Klose Mon, 20 Aug 2001 20:47:13 +0200 + +gcc-3.0 (1:3.0.1ds2-0pre010811) unstable; urgency=high + + * Update to CVS sources (010811). Includes s390 support. + * Add xlibs-dev to Build-Depends (libgcj). + * Enable java for powerpc, disable java for ia64. + * Enable ObjC garbage collection for all archs, which have a libgc5-dev + package. + * New patch libstdc++-codecvt (Michael Piefel) (closes: #104614). + * Don't strip static libgcj library (work around binutils bug #107812). + * Handle diversions for upgrade 3.0 -> 3.0.1 in gcc-3.0-sparc64 package + (closes: #107569). + + -- Matthias Klose Sat, 11 Aug 2001 20:42:15 +0200 + +gcc-3.0 (1:3.0.1ds1-0pre010801) unstable; urgency=high + + * Update to CVS sources (010801). (closes: #107012). + * Remove build dependency on non-free graphviz and include pregenerated + docs (closes: #107124). + * Fixed in 3.0.1 (closes: #99307). + * Updated m68k-updates patch (Roman Zippel). + * Another fix for ia64 packaging bits (Randolph Chung). + + -- Matthias Klose Tue, 31 Jul 2001 21:52:55 +0200 + +gcc-3.0 (1:3.0.1ds0-0pre010727) unstable; urgency=high + + * Update to CVS sources (010727). + * Add epoch to source version. Change '.dsx' to 'dsx', so that + 3.1.1ds0 gt 3.1ds7 (closes: #106538). + + -- Matthias Klose Sat, 28 Jul 2001 09:56:29 +0200 + +gcc-3.0 (3.0.1.ds0-0pre010723) unstable; urgency=high + + * ia64 packaging bits (Randolph Chung) (closes: #106252). + + -- Matthias Klose Mon, 23 Jul 2001 23:02:03 +0200 + +gcc-3.0 (3.0.1.ds0-0pre010721) unstable; urgency=high + + * Update to CVS sources (010721). + - Remove patches applied upstream: libstdc++-limits.dpatch, + objc-data-references + - Updated other patches. + * Fix gij alternative (closes: #103468, #103883). + * Patch to fix bootstrap on sparc (closes: #103568). + * Corrected (closes: #105371) and updated README.Debian. + * m68k patches for sucessful bootstrap (Roman Zippel). + * Add libstdc++v3 porting hints to README.Debian and README.C++. + * m68k md fix (#105622) (Roman Zippel). + * debian/rules2: Disable non-functional ulimit on Hurd (#105884). + * debian/control: Require binutils (>= 2.11.90.0.24) + * Java is enabled for alpha (closes: #87300). + + -- Matthias Klose Sun, 22 Jul 2001 08:24:04 +0200 + +gcc-3.0 (3.0.ds9-4) unstable; urgency=high + + * Move this version to testing ASAP. testing still has a prerelease + version with now incompatible ABI's. If sparc doesn't build, + then IMHO it's better to remove it from testing. + * debian/control.m4: Set uploaders field. Adjust description of + gcc-3.0 (binary) package (closes: #102271, #102620). + * Separate gij.1 in it's own pseudo man page (closes: #99523). + * debian/patches/java-manpages.dpatch: New patch. + * libgcj: Install unversioned gij. + + -- Matthias Klose Tue, 3 Jul 2001 07:38:08 +0200 + +gcc-3.0 (3.0.ds9-3) unstable; urgency=high + + * Reenable configuration with posix threads on i386 (lost in hurd-i386 + merge). + + -- Matthias Klose Sun, 24 Jun 2001 22:21:45 +0200 + +gcc-3.0 (3.0.ds9-2) unstable; urgency=medium + + * Move this version to testing ASAP. testing still has a prerelease + version with now incompatible ABI's. + * Add libgcc0 and libgcc300 to the build conflicts (#102041). + * debian/README.FIRST: Removed (#101534). + * Updated subreg-byte patch (doc files). + * Disable java for the Hurd, mips and mipsel (#101570). + * Patch for building on the Hurd (#101708) (Jeff Bailey ). + * Packaging fixes for the Hurd (#101711) (Jeff Bailey ). + * Include pregenerated doxygen (1.2.6) docs for libstdc++-v3 (#101557). + The current doxygen-1.2.8.1 segaults. + * C++: Enable -fuse-cxa-atexit by default (#101901). + * Correct mail address in gccbug (#101743). + * Make rules resumable after failure in binary-xxx targets (#101637). + + -- Matthias Klose Sun, 24 Jun 2001 16:04:53 +0200 + +gcc-3.0 (3.0.ds9-1) unstable; urgency=low + + * Final 3.0 release. + * Update libgcc version number (#100983, #100988, #101069, #101115, #101328). + * Updated hppa-build patch (Matt Taggart ). + * Disable java for hppa. + * Updated subreg-byte patch for sparc (Ben Collins). + + -- Matthias Klose Mon, 18 Jun 2001 18:26:04 +0200 + +gcc-3.0 (3.0.ds8-0pre010613) unstable; urgency=low + + * Update patches for recent (010613 23:13 +0200) CVS sources. + * Fix packaging bugs (#100459, #100447, #100483). + * Build-Depend on gawk, mawk doesn't work well with test_summary. + + -- Matthias Klose Wed, 13 Jun 2001 23:13:38 +0200 + +gcc-3.0 (3.0.ds7-0pre010609) unstable; urgency=low + + * Fix build dependency for the hurd (#99164). + * Update patches for recent (010609) CVS sources. + * Disable java on powerpc (link error in libjava). + * gcc-3.0-base.postinst: Don't prompt for non-interactive installs (#100110). + + -- Matthias Klose Sun, 10 Jun 2001 09:45:57 +0200 + +gcc-3.0 (3.0.ds6-0pre010526) unstable; urgency=high + + * Urgency "high" for replacing the gcc-3.0 snapshots in testing, which + now are incompatile due to the changed ABIs. + * Upstream begins tagging with "gcc-3_0_pre_2001mmdd". + * Tighten dependencies to install only binary packages derived from + one source (#98851). Tighten libc6-dev dependency to match libc6. + + -- Matthias Klose Sun, 27 May 2001 11:35:31 +0200 + +gcc-3.0 (3.0.ds6-0pre010525) unstable; urgency=low + + * ATTENTION: The ABI (exception handling) changed. No upgrade path from + earlier snapshots (you had been warned in the postinst ...) + Closing #93597, #94576, #96448, #96461. + You have to rebuild + * HELP is appreciated for scanning the Debian BTS and sending followups + to bug reports!!! + * Should we name debian gcc uploads? What about a "still seeking + g++ maintainer" upload? + * Fixed in gcc-3.0: #97030 + * Update patches for recent (010525) CVS sources. + * Make check depend on build target (fakeroot problmes). + * debian/rules.d/binary-libgcc.mk: new file, build first. + * Free memory detection on the hurd for running the testsuite. + * Update debhelper build dependency. + * libstdc++-doc: Include doxygen generated docs. + * Fix boring packaging bugs, too tired for appropriate changelogs ... + #93343, #96348, #96262, #97134, #97905, #96451, #95812, #93157 + * Fixed bugs: #87000. + + -- Matthias Klose Sat, 26 May 2001 23:10:42 +0200 + +gcc-3.0 (3.0.ds5-0pre010510) unstable; urgency=low + + * Update patches for recent (010506) CVS sources. + * New version of source, as of 2001-05-10 + * New version of gpc source, as of 2001-05-06 (disabled by default). + * Make gcc-3.0-sparc64 provide an alternative for sparc64-linux-gcc, + since it can build kernels just fine (it seems) + * Add hppa patch from Matt Taggart + * Fix objc info inclusion...now merged with gcc info + * Do not install the .la for libstdc++, since it confuses libtool linked + applications when libstdc++3-dev and libstdc++2.10-dev are both + installed (closes #97905). + * Fixed gcc-base and libgcc section/prio to match overrides + + -- Ben Collins Mon, 7 May 2001 00:08:52 +0200 + +gcc-3.0 (3.0.ds5-0pre010427) unstable; urgency=low + + * Fixed priority for fastjar from optional to extra + * New version of source, as of 2001-04-27 + * Fix description of libgcj-dev + * libffi-install: Make libffi installable + * Add libffi and libffi-dev packages. libffi is only enabled for java + targets right now. Perhaps more will be enabled later. + * Fixes to build cross compiler package (for avr) + (Hakan Ardo ). + * Better fixincludes description (#93157). + * Remove all remnants of libg++ + * Remove all hacks around libstdc++ version. Since we are strictly v3 now, + we can treat it like a normal shared lib, and not worry about all those + ABI changes. + * Remove all cruft control scripts. Note, debhelper will create scripts + that it needs to. It will do the doc link stuff and the ldconfig stuff + explicitly. + * Clean up the SONAME parsing stuff, make it a little more cleaner over + all the lib packages + * Make libffi install when built (IOW, whenever java is enabled). This + should obsolete the libffi package, which is old and broken + * Revert to normal sonames, except for ia64 (for now) + * Remove all references to dh_testversion, since they are deprecated for + Build-Depends + * Fix powerpc nof build + * Remove all references to the MULTILIB stuff, since the arches are + using specialized builds anyway (nof, softfloat). + * Added 64bit sparc64 package (gcc-3.0-sparc64, libgcc0-sparc64) + * Removed obsolete shlibs.local file + + -- Ben Collins Sun, 15 Apr 2001 21:33:15 -0400 + +gcc-3.0 (3.0.ds4-0pre010403) unstable; urgency=low + + * debian/README: Updated for gcc-3.0 + * debian/rules.patch: Added subreg-byte patch for sparc + * debian/rules.unpack: Update to current CVS for gcc tarball name + * debian/patches/subreg-byte.dpatch: sparc subreg-byte support + * debian/patches/gcc-rawhide.dpatch: Removed + debian/patches/gpc-2.95.dpatch: Removed + debian/patches/sparc32-rfi.dpatch: Removed + debian/patches/temporary.dpatch: Removed + * Moving to unstable now + * debian/patches/gcc-ppc-disable-shared-libgcc.dpatch: New patch, + disables shared libgcc for powerpc target, since it isn't compatible + with the EABI objects. + * Create $(with_shared_libgcc) var + * debian/rules.d/binary-gcc.mk: Use this new variable to determine if + the libgcc package actually has any files + + -- Ben Collins Tue, 3 Apr 2001 23:00:55 -0400 + +gcc-3.0 (3.0.ds2-0pre010223) experimental; urgency=low + + * New snapshot. Use distinct shared object names for shared libraries: + we don't know if binary API's still change until the final release. + * Versioned package names. + * debian/control.m4: New file. Add gcc-base, libgcc0, libobjc1, + libstdc++-doc, libgcj1, libgcj1-dev, fastjar, fixincludes packages. + Remove gcc-docs package. + * debian/gcov.1: Remove. + * debian/*: Remove 2.95.x support. Prepare for 3.0. + * debian/patches: Remove 2.95.x patches. + * Changed source package name. It's not allowed anymore to overwrite + source packages with different content. Introducing a 'debian source + element' (.ds), which is stripped again from the version number + for the binary packages. + * Fixed bugs and added functionality: + #26436, #27878, #33786, #34876, #35477, #42662, #46181, #42989, + #47981, #48530, #50529, #51227, #51456, #51651, #52382, #53698, + #55291, #55967, #56867, #58219, #59005, #59232, #59776, #64628, + #65687, #67631, #68632, #68963, #68987, #69530, #72933, #75120, + #75759, #76645, #76827, #83221, #87540 + * libgcj fixes: 42894, #51266, #68560, #71187, #79984 + + -- Matthias Klose Sat, 24 Feb 2001 13:41:11 +0100 + +gcc-2.95 (2.95.3-2.001222) experimental; urgency=low + + * New upstream version 2.95.3 experimental (CVS 20001222). + * debian/control.in: Versioned package names, removal of snapshot logic. + Remove fake gcc-docs package. + * Reserve -1 release numbers for woody. + * Updated to gpc-20001218. + + -- Matthias Klose Fri, 22 Dec 2000 19:53:03 +0100 + +gcc (2.95.2-20) unstable; urgency=low + + * Apply patch from gcc-2_95-branch; remove ulimit for make check. + + -- Matthias Klose Sun, 10 Dec 2000 17:01:13 +0100 + +gcc (2.95.2-19) unstable; urgency=low + + * Added testsuite-20001207 from current snapshots. We'll need results + for 2.95.2 to make sure there are no regressions against that release. + Dear build daemons and porters to other architectures, please send an + email to gcc-testresults@gcc.gnu.org. + You can do this by running "debian/rules mail-summary". + * Updated to gpc-20001206. + * Added S/390 patch prepared by Chu-yeon Park (#78983). + * debian/patches/libio.dpatch: Fix iostream doc (fixes #77647). + * debian/patches/gcc-doc.dpatch: Update URL (fixes #77542). + * debian/patches/gcc-reload1.dpatch Patch from the gcc-bug list which + fixes a problem in "long long" on i[345]86 (i686 was not affected). + + -- Matthias Klose Sat, 9 Dec 2000 12:30:32 +0100 + +gcc (2.95.2-18) unstable; urgency=low + + * debian/control.in: Fix syntax errors (fixes #76146, #76458). + Disable gpc on the hurd by request (#75686). + * debian/patches/arm-various.dpatch: Patches from Philip Blundell + for ARM arch (fixes #75801). + * debian/patches/gcc-alpha-mi-thunk.dpatch: Patches from Chris Chimelis + for alpha arch. + * debian/patches/g77-docs.dpatch: Adjust g77 docs (fixes #72594). + * Update gpc to gpc-20001118. + * Reenable gpc for alpha. + * debian/README.C++: Merge debian/README.libstdc++ and C++ FAQ information + provided by Matt Zimmermann. + * Build gcj only on architectures, where libgcj-2.95.1 can be built as well. + Probably needs some adjustments ... + * Conditionalize for chill, fortran, java, objc and chill. + + * NOT APPLIED: + debian/patches/libstdc++-bastring.dpatch: Apply fix (fixes #75759). + + -- Matthias Klose Sun, 19 Nov 2000 10:40:41 +0100 + +gcc (2.95.2-17) unstable; urgency=low + + * Disable gpc for alpha. + * Include gpc-cpp in gpc package (fixes #74492). + * Don't build gcc-docs compatibility package anymore. + + -- Matthias Klose Wed, 11 Oct 2000 06:16:53 +0200 + +gcc (2.95.2-16) unstable; urgency=low + + * Applied the emdebian/cross compiler patch and documentation + (Frank Smith ). + * Applied patch for avr target (Hakan Ardo ). + * debian/control.in: Add awk to Build-Depends. + Tighten libc6-dev dependency for libstdc++-dev (fixes #73031, + #72531, #72534). + * Disable libobjc_gc for m68k again (fixes #74380). + * debian/patches/arm-namespace.dpatch: Apply patch from Philip + Blundell to fix name space pollution on arm + (fixes #70937). + * Fix more warnings in STL headers (fixes #69352, #71943). + + -- Matthias Klose Mon, 9 Oct 2000 21:51:41 +0200 + +gcc (2.95.2-15) unstable; urgency=low + + * debian/control.in: Add libgc5-dev to build depends (fixes #67015). + * debian/rules.def: Build GC enabled ObjC runtime for sparc. + * Bug #58741 fixed (in some version since 2.95.2-5). + * debian/control.in: Recommend librx1g-dev, libgmp2-dev, libncurses5-dev + (unit dependencies). + * Patches from Marcus Brinkmann for the hurd (fixes #67763): + - debian/rules.defs: Disable objc_gc on hurd-i386. + Disable libg++ on GNU systems. + - debian/rules2: Set correct names of libstdc++/libg++ + libraries on GNU systems. + Write out correct shlibs and shlibs.local file content. + - Keep _G_config.h for the Hurd. + * Apply patch for ObjC linker warnings. + * Don't apply gcj backport patch for sparc. + * Apply libio compatability patch + * debian/glibcver.sh: generate appropriate version for glibc + * debian/rules.conf: for everything after glibc 2.1, we always append + "-glibc$(ver)" to the C++ libs for linux. + * Back down gpc to -13 version (-14 wont compile on anything but i386 + and m68k becuase of gpc). + * Remove extraneous and obsolete sparc64 patches/files from debian/* + + -- Ben Collins Thu, 21 Sep 2000 08:08:35 -0400 + +gcc-snapshot (20000901-2.2) experimental; urgency=low + + * New snapshot. + * debian/rules2: Move tradcpp0 to cpp package. + + -- Matthias Klose Sat, 2 Sep 2000 01:14:28 +0200 + +gcc-snapshot (20000802-2.1) experimental; urgency=low + + * New snapshot. + * debian/rules2: Fixes. tradcpp0 is in gcc package, not cpp. + + -- Matthias Klose Thu, 3 Aug 2000 07:40:05 +0200 + +gcc-snapshot (20000720-2) experimental; urgency=low + + * New snapshot. + * Enable libstdc++-v3. + * debian/rules2: Don't use -D for /usr/bin/install. + + -- Matthias Klose Thu, 20 Jul 2000 22:33:37 +0200 + +gcc (2.95.2-14) unstable; urgency=low + + * Update gpc patch. + + -- Matthias Klose Wed, 5 Jul 2000 20:51:16 +0200 + +gcc (2.95.2-13) frozen unstable; urgency=low + + * Update debian/README: document how to compile 2.0.xx kernels; don't + register gcc272 as an alternative for gcc (closes #62419). + Clarify compiler setup (closes #65548). + * debian/control.in: Make libstdc++-dev depend on current version of g++. + * Undo CVS update from release -8 (problems on alpha, #55263). + + -- Matthias Klose Mon, 19 Jun 2000 23:06:48 +0200 + +gcc (2.95.2-12) frozen unstable; urgency=low + + * debian/gpc.postinst: Correct typo introduced with -11 (fixes #64193). + * debian/patches/gcc-rs600.dpatch: ppc codegen fix (fixes #63933). + + -- Matthias Klose Sun, 21 May 2000 15:56:05 +0200 + +gcc (2.95.2-11) frozen unstable; urgency=medium + + * Upload to unstable again (fixes critical #63784). + * Fix doc-base files (fixes important #63810). + * gpc wasn't built in -10 (fixes #63977). + * Make /usr/bin/pc an alternative (fixes #63888). + * Add SYSCALLS.c.X to gcc package. + + -- Matthias Klose Sun, 14 May 2000 22:17:44 +0200 + +gcc (2.95.2-10) frozen; urgency=low + + * debian/control.in: make gcc conflict on any version of egcc + (slink to potato upgrade problem, fixes grave #62084). + * Build protoize programs, separate out in new package (fixes #59436, + #62911). + * Create dummy gcc-docs package for smooth update from slink (fixes #62537). + * Add doc-base support for all -doc packages (fixes #63380). + + -- Matthias Klose Mon, 1 May 2000 22:24:28 +0200 + +gcc (2.95.2-9) frozen unstable; urgency=low + + * Disable the sparc-bi-arch.dpatch (patch from Ben Collins, built + for sparc as NMU 8.1) (fixes critical #61529 and #61511). + "Seems that when you compile gcc 2.95.x for sparc64-linux and compile + sparc32 programs, the code is not the same as sparc-linux compile for + sparc32 (this is a bug, and is fixed in gcc 2.96 CVS)." + * debian/patches/gcj-vs-iconv.dpatch: Option '--encoding' for + encoding of input files. Patch from Tom Tromey + backported to 2.95.2 (fixes #42895). + Compile a Latin-1 encoded file with `gcj --encoding=Latin1 ...'. + * debian/control.in: gcc, g++ and gobjc suggest their corresponding + task packages (fixes #59623). + + -- Matthias Klose Sat, 8 Apr 2000 20:19:15 +0200 + +gcc (2.95.2-8) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000313. + * debian/rules2: configure with --enable-java-gc=no for sparc. Fixes + gcj side of #60535. + * debian/rules.patch: Disable gcc-emit-rtl patch for all archs but + alpha. Disable g++-is-tree patch ("just for 2.95.1"). + * debian/README: Update for gcc-2.95. + + -- Matthias Klose Mon, 27 Mar 2000 00:03:16 +0200 + +gcc (2.95.2-7) frozen unstable; urgency=low + + * debian/patches/gcc-empty-struct-init.dpatch; Apply patch from + http://gcc.gnu.org/ml/gcc-patches/2000-02/msg00637.html. Fixes + compilation of 2.3.4x kernels. + * debian/patches/gcc-emit-rtl.dpatch: Apply patch from David Huggins-Daines + (backport from 2.96 CVS to fix #55263). + * debian/patches/gcc-pointer-arith.dpatch: Apply patch from Jim Kingdon + (backport from 2.96 CVS to fix #54951). + + -- Matthias Klose Thu, 2 Mar 2000 23:16:43 +0100 + +gcc (2.95.2-6) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000220. + * Remove dangling symlink probably left over from libstdc++2.9 + package (fixes #53661). + * debian/patches/gcc-alpha-complex-float.dpatch: Fixed patch by + David Huggins-Daines (fixes #58486). + * debian/g++.{postinst,prerm}: Remove outdated g++FAQ registration + (fixes #58253). + * debian/control.in: gcc-doc replaces gcc-docs (fixes #58108). + * debian/rules2: Include some fixed headers (asm, bits, linux, ...). + * debian/patches/{gcc-alpha-ev5-fix,libstdc++-valarray}.dpatch: Remove. + Applied upstream. + * debian/patches/libstdc++-bastring.dpatch: Add patch from + sicard@bigruth.solsoft.fr (fixes #56715). + + -- Matthias Klose Sun, 20 Feb 2000 15:08:13 +0100 + +gcc (2.95.2-5) frozen unstable; urgency=low + + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 20000116. + * Add more build dependencies (fixes #53204). + * debian/patches/gcc-alpha-complex-float.dpatch: Patch from + Joel Klecker to compile glibc correctly on alpha. + "Should fix the g77 problems too." + * debian/patches/{libio,libstdc++-wall2}.dpatch. Remove patches + applied upstream. + + -- Matthias Klose Sun, 16 Jan 2000 19:16:54 +0100 + +gcc (2.95.2-4) unstable; urgency=low + + * debian/patches/libio.dpatch: Patch from Martin v. Loewis. + (fixes: #35628). + * debian/patches/libstdc++-deque.dpatch: Patch from Martin v. Loewis. + (fixes: #52689). + * debian/control.in: Updated Build-Depends, removed outdated README.build. + Fixes #51246. + * Tighten dependencies to cpp (>= 2.95.2-4) (closes: #50294). + * debian/rules.patch: Really do not apply patches/gcj-backport.dpatch. + Fixes #51636. + * Apply updated sparc-bi-arch.dpatch from Ben Collins. + * libstdc++: Define wstring type, if __ENABLE_WSTRING is defined. Request + from the author of the War FTP Daemon for Linux ("Jarle Aase" + ). + * debain/g++.preinst: Remove dangling sysmlinks (fixes #52359). + + -- Matthias Klose Sun, 19 Dec 1999 21:53:48 +0100 + +gcc (2.95.2-3) unstable; urgency=low + + * debian/rules2: Don't install $(gcc_lib_dir)/include/asm; these are + headers fixed for glibc-1.x (closes: #49434). + * debian/patches/cpp-dos-newlines.dpatch: Keep CR's without + following LF (closes: #49186). + * Bug #37358 (internal compiler errors when building vdk_0.6.0-5) + fixed in gcc-2.95.? (closes: #37358). + * Apply patch gcc-alpha-ev5-fix from Richard Henderson + (should fix #48527 and #46963). + * debian/README.Bugs: Documented non bug #44554. + * Applied patch from Alexandre Oliva to fix gpc boostrap on alpha. + Reenabled gpc on all architectures. + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 19991108. + * Explicitely generate postinst/prerm chunks for usr/doc transition. + debhelper currently doesn't handle generation for packages with + symlinked directories. + * debian/patches/libstdc++-wall3.dpatch: Fix warnings in stl_deque.h + and stl_rope.h (closes: #46444, #46720). + * debian/patches/gcj-backport.dpatch: Add file, don't apply (yet). + + -- Matthias Klose Wed, 10 Nov 1999 18:58:45 +0100 + +gcc (2.95.2-2) unstable; urgency=low + + * New gpc-19991030 snapshot. + * Post-2.95.2 CVS updates of the gcc-2_95-branch until 19991103. + * Reintegrated sparc patches (bcollins@debian.org), which were lost + in 2.95.2-1. + * debian/rules2: Only install $(gcc_lib_dir)/include/asm, when existing. + * debian/patches/gpc-2.95.{dpatch,diff}: updated patch to drop + initialization in stor-layout.c. + * debian/NEWS.gcc: Updated for gcc-2.95.2. + * debian/bugs/bug-...: Removed testcases for fixed bugs. + * debian/patches/...dpatch: Removed patches applied upstream. + * debian/{rules2,g++.postinst,g++.prerm}: Handle c++ alternative. + * debian/changelog: Merged gcc272, egcs and snapshot changelogs. + + -- Matthias Klose Tue, 2 Nov 1999 23:09:23 +0200 + +gcc (2.95.2-1.1) unstable; urgency=low + + * Most of the powerpc patches have been applied upstream. Remove all + but ppc-ice, ppc-andrew-dwarf-eh, and ppc-descriptions. + * mulilib-install.dpatch was definitely a bad idea. Fix it properly + by using install -D. + * Also, don't make directories before installing any more. Simplifies + rules a (tiny) bit. + * Do not build with LDFLAGS=-s. Everything gets stripped out anyway by + dh_strip -a -X_debug; so leave the binaries in the build tree with + debugging symbols for simplified debugging of the packages. + + -- Daniel Jacobowitz Sat, 30 Oct 1999 12:40:12 -0400 + +gcc (2.95.2-1) unstable; urgency=low + + * gcc-2.95.2 release (taken from the CVS archive). -fstrict-aliasing + is disabled upstream. + + -- Matthias Klose Mon, 25 Oct 1999 10:26:19 +0200 + +gcc (2.95.2-0pre4) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19991021. + * Updated gpc to gpc-19991018 snapshot (closes: #33037, #47453). + Enable gpc for all architectures ... + * Document gcc exit codes (closes: #43863). + * According to the bug submitter (Sergey V Kovalyov ) + the original source of these CERN librarties is outdated now. The latest + version of cernlibs compiles and works fine with slink (closes #31546). + * According to the bug submitter (Gergely Madarasz ), + the problem triggered on i386 cannot be reproduced with the current + jade and php3 versions anymore (closes: #35215). + * Replace corrupted m68k-pic.dpatch (from Roman Hodek and Andreas Schwab + and apply to + all architectures (closes: #48011). + * According to the bug submitter (Herbert Xu ) + this bug "probably has been fixed". Setting it to severity "fixed" + (fixes: #39616), will close it later ... + * debian/README.Bugs: Document throwing C++ exceptions "through" C + libraries (closes: #22769). + + -- Matthias Klose Fri, 22 Oct 1999 20:33:00 +0200 + +gcc (2.95.2-0pre3) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19991019. + * Apply NMU patches (closes: #46217). + * debian/control.in: Fix egcs64 conflict-dependency for sparc + architecture (closes: #47088). + * debian/rules2: dbg-packages share doc dir with lib packages + (closes #45067). + * debian/patches/gcj-debian-policy.dpatch: Patch from Stephane + Bortzmeyer to conform to Debian policy (closes: #44463). + * debian/bugs/bug-*: Added test cases for new bug reports. + * debian/patches/libstdc++-bastring.dpatch: Patch by Richard Kettlewell + (closes #46550). + * debian/rules.patch: Apply libstdc++-wall2 patch (closes #46609). + * debian/README: Fix typo (closes: #45253). + * debian/control.in: Remove primary/secondary distinction; + dbg-packages don't provide their normal counterparts (closes #45206). + * debian/rules.patch: gcc-combine patch applied upstream. + * debian/rules2: Only use mail if with_check is set (off by default). + * debian/rules.conf: Tighten binutils dependency to 2.9.5.0.12. + + -- Matthias Klose Tue, 19 Oct 1999 20:33:00 +0200 + +gcc (2.95.2-0pre2.0.2) unstable; urgency=HIGH (for m68k) + + * Binary-only NMU for m68k as quick fix for another bug; the patch + is in CVS already, too. + * Applied another patch by Andreas Schwab to fix %a5 restauration in + some cases. + + -- Roman Hodek Thu, 30 Sep 1999 16:09:15 +0200 + +gcc (2.95.2-0pre2.0.1) unstable; urgency=HIGH (for m68k) + + * Binary-only NMU for m68k as quick fix for serious bugs; the patches + are already checked into gcc CVS and should be in the next official + version, too. + * Applied two patches by Andreas Schwab to fix -fpic and loop optimization. + + -- Roman Hodek Mon, 27 Sep 1999 15:32:49 +0200 + +gcc (2.95.2-0pre2) unstable; urgency=low + + * Fixed in 2.95.2 (closes: #43478). + * Previous version had Pascal examples missing in doc directory. + + -- Matthias Klose Wed, 8 Sep 1999 22:18:17 +0200 + +gcc (2.95.2-0pre1) unstable; urgency=low + + * Updated to cvs updates of the gcc-2_95-branch until 19990828. + * Apply work around memory corruption (just for 2.95.1) by + Daniel Jacobowitz . + * debian/patches/libstdc++-wall2.dpatch: Patch from Franck Sicard + to fix some warnings (closes: #44670). + * debian/patches/libstdc++-valarray.dpatch: Patch from Hideaki Fujitani + to fix a bug in valarray_array.h. + * Applied NMU from Jim Pick minus the jump.c and fold-const.c patches + already in the gcc-2_95-branch (closes: #44690). + * Conform to debian-java policy (closes: #44463). + * Move docs to /usr/share/doc (closes: #44782). + * Remove debian/patches/gcc-align.dpatch applied upstream. + * debian/*.postinst: Call install-info only, when configuring. + * debian/*.{postinst,prerm}: Add #DEBHELPER# comments to handle + /usr/doc -> /usr/share/doc transition. + + -- Matthias Klose Wed, 8 Sep 1999 22:18:17 +0200 + +gcc (2.95.1-2.1) unstable; urgency=low + + * Non-maintainer upload. + * ARM platform no longer needs library-prefix patch. + * Updated patches from Philip Blundell. + + -- Jim Pick Wed, 8 Sep 1999 20:14:07 -0700 + +gcc (2.95.1-2) unstable; urgency=low + + * debian/gcc.{postinst,prerm}: gcc provides an alternative for + sparc64-linux-gcc. + * Applied patch from Ben Collins to enable bi-architecture (32/64) + support for sparc. + * Rebuild debian/control and debian/rules.parameters after unpacking. + * debian/rules2: binary-indep. Conditionalize on with_pascal. + + -- Matthias Klose Sat, 4 Sep 1999 13:47:30 +0200 + +gcc (2.95.1-1) unstable; urgency=low + + * Updated to release gcc-2.95.1 and cvs updates of the gcc-2_95-branch + until 19990828. + * debian/README.gcc: Updated NEWS file to include 2.95 and 2.95.1 news. + * debian/README.java: New file. + * debian/rules.defs: Disabled gpc for alpha, arm. Disabled ObjC-GC + for alpha. + * debian/rules [clean]: Remove debian/rules.parameters. + * debian/rules2 [binary-arch]: Call dh_shlibdeps with LD_LIBRARY_PATH set + to installation dir of libstdc++. Why isn't this the default? + * debian/control.in: *-dev packages do not longer conflict with + libg++272-dev package. + * Apply http://egcs.cygnus.com/ml/gcc-patches/1999-08/msg00599.html. + * Only define BAD_THROW_ALLOC, when using exceptions (fixes #43462). + * For ObjC (when configured with GC) recommend libgc4-dev, not libgc4. + * New version of 68060 build patch. + * debian/rules.conf: For m68k, depend on binutils version 2.9.1. + + -- Matthias Klose Sat, 28 Aug 1999 18:16:31 +0200 + +gcc (2.95.1-0pre2) unstable; urgency=medium + + * gpc is back again (fixes grave #43022). + * debian/patches/gpc-updates.dpatch: Patches sent to upstream authors. + * Work around the fatal dependtry assertion failure bug in dpkg (hint + from "Antti-Juhani Kaijanaho" , fixes important #43072). + + -- Matthias Klose Mon, 16 Aug 1999 19:34:14 +0200 + +gcc (2.95.1-0pre1) unstable; urgency=low + + * Updated to cvs 19990815 gcc-2_95-branch; included install docs and + FAQ from 2.95 release; upload source package as well. + * Source package contains tarballs only (gcc, libg++, installdocs). + * debian/rules: Splitted into debian/rules{,.unpack,.patch,.conf,2}. + * debian/gcc.postinst: s/any key/RETURN; warn only when upgrading from + pre 2.95 version; reference /usr/doc, not /usr/share/doc. + * Checked syntax for attributes of functions; checked for #35068; + checked for bad gmon.out files (at least with libc6 2.1.2-0pre5 and + binutils 2.9.1.0.25-2 the problem doesn't show up anymore). + * debian/patches/cpp-macro-doc.dpatch: Document macro varargs in cpp.texi. + * gcc is primary compiler for all platforms but m68k. Setting + severity of #22513 to fixed. + * debian/patches/gcc-default-arch.dpatch: New patch to enable generation + of i386 instruction as default (fixes #42743). + * debian/rules: Removed outdated gcc NEWS file (fixes #42742). + * debian/patches/libstdc++-out-of-mem.dpatch: Throw exception instead + of aborting when out of memory (fixes #42622). + * debian/patches/cpp-dos-newlines.dpatch: Handle ibackslashes after + DOS newlines (fixes #29240). + * Fixed in gcc-2.95.1: #43001. + * Bugs closed in this version: + Closes: #11525, #12253, #22513, #29240, #35068, #36182, #42584, #42585, + #42602, #42622, #42742 #42743, #43001, #43002. + + -- Matthias Klose Sun, 15 Aug 1999 10:31:50 +0200 + +gcc (2.95-3) unstable; urgency=high + + * Provide /lib/cpp again (fixes important bug #42524). + * Updated to cvs 19990805 gcc-2_95-branch. + * Build with the default scheduler. + * Apply install-multilib patch from Dan Jacobowitz. + * Apply revised cpp-A- patch from Dan Jacobowitz. + + -- Matthias Klose Fri, 6 Aug 1999 07:25:19 +0200 + +gcc (2.95-2) unstable; urgency=low + + * Remove /lib/cpp. This driver uses files from /usr/lib/gcc-lib anyway. + * The following bugs are fixed (compared to egcs-1.1.2). + Closes: #4429, #20889, #21122, #26369, #28417, #28261, #31416, #35261, + #35900, #35906, #38246, #38872, #39098, #39526, #40659, #40991, #41117, + #41290, #41302, #41313. + * The following by Joel Klecker: + - Adopt dpkg-architecture variables. + - Go back to SHELL = bash -e or it breaks where /bin/sh is not bash. + - Disabled the testsuite, it is not included in the gcc 2.95 release. + + -- Matthias Klose Sat, 31 Jul 1999 18:00:42 +0200 + +gcc (2.95-1) unstable; urgency=low + + * Update for official gcc-2.95 release. + * Built without gpc. + * debian/rules: Remove g++FAQ from rules, which is outdated. + For ix86, build for i386, not i486. + * Apply patch from Jim Pick for building multilib package on arm. + + -- Matthias Klose Sat, 31 Jul 1999 16:38:21 +0200 + +gcc (2.95-0pre10) unstable; urgency=low + + * Use ../builddir-gcc-$(VER) by default instead of ./builddir; upstream + strongly advises configuring outside of the source tree, and it makes + some things much easier. + * Add patch to prevent @local branches to weak symbols on powerpc (fixes + apt compilation). + * Add patch to make cpp -A- work as expected. + * Renamed debian/patches/ppc-library-prefix.dpatch to library-prefix.dpatch; + apply on all architectures. + * debian/control.in: Remove snapshot dependencies. + * debian/*.postinst: Reflect use of /usr/share/{info,man}. + + -- Daniel Jacobowitz Thu, 22 Jul 1999 19:27:12 -0400 + +gcc (2.95-0pre9) unstable; urgency=low + + * The following bugs are fixed (compared to egcs-1.1.2): #4429, #20889, + #21122, #26369, #28417, #28261, #35261, #38246, #38872, #39526, #40659, + #40991, #41117, #41290. + * Updated to CVS gcc-19990718 snapshot. + * debian/control.in: Removed references to egcs in descriptions. + Changed gcj's Recommends libgcj-dev to Depends. + * debian/rules: Apply ppc-library-prefix for alpha as well. + * debian/patches/arm-config.dpatch: Updated patch sent by Jim Pick. + + -- Matthias Klose Sun, 18 Jul 1999 12:21:07 +0200 + +gcc (2.95-0pre8) unstable; urgency=low + + * Updated CVS. + * debian/copyright: s%doc/copyright%share/common-licenses% + * debian/README.Bugs: s/egcs.cygnus.com/gcc.gnu.org/ s/egcs-bugs/gcc-bugs/ + * debian/patches/reporting.dpatch: Remake diff for current sources. + * debian/libstdc++-dev.postinst: It's /usr/share/info/iostream.info. + * debian/rules: Current dejagnu snapshot reports a framework version + of 1.3.1. + + -- Joel Klecker Sun, 18 Jul 1999 02:09:57 -0700 + +gcc-snapshot (19990714-0pre6) experimental; urgency=low + + * Updated to CVS gcc-19990714 snapshot. + * Applied ARM patch (#40515). + * Converted DOS style linefeeds in debian/patches/ppc-* files. + * debian/rules: Reflect change in gcc/version.c; use sh -e as shell: + for some obscure reason, bash -e doesn't work. + * Reflect version change for libstdc++ (2.10). Remove libg++-name + patch; libg++ now has version 2.8.1.3. Removed libc version from + the package name. + + -- Matthias Klose Wed, 14 Jul 1999 18:43:57 +0200 + +gcc-snapshot (19990625-0pre5.1) experimental; urgency=low + + * Non-maintainer upload. + * Added ARM specific patch. + + -- Jim Pick Tue, 29 Jun 1999 22:36:08 -0700 + +gcc-snapshot (19990625-0pre5) experimental; urgency=low + + * Updated to CVS gcc-19990625 snapshot. + + -- Matthias Klose Fri, 25 Jun 1999 16:11:53 +0200 + +gcc-snapshot (19990609-0pre4.1) experimental; urgency=low + + * Added and re-added a few last PPC patches. + + -- Daniel Jacobowitz Sat, 12 Jun 1999 16:48:01 -0500 + +gcc-snapshot (19990609-0pre4) experimental; urgency=low + + * Updated to CVS egcs-19990611 snapshot. + + -- Matthias Klose Fri, 11 Jun 1999 10:20:09 +0200 + +gcc-snapshot (19990609-0pre3) experimental; urgency=low + + * CVS gcc-19990609 snapshot. + * New gpc-19990607 snapshot. + + -- Matthias Klose Wed, 9 Jun 1999 19:40:44 +0200 + +gcc-snapshot (19990524-0pre1) experimental; urgency=low + + * egcs-19990524 snapshot. + * First snapshot of the gcc-2_95-branch. egcs-1.2 is renamed to gcc-2.95, + which is now the "official" successor to gcc-2.8.1. The full version + name is: gcc-2.95 19990521 (prerelease). + * debian/control.in: Changed maintainers to `Debian GCC maintainers'. + * Moved all version numbers to epoch 1. + * debian/rules: Major changes. The support for secondary compilers + was already removed for the egcs-1.2 snapshots. Many fixes by + Joel Klecker . + - Send mail to Debian maintainers for successful builds. + - Fix VER and VERNO sed expressions. + - Replace remaining GNUARCH occurrences. + * New gpc snapshot (but don't build). + * debian/patches/valarray.dpatch: Backport from libstdc++-v3. + * debian/gcc-doc.*: Info is now gcc.info* (Joel Klecker ). + * Use cpp driver provided by the package. + * New script c89 (fixes #28261). + + -- Matthias Klose Sat, 22 May 1999 16:10:36 +0200 + +egcs (1.1.2-2) unstable; urgency=low + + * Integrate NMU's for arm and sparc (fixes #37582, #36857). + * Apply patch for the Hurd (fixes #37753). + * Describe open bugs in TODO.Debian. Please have a look if you can help. + * Update README / math functions section (fixes #35906). + * Done by J.H.M. Dassen (Ray) : + - At Richard Braakman's request, made -dbg packages for libstdc++ + and libg++. + - Provide egcc(1) (fixes lintian error). + + -- Matthias Klose Sun, 16 May 1999 14:30:56 +0200 + +egcs-snapshot (19990502-1) experimental; urgency=low + + * New snapshot. + + -- Matthias Klose Thu, 6 May 1999 11:51:02 +0200 + +egcs-snapshot (19990418-2) experimental; urgency=low + + * Merged Rays changes to build debug packages. + + -- Matthias Klose Wed, 21 Apr 1999 16:54:56 +0200 + +egcs-snapshot (19990418-1) experimental; urgency=low + + * New snapshot. + * Disable cpplib. + + -- Matthias Klose Mon, 19 Apr 1999 11:32:19 +0200 + +egcs (1.1.2-1.2) unstable; urgency=low + + * NMU for arm + * Added arm-optimizer.dpatch with optimizer workaround for ARM + + -- Jim Pick Mon, 19 Apr 1999 06:17:13 -0700 + +egcs (1.1.2-1.1) unstable; urgency=low + + * NMU for sparc + * Included dpatch to modify the references to gcc/crtstuff.c so that + __register_frame_info is not a weak reference. This allows potato to + remain binary compatible with slink, while still retaining compatibility + with other sparc/egcs1.1.2 distributions. Diff in .dpatch format has + been sent to the maintainer with a note it may not be needed for 1.1.3. + + -- Ben Collins Tue, 27 Apr 1999 10:15:03 -0600 + +egcs (1.1.2-1) unstable; urgency=low + + * Final egcs-1.1.2 release built for potato as primary compiler + for all architectures except m68k. + + -- J.H.M. Dassen (Ray) Thu, 8 Apr 1999 13:14:29 +0200 + +egcs-snapshot (19990321-1) experimental; urgency=low + + * New snapshot. + * Disable gpc. + * debian/rules: Simplified (no secondary compiler, bumped all versions + to same epoch, libapi patch is included upstream). + * Separated out cpp documentation to cpp-doc package. + * Fixed in this version: #28417. + + -- Matthias Klose Tue, 23 Mar 1999 02:11:18 +0100 + +egcs (1.1.2-0slink2) stable; urgency=low + + * Applied H.J.Lu's egcs-19990315.linux patch. + * Install faq.html and egcs-1.1.2 announcment. + + -- Matthias Klose Tue, 23 Mar 1999 01:14:54 +0100 + +egcs (1.1.2-0slink1) stable; urgency=low + + * Final egcs-1.1.2 release; compiled with glibc-2.0 for slink on i386. + * debian/control.in: gcc provides egcc, when FIRST_PRIMARY defined. + * Fixes #30767, #32278, #34252, #34352. + * Don't build the libstdc++.so.2.9 library on architectures, which have + switched to glibc-2.1. + + -- Matthias Klose Wed, 17 Mar 1999 12:55:59 +0100 + +egcs (1.1.1.63-2.2) unstable; urgency=low + + * Non-maintainer upload. + * Incorporate patch from Joel Klecker to fix snapshot packages + by moving/removing the application of libapi. + * Disable the new libstdc++-dev-config and the postinst message in + glibc 2.1 versions. + + -- Daniel Jacobowitz Mon, 12 Mar 1999 14:16:02 -0500 + +egcs (1.1.1.63-2.1) unstable; urgency=low + + * Non-maintainer upload. + * Compile with glibc 2.1 release version. + * New upstream version egcs-1.1.2 pre3. + * Miscellaneous rules updates (see changelog.snapshot). + * New set of powerpc-related patches from Franz Sirl, + . + * Disable libgcc.dpatch (new solution implemented upstream). Remove it. + * Also pass $target to config.if. + * Enable Dwarf2 EH for powerpc. Bump the C++ binary version. No + loss in -backwards- compatibility as far as I can tell, so add a + compatibility symlink, and add to shlibs file. + * Add --no-backup-if-mismatch to the debian/patches/*.dpatch files, + to prevent bogus .orig's in diffs. + * Merged with (unreleased) 1.1.1.62-1 and 1.1.1.63-{1,2} packages from + Matthias Klose . + * Stop adding a backwards compatibility link for egcs-nof on powerpc. + To my knowledge, nothing uses it. Do add the libstdc++ API change + link, though. + + -- Daniel Jacobowitz Mon, 8 Mar 1999 14:24:01 -0500 + +egcs (1.1.1.63-2) stable; urgency=low + + * Provide a libstdc++ with a shared object name, which is compatible + to other distributions. Documented the change in README.Debian, + the libstdc++-2.9.postinst and the libstdc++-dev-config script. + + -- Matthias Klose Fri, 12 Mar 1999 00:36:20 +0100 + +egcs (1.1.1.63-1.1) unstable; urgency=low + + * Non-Maintainer release. + * Build against glibc 2.1. + * Make egcs the primary compiler on i386. + * Also confilct with egcc (<< FIRST_PRIMARY) + if FIRST_PRIMARY is defined. + (this tells dpkg that gcc completely obsoletes egcc) + * Remove hjl-12 patch again, HJL says it should not be + necessary with egcs 1.1.2. + (as per forwarded reply from Christopher Chimelis) + * Apply libapi patch in clean target before regenerating debian/control + and remove the patch afterward. Otherwise, the libstdc++ and libg++ + package names are generated wrong on a glibc 2.1 system. + + -- Joel Klecker Tue, 9 Mar 1999 15:31:02 -0800 + +egcs (1.1.1.63-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre3. + * Applied improved libstdc++ warning patch from Rob Browning. + + -- Matthias Klose Tue, 9 Mar 1999 16:14:07 +0100 + +egcs (1.1.1.62-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre2. + * New upstream version libg++-2.8.1.3. + * Readded ARM support + * Readded hjl-12 per request from Christopher C Chimelis + + + -- Matthias Klose Fri, 26 Feb 1999 09:54:01 +0100 + +egcs-snapshot (19990224-0.1) experimental; urgency=low + + * New snapshot. + * Add the ability to disable CPPLIB by setting CPPLIB=no in + the environment. + * Disable gpc for powerpc; I spent a long time getting it to + make correctly, and then it goes and ICEs. + + -- Daniel Jacobowitz Tue, 24 Feb 1999 23:34:12 -0500 + +egcs (1.1.1.61-1) unstable; urgency=low + + * New upstream version egcs-1.1.1-pre1. + * debian/control.in: Applied patch from bug report #32987. + * Split up H.J.Lu's hjl-19990115-linux patch into several small + chunks: libapi, arm-mips, libgcc, hjl-other. The changelog.Linux + aren't included in the separate chunks. Please refer to the + unmodified hjl-19990115-linux patch file in the egcs source pkg. + * Apply warning patch to fix the annoying spew you get if you try to + use ropes or deques with -Wall (which makes -Wall mostly useless for + spotting errors in your own code). Fixes #32996. + * debian/rules: Unapply patches in the exact reverse order they were + applied. + + -- Matthias Klose Sat, 20 Feb 1999 22:06:21 +0100 + +egcs (1.1.1-5) frozen unstable; urgency=medium + + * Move libgcc.map file to g++ package, where gcc is the secondary + compiler (fixes #32329, #32605, #32631). + * Prepare to rename libstdc++2.9 package for glibc-2.1 (fixes #32148). + * Apply NMU patch for arm architecure (fixes #32367). + * Don't apply hjl-12 patch for alpha architectures (requested by the + alpha developers, Christopher C Chimelis ). + * Call makeinfo with --no-validate to fix obscure build failure on alpha. + * Build gpc info files in doc subdirectory. + * Remove c++filt diversion (C++ name demangling patch is now in binutils, + fixes #30820 and #32502). + + -- Matthias Klose Sun, 31 Jan 1999 23:19:35 +0100 + +egcs (1.1.1-4.1) unstable; urgency=low + + * Non-maintainer upload. + * Pascal doesn't build for ARM. + + -- Jim Pick Sun, 24 Jan 1999 16:13:34 -0800 + +egcs (1.1.1-4) frozen unstable; urgency=high + + * Don't strip compiler libraries libgcc.a libobjc.a libg2c.a libgpc.a + * Move Pascal examples to the right place (fixes #32149, part 1). + * Add dependencies for switching from secondary to primary compiler, + if FIRST_PRIMARY is defined (fixes #32149, part 2). + + -- Matthias Klose Wed, 20 Jan 1999 16:51:30 +0100 + +egcs (1.1.1-3) frozen unstable; urgency=low + + * Updated with the H.J.Lu's hjl-19990115-linux patch (fixes the + __register_frame_info problems, mips and arm port included). + * Update gpc to 19990118 (beta release candidate). + * Strip static libraries (fixes #31247 and #31248). + * Changed maintainer address. + + -- Matthias Klose Tue, 19 Jan 1999 16:34:28 +0100 + +egcs (1.1.1-2) frozen unstable; urgency=low + + * Moved egcs-docs, g77-doc and gpc-doc packages to doc section. + * Downgraded Recommends: egcs-docs to Suggests: egcs-docs dependencies + (for archs, where egcs is the primary compiler). + * Add 'Suggests: stl-manual' dependency to libstdc++2.9-dev. + * Applied one more alpha patch: + ftp://ftp.yggdrasil.com/private/hjl/egcs/1.1.1/egcs-1.1.1.diff.12.gz + * Applied PPro optimization patch. + * Apply emit-rtl-nan patch. + * Upgraded to libg++-2.8.1.2a-19981218.tar.gz. + * Upgraded to gpc-19981218. + * Make symlinks for gobjc, libstdc++2.9-dev and libg++2.8.2 doc directories. + + -- Matthias Klose Wed, 23 Dec 1998 18:04:53 +0200 + +egcs-snapshot (19981211-1) experimental; urgency=low + + * New snapshot. + * Adapted gpc to egcs-2.92.x (BOOT_CFLAGS must include -g). + * New libg++-2.8.1.2a-19981209.tar.gz. + * debian/rules: new target mail-summary. + + -- Matthias Klose Fri, 11 Dec 1998 18:14:53 +0200 + +egcs (1.1.1-1) frozen unstable; urgency=high + + * Final egcs-1.1.1 release. + * The last version depended on a versioned libc6 again. + * Add lost dependency for libg++ on libstdc++. + * Added debian-libstdc++.sh script to generate a libstdc++ on a Linux + system, which doesn't use the libapi patch. + + -- Matthias Klose Wed, 2 Dec 1998 12:06:15 +0200 + +egcs (1.1.0.91.59-2) frozen unstable; urgency=high + + * Fixes bugs from libc6 2.0.7u-6 upload without dependency line + Conflicts: libstdc++-2.9 (<< 2.91.59): #30019, #30066, #30078. + * debian/copyright: Updated URLs. + * gcc --help now mentions /usr/doc/debian/bug-reporting.txt. + * Install README.Debian and include information about patches applied. + * Depend on unversioned libc6 on i386, such that libstdc++2.9 can be used + on a hamm system. + + -- Matthias Klose Fri, 27 Nov 1998 18:32:02 +0200 + +egcs (1.1.0.91.59-1) frozen unstable; urgency=low + + * This is egcs-1.1.1 prerelease #3, compiled with libc6 2.0.7u-6. + * Added dependency for libstdc++2.9-dev on g++ (fixes #29631). + * Package g77 provides f77 (fixes #29817). + * Already fixed in earlier egcs-1.1 releases: #2493, #25271, #10620. + * Bugs reported for gcc-2.7.x and fixed in the egcs version of gcc: + #2493, #4430, #4954, #5367, #6047, #10612, #12375, #20606, #24788, #26100. + * Upgraded libg++ to libg++-2.8.1.2a-19981114. + * Upgraded gpc to gpc-19981124. + * Close #25869: egcs and splay maintainers are unable to reproduce this + bug with the current Debian packages. Bug submitter doesn't respond. + * Close #25407: egcs maintainer cannot reproduce this bug with the current + Debian compiler. Bug submitter doesn't respond. + * Use debhelper 1.2.7 for building. + * Replace the libstdc++ and libg++ compatibility links with fake libraries. + + -- Matthias Klose Wed, 25 Nov 1998 12:11:42 +0200 + +egcs (1.1.0.91.58-5) frozen unstable; urgency=low + + * Applied patch to build on the m68060. + * Added c++filt and c++filt.1 to the g++ package. + * Updated gpc to gpc-981105; fixes some regressions compared to egcs-1.1. + * Separated out g77 and gpc doumentation to new packages g77-doc and gpc-doc. + * Closed bugs (#22158). + * Close #20248; on platforms where gas and gld are the default versions, + it makes no difference to configure with or without enable-ld. + * Close #24349. The bugs are in the amulet source. + See http://www.cs.cmu.edu/afs/cs/project/amulet/www/FAQ.html#GCC28x + * Rename gcc.info* files to egcs.info* (fixes #24088). + * Documented known bugs (and workarounds) in BUGS.Debian. + * Fixed demangling of C++ names (fixes #28787). + * Applied patch form aspell to libstdc++/stl/stl_rope.h. + * Updated from cvs 16 Nov 1998. + + -- Matthias Klose Tue, 17 Nov 1998 09:41:24 +0200 + +egcs-snapshot (19981115-2) experimental; urgency=low + + * New snapshot. Disabled gpc. + * New packages g77-doc and gpc-doc. + + -- Matthias Klose Mon, 16 Nov 1998 12:48:09 +0200 + +egcs (1.1.0.91.58-3) frozen unstable; urgency=low + + * Previous version installed in potato, not slink. + * Updated from cvs 3 Nov 1998. + + -- Matthias Klose Tue, 3 Nov 1998 18:34:44 +0200 + +egcs (1.1.0.91.58-2) unstable; urgency=low + + * [debian/rules]: added targets to apply and unapply patches. + * [debian/README.patches]: New file. + * Moved patches dir to debian/patches. debian/rules has to select + the patches to apply. + * Manual pages for genclass and gcov (fixes #5995, #20950, #22196). + * Apply egcs-1.1-reload patch needed for powerpc architecture. + * Fixed bugs (#17768, #20252, #25508, #27788). + * Reapplied alpha patch (#20875). + * Fixes first part of #22513, extended README.Debian (combining C & C++). + * Already fixed in earlier egcs-1.1 releases: #17963, #20252, #20524, + #20640, #22450, #24244, #24288, #28520. + + -- Matthias Klose Fri, 30 Oct 1998 13:41:45 +0200 + +egcs (1.1.0.91.58-1) experimental; urgency=low + + * New upstream version. That's the egcs-1.1.1 prerelease plus patches from + the cvs archive upto 29 Oct 1998. + * Merged files from the egcs and snapshot packages. + * Updated libg++ to libg++-2.8.1.2 (although the Debian package name is still + 2.8.2). + * Moved patches dir to patches-1.1. + * Dan Jacobowitz: + * This is a snapshot from the egcs_1_1_branch, with + libapi, reload, builtin-apply, and egcs patches from + the debian/patches/ dir applied, along with the egcs-gpc-patches + and gcc/p/diffs/gcc-egcs-2.91.55.diff. + * Conditionalize gcj and chill (since they aren't in this branch). + * Fake snapshots drop the -snap-main. + + -- Matthias Klose Thu, 29 Oct 1998 15:15:19 +0200 + +egcs-snapshot (1.1-19981019-5.1) experimental; urgency=low + + * This is a snapshot from the egcs_1_1_branch, with + libapi, reload, builtin-apply, and egcs patches from + the debian/patches/ dir applied, along with the egcs-gpc-patches + and gcc/p/diffs/gcc-egcs-2.91.55.diff. + * Conditionalize gcj and chill (since they aren't in this + branch). + * Fake snapshots drop the -snap-main. + + -- Daniel Jacobowitz Mon, 19 Oct 1998 22:19:23 -0400 + +egcs (1.1b-5) unstable; urgency=low + + * [debian/control.in] Fixed typo in dependencies (#28076, #28087, #28092). + + -- J.H.M. Dassen (Ray) Sun, 18 Oct 1998 22:56:51 +0200 + +egcs (1.1b-4) unstable; urgency=low + + * Strengthened g++ dependency on libstdc++_LIB_SO_-dev from + `Recommends' to `Depends'. + * Updated README.Debian for egcs-1.1. + * Updated TODO. + + -- Matthias Klose Thu, 15 Oct 1998 12:38:47 +0200 + +egcs-snapshot (19981005-0.1) experimental; urgency=low + + * Make libstdc++2.9-snap-main and libg++-snap-main provide + their mainstream equivalents and put those equivalents into + their shlibs file. + * Package gcj, the GNU Compiler for Java(TM). + + * New upstream version of egcs (The -regcs_latest_snapshot branch). + * Build without libg++ entirely. + * Leave out gpc for now - the internals are sufficiently different + that it does not trivially compile. + * Include an experimental reload patch for powerpc - this is, + in the words of its author, not release quality, but it allows + powerpc linuxthreads to function. + * On architectures where we are the primary compiler, let snapshots + build with --prefix=/usr and conflict with the stable versions. + * Package chill, a front end for the language Chill. + * Other applied patches from debian/patches/: egcs-patches and + builtin-apply-patch. + * Use reload.c revision 1.43 to avoid a nasty bug. + + -- Daniel Jacobowitz Wed, 7 Oct 1998 00:27:42 -0400 + +egcs (1.1b-3.1) unstable; urgency=low + + * NMU to fix the egcc -> gcc link once and for all + + -- Christopher C. Chimelis Tue, 22 Sep 1998 16:11:19 -0500 + +egcs (1.1b-3) unstable; urgency=low + + * Oops. The egcc -> gcc link on archs where gcc is egcc was broken. + Thanks to Chris Chimelis for pointing this out. + + -- J.H.M. Dassen (Ray) Mon, 21 Sep 1998 20:51:35 +0200 + +egcs (1.1b-2) unstable; urgency=low + + * New upstream spellfix release (Debian revision is 2 as the internal + version numbers didn't change). + * Added egcc -> gcc symlink on architectures where egcc is the primary C + compiler. Thus, maintainers of packages that require egcc, can now + simply use "egcc" without conditionals. + * Porters: we hope/plan to make egcs's gcc the default C compiler on all + platforms once the 2.2.x kernels are available. Please test this version + thoroughly, and give us a GO / NO GO for your architecture. + * Some symbols cpp used to predefine were removed upstream in order to clean + up the cpp namespace, but imake requires them for determining the proper + settings for LinuxMachineDefines (see /usr/X11R6/lib/X11/{Imake,linux}.cf), + thus we put them back. Thanks to Paul Slootman for reporting his imake + problems on Alpha. + * [gcc/config/alpha/linux.h] Added -D__alpha to CPP_PREDEFINES . + Thanks to Chris Chimelis for the alpha-only 1.1a-1.1 NMU which fixed + this already. + * [gcc/config/i386/linux.h] Added -D__i386__ to CPP_PREDEFINES . + * [gcc/config/sparc/linux.h] Has -Dsparc in CPP_PREDEFINES . + * [gcc/config/sparc/linux64.h] Has -Dsparc in CPP_PREDEFINES . + * [gcc/config/m68k/linux.h] Has -Dmc68000 in CPP_PREDEFINES . + * [gcc/config/rs6000/linux.h] Has -Dpowerpc in CPP_PREDEFINES . + * [gcc/config/arm/linux.h] Has -Darm in CPP_PREDEFINES . + * [gcc/config/i386/gnu.h] Has -Di386 in CPP_PREDEFINES . + * Small fixes and updates in README. + * Changes affecting the source package only: + * [gcc/Makefile.in, gcc/cp/Make-lang.in, gcc/p/Make-lang.in] + Daniel Jacobowitz: Ugly hacks of various kinds to make cplib2.txt get + properly regenerated with multilib. + * [debian/TODO] Created. + * [INSTALL/index.html] Fixed broken link. + + -- J.H.M. Dassen (Ray) Sun, 20 Sep 1998 14:05:15 +0200 + +egcs (1.1a-1) unstable; urgency=low + + * New upstream release. + * Added README.libstdc++ . + * Updated Standards-Version. + * Matthias: + * Downgraded gobjc dependency on egcs-docs from Recommends: to Suggests: . + * [libg++/Makefile.in] Patched not to rely on a `-f' flag of `ln'. + + -- J.H.M. Dassen (Ray) Wed, 2 Sep 1998 19:57:43 +0200 + +egcs (1.1-1) unstable; urgency=low + + * egcs-1.1 prerelease (from the last Debian package only the version file + changed). + * "Final" gpc Beta 2.1 gpc-19980830. + * Included libg++ and gpc in the .orig tarball. so that diffs are getting + smaller. + * debian/control.in: Changed maintainer address to galenh-egcs@debian.org. + * debian/copyright: Updated URLs. + + -- Matthias Klose Mon, 31 Aug 1998 12:43:13 +0200 + +egcs (1.0.99.56-0.1) unstable; urgency=low + + * New upstream snapshot 19980830 from CVS (called egcs-1.1 19980830). + * New libg++ snapshot 980828. + * Put all patches patches subdirectory; see patches/README in the source. + * debian/control.in: readded for libg++2.8.2-dev: + Replaces: libstdc++2.8-dev (<= 2.90.29-0.5) + * Renamed libg++2.9 package to libg++2.8.2. + * gcc/p/gpc-decl.c: Fix from Peter@Gerwinski.de; fixes optimization errors. + * patches/gpc-patch2: Fix from Peter@Gerwinski.de; fixes alpha errors. + * debian/rules: New configuration flag for building with and without + libstdc++api patch; untested without ... + + -- Matthias Klose Sun, 30 Aug 1998 12:04:22 +0200 + +egcs (1.0.99-0.6) unstable; urgency=low + + * PowerPC fixes. + * On powerpc, generate the -msoft-float libs and package them + as egcs-nof. + * Fix signed char error in gpc. + * Create a libg++.so.2.9 compatibility symlink. + + -- Daniel Jacobowitz Tue, 25 Aug 1998 11:44:09 -0400 + +egcs (1.0.99-0.5) unstable; urgency=low + + * New upstream snapshot 19980824. + * New gpc snapshot gpc-980822; reenabled gpc for alpha. + + -- Matthias Klose Tue, 25 Aug 1998 01:21:08 +0200 + +egcs (1.0.99-0.4) unstable; urgency=low + + * New upstream snapshot 19980819. Should build glibc 2.0.9x on PPC. + + -- Matthias Klose Wed, 19 Aug 1998 14:18:07 +0200 + +egcs (1.0.99-0.3) unstable; urgency=low + + * New upstream snapshot 19980816. + * debian/rules: build correct debian/control and debian/*.shlibs + * Enabled Haifa scheduler for ix86. + + -- Matthias Klose Mon, 17 Aug 1998 16:29:35 +0200 + +egcs (1.0.99-0.2) unstable; urgency=low + + * New upstream snapshot: egcs-19980812, minor changes only. + * Fixes for building on `primary' targets. + * Disabled gpc on `alpha' architecture. + * Uses debhelper 1.1.6 + * debian/control.in: Replace older snapshot versions in favor of newer + normal versions. + * debian/rules: Fixes building of binary-arch target only. + + -- Matthias Klose Thu, 13 Aug 1998 11:59:41 +0200 + +egcs (1.0.99-0.1) unstable; urgency=low + + * New upstream version: pre egcs-1.1 version. + * Many changes ... for details see debian/changelog.snapshot in the + source package. + * New packages libstdc++2.9 and libstdc++2.9-dev. + * New libg++ snapshot 980731: new packages libg++2.9 and libg++2.9-dev. + * New gpc snapshot gpc-980729: new package gpc. + * Uses debhelper 1.1 + + -- Matthias Klose Mon, 10 Aug 1998 13:00:27 +0200 + +egcs-snapshot (19980803-4) experimental; urgency=low + + * rebuilt debian/control. + + -- Matthias Klose Wed, 5 Aug 1998 08:51:47 +0200 + +egcs-snapshot (19980803-3) experimental; urgency=low + + * debian/rules: fix installation locations of NEWS, header and + `undocumented' files. + * man pages aren't compressed for the snapshot package. + + -- Matthias Klose Tue, 4 Aug 1998 17:34:31 +0200 + +egcs-snapshot (19980803-2) experimental; urgency=low + + * debian/rules: Uses debhelper. Old in debian/rules.old. + renamed postinst, prerm files for use with debhelper. + * debian/{libg++2.9,libstdc++2.9}/postinst: call ldconfig only, + when called for configure. + * egcs-docs is architecture independent package. + * new libg++ snapshot 980731. + * installed libstdc++ api patch (still buggy). + + -- Matthias Klose Mon, 3 Aug 1998 13:20:59 +0200 + +egcs-snapshot (19980729-1) experimental; urgency=low + + * New snapshot version 19980729 from CVS archive. + * New gpc snapshot gpc-980729. + * Let gcc/configure decide about using the Haifa scheduler. + * Remove -DDEBIAN. That was needed for the security improvements with + regard to the /tmp problem. egcs-1.1 chooses another approach. + * Save test-protocol and extract gpc errors to gpc-test-summary. + * Tighten binutils dependency to 2.9.1. + * debian/rules: new build-info target + * debian/{control.in,rules}: _SO_ and BINUTILSV substitution. + * debian/rules: add dependency for debian/control. + * debian/rules: remove bin/c++filt + * TODO: next version will use debhelper; the unorganized moving of + files becomes unmanageable ... + * TODO: g++ headers in stdc++ package? check! + + -- Matthias Klose Thu, 30 Jul 1998 12:10:20 +0200 + +egcs-snapshot (19980721-1) experimental; urgency=low + + * Unreleased. Infinite loops in executables made by gpc. + + -- Matthias Klose Wed, 22 Jul 1998 18:07:20 +0200 + +egcs-snapshot (19980715-1) experimental; urgency=low + + * New snapshot version from CVS archive. + * New gpc snapshot gpc-980715. + * New libg++ version libg++-2.8.2-980708. Changed versioning + schema for library. The major versions of libc, libstdc++ and the + g++ interface are coded in the library name. Use this new schema, + but provide a symlink to our previous schema, since the library + seems to be binary compatible. + * [debian/rules]: Fixed bug in build target, when bootstrap returns + with an error + + -- Matthias Klose Wed, 15 Jul 1998 10:55:05 +0200 + +egcs-snapshot (19980701-1) experimental; urgency=low + + * New snapshot version from CVS archive. + Two check programs in libg++ had to be manually killed to finish the + testsuite (tBag and tSet). + * New gpc snapshot gpc-980629. + * Incorporated debian/rules changes from egcs-1.0.3a-0.5 (but don't remove + gcc/cp/parse.c gcc/c-parse.c gcc/c-parse.y gcc/objc/objc-parse.c + gcc/objc/objc-parse.y, since these files are part of the release). + * Disable the -DMKTEMP_EACH_FILE -DHAVE_MKSTEMP -DDEBIAN flags for the + snapshot. egcs-1.1 will have another solution. + * Don't bootstrap the snapshot with -fno-force-mem. Internal compiler + error :-( + * libf2c.a and f2c.h have changed names to libg2c.a and g2c.h and + have moved again into the gcc-lib dir. They are installed under + libg2c.a and g2c.h. Is it necessary to provide links f2c -> g2c ? + * debian/rules: reflect change of build dir of libraries. + + -- Matthias Klose Wed, 2 Jul 1998 13:15:28 +0200 + +egcs-snapshot (19980628-0.1) experimental; urgency=low + + * New upstream snapshot version. + * Non-maintainer upload; Matthias appears to be absent currently. + * Updated shlibs. + * Merged changes from regular egcs: + * [debian/control] Tightened dependency on binutils to 2.8.1.0.23 or + newer, as according to INSTALL/SPECIFIC PowerPC (and possibly Sparc) + need this. + * [debian/rules] Clean up some generated files outside builddir, + so the .diff.gz becomes smaller. + * [debian/rules] Partial sync/update with the one for the regular egcs + version. + * [debian/rules] Make gcc/p/configure executable. + + -- J.H.M. Dassen (Ray) Wed, 1 Jul 1998 07:12:15 +0200 + +egcs (1.0.3a-0.6) frozen unstable; urgency=low + + * Some libg++ development files were in libstdc++2.8-dev rather than + libg++2.8-dev. Fixed this and dealt with upgrading from the earlier + versions (fixes #23908; this bug is not marked release-critical, but + is annoying and can be quite confusing for users. Therefore, I think + this fix should go in 2.0). + + -- J.H.M. Dassen (Ray) Tue, 30 Jun 1998 11:10:14 +0200 + +egcs (1.0.3a-0.5) frozen unstable; urgency=low + + * Fixed location of .hP files (Fixes #23448). + * [debian/rules] simplified extraction of the files for libg++2.8-dev. + + -- J.H.M. Dassen (Ray) Wed, 17 Jun 1998 09:33:41 +0200 + +egcs (1.0.3a-0.4) frozen unstable; urgency=low + + * [gcc/gcc.c] There is one call to choose_temp_base for determining the + tempdir to be used only; #ifdef HAVE_MKSTEMP delete the tempfile created + as a side effect. (fixes #23123 for egcs). + * [gcc/collect2.c] There's still a vulnerability here; I don't see how + I can fix it without leaving behind tempfiles though. + * [debian/control] Tightened dependency on binutils to 2.8.1.0.23 or + newer, as according to INSTALL/SPECIFIC PowerPC (and possibly Sparc) + need this. + * [debian/rules] Clean up some generated files outside builddir, so the + .diff.gz becomes smaller. + + -- J.H.M. Dassen (Ray) Sat, 13 Jun 1998 09:06:52 +0200 + +egcs-snapshot (19980608-1) experimental; urgency=low + + * New snapshot version. + + -- Matthias Klose Tue, 9 Jun 1998 14:07:44 +0200 + +egcs (1.0.3a-0.3) frozen unstable; urgency=high (security fixes) + + * [gcc/toplev.c] set flag_force_mem to 1 at optimisation level 3 or higher. + This works around #17768 which is considered release-critical. + * Changes by Matthias: + * [debian/README] Documentation of the compiler situation for Objective C. + * [debian/rules, debian/control.*] Generate control file from a master + file. + * [debian/rules] Updates for Pascal and Fortran parts; brings it in sync + with the one for the egcs snapshots. + * Use the recommended settings LDFLAGS=-s CFLAGS= BOOT_CFLAGS='-O2'. + * Really compile -DMKTEMP_EACH_FILE -DHAVE_MKSTEMP (really fixes #19453 + for egcs). + * [gcc/gcc.c] A couple of temp files weren't marked for deletion. + + -- J.H.M. Dassen (Ray) Sun, 31 May 1998 22:56:22 +0200 + +egcs (1.0.3a-0.2) frozen unstable; urgency=high (security fixes) + + * Security improvements with regard to the /tmp problem + (gcc opens predictably named files in TMPDIR which can be abused via + symlinks) (Fixes #19453 for egcs). + * Compile -DMKTEMP_EACH_FILE to ensure the %u name is generated randomly + every time; affects gcc/gcc.c . + * [gcc/choose-temp.c, libiberty/choose-temp.c]: use mktemp(3) if compiled + -DUSE_MKSTEMP . + * Security improvements: don't use the result of choose_temp_base in a + predictable fashion. + [gcc/gcc.c]: + * @c, @objective-c: use random name rather then tempbasename.i for + intermediate preprocessor output (%g.i -> %d%u). + * @c, @objective-c: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @c, @objective-c, @cpp-output, @assembler-with-cpp: switched + "as [-o output file] " to + "as [-o output file]". + * @c, @objective-c, @assembler-with-cpp: use previous random name + (cc1|cpp output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U) + [gcc/f/lang-specs.h]: + * @f77-cpp-input: use random name rather then tempbasename.i for + intermediate cpp output (%g.i -> %d%u). + * @f77-cpp-input: use previous random name (cpp output) rather than + tempbasename.i for f771 input (%g.i -> %U). + * @f77-cpp-input: switched + "as [-o output file] " to + "as [-o output file]". + * @f77-cpp-input: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: use random name rather then tempbasename.i for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @f77: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %U). + * Run the testsuite (this requires the dejagnu package in experimental; + unfortunately, it is difficult to distinguish this version from the one + in frozen). + if possible, and log the results in warn_summary and bootstrap-summary. + * [gcc/choose-temp.c, libiberty/choose-temp.c]: s|returh|return| in + comment. + * Added notes on the Debian compiler setup [debian/README] to the + development packages. + * Matthias: + * [libg++/etc/lf/Makefile.in] Replaced "-ltermcap" by "-lncurses". + * [debian/rules] Updated so it can be used for both egcs releases and + snapshots easily; added support for the GNU Pascal Compiler gpc. + * [contrib/test_summary, contrib/warn_summary] Added from CVS. + * Run compiler checks and include results in /usr/doc/. + * Updates to the README. + * [debian/rules] Use assignments to speed up startup. + * [debian/rules] Show the important variables at the start of the build + process. + * [debian/control.secondary] Added a dependency of gobjc on egcc on + architectures where egcs provides the secondary compiler, as + /usr/bin/egcc is the compiler driver for gobjc. (Fixes #22829). + * [debian/control.*] Bumped Standards-Version; used shorter version + numbers in the dependency relationships (esthetic difference only); + fixed typo. + + -- J.H.M. Dassen (Ray) Tue, 26 May 1998 21:47:41 +0200 + +egcs-snapshot (19980525-1) experimental; urgency=low + + * New snapshot version. + + -- Matthias Klose Tue, 26 May 1998 18:04:06 +0200 + +egcs-snapshot (19980517-1) experimental; urgency=low + + * "Initial" release of the egcs-snapshot package; many debian/* files + derived from the egcs-1.0.3a-0.1 package (maintained by Galen Hazelwood + , NMU's by J.H.M. Dassen (Ray) ) + * The egcs-snapshot packages can coexist with the packages of the + egcs release. Package names have a '-ss' appended. + * All packages are installed in a separate tree (/usr/lib/egcs-ss following + the FHSS). + * Made all snapshot packages extra, all snapshot packages conflict + with correspondent egcs packages, which are newer than the snapshot. + * Included libg++-2.8.1-980505. + * Included GNU Pascal (gpc-980511). + * Haifa scheduler enabled for all snapshot packages. + * Run compiler checks and include results in /usr/doc/. + * Further information in /usr/doc//README.snapshot. + + -- Matthias Klose Wed, 20 May 1998 11:14:06 +0200 + +egcs (1.0.3a-0.1) frozen unstable; urgency=low + + * New upstream release egcs-2.90.29 980515 (egcs-1.0.3 release) + (we were using 1.0.3-prerelease). This includes the Haifa patches + we had since 1.0.3-0.2 and the gcc/objc/thr-posix.c patch we had + since 1.0.3-0.1; the differences with 1.0.3-prerelease + patches + we had is negligable. + * iostream info documentation was in the wrong package (libg++2.8-dev). + Now it's in libstdc++2.8-dev. (Thanks to Jens Rosenboom for bringing + this to my attention). As 1.0.3-0.3 didn't make it out of Incoming, + I'm not adding "Replaces:" for this; folks who had 1.0.3-0.3 installed + already know enough to use --force-overwrite. + * [gcc/objc/objc-act.c] Applied patch Matthias Klose supplied me with that + demangles Objective C method names in gcc error messages. + * Explicitly disable Haifa scheduling on Alpha, to make it easier to use + this package's diff with egcs snapshots, which may turn on Haifa + scheduling even though it is still unstable. (Requested by Chris Chimelis) + * Don't run "configure" again if builddir already exists (makes it faster + to restart builds in case one is hacking internals). Requested by + Johnnie Ingram. + * [gcc/gbl-ctors.h] Don't use extern declaration for atexit on glibc 2.1 + and higher (the prototype has probably changed; having the declaration + broke Sparc compiles). + * [debian/rules] Determine all version number automatically (from the + version string in gcc/version.c). + * [debian/copyright] Updated FTP locations; added text about libg++ (fixes + #22465). + + -- J.H.M. Dassen (Ray) Sat, 16 May 1998 17:41:44 +0200 + +egcs (1.0.3-0.3) frozen unstable; urgency=low + + * Made an "egcs-doc" package containing documentation for egcs (e)gcc, + g++, gobjc, so that administrators can choose whether to have this + documenation or the documentation that comes with the GNU gcc package. + Dependency on this is Recommends: on architectures where egcs provides + the primary C compiler; Suggests: on the others (where GNU gcc is still + the primary C compiler). + * Use the g++ FAQ from gcc/cp rather than libg++, as that version is more + up to date. + * Added iostream info documentation to libstdc++2.8-dev. + + -- J.H.M. Dassen (Ray) Wed, 13 May 1998 08:46:10 +0200 + +egcs (1.0.3-0.2) frozen unstable; urgency=low + + * Added libg++ that works with egcs, found at + ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.1-980505.tar.gz + (fixes #20587 (Severity: important)). + * The "libg++" and "libg++-dev" virtual packages now refer to the GNU + extensions. + * Added the g++ FAQ that comes with libg++ to the g++ package. + * libg++/Makefile.in: added $(srcdir) to rule for g++FAQ.info so that it + builds OK in builddir. + * Added -D__i386__ to the cpp predefines on intel. + * Patches Matthias supplied me with: + * Further 1.0.3 prerelease patches from CVS. + This includes patches to the Haifa scheduler. Alpha porters, please + check if this makes the Haifa scheduler OK again. + * Objective C patches from CVS. + + -- J.H.M. Dassen (Ray) Fri, 8 May 1998 14:43:20 +0200 + +egcs (1.0.3-0.1) frozen unstable; urgency=low (high for maintainers that use objc) + + * bug fixes only in new upstream version + * Applied patches from egcs CVS archive (egcs_1_03_prerelease) + (see gcc/ChangeLog in the egcs source package). + * libstdc++2.8-dev no longer Provides: libg++-dev (fixes #21153). + * libstdc++2.8-dev now Conflicts: libg++27-dev (bo), + libg++272-dev (hamm) [regular packages] rather than + Conflicts: libg++-dev [virtual package] to prepare the way for "libg++" + to be used as a virtual package for a new libg++ package (i.e. an up to + date one, which not longer contains libstdc++, but only the GNU + extensions) that is compatible with the egcs g++ packages. Such a package + isn't available yet. Joel Klecker tried building libg++2.8.1.1a within + egcs's libstdc++ setup, but it appears to need true gcc 2.8.1 . + * Filed Severity: important bugs against wxxt1-dev (#21707) because these + still depend on libg++-dev, which is removed in this version. + A fixed libsidplay1-dev has already been uploaded. + * libstdc++2.8 is now Section: base and Priority: required (as dselect is + linked against it). + * Disabled Haifa scheduling on Alpha again; Chris Chimelis reported + that this caused problems on some machines. + * [gcc/extend.texi] + ftp://maya.idiap.ch/pub/tmb/usenix88-lexic.ps.Z is no longer available; + use http://master.debian.org/~karlheg/Usenix88-lexic.pdf . + (fixes the egcs part of #20002). + * Updated Standards-Version. + * Changed chmod in debian/rules at Johnie Ingram's request. + * Rather than hardwire the Debian part of the packages' version number, + extract it from debian/changelog . + * Use gcc/objc/thr-posix.c from 980418 egcs snapshot to make objc work. + (Fixes #21192). + * Applied workaround for the GNUstep packages on sparc systems. + See README.sparc (on sparc packages only) in the doc directory. + This affects the other compilers as well. + * Already done in 1.0.2-0.7: the gobjc package now provides a virtual + package objc-compiler. + + -- J.H.M. Dassen (Ray) Tue, 28 Apr 1998 12:05:28 +0200 + +egcs (1.0.2-0.7) frozen unstable; urgency=low + + * Separated out Objective-C compiler. + * Applied patch from http://www.cygnus.com/ml/egcs/1998-Apr/0614.html + + -- Matthias Klose Fri, 17 Apr 1998 10:25:48 +0200 + +egcs (1.0.2-0.6) frozen unstable; urgency=low + + * Due to upstream changes (libg++ is now only the GNU specific C++ + classes, and is no longer maintained; libstdc++ contains the C++ + standard library, including STL), the virtual "libg++-dev" + package's meaning has become confusing. Therefore, new or updated + packages should no longer use the virtual "libg++-dev" package. + * Corrected g++'s Recommends to libstdc++2.8-dev (>=2.90.27-0.1). + The previous version had Recommends: libstdc++-dev (>=2.90.27-0.1) + which doesn't work, as libstc++-dev is a virtual package. + * Bumped Standards-Version. + + -- J.H.M. Dassen (Ray) Tue, 14 Apr 1998 11:52:08 +0200 + +egcs (1.0.2-0.5) frozen unstable; urgency=low (high for maintainers of packages that use libstdc++) + + * Modified shlibs file for libstdc++ to generate versioned dependencies, + as it is not link compatible with the 1.0.1-x versions in + project/experimental. (Fixes #20247, #20033) + Packages depending on libstd++ should be recompiled to fix their + dependencies. + * Strenghtened g++'s Recommends: libstdc++-dev to the 1.0.2 version or + newer. + * Fixed problems with the unknown(7) symlink for gcov. + * Reordering links now works. + + -- Adam Heath Sun, 12 Apr 1998 13:09:30 -0400 + +egcs (1.0.2-0.4) frozen unstable; urgency=low + + * Unreleased. This is the version Adam Heath received from me. + * Replaces: gcc (<= 2.7.2.3-3) so that the overlap with the older gcc + packages (including bo's gcc_2.7.2.1-8) is handled properly + (fixes #19931, #19672, #20217, #20593). + * Alpha architecture (fixes #20875): + * Patched gcc/config/alpha/linux.h for the gmon functions to operate + properly. + * Made egcs the primary C compiler. + * Enabled Hafia scheduling. + * Lintian-detected problems: + * E: libstdc++2.8: ldconfig-symlink-before-shlib-in-deb usr/lib/libstdc++.so.2.8 + * E: egcc: binary-without-manpage gcov + Reported as wishlist bug; added link to undocumented(7). + * W: libstdc++2.8: non-standard-executable-perm usr/lib/libstdc++.so.2.8.0 0555 + * E: libstdc++2.8: shlib-with-executable-bit usr/lib/libstdc++.so.2.8.0 0555 + + -- J.H.M. Dassen (Ray) Fri, 10 Apr 1998 14:46:46 +0200 + +egcs (1.0.2-0.3) frozen unstable; urgency=low + + * Really fixed dependencies. + + -- J.H.M. Dassen (Ray) Mon, 30 Mar 1998 11:30:26 +0200 + +egcs (1.0.2-0.2) frozen unstable; urgency=low + + * Fixed dependencies. + + -- J.H.M. Dassen (Ray) Sat, 28 Mar 1998 13:58:58 +0100 + +egcs (1.0.2-0.1) frozen unstable; urgency=low + + * New upstream version; it now has -Di386 in CPP_PREDEFINES. + * Only used the debian/* patches from 1.0.1-2; the rest of it appears + to be in 1.0.2 already. + + -- J.H.M. Dassen (Ray) Fri, 27 Mar 1998 11:47:14 +0100 + +egcs (1.0.1-2) unstable; urgency=low + + * Integrated pre-release 1.0.2 patches + * Split out g++ + * egcs may now provide either the primary or secondary C compiler + + -- Galen Hazelwood Sat, 14 Mar 1998 14:15:32 -0700 + +egcs (1.0.1-1) unstable; urgency=low + + * New upstream version + * egcs is now the standard Debian gcc! + * gcc now provides c-compiler (#15248 et al.) + * g77 now provides fortran77-compiler + * g77 dependencies now correct (#16991) + * /usr/doc/gcc/changelog.gz now has correct permissions (#16139) + + -- Galen Hazelwood Sat, 7 Feb 1998 19:22:30 -0700 + +egcs (1.0-1) experimental; urgency=low + + * First official release + + -- Galen Hazelwood Thu, 4 Dec 1997 16:30:11 -0700 + +egcs (970917-1) experimental; urgency=low + + * New upstream snapshot (There's a lot of stuff here as well, including + a new libstdc++, but it _still_ won't build...) + * eg77 driver now works properly + + -- Galen Hazelwood Wed, 17 Sep 1997 20:44:29 -0600 + +egcs (970904-1) experimental; urgency=low + + * New upstream snapshot + + -- Galen Hazelwood Sun, 7 Sep 1997 18:25:06 -0600 + +egcs (ss-970814-1) experimental; urgency=low + + * Initial packaging (of initial snapshot!) + + -- Galen Hazelwood Wed, 20 Aug 1997 00:36:28 +0000 + +gcc272 (2.7.2.3-12) unstable; urgency=low + + * Compiled on a glibc-2.0 based system. + * Reflect move of manpage to /usr/share in gcc.postinst as well. + * Moved gcc272-docs to section doc, priority optional. + + -- Matthias Klose Sat, 28 Aug 1999 13:42:13 +0200 + +gcc272 (2.7.2.3-11) unstable; urgency=low + + * Follow Debian policy for GNU system type (fixes #42657). + * config/i386/linux.h: Remove %[cpp_cpu] from CPP_SPEC. Stops gcc-2.95 + complaining about obsolete spec operators (using gcc -V 2.7.2.3). + Patch suggested by Zack Weinberg . + + -- Matthias Klose Sun, 15 Aug 1999 20:12:21 +0200 + +gcc272 (2.7.2.3-10) unstable; urgency=low + + * Renamed source package to gcc272. The egcs source package is renamed + to gcc, because it's now the "official" GNU C compiler. + * Changed maintainer address to "Debian GCC maintainers". + * Install info and man stuff to /usr/share. + + -- Matthias Klose Thu, 27 May 1999 12:29:23 +0200 + +gcc (2.7.2.3-9) unstable; urgency=low + + * debian/{postinst,prerm}-doc: handle gcc272.info, not gcc.info. + Fixes #36306. + + -- Matthias Klose Tue, 20 Apr 1999 07:32:58 +0200 + +gcc (2.7.2.3-8) unstable; urgency=low + + * Make gcc-2.7 the secondary compiler. Rename gcc package to gcc272. + On i386, sparc and m68k, this package is compiled against glibc2.0. + * The cpp package is built from the egcs source package. + + -- Matthias Klose Mon, 29 Mar 1999 22:48:50 +0200 + +gcc (2.7.2.3-7) frozen unstable; urgency=low + + * Separated out ObjC compiler to gobjc27 package. + * Changed maintainer address. + * Synchronized README.Debian with egcs-1.1.1-3. + + -- Matthias Klose Tue, 29 Dec 1998 19:05:26 +0100 + +gcc (2.7.2.3-6) frozen unstable; urgency=low + + * Link with -lc on i386, m68k, sparc, when building shared libraries + (fixes #25122). + + -- Matthias Klose Thu, 3 Dec 1998 12:12:12 +0200 + +gcc (2.7.2.3-5) frozen unstable; urgency=low + + * Updated maintainer info. + * Updated Standards-Version; made lintian-clean. + * gcc-docs can coexist with the latest egcs-docs, so added (<= version) to + the Conflicts. + * Updated the README and renamed it to README.Debian . + * Put a reference to /usr/doc/gcc/README.Debian in the info docs. + * Updated description of g++272 . + * Clean up generated info files, to keep the diff small. + + -- J.H.M. Dassen (Ray) Tue, 17 Nov 1998 20:05:59 +0100 + +gcc (2.7.2.3-4.8) frozen unstable; urgency=high + + * Non-maintainer release + * Fix type in extended description + * Removed wrong test in postinst + * Add preinst to clean up some stuff from an older gcc package properly + and stop man complaining about dangling symlinks + + -- Wichert Akkerman Fri, 17 Jul 1998 18:48:32 +0200 + +gcc (2.7.2.3-4.7) frozen unstable; urgency=high + + * Really fixed gcc-docs postinst (Fixes #23470), so that `gcc-docs' + becomes installable. + + -- J.H.M. Dassen (Ray) Mon, 15 Jun 1998 07:53:40 +0200 + +gcc (2.7.2.3-4.6) frozen unstable; urgency=high + + * [gcc.c] There is one call to choose_temp_base for determining the + tempdir to be used only; + #ifdef HAVE_MKSTEMP delete the tempfile created as a side effect. + (fixes #23123 for gcc). + * gcc-docs postinst was broken (due to a broken line) (fixes #23391, #23401). + * [debian/control] description for gcc-docs said `egcs' where it should have + said `gcc' (fixes #23396). + + -- J.H.M. Dassen (Ray) Thu, 11 Jun 1998 12:48:50 +0200 + +gcc (2.7.2.3-4.5) frozen unstable; urgency=high + + * The previous version left temporary files behind, as they were not + marked for deletion afterwards. + + -- J.H.M. Dassen (Ray) Sun, 31 May 1998 22:49:14 +0200 + +gcc (2.7.2.3-4.4) frozen unstable; urgency=high (security fixes) + + * Security improvements with regard to the /tmp problem + (gcc opens predictably named files in TMPDIR which can be abused via + symlinks) (Fixes #19453 for gcc): + * Compile -DMKTEMP_EACH_FILE to ensure the %u name is generated randomly + every time; affects gcc/gcc.c . + * [cp/g++.c, collect2.c, gcc.c] If compiled -DHAVE_MKSTEMP use mkstemp(3) + rather than mktemp(3). + * Security improvements: don't use the result of choose_temp_base in a + predictable fashion. + [gcc.c]: + * @c, @objective-c: use random name rather then tempbasename.i for + intermediate preprocessor output (%g.i -> %d%u). + * @c, @objective-c: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @c, @objective-c, @cpp-output, @assembler-with-cpp: switched + "as [-o output file] " to + "as [-o output file]". + * @c, @objective-c, @assembler-with-cpp: use previous random name + (cc1|cpp output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U) + [f/lang-specs.h]: + * @f77-cpp-input: use random name rather then tempbasename.i for + intermediate cpp output (%g.i -> %d%u). + * @f77-cpp-input: use previous random name (cpp output) rather than + tempbasename.i for f771 input (%g.i -> %U). + * @f77-cpp-input: switched + "as [-o output file] " to + "as [-o output file]". + * @f77-cpp-input: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: use random name rather then tempbasename.i for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate ratfor output (%g.f -> %d%u). + * @ratfor: use previous random name (ratfor output) rather than + tempbasename.i for f771 input (%g.f -> %U). + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @ratfor: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use previous random name + (ratfor output) rather then tempbasename.s for intermediate assembler + input (%g.s -> %U). + * @f77: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %d%u). + * @f77: switched + "as [-o output file] " to + "as [-o output file]". + * @ratfor: use random name rather then tempbasename.s for + intermediate compiler output (%g.s -> %U). + + -- J.H.M. Dassen (Ray) Sat, 30 May 1998 17:27:03 +0200 + +gcc (2.7.2.3-4.3) frozen unstable; urgency=high + + * The "alpha" patches from -4 affected a lot more than alpha support, + and in all likeliness broke compilation of libc6 2.0.7pre3-1 + and 2.0.7pre1-4 . I removed them by selective application of the + diff between -4 and -4. (should fix #22292). + * Fixed reference to the trampolines paper (fixes #20002 for Debian; + this still needs to be forwarded). + * This is for frozen too. (obsoletes #22390 (request to move -4.2 to + frozen)). + * Split of gcc-docs package, so that the gcc can be succesfully installed + on systems that have egcs-docs installed. + * Added the README on the compiler situation that's already in the egcs + packages. + * Use the recommended settings LDFLAGS=-s CFLAGS= BOOT_CFLAGS='-O2'. + + -- J.H.M. Dassen (Ray) Thu, 28 May 1998 20:03:59 +0200 + +gcc (2.7.2.3-4.2) unstable; urgency=low + + * Still for unstable, as I have received no feedback about the g++272 + package yet. + * gcc now Provides: objc-compiler . + * Clean up /etc/alternatives/{g++,g++.1.gz} if they are dangling. + (fixes #19765, #20563) + + -- J.H.M. Dassen (Ray) Wed, 22 Apr 1998 12:40:45 +0200 + +gcc (2.7.2.3-4.1) unstable; urgency=low + + * Bumped Standards-Version. + * Forked off a g++272 package (e.g. for code that uses the GNU extensions + in libg++); for now this is in "unstable" only; feedback appreciated. + * Some cleanup (lintian): permissions, absolute link, gzip manpage. + + -- J.H.M. Dassen (Ray) Fri, 17 Apr 1998 13:05:25 +0200 + +gcc (2.7.2.3-4) unstable; urgency=low + + * Added alpha patches + * Only build C and objective-c compilers, split off g++ + + -- Galen Hazelwood Sun, 8 Mar 1998 21:16:39 -0700 + +gcc (2.7.2.3-3) unstable; urgency=low + + * Added patches for m68k + * Added patches for sparc (#13968) + + -- Galen Hazelwood Fri, 17 Oct 1997 18:25:21 -0600 + +gcc (2.7.2.3-2) unstable; urgency=low + + * Added g77 support (g77 0.5.21) + + -- Galen Hazelwood Wed, 10 Sep 1997 18:44:54 -0600 + +gcc (2.7.2.3-1) unstable; urgency=low + + * New upstream version + * Now using pristine source + * Removed misplaced paragraph in cpp.texi (#10877) + * Fix security bug for temporary files (#5298) + * Added Suggests: libg++-dev (#12335) + * Patched objc/thr-posix.c to support conditions (#12502) + + -- Galen Hazelwood Mon, 8 Sep 1997 12:20:07 -0600 + +gcc (2.7.2.2-7) unstable; urgency=low + + * Made cc and c++ managed through alternates mechanism (for egcs) + + -- Galen Hazelwood Tue, 19 Aug 1997 22:37:03 +0000 + +gcc (2.7.2.2-6) unstable; urgency=low + + * Tweaked Objective-C thread support (#11069) + + -- Galen Hazelwood Wed, 9 Jul 1997 11:56:57 -0600 + +gcc (2.7.2.2-5) unstable; urgency=low + + * More updated m68k patches + * Now conflicts with libc5-dev (#10006, #10112) + * More strict Depends: cpp, prevents version mismatch (#9954) + + -- Galen Hazelwood Thu, 19 Jun 1997 01:29:02 -0600 + +gcc (2.7.2.2-4) unstable; urgency=low + + * Moved to unstable + * Temporarily removed fortran support (waiting for new g77) + * Updated m68k patches + + -- Galen Hazelwood Fri, 9 May 1997 13:35:14 -0600 + +gcc (2.7.2.2-3) experimental; urgency=low + + * Built against libc6 (fixes bug #8511) + + -- Galen Hazelwood Fri, 4 Apr 1997 13:30:10 -0700 + +gcc (2.7.2.2-2) experimental; urgency=low + + * Fixed configure to build crt{begin,end}S.o on i386 + + -- Galen Hazelwood Tue, 11 Mar 1997 16:15:02 -0700 + +gcc (2.7.2.2-1) experimental; urgency=low + + * Built for use with libc6-dev (experimental purposes only!) + * Added m68k patches from Andreas Schwab + + -- Galen Hazelwood Fri, 7 Mar 1997 12:44:17 -0700 + +gcc (2.7.2.1-7) unstable; urgency=low + + * Patched to support g77 0.5.20 + + -- Galen Hazelwood Thu, 6 Mar 1997 22:20:23 -0700 + +gcc (2.7.2.1-6) unstable; urgency=low + + * Added (small) manpage for protoize/unprotoize (fixes bug #6904) + * Removed -lieee from specs file (fixes bug #7741) + * No longer builds aout-gcc + + -- Galen Hazelwood Mon, 3 Mar 1997 11:10:20 -0700 + +gcc (2.7.2.1-5) unstable; urgency=low + + * debian/control now lists cpp in section "interpreters" + * Re-added Objective-c patches for unstable + + -- Galen Hazelwood Wed, 22 Jan 1997 10:27:52 -0700 + +gcc (2.7.2.1-4) stable unstable; urgency=low + + * Changed original source file so dpkg-source -x works + * Removed Objective-c patches (unsafe for stable) + * Built against rex's libc, so fixes placed in -3 are available to + those still using rex + + -- Galen Hazelwood Tue, 21 Jan 1997 11:11:53 -0700 + +gcc (2.7.2.1-3) unstable; urgency=low + + * New (temporary) maintainer + * Updated to new standards and source format + * Integrated aout-gcc into gcc source package + * Demoted aout-gcc to Priority "extra" + * cpp package description more clear (fixes bug #5428) + * Removed cpp "Replaces: gcc" (fixes bug #5762) + * Minor fix to invoke.texi (fixes bug #2909) + * Added latest Objective-C patches for GNUstep people (fixes bug #4657) + + -- Galen Hazelwood Sun, 5 Jan 1997 09:57:36 -0700 --- gcc-4.8-4.8.2.orig/debian/compat +++ gcc-4.8-4.8.2/debian/compat @@ -0,0 +1 @@ +5 --- gcc-4.8-4.8.2.orig/debian/control +++ gcc-4.8-4.8.2/debian/control @@ -0,0 +1,2028 @@ +Source: gcc-4.8 +Section: devel +Priority: optional +Maintainer: Ubuntu Core developers +XSBC-Original-Maintainer: Debian GCC Maintainers +Uploaders: Matthias Klose +Standards-Version: 3.9.5 +Build-Depends: debhelper (>= 5.0.62), g++-multilib [amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32], + libc6.1-dev (>= 2.13-0ubuntu6) [alpha ia64] | libc0.3-dev (>= 2.13-0ubuntu6) [hurd-i386] | libc0.1-dev (>= 2.13-0ubuntu6) [kfreebsd-i386 kfreebsd-amd64] | libc6-dev (>= 2.13-0ubuntu6), libc6-dev (>= 2.13-31) [armel armhf], libc6-dev-amd64 [i386 x32], libc6-dev-sparc64 [sparc], libc6-dev-sparc [sparc64], libc6-dev-s390 [s390x], libc6-dev-s390x [s390], libc6-dev-i386 [amd64 x32], libc6-dev-powerpc [ppc64], libc6-dev-ppc64 [powerpc], libc0.1-dev-i386 [kfreebsd-amd64], lib32gcc1 [amd64 ppc64 kfreebsd-amd64 mipsn32 mipsn32el mips64 mips64el s390x sparc64 x32], libn32gcc1 [mips mipsel mips64 mips64el], lib64gcc1 [i386 mips mipsel mipsn32 mipsn32el powerpc sparc s390 x32], libc6-dev-mips64 [mips mipsel mipsn32 mipsn32el], libc6-dev-mipsn32 [mips mipsel mips64 mips64el], libc6-dev-mips32 [mipsn32 mipsn32el mips64 mips64el], libc6-dev-x32 [amd64 i386], libx32gcc1 [amd64 i386], libc6-dev-armhf [armel], libhfgcc1 [armel], libc6-dev-armel [armhf], libsfgcc1 [armhf], libc6.1-dbg [alpha ia64] | libc0.3-dbg [hurd-i386] | libc0.1-dbg [kfreebsd-i386 kfreebsd-amd64] | libc6-dbg, + kfreebsd-kernel-headers (>= 0.84) [kfreebsd-any], + m4, libtool, autoconf2.64, + libunwind7-dev (>= 0.98.5-6) [ia64], libatomic-ops-dev [ia64], + zlib1g-dev, gawk, lzma, xz-utils, patchutils, + binutils (>= 2.22) | binutils-multiarch (>= 2.22), binutils-hppa64 (>= 2.22) [hppa], + gperf (>= 3.0.1), bison (>= 1:2.3), flex, gettext, + texinfo (>= 4.3), locales, sharutils, + procps, zlib1g-dev, libantlr-java, python, libffi-dev, fastjar, libmagic-dev, libecj-java (>= 3.3.0-2), zip, libasound2-dev [ !hurd-any !kfreebsd-any], libxtst-dev, libxt-dev, libgtk2.0-dev (>= 2.4.4-2), libart-2.0-dev, libcairo2-dev, g++-4.8 [armel armhf], netbase, + libcloog-isl-dev (>= 0.18), libmpc-dev (>= 1.0), libmpfr-dev (>= 3.0.0-9~), libgmp-dev (>= 2:5.0.1~), + dejagnu [!m68k !hurd-amd64 !hurd-i386 !hurd-alpha], autogen, realpath (>= 1.9.12), chrpath, lsb-release, quilt +Build-Depends-Indep: doxygen (>= 1.7.2), graphviz (>= 2.2), ghostscript, texlive-latex-base, xsltproc, libxml2-utils, docbook-xsl-ns, +Homepage: http://gcc.gnu.org/ +XS-Vcs-Browser: http://svn.debian.org/viewsvn/gcccvs/branches/sid/gcc-4.8/ +XS-Vcs-Svn: svn://svn.debian.org/svn/gcccvs/branches/sid/gcc-4.8 + +Package: gcc-4.8-base +Architecture: any +Multi-Arch: same +Section: libs +Priority: required +Depends: ${misc:Depends} +Replaces: ${base:Replaces} +Breaks: gcc-4.4-base (<< 4.4.7), gcj-4.4-base (<< 4.4.6-9~), gnat-4.4-base (<< 4.4.6-3~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.6 (<< 4.6.1-5~), gcc-4.7-base (<< 4.7.3), dehydra (<= 0.9.hg20110609-2) +Description: GCC, the GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). + +Package: libgcc-4.8-dev +Architecture: any +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgcc}, ${dep:libssp}, ${dep:libgomp}, ${dep:libitm}, ${dep:libatomic}, ${dep:libbtrace}, ${dep:libasan}, ${dep:libtsan}, ${dep:libqmath}, ${dep:libunwinddev}, ${shlibs:Depends}, ${misc:Depends} +Multi-Arch: same +Description: GCC support library (development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: lib64gcc-4.8-dev +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (64bit development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: lib32gcc-4.8-dev +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (32 bit development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: libhfgcc-4.8-dev +Architecture: armel +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (hard float ABI development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: libsfgcc-4.8-dev +Architecture: armhf +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (soft float ABI development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: libn32gcc-4.8-dev +Architecture: mips mipsel mips64 mips64el +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (n32 development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: libx32gcc-4.8-dev +Architecture: amd64 i386 +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC support library (x32 development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. + +Package: gcc-4.8 +Architecture: any +Section: devel +Priority: optional +Depends: cpp-4.8 (= ${gcc:Version}), gcc-4.8-base (= ${gcc:Version}), + binutils (>= ${binutils:Version}), + libgcc-4.8-dev (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Recommends: ${dep:libcdev} +Suggests: ${gcc:multilib}, gcc-4.8-doc (>= ${gcc:SoftVersion}), gcc-4.8-locales (>= ${gcc:SoftVersion}), libgcc1-dbg (>= ${libgcc:Version}), libgomp1-dbg (>= ${gcc:Version}), libitm1-dbg (>= ${gcc:Version}), libatomic1-dbg (>= ${gcc:Version}), libasan0-dbg (>= ${gcc:Version}), libtsan0-dbg (>= ${gcc:Version}), libbacktrace1-dbg (>= ${gcc:Version}), libquadmath0-dbg (>= ${gcc:Version}), ${dep:libcloog}, ${dep:gold} +Provides: c-compiler +Description: GNU C compiler + This is the GNU C compiler, a fairly portable optimizing compiler for C. + +Package: gcc-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), ${dep:libcbiarchdev}, ${dep:libgccbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU C compiler (multilib files) + This is the GNU C compiler, a fairly portable optimizing compiler for C. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: gcc-4.8-plugin-dev +Architecture: any +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), libgmp-dev (>= 2:5.0.1~), ${shlibs:Depends}, ${misc:Depends} +Description: Files for GNU GCC plugin development. + This package contains (header) files for GNU GCC plugin development. It + is only used for the development of GCC plugins, but not needed to run + plugins. + +Package: gcc-4.8-hppa64 +Architecture: hppa +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: gcc-3.3-hppa64 (<= 1:3.3.4-5), gcc-3.4-hppa64 (<= 3.4.1-3) +Description: GNU C compiler (cross compiler for hppa64) + This is the GNU C compiler, a fairly portable optimizing compiler for C. + +Package: cpp-4.8 +Architecture: any +Section: interpreters +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: gcc-4.8-locales (>= ${gcc:SoftVersion}) +Replaces: gcc-4.6 (<< 4.6.1-9) +Description: GNU C preprocessor + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. + +Package: cpp-4.8-doc +Architecture: all +Section: doc +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Description: Documentation for the GNU C preprocessor (cpp) + Documentation for the GNU C preprocessor in info format. + +Package: gcc-4.8-locales +Architecture: all +Section: devel +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), cpp-4.8 (>= ${gcc:SoftVersion}), ${misc:Depends} +Recommends: gcc-4.8 (>= ${gcc:SoftVersion}) +Description: GCC, the GNU compiler collection (native language support files) + Native language support for GCC. Lets GCC speak your language, + if translations are available. + . + Please do NOT submit bug reports in other languages than "C". + Always reset your language settings to use the "C" locales. + +Package: g++-4.8 +Architecture: any +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Provides: c++-compiler, c++abi2-dev +Suggests: ${gxx:multilib}, gcc-4.8-doc (>= ${gcc:SoftVersion}), libstdc++6-4.8-dbg (>= ${gcc:Version}) +Description: GNU C++ compiler + This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. + +Package: g++-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), g++-4.8 (= ${gcc:Version}), gcc-4.8-multilib (= ${gcc:Version}), ${dep:libcxxbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +Suggests: ${dep:libcxxbiarchdbg} +Description: GNU C++ compiler (multilib files) + This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: libgomp1 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +Provides: libgomp1-armel [armel], libgomp1-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GCC OpenMP (GOMP) support library + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libgomp1-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libgomp1 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Provides: libgomp1-dbg-armel [armel], libgomp1-dbg-armhf [armhf] +Description: GCC OpenMP (GOMP) support library (debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib32gomp1 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: GCC OpenMP (GOMP) support library (32bit) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib32gomp1-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gomp1 (= ${gcc:Version}), ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (32 bit debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib64gomp1 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (64bit) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib64gomp1-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gomp1 (= ${gcc:Version}), ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (64bit debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libn32gomp1 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (n32) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libn32gomp1-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gomp1 (= ${gcc:Version}), ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (n32 debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + +Package: libx32gomp1 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (x32) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libx32gomp1-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gomp1 (= ${gcc:Version}), ${misc:Depends} +Description: GCC OpenMP (GOMP) support library (x32 debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + +Package: libhfgomp1 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libgomp1-armhf [armel] +Description: GCC OpenMP (GOMP) support library (hard float ABI) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libhfgomp1-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgomp1 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libgomp1-dbg-armhf [armel] +Description: GCC OpenMP (GOMP) support library (hard float ABI debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + +Package: libsfgomp1 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libgomp1-armel [armhf] +Description: GCC OpenMP (GOMP) support library (soft float ABI) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libsfgomp1-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgomp1 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libgomp1-dbg-armel [armhf] +Description: GCC OpenMP (GOMP) support library (soft float ABI debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + +Package: libitm1 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libitm1-armel [armel], libitm1-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GNU Transactional Memory Library + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libitm1-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libitm1 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Provides: libitm1-dbg-armel [armel], libitm1-dbg-armhf [armhf] +Description: GNU Transactional Memory Library (debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib32itm1 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: GNU Transactional Memory Library (32bit) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib32itm1-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32itm1 (= ${gcc:Version}), ${misc:Depends} +Description: GNU Transactional Memory Library (32 bit debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib64itm1 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Transactional Memory Library (64bit) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib64itm1-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64itm1 (= ${gcc:Version}), ${misc:Depends} +Description: GNU Transactional Memory Library (64bit debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libn32itm1 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Transactional Memory Library (n32) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libn32itm1-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32itm1 (= ${gcc:Version}), ${misc:Depends} +Description: GNU Transactional Memory Library (n32 debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libx32itm1 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Transactional Memory Library (x32) + This manual documents the usage and internals of libitm. It provides + transaction support for accesses to the memory of a process, enabling + easy-to-use synchronization of accesses to shared memory by several threads. + +Package: libx32itm1-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32itm1 (= ${gcc:Version}), ${misc:Depends} +Description: GNU Transactional Memory Library (x32 debug symbols) + This manual documents the usage and internals of libitm. It provides + transaction support for accesses to the memory of a process, enabling + easy-to-use synchronization of accesses to shared memory by several threads. + +Package: libhfitm1 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libitm1-armhf [armel] +Description: GNU Transactional Memory Library (hard float ABI) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libhfitm1-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfitm1 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libitm1-armel [armhf] +Description: GNU Transactional Memory Library (hard float ABI debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libsfitm1 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Transactional Memory Library (soft float ABI) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libsfitm1-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfitm1 (= ${gcc:Version}), ${misc:Depends} +Description: GNU Transactional Memory Library (soft float ABI debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libatomic1 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libatomic1-armel [armel], libatomic1-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: support library providing __atomic built-in functions + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libatomic1-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libatomic1 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Provides: libatomic1-dbg-armel [armel], libatomic1-dbg-armhf [armhf] +Description: support library providing __atomic built-in functions (debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib32atomic1 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: support library providing __atomic built-in functions (32bit) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib32atomic1-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32atomic1 (= ${gcc:Version}), ${misc:Depends} +Description: support library providing __atomic built-in functions (32 bit debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib64atomic1 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: support library providing __atomic built-in functions (64bit) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib64atomic1-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64atomic1 (= ${gcc:Version}), ${misc:Depends} +Description: support library providing __atomic built-in functions (64bit debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libn32atomic1 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: support library providing __atomic built-in functions (n32) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libn32atomic1-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32atomic1 (= ${gcc:Version}), ${misc:Depends} +Description: support library providing __atomic built-in functions (n32 debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libx32atomic1 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: support library providing __atomic built-in functions (x32) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libx32atomic1-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32atomic1 (= ${gcc:Version}), ${misc:Depends} +Description: support library providing __atomic built-in functions (x32 debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libhfatomic1 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libatomic1-armhf [armel] +Description: support library providing __atomic built-in functions (hard float ABI) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libhfatomic1-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfatomic1 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libatomic1-armel [armhf] +Description: support library providing __atomic built-in functions (hard float ABI debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libsfatomic1 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: support library providing __atomic built-in functions (soft float ABI) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libsfatomic1-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfatomic1 (= ${gcc:Version}), ${misc:Depends} +Description: support library providing __atomic built-in functions (soft float ABI debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libasan0 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libasan0-armel [armel], libasan0-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libasan0-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libasan0 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Provides: libasan0-dbg-armel [armel], libasan0-dbg-armhf [armhf] +Description: AddressSanitizer -- a fast memory error detector (debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib32asan0 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: AddressSanitizer -- a fast memory error detector (32bit) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib32asan0-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32asan0 (= ${gcc:Version}), ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (32 bit debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib64asan0 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (64bit) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib64asan0-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64asan0 (= ${gcc:Version}), ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (64bit debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libn32asan0 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (n32) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libn32asan0-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32asan0 (= ${gcc:Version}), ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (n32 debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libx32asan0 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (x32) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libx32asan0-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32asan0 (= ${gcc:Version}), ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (x32 debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libhfasan0 +Section: libs +Architecture: armel +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libasan0-armhf [armel] +Description: AddressSanitizer -- a fast memory error detector (hard float ABI) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libhfasan0-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfasan0 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libasan0-armel [armhf] +Description: AddressSanitizer -- a fast memory error detector (hard float ABI debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libsfasan0 +Section: libs +Architecture: armhf +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (soft float ABI) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libsfasan0-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfasan0 (= ${gcc:Version}), ${misc:Depends} +Description: AddressSanitizer -- a fast memory error detector (soft float ABI debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libtsan0 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libtsan0-armel [armel], libtsan0-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: ThreadSanitizer -- a Valgrind-based detector of data races (runtime) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libtsan0-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libtsan0 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Provides: libtsan0-dbg-armel [armel], libtsan0-dbg-armhf [armhf] +Description: ThreadSanitizer -- a Valgrind-based detector of data races (debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libquadmath0 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libquadmath0-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libquadmath0 (= ${gcc:Version}), ${misc:Depends} +Multi-Arch: same +Description: GCC Quad-Precision Math Library (debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: lib32quadmath0 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: GCC Quad-Precision Math Library (32bit) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: lib32quadmath0-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32quadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (32 bit debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: lib64quadmath0 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library (64bit) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: lib64quadmath0-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64quadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (64bit debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: libn32quadmath0 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library (n32) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libn32quadmath0-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32quadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (n32 debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: libx32quadmath0 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library (x32) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libx32quadmath0-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32quadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (x32 debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: libhfquadmath0 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library (hard float ABI) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libhfquadmath0-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfquadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (hard float ABI debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: libsfquadmath0 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: GCC Quad-Precision Math Library (soft float ABI) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libsfquadmath0-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfquadmath0 (= ${gcc:Version}), ${misc:Depends} +Description: GCC Quad-Precision Math Library (hard float ABI debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: gobjc++-4.8 +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gobjc-4.8 (= ${gcc:Version}), g++-4.8 (= ${gcc:Version}), ${shlibs:Depends}, libobjc-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Suggests: ${gobjcxx:multilib}, gcc-4.8-doc (>= ${gcc:SoftVersion}) +Provides: objc++-compiler +Description: GNU Objective-C++ compiler + This is the GNU Objective-C++ compiler, which compiles + Objective-C++ on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +Package: gobjc++-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gobjc++-4.8 (= ${gcc:Version}), g++-4.8-multilib (= ${gcc:Version}), gobjc-4.8-multilib (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GNU Objective-C++ compiler (multilib files) + This is the GNU Objective-C++ compiler, which compiles Objective-C++ on + platforms supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: gobjc-4.8 +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), ${dep:libcdev}, ${shlibs:Depends}, libobjc-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Suggests: ${gobjc:multilib}, gcc-4.8-doc (>= ${gcc:SoftVersion}), libobjc4-dbg (>= ${gcc:Version}) +Provides: objc-compiler +Description: GNU Objective-C compiler + This is the GNU Objective-C compiler, which compiles + Objective-C on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +Package: gobjc-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gobjc-4.8 (= ${gcc:Version}), gcc-4.8-multilib (= ${gcc:Version}), ${dep:libobjcbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Objective-C compiler (multilib files) + This is the GNU Objective-C compiler, which compiles Objective-C on platforms + supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: libobjc-4.8-dev +Architecture: any +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libgcc-4.8-dev (= ${gcc:Version}), libobjc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Multi-Arch: same +Description: Runtime library for GNU Objective-C applications (development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: lib64objc-4.8-dev +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gcc-4.8-dev (= ${gcc:Version}), lib64objc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (64bit development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: lib32objc-4.8-dev +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gcc-4.8-dev (= ${gcc:Version}), lib32objc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (32bit development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libn32objc-4.8-dev +Architecture: mips mipsel mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gcc-4.8-dev (= ${gcc:Version}), libn32objc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (n32 development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libx32objc-4.8-dev +Architecture: amd64 i386 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gcc-4.8-dev (= ${gcc:Version}), libx32objc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (x32 development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libhfobjc-4.8-dev +Architecture: armel +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgcc-4.8-dev (= ${gcc:Version}), libhfobjc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (hard float ABI development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libsfobjc-4.8-dev +Architecture: armhf +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgcc-4.8-dev (= ${gcc:Version}), libsfobjc4 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (soft float development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libobjc4 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libobjc4-armel [armel], libobjc4-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications + Library needed for GNU ObjC applications linked against the shared library. + +Package: libobjc4-dbg +Section: debug +Architecture: any +Multi-Arch: same +Provides: libobjc4-dbg-armel [armel], libobjc4-dbg-armhf [armhf] +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libobjc4 (= ${gcc:Version}), libgcc1-dbg (>= ${libgcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib64objc4 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (64bit) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib64objc4-dbg +Section: debug +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64objc4 (= ${gcc:Version}), lib64gcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (64 bit debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib32objc4 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: Runtime library for GNU Objective-C applications (32bit) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib32objc4-dbg +Section: debug +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32objc4 (= ${gcc:Version}), lib32gcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (32 bit debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libn32objc4 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (n32) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libn32objc4-dbg +Section: debug +Architecture: mips mipsel mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32objc4 (= ${gcc:Version}), libn32gcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (n32 debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libx32objc4 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (x32) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libx32objc4-dbg +Section: debug +Architecture: amd64 i386 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32objc4 (= ${gcc:Version}), libx32gcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Description: Runtime library for GNU Objective-C applications (x32 debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libhfobjc4 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libobjc4-armhf [armel] +Description: Runtime library for GNU Objective-C applications (hard float ABI) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libhfobjc4-dbg +Section: debug +Architecture: armel +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfobjc4 (= ${gcc:Version}), libhfgcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Conflicts: libobjc4-dbg-armhf [armel] +Description: Runtime library for GNU Objective-C applications (hard float ABI debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libsfobjc4 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libobjc4-armel [armhf] +Description: Runtime library for GNU Objective-C applications (soft float ABI) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libsfobjc4-dbg +Section: debug +Architecture: armhf +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfobjc4 (= ${gcc:Version}), libsfgcc1-dbg (>= ${gcc:EpochVersion}), ${misc:Depends} +Conflicts: libobjc4-dbg-armel [armhf] +Description: Runtime library for GNU Objective-C applications (soft float ABI debug symbols) + Library needed for GNU ObjC applications linked against the shared library. + +Package: gfortran-4.8 +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), libgfortran-4.8-dev (= ${gcc:Version}), ${dep:libcdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: fortran95-compiler, ${fortran:mod-version} +Suggests: ${gfortran:multilib}, gfortran-4.8-doc, libgfortran3-dbg (>= ${gcc:Version}) +Description: GNU Fortran compiler + This is the GNU Fortran compiler, which compiles + Fortran on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +Package: gfortran-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gfortran-4.8 (= ${gcc:Version}), gcc-4.8-multilib (= ${gcc:Version}), ${dep:libgfortranbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +Description: GNU Fortran compiler (multilib files) + This is the GNU Fortran compiler, which compiles Fortran on platforms + supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: gfortran-4.8-doc +Architecture: all +Section: doc +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Description: Documentation for the GNU Fortran compiler (gfortran) + Documentation for the GNU Fortran compiler in info format. + +Package: libgfortran-4.8-dev +Architecture: any +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libgcc-4.8-dev (= ${gcc:Version}), libgfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Multi-Arch: same +Description: Runtime library for GNU Fortran applications (development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: lib64gfortran-4.8-dev +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gcc-4.8-dev (= ${gcc:Version}), lib64gfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (64bit development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: lib32gfortran-4.8-dev +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gcc-4.8-dev (= ${gcc:Version}), lib32gfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (32bit development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libn32gfortran-4.8-dev +Architecture: mips mipsel mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gcc-4.8-dev (= ${gcc:Version}), libn32gfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (n32 development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libx32gfortran-4.8-dev +Architecture: amd64 i386 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gcc-4.8-dev (= ${gcc:Version}), libx32gfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (x32 development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libhfgfortran-4.8-dev +Architecture: armel +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgcc-4.8-dev (= ${gcc:Version}), libhfgfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (hard float ABI development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libsfgfortran-4.8-dev +Architecture: armhf +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgcc-4.8-dev (= ${gcc:Version}), libsfgfortran3 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (soft float ABI development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libgfortran3 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +Provides: libgfortran3-armel [armel], libgfortran3-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libgfortran3-dbg +Section: debug +Architecture: any +Multi-Arch: same +Provides: libgfortran3-dbg-armel [armel], libgfortran3-dbg-armhf [armhf] +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libgfortran3 (= ${gcc:Version}), libgcc1-dbg (>= ${libgcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Fortran applications (debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib64gfortran3 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (64bit) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib64gfortran3-dbg +Section: debug +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gfortran3 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Fortran applications (64bit debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib32gfortran3 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: Runtime library for GNU Fortran applications (32bit) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib32gfortran3-dbg +Section: debug +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gfortran3 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Fortran applications (32 bit debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libn32gfortran3 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (n32) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libn32gfortran3-dbg +Section: debug +Architecture: mips mipsel mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gfortran3 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Fortran applications (n32 debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libx32gfortran3 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Description: Runtime library for GNU Fortran applications (x32) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libx32gfortran3-dbg +Section: debug +Architecture: amd64 i386 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gfortran3 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Fortran applications (x32 debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libhfgfortran3 +Section: libs +Architecture: armel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libgfortran3-armhf [armel] +Description: Runtime library for GNU Fortran applications (hard float ABI) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libhfgfortran3-dbg +Section: debug +Architecture: armel +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgfortran3 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libgfortran3-dbg-armhf [armel] +Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libsfgfortran3 +Section: libs +Architecture: armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: libgfortran3-armel [armhf] +Description: Runtime library for GNU Fortran applications (soft float ABI) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libsfgfortran3-dbg +Section: debug +Architecture: armhf +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgfortran3 (= ${gcc:Version}), ${misc:Depends} +Conflicts: libgfortran3-dbg-armel [armhf] +Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: gccgo-4.8 +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), libgo4 (>= ${gcc:Version}), ${dep:libcdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: go-compiler +Suggests: ${go:multilib}, gccgo-4.8-doc, libgo4-dbg (>= ${gcc:Version}) +Description: GNU Go compiler + This is the GNU Go compiler, which compiles Go on platforms supported + by the gcc compiler. It uses the gcc backend to generate optimized code. + +Package: gccgo-4.8-multilib +Architecture: amd64 armel armhf i386 kfreebsd-amd64 mips mips64 mips64el mipsel mipsn32 mipsn32el powerpc ppc64 s390 s390x sparc sparc64 x32 +Section: devel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gccgo-4.8 (= ${gcc:Version}), gcc-4.8-multilib (= ${gcc:Version}), ${dep:libgobiarch}, ${shlibs:Depends}, ${misc:Depends} +Suggests: ${dep:libgobiarchdbg} +Description: GNU Go compiler (multilib files) + This is the GNU Go compiler, which compiles Go on platforms supported + by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). + +Package: gccgo-4.8-doc +Architecture: all +Section: doc +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Description: Documentation for the GNU Go compiler (gccgo) + Documentation for the GNU Go compiler in info format. + +Package: libgo4 +Section: libs +Architecture: any +Multi-Arch: same +Pre-Depends: multiarch-support +Provides: libgo4-armel [armel], libgo4-armhf [armhf] +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Replaces: libgo3 +Description: Runtime library for GNU Go applications + Library needed for GNU Go applications linked against the + shared library. + +Package: libgo4-dbg +Section: debug +Architecture: any +Multi-Arch: same +Provides: libgo4-dbg-armel [armel], libgo4-dbg-armhf [armhf] +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libgo4 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Go applications (debug symbols) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib64go4 +Section: libs +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: lib64go3 +Description: Runtime library for GNU Go applications (64bit) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib64go4-dbg +Section: debug +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64go4 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Go applications (64bit debug symbols) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib32go4 +Section: libs +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Replaces: lib32go3 +Description: Runtime library for GNU Go applications (32bit) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib32go4-dbg +Section: debug +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32go4 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Go applications (32 bit debug symbols) + Library needed for GNU Go applications linked against the + shared library. + +Package: libn32go4 +Section: libs +Architecture: mips mipsel mips64 mips64el +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libn32go3 +Description: Runtime library for GNU Go applications (n32) + Library needed for GNU Go applications linked against the + shared library. + +Package: libn32go4-dbg +Section: debug +Architecture: mips mipsel mips64 mips64el +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32go4 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Go applications (n32 debug symbols) + Library needed for GNU Go applications linked against the + shared library. + +Package: libx32go4 +Section: libs +Architecture: amd64 i386 +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libx32go3 +Description: Runtime library for GNU Go applications (x32) + Library needed for GNU Go applications linked against the + shared library. + +Package: libx32go4-dbg +Section: debug +Architecture: amd64 i386 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32go4 (= ${gcc:Version}), ${misc:Depends} +Description: Runtime library for GNU Go applications (x32 debug symbols) + Library needed for GNU Go applications linked against the + shared library. + +Package: gcj-4.8 +Section: java +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:gcj}, ${dep:gcjcross}, ${dep:libcdev}, ${dep:ecj}, ${shlibs:Depends}, dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Recommends: libecj-java-gcj +Conflicts: gcj-4.4, cpp-4.1 (<< 4.1.1), gcc-4.1 (<< 4.1.1) +Replaces: libgcj11 (<< 4.5-20100101-1), gcj-4.8-jdk (<< 4.8.1-4) +Description: GCJ byte code and native compiler for Java(TM) + GCJ is a front end to the GCC compiler which can natively compile both + Java(tm) source and bytecode files. The compiler can also generate class + files. + +Package: gcj-4.8-jdk +Section: java +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:gcj}, ${dep:libcdev}, gcj-4.8 (= ${gcj:Version}), gcj-4.8-jre (= ${gcj:Version}), libgcj14-dev (= ${gcj:Version}), fastjar, libgcj-bc, java-common, libantlr-java, ${shlibs:Depends}, dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Recommends: libecj-java-gcj +Suggests: gcj-4.8-source (>= ${gcj:SoftVersion}), libgcj14-dbg (>= ${gcc:Version}) +Provides: java-compiler, java-sdk, java2-sdk, java5-sdk +Conflicts: gcj-4.4, cpp-4.1 (<< 4.1.1), gcc-4.1 (<< 4.1.1) +Replaces: libgcj11 (<< 4.5-20100101-1) +Description: GCJ and Classpath development tools for Java(TM) + GCJ is a front end to the GCC compiler which can natively compile both + Java(tm) source and bytecode files. The compiler can also generate class + files. Other java development tools from classpath are included in this + package. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-SDK-like interface to the GCJ tool set. + +Package: gcj-4.8-jre-headless +Priority: optional +Section: java +Architecture: any +Depends: gcc-4.8-base (= ${gcc:Version}), gcj-4.8-jre-lib (>= ${gcj:SoftVersion}), libgcj14 (= ${gcj:Version}), ${dep:prctl}, ${shlibs:Depends}, ${misc:Depends} +Suggests: fastjar, gcj-4.8-jdk (= ${gcj:Version}), libgcj14-awt (= ${gcj:Version}) +Conflicts: gij-4.4, java-gcj-compat (<< 1.0.76-4) +Replaces: gcj-4.8-jre-lib (<< 4.8-20121219-0) +Provides: java5-runtime-headless, java2-runtime-headless, java1-runtime-headless, java-runtime-headless +Description: Java runtime environment using GIJ/Classpath (headless version) + GIJ is a Java bytecode interpreter, not limited to interpreting bytecode. + It includes a class loader which can dynamically load shared objects, so + it is possible to give it the name of a class which has been compiled and + put into a shared library on the class path. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-RTE-like interface to the GIJ/GCJ tool set, + limited to the headless tools and libraries. + +Package: gcj-4.8-jre +Section: java +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcj-4.8-jre-headless (= ${gcj:Version}), libgcj14-awt (= ${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +Provides: java5-runtime, java2-runtime, java1-runtime, java-runtime +Replaces: gcj-4.8-jre-headless (<< 4.8.2-2) +Description: Java runtime environment using GIJ/Classpath + GIJ is a Java bytecode interpreter, not limited to interpreting bytecode. + It includes a class loader which can dynamically load shared objects, so + it is possible to give it the name of a class which has been compiled and + put into a shared library on the class path. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-RTE-like interface to the GIJ/GCJ tool set. + +Package: libgcj14 +Section: libs +Architecture: any +Priority: optional +Pre-Depends: multiarch-support +Multi-Arch: same +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), libgcj-common (>= 1:4.1.1-21), ${shlibs:Depends}, ${misc:Depends} +Recommends: gcj-4.8-jre-lib (>= ${gcj:SoftVersion}) +Suggests: libgcj14-dbg (>= ${gcc:Version}), libgcj14-awt (= ${gcj:Version}) +Replaces: gij-4.4 (<< 4.4.0-1), gcj-4.8-jre-headless (<< 4.8.2-5) +Description: Java runtime library for use with gcj + This is the runtime that goes along with the gcj front end to + gcc. libgcj includes parts of the Java Class Libraries, plus glue to + connect the libraries to the compiler and the underlying OS. + . + To show file names and line numbers in stack traces, the packages + libgcj14-dbg and binutils are required. + +Package: gcj-4.8-jre-lib +Section: java +Architecture: all +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), libgcj14 (>= ${gcj:SoftVersion}), ${misc:Depends} +Description: Java runtime library for use with gcj (jar files) + This is the jar file that goes along with the gcj front end to gcc. + +Package: libgcj14-awt +Section: libs +Architecture: any +Priority: optional +Pre-Depends: multiarch-support +Multi-Arch: same +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), libgcj14 (= ${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: ${pkg:gcjqt} +Description: AWT peer runtime libraries for use with gcj + These are runtime libraries holding the AWT peer implementations + for libgcj (currently the GTK+ based peer library is required, the + QT bases library is not built). + +Package: libgcj14-dev +Section: libdevel +Architecture: any +Multi-Arch: same +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libgcj14-awt (= ${gcj:Version}), libgcj-bc, ${pkg:gcjgtk}, ${pkg:gcjqt}, zlib1g-dev, ${shlibs:Depends}, ${misc:Depends} +Suggests: libgcj-doc +Description: Java development headers for use with gcj + These are the development headers that go along with the gcj front end + to gcc. libgcj includes parts of the Java Class Libraries, plus glue + to connect the libraries to the compiler and the underlying OS. + +Package: libgcj14-dbg +Section: debug +Architecture: any +Priority: extra +Pre-Depends: multiarch-support +Multi-Arch: same +Depends: gcc-4.8-base (= ${gcc:Version}), libgcj14 (= ${gcj:Version}), ${misc:Depends} +Recommends: binutils, libc6-dbg | libc-dbg +Description: Debugging symbols for libraries provided in libgcj14-dev + The package provides debugging symbols for the libraries provided + in libgcj14-dev. + . + binutils is required to show file names and line numbers in stack traces. + +Package: gcj-4.8-source +Section: java +Architecture: all +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), gcj-4.8-jdk (>= ${gcj:SoftVersion}), ${misc:Depends} +Description: GCJ java sources for use in IDEs like eclipse and netbeans + These are the java source files packaged as a zip file for use in development + environments like eclipse and netbeans. + +Package: libgcj-doc +Section: doc +Architecture: all +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), ${misc:Depends} +Enhances: libgcj14-dev +Provides: classpath-doc +Description: libgcj API documentation and example programs + Autogenerated documentation describing the API of the libgcj library. + Sources and precompiled example programs from the Classpath library. + +Package: libstdc++6 +Architecture: any +Section: libs +Priority: important +Depends: gcc-4.8-base (= ${gcc:Version}), ${dep:libc}, ${shlibs:Depends}, ${misc:Depends} +Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +Provides: libstdc++6-armel [armel], libstdc++6-armhf [armhf] +Conflicts: scim (<< 1.4.2-1) +Description: GNU Standard C++ Library v3 + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: lib32stdc++6 +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: libs +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Description: GNU Standard C++ Library v3 (32 bit Version) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + +Package: lib64stdc++6 +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: libs +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GNU Standard C++ Library v3 (64bit) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libn32stdc++6 +Architecture: mips mipsel mips64 mips64el +Section: libs +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GNU Standard C++ Library v3 (n32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libx32stdc++6 +Architecture: amd64 i386 +Section: libs +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: GNU Standard C++ Library v3 (x32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libhfstdc++6 +Architecture: armel +Section: libs +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libstdc++6-armhf [armel] +Description: GNU Standard C++ Library v3 (hard float ABI) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libsfstdc++6 +Architecture: armhf +Section: libs +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgcc1 (>= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libstdc++6-armel [armhf] +Description: GNU Standard C++ Library v3 (soft float ABI) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libstdc++-4.8-dev +Architecture: any +Multi-Arch: same +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libgcc-4.8-dev (= ${gcc:Version}), libstdc++6 (>= ${gcc:Version}), ${dep:libcdev}, ${misc:Depends} +Conflicts: libg++27-dev, libg++272-dev (<< 2.7.2.8-1), libstdc++2.8-dev, libg++2.8-dev, libstdc++2.9-dev, libstdc++2.9-glibc2.1-dev, libstdc++2.10-dev (<< 1:2.95.3-2), libstdc++3.0-dev +Suggests: libstdc++-4.8-doc +Provides: libstdc++-dev +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libstdc++-4.8-pic +Architecture: any +Multi-Arch: same +Section: libdevel +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libstdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (shared library subset kit) + This is used to develop subsets of the libstdc++ shared libraries for + use on custom installation floppies and in embedded systems. + . + Unless you are making one of those, you will not need this package. + +Package: libstdc++6-4.8-dbg +Architecture: any +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libstdc++6 (>= ${gcc:Version}), libgcc1-dbg (>= ${libgcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Multi-Arch: same +Provides: libstdc++6-4.8-dbg-armel [armel], libstdc++6-4.8-dbg-armhf [armhf] +Recommends: libstdc++-4.8-dev (= ${gcc:Version}) +Conflicts: libstdc++5-dbg, libstdc++5-3.3-dbg, libstdc++6-dbg, libstdc++6-4.0-dbg, libstdc++6-4.1-dbg, libstdc++6-4.2-dbg, libstdc++6-4.3-dbg, libstdc++6-4.4-dbg, libstdc++6-4.5-dbg, libstdc++6-4.6-dbg, libstdc++6-4.7-dbg +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: lib32stdc++-4.8-dev +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib32gcc-4.8-dev (= ${gcc:Version}), lib32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: lib32stdc++6-4.8-dbg +Architecture: amd64 ppc64 kfreebsd-amd64 s390x sparc64 x32 mipsn32 mipsn32el mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), lib32gcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: lib32stdc++6-dbg, lib32stdc++6-4.0-dbg, lib32stdc++6-4.1-dbg, lib32stdc++6-4.2-dbg, lib32stdc++6-4.3-dbg, lib32stdc++6-4.4-dbg, lib32stdc++6-4.5-dbg, lib32stdc++6-4.6-dbg, lib32stdc++6-4.7-dbg, +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: lib64stdc++-4.8-dev +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), lib64gcc-4.8-dev (= ${gcc:Version}), lib64stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: lib64stdc++6-4.8-dbg +Architecture: i386 powerpc sparc s390 mips mipsel mipsn32 mipsn32el x32 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), lib64stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), lib64gcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: lib64stdc++6-dbg, lib64stdc++6-4.0-dbg, lib64stdc++6-4.1-dbg, lib64stdc++6-4.2-dbg, lib64stdc++6-4.3-dbg, lib64stdc++6-4.4-dbg, lib64stdc++6-4.5-dbg, lib64stdc++6-4.6-dbg, lib64stdc++6-4.7-dbg +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: libn32stdc++-4.8-dev +Architecture: mips mipsel mips64 mips64el +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libn32gcc-4.8-dev (= ${gcc:Version}), libn32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libn32stdc++6-4.8-dbg +Architecture: mips mipsel mips64 mips64el +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libn32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), libn32gcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libn32stdc++6-dbg, libn32stdc++6-4.0-dbg, libn32stdc++6-4.1-dbg, libn32stdc++6-4.2-dbg, libn32stdc++6-4.3-dbg, libn32stdc++6-4.4-dbg, libn32stdc++6-4.5-dbg, libn32stdc++6-4.6-dbg, libn32stdc++6-4.7-dbg +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: libx32stdc++-4.8-dev +Architecture: amd64 i386 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libx32gcc-4.8-dev (= ${gcc:Version}), libx32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libx32stdc++6-4.8-dbg +Architecture: amd64 i386 +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libx32stdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), libx32gcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libx32stdc++6-dbg, libx32stdc++6-4.6-dbg, libx32stdc++6-4.7-dbg +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: libhfstdc++-4.8-dev +Architecture: armel +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libhfgcc-4.8-dev (= ${gcc:Version}), libhfstdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libhfstdc++6-4.8-dbg +Architecture: armel +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libhfstdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), libhfgcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libhfstdc++6-dbg, libhfstdc++6-4.3-dbg, libhfstdc++6-4.4-dbg, libhfstdc++6-4.5-dbg, libhfstdc++6-4.6-dbg, libhfstdc++6-4.7-dbg, libstdc++6-armhf [armel] +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: libsfstdc++-4.8-dev +Architecture: armhf +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), libsfgcc-4.8-dev (= ${gcc:Version}), libsfstdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), ${misc:Depends} +Description: GNU Standard C++ Library v3 (development files) + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. + +Package: libsfstdc++6-4.8-dbg +Architecture: armhf +Section: debug +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libsfstdc++6 (>= ${gcc:Version}), libstdc++-4.8-dev (= ${gcc:Version}), libsfgcc1-dbg (>= ${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: libsfstdc++6-dbg, libsfstdc++6-4.3-dbg, libsfstdc++6-4.4-dbg, libsfstdc++6-4.5-dbg, libsfstdc++6-4.6-dbg, libsfstdc++6-4.7-dbg, libstdc++6-armel [armhf] +Description: GNU Standard C++ Library v3 (debugging files) + This package contains the shared library of libstdc++ compiled with + debugging symbols. + +Package: libstdc++-4.8-doc +Architecture: all +Section: doc +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), ${misc:Depends}, libjs-jquery +Conflicts: libstdc++5-doc, libstdc++5-3.3-doc, libstdc++6-doc, libstdc++6-4.0-doc, libstdc++6-4.1-doc, libstdc++6-4.2-doc, libstdc++6-4.3-doc, libstdc++6-4.4-doc, libstdc++6-4.5-doc, libstdc++6-4.6-doc, libstdc++6-4.7-doc +Description: GNU Standard C++ Library v3 (documentation files) + This package contains documentation files for the GNU stdc++ library. + . + One set is the distribution documentation, the other set is the + source documentation including a namespace list, class hierarchy, + alphabetical list, compound list, file list, namespace members, + compound members and file members. + +Package: gdc-4.8 +Architecture: any +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), g++-4.8 (>= ${gcc:SoftVersion}), ${dep:gdccross}, ${dep:phobosdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: gdc, d-compiler, d-v2-compiler +Replaces: gdc (<< 4.4.6-5) +Description: GNU D compiler (version 2), based on the GCC backend + This is the GNU D compiler, which compiles D on platforms supported by gcc. + It uses the gcc backend to generate optimised code. + . + This compiler supports D language version 2. + +Package: libphobos-4.8-dev +Architecture: armel armhf amd64 i386 x32 kfreebsd-amd64 kfreebsd-i386 +Section: libdevel +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), zlib1g-dev, ${shlibs:Depends}, ${misc:Depends} +Provides: libphobos-dev +Replaces: gdc-4.8 (<< 4.8.2-19) +Description: Phobos D standard library + This is the Phobos standard library that comes with the D2 compiler. + . + For more information check http://www.dlang.org/phobos/ + +Package: libphobos-4.8-dbg +Section: debug +Architecture: armel armhf amd64 i386 x32 kfreebsd-amd64 kfreebsd-i386 +Priority: extra +Depends: gcc-4.8-base (= ${gcc:Version}), libphobos-4.8-dev (= ${gdc:Version}), ${misc:Depends} +Provides: libphobos-dbg +Description: The Phobos D standard library (debug symbols) + This is the Phobos standard library that comes with the D2 compiler. + . + For more information check http://www.dlang.org/phobos/ + +Package: gcc-4.8-soft-float +Architecture: arm armel armhf +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Conflicts: gcc-4.4-soft-float, gcc-4.5-soft-float, gcc-4.6-soft-float +Description: GCC soft-floating-point gcc libraries (ARM) + These are versions of basic static libraries such as libgcc.a compiled + with the -msoft-float option, for CPUs without a floating-point unit. + +Package: fixincludes +Architecture: any +Priority: optional +Depends: gcc-4.8-base (= ${gcc:Version}), gcc-4.8 (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Fix non-ANSI header files + FixIncludes was created to fix non-ANSI system header files. Many + system manufacturers supply proprietary headers that are not ANSI compliant. + The GNU compilers cannot compile non-ANSI headers. Consequently, the + FixIncludes shell script was written to fix the header files. + . + Not all packages with header files are installed on the system, when the + package is built, so we make fixincludes available at build time of other + packages, such that checking tools like lintian can make use of it. + +Package: gcc-4.8-doc +Architecture: all +Section: doc +Priority: optional +Depends: gcc-4.8-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Conflicts: gcc-docs (<< 2.95.2) +Replaces: gcc (<=2.7.2.3-4.3), gcc-docs (<< 2.95.2) +Description: Documentation for the GNU compilers (gcc, gobjc, g++) + Documentation for the GNU compilers in info format. + +Package: gcc-4.8-source +Architecture: all +Priority: optional +Depends: make (>= 3.81), autoconf2.64, quilt, patchutils, gawk, ${misc:Depends} +Description: Source of the GNU Compiler Collection + This package contains the sources and patches which are needed to + build the GNU Compiler Collection (GCC). --- gcc-4.8-4.8.2.orig/debian/control.m4 +++ gcc-4.8-4.8.2/debian/control.m4 @@ -0,0 +1,3990 @@ +divert(-1) + +define(`checkdef',`ifdef($1, , `errprint(`error: undefined macro $1 +')m4exit(1)')') +define(`errexit',`errprint(`error: undefined macro `$1' +')m4exit(1)') + +dnl The following macros must be defined, when called: +dnl ifdef(`SRCNAME', , errexit(`SRCNAME')) +dnl ifdef(`PV', , errexit(`PV')) +dnl ifdef(`ARCH', , errexit(`ARCH')) + +dnl The architecture will also be defined (-D__i386__, -D__powerpc__, etc.) + +define(`PN', `$1') +ifdef(`PRI', `', ` + define(`PRI', `$1') +') +define(`MAINTAINER', `Debian GCC Maintainers ') + +define(`depifenabled', `ifelse(index(enabled_languages, `$1'), -1, `', `$2')') +define(`ifenabled', `ifelse(index(enabled_languages, `$1'), -1, `dnl', `$2')') + +define(`CROSS_ARCH', ifdef(`CROSS_ARCH', CROSS_ARCH, `all')) +define(`libdep', `lib$2$1`'LS`'AQ (ifelse(`$3',`',`>=',`$3') ifelse(`$4',`',`${gcc:Version}',`$4'))') +define(`libdevdep', `lib$2$1`'LS`'AQ (ifelse(`$3',`',`=',`$3') ifelse(`$4',`',`${gcc:Version}',`$4'))') +define(`libdbgdep', `lib$2$1`'LS`'AQ (ifelse(`$3',`',`>=',`$3') ifelse(`$4',`',`${gcc:Version}',`$4'))') + +define(`BUILT_USING', ifelse(add_built_using,yes,`Built-Using: ${Built-Using} +')) + +divert`'dnl +dnl -------------------------------------------------------------------------- +Source: SRCNAME +Section: devel +Priority: PRI(optional) +ifelse(DIST,`Ubuntu',`dnl +ifelse(regexp(SRCNAME, `gnat\|gdc-'),0,`dnl +Maintainer: Ubuntu MOTU Developers +', `dnl +Maintainer: Ubuntu Core developers +')dnl SRCNAME +XSBC-Original-Maintainer: MAINTAINER +', `dnl +Maintainer: MAINTAINER +')dnl DIST +ifelse(regexp(SRCNAME, `gnat'),0,`dnl +Uploaders: Ludovic Brenta +', regexp(SRCNAME, `gdc'),0,`dnl +Uploaders: Iain Buclaw , Matthias Klose +', `dnl +Uploaders: Matthias Klose +')dnl SRCNAME +Standards-Version: 3.9.5 +ifdef(`TARGET',`dnl cross +Build-Depends: debhelper (>= 5.0.62), + LIBC_BUILD_DEP, LIBC_BIARCH_BUILD_DEP + LIBUNWIND_BUILD_DEP LIBATOMIC_OPS_BUILD_DEP AUTOGEN_BUILD_DEP AUTO_BUILD_DEP + SOURCE_BUILD_DEP CROSS_BUILD_DEP + CLOOG_BUILD_DEP MPC_BUILD_DEP MPFR_BUILD_DEP GMP_BUILD_DEP, + zlib1g-dev, gawk, lzma, xz-utils, patchutils, + bison (>= 1:2.3), flex, realpath (>= 1.9.12), lsb-release, quilt +',`dnl native +Build-Depends: debhelper (>= 5.0.62), GCC_MULTILIB_BUILD_DEP + LIBC_BUILD_DEP, LIBC_BIARCH_BUILD_DEP LIBC_DBG_DEP + kfreebsd-kernel-headers (>= 0.84) [kfreebsd-any], + AUTO_BUILD_DEP AUTOGEN_BUILD_DEP + libunwind7-dev (>= 0.98.5-6) [ia64], libatomic-ops-dev [ia64], + zlib1g-dev, gawk, lzma, xz-utils, patchutils, + BINUTILS_BUILD_DEP, binutils-hppa64 (>= BINUTILSBDV) [hppa], + gperf (>= 3.0.1), bison (>= 1:2.3), flex, gettext, + texinfo (>= 4.3), locales, sharutils, + procps, FORTRAN_BUILD_DEP JAVA_BUILD_DEP GNAT_BUILD_DEP GO_BUILD_DEP GDC_BUILD_DEP + CLOOG_BUILD_DEP MPC_BUILD_DEP MPFR_BUILD_DEP GMP_BUILD_DEP + CHECK_BUILD_DEP realpath (>= 1.9.12), chrpath, lsb-release, quilt +Build-Depends-Indep: LIBSTDCXX_BUILD_INDEP JAVA_BUILD_INDEP +')dnl +ifelse(regexp(SRCNAME, `gnat'),0,`dnl +Homepage: http://gcc.gnu.org/ +', regexp(SRCNAME, `gdc'),0,`dnl +Homepage: http://gdcproject.org/ +', `dnl +Homepage: http://gcc.gnu.org/ +')dnl SRCNAME +XS-Vcs-Browser: http://svn.debian.org/viewsvn/gcccvs/branches/sid/gcc`'PV/ +XS-Vcs-Svn: svn://svn.debian.org/svn/gcccvs/branches/sid/gcc`'PV + +ifelse(regexp(SRCNAME, `gcc-snapshot'),0,`dnl +Package: gcc-snapshot`'TS +Architecture: any +Section: devel +Priority: extra +Depends: binutils`'TS (>= ${binutils:Version}), ${dep:libcbiarchdev}, ${dep:libcdev}, ${dep:libunwinddev}, ${snap:depends}, ${shlibs:Depends}, ${dep:ecj}, python, ${misc:Depends} +Recommends: ${snap:recommends} +Suggests: ${dep:gold} +Provides: c++-compiler`'TS`'ifdef(`TARGET',`',`, c++abi2-dev') +BUILT_USING`'dnl +Description: A SNAPSHOT of the GNU Compiler Collection + This package contains a recent development SNAPSHOT of all files + contained in the GNU Compiler Collection (GCC). + . + The source code for this package has been exported from SVN trunk. + . + DO NOT USE THIS SNAPSHOT FOR BUILDING DEBIAN PACKAGES! + . + This package will NEVER hit the testing distribution. It is used for + tracking gcc bugs submitted to the Debian BTS in recent development + versions of gcc. +',`dnl gcc-X.Y + +dnl default base package dependencies +define(`BASETARGET', `') +define(`BASEDEP', `gcc`'PV-base (= ${gcc:Version})') +define(`SOFTBASEDEP', `gcc`'PV-base (>= ${gcc:SoftVersion})') + +dnl base, when building libgcc out of the gcj source; needed if new symbols +dnl in libgcc are used in libgcj. +ifelse(index(SRCNAME, `gcj'), 0, ` +define(`BASEDEP', `gcj`'PV-base (= ${gcj:Version})') +define(`SOFTBASEDEP', `gcj`'PV-base (>= ${gcj:SoftVersion})') +') + +ifelse(index(SRCNAME, `gnat'), 0, ` +define(`BASEDEP', `gnat`'PV-base (= ${gnat:Version})') +define(`SOFTBASEDEP', `gnat`'PV-base (>= ${gnat:SoftVersion})') +') + +ifdef(`TARGET', `', ` +ifenabled(`gccbase',` + +Package: gcc`'PV-base +Architecture: any +ifdef(`MULTIARCH', `Multi-Arch: same +')`'dnl +Section: libs +Priority: PRI(required) +Depends: ${misc:Depends} +Replaces: ${base:Replaces} +Breaks: gcc-4.4-base (<< 4.4.7), gcj-4.4-base (<< 4.4.6-9~), gnat-4.4-base (<< 4.4.6-3~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.6 (<< 4.6.1-5~), gcc-4.7-base (<< 4.7.3), dehydra (<= 0.9.hg20110609-2) +BUILT_USING`'dnl +Description: GCC, the GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). +ifdef(`BASE_ONLY', `dnl + . + This version of GCC is not yet available for this architecture. + Please use the compilers from the gcc-snapshot package for testing. +')`'dnl +')`'dnl +')`'dnl native + +ifenabled(`gccxbase',` +dnl override default base package dependencies to cross version +dnl This creates a toolchain that doesnt depend on the system -base packages +define(`BASETARGET', `PV`'TS') +define(`BASEDEP', `gcc`'BASETARGET-base (= ${gcc:Version})') +define(`SOFTBASEDEP', `gcc`'BASETARGET-base (>= ${gcc:SoftVersion})') + +Package: gcc`'BASETARGET-base +Architecture: any +Section: devel +Priority: PRI(extra) +Depends: ${misc:Depends} +BUILT_USING`'dnl +Description: GCC, the GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). +')`'dnl + +ifenabled(`java',` +ifdef(`TARGET', `', ` +ifenabled(`gcjbase',` +Package: gcj`'PV-base +Architecture: any +ifdef(`MULTIARCH', `Multi-Arch: same +')`'dnl +Section: libs +Priority: PRI(optional) +Depends: ${misc:Depends} +BUILT_USING`'dnl +Description: GCC, the GNU Compiler Collection (gcj base package) + This package contains files common to all java related packages + built from the GNU Compiler Collection (GCC). +')`'dnl gccbase +')`'dnl native + +ifenabled(`gcjxbase',` +dnl override default base package dependencies to cross version +dnl This creates a toolchain that doesnt depend on the system -base packages +define(`BASETARGET', `PV`'TS') +define(`BASEDEP', `gcj`'BASETARGET-base (= ${gcc:Version})') +define(`SOFTBASEDEP', `gcj`'BASETARGET-base (>= ${gcc:SoftVersion})') + +Package: gcj`'BASETARGET-base +Architecture: any +Section: devel +Priority: PRI(extra) +Depends: ${misc:Depends} +BUILT_USING`'dnl +Description: GCC, the GNU Compiler Collection (gcj base package) + This package contains files common to all java related packages + built from the GNU Compiler Collection (GCC). +')`'dnl +')`'dnl java + +ifenabled(`ada',` +Package: gnat`'PV-base`'TS +Architecture: any +Section: libs +Priority: PRI(optional) +Depends: ${misc:Depends} +Breaks: gcc-4.6 (<< 4.6.1-8~) +BUILT_USING`'dnl +Description: GNU Ada compiler (common files) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + This package contains files common to all GNAT related packages. +')`'dnl ada + +ifenabled(`libgcc',` +Package: libgcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',required) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libgcc1-TARGET-dcv1', +ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +')`Provides: libgcc1-armel [armel], libgcc1-armhf [armhf]') +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libgcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,,=,${gcc:EpochVersion}), ${misc:Depends} +ifdef(`TARGET',`',`dnl +ifdef(`MULTIARCH',`Multi-Arch: same +')dnl +Provides: libgcc1-dbg-armel [armel], libgcc1-dbg-armhf [armhf] +')dnl +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libgcc2`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`m68k') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',required) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libgcc2-TARGET-dcv1 +',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +'))`'dnl +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libgcc2-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`m68k') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc2,,=,${gcc:Version}), ${misc:Depends} +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libgcc + +ifenabled(`cdev',` +Package: libgcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgcc}, ${dep:libssp}, ${dep:libgomp}, ${dep:libitm}, ${dep:libatomic}, ${dep:libbtrace}, ${dep:libasan}, ${dep:libtsan}, ${dep:libqmath}, ${dep:libunwinddev}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +BUILT_USING`'dnl +Description: GCC support library (development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl libgcc + +ifenabled(`lib4gcc',` +Package: libgcc4`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`hppa') +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +'))`'dnl +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',required) +Depends: ifdef(`STANDALONEJAVA',`gcj`'PV-base (>= ${gcj:Version})',`BASEDEP'), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libgcc4-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`hppa') +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc4,,=,${gcc:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib4gcc + +ifenabled(`lib64gcc',` +Package: lib64gcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +ifdef(`TARGET',`Provides: lib64gcc1-TARGET-dcv1 +',`')`'dnl +Conflicts: libdep(gcc`'GCC_SO,,<=,1:3.3-0pre9) +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (64bit) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib64gcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,64,=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib64gcc + +ifenabled(`cdev',` +Package: lib64gcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (64bit development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl cdev + +ifenabled(`lib32gcc',` +Package: lib32gcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: extra +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +Conflicts: ${confl:lib32} +ifdef(`TARGET',`Provides: lib32gcc1-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GCC support library (32 bit Version) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib32gcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,32,=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib32gcc1 + +ifenabled(`cdev',` +Package: lib32gcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (32 bit development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl cdev + +ifenabled(`libneongcc',` +Package: libgcc1-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library [neon optimized] + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneongcc1 + +ifenabled(`libhfgcc',` +Package: libhfgcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +ifdef(`TARGET',`Provides: libhfgcc1-TARGET-dcv1 +',`Conflicts: libgcc1-armhf [biarchhf_archs] +')`'dnl +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (hard float ABI) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libhfgcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,hf,=,${gcc:EpochVersion}), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgcc1-dbg-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libhfgcc + +ifenabled(`cdev',` +ifenabled(`armml',` +Package: libhfgcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (hard float ABI development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl armml +')`'dnl cdev + +ifenabled(`libsfgcc',` +Package: libsfgcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +ifdef(`TARGET',`Provides: libsfgcc1-TARGET-dcv1 +',`Conflicts: libgcc1-armel [biarchsf_archs] +')`'dnl +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (soft float ABI) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libsfgcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,sf,=,${gcc:EpochVersion}), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgcc1-dbg-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libsfgcc + +ifenabled(`cdev',` +ifenabled(`armml',` +Package: libsfgcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (soft float ABI development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl armml +')`'dnl cdev + +ifenabled(`libn32gcc',` +Package: libn32gcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +Conflicts: libdep(gcc`'GCC_SO,,<=,1:3.3-0pre9) +ifdef(`TARGET',`Provides: libn32gcc1-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (n32) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libn32gcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,n32,=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libn32gcc + +ifenabled(`cdev',` +Package: libn32gcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (n32 development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl cdev + +ifenabled(`libx32gcc',` +Package: libx32gcc1`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${misc:Depends} +ifdef(`TARGET',`Provides: libx32gcc1-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GCC support library`'ifdef(`TARGET)',` (TARGET)', `') (x32) + Shared version of the support library, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libx32gcc1-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gcc1,x32,=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (debug symbols)`'ifdef(`TARGET)',` (TARGET)', `') + Debug symbols for the GCC support library. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libx32gcc + +ifenabled(`cdev',` +ifenabled(`x32dev',` +Package: libx32gcc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: libdevel +Priority: optional +Recommends: ${dep:libcdev} +Depends: BASEDEP, ${dep:libgccbiarch}, ${dep:libsspbiarch}, ${dep:libgompbiarch}, ${dep:libitmbiarch}, ${dep:libatomicbiarch}, ${dep:libbtracebiarch}, ${dep:libasanbiarch}, ${dep:libtsanbiarch}, ${dep:libqmathbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC support library (x32 development files) + This package contains the headers and static library files necessary for + building C programs which use libgcc, libgomp, libquadmath, libssp or libitm. +')`'dnl x32dev +')`'dnl cdev + +ifdef(`TARGET', `', ` +ifenabled(`libgmath',` +Package: libgccmath`'GCCMATH_SO`'LS +Architecture: i386 +ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`'dnl +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC math support library + Support library for GCC. + +Package: lib32gccmath`'GCCMATH_SO`'LS +Architecture: amd64 +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC math support library (32bit) + Support library for GCC. + +Package: lib64gccmath`'GCCMATH_SO`'LS +Architecture: i386 +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC math support library (64bit) + Support library for GCC. +')`'dnl +')`'dnl native + +ifenabled(`cdev',` +Package: gcc`'PV`'TS +Architecture: any +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: cpp`'PV`'TS (= ${gcc:Version}),ifenabled(`gccbase',` BASEDEP,') + binutils`'TS (>= ${binutils:Version}), + libdevdep(gcc`'PV-dev`',), ${shlibs:Depends}, ${misc:Depends} +Recommends: ${dep:libcdev} +Suggests: ${gcc:multilib}, gcc`'PV-doc (>= ${gcc:SoftVersion}), gcc`'PV-locales (>= ${gcc:SoftVersion}), libdbgdep(gcc`'GCC_SO-dbg,,>=,${libgcc:Version}), libdbgdep(gomp`'GOMP_SO-dbg,), libdbgdep(itm`'ITM_SO-dbg,), libdbgdep(atomic`'ATOMIC_SO-dbg,), libdbgdep(asan`'ASAN_SO-dbg,), libdbgdep(tsan`'TSAN_SO-dbg,), libdbgdep(backtrace`'BTRACE_SO-dbg,), libdbgdep(quadmath`'QMATH_SO-dbg,), ${dep:libcloog}, ${dep:gold} +Provides: c-compiler`'TS +ifdef(`TARGET',`Conflicts: gcc-multilib +')`'dnl +BUILT_USING`'dnl +Description: GNU C compiler`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C compiler, a fairly portable optimizing compiler for C. +ifdef(`TARGET', `dnl + . + This package contains C cross-compiler for TARGET architecture. +')`'dnl + +ifenabled(`multilib',` +Package: gcc`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcc`'PV`'TS (= ${gcc:Version}), ${dep:libcbiarchdev}, ${dep:libgccbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU C compiler (multilib files)`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C compiler, a fairly portable optimizing compiler for C. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib + +ifenabled(`plugindev',` +Package: gcc`'PV-plugin-dev`'TS +Architecture: any +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcc`'PV`'TS (= ${gcc:Version}), GMP_BUILD_DEP ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Files for GNU GCC plugin development. + This package contains (header) files for GNU GCC plugin development. It + is only used for the development of GCC plugins, but not needed to run + plugins. +')`'dnl plugindev +')`'dnl cdev + +ifenabled(`cdev',` +Package: gcc`'PV-hppa64 +Architecture: ifdef(`TARGET',`any',hppa) +Section: devel +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +Conflicts: gcc-3.3-hppa64 (<= 1:3.3.4-5), gcc-3.4-hppa64 (<= 3.4.1-3) +BUILT_USING`'dnl +Description: GNU C compiler (cross compiler for hppa64) + This is the GNU C compiler, a fairly portable optimizing compiler for C. +')`'dnl cdev + +ifenabled(`cdev',` +Package: cpp`'PV`'TS +Architecture: any +Section: ifdef(`TARGET',`devel',`interpreters') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +Suggests: gcc`'PV-locales (>= ${gcc:SoftVersion}) +Replaces: gcc-4.6 (<< 4.6.1-9) +BUILT_USING`'dnl +Description: GNU C preprocessor + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. +ifdef(`TARGET', `dnl + . + This package contains preprocessor configured for TARGET architecture. +')`'dnl + +ifdef(`TARGET', `', ` +ifenabled(`gfdldoc',` +Package: cpp`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Description: Documentation for the GNU C preprocessor (cpp) + Documentation for the GNU C preprocessor in info `format'. +')`'dnl gfdldoc +')`'dnl native + +ifdef(`TARGET', `', ` +Package: gcc`'PV-locales +Architecture: all +Section: devel +Priority: PRI(optional) +Depends: SOFTBASEDEP, cpp`'PV (>= ${gcc:SoftVersion}), ${misc:Depends} +Recommends: gcc`'PV (>= ${gcc:SoftVersion}) +Description: GCC, the GNU compiler collection (native language support files) + Native language support for GCC. Lets GCC speak your language, + if translations are available. + . + Please do NOT submit bug reports in other languages than "C". + Always reset your language settings to use the "C" locales. +')`'dnl native +')`'dnl cdev + +ifenabled(`c++',` +ifenabled(`c++dev',` +Package: g++`'PV`'TS +Architecture: any +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcc`'PV`'TS (= ${gcc:Version}), libdevdep(stdc++`'PV-dev,,=), ${shlibs:Depends}, ${misc:Depends} +Provides: c++-compiler`'TS`'ifdef(`TARGET)',`',`, c++abi2-dev') +Suggests: ${gxx:multilib}, gcc`'PV-doc (>= ${gcc:SoftVersion}), libdbgdep(stdc++CXX_SO`'PV-dbg,) +BUILT_USING`'dnl +Description: GNU C++ compiler`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. +ifdef(`TARGET', `dnl + . + This package contains C++ cross-compiler for TARGET architecture. +')`'dnl + +ifenabled(`multilib',` +Package: g++`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, g++`'PV`'TS (= ${gcc:Version}), gcc`'PV-multilib`'TS (= ${gcc:Version}), ${dep:libcxxbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +Suggests: ${dep:libcxxbiarchdbg} +BUILT_USING`'dnl +Description: GNU C++ compiler (multilib files)`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib +')`'dnl c++dev +')`'dnl c++ + +ifdef(`TARGET', `', ` +ifenabled(`ssp',` +Package: libssp`'SSP_SO`'LS +Architecture: any +ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`'dnl +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC stack smashing protection library + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: lib32ssp`'SSP_SO`'LS +Architecture: biarch32_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libssp0 (<< 4.1) +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: GCC stack smashing protection library (32bit) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: lib64ssp`'SSP_SO`'LS +Architecture: biarch64_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libssp0 (<< 4.1) +BUILT_USING`'dnl +Description: GCC stack smashing protection library (64bit) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: libn32ssp`'SSP_SO`'LS +Architecture: biarchn32_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libssp0 (<< 4.1) +BUILT_USING`'dnl +Description: GCC stack smashing protection library (n32) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: libx32ssp`'SSP_SO`'LS +Architecture: biarchx32_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libssp0 (<< 4.1) +BUILT_USING`'dnl +Description: GCC stack smashing protection library (x32) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: libhfssp`'SSP_SO`'LS +Architecture: biarchhf_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC stack smashing protection library (hard float ABI) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. + +Package: libsfssp`'SSP_SO`'LS +Architecture: biarchsf_archs +Section: libs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC stack smashing protection library (soft float ABI) + GCC can now emit code for protecting applications from stack-smashing attacks. + The protection is realized by buffer overflow detection and reordering of + stack variables to avoid pointer corruption. +')`'dnl +')`'dnl native + +ifenabled(`libgomp',` +Package: libgomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +')`Provides: libgomp'GOMP_SO`-armel [armel], libgomp'GOMP_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libgomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libgomp'GOMP_SO`-dbg-armel [armel], libgomp'GOMP_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib32gomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (32bit) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib32gomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (32 bit debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib64gomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (64bit) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: lib64gomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (64bit debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libn32gomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (n32) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libn32gomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (n32 debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + +ifenabled(`libx32gomp',` +Package: libx32gomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (x32) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libx32gomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (x32 debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers +')`'dnl libx32gomp + +ifenabled(`libhfgomp',` +Package: libhfgomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (hard float ABI) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libhfgomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-dbg-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (hard float ABI debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers +')`'dnl libhfgomp + +ifenabled(`libsfgomp',` +Package: libsfgomp`'GOMP_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (soft float ABI) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libsfgomp`'GOMP_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(gomp`'GOMP_SO,sf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgomp'GOMP_SO`-dbg-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library (soft float ABI debug symbols) + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers +')`'dnl libsfgomp + +ifenabled(`libneongomp',` +Package: libgomp`'GOMP_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC OpenMP (GOMP) support library [neon optimized] + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneongomp +')`'dnl libgomp + +ifenabled(`libitm',` +Package: libitm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libitm'ITM_SO`-armel [armel], libitm'ITM_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libitm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libitm'ITM_SO`-dbg-armel [armel], libitm'ITM_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib32itm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (32bit) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib32itm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (32 bit debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib64itm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (64bit) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: lib64itm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (64bit debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libn32itm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (n32) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libn32itm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (n32 debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +ifenabled(`libx32itm',` +Package: libx32itm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (x32) + This manual documents the usage and internals of libitm. It provides + transaction support for accesses to the memory of a process, enabling + easy-to-use synchronization of accesses to shared memory by several threads. + +Package: libx32itm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (x32 debug symbols) + This manual documents the usage and internals of libitm. It provides + transaction support for accesses to the memory of a process, enabling + easy-to-use synchronization of accesses to shared memory by several threads. +')`'dnl libx32itm + +ifenabled(`libhfitm',` +Package: libhfitm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libitm'ITM_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (hard float ABI) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libhfitm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libitm'ITM_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (hard float ABI debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. +')`'dnl libhfitm + +ifenabled(`libsfitm',` +Package: libsfitm`'ITM_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (soft float ABI) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + +Package: libsfitm`'ITM_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(itm`'ITM_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library (soft float ABI debug symbols) + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. +')`'dnl libsfitm + +ifenabled(`libneonitm',` +Package: libitm`'ITM_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Transactional Memory Library [neon optimized] + GNU Transactional Memory Library (libitm) provides transaction support for + accesses to the memory of a process, enabling easy-to-use synchronization of + accesses to shared memory by several threads. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneonitm +')`'dnl libitm + +ifenabled(`libatomic',` +Package: libatomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libatomic'ATOMIC_SO`-armel [armel], libatomic'ATOMIC_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libatomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libatomic'ATOMIC_SO`-dbg-armel [armel], libatomic'ATOMIC_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib32atomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (32bit) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib32atomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (32 bit debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib64atomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (64bit) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: lib64atomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (64bit debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libn32atomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (n32) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libn32atomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (n32 debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +ifenabled(`libx32atomic',` +Package: libx32atomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (x32) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libx32atomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (x32 debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. +')`'dnl libx32atomic + +ifenabled(`libhfatomic',` +Package: libhfatomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libatomic'ATOMIC_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (hard float ABI) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libhfatomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libatomic'ATOMIC_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (hard float ABI debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. +')`'dnl libhfatomic + +ifenabled(`libsfatomic',` +Package: libsfatomic`'ATOMIC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (soft float ABI) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libsfatomic`'ATOMIC_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(atomic`'ATOMIC_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions (soft float ABI debug symbols) + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. +')`'dnl libsfatomic + +ifenabled(`libneonatomic',` +Package: libatomic`'ATOMIC_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: support library providing __atomic built-in functions [neon optimized] + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneonatomic +')`'dnl libatomic + +ifenabled(`libasan',` +Package: libasan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libasan'ASAN_SO`-armel [armel], libasan'ASAN_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libasan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libasan'ASAN_SO`-dbg-armel [armel], libasan'ASAN_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib32asan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (32bit) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib32asan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (32 bit debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib64asan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (64bit) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: lib64asan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (64bit debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libn32asan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(extra)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (n32) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libn32asan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (n32 debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +ifenabled(`libx32asan',` +Package: libx32asan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (x32) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libx32asan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (x32 debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. +')`'dnl libx32asan + +ifenabled(`libhfasan',` +Package: libhfasan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(extra)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libasan'ASAN_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (hard float ABI) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libhfasan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libasan'ASAN_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (hard float ABI debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. +')`'dnl libhfasan + +ifenabled(`libsfasan',` +Package: libsfasan`'ASAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(extra)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (soft float ABI) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + +Package: libsfasan`'ASAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(asan`'ASAN_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector (soft float ABI debug symbols) + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. +')`'dnl libsfasan + +ifenabled(`libneonasan',` +Package: libasan`'ASAN_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AddressSanitizer -- a fast memory error detector [neon optimized] + AddressSanitizer (ASan) is a fast memory error detector. It finds + use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneonasan +')`'dnl libasan + +ifenabled(`libtsan',` +Package: libtsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libtsan'TSAN_SO`-armel [armel], libtsan'TSAN_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (runtime) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libtsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libtsan'TSAN_SO`-dbg-armel [armel], libtsan'TSAN_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +ifenabled(`lib32tsan',` +Package: lib32tsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (32bit) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: lib32tsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (32 bit debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. +')`'dnl lib32tsan + +ifenabled(`lib64tsan',` +Package: lib64tsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (64bit) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: lib64tsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (64bit debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. +')`'dnl lib64tsan + +ifenabled(`libn32tsan',` +Package: libn32tsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (n32) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libn32tsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (n32 debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. +')`'dnl libn32tsan + +ifenabled(`libx32tsan',` +Package: libx32tsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (x32) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libx32tsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (x32 debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. +')`'dnl libx32tsan + +ifenabled(`libhftsan',` +Package: libhftsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libtsan'TSAN_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (hard float ABI) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libhftsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libtsan'TSAN_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (hard float ABI debug symbols) +')`'dnl libhftsan + +ifenabled(`libsftsan',` +Package: libsftsan`'TSAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (soft float ABI) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + +Package: libsftsan`'TSAN_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(tsan`'TSAN_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races (soft float ABI debug symbols) + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. +')`'dnl libsftsan + +ifenabled(`libneontsan',` +Package: libtsan`'TSAN_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: ThreadSanitizer -- a Valgrind-based detector of data races [neon optimized] + ThreadSanitizer (Tsan) is a data race detector for C/C++ programs. + The Linux and Mac versions are based on Valgrind. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneontsan +')`'dnl libtsan + +ifenabled(`libbacktrace',` +Package: libbacktrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libbacktrace'BTRACE_SO`-armel [armel], libbacktrace'BTRACE_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libbacktrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libbacktrace'BTRACE_SO`-dbg-armel [armel], libbacktrace'BTRACE_SO`-dbg-armhf [armhf]') +BUILT_USING`'dnl +Description: stack backtrace library (debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: lib32backtrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: stack backtrace library (32bit) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: lib32backtrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (32 bit debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: lib64backtrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (64bit) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: lib64backtrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (64bit debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libn32backtrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (n32) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libn32backtrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (n32 debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +ifenabled(`libx32backtrace',` +Package: libx32backtrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (x32) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libx32backtrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (x32 debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. +')`'dnl libx32backtrace + +ifenabled(`libhfbacktrace',` +Package: libhfbacktrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libbacktrace'BTRACE_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: stack backtrace library (hard float ABI) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libhfbacktrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,hf,=), ${misc:Depends} +wifdef(`TARGET',`dnl',`Conflicts: libbacktrace'BTRACE_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: stack backtrace library (hard float ABI debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. +')`'dnl libhfbacktrace + +ifenabled(`libsfbacktrace',` +Package: libsfbacktrace`'BTRACE_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (soft float ABI) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + +Package: libsfbacktrace`'BTRACE_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(backtrace`'BTRACE_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library (soft float ABI debug symbols) + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. +')`'dnl libsfbacktrace + +ifenabled(`libneonbacktrace',` +Package: libbacktrace`'BTRACE_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: stack backtrace library [neon optimized] + libbacktrace uses the GCC unwind interface to collect a stack trace, + and parses DWARF debug info to get file/line/function information. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneonbacktrace +')`'dnl libbacktrace + + +ifenabled(`libqmath',` +Package: libquadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libquadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,,=), ${misc:Depends} +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: lib32quadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (32bit) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: lib32quadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (32 bit debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: lib64quadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (64bit) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: lib64quadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (64bit debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +Package: libn32quadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (n32) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libn32quadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (n32 debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. + +ifenabled(`libx32qmath',` +Package: libx32quadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (x32) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libx32quadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (x32 debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. +')`'dnl libx32qmath + +ifenabled(`libhfqmath',` +Package: libhfquadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (hard float ABI) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libhfquadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,hf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (hard float ABI debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. +')`'dnl libhfqmath + +ifenabled(`libsfqmath',` +Package: libsfquadmath`'QMATH_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (soft float ABI) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. The library is used to provide on such + targets the REAL(16) type in the GNU Fortran compiler. + +Package: libsfquadmath`'QMATH_SO-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(quadmath`'QMATH_SO,sf,=), ${misc:Depends} +BUILT_USING`'dnl +Description: GCC Quad-Precision Math Library (hard float ABI debug symbols) + A library, which provides quad-precision mathematical functions on targets + supporting the __float128 datatype. +')`'dnl libsfqmath +')`'dnl libqmath + +ifenabled(`objpp',` +ifenabled(`objppdev',` +Package: gobjc++`'PV`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gobjc`'PV`'TS (= ${gcc:Version}), g++`'PV`'TS (= ${gcc:Version}), ${shlibs:Depends}, libdevdep(objc`'PV-dev,,=), ${misc:Depends} +Suggests: ${gobjcxx:multilib}, gcc`'PV-doc (>= ${gcc:SoftVersion}) +Provides: objc++-compiler`'TS +BUILT_USING`'dnl +Description: GNU Objective-C++ compiler + This is the GNU Objective-C++ compiler, which compiles + Objective-C++ on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. +')`'dnl obcppdev + +ifenabled(`multilib',` +Package: gobjc++`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gobjc++`'PV`'TS (= ${gcc:Version}), g++`'PV-multilib`'TS (= ${gcc:Version}), gobjc`'PV-multilib`'TS (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Objective-C++ compiler (multilib files) + This is the GNU Objective-C++ compiler, which compiles Objective-C++ on + platforms supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib +')`'dnl obcpp + +ifenabled(`objc',` +ifenabled(`objcdev',` +Package: gobjc`'PV`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcc`'PV`'TS (= ${gcc:Version}), ${dep:libcdev}, ${shlibs:Depends}, libdevdep(objc`'PV-dev,,=), ${misc:Depends} +Suggests: ${gobjc:multilib}, gcc`'PV-doc (>= ${gcc:SoftVersion}), libdbgdep(objc`'OBJC_SO-dbg,) +Provides: objc-compiler`'TS +ifdef(`__sparc__',`Conflicts: gcc`'PV-sparc64', `dnl') +BUILT_USING`'dnl +Description: GNU Objective-C compiler + This is the GNU Objective-C compiler, which compiles + Objective-C on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +ifenabled(`multilib',` +Package: gobjc`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gobjc`'PV`'TS (= ${gcc:Version}), gcc`'PV-multilib`'TS (= ${gcc:Version}), ${dep:libobjcbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Objective-C compiler (multilib files)`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU Objective-C compiler, which compiles Objective-C on platforms + supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib + +Package: libobjc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,), libdep(objc`'OBJC_SO,), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: lib64objc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,64), libdep(objc`'OBJC_SO,64), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (64bit development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: lib32objc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,32), libdep(objc`'OBJC_SO,32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (32bit development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +Package: libn32objc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,n32), libdep(objc`'OBJC_SO,n32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (n32 development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. + +ifenabled(`x32dev',` +Package: libx32objc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,x32), libdep(objc`'OBJC_SO,x32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (x32 development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. +')`'dnl libx32objc + +ifenabled(`armml',` +Package: libhfobjc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,hf), libdep(objc`'OBJC_SO,hf), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (hard float ABI development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. +')`'dnl armml + +ifenabled(`armml',` +Package: libsfobjc`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev,sf), libdep(objc`'OBJC_SO,sf), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (soft float development files) + This package contains the headers and static library files needed to build + GNU ObjC applications. +')`'dnl armml +')`'dnl objcdev + +ifenabled(`libobjc',` +Package: libobjc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +ifelse(OBJC_SO,`2',`Breaks: ${multiarch:breaks} +',`')')`Provides: libobjc'OBJC_SO`-armel [armel], libobjc'OBJC_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications + Library needed for GNU ObjC applications linked against the shared library. + +Package: libobjc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libobjc'OBJC_SO`-dbg-armel [armel], libobjc'OBJC_SO`-dbg-armhf [armhf]') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,,=), libdbgdep(gcc`'GCC_SO-dbg,,>=,${libgcc:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libobjc + +ifenabled(`lib64objc',` +Package: lib64objc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (64bit) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib64objc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,64,=), libdbgdep(gcc`'GCC_SO-dbg,64,>=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (64 bit debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl lib64objc + +ifenabled(`lib32objc',` +Package: lib32objc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (32bit) + Library needed for GNU ObjC applications linked against the shared library. + +Package: lib32objc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,32,=), libdbgdep(gcc`'GCC_SO-dbg,32,>=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (32 bit debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl lib32objc + +ifenabled(`libn32objc',` +Package: libn32objc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (n32) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libn32objc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,n32,=), libdbgdep(gcc`'GCC_SO-dbg,n32,>=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (n32 debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libn32objc + +ifenabled(`libx32objc',` +Package: libx32objc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (x32) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libx32objc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,x32,=), libdbgdep(gcc`'GCC_SO-dbg,x32,>=,${gcc:EpochVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (x32 debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libx32objc + +ifenabled(`libhfobjc',` +Package: libhfobjc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (hard float ABI) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libhfobjc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,hf,=), libdbgdep(gcc`'GCC_SO-dbg,hf,>=,${gcc:EpochVersion}), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-dbg-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (hard float ABI debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libhfobjc + +ifenabled(`libsfobjc',` +Package: libsfobjc`'OBJC_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (soft float ABI) + Library needed for GNU ObjC applications linked against the shared library. + +Package: libsfobjc`'OBJC_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: extra +Depends: BASEDEP, libdep(objc`'OBJC_SO,sf,=), libdbgdep(gcc`'GCC_SO-dbg,sf,>=,${gcc:EpochVersion}), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libobjc'OBJC_SO`-dbg-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications (soft float ABI debug symbols) + Library needed for GNU ObjC applications linked against the shared library. +')`'dnl libsfobjc + +ifenabled(`libneonobjc',` +Package: libobjc`'OBJC_SO-neon`'LS +Section: libs +Architecture: NEON_ARCHS +Priority: PRI(optional) +Depends: BASEDEP, libc6-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Objective-C applications [NEON version] + Library needed for GNU ObjC applications linked against the shared library. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneonobjc +')`'dnl objc + +ifenabled(`fortran',` +ifenabled(`fdev',` +Package: gfortran`'PV`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcc`'PV`'TS (= ${gcc:Version}), libdevdep(gfortran`'PV-dev,,=), ${dep:libcdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: fortran95-compiler, ${fortran:mod-version} +Suggests: ${gfortran:multilib}, gfortran`'PV-doc, libdbgdep(gfortran`'FORTRAN_SO-dbg,) +BUILT_USING`'dnl +Description: GNU Fortran compiler + This is the GNU Fortran compiler, which compiles + Fortran on platforms supported by the gcc compiler. It uses the + gcc backend to generate optimized code. + +ifenabled(`multilib',` +Package: gfortran`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gfortran`'PV`'TS (= ${gcc:Version}), gcc`'PV-multilib`'TS (= ${gcc:Version}), ${dep:libgfortranbiarchdev}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Fortran compiler (multilib files)`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU Fortran compiler, which compiles Fortran on platforms + supported by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib + +ifenabled(`gfdldoc',` +Package: gfortran`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Description: Documentation for the GNU Fortran compiler (gfortran) + Documentation for the GNU Fortran compiler in info `format'. +')`'dnl gfdldoc + +Package: libgfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',), libdep(gfortran`'FORTRAN_SO,), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: lib64gfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',64), libdep(gfortran`'FORTRAN_SO,64), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (64bit development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: lib32gfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',32), libdep(gfortran`'FORTRAN_SO,32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (32bit development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +Package: libn32gfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',n32), libdep(gfortran`'FORTRAN_SO,n32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (n32 development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. + +ifenabled(`x32dev',` +Package: libx32gfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',x32), libdep(gfortran`'FORTRAN_SO,x32), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (x32 development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. +')`'dnl libx32gfortran + +ifenabled(`armml',` +Package: libhfgfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',hf), libdep(gfortran`'FORTRAN_SO,hf), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (hard float ABI development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. +')`'dnl armml + +ifenabled(`armml',` +Package: libsfgfortran`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: libdevel +Priority: optional +Depends: BASEDEP, libdevdep(gcc`'PV-dev`',sf), libdep(gfortran`'FORTRAN_SO,sf), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (soft float ABI development files) + This package contains the headers and static library files needed to build + GNU Fortran applications. +')`'dnl armml +')`'dnl fdev + +ifenabled(`libgfortran',` +Package: libgfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +')`Provides: libgfortran'FORTRAN_SO`-armel [armel], libgfortran'FORTRAN_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libgfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libgfortran'FORTRAN_SO`-dbg-armel [armel], libgfortran'FORTRAN_SO`-dbg-armhf [armhf]') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,,=), libdbgdep(gcc`'GCC_SO-dbg,,>=,${libgcc:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl libgfortran + +ifenabled(`lib64gfortran',` +Package: lib64gfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (64bit) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib64gfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (64bit debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl lib64gfortran + +ifenabled(`lib32gfortran',` +Package: lib32gfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (32bit) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: lib32gfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (32 bit debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl lib32gfortran + +ifenabled(`libn32gfortran',` +Package: libn32gfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (n32) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libn32gfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (n32 debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl libn32gfortran + +ifenabled(`libx32gfortran',` +Package: libx32gfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (x32) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libx32gfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (x32 debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl libx32gfortran + +ifenabled(`libhfgfortran',` +Package: libhfgfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (hard float ABI) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libhfgfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,hf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-dbg-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl libhfgfortran + +ifenabled(`libsfgfortran',` +Package: libsfgfortran`'FORTRAN_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (soft float ABI) + Library needed for GNU Fortran applications linked against the + shared library. + +Package: libsfgfortran`'FORTRAN_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Priority: extra +Depends: BASEDEP, libdep(gfortran`'FORTRAN_SO,sf,=), ${misc:Depends} +ifdef(`TARGET',`dnl',`Conflicts: libgfortran'FORTRAN_SO`-dbg-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications (hard float ABI debug symbols) + Library needed for GNU Fortran applications linked against the + shared library. +')`'dnl libsfgfortran + +ifenabled(`libneongfortran',` +Package: libgfortran`'FORTRAN_SO-neon`'LS +Section: libs +Architecture: NEON_ARCHS +ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +')`'dnl +Priority: extra +Depends: BASEDEP, libgcc1-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Fortran applications [NEON version] + Library needed for GNU Fortran applications linked against the + shared library. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl libneongfortran +')`'dnl fortran + +ifenabled(`ggo',` +ifenabled(`godev',` +Package: gccgo`'PV`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ifdef(`STANDALONEGO',,`gcc`'PV`'TS (= ${gcc:Version}), ')libdep(go`'GO_SO,), ${dep:libcdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: go-compiler +Suggests: ${go:multilib}, gccgo`'PV-doc, libdbgdep(go`'GO_SO-dbg,) +BUILT_USING`'dnl +Description: GNU Go compiler + This is the GNU Go compiler, which compiles Go on platforms supported + by the gcc compiler. It uses the gcc backend to generate optimized code. + +ifenabled(`multilib',` +Package: gccgo`'PV-multilib`'TS +Architecture: ifdef(`TARGET',`any',MULTILIB_ARCHS) +Section: devel +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gccgo`'PV`'TS (= ${gcc:Version}), ifdef(`STANDALONEGO',,`gcc`'PV-multilib`'TS (= ${gcc:Version}), ')${dep:libgobiarch}, ${shlibs:Depends}, ${misc:Depends} +Suggests: ${dep:libgobiarchdbg} +BUILT_USING`'dnl +Description: GNU Go compiler (multilib files)`'ifdef(`TARGET)',` (cross compiler for TARGET architecture)', `') + This is the GNU Go compiler, which compiles Go on platforms supported + by the gcc compiler. + . + On architectures with multilib support, the package contains files + and dependencies for the non-default multilib architecture(s). +')`'dnl multilib + +ifenabled(`gfdldoc',` +Package: gccgo`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +BUILT_USING`'dnl +Description: Documentation for the GNU Go compiler (gccgo) + Documentation for the GNU Go compiler in info `format'. +')`'dnl gfdldoc +')`'dnl fdev + +ifenabled(`libggo',` +Package: libgo`'GO_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +')`Provides: libgo'GO_SO`-armel [armel], libgo'GO_SO`-armhf [armhf]') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +Replaces: libgo3`'LS +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications + Library needed for GNU Go applications linked against the + shared library. + +Package: libgo`'GO_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +')`Provides: libgo'GO_SO`-dbg-armel [armel], libgo'GO_SO`-dbg-armhf [armhf]') +Priority: extra +Depends: BASEDEP, libdep(go`'GO_SO,,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (debug symbols) + Library needed for GNU Go applications linked against the + shared library. +')`'dnl libgo + +ifenabled(`lib64ggo',` +Package: lib64go`'GO_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: lib64go3`'LS +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (64bit) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib64go`'GO_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Priority: extra +Depends: BASEDEP, libdep(go`'GO_SO,64,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (64bit debug symbols) + Library needed for GNU Go applications linked against the + shared library. +')`'dnl lib64go + +ifenabled(`lib32ggo',` +Package: lib32go`'GO_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +Replaces: lib32go3`'LS +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (32bit) + Library needed for GNU Go applications linked against the + shared library. + +Package: lib32go`'GO_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Priority: extra +Depends: BASEDEP, libdep(go`'GO_SO,32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (32 bit debug symbols) + Library needed for GNU Go applications linked against the + shared library. +')`'dnl lib32go + +ifenabled(`libn32ggo',` +Package: libn32go`'GO_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libn32go3`'LS +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (n32) + Library needed for GNU Go applications linked against the + shared library. + +Package: libn32go`'GO_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Priority: extra +Depends: BASEDEP, libdep(go`'GO_SO,n32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (n32 debug symbols) + Library needed for GNU Go applications linked against the + shared library. +')`'dnl libn32go + +ifenabled(`libx32ggo',` +Package: libx32go`'GO_SO`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +Replaces: libx32go3`'LS +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (x32) + Library needed for GNU Go applications linked against the + shared library. + +Package: libx32go`'GO_SO-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Priority: extra +Depends: BASEDEP, libdep(go`'GO_SO,x32,=), ${misc:Depends} +BUILT_USING`'dnl +Description: Runtime library for GNU Go applications (x32 debug symbols) + Library needed for GNU Go applications linked against the + shared library. +')`'dnl libx32go +')`'dnl ggo + +ifenabled(`java',` +ifenabled(`gcj',` +Package: gcj`'PV`'TS +Section: java +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:gcj}, ${dep:gcjcross}, ${dep:libcdev}, ${dep:ecj}, ${shlibs:Depends}, dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Recommends: libecj-java-gcj +Conflicts: gcj-4.4, cpp-4.1 (<< 4.1.1), gcc-4.1 (<< 4.1.1) +Replaces: libgcj11 (<< 4.5-20100101-1), gcj`'PV-jdk`'TS (<< 4.8.1-4) +BUILT_USING`'dnl +Description: GCJ byte code and native compiler for Java(TM) + GCJ is a front end to the GCC compiler which can natively compile both + Java(tm) source and bytecode files. The compiler can also generate class + files. +')`'dnl gcj + +ifenabled(`libgcj',` +ifenabled(`libgcjcommon',` +Package: libgcj-common +Section: java +Architecture: all +Priority: PRI(optional) +Depends: BASEDEP, ${misc:Depends} +Conflicts: classpath (<= 0.04-4) +Replaces: java-gcj-compat (<< 1.0.65-3), java-gcj-compat-dev (<< 1.0.65-3) +BUILT_USING`'dnl +Description: Java runtime library (common files) + This package contains files shared by Classpath and libgcj libraries. +')`'dnl libgcjcommon + + +Package: gcj`'PV-jdk`'TS +Section: java +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, ${dep:gcj}, ${dep:libcdev}, gcj`'PV`'TS (= ${gcj:Version}), gcj`'PV-jre`'TS (= ${gcj:Version}), libdevdep(gcj`'GCJ_SO-dev,,=,${gcj:Version}), fastjar, libgcj-bc`'LS, java-common, libantlr-java, ${shlibs:Depends}, dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Recommends: libecj-java-gcj +Suggests: gcj`'PV-source (>= ${gcj:SoftVersion}), libdbgdep(gcj`'GCJ_SO-dbg,) +Provides: java-compiler, java-sdk, java2-sdk, java5-sdk +Conflicts: gcj-4.4, cpp-4.1 (<< 4.1.1), gcc-4.1 (<< 4.1.1) +Replaces: libgcj11 (<< 4.5-20100101-1) +BUILT_USING`'dnl +Description: GCJ and Classpath development tools for Java(TM) + GCJ is a front end to the GCC compiler which can natively compile both + Java(tm) source and bytecode files. The compiler can also generate class + files. Other java development tools from classpath are included in this + package. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-SDK-like interface to the GCJ tool set. + +Package: gcj`'PV-jre-headless`'TS +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Section: java +Architecture: any +Depends: BASEDEP, gcj`'PV-jre-lib`'TS (>= ${gcj:SoftVersion}), libdep(gcj`'LIBGCJ_EXT,,=,${gcj:Version}), ${dep:prctl}, ${shlibs:Depends}, ${misc:Depends} +Suggests: fastjar, gcj`'PV-jdk`'TS (= ${gcj:Version}), libdep(gcj`'LIBGCJ_EXT-awt,,=,${gcj:Version}) +Conflicts: gij-4.4, java-gcj-compat (<< 1.0.76-4) +Replaces: gcj-4.8-jre-lib`'TS (<< 4.8-20121219-0) +Provides: java5-runtime-headless, java2-runtime-headless, java1-runtime-headless, java-runtime-headless +BUILT_USING`'dnl +Description: Java runtime environment using GIJ/Classpath (headless version) + GIJ is a Java bytecode interpreter, not limited to interpreting bytecode. + It includes a class loader which can dynamically load shared objects, so + it is possible to give it the name of a class which has been compiled and + put into a shared library on the class path. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-RTE-like interface to the GIJ/GCJ tool set, + limited to the headless tools and libraries. + +Package: gcj`'PV-jre`'TS +Section: java +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: BASEDEP, gcj`'PV-jre-headless`'TS (= ${gcj:Version}), libdep(gcj`'LIBGCJ_EXT-awt,,=,${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +Provides: java5-runtime, java2-runtime, java1-runtime, java-runtime +Replaces: gcj-4.8-jre-headless`'TS (<< 4.8.2-2) +BUILT_USING`'dnl +Description: Java runtime environment using GIJ/Classpath + GIJ is a Java bytecode interpreter, not limited to interpreting bytecode. + It includes a class loader which can dynamically load shared objects, so + it is possible to give it the name of a class which has been compiled and + put into a shared library on the class path. + . + The package contains as well a collection of wrapper scripts and symlinks. + It is meant to provide a Java-RTE-like interface to the GIJ/GCJ tool set. + +Package: libgcj`'LIBGCJ_EXT`'LS +Section: libs +Architecture: any +Priority: PRI(optional) +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: SOFTBASEDEP, libgcj-common (>= 1:4.1.1-21), ${shlibs:Depends}, ${misc:Depends} +Recommends: gcj`'PV-jre-lib`'TS (>= ${gcj:SoftVersion}) +Suggests: libdbgdep(gcj`'GCJ_SO-dbg,), libdep(gcj`'LIBGCJ_EXT-awt,,=,${gcj:Version}) +Replaces: gij-4.4 (<< 4.4.0-1), gcj-4.8-jre-headless`'TS (<< 4.8.2-5) +BUILT_USING`'dnl +Description: Java runtime library for use with gcj + This is the runtime that goes along with the gcj front end to + gcc. libgcj includes parts of the Java Class Libraries, plus glue to + connect the libraries to the compiler and the underlying OS. + . + To show file names and line numbers in stack traces, the packages + libgcj`'GCJ_SO-dbg and binutils are required. + +Package: gcj`'PV-jre-lib`'TS +Section: java +Architecture: all +Priority: PRI(optional) +Depends: SOFTBASEDEP, libdep(gcj`'LIBGCJ_EXT,,>=,${gcj:SoftVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: Java runtime library for use with gcj (jar files) + This is the jar file that goes along with the gcj front end to gcc. + +ifenabled(`gcjbc',` +Package: libgcj-bc +Section: java +Architecture: any +Priority: PRI(optional) +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: BASEDEP, libdep(gcj`'LIBGCJ_EXT,,>=,${gcj:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: Link time only library for use with gcj + A fake library that is used at link time only. It ensures that + binaries built with the BC-ABI link against a constant SONAME. + This way, BC-ABI binaries continue to work if the SONAME underlying + libgcj.so changes. +')`'dnl gcjbc + +Package: libgcj`'LIBGCJ_EXT-awt`'LS +Section: libs +Architecture: any +Priority: PRI(optional) +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: SOFTBASEDEP, libdep(gcj`'LIBGCJ_EXT,,=,${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: ${pkg:gcjqt} +BUILT_USING`'dnl +Description: AWT peer runtime libraries for use with gcj + These are runtime libraries holding the AWT peer implementations + for libgcj (currently the GTK+ based peer library is required, the + QT bases library is not built). + +ifenabled(`gtkpeer',` +Package: libgcj`'GCJ_SO-awt-gtk`'LS +Section: libs +Architecture: any +Priority: PRI(optional) +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: SOFTBASEDEP, libgcj`'LIBGCJ_EXT-awt`'LS (= ${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AWT GTK+ peer runtime library for use with libgcj + This is the runtime library holding the GTK+ based AWT peer + implementation for libgcj. +')`'dnl gtkpeer + +ifenabled(`qtpeer',` +Package: libgcj`'GCJ_SO-awt-qt`'LS +Section: libs +Architecture: any +Priority: PRI(optional) +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: SOFTBASEDEP, libdep(gcj`'LIBGCJ_EXT-awt,,=,${gcj:Version}), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: AWT QT peer runtime library for use with libgcj + This is the runtime library holding the QT based AWT peer + implementation for libgcj. +')`'dnl qtpeer +')`'dnl libgcj + +ifenabled(`libgcjdev',` +Package: libgcj`'GCJ_SO-dev`'LS +Section: libdevel +Architecture: any +ifdef(`MULTIARCH', `Multi-Arch: same +')`'dnl +Priority: PRI(optional) +Depends: BASEDEP, libdep(gcj`'LIBGCJ_EXT-awt,,=,${gcj:Version}), libgcj-bc`'LS, ${pkg:gcjgtk}, ${pkg:gcjqt}, zlib1g-dev, ${shlibs:Depends}, ${misc:Depends} +Suggests: libgcj-doc +BUILT_USING`'dnl +Description: Java development headers for use with gcj + These are the development headers that go along with the gcj front end + to gcc. libgcj includes parts of the Java Class Libraries, plus glue + to connect the libraries to the compiler and the underlying OS. + +Package: libgcj`'GCJ_SO-dbg`'LS +Section: debug +Architecture: any +Priority: extra +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +Multi-Arch: same +')`'dnl +Depends: BASEDEP, libdep(gcj`'LIBGCJ_EXT,,=,${gcj:Version}), ${misc:Depends} +Recommends: binutils, libc6-dbg | libc-dbg +BUILT_USING`'dnl +Description: Debugging symbols for libraries provided in libgcj`'GCJ_SO-dev + The package provides debugging symbols for the libraries provided + in libgcj`'GCJ_SO-dev. + . + binutils is required to show file names and line numbers in stack traces. + +ifenabled(`gcjsrc',` +Package: gcj`'PV-source +Section: java +Architecture: all +Priority: PRI(optional) +Depends: SOFTBASEDEP, gcj`'PV-jdk (>= ${gcj:SoftVersion}), ${misc:Depends} +BUILT_USING`'dnl +Description: GCJ java sources for use in IDEs like eclipse and netbeans + These are the java source files packaged as a zip file for use in development + environments like eclipse and netbeans. +')`'dnl + +ifenabled(`gcjdoc',` +Package: libgcj-doc +Section: doc +Architecture: all +Priority: PRI(optional) +Depends: SOFTBASEDEP, ${misc:Depends} +Enhances: libgcj`'GCJ_SO-dev +Provides: classpath-doc +BUILT_USING`'dnl +Description: libgcj API documentation and example programs + Autogenerated documentation describing the API of the libgcj library. + Sources and precompiled example programs from the Classpath library. +')`'dnl gcjdoc +')`'dnl libgcjdev +')`'dnl java + +ifenabled(`c++',` +ifenabled(`libcxx',` +Package: libstdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(important)) +Depends: BASEDEP, ${dep:libc}, ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libstdc++CXX_SO-TARGET-dcv1', +ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +Breaks: ${multiarch:breaks} +')`Provides: libstdc++'CXX_SO`-armel [armel], libstdc++'CXX_SO`-armhf [armhf]') +Conflicts: scim (<< 1.4.2-1) +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libcxx + +ifenabled(`lib32cxx',` +Package: lib32stdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: extra +Depends: BASEDEP, libdep(gcc1,32), ${shlibs:Depends}, ${misc:Depends} +Conflicts: ${confl:lib32} +ifdef(`TARGET',`Provides: lib32stdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (32 bit Version) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib32cxx + +ifenabled(`lib64cxx',` +Package: lib64stdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdep(gcc1,64), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: lib64stdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (64bit) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl lib64cxx + +ifenabled(`libn32cxx',` +Package: libn32stdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdep(gcc1,n32), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libn32stdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (n32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libn32cxx + +ifenabled(`libx32cxx',` +Package: libx32stdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdep(gcc1,x32), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libx32stdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (x32) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libx32cxx + +ifenabled(`libhfcxx',` +Package: libhfstdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdep(gcc1,hf), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libhfstdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +ifdef(`TARGET',`dnl',`Conflicts: libstdc++'CXX_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (hard float ABI) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libhfcxx + +ifenabled(`libsfcxx',` +Package: libsfstdc++CXX_SO`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: ifdef(`TARGET',`devel',`libs') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdep(gcc1,sf), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libsfstdc++CXX_SO-TARGET-dcv1 +',`')`'dnl +ifdef(`TARGET',`dnl',`Conflicts: libstdc++'CXX_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3`'ifdef(`TARGET)',` (TARGET)', `') (soft float ABI) + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libsfcxx + +ifenabled(`libneoncxx',` +Package: libstdc++CXX_SO-neon`'LS +Architecture: NEON_ARCHS +Section: libs +Priority: extra +Depends: BASEDEP, libc6-neon`'LS, libgcc1-neon`'LS, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 [NEON version] + This package contains an additional runtime library for C++ programs + built with the GNU compiler. + . + This set of libraries is optimized to use a NEON coprocessor, and will + be selected instead when running under systems which have one. +')`'dnl + +ifenabled(`c++dev',` +Package: libstdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,,=), libdep(stdc++CXX_SO,,>=), ${dep:libcdev}, ${misc:Depends} +ifdef(`TARGET',`',`dnl native +Conflicts: libg++27-dev, libg++272-dev (<< 2.7.2.8-1), libstdc++2.8-dev, libg++2.8-dev, libstdc++2.9-dev, libstdc++2.9-glibc2.1-dev, libstdc++2.10-dev (<< 1:2.95.3-2), libstdc++3.0-dev +Suggests: libstdc++`'PV-doc +')`'dnl native +Provides: libstdc++-dev`'LS`'ifdef(`TARGET',`, libstdc++-dev-TARGET-dcv1') +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libstdc++`'PV-pic`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`',ifdef(`MULTIARCH', `Multi-Arch: same +'))`'dnl +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +ifdef(`TARGET',`Provides: libstdc++-pic-TARGET-dcv1 +',`')`'dnl +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (shared library subset kit)`'ifdef(`TARGET)',` (TARGET)', `') + This is used to develop subsets of the libstdc++ shared libraries for + use on custom installation floppies and in embedded systems. + . + Unless you are making one of those, you will not need this package. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libstdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,), libdbgdep(gcc`'GCC_SO-dbg,,>=,${libgcc:Version}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libstdc++CXX_SO-dbg-TARGET-dcv1',`dnl +ifdef(`MULTIARCH', `Multi-Arch: same',`dnl') +Provides: libstdc++'CXX_SO`'PV`-dbg-armel [armel], libstdc++'CXX_SO`'PV`-dbg-armhf [armhf]dnl +') +Recommends: libdevdep(stdc++`'PV-dev,) +Conflicts: libstdc++5-dbg`'LS, libstdc++5-3.3-dbg`'LS, libstdc++6-dbg`'LS, libstdc++6-4.0-dbg`'LS, libstdc++6-4.1-dbg`'LS, libstdc++6-4.2-dbg`'LS, libstdc++6-4.3-dbg`'LS, libstdc++6-4.4-dbg`'LS, libstdc++6-4.5-dbg`'LS, libstdc++6-4.6-dbg`'LS, libstdc++6-4.7-dbg`'LS +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib32stdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,32), libdep(stdc++CXX_SO,32), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib32stdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,32), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,32,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: lib32stdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +Conflicts: lib32stdc++6-dbg`'LS, lib32stdc++6-4.0-dbg`'LS, lib32stdc++6-4.1-dbg`'LS, lib32stdc++6-4.2-dbg`'LS, lib32stdc++6-4.3-dbg`'LS, lib32stdc++6-4.4-dbg`'LS, lib32stdc++6-4.5-dbg`'LS, lib32stdc++6-4.6-dbg`'LS, lib32stdc++6-4.7-dbg`'LS, +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib64stdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,64), libdep(stdc++CXX_SO,64), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: lib64stdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarch64_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,64), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,64,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: lib64stdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +Conflicts: lib64stdc++6-dbg`'LS, lib64stdc++6-4.0-dbg`'LS, lib64stdc++6-4.1-dbg`'LS, lib64stdc++6-4.2-dbg`'LS, lib64stdc++6-4.3-dbg`'LS, lib64stdc++6-4.4-dbg`'LS, lib64stdc++6-4.5-dbg`'LS, lib64stdc++6-4.6-dbg`'LS, lib64stdc++6-4.7-dbg`'LS +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libn32stdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,n32), libdep(stdc++CXX_SO,n32), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libn32stdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchn32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,n32), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,n32,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libn32stdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +Conflicts: libn32stdc++6-dbg`'LS, libn32stdc++6-4.0-dbg`'LS, libn32stdc++6-4.1-dbg`'LS, libn32stdc++6-4.2-dbg`'LS, libn32stdc++6-4.3-dbg`'LS, libn32stdc++6-4.4-dbg`'LS, libn32stdc++6-4.5-dbg`'LS, libn32stdc++6-4.6-dbg`'LS, libn32stdc++6-4.7-dbg`'LS +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +ifenabled(`x32dev',` +Package: libx32stdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,x32), libdep(stdc++CXX_SO,x32), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl x32dev + +ifenabled(`libx32dbgcxx',` +Package: libx32stdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchx32_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,x32), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,x32,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libx32stdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +Conflicts: libx32stdc++6-dbg`'LS, libx32stdc++6-4.6-dbg`'LS, libx32stdc++6-4.7-dbg`'LS +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libx32dbgcxx + +ifenabled(`libhfdbgcxx',` +Package: libhfstdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,hf), libdep(stdc++CXX_SO,hf), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libhfstdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchhf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,hf), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,hf,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libhfstdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +ifdef(`TARGET',`dnl',`Conflicts: libhfstdc++6-dbg`'LS, libhfstdc++6-4.3-dbg`'LS, libhfstdc++6-4.4-dbg`'LS, libhfstdc++6-4.5-dbg`'LS, libhfstdc++6-4.6-dbg`'LS, libhfstdc++6-4.7-dbg`'LS, libstdc++'CXX_SO`-armhf [biarchhf_archs]') +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libhfdbgcxx + +ifenabled(`libsfdbgcxx',` +Package: libsfstdc++`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: ifdef(`TARGET',`devel',`libdevel') +Priority: ifdef(`TARGET',`extra',PRI(optional)) +Depends: BASEDEP, libdevdep(gcc`'PV-dev,sf), libdep(stdc++CXX_SO,sf), libdevdep(stdc++`'PV-dev,), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (development files)`'ifdef(`TARGET',` (TARGET)', `') + This package contains the headers and static library files necessary for + building C++ programs which use libstdc++. + . + libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which + was included up to g++-2.95. The first version of libstdc++-v3 appeared + in g++-3.0. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl + +Package: libsfstdc++CXX_SO`'PV-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`biarchsf_archs') +Section: debug +Priority: extra +Depends: BASEDEP, libdep(stdc++CXX_SO,sf), libdevdep(stdc++`'PV-dev,), libdbgdep(gcc`'GCC_SO-dbg,sf,>=,${gcc:EpochVersion}), ${shlibs:Depends}, ${misc:Depends} +ifdef(`TARGET',`Provides: libsfstdc++CXX_SO-dbg-TARGET-dcv1 +',`')`'dnl +ifdef(`TARGET',`dnl',`Conflicts: libsfstdc++6-dbg`'LS, libsfstdc++6-4.3-dbg`'LS, libsfstdc++6-4.4-dbg`'LS, libsfstdc++6-4.5-dbg`'LS, libsfstdc++6-4.6-dbg`'LS, libsfstdc++6-4.7-dbg`'LS, libstdc++'CXX_SO`-armel [biarchsf_archs]') +BUILT_USING`'dnl +Description: GNU Standard C++ Library v3 (debugging files)`'ifdef(`TARGET)',` (TARGET)', `') + This package contains the shared library of libstdc++ compiled with + debugging symbols. +ifdef(`TARGET', `dnl + . + This package contains files for TARGET architecture, for use in cross-compile + environment. +')`'dnl +')`'dnl libsfdbgcxx + +ifdef(`TARGET', `', ` +Package: libstdc++`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base (>= ${gcc:SoftVersion}), ${misc:Depends}, libjs-jquery +Conflicts: libstdc++5-doc, libstdc++5-3.3-doc, libstdc++6-doc, libstdc++6-4.0-doc, libstdc++6-4.1-doc, libstdc++6-4.2-doc, libstdc++6-4.3-doc, libstdc++6-4.4-doc, libstdc++6-4.5-doc, libstdc++6-4.6-doc, libstdc++6-4.7-doc +Description: GNU Standard C++ Library v3 (documentation files) + This package contains documentation files for the GNU stdc++ library. + . + One set is the distribution documentation, the other set is the + source documentation including a namespace list, class hierarchy, + alphabetical list, compound list, file list, namespace members, + compound members and file members. +')`'dnl native +')`'dnl c++dev +')`'dnl c++ + +ifenabled(`ada',` +Package: gnat`'-GNAT_V`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +')`'dnl +Depends: BASEDEP, gcc`'PV`'TS (>= ${gcc:SoftVersion}), ${dep:libgnat}, ${dep:libcdev}, ${shlibs:Depends}, ${misc:Depends} +Suggests: gnat`'PV-doc, ada-reference-manual-html, ada-reference-manual-info, ada-reference-manual-pdf, ada-reference-manual-text, gnat`'-GNAT_V-sjlj +Conflicts: gnat (<< 4.1), gnat-3.1, gnat-3.2, gnat-3.3, gnat-3.4, gnat-3.5, gnat-4.0, gnat-4.1, gnat-4.2, gnat-4.3, gnat-4.4, gnat-4.6 +BUILT_USING`'dnl +Description: GNU Ada compiler + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + This package provides the compiler, tools and runtime library that handles + exceptions using the default zero-cost mechanism. + +Package: gnat`'-GNAT_V-sjlj`'TS +Architecture: any +Priority: extra +ifdef(`MULTIARCH', `Pre-Depends: multiarch-support +')`'dnl +Depends: BASEDEP, gnat`'-GNAT_V`'TS (= ${gnat:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Ada compiler (setjump/longjump runtime library) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + This package provides an alternative runtime library that handles + exceptions using the setjump/longjump mechanism (as a static library + only). You can install it to supplement the normal compiler. + +ifenabled(`libgnat',` +Package: libgnat`'-GNAT_V`'LS +Section: ifdef(`TARGET',`devel',`libs') +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: runtime for applications compiled with GNAT (shared library) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnat library provides runtime components needed by most + applications produced with GNAT. + . + This package contains the runtime shared library. + +Package: libgnat`'-GNAT_V-dbg`'LS +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: extra +Depends: BASEDEP, libgnat`'-GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: runtime for applications compiled with GNAT (debugging symbols) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnat library provides runtime components needed by most + applications produced with GNAT. + . + This package contains the debugging symbols. + +Package: libgnatvsn`'GNAT_V-dev`'LS +Section: libdevel +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Priority: extra +Depends: BASEDEP, gnat`'PV`'LS (= ${gnat:Version}), + libgnatvsn`'GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +Conflicts: libgnatvsn-dev (<< `'GNAT_V), libgnatvsn4.1-dev, libgnatvsn4.3-dev, libgnatvsn4.4-dev, libgnatvsn4.5-dev, libgnatvsn4.6-dev +BUILT_USING`'dnl +Description: GNU Ada compiler selected components (development files) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnatvsn library exports selected GNAT components for use in other + packages, most notably ASIS tools. It is licensed under the GNAT-Modified + GPL, allowing to link proprietary programs with it. + . + This package contains the development files and static library. + +Package: libgnatvsn`'GNAT_V`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: PRI(optional) +Section: ifdef(`TARGET',`devel',`libs') +Depends: BASEDEP, libgnat`'-GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Ada compiler selected components (shared library) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnatvsn library exports selected GNAT components for use in other + packages, most notably ASIS tools. It is licensed under the GNAT-Modified + GPL, allowing to link proprietary programs with it. + . + This package contains the runtime shared library. + +Package: libgnatvsn`'GNAT_V-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: extra +Section: debug +Depends: BASEDEP, libgnatvsn`'GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +Suggests: gnat +BUILT_USING`'dnl +Description: GNU Ada compiler selected components (debugging symbols) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnatvsn library exports selected GNAT components for use in other + packages, most notably ASIS tools. It is licensed under the GNAT-Modified + GPL, allowing to link proprietary programs with it. + . + This package contains the debugging symbols. + +Package: libgnatprj`'GNAT_V-dev`'LS +Section: libdevel +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +Priority: extra +Depends: BASEDEP, gnat`'PV`'TS (= ${gnat:Version}), + libgnatprj`'GNAT_V`'LS (= ${gnat:Version}), + libgnatvsn`'GNAT_V-dev`'LS (= ${gnat:Version}), ${misc:Depends} +Conflicts: libgnatprj-dev (<< `'GNAT_V), libgnatprj4.1-dev, libgnatprj4.3-dev, libgnatprj4.4-dev, libgnatprj4.5-dev, libgnatprj4.6-dev +BUILT_USING`'dnl +Description: GNU Ada compiler Project Manager (development files) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + GNAT uses project files to organise source and object files in large-scale + development efforts. The libgnatprj library exports GNAT project files + management for use in other packages, most notably ASIS tools (package + asis-programs) and GNAT Programming Studio (package gnat-gps). It is + licensed under the pure GPL; all programs that use it must also be + distributed under the GPL, or not distributed at all. + . + This package contains the development files and static library. + +Package: libgnatprj`'GNAT_V`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: PRI(optional) +Section: ifdef(`TARGET',`devel',`libs') +Depends: BASEDEP, libgnat`'-GNAT_V`'LS (= ${gnat:Version}), libgnatvsn`'GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +BUILT_USING`'dnl +Description: GNU Ada compiler Project Manager (shared library) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + GNAT uses project files to organise source and object files in large-scale + development efforts. The libgnatprj library exports GNAT project files + management for use in other packages, most notably ASIS tools (package + asis-programs) and GNAT Programming Studio (package gnat-gps). It is + licensed under the pure GPL; all programs that use it must also be + distributed under the GPL, or not distributed at all. + . + This package contains the runtime shared library. + +Package: libgnatprj`'GNAT_V-dbg`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`any') +ifdef(`TARGET',`dnl',ifdef(`MULTIARCH', `Multi-Arch: same +Pre-Depends: multiarch-support +'))`'dnl +Priority: extra +Section: debug +Depends: BASEDEP, libgnatprj`'GNAT_V`'LS (= ${gnat:Version}), ${misc:Depends} +Suggests: gnat +BUILT_USING`'dnl +Description: GNU Ada compiler Project Manager (debugging symbols) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + GNAT uses project files to organise source and object files in large-scale + development efforts. The libgnatprj library exports GNAT project files + management for use in other packages, most notably ASIS tools (package + asis-programs) and GNAT Programming Studio (package gnat-gps). It is + licensed under the pure GPL; all programs that use it must also be + distributed under the GPL, or not distributed at all. + . + This package contains the debugging symbols. +')`'dnl libgnat + +ifenabled(`lib64gnat',` +Package: lib64gnat`'-GNAT_V +Section: libs +Architecture: biarch64_archs +Priority: PRI(optional) +Depends: BASEDEP, ${dep:libcbiarch}, ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: runtime for applications compiled with GNAT (64 bits shared library) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnat library provides runtime components needed by most + applications produced with GNAT. + . + This package contains the runtime shared library for 64 bits architectures. +')`'dnl libgnat + +ifenabled(`gfdldoc',` +Package: gnat`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Suggests: gnat`'PV +Conflicts: gnat-4.1-doc, gnat-4.2-doc, gnat-4.3-doc, gnat-4.4-doc, gnat-4.6-doc +BUILT_USING`'dnl +Description: GNU Ada compiler (documentation) + GNAT is a compiler for the Ada programming language. It produces optimized + code on platforms supported by the GNU Compiler Collection (GCC). + . + The libgnat library provides runtime components needed by most + applications produced with GNAT. + . + This package contains the documentation in info `format'. +')`'dnl gfdldoc +')`'dnl ada + +ifenabled(`d ',` +Package: gdc`'PV`'TS +Architecture: any +Priority: ifdef(`TARGET',`extra',`PRI(optional)') +Depends: SOFTBASEDEP, g++`'PV`'TS (>= ${gcc:SoftVersion}), ${dep:gdccross}, ${dep:phobosdev}, ${shlibs:Depends}, ${misc:Depends} +Provides: gdc, d-compiler, d-v2-compiler +Replaces: gdc (<< 4.4.6-5) +BUILT_USING`'dnl +Description: GNU D compiler (version 2), based on the GCC backend + This is the GNU D compiler, which compiles D on platforms supported by gcc. + It uses the gcc backend to generate optimised code. + . + This compiler supports D language version 2. + +ifenabled(`libphobos',` +Package: libphobos`'PV-dev`'LS +Architecture: ifdef(`TARGET',`CROSS_ARCH',`libphobos_archs') +Section: libdevel +Priority: PRI(optional) +Depends: BASEDEP, zlib1g-dev, ${shlibs:Depends}, ${misc:Depends} +Provides: libphobos-dev +Replaces: gdc`'PV`'TS (<< 4.8.2-19) +BUILT_USING`'dnl +Description: Phobos D standard library + This is the Phobos standard library that comes with the D2 compiler. + . + For more information check http://www.dlang.org/phobos/ + +Package: libphobos`'PHOBOS_V`'PV`'TS-dbg +Section: debug +Architecture: ifdef(`TARGET',`CROSS_ARCH',`libphobos_archs') +Priority: extra +Depends: BASEDEP, libphobos`'PHOBOS_V`'PV-dev (= ${gdc:Version}), ${misc:Depends} +Provides: libphobos`'PHOBOS_V`'TS-dbg +BUILT_USING`'dnl +Description: The Phobos D standard library (debug symbols) + This is the Phobos standard library that comes with the D2 compiler. + . + For more information check http://www.dlang.org/phobos/ +')`'dnl libphobos +')`'dnl d + +ifdef(`TARGET',`',`dnl +ifenabled(`libs',` +Package: gcc`'PV-soft-float +Architecture: arm armel armhf +Priority: PRI(optional) +Depends: BASEDEP, depifenabled(`cdev',`gcc`'PV (= ${gcc:Version}),') ${shlibs:Depends}, ${misc:Depends} +Conflicts: gcc-4.4-soft-float, gcc-4.5-soft-float, gcc-4.6-soft-float +BUILT_USING`'dnl +Description: GCC soft-floating-point gcc libraries (ARM) + These are versions of basic static libraries such as libgcc.a compiled + with the -msoft-float option, for CPUs without a floating-point unit. +')`'dnl commonlibs +')`'dnl + +ifenabled(`fixincl',` +Package: fixincludes +Architecture: any +Priority: PRI(optional) +Depends: BASEDEP, gcc`'PV (= ${gcc:Version}), ${shlibs:Depends}, ${misc:Depends} +BUILT_USING`'dnl +Description: Fix non-ANSI header files + FixIncludes was created to fix non-ANSI system header files. Many + system manufacturers supply proprietary headers that are not ANSI compliant. + The GNU compilers cannot compile non-ANSI headers. Consequently, the + FixIncludes shell script was written to fix the header files. + . + Not all packages with header files are installed on the system, when the + package is built, so we make fixincludes available at build time of other + packages, such that checking tools like lintian can make use of it. +')`'dnl fixincl + +ifenabled(`cdev',` +ifdef(`TARGET', `', ` +ifenabled(`gfdldoc',` +Package: gcc`'PV-doc +Architecture: all +Section: doc +Priority: PRI(optional) +Depends: gcc`'PV-base (>= ${gcc:SoftVersion}), dpkg (>= 1.15.4) | install-info, ${misc:Depends} +Conflicts: gcc-docs (<< 2.95.2) +Replaces: gcc (<=2.7.2.3-4.3), gcc-docs (<< 2.95.2) +Description: Documentation for the GNU compilers (gcc, gobjc, g++) + Documentation for the GNU compilers in info `format'. +')`'dnl gfdldoc +')`'dnl native +')`'dnl cdev + +ifdef(`TARGET',`',`dnl +ifenabled(`libnof',` +Package: gcc`'PV-nof +Architecture: powerpc +Priority: PRI(optional) +Depends: BASEDEP, ${shlibs:Depends}ifenabled(`cdev',`, gcc`'PV (= ${gcc:Version})'), ${misc:Depends} +Conflicts: gcc-3.2-nof +BUILT_USING`'dnl +Description: GCC no-floating-point gcc libraries (powerpc) + These are versions of basic static libraries such as libgcc.a compiled + with the -msoft-float option, for CPUs without a floating-point unit. +')`'dnl libnof +')`'dnl + +ifenabled(`source',` +Package: gcc`'PV-source +Architecture: all +Priority: PRI(optional) +Depends: make (>= 3.81), autoconf2.64, quilt, patchutils, gawk, ${misc:Depends} +Description: Source of the GNU Compiler Collection + This package contains the sources and patches which are needed to + build the GNU Compiler Collection (GCC). +')`'dnl source +dnl +')`'dnl gcc-X.Y +dnl last line in file --- gcc-4.8-4.8.2.orig/debian/copyright +++ gcc-4.8-4.8.2/debian/copyright @@ -0,0 +1,661 @@ +This is the Debian GNU/Linux prepackaged version of the GNU compiler +collection, containing Ada, C, C++, Fortran 95, Java, Objective-C, +Objective-C++, and Treelang compilers, documentation, and support +libraries. In addition, Debian provides the gdc compiler, either in +the same source package, or built from a separate same source package. +Packaging is done by the Debian GCC Maintainers +, with sources obtained from: + + ftp://gcc.gnu.org/pub/gcc/releases/ (for full releases) + svn://gcc.gnu.org/svn/gcc/ (for prereleases) + http://bitbucket.org/goshawk/gdc (for D) + +The current gcc-4.8 source package is taken from the SVN gcc-4_8-branch. + +Changes: See changelog.Debian.gz + +Debian splits the GNU Compiler Collection into packages for each language, +library, and documentation as follows: + +Language Compiler package Library package Documentation +--------------------------------------------------------------------------- +Ada gnat-4.8 libgnat-4.8 gnat-4.8-doc +C gcc-4.8 gcc-4.8-doc +C++ g++-4.8 libstdc++6 libstdc++6-4.8-doc +D gdc-4.8 +Fortran 95 gfortran-4.8 libgfortran3 gfortran-4.8-doc +Go gccgo-4.8 libgo0 +Java gcj-4.8 libgcj10 libgcj-doc +Objective C gobjc-4.8 libobjc2 +Objective C++ gobjc++-4.8 + +For some language run-time libraries, Debian provides source files, +development files, debugging symbols and libraries containing position- +independent code in separate packages: + +Language Sources Development Debugging Position-Independent +------------------------------------------------------------------------------ +C++ libstdc++6-4.8-dbg libstdc++6-4.8-pic +D libphobos-4.8-dev +Java libgcj10-src libgcj10-dev libgcj10-dbg + +Additional packages include: + +All languages: +libgcc1, libgcc2, libgcc4 GCC intrinsics (platform-dependent) +gcc-4.8-base Base files common to all compilers +gcc-4.8-soft-float Software floating point (ARM only) +gcc-4.8-source The sources with patches + +Ada: +libgnatvsn-dev, libgnatvsn4.8 GNAT version library +libgnatprj-dev, libgnatprj4.8 GNAT Project Manager library + +C: +cpp-4.8, cpp-4.8-doc GNU C Preprocessor +libmudflap0-dev, libmudflap0 Library for instrumenting pointers +libssp0-dev, libssp0 GCC stack smashing protection library +libquadmath0 Math routines for the __float128 type +fixincludes Fix non-ANSI header files +protoize Create/remove ANSI prototypes from C code + +Java: +gij The Java bytecode interpreter and VM +libgcj-common Common files for the Java run-time +libgcj10-awt The Abstract Windowing Toolkit +libgcj10-jar Java ARchive for the Java run-time + +C, C++ and Fortran 95: +libgomp1-dev, libgomp1 GCC OpenMP (GOMP) support library +libitm1-dev, libitm1 GNU Transactional Memory Library + +Biarch support: On some 64-bit platforms which can also run 32-bit code, +Debian provides additional packages containing 32-bit versions of some +libraries. These packages have names beginning with 'lib32' instead of +'lib', for example lib32stdc++6. Similarly, on some 32-bit platforms which +can also run 64-bit code, Debian provides additional packages with names +beginning with 'lib64' instead of 'lib'. These packages contain 64-bit +versions of the libraries. (At this time, not all platforms and not all +libraries support biarch.) The license terms for these lib32 or lib64 +packages are identical to the ones for the lib packages. + + +COPYRIGHT STATEMENTS AND LICENSING TERMS + + +GCC is Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, +1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +2008, 2009, 2010, 2011 Free Software Foundation, Inc. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +Files that have exception clauses are licensed under the terms of the +GNU General Public License; either version 3, or (at your option) any +later version. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', version 3 of this +license in `/usr/share/common-licenses/GPL-3'. + +The following runtime libraries are licensed under the terms of the +GNU General Public License (v3 or later) with version 3.1 of the GCC +Runtime Library Exception (included in this file): + + - libgcc (libgcc/, gcc/libgcc2.[ch], gcc/unwind*, gcc/gthr*, + gcc/coretypes.h, gcc/crtstuff.c, gcc/defaults.h, gcc/dwarf2.h, + gcc/emults.c, gcc/gbl-ctors.h, gcc/gcov-io.h, gcc/libgcov.c, + gcc/tsystem.h, gcc/typeclass.h). + - libatomic + - libdecnumber + - libgomp + - libitm + - libssp + - libstdc++-v3 + - libobjc + - libmudflap + - libgfortran + - The libgnat-4.8 Ada support library and libgnatvsn library. + - Various config files in gcc/config/ used in runtime libraries. + +In contrast, libgnatprj is licensed under the terms of the pure GNU +General Public License. + +The libbacktrace library is licensed under the following terms: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + (1) Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + (2) Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + (3) The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +The libsanitizer library (libasan) is licensed under the following terms: + +Copyright (c) 2009-2012 by the LLVM contributors. + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +The libgcj library is licensed under the terms of the GNU General +Public License, with a special exception: + + Linking this library statically or dynamically with other modules + is making a combined work based on this library. Thus, the terms + and conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give + you permission to link this library with independent modules to + produce an executable, regardless of the license terms of these + independent modules, and to copy and distribute the resulting + executable under terms of your choice, provided that you also + meet, for each linked independent module, the terms and conditions + of the license of that module. An independent module is a module + which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the + library, but you are not obligated to do so. If you do not wish + to do so, delete this exception statement from your version. + +The libffi library is licensed under the following terms: + + libffi - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + +The documentation is licensed under the GNU Free Documentation License (v1.2). +On Debian GNU/Linux systems, the complete text of this license is in +`/usr/share/common-licenses/GFDL-1.2'. + + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + + +libquadmath/*.[hc]: + + Copyright (C) 2010 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + Written by Tobias Burnus + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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. + +libquadmath/gdtoa: + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999, 2000, 2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +libquadmath/math: + +atanq.c, expm1q.c, j0q.c, j1q.c, log1pq.c, logq.c: + Copyright 2001 by Stephen L. Moshier + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +coshq.c, erfq.c, jnq.c, lgammaq.c, powq.c, roundq.c: + Changes for 128-bit __float128 are + Copyright (C) 2001 Stephen L. Moshier + and are incorporated herein by permission of the author. The author + reserves the right to distribute this material elsewhere under different + copying permissions. These modifications are distributed here under + the following terms: + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +ldexpq.c: + * Conversion to long double by Ulrich Drepper, + * Cygnus Support, drepper@cygnus.com. + +cosq_kernel.c, expq.c, sincos_table.c, sincosq.c, sincosq_kernel.c, +sinq_kernel.c, truncq.c: + Copyright (C) 1997, 1999 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 + Lesser General Public License for more details. + +isinfq.c: + * Written by J.T. Conklin . + * Change for long double by Jakub Jelinek + * Public domain. + +llroundq.c, lroundq.c, tgammaq.c: + Copyright (C) 1997, 1999, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997 and + Jakub Jelinek , 1999. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 + Lesser General Public License for more details. + +log10q.c: + Cephes Math Library Release 2.2: January, 1991 + Copyright 1984, 1991 by Stephen L. Moshier + Adapted for glibc November, 2001 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +remaining files: + + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + + +libjava/classpath/resource/gnu/java/locale/* + +They are copyrighted and covered by the terms of use: +http://www.unicode.org/copyright.html + +EXHIBIT 1 +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/ and http://www.unicode.org/reports/. +Unicode Software includes any source code published in the Unicode Standard or +under the directories http://www.unicode.org/Public/ and +http://www.unicode.org/reports/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, +INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), +AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, +ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, +DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + COPYRIGHT AND PERMISSION NOTICE + +Copyrigh (c) 1991-2011 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") +or Unicode software and any associated documentation (the "Software") to deal +in the Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell copies + of the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that (a) the above copyright notice(s) +and this permission notice appear with all copies of the Data Files or Software, +(b) both the above copyright notice(s) and this permission notice appear +in associated documentation, and (c) there is clear notice in each modified +Data File or in the Software as well as in the documentation associated with +the Data File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE + FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used + in advertising or otherwise to promote the sale, use or other dealings in these +Data Files or Software without prior written authorization of the copyright holder. + +Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered + in some jurisdictions. All other trademarks and registered trademarks mentioned +herein are the property of their respective owners. + + +gcc/go/gofrontend, libgo: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +D: +gdc-4.8 GNU D Compiler +libphobos-4.8-dev D standard runtime library + +The D source package is made up of the following components. + +The D front-end for GCC: + - d/* + +Copyright (C) 2004-2007 David Friedman +Modified by Vincenzo Ampolo, Michael Parrot, Iain Buclaw, (C) 2009, 2010 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', version 2 of this +license in `/usr/share/common-licenses/GPL-2'. + + +The DMD Compiler implementation of the D programming language: + - d/dmd/* + +Copyright (c) 1999-2010 by Digital Mars +All Rights Reserved +written by Walter Bright +http://www.digitalmars.com +License for redistribution is by either the Artistic License or +the GNU General Public License (v1). + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', the Artistic +license in `/usr/share/common-licenses/Artistic'. + + +The Zlib data compression library: + - d/phobos/etc/c/zlib/* + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +The Phobos standard runtime library: + - d/phobos/* + +Unless otherwise marked within the file, each file in the source +is under the following licenses: + +Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com +Written by Walter Bright + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, in both source and binary form, subject to the following +restrictions: + + o The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + o Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + o This notice may not be removed or altered from any source + distribution. + +By plainly marking modifications, something along the lines of adding to each +file that has been changed a "Modified by Foo Bar" line +underneath the "Written by" line would be adequate. + --- gcc-4.8-4.8.2.orig/debian/copyright.in +++ gcc-4.8-4.8.2/debian/copyright.in @@ -0,0 +1,661 @@ +This is the Debian GNU/Linux prepackaged version of the GNU compiler +collection, containing Ada, C, C++, Fortran 95, Java, Objective-C, +Objective-C++, and Treelang compilers, documentation, and support +libraries. In addition, Debian provides the gdc compiler, either in +the same source package, or built from a separate same source package. +Packaging is done by the Debian GCC Maintainers +, with sources obtained from: + + ftp://gcc.gnu.org/pub/gcc/releases/ (for full releases) + svn://gcc.gnu.org/svn/gcc/ (for prereleases) + http://bitbucket.org/goshawk/gdc (for D) + +The current gcc-@BV@ source package is taken from the SVN @SVN_BRANCH@. + +Changes: See changelog.Debian.gz + +Debian splits the GNU Compiler Collection into packages for each language, +library, and documentation as follows: + +Language Compiler package Library package Documentation +--------------------------------------------------------------------------- +Ada gnat-@BV@ libgnat-@BV@ gnat-@BV@-doc +C gcc-@BV@ gcc-@BV@-doc +C++ g++-@BV@ libstdc++6 libstdc++6-@BV@-doc +D gdc-@BV@ +Fortran 95 gfortran-@BV@ libgfortran3 gfortran-@BV@-doc +Go gccgo-@BV@ libgo0 +Java gcj-@BV@ libgcj10 libgcj-doc +Objective C gobjc-@BV@ libobjc2 +Objective C++ gobjc++-@BV@ + +For some language run-time libraries, Debian provides source files, +development files, debugging symbols and libraries containing position- +independent code in separate packages: + +Language Sources Development Debugging Position-Independent +------------------------------------------------------------------------------ +C++ libstdc++6-@BV@-dbg libstdc++6-@BV@-pic +D libphobos-@BV@-dev +Java libgcj10-src libgcj10-dev libgcj10-dbg + +Additional packages include: + +All languages: +libgcc1, libgcc2, libgcc4 GCC intrinsics (platform-dependent) +gcc-@BV@-base Base files common to all compilers +gcc-@BV@-soft-float Software floating point (ARM only) +gcc-@BV@-source The sources with patches + +Ada: +libgnatvsn-dev, libgnatvsn@BV@ GNAT version library +libgnatprj-dev, libgnatprj@BV@ GNAT Project Manager library + +C: +cpp-@BV@, cpp-@BV@-doc GNU C Preprocessor +libmudflap0-dev, libmudflap0 Library for instrumenting pointers +libssp0-dev, libssp0 GCC stack smashing protection library +libquadmath0 Math routines for the __float128 type +fixincludes Fix non-ANSI header files +protoize Create/remove ANSI prototypes from C code + +Java: +gij The Java bytecode interpreter and VM +libgcj-common Common files for the Java run-time +libgcj10-awt The Abstract Windowing Toolkit +libgcj10-jar Java ARchive for the Java run-time + +C, C++ and Fortran 95: +libgomp1-dev, libgomp1 GCC OpenMP (GOMP) support library +libitm1-dev, libitm1 GNU Transactional Memory Library + +Biarch support: On some 64-bit platforms which can also run 32-bit code, +Debian provides additional packages containing 32-bit versions of some +libraries. These packages have names beginning with 'lib32' instead of +'lib', for example lib32stdc++6. Similarly, on some 32-bit platforms which +can also run 64-bit code, Debian provides additional packages with names +beginning with 'lib64' instead of 'lib'. These packages contain 64-bit +versions of the libraries. (At this time, not all platforms and not all +libraries support biarch.) The license terms for these lib32 or lib64 +packages are identical to the ones for the lib packages. + + +COPYRIGHT STATEMENTS AND LICENSING TERMS + + +GCC is Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, +1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +2008, 2009, 2010, 2011 Free Software Foundation, Inc. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +Files that have exception clauses are licensed under the terms of the +GNU General Public License; either version 3, or (at your option) any +later version. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', version 3 of this +license in `/usr/share/common-licenses/GPL-3'. + +The following runtime libraries are licensed under the terms of the +GNU General Public License (v3 or later) with version 3.1 of the GCC +Runtime Library Exception (included in this file): + + - libgcc (libgcc/, gcc/libgcc2.[ch], gcc/unwind*, gcc/gthr*, + gcc/coretypes.h, gcc/crtstuff.c, gcc/defaults.h, gcc/dwarf2.h, + gcc/emults.c, gcc/gbl-ctors.h, gcc/gcov-io.h, gcc/libgcov.c, + gcc/tsystem.h, gcc/typeclass.h). + - libatomic + - libdecnumber + - libgomp + - libitm + - libssp + - libstdc++-v3 + - libobjc + - libmudflap + - libgfortran + - The libgnat-@BV@ Ada support library and libgnatvsn library. + - Various config files in gcc/config/ used in runtime libraries. + +In contrast, libgnatprj is licensed under the terms of the pure GNU +General Public License. + +The libbacktrace library is licensed under the following terms: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + (1) Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + (2) Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + (3) The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +The libsanitizer library (libasan) is licensed under the following terms: + +Copyright (c) 2009-2012 by the LLVM contributors. + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +The libgcj library is licensed under the terms of the GNU General +Public License, with a special exception: + + Linking this library statically or dynamically with other modules + is making a combined work based on this library. Thus, the terms + and conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give + you permission to link this library with independent modules to + produce an executable, regardless of the license terms of these + independent modules, and to copy and distribute the resulting + executable under terms of your choice, provided that you also + meet, for each linked independent module, the terms and conditions + of the license of that module. An independent module is a module + which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the + library, but you are not obligated to do so. If you do not wish + to do so, delete this exception statement from your version. + +The libffi library is licensed under the following terms: + + libffi - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + +The documentation is licensed under the GNU Free Documentation License (v1.2). +On Debian GNU/Linux systems, the complete text of this license is in +`/usr/share/common-licenses/GFDL-1.2'. + + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + + +libquadmath/*.[hc]: + + Copyright (C) 2010 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + Written by Tobias Burnus + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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. + +libquadmath/gdtoa: + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999, 2000, 2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +libquadmath/math: + +atanq.c, expm1q.c, j0q.c, j1q.c, log1pq.c, logq.c: + Copyright 2001 by Stephen L. Moshier + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +coshq.c, erfq.c, jnq.c, lgammaq.c, powq.c, roundq.c: + Changes for 128-bit __float128 are + Copyright (C) 2001 Stephen L. Moshier + and are incorporated herein by permission of the author. The author + reserves the right to distribute this material elsewhere under different + copying permissions. These modifications are distributed here under + the following terms: + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +ldexpq.c: + * Conversion to long double by Ulrich Drepper, + * Cygnus Support, drepper@cygnus.com. + +cosq_kernel.c, expq.c, sincos_table.c, sincosq.c, sincosq_kernel.c, +sinq_kernel.c, truncq.c: + Copyright (C) 1997, 1999 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 + Lesser General Public License for more details. + +isinfq.c: + * Written by J.T. Conklin . + * Change for long double by Jakub Jelinek + * Public domain. + +llroundq.c, lroundq.c, tgammaq.c: + Copyright (C) 1997, 1999, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997 and + Jakub Jelinek , 1999. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 + Lesser General Public License for more details. + +log10q.c: + Cephes Math Library Release 2.2: January, 1991 + Copyright 1984, 1991 by Stephen L. Moshier + Adapted for glibc November, 2001 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +remaining files: + + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + + +libjava/classpath/resource/gnu/java/locale/* + +They are copyrighted and covered by the terms of use: +http://www.unicode.org/copyright.html + +EXHIBIT 1 +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/ and http://www.unicode.org/reports/. +Unicode Software includes any source code published in the Unicode Standard or +under the directories http://www.unicode.org/Public/ and +http://www.unicode.org/reports/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, +INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), +AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, +ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, +DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + COPYRIGHT AND PERMISSION NOTICE + +Copyrigh (c) 1991-2011 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") +or Unicode software and any associated documentation (the "Software") to deal +in the Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell copies + of the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that (a) the above copyright notice(s) +and this permission notice appear with all copies of the Data Files or Software, +(b) both the above copyright notice(s) and this permission notice appear +in associated documentation, and (c) there is clear notice in each modified +Data File or in the Software as well as in the documentation associated with +the Data File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE + FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used + in advertising or otherwise to promote the sale, use or other dealings in these +Data Files or Software without prior written authorization of the copyright holder. + +Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered + in some jurisdictions. All other trademarks and registered trademarks mentioned +herein are the property of their respective owners. + + +gcc/go/gofrontend, libgo: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +D: +gdc-@BV@ GNU D Compiler +libphobos-@BV@-dev D standard runtime library + +The D source package is made up of the following components. + +The D front-end for GCC: + - d/* + +Copyright (C) 2004-2007 David Friedman +Modified by Vincenzo Ampolo, Michael Parrot, Iain Buclaw, (C) 2009, 2010 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', version 2 of this +license in `/usr/share/common-licenses/GPL-2'. + + +The DMD Compiler implementation of the D programming language: + - d/dmd/* + +Copyright (c) 1999-2010 by Digital Mars +All Rights Reserved +written by Walter Bright +http://www.digitalmars.com +License for redistribution is by either the Artistic License or +the GNU General Public License (v1). + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License is in `/usr/share/common-licenses/GPL', the Artistic +license in `/usr/share/common-licenses/Artistic'. + + +The Zlib data compression library: + - d/phobos/etc/c/zlib/* + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +The Phobos standard runtime library: + - d/phobos/* + +Unless otherwise marked within the file, each file in the source +is under the following licenses: + +Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com +Written by Walter Bright + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, in both source and binary form, subject to the following +restrictions: + + o The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + o Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + o This notice may not be removed or altered from any source + distribution. + +By plainly marking modifications, something along the lines of adding to each +file that has been changed a "Modified by Foo Bar" line +underneath the "Written by" line would be adequate. + --- gcc-4.8-4.8.2.orig/debian/cpp-4.8-powerpc64le-linux-gnu.preinst +++ gcc-4.8-4.8.2/debian/cpp-4.8-powerpc64le-linux-gnu.preinst @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove powerpc64le-linux-gnu-cpp /usr/bin/powerpc64le-linux-gnu-cpp-4.8 +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/cpp-BV-CRB.preinst.in +++ gcc-4.8-4.8.2/debian/cpp-BV-CRB.preinst.in @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove @TARGET@-cpp /usr/bin/@TARGET@-cpp-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/cpp-BV-doc.doc-base.cpp +++ gcc-4.8-4.8.2/debian/cpp-BV-doc.doc-base.cpp @@ -0,0 +1,16 @@ +Document: cpp-@BV@ +Title: The GNU C preprocessor +Author: Various +Abstract: The C preprocessor is a "macro processor" that is used automatically + by the C compiler to transform your program before actual compilation. + It is called a macro processor because it allows you to define "macros", + which are brief abbreviations for longer constructs. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/cpp.html +Files: /usr/share/doc/gcc-@BV@-base/cpp.html + +Format: info +Index: /usr/share/info/cpp-@BV@.info.gz +Files: /usr/share/info/cpp-@BV@* --- gcc-4.8-4.8.2.orig/debian/cpp-BV-doc.doc-base.cppint +++ gcc-4.8-4.8.2/debian/cpp-BV-doc.doc-base.cppint @@ -0,0 +1,17 @@ +Document: cppinternals-@BV@ +Title: The GNU C preprocessor (internals) +Author: Various +Abstract: This brief manual documents the internals of cpplib, and + explains some of the tricky issues. It is intended that, along with + the comments in the source code, a reasonably competent C programmer + should be able to figure out what the code is doing, and why things + have been implemented the way they have. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/cppinternals.html +Files: /usr/share/doc/gcc-@BV@-base/cppinternals.html + +Format: info +Index: /usr/share/info/cppinternals-@BV@.info.gz +Files: /usr/share/info/cppinternals-@BV@* --- gcc-4.8-4.8.2.orig/debian/dh_doclink +++ gcc-4.8-4.8.2/debian/dh_doclink @@ -0,0 +1,12 @@ +#! /bin/sh + +pkg=`echo $1 | sed 's/^-p//'` +target=$2 + +[ -d debian/$pkg/usr/share/doc ] || mkdir -p debian/$pkg/usr/share/doc +if [ -d debian/$pkg/usr/share/doc/$p -a ! -h debian/$pkg/usr/share/doc/$p ] +then + echo "WARNING: removing doc directory $pkg" + rm -rf debian/$pkg/usr/share/doc/$pkg +fi +ln -sf $target debian/$pkg/usr/share/doc/$pkg --- gcc-4.8-4.8.2.orig/debian/dh_rmemptydirs +++ gcc-4.8-4.8.2/debian/dh_rmemptydirs @@ -0,0 +1,10 @@ +#! /bin/sh -e + +pkg=`echo $1 | sed 's/^-p//'` + +: # remove empty directories, when all components are in place +for d in `find debian/$pkg -depth -type d -empty 2> /dev/null`; do \ + while rmdir $d 2> /dev/null; do d=`dirname $d`; done; \ +done + +exit 0 --- gcc-4.8-4.8.2.orig/debian/dummy-man.1 +++ gcc-4.8-4.8.2/debian/dummy-man.1 @@ -0,0 +1,29 @@ +.TH @NAME@ 1 "May 24, 2003" @name@ "Debian Free Documentation" +.SH NAME +@name@ \- A program with a man page covered by the GFDL with invariant sections +.SH SYNOPSIS +@name@ [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fB@name@\fR is documented by a man page, which is covered by the "GNU +Free Documentation License" (GFDL) containing invariant sections. +.P +In November 2002, version 1.2 of the GNU Free Documentation License (GNU +FDL) was released by the Free Software Foundation after a long period +of consultation. Unfortunately, some concerns raised by members of the +Debian Project were not addressed, and as such the GNU FDL can apply +to works that do not pass the Debian Free Software Guidelines (DFSG), +and may thus only be included in the non-free component of the Debian +archive, not the Debian distribution itself. + +.SH "SEE ALSO" +.BR http://gcc.gnu.org/onlinedocs/ +for the complete documentation, +.BR http://lists.debian.org/debian-legal/2003/debian-legal-200304/msg00307.html +for a proposed statement of Debian with respect to the GFDL, +.BR gfdl(7) + +.SH AUTHOR +This manual page was written by the Debian GCC maintainers, +for the Debian GNU/Linux system. --- gcc-4.8-4.8.2.orig/debian/dummy.texi +++ gcc-4.8-4.8.2/debian/dummy.texi @@ -0,0 +1 @@ +@c This file is empty because the original one has a non DFSG free license (GFDL) --- gcc-4.8-4.8.2.orig/debian/fixincludes.in +++ gcc-4.8-4.8.2/debian/fixincludes.in @@ -0,0 +1,8 @@ +#! /bin/sh + +PATH="/@LIBEXECDIR@/install-tools:$PATH" + +TARGET_MACHINE=`dpkg-architecture -qDEB_HOST_GNU_TYPE` +export TARGET_MACHINE + +exec fixinc.sh "$@" --- gcc-4.8-4.8.2.orig/debian/g++-4.8-powerpc64le-linux-gnu.preinst +++ gcc-4.8-4.8.2/debian/g++-4.8-powerpc64le-linux-gnu.preinst @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove powerpc64le-linux-gnu-g++ /usr/bin/powerpc64le-linux-gnu-g++-4.8 +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/g++-BV-CRB.preinst.in +++ gcc-4.8-4.8.2/debian/g++-BV-CRB.preinst.in @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove @TARGET@-g++ /usr/bin/@TARGET@-g++-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcc-4.8-powerpc64le-linux-gnu.preinst +++ gcc-4.8-4.8.2/debian/gcc-4.8-powerpc64le-linux-gnu.preinst @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove powerpc64le-linux-gnu-gcc /usr/bin/powerpc64le-linux-gnu-gcc-4.8 + update-alternatives --quiet --remove powerpc64le-linux-gnu-gcov /usr/bin/powerpc64le-linux-gnu-gcov-4.8 +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcc-BV-CRB.preinst.in +++ gcc-4.8-4.8.2/debian/gcc-BV-CRB.preinst.in @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove @TARGET@-gcc /usr/bin/@TARGET@-gcc-@BV@ + update-alternatives --quiet --remove @TARGET@-gcov /usr/bin/@TARGET@-gcov-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcc-BV-doc.doc-base.gcc +++ gcc-4.8-4.8.2/debian/gcc-BV-doc.doc-base.gcc @@ -0,0 +1,14 @@ +Document: gcc-@BV@ +Title: The GNU C and C++ compiler +Author: Various +Abstract: This manual documents how to run, install and port the GNU compiler, + as well as its new features and incompatibilities, and how to report bugs. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/gcc.html +Files: /usr/share/doc/gcc-@BV@-base/gcc.html + +Format: info +Index: /usr/share/info/gcc-@BV@.info.gz +Files: /usr/share/info/gcc-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcc-BV-doc.doc-base.gccint +++ gcc-4.8-4.8.2/debian/gcc-BV-doc.doc-base.gccint @@ -0,0 +1,17 @@ +Document: gccint-@BV@ +Title: Internals of the GNU C and C++ compiler +Author: Various +Abstract: This manual documents the internals of the GNU compilers, + including how to port them to new targets and some information about + how to write front ends for new languages. It corresponds to GCC + version @BV@.x. The use of the GNU compilers is documented in a + separate manual. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/gccint.html +Files: /usr/share/doc/gcc-@BV@-base/gccint.html + +Format: info +Index: /usr/share/info/gccint-@BV@.info.gz +Files: /usr/share/info/gccint-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcc-BV-doc.doc-base.gomp +++ gcc-4.8-4.8.2/debian/gcc-BV-doc.doc-base.gomp @@ -0,0 +1,15 @@ +Document: gcc-@BV@-gomp +Title: The GNU OpenMP Implementation (for GCC @BV@) +Author: Various +Abstract: This manual documents the usage of libgomp, the GNU implementation + of the OpenMP Application Programming Interface (API) for multi-platform + shared-memory parallel programming in C/C++ and Fortran. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/libgomp.html +Files: /usr/share/doc/gcc-@BV@-base/libgomp.html + +Format: info +Index: /usr/share/info/libgomp-@BV@.info.gz +Files: /usr/share/info/libgomp-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcc-BV-doc.doc-base.itm +++ gcc-4.8-4.8.2/debian/gcc-BV-doc.doc-base.itm @@ -0,0 +1,32 @@ +Document: gcc-@BV@-itm +Title: The GNU Transactional Memory Library (for GCC @BV@) +Author: Various +Abstract: This manual documents the usage and internals of libitm, + the GNU Transactional Memory Library. It provides transaction support + for accesses to a process' memory, enabling easy-to-use synchronization + of accesses to shared memory by several threads. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/libitm.html +Files: /usr/share/doc/gcc-@BV@-base/libitm.html + +Format: info +Index: /usr/share/info/libitm-@BV@.info.gz +Files: /usr/share/info/libitm-@BV@* +Document: gcc-@BV@-itm +Title: The GNU Transactional Memory Library (for GCC @BV@) +Author: Various +Abstract: This manual documents the usage and internals of libitm, + the GNU Transactional Memory Library. It provides transaction support + for accesses to a process' memory, enabling easy-to-use synchronization + of accesses to shared memory by several threads. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/libitm.html +Files: /usr/share/doc/gcc-@BV@-base/libitm.html + +Format: info +Index: /usr/share/info/libitm-@BV@.info.gz +Files: /usr/share/info/libitm-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcc-BV-doc.doc-base.qmath +++ gcc-4.8-4.8.2/debian/gcc-BV-doc.doc-base.qmath @@ -0,0 +1,14 @@ +Document: gcc-@BV@-qmath +Title: The GCC Quad-Precision Math Library (for GCC @BV@) +Author: Various +Abstract: This manual documents the usage of libquadmath, the GCC + Quad-Precision Math Library Application Programming Interface (API). +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/libquadmath.html +Files: /usr/share/doc/gcc-@BV@-base/libquadmath.html + +Format: info +Index: /usr/share/info/libquadmath-@BV@.info.gz +Files: /usr/share/info/libquadmath-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcc-BV-hppa64.postinst +++ gcc-4.8-4.8.2/debian/gcc-BV-hppa64.postinst @@ -0,0 +1,13 @@ +#! /bin/sh -e + +prio=$(echo @BV@ | sed 's/\.//g') + +update-alternatives --quiet \ + --install /usr/bin/hppa64-linux-gnu-gcc \ + hppa64-linux-gnu-gcc \ + /usr/bin/hppa64-linux-gnu-gcc-@BV@ \ + $prio + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcc-BV-hppa64.prerm +++ gcc-4.8-4.8.2/debian/gcc-BV-hppa64.prerm @@ -0,0 +1,10 @@ +#! /bin/sh -e + +if [ "$1" != "upgrade" ]; then + update-alternatives --quiet \ + --remove hppa64-linux-gcc /usr/bin/hppa64-linux-gnu-gcc-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcc-BV-multilib.overrides +++ gcc-4.8-4.8.2/debian/gcc-BV-multilib.overrides @@ -0,0 +1 @@ +gcc-@BV@-multilib binary: binary-from-other-architecture --- gcc-4.8-4.8.2.orig/debian/gcc-BV-source.overrides +++ gcc-4.8-4.8.2/debian/gcc-BV-source.overrides @@ -0,0 +1,5 @@ +gcc-@BV@-source: changelog-file-not-compressed + +# these are patches taken over unmodified from 4.3 +gcc-@BV@-source: script-not-executable +gcc-@BV@-source: shell-script-fails-syntax-check --- gcc-4.8-4.8.2.orig/debian/gcc-XX-BV.1 +++ gcc-4.8-4.8.2/debian/gcc-XX-BV.1 @@ -0,0 +1,17 @@ +.TH GCC-@TOOL@-@BV@ 1 "May 8, 2012" gcc-@TOOL@-@BV@ "" +.SH NAME +gcc-@TOOL@ \- a wrapper around @TOOL@ adding the --plugin option + +.SH SYNOPSIS +gcc-@TOOL@ [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgcc-@TOOL@\fR is a wrapper around @TOOL@(1) adding the appropriate +\fB\-\-plugin\fR option for the GCC @BV@ compiler. + +.SH OPTIONS +See @TOOL@(1) for a list of options that @TOOL@ understands. + +.SH "SEE ALSO" +.BR @TOOL@(1) --- gcc-4.8-4.8.2.orig/debian/gcc-dummy.texi +++ gcc-4.8-4.8.2/debian/gcc-dummy.texi @@ -0,0 +1,41 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header + +@settitle The GNU Compiler Collection (GCC) + +@c Create a separate index for command line options. +@defcodeindex op +@c Merge the standard indexes into a single one. +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex ky cp +@syncodeindex pg cp +@syncodeindex tp cp + +@paragraphindent 1 + +@c %**end of header + +@copying +The current documentation is licensed under the same terms as the Debian packaging. +@end copying +@ifnottex +@dircategory Programming +@direntry +* @name@: (@name@). The GNU Compiler Collection (@name@). +@end direntry +@sp 1 +@end ifnottex + +@summarycontents +@contents +@page + +@node Top +@top Introduction +@cindex introduction +The official GNU compilers' documentation is released under the terms +of the GNU Free Documentation License with cover texts. This has been +considered non free by the Debian Project. Thus you will find it in the +non-free section of the Debian archive. +@bye --- gcc-4.8-4.8.2.orig/debian/gcc-snapshot.overrides +++ gcc-4.8-4.8.2/debian/gcc-snapshot.overrides @@ -0,0 +1,4 @@ +gcc-snapshot binary: bad-permissions-for-ali-file + +# keep patched ltdl copy +gcc-snapshot binary: embedded-library --- gcc-4.8-4.8.2.orig/debian/gcc-snapshot.prerm +++ gcc-4.8-4.8.2/debian/gcc-snapshot.prerm @@ -0,0 +1,5 @@ +#! /bin/sh -e + +rm -f /usr/lib/gcc-snapshot/share/python/*.py[co] + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/gccgo-BV-doc.doc-base +++ gcc-4.8-4.8.2/debian/gccgo-BV-doc.doc-base @@ -0,0 +1,17 @@ +Document: gccgo-@BV@ +Title: The GNU Go compiler (version @BV@) +Author: Various +Abstract: This manual describes how to use gccgo, the GNU compiler for + the Go programming language. This manual is specifically about + gccgo. For more information about the Go programming + language in general, including language specifications and standard + package documentation, see http://golang.org/. +Section: Programming + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/gccgo.html +Files: /usr/share/doc/gcc-@BV@-base/gccgo.html + +Format: info +Index: /usr/share/info/gccgo-@BV@.info.gz +Files: /usr/share/info/gccgo-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jdk.doc-base +++ gcc-4.8-4.8.2/debian/gcj-BV-jdk.doc-base @@ -0,0 +1,15 @@ +Document: gcj-@BV@ +Title: The GNU Ahead-of-time Compiler for the Java Language +Author: Various +Abstract: This manual describes how to use gcj, the GNU compiler for + the Java programming language. gcj can generate both .class files and + object files, and it can read both Java source code and .class files. +Section: Programming/Java + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/java/gcj.html +Files: /usr/share/doc/gcc-@BV@-base/java/gcj.html + +Format: info +Index: /usr/share/info/gcj-@BV@.info.gz +Files: /usr/share/info/gcj-@BV@* --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jdk.overrides +++ gcc-4.8-4.8.2/debian/gcj-BV-jdk.overrides @@ -0,0 +1 @@ +gcj-@BV@-jdk binary: wrong-name-for-upstream-changelog --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jdk.postinst +++ gcc-4.8-4.8.2/debian/gcj-BV-jdk.postinst @@ -0,0 +1,45 @@ +#! /bin/sh -e + +if [ -d /usr/share/doc/gcc-@BV@-base/java ] && [ ! -h /usr/share/doc/gcc-@BV@-base/java ]; then + rm -rf /usr/share/doc/gcc-@BV@-base/java + ln -s ../gcj-@BV@-base /usr/share/doc/gcc-@BV@-base/java +fi + +prio=@java_priority@ +update-alternatives --quiet \ + --install /usr/bin/javac javac /usr/bin/gcj-wrapper-@BV@ $prio \ + @GFDL@--slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/share/man/man1/gcj-wrapper-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/jar jar /usr/bin/gjar-@BV@ $prio \ + --slave /usr/share/man/man1/jar.1.gz jar.1.gz /usr/share/man/man1/gjar-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/jarsigner jarsigner /usr/bin/gjarsigner-@BV@ $prio \ + --slave /usr/share/man/man1/jarsigner.1.gz jarsigner.1.gz /usr/share/man/man1/gjarsigner-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/javah javah /usr/bin/gjavah-@BV@ $prio \ + --slave /usr/share/man/man1/javah.1.gz javah.1.gz /usr/share/man/man1/gjavah-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/javadoc javadoc /usr/bin/gjdoc-@BV@ $prio \ + --slave /usr/share/man/man1/javadoc.1.gz javadoc.1.gz /usr/share/man/man1/gjdoc-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/native2ascii native2ascii /usr/bin/gnative2ascii-@BV@ $prio \ + --slave /usr/share/man/man1/native2ascii.1.gz native2ascii.1.gz /usr/share/man/man1/gnative2ascii-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/rmic rmic /usr/bin/grmic-@BV@ $prio \ + @GFDL@--slave /usr/share/man/man1/rmic.1.gz rmic.1.gz /usr/share/man/man1/grmic-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/serialver serialver /usr/bin/gserialver-@BV@ $prio \ + --slave /usr/share/man/man1/serialver.1.gz serialver.1.gz /usr/share/man/man1/gserialver-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/tnameserv tnameserv /usr/bin/gtnameserv-@BV@ $prio \ + --slave /usr/share/man/man1/tnameserv.1.gz tnameserv.1.gz /usr/share/man/man1/gtnameserv-@BV@.1.gz + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jdk.prerm +++ gcc-4.8-4.8.2/debian/gcj-BV-jdk.prerm @@ -0,0 +1,15 @@ +#! /bin/sh -e + +if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ]; then + update-alternatives --quiet --remove javac /usr/bin/gcj-wrapper-@BV@ + update-alternatives --quiet --remove jar /usr/bin/gjar-@BV@ + update-alternatives --quiet --remove jarsigner /usr/bin/gjarsigner-@BV@ + update-alternatives --quiet --remove javah /usr/bin/gjavah-@BV@ + update-alternatives --quiet --remove javadoc /usr/bin/gjdoc-@BV@ + update-alternatives --quiet --remove native2ascii /usr/bin/gnative2ascii-@BV@ + update-alternatives --quiet --remove rmic /usr/bin/grmic-@BV@ + update-alternatives --quiet --remove serialver /usr/bin/gserialver-@BV@ + update-alternatives --quiet --remove tnameserv /usr/bin/gtnameserv-@BV@ +fi + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jre-headless.overrides +++ gcc-4.8-4.8.2/debian/gcj-BV-jre-headless.overrides @@ -0,0 +1,5 @@ +# pick up the exact version, in case another gcj version is installed +gcj-@BV@-jre-headless binary: binary-or-shlib-defines-rpath + +# don't strip the binaries, keep the libgcj13-dbg package Multi-Arch: same +gcj-@BV@-jre-headless binary: unstripped-binary-or-object --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jre-headless.postinst +++ gcc-4.8-4.8.2/debian/gcj-BV-jre-headless.postinst @@ -0,0 +1,48 @@ +#! /bin/sh -e + +prio=@java_priority@ + +update-alternatives --quiet \ + --install /usr/bin/java java /usr/bin/gij-@BV@ $prio \ + @GFDL@--slave /usr/share/man/man1/java.1.gz java.1.gz /usr/share/man/man1/gij-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/rmiregistry rmiregistry /usr/bin/grmiregistry-@BV@ $prio \ + --slave /usr/share/man/man1/rmiregistry.1.gz rmiregistry.1.gz /usr/share/man/man1/grmiregistry-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/keytool keytool /usr/bin/gkeytool-@BV@ $prio \ + --slave /usr/share/man/man1/keytool.1.gz keytool.1.gz /usr/share/man/man1/gkeytool-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/orbd orbd /usr/bin/gorbd-@BV@ $prio \ + --slave /usr/share/man/man1/orbd.1.gz orbd.1.gz /usr/share/man/man1/gorbd-@BV@.1.gz + +update-alternatives --quiet \ + --install /usr/bin/rmid rmid /usr/bin/grmid-@BV@ $prio \ + --slave /usr/share/man/man1/rmid.1.gz rmid.1.gz /usr/share/man/man1/grmid-@BV@.1.gz + +case "$1" in +configure) + if [ ! -f /var/lib/gcj-@BV@/classmap.db ]; then + uname=$(uname -m) + mkdir -p /var/lib/gcj-@BV@ + if gcj-dbtool-@BV@ -n /var/lib/gcj-@BV@/classmap.db; then + case "$uname" in arm*|m68k|parisc*) + echo >&2 "gcj-dbtool succeeded unexpectedly" + esac + else + case "$uname" in + arm*|m68k|parisc*) + echo >&2 "ERROR: gcj-dbtool did fail; known problem on $uname";; + *) + exit 2 + esac + touch /var/lib/gcj-@BV@/classmap.db + fi + fi +esac + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jre-headless.postrm +++ gcc-4.8-4.8.2/debian/gcj-BV-jre-headless.postrm @@ -0,0 +1,10 @@ +#! /bin/sh -e + +case "$1" in + purge) + rm -f /var/lib/gcj-@BV@/classmap.db +esac + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcj-BV-jre-headless.prerm +++ gcc-4.8-4.8.2/debian/gcj-BV-jre-headless.prerm @@ -0,0 +1,13 @@ +#! /bin/sh -e + +if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ]; then + update-alternatives --quiet --remove java /usr/bin/gij-@BV@ + update-alternatives --quiet --remove rmiregistry /usr/bin/grmiregistry-@BV@ + update-alternatives --quiet --remove keytool /usr/bin/gkeytool-@BV@ + update-alternatives --quiet --remove orbd /usr/bin/gorbd-@BV@ + update-alternatives --quiet --remove rmid /usr/bin/grmid-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gcj-wrapper-BV +++ gcc-4.8-4.8.2/debian/gcj-wrapper-BV @@ -0,0 +1,91 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java compiler. +# +# Command-line arguments should be in the style of Sun's Java compiler; +# these will be converted to gcj arguments before being passed to the +# gcj itself. +# +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gcj-wrapper-3.2 shell script. + +use strict; + +# The real Java compiler: +my $javaCompiler = '/usr/bin/gcj-@BV@'; + +# The command-line arguments to pass to the real Java compiler: +my @commandLine; + +# The warning flags to pass to the GNU Java compiler: +my $warnings = '-Wall'; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; +my $copyNextArg = 0; +my $ignoreNextArg = 0; +my $appendNextArg = ''; +foreach my $arg (@ARGV) { + # See if we already know what to do with this argument. + if ($ignoreNextArg) { + # Throw it away. + $ignoreNextArg = 0; + next; + } elsif ($copyNextArg or not $parsingOptions) { + # Copy it directly. + push @commandLine, $arg; + $copyNextArg = 0; + next; + } elsif ($appendNextArg) { + # Append it to $appendNextArg and then copy directly. + push @commandLine, ($appendNextArg . $arg); + $appendNextArg = ''; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-classpath' or $arg eq '--classpath' or $arg eq '--cp') { + $appendNextArg = '--classpath='; + } elsif ($arg eq '-encoding' or $arg eq '-bootclasspath' or + $arg eq '-extdirs') { + $appendNextArg = '-' . $arg . '='; + } elsif ($arg eq '-d') { + push @commandLine, '-d'; + $copyNextArg = 1; + } elsif ($arg eq '-nowarn') { + $warnings = ''; + } elsif ($arg =~ /^-g/) { + # Some kind of debugging option - just switch debugging on. + push @commandLine, '-g' if ($arg ne '-g:none'); + } elsif ($arg eq '-O') { + push @commandLine, '-O2'; + } elsif ($arg eq '-Xss') { + push @commandLine, $arg; + } elsif ($arg =~ /^-X/) { + # An extended Sun option (which we don't support). + push @commandLine, '--help' if ($arg eq '-X'); + } elsif ($arg eq '-source' or $arg eq '-sourcepath' or $arg eq '-target') { + # An unsupported option with a following argument. + $ignoreNextArg = 1; + } elsif ($arg =~ /^-/) { + # An unsupported standalone option. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Was there a partial argument that was never completed? +push @commandLine, $appendNextArg if ($appendNextArg); + +# Call the real Java compiler. +my @fullCommandLine = ( $javaCompiler, '-C' ); +push @fullCommandLine, $warnings if ($warnings); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-4.8-4.8.2.orig/debian/gcj-wrapper-BV.1 +++ gcc-4.8-4.8.2/debian/gcj-wrapper-BV.1 @@ -0,0 +1,20 @@ +.TH GCJ-WRAPPER 1 "June 6, 2002" gcj-wrapper "Java User's Manual" +.SH NAME +gcj-wrapper \- a wrapper around gcj + +.SH SYNOPSIS +gcj-wrapper [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgcj-wrapper\fR is a wrapper around gcj(1) to be called as the java +compiler. Options different for javac(1) and gcj(1) are translated, +options unknown to gcj(1) are silently ignored. + +.SH OPTIONS +See gcj-@BV@(1) for a list of options that gcj understands. + +.SH "SEE ALSO" +.BR gcj-@BV@(1) +, +.BR javac(1) --- gcc-4.8-4.8.2.orig/debian/gcjh-wrapper-BV +++ gcc-4.8-4.8.2/debian/gcjh-wrapper-BV @@ -0,0 +1,86 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java header generator. +# +# Command-line arguments should be in the style of Sun's javah command; +# these will be converted to gcjh arguments before being passed to the +# gcjh itself. +# +# Copyright (C) 2003 by Peter Hawkins +# Haphazardly hacked up based on the gcj-wrapper perl script. +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gcj-wrapper-3.2 shell script. + +use strict; + +# The real Java header generator: +my $javaHeaderGen = '/usr/bin/gcjh-@BV@'; + +# The command-line arguments to pass to the real Java compiler: +my @commandLine; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; +my $copyNextArg = 0; +my $ignoreNextArg = 0; +my $appendNextArg = ''; +foreach my $arg (@ARGV) { + # See if we already know what to do with this argument. + if ($ignoreNextArg) { + # Throw it away. + $ignoreNextArg = 0; + next; + } elsif ($copyNextArg or not $parsingOptions) { + # Copy it directly. + push @commandLine, $arg; + $copyNextArg = 0; + next; + } elsif ($appendNextArg) { + # Append it to $appendNextArg and then copy directly. + push @commandLine, ($appendNextArg . $arg); + $appendNextArg = ''; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-verbose') { + push @commandLine, '--verbose'; + } elsif ($arg eq '-classpath' or $arg eq '--classpath' or $arg eq '--cp') { + $appendNextArg = '--classpath='; + } elsif ($arg eq '-encoding' or $arg eq '-bootclasspath' or + $arg eq '-extdirs') { + $appendNextArg = "-".$arg . '='; + } elsif ($arg eq '-d') { + push @commandLine, '-d'; + $copyNextArg = 1; + } elsif ($arg eq '-o') { + push @commandLine, '-o'; + $copyNextArg = 1; + } elsif ($arg eq '-stubs') { + push @commandLine, '-stubs'; + } elsif ($arg eq '-jni') { + push @commandLine, '-jni'; + } elsif ($arg =~ /^-old/) { + # An extended Sun option (which we don't support). + push @commandLine, '--help' if ($arg eq '-old'); + } elsif ($arg =~ /^-/) { + # An unsupported standalone option. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Was there a partial argument that was never completed? +push @commandLine, $appendNextArg if ($appendNextArg); + +# Call the real Java header generator. +my @fullCommandLine = ( $javaHeaderGen ); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-4.8-4.8.2.orig/debian/gcjh-wrapper-BV.1 +++ gcc-4.8-4.8.2/debian/gcjh-wrapper-BV.1 @@ -0,0 +1,20 @@ +.TH GCJH-WRAPPER 1 "June 6, 2002" gcjh-wrapper "Java User's Manual" +.SH NAME +gcjh-wrapper \- a wrapper around gcjh + +.SH SYNOPSIS +gcjh-wrapper [\fB\s-1OPTION\s0\fR] ... [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgcjh-wrapper\fR is a wrapper around gcjh(1) to be called as the java header +compiler. Options different for javah(1) and gcjh(1) are translated, +options unknown to gcjh(1) are silently ignored. + +.SH OPTIONS +See gcjh-@BV@(1) for a list of options that gcj understands. + +.SH "SEE ALSO" +.BR gcjh-@BV@(1) +, +.BR javah(1) --- gcc-4.8-4.8.2.orig/debian/gfortran-4.8-powerpc64le-linux-gnu.preinst +++ gcc-4.8-4.8.2/debian/gfortran-4.8-powerpc64le-linux-gnu.preinst @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove powerpc64le-linux-gnu-gfortran /usr/bin/powerpc64le-linux-gnu-gfortran-4.8 +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gfortran-BV-CRB.preinst.in +++ gcc-4.8-4.8.2/debian/gfortran-BV-CRB.preinst.in @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if [ "$1" = "upgrade" ] || [ "$1" = "configure" ]; then + update-alternatives --quiet --remove @TARGET@-gfortran /usr/bin/@TARGET@-gfortran-@BV@ +fi + +#DEBHELPER# + +exit 0 --- gcc-4.8-4.8.2.orig/debian/gfortran-BV-doc.doc-base +++ gcc-4.8-4.8.2/debian/gfortran-BV-doc.doc-base @@ -0,0 +1,14 @@ +Document: gfortran-@BV@ +Title: The GNU Fortran Compiler +Author: Various +Abstract: This manual documents how to run, install and port `gfortran', + as well as its new features and incompatibilities, and how to report bugs. +Section: Programming/Fortran + +Format: html +Index: /usr/share/doc/gcc-@BV@-base/fortran/gfortran.html +Files: /usr/share/doc/gcc-@BV@-base/fortran/gfortran.html + +Format: info +Index: /usr/share/info/gfortran-@BV@.info.gz +Files: /usr/share/info/gfortran-@BV@* --- gcc-4.8-4.8.2.orig/debian/gij-hppa +++ gcc-4.8-4.8.2/debian/gij-hppa @@ -0,0 +1,10 @@ +#! /bin/sh + +prctl= + +case "$(prctl --unaligned=)" in *signal) + echo >&2 "$(basename $0): ignore unaligned memory accesses" + prctl="prctl --unaligned=default" +esac + +exec $prctl /usr/bin/gij-4.8.bin "$@" --- gcc-4.8-4.8.2.orig/debian/gij-wrapper-BV +++ gcc-4.8-4.8.2/debian/gij-wrapper-BV @@ -0,0 +1,98 @@ +#!/usr/bin/perl -w +# +# Starts the GNU Java interpreter. +# +# Command-line arguments should be in the style of Sun's Java runtime; +# these will be converted to gij arguments before being passed to the +# gij itself. +# +# The Debian JNI module directory and any other specified JNI +# directories will be included on the JNI search path. +# +# Copyright (C) 2002-2003 by Ben Burton +# Based on the original gij-wrapper-3.2 shell script. + +use strict; + +# The real Java runtime: +my $javaRuntime = '/usr/bin/gij-@BV@'; + +# The debian JNI module directory: +my $debianJNIDir = '/usr/lib/jni'; + +# The command-line arguments to pass to the real Java runtime: +my @commandLine; + +# The full JNI search path to use: +my $JNIPath = ''; + +# Build the command-line from the arguments given. +my $parsingOptions = 1; + +# Flag used to copy argument to -classpath or -cp. +my $copyNext = 0; +foreach my $arg (@ARGV) { + if (not $parsingOptions) { + # We're done parsing options; just copy all remaining arguments directly. + push @commandLine, $arg; + next; + } + if ($copyNext) { + push @commandLine, $arg; + $copyNext = 0; + next; + } + + # Try to interpret Sun-style options. + if ($arg eq '-version') { + push @commandLine, '--version'; + } elsif ($arg eq '-h' or $arg eq '-help') { + push @commandLine, '--help'; + } elsif ($arg eq '-cp' or $arg eq '--cp') { + push @commandLine, '-cp'; + $copyNext = 1; + } elsif ($arg eq '-classpath' or $arg eq '--classpath') { + push @commandLine, '-classpath'; + $copyNext = 1; + } elsif ($arg =~ /^-Djava.library.path=(.+)$/) { + # A component of the JNI search path has been given. + if ($JNIPath) { + $JNIPath = $JNIPath . ':' . $1; + } else { + $JNIPath = $1; + } + } elsif ($arg eq '-jar' or $arg =~ /^-D/) { + # Copy the argument directly. + push @commandLine, $arg; + } elsif ($arg =~ /^-/) { + # An unrecognised option has been passed - just drop it. + } else { + # Some non-option argument has been given. + # Stop parsing options at this point. + push @commandLine, $arg; + $parsingOptions = 0; + } +} + +# Add the debian JNI module directory to the JNI search path if it's not +# already there. +if ($JNIPath !~ /(^|:)$debianJNIDir($|:)/) { + if ($JNIPath) { + $JNIPath = $JNIPath . ':' . $debianJNIDir; + } else { + $JNIPath = $debianJNIDir; + } +} + +# Use environment variable $LTDL_LIBRARY_PATH to store the JNI path, +# since gij uses libltdl to dlopen JNI modules. +if ($ENV{LTDL_LIBRARY_PATH}) { + $ENV{LTDL_LIBRARY_PATH} = $ENV{LTDL_LIBRARY_PATH} . ':' . $JNIPath; +} else { + $ENV{LTDL_LIBRARY_PATH} = $JNIPath; +} + +# Call the real Java runtime. +my @fullCommandLine = ( $javaRuntime ); +push @fullCommandLine, @commandLine; +exec @fullCommandLine or exit(1); --- gcc-4.8-4.8.2.orig/debian/gij-wrapper-BV.1 +++ gcc-4.8-4.8.2/debian/gij-wrapper-BV.1 @@ -0,0 +1,22 @@ +.TH GIJ-WRAPPER 1 "August 11, 2001" gij-wrapper "Java User's Manual" +.SH NAME +gij-wrapper \- a wrapper around gij + +.SH SYNOPSIS +gij-wrapper [\fB\s-1OPTION\s0\fR] ... \fI\s-1JARFILE\s0\fR [\fI\s-1ARGS\s0\fR...] +.PP +gij-wrapper [\fB\-jar\fR] [\fB\s-1OPTION\s0\fR] ... \fI\s-1CLASS\s0\fR [\fI\s-1ARGS\s0\fR...] + +.SH DESCRIPTION + +\fBgij-wrapper\fR is a wrapper around gij(1) to be called as the java +interpreter. Options different for java(1) and gij(1) are translated, +options unknown to gij(1) are silently ignored. + +.SH OPTIONS +See gij-@BV@(1) for a list of options that gij understands. + +.SH "SEE ALSO" +.BR gij-@BV@(1) +, +.BR java(1) --- gcc-4.8-4.8.2.orig/debian/gnat-BV-doc.doc-base.rm +++ gcc-4.8-4.8.2/debian/gnat-BV-doc.doc-base.rm @@ -0,0 +1,16 @@ +Document: gnat-rm-@BV@ +Title: GNAT (GNU Ada) Reference Manual +Author: Various +Abstract: This manual contains useful information in writing programs + using the GNAT compiler. It includes information on implementation + dependent characteristics of GNAT, including all the information + required by Annex M of the standard. +Section: Programming/Ada + +Format: html +Index: /usr/share/doc/gnat-@BV@-doc/gnat_rm.html +Files: /usr/share/doc/gnat-@BV@-doc/gnat_rm.html + +Format: info +Index: /usr/share/info/gnat_rm-@BV@.info.gz +Files: /usr/share/info/gnat_rm-@BV@* --- gcc-4.8-4.8.2.orig/debian/gnat-BV-doc.doc-base.style +++ gcc-4.8-4.8.2/debian/gnat-BV-doc.doc-base.style @@ -0,0 +1,16 @@ +Document: gnat-style-@BV@ +Title: GNAT Coding Style +Author: Various +Abstract: Most of GNAT is written in Ada using a consistent style to + ensure readability of the code. This document has been written to + help maintain this consistent style, while having a large group of + developers work on the compiler. +Section: Programming/Ada + +Format: html +Index: /usr/share/doc/gnat-@BV@-doc/gnat-style.html +Files: /usr/share/doc/gnat-@BV@-doc/gnat-style.html + +Format: info +Index: /usr/share/info/gnat-style-@BV@.info.gz +Files: /usr/share/info/gnat-style-@BV@* --- gcc-4.8-4.8.2.orig/debian/gnat-BV-doc.doc-base.ug +++ gcc-4.8-4.8.2/debian/gnat-BV-doc.doc-base.ug @@ -0,0 +1,16 @@ +Document: gnat-ugn-@BV@ +Title: GNAT User's Guide for Unix Platforms +Author: Various +Abstract: This guide describes the use of GNAT, a compiler and + software development toolset for the full Ada 95 programming language. + It describes the features of the compiler and tools, and details how + to use them to build Ada 95 applications. +Section: Programming/Ada + +Format: html +Index: /usr/share/doc/gnat-@BV@-doc/gnat_ugn.html +Files: /usr/share/doc/gnat-@BV@-doc/gnat_ugn.html + +Format: info +Index: /usr/share/info/gnat_ugn-@BV@.info.gz +Files: /usr/share/info/gnat_ugn-@BV@* --- gcc-4.8-4.8.2.orig/debian/gnat-BV.overrides +++ gcc-4.8-4.8.2/debian/gnat-BV.overrides @@ -0,0 +1 @@ +gnat-@BV@ binary: quilt-build-dep-but-no-series-file --- gcc-4.8-4.8.2.orig/debian/gnat.1 +++ gcc-4.8-4.8.2/debian/gnat.1 @@ -0,0 +1,43 @@ +.\" Hey, Emacs! This is an -*- nroff -*- source file. +.\" +.\" Copyright (C) 1996 Erick Branderhorst +.\" Copyright (C) 2011 Nicolas Boulenguez +.\" +.\" This is free software; you can redistribute it and/or modify it under +.\" the terms of the GNU General Public License as published by the Free +.\" Software Foundation; either version 2, or (at your option) any later +.\" version. +.\" +.\" This is distributed in the hope that it will be useful, but WITHOUT +.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +.\" for more details. +.\" +.\" You should have received a copy of the GNU General Public License with +.\" your Debian GNU/Linux system, in /usr/doc/copyright/GPL, or with the +.\" dpkg source package as the file COPYING. If not, write to the Free +.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +.\" +.\" +.TH "GNAT TOOLBOX" 1 "Jun 2002" "Debian Project" "Debian Linux" +.SH NAME +gnat, gnatbind, gnatbl, gnatchop, gnatfind, gnathtml, gnatkr, gnatlink, +gnatls, gnatmake, gnatprep, gnatpsta, gnatpsys, gnatxref \- +GNAT toolbox +.SH DESCRIPTION +Those programs are part of GNU GNAT, a freely available Ada 95 compiler. +.PP +For accessing the full GNAT manuals, use +.B info gnat-ug-4.8 +and +.B info gnat-rm-4.8 +for the sections related to the reference manual. +If those sections cannot be found, you will have to install the +gnat-4.4-doc package as well (since these manuals contain invariant parts, +the package is located in the non-free part of the Debian archive). +You may also browse +.B http://gcc.gnu.org/onlinedocs +which provides the GCC online documentation. +.SH AUTHOR +This manpage has been written by Samuel Tardieu , for the +Debian GNU/Linux project. --- gcc-4.8-4.8.2.orig/debian/gnatprj.gpr +++ gcc-4.8-4.8.2/debian/gnatprj.gpr @@ -0,0 +1,32 @@ +-- Project file for use with GNAT +-- Copyright (c) 2005, 2008 Ludovic Brenta +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- This project file is designed to help build applications that use +-- GNAT project files. Here is an example of how to use this project file: +-- +-- with "gnatprj"; +-- project Example is +-- for Object_Dir use "obj"; +-- for Exec_Dir use "."; +-- for Main use ("example"); +-- end Example; + +with "gnatvsn.gpr"; +project Gnatprj is + for Library_Name use "gnatprj"; + for Library_Dir use "/usr/lib"; + for Library_Kind use "dynamic"; + for Source_Dirs use ("/usr/share/ada/adainclude/gnatprj"); + for Library_ALI_Dir use "/usr/lib/ada/adalib/gnatprj"; + for Externally_Built use "true"; +end Gnatprj; --- gcc-4.8-4.8.2.orig/debian/gnatvsn.gpr +++ gcc-4.8-4.8.2/debian/gnatvsn.gpr @@ -0,0 +1,31 @@ +-- Project file for use with GNAT +-- Copyright (c) 2005, 2008 Ludovic Brenta +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- This project file is designed to help build applications that use +-- GNAT project files. Here is an example of how to use this project file: +-- +-- with "gnatvsn"; +-- project Example is +-- for Object_Dir use "obj"; +-- for Exec_Dir use "."; +-- for Main use ("example"); +-- end Example; + +project Gnatvsn is + for Library_Name use "gnatvsn"; + for Library_Dir use "/usr/lib"; + for Library_Kind use "dynamic"; + for Source_Dirs use ("/usr/share/ada/adainclude/gnatvsn"); + for Library_ALI_Dir use "/usr/lib/ada/adalib/gnatvsn"; + for Externally_Built use "true"; +end Gnatvsn; --- gcc-4.8-4.8.2.orig/debian/jdb.sh +++ gcc-4.8-4.8.2/debian/jdb.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Placeholder script to fake a +# JDK compatible JAVA_HOME directory. + +echo >&2 "This script is only a placeholder." +echo >&2 "Some programs need a JDK rather than only a JRE to work." +echo >&2 "They test for this tool to detect a JDK installation, but" +echo >&2 "don't really need its functionality to work correctly." --- gcc-4.8-4.8.2.orig/debian/lib32asan0.overrides +++ gcc-4.8-4.8.2/debian/lib32asan0.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +lib32asan0 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/lib32asan0.symbols +++ gcc-4.8-4.8.2/debian/lib32asan0.symbols @@ -0,0 +1,3 @@ +libasan.so.0 lib32asan0 #MINVER# +#include "libasan0.symbols.common" +#include "libasan0.symbols.32" --- gcc-4.8-4.8.2.orig/debian/lib32atomic1.symbols +++ gcc-4.8-4.8.2/debian/lib32atomic1.symbols @@ -0,0 +1,2 @@ +libatomic.so.1 lib32atomic1 #MINVER# +#include "libatomic1.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gcc1.symbols.amd64 +++ gcc-4.8-4.8.2/debian/lib32gcc1.symbols.amd64 @@ -0,0 +1,140 @@ +libgcc_s.so.1 lib32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.5.0@GCC_4.5.0 1:4.5.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_4.4.0 1:4.4.0 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __extendxftf2@GCC_4.5.0 1:4.5.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfsi@GCC_3.0 1:4.1.1 + __fixxfdi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatdixf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatundixf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrdi3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/lib32gcc1.symbols.kfreebsd-amd64 +++ gcc-4.8-4.8.2/debian/lib32gcc1.symbols.kfreebsd-amd64 @@ -0,0 +1,140 @@ +libgcc_s.so.1 lib32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.5.0@GCC_4.5.0 1:4.5.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_4.4.0 1:4.4.0 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __extendxftf2@GCC_4.5.0 1:4.5.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfsi@GCC_3.0 1:4.1.1 + __fixxfdi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatdixf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatundixf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrdi3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/lib32gcc1.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/lib32gcc1.symbols.ppc64 @@ -0,0 +1,142 @@ +libgcc_s.so.1 lib32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __adddf3@GCC_3.0 1:4.1.1 + __addsf3@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.1.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.1.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_4.1.0 1:4.1.1 + __gcc_qdiv@GCC_4.1.0 1:4.1.1 + __gcc_qmul@GCC_4.1.0 1:4.1.1 + __gcc_qsub@GCC_4.1.0 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negsf2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subdf3@GCC_3.0 1:4.1.1 + __subsf3@GCC_3.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trampoline_setup@GCC_3.4.2 1:4.1.1 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib32gcc1.symbols.s390x +++ gcc-4.8-4.8.2/debian/lib32gcc1.symbols.s390x @@ -0,0 +1,104 @@ +libgcc_s.so.1 lib32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.1.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.1.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib32gcc1.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/lib32gcc1.symbols.sparc64 @@ -0,0 +1,96 @@ +libgcc_s.so.1 lib32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib32gccLC.postinst +++ gcc-4.8-4.8.2/debian/lib32gccLC.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/lib32gcc@LC@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.overrides +++ gcc-4.8-4.8.2/debian/lib32gfortran3.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +lib32gfortran3 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols @@ -0,0 +1,3 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.amd64 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.amd64 @@ -0,0 +1,9 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16.powerpc" + _gfortran_norm2_r10@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex128@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex128_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128_write@GFORTRAN_1.4 4.6 --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.mips64 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.mips64 @@ -0,0 +1,2 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.mips64el +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.mips64el @@ -0,0 +1,2 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.mipsn32 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.mipsn32 @@ -0,0 +1,2 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.mipsn32el +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.mipsn32el @@ -0,0 +1,2 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.ppc64 @@ -0,0 +1,3 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.s390x +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.s390x @@ -0,0 +1,3 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.sparc64 @@ -0,0 +1,2 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32gfortran3.symbols.x32 +++ gcc-4.8-4.8.2/debian/lib32gfortran3.symbols.x32 @@ -0,0 +1,4 @@ +libgfortran.so.3 lib32gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/lib32gomp1.symbols +++ gcc-4.8-4.8.2/debian/lib32gomp1.symbols @@ -0,0 +1,4 @@ +libgomp.so.1 lib32gomp1 #MINVER# +#include "libgomp1.symbols.common" + GOMP_atomic_end@GOMP_1.0 4.2.1 + GOMP_atomic_start@GOMP_1.0 4.2.1 --- gcc-4.8-4.8.2.orig/debian/lib32itm1.symbols +++ gcc-4.8-4.8.2/debian/lib32itm1.symbols @@ -0,0 +1,4 @@ +libitm.so.1 lib32itm1 #MINVER# +#include "libitm1.symbols.common" +#include "libitm1.symbols.32bit" +(arch=amd64 i386 x32)#include "libitm1.symbols.x86" --- gcc-4.8-4.8.2.orig/debian/lib32objc4.symbols +++ gcc-4.8-4.8.2/debian/lib32objc4.symbols @@ -0,0 +1,3 @@ +libobjc.so.4 lib32objc4 #MINVER# +#include "libobjc4.symbols.common" + __gnu_objc_personality_v0@Base 4.2.1 --- gcc-4.8-4.8.2.orig/debian/lib32quadmath0.symbols +++ gcc-4.8-4.8.2/debian/lib32quadmath0.symbols @@ -0,0 +1,2 @@ +libquadmath.so.0 lib32quadmath0 #MINVER# +#include "libquadmath0.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib32stdc++6.symbols.amd64 +++ gcc-4.8-4.8.2/debian/lib32stdc++6.symbols.amd64 @@ -0,0 +1,6 @@ +libstdc++.so.6 lib32stdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/lib32stdc++6.symbols.kfreebsd-amd64 +++ gcc-4.8-4.8.2/debian/lib32stdc++6.symbols.kfreebsd-amd64 @@ -0,0 +1,6 @@ +libstdc++.so.6 lib32stdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/lib32stdc++6.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/lib32stdc++6.symbols.ppc64 @@ -0,0 +1,8 @@ +libstdc++.so.6 lib32stdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/lib32stdc++6.symbols.s390x +++ gcc-4.8-4.8.2/debian/lib32stdc++6.symbols.s390x @@ -0,0 +1,557 @@ +libstdc++.so.6 lib32stdc++6 #MINVER# +#include "libstdc++6.symbols.common" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list6_M_getEm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs16find_last_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSs4copyEPcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSsixEm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12_M_transformEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12_M_transformEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS6_PcS7_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5.0 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5.0 + _ZNSbIwSt11char_traitsIwESaIwEE10_S_compareEmm@GLIBCXX_3.4.16 4.7 + _ZNKSt8valarrayImE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE18_S_construct_aux_2EmwRKS1_@GLIBCXX_3.4.14 4.5.0 + _ZNSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPci@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi4readEPci@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSi6ignoreEii@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPci@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi8readsomeEPci@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSo5writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSo8_M_writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSs10_S_compareEmm@GLIBCXX_3.4.16 4.7 + _ZNSs12_S_constructEmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs14_M_replace_auxEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs15_M_replace_safeEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs18_S_construct_aux_2EmcRKSaIcE@GLIBCXX_3.4.14 4.5.0 + _ZNSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSs4_Rep8_M_cloneERKSaIcEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep9_S_createEmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmmc@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEmc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4.5 4.1.1 + _ZNSs9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsixEm@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_allocEm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_setupEPcS0_i@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1Ei@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2Ei@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8_M_pbumpEPcS4_x@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8_M_pbumpEPwS4_x@GLIBCXX_3.4.16 4.7 + _ZNSt15messages_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEm@GLIBCXX_3.4.7 4.1.1 + _ZNSt6locale5_ImplC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEixEm@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZSt11_Hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt15_Fnv_hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__verify_groupingPKcmRKSs@GLIBCXX_3.4.10 4.3 + _ZSt21__copy_streambufs_eofIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZSt21__copy_streambufs_eofIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZThn8_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _Znam@GLIBCXX_3.4 4.1.1 + _ZnamRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _Znwm@GLIBCXX_3.4 4.1.1 + _ZnwmRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit.s390" + _ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib32stdc++6.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/lib32stdc++6.symbols.sparc64 @@ -0,0 +1,8 @@ +libstdc++.so.6 lib32stdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/lib32stdc++CXX.postinst +++ gcc-4.8-4.8.2/debian/lib32stdc++CXX.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/lib32stdc++@CXX@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/lib64asan0.overrides +++ gcc-4.8-4.8.2/debian/lib64asan0.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +lib64asan0 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/lib64asan0.symbols +++ gcc-4.8-4.8.2/debian/lib64asan0.symbols @@ -0,0 +1,3 @@ +libasan.so.0 lib64asan0 #MINVER# +#include "libasan0.symbols.common" +#include "libasan0.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64atomic1.symbols +++ gcc-4.8-4.8.2/debian/lib64atomic1.symbols @@ -0,0 +1,3 @@ +libatomic.so.1 lib64atomic1 #MINVER# +#include "libatomic1.symbols.common" +#include "libatomic1.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.i386 +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.i386 @@ -0,0 +1,150 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addtf3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GCC_3.0 1:4.1.1 + __deregister_frame_info@GCC_3.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.3 + __divtc3@GCC_4.3.0 1:4.4.0 + __divtf3@GCC_4.3.0 1:4.3 + __divti3@GCC_3.0 1:4.1.1 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.3.0 1:4.3 + __extenddftf2@GCC_4.3.0 1:4.3 + __extendsftf2@GCC_4.3.0 1:4.3 + __extendxftf2@GCC_4.3.0 1:4.3 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.3.0 1:4.3 + __fixtfsi@GCC_4.3.0 1:4.3 + __fixtfti@GCC_4.3.0 1:4.3 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.3.0 1:4.3 + __fixunstfsi@GCC_4.3.0 1:4.3 + __fixunstfti@GCC_4.3.0 1:4.3 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfti@GCC_3.0 1:4.1.1 + __fixxfti@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.3.0 1:4.3 + __floatsitf@GCC_4.3.0 1:4.3 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_4.3.0 1:4.3 + __floattixf@GCC_3.0 1:4.1.1 + __floatunditf@GCC_4.3.0 1:4.3 + __floatunsitf@GCC_4.3.0 1:4.3 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.3.0 1:4.3 + __floatuntixf@GCC_4.2.0 1:4.2.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.3.0 1:4.3 + __gttf2@GCC_3.0 1:4.3 + __gttf2@GCC_4.3.0 1:4.4.0 + __letf2@GCC_4.3.0 1:4.3 + __lshrti3@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.3 + __lttf2@GCC_4.3.0 1:4.4.0 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.3 + __multc3@GCC_4.3.0 1:4.4.0 + __multf3@GCC_4.3.0 1:4.3 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negtf2@GCC_4.3.0 1:4.3 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __netf2@GCC_3.0 1:4.3 + __netf2@GCC_4.3.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.3 + __powitf2@GCC_4.3.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GCC_3.0 1:4.1.1 + __register_frame_info@GCC_3.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GCC_3.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GCC_3.0 1:4.1.1 + __subtf3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __trunctfdf2@GCC_4.3.0 1:4.3 + __trunctfsf2@GCC_4.3.0 1:4.3 + __trunctfxf2@GCC_4.3.0 1:4.3 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + __unordtf2@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.mips +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.mips @@ -0,0 +1,1749 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.2.0 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4 + GCC_4.5.0@GCC_4.5.0 1:4.5 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __addta3@GCC_4.3.0 1:4.3 + __addtf3@GCC_3.0 1:4.1.1 + __addtq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __adduta3@GCC_4.3.0 1:4.3 + __addutq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashlta3@GCC_4.3.0 1:4.3 + __ashlti3@GCC_3.0 1:4.1.1 + __ashltq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashluta3@GCC_4.3.0 1:4.3 + __ashlutq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __ashrta3@GCC_4.3.0 1:4.3 + __ashrti3@GCC_3.0 1:4.1.1 + __ashrtq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpta2@GCC_4.3.0 1:4.3 + __cmpti2@GCC_3.0 1:4.1.1 + __cmptq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __cmputa2@GCC_4.3.0 1:4.3 + __cmputq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __divta3@GCC_4.3.0 1:4.3 + __divtc3@GCC_4.0.0 1:4.1.1 + __divtf3@GCC_3.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __divtq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __eqtf2@GCC_3.0 1:4.1.1 + __extenddftf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __extendsftf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfsi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfsi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdata2@GCC_4.3.0 1:4.3 + __fractdati@GCC_4.3.0 1:4.3 + __fractdatq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdauta@GCC_4.3.0 1:4.3 + __fractdautq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfta@GCC_4.3.0 1:4.3 + __fractdftq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdfuta@GCC_4.3.0 1:4.3 + __fractdfutq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdita@GCC_4.3.0 1:4.3 + __fractditq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdiuta@GCC_4.3.0 1:4.3 + __fractdiutq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdqta@GCC_4.3.0 1:4.3 + __fractdqti@GCC_4.3.0 1:4.3 + __fractdqtq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fractdquta@GCC_4.3.0 1:4.3 + __fractdqutq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthata2@GCC_4.3.0 1:4.3 + __fracthati@GCC_4.3.0 1:4.3 + __fracthatq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthauta@GCC_4.3.0 1:4.3 + __fracthautq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthita@GCC_4.3.0 1:4.3 + __fracthitq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthiuta@GCC_4.3.0 1:4.3 + __fracthiutq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthqta@GCC_4.3.0 1:4.3 + __fracthqti@GCC_4.3.0 1:4.3 + __fracthqtq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fracthquta@GCC_4.3.0 1:4.3 + __fracthqutq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqita@GCC_4.3.0 1:4.3 + __fractqitq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqiuta@GCC_4.3.0 1:4.3 + __fractqiutq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqqta@GCC_4.3.0 1:4.3 + __fractqqti@GCC_4.3.0 1:4.3 + __fractqqtq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractqquta@GCC_4.3.0 1:4.3 + __fractqqutq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsata2@GCC_4.3.0 1:4.3 + __fractsati@GCC_4.3.0 1:4.3 + __fractsatq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsauta@GCC_4.3.0 1:4.3 + __fractsautq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfta@GCC_4.3.0 1:4.3 + __fractsftq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsfuta@GCC_4.3.0 1:4.3 + __fractsfutq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsita@GCC_4.3.0 1:4.3 + __fractsitq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsiuta@GCC_4.3.0 1:4.3 + __fractsiutq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsqta@GCC_4.3.0 1:4.3 + __fractsqti@GCC_4.3.0 1:4.3 + __fractsqtq2@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractsquta@GCC_4.3.0 1:4.3 + __fractsqutq@GCC_4.3.0 1:4.3 + __fracttada2@GCC_4.3.0 1:4.3 + __fracttadf@GCC_4.3.0 1:4.3 + __fracttadi@GCC_4.3.0 1:4.3 + __fracttadq@GCC_4.3.0 1:4.3 + __fracttaha2@GCC_4.3.0 1:4.3 + __fracttahi@GCC_4.3.0 1:4.3 + __fracttahq@GCC_4.3.0 1:4.3 + __fracttaqi@GCC_4.3.0 1:4.3 + __fracttaqq@GCC_4.3.0 1:4.3 + __fracttasa2@GCC_4.3.0 1:4.3 + __fracttasf@GCC_4.3.0 1:4.3 + __fracttasi@GCC_4.3.0 1:4.3 + __fracttasq@GCC_4.3.0 1:4.3 + __fracttati@GCC_4.3.0 1:4.3 + __fracttatq@GCC_4.3.0 1:4.3 + __fracttauda@GCC_4.3.0 1:4.3 + __fracttaudq@GCC_4.3.0 1:4.3 + __fracttauha@GCC_4.3.0 1:4.3 + __fracttauhq@GCC_4.3.0 1:4.3 + __fracttauqq@GCC_4.3.0 1:4.3 + __fracttausa@GCC_4.3.0 1:4.3 + __fracttausq@GCC_4.3.0 1:4.3 + __fracttauta@GCC_4.3.0 1:4.3 + __fracttautq@GCC_4.3.0 1:4.3 + __fracttida@GCC_4.3.0 1:4.3 + __fracttidq@GCC_4.3.0 1:4.3 + __fracttiha@GCC_4.3.0 1:4.3 + __fracttihq@GCC_4.3.0 1:4.3 + __fracttiqq@GCC_4.3.0 1:4.3 + __fracttisa@GCC_4.3.0 1:4.3 + __fracttisq@GCC_4.3.0 1:4.3 + __fracttita@GCC_4.3.0 1:4.3 + __fracttitq@GCC_4.3.0 1:4.3 + __fracttiuda@GCC_4.3.0 1:4.3 + __fracttiudq@GCC_4.3.0 1:4.3 + __fracttiuha@GCC_4.3.0 1:4.3 + __fracttiuhq@GCC_4.3.0 1:4.3 + __fracttiuqq@GCC_4.3.0 1:4.3 + __fracttiusa@GCC_4.3.0 1:4.3 + __fracttiusq@GCC_4.3.0 1:4.3 + __fracttiuta@GCC_4.3.0 1:4.3 + __fracttiutq@GCC_4.3.0 1:4.3 + __fracttqda@GCC_4.3.0 1:4.3 + __fracttqdf@GCC_4.3.0 1:4.3 + __fracttqdi@GCC_4.3.0 1:4.3 + __fracttqdq2@GCC_4.3.0 1:4.3 + __fracttqha@GCC_4.3.0 1:4.3 + __fracttqhi@GCC_4.3.0 1:4.3 + __fracttqhq2@GCC_4.3.0 1:4.3 + __fracttqqi@GCC_4.3.0 1:4.3 + __fracttqqq2@GCC_4.3.0 1:4.3 + __fracttqsa@GCC_4.3.0 1:4.3 + __fracttqsf@GCC_4.3.0 1:4.3 + __fracttqsi@GCC_4.3.0 1:4.3 + __fracttqsq2@GCC_4.3.0 1:4.3 + __fracttqta@GCC_4.3.0 1:4.3 + __fracttqti@GCC_4.3.0 1:4.3 + __fracttquda@GCC_4.3.0 1:4.3 + __fracttqudq@GCC_4.3.0 1:4.3 + __fracttquha@GCC_4.3.0 1:4.3 + __fracttquhq@GCC_4.3.0 1:4.3 + __fracttquqq@GCC_4.3.0 1:4.3 + __fracttqusa@GCC_4.3.0 1:4.3 + __fracttqusq@GCC_4.3.0 1:4.3 + __fracttquta@GCC_4.3.0 1:4.3 + __fracttqutq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudata@GCC_4.3.0 1:4.3 + __fractudati@GCC_4.3.0 1:4.3 + __fractudatq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudauta2@GCC_4.3.0 1:4.3 + __fractudautq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudqta@GCC_4.3.0 1:4.3 + __fractudqti@GCC_4.3.0 1:4.3 + __fractudqtq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractudquta@GCC_4.3.0 1:4.3 + __fractudqutq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhata@GCC_4.3.0 1:4.3 + __fractuhati@GCC_4.3.0 1:4.3 + __fractuhatq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhauta2@GCC_4.3.0 1:4.3 + __fractuhautq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhqta@GCC_4.3.0 1:4.3 + __fractuhqti@GCC_4.3.0 1:4.3 + __fractuhqtq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractuhquta@GCC_4.3.0 1:4.3 + __fractuhqutq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdati@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdita@GCC_4.3.0 1:4.3 + __fractunsditq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdiuta@GCC_4.3.0 1:4.3 + __fractunsdiutq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunsdqti@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshati@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshita@GCC_4.3.0 1:4.3 + __fractunshitq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshiuta@GCC_4.3.0 1:4.3 + __fractunshiutq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunshqti@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqita@GCC_4.3.0 1:4.3 + __fractunsqitq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqiuta@GCC_4.3.0 1:4.3 + __fractunsqiutq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunsqqti@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssati@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssita@GCC_4.3.0 1:4.3 + __fractunssitq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssiuta@GCC_4.3.0 1:4.3 + __fractunssiutq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunssqti@GCC_4.3.0 1:4.3 + __fractunstadi@GCC_4.3.0 1:4.3 + __fractunstahi@GCC_4.3.0 1:4.3 + __fractunstaqi@GCC_4.3.0 1:4.3 + __fractunstasi@GCC_4.3.0 1:4.3 + __fractunstati@GCC_4.3.0 1:4.3 + __fractunstida@GCC_4.3.0 1:4.3 + __fractunstidq@GCC_4.3.0 1:4.3 + __fractunstiha@GCC_4.3.0 1:4.3 + __fractunstihq@GCC_4.3.0 1:4.3 + __fractunstiqq@GCC_4.3.0 1:4.3 + __fractunstisa@GCC_4.3.0 1:4.3 + __fractunstisq@GCC_4.3.0 1:4.3 + __fractunstita@GCC_4.3.0 1:4.3 + __fractunstitq@GCC_4.3.0 1:4.3 + __fractunstiuda@GCC_4.3.0 1:4.3 + __fractunstiudq@GCC_4.3.0 1:4.3 + __fractunstiuha@GCC_4.3.0 1:4.3 + __fractunstiuhq@GCC_4.3.0 1:4.3 + __fractunstiuqq@GCC_4.3.0 1:4.3 + __fractunstiusa@GCC_4.3.0 1:4.3 + __fractunstiusq@GCC_4.3.0 1:4.3 + __fractunstiuta@GCC_4.3.0 1:4.3 + __fractunstiutq@GCC_4.3.0 1:4.3 + __fractunstqdi@GCC_4.3.0 1:4.3 + __fractunstqhi@GCC_4.3.0 1:4.3 + __fractunstqqi@GCC_4.3.0 1:4.3 + __fractunstqsi@GCC_4.3.0 1:4.3 + __fractunstqti@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudati@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsudqti@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhati@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuhqti@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsuqqti@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusati@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractunsusqti@GCC_4.3.0 1:4.3 + __fractunsutadi@GCC_4.3.0 1:4.3 + __fractunsutahi@GCC_4.3.0 1:4.3 + __fractunsutaqi@GCC_4.3.0 1:4.3 + __fractunsutasi@GCC_4.3.0 1:4.3 + __fractunsutati@GCC_4.3.0 1:4.3 + __fractunsutqdi@GCC_4.3.0 1:4.3 + __fractunsutqhi@GCC_4.3.0 1:4.3 + __fractunsutqqi@GCC_4.3.0 1:4.3 + __fractunsutqsi@GCC_4.3.0 1:4.3 + __fractunsutqti@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqqta@GCC_4.3.0 1:4.3 + __fractuqqti@GCC_4.3.0 1:4.3 + __fractuqqtq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractuqquta@GCC_4.3.0 1:4.3 + __fractuqqutq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusata@GCC_4.3.0 1:4.3 + __fractusati@GCC_4.3.0 1:4.3 + __fractusatq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusauta2@GCC_4.3.0 1:4.3 + __fractusautq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusqta@GCC_4.3.0 1:4.3 + __fractusqti@GCC_4.3.0 1:4.3 + __fractusqtq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __fractusquta@GCC_4.3.0 1:4.3 + __fractusqutq2@GCC_4.3.0 1:4.3 + __fractutada@GCC_4.3.0 1:4.3 + __fractutadf@GCC_4.3.0 1:4.3 + __fractutadi@GCC_4.3.0 1:4.3 + __fractutadq@GCC_4.3.0 1:4.3 + __fractutaha@GCC_4.3.0 1:4.3 + __fractutahi@GCC_4.3.0 1:4.3 + __fractutahq@GCC_4.3.0 1:4.3 + __fractutaqi@GCC_4.3.0 1:4.3 + __fractutaqq@GCC_4.3.0 1:4.3 + __fractutasa@GCC_4.3.0 1:4.3 + __fractutasf@GCC_4.3.0 1:4.3 + __fractutasi@GCC_4.3.0 1:4.3 + __fractutasq@GCC_4.3.0 1:4.3 + __fractutata@GCC_4.3.0 1:4.3 + __fractutati@GCC_4.3.0 1:4.3 + __fractutatq@GCC_4.3.0 1:4.3 + __fractutauda2@GCC_4.3.0 1:4.3 + __fractutaudq@GCC_4.3.0 1:4.3 + __fractutauha2@GCC_4.3.0 1:4.3 + __fractutauhq@GCC_4.3.0 1:4.3 + __fractutauqq@GCC_4.3.0 1:4.3 + __fractutausa2@GCC_4.3.0 1:4.3 + __fractutausq@GCC_4.3.0 1:4.3 + __fractutautq@GCC_4.3.0 1:4.3 + __fractutqda@GCC_4.3.0 1:4.3 + __fractutqdf@GCC_4.3.0 1:4.3 + __fractutqdi@GCC_4.3.0 1:4.3 + __fractutqdq@GCC_4.3.0 1:4.3 + __fractutqha@GCC_4.3.0 1:4.3 + __fractutqhi@GCC_4.3.0 1:4.3 + __fractutqhq@GCC_4.3.0 1:4.3 + __fractutqqi@GCC_4.3.0 1:4.3 + __fractutqqq@GCC_4.3.0 1:4.3 + __fractutqsa@GCC_4.3.0 1:4.3 + __fractutqsf@GCC_4.3.0 1:4.3 + __fractutqsi@GCC_4.3.0 1:4.3 + __fractutqsq@GCC_4.3.0 1:4.3 + __fractutqta@GCC_4.3.0 1:4.3 + __fractutqti@GCC_4.3.0 1:4.3 + __fractutqtq@GCC_4.3.0 1:4.3 + __fractutquda@GCC_4.3.0 1:4.3 + __fractutqudq2@GCC_4.3.0 1:4.3 + __fractutquha@GCC_4.3.0 1:4.3 + __fractutquhq2@GCC_4.3.0 1:4.3 + __fractutquqq2@GCC_4.3.0 1:4.3 + __fractutqusa@GCC_4.3.0 1:4.3 + __fractutqusq2@GCC_4.3.0 1:4.3 + __fractutquta@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __getf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __gttf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __letf2@GCC_3.0 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __lshruta3@GCC_4.3.0 1:4.3 + __lshrutq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __multa3@GCC_4.3.0 1:4.3 + __multc3@GCC_4.0.0 1:4.1.1 + __multf3@GCC_3.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __multq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __muluta3@GCC_4.3.0 1:4.3 + __mulutq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __negta2@GCC_4.3.0 1:4.3 + __negtf2@GCC_3.0 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negtq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __neguta2@GCC_4.3.0 1:4.3 + __negutq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __netf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdata2@GCC_4.3.0 1:4.3 + __satfractdatq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdauta@GCC_4.3.0 1:4.3 + __satfractdautq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfta@GCC_4.3.0 1:4.3 + __satfractdftq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdfuta@GCC_4.3.0 1:4.3 + __satfractdfutq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdita@GCC_4.3.0 1:4.3 + __satfractditq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdiuta@GCC_4.3.0 1:4.3 + __satfractdiutq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdqta@GCC_4.3.0 1:4.3 + __satfractdqtq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfractdquta@GCC_4.3.0 1:4.3 + __satfractdqutq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthata2@GCC_4.3.0 1:4.3 + __satfracthatq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthauta@GCC_4.3.0 1:4.3 + __satfracthautq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthita@GCC_4.3.0 1:4.3 + __satfracthitq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthiuta@GCC_4.3.0 1:4.3 + __satfracthiutq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthqta@GCC_4.3.0 1:4.3 + __satfracthqtq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfracthquta@GCC_4.3.0 1:4.3 + __satfracthqutq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqita@GCC_4.3.0 1:4.3 + __satfractqitq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqiuta@GCC_4.3.0 1:4.3 + __satfractqiutq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqqta@GCC_4.3.0 1:4.3 + __satfractqqtq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractqquta@GCC_4.3.0 1:4.3 + __satfractqqutq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsata2@GCC_4.3.0 1:4.3 + __satfractsatq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsauta@GCC_4.3.0 1:4.3 + __satfractsautq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfta@GCC_4.3.0 1:4.3 + __satfractsftq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsfuta@GCC_4.3.0 1:4.3 + __satfractsfutq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsita@GCC_4.3.0 1:4.3 + __satfractsitq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsiuta@GCC_4.3.0 1:4.3 + __satfractsiutq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsqta@GCC_4.3.0 1:4.3 + __satfractsqtq2@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractsquta@GCC_4.3.0 1:4.3 + __satfractsqutq@GCC_4.3.0 1:4.3 + __satfracttada2@GCC_4.3.0 1:4.3 + __satfracttadq@GCC_4.3.0 1:4.3 + __satfracttaha2@GCC_4.3.0 1:4.3 + __satfracttahq@GCC_4.3.0 1:4.3 + __satfracttaqq@GCC_4.3.0 1:4.3 + __satfracttasa2@GCC_4.3.0 1:4.3 + __satfracttasq@GCC_4.3.0 1:4.3 + __satfracttatq@GCC_4.3.0 1:4.3 + __satfracttauda@GCC_4.3.0 1:4.3 + __satfracttaudq@GCC_4.3.0 1:4.3 + __satfracttauha@GCC_4.3.0 1:4.3 + __satfracttauhq@GCC_4.3.0 1:4.3 + __satfracttauqq@GCC_4.3.0 1:4.3 + __satfracttausa@GCC_4.3.0 1:4.3 + __satfracttausq@GCC_4.3.0 1:4.3 + __satfracttauta@GCC_4.3.0 1:4.3 + __satfracttautq@GCC_4.3.0 1:4.3 + __satfracttida@GCC_4.3.0 1:4.3 + __satfracttidq@GCC_4.3.0 1:4.3 + __satfracttiha@GCC_4.3.0 1:4.3 + __satfracttihq@GCC_4.3.0 1:4.3 + __satfracttiqq@GCC_4.3.0 1:4.3 + __satfracttisa@GCC_4.3.0 1:4.3 + __satfracttisq@GCC_4.3.0 1:4.3 + __satfracttita@GCC_4.3.0 1:4.3 + __satfracttitq@GCC_4.3.0 1:4.3 + __satfracttiuda@GCC_4.3.0 1:4.3 + __satfracttiudq@GCC_4.3.0 1:4.3 + __satfracttiuha@GCC_4.3.0 1:4.3 + __satfracttiuhq@GCC_4.3.0 1:4.3 + __satfracttiuqq@GCC_4.3.0 1:4.3 + __satfracttiusa@GCC_4.3.0 1:4.3 + __satfracttiusq@GCC_4.3.0 1:4.3 + __satfracttiuta@GCC_4.3.0 1:4.3 + __satfracttiutq@GCC_4.3.0 1:4.3 + __satfracttqda@GCC_4.3.0 1:4.3 + __satfracttqdq2@GCC_4.3.0 1:4.3 + __satfracttqha@GCC_4.3.0 1:4.3 + __satfracttqhq2@GCC_4.3.0 1:4.3 + __satfracttqqq2@GCC_4.3.0 1:4.3 + __satfracttqsa@GCC_4.3.0 1:4.3 + __satfracttqsq2@GCC_4.3.0 1:4.3 + __satfracttqta@GCC_4.3.0 1:4.3 + __satfracttquda@GCC_4.3.0 1:4.3 + __satfracttqudq@GCC_4.3.0 1:4.3 + __satfracttquha@GCC_4.3.0 1:4.3 + __satfracttquhq@GCC_4.3.0 1:4.3 + __satfracttquqq@GCC_4.3.0 1:4.3 + __satfracttqusa@GCC_4.3.0 1:4.3 + __satfracttqusq@GCC_4.3.0 1:4.3 + __satfracttquta@GCC_4.3.0 1:4.3 + __satfracttqutq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudata@GCC_4.3.0 1:4.3 + __satfractudatq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudauta2@GCC_4.3.0 1:4.3 + __satfractudautq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudqta@GCC_4.3.0 1:4.3 + __satfractudqtq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractudquta@GCC_4.3.0 1:4.3 + __satfractudqutq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhata@GCC_4.3.0 1:4.3 + __satfractuhatq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhauta2@GCC_4.3.0 1:4.3 + __satfractuhautq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhqta@GCC_4.3.0 1:4.3 + __satfractuhqtq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractuhquta@GCC_4.3.0 1:4.3 + __satfractuhqutq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdita@GCC_4.3.0 1:4.3 + __satfractunsditq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunsdiuta@GCC_4.3.0 1:4.3 + __satfractunsdiutq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshita@GCC_4.3.0 1:4.3 + __satfractunshitq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunshiuta@GCC_4.3.0 1:4.3 + __satfractunshiutq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqita@GCC_4.3.0 1:4.3 + __satfractunsqitq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunsqiuta@GCC_4.3.0 1:4.3 + __satfractunsqiutq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssita@GCC_4.3.0 1:4.3 + __satfractunssitq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractunssiuta@GCC_4.3.0 1:4.3 + __satfractunssiutq@GCC_4.3.0 1:4.3 + __satfractunstida@GCC_4.3.0 1:4.3 + __satfractunstidq@GCC_4.3.0 1:4.3 + __satfractunstiha@GCC_4.3.0 1:4.3 + __satfractunstihq@GCC_4.3.0 1:4.3 + __satfractunstiqq@GCC_4.3.0 1:4.3 + __satfractunstisa@GCC_4.3.0 1:4.3 + __satfractunstisq@GCC_4.3.0 1:4.3 + __satfractunstita@GCC_4.3.0 1:4.3 + __satfractunstitq@GCC_4.3.0 1:4.3 + __satfractunstiuda@GCC_4.3.0 1:4.3 + __satfractunstiudq@GCC_4.3.0 1:4.3 + __satfractunstiuha@GCC_4.3.0 1:4.3 + __satfractunstiuhq@GCC_4.3.0 1:4.3 + __satfractunstiuqq@GCC_4.3.0 1:4.3 + __satfractunstiusa@GCC_4.3.0 1:4.3 + __satfractunstiusq@GCC_4.3.0 1:4.3 + __satfractunstiuta@GCC_4.3.0 1:4.3 + __satfractunstiutq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqqta@GCC_4.3.0 1:4.3 + __satfractuqqtq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractuqquta@GCC_4.3.0 1:4.3 + __satfractuqqutq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusata@GCC_4.3.0 1:4.3 + __satfractusatq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusauta2@GCC_4.3.0 1:4.3 + __satfractusautq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusqta@GCC_4.3.0 1:4.3 + __satfractusqtq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __satfractusquta@GCC_4.3.0 1:4.3 + __satfractusqutq2@GCC_4.3.0 1:4.3 + __satfractutada@GCC_4.3.0 1:4.3 + __satfractutadq@GCC_4.3.0 1:4.3 + __satfractutaha@GCC_4.3.0 1:4.3 + __satfractutahq@GCC_4.3.0 1:4.3 + __satfractutaqq@GCC_4.3.0 1:4.3 + __satfractutasa@GCC_4.3.0 1:4.3 + __satfractutasq@GCC_4.3.0 1:4.3 + __satfractutata@GCC_4.3.0 1:4.3 + __satfractutatq@GCC_4.3.0 1:4.3 + __satfractutauda2@GCC_4.3.0 1:4.3 + __satfractutaudq@GCC_4.3.0 1:4.3 + __satfractutauha2@GCC_4.3.0 1:4.3 + __satfractutauhq@GCC_4.3.0 1:4.3 + __satfractutauqq@GCC_4.3.0 1:4.3 + __satfractutausa2@GCC_4.3.0 1:4.3 + __satfractutausq@GCC_4.3.0 1:4.3 + __satfractutautq@GCC_4.3.0 1:4.3 + __satfractutqda@GCC_4.3.0 1:4.3 + __satfractutqdq@GCC_4.3.0 1:4.3 + __satfractutqha@GCC_4.3.0 1:4.3 + __satfractutqhq@GCC_4.3.0 1:4.3 + __satfractutqqq@GCC_4.3.0 1:4.3 + __satfractutqsa@GCC_4.3.0 1:4.3 + __satfractutqsq@GCC_4.3.0 1:4.3 + __satfractutqta@GCC_4.3.0 1:4.3 + __satfractutqtq@GCC_4.3.0 1:4.3 + __satfractutquda@GCC_4.3.0 1:4.3 + __satfractutqudq2@GCC_4.3.0 1:4.3 + __satfractutquha@GCC_4.3.0 1:4.3 + __satfractutquhq2@GCC_4.3.0 1:4.3 + __satfractutquqq2@GCC_4.3.0 1:4.3 + __satfractutqusa@GCC_4.3.0 1:4.3 + __satfractutqusq2@GCC_4.3.0 1:4.3 + __satfractutquta@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssaddta3@GCC_4.3.0 1:4.3 + __ssaddtq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssashlta3@GCC_4.3.0 1:4.3 + __ssashltq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssdivta3@GCC_4.3.0 1:4.3 + __ssdivtq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssmulta3@GCC_4.3.0 1:4.3 + __ssmultq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __ssnegta2@GCC_4.3.0 1:4.3 + __ssnegtq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __sssubta3@GCC_4.3.0 1:4.3 + __sssubtq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subta3@GCC_4.3.0 1:4.3 + __subtf3@GCC_3.0 1:4.1.1 + __subtq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subuta3@GCC_4.3.0 1:4.3 + __subutq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_8@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_8@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_synchronize@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_8@GCC_4.4.0 1:4.4 + __truncdfsf2@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_3.0 1:4.1.1 + __trunctfsf2@GCC_3.0 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __udivuta3@GCC_4.3.0 1:4.3 + __udivutq3@GCC_4.3.0 1:4.3 + __umodti3@GCC_3.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __unordtf2@GCC_4.5.0 1:4.5 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usadduta3@GCC_4.3.0 1:4.3 + __usaddutq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usashluta3@GCC_4.3.0 1:4.3 + __usashlutq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usdivuta3@GCC_4.3.0 1:4.3 + __usdivutq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usmuluta3@GCC_4.3.0 1:4.3 + __usmulutq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __usneguta2@GCC_4.3.0 1:4.3 + __usnegutq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 + __ussubuta3@GCC_4.3.0 1:4.3 + __ussubutq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.mipsel +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.mipsel @@ -0,0 +1,1749 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.2.0 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4 + GCC_4.5.0@GCC_4.5.0 1:4.5 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __addta3@GCC_4.3.0 1:4.3 + __addtf3@GCC_3.0 1:4.1.1 + __addtq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __adduta3@GCC_4.3.0 1:4.3 + __addutq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashlta3@GCC_4.3.0 1:4.3 + __ashlti3@GCC_3.0 1:4.1.1 + __ashltq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashluta3@GCC_4.3.0 1:4.3 + __ashlutq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __ashrta3@GCC_4.3.0 1:4.3 + __ashrti3@GCC_3.0 1:4.1.1 + __ashrtq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpta2@GCC_4.3.0 1:4.3 + __cmpti2@GCC_3.0 1:4.1.1 + __cmptq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __cmputa2@GCC_4.3.0 1:4.3 + __cmputq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __divta3@GCC_4.3.0 1:4.3 + __divtc3@GCC_4.0.0 1:4.1.1 + __divtf3@GCC_3.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __divtq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __eqtf2@GCC_3.0 1:4.1.1 + __extenddftf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __extendsftf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfsi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfsi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdata2@GCC_4.3.0 1:4.3 + __fractdati@GCC_4.3.0 1:4.3 + __fractdatq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdauta@GCC_4.3.0 1:4.3 + __fractdautq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfta@GCC_4.3.0 1:4.3 + __fractdftq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdfuta@GCC_4.3.0 1:4.3 + __fractdfutq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdita@GCC_4.3.0 1:4.3 + __fractditq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdiuta@GCC_4.3.0 1:4.3 + __fractdiutq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdqta@GCC_4.3.0 1:4.3 + __fractdqti@GCC_4.3.0 1:4.3 + __fractdqtq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fractdquta@GCC_4.3.0 1:4.3 + __fractdqutq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthata2@GCC_4.3.0 1:4.3 + __fracthati@GCC_4.3.0 1:4.3 + __fracthatq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthauta@GCC_4.3.0 1:4.3 + __fracthautq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthita@GCC_4.3.0 1:4.3 + __fracthitq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthiuta@GCC_4.3.0 1:4.3 + __fracthiutq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthqta@GCC_4.3.0 1:4.3 + __fracthqti@GCC_4.3.0 1:4.3 + __fracthqtq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fracthquta@GCC_4.3.0 1:4.3 + __fracthqutq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqita@GCC_4.3.0 1:4.3 + __fractqitq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqiuta@GCC_4.3.0 1:4.3 + __fractqiutq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqqta@GCC_4.3.0 1:4.3 + __fractqqti@GCC_4.3.0 1:4.3 + __fractqqtq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractqquta@GCC_4.3.0 1:4.3 + __fractqqutq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsata2@GCC_4.3.0 1:4.3 + __fractsati@GCC_4.3.0 1:4.3 + __fractsatq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsauta@GCC_4.3.0 1:4.3 + __fractsautq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfta@GCC_4.3.0 1:4.3 + __fractsftq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsfuta@GCC_4.3.0 1:4.3 + __fractsfutq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsita@GCC_4.3.0 1:4.3 + __fractsitq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsiuta@GCC_4.3.0 1:4.3 + __fractsiutq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsqta@GCC_4.3.0 1:4.3 + __fractsqti@GCC_4.3.0 1:4.3 + __fractsqtq2@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractsquta@GCC_4.3.0 1:4.3 + __fractsqutq@GCC_4.3.0 1:4.3 + __fracttada2@GCC_4.3.0 1:4.3 + __fracttadf@GCC_4.3.0 1:4.3 + __fracttadi@GCC_4.3.0 1:4.3 + __fracttadq@GCC_4.3.0 1:4.3 + __fracttaha2@GCC_4.3.0 1:4.3 + __fracttahi@GCC_4.3.0 1:4.3 + __fracttahq@GCC_4.3.0 1:4.3 + __fracttaqi@GCC_4.3.0 1:4.3 + __fracttaqq@GCC_4.3.0 1:4.3 + __fracttasa2@GCC_4.3.0 1:4.3 + __fracttasf@GCC_4.3.0 1:4.3 + __fracttasi@GCC_4.3.0 1:4.3 + __fracttasq@GCC_4.3.0 1:4.3 + __fracttati@GCC_4.3.0 1:4.3 + __fracttatq@GCC_4.3.0 1:4.3 + __fracttauda@GCC_4.3.0 1:4.3 + __fracttaudq@GCC_4.3.0 1:4.3 + __fracttauha@GCC_4.3.0 1:4.3 + __fracttauhq@GCC_4.3.0 1:4.3 + __fracttauqq@GCC_4.3.0 1:4.3 + __fracttausa@GCC_4.3.0 1:4.3 + __fracttausq@GCC_4.3.0 1:4.3 + __fracttauta@GCC_4.3.0 1:4.3 + __fracttautq@GCC_4.3.0 1:4.3 + __fracttida@GCC_4.3.0 1:4.3 + __fracttidq@GCC_4.3.0 1:4.3 + __fracttiha@GCC_4.3.0 1:4.3 + __fracttihq@GCC_4.3.0 1:4.3 + __fracttiqq@GCC_4.3.0 1:4.3 + __fracttisa@GCC_4.3.0 1:4.3 + __fracttisq@GCC_4.3.0 1:4.3 + __fracttita@GCC_4.3.0 1:4.3 + __fracttitq@GCC_4.3.0 1:4.3 + __fracttiuda@GCC_4.3.0 1:4.3 + __fracttiudq@GCC_4.3.0 1:4.3 + __fracttiuha@GCC_4.3.0 1:4.3 + __fracttiuhq@GCC_4.3.0 1:4.3 + __fracttiuqq@GCC_4.3.0 1:4.3 + __fracttiusa@GCC_4.3.0 1:4.3 + __fracttiusq@GCC_4.3.0 1:4.3 + __fracttiuta@GCC_4.3.0 1:4.3 + __fracttiutq@GCC_4.3.0 1:4.3 + __fracttqda@GCC_4.3.0 1:4.3 + __fracttqdf@GCC_4.3.0 1:4.3 + __fracttqdi@GCC_4.3.0 1:4.3 + __fracttqdq2@GCC_4.3.0 1:4.3 + __fracttqha@GCC_4.3.0 1:4.3 + __fracttqhi@GCC_4.3.0 1:4.3 + __fracttqhq2@GCC_4.3.0 1:4.3 + __fracttqqi@GCC_4.3.0 1:4.3 + __fracttqqq2@GCC_4.3.0 1:4.3 + __fracttqsa@GCC_4.3.0 1:4.3 + __fracttqsf@GCC_4.3.0 1:4.3 + __fracttqsi@GCC_4.3.0 1:4.3 + __fracttqsq2@GCC_4.3.0 1:4.3 + __fracttqta@GCC_4.3.0 1:4.3 + __fracttqti@GCC_4.3.0 1:4.3 + __fracttquda@GCC_4.3.0 1:4.3 + __fracttqudq@GCC_4.3.0 1:4.3 + __fracttquha@GCC_4.3.0 1:4.3 + __fracttquhq@GCC_4.3.0 1:4.3 + __fracttquqq@GCC_4.3.0 1:4.3 + __fracttqusa@GCC_4.3.0 1:4.3 + __fracttqusq@GCC_4.3.0 1:4.3 + __fracttquta@GCC_4.3.0 1:4.3 + __fracttqutq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudata@GCC_4.3.0 1:4.3 + __fractudati@GCC_4.3.0 1:4.3 + __fractudatq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudauta2@GCC_4.3.0 1:4.3 + __fractudautq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudqta@GCC_4.3.0 1:4.3 + __fractudqti@GCC_4.3.0 1:4.3 + __fractudqtq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractudquta@GCC_4.3.0 1:4.3 + __fractudqutq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhata@GCC_4.3.0 1:4.3 + __fractuhati@GCC_4.3.0 1:4.3 + __fractuhatq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhauta2@GCC_4.3.0 1:4.3 + __fractuhautq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhqta@GCC_4.3.0 1:4.3 + __fractuhqti@GCC_4.3.0 1:4.3 + __fractuhqtq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractuhquta@GCC_4.3.0 1:4.3 + __fractuhqutq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdati@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdita@GCC_4.3.0 1:4.3 + __fractunsditq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdiuta@GCC_4.3.0 1:4.3 + __fractunsdiutq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunsdqti@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshati@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshita@GCC_4.3.0 1:4.3 + __fractunshitq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshiuta@GCC_4.3.0 1:4.3 + __fractunshiutq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunshqti@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqita@GCC_4.3.0 1:4.3 + __fractunsqitq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqiuta@GCC_4.3.0 1:4.3 + __fractunsqiutq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunsqqti@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssati@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssita@GCC_4.3.0 1:4.3 + __fractunssitq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssiuta@GCC_4.3.0 1:4.3 + __fractunssiutq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunssqti@GCC_4.3.0 1:4.3 + __fractunstadi@GCC_4.3.0 1:4.3 + __fractunstahi@GCC_4.3.0 1:4.3 + __fractunstaqi@GCC_4.3.0 1:4.3 + __fractunstasi@GCC_4.3.0 1:4.3 + __fractunstati@GCC_4.3.0 1:4.3 + __fractunstida@GCC_4.3.0 1:4.3 + __fractunstidq@GCC_4.3.0 1:4.3 + __fractunstiha@GCC_4.3.0 1:4.3 + __fractunstihq@GCC_4.3.0 1:4.3 + __fractunstiqq@GCC_4.3.0 1:4.3 + __fractunstisa@GCC_4.3.0 1:4.3 + __fractunstisq@GCC_4.3.0 1:4.3 + __fractunstita@GCC_4.3.0 1:4.3 + __fractunstitq@GCC_4.3.0 1:4.3 + __fractunstiuda@GCC_4.3.0 1:4.3 + __fractunstiudq@GCC_4.3.0 1:4.3 + __fractunstiuha@GCC_4.3.0 1:4.3 + __fractunstiuhq@GCC_4.3.0 1:4.3 + __fractunstiuqq@GCC_4.3.0 1:4.3 + __fractunstiusa@GCC_4.3.0 1:4.3 + __fractunstiusq@GCC_4.3.0 1:4.3 + __fractunstiuta@GCC_4.3.0 1:4.3 + __fractunstiutq@GCC_4.3.0 1:4.3 + __fractunstqdi@GCC_4.3.0 1:4.3 + __fractunstqhi@GCC_4.3.0 1:4.3 + __fractunstqqi@GCC_4.3.0 1:4.3 + __fractunstqsi@GCC_4.3.0 1:4.3 + __fractunstqti@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudati@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsudqti@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhati@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuhqti@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsuqqti@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusati@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractunsusqti@GCC_4.3.0 1:4.3 + __fractunsutadi@GCC_4.3.0 1:4.3 + __fractunsutahi@GCC_4.3.0 1:4.3 + __fractunsutaqi@GCC_4.3.0 1:4.3 + __fractunsutasi@GCC_4.3.0 1:4.3 + __fractunsutati@GCC_4.3.0 1:4.3 + __fractunsutqdi@GCC_4.3.0 1:4.3 + __fractunsutqhi@GCC_4.3.0 1:4.3 + __fractunsutqqi@GCC_4.3.0 1:4.3 + __fractunsutqsi@GCC_4.3.0 1:4.3 + __fractunsutqti@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqqta@GCC_4.3.0 1:4.3 + __fractuqqti@GCC_4.3.0 1:4.3 + __fractuqqtq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractuqquta@GCC_4.3.0 1:4.3 + __fractuqqutq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusata@GCC_4.3.0 1:4.3 + __fractusati@GCC_4.3.0 1:4.3 + __fractusatq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusauta2@GCC_4.3.0 1:4.3 + __fractusautq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusqta@GCC_4.3.0 1:4.3 + __fractusqti@GCC_4.3.0 1:4.3 + __fractusqtq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __fractusquta@GCC_4.3.0 1:4.3 + __fractusqutq2@GCC_4.3.0 1:4.3 + __fractutada@GCC_4.3.0 1:4.3 + __fractutadf@GCC_4.3.0 1:4.3 + __fractutadi@GCC_4.3.0 1:4.3 + __fractutadq@GCC_4.3.0 1:4.3 + __fractutaha@GCC_4.3.0 1:4.3 + __fractutahi@GCC_4.3.0 1:4.3 + __fractutahq@GCC_4.3.0 1:4.3 + __fractutaqi@GCC_4.3.0 1:4.3 + __fractutaqq@GCC_4.3.0 1:4.3 + __fractutasa@GCC_4.3.0 1:4.3 + __fractutasf@GCC_4.3.0 1:4.3 + __fractutasi@GCC_4.3.0 1:4.3 + __fractutasq@GCC_4.3.0 1:4.3 + __fractutata@GCC_4.3.0 1:4.3 + __fractutati@GCC_4.3.0 1:4.3 + __fractutatq@GCC_4.3.0 1:4.3 + __fractutauda2@GCC_4.3.0 1:4.3 + __fractutaudq@GCC_4.3.0 1:4.3 + __fractutauha2@GCC_4.3.0 1:4.3 + __fractutauhq@GCC_4.3.0 1:4.3 + __fractutauqq@GCC_4.3.0 1:4.3 + __fractutausa2@GCC_4.3.0 1:4.3 + __fractutausq@GCC_4.3.0 1:4.3 + __fractutautq@GCC_4.3.0 1:4.3 + __fractutqda@GCC_4.3.0 1:4.3 + __fractutqdf@GCC_4.3.0 1:4.3 + __fractutqdi@GCC_4.3.0 1:4.3 + __fractutqdq@GCC_4.3.0 1:4.3 + __fractutqha@GCC_4.3.0 1:4.3 + __fractutqhi@GCC_4.3.0 1:4.3 + __fractutqhq@GCC_4.3.0 1:4.3 + __fractutqqi@GCC_4.3.0 1:4.3 + __fractutqqq@GCC_4.3.0 1:4.3 + __fractutqsa@GCC_4.3.0 1:4.3 + __fractutqsf@GCC_4.3.0 1:4.3 + __fractutqsi@GCC_4.3.0 1:4.3 + __fractutqsq@GCC_4.3.0 1:4.3 + __fractutqta@GCC_4.3.0 1:4.3 + __fractutqti@GCC_4.3.0 1:4.3 + __fractutqtq@GCC_4.3.0 1:4.3 + __fractutquda@GCC_4.3.0 1:4.3 + __fractutqudq2@GCC_4.3.0 1:4.3 + __fractutquha@GCC_4.3.0 1:4.3 + __fractutquhq2@GCC_4.3.0 1:4.3 + __fractutquqq2@GCC_4.3.0 1:4.3 + __fractutqusa@GCC_4.3.0 1:4.3 + __fractutqusq2@GCC_4.3.0 1:4.3 + __fractutquta@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __getf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __gttf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __letf2@GCC_3.0 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __lshruta3@GCC_4.3.0 1:4.3 + __lshrutq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __multa3@GCC_4.3.0 1:4.3 + __multc3@GCC_4.0.0 1:4.1.1 + __multf3@GCC_3.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __multq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __muluta3@GCC_4.3.0 1:4.3 + __mulutq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __negta2@GCC_4.3.0 1:4.3 + __negtf2@GCC_3.0 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negtq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __neguta2@GCC_4.3.0 1:4.3 + __negutq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __netf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdata2@GCC_4.3.0 1:4.3 + __satfractdatq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdauta@GCC_4.3.0 1:4.3 + __satfractdautq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfta@GCC_4.3.0 1:4.3 + __satfractdftq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdfuta@GCC_4.3.0 1:4.3 + __satfractdfutq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdita@GCC_4.3.0 1:4.3 + __satfractditq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdiuta@GCC_4.3.0 1:4.3 + __satfractdiutq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdqta@GCC_4.3.0 1:4.3 + __satfractdqtq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfractdquta@GCC_4.3.0 1:4.3 + __satfractdqutq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthata2@GCC_4.3.0 1:4.3 + __satfracthatq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthauta@GCC_4.3.0 1:4.3 + __satfracthautq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthita@GCC_4.3.0 1:4.3 + __satfracthitq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthiuta@GCC_4.3.0 1:4.3 + __satfracthiutq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthqta@GCC_4.3.0 1:4.3 + __satfracthqtq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfracthquta@GCC_4.3.0 1:4.3 + __satfracthqutq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqita@GCC_4.3.0 1:4.3 + __satfractqitq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqiuta@GCC_4.3.0 1:4.3 + __satfractqiutq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqqta@GCC_4.3.0 1:4.3 + __satfractqqtq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractqquta@GCC_4.3.0 1:4.3 + __satfractqqutq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsata2@GCC_4.3.0 1:4.3 + __satfractsatq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsauta@GCC_4.3.0 1:4.3 + __satfractsautq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfta@GCC_4.3.0 1:4.3 + __satfractsftq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsfuta@GCC_4.3.0 1:4.3 + __satfractsfutq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsita@GCC_4.3.0 1:4.3 + __satfractsitq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsiuta@GCC_4.3.0 1:4.3 + __satfractsiutq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsqta@GCC_4.3.0 1:4.3 + __satfractsqtq2@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractsquta@GCC_4.3.0 1:4.3 + __satfractsqutq@GCC_4.3.0 1:4.3 + __satfracttada2@GCC_4.3.0 1:4.3 + __satfracttadq@GCC_4.3.0 1:4.3 + __satfracttaha2@GCC_4.3.0 1:4.3 + __satfracttahq@GCC_4.3.0 1:4.3 + __satfracttaqq@GCC_4.3.0 1:4.3 + __satfracttasa2@GCC_4.3.0 1:4.3 + __satfracttasq@GCC_4.3.0 1:4.3 + __satfracttatq@GCC_4.3.0 1:4.3 + __satfracttauda@GCC_4.3.0 1:4.3 + __satfracttaudq@GCC_4.3.0 1:4.3 + __satfracttauha@GCC_4.3.0 1:4.3 + __satfracttauhq@GCC_4.3.0 1:4.3 + __satfracttauqq@GCC_4.3.0 1:4.3 + __satfracttausa@GCC_4.3.0 1:4.3 + __satfracttausq@GCC_4.3.0 1:4.3 + __satfracttauta@GCC_4.3.0 1:4.3 + __satfracttautq@GCC_4.3.0 1:4.3 + __satfracttida@GCC_4.3.0 1:4.3 + __satfracttidq@GCC_4.3.0 1:4.3 + __satfracttiha@GCC_4.3.0 1:4.3 + __satfracttihq@GCC_4.3.0 1:4.3 + __satfracttiqq@GCC_4.3.0 1:4.3 + __satfracttisa@GCC_4.3.0 1:4.3 + __satfracttisq@GCC_4.3.0 1:4.3 + __satfracttita@GCC_4.3.0 1:4.3 + __satfracttitq@GCC_4.3.0 1:4.3 + __satfracttiuda@GCC_4.3.0 1:4.3 + __satfracttiudq@GCC_4.3.0 1:4.3 + __satfracttiuha@GCC_4.3.0 1:4.3 + __satfracttiuhq@GCC_4.3.0 1:4.3 + __satfracttiuqq@GCC_4.3.0 1:4.3 + __satfracttiusa@GCC_4.3.0 1:4.3 + __satfracttiusq@GCC_4.3.0 1:4.3 + __satfracttiuta@GCC_4.3.0 1:4.3 + __satfracttiutq@GCC_4.3.0 1:4.3 + __satfracttqda@GCC_4.3.0 1:4.3 + __satfracttqdq2@GCC_4.3.0 1:4.3 + __satfracttqha@GCC_4.3.0 1:4.3 + __satfracttqhq2@GCC_4.3.0 1:4.3 + __satfracttqqq2@GCC_4.3.0 1:4.3 + __satfracttqsa@GCC_4.3.0 1:4.3 + __satfracttqsq2@GCC_4.3.0 1:4.3 + __satfracttqta@GCC_4.3.0 1:4.3 + __satfracttquda@GCC_4.3.0 1:4.3 + __satfracttqudq@GCC_4.3.0 1:4.3 + __satfracttquha@GCC_4.3.0 1:4.3 + __satfracttquhq@GCC_4.3.0 1:4.3 + __satfracttquqq@GCC_4.3.0 1:4.3 + __satfracttqusa@GCC_4.3.0 1:4.3 + __satfracttqusq@GCC_4.3.0 1:4.3 + __satfracttquta@GCC_4.3.0 1:4.3 + __satfracttqutq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudata@GCC_4.3.0 1:4.3 + __satfractudatq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudauta2@GCC_4.3.0 1:4.3 + __satfractudautq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudqta@GCC_4.3.0 1:4.3 + __satfractudqtq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractudquta@GCC_4.3.0 1:4.3 + __satfractudqutq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhata@GCC_4.3.0 1:4.3 + __satfractuhatq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhauta2@GCC_4.3.0 1:4.3 + __satfractuhautq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhqta@GCC_4.3.0 1:4.3 + __satfractuhqtq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractuhquta@GCC_4.3.0 1:4.3 + __satfractuhqutq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdita@GCC_4.3.0 1:4.3 + __satfractunsditq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunsdiuta@GCC_4.3.0 1:4.3 + __satfractunsdiutq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshita@GCC_4.3.0 1:4.3 + __satfractunshitq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunshiuta@GCC_4.3.0 1:4.3 + __satfractunshiutq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqita@GCC_4.3.0 1:4.3 + __satfractunsqitq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunsqiuta@GCC_4.3.0 1:4.3 + __satfractunsqiutq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssita@GCC_4.3.0 1:4.3 + __satfractunssitq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractunssiuta@GCC_4.3.0 1:4.3 + __satfractunssiutq@GCC_4.3.0 1:4.3 + __satfractunstida@GCC_4.3.0 1:4.3 + __satfractunstidq@GCC_4.3.0 1:4.3 + __satfractunstiha@GCC_4.3.0 1:4.3 + __satfractunstihq@GCC_4.3.0 1:4.3 + __satfractunstiqq@GCC_4.3.0 1:4.3 + __satfractunstisa@GCC_4.3.0 1:4.3 + __satfractunstisq@GCC_4.3.0 1:4.3 + __satfractunstita@GCC_4.3.0 1:4.3 + __satfractunstitq@GCC_4.3.0 1:4.3 + __satfractunstiuda@GCC_4.3.0 1:4.3 + __satfractunstiudq@GCC_4.3.0 1:4.3 + __satfractunstiuha@GCC_4.3.0 1:4.3 + __satfractunstiuhq@GCC_4.3.0 1:4.3 + __satfractunstiuqq@GCC_4.3.0 1:4.3 + __satfractunstiusa@GCC_4.3.0 1:4.3 + __satfractunstiusq@GCC_4.3.0 1:4.3 + __satfractunstiuta@GCC_4.3.0 1:4.3 + __satfractunstiutq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqqta@GCC_4.3.0 1:4.3 + __satfractuqqtq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractuqquta@GCC_4.3.0 1:4.3 + __satfractuqqutq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusata@GCC_4.3.0 1:4.3 + __satfractusatq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusauta2@GCC_4.3.0 1:4.3 + __satfractusautq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusqta@GCC_4.3.0 1:4.3 + __satfractusqtq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __satfractusquta@GCC_4.3.0 1:4.3 + __satfractusqutq2@GCC_4.3.0 1:4.3 + __satfractutada@GCC_4.3.0 1:4.3 + __satfractutadq@GCC_4.3.0 1:4.3 + __satfractutaha@GCC_4.3.0 1:4.3 + __satfractutahq@GCC_4.3.0 1:4.3 + __satfractutaqq@GCC_4.3.0 1:4.3 + __satfractutasa@GCC_4.3.0 1:4.3 + __satfractutasq@GCC_4.3.0 1:4.3 + __satfractutata@GCC_4.3.0 1:4.3 + __satfractutatq@GCC_4.3.0 1:4.3 + __satfractutauda2@GCC_4.3.0 1:4.3 + __satfractutaudq@GCC_4.3.0 1:4.3 + __satfractutauha2@GCC_4.3.0 1:4.3 + __satfractutauhq@GCC_4.3.0 1:4.3 + __satfractutauqq@GCC_4.3.0 1:4.3 + __satfractutausa2@GCC_4.3.0 1:4.3 + __satfractutausq@GCC_4.3.0 1:4.3 + __satfractutautq@GCC_4.3.0 1:4.3 + __satfractutqda@GCC_4.3.0 1:4.3 + __satfractutqdq@GCC_4.3.0 1:4.3 + __satfractutqha@GCC_4.3.0 1:4.3 + __satfractutqhq@GCC_4.3.0 1:4.3 + __satfractutqqq@GCC_4.3.0 1:4.3 + __satfractutqsa@GCC_4.3.0 1:4.3 + __satfractutqsq@GCC_4.3.0 1:4.3 + __satfractutqta@GCC_4.3.0 1:4.3 + __satfractutqtq@GCC_4.3.0 1:4.3 + __satfractutquda@GCC_4.3.0 1:4.3 + __satfractutqudq2@GCC_4.3.0 1:4.3 + __satfractutquha@GCC_4.3.0 1:4.3 + __satfractutquhq2@GCC_4.3.0 1:4.3 + __satfractutquqq2@GCC_4.3.0 1:4.3 + __satfractutqusa@GCC_4.3.0 1:4.3 + __satfractutqusq2@GCC_4.3.0 1:4.3 + __satfractutquta@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssaddta3@GCC_4.3.0 1:4.3 + __ssaddtq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssashlta3@GCC_4.3.0 1:4.3 + __ssashltq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssdivta3@GCC_4.3.0 1:4.3 + __ssdivtq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssmulta3@GCC_4.3.0 1:4.3 + __ssmultq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __ssnegta2@GCC_4.3.0 1:4.3 + __ssnegtq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __sssubta3@GCC_4.3.0 1:4.3 + __sssubtq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subta3@GCC_4.3.0 1:4.3 + __subtf3@GCC_3.0 1:4.1.1 + __subtq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subuta3@GCC_4.3.0 1:4.3 + __subutq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_8@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_8@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_synchronize@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_8@GCC_4.4.0 1:4.4 + __truncdfsf2@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_3.0 1:4.1.1 + __trunctfsf2@GCC_3.0 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __udivuta3@GCC_4.3.0 1:4.3 + __udivutq3@GCC_4.3.0 1:4.3 + __umodti3@GCC_3.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __unordtf2@GCC_4.5.0 1:4.5 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usadduta3@GCC_4.3.0 1:4.3 + __usaddutq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usashluta3@GCC_4.3.0 1:4.3 + __usashlutq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usdivuta3@GCC_4.3.0 1:4.3 + __usdivutq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usmuluta3@GCC_4.3.0 1:4.3 + __usmulutq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __usneguta2@GCC_4.3.0 1:4.3 + __usnegutq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 + __ussubuta3@GCC_4.3.0 1:4.3 + __ussubutq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.powerpc +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.powerpc @@ -0,0 +1,129 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_3.4.4 1:4.1.1 + __gcc_qdiv@GCC_3.4.4 1:4.1.1 + __gcc_qmul@GCC_3.4.4 1:4.1.1 + __gcc_qsub@GCC_3.4.4 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + _xlqadd@GCC_3.4 1:4.1.1 + _xlqdiv@GCC_3.4 1:4.1.1 + _xlqmul@GCC_3.4 1:4.1.1 + _xlqsub@GCC_3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.s390 +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.s390 @@ -0,0 +1,110 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.2@GLIBC_2.2 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.2 1:4.1.1 + __deregister_frame_info@GLIBC_2.2 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfti@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_4.1.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_4.1.0 1:4.1.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.2 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.2 1:4.1.1 + __register_frame_info@GLIBC_2.2 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.2 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.2 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib64gcc1.symbols.sparc +++ gcc-4.8-4.8.2/debian/lib64gcc1.symbols.sparc @@ -0,0 +1,109 @@ +libgcc_s.so.1 lib64gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.2@GLIBC_2.2 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.2 1:4.1.1 + __deregister_frame_info@GLIBC_2.2 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.2 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.2 1:4.1.1 + __register_frame_info@GLIBC_2.2 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.2 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.2 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/lib64gccLC.postinst +++ gcc-4.8-4.8.2/debian/lib64gccLC.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/lib64gcc@LC@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.overrides +++ gcc-4.8-4.8.2/debian/lib64gfortran3.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +lib64gfortran3 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols @@ -0,0 +1,7 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.64" +#include "libgfortran3.symbols.qf" --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols.mips +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols.mips @@ -0,0 +1,5 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols.mipsel +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols.mipsel @@ -0,0 +1,5 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols.powerpc +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols.powerpc @@ -0,0 +1,5 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols.s390 +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols.s390 @@ -0,0 +1,5 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gfortran3.symbols.sparc +++ gcc-4.8-4.8.2/debian/lib64gfortran3.symbols.sparc @@ -0,0 +1,5 @@ +libgfortran.so.3 lib64gfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/lib64gomp1.symbols +++ gcc-4.8-4.8.2/debian/lib64gomp1.symbols @@ -0,0 +1,4 @@ +libgomp.so.1 lib64gomp1 #MINVER# +#include "libgomp1.symbols.common" + GOMP_atomic_end@GOMP_1.0 4.2.1 + GOMP_atomic_start@GOMP_1.0 4.2.1 --- gcc-4.8-4.8.2.orig/debian/lib64itm1.symbols +++ gcc-4.8-4.8.2/debian/lib64itm1.symbols @@ -0,0 +1,4 @@ +libitm.so.1 lib64itm1 #MINVER# +#include "libitm1.symbols.common" +#include "libitm1.symbols.64bit" +(arch=amd64 i386 x32)#include "libitm1.symbols.x86" --- gcc-4.8-4.8.2.orig/debian/lib64objc4.symbols +++ gcc-4.8-4.8.2/debian/lib64objc4.symbols @@ -0,0 +1,3 @@ +libobjc.so.4 lib64objc4 #MINVER# +#include "libobjc4.symbols.common" + __gnu_objc_personality_v0@Base 4.2.1 --- gcc-4.8-4.8.2.orig/debian/lib64quadmath0.symbols +++ gcc-4.8-4.8.2/debian/lib64quadmath0.symbols @@ -0,0 +1,2 @@ +libquadmath.so.0 lib64quadmath0 #MINVER# +#include "libquadmath0.symbols.common" --- gcc-4.8-4.8.2.orig/debian/lib64stdc++6.symbols.i386 +++ gcc-4.8-4.8.2/debian/lib64stdc++6.symbols.i386 @@ -0,0 +1,32 @@ +libstdc++.so.6 lib64stdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# acosl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# asinl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# atan2l@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# atanl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# ceill@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# coshl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# cosl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# expl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# floorl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# fmodl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# frexpl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# hypotl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# ldexpf@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# ldexpl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# log10l@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# logl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# modfl@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# powf@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# powl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# sinhl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# sinl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# sqrtl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# tanhl@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# tanl@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/lib64stdc++6.symbols.powerpc +++ gcc-4.8-4.8.2/debian/lib64stdc++6.symbols.powerpc @@ -0,0 +1,10 @@ +libstdc++.so.6 lib64stdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/lib64stdc++6.symbols.s390 +++ gcc-4.8-4.8.2/debian/lib64stdc++6.symbols.s390 @@ -0,0 +1,12 @@ +libstdc++.so.6 lib64stdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# ldexpf@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# powf@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/lib64stdc++6.symbols.sparc +++ gcc-4.8-4.8.2/debian/lib64stdc++6.symbols.sparc @@ -0,0 +1,10 @@ +libstdc++.so.6 lib64stdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVli@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVli@GLIBCXX_3.4 4.1.1 +# FIXME: Currently no ldbl symbols in the 64bit libstdc++ on sparc. +# #include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/lib64stdc++CXX.postinst +++ gcc-4.8-4.8.2/debian/lib64stdc++CXX.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/lib64stdc++@CXX@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libasan0.symbols +++ gcc-4.8-4.8.2/debian/libasan0.symbols @@ -0,0 +1,4 @@ +libasan.so.0 libasan0 #MINVER# +#include "libasan0.symbols.common" +(arch=!aarch64 !alpha !amd64 !ia64 !ppc64 !s390x !sparc64 !kfreebsd-amd64)#include "libasan0.symbols.32" +(arch=aarch64 alpha amd64 ia64 ppc64 s390x sparc64 kfreebsd-amd64)#include "libasan0.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libasan0.symbols.32 +++ gcc-4.8-4.8.2/debian/libasan0.symbols.32 @@ -0,0 +1,4 @@ + _Znaj@Base 4.8 + _ZnajRKSt9nothrow_t@Base 4.8 + _Znwj@Base 4.8 + _ZnwjRKSt9nothrow_t@Base 4.8 --- gcc-4.8-4.8.2.orig/debian/libasan0.symbols.64 +++ gcc-4.8-4.8.2/debian/libasan0.symbols.64 @@ -0,0 +1,4 @@ + _Znam@Base 4.8 + _ZnamRKSt9nothrow_t@Base 4.8 + _Znwm@Base 4.8 + _ZnwmRKSt9nothrow_t@Base 4.8 --- gcc-4.8-4.8.2.orig/debian/libasan0.symbols.common +++ gcc-4.8-4.8.2/debian/libasan0.symbols.common @@ -0,0 +1,206 @@ + _ZN11__sanitizer10StackTrace13CompressStackEPS0_Pjm@Base 4.8 + _ZN11__sanitizer10StackTrace15UncompressStackEPS0_Pjm@Base 4.8 + _ZN11__sanitizer11CheckFailedEPKciS1_yy@Base 4.8 + _ZN6__asan10kMidMemBegE@Base 4.8 + _ZN6__asan10kMidMemEndE@Base 4.8 + _ZN6__asan11asan_mallocEmPN11__sanitizer10StackTraceE@Base 4.8 + _ZN6__asan11kHighMemEndE@Base 4.8 + _ZN6__asan13asan_memalignEmmPN11__sanitizer10StackTraceENS_9AllocTypeE@Base 4.8 + _ZN6__asan9asan_freeEPvPN11__sanitizer10StackTraceENS_9AllocTypeE@Base 4.8 + _ZdaPv@Base 4.8 + _ZdaPvRKSt9nothrow_t@Base 4.8 + _ZdlPv@Base 4.8 + _ZdlPvRKSt9nothrow_t@Base 4.8 + __asan_address_is_poisoned@Base 4.8 + __asan_after_dynamic_init@Base 4.8 + __asan_before_dynamic_init@Base 4.8 + __asan_describe_address@Base 4.8 + __asan_get_allocated_size@Base 4.8 + __asan_get_current_allocated_bytes@Base 4.8 + __asan_get_estimated_allocated_size@Base 4.8 + __asan_get_free_bytes@Base 4.8 + __asan_get_heap_size@Base 4.8 + __asan_get_ownership@Base 4.8 + __asan_get_unmapped_bytes@Base 4.8 + __asan_handle_no_return@Base 4.8 + __asan_init_v1@Base 4.8 + __asan_poison_memory_region@Base 4.8 + __asan_poison_stack_memory@Base 4.8 + __asan_print_accumulated_stats@Base 4.8 + __asan_region_is_poisoned@Base 4.8 + __asan_register_globals@Base 4.8 + __asan_report_error@Base 4.8 + __asan_report_load16@Base 4.8 + __asan_report_load1@Base 4.8 + __asan_report_load2@Base 4.8 + __asan_report_load4@Base 4.8 + __asan_report_load8@Base 4.8 + __asan_report_load_n@Base 4.8 + __asan_report_store16@Base 4.8 + __asan_report_store1@Base 4.8 + __asan_report_store2@Base 4.8 + __asan_report_store4@Base 4.8 + __asan_report_store8@Base 4.8 + __asan_report_store_n@Base 4.8 + __asan_set_death_callback@Base 4.8 + __asan_set_error_exit_code@Base 4.8 + __asan_set_error_report_callback@Base 4.8 + __asan_stack_free@Base 4.8 + __asan_stack_malloc@Base 4.8 + __asan_unpoison_memory_region@Base 4.8 + __asan_unpoison_stack_memory@Base 4.8 + __asan_unregister_globals@Base 4.8 + __cxa_throw@Base 4.8 + __interceptor___cxa_throw@Base 4.8 + __interceptor___isoc99_fscanf@Base 4.8 + __interceptor___isoc99_scanf@Base 4.8 + __interceptor___isoc99_sscanf@Base 4.8 + __interceptor___isoc99_vfscanf@Base 4.8 + __interceptor___isoc99_vscanf@Base 4.8 + __interceptor___isoc99_vsscanf@Base 4.8 + __interceptor___libc_memalign@Base 4.8 + __interceptor__longjmp@Base 4.8 + __interceptor_asctime@Base 4.8 + __interceptor_asctime_r@Base 4.8 + __interceptor_atoi@Base 4.8 + __interceptor_atol@Base 4.8 + __interceptor_atoll@Base 4.8 + __interceptor_calloc@Base 4.8 + __interceptor_cfree@Base 4.8 + __interceptor_ctime@Base 4.8 + __interceptor_ctime_r@Base 4.8 + __interceptor_free@Base 4.8 + __interceptor_fscanf@Base 4.8 + __interceptor_gmtime@Base 4.8 + __interceptor_gmtime_r@Base 4.8 + __interceptor_index@Base 4.8 + __interceptor_localtime@Base 4.8 + __interceptor_localtime_r@Base 4.8 + __interceptor_longjmp@Base 4.8 + __interceptor_mallinfo@Base 4.8 + __interceptor_malloc@Base 4.8 + __interceptor_malloc_stats@Base 4.8 + __interceptor_malloc_usable_size@Base 4.8 + __interceptor_mallopt@Base 4.8 + __interceptor_memalign@Base 4.8 + __interceptor_memcmp@Base 4.8 + __interceptor_memcpy@Base 4.8 + __interceptor_memmove@Base 4.8 + __interceptor_memset@Base 4.8 + __interceptor_mlock@Base 4.8 + __interceptor_mlockall@Base 4.8 + __interceptor_munlock@Base 4.8 + __interceptor_munlockall@Base 4.8 + __interceptor_posix_memalign@Base 4.8 + __interceptor_prctl@Base 4.8 + __interceptor_pread64@Base 4.8 + __interceptor_pread@Base 4.8 + __interceptor_pthread_create@Base 4.8 + __interceptor_pvalloc@Base 4.8 + __interceptor_pwrite64@Base 4.8 + __interceptor_pwrite@Base 4.8 + __interceptor_read@Base 4.8 + __interceptor_realloc@Base 4.8 + __interceptor_scanf@Base 4.8 + __interceptor_sigaction@Base 4.8 + __interceptor_siglongjmp@Base 4.8 + __interceptor_signal@Base 4.8 + __interceptor_sscanf@Base 4.8 + __interceptor_strcasecmp@Base 4.8 + __interceptor_strcat@Base 4.8 + __interceptor_strchr@Base 4.8 + __interceptor_strcmp@Base 4.8 + __interceptor_strcpy@Base 4.8 + __interceptor_strdup@Base 4.8 + __interceptor_strlen@Base 4.8 + __interceptor_strncasecmp@Base 4.8 + __interceptor_strncat@Base 4.8 + __interceptor_strncmp@Base 4.8 + __interceptor_strncpy@Base 4.8 + __interceptor_strnlen@Base 4.8 + __interceptor_strtol@Base 4.8 + __interceptor_strtoll@Base 4.8 + __interceptor_swapcontext@Base 4.8 + __interceptor_valloc@Base 4.8 + __interceptor_vfscanf@Base 4.8 + __interceptor_vscanf@Base 4.8 + __interceptor_vsscanf@Base 4.8 + __interceptor_write@Base 4.8 + __isoc99_fscanf@Base 4.8 + __isoc99_scanf@Base 4.8 + __isoc99_sscanf@Base 4.8 + __isoc99_vfscanf@Base 4.8 + __isoc99_vscanf@Base 4.8 + __isoc99_vsscanf@Base 4.8 + __libc_memalign@Base 4.8 + __sanitizer_report_error_summary@Base 4.8 + __sanitizer_sandbox_on_notify@Base 4.8 + __sanitizer_set_report_fd@Base 4.8 + __sanitizer_set_report_path@Base 4.8 + _longjmp@Base 4.8 + asctime@Base 4.8 + asctime_r@Base 4.8 + atoi@Base 4.8 + atol@Base 4.8 + atoll@Base 4.8 + calloc@Base 4.8 + cfree@Base 4.8 + ctime@Base 4.8 + ctime_r@Base 4.8 + free@Base 4.8 + fscanf@Base 4.8 + gmtime@Base 4.8 + gmtime_r@Base 4.8 + index@Base 4.8 + localtime@Base 4.8 + localtime_r@Base 4.8 + longjmp@Base 4.8 + mallinfo@Base 4.8 + malloc@Base 4.8 + malloc_stats@Base 4.8 + malloc_usable_size@Base 4.8 + mallopt@Base 4.8 + memalign@Base 4.8 + memcmp@Base 4.8 + memcpy@Base 4.8 + memmove@Base 4.8 + memset@Base 4.8 + mlock@Base 4.8 + mlockall@Base 4.8 + munlock@Base 4.8 + munlockall@Base 4.8 + posix_memalign@Base 4.8 + prctl@Base 4.8 + pread64@Base 4.8 + pread@Base 4.8 + pthread_create@Base 4.8 + pvalloc@Base 4.8 + pwrite64@Base 4.8 + pwrite@Base 4.8 + read@Base 4.8 + realloc@Base 4.8 + scanf@Base 4.8 + sigaction@Base 4.8 + siglongjmp@Base 4.8 + signal@Base 4.8 + sscanf@Base 4.8 + strcasecmp@Base 4.8 + strcat@Base 4.8 + strchr@Base 4.8 + strcmp@Base 4.8 + strcpy@Base 4.8 + strdup@Base 4.8 + strlen@Base 4.8 + strncasecmp@Base 4.8 + strncat@Base 4.8 + strncmp@Base 4.8 + strncpy@Base 4.8 + strnlen@Base 4.8 + strtol@Base 4.8 + strtoll@Base 4.8 + valloc@Base 4.8 + vfscanf@Base 4.8 + vscanf@Base 4.8 + vsscanf@Base 4.8 + swapcontext@Base 4.8 + write@Base 4.8 --- gcc-4.8-4.8.2.orig/debian/libatomic1.symbols +++ gcc-4.8-4.8.2/debian/libatomic1.symbols @@ -0,0 +1,3 @@ +libatomic.so.1 libatomic1 #MINVER# +#include "libatomic1.symbols.common" +(arch=arm64 alpha amd64 ia64 ppc64 ppc64el s390x sparc64 x32 kfreebsd-amd64)#include "libatomic1.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libatomic1.symbols.64 +++ gcc-4.8-4.8.2/debian/libatomic1.symbols.64 @@ -0,0 +1,17 @@ + __atomic_add_fetch_16@LIBATOMIC_1.0 4.8 + __atomic_and_fetch_16@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange_16@LIBATOMIC_1.0 4.8 + __atomic_exchange_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_add_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_and_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_nand_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_or_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_sub_16@LIBATOMIC_1.0 4.8 + __atomic_fetch_xor_16@LIBATOMIC_1.0 4.8 + __atomic_load_16@LIBATOMIC_1.0 4.8 + __atomic_nand_fetch_16@LIBATOMIC_1.0 4.8 + __atomic_or_fetch_16@LIBATOMIC_1.0 4.8 + __atomic_store_16@LIBATOMIC_1.0 4.8 + __atomic_sub_fetch_16@LIBATOMIC_1.0 4.8 + __atomic_test_and_set_16@LIBATOMIC_1.0 4.8 + __atomic_xor_fetch_16@LIBATOMIC_1.0 4.8 --- gcc-4.8-4.8.2.orig/debian/libatomic1.symbols.common +++ gcc-4.8-4.8.2/debian/libatomic1.symbols.common @@ -0,0 +1,74 @@ + LIBATOMIC_1.0@LIBATOMIC_1.0 4.8 + __atomic_add_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_add_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_add_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_add_fetch_8@LIBATOMIC_1.0 4.8 + __atomic_and_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_and_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_and_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_and_fetch_8@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange_1@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange_2@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange_4@LIBATOMIC_1.0 4.8 + __atomic_compare_exchange_8@LIBATOMIC_1.0 4.8 + __atomic_exchange@LIBATOMIC_1.0 4.8 + __atomic_exchange_1@LIBATOMIC_1.0 4.8 + __atomic_exchange_2@LIBATOMIC_1.0 4.8 + __atomic_exchange_4@LIBATOMIC_1.0 4.8 + __atomic_exchange_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_add_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_add_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_add_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_add_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_and_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_and_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_and_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_and_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_nand_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_nand_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_nand_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_nand_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_or_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_or_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_or_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_or_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_sub_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_sub_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_sub_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_sub_8@LIBATOMIC_1.0 4.8 + __atomic_fetch_xor_1@LIBATOMIC_1.0 4.8 + __atomic_fetch_xor_2@LIBATOMIC_1.0 4.8 + __atomic_fetch_xor_4@LIBATOMIC_1.0 4.8 + __atomic_fetch_xor_8@LIBATOMIC_1.0 4.8 + __atomic_is_lock_free@LIBATOMIC_1.0 4.8 + __atomic_load@LIBATOMIC_1.0 4.8 + __atomic_load_1@LIBATOMIC_1.0 4.8 + __atomic_load_2@LIBATOMIC_1.0 4.8 + __atomic_load_4@LIBATOMIC_1.0 4.8 + __atomic_load_8@LIBATOMIC_1.0 4.8 + __atomic_nand_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_nand_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_nand_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_nand_fetch_8@LIBATOMIC_1.0 4.8 + __atomic_or_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_or_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_or_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_or_fetch_8@LIBATOMIC_1.0 4.8 + __atomic_store@LIBATOMIC_1.0 4.8 + __atomic_store_1@LIBATOMIC_1.0 4.8 + __atomic_store_2@LIBATOMIC_1.0 4.8 + __atomic_store_4@LIBATOMIC_1.0 4.8 + __atomic_store_8@LIBATOMIC_1.0 4.8 + __atomic_sub_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_sub_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_sub_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_sub_fetch_8@LIBATOMIC_1.0 4.8 + __atomic_test_and_set_1@LIBATOMIC_1.0 4.8 + __atomic_test_and_set_2@LIBATOMIC_1.0 4.8 + __atomic_test_and_set_4@LIBATOMIC_1.0 4.8 + __atomic_test_and_set_8@LIBATOMIC_1.0 4.8 + __atomic_xor_fetch_1@LIBATOMIC_1.0 4.8 + __atomic_xor_fetch_2@LIBATOMIC_1.0 4.8 + __atomic_xor_fetch_4@LIBATOMIC_1.0 4.8 + __atomic_xor_fetch_8@LIBATOMIC_1.0 4.8 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.aeabi +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.aeabi @@ -0,0 +1,69 @@ + __aeabi_cdcmpeq@GCC_3.5 1:4.4.0 + __aeabi_cdcmple@GCC_3.5 1:4.4.0 + __aeabi_cdrcmple@GCC_3.5 1:4.4.0 + __aeabi_cfcmpeq@GCC_3.5 1:4.4.0 + __aeabi_cfcmple@GCC_3.5 1:4.4.0 + __aeabi_cfrcmple@GCC_3.5 1:4.4.0 + __aeabi_d2f@GCC_3.5 1:4.4.0 + __aeabi_d2iz@GCC_3.5 1:4.4.0 + __aeabi_d2lz@GCC_3.5 1:4.4.0 + __aeabi_d2uiz@GCC_3.5 1:4.4.0 + __aeabi_d2ulz@GCC_3.5 1:4.4.0 + __aeabi_dadd@GCC_3.5 1:4.4.0 + __aeabi_dcmpeq@GCC_3.5 1:4.4.0 + __aeabi_dcmpge@GCC_3.5 1:4.4.0 + __aeabi_dcmpgt@GCC_3.5 1:4.4.0 + __aeabi_dcmple@GCC_3.5 1:4.4.0 + __aeabi_dcmplt@GCC_3.5 1:4.4.0 + __aeabi_dcmpun@GCC_3.5 1:4.4.0 + __aeabi_ddiv@GCC_3.5 1:4.4.0 + __aeabi_dmul@GCC_3.5 1:4.4.0 + __aeabi_dneg@GCC_3.5 1:4.4.0 + __aeabi_drsub@GCC_3.5 1:4.4.0 + __aeabi_dsub@GCC_3.5 1:4.4.0 + __aeabi_f2d@GCC_3.5 1:4.4.0 + __aeabi_f2iz@GCC_3.5 1:4.4.0 + __aeabi_f2lz@GCC_3.5 1:4.4.0 + __aeabi_f2uiz@GCC_3.5 1:4.4.0 + __aeabi_f2ulz@GCC_3.5 1:4.4.0 + __aeabi_fadd@GCC_3.5 1:4.4.0 + __aeabi_fcmpeq@GCC_3.5 1:4.4.0 + __aeabi_fcmpge@GCC_3.5 1:4.4.0 + __aeabi_fcmpgt@GCC_3.5 1:4.4.0 + __aeabi_fcmple@GCC_3.5 1:4.4.0 + __aeabi_fcmplt@GCC_3.5 1:4.4.0 + __aeabi_fcmpun@GCC_3.5 1:4.4.0 + __aeabi_fdiv@GCC_3.5 1:4.4.0 + __aeabi_fmul@GCC_3.5 1:4.4.0 + __aeabi_fneg@GCC_3.5 1:4.4.0 + __aeabi_frsub@GCC_3.5 1:4.4.0 + __aeabi_fsub@GCC_3.5 1:4.4.0 + __aeabi_i2d@GCC_3.5 1:4.4.0 + __aeabi_i2f@GCC_3.5 1:4.4.0 + __aeabi_idiv@GCC_3.5 1:4.4.0 + __aeabi_idiv0@GCC_3.5 1:4.5.0 + __aeabi_idivmod@GCC_3.5 1:4.4.0 + __aeabi_l2d@GCC_3.5 1:4.4.0 + __aeabi_l2f@GCC_3.5 1:4.4.0 + __aeabi_lasr@GCC_3.5 1:4.4.0 + __aeabi_lcmp@GCC_3.5 1:4.4.0 + __aeabi_ldivmod@GCC_3.5 1:4.4.0 + __aeabi_ldiv0@GCC_3.5 1:4.5.0 + __aeabi_llsl@GCC_3.5 1:4.4.0 + __aeabi_llsr@GCC_3.5 1:4.4.0 + __aeabi_lmul@GCC_3.5 1:4.4.0 + __aeabi_ui2d@GCC_3.5 1:4.4.0 + __aeabi_ui2f@GCC_3.5 1:4.4.0 + __aeabi_uidiv@GCC_3.5 1:4.4.0 + __aeabi_uidivmod@GCC_3.5 1:4.4.0 + __aeabi_ul2d@GCC_3.5 1:4.4.0 + __aeabi_ul2f@GCC_3.5 1:4.4.0 + __aeabi_ulcmp@GCC_3.5 1:4.4.0 + __aeabi_uldivmod@GCC_3.5 1:4.4.0 + __aeabi_unwind_cpp_pr0@GCC_3.5 1:4.4.0 + __aeabi_unwind_cpp_pr1@GCC_3.5 1:4.4.0 + __aeabi_unwind_cpp_pr2@GCC_3.5 1:4.4.0 + __aeabi_uread4@GCC_3.5 1:4.4.0 + __aeabi_uread8@GCC_3.5 1:4.4.0 + __aeabi_uwrite4@GCC_3.5 1:4.4.0 + __aeabi_uwrite8@GCC_3.5 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.alpha +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.alpha @@ -0,0 +1,110 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_LDBL_4.0.0@GCC_LDBL_4.0.0 1:4.2.1 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_LDBL_4.0.0 1:4.2.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.2.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.2.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_LDBL_4.0.0 1:4.2.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_LDBL_4.0.0 1:4.2.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.amd64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.amd64 @@ -0,0 +1,150 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addtf3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GCC_3.0 1:4.1.1 + __deregister_frame_info@GCC_3.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.3 + __divtc3@GCC_4.3.0 1:4.4.0 + __divtf3@GCC_4.3.0 1:4.3 + __divti3@GCC_3.0 1:4.1.1 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.3.0 1:4.3 + __extenddftf2@GCC_4.3.0 1:4.3 + __extendsftf2@GCC_4.3.0 1:4.3 + __extendxftf2@GCC_4.3.0 1:4.3 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.3.0 1:4.3 + __fixtfsi@GCC_4.3.0 1:4.3 + __fixtfti@GCC_4.3.0 1:4.3 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.3.0 1:4.3 + __fixunstfsi@GCC_4.3.0 1:4.3 + __fixunstfti@GCC_4.3.0 1:4.3 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfti@GCC_3.0 1:4.1.1 + __fixxfti@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.3.0 1:4.3 + __floatsitf@GCC_4.3.0 1:4.3 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_4.3.0 1:4.3 + __floattixf@GCC_3.0 1:4.1.1 + __floatunditf@GCC_4.3.0 1:4.3 + __floatunsitf@GCC_4.3.0 1:4.3 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.3.0 1:4.3 + __floatuntixf@GCC_4.2.0 1:4.2.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.3.0 1:4.3 + __gttf2@GCC_3.0 1:4.3 + __gttf2@GCC_4.3.0 1:4.4.0 + __letf2@GCC_4.3.0 1:4.3 + __lshrti3@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.3 + __lttf2@GCC_4.3.0 1:4.4.0 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.3 + __multc3@GCC_4.3.0 1:4.4.0 + __multf3@GCC_4.3.0 1:4.3 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negtf2@GCC_4.3.0 1:4.3 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __netf2@GCC_3.0 1:4.3 + __netf2@GCC_4.3.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.3 + __powitf2@GCC_4.3.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GCC_3.0 1:4.1.1 + __register_frame_info@GCC_3.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GCC_3.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GCC_3.0 1:4.1.1 + __subtf3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __trunctfdf2@GCC_4.3.0 1:4.3 + __trunctfsf2@GCC_4.3.0 1:4.3 + __trunctfxf2@GCC_4.3.0 1:4.3 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + __unordtf2@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.arm64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.arm64 @@ -0,0 +1,134 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.7 + GCC_3.3.1@GCC_3.3.1 1:4.7 + GCC_3.3@GCC_3.3 1:4.7 + GCC_3.4.2@GCC_3.4.2 1:4.7 + GCC_3.4.4@GCC_3.4.4 1:4.7 + GCC_3.4@GCC_3.4 1:4.7 + GCC_4.0.0@GCC_4.0.0 1:4.7 + GCC_4.2.0@GCC_4.2.0 1:4.7 + GCC_4.3.0@GCC_4.3.0 1:4.7 + GCC_4.5.0@GCC_4.5.0 1:4.7 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.7 + _Unwind_Backtrace@GCC_3.3 1:4.7 + _Unwind_DeleteException@GCC_3.0 1:4.7 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.7 + _Unwind_Find_FDE@GCC_3.0 1:4.7 + _Unwind_ForcedUnwind@GCC_3.0 1:4.7 + _Unwind_GetCFA@GCC_3.3 1:4.7 + _Unwind_GetDataRelBase@GCC_3.0 1:4.7 + _Unwind_GetGR@GCC_3.0 1:4.7 + _Unwind_GetIP@GCC_3.0 1:4.7 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.7 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.7 + _Unwind_GetRegionStart@GCC_3.0 1:4.7 + _Unwind_GetTextRelBase@GCC_3.0 1:4.7 + _Unwind_RaiseException@GCC_3.0 1:4.7 + _Unwind_Resume@GCC_3.0 1:4.7 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.7 + _Unwind_SetGR@GCC_3.0 1:4.7 + _Unwind_SetIP@GCC_3.0 1:4.7 + __absvdi2@GCC_3.0 1:4.7 + __absvsi2@GCC_3.0 1:4.7 + __absvti2@GCC_3.4.4 1:4.7 + __addtf3@GCC_3.0 1:4.7 + __addvdi3@GCC_3.0 1:4.7 + __addvsi3@GCC_3.0 1:4.7 + __addvti3@GCC_3.4.4 1:4.7 + __ashlti3@GCC_3.0 1:4.7 + __ashrti3@GCC_3.0 1:4.7 + __bswapdi2@GCC_4.3.0 1:4.7 + __bswapsi2@GCC_4.3.0 1:4.7 + __clear_cache@GCC_3.0 1:4.7 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.7 + __clzti2@GCC_3.4 1:4.7 + __cmpti2@GCC_3.0 1:4.7 + __ctzdi2@GCC_3.4 1:4.7 + __ctzti2@GCC_3.4 1:4.7 + __deregister_frame@GLIBC_2.0 1:4.7 + __deregister_frame_info@GLIBC_2.0 1:4.7 + __deregister_frame_info_bases@GCC_3.0 1:4.7 + __divdc3@GCC_4.0.0 1:4.7 + __divsc3@GCC_4.0.0 1:4.7 + __divtc3@GCC_4.0.0 1:4.7 + __divtf3@GCC_3.0 1:4.7 + __divti3@GCC_3.0 1:4.7 + __emutls_get_address@GCC_4.3.0 1:4.7 + __emutls_register_common@GCC_4.3.0 1:4.7 + __enable_execute_stack@GCC_3.4.2 1:4.7 + __eqtf2@GCC_3.0 1:4.7 + __extenddftf2@GCC_3.0 1:4.7 + __extendsftf2@GCC_3.0 1:4.7 + __ffsdi2@GCC_3.0 1:4.7 + __ffsti2@GCC_3.0 1:4.7 + __fixdfti@GCC_3.0 1:4.7 + __fixsfti@GCC_3.0 1:4.7 + __fixtfdi@GCC_3.0 1:4.7 + __fixtfsi@GCC_3.0 1:4.7 + __fixtfti@GCC_3.0 1:4.7 + __fixunsdfdi@GCC_3.0 1:4.7 + __fixunsdfti@GCC_3.0 1:4.7 + __fixunssfdi@GCC_3.0 1:4.7 + __fixunssfti@GCC_3.0 1:4.7 + __fixunstfdi@GCC_3.0 1:4.7 + __fixunstfsi@GCC_3.0 1:4.7 + __fixunstfti@GCC_3.0 1:4.7 + __floatditf@GCC_3.0 1:4.7 + __floatsitf@GCC_3.0 1:4.7 + __floattidf@GCC_3.0 1:4.7 + __floattisf@GCC_3.0 1:4.7 + __floattitf@GCC_3.0 1:4.7 + __floatunditf@GCC_4.2.0 1:4.7 + __floatunsitf@GCC_4.2.0 1:4.7 + __floatuntidf@GCC_4.2.0 1:4.7 + __floatuntisf@GCC_4.2.0 1:4.7 + __floatuntitf@GCC_4.2.0 1:4.7 + __frame_state_for@GLIBC_2.0 1:4.7 + __gcc_personality_v0@GCC_3.3.1 1:4.7 + __getf2@GCC_3.0 1:4.7 + __gttf2@GCC_3.0 1:4.7 + __letf2@GCC_3.0 1:4.7 + __lshrti3@GCC_3.0 1:4.7 + __lttf2@GCC_3.0 1:4.7 + __modti3@GCC_3.0 1:4.7 + __muldc3@GCC_4.0.0 1:4.7 + __mulsc3@GCC_4.0.0 1:4.7 + __multc3@GCC_4.0.0 1:4.7 + __multf3@GCC_3.0 1:4.7 + __multi3@GCC_3.0 1:4.7 + __mulvdi3@GCC_3.0 1:4.7 + __mulvsi3@GCC_3.0 1:4.7 + __mulvti3@GCC_3.4.4 1:4.7 + __negtf2@GCC_3.0 1:4.7 + __negti2@GCC_3.0 1:4.7 + __negvdi2@GCC_3.0 1:4.7 + __negvsi2@GCC_3.0 1:4.7 + __negvti2@GCC_3.4.4 1:4.7 + __netf2@GCC_3.0 1:4.7 + __paritydi2@GCC_3.4 1:4.7 + __parityti2@GCC_3.4 1:4.7 + __popcountdi2@GCC_3.4 1:4.7 + __popcountti2@GCC_3.4 1:4.7 + __powidf2@GCC_4.0.0 1:4.7 + __powisf2@GCC_4.0.0 1:4.7 + __powitf2@GCC_4.0.0 1:4.7 + __register_frame@GLIBC_2.0 1:4.7 + __register_frame_info@GLIBC_2.0 1:4.7 + __register_frame_info_bases@GCC_3.0 1:4.7 + __register_frame_info_table@GLIBC_2.0 1:4.7 + __register_frame_info_table_bases@GCC_3.0 1:4.7 + __register_frame_table@GLIBC_2.0 1:4.7 + __subtf3@GCC_3.0 1:4.7 + __subvdi3@GCC_3.0 1:4.7 + __subvsi3@GCC_3.0 1:4.7 + __subvti3@GCC_3.4.4 1:4.7 + __trunctfdf2@GCC_3.0 1:4.7 + __trunctfsf2@GCC_3.0 1:4.7 + __ucmpti2@GCC_3.0 1:4.7 + __udivmodti4@GCC_3.0 1:4.7 + __udivti3@GCC_3.0 1:4.7 + __umodti3@GCC_3.0 1:4.7 + __unordtf2@GCC_4.5.0 1:4.7 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.armel +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.armel @@ -0,0 +1,1103 @@ +libgcc_s.so.1 libgcc1 #MINVER# +(ignore-blacklist)#include "libgcc1.symbols.aeabi" + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_3.5@GCC_3.5 1:4.3.0 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_4.3.0 1:4.3.0 + _Unwind_Complete@GCC_3.5 1:4.3.0 + _Unwind_DeleteException@GCC_3.0 1:4.3.0 + _Unwind_ForcedUnwind@GCC_3.0 1:4.3.0 + _Unwind_GetCFA@GCC_3.3 1:4.3.0 + _Unwind_GetDataRelBase@GCC_3.0 1:4.3.0 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.3.0 + _Unwind_GetRegionStart@GCC_3.0 1:4.3.0 + _Unwind_GetTextRelBase@GCC_3.0 1:4.3.0 + _Unwind_RaiseException@GCC_3.0 1:4.3.0 + _Unwind_Resume@GCC_3.0 1:4.3.0 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.3.0 + _Unwind_VRS_Get@GCC_3.5 1:4.3.0 + _Unwind_VRS_Pop@GCC_3.5 1:4.3.0 + _Unwind_VRS_Set@GCC_3.5 1:4.3.0 + __absvdi2@GCC_3.0 1:4.3.0 + __absvsi2@GCC_3.0 1:4.3.0 + __adddf3@GCC_3.0 1:4.3.0 + __addsf3@GCC_3.0 1:4.3.0 + __addvdi3@GCC_3.0 1:4.3.0 + __addvsi3@GCC_3.0 1:4.3.0 + __ashldi3@GCC_3.0 1:4.3.0 + __ashrdi3@GCC_3.0 1:4.3.0 + __bswapdi2@GCC_4.3.0 1:4.3.0 + __bswapsi2@GCC_4.3.0 1:4.3.0 + __clear_cache@GCC_3.0 1:4.3.0 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.3.0 + __clzsi2@GCC_3.4 1:4.3.0 + __cmpdi2@GCC_3.0 1:4.3.0 + __ctzdi2@GCC_3.4 1:4.3.0 + __ctzsi2@GCC_3.4 1:4.3.0 + __divdc3@GCC_4.0.0 1:4.3.0 + __divdf3@GCC_3.0 1:4.3.0 + __divdi3@GLIBC_2.0 1:4.3.0 + __divsc3@GCC_4.0.0 1:4.3.0 + __divsf3@GCC_3.0 1:4.3.0 + __divsi3@GCC_3.0 1:4.3.0 + __emutls_get_address@GCC_4.3.0 1:4.3.0 + __emutls_register_common@GCC_4.3.0 1:4.3.0 + __enable_execute_stack@GCC_3.4.2 1:4.3.0 + __eqdf2@GCC_3.0 1:4.3.0 + __eqsf2@GCC_3.0 1:4.3.0 + __extendsfdf2@GCC_3.0 1:4.3.0 + __ffsdi2@GCC_3.0 1:4.3.0 + __ffssi2@GCC_4.3.0 1:4.3.0 + __fixdfdi@GCC_3.0 1:4.3.0 + __fixdfsi@GCC_3.0 1:4.3.0 + __fixsfdi@GCC_3.0 1:4.3.0 + __fixsfsi@GCC_3.0 1:4.3.0 + __fixunsdfdi@GCC_3.0 1:4.3.0 + __fixunsdfsi@GCC_3.0 1:4.3.0 + __fixunssfdi@GCC_3.0 1:4.3.0 + __fixunssfsi@GCC_3.0 1:4.3.0 + __floatdidf@GCC_3.0 1:4.3.0 + __floatdisf@GCC_3.0 1:4.3.0 + __floatsidf@GCC_3.0 1:4.3.0 + __floatsisf@GCC_3.0 1:4.3.0 + __floatundidf@GCC_4.2.0 1:4.3.0 + __floatundisf@GCC_4.2.0 1:4.3.0 + __floatunsidf@GCC_4.2.0 1:4.3.0 + __floatunsisf@GCC_4.2.0 1:4.3.0 + __gcc_personality_v0@GCC_3.3.1 1:4.3.0 + __gedf2@GCC_3.0 1:4.3.0 + __gesf2@GCC_3.0 1:4.3.0 + __gnu_addda3@GCC_4.3.0 1:4.3.0 + __gnu_adddq3@GCC_4.3.0 1:4.3.0 + __gnu_addha3@GCC_4.3.0 1:4.3.0 + __gnu_addhq3@GCC_4.3.0 1:4.3.0 + __gnu_addqq3@GCC_4.3.0 1:4.3.0 + __gnu_addsa3@GCC_4.3.0 1:4.3.0 + __gnu_addsq3@GCC_4.3.0 1:4.3.0 + __gnu_adduda3@GCC_4.3.0 1:4.3.0 + __gnu_addudq3@GCC_4.3.0 1:4.3.0 + __gnu_adduha3@GCC_4.3.0 1:4.3.0 + __gnu_adduhq3@GCC_4.3.0 1:4.3.0 + __gnu_adduqq3@GCC_4.3.0 1:4.3.0 + __gnu_addusa3@GCC_4.3.0 1:4.3.0 + __gnu_addusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluda3@GCC_4.3.0 1:4.3.0 + __gnu_ashludq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluha3@GCC_4.3.0 1:4.3.0 + __gnu_ashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrda3@GCC_4.3.0 1:4.3.0 + __gnu_ashrdq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrha3@GCC_4.3.0 1:4.3.0 + __gnu_ashrhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsq3@GCC_4.3.0 1:4.3.0 + __gnu_cmpda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpdq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpha2@GCC_4.3.0 1:4.3.0 + __gnu_cmphq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpudq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuha2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuhq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusq2@GCC_4.3.0 1:4.3.0 + __gnu_divda3@GCC_4.3.0 1:4.3.0 + __gnu_divdq3@GCC_4.3.0 1:4.3.0 + __gnu_divha3@GCC_4.3.0 1:4.3.0 + __gnu_divhq3@GCC_4.3.0 1:4.3.0 + __gnu_divqq3@GCC_4.3.0 1:4.3.0 + __gnu_divsa3@GCC_4.3.0 1:4.3.0 + __gnu_divsq3@GCC_4.3.0 1:4.3.0 + __gnu_fractdadf@GCC_4.3.0 1:4.3.0 + __gnu_fractdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractdadq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractdahq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_fractdasf@GCC_4.3.0 1:4.3.0 + __gnu_fractdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractdasq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauda@GCC_4.3.0 1:4.3.0 + __gnu_fractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauha@GCC_4.3.0 1:4.3.0 + __gnu_fractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdausa@GCC_4.3.0 1:4.3.0 + __gnu_fractdausq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdida@GCC_4.3.0 1:4.3.0 + __gnu_fractdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqha@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdquda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquha@GCC_4.3.0 1:4.3.0 + __gnu_fractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthada2@GCC_4.3.0 1:4.3.0 + __gnu_fracthadf@GCC_4.3.0 1:4.3.0 + __gnu_fracthadi@GCC_4.3.0 1:4.3.0 + __gnu_fracthadq@GCC_4.3.0 1:4.3.0 + __gnu_fracthahi@GCC_4.3.0 1:4.3.0 + __gnu_fracthahq@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_fracthasf@GCC_4.3.0 1:4.3.0 + __gnu_fracthasi@GCC_4.3.0 1:4.3.0 + __gnu_fracthasq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauda@GCC_4.3.0 1:4.3.0 + __gnu_fracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauha@GCC_4.3.0 1:4.3.0 + __gnu_fracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthausa@GCC_4.3.0 1:4.3.0 + __gnu_fracthausq@GCC_4.3.0 1:4.3.0 + __gnu_fracthida@GCC_4.3.0 1:4.3.0 + __gnu_fracthidq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiha@GCC_4.3.0 1:4.3.0 + __gnu_fracthihq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthisa@GCC_4.3.0 1:4.3.0 + __gnu_fracthisq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_fracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqha@GCC_4.3.0 1:4.3.0 + __gnu_fracthqhi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthquda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquha@GCC_4.3.0 1:4.3.0 + __gnu_fracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqida@GCC_4.3.0 1:4.3.0 + __gnu_fractqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsada2@GCC_4.3.0 1:4.3.0 + __gnu_fractsadf@GCC_4.3.0 1:4.3.0 + __gnu_fractsadi@GCC_4.3.0 1:4.3.0 + __gnu_fractsadq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractsahi@GCC_4.3.0 1:4.3.0 + __gnu_fractsahq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsasf@GCC_4.3.0 1:4.3.0 + __gnu_fractsasi@GCC_4.3.0 1:4.3.0 + __gnu_fractsasq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauda@GCC_4.3.0 1:4.3.0 + __gnu_fractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauha@GCC_4.3.0 1:4.3.0 + __gnu_fractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsausa@GCC_4.3.0 1:4.3.0 + __gnu_fractsausq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsida@GCC_4.3.0 1:4.3.0 + __gnu_fractsidq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiha@GCC_4.3.0 1:4.3.0 + __gnu_fractsihq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsisa@GCC_4.3.0 1:4.3.0 + __gnu_fractsisq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqha@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractsquda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquha@GCC_4.3.0 1:4.3.0 + __gnu_fractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractudada@GCC_4.3.0 1:4.3.0 + __gnu_fractudadf@GCC_4.3.0 1:4.3.0 + __gnu_fractudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractudadq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaha@GCC_4.3.0 1:4.3.0 + __gnu_fractudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractudahq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudasa@GCC_4.3.0 1:4.3.0 + __gnu_fractudasf@GCC_4.3.0 1:4.3.0 + __gnu_fractudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractudasq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractudausq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqda@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqha@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractudquda@GCC_4.3.0 1:4.3.0 + __gnu_fractudquha@GCC_4.3.0 1:4.3.0 + __gnu_fractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhada@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshida@GCC_4.3.0 1:4.3.0 + __gnu_fractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssida@GCC_4.3.0 1:4.3.0 + __gnu_fractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusada@GCC_4.3.0 1:4.3.0 + __gnu_fractusadf@GCC_4.3.0 1:4.3.0 + __gnu_fractusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractusadq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaha@GCC_4.3.0 1:4.3.0 + __gnu_fractusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractusahq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusasa@GCC_4.3.0 1:4.3.0 + __gnu_fractusasf@GCC_4.3.0 1:4.3.0 + __gnu_fractusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractusasq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusausq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqha@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractusquda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquha@GCC_4.3.0 1:4.3.0 + __gnu_fractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_lshruda3@GCC_4.3.0 1:4.3.0 + __gnu_lshrudq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruha3@GCC_4.3.0 1:4.3.0 + __gnu_lshruhq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruqq3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusa3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusq3@GCC_4.3.0 1:4.3.0 + __gnu_mulda3@GCC_4.3.0 1:4.3.0 + __gnu_muldq3@GCC_4.3.0 1:4.3.0 + __gnu_mulha3@GCC_4.3.0 1:4.3.0 + __gnu_mulhq3@GCC_4.3.0 1:4.3.0 + __gnu_mulqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulsa3@GCC_4.3.0 1:4.3.0 + __gnu_mulsq3@GCC_4.3.0 1:4.3.0 + __gnu_muluda3@GCC_4.3.0 1:4.3.0 + __gnu_muludq3@GCC_4.3.0 1:4.3.0 + __gnu_muluha3@GCC_4.3.0 1:4.3.0 + __gnu_muluhq3@GCC_4.3.0 1:4.3.0 + __gnu_muluqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulusa3@GCC_4.3.0 1:4.3.0 + __gnu_mulusq3@GCC_4.3.0 1:4.3.0 + __gnu_negda2@GCC_4.3.0 1:4.3.0 + __gnu_negdq2@GCC_4.3.0 1:4.3.0 + __gnu_negha2@GCC_4.3.0 1:4.3.0 + __gnu_neghq2@GCC_4.3.0 1:4.3.0 + __gnu_negqq2@GCC_4.3.0 1:4.3.0 + __gnu_negsa2@GCC_4.3.0 1:4.3.0 + __gnu_negsq2@GCC_4.3.0 1:4.3.0 + __gnu_neguda2@GCC_4.3.0 1:4.3.0 + __gnu_negudq2@GCC_4.3.0 1:4.3.0 + __gnu_neguha2@GCC_4.3.0 1:4.3.0 + __gnu_neguhq2@GCC_4.3.0 1:4.3.0 + __gnu_neguqq2@GCC_4.3.0 1:4.3.0 + __gnu_negusa2@GCC_4.3.0 1:4.3.0 + __gnu_negusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthada2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthadq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthahq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthida@GCC_4.3.0 1:4.3.0 + __gnu_satfracthidq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthihq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsada2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsida@GCC_4.3.0 1:4.3.0 + __gnu_satfractsidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudada@GCC_4.3.0 1:4.3.0 + __gnu_satfractudadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhada@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusada@GCC_4.3.0 1:4.3.0 + __gnu_satfractusadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_ssaddda3@GCC_4.3.0 1:4.3.0 + __gnu_ssadddq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddha3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ssashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivda3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivdq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivha3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulda3@GCC_4.3.0 1:4.3.0 + __gnu_ssmuldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulha3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssnegda2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegdq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegha2@GCC_4.3.0 1:4.3.0 + __gnu_ssneghq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegqq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsa2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsq2@GCC_4.3.0 1:4.3.0 + __gnu_sssubda3@GCC_4.3.0 1:4.3.0 + __gnu_sssubdq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubha3@GCC_4.3.0 1:4.3.0 + __gnu_sssubhq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubqq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsa3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsq3@GCC_4.3.0 1:4.3.0 + __gnu_subda3@GCC_4.3.0 1:4.3.0 + __gnu_subdq3@GCC_4.3.0 1:4.3.0 + __gnu_subha3@GCC_4.3.0 1:4.3.0 + __gnu_subhq3@GCC_4.3.0 1:4.3.0 + __gnu_subqq3@GCC_4.3.0 1:4.3.0 + __gnu_subsa3@GCC_4.3.0 1:4.3.0 + __gnu_subsq3@GCC_4.3.0 1:4.3.0 + __gnu_subuda3@GCC_4.3.0 1:4.3.0 + __gnu_subudq3@GCC_4.3.0 1:4.3.0 + __gnu_subuha3@GCC_4.3.0 1:4.3.0 + __gnu_subuhq3@GCC_4.3.0 1:4.3.0 + __gnu_subuqq3@GCC_4.3.0 1:4.3.0 + __gnu_subusa3@GCC_4.3.0 1:4.3.0 + __gnu_subusq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuda3@GCC_4.3.0 1:4.3.0 + __gnu_udivudq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuha3@GCC_4.3.0 1:4.3.0 + __gnu_udivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_udivusa3@GCC_4.3.0 1:4.3.0 + __gnu_udivusq3@GCC_4.3.0 1:4.3.0 + __gnu_unwind_frame@GCC_3.5 1:4.3.0 + __gnu_usadduda3@GCC_4.3.0 1:4.3.0 + __gnu_usaddudq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduha3@GCC_4.3.0 1:4.3.0 + __gnu_usadduhq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduqq3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusa3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluda3@GCC_4.3.0 1:4.3.0 + __gnu_usashludq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluha3@GCC_4.3.0 1:4.3.0 + __gnu_usashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuda3@GCC_4.3.0 1:4.3.0 + __gnu_usdivudq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuha3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusa3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluda3@GCC_4.3.0 1:4.3.0 + __gnu_usmuludq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluha3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusa3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusq3@GCC_4.3.0 1:4.3.0 + __gnu_usneguda2@GCC_4.3.0 1:4.3.0 + __gnu_usnegudq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguha2@GCC_4.3.0 1:4.3.0 + __gnu_usneguhq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguqq2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusa2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusq2@GCC_4.3.0 1:4.3.0 + __gnu_ussubuda3@GCC_4.3.0 1:4.3.0 + __gnu_ussubudq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuha3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuhq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuqq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusa3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusq3@GCC_4.3.0 1:4.3.0 + __gtdf2@GCC_3.0 1:4.3.0 + __gtsf2@GCC_3.0 1:4.3.0 + __ledf2@GCC_3.0 1:4.3.0 + __lesf2@GCC_3.0 1:4.3.0 + __lshrdi3@GCC_3.0 1:4.3.0 + __ltdf2@GCC_3.0 1:4.3.0 + __ltsf2@GCC_3.0 1:4.3.0 + __moddi3@GLIBC_2.0 1:4.3.0 + __modsi3@GCC_3.0 1:4.3.0 + __muldc3@GCC_4.0.0 1:4.3.0 + __muldf3@GCC_3.0 1:4.3.0 + __muldi3@GCC_3.0 1:4.3.0 + __mulsc3@GCC_4.0.0 1:4.3.0 + __mulsf3@GCC_3.0 1:4.3.0 + __mulvdi3@GCC_3.0 1:4.3.0 + __mulvsi3@GCC_3.0 1:4.3.0 + __nedf2@GCC_3.0 1:4.3.0 + __negdf2@GCC_3.0 1:4.3.0 + __negdi2@GCC_3.0 1:4.3.0 + __negsf2@GCC_3.0 1:4.3.0 + __negvdi2@GCC_3.0 1:4.3.0 + __negvsi2@GCC_3.0 1:4.3.0 + __nesf2@GCC_3.0 1:4.3.0 + __paritydi2@GCC_3.4 1:4.3.0 + __paritysi2@GCC_3.4 1:4.3.0 + __popcountdi2@GCC_3.4 1:4.3.0 + __popcountsi2@GCC_3.4 1:4.3.0 + __powidf2@GCC_4.0.0 1:4.3.0 + __powisf2@GCC_4.0.0 1:4.3.0 + __subdf3@GCC_3.0 1:4.3.0 + __subsf3@GCC_3.0 1:4.3.0 + __subvdi3@GCC_3.0 1:4.3.0 + __subvsi3@GCC_3.0 1:4.3.0 + __truncdfsf2@GCC_3.0 1:4.3.0 + __ucmpdi2@GCC_3.0 1:4.3.0 + __udivdi3@GLIBC_2.0 1:4.3.0 + __udivmoddi4@GCC_3.0 1:4.3.0 + __udivsi3@GCC_3.0 1:4.3.0 + __umoddi3@GLIBC_2.0 1:4.3.0 + __umodsi3@GCC_3.0 1:4.3.0 + __unorddf2@GCC_3.3.4 1:4.3.0 + __unordsf2@GCC_3.3.4 1:4.3.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.armhf +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.armhf @@ -0,0 +1,1103 @@ +libgcc_s.so.1 libgcc1 #MINVER# +(ignore-blacklist)#include "libgcc1.symbols.aeabi" + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_3.5@GCC_3.5 1:4.3.0 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_4.3.0 1:4.3.0 + _Unwind_Complete@GCC_3.5 1:4.3.0 + _Unwind_DeleteException@GCC_3.0 1:4.3.0 + _Unwind_ForcedUnwind@GCC_3.0 1:4.3.0 + _Unwind_GetCFA@GCC_3.3 1:4.3.0 + _Unwind_GetDataRelBase@GCC_3.0 1:4.3.0 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.3.0 + _Unwind_GetRegionStart@GCC_3.0 1:4.3.0 + _Unwind_GetTextRelBase@GCC_3.0 1:4.3.0 + _Unwind_RaiseException@GCC_3.0 1:4.3.0 + _Unwind_Resume@GCC_3.0 1:4.3.0 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.3.0 + _Unwind_VRS_Get@GCC_3.5 1:4.3.0 + _Unwind_VRS_Pop@GCC_3.5 1:4.3.0 + _Unwind_VRS_Set@GCC_3.5 1:4.3.0 + __absvdi2@GCC_3.0 1:4.3.0 + __absvsi2@GCC_3.0 1:4.3.0 + __adddf3@GCC_3.0 1:4.3.0 + __addsf3@GCC_3.0 1:4.3.0 + __addvdi3@GCC_3.0 1:4.3.0 + __addvsi3@GCC_3.0 1:4.3.0 + __ashldi3@GCC_3.0 1:4.3.0 + __ashrdi3@GCC_3.0 1:4.3.0 + __bswapdi2@GCC_4.3.0 1:4.3.0 + __bswapsi2@GCC_4.3.0 1:4.3.0 + __clear_cache@GCC_3.0 1:4.3.0 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.3.0 + __clzsi2@GCC_3.4 1:4.3.0 + __cmpdi2@GCC_3.0 1:4.3.0 + __ctzdi2@GCC_3.4 1:4.3.0 + __ctzsi2@GCC_3.4 1:4.3.0 + __divdc3@GCC_4.0.0 1:4.3.0 + __divdf3@GCC_3.0 1:4.3.0 + __divdi3@GLIBC_2.0 1:4.3.0 + __divsc3@GCC_4.0.0 1:4.3.0 + __divsf3@GCC_3.0 1:4.3.0 + __divsi3@GCC_3.0 1:4.3.0 + __emutls_get_address@GCC_4.3.0 1:4.3.0 + __emutls_register_common@GCC_4.3.0 1:4.3.0 + __enable_execute_stack@GCC_3.4.2 1:4.3.0 + __eqdf2@GCC_3.0 1:4.3.0 + __eqsf2@GCC_3.0 1:4.3.0 + __extendsfdf2@GCC_3.0 1:4.3.0 + __ffsdi2@GCC_3.0 1:4.3.0 + __ffssi2@GCC_4.3.0 1:4.3.0 + __fixdfdi@GCC_3.0 1:4.3.0 + __fixdfsi@GCC_3.0 1:4.3.0 + __fixsfdi@GCC_3.0 1:4.3.0 + __fixsfsi@GCC_3.0 1:4.3.0 + __fixunsdfdi@GCC_3.0 1:4.3.0 + __fixunsdfsi@GCC_3.0 1:4.3.0 + __fixunssfdi@GCC_3.0 1:4.3.0 + __fixunssfsi@GCC_3.0 1:4.3.0 + __floatdidf@GCC_3.0 1:4.3.0 + __floatdisf@GCC_3.0 1:4.3.0 + __floatsidf@GCC_3.0 1:4.3.0 + __floatsisf@GCC_3.0 1:4.3.0 + __floatundidf@GCC_4.2.0 1:4.3.0 + __floatundisf@GCC_4.2.0 1:4.3.0 + __floatunsidf@GCC_4.2.0 1:4.3.0 + __floatunsisf@GCC_4.2.0 1:4.3.0 + __gcc_personality_v0@GCC_3.3.1 1:4.3.0 + __gedf2@GCC_3.0 1:4.3.0 + __gesf2@GCC_3.0 1:4.3.0 + __gnu_addda3@GCC_4.3.0 1:4.3.0 + __gnu_adddq3@GCC_4.3.0 1:4.3.0 + __gnu_addha3@GCC_4.3.0 1:4.3.0 + __gnu_addhq3@GCC_4.3.0 1:4.3.0 + __gnu_addqq3@GCC_4.3.0 1:4.3.0 + __gnu_addsa3@GCC_4.3.0 1:4.3.0 + __gnu_addsq3@GCC_4.3.0 1:4.3.0 + __gnu_adduda3@GCC_4.3.0 1:4.3.0 + __gnu_addudq3@GCC_4.3.0 1:4.3.0 + __gnu_adduha3@GCC_4.3.0 1:4.3.0 + __gnu_adduhq3@GCC_4.3.0 1:4.3.0 + __gnu_adduqq3@GCC_4.3.0 1:4.3.0 + __gnu_addusa3@GCC_4.3.0 1:4.3.0 + __gnu_addusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluda3@GCC_4.3.0 1:4.3.0 + __gnu_ashludq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluha3@GCC_4.3.0 1:4.3.0 + __gnu_ashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrda3@GCC_4.3.0 1:4.3.0 + __gnu_ashrdq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrha3@GCC_4.3.0 1:4.3.0 + __gnu_ashrhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsq3@GCC_4.3.0 1:4.3.0 + __gnu_cmpda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpdq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpha2@GCC_4.3.0 1:4.3.0 + __gnu_cmphq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpudq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuha2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuhq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusq2@GCC_4.3.0 1:4.3.0 + __gnu_divda3@GCC_4.3.0 1:4.3.0 + __gnu_divdq3@GCC_4.3.0 1:4.3.0 + __gnu_divha3@GCC_4.3.0 1:4.3.0 + __gnu_divhq3@GCC_4.3.0 1:4.3.0 + __gnu_divqq3@GCC_4.3.0 1:4.3.0 + __gnu_divsa3@GCC_4.3.0 1:4.3.0 + __gnu_divsq3@GCC_4.3.0 1:4.3.0 + __gnu_fractdadf@GCC_4.3.0 1:4.3.0 + __gnu_fractdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractdadq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractdahq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_fractdasf@GCC_4.3.0 1:4.3.0 + __gnu_fractdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractdasq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauda@GCC_4.3.0 1:4.3.0 + __gnu_fractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauha@GCC_4.3.0 1:4.3.0 + __gnu_fractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdausa@GCC_4.3.0 1:4.3.0 + __gnu_fractdausq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdida@GCC_4.3.0 1:4.3.0 + __gnu_fractdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqha@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdquda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquha@GCC_4.3.0 1:4.3.0 + __gnu_fractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthada2@GCC_4.3.0 1:4.3.0 + __gnu_fracthadf@GCC_4.3.0 1:4.3.0 + __gnu_fracthadi@GCC_4.3.0 1:4.3.0 + __gnu_fracthadq@GCC_4.3.0 1:4.3.0 + __gnu_fracthahi@GCC_4.3.0 1:4.3.0 + __gnu_fracthahq@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_fracthasf@GCC_4.3.0 1:4.3.0 + __gnu_fracthasi@GCC_4.3.0 1:4.3.0 + __gnu_fracthasq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauda@GCC_4.3.0 1:4.3.0 + __gnu_fracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauha@GCC_4.3.0 1:4.3.0 + __gnu_fracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthausa@GCC_4.3.0 1:4.3.0 + __gnu_fracthausq@GCC_4.3.0 1:4.3.0 + __gnu_fracthida@GCC_4.3.0 1:4.3.0 + __gnu_fracthidq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiha@GCC_4.3.0 1:4.3.0 + __gnu_fracthihq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthisa@GCC_4.3.0 1:4.3.0 + __gnu_fracthisq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_fracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqha@GCC_4.3.0 1:4.3.0 + __gnu_fracthqhi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthquda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquha@GCC_4.3.0 1:4.3.0 + __gnu_fracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqida@GCC_4.3.0 1:4.3.0 + __gnu_fractqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsada2@GCC_4.3.0 1:4.3.0 + __gnu_fractsadf@GCC_4.3.0 1:4.3.0 + __gnu_fractsadi@GCC_4.3.0 1:4.3.0 + __gnu_fractsadq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractsahi@GCC_4.3.0 1:4.3.0 + __gnu_fractsahq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsasf@GCC_4.3.0 1:4.3.0 + __gnu_fractsasi@GCC_4.3.0 1:4.3.0 + __gnu_fractsasq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauda@GCC_4.3.0 1:4.3.0 + __gnu_fractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauha@GCC_4.3.0 1:4.3.0 + __gnu_fractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsausa@GCC_4.3.0 1:4.3.0 + __gnu_fractsausq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsida@GCC_4.3.0 1:4.3.0 + __gnu_fractsidq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiha@GCC_4.3.0 1:4.3.0 + __gnu_fractsihq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsisa@GCC_4.3.0 1:4.3.0 + __gnu_fractsisq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqha@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractsquda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquha@GCC_4.3.0 1:4.3.0 + __gnu_fractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractudada@GCC_4.3.0 1:4.3.0 + __gnu_fractudadf@GCC_4.3.0 1:4.3.0 + __gnu_fractudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractudadq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaha@GCC_4.3.0 1:4.3.0 + __gnu_fractudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractudahq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudasa@GCC_4.3.0 1:4.3.0 + __gnu_fractudasf@GCC_4.3.0 1:4.3.0 + __gnu_fractudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractudasq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractudausq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqda@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqha@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractudquda@GCC_4.3.0 1:4.3.0 + __gnu_fractudquha@GCC_4.3.0 1:4.3.0 + __gnu_fractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhada@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshida@GCC_4.3.0 1:4.3.0 + __gnu_fractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssida@GCC_4.3.0 1:4.3.0 + __gnu_fractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusada@GCC_4.3.0 1:4.3.0 + __gnu_fractusadf@GCC_4.3.0 1:4.3.0 + __gnu_fractusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractusadq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaha@GCC_4.3.0 1:4.3.0 + __gnu_fractusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractusahq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusasa@GCC_4.3.0 1:4.3.0 + __gnu_fractusasf@GCC_4.3.0 1:4.3.0 + __gnu_fractusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractusasq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusausq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqha@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractusquda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquha@GCC_4.3.0 1:4.3.0 + __gnu_fractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_lshruda3@GCC_4.3.0 1:4.3.0 + __gnu_lshrudq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruha3@GCC_4.3.0 1:4.3.0 + __gnu_lshruhq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruqq3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusa3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusq3@GCC_4.3.0 1:4.3.0 + __gnu_mulda3@GCC_4.3.0 1:4.3.0 + __gnu_muldq3@GCC_4.3.0 1:4.3.0 + __gnu_mulha3@GCC_4.3.0 1:4.3.0 + __gnu_mulhq3@GCC_4.3.0 1:4.3.0 + __gnu_mulqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulsa3@GCC_4.3.0 1:4.3.0 + __gnu_mulsq3@GCC_4.3.0 1:4.3.0 + __gnu_muluda3@GCC_4.3.0 1:4.3.0 + __gnu_muludq3@GCC_4.3.0 1:4.3.0 + __gnu_muluha3@GCC_4.3.0 1:4.3.0 + __gnu_muluhq3@GCC_4.3.0 1:4.3.0 + __gnu_muluqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulusa3@GCC_4.3.0 1:4.3.0 + __gnu_mulusq3@GCC_4.3.0 1:4.3.0 + __gnu_negda2@GCC_4.3.0 1:4.3.0 + __gnu_negdq2@GCC_4.3.0 1:4.3.0 + __gnu_negha2@GCC_4.3.0 1:4.3.0 + __gnu_neghq2@GCC_4.3.0 1:4.3.0 + __gnu_negqq2@GCC_4.3.0 1:4.3.0 + __gnu_negsa2@GCC_4.3.0 1:4.3.0 + __gnu_negsq2@GCC_4.3.0 1:4.3.0 + __gnu_neguda2@GCC_4.3.0 1:4.3.0 + __gnu_negudq2@GCC_4.3.0 1:4.3.0 + __gnu_neguha2@GCC_4.3.0 1:4.3.0 + __gnu_neguhq2@GCC_4.3.0 1:4.3.0 + __gnu_neguqq2@GCC_4.3.0 1:4.3.0 + __gnu_negusa2@GCC_4.3.0 1:4.3.0 + __gnu_negusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthada2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthadq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthahq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthida@GCC_4.3.0 1:4.3.0 + __gnu_satfracthidq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthihq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsada2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsida@GCC_4.3.0 1:4.3.0 + __gnu_satfractsidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudada@GCC_4.3.0 1:4.3.0 + __gnu_satfractudadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhada@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusada@GCC_4.3.0 1:4.3.0 + __gnu_satfractusadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_ssaddda3@GCC_4.3.0 1:4.3.0 + __gnu_ssadddq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddha3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ssashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivda3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivdq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivha3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulda3@GCC_4.3.0 1:4.3.0 + __gnu_ssmuldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulha3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssnegda2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegdq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegha2@GCC_4.3.0 1:4.3.0 + __gnu_ssneghq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegqq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsa2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsq2@GCC_4.3.0 1:4.3.0 + __gnu_sssubda3@GCC_4.3.0 1:4.3.0 + __gnu_sssubdq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubha3@GCC_4.3.0 1:4.3.0 + __gnu_sssubhq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubqq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsa3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsq3@GCC_4.3.0 1:4.3.0 + __gnu_subda3@GCC_4.3.0 1:4.3.0 + __gnu_subdq3@GCC_4.3.0 1:4.3.0 + __gnu_subha3@GCC_4.3.0 1:4.3.0 + __gnu_subhq3@GCC_4.3.0 1:4.3.0 + __gnu_subqq3@GCC_4.3.0 1:4.3.0 + __gnu_subsa3@GCC_4.3.0 1:4.3.0 + __gnu_subsq3@GCC_4.3.0 1:4.3.0 + __gnu_subuda3@GCC_4.3.0 1:4.3.0 + __gnu_subudq3@GCC_4.3.0 1:4.3.0 + __gnu_subuha3@GCC_4.3.0 1:4.3.0 + __gnu_subuhq3@GCC_4.3.0 1:4.3.0 + __gnu_subuqq3@GCC_4.3.0 1:4.3.0 + __gnu_subusa3@GCC_4.3.0 1:4.3.0 + __gnu_subusq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuda3@GCC_4.3.0 1:4.3.0 + __gnu_udivudq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuha3@GCC_4.3.0 1:4.3.0 + __gnu_udivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_udivusa3@GCC_4.3.0 1:4.3.0 + __gnu_udivusq3@GCC_4.3.0 1:4.3.0 + __gnu_unwind_frame@GCC_3.5 1:4.3.0 + __gnu_usadduda3@GCC_4.3.0 1:4.3.0 + __gnu_usaddudq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduha3@GCC_4.3.0 1:4.3.0 + __gnu_usadduhq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduqq3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusa3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluda3@GCC_4.3.0 1:4.3.0 + __gnu_usashludq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluha3@GCC_4.3.0 1:4.3.0 + __gnu_usashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuda3@GCC_4.3.0 1:4.3.0 + __gnu_usdivudq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuha3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusa3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluda3@GCC_4.3.0 1:4.3.0 + __gnu_usmuludq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluha3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusa3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusq3@GCC_4.3.0 1:4.3.0 + __gnu_usneguda2@GCC_4.3.0 1:4.3.0 + __gnu_usnegudq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguha2@GCC_4.3.0 1:4.3.0 + __gnu_usneguhq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguqq2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusa2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusq2@GCC_4.3.0 1:4.3.0 + __gnu_ussubuda3@GCC_4.3.0 1:4.3.0 + __gnu_ussubudq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuha3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuhq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuqq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusa3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusq3@GCC_4.3.0 1:4.3.0 + __gtdf2@GCC_3.0 1:4.3.0 + __gtsf2@GCC_3.0 1:4.3.0 + __ledf2@GCC_3.0 1:4.3.0 + __lesf2@GCC_3.0 1:4.3.0 + __lshrdi3@GCC_3.0 1:4.3.0 + __ltdf2@GCC_3.0 1:4.3.0 + __ltsf2@GCC_3.0 1:4.3.0 + __moddi3@GLIBC_2.0 1:4.3.0 + __modsi3@GCC_3.0 1:4.3.0 + __muldc3@GCC_4.0.0 1:4.3.0 + __muldf3@GCC_3.0 1:4.3.0 + __muldi3@GCC_3.0 1:4.3.0 + __mulsc3@GCC_4.0.0 1:4.3.0 + __mulsf3@GCC_3.0 1:4.3.0 + __mulvdi3@GCC_3.0 1:4.3.0 + __mulvsi3@GCC_3.0 1:4.3.0 + __nedf2@GCC_3.0 1:4.3.0 + __negdf2@GCC_3.0 1:4.3.0 + __negdi2@GCC_3.0 1:4.3.0 + __negsf2@GCC_3.0 1:4.3.0 + __negvdi2@GCC_3.0 1:4.3.0 + __negvsi2@GCC_3.0 1:4.3.0 + __nesf2@GCC_3.0 1:4.3.0 + __paritydi2@GCC_3.4 1:4.3.0 + __paritysi2@GCC_3.4 1:4.3.0 + __popcountdi2@GCC_3.4 1:4.3.0 + __popcountsi2@GCC_3.4 1:4.3.0 + __powidf2@GCC_4.0.0 1:4.3.0 + __powisf2@GCC_4.0.0 1:4.3.0 + __subdf3@GCC_3.0 1:4.3.0 + __subsf3@GCC_3.0 1:4.3.0 + __subvdi3@GCC_3.0 1:4.3.0 + __subvsi3@GCC_3.0 1:4.3.0 + __truncdfsf2@GCC_3.0 1:4.3.0 + __ucmpdi2@GCC_3.0 1:4.3.0 + __udivdi3@GLIBC_2.0 1:4.3.0 + __udivmoddi4@GCC_3.0 1:4.3.0 + __udivsi3@GCC_3.0 1:4.3.0 + __umoddi3@GLIBC_2.0 1:4.3.0 + __umodsi3@GCC_3.0 1:4.3.0 + __unorddf2@GCC_3.3.4 1:4.3.0 + __unordsf2@GCC_3.3.4 1:4.3.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.hurd-i386 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.hurd-i386 @@ -0,0 +1,103 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 4.2.1 + GCC_3.3.1@GCC_3.3.1 4.2.1 + GCC_3.3@GCC_3.3 4.2.1 + GCC_3.4.2@GCC_3.4.2 4.2.1 + GCC_3.4@GCC_3.4 4.2.1 + GCC_4.0.0@GCC_4.0.0 4.2.1 + GCC_4.2.0@GCC_4.2.0 4.2.1 + GCC_4.3.0@GCC_4.3.0 1:4.3.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 4.2.1 + _Unwind_Backtrace@GCC_3.3 4.2.1 + _Unwind_DeleteException@GCC_3.0 4.2.1 + _Unwind_FindEnclosingFunction@GCC_3.3 4.2.1 + _Unwind_Find_FDE@GCC_3.0 4.2.1 + _Unwind_ForcedUnwind@GCC_3.0 4.2.1 + _Unwind_GetCFA@GCC_3.3 4.2.1 + _Unwind_GetDataRelBase@GCC_3.0 4.2.1 + _Unwind_GetGR@GCC_3.0 4.2.1 + _Unwind_GetIP@GCC_3.0 4.2.1 + _Unwind_GetIPInfo@GCC_4.2.0 4.2.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 4.2.1 + _Unwind_GetRegionStart@GCC_3.0 4.2.1 + _Unwind_GetTextRelBase@GCC_3.0 4.2.1 + _Unwind_RaiseException@GCC_3.0 4.2.1 + _Unwind_Resume@GCC_3.0 4.2.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 4.2.1 + _Unwind_SetGR@GCC_3.0 4.2.1 + _Unwind_SetIP@GCC_3.0 4.2.1 + __absvdi2@GCC_3.0 4.2.1 + __absvsi2@GCC_3.0 4.2.1 + __addvdi3@GCC_3.0 4.2.1 + __addvsi3@GCC_3.0 4.2.1 + __ashldi3@GCC_3.0 4.2.1 + __ashrdi3@GCC_3.0 4.2.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 4.2.1 + __clzdi2@GCC_3.4 4.2.1 + __clzsi2@GCC_3.4 4.2.1 + __cmpdi2@GCC_3.0 4.2.1 + __ctzdi2@GCC_3.4 4.2.1 + __ctzsi2@GCC_3.4 4.2.1 + __deregister_frame@GLIBC_2.0 4.2.1 + __deregister_frame_info@GLIBC_2.0 4.2.1 + __deregister_frame_info_bases@GCC_3.0 4.2.1 + __divdc3@GCC_4.0.0 4.2.1 + __divdi3@GLIBC_2.0 4.2.1 + __divsc3@GCC_4.0.0 4.2.1 + __divxc3@GCC_4.0.0 4.2.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 4.2.1 + __ffsdi2@GCC_3.0 4.2.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 4.2.1 + __fixsfdi@GCC_3.0 4.2.1 + __fixunsdfdi@GCC_3.0 4.2.1 + __fixunsdfsi@GCC_3.0 4.2.1 + __fixunssfdi@GCC_3.0 4.2.1 + __fixunssfsi@GCC_3.0 4.2.1 + __fixunsxfdi@GCC_3.0 4.2.1 + __fixunsxfsi@GCC_3.0 4.2.1 + __fixxfdi@GCC_3.0 4.2.1 + __floatdidf@GCC_3.0 4.2.1 + __floatdisf@GCC_3.0 4.2.1 + __floatdixf@GCC_3.0 4.2.1 + __floatundidf@GCC_4.2.0 4.2.1 + __floatundisf@GCC_4.2.0 4.2.1 + __floatundixf@GCC_4.2.0 4.2.1 + __frame_state_for@GLIBC_2.0 4.2.1 + __gcc_personality_v0@GCC_3.3.1 4.2.1 + __lshrdi3@GCC_3.0 4.2.1 + __moddi3@GLIBC_2.0 4.2.1 + __muldc3@GCC_4.0.0 4.2.1 + __muldi3@GCC_3.0 4.2.1 + __mulsc3@GCC_4.0.0 4.2.1 + __mulvdi3@GCC_3.0 4.2.1 + __mulvsi3@GCC_3.0 4.2.1 + __mulxc3@GCC_4.0.0 4.2.1 + __negdi2@GCC_3.0 4.2.1 + __negvdi2@GCC_3.0 4.2.1 + __negvsi2@GCC_3.0 4.2.1 + __paritydi2@GCC_3.4 4.2.1 + __paritysi2@GCC_3.4 4.2.1 + __popcountdi2@GCC_3.4 4.2.1 + __popcountsi2@GCC_3.4 4.2.1 + __powidf2@GCC_4.0.0 4.2.1 + __powisf2@GCC_4.0.0 4.2.1 + __powixf2@GCC_4.0.0 4.2.1 + __register_frame@GLIBC_2.0 4.2.1 + __register_frame_info@GLIBC_2.0 4.2.1 + __register_frame_info_bases@GCC_3.0 4.2.1 + __register_frame_info_table@GLIBC_2.0 4.2.1 + __register_frame_info_table_bases@GCC_3.0 4.2.1 + __register_frame_table@GLIBC_2.0 4.2.1 + __subvdi3@GCC_3.0 4.2.1 + __subvsi3@GCC_3.0 4.2.1 + __ucmpdi2@GCC_3.0 4.2.1 + __udivdi3@GLIBC_2.0 4.2.1 + __udivmoddi4@GCC_3.0 4.2.1 + __umoddi3@GLIBC_2.0 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.i386 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.i386 @@ -0,0 +1,140 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.5.0@GCC_4.5.0 1:4.5.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_4.4.0 1:4.4.0 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __extendxftf2@GCC_4.5.0 1:4.5.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfsi@GCC_3.0 1:4.1.1 + __fixxfdi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatdixf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatundixf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrdi3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.ia64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.ia64 @@ -0,0 +1,148 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.2@GCC_3.3.2 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetBSP@GCC_3.3.2 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.8 + __clrsbti2@GCC_4.7.0 1:4.8 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsi3@GCC_3.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_3.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __divxc3@GCC_4.0.0 1:4.1.1 + __divxf3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunstfti@GCC_3.0 1:4.1.1 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfti@GCC_3.0 1:4.1.1 + __fixxfti@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floattixf@GCC_3.0 1:4.1.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntixf@GCC_4.2.0 1:4.2.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __ia64_nonlocal_goto@GCC_3.0 1:4.1.1 + __ia64_restore_stack_nonlocal@GCC_3.0 1:4.1.1 + __ia64_save_stack_nonlocal@GCC_3.0 1:4.1.1 + __ia64_trampoline@GCC_3.0 1:4.1.1 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrti3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __modsi3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivsi3@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __umodsi3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.kfreebsd-amd64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.kfreebsd-amd64 @@ -0,0 +1,142 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addtf3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __cpu_indicator_init@GCC_4.8.0 1:4.8 + __cpu_model@GCC_4.8.0 1:4.8 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GCC_3.0 1:4.1.1 + __deregister_frame_info@GCC_3.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.3 + __divtf3@GCC_4.3.0 1:4.3 + __divti3@GCC_3.0 1:4.1.1 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.3.0 1:4.3 + __extenddftf2@GCC_4.3.0 1:4.3 + __extendsftf2@GCC_4.3.0 1:4.3 + __extendxftf2@GCC_4.3.0 1:4.3 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.3.0 1:4.3 + __fixtfsi@GCC_4.3.0 1:4.3 + __fixtfti@GCC_4.3.0 1:4.3 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.3.0 1:4.3 + __fixunstfsi@GCC_4.3.0 1:4.3 + __fixunstfti@GCC_4.3.0 1:4.3 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfti@GCC_3.0 1:4.1.1 + __fixxfti@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.3.0 1:4.3 + __floatsitf@GCC_4.3.0 1:4.3 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_4.3.0 1:4.3 + __floattixf@GCC_3.0 1:4.1.1 + __floatunditf@GCC_4.3.0 1:4.3 + __floatunsitf@GCC_4.3.0 1:4.3 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.3.0 1:4.3 + __floatuntixf@GCC_4.2.0 1:4.2.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.3.0 1:4.3 + __gttf2@GCC_3.0 1:4.3 + __letf2@GCC_4.3.0 1:4.3 + __lshrti3@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.3 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.3 + __multf3@GCC_4.3.0 1:4.3 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negtf2@GCC_4.3.0 1:4.3 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __netf2@GCC_3.0 1:4.3 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.3 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GCC_3.0 1:4.1.1 + __register_frame_info@GCC_3.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GCC_3.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GCC_3.0 1:4.1.1 + __subtf3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __trunctfdf2@GCC_4.3.0 1:4.3 + __trunctfsf2@GCC_4.3.0 1:4.3 + __trunctfxf2@GCC_4.3.0 1:4.3 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + __unordtf2@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.kfreebsd-i386 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.kfreebsd-i386 @@ -0,0 +1,136 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.5.0@GCC_4.5.0 1:4.5.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_4.4.0 1:4.4.0 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __extendxftf2@GCC_4.5.0 1:4.5.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfsi@GCC_3.0 1:4.1.1 + __fixxfdi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatdixf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatundixf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrdi3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.lpia +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.lpia @@ -0,0 +1,135 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.5.0@GCC_4.5.0 1:4.5.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addtf3@GCC_4.4.0 1:4.4.0 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __copysigntf3@GCC_4.4.0 1:4.4.0 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.4.0 1:4.4.0 + __divtf3@GCC_4.4.0 1:4.4.0 + __divxc3@GCC_4.0.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqtf2@GCC_4.4.0 1:4.4.0 + __extenddftf2@GCC_4.4.0 1:4.4.0 + __extendsftf2@GCC_4.4.0 1:4.4.0 + __fabstf2@GCC_4.4.0 1:4.4.0 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.4.0 1:4.4.0 + __fixtfsi@GCC_4.4.0 1:4.4.0 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.4.0 1:4.4.0 + __fixunstfsi@GCC_4.4.0 1:4.4.0 + __fixunsxfdi@GCC_3.0 1:4.1.1 + __fixunsxfsi@GCC_3.0 1:4.1.1 + __fixxfdi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.4.0 1:4.4.0 + __floatdixf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_4.4.0 1:4.4.0 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.4.0 1:4.4.0 + __floatundixf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.4.0 1:4.4.0 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __getf2@GCC_4.4.0 1:4.4.0 + __gttf2@GCC_4.4.0 1:4.4.0 + __letf2@GCC_4.4.0 1:4.4.0 + __lshrdi3@GCC_3.0 1:4.1.1 + __lttf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.4.0 1:4.4.0 + __multf3@GCC_4.4.0 1:4.4.0 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulxc3@GCC_4.0.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negtf2@GCC_4.4.0 1:4.4.0 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __netf2@GCC_4.4.0 1:4.4.0 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.4.0 1:4.4.0 + __powixf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subtf3@GCC_4.4.0 1:4.4.0 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_4.4.0 1:4.4.0 + __trunctfsf2@GCC_4.4.0 1:4.4.0 + __trunctfxf2@GCC_4.4.0 1:4.4.0 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unordtf2@GCC_4.4.0 1:4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.mips +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.mips @@ -0,0 +1,1222 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldi3@GCC_3.0 1:4.1.1 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdi3@GCC_3.0 1:4.1.1 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdi2@GCC_3.0 1:4.1.1 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __mips16_adddf3@GCC_4.4.0 1:4.4.0 + __mips16_addsf3@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_9@GCC_4.4.0 1:4.4.0 + __mips16_divdf3@GCC_4.4.0 1:4.4.0 + __mips16_divsf3@GCC_4.4.0 1:4.4.0 + __mips16_eqdf2@GCC_4.4.0 1:4.4.0 + __mips16_eqsf2@GCC_4.4.0 1:4.4.0 + __mips16_extendsfdf2@GCC_4.4.0 1:4.4.0 + __mips16_fix_truncdfsi@GCC_4.4.0 1:4.4.0 + __mips16_fix_truncsfsi@GCC_4.4.0 1:4.4.0 + __mips16_floatsidf@GCC_4.4.0 1:4.4.0 + __mips16_floatsisf@GCC_4.4.0 1:4.4.0 + __mips16_floatunsidf@GCC_4.4.0 1:4.4.0 + __mips16_floatunsisf@GCC_4.4.0 1:4.4.0 + __mips16_gedf2@GCC_4.4.0 1:4.4.0 + __mips16_gesf2@GCC_4.4.0 1:4.4.0 + __mips16_gtdf2@GCC_4.4.0 1:4.4.0 + __mips16_gtsf2@GCC_4.4.0 1:4.4.0 + __mips16_ledf2@GCC_4.4.0 1:4.4.0 + __mips16_lesf2@GCC_4.4.0 1:4.4.0 + __mips16_ltdf2@GCC_4.4.0 1:4.4.0 + __mips16_ltsf2@GCC_4.4.0 1:4.4.0 + __mips16_muldf3@GCC_4.4.0 1:4.4.0 + __mips16_mulsf3@GCC_4.4.0 1:4.4.0 + __mips16_nedf2@GCC_4.4.0 1:4.4.0 + __mips16_nesf2@GCC_4.4.0 1:4.4.0 + __mips16_ret_dc@GCC_4.4.0 1:4.4.0 + __mips16_ret_df@GCC_4.4.0 1:4.4.0 + __mips16_ret_sc@GCC_4.4.0 1:4.4.0 + __mips16_ret_sf@GCC_4.4.0 1:4.4.0 + __mips16_subdf3@GCC_4.4.0 1:4.4.0 + __mips16_subsf3@GCC_4.4.0 1:4.4.0 + __mips16_truncdfsf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_synchronize@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4.0 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.mipsel +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.mipsel @@ -0,0 +1,1222 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldi3@GCC_3.0 1:4.1.1 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdi3@GCC_3.0 1:4.1.1 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdi2@GCC_3.0 1:4.1.1 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __mips16_adddf3@GCC_4.4.0 1:4.4.0 + __mips16_addsf3@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_dc_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_df_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sc_9@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_0@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_10@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_1@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_2@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_5@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_6@GCC_4.4.0 1:4.4.0 + __mips16_call_stub_sf_9@GCC_4.4.0 1:4.4.0 + __mips16_divdf3@GCC_4.4.0 1:4.4.0 + __mips16_divsf3@GCC_4.4.0 1:4.4.0 + __mips16_eqdf2@GCC_4.4.0 1:4.4.0 + __mips16_eqsf2@GCC_4.4.0 1:4.4.0 + __mips16_extendsfdf2@GCC_4.4.0 1:4.4.0 + __mips16_fix_truncdfsi@GCC_4.4.0 1:4.4.0 + __mips16_fix_truncsfsi@GCC_4.4.0 1:4.4.0 + __mips16_floatsidf@GCC_4.4.0 1:4.4.0 + __mips16_floatsisf@GCC_4.4.0 1:4.4.0 + __mips16_floatunsidf@GCC_4.4.0 1:4.4.0 + __mips16_floatunsisf@GCC_4.4.0 1:4.4.0 + __mips16_gedf2@GCC_4.4.0 1:4.4.0 + __mips16_gesf2@GCC_4.4.0 1:4.4.0 + __mips16_gtdf2@GCC_4.4.0 1:4.4.0 + __mips16_gtsf2@GCC_4.4.0 1:4.4.0 + __mips16_ledf2@GCC_4.4.0 1:4.4.0 + __mips16_lesf2@GCC_4.4.0 1:4.4.0 + __mips16_ltdf2@GCC_4.4.0 1:4.4.0 + __mips16_ltsf2@GCC_4.4.0 1:4.4.0 + __mips16_muldf3@GCC_4.4.0 1:4.4.0 + __mips16_mulsf3@GCC_4.4.0 1:4.4.0 + __mips16_nedf2@GCC_4.4.0 1:4.4.0 + __mips16_nesf2@GCC_4.4.0 1:4.4.0 + __mips16_ret_dc@GCC_4.4.0 1:4.4.0 + __mips16_ret_df@GCC_4.4.0 1:4.4.0 + __mips16_ret_sc@GCC_4.4.0 1:4.4.0 + __mips16_ret_sf@GCC_4.4.0 1:4.4.0 + __mips16_subdf3@GCC_4.4.0 1:4.4.0 + __mips16_subsf3@GCC_4.4.0 1:4.4.0 + __mips16_truncdfsf2@GCC_4.4.0 1:4.4.0 + __moddi3@GLIBC_2.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4.0 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4.0 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4.0 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4.0 + __sync_synchronize@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4.0 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4.0 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4.0 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.powerpc +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.powerpc @@ -0,0 +1,142 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __adddf3@GCC_3.0 1:4.1.1 + __addsf3@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.1.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.1.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_4.1.0 1:4.1.1 + __gcc_qdiv@GCC_4.1.0 1:4.1.1 + __gcc_qmul@GCC_4.1.0 1:4.1.1 + __gcc_qsub@GCC_4.1.0 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negsf2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subdf3@GCC_3.0 1:4.1.1 + __subsf3@GCC_3.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trampoline_setup@GCC_3.4.2 1:4.1.1 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.powerpcspe +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.powerpcspe @@ -0,0 +1,142 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __adddf3@GCC_3.0 1:4.1.1 + __addsf3@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.1.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.1.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_4.1.0 1:4.1.1 + __gcc_qdiv@GCC_4.1.0 1:4.1.1 + __gcc_qmul@GCC_4.1.0 1:4.1.1 + __gcc_qsub@GCC_4.1.0 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negsf2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subdf3@GCC_3.0 1:4.1.1 + __subsf3@GCC_3.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __trampoline_setup@GCC_3.4.2 1:4.1.1 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.ppc64 @@ -0,0 +1,129 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_3.4.4 1:4.1.1 + __gcc_qdiv@GCC_3.4.4 1:4.1.1 + __gcc_qmul@GCC_3.4.4 1:4.1.1 + __gcc_qsub@GCC_3.4.4 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + _xlqadd@GCC_3.4 1:4.1.1 + _xlqdiv@GCC_3.4 1:4.1.1 + _xlqmul@GCC_3.4 1:4.1.1 + _xlqsub@GCC_3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.ppc64el +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.ppc64el @@ -0,0 +1,130 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gcc_qadd@GCC_3.4.4 1:4.1.1 + __gcc_qdiv@GCC_3.4.4 1:4.1.1 + __gcc_qmul@GCC_3.4.4 1:4.1.1 + __gcc_qsub@GCC_3.4.4 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __trampoline_setup@GCC_3.4.2 1:4.8 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 + _xlqadd@GCC_3.4 1:4.1.1 + _xlqdiv@GCC_3.4 1:4.1.1 + _xlqmul@GCC_3.4 1:4.1.1 + _xlqsub@GCC_3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.s390 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.s390 @@ -0,0 +1,104 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_4.1.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_4.1.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.s390x +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.s390x @@ -0,0 +1,110 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.1.0@GCC_4.1.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.2@GLIBC_2.2 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.2 1:4.1.1 + __deregister_frame_info@GLIBC_2.2 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.1.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfti@GCC_4.1.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_4.1.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_4.1.0 1:4.1.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.2 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.1.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.1.0 1:4.1.1 + __register_frame@GLIBC_2.2 1:4.1.1 + __register_frame_info@GLIBC_2.2 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.2 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.2 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.sh4 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.sh4 @@ -0,0 +1,129 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_4.8.0@GCC_4.8.0 1:4.8 + GLIBC_2.2@GLIBC_2.2 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __adddf3@GCC_3.0 1:4.1.1 + __addsf3@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.2 1:4.1.1 + __deregister_frame_info@GLIBC_2.2 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdi3@GCC_3.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.2 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __moddi3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negdf2@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negsf2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.2 1:4.1.1 + __register_frame_info@GLIBC_2.2 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.2 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.2 1:4.1.1 + __subdf3@GCC_3.0 1:4.1.1 + __subsf3@GCC_3.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __truncdfsf2@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GCC_3.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GCC_3.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.sparc +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.sparc @@ -0,0 +1,105 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GCC_LDBL_3.0@GCC_LDBL_3.0 1:4.2.1 + GCC_LDBL_4.0.0@GCC_LDBL_4.0.0 1:4.2.1 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __ashldi3@GCC_3.0 1:4.1.1 + __ashrdi3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzsi2@GCC_3.4 1:4.1.1 + __cmpdi2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzsi2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdi3@GLIBC_2.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_LDBL_4.0.0 1:4.2.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffssi2@GCC_4.3.0 1:4.3 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_LDBL_3.0 1:4.2.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_LDBL_3.0 1:4.2.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_LDBL_3.0 1:4.2.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrdi3@GCC_3.0 1:4.1.1 + __moddi3@GLIBC_2.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldi3@GCC_3.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_LDBL_4.0.0 1:4.2.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __negdi2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __paritysi2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountsi2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_LDBL_4.0.0 1:4.2.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __ucmpdi2@GCC_3.0 1:4.1.1 + __udivdi3@GLIBC_2.0 1:4.1.1 + __udivmoddi4@GCC_3.0 1:4.1.1 + __umoddi3@GLIBC_2.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc1.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/libgcc1.symbols.sparc64 @@ -0,0 +1,109 @@ +libgcc_s.so.1 libgcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.2@GLIBC_2.2 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlti3@GCC_3.0 1:4.1.1 + __ashrti3@GCC_3.0 1:4.1.1 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpti2@GCC_3.0 1:4.1.1 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.2 1:4.1.1 + __deregister_frame_info@GLIBC_2.2 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divdc3@GCC_4.0.0 1:4.1.1 + __divsc3@GCC_4.0.0 1:4.1.1 + __divtc3@GCC_4.0.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __frame_state_for@GLIBC_2.2 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __muldc3@GCC_4.0.0 1:4.1.1 + __mulsc3@GCC_4.0.0 1:4.1.1 + __multc3@GCC_4.0.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.2 1:4.1.1 + __register_frame_info@GLIBC_2.2 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.2 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.2 1:4.1.1 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __umodti3@GCC_3.0 1:4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgcc2.symbols.m68k +++ gcc-4.8-4.8.2/debian/libgcc2.symbols.m68k @@ -0,0 +1,158 @@ +libgcc_s.so.2 libgcc2 #MINVER# + GCC_3.0@GCC_3.0 4.2.1 + GCC_3.3.1@GCC_3.3.1 4.2.1 + GCC_3.3.4@GCC_3.3.4 4.4.5 + GCC_3.3@GCC_3.3 4.2.1 + GCC_3.4.2@GCC_3.4.2 4.2.1 + GCC_3.4@GCC_3.4 4.2.1 + GCC_4.0.0@GCC_4.0.0 4.2.1 + GCC_4.2.0@GCC_4.2.0 4.2.1 + GCC_4.3.0@GCC_4.3.0 4.3.0 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 4.2.1 + _Unwind_Backtrace@GCC_3.3 4.2.1 + _Unwind_DeleteException@GCC_3.0 4.2.1 + _Unwind_FindEnclosingFunction@GCC_3.3 4.2.1 + _Unwind_Find_FDE@GCC_3.0 4.2.1 + _Unwind_ForcedUnwind@GCC_3.0 4.2.1 + _Unwind_GetCFA@GCC_3.3 4.2.1 + _Unwind_GetDataRelBase@GCC_3.0 4.2.1 + _Unwind_GetGR@GCC_3.0 4.2.1 + _Unwind_GetIP@GCC_3.0 4.2.1 + _Unwind_GetIPInfo@GCC_4.2.0 4.2.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 4.2.1 + _Unwind_GetRegionStart@GCC_3.0 4.2.1 + _Unwind_GetTextRelBase@GCC_3.0 4.2.1 + _Unwind_RaiseException@GCC_3.0 4.2.1 + _Unwind_Resume@GCC_3.0 4.2.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 4.2.1 + _Unwind_SetGR@GCC_3.0 4.2.1 + _Unwind_SetIP@GCC_3.0 4.2.1 + __absvdi2@GCC_3.0 4.2.1 + __absvsi2@GCC_3.0 4.2.1 + __adddf3@GCC_3.0 4.4.5 + __addsf3@GCC_3.0 4.4.5 + __addvdi3@GCC_3.0 4.2.1 + __addvsi3@GCC_3.0 4.2.1 + __addxf3@GCC_3.0 4.4.5 + __ashldi3@GCC_3.0 4.2.1 + __ashrdi3@GCC_3.0 4.2.1 + __bswapdi2@GCC_4.3.0 4.3.0 + __bswapsi2@GCC_4.3.0 4.3.0 + __clear_cache@GCC_3.0 4.2.1 + __clzdi2@GCC_3.4 4.2.1 + __clzsi2@GCC_3.4 4.2.1 + __cmpdi2@GCC_3.0 4.2.1 + __ctzdi2@GCC_3.4 4.2.1 + __ctzsi2@GCC_3.4 4.2.1 + __deregister_frame@GLIBC_2.0 4.2.1 + __deregister_frame_info@GLIBC_2.0 4.2.1 + __deregister_frame_info_bases@GCC_3.0 4.2.1 + __divdc3@GCC_4.0.0 4.2.1 + __divdf3@GCC_3.0 4.4.5 + __divdi3@GLIBC_2.0 4.2.1 + __divsc3@GCC_4.0.0 4.2.1 + __divsf3@GCC_3.0 4.4.5 + __divsi3@GCC_3.0 4.4.5 + __divxc3@GCC_4.0.0 4.2.1 + __divxf3@GCC_3.0 4.4.5 + __emutls_get_address@GCC_4.3.0 4.3.0 + __emutls_register_common@GCC_4.3.0 4.3.0 + __enable_execute_stack@GCC_3.4.2 4.2.1 + __eqdf2@GCC_3.0 4.4.5 + __eqsf2@GCC_3.0 4.4.5 + __eqxf2@GCC_3.0 4.4.5 + __extenddfxf2@GCC_3.0 4.4.5 + __extendsfdf2@GCC_3.0 4.4.5 + __extendsfxf2@GCC_3.0 4.4.5 + __ffsdi2@GCC_3.0 4.2.1 + __ffssi2@GCC_4.3.0 4.3.0 + __fixdfdi@GCC_3.0 4.2.1 + __fixdfsi@GCC_3.0 4.4.5 + __fixsfdi@GCC_3.0 4.2.1 + __fixsfsi@GCC_3.0 4.4.5 + __fixunsdfdi@GCC_3.0 4.2.1 + __fixunsdfsi@GCC_3.0 4.2.1 + __fixunssfdi@GCC_3.0 4.2.1 + __fixunssfsi@GCC_3.0 4.2.1 + __fixunsxfdi@GCC_3.0 4.2.1 + __fixunsxfsi@GCC_3.0 4.2.1 + __fixxfdi@GCC_3.0 4.2.1 + __fixxfsi@GCC_3.0 4.4.5 + __floatdidf@GCC_3.0 4.2.1 + __floatdisf@GCC_3.0 4.2.1 + __floatdixf@GCC_3.0 4.2.1 + __floatsidf@GCC_3.0 4.4.5 + __floatsisf@GCC_3.0 4.4.5 + __floatsixf@GCC_3.0 4.4.5 + __floatundidf@GCC_4.2.0 4.2.1 + __floatundisf@GCC_4.2.0 4.2.1 + __floatundixf@GCC_4.2.0 4.2.1 + __floatunsidf@GCC_4.2.0 4.4.5 + __floatunsisf@GCC_4.2.0 4.4.5 + __floatunsixf@GCC_4.2.0 4.4.5 + __frame_state_for@GLIBC_2.0 4.2.1 + __gcc_personality_v0@GCC_3.3.1 4.2.1 + __gedf2@GCC_3.0 4.4.5 + __gesf2@GCC_3.0 4.4.5 + __gexf2@GCC_3.0 4.4.5 + __gtdf2@GCC_3.0 4.4.5 + __gtsf2@GCC_3.0 4.4.5 + __gtxf2@GCC_3.0 4.4.5 + __ledf2@GCC_3.0 4.4.5 + __lesf2@GCC_3.0 4.4.5 + __lexf2@GCC_3.0 4.4.5 + __lshrdi3@GCC_3.0 4.2.1 + __ltdf2@GCC_3.0 4.4.5 + __ltsf2@GCC_3.0 4.4.5 + __ltxf2@GCC_3.0 4.4.5 + __moddi3@GLIBC_2.0 4.2.1 + __modsi3@GCC_3.0 4.4.5 + __muldc3@GCC_4.0.0 4.2.1 + __muldf3@GCC_3.0 4.4.5 + __muldi3@GCC_3.0 4.2.1 + __mulsc3@GCC_4.0.0 4.2.1 + __mulsf3@GCC_3.0 4.4.5 + __mulsi3@GCC_3.0 4.4.5 + __mulvdi3@GCC_3.0 4.2.1 + __mulvsi3@GCC_3.0 4.2.1 + __mulxc3@GCC_4.0.0 4.2.1 + __mulxf3@GCC_3.0 4.4.5 + __nedf2@GCC_3.0 4.4.5 + __negdf2@GCC_3.0 4.4.5 + __negdi2@GCC_3.0 4.2.1 + __negsf2@GCC_3.0 4.4.5 + __negvdi2@GCC_3.0 4.2.1 + __negvsi2@GCC_3.0 4.2.1 + __negxf2@GCC_3.0 4.4.5 + __nesf2@GCC_3.0 4.4.5 + __nexf2@GCC_3.0 4.4.5 + __paritydi2@GCC_3.4 4.2.1 + __paritysi2@GCC_3.4 4.2.1 + __popcountdi2@GCC_3.4 4.2.1 + __popcountsi2@GCC_3.4 4.2.1 + __powidf2@GCC_4.0.0 4.2.1 + __powisf2@GCC_4.0.0 4.2.1 + __powixf2@GCC_4.0.0 4.2.1 + __register_frame@GLIBC_2.0 4.2.1 + __register_frame_info@GLIBC_2.0 4.2.1 + __register_frame_info_bases@GCC_3.0 4.2.1 + __register_frame_info_table@GLIBC_2.0 4.2.1 + __register_frame_info_table_bases@GCC_3.0 4.2.1 + __register_frame_table@GLIBC_2.0 4.2.1 + __subdf3@GCC_3.0 4.4.5 + __subsf3@GCC_3.0 4.4.5 + __subvdi3@GCC_3.0 4.2.1 + __subvsi3@GCC_3.0 4.2.1 + __subxf3@GCC_3.0 4.4.5 + __truncdfsf2@GCC_3.0 4.4.5 + __truncxfdf2@GCC_3.0 4.4.5 + __truncxfsf2@GCC_3.0 4.4.5 + __ucmpdi2@GCC_3.0 4.2.1 + __udivdi3@GLIBC_2.0 4.2.1 + __udivmoddi4@GCC_3.0 4.2.1 + __udivsi3@GCC_3.0 4.4.5 + __umoddi3@GLIBC_2.0 4.2.1 + __umodsi3@GCC_3.0 4.4.5 + __unorddf2@GCC_3.3.4 4.4.5 + __unordsf2@GCC_3.3.4 4.4.5 --- gcc-4.8-4.8.2.orig/debian/libgcc4.symbols.hppa +++ gcc-4.8-4.8.2/debian/libgcc4.symbols.hppa @@ -0,0 +1,94 @@ +libgcc_s.so.4 libgcc4 #MINVER# + GCC_3.0@GCC_3.0 4.1.1 + GCC_3.3.1@GCC_3.3.1 4.1.1 + GCC_3.3@GCC_3.3 4.1.1 + GCC_3.4.2@GCC_3.4.2 4.1.1 + GCC_3.4@GCC_3.4 4.1.1 + GCC_4.0.0@GCC_4.0.0 4.1.1 + GCC_4.2.0@GCC_4.2.0 4.1.1 + GCC_4.3.0@GCC_4.3.0 4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 4.1.1 + _Unwind_Backtrace@GCC_3.3 4.1.1 + _Unwind_DeleteException@GCC_3.0 4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 4.1.1 + _Unwind_Find_FDE@GCC_3.0 4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 4.1.1 + _Unwind_GetCFA@GCC_3.3 4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 4.1.1 + _Unwind_GetGR@GCC_3.0 4.1.1 + _Unwind_GetIP@GCC_3.0 4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 4.1.1 + _Unwind_GetRegionStart@GCC_3.0 4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 4.1.1 + _Unwind_RaiseException@GCC_3.0 4.1.1 + _Unwind_Resume@GCC_3.0 4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 4.1.1 + _Unwind_SetGR@GCC_3.0 4.1.1 + _Unwind_SetIP@GCC_3.0 4.1.1 + __absvdi2@GCC_3.0 4.1.1 + __absvsi2@GCC_3.0 4.1.1 + __addvdi3@GCC_3.0 4.1.1 + __addvsi3@GCC_3.0 4.1.1 + __ashldi3@GCC_3.0 4.1.1 + __ashrdi3@GCC_3.0 4.1.1 + __bswapdi2@GCC_4.3.0 4.3 + __bswapsi2@GCC_4.3.0 4.3 + __clear_cache@GCC_3.0 4.1.1 + __clzdi2@GCC_3.4 4.1.1 + __clzsi2@GCC_3.4 4.1.1 + __cmpdi2@GCC_3.0 4.1.1 + __ctzdi2@GCC_3.4 4.1.1 + __ctzsi2@GCC_3.4 4.1.1 + __deregister_frame@GLIBC_2.0 4.1.1 + __deregister_frame_info@GLIBC_2.0 4.1.1 + __deregister_frame_info_bases@GCC_3.0 4.1.1 + __divdc3@GCC_4.0.0 4.1.1 + __divdi3@GLIBC_2.0 4.1.1 + __divsc3@GCC_4.0.0 4.1.1 + __emutls_get_address@GCC_4.3.0 4.3 + __emutls_register_common@GCC_4.3.0 4.3 + __enable_execute_stack@GCC_3.4.2 4.1.1 + __ffsdi2@GCC_3.0 4.1.1 + __ffssi2@GCC_4.3.0 4.3 + __fixdfdi@GCC_3.0 4.1.1 + __fixsfdi@GCC_3.0 4.1.1 + __fixunsdfdi@GCC_3.0 4.1.1 + __fixunsdfsi@GCC_3.0 4.1.1 + __fixunssfdi@GCC_3.0 4.1.1 + __fixunssfsi@GCC_3.0 4.1.1 + __floatdidf@GCC_3.0 4.1.1 + __floatdisf@GCC_3.0 4.1.1 + __floatundidf@GCC_4.2.0 4.2.1 + __floatundisf@GCC_4.2.0 4.2.1 + __frame_state_for@GLIBC_2.0 4.1.1 + __gcc_personality_v0@GCC_3.3.1 4.1.1 + __lshrdi3@GCC_3.0 4.1.1 + __moddi3@GLIBC_2.0 4.1.1 + __muldc3@GCC_4.0.0 4.1.1 + __muldi3@GCC_3.0 4.1.1 + __mulsc3@GCC_4.0.0 4.1.1 + __mulvdi3@GCC_3.0 4.1.1 + __mulvsi3@GCC_3.0 4.1.1 + __negdi2@GCC_3.0 4.1.1 + __negvdi2@GCC_3.0 4.1.1 + __negvsi2@GCC_3.0 4.1.1 + __paritydi2@GCC_3.4 4.1.1 + __paritysi2@GCC_3.4 4.1.1 + __popcountdi2@GCC_3.4 4.1.1 + __popcountsi2@GCC_3.4 4.1.1 + __powidf2@GCC_4.0.0 4.1.1 + __powisf2@GCC_4.0.0 4.1.1 + __register_frame@GLIBC_2.0 4.1.1 + __register_frame_info@GLIBC_2.0 4.1.1 + __register_frame_info_bases@GCC_3.0 4.1.1 + __register_frame_info_table@GLIBC_2.0 4.1.1 + __register_frame_info_table_bases@GCC_3.0 4.1.1 + __register_frame_table@GLIBC_2.0 4.1.1 + __subvdi3@GCC_3.0 4.1.1 + __subvsi3@GCC_3.0 4.1.1 + __ucmpdi2@GCC_3.0 4.1.1 + __udivdi3@GLIBC_2.0 4.1.1 + __udivmoddi4@GCC_3.0 4.1.1 + __umoddi3@GLIBC_2.0 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libgccLC.postinst +++ gcc-4.8-4.8.2/debian/libgccLC.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/libgcc@LC@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libgcj-common.postinst +++ gcc-4.8-4.8.2/debian/libgcj-common.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/libgcj-common + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcj-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libgcj-common.preinst +++ gcc-4.8-4.8.2/debian/libgcj-common.preinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + upgrade|install) + if [ -n "$2" ] && [ -h /usr/share/doc/libgcj-common ] \ + && dpkg --compare-versions "$2" lt 1:4.0.2-10 + then + rm -f /usr/share/doc/libgcj-common + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libgcj-doc.doc-base +++ gcc-4.8-4.8.2/debian/libgcj-doc.doc-base @@ -0,0 +1,10 @@ +Document: libgcj-doc +Title: The GNU LibGCJ Classpath library +Author: Various +Abstract: Autogenerated documentation describing the libgcj + library (GCC 4.8), based on the classpath library. +Section: Programming/Java + +Format: html +Index: /usr/share/doc/gcc-4.8-base/api/index.html +Files: /usr/share/doc/gcc-4.8-base/api/*.html --- gcc-4.8-4.8.2.orig/debian/libgcjGCJ-awt.overrides +++ gcc-4.8-4.8.2/debian/libgcjGCJ-awt.overrides @@ -0,0 +1,2 @@ +# pick up the exact version, in case another gcj version is installed +libgcj@GCJ@-awt binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/libgcjGCJ-dev.overrides +++ gcc-4.8-4.8.2/debian/libgcjGCJ-dev.overrides @@ -0,0 +1 @@ +libgcj@GCJ@-dev binary: library-not-linked-against-libc --- gcc-4.8-4.8.2.orig/debian/libgcjGCJ.overrides +++ gcc-4.8-4.8.2/debian/libgcjGCJ.overrides @@ -0,0 +1,9 @@ +# pick up the exact version, in case another gcj version is installed +libgcj@GCJ@ binary: binary-or-shlib-defines-rpath + +# intended +libgcj@GCJ@ binary: unused-shlib-entry-in-control-file +libgcj@GCJ@ binary: shlibs-declares-dependency-on-other-package + +# keep patched ltdl copy +libgcj@GCJ@ binary: embedded-library --- gcc-4.8-4.8.2.orig/debian/libgcjLGCJ.postinst +++ gcc-4.8-4.8.2/debian/libgcjLGCJ.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/libgcj@GCJ@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf /usr/share/doc/libgcj@GCJ@ + ln -s gcj-@BV@-base /usr/share/doc/libgcj@GCJ@ + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libgcjLGCJ.postrm +++ gcc-4.8-4.8.2/debian/libgcjLGCJ.postrm @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + remove|purge) + # only purge if no other library is installed. + if [ -z "$(ls /usr/lib/libgcj.so.@GCJ@* 2>/dev/null)" ]; then + rm -f /var/lib/gcj-@BV@/classmap.db + rmdir --ignore-fail-on-non-empty /var/lib/gcj-@BV@ 2>/dev/null || true + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.10 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.10 @@ -0,0 +1,98 @@ + __iso_c_binding_c_f_pointer_c10@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_r10@GFORTRAN_1.0 4.3 + _gfortran_arandom_r10@GFORTRAN_1.0 4.3 + _gfortran_bessel_jn_r10@GFORTRAN_1.4 4.6 + _gfortran_bessel_yn_r10@GFORTRAN_1.4 4.6 + _gfortran_cpu_time_10@GFORTRAN_1.0 4.3 + _gfortran_erfc_scaled_r10@GFORTRAN_1.1 4.4.0 + _gfortran_exponent_r10@GFORTRAN_1.0 4.3 + _gfortran_fraction_r10@GFORTRAN_1.0 4.3 + _gfortran_matmul_c10@GFORTRAN_1.0 4.3 + _gfortran_matmul_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_maxval_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_minval_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_mminval_r10@GFORTRAN_1.0 4.3 + _gfortran_mproduct_c10@GFORTRAN_1.0 4.3 + _gfortran_mproduct_r10@GFORTRAN_1.0 4.3 + _gfortran_msum_c10@GFORTRAN_1.0 4.3 + _gfortran_msum_r10@GFORTRAN_1.0 4.3 + _gfortran_nearest_r10@GFORTRAN_1.0 4.3 + _gfortran_pow_c10_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_c10_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_r10_i8@GFORTRAN_1.0 4.3 + _gfortran_product_c10@GFORTRAN_1.0 4.3 + _gfortran_product_r10@GFORTRAN_1.0 4.3 + _gfortran_random_r10@GFORTRAN_1.0 4.3 + _gfortran_reshape_c10@GFORTRAN_1.0 4.3 + _gfortran_reshape_r10@GFORTRAN_1.0 4.3 + _gfortran_rrspacing_r10@GFORTRAN_1.0 4.3 + _gfortran_set_exponent_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxval_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_r10@GFORTRAN_1.0 4.3 + _gfortran_sminval_r10@GFORTRAN_1.0 4.3 + _gfortran_spacing_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__acos_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__acosh_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__aimag_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__aint_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__anint_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__asin_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__asinh_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__atan2_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__atan_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__atanh_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__conjg_10@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__cosh_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__log10_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__log_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__log_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_4_10@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_8_10@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__sinh_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_c10@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__tan_r10@GFORTRAN_1.0 4.3 + _gfortran_specific__tanh_r10@GFORTRAN_1.0 4.3 + _gfortran_sproduct_c10@GFORTRAN_1.0 4.3 + _gfortran_sproduct_r10@GFORTRAN_1.0 4.3 + _gfortran_ssum_c10@GFORTRAN_1.0 4.3 + _gfortran_ssum_r10@GFORTRAN_1.0 4.3 + _gfortran_sum_c10@GFORTRAN_1.0 4.3 + _gfortran_sum_r10@GFORTRAN_1.0 4.3 + _gfortran_transpose_c10@GFORTRAN_1.0 4.3 + _gfortran_transpose_r10@GFORTRAN_1.0 4.3 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.16 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.16 @@ -0,0 +1,199 @@ + __iso_c_binding_c_f_pointer_i16@GFORTRAN_1.0 4.3 + _gfortran_all_l16@GFORTRAN_1.0 4.3 + _gfortran_any_l16@GFORTRAN_1.0 4.3 + _gfortran_count_16_l@GFORTRAN_1.0 4.3 + _gfortran_cshift0_16@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_16_char4@GFORTRAN_1.4 4.6 + _gfortran_cshift0_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_16@GFORTRAN_1.0 4.3 + _gfortran_cshift1_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_16_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_16@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_16_char4@GFORTRAN_1.4 4.6 + _gfortran_eoshift0_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_16@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_16_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_16@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_16_char4@GFORTRAN_1.4 4.6 + _gfortran_eoshift2_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_16@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_16_char@GFORTRAN_1.0 4.3 + _gfortran_iall_i16@GFORTRAN_1.4 4.6 + _gfortran_iany_i16@GFORTRAN_1.4 4.6 + _gfortran_iparity_i16@GFORTRAN_1.4 4.6 + _gfortran_ishftc16@GFORTRAN_1.0 4.3 + _gfortran_matmul_i16@GFORTRAN_1.0 4.3 + _gfortran_matmul_l16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_maxval_i16@GFORTRAN_1.0 4.3 + _gfortran_miall_i16@GFORTRAN_1.4 4.6 + _gfortran_miany_i16@GFORTRAN_1.4 4.6 + _gfortran_minloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_minval_i16@GFORTRAN_1.0 4.3 + _gfortran_miparity_i16@GFORTRAN_1.4 4.6 + _gfortran_mmaxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mminval_i16@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i16@GFORTRAN_1.0 4.3 + _gfortran_msum_i16@GFORTRAN_1.0 4.3 + _gfortran_norm2_r10@GFORTRAN_1.4 4.6 + _gfortran_parity_l16@GFORTRAN_1.4 4.6 + _gfortran_pow_c10_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_c16_i16@GFORTRAN_1.0 4.6 + _gfortran_pow_c16_i4@GFORTRAN_1.0 4.6 + _gfortran_pow_c16_i8@GFORTRAN_1.0 4.6 + _gfortran_pow_c4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_c8_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_i4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i8_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r10_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r16_i16@GFORTRAN_1.0 4.6 + _gfortran_pow_r16_i4@GFORTRAN_1.0 4.6 + _gfortran_pow_r16_i8@GFORTRAN_1.0 4.6 + _gfortran_pow_r4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r8_i16@GFORTRAN_1.0 4.3 + _gfortran_product_i16@GFORTRAN_1.0 4.3 + _gfortran_reshape_16@GFORTRAN_1.0 4.3 + _gfortran_shape_16@GFORTRAN_1.0 4.3 + _gfortran_siall_i16@GFORTRAN_1.4 4.6 + _gfortran_siany_i16@GFORTRAN_1.4 4.6 + _gfortran_siparity_i16@GFORTRAN_1.4 4.6 + _gfortran_smaxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r10@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_sminval_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__char_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__index_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__len_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_10@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_16@GFORTRAN_1.0 4.6 + _gfortran_specific__nint_16_4@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_8@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_i16@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i16@GFORTRAN_1.0 4.3 + _gfortran_ssum_i16@GFORTRAN_1.0 4.3 + _gfortran_sum_i16@GFORTRAN_1.0 4.3 + _gfortran_transpose_i16@GFORTRAN_1.0 4.3 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.16.powerpc +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.16.powerpc @@ -0,0 +1,100 @@ + __iso_c_binding_c_f_pointer_c16@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_r16@GFORTRAN_1.0 4.3 + _gfortran_arandom_r16@GFORTRAN_1.0 4.3 + _gfortran_bessel_jn_r16@GFORTRAN_1.4 4.6 + _gfortran_bessel_yn_r16@GFORTRAN_1.4 4.6 + _gfortran_cpu_time_16@GFORTRAN_1.0 4.3 + _gfortran_erfc_scaled_r16@GFORTRAN_1.1 4.4.0 + _gfortran_exponent_r16@GFORTRAN_1.0 4.3 + _gfortran_fraction_r16@GFORTRAN_1.0 4.3 + _gfortran_matmul_c16@GFORTRAN_1.0 4.3 + _gfortran_matmul_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_maxval_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_minval_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_mminval_r16@GFORTRAN_1.0 4.3 + _gfortran_mproduct_c16@GFORTRAN_1.0 4.3 + _gfortran_mproduct_r16@GFORTRAN_1.0 4.3 + _gfortran_msum_c16@GFORTRAN_1.0 4.3 + _gfortran_msum_r16@GFORTRAN_1.0 4.3 + _gfortran_nearest_r16@GFORTRAN_1.0 4.3 + _gfortran_norm2_r16@GFORTRAN_1.4 4.6 + _gfortran_pow_c16_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_c16_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_r16_i4@GFORTRAN_1.0 4.6 + _gfortran_pow_r16_i8@GFORTRAN_1.0 4.3 + _gfortran_product_c16@GFORTRAN_1.0 4.3 + _gfortran_product_r16@GFORTRAN_1.0 4.3 + _gfortran_random_r16@GFORTRAN_1.0 4.3 + _gfortran_reshape_c16@GFORTRAN_1.0 4.3 + _gfortran_reshape_r16@GFORTRAN_1.0 4.3 + _gfortran_rrspacing_r16@GFORTRAN_1.0 4.3 + _gfortran_set_exponent_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxval_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_r16@GFORTRAN_1.0 4.3 + _gfortran_sminval_r16@GFORTRAN_1.0 4.3 + _gfortran_spacing_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__acos_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__acosh_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__aimag_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__aint_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__anint_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__asin_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__asinh_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__atan2_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__atan_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__atanh_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__conjg_16@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__cosh_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__log10_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__log_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__log_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_4_16@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_8_16@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__sinh_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_c16@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__tan_r16@GFORTRAN_1.0 4.3 + _gfortran_specific__tanh_r16@GFORTRAN_1.0 4.3 + _gfortran_sproduct_c16@GFORTRAN_1.0 4.3 + _gfortran_sproduct_r16@GFORTRAN_1.0 4.3 + _gfortran_ssum_c16@GFORTRAN_1.0 4.3 + _gfortran_ssum_r16@GFORTRAN_1.0 4.3 + _gfortran_sum_c16@GFORTRAN_1.0 4.3 + _gfortran_sum_r16@GFORTRAN_1.0 4.3 + _gfortran_transpose_c16@GFORTRAN_1.0 4.3 + _gfortran_transpose_r16@GFORTRAN_1.0 4.3 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.16.powerpc64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.16.powerpc64 @@ -0,0 +1,191 @@ + __iso_c_binding_c_f_pointer_i16@GFORTRAN_1.0 4.3 + _gfortran_all_l16@GFORTRAN_1.0 4.3 + _gfortran_any_l16@GFORTRAN_1.0 4.3 + _gfortran_count_16_l@GFORTRAN_1.0 4.3 + _gfortran_cshift0_16@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_16_char4@GFORTRAN_1.4 4.6 + _gfortran_cshift0_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_16@GFORTRAN_1.0 4.3 + _gfortran_cshift1_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_16_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_16@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_16_char4@GFORTRAN_1.4 4.6 + _gfortran_eoshift0_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_16@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_16_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_16@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_16_char4@GFORTRAN_1.4 4.6 + _gfortran_eoshift2_16_char@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_16@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_16_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_16_char@GFORTRAN_1.0 4.3 + _gfortran_iall_i16@GFORTRAN_1.4 4.6 + _gfortran_iany_i16@GFORTRAN_1.4 4.6 + _gfortran_iparity_i16@GFORTRAN_1.4 4.6 + _gfortran_ishftc16@GFORTRAN_1.0 4.3 + _gfortran_matmul_i16@GFORTRAN_1.0 4.3 + _gfortran_matmul_l16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_maxval_i16@GFORTRAN_1.0 4.3 + _gfortran_miall_i16@GFORTRAN_1.4 4.6 + _gfortran_miany_i16@GFORTRAN_1.4 4.6 + _gfortran_minloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_minval_i16@GFORTRAN_1.0 4.3 + _gfortran_miparity_i16@GFORTRAN_1.4 4.6 + _gfortran_mmaxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_mminval_i16@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i16@GFORTRAN_1.0 4.3 + _gfortran_msum_i16@GFORTRAN_1.0 4.3 + _gfortran_parity_l16@GFORTRAN_1.4 4.6 + _gfortran_pow_c16_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_c4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_c8_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_i16_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_i4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_i8_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r16_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r4_i16@GFORTRAN_1.0 4.3 + _gfortran_pow_r8_i16@GFORTRAN_1.0 4.3 + _gfortran_product_i16@GFORTRAN_1.0 4.3 + _gfortran_reshape_16@GFORTRAN_1.0 4.3 + _gfortran_shape_16@GFORTRAN_1.0 4.3 + _gfortran_siall_i16@GFORTRAN_1.4 4.6 + _gfortran_siany_i16@GFORTRAN_1.4 4.6 + _gfortran_siparity_i16@GFORTRAN_1.4 4.6 + _gfortran_smaxloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_16_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_16_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i16@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i16@GFORTRAN_1.0 4.3 + _gfortran_sminval_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__char_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__index_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__len_1_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_i16@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_16@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_4@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_16_8@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_i16@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i16@GFORTRAN_1.0 4.3 + _gfortran_ssum_i16@GFORTRAN_1.0 4.3 + _gfortran_sum_i16@GFORTRAN_1.0 4.3 + _gfortran_transpose_i16@GFORTRAN_1.0 4.3 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.64 @@ -0,0 +1,2 @@ + _gfortran_clz128@GFORTRAN_1.2 4.4.0 + _gfortran_ctz128@GFORTRAN_1.2 4.4.0 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.alpha +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.alpha @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.amd64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.amd64 @@ -0,0 +1,7 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.qf" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.arm64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.arm64 @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.64" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.armel +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.armel @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.armhf +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.armhf @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.common +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.common @@ -0,0 +1,806 @@ + F2C_1.0@F2C_1.0 4.3 + GFORTRAN_1.0@GFORTRAN_1.0 4.3 + GFORTRAN_1.1@GFORTRAN_1.1 4.4.0 + GFORTRAN_1.2@GFORTRAN_1.2 4.4.0 + GFORTRAN_1.3@GFORTRAN_1.3 4.6 + GFORTRAN_1.4@GFORTRAN_1.4 4.6 + GFORTRAN_1.5@GFORTRAN_1.5 4.8 + GFORTRAN_C99_1.0@GFORTRAN_C99_1.0 4.3 + GFORTRAN_C99_1.1@GFORTRAN_C99_1.1 4.5 + __iso_c_binding_c_f_pointer@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_c4@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_c8@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_d0@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_i1@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_i2@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_i4@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_i8@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_l1@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_l2@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_l4@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_l8@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_r4@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_r8@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_s0@GFORTRAN_1.0 4.3 + __iso_c_binding_c_f_pointer_u0@GFORTRAN_1.0 4.3 + _gfortran_abort@GFORTRAN_1.0 4.3 + _gfortran_access_func@GFORTRAN_1.0 4.3 + _gfortran_adjustl@GFORTRAN_1.0 4.3 + _gfortran_adjustl_char4@GFORTRAN_1.1 4.4.0 + _gfortran_adjustr@GFORTRAN_1.0 4.3 + _gfortran_adjustr_char4@GFORTRAN_1.1 4.4.0 + _gfortran_alarm_sub_i4@GFORTRAN_1.0 4.3 + _gfortran_alarm_sub_i8@GFORTRAN_1.0 4.3 + _gfortran_alarm_sub_int_i4@GFORTRAN_1.0 4.3 + _gfortran_alarm_sub_int_i8@GFORTRAN_1.0 4.3 + _gfortran_all_l1@GFORTRAN_1.0 4.3 + _gfortran_all_l2@GFORTRAN_1.0 4.3 + _gfortran_all_l4@GFORTRAN_1.0 4.3 + _gfortran_all_l8@GFORTRAN_1.0 4.3 + _gfortran_any_l1@GFORTRAN_1.0 4.3 + _gfortran_any_l2@GFORTRAN_1.0 4.3 + _gfortran_any_l4@GFORTRAN_1.0 4.3 + _gfortran_any_l8@GFORTRAN_1.0 4.3 + _gfortran_arandom_r4@GFORTRAN_1.0 4.3 + _gfortran_arandom_r8@GFORTRAN_1.0 4.3 + _gfortran_associated@GFORTRAN_1.0 4.3 + _gfortran_backtrace@GFORTRAN_1.5 4.8 + _gfortran_bessel_jn_r4@GFORTRAN_1.4 4.6 + _gfortran_bessel_jn_r8@GFORTRAN_1.4 4.6 + _gfortran_bessel_yn_r4@GFORTRAN_1.4 4.6 + _gfortran_bessel_yn_r8@GFORTRAN_1.4 4.6 + _gfortran_chdir_i4@GFORTRAN_1.0 4.3 + _gfortran_chdir_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_chdir_i8@GFORTRAN_1.0 4.3 + _gfortran_chdir_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_chmod_func@GFORTRAN_1.0 4.3 + _gfortran_chmod_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_chmod_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_compare_string@GFORTRAN_1.0 4.3 + _gfortran_compare_string_char4@GFORTRAN_1.1 4.4.0 + _gfortran_concat_string@GFORTRAN_1.0 4.3 + _gfortran_concat_string_char4@GFORTRAN_1.1 4.4.0 + _gfortran_convert_char1_to_char4@GFORTRAN_1.1 4.4.0 + _gfortran_convert_char4_to_char1@GFORTRAN_1.1 4.4.0 + _gfortran_count_1_l@GFORTRAN_1.0 4.3 + _gfortran_count_2_l@GFORTRAN_1.0 4.3 + _gfortran_count_4_l@GFORTRAN_1.0 4.3 + _gfortran_count_8_l@GFORTRAN_1.0 4.3 + _gfortran_cpu_time_4@GFORTRAN_1.0 4.3 + _gfortran_cpu_time_8@GFORTRAN_1.0 4.3 + _gfortran_cshift0_1@GFORTRAN_1.0 4.3 + _gfortran_cshift0_1_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_1_char@GFORTRAN_1.0 4.3 + _gfortran_cshift0_2@GFORTRAN_1.0 4.3 + _gfortran_cshift0_2_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_2_char@GFORTRAN_1.0 4.3 + _gfortran_cshift0_4@GFORTRAN_1.0 4.3 + _gfortran_cshift0_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_4_char@GFORTRAN_1.0 4.3 + _gfortran_cshift0_8@GFORTRAN_1.0 4.3 + _gfortran_cshift0_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift0_8_char@GFORTRAN_1.0 4.3 + _gfortran_cshift1_4@GFORTRAN_1.0 4.3 + _gfortran_cshift1_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_4_char@GFORTRAN_1.0 4.3 + _gfortran_cshift1_8@GFORTRAN_1.0 4.3 + _gfortran_cshift1_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_cshift1_8_char@GFORTRAN_1.0 4.3 + _gfortran_ctime@GFORTRAN_1.0 4.3 + _gfortran_ctime_sub@GFORTRAN_1.0 4.3 + _gfortran_date_and_time@GFORTRAN_1.0 4.3 + _gfortran_dtime@GFORTRAN_1.0 4.3 + _gfortran_dtime_sub@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_1@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_1_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_1_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_2@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_2_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_2_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_4@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_4_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_8@GFORTRAN_1.0 4.3 + _gfortran_eoshift0_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift0_8_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_4@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_4_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_8@GFORTRAN_1.0 4.3 + _gfortran_eoshift1_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift1_8_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_1@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_1_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_1_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_2@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_2_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_2_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_4@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_4_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_8@GFORTRAN_1.0 4.3 + _gfortran_eoshift2_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift2_8_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_4@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_4_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_4_char@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_8@GFORTRAN_1.0 4.3 + _gfortran_eoshift3_8_char4@GFORTRAN_1.1 4.4.0 + _gfortran_eoshift3_8_char@GFORTRAN_1.0 4.3 + _gfortran_erfc_scaled_r4@GFORTRAN_1.1 4.4.0 + _gfortran_erfc_scaled_r8@GFORTRAN_1.1 4.4.0 + _gfortran_error_stop_numeric@GFORTRAN_1.4 4.6 + _gfortran_error_stop_string@GFORTRAN_1.3 4.6 + _gfortran_etime@GFORTRAN_1.0 4.3 + _gfortran_etime_sub@GFORTRAN_1.0 4.3 + _gfortran_execute_command_line_i4@GFORTRAN_1.1 4.6 + _gfortran_execute_command_line_i8@GFORTRAN_1.1 4.6 + _gfortran_exit_i4@GFORTRAN_1.0 4.3 + _gfortran_exit_i8@GFORTRAN_1.0 4.3 + _gfortran_exponent_r4@GFORTRAN_1.0 4.3 + _gfortran_exponent_r8@GFORTRAN_1.0 4.3 + _gfortran_f2c_specific__abs_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__abs_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__acos_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__acosh_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__aimag_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__aimag_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__aint_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__anint_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__asin_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__asinh_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__atan2_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__atan_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__atanh_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__conjg_4@F2C_1.0 4.3 + _gfortran_f2c_specific__conjg_8@F2C_1.0 4.3 + _gfortran_f2c_specific__cos_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__cos_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__cos_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__cosh_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__dim_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__exp_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__exp_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__exp_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__log10_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__log_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__log_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__log_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__mod_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__sign_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__sin_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__sin_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__sin_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__sinh_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__sqrt_c4@F2C_1.0 4.3 + _gfortran_f2c_specific__sqrt_c8@F2C_1.0 4.3 + _gfortran_f2c_specific__sqrt_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__tan_r4@F2C_1.0 4.3 + _gfortran_f2c_specific__tanh_r4@F2C_1.0 4.3 + _gfortran_fdate@GFORTRAN_1.0 4.3 + _gfortran_fdate_sub@GFORTRAN_1.0 4.3 + _gfortran_fget@GFORTRAN_1.0 4.3 + _gfortran_fget_i1_sub@GFORTRAN_1.0 4.3 + _gfortran_fget_i2_sub@GFORTRAN_1.0 4.3 + _gfortran_fget_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_fget_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_fgetc@GFORTRAN_1.0 4.3 + _gfortran_fgetc_i1_sub@GFORTRAN_1.0 4.3 + _gfortran_fgetc_i2_sub@GFORTRAN_1.0 4.3 + _gfortran_fgetc_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_fgetc_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_flush_i4@GFORTRAN_1.0 4.3 + _gfortran_flush_i8@GFORTRAN_1.0 4.3 + _gfortran_fnum_i4@GFORTRAN_1.0 4.3 + _gfortran_fnum_i8@GFORTRAN_1.0 4.3 + _gfortran_fput@GFORTRAN_1.0 4.3 + _gfortran_fput_i1_sub@GFORTRAN_1.0 4.3 + _gfortran_fput_i2_sub@GFORTRAN_1.0 4.3 + _gfortran_fput_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_fput_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_fputc@GFORTRAN_1.0 4.3 + _gfortran_fputc_i1_sub@GFORTRAN_1.0 4.3 + _gfortran_fputc_i2_sub@GFORTRAN_1.0 4.3 + _gfortran_fputc_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_fputc_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_fraction_r4@GFORTRAN_1.0 4.3 + _gfortran_fraction_r8@GFORTRAN_1.0 4.3 + _gfortran_free@GFORTRAN_1.0 4.3 + _gfortran_fseek_sub@GFORTRAN_1.0 4.3 + _gfortran_fstat_i4@GFORTRAN_1.0 4.3 + _gfortran_fstat_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_fstat_i8@GFORTRAN_1.0 4.3 + _gfortran_fstat_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_ftell2@GFORTRAN_1.5 4.8 + _gfortran_ftell@GFORTRAN_1.0 4.3 + _gfortran_ftell_i1_sub@GFORTRAN_1.0 4.3 + _gfortran_ftell_i2_sub@GFORTRAN_1.0 4.3 + _gfortran_ftell_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_ftell_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_generate_error@GFORTRAN_1.0 4.3 + _gfortran_gerror@GFORTRAN_1.0 4.3 + _gfortran_get_command_argument_i4@GFORTRAN_1.0 4.3 + _gfortran_get_command_argument_i8@GFORTRAN_1.0 4.3 + _gfortran_get_command_i4@GFORTRAN_1.0 4.3 + _gfortran_get_command_i8@GFORTRAN_1.0 4.3 + _gfortran_get_environment_variable_i4@GFORTRAN_1.0 4.3 + _gfortran_get_environment_variable_i8@GFORTRAN_1.0 4.3 + _gfortran_getarg_i4@GFORTRAN_1.0 4.3 + _gfortran_getarg_i8@GFORTRAN_1.0 4.3 + _gfortran_getcwd@GFORTRAN_1.0 4.3 + _gfortran_getcwd_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_getcwd_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_getenv@GFORTRAN_1.0 4.3 + _gfortran_getgid@GFORTRAN_1.0 4.3 + _gfortran_getlog@GFORTRAN_1.0 4.3 + _gfortran_getpid@GFORTRAN_1.0 4.3 + _gfortran_getuid@GFORTRAN_1.0 4.3 + _gfortran_gmtime_i4@GFORTRAN_1.0 4.3 + _gfortran_gmtime_i8@GFORTRAN_1.0 4.3 + _gfortran_hostnm@GFORTRAN_1.0 4.3 + _gfortran_hostnm_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_hostnm_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_iall_i1@GFORTRAN_1.4 4.6 + _gfortran_iall_i2@GFORTRAN_1.4 4.6 + _gfortran_iall_i4@GFORTRAN_1.4 4.6 + _gfortran_iall_i8@GFORTRAN_1.4 4.6 + _gfortran_iany_i1@GFORTRAN_1.4 4.6 + _gfortran_iany_i2@GFORTRAN_1.4 4.6 + _gfortran_iany_i4@GFORTRAN_1.4 4.6 + _gfortran_iany_i8@GFORTRAN_1.4 4.6 + _gfortran_iargc@GFORTRAN_1.0 4.3 + _gfortran_idate_i4@GFORTRAN_1.0 4.3 + _gfortran_idate_i8@GFORTRAN_1.0 4.3 + _gfortran_ierrno_i4@GFORTRAN_1.0 4.3 + _gfortran_ierrno_i8@GFORTRAN_1.0 4.3 + _gfortran_internal_pack@GFORTRAN_1.0 4.3 + _gfortran_internal_unpack@GFORTRAN_1.0 4.3 + _gfortran_iparity_i1@GFORTRAN_1.4 4.6 + _gfortran_iparity_i2@GFORTRAN_1.4 4.6 + _gfortran_iparity_i4@GFORTRAN_1.4 4.6 + _gfortran_iparity_i8@GFORTRAN_1.4 4.6 + _gfortran_irand@GFORTRAN_1.0 4.3 + _gfortran_is_extension_of@GFORTRAN_1.2 4.5 + _gfortran_isatty_l4@GFORTRAN_1.0 4.3 + _gfortran_isatty_l8@GFORTRAN_1.0 4.3 + _gfortran_ishftc4@GFORTRAN_1.0 4.3 + _gfortran_ishftc8@GFORTRAN_1.0 4.3 + _gfortran_itime_i4@GFORTRAN_1.0 4.3 + _gfortran_itime_i8@GFORTRAN_1.0 4.3 + _gfortran_kill_i4@GFORTRAN_1.0 4.3 + _gfortran_kill_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_kill_i8@GFORTRAN_1.0 4.3 + _gfortran_kill_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_link_i4@GFORTRAN_1.0 4.3 + _gfortran_link_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_link_i8@GFORTRAN_1.0 4.3 + _gfortran_link_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_lstat_i4@GFORTRAN_1.0 4.3 + _gfortran_lstat_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_lstat_i8@GFORTRAN_1.0 4.3 + _gfortran_lstat_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_ltime_i4@GFORTRAN_1.0 4.3 + _gfortran_ltime_i8@GFORTRAN_1.0 4.3 + _gfortran_malloc@GFORTRAN_1.0 4.3 + _gfortran_matmul_c4@GFORTRAN_1.0 4.3 + _gfortran_matmul_c8@GFORTRAN_1.0 4.3 + _gfortran_matmul_i1@GFORTRAN_1.0 4.3 + _gfortran_matmul_i2@GFORTRAN_1.0 4.3 + _gfortran_matmul_i4@GFORTRAN_1.0 4.3 + _gfortran_matmul_i8@GFORTRAN_1.0 4.3 + _gfortran_matmul_l4@GFORTRAN_1.0 4.3 + _gfortran_matmul_l8@GFORTRAN_1.0 4.3 + _gfortran_matmul_r4@GFORTRAN_1.0 4.3 + _gfortran_matmul_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_maxloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_maxval_i1@GFORTRAN_1.0 4.3 + _gfortran_maxval_i2@GFORTRAN_1.0 4.3 + _gfortran_maxval_i4@GFORTRAN_1.0 4.3 + _gfortran_maxval_i8@GFORTRAN_1.0 4.3 + _gfortran_maxval_r4@GFORTRAN_1.0 4.3 + _gfortran_maxval_r8@GFORTRAN_1.0 4.3 + _gfortran_mclock8@GFORTRAN_1.0 4.3 + _gfortran_mclock@GFORTRAN_1.0 4.3 + _gfortran_miall_i1@GFORTRAN_1.4 4.6 + _gfortran_miall_i2@GFORTRAN_1.4 4.6 + _gfortran_miall_i4@GFORTRAN_1.4 4.6 + _gfortran_miall_i8@GFORTRAN_1.4 4.6 + _gfortran_miany_i1@GFORTRAN_1.4 4.6 + _gfortran_miany_i2@GFORTRAN_1.4 4.6 + _gfortran_miany_i4@GFORTRAN_1.4 4.6 + _gfortran_miany_i8@GFORTRAN_1.4 4.6 + _gfortran_minloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_minloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_minval_i1@GFORTRAN_1.0 4.3 + _gfortran_minval_i2@GFORTRAN_1.0 4.3 + _gfortran_minval_i4@GFORTRAN_1.0 4.3 + _gfortran_minval_i8@GFORTRAN_1.0 4.3 + _gfortran_minval_r4@GFORTRAN_1.0 4.3 + _gfortran_minval_r8@GFORTRAN_1.0 4.3 + _gfortran_miparity_i1@GFORTRAN_1.4 4.6 + _gfortran_miparity_i2@GFORTRAN_1.4 4.6 + _gfortran_miparity_i4@GFORTRAN_1.4 4.6 + _gfortran_miparity_i8@GFORTRAN_1.4 4.6 + _gfortran_mmaxloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i1@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i2@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i4@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_i8@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_r4@GFORTRAN_1.0 4.3 + _gfortran_mmaxval_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_mminloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_mminval_i1@GFORTRAN_1.0 4.3 + _gfortran_mminval_i2@GFORTRAN_1.0 4.3 + _gfortran_mminval_i4@GFORTRAN_1.0 4.3 + _gfortran_mminval_i8@GFORTRAN_1.0 4.3 + _gfortran_mminval_r4@GFORTRAN_1.0 4.3 + _gfortran_mminval_r8@GFORTRAN_1.0 4.3 + _gfortran_move_alloc@GFORTRAN_1.0 4.3 + _gfortran_move_alloc_c@GFORTRAN_1.0 4.3 + _gfortran_mproduct_c4@GFORTRAN_1.0 4.3 + _gfortran_mproduct_c8@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i1@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i2@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i4@GFORTRAN_1.0 4.3 + _gfortran_mproduct_i8@GFORTRAN_1.0 4.3 + _gfortran_mproduct_r4@GFORTRAN_1.0 4.3 + _gfortran_mproduct_r8@GFORTRAN_1.0 4.3 + _gfortran_msum_c4@GFORTRAN_1.0 4.3 + _gfortran_msum_c8@GFORTRAN_1.0 4.3 + _gfortran_msum_i1@GFORTRAN_1.0 4.3 + _gfortran_msum_i2@GFORTRAN_1.0 4.3 + _gfortran_msum_i4@GFORTRAN_1.0 4.3 + _gfortran_msum_i8@GFORTRAN_1.0 4.3 + _gfortran_msum_r4@GFORTRAN_1.0 4.3 + _gfortran_msum_r8@GFORTRAN_1.0 4.3 + _gfortran_mvbits_i1@GFORTRAN_1.0 4.3 + _gfortran_mvbits_i2@GFORTRAN_1.0 4.3 + _gfortran_mvbits_i4@GFORTRAN_1.0 4.3 + _gfortran_mvbits_i8@GFORTRAN_1.0 4.3 + _gfortran_nearest_r4@GFORTRAN_1.0 4.3 + _gfortran_nearest_r8@GFORTRAN_1.0 4.3 + _gfortran_norm2_r4@GFORTRAN_1.4 4.6 + _gfortran_norm2_r8@GFORTRAN_1.4 4.6 + _gfortran_os_error@GFORTRAN_1.0 4.3 + _gfortran_pack@GFORTRAN_1.0 4.3 + _gfortran_pack_char4@GFORTRAN_1.1 4.4.0 + _gfortran_pack_char@GFORTRAN_1.0 4.3 + _gfortran_pack_s@GFORTRAN_1.0 4.3 + _gfortran_pack_s_char4@GFORTRAN_1.1 4.4.0 + _gfortran_pack_s_char@GFORTRAN_1.0 4.3 + _gfortran_parity_l1@GFORTRAN_1.4 4.6 + _gfortran_parity_l2@GFORTRAN_1.4 4.6 + _gfortran_parity_l4@GFORTRAN_1.4 4.6 + _gfortran_parity_l8@GFORTRAN_1.4 4.6 + _gfortran_pause_numeric@GFORTRAN_1.0 4.3 + _gfortran_pause_string@GFORTRAN_1.0 4.3 + _gfortran_perror_sub@GFORTRAN_1.0 4.3 + _gfortran_pow_c4_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_c4_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_c8_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_c8_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_i4_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_i4_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_i8_i4@GFORTRAN_1.0 4.3 + _gfortran_pow_i8_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_r4_i8@GFORTRAN_1.0 4.3 + _gfortran_pow_r8_i8@GFORTRAN_1.0 4.3 + _gfortran_product_c4@GFORTRAN_1.0 4.3 + _gfortran_product_c8@GFORTRAN_1.0 4.3 + _gfortran_product_i1@GFORTRAN_1.0 4.3 + _gfortran_product_i2@GFORTRAN_1.0 4.3 + _gfortran_product_i4@GFORTRAN_1.0 4.3 + _gfortran_product_i8@GFORTRAN_1.0 4.3 + _gfortran_product_r4@GFORTRAN_1.0 4.3 + _gfortran_product_r8@GFORTRAN_1.0 4.3 + _gfortran_rand@GFORTRAN_1.0 4.3 + _gfortran_random_r4@GFORTRAN_1.0 4.3 + _gfortran_random_r8@GFORTRAN_1.0 4.3 + _gfortran_random_seed_i4@GFORTRAN_1.0 4.3 + _gfortran_random_seed_i8@GFORTRAN_1.0 4.3 + _gfortran_rename_i4@GFORTRAN_1.0 4.3 + _gfortran_rename_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_rename_i8@GFORTRAN_1.0 4.3 + _gfortran_rename_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_reshape@GFORTRAN_1.0 4.3 + _gfortran_reshape_4@GFORTRAN_1.0 4.3 + _gfortran_reshape_8@GFORTRAN_1.0 4.3 + _gfortran_reshape_c4@GFORTRAN_1.0 4.3 + _gfortran_reshape_c8@GFORTRAN_1.0 4.3 + _gfortran_reshape_char4@GFORTRAN_1.1 4.4.0 + _gfortran_reshape_char@GFORTRAN_1.0 4.3 + _gfortran_reshape_r4@GFORTRAN_1.0 4.3 + _gfortran_reshape_r8@GFORTRAN_1.0 4.3 + _gfortran_rrspacing_r4@GFORTRAN_1.0 4.3 + _gfortran_rrspacing_r8@GFORTRAN_1.0 4.3 + _gfortran_runtime_error@GFORTRAN_1.0 4.3 + _gfortran_runtime_error_at@GFORTRAN_1.0 4.3 + _gfortran_runtime_warning_at@GFORTRAN_1.1 4.4.0 + _gfortran_secnds@GFORTRAN_1.0 4.3 + _gfortran_second@GFORTRAN_1.0 4.3 + _gfortran_second_sub@GFORTRAN_1.0 4.3 + _gfortran_select_string@GFORTRAN_1.0 4.3 + _gfortran_select_string_char4@GFORTRAN_1.1 4.4.0 + _gfortran_selected_char_kind@GFORTRAN_1.1 4.4.0 + _gfortran_selected_int_kind@GFORTRAN_1.0 4.3 + _gfortran_selected_real_kind2008@GFORTRAN_1.4 4.6 + _gfortran_selected_real_kind@GFORTRAN_1.0 4.3 + _gfortran_set_args@GFORTRAN_1.0 4.3 + _gfortran_set_convert@GFORTRAN_1.0 4.3 + _gfortran_set_exponent_r4@GFORTRAN_1.0 4.3 + _gfortran_set_exponent_r8@GFORTRAN_1.0 4.3 + _gfortran_set_fpe@GFORTRAN_1.0 4.3 + _gfortran_set_max_subrecord_length@GFORTRAN_1.0 4.3 + _gfortran_set_options@GFORTRAN_1.0 4.3 + _gfortran_set_record_marker@GFORTRAN_1.0 4.3 + _gfortran_shape_4@GFORTRAN_1.0 4.3 + _gfortran_shape_8@GFORTRAN_1.0 4.3 + _gfortran_siall_i1@GFORTRAN_1.4 4.6 + _gfortran_siall_i2@GFORTRAN_1.4 4.6 + _gfortran_siall_i4@GFORTRAN_1.4 4.6 + _gfortran_siall_i8@GFORTRAN_1.4 4.6 + _gfortran_siany_i1@GFORTRAN_1.4 4.6 + _gfortran_siany_i2@GFORTRAN_1.4 4.6 + _gfortran_siany_i4@GFORTRAN_1.4 4.6 + _gfortran_siany_i8@GFORTRAN_1.4 4.6 + _gfortran_signal_func@GFORTRAN_1.0 4.3 + _gfortran_signal_func_int@GFORTRAN_1.0 4.3 + _gfortran_signal_sub@GFORTRAN_1.0 4.3 + _gfortran_signal_sub_int@GFORTRAN_1.0 4.3 + _gfortran_siparity_i1@GFORTRAN_1.4 4.6 + _gfortran_siparity_i2@GFORTRAN_1.4 4.6 + _gfortran_siparity_i4@GFORTRAN_1.4 4.6 + _gfortran_siparity_i8@GFORTRAN_1.4 4.6 + _gfortran_size0@GFORTRAN_1.0 4.3 + _gfortran_size1@GFORTRAN_1.0 4.3 + _gfortran_sleep_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_sleep_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i1@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i2@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i4@GFORTRAN_1.0 4.3 + _gfortran_smaxval_i8@GFORTRAN_1.0 4.3 + _gfortran_smaxval_r4@GFORTRAN_1.0 4.3 + _gfortran_smaxval_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_4_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc0_8_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_4_r8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i1@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i2@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_i8@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_r4@GFORTRAN_1.0 4.3 + _gfortran_sminloc1_8_r8@GFORTRAN_1.0 4.3 + _gfortran_sminval_i1@GFORTRAN_1.0 4.3 + _gfortran_sminval_i2@GFORTRAN_1.0 4.3 + _gfortran_sminval_i4@GFORTRAN_1.0 4.3 + _gfortran_sminval_i8@GFORTRAN_1.0 4.3 + _gfortran_sminval_r4@GFORTRAN_1.0 4.3 + _gfortran_sminval_r8@GFORTRAN_1.0 4.3 + _gfortran_spacing_r4@GFORTRAN_1.0 4.3 + _gfortran_spacing_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__abs_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__acos_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__acos_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__acosh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__acosh_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__aimag_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__aimag_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__aint_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__aint_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__anint_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__anint_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__asin_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__asin_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__asinh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__asinh_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__atan2_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__atan2_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__atan_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__atan_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__atanh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__atanh_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__char_1_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__char_1_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__conjg_4@GFORTRAN_1.0 4.3 + _gfortran_specific__conjg_8@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__cos_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__cosh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__cosh_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__dim_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__dprod_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__exp_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__index_1_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__index_1_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__len_1_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__len_1_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__log10_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__log10_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__log_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__log_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__log_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__log_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__mod_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_4_4@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_4_8@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_8_4@GFORTRAN_1.0 4.3 + _gfortran_specific__nint_8_8@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_i4@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_i8@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__sign_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__sin_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__sinh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__sinh_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_c4@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_c8@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__sqrt_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__tan_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__tan_r8@GFORTRAN_1.0 4.3 + _gfortran_specific__tanh_r4@GFORTRAN_1.0 4.3 + _gfortran_specific__tanh_r8@GFORTRAN_1.0 4.3 + _gfortran_spread@GFORTRAN_1.0 4.3 + _gfortran_spread_char4@GFORTRAN_1.1 4.4.0 + _gfortran_spread_char4_scalar@GFORTRAN_1.1 4.4.0 + _gfortran_spread_char@GFORTRAN_1.0 4.3 + _gfortran_spread_char_scalar@GFORTRAN_1.0 4.3 + _gfortran_spread_scalar@GFORTRAN_1.0 4.3 + _gfortran_sproduct_c4@GFORTRAN_1.0 4.3 + _gfortran_sproduct_c8@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i1@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i2@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i4@GFORTRAN_1.0 4.3 + _gfortran_sproduct_i8@GFORTRAN_1.0 4.3 + _gfortran_sproduct_r4@GFORTRAN_1.0 4.3 + _gfortran_sproduct_r8@GFORTRAN_1.0 4.3 + _gfortran_srand@GFORTRAN_1.0 4.3 + _gfortran_ssum_c4@GFORTRAN_1.0 4.3 + _gfortran_ssum_c8@GFORTRAN_1.0 4.3 + _gfortran_ssum_i1@GFORTRAN_1.0 4.3 + _gfortran_ssum_i2@GFORTRAN_1.0 4.3 + _gfortran_ssum_i4@GFORTRAN_1.0 4.3 + _gfortran_ssum_i8@GFORTRAN_1.0 4.3 + _gfortran_ssum_r4@GFORTRAN_1.0 4.3 + _gfortran_ssum_r8@GFORTRAN_1.0 4.3 + _gfortran_st_backspace@GFORTRAN_1.0 4.3 + _gfortran_st_close@GFORTRAN_1.0 4.3 + _gfortran_st_endfile@GFORTRAN_1.0 4.3 + _gfortran_st_flush@GFORTRAN_1.0 4.3 + _gfortran_st_inquire@GFORTRAN_1.0 4.3 + _gfortran_st_iolength@GFORTRAN_1.0 4.3 + _gfortran_st_iolength_done@GFORTRAN_1.0 4.3 + _gfortran_st_open@GFORTRAN_1.0 4.3 + _gfortran_st_read@GFORTRAN_1.0 4.3 + _gfortran_st_read_done@GFORTRAN_1.0 4.3 + _gfortran_st_rewind@GFORTRAN_1.0 4.3 + _gfortran_st_set_nml_var@GFORTRAN_1.0 4.3 + _gfortran_st_set_nml_var_dim@GFORTRAN_1.0 4.3 + _gfortran_st_wait@GFORTRAN_1.1 4.4.0 + _gfortran_st_write@GFORTRAN_1.0 4.3 + _gfortran_st_write_done@GFORTRAN_1.0 4.3 + _gfortran_stat_i4@GFORTRAN_1.0 4.3 + _gfortran_stat_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_stat_i8@GFORTRAN_1.0 4.3 + _gfortran_stat_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_stop_numeric@GFORTRAN_1.0 4.3 + _gfortran_stop_numeric_f08@GFORTRAN_1.4 4.6 + _gfortran_stop_string@GFORTRAN_1.0 4.3 + _gfortran_store_exe_path@GFORTRAN_1.0 4.3 + _gfortran_string_index@GFORTRAN_1.0 4.3 + _gfortran_string_index_char4@GFORTRAN_1.1 4.4.0 + _gfortran_string_len_trim@GFORTRAN_1.0 4.3 + _gfortran_string_len_trim_char4@GFORTRAN_1.1 4.4.0 + _gfortran_string_minmax@GFORTRAN_1.0 4.3 + _gfortran_string_minmax_char4@GFORTRAN_1.1 4.4.0 + _gfortran_string_scan@GFORTRAN_1.0 4.3 + _gfortran_string_scan_char4@GFORTRAN_1.1 4.4.0 + _gfortran_string_trim@GFORTRAN_1.0 4.3 + _gfortran_string_trim_char4@GFORTRAN_1.1 4.4.0 + _gfortran_string_verify@GFORTRAN_1.0 4.3 + _gfortran_string_verify_char4@GFORTRAN_1.1 4.4.0 + _gfortran_sum_c4@GFORTRAN_1.0 4.3 + _gfortran_sum_c8@GFORTRAN_1.0 4.3 + _gfortran_sum_i1@GFORTRAN_1.0 4.3 + _gfortran_sum_i2@GFORTRAN_1.0 4.3 + _gfortran_sum_i4@GFORTRAN_1.0 4.3 + _gfortran_sum_i8@GFORTRAN_1.0 4.3 + _gfortran_sum_r4@GFORTRAN_1.0 4.3 + _gfortran_sum_r8@GFORTRAN_1.0 4.3 + _gfortran_symlnk_i4@GFORTRAN_1.0 4.3 + _gfortran_symlnk_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_symlnk_i8@GFORTRAN_1.0 4.3 + _gfortran_symlnk_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_system@GFORTRAN_1.0 4.3 + _gfortran_system_clock_4@GFORTRAN_1.0 4.3 + _gfortran_system_clock_8@GFORTRAN_1.0 4.3 + _gfortran_system_sub@GFORTRAN_1.0 4.3 + _gfortran_time8_func@GFORTRAN_1.0 4.3 + _gfortran_time_func@GFORTRAN_1.0 4.3 + _gfortran_transfer_array@GFORTRAN_1.0 4.3 + _gfortran_transfer_array_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_character@GFORTRAN_1.0 4.3 + _gfortran_transfer_character_wide@GFORTRAN_1.1 4.4.0 + _gfortran_transfer_character_wide_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_character_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex@GFORTRAN_1.0 4.3 + _gfortran_transfer_complex_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_integer@GFORTRAN_1.0 4.3 + _gfortran_transfer_integer_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_logical@GFORTRAN_1.0 4.3 + _gfortran_transfer_logical_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_real@GFORTRAN_1.0 4.3 + _gfortran_transfer_real_write@GFORTRAN_1.4 4.6 + _gfortran_transpose@GFORTRAN_1.0 4.3 + _gfortran_transpose_c4@GFORTRAN_1.0 4.3 + _gfortran_transpose_c8@GFORTRAN_1.0 4.3 + _gfortran_transpose_char4@GFORTRAN_1.1 4.4.0 + _gfortran_transpose_char@GFORTRAN_1.0 4.3 + _gfortran_transpose_i4@GFORTRAN_1.0 4.3 + _gfortran_transpose_i8@GFORTRAN_1.0 4.3 + _gfortran_transpose_r4@GFORTRAN_1.0 4.3 + _gfortran_transpose_r8@GFORTRAN_1.0 4.3 + _gfortran_ttynam@GFORTRAN_1.0 4.3 + _gfortran_ttynam_sub@GFORTRAN_1.0 4.3 + _gfortran_umask_i4@GFORTRAN_1.0 4.3 + _gfortran_umask_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_umask_i8@GFORTRAN_1.0 4.3 + _gfortran_umask_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_unlink@GFORTRAN_1.0 4.3 + _gfortran_unlink_i4_sub@GFORTRAN_1.0 4.3 + _gfortran_unlink_i8_sub@GFORTRAN_1.0 4.3 + _gfortran_unpack0@GFORTRAN_1.0 4.3 + _gfortran_unpack0_char4@GFORTRAN_1.1 4.4.0 + _gfortran_unpack0_char@GFORTRAN_1.0 4.3 + _gfortran_unpack1@GFORTRAN_1.0 4.3 + _gfortran_unpack1_char4@GFORTRAN_1.1 4.4.0 + _gfortran_unpack1_char@GFORTRAN_1.0 4.3 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.hurd-i386 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.hurd-i386 @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.i386 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.i386 @@ -0,0 +1,9 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16.powerpc" + _gfortran_norm2_r10@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex128@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex128_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128_write@GFORTRAN_1.4 4.6 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.ia64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.ia64 @@ -0,0 +1,7 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.64" +#include "libgfortran3.symbols.qf" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.kfreebsd-amd64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.kfreebsd-amd64 @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" +#include "libgfortran3.symbols.16" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.kfreebsd-i386 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.kfreebsd-i386 @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.lpia +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.lpia @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.10" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.mips +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.mips @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.mipsel +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.mipsel @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.powerpc +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.powerpc @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.powerpcspe +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.powerpcspe @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.ppc64 @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.ppc64el +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.ppc64el @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.qf +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.qf @@ -0,0 +1,16 @@ + _gfortran_maxloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_maxloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_minloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_minloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_mmaxloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_mmaxloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_mminloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_mminloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_smaxloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_smaxloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_sminloc0_16_r16@GFORTRAN_1.0 4.6 + _gfortran_sminloc1_16_r16@GFORTRAN_1.0 4.6 + _gfortran_transfer_complex128@GFORTRAN_1.4 4.6 + _gfortran_transfer_complex128_write@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128@GFORTRAN_1.4 4.6 + _gfortran_transfer_real128_write@GFORTRAN_1.4 4.6 --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.s390 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.s390 @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.s390x +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.s390x @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.sh4 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.sh4 @@ -0,0 +1,2 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.sparc +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.sparc @@ -0,0 +1,3 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" --- gcc-4.8-4.8.2.orig/debian/libgfortran3.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/libgfortran3.symbols.sparc64 @@ -0,0 +1,5 @@ +libgfortran.so.3 libgfortran3 #MINVER# +#include "libgfortran3.symbols.common" +#include "libgfortran3.symbols.16.powerpc" +#include "libgfortran3.symbols.16.powerpc64" +#include "libgfortran3.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libgnat-BV.overrides +++ gcc-4.8-4.8.2/debian/libgnat-BV.overrides @@ -0,0 +1 @@ +libgnat-@BV@ binary: package-name-doesnt-match-sonames --- gcc-4.8-4.8.2.orig/debian/libgnatprjBV.overrides +++ gcc-4.8-4.8.2/debian/libgnatprjBV.overrides @@ -0,0 +1 @@ +libgnatprj@BV@ binary: missing-dependency-on-libc --- gcc-4.8-4.8.2.orig/debian/libgnatvsnBV.overrides +++ gcc-4.8-4.8.2/debian/libgnatvsnBV.overrides @@ -0,0 +1 @@ +libgnatvsn@BV@ binary: missing-dependency-on-libc --- gcc-4.8-4.8.2.orig/debian/libgomp1.symbols +++ gcc-4.8-4.8.2/debian/libgomp1.symbols @@ -0,0 +1,4 @@ +libgomp.so.1 libgomp1 #MINVER# +#include "libgomp1.symbols.common" + GOMP_atomic_end@GOMP_1.0 4.2.1 + GOMP_atomic_start@GOMP_1.0 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libgomp1.symbols.common +++ gcc-4.8-4.8.2/debian/libgomp1.symbols.common @@ -0,0 +1,159 @@ + GOMP_1.0@GOMP_1.0 4.2.1 + GOMP_2.0@GOMP_2.0 4.4 + GOMP_3.0@GOMP_3.0 4.7 + GOMP_atomic_end@GOMP_1.0 4.2.1 + GOMP_atomic_start@GOMP_1.0 4.2.1 + GOMP_barrier@GOMP_1.0 4.2.1 + GOMP_critical_end@GOMP_1.0 4.2.1 + GOMP_critical_name_end@GOMP_1.0 4.2.1 + GOMP_critical_name_start@GOMP_1.0 4.2.1 + GOMP_critical_start@GOMP_1.0 4.2.1 + GOMP_loop_dynamic_next@GOMP_1.0 4.2.1 + GOMP_loop_dynamic_start@GOMP_1.0 4.2.1 + GOMP_loop_end@GOMP_1.0 4.2.1 + GOMP_loop_end_nowait@GOMP_1.0 4.2.1 + GOMP_loop_guided_next@GOMP_1.0 4.2.1 + GOMP_loop_guided_start@GOMP_1.0 4.2.1 + GOMP_loop_ordered_dynamic_next@GOMP_1.0 4.2.1 + GOMP_loop_ordered_dynamic_start@GOMP_1.0 4.2.1 + GOMP_loop_ordered_guided_next@GOMP_1.0 4.2.1 + GOMP_loop_ordered_guided_start@GOMP_1.0 4.2.1 + GOMP_loop_ordered_runtime_next@GOMP_1.0 4.2.1 + GOMP_loop_ordered_runtime_start@GOMP_1.0 4.2.1 + GOMP_loop_ordered_static_next@GOMP_1.0 4.2.1 + GOMP_loop_ordered_static_start@GOMP_1.0 4.2.1 + GOMP_loop_runtime_next@GOMP_1.0 4.2.1 + GOMP_loop_runtime_start@GOMP_1.0 4.2.1 + GOMP_loop_static_next@GOMP_1.0 4.2.1 + GOMP_loop_static_start@GOMP_1.0 4.2.1 + GOMP_loop_ull_dynamic_next@GOMP_2.0 4.4 + GOMP_loop_ull_dynamic_start@GOMP_2.0 4.4 + GOMP_loop_ull_guided_next@GOMP_2.0 4.4 + GOMP_loop_ull_guided_start@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_dynamic_next@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_dynamic_start@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_guided_next@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_guided_start@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_runtime_next@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_runtime_start@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_static_next@GOMP_2.0 4.4 + GOMP_loop_ull_ordered_static_start@GOMP_2.0 4.4 + GOMP_loop_ull_runtime_next@GOMP_2.0 4.4 + GOMP_loop_ull_runtime_start@GOMP_2.0 4.4 + GOMP_loop_ull_static_next@GOMP_2.0 4.4 + GOMP_loop_ull_static_start@GOMP_2.0 4.4 + GOMP_ordered_end@GOMP_1.0 4.2.1 + GOMP_ordered_start@GOMP_1.0 4.2.1 + GOMP_parallel_end@GOMP_1.0 4.2.1 + GOMP_parallel_loop_dynamic_start@GOMP_1.0 4.2.1 + GOMP_parallel_loop_guided_start@GOMP_1.0 4.2.1 + GOMP_parallel_loop_runtime_start@GOMP_1.0 4.2.1 + GOMP_parallel_loop_static_start@GOMP_1.0 4.2.1 + GOMP_parallel_sections_start@GOMP_1.0 4.2.1 + GOMP_parallel_start@GOMP_1.0 4.2.1 + GOMP_sections_end@GOMP_1.0 4.2.1 + GOMP_sections_end_nowait@GOMP_1.0 4.2.1 + GOMP_sections_next@GOMP_1.0 4.2.1 + GOMP_sections_start@GOMP_1.0 4.2.1 + GOMP_single_copy_end@GOMP_1.0 4.2.1 + GOMP_single_copy_start@GOMP_1.0 4.2.1 + GOMP_single_start@GOMP_1.0 4.2.1 + GOMP_task@GOMP_2.0 4.4 + GOMP_taskwait@GOMP_2.0 4.4 + GOMP_taskyield@GOMP_3.0 4.7 + OMP_1.0@OMP_1.0 4.2.1 + OMP_2.0@OMP_2.0 4.2.1 + OMP_3.0@OMP_3.0 4.4 + OMP_3.1@OMP_3.1 4.7 + omp_destroy_lock@OMP_1.0 4.2.1 + omp_destroy_lock@OMP_3.0 4.4 + omp_destroy_lock_@OMP_1.0 4.2.1 + omp_destroy_lock_@OMP_3.0 4.4 + omp_destroy_nest_lock@OMP_1.0 4.2.1 + omp_destroy_nest_lock@OMP_3.0 4.4 + omp_destroy_nest_lock_@OMP_1.0 4.2.1 + omp_destroy_nest_lock_@OMP_3.0 4.4 + omp_get_active_level@OMP_3.0 4.4 + omp_get_active_level_@OMP_3.0 4.4 + omp_get_ancestor_thread_num@OMP_3.0 4.4 + omp_get_ancestor_thread_num_8_@OMP_3.0 4.4 + omp_get_ancestor_thread_num_@OMP_3.0 4.4 + omp_get_dynamic@OMP_1.0 4.2.1 + omp_get_dynamic_@OMP_1.0 4.2.1 + omp_get_level@OMP_3.0 4.4 + omp_get_level_@OMP_3.0 4.4 + omp_get_max_active_levels@OMP_3.0 4.4 + omp_get_max_active_levels_@OMP_3.0 4.4 + omp_get_max_threads@OMP_1.0 4.2.1 + omp_get_max_threads_@OMP_1.0 4.2.1 + omp_get_nested@OMP_1.0 4.2.1 + omp_get_nested_@OMP_1.0 4.2.1 + omp_get_num_procs@OMP_1.0 4.2.1 + omp_get_num_procs_@OMP_1.0 4.2.1 + omp_get_num_threads@OMP_1.0 4.2.1 + omp_get_num_threads_@OMP_1.0 4.2.1 + omp_get_schedule@OMP_3.0 4.4 + omp_get_schedule_8_@OMP_3.0 4.4 + omp_get_schedule_@OMP_3.0 4.4 + omp_get_team_size@OMP_3.0 4.4 + omp_get_team_size_8_@OMP_3.0 4.4 + omp_get_team_size_@OMP_3.0 4.4 + omp_get_thread_limit@OMP_3.0 4.4 + omp_get_thread_limit_@OMP_3.0 4.4 + omp_get_thread_num@OMP_1.0 4.2.1 + omp_get_thread_num_@OMP_1.0 4.2.1 + omp_get_wtick@OMP_2.0 4.2.1 + omp_get_wtick_@OMP_2.0 4.2.1 + omp_get_wtime@OMP_2.0 4.2.1 + omp_get_wtime_@OMP_2.0 4.2.1 + omp_in_final@OMP_3.1 4.7 + omp_in_final_@OMP_3.1 4.7 + omp_in_parallel@OMP_1.0 4.2.1 + omp_in_parallel_@OMP_1.0 4.2.1 + omp_init_lock@OMP_1.0 4.2.1 + omp_init_lock@OMP_3.0 4.4 + omp_init_lock_@OMP_1.0 4.2.1 + omp_init_lock_@OMP_3.0 4.4 + omp_init_nest_lock@OMP_1.0 4.2.1 + omp_init_nest_lock@OMP_3.0 4.4 + omp_init_nest_lock_@OMP_1.0 4.2.1 + omp_init_nest_lock_@OMP_3.0 4.4 + omp_set_dynamic@OMP_1.0 4.2.1 + omp_set_dynamic_8_@OMP_1.0 4.2.1 + omp_set_dynamic_@OMP_1.0 4.2.1 + omp_set_lock@OMP_1.0 4.2.1 + omp_set_lock@OMP_3.0 4.4 + omp_set_lock_@OMP_1.0 4.2.1 + omp_set_lock_@OMP_3.0 4.4 + omp_set_max_active_levels@OMP_3.0 4.4 + omp_set_max_active_levels_8_@OMP_3.0 4.4 + omp_set_max_active_levels_@OMP_3.0 4.4 + omp_set_nest_lock@OMP_1.0 4.2.1 + omp_set_nest_lock@OMP_3.0 4.4 + omp_set_nest_lock_@OMP_1.0 4.2.1 + omp_set_nest_lock_@OMP_3.0 4.4 + omp_set_nested@OMP_1.0 4.2.1 + omp_set_nested_8_@OMP_1.0 4.2.1 + omp_set_nested_@OMP_1.0 4.2.1 + omp_set_num_threads@OMP_1.0 4.2.1 + omp_set_num_threads_8_@OMP_1.0 4.2.1 + omp_set_num_threads_@OMP_1.0 4.2.1 + omp_set_schedule@OMP_3.0 4.4 + omp_set_schedule_8_@OMP_3.0 4.4 + omp_set_schedule_@OMP_3.0 4.4 + omp_test_lock@OMP_1.0 4.2.1 + omp_test_lock@OMP_3.0 4.4 + omp_test_lock_@OMP_1.0 4.2.1 + omp_test_lock_@OMP_3.0 4.4 + omp_test_nest_lock@OMP_1.0 4.2.1 + omp_test_nest_lock@OMP_3.0 4.4 + omp_test_nest_lock_@OMP_1.0 4.2.1 + omp_test_nest_lock_@OMP_3.0 4.4 + omp_unset_lock@OMP_1.0 4.2.1 + omp_unset_lock@OMP_3.0 4.4 + omp_unset_lock_@OMP_1.0 4.2.1 + omp_unset_lock_@OMP_3.0 4.4 + omp_unset_nest_lock@OMP_1.0 4.2.1 + omp_unset_nest_lock@OMP_3.0 4.4 + omp_unset_nest_lock_@OMP_1.0 4.2.1 + omp_unset_nest_lock_@OMP_3.0 4.4 --- gcc-4.8-4.8.2.orig/debian/libhfgcc1.symbols.armel +++ gcc-4.8-4.8.2/debian/libhfgcc1.symbols.armel @@ -0,0 +1,1103 @@ +libgcc_s.so.1 libhfgcc1 #MINVER# +(ignore-blacklist)#include "libgcc1.symbols.aeabi" + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_3.5@GCC_3.5 1:4.3.0 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.1.1 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_4.3.0 1:4.3.0 + _Unwind_Complete@GCC_3.5 1:4.3.0 + _Unwind_DeleteException@GCC_3.0 1:4.3.0 + _Unwind_ForcedUnwind@GCC_3.0 1:4.3.0 + _Unwind_GetCFA@GCC_3.3 1:4.3.0 + _Unwind_GetDataRelBase@GCC_3.0 1:4.3.0 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.3.0 + _Unwind_GetRegionStart@GCC_3.0 1:4.3.0 + _Unwind_GetTextRelBase@GCC_3.0 1:4.3.0 + _Unwind_RaiseException@GCC_3.0 1:4.3.0 + _Unwind_Resume@GCC_3.0 1:4.3.0 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.3.0 + _Unwind_VRS_Get@GCC_3.5 1:4.3.0 + _Unwind_VRS_Pop@GCC_3.5 1:4.3.0 + _Unwind_VRS_Set@GCC_3.5 1:4.3.0 + __absvdi2@GCC_3.0 1:4.3.0 + __absvsi2@GCC_3.0 1:4.3.0 + __adddf3@GCC_3.0 1:4.3.0 + __addsf3@GCC_3.0 1:4.3.0 + __addvdi3@GCC_3.0 1:4.3.0 + __addvsi3@GCC_3.0 1:4.3.0 + __ashldi3@GCC_3.0 1:4.3.0 + __ashrdi3@GCC_3.0 1:4.3.0 + __bswapdi2@GCC_4.3.0 1:4.3.0 + __bswapsi2@GCC_4.3.0 1:4.3.0 + __clear_cache@GCC_3.0 1:4.3.0 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbsi2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.3.0 + __clzsi2@GCC_3.4 1:4.3.0 + __cmpdi2@GCC_3.0 1:4.3.0 + __ctzdi2@GCC_3.4 1:4.3.0 + __ctzsi2@GCC_3.4 1:4.3.0 + __divdc3@GCC_4.0.0 1:4.3.0 + __divdf3@GCC_3.0 1:4.3.0 + __divdi3@GLIBC_2.0 1:4.3.0 + __divsc3@GCC_4.0.0 1:4.3.0 + __divsf3@GCC_3.0 1:4.3.0 + __divsi3@GCC_3.0 1:4.3.0 + __emutls_get_address@GCC_4.3.0 1:4.3.0 + __emutls_register_common@GCC_4.3.0 1:4.3.0 + __enable_execute_stack@GCC_3.4.2 1:4.3.0 + __eqdf2@GCC_3.0 1:4.3.0 + __eqsf2@GCC_3.0 1:4.3.0 + __extendsfdf2@GCC_3.0 1:4.3.0 + __ffsdi2@GCC_3.0 1:4.3.0 + __ffssi2@GCC_4.3.0 1:4.3.0 + __fixdfdi@GCC_3.0 1:4.3.0 + __fixdfsi@GCC_3.0 1:4.3.0 + __fixsfdi@GCC_3.0 1:4.3.0 + __fixsfsi@GCC_3.0 1:4.3.0 + __fixunsdfdi@GCC_3.0 1:4.3.0 + __fixunsdfsi@GCC_3.0 1:4.3.0 + __fixunssfdi@GCC_3.0 1:4.3.0 + __fixunssfsi@GCC_3.0 1:4.3.0 + __floatdidf@GCC_3.0 1:4.3.0 + __floatdisf@GCC_3.0 1:4.3.0 + __floatsidf@GCC_3.0 1:4.3.0 + __floatsisf@GCC_3.0 1:4.3.0 + __floatundidf@GCC_4.2.0 1:4.3.0 + __floatundisf@GCC_4.2.0 1:4.3.0 + __floatunsidf@GCC_4.2.0 1:4.3.0 + __floatunsisf@GCC_4.2.0 1:4.3.0 + __gcc_personality_v0@GCC_3.3.1 1:4.3.0 + __gedf2@GCC_3.0 1:4.3.0 + __gesf2@GCC_3.0 1:4.3.0 + __gnu_addda3@GCC_4.3.0 1:4.3.0 + __gnu_adddq3@GCC_4.3.0 1:4.3.0 + __gnu_addha3@GCC_4.3.0 1:4.3.0 + __gnu_addhq3@GCC_4.3.0 1:4.3.0 + __gnu_addqq3@GCC_4.3.0 1:4.3.0 + __gnu_addsa3@GCC_4.3.0 1:4.3.0 + __gnu_addsq3@GCC_4.3.0 1:4.3.0 + __gnu_adduda3@GCC_4.3.0 1:4.3.0 + __gnu_addudq3@GCC_4.3.0 1:4.3.0 + __gnu_adduha3@GCC_4.3.0 1:4.3.0 + __gnu_adduhq3@GCC_4.3.0 1:4.3.0 + __gnu_adduqq3@GCC_4.3.0 1:4.3.0 + __gnu_addusa3@GCC_4.3.0 1:4.3.0 + __gnu_addusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluda3@GCC_4.3.0 1:4.3.0 + __gnu_ashludq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluha3@GCC_4.3.0 1:4.3.0 + __gnu_ashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_ashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrda3@GCC_4.3.0 1:4.3.0 + __gnu_ashrdq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrha3@GCC_4.3.0 1:4.3.0 + __gnu_ashrhq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrqq3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsa3@GCC_4.3.0 1:4.3.0 + __gnu_ashrsq3@GCC_4.3.0 1:4.3.0 + __gnu_cmpda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpdq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpha2@GCC_4.3.0 1:4.3.0 + __gnu_cmphq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpsq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuda2@GCC_4.3.0 1:4.3.0 + __gnu_cmpudq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuha2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuhq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpuqq2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusa2@GCC_4.3.0 1:4.3.0 + __gnu_cmpusq2@GCC_4.3.0 1:4.3.0 + __gnu_divda3@GCC_4.3.0 1:4.3.0 + __gnu_divdq3@GCC_4.3.0 1:4.3.0 + __gnu_divha3@GCC_4.3.0 1:4.3.0 + __gnu_divhq3@GCC_4.3.0 1:4.3.0 + __gnu_divqq3@GCC_4.3.0 1:4.3.0 + __gnu_divsa3@GCC_4.3.0 1:4.3.0 + __gnu_divsq3@GCC_4.3.0 1:4.3.0 + __gnu_fractdadf@GCC_4.3.0 1:4.3.0 + __gnu_fractdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractdadq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractdahq@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_fractdasf@GCC_4.3.0 1:4.3.0 + __gnu_fractdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractdasq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauda@GCC_4.3.0 1:4.3.0 + __gnu_fractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauha@GCC_4.3.0 1:4.3.0 + __gnu_fractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdausa@GCC_4.3.0 1:4.3.0 + __gnu_fractdausq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdida@GCC_4.3.0 1:4.3.0 + __gnu_fractdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqha@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractdquda@GCC_4.3.0 1:4.3.0 + __gnu_fractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquha@GCC_4.3.0 1:4.3.0 + __gnu_fractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthada2@GCC_4.3.0 1:4.3.0 + __gnu_fracthadf@GCC_4.3.0 1:4.3.0 + __gnu_fracthadi@GCC_4.3.0 1:4.3.0 + __gnu_fracthadq@GCC_4.3.0 1:4.3.0 + __gnu_fracthahi@GCC_4.3.0 1:4.3.0 + __gnu_fracthahq@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_fracthasf@GCC_4.3.0 1:4.3.0 + __gnu_fracthasi@GCC_4.3.0 1:4.3.0 + __gnu_fracthasq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauda@GCC_4.3.0 1:4.3.0 + __gnu_fracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauha@GCC_4.3.0 1:4.3.0 + __gnu_fracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthausa@GCC_4.3.0 1:4.3.0 + __gnu_fracthausq@GCC_4.3.0 1:4.3.0 + __gnu_fracthida@GCC_4.3.0 1:4.3.0 + __gnu_fracthidq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiha@GCC_4.3.0 1:4.3.0 + __gnu_fracthihq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthisa@GCC_4.3.0 1:4.3.0 + __gnu_fracthisq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_fracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqha@GCC_4.3.0 1:4.3.0 + __gnu_fracthqhi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsf@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsi@GCC_4.3.0 1:4.3.0 + __gnu_fracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fracthquda@GCC_4.3.0 1:4.3.0 + __gnu_fracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquha@GCC_4.3.0 1:4.3.0 + __gnu_fracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_fracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_fracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqida@GCC_4.3.0 1:4.3.0 + __gnu_fractqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_fractqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsada2@GCC_4.3.0 1:4.3.0 + __gnu_fractsadf@GCC_4.3.0 1:4.3.0 + __gnu_fractsadi@GCC_4.3.0 1:4.3.0 + __gnu_fractsadq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_fractsahi@GCC_4.3.0 1:4.3.0 + __gnu_fractsahq@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsasf@GCC_4.3.0 1:4.3.0 + __gnu_fractsasi@GCC_4.3.0 1:4.3.0 + __gnu_fractsasq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauda@GCC_4.3.0 1:4.3.0 + __gnu_fractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauha@GCC_4.3.0 1:4.3.0 + __gnu_fractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsausa@GCC_4.3.0 1:4.3.0 + __gnu_fractsausq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsida@GCC_4.3.0 1:4.3.0 + __gnu_fractsidq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiha@GCC_4.3.0 1:4.3.0 + __gnu_fractsihq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsisa@GCC_4.3.0 1:4.3.0 + __gnu_fractsisq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqha@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractsqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractsquda@GCC_4.3.0 1:4.3.0 + __gnu_fractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquha@GCC_4.3.0 1:4.3.0 + __gnu_fractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_fractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_fractudada@GCC_4.3.0 1:4.3.0 + __gnu_fractudadf@GCC_4.3.0 1:4.3.0 + __gnu_fractudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractudadq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaha@GCC_4.3.0 1:4.3.0 + __gnu_fractudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractudahq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudasa@GCC_4.3.0 1:4.3.0 + __gnu_fractudasf@GCC_4.3.0 1:4.3.0 + __gnu_fractudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractudasq@GCC_4.3.0 1:4.3.0 + __gnu_fractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractudausq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqda@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqha@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractudquda@GCC_4.3.0 1:4.3.0 + __gnu_fractudquha@GCC_4.3.0 1:4.3.0 + __gnu_fractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhada@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsdqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshida@GCC_4.3.0 1:4.3.0 + __gnu_fractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunshqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssida@GCC_4.3.0 1:4.3.0 + __gnu_fractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_fractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunssqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsudqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuhqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractunsusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_fractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_fractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusada@GCC_4.3.0 1:4.3.0 + __gnu_fractusadf@GCC_4.3.0 1:4.3.0 + __gnu_fractusadi@GCC_4.3.0 1:4.3.0 + __gnu_fractusadq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaha@GCC_4.3.0 1:4.3.0 + __gnu_fractusahi@GCC_4.3.0 1:4.3.0 + __gnu_fractusahq@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusasa@GCC_4.3.0 1:4.3.0 + __gnu_fractusasf@GCC_4.3.0 1:4.3.0 + __gnu_fractusasi@GCC_4.3.0 1:4.3.0 + __gnu_fractusasq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_fractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_fractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusausq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqha@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsf@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsi@GCC_4.3.0 1:4.3.0 + __gnu_fractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_fractusquda@GCC_4.3.0 1:4.3.0 + __gnu_fractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquha@GCC_4.3.0 1:4.3.0 + __gnu_fractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_fractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_lshruda3@GCC_4.3.0 1:4.3.0 + __gnu_lshrudq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruha3@GCC_4.3.0 1:4.3.0 + __gnu_lshruhq3@GCC_4.3.0 1:4.3.0 + __gnu_lshruqq3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusa3@GCC_4.3.0 1:4.3.0 + __gnu_lshrusq3@GCC_4.3.0 1:4.3.0 + __gnu_mulda3@GCC_4.3.0 1:4.3.0 + __gnu_muldq3@GCC_4.3.0 1:4.3.0 + __gnu_mulha3@GCC_4.3.0 1:4.3.0 + __gnu_mulhq3@GCC_4.3.0 1:4.3.0 + __gnu_mulqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulsa3@GCC_4.3.0 1:4.3.0 + __gnu_mulsq3@GCC_4.3.0 1:4.3.0 + __gnu_muluda3@GCC_4.3.0 1:4.3.0 + __gnu_muludq3@GCC_4.3.0 1:4.3.0 + __gnu_muluha3@GCC_4.3.0 1:4.3.0 + __gnu_muluhq3@GCC_4.3.0 1:4.3.0 + __gnu_muluqq3@GCC_4.3.0 1:4.3.0 + __gnu_mulusa3@GCC_4.3.0 1:4.3.0 + __gnu_mulusq3@GCC_4.3.0 1:4.3.0 + __gnu_negda2@GCC_4.3.0 1:4.3.0 + __gnu_negdq2@GCC_4.3.0 1:4.3.0 + __gnu_negha2@GCC_4.3.0 1:4.3.0 + __gnu_neghq2@GCC_4.3.0 1:4.3.0 + __gnu_negqq2@GCC_4.3.0 1:4.3.0 + __gnu_negsa2@GCC_4.3.0 1:4.3.0 + __gnu_negsq2@GCC_4.3.0 1:4.3.0 + __gnu_neguda2@GCC_4.3.0 1:4.3.0 + __gnu_negudq2@GCC_4.3.0 1:4.3.0 + __gnu_neguha2@GCC_4.3.0 1:4.3.0 + __gnu_neguhq2@GCC_4.3.0 1:4.3.0 + __gnu_neguqq2@GCC_4.3.0 1:4.3.0 + __gnu_negusa2@GCC_4.3.0 1:4.3.0 + __gnu_negusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractdqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthada2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthadq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthahq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasa2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthasq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthausq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthida@GCC_4.3.0 1:4.3.0 + __gnu_satfracthidq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthihq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthisq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquda@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquha@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfracthqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqsq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractqqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsada2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsfusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsida@GCC_4.3.0 1:4.3.0 + __gnu_satfractsidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqdq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsquqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractsqusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudada@GCC_4.3.0 1:4.3.0 + __gnu_satfractudadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractudqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhada@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausa2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuhqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsdiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunshiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunsqiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssida@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssidq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssihq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssisq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuda@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuha@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiuqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractunssiusq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusa@GCC_4.3.0 1:4.3.0 + __gnu_satfractuqqusq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusada@GCC_4.3.0 1:4.3.0 + __gnu_satfractusadq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusahq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusasq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauda2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusaudq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauha2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusauqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusausq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqdq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqhq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqqq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsa@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqsq@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquda@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqudq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquha@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquhq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusquqq2@GCC_4.3.0 1:4.3.0 + __gnu_satfractusqusa@GCC_4.3.0 1:4.3.0 + __gnu_ssaddda3@GCC_4.3.0 1:4.3.0 + __gnu_ssadddq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddha3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssaddsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlda3@GCC_4.3.0 1:4.3.0 + __gnu_ssashldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlha3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssashlsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivda3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivdq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivha3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssdivsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulda3@GCC_4.3.0 1:4.3.0 + __gnu_ssmuldq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulha3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulhq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulqq3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsa3@GCC_4.3.0 1:4.3.0 + __gnu_ssmulsq3@GCC_4.3.0 1:4.3.0 + __gnu_ssnegda2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegdq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegha2@GCC_4.3.0 1:4.3.0 + __gnu_ssneghq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegqq2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsa2@GCC_4.3.0 1:4.3.0 + __gnu_ssnegsq2@GCC_4.3.0 1:4.3.0 + __gnu_sssubda3@GCC_4.3.0 1:4.3.0 + __gnu_sssubdq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubha3@GCC_4.3.0 1:4.3.0 + __gnu_sssubhq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubqq3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsa3@GCC_4.3.0 1:4.3.0 + __gnu_sssubsq3@GCC_4.3.0 1:4.3.0 + __gnu_subda3@GCC_4.3.0 1:4.3.0 + __gnu_subdq3@GCC_4.3.0 1:4.3.0 + __gnu_subha3@GCC_4.3.0 1:4.3.0 + __gnu_subhq3@GCC_4.3.0 1:4.3.0 + __gnu_subqq3@GCC_4.3.0 1:4.3.0 + __gnu_subsa3@GCC_4.3.0 1:4.3.0 + __gnu_subsq3@GCC_4.3.0 1:4.3.0 + __gnu_subuda3@GCC_4.3.0 1:4.3.0 + __gnu_subudq3@GCC_4.3.0 1:4.3.0 + __gnu_subuha3@GCC_4.3.0 1:4.3.0 + __gnu_subuhq3@GCC_4.3.0 1:4.3.0 + __gnu_subuqq3@GCC_4.3.0 1:4.3.0 + __gnu_subusa3@GCC_4.3.0 1:4.3.0 + __gnu_subusq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuda3@GCC_4.3.0 1:4.3.0 + __gnu_udivudq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuha3@GCC_4.3.0 1:4.3.0 + __gnu_udivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_udivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_udivusa3@GCC_4.3.0 1:4.3.0 + __gnu_udivusq3@GCC_4.3.0 1:4.3.0 + __gnu_unwind_frame@GCC_3.5 1:4.3.0 + __gnu_usadduda3@GCC_4.3.0 1:4.3.0 + __gnu_usaddudq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduha3@GCC_4.3.0 1:4.3.0 + __gnu_usadduhq3@GCC_4.3.0 1:4.3.0 + __gnu_usadduqq3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusa3@GCC_4.3.0 1:4.3.0 + __gnu_usaddusq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluda3@GCC_4.3.0 1:4.3.0 + __gnu_usashludq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluha3@GCC_4.3.0 1:4.3.0 + __gnu_usashluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usashluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusa3@GCC_4.3.0 1:4.3.0 + __gnu_usashlusq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuda3@GCC_4.3.0 1:4.3.0 + __gnu_usdivudq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuha3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuhq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivuqq3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusa3@GCC_4.3.0 1:4.3.0 + __gnu_usdivusq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluda3@GCC_4.3.0 1:4.3.0 + __gnu_usmuludq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluha3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluhq3@GCC_4.3.0 1:4.3.0 + __gnu_usmuluqq3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusa3@GCC_4.3.0 1:4.3.0 + __gnu_usmulusq3@GCC_4.3.0 1:4.3.0 + __gnu_usneguda2@GCC_4.3.0 1:4.3.0 + __gnu_usnegudq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguha2@GCC_4.3.0 1:4.3.0 + __gnu_usneguhq2@GCC_4.3.0 1:4.3.0 + __gnu_usneguqq2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusa2@GCC_4.3.0 1:4.3.0 + __gnu_usnegusq2@GCC_4.3.0 1:4.3.0 + __gnu_ussubuda3@GCC_4.3.0 1:4.3.0 + __gnu_ussubudq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuha3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuhq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubuqq3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusa3@GCC_4.3.0 1:4.3.0 + __gnu_ussubusq3@GCC_4.3.0 1:4.3.0 + __gtdf2@GCC_3.0 1:4.3.0 + __gtsf2@GCC_3.0 1:4.3.0 + __ledf2@GCC_3.0 1:4.3.0 + __lesf2@GCC_3.0 1:4.3.0 + __lshrdi3@GCC_3.0 1:4.3.0 + __ltdf2@GCC_3.0 1:4.3.0 + __ltsf2@GCC_3.0 1:4.3.0 + __moddi3@GLIBC_2.0 1:4.3.0 + __modsi3@GCC_3.0 1:4.3.0 + __muldc3@GCC_4.0.0 1:4.3.0 + __muldf3@GCC_3.0 1:4.3.0 + __muldi3@GCC_3.0 1:4.3.0 + __mulsc3@GCC_4.0.0 1:4.3.0 + __mulsf3@GCC_3.0 1:4.3.0 + __mulvdi3@GCC_3.0 1:4.3.0 + __mulvsi3@GCC_3.0 1:4.3.0 + __nedf2@GCC_3.0 1:4.3.0 + __negdf2@GCC_3.0 1:4.3.0 + __negdi2@GCC_3.0 1:4.3.0 + __negsf2@GCC_3.0 1:4.3.0 + __negvdi2@GCC_3.0 1:4.3.0 + __negvsi2@GCC_3.0 1:4.3.0 + __nesf2@GCC_3.0 1:4.3.0 + __paritydi2@GCC_3.4 1:4.3.0 + __paritysi2@GCC_3.4 1:4.3.0 + __popcountdi2@GCC_3.4 1:4.3.0 + __popcountsi2@GCC_3.4 1:4.3.0 + __powidf2@GCC_4.0.0 1:4.3.0 + __powisf2@GCC_4.0.0 1:4.3.0 + __subdf3@GCC_3.0 1:4.3.0 + __subsf3@GCC_3.0 1:4.3.0 + __subvdi3@GCC_3.0 1:4.3.0 + __subvsi3@GCC_3.0 1:4.3.0 + __truncdfsf2@GCC_3.0 1:4.3.0 + __ucmpdi2@GCC_3.0 1:4.3.0 + __udivdi3@GLIBC_2.0 1:4.3.0 + __udivmoddi4@GCC_3.0 1:4.3.0 + __udivsi3@GCC_3.0 1:4.3.0 + __umoddi3@GLIBC_2.0 1:4.3.0 + __umodsi3@GCC_3.0 1:4.3.0 + __unorddf2@GCC_3.3.4 1:4.3.0 + __unordsf2@GCC_3.3.4 1:4.3.0 --- gcc-4.8-4.8.2.orig/debian/libitm1.symbols +++ gcc-4.8-4.8.2/debian/libitm1.symbols @@ -0,0 +1,5 @@ +libitm.so.1 libitm1 #MINVER# +#include "libitm1.symbols.common" +(arch=amd64 i386 x32)#include "libitm1.symbols.x86" +(arch=!alpha !amd64 !ia64 !ppc64 !ppc64el !s390x !sparc64 !kfreebsd-amd64)#include "libitm1.symbols.32bit" +(arch=alpha amd64 ia64 ppc64 ppc64el s390x sparc64 kfreebsd-amd64)#include "libitm1.symbols.64bit" --- gcc-4.8-4.8.2.orig/debian/libitm1.symbols.32bit +++ gcc-4.8-4.8.2/debian/libitm1.symbols.32bit @@ -0,0 +1,4 @@ + _ZGTtnaj@LIBITM_1.0 4.7 + _ZGTtnajRKSt9nothrow_t@LIBITM_1.0 4.7 + _ZGTtnwj@LIBITM_1.0 4.7 + _ZGTtnwjRKSt9nothrow_t@LIBITM_1.0 4.7 --- gcc-4.8-4.8.2.orig/debian/libitm1.symbols.64bit +++ gcc-4.8-4.8.2/debian/libitm1.symbols.64bit @@ -0,0 +1,4 @@ + _ZGTtnam@LIBITM_1.0 4.7 + _ZGTtnamRKSt9nothrow_t@LIBITM_1.0 4.7 + _ZGTtnwm@LIBITM_1.0 4.7 + _ZGTtnwmRKSt9nothrow_t@LIBITM_1.0 4.7 --- gcc-4.8-4.8.2.orig/debian/libitm1.symbols.common +++ gcc-4.8-4.8.2/debian/libitm1.symbols.common @@ -0,0 +1,143 @@ + LIBITM_1.0@LIBITM_1.0 4.7 + _ITM_LB@LIBITM_1.0 4.7 + _ITM_LCD@LIBITM_1.0 4.7 + _ITM_LCE@LIBITM_1.0 4.7 + _ITM_LCF@LIBITM_1.0 4.7 + _ITM_LD@LIBITM_1.0 4.7 + _ITM_LE@LIBITM_1.0 4.7 + _ITM_LF@LIBITM_1.0 4.7 + _ITM_LU1@LIBITM_1.0 4.7 + _ITM_LU2@LIBITM_1.0 4.7 + _ITM_LU4@LIBITM_1.0 4.7 + _ITM_LU8@LIBITM_1.0 4.7 + _ITM_RCD@LIBITM_1.0 4.7 + _ITM_RCE@LIBITM_1.0 4.7 + _ITM_RCF@LIBITM_1.0 4.7 + _ITM_RD@LIBITM_1.0 4.7 + _ITM_RE@LIBITM_1.0 4.7 + _ITM_RF@LIBITM_1.0 4.7 + _ITM_RU1@LIBITM_1.0 4.7 + _ITM_RU2@LIBITM_1.0 4.7 + _ITM_RU4@LIBITM_1.0 4.7 + _ITM_RU8@LIBITM_1.0 4.7 + _ITM_RaRCD@LIBITM_1.0 4.7 + _ITM_RaRCE@LIBITM_1.0 4.7 + _ITM_RaRCF@LIBITM_1.0 4.7 + _ITM_RaRD@LIBITM_1.0 4.7 + _ITM_RaRE@LIBITM_1.0 4.7 + _ITM_RaRF@LIBITM_1.0 4.7 + _ITM_RaRU1@LIBITM_1.0 4.7 + _ITM_RaRU2@LIBITM_1.0 4.7 + _ITM_RaRU4@LIBITM_1.0 4.7 + _ITM_RaRU8@LIBITM_1.0 4.7 + _ITM_RaWCD@LIBITM_1.0 4.7 + _ITM_RaWCE@LIBITM_1.0 4.7 + _ITM_RaWCF@LIBITM_1.0 4.7 + _ITM_RaWD@LIBITM_1.0 4.7 + _ITM_RaWE@LIBITM_1.0 4.7 + _ITM_RaWF@LIBITM_1.0 4.7 + _ITM_RaWU1@LIBITM_1.0 4.7 + _ITM_RaWU2@LIBITM_1.0 4.7 + _ITM_RaWU4@LIBITM_1.0 4.7 + _ITM_RaWU8@LIBITM_1.0 4.7 + _ITM_RfWCD@LIBITM_1.0 4.7 + _ITM_RfWCE@LIBITM_1.0 4.7 + _ITM_RfWCF@LIBITM_1.0 4.7 + _ITM_RfWD@LIBITM_1.0 4.7 + _ITM_RfWE@LIBITM_1.0 4.7 + _ITM_RfWF@LIBITM_1.0 4.7 + _ITM_RfWU1@LIBITM_1.0 4.7 + _ITM_RfWU2@LIBITM_1.0 4.7 + _ITM_RfWU4@LIBITM_1.0 4.7 + _ITM_RfWU8@LIBITM_1.0 4.7 + _ITM_WCD@LIBITM_1.0 4.7 + _ITM_WCE@LIBITM_1.0 4.7 + _ITM_WCF@LIBITM_1.0 4.7 + _ITM_WD@LIBITM_1.0 4.7 + _ITM_WE@LIBITM_1.0 4.7 + _ITM_WF@LIBITM_1.0 4.7 + _ITM_WU1@LIBITM_1.0 4.7 + _ITM_WU2@LIBITM_1.0 4.7 + _ITM_WU4@LIBITM_1.0 4.7 + _ITM_WU8@LIBITM_1.0 4.7 + _ITM_WaRCD@LIBITM_1.0 4.7 + _ITM_WaRCE@LIBITM_1.0 4.7 + _ITM_WaRCF@LIBITM_1.0 4.7 + _ITM_WaRD@LIBITM_1.0 4.7 + _ITM_WaRE@LIBITM_1.0 4.7 + _ITM_WaRF@LIBITM_1.0 4.7 + _ITM_WaRU1@LIBITM_1.0 4.7 + _ITM_WaRU2@LIBITM_1.0 4.7 + _ITM_WaRU4@LIBITM_1.0 4.7 + _ITM_WaRU8@LIBITM_1.0 4.7 + _ITM_WaWCD@LIBITM_1.0 4.7 + _ITM_WaWCE@LIBITM_1.0 4.7 + _ITM_WaWCF@LIBITM_1.0 4.7 + _ITM_WaWD@LIBITM_1.0 4.7 + _ITM_WaWE@LIBITM_1.0 4.7 + _ITM_WaWF@LIBITM_1.0 4.7 + _ITM_WaWU1@LIBITM_1.0 4.7 + _ITM_WaWU2@LIBITM_1.0 4.7 + _ITM_WaWU4@LIBITM_1.0 4.7 + _ITM_WaWU8@LIBITM_1.0 4.7 + _ITM_abortTransaction@LIBITM_1.0 4.7 + _ITM_addUserCommitAction@LIBITM_1.0 4.7 + _ITM_addUserUndoAction@LIBITM_1.0 4.7 + _ITM_beginTransaction@LIBITM_1.0 4.7 + _ITM_calloc@LIBITM_1.0 4.7 + _ITM_changeTransactionMode@LIBITM_1.0 4.7 + _ITM_commitTransaction@LIBITM_1.0 4.7 + _ITM_commitTransactionEH@LIBITM_1.0 4.7 + _ITM_cxa_allocate_exception@LIBITM_1.0 4.7 + _ITM_cxa_begin_catch@LIBITM_1.0 4.7 + _ITM_cxa_end_catch@LIBITM_1.0 4.7 + _ITM_cxa_throw@LIBITM_1.0 4.7 + _ITM_deregisterTMCloneTable@LIBITM_1.0 4.7 + _ITM_dropReferences@LIBITM_1.0 4.7 + _ITM_error@LIBITM_1.0 4.7 + _ITM_free@LIBITM_1.0 4.7 + _ITM_getTMCloneOrIrrevocable@LIBITM_1.0 4.7 + _ITM_getTMCloneSafe@LIBITM_1.0 4.7 + _ITM_getTransactionId@LIBITM_1.0 4.7 + _ITM_inTransaction@LIBITM_1.0 4.7 + _ITM_libraryVersion@LIBITM_1.0 4.7 + _ITM_malloc@LIBITM_1.0 4.7 + _ITM_memcpyRnWt@LIBITM_1.0 4.7 + _ITM_memcpyRnWtaR@LIBITM_1.0 4.7 + _ITM_memcpyRnWtaW@LIBITM_1.0 4.7 + _ITM_memcpyRtWn@LIBITM_1.0 4.7 + _ITM_memcpyRtWt@LIBITM_1.0 4.7 + _ITM_memcpyRtWtaR@LIBITM_1.0 4.7 + _ITM_memcpyRtWtaW@LIBITM_1.0 4.7 + _ITM_memcpyRtaRWn@LIBITM_1.0 4.7 + _ITM_memcpyRtaRWt@LIBITM_1.0 4.7 + _ITM_memcpyRtaRWtaR@LIBITM_1.0 4.7 + _ITM_memcpyRtaRWtaW@LIBITM_1.0 4.7 + _ITM_memcpyRtaWWn@LIBITM_1.0 4.7 + _ITM_memcpyRtaWWt@LIBITM_1.0 4.7 + _ITM_memcpyRtaWWtaR@LIBITM_1.0 4.7 + _ITM_memcpyRtaWWtaW@LIBITM_1.0 4.7 + _ITM_memmoveRnWt@LIBITM_1.0 4.7 + _ITM_memmoveRnWtaR@LIBITM_1.0 4.7 + _ITM_memmoveRnWtaW@LIBITM_1.0 4.7 + _ITM_memmoveRtWn@LIBITM_1.0 4.7 + _ITM_memmoveRtWt@LIBITM_1.0 4.7 + _ITM_memmoveRtWtaR@LIBITM_1.0 4.7 + _ITM_memmoveRtWtaW@LIBITM_1.0 4.7 + _ITM_memmoveRtaRWn@LIBITM_1.0 4.7 + _ITM_memmoveRtaRWt@LIBITM_1.0 4.7 + _ITM_memmoveRtaRWtaR@LIBITM_1.0 4.7 + _ITM_memmoveRtaRWtaW@LIBITM_1.0 4.7 + _ITM_memmoveRtaWWn@LIBITM_1.0 4.7 + _ITM_memmoveRtaWWt@LIBITM_1.0 4.7 + _ITM_memmoveRtaWWtaR@LIBITM_1.0 4.7 + _ITM_memmoveRtaWWtaW@LIBITM_1.0 4.7 + _ITM_memsetW@LIBITM_1.0 4.7 + _ITM_memsetWaR@LIBITM_1.0 4.7 + _ITM_memsetWaW@LIBITM_1.0 4.7 + _ITM_registerTMCloneTable@LIBITM_1.0 4.7 + _ITM_versionCompatible@LIBITM_1.0 4.7 + _ZGTtdaPv@LIBITM_1.0 4.7 + _ZGTtdaPvRKSt9nothrow_t@LIBITM_1.0 4.7 + _ZGTtdlPv@LIBITM_1.0 4.7 + _ZGTtdlPvRKSt9nothrow_t@LIBITM_1.0 4.7 --- gcc-4.8-4.8.2.orig/debian/libitm1.symbols.x86 +++ gcc-4.8-4.8.2/debian/libitm1.symbols.x86 @@ -0,0 +1,24 @@ + _ITM_LM128@LIBITM_1.0 4.7 + _ITM_LM256@LIBITM_1.0 4.7 + _ITM_LM64@LIBITM_1.0 4.7 + _ITM_RM128@LIBITM_1.0 4.7 + _ITM_RM256@LIBITM_1.0 4.7 + _ITM_RM64@LIBITM_1.0 4.7 + _ITM_RaRM128@LIBITM_1.0 4.7 + _ITM_RaRM256@LIBITM_1.0 4.7 + _ITM_RaRM64@LIBITM_1.0 4.7 + _ITM_RaWM128@LIBITM_1.0 4.7 + _ITM_RaWM256@LIBITM_1.0 4.7 + _ITM_RaWM64@LIBITM_1.0 4.7 + _ITM_RfWM128@LIBITM_1.0 4.7 + _ITM_RfWM256@LIBITM_1.0 4.7 + _ITM_RfWM64@LIBITM_1.0 4.7 + _ITM_WM128@LIBITM_1.0 4.7 + _ITM_WM256@LIBITM_1.0 4.7 + _ITM_WM64@LIBITM_1.0 4.7 + _ITM_WaRM128@LIBITM_1.0 4.7 + _ITM_WaRM256@LIBITM_1.0 4.7 + _ITM_WaRM64@LIBITM_1.0 4.7 + _ITM_WaWM128@LIBITM_1.0 4.7 + _ITM_WaWM256@LIBITM_1.0 4.7 + _ITM_WaWM64@LIBITM_1.0 4.7 --- gcc-4.8-4.8.2.orig/debian/libn32gcc1.symbols.mips +++ gcc-4.8-4.8.2/debian/libn32gcc1.symbols.mips @@ -0,0 +1,1749 @@ +libgcc_s.so.1 libn32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.2.0 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4 + GCC_4.5.0@GCC_4.5.0 1:4.5 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __addta3@GCC_4.3.0 1:4.3 + __addtf3@GCC_3.0 1:4.1.1 + __addtq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __adduta3@GCC_4.3.0 1:4.3 + __addutq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashlta3@GCC_4.3.0 1:4.3 + __ashlti3@GCC_3.0 1:4.1.1 + __ashltq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashluta3@GCC_4.3.0 1:4.3 + __ashlutq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __ashrta3@GCC_4.3.0 1:4.3 + __ashrti3@GCC_3.0 1:4.1.1 + __ashrtq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpta2@GCC_4.3.0 1:4.3 + __cmpti2@GCC_3.0 1:4.1.1 + __cmptq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __cmputa2@GCC_4.3.0 1:4.3 + __cmputq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __divta3@GCC_4.3.0 1:4.3 + __divtc3@GCC_4.0.0 1:4.1.1 + __divtf3@GCC_3.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __divtq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __eqtf2@GCC_3.0 1:4.1.1 + __extenddftf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __extendsftf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfsi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfsi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdata2@GCC_4.3.0 1:4.3 + __fractdati@GCC_4.3.0 1:4.3 + __fractdatq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdauta@GCC_4.3.0 1:4.3 + __fractdautq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfta@GCC_4.3.0 1:4.3 + __fractdftq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdfuta@GCC_4.3.0 1:4.3 + __fractdfutq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdita@GCC_4.3.0 1:4.3 + __fractditq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdiuta@GCC_4.3.0 1:4.3 + __fractdiutq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdqta@GCC_4.3.0 1:4.3 + __fractdqti@GCC_4.3.0 1:4.3 + __fractdqtq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fractdquta@GCC_4.3.0 1:4.3 + __fractdqutq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthata2@GCC_4.3.0 1:4.3 + __fracthati@GCC_4.3.0 1:4.3 + __fracthatq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthauta@GCC_4.3.0 1:4.3 + __fracthautq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthita@GCC_4.3.0 1:4.3 + __fracthitq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthiuta@GCC_4.3.0 1:4.3 + __fracthiutq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthqta@GCC_4.3.0 1:4.3 + __fracthqti@GCC_4.3.0 1:4.3 + __fracthqtq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fracthquta@GCC_4.3.0 1:4.3 + __fracthqutq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqita@GCC_4.3.0 1:4.3 + __fractqitq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqiuta@GCC_4.3.0 1:4.3 + __fractqiutq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqqta@GCC_4.3.0 1:4.3 + __fractqqti@GCC_4.3.0 1:4.3 + __fractqqtq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractqquta@GCC_4.3.0 1:4.3 + __fractqqutq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsata2@GCC_4.3.0 1:4.3 + __fractsati@GCC_4.3.0 1:4.3 + __fractsatq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsauta@GCC_4.3.0 1:4.3 + __fractsautq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfta@GCC_4.3.0 1:4.3 + __fractsftq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsfuta@GCC_4.3.0 1:4.3 + __fractsfutq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsita@GCC_4.3.0 1:4.3 + __fractsitq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsiuta@GCC_4.3.0 1:4.3 + __fractsiutq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsqta@GCC_4.3.0 1:4.3 + __fractsqti@GCC_4.3.0 1:4.3 + __fractsqtq2@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractsquta@GCC_4.3.0 1:4.3 + __fractsqutq@GCC_4.3.0 1:4.3 + __fracttada2@GCC_4.3.0 1:4.3 + __fracttadf@GCC_4.3.0 1:4.3 + __fracttadi@GCC_4.3.0 1:4.3 + __fracttadq@GCC_4.3.0 1:4.3 + __fracttaha2@GCC_4.3.0 1:4.3 + __fracttahi@GCC_4.3.0 1:4.3 + __fracttahq@GCC_4.3.0 1:4.3 + __fracttaqi@GCC_4.3.0 1:4.3 + __fracttaqq@GCC_4.3.0 1:4.3 + __fracttasa2@GCC_4.3.0 1:4.3 + __fracttasf@GCC_4.3.0 1:4.3 + __fracttasi@GCC_4.3.0 1:4.3 + __fracttasq@GCC_4.3.0 1:4.3 + __fracttati@GCC_4.3.0 1:4.3 + __fracttatq@GCC_4.3.0 1:4.3 + __fracttauda@GCC_4.3.0 1:4.3 + __fracttaudq@GCC_4.3.0 1:4.3 + __fracttauha@GCC_4.3.0 1:4.3 + __fracttauhq@GCC_4.3.0 1:4.3 + __fracttauqq@GCC_4.3.0 1:4.3 + __fracttausa@GCC_4.3.0 1:4.3 + __fracttausq@GCC_4.3.0 1:4.3 + __fracttauta@GCC_4.3.0 1:4.3 + __fracttautq@GCC_4.3.0 1:4.3 + __fracttida@GCC_4.3.0 1:4.3 + __fracttidq@GCC_4.3.0 1:4.3 + __fracttiha@GCC_4.3.0 1:4.3 + __fracttihq@GCC_4.3.0 1:4.3 + __fracttiqq@GCC_4.3.0 1:4.3 + __fracttisa@GCC_4.3.0 1:4.3 + __fracttisq@GCC_4.3.0 1:4.3 + __fracttita@GCC_4.3.0 1:4.3 + __fracttitq@GCC_4.3.0 1:4.3 + __fracttiuda@GCC_4.3.0 1:4.3 + __fracttiudq@GCC_4.3.0 1:4.3 + __fracttiuha@GCC_4.3.0 1:4.3 + __fracttiuhq@GCC_4.3.0 1:4.3 + __fracttiuqq@GCC_4.3.0 1:4.3 + __fracttiusa@GCC_4.3.0 1:4.3 + __fracttiusq@GCC_4.3.0 1:4.3 + __fracttiuta@GCC_4.3.0 1:4.3 + __fracttiutq@GCC_4.3.0 1:4.3 + __fracttqda@GCC_4.3.0 1:4.3 + __fracttqdf@GCC_4.3.0 1:4.3 + __fracttqdi@GCC_4.3.0 1:4.3 + __fracttqdq2@GCC_4.3.0 1:4.3 + __fracttqha@GCC_4.3.0 1:4.3 + __fracttqhi@GCC_4.3.0 1:4.3 + __fracttqhq2@GCC_4.3.0 1:4.3 + __fracttqqi@GCC_4.3.0 1:4.3 + __fracttqqq2@GCC_4.3.0 1:4.3 + __fracttqsa@GCC_4.3.0 1:4.3 + __fracttqsf@GCC_4.3.0 1:4.3 + __fracttqsi@GCC_4.3.0 1:4.3 + __fracttqsq2@GCC_4.3.0 1:4.3 + __fracttqta@GCC_4.3.0 1:4.3 + __fracttqti@GCC_4.3.0 1:4.3 + __fracttquda@GCC_4.3.0 1:4.3 + __fracttqudq@GCC_4.3.0 1:4.3 + __fracttquha@GCC_4.3.0 1:4.3 + __fracttquhq@GCC_4.3.0 1:4.3 + __fracttquqq@GCC_4.3.0 1:4.3 + __fracttqusa@GCC_4.3.0 1:4.3 + __fracttqusq@GCC_4.3.0 1:4.3 + __fracttquta@GCC_4.3.0 1:4.3 + __fracttqutq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudata@GCC_4.3.0 1:4.3 + __fractudati@GCC_4.3.0 1:4.3 + __fractudatq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudauta2@GCC_4.3.0 1:4.3 + __fractudautq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudqta@GCC_4.3.0 1:4.3 + __fractudqti@GCC_4.3.0 1:4.3 + __fractudqtq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractudquta@GCC_4.3.0 1:4.3 + __fractudqutq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhata@GCC_4.3.0 1:4.3 + __fractuhati@GCC_4.3.0 1:4.3 + __fractuhatq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhauta2@GCC_4.3.0 1:4.3 + __fractuhautq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhqta@GCC_4.3.0 1:4.3 + __fractuhqti@GCC_4.3.0 1:4.3 + __fractuhqtq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractuhquta@GCC_4.3.0 1:4.3 + __fractuhqutq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdati@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdita@GCC_4.3.0 1:4.3 + __fractunsditq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdiuta@GCC_4.3.0 1:4.3 + __fractunsdiutq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunsdqti@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshati@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshita@GCC_4.3.0 1:4.3 + __fractunshitq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshiuta@GCC_4.3.0 1:4.3 + __fractunshiutq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunshqti@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqita@GCC_4.3.0 1:4.3 + __fractunsqitq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqiuta@GCC_4.3.0 1:4.3 + __fractunsqiutq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunsqqti@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssati@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssita@GCC_4.3.0 1:4.3 + __fractunssitq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssiuta@GCC_4.3.0 1:4.3 + __fractunssiutq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunssqti@GCC_4.3.0 1:4.3 + __fractunstadi@GCC_4.3.0 1:4.3 + __fractunstahi@GCC_4.3.0 1:4.3 + __fractunstaqi@GCC_4.3.0 1:4.3 + __fractunstasi@GCC_4.3.0 1:4.3 + __fractunstati@GCC_4.3.0 1:4.3 + __fractunstida@GCC_4.3.0 1:4.3 + __fractunstidq@GCC_4.3.0 1:4.3 + __fractunstiha@GCC_4.3.0 1:4.3 + __fractunstihq@GCC_4.3.0 1:4.3 + __fractunstiqq@GCC_4.3.0 1:4.3 + __fractunstisa@GCC_4.3.0 1:4.3 + __fractunstisq@GCC_4.3.0 1:4.3 + __fractunstita@GCC_4.3.0 1:4.3 + __fractunstitq@GCC_4.3.0 1:4.3 + __fractunstiuda@GCC_4.3.0 1:4.3 + __fractunstiudq@GCC_4.3.0 1:4.3 + __fractunstiuha@GCC_4.3.0 1:4.3 + __fractunstiuhq@GCC_4.3.0 1:4.3 + __fractunstiuqq@GCC_4.3.0 1:4.3 + __fractunstiusa@GCC_4.3.0 1:4.3 + __fractunstiusq@GCC_4.3.0 1:4.3 + __fractunstiuta@GCC_4.3.0 1:4.3 + __fractunstiutq@GCC_4.3.0 1:4.3 + __fractunstqdi@GCC_4.3.0 1:4.3 + __fractunstqhi@GCC_4.3.0 1:4.3 + __fractunstqqi@GCC_4.3.0 1:4.3 + __fractunstqsi@GCC_4.3.0 1:4.3 + __fractunstqti@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudati@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsudqti@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhati@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuhqti@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsuqqti@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusati@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractunsusqti@GCC_4.3.0 1:4.3 + __fractunsutadi@GCC_4.3.0 1:4.3 + __fractunsutahi@GCC_4.3.0 1:4.3 + __fractunsutaqi@GCC_4.3.0 1:4.3 + __fractunsutasi@GCC_4.3.0 1:4.3 + __fractunsutati@GCC_4.3.0 1:4.3 + __fractunsutqdi@GCC_4.3.0 1:4.3 + __fractunsutqhi@GCC_4.3.0 1:4.3 + __fractunsutqqi@GCC_4.3.0 1:4.3 + __fractunsutqsi@GCC_4.3.0 1:4.3 + __fractunsutqti@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqqta@GCC_4.3.0 1:4.3 + __fractuqqti@GCC_4.3.0 1:4.3 + __fractuqqtq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractuqquta@GCC_4.3.0 1:4.3 + __fractuqqutq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusata@GCC_4.3.0 1:4.3 + __fractusati@GCC_4.3.0 1:4.3 + __fractusatq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusauta2@GCC_4.3.0 1:4.3 + __fractusautq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusqta@GCC_4.3.0 1:4.3 + __fractusqti@GCC_4.3.0 1:4.3 + __fractusqtq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __fractusquta@GCC_4.3.0 1:4.3 + __fractusqutq2@GCC_4.3.0 1:4.3 + __fractutada@GCC_4.3.0 1:4.3 + __fractutadf@GCC_4.3.0 1:4.3 + __fractutadi@GCC_4.3.0 1:4.3 + __fractutadq@GCC_4.3.0 1:4.3 + __fractutaha@GCC_4.3.0 1:4.3 + __fractutahi@GCC_4.3.0 1:4.3 + __fractutahq@GCC_4.3.0 1:4.3 + __fractutaqi@GCC_4.3.0 1:4.3 + __fractutaqq@GCC_4.3.0 1:4.3 + __fractutasa@GCC_4.3.0 1:4.3 + __fractutasf@GCC_4.3.0 1:4.3 + __fractutasi@GCC_4.3.0 1:4.3 + __fractutasq@GCC_4.3.0 1:4.3 + __fractutata@GCC_4.3.0 1:4.3 + __fractutati@GCC_4.3.0 1:4.3 + __fractutatq@GCC_4.3.0 1:4.3 + __fractutauda2@GCC_4.3.0 1:4.3 + __fractutaudq@GCC_4.3.0 1:4.3 + __fractutauha2@GCC_4.3.0 1:4.3 + __fractutauhq@GCC_4.3.0 1:4.3 + __fractutauqq@GCC_4.3.0 1:4.3 + __fractutausa2@GCC_4.3.0 1:4.3 + __fractutausq@GCC_4.3.0 1:4.3 + __fractutautq@GCC_4.3.0 1:4.3 + __fractutqda@GCC_4.3.0 1:4.3 + __fractutqdf@GCC_4.3.0 1:4.3 + __fractutqdi@GCC_4.3.0 1:4.3 + __fractutqdq@GCC_4.3.0 1:4.3 + __fractutqha@GCC_4.3.0 1:4.3 + __fractutqhi@GCC_4.3.0 1:4.3 + __fractutqhq@GCC_4.3.0 1:4.3 + __fractutqqi@GCC_4.3.0 1:4.3 + __fractutqqq@GCC_4.3.0 1:4.3 + __fractutqsa@GCC_4.3.0 1:4.3 + __fractutqsf@GCC_4.3.0 1:4.3 + __fractutqsi@GCC_4.3.0 1:4.3 + __fractutqsq@GCC_4.3.0 1:4.3 + __fractutqta@GCC_4.3.0 1:4.3 + __fractutqti@GCC_4.3.0 1:4.3 + __fractutqtq@GCC_4.3.0 1:4.3 + __fractutquda@GCC_4.3.0 1:4.3 + __fractutqudq2@GCC_4.3.0 1:4.3 + __fractutquha@GCC_4.3.0 1:4.3 + __fractutquhq2@GCC_4.3.0 1:4.3 + __fractutquqq2@GCC_4.3.0 1:4.3 + __fractutqusa@GCC_4.3.0 1:4.3 + __fractutqusq2@GCC_4.3.0 1:4.3 + __fractutquta@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __getf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __gttf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __letf2@GCC_3.0 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __lshruta3@GCC_4.3.0 1:4.3 + __lshrutq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __multa3@GCC_4.3.0 1:4.3 + __multc3@GCC_4.0.0 1:4.1.1 + __multf3@GCC_3.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __multq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __muluta3@GCC_4.3.0 1:4.3 + __mulutq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __negta2@GCC_4.3.0 1:4.3 + __negtf2@GCC_3.0 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negtq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __neguta2@GCC_4.3.0 1:4.3 + __negutq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __netf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdata2@GCC_4.3.0 1:4.3 + __satfractdatq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdauta@GCC_4.3.0 1:4.3 + __satfractdautq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfta@GCC_4.3.0 1:4.3 + __satfractdftq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdfuta@GCC_4.3.0 1:4.3 + __satfractdfutq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdita@GCC_4.3.0 1:4.3 + __satfractditq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdiuta@GCC_4.3.0 1:4.3 + __satfractdiutq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdqta@GCC_4.3.0 1:4.3 + __satfractdqtq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfractdquta@GCC_4.3.0 1:4.3 + __satfractdqutq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthata2@GCC_4.3.0 1:4.3 + __satfracthatq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthauta@GCC_4.3.0 1:4.3 + __satfracthautq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthita@GCC_4.3.0 1:4.3 + __satfracthitq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthiuta@GCC_4.3.0 1:4.3 + __satfracthiutq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthqta@GCC_4.3.0 1:4.3 + __satfracthqtq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfracthquta@GCC_4.3.0 1:4.3 + __satfracthqutq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqita@GCC_4.3.0 1:4.3 + __satfractqitq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqiuta@GCC_4.3.0 1:4.3 + __satfractqiutq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqqta@GCC_4.3.0 1:4.3 + __satfractqqtq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractqquta@GCC_4.3.0 1:4.3 + __satfractqqutq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsata2@GCC_4.3.0 1:4.3 + __satfractsatq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsauta@GCC_4.3.0 1:4.3 + __satfractsautq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfta@GCC_4.3.0 1:4.3 + __satfractsftq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsfuta@GCC_4.3.0 1:4.3 + __satfractsfutq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsita@GCC_4.3.0 1:4.3 + __satfractsitq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsiuta@GCC_4.3.0 1:4.3 + __satfractsiutq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsqta@GCC_4.3.0 1:4.3 + __satfractsqtq2@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractsquta@GCC_4.3.0 1:4.3 + __satfractsqutq@GCC_4.3.0 1:4.3 + __satfracttada2@GCC_4.3.0 1:4.3 + __satfracttadq@GCC_4.3.0 1:4.3 + __satfracttaha2@GCC_4.3.0 1:4.3 + __satfracttahq@GCC_4.3.0 1:4.3 + __satfracttaqq@GCC_4.3.0 1:4.3 + __satfracttasa2@GCC_4.3.0 1:4.3 + __satfracttasq@GCC_4.3.0 1:4.3 + __satfracttatq@GCC_4.3.0 1:4.3 + __satfracttauda@GCC_4.3.0 1:4.3 + __satfracttaudq@GCC_4.3.0 1:4.3 + __satfracttauha@GCC_4.3.0 1:4.3 + __satfracttauhq@GCC_4.3.0 1:4.3 + __satfracttauqq@GCC_4.3.0 1:4.3 + __satfracttausa@GCC_4.3.0 1:4.3 + __satfracttausq@GCC_4.3.0 1:4.3 + __satfracttauta@GCC_4.3.0 1:4.3 + __satfracttautq@GCC_4.3.0 1:4.3 + __satfracttida@GCC_4.3.0 1:4.3 + __satfracttidq@GCC_4.3.0 1:4.3 + __satfracttiha@GCC_4.3.0 1:4.3 + __satfracttihq@GCC_4.3.0 1:4.3 + __satfracttiqq@GCC_4.3.0 1:4.3 + __satfracttisa@GCC_4.3.0 1:4.3 + __satfracttisq@GCC_4.3.0 1:4.3 + __satfracttita@GCC_4.3.0 1:4.3 + __satfracttitq@GCC_4.3.0 1:4.3 + __satfracttiuda@GCC_4.3.0 1:4.3 + __satfracttiudq@GCC_4.3.0 1:4.3 + __satfracttiuha@GCC_4.3.0 1:4.3 + __satfracttiuhq@GCC_4.3.0 1:4.3 + __satfracttiuqq@GCC_4.3.0 1:4.3 + __satfracttiusa@GCC_4.3.0 1:4.3 + __satfracttiusq@GCC_4.3.0 1:4.3 + __satfracttiuta@GCC_4.3.0 1:4.3 + __satfracttiutq@GCC_4.3.0 1:4.3 + __satfracttqda@GCC_4.3.0 1:4.3 + __satfracttqdq2@GCC_4.3.0 1:4.3 + __satfracttqha@GCC_4.3.0 1:4.3 + __satfracttqhq2@GCC_4.3.0 1:4.3 + __satfracttqqq2@GCC_4.3.0 1:4.3 + __satfracttqsa@GCC_4.3.0 1:4.3 + __satfracttqsq2@GCC_4.3.0 1:4.3 + __satfracttqta@GCC_4.3.0 1:4.3 + __satfracttquda@GCC_4.3.0 1:4.3 + __satfracttqudq@GCC_4.3.0 1:4.3 + __satfracttquha@GCC_4.3.0 1:4.3 + __satfracttquhq@GCC_4.3.0 1:4.3 + __satfracttquqq@GCC_4.3.0 1:4.3 + __satfracttqusa@GCC_4.3.0 1:4.3 + __satfracttqusq@GCC_4.3.0 1:4.3 + __satfracttquta@GCC_4.3.0 1:4.3 + __satfracttqutq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudata@GCC_4.3.0 1:4.3 + __satfractudatq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudauta2@GCC_4.3.0 1:4.3 + __satfractudautq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudqta@GCC_4.3.0 1:4.3 + __satfractudqtq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractudquta@GCC_4.3.0 1:4.3 + __satfractudqutq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhata@GCC_4.3.0 1:4.3 + __satfractuhatq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhauta2@GCC_4.3.0 1:4.3 + __satfractuhautq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhqta@GCC_4.3.0 1:4.3 + __satfractuhqtq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractuhquta@GCC_4.3.0 1:4.3 + __satfractuhqutq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdita@GCC_4.3.0 1:4.3 + __satfractunsditq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunsdiuta@GCC_4.3.0 1:4.3 + __satfractunsdiutq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshita@GCC_4.3.0 1:4.3 + __satfractunshitq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunshiuta@GCC_4.3.0 1:4.3 + __satfractunshiutq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqita@GCC_4.3.0 1:4.3 + __satfractunsqitq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunsqiuta@GCC_4.3.0 1:4.3 + __satfractunsqiutq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssita@GCC_4.3.0 1:4.3 + __satfractunssitq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractunssiuta@GCC_4.3.0 1:4.3 + __satfractunssiutq@GCC_4.3.0 1:4.3 + __satfractunstida@GCC_4.3.0 1:4.3 + __satfractunstidq@GCC_4.3.0 1:4.3 + __satfractunstiha@GCC_4.3.0 1:4.3 + __satfractunstihq@GCC_4.3.0 1:4.3 + __satfractunstiqq@GCC_4.3.0 1:4.3 + __satfractunstisa@GCC_4.3.0 1:4.3 + __satfractunstisq@GCC_4.3.0 1:4.3 + __satfractunstita@GCC_4.3.0 1:4.3 + __satfractunstitq@GCC_4.3.0 1:4.3 + __satfractunstiuda@GCC_4.3.0 1:4.3 + __satfractunstiudq@GCC_4.3.0 1:4.3 + __satfractunstiuha@GCC_4.3.0 1:4.3 + __satfractunstiuhq@GCC_4.3.0 1:4.3 + __satfractunstiuqq@GCC_4.3.0 1:4.3 + __satfractunstiusa@GCC_4.3.0 1:4.3 + __satfractunstiusq@GCC_4.3.0 1:4.3 + __satfractunstiuta@GCC_4.3.0 1:4.3 + __satfractunstiutq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqqta@GCC_4.3.0 1:4.3 + __satfractuqqtq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractuqquta@GCC_4.3.0 1:4.3 + __satfractuqqutq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusata@GCC_4.3.0 1:4.3 + __satfractusatq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusauta2@GCC_4.3.0 1:4.3 + __satfractusautq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusqta@GCC_4.3.0 1:4.3 + __satfractusqtq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __satfractusquta@GCC_4.3.0 1:4.3 + __satfractusqutq2@GCC_4.3.0 1:4.3 + __satfractutada@GCC_4.3.0 1:4.3 + __satfractutadq@GCC_4.3.0 1:4.3 + __satfractutaha@GCC_4.3.0 1:4.3 + __satfractutahq@GCC_4.3.0 1:4.3 + __satfractutaqq@GCC_4.3.0 1:4.3 + __satfractutasa@GCC_4.3.0 1:4.3 + __satfractutasq@GCC_4.3.0 1:4.3 + __satfractutata@GCC_4.3.0 1:4.3 + __satfractutatq@GCC_4.3.0 1:4.3 + __satfractutauda2@GCC_4.3.0 1:4.3 + __satfractutaudq@GCC_4.3.0 1:4.3 + __satfractutauha2@GCC_4.3.0 1:4.3 + __satfractutauhq@GCC_4.3.0 1:4.3 + __satfractutauqq@GCC_4.3.0 1:4.3 + __satfractutausa2@GCC_4.3.0 1:4.3 + __satfractutausq@GCC_4.3.0 1:4.3 + __satfractutautq@GCC_4.3.0 1:4.3 + __satfractutqda@GCC_4.3.0 1:4.3 + __satfractutqdq@GCC_4.3.0 1:4.3 + __satfractutqha@GCC_4.3.0 1:4.3 + __satfractutqhq@GCC_4.3.0 1:4.3 + __satfractutqqq@GCC_4.3.0 1:4.3 + __satfractutqsa@GCC_4.3.0 1:4.3 + __satfractutqsq@GCC_4.3.0 1:4.3 + __satfractutqta@GCC_4.3.0 1:4.3 + __satfractutqtq@GCC_4.3.0 1:4.3 + __satfractutquda@GCC_4.3.0 1:4.3 + __satfractutqudq2@GCC_4.3.0 1:4.3 + __satfractutquha@GCC_4.3.0 1:4.3 + __satfractutquhq2@GCC_4.3.0 1:4.3 + __satfractutquqq2@GCC_4.3.0 1:4.3 + __satfractutqusa@GCC_4.3.0 1:4.3 + __satfractutqusq2@GCC_4.3.0 1:4.3 + __satfractutquta@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssaddta3@GCC_4.3.0 1:4.3 + __ssaddtq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssashlta3@GCC_4.3.0 1:4.3 + __ssashltq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssdivta3@GCC_4.3.0 1:4.3 + __ssdivtq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssmulta3@GCC_4.3.0 1:4.3 + __ssmultq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __ssnegta2@GCC_4.3.0 1:4.3 + __ssnegtq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __sssubta3@GCC_4.3.0 1:4.3 + __sssubtq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subta3@GCC_4.3.0 1:4.3 + __subtf3@GCC_3.0 1:4.1.1 + __subtq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subuta3@GCC_4.3.0 1:4.3 + __subutq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_8@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_8@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_synchronize@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_8@GCC_4.4.0 1:4.4 + __truncdfsf2@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_3.0 1:4.1.1 + __trunctfsf2@GCC_3.0 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __udivuta3@GCC_4.3.0 1:4.3 + __udivutq3@GCC_4.3.0 1:4.3 + __umodti3@GCC_3.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __unordtf2@GCC_4.5.0 1:4.5 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usadduta3@GCC_4.3.0 1:4.3 + __usaddutq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usashluta3@GCC_4.3.0 1:4.3 + __usashlutq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usdivuta3@GCC_4.3.0 1:4.3 + __usdivutq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usmuluta3@GCC_4.3.0 1:4.3 + __usmulutq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __usneguta2@GCC_4.3.0 1:4.3 + __usnegutq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 + __ussubuta3@GCC_4.3.0 1:4.3 + __ussubutq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libn32gcc1.symbols.mipsel +++ gcc-4.8-4.8.2/debian/libn32gcc1.symbols.mipsel @@ -0,0 +1,1749 @@ +libgcc_s.so.1 libn32gcc1 #MINVER# + GCC_3.0@GCC_3.0 1:4.1.1 + GCC_3.3.1@GCC_3.3.1 1:4.1.1 + GCC_3.3.4@GCC_3.3.4 1:4.1.1 + GCC_3.3@GCC_3.3 1:4.1.1 + GCC_3.4.2@GCC_3.4.2 1:4.1.1 + GCC_3.4.4@GCC_3.4.4 1:4.1.1 + GCC_3.4@GCC_3.4 1:4.1.1 + GCC_4.0.0@GCC_4.0.0 1:4.1.1 + GCC_4.2.0@GCC_4.2.0 1:4.2.0 + GCC_4.3.0@GCC_4.3.0 1:4.3 + GCC_4.4.0@GCC_4.4.0 1:4.4 + GCC_4.5.0@GCC_4.5.0 1:4.5 + GCC_4.7.0@GCC_4.7.0 1:4.7 + GLIBC_2.0@GLIBC_2.0 1:4.1.1 + _Unwind_Backtrace@GCC_3.3 1:4.1.1 + _Unwind_DeleteException@GCC_3.0 1:4.1.1 + _Unwind_FindEnclosingFunction@GCC_3.3 1:4.1.1 + _Unwind_Find_FDE@GCC_3.0 1:4.1.1 + _Unwind_ForcedUnwind@GCC_3.0 1:4.1.1 + _Unwind_GetCFA@GCC_3.3 1:4.1.1 + _Unwind_GetDataRelBase@GCC_3.0 1:4.1.1 + _Unwind_GetGR@GCC_3.0 1:4.1.1 + _Unwind_GetIP@GCC_3.0 1:4.1.1 + _Unwind_GetIPInfo@GCC_4.2.0 1:4.1.1 + _Unwind_GetLanguageSpecificData@GCC_3.0 1:4.1.1 + _Unwind_GetRegionStart@GCC_3.0 1:4.1.1 + _Unwind_GetTextRelBase@GCC_3.0 1:4.1.1 + _Unwind_RaiseException@GCC_3.0 1:4.1.1 + _Unwind_Resume@GCC_3.0 1:4.1.1 + _Unwind_Resume_or_Rethrow@GCC_3.3 1:4.1.1 + _Unwind_SetGR@GCC_3.0 1:4.1.1 + _Unwind_SetIP@GCC_3.0 1:4.1.1 + __absvdi2@GCC_3.0 1:4.1.1 + __absvsi2@GCC_3.0 1:4.1.1 + __absvti2@GCC_3.4.4 1:4.1.1 + __addda3@GCC_4.3.0 1:4.3 + __adddf3@GCC_3.0 1:4.1.1 + __adddq3@GCC_4.3.0 1:4.3 + __addha3@GCC_4.3.0 1:4.3 + __addhq3@GCC_4.3.0 1:4.3 + __addqq3@GCC_4.3.0 1:4.3 + __addsa3@GCC_4.3.0 1:4.3 + __addsf3@GCC_3.0 1:4.1.1 + __addsq3@GCC_4.3.0 1:4.3 + __addta3@GCC_4.3.0 1:4.3 + __addtf3@GCC_3.0 1:4.1.1 + __addtq3@GCC_4.3.0 1:4.3 + __adduda3@GCC_4.3.0 1:4.3 + __addudq3@GCC_4.3.0 1:4.3 + __adduha3@GCC_4.3.0 1:4.3 + __adduhq3@GCC_4.3.0 1:4.3 + __adduqq3@GCC_4.3.0 1:4.3 + __addusa3@GCC_4.3.0 1:4.3 + __addusq3@GCC_4.3.0 1:4.3 + __adduta3@GCC_4.3.0 1:4.3 + __addutq3@GCC_4.3.0 1:4.3 + __addvdi3@GCC_3.0 1:4.1.1 + __addvsi3@GCC_3.0 1:4.1.1 + __addvti3@GCC_3.4.4 1:4.1.1 + __ashlda3@GCC_4.3.0 1:4.3 + __ashldq3@GCC_4.3.0 1:4.3 + __ashlha3@GCC_4.3.0 1:4.3 + __ashlhq3@GCC_4.3.0 1:4.3 + __ashlqq3@GCC_4.3.0 1:4.3 + __ashlsa3@GCC_4.3.0 1:4.3 + __ashlsq3@GCC_4.3.0 1:4.3 + __ashlta3@GCC_4.3.0 1:4.3 + __ashlti3@GCC_3.0 1:4.1.1 + __ashltq3@GCC_4.3.0 1:4.3 + __ashluda3@GCC_4.3.0 1:4.3 + __ashludq3@GCC_4.3.0 1:4.3 + __ashluha3@GCC_4.3.0 1:4.3 + __ashluhq3@GCC_4.3.0 1:4.3 + __ashluqq3@GCC_4.3.0 1:4.3 + __ashlusa3@GCC_4.3.0 1:4.3 + __ashlusq3@GCC_4.3.0 1:4.3 + __ashluta3@GCC_4.3.0 1:4.3 + __ashlutq3@GCC_4.3.0 1:4.3 + __ashrda3@GCC_4.3.0 1:4.3 + __ashrdq3@GCC_4.3.0 1:4.3 + __ashrha3@GCC_4.3.0 1:4.3 + __ashrhq3@GCC_4.3.0 1:4.3 + __ashrqq3@GCC_4.3.0 1:4.3 + __ashrsa3@GCC_4.3.0 1:4.3 + __ashrsq3@GCC_4.3.0 1:4.3 + __ashrta3@GCC_4.3.0 1:4.3 + __ashrti3@GCC_3.0 1:4.1.1 + __ashrtq3@GCC_4.3.0 1:4.3 + __bswapdi2@GCC_4.3.0 1:4.3 + __bswapsi2@GCC_4.3.0 1:4.3 + __clear_cache@GCC_3.0 1:4.1.1 + __clrsbdi2@GCC_4.7.0 1:4.7 + __clrsbti2@GCC_4.7.0 1:4.7 + __clzdi2@GCC_3.4 1:4.1.1 + __clzti2@GCC_3.4 1:4.1.1 + __cmpda2@GCC_4.3.0 1:4.3 + __cmpdq2@GCC_4.3.0 1:4.3 + __cmpha2@GCC_4.3.0 1:4.3 + __cmphq2@GCC_4.3.0 1:4.3 + __cmpqq2@GCC_4.3.0 1:4.3 + __cmpsa2@GCC_4.3.0 1:4.3 + __cmpsq2@GCC_4.3.0 1:4.3 + __cmpta2@GCC_4.3.0 1:4.3 + __cmpti2@GCC_3.0 1:4.1.1 + __cmptq2@GCC_4.3.0 1:4.3 + __cmpuda2@GCC_4.3.0 1:4.3 + __cmpudq2@GCC_4.3.0 1:4.3 + __cmpuha2@GCC_4.3.0 1:4.3 + __cmpuhq2@GCC_4.3.0 1:4.3 + __cmpuqq2@GCC_4.3.0 1:4.3 + __cmpusa2@GCC_4.3.0 1:4.3 + __cmpusq2@GCC_4.3.0 1:4.3 + __cmputa2@GCC_4.3.0 1:4.3 + __cmputq2@GCC_4.3.0 1:4.3 + __ctzdi2@GCC_3.4 1:4.1.1 + __ctzti2@GCC_3.4 1:4.1.1 + __deregister_frame@GLIBC_2.0 1:4.1.1 + __deregister_frame_info@GLIBC_2.0 1:4.1.1 + __deregister_frame_info_bases@GCC_3.0 1:4.1.1 + __divda3@GCC_4.3.0 1:4.3 + __divdc3@GCC_4.0.0 1:4.1.1 + __divdf3@GCC_3.0 1:4.1.1 + __divdq3@GCC_4.3.0 1:4.3 + __divha3@GCC_4.3.0 1:4.3 + __divhq3@GCC_4.3.0 1:4.3 + __divqq3@GCC_4.3.0 1:4.3 + __divsa3@GCC_4.3.0 1:4.3 + __divsc3@GCC_4.0.0 1:4.1.1 + __divsf3@GCC_3.0 1:4.1.1 + __divsq3@GCC_4.3.0 1:4.3 + __divta3@GCC_4.3.0 1:4.3 + __divtc3@GCC_4.0.0 1:4.1.1 + __divtf3@GCC_3.0 1:4.1.1 + __divti3@GCC_3.0 1:4.1.1 + __divtq3@GCC_4.3.0 1:4.3 + __emutls_get_address@GCC_4.3.0 1:4.3 + __emutls_register_common@GCC_4.3.0 1:4.3 + __enable_execute_stack@GCC_3.4.2 1:4.1.1 + __eqdf2@GCC_3.0 1:4.1.1 + __eqsf2@GCC_3.0 1:4.1.1 + __eqtf2@GCC_3.0 1:4.1.1 + __extenddftf2@GCC_3.0 1:4.1.1 + __extendsfdf2@GCC_3.0 1:4.1.1 + __extendsftf2@GCC_3.0 1:4.1.1 + __ffsdi2@GCC_3.0 1:4.1.1 + __ffsti2@GCC_3.0 1:4.1.1 + __fixdfdi@GCC_3.0 1:4.1.1 + __fixdfsi@GCC_3.0 1:4.1.1 + __fixdfti@GCC_3.0 1:4.1.1 + __fixsfdi@GCC_3.0 1:4.1.1 + __fixsfsi@GCC_3.0 1:4.1.1 + __fixsfti@GCC_3.0 1:4.1.1 + __fixtfdi@GCC_3.0 1:4.1.1 + __fixtfsi@GCC_3.0 1:4.1.1 + __fixtfti@GCC_3.0 1:4.1.1 + __fixunsdfdi@GCC_3.0 1:4.1.1 + __fixunsdfsi@GCC_3.0 1:4.1.1 + __fixunsdfti@GCC_3.0 1:4.1.1 + __fixunssfdi@GCC_3.0 1:4.1.1 + __fixunssfsi@GCC_3.0 1:4.1.1 + __fixunssfti@GCC_3.0 1:4.1.1 + __fixunstfdi@GCC_3.0 1:4.1.1 + __fixunstfsi@GCC_3.0 1:4.1.1 + __fixunstfti@GCC_3.0 1:4.1.1 + __floatdidf@GCC_3.0 1:4.1.1 + __floatdisf@GCC_3.0 1:4.1.1 + __floatditf@GCC_3.0 1:4.1.1 + __floatsidf@GCC_3.0 1:4.1.1 + __floatsisf@GCC_3.0 1:4.1.1 + __floatsitf@GCC_3.0 1:4.1.1 + __floattidf@GCC_3.0 1:4.1.1 + __floattisf@GCC_3.0 1:4.1.1 + __floattitf@GCC_3.0 1:4.1.1 + __floatundidf@GCC_4.2.0 1:4.2.1 + __floatundisf@GCC_4.2.0 1:4.2.1 + __floatunditf@GCC_4.2.0 1:4.2.1 + __floatunsidf@GCC_4.2.0 1:4.2.1 + __floatunsisf@GCC_4.2.0 1:4.2.1 + __floatunsitf@GCC_4.2.0 1:4.2.1 + __floatuntidf@GCC_4.2.0 1:4.2.1 + __floatuntisf@GCC_4.2.0 1:4.2.1 + __floatuntitf@GCC_4.2.0 1:4.2.1 + __fractdadf@GCC_4.3.0 1:4.3 + __fractdadi@GCC_4.3.0 1:4.3 + __fractdadq@GCC_4.3.0 1:4.3 + __fractdaha2@GCC_4.3.0 1:4.3 + __fractdahi@GCC_4.3.0 1:4.3 + __fractdahq@GCC_4.3.0 1:4.3 + __fractdaqi@GCC_4.3.0 1:4.3 + __fractdaqq@GCC_4.3.0 1:4.3 + __fractdasa2@GCC_4.3.0 1:4.3 + __fractdasf@GCC_4.3.0 1:4.3 + __fractdasi@GCC_4.3.0 1:4.3 + __fractdasq@GCC_4.3.0 1:4.3 + __fractdata2@GCC_4.3.0 1:4.3 + __fractdati@GCC_4.3.0 1:4.3 + __fractdatq@GCC_4.3.0 1:4.3 + __fractdauda@GCC_4.3.0 1:4.3 + __fractdaudq@GCC_4.3.0 1:4.3 + __fractdauha@GCC_4.3.0 1:4.3 + __fractdauhq@GCC_4.3.0 1:4.3 + __fractdauqq@GCC_4.3.0 1:4.3 + __fractdausa@GCC_4.3.0 1:4.3 + __fractdausq@GCC_4.3.0 1:4.3 + __fractdauta@GCC_4.3.0 1:4.3 + __fractdautq@GCC_4.3.0 1:4.3 + __fractdfda@GCC_4.3.0 1:4.3 + __fractdfdq@GCC_4.3.0 1:4.3 + __fractdfha@GCC_4.3.0 1:4.3 + __fractdfhq@GCC_4.3.0 1:4.3 + __fractdfqq@GCC_4.3.0 1:4.3 + __fractdfsa@GCC_4.3.0 1:4.3 + __fractdfsq@GCC_4.3.0 1:4.3 + __fractdfta@GCC_4.3.0 1:4.3 + __fractdftq@GCC_4.3.0 1:4.3 + __fractdfuda@GCC_4.3.0 1:4.3 + __fractdfudq@GCC_4.3.0 1:4.3 + __fractdfuha@GCC_4.3.0 1:4.3 + __fractdfuhq@GCC_4.3.0 1:4.3 + __fractdfuqq@GCC_4.3.0 1:4.3 + __fractdfusa@GCC_4.3.0 1:4.3 + __fractdfusq@GCC_4.3.0 1:4.3 + __fractdfuta@GCC_4.3.0 1:4.3 + __fractdfutq@GCC_4.3.0 1:4.3 + __fractdida@GCC_4.3.0 1:4.3 + __fractdidq@GCC_4.3.0 1:4.3 + __fractdiha@GCC_4.3.0 1:4.3 + __fractdihq@GCC_4.3.0 1:4.3 + __fractdiqq@GCC_4.3.0 1:4.3 + __fractdisa@GCC_4.3.0 1:4.3 + __fractdisq@GCC_4.3.0 1:4.3 + __fractdita@GCC_4.3.0 1:4.3 + __fractditq@GCC_4.3.0 1:4.3 + __fractdiuda@GCC_4.3.0 1:4.3 + __fractdiudq@GCC_4.3.0 1:4.3 + __fractdiuha@GCC_4.3.0 1:4.3 + __fractdiuhq@GCC_4.3.0 1:4.3 + __fractdiuqq@GCC_4.3.0 1:4.3 + __fractdiusa@GCC_4.3.0 1:4.3 + __fractdiusq@GCC_4.3.0 1:4.3 + __fractdiuta@GCC_4.3.0 1:4.3 + __fractdiutq@GCC_4.3.0 1:4.3 + __fractdqda@GCC_4.3.0 1:4.3 + __fractdqdf@GCC_4.3.0 1:4.3 + __fractdqdi@GCC_4.3.0 1:4.3 + __fractdqha@GCC_4.3.0 1:4.3 + __fractdqhi@GCC_4.3.0 1:4.3 + __fractdqhq2@GCC_4.3.0 1:4.3 + __fractdqqi@GCC_4.3.0 1:4.3 + __fractdqqq2@GCC_4.3.0 1:4.3 + __fractdqsa@GCC_4.3.0 1:4.3 + __fractdqsf@GCC_4.3.0 1:4.3 + __fractdqsi@GCC_4.3.0 1:4.3 + __fractdqsq2@GCC_4.3.0 1:4.3 + __fractdqta@GCC_4.3.0 1:4.3 + __fractdqti@GCC_4.3.0 1:4.3 + __fractdqtq2@GCC_4.3.0 1:4.3 + __fractdquda@GCC_4.3.0 1:4.3 + __fractdqudq@GCC_4.3.0 1:4.3 + __fractdquha@GCC_4.3.0 1:4.3 + __fractdquhq@GCC_4.3.0 1:4.3 + __fractdquqq@GCC_4.3.0 1:4.3 + __fractdqusa@GCC_4.3.0 1:4.3 + __fractdqusq@GCC_4.3.0 1:4.3 + __fractdquta@GCC_4.3.0 1:4.3 + __fractdqutq@GCC_4.3.0 1:4.3 + __fracthada2@GCC_4.3.0 1:4.3 + __fracthadf@GCC_4.3.0 1:4.3 + __fracthadi@GCC_4.3.0 1:4.3 + __fracthadq@GCC_4.3.0 1:4.3 + __fracthahi@GCC_4.3.0 1:4.3 + __fracthahq@GCC_4.3.0 1:4.3 + __fracthaqi@GCC_4.3.0 1:4.3 + __fracthaqq@GCC_4.3.0 1:4.3 + __fracthasa2@GCC_4.3.0 1:4.3 + __fracthasf@GCC_4.3.0 1:4.3 + __fracthasi@GCC_4.3.0 1:4.3 + __fracthasq@GCC_4.3.0 1:4.3 + __fracthata2@GCC_4.3.0 1:4.3 + __fracthati@GCC_4.3.0 1:4.3 + __fracthatq@GCC_4.3.0 1:4.3 + __fracthauda@GCC_4.3.0 1:4.3 + __fracthaudq@GCC_4.3.0 1:4.3 + __fracthauha@GCC_4.3.0 1:4.3 + __fracthauhq@GCC_4.3.0 1:4.3 + __fracthauqq@GCC_4.3.0 1:4.3 + __fracthausa@GCC_4.3.0 1:4.3 + __fracthausq@GCC_4.3.0 1:4.3 + __fracthauta@GCC_4.3.0 1:4.3 + __fracthautq@GCC_4.3.0 1:4.3 + __fracthida@GCC_4.3.0 1:4.3 + __fracthidq@GCC_4.3.0 1:4.3 + __fracthiha@GCC_4.3.0 1:4.3 + __fracthihq@GCC_4.3.0 1:4.3 + __fracthiqq@GCC_4.3.0 1:4.3 + __fracthisa@GCC_4.3.0 1:4.3 + __fracthisq@GCC_4.3.0 1:4.3 + __fracthita@GCC_4.3.0 1:4.3 + __fracthitq@GCC_4.3.0 1:4.3 + __fracthiuda@GCC_4.3.0 1:4.3 + __fracthiudq@GCC_4.3.0 1:4.3 + __fracthiuha@GCC_4.3.0 1:4.3 + __fracthiuhq@GCC_4.3.0 1:4.3 + __fracthiuqq@GCC_4.3.0 1:4.3 + __fracthiusa@GCC_4.3.0 1:4.3 + __fracthiusq@GCC_4.3.0 1:4.3 + __fracthiuta@GCC_4.3.0 1:4.3 + __fracthiutq@GCC_4.3.0 1:4.3 + __fracthqda@GCC_4.3.0 1:4.3 + __fracthqdf@GCC_4.3.0 1:4.3 + __fracthqdi@GCC_4.3.0 1:4.3 + __fracthqdq2@GCC_4.3.0 1:4.3 + __fracthqha@GCC_4.3.0 1:4.3 + __fracthqhi@GCC_4.3.0 1:4.3 + __fracthqqi@GCC_4.3.0 1:4.3 + __fracthqqq2@GCC_4.3.0 1:4.3 + __fracthqsa@GCC_4.3.0 1:4.3 + __fracthqsf@GCC_4.3.0 1:4.3 + __fracthqsi@GCC_4.3.0 1:4.3 + __fracthqsq2@GCC_4.3.0 1:4.3 + __fracthqta@GCC_4.3.0 1:4.3 + __fracthqti@GCC_4.3.0 1:4.3 + __fracthqtq2@GCC_4.3.0 1:4.3 + __fracthquda@GCC_4.3.0 1:4.3 + __fracthqudq@GCC_4.3.0 1:4.3 + __fracthquha@GCC_4.3.0 1:4.3 + __fracthquhq@GCC_4.3.0 1:4.3 + __fracthquqq@GCC_4.3.0 1:4.3 + __fracthqusa@GCC_4.3.0 1:4.3 + __fracthqusq@GCC_4.3.0 1:4.3 + __fracthquta@GCC_4.3.0 1:4.3 + __fracthqutq@GCC_4.3.0 1:4.3 + __fractqida@GCC_4.3.0 1:4.3 + __fractqidq@GCC_4.3.0 1:4.3 + __fractqiha@GCC_4.3.0 1:4.3 + __fractqihq@GCC_4.3.0 1:4.3 + __fractqiqq@GCC_4.3.0 1:4.3 + __fractqisa@GCC_4.3.0 1:4.3 + __fractqisq@GCC_4.3.0 1:4.3 + __fractqita@GCC_4.3.0 1:4.3 + __fractqitq@GCC_4.3.0 1:4.3 + __fractqiuda@GCC_4.3.0 1:4.3 + __fractqiudq@GCC_4.3.0 1:4.3 + __fractqiuha@GCC_4.3.0 1:4.3 + __fractqiuhq@GCC_4.3.0 1:4.3 + __fractqiuqq@GCC_4.3.0 1:4.3 + __fractqiusa@GCC_4.3.0 1:4.3 + __fractqiusq@GCC_4.3.0 1:4.3 + __fractqiuta@GCC_4.3.0 1:4.3 + __fractqiutq@GCC_4.3.0 1:4.3 + __fractqqda@GCC_4.3.0 1:4.3 + __fractqqdf@GCC_4.3.0 1:4.3 + __fractqqdi@GCC_4.3.0 1:4.3 + __fractqqdq2@GCC_4.3.0 1:4.3 + __fractqqha@GCC_4.3.0 1:4.3 + __fractqqhi@GCC_4.3.0 1:4.3 + __fractqqhq2@GCC_4.3.0 1:4.3 + __fractqqqi@GCC_4.3.0 1:4.3 + __fractqqsa@GCC_4.3.0 1:4.3 + __fractqqsf@GCC_4.3.0 1:4.3 + __fractqqsi@GCC_4.3.0 1:4.3 + __fractqqsq2@GCC_4.3.0 1:4.3 + __fractqqta@GCC_4.3.0 1:4.3 + __fractqqti@GCC_4.3.0 1:4.3 + __fractqqtq2@GCC_4.3.0 1:4.3 + __fractqquda@GCC_4.3.0 1:4.3 + __fractqqudq@GCC_4.3.0 1:4.3 + __fractqquha@GCC_4.3.0 1:4.3 + __fractqquhq@GCC_4.3.0 1:4.3 + __fractqquqq@GCC_4.3.0 1:4.3 + __fractqqusa@GCC_4.3.0 1:4.3 + __fractqqusq@GCC_4.3.0 1:4.3 + __fractqquta@GCC_4.3.0 1:4.3 + __fractqqutq@GCC_4.3.0 1:4.3 + __fractsada2@GCC_4.3.0 1:4.3 + __fractsadf@GCC_4.3.0 1:4.3 + __fractsadi@GCC_4.3.0 1:4.3 + __fractsadq@GCC_4.3.0 1:4.3 + __fractsaha2@GCC_4.3.0 1:4.3 + __fractsahi@GCC_4.3.0 1:4.3 + __fractsahq@GCC_4.3.0 1:4.3 + __fractsaqi@GCC_4.3.0 1:4.3 + __fractsaqq@GCC_4.3.0 1:4.3 + __fractsasf@GCC_4.3.0 1:4.3 + __fractsasi@GCC_4.3.0 1:4.3 + __fractsasq@GCC_4.3.0 1:4.3 + __fractsata2@GCC_4.3.0 1:4.3 + __fractsati@GCC_4.3.0 1:4.3 + __fractsatq@GCC_4.3.0 1:4.3 + __fractsauda@GCC_4.3.0 1:4.3 + __fractsaudq@GCC_4.3.0 1:4.3 + __fractsauha@GCC_4.3.0 1:4.3 + __fractsauhq@GCC_4.3.0 1:4.3 + __fractsauqq@GCC_4.3.0 1:4.3 + __fractsausa@GCC_4.3.0 1:4.3 + __fractsausq@GCC_4.3.0 1:4.3 + __fractsauta@GCC_4.3.0 1:4.3 + __fractsautq@GCC_4.3.0 1:4.3 + __fractsfda@GCC_4.3.0 1:4.3 + __fractsfdq@GCC_4.3.0 1:4.3 + __fractsfha@GCC_4.3.0 1:4.3 + __fractsfhq@GCC_4.3.0 1:4.3 + __fractsfqq@GCC_4.3.0 1:4.3 + __fractsfsa@GCC_4.3.0 1:4.3 + __fractsfsq@GCC_4.3.0 1:4.3 + __fractsfta@GCC_4.3.0 1:4.3 + __fractsftq@GCC_4.3.0 1:4.3 + __fractsfuda@GCC_4.3.0 1:4.3 + __fractsfudq@GCC_4.3.0 1:4.3 + __fractsfuha@GCC_4.3.0 1:4.3 + __fractsfuhq@GCC_4.3.0 1:4.3 + __fractsfuqq@GCC_4.3.0 1:4.3 + __fractsfusa@GCC_4.3.0 1:4.3 + __fractsfusq@GCC_4.3.0 1:4.3 + __fractsfuta@GCC_4.3.0 1:4.3 + __fractsfutq@GCC_4.3.0 1:4.3 + __fractsida@GCC_4.3.0 1:4.3 + __fractsidq@GCC_4.3.0 1:4.3 + __fractsiha@GCC_4.3.0 1:4.3 + __fractsihq@GCC_4.3.0 1:4.3 + __fractsiqq@GCC_4.3.0 1:4.3 + __fractsisa@GCC_4.3.0 1:4.3 + __fractsisq@GCC_4.3.0 1:4.3 + __fractsita@GCC_4.3.0 1:4.3 + __fractsitq@GCC_4.3.0 1:4.3 + __fractsiuda@GCC_4.3.0 1:4.3 + __fractsiudq@GCC_4.3.0 1:4.3 + __fractsiuha@GCC_4.3.0 1:4.3 + __fractsiuhq@GCC_4.3.0 1:4.3 + __fractsiuqq@GCC_4.3.0 1:4.3 + __fractsiusa@GCC_4.3.0 1:4.3 + __fractsiusq@GCC_4.3.0 1:4.3 + __fractsiuta@GCC_4.3.0 1:4.3 + __fractsiutq@GCC_4.3.0 1:4.3 + __fractsqda@GCC_4.3.0 1:4.3 + __fractsqdf@GCC_4.3.0 1:4.3 + __fractsqdi@GCC_4.3.0 1:4.3 + __fractsqdq2@GCC_4.3.0 1:4.3 + __fractsqha@GCC_4.3.0 1:4.3 + __fractsqhi@GCC_4.3.0 1:4.3 + __fractsqhq2@GCC_4.3.0 1:4.3 + __fractsqqi@GCC_4.3.0 1:4.3 + __fractsqqq2@GCC_4.3.0 1:4.3 + __fractsqsa@GCC_4.3.0 1:4.3 + __fractsqsf@GCC_4.3.0 1:4.3 + __fractsqsi@GCC_4.3.0 1:4.3 + __fractsqta@GCC_4.3.0 1:4.3 + __fractsqti@GCC_4.3.0 1:4.3 + __fractsqtq2@GCC_4.3.0 1:4.3 + __fractsquda@GCC_4.3.0 1:4.3 + __fractsqudq@GCC_4.3.0 1:4.3 + __fractsquha@GCC_4.3.0 1:4.3 + __fractsquhq@GCC_4.3.0 1:4.3 + __fractsquqq@GCC_4.3.0 1:4.3 + __fractsqusa@GCC_4.3.0 1:4.3 + __fractsqusq@GCC_4.3.0 1:4.3 + __fractsquta@GCC_4.3.0 1:4.3 + __fractsqutq@GCC_4.3.0 1:4.3 + __fracttada2@GCC_4.3.0 1:4.3 + __fracttadf@GCC_4.3.0 1:4.3 + __fracttadi@GCC_4.3.0 1:4.3 + __fracttadq@GCC_4.3.0 1:4.3 + __fracttaha2@GCC_4.3.0 1:4.3 + __fracttahi@GCC_4.3.0 1:4.3 + __fracttahq@GCC_4.3.0 1:4.3 + __fracttaqi@GCC_4.3.0 1:4.3 + __fracttaqq@GCC_4.3.0 1:4.3 + __fracttasa2@GCC_4.3.0 1:4.3 + __fracttasf@GCC_4.3.0 1:4.3 + __fracttasi@GCC_4.3.0 1:4.3 + __fracttasq@GCC_4.3.0 1:4.3 + __fracttati@GCC_4.3.0 1:4.3 + __fracttatq@GCC_4.3.0 1:4.3 + __fracttauda@GCC_4.3.0 1:4.3 + __fracttaudq@GCC_4.3.0 1:4.3 + __fracttauha@GCC_4.3.0 1:4.3 + __fracttauhq@GCC_4.3.0 1:4.3 + __fracttauqq@GCC_4.3.0 1:4.3 + __fracttausa@GCC_4.3.0 1:4.3 + __fracttausq@GCC_4.3.0 1:4.3 + __fracttauta@GCC_4.3.0 1:4.3 + __fracttautq@GCC_4.3.0 1:4.3 + __fracttida@GCC_4.3.0 1:4.3 + __fracttidq@GCC_4.3.0 1:4.3 + __fracttiha@GCC_4.3.0 1:4.3 + __fracttihq@GCC_4.3.0 1:4.3 + __fracttiqq@GCC_4.3.0 1:4.3 + __fracttisa@GCC_4.3.0 1:4.3 + __fracttisq@GCC_4.3.0 1:4.3 + __fracttita@GCC_4.3.0 1:4.3 + __fracttitq@GCC_4.3.0 1:4.3 + __fracttiuda@GCC_4.3.0 1:4.3 + __fracttiudq@GCC_4.3.0 1:4.3 + __fracttiuha@GCC_4.3.0 1:4.3 + __fracttiuhq@GCC_4.3.0 1:4.3 + __fracttiuqq@GCC_4.3.0 1:4.3 + __fracttiusa@GCC_4.3.0 1:4.3 + __fracttiusq@GCC_4.3.0 1:4.3 + __fracttiuta@GCC_4.3.0 1:4.3 + __fracttiutq@GCC_4.3.0 1:4.3 + __fracttqda@GCC_4.3.0 1:4.3 + __fracttqdf@GCC_4.3.0 1:4.3 + __fracttqdi@GCC_4.3.0 1:4.3 + __fracttqdq2@GCC_4.3.0 1:4.3 + __fracttqha@GCC_4.3.0 1:4.3 + __fracttqhi@GCC_4.3.0 1:4.3 + __fracttqhq2@GCC_4.3.0 1:4.3 + __fracttqqi@GCC_4.3.0 1:4.3 + __fracttqqq2@GCC_4.3.0 1:4.3 + __fracttqsa@GCC_4.3.0 1:4.3 + __fracttqsf@GCC_4.3.0 1:4.3 + __fracttqsi@GCC_4.3.0 1:4.3 + __fracttqsq2@GCC_4.3.0 1:4.3 + __fracttqta@GCC_4.3.0 1:4.3 + __fracttqti@GCC_4.3.0 1:4.3 + __fracttquda@GCC_4.3.0 1:4.3 + __fracttqudq@GCC_4.3.0 1:4.3 + __fracttquha@GCC_4.3.0 1:4.3 + __fracttquhq@GCC_4.3.0 1:4.3 + __fracttquqq@GCC_4.3.0 1:4.3 + __fracttqusa@GCC_4.3.0 1:4.3 + __fracttqusq@GCC_4.3.0 1:4.3 + __fracttquta@GCC_4.3.0 1:4.3 + __fracttqutq@GCC_4.3.0 1:4.3 + __fractudada@GCC_4.3.0 1:4.3 + __fractudadf@GCC_4.3.0 1:4.3 + __fractudadi@GCC_4.3.0 1:4.3 + __fractudadq@GCC_4.3.0 1:4.3 + __fractudaha@GCC_4.3.0 1:4.3 + __fractudahi@GCC_4.3.0 1:4.3 + __fractudahq@GCC_4.3.0 1:4.3 + __fractudaqi@GCC_4.3.0 1:4.3 + __fractudaqq@GCC_4.3.0 1:4.3 + __fractudasa@GCC_4.3.0 1:4.3 + __fractudasf@GCC_4.3.0 1:4.3 + __fractudasi@GCC_4.3.0 1:4.3 + __fractudasq@GCC_4.3.0 1:4.3 + __fractudata@GCC_4.3.0 1:4.3 + __fractudati@GCC_4.3.0 1:4.3 + __fractudatq@GCC_4.3.0 1:4.3 + __fractudaudq@GCC_4.3.0 1:4.3 + __fractudauha2@GCC_4.3.0 1:4.3 + __fractudauhq@GCC_4.3.0 1:4.3 + __fractudauqq@GCC_4.3.0 1:4.3 + __fractudausa2@GCC_4.3.0 1:4.3 + __fractudausq@GCC_4.3.0 1:4.3 + __fractudauta2@GCC_4.3.0 1:4.3 + __fractudautq@GCC_4.3.0 1:4.3 + __fractudqda@GCC_4.3.0 1:4.3 + __fractudqdf@GCC_4.3.0 1:4.3 + __fractudqdi@GCC_4.3.0 1:4.3 + __fractudqdq@GCC_4.3.0 1:4.3 + __fractudqha@GCC_4.3.0 1:4.3 + __fractudqhi@GCC_4.3.0 1:4.3 + __fractudqhq@GCC_4.3.0 1:4.3 + __fractudqqi@GCC_4.3.0 1:4.3 + __fractudqqq@GCC_4.3.0 1:4.3 + __fractudqsa@GCC_4.3.0 1:4.3 + __fractudqsf@GCC_4.3.0 1:4.3 + __fractudqsi@GCC_4.3.0 1:4.3 + __fractudqsq@GCC_4.3.0 1:4.3 + __fractudqta@GCC_4.3.0 1:4.3 + __fractudqti@GCC_4.3.0 1:4.3 + __fractudqtq@GCC_4.3.0 1:4.3 + __fractudquda@GCC_4.3.0 1:4.3 + __fractudquha@GCC_4.3.0 1:4.3 + __fractudquhq2@GCC_4.3.0 1:4.3 + __fractudquqq2@GCC_4.3.0 1:4.3 + __fractudqusa@GCC_4.3.0 1:4.3 + __fractudqusq2@GCC_4.3.0 1:4.3 + __fractudquta@GCC_4.3.0 1:4.3 + __fractudqutq2@GCC_4.3.0 1:4.3 + __fractuhada@GCC_4.3.0 1:4.3 + __fractuhadf@GCC_4.3.0 1:4.3 + __fractuhadi@GCC_4.3.0 1:4.3 + __fractuhadq@GCC_4.3.0 1:4.3 + __fractuhaha@GCC_4.3.0 1:4.3 + __fractuhahi@GCC_4.3.0 1:4.3 + __fractuhahq@GCC_4.3.0 1:4.3 + __fractuhaqi@GCC_4.3.0 1:4.3 + __fractuhaqq@GCC_4.3.0 1:4.3 + __fractuhasa@GCC_4.3.0 1:4.3 + __fractuhasf@GCC_4.3.0 1:4.3 + __fractuhasi@GCC_4.3.0 1:4.3 + __fractuhasq@GCC_4.3.0 1:4.3 + __fractuhata@GCC_4.3.0 1:4.3 + __fractuhati@GCC_4.3.0 1:4.3 + __fractuhatq@GCC_4.3.0 1:4.3 + __fractuhauda2@GCC_4.3.0 1:4.3 + __fractuhaudq@GCC_4.3.0 1:4.3 + __fractuhauhq@GCC_4.3.0 1:4.3 + __fractuhauqq@GCC_4.3.0 1:4.3 + __fractuhausa2@GCC_4.3.0 1:4.3 + __fractuhausq@GCC_4.3.0 1:4.3 + __fractuhauta2@GCC_4.3.0 1:4.3 + __fractuhautq@GCC_4.3.0 1:4.3 + __fractuhqda@GCC_4.3.0 1:4.3 + __fractuhqdf@GCC_4.3.0 1:4.3 + __fractuhqdi@GCC_4.3.0 1:4.3 + __fractuhqdq@GCC_4.3.0 1:4.3 + __fractuhqha@GCC_4.3.0 1:4.3 + __fractuhqhi@GCC_4.3.0 1:4.3 + __fractuhqhq@GCC_4.3.0 1:4.3 + __fractuhqqi@GCC_4.3.0 1:4.3 + __fractuhqqq@GCC_4.3.0 1:4.3 + __fractuhqsa@GCC_4.3.0 1:4.3 + __fractuhqsf@GCC_4.3.0 1:4.3 + __fractuhqsi@GCC_4.3.0 1:4.3 + __fractuhqsq@GCC_4.3.0 1:4.3 + __fractuhqta@GCC_4.3.0 1:4.3 + __fractuhqti@GCC_4.3.0 1:4.3 + __fractuhqtq@GCC_4.3.0 1:4.3 + __fractuhquda@GCC_4.3.0 1:4.3 + __fractuhqudq2@GCC_4.3.0 1:4.3 + __fractuhquha@GCC_4.3.0 1:4.3 + __fractuhquqq2@GCC_4.3.0 1:4.3 + __fractuhqusa@GCC_4.3.0 1:4.3 + __fractuhqusq2@GCC_4.3.0 1:4.3 + __fractuhquta@GCC_4.3.0 1:4.3 + __fractuhqutq2@GCC_4.3.0 1:4.3 + __fractunsdadi@GCC_4.3.0 1:4.3 + __fractunsdahi@GCC_4.3.0 1:4.3 + __fractunsdaqi@GCC_4.3.0 1:4.3 + __fractunsdasi@GCC_4.3.0 1:4.3 + __fractunsdati@GCC_4.3.0 1:4.3 + __fractunsdida@GCC_4.3.0 1:4.3 + __fractunsdidq@GCC_4.3.0 1:4.3 + __fractunsdiha@GCC_4.3.0 1:4.3 + __fractunsdihq@GCC_4.3.0 1:4.3 + __fractunsdiqq@GCC_4.3.0 1:4.3 + __fractunsdisa@GCC_4.3.0 1:4.3 + __fractunsdisq@GCC_4.3.0 1:4.3 + __fractunsdita@GCC_4.3.0 1:4.3 + __fractunsditq@GCC_4.3.0 1:4.3 + __fractunsdiuda@GCC_4.3.0 1:4.3 + __fractunsdiudq@GCC_4.3.0 1:4.3 + __fractunsdiuha@GCC_4.3.0 1:4.3 + __fractunsdiuhq@GCC_4.3.0 1:4.3 + __fractunsdiuqq@GCC_4.3.0 1:4.3 + __fractunsdiusa@GCC_4.3.0 1:4.3 + __fractunsdiusq@GCC_4.3.0 1:4.3 + __fractunsdiuta@GCC_4.3.0 1:4.3 + __fractunsdiutq@GCC_4.3.0 1:4.3 + __fractunsdqdi@GCC_4.3.0 1:4.3 + __fractunsdqhi@GCC_4.3.0 1:4.3 + __fractunsdqqi@GCC_4.3.0 1:4.3 + __fractunsdqsi@GCC_4.3.0 1:4.3 + __fractunsdqti@GCC_4.3.0 1:4.3 + __fractunshadi@GCC_4.3.0 1:4.3 + __fractunshahi@GCC_4.3.0 1:4.3 + __fractunshaqi@GCC_4.3.0 1:4.3 + __fractunshasi@GCC_4.3.0 1:4.3 + __fractunshati@GCC_4.3.0 1:4.3 + __fractunshida@GCC_4.3.0 1:4.3 + __fractunshidq@GCC_4.3.0 1:4.3 + __fractunshiha@GCC_4.3.0 1:4.3 + __fractunshihq@GCC_4.3.0 1:4.3 + __fractunshiqq@GCC_4.3.0 1:4.3 + __fractunshisa@GCC_4.3.0 1:4.3 + __fractunshisq@GCC_4.3.0 1:4.3 + __fractunshita@GCC_4.3.0 1:4.3 + __fractunshitq@GCC_4.3.0 1:4.3 + __fractunshiuda@GCC_4.3.0 1:4.3 + __fractunshiudq@GCC_4.3.0 1:4.3 + __fractunshiuha@GCC_4.3.0 1:4.3 + __fractunshiuhq@GCC_4.3.0 1:4.3 + __fractunshiuqq@GCC_4.3.0 1:4.3 + __fractunshiusa@GCC_4.3.0 1:4.3 + __fractunshiusq@GCC_4.3.0 1:4.3 + __fractunshiuta@GCC_4.3.0 1:4.3 + __fractunshiutq@GCC_4.3.0 1:4.3 + __fractunshqdi@GCC_4.3.0 1:4.3 + __fractunshqhi@GCC_4.3.0 1:4.3 + __fractunshqqi@GCC_4.3.0 1:4.3 + __fractunshqsi@GCC_4.3.0 1:4.3 + __fractunshqti@GCC_4.3.0 1:4.3 + __fractunsqida@GCC_4.3.0 1:4.3 + __fractunsqidq@GCC_4.3.0 1:4.3 + __fractunsqiha@GCC_4.3.0 1:4.3 + __fractunsqihq@GCC_4.3.0 1:4.3 + __fractunsqiqq@GCC_4.3.0 1:4.3 + __fractunsqisa@GCC_4.3.0 1:4.3 + __fractunsqisq@GCC_4.3.0 1:4.3 + __fractunsqita@GCC_4.3.0 1:4.3 + __fractunsqitq@GCC_4.3.0 1:4.3 + __fractunsqiuda@GCC_4.3.0 1:4.3 + __fractunsqiudq@GCC_4.3.0 1:4.3 + __fractunsqiuha@GCC_4.3.0 1:4.3 + __fractunsqiuhq@GCC_4.3.0 1:4.3 + __fractunsqiuqq@GCC_4.3.0 1:4.3 + __fractunsqiusa@GCC_4.3.0 1:4.3 + __fractunsqiusq@GCC_4.3.0 1:4.3 + __fractunsqiuta@GCC_4.3.0 1:4.3 + __fractunsqiutq@GCC_4.3.0 1:4.3 + __fractunsqqdi@GCC_4.3.0 1:4.3 + __fractunsqqhi@GCC_4.3.0 1:4.3 + __fractunsqqqi@GCC_4.3.0 1:4.3 + __fractunsqqsi@GCC_4.3.0 1:4.3 + __fractunsqqti@GCC_4.3.0 1:4.3 + __fractunssadi@GCC_4.3.0 1:4.3 + __fractunssahi@GCC_4.3.0 1:4.3 + __fractunssaqi@GCC_4.3.0 1:4.3 + __fractunssasi@GCC_4.3.0 1:4.3 + __fractunssati@GCC_4.3.0 1:4.3 + __fractunssida@GCC_4.3.0 1:4.3 + __fractunssidq@GCC_4.3.0 1:4.3 + __fractunssiha@GCC_4.3.0 1:4.3 + __fractunssihq@GCC_4.3.0 1:4.3 + __fractunssiqq@GCC_4.3.0 1:4.3 + __fractunssisa@GCC_4.3.0 1:4.3 + __fractunssisq@GCC_4.3.0 1:4.3 + __fractunssita@GCC_4.3.0 1:4.3 + __fractunssitq@GCC_4.3.0 1:4.3 + __fractunssiuda@GCC_4.3.0 1:4.3 + __fractunssiudq@GCC_4.3.0 1:4.3 + __fractunssiuha@GCC_4.3.0 1:4.3 + __fractunssiuhq@GCC_4.3.0 1:4.3 + __fractunssiuqq@GCC_4.3.0 1:4.3 + __fractunssiusa@GCC_4.3.0 1:4.3 + __fractunssiusq@GCC_4.3.0 1:4.3 + __fractunssiuta@GCC_4.3.0 1:4.3 + __fractunssiutq@GCC_4.3.0 1:4.3 + __fractunssqdi@GCC_4.3.0 1:4.3 + __fractunssqhi@GCC_4.3.0 1:4.3 + __fractunssqqi@GCC_4.3.0 1:4.3 + __fractunssqsi@GCC_4.3.0 1:4.3 + __fractunssqti@GCC_4.3.0 1:4.3 + __fractunstadi@GCC_4.3.0 1:4.3 + __fractunstahi@GCC_4.3.0 1:4.3 + __fractunstaqi@GCC_4.3.0 1:4.3 + __fractunstasi@GCC_4.3.0 1:4.3 + __fractunstati@GCC_4.3.0 1:4.3 + __fractunstida@GCC_4.3.0 1:4.3 + __fractunstidq@GCC_4.3.0 1:4.3 + __fractunstiha@GCC_4.3.0 1:4.3 + __fractunstihq@GCC_4.3.0 1:4.3 + __fractunstiqq@GCC_4.3.0 1:4.3 + __fractunstisa@GCC_4.3.0 1:4.3 + __fractunstisq@GCC_4.3.0 1:4.3 + __fractunstita@GCC_4.3.0 1:4.3 + __fractunstitq@GCC_4.3.0 1:4.3 + __fractunstiuda@GCC_4.3.0 1:4.3 + __fractunstiudq@GCC_4.3.0 1:4.3 + __fractunstiuha@GCC_4.3.0 1:4.3 + __fractunstiuhq@GCC_4.3.0 1:4.3 + __fractunstiuqq@GCC_4.3.0 1:4.3 + __fractunstiusa@GCC_4.3.0 1:4.3 + __fractunstiusq@GCC_4.3.0 1:4.3 + __fractunstiuta@GCC_4.3.0 1:4.3 + __fractunstiutq@GCC_4.3.0 1:4.3 + __fractunstqdi@GCC_4.3.0 1:4.3 + __fractunstqhi@GCC_4.3.0 1:4.3 + __fractunstqqi@GCC_4.3.0 1:4.3 + __fractunstqsi@GCC_4.3.0 1:4.3 + __fractunstqti@GCC_4.3.0 1:4.3 + __fractunsudadi@GCC_4.3.0 1:4.3 + __fractunsudahi@GCC_4.3.0 1:4.3 + __fractunsudaqi@GCC_4.3.0 1:4.3 + __fractunsudasi@GCC_4.3.0 1:4.3 + __fractunsudati@GCC_4.3.0 1:4.3 + __fractunsudqdi@GCC_4.3.0 1:4.3 + __fractunsudqhi@GCC_4.3.0 1:4.3 + __fractunsudqqi@GCC_4.3.0 1:4.3 + __fractunsudqsi@GCC_4.3.0 1:4.3 + __fractunsudqti@GCC_4.3.0 1:4.3 + __fractunsuhadi@GCC_4.3.0 1:4.3 + __fractunsuhahi@GCC_4.3.0 1:4.3 + __fractunsuhaqi@GCC_4.3.0 1:4.3 + __fractunsuhasi@GCC_4.3.0 1:4.3 + __fractunsuhati@GCC_4.3.0 1:4.3 + __fractunsuhqdi@GCC_4.3.0 1:4.3 + __fractunsuhqhi@GCC_4.3.0 1:4.3 + __fractunsuhqqi@GCC_4.3.0 1:4.3 + __fractunsuhqsi@GCC_4.3.0 1:4.3 + __fractunsuhqti@GCC_4.3.0 1:4.3 + __fractunsuqqdi@GCC_4.3.0 1:4.3 + __fractunsuqqhi@GCC_4.3.0 1:4.3 + __fractunsuqqqi@GCC_4.3.0 1:4.3 + __fractunsuqqsi@GCC_4.3.0 1:4.3 + __fractunsuqqti@GCC_4.3.0 1:4.3 + __fractunsusadi@GCC_4.3.0 1:4.3 + __fractunsusahi@GCC_4.3.0 1:4.3 + __fractunsusaqi@GCC_4.3.0 1:4.3 + __fractunsusasi@GCC_4.3.0 1:4.3 + __fractunsusati@GCC_4.3.0 1:4.3 + __fractunsusqdi@GCC_4.3.0 1:4.3 + __fractunsusqhi@GCC_4.3.0 1:4.3 + __fractunsusqqi@GCC_4.3.0 1:4.3 + __fractunsusqsi@GCC_4.3.0 1:4.3 + __fractunsusqti@GCC_4.3.0 1:4.3 + __fractunsutadi@GCC_4.3.0 1:4.3 + __fractunsutahi@GCC_4.3.0 1:4.3 + __fractunsutaqi@GCC_4.3.0 1:4.3 + __fractunsutasi@GCC_4.3.0 1:4.3 + __fractunsutati@GCC_4.3.0 1:4.3 + __fractunsutqdi@GCC_4.3.0 1:4.3 + __fractunsutqhi@GCC_4.3.0 1:4.3 + __fractunsutqqi@GCC_4.3.0 1:4.3 + __fractunsutqsi@GCC_4.3.0 1:4.3 + __fractunsutqti@GCC_4.3.0 1:4.3 + __fractuqqda@GCC_4.3.0 1:4.3 + __fractuqqdf@GCC_4.3.0 1:4.3 + __fractuqqdi@GCC_4.3.0 1:4.3 + __fractuqqdq@GCC_4.3.0 1:4.3 + __fractuqqha@GCC_4.3.0 1:4.3 + __fractuqqhi@GCC_4.3.0 1:4.3 + __fractuqqhq@GCC_4.3.0 1:4.3 + __fractuqqqi@GCC_4.3.0 1:4.3 + __fractuqqqq@GCC_4.3.0 1:4.3 + __fractuqqsa@GCC_4.3.0 1:4.3 + __fractuqqsf@GCC_4.3.0 1:4.3 + __fractuqqsi@GCC_4.3.0 1:4.3 + __fractuqqsq@GCC_4.3.0 1:4.3 + __fractuqqta@GCC_4.3.0 1:4.3 + __fractuqqti@GCC_4.3.0 1:4.3 + __fractuqqtq@GCC_4.3.0 1:4.3 + __fractuqquda@GCC_4.3.0 1:4.3 + __fractuqqudq2@GCC_4.3.0 1:4.3 + __fractuqquha@GCC_4.3.0 1:4.3 + __fractuqquhq2@GCC_4.3.0 1:4.3 + __fractuqqusa@GCC_4.3.0 1:4.3 + __fractuqqusq2@GCC_4.3.0 1:4.3 + __fractuqquta@GCC_4.3.0 1:4.3 + __fractuqqutq2@GCC_4.3.0 1:4.3 + __fractusada@GCC_4.3.0 1:4.3 + __fractusadf@GCC_4.3.0 1:4.3 + __fractusadi@GCC_4.3.0 1:4.3 + __fractusadq@GCC_4.3.0 1:4.3 + __fractusaha@GCC_4.3.0 1:4.3 + __fractusahi@GCC_4.3.0 1:4.3 + __fractusahq@GCC_4.3.0 1:4.3 + __fractusaqi@GCC_4.3.0 1:4.3 + __fractusaqq@GCC_4.3.0 1:4.3 + __fractusasa@GCC_4.3.0 1:4.3 + __fractusasf@GCC_4.3.0 1:4.3 + __fractusasi@GCC_4.3.0 1:4.3 + __fractusasq@GCC_4.3.0 1:4.3 + __fractusata@GCC_4.3.0 1:4.3 + __fractusati@GCC_4.3.0 1:4.3 + __fractusatq@GCC_4.3.0 1:4.3 + __fractusauda2@GCC_4.3.0 1:4.3 + __fractusaudq@GCC_4.3.0 1:4.3 + __fractusauha2@GCC_4.3.0 1:4.3 + __fractusauhq@GCC_4.3.0 1:4.3 + __fractusauqq@GCC_4.3.0 1:4.3 + __fractusausq@GCC_4.3.0 1:4.3 + __fractusauta2@GCC_4.3.0 1:4.3 + __fractusautq@GCC_4.3.0 1:4.3 + __fractusqda@GCC_4.3.0 1:4.3 + __fractusqdf@GCC_4.3.0 1:4.3 + __fractusqdi@GCC_4.3.0 1:4.3 + __fractusqdq@GCC_4.3.0 1:4.3 + __fractusqha@GCC_4.3.0 1:4.3 + __fractusqhi@GCC_4.3.0 1:4.3 + __fractusqhq@GCC_4.3.0 1:4.3 + __fractusqqi@GCC_4.3.0 1:4.3 + __fractusqqq@GCC_4.3.0 1:4.3 + __fractusqsa@GCC_4.3.0 1:4.3 + __fractusqsf@GCC_4.3.0 1:4.3 + __fractusqsi@GCC_4.3.0 1:4.3 + __fractusqsq@GCC_4.3.0 1:4.3 + __fractusqta@GCC_4.3.0 1:4.3 + __fractusqti@GCC_4.3.0 1:4.3 + __fractusqtq@GCC_4.3.0 1:4.3 + __fractusquda@GCC_4.3.0 1:4.3 + __fractusqudq2@GCC_4.3.0 1:4.3 + __fractusquha@GCC_4.3.0 1:4.3 + __fractusquhq2@GCC_4.3.0 1:4.3 + __fractusquqq2@GCC_4.3.0 1:4.3 + __fractusqusa@GCC_4.3.0 1:4.3 + __fractusquta@GCC_4.3.0 1:4.3 + __fractusqutq2@GCC_4.3.0 1:4.3 + __fractutada@GCC_4.3.0 1:4.3 + __fractutadf@GCC_4.3.0 1:4.3 + __fractutadi@GCC_4.3.0 1:4.3 + __fractutadq@GCC_4.3.0 1:4.3 + __fractutaha@GCC_4.3.0 1:4.3 + __fractutahi@GCC_4.3.0 1:4.3 + __fractutahq@GCC_4.3.0 1:4.3 + __fractutaqi@GCC_4.3.0 1:4.3 + __fractutaqq@GCC_4.3.0 1:4.3 + __fractutasa@GCC_4.3.0 1:4.3 + __fractutasf@GCC_4.3.0 1:4.3 + __fractutasi@GCC_4.3.0 1:4.3 + __fractutasq@GCC_4.3.0 1:4.3 + __fractutata@GCC_4.3.0 1:4.3 + __fractutati@GCC_4.3.0 1:4.3 + __fractutatq@GCC_4.3.0 1:4.3 + __fractutauda2@GCC_4.3.0 1:4.3 + __fractutaudq@GCC_4.3.0 1:4.3 + __fractutauha2@GCC_4.3.0 1:4.3 + __fractutauhq@GCC_4.3.0 1:4.3 + __fractutauqq@GCC_4.3.0 1:4.3 + __fractutausa2@GCC_4.3.0 1:4.3 + __fractutausq@GCC_4.3.0 1:4.3 + __fractutautq@GCC_4.3.0 1:4.3 + __fractutqda@GCC_4.3.0 1:4.3 + __fractutqdf@GCC_4.3.0 1:4.3 + __fractutqdi@GCC_4.3.0 1:4.3 + __fractutqdq@GCC_4.3.0 1:4.3 + __fractutqha@GCC_4.3.0 1:4.3 + __fractutqhi@GCC_4.3.0 1:4.3 + __fractutqhq@GCC_4.3.0 1:4.3 + __fractutqqi@GCC_4.3.0 1:4.3 + __fractutqqq@GCC_4.3.0 1:4.3 + __fractutqsa@GCC_4.3.0 1:4.3 + __fractutqsf@GCC_4.3.0 1:4.3 + __fractutqsi@GCC_4.3.0 1:4.3 + __fractutqsq@GCC_4.3.0 1:4.3 + __fractutqta@GCC_4.3.0 1:4.3 + __fractutqti@GCC_4.3.0 1:4.3 + __fractutqtq@GCC_4.3.0 1:4.3 + __fractutquda@GCC_4.3.0 1:4.3 + __fractutqudq2@GCC_4.3.0 1:4.3 + __fractutquha@GCC_4.3.0 1:4.3 + __fractutquhq2@GCC_4.3.0 1:4.3 + __fractutquqq2@GCC_4.3.0 1:4.3 + __fractutqusa@GCC_4.3.0 1:4.3 + __fractutqusq2@GCC_4.3.0 1:4.3 + __fractutquta@GCC_4.3.0 1:4.3 + __frame_state_for@GLIBC_2.0 1:4.1.1 + __gcc_personality_v0@GCC_3.3.1 1:4.1.1 + __gedf2@GCC_3.0 1:4.1.1 + __gesf2@GCC_3.0 1:4.1.1 + __getf2@GCC_3.0 1:4.1.1 + __gtdf2@GCC_3.0 1:4.1.1 + __gtsf2@GCC_3.0 1:4.1.1 + __gttf2@GCC_3.0 1:4.1.1 + __ledf2@GCC_3.0 1:4.1.1 + __lesf2@GCC_3.0 1:4.1.1 + __letf2@GCC_3.0 1:4.1.1 + __lshrti3@GCC_3.0 1:4.1.1 + __lshruda3@GCC_4.3.0 1:4.3 + __lshrudq3@GCC_4.3.0 1:4.3 + __lshruha3@GCC_4.3.0 1:4.3 + __lshruhq3@GCC_4.3.0 1:4.3 + __lshruqq3@GCC_4.3.0 1:4.3 + __lshrusa3@GCC_4.3.0 1:4.3 + __lshrusq3@GCC_4.3.0 1:4.3 + __lshruta3@GCC_4.3.0 1:4.3 + __lshrutq3@GCC_4.3.0 1:4.3 + __ltdf2@GCC_3.0 1:4.1.1 + __ltsf2@GCC_3.0 1:4.1.1 + __lttf2@GCC_3.0 1:4.1.1 + __modti3@GCC_3.0 1:4.1.1 + __mulda3@GCC_4.3.0 1:4.3 + __muldc3@GCC_4.0.0 1:4.1.1 + __muldf3@GCC_3.0 1:4.1.1 + __muldq3@GCC_4.3.0 1:4.3 + __mulha3@GCC_4.3.0 1:4.3 + __mulhq3@GCC_4.3.0 1:4.3 + __mulqq3@GCC_4.3.0 1:4.3 + __mulsa3@GCC_4.3.0 1:4.3 + __mulsc3@GCC_4.0.0 1:4.1.1 + __mulsf3@GCC_3.0 1:4.1.1 + __mulsq3@GCC_4.3.0 1:4.3 + __multa3@GCC_4.3.0 1:4.3 + __multc3@GCC_4.0.0 1:4.1.1 + __multf3@GCC_3.0 1:4.1.1 + __multi3@GCC_3.0 1:4.1.1 + __multq3@GCC_4.3.0 1:4.3 + __muluda3@GCC_4.3.0 1:4.3 + __muludq3@GCC_4.3.0 1:4.3 + __muluha3@GCC_4.3.0 1:4.3 + __muluhq3@GCC_4.3.0 1:4.3 + __muluqq3@GCC_4.3.0 1:4.3 + __mulusa3@GCC_4.3.0 1:4.3 + __mulusq3@GCC_4.3.0 1:4.3 + __muluta3@GCC_4.3.0 1:4.3 + __mulutq3@GCC_4.3.0 1:4.3 + __mulvdi3@GCC_3.0 1:4.1.1 + __mulvsi3@GCC_3.0 1:4.1.1 + __mulvti3@GCC_3.4.4 1:4.1.1 + __nedf2@GCC_3.0 1:4.1.1 + __negda2@GCC_4.3.0 1:4.3 + __negdf2@GCC_3.0 1:4.1.1 + __negdq2@GCC_4.3.0 1:4.3 + __negha2@GCC_4.3.0 1:4.3 + __neghq2@GCC_4.3.0 1:4.3 + __negqq2@GCC_4.3.0 1:4.3 + __negsa2@GCC_4.3.0 1:4.3 + __negsf2@GCC_3.0 1:4.1.1 + __negsq2@GCC_4.3.0 1:4.3 + __negta2@GCC_4.3.0 1:4.3 + __negtf2@GCC_3.0 1:4.1.1 + __negti2@GCC_3.0 1:4.1.1 + __negtq2@GCC_4.3.0 1:4.3 + __neguda2@GCC_4.3.0 1:4.3 + __negudq2@GCC_4.3.0 1:4.3 + __neguha2@GCC_4.3.0 1:4.3 + __neguhq2@GCC_4.3.0 1:4.3 + __neguqq2@GCC_4.3.0 1:4.3 + __negusa2@GCC_4.3.0 1:4.3 + __negusq2@GCC_4.3.0 1:4.3 + __neguta2@GCC_4.3.0 1:4.3 + __negutq2@GCC_4.3.0 1:4.3 + __negvdi2@GCC_3.0 1:4.1.1 + __negvsi2@GCC_3.0 1:4.1.1 + __negvti2@GCC_3.4.4 1:4.1.1 + __nesf2@GCC_3.0 1:4.1.1 + __netf2@GCC_3.0 1:4.1.1 + __paritydi2@GCC_3.4 1:4.1.1 + __parityti2@GCC_3.4 1:4.1.1 + __popcountdi2@GCC_3.4 1:4.1.1 + __popcountti2@GCC_3.4 1:4.1.1 + __powidf2@GCC_4.0.0 1:4.1.1 + __powisf2@GCC_4.0.0 1:4.1.1 + __powitf2@GCC_4.0.0 1:4.1.1 + __register_frame@GLIBC_2.0 1:4.1.1 + __register_frame_info@GLIBC_2.0 1:4.1.1 + __register_frame_info_bases@GCC_3.0 1:4.1.1 + __register_frame_info_table@GLIBC_2.0 1:4.1.1 + __register_frame_info_table_bases@GCC_3.0 1:4.1.1 + __register_frame_table@GLIBC_2.0 1:4.1.1 + __satfractdadq@GCC_4.3.0 1:4.3 + __satfractdaha2@GCC_4.3.0 1:4.3 + __satfractdahq@GCC_4.3.0 1:4.3 + __satfractdaqq@GCC_4.3.0 1:4.3 + __satfractdasa2@GCC_4.3.0 1:4.3 + __satfractdasq@GCC_4.3.0 1:4.3 + __satfractdata2@GCC_4.3.0 1:4.3 + __satfractdatq@GCC_4.3.0 1:4.3 + __satfractdauda@GCC_4.3.0 1:4.3 + __satfractdaudq@GCC_4.3.0 1:4.3 + __satfractdauha@GCC_4.3.0 1:4.3 + __satfractdauhq@GCC_4.3.0 1:4.3 + __satfractdauqq@GCC_4.3.0 1:4.3 + __satfractdausa@GCC_4.3.0 1:4.3 + __satfractdausq@GCC_4.3.0 1:4.3 + __satfractdauta@GCC_4.3.0 1:4.3 + __satfractdautq@GCC_4.3.0 1:4.3 + __satfractdfda@GCC_4.3.0 1:4.3 + __satfractdfdq@GCC_4.3.0 1:4.3 + __satfractdfha@GCC_4.3.0 1:4.3 + __satfractdfhq@GCC_4.3.0 1:4.3 + __satfractdfqq@GCC_4.3.0 1:4.3 + __satfractdfsa@GCC_4.3.0 1:4.3 + __satfractdfsq@GCC_4.3.0 1:4.3 + __satfractdfta@GCC_4.3.0 1:4.3 + __satfractdftq@GCC_4.3.0 1:4.3 + __satfractdfuda@GCC_4.3.0 1:4.3 + __satfractdfudq@GCC_4.3.0 1:4.3 + __satfractdfuha@GCC_4.3.0 1:4.3 + __satfractdfuhq@GCC_4.3.0 1:4.3 + __satfractdfuqq@GCC_4.3.0 1:4.3 + __satfractdfusa@GCC_4.3.0 1:4.3 + __satfractdfusq@GCC_4.3.0 1:4.3 + __satfractdfuta@GCC_4.3.0 1:4.3 + __satfractdfutq@GCC_4.3.0 1:4.3 + __satfractdida@GCC_4.3.0 1:4.3 + __satfractdidq@GCC_4.3.0 1:4.3 + __satfractdiha@GCC_4.3.0 1:4.3 + __satfractdihq@GCC_4.3.0 1:4.3 + __satfractdiqq@GCC_4.3.0 1:4.3 + __satfractdisa@GCC_4.3.0 1:4.3 + __satfractdisq@GCC_4.3.0 1:4.3 + __satfractdita@GCC_4.3.0 1:4.3 + __satfractditq@GCC_4.3.0 1:4.3 + __satfractdiuda@GCC_4.3.0 1:4.3 + __satfractdiudq@GCC_4.3.0 1:4.3 + __satfractdiuha@GCC_4.3.0 1:4.3 + __satfractdiuhq@GCC_4.3.0 1:4.3 + __satfractdiuqq@GCC_4.3.0 1:4.3 + __satfractdiusa@GCC_4.3.0 1:4.3 + __satfractdiusq@GCC_4.3.0 1:4.3 + __satfractdiuta@GCC_4.3.0 1:4.3 + __satfractdiutq@GCC_4.3.0 1:4.3 + __satfractdqda@GCC_4.3.0 1:4.3 + __satfractdqha@GCC_4.3.0 1:4.3 + __satfractdqhq2@GCC_4.3.0 1:4.3 + __satfractdqqq2@GCC_4.3.0 1:4.3 + __satfractdqsa@GCC_4.3.0 1:4.3 + __satfractdqsq2@GCC_4.3.0 1:4.3 + __satfractdqta@GCC_4.3.0 1:4.3 + __satfractdqtq2@GCC_4.3.0 1:4.3 + __satfractdquda@GCC_4.3.0 1:4.3 + __satfractdqudq@GCC_4.3.0 1:4.3 + __satfractdquha@GCC_4.3.0 1:4.3 + __satfractdquhq@GCC_4.3.0 1:4.3 + __satfractdquqq@GCC_4.3.0 1:4.3 + __satfractdqusa@GCC_4.3.0 1:4.3 + __satfractdqusq@GCC_4.3.0 1:4.3 + __satfractdquta@GCC_4.3.0 1:4.3 + __satfractdqutq@GCC_4.3.0 1:4.3 + __satfracthada2@GCC_4.3.0 1:4.3 + __satfracthadq@GCC_4.3.0 1:4.3 + __satfracthahq@GCC_4.3.0 1:4.3 + __satfracthaqq@GCC_4.3.0 1:4.3 + __satfracthasa2@GCC_4.3.0 1:4.3 + __satfracthasq@GCC_4.3.0 1:4.3 + __satfracthata2@GCC_4.3.0 1:4.3 + __satfracthatq@GCC_4.3.0 1:4.3 + __satfracthauda@GCC_4.3.0 1:4.3 + __satfracthaudq@GCC_4.3.0 1:4.3 + __satfracthauha@GCC_4.3.0 1:4.3 + __satfracthauhq@GCC_4.3.0 1:4.3 + __satfracthauqq@GCC_4.3.0 1:4.3 + __satfracthausa@GCC_4.3.0 1:4.3 + __satfracthausq@GCC_4.3.0 1:4.3 + __satfracthauta@GCC_4.3.0 1:4.3 + __satfracthautq@GCC_4.3.0 1:4.3 + __satfracthida@GCC_4.3.0 1:4.3 + __satfracthidq@GCC_4.3.0 1:4.3 + __satfracthiha@GCC_4.3.0 1:4.3 + __satfracthihq@GCC_4.3.0 1:4.3 + __satfracthiqq@GCC_4.3.0 1:4.3 + __satfracthisa@GCC_4.3.0 1:4.3 + __satfracthisq@GCC_4.3.0 1:4.3 + __satfracthita@GCC_4.3.0 1:4.3 + __satfracthitq@GCC_4.3.0 1:4.3 + __satfracthiuda@GCC_4.3.0 1:4.3 + __satfracthiudq@GCC_4.3.0 1:4.3 + __satfracthiuha@GCC_4.3.0 1:4.3 + __satfracthiuhq@GCC_4.3.0 1:4.3 + __satfracthiuqq@GCC_4.3.0 1:4.3 + __satfracthiusa@GCC_4.3.0 1:4.3 + __satfracthiusq@GCC_4.3.0 1:4.3 + __satfracthiuta@GCC_4.3.0 1:4.3 + __satfracthiutq@GCC_4.3.0 1:4.3 + __satfracthqda@GCC_4.3.0 1:4.3 + __satfracthqdq2@GCC_4.3.0 1:4.3 + __satfracthqha@GCC_4.3.0 1:4.3 + __satfracthqqq2@GCC_4.3.0 1:4.3 + __satfracthqsa@GCC_4.3.0 1:4.3 + __satfracthqsq2@GCC_4.3.0 1:4.3 + __satfracthqta@GCC_4.3.0 1:4.3 + __satfracthqtq2@GCC_4.3.0 1:4.3 + __satfracthquda@GCC_4.3.0 1:4.3 + __satfracthqudq@GCC_4.3.0 1:4.3 + __satfracthquha@GCC_4.3.0 1:4.3 + __satfracthquhq@GCC_4.3.0 1:4.3 + __satfracthquqq@GCC_4.3.0 1:4.3 + __satfracthqusa@GCC_4.3.0 1:4.3 + __satfracthqusq@GCC_4.3.0 1:4.3 + __satfracthquta@GCC_4.3.0 1:4.3 + __satfracthqutq@GCC_4.3.0 1:4.3 + __satfractqida@GCC_4.3.0 1:4.3 + __satfractqidq@GCC_4.3.0 1:4.3 + __satfractqiha@GCC_4.3.0 1:4.3 + __satfractqihq@GCC_4.3.0 1:4.3 + __satfractqiqq@GCC_4.3.0 1:4.3 + __satfractqisa@GCC_4.3.0 1:4.3 + __satfractqisq@GCC_4.3.0 1:4.3 + __satfractqita@GCC_4.3.0 1:4.3 + __satfractqitq@GCC_4.3.0 1:4.3 + __satfractqiuda@GCC_4.3.0 1:4.3 + __satfractqiudq@GCC_4.3.0 1:4.3 + __satfractqiuha@GCC_4.3.0 1:4.3 + __satfractqiuhq@GCC_4.3.0 1:4.3 + __satfractqiuqq@GCC_4.3.0 1:4.3 + __satfractqiusa@GCC_4.3.0 1:4.3 + __satfractqiusq@GCC_4.3.0 1:4.3 + __satfractqiuta@GCC_4.3.0 1:4.3 + __satfractqiutq@GCC_4.3.0 1:4.3 + __satfractqqda@GCC_4.3.0 1:4.3 + __satfractqqdq2@GCC_4.3.0 1:4.3 + __satfractqqha@GCC_4.3.0 1:4.3 + __satfractqqhq2@GCC_4.3.0 1:4.3 + __satfractqqsa@GCC_4.3.0 1:4.3 + __satfractqqsq2@GCC_4.3.0 1:4.3 + __satfractqqta@GCC_4.3.0 1:4.3 + __satfractqqtq2@GCC_4.3.0 1:4.3 + __satfractqquda@GCC_4.3.0 1:4.3 + __satfractqqudq@GCC_4.3.0 1:4.3 + __satfractqquha@GCC_4.3.0 1:4.3 + __satfractqquhq@GCC_4.3.0 1:4.3 + __satfractqquqq@GCC_4.3.0 1:4.3 + __satfractqqusa@GCC_4.3.0 1:4.3 + __satfractqqusq@GCC_4.3.0 1:4.3 + __satfractqquta@GCC_4.3.0 1:4.3 + __satfractqqutq@GCC_4.3.0 1:4.3 + __satfractsada2@GCC_4.3.0 1:4.3 + __satfractsadq@GCC_4.3.0 1:4.3 + __satfractsaha2@GCC_4.3.0 1:4.3 + __satfractsahq@GCC_4.3.0 1:4.3 + __satfractsaqq@GCC_4.3.0 1:4.3 + __satfractsasq@GCC_4.3.0 1:4.3 + __satfractsata2@GCC_4.3.0 1:4.3 + __satfractsatq@GCC_4.3.0 1:4.3 + __satfractsauda@GCC_4.3.0 1:4.3 + __satfractsaudq@GCC_4.3.0 1:4.3 + __satfractsauha@GCC_4.3.0 1:4.3 + __satfractsauhq@GCC_4.3.0 1:4.3 + __satfractsauqq@GCC_4.3.0 1:4.3 + __satfractsausa@GCC_4.3.0 1:4.3 + __satfractsausq@GCC_4.3.0 1:4.3 + __satfractsauta@GCC_4.3.0 1:4.3 + __satfractsautq@GCC_4.3.0 1:4.3 + __satfractsfda@GCC_4.3.0 1:4.3 + __satfractsfdq@GCC_4.3.0 1:4.3 + __satfractsfha@GCC_4.3.0 1:4.3 + __satfractsfhq@GCC_4.3.0 1:4.3 + __satfractsfqq@GCC_4.3.0 1:4.3 + __satfractsfsa@GCC_4.3.0 1:4.3 + __satfractsfsq@GCC_4.3.0 1:4.3 + __satfractsfta@GCC_4.3.0 1:4.3 + __satfractsftq@GCC_4.3.0 1:4.3 + __satfractsfuda@GCC_4.3.0 1:4.3 + __satfractsfudq@GCC_4.3.0 1:4.3 + __satfractsfuha@GCC_4.3.0 1:4.3 + __satfractsfuhq@GCC_4.3.0 1:4.3 + __satfractsfuqq@GCC_4.3.0 1:4.3 + __satfractsfusa@GCC_4.3.0 1:4.3 + __satfractsfusq@GCC_4.3.0 1:4.3 + __satfractsfuta@GCC_4.3.0 1:4.3 + __satfractsfutq@GCC_4.3.0 1:4.3 + __satfractsida@GCC_4.3.0 1:4.3 + __satfractsidq@GCC_4.3.0 1:4.3 + __satfractsiha@GCC_4.3.0 1:4.3 + __satfractsihq@GCC_4.3.0 1:4.3 + __satfractsiqq@GCC_4.3.0 1:4.3 + __satfractsisa@GCC_4.3.0 1:4.3 + __satfractsisq@GCC_4.3.0 1:4.3 + __satfractsita@GCC_4.3.0 1:4.3 + __satfractsitq@GCC_4.3.0 1:4.3 + __satfractsiuda@GCC_4.3.0 1:4.3 + __satfractsiudq@GCC_4.3.0 1:4.3 + __satfractsiuha@GCC_4.3.0 1:4.3 + __satfractsiuhq@GCC_4.3.0 1:4.3 + __satfractsiuqq@GCC_4.3.0 1:4.3 + __satfractsiusa@GCC_4.3.0 1:4.3 + __satfractsiusq@GCC_4.3.0 1:4.3 + __satfractsiuta@GCC_4.3.0 1:4.3 + __satfractsiutq@GCC_4.3.0 1:4.3 + __satfractsqda@GCC_4.3.0 1:4.3 + __satfractsqdq2@GCC_4.3.0 1:4.3 + __satfractsqha@GCC_4.3.0 1:4.3 + __satfractsqhq2@GCC_4.3.0 1:4.3 + __satfractsqqq2@GCC_4.3.0 1:4.3 + __satfractsqsa@GCC_4.3.0 1:4.3 + __satfractsqta@GCC_4.3.0 1:4.3 + __satfractsqtq2@GCC_4.3.0 1:4.3 + __satfractsquda@GCC_4.3.0 1:4.3 + __satfractsqudq@GCC_4.3.0 1:4.3 + __satfractsquha@GCC_4.3.0 1:4.3 + __satfractsquhq@GCC_4.3.0 1:4.3 + __satfractsquqq@GCC_4.3.0 1:4.3 + __satfractsqusa@GCC_4.3.0 1:4.3 + __satfractsqusq@GCC_4.3.0 1:4.3 + __satfractsquta@GCC_4.3.0 1:4.3 + __satfractsqutq@GCC_4.3.0 1:4.3 + __satfracttada2@GCC_4.3.0 1:4.3 + __satfracttadq@GCC_4.3.0 1:4.3 + __satfracttaha2@GCC_4.3.0 1:4.3 + __satfracttahq@GCC_4.3.0 1:4.3 + __satfracttaqq@GCC_4.3.0 1:4.3 + __satfracttasa2@GCC_4.3.0 1:4.3 + __satfracttasq@GCC_4.3.0 1:4.3 + __satfracttatq@GCC_4.3.0 1:4.3 + __satfracttauda@GCC_4.3.0 1:4.3 + __satfracttaudq@GCC_4.3.0 1:4.3 + __satfracttauha@GCC_4.3.0 1:4.3 + __satfracttauhq@GCC_4.3.0 1:4.3 + __satfracttauqq@GCC_4.3.0 1:4.3 + __satfracttausa@GCC_4.3.0 1:4.3 + __satfracttausq@GCC_4.3.0 1:4.3 + __satfracttauta@GCC_4.3.0 1:4.3 + __satfracttautq@GCC_4.3.0 1:4.3 + __satfracttida@GCC_4.3.0 1:4.3 + __satfracttidq@GCC_4.3.0 1:4.3 + __satfracttiha@GCC_4.3.0 1:4.3 + __satfracttihq@GCC_4.3.0 1:4.3 + __satfracttiqq@GCC_4.3.0 1:4.3 + __satfracttisa@GCC_4.3.0 1:4.3 + __satfracttisq@GCC_4.3.0 1:4.3 + __satfracttita@GCC_4.3.0 1:4.3 + __satfracttitq@GCC_4.3.0 1:4.3 + __satfracttiuda@GCC_4.3.0 1:4.3 + __satfracttiudq@GCC_4.3.0 1:4.3 + __satfracttiuha@GCC_4.3.0 1:4.3 + __satfracttiuhq@GCC_4.3.0 1:4.3 + __satfracttiuqq@GCC_4.3.0 1:4.3 + __satfracttiusa@GCC_4.3.0 1:4.3 + __satfracttiusq@GCC_4.3.0 1:4.3 + __satfracttiuta@GCC_4.3.0 1:4.3 + __satfracttiutq@GCC_4.3.0 1:4.3 + __satfracttqda@GCC_4.3.0 1:4.3 + __satfracttqdq2@GCC_4.3.0 1:4.3 + __satfracttqha@GCC_4.3.0 1:4.3 + __satfracttqhq2@GCC_4.3.0 1:4.3 + __satfracttqqq2@GCC_4.3.0 1:4.3 + __satfracttqsa@GCC_4.3.0 1:4.3 + __satfracttqsq2@GCC_4.3.0 1:4.3 + __satfracttqta@GCC_4.3.0 1:4.3 + __satfracttquda@GCC_4.3.0 1:4.3 + __satfracttqudq@GCC_4.3.0 1:4.3 + __satfracttquha@GCC_4.3.0 1:4.3 + __satfracttquhq@GCC_4.3.0 1:4.3 + __satfracttquqq@GCC_4.3.0 1:4.3 + __satfracttqusa@GCC_4.3.0 1:4.3 + __satfracttqusq@GCC_4.3.0 1:4.3 + __satfracttquta@GCC_4.3.0 1:4.3 + __satfracttqutq@GCC_4.3.0 1:4.3 + __satfractudada@GCC_4.3.0 1:4.3 + __satfractudadq@GCC_4.3.0 1:4.3 + __satfractudaha@GCC_4.3.0 1:4.3 + __satfractudahq@GCC_4.3.0 1:4.3 + __satfractudaqq@GCC_4.3.0 1:4.3 + __satfractudasa@GCC_4.3.0 1:4.3 + __satfractudasq@GCC_4.3.0 1:4.3 + __satfractudata@GCC_4.3.0 1:4.3 + __satfractudatq@GCC_4.3.0 1:4.3 + __satfractudaudq@GCC_4.3.0 1:4.3 + __satfractudauha2@GCC_4.3.0 1:4.3 + __satfractudauhq@GCC_4.3.0 1:4.3 + __satfractudauqq@GCC_4.3.0 1:4.3 + __satfractudausa2@GCC_4.3.0 1:4.3 + __satfractudausq@GCC_4.3.0 1:4.3 + __satfractudauta2@GCC_4.3.0 1:4.3 + __satfractudautq@GCC_4.3.0 1:4.3 + __satfractudqda@GCC_4.3.0 1:4.3 + __satfractudqdq@GCC_4.3.0 1:4.3 + __satfractudqha@GCC_4.3.0 1:4.3 + __satfractudqhq@GCC_4.3.0 1:4.3 + __satfractudqqq@GCC_4.3.0 1:4.3 + __satfractudqsa@GCC_4.3.0 1:4.3 + __satfractudqsq@GCC_4.3.0 1:4.3 + __satfractudqta@GCC_4.3.0 1:4.3 + __satfractudqtq@GCC_4.3.0 1:4.3 + __satfractudquda@GCC_4.3.0 1:4.3 + __satfractudquha@GCC_4.3.0 1:4.3 + __satfractudquhq2@GCC_4.3.0 1:4.3 + __satfractudquqq2@GCC_4.3.0 1:4.3 + __satfractudqusa@GCC_4.3.0 1:4.3 + __satfractudqusq2@GCC_4.3.0 1:4.3 + __satfractudquta@GCC_4.3.0 1:4.3 + __satfractudqutq2@GCC_4.3.0 1:4.3 + __satfractuhada@GCC_4.3.0 1:4.3 + __satfractuhadq@GCC_4.3.0 1:4.3 + __satfractuhaha@GCC_4.3.0 1:4.3 + __satfractuhahq@GCC_4.3.0 1:4.3 + __satfractuhaqq@GCC_4.3.0 1:4.3 + __satfractuhasa@GCC_4.3.0 1:4.3 + __satfractuhasq@GCC_4.3.0 1:4.3 + __satfractuhata@GCC_4.3.0 1:4.3 + __satfractuhatq@GCC_4.3.0 1:4.3 + __satfractuhauda2@GCC_4.3.0 1:4.3 + __satfractuhaudq@GCC_4.3.0 1:4.3 + __satfractuhauhq@GCC_4.3.0 1:4.3 + __satfractuhauqq@GCC_4.3.0 1:4.3 + __satfractuhausa2@GCC_4.3.0 1:4.3 + __satfractuhausq@GCC_4.3.0 1:4.3 + __satfractuhauta2@GCC_4.3.0 1:4.3 + __satfractuhautq@GCC_4.3.0 1:4.3 + __satfractuhqda@GCC_4.3.0 1:4.3 + __satfractuhqdq@GCC_4.3.0 1:4.3 + __satfractuhqha@GCC_4.3.0 1:4.3 + __satfractuhqhq@GCC_4.3.0 1:4.3 + __satfractuhqqq@GCC_4.3.0 1:4.3 + __satfractuhqsa@GCC_4.3.0 1:4.3 + __satfractuhqsq@GCC_4.3.0 1:4.3 + __satfractuhqta@GCC_4.3.0 1:4.3 + __satfractuhqtq@GCC_4.3.0 1:4.3 + __satfractuhquda@GCC_4.3.0 1:4.3 + __satfractuhqudq2@GCC_4.3.0 1:4.3 + __satfractuhquha@GCC_4.3.0 1:4.3 + __satfractuhquqq2@GCC_4.3.0 1:4.3 + __satfractuhqusa@GCC_4.3.0 1:4.3 + __satfractuhqusq2@GCC_4.3.0 1:4.3 + __satfractuhquta@GCC_4.3.0 1:4.3 + __satfractuhqutq2@GCC_4.3.0 1:4.3 + __satfractunsdida@GCC_4.3.0 1:4.3 + __satfractunsdidq@GCC_4.3.0 1:4.3 + __satfractunsdiha@GCC_4.3.0 1:4.3 + __satfractunsdihq@GCC_4.3.0 1:4.3 + __satfractunsdiqq@GCC_4.3.0 1:4.3 + __satfractunsdisa@GCC_4.3.0 1:4.3 + __satfractunsdisq@GCC_4.3.0 1:4.3 + __satfractunsdita@GCC_4.3.0 1:4.3 + __satfractunsditq@GCC_4.3.0 1:4.3 + __satfractunsdiuda@GCC_4.3.0 1:4.3 + __satfractunsdiudq@GCC_4.3.0 1:4.3 + __satfractunsdiuha@GCC_4.3.0 1:4.3 + __satfractunsdiuhq@GCC_4.3.0 1:4.3 + __satfractunsdiuqq@GCC_4.3.0 1:4.3 + __satfractunsdiusa@GCC_4.3.0 1:4.3 + __satfractunsdiusq@GCC_4.3.0 1:4.3 + __satfractunsdiuta@GCC_4.3.0 1:4.3 + __satfractunsdiutq@GCC_4.3.0 1:4.3 + __satfractunshida@GCC_4.3.0 1:4.3 + __satfractunshidq@GCC_4.3.0 1:4.3 + __satfractunshiha@GCC_4.3.0 1:4.3 + __satfractunshihq@GCC_4.3.0 1:4.3 + __satfractunshiqq@GCC_4.3.0 1:4.3 + __satfractunshisa@GCC_4.3.0 1:4.3 + __satfractunshisq@GCC_4.3.0 1:4.3 + __satfractunshita@GCC_4.3.0 1:4.3 + __satfractunshitq@GCC_4.3.0 1:4.3 + __satfractunshiuda@GCC_4.3.0 1:4.3 + __satfractunshiudq@GCC_4.3.0 1:4.3 + __satfractunshiuha@GCC_4.3.0 1:4.3 + __satfractunshiuhq@GCC_4.3.0 1:4.3 + __satfractunshiuqq@GCC_4.3.0 1:4.3 + __satfractunshiusa@GCC_4.3.0 1:4.3 + __satfractunshiusq@GCC_4.3.0 1:4.3 + __satfractunshiuta@GCC_4.3.0 1:4.3 + __satfractunshiutq@GCC_4.3.0 1:4.3 + __satfractunsqida@GCC_4.3.0 1:4.3 + __satfractunsqidq@GCC_4.3.0 1:4.3 + __satfractunsqiha@GCC_4.3.0 1:4.3 + __satfractunsqihq@GCC_4.3.0 1:4.3 + __satfractunsqiqq@GCC_4.3.0 1:4.3 + __satfractunsqisa@GCC_4.3.0 1:4.3 + __satfractunsqisq@GCC_4.3.0 1:4.3 + __satfractunsqita@GCC_4.3.0 1:4.3 + __satfractunsqitq@GCC_4.3.0 1:4.3 + __satfractunsqiuda@GCC_4.3.0 1:4.3 + __satfractunsqiudq@GCC_4.3.0 1:4.3 + __satfractunsqiuha@GCC_4.3.0 1:4.3 + __satfractunsqiuhq@GCC_4.3.0 1:4.3 + __satfractunsqiuqq@GCC_4.3.0 1:4.3 + __satfractunsqiusa@GCC_4.3.0 1:4.3 + __satfractunsqiusq@GCC_4.3.0 1:4.3 + __satfractunsqiuta@GCC_4.3.0 1:4.3 + __satfractunsqiutq@GCC_4.3.0 1:4.3 + __satfractunssida@GCC_4.3.0 1:4.3 + __satfractunssidq@GCC_4.3.0 1:4.3 + __satfractunssiha@GCC_4.3.0 1:4.3 + __satfractunssihq@GCC_4.3.0 1:4.3 + __satfractunssiqq@GCC_4.3.0 1:4.3 + __satfractunssisa@GCC_4.3.0 1:4.3 + __satfractunssisq@GCC_4.3.0 1:4.3 + __satfractunssita@GCC_4.3.0 1:4.3 + __satfractunssitq@GCC_4.3.0 1:4.3 + __satfractunssiuda@GCC_4.3.0 1:4.3 + __satfractunssiudq@GCC_4.3.0 1:4.3 + __satfractunssiuha@GCC_4.3.0 1:4.3 + __satfractunssiuhq@GCC_4.3.0 1:4.3 + __satfractunssiuqq@GCC_4.3.0 1:4.3 + __satfractunssiusa@GCC_4.3.0 1:4.3 + __satfractunssiusq@GCC_4.3.0 1:4.3 + __satfractunssiuta@GCC_4.3.0 1:4.3 + __satfractunssiutq@GCC_4.3.0 1:4.3 + __satfractunstida@GCC_4.3.0 1:4.3 + __satfractunstidq@GCC_4.3.0 1:4.3 + __satfractunstiha@GCC_4.3.0 1:4.3 + __satfractunstihq@GCC_4.3.0 1:4.3 + __satfractunstiqq@GCC_4.3.0 1:4.3 + __satfractunstisa@GCC_4.3.0 1:4.3 + __satfractunstisq@GCC_4.3.0 1:4.3 + __satfractunstita@GCC_4.3.0 1:4.3 + __satfractunstitq@GCC_4.3.0 1:4.3 + __satfractunstiuda@GCC_4.3.0 1:4.3 + __satfractunstiudq@GCC_4.3.0 1:4.3 + __satfractunstiuha@GCC_4.3.0 1:4.3 + __satfractunstiuhq@GCC_4.3.0 1:4.3 + __satfractunstiuqq@GCC_4.3.0 1:4.3 + __satfractunstiusa@GCC_4.3.0 1:4.3 + __satfractunstiusq@GCC_4.3.0 1:4.3 + __satfractunstiuta@GCC_4.3.0 1:4.3 + __satfractunstiutq@GCC_4.3.0 1:4.3 + __satfractuqqda@GCC_4.3.0 1:4.3 + __satfractuqqdq@GCC_4.3.0 1:4.3 + __satfractuqqha@GCC_4.3.0 1:4.3 + __satfractuqqhq@GCC_4.3.0 1:4.3 + __satfractuqqqq@GCC_4.3.0 1:4.3 + __satfractuqqsa@GCC_4.3.0 1:4.3 + __satfractuqqsq@GCC_4.3.0 1:4.3 + __satfractuqqta@GCC_4.3.0 1:4.3 + __satfractuqqtq@GCC_4.3.0 1:4.3 + __satfractuqquda@GCC_4.3.0 1:4.3 + __satfractuqqudq2@GCC_4.3.0 1:4.3 + __satfractuqquha@GCC_4.3.0 1:4.3 + __satfractuqquhq2@GCC_4.3.0 1:4.3 + __satfractuqqusa@GCC_4.3.0 1:4.3 + __satfractuqqusq2@GCC_4.3.0 1:4.3 + __satfractuqquta@GCC_4.3.0 1:4.3 + __satfractuqqutq2@GCC_4.3.0 1:4.3 + __satfractusada@GCC_4.3.0 1:4.3 + __satfractusadq@GCC_4.3.0 1:4.3 + __satfractusaha@GCC_4.3.0 1:4.3 + __satfractusahq@GCC_4.3.0 1:4.3 + __satfractusaqq@GCC_4.3.0 1:4.3 + __satfractusasa@GCC_4.3.0 1:4.3 + __satfractusasq@GCC_4.3.0 1:4.3 + __satfractusata@GCC_4.3.0 1:4.3 + __satfractusatq@GCC_4.3.0 1:4.3 + __satfractusauda2@GCC_4.3.0 1:4.3 + __satfractusaudq@GCC_4.3.0 1:4.3 + __satfractusauha2@GCC_4.3.0 1:4.3 + __satfractusauhq@GCC_4.3.0 1:4.3 + __satfractusauqq@GCC_4.3.0 1:4.3 + __satfractusausq@GCC_4.3.0 1:4.3 + __satfractusauta2@GCC_4.3.0 1:4.3 + __satfractusautq@GCC_4.3.0 1:4.3 + __satfractusqda@GCC_4.3.0 1:4.3 + __satfractusqdq@GCC_4.3.0 1:4.3 + __satfractusqha@GCC_4.3.0 1:4.3 + __satfractusqhq@GCC_4.3.0 1:4.3 + __satfractusqqq@GCC_4.3.0 1:4.3 + __satfractusqsa@GCC_4.3.0 1:4.3 + __satfractusqsq@GCC_4.3.0 1:4.3 + __satfractusqta@GCC_4.3.0 1:4.3 + __satfractusqtq@GCC_4.3.0 1:4.3 + __satfractusquda@GCC_4.3.0 1:4.3 + __satfractusqudq2@GCC_4.3.0 1:4.3 + __satfractusquha@GCC_4.3.0 1:4.3 + __satfractusquhq2@GCC_4.3.0 1:4.3 + __satfractusquqq2@GCC_4.3.0 1:4.3 + __satfractusqusa@GCC_4.3.0 1:4.3 + __satfractusquta@GCC_4.3.0 1:4.3 + __satfractusqutq2@GCC_4.3.0 1:4.3 + __satfractutada@GCC_4.3.0 1:4.3 + __satfractutadq@GCC_4.3.0 1:4.3 + __satfractutaha@GCC_4.3.0 1:4.3 + __satfractutahq@GCC_4.3.0 1:4.3 + __satfractutaqq@GCC_4.3.0 1:4.3 + __satfractutasa@GCC_4.3.0 1:4.3 + __satfractutasq@GCC_4.3.0 1:4.3 + __satfractutata@GCC_4.3.0 1:4.3 + __satfractutatq@GCC_4.3.0 1:4.3 + __satfractutauda2@GCC_4.3.0 1:4.3 + __satfractutaudq@GCC_4.3.0 1:4.3 + __satfractutauha2@GCC_4.3.0 1:4.3 + __satfractutauhq@GCC_4.3.0 1:4.3 + __satfractutauqq@GCC_4.3.0 1:4.3 + __satfractutausa2@GCC_4.3.0 1:4.3 + __satfractutausq@GCC_4.3.0 1:4.3 + __satfractutautq@GCC_4.3.0 1:4.3 + __satfractutqda@GCC_4.3.0 1:4.3 + __satfractutqdq@GCC_4.3.0 1:4.3 + __satfractutqha@GCC_4.3.0 1:4.3 + __satfractutqhq@GCC_4.3.0 1:4.3 + __satfractutqqq@GCC_4.3.0 1:4.3 + __satfractutqsa@GCC_4.3.0 1:4.3 + __satfractutqsq@GCC_4.3.0 1:4.3 + __satfractutqta@GCC_4.3.0 1:4.3 + __satfractutqtq@GCC_4.3.0 1:4.3 + __satfractutquda@GCC_4.3.0 1:4.3 + __satfractutqudq2@GCC_4.3.0 1:4.3 + __satfractutquha@GCC_4.3.0 1:4.3 + __satfractutquhq2@GCC_4.3.0 1:4.3 + __satfractutquqq2@GCC_4.3.0 1:4.3 + __satfractutqusa@GCC_4.3.0 1:4.3 + __satfractutqusq2@GCC_4.3.0 1:4.3 + __satfractutquta@GCC_4.3.0 1:4.3 + __ssaddda3@GCC_4.3.0 1:4.3 + __ssadddq3@GCC_4.3.0 1:4.3 + __ssaddha3@GCC_4.3.0 1:4.3 + __ssaddhq3@GCC_4.3.0 1:4.3 + __ssaddqq3@GCC_4.3.0 1:4.3 + __ssaddsa3@GCC_4.3.0 1:4.3 + __ssaddsq3@GCC_4.3.0 1:4.3 + __ssaddta3@GCC_4.3.0 1:4.3 + __ssaddtq3@GCC_4.3.0 1:4.3 + __ssashlda3@GCC_4.3.0 1:4.3 + __ssashldq3@GCC_4.3.0 1:4.3 + __ssashlha3@GCC_4.3.0 1:4.3 + __ssashlhq3@GCC_4.3.0 1:4.3 + __ssashlqq3@GCC_4.3.0 1:4.3 + __ssashlsa3@GCC_4.3.0 1:4.3 + __ssashlsq3@GCC_4.3.0 1:4.3 + __ssashlta3@GCC_4.3.0 1:4.3 + __ssashltq3@GCC_4.3.0 1:4.3 + __ssdivda3@GCC_4.3.0 1:4.3 + __ssdivdq3@GCC_4.3.0 1:4.3 + __ssdivha3@GCC_4.3.0 1:4.3 + __ssdivhq3@GCC_4.3.0 1:4.3 + __ssdivqq3@GCC_4.3.0 1:4.3 + __ssdivsa3@GCC_4.3.0 1:4.3 + __ssdivsq3@GCC_4.3.0 1:4.3 + __ssdivta3@GCC_4.3.0 1:4.3 + __ssdivtq3@GCC_4.3.0 1:4.3 + __ssmulda3@GCC_4.3.0 1:4.3 + __ssmuldq3@GCC_4.3.0 1:4.3 + __ssmulha3@GCC_4.3.0 1:4.3 + __ssmulhq3@GCC_4.3.0 1:4.3 + __ssmulqq3@GCC_4.3.0 1:4.3 + __ssmulsa3@GCC_4.3.0 1:4.3 + __ssmulsq3@GCC_4.3.0 1:4.3 + __ssmulta3@GCC_4.3.0 1:4.3 + __ssmultq3@GCC_4.3.0 1:4.3 + __ssnegda2@GCC_4.3.0 1:4.3 + __ssnegdq2@GCC_4.3.0 1:4.3 + __ssnegha2@GCC_4.3.0 1:4.3 + __ssneghq2@GCC_4.3.0 1:4.3 + __ssnegqq2@GCC_4.3.0 1:4.3 + __ssnegsa2@GCC_4.3.0 1:4.3 + __ssnegsq2@GCC_4.3.0 1:4.3 + __ssnegta2@GCC_4.3.0 1:4.3 + __ssnegtq2@GCC_4.3.0 1:4.3 + __sssubda3@GCC_4.3.0 1:4.3 + __sssubdq3@GCC_4.3.0 1:4.3 + __sssubha3@GCC_4.3.0 1:4.3 + __sssubhq3@GCC_4.3.0 1:4.3 + __sssubqq3@GCC_4.3.0 1:4.3 + __sssubsa3@GCC_4.3.0 1:4.3 + __sssubsq3@GCC_4.3.0 1:4.3 + __sssubta3@GCC_4.3.0 1:4.3 + __sssubtq3@GCC_4.3.0 1:4.3 + __subda3@GCC_4.3.0 1:4.3 + __subdf3@GCC_3.0 1:4.1.1 + __subdq3@GCC_4.3.0 1:4.3 + __subha3@GCC_4.3.0 1:4.3 + __subhq3@GCC_4.3.0 1:4.3 + __subqq3@GCC_4.3.0 1:4.3 + __subsa3@GCC_4.3.0 1:4.3 + __subsf3@GCC_3.0 1:4.1.1 + __subsq3@GCC_4.3.0 1:4.3 + __subta3@GCC_4.3.0 1:4.3 + __subtf3@GCC_3.0 1:4.1.1 + __subtq3@GCC_4.3.0 1:4.3 + __subuda3@GCC_4.3.0 1:4.3 + __subudq3@GCC_4.3.0 1:4.3 + __subuha3@GCC_4.3.0 1:4.3 + __subuhq3@GCC_4.3.0 1:4.3 + __subuqq3@GCC_4.3.0 1:4.3 + __subusa3@GCC_4.3.0 1:4.3 + __subusq3@GCC_4.3.0 1:4.3 + __subuta3@GCC_4.3.0 1:4.3 + __subutq3@GCC_4.3.0 1:4.3 + __subvdi3@GCC_3.0 1:4.1.1 + __subvsi3@GCC_3.0 1:4.1.1 + __subvti3@GCC_3.4.4 1:4.1.1 + __sync_add_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_add_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_and_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_bool_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_add_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_and_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_nand_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_or_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_sub_8@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_1@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_2@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_4@GCC_4.4.0 1:4.4 + __sync_fetch_and_xor_8@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_1@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_2@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_4@GCC_4.4.0 1:4.4 + __sync_lock_test_and_set_8@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_nand_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_or_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_sub_and_fetch_8@GCC_4.4.0 1:4.4 + __sync_synchronize@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_1@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_2@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_4@GCC_4.4.0 1:4.4 + __sync_val_compare_and_swap_8@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_1@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_2@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_4@GCC_4.4.0 1:4.4 + __sync_xor_and_fetch_8@GCC_4.4.0 1:4.4 + __truncdfsf2@GCC_3.0 1:4.1.1 + __trunctfdf2@GCC_3.0 1:4.1.1 + __trunctfsf2@GCC_3.0 1:4.1.1 + __ucmpti2@GCC_3.0 1:4.1.1 + __udivmodti4@GCC_3.0 1:4.1.1 + __udivti3@GCC_3.0 1:4.1.1 + __udivuda3@GCC_4.3.0 1:4.3 + __udivudq3@GCC_4.3.0 1:4.3 + __udivuha3@GCC_4.3.0 1:4.3 + __udivuhq3@GCC_4.3.0 1:4.3 + __udivuqq3@GCC_4.3.0 1:4.3 + __udivusa3@GCC_4.3.0 1:4.3 + __udivusq3@GCC_4.3.0 1:4.3 + __udivuta3@GCC_4.3.0 1:4.3 + __udivutq3@GCC_4.3.0 1:4.3 + __umodti3@GCC_3.0 1:4.1.1 + __unorddf2@GCC_3.3.4 1:4.1.1 + __unordsf2@GCC_3.3.4 1:4.1.1 + __unordtf2@GCC_4.5.0 1:4.5 + __usadduda3@GCC_4.3.0 1:4.3 + __usaddudq3@GCC_4.3.0 1:4.3 + __usadduha3@GCC_4.3.0 1:4.3 + __usadduhq3@GCC_4.3.0 1:4.3 + __usadduqq3@GCC_4.3.0 1:4.3 + __usaddusa3@GCC_4.3.0 1:4.3 + __usaddusq3@GCC_4.3.0 1:4.3 + __usadduta3@GCC_4.3.0 1:4.3 + __usaddutq3@GCC_4.3.0 1:4.3 + __usashluda3@GCC_4.3.0 1:4.3 + __usashludq3@GCC_4.3.0 1:4.3 + __usashluha3@GCC_4.3.0 1:4.3 + __usashluhq3@GCC_4.3.0 1:4.3 + __usashluqq3@GCC_4.3.0 1:4.3 + __usashlusa3@GCC_4.3.0 1:4.3 + __usashlusq3@GCC_4.3.0 1:4.3 + __usashluta3@GCC_4.3.0 1:4.3 + __usashlutq3@GCC_4.3.0 1:4.3 + __usdivuda3@GCC_4.3.0 1:4.3 + __usdivudq3@GCC_4.3.0 1:4.3 + __usdivuha3@GCC_4.3.0 1:4.3 + __usdivuhq3@GCC_4.3.0 1:4.3 + __usdivuqq3@GCC_4.3.0 1:4.3 + __usdivusa3@GCC_4.3.0 1:4.3 + __usdivusq3@GCC_4.3.0 1:4.3 + __usdivuta3@GCC_4.3.0 1:4.3 + __usdivutq3@GCC_4.3.0 1:4.3 + __usmuluda3@GCC_4.3.0 1:4.3 + __usmuludq3@GCC_4.3.0 1:4.3 + __usmuluha3@GCC_4.3.0 1:4.3 + __usmuluhq3@GCC_4.3.0 1:4.3 + __usmuluqq3@GCC_4.3.0 1:4.3 + __usmulusa3@GCC_4.3.0 1:4.3 + __usmulusq3@GCC_4.3.0 1:4.3 + __usmuluta3@GCC_4.3.0 1:4.3 + __usmulutq3@GCC_4.3.0 1:4.3 + __usneguda2@GCC_4.3.0 1:4.3 + __usnegudq2@GCC_4.3.0 1:4.3 + __usneguha2@GCC_4.3.0 1:4.3 + __usneguhq2@GCC_4.3.0 1:4.3 + __usneguqq2@GCC_4.3.0 1:4.3 + __usnegusa2@GCC_4.3.0 1:4.3 + __usnegusq2@GCC_4.3.0 1:4.3 + __usneguta2@GCC_4.3.0 1:4.3 + __usnegutq2@GCC_4.3.0 1:4.3 + __ussubuda3@GCC_4.3.0 1:4.3 + __ussubudq3@GCC_4.3.0 1:4.3 + __ussubuha3@GCC_4.3.0 1:4.3 + __ussubuhq3@GCC_4.3.0 1:4.3 + __ussubuqq3@GCC_4.3.0 1:4.3 + __ussubusa3@GCC_4.3.0 1:4.3 + __ussubusq3@GCC_4.3.0 1:4.3 + __ussubuta3@GCC_4.3.0 1:4.3 + __ussubutq3@GCC_4.3.0 1:4.3 --- gcc-4.8-4.8.2.orig/debian/libobjc4.symbols +++ gcc-4.8-4.8.2/debian/libobjc4.symbols @@ -0,0 +1,3 @@ +libobjc.so.4 libobjc4 #MINVER# +#include "libobjc4.symbols.common" + __gnu_objc_personality_v0@Base 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libobjc4.symbols.armel +++ gcc-4.8-4.8.2/debian/libobjc4.symbols.armel @@ -0,0 +1,4 @@ +libobjc.so.4 libobjc4 #MINVER# +#include "libobjc4.symbols.common" + __gnu_objc_personality_v0@Base 4.2.1 + __objc_exception_class@Base 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libobjc4.symbols.armhf +++ gcc-4.8-4.8.2/debian/libobjc4.symbols.armhf @@ -0,0 +1,4 @@ +libobjc.so.4 libobjc4 #MINVER# +#include "libobjc4.symbols.common" + __gnu_objc_personality_v0@Base 4.2.1 + __objc_exception_class@Base 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libobjc4.symbols.common +++ gcc-4.8-4.8.2/debian/libobjc4.symbols.common @@ -0,0 +1,205 @@ + __objc_accessors_init@Base 4.6 + __objc_add_class_to_hash@Base 4.2.1 + __objc_class_links_resolved@Base 4.2.1 + __objc_class_name_NXConstantString@Base 4.2.1 + __objc_class_name_Object@Base 4.2.1 + __objc_class_name_Protocol@Base 4.2.1 + __objc_dangling_categories@Base 4.2.1 + __objc_exec_class@Base 4.2.1 + __objc_force_linking@Base 4.2.1 + __objc_generate_gc_type_description@Base 4.2.1 + __objc_get_forward_imp@Base 4.2.1 + __objc_init_class@Base 4.6 + __objc_init_class_tables@Base 4.2.1 + __objc_init_dispatch_tables@Base 4.2.1 + __objc_init_selector_tables@Base 4.2.1 + __objc_init_thread_system@Base 4.2.1 + __objc_install_premature_dtable@Base 4.2.1 + __objc_is_multi_threaded@Base 4.2.1 + __objc_linking@Base 4.2.1 + __objc_msg_forward@Base 4.2.1 + __objc_msg_forward2@Base 4.3 + __objc_print_dtable_stats@Base 4.2.1 + __objc_protocols_add_protocol@Base 4.6 + __objc_protocols_init@Base 4.6 + __objc_register_instance_methods_to_class@Base 4.2.1 + __objc_register_selectors_from_class@Base 4.2.1 + __objc_register_selectors_from_description_list@Base 4.6 + __objc_register_selectors_from_list@Base 4.2.1 + __objc_register_selectors_from_module@Base 4.6 + __objc_resolve_class_links@Base 4.2.1 + __objc_responds_to@Base 4.2.1 + __objc_runtime_mutex@Base 4.2.1 + __objc_runtime_threads_alive@Base 4.2.1 + __objc_selector_max_index@Base 4.2.1 + __objc_sparse2_id@Base 4.2.1 + __objc_sync_init@Base 4.6 + __objc_thread_exit_status@Base 4.2.1 + __objc_uninstalled_dtable@Base 4.2.1 + __objc_update_classes_with_methods@Base 4.6 + __objc_update_dispatch_table_for_class@Base 4.2.1 + _objc_abort@Base 4.6 + _objc_became_multi_threaded@Base 4.2.1 + _objc_load_callback@Base 4.2.1 + _objc_lookup_class@Base 4.6 + class_addIvar@Base 4.6 + class_addMethod@Base 4.6 + class_addProtocol@Base 4.6 + class_add_method_list@Base 4.2.1 + class_conformsToProtocol@Base 4.6 + class_copyIvarList@Base 4.6 + class_copyMethodList@Base 4.6 + class_copyPropertyList@Base 4.6 + class_copyProtocolList@Base 4.6 + class_createInstance@Base 4.6 + class_getClassMethod@Base 4.6 + class_getClassVariable@Base 4.6 + class_getInstanceMethod@Base 4.6 + class_getInstanceSize@Base 4.6 + class_getInstanceVariable@Base 4.6 + class_getIvarLayout@Base 4.6 + class_getMethodImplementation@Base 4.6 + class_getName@Base 4.6 + class_getProperty@Base 4.6 + class_getSuperclass@Base 4.6 + class_getVersion@Base 4.6 + class_getWeakIvarLayout@Base 4.6 + class_isMetaClass@Base 4.6 + class_ivar_set_gcinvisible@Base 4.2.1 + class_replaceMethod@Base 4.6 + class_respondsToSelector@Base 4.6 + class_setIvarLayout@Base 4.6 + class_setVersion@Base 4.6 + class_setWeakIvarLayout@Base 4.6 + get_imp@Base 4.2.1 + idxsize@Base 4.2.1 + ivar_getName@Base 4.6 + ivar_getOffset@Base 4.6 + ivar_getTypeEncoding@Base 4.6 + method_copyArgumentType@Base 4.6 + method_copyReturnType@Base 4.6 + method_exchangeImplementations@Base 4.6 + method_getArgumentType@Base 4.6 + method_getDescription@Base 4.6 + method_getImplementation@Base 4.6 + method_getName@Base 4.6 + method_getNumberOfArguments@Base 4.6 + method_getReturnType@Base 4.6 + method_getTypeEncoding@Base 4.6 + method_get_imp@Base 4.6 + method_setImplementation@Base 4.6 + narrays@Base 4.2.1 + nbuckets@Base 4.2.1 + nil_method@Base 4.2.1 + nindices@Base 4.2.1 + objc_aligned_size@Base 4.2.1 + objc_alignof_type@Base 4.2.1 + objc_allocateClassPair@Base 4.6 + objc_atomic_malloc@Base 4.2.1 + objc_calloc@Base 4.2.1 + objc_condition_allocate@Base 4.2.1 + objc_condition_broadcast@Base 4.2.1 + objc_condition_deallocate@Base 4.2.1 + objc_condition_signal@Base 4.2.1 + objc_condition_wait@Base 4.2.1 + objc_copyProtocolList@Base 4.6 + objc_copyStruct@Base 4.6 + objc_disposeClassPair@Base 4.6 + objc_enumerationMutation@Base 4.6 + objc_exception_throw@Base 4.2.1 + objc_free@Base 4.2.1 + objc_getClass@Base 4.6 + objc_getClassList@Base 4.6 + objc_getMetaClass@Base 4.6 + objc_getProperty@Base 4.6 + objc_getPropertyStruct@Base 4.6 + objc_getProtocol@Base 4.6 + objc_getRequiredClass@Base 4.6 + objc_get_class@Base 4.2.1 + objc_get_meta_class@Base 4.2.1 + objc_get_type_qualifiers@Base 4.2.1 + objc_hash_add@Base 4.2.1 + objc_hash_delete@Base 4.2.1 + objc_hash_is_key_in_hash@Base 4.2.1 + objc_hash_new@Base 4.2.1 + objc_hash_next@Base 4.2.1 + objc_hash_remove@Base 4.2.1 + objc_hash_value_for_key@Base 4.2.1 + objc_layout_finish_structure@Base 4.2.1 + objc_layout_structure@Base 4.2.1 + objc_layout_structure_get_info@Base 4.2.1 + objc_layout_structure_next_member@Base 4.2.1 + objc_lookUpClass@Base 4.6 + objc_lookup_class@Base 4.2.1 + objc_malloc@Base 4.2.1 + objc_msg_lookup@Base 4.2.1 + objc_msg_lookup_super@Base 4.2.1 + objc_mutex_allocate@Base 4.2.1 + objc_mutex_deallocate@Base 4.2.1 + objc_mutex_lock@Base 4.2.1 + objc_mutex_trylock@Base 4.2.1 + objc_mutex_unlock@Base 4.2.1 + objc_promoted_size@Base 4.2.1 + objc_realloc@Base 4.2.1 + objc_registerClassPair@Base 4.6 + objc_setEnumerationMutationHandler@Base 4.6 + objc_setExceptionMatcher@Base 4.6 + objc_setGetUnknownClassHandler@Base 4.6 + objc_setProperty@Base 4.6 + objc_setPropertyStruct@Base 4.6 + objc_setUncaughtExceptionHandler@Base 4.6 + objc_set_thread_callback@Base 4.2.1 + objc_sizeof_type@Base 4.2.1 + objc_skip_argspec@Base 4.2.1 + objc_skip_offset@Base 4.2.1 + objc_skip_type_qualifiers@Base 4.2.1 + objc_skip_typespec@Base 4.2.1 + objc_sync_enter@Base 4.6 + objc_sync_exit@Base 4.6 + objc_thread_add@Base 4.2.1 + objc_thread_detach@Base 4.2.1 + objc_thread_exit@Base 4.2.1 + objc_thread_get_data@Base 4.2.1 + objc_thread_get_priority@Base 4.2.1 + objc_thread_id@Base 4.2.1 + objc_thread_remove@Base 4.2.1 + objc_thread_set_data@Base 4.2.1 + objc_thread_set_priority@Base 4.2.1 + objc_thread_yield@Base 4.2.1 + object_copy@Base 4.2.1 + object_dispose@Base 4.2.1 + object_getClassName@Base 4.6 + object_getIndexedIvars@Base 4.6 + object_getInstanceVariable@Base 4.6 + object_getIvar@Base 4.6 + object_setClass@Base 4.6 + object_setInstanceVariable@Base 4.6 + object_setIvar@Base 4.6 + property_getAttributes@Base 4.6 + property_getName@Base 4.6 + protocol_conformsToProtocol@Base 4.6 + protocol_copyMethodDescriptionList@Base 4.6 + protocol_copyPropertyList@Base 4.6 + protocol_copyProtocolList@Base 4.6 + protocol_getMethodDescription@Base 4.6 + protocol_getName@Base 4.6 + protocol_getProperty@Base 4.6 + protocol_isEqual@Base 4.6 + sarray_at_put@Base 4.2.1 + sarray_at_put_safe@Base 4.2.1 + sarray_free@Base 4.2.1 + sarray_lazy_copy@Base 4.2.1 + sarray_new@Base 4.2.1 + sarray_realloc@Base 4.2.1 + sarray_remove_garbage@Base 4.2.1 + search_for_method_in_list@Base 4.2.1 + sel_copyTypedSelectorList@Base 4.6 + sel_getName@Base 4.6 + sel_getTypeEncoding@Base 4.6 + sel_getTypedSelector@Base 4.6 + sel_getUid@Base 4.6 + sel_get_any_uid@Base 4.2.1 + sel_isEqual@Base 4.6 + sel_is_mapped@Base 4.2.1 + sel_registerName@Base 4.6 + sel_registerTypedName@Base 4.6 --- gcc-4.8-4.8.2.orig/debian/libquadmath0.symbols +++ gcc-4.8-4.8.2/debian/libquadmath0.symbols @@ -0,0 +1,2 @@ +libquadmath.so.0 libquadmath0 #MINVER# +#include "libquadmath0.symbols.common" --- gcc-4.8-4.8.2.orig/debian/libquadmath0.symbols.common +++ gcc-4.8-4.8.2/debian/libquadmath0.symbols.common @@ -0,0 +1,92 @@ + QUADMATH_1.0@QUADMATH_1.0 4.6 + acoshq@QUADMATH_1.0 4.6 + acosq@QUADMATH_1.0 4.6 + asinhq@QUADMATH_1.0 4.6 + asinq@QUADMATH_1.0 4.6 + atan2q@QUADMATH_1.0 4.6 + atanhq@QUADMATH_1.0 4.6 + atanq@QUADMATH_1.0 4.6 + cabsq@QUADMATH_1.0 4.6 + cacoshq@QUADMATH_1.0 4.6 + cacosq@QUADMATH_1.0 4.6 + cargq@QUADMATH_1.0 4.6 + casinhq@QUADMATH_1.0 4.6 + casinq@QUADMATH_1.0 4.6 + catanhq@QUADMATH_1.0 4.6 + catanq@QUADMATH_1.0 4.6 + cbrtq@QUADMATH_1.0 4.6 + ccoshq@QUADMATH_1.0 4.6 + ccosq@QUADMATH_1.0 4.6 + ceilq@QUADMATH_1.0 4.6 + cexpiq@QUADMATH_1.0 4.6 + cexpq@QUADMATH_1.0 4.6 + cimagq@QUADMATH_1.0 4.6 + clog10q@QUADMATH_1.0 4.6 + clogq@QUADMATH_1.0 4.6 + conjq@QUADMATH_1.0 4.6 + copysignq@QUADMATH_1.0 4.6 + coshq@QUADMATH_1.0 4.6 + cosq@QUADMATH_1.0 4.6 + cpowq@QUADMATH_1.0 4.6 + cprojq@QUADMATH_1.0 4.6 + crealq@QUADMATH_1.0 4.6 + csinhq@QUADMATH_1.0 4.6 + csinq@QUADMATH_1.0 4.6 + csqrtq@QUADMATH_1.0 4.6 + ctanhq@QUADMATH_1.0 4.6 + ctanq@QUADMATH_1.0 4.6 + erfcq@QUADMATH_1.0 4.6 + erfq@QUADMATH_1.0 4.6 + expm1q@QUADMATH_1.0 4.6 + expq@QUADMATH_1.0 4.6 + fabsq@QUADMATH_1.0 4.6 + fdimq@QUADMATH_1.0 4.6 + finiteq@QUADMATH_1.0 4.6 + floorq@QUADMATH_1.0 4.6 + fmaq@QUADMATH_1.0 4.6 + fmaxq@QUADMATH_1.0 4.6 + fminq@QUADMATH_1.0 4.6 + fmodq@QUADMATH_1.0 4.6 + frexpq@QUADMATH_1.0 4.6 + hypotq@QUADMATH_1.0 4.6 + ilogbq@QUADMATH_1.0 4.6 + isinfq@QUADMATH_1.0 4.6 + isnanq@QUADMATH_1.0 4.6 + j0q@QUADMATH_1.0 4.6 + j1q@QUADMATH_1.0 4.6 + jnq@QUADMATH_1.0 4.6 + ldexpq@QUADMATH_1.0 4.6 + lgammaq@QUADMATH_1.0 4.6 + llrintq@QUADMATH_1.0 4.6 + llroundq@QUADMATH_1.0 4.6 + log10q@QUADMATH_1.0 4.6 + log1pq@QUADMATH_1.0 4.6 + log2q@QUADMATH_1.0 4.6 + logq@QUADMATH_1.0 4.6 + lrintq@QUADMATH_1.0 4.6 + lroundq@QUADMATH_1.0 4.6 + modfq@QUADMATH_1.0 4.6 + nanq@QUADMATH_1.0 4.6 + nearbyintq@QUADMATH_1.0 4.6 + nextafterq@QUADMATH_1.0 4.6 + powq@QUADMATH_1.0 4.6 + quadmath_snprintf@QUADMATH_1.0 4.6 + remainderq@QUADMATH_1.0 4.6 + remquoq@QUADMATH_1.0 4.6 + rintq@QUADMATH_1.0 4.6 + roundq@QUADMATH_1.0 4.6 + scalblnq@QUADMATH_1.0 4.6 + scalbnq@QUADMATH_1.0 4.6 + signbitq@QUADMATH_1.0 4.6 + sincosq@QUADMATH_1.0 4.6 + sinhq@QUADMATH_1.0 4.6 + sinq@QUADMATH_1.0 4.6 + sqrtq@QUADMATH_1.0 4.6 + strtoflt128@QUADMATH_1.0 4.6 + tanhq@QUADMATH_1.0 4.6 + tanq@QUADMATH_1.0 4.6 + tgammaq@QUADMATH_1.0 4.6 + truncq@QUADMATH_1.0 4.6 + y0q@QUADMATH_1.0 4.6 + y1q@QUADMATH_1.0 4.6 + ynq@QUADMATH_1.0 4.6 --- gcc-4.8-4.8.2.orig/debian/libstdc++-BV-doc.overrides +++ gcc-4.8-4.8.2/debian/libstdc++-BV-doc.overrides @@ -0,0 +1,2 @@ +libstdc++-@BV@-doc binary: hyphen-used-as-minus-sign +libstdc++-@BV@-doc binary: manpage-has-bad-whatis-entry --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.128bit +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.128bit @@ -0,0 +1,46 @@ + _ZNSt14numeric_limitsInE10has_denormE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE10is_boundedE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE10is_integerE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE11round_styleE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE12has_infinityE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE12max_digits10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE12max_exponentE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE12min_exponentE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE13has_quiet_NaNE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE14is_specializedE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE14max_exponent10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE14min_exponent10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE15has_denorm_lossE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE15tinyness_beforeE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE17has_signaling_NaNE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE5radixE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE5trapsE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE6digitsE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE8digits10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE8is_exactE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE9is_iec559E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE9is_moduloE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsInE9is_signedE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE10has_denormE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE10is_boundedE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE10is_integerE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE11round_styleE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE12has_infinityE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE12max_digits10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE12max_exponentE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE12min_exponentE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE13has_quiet_NaNE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE14is_specializedE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE14max_exponent10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE14min_exponent10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE15has_denorm_lossE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE15tinyness_beforeE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE17has_signaling_NaNE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE5radixE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE5trapsE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE6digitsE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE8digits10E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE8is_exactE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE9is_iec559E@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE9is_moduloE@GLIBCXX_3.4.17 4.7 + _ZNSt14numeric_limitsIoE9is_signedE@GLIBCXX_3.4.17 4.7 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.32bit +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.32bit @@ -0,0 +1,554 @@ +#include "libstdc++6.symbols.common" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEj@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillEj@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx6__poolILb0EE16_M_reclaim_blockEPcj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEjj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEjj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list6_M_getEj@GLIBCXX_3.4.4 4.1.1 + _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE2atEj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6substrEjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEEixEj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEjjPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs16find_last_not_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs2atEj@GLIBCXX_3.4 4.1.1 + _ZNKSs4copyEPcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs6substrEjj@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_checkEjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_limitEjj@GLIBCXX_3.4 4.1.1 + _ZNKSsixEj@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE6_M_putEPcjPKcPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE6_M_putEPwjPKwPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_j@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_j@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12_M_transformEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12_M_transformEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcjcS6_PcS7_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcjwRSt8ios_basePwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcjwPKwPwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_3.4 4.1.1 + _ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEj@GLIBCXX_3.4.18 4.8 + _ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEjjj@GLIBCXX_3.4.18 4.8 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5 + _ZNKSt8valarrayIjE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE10_S_compareEjj@GLIBCXX_3.4.16 4.6.0 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEjjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE18_S_construct_aux_2EjwRKS1_@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE2atEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_j@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEjj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_jw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7reserveEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwjw@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEixEj@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPci@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi4readEPci@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSi6ignoreEii@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPci@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi8readsomeEPci@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSo5writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSo8_M_writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSs10_S_compareEjj@GLIBCXX_3.4.16 4.6.0 + _ZNSs12_S_constructEjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs14_M_replace_auxEjjjc@GLIBCXX_3.4 4.1.1 + _ZNSs15_M_replace_safeEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs18_S_construct_aux_2EjcRKSaIcE@GLIBCXX_3.4.14 4.5 + _ZNSs2atEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4.5 4.1.1 + _ZNSs4_Rep8_M_cloneERKSaIcEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep9_S_createEjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEjj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjjc@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEj@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEjc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcj@GLIBCXX_3.4.5 4.1.1 + _ZNSs7_M_moveEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_moveEPcPKcj@GLIBCXX_3.4.5 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjjc@GLIBCXX_3.4 4.1.1 + _ZNSs7reserveEj@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcjc@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcjc@GLIBCXX_3.4.5 4.1.1 + _ZNSs9_M_mutateEjjj@GLIBCXX_3.4 4.1.1 + _ZNSsC1EPKcjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1EjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EPKcjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsixEj@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11this_thread11__sleep_forENSt6chrono8durationIxSt5ratioILx1ELx1EEEENS1_IxS2_ILx1ELx1000000000EEEE@GLIBCXX_3.4.18 4.8 + _ZNSt11__timepunctIcEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_allocEj@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_setupEPcS0_i@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPFPvjEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1Ei@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPFPvjEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2Ei@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + (arch=!powerpc !ppc64 !sparc)_ZNSt14numeric_limitsIeE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8_M_pbumpEPcS4_x@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8_M_pbumpEPwS4_x@GLIBCXX_3.4.16 4.6.0 + _ZNSt15messages_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EP15__locale_structPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EP15__locale_structPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEj@GLIBCXX_3.4.7 4.1.1 + _ZNSt6locale5_ImplC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1ERKS0_j@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2ERKS0_j@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC1ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC2ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEixEj@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZSt11_Hash_bytesPKvjj@CXXABI_1.3.5 4.6 + _ZSt15_Fnv_hash_bytesPKvjj@CXXABI_1.3.5 4.6 + _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__verify_groupingPKcjRKSs@GLIBCXX_3.4.10 4.3 + _ZSt21__copy_streambufs_eofIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZSt21__copy_streambufs_eofIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZThn8_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _Znaj@GLIBCXX_3.4 4.1.1 + _ZnajRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _Znwj@GLIBCXX_3.4 4.1.1 + _ZnwjRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.32bit.hurd +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.32bit.hurd @@ -0,0 +1,536 @@ +#include "libstdc++6.symbols.common" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEj@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillEj@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx6__poolILb0EE16_M_reclaim_blockEPcj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEjj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEjj@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list6_M_getEj@GLIBCXX_3.4.4 4.1.1 + _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE2atEj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_j@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6substrEjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEjj@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEEixEj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEjjPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs16find_last_not_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs2atEj@GLIBCXX_3.4 4.1.1 + _ZNKSs4copyEPcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcjj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindERKSsj@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEcj@GLIBCXX_3.4 4.1.1 + _ZNKSs6substrEjj@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEjjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_checkEjPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_limitEjj@GLIBCXX_3.4 4.1.1 + _ZNKSsixEj@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE6_M_putEPcjPKcPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE6_M_putEPwjPKwPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_j@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_j@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12_M_transformEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12_M_transformEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcjcS6_PcS7_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcjwRSt8ios_basePwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcjwPKwPwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8valarrayIjE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEjjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE2atEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_j@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEjj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwj@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_jw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKwj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7reserveEj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwjw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwjw@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jj@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jjRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EjwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEixEj@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPci@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi4readEPci@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSi6ignoreEii@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPci@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi8readsomeEPci@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSo5writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSo8_M_writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSs12_S_constructEjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs14_M_replace_auxEjjjc@GLIBCXX_3.4 4.1.1 + _ZNSs15_M_replace_safeEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs2atEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEj@GLIBCXX_3.4.5 4.1.1 + _ZNSs4_Rep8_M_cloneERKSaIcEj@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep9_S_createEjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEjj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEjjc@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEj@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEjc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcj@GLIBCXX_3.4.5 4.1.1 + _ZNSs7_M_moveEPcPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_moveEPcPKcj@GLIBCXX_3.4.5 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjPKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjPKcj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjRKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEjjjc@GLIBCXX_3.4 4.1.1 + _ZNSs7reserveEj@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcjc@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcjc@GLIBCXX_3.4.5 4.1.1 + _ZNSs9_M_mutateEjjj@GLIBCXX_3.4 4.1.1 + _ZNSsC1EPKcjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1EjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EPKcjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsjj@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsjjRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EjcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsixEj@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEj@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_allocEj@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_setupEPcS0_i@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPFPvjEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1Ei@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPFPvjEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2Ei@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EP15__locale_structPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EP15__locale_structPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EPKtbj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEj@GLIBCXX_3.4.7 4.1.1 + _ZNSt6locale5_ImplC1EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1ERKS0_j@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2EPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2ERKS0_j@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2EP15__locale_structPKcj@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EP15__locale_structj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEj@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC1ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC2ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayIjEixEj@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_3.4 4.1.1 + _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__verify_groupingPKcjRKSs@GLIBCXX_3.4.10 4.3 + _ZSt21__copy_streambufs_eofIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZSt21__copy_streambufs_eofIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZThn8_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _Znaj@GLIBCXX_3.4 4.1.1 + _ZnajRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _Znwj@GLIBCXX_3.4 4.1.1 + _ZnwjRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC1EP15__pthread_mutex@GLIBCXX_3.4 4.3.0 + _ZNSt12__basic_fileIcEC2EP15__pthread_mutex@GLIBCXX_3.4 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.64bit +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.64bit @@ -0,0 +1,559 @@ +#include "libstdc++6.symbols.common" + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPcl@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKcl@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwl@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwl@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx6__poolILb0EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list6_M_getEm@GLIBCXX_3.4.4 4.1.1 + _ZNK10__cxxabiv117__class_type_info12__do_dyncastElNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcElPKvPKS0_S2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs16find_last_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSs4copyEPcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSsixEm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12_M_transformEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12_M_transformEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS6_PcS7_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEclRSt8ios_basePcPKcRi@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwlRSt8ios_basePwPKwRi@GLIBCXX_3.4 4.1.1 + _ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEm@GLIBCXX_3.4.18 4.8 + _ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEmmm@GLIBCXX_3.4.18 4.8 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5 + _ZNKSt8valarrayImE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE10_S_compareEmm@GLIBCXX_3.4.16 4.6.0 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE18_S_construct_aux_2EmwRKS1_@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPcl@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPclc@GLIBCXX_3.4 4.1.1 + _ZNSi4readEPcl@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgElSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEl@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEl@GLIBCXX_3.4.5 4.1.1 + _ZNSi6ignoreEli@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPcl@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPclc@GLIBCXX_3.4 4.1.1 + _ZNSi8readsomeEPcl@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpElSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSo5writeEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSo8_M_writeEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSs10_S_compareEmm@GLIBCXX_3.4.16 4.6.0 + _ZNSs12_S_constructEmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs14_M_replace_auxEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs15_M_replace_safeEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs18_S_construct_aux_2EmcRKSaIcE@GLIBCXX_3.4.14 4.5 + _ZNSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSs4_Rep8_M_cloneERKSaIcEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep9_S_createEmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmmc@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEmc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4.5 4.1.1 + _ZNSs9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsixEm@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPcl@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPcl@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11this_thread11__sleep_forENSt6chrono8durationIlSt5ratioILl1ELl1EEEENS1_IlS2_ILl1ELl1000000000EEEE@GLIBCXX_3.4.18 4.8 + _ZNSt11__timepunctIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsgetnEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsputnEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE7seekoffElSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8xsputn_2EPKclS2_l@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6setbufEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_allocEm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_setupEPcS0_l@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKal@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKhl@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPalS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPclS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPhlS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1El@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKal@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKhl@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPalS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPclS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPhlS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2El@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekElSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekElSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwlw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgElSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEl@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreElj@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwlw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpElSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwl@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + (arch=!alpha !powerpc !ppc64 !ppc64el !s390 !s390x)_ZNSt14numeric_limitsIeE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_gbumpEl@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_pbumpEl@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPcl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8_M_pbumpEPcS4_l@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_gbumpEl@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_pbumpEl@GLIBCXX_3.4.16 4.6.0 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwl@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8_M_pbumpEPwS4_l@GLIBCXX_3.4.16 4.6.0 + _ZNSt15messages_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEm@GLIBCXX_3.4.7 4.1.1 + _ZNSt6locale5_ImplC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEixEm@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZSt11_Hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt15_Fnv_hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@GLIBCXX_3.4.9 4.2.1 + _ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_l@GLIBCXX_3.4.9 4.2.1 + _ZSt17__copy_streambufsIcSt11char_traitsIcEElPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.8 4.1.1 + _ZSt17__copy_streambufsIwSt11char_traitsIwEElPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.8 4.1.1 + _ZSt17__verify_groupingPKcmRKSs@GLIBCXX_3.4.10 4.3 + _ZSt21__copy_streambufs_eofIcSt11char_traitsIcEElPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZSt21__copy_streambufs_eofIwSt11char_traitsIwEElPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZTIPKn@CXXABI_1.3.5 4.6 + _ZTIPKo@CXXABI_1.3.5 4.6 + _ZTIPn@CXXABI_1.3.5 4.6 + _ZTIPo@CXXABI_1.3.5 4.6 + _ZTIn@CXXABI_1.3.5 4.6 + _ZTIo@CXXABI_1.3.5 4.6 + _ZThn16_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn16_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n24_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _Znam@GLIBCXX_3.4 4.1.1 + _ZnamRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _Znwm@GLIBCXX_3.4 4.1.1 + _ZnwmRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.alpha +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.alpha @@ -0,0 +1,55 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNSt14numeric_limitsInE10has_denormE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE10is_boundedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE10is_integerE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE11round_styleE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12has_infinityE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12max_digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12max_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12min_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE13has_quiet_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14is_specializedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14max_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14min_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE15has_denorm_lossE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE15tinyness_beforeE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE17has_signaling_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE5radixE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE5trapsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE6digitsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE8digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE8is_exactE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_iec559E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_moduloE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_signedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10has_denormE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10is_boundedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10is_integerE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE11round_styleE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12has_infinityE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12max_digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12max_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12min_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE13has_quiet_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14is_specializedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14max_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14min_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE15has_denorm_lossE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE15tinyness_beforeE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE17has_signaling_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE5radixE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE5trapsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE6digitsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE8digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE8is_exactE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_iec559E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_moduloE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_signedE@GLIBCXX_3.4.17 4.8 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.amd64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.amd64 @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.arm +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.arm @@ -0,0 +1,6 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_sj0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.arm64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.arm64 @@ -0,0 +1,9 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.armel +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.armel @@ -0,0 +1,26 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" + CXXABI_ARM_1.3.3@CXXABI_ARM_1.3.3 4.4.0 + _ZNKSt9type_info6beforeERKS_@GLIBCXX_3.4 4.3.0 + _ZNKSt9type_infoeqERKS_@GLIBCXX_3.4 4.3.0 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + __aeabi_atexit@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_cctor_nocookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_ctor_cookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_ctor_nocookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete3@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete3_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_dtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_dtor_cookie@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie_noctor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_nocookie@CXXABI_ARM_1.3.3 4.4.0 + __cxa_begin_cleanup@CXXABI_1.3 4.3.0 + __cxa_end_cleanup@CXXABI_1.3 4.3.0 + __cxa_type_match@CXXABI_1.3 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.armhf +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.armhf @@ -0,0 +1,26 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" + CXXABI_ARM_1.3.3@CXXABI_ARM_1.3.3 4.4.0 + _ZNKSt9type_info6beforeERKS_@GLIBCXX_3.4 4.3.0 + _ZNKSt9type_infoeqERKS_@GLIBCXX_3.4 4.3.0 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + __aeabi_atexit@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_cctor_nocookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_ctor_cookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_ctor_nocookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete3@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete3_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_delete@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_dtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_dtor_cookie@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie_noctor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_cookie_nodtor@CXXABI_ARM_1.3.3 4.4.0 + __aeabi_vec_new_nocookie@CXXABI_ARM_1.3.3 4.4.0 + __cxa_begin_cleanup@CXXABI_1.3 4.3.0 + __cxa_end_cleanup@CXXABI_1.3 4.3.0 + __cxa_type_match@CXXABI_1.3 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.common +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.common @@ -0,0 +1,3086 @@ + CXXABI_1.3.1@CXXABI_1.3.1 4.1.1 + CXXABI_1.3.2@CXXABI_1.3.2 4.3 + CXXABI_1.3.3@CXXABI_1.3.3 4.4.0 + CXXABI_1.3.4@CXXABI_1.3.4 4.5 + CXXABI_1.3.5@CXXABI_1.3.5 4.6 + CXXABI_1.3.6@CXXABI_1.3.6 4.7 + CXXABI_1.3.7@CXXABI_1.3.7 4.8 + CXXABI_1.3@CXXABI_1.3 4.1.1 + CXXABI_TM_1@CXXABI_TM_1 4.7 + GLIBCXX_3.4.10@GLIBCXX_3.4.10 4.3 + GLIBCXX_3.4.11@GLIBCXX_3.4.11 4.4.0 + GLIBCXX_3.4.12@GLIBCXX_3.4.12 4.4.0 + GLIBCXX_3.4.13@GLIBCXX_3.4.13 4.4.2 + GLIBCXX_3.4.14@GLIBCXX_3.4.14 4.5 + GLIBCXX_3.4.15@GLIBCXX_3.4.15 4.6 + GLIBCXX_3.4.16@GLIBCXX_3.4.16 4.6.0 + GLIBCXX_3.4.17@GLIBCXX_3.4.17 4.7 + GLIBCXX_3.4.18@GLIBCXX_3.4.18 4.8 + GLIBCXX_3.4.19@GLIBCXX_3.4.19 4.8 + GLIBCXX_3.4.1@GLIBCXX_3.4.1 4.1.1 + GLIBCXX_3.4.2@GLIBCXX_3.4.2 4.1.1 + GLIBCXX_3.4.3@GLIBCXX_3.4.3 4.1.1 + GLIBCXX_3.4.4@GLIBCXX_3.4.4 4.1.1 + GLIBCXX_3.4.5@GLIBCXX_3.4.5 4.1.1 + GLIBCXX_3.4.6@GLIBCXX_3.4.6 4.1.1 + GLIBCXX_3.4.7@GLIBCXX_3.4.7 4.1.1 + GLIBCXX_3.4.8@GLIBCXX_3.4.8 4.1.1 + GLIBCXX_3.4.9@GLIBCXX_3.4.9 4.2.1 + GLIBCXX_3.4@GLIBCXX_3.4 4.1.1 + _ZGVNSt10moneypunctIcLb0EE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt10moneypunctIcLb1EE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt10moneypunctIwLb0EE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt10moneypunctIwLb1EE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt11__timepunctIcE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt11__timepunctIwE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7collateIcE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7collateIwE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8messagesIcE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8messagesIwE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8numpunctIcE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8numpunctIwE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZN10__cxxabiv116__enum_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv116__enum_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv116__enum_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__array_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__array_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__array_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__class_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__class_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__class_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__pbase_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__pbase_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv117__pbase_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv119__pointer_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv119__pointer_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv119__pointer_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__function_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__function_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__function_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__si_class_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__si_class_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv120__si_class_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv121__vmi_class_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv121__vmi_class_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv121__vmi_class_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv123__fundamental_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv123__fundamental_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv123__fundamental_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev@CXXABI_1.3 4.1.1 + _ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev@CXXABI_1.3 4.1.1 + _ZN10__gnu_norm15_List_node_base4hookEPS0_@GLIBCXX_3.4 4.1.1 + _ZN10__gnu_norm15_List_node_base4swapERS0_S1_@GLIBCXX_3.4 4.1.1 + _ZN10__gnu_norm15_List_node_base6unhookEv@GLIBCXX_3.4 4.1.1 + _ZN10__gnu_norm15_List_node_base7reverseEv@GLIBCXX_3.4 4.1.1 + _ZN10__gnu_norm15_List_node_base8transferEPS0_S1_@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_iterator_base12_M_get_mutexEv@GLIBCXX_3.4.9 4.2.1 + _ZN11__gnu_debug19_Safe_iterator_base16_M_attach_singleEPNS_19_Safe_sequence_baseEb@GLIBCXX_3.4.9 4.2.1 + _ZN11__gnu_debug19_Safe_iterator_base16_M_detach_singleEv@GLIBCXX_3.4.9 4.2.1 + _ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_sequence_base12_M_get_mutexEv@GLIBCXX_3.4.9 4.2.1 + _ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_@GLIBCXX_3.4 4.1.1 + _ZN11__gnu_debug25_Safe_local_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@GLIBCXX_3.4.17 4.7 + _ZN11__gnu_debug25_Safe_local_iterator_base9_M_detachEv@GLIBCXX_3.4.17 4.7 + _ZN11__gnu_debug30_Safe_unordered_container_base13_M_detach_allEv@GLIBCXX_3.4.17 4.7 + _ZN11__gnu_debug30_Safe_unordered_container_base7_M_swapERS0_@GLIBCXX_3.4.17 4.7 + _ZN14__gnu_parallel9_Settings3getEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN14__gnu_parallel9_Settings3setERS0_@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx17__pool_alloc_base12_M_get_mutexEv@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE4fileEv@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE4syncEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE4syncEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE5uflowEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE5uflowEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE8overflowEi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9pbackfailEi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9underflowEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC1EP8_IO_FILE@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC2EP8_IO_FILE@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4fileEv@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4syncEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE5uflowEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE8overflowEj@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9pbackfailEj@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9underflowEv@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC1EP8_IO_FILE@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC2EP8_IO_FILE@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx27__verbose_terminate_handlerEv@CXXABI_1.3 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE10_M_destroyEv@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE13_M_initializeEv@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE10_M_destroyEv@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE13_M_initializeEPFvPvE@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE13_M_initializeEv@GLIBCXX_3.4.6 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_get_thread_idEv@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE21_M_destroy_thread_keyEPv@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list8_M_clearEv@GLIBCXX_3.4.4 4.1.1 + _ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv119__pointer_type_info14__is_pointer_pEv@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv119__pointer_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__function_type_info15__is_function_pEv@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv129__pointer_to_member_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@CXXABI_1.3 4.1.1 + _ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug16_Error_formatter17_M_get_max_lengthEv@GLIBCXX_3.4.10 4.3 + _ZNK11__gnu_debug16_Error_formatter8_M_errorEv@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv@GLIBCXX_3.4 4.1.1 + _ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE3endEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4backEv@GLIBCXX_3.4.15 4.6 + _ZNKSbIwSt11char_traitsIwESaIwEE4cendEv@GLIBCXX_3.4.14 4.5 + _ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5crendEv@GLIBCXX_3.4.14 4.5 + _ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5frontEv@GLIBCXX_3.4.15 4.6 + _ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6cbeginEv@GLIBCXX_3.4.14 4.5 + _ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7crbeginEv@GLIBCXX_3.4.14 4.5 + _ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@GLIBCXX_3.4 4.1.1 + _ZNKSi6gcountEv@GLIBCXX_3.4 4.1.1 + _ZNKSi6sentrycvbEv@GLIBCXX_3.4 4.1.1 + _ZNKSo6sentrycvbEv@GLIBCXX_3.4 4.1.1 + _ZNKSs11_M_disjunctEPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs11_M_disjunctEPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs13get_allocatorEv@GLIBCXX_3.4 4.1.1 + _ZNKSs3endEv@GLIBCXX_3.4 4.1.1 + _ZNKSs4_Rep12_M_is_leakedEv@GLIBCXX_3.4 4.1.1 + _ZNKSs4_Rep12_M_is_sharedEv@GLIBCXX_3.4 4.1.1 + _ZNKSs4backEv@GLIBCXX_3.4.15 4.6 + _ZNKSs4cendEv@GLIBCXX_3.4.14 4.5 + _ZNKSs4dataEv@GLIBCXX_3.4 4.1.1 + _ZNKSs4rendEv@GLIBCXX_3.4 4.1.1 + _ZNKSs4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNKSs5beginEv@GLIBCXX_3.4 4.1.1 + _ZNKSs5c_strEv@GLIBCXX_3.4 4.1.1 + _ZNKSs5crendEv@GLIBCXX_3.4.14 4.5 + _ZNKSs5emptyEv@GLIBCXX_3.4 4.1.1 + _ZNKSs5frontEv@GLIBCXX_3.4.15 4.6 + _ZNKSs6_M_repEv@GLIBCXX_3.4 4.1.1 + _ZNKSs6cbeginEv@GLIBCXX_3.4.14 4.5 + _ZNKSs6lengthEv@GLIBCXX_3.4 4.1.1 + _ZNKSs6rbeginEv@GLIBCXX_3.4 4.1.1 + _ZNKSs7_M_dataEv@GLIBCXX_3.4 4.1.1 + _ZNKSs7_M_iendEv@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareERKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7crbeginEv@GLIBCXX_3.4.14 4.5 + _ZNKSs8capacityEv@GLIBCXX_3.4 4.1.1 + _ZNKSs8max_sizeEv@GLIBCXX_3.4 4.1.1 + _ZNKSs9_M_ibeginEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10bad_typeid4whatEv@GLIBCXX_3.4.9 4.2.1 + _ZNKSt10error_code23default_error_conditionEv@GLIBCXX_3.4.11 4.4.0 + _ZNKSt10istrstream5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10lock_error4whatEv@GLIBCXX_3.4.11 4.4.0 + _ZNKSt10moneypunctIcLb0EE10neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE10pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE11curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE11frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE16do_negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE16do_positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb0EE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE10neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE10pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE11curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE11frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE16do_negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE16do_positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIcLb1EE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE10neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE10pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE11curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE11frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE16do_negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE16do_positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb0EE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE10neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE10pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE11curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE11frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE16do_negative_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE16do_positive_signEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10moneypunctIwLb1EE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10ostrstream5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt10ostrstream6pcountEv@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE15_M_am_pm_formatEPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE7_M_daysEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE8_M_am_pmEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE9_M_monthsEPPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE15_M_am_pm_formatEPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE7_M_daysEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE8_M_am_pmEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE9_M_monthsEPPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt11logic_error4whatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt12__basic_fileIcE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt12bad_weak_ptr4whatEv@GLIBCXX_3.4.15 4.6 + _ZNKSt12future_error4whatEv@GLIBCXX_3.4.14 4.5 + _ZNKSt12strstreambuf6pcountEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13bad_exception4whatEv@GLIBCXX_3.4.9 4.2.1 + _ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@GLIBCXX_3.4 4.1.1 + _ZNKSt13runtime_error4whatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNKSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4.5 4.1.1 + _ZNKSt14error_category10equivalentERKSt10error_codei@GLIBCXX_3.4.11 4.4.0 + _ZNKSt14error_category10equivalentEiRKSt15error_condition@GLIBCXX_3.4.11 4.4.0 + _ZNKSt14error_category23default_error_conditionEi@GLIBCXX_3.4.11 4.4.0 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt17bad_function_call4whatEv@GLIBCXX_3.4.18 4.8 + _ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@GLIBCXX_3.4 4.1.1 + _ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@GLIBCXX_3.4.10 4.3 + _ZNKSt3tr14hashIRKSsEclES2_@GLIBCXX_3.4.10 4.3 + _ZNKSt3tr14hashISbIwSt11char_traitsIwESaIwEEEclES4_@GLIBCXX_3.4.10 4.3 + _ZNKSt3tr14hashISsEclESs@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIRKSbIwSt11char_traitsIwESaIwEEEclES5_@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIRKSsEclES1_@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashISbIwSt11char_traitsIwESaIwEEEclES3_@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashISsEclESs@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashISt10error_codeEclES0_@GLIBCXX_3.4.11 4.4.0 + _ZNKSt5ctypeIcE10do_tolowerEPcPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE10do_tolowerEc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE10do_toupperEPcPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE10do_toupperEc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE13_M_widen_initEv@GLIBCXX_3.4.11 4.4.0 + _ZNKSt5ctypeIcE14_M_narrow_initEv@GLIBCXX_3.4.11 4.4.0 + _ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE8do_widenEc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIcE9do_narrowEcc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE10do_tolowerEPwPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE10do_tolowerEw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE10do_toupperEPwPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE10do_toupperEw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE5do_isEPKwS2_Pt@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE5do_isEtw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE8do_widenEc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@GLIBCXX_3.4 4.1.1 + _ZNKSt5ctypeIwE9do_narrowEwc@GLIBCXX_3.4 4.1.1 + _ZNKSt6locale2id5_M_idEv@GLIBCXX_3.4 4.1.1 + _ZNKSt6locale4nameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt6localeeqERKS_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE10_M_compareEPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12do_transformEPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE4hashEPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE7compareEPKcS2_S2_S2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE7do_hashEPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE9transformEPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE10_M_compareEPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12do_transformEPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE4hashEPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE7compareEPKwS2_S2_S2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE7do_hashEPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE9transformEPKwS2_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES3_S3_RSt8ios_basewT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES3_S3_RSt8ios_basewT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES3_S3_RSt8ios_basewT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIeEES3_S3_RSt8ios_basewcT_@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@GLIBCXX_3.4 4.1.1 + _ZNKSt8bad_cast4whatEv@GLIBCXX_3.4.9 4.2.1 + _ZNKSt8ios_base7failure4whatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE18_M_convert_to_charERKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE20_M_convert_from_charEPc@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE3getEiiiRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE4openERKSsRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE4openERKSsRKSt6localePKc@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE5closeEi@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE6do_getEiiiRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE7do_openERKSsRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIcE8do_closeEi@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE20_M_convert_from_charEPc@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE4openERKSsRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE4openERKSsRKSt6localePKc@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE5closeEi@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE7do_openERKSsRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNKSt8messagesIwE8do_closeEi@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE11do_truenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE12do_falsenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE8truenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIcE9falsenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE11do_groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE11do_truenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE12do_falsenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE13decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE13thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE16do_decimal_pointEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE16do_thousands_sepEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE8groupingEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE8truenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8numpunctIwE9falsenameEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@GLIBCXX_3.4 4.1.1 + _ZNKSt9bad_alloc4whatEv@GLIBCXX_3.4.9 4.2.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9exception4whatEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@GLIBCXX_3.4 4.1.1 + _ZNKSt9strstream5rdbufEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9strstream6pcountEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9type_info10__do_catchEPKS_PPvj@GLIBCXX_3.4 4.1.1 + _ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@GLIBCXX_3.4 4.1.1 + _ZNKSt9type_info14__is_pointer_pEv@GLIBCXX_3.4 4.1.1 + _ZNKSt9type_info15__is_function_pEv@GLIBCXX_3.4 4.1.1 + _ZNSaIcEC1ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSaIcEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIcEC2ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSaIcEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIwEC1ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSaIwEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIwEC2ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSaIwEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSaIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructIN9__gnu_cxx17__normal_iteratorIPwS2_EEEES6_T_S8_RKS1_St20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructIPKwEEPwT_S7_RKS1_St20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructIPwEES4_T_S5_RKS1_St20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE13shrink_to_fitEv@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE3endEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep12_S_empty_repEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4backEv@GLIBCXX_3.4.15 4.6 + _ZNSbIwSt11char_traitsIwESaIwEE4nposE@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4rendEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5beginEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5clearEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5frontEv@GLIBCXX_3.4.15 4.6 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendESt16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEOS2_@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignESt16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EESt16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_St16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEE8pop_backEv@GLIBCXX_3.4.17 4.7 + _ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EOS2_@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EOS2_@GLIBCXX_3.4.15 4.6 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ESt16initializer_listIwERKS1_@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEEC2ESt16initializer_listIwERKS1_@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEaSEOS2_@GLIBCXX_3.4.14 4.5 + _ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEaSESt16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEEaSEw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEpLESt16initializer_listIwE@GLIBCXX_3.4.11 4.4.0 + _ZNSbIwSt11char_traitsIwESaIwEEpLEw@GLIBCXX_3.4 4.1.1 + _ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSdC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSdC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSdD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSi10_M_extractIPvEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIbEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIdEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIeEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIfEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIjEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIlEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractImEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractItEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIxEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi10_M_extractIyEERSiRT_@GLIBCXX_3.4.9 4.2.1 + _ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@GLIBCXX_3.4 4.1.1 + _ZNSi3getERc@GLIBCXX_3.4 4.1.1 + _ZNSi3getEv@GLIBCXX_3.4 4.1.1 + _ZNSi4peekEv@GLIBCXX_3.4 4.1.1 + _ZNSi4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgESt4fposI11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZNSi5tellgEv@GLIBCXX_3.4 4.1.1 + _ZNSi5ungetEv@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEv@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEv@GLIBCXX_3.4.5 4.1.1 + _ZNSi6sentryC1ERSib@GLIBCXX_3.4 4.1.1 + _ZNSi6sentryC2ERSib@GLIBCXX_3.4 4.1.1 + _ZNSi7putbackEc@GLIBCXX_3.4 4.1.1 + _ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSiC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSiC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSiD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSirsEPFRSiS_E@GLIBCXX_3.4 4.1.1 + _ZNSirsEPFRSt8ios_baseS0_E@GLIBCXX_3.4 4.1.1 + _ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@GLIBCXX_3.4 4.1.1 + _ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSirsERPv@GLIBCXX_3.4 4.1.1 + _ZNSirsERb@GLIBCXX_3.4 4.1.1 + _ZNSirsERd@GLIBCXX_3.4 4.1.1 + _ZNSirsERe@GLIBCXX_3.4 4.1.1 + _ZNSirsERf@GLIBCXX_3.4 4.1.1 + _ZNSirsERi@GLIBCXX_3.4 4.1.1 + _ZNSirsERj@GLIBCXX_3.4 4.1.1 + _ZNSirsERl@GLIBCXX_3.4 4.1.1 + _ZNSirsERm@GLIBCXX_3.4 4.1.1 + _ZNSirsERs@GLIBCXX_3.4 4.1.1 + _ZNSirsERt@GLIBCXX_3.4 4.1.1 + _ZNSirsERx@GLIBCXX_3.4 4.1.1 + _ZNSirsERy@GLIBCXX_3.4 4.1.1 + _ZNSo3putEc@GLIBCXX_3.4 4.1.1 + _ZNSo5flushEv@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpESt4fposI11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZNSo5tellpEv@GLIBCXX_3.4 4.1.1 + _ZNSo6sentryC1ERSo@GLIBCXX_3.4 4.1.1 + _ZNSo6sentryC2ERSo@GLIBCXX_3.4 4.1.1 + _ZNSo6sentryD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSo6sentryD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSo9_M_insertIPKvEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIbEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIdEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIeEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIlEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertImEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIxEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSo9_M_insertIyEERSoT_@GLIBCXX_3.4.9 4.2.1 + _ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSoC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSoC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSoD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSolsEPFRSoS_E@GLIBCXX_3.4 4.1.1 + _ZNSolsEPFRSt8ios_baseS0_E@GLIBCXX_3.4 4.1.1 + _ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@GLIBCXX_3.4 4.1.1 + _ZNSolsEPKv@GLIBCXX_3.4 4.1.1 + _ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZNSolsEb@GLIBCXX_3.4 4.1.1 + _ZNSolsEd@GLIBCXX_3.4 4.1.1 + _ZNSolsEe@GLIBCXX_3.4 4.1.1 + _ZNSolsEf@GLIBCXX_3.4 4.1.1 + _ZNSolsEi@GLIBCXX_3.4 4.1.1 + _ZNSolsEj@GLIBCXX_3.4 4.1.1 + _ZNSolsEl@GLIBCXX_3.4 4.1.1 + _ZNSolsEm@GLIBCXX_3.4 4.1.1 + _ZNSolsEs@GLIBCXX_3.4 4.1.1 + _ZNSolsEt@GLIBCXX_3.4 4.1.1 + _ZNSolsEx@GLIBCXX_3.4 4.1.1 + _ZNSolsEy@GLIBCXX_3.4 4.1.1 + _ZNSs12_Alloc_hiderC1EPcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs12_Alloc_hiderC2EPcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs12_M_leak_hardEv@GLIBCXX_3.4 4.1.1 + _ZNSs12_S_constructIN9__gnu_cxx17__normal_iteratorIPcSsEEEES2_T_S4_RKSaIcESt20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag@GLIBCXX_3.4.14 4.5 + _ZNSs12_S_empty_repEv@GLIBCXX_3.4 4.1.1 + _ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@GLIBCXX_3.4 4.1.1 + _ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@GLIBCXX_3.4 4.1.1 + _ZNSs13_S_copy_charsEPcPKcS1_@GLIBCXX_3.4 4.1.1 + _ZNSs13_S_copy_charsEPcS_S_@GLIBCXX_3.4 4.1.1 + _ZNSs13shrink_to_fitEv@GLIBCXX_3.4.14 4.5 + _ZNSs3endEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep10_M_destroyERKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep10_M_disposeERKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep10_M_refcopyEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep10_M_refdataEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep11_S_max_sizeE@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep11_S_terminalE@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep12_S_empty_repEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep13_M_set_leakedEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep15_M_set_sharableEv@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep20_S_empty_rep_storageE@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep7_M_grabERKSaIcES2_@GLIBCXX_3.4 4.1.1 + _ZNSs4backEv@GLIBCXX_3.4.15 4.6 + _ZNSs4nposE@GLIBCXX_3.4 4.1.1 + _ZNSs4rendEv@GLIBCXX_3.4 4.1.1 + _ZNSs4swapERSs@GLIBCXX_3.4 4.1.1 + _ZNSs5beginEv@GLIBCXX_3.4 4.1.1 + _ZNSs5clearEv@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@GLIBCXX_3.4 4.1.1 + _ZNSs5frontEv@GLIBCXX_3.4.15 4.6 + _ZNSs6appendEPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6appendESt16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSs6assignEOSs@GLIBCXX_3.4.14 4.5 + _ZNSs6assignEPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6assignESt16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEESt16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@GLIBCXX_3.4 4.1.1 + _ZNSs6rbeginEv@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_dataEPc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_leakEv@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_St16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSs8pop_backEv@GLIBCXX_3.4.17 4.7 + _ZNSs9push_backEc@GLIBCXX_3.4 4.1.1 + _ZNSsC1EOSs@GLIBCXX_3.4.14 4.5 + _ZNSsC1EPKcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSsC1ESt16initializer_listIcERKSaIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSsC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1IPKcEET_S2_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1IPcEET_S1_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EOSs@GLIBCXX_3.4.15 4.6 + _ZNSsC2EPKcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSsC2ESt16initializer_listIcERKSaIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSsC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2IPKcEET_S2_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2IPcEET_S1_RKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSsD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSsaSEOSs@GLIBCXX_3.4.14 4.5 + _ZNSsaSEPKc@GLIBCXX_3.4 4.1.1 + _ZNSsaSERKSs@GLIBCXX_3.4 4.1.1 + _ZNSsaSESt16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSsaSEc@GLIBCXX_3.4 4.1.1 + _ZNSspLEPKc@GLIBCXX_3.4 4.1.1 + _ZNSspLERKSs@GLIBCXX_3.4 4.1.1 + _ZNSspLESt16initializer_listIcE@GLIBCXX_3.4.11 4.4.0 + _ZNSspLEc@GLIBCXX_3.4 4.1.1 + _ZNSt10__num_base11_S_atoms_inE@GLIBCXX_3.4 4.1.1 + _ZNSt10__num_base12_S_atoms_outE@GLIBCXX_3.4 4.1.1 + _ZNSt10__num_base15_S_format_floatERKSt8ios_basePcc@GLIBCXX_3.4 4.1.1 + _ZNSt10bad_typeidD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10bad_typeidD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10bad_typeidD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5alnumE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5alphaE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5cntrlE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5digitE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5graphE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5lowerE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5printE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5punctE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5spaceE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base5upperE@GLIBCXX_3.4 4.1.1 + _ZNSt10ctype_base6xdigitE@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstream3strEv@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPc@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPc@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10money_base18_S_default_patternE@GLIBCXX_3.4 4.1.1 + _ZNSt10money_base20_S_construct_patternEccc@GLIBCXX_3.4 4.1.1 + _ZNSt10money_base8_S_atomsE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstream3strEv@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstream6freezeEb@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt10ostrstreamD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11char_traitsIcE2eqERKcS2_@GLIBCXX_3.4 4.1.1 + _ZNSt11char_traitsIcE2eqERKcS2_@GLIBCXX_3.4.5 4.1.1 + _ZNSt11char_traitsIwE2eqERKwS2_@GLIBCXX_3.4 4.1.1 + _ZNSt11char_traitsIwE2eqERKwS2_@GLIBCXX_3.4.5 4.1.1 + _ZNSt11logic_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt11logic_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt11logic_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11logic_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11logic_errorD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11range_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt11range_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt11range_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11range_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt11range_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt11regex_errorD0Ev@GLIBCXX_3.4.15 4.6 + _ZNSt11regex_errorD1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt11regex_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12__basic_fileIcE2fdEv@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE4fileEv@GLIBCXX_3.4.1 4.1.1 + _ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE9showmanycEv@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12bad_weak_ptrD0Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12bad_weak_ptrD1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12bad_weak_ptrD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12ctype_bynameIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12domain_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12domain_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12domain_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12domain_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12domain_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12future_errorD0Ev@GLIBCXX_3.4.14 4.5 + _ZNSt12future_errorD1Ev@GLIBCXX_3.4.14 4.5 + _ZNSt12future_errorD2Ev@GLIBCXX_3.4.14 4.5 + _ZNSt12length_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12length_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12length_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12length_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12length_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12out_of_rangeC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12out_of_rangeC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt12out_of_rangeD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12out_of_rangeD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12out_of_rangeD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_1E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_2E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_3E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_4E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_5E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_6E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_7E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_8E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders2_9E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_10E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_11E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_12E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_13E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_14E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_15E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_16E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_17E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_18E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_19E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_20E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_21E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_22E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_23E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_24E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_25E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_26E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_27E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_28E@GLIBCXX_3.4.15 4.6 + _ZNSt12placeholders3_29E@GLIBCXX_3.4.15 4.6 + _ZNSt12strstreambuf3strEv@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6freezeEb@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7_M_freeEPc@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8overflowEi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf9pbackfailEi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt12system_errorD0Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt12system_errorD1Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt12system_errorD2Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt13__future_base11_State_baseD0Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base11_State_baseD1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base11_State_baseD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base12_Result_baseC1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base12_Result_baseC2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base12_Result_baseD0Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base12_Result_baseD1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base12_Result_baseD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt13__future_base19_Async_state_commonD0Ev@GLIBCXX_3.4.17 4.7.0~rc1 + _ZNSt13__future_base19_Async_state_commonD1Ev@GLIBCXX_3.4.17 4.7.0~rc1 + _ZNSt13__future_base19_Async_state_commonD2Ev@GLIBCXX_3.4.17 4.7.0~rc1 + _ZNSt13bad_exceptionD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13bad_exceptionD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13bad_exceptionD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE14_M_get_ext_posER11__mbstate_t@GLIBCXX_3.4.15 4.6 + _ZNSt13basic_filebufIcSt11char_traitsIcEE15_M_create_pbackEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE16_M_destroy_pbackEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_terminate_outputEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE14_M_get_ext_posER11__mbstate_t@GLIBCXX_3.4.15 4.6 + _ZNSt13basic_filebufIwSt11char_traitsIwEE15_M_create_pbackEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE16_M_destroy_pbackEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_terminate_outputEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIPvEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIbEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIdEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIeEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIfEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIjEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIlEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractImEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractItEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIxEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIyEERS2_RT_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIPKvEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIbEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIdEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIeEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIxEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_@GLIBCXX_3.4.9 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@GLIBCXX_3.4 4.1.1 + _ZNSt13random_device14_M_init_pretr1ERKSs@GLIBCXX_3.4.18 4.8 + _ZNSt13random_device16_M_getval_pretr1Ev@GLIBCXX_3.4.18 4.8 + _ZNSt13random_device7_M_finiEv@GLIBCXX_3.4.18 4.8 + _ZNSt13random_device7_M_initERKSs@GLIBCXX_3.4.18 4.8 + _ZNSt13random_device9_M_getvalEv@GLIBCXX_3.4.18 4.8 + _ZNSt13runtime_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt13runtime_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt13runtime_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13runtime_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt13runtime_errorD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4.13 4.4.2 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14error_categoryC1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt14error_categoryC2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt14error_categoryD0Ev@GLIBCXX_3.4.15 4.6 + _ZNSt14error_categoryD1Ev@GLIBCXX_3.4.15 4.6 + _ZNSt14error_categoryD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt14numeric_limitsIDiE10has_denormE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE10is_boundedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE10is_integerE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE11round_styleE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE12has_infinityE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIDiE12max_exponentE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE12min_exponentE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE13has_quiet_NaNE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE14is_specializedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE14max_exponent10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE14min_exponent10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE15has_denorm_lossE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE15tinyness_beforeE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE17has_signaling_NaNE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE5radixE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE5trapsE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE6digitsE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE8digits10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE8is_exactE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE9is_iec559E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE9is_moduloE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDiE9is_signedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE10has_denormE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE10is_boundedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE10is_integerE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE11round_styleE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE12has_infinityE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIDsE12max_exponentE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE12min_exponentE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE13has_quiet_NaNE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE14is_specializedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE14max_exponent10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE14min_exponent10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE15has_denorm_lossE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE15tinyness_beforeE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE17has_signaling_NaNE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE5radixE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE5trapsE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE6digitsE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE8digits10E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE8is_exactE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE9is_iec559E@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE9is_moduloE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIDsE9is_signedE@GLIBCXX_3.4.11 4.4.0 + _ZNSt14numeric_limitsIaE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIaE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIaE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIbE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIbE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIcE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIcE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIdE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIdE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIeE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIfE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIfE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIhE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIhE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIiE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIiE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIjE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIjE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIlE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIlE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsImE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsImE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIsE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIsE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsItE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsItE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIwE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIwE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIxE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIxE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt14numeric_limitsIyE12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt14numeric_limitsIyE9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt14overflow_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt14overflow_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt14overflow_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14overflow_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt14overflow_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt15_List_node_base10_M_reverseEv@GLIBCXX_3.4.14 4.5 + _ZNSt15_List_node_base11_M_transferEPS_S0_@GLIBCXX_3.4.14 4.5 + _ZNSt15_List_node_base4hookEPS_@GLIBCXX_3.4 4.1.1 + _ZNSt15_List_node_base4swapERS_S0_@GLIBCXX_3.4 4.1.1 + _ZNSt15_List_node_base6unhookEv@GLIBCXX_3.4 4.1.1 + _ZNSt15_List_node_base7_M_hookEPS_@GLIBCXX_3.4.14 4.5 + _ZNSt15_List_node_base7reverseEv@GLIBCXX_3.4 4.1.1 + _ZNSt15_List_node_base8transferEPS_S0_@GLIBCXX_3.4 4.1.1 + _ZNSt15_List_node_base9_M_unhookEv@GLIBCXX_3.4.14 4.5 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6stosscEv@GLIBCXX_3.4.10 4.3 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6stosscEv@GLIBCXX_3.4.10 4.3 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv@GLIBCXX_3.4.6 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv@GLIBCXX_3.4.6 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15underflow_errorC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt15underflow_errorC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt15underflow_errorD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15underflow_errorD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt15underflow_errorD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt16__numpunct_cacheIcE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16invalid_argumentC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt16invalid_argumentC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt16invalid_argumentD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16invalid_argumentD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt16invalid_argumentD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt16nested_exceptionD0Ev@CXXABI_1.3.5 4.6 + _ZNSt16nested_exceptionD1Ev@CXXABI_1.3.5 4.6 + _ZNSt16nested_exceptionD2Ev@CXXABI_1.3.5 4.6 + _ZNSt17__timepunct_cacheIcE12_S_timezonesE@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwE12_S_timezonesE@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwED2Ev@GLIBCXX_3.4 4.1.1 +#MISSING: 4.6# _ZNSt17bad_function_callD0Ev@CXXABI_1.3.5 4.6 + _ZNSt17bad_function_callD0Ev@GLIBCXX_3.4.15 4.6 +#MISSING: 4.6# _ZNSt17bad_function_callD1Ev@CXXABI_1.3.5 4.6 + _ZNSt17bad_function_callD1Ev@GLIBCXX_3.4.15 4.6 +#MISSING: 4.6# _ZNSt17bad_function_callD2Ev@CXXABI_1.3.5 4.6 + _ZNSt17bad_function_callD2Ev@GLIBCXX_3.4.15 4.6 + _ZNSt17moneypunct_bynameIcLb0EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EE4intlE@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EE8_M_cacheERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt18condition_variable10notify_allEv@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variable10notify_oneEv@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variableC1Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variableC2Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variableD1Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt18condition_variableD2Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@GLIBCXX_3.4 4.1.1 + _ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@GLIBCXX_3.4.5 4.1.1 + _ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv@GLIBCXX_3.4 4.1.1 + _ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv@GLIBCXX_3.4.5 4.1.1 + _ZNSt21__numeric_limits_base10has_denormE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base10is_boundedE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base10is_integerE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base11round_styleE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base12has_infinityE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base12max_digits10E@GLIBCXX_3.4.14 4.5.0 + _ZNSt21__numeric_limits_base12max_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base12min_exponentE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base13has_quiet_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base14is_specializedE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base14max_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base14min_exponent10E@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base15has_denorm_lossE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base15tinyness_beforeE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base17has_signaling_NaNE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base5radixE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base5trapsE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base6digitsE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base8digits10E@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base8is_exactE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base9is_iec559E@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base9is_moduloE@GLIBCXX_3.4 4.1.1 + _ZNSt21__numeric_limits_base9is_signedE@GLIBCXX_3.4 4.1.1 + _ZNSt22condition_variable_anyC1Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt22condition_variable_anyC2Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt22condition_variable_anyD1Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt22condition_variable_anyD2Ev@GLIBCXX_3.4.11 4.4.0 + _ZNSt3tr18__detail12__prime_listE@GLIBCXX_3.4.10 4.3 + _ZNSt5ctypeIcE10table_sizeE@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcE13classic_tableEv@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwE19_M_initialize_ctypeEv@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6__norm15_List_node_base10_M_reverseEv@GLIBCXX_3.4.14 4.5 + _ZNSt6__norm15_List_node_base11_M_transferEPS0_S1_@GLIBCXX_3.4.14 4.5 + _ZNSt6__norm15_List_node_base4hookEPS0_@GLIBCXX_3.4.9 4.2.1 + _ZNSt6__norm15_List_node_base4swapERS0_S1_@GLIBCXX_3.4.9 4.2.1 + _ZNSt6__norm15_List_node_base6unhookEv@GLIBCXX_3.4.9 4.2.1 + _ZNSt6__norm15_List_node_base7_M_hookEPS0_@GLIBCXX_3.4.14 4.5 + _ZNSt6__norm15_List_node_base7reverseEv@GLIBCXX_3.4.9 4.2.1 + _ZNSt6__norm15_List_node_base8transferEPS0_S1_@GLIBCXX_3.4.9 4.2.1 + _ZNSt6__norm15_List_node_base9_M_unhookEv@GLIBCXX_3.4.14 4.5 + _ZNSt6chrono3_V212steady_clock3nowEv@GLIBCXX_3.4.19 4.8.1 + _ZNSt6chrono3_V212steady_clock9is_steadyE@GLIBCXX_3.4.19 4.8.1 + _ZNSt6chrono3_V212system_clock3nowEv@GLIBCXX_3.4.19 4.8.1 + _ZNSt6chrono3_V212system_clock9is_steadyE@GLIBCXX_3.4.19 4.8.1 + _ZNSt6chrono12system_clock12is_monotonicE@GLIBCXX_3.4.11 4.4.0 + _ZNSt6chrono12system_clock3nowEv@GLIBCXX_3.4.11 4.4.0 + _ZNSt6locale11_M_coalesceERKS_S1_i@GLIBCXX_3.4 4.1.1 + _ZNSt6locale21_S_normalize_categoryEi@GLIBCXX_3.4 4.1.1 + _ZNSt6locale3allE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale4noneE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale4timeE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPKNS_5facetE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_i@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5ctypeE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facet13_S_get_c_nameEv@GLIBCXX_3.4.6 4.1.1 + _ZNSt6locale5facet15_S_get_c_localeEv@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facetD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facetD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5facetD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6locale6globalERKS_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale7classicEv@GLIBCXX_3.4 4.1.1 + _ZNSt6locale7collateE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale7numericE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale8messagesE@GLIBCXX_3.4 4.1.1 + _ZNSt6locale8monetaryE@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1EPKc@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1EPNS_5_ImplE@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1ERKS_PKci@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1ERKS_S1_i@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2EPKc@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2EPNS_5_ImplE@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2ERKS_@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2ERKS_PKci@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2ERKS_S1_i@GLIBCXX_3.4 4.1.1 + _ZNSt6localeC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6localeD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6localeD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt6localeaSERKS_@GLIBCXX_3.4 4.1.1 + _ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE@GLIBCXX_3.4.11 4.4.0 + _ZNSt6thread20hardware_concurrencyEv@GLIBCXX_3.4.17 4.7 + _ZNSt6thread4joinEv@GLIBCXX_3.4.11 4.4.0 + _ZNSt6thread6detachEv@GLIBCXX_3.4.11 4.4.0 + _ZNSt7codecvtIcc11__mbstate_tE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8__detail12__prime_listE@GLIBCXX_3.4.10 4.3 + _ZNSt8__detail15_List_node_base10_M_reverseEv@GLIBCXX_3.4.15 4.6 + _ZNSt8__detail15_List_node_base11_M_transferEPS0_S1_@GLIBCXX_3.4.15 4.6 + _ZNSt8__detail15_List_node_base4swapERS0_S1_@GLIBCXX_3.4.15 4.6 + _ZNSt8__detail15_List_node_base7_M_hookEPS0_@GLIBCXX_3.4.15 4.6 + _ZNSt8__detail15_List_node_base9_M_unhookEv@GLIBCXX_3.4.15 4.6 + _ZNSt8bad_castD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8bad_castD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8bad_castD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base10floatfieldE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base10scientificE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base11adjustfieldE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base13_M_grow_wordsEib@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base15sync_with_stdioEb@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base17_M_call_callbacksENS_5eventE@GLIBCXX_3.4.6 4.1.1 + _ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base20_M_dispose_callbacksEv@GLIBCXX_3.4.6 4.1.1 + _ZNSt8ios_base2inE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3appE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3ateE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3begE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3curE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3decE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3endE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3hexE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3octE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base3outE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base4InitC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base4InitC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base4InitD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base4InitD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base4leftE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base5fixedE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base5rightE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base5truncE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base6badbitE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base6binaryE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base6eofbitE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base6skipwsE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base6xallocEv@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7_M_initEv@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failbitE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failureC1ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failureC2ERKSs@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failureD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failureD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7failureD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7goodbitE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7showposE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base7unitbufE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base8internalE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base8showbaseE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base9basefieldE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base9boolalphaE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base9showpointE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_base9uppercaseE@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_baseC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_baseC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_baseD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_baseD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8ios_baseD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9__atomic011atomic_flag12test_and_setESt12memory_order@GLIBCXX_3.4.14 4.5 + _ZNSt9__atomic011atomic_flag5clearESt12memory_order@GLIBCXX_3.4.14 4.5 + _ZNSt9__cxx199815_List_node_base10_M_reverseEv@GLIBCXX_3.4.14 4.5 + _ZNSt9__cxx199815_List_node_base11_M_transferEPS0_S1_@GLIBCXX_3.4.14 4.5 + _ZNSt9__cxx199815_List_node_base4hookEPS0_@GLIBCXX_3.4.10 4.3 + _ZNSt9__cxx199815_List_node_base4swapERS0_S1_@GLIBCXX_3.4.10 4.3 + _ZNSt9__cxx199815_List_node_base7_M_hookEPS0_@GLIBCXX_3.4.14 4.5 + _ZNSt9__cxx199815_List_node_base6unhookEv@GLIBCXX_3.4.10 4.3 + _ZNSt9__cxx199815_List_node_base7reverseEv@GLIBCXX_3.4.10 4.3 + _ZNSt9__cxx199815_List_node_base8transferEPS0_S1_@GLIBCXX_3.4.10 4.3 + _ZNSt9__cxx199815_List_node_base9_M_unhookEv@GLIBCXX_3.4.14 4.5 + _ZNSt9bad_allocD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9bad_allocD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9bad_allocD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE11_M_setstateESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_localeERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE11_M_setstateESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_localeERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9exceptionD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9exceptionD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9exceptionD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9strstream3strEv@GLIBCXX_3.4 4.1.1 + _ZNSt9strstream6freezeEb@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamC1EPciSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamC1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamC2EPciSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamC2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9strstreamD2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9type_infoD0Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9type_infoD1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt9type_infoD2Ev@GLIBCXX_3.4 4.1.1 + _ZNVSt9__atomic011atomic_flag12test_and_setESt12memory_order@GLIBCXX_3.4.11 4.4.0 + _ZNVSt9__atomic011atomic_flag5clearESt12memory_order@GLIBCXX_3.4.11 4.4.0 + _ZSt10adopt_lock@GLIBCXX_3.4.11 4.4.0 + _ZSt10defer_lock@GLIBCXX_3.4.11 4.4.0 + _ZSt10unexpectedv@GLIBCXX_3.4 4.1.1 + _ZSt11__once_call@GLIBCXX_3.4.11 4.4.0 + _ZSt11try_to_lock@GLIBCXX_3.4.11 4.4.0 + _ZSt13set_terminatePFvvE@GLIBCXX_3.4 4.1.1 + _ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_3.4 4.1.1 + _ZSt14set_unexpectedPFvvE@GLIBCXX_3.4 4.1.1 + _ZSt15__once_callable@GLIBCXX_3.4.11 4.4.0 + _ZSt15future_category@GLIBCXX_3.4.14 4.5 + _ZSt15future_categoryv@GLIBCXX_3.4.15 4.6 + _ZSt15set_new_handlerPFvvE@GLIBCXX_3.4 4.1.1 + _ZSt15system_categoryv@GLIBCXX_3.4.11 4.4.0 + _ZSt16__throw_bad_castv@GLIBCXX_3.4 4.1.1 + _ZSt16generic_categoryv@GLIBCXX_3.4.11 4.4.0 + _ZSt17__throw_bad_allocv@GLIBCXX_3.4 4.1.1 + _ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@GLIBCXX_3.4 4.1.1 + _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@GLIBCXX_3.4 4.1.1 + _ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base@GLIBCXX_3.4 4.1.1 + _ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base@GLIBCXX_3.4 4.1.1 + _ZSt18__throw_bad_typeidv@GLIBCXX_3.4 4.1.1 + _ZSt18uncaught_exceptionv@GLIBCXX_3.4 4.1.1 + _ZSt19__throw_ios_failurePKc@GLIBCXX_3.4 4.1.1 + _ZSt19__throw_logic_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt19__throw_range_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt19__throw_regex_errorNSt15regex_constants10error_typeE@GLIBCXX_3.4.15 4.6 + _ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_@GLIBCXX_3.4 4.1.1 + _ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_@GLIBCXX_3.4 4.1.1 + _ZSt20__throw_domain_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt20__throw_future_errori@GLIBCXX_3.4.14 4.5 + _ZSt20__throw_length_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt20__throw_out_of_rangePKc@GLIBCXX_3.4 4.1.1 + _ZSt20__throw_system_errori@GLIBCXX_3.4.11 4.4.0 + _ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_@GLIBCXX_3.4 4.1.1 + _ZSt21__throw_bad_exceptionv@GLIBCXX_3.4 4.1.1 + _ZSt21__throw_runtime_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt22__throw_overflow_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt23__throw_underflow_errorPKc@GLIBCXX_3.4 4.1.1 + _ZSt24__throw_invalid_argumentPKc@GLIBCXX_3.4 4.1.1 + _ZSt25__throw_bad_function_callv@GLIBCXX_3.4.14 4.5 + _ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_@GLIBCXX_3.4 4.1.1 + _ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@GLIBCXX_3.4 4.1.1 + _ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt3cin@GLIBCXX_3.4 4.1.1 + _ZSt4cerr@GLIBCXX_3.4 4.1.1 + _ZSt4clog@GLIBCXX_3.4 4.1.1 + _ZSt4cout@GLIBCXX_3.4 4.1.1 + _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt4wcin@GLIBCXX_3.4 4.1.1 + _ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4 4.1.1 + _ZSt5wcerr@GLIBCXX_3.4 4.1.1 + _ZSt5wclog@GLIBCXX_3.4 4.1.1 + _ZSt5wcout@GLIBCXX_3.4 4.1.1 + _ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@GLIBCXX_3.4 4.1.1 + _ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@GLIBCXX_3.4 4.1.1 + _ZSt7nothrow@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt5ctypeIcEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt5ctypeIwEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7collateIcEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7collateIwEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8messagesIcEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8messagesIwEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8numpunctIcEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8numpunctIwEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9terminatev@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7collateIcEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7collateIwEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@GLIBCXX_3.4 4.1.1 + _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@GLIBCXX_3.4 4.1.1 + _ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@GLIBCXX_3.4 4.1.1 + _ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@GLIBCXX_3.4 4.1.1 + _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@GLIBCXX_3.4 4.1.1 + _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@GLIBCXX_3.4 4.1.1 + _ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@GLIBCXX_3.4 4.1.1 + _ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ERKS6_S8_@GLIBCXX_3.4 4.1.1 + _ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@GLIBCXX_3.4 4.1.1 + _ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@GLIBCXX_3.4 4.1.1 + _ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@GLIBCXX_3.4 4.1.1 + _ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@GLIBCXX_3.4 4.1.1 + _ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@GLIBCXX_3.4 4.1.1 + _ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@GLIBCXX_3.4 4.1.1 + _ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@GLIBCXX_3.4 4.1.1 + _ZTIDd@CXXABI_1.3.4 4.5 + _ZTIDe@CXXABI_1.3.4 4.5 + _ZTIDf@CXXABI_1.3.4 4.5 + _ZTIDi@CXXABI_1.3.3 4.4.0 + _ZTIDn@CXXABI_1.3.5 4.6 + _ZTIDs@CXXABI_1.3.3 4.4.0 + _ZTIN10__cxxabiv115__forced_unwindE@CXXABI_1.3.2 4.3 + _ZTIN10__cxxabiv116__enum_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv117__array_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv117__class_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv117__pbase_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv119__foreign_exceptionE@CXXABI_1.3.2 4.3 + _ZTIN10__cxxabiv119__pointer_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv120__function_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv120__si_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv121__vmi_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv123__fundamental_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN10__cxxabiv129__pointer_to_member_type_infoE@CXXABI_1.3 4.1.1 + _ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTIN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTIN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTINSt13__future_base11_State_baseE@GLIBCXX_3.4.15 4.6 + _ZTINSt13__future_base12_Result_baseE@GLIBCXX_3.4.15 4.6 + _ZTINSt13__future_base19_Async_state_commonE@GLIBCXX_3.4.17 4.7.0~rc1 + _ZTINSt6locale5facetE@GLIBCXX_3.4 4.1.1 + _ZTINSt8ios_base7failureE@GLIBCXX_3.4 4.1.1 + _ZTIPDd@CXXABI_1.3.4 4.5 + _ZTIPDe@CXXABI_1.3.4 4.5 + _ZTIPDf@CXXABI_1.3.4 4.5 + _ZTIPDi@CXXABI_1.3.3 4.4.0 + _ZTIPDn@CXXABI_1.3.5 4.6 + _ZTIPDs@CXXABI_1.3.3 4.4.0 + _ZTIPKDd@CXXABI_1.3.4 4.5 + _ZTIPKDe@CXXABI_1.3.4 4.5 + _ZTIPKDf@CXXABI_1.3.4 4.5 + _ZTIPKDi@CXXABI_1.3.3 4.4.0 + _ZTIPKDn@CXXABI_1.3.5 4.6 + _ZTIPKDs@CXXABI_1.3.3 4.4.0 + _ZTIPKa@CXXABI_1.3 4.1.1 + _ZTIPKb@CXXABI_1.3 4.1.1 + _ZTIPKc@CXXABI_1.3 4.1.1 + _ZTIPKd@CXXABI_1.3 4.1.1 + _ZTIPKe@CXXABI_1.3 4.1.1 + _ZTIPKf@CXXABI_1.3 4.1.1 + _ZTIPKh@CXXABI_1.3 4.1.1 + _ZTIPKi@CXXABI_1.3 4.1.1 + _ZTIPKj@CXXABI_1.3 4.1.1 + _ZTIPKl@CXXABI_1.3 4.1.1 + _ZTIPKm@CXXABI_1.3 4.1.1 + _ZTIPKs@CXXABI_1.3 4.1.1 + _ZTIPKt@CXXABI_1.3 4.1.1 + _ZTIPKv@CXXABI_1.3 4.1.1 + _ZTIPKw@CXXABI_1.3 4.1.1 + _ZTIPKx@CXXABI_1.3 4.1.1 + _ZTIPKy@CXXABI_1.3 4.1.1 + _ZTIPa@CXXABI_1.3 4.1.1 + _ZTIPb@CXXABI_1.3 4.1.1 + _ZTIPc@CXXABI_1.3 4.1.1 + _ZTIPd@CXXABI_1.3 4.1.1 + _ZTIPe@CXXABI_1.3 4.1.1 + _ZTIPf@CXXABI_1.3 4.1.1 + _ZTIPh@CXXABI_1.3 4.1.1 + _ZTIPi@CXXABI_1.3 4.1.1 + _ZTIPj@CXXABI_1.3 4.1.1 + _ZTIPl@CXXABI_1.3 4.1.1 + _ZTIPm@CXXABI_1.3 4.1.1 + _ZTIPs@CXXABI_1.3 4.1.1 + _ZTIPt@CXXABI_1.3 4.1.1 + _ZTIPv@CXXABI_1.3 4.1.1 + _ZTIPw@CXXABI_1.3 4.1.1 + _ZTIPx@CXXABI_1.3 4.1.1 + _ZTIPy@CXXABI_1.3 4.1.1 + _ZTISd@GLIBCXX_3.4 4.1.1 + _ZTISi@GLIBCXX_3.4 4.1.1 + _ZTISo@GLIBCXX_3.4 4.1.1 + _ZTISt10bad_typeid@GLIBCXX_3.4 4.1.1 + _ZTISt10ctype_base@GLIBCXX_3.4 4.1.1 + _ZTISt10istrstream@GLIBCXX_3.4 4.1.1 + _ZTISt10lock_error@GLIBCXX_3.4.11 4.4.0 + _ZTISt10money_base@GLIBCXX_3.4 4.1.1 + _ZTISt10moneypunctIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTISt10moneypunctIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTISt10moneypunctIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTISt10moneypunctIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTISt10ostrstream@GLIBCXX_3.4 4.1.1 + _ZTISt11__timepunctIcE@GLIBCXX_3.4 4.1.1 + _ZTISt11__timepunctIwE@GLIBCXX_3.4 4.1.1 + _ZTISt11logic_error@GLIBCXX_3.4 4.1.1 + _ZTISt11range_error@GLIBCXX_3.4 4.1.1 + _ZTISt11regex_error@GLIBCXX_3.4.15 4.6 + _ZTISt12bad_weak_ptr@GLIBCXX_3.4.15 4.6 + _ZTISt12codecvt_base@GLIBCXX_3.4 4.1.1 + _ZTISt12ctype_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTISt12ctype_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTISt12domain_error@GLIBCXX_3.4 4.1.1 + _ZTISt12future_error@GLIBCXX_3.4.14 4.5 + _ZTISt12length_error@GLIBCXX_3.4 4.1.1 + _ZTISt12out_of_range@GLIBCXX_3.4 4.1.1 + _ZTISt12strstreambuf@GLIBCXX_3.4 4.1.1 + _ZTISt12system_error@GLIBCXX_3.4.11 4.4.0 + _ZTISt13bad_exception@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_filebufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_filebufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_fstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_fstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_istreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt13basic_ostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt13messages_base@GLIBCXX_3.4 4.1.1 + _ZTISt13runtime_error@GLIBCXX_3.4 4.1.1 + _ZTISt14basic_ifstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt14basic_ifstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt14basic_iostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt14basic_ofstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt14basic_ofstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt14codecvt_bynameIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt14codecvt_bynameIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt14collate_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTISt14collate_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTISt14error_category@GLIBCXX_3.4.11 4.4.0 + _ZTISt14overflow_error@GLIBCXX_3.4 4.1.1 + _ZTISt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt15basic_streambufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt15messages_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTISt15messages_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTISt15numpunct_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTISt15numpunct_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt15underflow_error@GLIBCXX_3.4 4.1.1 + _ZTISt16invalid_argument@GLIBCXX_3.4 4.1.1 + _ZTISt16nested_exception@CXXABI_1.3.5 4.6 +#MISSING: 4.6# _ZTISt17bad_function_call@CXXABI_1.3.5 4.6 + _ZTISt17bad_function_call@GLIBCXX_3.4.15 4.6 + _ZTISt17moneypunct_bynameIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTISt17moneypunct_bynameIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTISt17moneypunct_bynameIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTISt17moneypunct_bynameIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt21__ctype_abstract_baseIcE@GLIBCXX_3.4 4.1.1 + _ZTISt21__ctype_abstract_baseIwE@GLIBCXX_3.4 4.1.1 + _ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt5ctypeIcE@GLIBCXX_3.4 4.1.1 + _ZTISt5ctypeIwE@GLIBCXX_3.4 4.1.1 + _ZTISt7codecvtIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt7codecvtIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTISt7collateIcE@GLIBCXX_3.4 4.1.1 + _ZTISt7collateIwE@GLIBCXX_3.4 4.1.1 + _ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt8bad_cast@GLIBCXX_3.4 4.1.1 + _ZTISt8ios_base@GLIBCXX_3.4 4.1.1 + _ZTISt8messagesIcE@GLIBCXX_3.4 4.1.1 + _ZTISt8messagesIwE@GLIBCXX_3.4 4.1.1 + _ZTISt8numpunctIcE@GLIBCXX_3.4 4.1.1 + _ZTISt8numpunctIwE@GLIBCXX_3.4 4.1.1 + _ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt9bad_alloc@GLIBCXX_3.4 4.1.1 + _ZTISt9basic_iosIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTISt9basic_iosIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTISt9exception@GLIBCXX_3.4 4.1.1 + _ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTISt9strstream@GLIBCXX_3.4 4.1.1 + _ZTISt9time_base@GLIBCXX_3.4 4.1.1 + _ZTISt9type_info@GLIBCXX_3.4 4.1.1 + _ZTIa@CXXABI_1.3 4.1.1 + _ZTIb@CXXABI_1.3 4.1.1 + _ZTIc@CXXABI_1.3 4.1.1 + _ZTId@CXXABI_1.3 4.1.1 + _ZTIe@CXXABI_1.3 4.1.1 + _ZTIf@CXXABI_1.3 4.1.1 + _ZTIh@CXXABI_1.3 4.1.1 + _ZTIi@CXXABI_1.3 4.1.1 + _ZTIj@CXXABI_1.3 4.1.1 + _ZTIl@CXXABI_1.3 4.1.1 + _ZTIm@CXXABI_1.3 4.1.1 + _ZTIs@CXXABI_1.3 4.1.1 + _ZTIt@CXXABI_1.3 4.1.1 + _ZTIv@CXXABI_1.3 4.1.1 + _ZTIw@CXXABI_1.3 4.1.1 + _ZTIx@CXXABI_1.3 4.1.1 + _ZTIy@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv116__enum_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv117__array_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv117__class_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv117__pbase_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv119__pointer_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv120__function_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv120__si_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv121__vmi_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv123__fundamental_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN10__cxxabiv129__pointer_to_member_type_infoE@CXXABI_1.3 4.1.1 + _ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSNSt13__future_base19_Async_state_commonE@GLIBCXX_3.4.17 4.7.0~rc1 + _ZTSNSt6locale5facetE@GLIBCXX_3.4 4.1.1 + _ZTSNSt8ios_base7failureE@GLIBCXX_3.4 4.1.1 + _ZTSPKa@CXXABI_1.3 4.1.1 + _ZTSPKb@CXXABI_1.3 4.1.1 + _ZTSPKc@CXXABI_1.3 4.1.1 + _ZTSPKd@CXXABI_1.3 4.1.1 + _ZTSPKe@CXXABI_1.3 4.1.1 + _ZTSPKf@CXXABI_1.3 4.1.1 + _ZTSPKh@CXXABI_1.3 4.1.1 + _ZTSPKi@CXXABI_1.3 4.1.1 + _ZTSPKj@CXXABI_1.3 4.1.1 + _ZTSPKl@CXXABI_1.3 4.1.1 + _ZTSPKm@CXXABI_1.3 4.1.1 + _ZTSPKs@CXXABI_1.3 4.1.1 + _ZTSPKt@CXXABI_1.3 4.1.1 + _ZTSPKv@CXXABI_1.3 4.1.1 + _ZTSPKw@CXXABI_1.3 4.1.1 + _ZTSPKx@CXXABI_1.3 4.1.1 + _ZTSPKy@CXXABI_1.3 4.1.1 + _ZTSPa@CXXABI_1.3 4.1.1 + _ZTSPb@CXXABI_1.3 4.1.1 + _ZTSPc@CXXABI_1.3 4.1.1 + _ZTSPd@CXXABI_1.3 4.1.1 + _ZTSPe@CXXABI_1.3 4.1.1 + _ZTSPf@CXXABI_1.3 4.1.1 + _ZTSPh@CXXABI_1.3 4.1.1 + _ZTSPi@CXXABI_1.3 4.1.1 + _ZTSPj@CXXABI_1.3 4.1.1 + _ZTSPl@CXXABI_1.3 4.1.1 + _ZTSPm@CXXABI_1.3 4.1.1 + _ZTSPs@CXXABI_1.3 4.1.1 + _ZTSPt@CXXABI_1.3 4.1.1 + _ZTSPv@CXXABI_1.3 4.1.1 + _ZTSPw@CXXABI_1.3 4.1.1 + _ZTSPx@CXXABI_1.3 4.1.1 + _ZTSPy@CXXABI_1.3 4.1.1 + _ZTSSd@GLIBCXX_3.4 4.1.1 + _ZTSSi@GLIBCXX_3.4 4.1.1 + _ZTSSo@GLIBCXX_3.4 4.1.1 + _ZTSSt10bad_typeid@GLIBCXX_3.4 4.1.1 + _ZTSSt10ctype_base@GLIBCXX_3.4 4.1.1 + _ZTSSt10istrstream@GLIBCXX_3.4 4.1.1 + _ZTSSt10lock_error@GLIBCXX_3.4.11 4.4.0 + _ZTSSt10money_base@GLIBCXX_3.4 4.1.1 + _ZTSSt10moneypunctIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTSSt10moneypunctIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTSSt10moneypunctIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTSSt10moneypunctIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTSSt10ostrstream@GLIBCXX_3.4 4.1.1 + _ZTSSt11__timepunctIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt11__timepunctIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt11logic_error@GLIBCXX_3.4 4.1.1 + _ZTSSt11range_error@GLIBCXX_3.4 4.1.1 + _ZTSSt12codecvt_base@GLIBCXX_3.4 4.1.1 + _ZTSSt12ctype_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt12ctype_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt12domain_error@GLIBCXX_3.4 4.1.1 + _ZTSSt12future_error@GLIBCXX_3.4.14 4.5 + _ZTSSt12length_error@GLIBCXX_3.4 4.1.1 + _ZTSSt12out_of_range@GLIBCXX_3.4 4.1.1 + _ZTSSt12strstreambuf@GLIBCXX_3.4 4.1.1 + _ZTSSt12system_error@GLIBCXX_3.4.11 4.4.0 + _ZTSSt13bad_exception@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_filebufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_filebufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_fstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_fstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_istreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13basic_ostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt13messages_base@GLIBCXX_3.4 4.1.1 + _ZTSSt13runtime_error@GLIBCXX_3.4 4.1.1 + _ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt14basic_iostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt14codecvt_bynameIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt14codecvt_bynameIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt14collate_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt14collate_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt14error_category@GLIBCXX_3.4.11 4.4.0 + _ZTSSt14overflow_error@GLIBCXX_3.4 4.1.1 + _ZTSSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15basic_streambufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15messages_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt15messages_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt15numpunct_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt15numpunct_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt15underflow_error@GLIBCXX_3.4 4.1.1 + _ZTSSt16invalid_argument@GLIBCXX_3.4 4.1.1 + _ZTSSt17moneypunct_bynameIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTSSt17moneypunct_bynameIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTSSt17moneypunct_bynameIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTSSt17moneypunct_bynameIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt21__ctype_abstract_baseIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt21__ctype_abstract_baseIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt5ctypeIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt5ctypeIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt7codecvtIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt7codecvtIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTSSt7collateIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt7collateIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt8bad_cast@GLIBCXX_3.4 4.1.1 + _ZTSSt8ios_base@GLIBCXX_3.4 4.1.1 + _ZTSSt8messagesIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt8messagesIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt8numpunctIcE@GLIBCXX_3.4 4.1.1 + _ZTSSt8numpunctIwE@GLIBCXX_3.4 4.1.1 + _ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9bad_alloc@GLIBCXX_3.4 4.1.1 + _ZTSSt9basic_iosIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9basic_iosIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9exception@GLIBCXX_3.4 4.1.1 + _ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTSSt9strstream@GLIBCXX_3.4 4.1.1 + _ZTSSt9time_base@GLIBCXX_3.4 4.1.1 + _ZTSSt9type_info@GLIBCXX_3.4 4.1.1 + _ZTSa@CXXABI_1.3 4.1.1 + _ZTSb@CXXABI_1.3 4.1.1 + _ZTSc@CXXABI_1.3 4.1.1 + _ZTSd@CXXABI_1.3 4.1.1 + _ZTSe@CXXABI_1.3 4.1.1 + _ZTSf@CXXABI_1.3 4.1.1 + _ZTSh@CXXABI_1.3 4.1.1 + _ZTSi@CXXABI_1.3 4.1.1 + _ZTSj@CXXABI_1.3 4.1.1 + _ZTSl@CXXABI_1.3 4.1.1 + _ZTSm@CXXABI_1.3 4.1.1 + _ZTSs@CXXABI_1.3 4.1.1 + _ZTSt@CXXABI_1.3 4.1.1 + _ZTSv@CXXABI_1.3 4.1.1 + _ZTSw@CXXABI_1.3 4.1.1 + _ZTSx@CXXABI_1.3 4.1.1 + _ZTSy@CXXABI_1.3 4.1.1 + _ZTTSd@GLIBCXX_3.4 4.1.1 + _ZTTSi@GLIBCXX_3.4 4.1.1 + _ZTTSo@GLIBCXX_3.4 4.1.1 + _ZTTSt10istrstream@GLIBCXX_3.4 4.1.1 + _ZTTSt10ostrstream@GLIBCXX_3.4 4.1.1 + _ZTTSt13basic_fstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt13basic_fstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt13basic_istreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt13basic_ostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt14basic_iostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTTSt9strstream@GLIBCXX_3.4 4.1.1 + _ZTVN10__cxxabiv116__enum_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv117__array_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv117__pbase_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv119__pointer_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv120__function_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv120__si_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv121__vmi_class_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv123__fundamental_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN10__cxxabiv129__pointer_to_member_type_infoE@CXXABI_1.3 4.1.1 + _ZTVN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVNSt13__future_base11_State_baseE@GLIBCXX_3.4.15 4.6 + _ZTVNSt13__future_base12_Result_baseE@GLIBCXX_3.4.15 4.6 + _ZTVNSt13__future_base19_Async_state_commonE@GLIBCXX_3.4.17 4.7.0~rc1 + _ZTVNSt6locale5facetE@GLIBCXX_3.4 4.1.1 + _ZTVNSt8ios_base7failureE@GLIBCXX_3.4 4.1.1 + _ZTVSd@GLIBCXX_3.4 4.1.1 + _ZTVSi@GLIBCXX_3.4 4.1.1 + _ZTVSo@GLIBCXX_3.4 4.1.1 + _ZTVSt10bad_typeid@GLIBCXX_3.4 4.1.1 + _ZTVSt10istrstream@GLIBCXX_3.4 4.1.1 + _ZTVSt10lock_error@GLIBCXX_3.4.11 4.4.0 + _ZTVSt10moneypunctIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTVSt10moneypunctIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTVSt10moneypunctIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTVSt10moneypunctIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTVSt10ostrstream@GLIBCXX_3.4 4.1.1 + _ZTVSt11__timepunctIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt11__timepunctIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt11logic_error@GLIBCXX_3.4 4.1.1 + _ZTVSt11range_error@GLIBCXX_3.4 4.1.1 + _ZTVSt11regex_error@GLIBCXX_3.4.15 4.6 + _ZTVSt12bad_weak_ptr@GLIBCXX_3.4.15 4.6 + _ZTVSt12ctype_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt12ctype_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt12domain_error@GLIBCXX_3.4 4.1.1 + _ZTVSt12future_error@GLIBCXX_3.4.14 4.5 + _ZTVSt12length_error@GLIBCXX_3.4 4.1.1 + _ZTVSt12out_of_range@GLIBCXX_3.4 4.1.1 + _ZTVSt12strstreambuf@GLIBCXX_3.4 4.1.1 + _ZTVSt12system_error@GLIBCXX_3.4.11 4.4.0 + _ZTVSt13bad_exception@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_filebufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_filebufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_fstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_fstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_istreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13basic_ostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt13runtime_error@GLIBCXX_3.4 4.1.1 + _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt14basic_iostreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt14codecvt_bynameIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt14codecvt_bynameIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt14collate_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt14collate_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt14error_category@GLIBCXX_3.4.11 4.4.0 + _ZTVSt14overflow_error@GLIBCXX_3.4 4.1.1 + _ZTVSt15basic_streambufIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15basic_streambufIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15messages_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt15messages_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt15numpunct_bynameIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt15numpunct_bynameIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt15underflow_error@GLIBCXX_3.4 4.1.1 + _ZTVSt16invalid_argument@GLIBCXX_3.4 4.1.1 + _ZTVSt16nested_exception@CXXABI_1.3.5 4.6 +#MISSING: 4.6# _ZTVSt17bad_function_call@CXXABI_1.3.5 4.6 + _ZTVSt17bad_function_call@GLIBCXX_3.4.15 4.6 + _ZTVSt17moneypunct_bynameIcLb0EE@GLIBCXX_3.4 4.1.1 + _ZTVSt17moneypunct_bynameIcLb1EE@GLIBCXX_3.4 4.1.1 + _ZTVSt17moneypunct_bynameIwLb0EE@GLIBCXX_3.4 4.1.1 + _ZTVSt17moneypunct_bynameIwLb1EE@GLIBCXX_3.4 4.1.1 + _ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt21__ctype_abstract_baseIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt21__ctype_abstract_baseIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt5ctypeIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt5ctypeIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt7codecvtIcc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt7codecvtIwc11__mbstate_tE@GLIBCXX_3.4 4.1.1 + _ZTVSt7collateIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt7collateIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt8bad_cast@GLIBCXX_3.4 4.1.1 + _ZTVSt8ios_base@GLIBCXX_3.4 4.1.1 + _ZTVSt8messagesIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt8messagesIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt8numpunctIcE@GLIBCXX_3.4 4.1.1 + _ZTVSt8numpunctIwE@GLIBCXX_3.4 4.1.1 + _ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9bad_alloc@GLIBCXX_3.4 4.1.1 + _ZTVSt9basic_iosIcSt11char_traitsIcEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9basic_iosIwSt11char_traitsIwEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9exception@GLIBCXX_3.4 4.1.1 + _ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@GLIBCXX_3.4 4.1.1 + _ZTVSt9strstream@GLIBCXX_3.4 4.1.1 + _ZTVSt9type_info@GLIBCXX_3.4 4.1.1 + _ZdaPv@GLIBCXX_3.4 4.1.1 + _ZdaPvRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _ZdlPv@GLIBCXX_3.4 4.1.1 + _ZdlPvRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + __atomic_flag_for_address@GLIBCXX_3.4.11 4.4.0 + __atomic_flag_wait_explicit@GLIBCXX_3.4.11 4.4.0 + __cxa_allocate_dependent_exception@CXXABI_1.3.6 4.7 + __cxa_allocate_exception@CXXABI_1.3 4.1.1 + __cxa_bad_cast@CXXABI_1.3 4.1.1 + __cxa_bad_typeid@CXXABI_1.3 4.1.1 + __cxa_begin_catch@CXXABI_1.3 4.1.1 + __cxa_call_unexpected@CXXABI_1.3 4.1.1 + __cxa_current_exception_type@CXXABI_1.3 4.1.1 + __cxa_deleted_virtual@CXXABI_1.3.6 4.7 + __cxa_demangle@CXXABI_1.3 4.1.1 + __cxa_end_catch@CXXABI_1.3 4.1.1 + __cxa_free_dependent_exception@CXXABI_1.3.6 4.7 + __cxa_free_exception@CXXABI_1.3 4.1.1 + __cxa_get_exception_ptr@CXXABI_1.3.1 4.1.1 + __cxa_get_globals@CXXABI_1.3 4.1.1 + __cxa_get_globals_fast@CXXABI_1.3 4.1.1 + __cxa_guard_abort@CXXABI_1.3 4.1.1 + __cxa_guard_acquire@CXXABI_1.3 4.1.1 + __cxa_guard_release@CXXABI_1.3 4.1.1 + __cxa_pure_virtual@CXXABI_1.3 4.1.1 + __cxa_rethrow@CXXABI_1.3 4.1.1 + __cxa_thread_atexit@CXXABI_1.3.7 4.8 + __cxa_throw@CXXABI_1.3 4.1.1 + __cxa_tm_cleanup@CXXABI_TM_1 4.7 + __cxa_vec_cctor@CXXABI_1.3 4.1.1 + __cxa_vec_cleanup@CXXABI_1.3 4.1.1 + __cxa_vec_ctor@CXXABI_1.3 4.1.1 + __cxa_vec_delete2@CXXABI_1.3 4.1.1 + __cxa_vec_delete3@CXXABI_1.3 4.1.1 + __cxa_vec_delete@CXXABI_1.3 4.1.1 + __cxa_vec_dtor@CXXABI_1.3 4.1.1 + __cxa_vec_new2@CXXABI_1.3 4.1.1 + __cxa_vec_new3@CXXABI_1.3 4.1.1 + __cxa_vec_new@CXXABI_1.3 4.1.1 + __dynamic_cast@CXXABI_1.3 4.1.1 + __once_proxy@GLIBCXX_3.4.11 4.4.0 + atomic_flag_clear_explicit@GLIBCXX_3.4.11 4.4.0 + atomic_flag_test_and_set_explicit@GLIBCXX_3.4.11 4.4.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.excprop +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.excprop @@ -0,0 +1,17 @@ + _ZNKSt15__exception_ptr13exception_ptr20__cxa_exception_typeEv@CXXABI_1.3.3 4.4.0 + _ZNKSt15__exception_ptr13exception_ptrcvMS0_FvvEEv@CXXABI_1.3.3 4.4.0 + _ZNKSt15__exception_ptr13exception_ptrntEv@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptr4swapERS0_@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC1EMS0_FvvE@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC1ERKS0_@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC1Ev@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC2EMS0_FvvE@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC2ERKS0_@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrC2Ev@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrD1Ev@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptrD2Ev@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptr13exception_ptraSERKS0_@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptreqERKNS_13exception_ptrES2_@CXXABI_1.3.3 4.4.0 + _ZNSt15__exception_ptrneERKNS_13exception_ptrES2_@CXXABI_1.3.3 4.4.0 + _ZSt17current_exceptionv@CXXABI_1.3.3 4.4.0 + _ZSt17rethrow_exceptionNSt15__exception_ptr13exception_ptrE@CXXABI_1.3.3 4.4.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.glibcxxmath +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.glibcxxmath @@ -0,0 +1,22 @@ + acosl@GLIBCXX_3.4.3 4.1.1 + asinl@GLIBCXX_3.4.3 4.1.1 + atan2l@GLIBCXX_3.4 4.1.1 + atanl@GLIBCXX_3.4.3 4.1.1 + ceill@GLIBCXX_3.4.3 4.1.1 + coshl@GLIBCXX_3.4 4.1.1 + cosl@GLIBCXX_3.4 4.1.1 + expl@GLIBCXX_3.4 4.1.1 + floorl@GLIBCXX_3.4.3 4.1.1 + fmodl@GLIBCXX_3.4.3 4.1.1 + frexpl@GLIBCXX_3.4.3 4.1.1 + hypotl@GLIBCXX_3.4 4.1.1 + ldexpl@GLIBCXX_3.4.3 4.1.1 + log10l@GLIBCXX_3.4 4.1.1 + logl@GLIBCXX_3.4 4.1.1 + modfl@GLIBCXX_3.4.3 4.1.1 + powl@GLIBCXX_3.4 4.1.1 + sinhl@GLIBCXX_3.4 4.1.1 + sinl@GLIBCXX_3.4 4.1.1 + sqrtl@GLIBCXX_3.4 4.1.1 + tanhl@GLIBCXX_3.4 4.1.1 + tanl@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.hppa +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.hppa @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.excprop" +# removed, see PR libstdc++/39491 __signbitl@GLIBCXX_3.4 4.2.1 +#include "libstdc++6.symbols.glibcxxmath" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.hurd-i386 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.hurd-i386 @@ -0,0 +1,5 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit.hurd" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.i386 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.i386 @@ -0,0 +1,6 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ia64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ia64 @@ -0,0 +1,53 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNSt14numeric_limitsInE10has_denormE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE10is_boundedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE10is_integerE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE11round_styleE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12has_infinityE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12max_digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12max_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE12min_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE13has_quiet_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14is_specializedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14max_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE14min_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE15has_denorm_lossE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE15tinyness_beforeE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE17has_signaling_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE5radixE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE5trapsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE6digitsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE8digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE8is_exactE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_iec559E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_moduloE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsInE9is_signedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10has_denormE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10is_boundedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE10is_integerE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE11round_styleE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12has_infinityE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12max_digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12max_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE12min_exponentE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE13has_quiet_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14is_specializedE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14max_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE14min_exponent10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE15has_denorm_lossE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE15tinyness_beforeE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE17has_signaling_NaNE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE5radixE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE5trapsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE6digitsE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE8digits10E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE8is_exactE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_iec559E@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_moduloE@GLIBCXX_3.4.17 4.8 + _ZNSt14numeric_limitsIoE9is_signedE@GLIBCXX_3.4.17 4.8 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.kfreebsd-amd64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.kfreebsd-amd64 @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.kfreebsd-i386 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.kfreebsd-i386 @@ -0,0 +1,6 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ldbl.32bit +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ldbl.32bit @@ -0,0 +1,284 @@ + CXXABI_LDBL_1.3@CXXABI_LDBL_1.3 4.2.1 + GLIBCXX_LDBL_3.4.10@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + GLIBCXX_LDBL_3.4.7@GLIBCXX_LDBL_3.4.7 4.2.1 + GLIBCXX_LDBL_3.4@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt3tr14hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZNKSt4hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcjcS7_PcS8_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIgEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcjwRSt8ios_basePwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcjwPKwPwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIgEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_bRSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_bRSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSi10_M_extractIgEERSiRT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSirsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSo9_M_insertIgEERSoT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSolsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIgEERS2_RT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIgEERS2_T_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10has_denormE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_boundedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_integerE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE11round_styleE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12has_infinityE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12max_digits10E@GLIBCXX_LDBL_3.4 4.5.0 + _ZNSt14numeric_limitsIgE12max_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12min_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE13has_quiet_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14is_specializedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14max_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14min_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15has_denorm_lossE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15tinyness_beforeE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE17has_signaling_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5radixE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5trapsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE6digitsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8digits10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8is_exactE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_iec559E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_moduloE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_signedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt14__convert_to_vIgEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTIPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTIPg@CXXABI_LDBL_1.3 4.2.1 + _ZTIg@CXXABI_LDBL_1.3 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTSPg@CXXABI_LDBL_1.3 4.2.1 + _ZTSg@CXXABI_LDBL_1.3 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ldbl.32bit.s390 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ldbl.32bit.s390 @@ -0,0 +1,284 @@ + CXXABI_LDBL_1.3@CXXABI_LDBL_1.3 4.2.1 + GLIBCXX_LDBL_3.4.10@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + GLIBCXX_LDBL_3.4.7@GLIBCXX_LDBL_3.4.7 4.2.1 + GLIBCXX_LDBL_3.4@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt3tr14hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZNKSt4hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS7_PcS8_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIgEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIgEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_bRSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_bRSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSi10_M_extractIgEERSiRT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSirsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSo9_M_insertIgEERSoT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSolsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIgEERS2_RT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIgEERS2_T_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10has_denormE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_boundedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_integerE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE11round_styleE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12has_infinityE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12max_digits10E@GLIBCXX_LDBL_3.4 4.5.0 + _ZNSt14numeric_limitsIgE12max_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12min_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE13has_quiet_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14is_specializedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14max_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14min_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15has_denorm_lossE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15tinyness_beforeE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE17has_signaling_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5radixE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5trapsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE6digitsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8digits10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8is_exactE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_iec559E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_moduloE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_signedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt14__convert_to_vIgEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTIPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTIPg@CXXABI_LDBL_1.3 4.2.1 + _ZTIg@CXXABI_LDBL_1.3 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTSPg@CXXABI_LDBL_1.3 4.2.1 + _ZTSg@CXXABI_LDBL_1.3 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ldbl.64bit +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ldbl.64bit @@ -0,0 +1,284 @@ + CXXABI_LDBL_1.3@CXXABI_LDBL_1.3 4.2.1 + GLIBCXX_LDBL_3.4.10@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + GLIBCXX_LDBL_3.4.7@GLIBCXX_LDBL_3.4.7 4.2.1 + GLIBCXX_LDBL_3.4@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt3tr14hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZNKSt4hashIgEclEg@GLIBCXX_LDBL_3.4.10 4.3.0~rc2 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZGVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRPv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRf@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRj@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRt@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES4_S4_RSt8ios_basecT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS7_PcS8_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIgEES4_S4_RSt8ios_baseccT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEclRSt8ios_basePcPKcRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_RSt8ios_basecy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_RSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES4_S4_RSt8ios_basewT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwSA_Ri@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIgEES4_S4_RSt8ios_basewcT_@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwlRSt8ios_basePwPKwRi@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewPKv@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewb@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewl@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewm@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewx@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_RSt8ios_basewy@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_RSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8__do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8__do_putES4_bRSt8ios_basecd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKSs@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8__do_putES4_bRSt8ios_basewd@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSi10_M_extractIgEERSiRT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSirsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSo9_M_insertIgEERSoT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSolsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIgEERS2_RT_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIgEERS2_T_@GLIBCXX_LDBL_3.4.7 4.2.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEg@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10has_denormE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_boundedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE10is_integerE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE11round_styleE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12has_infinityE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12max_digits10E@GLIBCXX_LDBL_3.4 4.5.0 + _ZNSt14numeric_limitsIgE12max_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE12min_exponentE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE13has_quiet_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14is_specializedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14max_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE14min_exponent10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15has_denorm_lossE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE15tinyness_beforeE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE17has_signaling_NaNE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5radixE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE5trapsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE6digitsE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8digits10E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE8is_exactE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_iec559E@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_moduloE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt14numeric_limitsIgE9is_signedE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt14__convert_to_vIgEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9has_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZSt9use_facetINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStlsIgwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZStrsIgwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTINSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTIPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTIPg@CXXABI_LDBL_1.3 4.2.1 + _ZTIg@CXXABI_LDBL_1.3 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTSPKg@CXXABI_LDBL_1.3 4.2.1 + _ZTSPg@CXXABI_LDBL_1.3 4.2.1 + _ZTSg@CXXABI_LDBL_1.3 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@GLIBCXX_LDBL_3.4 4.2.1 + _ZTVNSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@GLIBCXX_LDBL_3.4 4.2.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.lpia +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.lpia @@ -0,0 +1,6 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.m68k +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.m68k @@ -0,0 +1,5 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_v0@CXXABI_1.3 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.mips +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.mips @@ -0,0 +1,7 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.excprop" +#include "libstdc++6.symbols.glibcxxmath" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.mipsel +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.mipsel @@ -0,0 +1,7 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.excprop" +#include "libstdc++6.symbols.glibcxxmath" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.powerpc +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.powerpc @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.powerpcspe +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.powerpcspe @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ppc64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ppc64 @@ -0,0 +1,10 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.ppc64el +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.ppc64el @@ -0,0 +1,10 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.s390 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.s390 @@ -0,0 +1,558 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.common" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillEm@GLIBCXX_3.4.2 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEmm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx9free_list6_M_getEm@GLIBCXX_3.4.4 4.1.1 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4.10 4.3.0~rc2 + _ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@CXXABI_1.3 4.1.1 + _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@CXXABI_1.3 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs12find_last_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs13find_first_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs15_M_check_lengthEmmPKc@GLIBCXX_3.4.5 4.1.1 + _ZNKSs16find_last_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs16find_last_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs17find_first_not_ofEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNKSs4copyEPcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs4findEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEPKcmm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindERKSsm@GLIBCXX_3.4 4.1.1 + _ZNKSs5rfindEcm@GLIBCXX_3.4 4.1.1 + _ZNKSs6substrEmm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNKSs7compareEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_checkEmPKc@GLIBCXX_3.4 4.1.1 + _ZNKSs8_M_limitEmm@GLIBCXX_3.4 4.1.1 + _ZNKSsixEm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@GLIBCXX_3.4 4.1.1 + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_m@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIcE12_M_transformEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNKSt7collateIwE12_M_transformEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS6_PcS7_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwS9_Ri@GLIBCXX_3.4 4.1.1 + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5.0 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4 4.1.1 + _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@GLIBCXX_3.4.14 4.5.0 + _ZNKSt8valarrayImE4sizeEv@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE10_S_compareEmm@GLIBCXX_3.4.16 4.7 + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE18_S_construct_aux_2EmwRKS1_@GLIBCXX_3.4.14 4.5.0 + _ZNSbIwSt11char_traitsIwESaIwEE2atEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwmw@GLIBCXX_3.4.5 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@GLIBCXX_3.4 4.1.1 + _ZNSbIwSt11char_traitsIwESaIwEEixEm@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPci@GLIBCXX_3.4 4.1.1 + _ZNSi3getEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi4readEPci@GLIBCXX_3.4 4.1.1 + _ZNSi5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSi6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSi6ignoreEii@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPci@GLIBCXX_3.4 4.1.1 + _ZNSi7getlineEPcic@GLIBCXX_3.4 4.1.1 + _ZNSi8readsomeEPci@GLIBCXX_3.4 4.1.1 + _ZNSo5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSo5writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSo8_M_writeEPKci@GLIBCXX_3.4 4.1.1 + _ZNSs10_S_compareEmm@GLIBCXX_3.4.16 4.7 + _ZNSs12_S_constructEmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs14_M_replace_auxEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs15_M_replace_safeEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs18_S_construct_aux_2EmcRKSaIcE@GLIBCXX_3.4.14 4.5.0 + _ZNSs2atEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4.5 4.1.1 + _ZNSs4_Rep8_M_cloneERKSaIcEm@GLIBCXX_3.4 4.1.1 + _ZNSs4_Rep9_S_createEmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSs5eraseEmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6appendEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6assignEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs6insertEmmc@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEm@GLIBCXX_3.4 4.1.1 + _ZNSs6resizeEmc@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7_M_moveEPcPKcm@GLIBCXX_3.4.5 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKc@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmPKcm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSs@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmRKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSs7replaceEmmmc@GLIBCXX_3.4 4.1.1 + _ZNSs7reserveEm@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4 4.1.1 + _ZNSs9_M_assignEPcmc@GLIBCXX_3.4.5 4.1.1 + _ZNSs9_M_mutateEmmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC1ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC1EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EPKcmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmm@GLIBCXX_3.4 4.1.1 + _ZNSsC2ERKSsmmRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsC2EmcRKSaIcE@GLIBCXX_3.4 4.1.1 + _ZNSsixEm@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC1EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt10istrstreamC2EPci@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEm@GLIBCXX_3.4 4.1.1 + _ZNSt10moneypunctIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt11__timepunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt11this_thread11__sleep_forENSt6chrono8durationIxSt5ratioILx1ELx1EEEENS1_IxS2_ILx1ELx1000000000EEEE@GLIBCXX_3.4.18 4.8 + _ZNSt12__basic_fileIcE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12ctype_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_allocEm@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambuf8_M_setupEPcS0_i@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC1Ei@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPFPvmEPFvS0_E@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKai@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKci@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPKhi@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPaiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPciS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2EPhiS0_@GLIBCXX_3.4 4.1.1 + _ZNSt12strstreambufC2Ei@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi@GLIBCXX_3.4.5 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt14collate_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_gbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_pbumpEi@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8_M_pbumpEPcS4_x@GLIBCXX_3.4.16 4.7 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwmm@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@GLIBCXX_3.4 4.1.1 + _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8_M_pbumpEPwS4_x@GLIBCXX_3.4.16 4.7 + _ZNSt15messages_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15messages_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIcEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15numpunct_bynameIwEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt16__numpunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt17__timepunct_cacheIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIcLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb0EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt18__moneypunct_cacheIwLb1EEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC1EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EP15__locale_structPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIcEC2EPKtbm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt5ctypeIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEm@GLIBCXX_3.4.7 4.1.1 + _ZNSt6locale5_ImplC1EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2EPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2ERKS0_m@GLIBCXX_3.4 4.1.1 + _ZNSt6locale5_ImplC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIcc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7codecvtIwc11__mbstate_tEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt7collateIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2EP15__locale_structPKcm@GLIBCXX_3.4 4.1.1 + _ZNSt8messagesIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIcEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EP15__locale_structm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEm@GLIBCXX_3.4 4.1.1 + _ZNSt8numpunctIwEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2ERKS0_@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED1Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImED2Ev@GLIBCXX_3.4 4.1.1 + _ZNSt8valarrayImEixEm@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@GLIBCXX_3.4 4.1.1 + _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@GLIBCXX_3.4 4.1.1 + _ZSt11_Hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt15_Fnv_hash_bytesPKvmm@CXXABI_1.3.5 4.6 + _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_i@GLIBCXX_3.4.9 4.2.1 + _ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@GLIBCXX_3.4.6 4.1.1 + _ZSt17__verify_groupingPKcmRKSs@GLIBCXX_3.4.10 4.3 + _ZSt21__copy_streambufs_eofIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZSt21__copy_streambufs_eofIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_Rb@GLIBCXX_3.4.9 4.2.1 + _ZThn8_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZThn8_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSdD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSiD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSoD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10istrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt10ostrstreamD1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD0Ev@GLIBCXX_3.4 4.1.1 + _ZTv0_n12_NSt9strstreamD1Ev@GLIBCXX_3.4 4.1.1 + _Znam@GLIBCXX_3.4 4.1.1 + _ZnamRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + _Znwm@GLIBCXX_3.4 4.1.1 + _ZnwmRKSt9nothrow_t@GLIBCXX_3.4 4.1.1 + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit.s390" + _ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 + _ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@GLIBCXX_3.4 4.1.1 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.s390x +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.s390x @@ -0,0 +1,12 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.128bit" +#include "libstdc++6.symbols.excprop" + _ZN9__gnu_cxx12__atomic_addEPVii@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVii@GLIBCXX_3.4 4.1.1 +#DEPRECATED: 4.2.2-4# ldexpf@GLIBCXX_3.4.3 4.1.1 +#DEPRECATED: 4.2.2-4# powf@GLIBCXX_3.4 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.sh4 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.sh4 @@ -0,0 +1,7 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.excprop" +#include "libstdc++6.symbols.glibcxxmath" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.sparc +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.sparc @@ -0,0 +1,8 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.32bit" +#include "libstdc++6.symbols.excprop" + __gxx_personality_v0@CXXABI_1.3 4.1.1 +#include "libstdc++6.symbols.glibcxxmath" +#include "libstdc++6.symbols.ldbl.32bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3.0~rc2 --- gcc-4.8-4.8.2.orig/debian/libstdc++6.symbols.sparc64 +++ gcc-4.8-4.8.2/debian/libstdc++6.symbols.sparc64 @@ -0,0 +1,10 @@ +libstdc++.so.6 libstdc++6 #MINVER# +#include "libstdc++6.symbols.64bit" +#include "libstdc++6.symbols.excprop" +#include "libstdc++6.symbols.128bit" + _ZN9__gnu_cxx12__atomic_addEPVli@GLIBCXX_3.4 4.1.1 + _ZN9__gnu_cxx18__exchange_and_addEPVli@GLIBCXX_3.4 4.1.1 +# FIXME: Currently no ldbl symbols in the 64bit libstdc++ on sparc. +# #include "libstdc++6.symbols.ldbl.64bit" + _ZNKSt3tr14hashIeEclEe@GLIBCXX_3.4.10 4.3 + _ZNKSt4hashIeEclEe@GLIBCXX_3.4.10 4.3 --- gcc-4.8-4.8.2.orig/debian/libstdc++CXX-BV-doc.doc-base +++ gcc-4.8-4.8.2/debian/libstdc++CXX-BV-doc.doc-base @@ -0,0 +1,13 @@ +Document: libstdc++@CXX@-@BV@-doc +Title: The GNU Standard C++ Library v3 (gcc-@BV@) +Author: Various +Abstract: This package contains documentation files for the GNU stdc++ library. + One set is the distribution documentation, the other set is the + source documentation including a namespace list, class hierarchy, + alphabetical list, compound list, file list, namespace members, + compound members and file members. +Section: Programming/C++ + +Format: html +Index: /usr/share/doc/libstdc++@CXX@-@BV@-doc/libstdc++/html/index.html +Files: /usr/share/doc/libstdc++@CXX@-@BV@-doc/libstdc++/html*/* --- gcc-4.8-4.8.2.orig/debian/libstdc++CXX.postinst +++ gcc-4.8-4.8.2/debian/libstdc++CXX.postinst @@ -0,0 +1,12 @@ +#! /bin/sh -e + +case "$1" in + configure) + docdir=/usr/share/doc/libstdc++@CXX@ + if [ -d $docdir ] && [ ! -h $docdir ]; then + rm -rf $docdir + ln -s gcc-@BV@-base $docdir + fi +esac + +#DEBHELPER# --- gcc-4.8-4.8.2.orig/debian/libx32asan0.overrides +++ gcc-4.8-4.8.2/debian/libx32asan0.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +libx32asan0 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/libx32asan0.symbols +++ gcc-4.8-4.8.2/debian/libx32asan0.symbols @@ -0,0 +1,3 @@ +libasan.so.0 libx32asan0 #MINVER# +#include "libasan0.symbols.common" +#include "libasan0.symbols.32" --- gcc-4.8-4.8.2.orig/debian/libx32atomic1.symbols +++ gcc-4.8-4.8.2/debian/libx32atomic1.symbols @@ -0,0 +1,3 @@ +libatomic.so.1 libx32atomic1 #MINVER# +#include "libatomic1.symbols.common" +#include "libatomic1.symbols.64" --- gcc-4.8-4.8.2.orig/debian/libx32gfortran3.overrides +++ gcc-4.8-4.8.2/debian/libx32gfortran3.overrides @@ -0,0 +1,2 @@ +# automake gets it wrong for the multilib build +libx32gfortran3 binary: binary-or-shlib-defines-rpath --- gcc-4.8-4.8.2.orig/debian/locale-gen +++ gcc-4.8-4.8.2/debian/locale-gen @@ -0,0 +1,49 @@ +#!/bin/sh + +LOCPATH=`pwd`/locales +export LOCPATH + +[ -d $LOCPATH ] || mkdir -p $LOCPATH + +umask 022 + +echo "Generating locales..." +while read locale charset; do + case $locale in \#*) continue;; esac + [ -n "$locale" -a -n "$charset" ] || continue + echo -n " `echo $locale | sed 's/\([^.\@]*\).*/\1/'`" + echo -n ".$charset" + echo -n `echo $locale | sed 's/\([^\@]*\)\(\@.*\)*/\2/'` + echo -n '...' + if [ -f $LOCPATH/$locale ]; then + input=$locale + else + input=`echo $locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'` + fi + localedef -i $input -c -f $charset $LOCPATH/$locale #-A /etc/locale.alias + echo ' done'; \ +done <&2 "usage: `basename $0` [-p ] [-t ] [-m ]" + echo >&2 " [ ...]" + exit 1 +} + +while [ $# -gt 0 ]; do + case $1 in + -p) + pidfile=$2 + shift + shift + ;; + -t) + timeout=$2 + shift + shift + ;; + -m) + message="$2" + shift + shift + ;; + -*) + usage + ;; + *) + break + esac +done + +[ $# -gt 0 ] || usage + +logfile="$1" +shift +otherlogs="$@" + +cleanup() +{ + rm -f $pidfile + exit 0 +} + +#trap cleanup 0 1 3 15 + +echo $$ > $pidfile + +update() +{ + _logvar=$1 + _othervar=$2 + + # logfile may not exist yet + if [ -r $logfile ]; then + _logtail="`tail -10 $logfile | md5sum` $f" + else + _logtail="does not exist: $logfile" + fi + eval $_logvar="'$_logtail'" + + _othertails='' + for f in $otherlogs; do + if [ -r $f ]; then + _othertails="$_othertails `tail -10 $f | md5sum` $f" + else + _othertails="$_othertails does not exist: $f" + fi + done + eval $_othervar="'$_othertails'" +} + +update logtail othertails +while true; do + sleep $timeout + update newlogtail newothertails + if [ "$logtail" != "$newlogtail" ]; then + # there is still action in the primary logfile. do nothing. + logtail="$newlogtail" + elif [ "$othertails" != "$newothertails" ]; then + # there is still action in the other log files, so print the message + /bin/echo -e $message + othertails="$newothertails" + else + # nothing changed in the other log files. maybe a timeout ... + : + fi +done --- gcc-4.8-4.8.2.orig/debian/patches/aarch64-abi-fix.diff +++ gcc-4.8-4.8.2/debian/patches/aarch64-abi-fix.diff @@ -0,0 +1,16 @@ +# DP: Proposed patch for PR /59799, allow passing arrays in registers on AArch64. + +--- a/src/gcc/config/aarch64/aarch64.c ++++ b/src/gcc/config/aarch64/aarch64.c +@@ -987,10 +987,7 @@ aarch64_pass_by_reference (cumulative_args_t pcum ATTRIBUTE_UNUSED, + + if (type) + { +- /* Arrays always passed by reference. */ +- if (TREE_CODE (type) == ARRAY_TYPE) +- return true; +- /* Other aggregates based on their size. */ ++ /* Aggregates based on their size. */ + if (AGGREGATE_TYPE_P (type)) + size = int_size_in_bytes (type); + } --- gcc-4.8-4.8.2.orig/debian/patches/aarch64-call-frame-info.diff +++ gcc-4.8-4.8.2/debian/patches/aarch64-call-frame-info.diff @@ -0,0 +1,33 @@ +# DP: Fix call frame information in ffi_closure_SYSV on AArch64. + +diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S +index 1022454..ecf6371 100644 +--- a/src/libffi/src/aarch64/sysv.S ++++ b/src/libffi/src/aarch64/sysv.S +@@ -231,13 +231,13 @@ ffi_closure_SYSV: + cfi_rel_offset (x30, 8) + + mov x29, sp ++ cfi_def_cfa_register (x29) + + sub sp, sp, #ffi_closure_SYSV_FS +- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + + stp x21, x22, [x29, #-16] +- cfi_rel_offset (x21, 0) +- cfi_rel_offset (x22, 8) ++ cfi_rel_offset (x21, -16) ++ cfi_rel_offset (x22, -8) + + /* Load x21 with &call_context. */ + mov x21, sp +@@ -295,7 +295,7 @@ ffi_closure_SYSV: + cfi_restore (x22) + + mov sp, x29 +- cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) ++ cfi_def_cfa_register (sp) + + ldp x29, x30, [sp], #16 + cfi_adjust_cfa_offset (-16) + --- gcc-4.8-4.8.2.orig/debian/patches/ada-acats.diff +++ gcc-4.8-4.8.2/debian/patches/ada-acats.diff @@ -0,0 +1,190 @@ +# DP: - When running the ACATS, look for the gnat tools in their new +# DP: directory (build/gnattools), and for the shared libraries in +# DP: build/gcc/ada/rts-shared-zcx, build/libgnatvsn and build/libgnatprj. + +Index: b/src/gcc/testsuite/ada/acats/run_acats +=================================================================== +--- a/src/gcc/testsuite/ada/acats/run_acats ++++ b/src/gcc/testsuite/ada/acats/run_acats +@@ -20,52 +20,29 @@ + return 1 + } + ++echo '#!/bin/sh' > host_gnatchop ++echo exec /usr/bin/gnatchop '$*' >> host_gnatchop ++ ++chmod +x host_gnatchop ++ ++echo '#!/bin/sh' > host_gnatmake ++echo echo '$PATH' '$*' >> host_gnatmake ++echo exec /usr/bin/gnatmake '$*' >> host_gnatmake ++ ++chmod +x host_gnatmake ++ + # Set up environment to use the Ada compiler from the object tree + +-host_gnatchop=`which gnatchop` +-host_gnatmake=`which gnatmake` + ROOT=`${PWDCMD-pwd}` + BASE=`cd $ROOT/../../..; ${PWDCMD-pwd}` +- + PATH=$BASE:$ROOT:$PATH +-ADA_INCLUDE_PATH=$BASE/ada/rts +-LD_LIBRARY_PATH=$ADA_INCLUDE_PATH:$BASE:$LD_LIBRARY_PATH +-ADA_OBJECTS_PATH=$ADA_INCLUDE_PATH +- +-if [ ! -d $ADA_INCLUDE_PATH ]; then +- echo gnatlib missing, exiting. +- exit 1 +-fi +- +-if [ ! -f $BASE/gnatchop ]; then +- echo gnattools missing, exiting. +- exit 1 +-fi +- +-if [ ! -f $BASE/gnatmake ]; then +- echo gnattools missing, exiting. +- exit 1 +-fi +- ++GNATTOOLS=`cd $BASE/../gnattools; ${PWDCMD-pwd}` ++LIBGNATVSN=`cd $BASE/../libgnatvsn; ${PWDCMD-pwd}` ++LIBGNATPRJ=`cd $BASE/../libgnatprj; ${PWDCMD-pwd}` + GCC_DRIVER="$BASE/xgcc" + GCC="$BASE/xgcc -B$BASE/" + export PATH ADA_INCLUDE_PATH ADA_OBJECTS_PATH GCC_DRIVER GCC LD_LIBRARY_PATH +- +-echo '#!/bin/sh' > host_gnatchop +-echo PATH=`dirname $host_gnatchop`:'$PATH' >> host_gnatchop +-echo unset ADA_INCLUDE_PATH ADA_OBJECTS_PATH GCC_EXEC_PREFIX >> host_gnatchop +-echo export PATH >> host_gnatchop +-echo exec gnatchop '"$@"' >> host_gnatchop +- +-chmod +x host_gnatchop +- +-echo '#!/bin/sh' > host_gnatmake +-echo PATH=`dirname $host_gnatmake`:'$PATH' >> host_gnatmake +-echo unset ADA_INCLUDE_PATH ADA_OBJECTS_PATH GCC_EXEC_PREFIX >> host_gnatmake +-echo export PATH >> host_gnatmake +-echo exec gnatmake '"$@"' >> host_gnatmake +- +-chmod +x host_gnatmake ++export GNATTOOLS LIBGNATVSN LIBGNATPRJ + + # Limit the stack to 16MB for stack checking + ulimit -s 16384 +Index: b/src/gcc/testsuite/ada/acats/run_all.sh +=================================================================== +--- a/src/gcc/testsuite/ada/acats/run_all.sh ++++ b/src/gcc/testsuite/ada/acats/run_all.sh +@@ -12,6 +12,11 @@ + gccflags="-O2" + gnatflags="-gnatws" + ++SHARED_RTS=`cd $GNATTOOLS/../gcc/ada/rts-shared-zcx; ${PWDCMD-pwd}` ++RTS=`cd $GNATTOOLS/../gcc/ada/rts-static-zcx; ${PWDCMD-pwd}` ++LD_LIBRARY_PATH=$SHARED_RTS:$LIBGNATVSN:$LIBGNATPRJ ++export LD_LIBRARY_PATH ++ + target_run () { + eval $EXPECT -f $testdir/run_test.exp $* + } +@@ -48,12 +53,15 @@ + fi + + target_gnatchop () { +- gnatchop --GCC="$GCC_DRIVER" $* ++ ADA_INCLUDE_PATH=$GNATTOOLS/../../src/gcc/ada $GNATTOOLS/gnatchop --GCC="$GCC_DRIVER" $* + } + + target_gnatmake () { +- echo gnatmake --GCC=\"$GCC\" $gnatflags $gccflags $* -largs $EXTERNAL_OBJECTS --GCC=\"$GCC\" +- gnatmake --GCC="$GCC" $gnatflags $gccflags $* -largs $EXTERNAL_OBJECTS --GCC="$GCC" ++ EXTERNAL_OBJECTS="$EXTERNAL_OBJECTS $RTS/adaint.o $RTS/sysdep.o $RTS/init.o $RTS/raise-gcc.o" ++ $GNATTOOLS/gnatmake -I- -I$RTS -I. \ ++ --GCC="$GCC" --GNATBIND="$GNATTOOLS/gnatbind" \ ++ --GNATLINK="$GNATTOOLS/gnatlink" $gnatflags $gccflags $* \ ++ -bargs -static -largs $EXTERNAL_OBJECTS --GCC="$GCC -I- -I$RTS -I." + } + + target_gcc () { +@@ -86,8 +94,8 @@ + display `$GCC -v 2>&1` + display host=`gcc -dumpmachine` + display target=$target +-display `type gnatmake` +-gnatls -v >> $dir/acats.log ++display `type $GNATTOOLS/gnatmake` ++$GNATTOOLS/gnatls -I- -I$RTS -v >> $dir/acats.log + display "" + + display " === acats support ===" +Index: b/src/gcc/testsuite/lib/gnat.exp +=================================================================== +--- a/src/gcc/testsuite/lib/gnat.exp ++++ b/src/gcc/testsuite/lib/gnat.exp +@@ -88,18 +88,24 @@ + global GNAT_UNDER_TEST + global TOOL_EXECUTABLE + global gnat_target_current ++ global ld_library_path + + set gnat_target_current "" + + if { $gnat_initialized == 1 } { return } + +- if ![info exists GNAT_UNDER_TEST] then { +- if [info exists TOOL_EXECUTABLE] { +- set GNAT_UNDER_TEST "$TOOL_EXECUTABLE" +- } else { +- set GNAT_UNDER_TEST "[local_find_gnatmake]" +- } +- } ++ set GNAT_UNDER_TEST "$rootme/../gnattools/gnatmake -I$rootme/ada/rts-shared-zcx --GCC=$rootme/xgcc --GNATBIND=$rootme/../gnattools/gnatbind --GNATLINK=$rootme/../gnattools/gnatlink -cargs -B$rootme -largs --GCC=$rootme/xgcc -B$rootme -margs" ++ append ld_library_path ":$rootme/ada/rts-shared-zcx" ++ append ld_library_path ":$rootme/../libgnatvsn" ++ append ld_library_path ":$rootme/../libgnatprj" ++ set_ld_library_path_env_vars ++ ++ # gnatlink looks for system.ads itself and has no --RTS option, so ++ # specify via environment ++ verbose -log "ADA_INCLUDE_PATH=$rootme/ada/rts-shared-zcx" ++ verbose -log "ADA_OBJECTS_PATH=$rootme/ada/rts-shared-zcx" ++ setenv ADA_INCLUDE_PATH "$rootme/ada/rts-shared-zcx" ++ setenv ADA_OBJECTS_PATH "$rootme/ada/rts-shared-zcx" + + if ![info exists tmpdir] then { + set tmpdir /tmp +@@ -121,31 +127,6 @@ + return [gcc_target_compile $source $dest $type $options] + } + +- # If we detect a change of target, we need to recompute both +- # GNAT_UNDER_TEST and the appropriate RTS. +- if { $gnat_target_current!="[current_target_name]" } { +- set gnat_target_current "[current_target_name]" +- if [info exists TOOL_OPTIONS] { +- set rtsdir "[get_multilibs ${TOOL_OPTIONS}]/libada" +- } else { +- set rtsdir "[get_multilibs]/libada" +- } +- if [info exists TOOL_EXECUTABLE] { +- set GNAT_UNDER_TEST "$TOOL_EXECUTABLE" +- } else { +- set GNAT_UNDER_TEST "[local_find_gnatmake]" +- } +- set GNAT_UNDER_TEST "$GNAT_UNDER_TEST --RTS=$rtsdir" +- +- # gnatlink looks for system.ads itself and has no --RTS option, so +- # specify via environment +- setenv ADA_INCLUDE_PATH "$rtsdir/adainclude" +- setenv ADA_OBJECTS_PATH "$rtsdir/adainclude" +- # Always log so compilations can be repeated manually. +- verbose -log "ADA_INCLUDE_PATH=$rtsdir/adainclude" +- verbose -log "ADA_OBJECTS_PATH=$rtsdir/adainclude" +- } +- + lappend options "compiler=$GNAT_UNDER_TEST -q -f" + lappend options "timeout=[timeout_value]" + --- gcc-4.8-4.8.2.orig/debian/patches/ada-default-project-path.diff +++ gcc-4.8-4.8.2/debian/patches/ada-default-project-path.diff @@ -0,0 +1,98 @@ +# DP: - Change the default search path for project files to the one specified +# DP: by the Debian Policy for Ada: /usr/share/ada/adainclude. + +Index: b/src/gcc/ada/Make-generated.in +=================================================================== +--- a/src/gcc/ada/Make-generated.in ++++ b/src/gcc/ada/Make-generated.in +@@ -105,7 +105,7 @@ + $(ECHO) " S1 : constant String := \"$(ADA_INCLUDE_DIR)/\";" >>tmp-sdefault.adb + $(ECHO) " S2 : constant String := \"$(ADA_RTL_OBJ_DIR)/\";" >>tmp-sdefault.adb + $(ECHO) " S3 : constant String := \"$(target_noncanonical)/\";" >>tmp-sdefault.adb +- $(ECHO) " S4 : constant String := \"$(libsubdir)/\";" >>tmp-sdefault.adb ++ $(ECHO) " S4 : constant String := \"/usr/share/ada/adainclude/\";" >>tmp-sdefault.adb + $(ECHO) " function Include_Dir_Default_Name return String_Ptr is" >>tmp-sdefault.adb + $(ECHO) " begin" >>tmp-sdefault.adb + $(ECHO) " return Relocate_Path (S0, S1);" >>tmp-sdefault.adb +Index: b/src/gcc/ada/prj-env.adb +=================================================================== +--- a/src/gcc/ada/prj-env.adb ++++ b/src/gcc/ada/prj-env.adb +@@ -25,7 +25,6 @@ + + with Fmap; + with Hostparm; +-with Makeutl; use Makeutl; + with Opt; + with Osint; use Osint; + with Output; use Output; +@@ -1889,6 +1888,7 @@ + (Self : in out Project_Search_Path; + Target_Name : String) + is ++ pragma Unreferenced (Target_Name); + Add_Default_Dir : Boolean := True; + First : Positive; + Last : Positive; +@@ -2023,59 +2023,8 @@ + + -- Set the initial value of Current_Project_Path + +- if Add_Default_Dir then +- declare +- Prefix : String_Ptr; +- +- begin +- if Sdefault.Search_Dir_Prefix = null then +- +- -- gprbuild case +- +- Prefix := new String'(Executable_Prefix_Path); +- +- else +- Prefix := new String'(Sdefault.Search_Dir_Prefix.all +- & ".." & Dir_Separator +- & ".." & Dir_Separator +- & ".." & Dir_Separator +- & ".." & Dir_Separator); +- end if; +- +- if Prefix.all /= "" then +- if Target_Name /= "" then +- +- -- $prefix/$target/lib/gnat +- +- Add_Str_To_Name_Buffer +- (Path_Separator & Prefix.all & Target_Name); +- +- -- Note: Target_Name has a trailing / when it comes from +- -- Sdefault. +- +- if Name_Buffer (Name_Len) /= '/' then +- Add_Char_To_Name_Buffer (Directory_Separator); +- end if; +- +- Add_Str_To_Name_Buffer +- ("lib" & Directory_Separator & "gnat"); +- end if; +- +- -- $prefix/share/gpr +- +- Add_Str_To_Name_Buffer +- (Path_Separator & Prefix.all & +- "share" & Directory_Separator & "gpr"); +- +- -- $prefix/lib/gnat +- +- Add_Str_To_Name_Buffer +- (Path_Separator & Prefix.all & +- "lib" & Directory_Separator & "gnat"); +- end if; +- +- Free (Prefix); +- end; ++ if Add_Default_Dir and Sdefault.Search_Dir_Prefix /= null then ++ Add_Str_To_Name_Buffer (Path_Separator & Sdefault.Search_Dir_Prefix.all); + end if; + + Self.Path := new String'(Name_Buffer (1 .. Name_Len)); --- gcc-4.8-4.8.2.orig/debian/patches/ada-driver-check.diff +++ gcc-4.8-4.8.2/debian/patches/ada-driver-check.diff @@ -0,0 +1,26 @@ +# DP: Simplify Ada driver check (we always build using the required +# DP: Ada version. Needed for warnings on alpha. + +--- a/src/config/acx.m4~ 2007-09-02 19:24:08.865326043 +0200 ++++ b/src/config/acx.m4 2007-09-02 19:28:53.719623005 +0200 +@@ -380,7 +380,7 @@ + # Other compilers, like HP Tru64 UNIX cc, exit successfully when + # given a .adb file, but produce no object file. So we must check + # if an object file was really produced to guard against this. +-errors=`(${CC} $1[]m4_ifval([$1], [ ])-c conftest.adb) 2>&1 || echo failure` ++errors=`(${CC} $1[]m4_ifval([$1], [ ])-c conftest.adb) 2>/dev/null || echo failure` + if test x"$errors" = x && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes + fi + +--- a/src/configure~ 2007-09-02 16:50:31.206279000 +0200 ++++ b/src/configure 2007-09-02 19:28:58.259691491 +0200 +@@ -4448,7 +4448,7 @@ + # Other compilers, like HP Tru64 UNIX cc, exit successfully when + # given a .adb file, but produce no object file. So we must check + # if an object file was really produced to guard against this. +-errors=`(${CC} -c conftest.adb) 2>&1 || echo failure` ++errors=`(${CC} -c conftest.adb) 2>/dev/null || echo failure` + if test x"$errors" = x && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes + fi --- gcc-4.8-4.8.2.orig/debian/patches/ada-gcc-name.diff +++ gcc-4.8-4.8.2/debian/patches/ada-gcc-name.diff @@ -0,0 +1,112 @@ +# DP: use gcc-4.8 instead of gcc as the command name. + +Index: b/src/gcc/ada/comperr.adb +=================================================================== +--- a/src/gcc/ada/comperr.adb ++++ b/src/gcc/ada/comperr.adb +@@ -371,7 +371,7 @@ + End_Line; + + Write_Str +- ("| Include the exact gcc or gnatmake command " & ++ ("| Include the exact gcc-4.8 or gnatmake command " & + "that you entered."); + End_Line; + +Index: b/src/gcc/ada/gnatlink.adb +=================================================================== +--- a/src/gcc/ada/gnatlink.adb ++++ b/src/gcc/ada/gnatlink.adb +@@ -137,7 +137,7 @@ + -- This table collects the arguments to be passed to compile the binder + -- generated file. + +- Gcc : String_Access := Program_Name ("gcc", "gnatlink"); ++ Gcc : String_Access := Program_Name ("gcc-4.8", "gnatlink"); + + Read_Mode : constant String := "r" & ASCII.NUL; + +@@ -1438,7 +1438,8 @@ + end if; + + Write_Line (" --GCC=comp Use comp as the compiler"); +- Write_Line (" --LINK=nam Use 'nam' for the linking rather than 'gcc'"); ++ Write_Line (" --LINK=nam Use 'nam' for the linking rather " & ++ "than 'gcc-4.8'"); + Write_Eol; + Write_Line (" [non-Ada-objects] list of non Ada object files"); + Write_Line (" [linker-options] other options for the linker"); +Index: b/src/gcc/ada/make.adb +=================================================================== +--- a/src/gcc/ada/make.adb ++++ b/src/gcc/ada/make.adb +@@ -669,7 +669,7 @@ + -- Compiler, Binder & Linker Data and Subprograms -- + ---------------------------------------------------- + +- Gcc : String_Access := Program_Name ("gcc", "gnatmake"); ++ Gcc : String_Access := Program_Name ("gcc-4.8", "gnatmake"); + Original_Gcc : constant String_Access := Gcc; + -- Original_Gcc is used to check if Gcc has been modified by a switch + -- --GCC=, so that for VM platforms, it is not modified again, as it can +Index: b/src/gcc/ada/gnatchop.adb +=================================================================== +--- a/src/gcc/ada/gnatchop.adb ++++ b/src/gcc/ada/gnatchop.adb +@@ -45,7 +45,7 @@ + Config_File_Name : constant String_Access := new String'("gnat.adc"); + -- The name of the file holding the GNAT configuration pragmas + +- Gcc : String_Access := new String'("gcc"); ++ Gcc : String_Access := new String'("gcc-4.8"); + -- May be modified by switch --GCC= + + Gcc_Set : Boolean := False; +Index: b/src/gcc/ada/mdll-utl.adb +=================================================================== +--- a/src/gcc/ada/mdll-utl.adb ++++ b/src/gcc/ada/mdll-utl.adb +@@ -39,7 +39,7 @@ + Dlltool_Name : constant String := "dlltool"; + Dlltool_Exec : OS_Lib.String_Access; + +- Gcc_Name : constant String := "gcc"; ++ Gcc_Name : constant String := "gcc-4.8"; + Gcc_Exec : OS_Lib.String_Access; + + Gnatbind_Name : constant String := "gnatbind"; +@@ -212,7 +212,7 @@ + end; + end if; + +- Print_Command ("gcc", Arguments (1 .. A)); ++ Print_Command ("gcc-4.8", Arguments (1 .. A)); + + OS_Lib.Spawn (Gcc_Exec.all, Arguments (1 .. A), Success); + +Index: b/src/gcc/ada/mlib-utl.adb +=================================================================== +--- a/src/gcc/ada/mlib-utl.adb ++++ b/src/gcc/ada/mlib-utl.adb +@@ -439,7 +439,7 @@ + if Driver_Name = No_Name then + if Gcc_Exec = null then + if Gcc_Name = null then +- Gcc_Name := Osint.Program_Name ("gcc", "gnatmake"); ++ Gcc_Name := Osint.Program_Name ("gcc-4.8", "gnatmake"); + end if; + + Gcc_Exec := Locate_Exec_On_Path (Gcc_Name.all); +Index: b/src/gcc/ada/prj-makr.adb +=================================================================== +--- a/src/gcc/ada/prj-makr.adb ++++ b/src/gcc/ada/prj-makr.adb +@@ -114,7 +114,7 @@ + + procedure Dup2 (Old_Fd, New_Fd : File_Descriptor); + +- Gcc : constant String := "gcc"; ++ Gcc : constant String := "gcc-4.8"; + Gcc_Path : String_Access := null; + + Non_Empty_Node : constant Project_Node_Id := 1; --- gcc-4.8-4.8.2.orig/debian/patches/ada-kfreebsd.diff +++ gcc-4.8-4.8.2/debian/patches/ada-kfreebsd.diff @@ -0,0 +1,337 @@ +# DP: add support for GNU/kFreeBSD. + +Index: b/src/gcc/ada/terminals.c +=================================================================== +--- a/src/gcc/ada/terminals.c ++++ b/src/gcc/ada/terminals.c +@@ -987,6 +987,7 @@ + /* On some system termio is either absent or including it will disable termios + (HP-UX) */ + #if ! defined (__hpux__) && ! defined (FREEBSD) && \ ++ ! defined (__FreeBSD_kernel__) && \ + ! defined (__APPLE__) && ! defined(__rtems__) + # include + #endif +Index: b/src/gcc/ada/s-osinte-kfreebsd-gnu.adb +=================================================================== +--- /dev/null ++++ b/src/gcc/ada/s-osinte-kfreebsd-gnu.adb +@@ -0,0 +1,158 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- ++-- -- ++-- S Y S T E M . O S _ I N T E R F A C E -- ++-- -- ++-- B o d y -- ++-- -- ++-- Copyright (C) 1991-1994, Florida State University -- ++-- Copyright (C) 1995-2006, AdaCore -- ++-- -- ++-- GNARL is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 2, or (at your option) any later ver- -- ++-- sion. GNARL is distributed in the hope that it will be useful, but WITH- -- ++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- ++-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- ++-- for more details. You should have received a copy of the GNU General -- ++-- Public License distributed with GNARL; see file COPYING. If not, write -- ++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- ++-- Boston, MA 02110-1301, USA. -- ++-- -- ++-- As a special exception, if other files instantiate generics from this -- ++-- unit, or you link this unit with other files to produce an executable, -- ++-- this unit does not by itself cause the resulting executable to be -- ++-- covered by the GNU General Public License. This exception does not -- ++-- however invalidate any other reasons why the executable file might be -- ++-- covered by the GNU Public License. -- ++-- -- ++-- GNARL was developed by the GNARL team at Florida State University. -- ++-- Extensive contributions were provided by Ada Core Technologies, Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++-- This is the GNU/kFreeBSD version of this package. ++ ++pragma Polling (Off); ++-- Turn off polling, we do not want ATC polling to take place during ++-- tasking operations. It causes infinite loops and other problems. ++ ++-- This package encapsulates all direct interfaces to OS services ++-- that are needed by children of System. ++ ++package body System.OS_Interface is ++ ++ -------------------- ++ -- Get_Stack_Base -- ++ -------------------- ++ ++ function Get_Stack_Base (thread : pthread_t) return Address is ++ pragma Warnings (Off, thread); ++ ++ begin ++ return Null_Address; ++ end Get_Stack_Base; ++ ++ ------------------ ++ -- pthread_init -- ++ ------------------ ++ ++ procedure pthread_init is ++ begin ++ null; ++ end pthread_init; ++ ++ ----------------------------------- ++ -- pthread_mutexattr_setprotocol -- ++ ----------------------------------- ++ ++ function pthread_mutexattr_setprotocol ++ (attr : access pthread_mutexattr_t; ++ protocol : int) return int is ++ pragma Unreferenced (attr, protocol); ++ begin ++ return 0; ++ end pthread_mutexattr_setprotocol; ++ ++ ----------------------------------- ++ -- pthread_mutexattr_getprotocol -- ++ ----------------------------------- ++ ++ function pthread_mutexattr_getprotocol ++ (attr : access pthread_mutexattr_t; ++ protocol : access int) return int is ++ pragma Unreferenced (attr, protocol); ++ begin ++ return 0; ++ end pthread_mutexattr_getprotocol; ++ ++ -------------------------------------- ++ -- pthread_mutexattr_setprioceiling -- ++ -------------------------------------- ++ ++ function pthread_mutexattr_setprioceiling ++ (attr : access pthread_mutexattr_t; ++ prioceiling : int) return int is ++ pragma Unreferenced (attr, prioceiling); ++ begin ++ return 0; ++ end pthread_mutexattr_setprioceiling; ++ ++ -------------------------------------- ++ -- pthread_mutexattr_getprioceiling -- ++ -------------------------------------- ++ ++ function pthread_mutexattr_getprioceiling ++ (attr : access pthread_mutexattr_t; ++ prioceiling : access int) return int is ++ pragma Unreferenced (attr, prioceiling); ++ begin ++ return 0; ++ end pthread_mutexattr_getprioceiling; ++ ++ ----------------- ++ -- To_Duration -- ++ ----------------- ++ ++ function To_Duration (TS : timespec) return Duration is ++ begin ++ return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; ++ end To_Duration; ++ ++ ------------------------ ++ -- To_Target_Priority -- ++ ------------------------ ++ ++ function To_Target_Priority ++ (Prio : System.Any_Priority) return Interfaces.C.int ++ is ++ begin ++ return Interfaces.C.int (Prio); ++ end To_Target_Priority; ++ ++ ----------------- ++ -- To_Timespec -- ++ ----------------- ++ ++ function To_Timespec (D : Duration) return timespec is ++ S : time_t; ++ F : Duration; ++ ++ begin ++ S := time_t (Long_Long_Integer (D)); ++ F := D - Duration (S); ++ ++ -- If F has negative value due to a round-up, adjust for positive F ++ -- value. ++ ++ if F < 0.0 then ++ S := S - 1; ++ F := F + 1.0; ++ end if; ++ ++ return timespec'(tv_sec => S, ++ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); ++ end To_Timespec; ++ ++end System.OS_Interface; +Index: b/src/gcc/ada/gcc-interface/Makefile.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Makefile.in ++++ b/src/gcc/ada/gcc-interface/Makefile.in +@@ -1194,7 +1194,7 @@ + a-intnam.ads ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++# Default target; must be first. ++all: libgnatprj ++ ++.SUFFIXES: ++ ++CPUS := $(shell getconf _NPROCESSORS_ONLN) ++LIB_VERSION := $(strip $(shell grep ' Library_Version :' \ ++ @srcdir@/../gcc/ada/gnatvsn.ads | \ ++ sed -e 's/.*"\(.*\)".*/\1/')) ++GCC:=../gcc/xgcc -B../gcc/ ++GPP := ../gcc/xg++ -B../gcc/ ++LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++LIBGNATVSN := -I../libgnatvsn ++CFLAGS := -g -O2 ++ADAFLAGS := -g -O2 -gnatn ++BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) ++DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) ++DATESTAMP := $(shell cat @srcdir@/../gcc/DATESTAMP) ++TOOLS_TARGET_PAIRS := @TOOLS_TARGET_PAIRS@ ++LN_S := @LN_S@ ++ ++ifneq (@build@,@host@) ++ CFLAGS += -b @host@ ++endif ++ ++.PHONY: libgnatprj install ++libgnatprj: libgnatprj.so.$(LIB_VERSION) libgnatprj.a ++ ++# Here we list one file per Ada unit: the body file if the unit has a ++# body, the spec file otherwise. ++PRJ_SOURCES := ali.adb ali-util.adb butil.adb binderr.adb errout.adb \ ++erroutc.adb errutil.adb err_vars.ads fname-uf.adb fmap.adb impunit.adb \ ++lib-util.adb makeutl.adb mlib.adb mlib-fil.adb mlib-tgt.adb \ ++mlib-tgt-specific.adb mlib-utl.adb osint.adb osint-c.adb prj.adb prj-attr.adb \ ++prj-attr-pm.adb prj-com.ads prj-conf.adb prj-dect.adb prj-env.adb prj-err.adb \ ++prj-ext.adb prj-makr.adb prj-nmsc.adb prj-pars.adb prj-part.adb prj-pp.adb \ ++prj-proc.adb prj-strt.adb prj-tree.adb prj-util.adb restrict.adb rident.ads \ ++scng.adb sfn_scan.adb sinfo-cn.adb sinput-c.adb sinput-p.adb style.adb \ ++styleg.adb stylesw.adb switch.adb switch-m.adb targparm.adb tempdir.adb ++ ++# Source files generated in build/gcc/ada, not src/gcc/ada. ++GENERATED_SOURCES := sdefault.adb ++ ++SOURCES := $(PRJ_SOURCES) $(GENERATED_SOURCES) ++ ++OBJECTS := $(patsubst %.ads,%.o,$(SOURCES:.adb=.o)) ++ ++# Add some object files compiled from C sources. prefix.o requires ++# some objects from libiberty and from gcc. ++OBJECTS += common-targhooks.o errors.o hooks.o link.o prefix.o targetm.o ++ ++# These object files have already been built, both PIC and non-PIC. ++# prefix.o depends on them. ++LIBIBERTY_OBJECTS := concat.o filename_cmp.o safe-ctype.o xexit.o xmalloc.o xstrdup.o ++ ++vpath %.c @srcdir@ @srcdir@/../gcc @srcdir@/../gcc/common @srcdir@/../gcc/ada ++ ++libgnatprj.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) ++ : # Make libgnatprj.so ++ $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ -Wl,--no-allow-shlib-undefined \ ++ $^ $(addprefix ../libiberty/pic/,$(LIBIBERTY_OBJECTS)) \ ++ -L../gcc/ada/rts -lgnat-$(LIB_VERSION) \ ++ -L../libgnatvsn -lgnatvsn ++ $(LN_S) -f libgnatprj.so.$(LIB_VERSION) libgnatprj.so ++ chmod a=r obj-shared/*.ali ++# Make the .ali files, but not the .o files, visible to the gnat tools. ++ cp -lp obj-shared/*.ali . ++ ++$(addprefix obj-shared/,$(OBJECTS)): | stamp-libgnatprj-sources obj-shared ++ ++obj-shared/%.o: %.adb ++ $(GCC) -c -fPIC $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-shared/%.o: %.ads ++ $(GCC) -c -fPIC $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-shared/%.o: %.c ++ $(GPP) -c -fPIC $(CFLAGS) -DHAVE_CONFIG_H -pedantic \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I@srcdir@/../libcpp/include -I../gcc \ ++ $< -o $@ ++ ++obj-shared/prefix.o: @srcdir@/../gcc/prefix.c ++ $(GPP) -c -fPIC $(CFLAGS) -DPREFIX=\"@prefix@\" -DBASEVER=\"$(BASEVER)\" \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I../gcc -I@srcdir@/../libcpp/include \ ++ $< -o $@ ++ ++obj-shared: ++ -mkdir $@ ++ ++libgnatprj.a: $(addprefix obj-static/,$(OBJECTS)) ++ : # Make libgnatprj.a ++ ar rc $@ $^ $(addprefix ../libiberty/,$(LIBIBERTY_OBJECTS)) ++ ranlib $@ ++ ++$(addprefix obj-static/,$(OBJECTS)): | stamp-libgnatprj-sources obj-static ++ ++obj-static/%.o: %.adb ++ $(GCC) -c $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-static/%.o: %.ads ++ $(GCC) -c $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-static/%.o: %.c ++ $(GPP) -c $(CFLAGS) -DHAVE_CONFIG_H -pedantic \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I@srcdir@/../libcpp/include -I../gcc \ ++ $< -o $@ ++ ++obj-static/prefix.o: @srcdir@/../gcc/prefix.c ++ $(GPP) -c $(CFLAGS) -DPREFIX=\"@prefix@\" -DBASEVER=\"$(BASEVER)\" \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I../gcc -I@srcdir@/../libcpp/include \ ++ $< -o $@ ++ ++obj-static: ++ -mkdir $@ ++ ++$(SOURCES): stamp-libgnatprj-sources ++ ++stamp-libgnatprj-sources: ++ for file in $(PRJ_SOURCES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f @srcdir@/../gcc/ada/$$file -a ! -L $$file ] ; then $(LN_S) @srcdir@/../gcc/ada/$$file .; fi; \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) @srcdir@/../gcc/ada/$$ads .; fi; \ ++ done ++ for file in $(GENERATED_SOURCES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f ../gcc/ada/$$file -a ! -L $$file ] ; then $(LN_S) ../gcc/ada/$$file .; fi; \ ++ if [ -f ../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) ../gcc/ada/$$ads .; \ ++ else \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) @srcdir@/../gcc/ada/$$ads .; fi; \ ++ fi; \ ++ done ++ $(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ ++ rm -f $(word 1,$(subst <, ,$(PAIR)));\ ++ $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ ++ $(word 1,$(subst <, ,$(PAIR)));) ++ touch $@ ++ ++# Generate a list of source files (.ads and .adb) to install. Almost ++# all of them are in src/gcc/ada, but some are generated during build ++# and are in build/gcc/ada. ++BODIES := $(filter %.adb,$(PRJ_SOURCES)) ++SPECS := $(filter %.ads,$(PRJ_SOURCES)) $(patsubst %.adb,%.ads,$(BODIES) $(GENERATED_SOURCES)) ++SOURCES_TO_INSTALL := \ ++$(addprefix @srcdir@/../gcc/ada/,$(SPECS) $(BODIES)) \ ++$(addprefix ../gcc/ada/,$(GENERATED_SOURCES)) ++ ++libdir = @libdir@ ++ ++install: libgnatprj ++ $(INSTALL_DATA) libgnatprj.a $(DESTDIR)$(libdir) ++ $(INSTALL_DATA) libgnatprj.so.$(LIB_VERSION) $(DESTDIR)$(libdir) ++ cd $(DESTDIR)$(libdir); ln -sf libgnatprj.so.$(LIB_VERSION) libgnatprj.so ++ mkdir -p $(DESTDIR)$(prefix)/share/ada/adainclude/gnatprj ++ $(INSTALL_DATA) $(SOURCES_TO_INSTALL) \ ++ $(DESTDIR)$(prefix)/share/ada/adainclude/gnatprj ++ mkdir -p $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj ++ $(INSTALL) -m 0444 obj-shared/*.ali \ ++ $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj ++ chmod a=r $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj/*.ali ++ ++.PHONY: clean ++clean: ++ rm -rf *.ali obj-static obj-shared libgnatprj* *.adb *.ads stamp* +Index: b/src/libgnatprj/targetm.c +=================================================================== +--- /dev/null ++++ b/src/libgnatprj/targetm.c +@@ -0,0 +1,7 @@ ++#include "config.h" ++#include "system.h" ++#include "coretypes.h" ++#include "common/common-target.h" ++#include "common/common-target-def.h" ++ ++struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; +Index: b/src/Makefile.def +=================================================================== +--- a/src/Makefile.def ++++ b/src/Makefile.def +@@ -124,6 +124,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++host_modules= { module= libgnatprj; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + host_modules= { module= gnattools; no_check=true; + missing= info; + missing= dvi; +@@ -178,6 +185,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++target_modules = { module= libgnatprj; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + target_modules = { module= libgomp; bootstrap= true; lib_path=.libs; }; + target_modules = { module= libitm; lib_path=.libs; }; + target_modules = { module= libatomic; lib_path=.libs; }; +@@ -366,7 +380,10 @@ + + dependencies = { module=all-gnattools; on=all-libada; }; + dependencies = { module=all-gnattools; on=all-libgnatvsn; }; ++dependencies = { module=all-gnattools; on=all-libgnatprj; }; + dependencies = { module=all-libgnatvsn; on=all-libada; }; ++dependencies = { module=all-libgnatprj; on=all-libada; }; ++dependencies = { module=all-libgnatprj; on=all-libgnatvsn; }; + + dependencies = { module=all-lto-plugin; on=all-libiberty; }; + +Index: b/src/Makefile.in +=================================================================== +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -920,6 +920,7 @@ + maybe-configure-utils \ + maybe-configure-libada \ + maybe-configure-libgnatvsn \ ++ maybe-configure-libgnatprj \ + maybe-configure-gnattools \ + maybe-configure-lto-plugin + .PHONY: configure-target +@@ -945,6 +946,7 @@ + maybe-configure-target-rda \ + maybe-configure-target-libada \ + maybe-configure-target-libgnatvsn \ ++ maybe-configure-target-libgnatprj \ + maybe-configure-target-libgomp \ + maybe-configure-target-libitm \ + maybe-configure-target-libatomic +@@ -1067,6 +1069,7 @@ + all-host: maybe-all-utils + all-host: maybe-all-libada + all-host: maybe-all-libgnatvsn ++all-host: maybe-all-libgnatprj + all-host: maybe-all-gnattools + @if lto-plugin-no-bootstrap + all-host: maybe-all-lto-plugin +@@ -1101,6 +1104,7 @@ + all-target: maybe-all-target-rda + all-target: maybe-all-target-libada + all-target: maybe-all-target-libgnatvsn ++all-target: maybe-all-target-libgnatprj + @if target-libgomp-no-bootstrap + all-target: maybe-all-target-libgomp + @endif target-libgomp-no-bootstrap +@@ -1167,6 +1171,7 @@ + info-host: maybe-info-utils + info-host: maybe-info-libada + info-host: maybe-info-libgnatvsn ++info-host: maybe-info-libgnatprj + info-host: maybe-info-gnattools + info-host: maybe-info-lto-plugin + +@@ -1193,6 +1198,7 @@ + info-target: maybe-info-target-rda + info-target: maybe-info-target-libada + info-target: maybe-info-target-libgnatvsn ++info-target: maybe-info-target-libgnatprj + info-target: maybe-info-target-libgomp + info-target: maybe-info-target-libitm + info-target: maybe-info-target-libatomic +@@ -1252,6 +1258,7 @@ + dvi-host: maybe-dvi-utils + dvi-host: maybe-dvi-libada + dvi-host: maybe-dvi-libgnatvsn ++dvi-host: maybe-dvi-libgnatprj + dvi-host: maybe-dvi-gnattools + dvi-host: maybe-dvi-lto-plugin + +@@ -1278,6 +1285,7 @@ + dvi-target: maybe-dvi-target-rda + dvi-target: maybe-dvi-target-libada + dvi-target: maybe-dvi-target-libgnatvsn ++dvi-target: maybe-dvi-target-libgnatprj + dvi-target: maybe-dvi-target-libgomp + dvi-target: maybe-dvi-target-libitm + dvi-target: maybe-dvi-target-libatomic +@@ -1337,6 +1345,7 @@ + pdf-host: maybe-pdf-utils + pdf-host: maybe-pdf-libada + pdf-host: maybe-pdf-libgnatvsn ++pdf-host: maybe-pdf-libgnatprj + pdf-host: maybe-pdf-gnattools + pdf-host: maybe-pdf-lto-plugin + +@@ -1363,6 +1372,7 @@ + pdf-target: maybe-pdf-target-rda + pdf-target: maybe-pdf-target-libada + pdf-target: maybe-pdf-target-libgnatvsn ++pdf-target: maybe-pdf-target-libgnatprj + pdf-target: maybe-pdf-target-libgomp + pdf-target: maybe-pdf-target-libitm + pdf-target: maybe-pdf-target-libatomic +@@ -1422,6 +1432,7 @@ + html-host: maybe-html-utils + html-host: maybe-html-libada + html-host: maybe-html-libgnatvsn ++html-host: maybe-html-libgnatprj + html-host: maybe-html-gnattools + html-host: maybe-html-lto-plugin + +@@ -1448,6 +1459,7 @@ + html-target: maybe-html-target-rda + html-target: maybe-html-target-libada + html-target: maybe-html-target-libgnatvsn ++html-target: maybe-html-target-libgnatprj + html-target: maybe-html-target-libgomp + html-target: maybe-html-target-libitm + html-target: maybe-html-target-libatomic +@@ -1507,6 +1519,7 @@ + TAGS-host: maybe-TAGS-utils + TAGS-host: maybe-TAGS-libada + TAGS-host: maybe-TAGS-libgnatvsn ++TAGS-host: maybe-TAGS-libgnatprj + TAGS-host: maybe-TAGS-gnattools + TAGS-host: maybe-TAGS-lto-plugin + +@@ -1533,6 +1546,7 @@ + TAGS-target: maybe-TAGS-target-rda + TAGS-target: maybe-TAGS-target-libada + TAGS-target: maybe-TAGS-target-libgnatvsn ++TAGS-target: maybe-TAGS-target-libgnatprj + TAGS-target: maybe-TAGS-target-libgomp + TAGS-target: maybe-TAGS-target-libitm + TAGS-target: maybe-TAGS-target-libatomic +@@ -1592,6 +1606,7 @@ + install-info-host: maybe-install-info-utils + install-info-host: maybe-install-info-libada + install-info-host: maybe-install-info-libgnatvsn ++install-info-host: maybe-install-info-libgnatprj + install-info-host: maybe-install-info-gnattools + install-info-host: maybe-install-info-lto-plugin + +@@ -1618,6 +1633,7 @@ + install-info-target: maybe-install-info-target-rda + install-info-target: maybe-install-info-target-libada + install-info-target: maybe-install-info-target-libgnatvsn ++install-info-target: maybe-install-info-target-libgnatprj + install-info-target: maybe-install-info-target-libgomp + install-info-target: maybe-install-info-target-libitm + install-info-target: maybe-install-info-target-libatomic +@@ -1677,6 +1693,7 @@ + install-pdf-host: maybe-install-pdf-utils + install-pdf-host: maybe-install-pdf-libada + install-pdf-host: maybe-install-pdf-libgnatvsn ++install-pdf-host: maybe-install-pdf-libgnatprj + install-pdf-host: maybe-install-pdf-gnattools + install-pdf-host: maybe-install-pdf-lto-plugin + +@@ -1703,6 +1720,7 @@ + install-pdf-target: maybe-install-pdf-target-rda + install-pdf-target: maybe-install-pdf-target-libada + install-pdf-target: maybe-install-pdf-target-libgnatvsn ++install-pdf-target: maybe-install-pdf-target-libgnatprj + install-pdf-target: maybe-install-pdf-target-libgomp + install-pdf-target: maybe-install-pdf-target-libitm + install-pdf-target: maybe-install-pdf-target-libatomic +@@ -1762,6 +1780,7 @@ + install-html-host: maybe-install-html-utils + install-html-host: maybe-install-html-libada + install-html-host: maybe-install-html-libgnatvsn ++install-html-host: maybe-install-html-libgnatprj + install-html-host: maybe-install-html-gnattools + install-html-host: maybe-install-html-lto-plugin + +@@ -1788,6 +1807,7 @@ + install-html-target: maybe-install-html-target-rda + install-html-target: maybe-install-html-target-libada + install-html-target: maybe-install-html-target-libgnatvsn ++install-html-target: maybe-install-html-target-libgnatprj + install-html-target: maybe-install-html-target-libgomp + install-html-target: maybe-install-html-target-libitm + install-html-target: maybe-install-html-target-libatomic +@@ -1847,6 +1867,7 @@ + installcheck-host: maybe-installcheck-utils + installcheck-host: maybe-installcheck-libada + installcheck-host: maybe-installcheck-libgnatvsn ++installcheck-host: maybe-installcheck-libgnatprj + installcheck-host: maybe-installcheck-gnattools + installcheck-host: maybe-installcheck-lto-plugin + +@@ -1873,6 +1894,7 @@ + installcheck-target: maybe-installcheck-target-rda + installcheck-target: maybe-installcheck-target-libada + installcheck-target: maybe-installcheck-target-libgnatvsn ++installcheck-target: maybe-installcheck-target-libgnatprj + installcheck-target: maybe-installcheck-target-libgomp + installcheck-target: maybe-installcheck-target-libitm + installcheck-target: maybe-installcheck-target-libatomic +@@ -1932,6 +1954,7 @@ + mostlyclean-host: maybe-mostlyclean-utils + mostlyclean-host: maybe-mostlyclean-libada + mostlyclean-host: maybe-mostlyclean-libgnatvsn ++mostlyclean-host: maybe-mostlyclean-libgnatprj + mostlyclean-host: maybe-mostlyclean-gnattools + mostlyclean-host: maybe-mostlyclean-lto-plugin + +@@ -1958,6 +1981,7 @@ + mostlyclean-target: maybe-mostlyclean-target-rda + mostlyclean-target: maybe-mostlyclean-target-libada + mostlyclean-target: maybe-mostlyclean-target-libgnatvsn ++mostlyclean-target: maybe-mostlyclean-target-libgnatprj + mostlyclean-target: maybe-mostlyclean-target-libgomp + mostlyclean-target: maybe-mostlyclean-target-libitm + mostlyclean-target: maybe-mostlyclean-target-libatomic +@@ -2017,6 +2041,7 @@ + clean-host: maybe-clean-utils + clean-host: maybe-clean-libada + clean-host: maybe-clean-libgnatvsn ++clean-host: maybe-clean-libgnatprj + clean-host: maybe-clean-gnattools + clean-host: maybe-clean-lto-plugin + +@@ -2043,6 +2068,7 @@ + clean-target: maybe-clean-target-rda + clean-target: maybe-clean-target-libada + clean-target: maybe-clean-target-libgnatvsn ++clean-target: maybe-clean-target-libgnatprj + clean-target: maybe-clean-target-libgomp + clean-target: maybe-clean-target-libitm + clean-target: maybe-clean-target-libatomic +@@ -2102,6 +2128,7 @@ + distclean-host: maybe-distclean-utils + distclean-host: maybe-distclean-libada + distclean-host: maybe-distclean-libgnatvsn ++distclean-host: maybe-distclean-libgnatprj + distclean-host: maybe-distclean-gnattools + distclean-host: maybe-distclean-lto-plugin + +@@ -2128,6 +2155,7 @@ + distclean-target: maybe-distclean-target-rda + distclean-target: maybe-distclean-target-libada + distclean-target: maybe-distclean-target-libgnatvsn ++distclean-target: maybe-distclean-target-libgnatprj + distclean-target: maybe-distclean-target-libgomp + distclean-target: maybe-distclean-target-libitm + distclean-target: maybe-distclean-target-libatomic +@@ -2187,6 +2215,7 @@ + maintainer-clean-host: maybe-maintainer-clean-utils + maintainer-clean-host: maybe-maintainer-clean-libada + maintainer-clean-host: maybe-maintainer-clean-libgnatvsn ++maintainer-clean-host: maybe-maintainer-clean-libgnatprj + maintainer-clean-host: maybe-maintainer-clean-gnattools + maintainer-clean-host: maybe-maintainer-clean-lto-plugin + +@@ -2213,6 +2242,7 @@ + maintainer-clean-target: maybe-maintainer-clean-target-rda + maintainer-clean-target: maybe-maintainer-clean-target-libada + maintainer-clean-target: maybe-maintainer-clean-target-libgnatvsn ++maintainer-clean-target: maybe-maintainer-clean-target-libgnatprj + maintainer-clean-target: maybe-maintainer-clean-target-libgomp + maintainer-clean-target: maybe-maintainer-clean-target-libitm + maintainer-clean-target: maybe-maintainer-clean-target-libatomic +@@ -2327,6 +2357,7 @@ + maybe-check-utils \ + maybe-check-libada \ + maybe-check-libgnatvsn \ ++ maybe-check-libgnatprj \ + maybe-check-gnattools \ + maybe-check-lto-plugin + +@@ -2353,6 +2384,7 @@ + maybe-check-target-rda \ + maybe-check-target-libada \ + maybe-check-target-libgnatvsn \ ++ maybe-check-target-libgnatprj \ + maybe-check-target-libgomp \ + maybe-check-target-libitm \ + maybe-check-target-libatomic +@@ -2438,6 +2470,7 @@ + maybe-install-utils \ + maybe-install-libada \ + maybe-install-libgnatvsn \ ++ maybe-install-libgnatprj \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2487,6 +2520,7 @@ + maybe-install-utils \ + maybe-install-libada \ + maybe-install-libgnatvsn \ ++ maybe-install-libgnatprj \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2513,6 +2547,7 @@ + maybe-install-target-rda \ + maybe-install-target-libada \ + maybe-install-target-libgnatvsn \ ++ maybe-install-target-libgnatprj \ + maybe-install-target-libgomp \ + maybe-install-target-libitm \ + maybe-install-target-libatomic +@@ -2592,6 +2627,7 @@ + maybe-install-strip-utils \ + maybe-install-strip-libada \ + maybe-install-strip-libgnatvsn \ ++ maybe-install-strip-libgnatprj \ + maybe-install-strip-gnattools \ + maybe-install-strip-lto-plugin + +@@ -2618,6 +2654,7 @@ + maybe-install-strip-target-rda \ + maybe-install-strip-target-libada \ + maybe-install-strip-target-libgnatvsn \ ++ maybe-install-strip-target-libgnatprj \ + maybe-install-strip-target-libgomp \ + maybe-install-strip-target-libitm \ + maybe-install-strip-target-libatomic +@@ -30140,6 +30177,343 @@ + + + ++.PHONY: configure-libgnatprj maybe-configure-libgnatprj ++maybe-configure-libgnatprj: ++@if gcc-bootstrap ++configure-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if libgnatprj ++maybe-configure-libgnatprj: configure-libgnatprj ++configure-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/libgnatprj/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libgnatprj ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/libgnatprj; \ ++ cd "$(HOST_SUBDIR)/libgnatprj" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/libgnatprj/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatprj"; \ ++ libsrcdir="$$s/libgnatprj"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif libgnatprj ++ ++ ++ ++ ++ ++.PHONY: all-libgnatprj maybe-all-libgnatprj ++maybe-all-libgnatprj: ++@if gcc-bootstrap ++all-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if libgnatprj ++TARGET-libgnatprj=all ++maybe-all-libgnatprj: all-libgnatprj ++all-libgnatprj: configure-libgnatprj ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS) $(STAGE1_FLAGS_TO_PASS) \ ++ $(TARGET-libgnatprj)) ++@endif libgnatprj ++ ++ ++ ++ ++.PHONY: check-libgnatprj maybe-check-libgnatprj ++maybe-check-libgnatprj: ++@if libgnatprj ++maybe-check-libgnatprj: check-libgnatprj ++ ++check-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: install-libgnatprj maybe-install-libgnatprj ++maybe-install-libgnatprj: ++@if libgnatprj ++maybe-install-libgnatprj: install-libgnatprj ++ ++install-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(FLAGS_TO_PASS) install) ++ ++@endif libgnatprj ++ ++.PHONY: install-strip-libgnatprj maybe-install-strip-libgnatprj ++maybe-install-strip-libgnatprj: ++@if libgnatprj ++maybe-install-strip-libgnatprj: install-strip-libgnatprj ++ ++install-strip-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(FLAGS_TO_PASS) install-strip) ++ ++@endif libgnatprj ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-libgnatprj info-libgnatprj ++maybe-info-libgnatprj: ++@if libgnatprj ++maybe-info-libgnatprj: info-libgnatprj ++ ++# libgnatprj doesn't support info. ++info-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-dvi-libgnatprj dvi-libgnatprj ++maybe-dvi-libgnatprj: ++@if libgnatprj ++maybe-dvi-libgnatprj: dvi-libgnatprj ++ ++# libgnatprj doesn't support dvi. ++dvi-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-pdf-libgnatprj pdf-libgnatprj ++maybe-pdf-libgnatprj: ++@if libgnatprj ++maybe-pdf-libgnatprj: pdf-libgnatprj ++ ++pdf-libgnatprj: \ ++ configure-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-html-libgnatprj html-libgnatprj ++maybe-html-libgnatprj: ++@if libgnatprj ++maybe-html-libgnatprj: html-libgnatprj ++ ++# libgnatprj doesn't support html. ++html-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-TAGS-libgnatprj TAGS-libgnatprj ++maybe-TAGS-libgnatprj: ++@if libgnatprj ++maybe-TAGS-libgnatprj: TAGS-libgnatprj ++ ++# libgnatprj doesn't support TAGS. ++TAGS-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-info-libgnatprj install-info-libgnatprj ++maybe-install-info-libgnatprj: ++@if libgnatprj ++maybe-install-info-libgnatprj: install-info-libgnatprj ++ ++# libgnatprj doesn't support install-info. ++install-info-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-pdf-libgnatprj install-pdf-libgnatprj ++maybe-install-pdf-libgnatprj: ++@if libgnatprj ++maybe-install-pdf-libgnatprj: install-pdf-libgnatprj ++ ++install-pdf-libgnatprj: \ ++ configure-libgnatprj \ ++ pdf-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-html-libgnatprj install-html-libgnatprj ++maybe-install-html-libgnatprj: ++@if libgnatprj ++maybe-install-html-libgnatprj: install-html-libgnatprj ++ ++install-html-libgnatprj: \ ++ configure-libgnatprj \ ++ html-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-installcheck-libgnatprj installcheck-libgnatprj ++maybe-installcheck-libgnatprj: ++@if libgnatprj ++maybe-installcheck-libgnatprj: installcheck-libgnatprj ++ ++# libgnatprj doesn't support installcheck. ++installcheck-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-mostlyclean-libgnatprj mostlyclean-libgnatprj ++maybe-mostlyclean-libgnatprj: ++@if libgnatprj ++maybe-mostlyclean-libgnatprj: mostlyclean-libgnatprj ++ ++mostlyclean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-clean-libgnatprj clean-libgnatprj ++maybe-clean-libgnatprj: ++@if libgnatprj ++maybe-clean-libgnatprj: clean-libgnatprj ++ ++clean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-distclean-libgnatprj distclean-libgnatprj ++maybe-distclean-libgnatprj: ++@if libgnatprj ++maybe-distclean-libgnatprj: distclean-libgnatprj ++ ++distclean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-maintainer-clean-libgnatprj maintainer-clean-libgnatprj ++maybe-maintainer-clean-libgnatprj: ++@if libgnatprj ++maybe-maintainer-clean-libgnatprj: maintainer-clean-libgnatprj ++ ++maintainer-clean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -42211,6 +42585,361 @@ + + + ++.PHONY: configure-target-libgnatprj maybe-configure-target-libgnatprj ++maybe-configure-target-libgnatprj: ++@if gcc-bootstrap ++configure-target-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if target-libgnatprj ++maybe-configure-target-libgnatprj: configure-target-libgnatprj ++configure-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ echo "Checking multilib configuration for libgnatprj..."; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatprj ; \ ++ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libgnatprj/multilib.tmp 2> /dev/null ; \ ++ if test -r $(TARGET_SUBDIR)/libgnatprj/multilib.out; then \ ++ if cmp -s $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; then \ ++ rm -f $(TARGET_SUBDIR)/libgnatprj/multilib.tmp; \ ++ else \ ++ rm -f $(TARGET_SUBDIR)/libgnatprj/Makefile; \ ++ mv $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; \ ++ fi; \ ++ else \ ++ mv $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; \ ++ fi; \ ++ test ! -f $(TARGET_SUBDIR)/libgnatprj/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatprj ; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo Configuring in $(TARGET_SUBDIR)/libgnatprj; \ ++ cd "$(TARGET_SUBDIR)/libgnatprj" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(TARGET_SUBDIR)/libgnatprj/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatprj"; \ ++ libsrcdir="$$s/libgnatprj"; \ ++ rm -f no-such-file || : ; \ ++ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ ++ $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif target-libgnatprj ++ ++ ++ ++ ++ ++.PHONY: all-target-libgnatprj maybe-all-target-libgnatprj ++maybe-all-target-libgnatprj: ++@if gcc-bootstrap ++all-target-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if target-libgnatprj ++TARGET-target-libgnatprj=all ++maybe-all-target-libgnatprj: all-target-libgnatprj ++all-target-libgnatprj: configure-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) \ ++ $(TARGET-target-libgnatprj)) ++@endif target-libgnatprj ++ ++ ++ ++ ++ ++.PHONY: check-target-libgnatprj maybe-check-target-libgnatprj ++maybe-check-target-libgnatprj: ++@if target-libgnatprj ++maybe-check-target-libgnatprj: check-target-libgnatprj ++ ++# Dummy target for uncheckable module. ++check-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: install-target-libgnatprj maybe-install-target-libgnatprj ++maybe-install-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-target-libgnatprj: install-target-libgnatprj ++ ++install-target-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ ++@endif target-libgnatprj ++ ++.PHONY: install-strip-target-libgnatprj maybe-install-strip-target-libgnatprj ++maybe-install-strip-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-strip-target-libgnatprj: install-strip-target-libgnatprj ++ ++install-strip-target-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install-strip) ++ ++@endif target-libgnatprj ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-target-libgnatprj info-target-libgnatprj ++maybe-info-target-libgnatprj: ++@if target-libgnatprj ++maybe-info-target-libgnatprj: info-target-libgnatprj ++ ++# libgnatprj doesn't support info. ++info-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-dvi-target-libgnatprj dvi-target-libgnatprj ++maybe-dvi-target-libgnatprj: ++@if target-libgnatprj ++maybe-dvi-target-libgnatprj: dvi-target-libgnatprj ++ ++# libgnatprj doesn't support dvi. ++dvi-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-pdf-target-libgnatprj pdf-target-libgnatprj ++maybe-pdf-target-libgnatprj: ++@if target-libgnatprj ++maybe-pdf-target-libgnatprj: pdf-target-libgnatprj ++ ++pdf-target-libgnatprj: \ ++ configure-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing pdf in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-html-target-libgnatprj html-target-libgnatprj ++maybe-html-target-libgnatprj: ++@if target-libgnatprj ++maybe-html-target-libgnatprj: html-target-libgnatprj ++ ++# libgnatprj doesn't support html. ++html-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-TAGS-target-libgnatprj TAGS-target-libgnatprj ++maybe-TAGS-target-libgnatprj: ++@if target-libgnatprj ++maybe-TAGS-target-libgnatprj: TAGS-target-libgnatprj ++ ++# libgnatprj doesn't support TAGS. ++TAGS-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-info-target-libgnatprj install-info-target-libgnatprj ++maybe-install-info-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-info-target-libgnatprj: install-info-target-libgnatprj ++ ++# libgnatprj doesn't support install-info. ++install-info-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-pdf-target-libgnatprj install-pdf-target-libgnatprj ++maybe-install-pdf-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-pdf-target-libgnatprj: install-pdf-target-libgnatprj ++ ++install-pdf-target-libgnatprj: \ ++ configure-target-libgnatprj \ ++ pdf-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-pdf in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-html-target-libgnatprj install-html-target-libgnatprj ++maybe-install-html-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-html-target-libgnatprj: install-html-target-libgnatprj ++ ++install-html-target-libgnatprj: \ ++ configure-target-libgnatprj \ ++ html-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-html in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-installcheck-target-libgnatprj installcheck-target-libgnatprj ++maybe-installcheck-target-libgnatprj: ++@if target-libgnatprj ++maybe-installcheck-target-libgnatprj: installcheck-target-libgnatprj ++ ++# libgnatprj doesn't support installcheck. ++installcheck-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-mostlyclean-target-libgnatprj mostlyclean-target-libgnatprj ++maybe-mostlyclean-target-libgnatprj: ++@if target-libgnatprj ++maybe-mostlyclean-target-libgnatprj: mostlyclean-target-libgnatprj ++ ++mostlyclean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing mostlyclean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-clean-target-libgnatprj clean-target-libgnatprj ++maybe-clean-target-libgnatprj: ++@if target-libgnatprj ++maybe-clean-target-libgnatprj: clean-target-libgnatprj ++ ++clean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing clean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-distclean-target-libgnatprj distclean-target-libgnatprj ++maybe-distclean-target-libgnatprj: ++@if target-libgnatprj ++maybe-distclean-target-libgnatprj: distclean-target-libgnatprj ++ ++distclean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing distclean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-maintainer-clean-target-libgnatprj maintainer-clean-target-libgnatprj ++maybe-maintainer-clean-target-libgnatprj: ++@if target-libgnatprj ++maybe-maintainer-clean-target-libgnatprj: maintainer-clean-target-libgnatprj ++ ++maintainer-clean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++ ++ ++ ++ + .PHONY: configure-target-libgomp maybe-configure-target-libgomp + maybe-configure-target-libgomp: + @if gcc-bootstrap +@@ -46265,6 +46994,7 @@ + configure-target-rda: stage_last + configure-target-libada: stage_last + configure-target-libgnatvsn: stage_last ++configure-target-libgnatprj: stage_last + configure-stage1-target-libgomp: maybe-all-stage1-gcc + configure-stage2-target-libgomp: maybe-all-stage2-gcc + configure-stage3-target-libgomp: maybe-all-stage3-gcc +@@ -46297,6 +47027,7 @@ + configure-target-rda: maybe-all-gcc + configure-target-libada: maybe-all-gcc + configure-target-libgnatvsn: maybe-all-gcc ++configure-target-libgnatprj: maybe-all-gcc + configure-target-libgomp: maybe-all-gcc + configure-target-libitm: maybe-all-gcc + configure-target-libatomic: maybe-all-gcc +@@ -46591,7 +47322,10 @@ + all-fixincludes: maybe-all-libiberty + all-gnattools: maybe-all-libada + all-gnattools: maybe-all-libgnatvsn ++all-gnattools: maybe-all-libgnatprj + all-libgnatvsn: maybe-all-libada ++all-libgnatprj: maybe-all-libada ++all-libgnatprj: maybe-all-libgnatvsn + all-lto-plugin: maybe-all-libiberty + + all-stage1-lto-plugin: maybe-all-stage1-libiberty +@@ -47128,6 +47862,7 @@ + configure-target-rda: maybe-all-target-libgcc + configure-target-libada: maybe-all-target-libgcc + configure-target-libgnatvsn: maybe-all-target-libgcc ++configure-target-libgnatprj: maybe-all-target-libgcc + configure-target-libgomp: maybe-all-target-libgcc + configure-target-libitm: maybe-all-target-libgcc + configure-target-libatomic: maybe-all-target-libgcc +@@ -47174,6 +47909,8 @@ + + configure-target-libgnatvsn: maybe-all-target-newlib maybe-all-target-libgloss + ++configure-target-libgnatprj: maybe-all-target-newlib maybe-all-target-libgloss ++ + configure-target-libgomp: maybe-all-target-newlib maybe-all-target-libgloss + + configure-target-libitm: maybe-all-target-newlib maybe-all-target-libgloss +Index: b/src/configure.ac +=================================================================== +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -133,7 +133,7 @@ + + # these libraries are used by various programs built for the host environment + # +-host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv libada libgnatvsn" ++host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv libada libgnatvsn libgnatprj" + + # these tools are built for the host environment + # Note, the powerpc-eabi build depends on sim occurring before gdb in order to +@@ -169,6 +169,7 @@ + target-libobjc \ + target-libada \ + target-libgnatvsn \ ++ target-libgnatprj \ + target-libgo" + + # these tools are built using the target libraries, and are intended to +@@ -265,7 +266,7 @@ + + # Some are only suitable for cross toolchains. + # Remove these if host=target. +-cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn" ++cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn target-libgnatprj" + + case $is_cross_compiler in + no) skipdirs="${skipdirs} ${cross_only}" ;; +@@ -421,7 +422,7 @@ + ENABLE_LIBADA=$enableval, + ENABLE_LIBADA=yes) + if test "${ENABLE_LIBADA}" != "yes" ; then +- noconfigdirs="$noconfigdirs libgnatvsn gnattools" ++ noconfigdirs="$noconfigdirs libgnatvsn libgnatprj gnattools" + fi + + AC_ARG_ENABLE(libssp, +Index: b/src/libgnatprj/configure.ac +=================================================================== +--- /dev/null ++++ b/src/libgnatprj/configure.ac +@@ -0,0 +1,145 @@ ++# Configure script for libada. ++# Copyright 2003, 2004 Free Software Foundation, Inc. ++# ++# This file is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++AC_INIT ++AC_PREREQ([2.63]) ++ ++AC_CONFIG_SRCDIR([Makefile.in]) ++ ++# Start of actual configure tests ++ ++AC_PROG_INSTALL ++ ++AC_CANONICAL_BUILD ++AC_CANONICAL_HOST ++AC_CANONICAL_TARGET ++ ++sinclude(../config/acx.m4) ++ACX_NONCANONICAL_TARGET ++ ++# Need to pass this down for now :-P ++AC_PROG_LN_S ++ ++# Determine x_ada_cflags ++case $host in ++ hppa*) x_ada_cflags=-mdisable-indexing ;; ++ *) x_ada_cflags= ;; ++esac ++AC_SUBST([x_ada_cflags]) ++ ++# Determine what to build for 'gnattools' ++if test $build = $target ; then ++ # Note that build=target is almost certainly the wrong test; FIXME ++ default_gnattools_target="gnattools-native" ++else ++ default_gnattools_target="gnattools-cross" ++fi ++AC_SUBST([default_gnattools_target]) ++ ++# Target-specific stuff (defaults) ++TOOLS_TARGET_PAIRS= ++AC_SUBST(TOOLS_TARGET_PAIRS) ++ ++# Per-target case statement ++# ---/---------------------- ++case "${target}" in ++ alpha*-dec-vx*) # Unlike all other Vxworks ++ ;; ++ m68k*-wrs-vx* \ ++ | powerpc*-wrs-vxworks \ ++ | sparc*-wrs-vx* \ ++ | *86-wrs-vxworks \ ++ | xscale*-wrs-vx* \ ++ | xscale*-wrs-coff \ ++ | mips*-wrs-vx*) ++ TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb Makefile +Index: b/src/libgnatvsn/Makefile.in +=================================================================== +--- /dev/null ++++ b/src/libgnatvsn/Makefile.in +@@ -0,0 +1,157 @@ ++# Makefile for libgnatvsn. ++# Copyright (c) 2006 Ludovic Brenta ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++# Default target; must be first. ++all: libgnatvsn ++ ++.SUFFIXES: ++ ++CPUS := $(shell getconf _NPROCESSORS_ONLN) ++LIB_VERSION := $(strip $(shell grep ' Library_Version :' \ ++ @srcdir@/../gcc/ada/gnatvsn.ads | \ ++ sed -e 's/.*"\(.*\)".*/\1/')) ++GCC:=../gcc/xgcc -B../gcc/ ++LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++CFLAGS := -g -O2 -gnatn ++BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) ++DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) ++DATESTAMP := $(shell cat @srcdir@/../gcc/DATESTAMP) ++ ++# For use in version.c - double quoted strings, with appropriate ++# surrounding punctuation and spaces, and with the datestamp and ++# development phase collapsed to the empty string in release mode ++# (i.e. if DEVPHASE_c is empty). The space immediately after the ++# comma in the $(if ...) constructs is significant - do not remove it. ++BASEVER_s := "\"$(BASEVER)\"" ++DEVPHASE_s := "\"$(if $(DEVPHASE), ($(DEVPHASE)))\"" ++DATESTAMP_s := "\"$(if $(DEVPHASE), $(DATESTAMP))\"" ++PKGVERSION_s:= "\"@PKGVERSION@\"" ++BUGURL_s := "\"@REPORT_BUGS_TO@\"" ++ ++ifneq (@build@,@host@) ++ CFLAGS += -b @host@ ++endif ++ ++.PHONY: libgnatvsn install ++libgnatvsn: libgnatvsn.so.$(LIB_VERSION) libgnatvsn.a ++ ++VSN_SOURCES := alloc.ads aspects.adb atree.adb casing.adb csets.adb debug.adb einfo.adb \ ++elists.adb fname.adb gnatvsn.adb hostparm.ads krunch.adb lib.adb namet.adb \ ++nlists.adb opt.adb output.adb repinfo.adb scans.adb sinfo.adb sem_aux.adb \ ++sinput.adb stand.adb stringt.adb table.adb tree_in.adb tree_io.adb types.adb \ ++uintp.adb uname.adb urealp.adb widechar.adb ++ ++VSN_SEPARATES := lib-list.adb lib-sort.adb ++ ++VSN_GENERATED_SOURCES := snames.adb ++ ++OBJECTS=$(patsubst %.ads,%.o,$(VSN_SOURCES:.adb=.o) $(VSN_GENERATED_SOURCES:.adb=.o)) version.o ++ ++vpath %.c @srcdir@/../gcc ++ ++libgnatvsn.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) ++ : # Make libgnatvsn.so ++ $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ ++ -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ ln -s libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so ++ chmod a=r obj-shared/*.ali ++# Make the .ali files, but not the .o files, visible to the gnat tools. ++ cp -lp obj-shared/*.ali . ++ ++$(addprefix obj-shared/,$(OBJECTS)): | stamp-libgnatvsn-sources obj-shared ++ ++obj-shared/%.o: %.adb ++ $(GCC) -c -fPIC $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-shared/%.o: %.ads ++ $(GCC) -c -fPIC $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-shared/version.o: version.c ++ $(GCC) -c -fPIC -g -O2 \ ++ -DBASEVER=$(BASEVER_s) \ ++ -DDATESTAMP=$(DATESTAMP_s) \ ++ -DDEVPHASE=$(DEVPHASE_s) \ ++ -DPKGVERSION=$(PKGVERSION_s) \ ++ -DBUGURL=$(BUGURL_s) \ ++ -DREVISION= \ ++ $(realpath $<) -o $@ ++ ++obj-shared: ++ -mkdir $@ ++ ++libgnatvsn.a: $(addprefix obj-static/,$(OBJECTS)) ++ : # Make libgnatvsn.a ++ ar rc $@ $^ ++ ranlib $@ ++ ++$(addprefix obj-static/,$(OBJECTS)): | stamp-libgnatvsn-sources obj-static ++ ++obj-static/%.o: %.adb ++ $(GCC) -c $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-static/%.o: %.ads ++ $(GCC) -c $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-static/version.o: version.c ++ $(GCC) -c -g -O2 \ ++ -DBASEVER=$(BASEVER_s) \ ++ -DDATESTAMP=$(DATESTAMP_s) \ ++ -DDEVPHASE=$(DEVPHASE_s) \ ++ -DPKGVERSION=$(PKGVERSION_s) \ ++ -DBUGURL=$(BUGURL_s) \ ++ -DREVISION= \ ++ $< -o $@ ++ ++obj-static: ++ -mkdir $@ ++ ++$(VSN_SOURCES) $(VSN_SEPARATES) $(VSN_GENERATED_SOURCES): stamp-libgnatvsn-sources ++ ++stamp-libgnatvsn-sources: ++ for file in $(VSN_SOURCES) $(VSN_SEPARATES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f @srcdir@/../gcc/ada/$$file -a ! -L $$file ] ; then ln -s @srcdir@/../gcc/ada/$$file .; fi; \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then ln -s @srcdir@/../gcc/ada/$$ads .; fi; \ ++ done ++ for file in $(VSN_GENERATED_SOURCES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f ../gcc/ada/$$file -a ! -L $$file ] ; then ln -s ../gcc/ada/$$file .; fi; \ ++ if [ -f ../gcc/ada/$$ads -a ! -L $$ads ] ; then ln -s ../gcc/ada/$$ads .; fi; \ ++ done ++ touch $@ ++ ++libdir = @libdir@ ++ ++install: libgnatvsn ++ $(INSTALL_DATA) libgnatvsn.a $(DESTDIR)$(libdir) ++ $(INSTALL_DATA) libgnatvsn.so.$(LIB_VERSION) $(DESTDIR)$(libdir) ++ cd $(DESTDIR)$(libdir); ln -sf libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so ++ mkdir -p $(DESTDIR)$(prefix)/share/ada/adainclude/gnatvsn ++ $(INSTALL_DATA) \ ++ $(addprefix @srcdir@/../gcc/ada/,$(VSN_SOURCES) $(VSN_SEPARATES)) \ ++ $(addprefix @srcdir@/../gcc/ada/,$(patsubst %.adb,%.ads,$(filter %.adb,$(VSN_SOURCES)))) \ ++ $(addprefix ../gcc/ada/,$(VSN_GENERATED_SOURCES)) \ ++ $(addprefix ../gcc/ada/,$(patsubst %.adb,%.ads,$(VSN_GENERATED_SOURCES))) \ ++ $(DESTDIR)$(prefix)/share/ada/adainclude/gnatvsn ++ mkdir -p $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn ++ $(INSTALL) -m 0444 obj-shared/*.ali \ ++ $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn ++ chmod a=r $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn/*.ali ++ ++.PHONY: clean ++clean: ++ rm -rf *.ali obj-static obj-shared libgnatvsn* *.adb *.ads stamp* +Index: b/src/Makefile.def +=================================================================== +--- a/src/Makefile.def ++++ b/src/Makefile.def +@@ -117,6 +117,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++host_modules= { module= libgnatvsn; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + host_modules= { module= gnattools; no_check=true; + missing= info; + missing= dvi; +@@ -164,6 +171,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++target_modules = { module= libgnatvsn; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + target_modules = { module= libgomp; bootstrap= true; lib_path=.libs; }; + target_modules = { module= libitm; lib_path=.libs; }; + target_modules = { module= libatomic; lib_path=.libs; }; +@@ -351,6 +365,8 @@ + dependencies = { module=all-fixincludes; on=all-libiberty; }; + + dependencies = { module=all-gnattools; on=all-libada; }; ++dependencies = { module=all-gnattools; on=all-libgnatvsn; }; ++dependencies = { module=all-libgnatvsn; on=all-libada; }; + + dependencies = { module=all-lto-plugin; on=all-libiberty; }; + +Index: b/src/Makefile.in +=================================================================== +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -919,6 +919,7 @@ + maybe-configure-libtermcap \ + maybe-configure-utils \ + maybe-configure-libada \ ++ maybe-configure-libgnatvsn \ + maybe-configure-gnattools \ + maybe-configure-lto-plugin + .PHONY: configure-target +@@ -943,6 +944,7 @@ + maybe-configure-target-boehm-gc \ + maybe-configure-target-rda \ + maybe-configure-target-libada \ ++ maybe-configure-target-libgnatvsn \ + maybe-configure-target-libgomp \ + maybe-configure-target-libitm \ + maybe-configure-target-libatomic +@@ -1064,6 +1066,7 @@ + all-host: maybe-all-libtermcap + all-host: maybe-all-utils + all-host: maybe-all-libada ++all-host: maybe-all-libgnatvsn + all-host: maybe-all-gnattools + @if lto-plugin-no-bootstrap + all-host: maybe-all-lto-plugin +@@ -1097,6 +1100,7 @@ + all-target: maybe-all-target-boehm-gc + all-target: maybe-all-target-rda + all-target: maybe-all-target-libada ++all-target: maybe-all-target-libgnatvsn + @if target-libgomp-no-bootstrap + all-target: maybe-all-target-libgomp + @endif target-libgomp-no-bootstrap +@@ -1162,6 +1166,7 @@ + info-host: maybe-info-libtermcap + info-host: maybe-info-utils + info-host: maybe-info-libada ++info-host: maybe-info-libgnatvsn + info-host: maybe-info-gnattools + info-host: maybe-info-lto-plugin + +@@ -1187,6 +1192,7 @@ + info-target: maybe-info-target-boehm-gc + info-target: maybe-info-target-rda + info-target: maybe-info-target-libada ++info-target: maybe-info-target-libgnatvsn + info-target: maybe-info-target-libgomp + info-target: maybe-info-target-libitm + info-target: maybe-info-target-libatomic +@@ -1245,6 +1251,7 @@ + dvi-host: maybe-dvi-libtermcap + dvi-host: maybe-dvi-utils + dvi-host: maybe-dvi-libada ++dvi-host: maybe-dvi-libgnatvsn + dvi-host: maybe-dvi-gnattools + dvi-host: maybe-dvi-lto-plugin + +@@ -1270,6 +1277,7 @@ + dvi-target: maybe-dvi-target-boehm-gc + dvi-target: maybe-dvi-target-rda + dvi-target: maybe-dvi-target-libada ++dvi-target: maybe-dvi-target-libgnatvsn + dvi-target: maybe-dvi-target-libgomp + dvi-target: maybe-dvi-target-libitm + dvi-target: maybe-dvi-target-libatomic +@@ -1328,6 +1336,7 @@ + pdf-host: maybe-pdf-libtermcap + pdf-host: maybe-pdf-utils + pdf-host: maybe-pdf-libada ++pdf-host: maybe-pdf-libgnatvsn + pdf-host: maybe-pdf-gnattools + pdf-host: maybe-pdf-lto-plugin + +@@ -1353,6 +1362,7 @@ + pdf-target: maybe-pdf-target-boehm-gc + pdf-target: maybe-pdf-target-rda + pdf-target: maybe-pdf-target-libada ++pdf-target: maybe-pdf-target-libgnatvsn + pdf-target: maybe-pdf-target-libgomp + pdf-target: maybe-pdf-target-libitm + pdf-target: maybe-pdf-target-libatomic +@@ -1411,6 +1421,7 @@ + html-host: maybe-html-libtermcap + html-host: maybe-html-utils + html-host: maybe-html-libada ++html-host: maybe-html-libgnatvsn + html-host: maybe-html-gnattools + html-host: maybe-html-lto-plugin + +@@ -1436,6 +1447,7 @@ + html-target: maybe-html-target-boehm-gc + html-target: maybe-html-target-rda + html-target: maybe-html-target-libada ++html-target: maybe-html-target-libgnatvsn + html-target: maybe-html-target-libgomp + html-target: maybe-html-target-libitm + html-target: maybe-html-target-libatomic +@@ -1494,6 +1506,7 @@ + TAGS-host: maybe-TAGS-libtermcap + TAGS-host: maybe-TAGS-utils + TAGS-host: maybe-TAGS-libada ++TAGS-host: maybe-TAGS-libgnatvsn + TAGS-host: maybe-TAGS-gnattools + TAGS-host: maybe-TAGS-lto-plugin + +@@ -1519,6 +1532,7 @@ + TAGS-target: maybe-TAGS-target-boehm-gc + TAGS-target: maybe-TAGS-target-rda + TAGS-target: maybe-TAGS-target-libada ++TAGS-target: maybe-TAGS-target-libgnatvsn + TAGS-target: maybe-TAGS-target-libgomp + TAGS-target: maybe-TAGS-target-libitm + TAGS-target: maybe-TAGS-target-libatomic +@@ -1577,6 +1591,7 @@ + install-info-host: maybe-install-info-libtermcap + install-info-host: maybe-install-info-utils + install-info-host: maybe-install-info-libada ++install-info-host: maybe-install-info-libgnatvsn + install-info-host: maybe-install-info-gnattools + install-info-host: maybe-install-info-lto-plugin + +@@ -1602,6 +1617,7 @@ + install-info-target: maybe-install-info-target-boehm-gc + install-info-target: maybe-install-info-target-rda + install-info-target: maybe-install-info-target-libada ++install-info-target: maybe-install-info-target-libgnatvsn + install-info-target: maybe-install-info-target-libgomp + install-info-target: maybe-install-info-target-libitm + install-info-target: maybe-install-info-target-libatomic +@@ -1660,6 +1676,7 @@ + install-pdf-host: maybe-install-pdf-libtermcap + install-pdf-host: maybe-install-pdf-utils + install-pdf-host: maybe-install-pdf-libada ++install-pdf-host: maybe-install-pdf-libgnatvsn + install-pdf-host: maybe-install-pdf-gnattools + install-pdf-host: maybe-install-pdf-lto-plugin + +@@ -1685,6 +1702,7 @@ + install-pdf-target: maybe-install-pdf-target-boehm-gc + install-pdf-target: maybe-install-pdf-target-rda + install-pdf-target: maybe-install-pdf-target-libada ++install-pdf-target: maybe-install-pdf-target-libgnatvsn + install-pdf-target: maybe-install-pdf-target-libgomp + install-pdf-target: maybe-install-pdf-target-libitm + install-pdf-target: maybe-install-pdf-target-libatomic +@@ -1743,6 +1761,7 @@ + install-html-host: maybe-install-html-libtermcap + install-html-host: maybe-install-html-utils + install-html-host: maybe-install-html-libada ++install-html-host: maybe-install-html-libgnatvsn + install-html-host: maybe-install-html-gnattools + install-html-host: maybe-install-html-lto-plugin + +@@ -1768,6 +1787,7 @@ + install-html-target: maybe-install-html-target-boehm-gc + install-html-target: maybe-install-html-target-rda + install-html-target: maybe-install-html-target-libada ++install-html-target: maybe-install-html-target-libgnatvsn + install-html-target: maybe-install-html-target-libgomp + install-html-target: maybe-install-html-target-libitm + install-html-target: maybe-install-html-target-libatomic +@@ -1826,6 +1846,7 @@ + installcheck-host: maybe-installcheck-libtermcap + installcheck-host: maybe-installcheck-utils + installcheck-host: maybe-installcheck-libada ++installcheck-host: maybe-installcheck-libgnatvsn + installcheck-host: maybe-installcheck-gnattools + installcheck-host: maybe-installcheck-lto-plugin + +@@ -1851,6 +1872,7 @@ + installcheck-target: maybe-installcheck-target-boehm-gc + installcheck-target: maybe-installcheck-target-rda + installcheck-target: maybe-installcheck-target-libada ++installcheck-target: maybe-installcheck-target-libgnatvsn + installcheck-target: maybe-installcheck-target-libgomp + installcheck-target: maybe-installcheck-target-libitm + installcheck-target: maybe-installcheck-target-libatomic +@@ -1909,6 +1931,7 @@ + mostlyclean-host: maybe-mostlyclean-libtermcap + mostlyclean-host: maybe-mostlyclean-utils + mostlyclean-host: maybe-mostlyclean-libada ++mostlyclean-host: maybe-mostlyclean-libgnatvsn + mostlyclean-host: maybe-mostlyclean-gnattools + mostlyclean-host: maybe-mostlyclean-lto-plugin + +@@ -1934,6 +1957,7 @@ + mostlyclean-target: maybe-mostlyclean-target-boehm-gc + mostlyclean-target: maybe-mostlyclean-target-rda + mostlyclean-target: maybe-mostlyclean-target-libada ++mostlyclean-target: maybe-mostlyclean-target-libgnatvsn + mostlyclean-target: maybe-mostlyclean-target-libgomp + mostlyclean-target: maybe-mostlyclean-target-libitm + mostlyclean-target: maybe-mostlyclean-target-libatomic +@@ -1992,6 +2016,7 @@ + clean-host: maybe-clean-libtermcap + clean-host: maybe-clean-utils + clean-host: maybe-clean-libada ++clean-host: maybe-clean-libgnatvsn + clean-host: maybe-clean-gnattools + clean-host: maybe-clean-lto-plugin + +@@ -2017,6 +2042,7 @@ + clean-target: maybe-clean-target-boehm-gc + clean-target: maybe-clean-target-rda + clean-target: maybe-clean-target-libada ++clean-target: maybe-clean-target-libgnatvsn + clean-target: maybe-clean-target-libgomp + clean-target: maybe-clean-target-libitm + clean-target: maybe-clean-target-libatomic +@@ -2075,6 +2101,7 @@ + distclean-host: maybe-distclean-libtermcap + distclean-host: maybe-distclean-utils + distclean-host: maybe-distclean-libada ++distclean-host: maybe-distclean-libgnatvsn + distclean-host: maybe-distclean-gnattools + distclean-host: maybe-distclean-lto-plugin + +@@ -2100,6 +2127,7 @@ + distclean-target: maybe-distclean-target-boehm-gc + distclean-target: maybe-distclean-target-rda + distclean-target: maybe-distclean-target-libada ++distclean-target: maybe-distclean-target-libgnatvsn + distclean-target: maybe-distclean-target-libgomp + distclean-target: maybe-distclean-target-libitm + distclean-target: maybe-distclean-target-libatomic +@@ -2158,6 +2186,7 @@ + maintainer-clean-host: maybe-maintainer-clean-libtermcap + maintainer-clean-host: maybe-maintainer-clean-utils + maintainer-clean-host: maybe-maintainer-clean-libada ++maintainer-clean-host: maybe-maintainer-clean-libgnatvsn + maintainer-clean-host: maybe-maintainer-clean-gnattools + maintainer-clean-host: maybe-maintainer-clean-lto-plugin + +@@ -2183,6 +2212,7 @@ + maintainer-clean-target: maybe-maintainer-clean-target-boehm-gc + maintainer-clean-target: maybe-maintainer-clean-target-rda + maintainer-clean-target: maybe-maintainer-clean-target-libada ++maintainer-clean-target: maybe-maintainer-clean-target-libgnatvsn + maintainer-clean-target: maybe-maintainer-clean-target-libgomp + maintainer-clean-target: maybe-maintainer-clean-target-libitm + maintainer-clean-target: maybe-maintainer-clean-target-libatomic +@@ -2296,6 +2326,7 @@ + maybe-check-libtermcap \ + maybe-check-utils \ + maybe-check-libada \ ++ maybe-check-libgnatvsn \ + maybe-check-gnattools \ + maybe-check-lto-plugin + +@@ -2321,6 +2352,7 @@ + maybe-check-target-boehm-gc \ + maybe-check-target-rda \ + maybe-check-target-libada \ ++ maybe-check-target-libgnatvsn \ + maybe-check-target-libgomp \ + maybe-check-target-libitm \ + maybe-check-target-libatomic +@@ -2405,6 +2437,7 @@ + maybe-install-libtermcap \ + maybe-install-utils \ + maybe-install-libada \ ++ maybe-install-libgnatvsn \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2453,6 +2486,7 @@ + maybe-install-libtermcap \ + maybe-install-utils \ + maybe-install-libada \ ++ maybe-install-libgnatvsn \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2478,6 +2512,7 @@ + maybe-install-target-boehm-gc \ + maybe-install-target-rda \ + maybe-install-target-libada \ ++ maybe-install-target-libgnatvsn \ + maybe-install-target-libgomp \ + maybe-install-target-libitm \ + maybe-install-target-libatomic +@@ -2556,6 +2591,7 @@ + maybe-install-strip-libtermcap \ + maybe-install-strip-utils \ + maybe-install-strip-libada \ ++ maybe-install-strip-libgnatvsn \ + maybe-install-strip-gnattools \ + maybe-install-strip-lto-plugin + +@@ -2581,6 +2617,7 @@ + maybe-install-strip-target-boehm-gc \ + maybe-install-strip-target-rda \ + maybe-install-strip-target-libada \ ++ maybe-install-strip-target-libgnatvsn \ + maybe-install-strip-target-libgomp \ + maybe-install-strip-target-libitm \ + maybe-install-strip-target-libatomic +@@ -29766,6 +29803,343 @@ + + + ++.PHONY: configure-libgnatvsn maybe-configure-libgnatvsn ++maybe-configure-libgnatvsn: ++@if gcc-bootstrap ++configure-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if libgnatvsn ++maybe-configure-libgnatvsn: configure-libgnatvsn ++configure-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/libgnatvsn/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libgnatvsn ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/libgnatvsn; \ ++ cd "$(HOST_SUBDIR)/libgnatvsn" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/libgnatvsn/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatvsn"; \ ++ libsrcdir="$$s/libgnatvsn"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: all-libgnatvsn maybe-all-libgnatvsn ++maybe-all-libgnatvsn: ++@if gcc-bootstrap ++all-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if libgnatvsn ++TARGET-libgnatvsn=all ++maybe-all-libgnatvsn: all-libgnatvsn ++all-libgnatvsn: configure-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS) $(STAGE1_FLAGS_TO_PASS) \ ++ $(TARGET-libgnatvsn)) ++@endif libgnatvsn ++ ++ ++ ++ ++.PHONY: check-libgnatvsn maybe-check-libgnatvsn ++maybe-check-libgnatvsn: ++@if libgnatvsn ++maybe-check-libgnatvsn: check-libgnatvsn ++ ++check-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: install-libgnatvsn maybe-install-libgnatvsn ++maybe-install-libgnatvsn: ++@if libgnatvsn ++maybe-install-libgnatvsn: install-libgnatvsn ++ ++install-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(FLAGS_TO_PASS) install) ++ ++@endif libgnatvsn ++ ++.PHONY: install-strip-libgnatvsn maybe-install-strip-libgnatvsn ++maybe-install-strip-libgnatvsn: ++@if libgnatvsn ++maybe-install-strip-libgnatvsn: install-strip-libgnatvsn ++ ++install-strip-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(FLAGS_TO_PASS) install-strip) ++ ++@endif libgnatvsn ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-libgnatvsn info-libgnatvsn ++maybe-info-libgnatvsn: ++@if libgnatvsn ++maybe-info-libgnatvsn: info-libgnatvsn ++ ++# libgnatvsn doesn't support info. ++info-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-dvi-libgnatvsn dvi-libgnatvsn ++maybe-dvi-libgnatvsn: ++@if libgnatvsn ++maybe-dvi-libgnatvsn: dvi-libgnatvsn ++ ++# libgnatvsn doesn't support dvi. ++dvi-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-pdf-libgnatvsn pdf-libgnatvsn ++maybe-pdf-libgnatvsn: ++@if libgnatvsn ++maybe-pdf-libgnatvsn: pdf-libgnatvsn ++ ++pdf-libgnatvsn: \ ++ configure-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-html-libgnatvsn html-libgnatvsn ++maybe-html-libgnatvsn: ++@if libgnatvsn ++maybe-html-libgnatvsn: html-libgnatvsn ++ ++# libgnatvsn doesn't support html. ++html-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-TAGS-libgnatvsn TAGS-libgnatvsn ++maybe-TAGS-libgnatvsn: ++@if libgnatvsn ++maybe-TAGS-libgnatvsn: TAGS-libgnatvsn ++ ++# libgnatvsn doesn't support TAGS. ++TAGS-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-info-libgnatvsn install-info-libgnatvsn ++maybe-install-info-libgnatvsn: ++@if libgnatvsn ++maybe-install-info-libgnatvsn: install-info-libgnatvsn ++ ++# libgnatvsn doesn't support install-info. ++install-info-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-pdf-libgnatvsn install-pdf-libgnatvsn ++maybe-install-pdf-libgnatvsn: ++@if libgnatvsn ++maybe-install-pdf-libgnatvsn: install-pdf-libgnatvsn ++ ++install-pdf-libgnatvsn: \ ++ configure-libgnatvsn \ ++ pdf-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-html-libgnatvsn install-html-libgnatvsn ++maybe-install-html-libgnatvsn: ++@if libgnatvsn ++maybe-install-html-libgnatvsn: install-html-libgnatvsn ++ ++install-html-libgnatvsn: \ ++ configure-libgnatvsn \ ++ html-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-installcheck-libgnatvsn installcheck-libgnatvsn ++maybe-installcheck-libgnatvsn: ++@if libgnatvsn ++maybe-installcheck-libgnatvsn: installcheck-libgnatvsn ++ ++# libgnatvsn doesn't support installcheck. ++installcheck-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-mostlyclean-libgnatvsn mostlyclean-libgnatvsn ++maybe-mostlyclean-libgnatvsn: ++@if libgnatvsn ++maybe-mostlyclean-libgnatvsn: mostlyclean-libgnatvsn ++ ++mostlyclean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-clean-libgnatvsn clean-libgnatvsn ++maybe-clean-libgnatvsn: ++@if libgnatvsn ++maybe-clean-libgnatvsn: clean-libgnatvsn ++ ++clean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-distclean-libgnatvsn distclean-libgnatvsn ++maybe-distclean-libgnatvsn: ++@if libgnatvsn ++maybe-distclean-libgnatvsn: distclean-libgnatvsn ++ ++distclean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-maintainer-clean-libgnatvsn maintainer-clean-libgnatvsn ++maybe-maintainer-clean-libgnatvsn: ++@if libgnatvsn ++maybe-maintainer-clean-libgnatvsn: maintainer-clean-libgnatvsn ++ ++maintainer-clean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -41482,6 +41856,361 @@ + + + ++.PHONY: configure-target-libgnatvsn maybe-configure-target-libgnatvsn ++maybe-configure-target-libgnatvsn: ++@if gcc-bootstrap ++configure-target-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if target-libgnatvsn ++maybe-configure-target-libgnatvsn: configure-target-libgnatvsn ++configure-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ echo "Checking multilib configuration for libgnatvsn..."; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatvsn ; \ ++ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp 2> /dev/null ; \ ++ if test -r $(TARGET_SUBDIR)/libgnatvsn/multilib.out; then \ ++ if cmp -s $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; then \ ++ rm -f $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp; \ ++ else \ ++ rm -f $(TARGET_SUBDIR)/libgnatvsn/Makefile; \ ++ mv $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; \ ++ fi; \ ++ else \ ++ mv $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; \ ++ fi; \ ++ test ! -f $(TARGET_SUBDIR)/libgnatvsn/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatvsn ; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo Configuring in $(TARGET_SUBDIR)/libgnatvsn; \ ++ cd "$(TARGET_SUBDIR)/libgnatvsn" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(TARGET_SUBDIR)/libgnatvsn/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatvsn"; \ ++ libsrcdir="$$s/libgnatvsn"; \ ++ rm -f no-such-file || : ; \ ++ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ ++ $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif target-libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: all-target-libgnatvsn maybe-all-target-libgnatvsn ++maybe-all-target-libgnatvsn: ++@if gcc-bootstrap ++all-target-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if target-libgnatvsn ++TARGET-target-libgnatvsn=all ++maybe-all-target-libgnatvsn: all-target-libgnatvsn ++all-target-libgnatvsn: configure-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) \ ++ $(TARGET-target-libgnatvsn)) ++@endif target-libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: check-target-libgnatvsn maybe-check-target-libgnatvsn ++maybe-check-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-check-target-libgnatvsn: check-target-libgnatvsn ++ ++# Dummy target for uncheckable module. ++check-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: install-target-libgnatvsn maybe-install-target-libgnatvsn ++maybe-install-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-target-libgnatvsn: install-target-libgnatvsn ++ ++install-target-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ ++@endif target-libgnatvsn ++ ++.PHONY: install-strip-target-libgnatvsn maybe-install-strip-target-libgnatvsn ++maybe-install-strip-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-strip-target-libgnatvsn: install-strip-target-libgnatvsn ++ ++install-strip-target-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install-strip) ++ ++@endif target-libgnatvsn ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-target-libgnatvsn info-target-libgnatvsn ++maybe-info-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-info-target-libgnatvsn: info-target-libgnatvsn ++ ++# libgnatvsn doesn't support info. ++info-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-dvi-target-libgnatvsn dvi-target-libgnatvsn ++maybe-dvi-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-dvi-target-libgnatvsn: dvi-target-libgnatvsn ++ ++# libgnatvsn doesn't support dvi. ++dvi-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-pdf-target-libgnatvsn pdf-target-libgnatvsn ++maybe-pdf-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-pdf-target-libgnatvsn: pdf-target-libgnatvsn ++ ++pdf-target-libgnatvsn: \ ++ configure-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing pdf in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-html-target-libgnatvsn html-target-libgnatvsn ++maybe-html-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-html-target-libgnatvsn: html-target-libgnatvsn ++ ++# libgnatvsn doesn't support html. ++html-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-TAGS-target-libgnatvsn TAGS-target-libgnatvsn ++maybe-TAGS-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-TAGS-target-libgnatvsn: TAGS-target-libgnatvsn ++ ++# libgnatvsn doesn't support TAGS. ++TAGS-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-info-target-libgnatvsn install-info-target-libgnatvsn ++maybe-install-info-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-info-target-libgnatvsn: install-info-target-libgnatvsn ++ ++# libgnatvsn doesn't support install-info. ++install-info-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-pdf-target-libgnatvsn install-pdf-target-libgnatvsn ++maybe-install-pdf-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-pdf-target-libgnatvsn: install-pdf-target-libgnatvsn ++ ++install-pdf-target-libgnatvsn: \ ++ configure-target-libgnatvsn \ ++ pdf-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-pdf in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-html-target-libgnatvsn install-html-target-libgnatvsn ++maybe-install-html-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-html-target-libgnatvsn: install-html-target-libgnatvsn ++ ++install-html-target-libgnatvsn: \ ++ configure-target-libgnatvsn \ ++ html-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-html in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-installcheck-target-libgnatvsn installcheck-target-libgnatvsn ++maybe-installcheck-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-installcheck-target-libgnatvsn: installcheck-target-libgnatvsn ++ ++# libgnatvsn doesn't support installcheck. ++installcheck-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-mostlyclean-target-libgnatvsn mostlyclean-target-libgnatvsn ++maybe-mostlyclean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-mostlyclean-target-libgnatvsn: mostlyclean-target-libgnatvsn ++ ++mostlyclean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing mostlyclean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-clean-target-libgnatvsn clean-target-libgnatvsn ++maybe-clean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-clean-target-libgnatvsn: clean-target-libgnatvsn ++ ++clean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing clean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-distclean-target-libgnatvsn distclean-target-libgnatvsn ++maybe-distclean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-distclean-target-libgnatvsn: distclean-target-libgnatvsn ++ ++distclean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing distclean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-maintainer-clean-target-libgnatvsn maintainer-clean-target-libgnatvsn ++maybe-maintainer-clean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-maintainer-clean-target-libgnatvsn: maintainer-clean-target-libgnatvsn ++ ++maintainer-clean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++ ++ ++ ++ + .PHONY: configure-target-libgomp maybe-configure-target-libgomp + maybe-configure-target-libgomp: + @if gcc-bootstrap +@@ -45535,6 +46264,7 @@ + configure-target-boehm-gc: stage_last + configure-target-rda: stage_last + configure-target-libada: stage_last ++configure-target-libgnatvsn: stage_last + configure-stage1-target-libgomp: maybe-all-stage1-gcc + configure-stage2-target-libgomp: maybe-all-stage2-gcc + configure-stage3-target-libgomp: maybe-all-stage3-gcc +@@ -45566,6 +46296,7 @@ + configure-target-boehm-gc: maybe-all-gcc + configure-target-rda: maybe-all-gcc + configure-target-libada: maybe-all-gcc ++configure-target-libgnatvsn: maybe-all-gcc + configure-target-libgomp: maybe-all-gcc + configure-target-libitm: maybe-all-gcc + configure-target-libatomic: maybe-all-gcc +@@ -45859,6 +46590,8 @@ + all-stagefeedback-libcpp: maybe-all-stagefeedback-intl + all-fixincludes: maybe-all-libiberty + all-gnattools: maybe-all-libada ++all-gnattools: maybe-all-libgnatvsn ++all-libgnatvsn: maybe-all-libada + all-lto-plugin: maybe-all-libiberty + + all-stage1-lto-plugin: maybe-all-stage1-libiberty +@@ -46394,6 +47127,7 @@ + configure-target-boehm-gc: maybe-all-target-libgcc + configure-target-rda: maybe-all-target-libgcc + configure-target-libada: maybe-all-target-libgcc ++configure-target-libgnatvsn: maybe-all-target-libgcc + configure-target-libgomp: maybe-all-target-libgcc + configure-target-libitm: maybe-all-target-libgcc + configure-target-libatomic: maybe-all-target-libgcc +@@ -46438,6 +47172,8 @@ + + configure-target-libada: maybe-all-target-newlib maybe-all-target-libgloss + ++configure-target-libgnatvsn: maybe-all-target-newlib maybe-all-target-libgloss ++ + configure-target-libgomp: maybe-all-target-newlib maybe-all-target-libgloss + + configure-target-libitm: maybe-all-target-newlib maybe-all-target-libgloss +Index: b/src/configure.ac +=================================================================== +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -133,7 +133,7 @@ + + # these libraries are used by various programs built for the host environment + # +-host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv libada" ++host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv libada libgnatvsn" + + # these tools are built for the host environment + # Note, the powerpc-eabi build depends on sim occurring before gdb in order to +@@ -168,6 +168,7 @@ + ${libgcj} \ + target-libobjc \ + target-libada \ ++ target-libgnatvsn \ + target-libgo" + + # these tools are built using the target libraries, and are intended to +@@ -264,7 +265,7 @@ + + # Some are only suitable for cross toolchains. + # Remove these if host=target. +-cross_only="target-libgloss target-newlib target-opcodes target-libada" ++cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn" + + case $is_cross_compiler in + no) skipdirs="${skipdirs} ${cross_only}" ;; +@@ -420,7 +421,7 @@ + ENABLE_LIBADA=$enableval, + ENABLE_LIBADA=yes) + if test "${ENABLE_LIBADA}" != "yes" ; then +- noconfigdirs="$noconfigdirs gnattools" ++ noconfigdirs="$noconfigdirs libgnatvsn gnattools" + fi + + AC_ARG_ENABLE(libssp, +Index: b/src/gcc/ada/gcc-interface/config-lang.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/config-lang.in ++++ b/src/gcc/ada/gcc-interface/config-lang.in +@@ -34,8 +34,8 @@ + + outputs="ada/gcc-interface/Makefile ada/Makefile" + +-target_libs="target-libada" +-lang_dirs="libada gnattools" ++target_libs="target-libada target-libgnatvsn" ++lang_dirs="libada libgnatvsn gnattools" + + # Ada is not enabled by default for the time being. + build_by_default=no --- gcc-4.8-4.8.2.orig/debian/patches/ada-library-project-files-soname.diff +++ gcc-4.8-4.8.2/debian/patches/ada-library-project-files-soname.diff @@ -0,0 +1,81 @@ +# DP: - in project files, use the exact Library_Version provided, if any, as +# DP: the soname of libraries; do not strip minor version numbers +# DP: (PR ada/40025). + +Index: b/src/gcc/ada/mlib-tgt-specific-linux.adb +=================================================================== +--- a/src/gcc/ada/mlib-tgt-specific-linux.adb ++++ b/src/gcc/ada/mlib-tgt-specific-linux.adb +@@ -50,6 +50,8 @@ + + function Is_Archive_Ext (Ext : String) return Boolean; + ++ function Library_Major_Minor_Id_Supported return Boolean; ++ + --------------------------- + -- Build_Dynamic_Library -- + --------------------------- +@@ -142,7 +144,18 @@ + return Ext = ".a" or else Ext = ".so"; + end Is_Archive_Ext; + ++ -------------------------------------- ++ -- Library_Major_Minor_Id_Supported -- ++ -------------------------------------- ++ ++ function Library_Major_Minor_Id_Supported return Boolean is ++ begin ++ return False; ++ end Library_Major_Minor_Id_Supported; ++ + begin + Build_Dynamic_Library_Ptr := Build_Dynamic_Library'Access; + Is_Archive_Ext_Ptr := Is_Archive_Ext'Access; ++ Library_Major_Minor_Id_Supported_Ptr := ++ Library_Major_Minor_Id_Supported'Access; + end MLib.Tgt.Specific; +Index: b/src/gcc/ada/mlib.adb +=================================================================== +--- a/src/gcc/ada/mlib.adb ++++ b/src/gcc/ada/mlib.adb +@@ -31,6 +31,7 @@ + with Opt; + with Output; use Output; + ++with MLib.Tgt; + with MLib.Utl; use MLib.Utl; + + with Prj.Com; +@@ -391,7 +392,11 @@ + -- Major_Id_Name -- + ------------------- + +- function Major_Id_Name ++ function Major_Id_Name_If_Supported ++ (Lib_Filename : String; ++ Lib_Version : String) ++ return String; ++ function Major_Id_Name_If_Supported + (Lib_Filename : String; + Lib_Version : String) + return String +@@ -445,6 +450,19 @@ + else + return ""; + end if; ++ end Major_Id_Name_If_Supported; ++ ++ function Major_Id_Name ++ (Lib_Filename : String; ++ Lib_Version : String) ++ return String ++ is ++ begin ++ if MLib.Tgt.Library_Major_Minor_Id_Supported then ++ return Major_Id_Name_If_Supported (Lib_Filename, Lib_Version); ++ else ++ return ""; ++ end if; + end Major_Id_Name; + + ------------------------------- --- gcc-4.8-4.8.2.orig/debian/patches/ada-link-lib.diff +++ gcc-4.8-4.8.2/debian/patches/ada-link-lib.diff @@ -0,0 +1,1905 @@ +# DP: - Install the shared Ada libraries as '.so.1', not '.so' to conform +# DP: to the Debian policy. +# DP: - Don't include a runtime link path (-rpath), when linking binaries. +# DP: - Build the shared libraries on hppa-linux. +# DP: - Instead of building libada as a target library only, build it as +# DP: both a host and, if different, target library. +# DP: - Build the GNAT tools in their top-level directory; do not use +# DP: recursive makefiles. +# DP: - Link the GNAT tools dynamically. + +# This patch seems large, but the hunks in Makefile.in are actually +# generated from Makefile.def using autogen. + +Index: b/src/gcc/ada/gcc-interface/config-lang.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/config-lang.in ++++ b/src/gcc/ada/gcc-interface/config-lang.in +@@ -35,7 +35,7 @@ + outputs="ada/gcc-interface/Makefile ada/Makefile" + + target_libs="target-libada" +-lang_dirs="gnattools" ++lang_dirs="libada gnattools" + + # Ada is not enabled by default for the time being. + build_by_default=no +Index: b/src/gcc/ada/link.c +=================================================================== +--- a/src/gcc/ada/link.c ++++ b/src/gcc/ada/link.c +@@ -105,9 +105,9 @@ + + #elif defined (__FreeBSD__) + const char *__gnat_object_file_option = "-Wl,@"; +-const char *__gnat_run_path_option = "-Wl,-rpath,"; +-char __gnat_shared_libgnat_default = STATIC; +-char __gnat_shared_libgcc_default = STATIC; ++const char *__gnat_run_path_option = ""; ++char __gnat_shared_libgnat_default = SHARED; ++char __gnat_shared_libgcc_default = SHARED; + int __gnat_link_max = 8192; + unsigned char __gnat_objlist_file_supported = 1; + const char *__gnat_object_library_extension = ".a"; +@@ -127,9 +127,9 @@ + + #elif defined (linux) || defined(__GLIBC__) + const char *__gnat_object_file_option = "-Wl,@"; +-const char *__gnat_run_path_option = "-Wl,-rpath,"; +-char __gnat_shared_libgnat_default = STATIC; +-char __gnat_shared_libgcc_default = STATIC; ++const char *__gnat_run_path_option = ""; ++char __gnat_shared_libgnat_default = SHARED; ++char __gnat_shared_libgcc_default = SHARED; + int __gnat_link_max = 8192; + unsigned char __gnat_objlist_file_supported = 1; + const char *__gnat_object_library_extension = ".a"; +Index: b/src/gcc/ada/gcc-interface/Makefile.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Makefile.in ++++ b/src/gcc/ada/gcc-interface/Makefile.in +@@ -102,7 +102,7 @@ + MAKEINFO = makeinfo + TEXI2DVI = texi2dvi + TEXI2PDF = texi2pdf +-GNATBIND_FLAGS = -static -x ++GNATBIND_FLAGS = -shared -x + ADA_CFLAGS = + ADAFLAGS = -W -Wall -gnatpg -gnata + FORCE_DEBUG_ADAFLAGS = -g +@@ -250,10 +250,6 @@ + LIBDEPS = $(LIBINTL_DEP) $(LIBICONV_DEP) $(LIBBACKTRACE) $(LIBIBERTY) + # Default is no TGT_LIB; one might be passed down or something + TGT_LIB = +-TOOLS_LIBS = targext.o link.o ../../ggc-none.o ../../libcommon-target.a \ +- ../../libcommon.a ../../../libcpp/libcpp.a $(LIBGNAT) $(LIBINTL) $(LIBICONV) \ +- ../../../libbacktrace/.libs/libbacktrace.a ../../../libiberty/libiberty.a \ +- $(SYSLIBS) $(TGT_LIB) + + # Convert the target variable into a space separated list of architecture, + # manufacturer, and operating system and assign each of those to its own +@@ -324,30 +320,6 @@ + # defined in this file into the environment. + .NOEXPORT: + +-# Lists of files for various purposes. +- +-GNATLINK_OBJS = gnatlink.o \ +- a-except.o ali.o alloc.o butil.o casing.o csets.o debug.o fmap.o fname.o \ +- gnatvsn.o hostparm.o indepsw.o interfac.o i-c.o i-cstrin.o namet.o opt.o \ +- osint.o output.o rident.o s-exctab.o s-secsta.o s-stalib.o s-stoele.o \ +- sdefault.o snames.o stylesw.o switch.o system.o table.o targparm.o tree_io.o \ +- types.o validsw.o widechar.o +- +-GNATMAKE_OBJS = a-except.o ali.o ali-util.o aspects.o s-casuti.o alloc.o \ +- atree.o binderr.o butil.o casing.o csets.o debug.o elists.o einfo.o errout.o \ +- erroutc.o errutil.o err_vars.o fmap.o fname.o fname-uf.o fname-sf.o \ +- gnatmake.o gnatvsn.o hostparm.o interfac.o i-c.o i-cstrin.o krunch.o lib.o \ +- make.o makeusg.o makeutl.o mlib.o mlib-fil.o mlib-prj.o mlib-tgt.o \ +- mlib-tgt-specific.o mlib-utl.o namet.o nlists.o opt.o osint.o osint-m.o \ +- output.o prj.o prj-attr.o prj-attr-pm.o prj-com.o prj-dect.o prj-env.o \ +- prj-conf.o prj-pp.o prj-err.o prj-ext.o prj-nmsc.o prj-pars.o prj-part.o \ +- prj-proc.o prj-strt.o prj-tree.o prj-util.o restrict.o rident.o s-exctab.o \ +- s-secsta.o s-stalib.o s-stoele.o scans.o scng.o sdefault.o sfn_scan.o \ +- s-purexc.o s-htable.o scil_ll.o sem_aux.o sinfo.o sinput.o sinput-c.o \ +- sinput-p.o snames.o stand.o stringt.o styleg.o stylesw.o system.o validsw.o \ +- switch.o switch-m.o table.o targparm.o tempdir.o tree_io.o types.o uintp.o \ +- uname.o urealp.o usage.o widechar.o \ +- $(EXTRA_GNATMAKE_OBJS) + + # Make arch match the current multilib so that the RTS selection code + # picks up the right files. For a given target this must be coherent +@@ -1376,6 +1348,11 @@ + LIBRARY_VERSION := $(LIB_VERSION) + endif + ++ifeq ($(strip $(filter-out hppa% unknown linux gnu,$(targ))),) ++ GNATLIB_SHARED = gnatlib-shared-dual ++ LIBRARY_VERSION := $(LIB_VERSION) ++endif ++ + # HP/PA HP-UX 10 + ifeq ($(strip $(filter-out hppa% hp hpux10%,$(targ))),) + LIBGNAT_TARGET_PAIRS = \ +@@ -2381,151 +2358,6 @@ + $(patsubst %$(objext),%.adb,$(GNATRTL_OBJS)), \ + $(ADA_EXCLUDE_SRCS)) + +-LIBGNAT=../$(RTSDIR)/libgnat.a +- +-TOOLS_FLAGS_TO_PASS= \ +- "CC=$(CC)" \ +- "CFLAGS=$(CFLAGS)" \ +- "LDFLAGS=$(LDFLAGS)" \ +- "ADAFLAGS=$(ADAFLAGS)" \ +- "INCLUDES=$(INCLUDES_FOR_SUBDIR)"\ +- "ADA_INCLUDES=$(ADA_INCLUDES) $(ADA_INCLUDES_FOR_SUBDIR)"\ +- "libsubdir=$(libsubdir)" \ +- "exeext=$(exeext)" \ +- "fsrcdir=$(fsrcdir)" \ +- "srcdir=$(fsrcdir)" \ +- "TOOLS_LIBS=$(TOOLS_LIBS) $(TGT_LIB)" \ +- "GNATMAKE=$(GNATMAKE)" \ +- "GNATLINK=$(GNATLINK)" \ +- "GNATBIND=$(GNATBIND)" +- +-GCC_LINK=$(CC) $(GCC_LINK_FLAGS) $(ADA_INCLUDES) $(LDFLAGS) +- +-# Build directory for the tools. Let's copy the target-dependent +-# sources using the same mechanism as for gnatlib. The other sources are +-# accessed using the vpath directive below +-# Note: dummy target, stamp-tools is mainly handled by gnattools. +- +-../stamp-tools: +- touch ../stamp-tools +- +-# when compiling the tools, the runtime has to be first on the path so that +-# it hides the runtime files lying with the rest of the sources +-ifeq ($(TOOLSCASE),native) +- vpath %.ads ../$(RTSDIR) ../ +- vpath %.adb ../$(RTSDIR) ../ +- vpath %.c ../$(RTSDIR) ../ +- vpath %.h ../$(RTSDIR) ../ +-endif +- +-# in the cross tools case, everything is compiled with the native +-# gnatmake/link. Therefore only -I needs to be modified in ADA_INCLUDES +-ifeq ($(TOOLSCASE),cross) +- vpath %.ads ../ +- vpath %.adb ../ +- vpath %.c ../ +- vpath %.h ../ +-endif +- +-# gnatmake/link tools cannot always be built with gnatmake/link for bootstrap +-# reasons: gnatmake should be built with a recent compiler, a recent compiler +-# may not generate ALI files compatible with an old gnatmake so it is important +-# to be able to build gnatmake without a version of gnatmake around. Once +-# everything has been compiled once, gnatmake can be recompiled with itself +-# (see target gnattools1-re) +-gnattools1: ../stamp-tools ../stamp-gnatlib-$(RTSDIR) +- $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ +- TOOLSCASE=native \ +- ../../gnatmake$(exeext) ../../gnatlink$(exeext) +- +-# gnatmake/link can be built with recent gnatmake/link if they are available. +-# This is especially convenient for building cross tools or for rebuilding +-# the tools when the original bootstrap has already be done. +-gnattools1-re: ../stamp-tools +- $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ +- TOOLSCASE=cross INCLUDES="" gnatmake-re gnatlink-re +- +-# these tools are built with gnatmake & are common to native and cross +-gnattools2: ../stamp-tools +- $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ +- TOOLSCASE=native common-tools $(EXTRA_GNATTOOLS) +- +-# those tools are only built for the cross version +-gnattools4: ../stamp-tools +-ifeq ($(ENABLE_VXADDR2LINE),true) +- $(MAKE) -C tools -f ../Makefile $(TOOLS_FLAGS_TO_PASS) \ +- TOOLSCASE=cross top_buildir=../../.. \ +- ../../vxaddr2line$(exeext) +-endif +- +-common-tools: ../stamp-tools +- $(GNATMAKE) -j0 -c -b $(ADA_INCLUDES) \ +- --GNATBIND="$(GNATBIND)" --GCC="$(CC) $(ALL_ADAFLAGS)" \ +- gnatchop gnatcmd gnatkr gnatls gnatprep gnatxref gnatfind gnatname \ +- gnatclean -bargs $(ADA_INCLUDES) $(GNATBIND_FLAGS) +- $(GNATLINK) -v gnatcmd -o ../../gnat$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatchop -o ../../gnatchop$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatkr -o ../../gnatkr$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatls -o ../../gnatls$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatprep -o ../../gnatprep$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatxref -o ../../gnatxref$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatfind -o ../../gnatfind$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatname -o ../../gnatname$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(GNATLINK) -v gnatclean -o ../../gnatclean$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- +-../../gnatsym$(exeext): ../stamp-tools +- $(GNATMAKE) -c $(ADA_INCLUDES) gnatsym --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatsym +- $(GNATLINK) -v gnatsym -o $@ --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- +-../../gnatdll$(exeext): ../stamp-tools +- $(GNATMAKE) -c $(ADA_INCLUDES) gnatdll --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatdll +- $(GNATLINK) -v gnatdll -o $@ --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- +-../../vxaddr2line$(exeext): ../stamp-tools targext.o +- $(GNATMAKE) -c $(ADA_INCLUDES) vxaddr2line --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) vxaddr2line +- $(GNATLINK) -v vxaddr2line -o $@ --GCC="$(GCC_LINK)" targext.o $(CLIB) +- +-gnatmake-re: ../stamp-tools link.o targext.o +- $(GNATMAKE) -j0 $(ADA_INCLUDES) -u sdefault --GCC="$(CC) $(MOST_ADA_FLAGS)" +- $(GNATMAKE) -j0 -c $(ADA_INCLUDES) gnatmake --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatmake +- $(GNATLINK) -v gnatmake -o ../../gnatmake$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- +-# Note the use of the "mv" command in order to allow gnatlink to be linked with +-# with the former version of gnatlink itself which cannot override itself. +-# gnatlink-re cannot be run at the same time as gnatmake-re, hence the +-# dependency +-gnatlink-re: ../stamp-tools link.o targext.o gnatmake-re +- $(GNATMAKE) -j0 -c $(ADA_INCLUDES) gnatlink --GCC="$(CC) $(ALL_ADAFLAGS)" +- $(GNATBIND) $(ADA_INCLUDES) $(GNATBIND_FLAGS) gnatlink +- $(GNATLINK) -v gnatlink -o ../../gnatlinknew$(exeext) \ +- --GCC="$(GCC_LINK)" $(TOOLS_LIBS) +- $(MV) ../../gnatlinknew$(exeext) ../../gnatlink$(exeext) +- +-# Needs to be built with CC=gcc +-# Since the RTL should be built with the latest compiler, remove the +-# stamp target in the parent directory whenever gnat1 is rebuilt +- +-# Likewise for the tools +-../../gnatmake$(exeext): $(P) b_gnatm.o link.o targext.o $(GNATMAKE_OBJS) +- +$(GCC_LINK) $(ALL_CFLAGS) -o $@ b_gnatm.o $(GNATMAKE_OBJS) $(TOOLS_LIBS) +- +-../../gnatlink$(exeext): $(P) b_gnatl.o link.o targext.o $(GNATLINK_OBJS) +- +$(GCC_LINK) $(ALL_CFLAGS) -o $@ b_gnatl.o $(GNATLINK_OBJS) $(TOOLS_LIBS) +- + ../stamp-gnatlib-$(RTSDIR): + @if [ ! -f stamp-gnatlib-$(RTSDIR) ] ; \ + then \ +@@ -2562,14 +2394,10 @@ + # Also install the .dSYM directories if they exist (these directories + # contain the debug information for the shared libraries on darwin) + for file in gnat gnarl; do \ +- if [ -f $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext) ]; then \ +- $(INSTALL) $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ if [ -f $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 ]; then \ ++ $(INSTALL) $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ + $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ + fi; \ +- if [ -f $(RTSDIR)/lib$${file}$(soext) ]; then \ +- $(LN_S) lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(DESTDIR)$(ADA_RTL_OBJ_DIR)/lib$${file}$(soext); \ +- fi; \ + if [ -d $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).dSYM ]; then \ + $(CP) -r $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).dSYM \ + $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ +@@ -2582,19 +2410,7 @@ + cd $(DESTDIR)$(ADA_INCLUDE_DIR); $(CHMOD) a-wx *.adb + cd $(DESTDIR)$(ADA_INCLUDE_DIR); $(CHMOD) a-wx *.ads + +-../stamp-gnatlib2-$(RTSDIR): +- $(RM) $(RTSDIR)/s-*.ali +- $(RM) $(RTSDIR)/s-*$(objext) +- $(RM) $(RTSDIR)/a-*.ali +- $(RM) $(RTSDIR)/a-*$(objext) +- $(RM) $(RTSDIR)/*.ali +- $(RM) $(RTSDIR)/*$(objext) +- $(RM) $(RTSDIR)/*$(arext) +- $(RM) $(RTSDIR)/*$(soext) +- touch ../stamp-gnatlib2-$(RTSDIR) +- $(RM) ../stamp-gnatlib-$(RTSDIR) +- +-../stamp-gnatlib1-$(RTSDIR): Makefile ../stamp-gnatlib2-$(RTSDIR) ++../stamp-gnatlib1-$(RTSDIR): Makefile + $(RMDIR) $(RTSDIR) + $(MKDIR) $(RTSDIR) + $(CHMOD) u+w $(RTSDIR) +@@ -2659,7 +2475,7 @@ + # Example: cd $(RTSDIR); ar rc libfoo.a $(LONG_LIST_OF_OBJS) + # is guaranteed to overflow the buffer. + +-gnatlib: ../stamp-gnatlib1-$(RTSDIR) ../stamp-gnatlib2-$(RTSDIR) $(RTSDIR)/s-oscons.ads ++gnatlib: ../stamp-gnatlib1-$(RTSDIR) $(RTSDIR)/s-oscons.ads + # C files + $(MAKE) -C $(RTSDIR) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ +@@ -2696,32 +2512,47 @@ + + # Warning: this target assumes that LIBRARY_VERSION has been set correctly. + gnatlib-shared-default: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C) $(PICFLAG_FOR_TARGET)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/libgna*$(soext) ++ $(MAKE) -C $(RTSDIR) \ ++ CC="`echo \"$(GCC_FOR_TARGET)\" \ ++ | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ ++ INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ ++ CFLAGS="$(GNATLIBCFLAGS_FOR_C) $(PICFLAG_FOR_TARGET)" \ ++ FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ ++ srcdir=$(fsrcdir) \ ++ -f ../Makefile $(LIBGNAT_OBJS) ++ $(MAKE) -C $(RTSDIR) \ ++ CC="`echo \"$(GCC_FOR_TARGET)\" \ ++ | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ ++ ADA_INCLUDES="" \ ++ CFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \ ++ ADAFLAGS="$(GNATLIBFLAGS) $(PICFLAG_FOR_TARGET)" \ ++ FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ ++ srcdir=$(fsrcdir) \ ++ -f ../Makefile \ ++ $(GNATRTL_OBJS) ++ $(RM) $(RTSDIR)/libgna*$(soext) $(RTSDIR)/libgna*$(soext).1 + cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \ + $(PICFLAG_FOR_TARGET) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ + $(MISCLIB) -lm + cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \ + $(PICFLAG_FOR_TARGET) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ + $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ + $(THREADSLIB) +- cd $(RTSDIR); $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnat$(soext) +- cd $(RTSDIR); $(LN_S) libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnarl$(soext) ++ cd $(RTSDIR); for lib in gnat gnarl; do \ ++ l=lib$${lib}$(hyphen)$(LIBRARY_VERSION)$(soext); \ ++ $(LN_S) $$l.1 $$l; \ ++ done ++# Delete the object files, lest they be linked statically into the tools ++# executables. Only the .ali, .a and .so files must remain. ++ rm -f $(RTSDIR)/*.o ++ $(CHMOD) a-wx $(RTSDIR)/*.ali + + gnatlib-shared-dual: + $(MAKE) $(FLAGS_TO_PASS) \ +@@ -2730,17 +2561,15 @@ + GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-default +- $(MV) $(RTSDIR)/libgna*$(soext) . +- $(RM) ../stamp-gnatlib2-$(RTSDIR) ++ gnatlib ++ $(RM) $(RTSDIR)/*.o $(RTSDIR)/*.ali + $(MAKE) $(FLAGS_TO_PASS) \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(MV) libgna*$(soext) $(RTSDIR) ++ gnatlib-shared-default + + gnatlib-shared-dual-win32: + $(MAKE) $(FLAGS_TO_PASS) \ +@@ -2750,17 +2579,15 @@ + PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-win32 +- $(MV) $(RTSDIR)/libgna*$(soext) . +- $(RM) ../stamp-gnatlib2-$(RTSDIR) ++ gnatlib ++ $(RM) $(RTSDIR)/*.o $(RTSDIR)/*.ali + $(MAKE) $(FLAGS_TO_PASS) \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(MV) libgna*$(soext) $(RTSDIR) ++ gnatlib-shared-win32 + + # ??? we need to add the option to support auto-import of arrays/records to + # the GNATLIBFLAGS when this will be supported by GNAT. At this point we will +@@ -2898,28 +2725,6 @@ + THREAD_KIND="$(THREAD_KIND)" \ + PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" gnatlib + +-# Compiling object files from source files. +- +-# Note that dependencies on obstack.h are not written +-# because that file is not part of GCC. +-# Dependencies on gvarargs.h are not written +-# because all that file does, when not compiling with GCC, +-# is include the system varargs.h. +- +-b_gnatl.adb : $(GNATLINK_OBJS) +- $(GNATBIND) $(ADA_INCLUDES) -o b_gnatl.adb gnatlink.ali +- +-b_gnatl.o : b_gnatl.adb +- $(CC) -c $(ALL_ADAFLAGS) $(ADA_INCLUDES) -gnatws -gnatyN \ +- $< $(OUTPUT_OPTION) +- +-b_gnatm.adb : $(GNATMAKE_OBJS) +- $(GNATBIND) $(ADA_INCLUDES) -o b_gnatm.adb gnatmake.ali +- +-b_gnatm.o : b_gnatm.adb +- $(CC) -c $(ALL_ADAFLAGS) $(ADA_INCLUDES) -gnatws -gnatyN \ +- $< $(OUTPUT_OPTION) +- + ADA_INCLUDE_DIR = $(libsubdir)/adainclude + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib + +Index: b/src/gnattools/Makefile.in +=================================================================== +--- a/src/gnattools/Makefile.in ++++ b/src/gnattools/Makefile.in +@@ -18,6 +18,9 @@ + # Default target; must be first. + all: gnattools + ++.NOTPARALLEL: # don't run multiple gnatmakes in parallel in the same directory ++.SUFFIXES: ++ + # Standard autoconf-set variables. + SHELL = @SHELL@ + srcdir = @srcdir@ +@@ -35,103 +38,19 @@ + LN_S=@LN_S@ + target_noncanonical=@target_noncanonical@ + +-# Variables for the user (or the top level) to override. +-exeext = @EXEEXT@ +-objext=.o +-TRACE=no +-ADA_FOR_BUILD= +-ADA_FOR_TARGET= +-LDFLAGS= +-PWD_COMMAND = $${PWDCMD-pwd} +- +-# The tedious process of getting CFLAGS right. +-CFLAGS=-g +-GCC_WARN_CFLAGS = -W -Wall +-WARN_CFLAGS = @warn_cflags@ +- +-ADA_CFLAGS=@ADA_CFLAGS@ +- +-# Variables for gnattools. +-ADAFLAGS= -gnatpg -gnata +- +-# For finding the GCC build dir, which is used far too much +-GCC_DIR=../gcc +- +-# Absolute srcdir for gcc (why do we want absolute? I dunno) +-fsrcdir := $(shell cd $(srcdir)/../gcc/; ${PWD_COMMAND}) +- +-# Useful "subroutines" for the excess includes +-INCLUDES_FOR_SUBDIR = -I. -I.. -I../.. -I$(fsrcdir)/ada -I$(fsrcdir)/config \ +- -I$(fsrcdir)/../include -I$(fsrcdir) +-ADA_INCLUDES_FOR_SUBDIR = -I. -I$(fsrcdir)/ada +- +-# Variables for gnattools, native +-TOOLS_FLAGS_TO_PASS_NATIVE= \ +- "CC=../../xgcc -B../../" \ +- "CFLAGS=$(CFLAGS) $(WARN_CFLAGS)" \ +- "LDFLAGS=$(LDFLAGS)" \ +- "ADAFLAGS=$(ADAFLAGS)" \ +- "ADA_CFLAGS=$(ADA_CFLAGS)" \ +- "INCLUDES=$(INCLUDES_FOR_SUBDIR)" \ +- "ADA_INCLUDES=-I- -I../rts $(ADA_INCLUDES_FOR_SUBDIR)"\ +- "exeext=$(exeext)" \ +- "fsrcdir=$(fsrcdir)" \ +- "srcdir=$(fsrcdir)" \ +- "GNATMAKE=../../gnatmake" \ +- "GNATLINK=../../gnatlink" \ +- "GNATBIND=../../gnatbind" \ +- "TOOLSCASE=native" +- +-# Variables for regnattools +-TOOLS_FLAGS_TO_PASS_RE= \ +- "CC=../../xgcc -B../../" \ +- "CFLAGS=$(CFLAGS)" \ +- "LDFLAGS=$(LDFLAGS)" \ +- "ADAFLAGS=$(ADAFLAGS)" \ +- "ADA_CFLAGS=$(ADA_CFLAGS)" \ +- "INCLUDES=$(INCLUDES_FOR_SUBDIR)" \ +- "ADA_INCLUDES=-I../rts $(ADA_INCLUDES_FOR_SUBDIR)"\ +- "exeext=$(exeext)" \ +- "fsrcdir=$(fsrcdir)" \ +- "srcdir=$(fsrcdir)" \ +- "GNATMAKE=../../gnatmake" \ +- "GNATLINK=../../gnatlink" \ +- "GNATBIND=../../gnatbind" \ +- "TOOLSCASE=cross" +- +-# Variables for gnattools, cross +-ifeq ($(build), $(host)) +- GNATMAKE_FOR_HOST=gnatmake +- GNATLINK_FOR_HOST=gnatlink +- GNATBIND_FOR_HOST=gnatbind +- GNATLS_FOR_HOST=gnatls +-else +- GNATMAKE_FOR_HOST=$(host_alias)-gnatmake +- GNATLINK_FOR_HOST=$(host_alias)-gnatlink +- GNATBIND_FOR_HOST=$(host_alias)-gnatbind +- GNATLS_FOR_HOST=$(host_alias)-gnatls +-endif +- +-# Put the host RTS dir first in the PATH to hide the default runtime +-# files that are among the sources +-RTS_DIR:=$(strip $(subst \,/,$(shell $(GNATLS_FOR_HOST) -v | grep adalib ))) +- +-TOOLS_FLAGS_TO_PASS_CROSS= \ +- "CC=$(CC)" \ +- "CFLAGS=$(CFLAGS) $(WARN_CFLAGS)" \ +- "LDFLAGS=$(LDFLAGS)" \ +- "ADAFLAGS=$(ADAFLAGS)" \ +- "ADA_CFLAGS=$(ADA_CFLAGS)" \ +- "INCLUDES=$(INCLUDES_FOR_SUBDIR)" \ +- "ADA_INCLUDES=-I$(RTS_DIR)../adainclude -I$(RTS_DIR) $(ADA_INCLUDES_FOR_SUBDIR)" \ +- "exeext=$(exeext)" \ +- "fsrcdir=$(fsrcdir)" \ +- "srcdir=$(fsrcdir)" \ +- "GNATMAKE=$(GNATMAKE_FOR_HOST)" \ +- "GNATLINK=$(GNATLINK_FOR_HOST)" \ +- "GNATBIND=$(GNATBIND_FOR_HOST)" \ +- "TOOLSCASE=cross" \ +- "LIBGNAT=" ++CFLAGS=-O2 -Wall ++INCLUDES = -I@srcdir@/../gcc/ada -I@srcdir@/../gcc ++ADA_CFLAGS=-O2 -gnatn ++ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I@srcdir@/../gcc/ada ++LIB_VERSION=$(strip $(shell grep ' Library_Version :' \ ++ @srcdir@/../gcc/ada/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) ++SHARED_ADA_LIBS := -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++STATIC_ADA_LIBS := ../gcc/ada/rts/libgnat.a ++STATIC_GCC_LIBS := ../gcc/libcommon-target.a ../gcc/libcommon.a ../libcpp/libcpp.a \ ++../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a ++ ++# We will use the just-built compiler to compile and link everything. ++GCC=../gcc/xgcc -B../gcc/ + + # File lists + # ---------- +@@ -140,116 +59,228 @@ + EXTRA_GNATTOOLS = @EXTRA_GNATTOOLS@ + TOOLS_TARGET_PAIRS = @TOOLS_TARGET_PAIRS@ + ++# Stage 1 builds xgcc and gnatbind; we can use them to build ++# gnatmake-static and gnatlink-static, then use gnatmake-static and ++# gnatlink-static to build the other tools. The reason we first build ++# statically-linked versions of gnatmake and gnatlink is so we can run ++# them with confidence on all build platforms, without LD_LIBRARY_PATH ++# or some such variable. ++ ++# The tools we will build using gnatmake-static and gnatlink-static. ++TOOLS := gnat gnatbind gnatchop gnatclean gnatfind gnatkr gnatls gnatlink ++TOOLS += gnatmake gnatname gnatprep gnatxref ++ ++# Since we don't have gnatmake, we must specify the full list of ++# object files necessary to build gnatmake and gnatlink. ++# TODO: remove from these lists the objects that are part of ++# libgnatvsn and libgnatprj. ++GNATLINK_OBJS = \ ++ali.o \ ++alloc.o \ ++butil.o \ ++casing.o \ ++csets.o \ ++debug.o \ ++fmap.o \ ++fname.o \ ++gnatlink.o \ ++gnatvsn.o \ ++hostparm.o \ ++indepsw.o \ ++namet.o \ ++opt.o \ ++osint.o \ ++output.o \ ++rident.o \ ++sdefault.o \ ++snames.o \ ++stylesw.o \ ++switch.o \ ++table.o \ ++targparm.o \ ++tree_io.o \ ++types.o \ ++validsw.o \ ++widechar.o ++ ++GNATMAKE_OBJS = \ ++ali-util.o \ ++ali.o \ ++alloc.o \ ++aspects.o \ ++atree.o \ ++binderr.o \ ++butil.o \ ++casing.o \ ++csets.o \ ++debug.o \ ++einfo.o\ ++elists.o \ ++err_vars.o \ ++errout.o \ ++erroutc.o \ ++errutil.o \ ++fmap.o \ ++fname-sf.o \ ++fname-uf.o \ ++fname.o \ ++gnatmake.o \ ++gnatvsn.o \ ++hostparm.o \ ++krunch.o \ ++lib.o \ ++make.o \ ++makeusg.o \ ++makeutl.o \ ++mlib-fil.o \ ++mlib-prj.o \ ++mlib-tgt.o \ ++mlib-tgt-specific.o \ ++mlib-utl.o \ ++mlib.o \ ++namet.o \ ++nlists.o \ ++opt.o \ ++osint-m.o \ ++osint.o \ ++output.o \ ++prj-attr-pm.o \ ++prj-attr.o \ ++prj-com.o \ ++prj-conf.o \ ++prj-dect.o \ ++prj-env.o \ ++prj-err.o \ ++prj-ext.o \ ++prj-nmsc.o \ ++prj-pars.o \ ++prj-part.o \ ++prj-pp.o \ ++prj-proc.o \ ++prj-strt.o \ ++prj-tree.o \ ++prj-util.o \ ++prj.o \ ++restrict.o \ ++rident.o \ ++scans.o \ ++scng.o \ ++sdefault.o \ ++sem_aux.o \ ++sfn_scan.o \ ++sinfo.o \ ++sinput-c.o \ ++sinput-p.o \ ++sinput.o \ ++snames.o \ ++stand.o \ ++stringt.o \ ++styleg.o \ ++stylesw.o \ ++switch-m.o \ ++switch.o \ ++table.o \ ++targparm.o \ ++tempdir.o \ ++tree_io.o \ ++types.o \ ++uintp.o \ ++uname.o \ ++urealp.o \ ++usage.o \ ++validsw.o \ ++widechar.o \ ++$(EXTRA_GNATMAKE_OBJS) ++ + # Makefile targets + # ---------------- + + .PHONY: gnattools gnattools-native gnattools-cross regnattools + gnattools: @default_gnattools_target@ + +-# Sanity check +-$(GCC_DIR)/stamp-gnatlib-rts: +- @if [ ! -f $(GCC_DIR)/stamp-gnatlib-rts ] ; \ +- then \ +- echo "Cannot build gnattools while gnatlib is out of date or unbuilt" ; \ +- false; \ +- else \ +- true; \ +- fi +- +- + # Build directory for the tools. Let's copy the target-dependent + # sources using the same mechanism as for gnatlib. The other sources are +-# accessed using the vpath directive in ada/Makefile.in ++# accessed using the vpath directive. ++ ++stamp-gnattools-sources: ++ $(LN_S) ../gcc/ada/sdefault.adb ../gcc/ada/snames.ads ../gcc/ada/snames.adb . ++ $(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ ++ rm -f $(word 1,$(subst <, ,$(PAIR)));\ ++ $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ ++ $(word 1,$(subst <, ,$(PAIR)));) ++ touch $@ ++ ++gnattools-native: ../gcc/ada/rts/libgnat-$(LIB_VERSION).so ++gnattools-native: stamp-gnattools-sources ++gnattools-native: $(TOOLS) ++ ++$(TOOLS) gnatcmd: | gnatmake-static gnatlink-static ++ ++vpath %.c @srcdir@/../gcc/ada:@srcdir@/../gcc ++vpath %.h @srcdir@/../gcc/ada ++vpath %.adb .:@srcdir@/../gcc/ada ++vpath %.ads @srcdir@/../gcc/ada ++ ++# gnatlink ++ ++gnatlink-static: $(GNATLINK_OBJS) b_gnatl.o link.o ++ $(GCC) -o $@ $^ ../gcc/ada/rts/libgnat.a $(STATIC_GCC_LIBS) ++ ++gnatlink: $(GNATLINK_OBJS) b_gnatl.o link.o ++ $(GCC) -o $@ $^ $(SHARED_ADA_LIBS) $(STATIC_GCC_LIBS) ++ ++b_gnatl.adb: $(GNATLINK_OBJS) ++ ../gcc/gnatbind -o $@ $(ADA_INCLUDES) gnatlink.ali ++ ++# gnatmake ++ ++gnatmake-static: $(GNATMAKE_OBJS) b_gnatm.o link.o ++ $(GCC) -o $@ $(ADA_CFLAGS) $^ $(STATIC_ADA_LIBS) $(STATIC_GCC_LIBS) ++ ++gnatmake: $(GNATMAKE_OBJS) b_gnatm.o link.o ++ $(GCC) -o $@ $(ADA_CFLAGS) $^ $(SHARED_ADA_LIBS) $(STATIC_GCC_LIBS) ++ ++b_gnatm.adb: $(GNATMAKE_OBJS) ++ ../gcc/gnatbind -o $@ $(ADA_INCLUDES) gnatmake.ali ++ ++# Other tools ++gnatkr: ++ ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ ++ --GCC="$(GCC)" \ ++ --GNATBIND=../gcc/gnatbind ++ ./gnatlink-static -o $@ $@.ali $(ADA_INCLUDES) $(SHARED_ADA_LIBS) \ ++ --GCC="$(GCC) $(ADA_INCLUDES)" $(STATIC_GCC_LIBS) ++ ++gnat: gnatcmd ++ cp -lp $< $@ ++ ++gnatbind gnatchop gnatclean gnatcmd gnatfind gnatls gnatname gnatprep gnatxref: \ ++link.o ++ ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ ++ --GCC="$(GCC)" \ ++ --GNATBIND=../gcc/gnatbind ++ ./gnatlink-static -o $@ $@.ali $^ \ ++ $(ADA_INCLUDES) $(SHARED_ADA_LIBS) $(STATIC_GCC_LIBS) \ ++ --GCC="$(GCC) $(ADA_INCLUDES)" ++ ++# Force compiling sdefault.adb, not .ads, to produce sdefault.o ++sdefault.o: sdefault.adb ++ ++sdefault.adb: stamp-gnattools-sources ++ ++# Because these sources don't exist when the Makefile is evaluated: ++snames.o: snames.adb snames.ads ++ ++snames.adb snames.ads: stamp-gnattools-sources ++ ++%.o: %.adb ++ $(GCC) -c -o $@ $< $(ADA_CFLAGS) $(ADA_INCLUDES) ++ ++%.o: %.ads ++ $(GCC) -c -o $@ $< $(ADA_CFLAGS) $(ADA_INCLUDES) + +-$(GCC_DIR)/stamp-tools: +- -rm -rf $(GCC_DIR)/ada/tools +- -mkdir -p $(GCC_DIR)/ada/tools +- -(cd $(GCC_DIR)/ada/tools; $(LN_S) ../sdefault.adb ../snames.ads ../snames.adb .) +- -$(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ +- rm -f $(GCC_DIR)/ada/tools/$(word 1,$(subst <, ,$(PAIR)));\ +- $(LN_S) $(fsrcdir)/ada/$(word 2,$(subst <, ,$(PAIR))) \ +- $(GCC_DIR)/ada/tools/$(word 1,$(subst <, ,$(PAIR)));) +- touch $(GCC_DIR)/stamp-tools +- +-# gnatmake/link tools cannot always be built with gnatmake/link for bootstrap +-# reasons: gnatmake should be built with a recent compiler, a recent compiler +-# may not generate ALI files compatible with an old gnatmake so it is important +-# to be able to build gnatmake without a version of gnatmake around. Once +-# everything has been compiled once, gnatmake can be recompiled with itself +-# (see target regnattools) +-gnattools-native: $(GCC_DIR)/stamp-tools $(GCC_DIR)/stamp-gnatlib-rts +- # gnattools1 +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_NATIVE) \ +- ../../gnatmake$(exeext) ../../gnatlink$(exeext) +- # gnattools2 +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools +- +-# gnatmake/link can be built with recent gnatmake/link if they are available. +-# This is especially convenient for building cross tools or for rebuilding +-# the tools when the original bootstrap has already be done. +-regnattools: $(GCC_DIR)/stamp-gnatlib-rts +- # gnattools1-re +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_RE) INCLUDES="" \ +- gnatmake-re gnatlink-re +- # gnattools2 +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools +- +-gnattools-cross: $(GCC_DIR)/stamp-tools +- # gnattools1-re +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_CROSS) INCLUDES="" \ +- gnatmake-re gnatlink-re +- # gnattools2 +- $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ +- $(TOOLS_FLAGS_TO_PASS_CROSS) common-tools +- # Rename cross tools to where the GCC makefile wants them when +- # installing. FIXME: installation should be done elsewhere. +- if [ -f $(GCC_DIR)/gnatbind$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatbind$(exeext) $(GCC_DIR)/gnatbind-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatchop$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatchop$(exeext) $(GCC_DIR)/gnatchop-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnat$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnat$(exeext) $(GCC_DIR)/gnat-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatkr$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatkr$(exeext) $(GCC_DIR)/gnatkr-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatlink$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatlink$(exeext) $(GCC_DIR)/gnatlink-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatls$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatls$(exeext) $(GCC_DIR)/gnatls-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatmake$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatmake$(exeext) $(GCC_DIR)/gnatmake-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatmem$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatmem$(exeext) $(GCC_DIR)/gnatmem-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatname$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatname$(exeext) $(GCC_DIR)/gnatname-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatprep$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatprep$(exeext) $(GCC_DIR)/gnatprep-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatxref$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatxref$(exeext) $(GCC_DIR)/gnatxref-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatfind$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatfind$(exeext) $(GCC_DIR)/gnatfind-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatclean$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatclean$(exeext) $(GCC_DIR)/gnatclean-cross$(exeext); \ +- fi +- if [ -f $(GCC_DIR)/gnatsym$(exeext) ] ; then \ +- mv $(GCC_DIR)/gnatsym$(exeext) $(GCC_DIR)/gnatsym-cross$(exeext); \ +- fi ++%.o: %.c ++ $(GCC) -c -o $@ $< $(CFLAGS) $(INCLUDES) + + # Other + # ----- +@@ -279,6 +310,7 @@ + + # Installation rules. + install: ++ $(INSTALL) -s gnatmake gnatlink $(TOOLS) $(DESTDIR)$(bindir) + + install-strip: install + +@@ -292,8 +324,10 @@ + + # Cleaning rules. + mostlyclean: ++ $(RM) gnatmake gnatlink $(TOOLS) *.o *.ali + + clean: ++ $(RM) *.ads *.adb stamp-gnattools-sources + + distclean: + $(RM) Makefile config.status config.log +Index: b/src/libada/Makefile.in +=================================================================== +--- a/src/libada/Makefile.in ++++ b/src/libada/Makefile.in +@@ -64,7 +64,7 @@ + -fexceptions -DIN_RTS @have_getipinfo@ + + host_subdir = @host_subdir@ +-GCC_DIR=$(MULTIBUILDTOP)../../$(host_subdir)/gcc ++GCC_DIR=$(MULTIBUILDTOP)../$(host_subdir)/gcc + + target_noncanonical:=@target_noncanonical@ + version := $(shell cat $(srcdir)/../gcc/BASE-VER) +Index: b/src/Makefile.def +=================================================================== +--- a/src/Makefile.def ++++ b/src/Makefile.def +@@ -110,7 +110,20 @@ + missing=distclean; + missing=maintainer-clean; }; + host_modules= { module= utils; no_check=true; }; +-host_modules= { module= gnattools; }; ++host_modules= { module= libada; no_install=true; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; ++host_modules= { module= gnattools; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + host_modules= { module= lto-plugin; bootstrap=true; + extra_configure_flags=--enable-shared; }; + +@@ -144,7 +157,13 @@ + target_modules = { module= zlib; }; + target_modules = { module= boehm-gc; }; + target_modules = { module= rda; }; +-target_modules = { module= libada; }; ++target_modules = { module= libada; no_install=true; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + target_modules = { module= libgomp; bootstrap= true; lib_path=.libs; }; + target_modules = { module= libitm; lib_path=.libs; }; + target_modules = { module= libatomic; lib_path=.libs; }; +@@ -331,7 +350,7 @@ + + dependencies = { module=all-fixincludes; on=all-libiberty; }; + +-dependencies = { module=all-gnattools; on=all-target-libada; }; ++dependencies = { module=all-gnattools; on=all-libada; }; + + dependencies = { module=all-lto-plugin; on=all-libiberty; }; + +Index: b/src/Makefile.in +=================================================================== +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -918,6 +918,7 @@ + maybe-configure-tk \ + maybe-configure-libtermcap \ + maybe-configure-utils \ ++ maybe-configure-libada \ + maybe-configure-gnattools \ + maybe-configure-lto-plugin + .PHONY: configure-target +@@ -1062,6 +1063,7 @@ + all-host: maybe-all-tk + all-host: maybe-all-libtermcap + all-host: maybe-all-utils ++all-host: maybe-all-libada + all-host: maybe-all-gnattools + @if lto-plugin-no-bootstrap + all-host: maybe-all-lto-plugin +@@ -1159,6 +1161,7 @@ + info-host: maybe-info-tk + info-host: maybe-info-libtermcap + info-host: maybe-info-utils ++info-host: maybe-info-libada + info-host: maybe-info-gnattools + info-host: maybe-info-lto-plugin + +@@ -1241,6 +1244,7 @@ + dvi-host: maybe-dvi-tk + dvi-host: maybe-dvi-libtermcap + dvi-host: maybe-dvi-utils ++dvi-host: maybe-dvi-libada + dvi-host: maybe-dvi-gnattools + dvi-host: maybe-dvi-lto-plugin + +@@ -1323,6 +1327,7 @@ + pdf-host: maybe-pdf-tk + pdf-host: maybe-pdf-libtermcap + pdf-host: maybe-pdf-utils ++pdf-host: maybe-pdf-libada + pdf-host: maybe-pdf-gnattools + pdf-host: maybe-pdf-lto-plugin + +@@ -1405,6 +1410,7 @@ + html-host: maybe-html-tk + html-host: maybe-html-libtermcap + html-host: maybe-html-utils ++html-host: maybe-html-libada + html-host: maybe-html-gnattools + html-host: maybe-html-lto-plugin + +@@ -1487,6 +1493,7 @@ + TAGS-host: maybe-TAGS-tk + TAGS-host: maybe-TAGS-libtermcap + TAGS-host: maybe-TAGS-utils ++TAGS-host: maybe-TAGS-libada + TAGS-host: maybe-TAGS-gnattools + TAGS-host: maybe-TAGS-lto-plugin + +@@ -1569,6 +1576,7 @@ + install-info-host: maybe-install-info-tk + install-info-host: maybe-install-info-libtermcap + install-info-host: maybe-install-info-utils ++install-info-host: maybe-install-info-libada + install-info-host: maybe-install-info-gnattools + install-info-host: maybe-install-info-lto-plugin + +@@ -1651,6 +1659,7 @@ + install-pdf-host: maybe-install-pdf-tk + install-pdf-host: maybe-install-pdf-libtermcap + install-pdf-host: maybe-install-pdf-utils ++install-pdf-host: maybe-install-pdf-libada + install-pdf-host: maybe-install-pdf-gnattools + install-pdf-host: maybe-install-pdf-lto-plugin + +@@ -1733,6 +1742,7 @@ + install-html-host: maybe-install-html-tk + install-html-host: maybe-install-html-libtermcap + install-html-host: maybe-install-html-utils ++install-html-host: maybe-install-html-libada + install-html-host: maybe-install-html-gnattools + install-html-host: maybe-install-html-lto-plugin + +@@ -1815,6 +1825,7 @@ + installcheck-host: maybe-installcheck-tk + installcheck-host: maybe-installcheck-libtermcap + installcheck-host: maybe-installcheck-utils ++installcheck-host: maybe-installcheck-libada + installcheck-host: maybe-installcheck-gnattools + installcheck-host: maybe-installcheck-lto-plugin + +@@ -1897,6 +1908,7 @@ + mostlyclean-host: maybe-mostlyclean-tk + mostlyclean-host: maybe-mostlyclean-libtermcap + mostlyclean-host: maybe-mostlyclean-utils ++mostlyclean-host: maybe-mostlyclean-libada + mostlyclean-host: maybe-mostlyclean-gnattools + mostlyclean-host: maybe-mostlyclean-lto-plugin + +@@ -1979,6 +1991,7 @@ + clean-host: maybe-clean-tk + clean-host: maybe-clean-libtermcap + clean-host: maybe-clean-utils ++clean-host: maybe-clean-libada + clean-host: maybe-clean-gnattools + clean-host: maybe-clean-lto-plugin + +@@ -2061,6 +2074,7 @@ + distclean-host: maybe-distclean-tk + distclean-host: maybe-distclean-libtermcap + distclean-host: maybe-distclean-utils ++distclean-host: maybe-distclean-libada + distclean-host: maybe-distclean-gnattools + distclean-host: maybe-distclean-lto-plugin + +@@ -2143,6 +2157,7 @@ + maintainer-clean-host: maybe-maintainer-clean-tk + maintainer-clean-host: maybe-maintainer-clean-libtermcap + maintainer-clean-host: maybe-maintainer-clean-utils ++maintainer-clean-host: maybe-maintainer-clean-libada + maintainer-clean-host: maybe-maintainer-clean-gnattools + maintainer-clean-host: maybe-maintainer-clean-lto-plugin + +@@ -2280,6 +2295,7 @@ + maybe-check-tk \ + maybe-check-libtermcap \ + maybe-check-utils \ ++ maybe-check-libada \ + maybe-check-gnattools \ + maybe-check-lto-plugin + +@@ -2388,6 +2404,7 @@ + maybe-install-tk \ + maybe-install-libtermcap \ + maybe-install-utils \ ++ maybe-install-libada \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2435,6 +2452,7 @@ + maybe-install-tk \ + maybe-install-libtermcap \ + maybe-install-utils \ ++ maybe-install-libada \ + maybe-install-gnattools \ + maybe-install-lto-plugin + +@@ -2537,6 +2555,7 @@ + maybe-install-strip-tk \ + maybe-install-strip-libtermcap \ + maybe-install-strip-utils \ ++ maybe-install-strip-libada \ + maybe-install-strip-gnattools \ + maybe-install-strip-lto-plugin + +@@ -29422,6 +29441,331 @@ + + + ++.PHONY: configure-libada maybe-configure-libada ++maybe-configure-libada: ++@if gcc-bootstrap ++configure-libada: stage_current ++@endif gcc-bootstrap ++@if libada ++maybe-configure-libada: configure-libada ++configure-libada: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/libada/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libada ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/libada; \ ++ cd "$(HOST_SUBDIR)/libada" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/libada/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libada"; \ ++ libsrcdir="$$s/libada"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif libada ++ ++ ++ ++ ++ ++.PHONY: all-libada maybe-all-libada ++maybe-all-libada: ++@if gcc-bootstrap ++all-libada: stage_current ++@endif gcc-bootstrap ++@if libada ++TARGET-libada=all ++maybe-all-libada: all-libada ++all-libada: configure-libada ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS) $(STAGE1_FLAGS_TO_PASS) \ ++ $(TARGET-libada)) ++@endif libada ++ ++ ++ ++ ++.PHONY: check-libada maybe-check-libada ++maybe-check-libada: ++@if libada ++maybe-check-libada: check-libada ++ ++check-libada: ++ ++@endif libada ++ ++.PHONY: install-libada maybe-install-libada ++maybe-install-libada: ++@if libada ++maybe-install-libada: install-libada ++ ++install-libada: ++ ++@endif libada ++ ++.PHONY: install-strip-libada maybe-install-strip-libada ++maybe-install-strip-libada: ++@if libada ++maybe-install-strip-libada: install-strip-libada ++ ++install-strip-libada: ++ ++@endif libada ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-libada info-libada ++maybe-info-libada: ++@if libada ++maybe-info-libada: info-libada ++ ++# libada doesn't support info. ++info-libada: ++ ++@endif libada ++ ++.PHONY: maybe-dvi-libada dvi-libada ++maybe-dvi-libada: ++@if libada ++maybe-dvi-libada: dvi-libada ++ ++# libada doesn't support dvi. ++dvi-libada: ++ ++@endif libada ++ ++.PHONY: maybe-pdf-libada pdf-libada ++maybe-pdf-libada: ++@if libada ++maybe-pdf-libada: pdf-libada ++ ++pdf-libada: \ ++ configure-libada ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-html-libada html-libada ++maybe-html-libada: ++@if libada ++maybe-html-libada: html-libada ++ ++# libada doesn't support html. ++html-libada: ++ ++@endif libada ++ ++.PHONY: maybe-TAGS-libada TAGS-libada ++maybe-TAGS-libada: ++@if libada ++maybe-TAGS-libada: TAGS-libada ++ ++# libada doesn't support TAGS. ++TAGS-libada: ++ ++@endif libada ++ ++.PHONY: maybe-install-info-libada install-info-libada ++maybe-install-info-libada: ++@if libada ++maybe-install-info-libada: install-info-libada ++ ++# libada doesn't support install-info. ++install-info-libada: ++ ++@endif libada ++ ++.PHONY: maybe-install-pdf-libada install-pdf-libada ++maybe-install-pdf-libada: ++@if libada ++maybe-install-pdf-libada: install-pdf-libada ++ ++install-pdf-libada: \ ++ configure-libada \ ++ pdf-libada ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-install-html-libada install-html-libada ++maybe-install-html-libada: ++@if libada ++maybe-install-html-libada: install-html-libada ++ ++install-html-libada: \ ++ configure-libada \ ++ html-libada ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-installcheck-libada installcheck-libada ++maybe-installcheck-libada: ++@if libada ++maybe-installcheck-libada: installcheck-libada ++ ++# libada doesn't support installcheck. ++installcheck-libada: ++ ++@endif libada ++ ++.PHONY: maybe-mostlyclean-libada mostlyclean-libada ++maybe-mostlyclean-libada: ++@if libada ++maybe-mostlyclean-libada: mostlyclean-libada ++ ++mostlyclean-libada: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-clean-libada clean-libada ++maybe-clean-libada: ++@if libada ++maybe-clean-libada: clean-libada ++ ++clean-libada: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-distclean-libada distclean-libada ++maybe-distclean-libada: ++@if libada ++maybe-distclean-libada: distclean-libada ++ ++distclean-libada: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif libada ++ ++.PHONY: maybe-maintainer-clean-libada maintainer-clean-libada ++maybe-maintainer-clean-libada: ++@if libada ++maybe-maintainer-clean-libada: maintainer-clean-libada ++ ++maintainer-clean-libada: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libada/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in libada" ; \ ++ (cd $(HOST_SUBDIR)/libada && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif libada ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -29482,12 +29826,6 @@ + maybe-check-gnattools: check-gnattools + + check-gnattools: +- @: $(MAKE); $(unstage) +- @r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(FLAGS_TO_PASS) check) + + @endif gnattools + +@@ -29528,24 +29866,8 @@ + @if gnattools + maybe-info-gnattools: info-gnattools + +-info-gnattools: \ +- configure-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing info in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- info) \ +- || exit 1 ++# gnattools doesn't support info. ++info-gnattools: + + @endif gnattools + +@@ -29554,24 +29876,8 @@ + @if gnattools + maybe-dvi-gnattools: dvi-gnattools + +-dvi-gnattools: \ +- configure-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing dvi in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- dvi) \ +- || exit 1 ++# gnattools doesn't support dvi. ++dvi-gnattools: + + @endif gnattools + +@@ -29606,24 +29912,8 @@ + @if gnattools + maybe-html-gnattools: html-gnattools + +-html-gnattools: \ +- configure-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing html in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- html) \ +- || exit 1 ++# gnattools doesn't support html. ++html-gnattools: + + @endif gnattools + +@@ -29632,24 +29922,8 @@ + @if gnattools + maybe-TAGS-gnattools: TAGS-gnattools + +-TAGS-gnattools: \ +- configure-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing TAGS in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- TAGS) \ +- || exit 1 ++# gnattools doesn't support TAGS. ++TAGS-gnattools: + + @endif gnattools + +@@ -29658,25 +29932,8 @@ + @if gnattools + maybe-install-info-gnattools: install-info-gnattools + +-install-info-gnattools: \ +- configure-gnattools \ +- info-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing install-info in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- install-info) \ +- || exit 1 ++# gnattools doesn't support install-info. ++install-info-gnattools: + + @endif gnattools + +@@ -29739,24 +29996,8 @@ + @if gnattools + maybe-installcheck-gnattools: installcheck-gnattools + +-installcheck-gnattools: \ +- configure-gnattools +- @: $(MAKE); $(unstage) +- @[ -f ./gnattools/Makefile ] || exit 0; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(HOST_EXPORTS) \ +- for flag in $(EXTRA_HOST_FLAGS) ; do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- echo "Doing installcheck in gnattools" ; \ +- (cd $(HOST_SUBDIR)/gnattools && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- installcheck) \ +- || exit 1 ++# gnattools doesn't support installcheck. ++installcheck-gnattools: + + @endif gnattools + +@@ -40970,13 +41211,8 @@ + @if target-libada + maybe-check-target-libada: check-target-libada + ++# Dummy target for uncheckable module. + check-target-libada: +- @: $(MAKE); $(unstage) +- @r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) check) + + @endif target-libada + +@@ -40985,13 +41221,8 @@ + @if target-libada + maybe-install-target-libada: install-target-libada + +-install-target-libada: installdirs +- @: $(MAKE); $(unstage) +- @r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++# Dummy target for uninstallable. ++install-target-libada: + + @endif target-libada + +@@ -41000,13 +41231,8 @@ + @if target-libada + maybe-install-strip-target-libada: install-strip-target-libada + +-install-strip-target-libada: installdirs +- @: $(MAKE); $(unstage) +- @r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) install-strip) ++# Dummy target for uninstallable. ++install-strip-target-libada: + + @endif target-libada + +@@ -41017,24 +41243,8 @@ + @if target-libada + maybe-info-target-libada: info-target-libada + +-info-target-libada: \ +- configure-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing info in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- info) \ +- || exit 1 ++# libada doesn't support info. ++info-target-libada: + + @endif target-libada + +@@ -41043,24 +41253,8 @@ + @if target-libada + maybe-dvi-target-libada: dvi-target-libada + +-dvi-target-libada: \ +- configure-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing dvi in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- dvi) \ +- || exit 1 ++# libada doesn't support dvi. ++dvi-target-libada: + + @endif target-libada + +@@ -41095,24 +41289,8 @@ + @if target-libada + maybe-html-target-libada: html-target-libada + +-html-target-libada: \ +- configure-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing html in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- html) \ +- || exit 1 ++# libada doesn't support html. ++html-target-libada: + + @endif target-libada + +@@ -41121,24 +41299,8 @@ + @if target-libada + maybe-TAGS-target-libada: TAGS-target-libada + +-TAGS-target-libada: \ +- configure-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing TAGS in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- TAGS) \ +- || exit 1 ++# libada doesn't support TAGS. ++TAGS-target-libada: + + @endif target-libada + +@@ -41147,25 +41309,8 @@ + @if target-libada + maybe-install-info-target-libada: install-info-target-libada + +-install-info-target-libada: \ +- configure-target-libada \ +- info-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing install-info in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- install-info) \ +- || exit 1 ++# libada doesn't support install-info. ++install-info-target-libada: + + @endif target-libada + +@@ -41228,24 +41373,8 @@ + @if target-libada + maybe-installcheck-target-libada: installcheck-target-libada + +-installcheck-target-libada: \ +- configure-target-libada +- @: $(MAKE); $(unstage) +- @[ -f $(TARGET_SUBDIR)/libada/Makefile ] || exit 0 ; \ +- r=`${PWD_COMMAND}`; export r; \ +- s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ +- $(NORMAL_TARGET_EXPORTS) \ +- echo "Doing installcheck in $(TARGET_SUBDIR)/libada" ; \ +- for flag in $(EXTRA_TARGET_FLAGS); do \ +- eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ +- done; \ +- (cd $(TARGET_SUBDIR)/libada && \ +- $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ +- "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ +- "RANLIB=$${RANLIB}" \ +- "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ +- installcheck) \ +- || exit 1 ++# libada doesn't support installcheck. ++installcheck-target-libada: + + @endif target-libada + +@@ -45729,7 +45858,7 @@ + all-stageprofile-libcpp: maybe-all-stageprofile-intl + all-stagefeedback-libcpp: maybe-all-stagefeedback-intl + all-fixincludes: maybe-all-libiberty +-all-gnattools: maybe-all-target-libada ++all-gnattools: maybe-all-libada + all-lto-plugin: maybe-all-libiberty + + all-stage1-lto-plugin: maybe-all-stage1-libiberty +Index: b/src/configure.ac +=================================================================== +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -133,7 +133,7 @@ + + # these libraries are used by various programs built for the host environment + # +-host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv" ++host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl cloog libelf libiconv libada" + + # these tools are built for the host environment + # Note, the powerpc-eabi build depends on sim occurring before gdb in order to +@@ -264,7 +264,7 @@ + + # Some are only suitable for cross toolchains. + # Remove these if host=target. +-cross_only="target-libgloss target-newlib target-opcodes" ++cross_only="target-libgloss target-newlib target-opcodes target-libada" + + case $is_cross_compiler in + no) skipdirs="${skipdirs} ${cross_only}" ;; --- gcc-4.8-4.8.2.orig/debian/patches/ada-link-shlib.diff +++ gcc-4.8-4.8.2/debian/patches/ada-link-shlib.diff @@ -0,0 +1,85 @@ +# DP: In gnatlink, pass the options and libraries after objects to the +# DP: linker to avoid link failures with --as-needed. Closes: #680292. + +--- a/src/gcc/ada/mlib-tgt-specific-linux.adb ++++ b/src/gcc/ada/mlib-tgt-specific-linux.adb +@@ -81,19 +81,54 @@ + Version_Arg : String_Access; + Symbolic_Link_Needed : Boolean := False; + ++ N_Options : Argument_List := Options; ++ Options_Last : Natural := N_Options'Last; ++ -- After moving -lxxx to Options_2, N_Options up to index Options_Last ++ -- will contain the Options to pass to MLib.Utl.Gcc. ++ ++ Real_Options_2 : Argument_List (1 .. Options'Length); ++ Real_Options_2_Last : Natural := 0; ++ -- Real_Options_2 up to index Real_Options_2_Last will contain the ++ -- Options_2 to pass to MLib.Utl.Gcc. ++ + begin + if Opt.Verbose_Mode then + Write_Str ("building relocatable shared library "); + Write_Line (Lib_Path); + end if; + ++ -- Move all -lxxx to Options_2 ++ ++ declare ++ Index : Natural := N_Options'First; ++ Arg : String_Access; ++ ++ begin ++ while Index <= Options_Last loop ++ Arg := N_Options (Index); ++ ++ if Arg'Length > 2 ++ and then Arg (Arg'First .. Arg'First + 1) = "-l" ++ then ++ Real_Options_2_Last := Real_Options_2_Last + 1; ++ Real_Options_2 (Real_Options_2_Last) := Arg; ++ N_Options (Index .. Options_Last - 1) := ++ N_Options (Index + 1 .. Options_Last); ++ Options_Last := Options_Last - 1; ++ ++ else ++ Index := Index + 1; ++ end if; ++ end loop; ++ end; ++ + if Lib_Version = "" then + Utl.Gcc + (Output_File => Lib_Path, + Objects => Ofiles, +- Options => Options, ++ Options => N_Options (N_Options'First .. Options_Last), + Driver_Name => Driver_Name, +- Options_2 => No_Argument_List); ++ Options_2 => Real_Options_2 (1 .. Real_Options_2_Last)); + + else + declare +@@ -111,18 +146,18 @@ + Utl.Gcc + (Output_File => Lib_Version, + Objects => Ofiles, +- Options => Options & Version_Arg, ++ Options => N_Options (N_Options'First .. Options_Last) & Version_Arg, + Driver_Name => Driver_Name, +- Options_2 => No_Argument_List); ++ Options_2 => Real_Options_2 (1 .. Real_Options_2_Last)); + Symbolic_Link_Needed := Lib_Version /= Lib_Path; + + else + Utl.Gcc + (Output_File => Lib_Dir & Directory_Separator & Lib_Version, + Objects => Ofiles, +- Options => Options & Version_Arg, ++ Options => N_Options (N_Options'First .. Options_Last) & Version_Arg, + Driver_Name => Driver_Name, +- Options_2 => No_Argument_List); ++ Options_2 => Real_Options_2 (1 .. Real_Options_2_Last)); + Symbolic_Link_Needed := + Lib_Dir & Directory_Separator & Lib_Version /= Lib_Path; + end if; --- gcc-4.8-4.8.2.orig/debian/patches/ada-mips.diff +++ gcc-4.8-4.8.2/debian/patches/ada-mips.diff @@ -0,0 +1,33 @@ +# DP: Improve support for mips. + +Index: b/src/gcc/ada/gcc-interface/Makefile.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Makefile.in ++++ b/src/gcc/ada/gcc-interface/Makefile.in +@@ -1723,10 +1723,15 @@ + s-taprop.adb S, ++ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); ++ end To_Timespec; ++ ++end System.OS_Interface; --- gcc-4.8-4.8.2.orig/debian/patches/ada-s-osinte-gnu.ads.diff +++ gcc-4.8-4.8.2/debian/patches/ada-s-osinte-gnu.ads.diff @@ -0,0 +1,753 @@ +--- /dev/null 2012-01-30 20:41:15.189616186 +0100 ++++ b/src/gcc/ada/s-osinte-gnu.ads 2012-04-11 19:34:45.000000000 +0200 +@@ -0,0 +1,750 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS -- ++-- -- ++-- S Y S T E M . O S _ I N T E R F A C E -- ++-- -- ++-- S p e c -- ++-- -- ++-- Copyright (C) 1991-1994, Florida State University -- ++-- Copyright (C) 1995-2011, Free Software Foundation, Inc. -- ++-- -- ++-- GNARL is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 2, or (at your option) any later ver- -- ++-- sion. GNARL is distributed in the hope that it will be useful, but WITH- -- ++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- ++-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- ++-- for more details. You should have received a copy of the GNU General -- ++-- Public License distributed with GNARL; see file COPYING. If not, write -- ++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- ++-- Boston, MA 02110-1301, USA. -- ++-- -- ++-- As a special exception, if other files instantiate generics from this -- ++-- unit, or you link this unit with other files to produce an executable, -- ++-- this unit does not by itself cause the resulting executable to be -- ++-- covered by the GNU General Public License. This exception does not -- ++-- however invalidate any other reasons why the executable file might be -- ++-- covered by the GNU Public License. -- ++-- -- ++-- GNARL was developed by the GNARL team at Florida State University. -- ++-- Extensive contributions were provided by Ada Core Technologies, Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++-- This is the GNU/Hurd version of this package ++ ++-- This package encapsulates all direct interfaces to OS services ++-- that are needed by children of System. ++ ++-- PLEASE DO NOT add any with-clauses to this package or remove the pragma ++-- Preelaborate. This package is designed to be a bottom-level (leaf) package ++ ++with Interfaces.C; ++with Unchecked_Conversion; ++ ++package System.OS_Interface is ++ pragma Preelaborate; ++ ++ pragma Linker_Options ("-lpthread"); ++ pragma Linker_Options ("-lrt"); ++ ++ subtype int is Interfaces.C.int; ++ subtype char is Interfaces.C.char; ++ subtype short is Interfaces.C.short; ++ subtype long is Interfaces.C.long; ++ subtype unsigned is Interfaces.C.unsigned; ++ subtype unsigned_short is Interfaces.C.unsigned_short; ++ subtype unsigned_long is Interfaces.C.unsigned_long; ++ subtype unsigned_char is Interfaces.C.unsigned_char; ++ subtype plain_char is Interfaces.C.plain_char; ++ subtype size_t is Interfaces.C.size_t; ++ ++ ----------- ++ -- Errno -- ++ ----------- ++ -- From /usr/include/i386-gnu/bits/errno.h ++ ++ function errno return int; ++ pragma Import (C, errno, "__get_errno"); ++ ++ EAGAIN : constant := 1073741859; ++ EINTR : constant := 1073741828; ++ EINVAL : constant := 1073741846; ++ ENOMEM : constant := 1073741836; ++ EPERM : constant := 1073741825; ++ ETIMEDOUT : constant := 1073741884; ++ ++ ------------- ++ -- Signals -- ++ ------------- ++ -- From /usr/include/i386-gnu/bits/signum.h ++ ++ Max_Interrupt : constant := 32; ++ type Signal is new int range 0 .. Max_Interrupt; ++ for Signal'Size use int'Size; ++ ++ SIGHUP : constant := 1; -- hangup ++ SIGINT : constant := 2; -- interrupt (rubout) ++ SIGQUIT : constant := 3; -- quit (ASCD FS) ++ SIGILL : constant := 4; -- illegal instruction (not reset) ++ SIGTRAP : constant := 5; -- trace trap (not reset) ++ SIGIOT : constant := 6; -- IOT instruction ++ SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future ++ SIGEMT : constant := 7; -- EMT instruction ++ SIGFPE : constant := 8; -- floating point exception ++ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) ++ SIGBUS : constant := 10; -- bus error ++ SIGSEGV : constant := 11; -- segmentation violation ++ SIGSYS : constant := 12; -- bad argument to system call ++ SIGPIPE : constant := 13; -- write on a pipe with no one to read it ++ SIGALRM : constant := 14; -- alarm clock ++ SIGTERM : constant := 15; -- software termination signal from kill ++ SIGURG : constant := 16; -- urgent condition on IO channel ++ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) ++ SIGTSTP : constant := 18; -- user stop requested from tty ++ SIGCONT : constant := 19; -- stopped process has been continued ++ SIGCLD : constant := 20; -- alias for SIGCHLD ++ SIGCHLD : constant := 20; -- child status change ++ SIGTTIN : constant := 21; -- background tty read attempted ++ SIGTTOU : constant := 22; -- background tty write attempted ++ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) ++ SIGPOLL : constant := 23; -- I/O possible (same as SIGIO?) ++ SIGXCPU : constant := 24; -- CPU time limit exceeded ++ SIGXFSZ : constant := 25; -- filesize limit exceeded ++ SIGVTALRM : constant := 26; -- virtual timer expired ++ SIGPROF : constant := 27; -- profiling timer expired ++ SIGWINCH : constant := 28; -- window size change ++ SIGINFO : constant := 29; -- information request (NetBSD/FreeBSD) ++ SIGUSR1 : constant := 30; -- user defined signal 1 ++ SIGUSR2 : constant := 31; -- user defined signal 2 ++ SIGLOST : constant := 32; -- Resource lost (Sun); server died (GNU) ++-- SIGLTHRRES : constant := 32; -- GNU/LinuxThreads restart signal ++-- SIGLTHRCAN : constant := 33; -- GNU/LinuxThreads cancel signal ++-- SIGLTHRDBG : constant := 34; -- GNU/LinuxThreads debugger signal ++ ++ SIGADAABORT : constant := SIGABRT; ++ -- Change this if you want to use another signal for task abort. ++ -- SIGTERM might be a good one. ++ ++ type Signal_Set is array (Natural range <>) of Signal; ++ ++ Unmasked : constant Signal_Set := ( ++ SIGTRAP, ++ -- To enable debugging on multithreaded applications, mark SIGTRAP to ++ -- be kept unmasked. ++ ++ SIGBUS, ++ ++ SIGTTIN, SIGTTOU, SIGTSTP, ++ -- Keep these three signals unmasked so that background processes ++ -- and IO behaves as normal "C" applications ++ ++ SIGPROF, ++ -- To avoid confusing the profiler ++ ++ SIGKILL, SIGSTOP); ++ -- These two signals actually cannot be masked; ++ -- POSIX simply won't allow it. ++ ++ Reserved : constant Signal_Set := ++ -- I am not sure why the following signal is reserved. ++ -- I guess they are not supported by this version of GNU/Hurd. ++ (0 .. 0 => SIGVTALRM); ++ ++ type sigset_t is private; ++ ++ -- From /usr/include/signal.h /usr/include/i386-gnu/bits/sigset.h ++ function sigaddset (set : access sigset_t; sig : Signal) return int; ++ pragma Import (C, sigaddset, "sigaddset"); ++ ++ function sigdelset (set : access sigset_t; sig : Signal) return int; ++ pragma Import (C, sigdelset, "sigdelset"); ++ ++ function sigfillset (set : access sigset_t) return int; ++ pragma Import (C, sigfillset, "sigfillset"); ++ ++ function sigismember (set : access sigset_t; sig : Signal) return int; ++ pragma Import (C, sigismember, "sigismember"); ++ ++ function sigemptyset (set : access sigset_t) return int; ++ pragma Import (C, sigemptyset, "sigemptyset"); ++ ++ -- sigcontext is architecture dependent, so define it private ++ type struct_sigcontext is private; ++ ++ -- From /usr/include/i386-gnu/bits/sigaction.h: Note: arg. order differs ++ type struct_sigaction is record ++ sa_handler : System.Address; ++ sa_mask : sigset_t; ++ sa_flags : int; ++ end record; ++ pragma Convention (C, struct_sigaction); ++ ++ type struct_sigaction_ptr is access all struct_sigaction; ++ ++ -- From /usr/include/i386-gnu/bits/sigaction.h ++ SIG_BLOCK : constant := 1; ++ SIG_UNBLOCK : constant := 2; ++ SIG_SETMASK : constant := 3; ++ ++ -- From /usr/include/i386-gnu/bits/signum.h ++ SIG_ERR : constant := 1; ++ SIG_DFL : constant := 0; ++ SIG_IGN : constant := 1; ++ SIG_HOLD : constant := 2; ++ ++ -- From /usr/include/i386-gnu/bits/sigaction.h ++ SA_SIGINFO : constant := 16#0040#; ++ SA_ONSTACK : constant := 16#0001#; ++ ++ function sigaction ++ (sig : Signal; ++ act : struct_sigaction_ptr; ++ oact : struct_sigaction_ptr) return int; ++ pragma Import (C, sigaction, "sigaction"); ++ ++ ---------- ++ -- Time -- ++ ---------- ++ ++ Time_Slice_Supported : constant Boolean := True; ++ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) ++ ++ type timespec is private; ++ ++ function nanosleep (rqtp, rmtp : access timespec) return int; ++ pragma Import (C, nanosleep, "nanosleep"); ++ ++ type clockid_t is private; ++ ++ CLOCK_REALTIME : constant clockid_t; ++ ++ -- From: /usr/include/time.h ++ function clock_gettime ++ (clock_id : clockid_t; ++ tp : access timespec) ++ return int; ++ pragma Import (C, clock_gettime, "clock_gettime"); ++ ++ function To_Duration (TS : timespec) return Duration; ++ pragma Inline (To_Duration); ++ ++ function To_Timespec (D : Duration) return timespec; ++ pragma Inline (To_Timespec); ++ ++ -- From: /usr/include/unistd.h ++ function sysconf (name : int) return long; ++ pragma Import (C, sysconf); ++ ++ -- From /usr/include/i386-gnu/bits/confname.h ++ SC_CLK_TCK : constant := 2; ++ SC_NPROCESSORS_ONLN : constant := 84; ++ ++ ------------------------- ++ -- Priority Scheduling -- ++ ------------------------- ++ -- From /usr/include/i386-gnu/bits/sched.h ++ ++ SCHED_OTHER : constant := 0; ++ SCHED_FIFO : constant := 1; ++ SCHED_RR : constant := 2; ++ ++ function To_Target_Priority ++ (Prio : System.Any_Priority) return Interfaces.C.int; ++ -- Maps System.Any_Priority to a POSIX priority. ++ ++ ------------- ++ -- Process -- ++ ------------- ++ ++ type pid_t is private; ++ ++ -- From: /usr/include/signal.h ++ function kill (pid : pid_t; sig : Signal) return int; ++ pragma Import (C, kill, "kill"); ++ ++ -- From: /usr/include/unistd.h ++ function getpid return pid_t; ++ pragma Import (C, getpid, "getpid"); ++ ++ --------- ++ -- LWP -- ++ --------- ++ ++ -- From: /usr/include/pthread/pthread.h ++ function lwp_self return System.Address; ++ -- lwp_self does not exist on this thread library, revert to pthread_self ++ -- which is the closest approximation (with getpid). This function is ++ -- needed to share 7staprop.adb across POSIX-like targets. ++ pragma Import (C, lwp_self, "pthread_self"); ++ ++ ------------- ++ -- Threads -- ++ ------------- ++ ++ type Thread_Body is access ++ function (arg : System.Address) return System.Address; ++ pragma Convention (C, Thread_Body); ++ ++ function Thread_Body_Access is new ++ Unchecked_Conversion (System.Address, Thread_Body); ++ ++ -- From: /usr/include/bits/pthread.h:typedef int __pthread_t; ++ -- /usr/include/pthread/pthreadtypes.h:typedef __pthread_t pthread_t; ++ type pthread_t is new unsigned_long; ++ subtype Thread_Id is pthread_t; ++ ++ function To_pthread_t is new Unchecked_Conversion ++ (unsigned_long, pthread_t); ++ ++ type pthread_mutex_t is limited private; ++ type pthread_cond_t is limited private; ++ type pthread_attr_t is limited private; ++ type pthread_mutexattr_t is limited private; ++ type pthread_condattr_t is limited private; ++ type pthread_key_t is private; ++ ++ -- From /usr/include/pthread/pthreadtypes.h ++ PTHREAD_CREATE_DETACHED : constant := 1; ++ PTHREAD_CREATE_JOINABLE : constant := 0; ++ ++ PTHREAD_SCOPE_PROCESS : constant := 1; ++ PTHREAD_SCOPE_SYSTEM : constant := 0; ++ ++ ----------- ++ -- Stack -- ++ ----------- ++ ++ -- From: /usr/include/i386-gnu/bits/sigstack.h ++ type stack_t is record ++ ss_sp : System.Address; ++ ss_size : size_t; ++ ss_flags : int; ++ end record; ++ pragma Convention (C, stack_t); ++ ++ function sigaltstack ++ (ss : not null access stack_t; ++ oss : access stack_t) return int; ++ pragma Import (C, sigaltstack, "sigaltstack"); ++ ++ Alternate_Stack : aliased System.Address; ++ -- This is a dummy definition, never used (Alternate_Stack_Size is null) ++ ++ Alternate_Stack_Size : constant := 0; ++ -- No alternate signal stack is used on this platform ++ ++ Stack_Base_Available : constant Boolean := False; ++ -- Indicates whether the stack base is available on this target ++ ++ function Get_Stack_Base (thread : pthread_t) return Address; ++ pragma Inline (Get_Stack_Base); ++ -- returns the stack base of the specified thread. Only call this function ++ -- when Stack_Base_Available is True. ++ ++ -- From: /usr/include/i386-gnu/bits/shm.h __getpagesize or getpagesize?? ++ function Get_Page_Size return size_t; ++ function Get_Page_Size return Address; ++ pragma Import (C, Get_Page_Size, "__getpagesize"); ++ -- Returns the size of a page ++ ++ -- From /usr/include/i386-gnu/bits/mman.h ++ PROT_NONE : constant := 0; ++ PROT_READ : constant := 4; ++ PROT_WRITE : constant := 2; ++ PROT_EXEC : constant := 1; ++ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; ++ PROT_ON : constant := PROT_NONE; ++ PROT_OFF : constant := PROT_ALL; ++ ++ -- From /usr/include/i386-gnu/bits/mman.h ++ function mprotect (addr : Address; len : size_t; prot : int) return int; ++ pragma Import (C, mprotect); ++ ++ --------------------------------------- ++ -- Nonstandard Thread Initialization -- ++ --------------------------------------- ++ ++ procedure pthread_init; ++ pragma Inline (pthread_init); ++ -- This is a dummy procedure to share some GNULLI files ++ ++ ------------------------- ++ -- POSIX.1c Section 3 -- ++ ------------------------- ++ ++ -- From: /usr/include/signal.h: ++ -- sigwait (__const sigset_t *__restrict __set, int *__restrict __sig) ++ function sigwait (set : access sigset_t; sig : access Signal) return int; ++ pragma Import (C, sigwait, "sigwait"); ++ ++ -- From: /usr/include/pthread/pthread.h: ++ -- extern int pthread_kill (pthread_t thread, int signo); ++ function pthread_kill (thread : pthread_t; sig : Signal) return int; ++ pragma Import (C, pthread_kill, "pthread_kill"); ++ ++ -- From: /usr/include/i386-gnu/bits/sigthread.h ++ -- extern int pthread_sigmask (int __how, __const __sigset_t *__newmask, ++ -- __sigset_t *__oldmask) __THROW; ++ function pthread_sigmask ++ (how : int; ++ set : access sigset_t; ++ oset : access sigset_t) return int; ++ pragma Import (C, pthread_sigmask, "pthread_sigmask"); ++ ++ -------------------------- ++ -- POSIX.1c Section 11 -- ++ -------------------------- ++ ++ -- From: /usr/include/pthread/pthread.h and ++ -- /usr/include/pthread/pthreadtypes.h ++ function pthread_mutexattr_init ++ (attr : access pthread_mutexattr_t) return int; ++ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); ++ ++ function pthread_mutexattr_destroy ++ (attr : access pthread_mutexattr_t) return int; ++ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); ++ ++ function pthread_mutex_init ++ (mutex : access pthread_mutex_t; ++ attr : access pthread_mutexattr_t) return int; ++ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); ++ ++ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; ++ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); ++ ++ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; ++ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); ++ ++ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; ++ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); ++ ++ function pthread_condattr_init ++ (attr : access pthread_condattr_t) return int; ++ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); ++ ++ function pthread_condattr_destroy ++ (attr : access pthread_condattr_t) return int; ++ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); ++ ++ function pthread_cond_init ++ (cond : access pthread_cond_t; ++ attr : access pthread_condattr_t) return int; ++ pragma Import (C, pthread_cond_init, "pthread_cond_init"); ++ ++ function pthread_cond_destroy (cond : access pthread_cond_t) return int; ++ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); ++ ++ function pthread_cond_signal (cond : access pthread_cond_t) return int; ++ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); ++ ++ function pthread_cond_wait ++ (cond : access pthread_cond_t; ++ mutex : access pthread_mutex_t) return int; ++ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); ++ ++ function pthread_cond_timedwait ++ (cond : access pthread_cond_t; ++ mutex : access pthread_mutex_t; ++ abstime : access timespec) return int; ++ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); ++ ++ Relative_Timed_Wait : constant Boolean := False; ++ -- pthread_cond_timedwait requires an absolute delay time ++ ++ -------------------------- ++ -- POSIX.1c Section 13 -- ++ -------------------------- ++ -- From /usr/include/pthread/pthreadtypes.h ++ ++ PTHREAD_PRIO_NONE : constant := 0; ++ PTHREAD_PRIO_PROTECT : constant := 2; ++ PTHREAD_PRIO_INHERIT : constant := 1; ++ ++ -- From: /usr/include/pthread/pthread.h ++ function pthread_mutexattr_setprotocol ++ (attr : access pthread_mutexattr_t; ++ protocol : int) return int; ++ pragma Import (C, pthread_mutexattr_setprotocol, ++ "pthread_mutexattr_setprotocol"); ++ ++ function pthread_mutexattr_getprotocol ++ (attr : access pthread_mutexattr_t; ++ protocol : access int) return int; ++ pragma Import (C, pthread_mutexattr_getprotocol, ++ "pthread_mutexattr_getprotocol"); ++ ++ function pthread_mutexattr_setprioceiling ++ (attr : access pthread_mutexattr_t; ++ prioceiling : int) return int; ++ pragma Import (C, pthread_mutexattr_setprioceiling, ++ "pthread_mutexattr_setprioceiling"); ++ ++ function pthread_mutexattr_getprioceiling ++ (attr : access pthread_mutexattr_t; ++ prioceiling : access int) return int; ++ pragma Import (C, pthread_mutexattr_getprioceiling, ++ "pthread_mutexattr_getprioceiling"); ++ ++ type struct_sched_param is record ++ sched_priority : int; -- scheduling priority ++ end record; ++ pragma Convention (C, struct_sched_param); ++ ++ function pthread_setschedparam ++ (thread : pthread_t; ++ policy : int; ++ param : access struct_sched_param) return int; ++ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); ++ ++ function pthread_attr_setscope ++ (attr : access pthread_attr_t; ++ contentionscope : int) return int; ++ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); ++ ++ function pthread_attr_getscope ++ (attr : access pthread_attr_t; ++ contentionscope : access int) return int; ++ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); ++ ++ function pthread_attr_setinheritsched ++ (attr : access pthread_attr_t; ++ inheritsched : int) return int; ++ pragma Import (C, pthread_attr_setinheritsched, ++ "pthread_attr_setinheritsched"); ++ ++ function pthread_attr_getinheritsched ++ (attr : access pthread_attr_t; ++ inheritsched : access int) return int; ++ pragma Import (C, pthread_attr_getinheritsched, ++ "pthread_attr_getinheritsched"); ++ ++ function pthread_attr_setschedpolicy ++ (attr : access pthread_attr_t; ++ policy : int) return int; ++ pragma Import (C, pthread_attr_setschedpolicy, "pthread_setschedpolicy"); ++ ++ function sched_yield return int; ++ pragma Import (C, sched_yield, "sched_yield"); ++ ++ --------------------------- ++ -- P1003.1c - Section 16 -- ++ --------------------------- ++ ++ function pthread_attr_init ++ (attributes : access pthread_attr_t) return int; ++ pragma Import (C, pthread_attr_init, "pthread_attr_init"); ++ ++ function pthread_attr_destroy ++ (attributes : access pthread_attr_t) return int; ++ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); ++ ++ function pthread_attr_setdetachstate ++ (attr : access pthread_attr_t; ++ detachstate : int) return int; ++ pragma Import ++ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); ++ ++ function pthread_attr_setstacksize ++ (attr : access pthread_attr_t; ++ stacksize : size_t) return int; ++ pragma Import (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); ++ ++ -- From: /usr/include/pthread/pthread.h ++ function pthread_create ++ (thread : access pthread_t; ++ attributes : access pthread_attr_t; ++ start_routine : Thread_Body; ++ arg : System.Address) return int; ++ pragma Import (C, pthread_create, "pthread_create"); ++ ++ procedure pthread_exit (status : System.Address); ++ pragma Import (C, pthread_exit, "pthread_exit"); ++ ++ function pthread_self return pthread_t; ++ pragma Import (C, pthread_self, "pthread_self"); ++ ++ -------------------------- ++ -- POSIX.1c Section 17 -- ++ -------------------------- ++ ++ function pthread_setspecific ++ (key : pthread_key_t; ++ value : System.Address) return int; ++ pragma Import (C, pthread_setspecific, "pthread_setspecific"); ++ ++ function pthread_getspecific (key : pthread_key_t) return System.Address; ++ pragma Import (C, pthread_getspecific, "pthread_getspecific"); ++ ++ type destructor_pointer is access procedure (arg : System.Address); ++ pragma Convention (C, destructor_pointer); ++ ++ function pthread_key_create ++ (key : access pthread_key_t; ++ destructor : destructor_pointer) return int; ++ pragma Import (C, pthread_key_create, "pthread_key_create"); ++ ++ -- From /usr/include/i386-gnu/bits/sched.h ++ -- 1_024 == 1024?? ++ CPU_SETSIZE : constant := 1_024; ++ ++ type bit_field is array (1 .. CPU_SETSIZE) of Boolean; ++ for bit_field'Size use CPU_SETSIZE; ++ pragma Pack (bit_field); ++ pragma Convention (C, bit_field); ++ ++ type cpu_set_t is record ++ bits : bit_field; ++ end record; ++ pragma Convention (C, cpu_set_t); ++ ++ -- function pthread_setaffinity_np ++ -- (thread : pthread_t; ++ -- cpusetsize : size_t; ++ -- cpuset : access cpu_set_t) return int; ++ -- pragma Import (C, pthread_setaffinity_np, ++ -- "__gnat_pthread_setaffinity_np"); ++ ++private ++ ++ type sigset_t is array (1 .. 4) of unsigned; ++ ++ -- FIXME: ++ -- In GNU/Hurd the component sa_handler turns out to ++ -- be one a union type, and the selector is a macro: ++ -- #define sa_handler __sigaction_handler.sa_handler ++ -- #define sa_sigaction __sigaction_handler.sa_sigaction ++ ++ -- In FreeBSD the component sa_handler turns out to ++ -- be one a union type, and the selector is a macro: ++ -- #define sa_handler __sigaction_u._handler ++ -- #define sa_sigaction __sigaction_u._sigaction ++ ++ -- Should we add a signal_context type here ? ++ -- How could it be done independent of the CPU architecture ? ++ -- sigcontext type is opaque, so it is architecturally neutral. ++ -- It is always passed as an access type, so define it as an empty record ++ -- since the contents are not used anywhere. ++ type struct_sigcontext is null record; ++ pragma Convention (C, struct_sigcontext); ++ ++ type pid_t is new int; ++ ++ type time_t is new long; ++ ++ type timespec is record ++ tv_sec : time_t; ++ tv_nsec : long; ++ end record; ++ pragma Convention (C, timespec); ++ ++ type clockid_t is new int; ++ CLOCK_REALTIME : constant clockid_t := 0; ++ ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- typedef struct __pthread_attr pthread_attr_t; ++ -- /usr/include/bits/thread-attr.h: struct __pthread_attr... ++ -- /usr/include/pthread/pthreadtypes.h: enum __pthread_contentionscope ++ -- enum __pthread_detachstate detachstate; ++ -- enum __pthread_inheritsched inheritsched; ++ -- enum __pthread_contentionscope contentionscope; ++ -- Not used: schedpolicy : int; ++ type pthread_attr_t is record ++ schedparam : struct_sched_param; ++ stackaddr : System.Address; ++ stacksize : size_t; ++ guardsize : size_t; ++ detachstate : int; ++ inheritsched : int; ++ contentionscope : int; ++ schedpolicy : int; ++ end record; ++ pragma Convention (C, pthread_attr_t); ++ ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- typedef struct __pthread_condattr pthread_condattr_t; ++ -- From: /usr/include/bits/condition-attr.h: ++ -- struct __pthread_condattr { ++ -- enum __pthread_process_shared pshared; ++ -- __Clockid_T Clock;} ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- enum __pthread_process_shared ++ type pthread_condattr_t is record ++ pshared : int; ++ clock : clockid_t; ++ end record; ++ pragma Convention (C, pthread_condattr_t); ++ ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- typedef struct __pthread_mutexattr pthread_mutexattr_t; and ++ -- /usr/include/bits/mutex-attr.h ++ -- struct __pthread_mutexattr { ++ -- Int Prioceiling; ++ -- Enum __Pthread_Mutex_Protocol Protocol; ++ -- Enum __Pthread_Process_Shared Pshared; ++ -- Enum __Pthread_Mutex_Type Mutex_Type;}; ++ type pthread_mutexattr_t is record ++ prioceiling : int; ++ protocol : int; ++ pshared : int; ++ mutex_type : int; ++ end record; ++ pragma Convention (C, pthread_mutexattr_t); ++ ++ -- From: /usr/include/pthread/pthreadtypes.h ++ -- typedef struct __pthread_mutex pthread_mutex_t; and ++ -- /usr/include/bits/mutex.h: ++ -- struct __pthread_mutex { ++ -- __pthread_spinlock_t __held; ++ -- __pthread_spinlock_t __lock; ++ -- /* in cthreads, mutex_init does not initialized the third ++ -- pointer, as such, we cannot rely on its value for anything. */ ++ -- char *cthreadscompat1; ++ -- struct __pthread *__queue; ++ -- struct __pthread_mutexattr *attr; ++ -- void *data; ++ -- /* up to this point, we are completely compatible with cthreads ++ -- and what libc expects. */ ++ -- void *owner; ++ -- unsigned locks; ++ -- /* if null then the default attributes apply. */ ++ -- }; ++ type pthread_mutex_t is record ++ held : int; ++ lock : int; ++ cthreadcompat : System.Address; ++ queue : System.Address; ++ attr : System.Address; ++ data : System.Address; ++ owner : System.Address; ++ locks : unsigned; ++ end record; ++ pragma Convention (C, pthread_mutex_t); ++ -- pointer needed? ++ -- type pthread_mutex_t_ptr is access pthread_mutex_t; ++ ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- typedef struct __pthread_cond pthread_cond_t; ++ -- typedef struct __pthread_condattr pthread_condattr_t; ++ -- /usr/include/bits/condition.h:struct __pthread_cond{} ++ -- pthread_condattr_t: see above! ++ -- /usr/include/bits/condition.h: struct __pthread_condimpl *__impl; ++ ++ type pthread_cond_t is record ++ lock : int; ++ queue : System.Address; ++ condattr : System.Address; ++ impl : System.Address; ++ data : System.Address; ++ end record; ++ pragma Convention (C, pthread_cond_t); ++ ++ -- From: /usr/include/pthread/pthreadtypes.h: ++ -- typedef __pthread_key pthread_key_t; and ++ -- /usr/include/bits/thread-specific.h: ++ -- typedef int __pthread_key; ++ type pthread_key_t is new int; ++ ++end System.OS_Interface; --- gcc-4.8-4.8.2.orig/debian/patches/ada-s-taprop-gnu.adb.diff +++ gcc-4.8-4.8.2/debian/patches/ada-s-taprop-gnu.adb.diff @@ -0,0 +1,1339 @@ +--- /dev/null 2012-01-30 20:41:15.189616186 +0100 ++++ b/src/gcc/ada/s-taprop-gnu.adb 2012-04-11 19:17:52.000000000 +0200 +@@ -0,0 +1,1336 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- ++-- -- ++-- S Y S T E M . T A S K _ P R I M I T I V E S . O P E R A T I O N S -- ++-- -- ++-- B o d y -- ++-- -- ++-- Copyright (C) 1992-2009, Free Software Foundation, Inc. -- ++-- -- ++-- GNARL is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 3, or (at your option) any later ver- -- ++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- ++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- ++-- or FITNESS FOR A PARTICULAR PURPOSE. -- ++-- -- ++-- As a special exception under Section 7 of GPL version 3, you are granted -- ++-- additional permissions described in the GCC Runtime Library Exception, -- ++-- version 3.1, as published by the Free Software Foundation. -- ++-- -- ++-- You should have received a copy of the GNU General Public License and -- ++-- a copy of the GCC Runtime Library Exception along with this program; -- ++-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- ++-- . -- ++-- -- ++-- GNARL was developed by the GNARL team at Florida State University. -- ++-- Extensive contributions were provided by Ada Core Technologies, Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++-- This is a GNU/Hurd version of this package ++-- Note: Removed the SCHED_FIFO and Ceiling Locking from the posix version ++-- since these functions are not (yet) supported on GNU/Hurd ++ ++-- This package contains all the GNULL primitives that interface directly with ++-- the underlying OS. ++ ++pragma Polling (Off); ++-- Turn off polling, we do not want ATC polling to take place during tasking ++-- operations. It causes infinite loops and other problems. ++ ++with Ada.Unchecked_Conversion; ++with Ada.Unchecked_Deallocation; ++ ++with Interfaces.C; ++ ++with System.Tasking.Debug; ++with System.Interrupt_Management; ++with System.OS_Primitives; ++with System.Task_Info; ++ ++with System.Soft_Links; ++-- We use System.Soft_Links instead of System.Tasking.Initialization ++-- because the later is a higher level package that we shouldn't depend on. ++-- For example when using the restricted run time, it is replaced by ++-- System.Tasking.Restricted.Stages. ++ ++package body System.Task_Primitives.Operations is ++ ++ package SSL renames System.Soft_Links; ++ ++ use System.Tasking.Debug; ++ use System.Tasking; ++ use Interfaces.C; ++ use System.OS_Interface; ++ use System.Parameters; ++ use System.OS_Primitives; ++ ++ ---------------- ++ -- Local Data -- ++ ---------------- ++ ++ -- The followings are logically constants, but need to be initialized ++ -- at run time. ++ ++ Single_RTS_Lock : aliased RTS_Lock; ++ -- This is a lock to allow only one thread of control in the RTS at ++ -- a time; it is used to execute in mutual exclusion from all other tasks. ++ -- Used mainly in Single_Lock mode, but also to protect All_Tasks_List ++ ++ ATCB_Key : aliased pthread_key_t; ++ -- Key used to find the Ada Task_Id associated with a thread ++ ++ Environment_Task_Id : Task_Id; ++ -- A variable to hold Task_Id for the environment task ++ ++ Unblocked_Signal_Mask : aliased sigset_t; ++ -- The set of signals that should unblocked in all tasks ++ ++ -- The followings are internal configuration constants needed ++ ++ Next_Serial_Number : Task_Serial_Number := 100; ++ -- We start at 100, to reserve some special values for ++ -- using in error checking. ++ ++ Foreign_Task_Elaborated : aliased Boolean := True; ++ -- Used to identified fake tasks (i.e., non-Ada Threads) ++ ++ Use_Alternate_Stack : constant Boolean := Alternate_Stack_Size /= 0; ++ -- Whether to use an alternate signal stack for stack overflows ++ ++ Abort_Handler_Installed : Boolean := False; ++ -- True if a handler for the abort signal is installed ++ ++ -------------------- ++ -- Local Packages -- ++ -------------------- ++ ++ package Specific is ++ ++ procedure Initialize (Environment_Task : Task_Id); ++ pragma Inline (Initialize); ++ -- Initialize various data needed by this package ++ ++ function Is_Valid_Task return Boolean; ++ pragma Inline (Is_Valid_Task); ++ -- Does executing thread have a TCB? ++ ++ procedure Set (Self_Id : Task_Id); ++ pragma Inline (Set); ++ -- Set the self id for the current task ++ ++ function Self return Task_Id; ++ pragma Inline (Self); ++ -- Return a pointer to the Ada Task Control Block of the calling task ++ ++ end Specific; ++ ++ package body Specific is separate; ++ -- The body of this package is target specific ++ ++ --------------------------------- ++ -- Support for foreign threads -- ++ --------------------------------- ++ ++ function Register_Foreign_Thread (Thread : Thread_Id) return Task_Id; ++ -- Allocate and Initialize a new ATCB for the current Thread ++ ++ function Register_Foreign_Thread ++ (Thread : Thread_Id) return Task_Id is separate; ++ ++ ----------------------- ++ -- Local Subprograms -- ++ ----------------------- ++ ++ procedure Abort_Handler (Sig : Signal); ++ -- Signal handler used to implement asynchronous abort. ++ -- See also comment before body, below. ++ ++ function To_Address is ++ new Ada.Unchecked_Conversion (Task_Id, System.Address); ++ ++ ------------------- ++ -- Abort_Handler -- ++ ------------------- ++ ++ -- Target-dependent binding of inter-thread Abort signal to the raising of ++ -- the Abort_Signal exception. ++ ++ -- The technical issues and alternatives here are essentially the ++ -- same as for raising exceptions in response to other signals ++ -- (e.g. Storage_Error). See code and comments in the package body ++ -- System.Interrupt_Management. ++ ++ -- Some implementations may not allow an exception to be propagated out of ++ -- a handler, and others might leave the signal or interrupt that invoked ++ -- this handler masked after the exceptional return to the application ++ -- code. ++ ++ -- GNAT exceptions are originally implemented using setjmp()/longjmp(). On ++ -- most UNIX systems, this will allow transfer out of a signal handler, ++ -- which is usually the only mechanism available for implementing ++ -- asynchronous handlers of this kind. However, some systems do not ++ -- restore the signal mask on longjmp(), leaving the abort signal masked. ++ ++ procedure Abort_Handler (Sig : Signal) is ++ pragma Unreferenced (Sig); ++ ++ T : constant Task_Id := Self; ++ Old_Set : aliased sigset_t; ++ ++ Result : Interfaces.C.int; ++ pragma Warnings (Off, Result); ++ ++ begin ++ -- It's not safe to raise an exception when using GCC ZCX mechanism. ++ -- Note that we still need to install a signal handler, since in some ++ -- cases (e.g. shutdown of the Server_Task in System.Interrupts) we ++ -- need to send the Abort signal to a task. ++ ++ if ZCX_By_Default and then GCC_ZCX_Support then ++ return; ++ end if; ++ ++ if T.Deferral_Level = 0 ++ and then T.Pending_ATC_Level < T.ATC_Nesting_Level and then ++ not T.Aborting ++ then ++ T.Aborting := True; ++ ++ -- Make sure signals used for RTS internal purpose are unmasked ++ ++ Result := pthread_sigmask (SIG_UNBLOCK, ++ Unblocked_Signal_Mask'Access, Old_Set'Access); ++ pragma Assert (Result = 0); ++ ++ raise Standard'Abort_Signal; ++ end if; ++ end Abort_Handler; ++ ++ ----------------- ++ -- Stack_Guard -- ++ ----------------- ++ ++ procedure Stack_Guard (T : ST.Task_Id; On : Boolean) is ++ Stack_Base : constant Address := Get_Stack_Base (T.Common.LL.Thread); ++ Guard_Page_Address : Address; ++ ++ Res : Interfaces.C.int; ++ ++ begin ++ if Stack_Base_Available then ++ ++ -- Compute the guard page address ++ ++ Guard_Page_Address := ++ Stack_Base - (Stack_Base mod Get_Page_Size) + Get_Page_Size; ++ ++ Res := ++ mprotect (Guard_Page_Address, Get_Page_Size, ++ prot => (if On then PROT_ON else PROT_OFF)); ++ pragma Assert (Res = 0); ++ end if; ++ end Stack_Guard; ++ ++ -------------------- ++ -- Get_Thread_Id -- ++ -------------------- ++ ++ function Get_Thread_Id (T : ST.Task_Id) return OSI.Thread_Id is ++ begin ++ return T.Common.LL.Thread; ++ end Get_Thread_Id; ++ ++ ---------- ++ -- Self -- ++ ---------- ++ ++ function Self return Task_Id renames Specific.Self; ++ ++ --------------------- ++ -- Initialize_Lock -- ++ --------------------- ++ ++ -- Note: mutexes and cond_variables needed per-task basis are ++ -- initialized in Initialize_TCB and the Storage_Error is ++ -- handled. Other mutexes (such as RTS_Lock, Memory_Lock...) ++ -- used in RTS is initialized before any status change of RTS. ++ -- Therefore raising Storage_Error in the following routines ++ -- should be able to be handled safely. ++ ++ procedure Initialize_Lock ++ (Prio : System.Any_Priority; ++ L : not null access Lock) ++ is ++ pragma Unreferenced (Prio); ++ ++ Attributes : aliased pthread_mutexattr_t; ++ Result : Interfaces.C.int; ++ ++ begin ++ Result := pthread_mutexattr_init (Attributes'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ raise Storage_Error with "Failed to allocate a lock"; ++ end if; ++ ++ Result := pthread_mutex_init (L, Attributes'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ Result := pthread_mutexattr_destroy (Attributes'Access); ++ raise Storage_Error; ++ end if; ++ ++ Result := pthread_mutexattr_destroy (Attributes'Access); ++ pragma Assert (Result = 0); ++ end Initialize_Lock; ++ ++ procedure Initialize_Lock ++ (L : not null access RTS_Lock; Level : Lock_Level) ++ is ++ pragma Unreferenced (Level); ++ ++ Attributes : aliased pthread_mutexattr_t; ++ Result : Interfaces.C.int; ++ ++ begin ++ Result := pthread_mutexattr_init (Attributes'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ raise Storage_Error with "Failed to allocate a lock"; ++ end if; ++ ++ Result := pthread_mutex_init (L, Attributes'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ Result := pthread_mutexattr_destroy (Attributes'Access); ++ raise Storage_Error; ++ end if; ++ ++ Result := pthread_mutexattr_destroy (Attributes'Access); ++ pragma Assert (Result = 0); ++ end Initialize_Lock; ++ ++ ------------------- ++ -- Finalize_Lock -- ++ ------------------- ++ ++ procedure Finalize_Lock (L : not null access Lock) is ++ Result : Interfaces.C.int; ++ begin ++ Result := pthread_mutex_destroy (L); ++ pragma Assert (Result = 0); ++ end Finalize_Lock; ++ ++ procedure Finalize_Lock (L : not null access RTS_Lock) is ++ Result : Interfaces.C.int; ++ begin ++ Result := pthread_mutex_destroy (L); ++ pragma Assert (Result = 0); ++ end Finalize_Lock; ++ ++ ---------------- ++ -- Write_Lock -- ++ ---------------- ++ ++ procedure Write_Lock ++ (L : not null access Lock; Ceiling_Violation : out Boolean) ++ is ++ Result : Interfaces.C.int; ++ ++ begin ++ Result := pthread_mutex_lock (L); ++ ++ -- Assume that the cause of EINVAL is a priority ceiling violation ++ ++ Ceiling_Violation := (Result = EINVAL); ++ pragma Assert (Result = 0 or else Result = EINVAL); ++ end Write_Lock; ++ ++ procedure Write_Lock ++ (L : not null access RTS_Lock; ++ Global_Lock : Boolean := False) ++ is ++ Result : Interfaces.C.int; ++ begin ++ if not Single_Lock or else Global_Lock then ++ Result := pthread_mutex_lock (L); ++ pragma Assert (Result = 0); ++ end if; ++ end Write_Lock; ++ ++ procedure Write_Lock (T : Task_Id) is ++ Result : Interfaces.C.int; ++ begin ++ if not Single_Lock then ++ Result := pthread_mutex_lock (T.Common.LL.L'Access); ++ pragma Assert (Result = 0); ++ end if; ++ end Write_Lock; ++ ++ --------------- ++ -- Read_Lock -- ++ --------------- ++ ++ procedure Read_Lock ++ (L : not null access Lock; Ceiling_Violation : out Boolean) is ++ begin ++ Write_Lock (L, Ceiling_Violation); ++ end Read_Lock; ++ ++ ------------ ++ -- Unlock -- ++ ------------ ++ ++ procedure Unlock (L : not null access Lock) is ++ Result : Interfaces.C.int; ++ begin ++ Result := pthread_mutex_unlock (L); ++ pragma Assert (Result = 0); ++ end Unlock; ++ ++ procedure Unlock ++ (L : not null access RTS_Lock; Global_Lock : Boolean := False) ++ is ++ Result : Interfaces.C.int; ++ begin ++ if not Single_Lock or else Global_Lock then ++ Result := pthread_mutex_unlock (L); ++ pragma Assert (Result = 0); ++ end if; ++ end Unlock; ++ ++ procedure Unlock (T : Task_Id) is ++ Result : Interfaces.C.int; ++ begin ++ if not Single_Lock then ++ Result := pthread_mutex_unlock (T.Common.LL.L'Access); ++ pragma Assert (Result = 0); ++ end if; ++ end Unlock; ++ ++ ----------------- ++ -- Set_Ceiling -- ++ ----------------- ++ ++ -- Dynamic priority ceilings are not supported by the underlying system ++ ++ procedure Set_Ceiling ++ (L : not null access Lock; ++ Prio : System.Any_Priority) ++ is ++ pragma Unreferenced (L, Prio); ++ begin ++ null; ++ end Set_Ceiling; ++ ++ ----------- ++ -- Sleep -- ++ ----------- ++ ++ procedure Sleep ++ (Self_ID : Task_Id; ++ Reason : System.Tasking.Task_States) ++ is ++ pragma Unreferenced (Reason); ++ ++ Result : Interfaces.C.int; ++ ++ begin ++ Result := ++ pthread_cond_wait ++ (cond => Self_ID.Common.LL.CV'Access, ++ mutex => (if Single_Lock ++ then Single_RTS_Lock'Access ++ else Self_ID.Common.LL.L'Access)); ++ ++ -- EINTR is not considered a failure ++ ++ pragma Assert (Result = 0 or else Result = EINTR); ++ end Sleep; ++ ++ ----------------- ++ -- Timed_Sleep -- ++ ----------------- ++ ++ -- This is for use within the run-time system, so abort is ++ -- assumed to be already deferred, and the caller should be ++ -- holding its own ATCB lock. ++ ++ procedure Timed_Sleep ++ (Self_ID : Task_Id; ++ Time : Duration; ++ Mode : ST.Delay_Modes; ++ Reason : Task_States; ++ Timedout : out Boolean; ++ Yielded : out Boolean) ++ is ++ pragma Unreferenced (Reason); ++ ++ Base_Time : constant Duration := Monotonic_Clock; ++ Check_Time : Duration := Base_Time; ++ Rel_Time : Duration; ++ Abs_Time : Duration; ++ Request : aliased timespec; ++ Result : Interfaces.C.int; ++ ++ begin ++ Timedout := True; ++ Yielded := False; ++ ++ if Mode = Relative then ++ Abs_Time := Duration'Min (Time, Max_Sensible_Delay) + Check_Time; ++ ++ if Relative_Timed_Wait then ++ Rel_Time := Duration'Min (Max_Sensible_Delay, Time); ++ end if; ++ ++ else ++ Abs_Time := Duration'Min (Check_Time + Max_Sensible_Delay, Time); ++ ++ if Relative_Timed_Wait then ++ Rel_Time := Duration'Min (Max_Sensible_Delay, Time - Check_Time); ++ end if; ++ end if; ++ ++ if Abs_Time > Check_Time then ++ Request := ++ To_Timespec (if Relative_Timed_Wait then Rel_Time else Abs_Time); ++ ++ loop ++ exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level; ++ ++ Result := ++ pthread_cond_timedwait ++ (cond => Self_ID.Common.LL.CV'Access, ++ mutex => (if Single_Lock ++ then Single_RTS_Lock'Access ++ else Self_ID.Common.LL.L'Access), ++ abstime => Request'Access); ++ ++ Check_Time := Monotonic_Clock; ++ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time; ++ ++ if Result = 0 or Result = EINTR then ++ ++ -- Somebody may have called Wakeup for us ++ ++ Timedout := False; ++ exit; ++ end if; ++ ++ pragma Assert (Result = ETIMEDOUT); ++ end loop; ++ end if; ++ end Timed_Sleep; ++ ++ ----------------- ++ -- Timed_Delay -- ++ ----------------- ++ ++ -- This is for use in implementing delay statements, so we assume the ++ -- caller is abort-deferred but is holding no locks. ++ ++ procedure Timed_Delay ++ (Self_ID : Task_Id; ++ Time : Duration; ++ Mode : ST.Delay_Modes) ++ is ++ Base_Time : constant Duration := Monotonic_Clock; ++ Check_Time : Duration := Base_Time; ++ Abs_Time : Duration; ++ Rel_Time : Duration; ++ Request : aliased timespec; ++ ++ Result : Interfaces.C.int; ++ pragma Warnings (Off, Result); ++ ++ begin ++ if Single_Lock then ++ Lock_RTS; ++ end if; ++ ++ Write_Lock (Self_ID); ++ ++ if Mode = Relative then ++ Abs_Time := Duration'Min (Time, Max_Sensible_Delay) + Check_Time; ++ ++ if Relative_Timed_Wait then ++ Rel_Time := Duration'Min (Max_Sensible_Delay, Time); ++ end if; ++ ++ else ++ Abs_Time := Duration'Min (Check_Time + Max_Sensible_Delay, Time); ++ ++ if Relative_Timed_Wait then ++ Rel_Time := Duration'Min (Max_Sensible_Delay, Time - Check_Time); ++ end if; ++ end if; ++ ++ if Abs_Time > Check_Time then ++ Request := ++ To_Timespec (if Relative_Timed_Wait then Rel_Time else Abs_Time); ++ Self_ID.Common.State := Delay_Sleep; ++ ++ loop ++ exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level; ++ ++ Result := ++ pthread_cond_timedwait ++ (cond => Self_ID.Common.LL.CV'Access, ++ mutex => (if Single_Lock ++ then Single_RTS_Lock'Access ++ else Self_ID.Common.LL.L'Access), ++ abstime => Request'Access); ++ ++ Check_Time := Monotonic_Clock; ++ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time; ++ ++ pragma Assert (Result = 0 ++ or else Result = ETIMEDOUT ++ or else Result = EINTR); ++ end loop; ++ ++ Self_ID.Common.State := Runnable; ++ end if; ++ ++ Unlock (Self_ID); ++ ++ if Single_Lock then ++ Unlock_RTS; ++ end if; ++ ++ Result := sched_yield; ++ end Timed_Delay; ++ ++ --------------------- ++ -- Monotonic_Clock -- ++ --------------------- ++ ++ function Monotonic_Clock return Duration is ++ TS : aliased timespec; ++ Result : Interfaces.C.int; ++ begin ++ Result := clock_gettime ++ (clock_id => CLOCK_REALTIME, tp => TS'Unchecked_Access); ++ pragma Assert (Result = 0); ++ return To_Duration (TS); ++ end Monotonic_Clock; ++ ++ ------------------- ++ -- RT_Resolution -- ++ ------------------- ++ ++ function RT_Resolution return Duration is ++ begin ++ return 10#1.0#E-6; ++ end RT_Resolution; ++ ++ ------------ ++ -- Wakeup -- ++ ------------ ++ ++ procedure Wakeup (T : Task_Id; Reason : System.Tasking.Task_States) is ++ pragma Unreferenced (Reason); ++ Result : Interfaces.C.int; ++ begin ++ Result := pthread_cond_signal (T.Common.LL.CV'Access); ++ pragma Assert (Result = 0); ++ end Wakeup; ++ ++ ----------- ++ -- Yield -- ++ ----------- ++ ++ procedure Yield (Do_Yield : Boolean := True) is ++ Result : Interfaces.C.int; ++ pragma Unreferenced (Result); ++ begin ++ if Do_Yield then ++ Result := sched_yield; ++ end if; ++ end Yield; ++ ++ ------------------ ++ -- Set_Priority -- ++ ------------------ ++ ++ procedure Set_Priority ++ (T : Task_Id; ++ Prio : System.Any_Priority; ++ Loss_Of_Inheritance : Boolean := False) ++ is ++ pragma Unreferenced (Loss_Of_Inheritance); ++ ++ begin ++ null; ++ end Set_Priority; ++ ++ ------------------ ++ -- Get_Priority -- ++ ------------------ ++ ++ function Get_Priority (T : Task_Id) return System.Any_Priority is ++ begin ++ return T.Common.Current_Priority; ++ end Get_Priority; ++ ++ ---------------- ++ -- Enter_Task -- ++ ---------------- ++ ++ procedure Enter_Task (Self_ID : Task_Id) is ++ begin ++ Self_ID.Common.LL.Thread := pthread_self; ++ Self_ID.Common.LL.LWP := lwp_self; ++ ++ Specific.Set (Self_ID); ++ ++ if Use_Alternate_Stack then ++ declare ++ Stack : aliased stack_t; ++ Result : Interfaces.C.int; ++ begin ++ Stack.ss_sp := Self_ID.Common.Task_Alternate_Stack; ++ Stack.ss_size := Alternate_Stack_Size; ++ Stack.ss_flags := 0; ++ Result := sigaltstack (Stack'Access, null); ++ pragma Assert (Result = 0); ++ end; ++ end if; ++ end Enter_Task; ++ ++ -------------- ++ -- New_ATCB -- ++ -------------- ++ ++ function New_ATCB (Entry_Num : Task_Entry_Index) return Task_Id is ++ begin ++ return new Ada_Task_Control_Block (Entry_Num); ++ end New_ATCB; ++ ++ ------------------- ++ -- Is_Valid_Task -- ++ ------------------- ++ ++ function Is_Valid_Task return Boolean renames Specific.Is_Valid_Task; ++ ++ ----------------------------- ++ -- Register_Foreign_Thread -- ++ ----------------------------- ++ ++ function Register_Foreign_Thread return Task_Id is ++ begin ++ if Is_Valid_Task then ++ return Self; ++ else ++ return Register_Foreign_Thread (pthread_self); ++ end if; ++ end Register_Foreign_Thread; ++ ++ -------------------- ++ -- Initialize_TCB -- ++ -------------------- ++ ++ procedure Initialize_TCB (Self_ID : Task_Id; Succeeded : out Boolean) is ++ Mutex_Attr : aliased pthread_mutexattr_t; ++ Result : Interfaces.C.int; ++ Cond_Attr : aliased pthread_condattr_t; ++ ++ begin ++ -- Give the task a unique serial number ++ ++ Self_ID.Serial_Number := Next_Serial_Number; ++ Next_Serial_Number := Next_Serial_Number + 1; ++ pragma Assert (Next_Serial_Number /= 0); ++ ++ if not Single_Lock then ++ Result := pthread_mutexattr_init (Mutex_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = 0 then ++ Result := ++ pthread_mutex_init ++ (Self_ID.Common.LL.L'Access, ++ Mutex_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ end if; ++ ++ if Result /= 0 then ++ Succeeded := False; ++ return; ++ end if; ++ ++ Result := pthread_mutexattr_destroy (Mutex_Attr'Access); ++ pragma Assert (Result = 0); ++ end if; ++ ++ Result := pthread_condattr_init (Cond_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = 0 then ++ Result := ++ pthread_cond_init ++ (Self_ID.Common.LL.CV'Access, Cond_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ end if; ++ ++ if Result = 0 then ++ Succeeded := True; ++ else ++ if not Single_Lock then ++ Result := pthread_mutex_destroy (Self_ID.Common.LL.L'Access); ++ pragma Assert (Result = 0); ++ end if; ++ ++ Succeeded := False; ++ end if; ++ ++ Result := pthread_condattr_destroy (Cond_Attr'Access); ++ pragma Assert (Result = 0); ++ end Initialize_TCB; ++ ++ ----------------- ++ -- Create_Task -- ++ ----------------- ++ ++ procedure Create_Task ++ (T : Task_Id; ++ Wrapper : System.Address; ++ Stack_Size : System.Parameters.Size_Type; ++ Priority : System.Any_Priority; ++ Succeeded : out Boolean) ++ is ++ Attributes : aliased pthread_attr_t; ++ Adjusted_Stack_Size : Interfaces.C.size_t; ++ Page_Size : constant Interfaces.C.size_t := Get_Page_Size; ++ Result : Interfaces.C.int; ++ ++ function Thread_Body_Access is new ++ Ada.Unchecked_Conversion (System.Address, Thread_Body); ++ ++ use System.Task_Info; ++ ++ begin ++ Adjusted_Stack_Size := ++ Interfaces.C.size_t (Stack_Size + Alternate_Stack_Size); ++ ++ if Stack_Base_Available then ++ ++ -- If Stack Checking is supported then allocate 2 additional pages: ++ ++ -- In the worst case, stack is allocated at something like ++ -- N * Get_Page_Size - epsilon, we need to add the size for 2 pages ++ -- to be sure the effective stack size is greater than what ++ -- has been asked. ++ ++ Adjusted_Stack_Size := Adjusted_Stack_Size + 2 * Page_Size; ++ end if; ++ ++ -- Round stack size as this is required by some OSes (Darwin) ++ ++ Adjusted_Stack_Size := Adjusted_Stack_Size + Page_Size - 1; ++ Adjusted_Stack_Size := ++ Adjusted_Stack_Size - Adjusted_Stack_Size mod Page_Size; ++ ++ Result := pthread_attr_init (Attributes'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result /= 0 then ++ Succeeded := False; ++ return; ++ end if; ++ ++ Result := ++ pthread_attr_setdetachstate ++ (Attributes'Access, PTHREAD_CREATE_DETACHED); ++ pragma Assert (Result = 0); ++ ++ Result := ++ pthread_attr_setstacksize ++ (Attributes'Access, Adjusted_Stack_Size); ++ pragma Assert (Result = 0); ++ ++ -- Since the initial signal mask of a thread is inherited from the ++ -- creator, and the Environment task has all its signals masked, we ++ -- do not need to manipulate caller's signal mask at this point. ++ -- All tasks in RTS will have All_Tasks_Mask initially. ++ ++ Result := pthread_create ++ (T.Common.LL.Thread'Access, ++ Attributes'Access, ++ Thread_Body_Access (Wrapper), ++ To_Address (T)); ++ pragma Assert (Result = 0 or else Result = EAGAIN); ++ ++ Succeeded := Result = 0; ++ ++ Result := pthread_attr_destroy (Attributes'Access); ++ pragma Assert (Result = 0); ++ ++ if Succeeded then ++ Set_Priority (T, Priority); ++ end if; ++ end Create_Task; ++ ++ ------------------ ++ -- Finalize_TCB -- ++ ------------------ ++ ++ procedure Finalize_TCB (T : Task_Id) is ++ Result : Interfaces.C.int; ++ Tmp : Task_Id := T; ++ Is_Self : constant Boolean := T = Self; ++ ++ procedure Free is new ++ Ada.Unchecked_Deallocation (Ada_Task_Control_Block, Task_Id); ++ ++ begin ++ if not Single_Lock then ++ Result := pthread_mutex_destroy (T.Common.LL.L'Access); ++ pragma Assert (Result = 0); ++ end if; ++ ++ Result := pthread_cond_destroy (T.Common.LL.CV'Access); ++ pragma Assert (Result = 0); ++ ++ if T.Known_Tasks_Index /= -1 then ++ Known_Tasks (T.Known_Tasks_Index) := null; ++ end if; ++ ++ Free (Tmp); ++ ++ if Is_Self then ++ Specific.Set (null); ++ end if; ++ end Finalize_TCB; ++ ++ --------------- ++ -- Exit_Task -- ++ --------------- ++ ++ procedure Exit_Task is ++ begin ++ -- Mark this task as unknown, so that if Self is called, it won't ++ -- return a dangling pointer. ++ ++ Specific.Set (null); ++ end Exit_Task; ++ ++ ---------------- ++ -- Abort_Task -- ++ ---------------- ++ ++ procedure Abort_Task (T : Task_Id) is ++ Result : Interfaces.C.int; ++ begin ++ if Abort_Handler_Installed then ++ Result := ++ pthread_kill ++ (T.Common.LL.Thread, ++ Signal (System.Interrupt_Management.Abort_Task_Interrupt)); ++ pragma Assert (Result = 0); ++ end if; ++ end Abort_Task; ++ ++ ---------------- ++ -- Initialize -- ++ ---------------- ++ ++ procedure Initialize (S : in out Suspension_Object) is ++ Mutex_Attr : aliased pthread_mutexattr_t; ++ Cond_Attr : aliased pthread_condattr_t; ++ Result : Interfaces.C.int; ++ ++ begin ++ -- Initialize internal state (always to False (RM D.10 (6))) ++ ++ S.State := False; ++ S.Waiting := False; ++ ++ -- Initialize internal mutex ++ ++ Result := pthread_mutexattr_init (Mutex_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ raise Storage_Error; ++ end if; ++ ++ Result := pthread_mutex_init (S.L'Access, Mutex_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result = ENOMEM then ++ Result := pthread_mutexattr_destroy (Mutex_Attr'Access); ++ pragma Assert (Result = 0); ++ ++ raise Storage_Error; ++ end if; ++ ++ Result := pthread_mutexattr_destroy (Mutex_Attr'Access); ++ pragma Assert (Result = 0); ++ ++ -- Initialize internal condition variable ++ ++ Result := pthread_condattr_init (Cond_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result /= 0 then ++ Result := pthread_mutex_destroy (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ if Result = ENOMEM then ++ raise Storage_Error; ++ end if; ++ end if; ++ ++ Result := pthread_cond_init (S.CV'Access, Cond_Attr'Access); ++ pragma Assert (Result = 0 or else Result = ENOMEM); ++ ++ if Result /= 0 then ++ Result := pthread_mutex_destroy (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ if Result = ENOMEM then ++ Result := pthread_condattr_destroy (Cond_Attr'Access); ++ pragma Assert (Result = 0); ++ raise Storage_Error; ++ end if; ++ end if; ++ ++ Result := pthread_condattr_destroy (Cond_Attr'Access); ++ pragma Assert (Result = 0); ++ end Initialize; ++ ++ -------------- ++ -- Finalize -- ++ -------------- ++ ++ procedure Finalize (S : in out Suspension_Object) is ++ Result : Interfaces.C.int; ++ ++ begin ++ -- Destroy internal mutex ++ ++ Result := pthread_mutex_destroy (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ -- Destroy internal condition variable ++ ++ Result := pthread_cond_destroy (S.CV'Access); ++ pragma Assert (Result = 0); ++ end Finalize; ++ ++ ------------------- ++ -- Current_State -- ++ ------------------- ++ ++ function Current_State (S : Suspension_Object) return Boolean is ++ begin ++ -- We do not want to use lock on this read operation. State is marked ++ -- as Atomic so that we ensure that the value retrieved is correct. ++ ++ return S.State; ++ end Current_State; ++ ++ --------------- ++ -- Set_False -- ++ --------------- ++ ++ procedure Set_False (S : in out Suspension_Object) is ++ Result : Interfaces.C.int; ++ ++ begin ++ SSL.Abort_Defer.all; ++ ++ Result := pthread_mutex_lock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ S.State := False; ++ ++ Result := pthread_mutex_unlock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ SSL.Abort_Undefer.all; ++ end Set_False; ++ ++ -------------- ++ -- Set_True -- ++ -------------- ++ ++ procedure Set_True (S : in out Suspension_Object) is ++ Result : Interfaces.C.int; ++ ++ begin ++ SSL.Abort_Defer.all; ++ ++ Result := pthread_mutex_lock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ -- If there is already a task waiting on this suspension object then ++ -- we resume it, leaving the state of the suspension object to False, ++ -- as it is specified in (RM D.10(9)). Otherwise, it just leaves ++ -- the state to True. ++ ++ if S.Waiting then ++ S.Waiting := False; ++ S.State := False; ++ ++ Result := pthread_cond_signal (S.CV'Access); ++ pragma Assert (Result = 0); ++ ++ else ++ S.State := True; ++ end if; ++ ++ Result := pthread_mutex_unlock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ SSL.Abort_Undefer.all; ++ end Set_True; ++ ++ ------------------------ ++ -- Suspend_Until_True -- ++ ------------------------ ++ ++ procedure Suspend_Until_True (S : in out Suspension_Object) is ++ Result : Interfaces.C.int; ++ ++ begin ++ SSL.Abort_Defer.all; ++ ++ Result := pthread_mutex_lock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ if S.Waiting then ++ ++ -- Program_Error must be raised upon calling Suspend_Until_True ++ -- if another task is already waiting on that suspension object ++ -- (RM D.10(10)). ++ ++ Result := pthread_mutex_unlock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ SSL.Abort_Undefer.all; ++ ++ raise Program_Error; ++ ++ else ++ -- Suspend the task if the state is False. Otherwise, the task ++ -- continues its execution, and the state of the suspension object ++ -- is set to False (ARM D.10 par. 9). ++ ++ if S.State then ++ S.State := False; ++ else ++ S.Waiting := True; ++ ++ loop ++ -- Loop in case pthread_cond_wait returns earlier than expected ++ -- (e.g. in case of EINTR caused by a signal). ++ ++ Result := pthread_cond_wait (S.CV'Access, S.L'Access); ++ pragma Assert (Result = 0 or else Result = EINTR); ++ ++ exit when not S.Waiting; ++ end loop; ++ end if; ++ ++ Result := pthread_mutex_unlock (S.L'Access); ++ pragma Assert (Result = 0); ++ ++ SSL.Abort_Undefer.all; ++ end if; ++ end Suspend_Until_True; ++ ++ ---------------- ++ -- Check_Exit -- ++ ---------------- ++ ++ -- Dummy version ++ ++ function Check_Exit (Self_ID : ST.Task_Id) return Boolean is ++ pragma Unreferenced (Self_ID); ++ begin ++ return True; ++ end Check_Exit; ++ ++ -------------------- ++ -- Check_No_Locks -- ++ -------------------- ++ ++ function Check_No_Locks (Self_ID : ST.Task_Id) return Boolean is ++ pragma Unreferenced (Self_ID); ++ begin ++ return True; ++ end Check_No_Locks; ++ ++ ---------------------- ++ -- Environment_Task -- ++ ---------------------- ++ ++ function Environment_Task return Task_Id is ++ begin ++ return Environment_Task_Id; ++ end Environment_Task; ++ ++ -------------- ++ -- Lock_RTS -- ++ -------------- ++ ++ procedure Lock_RTS is ++ begin ++ Write_Lock (Single_RTS_Lock'Access, Global_Lock => True); ++ end Lock_RTS; ++ ++ ---------------- ++ -- Unlock_RTS -- ++ ---------------- ++ ++ procedure Unlock_RTS is ++ begin ++ Unlock (Single_RTS_Lock'Access, Global_Lock => True); ++ end Unlock_RTS; ++ ++ ------------------ ++ -- Suspend_Task -- ++ ------------------ ++ ++ function Suspend_Task ++ (T : ST.Task_Id; ++ Thread_Self : Thread_Id) return Boolean ++ is ++ pragma Unreferenced (T, Thread_Self); ++ begin ++ return False; ++ end Suspend_Task; ++ ++ ----------------- ++ -- Resume_Task -- ++ ----------------- ++ ++ function Resume_Task ++ (T : ST.Task_Id; ++ Thread_Self : Thread_Id) return Boolean ++ is ++ pragma Unreferenced (T, Thread_Self); ++ begin ++ return False; ++ end Resume_Task; ++ ++ -------------------- ++ -- Stop_All_Tasks -- ++ -------------------- ++ ++ procedure Stop_All_Tasks is ++ begin ++ null; ++ end Stop_All_Tasks; ++ ++ --------------- ++ -- Stop_Task -- ++ --------------- ++ ++ function Stop_Task (T : ST.Task_Id) return Boolean is ++ pragma Unreferenced (T); ++ begin ++ return False; ++ end Stop_Task; ++ ++ ------------------- ++ -- Continue_Task -- ++ ------------------- ++ ++ function Continue_Task (T : ST.Task_Id) return Boolean is ++ pragma Unreferenced (T); ++ begin ++ return False; ++ end Continue_Task; ++ ++ ---------------- ++ -- Initialize -- ++ ---------------- ++ ++ procedure Initialize (Environment_Task : Task_Id) is ++ act : aliased struct_sigaction; ++ old_act : aliased struct_sigaction; ++ Tmp_Set : aliased sigset_t; ++ Result : Interfaces.C.int; ++ ++ function State ++ (Int : System.Interrupt_Management.Interrupt_ID) return Character; ++ pragma Import (C, State, "__gnat_get_interrupt_state"); ++ -- Get interrupt state. Defined in a-init.c ++ -- The input argument is the interrupt number, ++ -- and the result is one of the following: ++ ++ Default : constant Character := 's'; ++ -- 'n' this interrupt not set by any Interrupt_State pragma ++ -- 'u' Interrupt_State pragma set state to User ++ -- 'r' Interrupt_State pragma set state to Runtime ++ -- 's' Interrupt_State pragma set state to System (use "default" ++ -- system handler) ++ ++ begin ++ Environment_Task_Id := Environment_Task; ++ ++ Interrupt_Management.Initialize; ++ ++ -- Prepare the set of signals that should unblocked in all tasks ++ ++ Result := sigemptyset (Unblocked_Signal_Mask'Access); ++ pragma Assert (Result = 0); ++ ++ for J in Interrupt_Management.Interrupt_ID loop ++ if System.Interrupt_Management.Keep_Unmasked (J) then ++ Result := sigaddset (Unblocked_Signal_Mask'Access, Signal (J)); ++ pragma Assert (Result = 0); ++ end if; ++ end loop; ++ ++ -- Initialize the lock used to synchronize chain of all ATCBs ++ ++ Initialize_Lock (Single_RTS_Lock'Access, RTS_Lock_Level); ++ ++ Specific.Initialize (Environment_Task); ++ ++ if Use_Alternate_Stack then ++ Environment_Task.Common.Task_Alternate_Stack := ++ Alternate_Stack'Address; ++ end if; ++ ++ -- Make environment task known here because it doesn't go through ++ -- Activate_Tasks, which does it for all other tasks. ++ ++ Known_Tasks (Known_Tasks'First) := Environment_Task; ++ Environment_Task.Known_Tasks_Index := Known_Tasks'First; ++ ++ Enter_Task (Environment_Task); ++ ++ if State ++ (System.Interrupt_Management.Abort_Task_Interrupt) /= Default ++ then ++ act.sa_flags := 0; ++ act.sa_handler := Abort_Handler'Address; ++ ++ Result := sigemptyset (Tmp_Set'Access); ++ pragma Assert (Result = 0); ++ act.sa_mask := Tmp_Set; ++ ++ Result := ++ sigaction ++ (Signal (System.Interrupt_Management.Abort_Task_Interrupt), ++ act'Unchecked_Access, ++ old_act'Unchecked_Access); ++ pragma Assert (Result = 0); ++ Abort_Handler_Installed := True; ++ end if; ++ end Initialize; ++ ++end System.Task_Primitives.Operations; --- gcc-4.8-4.8.2.orig/debian/patches/ada-sjlj.diff +++ gcc-4.8-4.8.2/debian/patches/ada-sjlj.diff @@ -0,0 +1,717 @@ +# DP: There are two exception mechanisms to choose from: zero-cost and +# DP: setjump/longjump. The Ada run-time library uses either of them +# DP: but not both. Build both versions of the run-time library. + +# This patch changes the way the upstream Makefiles build the run-time +# library. Before the patch: libada/Makefile calls gcc/ada/Makefile, +# which builds the "rts" subdirectory containing symbolic links to +# most source files, and modified copies of a few source files (to +# take target dependencies into account, and also to select the +# exception handling mechanism in system.ads). Then, gcc/ada/Makefile +# calls itself recursively but in the "rts" subdirectory and builds +# libgnat.a and libgnarl.a (and a couple other libraries: +# libgccprefix.a, libgmem.a). Upon return from this recursive call, +# it deletes the source and object files from "rts", reconstructs the +# source files, and builds libgnat.so and libgnarl.so by calling +# itself recursively a second time in the "rts" directory. + +# Furthermore, gcc/ada/Makefile disables parallel makes, so building +# the static and then shared versions of the RTS is entirely +# sequential even on SMP systems. + +# As a consequence of the above, building the SJLJ version of the +# library would overwrite the ZCX version. Thus it is necessary to +# manually save the previous version of the library before building the +# second one. + +# After the patch: libada/Makefile calls gcc/ada/Makefile, which +# builds the source directory (named gnatlib-sources instead of rts), +# containing the symbolic links and target-dependent files. + +# In a second step, libada/Makefile calls gcc/ada/Makefile again to +# build the targets gnatlib-shared-zcx, gnatlib-static-zcx and +# gnatlib-static-sjlj (we could also build gnatlib-shared-sjlj, but +# that triggers compiler errors on PowerPC). + +# Each of these three targets copies the source directory "rts" into a +# new directory named rts-shared-zcx, rts-static-zcx or +# rts-static-sjlj. In the new directory, they change the value of +# System.ZCX_By_Default, and then they call gcc/ada/Makefile +# recursively in the new directory to build the library. + +# gcc/ada/Makefile.in has a .NOTPARALLEL directive preventing it from +# launching commands in parallel. However, libada/Makefile has no +# such directive and can invoke up to three instances of +# gcc/ada/Makefile.in in parallel. This is okay because each of them +# runs in a different directory. + +# This patch also updates libgnat{vsn,prj}/Makefile and +# gnattools/Makefile to look for the shared ZCX version of the library +# in the appropriate directory, rather than just "rts", and updates +# the "make install" and binary targets as well. + +Index: b/src/libada/Makefile.in +=================================================================== +--- a/src/libada/Makefile.in ++++ b/src/libada/Makefile.in +@@ -16,7 +16,8 @@ + # . + + # Default target; must be first. +-all: gnatlib ++GNATLIB = gnatlib-static-zcx gnatlib-static-sjlj gnatlib-shared-zcx ++all: $(GNATLIB) + $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE) + + .PHONY: all +@@ -97,26 +98,28 @@ + "CFLAGS=$(CFLAGS)" + + # Rules to build gnatlib. +-.PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared osconstool +-gnatlib: @default_gnatlib_target@ ++.PHONY: $(GNATLIB) osconstool + +-gnatlib-plain: osconstool $(GCC_DIR)/ada/Makefile +- test -f stamp-libada || \ +- $(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) gnatlib \ +- && touch stamp-libada +- -rm -rf adainclude +- -rm -rf adalib +- $(LN_S_RECURSIVE) $(ADA_RTS_DIR) adainclude +- $(LN_S_RECURSIVE) $(ADA_RTS_DIR) adalib +- +-gnatlib-sjlj gnatlib-zcx gnatlib-shared: osconstool $(GCC_DIR)/ada/Makefile +- test -f stamp-libada || \ +- $(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) $@ \ +- && touch stamp-libada +- -rm -rf adainclude +- -rm -rf adalib +- $(LN_S_RECURSIVE) $(ADA_RTS_DIR) adainclude +- $(LN_S_RECURSIVE) $(ADA_RTS_DIR) adalib ++$(GCC_DIR)/ada/gnatlib-sources-sjlj/a-except.ads: ++ $(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) \ ++ EH_MECHANISM="" \ ++ gnatlib-sources-sjlj/a-except.ads ++ ++$(GCC_DIR)/ada/gnatlib-sources-zcx/a-except.ads: ++ $(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) \ ++ EH_MECHANISM="-gcc" \ ++ gnatlib-sources-zcx/a-except.ads ++ ++$(GNATLIB): osconstool $(GCC_DIR)/ada/Makefile \ ++$(GCC_DIR)/ada/gnatlib-sources-zcx/a-except.ads \ ++$(GCC_DIR)/ada/gnatlib-sources-sjlj/a-except.ads ++ $(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \ ++ GNATLIBFLAGS="$(GNATLIBFLAGS)" \ ++ GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ ++ TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ ++ THREAD_KIND="$(THREAD_KIND)" \ ++ TRACE="$(TRACE)" \ ++ $@ + + osconstool: + $(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) ./bldtools/oscons/xoscons +Index: b/src/gcc/ada/gcc-interface/Makefile.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Makefile.in ++++ b/src/gcc/ada/gcc-interface/Makefile.in +@@ -2353,84 +2353,109 @@ + $(patsubst %$(objext),%.adb,$(GNATRTL_OBJS)), \ + $(ADA_EXCLUDE_SRCS)) + +-../stamp-gnatlib-$(RTSDIR): +- @if [ ! -f stamp-gnatlib-$(RTSDIR) ] ; \ +- then \ +- $(ECHO) You must first build the GNAT library: make gnatlib; \ +- false; \ +- else \ +- true; \ +- fi ++libgnat = libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) ++libgnat-sjlj = libgnat$(hyphen)sjlj$(hyphen)$(LIBRARY_VERSION)$(soext) + +-install-gnatlib: ../stamp-gnatlib-$(RTSDIR) ++install-gnatlib: rts-static-zcx/libgnat$(arext) rts-static-sjlj/libgnat$(arext) ++install-gnatlib: rts-shared-zcx/$(libgnat) + # Create the directory before deleting it, in case the directory is + # a list of directories (as it may be on VMS). This ensures we are + # deleting the right one. +- -$(MKDIR) $(DESTDIR)$(ADA_RTL_OBJ_DIR) +- -$(MKDIR) $(DESTDIR)$(ADA_INCLUDE_DIR) +- $(RMDIR) $(DESTDIR)$(ADA_RTL_OBJ_DIR) +- $(RMDIR) $(DESTDIR)$(ADA_INCLUDE_DIR) +- -$(MKDIR) $(DESTDIR)$(ADA_RTL_OBJ_DIR) +- -$(MKDIR) $(DESTDIR)$(ADA_INCLUDE_DIR) +- for file in $(RTSDIR)/*.ali; do \ +- $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ ++ -$(MKDIR) $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR) ++ $(RMDIR) $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR) ++ $(RMDIR) $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR) ++ ++ -$(MKDIR) $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR) ++ $(RMDIR) $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR) ++ $(RMDIR) $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR) ++ -$(MKDIR) $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR) ++ ++ for file in rts-shared-zcx/*.ali; do \ ++ $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR); \ ++ done ++ for file in rts-static-sjlj/*.ali; do \ ++ $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR); \ ++ done ++ ++ -cd rts-static-zcx; for file in *$(arext);do \ ++ $(INSTALL_DATA) $$file $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR); \ ++ $(RANLIB_FOR_TARGET) $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR)/$$file; \ + done +- -cd $(RTSDIR); for file in *$(arext);do \ +- $(INSTALL_DATA) $$file $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ +- $(RANLIB_FOR_TARGET) $(DESTDIR)$(ADA_RTL_OBJ_DIR)/$$file; \ ++ -cd rts-static-sjlj; for file in *$(arext);do \ ++ $(INSTALL_DATA) $$file $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR); \ ++ $(RANLIB_FOR_TARGET) $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR)/$$file; \ + done ++ ++ -$(foreach file, $(EXTRA_ADALIB_FILES), \ ++ $(INSTALL_DATA_DATE) rts-static-zcx/$(file) $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR) && \ ++ ) true + -$(foreach file, $(EXTRA_ADALIB_FILES), \ +- $(INSTALL_DATA_DATE) $(RTSDIR)/$(file) $(DESTDIR)$(ADA_RTL_OBJ_DIR) && \ ++ $(INSTALL_DATA_DATE) rts-static-sjlj/$(file) $(DESTDIR)$(ADA_SJLJ_RTL_OBJ_DIR) && \ + ) true + # Install the shared libraries, if any, using $(INSTALL) instead + # of $(INSTALL_DATA). The latter may force a mode inappropriate + # for shared libraries on some targets, e.g. on HP-UX where the x + # permission is required. +-# Also install the .dSYM directories if they exist (these directories +-# contain the debug information for the shared libraries on darwin) + for file in gnat gnarl; do \ +- if [ -f $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 ]; then \ +- $(INSTALL) $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ +- $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ +- fi; \ +- if [ -d $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).dSYM ]; then \ +- $(CP) -r $(RTSDIR)/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).dSYM \ +- $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ ++ if [ -f rts-shared-zcx/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 ]; then \ ++ $(INSTALL) rts-shared-zcx/lib$${file}$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ $(DESTDIR)$(ADA_NATIVE_RTL_OBJ_DIR); \ + fi; \ + done + # This copy must be done preserving the date on the original file. +- for file in $(RTSDIR)/*.ad?; do \ +- $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_INCLUDE_DIR); \ ++ for file in rts-shared-zcx/*.adb rts-shared-zcx/*.ads; do \ ++ $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR); \ + done +- cd $(DESTDIR)$(ADA_INCLUDE_DIR); $(CHMOD) a-wx *.adb +- cd $(DESTDIR)$(ADA_INCLUDE_DIR); $(CHMOD) a-wx *.ads ++ $(CHMOD) u=rw,go=r $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR)/*.adb ++ $(CHMOD) u=rw,go=r $(DESTDIR)$(ADA_NATIVE_INCLUDE_DIR)/*.ads ++ for file in rts-static-sjlj/*.adb rts-static-sjlj/*.ads; do \ ++ $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR); \ ++ done ++ $(CHMOD) u=rw,go=r $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR)/*.adb ++ $(CHMOD) u=rw,go=r $(DESTDIR)$(ADA_SJLJ_INCLUDE_DIR)/*.ads ++ ++ (cd $(DESTDIR)$(libsubdir); \ ++ ln -s rts-native/adainclude adainclude; \ ++ ln -s rts-native/adalib adalib;) ++ ++replace_zcx_by_default=\ ++'s/ZCX_By_Default.*/ZCX_By_Default : constant Boolean := $(zcx_by_default);/' ++ ++gnatlib-sources-zcx/a-except.ads: dir=$(dir $@) ++gnatlib-sources-zcx/a-except.ads: zcx_by_default=True ++ ++gnatlib-sources-sjlj/a-except.ads: dir=$(dir $@) ++gnatlib-sources-sjlj/a-except.ads: zcx_by_default=False + +-../stamp-gnatlib1-$(RTSDIR): Makefile +- $(RMDIR) $(RTSDIR) +- $(MKDIR) $(RTSDIR) +- $(CHMOD) u+w $(RTSDIR) ++gnatlib-sources-zcx/a-except.ads gnatlib-sources-sjlj/a-except.ads: ++ $(MKDIR) $(dir) ++ $(CHMOD) u+w $(dir) + # Copy target independent sources + $(foreach f,$(ADA_INCLUDE_SRCS) $(LIBGNAT_SRCS), \ +- $(LN_S) $(fsrcpfx)ada/$(f) $(RTSDIR) ;) true ++ $(LN_S) $(fsrcpfx)ada/$(f) $(dir) ;) true + # Remove files not used +- $(RM) $(patsubst %,$(RTSDIR)/%,$(ADA_EXCLUDE_FILES)) ++ $(RM) $(patsubst %,$(dir)/%,$(ADA_EXCLUDE_FILES)) + # Remove files to be replaced by target dependent sources + $(RM) $(foreach PAIR,$(LIBGNAT_TARGET_PAIRS), \ +- $(RTSDIR)/$(word 1,$(subst <, ,$(PAIR)))) +- for f in $(RTSDIR)/*-*-*.ads $(RTSDIR)/*-*-*.adb; do \ ++ $(dir)/$(word 1,$(subst <, ,$(PAIR)))) ++ for f in $(dir)/*-*-*.ads $(dir)/*-*-*.adb; do \ + case "$$f" in \ +- $(RTSDIR)/s-stratt-*) ;; \ ++ $(dir)/s-stratt-*) ;; \ + *) $(RM) $$f ;; \ + esac; \ + done + # Copy new target dependent sources + $(foreach PAIR,$(LIBGNAT_TARGET_PAIRS), \ + $(LN_S) $(fsrcpfx)ada/$(word 2,$(subst <, ,$(PAIR))) \ +- $(RTSDIR)/$(word 1,$(subst <, ,$(PAIR)));) ++ $(dir)/$(word 1,$(subst <, ,$(PAIR)));) ++ sed -e $(replace_zcx_by_default) $(dir)/system.ads > $(dir)/s.ads + # Copy tsystem.h +- $(CP) $(srcdir)/tsystem.h $(RTSDIR) +- $(RM) ../stamp-gnatlib-$(RTSDIR) +- touch ../stamp-gnatlib1-$(RTSDIR) ++ $(CP) $(srcdir)/tsystem.h $(dir) + + ifeq ($(strip $(filter-out alpha64 ia64 dec hp vms% openvms% alphavms%,$(subst -, ,$(host)))),) + OSCONS_CPP=../../$(DECC) -E /comment=as_is -DNATIVE \ +@@ -2457,9 +2482,11 @@ + $(CP) $^ ./bldtools/oscons + (cd ./bldtools/oscons ; gnatmake -q xoscons) + +-$(RTSDIR)/s-oscons.ads: ../stamp-gnatlib1-$(RTSDIR) s-oscons-tmplt.c gsocket.h ./bldtools/oscons/xoscons +- $(RM) $(RTSDIR)/s-oscons-tmplt.i $(RTSDIR)/s-oscons-tmplt.s +- (cd $(RTSDIR) ; \ ++.PRECIOUS: %/s-oscons.ads ++%/s-oscons.ads: dir = $(dir $@) ++%/s-oscons.ads: s-oscons-tmplt.c gsocket.h ./bldtools/oscons/xoscons ++ $(RM) $(dir)/s-oscons-tmplt.i $(dir)/s-oscons-tmplt.s ++ (cd $(dir) ; \ + $(OSCONS_CPP) ; \ + $(OSCONS_EXTRACT) ; \ + ../bldtools/oscons/xoscons s-oscons) +@@ -2470,9 +2497,12 @@ + # Example: cd $(RTSDIR); ar rc libfoo.a $(LONG_LIST_OF_OBJS) + # is guaranteed to overflow the buffer. + +-gnatlib: ../stamp-gnatlib1-$(RTSDIR) $(RTSDIR)/s-oscons.ads ++%/libgnat$(arext): build_dir = $(dir $@) ++%/libgnat$(arext): libgnarl = $(subst libgnat,libgnarl,$@) ++%/libgnat$(arext): libgnala = $(subst libgnat,libgnala,$@) ++%/libgnat$(arext): % %/s-oscons.ads + # C files +- $(MAKE) -C $(RTSDIR) \ ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ +@@ -2481,7 +2511,7 @@ + srcdir=$(fsrcdir) \ + -f ../Makefile $(LIBGNAT_OBJS) + # Ada files +- $(MAKE) -C $(RTSDIR) \ ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + ADA_INCLUDES="" \ +@@ -2490,24 +2520,24 @@ + FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ + srcdir=$(fsrcdir) \ + -f ../Makefile $(GNATRTL_OBJS) +- $(RM) $(RTSDIR)/libgnat$(arext) $(RTSDIR)/libgnarl$(arext) +- $(AR_FOR_TARGET) $(AR_FLAGS) $(RTSDIR)/libgnat$(arext) \ +- $(addprefix $(RTSDIR)/,$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS)) +- $(RANLIB_FOR_TARGET) $(RTSDIR)/libgnat$(arext) +- $(AR_FOR_TARGET) $(AR_FLAGS) $(RTSDIR)/libgnarl$(arext) \ +- $(addprefix $(RTSDIR)/,$(GNATRTL_TASKING_OBJS)) +- $(RANLIB_FOR_TARGET) $(RTSDIR)/libgnarl$(arext) ++ $(RM) $@ $(libgnarl) ++ $(AR_FOR_TARGET) $(AR_FLAGS) $@ \ ++ $(addprefix $(build_dir),$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) g-trasym.o) ++ $(RANLIB_FOR_TARGET) $@ ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(libgnarl) \ ++ $(addprefix $(build_dir),$(GNATRTL_TASKING_OBJS)) ++ $(RANLIB_FOR_TARGET) $(libgnarl) + ifeq ($(GMEM_LIB),gmemlib) +- $(AR_FOR_TARGET) $(AR_FLAGS) $(RTSDIR)/libgmem$(arext) \ +- $(RTSDIR)/memtrack.o +- $(RANLIB_FOR_TARGET) $(RTSDIR)/libgmem$(arext) ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(build_dir)libgmem$(arext) \ ++ $(build_dir)memtrack.o ++ $(RANLIB_FOR_TARGET) $(build_dir)libgmem$(arext) + endif +- $(CHMOD) a-wx $(RTSDIR)/*.ali +- touch ../stamp-gnatlib-$(RTSDIR) + + # Warning: this target assumes that LIBRARY_VERSION has been set correctly. +-gnatlib-shared-default: +- $(MAKE) -C $(RTSDIR) \ ++%/$(libgnat) %/$(libgnat-sjlj): build_dir = $(dir $@) ++%/$(libgnat) %/$(libgnat-sjlj): libgnarl = $(notdir $(subst libgnat,libgnarl,$@)) ++%/$(libgnat) %/$(libgnat-sjlj): % %/s-oscons.ads ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ +@@ -2515,7 +2545,7 @@ + FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ + srcdir=$(fsrcdir) \ + -f ../Makefile $(LIBGNAT_OBJS) +- $(MAKE) -C $(RTSDIR) \ ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + ADA_INCLUDES="" \ +@@ -2525,176 +2555,46 @@ + srcdir=$(fsrcdir) \ + -f ../Makefile \ + $(GNATRTL_OBJS) +- $(RM) $(RTSDIR)/libgna*$(soext) $(RTSDIR)/libgna*$(soext).1 +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \ ++ $(RM) $(build_dir)/libgna*$(soext) $(build_dir)/libgna*$(soext).1 ++ cd $(build_dir); ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ + $(PICFLAG_FOR_TARGET) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ -o $(notdir $@).1 \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ $(SO_OPTS)$(notdir $@).1 \ + $(MISCLIB) -lm +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \ ++ cd $(build_dir); $(LN_S) $(notdir $@).1 $(notdir $@) ++ cd $(build_dir); ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ + $(PICFLAG_FOR_TARGET) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ -o $(libgnarl).1 \ + $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ $(SO_OPTS)$(libgnarl).1 \ + $(THREADSLIB) +- cd $(RTSDIR); for lib in gnat gnarl; do \ +- l=lib$${lib}$(hyphen)$(LIBRARY_VERSION)$(soext); \ +- $(LN_S) $$l.1 $$l; \ +- done +-# Delete the object files, lest they be linked statically into the tools +-# executables. Only the .ali, .a and .so files must remain. +- rm -f $(RTSDIR)/*.o +- $(CHMOD) a-wx $(RTSDIR)/*.ali ++ cd $(build_dir); $(LN_S) $(libgnarl).1 $(libgnarl) + +-gnatlib-shared-dual: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/*.o $(RTSDIR)/*.ali +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-default ++gnatlib-shared-dual: gnatlib-static-zcx gnatlib-static-sjlj gnatlib-shared-zcx + +-gnatlib-shared-dual-win32: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ +- PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/*.o $(RTSDIR)/*.ali +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-win32 +- +-# ??? we need to add the option to support auto-import of arrays/records to +-# the GNATLIBFLAGS when this will be supported by GNAT. At this point we will +-# use the gnatlib-shared-dual-win32 target to build the GNAT runtimes on +-# Windows. +-gnatlib-shared-win32: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C) $(PICFLAG_FOR_TARGET)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/libgna*$(soext) +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared -shared-libgcc \ +- $(PICFLAG_FOR_TARGET) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) $(MISCLIB) +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared -shared-libgcc \ +- $(PICFLAG_FOR_TARGET) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) +- +-gnatlib-shared-darwin: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C) $(PICFLAG_FOR_TARGET) -fno-common" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/libgnat$(soext) $(RTSDIR)/libgnarl$(soext) +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(PICFLAG_FOR_TARGET) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(MISCLIB) +- cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ +- | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(PICFLAG_FOR_TARGET) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) +- cd $(RTSDIR); $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnat$(soext) +- cd $(RTSDIR); $(LN_S) libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnarl$(soext) +- cd $(RTSDIR); dsymutil libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) +- cd $(RTSDIR); dsymutil libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) +- +-gnatlib-shared-vms: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ +- MULTISUBDIR="$(MULTISUBDIR)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) $(RTSDIR)/libgna*$(soext) +- cd $(RTSDIR) && \ +- ../../gnatsym -s SYMVEC_$$$$.opt \ +- $(LIBGNAT_OBJS) $(GNATRTL_NONTASKING_OBJS) && \ +- ../../xgcc -g -B../../ -shared -shared-libgcc \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) libgnat.a \ +- sys\$$library:trace.exe \ +- --for-linker=/noinform \ +- --for-linker=SYMVEC_$$$$.opt \ +- --for-linker=gsmatch=equal,$(GSMATCH_VERSION) +- cd $(RTSDIR) && \ +- ../../gnatsym -s SYMVEC_$$$$.opt \ +- $(GNATRTL_TASKING_OBJS) && \ +- ../../xgcc -g -B../../ -shared -shared-libgcc \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnarl.a libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- sys\$$library:trace.exe \ +- --for-linker=/noinform \ +- --for-linker=SYMVEC_$$$$.opt \ +- --for-linker=gsmatch=equal,$(GSMATCH_VERSION) +- +-gnatlib-shared: ++gnatlib-shared-zcx: rts = $(subst gnatlib,rts,$@) ++gnatlib-shared-zcx: gnatlib-sources-zcx/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-zcx $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ ++ EH_MECHANISM="-gcc" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ + PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \ +- $(GNATLIB_SHARED) ++ $(rts)/$(libgnat) + +-# When building a SJLJ runtime for VxWorks, in addition to forcing +-# ZCX_By_default to False, we need to ensure that extra linker options +-# are not passed to prevent the inclusion of useless objects and +-# potential troubles from the presence of extra symbols and references +-# in some configurations. The inhibition is performed by commenting +-# the pragma instead of deleting the line, as the latter might result +-# in getting multiple blank lines, hence a style check error, as a +-# result. +-gnatlib-sjlj: +- $(MAKE) $(FLAGS_TO_PASS) EH_MECHANISM="" \ +- THREAD_KIND="$(THREAD_KIND)" ../stamp-gnatlib1-$(RTSDIR) +- sed -e 's/ZCX_By_Default.*/ZCX_By_Default : constant Boolean := False;/' $(RTSDIR)/system.ads > $(RTSDIR)/s.ads +- sed -e 's/\(pragma Linker.*crtbe.*\)/-- \1/' $(RTSDIR)/s.ads > $(RTSDIR)/s2.ads +- $(RM) $(RTSDIR)/s.ads +- $(MV) $(RTSDIR)/s2.ads $(RTSDIR)/system.ads ++gnatlib-static-sjlj: rts = $(subst gnatlib,rts,$@) ++gnatlib-static-sjlj: gnatlib-sources-sjlj/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-sjlj $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ + EH_MECHANISM="" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +@@ -2703,13 +2603,15 @@ + FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" gnatlib ++ PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \ ++ $(rts)/libgnat.a + +-gnatlib-zcx: +- $(MAKE) $(FLAGS_TO_PASS) EH_MECHANISM="-gcc" \ +- THREAD_KIND="$(THREAD_KIND)" ../stamp-gnatlib1-$(RTSDIR) +- sed -e 's/ZCX_By_Default.*/ZCX_By_Default : constant Boolean := True;/' $(RTSDIR)/system.ads > $(RTSDIR)/s.ads +- $(MV) $(RTSDIR)/s.ads $(RTSDIR)/system.ads ++gnatlib-static-zcx: rts = $(subst gnatlib,rts,$@) ++gnatlib-static-zcx: gnatlib-sources-zcx/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-zcx $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ + EH_MECHANISM="-gcc" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +@@ -2718,10 +2620,15 @@ + FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ + MULTISUBDIR="$(MULTISUBDIR)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" gnatlib ++ PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \ ++ $(rts)/libgnat$(arext) + + ADA_INCLUDE_DIR = $(libsubdir)/adainclude + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib ++ADA_NATIVE_INCLUDE_DIR = $(libsubdir)/rts-native/adainclude ++ADA_NATIVE_RTL_OBJ_DIR = $(libsubdir)/rts-native/adalib ++ADA_SJLJ_INCLUDE_DIR = $(libsubdir)/rts-sjlj/adainclude ++ADA_SJLJ_RTL_OBJ_DIR = $(libsubdir)/rts-sjlj/adalib + + # Special flags + +Index: b/src/gnattools/Makefile.in +=================================================================== +--- a/src/gnattools/Makefile.in ++++ b/src/gnattools/Makefile.in +@@ -36,15 +36,16 @@ + LN_S=@LN_S@ + target_noncanonical=@target_noncanonical@ + ++RTS=../gcc/ada/rts-shared-zcx + CFLAGS=-O2 -Wall + ADA_CFLAGS=-O2 -gnatn +-ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I../libgnatvsn -I../libgnatprj ++ADA_INCLUDES=-nostdinc -I- -I. -I$(RTS) -I../libgnatvsn -I../libgnatprj + LIB_VERSION=$(strip $(shell grep ' Library_Version :' \ + ../libgnatvsn/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) +-SHARED_ADA_LIBS := -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++SHARED_ADA_LIBS := -L$(RTS) -lgnat-$(LIB_VERSION) + SHARED_ADA_LIBS += -L../libgnatvsn -lgnatvsn + SHARED_ADA_LIBS += -L../libgnatprj -lgnatprj +-STATIC_ADA_LIBS := ../gcc/ada/rts/libgnat.a ++STATIC_ADA_LIBS := ../gcc/ada/rts-static-zcx/libgnat.a + STATIC_GCC_LIBS := ../gcc/libcommon-target.a ../gcc/libcommon.a ../libcpp/libcpp.a \ + ../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a + +@@ -118,6 +119,7 @@ + + .PHONY: gnattools gnattools-native gnattools-cross regnattools + gnattools: @default_gnattools_target@ ++ (cd $(RTS); if [ -d obj ]; then mv obj/* .; rmdir obj; fi) + + BODIES := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.adb,$(f)))) + SPECS := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.ads,$(f)))) +@@ -133,9 +135,12 @@ + rm -f $(word 1,$(subst <, ,$(PAIR)));\ + $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ + $(word 1,$(subst <, ,$(PAIR)));) ++# Move the RTS object files away lest they be linked statically into the ++# tools. Only the .ali, .a and .so files must remain. ++ (cd $(RTS); mkdir obj; mv *.o obj; chmod a-wx *.ali) + touch $@ + +-gnattools-native: ../gcc/ada/rts/libgnat-$(LIB_VERSION).so ++gnattools-native: $(RTS)/libgnat-$(LIB_VERSION).so + gnattools-native: ../libgnatvsn/libgnatvsn.so + gnattools-native: stamp-gnattools-sources + gnattools-native: $(TOOLS) +@@ -151,7 +156,7 @@ + $(GCC) -o $@ $^ \ + ../libgnatprj/libgnatprj.a \ + ../libgnatvsn/libgnatvsn.a \ +- ../gcc/ada/rts/libgnat.a $(STATIC_GCC_LIBS) ++ $(STATIC_ADA_LIBS) $(STATIC_GCC_LIBS) + + gnatlink: $(GNATLINK_OBJS) b_gnatl.o + $(GCC) -o $@ $^ $(SHARED_ADA_LIBS) $(STATIC_GCC_LIBS) +Index: b/src/libgnatprj/Makefile.in +=================================================================== +--- a/src/libgnatprj/Makefile.in ++++ b/src/libgnatprj/Makefile.in +@@ -26,7 +26,8 @@ + sed -e 's/.*"\(.*\)".*/\1/')) + GCC:=../gcc/xgcc -B../gcc/ + GPP := ../gcc/xg++ -B../gcc/ +-LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++RTS:=../gcc/ada/rts-shared-zcx ++LIBGNAT_JUST_BUILT := -nostdinc -I$(RTS) + LIBGNATVSN := -I../libgnatvsn + CFLAGS := -g -O2 + ADAFLAGS := -g -O2 -gnatn +@@ -76,7 +77,7 @@ + : # Make libgnatprj.so + $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ -Wl,--no-allow-shlib-undefined \ + $^ $(addprefix ../libiberty/pic/,$(LIBIBERTY_OBJECTS)) \ +- -L../gcc/ada/rts -lgnat-$(LIB_VERSION) \ ++ -L$(RTS) -lgnat-$(LIB_VERSION) \ + -L../libgnatvsn -lgnatvsn + $(LN_S) -f libgnatprj.so.$(LIB_VERSION) libgnatprj.so + chmod a=r obj-shared/*.ali +Index: b/src/libgnatvsn/Makefile.in +=================================================================== +--- a/src/libgnatvsn/Makefile.in ++++ b/src/libgnatvsn/Makefile.in +@@ -25,7 +25,8 @@ + @srcdir@/../gcc/ada/gnatvsn.ads | \ + sed -e 's/.*"\(.*\)".*/\1/')) + GCC:=../gcc/xgcc -B../gcc/ +-LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++RTS:=../gcc/ada/rts-shared-zcx ++LIBGNAT_JUST_BUILT := -nostdinc -I$(RTS) + CFLAGS := -g -O2 -gnatn + BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) + DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) +@@ -66,7 +67,7 @@ + libgnatvsn.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) + : # Make libgnatvsn.so + $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ +- -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ -L$(RTS) -lgnat-$(LIB_VERSION) + ln -s libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so + chmod a=r obj-shared/*.ali + # Make the .ali files, but not the .o files, visible to the gnat tools. +Index: b/src/gcc/ada/gcc-interface/Make-lang.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Make-lang.in ++++ b/src/gcc/ada/gcc-interface/Make-lang.in +@@ -85,7 +85,8 @@ + "ADA_FOR_TARGET=$(ADA_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ +- "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" ++ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ ++ "GCC_FOR_TARGET=$(GCC_FOR_TARGET)" + + # List of Ada tools to build and install + ADA_TOOLS=gnatbind gnatchop gnat gnatkr gnatlink gnatls gnatmake \ --- gcc-4.8-4.8.2.orig/debian/patches/ada-symbolic-tracebacks.diff +++ gcc-4.8-4.8.2/debian/patches/ada-symbolic-tracebacks.diff @@ -0,0 +1,396 @@ +# DP: - Enable support for symbolic tracebacks in exceptions (delete the dummy +# DP: convert_addresses from adaint.c, and provide a real one separately.) + +Ported Jürgen Pfeifer's patch to enable symbolic tracebacks on Debian +GNU/Linux. + +The binary distribution of GNAT 3.15p comes with an old version of +binutils that includes a library, libaddr2line.a. This library does +not exist in recent versions of binutils. The patch works around this +by calling /usr/bin/addr2line (still part of binutils) and parsing the +output. See debian/convert_addresses.c for the gory details. + +I have modified convert_addresses.c to not use a shell script anymore; +Debian controls the version of binutils which is installed. Also, I +use execve instead of execle. + +-- +Ludovic Brenta. + +# ' make emacs highlighting happy + +Index: b/src/gcc/ada/gcc-interface/Makefile.in +=================================================================== +--- a/src/gcc/ada/gcc-interface/Makefile.in ++++ b/src/gcc/ada/gcc-interface/Makefile.in +@@ -273,7 +273,8 @@ + # Both . and srcdir are used, in that order, + # so that tm.h and config.h will be found in the compilation + # subdirectory rather than in the source directory. +-INCLUDES = -I- -I. -I.. -I$(srcdir)/ada -I$(srcdir) -I$(srcdir)/../include $(GMPINC) ++INCLUDES = -iquote . -iquote .. -iquote $(srcdir)/ada -iquote$(srcdir) \ ++ -iquote $(srcdir)/../include $(GMPINC) + + ADA_INCLUDES = -I- -I. -I$(srcdir)/ada + +@@ -2317,7 +2318,7 @@ + # library. LIBGNAT_OBJS is the list of object files for libgnat. + # thread.c is special as put into GNATRTL_TASKING_OBJS by Makefile.rtl + LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o \ +- cal.o cio.o cstreams.o ctrl_c.o \ ++ cal.o cio.o convert_addresses.o cstreams.o ctrl_c.o \ + env.o errno.o exit.o expect.o final.o \ + init.o initialize.o locales.o mkdir.o \ + raise.o seh_init.o socket.o sysdep.o \ +@@ -2996,6 +2997,7 @@ + socket.o : socket.c gsocket.h + sysdep.o : sysdep.c + raise.o : raise.c raise.h ++convert_addresses.o : convert_addresses.c + sigtramp-ppcvxw.o : sigtramp-ppcvxw.c sigtramp.h + terminals.o : terminals.c + vx_stack_info.o : vx_stack_info.c +Index: b/src/gcc/ada/adaint.c +=================================================================== +--- a/src/gcc/ada/adaint.c ++++ b/src/gcc/ada/adaint.c +@@ -3508,35 +3508,6 @@ + } + #endif + +-#if defined (IS_CROSS) \ +- || (! ((defined (sparc) || defined (i386)) && defined (sun) \ +- && defined (__SVR4)) \ +- && ! (defined (linux) && (defined (i386) || defined (__x86_64__))) \ +- && ! (defined (linux) && defined (__ia64__)) \ +- && ! (defined (linux) && defined (powerpc)) \ +- && ! defined (__FreeBSD__) \ +- && ! defined (__Lynx__) \ +- && ! defined (__hpux__) \ +- && ! defined (__APPLE__) \ +- && ! defined (_AIX) \ +- && ! defined (VMS) \ +- && ! defined (__MINGW32__)) +- +-/* Dummy function to satisfy g-trasym.o. See the preprocessor conditional +- just above for a list of native platforms that provide a non-dummy +- version of this procedure in libaddr2line.a. */ +- +-void +-convert_addresses (const char *file_name ATTRIBUTE_UNUSED, +- void *addrs ATTRIBUTE_UNUSED, +- int n_addr ATTRIBUTE_UNUSED, +- void *buf ATTRIBUTE_UNUSED, +- int *len ATTRIBUTE_UNUSED) +-{ +- *len = 0; +-} +-#endif +- + #if defined (_WIN32) + int __gnat_argument_needs_quote = 1; + #else +Index: b/src/gcc/ada/convert_addresses.c +=================================================================== +--- /dev/null ++++ b/src/gcc/ada/convert_addresses.c +@@ -0,0 +1,154 @@ ++/* ++ Copyright (C) 1999 by Juergen Pfeifer ++ Ada for Linux Team (ALT) ++ ++ Permission is hereby granted, free of charge, to any person obtaining a ++ copy of this software and associated documentation files (the ++ "Software"), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, distribute with modifications, sublicense, and/or sell ++ copies of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ++ THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++ Except as contained in this notice, the name(s) of the above copyright ++ holders shall not be used in advertising or otherwise to promote the ++ sale, use or other dealings in this Software without prior written ++ authorization. ++*/ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define STDIN_FILENO 0 ++#define STDOUT_FILENO 1 ++#define MAX_LINE 1024 ++ ++#define CLOSE1 close(fd1[0]); close(fd1[1]) ++#define CLOSE2 close(fd2[0]); close(fd2[1]) ++#define RESTSIG sigaction(SIGPIPE,&oact,NULL) ++ ++void convert_addresses ++(const char *file_name, ++ void* addrs[], ++ int n_addr, ++ char* buf, ++ int* len) ++{ ++ int max_len = *len; ++ pid_t pid = getpid(); ++ pid_t child; ++ ++ struct sigaction act, oact; ++ ++ int fd1[2], fd2[2]; ++ ++ *buf = 0; *len = 0; ++ act.sa_handler = SIG_IGN; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = 0; ++ if (sigaction(SIGPIPE,&act,&oact) < 0) ++ return; ++ ++ if (pipe(fd1) >= 0) { ++ if (pipe(fd2)>=0) { ++ if ((child = fork()) < 0) { ++ CLOSE1; CLOSE2; RESTSIG; ++ return; ++ } ++ else { ++ if (0==child) { ++ close(fd1[1]); ++ close(fd2[0]); ++ if (fd1[0] != STDIN_FILENO) { ++ if (dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO) { ++ CLOSE1; CLOSE2; ++ } ++ close(fd1[0]); ++ } ++ if (fd2[1] != STDOUT_FILENO) { ++ if (dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO) { ++ CLOSE1; CLOSE2; ++ } ++ close(fd2[1]); ++ } ++ { ++ /* As pointed out by Florian Weimer to me, it is a ++ security threat to call the script with a user defined ++ environment and using the path. That would be Trojans ++ pleasure. Therefore we use the absolute path to ++ addr2line and an empty environment. That should be ++ safe. ++ */ ++ char *const argv[] = { "addr2line", ++ "-e", ++ file_name, ++ "--demangle=gnat", ++ "--functions", ++ "--basenames", ++ NULL }; ++ char *const envp[] = { NULL }; ++ if (execve("/usr/bin/addr2line", argv, envp) < 0) { ++ CLOSE1; CLOSE2; ++ } ++ } ++ } ++ else { ++ int i, n; ++ char hex[16]; ++ char line[MAX_LINE + 1]; ++ char *p; ++ char *s = buf; ++ ++ /* Parent context */ ++ close(fd1[0]); ++ close(fd2[1]); ++ ++ for(i=0; i < n_addr; i++) { ++ snprintf(hex,sizeof(hex),"%p\n",addrs[i]); ++ write(fd1[1],hex,strlen(hex)); ++ n = read(fd2[0],line,MAX_LINE); ++ if (n<=0) ++ break; ++ line[n]=0; ++ /* We have approx. 16 additional chars for "%p in " clause. ++ We use this info to prevent a buffer overrun. ++ */ ++ if (n + 16 + (*len) > max_len) ++ break; ++ p = strchr(line,'\n'); ++ if (p) { ++ if (*(p+1)) { ++ *p = 0; ++ *len += snprintf(s, (max_len - (*len)), "%p in %s at %s",addrs[i], line, p+1); ++ } ++ else { ++ *len += snprintf(s, (max_len - (*len)), "%p at %s",addrs[i], line); ++ } ++ s = buf + (*len); ++ } ++ } ++ close(fd1[1]); ++ close(fd2[0]); ++ } ++ } ++ } ++ else { ++ CLOSE1; ++ } ++ } ++ RESTSIG; ++} +Index: b/src/gcc/ada/g-trasym.adb +=================================================================== +--- a/src/gcc/ada/g-trasym.adb ++++ b/src/gcc/ada/g-trasym.adb +@@ -33,40 +33,110 @@ + -- is not supported. It returns tracebacks as lists of LF separated strings of + -- the form "0x..." corresponding to the addresses. + ++with System.Soft_Links; + with Ada.Exceptions.Traceback; use Ada.Exceptions.Traceback; +-with System.Address_Image; + + package body GNAT.Traceback.Symbolic is + ++ package TSL renames System.Soft_Links; ++ ++ -- To perform the raw addresses to symbolic form translation we rely on a ++ -- libaddr2line symbolizer which examines debug info from a provided ++ -- executable file name, and an absolute path is needed to ensure the file ++ -- is always found. This is "__gnat_locate_exec_on_path (gnat_argv [0])" ++ -- for our executable file, a fairly heavy operation so we cache the ++ -- result. ++ ++ Exename : System.Address; ++ -- Pointer to the name of the executable file to be used on all ++ -- invocations of the libaddr2line symbolization service. ++ ++ Exename_Resolved : Boolean := False; ++ -- Flag to indicate whether we have performed the executable file name ++ -- resolution already. Relying on a not null Exename for this purpose ++ -- would be potentially inefficient as this is what we will get if the ++ -- resolution attempt fails. ++ + ------------------------ + -- Symbolic_Traceback -- + ------------------------ + + function Symbolic_Traceback (Traceback : Tracebacks_Array) return String is ++ ++ procedure convert_addresses ++ (filename : System.Address; ++ addrs : System.Address; ++ n_addrs : Integer; ++ buf : System.Address; ++ len : System.Address); ++ pragma Import (C, convert_addresses, "convert_addresses"); ++ -- This is the procedure version of the Ada-aware addr2line. It places ++ -- in BUF a string representing the symbolic translation of the N_ADDRS ++ -- raw addresses provided in ADDRS, looked up in debug information from ++ -- FILENAME. LEN points to an integer which contains the size of the ++ -- BUF buffer at input and the result length at output. ++ -- ++ -- Note that this procedure is *not* thread-safe. ++ ++ type Argv_Array is array (0 .. 0) of System.Address; ++ gnat_argv : access Argv_Array; ++ pragma Import (C, gnat_argv, "gnat_argv"); ++ ++ function locate_exec_on_path ++ (c_exename : System.Address) return System.Address; ++ pragma Import (C, locate_exec_on_path, "__gnat_locate_exec_on_path"); ++ ++ B_Size : constant Integer := 256 * Traceback'Length; ++ Len : Integer := B_Size; ++ Res : String (1 .. B_Size); ++ ++ use type System.Address; ++ + begin ++ -- The symbolic translation of an empty set of addresses is an empty ++ -- string. ++ + if Traceback'Length = 0 then + return ""; ++ end if; + +- else +- declare +- Img : String := System.Address_Image (Traceback (Traceback'First)); ++ -- If our input set of raw addresses is not empty, resort to the ++ -- libaddr2line service to symbolize it all. + +- Result : String (1 .. (Img'Length + 3) * Traceback'Length); +- Last : Natural := 0; ++ -- Compute, cache and provide the absolute path to our executable file ++ -- name as the binary file where the relevant debug information is to be ++ -- found. If the executable file name resolution fails, we have no ++ -- sensible basis to invoke the symbolizer at all. ++ ++ -- Protect all this against concurrent accesses explicitly, as the ++ -- underlying services are potentially thread unsafe. ++ ++ TSL.Lock_Task.all; ++ ++ if not Exename_Resolved then ++ Exename := locate_exec_on_path (gnat_argv (0)); ++ Exename_Resolved := True; ++ end if; ++ ++ if Exename /= System.Null_Address then ++ Len := Res'Length; ++ convert_addresses ++ (Exename, Traceback'Address, Traceback'Length, ++ Res (1)'Address, Len'Address); ++ end if; ++ ++ TSL.Unlock_Task.all; + +- begin +- for J in Traceback'Range loop +- Img := System.Address_Image (Traceback (J)); +- Result (Last + 1 .. Last + 2) := "0x"; +- Last := Last + 2; +- Result (Last + 1 .. Last + Img'Length) := Img; +- Last := Last + Img'Length + 1; +- Result (Last) := ASCII.LF; +- end loop; ++ -- Return what the addr2line symbolizer has produced if we have called ++ -- it (the executable name resolution succeeded), or an empty string ++ -- otherwise. + +- return Result (1 .. Last); +- end; ++ if Exename /= System.Null_Address then ++ return Res (1 .. Len); ++ else ++ return ""; + end if; ++ + end Symbolic_Traceback; + + function Symbolic_Traceback (E : Exception_Occurrence) return String is +Index: b/src/gcc/ada/tracebak.c +=================================================================== +--- a/src/gcc/ada/tracebak.c ++++ b/src/gcc/ada/tracebak.c +@@ -425,7 +425,7 @@ + /* Starting with GCC 4.6, -fomit-frame-pointer is turned on by default for + 32-bit x86/Linux as well and DWARF 2 unwind tables are emitted instead. + See the x86-64 case below for the drawbacks with this approach. */ +-#if defined (linux) && (__GNUC__ * 10 + __GNUC_MINOR__ > 45) ++#if (defined (linux) || defined(__GNU__)) && (__GNUC__ * 10 + __GNUC_MINOR__ > 45) + #define USE_GCC_UNWINDER + #else + #define USE_GENERIC_UNWINDER --- gcc-4.8-4.8.2.orig/debian/patches/alpha-ieee-doc.diff +++ gcc-4.8-4.8.2/debian/patches/alpha-ieee-doc.diff @@ -0,0 +1,24 @@ +# DP: #212912 +# DP: on alpha-linux, make -mieee default and add -mieee-disable switch +# DP: to turn default off (doc patch) + +--- + gcc/doc/invoke.texi | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -9980,6 +9980,13 @@ able to correctly support denormalized numbers and exceptional IEEE + values such as not-a-number and plus/minus infinity. Other Alpha + compilers call this option @option{-ieee_with_no_inexact}. + ++DEBIAN SPECIFIC: This option is on by default for alpha-linux-gnu, unless ++@option{-ffinite-math-only} (which is part of the @option{-ffast-math} ++set) is specified, because the software functions in the GNU libc math ++libraries generate denormalized numbers, NaNs, and infs (all of which ++will cause a programs to SIGFPE when it attempts to use the results without ++@option{-mieee}). ++ + @item -mieee-with-inexact + @opindex mieee-with-inexact + This is like @option{-mieee} except the generated code also maintains --- gcc-4.8-4.8.2.orig/debian/patches/alpha-ieee.diff +++ gcc-4.8-4.8.2/debian/patches/alpha-ieee.diff @@ -0,0 +1,21 @@ +# DP: #212912 +# DP: on alpha-linux, make -mieee default and add -mieee-disable switch +# DP: to turn default off + +--- + gcc/config/alpha/alpha.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +--- a/src/gcc/config/alpha/alpha.c ++++ b/src/gcc/config/alpha/alpha.c +@@ -259,6 +259,10 @@ + int line_size = 0, l1_size = 0, l2_size = 0; + int i; + ++ /* If not -ffinite-math-only, enable -mieee*/ ++ if (!flag_finite_math_only) ++ target_flags |= MASK_IEEE|MASK_IEEE_CONFORMANT; ++ + #ifdef SUBTARGET_OVERRIDE_OPTIONS + SUBTARGET_OVERRIDE_OPTIONS; + #endif --- gcc-4.8-4.8.2.orig/debian/patches/alpha-no-ev4-directive.diff +++ gcc-4.8-4.8.2/debian/patches/alpha-no-ev4-directive.diff @@ -0,0 +1,32 @@ +# DP: never emit .ev4 directive. + +--- + gcc/config/alpha/alpha.c | 7 +++---- + 1 files changed, 3 insertions(+), 4 deletions(-) + +Index: b/src/gcc/config/alpha/alpha.c +=================================================================== +--- a/src/gcc/config/alpha/alpha.c ++++ b/src/gcc/config/alpha/alpha.c +@@ -9363,7 +9363,7 @@ + fputs ("\t.set nomacro\n", asm_out_file); + if (TARGET_SUPPORT_ARCH | TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX) + { +- const char *arch; ++ const char *arch = NULL; + + if (alpha_cpu == PROCESSOR_EV6 || TARGET_FIX || TARGET_CIX) + arch = "ev6"; +@@ -9373,10 +9373,9 @@ + arch = "ev56"; + else if (alpha_cpu == PROCESSOR_EV5) + arch = "ev5"; +- else +- arch = "ev4"; + +- fprintf (asm_out_file, "\t.arch %s\n", arch); ++ if (arch) ++ fprintf (asm_out_file, "\t.arch %s\n", arch); + } + } + --- gcc-4.8-4.8.2.orig/debian/patches/aotcompile.diff +++ gcc-4.8-4.8.2/debian/patches/aotcompile.diff @@ -0,0 +1,51 @@ +--- ./build/aot/aotcompile.py.orig 2010-04-08 13:38:27.621086079 +0000 ++++ ./build/aot/aotcompile.py 2010-04-08 14:22:55.102335973 +0000 +@@ -31,12 +31,25 @@ + "dbtool": "/usr/lib/gcc-snapshot/bin/gcj-dbtool"} + + MAKEFLAGS = [] +-GCJFLAGS = ["-fPIC", "-findirect-dispatch", "-fjni"] ++GCJFLAGS = ["-O2 -fPIC", "-findirect-dispatch", "-fjni"] + LDFLAGS = ["-Wl,-Bsymbolic"] + + MAX_CLASSES_PER_JAR = 1024 + MAX_BYTES_PER_JAR = 1048576 + ++try: ++ for line in file('/proc/meminfo'): ++ if line.startswith('MemTotal:'): ++ memtotal = int(line.split()[1]) ++ if memtotal < 270000: ++ MAX_CLASSES_PER_JAR = 512 ++ MAX_BYTES_PER_JAR = 524288 ++ if memtotal < 140000: ++ MAX_CLASSES_PER_JAR = 256 ++ MAX_BYTES_PER_JAR = 262144 ++except: ++ pass ++ + MAKEFILE = "Makefile" + + MAKEFILE_HEADER = '''\ +@@ -49,7 +62,7 @@ + $(GCJ) -c $(GCJFLAGS) $< -o $@ + + TARGETS = \\ +-%(targets)s ++javac ecj1 + + all: $(TARGETS)''' + +@@ -63,6 +76,12 @@ + %(dso)s: $(%(base)s_OBJECTS) + $(GCJ) -shared $(GCJFLAGS) $(LDFLAGS) $^ -o $@ + ++javac: $(%(base)s_OBJECTS) resources.o ++ $(GCJ) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.Main $^ -o $@ ++ ++ecj1: $(%(base)s_OBJECTS) resources.o ++ $(GCJ) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.GCCMain $^ -o $@ ++ + %(db)s: $(%(base)s_SOURCES) + $(DBTOOL) -n $@ 64 + for jar in $^; do \\ --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-defaults.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-defaults.diff @@ -0,0 +1,92 @@ +# DP: Set MULTILIB_DEFAULTS for ARM multilib builds + +Index: b/src/gcc/config.gcc +=================================================================== +--- a/src/gcc/config.gcc ++++ b/src/gcc/config.gcc +@@ -3249,10 +3249,18 @@ + esac + + case "$with_float" in +- "" \ +- | soft | hard | softfp) ++ "") + # OK + ;; ++ soft) ++ tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=0" ++ ;; ++ softfp) ++ tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=1" ++ ;; ++ hard) ++ tm_defines="${tm_defines} TARGET_CONFIGURED_FLOAT_ABI=2" ++ ;; + *) + echo "Unknown floating point type used in --with-float=$with_float" 1>&2 + exit 1 +@@ -3289,6 +3297,9 @@ + "" \ + | arm | thumb ) + #OK ++ if test "$with_mode" = thumb; then ++ tm_defines="${tm_defines} TARGET_CONFIGURED_THUMB_MODE=1" ++ fi + ;; + *) + echo "Unknown mode used in --with-mode=$with_mode" +Index: b/src/gcc/config/arm/linux-eabi.h +=================================================================== +--- a/src/gcc/config/arm/linux-eabi.h ++++ b/src/gcc/config/arm/linux-eabi.h +@@ -43,7 +43,21 @@ + target hardware. If you override this to use the hard-float ABI then + change the setting of GLIBC_DYNAMIC_LINKER_DEFAULT as well. */ + #undef TARGET_DEFAULT_FLOAT_ABI ++#ifdef TARGET_CONFIGURED_FLOAT_ABI ++#if TARGET_CONFIGURED_FLOAT_ABI == 2 ++#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD ++#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=hard" ++#elif TARGET_CONFIGURED_FLOAT_ABI == 1 ++#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFTFP ++#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=softfp" ++#else ++#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT ++#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=soft" ++#endif ++#else + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT ++#define MULTILIB_DEFAULT_FLOAT_ABI "mfloat-abi=soft" ++#endif + + /* We default to the "aapcs-linux" ABI so that enums are int-sized by + default. */ +@@ -86,6 +100,28 @@ + %{mfloat-abi=soft*:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "} \ + %{!mfloat-abi=*:" GLIBC_DYNAMIC_LINKER_DEFAULT "}" + ++/* Set the multilib defaults according the configuration, needed to ++ let gcc -print-multi-dir do the right thing. */ ++ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define MULTILIB_DEFAULT_ENDIAN "mbig-endian" ++#else ++#define MULTILIB_DEFAULT_ENDIAN "mlittle-endian" ++#endif ++ ++#ifndef TARGET_CONFIGURED_THUMB_MODE ++#define MULTILIB_DEFAULT_MODE "marm" ++#elif TARGET_CONFIGURED_THUMB_MODE == 1 ++#define MULTILIB_DEFAULT_MODE "mthumb" ++#else ++#define MULTILIB_DEFAULT_MODE "marm" ++#endif ++ ++#undef MULTILIB_DEFAULTS ++#define MULTILIB_DEFAULTS \ ++ { MULTILIB_DEFAULT_MODE, MULTILIB_DEFAULT_ENDIAN, \ ++ MULTILIB_DEFAULT_FLOAT_ABI, "mno-thumb-interwork" } ++ + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to + use the GNU/Linux version, not the generic BPABI version. */ + #undef LINK_SPEC --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-soft-cross.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-soft-cross.diff @@ -0,0 +1,27 @@ +# DP: ARM hard/soft float multilib support + +Index: b/src/gcc/config/arm/t-linux-eabi +=================================================================== +--- a/src/gcc/config/arm/t-linux-eabi ++++ b/src/gcc/config/arm/t-linux-eabi +@@ -21,6 +21,20 @@ + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++ifeq ($(with_float),hard) ++MULTILIB_OPTIONS = mfloat-abi=soft/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float mfloat-abi?soft=mfloat-abi?softfp ++MULTILIB_OSDIRNAMES = ../libsf:arm-linux-gnueabi ../lib:arm-linux-gnueabihf ++else ++MULTILIB_OPTIONS = mfloat-abi=soft/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float mfloat-abi?soft=mfloat-abi?softfp ++MULTILIB_OSDIRNAMES = ../lib:arm-linux-gnueabi ../libhf:arm-linux-gnueabihf ++endif ++ + #MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te + #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te + #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-soft-float.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-soft-float.diff @@ -0,0 +1,26 @@ +--- a/src/gcc/config/arm/t-linux-eabi ++++ b/src/gcc/config/arm/t-linux-eabi +@@ -24,6 +24,23 @@ + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++ifneq (,$(findstring MULTIARCH_DEFAULTS,$(tm_defines))) ++ifneq (,$(findstring __arm_linux_gnueabi__,$(tm_defines))) ++ MULTILIB_OPTIONS = mfloat-abi=softfp/mfloat-abi=hard/mfloat-abi=soft ++ MULTILIB_DIRNAMES = . hf soft-float ++ MULTILIB_EXCEPTIONS = ++ MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float ++ MULTILIB_OSDIRNAMES = ../../lib/arm-linux-gnueabi ../../lib/arm-linux-gnueabihf soft-float ++endif ++ifneq (,$(findstring __arm_linux_gnueabihf__,$(tm_defines))) ++ MULTILIB_OPTIONS = mfloat-abi=hard/mfloat-abi=softfp/mfloat-abi=soft ++ MULTILIB_DIRNAMES = . sf soft-float ++ MULTILIB_EXCEPTIONS = ++ MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float ++ MULTILIB_OSDIRNAMES = ../../lib/arm-linux-gnueabihf ../../lib/arm-linux-gnueabi soft-float ++endif ++endif ++ + #MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te + #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te + #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-soft.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-soft.diff @@ -0,0 +1,27 @@ +# DP: ARM hard/soft float multilib support + +Index: b/src/gcc/config/arm/t-linux-eabi +=================================================================== +--- a/src/gcc/config/arm/t-linux-eabi ++++ b/src/gcc/config/arm/t-linux-eabi +@@ -21,6 +21,20 @@ + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++ifeq ($(with_float),hard) ++MULTILIB_OPTIONS = mfloat-abi=soft/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float mfloat-abi?soft=mfloat-abi?softfp ++MULTILIB_OSDIRNAMES = arm-linux-gnueabi:arm-linux-gnueabi ../lib:arm-linux-gnueabihf ++else ++MULTILIB_OPTIONS = mfloat-abi=soft/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?soft=msoft-float mfloat-abi?soft=mfloat-abi?softfp ++MULTILIB_OSDIRNAMES = ../lib:arm-linux-gnueabi arm-linux-gnueabihf:arm-linux-gnueabihf ++endif ++ + #MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te + #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te + #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-softfp-cross.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-softfp-cross.diff @@ -0,0 +1,27 @@ +# DP: ARM hard/softfp float multilib support + +Index: b/src/gcc/config/arm/t-linux-eabi +=================================================================== +--- a/src/gcc/config/arm/t-linux-eabi 2011-01-03 20:52:22.000000000 +0000 ++++ b/src/gcc/config/arm/t-linux-eabi 2011-08-21 21:08:47.583351817 +0000 +@@ -24,6 +24,20 @@ + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++ifeq ($(with_float),hard) ++MULTILIB_OPTIONS = mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?softfp=msoft-float mfloat-abi?softfp=mfloat-abi?soft ++MULTILIB_OSDIRNAMES = ../libsf:arm-linux-gnueabi ../lib:arm-linux-gnueabihf ++else ++MULTILIB_OPTIONS = mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?softfp=msoft-float mfloat-abi?softfp=mfloat-abi?soft ++MULTILIB_OSDIRNAMES = ../lib:arm-linux-gnueabi ../libhf:arm-linux-gnueabihf ++endif ++ + #MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te + #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te + #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* --- gcc-4.8-4.8.2.orig/debian/patches/arm-multilib-softfp.diff +++ gcc-4.8-4.8.2/debian/patches/arm-multilib-softfp.diff @@ -0,0 +1,27 @@ +# DP: ARM hard/softfp float multilib support + +Index: b/src/gcc/config/arm/t-linux-eabi +=================================================================== +--- a/src/gcc/config/arm/t-linux-eabi 2011-01-03 20:52:22.000000000 +0000 ++++ b/src/gcc/config/arm/t-linux-eabi 2011-08-21 21:08:47.583351817 +0000 +@@ -24,6 +24,20 @@ + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++ifeq ($(with_float),hard) ++MULTILIB_OPTIONS = mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?softfp=msoft-float mfloat-abi?softfp=mfloat-abi?soft ++MULTILIB_OSDIRNAMES = arm-linux-gnueabi:arm-linux-gnueabi ../lib:arm-linux-gnueabihf ++else ++MULTILIB_OPTIONS = mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES = sf hf ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = mfloat-abi?hard=mhard-float mfloat-abi?softfp=msoft-float mfloat-abi?softfp=mfloat-abi?soft ++MULTILIB_OSDIRNAMES = ../lib:arm-linux-gnueabi arm-linux-gnueabihf:arm-linux-gnueabihf ++endif ++ + #MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te + #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te + #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* --- gcc-4.8-4.8.2.orig/debian/patches/arm-sanitizer.diff +++ gcc-4.8-4.8.2/debian/patches/arm-sanitizer.diff @@ -0,0 +1,280 @@ +# DP: Enable libsanitizer on ARM. + +libsanitizer/ + +2013-06-20 Christophe Lyon + + Backport from trunk r198683. + 2013-05-07 Christophe Lyon + + * configure.tgt: Add ARM pattern. + +gcc/ + +2013-06-20 Christophe Lyon + + Backport from trunk r198683. + 2013-05-07 Christophe Lyon + + * config/arm/arm.c (arm_asan_shadow_offset): New function. + (TARGET_ASAN_SHADOW_OFFSET): Define. + * config/arm/linux-eabi.h (ASAN_CC1_SPEC): Define. + (LINUX_OR_ANDROID_CC): Add ASAN_CC1_SPEC. + +gcc/testsuite/ + +2013-06-20 Christophe Lyon + + Backport from trunk r198683. + 2013-05-07 Christophe Lyon + + * lib/target-supports.exp (check_effective_target_hw): New + function. + * c-c++-common/asan/clone-test-1.c: Call + check_effective_target_hw. + * c-c++-common/asan/rlimit-mmap-test-1.c: Likewise. + * c-c++-common/asan/heap-overflow-1.c: Update regexps to accept + possible decorations. + * c-c++-common/asan/null-deref-1.c: Likewise. + * c-c++-common/asan/stack-overflow-1.c: Likewise. + * c-c++-common/asan/strncpy-overflow-1.c: Likewise. + * c-c++-common/asan/use-after-free-1.c: Likewise. + * g++.dg/asan/deep-thread-stack-1.C: Likewise. + * g++.dg/asan/large-func-test-1.C: Likewise. + +Index: b/src/libsanitizer/configure.tgt +=================================================================== +--- a/src/libsanitizer/configure.tgt ++++ b/src/libsanitizer/configure.tgt +@@ -29,6 +29,8 @@ + ;; + sparc*-*-linux*) + ;; ++ arm*-*-linux*) ++ ;; + x86_64-*-darwin[1]* | i?86-*-darwin[1]*) + TSAN_SUPPORTED=no + ;; +Index: b/src/gcc/testsuite/lib/target-supports.exp +=================================================================== +--- a/src/gcc/testsuite/lib/target-supports.exp ++++ b/src/gcc/testsuite/lib/target-supports.exp +@@ -4591,6 +4591,33 @@ + return 0 + } + ++# Return 1 if programs are intended to be run on hardware rather than ++# on a simulator ++ ++proc check_effective_target_hw { } { ++ ++ # All "src/sim" simulators set this one. ++ if [board_info target exists is_simulator] { ++ if [board_info target is_simulator] { ++ return 0 ++ } else { ++ return 1 ++ } ++ } ++ ++ # The "sid" simulators don't set that one, but at least they set ++ # this one. ++ if [board_info target exists slow_simulator] { ++ if [board_info target slow_simulator] { ++ return 0 ++ } else { ++ return 1 ++ } ++ } ++ ++ return 1 ++} ++ + # Return 1 if the target is a VxWorks kernel. + + proc check_effective_target_vxworks_kernel { } { +Index: b/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C ++++ b/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C +@@ -37,9 +37,9 @@ + + // { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" } + // { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } +-// { dg-output "READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*LargeFunction\[^\n\r]*(large-func-test-1.C:18|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } +-// { dg-output "0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" } +-// { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #0( 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #1|) 0x\[0-9a-f\]+ (in (operator new|_*_Zn\[aw\]\[mj\])|\[(\])\[^\n\r]*(\n|\r\n|\r)" } +Index: b/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C ++++ b/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C +@@ -45,9 +45,9 @@ + } + + // { dg-output "ERROR: AddressSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } +-// { dg-output "WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" } +-// { dg-output "freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } +-// { dg-output "previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\2 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\8 created by T0 here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\4 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" } +Index: b/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c +@@ -15,7 +15,7 @@ + /* { dg-output "WRITE of size \[0-9\]* at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)strncpy|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:11|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +Index: b/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c +@@ -2,6 +2,7 @@ + + /* { dg-do run { target setrlimit } } */ + /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ ++/* { dg-require-effective-target hw } */ + /* { dg-shouldfail "asan" } */ + + #include +Index: b/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c +@@ -19,4 +19,4 @@ + + /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*stack-overflow-1.c:16|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "Address 0x\[0-9a-f\]+ is\[^\n\r]*frame
" } */ ++/* { dg-output "\[^\n\r]*Address 0x\[0-9a-f\]+ is\[^\n\r]*frame
" } */ +Index: b/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c +@@ -11,12 +11,12 @@ + + /* { dg-output "ERROR: AddressSanitizer:? heap-use-after-free on address\[^\n\r]*" } */ + /* { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:9|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)free|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:8|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:7|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +Index: b/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c +@@ -3,6 +3,7 @@ + + /* { dg-do run { target { *-*-linux* } } } */ + /* { dg-require-effective-target clone } */ ++/* { dg-require-effective-target hw } */ + /* { dg-options "-D_GNU_SOURCE" } */ + + #include +Index: b/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c +@@ -25,7 +25,7 @@ + + /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0.*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:21|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:19|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +Index: b/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c +@@ -18,6 +18,6 @@ + + /* { dg-output "ERROR: AddressSanitizer:? SEGV on unknown address\[^\n\r]*" } */ + /* { dg-output "0x\[0-9a-f\]+ \[^\n\r]*pc 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*NullDeref\[^\n\r]* (\[^\n\r]*null-deref-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*null-deref-1.c:15|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +Index: b/src/gcc/config/arm/arm.c +=================================================================== +--- a/src/gcc/config/arm/arm.c ++++ b/src/gcc/config/arm/arm.c +@@ -280,6 +280,7 @@ + + static void arm_canonicalize_comparison (int *code, rtx *op0, rtx *op1, + bool op0_preserve_value); ++static unsigned HOST_WIDE_INT arm_asan_shadow_offset (void); + + /* Table of machine attributes. */ + static const struct attribute_spec arm_attribute_table[] = +@@ -649,6 +650,9 @@ + #define TARGET_CANONICALIZE_COMPARISON \ + arm_canonicalize_comparison + ++#undef TARGET_ASAN_SHADOW_OFFSET ++#define TARGET_ASAN_SHADOW_OFFSET arm_asan_shadow_offset ++ + struct gcc_target targetm = TARGET_INITIALIZER; + + /* Obstack for minipool constant handling. */ +@@ -27450,4 +27454,12 @@ + + } + ++/* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */ ++ ++static unsigned HOST_WIDE_INT ++arm_asan_shadow_offset (void) ++{ ++ return (unsigned HOST_WIDE_INT) 1 << 29; ++} ++ + #include "gt-arm.h" +Index: b/src/gcc/config/arm/linux-eabi.h +=================================================================== +--- a/src/gcc/config/arm/linux-eabi.h ++++ b/src/gcc/config/arm/linux-eabi.h +@@ -84,10 +84,14 @@ + LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \ + LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC) + ++#undef ASAN_CC1_SPEC ++#define ASAN_CC1_SPEC "%{fsanitize=*:-funwind-tables}" ++ + #undef CC1_SPEC + #define CC1_SPEC \ +- LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \ +- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC) ++ LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC, \ ++ GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " \ ++ ANDROID_CC1_SPEC) + + #define CC1PLUS_SPEC \ + LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC) --- gcc-4.8-4.8.2.orig/debian/patches/boehm-gc-getnprocs.diff +++ gcc-4.8-4.8.2/debian/patches/boehm-gc-getnprocs.diff @@ -0,0 +1,18 @@ +# DP: boehm-gc/pthread_support.c (GC_get_nprocs): Use sysconf as fallback. + +--- + boehm-gc/pthread_support.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +--- a/src/boehm-gc/pthread_support.c ++++ b/src/boehm-gc/pthread_support.c +@@ -724,7 +724,8 @@ + f = open("/proc/stat", O_RDONLY); + if (f < 0 || (len = STAT_READ(f, stat_buf, STAT_BUF_SIZE)) < 100) { + WARN("Couldn't read /proc/stat\n", 0); +- return -1; ++ /* Fallback to sysconf after the warning */ ++ return sysconf(_SC_NPROCESSORS_ONLN); + } + for (i = 0; i < len - 100; ++i) { + if (stat_buf[i] == '\n' && stat_buf[i+1] == 'c' --- gcc-4.8-4.8.2.orig/debian/patches/boehm-gc-nocheck.diff +++ gcc-4.8-4.8.2/debian/patches/boehm-gc-nocheck.diff @@ -0,0 +1,18 @@ +# DP: Disable running the boehm-gc testsuite. Hangs the buildd at least on hppa. + +--- + boehm-gc/Makefile.in | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +--- a/src/boehm-gc/Makefile.in ++++ b/src/boehm-gc/Makefile.in +@@ -684,7 +684,8 @@ check-TESTS: $(TESTS) + test "$$failed" -eq 0; \ + else :; fi + check-am: $(check_PROGRAMS) +- $(MAKE) $(AM_MAKEFLAGS) check-TESTS ++ : # $(MAKE) $(AM_MAKEFLAGS) check-TESTS ++ @echo target $@ disabled for Debian build. + check: check-recursive + all-am: Makefile $(LTLIBRARIES) all-multi + installdirs: installdirs-recursive --- gcc-4.8-4.8.2.orig/debian/patches/bootstrap-no-unneeded-libs.diff +++ gcc-4.8-4.8.2/debian/patches/bootstrap-no-unneeded-libs.diff @@ -0,0 +1,1422 @@ +# DP: For bootstrap builds, don't build unneeded libstdc++ things +# DP: (debug library, PCH headers). + +Index: b/src/Makefile.tpl +=================================================================== +--- a/src/Makefile.tpl ++++ b/src/Makefile.tpl +@@ -1060,7 +1060,9 @@ + --target=[+target_alias+] $${srcdiroption} [+ IF prev +]\ + --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +]\ + $(STAGE[+id+]_CONFIGURE_FLAGS)[+ IF extra_configure_flags +] \ +- [+extra_configure_flags+][+ ENDIF extra_configure_flags +] ++ [+extra_configure_flags+][+ ENDIF extra_configure_flags +] \ ++ [+ IF bootstrap_configure_flags +][+bootstrap_configure_flags+] \ ++ [+ ENDIF bootstrap_configure_flags +] + @endif [+prefix+][+module+]-bootstrap + [+ ENDFOR bootstrap_stage +] + [+ ENDIF bootstrap +] +Index: b/src/Makefile.def +=================================================================== +--- a/src/Makefile.def ++++ b/src/Makefile.def +@@ -117,7 +117,8 @@ + target_modules = { module= libstdc++-v3; + bootstrap=true; + lib_path=src/.libs; +- raw_cxx=true; }; ++ raw_cxx=true; ++ bootstrap_configure_flags='--disable-libstdcxx-debug --disable-libstdcxx-pch'; }; + target_modules = { module= libmudflap; lib_path=.libs; }; + target_modules = { module= libsanitizer; lib_path=.libs; }; + target_modules = { module= libssp; lib_path=.libs; }; +Index: b/src/Makefile.in +=================================================================== +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -3007,7 +3007,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + .PHONY: configure-stage2-bfd maybe-configure-stage2-bfd +@@ -3040,7 +3041,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + .PHONY: configure-stage3-bfd maybe-configure-stage3-bfd +@@ -3073,7 +3075,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + .PHONY: configure-stage4-bfd maybe-configure-stage4-bfd +@@ -3106,7 +3109,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + .PHONY: configure-stageprofile-bfd maybe-configure-stageprofile-bfd +@@ -3139,7 +3143,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + .PHONY: configure-stagefeedback-bfd maybe-configure-stagefeedback-bfd +@@ -3172,7 +3177,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif bfd-bootstrap + + +@@ -3879,7 +3885,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + .PHONY: configure-stage2-opcodes maybe-configure-stage2-opcodes +@@ -3912,7 +3919,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + .PHONY: configure-stage3-opcodes maybe-configure-stage3-opcodes +@@ -3945,7 +3953,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + .PHONY: configure-stage4-opcodes maybe-configure-stage4-opcodes +@@ -3978,7 +3987,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + .PHONY: configure-stageprofile-opcodes maybe-configure-stageprofile-opcodes +@@ -4011,7 +4021,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + .PHONY: configure-stagefeedback-opcodes maybe-configure-stagefeedback-opcodes +@@ -4044,7 +4055,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif opcodes-bootstrap + + +@@ -4751,7 +4763,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + .PHONY: configure-stage2-binutils maybe-configure-stage2-binutils +@@ -4784,7 +4797,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + .PHONY: configure-stage3-binutils maybe-configure-stage3-binutils +@@ -4817,7 +4831,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + .PHONY: configure-stage4-binutils maybe-configure-stage4-binutils +@@ -4850,7 +4865,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + .PHONY: configure-stageprofile-binutils maybe-configure-stageprofile-binutils +@@ -4883,7 +4899,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + .PHONY: configure-stagefeedback-binutils maybe-configure-stagefeedback-binutils +@@ -4916,7 +4933,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif binutils-bootstrap + + +@@ -8696,7 +8714,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + .PHONY: configure-stage2-gas maybe-configure-stage2-gas +@@ -8729,7 +8748,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + .PHONY: configure-stage3-gas maybe-configure-stage3-gas +@@ -8762,7 +8782,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + .PHONY: configure-stage4-gas maybe-configure-stage4-gas +@@ -8795,7 +8816,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + .PHONY: configure-stageprofile-gas maybe-configure-stageprofile-gas +@@ -8828,7 +8850,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + .PHONY: configure-stagefeedback-gas maybe-configure-stagefeedback-gas +@@ -8861,7 +8884,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif gas-bootstrap + + +@@ -9568,7 +9592,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + .PHONY: configure-stage2-gcc maybe-configure-stage2-gcc +@@ -9601,7 +9626,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + .PHONY: configure-stage3-gcc maybe-configure-stage3-gcc +@@ -9634,7 +9660,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + .PHONY: configure-stage4-gcc maybe-configure-stage4-gcc +@@ -9667,7 +9694,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + .PHONY: configure-stageprofile-gcc maybe-configure-stageprofile-gcc +@@ -9700,7 +9728,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + .PHONY: configure-stagefeedback-gcc maybe-configure-stagefeedback-gcc +@@ -9733,7 +9762,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif gcc-bootstrap + + +@@ -10441,7 +10471,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=none-${host_vendor}-${host_os} \ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + .PHONY: configure-stage2-gmp maybe-configure-stage2-gmp +@@ -10475,7 +10506,8 @@ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + .PHONY: configure-stage3-gmp maybe-configure-stage3-gmp +@@ -10509,7 +10541,8 @@ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + .PHONY: configure-stage4-gmp maybe-configure-stage4-gmp +@@ -10543,7 +10576,8 @@ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + .PHONY: configure-stageprofile-gmp maybe-configure-stageprofile-gmp +@@ -10577,7 +10611,8 @@ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + .PHONY: configure-stagefeedback-gmp maybe-configure-stagefeedback-gmp +@@ -10611,7 +10646,8 @@ + --target=none-${host_vendor}-${host_os} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif gmp-bootstrap + + +@@ -11307,7 +11343,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + .PHONY: configure-stage2-mpfr maybe-configure-stage2-mpfr +@@ -11341,7 +11378,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + .PHONY: configure-stage3-mpfr maybe-configure-stage3-mpfr +@@ -11375,7 +11413,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + .PHONY: configure-stage4-mpfr maybe-configure-stage4-mpfr +@@ -11409,7 +11448,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + .PHONY: configure-stageprofile-mpfr maybe-configure-stageprofile-mpfr +@@ -11443,7 +11483,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + .PHONY: configure-stagefeedback-mpfr maybe-configure-stagefeedback-mpfr +@@ -11477,7 +11518,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpfr_configure_flags@ ++ --disable-shared @extra_mpfr_configure_flags@ \ ++ + @endif mpfr-bootstrap + + +@@ -12173,7 +12215,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + .PHONY: configure-stage2-mpc maybe-configure-stage2-mpc +@@ -12207,7 +12250,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + .PHONY: configure-stage3-mpc maybe-configure-stage3-mpc +@@ -12241,7 +12285,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + .PHONY: configure-stage4-mpc maybe-configure-stage4-mpc +@@ -12275,7 +12320,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + .PHONY: configure-stageprofile-mpc maybe-configure-stageprofile-mpc +@@ -12309,7 +12355,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + .PHONY: configure-stagefeedback-mpc maybe-configure-stagefeedback-mpc +@@ -12343,7 +12390,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ ++ --disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ \ ++ + @endif mpc-bootstrap + + +@@ -13039,7 +13087,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + .PHONY: configure-stage2-isl maybe-configure-stage2-isl +@@ -13073,7 +13122,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + .PHONY: configure-stage3-isl maybe-configure-stage3-isl +@@ -13107,7 +13157,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + .PHONY: configure-stage4-isl maybe-configure-stage4-isl +@@ -13141,7 +13192,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + .PHONY: configure-stageprofile-isl maybe-configure-stageprofile-isl +@@ -13175,7 +13227,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + .PHONY: configure-stagefeedback-isl maybe-configure-stagefeedback-isl +@@ -13209,7 +13262,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared @extra_isl_gmp_configure_flags@ ++ --disable-shared @extra_isl_gmp_configure_flags@ \ ++ + @endif isl-bootstrap + + +@@ -13905,7 +13959,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + .PHONY: configure-stage2-cloog maybe-configure-stage2-cloog +@@ -13939,7 +13994,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + .PHONY: configure-stage3-cloog maybe-configure-stage3-cloog +@@ -13973,7 +14029,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + .PHONY: configure-stage4-cloog maybe-configure-stage4-cloog +@@ -14007,7 +14064,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + .PHONY: configure-stageprofile-cloog maybe-configure-stageprofile-cloog +@@ -14041,7 +14099,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + .PHONY: configure-stagefeedback-cloog maybe-configure-stagefeedback-cloog +@@ -14075,7 +14134,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system ++ --disable-shared --with-gmp=system --with-bits=gmp --with-isl=system \ ++ + @endif cloog-bootstrap + + +@@ -14771,7 +14831,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + .PHONY: configure-stage2-libelf maybe-configure-stage2-libelf +@@ -14805,7 +14866,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + .PHONY: configure-stage3-libelf maybe-configure-stage3-libelf +@@ -14839,7 +14901,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + .PHONY: configure-stage4-libelf maybe-configure-stage4-libelf +@@ -14873,7 +14936,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + .PHONY: configure-stageprofile-libelf maybe-configure-stageprofile-libelf +@@ -14907,7 +14971,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + .PHONY: configure-stagefeedback-libelf maybe-configure-stagefeedback-libelf +@@ -14941,7 +15006,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --disable-shared ++ --disable-shared \ ++ + @endif libelf-bootstrap + + +@@ -15636,7 +15702,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + .PHONY: configure-stage2-gold maybe-configure-stage2-gold +@@ -15669,7 +15736,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + .PHONY: configure-stage3-gold maybe-configure-stage3-gold +@@ -15702,7 +15770,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + .PHONY: configure-stage4-gold maybe-configure-stage4-gold +@@ -15735,7 +15804,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + .PHONY: configure-stageprofile-gold maybe-configure-stageprofile-gold +@@ -15768,7 +15838,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + .PHONY: configure-stagefeedback-gold maybe-configure-stagefeedback-gold +@@ -15801,7 +15872,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif gold-bootstrap + + +@@ -16948,7 +17020,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + .PHONY: configure-stage2-intl maybe-configure-stage2-intl +@@ -16981,7 +17054,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + .PHONY: configure-stage3-intl maybe-configure-stage3-intl +@@ -17014,7 +17088,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + .PHONY: configure-stage4-intl maybe-configure-stage4-intl +@@ -17047,7 +17122,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + .PHONY: configure-stageprofile-intl maybe-configure-stageprofile-intl +@@ -17080,7 +17156,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + .PHONY: configure-stagefeedback-intl maybe-configure-stagefeedback-intl +@@ -17113,7 +17190,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif intl-bootstrap + + +@@ -18685,7 +18763,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + .PHONY: configure-stage2-ld maybe-configure-stage2-ld +@@ -18718,7 +18797,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + .PHONY: configure-stage3-ld maybe-configure-stage3-ld +@@ -18751,7 +18831,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + .PHONY: configure-stage4-ld maybe-configure-stage4-ld +@@ -18784,7 +18865,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + .PHONY: configure-stageprofile-ld maybe-configure-stageprofile-ld +@@ -18817,7 +18899,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + .PHONY: configure-stagefeedback-ld maybe-configure-stagefeedback-ld +@@ -18850,7 +18933,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif ld-bootstrap + + +@@ -19557,7 +19641,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + .PHONY: configure-stage2-libbacktrace maybe-configure-stage2-libbacktrace +@@ -19590,7 +19675,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + .PHONY: configure-stage3-libbacktrace maybe-configure-stage3-libbacktrace +@@ -19623,7 +19709,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + .PHONY: configure-stage4-libbacktrace maybe-configure-stage4-libbacktrace +@@ -19656,7 +19743,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + .PHONY: configure-stageprofile-libbacktrace maybe-configure-stageprofile-libbacktrace +@@ -19689,7 +19777,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + .PHONY: configure-stagefeedback-libbacktrace maybe-configure-stagefeedback-libbacktrace +@@ -19722,7 +19811,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif libbacktrace-bootstrap + + +@@ -20429,7 +20519,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + .PHONY: configure-stage2-libcpp maybe-configure-stage2-libcpp +@@ -20462,7 +20553,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + .PHONY: configure-stage3-libcpp maybe-configure-stage3-libcpp +@@ -20495,7 +20587,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + .PHONY: configure-stage4-libcpp maybe-configure-stage4-libcpp +@@ -20528,7 +20621,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + .PHONY: configure-stageprofile-libcpp maybe-configure-stageprofile-libcpp +@@ -20561,7 +20655,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + .PHONY: configure-stagefeedback-libcpp maybe-configure-stagefeedback-libcpp +@@ -20594,7 +20689,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif libcpp-bootstrap + + +@@ -21301,7 +21397,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + .PHONY: configure-stage2-libdecnumber maybe-configure-stage2-libdecnumber +@@ -21334,7 +21431,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + .PHONY: configure-stage3-libdecnumber maybe-configure-stage3-libdecnumber +@@ -21367,7 +21465,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + .PHONY: configure-stage4-libdecnumber maybe-configure-stage4-libdecnumber +@@ -21400,7 +21499,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + .PHONY: configure-stageprofile-libdecnumber maybe-configure-stageprofile-libdecnumber +@@ -21433,7 +21533,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + .PHONY: configure-stagefeedback-libdecnumber maybe-configure-stagefeedback-libdecnumber +@@ -21466,7 +21567,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif libdecnumber-bootstrap + + +@@ -22614,7 +22716,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + .PHONY: configure-stage2-libiberty maybe-configure-stage2-libiberty +@@ -22648,7 +22751,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + .PHONY: configure-stage3-libiberty maybe-configure-stage3-libiberty +@@ -22682,7 +22786,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + .PHONY: configure-stage4-libiberty maybe-configure-stage4-libiberty +@@ -22716,7 +22821,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + .PHONY: configure-stageprofile-libiberty maybe-configure-stageprofile-libiberty +@@ -22750,7 +22856,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + .PHONY: configure-stagefeedback-libiberty maybe-configure-stagefeedback-libiberty +@@ -22784,7 +22891,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- @extra_host_libiberty_configure_flags@ ++ @extra_host_libiberty_configure_flags@ \ ++ + @endif libiberty-bootstrap + + +@@ -26056,7 +26164,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + .PHONY: configure-stage2-zlib maybe-configure-stage2-zlib +@@ -26089,7 +26198,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + .PHONY: configure-stage3-zlib maybe-configure-stage3-zlib +@@ -26122,7 +26232,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + .PHONY: configure-stage4-zlib maybe-configure-stage4-zlib +@@ -26155,7 +26266,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + .PHONY: configure-stageprofile-zlib maybe-configure-stageprofile-zlib +@@ -26188,7 +26300,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + .PHONY: configure-stagefeedback-zlib maybe-configure-stagefeedback-zlib +@@ -26221,7 +26334,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif zlib-bootstrap + + +@@ -29919,7 +30033,8 @@ + $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ + --target=${target_alias} $${srcdiroption} \ + $(STAGE1_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + .PHONY: configure-stage2-lto-plugin maybe-configure-stage2-lto-plugin +@@ -29953,7 +30068,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE2_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + .PHONY: configure-stage3-lto-plugin maybe-configure-stage3-lto-plugin +@@ -29987,7 +30103,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE3_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + .PHONY: configure-stage4-lto-plugin maybe-configure-stage4-lto-plugin +@@ -30021,7 +30138,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGE4_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + .PHONY: configure-stageprofile-lto-plugin maybe-configure-stageprofile-lto-plugin +@@ -30055,7 +30173,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEprofile_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + .PHONY: configure-stagefeedback-lto-plugin maybe-configure-stagefeedback-lto-plugin +@@ -30089,7 +30208,8 @@ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ + $(STAGEfeedback_CONFIGURE_FLAGS) \ +- --enable-shared ++ --enable-shared \ ++ + @endif lto-plugin-bootstrap + + +@@ -30829,7 +30949,9 @@ + $(SHELL) $${libsrcdir}/configure \ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + .PHONY: configure-stage2-target-libstdc++-v3 maybe-configure-stage2-target-libstdc++-v3 +@@ -30874,7 +30996,9 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + .PHONY: configure-stage3-target-libstdc++-v3 maybe-configure-stage3-target-libstdc++-v3 +@@ -30919,7 +31043,9 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + .PHONY: configure-stage4-target-libstdc++-v3 maybe-configure-stage4-target-libstdc++-v3 +@@ -30964,7 +31090,9 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + .PHONY: configure-stageprofile-target-libstdc++-v3 maybe-configure-stageprofile-target-libstdc++-v3 +@@ -31009,7 +31137,9 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + .PHONY: configure-stagefeedback-target-libstdc++-v3 maybe-configure-stagefeedback-target-libstdc++-v3 +@@ -31054,7 +31184,9 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ --disable-libstdcxx-debug --disable-libstdcxx-pch \ ++ + @endif target-libstdc++-v3-bootstrap + + +@@ -33631,7 +33763,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + .PHONY: configure-stage2-target-libgcc maybe-configure-stage2-target-libgcc +@@ -33676,7 +33809,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + .PHONY: configure-stage3-target-libgcc maybe-configure-stage3-target-libgcc +@@ -33721,7 +33855,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + .PHONY: configure-stage4-target-libgcc maybe-configure-stage4-target-libgcc +@@ -33766,7 +33901,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + .PHONY: configure-stageprofile-target-libgcc maybe-configure-stageprofile-target-libgcc +@@ -33811,7 +33947,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + .PHONY: configure-stagefeedback-target-libgcc maybe-configure-stagefeedback-target-libgcc +@@ -33856,7 +33993,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif target-libgcc-bootstrap + + +@@ -40928,7 +41066,8 @@ + $(SHELL) $${libsrcdir}/configure \ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ +- $(STAGE1_CONFIGURE_FLAGS) ++ $(STAGE1_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + .PHONY: configure-stage2-target-libgomp maybe-configure-stage2-target-libgomp +@@ -40973,7 +41112,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE2_CONFIGURE_FLAGS) ++ $(STAGE2_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + .PHONY: configure-stage3-target-libgomp maybe-configure-stage3-target-libgomp +@@ -41018,7 +41158,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE3_CONFIGURE_FLAGS) ++ $(STAGE3_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + .PHONY: configure-stage4-target-libgomp maybe-configure-stage4-target-libgomp +@@ -41063,7 +41204,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGE4_CONFIGURE_FLAGS) ++ $(STAGE4_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + .PHONY: configure-stageprofile-target-libgomp maybe-configure-stageprofile-target-libgomp +@@ -41108,7 +41250,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEprofile_CONFIGURE_FLAGS) ++ $(STAGEprofile_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + .PHONY: configure-stagefeedback-target-libgomp maybe-configure-stagefeedback-target-libgomp +@@ -41153,7 +41296,8 @@ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ + --target=${target_alias} $${srcdiroption} \ + --with-build-libsubdir=$(HOST_SUBDIR) \ +- $(STAGEfeedback_CONFIGURE_FLAGS) ++ $(STAGEfeedback_CONFIGURE_FLAGS) \ ++ + @endif target-libgomp-bootstrap + + --- gcc-4.8-4.8.2.orig/debian/patches/config-ml.diff +++ gcc-4.8-4.8.2/debian/patches/config-ml.diff @@ -0,0 +1,167 @@ +# DP: - Disable some biarch libraries for biarch builds. +# DP: - Fix multilib builds on kernels which don't support all multilibs. + +Index: b/src/config-ml.in +=================================================================== +--- a/src/config-ml.in ++++ b/src/config-ml.in +@@ -467,6 +467,25 @@ + ;; + esac + ++if [ -z "$biarch_multidir_names" ]; then ++ biarch_multidir_names="libiberty libstdc++-v3 libgfortran libmudflap libssp libffi libobjc libgomp" ++ echo "WARNING: biarch_multidir_names is unset. Use default value:" ++ echo " $biarch_multidir_names" ++fi ++ml_srcbase=`basename $ml_realsrcdir` ++old_multidirs="${multidirs}" ++multidirs="" ++for x in ${old_multidirs}; do ++ case " $x " in ++ " 32 "|" n32 "|" x32 "|" 64 "|" hf "|" sf ") ++ case "$biarch_multidir_names" in ++ *"$ml_srcbase"*) multidirs="${multidirs} ${x}" ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++done ++ + # Remove extraneous blanks from multidirs. + # Tests like `if [ -n "$multidirs" ]' require it. + multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'` +@@ -654,6 +673,35 @@ + + for ml_dir in ${multidirs}; do + ++ # a native build fails if the running kernel doesn't support the multilib ++ # variant; force cross compilation for these cases. ++ ml_host_arg= ++ case "${host}" in ++ i[34567]86-*-linux*) ++ case "${ml_dir}" in ++ 64) ml_host_arg="--host=x86_64-linux-gnu";; ++ x32) ml_host_arg="--host=x86_64-linux-gnux32";; ++ esac ++ ;; ++ powerpc-*-linux*) ++ case "${ml_dir}" in ++ 64) ml_host_arg="--host=powerpc64-linux-gnu" ++ esac ++ ;; ++ s390-*-linux*) ++ case "${ml_dir}" in ++ 64) ml_host_arg="--host=s390x-linux-gnu" ++ esac ++ ;; ++ x86_64-*-linux*) ++ case "${ml_dir}" in ++ x32) ml_host_arg="--host=x86_64-linux-gnux32" ++ esac ++ esac ++ if [ -n "${ml_host_arg}" ]; then ++ ml_host_arg="${ml_host_arg} --with-default-host-alias=${host_alias}" ++ fi ++ + if [ "${ml_verbose}" = --verbose ]; then + echo "Running configure in multilib subdir ${ml_dir}" + echo "pwd: `${PWDCMD-pwd}`" +@@ -858,9 +906,20 @@ + fi + fi + ++ ml_configure_args= ++ for arg in ${ac_configure_args} ++ do ++ case $arg in ++ *CC=*) ml_configure_args=${ml_config_env} ;; ++ *CXX=*) ml_configure_args=${ml_config_env} ;; ++ *GCJ=*) ml_configure_args=${ml_config_env} ;; ++ *) ;; ++ esac ++ done ++ + if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \ + --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ +- ${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then ++ ${ac_configure_args} ${ml_configure_args} ${ml_host_arg} ${ml_srcdiroption} ; then + true + else + exit 1 +Index: b/src/libstdc++-v3/include/Makefile.am +=================================================================== +--- a/src/libstdc++-v3/include/Makefile.am ++++ b/src/libstdc++-v3/include/Makefile.am +@@ -826,8 +826,9 @@ + endif + + host_srcdir = ${glibcxx_srcdir}/$(OS_INC_SRCDIR) +-host_builddir = ./${host_alias}/bits +-host_installdir = ${gxx_include_dir}/${host_alias}$(MULTISUBDIR)/bits ++default_host_alias = @default_host_alias@ ++host_builddir = ./${default_host_alias}/bits ++host_installdir = ${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits + host_headers = \ + ${host_srcdir}/ctype_base.h \ + ${host_srcdir}/ctype_inline.h \ +@@ -1048,6 +1049,7 @@ + stamp-${host_alias}: + @-mkdir -p ${host_builddir} + @-mkdir -p ${host_builddir}/../ext ++ @test ${default_host_alias} = ${host_alias} || ln -sf ${default_host_alias} ${host_alias} + @$(STAMP) stamp-${host_alias} + + # Host includes static. +Index: b/src/libstdc++-v3/include/Makefile.in +=================================================================== +--- a/src/libstdc++-v3/include/Makefile.in ++++ b/src/libstdc++-v3/include/Makefile.in +@@ -202,6 +202,7 @@ + check_msgfmt = @check_msgfmt@ + datadir = @datadir@ + datarootdir = @datarootdir@ ++default_host_alias = @default_host_alias@ + docdir = @docdir@ + dvidir = @dvidir@ + enable_shared = @enable_shared@ +@@ -1081,8 +1082,8 @@ + # For --enable-cheaders=c_std + @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@c_compatibility_headers_extra = ${c_compatibility_headers} + host_srcdir = ${glibcxx_srcdir}/$(OS_INC_SRCDIR) +-host_builddir = ./${host_alias}/bits +-host_installdir = ${gxx_include_dir}/${host_alias}$(MULTISUBDIR)/bits ++host_builddir = ./${default_host_alias}/bits ++host_installdir = ${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits + host_headers = \ + ${host_srcdir}/ctype_base.h \ + ${host_srcdir}/ctype_inline.h \ +@@ -1461,6 +1462,7 @@ + stamp-${host_alias}: + @-mkdir -p ${host_builddir} + @-mkdir -p ${host_builddir}/../ext ++ @test ${default_host_alias} = ${host_alias} || ln -sf ${default_host_alias} ${host_alias} + @$(STAMP) stamp-${host_alias} + + # Host includes static. +Index: b/src/libstdc++-v3/configure.ac +=================================================================== +--- a/src/libstdc++-v3/configure.ac ++++ b/src/libstdc++-v3/configure.ac +@@ -461,6 +461,16 @@ + multilib_arg= + fi + ++AC_ARG_WITH(default-host-alias, ++[AS_HELP_STRING([--with-default-host-alias=TRIPLET], ++ [specifies host triplet used for the default multilib build])], ++[case "${withval}" in ++yes) AC_MSG_ERROR(bad value ${withval} given for default host triplet) ;; ++no) default_host_alias='${host_alias}' ;; ++*) default_host_alias=${withval} ;; ++esac],[default_host_alias='${host_alias}']) ++AC_SUBST(default_host_alias) ++ + # Export all the install information. + GLIBCXX_EXPORT_INSTALL_INFO + --- gcc-4.8-4.8.2.orig/debian/patches/cross-biarch.diff +++ gcc-4.8-4.8.2/debian/patches/cross-biarch.diff @@ -0,0 +1,79 @@ +# DP: Fix the location of target's libs in cross-build for biarch + +--- + +--- a/src/config-ml.in 2010-08-24 01:48:38.000000000 -0400 ++++ b/src/config-ml.in 2010-08-24 03:56:12.000000000 -0400 +@@ -540,7 +540,12 @@ + else \ + if [ -d ../$${dir}/$${lib} ]; then \ + flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ +- if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \ ++ libsuffix_="$${dir}"; \ ++ if [ "$${dir}" = "n32" ]; then libsuffix_=32; fi; \ ++ if (cd ../$${dir}/$${lib}; $(MAKE) $(subst \ ++ -B$(build_tooldir)/lib/, \ ++ -B$(build_tooldir)/lib$${libsuffix_}/, \ ++ $(FLAGS_TO_PASS)) \ + CFLAGS="$(CFLAGS) $${flags}" \ + CCASFLAGS="$(CCASFLAGS) $${flags}" \ + FCFLAGS="$(FCFLAGS) $${flags}" \ +@@ -791,6 +796,13 @@ + GCJ_=$GCJ' ' + GFORTRAN_=$GFORTRAN' ' + else ++ if [ "${ml_dir}" = "." ]; then ++ FILTER_="s!X\\(.*\\)!\\1!p" ++ elif [ "${ml_dir}" = "n32" ]; then # mips n32 -> lib32 ++ FILTER_="s!X\\(.*\\)/!\\132/!p" ++ else ++ FILTER_="s!X\\(.*\\)/!\\1${ml_dir}/!p" ++ fi + # Create a regular expression that matches any string as long + # as ML_POPDIR. + popdir_rx=`echo "${ML_POPDIR}" | sed 's,.,.,g'` +@@ -799,6 +811,8 @@ + case $arg in + -[BIL]"${ML_POPDIR}"/*) + CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\1/p"`' ' ;; ++ -B*/lib/) ++ CC_="${CC_}"`echo "X${arg}" | sed -n "$FILTER_"`' ' ;; + "${ML_POPDIR}"/*) + CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; + *) +@@ -811,6 +825,8 @@ + case $arg in + -[BIL]"${ML_POPDIR}"/*) + CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; ++ -B*/lib/) ++ CXX_="${CXX_}"`echo "X${arg}" | sed -n "$FILTER_"`' ' ;; + "${ML_POPDIR}"/*) + CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; + *) +@@ -823,6 +839,8 @@ + case $arg in + -[BIL]"${ML_POPDIR}"/*) + F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; ++ -B*/lib/) ++ F77_="${F77_}"`echo "X${arg}" | sed -n "$FILTER_"`' ' ;; + "${ML_POPDIR}"/*) + F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; + *) +@@ -835,6 +853,8 @@ + case $arg in + -[BIL]"${ML_POPDIR}"/*) + GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; ++ -B*/lib/) ++ GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "$FILTER_"`' ' ;; + "${ML_POPDIR}"/*) + GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; + *) +@@ -847,6 +867,8 @@ + case $arg in + -[BIL]"${ML_POPDIR}"/*) + GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; ++ -B*/lib/) ++ GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "$FILTER_"`' ' ;; + "${ML_POPDIR}"/*) + GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;; + *) --- gcc-4.8-4.8.2.orig/debian/patches/cross-fixes.diff +++ gcc-4.8-4.8.2/debian/patches/cross-fixes.diff @@ -0,0 +1,81 @@ +# DP: Fix the linker error when creating an xcc for ia64 + +--- + gcc/config/ia64/fde-glibc.c | 3 +++ + gcc/config/ia64/unwind-ia64.c | 3 ++- + gcc/unwind-compat.c | 2 ++ + gcc/unwind-generic.h | 2 ++ + 6 files changed, 14 insertions(+), 1 deletions(-) + +Index: b/src/libgcc/config/ia64/fde-glibc.c +=================================================================== +--- a/src/libgcc/config/ia64/fde-glibc.c ++++ b/src/libgcc/config/ia64/fde-glibc.c +@@ -28,6 +28,7 @@ + #ifndef _GNU_SOURCE + #define _GNU_SOURCE 1 + #endif ++#ifndef inhibit_libc + #include "config.h" + #include + #include +@@ -159,3 +160,5 @@ + + return data.ret; + } ++ ++#endif +Index: b/src/libgcc/config/ia64/unwind-ia64.c +=================================================================== +--- a/src/libgcc/config/ia64/unwind-ia64.c ++++ b/src/libgcc/config/ia64/unwind-ia64.c +@@ -27,6 +27,7 @@ + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + ++#ifndef inhibit_libc + #include "tconfig.h" + #include "tsystem.h" + #include "coretypes.h" +@@ -2467,3 +2468,4 @@ + #endif + + #endif ++#endif +Index: b/src/libgcc/unwind-compat.c +=================================================================== +--- a/src/libgcc/unwind-compat.c ++++ b/src/libgcc/unwind-compat.c +@@ -24,6 +24,7 @@ + . */ + + #if defined (USE_GAS_SYMVER) && defined (USE_LIBUNWIND_EXCEPTIONS) ++#ifndef inhibit_libc + #include "tconfig.h" + #include "tsystem.h" + #include "unwind.h" +@@ -208,3 +209,4 @@ + } + symver (_Unwind_SetIP, GCC_3.0); + #endif ++#endif +Index: b/src/libgcc/unwind-generic.h +=================================================================== +--- a/src/libgcc/unwind-generic.h ++++ b/src/libgcc/unwind-generic.h +@@ -221,6 +221,7 @@ + compatible with the standard ABI for IA-64, we inline these. */ + + #ifdef __ia64__ ++#ifndef inhibit_libc + #include + + static inline _Unwind_Ptr +@@ -239,6 +240,7 @@ + + /* @@@ Retrieve the Backing Store Pointer of the given context. */ + extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *); ++#endif + #else + extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *); + extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *); --- gcc-4.8-4.8.2.orig/debian/patches/cross-install-location.diff +++ gcc-4.8-4.8.2/debian/patches/cross-install-location.diff @@ -0,0 +1,335 @@ +--- a/src/libmudflap/Makefile.in 2012-12-08 08:32:41.301881153 +0100 ++++ b/src/libmudflap/Makefile.in 2012-12-08 08:58:29.281874520 +0100 +@@ -269,7 +269,7 @@ + @LIBMUDFLAPTH_FALSE@libmudflapth = + @LIBMUDFLAPTH_TRUE@libmudflapth = libmudflapth.la + toolexeclib_LTLIBRARIES = libmudflap.la $(libmudflapth) +-libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include ++libsubincludedir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version)/include + nobase_libsubinclude_HEADERS = mf-runtime.h + libmudflap_la_SOURCES = \ + mf-runtime.c \ +--- a/src/libmudflap/Makefile.am 2012-12-08 08:32:41.301881153 +0100 ++++ b/src/libmudflap/Makefile.am 2012-12-08 08:58:04.633876182 +0100 +@@ -23,7 +23,7 @@ + + toolexeclib_LTLIBRARIES = libmudflap.la $(libmudflapth) + target_noncanonical = @target_noncanonical@ +-libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include ++libsubincludedir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version)/include + nobase_libsubinclude_HEADERS = mf-runtime.h + + +--- a/src/fixincludes/Makefile.in 2011-01-03 21:52:22.000000000 +0100 ++++ b/src/fixincludes/Makefile.in 2012-12-08 08:53:27.029874709 +0100 +@@ -52,9 +52,9 @@ + gcc_version := $(shell cat $(srcdir)/../gcc/BASE-VER) + + # Directory in which the compiler finds libraries etc. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + # Directory in which the compiler finds executables +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libexecsubdir = $(libexecdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + # Where our executable files go + itoolsdir = $(libexecsubdir)/install-tools + # Where our data files go +--- a/src/libgfortran/Makefile.in 2012-09-20 09:23:55.000000000 +0200 ++++ b/src/libgfortran/Makefile.in 2012-12-08 08:50:26.369874316 +0100 +@@ -499,12 +499,12 @@ + + libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP) + myexeclib_LTLIBRARIES = libgfortranbegin.la +-myexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) ++myexeclibdir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)$(MULTISUBDIR) + libgfortranbegin_la_SOURCES = fmain.c + libgfortranbegin_la_LDFLAGS = -static + libgfortranbegin_la_LINK = $(LINK) $(libgfortranbegin_la_LDFLAGS) + cafexeclib_LTLIBRARIES = libcaf_single.la +-cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) ++cafexeclibdir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)$(MULTISUBDIR) + libcaf_single_la_SOURCES = caf/single.c + libcaf_single_la_LDFLAGS = -static + libcaf_single_la_DEPENDENCIES = caf/libcaf.h +--- a/src/libgfortran/Makefile.am 2012-01-09 17:02:36.000000000 +0100 ++++ b/src/libgfortran/Makefile.am 2012-12-08 08:49:41.957876998 +0100 +@@ -42,13 +42,13 @@ + libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP) + + myexeclib_LTLIBRARIES = libgfortranbegin.la +-myexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) ++myexeclibdir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)$(MULTISUBDIR) + libgfortranbegin_la_SOURCES = fmain.c + libgfortranbegin_la_LDFLAGS = -static + libgfortranbegin_la_LINK = $(LINK) $(libgfortranbegin_la_LDFLAGS) + + cafexeclib_LTLIBRARIES = libcaf_single.la +-cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) ++cafexeclibdir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)$(MULTISUBDIR) + libcaf_single_la_SOURCES = caf/single.c + libcaf_single_la_LDFLAGS = -static + libcaf_single_la_DEPENDENCIES = caf/libcaf.h +--- a/src/lto-plugin/Makefile.in 2011-08-10 10:48:37.000000000 +0200 ++++ b/src/lto-plugin/Makefile.in 2012-12-08 09:00:17.861873944 +0100 +@@ -227,7 +227,7 @@ + ACLOCAL_AMFLAGS = -I .. -I ../config + AUTOMAKE_OPTIONS = no-dependencies + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) +-libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libexecsubdir := $(libexecdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS) + AM_CFLAGS = @ac_lto_plugin_warn_cflags@ + AM_LIBTOOLFLAGS = --tag=disable-static +--- a/src/lto-plugin/Makefile.am 2011-08-10 10:48:37.000000000 +0200 ++++ b/src/lto-plugin/Makefile.am 2012-12-08 08:59:54.621875067 +0100 +@@ -5,7 +5,7 @@ + + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) + target_noncanonical := @target_noncanonical@ +-libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libexecsubdir := $(libexecdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + + AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS) + AM_CFLAGS = @ac_lto_plugin_warn_cflags@ +--- a/src/libitm/Makefile.in 2012-12-08 08:32:40.093881158 +0100 ++++ b/src/libitm/Makefile.in 2012-12-08 08:54:51.929875619 +0100 +@@ -306,8 +306,8 @@ + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) + abi_version = -fabi-version=4 + search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) $(top_srcdir) +-fincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/finclude +-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++fincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/finclude ++libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + AM_CPPFLAGS = $(addprefix -I, $(search_path)) + AM_CFLAGS = $(XCFLAGS) + AM_CXXFLAGS = $(XCFLAGS) -std=gnu++0x -funwind-tables -fno-exceptions \ +--- a/src/libitm/Makefile.am 2012-02-14 14:14:27.000000000 +0100 ++++ b/src/libitm/Makefile.am 2012-12-08 08:53:58.341873782 +0100 +@@ -11,8 +11,8 @@ + config_path = @config_path@ + search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) $(top_srcdir) + +-fincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/finclude +-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++fincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/finclude ++libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + + vpath % $(strip $(search_path)) + +--- a/src/gcc/gcc.c 2012-08-06 16:34:27.000000000 +0200 ++++ b/src/gcc/gcc.c 2012-12-08 08:42:06.353877392 +0100 +@@ -3621,7 +3621,7 @@ + GCC_EXEC_PREFIX is typically a directory name with a trailing + / (which is ignored by make_relative_prefix), so append a + program name. */ +- char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL); ++ char *tmp_prefix = concat (gcc_exec_prefix, "gcc-cross", NULL); + gcc_libexec_prefix = get_relative_prefix (tmp_prefix, + standard_exec_prefix, + standard_libexec_prefix); +@@ -3647,15 +3647,15 @@ + { + int len = strlen (gcc_exec_prefix); + +- if (len > (int) sizeof ("/lib/gcc/") - 1 ++ if (len > (int) sizeof ("/lib/gcc-cross/") - 1 + && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1]))) + { +- temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1; ++ temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-cross/") + 1; + if (IS_DIR_SEPARATOR (*temp) + && filename_ncmp (temp + 1, "lib", 3) == 0 + && IS_DIR_SEPARATOR (temp[4]) +- && filename_ncmp (temp + 5, "gcc", 3) == 0) +- len -= sizeof ("/lib/gcc/") - 1; ++ && filename_ncmp (temp + 5, "gcc-cross", 3) == 0) ++ len -= sizeof ("/lib/gcc-cross/") - 1; + } + + set_std_prefix (gcc_exec_prefix, len); +--- a/src/gcc/Makefile.in 2012-12-08 08:32:41.337881153 +0100 ++++ b/src/gcc/Makefile.in 2012-12-08 08:36:18.493883559 +0100 +@@ -566,9 +566,9 @@ + # -------- + + # Directory in which the compiler finds libraries etc. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(version) ++libsubdir = $(libdir)/gcc-cross/$(target_noncanonical)/$(version) + # Directory in which the compiler finds executables +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(version) ++libexecsubdir = $(libexecdir)/gcc-cross/$(target_noncanonical)/$(version) + # Directory in which all plugin resources are installed + plugin_resourcesdir = $(libsubdir)/plugin + # Directory in which plugin headers are installed +@@ -2079,8 +2079,8 @@ + + DRIVER_DEFINES = \ + -DSTANDARD_STARTFILE_PREFIX=\"$(unlibsubdir)/\" \ +- -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \ +- -DSTANDARD_LIBEXEC_PREFIX=\"$(libexecdir)/gcc/\" \ ++ -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-cross/\" \ ++ -DSTANDARD_LIBEXEC_PREFIX=\"$(libexecdir)/gcc-cross/\" \ + -DDEFAULT_TARGET_VERSION=\"$(version)\" \ + -DDEFAULT_TARGET_MACHINE=\"$(target_noncanonical)\" \ + -DSTANDARD_BINDIR_PREFIX=\"$(bindir)/\" \ +@@ -3980,7 +3980,7 @@ + -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \ + -DNATIVE_SYSTEM_HEADER_DIR=\"$(NATIVE_SYSTEM_HEADER_DIR)\" \ + -DPREFIX=\"$(prefix)/\" \ +- -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \ ++ -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-cross/\" \ + @TARGET_SYSTEM_ROOT_DEFINE@ + + CFLAGS-cppbuiltin.o += $(PREPROCESSOR_DEFINES) -DBASEVER=$(FULLVER_s) +--- a/src/libssp/Makefile.in 2011-02-13 12:45:53.000000000 +0100 ++++ b/src/libssp/Makefile.in 2012-12-08 08:59:07.469875025 +0100 +@@ -259,7 +259,7 @@ + @LIBSSP_USE_SYMVER_SUN_TRUE@@LIBSSP_USE_SYMVER_TRUE@version_dep = ssp.map-sun + AM_CFLAGS = -Wall + toolexeclib_LTLIBRARIES = libssp.la libssp_nonshared.la +-libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include ++libsubincludedir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version)/include + nobase_libsubinclude_HEADERS = ssp/ssp.h ssp/string.h ssp/stdio.h ssp/unistd.h + libssp_la_SOURCES = \ + ssp.c gets-chk.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \ +--- a/src/libssp/Makefile.am 2010-12-06 01:50:04.000000000 +0100 ++++ b/src/libssp/Makefile.am 2012-12-08 08:58:51.241873553 +0100 +@@ -39,7 +39,7 @@ + toolexeclib_LTLIBRARIES = libssp.la libssp_nonshared.la + + target_noncanonical = @target_noncanonical@ +-libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include ++libsubincludedir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version)/include + nobase_libsubinclude_HEADERS = ssp/ssp.h ssp/string.h ssp/stdio.h ssp/unistd.h + + libssp_la_SOURCES = \ +--- a/src/libquadmath/Makefile.in 2011-09-21 16:36:03.000000000 +0200 ++++ b/src/libquadmath/Makefile.in 2012-12-08 08:49:10.557875680 +0100 +@@ -319,7 +319,7 @@ + + @BUILD_LIBQUADMATH_TRUE@libquadmath_la_DEPENDENCIES = $(version_dep) $(libquadmath_la_LIBADD) + @BUILD_LIBQUADMATH_TRUE@nodist_libsubinclude_HEADERS = quadmath.h quadmath_weak.h +-@BUILD_LIBQUADMATH_TRUE@libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++@BUILD_LIBQUADMATH_TRUE@libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + @BUILD_LIBQUADMATH_TRUE@libquadmath_la_SOURCES = \ + @BUILD_LIBQUADMATH_TRUE@ math/acoshq.c math/fmodq.c math/acosq.c math/frexpq.c \ + @BUILD_LIBQUADMATH_TRUE@ math/rem_pio2q.c math/asinhq.c math/hypotq.c math/remainderq.c \ +--- a/src/libquadmath/Makefile.am 2011-09-21 16:36:03.000000000 +0200 ++++ b/src/libquadmath/Makefile.am 2012-12-08 08:48:25.553878276 +0100 +@@ -40,7 +40,7 @@ + libquadmath_la_DEPENDENCIES = $(version_dep) $(libquadmath_la_LIBADD) + + nodist_libsubinclude_HEADERS = quadmath.h quadmath_weak.h +-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + + libquadmath_la_SOURCES = \ + math/acoshq.c math/fmodq.c math/acosq.c math/frexpq.c \ +--- a/src/libobjc/Makefile.in 2011-11-02 16:28:43.000000000 +0100 ++++ b/src/libobjc/Makefile.in 2012-12-08 08:50:47.241873110 +0100 +@@ -51,7 +51,7 @@ + -include ../boehm-gc/threads.mk + + libdir = $(exec_prefix)/lib +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + + # Multilib support variables. + MULTISRCTOP = +--- a/src/libada/Makefile.in 2012-08-06 16:34:27.000000000 +0200 ++++ b/src/libada/Makefile.in 2012-12-08 08:53:01.321876031 +0100 +@@ -62,7 +62,7 @@ + + target_noncanonical:=@target_noncanonical@ + version := $(shell cat $(srcdir)/../gcc/BASE-VER) +-libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR) ++libsubdir := $(libdir)/gcc-cross/$(target_noncanonical)/$(version)$(MULTISUBDIR) + ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR)) + ADA_RTS_SUBDIR=./rts$(subst /,_,$(MULTISUBDIR)) + +--- a/src/libgomp/Makefile.in 2012-09-20 09:23:55.000000000 +0200 ++++ b/src/libgomp/Makefile.in 2012-12-08 08:45:32.157878288 +0100 +@@ -291,8 +291,8 @@ + SUBDIRS = testsuite + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) + search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) $(top_srcdir) +-fincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/finclude +-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++fincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/finclude ++libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + AM_CPPFLAGS = $(addprefix -I, $(search_path)) + AM_CFLAGS = $(XCFLAGS) + AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS) +--- a/src/libgomp/Makefile.am 2012-02-27 14:51:50.000000000 +0100 ++++ b/src/libgomp/Makefile.am 2012-12-08 08:44:48.913867574 +0100 +@@ -9,8 +9,8 @@ + config_path = @config_path@ + search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) $(top_srcdir) + +-fincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/finclude +-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++fincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/finclude ++libsubincludedir = $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + + vpath % $(strip $(search_path)) + +--- a/src/libgcc/Makefile.in 2012-12-08 08:32:41.249881153 +0100 ++++ b/src/libgcc/Makefile.in 2012-12-08 08:43:50.201879083 +0100 +@@ -178,7 +178,7 @@ + STRIP_FOR_TARGET = $(STRIP) + + # Directory in which the compiler finds libraries etc. +-libsubdir = $(libdir)/gcc/$(host_noncanonical)/$(version) ++libsubdir = $(libdir)/gcc-cross/$(host_noncanonical)/$(version) + # Used to install the shared libgcc. + slibdir = @slibdir@ + # Maybe used for DLLs on Windows targets. +--- a/src/libjava/Makefile.in 2012-12-08 08:32:41.249881153 +0100 ++++ b/src/libjava/Makefile.in 2012-12-08 08:51:43.365881984 +0100 +@@ -785,8 +785,8 @@ + + + # This is required by TL_AC_GXX_INCLUDE_DIR. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) ++libexecsubdir = $(libexecdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + toolexeclib_LTLIBRARIES = libgcj.la libgij.la libgcj-tools.la \ + $(am__append_2) $(am__append_3) $(am__append_4) + toolexecmainlib_DATA = libgcj.spec +--- a/src/libjava/Makefile.am 2012-12-08 08:32:41.241881153 +0100 ++++ b/src/libjava/Makefile.am 2012-12-08 08:51:13.481876463 +0100 +@@ -34,9 +34,9 @@ + target_noncanonical = @target_noncanonical@ + + # This is required by TL_AC_GXX_INCLUDE_DIR. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libexecsubdir = $(libexecdir)/gcc-cross/$(target_noncanonical)/$(gcc_version) + + ## + ## What gets installed, and where. +--- a/src/libffi/include/Makefile.am 2006-09-12 18:51:43.000000000 +0200 ++++ b/src/libffi/include/Makefile.am 2012-12-08 09:42:12.313863513 +0100 +@@ -7,6 +7,6 @@ + + # Where generated headers like ffitarget.h get installed. + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) +-toollibffidir := $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++toollibffidir := $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + + toollibffi_HEADERS = ffi.h ffitarget.h +--- a/src/libffi/include/Makefile.in 2012-12-08 09:12:36.913870891 +0100 ++++ b/src/libffi/include/Makefile.in 2012-12-08 09:42:24.901862621 +0100 +@@ -213,7 +213,7 @@ + + # Where generated headers like ffitarget.h get installed. + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) +-toollibffidir := $(libdir)/gcc/$(target_alias)/$(gcc_version)/include ++toollibffidir := $(libdir)/gcc-cross/$(target_alias)/$(gcc_version)/include + toollibffi_HEADERS = ffi.h ffitarget.h + all: all-am + --- gcc-4.8-4.8.2.orig/debian/patches/cross-ma-install-location.diff +++ gcc-4.8-4.8.2/debian/patches/cross-ma-install-location.diff @@ -0,0 +1,346 @@ +--- a/src/boehm-gc/configure.ac ++++ b/src/boehm-gc/configure.ac +@@ -498,14 +498,8 @@ + AC_DEFINE(USE_MMAP, 1, [use MMAP instead of sbrk to get new memory]) + fi + +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- toolexecdir='$(exec_prefix)/$(target_noncanonical)' +- toolexeclibdir='$(toolexecdir)/lib' +-else +- toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' +- toolexeclibdir='$(libdir)' +-fi ++toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' ++toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libada/configure.ac ++++ b/src/libada/configure.ac +@@ -65,15 +65,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libffi/configure.ac ++++ b/src/libffi/configure.ac +@@ -486,14 +486,9 @@ + AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) + fi) + +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +-else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +-fi ++toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++toolexeclibdir='$(libdir)' ++ + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libgcc/configure.ac ++++ b/src/libgcc/configure.ac +@@ -85,8 +85,6 @@ + slibdir="$with_slibdir", + if test "${version_specific_libs}" = yes; then + slibdir='$(libsubdir)' +-elif test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then +- slibdir='$(exec_prefix)/$(host_noncanonical)/lib' + else + slibdir='$(libdir)' + fi) +@@ -131,15 +129,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_noncanonical)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libgfortran/configure.ac ++++ b/src/libgfortran/configure.ac +@@ -98,15 +98,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libgo/configure.ac ++++ b/src/libgo/configure.ac +@@ -77,14 +77,8 @@ + + # Calculate glibgo_toolexecdir, glibgo_toolexeclibdir + # Install a library built with a cross compiler in tooldir, not libdir. +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- nover_glibgo_toolexecdir='${exec_prefix}/${host_alias}' +- nover_glibgo_toolexeclibdir='${toolexecdir}/lib' +-else +- nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}' +- nover_glibgo_toolexeclibdir='${libdir}' +-fi ++nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}' ++nover_glibgo_toolexeclibdir='${libdir}' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libgomp/configure.ac ++++ b/src/libgomp/configure.ac +@@ -76,15 +76,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libitm/configure.ac ++++ b/src/libitm/configure.ac +@@ -90,15 +90,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libjava/configure.ac ++++ b/src/libjava/configure.ac +@@ -1566,15 +1566,8 @@ + toolexeclibdir=$toolexecmainlibdir + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_noncanonical)' +- toolexecmainlibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' +- toolexecmainlibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' ++ toolexecmainlibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) toolexeclibdir=$toolexecmainlibdir ;; # Avoid trailing /. +--- a/src/libmudflap/configure.ac ++++ b/src/libmudflap/configure.ac +@@ -157,15 +157,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libobjc/configure.ac ++++ b/src/libobjc/configure.ac +@@ -109,15 +109,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_noncanonical)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libquadmath/configure.ac ++++ b/src/libquadmath/configure.ac +@@ -93,15 +93,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libssp/configure.ac ++++ b/src/libssp/configure.ac +@@ -170,15 +170,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libstdc++-v3/acinclude.m4 ++++ b/src/libstdc++-v3/acinclude.m4 +@@ -840,14 +840,8 @@ + # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir + # Install a library built with a cross compiler in tooldir, not libdir. + if test x"$glibcxx_toolexecdir" = x"no"; then +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- glibcxx_toolexecdir='${exec_prefix}/${host_alias}' +- glibcxx_toolexeclibdir='${toolexecdir}/lib' +- else +- glibcxx_toolexecdir='${libdir}/gcc/${host_alias}' +- glibcxx_toolexeclibdir='${libdir}' +- fi ++ glibcxx_toolexecdir='${libdir}/gcc/${host_alias}' ++ glibcxx_toolexeclibdir='${libdir}' + multi_os_directory=`$CXX -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/zlib/configure.ac ++++ b/src/zlib/configure.ac +@@ -91,14 +91,9 @@ + + AC_CHECK_HEADERS(unistd.h) + +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +-else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +-fi ++toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++toolexeclibdir='$(libdir)' ++ + if test "$GCC" = yes && $CC -print-multi-os-directory > /dev/null 2>&1; then + multiosdir=/`$CC -print-multi-os-directory` + case $multiosdir in +--- a/src/libatomic/configure.ac ++++ b/src/libatomic/configure.ac +@@ -96,15 +96,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. +--- a/src/libsanitizer/configure.ac ++++ b/src/libsanitizer/configure.ac +@@ -38,15 +38,8 @@ + toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)' + ;; + no) +- if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- # Install a library built with a cross compiler in tooldir, not libdir. +- toolexecdir='$(exec_prefix)/$(target_alias)' +- toolexeclibdir='$(toolexecdir)/lib' +- else +- toolexecdir='$(libdir)/gcc-lib/$(target_alias)' +- toolexeclibdir='$(libdir)' +- fi ++ toolexecdir='$(libdir)/gcc-lib/$(target_alias)' ++ toolexeclibdir='$(libdir)' + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. --- gcc-4.8-4.8.2.orig/debian/patches/cross-no-locale-include.diff +++ gcc-4.8-4.8.2/debian/patches/cross-no-locale-include.diff @@ -0,0 +1,17 @@ +# DP: Don't add /usr/local/include for cross compilers. Assume that +# DP: /usr/include is ready for multiarch, but not /usr/local/include. + +--- a/src/gcc/cppdefault.c ++++ b/src/gcc/cppdefault.c +@@ -66,8 +66,11 @@ + #ifdef LOCAL_INCLUDE_DIR + /* /usr/local/include comes before the fixincluded header files. */ + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, ++#if 0 ++ /* Unsafe to assume that /usr/local/include is ready for multiarch. */ + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, + #endif ++#endif + #ifdef PREFIX_INCLUDE_DIR + { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0 }, + #endif --- gcc-4.8-4.8.2.orig/debian/patches/disable-gdc-tests.diff +++ gcc-4.8-4.8.2/debian/patches/disable-gdc-tests.diff @@ -0,0 +1,15 @@ +# DP: Disable D tests, hang on many buildds + +--- a/src/gcc/d/Make-lang.in ++++ b/src/gcc/d/Make-lang.in +@@ -358,8 +358,8 @@ + # entry point. We feed the former to the latter here. + check-d: check-gdc + # List of targets that can use the generic check- rule and its // variant. +-lang_checks += check-gdc +-lang_checks_parallelized += check-gdc ++#lang_checks += check-gdc ++#lang_checks_parallelized += check-gdc + # For description see comment above check_gcc_parallelize in gcc/Makefile.in. + check_gdc_parallelize = d_do_test.exp=runnable/* + --- gcc-4.8-4.8.2.orig/debian/patches/fix-ffi_call_VFP-with-no-VFP-argument.diff +++ gcc-4.8-4.8.2/debian/patches/fix-ffi_call_VFP-with-no-VFP-argument.diff @@ -0,0 +1,12 @@ +# DP: armhf: Fix ffi_call_VFP with no VFP arguments. + +--- a/src/libffi/src/arm/sysv.S ++++ b/src/libffi/src/arm/sysv.S +@@ -368,6 +368,7 @@ ARM_FUNC_START ffi_call_VFP + + @ Load VFP register args if needed + cmp r0, #0 ++ mov ip, fp + beq LSYM(Lbase_args) + + @ Load only d0 if possible --- gcc-4.8-4.8.2.orig/debian/patches/g++-multiarch-incdir.diff +++ gcc-4.8-4.8.2/debian/patches/g++-multiarch-incdir.diff @@ -0,0 +1,119 @@ +# DP: Use /usr/include//c++/4.x as the include directory +# DP: for host dependent c++ header files. + +Index: b/src/libstdc++-v3/include/Makefile.am +=================================================================== +--- a/src/libstdc++-v3/include/Makefile.am ++++ b/src/libstdc++-v3/include/Makefile.am +@@ -828,7 +828,7 @@ + host_srcdir = ${glibcxx_srcdir}/$(OS_INC_SRCDIR) + default_host_alias = @default_host_alias@ + host_builddir = ./${default_host_alias}/bits +-host_installdir = ${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits ++host_installdir = $(if $(shell $(CC) -print-multiarch),/usr/include/$(shell $(filter-out -m%,$(CC)) -print-multiarch)/c++/$(notdir ${gxx_include_dir})$(MULTISUBDIR)/bits,${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits) + host_headers = \ + ${host_srcdir}/ctype_base.h \ + ${host_srcdir}/ctype_inline.h \ +Index: b/src/libstdc++-v3/include/Makefile.in +=================================================================== +--- a/src/libstdc++-v3/include/Makefile.in ++++ b/src/libstdc++-v3/include/Makefile.in +@@ -1105,7 +1105,7 @@ + host_srcdir = ${glibcxx_srcdir}/$(OS_INC_SRCDIR) + default_host_alias = @default_host_alias@ + host_builddir = ./${default_host_alias}/bits +-host_installdir = ${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits ++host_installdir = $(if $(shell $(CC) -print-multiarch),/usr/include/$(shell $(filter-out -m%,$(CC)) -print-multiarch)/c++/$(notdir ${gxx_include_dir})$(MULTISUBDIR)/bits,${gxx_include_dir}/${default_host_alias}$(MULTISUBDIR)/bits) + host_headers = \ + ${host_srcdir}/ctype_base.h \ + ${host_srcdir}/ctype_inline.h \ +Index: b/src/gcc/Makefile.in +=================================================================== +--- a/src/gcc/Makefile.in ++++ b/src/gcc/Makefile.in +@@ -1106,6 +1106,7 @@ + "prefix=$(prefix)" \ + "local_prefix=$(local_prefix)" \ + "gxx_include_dir=$(gcc_gxx_include_dir)" \ ++ "gxx_tool_include_dir=$(gcc_gxx_tool_include_dir)" \ + "build_tooldir=$(build_tooldir)" \ + "gcc_tooldir=$(gcc_tooldir)" \ + "bindir=$(bindir)" \ +@@ -1542,6 +1543,14 @@ + include $(xmake_file) + endif + ++# Directory in which the compiler finds target-dependent g++ includes. ++ifneq ($(call if_multiarch,non-empty),) ++ gcc_gxx_tool_include_dir = /usr/include/$(MULTIARCH_DIRNAME)/c++/$(BASEVER_c) ++else ++ gcc_gxx_tool_include_dir = $(gcc_gxx_include_dir)/$(target_noncanonical) ++endif ++ ++ + # all-tree.def includes all the tree.def files. + all-tree.def: s-alltree; @true + s-alltree: Makefile +@@ -3986,7 +3995,7 @@ + -DFIXED_INCLUDE_DIR=\"$(libsubdir)/include-fixed\" \ + -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \ + -DGPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT=$(gcc_gxx_include_dir_add_sysroot) \ +- -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \ ++ -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_tool_include_dir)\" \ + -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \ + -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \ + -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \ +Index: b/src/gcc/cppdefault.c +=================================================================== +--- a/src/gcc/cppdefault.c ++++ b/src/gcc/cppdefault.c +@@ -49,6 +49,8 @@ + /* Pick up GNU C++ target-dependent include files. */ + { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1, + GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 }, ++ { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, ++ GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 2 }, + #endif + #ifdef GPLUSPLUS_BACKWARD_INCLUDE_DIR + /* Pick up GNU C++ backward and deprecated include files. */ +Index: b/src/gcc/incpath.c +=================================================================== +--- a/src/gcc/incpath.c ++++ b/src/gcc/incpath.c +@@ -160,6 +160,18 @@ + } + str = reconcat (str, str, dir_separator_str, + imultiarch, NULL); ++ if (p->cplusplus) ++ { ++ char *suffix = strstr (str, "/c++/"); ++ *suffix++ = '\0'; ++ suffix = xstrdup (suffix); ++ str = reconcat (str, str, dir_separator_str, ++ imultiarch, ++ dir_separator_str, suffix, NULL); ++ } ++ else ++ str = reconcat (str, str, dir_separator_str, ++ imultiarch, NULL); + } + add_path (str, SYSTEM, p->cxx_aware, false); + } +@@ -224,7 +236,16 @@ + free (str); + continue; + } +- str = reconcat (str, str, dir_separator_str, imultiarch, NULL); ++ if (p->cplusplus) ++ { ++ char *suffix = strstr (str, "/c++/"); ++ *suffix++ = '\0'; ++ suffix = xstrdup (suffix); ++ str = reconcat (str, str, dir_separator_str, imultiarch, ++ dir_separator_str, suffix, NULL); ++ } ++ else ++ str = reconcat (str, str, dir_separator_str, imultiarch, NULL); + } + + add_path (str, SYSTEM, p->cxx_aware, false); --- gcc-4.8-4.8.2.orig/debian/patches/gcc-as-needed.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-as-needed.diff @@ -0,0 +1,815 @@ +# DP: On linux targets pass --as-needed by default to the linker. + +Index: b/src/gcc/config/aarch64/aarch64-linux.h +=================================================================== +--- a/src/gcc/config/aarch64/aarch64-linux.h ++++ b/src/gcc/config/aarch64/aarch64-linux.h +@@ -25,6 +25,7 @@ + + #define LINUX_TARGET_LINK_SPEC "%{h*} \ + --hash-style=gnu \ ++ --as-needed \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ +Index: b/src/gcc/config/ia64/linux.h +=================================================================== +--- a/src/gcc/config/ia64/linux.h ++++ b/src/gcc/config/ia64/linux.h +@@ -58,7 +58,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC " --hash-style=gnu \ ++#define LINK_SPEC " --hash-style=gnu --as-needed \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/sparc/linux.h +=================================================================== +--- a/src/gcc/config/sparc/linux.h ++++ b/src/gcc/config/sparc/linux.h +@@ -86,7 +86,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf32_sparc --hash-style=gnu %{shared:-shared} \ ++#define LINK_SPEC "-m elf32_sparc --hash-style=gnu --as-needed %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/s390/linux.h +=================================================================== +--- a/src/gcc/config/s390/linux.h ++++ b/src/gcc/config/s390/linux.h +@@ -65,7 +65,7 @@ + + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu \ ++ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu --as-needed \ + %{shared:-shared} \ + %{!shared: \ + %{static:-static} \ +Index: b/src/gcc/config/rs6000/linux64.h +=================================================================== +--- a/src/gcc/config/rs6000/linux64.h ++++ b/src/gcc/config/rs6000/linux64.h +@@ -385,11 +385,11 @@ + " -m elf64ppc") + #endif + +-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --hash-style=gnu %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --hash-style=gnu --as-needed %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}}" + +-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --hash-style=gnu %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --hash-style=gnu --as-needed %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}}" + +Index: b/src/gcc/config/rs6000/sysv4.h +=================================================================== +--- a/src/gcc/config/rs6000/sysv4.h ++++ b/src/gcc/config/rs6000/sysv4.h +@@ -799,7 +799,7 @@ + #define GNU_USER_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) + +-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu --as-needed %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + +Index: b/src/gcc/config/i386/gnu-user64.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user64.h ++++ b/src/gcc/config/i386/gnu-user64.h +@@ -57,6 +57,7 @@ + %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \ + %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \ + --hash-style=gnu \ ++ --as-needed \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/i386/gnu-user.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user.h ++++ b/src/gcc/config/i386/gnu-user.h +@@ -74,7 +74,7 @@ + { "link_emulation", GNU_USER_LINK_EMULATION },\ + { "dynamic_linker", GNU_USER_DYNAMIC_LINKER } + +-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --hash-style=gnu %{shared:-shared} \ ++#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --hash-style=gnu --as-needed %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +Index: b/src/gcc/config/alpha/linux-elf.h +=================================================================== +--- a/src/gcc/config/alpha/linux-elf.h ++++ b/src/gcc/config/alpha/linux-elf.h +@@ -37,7 +37,7 @@ + + #define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER + +-#define LINK_SPEC "-m elf64alpha --hash-style=gnu %{G*} %{relax:-relax} \ ++#define LINK_SPEC "-m elf64alpha --hash-style=gnu --as-needed %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ + %{shared:-shared} \ + %{!shared: \ +Index: b/src/gcc/config/arm/linux-elf.h +=================================================================== +--- a/src/gcc/config/arm/linux-elf.h ++++ b/src/gcc/config/arm/linux-elf.h +@@ -68,6 +68,7 @@ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \ + -X \ + --hash-style=gnu \ ++ --as-needed \ + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + +--- a/src/gcc/config/mips/gnu-user.h ++++ b/src/gcc/config/mips/gnu-user.h +@@ -56,6 +56,7 @@ + #undef GNU_USER_TARGET_LINK_SPEC + #define GNU_USER_TARGET_LINK_SPEC \ + "%(endian_spec) \ ++ -as-needed \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +--- a/src/gcc/config/mips/gnu-user64.h ++++ b/src/gcc/config/mips/gnu-user64.h +@@ -34,6 +34,7 @@ + #define GNU_USER_TARGET_LINK_SPEC "\ + %{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} \ + %{shared} \ ++ -as-needed \ + %(endian_spec) \ + %{!shared: \ + %{!static: \ +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -625,7 +625,7 @@ + rm .libs/libgcj_bc.so; \ + mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \ + $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \ +- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \ ++ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \ + rm .libs/libgcj_bc.so.1; \ + $(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1 + +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -10573,7 +10573,7 @@ + rm .libs/libgcj_bc.so; \ + mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \ + $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \ +- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \ ++ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \ + rm .libs/libgcj_bc.so.1; \ + $(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1 + +--- a/src/libstdc++-v3/testsuite/30_threads/try_lock/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/try_lock/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/try_lock/4.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/try_lock/4.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable/54185.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable/54185.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable/members/1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable/members/1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait_for.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait_for.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait_until.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait_until.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/valid.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/valid.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/get2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/get2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/shared_future/members/wait.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/mutex/try_lock/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/mutex/try_lock/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/async/any.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/async/any.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/async/42819.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/async/42819.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/async/sync.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/async/sync.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/async/async.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/async/async.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/async/49668.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/async/49668.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/set_exception2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/set_exception2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/set_exception.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/set_exception.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/get_future.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/get_future.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/swap.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/swap.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/members/set_value3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/cons/move_assign.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/cons/move_assign.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/cons/alloc.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/cons/alloc.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/promise/cons/move.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/promise/cons/move.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/call_once/39909.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/call_once/39909.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/call_once/49668.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/call_once/49668.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/call_once/call_once1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/call_once/call_once1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/cons/3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/cons/3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/49668.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/49668.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/get_future.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/get_future.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke4.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke4.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke5.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke5.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/reset2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/packaged_task/members/reset2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/lock/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/lock/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/lock/4.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/lock/4.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/this_thread/1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/this_thread/1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/members/1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/members/1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/members/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/members/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/members/3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/members/3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/swap/1.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/swap/1.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/moveable.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/moveable.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/49668.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/49668.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/thread/cons/9.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/thread/cons/9.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/valid.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/valid.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/get2.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/get2.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/share.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/share.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/wait.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/wait.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/wait_for.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/wait_for.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/get.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/get.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/45133.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/45133.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } +--- a/src/libstdc++-v3/testsuite/30_threads/future/members/wait_until.cc ++++ b/src/libstdc++-v3/testsuite/30_threads/future/members/wait_until.cc +@@ -1,5 +1,5 @@ + // { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } +-// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } ++// { dg-options " -std=gnu++0x -pthread -Wl,--no-as-needed" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } } + // { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } + // { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } + // { dg-require-cstdint "" } --- gcc-4.8-4.8.2.orig/debian/patches/gcc-auto-build.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-auto-build.diff @@ -0,0 +1,13 @@ +# DP: Fix cross building a native compiler. + +--- a/src/gcc/configure.ac ++++ b/src/gcc/configure.ac +@@ -1516,7 +1516,7 @@ + /* | [A-Za-z]:[\\/]* ) realsrcdir=${srcdir};; + *) realsrcdir=../${srcdir};; + esac +- CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \ ++ CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD} -DGENERATOR_FILE" \ + LDFLAGS="${LDFLAGS_FOR_BUILD}" GMPINC="" \ + ${realsrcdir}/configure \ + --enable-languages=${enable_languages-all} \ --- gcc-4.8-4.8.2.orig/debian/patches/gcc-base-version.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-base-version.diff @@ -0,0 +1,178 @@ +# DP: Set base version to 4.8, introduce full version 4.8.x. + +Index: b/src/gcc/BASE-VER +=================================================================== +--- a/src/gcc/BASE-VER ++++ b/src/gcc/BASE-VER +@@ -1 +1 @@ +-4.8.2 ++4.8 +Index: b/src/gcc/FULL-VER +=================================================================== +--- /dev/null ++++ b/src/gcc/FULL-VER +@@ -0,0 +1 @@ ++4.8.2 +Index: b/src/gcc/Makefile.in +=================================================================== +--- a/src/gcc/Makefile.in ++++ b/src/gcc/Makefile.in +@@ -795,11 +795,13 @@ + TM_H = $(GTM_H) insn-flags.h $(OPTIONS_H) + + # Variables for version information. +-BASEVER := $(srcdir)/BASE-VER # 4.x.y ++FULLVER := $(srcdir)/FULL-VER # 4.x.y ++BASEVER := $(srcdir)/BASE-VER # 4.x + DEVPHASE := $(srcdir)/DEV-PHASE # experimental, prerelease, "" + DATESTAMP := $(srcdir)/DATESTAMP # YYYYMMDD or empty + REVISION := $(srcdir)/REVISION # [BRANCH revision XXXXXX] + ++FULLVER_c := $(shell cat $(FULLVER)) + BASEVER_c := $(shell cat $(BASEVER)) + DEVPHASE_c := $(shell cat $(DEVPHASE)) + DATESTAMP_c := $(shell cat $(DATESTAMP)) +@@ -818,7 +820,7 @@ + # development phase collapsed to the empty string in release mode + # (i.e. if DEVPHASE_c is empty). The space immediately after the + # comma in the $(if ...) constructs is significant - do not remove it. +-BASEVER_s := "\"$(BASEVER_c)\"" ++FULLVER_s := "\"$(FULLVER_c)\"" + DEVPHASE_s := "\"$(if $(DEVPHASE_c), ($(DEVPHASE_c)))\"" + DATESTAMP_s := "\"$(if $(DEVPHASE_c), $(DATESTAMP_c))\"" + PKGVERSION_s:= "\"@PKGVERSION@\"" +@@ -2020,9 +2022,9 @@ + intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) \ + $(MACHMODE_H) + +-CFLAGS-prefix.o += -DPREFIX=\"$(prefix)\" -DBASEVER=$(BASEVER_s) ++CFLAGS-prefix.o += -DPREFIX=\"$(prefix)\" -DBASEVER=$(FULLVER_s) + prefix.o: prefix.c $(CONFIG_H) $(SYSTEM_H) coretypes.h prefix.h \ +- $(COMMON_TARGET_H) Makefile $(BASEVER) ++ $(COMMON_TARGET_H) Makefile $(FULLVER) + + # Language-independent files. + +@@ -2090,11 +2092,11 @@ + + dumpvers: dumpvers.c + +-CFLAGS-version.o += -DBASEVER=$(BASEVER_s) -DDATESTAMP=$(DATESTAMP_s) \ ++CFLAGS-version.o += -DBASEVER=$(FULLVER_s) -DDATESTAMP=$(DATESTAMP_s) \ + -DREVISION=$(REVISION_s) \ + -DDEVPHASE=$(DEVPHASE_s) -DPKGVERSION=$(PKGVERSION_s) \ + -DBUGURL=$(BUGURL_s) +-version.o: version.c version.h $(REVISION) $(DATESTAMP) $(BASEVER) $(DEVPHASE) ++version.o: version.c version.h $(REVISION) $(DATESTAMP) $(FULLVER) $(DEVPHASE) + + gtype-desc.o: gtype-desc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ + $(HASHTAB_H) $(SPLAY_TREE_H) $(OBSTACK_H) $(BITMAP_H) \ +@@ -2679,10 +2681,10 @@ + coretypes.h $(INPUT_H) $(TM_H) $(COMMON_TARGET_H) common/common-targhooks.h + + bversion.h: s-bversion; @true +-s-bversion: BASE-VER +- echo "#define BUILDING_GCC_MAJOR `echo $(BASEVER_c) | sed -e 's/^\([0-9]*\).*$$/\1/'`" > bversion.h +- echo "#define BUILDING_GCC_MINOR `echo $(BASEVER_c) | sed -e 's/^[0-9]*\.\([0-9]*\).*$$/\1/'`" >> bversion.h +- echo "#define BUILDING_GCC_PATCHLEVEL `echo $(BASEVER_c) | sed -e 's/^[0-9]*\.[0-9]*\.\([0-9]*\)$$/\1/'`" >> bversion.h ++s-bversion: FULL-VER ++ echo "#define BUILDING_GCC_MAJOR `echo $(FULLVER_c) | sed -e 's/^\([0-9]*\).*$$/\1/'`" > bversion.h ++ echo "#define BUILDING_GCC_MINOR `echo $(FULLVER_c) | sed -e 's/^[0-9]*\.\([0-9]*\).*$$/\1/'`" >> bversion.h ++ echo "#define BUILDING_GCC_PATCHLEVEL `echo $(FULLVER_c) | sed -e 's/^[0-9]*\.[0-9]*\.\([0-9]*\)$$/\1/'`" >> bversion.h + echo "#define BUILDING_GCC_VERSION (BUILDING_GCC_MAJOR * 1000 + BUILDING_GCC_MINOR)" >> bversion.h + $(STAMP) s-bversion + +@@ -3798,9 +3800,9 @@ + ## build/version.o is compiled by the $(COMPILER_FOR_BUILD) but needs + ## several C macro definitions, just like version.o + build/version.o: version.c version.h \ +- $(REVISION) $(DATESTAMP) $(BASEVER) $(DEVPHASE) ++ $(REVISION) $(DATESTAMP) $(FULLVER) $(DEVPHASE) + $(COMPILER_FOR_BUILD) -c $(BUILD_COMPILERFLAGS) $(BUILD_CPPFLAGS) \ +- -DBASEVER=$(BASEVER_s) -DDATESTAMP=$(DATESTAMP_s) \ ++ -DBASEVER=$(FULLVER_s) -DDATESTAMP=$(DATESTAMP_s) \ + -DREVISION=$(REVISION_s) \ + -DDEVPHASE=$(DEVPHASE_s) -DPKGVERSION=$(PKGVERSION_s) \ + -DBUGURL=$(BUGURL_s) -o $@ $< +@@ -3994,7 +3996,7 @@ + -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \ + @TARGET_SYSTEM_ROOT_DEFINE@ + +-CFLAGS-cppbuiltin.o += $(PREPROCESSOR_DEFINES) -DBASEVER=$(BASEVER_s) ++CFLAGS-cppbuiltin.o += $(PREPROCESSOR_DEFINES) -DBASEVER=$(FULLVER_s) + cppbuiltin.o: cppbuiltin.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ + $(TARGET_H) $(TARGET_DEF) $(TREE_H) $(CPP_ID_DATA_H) \ + cppbuiltin.h version.h Makefile +@@ -4015,8 +4017,8 @@ + build/gcov-iov.o -o $@ + + gcov-iov.h: s-iov +-s-iov: build/gcov-iov$(build_exeext) $(BASEVER) $(DEVPHASE) +- build/gcov-iov$(build_exeext) '$(BASEVER_c)' '$(DEVPHASE_c)' \ ++s-iov: build/gcov-iov$(build_exeext) $(FULLVER) $(DEVPHASE) ++ build/gcov-iov$(build_exeext) '$(FULLVER_c)' '$(DEVPHASE_c)' \ + > tmp-gcov-iov.h + $(SHELL) $(srcdir)/../move-if-change tmp-gcov-iov.h gcov-iov.h + $(STAMP) s-iov +@@ -4281,8 +4283,8 @@ + TEXI_CPPINT_FILES = cppinternals.texi gcc-common.texi gcc-vers.texi + + # gcc-vers.texi is generated from the version files. +-gcc-vers.texi: $(BASEVER) $(DEVPHASE) +- (echo "@set version-GCC $(BASEVER_c)"; \ ++gcc-vers.texi: $(FULLVER) $(DEVPHASE) ++ (echo "@set version-GCC $(FULLVER_c)"; \ + if [ "$(DEVPHASE_c)" = "experimental" ]; \ + then echo "@set DEVELOPMENT"; \ + else echo "@clear DEVELOPMENT"; \ +@@ -4660,9 +4662,11 @@ + install-driver: installdirs xgcc$(exeext) + -rm -f $(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext) + -$(INSTALL_PROGRAM) xgcc$(exeext) $(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext) ++ifneq ($(GCC_INSTALL_NAME),$(target_noncanonical)-gcc-$(version)) + -rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-$(version)$(exeext) + -( cd $(DESTDIR)$(bindir) && \ + $(LN) $(GCC_INSTALL_NAME)$(exeext) $(target_noncanonical)-gcc-$(version)$(exeext) ) ++endif + -if [ -f gcc-cross$(exeext) ] ; then \ + if [ -d $(DESTDIR)$(gcc_tooldir)/bin/. ] ; then \ + rm -f $(DESTDIR)$(gcc_tooldir)/bin/gcc$(exeext); \ +Index: b/src/libjava/Makefile.am +=================================================================== +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -772,7 +772,7 @@ + install-data-local: + $(PRE_INSTALL) + ## Install the .pc file. +- @pc_version=`echo $(GCJVERSION) | sed -e 's/[.][^.]*$$//'`; \ ++ @pc_version=$(GCJVERSION); \ + file="libgcj-$${pc_version}.pc"; \ + $(mkinstalldirs) $(DESTDIR)$(pkgconfigdir); \ + echo " $(INSTALL_DATA) libgcj.pc $(DESTDIR)$(pkgconfigdir)/$$file"; \ +Index: b/src/libjava/Makefile.in +=================================================================== +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -12426,7 +12426,7 @@ + @BUILD_ECJ1_TRUE@ mv $(DESTDIR)$(libexecsubdir)/`echo ecjx | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'` $(DESTDIR)$(libexecsubdir)/ecj1$(host_exeext) + install-data-local: + $(PRE_INSTALL) +- @pc_version=`echo $(GCJVERSION) | sed -e 's/[.][^.]*$$//'`; \ ++ @pc_version=$(GCJVERSION); \ + file="libgcj-$${pc_version}.pc"; \ + $(mkinstalldirs) $(DESTDIR)$(pkgconfigdir); \ + echo " $(INSTALL_DATA) libgcj.pc $(DESTDIR)$(pkgconfigdir)/$$file"; \ +Index: b/src/libjava/testsuite/lib/libjava.exp +=================================================================== +--- a/src/libjava/testsuite/lib/libjava.exp ++++ b/src/libjava/testsuite/lib/libjava.exp +@@ -177,7 +177,7 @@ + + set text [eval exec "$GCJ_UNDER_TEST -B$specdir -v 2>@ stdout"] + regexp " version \[^\n\r\]*" $text version +- set libjava_version [lindex $version 1] ++ set libjava_version 4.8 + + verbose "version: $libjava_version" + --- gcc-4.8-4.8.2.orig/debian/patches/gcc-cloog-dl.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-cloog-dl.diff @@ -0,0 +1,487 @@ +# DP: Link against -ldl instead of -lcloog -lppl. Exit with an error when using +# DP: the Graphite loop transformation infrastructure without having the +# DP: libcloog-ppl0 package installed. Packages using these optimizations +# DP: should build-depend on libcloog-ppl0. + +2011-01-04 Jakub Jelinek + + * Makefile.in (BACKENDLIBS): Link against -ldl instead of + -lcloog -lppl. + (graphite.o, graphite%.o): Force -O, remove -fkeep-inline-functions. + (GRAPHITE_CLOOG_UTIL_H, GRAPHITE_POLY_H): New. + (graphite*.o): Adjust dependencies. + * graphite-cloog-compat.h: Include . Reference libcloog and + libppl symbols through pointers in cloog_pointers__ variable. + * graphite.c (init_cloog_pointers): New function. + (graphite_transform_loops): Call init_cloog_pointers. + * graphite-clast-to-gimple.c (gcc_type_for_iv_of_clast_loop): Rename + stmt_for argument to stmt_fora. + * graphite-poly.h: Include graphite-cloog-util.h. + +Index: b/src/gcc/Makefile.in +=================================================================== +--- a/src/gcc/Makefile.in ++++ b/src/gcc/Makefile.in +@@ -965,6 +965,8 @@ + PLUGIN_H = plugin.h $(GCC_PLUGIN_H) + PLUGIN_VERSION_H = plugin-version.h configargs.h + LIBFUNCS_H = libfuncs.h $(HASHTAB_H) ++GRAPHITE_CLOOG_UTIL_H = graphite-cloog-util.h graphite-cloog-compat.h ++GRAPHITE_POLY_H = graphite-poly.h $(GRAPHITE_CLOOG_UTIL_H) + + # + # Now figure out from those variables how to compile and link. +@@ -1019,7 +1021,7 @@ + # and the system's installed libraries. + LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) \ + $(LIBDECNUMBER) $(HOST_LIBS) +-BACKENDLIBS = $(CLOOGLIBS) $(PPLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ ++BACKENDLIBS = $(GMPLIBS) $(if $(CLOOGLIBS),-ldl) $(PLUGINLIBS) $(HOST_LIBS) \ + $(ZLIB) + # Any system libraries needed just for GNAT. + SYSLIBS = @GNAT_LIBEXC@ +@@ -2605,40 +2607,40 @@ + $(TREE_FLOW_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) tree-pass.h value-prof.h + graphite.o : graphite.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(DIAGNOSTIC_CORE_H) \ + $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h \ +- $(DBGCNT_H) graphite-ppl.h graphite-poly.h graphite-scop-detection.h \ ++ $(DBGCNT_H) graphite-ppl.h $(GRAPHITE_POLY_H) graphite-scop-detection.h \ + graphite-clast-to-gimple.h graphite-sese-to-poly.h + graphite-blocking.o : graphite-blocking.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \ +- sese.h graphite-ppl.h graphite-poly.h ++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) + graphite-clast-to-gimple.o : graphite-clast-to-gimple.c $(CONFIG_H) \ + $(SYSTEM_H) coretypes.h $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) $(TREE_DUMP_H) \ +- $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-cloog-util.h \ +- graphite-ppl.h graphite-poly.h graphite-clast-to-gimple.h \ ++ $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h $(GRAPHITE_CLOOG_UTIL_H) \ ++ graphite-ppl.h $(GRAPHITE_POLY_H) graphite-clast-to-gimple.h \ + graphite-dependences.h graphite-cloog-compat.h + graphite-cloog-util.o : graphite-cloog-util.c $(CONFIG_H) $(SYSTEM_H) \ +- coretypes.h graphite-cloog-util.h graphite-cloog-compat.h ++ coretypes.h $(GRAPHITE_CLOOG_UTIL_H) graphite-cloog-compat.h + graphite-dependences.o : graphite-dependences.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \ +- sese.h graphite-ppl.h graphite-poly.h graphite-dependences.h \ +- graphite-cloog-util.h ++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) graphite-dependences.h \ ++ $(GRAPHITE_CLOOG_UTIL_H) + graphite-flattening.o : graphite-flattening.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \ +- sese.h graphite-ppl.h graphite-poly.h ++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) + graphite-interchange.o : graphite-interchange.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) \ +- sese.h graphite-ppl.h graphite-poly.h ++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) + graphite-poly.o : graphite-poly.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) $(TREE_DUMP_H) gimple-pretty-print.h \ +- $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-ppl.h graphite-poly.h \ +- graphite-dependences.h graphite-cloog-util.h ++ $(CFGLOOP_H) $(TREE_DATA_REF_H) sese.h graphite-ppl.h $(GRAPHITE_POLY_H) \ ++ graphite-dependences.h $(GRAPHITE_CLOOG_UTIL_H) + graphite-ppl.o : graphite-ppl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ +- graphite-cloog-util.h graphite-ppl.h ++ $(GRAPHITE_CLOOG_UTIL_H) graphite-ppl.h + graphite-scop-detection.o : graphite-scop-detection.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TREE_FLOW_H) $(CFGLOOP_H) $(TREE_DATA_REF_H) $(TREE_PASS_H) \ +- sese.h graphite-ppl.h graphite-poly.h graphite-scop-detection.h ++ sese.h graphite-ppl.h $(GRAPHITE_POLY_H) graphite-scop-detection.h + graphite-sese-to-poly.o : graphite-sese-to-poly.c $(CONFIG_H) \ + $(SYSTEM_H) coretypes.h $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) \ +- $(TREE_DATA_REF_H) domwalk.h sese.h graphite-ppl.h graphite-poly.h \ ++ $(TREE_DATA_REF_H) domwalk.h sese.h graphite-ppl.h $(GRAPHITE_POLY_H) \ + graphite-sese-to-poly.h + tree-vect-loop.o: tree-vect-loop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + $(TM_H) $(GGC_H) $(TREE_H) $(BASIC_BLOCK_H) $(DIAGNOSTIC_H) $(TREE_FLOW_H) \ +@@ -3457,6 +3459,15 @@ + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \ + $< $(OUTPUT_OPTION) + ++graphite%.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite%.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) ++graphite.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) ++ + # Build auxiliary files that support ecoff format. + mips-tfile: mips-tfile.o $(LIBDEPS) + $(LINKER) $(LINKERFLAGS) $(LDFLAGS) -o $@ \ +Index: b/src/gcc/graphite-cloog-compat.h +=================================================================== +--- a/src/gcc/graphite-cloog-compat.h ++++ b/src/gcc/graphite-cloog-compat.h +@@ -272,4 +272,279 @@ + return m->NbRows; + } + #endif /* CLOOG_ORG */ ++ ++#include ++#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11 ++#define DYNSYMS_PPL11 ++#else ++#define DYNSYMS_PPL11 \ ++ DYNSYM (ppl_new_PIP_Problem_from_constraints); \ ++ DYNSYM (ppl_PIP_Problem_is_satisfiable); \ ++ DYNSYM (ppl_delete_PIP_Problem); ++#endif ++#define DYNSYMS \ ++ DYNSYM (cloog_block_alloc); \ ++ DYNSYM (cloog_block_list_free); \ ++ DYNSYM (cloog_block_list_malloc); \ ++ DYNSYM (cloog_clast_create); \ ++ DYNSYM (cloog_clast_free); \ ++ DYNSYM (cloog_domain_free); \ ++ DYNSYM (cloog_domain_matrix2domain); \ ++ DYNSYM (cloog_initialize); \ ++ DYNSYM (cloog_loop_malloc); \ ++ DYNSYM (cloog_matrix_alloc); \ ++ DYNSYM (cloog_matrix_copy); \ ++ DYNSYM (cloog_matrix_free); \ ++ DYNSYM (cloog_matrix_print); \ ++ DYNSYM (cloog_names_malloc); \ ++ DYNSYM (cloog_names_scalarize); \ ++ DYNSYM (cloog_options_free); \ ++ DYNSYM (cloog_options_malloc); \ ++ DYNSYM (cloog_program_dump_cloog); \ ++ DYNSYM (cloog_program_extract_scalars); \ ++ DYNSYM (cloog_program_free); \ ++ DYNSYM (cloog_program_generate); \ ++ DYNSYM (cloog_program_malloc); \ ++ DYNSYM (cloog_program_print); \ ++ DYNSYM (cloog_program_scatter); \ ++ DYNSYM (cloog_statement_alloc); \ ++ DYNSYM (cloog_domain_union); \ ++ DYNSYM (cloog_matrix_read); \ ++ DYNSYM (cloog_new_pol); \ ++ DYNSYM (cloog_vector_gcd); \ ++ DYNSYM (ppl_finalize); \ ++ DYNSYM (ppl_assign_Coefficient_from_mpz_t); \ ++ DYNSYM (ppl_assign_Linear_Expression_from_Linear_Expression); \ ++ DYNSYM (ppl_Coefficient_to_mpz_t); \ ++ DYNSYM (ppl_Constraint_coefficient); \ ++ DYNSYM (ppl_Constraint_inhomogeneous_term); \ ++ DYNSYM (ppl_Constraint_space_dimension); \ ++ DYNSYM (ppl_Constraint_System_begin); \ ++ DYNSYM (ppl_Constraint_System_const_iterator_dereference); \ ++ DYNSYM (ppl_Constraint_System_const_iterator_equal_test); \ ++ DYNSYM (ppl_Constraint_System_const_iterator_increment); \ ++ DYNSYM (ppl_Constraint_System_end); \ ++ DYNSYM (ppl_Constraint_System_insert_Constraint); \ ++ DYNSYM (ppl_Constraint_System_space_dimension); \ ++ DYNSYM (ppl_Constraint_type); \ ++ DYNSYM (ppl_delete_Coefficient); \ ++ DYNSYM (ppl_delete_Constraint); \ ++ DYNSYM (ppl_delete_Constraint_System_const_iterator); \ ++ DYNSYM (ppl_delete_Linear_Expression); \ ++ DYNSYM (ppl_delete_Pointset_Powerset_C_Polyhedron); \ ++ DYNSYM (ppl_delete_Pointset_Powerset_C_Polyhedron_iterator); \ ++ DYNSYM (ppl_delete_Polyhedron); \ ++ DYNSYM (ppl_Linear_Expression_add_to_coefficient); \ ++ DYNSYM (ppl_Linear_Expression_add_to_inhomogeneous); \ ++ DYNSYM (ppl_Linear_Expression_coefficient); \ ++ DYNSYM (ppl_Linear_Expression_inhomogeneous_term); \ ++ DYNSYM (ppl_Linear_Expression_space_dimension); \ ++ DYNSYM (ppl_new_Coefficient); \ ++ DYNSYM (ppl_new_Coefficient_from_mpz_t); \ ++ DYNSYM (ppl_new_Constraint); \ ++ DYNSYM (ppl_new_Constraint_System); \ ++ DYNSYM (ppl_new_Constraint_System_const_iterator); \ ++ DYNSYM (ppl_new_C_Polyhedron_from_C_Polyhedron); \ ++ DYNSYM (ppl_new_C_Polyhedron_from_space_dimension); \ ++ DYNSYM (ppl_new_C_Polyhedron_recycle_Constraint_System); \ ++ DYNSYM (ppl_new_Linear_Expression); \ ++ DYNSYM (ppl_new_Linear_Expression_from_Constraint); \ ++ DYNSYM (ppl_new_Linear_Expression_from_Linear_Expression); \ ++ DYNSYM (ppl_new_Linear_Expression_with_dimension); \ ++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron); \ ++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron); \ ++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension); \ ++ DYNSYM (ppl_new_Pointset_Powerset_C_Polyhedron_iterator); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_add_constraint); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_difference_assign); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_intersection_assign); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_is_empty); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_end); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_iterator_increment); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_maximize); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_minimize); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_size); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_space_dimension); \ ++ DYNSYM (ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign); \ ++ DYNSYM (ppl_Polyhedron_add_constraint); \ ++ DYNSYM (ppl_Polyhedron_add_constraints); \ ++ DYNSYM (ppl_Polyhedron_add_space_dimensions_and_embed); \ ++ DYNSYM (ppl_Polyhedron_get_constraints); \ ++ DYNSYM (ppl_Polyhedron_map_space_dimensions); \ ++ DYNSYM (ppl_Polyhedron_remove_space_dimensions); \ ++ DYNSYM (ppl_Polyhedron_space_dimension); \ ++ DYNSYM (ppl_subtract_Linear_Expression_from_Linear_Expression); \ ++ DYNSYM (pprint); \ ++ DYNSYM (stmt_block); \ ++ DYNSYM (stmt_for); \ ++ DYNSYM (stmt_guard); \ ++ DYNSYM (stmt_root); \ ++ DYNSYM (stmt_user); \ ++ DYNSYM (stmt_ass); \ ++ DYNSYM (ppl_delete_Constraint_System); \ ++ DYNSYM (ppl_initialize); \ ++ DYNSYM (ppl_new_Constraint_System_from_Constraint); \ ++ DYNSYM (ppl_new_C_Polyhedron_from_Constraint_System); \ ++ DYNSYM (ppl_Polyhedron_affine_image); \ ++ DYNSYM (ppl_io_fprint_Pointset_Powerset_C_Polyhedron); \ ++ DYNSYMS_PPL11 ++extern struct cloog_pointers_s__ ++{ ++ bool inited; ++ void *h; ++#define DYNSYM(x) __typeof (x) *p_##x ++ DYNSYMS ++#undef DYNSYM ++} cloog_pointers__; ++ ++#define cloog_block_alloc (*cloog_pointers__.p_cloog_block_alloc) ++#define cloog_block_list_free (*cloog_pointers__.p_cloog_block_list_free) ++#define cloog_block_list_malloc (*cloog_pointers__.p_cloog_block_list_malloc) ++#define cloog_clast_create (*cloog_pointers__.p_cloog_clast_create) ++#define cloog_clast_free (*cloog_pointers__.p_cloog_clast_free) ++#define cloog_domain_free (*cloog_pointers__.p_cloog_domain_free) ++#define cloog_domain_matrix2domain (*cloog_pointers__.p_cloog_domain_matrix2domain) ++#define cloog_initialize (*cloog_pointers__.p_cloog_initialize) ++#ifndef CLOOG_ORG ++#undef cloog_loop_malloc ++#define cloog_loop_malloc(STATE) (*cloog_pointers__.p_cloog_loop_malloc) () ++#else ++#define cloog_loop_malloc (*cloog_pointers__.p_cloog_loop_malloc) ++#endif ++#define cloog_matrix_alloc (*cloog_pointers__.p_cloog_matrix_alloc) ++#define cloog_matrix_copy (*cloog_pointers__.p_cloog_matrix_copy) ++#define cloog_matrix_free (*cloog_pointers__.p_cloog_matrix_free) ++#define cloog_matrix_print (*cloog_pointers__.p_cloog_matrix_print) ++#define cloog_names_malloc (*cloog_pointers__.p_cloog_names_malloc) ++#define cloog_names_scalarize (*cloog_pointers__.p_cloog_names_scalarize) ++#define cloog_options_free (*cloog_pointers__.p_cloog_options_free) ++#ifndef CLOOG_ORG ++#undef cloog_options_malloc ++#define cloog_options_malloc(STATE) (*cloog_pointers__.p_cloog_options_malloc) () ++#undef cloog_program_dump_cloog ++#define cloog_program_dump_cloog(DUMPFILE, PROGRAM, SCATTERINGLIST) \ ++ (*cloog_pointers__.p_cloog_program_dump_cloog) (DUMPFILE, PROGRAM) ++#undef cloog_program_extract_scalars ++#define cloog_program_extract_scalars(PROG, SCATT, OPT) \ ++ (*cloog_pointers__.p_cloog_program_extract_scalars) (PROG, SCATT) ++#else ++#define cloog_options_malloc (*cloog_pointers__.p_cloog_options_malloc) ++#define cloog_program_dump_cloog (*cloog_pointers__.p_cloog_program_dump_cloog) ++#define cloog_program_extract_scalars (*cloog_pointers__.p_cloog_program_extract_scalars) ++#endif ++#define cloog_program_free (*cloog_pointers__.p_cloog_program_free) ++#define cloog_program_generate (*cloog_pointers__.p_cloog_program_generate) ++#define cloog_program_malloc (*cloog_pointers__.p_cloog_program_malloc) ++#define cloog_program_print (*cloog_pointers__.p_cloog_program_print) ++#ifndef CLOOG_ORG ++#undef cloog_program_scatter ++#define cloog_program_scatter(PROG, SCATT, OPT) \ ++ (*cloog_pointers__.p_cloog_program_scatter) (PROG, SCATT) ++#undef cloog_statement_alloc ++#define cloog_statement_alloc(STATE, INDEX) \ ++ (*cloog_pointers__.p_cloog_statement_alloc) (INDEX) ++#else ++#define cloog_program_scatter (*cloog_pointers__.p_cloog_program_scatter) ++#define cloog_statement_alloc (*cloog_pointers__.p_cloog_statement_alloc) ++#endif ++#define cloog_domain_union (*cloog_pointers__.p_cloog_domain_union) ++#define cloog_matrix_read (*cloog_pointers__.p_cloog_matrix_read) ++#define cloog_new_pol (*cloog_pointers__.p_cloog_new_pol) ++#define cloog_vector_gcd (*cloog_pointers__.p_cloog_vector_gcd) ++#define ppl_finalize (*cloog_pointers__.p_ppl_finalize) ++#define ppl_assign_Coefficient_from_mpz_t (*cloog_pointers__.p_ppl_assign_Coefficient_from_mpz_t) ++#define ppl_assign_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_assign_Linear_Expression_from_Linear_Expression) ++#define ppl_Coefficient_to_mpz_t (*cloog_pointers__.p_ppl_Coefficient_to_mpz_t) ++#define ppl_Constraint_coefficient (*cloog_pointers__.p_ppl_Constraint_coefficient) ++#define ppl_Constraint_inhomogeneous_term (*cloog_pointers__.p_ppl_Constraint_inhomogeneous_term) ++#define ppl_Constraint_space_dimension (*cloog_pointers__.p_ppl_Constraint_space_dimension) ++#define ppl_Constraint_System_begin (*cloog_pointers__.p_ppl_Constraint_System_begin) ++#define ppl_Constraint_System_const_iterator_dereference (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_dereference) ++#define ppl_Constraint_System_const_iterator_equal_test (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_equal_test) ++#define ppl_Constraint_System_const_iterator_increment (*cloog_pointers__.p_ppl_Constraint_System_const_iterator_increment) ++#define ppl_Constraint_System_end (*cloog_pointers__.p_ppl_Constraint_System_end) ++#define ppl_Constraint_System_insert_Constraint (*cloog_pointers__.p_ppl_Constraint_System_insert_Constraint) ++#define ppl_Constraint_System_space_dimension (*cloog_pointers__.p_ppl_Constraint_System_space_dimension) ++#define ppl_Constraint_type (*cloog_pointers__.p_ppl_Constraint_type) ++#define ppl_delete_Coefficient (*cloog_pointers__.p_ppl_delete_Coefficient) ++#define ppl_delete_Constraint (*cloog_pointers__.p_ppl_delete_Constraint) ++#define ppl_delete_Constraint_System_const_iterator (*cloog_pointers__.p_ppl_delete_Constraint_System_const_iterator) ++#define ppl_delete_Linear_Expression (*cloog_pointers__.p_ppl_delete_Linear_Expression) ++#define ppl_delete_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_delete_Pointset_Powerset_C_Polyhedron) ++#define ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (*cloog_pointers__.p_ppl_delete_Pointset_Powerset_C_Polyhedron_iterator) ++#define ppl_delete_Polyhedron (*cloog_pointers__.p_ppl_delete_Polyhedron) ++#define ppl_Linear_Expression_add_to_coefficient (*cloog_pointers__.p_ppl_Linear_Expression_add_to_coefficient) ++#define ppl_Linear_Expression_add_to_inhomogeneous (*cloog_pointers__.p_ppl_Linear_Expression_add_to_inhomogeneous) ++#define ppl_Linear_Expression_coefficient (*cloog_pointers__.p_ppl_Linear_Expression_coefficient) ++#define ppl_Linear_Expression_inhomogeneous_term (*cloog_pointers__.p_ppl_Linear_Expression_inhomogeneous_term) ++#define ppl_Linear_Expression_space_dimension (*cloog_pointers__.p_ppl_Linear_Expression_space_dimension) ++#define ppl_new_Coefficient (*cloog_pointers__.p_ppl_new_Coefficient) ++#define ppl_new_Coefficient_from_mpz_t (*cloog_pointers__.p_ppl_new_Coefficient_from_mpz_t) ++#define ppl_new_Constraint (*cloog_pointers__.p_ppl_new_Constraint) ++#define ppl_new_Constraint_System (*cloog_pointers__.p_ppl_new_Constraint_System) ++#define ppl_new_Constraint_System_const_iterator (*cloog_pointers__.p_ppl_new_Constraint_System_const_iterator) ++#define ppl_new_C_Polyhedron_from_C_Polyhedron (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_C_Polyhedron) ++#define ppl_new_C_Polyhedron_from_space_dimension (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_space_dimension) ++#define ppl_new_C_Polyhedron_recycle_Constraint_System (*cloog_pointers__.p_ppl_new_C_Polyhedron_recycle_Constraint_System) ++#define ppl_new_Linear_Expression (*cloog_pointers__.p_ppl_new_Linear_Expression) ++#define ppl_new_Linear_Expression_from_Constraint (*cloog_pointers__.p_ppl_new_Linear_Expression_from_Constraint) ++#define ppl_new_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_new_Linear_Expression_from_Linear_Expression) ++#define ppl_new_Linear_Expression_with_dimension (*cloog_pointers__.p_ppl_new_Linear_Expression_with_dimension) ++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron) ++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron) ++#define ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension) ++#define ppl_new_Pointset_Powerset_C_Polyhedron_iterator (*cloog_pointers__.p_ppl_new_Pointset_Powerset_C_Polyhedron_iterator) ++#define ppl_Pointset_Powerset_C_Polyhedron_add_constraint (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_add_constraint) ++#define ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed) ++#define ppl_Pointset_Powerset_C_Polyhedron_difference_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_difference_assign) ++#define ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_intersection_assign) ++#define ppl_Pointset_Powerset_C_Polyhedron_is_empty (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_is_empty) ++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_begin) ++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference) ++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_end (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_end) ++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test) ++#define ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_iterator_increment) ++#define ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions) ++#define ppl_Pointset_Powerset_C_Polyhedron_maximize (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_maximize) ++#define ppl_Pointset_Powerset_C_Polyhedron_minimize (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_minimize) ++#define ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions) ++#define ppl_Pointset_Powerset_C_Polyhedron_size (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_size) ++#define ppl_Pointset_Powerset_C_Polyhedron_space_dimension (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_space_dimension) ++#define ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (*cloog_pointers__.p_ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign) ++#define ppl_Polyhedron_add_constraint (*cloog_pointers__.p_ppl_Polyhedron_add_constraint) ++#define ppl_Polyhedron_add_constraints (*cloog_pointers__.p_ppl_Polyhedron_add_constraints) ++#define ppl_Polyhedron_add_space_dimensions_and_embed (*cloog_pointers__.p_ppl_Polyhedron_add_space_dimensions_and_embed) ++#define ppl_Polyhedron_get_constraints (*cloog_pointers__.p_ppl_Polyhedron_get_constraints) ++#define ppl_Polyhedron_map_space_dimensions (*cloog_pointers__.p_ppl_Polyhedron_map_space_dimensions) ++#define ppl_Polyhedron_remove_space_dimensions (*cloog_pointers__.p_ppl_Polyhedron_remove_space_dimensions) ++#define ppl_Polyhedron_space_dimension (*cloog_pointers__.p_ppl_Polyhedron_space_dimension) ++#define ppl_subtract_Linear_Expression_from_Linear_Expression (*cloog_pointers__.p_ppl_subtract_Linear_Expression_from_Linear_Expression) ++#define pprint (*cloog_pointers__.p_pprint) ++#define stmt_block (*cloog_pointers__.p_stmt_block) ++#define stmt_for (*cloog_pointers__.p_stmt_for) ++#define stmt_guard (*cloog_pointers__.p_stmt_guard) ++#define stmt_root (*cloog_pointers__.p_stmt_root) ++#define stmt_user (*cloog_pointers__.p_stmt_user) ++#define stmt_ass (*cloog_pointers__.p_stmt_ass) ++#define ppl_delete_Constraint_System (*cloog_pointers__.p_ppl_delete_Constraint_System) ++#define ppl_initialize (*cloog_pointers__.p_ppl_initialize) ++#define ppl_new_Constraint_System_from_Constraint (*cloog_pointers__.p_ppl_new_Constraint_System_from_Constraint) ++#define ppl_new_C_Polyhedron_from_Constraint_System (*cloog_pointers__.p_ppl_new_C_Polyhedron_from_Constraint_System) ++#define ppl_Polyhedron_affine_image (*cloog_pointers__.p_ppl_Polyhedron_affine_image) ++#define ppl_io_fprint_Pointset_Powerset_C_Polyhedron (*cloog_pointers__.p_ppl_io_fprint_Pointset_Powerset_C_Polyhedron) ++#if !(PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11) ++#define ppl_new_PIP_Problem_from_constraints (*cloog_pointers__.p_ppl_new_PIP_Problem_from_constraints) ++#define ppl_PIP_Problem_is_satisfiable (*cloog_pointers__.p_ppl_PIP_Problem_is_satisfiable) ++#define ppl_delete_PIP_Problem (*cloog_pointers__.p_ppl_delete_PIP_Problem) ++#endif ++ ++#define cloog_finalize (*cloog_pointers__.p_ppl_finalize) ++ ++ + #endif /* GRAPHITE_CLOOG_COMPAT_H */ +Index: b/src/gcc/graphite.c +=================================================================== +--- a/src/gcc/graphite.c ++++ b/src/gcc/graphite.c +@@ -56,6 +56,35 @@ + + CloogState *cloog_state; + ++__typeof (cloog_pointers__) cloog_pointers__; ++ ++static bool ++init_cloog_pointers (void) ++{ ++ void *h; ++ ++ if (cloog_pointers__.inited) ++ return cloog_pointers__.h != NULL; ++ h = dlopen ("libcloog-isl.so.4", RTLD_LAZY); ++ cloog_pointers__.h = h; ++ if (h == NULL) ++ return false; ++#define DYNSYM(x) \ ++ do \ ++ { \ ++ union { __typeof (cloog_pointers__.p_##x) p; void *q; } u; \ ++ u.q = dlsym (h, #x); \ ++ if (u.q == NULL) \ ++ return false; \ ++ cloog_pointers__.p_##x = u.p; \ ++ } \ ++ while (0) ++ DYNSYMS ++#undef DYNSYM ++ return true; ++} ++ ++ + /* Print global statistics to FILE. */ + + static void +@@ -201,6 +230,12 @@ + return false; + } + ++ if (!init_cloog_pointers ()) ++ { ++ sorry ("Graphite loop optimizations can only be used if the libcloog-isl4 package is installed"); ++ return false; ++ } ++ + scev_reset (); + recompute_all_dominators (); + initialize_original_copy_tables (); +Index: b/src/gcc/graphite-clast-to-gimple.c +=================================================================== +--- a/src/gcc/graphite-clast-to-gimple.c ++++ b/src/gcc/graphite-clast-to-gimple.c +@@ -836,7 +836,7 @@ + from STMT_FOR. */ + + static tree +-type_for_clast_for (struct clast_for *stmt_for, ivs_params_p ip) ++type_for_clast_for (struct clast_for *stmt_fora, ivs_params_p ip) + { + mpz_t bound_one, bound_two; + tree lb_type, ub_type; +@@ -844,8 +844,8 @@ + mpz_init (bound_one); + mpz_init (bound_two); + +- lb_type = type_for_clast_expr (stmt_for->LB, ip, bound_one, bound_two); +- ub_type = type_for_clast_expr (stmt_for->UB, ip, bound_one, bound_two); ++ lb_type = type_for_clast_expr (stmt_fora->LB, ip, bound_one, bound_two); ++ ub_type = type_for_clast_expr (stmt_fora->UB, ip, bound_one, bound_two); + + mpz_clear (bound_one); + mpz_clear (bound_two); +Index: b/src/gcc/graphite-poly.h +=================================================================== +--- a/src/gcc/graphite-poly.h ++++ b/src/gcc/graphite-poly.h +@@ -22,6 +22,8 @@ + #ifndef GCC_GRAPHITE_POLY_H + #define GCC_GRAPHITE_POLY_H + ++#include "graphite-cloog-util.h" ++ + typedef struct poly_dr *poly_dr_p; + DEF_VEC_P(poly_dr_p); + DEF_VEC_ALLOC_P (poly_dr_p, heap); --- gcc-4.8-4.8.2.orig/debian/patches/gcc-d-lang.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-d-lang.diff @@ -0,0 +1,251 @@ +# DP: Add D options and specs for the gcc driver. + +Index: b/src/gcc/d/lang-specs.h +=================================================================== +--- /dev/null ++++ b/src/gcc/d/lang-specs.h +@@ -0,0 +1,31 @@ ++/* lang-specs.h -- D frontend for GCC. ++ Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* %{!M} probably doesn't make sense because we would need ++ to do that -- -MD and -MMD doesn't sound like a plan for D.... */ ++ ++{".d", "@d", 0, 1, 0 }, ++{".D", "@d", 0, 1, 0 }, ++{".dd", "@d", 0, 1, 0 }, ++{".DD", "@d", 0, 1, 0 }, ++{".di", "@d", 0, 1, 0 }, ++{".DI", "@d", 0, 1, 0 }, ++{"@d", ++ "%{!E:cc1d %i %(cc1_options) %(cc1d) %I %{nostdinc*} %{+e*} %{I*} %{J*}\ ++ %{M} %{MM} %{!fsyntax-only:%(invoke_as)}}", 0, 1, 0 }, ++ +Index: b/src/gcc/d/lang.opt +=================================================================== +--- /dev/null ++++ b/src/gcc/d/lang.opt +@@ -0,0 +1,208 @@ ++; GDC -- D front-end for GCC ++; Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++; ++; This program is free software; you can redistribute it and/or modify ++; it under the terms of the GNU General Public License as published by ++; the Free Software Foundation; either version 2 of the License, or ++; (at your option) any later version. ++; ++; This program is distributed in the hope that it will be useful, ++; but WITHOUT ANY WARRANTY; without even the implied warranty of ++; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++; GNU General Public License for more details. ++; ++; You should have received a copy of the GNU General Public License ++; along with GCC; see the file COPYING3. If not see ++; . ++ ++Language ++D ++ ++debuglib= ++Driver Joined ++Debug library to use instead of phobos ++ ++defaultlib= ++Driver Joined ++Default library to use instead of phobos ++ ++fassert ++D ++Permit the use of the assert keyword ++ ++; For D: defaults to on ++fbounds-check ++D ++Generate code to check bounds before indexing arrays ++ ++fbuiltin ++D Var(flag_no_builtin, 0) ++Recognize built-in functions ++ ++fdebug ++D ++Compile in debug code ++ ++fdebug= ++D Joined RejectNegative ++-fdebug,-fdebug=,-fdebug= Compile in debug code, code <= level, or code identified by ident ++ ++fdeps= ++D Joined RejectNegative ++-fdeps= Write module dependencies to filename ++ ++fdoc ++D ++Generate documentation ++ ++fdoc-dir= ++D Joined RejectNegative ++-fdoc-dir= Write documentation file to docdir directory ++ ++fdoc-file= ++D Joined RejectNegative ++-fdoc-file= Write documentation file to filename ++ ++fdoc-inc= ++D Joined RejectNegative ++-fdoc-inc= Include a Ddoc macro file ++ ++fdump-source ++D RejectNegative ++Dump decoded UTF-8 text and source from HTML ++ ++fd-verbose ++D ++Print information about D language processing to stdout ++ ++fd-vtls ++D ++List all variables going into thread local storage ++ ++femit-templates ++D ++-femit-templates Emit templates code and data even if the linker cannot merge multiple copies ++ ++fignore-unknown-pragmas ++D ++Ignore unsupported pragmas ++ ++fin ++D ++Generate runtime code for in() contracts ++ ++fintfc ++Generate D interface files ++ ++fintfc-dir= ++D Joined RejectNegative ++-fintfc-dir= Write D interface files to directory ++ ++fintfc-file= ++D Joined RejectNegative ++-fintfc-file= Write D interface file to ++ ++finvariants ++D ++Generate runtime code for invariant()'s ++ ++fmake-deps= ++D Joined RejectNegative ++-fmake-deps= Write dependency output to the given file ++ ++fmake-mdeps= ++D Joined RejectNegative ++Like -fmake-deps= but ignore system modules ++ ++femit-moduleinfo ++D ++Generate ModuleInfo struct for output module ++ ++fonly= ++D Joined RejectNegative ++Process all modules specified on the command line, but only generate code for the module specified by the argument ++ ++fout ++D ++Generate runtime code for out() contracts ++ ++fproperty ++D ++Enforce property syntax ++ ++frelease ++D ++Compile release version ++ ++fsplit-dynamic-arrays ++D Var(flag_split_darrays) ++Split dynamic arrays into length and pointer when passing to functions ++ ++funittest ++D ++Compile in unittest code ++ ++fversion= ++D Joined RejectNegative ++-fversion= Compile in version code >= or identified by ++ ++fXf= ++D Joined RejectNegative ++-fXf= Write JSON file to ++ ++imultilib ++D Joined Separate ++-imultilib Set to be the multilib include subdirectory ++ ++iprefix ++D Joined Separate ++-iprefix Specify as a prefix for next two options ++ ++isysroot ++D Joined Separate ++-isysroot Set to be the system root directory ++ ++isystem ++D Joined Separate ++-isystem Add to the start of the system include path ++ ++I ++D Joined Separate ++-I Add to the end of the main include path ++ ++J ++D Joined Separate ++-J Put MODULE files in 'directory' ++ ++nophoboslib ++Driver ++Do not link the standard D library in the compilation ++ ++nostdinc ++D ++Do not search standard system include directories (those specified with -isystem will still be used) ++ ++static-libphobos ++Driver ++Link the standard D library statically in the compilation ++ ++Wall ++D ++; Documented in c.opt ++ ++Wcast-result ++D Warning Var(warn_cast_result) ++Warn about casts that will produce a null or nil result ++ ++Wdeprecated ++D ++; Documented in c.opt ++ ++Werror ++D ++; Documented in common.opt ++ ++Wunknown-pragmas ++D ++; Documented in c.opt ++ --- gcc-4.8-4.8.2.orig/debian/patches/gcc-default-format-security.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-default-format-security.diff @@ -0,0 +1,37 @@ +# DP: Turn on -Wformat -Wformat-security by default for C, C++, ObjC, ObjC++. + +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -3351,6 +3351,11 @@ + in future warnings may be added to @option{-Wformat-security} that are not + included in @option{-Wformat-nonliteral}.) + ++NOTE: In Ubuntu 8.10 and later versions this option is enabled by default ++for C, C++, ObjC, ObjC++. To disable, use @option{-Wno-format-security}, ++or disable all format warnings with @option{-Wformat=0}. To make format ++security warnings fatal, specify @option{-Werror=format-security}. ++ + @item -Wformat-y2k + @opindex Wformat-y2k + @opindex Wno-format-y2k +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -654,11 +654,14 @@ + #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G" + #endif + ++/* no separate spec, just shove it into the ssp default spec */ ++#define FORMAT_SECURITY_SPEC "%{!Wno-format-security:%{!Wformat|!Wformat=2|!Wall:-Wformat} -Wformat-security}" ++ + #ifndef SSP_DEFAULT_SPEC + #ifdef TARGET_LIBC_PROVIDES_SSP +-#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:-fstack-protector}}}}" ++#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:-fstack-protector}}}} " FORMAT_SECURITY_SPEC + #else +-#define SSP_DEFAULT_SPEC "" ++#define SSP_DEFAULT_SPEC FORMAT_SECURITY_SPEC + #endif + #endif + --- gcc-4.8-4.8.2.orig/debian/patches/gcc-default-fortify-source.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-default-fortify-source.diff @@ -0,0 +1,40 @@ +# DP: Turn on -D_FORTIFY_SOURCE=2 by default for C, C++, ObjC, ObjC++, +# DP: if the optimization level is > 0 + +--- + gcc/doc/invoke.texi | 6 ++++++ + gcc/c-family/c-cppbuiltin.c | 3 + + 2 files changed, 9 insertions(+), 0 deletions(-) + +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -6561,6 +6561,12 @@ + Please note the warning under @option{-fgcse} about + invoking @option{-O2} on programs that use computed gotos. + ++NOTE: In Ubuntu 8.10 and later versions, @option{-D_FORTIFY_SOURCE=2} is ++set by default, and is activated when @option{-O} is set to 2 or higher. ++This enables additional compile-time and run-time checks for several libc ++functions. To disable, specify either @option{-U_FORTIFY_SOURCE} or ++@option{-D_FORTIFY_SOURCE=0}. ++ + @item -O3 + @opindex O3 + Optimize yet more. @option{-O3} turns on all optimizations specified +Index: b/src/gcc/c-family/c-cppbuiltin.c +=================================================================== +--- a/src/gcc/c-family/c-cppbuiltin.c ++++ b/src/gcc/c-family/c-cppbuiltin.c +@@ -853,6 +853,10 @@ + builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0); + builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0); + ++ /* Fortify Source enabled by default for optimization levels > 0 */ ++ if (optimize) ++ builtin_define_with_int_value ("_FORTIFY_SOURCE", 2); ++ + /* Misc. */ + if (flag_gnu89_inline) + cpp_define (pfile, "__GNUC_GNU_INLINE__"); --- gcc-4.8-4.8.2.orig/debian/patches/gcc-default-relro.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-default-relro.diff @@ -0,0 +1,33 @@ +# DP: Turn on -Wl,-z,relro by default. + +--- + gcc/doc/invoke.texi | 3 +++ + gcc/gcc.c | 1 + + 2 files changed, 4 insertions(+), 0 deletions(-) + +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -10049,6 +10049,9 @@ + linker. When using the GNU linker, you can also get the same effect with + @option{-Wl,-Map=output.map}. + ++NOTE: In Ubuntu 8.10 and later versions, for LDFLAGS, the option ++@option{-Wl,-z,relro} is used. To disable, use @option{-Wl,-z,norelro}. ++ + @item -u @var{symbol} + @opindex u + Pretend the symbol @var{symbol} is undefined, to force linking of +Index: b/src/gcc/gcc.c +=================================================================== +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -741,6 +741,7 @@ + "%{flto|flto=*:% tmp-tm.texi +- case `echo X|tr X '\101'` in \ +- A) tr -d '\015' < tmp-tm.texi > tmp2-tm.texi ;; \ +- *) tr -d '\r' < tmp-tm.texi > tmp2-tm.texi ;; \ +- esac +- mv tmp2-tm.texi tmp-tm.texi +- $(SHELL) $(srcdir)/../move-if-change tmp-tm.texi tm.texi +- @if cmp -s $(srcdir)/doc/tm.texi tm.texi; then \ +- $(STAMP) $@; \ +- elif test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/tm.texi.in \ +- && ( test $(srcdir)/doc/tm.texi -nt $(srcdir)/target.def \ +- || test $(srcdir)/doc/tm.texi -nt $(srcdir)/c-family/c-target.def \ +- || test $(srcdir)/doc/tm.texi -nt $(srcdir)/common/common-target.def \ +- ); then \ +- echo >&2 ; \ +- echo You should edit $(srcdir)/doc/tm.texi.in rather than $(srcdir)/doc/tm.texi . >&2 ; \ +- false; \ +- else \ +- echo >&2 ; \ +- echo Verify that you have permission to grant a GFDL license for all >&2 ; \ +- echo new text in tm.texi, then copy it to $(srcdir)/doc/tm.texi. >&2 ; \ +- false; \ +- fi ++ cat $(srcdir)/doc/tm.texi.in > tmp-tm.texi ++ $(STAMP) $@ + + GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ + $(host_xm_file_list) \ --- gcc-4.8-4.8.2.orig/debian/patches/gcc-hash-style-both.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-hash-style-both.diff @@ -0,0 +1,167 @@ +# DP: Link using --hash-style=both (alpha, amd64, armel, armhf, ia64, i386, powerpc, ppc64, s390, sparc) + +2006-07-11 Jakub Jelinek + + * config/i386/linux.h (LINK_SPEC): Add --hash-style=both. + * config/i386/linux64.h (LINK_SPEC): Likewise. + * config/rs6000/sysv4.h (LINK_OS_LINUX_SPEC): Likewise. + * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC32, + LINK_OS_LINUX_SPEC64): Likewise. + * config/s390/linux.h (LINK_SPEC): Likewise. + * config/ia64/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux64.h (LINK_SPEC, LINK_ARCH32_SPEC, + LINK_ARCH64_SPEC): Likewise. + * config/alpha/linux-elf.h (LINK_SPEC): Likewise. + +2009-12-21 Matthias Klose + + * config/arm/linux-elf.h (LINK_SPEC): Add --hash-style=both. + +2012-11-17 Matthias Klose + + * config/aarch64/aarch64-linux.h (LINK_SPEC): Add --hash-style=both. + +--- + gcc/config/alpha/linux-elf.h | 2 +- + gcc/config/i386/linux.h | 2 +- + gcc/config/i386/linux64.h | 2 +- + gcc/config/ia64/linux.h | 2 +- + gcc/config/rs6000/linux64.h | 4 ++-- + gcc/config/rs6000/sysv4.h | 2 +- + gcc/config/s390/linux.h | 2 +- + gcc/config/sparc/linux.h | 2 +- + 8 files changed, 9 insertions(+), 9 deletions(-) + +Index: b/src/gcc/config/alpha/linux-elf.h +=================================================================== +--- a/src/gcc/config/alpha/linux-elf.h ++++ b/src/gcc/config/alpha/linux-elf.h +@@ -37,7 +37,7 @@ + + #define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER + +-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ ++#define LINK_SPEC "-m elf64alpha --hash-style=both %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ + %{shared:-shared} \ + %{!shared: \ +Index: b/src/gcc/config/ia64/linux.h +=================================================================== +--- a/src/gcc/config/ia64/linux.h ++++ b/src/gcc/config/ia64/linux.h +@@ -58,7 +58,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "\ ++#define LINK_SPEC " --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/rs6000/linux64.h +=================================================================== +--- a/src/gcc/config/rs6000/linux64.h ++++ b/src/gcc/config/rs6000/linux64.h +@@ -385,11 +385,11 @@ + " -m elf64ppc") + #endif + +-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}}" + +-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}}" + +Index: b/src/gcc/config/rs6000/sysv4.h +=================================================================== +--- a/src/gcc/config/rs6000/sysv4.h ++++ b/src/gcc/config/rs6000/sysv4.h +@@ -788,7 +788,7 @@ + #define GNU_USER_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) + +-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + +Index: b/src/gcc/config/s390/linux.h +=================================================================== +--- a/src/gcc/config/s390/linux.h ++++ b/src/gcc/config/s390/linux.h +@@ -65,7 +65,7 @@ + + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ ++ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{static:-static} \ +Index: b/src/gcc/config/sparc/linux.h +=================================================================== +--- a/src/gcc/config/sparc/linux.h ++++ b/src/gcc/config/sparc/linux.h +@@ -86,7 +86,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf32_sparc %{shared:-shared} \ ++#define LINK_SPEC "-m elf32_sparc --hash-style=both %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/arm/linux-elf.h +=================================================================== +--- a/src/gcc/config/arm/linux-elf.h ++++ b/src/gcc/config/arm/linux-elf.h +@@ -67,6 +67,7 @@ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \ + -X \ ++ --hash-style=both \ + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + +Index: b/src/gcc/config/i386/gnu-user.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user.h ++++ b/src/gcc/config/i386/gnu-user.h +@@ -74,7 +74,7 @@ + { "link_emulation", GNU_USER_LINK_EMULATION },\ + { "dynamic_linker", GNU_USER_DYNAMIC_LINKER } + +-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ ++#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --hash-style=both %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +Index: b/src/gcc/config/i386/gnu-user64.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user64.h ++++ b/src/gcc/config/i386/gnu-user64.h +@@ -56,6 +56,7 @@ + "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \ + %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \ + %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \ ++ --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/aarch64/aarch64-linux.h +=================================================================== +--- a/src/gcc/config/aarch64/aarch64-linux.h ++++ b/src/gcc/config/aarch64/aarch64-linux.h +@@ -24,6 +24,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-aarch64.so.1" + + #define LINUX_TARGET_LINK_SPEC "%{h*} \ ++ --hash-style=both \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ --- gcc-4.8-4.8.2.orig/debian/patches/gcc-hash-style-gnu.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-hash-style-gnu.diff @@ -0,0 +1,168 @@ +# DP: Link using --hash-style=gnu (aarch64, alpha, amd64, armel, armhf, ia64, +# DP: i386, powerpc, ppc64, s390, sparc) + +2006-07-11 Jakub Jelinek + + * config/i386/linux.h (LINK_SPEC): Add --hash-style=gnu. + * config/i386/linux64.h (LINK_SPEC): Likewise. + * config/rs6000/sysv4.h (LINK_OS_LINUX_SPEC): Likewise. + * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC32, + LINK_OS_LINUX_SPEC64): Likewise. + * config/s390/linux.h (LINK_SPEC): Likewise. + * config/ia64/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux64.h (LINK_SPEC, LINK_ARCH32_SPEC, + LINK_ARCH64_SPEC): Likewise. + * config/alpha/linux-elf.h (LINK_SPEC): Likewise. + +2009-12-21 Matthias Klose + + * config/arm/linux-elf.h (LINK_SPEC): Add --hash-style=gnu. + +2012-11-17 Matthias Klose + + * config/aarch64/aarch64-linux.h (LINK_SPEC): Add --hash-style=gnu. + +--- + gcc/config/alpha/linux-elf.h | 2 +- + gcc/config/i386/linux.h | 2 +- + gcc/config/i386/linux64.h | 2 +- + gcc/config/ia64/linux.h | 2 +- + gcc/config/rs6000/linux64.h | 4 ++-- + gcc/config/rs6000/sysv4.h | 2 +- + gcc/config/s390/linux.h | 2 +- + gcc/config/sparc/linux.h | 2 +- + 8 files changed, 9 insertions(+), 9 deletions(-) + +Index: b/src/gcc/config/alpha/linux-elf.h +=================================================================== +--- a/src/gcc/config/alpha/linux-elf.h ++++ b/src/gcc/config/alpha/linux-elf.h +@@ -37,7 +37,7 @@ + + #define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER + +-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ ++#define LINK_SPEC "-m elf64alpha --hash-style=gnu %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ + %{shared:-shared} \ + %{!shared: \ +Index: b/src/gcc/config/ia64/linux.h +=================================================================== +--- a/src/gcc/config/ia64/linux.h ++++ b/src/gcc/config/ia64/linux.h +@@ -58,7 +58,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "\ ++#define LINK_SPEC " --hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/rs6000/linux64.h +=================================================================== +--- a/src/gcc/config/rs6000/linux64.h ++++ b/src/gcc/config/rs6000/linux64.h +@@ -385,11 +385,11 @@ + " -m elf64ppc") + #endif + +-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}}" + +-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}}" + +Index: b/src/gcc/config/rs6000/sysv4.h +=================================================================== +--- a/src/gcc/config/rs6000/sysv4.h ++++ b/src/gcc/config/rs6000/sysv4.h +@@ -788,7 +788,7 @@ + #define GNU_USER_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) + +-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + +Index: b/src/gcc/config/s390/linux.h +=================================================================== +--- a/src/gcc/config/s390/linux.h ++++ b/src/gcc/config/s390/linux.h +@@ -65,7 +65,7 @@ + + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ ++ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{static:-static} \ +Index: b/src/gcc/config/sparc/linux.h +=================================================================== +--- a/src/gcc/config/sparc/linux.h ++++ b/src/gcc/config/sparc/linux.h +@@ -86,7 +86,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf32_sparc %{shared:-shared} \ ++#define LINK_SPEC "-m elf32_sparc --hash-style=gnu %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/arm/linux-elf.h +=================================================================== +--- a/src/gcc/config/arm/linux-elf.h ++++ b/src/gcc/config/arm/linux-elf.h +@@ -67,6 +67,7 @@ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \ + -X \ ++ --hash-style=gnu \ + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + +Index: b/src/gcc/config/i386/gnu-user.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user.h ++++ b/src/gcc/config/i386/gnu-user.h +@@ -74,7 +74,7 @@ + { "link_emulation", GNU_USER_LINK_EMULATION },\ + { "dynamic_linker", GNU_USER_DYNAMIC_LINKER } + +-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ ++#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --hash-style=gnu %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +Index: b/src/gcc/config/i386/gnu-user64.h +=================================================================== +--- a/src/gcc/config/i386/gnu-user64.h ++++ b/src/gcc/config/i386/gnu-user64.h +@@ -56,6 +56,7 @@ + "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \ + %{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \ + %{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \ ++ --hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +Index: b/src/gcc/config/aarch64/aarch64-linux.h +=================================================================== +--- a/src/gcc/config/aarch64/aarch64-linux.h ++++ b/src/gcc/config/aarch64/aarch64-linux.h +@@ -26,6 +26,7 @@ + #define CPP_SPEC "%{pthread:-D_REENTRANT}" + + #define LINUX_TARGET_LINK_SPEC "%{h*} \ ++ --hash-style=gnu \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ --- gcc-4.8-4.8.2.orig/debian/patches/gcc-ice-apport.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-ice-apport.diff @@ -0,0 +1,24 @@ +# DP: Report an ICE to apport (if apport is available +# DP: and the environment variable GCC_NOAPPORT is not set) + +Index: b/src/gcc/gcc.c +=================================================================== +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -6256,6 +6256,16 @@ + fnotice (stderr, "Preprocessed source stored into %s file," + " please attach this to your bugreport.\n", + temp_filenames[attempt * 2]); ++ if (!getenv ("GCC_NOAPPORT") ++ && !access ("/usr/share/apport/gcc_ice_hook", R_OK | X_OK)) ++ { ++ char *cmd = XNEWVEC (char, 50 + strlen (temp_filenames[attempt * 2]) ++ + strlen (new_argv[0])); ++ sprintf (cmd, "/usr/share/apport/gcc_ice_hook %s %s", ++ new_argv[0], temp_filenames[attempt * 2]); ++ system (cmd); ++ free (cmd); ++ } + /* Make sure it is not deleted. */ + free (temp_filenames[attempt * 2]); + temp_filenames[attempt * 2] = NULL; --- gcc-4.8-4.8.2.orig/debian/patches/gcc-ice-hack.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-ice-hack.diff @@ -0,0 +1,315 @@ +# DP: Retry the build on an ice, save the calling options and preprocessed +# DP: source when the ice is reproducible. + +2004-01-23 Jakub Jelinek + + * gcc.c (execute): Don't free first string early, but at the end + of the function. Call retry_ice if compiler exited with + ICE_EXIT_CODE. + (retry_ice): New function. + * diagnostic.c (diagnostic_count_diagnostic, + diagnostic_action_after_output, error_recursion): Exit with + ICE_EXIT_CODE instead of FATAL_EXIT_CODE. + +#--- a/src/gcc/Makefile.in +#+++ b/src/gcc/Makefile.in +#@@ -181,6 +181,8 @@ SYSCALLS.c.X-warn = -Wno-strict-prototypes -Wno-error +# dfp.o-warn = -Wno-error +# # mips-tfile.c contains -Wcast-qual warnings. +# mips-tfile.o-warn = -Wno-error +#+# gcc-ice-hack +#+gcc.o-warn = -Wno-error +# +# # All warnings have to be shut off in stage1 if the compiler used then +# # isn't gcc; configure determines that. WARN_CFLAGS will be either +Index: b/src/gcc/gcc.c +=================================================================== +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -249,6 +249,9 @@ + #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX) + static const char *convert_filename (const char *, int, int); + #endif ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++static void retry_ice (const char *prog, const char **argv); ++#endif + + static const char *getenv_spec_function (int, const char **); + static const char *if_exists_spec_function (int, const char **); +@@ -2773,7 +2776,7 @@ + } + } + +- if (string != commands[i].prog) ++ if (i && string != commands[i].prog) + free (CONST_CAST (char *, string)); + } + +@@ -2826,6 +2829,16 @@ + else if (WIFEXITED (status) + && WEXITSTATUS (status) >= MIN_FATAL_STATUS) + { ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++ /* For ICEs in cc1, cc1obj, cc1plus see if it is ++ reproducible or not. */ ++ const char *p; ++ if (WEXITSTATUS (status) == ICE_EXIT_CODE ++ && i == 0 ++ && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR)) ++ && ! strncmp (p + 1, "cc1", 3)) ++ retry_ice (commands[0].prog, commands[0].argv); ++#endif + if (WEXITSTATUS (status) > greatest_status) + greatest_status = WEXITSTATUS (status); + ret_code = -1; +@@ -2883,6 +2896,9 @@ + } + } + ++ if (commands[0].argv[0] != commands[0].prog) ++ free (CONST_CAST (char *, commands[0].argv[0])); ++ + return ret_code; + } + } +@@ -6036,6 +6052,227 @@ + switches[switchnum].validated = true; + } + ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++#define RETRY_ICE_ATTEMPTS 2 ++ ++static void ++retry_ice (const char *prog, const char **argv) ++{ ++ int nargs, out_arg = -1, quiet = 0, attempt; ++ int pid, retries, sleep_interval; ++ const char **new_argv; ++ char *temp_filenames[RETRY_ICE_ATTEMPTS * 2 + 2]; ++ ++ if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-")) ++ return; ++ ++ for (nargs = 0; argv[nargs] != NULL; ++nargs) ++ /* Only retry compiler ICEs, not preprocessor ones. */ ++ if (! strcmp (argv[nargs], "-E")) ++ return; ++ else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o') ++ { ++ if (out_arg == -1) ++ out_arg = nargs; ++ else ++ return; ++ } ++ /* If the compiler is going to output any time information, ++ it might varry between invocations. */ ++ else if (! strcmp (argv[nargs], "-quiet")) ++ quiet = 1; ++ else if (! strcmp (argv[nargs], "-ftime-report")) ++ return; ++ ++ if (out_arg == -1 || !quiet) ++ return; ++ ++ memset (temp_filenames, '\0', sizeof (temp_filenames)); ++ new_argv = XALLOCAVEC (const char *, nargs + 3); ++ memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *)); ++ new_argv[nargs++] = "-frandom-seed=0"; ++ new_argv[nargs] = NULL; ++ if (new_argv[out_arg][2] == '\0') ++ new_argv[out_arg + 1] = "-"; ++ else ++ new_argv[out_arg] = "-o-"; ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS + 1; ++attempt) ++ { ++ int fd = -1; ++ int status; ++ ++ temp_filenames[attempt * 2] = make_temp_file (".out"); ++ temp_filenames[attempt * 2 + 1] = make_temp_file (".err"); ++ ++ if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ int i; ++ int fd1, fd2; ++ struct stat st1, st2; ++ size_t n, len; ++ char *buf; ++ ++ buf = XNEWVEC (char, 8192); ++ ++ for (i = 0; i < 2; ++i) ++ { ++ fd1 = open (temp_filenames[i], O_RDONLY); ++ fd2 = open (temp_filenames[2 + i], O_RDONLY); ++ ++ if (fd1 < 0 || fd2 < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (st1.st_size != st2.st_size) ++ { ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ len = 0; ++ for (n = st1.st_size; n; n -= len) ++ { ++ len = n; ++ if (len > 4096) ++ len = 4096; ++ ++ if (read (fd1, buf, len) != (int) len ++ || read (fd2, buf + 4096, len) != (int) len) ++ { ++ i = -1; ++ break; ++ } ++ ++ if (memcmp (buf, buf + 4096, len) != 0) ++ break; ++ } ++ ++ close (fd1); ++ close (fd2); ++ ++ if (n) ++ break; ++ } ++ ++ free (buf); ++ if (i == -1) ++ break; ++ ++ if (i != 2) ++ { ++ fnotice (stderr, "The bug is not reproducible, so it is" ++ " likely a hardware or OS problem.\n"); ++ break; ++ } ++ ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ break; ++ write (fd, "//", 2); ++ for (i = 0; i < nargs; i++) ++ { ++ write (fd, " ", 1); ++ write (fd, new_argv[i], strlen (new_argv[i])); ++ } ++ write (fd, "\n", 1); ++ new_argv[nargs] = "-E"; ++ new_argv[nargs + 1] = NULL; ++ } ++ ++ /* Fork a subprocess; wait and retry if it fails. */ ++ sleep_interval = 1; ++ pid = -1; ++ for (retries = 0; retries < 4; retries++) ++ { ++ pid = fork (); ++ if (pid >= 0) ++ break; ++ sleep (sleep_interval); ++ sleep_interval *= 2; ++ } ++ ++ if (pid < 0) ++ break; ++ else if (pid == 0) ++ { ++ if (attempt != RETRY_ICE_ATTEMPTS) ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 1) ++ { ++ close (1); ++ dup (fd); ++ close (fd); ++ } ++ ++ fd = open (temp_filenames[attempt * 2 + 1], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 2) ++ { ++ close (2); ++ dup (fd); ++ close (fd); ++ } ++ ++ if (prog == new_argv[0]) ++ execvp (prog, CONST_CAST2 (char *const *, const char **, new_argv)); ++ else ++ execv (new_argv[0], CONST_CAST2 (char *const *, const char **, new_argv)); ++ exit (-1); ++ } ++ ++ if (waitpid (pid, &status, 0) < 0) ++ break; ++ ++ if (attempt < RETRY_ICE_ATTEMPTS ++ && (! WIFEXITED (status) || WEXITSTATUS (status) != ICE_EXIT_CODE)) ++ { ++ fnotice (stderr, "The bug is not reproducible, so it is" ++ " likely a hardware or OS problem.\n"); ++ break; ++ } ++ else if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ close (fd); ++ if (WIFEXITED (status) ++ && WEXITSTATUS (status) == SUCCESS_EXIT_CODE) ++ { ++ fnotice (stderr, "Preprocessed source stored into %s file," ++ " please attach this to your bugreport.\n", ++ temp_filenames[attempt * 2]); ++ /* Make sure it is not deleted. */ ++ free (temp_filenames[attempt * 2]); ++ temp_filenames[attempt * 2] = NULL; ++ break; ++ } ++ } ++ } ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS * 2 + 2; attempt++) ++ if (temp_filenames[attempt]) ++ { ++ unlink (temp_filenames[attempt]); ++ free (temp_filenames[attempt]); ++ } ++} ++#endif ++ + /* Search for a file named NAME trying various prefixes including the + user's -B prefix and some standard ones. + Return the absolute file name found. If nothing is found, return NAME. */ +Index: b/src/gcc/diagnostic.c +=================================================================== +--- a/src/gcc/diagnostic.c ++++ b/src/gcc/diagnostic.c +@@ -455,7 +455,7 @@ + real_abort (); + diagnostic_finish (context); + fnotice (stderr, "compilation terminated.\n"); +- exit (FATAL_EXIT_CODE); ++ exit (ICE_EXIT_CODE); + + default: + gcc_unreachable (); --- gcc-4.8-4.8.2.orig/debian/patches/gcc-linaro-doc.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-linaro-doc.diff @@ -0,0 +1,2511 @@ +# DP: Changes for the Linaro 4.8-2014.03 release (documentation). + +Index: b/src/gcc/doc/extend.texi +=================================================================== +--- a/src/gcc/doc/extend.texi ++++ b/src/gcc/doc/extend.texi +@@ -8781,6 +8781,7 @@ + * Alpha Built-in Functions:: + * ARM iWMMXt Built-in Functions:: + * ARM NEON Intrinsics:: ++* ARM ACLE Intrinsics:: + * AVR Built-in Functions:: + * Blackfin Built-in Functions:: + * FR-V Built-in Functions:: +@@ -9046,6 +9047,14 @@ + + @include arm-neon-intrinsics.texi + ++@node ARM ACLE Intrinsics ++@subsection ARM ACLE Intrinsics ++ ++These built-in intrinsics for the ARMv8-A CRC32 extension are available when ++the @option{-march=armv8-a+crc} switch is used: ++ ++@include arm-acle-intrinsics.texi ++ + @node AVR Built-in Functions + @subsection AVR Built-in Functions + +Index: b/src/gcc/doc/arm-acle-intrinsics.texi +=================================================================== +--- /dev/null ++++ b/src/gcc/doc/arm-acle-intrinsics.texi +@@ -0,0 +1,55 @@ ++@c Copyright (C) 2013-2014 Free Software Foundation, Inc. ++@c This is part of the GCC manual. ++@c For copying conditions, see the file gcc.texi. ++ ++@subsubsection CRC32 intrinsics ++ ++@itemize @bullet ++@item uint32_t __crc32b (uint32_t, uint8_t) ++@*@emph{Form of expected instruction(s):} @code{crc32b @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32h (uint32_t, uint16_t) ++@*@emph{Form of expected instruction(s):} @code{crc32h @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32w (uint32_t, uint32_t) ++@*@emph{Form of expected instruction(s):} @code{crc32w @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32d (uint32_t, uint64_t) ++@*@emph{Form of expected instruction(s):} Two @code{crc32w @var{r0}, @var{r0}, @var{r0}} ++instructions for AArch32. One @code{crc32w @var{w0}, @var{w0}, @var{x0}} instruction for ++AArch64. ++@end itemize ++ ++@itemize @bullet ++@item uint32_t __crc32cb (uint32_t, uint8_t) ++@*@emph{Form of expected instruction(s):} @code{crc32cb @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32ch (uint32_t, uint16_t) ++@*@emph{Form of expected instruction(s):} @code{crc32ch @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32cw (uint32_t, uint32_t) ++@*@emph{Form of expected instruction(s):} @code{crc32cw @var{r0}, @var{r0}, @var{r0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32_t __crc32cd (uint32_t, uint64_t) ++@*@emph{Form of expected instruction(s):} Two @code{crc32cw @var{r0}, @var{r0}, @var{r0}} ++instructions for AArch32. One @code{crc32cw @var{w0}, @var{w0}, @var{x0}} instruction for ++AArch64. ++@end itemize +Index: b/src/gcc/doc/tm.texi +=================================================================== +--- a/src/gcc/doc/tm.texi ++++ b/src/gcc/doc/tm.texi +@@ -10926,8 +10926,16 @@ + @samp{TARGET_INIT_BUILTINS}. @var{fndecl} is the declaration of the + built-in function. @var{n_args} is the number of arguments passed to + the function; the arguments themselves are pointed to by @var{argp}. +-The result is another tree containing a simplified expression for the +-call's result. If @var{ignore} is true the value will be ignored. ++The result is another tree, valid for both GIMPLE and GENERIC, ++containing a simplified expression for the call's result. If ++@var{ignore} is true the value will be ignored. ++@end deftypefn ++ ++@deftypefn {Target Hook} bool TARGET_GIMPLE_FOLD_BUILTIN (gimple_stmt_iterator *@var{gsi}) ++Fold a call to a machine specific built-in function that was set up ++by @samp{TARGET_INIT_BUILTINS}. @var{gsi} points to the gimple ++statement holding the function call. Returns true if any change ++was made to the GIMPLE stream. + @end deftypefn + + @deftypefn {Target Hook} int TARGET_COMPARE_VERSION_PRIORITY (tree @var{decl1}, tree @var{decl2}) +Index: b/src/gcc/doc/tm.texi.in +=================================================================== +--- a/src/gcc/doc/tm.texi.in ++++ b/src/gcc/doc/tm.texi.in +@@ -10772,10 +10772,13 @@ + @samp{TARGET_INIT_BUILTINS}. @var{fndecl} is the declaration of the + built-in function. @var{n_args} is the number of arguments passed to + the function; the arguments themselves are pointed to by @var{argp}. +-The result is another tree containing a simplified expression for the +-call's result. If @var{ignore} is true the value will be ignored. ++The result is another tree, valid for both GIMPLE and GENERIC, ++containing a simplified expression for the call's result. If ++@var{ignore} is true the value will be ignored. + @end deftypefn + ++@hook TARGET_GIMPLE_FOLD_BUILTIN ++ + @hook TARGET_COMPARE_VERSION_PRIORITY + This hook is used to compare the target attributes in two functions to + determine which function's features get higher priority. This is used +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -418,7 +418,7 @@ + -ftree-parallelize-loops=@var{n} -ftree-pre -ftree-partial-pre -ftree-pta @gol + -ftree-reassoc -ftree-sink -ftree-slsr -ftree-sra @gol + -ftree-switch-conversion -ftree-tail-merge @gol +--ftree-ter -ftree-vect-loop-version -ftree-vectorize -ftree-vrp @gol ++-ftree-ter -ftree-vectorize -ftree-vrp @gol + -funit-at-a-time -funroll-all-loops -funroll-loops @gol + -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops @gol + -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol +@@ -510,7 +510,9 @@ + -mtp=@var{name} -mtls-dialect=@var{dialect} @gol + -mword-relocations @gol + -mfix-cortex-m3-ldrd @gol +--munaligned-access} ++-munaligned-access @gol ++-mneon-for-64bits @gol ++-mrestrict-it} + + @emph{AVR Options} + @gccoptlist{-mmcu=@var{mcu} -maccumulate-args -mbranch-cost=@var{cost} @gol +@@ -6590,7 +6592,7 @@ + @option{-Os} disables the following optimization flags: + @gccoptlist{-falign-functions -falign-jumps -falign-loops @gol + -falign-labels -freorder-blocks -freorder-blocks-and-partition @gol +--fprefetch-loop-arrays -ftree-vect-loop-version} ++-fprefetch-loop-arrays} + + @item -Ofast + @opindex Ofast +@@ -7831,19 +7833,20 @@ + Perform basic block vectorization on trees. This flag is enabled by default at + @option{-O3} and when @option{-ftree-vectorize} is enabled. + +-@item -ftree-vect-loop-version +-@opindex ftree-vect-loop-version +-Perform loop versioning when doing loop vectorization on trees. When a loop +-appears to be vectorizable except that data alignment or data dependence cannot +-be determined at compile time, then vectorized and non-vectorized versions of +-the loop are generated along with run-time checks for alignment or dependence +-to control which version is executed. This option is enabled by default +-except at level @option{-Os} where it is disabled. +- +-@item -fvect-cost-model ++@item -fvect-cost-model=@var{model} + @opindex fvect-cost-model +-Enable cost model for vectorization. This option is enabled by default at +-@option{-O3}. ++Alter the cost model used for vectorization. The @var{model} argument ++should be one of @code{unlimited}, @code{dynamic} or @code{cheap}. ++With the @code{unlimited} model the vectorized code-path is assumed ++to be profitable while with the @code{dynamic} model a runtime check ++will guard the vectorized code-path to enable it only for iteration ++counts that will likely execute faster than when executing the original ++scalar loop. The @code{cheap} model will disable vectorization of ++loops where doing so would be cost prohibitive for example due to ++required runtime checks for data dependence or alignment but otherwise ++is equal to the @code{dynamic} model. ++The default cost model depends on other optimization flags and is ++either @code{dynamic} or @code{cheap}. + + @item -ftree-vrp + @opindex ftree-vrp +@@ -9239,13 +9242,15 @@ + + @item vect-max-version-for-alignment-checks + The maximum number of run-time checks that can be performed when +-doing loop versioning for alignment in the vectorizer. See option +-@option{-ftree-vect-loop-version} for more information. ++doing loop versioning for alignment in the vectorizer. + + @item vect-max-version-for-alias-checks + The maximum number of run-time checks that can be performed when +-doing loop versioning for alias in the vectorizer. See option +-@option{-ftree-vect-loop-version} for more information. ++doing loop versioning for alias in the vectorizer. ++ ++@item vect-max-peeling-for-alignment ++The maximum number of loop peels to enhance access alignment ++for vectorizer. Value -1 means 'no limit'. + + @item max-iterations-to-track + The maximum number of iterations of a loop the brute-force algorithm +@@ -10966,6 +10971,8 @@ + the following: + + @table @samp ++@item crc ++Enable CRC extension. + @item crypto + Enable Crypto extension. This implies Advanced SIMD is enabled. + @item fp +@@ -11263,8 +11270,8 @@ + @samp{arm1136j-s}, @samp{arm1136jf-s}, @samp{mpcore}, @samp{mpcorenovfp}, + @samp{arm1156t2-s}, @samp{arm1156t2f-s}, @samp{arm1176jz-s}, @samp{arm1176jzf-s}, + @samp{cortex-a5}, @samp{cortex-a7}, @samp{cortex-a8}, @samp{cortex-a9}, +-@samp{cortex-a15}, @samp{cortex-r4}, @samp{cortex-r4f}, @samp{cortex-r5}, +-@samp{cortex-m4}, @samp{cortex-m3}, ++@samp{cortex-a15}, @samp{cortex-a53}, @samp{cortex-r4}, @samp{cortex-r4f}, ++@samp{cortex-r5}, @samp{cortex-r7}, @samp{cortex-m4}, @samp{cortex-m3}, + @samp{cortex-m1}, + @samp{cortex-m0}, + @samp{cortex-m0plus}, +@@ -11317,9 +11324,12 @@ + @samp{armv6}, @samp{armv6j}, + @samp{armv6t2}, @samp{armv6z}, @samp{armv6zk}, @samp{armv6-m}, + @samp{armv7}, @samp{armv7-a}, @samp{armv7-r}, @samp{armv7-m}, +-@samp{armv8-a}, ++@samp{armv8-a}, @samp{armv8-a+crc}, + @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312}. + ++@option{-march=armv8-a+crc} enables code generation for the ARMv8-A ++architecture together with the optional CRC32 extensions. ++ + @option{-march=native} causes the compiler to auto-detect the architecture + of the build computer. At present, this feature is only supported on + Linux, and not all architectures are recognized. If the auto-detect is +@@ -11527,6 +11537,17 @@ + preprocessor symbol @code{__ARM_FEATURE_UNALIGNED} will also be + defined. + ++@item -mneon-for-64bits ++@opindex mneon-for-64bits ++Enables using Neon to handle scalar 64-bits operations. This is ++disabled by default since the cost of moving data from core registers ++to Neon is high. ++ ++@item -mrestrict-it ++@opindex mrestrict-it ++Restricts generation of IT blocks to conform to the rules of ARMv8. ++IT blocks can only contain a single 16-bit instruction from a select ++set of instructions. This option is on by default for ARMv8 Thumb mode. + @end table + + @node AVR Options +Index: b/src/gcc/doc/arm-neon-intrinsics.texi +=================================================================== +--- a/src/gcc/doc/arm-neon-intrinsics.texi ++++ b/src/gcc/doc/arm-neon-intrinsics.texi +@@ -4079,6 +4079,12 @@ + @subsubsection Vector shift right and insert + + @itemize @bullet ++@item poly64x1_t vsri_n_p64 (poly64x1_t, poly64x1_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vsri.64 @var{d0}, @var{d0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vsri_n_u32 (uint32x2_t, uint32x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vsri.32 @var{d0}, @var{d0}, #@var{0}} + @end itemize +@@ -4139,6 +4145,12 @@ + + + @itemize @bullet ++@item poly64x2_t vsriq_n_p64 (poly64x2_t, poly64x2_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vsri.64 @var{q0}, @var{q0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vsriq_n_u32 (uint32x4_t, uint32x4_t, const int) + @*@emph{Form of expected instruction(s):} @code{vsri.32 @var{q0}, @var{q0}, #@var{0}} + @end itemize +@@ -4203,6 +4215,12 @@ + @subsubsection Vector shift left and insert + + @itemize @bullet ++@item poly64x1_t vsli_n_p64 (poly64x1_t, poly64x1_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vsli.64 @var{d0}, @var{d0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vsli_n_u32 (uint32x2_t, uint32x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vsli.32 @var{d0}, @var{d0}, #@var{0}} + @end itemize +@@ -4263,6 +4281,12 @@ + + + @itemize @bullet ++@item poly64x2_t vsliq_n_p64 (poly64x2_t, poly64x2_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vsli.64 @var{q0}, @var{q0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vsliq_n_u32 (uint32x4_t, uint32x4_t, const int) + @*@emph{Form of expected instruction(s):} @code{vsli.32 @var{q0}, @var{q0}, #@var{0}} + @end itemize +@@ -5071,6 +5095,11 @@ + @subsubsection Create vector from literal bit pattern + + @itemize @bullet ++@item poly64x1_t vcreate_p64 (uint64_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vcreate_u32 (uint64_t) + @end itemize + +@@ -5184,6 +5213,11 @@ + + + @itemize @bullet ++@item poly64x1_t vdup_n_p64 (poly64_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1_t vdup_n_u64 (uint64_t) + @end itemize + +@@ -5194,6 +5228,11 @@ + + + @itemize @bullet ++@item poly64x2_t vdupq_n_p64 (poly64_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vdupq_n_u32 (uint32_t) + @*@emph{Form of expected instruction(s):} @code{vdup.32 @var{q0}, @var{r0}} + @end itemize +@@ -5440,6 +5479,11 @@ + + + @itemize @bullet ++@item poly64x1_t vdup_lane_p64 (poly64x1_t, const int) ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1_t vdup_lane_u64 (uint64x1_t, const int) + @end itemize + +@@ -5504,6 +5548,11 @@ + + + @itemize @bullet ++@item poly64x2_t vdupq_lane_p64 (poly64x1_t, const int) ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x2_t vdupq_lane_u64 (uint64x1_t, const int) + @end itemize + +@@ -5518,6 +5567,11 @@ + @subsubsection Combining vectors + + @itemize @bullet ++@item poly64x2_t vcombine_p64 (poly64x1_t, poly64x1_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vcombine_u32 (uint32x2_t, uint32x2_t) + @end itemize + +@@ -5577,6 +5631,11 @@ + @subsubsection Splitting vectors + + @itemize @bullet ++@item poly64x1_t vget_high_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vget_high_u32 (uint32x4_t) + @end itemize + +@@ -5686,6 +5745,11 @@ + + + @itemize @bullet ++@item poly64x1_t vget_low_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1_t vget_low_u64 (uint64x2_t) + @end itemize + +@@ -5748,6 +5812,18 @@ + + + @itemize @bullet ++@item float16x4_t vcvt_f16_f32 (float32x4_t) ++@*@emph{Form of expected instruction(s):} @code{vcvt.f16.f32 @var{d0}, @var{q0}} ++@end itemize ++ ++ ++@itemize @bullet ++@item float32x4_t vcvt_f32_f16 (float16x4_t) ++@*@emph{Form of expected instruction(s):} @code{vcvt.f32.f16 @var{q0}, @var{d0}} ++@end itemize ++ ++ ++@itemize @bullet + @item float32x2_t vcvt_n_f32_u32 (uint32x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vcvt.f32.u32 @var{d0}, @var{d0}, #@var{0}} + @end itemize +@@ -6806,6 +6882,12 @@ + @subsubsection Vector extract + + @itemize @bullet ++@item poly64x1_t vext_p64 (poly64x1_t, poly64x1_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vext.64 @var{d0}, @var{d0}, @var{d0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vext_u32 (uint32x2_t, uint32x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vext.32 @var{d0}, @var{d0}, @var{d0}, #@var{0}} + @end itemize +@@ -6872,6 +6954,12 @@ + + + @itemize @bullet ++@item poly64x2_t vextq_p64 (poly64x2_t, poly64x2_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vext.64 @var{q0}, @var{q0}, @var{q0}, #@var{0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vextq_u32 (uint32x4_t, uint32x4_t, const int) + @*@emph{Form of expected instruction(s):} @code{vext.32 @var{q0}, @var{q0}, @var{q0}, #@var{0}} + @end itemize +@@ -7162,6 +7250,12 @@ + @subsubsection Bit selection + + @itemize @bullet ++@item poly64x1_t vbsl_p64 (uint64x1_t, poly64x1_t, poly64x1_t) ++@*@emph{Form of expected instruction(s):} @code{vbsl @var{d0}, @var{d0}, @var{d0}} @emph{or} @code{vbit @var{d0}, @var{d0}, @var{d0}} @emph{or} @code{vbif @var{d0}, @var{d0}, @var{d0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vbsl_u32 (uint32x2_t, uint32x2_t, uint32x2_t) + @*@emph{Form of expected instruction(s):} @code{vbsl @var{d0}, @var{d0}, @var{d0}} @emph{or} @code{vbit @var{d0}, @var{d0}, @var{d0}} @emph{or} @code{vbif @var{d0}, @var{d0}, @var{d0}} + @end itemize +@@ -7228,6 +7322,12 @@ + + + @itemize @bullet ++@item poly64x2_t vbslq_p64 (uint64x2_t, poly64x2_t, poly64x2_t) ++@*@emph{Form of expected instruction(s):} @code{vbsl @var{q0}, @var{q0}, @var{q0}} @emph{or} @code{vbit @var{q0}, @var{q0}, @var{q0}} @emph{or} @code{vbif @var{q0}, @var{q0}, @var{q0}} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vbslq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + @*@emph{Form of expected instruction(s):} @code{vbsl @var{q0}, @var{q0}, @var{q0}} @emph{or} @code{vbit @var{q0}, @var{q0}, @var{q0}} @emph{or} @code{vbif @var{q0}, @var{q0}, @var{q0}} + @end itemize +@@ -7634,6 +7734,12 @@ + @subsubsection Element/structure loads, VLD1 variants + + @itemize @bullet ++@item poly64x1_t vld1_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x2_t vld1_u32 (const uint32_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.32 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -7700,6 +7806,12 @@ + + + @itemize @bullet ++@item poly64x2_t vld1q_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint32x4_t vld1q_u32 (const uint32_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.32 @{@var{d0}, @var{d1}@}, [@var{r0}]} + @end itemize +@@ -7820,6 +7932,12 @@ + + + @itemize @bullet ++@item poly64x1_t vld1_lane_p64 (const poly64_t *, poly64x1_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1_t vld1_lane_u64 (const uint64_t *, uint64x1_t, const int) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -7886,6 +8004,12 @@ + + + @itemize @bullet ++@item poly64x2_t vld1q_lane_p64 (const poly64_t *, poly64x2_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x2_t vld1q_lane_u64 (const uint64_t *, uint64x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -7952,6 +8076,12 @@ + + + @itemize @bullet ++@item poly64x1_t vld1_dup_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1_t vld1_dup_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -8018,6 +8148,12 @@ + + + @itemize @bullet ++@item poly64x2_t vld1q_dup_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x2_t vld1q_dup_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -8034,6 +8170,12 @@ + @subsubsection Element/structure stores, VST1 variants + + @itemize @bullet ++@item void vst1_p64 (poly64_t *, poly64x1_t) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst1_u32 (uint32_t *, uint32x2_t) + @*@emph{Form of expected instruction(s):} @code{vst1.32 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -8100,6 +8242,12 @@ + + + @itemize @bullet ++@item void vst1q_p64 (poly64_t *, poly64x2_t) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst1q_u32 (uint32_t *, uint32x4_t) + @*@emph{Form of expected instruction(s):} @code{vst1.32 @{@var{d0}, @var{d1}@}, [@var{r0}]} + @end itemize +@@ -8220,6 +8368,12 @@ + + + @itemize @bullet ++@item void vst1_lane_p64 (poly64_t *, poly64x1_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst1_lane_s64 (int64_t *, int64x1_t, const int) + @*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -8286,6 +8440,12 @@ + + + @itemize @bullet ++@item void vst1q_lane_p64 (poly64_t *, poly64x2_t, const int) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst1q_lane_s64 (int64_t *, int64x2_t, const int) + @*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}@}, [@var{r0}]} + @end itemize +@@ -8356,6 +8516,12 @@ + + + @itemize @bullet ++@item poly64x1x2_t vld2_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x2_t vld2_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} + @end itemize +@@ -8566,6 +8732,12 @@ + + + @itemize @bullet ++@item poly64x1x2_t vld2_dup_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x2_t vld2_dup_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} + @end itemize +@@ -8636,6 +8808,12 @@ + + + @itemize @bullet ++@item void vst2_p64 (poly64_t *, poly64x1x2_t) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst2_u64 (uint64_t *, uint64x1x2_t) + @*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}@}, [@var{r0}]} + @end itemize +@@ -8850,6 +9028,12 @@ + + + @itemize @bullet ++@item poly64x1x3_t vld3_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x3_t vld3_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}@}, [@var{r0}]} + @end itemize +@@ -9060,6 +9244,12 @@ + + + @itemize @bullet ++@item poly64x1x3_t vld3_dup_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x3_t vld3_dup_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}@}, [@var{r0}]} + @end itemize +@@ -9130,6 +9320,12 @@ + + + @itemize @bullet ++@item void vst3_p64 (poly64_t *, poly64x1x3_t) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst3_u64 (uint64_t *, uint64x1x3_t) + @*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} + @end itemize +@@ -9344,6 +9540,12 @@ + + + @itemize @bullet ++@item poly64x1x4_t vld4_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x4_t vld4_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} + @end itemize +@@ -9554,6 +9756,12 @@ + + + @itemize @bullet ++@item poly64x1x4_t vld4_dup_p64 (const poly64_t *) ++@*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item uint64x1x4_t vld4_dup_u64 (const uint64_t *) + @*@emph{Form of expected instruction(s):} @code{vld1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} + @end itemize +@@ -9624,6 +9832,12 @@ + + + @itemize @bullet ++@item void vst4_p64 (poly64_t *, poly64x1x4_t) ++@*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} ++@end itemize ++ ++ ++@itemize @bullet + @item void vst4_u64 (uint64_t *, uint64x1x4_t) + @*@emph{Form of expected instruction(s):} @code{vst1.64 @{@var{d0}, @var{d1}, @var{d2}, @var{d3}@}, [@var{r0}]} + @end itemize +@@ -10274,27 +10488,27 @@ + @subsubsection Reinterpret casts + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_u32 (uint32x2_t) ++@item poly8x8_t vreinterpret_p8_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_u16 (uint16x4_t) ++@item poly8x8_t vreinterpret_p8_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_u8 (uint8x8_t) ++@item poly8x8_t vreinterpret_p8_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_s32 (int32x2_t) ++@item poly8x8_t vreinterpret_p8_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_s16 (int16x4_t) ++@item poly8x8_t vreinterpret_p8_u64 (uint64x1_t) + @end itemize + + +@@ -10304,967 +10518,1292 @@ + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_u64 (uint64x1_t) ++@item poly8x8_t vreinterpret_p8_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_s64 (int64x1_t) ++@item poly8x8_t vreinterpret_p8_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_f32 (float32x2_t) ++@item poly8x8_t vreinterpret_p8_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item poly8x8_t vreinterpret_p8_p16 (poly16x4_t) ++@item poly8x8_t vreinterpret_p8_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_u32 (uint32x4_t) ++@item poly8x8_t vreinterpret_p8_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_u16 (uint16x8_t) ++@item poly16x4_t vreinterpret_p16_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_u8 (uint8x16_t) ++@item poly16x4_t vreinterpret_p16_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_s32 (int32x4_t) ++@item poly16x4_t vreinterpret_p16_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_s16 (int16x8_t) ++@item poly16x4_t vreinterpret_p16_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_s8 (int8x16_t) ++@item poly16x4_t vreinterpret_p16_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_u64 (uint64x2_t) ++@item poly16x4_t vreinterpret_p16_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_s64 (int64x2_t) ++@item poly16x4_t vreinterpret_p16_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_f32 (float32x4_t) ++@item poly16x4_t vreinterpret_p16_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item poly8x16_t vreinterpretq_p8_p16 (poly16x8_t) ++@item poly16x4_t vreinterpret_p16_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_u32 (uint32x2_t) ++@item poly16x4_t vreinterpret_p16_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_u16 (uint16x4_t) ++@item poly16x4_t vreinterpret_p16_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_u8 (uint8x8_t) ++@item float32x2_t vreinterpret_f32_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_s32 (int32x2_t) ++@item float32x2_t vreinterpret_f32_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_s16 (int16x4_t) ++@item float32x2_t vreinterpret_f32_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_s8 (int8x8_t) ++@item float32x2_t vreinterpret_f32_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_u64 (uint64x1_t) ++@item float32x2_t vreinterpret_f32_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_s64 (int64x1_t) ++@item float32x2_t vreinterpret_f32_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_f32 (float32x2_t) ++@item float32x2_t vreinterpret_f32_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item poly16x4_t vreinterpret_p16_p8 (poly8x8_t) ++@item float32x2_t vreinterpret_f32_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_u32 (uint32x4_t) ++@item float32x2_t vreinterpret_f32_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_u16 (uint16x8_t) ++@item float32x2_t vreinterpret_f32_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_u8 (uint8x16_t) ++@item float32x2_t vreinterpret_f32_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_s32 (int32x4_t) ++@item poly64x1_t vreinterpret_p64_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_s16 (int16x8_t) ++@item poly64x1_t vreinterpret_p64_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_s8 (int8x16_t) ++@item poly64x1_t vreinterpret_p64_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_u64 (uint64x2_t) ++@item poly64x1_t vreinterpret_p64_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_s64 (int64x2_t) ++@item poly64x1_t vreinterpret_p64_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_f32 (float32x4_t) ++@item poly64x1_t vreinterpret_p64_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item poly16x8_t vreinterpretq_p16_p8 (poly8x16_t) ++@item poly64x1_t vreinterpret_p64_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_u32 (uint32x2_t) ++@item poly64x1_t vreinterpret_p64_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_u16 (uint16x4_t) ++@item poly64x1_t vreinterpret_p64_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_u8 (uint8x8_t) ++@item poly64x1_t vreinterpret_p64_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_s32 (int32x2_t) ++@item poly64x1_t vreinterpret_p64_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_s16 (int16x4_t) ++@item int64x1_t vreinterpret_s64_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_s8 (int8x8_t) ++@item int64x1_t vreinterpret_s64_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_u64 (uint64x1_t) ++@item int64x1_t vreinterpret_s64_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_s64 (int64x1_t) ++@item int64x1_t vreinterpret_s64_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_p16 (poly16x4_t) ++@item int64x1_t vreinterpret_s64_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item float32x2_t vreinterpret_f32_p8 (poly8x8_t) ++@item int64x1_t vreinterpret_s64_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_u32 (uint32x4_t) ++@item int64x1_t vreinterpret_s64_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_u16 (uint16x8_t) ++@item int64x1_t vreinterpret_s64_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_u8 (uint8x16_t) ++@item int64x1_t vreinterpret_s64_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_s32 (int32x4_t) ++@item int64x1_t vreinterpret_s64_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_s16 (int16x8_t) ++@item int64x1_t vreinterpret_s64_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_s8 (int8x16_t) ++@item uint64x1_t vreinterpret_u64_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_u64 (uint64x2_t) ++@item uint64x1_t vreinterpret_u64_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_s64 (int64x2_t) ++@item uint64x1_t vreinterpret_u64_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_p16 (poly16x8_t) ++@item uint64x1_t vreinterpret_u64_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item float32x4_t vreinterpretq_f32_p8 (poly8x16_t) ++@item uint64x1_t vreinterpret_u64_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_u32 (uint32x2_t) ++@item uint64x1_t vreinterpret_u64_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_u16 (uint16x4_t) ++@item uint64x1_t vreinterpret_u64_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_u8 (uint8x8_t) ++@item uint64x1_t vreinterpret_u64_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_s32 (int32x2_t) ++@item uint64x1_t vreinterpret_u64_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_s16 (int16x4_t) ++@item uint64x1_t vreinterpret_u64_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_s8 (int8x8_t) ++@item uint64x1_t vreinterpret_u64_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_u64 (uint64x1_t) ++@item int8x8_t vreinterpret_s8_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_f32 (float32x2_t) ++@item int8x8_t vreinterpret_s8_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_p16 (poly16x4_t) ++@item int8x8_t vreinterpret_s8_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item int64x1_t vreinterpret_s64_p8 (poly8x8_t) ++@item int8x8_t vreinterpret_s8_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_u32 (uint32x4_t) ++@item int8x8_t vreinterpret_s8_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_u16 (uint16x8_t) ++@item int8x8_t vreinterpret_s8_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_u8 (uint8x16_t) ++@item int8x8_t vreinterpret_s8_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_s32 (int32x4_t) ++@item int8x8_t vreinterpret_s8_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_s16 (int16x8_t) ++@item int8x8_t vreinterpret_s8_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_s8 (int8x16_t) ++@item int8x8_t vreinterpret_s8_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_u64 (uint64x2_t) ++@item int8x8_t vreinterpret_s8_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_f32 (float32x4_t) ++@item int16x4_t vreinterpret_s16_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_p16 (poly16x8_t) ++@item int16x4_t vreinterpret_s16_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item int64x2_t vreinterpretq_s64_p8 (poly8x16_t) ++@item int16x4_t vreinterpret_s16_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_u32 (uint32x2_t) ++@item int16x4_t vreinterpret_s16_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_u16 (uint16x4_t) ++@item int16x4_t vreinterpret_s16_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_u8 (uint8x8_t) ++@item int16x4_t vreinterpret_s16_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_s32 (int32x2_t) ++@item int16x4_t vreinterpret_s16_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_s16 (int16x4_t) ++@item int16x4_t vreinterpret_s16_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_s8 (int8x8_t) ++@item int16x4_t vreinterpret_s16_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_s64 (int64x1_t) ++@item int16x4_t vreinterpret_s16_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_f32 (float32x2_t) ++@item int16x4_t vreinterpret_s16_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_p16 (poly16x4_t) ++@item int32x2_t vreinterpret_s32_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item uint64x1_t vreinterpret_u64_p8 (poly8x8_t) ++@item int32x2_t vreinterpret_s32_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_u32 (uint32x4_t) ++@item int32x2_t vreinterpret_s32_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_u16 (uint16x8_t) ++@item int32x2_t vreinterpret_s32_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_u8 (uint8x16_t) ++@item int32x2_t vreinterpret_s32_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_s32 (int32x4_t) ++@item int32x2_t vreinterpret_s32_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_s16 (int16x8_t) ++@item int32x2_t vreinterpret_s32_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_s8 (int8x16_t) ++@item int32x2_t vreinterpret_s32_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_s64 (int64x2_t) ++@item int32x2_t vreinterpret_s32_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_f32 (float32x4_t) ++@item int32x2_t vreinterpret_s32_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_p16 (poly16x8_t) ++@item int32x2_t vreinterpret_s32_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item uint64x2_t vreinterpretq_u64_p8 (poly8x16_t) ++@item uint8x8_t vreinterpret_u8_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_u32 (uint32x2_t) ++@item uint8x8_t vreinterpret_u8_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_u16 (uint16x4_t) ++@item uint8x8_t vreinterpret_u8_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_u8 (uint8x8_t) ++@item uint8x8_t vreinterpret_u8_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_s32 (int32x2_t) ++@item uint8x8_t vreinterpret_u8_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_s16 (int16x4_t) ++@item uint8x8_t vreinterpret_u8_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_u64 (uint64x1_t) ++@item uint8x8_t vreinterpret_u8_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_s64 (int64x1_t) ++@item uint8x8_t vreinterpret_u8_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_f32 (float32x2_t) ++@item uint8x8_t vreinterpret_u8_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_p16 (poly16x4_t) ++@item uint8x8_t vreinterpret_u8_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item int8x8_t vreinterpret_s8_p8 (poly8x8_t) ++@item uint8x8_t vreinterpret_u8_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_u32 (uint32x4_t) ++@item uint16x4_t vreinterpret_u16_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_u16 (uint16x8_t) ++@item uint16x4_t vreinterpret_u16_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_u8 (uint8x16_t) ++@item uint16x4_t vreinterpret_u16_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_s32 (int32x4_t) ++@item uint16x4_t vreinterpret_u16_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_s16 (int16x8_t) ++@item uint16x4_t vreinterpret_u16_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_u64 (uint64x2_t) ++@item uint16x4_t vreinterpret_u16_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_s64 (int64x2_t) ++@item uint16x4_t vreinterpret_u16_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_f32 (float32x4_t) ++@item uint16x4_t vreinterpret_u16_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_p16 (poly16x8_t) ++@item uint16x4_t vreinterpret_u16_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item int8x16_t vreinterpretq_s8_p8 (poly8x16_t) ++@item uint16x4_t vreinterpret_u16_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_u32 (uint32x2_t) ++@item uint16x4_t vreinterpret_u16_u32 (uint32x2_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_u16 (uint16x4_t) ++@item uint32x2_t vreinterpret_u32_p8 (poly8x8_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_u8 (uint8x8_t) ++@item uint32x2_t vreinterpret_u32_p16 (poly16x4_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_s32 (int32x2_t) ++@item uint32x2_t vreinterpret_u32_f32 (float32x2_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_s8 (int8x8_t) ++@item uint32x2_t vreinterpret_u32_p64 (poly64x1_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_u64 (uint64x1_t) ++@item uint32x2_t vreinterpret_u32_s64 (int64x1_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_s64 (int64x1_t) ++@item uint32x2_t vreinterpret_u32_u64 (uint64x1_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_f32 (float32x2_t) ++@item uint32x2_t vreinterpret_u32_s8 (int8x8_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_p16 (poly16x4_t) ++@item uint32x2_t vreinterpret_u32_s16 (int16x4_t) + @end itemize + + + @itemize @bullet +-@item int16x4_t vreinterpret_s16_p8 (poly8x8_t) ++@item uint32x2_t vreinterpret_u32_s32 (int32x2_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_u32 (uint32x4_t) ++@item uint32x2_t vreinterpret_u32_u8 (uint8x8_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_u16 (uint16x8_t) ++@item uint32x2_t vreinterpret_u32_u16 (uint16x4_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_u8 (uint8x16_t) ++@item poly8x16_t vreinterpretq_p8_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_s32 (int32x4_t) ++@item poly8x16_t vreinterpretq_p8_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_s8 (int8x16_t) ++@item poly8x16_t vreinterpretq_p8_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_u64 (uint64x2_t) ++@item poly8x16_t vreinterpretq_p8_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_s64 (int64x2_t) ++@item poly8x16_t vreinterpretq_p8_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_f32 (float32x4_t) ++@item poly8x16_t vreinterpretq_p8_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_p16 (poly16x8_t) ++@item poly8x16_t vreinterpretq_p8_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item int16x8_t vreinterpretq_s16_p8 (poly8x16_t) ++@item poly8x16_t vreinterpretq_p8_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_u32 (uint32x2_t) ++@item poly8x16_t vreinterpretq_p8_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_u16 (uint16x4_t) ++@item poly8x16_t vreinterpretq_p8_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_u8 (uint8x8_t) ++@item poly8x16_t vreinterpretq_p8_u16 (uint16x8_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_s16 (int16x4_t) ++@item poly8x16_t vreinterpretq_p8_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_s8 (int8x8_t) ++@item poly16x8_t vreinterpretq_p16_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_u64 (uint64x1_t) ++@item poly16x8_t vreinterpretq_p16_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_s64 (int64x1_t) ++@item poly16x8_t vreinterpretq_p16_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_f32 (float32x2_t) ++@item poly16x8_t vreinterpretq_p16_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_p16 (poly16x4_t) ++@item poly16x8_t vreinterpretq_p16_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item int32x2_t vreinterpret_s32_p8 (poly8x8_t) ++@item poly16x8_t vreinterpretq_p16_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_u32 (uint32x4_t) ++@item poly16x8_t vreinterpretq_p16_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_u16 (uint16x8_t) ++@item poly16x8_t vreinterpretq_p16_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_u8 (uint8x16_t) ++@item poly16x8_t vreinterpretq_p16_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_s16 (int16x8_t) ++@item poly16x8_t vreinterpretq_p16_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_s8 (int8x16_t) ++@item poly16x8_t vreinterpretq_p16_u16 (uint16x8_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_u64 (uint64x2_t) ++@item poly16x8_t vreinterpretq_p16_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_s64 (int64x2_t) ++@item float32x4_t vreinterpretq_f32_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_f32 (float32x4_t) ++@item float32x4_t vreinterpretq_f32_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_p16 (poly16x8_t) ++@item float32x4_t vreinterpretq_f32_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item int32x4_t vreinterpretq_s32_p8 (poly8x16_t) ++@item float32x4_t vreinterpretq_f32_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_u32 (uint32x2_t) ++@item float32x4_t vreinterpretq_f32_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_u16 (uint16x4_t) ++@item float32x4_t vreinterpretq_f32_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_s32 (int32x2_t) ++@item float32x4_t vreinterpretq_f32_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_s16 (int16x4_t) ++@item float32x4_t vreinterpretq_f32_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_s8 (int8x8_t) ++@item float32x4_t vreinterpretq_f32_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_u64 (uint64x1_t) ++@item float32x4_t vreinterpretq_f32_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_s64 (int64x1_t) ++@item float32x4_t vreinterpretq_f32_u16 (uint16x8_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_f32 (float32x2_t) ++@item float32x4_t vreinterpretq_f32_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_p16 (poly16x4_t) ++@item poly64x2_t vreinterpretq_p64_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item uint8x8_t vreinterpret_u8_p8 (poly8x8_t) ++@item poly64x2_t vreinterpretq_p64_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_u32 (uint32x4_t) ++@item poly64x2_t vreinterpretq_p64_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_u16 (uint16x8_t) ++@item poly64x2_t vreinterpretq_p64_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_s32 (int32x4_t) ++@item poly64x2_t vreinterpretq_p64_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_s16 (int16x8_t) ++@item poly64x2_t vreinterpretq_p64_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_s8 (int8x16_t) ++@item poly64x2_t vreinterpretq_p64_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_u64 (uint64x2_t) ++@item poly64x2_t vreinterpretq_p64_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_s64 (int64x2_t) ++@item poly64x2_t vreinterpretq_p64_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_f32 (float32x4_t) ++@item poly64x2_t vreinterpretq_p64_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_p16 (poly16x8_t) ++@item poly64x2_t vreinterpretq_p64_u16 (uint16x8_t) + @end itemize + + + @itemize @bullet +-@item uint8x16_t vreinterpretq_u8_p8 (poly8x16_t) ++@item poly64x2_t vreinterpretq_p64_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_u32 (uint32x2_t) ++@item poly128_t vreinterpretq_p128_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_u8 (uint8x8_t) ++@item poly128_t vreinterpretq_p128_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_s32 (int32x2_t) ++@item poly128_t vreinterpretq_p128_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_s16 (int16x4_t) ++@item poly128_t vreinterpretq_p128_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_s8 (int8x8_t) ++@item poly128_t vreinterpretq_p128_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_u64 (uint64x1_t) ++@item poly128_t vreinterpretq_p128_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_s64 (int64x1_t) ++@item poly128_t vreinterpretq_p128_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_f32 (float32x2_t) ++@item poly128_t vreinterpretq_p128_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_p16 (poly16x4_t) ++@item poly128_t vreinterpretq_p128_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item uint16x4_t vreinterpret_u16_p8 (poly8x8_t) ++@item poly128_t vreinterpretq_p128_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_u32 (uint32x4_t) ++@item poly128_t vreinterpretq_p128_u16 (uint16x8_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_u8 (uint8x16_t) ++@item poly128_t vreinterpretq_p128_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_s32 (int32x4_t) ++@item int64x2_t vreinterpretq_s64_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_s16 (int16x8_t) ++@item int64x2_t vreinterpretq_s64_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_s8 (int8x16_t) ++@item int64x2_t vreinterpretq_s64_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_u64 (uint64x2_t) ++@item int64x2_t vreinterpretq_s64_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_s64 (int64x2_t) ++@item int64x2_t vreinterpretq_s64_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_f32 (float32x4_t) ++@item int64x2_t vreinterpretq_s64_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint16x8_t vreinterpretq_u16_p16 (poly16x8_t) ++@item int64x2_t vreinterpretq_s64_s8 (int8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int64x2_t vreinterpretq_s64_s16 (int16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int64x2_t vreinterpretq_s64_s32 (int32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int64x2_t vreinterpretq_s64_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int64x2_t vreinterpretq_s64_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int64x2_t vreinterpretq_s64_u32 (uint32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_p8 (poly8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_p16 (poly16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_f32 (float32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_p128 (poly128_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_s64 (int64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_s8 (int8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_s16 (int16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_s32 (int32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint64x2_t vreinterpretq_u64_u32 (uint32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_p8 (poly8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_p16 (poly16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_f32 (float32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_p128 (poly128_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_s64 (int64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_u64 (uint64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_s16 (int16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_s32 (int32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int8x16_t vreinterpretq_s8_u32 (uint32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_p8 (poly8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_p16 (poly16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_f32 (float32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_p128 (poly128_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_s64 (int64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_u64 (uint64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_s8 (int8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_s32 (int32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int16x8_t vreinterpretq_s16_u32 (uint32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_p8 (poly8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_p16 (poly16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_f32 (float32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_p128 (poly128_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_s64 (int64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_u64 (uint64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_s8 (int8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_s16 (int16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item int32x4_t vreinterpretq_s32_u32 (uint32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_p8 (poly8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_p16 (poly16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_f32 (float32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_p64 (poly64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_p128 (poly128_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_s64 (int64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_u64 (uint64x2_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_s8 (int8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_s16 (int16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_s32 (int32x4_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_u16 (uint16x8_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint8x16_t vreinterpretq_u8_u32 (uint32x4_t) + @end itemize + + +@@ -11274,82 +11813,82 @@ + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_u16 (uint16x4_t) ++@item uint16x8_t vreinterpretq_u16_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_u8 (uint8x8_t) ++@item uint16x8_t vreinterpretq_u16_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_s32 (int32x2_t) ++@item uint16x8_t vreinterpretq_u16_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_s16 (int16x4_t) ++@item uint16x8_t vreinterpretq_u16_p128 (poly128_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_s8 (int8x8_t) ++@item uint16x8_t vreinterpretq_u16_s64 (int64x2_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_u64 (uint64x1_t) ++@item uint16x8_t vreinterpretq_u16_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_s64 (int64x1_t) ++@item uint16x8_t vreinterpretq_u16_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_f32 (float32x2_t) ++@item uint16x8_t vreinterpretq_u16_s16 (int16x8_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_p16 (poly16x4_t) ++@item uint16x8_t vreinterpretq_u16_s32 (int32x4_t) + @end itemize + + + @itemize @bullet +-@item uint32x2_t vreinterpret_u32_p8 (poly8x8_t) ++@item uint16x8_t vreinterpretq_u16_u8 (uint8x16_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_u16 (uint16x8_t) ++@item uint16x8_t vreinterpretq_u16_u32 (uint32x4_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_u8 (uint8x16_t) ++@item uint32x4_t vreinterpretq_u32_p8 (poly8x16_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_s32 (int32x4_t) ++@item uint32x4_t vreinterpretq_u32_p16 (poly16x8_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_s16 (int16x8_t) ++@item uint32x4_t vreinterpretq_u32_f32 (float32x4_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_s8 (int8x16_t) ++@item uint32x4_t vreinterpretq_u32_p64 (poly64x2_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_u64 (uint64x2_t) ++@item uint32x4_t vreinterpretq_u32_p128 (poly128_t) + @end itemize + + +@@ -11359,19 +11898,111 @@ + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_f32 (float32x4_t) ++@item uint32x4_t vreinterpretq_u32_u64 (uint64x2_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_p16 (poly16x8_t) ++@item uint32x4_t vreinterpretq_u32_s8 (int8x16_t) + @end itemize + + + @itemize @bullet +-@item uint32x4_t vreinterpretq_u32_p8 (poly8x16_t) ++@item uint32x4_t vreinterpretq_u32_s16 (int16x8_t) + @end itemize + + ++@itemize @bullet ++@item uint32x4_t vreinterpretq_u32_s32 (int32x4_t) ++@end itemize ++ + ++@itemize @bullet ++@item uint32x4_t vreinterpretq_u32_u8 (uint8x16_t) ++@end itemize ++ ++ ++@itemize @bullet ++@item uint32x4_t vreinterpretq_u32_u16 (uint16x8_t) ++@end itemize ++ ++ ++ ++ ++ ++@itemize @bullet ++@item poly128_t vldrq_p128(poly128_t const *) ++@end itemize ++ ++@itemize @bullet ++@item void vstrq_p128(poly128_t *, poly128_t) ++@end itemize ++ ++@itemize @bullet ++@item uint64x1_t vceq_p64 (poly64x1_t, poly64x1_t) ++@end itemize ++ ++@itemize @bullet ++@item uint64x1_t vtst_p64 (poly64x1_t, poly64x1_t) ++@end itemize ++ ++@itemize @bullet ++@item uint32_t vsha1h_u32 (uint32_t) ++@*@emph{Form of expected instruction(s):} @code{sha1h.32 @var{q0}, @var{q1}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1cq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1c.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1pq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1p.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1mq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1m.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1su0q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1su0.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1su1q_u32 (uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1su1.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256hq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256h.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256h2q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256h2.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256su0q_u32 (uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256su0.32 @var{q0}, @var{q1}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256su1q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256su1.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item poly128_t vmull_p64 (poly64_t a, poly64_t b) ++@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} ++@end itemize ++ ++@itemize @bullet ++@item poly128_t vmull_high_p64 (poly64x2_t a, poly64x2_t b) ++@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} ++@end itemize + +Index: b/src/gcc/doc/md.texi +=================================================================== +--- a/src/gcc/doc/md.texi ++++ b/src/gcc/doc/md.texi +@@ -1711,9 +1711,6 @@ + @item Z + Integer constant zero + +-@item Usa +-An absolute symbolic address +- + @item Ush + The high part (bits 12 and upwards) of the pc-relative address of a symbol + within 4GB of the instruction +@@ -8828,7 +8825,8 @@ + (define_cond_exec + [@var{predicate-pattern}] + "@var{condition}" +- "@var{output-template}") ++ "@var{output-template}" ++ "@var{optional-insn-attribues}") + @end smallexample + + @var{predicate-pattern} is the condition that must be true for the +@@ -8849,6 +8847,13 @@ + @code{current_insn_predicate} that will contain the entire predicate + if the current insn is predicated, and will otherwise be @code{NULL}. + ++@var{optional-insn-attributes} is an optional vector of attributes that gets ++appended to the insn attributes of the produced cond_exec rtx. It can ++be used to add some distinguishing attribute to cond_exec rtxs produced ++that way. An example usage would be to use this attribute in conjunction ++with attributes on the main pattern to disable particular alternatives under ++certain conditions. ++ + When @code{define_cond_exec} is used, an implicit reference to + the @code{predicable} instruction attribute is made. + @xref{Insn Attributes}. This attribute must be a boolean (i.e.@: have --- gcc-4.8-4.8.2.orig/debian/patches/gcc-linaro-no-local.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-linaro-no-local.diff @@ -0,0 +1,189 @@ +# DP: Revert Linaro local patch to build armv4t multilibs. + +Index: b/src/gcc/incpath.c +=================================================================== +--- a/src/gcc/incpath.c ++++ b/src/gcc/incpath.c +@@ -148,22 +148,20 @@ + if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) + { + char *str = concat (iprefix, p->fname + len, NULL); +- if (p->multilib && imultilib) +- { +- str = reconcat (str, str, dir_separator_str, +- imultilib, NULL); +- add_path (str, SYSTEM, p->cxx_aware, false); +- } +- else +- add_path (str, SYSTEM, p->cxx_aware, false); +- +- if (p->multilib && imultiarch) ++ if (p->multilib == 1 && imultilib) ++ str = reconcat (str, str, dir_separator_str, ++ imultilib, NULL); ++ else if (p->multilib == 2) + { +- char *str = concat (iprefix, p->fname + len, NULL); ++ if (!imultiarch) ++ { ++ free (str); ++ continue; ++ } + str = reconcat (str, str, dir_separator_str, + imultiarch, NULL); +- add_path (str, SYSTEM, p->cxx_aware, false); + } ++ add_path (str, SYSTEM, p->cxx_aware, false); + } + } + } +@@ -173,7 +171,7 @@ + { + if (!p->cplusplus || cxx_stdinc) + { +- char *str, *str2; ++ char *str; + + /* Should this directory start with the sysroot? */ + if (sysroot && p->add_sysroot) +@@ -217,20 +215,19 @@ + else + str = update_path (p->fname, p->component); + +- str2 = xstrdup(str); +- if (p->multilib && imultilib) ++ if (p->multilib == 1 && imultilib) ++ str = reconcat (str, str, dir_separator_str, imultilib, NULL); ++ else if (p->multilib == 2) + { +- str = reconcat (str, str, dir_separator_str, imultilib, NULL); +- add_path (str, SYSTEM, p->cxx_aware, false); ++ if (!imultiarch) ++ { ++ free (str); ++ continue; ++ } ++ str = reconcat (str, str, dir_separator_str, imultiarch, NULL); + } +- else +- add_path (str, SYSTEM, p->cxx_aware, false); + +- if (p->multilib && imultiarch) +- { +- str2 = reconcat (str2, str2, dir_separator_str, imultiarch, NULL); +- add_path (str2, SYSTEM, p->cxx_aware, false); +- } ++ add_path (str, SYSTEM, p->cxx_aware, false); + } + } + } +Index: b/src/gcc/gcc.c +=================================================================== +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -2227,7 +2227,7 @@ + } + + /* Now try the multiarch path. */ +- if (!skip_multi_dir && !multi_dir ++ if (!skip_multi_dir + && !pl->require_machine_suffix && multiarch_dir) + { + memcpy (path + len, multiarch_suffix, multiarch_len + 1); +@@ -2263,16 +2263,6 @@ + if (ret) + break; + } +- +- /* Now try the multiarch path. */ +- if (!skip_multi_dir +- && !pl->require_machine_suffix && multiarch_dir) +- { +- memcpy (path + len, multiarch_suffix, multiarch_len + 1); +- ret = callback (path, callback_info); +- if (ret) +- break; +- } + } + if (pl) + break; +@@ -7672,21 +7662,6 @@ + ++p; + } + +- if (first) +- { +- if (this_path_len > 3 +- && this_path[0] == '.' +- && this_path[1] == ':' +- && this_path[2] == ':') +- { +- char *new_multiarch_dir = XNEWVEC (char, this_path_len + 1); +- +- strncpy (new_multiarch_dir, this_path, this_path_len); +- new_multiarch_dir[this_path_len] = '\0'; +- multiarch_dir = &new_multiarch_dir[3]; +- } +- } +- + if (ok && first) + { + if (this_path_len != 1 +Index: b/src/gcc/ChangeLog.linaro +=================================================================== +--- a/src/gcc/ChangeLog.linaro ++++ b/src/gcc/ChangeLog.linaro +@@ -312,14 +312,6 @@ + GCC Linaro 4.8-2014.01 released. + * LINARO-VERSION: Update. + +-2014-01-16 Zhenqiang Chen +- +- Linaro local patch for armv4t multilib support. +- * gcc/config/arm/t-mlibs: New file. +- * config.gcc: Add t-mlibs. +- * incpath.c (add_standard_paths): Try multilib path first. +- * gcc.c (for_each_path): Likewise. +- + 2013-12-21 Christophe Lyon + + * LINARO-VERSION: Bump version. +Index: b/src/gcc/config.gcc +=================================================================== +--- a/src/gcc/config.gcc ++++ b/src/gcc/config.gcc +@@ -878,7 +878,7 @@ + tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" + ;; + esac +- tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi arm/t-mlibs" ++ tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h" + # Define multilib configuration for arm-linux-androideabi. + case ${target} in +Index: b/src/gcc/config/arm/t-mlibs +=================================================================== +--- a/src/gcc/config/arm/t-mlibs ++++ /dev/null +@@ -1,21 +0,0 @@ +-# A set of predefined MULTILIB for different ARM targets. +-# Through the configure option --with-multilib-list, user can customize the +-# final MULTILIB implementation. +- +-comma := , +-space := +-space += +- +-MULTILIB_OPTIONS = marm +-MULTILIB_DIRNAMES = arm +-MULTILIB_OPTIONS += march=armv4t +-MULTILIB_DIRNAMES += armv4t +-MULTILIB_OPTIONS += mfloat-abi=soft +-MULTILIB_DIRNAMES += soft +- +-MULTILIB_EXCEPTIONS = +- +-MULTILIB_REQUIRED = marm/march=armv4t/mfloat-abi=soft +- +-MULTILIB_OSDIRNAMES = marm/march.armv4t/mfloat-abi.soft=!arm-linux-gnueabi +- --- gcc-4.8-4.8.2.orig/debian/patches/gcc-linaro-updates.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-linaro-updates.diff @@ -0,0 +1,2 @@ +# DP: Linaro updates from the 4.8-2013.xx-stable branch: + --- gcc-4.8-4.8.2.orig/debian/patches/gcc-linaro.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-linaro.diff @@ -0,0 +1,51457 @@ +# DP: Changes for the Linaro 4.8-2014.03 release. + +LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_8-branch@208264 \ + svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_8-branch@208576 \ + | filterdiff --remove-timestamps --addoldprefix=a/src/ --addnewprefix=b/src/ + +--- a/src/libitm/ChangeLog.linaro ++++ b/src/libitm/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libgomp/ChangeLog.linaro ++++ b/src/libgomp/ChangeLog.linaro +@@ -0,0 +1,59 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-22 Yvan Roux ++ ++ Backport from trunk r200521. ++ 2013-06-28 Marcus Shawcroft ++ ++ * testsuite/libgomp.fortran/strassen.f90: ++ Add dg-skip-if aarch64_tiny. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libgomp/testsuite/libgomp.fortran/strassen.f90 ++++ b/src/libgomp/testsuite/libgomp.fortran/strassen.f90 +@@ -1,4 +1,5 @@ + ! { dg-options "-O2" } ++! { dg-skip-if "AArch64 tiny code model does not support programs larger than 1MiB" {aarch64_tiny} {"*"} {""} } + + program strassen_matmul + use omp_lib +--- a/src/libquadmath/ChangeLog.linaro ++++ b/src/libquadmath/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libsanitizer/sanitizer_common/sanitizer_linux.cc ++++ b/src/libsanitizer/sanitizer_common/sanitizer_linux.cc +@@ -410,7 +410,9 @@ + CHECK_EQ(*current_++, ' '); + while (IsDecimal(*current_)) + current_++; +- CHECK_EQ(*current_++, ' '); ++ // Qemu may lack the trailing space. ++ // http://code.google.com/p/address-sanitizer/issues/detail?id=160 ++ // CHECK_EQ(*current_++, ' '); + // Skip spaces. + while (current_ < next_line && *current_ == ' ') + current_++; +--- a/src/libsanitizer/ChangeLog.linaro ++++ b/src/libsanitizer/ChangeLog.linaro +@@ -0,0 +1,66 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-20 Christophe Lyon ++ ++ Backport from trunk r198683. ++ 2013-05-07 Christophe Lyon ++ ++ * configure.tgt: Add ARM pattern. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-06-04 Christophe Lyon ++ ++ Backport from trunk r199606. ++ 2013-06-03 Christophe Lyon ++ ++ * sanitizer_common/sanitizer_linux.cc (MemoryMappingLayout::Next): ++ Cherry pick upstream r182922. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libsanitizer/configure.tgt ++++ b/src/libsanitizer/configure.tgt +@@ -29,6 +29,8 @@ + ;; + sparc*-*-linux*) + ;; ++ arm*-*-linux*) ++ ;; + x86_64-*-darwin[1]* | i?86-*-darwin[1]*) + TSAN_SUPPORTED=no + ;; +--- a/src/zlib/ChangeLog.linaro ++++ b/src/zlib/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libstdc++-v3/ChangeLog.linaro ++++ b/src/libstdc++-v3/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -611,6 +611,8 @@ + + # Disable Java if libffi is not supported. + case "${target}" in ++ aarch64-*-*) ++ ;; + alpha*-*-*) + ;; + arm*-*-*) +--- a/src/intl/ChangeLog.linaro ++++ b/src/intl/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/ChangeLog.linaro ++++ b/src/ChangeLog.linaro +@@ -0,0 +1,59 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-12-06 Michael Collison ++ ++ Backport from trunk r197997 ++ 2013-04-16 Andreas Schwab ++ ++ * configure.ac (aarch64-*-*): Don't disable java. ++ * configure: Regenerate. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libmudflap/ChangeLog.linaro ++++ b/src/libmudflap/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/boehm-gc/ChangeLog.linaro ++++ b/src/boehm-gc/ChangeLog.linaro +@@ -0,0 +1,64 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197770. ++ ++ 2013-03-16 Yvan Roux ++ ++ * include/private/gcconfig.h (AARCH64): New macro (defined only if ++ __aarch64__). ++ (mach_type_known): Update comment adding ARM AArch64 target. ++ (NOSYS, mach_type_known,CPP_WORDSZ, MACH_TYPE, ALIGNMENT, HBLKSIZE, ++ OS_TYPE, LINUX_STACKBOTTOM, USE_GENERIC_PUSH_REGS, DYNAMIC_LOADING, ++ DATASTART, DATAEND, STACKBOTTOM): Define for AArch64. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/boehm-gc/include/private/gcconfig.h ++++ b/src/boehm-gc/include/private/gcconfig.h +@@ -60,6 +60,13 @@ + # endif + + /* Determine the machine type: */ ++#if defined(__aarch64__) ++# define AARCH64 ++# if !defined(LINUX) ++# define NOSYS ++# define mach_type_known ++# endif ++# endif + # if defined(__arm__) || defined(__thumb__) + # define ARM32 + # if !defined(LINUX) && !defined(NETBSD) +@@ -239,6 +246,10 @@ + # define IA64 + # define mach_type_known + # endif ++# if defined(LINUX) && defined(__aarch64__) ++# define AARCH64 ++# define mach_type_known ++# endif + # if defined(LINUX) && defined(__arm__) + # define ARM32 + # define mach_type_known +@@ -500,6 +511,7 @@ + /* running Amdahl UTS4 */ + /* S390 ==> 390-like machine */ + /* running LINUX */ ++ /* AARCH64 ==> ARM AArch64 */ + /* ARM32 ==> Intel StrongARM */ + /* IA64 ==> Intel IPF */ + /* (e.g. Itanium) */ +@@ -1841,6 +1853,32 @@ + # define HEURISTIC1 + # endif + ++# ifdef AARCH64 ++# define CPP_WORDSZ 64 ++# define MACH_TYPE "AARCH64" ++# define ALIGNMENT 8 ++# ifndef HBLKSIZE ++# define HBLKSIZE 4096 ++# endif ++# ifdef LINUX ++# define OS_TYPE "LINUX" ++# define LINUX_STACKBOTTOM ++# define USE_GENERIC_PUSH_REGS ++# define DYNAMIC_LOADING ++ extern int __data_start[]; ++# define DATASTART ((ptr_t)__data_start) ++ extern char _end[]; ++# define DATAEND ((ptr_t)(&_end)) ++# endif ++# ifdef NOSYS ++ /* __data_start is usually defined in the target linker script. */ ++ extern int __data_start[]; ++# define DATASTART ((ptr_t)__data_start) ++ extern void *__stack_base__; ++# define STACKBOTTOM ((ptr_t)__stack_base__) ++# endif ++# endif ++ + # ifdef ARM32 + # define CPP_WORDSZ 32 + # define MACH_TYPE "ARM32" +--- a/src/include/ChangeLog.linaro ++++ b/src/include/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libiberty/ChangeLog.linaro ++++ b/src/libiberty/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/lto-plugin/ChangeLog.linaro ++++ b/src/lto-plugin/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/contrib/regression/ChangeLog.linaro ++++ b/src/contrib/regression/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/contrib/config-list.mk ++++ b/src/contrib/config-list.mk +@@ -11,7 +11,8 @@ + # nohup nice make -j25 -l36 -f ../gcc/contrib/config-list.mk > make.out 2>&1 & + # + # v850e1-elf is rejected by config.sub +-LIST = alpha-linux-gnu alpha-freebsd6 alpha-netbsd alpha-openbsd \ ++LIST = aarch64-elf aarch64-linux-gnu \ ++ alpha-linux-gnu alpha-freebsd6 alpha-netbsd alpha-openbsd \ + alpha64-dec-vms alpha-dec-vms am33_2.0-linux \ + arm-wrs-vxworks arm-netbsdelf \ + arm-linux-androideabi arm-uclinux_eabi arm-eabi \ +--- a/src/contrib/ChangeLog.linaro ++++ b/src/contrib/ChangeLog.linaro +@@ -0,0 +1,58 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198443. ++ 2013-04-22 Sofiane Naci ++ ++ * config-list.mk (LIST): Add aarch64-elf and aarch64-linux-gnu. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/contrib/reghunt/ChangeLog.linaro ++++ b/src/contrib/reghunt/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libatomic/ChangeLog.linaro ++++ b/src/libatomic/ChangeLog.linaro +@@ -0,0 +1,59 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-12-06 Michael Collison ++ ++ Backport from trunk r203774 ++ 2013-10-17 Michael Hudson-Doyle ++ ++ * libatomic/configure.tgt (aarch64*): Remove code preventing ++ build. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libatomic/configure.tgt ++++ b/src/libatomic/configure.tgt +@@ -95,11 +95,6 @@ + + # Other system configury + case "${target}" in +- aarch64*) +- # This is currently not supported in AArch64. +- UNSUPPORTED=1 +- ;; +- + arm*-*-linux*) + # OS support for atomic primitives. + config_path="${config_path} linux/arm posix" +--- a/src/config/ChangeLog.linaro ++++ b/src/config/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libbacktrace/ChangeLog.linaro ++++ b/src/libbacktrace/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libjava/libltdl/ChangeLog.linaro ++++ b/src/libjava/libltdl/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libjava/configure.host ++++ b/src/libjava/configure.host +@@ -81,6 +81,11 @@ + + # This case statement supports per-CPU defaults. + case "${host}" in ++ aarch64*-linux*) ++ libgcj_interpreter=yes ++ sysdeps_dir=aarch64 ++ ATOMICSPEC=-fuse-atomic-builtins ++ ;; + arm*-elf) + with_libffi_default=no + PROCESS=Ecos +@@ -289,6 +294,12 @@ + sysdeps_dir=i386 + DIVIDESPEC=-f%{m32:no-}use-divide-subroutine + ;; ++ aarch64*-linux* ) ++ slow_pthread_self=no ++ can_unwind_signal=no ++ CHECKREFSPEC=-fcheck-references ++ DIVIDESPEC=-fuse-divide-subroutine ++ ;; + arm*-linux* ) + slow_pthread_self=no + can_unwind_signal=no +--- a/src/libjava/ChangeLog.linaro ++++ b/src/libjava/ChangeLog.linaro +@@ -0,0 +1,59 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-12-06 Michael Collison ++ ++ Backport from trunk r197997 ++ 2013-04-16 Andreas Schwab ++ ++ * configure.host: Add support for aarch64. ++ * sysdep/aarch64/locks.h: New file. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libjava/classpath/ChangeLog.linaro ++++ b/src/libjava/classpath/ChangeLog.linaro +@@ -0,0 +1,58 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-12-06 Michael Collison ++ ++ Backport from trunk r197997 ++ 2013-04-16 Andreas Schwab ++ ++ * native/fdlibm/ieeefp.h: Add support for aarch64. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libjava/classpath/native/fdlibm/ieeefp.h ++++ b/src/libjava/classpath/native/fdlibm/ieeefp.h +@@ -4,6 +4,14 @@ + #ifndef __IEEE_BIG_ENDIAN + #ifndef __IEEE_LITTLE_ENDIAN + ++#ifdef __aarch64__ ++#ifdef __AARCH64EB__ ++#define __IEEE_BIG_ENDIAN ++#else ++#define __IEEE_LITTLE_ENDIAN ++#endif ++#endif ++ + #ifdef __alpha__ + #define __IEEE_LITTLE_ENDIAN + #endif +--- a/src/libjava/sysdep/aarch64/locks.h ++++ b/src/libjava/sysdep/aarch64/locks.h +@@ -0,0 +1,57 @@ ++// locks.h - Thread synchronization primitives. AArch64 implementation. ++ ++#ifndef __SYSDEP_LOCKS_H__ ++#define __SYSDEP_LOCKS_H__ ++ ++typedef size_t obj_addr_t; /* Integer type big enough for object */ ++ /* address. */ ++ ++// Atomically replace *addr by new_val if it was initially equal to old. ++// Return true if the comparison succeeded. ++// Assumed to have acquire semantics, i.e. later memory operations ++// cannot execute before the compare_and_swap finishes. ++inline static bool ++compare_and_swap(volatile obj_addr_t *addr, ++ obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ return __sync_bool_compare_and_swap(addr, old, new_val); ++} ++ ++// Set *addr to new_val with release semantics, i.e. making sure ++// that prior loads and stores complete before this ++// assignment. ++inline static void ++release_set(volatile obj_addr_t *addr, obj_addr_t new_val) ++{ ++ __sync_synchronize(); ++ *addr = new_val; ++} ++ ++// Compare_and_swap with release semantics instead of acquire semantics. ++// On many architecture, the operation makes both guarantees, so the ++// implementation can be the same. ++inline static bool ++compare_and_swap_release(volatile obj_addr_t *addr, ++ obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ return __sync_bool_compare_and_swap(addr, old, new_val); ++} ++ ++// Ensure that subsequent instructions do not execute on stale ++// data that was loaded from memory before the barrier. ++inline static void ++read_barrier() ++{ ++ __sync_synchronize(); ++} ++ ++// Ensure that prior stores to memory are completed with respect to other ++// processors. ++inline static void ++write_barrier() ++{ ++ __sync_synchronize(); ++} ++#endif +--- a/src/gnattools/ChangeLog.linaro ++++ b/src/gnattools/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/maintainer-scripts/ChangeLog.linaro ++++ b/src/maintainer-scripts/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/configure ++++ b/src/configure +@@ -3272,6 +3272,8 @@ + + # Disable Java if libffi is not supported. + case "${target}" in ++ aarch64-*-*) ++ ;; + alpha*-*-*) + ;; + arm*-*-*) +--- a/src/libgcc/ChangeLog.linaro ++++ b/src/libgcc/ChangeLog.linaro +@@ -0,0 +1,61 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198090. ++ 2013-04-19 Yufeng Zhang ++ ++ * config/aarch64/sfp-machine.h (_FP_W_TYPE): Change to define ++ as 'unsigned long long' instead of 'unsigned long'. ++ (_FP_WS_TYPE): Change to define as 'signed long long' instead of ++ 'signed long'. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libgcc/config/aarch64/sfp-machine.h ++++ b/src/libgcc/config/aarch64/sfp-machine.h +@@ -24,8 +24,8 @@ + . */ + + #define _FP_W_TYPE_SIZE 64 +-#define _FP_W_TYPE unsigned long +-#define _FP_WS_TYPE signed long ++#define _FP_W_TYPE unsigned long long ++#define _FP_WS_TYPE signed long long + #define _FP_I_TYPE int + + typedef int TItype __attribute__ ((mode (TI))); +--- a/src/libgcc/config/libbid/ChangeLog.linaro ++++ b/src/libgcc/config/libbid/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libdecnumber/ChangeLog.linaro ++++ b/src/libdecnumber/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/LINARO-VERSION ++++ b/src/gcc/LINARO-VERSION +@@ -0,0 +1 @@ ++4.8-2014.03 +--- a/src/gcc/targhooks.c ++++ b/src/gcc/targhooks.c +@@ -1042,20 +1042,17 @@ + unsigned *cost = (unsigned *) data; + unsigned retval = 0; + +- if (flag_vect_cost_model) +- { +- tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; +- int stmt_cost = default_builtin_vectorization_cost (kind, vectype, ++ tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; ++ int stmt_cost = default_builtin_vectorization_cost (kind, vectype, + misalign); +- /* Statements in an inner loop relative to the loop being +- vectorized are weighted more heavily. The value here is +- arbitrary and could potentially be improved with analysis. */ +- if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) +- count *= 50; /* FIXME. */ ++ /* Statements in an inner loop relative to the loop being ++ vectorized are weighted more heavily. The value here is ++ arbitrary and could potentially be improved with analysis. */ ++ if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) ++ count *= 50; /* FIXME. */ + +- retval = (unsigned) (count * stmt_cost); +- cost[where] += retval; +- } ++ retval = (unsigned) (count * stmt_cost); ++ cost[where] += retval; + + return retval; + } +--- a/src/gcc/hooks.c ++++ b/src/gcc/hooks.c +@@ -147,6 +147,14 @@ + return false; + } + ++/* Generic hook that takes (gimple_stmt_iterator *) and returns ++ false. */ ++bool ++hook_bool_gsiptr_false (gimple_stmt_iterator *a ATTRIBUTE_UNUSED) ++{ ++ return false; ++} ++ + /* Used for the TARGET_ASM_CAN_OUTPUT_MI_THUNK hook. */ + bool + hook_bool_const_tree_hwi_hwi_const_tree_false (const_tree a ATTRIBUTE_UNUSED, +--- a/src/gcc/hooks.h ++++ b/src/gcc/hooks.h +@@ -42,6 +42,7 @@ + extern bool hook_bool_const_tree_false (const_tree); + extern bool hook_bool_tree_true (tree); + extern bool hook_bool_const_tree_true (const_tree); ++extern bool hook_bool_gsiptr_false (gimple_stmt_iterator *); + extern bool hook_bool_const_tree_hwi_hwi_const_tree_false (const_tree, + HOST_WIDE_INT, + HOST_WIDE_INT, +--- a/src/gcc/c-family/ChangeLog.linaro ++++ b/src/gcc/c-family/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/java/ChangeLog.linaro ++++ b/src/gcc/java/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/c/ChangeLog.linaro ++++ b/src/gcc/c/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/target.def ++++ b/src/gcc/target.def +@@ -1289,7 +1289,8 @@ + "", + tree, (unsigned int /*location_t*/ loc, tree fndecl, void *arglist), NULL) + +-/* Fold a target-specific builtin. */ ++/* Fold a target-specific builtin to a tree valid for both GIMPLE ++ and GENERIC. */ + DEFHOOK + (fold_builtin, + "", +@@ -1296,6 +1297,16 @@ + tree, (tree fndecl, int n_args, tree *argp, bool ignore), + hook_tree_tree_int_treep_bool_null) + ++/* Fold a target-specific builtin to a valid GIMPLE tree. */ ++DEFHOOK ++(gimple_fold_builtin, ++ "Fold a call to a machine specific built-in function that was set up\n\ ++by @samp{TARGET_INIT_BUILTINS}. @var{gsi} points to the gimple\n\ ++statement holding the function call. Returns true if any change\n\ ++was made to the GIMPLE stream.", ++ bool, (gimple_stmt_iterator *gsi), ++ hook_bool_gsiptr_false) ++ + /* Target hook is used to compare the target attributes in two functions to + determine which function's features get higher priority. This is used + during function multi-versioning to figure out the order in which two +--- a/src/gcc/incpath.c ++++ b/src/gcc/incpath.c +@@ -148,20 +148,22 @@ + if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) + { + char *str = concat (iprefix, p->fname + len, NULL); +- if (p->multilib == 1 && imultilib) +- str = reconcat (str, str, dir_separator_str, +- imultilib, NULL); +- else if (p->multilib == 2) ++ if (p->multilib && imultilib) ++ { ++ str = reconcat (str, str, dir_separator_str, ++ imultilib, NULL); ++ add_path (str, SYSTEM, p->cxx_aware, false); ++ } ++ else ++ add_path (str, SYSTEM, p->cxx_aware, false); ++ ++ if (p->multilib && imultiarch) + { +- if (!imultiarch) +- { +- free (str); +- continue; +- } ++ char *str = concat (iprefix, p->fname + len, NULL); + str = reconcat (str, str, dir_separator_str, + imultiarch, NULL); ++ add_path (str, SYSTEM, p->cxx_aware, false); + } +- add_path (str, SYSTEM, p->cxx_aware, false); + } + } + } +@@ -171,7 +173,7 @@ + { + if (!p->cplusplus || cxx_stdinc) + { +- char *str; ++ char *str, *str2; + + /* Should this directory start with the sysroot? */ + if (sysroot && p->add_sysroot) +@@ -215,19 +217,20 @@ + else + str = update_path (p->fname, p->component); + +- if (p->multilib == 1 && imultilib) +- str = reconcat (str, str, dir_separator_str, imultilib, NULL); +- else if (p->multilib == 2) ++ str2 = xstrdup(str); ++ if (p->multilib && imultilib) + { +- if (!imultiarch) +- { +- free (str); +- continue; +- } +- str = reconcat (str, str, dir_separator_str, imultiarch, NULL); ++ str = reconcat (str, str, dir_separator_str, imultilib, NULL); ++ add_path (str, SYSTEM, p->cxx_aware, false); + } ++ else ++ add_path (str, SYSTEM, p->cxx_aware, false); + +- add_path (str, SYSTEM, p->cxx_aware, false); ++ if (p->multilib && imultiarch) ++ { ++ str2 = reconcat (str2, str2, dir_separator_str, imultiarch, NULL); ++ add_path (str2, SYSTEM, p->cxx_aware, false); ++ } + } + } + } +--- a/src/gcc/rtlanal.c ++++ b/src/gcc/rtlanal.c +@@ -1199,6 +1199,10 @@ + if (find_reg_note (insn, REG_EQUAL, NULL_RTX)) + return 0; + ++ /* Check the code to be executed for COND_EXEC. */ ++ if (GET_CODE (pat) == COND_EXEC) ++ pat = COND_EXEC_CODE (pat); ++ + if (GET_CODE (pat) == SET && set_noop_p (pat)) + return 1; + +--- a/src/gcc/configure ++++ b/src/gcc/configure +@@ -1658,7 +1658,8 @@ + use sysroot as the system root during the build + --with-sysroot[=DIR] search for usr/lib, usr/include, et al, within DIR + --with-specs=SPECS add SPECS to driver command-line processing +- --with-pkgversion=PKG Use PKG in the version string in place of "GCC" ++ --with-pkgversion=PKG Use PKG in the version string in place of "Linaro ++ GCC `cat $srcdir/LINARO-VERSION`" + --with-bugurl=URL Direct users to URL to report a bug + --with-multilib-list select multilibs (SH and x86-64 only) + --with-gnu-ld assume the C compiler uses GNU ld default=no +@@ -7327,7 +7328,7 @@ + *) PKGVERSION="($withval) " ;; + esac + else +- PKGVERSION="(GCC) " ++ PKGVERSION="(Linaro GCC `cat $srcdir/LINARO-VERSION`) " + + fi + +@@ -25984,8 +25985,9 @@ + # ??? Once 2.11 is released, probably need to add first known working + # version to the per-target configury. + case "$cpu_type" in +- alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze | mips \ +- | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 | xtensa) ++ aarch64 | alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze \ ++ | mips | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 \ ++ | xtensa) + insn="nop" + ;; + ia64 | s390) +--- a/src/gcc/gcc.c ++++ b/src/gcc/gcc.c +@@ -2227,7 +2227,7 @@ + } + + /* Now try the multiarch path. */ +- if (!skip_multi_dir ++ if (!skip_multi_dir && !multi_dir + && !pl->require_machine_suffix && multiarch_dir) + { + memcpy (path + len, multiarch_suffix, multiarch_len + 1); +@@ -2263,6 +2263,16 @@ + if (ret) + break; + } ++ ++ /* Now try the multiarch path. */ ++ if (!skip_multi_dir ++ && !pl->require_machine_suffix && multiarch_dir) ++ { ++ memcpy (path + len, multiarch_suffix, multiarch_len + 1); ++ ret = callback (path, callback_info); ++ if (ret) ++ break; ++ } + } + if (pl) + break; +@@ -7662,6 +7672,21 @@ + ++p; + } + ++ if (first) ++ { ++ if (this_path_len > 3 ++ && this_path[0] == '.' ++ && this_path[1] == ':' ++ && this_path[2] == ':') ++ { ++ char *new_multiarch_dir = XNEWVEC (char, this_path_len + 1); ++ ++ strncpy (new_multiarch_dir, this_path, this_path_len); ++ new_multiarch_dir[this_path_len] = '\0'; ++ multiarch_dir = &new_multiarch_dir[3]; ++ } ++ } ++ + if (ok && first) + { + if (this_path_len != 1 +--- a/src/gcc/gensupport.c ++++ b/src/gcc/gensupport.c +@@ -1717,6 +1717,21 @@ + XVECEXP (insn, 1, 0) = pattern; + } + ++ if (XVEC (ce_elem->data, 3) != NULL) ++ { ++ rtvec attributes = rtvec_alloc (XVECLEN (insn, 4) ++ + XVECLEN (ce_elem->data, 3)); ++ int i = 0; ++ int j = 0; ++ for (i = 0; i < XVECLEN (insn, 4); i++) ++ RTVEC_ELT (attributes, i) = XVECEXP (insn, 4, i); ++ ++ for (j = 0; j < XVECLEN (ce_elem->data, 3); j++, i++) ++ RTVEC_ELT (attributes, i) = XVECEXP (ce_elem->data, 3, j); ++ ++ XVEC (insn, 4) = attributes; ++ } ++ + XSTR (insn, 2) = alter_test_for_insn (ce_elem, insn_elem); + XTMPL (insn, 3) = alter_output_for_insn (ce_elem, insn_elem, + alternatives, max_operand); +--- a/src/gcc/fold-const.c ++++ b/src/gcc/fold-const.c +@@ -2474,9 +2474,13 @@ + } + + if (TREE_CODE (arg0) != TREE_CODE (arg1) +- /* This is needed for conversions and for COMPONENT_REF. +- Might as well play it safe and always test this. */ +- || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK ++ /* NOP_EXPR and CONVERT_EXPR are considered equal. */ ++ && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1))) ++ return 0; ++ ++ /* This is needed for conversions and for COMPONENT_REF. ++ Might as well play it safe and always test this. */ ++ if (TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK + || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK + || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1))) + return 0; +--- a/src/gcc/objc/ChangeLog.linaro ++++ b/src/gcc/objc/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/tree-ssa-uncprop.c ++++ b/src/gcc/tree-ssa-uncprop.c +@@ -466,12 +466,11 @@ + struct equiv_hash_elt equiv_hash_elt; + void **slot; + +- /* If the argument is not an invariant, and refers to the same +- underlying variable as the PHI result, then there's no +- point in un-propagating the argument. */ ++ /* If the argument is not an invariant and can be potentially ++ coalesced with the result, then there's no point in ++ un-propagating the argument. */ + if (!is_gimple_min_invariant (arg) +- && (SSA_NAME_VAR (arg) == SSA_NAME_VAR (res) +- && TREE_TYPE (arg) == TREE_TYPE (res))) ++ && gimple_can_coalesce_p (arg, res)) + continue; + + /* Lookup this argument's value in the hash table. */ +@@ -485,7 +484,7 @@ + int j; + + /* Walk every equivalence with the same value. If we find +- one with the same underlying variable as the PHI result, ++ one that can potentially coalesce with the PHI rsult, + then replace the value in the argument with its equivalent + SSA_NAME. Use the most recent equivalence as hopefully + that results in shortest lifetimes. */ +@@ -493,8 +492,7 @@ + { + tree equiv = elt->equivalences[j]; + +- if (SSA_NAME_VAR (equiv) == SSA_NAME_VAR (res) +- && TREE_TYPE (equiv) == TREE_TYPE (res)) ++ if (gimple_can_coalesce_p (equiv, res)) + { + SET_PHI_ARG_DEF (phi, e->dest_idx, equiv); + break; +--- a/src/gcc/ChangeLog.linaro ++++ b/src/gcc/ChangeLog.linaro +@@ -0,0 +1,3063 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ * LINARO-VERSION: Update. ++ ++2014-02-13 Yvan Roux ++ ++ * LINARO-VERSION: Bump version. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ * LINARO-VERSION: Update. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206518 ++ 2014-01-10 Kyrylo Tkachov ++ ++ * config/arm/arm.c (arm_init_iwmmxt_builtins): Skip ++ non-iwmmxt builtins. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206151 ++ 2013-12-20 Kyrylo Tkachov ++ ++ * config/arm/neon.ml (crypto_intrinsics): Add vceq_64 and vtst_p64. ++ * config/arm/arm_neon.h: Regenerate. ++ * config/arm/neon-docgen.ml: Add vceq_p64 and vtst_p64. ++ * doc/arm-neon-intrinsics.texi: Regenerate. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206149 ++ 2013-12-20 Kyrylo Tkachov ++ ++ * config/arm/arm_acle.h: Add underscores before variables. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206132 ++ 2013-12-19 Kyrylo Tkachov ++ ++ * config/arm/neon-docgen.ml: Add crypto intrinsics documentation. ++ * doc/arm-neon-intrinsics.texi: Regenerate. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206131 ++ 2013-12-19 Kyrylo Tkachov ++ ++ * config/arm/neon-testgen.ml (effective_target): Handle "CRYPTO". ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206130 ++ 2013-12-19 Kyrylo Tkachov ++ ++ * config/arm/arm.c (enum arm_builtins): Add crypto builtins. ++ (arm_init_neon_builtins): Handle crypto builtins. ++ (bdesc_2arg): Likewise. ++ (bdesc_1arg): Likewise. ++ (bdesc_3arg): New table. ++ (arm_expand_ternop_builtin): New function. ++ (arm_expand_unop_builtin): Handle sha1h explicitly. ++ (arm_expand_builtin): Handle ternary builtins. ++ * config/arm/arm.h (TARGET_CPU_CPP_BUILTINS): ++ Define __ARM_FEATURE_CRYPTO. ++ * config/arm/arm.md: Include crypto.md. ++ (is_neon_type): Add crypto types. ++ * config/arm/arm_neon_builtins.def: Add TImode reinterprets. ++ * config/arm/crypto.def: New. ++ * config/arm/crypto.md: Likewise. ++ * config/arm/iterators.md (CRYPTO_UNARY): New int iterator. ++ (CRYPTO_BINARY): Likewise. ++ (CRYPTO_TERNARY): Likewise. ++ (CRYPTO_SELECTING): Likewise. ++ (crypto_pattern): New int attribute. ++ (crypto_size_sfx): Likewise. ++ (crypto_mode): Likewise. ++ (crypto_type): Likewise. ++ * config/arm/neon-gen.ml: Handle poly64_t and poly128_t types. ++ Handle crypto intrinsics. ++ * config/arm/neon.ml: Add support for poly64 and polt128 types ++ and intrinsics. Define crypto intrinsics. ++ * config/arm/neon.md (neon_vreinterpretti): New pattern. ++ (neon_vreinterpretv16qi): Use VQXMOV mode iterator. ++ (neon_vreinterpretv8hi): Likewise. ++ (neon_vreinterpretv4si): Likewise. ++ (neon_vreinterpretv4sf): Likewise. ++ (neon_vreinterpretv2di): Likewise. ++ * config/arm/unspecs.md (UNSPEC_AESD, UNSPEC_AESE, UNSPEC_AESIMC, ++ UNSPEC_AESMC, UNSPEC_SHA1C, UNSPEC_SHA1M, UNSPEC_SHA1P, UNSPEC_SHA1H, ++ UNSPEC_SHA1SU0, UNSPEC_SHA1SU1, UNSPEC_SHA256H, UNSPEC_SHA256H2, ++ UNSPEC_SHA256SU0, UNSPEC_SHA256SU1, VMULLP64): Define. ++ * config/arm/arm_neon.h: Regenerate. ++ ++ Modifications needed to backport into linaro-4_8-branch: ++ * config/arm/arm.md (attribute neon_type): neon_crypto_aes, ++ neon_crypto_sha1_xor, neon_crypto_sha1_fast, ++ neon_crypto_sha1_slow, neon_crypto_sha256_fast, ++ neon_crypto_sha256_slow, neon_mul_d_long: New. ++ instead of: ++ * config/arm/arm.md: Include crypto.md. ++ (is_neon_type): Add crypto types. ++ ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206128 ++ 2013-12-19 Kyrylo Tkachov ++ ++ * Makefile.in (TEXI_GCC_FILES): Add arm-acle-intrinsics.texi. ++ * config.gcc (extra_headers): Add arm_acle.h. ++ * config/arm/arm.c (FL_CRC32): Define. ++ (arm_have_crc): Likewise. ++ (arm_option_override): Set arm_have_crc. ++ (arm_builtins): Add CRC32 builtins. ++ (bdesc_2arg): Likewise. ++ (arm_init_crc32_builtins): New function. ++ (arm_init_builtins): Initialise CRC32 builtins. ++ (arm_file_start): Handle architecture extensions. ++ * config/arm/arm.h (TARGET_CPU_CPP_BUILTINS): Define __ARM_FEATURE_CRC32. ++ Define __ARM_32BIT_STATE. ++ (TARGET_CRC32): Define. ++ * config/arm/arm-arches.def: Add armv8-a+crc. ++ * config/arm/arm-tables.opt: Regenerate. ++ * config/arm/arm.md (type): Add crc. ++ (): New insn. ++ * config/arm/arm_acle.h: New file. ++ * config/arm/iterators.md (CRC): New int iterator. ++ (crc_variant, crc_mode): New int attributes. ++ * confg/arm/unspecs.md (UNSPEC_CRC32B, UNSPEC_CRC32H, UNSPEC_CRC32W, ++ UNSPEC_CRC32CB, UNSPEC_CRC32CH, UNSPEC_CRC32CW): New unspecs. ++ * doc/invoke.texi: Document -march=armv8-a+crc option. ++ * doc/extend.texi: Document ACLE intrinsics. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206120 ++ 2013-12-19 Tejas Belagod ++ ++ * config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins): ++ Define builtin types for poly64_t poly128_t. ++ (TYPES_BINOPP, aarch64_types_binopp_qualifiers): New. ++ * aarch64/aarch64-simd-builtins.def: Update builtins table. ++ * config/aarch64/aarch64-simd.md (aarch64_crypto_pmulldi, ++ aarch64_crypto_pmullv2di): New. ++ * config/aarch64/aarch64.c (aarch64_simd_mangle_map): Update table for ++ poly64x2_t mangler. ++ * config/aarch64/arm_neon.h (poly64x2_t, poly64_t, poly128_t): Define. ++ (vmull_p64, vmull_high_p64): New. ++ * config/aarch64/iterators.md (UNSPEC_PMULL<2>): New. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206119 ++ 2013-12-19 Tejas Belagod ++ ++ * config/aarch64/aarch64-simd-builtins.def: Update builtins table. ++ * config/aarch64/aarch64-simd.md (aarch64_crypto_sha256hv4si, ++ aarch64_crypto_sha256su0v4si, aarch64_crypto_sha256su1v4si): New. ++ * config/aarch64/arm_neon.h (vsha256hq_u32, vsha256h2q_u32, ++ vsha256su0q_u32, vsha256su1q_u32): New. ++ * config/aarch64/iterators.md (UNSPEC_SHA256H<2>, UNSPEC_SHA256SU<01>): ++ New. ++ (CRYPTO_SHA256): New int iterator. ++ (sha256_op): New int attribute. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206118 ++ 2013-12-19 Tejas Belagod ++ ++ * config/aarch64/aarch64-simd-builtins.def: Update builtins table. ++ * config/aarch64/aarch64-builtins.c (aarch64_types_ternopu_qualifiers, ++ TYPES_TERNOPU): New. ++ * config/aarch64/aarch64-simd.md (aarch64_crypto_sha1hsi, ++ aarch64_crypto_sha1su1v4si, aarch64_crypto_sha1v4si, ++ aarch64_crypto_sha1su0v4si): New. ++ * config/aarch64/arm_neon.h (vsha1cq_u32, sha1mq_u32, vsha1pq_u32, ++ vsha1h_u32, vsha1su0q_u32, vsha1su1q_u32): New. ++ * config/aarch64/iterators.md (UNSPEC_SHA1, UNSPEC_SHA1SU<01>): ++ New. ++ (CRYPTO_SHA1): New int iterator. ++ (sha1_op): New int attribute. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206117 ++ 2013-12-19 Tejas Belagod ++ ++ * config/aarch64/aarch64-simd-builtins.def: Update builtins table. ++ * config/aarch64/aarch64-builtins.c (aarch64_types_binopu_qualifiers, ++ TYPES_BINOPU): New. ++ * config/aarch64/aarch64-simd.md (aarch64_crypto_aesv16qi, ++ aarch64_crypto_aesv16qi): New. ++ * config/aarch64/arm_neon.h (vaeseq_u8, vaesdq_u8, vaesmcq_u8, ++ vaesimcq_u8): New. ++ * config/aarch64/iterators.md (UNSPEC_AESE, UNSPEC_AESD, UNSPEC_AESMC, ++ UNSPEC_AESIMC): New. ++ (CRYPTO_AES, CRYPTO_AESMC): New int iterators. ++ (aes_op, aesmc_op): New int attributes. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206115 ++ 2013-12-19 Tejas Belagod ++ ++ * config/arm/types.md (neon_mul_d_long, crypto_aes, crypto_sha1_xor, ++ crypto_sha1_fast, crypto_sha1_slow, crypto_sha256_fast, ++ crypto_sha256_slow): New. ++ ++ Modifications needed to backport into linaro-4_8-branch: ++ * config/aarch64/aarch64-simd.md (attribute simd_type): ++ (simd_mul_d_long, simd_crypto_aes, simd_crypto_sha1_xor, ++ simd_crypto_sha1_fast, simd_crypto_sha1_slow, simd_crypto_sha256_fast, ++ simd_crypto_sha256_slow) : New. ++ instead of the above change. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206114 ++ 2013-12-19 Tejas Belagod ++ ++ * config/aarch64/aarch64.h (TARGET_CRYPTO): New. ++ (__ARM_FEATURE_CRYPTO): Define if TARGET_CRYPTO is true. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r205384. ++ 2013-11-26 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_type_qualifiers): Add qualifier_poly. ++ (aarch64_build_scalar_type): Also build Poly types. ++ (aarch64_build_vector_type): Likewise. ++ (aarch64_build_type): Likewise. ++ (aarch64_build_signed_type): New. ++ (aarch64_build_unsigned_type): Likewise. ++ (aarch64_build_poly_type): Likewise. ++ (aarch64_init_simd_builtins): Also handle Poly types. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r205383. ++ 2013-11-26 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (VAR1): Use new naming scheme for aarch64_builtins. ++ (aarch64_builtin_vectorized_function): Use new ++ aarch64_builtins names. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r205092. ++ 2013-11-20 James Greenhalgh ++ ++ * gcc/config/aarch64/aarch64-builtins.c ++ (aarch64_simd_itype): Remove. ++ (aarch64_simd_builtin_datum): Remove itype, add ++ qualifiers pointer. ++ (VAR1): Use qualifiers. ++ (aarch64_build_scalar_type): New. ++ (aarch64_build_vector_type): Likewise. ++ (aarch64_build_type): Likewise. ++ (aarch64_init_simd_builtins): Refactor, remove special cases, ++ consolidate main loop. ++ (aarch64_simd_expand_args): Likewise. ++ ++2014-02-01 Christophe Lyon ++ ++ Backport from trunk r202875,202980. ++ 2013-09-24 Xinliang David Li ++ ++ * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): ++ Check max peel iterations parameter. ++ * param.def: New parameter. ++ * doc/invoke.texi: Document New parameter. ++ ++ 2013-09-27 Xinliang David Li ++ ++ * opts.c (finish_options): Adjust parameters ++ according to vect cost model. ++ (common_handle_option): Set dynamic vect cost ++ model for FDO. ++ targhooks.c (default_add_stmt_cost): Compute stmt cost ++ unconditionally. ++ * tree-vect-loop.c (vect_estimate_min_profitable_iters): ++ Use helper function. ++ * tree-vectorizer.h (unlimited_cost_model): New function. ++ * tree-vect-slp.c (vect_slp_analyze_bb_1): Use helper function. ++ * tree-vect-data-refs.c (vect_peeling_hash_insert): Use helper ++ function. ++ (vect_enhance_data_refs_alignment): Ditto. ++ * flag-types.h: New enum. ++ * common/config/i386/i386-common.c (ix86_option_init_struct): ++ No need to initialize vect_cost_model flag. ++ * config/i386/i386.c (ix86_add_stmt_cost): Compute stmt cost ++ unconditionally. ++ ++2014-01-21 Zhenqiang Chen ++ ++ Backport from trunk r200103 ++ 2013-06-15 Jeff Law ++ ++ * gimple.h (gimple_can_coalesce_p): Prototype. ++ * tree-ssa-coalesce.c (gimple_can_coalesce_p): New function. ++ (create_outofssa_var_map, coalesce_partitions): Use it. ++ * tree-ssa-uncprop.c (uncprop_into_successor_phis): Similarly. ++ * tree-ssa-live.c (var_map_base_init): Use TYPE_CANONICAL ++ if it's available. ++ ++2014-01-21 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ * LINARO-VERSION: Update. ++ ++2014-01-16 Zhenqiang Chen ++ ++ Linaro local patch for armv4t multilib support. ++ * gcc/config/arm/t-mlibs: New file. ++ * config.gcc: Add t-mlibs. ++ * incpath.c (add_standard_paths): Try multilib path first. ++ * gcc.c (for_each_path): Likewise. ++ ++2013-12-21 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ * LINARO-VERSION: Update. ++ ++2013-12-06 Christophe Lyon ++ ++ Backport from trunk r204737. ++ 2013-11-13 Christophe Lyon ++ ++ * config/aarch64/aarch64.h (FRAME_GROWS_DOWNWARD): Define to 1. ++ * config/aarch64/aarch64.c (aarch64_initial_elimination_offset): ++ Update offset calculations. ++ ++2013-12-06 Christophe Lyon ++ ++ Backport from trunk r203327. ++ 2013-10-09 Zhenqiang Chen ++ ++ * tree-ssa-phiopts.c (rhs_is_fed_for_value_replacement): New function. ++ (operand_equal_for_value_replacement): New function, extracted from ++ value_replacement and enhanced to catch more cases. ++ (value_replacement): Use operand_equal_for_value_replacement. ++ ++2013-11-18 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ * LINARO-VERSION: Update. ++ ++2013-11-06 Christophe Lyon ++ ++ Revert backport from trunk r197526. ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (negdi_extendsidi): New pattern. ++ (negdi_zero_extendsidi): Likewise. ++ ++2013-11-05 Zhenqiang Chen ++ ++ Backport from trunk r203267, r203603 and r204247. ++ 2013-10-08 Zhenqiang Chen ++ ++ PR target/58423 ++ * config/arm/arm.c (arm_emit_ldrd_pop): Attach ++ RTX_FRAME_RELATED_P on INSN. ++ ++ 2013-10-15 Matthew Gretton-Dann ++ Ramana Radhakrishnan ++ ++ * config/arm/t-aprofile: New file. ++ * config.gcc: Handle --with-multilib-list option. ++ ++ 2013-10-31 Zhenqiang Chen ++ ++ * lower-subreg.c (resolve_simple_move): Copy REG_INC note. ++ ++2013-10-17 Christophe Lyon ++ ++ Backport from trunk r200956 ++ 2013-07-15 Marcus Shawcroft ++ ++ * config/aarch64/aarch64-protos.h (aarch64_symbol_type): ++ Define SYMBOL_TINY_GOT, update comment. ++ * config/aarch64/aarch64.c ++ (aarch64_load_symref_appropriately): Handle SYMBOL_TINY_GOT. ++ (aarch64_expand_mov_immediate): Likewise. ++ (aarch64_print_operand): Likewise. ++ (aarch64_classify_symbol): Likewise. ++ * config/aarch64/aarch64.md (UNSPEC_GOTTINYPIC): Define. ++ (ldr_got_tiny): Define. ++ ++2013-10-16 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ * LINARO-VERSION: Update. ++ ++2013-10-09 Christophe Lyon ++ ++ Backport from trunk r198526,198527,200020,200595. ++ 2013-05-02 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*and_one_cmpl3_compare0): ++ New pattern. ++ (*and_one_cmplsi3_compare0_uxtw): Likewise. ++ (*and_one_cmpl_3_compare0): Likewise. ++ (*and_one_cmpl_si3_compare0_uxtw): Likewise. ++ ++ 2013-05-02 Ian Bolton ++ ++ * config/aarch64/aarch64.md (movsi_aarch64): Only allow to/from ++ S reg when fp attribute set. ++ (movdi_aarch64): Only allow to/from D reg when fp attribute set. ++ ++ 2013-06-12 Sofiane Naci ++ ++ * config/aarch64/aarch64-simd.md (aarch64_combine): convert to split. ++ (aarch64_simd_combine): New instruction expansion. ++ * config/aarch64/aarch64-protos.h (aarch64_split_simd_combine): New ++ function prototype. ++ * config/aarch64/aarch64.c (aarch64_split_combine): New function. ++ * config/aarch64/iterators.md (Vdbl): Add entry for DF. ++ ++ 2013-07-02 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*extr_insv_reg): New pattern. ++ ++2013-10-09 Christophe Lyon ++ ++ Backport from trunk r201879. ++ 2013-08-20 Matthew Gretton-Dann ++ ++ * config/arm/linux-elf.h (MULTILIB_DEFAULTS): Remove definition. ++ * config/arm/t-linux-eabi (MULTILIB_OPTIONS): Document association ++ with MULTLIB_DEFAULTS. ++ ++2013-10-09 Christophe Lyon ++ ++ Backport from trunk r201871. ++ 2013-08-20 Pavel Chupin ++ ++ Fix LIB_SPEC for systems without libpthread. ++ ++ * config/gnu-user.h: Introduce GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC. ++ * config/arm/linux-eabi.h: Use GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC ++ for Android. ++ * config/i386/linux-common.h: Likewise. ++ * config/mips/linux-common.h: Likewise. ++ ++2013-10-08 Christophe Lyon ++ ++ Backport from trunk r202702. ++ 2013-09-18 Richard Earnshaw ++ ++ * arm.c (arm_get_frame_offsets): Validate architecture supports ++ LDRD/STRD before accepting the tuning preference. ++ (arm_expand_prologue): Likewise. ++ (arm_expand_epilogue): Likewise. ++ ++2013-10-04 Venkataramanan.Kumar ++ ++ Backport from trunk r203028. ++ 2013-09-30 Venkataramanan Kumar ++ ++ * config/aarch64/aarch64.h (MCOUNT_NAME): Define. ++ (NO_PROFILE_COUNTERS): Likewise. ++ (PROFILE_HOOK): Likewise. ++ (FUNCTION_PROFILER): Likewise. ++ * config/aarch64/aarch64.c (aarch64_function_profiler): Remove. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r201923,201927. ++ 2013-08-22 Julian Brown ++ ++ * configure.ac: Add aarch64 to list of arches which use "nop" in ++ debug_line test. ++ * configure: Regenerate. ++ ++ 2013-08-22 Paolo Carlini ++ ++ * configure.ac: Add backslashes missing from the last change. ++ * configure: Regenerate. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202023,202108. ++ 2013-08-27 Tejas Belagod ++ ++ * config/aarch64/arm_neon.h: Replace all inline asm implementations ++ of vget_low_* with implementations in terms of other intrinsics. ++ ++ 2013-08-30 Tejas Belagod ++ ++ * config/aarch64/arm_neon.h (__AARCH64_UINT64_C, __AARCH64_INT64_C): New ++ arm_neon.h's internal macros to specify 64-bit constants. Avoid using ++ stdint.h's macros. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r201260,202400. ++ 2013-07-26 Kyrylo Tkachov ++ Richard Earnshaw ++ ++ * combine.c (simplify_comparison): Re-canonicalize operands ++ where appropriate. ++ * config/arm/arm.md (movcond_addsi): New splitter. ++ ++ 2013-09-09 Kyrylo Tkachov ++ ++ * config/aarch64/aarch64.c (aarch64_select_cc_mode): Return CC_SWP for ++ comparison with negated operand. ++ * config/aarch64/aarch64.md (compare_neg): Match canonical ++ RTL form. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202164. ++ 2013-09-02 Bin Cheng ++ ++ * tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates): ++ Find auto-increment use both before and after candidate. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202279. ++ 2013-09-05 Richard Earnshaw ++ ++ * arm.c (thumb2_emit_strd_push): Rewrite to use pre-decrement on ++ initial store. ++ * thumb2.md (thumb2_storewb_parisi): New pattern. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202275. ++ 2013-09-05 Yufeng Zhang ++ ++ * config/aarch64/aarch64-option-extensions.def: Add ++ AARCH64_OPT_EXTENSION of 'crc'. ++ * config/aarch64/aarch64.h (AARCH64_FL_CRC): New define. ++ (AARCH64_ISA_CRC): Ditto. ++ * doc/invoke.texi (-march and -mcpu feature modifiers): Add ++ description of the CRC extension. ++ ++2013-10-01 Christophe Lyon ++ ++ Backport from trunk r201250. ++ 2013-07-25 Kyrylo Tkachov ++ ++ * config/arm/arm.md (arm_addsi3, addsi3_carryin_, ++ addsi3_carryin_alt2_): Correct output template. ++ ++2013-10-01 Kugan Vivekanandarajah ++ ++ Backport from trunk r203059,203116. ++ 2013-10-01 Kugan Vivekanandarajah ++ ++ PR target/58578 ++ Revert ++ 2013-04-05 Greta Yorsh ++ * config/arm/arm.md (arm_ashldi3_1bit): define_insn into ++ define_insn_and_split. ++ (arm_ashrdi3_1bit,arm_lshrdi3_1bit): Likewise. ++ (shiftsi3_compare): New pattern. ++ (rrx): New pattern. ++ * config/arm/unspecs.md (UNSPEC_RRX): New. ++ ++2013-09-11 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ * LINARO-VERSION: Update. ++ ++2013-09-10 Venkataramanan Kumar ++ ++ Backport from trunk r200197, 201411. ++ 2013-06-19 Richard Earnshaw ++ ++ arm.md (split for eq(reg, 0)): Add variants for ARMv5 and Thumb2. ++ (peepholes for eq(reg, not-0)): Ensure condition register is dead after ++ pattern. Use more efficient sequences on ARMv5 and Thumb2. ++ ++ 2013-08-01 Kyrylo Tkachov ++ ++ * config/arm/arm.md (peepholes for eq (reg1) (reg2/imm)): ++ Generate canonical plus rtx with negated immediate instead of minus ++ where appropriate. ++ * config/arm/arm.c (thumb2_reorg): Handle ADCS , case. ++ ++2013-09-10 Christophe Lyon ++ ++ Backport from trunk r200593,201024,201025,201122,201124,201126. ++ 2013-07-02 Kyrylo Tkachov ++ ++ * config/arm/arm.md (arm_andsi3_insn): Add alternatives for 16-bit ++ encoding. ++ (iorsi3_insn): Likewise. ++ (arm_xorsi3): Likewise. ++ ++ 2013-07-18 Sofiane Naci ++ ++ * config/arm/arm.md (attribute "type"): Rename "simple_alu_imm" to ++ "arlo_imm". Rename "alu_reg" to "arlo_reg". Rename "simple_alu_shift" to ++ "extend". Split "alu_shift" into "shift" and "arlo_shift". Split ++ "alu_shift_reg" into "shift_reg" and "arlo_shift_reg". List types ++ in alphabetical order. ++ (attribute "core_cycles"): Update for attribute changes. ++ (arm_addsi3): Likewise. ++ (addsi3_compare0): Likewise. ++ (addsi3_compare0_scratch): Likewise. ++ (addsi3_compare_op1): Likewise. ++ (addsi3_compare_op2): Likewise. ++ (compare_addsi2_op0): Likewise. ++ (compare_addsi2_op1): Likewise. ++ (addsi3_carryin_shift_): Likewise. ++ (subsi3_carryin_shift): Likewise. ++ (rsbsi3_carryin_shift): Likewise. ++ (arm_subsi3_insn): Likewise. ++ (subsi3_compare0): Likewise. ++ (subsi3_compare): Likewise. ++ (arm_andsi3_insn): Likewise. ++ (thumb1_andsi3_insn): Likewise. ++ (andsi3_compare0): Likewise. ++ (andsi3_compare0_scratch): Likewise. ++ (zeroextractsi_compare0_scratch ++ (andsi_not_shiftsi_si): Likewise. ++ (iorsi3_insn): Likewise. ++ (iorsi3_compare0): Likewise. ++ (iorsi3_compare0_scratch): Likewise. ++ (arm_xorsi3): Likewise. ++ (thumb1_xorsi3_insn): Likewise. ++ (xorsi3_compare0): Likewise. ++ (xorsi3_compare0_scratch): Likewise. ++ (satsi__shift): Likewise. ++ (rrx): Likewise. ++ (arm_shiftsi3): Likewise. ++ (shiftsi3_compare0): Likewise. ++ (not_shiftsi): Likewise. ++ (not_shiftsi_compare0): Likewise. ++ (not_shiftsi_compare0_scratch): Likewise. ++ (arm_one_cmplsi2): Likewise. ++ (thumb_one_complsi2): Likewise. ++ (notsi_compare0): Likewise. ++ (notsi_compare0_scratch): Likewise. ++ (thumb1_zero_extendhisi2): Likewise. ++ (arm_zero_extendhisi2): Likewise. ++ (arm_zero_extendhisi2_v6): Likewise. ++ (arm_zero_extendhisi2addsi): Likewise. ++ (thumb1_zero_extendqisi2): Likewise. ++ (thumb1_zero_extendqisi2_v6): Likewise. ++ (arm_zero_extendqisi2): Likewise. ++ (arm_zero_extendqisi2_v6): Likewise. ++ (arm_zero_extendqisi2addsi): Likewise. ++ (thumb1_extendhisi2): Likewise. ++ (arm_extendhisi2): Likewise. ++ (arm_extendhisi2_v6): Likewise. ++ (arm_extendqisi): Likewise. ++ (arm_extendqisi_v6): Likewise. ++ (arm_extendqisi2addsi): Likewise. ++ (thumb1_extendqisi2): Likewise. ++ (thumb1_movdi_insn): Likewise. ++ (arm_movsi_insn): Likewise. ++ (movsi_compare0): Likewise. ++ (movhi_insn_arch4): Likewise. ++ (movhi_bytes): Likewise. ++ (arm_movqi_insn): Likewise. ++ (thumb1_movqi_insn): Likewise. ++ (arm32_movhf): Likewise. ++ (thumb1_movhf): Likewise. ++ (arm_movsf_soft_insn): Likewise. ++ (thumb1_movsf_insn): Likewise. ++ (movdf_soft_insn): Likewise. ++ (thumb_movdf_insn): Likewise. ++ (arm_cmpsi_insn): Likewise. ++ (cmpsi_shiftsi): Likewise. ++ (cmpsi_shiftsi_swp): Likewise. ++ (arm_cmpsi_negshiftsi_si): Likewise. ++ (movsicc_insn): Likewise. ++ (movsfcc_soft_insn): Likewise. ++ (arith_shiftsi): Likewise. ++ (arith_shiftsi_compare0 ++ (arith_shiftsi_compare0_scratch ++ (sub_shiftsi): Likewise. ++ (sub_shiftsi_compare0 ++ (sub_shiftsi_compare0_scratch ++ (and_scc): Likewise. ++ (cond_move): Likewise. ++ (if_plus_move): Likewise. ++ (if_move_plus): Likewise. ++ (if_move_not): Likewise. ++ (if_not_move): Likewise. ++ (if_shift_move): Likewise. ++ (if_move_shift): Likewise. ++ (if_shift_shift): Likewise. ++ (if_not_arith): Likewise. ++ (if_arith_not): Likewise. ++ (cond_move_not): Likewise. ++ (thumb1_ashlsi3): Set type attribute. ++ (thumb1_ashrsi3): Likewise. ++ (thumb1_lshrsi3): Likewise. ++ (thumb1_rotrsi3): Likewise. ++ (shiftsi3_compare0_scratch): Likewise. ++ * config/arm/neon.md (neon_mov): Update for attribute changes. ++ (neon_mov): Likewise. ++ * config/arm/thumb2.md (thumb_andsi_not_shiftsi_si): Update for attribute ++ changes. ++ (thumb2_movsi_insn): Likewise. ++ (thumb2_cmpsi_neg_shiftsi): Likewise. ++ (thumb2_extendqisi_v6): Likewise. ++ (thumb2_zero_extendhisi2_v6): Likewise. ++ (thumb2_zero_extendqisi2_v6): Likewise. ++ (thumb2_shiftsi3_short): Likewise. ++ (thumb2_addsi3_compare0_scratch): Likewise. ++ (orsi_not_shiftsi_si): Likewise. ++ * config/arm/vfp.md (arm_movsi_vfp): Update for attribute changes. ++ * config/arm/arm-fixed.md (arm_ssatsihi_shift): Update for attribute ++ changes. ++ * config/arm/arm1020e.md (1020alu_op): Update for attribute changes. ++ (1020alu_shift_op): Likewise. ++ (1020alu_shift_reg_op): Likewise. ++ * config/arm/arm1026ejs.md (alu_op): Update for attribute changes. ++ (alu_shift_op): Likewise. ++ (alu_shift_reg_op): Likewise. ++ * config/arm/arm1136jfs.md (11_alu_op): Update for attribute changes. ++ (11_alu_shift_op): Likewise. ++ (11_alu_shift_reg_op): Likewise. ++ * config/arm/arm926ejs.md (9_alu_op): Update for attribute changes. ++ (9_alu_shift_reg_op): Likewise. ++ * config/arm/cortex-a15.md (cortex_a15_alu): Update for attribute changes. ++ (cortex_a15_alu_shift): Likewise. ++ (cortex_a15_alu_shift_reg): Likewise. ++ * config/arm/cortex-a5.md (cortex_a5_alu): Update for attribute changes. ++ (cortex_a5_alu_shift): Likewise. ++ * config/arm/cortex-a53.md (cortex_a53_alu) : Update for attribute ++ changes. ++ (cortex_a53_alu_shift): Likewise. ++ * config/arm/cortex-a7.md (cortex_a7_alu_imm): Update for attribute ++ changes. ++ (cortex_a7_alu_reg): Likewise. ++ (cortex_a7_alu_shift): Likewise. ++ * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute changes. ++ (cortex_a8_alu_shift): Likewise. ++ (cortex_a8_alu_shift_reg): Likewise. ++ (cortex_a8_mov): Likewise. ++ * config/arm/cortex-a9.md (cortex_a9_dp): Update for attribute changes. ++ (cortex_a9_dp_shift): Likewise. ++ * config/arm/cortex-m4.md (cortex_m4_alu): Update for attribute changes. ++ * config/arm/cortex-r4.md (cortex_r4_alu): Update for attribute changes. ++ (cortex_r4_mov): Likewise. ++ (cortex_r4_alu_shift): Likewise. ++ (cortex_r4_alu_shift_reg): Likewise. ++ * config/arm/fa526.md (526_alu_op): Update for attribute changes. ++ (526_alu_shift_op): Likewise. ++ * config/arm/fa606te.md (606te_alu_op): Update for attribute changes. ++ * config/arm/fa626te.md (626te_alu_op): Update for attribute changes. ++ (626te_alu_shift_op): Likewise. ++ * config/arm/fa726te.md (726te_shift_op): Update for attribute changes. ++ (726te_alu_op): Likewise. ++ (726te_alu_shift_op): Likewise. ++ (726te_alu_shift_reg_op): Likewise. ++ * config/arm/fmp626.md (mp626_alu_op): Update for attribute changes. ++ (mp626_alu_shift_op): Likewise. ++ * config/arm/marvell-pj4.md (pj4_alu_e1): Update for attribute changes. ++ (pj4_alu_e1_conds): Likewise. ++ (pj4_alu): Likewise. ++ (pj4_alu_conds): Likewise. ++ (pj4_shift): Likewise. ++ (pj4_shift_conds): Likewise. ++ (pj4_alu_shift): Likewise. ++ (pj4_alu_shift_conds): Likewise. ++ * config/arm/arm.c (xscale_sched_adjust_cost): Update for attribute changes. ++ (cortexa7_older_only): Likewise. ++ (cortexa7_younger): Likewise. ++ ++ 2013-07-18 Sofiane Naci ++ ++ * config/arm/arm.md (attribute "insn"): Delete values "mrs", "msr", ++ "xtab" and "sat". Move value "clz" from here to ... ++ (attriubte "type"): ... here. ++ (satsi_): Delete "insn" attribute. ++ (satsi__shift): Likewise. ++ (arm_zero_extendqisi2addsi): Likewise. ++ (arm_extendqisi2addsi): Likewise. ++ (clzsi2): Update for attribute changes. ++ (rbitsi2): Likewise. ++ * config/arm/arm-fixed.md (arm_ssatsihi_shift): Delete "insn" attribute. ++ (arm_usatsihi): Likewise. ++ * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute change. ++ ++ 2013-07-22 Kyrylo Tkachov ++ ++ * config/arm/predicates.md (shiftable_operator_strict_it): ++ New predicate. ++ * config/arm/thumb2.md (thumb_andsi_not_shiftsi_si): ++ Disable cond_exec version for arm_restrict_it. ++ (thumb2_smaxsi3): Convert to generate cond_exec. ++ (thumb2_sminsi3): Likewise. ++ (thumb32_umaxsi3): Likewise. ++ (thumb2_uminsi3): Likewise. ++ (thumb2_abssi2): Adjust constraints for arm_restrict_it. ++ (thumb2_neg_abssi2): Likewise. ++ (thumb2_mov_scc): Add alternative for 16-bit encoding. ++ (thumb2_movsicc_insn): Adjust alternatives. ++ (thumb2_mov_negscc): Disable for arm_restrict_it. ++ (thumb2_mov_negscc_strict_it): New pattern. ++ (thumb2_mov_notscc_strict_it): New pattern. ++ (thumb2_mov_notscc): Disable for arm_restrict_it. ++ (thumb2_ior_scc): Likewise. ++ (thumb2_ior_scc_strict_it): New pattern. ++ (thumb2_cond_move): Adjust for arm_restrict_it. ++ (thumb2_cond_arith): Disable for arm_restrict_it. ++ (thumb2_cond_arith_strict_it): New pattern. ++ (thumb2_cond_sub): Adjust for arm_restrict_it. ++ (thumb2_movcond): Likewise. ++ (thumb2_extendqisi_v6): Disable cond_exec variant for arm_restrict_it. ++ (thumb2_zero_extendhisi2_v6): Likewise. ++ (thumb2_zero_extendqisi2_v6): Likewise. ++ (orsi_notsi_si): Likewise. ++ (orsi_not_shiftsi_si): Likewise. ++ ++ 2013-07-22 Sofiane Naci ++ ++ * config/arm/arm.md (attribute "insn"): Delete. ++ (attribute "type"): Add "mov_imm", "mov_reg", "mov_shift", ++ "mov_shift_reg", "mvn_imm", "mvn_reg", "mvn_shift" and "mvn_shift_reg". ++ (not_shiftsi): Update for attribute change. ++ (not_shiftsi_compare0): Likewise. ++ (not_shiftsi_compare0_scratch): Likewise. ++ (arm_one_cmplsi2): Likewise. ++ (thumb1_one_cmplsi2): Likewise. ++ (notsi_compare0): Likewise. ++ (notsi_compare0_scratch): Likewise. ++ (thumb1_movdi_insn): Likewise. ++ (arm_movsi_insn): Likewise. ++ (movhi_insn_arch4): Likewise. ++ (movhi_bytes): Likewise. ++ (arm_movqi_insn): Likewise. ++ (thumb1_movqi_insn): Likewise. ++ (arm32_movhf): Likewise. ++ (thumb1_movhf): Likewise. ++ (arm_movsf_soft_insn): Likewise. ++ (thumb1_movsf_insn): Likewise. ++ (thumb_movdf_insn): Likewise. ++ (movsicc_insn): Likewise. ++ (movsfcc_soft_insn): Likewise. ++ (and_scc): Likewise. ++ (cond_move): Likewise. ++ (if_move_not): Likewise. ++ (if_not_move): Likewise. ++ (if_shift_move): Likewise. ++ (if_move_shift): Likewise. ++ (if_shift_shift): Likewise. ++ (if_not_arith): Likewise. ++ (if_arith_not): Likewise. ++ (cond_move_not): Likewise. ++ * config/arm/neon.md (neon_mov): Update for attribute change. ++ (neon_mov): Likewise. ++ * config/arm/vfp.md (arm_movsi_vfp): Update for attribute change. ++ (thumb2_movsi_vfp): Likewise. ++ (movsf_vfp): Likewise. ++ (thumb2_movsf_vfp): Likewise. ++ * config/arm/arm.c (xscale_sched_adjust_cost): Update for attribute change. ++ (cortexa7_older_only): Likewise. ++ (cortexa7_younger): Likewise. ++ * config/arm/arm1020e.md (1020alu_op): Update for attribute change. ++ (1020alu_shift_op): Likewise. ++ (1020alu_shift_reg_op): Likewise. ++ * config/arm/arm1026ejs.md (alu_op): Update for attribute change. ++ (alu_shift_op): Likewise. ++ (alu_shift_reg_op): Likewise. ++ * config/arm/arm1136jfs.md (11_alu_op): Update for attribute change. ++ (11_alu_shift_op): Likewise. ++ (11_alu_shift_reg_op): Likewise. ++ * config/arm/arm926ejs.md (9_alu_op): Update for attribute change. ++ (9_alu_shift_reg_op): Likewise. ++ * config/arm/cortex-a15.md (cortex_a15_alu): Update for attribute change. ++ (cortex_a15_alu_shift): Likewise. ++ (cortex_a15_alu_shift_reg): Likewise. ++ * config/arm/cortex-a5.md (cortex_a5_alu): Update for attribute change. ++ (cortex_a5_alu_shift): Likewise. ++ * config/arm/cortex-a53.md (cortex_a53_alu): Update for attribute change. ++ (cortex_a53_alu_shift): Likewise. ++ * config/arm/cortex-a7.md (cortex_a7_alu_imm): Update for attribute change. ++ (cortex_a7_alu_reg): Likewise. ++ (cortex_a7_alu_shift): Likewise. ++ * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute change. ++ (cortex_a8_alu_shift): Likewise. ++ (cortex_a8_alu_shift_reg): Likewise. ++ (cortex_a8_mov): Likewise. ++ * config/arm/cortex-a9.md (cortex_a9_dp): Update for attribute change. ++ (cortex_a9_dp_shift): Likewise. ++ * config/arm/cortex-m4.md (cortex_m4_alu): Update for attribute change. ++ * config/arm/cortex-r4.md (cortex_r4_alu): Update for attribute change. ++ (cortex_r4_mov): Likewise. ++ (cortex_r4_alu_shift): Likewise. ++ (cortex_r4_alu_shift_reg): Likewise. ++ * config/arm/fa526.md (526_alu_op): Update for attribute change. ++ (526_alu_shift_op): Likewise. ++ * config/arm/fa606te.md (606te_alu_op): Update for attribute change. ++ * config/arm/fa626te.md (626te_alu_op): Update for attribute change. ++ (626te_alu_shift_op): Likewise. ++ * config/arm/fa726te.md (726te_shift_op): Update for attribute change. ++ (726te_alu_op): Likewise. ++ (726te_alu_shift_op): Likewise. ++ (726te_alu_shift_reg_op): Likewise. ++ * config/arm/fmp626.md (mp626_alu_op): Update for attribute change. ++ (mp626_alu_shift_op): Likewise. ++ * config/arm/marvell-pj4.md (pj4_alu_e1): Update for attribute change. ++ (pj4_alu_e1_conds): Likewise. ++ (pj4_alu): Likewise. ++ (pj4_alu_conds): Likewise. ++ (pj4_shift): Likewise. ++ (pj4_shift_conds): Likewise. ++ (pj4_alu_shift): Likewise. ++ (pj4_alu_shift_conds): Likewise. ++ ++ 2013-07-22 Kyrylo Tkachov ++ ++ * config/arm/constraints.md (Pd): Allow TARGET_THUMB ++ instead of TARGET_THUMB1. ++ (Pz): New constraint. ++ * config/arm/arm.md (arm_addsi3): Add alternatives for 16-bit ++ encodings. ++ (compare_negsi_si): Likewise. ++ (compare_addsi2_op0): Likewise. ++ (compare_addsi2_op1): Likewise. ++ (addsi3_carryin_): Likewise. ++ (addsi3_carryin_alt2_): Likewise. ++ (addsi3_carryin_shift_): Disable cond_exec variant ++ for arm_restrict_it. ++ (subsi3_carryin): Likewise. ++ (arm_subsi3_insn): Add alternatives for 16-bit encoding. ++ (minmax_arithsi): Disable for arm_restrict_it. ++ (minmax_arithsi_non_canon): Adjust for arm_restrict_it. ++ (satsi_): Disable cond_exec variant for arm_restrict_it. ++ (satsi__shift): Likewise. ++ (arm_shiftsi3): Add alternative for 16-bit encoding. ++ (arm32_movhf): Disable for arm_restrict_it. ++ (arm_cmpdi_unsigned): Add alternatives for 16-bit encoding. ++ (arm_movtas_ze): Disable cond_exec variant for arm_restrict_it. ++ ++2013-09-09 Kugan Vivekanandarajah ++ ++ Backport from trunk r201412. ++ 2013-08-01 Kyrylo Tkachov ++ ++ * config/arm/arm.md (minmax_arithsi_non_canon): Emit canonical RTL form ++ when subtracting a constant. ++ ++2013-09-05 Yvan Roux ++ ++ Backport from trunk r201249. ++ 2013-07-25 Kyrylo Tkachov ++ ++ * config/arm/arm-fixed.md (ssmulsa3, usmulusa3): ++ Adjust for arm_restrict_it. ++ Remove trailing whitespace. ++ ++2013-09-05 Yvan Roux ++ ++ Backport from trunk r201342. ++ 2013-07-30 Richard Earnshaw ++ ++ * config.gcc (arm): Require 64-bit host-wide-int for all ARM target ++ configs. ++ ++2013-09-05 Christophe Lyon ++ ++ Backport from trunk r199527,199792,199814. ++ 2013-05-31 Kyrylo Tkachov ++ ++ PR target/56315 ++ * config/arm/arm.c (const_ok_for_dimode_op): Handle IOR. ++ * config/arm/arm.md (*iordi3_insn): Change to insn_and_split. ++ * config/arm/neon.md (iordi3_neon): Remove. ++ (neon_vorr): Generate iordi3 instead of iordi3_neon. ++ * config/arm/predicates.md (imm_for_neon_logic_operand): ++ Move to earlier in the file. ++ (neon_logic_op2): Likewise. ++ (arm_iordi_operand_neon): New predicate. ++ ++ 2013-06-07 Kyrylo Tkachov ++ ++ * config/arm/constraints.md (Df): New constraint. ++ * config/arm/arm.md (iordi3_insn): Use Df constraint instead of De. ++ Correct length attribute for last two alternatives. ++ ++ 2013-06-07 Kyrylo Tkachov ++ ++ PR target/56315 ++ * config/arm/arm.md (*xordi3_insn): Change to insn_and_split. ++ (xordi3): Change operand 2 constraint to arm_xordi_operand. ++ * config/arm/arm.c (const_ok_for_dimode_op): Handle XOR. ++ * config/arm/constraints.md (Dg): New constraint. ++ * config/arm/neon.md (xordi3_neon): Remove. ++ (neon_veor): Generate xordi3 instead of xordi3_neon. ++ * config/arm/predicates.md (arm_xordi_operand): New predicate. ++ ++2013-09-05 Christophe Lyon ++ ++ Backport from trunk r201599. ++ 2013-08-08 Richard Earnshaw ++ ++ PR target/57431 ++ * arm/neon.md (neon_vld1_dupdi): New expand pattern. ++ (neon_vld1_dup VD iterator): Iterate over VD not VDX. ++ ++2013-09-05 Christophe Lyon ++ ++ Backport from trunk r201589. ++ 2013-08-08 Bernd Edlinger ++ ++ PR target/58065 ++ * config/arm/arm.h (MALLOC_ABI_ALIGNMENT): Define. ++ ++2013-09-03 Venkataramanan Kumar ++ ++ Backport from trunk ++ r201624, r201666. ++ 2013-08-09 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd-builtins.def (get_lane_signed): Remove. ++ (get_lane_unsigned): Likewise. ++ (dup_lane_scalar): Likewise. ++ (get_lane): enable for VALL. ++ * config/aarch64/aarch64-simd.md ++ (aarch64_dup_lane_scalar): Remove. ++ (aarch64_get_lane_signed): Likewise. ++ (aarch64_get_lane_unsigned): Likewise. ++ (aarch64_get_lane_extend): New. ++ (aarch64_get_lane_zero_extendsi): Likewise. ++ (aarch64_get_lane): Enable for all vector modes. ++ (aarch64_get_lanedi): Remove misleading constraints. ++ * config/aarch64/arm_neon.h ++ (__aarch64_vget_lane_any): Define. ++ (__aarch64_vget_lane_<8,16,32,64>): Likewise. ++ (vget_lane_<8,16,32,64>): Use __aarch64_vget_lane macros. ++ (vdup_lane_<8,16,32,64>): Likewise. ++ * config/aarch64/iterators.md (VDQQH): New. ++ (VDQQHS): Likewise. ++ (vwcore): Likewise. ++ ++ 2013-08-12 James Greenhalgh ++ ++ * config/aarch64/arm_none.h ++ (vdup_lane_<8,16,32,64>): Fix macro call. ++ ++2013-08-26 Kugan Vivekanandarajah ++ ++ Backport from trunk r201341. ++ 2013-07-30 Richard Earnshaw ++ ++ * arm.md (mulhi3): New expand pattern. ++ ++2013-08-16 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ * LINARO-VERSION: Update. ++ ++2013-08-08 Christophe Lyon ++ ++ Backport from trunk ++ r198489,200167,200199,200510,200513,200515,200576. ++ 2013-05-01 Greta Yorsh ++ ++ * config/arm/thumb2.md (thumb2_smaxsi3,thumb2_sminsi3): Convert ++ define_insn to define_insn_and_split. ++ (thumb32_umaxsi3,thumb2_uminsi3): Likewise. ++ (thumb2_negdi2,thumb2_abssi2,thumb2_neg_abssi2): Likewise. ++ (thumb2_mov_scc,thumb2_mov_negscc,thumb2_mov_notscc): Likewise. ++ (thumb2_movsicc_insn,thumb2_and_scc,thumb2_ior_scc): Likewise. ++ (thumb2_negscc): Likewise. ++ ++ 2013-06-18 Sofiane Naci ++ ++ * config/arm/arm.md (attribute "insn"): Move multiplication and division ++ attributes to... ++ (attribute "type"): ... here. Remove mult. ++ (attribute "mul32"): New attribute. ++ (attribute "mul64"): Add umaal. ++ (*arm_mulsi3): Update attributes. ++ (*arm_mulsi3_v6): Likewise. ++ (*thumb_mulsi3): Likewise. ++ (*thumb_mulsi3_v6): Likewise. ++ (*mulsi3_compare0): Likewise. ++ (*mulsi3_compare0_v6): Likewise. ++ (*mulsi_compare0_scratch): Likewise. ++ (*mulsi_compare0_scratch_v6): Likewise. ++ (*mulsi3addsi): Likewise. ++ (*mulsi3addsi_v6): Likewise. ++ (*mulsi3addsi_compare0): Likewise. ++ (*mulsi3addsi_compare0_v6): Likewise. ++ (*mulsi3addsi_compare0_scratch): Likewise. ++ (*mulsi3addsi_compare0_scratch_v6): Likewise. ++ (*mulsi3subsi): Likewise. ++ (*mulsidi3adddi): Likewise. ++ (*mulsi3addsi_v6): Likewise. ++ (*mulsidi3adddi_v6): Likewise. ++ (*mulsidi3_nov6): Likewise. ++ (*mulsidi3_v6): Likewise. ++ (*umulsidi3_nov6): Likewise. ++ (*umulsidi3_v6): Likewise. ++ (*umulsidi3adddi): Likewise. ++ (*umulsidi3adddi_v6): Likewise. ++ (*smulsi3_highpart_nov6): Likewise. ++ (*smulsi3_highpart_v6): Likewise. ++ (*umulsi3_highpart_nov6): Likewise. ++ (*umulsi3_highpart_v6): Likewise. ++ (mulhisi3): Likewise. ++ (*mulhisi3tb): Likewise. ++ (*mulhisi3bt): Likewise. ++ (*mulhisi3tt): Likewise. ++ (maddhisi4): Likewise. ++ (*maddhisi4tb): Likewise. ++ (*maddhisi4tt): Likewise. ++ (maddhidi4): Likewise. ++ (*maddhidi4tb): Likewise. ++ (*maddhidi4tt): Likewise. ++ (divsi3): Likewise. ++ (udivsi3): Likewise. ++ * config/arm/thumb2.md (thumb2_mulsi_short): Update attributes. ++ (thumb2_mulsi_short_compare0): Likewise. ++ (thumb2_mulsi_short_compare0_scratch): Likewise. ++ * config/arm/arm1020e.md (1020mult1): Update attribute change. ++ (1020mult2): Likewise. ++ (1020mult3): Likewise. ++ (1020mult4): Likewise. ++ (1020mult5): Likewise. ++ (1020mult6): Likewise. ++ * config/arm/cortex-a15.md (cortex_a15_mult32): Update attribute change. ++ (cortex_a15_mult64): Likewise. ++ (cortex_a15_sdiv): Likewise. ++ (cortex_a15_udiv): Likewise. ++ * config/arm/arm1026ejs.md (mult1): Update attribute change. ++ (mult2): Likewise. ++ (mult3): Likewise. ++ (mult4): Likewise. ++ (mult5): Likewise. ++ (mult6): Likewise. ++ * config/arm/marvell-pj4.md (pj4_ir_mul): Update attribute change. ++ (pj4_ir_div): Likewise. ++ * config/arm/arm1136jfs.md (11_mult1): Update attribute change. ++ (11_mult2): Likewise. ++ (11_mult3): Likewise. ++ (11_mult4): Likewise. ++ (11_mult5): Likewise. ++ (11_mult6): Likewise. ++ (11_mult7): Likewise. ++ * config/arm/cortex-a8.md (cortex_a8_mul): Update attribute change. ++ (cortex_a8_mla): Likewise. ++ (cortex_a8_mull): Likewise. ++ (cortex_a8_smulwy): Likewise. ++ (cortex_a8_smlald): Likewise. ++ * config/arm/cortex-m4.md (cortex_m4_alu): Update attribute change. ++ * config/arm/cortex-r4.md (cortex_r4_mul_4): Update attribute change. ++ (cortex_r4_mul_3): Likewise. ++ (cortex_r4_mla_4): Likewise. ++ (cortex_r4_mla_3): Likewise. ++ (cortex_r4_smlald): Likewise. ++ (cortex_r4_mull): Likewise. ++ (cortex_r4_sdiv): Likewise. ++ (cortex_r4_udiv): Likewise. ++ * config/arm/cortex-a7.md (cortex_a7_mul): Update attribute change. ++ (cortex_a7_idiv): Likewise. ++ * config/arm/arm926ejs.md (9_mult1): Update attribute change. ++ (9_mult2): Likewise. ++ (9_mult3): Likewise. ++ (9_mult4): Likewise. ++ (9_mult5): Likewise. ++ (9_mult6): Likewise. ++ * config/arm/cortex-a53.md (cortex_a53_mul): Update attribute change. ++ (cortex_a53_sdiv): Likewise. ++ (cortex_a53_udiv): Likewise. ++ * config/arm/fa726te.md (726te_mult_op): Update attribute change. ++ * config/arm/fmp626.md (mp626_mult1): Update attribute change. ++ (mp626_mult2): Likewise. ++ (mp626_mult3): Likewise. ++ (mp626_mult4): Likewise. ++ * config/arm/fa526.md (526_mult1): Update attribute change. ++ (526_mult2): Likewise. ++ * config/arm/arm-generic.md (mult): Update attribute change. ++ (mult_ldsched_strongarm): Likewise. ++ (mult_ldsched): Likewise. ++ (multi_cycle): Likewise. ++ * config/arm/cortex-a5.md (cortex_a5_mul): Update attribute change. ++ * config/arm/fa606te.md (606te_mult1): Update attribute change. ++ (606te_mult2): Likewise. ++ (606te_mult3): Likewise. ++ (606te_mult4): Likewise. ++ * config/arm/cortex-a9.md (cortex_a9_mult16): Update attribute change. ++ (cortex_a9_mac16): Likewise. ++ (cortex_a9_multiply): Likewise. ++ (cortex_a9_mac): Likewise. ++ (cortex_a9_multiply_long): Likewise. ++ * config/arm/fa626te.md (626te_mult1): Update attribute change. ++ (626te_mult2): Likewise. ++ (626te_mult3): Likewise. ++ (626te_mult4): Likewise. ++ ++ 2013-06-19 Sofiane Naci ++ ++ * config/arm/vfp.md: Move VFP instruction classification documentation ++ to ... ++ * config/arm/arm.md: ... here. Update instruction classification ++ documentation. ++ ++ 2013-06-28 Kyrylo Tkachov ++ ++ * config/arm/predicates.md (arm_cond_move_operator): New predicate. ++ * config/arm/arm.md (movsfcc): Use arm_cond_move_operator predicate. ++ (movdfcc): Likewise. ++ * config/arm/vfp.md (*thumb2_movsf_vfp): ++ Disable predication for arm_restrict_it. ++ (*thumb2_movsfcc_vfp): Disable for arm_restrict_it. ++ (*thumb2_movdfcc_vfp): Likewise. ++ (*abssf2_vfp, *absdf2_vfp, *negsf2_vfp, *negdf2_vfp,*addsf3_vfp, ++ *adddf3_vfp, *subsf3_vfp, *subdf3_vfpc, *divsf3_vfp,*divdf3_vfp, ++ *mulsf3_vfp, *muldf3_vfp, *mulsf3negsf_vfp, *muldf3negdf_vfp, ++ *mulsf3addsf_vfp, *muldf3adddf_vfp, *mulsf3subsf_vfp, ++ *muldf3subdf_vfp, *mulsf3negsfaddsf_vfp, *fmuldf3negdfadddf_vfp, ++ *mulsf3negsfsubsf_vfp, *muldf3negdfsubdf_vfp, *fma4, ++ *fmsub4, *fnmsub4, *fnmadd4, ++ *extendsfdf2_vfp, *truncdfsf2_vfp, *extendhfsf2, *truncsfhf2, ++ *truncsisf2_vfp, *truncsidf2_vfp, fixuns_truncsfsi2, fixuns_truncdfsi2, ++ *floatsisf2_vfp, *floatsidf2_vfp, floatunssisf2, floatunssidf2, ++ *sqrtsf2_vfp, *sqrtdf2_vfp, *cmpsf_vfp, *cmpsf_trap_vfp, *cmpdf_vfp, ++ *cmpdf_trap_vfp, 2): ++ Disable predication for arm_restrict_it. ++ ++ 2013-06-28 Kyrylo Tkachov ++ ++ * config/arm/arm.md (arm_mulsi3_v6): Add alternative for 16-bit ++ encoding. ++ (mulsi3addsi_v6): Disable predicable variant for arm_restrict_it. ++ (mulsi3subsi): Likewise. ++ (mulsidi3adddi): Likewise. ++ (mulsidi3_v6): Likewise. ++ (umulsidi3_v6): Likewise. ++ (umulsidi3adddi_v6): Likewise. ++ (smulsi3_highpart_v6): Likewise. ++ (umulsi3_highpart_v6): Likewise. ++ (mulhisi3tb): Likewise. ++ (mulhisi3bt): Likewise. ++ (mulhisi3tt): Likewise. ++ (maddhisi4): Likewise. ++ (maddhisi4tb): Likewise. ++ (maddhisi4tt): Likewise. ++ (maddhidi4): Likewise. ++ (maddhidi4tb): Likewise. ++ (maddhidi4tt): Likewise. ++ (zeroextractsi_compare0_scratch): Likewise. ++ (insv_zero): Likewise. ++ (insv_t2): Likewise. ++ (anddi_notzesidi_di): Likewise. ++ (anddi_notsesidi_di): Likewise. ++ (andsi_notsi_si): Likewise. ++ (iordi_zesidi_di): Likewise. ++ (xordi_zesidi_di): Likewise. ++ (andsi_iorsi3_notsi): Likewise. ++ (smax_0): Likewise. ++ (smax_m1): Likewise. ++ (smin_0): Likewise. ++ (not_shiftsi): Likewise. ++ (unaligned_loadsi): Likewise. ++ (unaligned_loadhis): Likewise. ++ (unaligned_loadhiu): Likewise. ++ (unaligned_storesi): Likewise. ++ (unaligned_storehi): Likewise. ++ (extv_reg): Likewise. ++ (extzv_t2): Likewise. ++ (divsi3): Likewise. ++ (udivsi3): Likewise. ++ (arm_zero_extendhisi2addsi): Likewise. ++ (arm_zero_extendqisi2addsi): Likewise. ++ (compareqi_eq0): Likewise. ++ (arm_extendhisi2_v6): Likewise. ++ (arm_extendqisi2addsi): Likewise. ++ (arm_movt): Likewise. ++ (thumb2_ldrd): Likewise. ++ (thumb2_ldrd_base): Likewise. ++ (thumb2_ldrd_base_neg): Likewise. ++ (thumb2_strd): Likewise. ++ (thumb2_strd_base): Likewise. ++ (thumb2_strd_base_neg): Likewise. ++ (arm_negsi2): Add alternative for 16-bit encoding. ++ (arm_one_cmplsi2): Likewise. ++ ++ 2013-06-28 Kyrylo Tkachov ++ ++ * config/arm/constraints.md (Ts): New constraint. ++ * config/arm/arm.md (arm_movqi_insn): Add alternatives for ++ 16-bit encodings. ++ (compare_scc): Use "Ts" constraint for operand 0. ++ (ior_scc_scc): Likewise. ++ (and_scc_scc): Likewise. ++ (and_scc_scc_nodom): Likewise. ++ (ior_scc_scc_cmp): Likewise for operand 7. ++ (and_scc_scc_cmp): Likewise. ++ * config/arm/thumb2.md (thumb2_movsi_insn): ++ Add alternatives for 16-bit encodings. ++ (thumb2_movhi_insn): Likewise. ++ (thumb2_movsicc_insn): Likewise. ++ (thumb2_and_scc): Take 'and' outside cond_exec. Use "Ts" constraint. ++ (thumb2_negscc): Use "Ts" constraint. ++ Move mvn instruction outside cond_exec block. ++ * config/arm/vfp.md (thumb2_movsi_vfp): Add alternatives ++ for 16-bit encodings. ++ ++ 2013-07-01 Sofiane Naci ++ ++ * arm.md (attribute "wtype"): Delete. Move attribute values from here ++ to ... ++ (attribute "type"): ... here, and prefix with "wmmx_". ++ (attribute "core_cycles"): Update for attribute changes. ++ * iwmmxt.md (tbcstv8qi): Update for attribute changes. ++ (tbcstv4hi): Likewise. ++ (tbcstv2si): Likewise. ++ (iwmmxt_iordi3): Likewise. ++ (iwmmxt_xordi3): Likewise. ++ (iwmmxt_anddi3): Likewise. ++ (iwmmxt_nanddi3): Likewise. ++ (iwmmxt_arm_movdi): Likewise. ++ (iwmmxt_movsi_insn): Likewise. ++ (mov_internal): Likewise. ++ (and3_iwmmxt): Likewise. ++ (ior3_iwmmxt): Likewise. ++ (xor3_iwmmxt): Likewise. ++ (add3_iwmmxt): Likewise. ++ (ssaddv8qi3): Likewise. ++ (ssaddv4hi3): Likewise. ++ (ssaddv2si3): Likewise. ++ (usaddv8qi3): Likewise. ++ (usaddv4hi3): Likewise. ++ (usaddv2si3): Likewise. ++ (sub3_iwmmxt): Likewise. ++ (sssubv8qi3): Likewise. ++ (sssubv4hi3): Likewise. ++ (sssubv2si3): Likewise. ++ (ussubv8qi3): Likewise. ++ (ussubv4hi3): Likewise. ++ (ussubv2si3): Likewise. ++ (mulv4hi3_iwmmxt): Likewise. ++ (smulv4hi3_highpart): Likewise. ++ (umulv4hi3_highpart): Likewise. ++ (iwmmxt_wmacs): Likewise. ++ (iwmmxt_wmacsz): Likewise. ++ (iwmmxt_wmacu): Likewise. ++ (iwmmxt_wmacuz): Likewise. ++ (iwmmxt_clrdi): Likewise. ++ (iwmmxt_clrv8qi): Likewise. ++ (iwmmxt_clr4hi): Likewise. ++ (iwmmxt_clr2si): Likewise. ++ (iwmmxt_uavgrndv8qi3): Likewise. ++ (iwmmxt_uavgrndv4hi3): Likewise. ++ (iwmmxt_uavgv8qi3): Likewise. ++ (iwmmxt_uavgv4hi3): Likewise. ++ (iwmmxt_tinsrb): Likewise. ++ (iwmmxt_tinsrh): Likewise. ++ (iwmmxt_tinsrw): Likewise. ++ (iwmmxt_textrmub): Likewise. ++ (iwmmxt_textrmsb): Likewise. ++ (iwmmxt_textrmuh): Likewise. ++ (iwmmxt_textrmsh): Likewise. ++ (iwmmxt_textrmw): Likewise. ++ (iwmxxt_wshufh): Likewise. ++ (eqv8qi3): Likewise. ++ (eqv4hi3): Likewise. ++ (eqv2si3): Likewise. ++ (gtuv8qi3): Likewise. ++ (gtuv4hi3): Likewise. ++ (gtuv2si3): Likewise. ++ (gtv8qi3): Likewise. ++ (gtv4hi3): Likewise. ++ (gtv2si3): Likewise. ++ (smax3_iwmmxt): Likewise. ++ (umax3_iwmmxt): Likewise. ++ (smin3_iwmmxt): Likewise. ++ (umin3_iwmmxt): Likewise. ++ (iwmmxt_wpackhss): Likewise. ++ (iwmmxt_wpackwss): Likewise. ++ (iwmmxt_wpackdss): Likewise. ++ (iwmmxt_wpackhus): Likewise. ++ (iwmmxt_wpackwus): Likewise. ++ (iwmmxt_wpackdus): Likewise. ++ (iwmmxt_wunpckihb): Likewise. ++ (iwmmxt_wunpckihh): Likewise. ++ (iwmmxt_wunpckihw): Likewise. ++ (iwmmxt_wunpckilb): Likewise. ++ (iwmmxt_wunpckilh): Likewise. ++ (iwmmxt_wunpckilw): Likewise. ++ (iwmmxt_wunpckehub): Likewise. ++ (iwmmxt_wunpckehuh): Likewise. ++ (iwmmxt_wunpckehuw): Likewise. ++ (iwmmxt_wunpckehsb): Likewise. ++ (iwmmxt_wunpckehsh): Likewise. ++ (iwmmxt_wunpckehsw): Likewise. ++ (iwmmxt_wunpckelub): Likewise. ++ (iwmmxt_wunpckeluh): Likewise. ++ (iwmmxt_wunpckeluw): Likewise. ++ (iwmmxt_wunpckelsb): Likewise. ++ (iwmmxt_wunpckelsh): Likewise. ++ (iwmmxt_wunpckelsw): Likewise. ++ (ror3): Likewise. ++ (ashr3_iwmmxt): Likewise. ++ (lshr3_iwmmxt): Likewise. ++ (ashl3_iwmmxt): Likewise. ++ (ror3_di): Likewise. ++ (ashr3_di): Likewise. ++ (lshr3_di): Likewise. ++ (ashl3_di): Likewise. ++ (iwmmxt_wmadds): Likewise. ++ (iwmmxt_wmaddu): Likewise. ++ (iwmmxt_tmia): Likewise. ++ (iwmmxt_tmiaph): Likewise. ++ (iwmmxt_tmiabb): Likewise. ++ (iwmmxt_tmiatb): Likewise. ++ (iwmmxt_tmiabt): Likewise. ++ (iwmmxt_tmiatt): Likewise. ++ (iwmmxt_tmovmskb): Likewise. ++ (iwmmxt_tmovmskh): Likewise. ++ (iwmmxt_tmovmskw): Likewise. ++ (iwmmxt_waccb): Likewise. ++ (iwmmxt_wacch): Likewise. ++ (iwmmxt_waccw): Likewise. ++ (iwmmxt_waligni): Likewise. ++ (iwmmxt_walignr): Likewise. ++ (iwmmxt_walignr0): Likewise. ++ (iwmmxt_walignr1): Likewise. ++ (iwmmxt_walignr2): Likewise. ++ (iwmmxt_walignr3): Likewise. ++ (iwmmxt_wsadb): Likewise. ++ (iwmmxt_wsadh): Likewise. ++ (iwmmxt_wsadbz): Likewise. ++ (iwmmxt_wsadhz): Likewise. ++ * iwmmxt2.md (iwmmxt_wabs3): Update for attribute changes. ++ (iwmmxt_wabsdiffb): Likewise. ++ (iwmmxt_wabsdiffh): Likewise. ++ (iwmmxt_wabsdiffw): Likewise. ++ (iwmmxt_waddsubhx): Likewise ++ (iwmmxt_wsubaddhx): Likewise. ++ (addc3): Likewise. ++ (iwmmxt_avg4): Likewise. ++ (iwmmxt_avg4r): Likewise. ++ (iwmmxt_wmaddsx): Likewise. ++ (iwmmxt_wmaddux): Likewise. ++ (iwmmxt_wmaddsn): Likewise. ++ (iwmmxt_wmaddun): Likewise. ++ (iwmmxt_wmulwsm): Likewise. ++ (iwmmxt_wmulwum): Likewise. ++ (iwmmxt_wmulsmr): Likewise. ++ (iwmmxt_wmulumr): Likewise. ++ (iwmmxt_wmulwsmr): Likewise. ++ (iwmmxt_wmulwumr): Likewise. ++ (iwmmxt_wmulwl): Likewise. ++ (iwmmxt_wqmulm): Likewise. ++ (iwmmxt_wqmulwm): Likewise. ++ (iwmmxt_wqmulmr): Likewise. ++ (iwmmxt_wqmulwmr): Likewise. ++ (iwmmxt_waddbhusm): Likewise. ++ (iwmmxt_waddbhusl): Likewise. ++ (iwmmxt_wqmiabb): Likewise. ++ (iwmmxt_wqmiabt): Likewise. ++ (iwmmxt_wqmiatb): Likewise. ++ (iwmmxt_wqmiatt): Likewise. ++ (iwmmxt_wqmiabbn): Likewise. ++ (iwmmxt_wqmiabtn): Likewise. ++ (iwmmxt_wqmiatbn): Likewise. ++ (iwmmxt_wqmiattn): Likewise. ++ (iwmmxt_wmiabb): Likewise. ++ (iwmmxt_wmiabt): Likewise. ++ (iwmmxt_wmiatb): Likewise. ++ (iwmmxt_wmiatt): Likewise. ++ (iwmmxt_wmiabbn): Likewise. ++ (iwmmxt_wmiabtn): Likewise. ++ (iwmmxt_wmiatbn): Likewise. ++ (iwmmxt_wmiattn): Likewise. ++ (iwmmxt_wmiawbb): Likewise. ++ (iwmmxt_wmiawbt): Likewise. ++ (iwmmxt_wmiawtb): Likewise. ++ (iwmmxt_wmiawtt): Likewise. ++ (iwmmxt_wmiawbbn): Likewise. ++ (iwmmxt_wmiawbtn): Likewise. ++ (iwmmxt_wmiawtbn): Likewise. ++ (iwmmxt_wmiawttn): Likewise. ++ (iwmmxt_wmerge): Likewise. ++ (iwmmxt_tandc3): Likewise. ++ (iwmmxt_torc3): Likewise. ++ (iwmmxt_torvsc3): Likewise. ++ (iwmmxt_textrc3): Likewise. ++ * marvell-f-iwmmxt.md (wmmxt_shift): Update for attribute changes. ++ (wmmxt_pack): Likewise. ++ (wmmxt_mult_c1): Likewise. ++ (wmmxt_mult_c2): Likewise. ++ (wmmxt_alu_c1): Likewise. ++ (wmmxt_alu_c2): Likewise. ++ (wmmxt_alu_c3): Likewise. ++ (wmmxt_transfer_c1): Likewise. ++ (wmmxt_transfer_c2): Likewise. ++ (wmmxt_transfer_c3): Likewise. ++ (marvell_f_iwmmxt_wstr): Likewise. ++ (marvell_f_iwmmxt_wldr): Likewise. ++ ++2013-08-07 Christophe Lyon ++ ++ Backport from trunk r201237. ++ 2013-07-25 Terry Guo ++ ++ * config/arm/arm.c (thumb1_size_rtx_costs): Assign proper cost for ++ shift_add/shift_sub0/shift_sub1 RTXs. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r200596,201067,201083. ++ 2013-07-02 Ian Bolton ++ ++ * config/aarch64/aarch64-simd.md (absdi2): Support abs for ++ DI mode. ++ ++ 2013-07-19 Ian Bolton ++ ++ * config/aarch64/arm_neon.h (vabs_s64): New function ++ ++ 2013-07-20 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_fold_builtin): Fold abs in all modes. ++ * config/aarch64/aarch64-simd-builtins.def ++ (abs): Enable for all modes. ++ * config/aarch64/arm_neon.h ++ (vabs_s<8,16,32,64): Rewrite using builtins. ++ (vabs_f64): Add missing intrinsic. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r198735,198831,199959. ++ 2013-05-09 Sofiane Naci ++ ++ * config/aarch64/aarch64.md: New movtf split. ++ (*movtf_aarch64): Update. ++ (aarch64_movdi_tilow): Handle TF modes and rename to ++ aarch64_movdi_low. ++ (aarch64_movdi_tihigh): Handle TF modes and rename to ++ aarch64_movdi_high ++ (aarch64_movtihigh_di): Handle TF modes and rename to ++ aarch64_movhigh_di ++ (aarch64_movtilow_di): Handle TF modes and rename to ++ aarch64_movlow_di ++ (aarch64_movtilow_tilow): Remove spurious whitespace. ++ * config/aarch64/aarch64.c (aarch64_split_128bit_move): Handle TFmode ++ splits. ++ (aarch64_print_operand): Update. ++ ++ 2013-05-13 Sofiane Naci ++ ++ * config/aarch64/aarch64-simd.md (aarch64_simd_mov): Group ++ similar switch cases. ++ (aarch64_simd_mov): Rename to aarch64_split_simd_mov. Update. ++ (aarch64_simd_mov_to_low): Delete. ++ (aarch64_simd_mov_to_high): Delete. ++ (move_lo_quad_): Add w<-r alternative. ++ (aarch64_simd_move_hi_quad_): Likewise. ++ (aarch64_simd_mov_from_*): Update type attribute. ++ * config/aarch64/aarch64.c (aarch64_split_simd_move): Refacror switch ++ statement. ++ ++ 2013-06-11 Sofiane Naci ++ ++ * config/aarch64/aarch64-simd.md (move_lo_quad_): Update. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r199438,199439,201326. ++ ++ 2013-05-30 Zhenqiang Chen ++ ++ * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added. ++ (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes. ++ (arm_emit_vfp_multi_reg_pop): Likewise. ++ (thumb2_emit_ldrd_pop): Likewise. ++ (arm_expand_epilogue): Add misc REG_CFA notes. ++ (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE. ++ ++ 2013-05-30 Bernd Schmidt ++ Zhenqiang Chen ++ ++ * config/arm/arm-protos.h: Add and update function protos. ++ * config/arm/arm.c (use_simple_return_p): New added. ++ (thumb2_expand_return): Check simple_return flag. ++ * config/arm/arm.md: Add simple_return and conditional simple_return. ++ * config/arm/iterators.md: Add iterator for return and simple_return. ++ ++ 2013-07-30 Zhenqiang Chen ++ ++ PR rtl-optimization/57637 ++ * function.c (move_insn_for_shrink_wrap): Also check the ++ GEN set of the LIVE problem for the liveness analysis ++ if it exists, otherwise give up. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r198928,198973,199203,201240,201241,201307. ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/predicates.md (call_insn_operand): New predicate. ++ * config/arm/constraints.md ("Cs", "Ss"): New constraints. ++ * config/arm/arm.md (*call_insn, *call_value_insn): Match only ++ if insn is not a tail call. ++ (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through ++ registers. ++ * config/arm/arm.h (enum reg_class): New caller save register class. ++ (REG_CLASS_NAMES): Likewise. ++ (REG_CLASS_CONTENTS): Likewise. ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling ++ without decls. ++ ++ 2013-05-16 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check ++ for NULL decl. ++ ++ 2013-05-22 Ramana Radhakrishnan ++ ++ PR target/19599 ++ PR target/57340 ++ * config/arm/arm.c (any_sibcall_uses_r3): Rename to .. ++ (any_sibcall_could_use_r3): this and handle indirect calls. ++ (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3. ++ ++ 2013-07-25 Ramana Radhakrishnan ++ ++ PR target/19599 ++ PR target/57731 ++ PR target/57748 ++ * config/arm/arm.md ("*sibcall_value_insn): Replace use of ++ Ss with US. Adjust output for v5 and v4t. ++ (*sibcall_value_insn): Likewise and loosen predicate on ++ operand0. ++ * config/arm/constraints.md ("Ss"): Rename to US. ++ ++ 2013-07-25 Ramana Radhakrishnan ++ ++ * config/arm/arm.md (*sibcall_insn): Remove unnecessary space. ++ ++ 2013-07-29 Ramana Radhakrishnan ++ Fix incorrect changelog entry. ++ ++ Replace ++ PR target/57748 ++ with ++ PR target/57837 ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200922. ++ 2013-07-12 Tejas Belagod ++ ++ * config/aarch64/aarch64-protos.h ++ (aarch64_simd_immediate_valid_for_move): Remove. ++ * config/aarch64/aarch64.c (simd_immediate_info): New member. ++ (aarch64_simd_valid_immediate): Recognize idioms for shifting ones ++ cases. ++ (aarch64_output_simd_mov_immediate): Print the correct shift specifier. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200670. ++ 2013-07-04 Tejas Belagod ++ ++ * config/aarch64/aarch64-protos.h (cpu_vector_cost): New. ++ (tune_params): New member 'const vec_costs'. ++ * config/aarch64/aarch64.c (generic_vector_cost): New. ++ (generic_tunings): New member 'generic_vector_cost'. ++ (aarch64_builtin_vectorization_cost): New. ++ (aarch64_add_stmt_cost): New. ++ (TARGET_VECTORIZE_ADD_STMT_COST): New. ++ (TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): New. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200637. ++ 2013-07-03 Yufeng Zhang ++ ++ * config/aarch64/aarch64.h (enum arm_abi_type): Remove. ++ (ARM_ABI_AAPCS64): Ditto. ++ (arm_abi): Ditto. ++ (ARM_DEFAULT_ABI): Ditto. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200532, r200565. ++ 2013-06-28 Marcus Shawcroft ++ ++ * config/aarch64/aarch64.c (aarch64_cannot_force_const_mem): Adjust ++ layout. ++ ++ 2013-06-29 Yufeng Zhang ++ ++ * config/aarch64/aarch64.c: Remove junk from the beginning of the ++ file. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200531. ++ 2013-06-28 Marcus Shawcroft ++ ++ * config/aarch64/aarch64-protos.h (aarch64_symbol_type): ++ Update comment w.r.t SYMBOL_TINY_ABSOLUTE. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200519. ++ 2013-06-28 Marcus Shawcroft ++ ++ * config/aarch64/aarch64-protos.h ++ aarch64_classify_symbol_expression): Define. ++ (aarch64_symbolic_constant_p): Remove. ++ * config/aarch64/aarch64.c (aarch64_classify_symbol_expression): Remove ++ static. Fix line length and white space. ++ (aarch64_symbolic_constant_p): Remove. ++ * config/aarch64/predicates.md (aarch64_valid_symref): ++ Use aarch64_classify_symbol_expression. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200466, r200467. ++ 2013-06-27 Yufeng Zhang ++ ++ * config/aarch64/aarch64.c (aarch64_force_temporary): Add an extra ++ parameter 'mode' of type 'enum machine_mode mode'; change to pass ++ 'mode' to force_reg. ++ (aarch64_add_offset): Update calls to aarch64_force_temporary. ++ (aarch64_expand_mov_immediate): Likewise. ++ ++ 2013-06-27 Yufeng Zhang ++ ++ * config/aarch64/aarch64.c (aarch64_add_offset): Change to pass ++ 'mode' to aarch64_plus_immediate and gen_rtx_PLUS. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200419. ++ 2013-06-26 Greta Yorsh ++ ++ * config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro. ++ * config/arm/arm-protos.h (arm_max_conditional_execute): New ++ declaration. ++ (tune_params): Update comment. ++ * config/arm/arm.c (arm_cortex_a15_tune): Set max_cond_insns to 2. ++ (arm_max_conditional_execute): New function. ++ (thumb2_final_prescan_insn): Use max_insn_skipped and ++ MAX_INSN_PER_IT_BLOCK to compute maximum instructions in a block. ++ ++2013-07-24 Matthew Gretton-Dann ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ * LINARO-VERSION: Update. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ Backport from trunk r201005. ++ 2013-07-17 Yvan Roux ++ ++ PR target/57909 ++ * config/arm/arm.c (gen_movmem_ldrd_strd): Fix unaligned load/store ++ usage in HI mode. ++ ++2013-07-09 Christophe Lyon ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ * LINARO-VERSION: Update. ++ ++2013-07-03 Christophe Lyon ++ ++ Revert backport from trunk r198928,198973,199203. ++ 2013-05-22 Ramana Radhakrishnan ++ ++ PR target/19599 ++ PR target/57340 ++ * config/arm/arm.c (any_sibcall_uses_r3): Rename to .. ++ (any_sibcall_could_use_r3): this and handle indirect calls. ++ (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3. ++ ++ 2013-05-16 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check ++ for NULL decl. ++ ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/predicates.md (call_insn_operand): New predicate. ++ * config/arm/constraints.md ("Cs", "Ss"): New constraints. ++ * config/arm/arm.md (*call_insn, *call_value_insn): Match only ++ if insn is not a tail call. ++ (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through ++ registers. ++ * config/arm/arm.h (enum reg_class): New caller save register class. ++ (REG_CLASS_NAMES): Likewise. ++ (REG_CLASS_CONTENTS): Likewise. ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling ++ without decls. ++ ++2013-07-03 Christophe Lyon ++ ++ Revert backport from mainline (r199438, r199439) ++ 2013-05-30 Zhenqiang Chen ++ ++ * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added. ++ (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes. ++ (arm_emit_vfp_multi_reg_pop): Likewise. ++ (thumb2_emit_ldrd_pop): Likewise. ++ (arm_expand_epilogue): Add misc REG_CFA notes. ++ (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE. ++ ++ 2013-05-30 Bernd Schmidt ++ Zhenqiang Chen ++ ++ * config/arm/arm-protos.h: Add and update function protos. ++ * config/arm/arm.c (use_simple_return_p): New added. ++ (thumb2_expand_return): Check simple_return flag. ++ * config/arm/arm.md: Add simple_return and conditional simple_return. ++ * config/arm/iterators.md: Add iterator for return and simple_return. ++ * gcc.dg/shrink-wrap-alloca.c: New added. ++ * gcc.dg/shrink-wrap-pretend.c: New added. ++ * gcc.dg/shrink-wrap-sibcall.c: New added. ++ ++2013-07-03 Christophe Lyon ++ ++ Backport from trunk r199640, 199705, 199733, 199734, 199739. ++ 2013-06-04 Kyrylo Tkachov ++ ++ * rtl.def: Add extra fourth optional field to define_cond_exec. ++ * gensupport.c (process_one_cond_exec): Process attributes from ++ define_cond_exec. ++ * doc/md.texi: Document fourth field in define_cond_exec. ++ ++ 2013-06-05 Kyrylo Tkachov ++ ++ * config/arm/arm.md (enabled_for_depr_it): New attribute. ++ (predicable_short_it): Likewise. ++ (predicated): Likewise. ++ (enabled): Handle above. ++ (define_cond_exec): Set predicated attribute to yes. ++ ++ 2013-06-06 Kyrylo Tkachov ++ ++ * config/arm/sync.md (atomic_loaddi_1): ++ Disable predication for arm_restrict_it. ++ (arm_load_exclusive): Likewise. ++ (arm_load_exclusivesi): Likewise. ++ (arm_load_exclusivedi): Likewise. ++ (arm_load_acquire_exclusive): Likewise. ++ (arm_load_acquire_exclusivesi): Likewise. ++ (arm_load_acquire_exclusivedi): Likewise. ++ (arm_store_exclusive): Likewise. ++ (arm_store_exclusive): Likewise. ++ (arm_store_release_exclusivedi): Likewise. ++ (arm_store_release_exclusive): Likewise. ++ ++ 2013-06-06 Kyrylo Tkachov ++ ++ * config/arm/arm-ldmstm.ml: Set "predicable_short_it" to "no" ++ where appropriate. ++ * config/arm/ldmstm.md: Regenerate. ++ ++ 2013-06-06 Kyrylo Tkachov ++ ++ * config/arm/arm-fixed.md (add3,usadd3,ssadd3, ++ sub3, ussub3, sssub3, arm_ssatsihi_shift, ++ arm_usatsihi): Adjust alternatives for arm_restrict_it. ++ ++2013-07-02 Rob Savoye ++ ++ Backport from trunk 200096 ++ ++ 2013-06-14 Vidya Praveen ++ ++ * config/aarch64/aarch64-simd.md (aarch64_mlal_lo): ++ New pattern. ++ (aarch64_mlal_hi, aarch64_mlsl_lo): Likewise. ++ (aarch64_mlsl_hi, aarch64_mlal): Likewise. ++ (aarch64_mlsl): Likewise. ++ ++2013-07-02 Rob Savoye ++ ++ Backport from trunk 200062 ++ ++ 2013-06-13 Bin Cheng ++ * fold-const.c (operand_equal_p): Consider NOP_EXPR and ++ CONVERT_EXPR as equal nodes. ++ ++2013-07-02 Rob Savoye ++ Backport from trunk 199810 ++ ++ 2013-06-07 Kyrylo Tkachov ++ ++ * config/arm/arm.md (anddi3_insn): Remove duplicate alternatives. ++ Clean up alternatives. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 200152 ++ 2013-06-17 Sofiane Naci ++ ++ * config/aarch64/aarch64-simd.md (aarch64_dup_lane): Add r<-w ++ alternative and update. ++ (aarch64_dup_lanedi): Delete. ++ * config/aarch64/arm_neon.h (vdup_lane_*): Update. ++ * config/aarch64/aarch64-simd-builtins.def: Update. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 200061 ++ 2013-06-13 Bin Cheng ++ ++ * rtlanal.c (noop_move_p): Check the code to be executed for ++ COND_EXEC. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 199694 ++ 2013-06-05 Kyrylo Tkachov ++ ++ * config/arm/arm.c (MAX_INSN_PER_IT_BLOCK): New macro. ++ (arm_option_override): Override arm_restrict_it where appropriate. ++ (thumb2_final_prescan_insn): Use MAX_INSN_PER_IT_BLOCK. ++ * config/arm/arm.opt (mrestrict-it): New command-line option. ++ * doc/invoke.texi: Document -mrestrict-it. ++ ++2013-06-20 Christophe Lyon ++ ++ Backport from trunk r198683. ++ 2013-05-07 Christophe Lyon ++ ++ * config/arm/arm.c (arm_asan_shadow_offset): New function. ++ (TARGET_ASAN_SHADOW_OFFSET): Define. ++ * config/arm/linux-eabi.h (ASAN_CC1_SPEC): Define. ++ (LINUX_OR_ANDROID_CC): Add ASAN_CC1_SPEC. ++ ++2013-06-18 Rob Savoye ++ ++ * LINARO-VERSION: Bump version. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ * LINARO-VERSION: Update. ++ ++2013-06-06 Zhenqiang Chen ++ ++ Backport from mainline (r199438, r199439) ++ 2013-05-30 Zhenqiang Chen ++ ++ * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added. ++ (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes. ++ (arm_emit_vfp_multi_reg_pop): Likewise. ++ (thumb2_emit_ldrd_pop): Likewise. ++ (arm_expand_epilogue): Add misc REG_CFA notes. ++ (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE. ++ ++ 2013-05-30 Bernd Schmidt ++ Zhenqiang Chen ++ ++ * config/arm/arm-protos.h: Add and update function protos. ++ * config/arm/arm.c (use_simple_return_p): New added. ++ (thumb2_expand_return): Check simple_return flag. ++ * config/arm/arm.md: Add simple_return and conditional simple_return. ++ * config/arm/iterators.md: Add iterator for return and simple_return. ++ * gcc.dg/shrink-wrap-alloca.c: New added. ++ * gcc.dg/shrink-wrap-pretend.c: New added. ++ * gcc.dg/shrink-wrap-sibcall.c: New added. ++ ++2013-06-06 Kugan Vivekanandarajah ++ ++ Backport from mainline r198879: ++ ++ 2013-05-14 Chung-Lin Tang ++ PR target/42017 ++ * config/arm/arm.h (EPILOGUE_USES): Only return true ++ for LR_REGNUM after epilogue_completed. ++ ++2013-06-05 Christophe Lyon ++ ++ Backport from trunk r199652,199653,199656,199657,199658. ++ ++ 2013-06-04 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*mov_aarch64): Call ++ into function to generate MOVI instruction. ++ * config/aarch64/aarch64.c (aarch64_simd_container_mode): ++ New function. ++ (aarch64_preferred_simd_mode): Turn into wrapper. ++ (aarch64_output_scalar_simd_mov_immediate): New function. ++ * config/aarch64/aarch64-protos.h: Add prototype for above. ++ ++ 2013-06-04 Ian Bolton ++ ++ * config/aarch64/aarch64.c (simd_immediate_info): Remove ++ element_char member. ++ (sizetochar): Return signed char. ++ (aarch64_simd_valid_immediate): Remove elchar and other ++ unnecessary variables. ++ (aarch64_output_simd_mov_immediate): Take rtx instead of &rtx. ++ Calculate element_char as required. ++ * config/aarch64/aarch64-protos.h: Update and move prototype ++ for aarch64_output_simd_mov_immediate. ++ * config/aarch64/aarch64-simd.md (*aarch64_simd_mov): ++ Update arguments. ++ ++ 2013-06-04 Ian Bolton ++ ++ * config/aarch64/aarch64.c (simd_immediate_info): Struct to hold ++ information completed by aarch64_simd_valid_immediate. ++ (aarch64_legitimate_constant_p): Update arguments. ++ (aarch64_simd_valid_immediate): Work with struct rather than many ++ pointers. ++ (aarch64_simd_scalar_immediate_valid_for_move): Update arguments. ++ (aarch64_simd_make_constant): Update arguments. ++ (aarch64_output_simd_mov_immediate): Work with struct rather than ++ many pointers. Output immediate directly rather than as operand. ++ * config/aarch64/aarch64-protos.h (aarch64_simd_valid_immediate): ++ Update prototype. ++ * config/aarch64/constraints.md (Dn): Update arguments. ++ ++ 2013-06-04 Ian Bolton ++ ++ * config/aarch64/aarch64.c (aarch64_simd_valid_immediate): No ++ longer static. ++ (aarch64_simd_immediate_valid_for_move): Remove. ++ (aarch64_simd_scalar_immediate_valid_for_move): Update call. ++ (aarch64_simd_make_constant): Update call. ++ (aarch64_output_simd_mov_immediate): Update call. ++ * config/aarch64/aarch64-protos.h (aarch64_simd_valid_immediate): ++ Add prototype. ++ * config/aarch64/constraints.md (Dn): Update call. ++ ++ 2013-06-04 Ian Bolton ++ ++ * config/aarch64/aarch64.c (aarch64_simd_valid_immediate): Change ++ return type to bool for prototype. ++ (aarch64_legitimate_constant_p): Check for true instead of not -1. ++ (aarch64_simd_valid_immediate): Fix up each return to return a bool. ++ (aarch64_simd_immediate_valid_for_move): Update retval for bool. ++ ++2013-06-04 Christophe Lyon ++ ++ Backport from trunk r199261. ++ 2013-05-23 Christian Bruel ++ ++ PR debug/57351 ++ * config/arm/arm.c (arm_dwarf_register_span): Do not use dbx number. ++ ++2013-06-03 Christophe Lyon ++ ++ Backport from trunk ++ r198890,199254,199259,199260,199293,199407,199408,199454,199544,199545. ++ ++ 2013-05-31 Marcus Shawcroft ++ ++ * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): ++ Remove un-necessary braces. ++ ++ 2013-05-31 Marcus Shawcroft ++ ++ * config/aarch64/aarch64.c (aarch64_classify_symbol): ++ Use SYMBOL_TINY_ABSOLUTE for AARCH64_CMODEL_TINY_PIC. ++ ++ 2013-05-30 Ian Bolton ++ ++ * config/aarch64/aarch64.md (insv): New define_expand. ++ (*insv_reg): New define_insn. ++ ++ 2012-05-29 Chris Schlumberger-Socha ++ Marcus Shawcroft ++ ++ * config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define ++ SYMBOL_TINY_ABSOLUTE. ++ * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Handle ++ SYMBOL_TINY_ABSOLUTE. ++ (aarch64_expand_mov_immediate): Likewise. ++ (aarch64_classify_symbol): Likewise. ++ (aarch64_mov_operand_p): Remove ATTRIBUTE_UNUSED. ++ Permit SYMBOL_TINY_ABSOLUTE. ++ * config/aarch64/predicates.md (aarch64_mov_operand): Permit CONST. ++ ++ 2013-05-29 Chris Schlumberger-Socha ++ Marcus Shawcroft ++ ++ * config/aarch64/aarch64.c (aarch64_classify_symbol): Remove comment. ++ Refactor if/switch. Replace gcc_assert with if. ++ ++ 2013-05-24 Ian Bolton ++ ++ * config/aarch64/aarch64.c (aarch64_print_operand): Change the ++ X format specifier to only display bottom 16 bits. ++ * config/aarch64/aarch64.md (insv_imm): Allow any size of ++ immediate to match for operand 2, since it will be masked. ++ ++ 2013-05-23 Chris Schlumberger-Socha ++ Marcus Shawcroft ++ ++ * config/aarch64/aarch64.md (*movdi_aarch64): Replace Usa with S. ++ * config/aarch64/constraints.md (Usa): Remove. ++ * doc/md.texi (AArch64 Usa): Remove. ++ ++ 2013-05-23 Chris Schlumberger-Socha ++ Marcus Shawcroft ++ ++ * config/aarch64/aarch64-protos.h (aarch64_mov_operand_p): Define. ++ * config/aarch64/aarch64.c (aarch64_mov_operand_p): Define. ++ * config/aarch64/predicates.md (aarch64_const_address): Remove. ++ (aarch64_mov_operand): Use aarch64_mov_operand_p. ++ ++ 2013-05-23 Vidya Praveen ++ ++ * config/aarch64/aarch64-simd.md (clzv4si2): Support for CLZ ++ instruction (AdvSIMD). ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_builtin_vectorized_function): Handler for BUILT_IN_CLZ. ++ * config/aarch64/aarch-simd-builtins.def: Entry for CLZ. ++ ++ 2013-05-14 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md ++ (aarch64_vcond_internal): Rename to... ++ (aarch64_vcond_internal): ...This, for integer modes. ++ (aarch64_vcond_internal): ...This for ++ float modes. Clarify all iterator modes. ++ (vcond): Use new name for vcond expanders. ++ (vcond): Likewise. ++ (vcondu: Likewise. ++ * config/aarch64/iterators.md (VDQF_COND): New. ++ ++2013-05-29 Christophe Lyon ++ ++ Backport from trunk r198928,198973,199203. ++ 2013-05-22 Ramana Radhakrishnan ++ ++ PR target/19599 ++ PR target/57340 ++ * config/arm/arm.c (any_sibcall_uses_r3): Rename to .. ++ (any_sibcall_could_use_r3): this and handle indirect calls. ++ (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3. ++ ++ 2013-05-16 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check ++ for NULL decl. ++ ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * config/arm/predicates.md (call_insn_operand): New predicate. ++ * config/arm/constraints.md ("Cs", "Ss"): New constraints. ++ * config/arm/arm.md (*call_insn, *call_value_insn): Match only ++ if insn is not a tail call. ++ (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through ++ registers. ++ * config/arm/arm.h (enum reg_class): New caller save register class. ++ (REG_CLASS_NAMES): Likewise. ++ (REG_CLASS_CONTENTS): Likewise. ++ * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling ++ without decls. ++ ++2013-05-28 Christophe Lyon ++ ++ Backport from trunk r198680. ++ 2013-05-07 Sofiane Naci ++ ++ * config/aarch64/aarch64-simd.md (*aarch64_simd_mov): call splitter. ++ (aarch64_simd_mov): New expander. ++ (aarch64_simd_mov_to_low): New instruction pattern. ++ (aarch64_simd_mov_to_high): Likewise. ++ (aarch64_simd_mov_from_low): Likewise. ++ (aarch64_simd_mov_from_high): Likewise. ++ (aarch64_dup_lane): Update. ++ (aarch64_dup_lanedi): New instruction pattern. ++ * config/aarch64/aarch64-protos.h (aarch64_split_simd_move): New prototype. ++ * config/aarch64/aarch64.c (aarch64_split_simd_move): New function. ++ ++2013-05-28 Christophe Lyon ++ ++ Backport from trunk r198497-198500. ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_gimple_fold_builtin.c): Fold more modes for reduc_splus_. ++ * config/aarch64/aarch64-simd-builtins.def ++ (reduc_splus_): Add new modes. ++ (reduc_uplus_): New. ++ * config/aarch64/aarch64-simd.md (aarch64_addvv4sf): Remove. ++ (reduc_uplus_v4sf): Likewise. ++ (reduc_splus_v4sf): Likewise. ++ (aarch64_addv): Likewise. ++ (reduc_uplus_): Likewise. ++ (reduc_splus_): Likewise. ++ (aarch64_addvv2di): Likewise. ++ (reduc_uplus_v2di): Likewise. ++ (reduc_splus_v2di): Likewise. ++ (aarch64_addvv2si): Likewise. ++ (reduc_uplus_v2si): Likewise. ++ (reduc_splus_v2si): Likewise. ++ (reduc_plus_): New. ++ (reduc_plus_v2di): Likewise. ++ (reduc_plus_v2si): Likewise. ++ (reduc_plus_v4sf): Likewise. ++ (aarch64_addpv4sf): Likewise. ++ * config/aarch64/arm_neon.h ++ (vaddv_<8, 16, 32, 64): Rewrite using builtins. ++ * config/aarch64/iterators.md (unspec): Remove UNSPEC_ADDV, ++ add UNSPEC_SADDV, UNSPEC_UADDV. ++ (SUADDV): New. ++ (sur): Add UNSPEC_SADDV, UNSPEC_UADDV. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/arm_neon.h ++ (v_<8, 16, 32, 64>): Rewrite using builtins. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins ++ (aarch64_gimple_fold_builtin): Fold reduc__ builtins. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd-builtins.def ++ (reduc_smax_): New. ++ (reduc_smin_): Likewise. ++ (reduc_umax_): Likewise. ++ (reduc_umin_): Likewise. ++ (reduc_smax_nan_): Likewise. ++ (reduc_smin_nan_): Likewise. ++ (fmax): Remove. ++ (fmin): Likewise. ++ (smax): Update for V2SF, V4SF and V2DF modes. ++ (smin): Likewise. ++ (smax_nan): New. ++ (smin_nan): Likewise. ++ * config/aarch64/aarch64-simd.md (3): Rename to... ++ (3): ...This, refactor. ++ (s3): New. ++ (3): Likewise. ++ (reduc__): Refactor. ++ (reduc__v4sf): Likewise. ++ (reduc__v2si): Likewise. ++ (aarch64_: Remove. ++ * config/aarch64/arm_neon.h (vmax_f<32,64>): Rewrite to use ++ new builtin names. ++ (vmin_f<32,64>): Likewise. ++ * config/iterators.md (unspec): Add UNSPEC_FMAXNMV, UNSPEC_FMINNMV. ++ (FMAXMIN): New. ++ (su): Add mappings for smax, smin, umax, umin. ++ (maxmin): New. ++ (FMAXMINV): Add UNSPEC_FMAXNMV, UNSPEC_FMINNMV. ++ (FMAXMIN): Rename as... ++ (FMAXMIN_UNS): ...This. ++ (maxminv): Remove. ++ (fmaxminv): Likewise. ++ (fmaxmin): Likewise. ++ (maxmin_uns): New. ++ (maxmin_uns_op): Likewise. ++ ++2013-05-28 Christophe Lyon ++ ++ Backport from trunk r199241. ++ 2013-05-23 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md ++ (aarch64_cmdi): Add clobber of CC_REGNUM to unsplit pattern. ++ ++2013-05-23 Christophe Lyon ++ ++ Backport from trunk r198970. ++ 2013-05-16 Greta Yorsh ++ ++ * config/arm/arm-protos.h (gen_movmem_ldrd_strd): New declaration. ++ * config/arm/arm.c (next_consecutive_mem): New function. ++ (gen_movmem_ldrd_strd): Likewise. ++ * config/arm/arm.md (movmemqi): Update condition and code. ++ (unaligned_loaddi, unaligned_storedi): New patterns. ++ ++2013-05-19 Matthew Gretton-Dann ++ ++ * LINARO-VERSION: Bump version number. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ * LINARO-VERSION: Update. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198677. ++ 2013-05-07 Naveen H.S ++ ++ * config/aarch64/aarch64.md ++ (cmp_swp__shft_): Restrict the ++ shift value between 0-4. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198574-198575. ++ 2013-05-03 Vidya Praveen ++ ++ * config/aarch64/aarch64-simd.md (simd_fabd): Correct the description. ++ ++ 2013-05-03 Vidya Praveen ++ ++ * config/aarch64/aarch64-simd.md (*fabd_scalar3): Support ++ scalar form of FABD instruction. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198490-198496 ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/arm_neon.h ++ (vac_f<32, 64>): Rename to... ++ (vca_f<32, 64>): ...this, reimpliment in C. ++ (vca_f<32, 64>): Reimpliment in C. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md (*aarch64_fac): New. ++ * config/aarch64/iterators.md (FAC_COMPARISONS): New. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md ++ (vcond_internal): Handle special cases for constant masks. ++ (vcond): Allow nonmemory_operands for outcome vectors. ++ (vcondu): Likewise. ++ (vcond): New. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c (BUILTIN_VALLDI): Define. ++ (aarch64_fold_builtin): Add folding for cm. ++ * config/aarch64/aarch64-simd-builtins.def ++ (cmeq): Update to BUILTIN_VALLDI. ++ (cmgt): Likewise. ++ (cmge): Likewise. ++ (cmle): Likewise. ++ (cmlt): Likewise. ++ * config/aarch64/arm_neon.h ++ (vc_<8,16,32,64>): Remap ++ to builtins or C as appropriate. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd-builtins.def (cmhs): Rename to... ++ (cmgeu): ...This. ++ (cmhi): Rename to... ++ (cmgtu): ...This. ++ * config/aarch64/aarch64-simd.md ++ (simd_mode): Add SF. ++ (aarch64_vcond_internal): Use new names for unsigned comparison insns. ++ (aarch64_cm): Rewrite to not use UNSPECs. ++ * config/aarch64/aarch64.md (*cstore_neg): Rename to... ++ (cstore_neg): ...This. ++ * config/aarch64/iterators.md ++ (VALLF): new. ++ (unspec): Remove UNSPEC_CM. ++ (COMPARISONS): New. ++ (UCOMPARISONS): Likewise. ++ (optab): Add missing comparisons. ++ (n_optab): New. ++ (cmp_1): Likewise. ++ (cmp_2): Likewise. ++ (CMP): Likewise. ++ (cmp): Remove. ++ (VCMP_S): Likewise. ++ (VCMP_U): Likewise. ++ (V_cmp_result): Add DF, SF modes. ++ (v_cmp_result): Likewise. ++ (v): Likewise. ++ (vmtype): Likewise. ++ * config/aarch64/predicates.md (aarch64_reg_or_fp_zero): New. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198191. ++ 2013-04-23 Sofiane Naci ++ ++ * config/aarch64/aarch64.md (*mov_aarch64): Add simd attribute. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r197838. ++ 2013-04-11 Naveen H.S ++ ++ * config/aarch64/aarch64.c (aarch64_select_cc_mode): Allow NEG ++ code in CC_NZ mode. ++ * config/aarch64/aarch64.md (*neg_3_compare0): New ++ pattern. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198019. ++ 2013-04-16 Naveen H.S ++ ++ * config/aarch64/aarch64.md (*adds_mul_imm_): New pattern. ++ (*subs_mul_imm_): New pattern. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198424-198425. ++ 2013-04-29 Ian Bolton ++ ++ * config/aarch64/aarch64.md (movsi_aarch64): Support LDR/STR ++ from/to S register. ++ (movdi_aarch64): Support LDR/STR from/to D register. ++ ++ 2013-04-29 Ian Bolton ++ ++ * common/config/aarch64/aarch64-common.c: Enable REE pass at O2 ++ or higher by default. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198412. ++ 2013-04-29 Kyrylo Tkachov ++ ++ * config/arm/arm.md (store_minmaxsi): Use only when ++ optimize_insn_for_size_p. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk 198394,198396-198400,198402-198404. ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/arm_neon.h ++ (vcvt_f<32,64>_s<32,64>): Rewrite in C. ++ (vcvt_f<32,64>_s<32,64>): Rewrite using builtins. ++ (vcvt__f<32,64>_f<32,64>): Likewise. ++ (vcvt_<32,64>_f<32,64>): Likewise. ++ (vcvta_<32,64>_f<32,64>): Likewise. ++ (vcvtm_<32,64>_f<32,64>): Likewise. ++ (vcvtn_<32,64>_f<32,64>): Likewise. ++ (vcvtp_<32,64>_f<32,64>): Likewise. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md ++ (2): New, maps to fix, fixuns. ++ (2): New, maps to ++ fix_trunc, fixuns_trunc. ++ (ftrunc2): New. ++ * config/aarch64/iterators.md (optab): Add fix, fixuns. ++ (fix_trunc_optab): New. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_builtin_vectorized_function): Vectorize over ifloorf, ++ iceilf, lround, iroundf. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd-builtins.def (vec_unpacks_hi_): New. ++ (float_truncate_hi_): Likewise. ++ (float_extend_lo_): Likewise. ++ (float_truncate_lo_): Likewise. ++ * config/aarch64/aarch64-simd.md (vec_unpacks_lo_v4sf): New. ++ (aarch64_float_extend_lo_v2df): Likewise. ++ (vec_unpacks_hi_v4sf): Likewise. ++ (aarch64_float_truncate_lo_v2sf): Likewise. ++ (aarch64_float_truncate_hi_v4sf): Likewise. ++ (vec_pack_trunc_v2df): Likewise. ++ (vec_pack_trunc_df): Likewise. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_fold_builtin): Fold float conversions. ++ * config/aarch64/aarch64-simd-builtins.def ++ (floatv2si, floatv4si, floatv2di): New. ++ (floatunsv2si, floatunsv4si, floatunsv2di): Likewise. ++ * config/aarch64/aarch64-simd.md ++ (2): New, expands to float and floatuns. ++ * config/aarch64/iterators.md (FLOATUORS): New. ++ (optab): Add float, floatuns. ++ (su_optab): Likewise. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_builtin_vectorized_function): Fold to standard pattern names. ++ * config/aarch64/aarch64-simd-builtins.def (frintn): New. ++ (frintz): Rename to... ++ (btrunc): ...this. ++ (frintp): Rename to... ++ (ceil): ...this. ++ (frintm): Rename to... ++ (floor): ...this. ++ (frinti): Rename to... ++ (nearbyint): ...this. ++ (frintx): Rename to... ++ (rint): ...this. ++ (frinta): Rename to... ++ (round): ...this. ++ * config/aarch64/aarch64-simd.md ++ (aarch64_frint): Delete. ++ (2): Convert to insn. ++ * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRINTN. ++ * config/aarch64/iterators.md (FRINT): Add UNSPEC_FRINTN. ++ (frint_pattern): Likewise. ++ (frint_suffix): Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198302-198306,198316. ++ 2013-04-25 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md ++ (aarch64_simd_bsl_internal): Rewrite RTL to not use UNSPEC_BSL. ++ (aarch64_simd_bsl): Likewise. ++ * config/aarch64/iterators.md (unspec): Remove UNSPEC_BSL. ++ ++ 2013-04-25 James Greenhalgh ++ ++ * config/aarch64/aarch64-simd.md (neg2): Use VDQ iterator. ++ ++ 2013-04-25 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_fold_builtin): New. ++ * config/aarch64/aarch64-protos.h (aarch64_fold_builtin): New. ++ * config/aarch64/aarch64.c (TARGET_FOLD_BUILTIN): Define. ++ * config/aarch64/aarch64-simd-builtins.def (abs): New. ++ * config/aarch64/arm_neon.h ++ (vabs_): Implement using __builtin_aarch64_fabs. ++ ++ 2013-04-25 James Greenhalgh ++ Tejas Belagod ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_gimple_fold_builtin): New. ++ * config/aarch64/aarch64-protos.h (aarch64_gimple_fold_builtin): New. ++ * config/aarch64/aarch64-simd-builtins.def (addv): New. ++ * config/aarch64/aarch64-simd.md (addpv4sf): New. ++ (addvv4sf): Update. ++ * config/aarch64/aarch64.c (TARGET_GIMPLE_FOLD_BUILTIN): Define. ++ ++ 2013-04-25 Naveen H.S ++ ++ * config/aarch64/aarch64.md ++ (*cmp_swp__shft_): New pattern. ++ ++ 2013-04-25 Naveen H.S ++ ++ * config/aarch64/aarch64.md (*ngc): New pattern. ++ (*ngcsi_uxtw): New pattern. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk 198298. ++ 2013-04-25 Kyrylo Tkachov ++ Julian Brown ++ ++ * config/arm/arm.c (neon_builtin_type_mode): Add T_V4HF. ++ (TB_DREG): Add T_V4HF. ++ (v4hf_UP): New macro. ++ (neon_itype): Add NEON_FLOAT_WIDEN, NEON_FLOAT_NARROW. ++ (arm_init_neon_builtins): Handle NEON_FLOAT_WIDEN, ++ NEON_FLOAT_NARROW. ++ Handle initialisation of V4HF. Adjust initialisation of reinterpret ++ built-ins. ++ (arm_expand_neon_builtin): Handle NEON_FLOAT_WIDEN, ++ NEON_FLOAT_NARROW. ++ (arm_vector_mode_supported_p): Handle V4HF. ++ (arm_mangle_map): Handle V4HFmode. ++ * config/arm/arm.h (VALID_NEON_DREG_MODE): Add V4HF. ++ * config/arm/arm_neon_builtins.def: Add entries for ++ vcvtv4hfv4sf, vcvtv4sfv4hf. ++ * config/arm/neon.md (neon_vcvtv4sfv4hf): New pattern. ++ (neon_vcvtv4hfv4sf): Likewise. ++ * config/arm/neon-gen.ml: Handle half-precision floating point ++ features. ++ * config/arm/neon-testgen.ml: Handle Requires_FP_bit feature. ++ * config/arm/arm_neon.h: Regenerate. ++ * config/arm/neon.ml (type elts): Add F16. ++ (type vectype): Add T_float16x4, T_floatHF. ++ (type vecmode): Add V4HF. ++ (type features): Add Requires_FP_bit feature. ++ (elt_width): Handle F16. ++ (elt_class): Likewise. ++ (elt_of_class_width): Likewise. ++ (mode_of_elt): Refactor. ++ (type_for_elt): Handle F16, fix error messages. ++ (vectype_size): Handle T_float16x4. ++ (vcvt_sh): New function. ++ (ops): Add entries for vcvt_f16_f32, vcvt_f32_f16. ++ (string_of_vectype): Handle T_floatHF, T_float16, T_float16x4. ++ (string_of_mode): Handle V4HF. ++ * doc/arm-neon-intrinsics.texi: Regenerate. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198136-198137,198142,198176. ++ 2013-04-23 Andreas Schwab ++ ++ * coretypes.h (gimple_stmt_iterator): Add struct to make ++ compatible with C. ++ ++ 2013-04-22 James Greenhalgh ++ ++ * coretypes.h (gimple_stmt_iterator_d): Forward declare. ++ (gimple_stmt_iterator): New typedef. ++ * gimple.h (gimple_stmt_iterator): Rename to... ++ (gimple_stmt_iterator_d): ... This. ++ * doc/tm.texi.in (TARGET_FOLD_BUILTIN): Detail restriction that ++ trees be valid for GIMPLE and GENERIC. ++ (TARGET_GIMPLE_FOLD_BUILTIN): New. ++ * gimple-fold.c (gimple_fold_call): Call target hook ++ gimple_fold_builtin. ++ * hooks.c (hook_bool_gsiptr_false): New. ++ * hooks.h (hook_bool_gsiptr_false): New. ++ * target.def (fold_stmt): New. ++ * doc/tm.texi: Regenerate. ++ ++ 2013-04-22 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (CF): Remove. ++ (CF0, CF1, CF2, CF3, CF4, CF10): New. ++ (VAR<1-12>): Add MAP parameter. ++ (BUILTIN_*): Likewise. ++ * config/aarch64/aarch64-simd-builtins.def: Set MAP parameter. ++ * config/aarch64/aarch64-simd.md (aarch64_sshl_n): Remove. ++ (aarch64_ushl_n): Likewise. ++ (aarch64_sshr_n): Likewise. ++ (aarch64_ushr_n): Likewise. ++ (aarch64_): Likewise. ++ (aarch64_sqrt): Likewise. ++ * config/aarch64/arm_neon.h (vshl_n_*): Use new builtin names. ++ (vshr_n_*): Likewise. ++ ++ 2013-04-22 James Greenhalgh ++ ++ * config/aarch64/aarch64-builtins.c ++ (aarch64_simd_builtin_type_mode): Handle SF types. ++ (sf_UP): Define. ++ (BUILTIN_GPF): Define. ++ (aarch64_init_simd_builtins): Handle SF types. ++ * config/aarch64/aarch64-simd-builtins.def (frecpe): Add support. ++ (frecps): Likewise. ++ (frecpx): Likewise. ++ * config/aarch64/aarch64-simd.md ++ (simd_types): Update simd_frcp to simd_frecp. ++ (aarch64_frecpe): New. ++ (aarch64_frecps): Likewise. ++ * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRECP. ++ (v8type): Add frecp. ++ (aarch64_frecp): New. ++ (aarch64_frecps): Likewise. ++ * config/aarch64/iterators.md (FRECP): New. ++ (frecp_suffix): Likewise. ++ * config/aarch64/arm_neon.h ++ (vrecp_<32, 64>): Convert to using builtins. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198030. ++ 2013-04-17 Greta Yorsh ++ ++ * config/arm/arm.md (movsicc_insn): Convert define_insn into ++ define_insn_and_split. ++ (and_scc,ior_scc,negscc): Likewise. ++ (cmpsi2_addneg, subsi3_compare): Convert to named patterns. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198020. ++ 2013-04-16 Naveen H.S ++ ++ * config/aarch64/aarch64.md (*adds__multp2): ++ New pattern. ++ (*subs__multp2): New pattern. ++ (*adds__): New pattern. ++ (*subs__): New pattern. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198004,198029. ++ 2013-04-17 Greta Yorsh ++ ++ * config/arm/arm.c (use_return_insn): Return 0 for targets that ++ can benefit from using a sequence of LDRD instructions in epilogue ++ instead of a single LDM instruction. ++ ++ 2013-04-16 Greta Yorsh ++ ++ * config/arm/arm.c (emit_multi_reg_push): New declaration ++ for an existing function. ++ (arm_emit_strd_push): New function. ++ (arm_expand_prologue): Used here. ++ (arm_emit_ldrd_pop): New function. ++ (arm_expand_epilogue): Used here. ++ (arm_get_frame_offsets): Update condition. ++ (arm_emit_multi_reg_pop): Add a special case for load of a single ++ register with writeback. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197965. ++ 2013-04-15 Kyrylo Tkachov ++ ++ * config/arm/arm.c (const_ok_for_dimode_op): Handle AND case. ++ * config/arm/arm.md (*anddi3_insn): Change to insn_and_split. ++ * config/arm/constraints.md (De): New constraint. ++ * config/arm/neon.md (anddi3_neon): Delete. ++ (neon_vand): Expand to standard anddi3 pattern. ++ * config/arm/predicates.md (imm_for_neon_inv_logic_operand): ++ Move earlier in the file. ++ (neon_inv_logic_op2): Likewise. ++ (arm_anddi_operand_neon): New predicate. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197925. ++ 2013-04-12 Greta Yorsh ++ ++ * config/arm/arm.md (mov_scc,mov_negscc,mov_notscc): Convert ++ define_insn into define_insn_and_split and emit movsicc patterns. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197807. ++ 2013-04-11 Naveen H.S ++ ++ * config/aarch64/aarch64.h (REVERSIBLE_CC_MODE): Define. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197642. ++ 2013-04-09 Kyrylo Tkachov ++ ++ * config/arm/arm.md (minmax_arithsi_non_canon): New pattern. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197530,197921. ++ 2013-04-12 Greta Yorsh ++ ++ * config/arm/arm.c (gen_operands_ldrd_strd): Initialize "base". ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/constraints.md (q): New constraint. ++ * config/arm/ldrdstrd.md: New file. ++ * config/arm/arm.md (ldrdstrd.md) New include. ++ (arm_movdi): Use "q" instead of "r" constraint ++ for double-word memory access. ++ (movdf_soft_insn): Likewise. ++ * config/arm/vfp.md (movdi_vfp): Likewise. ++ * config/arm/t-arm (MD_INCLUDES): Add ldrdstrd.md. ++ * config/arm/arm-protos.h (gen_operands_ldrd_strd): New declaration. ++ * config/arm/arm.c (gen_operands_ldrd_strd): New function. ++ (mem_ok_for_ldrd_strd): Likewise. ++ (output_move_double): Update assertion. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport of trunk r197518-197522,197526-197528. ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (arm_smax_insn): Convert define_insn into ++ define_insn_and_split. ++ (arm_smin_insn,arm_umaxsi3,arm_uminsi3): Likewise. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (arm_ashldi3_1bit): Convert define_insn into ++ define_insn_and_split. ++ (arm_ashrdi3_1bit,arm_lshrdi3_1bit): Likewise. ++ (shiftsi3_compare): New pattern. ++ (rrx): New pattern. ++ * config/arm/unspecs.md (UNSPEC_RRX): New. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (negdi_extendsidi): New pattern. ++ (negdi_zero_extendsidi): Likewise. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (andsi_iorsi3_notsi): Convert define_insn into ++ define_insn_and_split. ++ (arm_negdi2,arm_abssi2,arm_neg_abssi2): Likewise. ++ (arm_cmpdi_insn,arm_cmpdi_unsigned): Likewise. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (arm_subdi3): Convert define_insn into ++ define_insn_and_split. ++ (subdi_di_zesidi,subdi_di_sesidi): Likewise. ++ (subdi_zesidi_di,subdi_sesidi_di,subdi_zesidi_zesidi): Likewise. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (subsi3_carryin): New pattern. ++ (subsi3_carryin_const): Likewise. ++ (subsi3_carryin_compare,subsi3_carryin_compare_const): Likewise. ++ (subsi3_carryin_shift,rsbsi3_carryin_shift): Likewise. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (incscc,arm_incscc,decscc,arm_decscc): Delete. ++ ++ 2013-04-05 Greta Yorsh ++ ++ * config/arm/arm.md (addsi3_carryin_): Set attribute predicable. ++ (addsi3_carryin_alt2_,addsi3_carryin_shift_): Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport of trunk r197517. ++ 2013-04-05 Kyrylo Tkachov ++ ++ * config/arm/arm.c (arm_expand_builtin): Change fcode ++ type to unsigned int. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport of trunk r197513. ++ 2013-04-05 Ramana Radhakrishnan ++ ++ * doc/invoke.texi (ARM Options): Document cortex-a53 support. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport of trunk r197489-197491. ++ 2013-04-04 Kyrylo Tkachov ++ ++ * config/arm/arm-protos.h (arm_builtin_vectorized_function): ++ New function prototype. ++ * config/arm/arm.c (TARGET_VECTORIZE_BUILTINS): Define. ++ (TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION): Likewise. ++ (arm_builtin_vectorized_function): New function. ++ ++ 2013-04-04 Kyrylo Tkachov ++ ++ * config/arm/arm_neon_builtins.def: New file. ++ * config/arm/arm.c (neon_builtin_data): Move contents to ++ arm_neon_builtins.def. ++ (enum arm_builtins): Include neon builtin definitions. ++ (ARM_BUILTIN_NEON_BASE): Move from enum to macro. ++ * config/arm/t-arm (arm.o): Add dependency on ++ arm_neon_builtins.def. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport of trunk 196795-196797,196957 ++ 2013-03-19 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*sub3_carryin): New pattern. ++ (*subsi3_carryin_uxtw): Likewise. ++ ++ 2013-03-19 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*ror3_insn): New pattern. ++ (*rorsi3_insn_uxtw): Likewise. ++ ++ 2013-03-19 Ian Bolton ++ ++ * config/aarch64/aarch64.md (*extr5_insn): New pattern. ++ (*extrsi5_insn_uxtw): Likewise. ++ ++2013-04-10 Matthew Gretton-Dann ++ ++ * LINARO-VERSION: Bump version number. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. ++ * LINARO-VERSION: New file. ++ * configure.ac: Add Linaro version string. ++ * configure: Regenerate. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport of trunk r197346. ++ 2013-04-02 Ian Caulfield ++ Ramana Radhakrishnan ++ ++ * config/arm/arm-arches.def (armv8-a): Default to cortex-a53. ++ * config/arm/t-arm (MD_INCLUDES): Depend on cortex-a53.md. ++ * config/arm/cortex-a53.md: New file. ++ * config/arm/bpabi.h (BE8_LINK_SPEC): Handle cortex-a53. ++ * config/arm/arm.md (generic_sched, generic_vfp): Handle cortex-a53. ++ * config/arm/arm.c (arm_issue_rate): Likewise. ++ * config/arm/arm-tune.md: Regenerate ++ * config/arm/arm-tables.opt: Regenerate. ++ * config/arm/arm-cores.def: Add cortex-a53. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport of trunk r197342. ++ 2013-04-02 Sofiane Naci ++ ++ * config/aarch64/aarch64.md (*mov_aarch64): Add variants for ++ scalar load/store operations using B/H registers. ++ (*zero_extend2_aarch64): Likewise. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport of trunk r197341. ++ 2013-04-02 Sofiane Naci ++ ++ * config/aarch64/aarch64.md (*mov_aarch64): Add alternatives for ++ scalar move. ++ * config/aarch64/aarch64.c ++ (aarch64_simd_scalar_immediate_valid_for_move): New. ++ * config/aarch64/aarch64-protos.h ++ (aarch64_simd_scalar_immediate_valid_for_move): New. ++ * config/aarch64/constraints.md (Dh, Dq): New. ++ * config/aarch64/iterators.md (hq): New. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197207. ++ 2013-03-28 Naveen H.S ++ ++ * config/aarch64/aarch64.md (*and3_compare0): New pattern. ++ (*andsi3_compare0_uxtw): New pattern. ++ (*and_3_compare0): New pattern. ++ (*and_si3_compare0_uxtw): New pattern. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197153. ++ 2013-03-27 Terry Guo ++ ++ * config/arm/arm-cores.def: Added core cortex-r7. ++ * config/arm/arm-tune.md: Regenerated. ++ * config/arm/arm-tables.opt: Regenerated. ++ * doc/invoke.texi: Added entry for core cortex-r7. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197052. ++ 2013-03-25 Kyrylo Tkachov ++ ++ * config/arm/arm.md (f_sels, f_seld): New types. ++ (*cmov): New pattern. ++ * config/arm/predicates.md (arm_vsel_comparison_operator): New ++ predicate. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197046. ++ 2013-03-25 Kyrylo Tkachov ++ ++ * config/arm/arm.c (arm_emit_load_exclusive): Add acq parameter. ++ Emit load-acquire versions when acq is true. ++ (arm_emit_store_exclusive): Add rel parameter. ++ Emit store-release versions when rel is true. ++ (arm_split_compare_and_swap): Use acquire-release instructions ++ instead. ++ of barriers when appropriate. ++ (arm_split_atomic_op): Likewise. ++ * config/arm/arm.h (TARGET_HAVE_LDACQ): New macro. ++ * config/arm/unspecs.md (VUNSPEC_LAX): New unspec. ++ (VUNSPEC_SLX): Likewise. ++ (VUNSPEC_LDA): Likewise. ++ (VUNSPEC_STL): Likewise. ++ * config/arm/sync.md (atomic_load): New pattern. ++ (atomic_store): Likewise. ++ (arm_load_acquire_exclusive): Likewise. ++ (arm_load_acquire_exclusivesi): Likewise. ++ (arm_load_acquire_exclusivedi): Likewise. ++ (arm_store_release_exclusive): Likewise. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r196876. ++ 2013-03-21 Christophe Lyon ++ ++ * config/arm/arm-protos.h (tune_params): Add ++ prefer_neon_for_64bits field. ++ * config/arm/arm.c (prefer_neon_for_64bits): New variable. ++ (arm_slowmul_tune): Default prefer_neon_for_64bits to false. ++ (arm_fastmul_tune, arm_strongarm_tune, arm_xscale_tune): Ditto. ++ (arm_9e_tune, arm_v6t2_tune, arm_cortex_tune): Ditto. ++ (arm_cortex_a15_tune, arm_cortex_a5_tune): Ditto. ++ (arm_cortex_a9_tune, arm_v6m_tune, arm_fa726te_tune): Ditto. ++ (arm_option_override): Handle -mneon-for-64bits new option. ++ * config/arm/arm.h (TARGET_PREFER_NEON_64BITS): New macro. ++ (prefer_neon_for_64bits): Declare new variable. ++ * config/arm/arm.md (arch): Rename neon_onlya8 and neon_nota8 to ++ avoid_neon_for_64bits and neon_for_64bits. Remove onlya8 and ++ nota8. ++ (arch_enabled): Handle new arch types. Remove support for onlya8 ++ and nota8. ++ (one_cmpldi2): Use new arch names. ++ * config/arm/arm.opt (mneon-for-64bits): Add option. ++ * config/arm/neon.md (adddi3_neon, subdi3_neon, iordi3_neon) ++ (anddi3_neon, xordi3_neon, ashldi3_neon, di3_neon): Use ++ neon_for_64bits instead of nota8 and avoid_neon_for_64bits instead ++ of onlya8. ++ * doc/invoke.texi (-mneon-for-64bits): Document. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r196858. ++ 2013-03-21 Naveen H.S ++ ++ * config/aarch64/aarch64-simd.md (simd_fabd): New Attribute. ++ (abd_3): New pattern. ++ (aba_3): New pattern. ++ (fabd_3): New pattern. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r196856. ++ 2013-03-21 Naveen H.S ++ ++ * config/aarch64/aarch64-elf.h (REGISTER_PREFIX): Remove. ++ * config/aarch64/aarch64.c (aarch64_print_operand): Remove all ++ occurrence of REGISTER_PREFIX as its empty string. +--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-floorf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-floorf.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_neon_ok } */ ++/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */ ++/* { dg-add-options arm_v8_neon } */ ++ ++#define N 32 ++ ++void ++foo (float *output, float *input) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = __builtin_floorf (input[i]); ++} ++ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_floorf } } } */ ++/* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vaesdq_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vaesdq_u8.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint8x16_t a, b, c; ++ int i = 0; ++ ++ for (i = 0; i < 16; ++i) ++ { ++ a[i] = i; ++ b[i] = 15 - i; ++ } ++ c = vaesdq_u8 (a, b); ++ return c[0]; ++} ++ ++/* { dg-final { scan-assembler "aesd.8\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha256su0q_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha256su0q_u32.c +@@ -0,0 +1,17 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ ++ uint32x4_t res = vsha256su0q_u32 (a, b); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha256su0.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld1p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1p64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ ++ out_poly64x1_t = vld1_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst4p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst4p64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst4p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst4p64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x1x4_t arg1_poly64x1x4_t; ++ ++ vst4_p64 (arg0_poly64_t, arg1_poly64x1x4_t); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_u8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_u8 (void) ++{ ++ poly128_t out_poly128_t; ++ uint8x16_t arg0_uint8x16_t; ++ ++ out_poly128_t = vreinterpretq_p128_u8 (arg0_uint8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_s32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_s32 (void) ++{ ++ poly128_t out_poly128_t; ++ int32x4_t arg0_int32x4_t; ++ ++ out_poly128_t = vreinterpretq_p128_s32 (arg0_int32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_u8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_u8 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ uint8x16_t arg0_uint8x16_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_u8 (arg0_uint8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp8_p64 (void) ++{ ++ poly8x16_t out_poly8x16_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_poly8x16_t = vreinterpretq_p8_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_s16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_s16 (void) ++{ ++ poly128_t out_poly128_t; ++ int16x8_t arg0_int16x8_t; ++ ++ out_poly128_t = vreinterpretq_p128_s16 (arg0_int16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld2p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld2p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld2p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld2p64 (void) ++{ ++ poly64x1x2_t out_poly64x1x2_t; ++ ++ out_poly64x1x2_t = vld2_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_u64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_u64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ uint64x2_t arg0_uint64x2_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_u64 (arg0_uint64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld4_dupp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld4_dupp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld4_dupp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld4_dupp64 (void) ++{ ++ poly64x1x4_t out_poly64x1x4_t; ++ ++ out_poly64x1x4_t = vld4_dup_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu8_p64 (void) ++{ ++ uint8x16_t out_uint8x16_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_uint8x16_t = vreinterpretq_u8_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_p16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_p16 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly16x8_t arg0_poly16x8_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_p16 (arg0_poly16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vdupQ_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vdupQ_np64.c +@@ -0,0 +1,19 @@ ++/* Test the `vdupQ_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vdupQ_np64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64_t arg0_poly64_t; ++ ++ out_poly64x2_t = vdupq_n_p64 (arg0_poly64_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs32_p64 (void) ++{ ++ int32x4_t out_int32x4_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_int32x4_t = vreinterpretq_s32_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_u32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_u32 (void) ++{ ++ poly128_t out_poly128_t; ++ uint32x4_t arg0_uint32x4_t; ++ ++ out_poly128_t = vreinterpretq_p128_u32 (arg0_uint32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs64_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs64_p64 (void) ++{ ++ int64x2_t out_int64x2_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_int64x2_t = vreinterpretq_s64_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld3p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld3p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld3p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld3p64 (void) ++{ ++ poly64x1x3_t out_poly64x1x3_t; ++ ++ out_poly64x1x3_t = vld3_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu16_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu16_p128 (void) ++{ ++ uint16x8_t out_uint16x8_t; ++ poly128_t arg0_poly128_t; ++ ++ out_uint16x8_t = vreinterpretq_u16_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_u16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_u16 (void) ++{ ++ poly128_t out_poly128_t; ++ uint16x8_t arg0_uint16x8_t; ++ ++ out_poly128_t = vreinterpretq_p128_u16 (arg0_uint16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vcreatep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vcreatep64.c +@@ -0,0 +1,19 @@ ++/* Test the `vcreatep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vcreatep64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint64_t arg0_uint64_t; ++ ++ out_poly64x1_t = vcreate_p64 (arg0_uint64_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep64.c +@@ -0,0 +1,19 @@ ++/* Test the `vdupQ_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vdupQ_lanep64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_poly64x2_t = vdupq_lane_p64 (arg0_poly64x1_t, 0); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_f32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_f32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_f32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_f32 (void) ++{ ++ poly128_t out_poly128_t; ++ float32x4_t arg0_float32x4_t; ++ ++ out_poly128_t = vreinterpretq_p128_f32 (arg0_float32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vsri_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vsri_np64.c +@@ -0,0 +1,21 @@ ++/* Test the `vsri_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vsri_np64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ out_poly64x1_t = vsri_n_p64 (arg0_poly64x1_t, arg1_poly64x1_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vsri\.64\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1_lanep64.c +@@ -0,0 +1,20 @@ ++/* Test the `vld1_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1_lanep64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ out_poly64x1_t = vld1_lane_p64 (0, arg1_poly64x1_t, 0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs8_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs8_p128 (void) ++{ ++ int8x16_t out_int8x16_t; ++ poly128_t arg0_poly128_t; ++ ++ out_int8x16_t = vreinterpretq_s8_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld4p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld4p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld4p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld4p64 (void) ++{ ++ poly64x1x4_t out_poly64x1x4_t; ++ ++ out_poly64x1x4_t = vld4_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_s32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_s32 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ int32x4_t arg0_int32x4_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_s32 (arg0_int32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep64.c +@@ -0,0 +1,20 @@ ++/* Test the `vld1Q_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1Q_lanep64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ out_poly64x2_t = vld1q_lane_p64 (0, arg1_poly64x2_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_p8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_p8 (void) ++{ ++ poly128_t out_poly128_t; ++ poly8x16_t arg0_poly8x16_t; ++ ++ out_poly128_t = vreinterpretq_p128_p8 (arg0_poly8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_p8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_p8 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly8x16_t arg0_poly8x16_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_p8 (arg0_poly8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vget_lowp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vget_lowp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vget_lowp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vget_lowp64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_poly64x1_t = vget_low_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs64_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs64_p128 (void) ++{ ++ int64x2_t out_int64x2_t; ++ poly128_t arg0_poly128_t; ++ ++ out_int64x2_t = vreinterpretq_s64_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst1_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst1_lanep64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst1_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst1_lanep64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ vst1_lane_p64 (arg0_poly64_t, arg1_poly64x1_t, 0); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs16_p64 (void) ++{ ++ int16x8_t out_int16x8_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_int16x8_t = vreinterpretq_s16_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_s16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_s16 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ int16x8_t arg0_int16x8_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_s16 (arg0_int16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp16_p64 (void) ++{ ++ poly16x4_t out_poly16x4_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_poly16x4_t = vreinterpret_p16_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst1Qp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst1Qp64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst1Qp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst1Qp64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ vst1q_p64 (arg0_poly64_t, arg1_poly64x2_t); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_s64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_s64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ int64x1_t arg0_int64x1_t; ++ ++ out_poly64x1_t = vreinterpret_p64_s64 (arg0_int64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu32_p64 (void) ++{ ++ uint32x4_t out_uint32x4_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_uint32x4_t = vreinterpretq_u32_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_u32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_u32 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ uint32x4_t arg0_uint32x4_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_u32 (arg0_uint32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vget_highp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vget_highp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vget_highp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vget_highp64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_poly64x1_t = vget_high_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu64_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu64_p64 (void) ++{ ++ uint64x2_t out_uint64x2_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_uint64x2_t = vreinterpretq_u64_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_u16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_u16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_u16 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ uint16x8_t arg0_uint16x8_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_u16 (arg0_uint16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vcvtf32_f16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vcvtf32_f16.c +@@ -0,0 +1,20 @@ ++/* Test the `vcvtf32_f16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_neon_fp16_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_neon_fp16 } */ ++ ++#include "arm_neon.h" ++ ++void test_vcvtf32_f16 (void) ++{ ++ float32x4_t out_float32x4_t; ++ float16x4_t arg0_float16x4_t; ++ ++ out_float32x4_t = vcvt_f32_f16 (arg0_float16x4_t); ++} ++ ++/* { dg-final { scan-assembler "vcvt\.f32.f16\[ \]+\[qQ\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_f32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_f32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_f32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_f32 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ float32x4_t arg0_float32x4_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_f32 (arg0_float32x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vbslp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vbslp64.c +@@ -0,0 +1,22 @@ ++/* Test the `vbslp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vbslp64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint64x1_t arg0_uint64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ poly64x1_t arg2_poly64x1_t; ++ ++ out_poly64x1_t = vbsl_p64 (arg0_uint64x1_t, arg1_poly64x1_t, arg2_poly64x1_t); ++} ++ ++/* { dg-final { scan-assembler "((vbsl)|(vbit)|(vbif))\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp16_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp16_p128 (void) ++{ ++ poly16x8_t out_poly16x8_t; ++ poly128_t arg0_poly128_t; ++ ++ out_poly16x8_t = vreinterpretq_p16_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vsli_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vsli_np64.c +@@ -0,0 +1,21 @@ ++/* Test the `vsli_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vsli_np64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ out_poly64x1_t = vsli_n_p64 (arg0_poly64x1_t, arg1_poly64x1_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vsli\.64\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld1Q_dupp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1Q_dupp64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ ++ out_poly64x2_t = vld1q_dup_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu8_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu8_p128 (void) ++{ ++ uint8x16_t out_uint8x16_t; ++ poly128_t arg0_poly128_t; ++ ++ out_uint8x16_t = vreinterpretq_u8_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQf32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQf32_p64 (void) ++{ ++ float32x4_t out_float32x4_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_float32x4_t = vreinterpretq_f32_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_u64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_u64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint64x1_t arg0_uint64x1_t; ++ ++ out_poly64x1_t = vreinterpret_p64_u64 (arg0_uint64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vdup_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vdup_lanep64.c +@@ -0,0 +1,19 @@ ++/* Test the `vdup_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vdup_lanep64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_poly64x1_t = vdup_lane_p64 (arg0_poly64x1_t, 0); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_p16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_p16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_p16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_p16 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly16x4_t arg0_poly16x4_t; ++ ++ out_poly64x1_t = vreinterpret_p64_p16 (arg0_poly16x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_p64 (void) ++{ ++ poly128_t out_poly128_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_poly128_t = vreinterpretq_p128_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu16_p64 (void) ++{ ++ uint16x8_t out_uint16x8_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_uint16x8_t = vreinterpretq_u16_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterprets32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterprets32_p64 (void) ++{ ++ int32x2_t out_int32x2_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_int32x2_t = vreinterpret_s32_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterprets8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterprets8_p64 (void) ++{ ++ int8x8_t out_int8x8_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_int8x8_t = vreinterpret_s8_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vcvtf16_f32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vcvtf16_f32.c +@@ -0,0 +1,20 @@ ++/* Test the `vcvtf16_f32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_neon_fp16_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_neon_fp16 } */ ++ ++#include "arm_neon.h" ++ ++void test_vcvtf16_f32 (void) ++{ ++ float16x4_t out_float16x4_t; ++ float32x4_t arg0_float32x4_t; ++ ++ out_float16x4_t = vcvt_f16_f32 (arg0_float32x4_t); ++} ++ ++/* { dg-final { scan-assembler "vcvt\.f16.f32\[ \]+\[dD\]\[0-9\]+, \[qQ\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterprets64_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterprets64_p64 (void) ++{ ++ int64x1_t out_int64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_int64x1_t = vreinterpret_s64_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu64_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu64_p128 (void) ++{ ++ uint64x2_t out_uint64x2_t; ++ poly128_t arg0_poly128_t; ++ ++ out_uint64x2_t = vreinterpretq_u64_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_s8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_s8 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ int8x8_t arg0_int8x8_t; ++ ++ out_poly64x1_t = vreinterpret_p64_s8 (arg0_int8x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1_dupp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1_dupp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld1_dupp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1_dupp64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ ++ out_poly64x1_t = vld1_dup_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_s32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_s32 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ int32x2_t arg0_int32x2_t; ++ ++ out_poly64x1_t = vreinterpret_p64_s32 (arg0_int32x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vsriQ_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vsriQ_np64.c +@@ -0,0 +1,21 @@ ++/* Test the `vsriQ_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vsriQ_np64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x2_t arg0_poly64x2_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ out_poly64x2_t = vsriq_n_p64 (arg0_poly64x2_t, arg1_poly64x2_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vsri\.64\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vbslQp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vbslQp64.c +@@ -0,0 +1,22 @@ ++/* Test the `vbslQp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vbslQp64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ uint64x2_t arg0_uint64x2_t; ++ poly64x2_t arg1_poly64x2_t; ++ poly64x2_t arg2_poly64x2_t; ++ ++ out_poly64x2_t = vbslq_p64 (arg0_uint64x2_t, arg1_poly64x2_t, arg2_poly64x2_t); ++} ++ ++/* { dg-final { scan-assembler "((vbsl)|(vbit)|(vbif))\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs32_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs32_p128 (void) ++{ ++ int32x4_t out_int32x4_t; ++ poly128_t arg0_poly128_t; ++ ++ out_int32x4_t = vreinterpretq_s32_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_u8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_u8 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint8x8_t arg0_uint8x8_t; ++ ++ out_poly64x1_t = vreinterpret_p64_u8 (arg0_uint8x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst1Q_lanep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst1Q_lanep64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ vst1q_lane_p64 (arg0_poly64_t, arg1_poly64x2_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_s16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_s16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_s16 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ int16x4_t arg0_int16x4_t; ++ ++ out_poly64x1_t = vreinterpret_p64_s16 (arg0_int16x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterprets16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterprets16_p64 (void) ++{ ++ int16x4_t out_int16x4_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_int16x4_t = vreinterpret_s16_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vcombinep64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vcombinep64.c +@@ -0,0 +1,20 @@ ++/* Test the `vcombinep64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vcombinep64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x1_t arg0_poly64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ out_poly64x2_t = vcombine_p64 (arg0_poly64x1_t, arg1_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld1Qp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld1Qp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld1Qp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld1Qp64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ ++ out_poly64x2_t = vld1q_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_s64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_s64 (void) ++{ ++ poly128_t out_poly128_t; ++ int64x2_t arg0_int64x2_t; ++ ++ out_poly128_t = vreinterpretq_p128_s64 (arg0_int64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp8_p64 (void) ++{ ++ poly8x8_t out_poly8x8_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_poly8x8_t = vreinterpret_p8_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vdup_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vdup_np64.c +@@ -0,0 +1,19 @@ ++/* Test the `vdup_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vdup_np64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64_t arg0_poly64_t; ++ ++ out_poly64x1_t = vdup_n_p64 (arg0_poly64_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst1p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst1p64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst1p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst1p64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ vst1_p64 (arg0_poly64_t, arg1_poly64x1_t); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+((\\\{\[dD\]\[0-9\]+\\\})|(\[dD\]\[0-9\]+)), \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretu8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretu8_p64 (void) ++{ ++ uint8x8_t out_uint8x8_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_uint8x8_t = vreinterpret_u8_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_u32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_u32 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint32x2_t arg0_uint32x2_t; ++ ++ out_poly64x1_t = vreinterpret_p64_u32 (arg0_uint32x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretu32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretu32_p64 (void) ++{ ++ uint32x2_t out_uint32x2_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_uint32x2_t = vreinterpret_u32_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld2_dupp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld2_dupp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld2_dupp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld2_dupp64 (void) ++{ ++ poly64x1x2_t out_poly64x1x2_t; ++ ++ out_poly64x1x2_t = vld2_dup_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretu64_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretu64_p64 (void) ++{ ++ uint64x1_t out_uint64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_uint64x1_t = vreinterpret_u64_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vsliQ_np64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vsliQ_np64.c +@@ -0,0 +1,21 @@ ++/* Test the `vsliQ_np64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vsliQ_np64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x2_t arg0_poly64x2_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ out_poly64x2_t = vsliq_n_p64 (arg0_poly64x2_t, arg1_poly64x2_t, 1); ++} ++ ++/* { dg-final { scan-assembler "vsli\.64\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_u16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_u16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_u16 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ uint16x4_t arg0_uint16x4_t; ++ ++ out_poly64x1_t = vreinterpret_p64_u16 (arg0_uint16x4_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_u64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_u64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_u64 (void) ++{ ++ poly128_t out_poly128_t; ++ uint64x2_t arg0_uint64x2_t; ++ ++ out_poly128_t = vreinterpretq_p128_u64 (arg0_uint64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst2p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst2p64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst2p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst2p64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x1x2_t arg1_poly64x1x2_t; ++ ++ vst2_p64 (arg0_poly64_t, arg1_poly64x1x2_t); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp8_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp8_p128 (void) ++{ ++ poly8x16_t out_poly8x16_t; ++ poly128_t arg0_poly128_t; ++ ++ out_poly8x16_t = vreinterpretq_p8_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_f32.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_f32.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_f32' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_f32 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ float32x2_t arg0_float32x2_t; ++ ++ out_poly64x1_t = vreinterpret_p64_f32 (arg0_float32x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQf32_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQf32_p128 (void) ++{ ++ float32x4_t out_float32x4_t; ++ poly128_t arg0_poly128_t; ++ ++ out_float32x4_t = vreinterpretq_f32_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vextQp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vextQp64.c +@@ -0,0 +1,21 @@ ++/* Test the `vextQp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vextQp64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly64x2_t arg0_poly64x2_t; ++ poly64x2_t arg1_poly64x2_t; ++ ++ out_poly64x2_t = vextq_p64 (arg0_poly64x2_t, arg1_poly64x2_t, 0); ++} ++ ++/* { dg-final { scan-assembler "vext\.64\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p16.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_p16.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_p16' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_p16 (void) ++{ ++ poly128_t out_poly128_t; ++ poly16x8_t arg0_poly16x8_t; ++ ++ out_poly128_t = vreinterpretq_p128_p16 (arg0_poly16x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_p128 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ poly128_t arg0_poly128_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs16_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs16_p128 (void) ++{ ++ int16x8_t out_int16x8_t; ++ poly128_t arg0_poly128_t; ++ ++ out_int16x8_t = vreinterpretq_s16_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQs8_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQs8_p64 (void) ++{ ++ int8x16_t out_int8x16_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_int8x16_t = vreinterpretq_s8_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vextp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vextp64.c +@@ -0,0 +1,21 @@ ++/* Test the `vextp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vextp64 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly64x1_t arg0_poly64x1_t; ++ poly64x1_t arg1_poly64x1_t; ++ ++ out_poly64x1_t = vext_p64 (arg0_poly64x1_t, arg1_poly64x1_t, 0); ++} ++ ++/* { dg-final { scan-assembler "vext\.64\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp16_p64 (void) ++{ ++ poly16x8_t out_poly16x8_t; ++ poly64x2_t arg0_poly64x2_t; ++ ++ out_poly16x8_t = vreinterpretq_p16_p64 (arg0_poly64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretf32_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretf32_p64 (void) ++{ ++ float32x2_t out_float32x2_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_float32x2_t = vreinterpret_f32_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp128_s8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp128_s8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp128_s8 (void) ++{ ++ poly128_t out_poly128_t; ++ int8x16_t arg0_int8x16_t; ++ ++ out_poly128_t = vreinterpretq_p128_s8 (arg0_int8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_s8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_s8 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ int8x16_t arg0_int8x16_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_s8 (arg0_int8x16_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vst3p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vst3p64.c +@@ -0,0 +1,20 @@ ++/* Test the `vst3p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vst3p64 (void) ++{ ++ poly64_t *arg0_poly64_t; ++ poly64x1x3_t arg1_poly64x1x3_t; ++ ++ vst3_p64 (arg0_poly64_t, arg1_poly64x1x3_t); ++} ++ ++/* { dg-final { scan-assembler "vst1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vld3_dupp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vld3_dupp64.c +@@ -0,0 +1,19 @@ ++/* Test the `vld3_dupp64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vld3_dupp64 (void) ++{ ++ poly64x1x3_t out_poly64x1x3_t; ++ ++ out_poly64x1x3_t = vld3_dup_p64 (0); ++} ++ ++/* { dg-final { scan-assembler "vld1\.64\[ \]+\\\{((\[dD\]\[0-9\]+-\[dD\]\[0-9\]+)|(\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+))\\\}, \\\[\[rR\]\[0-9\]+\(:\[0-9\]+\)?\\\]!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretu16_p64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretu16_p64 (void) ++{ ++ uint16x4_t out_uint16x4_t; ++ poly64x1_t arg0_poly64x1_t; ++ ++ out_uint16x4_t = vreinterpret_u16_p64 (arg0_poly64x1_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_p8.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretp64_p8.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretp64_p8' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretp64_p8 (void) ++{ ++ poly64x1_t out_poly64x1_t; ++ poly8x8_t arg0_poly8x8_t; ++ ++ out_poly64x1_t = vreinterpret_p64_p8 (arg0_poly8x8_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp64_s64.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQp64_s64' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQp64_s64 (void) ++{ ++ poly64x2_t out_poly64x2_t; ++ int64x2_t arg0_int64x2_t; ++ ++ out_poly64x2_t = vreinterpretq_p64_s64 (arg0_int64x2_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p128.c +@@ -0,0 +1,19 @@ ++/* Test the `vreinterpretQu32_p128' ARM Neon intrinsic. */ ++/* This file was autogenerated by neon-testgen. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void test_vreinterpretQu32_p128 (void) ++{ ++ uint32x4_t out_uint32x4_t; ++ poly128_t arg0_poly128_t; ++ ++ out_uint32x4_t = vreinterpretq_u32_p128 (arg0_poly128_t); ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/anddi3-opt.c ++++ b/src/gcc/testsuite/gcc.target/arm/anddi3-opt.c +@@ -0,0 +1,11 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++ ++unsigned long long ++muld (unsigned long long X, unsigned long long Y) ++{ ++ unsigned long long mask = 0xffffffffull; ++ return (X & mask) * (Y & mask); ++} ++ ++/* { dg-final { scan-assembler-not "and\[\\t \]+.+,\[\\t \]*.+,\[\\t \]*.+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/peep-ldrd-1.c ++++ b/src/gcc/testsuite/gcc.target/arm/peep-ldrd-1.c +@@ -0,0 +1,11 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_prefer_ldrd_strd } */ ++/* { dg-options "-O2" } */ ++int foo(int a, int b, int* p, int *q) ++{ ++ a = p[2] + p[3]; ++ *q = a; ++ *p = a; ++ return a; ++} ++/* { dg-final { scan-assembler "ldrd" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselgtdf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselgtdf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i > 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselgt.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/acle.exp ++++ b/src/gcc/testsuite/gcc.target/arm/acle/acle.exp +@@ -0,0 +1,35 @@ ++# Copyright (C) 2013-2014 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with GCC; see the file COPYING3. If not see ++# . ++ ++# GCC testsuite that uses the `dg.exp' driver. ++ ++# Exit immediately if this isn't an ARM target. ++if ![istarget arm*-*-*] then { ++ return ++} ++ ++# Load support procs. ++load_lib gcc-dg.exp ++ ++# Initialize `dg'. ++dg-init ++ ++# Main loop. ++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \ ++ "" "" ++ ++# All done. ++dg-finish +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32b.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32b.c +@@ -0,0 +1,20 @@ ++/* Test the crc32b ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32b (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint8_t arg1_uint8_t; ++ ++ out_uint32_t = __crc32b (arg0_uint32_t, arg1_uint8_t); ++} ++ ++/* { dg-final { scan-assembler "crc32b\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32d.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32d.c +@@ -0,0 +1,20 @@ ++/* Test the crc32d ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32d (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint64_t arg1_uint64_t; ++ ++ out_uint32_t = __crc32d (arg0_uint32_t, arg1_uint64_t); ++} ++ ++/* { dg-final { scan-assembler-times "crc32w\t...?, ...?, ...?\n" 2 } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32cb.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32cb.c +@@ -0,0 +1,20 @@ ++/* Test the crc32cb ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32cb (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint8_t arg1_uint8_t; ++ ++ out_uint32_t = __crc32cb (arg0_uint32_t, arg1_uint8_t); ++} ++ ++/* { dg-final { scan-assembler "crc32cb\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32cd.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32cd.c +@@ -0,0 +1,20 @@ ++/* Test the crc32cd ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32cd (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint64_t arg1_uint64_t; ++ ++ out_uint32_t = __crc32cd (arg0_uint32_t, arg1_uint64_t); ++} ++ ++/* { dg-final { scan-assembler-times "crc32cw\t...?, ...?, ...?\n" 2 } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32w.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32w.c +@@ -0,0 +1,20 @@ ++/* Test the crc32w ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32w (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint32_t arg1_uint32_t; ++ ++ out_uint32_t = __crc32w (arg0_uint32_t, arg1_uint32_t); ++} ++ ++/* { dg-final { scan-assembler "crc32w\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32h.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32h.c +@@ -0,0 +1,20 @@ ++/* Test the crc32h ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32h (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint16_t arg1_uint16_t; ++ ++ out_uint32_t = __crc32h (arg0_uint32_t, arg1_uint16_t); ++} ++ ++/* { dg-final { scan-assembler "crc32h\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32cw.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32cw.c +@@ -0,0 +1,20 @@ ++/* Test the crc32cw ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32cw (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint32_t arg1_uint32_t; ++ ++ out_uint32_t = __crc32cw (arg0_uint32_t, arg1_uint32_t); ++} ++ ++/* { dg-final { scan-assembler "crc32cw\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/acle/crc32ch.c ++++ b/src/gcc/testsuite/gcc.target/arm/acle/crc32ch.c +@@ -0,0 +1,20 @@ ++/* Test the crc32ch ACLE intrinsic. */ ++ ++/* { dg-do assemble } */ ++/* { dg-require-effective-target arm_crc_ok } */ ++/* { dg-options "-save-temps -O0" } */ ++/* { dg-add-options arm_crc } */ ++ ++#include "arm_acle.h" ++ ++void test_crc32ch (void) ++{ ++ uint32_t out_uint32_t; ++ uint32_t arg0_uint32_t; ++ uint16_t arg1_uint16_t; ++ ++ out_uint32_t = __crc32ch (arg0_uint32_t, arg1_uint16_t); ++} ++ ++/* { dg-final { scan-assembler "crc32ch\t...?, ...?, ...?\n" } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/arm/iordi3-opt.c ++++ b/src/gcc/testsuite/gcc.target/arm/iordi3-opt.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++ ++unsigned long long or64 (unsigned long long input) ++{ ++ return input | 0x200000004ULL; ++} ++ ++/* { dg-final { scan-assembler-not "mov\[\\t \]+.+,\[\\t \]*.+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32_t hash = 0xdeadbeef; ++ uint32x4_t a = {0, 1, 2, 3}; ++ uint32x4_t b = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha1pq_u32 (a, hash, b); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha1p.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-relaxed.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-relaxed.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-relaxed.x" ++ ++/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselgesf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselgesf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i >= 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselge.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/peep-strd-1.c ++++ b/src/gcc/testsuite/gcc.target/arm/peep-strd-1.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_prefer_ldrd_strd } */ ++/* { dg-options "-O2" } */ ++void foo(int a, int b, int* p) ++{ ++ p[2] = a; ++ p[3] = b; ++} ++/* { dg-final { scan-assembler "strd" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1su1q_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1su1q_u32.c +@@ -0,0 +1,17 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ ++ uint32x4_t res = vsha1su1q_u32 (a, b); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha1su1.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vmullp64.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vmullp64.c +@@ -0,0 +1,15 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++poly128_t ++foo (void) ++{ ++ poly64_t a = 0xdeadbeef; ++ poly64_t b = 0xadadadad; ++ return vmull_p64 (a, b); ++} ++ ++/* { dg-final { scan-assembler "vmull.p64.*" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/lp1243022.c ++++ b/src/gcc/testsuite/gcc.target/arm/lp1243022.c +@@ -0,0 +1,201 @@ ++/* { dg-do compile { target arm_thumb2 } } */ ++/* { dg-options "-O2 -fdump-rtl-subreg2" } */ ++ ++/* { dg-final { scan-rtl-dump "REG_INC" "subreg2" { target { ! arm_neon } } } } */ ++/* { dg-final { cleanup-rtl-dump "subreg2" } } */ ++struct device; ++typedef unsigned int __u32; ++typedef unsigned long long u64; ++typedef __u32 __le32; ++typedef u64 dma_addr_t; ++typedef unsigned gfp_t; ++int dev_warn (const struct device *dev, const char *fmt, ...); ++struct usb_bus ++{ ++ struct device *controller; ++}; ++struct usb_hcd ++{ ++ struct usb_bus self; ++}; ++struct xhci_generic_trb ++{ ++ __le32 field[4]; ++}; ++union xhci_trb ++{ ++ struct xhci_generic_trb generic; ++}; ++struct xhci_segment ++{ ++ union xhci_trb *trbs; ++ dma_addr_t dma; ++}; ++struct xhci_ring ++{ ++ struct xhci_segment *first_seg; ++}; ++struct xhci_hcd ++{ ++ struct xhci_ring *cmd_ring; ++ struct xhci_ring *event_ring; ++}; ++struct usb_hcd *xhci_to_hcd (struct xhci_hcd *xhci) ++{ ++} ++dma_addr_t xhci_trb_virt_to_dma (struct xhci_segment * seg, ++ union xhci_trb * trb); ++struct xhci_segment *trb_in_td (struct xhci_segment *start_seg, ++ dma_addr_t suspect_dma); ++xhci_test_trb_in_td (struct xhci_hcd *xhci, struct xhci_segment *input_seg, ++ union xhci_trb *start_trb, union xhci_trb *end_trb, ++ dma_addr_t input_dma, struct xhci_segment *result_seg, ++ char *test_name, int test_number) ++{ ++ unsigned long long start_dma; ++ unsigned long long end_dma; ++ struct xhci_segment *seg; ++ start_dma = xhci_trb_virt_to_dma (input_seg, start_trb); ++ end_dma = xhci_trb_virt_to_dma (input_seg, end_trb); ++ { ++ dev_warn (xhci_to_hcd (xhci)->self.controller, ++ "%d\n", test_number); ++ dev_warn (xhci_to_hcd (xhci)->self.controller, ++ "Expected seg %p, got seg %p\n", result_seg, seg); ++ } ++} ++xhci_check_trb_in_td_math (struct xhci_hcd *xhci, gfp_t mem_flags) ++{ ++ struct ++ { ++ dma_addr_t input_dma; ++ struct xhci_segment *result_seg; ++ } ++ simple_test_vector[] = ++ { ++ { ++ 0, ((void *) 0) ++ } ++ , ++ { ++ xhci->event_ring->first_seg->dma - 16, ((void *) 0)} ++ , ++ { ++ xhci->event_ring->first_seg->dma - 1, ((void *) 0)} ++ , ++ { ++ xhci->event_ring->first_seg->dma, xhci->event_ring->first_seg} ++ , ++ { ++ xhci->event_ring->first_seg->dma + (64 - 1) * 16, ++ xhci->event_ring->first_seg ++ } ++ , ++ { ++ xhci->event_ring->first_seg->dma + (64 - 1) * 16 + 1, ((void *) 0)} ++ , ++ { ++ xhci->event_ring->first_seg->dma + (64) * 16, ((void *) 0)} ++ , ++ { ++ (dma_addr_t) (~0), ((void *) 0) ++ } ++ }; ++ struct ++ { ++ struct xhci_segment *input_seg; ++ union xhci_trb *start_trb; ++ union xhci_trb *end_trb; ++ dma_addr_t input_dma; ++ struct xhci_segment *result_seg; ++ } ++ complex_test_vector[] = ++ { ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ xhci->event_ring->first_seg->trbs,.end_trb = ++ &xhci->event_ring->first_seg->trbs[64 - 1],.input_dma = ++ xhci->cmd_ring->first_seg->dma,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ xhci->event_ring->first_seg->trbs,.end_trb = ++ &xhci->cmd_ring->first_seg->trbs[64 - 1],.input_dma = ++ xhci->cmd_ring->first_seg->dma,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ xhci->cmd_ring->first_seg->trbs,.end_trb = ++ &xhci->cmd_ring->first_seg->trbs[64 - 1],.input_dma = ++ xhci->cmd_ring->first_seg->dma,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ &xhci->event_ring->first_seg->trbs[0],.end_trb = ++ &xhci->event_ring->first_seg->trbs[3],.input_dma = ++ xhci->event_ring->first_seg->dma + 4 * 16,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ &xhci->event_ring->first_seg->trbs[3],.end_trb = ++ &xhci->event_ring->first_seg->trbs[6],.input_dma = ++ xhci->event_ring->first_seg->dma + 2 * 16,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ &xhci->event_ring->first_seg->trbs[64 - 3],.end_trb = ++ &xhci->event_ring->first_seg->trbs[1],.input_dma = ++ xhci->event_ring->first_seg->dma + 2 * 16,.result_seg = ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ &xhci->event_ring->first_seg->trbs[64 - 3],.end_trb = ++ &xhci->event_ring->first_seg->trbs[1],.input_dma = ++ xhci->event_ring->first_seg->dma + (64 - 4) * 16,.result_seg = ++ ((void *) 0), ++ } ++ , ++ { ++ .input_seg = xhci->event_ring->first_seg,.start_trb = ++ &xhci->event_ring->first_seg->trbs[64 - 3],.end_trb = ++ &xhci->event_ring->first_seg->trbs[1],.input_dma = ++ xhci->cmd_ring->first_seg->dma + 2 * 16,.result_seg = ((void *) 0), ++ } ++ }; ++ unsigned int num_tests; ++ int i, ret; ++ num_tests = ++ (sizeof (simple_test_vector) / sizeof ((simple_test_vector)[0]) + ++ (sizeof (struct ++ { ++ } ++ ))); ++ for (i = 0; i < num_tests; i++) ++ { ++ ret = ++ xhci_test_trb_in_td (xhci, xhci->event_ring->first_seg, ++ xhci->event_ring->first_seg->trbs, ++ &xhci->event_ring->first_seg->trbs[64 - 1], ++ simple_test_vector[i].input_dma, ++ simple_test_vector[i].result_seg, "Simple", i); ++ if (ret < 0) ++ return ret; ++ } ++ for (i = 0; i < num_tests; i++) ++ { ++ ret = ++ xhci_test_trb_in_td (xhci, complex_test_vector[i].input_seg, ++ complex_test_vector[i].start_trb, ++ complex_test_vector[i].end_trb, ++ complex_test_vector[i].input_dma, ++ complex_test_vector[i].result_seg, "Complex", i); ++ if (ret < 0) ++ return ret; ++ } ++} +--- a/src/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-comp-swap-release-acquire.x" ++ ++/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 4 } } */ ++/* { dg-final { scan-assembler-times "stlex" 4 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/pr19599.c ++++ b/src/gcc/testsuite/gcc.target/arm/pr19599.c +@@ -0,0 +1,10 @@ ++/* { dg-skip-if "need at least armv5te" { *-*-* } { "-march=armv[234]*" "-mthumb" } { "" } } */ ++/* { dg-options "-O2 -march=armv5te -marm" } */ ++/* { dg-final { scan-assembler "bx" } } */ ++ ++int (*indirect_func)(); ++ ++int indirect_call() ++{ ++ return indirect_func(); ++} +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vstrq_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vstrq_p128.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++void ++foo (poly128_t* ptr, poly128_t val) ++{ ++ vstrq_p128 (ptr, val); ++} ++ ++/* { dg-final { scan-assembler "vst1.64\t{d\[0-9\]+-d\[0-9\]+}.*" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-seq_cst.x" ++ ++/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselgedf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselgedf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i >= 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselge.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-consume.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-consume.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-consume.x" ++ ++/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-char.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-char.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-char.x" ++ ++/* { dg-final { scan-assembler-times "ldrexb\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strexb\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/thumb-ltu.c ++++ b/src/gcc/testsuite/gcc.target/arm/thumb-ltu.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-skip-if "incompatible options" { arm*-*-* } { "-march=*" } { "-march=armv6" "-march=armv6j" "-march=armv6z" } } */ ++/* { dg-require-effective-target arm_thumb1_ok } */ + /* { dg-options "-mcpu=arm1136jf-s -mthumb -O2" } */ + + void f(unsigned a, unsigned b, unsigned c, unsigned d) +--- a/src/gcc/testsuite/gcc.target/arm/vselnesf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselnesf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i != 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vseleq.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vaesmcq_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vaesmcq_u8.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint8x16_t a, b; ++ int i = 0; ++ ++ for (i = 0; i < 16; ++i) ++ a[i] = i; ++ ++ b = vaesmcq_u8 (a); ++ return b[0]; ++} ++ ++/* { dg-final { scan-assembler "aesmc.8\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselvcsf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselvcsf.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ return !__builtin_isunordered (x, y) ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselvs.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha256hq_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha256hq_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ uint32x4_t c = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha256hq_u32 (a, b, c); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha256h.32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/minmax_minus.c ++++ b/src/gcc/testsuite/gcc.target/arm/minmax_minus.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_cond_exec } */ ++/* { dg-options "-O2" } */ ++ ++#define MAX(a, b) (a > b ? a : b) ++int ++foo (int a, int b, int c) ++{ ++ return c - MAX (a, b); ++} ++ ++/* { dg-final { scan-assembler-not "mov" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-release.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-release.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-release.x" ++ ++/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselvssf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselvssf.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ return __builtin_isunordered (x, y) ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselvs.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32_t hash = 0xdeadbeef; ++ uint32x4_t a = {0, 1, 2, 3}; ++ uint32x4_t b = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha1cq_u32 (a, hash, b); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha1c.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vaeseq_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vaeseq_u8.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint8x16_t a, b, c; ++ int i = 0; ++ ++ for (i = 0; i < 16; ++i) ++ { ++ a[i] = i; ++ b[i] = 15 - i; ++ } ++ c = vaeseq_u8 (a, b); ++ return c[0]; ++} ++ ++/* { dg-final { scan-assembler "aese.8\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-roundf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-roundf.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_neon_ok } */ ++/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */ ++/* { dg-add-options arm_v8_neon } */ ++ ++#define N 32 ++ ++void ++foo (float *output, float *input) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = __builtin_roundf (input[i]); ++} ++ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_roundf } } } */ ++/* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon-vtst_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-vtst_p64.c +@@ -0,0 +1,38 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-require-effective-target arm_neon_hw } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++#include ++ ++extern void abort (void); ++ ++int ++main (void) ++{ ++ uint64_t args[] = { 0x0, 0xdeadbeef, ~0xdeadbeef, 0xffff, ++ ~0xffff, 0xffffffff, ~0xffffffff, ~0x0 }; ++ int i, j; ++ ++ for (i = 0; i < sizeof (args) / sizeof (args[0]); ++i) ++ { ++ for (j = 0; j < sizeof (args) / sizeof (args[0]); ++j) ++ { ++ uint64_t a1 = args[i]; ++ uint64_t a2 = args[j]; ++ uint64_t res = vtst_p64 (vreinterpret_p64_u64 (a1), ++ vreinterpret_p64_u64 (a2)); ++ uint64_t exp = (a1 & a2) ? ~0x0 : 0x0; ++ ++ if (res != exp) ++ { ++ fprintf (stderr, "vtst_p64 (a1= %lx, a2= %lx)" ++ " returned %lx, expected %lx\n", ++ a1, a2, res, exp); ++ abort (); ++ } ++ } ++ } ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/arm/neon-for-64bits-1.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-for-64bits-1.c +@@ -0,0 +1,54 @@ ++/* Check that Neon is *not* used by default to handle 64-bits scalar ++ operations. */ ++ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_neon_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_neon } */ ++ ++typedef long long i64; ++typedef unsigned long long u64; ++typedef unsigned int u32; ++typedef int i32; ++ ++/* Unary operators */ ++#define UNARY_OP(name, op) \ ++ void unary_##name(u64 *a, u64 *b) { *a = op (*b + 0x1234567812345678ULL) ; } ++ ++/* Binary operators */ ++#define BINARY_OP(name, op) \ ++ void binary_##name(u64 *a, u64 *b, u64 *c) { *a = *b op *c ; } ++ ++/* Unsigned shift */ ++#define SHIFT_U(name, op, amount) \ ++ void ushift_##name(u64 *a, u64 *b, int c) { *a = *b op amount; } ++ ++/* Signed shift */ ++#define SHIFT_S(name, op, amount) \ ++ void sshift_##name(i64 *a, i64 *b, int c) { *a = *b op amount; } ++ ++UNARY_OP(not, ~) ++ ++BINARY_OP(add, +) ++BINARY_OP(sub, -) ++BINARY_OP(and, &) ++BINARY_OP(or, |) ++BINARY_OP(xor, ^) ++ ++SHIFT_U(right1, >>, 1) ++SHIFT_U(right2, >>, 2) ++SHIFT_U(right5, >>, 5) ++SHIFT_U(rightn, >>, c) ++ ++SHIFT_S(right1, >>, 1) ++SHIFT_S(right2, >>, 2) ++SHIFT_S(right5, >>, 5) ++SHIFT_S(rightn, >>, c) ++ ++/* { dg-final {scan-assembler-times "vmvn" 0} } */ ++/* { dg-final {scan-assembler-times "vadd" 0} } */ ++/* { dg-final {scan-assembler-times "vsub" 0} } */ ++/* { dg-final {scan-assembler-times "vand" 0} } */ ++/* { dg-final {scan-assembler-times "vorr" 0} } */ ++/* { dg-final {scan-assembler-times "veor" 0} } */ ++/* { dg-final {scan-assembler-times "vshr" 0} } */ +--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-2.c ++++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-2.c +@@ -4,7 +4,7 @@ + + #include + +-char dest[16]; ++char dest[16] = { 0 }; + + void aligned_dest (char *src) + { +@@ -14,7 +14,10 @@ + /* Expect a multi-word store for the main part of the copy, but subword + loads/stores for the remainder. */ + +-/* { dg-final { scan-assembler-times "stmia" 1 } } */ ++/* { dg-final { scan-assembler-times "ldmia" 0 } } */ ++/* { dg-final { scan-assembler-times "ldrd" 0 } } */ ++/* { dg-final { scan-assembler-times "stmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ ++/* { dg-final { scan-assembler-times "strd" 1 { target { arm_prefer_ldrd_strd } } } } */ + /* { dg-final { scan-assembler-times "ldrh" 1 } } */ + /* { dg-final { scan-assembler-times "strh" 1 } } */ + /* { dg-final { scan-assembler-times "ldrb" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c +@@ -0,0 +1,14 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32_t val = 0xdeadbeef; ++ return vsha1h_u32 (val); ++} ++ ++/* { dg-final { scan-assembler "sha1h.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/xordi3-opt.c ++++ b/src/gcc/testsuite/gcc.target/arm/xordi3-opt.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++ ++unsigned long long xor64 (unsigned long long input) ++{ ++ return input ^ 0x200000004ULL; ++} ++ ++/* { dg-final { scan-assembler-not "mov\[\\t \]+.+,\[\\t \]*.+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha256su1q_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha256su1q_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ uint32x4_t c = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha256su1q_u32 (a, b, c); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha256su1.32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-acq_rel.x" ++ ++/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselltsf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselltsf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i < 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselge.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselnedf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselnedf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i != 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vseleq.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselvcdf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselvcdf.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ return !__builtin_isunordered (x, y) ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselvs.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-btruncf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-btruncf.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_neon_ok } */ ++/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */ ++/* { dg-add-options arm_v8_neon } */ ++ ++#define N 32 ++ ++void ++foo (float *output, float *input) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = __builtin_truncf (input[i]); ++} ++ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_btruncf } } } */ ++/* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vseleqsf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vseleqsf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i == 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vseleq.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/ivopts-orig_biv-inc.c ++++ b/src/gcc/testsuite/gcc.target/arm/ivopts-orig_biv-inc.c +@@ -0,0 +1,19 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ ++/* { dg-skip-if "" { arm_thumb1 } } */ ++ ++extern char *__ctype_ptr__; ++ ++unsigned char * foo(unsigned char *ReadPtr) ++{ ++ ++ unsigned char c; ++ ++ while (!(((__ctype_ptr__+sizeof(""[*ReadPtr]))[(int)(*ReadPtr)])&04) == (!(0))) ++ ReadPtr++; ++ ++ return ReadPtr; ++} ++ ++/* { dg-final { scan-tree-dump-times "original biv" 2 "ivopts"} } */ ++/* { dg-final { cleanup-tree-dump "ivopts" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselvsdf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselvsdf.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ return __builtin_isunordered (x, y) ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselvs.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-3.c ++++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-3.c +@@ -4,7 +4,7 @@ + + #include + +-char src[16]; ++char src[16] = {0}; + + void aligned_src (char *dest) + { +@@ -14,8 +14,11 @@ + /* Expect a multi-word load for the main part of the copy, but subword + loads/stores for the remainder. */ + +-/* { dg-final { scan-assembler-times "ldmia" 1 } } */ +-/* { dg-final { scan-assembler-times "ldrh" 1 } } */ ++/* { dg-final { scan-assembler-times "ldmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ ++/* { dg-final { scan-assembler-times "ldrd" 1 { target { arm_prefer_ldrd_strd } } } } */ ++/* { dg-final { scan-assembler-times "strd" 0 } } */ ++/* { dg-final { scan-assembler-times "stm" 0 } } */ ++/* { dg-final { scan-assembler-times "ldrh" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ + /* { dg-final { scan-assembler-times "strh" 1 } } */ +-/* { dg-final { scan-assembler-times "ldrb" 1 } } */ ++/* { dg-final { scan-assembler-times "ldrb" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ + /* { dg-final { scan-assembler-times "strb" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/pr46975-2.c ++++ b/src/gcc/testsuite/gcc.target/arm/pr46975-2.c +@@ -0,0 +1,10 @@ ++/* { dg-options "-mthumb -O2" } */ ++/* { dg-require-effective-target arm_thumb2_ok } */ ++/* { dg-final { scan-assembler "sub" } } */ ++/* { dg-final { scan-assembler "clz" } } */ ++/* { dg-final { scan-assembler "lsr.*#5" } } */ ++ ++int foo (int s) ++{ ++ return s == 1; ++} +--- a/src/gcc/testsuite/gcc.target/arm/neon-vceq_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-vceq_p64.c +@@ -0,0 +1,38 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-require-effective-target arm_neon_hw } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++#include ++ ++extern void abort (void); ++ ++int ++main (void) ++{ ++ uint64_t args[] = { 0x0, 0xdeadbeef, ~0xdeadbeef, 0xffff, ++ ~0xffff, 0xffffffff, ~0xffffffff, ~0x0 }; ++ int i, j; ++ ++ for (i = 0; i < sizeof (args) / sizeof (args[0]); ++i) ++ { ++ for (j = 0; j < sizeof (args) / sizeof (args[0]); ++j) ++ { ++ uint64_t a1 = args[i]; ++ uint64_t a2 = args[j]; ++ uint64_t res = vceq_p64 (vreinterpret_p64_u64 (a1), ++ vreinterpret_p64_u64 (a2)); ++ uint64_t exp = (a1 == a2) ? ~0x0 : 0x0; ++ ++ if (res != exp) ++ { ++ fprintf (stderr, "vceq_p64 (a1= %lx, a2= %lx)" ++ " returned %lx, expected %lx\n", ++ a1, a2, res, exp); ++ abort (); ++ } ++ } ++ } ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c ++++ b/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++ ++long long muld(long long X, long long Y) ++{ ++ return X & ~1; ++} ++ ++/* { dg-final { scan-assembler-not "and\[\\t \]+.+,\[\\t \]*.+,\[\\t \]*.+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon-vcond-ltgt.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-vcond-ltgt.c +@@ -15,4 +15,4 @@ + + /* { dg-final { scan-assembler-times "vcgt\\.f32\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" 2 } } */ + /* { dg-final { scan-assembler "vorr\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +-/* { dg-final { scan-assembler "vbsl\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "vbsl|vbit|vbif\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha256h2q_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha256h2q_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ uint32x4_t c = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha256h2q_u32 (a, b, c); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha256h2.32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselltdf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselltdf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i < 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselge.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-4.c ++++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-4.c +@@ -4,8 +4,8 @@ + + #include + +-char src[16]; +-char dest[16]; ++char src[16] = { 0 }; ++char dest[16] = { 0 }; + + void aligned_both (void) + { +@@ -14,5 +14,9 @@ + + /* We know both src and dest to be aligned: expect multiword loads/stores. */ + +-/* { dg-final { scan-assembler-times "ldmia" 1 } } */ +-/* { dg-final { scan-assembler-times "stmia" 1 } } */ ++/* { dg-final { scan-assembler-times "ldmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ ++/* { dg-final { scan-assembler-times "stmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */ ++/* { dg-final { scan-assembler "ldrd" { target { arm_prefer_ldrd_strd } } } } */ ++/* { dg-final { scan-assembler-times "ldm" 0 { target { arm_prefer_ldrd_strd } } } } */ ++/* { dg-final { scan-assembler "strd" { target { arm_prefer_ldrd_strd } } } } */ ++/* { dg-final { scan-assembler-times "stm" 0 { target { arm_prefer_ldrd_strd } } } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vseleqdf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vseleqdf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i == 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vseleq.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-acquire.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-acquire.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-acquire.x" ++ ++/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vsellesf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vsellesf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i <= 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselgt.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/neon-vcond-unordered.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-vcond-unordered.c +@@ -16,4 +16,4 @@ + /* { dg-final { scan-assembler "vcgt\\.f32\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ + /* { dg-final { scan-assembler "vcge\\.f32\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ + /* { dg-final { scan-assembler "vorr\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +-/* { dg-final { scan-assembler "vbsl\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "vbsl|vbit|vbif\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1su0q_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1su0q_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32x4_t a = {0xd, 0xe, 0xa, 0xd}; ++ uint32x4_t b = {0, 1, 2, 3}; ++ uint32x4_t c = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha1su0q_u32 (a, b, c); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha1su0.32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vmull_high_p64.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vmull_high_p64.c +@@ -0,0 +1,15 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++poly128_t ++foo (void) ++{ ++ poly64x2_t a = { 0xdeadbeef, 0xadabcaca }; ++ poly64x2_t b = { 0xdcdcdcdc, 0xbdbdbdbd }; ++ return vmull_high_p64 (a, b); ++} ++ ++/* { dg-final { scan-assembler "vmull.p64.*" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-int.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-int.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-int.x" ++ ++/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint32_t hash = 0xdeadbeef; ++ uint32x4_t a = {0, 1, 2, 3}; ++ uint32x4_t b = {3, 2, 1, 0}; ++ ++ uint32x4_t res = vsha1mq_u32 (a, hash, b); ++ return res[0]; ++} ++ ++/* { dg-final { scan-assembler "sha1m.32\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vldrq_p128.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vldrq_p128.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++poly128_t ++foo (poly128_t* ptr) ++{ ++ return vldrq_p128 (ptr); ++} ++ ++/* { dg-final { scan-assembler "vld1.64\t{d\[0-9\]+-d\[0-9\]+}.*" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-short.c ++++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-short.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_arch_v8a_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_arch_v8a } */ ++ ++#include "../aarch64/atomic-op-short.x" ++ ++/* { dg-final { scan-assembler-times "ldrexh\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-times "strexh\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */ ++/* { dg-final { scan-assembler-not "dmb" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/pr40887.c ++++ b/src/gcc/testsuite/gcc.target/arm/pr40887.c +@@ -2,9 +2,9 @@ + /* { dg-options "-O2 -march=armv5te" } */ + /* { dg-final { scan-assembler "blx" } } */ + +-int (*indirect_func)(); ++int (*indirect_func)(int x); + + int indirect_call() + { +- return indirect_func(); ++ return indirect_func(20) + indirect_func (40); + } +--- a/src/gcc/testsuite/gcc.target/arm/crypto-vaesimcq_u8.c ++++ b/src/gcc/testsuite/gcc.target/arm/crypto-vaesimcq_u8.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_crypto_ok } */ ++/* { dg-add-options arm_crypto } */ ++ ++#include "arm_neon.h" ++ ++int ++foo (void) ++{ ++ uint8x16_t a, b; ++ int i = 0; ++ ++ for (i = 0; i < 16; ++i) ++ a[i] = i; ++ ++ b = vaesimcq_u8 (a); ++ return b[0]; ++} ++ ++/* { dg-final { scan-assembler "aesimc.8\tq\[0-9\]+, q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_neon_ok } */ ++/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */ ++/* { dg-add-options arm_v8_neon } */ ++ ++#define N 32 ++ ++void ++foo (float *output, float *input) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = __builtin_ceilf (input[i]); ++} ++ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_ceilf } } } */ ++/* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselledf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselledf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++double ++foo (double x, double y) ++{ ++ volatile int i = 0; ++ return i <= 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselgt.f64\td\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/vselgtsf.c ++++ b/src/gcc/testsuite/gcc.target/arm/vselgtsf.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_v8_vfp_ok } */ ++/* { dg-options "-O2" } */ ++/* { dg-add-options arm_v8_vfp } */ ++ ++float ++foo (float x, float y) ++{ ++ volatile int i = 0; ++ return i > 0 ? x : y; ++} ++ ++/* { dg-final { scan-assembler-times "vselgt.f32\ts\[0-9\]+" 1 } } */ +--- a/src/gcc/testsuite/gcc.target/arm/pr58578.c ++++ b/src/gcc/testsuite/gcc.target/arm/pr58578.c +@@ -0,0 +1,54 @@ ++ ++/* PR target/58578 */ ++/* { dg-do run } */ ++/* { dg-options "-O1" } */ ++ ++#include ++ ++typedef struct { ++ long _prec; ++ int _flag; ++ long _exp; ++} __my_st_t; ++ ++typedef __my_st_t *__my_st_ptr; ++ ++int ++_test_fn (__my_st_ptr y, const __my_st_ptr xt) ++{ ++ int inexact; ++ if (xt->_exp != -2147483647L) ++ { ++ (y->_flag = xt->_flag); ++ } ++ ++ do { ++ __my_st_ptr _y = y; ++ long _err1 = -2 * xt->_exp; ++ long _err2 = 2; ++ if (0 < _err1) ++ { ++ unsigned long _err = (unsigned long) _err1 + _err2; ++ if (__builtin_expect(!!(_err > _y->_prec + 1), 0)) ++ return 2; ++ return 3; ++ } ++ } while (0); ++ ++ return 0; ++} ++ ++int main () ++{ ++ __my_st_t x, y; ++ long pz; ++ int inex; ++ ++ x._prec = 914; ++ y._exp = 18; ++ if (_test_fn (&x, &y)) ++ { ++ abort(); ++ } ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/arm/neon-vcond-gt.c ++++ b/src/gcc/testsuite/gcc.target/arm/neon-vcond-gt.c +@@ -14,4 +14,4 @@ + } + + /* { dg-final { scan-assembler "vcgt\\.f32\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +-/* { dg-final { scan-assembler "vbit\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "vbsl|vbit|vbif\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+,\[\\t \]*q\[0-9\]+" } } */ +--- a/src/gcc/testsuite/gcc.target/arm/pr57637.c ++++ b/src/gcc/testsuite/gcc.target/arm/pr57637.c +@@ -0,0 +1,206 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fno-inline" } */ ++ ++typedef struct _GtkCssStyleProperty GtkCssStyleProperty; ++ ++struct _GtkCssStyleProperty ++{ ++ int *initial_value; ++ unsigned int id; ++ unsigned int inherit :1; ++ unsigned int animated :1; ++ unsigned int affects_size :1; ++ unsigned int affects_font :1; ++ ++ int * parse_value; ++ int * query_value; ++ int * assign_value; ++}; ++ ++void ++g_assertion_message_expr (const char *domain, ++ const char *file, ++ int line, ++ const char *func, ++ const char *expr) __attribute__((__noreturn__)); ++ ++void ++g_assertion_message_expr (const char *domain, ++ const char *file, ++ int line, ++ const char *func, ++ const char *expr) ++{ ++ __builtin_abort (); ++} ++int ++get_id (GtkCssStyleProperty *property) ++{ ++ return 1; ++} ++int ++_gtk_css_style_property_get_type () ++{ ++ return 1; ++} ++ ++GtkCssStyleProperty * ++g_object_new (int object_type, ++ const char *first_property_name, ++ ...) ++{ ++ return (GtkCssStyleProperty *) __builtin_malloc (sizeof (GtkCssStyleProperty)); ++} ++ ++typedef enum { ++ INHERIT = (1 << 0), ++ ANIMATED = (1 << 1), ++ RESIZE = (1 << 2), ++ FONT = (1 << 3) ++} GtkStylePropertyFlags; ++ ++int t = 0; ++void ++gtk_css_style_property_register (const char * name, ++ int expected_id, ++ int value_type, ++ int flags, ++ int *parse_value, ++ int *query_value, ++ int *assign_value, ++ int *initial_value) ++{ ++ GtkCssStyleProperty *node; ++ ++ do ++ { ++ if (__builtin_expect (__extension__ ( ++ { ++ int _g_boolean_var_; ++ if (initial_value != ((void *)0)) ++ _g_boolean_var_ = 1; ++ else ++ _g_boolean_var_ = 0; ++ _g_boolean_var_; ++ }), ++ 1)) ++ ; ++ else ++ g_assertion_message_expr ("Gtk", ++ "gtkcssstylepropertyimpl.c", ++ 85, ++ ((const char*) (__PRETTY_FUNCTION__)), ++ "initial_value != NULL"); ++ } while (0); ++ ++ do ++ { ++ if (__builtin_expect (__extension__ ( ++ { ++ int _g_boolean_var_; ++ if (parse_value != ((void *)0)) ++ _g_boolean_var_ = 1; ++ else ++ _g_boolean_var_ = 0; ++ _g_boolean_var_; ++ }), ++ 1)) ++ ; ++ else ++ g_assertion_message_expr ("Gtk", ++ "gtkcssstylepropertyimpl.c", ++ 86, ++ ((const char*) (__PRETTY_FUNCTION__)), ++ "parse_value != NULL"); ++ } while (0); ++ ++ do ++ { ++ if (__builtin_expect (__extension__ ( ++ { ++ int _g_boolean_var_; ++ if (value_type == ((int) ((1) << (2))) ++ || query_value != ((void *)0)) ++ _g_boolean_var_ = 1; ++ else ++ _g_boolean_var_ = 0; ++ _g_boolean_var_; ++ }), ++ 1)) ++ ; ++ else ++ g_assertion_message_expr ("Gtk", ++ "gtkcssstylepropertyimpl.c", ++ 87, ((const char*) (__PRETTY_FUNCTION__)), ++ "value_type == NONE || query_value != NULL"); ++ } while (0); ++ ++ /* FLAGS is changed in a cond_exec instruction with pr57637. */ ++ if (flags == 15) ++ t = 15; ++ ++ do ++ { ++ if (__builtin_expect (__extension__ ( ++ { ++ int _g_boolean_var_; ++ if (value_type == ((1) << (2)) ++ || assign_value != ((void *)0)) ++ _g_boolean_var_ = 1; ++ else ++ _g_boolean_var_ = 0; ++ _g_boolean_var_; ++ }), ++ 1)) ++ ; ++ else ++ g_assertion_message_expr ("Gtk", ++ "gtkcssstylepropertyimpl.c", ++ 88, ((const char*) (__PRETTY_FUNCTION__)), ++ "value_type == NONE || assign_value != NULL"); ++ } while (0); ++ ++ node = g_object_new ((_gtk_css_style_property_get_type ()), ++ "value-type", value_type, ++ "affects-size", (flags & RESIZE) ? (0) : (!(0)), ++ "affects-font", (flags & FONT) ? (!(0)) : (0), ++ "animated", (flags & ANIMATED) ? (!(0)) : (0), ++ "inherit", (flags & INHERIT) ? (!(0)) : (0), ++ "initial-value", initial_value, ++ "name", name, ++ ((void *)0)); ++ ++ node->parse_value = parse_value; ++ node->query_value = query_value; ++ node->assign_value = assign_value; ++ ++ do ++ { ++ if (__builtin_expect (__extension__ ( ++ { ++ int _g_boolean_var_; ++ if (get_id (node) == expected_id) ++ _g_boolean_var_ = 1; ++ else ++ _g_boolean_var_ = 0; ++ _g_boolean_var_; ++ }), ++ 1)) ++ ; ++ else ++ g_assertion_message_expr ("Gtk", ++ "gtkcssstylepropertyimpl.c", ++ 106, ++ ((const char*) (__PRETTY_FUNCTION__)), ++ "get_id (node) == expected_id"); ++ } while (0); ++} ++ ++int main () ++{ ++ gtk_css_style_property_register ("test", 1, 4, 15, &t, &t, &t, &t); ++ ++ if (t != 15) ++ __builtin_abort (); ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/insv_2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/insv_2.c +@@ -0,0 +1,85 @@ ++/* { dg-do run { target aarch64*-*-* } } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++/* { dg-require-effective-target aarch64_big_endian } */ ++ ++extern void abort (void); ++ ++typedef struct bitfield ++{ ++ unsigned short eight: 8; ++ unsigned short four: 4; ++ unsigned short five: 5; ++ unsigned short seven: 7; ++ unsigned int sixteen: 16; ++} bitfield; ++ ++bitfield ++bfi1 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 56, 8" } } */ ++ a.eight = 3; ++ return a; ++} ++ ++bitfield ++bfi2 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 43, 5" } } */ ++ a.five = 7; ++ return a; ++} ++ ++bitfield ++movk (bitfield a) ++{ ++ /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 16" } } */ ++ a.sixteen = 7531; ++ return a; ++} ++ ++bitfield ++set1 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 272678883688448" } } */ ++ a.five = 0x1f; ++ return a; ++} ++ ++bitfield ++set0 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -272678883688449" } } */ ++ a.five = 0; ++ return a; ++} ++ ++ ++int ++main (int argc, char** argv) ++{ ++ static bitfield a; ++ bitfield b = bfi1 (a); ++ bitfield c = bfi2 (b); ++ bitfield d = movk (c); ++ ++ if (d.eight != 3) ++ abort (); ++ ++ if (d.five != 7) ++ abort (); ++ ++ if (d.sixteen != 7531) ++ abort (); ++ ++ d = set1 (d); ++ if (d.five != 0x1f) ++ abort (); ++ ++ d = set0 (d); ++ if (d.five != 0) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vrecps.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vrecps.c +@@ -0,0 +1,144 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++#include ++#include ++ ++int ++test_frecps_float32_t (void) ++{ ++ int i; ++ float32_t value = 0.2; ++ float32_t reciprocal = 5.0; ++ float32_t step = vrecpes_f32 (value); ++ /* 3 steps should give us within ~0.001 accuracy. */ ++ for (i = 0; i < 3; i++) ++ step = step * vrecpss_f32 (step, value); ++ ++ return fabs (step - reciprocal) < 0.001; ++} ++ ++/* { dg-final { scan-assembler "frecpe\\ts\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "frecps\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */ ++ ++int ++test_frecps_float32x2_t (void) ++{ ++ int i; ++ int ret = 1; ++ ++ const float32_t value_pool[] = {0.2, 0.4}; ++ const float32_t reciprocal_pool[] = {5.0, 2.5}; ++ float32x2_t value = vld1_f32 (value_pool); ++ float32x2_t reciprocal = vld1_f32 (reciprocal_pool); ++ ++ float32x2_t step = vrecpe_f32 (value); ++ /* 3 steps should give us within ~0.001 accuracy. */ ++ for (i = 0; i < 3; i++) ++ step = step * vrecps_f32 (step, value); ++ ++ ret &= fabs (vget_lane_f32 (step, 0) ++ - vget_lane_f32 (reciprocal, 0)) < 0.001; ++ ret &= fabs (vget_lane_f32 (step, 1) ++ - vget_lane_f32 (reciprocal, 1)) < 0.001; ++ ++ return ret; ++} ++ ++/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.2s, v\[0-9\]+.2s" } } */ ++/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.2s, v\[0-9\]+.2s, v\[0-9\]+.2s" } } */ ++ ++int ++test_frecps_float32x4_t (void) ++{ ++ int i; ++ int ret = 1; ++ ++ const float32_t value_pool[] = {0.2, 0.4, 0.5, 0.8}; ++ const float32_t reciprocal_pool[] = {5.0, 2.5, 2.0, 1.25}; ++ float32x4_t value = vld1q_f32 (value_pool); ++ float32x4_t reciprocal = vld1q_f32 (reciprocal_pool); ++ ++ float32x4_t step = vrecpeq_f32 (value); ++ /* 3 steps should give us within ~0.001 accuracy. */ ++ for (i = 0; i < 3; i++) ++ step = step * vrecpsq_f32 (step, value); ++ ++ ret &= fabs (vgetq_lane_f32 (step, 0) ++ - vgetq_lane_f32 (reciprocal, 0)) < 0.001; ++ ret &= fabs (vgetq_lane_f32 (step, 1) ++ - vgetq_lane_f32 (reciprocal, 1)) < 0.001; ++ ret &= fabs (vgetq_lane_f32 (step, 2) ++ - vgetq_lane_f32 (reciprocal, 2)) < 0.001; ++ ret &= fabs (vgetq_lane_f32 (step, 3) ++ - vgetq_lane_f32 (reciprocal, 3)) < 0.001; ++ ++ return ret; ++} ++ ++/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.4s, v\[0-9\]+.4s" } } */ ++/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.4s, v\[0-9\]+.4s, v\[0-9\]+.4s" } } */ ++ ++int ++test_frecps_float64_t (void) ++{ ++ int i; ++ float64_t value = 0.2; ++ float64_t reciprocal = 5.0; ++ float64_t step = vrecped_f64 (value); ++ /* 3 steps should give us within ~0.001 accuracy. */ ++ for (i = 0; i < 3; i++) ++ step = step * vrecpsd_f64 (step, value); ++ ++ return fabs (step - reciprocal) < 0.001; ++} ++ ++/* { dg-final { scan-assembler "frecpe\\td\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "frecps\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */ ++ ++int ++test_frecps_float64x2_t (void) ++{ ++ int i; ++ int ret = 1; ++ ++ const float64_t value_pool[] = {0.2, 0.4}; ++ const float64_t reciprocal_pool[] = {5.0, 2.5}; ++ float64x2_t value = vld1q_f64 (value_pool); ++ float64x2_t reciprocal = vld1q_f64 (reciprocal_pool); ++ ++ float64x2_t step = vrecpeq_f64 (value); ++ /* 3 steps should give us within ~0.001 accuracy. */ ++ for (i = 0; i < 3; i++) ++ step = step * vrecpsq_f64 (step, value); ++ ++ ret &= fabs (vgetq_lane_f64 (step, 0) ++ - vgetq_lane_f64 (reciprocal, 0)) < 0.001; ++ ret &= fabs (vgetq_lane_f64 (step, 1) ++ - vgetq_lane_f64 (reciprocal, 1)) < 0.001; ++ ++ return ret; ++} ++ ++/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.2d, v\[0-9\]+.2d" } } */ ++/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.2d, v\[0-9\]+.2d, v\[0-9\]+.2d" } } */ ++ ++int ++main (int argc, char **argv) ++{ ++ if (!test_frecps_float32_t ()) ++ abort (); ++ if (!test_frecps_float32x2_t ()) ++ abort (); ++ if (!test_frecps_float32x4_t ()) ++ abort (); ++ if (!test_frecps_float64_t ()) ++ abort (); ++ if (!test_frecps_float64x2_t ()) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/ands_2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/ands_2.c +@@ -0,0 +1,157 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++ands_si_test1 (int a, int b, int c) ++{ ++ int d = a & b; ++ ++ /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler-times "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++ands_si_test2 (int a, int b, int c) ++{ ++ int d = a & 0x99999999; ++ ++ /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */ ++ /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++ands_si_test3 (int a, int b, int c) ++{ ++ int d = a & (b << 3); ++ ++ /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++ands_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & b; ++ ++ /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler-times "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++ands_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & 0xaaaaaaaaaaaaaaaall; ++ ++ /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */ ++ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++ands_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & (b << 3); ++ ++ /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++main () ++{ ++ int x; ++ s64 y; ++ ++ x = ands_si_test1 (29, 4, 5); ++ if (x != 13) ++ abort (); ++ ++ x = ands_si_test1 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ x = ands_si_test2 (29, 4, 5); ++ if (x != 34) ++ abort (); ++ ++ x = ands_si_test2 (1024, 2, 20); ++ if (x != 1044) ++ abort (); ++ ++ x = ands_si_test3 (35, 4, 5); ++ if (x != 41) ++ abort (); ++ ++ x = ands_si_test3 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ y = ands_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x5000500052025ll) ++ abort (); ++ ++ y = ands_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & 0xaaaaaaaaaaaaaaaall) + 0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test2 (0x540004100ll, ++ 0x320000004ll, ++ 0x805050205ll); ++ if (y != (0x540004100ll + 0x805050205ll)) ++ abort (); ++ ++ y = ands_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & (0x064000008ll << 3)) ++ + 0x064000008ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != (0x130002900ll + 0x505050505ll)) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/scalar-vca.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/scalar-vca.c +@@ -0,0 +1,72 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++ ++extern void abort (void); ++extern float fabsf (float); ++extern double fabs (double); ++ ++#define NUM_TESTS 8 ++ ++float input_s1[] = {0.1f, -0.1f, 0.4f, 10.3f, 200.0f, -800.0f, -13.0f, -0.5f}; ++float input_s2[] = {-0.2f, 0.4f, 0.04f, -100.3f, 2.0f, -80.0f, 13.0f, -0.5f}; ++double input_d1[] = {0.1, -0.1, 0.4, 10.3, 200.0, -800.0, -13.0, -0.5}; ++double input_d2[] = {-0.2, 0.4, 0.04, -100.3, 2.0, -80.0, 13.0, -0.5}; ++ ++#define TEST(TEST, CMP, SUFFIX, WIDTH, F) \ ++int \ ++test_fca##TEST##SUFFIX##_float##WIDTH##_t (void) \ ++{ \ ++ int ret = 0; \ ++ int i = 0; \ ++ uint##WIDTH##_t output[NUM_TESTS]; \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ { \ ++ float##WIDTH##_t f1 = fabs##F (input_##SUFFIX##1[i]); \ ++ float##WIDTH##_t f2 = fabs##F (input_##SUFFIX##2[i]); \ ++ /* Inhibit optimization of our linear test loop. */ \ ++ asm volatile ("" : : : "memory"); \ ++ output[i] = f1 CMP f2 ? -1 : 0; \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ { \ ++ output[i] = vca##TEST##SUFFIX##_f##WIDTH (input_##SUFFIX##1[i], \ ++ input_##SUFFIX##2[i]) \ ++ ^ output[i]; \ ++ /* Inhibit autovectorization of our scalar test loop. */ \ ++ asm volatile ("" : : : "memory"); \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ ret |= output[i]; \ ++ \ ++ return ret; \ ++} ++ ++TEST (ge, >=, s, 32, f) ++/* { dg-final { scan-assembler "facge\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */ ++TEST (ge, >=, d, 64, ) ++/* { dg-final { scan-assembler "facge\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */ ++TEST (gt, >, s, 32, f) ++/* { dg-final { scan-assembler "facgt\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */ ++TEST (gt, >, d, 64, ) ++/* { dg-final { scan-assembler "facgt\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */ ++ ++int ++main (int argc, char **argv) ++{ ++ if (test_fcages_float32_t ()) ++ abort (); ++ if (test_fcaged_float64_t ()) ++ abort (); ++ if (test_fcagts_float32_t ()) ++ abort (); ++ if (test_fcagtd_float64_t ()) ++ abort (); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_ACQ_REL (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL); ++} ++ ++int ++atomic_fetch_sub_ACQ_REL (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL); ++} ++ ++int ++atomic_fetch_and_ACQ_REL (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL); ++} ++ ++int ++atomic_fetch_nand_ACQ_REL (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL); ++} ++ ++int ++atomic_fetch_xor_ACQ_REL (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL); ++} ++ ++int ++atomic_fetch_or_ACQ_REL (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c +@@ -0,0 +1,325 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 -fno-inline -save-temps -fno-vect-cost-model" } */ ++ ++typedef signed char S8_t; ++typedef signed short S16_t; ++typedef signed int S32_t; ++typedef signed long S64_t; ++typedef signed char *__restrict__ pS8_t; ++typedef signed short *__restrict__ pS16_t; ++typedef signed int *__restrict__ pS32_t; ++typedef signed long *__restrict__ pS64_t; ++typedef unsigned char U8_t; ++typedef unsigned short U16_t; ++typedef unsigned int U32_t; ++typedef unsigned long U64_t; ++typedef unsigned char *__restrict__ pU8_t; ++typedef unsigned short *__restrict__ pU16_t; ++typedef unsigned int *__restrict__ pU32_t; ++typedef unsigned long *__restrict__ pU64_t; ++ ++extern void abort (); ++ ++void ++test_addS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c) ++{ ++ int i; ++ for (i = 0; i < 4; i++) ++ a[i] += (S64_t) b[i] * (S64_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.2d" } } */ ++ ++void ++test_addS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c) ++{ ++ int i; ++ for (i = 0; i < 8; i++) ++ a[i] += (S32_t) b[i] * (S32_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.4s" } } */ ++ ++void ++test_addS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += (S16_t) b[i] * (S16_t) c[i]; ++} ++ ++void ++test_addS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += (S16_t) -b[i] * (S16_t) -c[i]; ++} ++ ++void ++test_addS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] -= (S16_t) b[i] * (S16_t) -c[i]; ++} ++ ++void ++test_addS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] -= (S16_t) -b[i] * (S16_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler-times "smlal\tv\[0-9\]+\.8h" 4 } } */ ++/* { dg-final { scan-assembler-times "smlal2\tv\[0-9\]+\.8h" 4 } } */ ++ ++void ++test_subS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c) ++{ ++ int i; ++ for (i = 0; i < 4; i++) ++ a[i] -= (S64_t) b[i] * (S64_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.2d" } } */ ++ ++void ++test_subS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c) ++{ ++ int i; ++ for (i = 0; i < 8; i++) ++ a[i] -= (S32_t) b[i] * (S32_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.4s" } } */ ++ ++void ++test_subS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] -= (S16_t) b[i] * (S16_t) c[i]; ++} ++ ++void ++test_subS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += (S16_t) -b[i] * (S16_t) c[i]; ++} ++ ++void ++test_subS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += (S16_t) b[i] * (S16_t) -c[i]; ++} ++ ++void ++test_subS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += -((S16_t) b[i] * (S16_t) c[i]); ++} ++ ++void ++test_subS16_tS8_t16_neg3 (pS16_t a, pS8_t b, pS8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] -= (S16_t) -b[i] * (S16_t) -c[i]; ++} ++ ++/* { dg-final { scan-assembler-times "smlsl\tv\[0-9\]+\.8h" 5 } } */ ++/* { dg-final { scan-assembler-times "smlsl2\tv\[0-9\]+\.8h" 5 } } */ ++ ++void ++test_addU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c) ++{ ++ int i; ++ for (i = 0; i < 4; i++) ++ a[i] += (U64_t) b[i] * (U64_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.2d" } } */ ++ ++void ++test_addU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c) ++{ ++ int i; ++ for (i = 0; i < 8; i++) ++ a[i] += (U32_t) b[i] * (U32_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.4s" } } */ ++ ++void ++test_addU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] += (U16_t) b[i] * (U16_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.8h" } } */ ++/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.8h" } } */ ++ ++void ++test_subU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c) ++{ ++ int i; ++ for (i = 0; i < 4; i++) ++ a[i] -= (U64_t) b[i] * (U64_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.2d" } } */ ++ ++void ++test_subU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c) ++{ ++ int i; ++ for (i = 0; i < 8; i++) ++ a[i] -= (U32_t) b[i] * (U32_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.4s" } } */ ++ ++void ++test_subU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ a[i] -= (U16_t) b[i] * (U16_t) c[i]; ++} ++ ++/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.8h" } } */ ++/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.8h" } } */ ++ ++ ++S64_t add_rS64[4] = { 6, 7, -4, -3 }; ++S32_t add_rS32[8] = { 6, 7, -4, -3, 10, 11, 0, 1 }; ++S16_t add_rS16[16] = ++ { 6, 7, -4, -3, 10, 11, 0, 1, 14, 15, 4, 5, 18, 19, 8, 9 }; ++ ++S64_t sub_rS64[4] = { 0, 1, 2, 3 }; ++S32_t sub_rS32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; ++S16_t sub_rS16[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ++ ++U64_t add_rU64[4] = { 0x6, 0x7, 0x2fffffffc, 0x2fffffffd }; ++ ++U32_t add_rU32[8] = ++{ ++ 0x6, 0x7, 0x2fffc, 0x2fffd, ++ 0xa, 0xb, 0x30000, 0x30001 ++}; ++ ++U16_t add_rU16[16] = ++{ ++ 0x6, 0x7, 0x2fc, 0x2fd, 0xa, 0xb, 0x300, 0x301, ++ 0xe, 0xf, 0x304, 0x305, 0x12, 0x13, 0x308, 0x309 ++}; ++ ++U64_t sub_rU64[4] = { 0, 1, 2, 3 }; ++U32_t sub_rU32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; ++U16_t sub_rU16[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ++ ++S8_t neg_r[16] = { -6, -5, 8, 9, -2, -1, 12, 13, 2, 3, 16, 17, 6, 7, 20, 21 }; ++ ++S64_t S64_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ++S32_t S32_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 }; ++S32_t S32_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; ++ ++S32_t S32_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ++S16_t S16_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 }; ++S16_t S16_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; ++ ++S16_t S16_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ++S8_t S8_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 }; ++S8_t S8_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; ++ ++ ++#define CHECK(T,N,AS,US) \ ++do \ ++ { \ ++ for (i = 0; i < N; i++) \ ++ if (S##T##_ta[i] != AS##_r##US##T[i]) \ ++ abort (); \ ++ } \ ++while (0) ++ ++#define SCHECK(T,N,AS) CHECK(T,N,AS,S) ++#define UCHECK(T,N,AS) CHECK(T,N,AS,U) ++ ++#define NCHECK(RES) \ ++do \ ++ { \ ++ for (i = 0; i < 16; i++) \ ++ if (S16_ta[i] != RES[i]) \ ++ abort (); \ ++ } \ ++while (0) ++ ++ ++int ++main () ++{ ++ int i; ++ ++ test_addS64_tS32_t4 (S64_ta, S32_tb, S32_tc); ++ SCHECK (64, 4, add); ++ test_addS32_tS16_t8 (S32_ta, S16_tb, S16_tc); ++ SCHECK (32, 8, add); ++ test_addS16_tS8_t16 (S16_ta, S8_tb, S8_tc); ++ SCHECK (16, 16, add); ++ test_subS64_tS32_t4 (S64_ta, S32_tb, S32_tc); ++ SCHECK (64, 4, sub); ++ test_subS32_tS16_t8 (S32_ta, S16_tb, S16_tc); ++ SCHECK (32, 8, sub); ++ test_subS16_tS8_t16 (S16_ta, S8_tb, S8_tc); ++ SCHECK (16, 16, sub); ++ ++ test_addU64_tU32_t4 (S64_ta, S32_tb, S32_tc); ++ UCHECK (64, 4, add); ++ test_addU32_tU16_t8 (S32_ta, S16_tb, S16_tc); ++ UCHECK (32, 8, add); ++ test_addU16_tU8_t16 (S16_ta, S8_tb, S8_tc); ++ UCHECK (16, 16, add); ++ test_subU64_tU32_t4 (S64_ta, S32_tb, S32_tc); ++ UCHECK (64, 4, sub); ++ test_subU32_tU16_t8 (S32_ta, S16_tb, S16_tc); ++ UCHECK (32, 8, sub); ++ test_subU16_tU8_t16 (S16_ta, S8_tb, S8_tc); ++ UCHECK (16, 16, sub); ++ ++ test_addS16_tS8_t16_neg0 (S16_ta, S8_tb, S8_tc); ++ NCHECK (add_rS16); ++ test_subS16_tS8_t16_neg0 (S16_ta, S8_tb, S8_tc); ++ NCHECK (sub_rS16); ++ test_addS16_tS8_t16_neg1 (S16_ta, S8_tb, S8_tc); ++ NCHECK (add_rS16); ++ test_subS16_tS8_t16_neg1 (S16_ta, S8_tb, S8_tc); ++ NCHECK (sub_rS16); ++ test_addS16_tS8_t16_neg2 (S16_ta, S8_tb, S8_tc); ++ NCHECK (add_rS16); ++ test_subS16_tS8_t16_neg2 (S16_ta, S8_tb, S8_tc); ++ NCHECK (sub_rS16); ++ test_subS16_tS8_t16_neg3 (S16_ta, S8_tb, S8_tc); ++ NCHECK (neg_r); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/extr.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/extr.c +@@ -0,0 +1,34 @@ ++/* { dg-options "-O2 --save-temps" } */ ++/* { dg-do run } */ ++ ++extern void abort (void); ++ ++int ++test_si (int a, int b) ++{ ++ /* { dg-final { scan-assembler "extr\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, 27\n" } } */ ++ return (a << 5) | ((unsigned int) b >> 27); ++} ++ ++long long ++test_di (long long a, long long b) ++{ ++ /* { dg-final { scan-assembler "extr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, 45\n" } } */ ++ return (a << 19) | ((unsigned long long) b >> 45); ++} ++ ++int ++main () ++{ ++ int v; ++ long long w; ++ v = test_si (0x00000004, 0x30000000); ++ if (v != 0x00000086) ++ abort(); ++ w = test_di (0x0001040040040004ll, 0x0070050066666666ll); ++ if (w != 0x2002002000200380ll) ++ abort(); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-compile.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-compile.c +@@ -16,5 +16,7 @@ + /* { dg-final { scan-assembler "uminv" } } */ + /* { dg-final { scan-assembler "smaxv" } } */ + /* { dg-final { scan-assembler "sminv" } } */ ++/* { dg-final { scan-assembler "sabd" } } */ ++/* { dg-final { scan-assembler "saba" } } */ + /* { dg-final { scan-assembler-times "addv" 2} } */ + /* { dg-final { scan-assembler-times "addp" 2} } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-d.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-d.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE double ++#define ITYPE long + #define OP == + #define INV_OP != + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ + /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */ + /* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/adds3.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/adds3.c +@@ -0,0 +1,61 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++typedef long long s64; ++ ++int ++adds_ext (s64 a, int b, int c) ++{ ++ s64 d = a + b; ++ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++adds_shift_ext (s64 a, int b, int c) ++{ ++ s64 d = (a + ((s64)b << 3)); ++ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = adds_ext (0x13000002ll, 41, 15); ++ if (x != 318767203) ++ abort (); ++ ++ x = adds_ext (0x50505050ll, 29, 4); ++ if (x != 1347440782) ++ abort (); ++ ++ x = adds_ext (0x12121212121ll, 2, 14); ++ if (x != 555819315) ++ abort (); ++ ++ x = adds_shift_ext (0x123456789ll, 4, 12); ++ if (x != 591751097) ++ abort (); ++ ++ x = adds_shift_ext (0x02020202ll, 9, 8); ++ if (x != 33686107) ++ abort (); ++ ++ x = adds_shift_ext (0x987987987987ll, 23, 41); ++ if (x != -2020050305) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-times "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, sxtw" 2 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/subs2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/subs2.c +@@ -0,0 +1,155 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++subs_si_test1 (int a, int b, int c) ++{ ++ int d = a - b; ++ ++ /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++subs_si_test2 (int a, int b, int c) ++{ ++ int d = a - 0xfff; ++ ++ /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, #4095" } } */ ++ /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, #4095" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++subs_si_test3 (int a, int b, int c) ++{ ++ int d = a - (b << 3); ++ ++ /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++subs_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - b; ++ ++ /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++subs_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - 0x1000ll; ++ ++ /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, #4096" } } */ ++ /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, #4096" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++subs_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - (b << 3); ++ ++ /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = subs_si_test1 (29, 4, 5); ++ if (x != 34) ++ abort (); ++ ++ x = subs_si_test1 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ x = subs_si_test2 (29, 4, 5); ++ if (x != 34) ++ abort (); ++ ++ x = subs_si_test2 (1024, 2, 20); ++ if (x != 1044) ++ abort (); ++ ++ x = subs_si_test3 (35, 4, 5); ++ if (x != 12) ++ abort (); ++ ++ x = subs_si_test3 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ y = subs_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != 0x63505052e) ++ abort (); ++ ++ y = subs_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x5000500052025) ++ abort (); ++ ++ y = subs_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x95504f532) ++ abort (); ++ ++ y = subs_di_test2 (0x540004100ll, ++ 0x320000004ll, ++ 0x805050205ll); ++ if (y != 0x1065053309) ++ abort (); ++ ++ y = subs_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != 0x63505052e) ++ abort (); ++ ++ y = subs_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != 0x635052e05) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/bics_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/bics_1.c +@@ -0,0 +1,107 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++bics_si_test1 (int a, int b, int c) ++{ ++ int d = a & ~b; ++ ++ /* { dg-final { scan-assembler-times "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++bics_si_test2 (int a, int b, int c) ++{ ++ int d = a & ~(b << 3); ++ ++ /* { dg-final { scan-assembler "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++bics_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & ~b; ++ ++ /* { dg-final { scan-assembler-times "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++bics_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & ~(b << 3); ++ ++ /* { dg-final { scan-assembler "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++main () ++{ ++ int x; ++ s64 y; ++ ++ x = bics_si_test1 (29, ~4, 5); ++ if (x != ((29 & 4) + ~4 + 5)) ++ abort (); ++ ++ x = bics_si_test1 (5, ~2, 20); ++ if (x != 25) ++ abort (); ++ ++ x = bics_si_test2 (35, ~4, 5); ++ if (x != ((35 & ~(~4 << 3)) + ~4 + 5)) ++ abort (); ++ ++ x = bics_si_test2 (96, ~2, 20); ++ if (x != 116) ++ abort (); ++ ++ y = bics_di_test1 (0x130000029ll, ++ ~0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = bics_di_test1 (0x5000500050005ll, ++ ~0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x5000500052025ll) ++ abort (); ++ ++ y = bics_di_test2 (0x130000029ll, ++ ~0x064000008ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & ~(~0x064000008ll << 3)) ++ + ~0x064000008ll + 0x505050505ll)) ++ abort (); ++ ++ y = bics_di_test2 (0x130002900ll, ++ ~0x088000008ll, ++ 0x505050505ll); ++ if (y != (0x130002900ll + 0x505050505ll)) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vmaxv.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vmaxv.c +@@ -0,0 +1,117 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps -ffast-math" } */ ++ ++#include ++ ++extern void abort (void); ++ ++#define NUM_TESTS 16 ++#define DELTA 0.000001 ++ ++int8_t input_int8[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++int16_t input_int16[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++int32_t input_int32[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++ ++uint8_t input_uint8[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++uint16_t input_uint16[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++uint32_t input_uint32[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++ ++#define EQUAL(a, b) (a == b) ++ ++#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES) \ ++int \ ++test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void) \ ++{ \ ++ int i, j; \ ++ int moves = (NUM_TESTS - LANES) + 1; \ ++ TYPE##_t out_l[NUM_TESTS]; \ ++ TYPE##_t out_v[NUM_TESTS]; \ ++ \ ++ /* Calculate linearly. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ out_l[i] = input_##TYPE[i]; \ ++ for (j = 0; j < LANES; j++) \ ++ out_l[i] = input_##TYPE[i + j] CMP_OP out_l[i] ? \ ++ input_##TYPE[i + j] : out_l[i]; \ ++ } \ ++ \ ++ /* Calculate using vector reduction intrinsics. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \ ++ out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1); \ ++ } \ ++ \ ++ /* Compare. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ if (!EQUAL (out_v[i], out_l[i])) \ ++ return 0; \ ++ } \ ++ return 1; \ ++} ++ ++#define BUILD_VARIANTS(TYPE, STYPE, W32, W64) \ ++TEST (max, >, STYPE, , TYPE, W32) \ ++TEST (max, >, STYPE, q, TYPE, W64) \ ++TEST (min, <, STYPE, , TYPE, W32) \ ++TEST (min, <, STYPE, q, TYPE, W64) ++ ++BUILD_VARIANTS (int8, s8, 8, 16) ++/* { dg-final { scan-assembler "smaxv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */ ++/* { dg-final { scan-assembler "sminv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */ ++/* { dg-final { scan-assembler "smaxv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */ ++/* { dg-final { scan-assembler "sminv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */ ++BUILD_VARIANTS (uint8, u8, 8, 16) ++/* { dg-final { scan-assembler "umaxv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */ ++/* { dg-final { scan-assembler "uminv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */ ++/* { dg-final { scan-assembler "umaxv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */ ++/* { dg-final { scan-assembler "uminv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */ ++BUILD_VARIANTS (int16, s16, 4, 8) ++/* { dg-final { scan-assembler "smaxv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */ ++/* { dg-final { scan-assembler "sminv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */ ++/* { dg-final { scan-assembler "smaxv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */ ++/* { dg-final { scan-assembler "sminv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */ ++BUILD_VARIANTS (uint16, u16, 4, 8) ++/* { dg-final { scan-assembler "umaxv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */ ++/* { dg-final { scan-assembler "uminv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */ ++/* { dg-final { scan-assembler "umaxv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */ ++/* { dg-final { scan-assembler "uminv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */ ++BUILD_VARIANTS (int32, s32, 2, 4) ++/* { dg-final { scan-assembler "smaxp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "sminp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "smaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "sminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++BUILD_VARIANTS (uint32, u32, 2, 4) ++/* { dg-final { scan-assembler "umaxp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "uminp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "umaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "uminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++ ++#undef TEST ++#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES) \ ++{ \ ++ if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++int ++main (int argc, char **argv) ++{ ++ BUILD_VARIANTS (int8, s8, 8, 16) ++ BUILD_VARIANTS (uint8, u8, 8, 16) ++ BUILD_VARIANTS (int16, s16, 4, 8) ++ BUILD_VARIANTS (uint16, u16, 4, 8) ++ BUILD_VARIANTS (int32, s32, 2, 4) ++ BUILD_VARIANTS (uint32, u32, 2, 4) ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vrecpx.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vrecpx.c +@@ -0,0 +1,54 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++#include ++#include ++ ++float32_t in_f[] = ++{2.0, 4.0, 8.0, 16.0, 1.0, 0.5, 0.25, 0.125}; ++float32_t rec_f[] = ++{1.0, 0.5, 0.25, 0.125, 2.0, 4.0, 8.0, 16.0}; ++float64_t in_d[] = ++{2.0, 4.0, 8.0, 16.0, 1.0, 0.5, 0.25, 0.125}; ++float32_t rec_d[] = ++{1.0, 0.5, 0.25, 0.125, 2.0, 4.0, 8.0, 16.0}; ++ ++int ++test_frecpx_float32_t (void) ++{ ++ int i = 0; ++ int ret = 1; ++ for (i = 0; i < 8; i++) ++ ret &= fabs (vrecpxs_f32 (in_f[i]) - rec_f[i]) < 0.001; ++ ++ return ret; ++} ++ ++/* { dg-final { scan-assembler "frecpx\\ts\[0-9\]+, s\[0-9\]+" } } */ ++ ++int ++test_frecpx_float64_t (void) ++{ ++ int i = 0; ++ int ret = 1; ++ for (i = 0; i < 8; i++) ++ ret &= fabs (vrecpxd_f64 (in_d[i]) - rec_d[i]) < 0.001; ++ ++ return ret; ++} ++ ++/* { dg-final { scan-assembler "frecpx\\td\[0-9\]+, d\[0-9\]+" } } */ ++ ++int ++main (int argc, char **argv) ++{ ++ if (!test_frecpx_float32_t ()) ++ abort (); ++ if (!test_frecpx_float64_t ()) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vca.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vca.c +@@ -0,0 +1,89 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++ ++extern void abort (void); ++extern float fabsf (float); ++extern double fabs (double); ++ ++#define NUM_TESTS 8 ++ ++float input_s1[] = {0.1f, -0.1f, 0.4f, 10.3f, 200.0f, -800.0f, -13.0f, -0.5f}; ++float input_s2[] = {-0.2f, 0.4f, 0.04f, -100.3f, 2.0f, -80.0f, 13.0f, -0.5f}; ++double input_d1[] = {0.1, -0.1, 0.4, 10.3, 200.0, -800.0, -13.0, -0.5}; ++double input_d2[] = {-0.2, 0.4, 0.04, -100.3, 2.0, -80.0, 13.0, -0.5}; ++ ++#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F) \ ++int \ ++test_vca##T##_float##WIDTH##x##LANES##_t (void) \ ++{ \ ++ int ret = 0; \ ++ int i = 0; \ ++ uint##WIDTH##_t output[NUM_TESTS]; \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ { \ ++ float##WIDTH##_t f1 = fabs##F (input_##SUFFIX##1[i]); \ ++ float##WIDTH##_t f2 = fabs##F (input_##SUFFIX##2[i]); \ ++ /* Inhibit optimization of our linear test loop. */ \ ++ asm volatile ("" : : : "memory"); \ ++ output[i] = f1 CMP f2 ? -1 : 0; \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i += LANES) \ ++ { \ ++ float##WIDTH##x##LANES##_t in1 = \ ++ vld1##Q##_f##WIDTH (input_##SUFFIX##1 + i); \ ++ float##WIDTH##x##LANES##_t in2 = \ ++ vld1##Q##_f##WIDTH (input_##SUFFIX##2 + i); \ ++ uint##WIDTH##x##LANES##_t expected_out = \ ++ vld1##Q##_u##WIDTH (output + i); \ ++ uint##WIDTH##x##LANES##_t out = \ ++ veor##Q##_u##WIDTH (vca##T##Q##_f##WIDTH (in1, in2), \ ++ expected_out); \ ++ vst1##Q##_u##WIDTH (output + i, out); \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ ret |= output[i]; \ ++ \ ++ return ret; \ ++} ++ ++#define BUILD_VARIANTS(T, CMP) \ ++TEST (T, CMP, s, 32, 2, , f) \ ++TEST (T, CMP, s, 32, 4, q, f) \ ++TEST (T, CMP, d, 64, 2, q, ) ++ ++BUILD_VARIANTS (ge, >=) ++/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++ ++BUILD_VARIANTS (gt, >) ++/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++ ++/* No need for another scan-assembler as these tests ++ also generate facge, facgt instructions. */ ++BUILD_VARIANTS (le, <=) ++BUILD_VARIANTS (lt, <) ++ ++#undef TEST ++#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F) \ ++if (test_vca##T##_float##WIDTH##x##LANES##_t ()) \ ++ abort (); ++ ++int ++main (int argc, char **argv) ++{ ++BUILD_VARIANTS (ge, >=) ++BUILD_VARIANTS (gt, >) ++BUILD_VARIANTS (le, <=) ++BUILD_VARIANTS (lt, <) ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vrnd.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vrnd.c +@@ -0,0 +1,117 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++ ++extern void abort (void); ++extern float fabsf (float); ++extern double fabs (double); ++ ++extern double trunc (double); ++extern double round (double); ++extern double nearbyint (double); ++extern double floor (double); ++extern double ceil (double); ++extern double rint (double); ++ ++extern float truncf (float); ++extern float roundf (float); ++extern float nearbyintf (float); ++extern float floorf (float); ++extern float ceilf (float); ++extern float rintf (float); ++ ++#define NUM_TESTS 8 ++#define DELTA 0.000001 ++ ++float input_f32[] = {0.1f, -0.1f, 0.4f, 10.3f, ++ 200.0f, -800.0f, -13.0f, -0.5f}; ++double input_f64[] = {0.1, -0.1, 0.4, 10.3, ++ 200.0, -800.0, -13.0, -0.5}; ++ ++#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F) \ ++int \ ++test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t (void) \ ++{ \ ++ int ret = 1; \ ++ int i = 0; \ ++ int nlanes = LANES; \ ++ float##WIDTH##_t expected_out[NUM_TESTS]; \ ++ float##WIDTH##_t actual_out[NUM_TESTS]; \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ { \ ++ expected_out[i] = C_FN##F (input_f##WIDTH[i]); \ ++ /* Don't vectorize this. */ \ ++ asm volatile ("" : : : "memory"); \ ++ } \ ++ \ ++ /* Prevent the compiler from noticing these two loops do the same \ ++ thing and optimizing away the comparison. */ \ ++ asm volatile ("" : : : "memory"); \ ++ \ ++ for (i = 0; i < NUM_TESTS; i+=nlanes) \ ++ { \ ++ float##WIDTH##x##LANES##_t out = \ ++ vrnd##SUFFIX##Q##_f##WIDTH \ ++ (vld1##Q##_f##WIDTH (input_f##WIDTH + i)); \ ++ vst1##Q##_f##WIDTH (actual_out + i, out); \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ ret &= fabs##F (expected_out[i] - actual_out[i]) < DELTA; \ ++ \ ++ return ret; \ ++} \ ++ ++ ++#define BUILD_VARIANTS(SUFFIX, C_FN) \ ++TEST (SUFFIX, , 32, 2, C_FN, f) \ ++TEST (SUFFIX, q, 32, 4, C_FN, f) \ ++TEST (SUFFIX, q, 64, 2, C_FN, ) \ ++ ++BUILD_VARIANTS ( , trunc) ++/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (a, round) ++/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (i, nearbyint) ++/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (m, floor) ++/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (p, ceil) ++/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (x, rint) ++/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++ ++#undef TEST ++#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F) \ ++{ \ ++ if (!test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++int ++main (int argc, char **argv) ++{ ++ BUILD_VARIANTS ( , trunc) ++ BUILD_VARIANTS (a, round) ++ BUILD_VARIANTS (i, nearbyint) ++ BUILD_VARIANTS (m, floor) ++ BUILD_VARIANTS (p, ceil) ++ BUILD_VARIANTS (x, rint) ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-relaxed.x" + +-int +-atomic_fetch_add_RELAXED (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_sub_RELAXED (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_and_RELAXED (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_nand_RELAXED (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_xor_RELAXED (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_or_RELAXED (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); +-} +- + /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/aes_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/aes_1.c +@@ -0,0 +1,40 @@ ++ ++/* { dg-do compile } */ ++/* { dg-options "-march=armv8-a+crypto" } */ ++ ++#include "arm_neon.h" ++ ++uint8x16_t ++test_vaeseq_u8 (uint8x16_t data, uint8x16_t key) ++{ ++ return vaeseq_u8 (data, key); ++} ++ ++/* { dg-final { scan-assembler-times "aese\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ ++ ++uint8x16_t ++test_vaesdq_u8 (uint8x16_t data, uint8x16_t key) ++{ ++ return vaesdq_u8 (data, key); ++} ++ ++/* { dg-final { scan-assembler-times "aesd\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ ++ ++uint8x16_t ++test_vaesmcq_u8 (uint8x16_t data) ++{ ++ return vaesmcq_u8 (data); ++} ++ ++/* { dg-final { scan-assembler-times "aesmc\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ ++ ++uint8x16_t ++test_vaesimcq_u8 (uint8x16_t data) ++{ ++ return vaesimcq_u8 (data); ++} ++ ++/* { dg-final { scan-assembler-times "aesimc\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ ++ ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm.x +@@ -13,6 +13,8 @@ + 2.0, -4.0, 8.0, -16.0, + -2.125, 4.25, -8.5, 17.0}; + ++/* Float comparisons, float results. */ ++ + void + foo (FTYPE *in1, FTYPE *in2, FTYPE *output) + { +@@ -49,11 +51,52 @@ + output[i] = (in1[i] INV_OP 0.0) ? 4.0 : 2.0; + } + ++/* Float comparisons, int results. */ ++ ++void ++foo_int (FTYPE *in1, FTYPE *in2, ITYPE *output) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = (in1[i] OP in2[i]) ? 2 : 4; ++} ++ ++void ++bar_int (FTYPE *in1, FTYPE *in2, ITYPE *output) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = (in1[i] INV_OP in2[i]) ? 4 : 2; ++} ++ ++void ++foobar_int (FTYPE *in1, FTYPE *in2, ITYPE *output) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = (in1[i] OP 0.0) ? 4 : 2; ++} ++ ++void ++foobarbar_int (FTYPE *in1, FTYPE *in2, ITYPE *output) ++{ ++ int i = 0; ++ /* Vectorizable. */ ++ for (i = 0; i < N; i++) ++ output[i] = (in1[i] INV_OP 0.0) ? 4 : 2; ++} ++ + int + main (int argc, char **argv) + { + FTYPE out1[N]; + FTYPE out2[N]; ++ ITYPE outi1[N]; ++ ITYPE outi2[N]; ++ + int i = 0; + foo (input1, input2, out1); + bar (input1, input2, out2); +@@ -65,6 +108,17 @@ + for (i = 0; i < N; i++) + if (out1[i] == out2[i]) + abort (); ++ ++ foo_int (input1, input2, outi1); ++ bar_int (input1, input2, outi2); ++ for (i = 0; i < N; i++) ++ if (outi1[i] != outi2[i]) ++ abort (); ++ foobar_int (input1, input2, outi1); ++ foobarbar_int (input1, input2, outi2); ++ for (i = 0; i < N; i++) ++ if (outi1[i] == outi2[i]) ++ abort (); + return 0; + } + +--- a/src/gcc/testsuite/gcc.target/aarch64/movi_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/movi_1.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2" } */ ++ ++void ++dummy (short* b) ++{ ++ /* { dg-final { scan-assembler "movi\tv\[0-9\]+\.4h, 0x4, lsl 8" } } */ ++ /* { dg-final { scan-assembler-not "movi\tv\[0-9\]+\.4h, 0x400" } } */ ++ /* { dg-final { scan-assembler-not "movi\tv\[0-9\]+\.4h, 1024" } } */ ++ register short x asm ("h8") = 1024; ++ asm volatile ("" : : "w" (x)); ++ *b = x; ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c +@@ -0,0 +1,11 @@ ++ ++/* { dg-do compile } */ ++/* { dg-options "-O3" } */ ++ ++#include "arm_neon.h" ++ ++#include "vaddv-intrinsic.x" ++ ++/* { dg-final { scan-assembler "faddp\\ts\[0-9\]+"} } */ ++/* { dg-final { scan-assembler-times "faddp\\tv\[0-9\]+\.4s" 2} } */ ++/* { dg-final { scan-assembler "faddp\\td\[0-9\]+"} } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c +@@ -0,0 +1,101 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps" } */ ++ ++#include ++ ++extern void abort (void); ++ ++#define ETYPE(size) int##size##_t ++#define VTYPE(size, lanes) int##size##x##lanes##_t ++ ++#define TEST_VABS(q, size, lanes) \ ++static void \ ++test_vabs##q##_##size (ETYPE (size) * res, \ ++ const ETYPE (size) *in1) \ ++{ \ ++ VTYPE (size, lanes) a = vld1##q##_s##size (res); \ ++ VTYPE (size, lanes) b = vld1##q##_s##size (in1); \ ++ a = vabs##q##_s##size (b); \ ++ vst1##q##_s##size (res, a); \ ++} ++ ++#define BUILD_VARS(width, n_lanes, n_half_lanes) \ ++TEST_VABS (, width, n_half_lanes) \ ++TEST_VABS (q, width, n_lanes) \ ++ ++BUILD_VARS (64, 2, 1) ++BUILD_VARS (32, 4, 2) ++BUILD_VARS (16, 8, 4) ++BUILD_VARS (8, 16, 8) ++ ++#define POOL1 {-10} ++#define POOL2 {2, -10} ++#define POOL4 {0, -10, 2, -3} ++#define POOL8 {0, -10, 2, -3, 4, -50, 6, -70} ++#define POOL16 {0, -10, 2, -3, 4, -50, 6, -70, \ ++ -5, 10, -2, 3, -4, 50, -6, 70} ++ ++#define EXPECTED1 {10} ++#define EXPECTED2 {2, 10} ++#define EXPECTED4 {0, 10, 2, 3} ++#define EXPECTED8 {0, 10, 2, 3, 4, 50, 6, 70} ++#define EXPECTED16 {0, 10, 2, 3, 4, 50, 6, 70, \ ++ 5, 10, 2, 3, 4, 50, 6, 70} ++ ++#define BUILD_TEST(size, lanes_64, lanes_128) \ ++static void \ ++test_##size (void) \ ++{ \ ++ int i; \ ++ ETYPE (size) pool1[lanes_64] = POOL##lanes_64; \ ++ ETYPE (size) res1[lanes_64] = {0}; \ ++ ETYPE (size) expected1[lanes_64] = EXPECTED##lanes_64; \ ++ ETYPE (size) pool2[lanes_128] = POOL##lanes_128; \ ++ ETYPE (size) res2[lanes_128] = {0}; \ ++ ETYPE (size) expected2[lanes_128] = EXPECTED##lanes_128; \ ++ \ ++ /* Forcefully avoid optimization. */ \ ++ asm volatile ("" : : : "memory"); \ ++ test_vabs_##size (res1, pool1); \ ++ for (i = 0; i < lanes_64; i++) \ ++ if (res1[i] != expected1[i]) \ ++ abort (); \ ++ \ ++ /* Forcefully avoid optimization. */ \ ++ asm volatile ("" : : : "memory"); \ ++ test_vabsq_##size (res2, pool2); \ ++ for (i = 0; i < lanes_128; i++) \ ++ if (res2[i] != expected2[i]) \ ++ abort (); \ ++} ++ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 1 } } */ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ ++BUILD_TEST (8 , 8, 16) ++ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 1 } } */ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */ ++BUILD_TEST (16, 4, 8) ++ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 1 } } */ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */ ++BUILD_TEST (32, 2, 4) ++ ++/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */ ++BUILD_TEST (64, 1, 2) ++ ++#undef BUILD_TEST ++ ++#define BUILD_TEST(size) test_##size () ++ ++int ++main (int argc, char **argv) ++{ ++ BUILD_TEST (8); ++ BUILD_TEST (16); ++ BUILD_TEST (32); ++ BUILD_TEST (64); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_RELAXED (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_sub_RELAXED (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_and_RELAXED (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_nand_RELAXED (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_xor_RELAXED (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_or_RELAXED (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect.c +@@ -55,6 +55,8 @@ + int smin_vector[] = {0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15}; + unsigned int umax_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + unsigned int umin_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; ++ int sabd_vector[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ++ int saba_vector[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int reduce_smax_value = 0; + int reduce_smin_value = -15; + unsigned int reduce_umax_value = 15; +@@ -81,6 +83,8 @@ + TEST (smin, s); + TEST (umax, u); + TEST (umin, u); ++ TEST (sabd, s); ++ TEST (saba, s); + TESTV (reduce_smax, s); + TESTV (reduce_smin, s); + TESTV (reduce_umax, u); +--- a/src/gcc/testsuite/gcc.target/aarch64/scalar-mov.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/scalar-mov.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-options "-g -mgeneral-regs-only" } */ ++ ++void ++foo (const char *c, ...) ++{ ++ char buf[256]; ++ buf[256 - 1] = '\0'; ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c +@@ -0,0 +1,74 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++#define N 16 ++ ++static void ++movi_msl8 (int *__restrict a) ++{ ++ int i; ++ ++ /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */ ++ for (i = 0; i < N; i++) ++ a[i] = 0xabff; ++} ++ ++static void ++movi_msl16 (int *__restrict a) ++{ ++ int i; ++ ++ /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */ ++ for (i = 0; i < N; i++) ++ a[i] = 0xabffff; ++} ++ ++static void ++mvni_msl8 (int *__restrict a) ++{ ++ int i; ++ ++ /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */ ++ for (i = 0; i < N; i++) ++ a[i] = 0xffff5400; ++} ++ ++static void ++mvni_msl16 (int *__restrict a) ++{ ++ int i; ++ ++ /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */ ++ for (i = 0; i < N; i++) ++ a[i] = 0xff540000; ++} ++ ++int ++main (void) ++{ ++ int a[N] = { 0 }; ++ int i; ++ ++#define CHECK_ARRAY(a, val) \ ++ for (i = 0; i < N; i++) \ ++ if (a[i] != val) \ ++ abort (); ++ ++ movi_msl8 (a); ++ CHECK_ARRAY (a, 0xabff); ++ ++ movi_msl16 (a); ++ CHECK_ARRAY (a, 0xabffff); ++ ++ mvni_msl8 (a); ++ CHECK_ARRAY (a, 0xffff5400); ++ ++ mvni_msl16 (a); ++ CHECK_ARRAY (a, 0xff540000); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-d.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-d.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE double ++#define ITYPE long + #define OP >= + #define INV_OP < + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ + /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */ + /* { dg-final { scan-assembler "fcmlt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-acquire.x" + +-int +-atomic_fetch_add_ACQUIRE (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_fetch_sub_ACQUIRE (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_fetch_and_ACQUIRE (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_fetch_nand_ACQUIRE (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_fetch_xor_ACQUIRE (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_fetch_or_ACQUIRE (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE); +-} +- + /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/abs_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/abs_1.c +@@ -0,0 +1,53 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fno-inline --save-temps" } */ ++ ++extern long long llabs (long long); ++extern void abort (void); ++ ++long long ++abs64 (long long a) ++{ ++ /* { dg-final { scan-assembler "eor\t" } } */ ++ /* { dg-final { scan-assembler "sub\t" } } */ ++ return llabs (a); ++} ++ ++long long ++abs64_in_dreg (long long a) ++{ ++ /* { dg-final { scan-assembler "abs\td\[0-9\]+, d\[0-9\]+" } } */ ++ register long long x asm ("d8") = a; ++ register long long y asm ("d9"); ++ asm volatile ("" : : "w" (x)); ++ y = llabs (x); ++ asm volatile ("" : : "w" (y)); ++ return y; ++} ++ ++int ++main (void) ++{ ++ volatile long long ll0 = 0LL, ll1 = 1LL, llm1 = -1LL; ++ ++ if (abs64 (ll0) != 0LL) ++ abort (); ++ ++ if (abs64 (ll1) != 1LL) ++ abort (); ++ ++ if (abs64 (llm1) != 1LL) ++ abort (); ++ ++ if (abs64_in_dreg (ll0) != 0LL) ++ abort (); ++ ++ if (abs64_in_dreg (ll1) != 1LL) ++ abort (); ++ ++ if (abs64_in_dreg (llm1) != 1LL) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.c +@@ -1,41 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-#define STRONG 0 +-#define WEAK 1 +-int v = 0; ++#include "atomic-comp-swap-release-acquire.x" + +-int +-atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b) +-{ +- return __atomic_compare_exchange (&v, &a, &b, +- STRONG, __ATOMIC_RELEASE, +- __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b) +-{ +- return __atomic_compare_exchange (&v, &a, &b, +- WEAK, __ATOMIC_RELEASE, +- __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b) +-{ +- return __atomic_compare_exchange_n (&v, &a, b, +- STRONG, __ATOMIC_RELEASE, +- __ATOMIC_ACQUIRE); +-} +- +-int +-atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b) +-{ +- return __atomic_compare_exchange_n (&v, &a, b, +- WEAK, __ATOMIC_RELEASE, +- __ATOMIC_ACQUIRE); +-} +- + /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 4 } } */ + /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 4 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect.x +@@ -138,3 +138,17 @@ + + return s; + } ++ ++void sabd (pRINT a, pRINT b, pRINT c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ c[i] = abs (a[i] - b[i]); ++} ++ ++void saba (pRINT a, pRINT b, pRINT c) ++{ ++ int i; ++ for (i = 0; i < 16; i++) ++ c[i] += abs (a[i] - b[i]); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c +@@ -0,0 +1,35 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 -save-temps -fno-inline" } */ ++ ++extern void abort (); ++ ++void ++count_lz_v4si (unsigned *__restrict a, int *__restrict b) ++{ ++ int i; ++ ++ for (i = 0; i < 4; i++) ++ b[i] = __builtin_clz (a[i]); ++} ++ ++/* { dg-final { scan-assembler "clz\tv\[0-9\]+\.4s" } } */ ++ ++int ++main () ++{ ++ unsigned int x[4] = { 0x0, 0xFFFF, 0x1FFFF, 0xFFFFFFFF }; ++ int r[4] = { 32, 16, 15, 0 }; ++ int d[4], i; ++ ++ count_lz_v4si (x, d); ++ ++ for (i = 0; i < 4; i++) ++ { ++ if (d[i] != r[i]) ++ abort (); ++ } ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/sha256_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/sha256_1.c +@@ -0,0 +1,40 @@ ++ ++/* { dg-do compile } */ ++/* { dg-options "-march=armv8-a+crypto" } */ ++ ++#include "arm_neon.h" ++ ++uint32x4_t ++test_vsha256hq_u32 (uint32x4_t hash_abcd, uint32x4_t hash_efgh, uint32x4_t wk) ++{ ++ return vsha256hq_u32 (hash_abcd, hash_efgh, wk); ++} ++ ++/* { dg-final { scan-assembler-times "sha256h\\tq" 1 } } */ ++ ++uint32x4_t ++test_vsha256h2q_u32 (uint32x4_t hash_efgh, uint32x4_t hash_abcd, uint32x4_t wk) ++{ ++ return vsha256h2q_u32 (hash_efgh, hash_abcd, wk); ++} ++ ++/* { dg-final { scan-assembler-times "sha256h2\\tq" 1 } } */ ++ ++uint32x4_t ++test_vsha256su0q_u32 (uint32x4_t w0_3, uint32x4_t w4_7) ++{ ++ return vsha256su0q_u32 (w0_3, w4_7); ++} ++ ++/* { dg-final { scan-assembler-times "sha256su0\\tv" 1 } } */ ++ ++uint32x4_t ++test_vsha256su1q_u32 (uint32x4_t tw0_3, uint32x4_t w8_11, uint32x4_t w12_15) ++{ ++ return vsha256su1q_u32 (tw0_3, w8_11, w12_15); ++} ++ ++/* { dg-final { scan-assembler-times "sha256su1\\tv" 1 } } */ ++ ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-f.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-f.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE float ++#define ITYPE int + #define OP > + #define INV_OP <= + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */ + /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */ + /* { dg-final { scan-assembler "fcmle\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/subs3.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/subs3.c +@@ -0,0 +1,61 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++typedef long long s64; ++ ++int ++subs_ext (s64 a, int b, int c) ++{ ++ s64 d = a - b; ++ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++subs_shift_ext (s64 a, int b, int c) ++{ ++ s64 d = (a - ((s64)b << 3)); ++ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = subs_ext (0x13000002ll, 41, 15); ++ if (x != 318767121) ++ abort (); ++ ++ x = subs_ext (0x50505050ll, 29, 4); ++ if (x != 1347440724) ++ abort (); ++ ++ x = subs_ext (0x12121212121ll, 2, 14); ++ if (x != 555819311) ++ abort (); ++ ++ x = subs_shift_ext (0x123456789ll, 4, 12); ++ if (x != 591751033) ++ abort (); ++ ++ x = subs_shift_ext (0x02020202ll, 9, 8); ++ if (x != 33685963) ++ abort (); ++ ++ x = subs_shift_ext (0x987987987987ll, 23, 41); ++ if (x != -2020050673) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-times "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, sxtw" 2 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/bics_2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/bics_2.c +@@ -0,0 +1,111 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++bics_si_test1 (int a, int b, int c) ++{ ++ int d = a & ~b; ++ ++ /* { dg-final { scan-assembler-not "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler-times "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++bics_si_test2 (int a, int b, int c) ++{ ++ int d = a & ~(b << 3); ++ ++ /* { dg-final { scan-assembler-not "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++bics_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & ~b; ++ ++ /* { dg-final { scan-assembler-not "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler-times "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++bics_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & ~(b << 3); ++ ++ /* { dg-final { scan-assembler-not "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++main () ++{ ++ int x; ++ s64 y; ++ ++ x = bics_si_test1 (29, ~4, 5); ++ if (x != ((29 & 4) + ~4 + 5)) ++ abort (); ++ ++ x = bics_si_test1 (5, ~2, 20); ++ if (x != 25) ++ abort (); ++ ++ x = bics_si_test2 (35, ~4, 5); ++ if (x != ((35 & ~(~4 << 3)) + ~4 + 5)) ++ abort (); ++ ++ x = bics_si_test2 (96, ~2, 20); ++ if (x != 116) ++ abort (); ++ ++ y = bics_di_test1 (0x130000029ll, ++ ~0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = bics_di_test1 (0x5000500050005ll, ++ ~0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x5000500052025ll) ++ abort (); ++ ++ y = bics_di_test2 (0x130000029ll, ++ ~0x064000008ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & ~(~0x064000008ll << 3)) ++ + ~0x064000008ll + 0x505050505ll)) ++ abort (); ++ ++ y = bics_di_test2 (0x130002900ll, ++ ~0x088000008ll, ++ 0x505050505ll); ++ if (y != (0x130002900ll + 0x505050505ll)) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c +@@ -0,0 +1,28 @@ ++ ++/* { dg-do run } */ ++/* { dg-options "-O3" } */ ++ ++#include "arm_neon.h" ++ ++extern void abort (void); ++ ++#include "vaddv-intrinsic.x" ++ ++int ++main (void) ++{ ++ const float32_t pool_v2sf[] = {4.0f, 9.0f}; ++ const float32_t pool_v4sf[] = {4.0f, 9.0f, 16.0f, 25.0f}; ++ const float64_t pool_v2df[] = {4.0, 9.0}; ++ ++ if (test_vaddv_v2sf (pool_v2sf) != 13.0f) ++ abort (); ++ ++ if (test_vaddv_v4sf (pool_v4sf) != 54.0f) ++ abort (); ++ ++ if (test_vaddv_v2df (pool_v2df) != 13.0) ++ abort (); ++ ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_ACQUIRE (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_fetch_sub_ACQUIRE (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_fetch_and_ACQUIRE (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_fetch_nand_ACQUIRE (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_fetch_xor_ACQUIRE (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_fetch_or_ACQUIRE (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/sbc.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/sbc.c +@@ -0,0 +1,41 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps" } */ ++ ++extern void abort (void); ++ ++typedef unsigned int u32int; ++typedef unsigned long long u64int; ++ ++u32int ++test_si (u32int w1, u32int w2, u32int w3, u32int w4) ++{ ++ u32int w0; ++ /* { dg-final { scan-assembler "sbc\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+\n" } } */ ++ w0 = w1 - w2 - (w3 < w4); ++ return w0; ++} ++ ++u64int ++test_di (u64int x1, u64int x2, u64int x3, u64int x4) ++{ ++ u64int x0; ++ /* { dg-final { scan-assembler "sbc\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+\n" } } */ ++ x0 = x1 - x2 - (x3 < x4); ++ return x0; ++} ++ ++int ++main () ++{ ++ u32int x; ++ u64int y; ++ x = test_si (7, 8, 12, 15); ++ if (x != -2) ++ abort(); ++ y = test_di (0x987654321ll, 0x123456789ll, 0x345345345ll, 0x123123123ll); ++ if (y != 0x8641fdb98ll) ++ abort(); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/pmull_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/pmull_1.c +@@ -0,0 +1,23 @@ ++ ++/* { dg-do compile } */ ++/* { dg-options "-march=armv8-a+crypto" } */ ++ ++#include "arm_neon.h" ++ ++poly128_t ++test_vmull_p64 (poly64_t a, poly64_t b) ++{ ++ return vmull_p64 (a, b); ++} ++ ++/* { dg-final { scan-assembler-times "pmull\\tv" 1 } } */ ++ ++poly128_t ++test_vmull_high_p64 (poly64x2_t a, poly64x2_t b) ++{ ++ return vmull_high_p64 (a, b); ++} ++ ++/* { dg-final { scan-assembler-times "pmull2\\tv" 1 } } */ ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.x +@@ -0,0 +1,36 @@ ++ ++#define STRONG 0 ++#define WEAK 1 ++int v = 0; ++ ++int ++atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b) ++{ ++ return __atomic_compare_exchange (&v, &a, &b, ++ STRONG, __ATOMIC_RELEASE, ++ __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b) ++{ ++ return __atomic_compare_exchange (&v, &a, &b, ++ WEAK, __ATOMIC_RELEASE, ++ __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b) ++{ ++ return __atomic_compare_exchange_n (&v, &a, b, ++ STRONG, __ATOMIC_RELEASE, ++ __ATOMIC_ACQUIRE); ++} ++ ++int ++atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b) ++{ ++ return __atomic_compare_exchange_n (&v, &a, b, ++ WEAK, __ATOMIC_RELEASE, ++ __ATOMIC_ACQUIRE); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2" } */ ++/* { dg-options "-O2 -dp" } */ + + #include + +@@ -32,6 +32,18 @@ + vqaddd_s64 (a, d)); + } + ++/* { dg-final { scan-assembler-times "\\tabs\\td\[0-9\]+, d\[0-9\]+" 1 } } */ ++ ++int64x1_t ++test_vabs_s64 (int64x1_t a) ++{ ++ uint64x1_t res; ++ force_simd (a); ++ res = vabs_s64 (a); ++ force_simd (res); ++ return res; ++} ++ + /* { dg-final { scan-assembler-times "\\tcmeq\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */ + + uint64x1_t +@@ -181,7 +193,7 @@ + return res; + } + +-/* { dg-final { scan-assembler-times "\\tdup\\tb\[0-9\]+, v\[0-9\]+\.b" 2 } } */ ++/* { dg-final { scan-assembler-times "aarch64_get_lanev16qi" 2 } } */ + + int8x1_t + test_vdupb_lane_s8 (int8x16_t a) +@@ -195,7 +207,7 @@ + return vdupb_lane_u8 (a, 2); + } + +-/* { dg-final { scan-assembler-times "\\tdup\\th\[0-9\]+, v\[0-9\]+\.h" 2 } } */ ++/* { dg-final { scan-assembler-times "aarch64_get_lanev8hi" 2 } } */ + + int16x1_t + test_vduph_lane_s16 (int16x8_t a) +@@ -209,7 +221,7 @@ + return vduph_lane_u16 (a, 2); + } + +-/* { dg-final { scan-assembler-times "\\tdup\\ts\[0-9\]+, v\[0-9\]+\.s" 2 } } */ ++/* { dg-final { scan-assembler-times "aarch64_get_lanev4si" 2 } } */ + + int32x1_t + test_vdups_lane_s32 (int32x4_t a) +@@ -223,18 +235,18 @@ + return vdups_lane_u32 (a, 2); + } + +-/* { dg-final { scan-assembler-times "\\tdup\\td\[0-9\]+, v\[0-9\]+\.d" 2 } } */ ++/* { dg-final { scan-assembler-times "aarch64_get_lanev2di" 2 } } */ + + int64x1_t + test_vdupd_lane_s64 (int64x2_t a) + { +- return vdupd_lane_s64 (a, 2); ++ return vdupd_lane_s64 (a, 1); + } + + uint64x1_t + test_vdupd_lane_u64 (uint64x2_t a) + { +- return vdupd_lane_u64 (a, 2); ++ return vdupd_lane_u64 (a, 1); + } + + /* { dg-final { scan-assembler-times "\\tcmtst\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-int.x" + +-int +-atomic_fetch_add_RELAXED (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_sub_RELAXED (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_and_RELAXED (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_nand_RELAXED (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_xor_RELAXED (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); +-} +- +-int +-atomic_fetch_or_RELAXED (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); +-} +- + /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/cmn-neg.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/cmn-neg.c +@@ -0,0 +1,33 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps" } */ ++ ++extern void abort (void); ++ ++void __attribute__ ((noinline)) ++foo_s32 (int a, int b) ++{ ++ if (a < -b) ++ abort (); ++} ++/* { dg-final { scan-assembler "cmn\tw\[0-9\]" } } */ ++ ++void __attribute__ ((noinline)) ++foo_s64 (long long a, long long b) ++{ ++ if (a < -b) ++ abort (); ++} ++/* { dg-final { scan-assembler "cmn\tx\[0-9\]" } } */ ++ ++ ++int ++main (void) ++{ ++ int a = 30; ++ int b = 42; ++ foo_s32 (a, b); ++ foo_s64 (a, b); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-seq_cst.x" + +-int +-atomic_fetch_add_SEQ_CST (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST); +-} +- +-int +-atomic_fetch_sub_SEQ_CST (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST); +-} +- +-int +-atomic_fetch_and_SEQ_CST (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST); +-} +- +-int +-atomic_fetch_nand_SEQ_CST (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST); +-} +- +-int +-atomic_fetch_xor_SEQ_CST (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST); +-} +- +-int +-atomic_fetch_or_SEQ_CST (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST); +-} +- + /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.x +@@ -0,0 +1,27 @@ ++ ++float32_t ++test_vaddv_v2sf (const float32_t *pool) ++{ ++ float32x2_t val; ++ ++ val = vld1_f32 (pool); ++ return vaddv_f32 (val); ++} ++ ++float32_t ++test_vaddv_v4sf (const float32_t *pool) ++{ ++ float32x4_t val; ++ ++ val = vld1q_f32 (pool); ++ return vaddvq_f32 (val); ++} ++ ++float64_t ++test_vaddv_v2df (const float64_t *pool) ++{ ++ float64x2_t val; ++ ++ val = vld1q_f64 (pool); ++ return vaddvq_f64 (val); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/negs.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/negs.c +@@ -0,0 +1,108 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps" } */ ++ ++extern void abort (void); ++int z; ++ ++int ++negs_si_test1 (int a, int b, int c) ++{ ++ int d = -b; ++ ++ /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+" } } */ ++ if (d < 0) ++ return a + c; ++ ++ z = d; ++ return b + c + d; ++} ++ ++int ++negs_si_test3 (int a, int b, int c) ++{ ++ int d = -(b) << 3; ++ ++ /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ ++ z = d; ++ return b + c + d; ++} ++ ++typedef long long s64; ++s64 zz; ++ ++s64 ++negs_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = -b; ++ ++ /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+" } } */ ++ if (d < 0) ++ return a + c; ++ ++ zz = d; ++ return b + c + d; ++} ++ ++s64 ++negs_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = -(b) << 3; ++ ++ /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ ++ zz = d; ++ return b + c + d; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = negs_si_test1 (2, 12, 5); ++ if (x != 7) ++ abort (); ++ ++ x = negs_si_test1 (1, 2, 32); ++ if (x != 33) ++ abort (); ++ ++ x = negs_si_test3 (13, 14, 5); ++ if (x != -93) ++ abort (); ++ ++ x = negs_si_test3 (15, 21, 2); ++ if (x != -145) ++ abort (); ++ ++ y = negs_di_test1 (0x20202020ll, ++ 0x65161611ll, ++ 0x42434243ll); ++ if (y != 0x62636263ll) ++ abort (); ++ ++ y = negs_di_test1 (0x1010101010101ll, ++ 0x123456789abcdll, ++ 0x5555555555555ll); ++ if (y != 0x6565656565656ll) ++ abort (); ++ ++ y = negs_di_test3 (0x62523781ll, ++ 0x64234978ll, ++ 0x12345123ll); ++ if (y != 0xfffffffd553d4edbll) ++ abort (); ++ ++ y = negs_di_test3 (0x763526268ll, ++ 0x101010101ll, ++ 0x222222222ll); ++ if (y != 0xfffffffb1b1b1b1bll) ++ abort (); ++ ++ return 0; ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-consume.x" + +-int +-atomic_fetch_add_CONSUME (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME); +-} +- +-int +-atomic_fetch_sub_CONSUME (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME); +-} +- +-int +-atomic_fetch_and_CONSUME (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME); +-} +- +-int +-atomic_fetch_nand_CONSUME (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME); +-} +- +-int +-atomic_fetch_xor_CONSUME (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME); +-} +- +-int +-atomic_fetch_or_CONSUME (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME); +-} +- + /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vaddv.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vaddv.c +@@ -0,0 +1,128 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps -ffast-math" } */ ++ ++#include ++ ++extern void abort (void); ++extern float fabsf (float); ++extern double fabs (double); ++ ++#define NUM_TESTS 16 ++#define DELTA 0.000001 ++ ++int8_t input_int8[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++int16_t input_int16[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++int32_t input_int32[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++int64_t input_int64[] = {1, 56, 2, -9, -90, 23, 54, 76, ++ -4, 34, 110, -110, 6, 4, 75, -34}; ++ ++uint8_t input_uint8[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++uint16_t input_uint16[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++uint32_t input_uint32[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++ ++uint64_t input_uint64[] = {1, 56, 2, 9, 90, 23, 54, 76, ++ 4, 34, 110, 110, 6, 4, 75, 34}; ++ ++float input_float32[] = {0.1f, -0.1f, 0.4f, 10.3f, ++ 200.0f, -800.0f, -13.0f, -0.5f, ++ 7.9f, -870.0f, 10.4f, 310.11f, ++ 0.0f, -865.0f, -2213.0f, -1.5f}; ++ ++double input_float64[] = {0.1, -0.1, 0.4, 10.3, ++ 200.0, -800.0, -13.0, -0.5, ++ 7.9, -870.0, 10.4, 310.11, ++ 0.0, -865.0, -2213.0, -1.5}; ++ ++#define EQUALF(a, b) (fabsf (a - b) < DELTA) ++#define EQUALD(a, b) (fabs (a - b) < DELTA) ++#define EQUALL(a, b) (a == b) ++ ++#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT) \ ++int \ ++test_vaddv##SUFFIX##_##TYPE##x##LANES##_t (void) \ ++{ \ ++ int i, j; \ ++ int moves = (NUM_TESTS - LANES) + 1; \ ++ TYPE##_t out_l[NUM_TESTS]; \ ++ TYPE##_t out_v[NUM_TESTS]; \ ++ \ ++ /* Calculate linearly. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ out_l[i] = input_##TYPE[i]; \ ++ for (j = 1; j < LANES; j++) \ ++ out_l[i] += input_##TYPE[i + j]; \ ++ } \ ++ \ ++ /* Calculate using vector reduction intrinsics. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \ ++ out_v[i] = vaddv##Q##_##SUFFIX (t1); \ ++ } \ ++ \ ++ /* Compare. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ if (!EQUAL##FLOAT (out_v[i], out_l[i])) \ ++ return 0; \ ++ } \ ++ return 1; \ ++} ++ ++#define BUILD_VARIANTS(TYPE, STYPE, W32, W64, F) \ ++TEST (STYPE, , TYPE, W32, F) \ ++TEST (STYPE, q, TYPE, W64, F) \ ++ ++BUILD_VARIANTS (int8, s8, 8, 16, L) ++BUILD_VARIANTS (uint8, u8, 8, 16, L) ++/* { dg-final { scan-assembler "addv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */ ++/* { dg-final { scan-assembler "addv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */ ++BUILD_VARIANTS (int16, s16, 4, 8, L) ++BUILD_VARIANTS (uint16, u16, 4, 8, L) ++/* { dg-final { scan-assembler "addv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */ ++/* { dg-final { scan-assembler "addv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */ ++BUILD_VARIANTS (int32, s32, 2, 4, L) ++BUILD_VARIANTS (uint32, u32, 2, 4, L) ++/* { dg-final { scan-assembler "addp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "addv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++TEST (s64, q, int64, 2, D) ++TEST (u64, q, uint64, 2, D) ++/* { dg-final { scan-assembler "addp\\td\[0-9\]+\, v\[0-9\]+\.2d" } } */ ++ ++BUILD_VARIANTS (float32, f32, 2, 4, F) ++/* { dg-final { scan-assembler "faddp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "faddp\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++TEST (f64, q, float64, 2, D) ++/* { dg-final { scan-assembler "faddp\\td\[0-9\]+\, v\[0-9\]+\.2d" } } */ ++ ++#undef TEST ++#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT) \ ++{ \ ++ if (!test_vaddv##SUFFIX##_##TYPE##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++int ++main (int argc, char **argv) ++{ ++BUILD_VARIANTS (int8, s8, 8, 16, L) ++BUILD_VARIANTS (uint8, u8, 8, 16, L) ++BUILD_VARIANTS (int16, s16, 4, 8, L) ++BUILD_VARIANTS (uint16, u16, 4, 8, L) ++BUILD_VARIANTS (int32, s32, 2, 4, L) ++BUILD_VARIANTS (uint32, u32, 2, 4, L) ++ ++BUILD_VARIANTS (float32, f32, 2, 4, F) ++TEST (f64, q, float64, 2, D) ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-char v = 0; ++#include "atomic-op-char.x" + +-char +-atomic_fetch_add_RELAXED (char a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); +-} +- +-char +-atomic_fetch_sub_RELAXED (char a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); +-} +- +-char +-atomic_fetch_and_RELAXED (char a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); +-} +- +-char +-atomic_fetch_nand_RELAXED (char a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); +-} +- +-char +-atomic_fetch_xor_RELAXED (char a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); +-} +- +-char +-atomic_fetch_or_RELAXED (char a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); +-} +- + /* { dg-final { scan-assembler-times "ldxrb\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxrb\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_RELAXED (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_sub_RELAXED (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_and_RELAXED (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_nand_RELAXED (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_xor_RELAXED (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); ++} ++ ++int ++atomic_fetch_or_RELAXED (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_SEQ_CST (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST); ++} ++ ++int ++atomic_fetch_sub_SEQ_CST (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST); ++} ++ ++int ++atomic_fetch_and_SEQ_CST (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST); ++} ++ ++int ++atomic_fetch_nand_SEQ_CST (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST); ++} ++ ++int ++atomic_fetch_xor_SEQ_CST (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST); ++} ++ ++int ++atomic_fetch_or_SEQ_CST (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c +@@ -0,0 +1,40 @@ ++/* { dg-do run { target aarch64*-*-* } } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++/* { dg-require-effective-target aarch64_little_endian } */ ++ ++extern void abort (void); ++ ++typedef struct bitfield ++{ ++ unsigned short eight1: 8; ++ unsigned short four: 4; ++ unsigned short eight2: 8; ++ unsigned short seven: 7; ++ unsigned int sixteen: 16; ++} bitfield; ++ ++bitfield ++bfxil (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 16, 8" } } */ ++ a.eight1 = a.eight2; ++ return a; ++} ++ ++int ++main (void) ++{ ++ static bitfield a; ++ bitfield b; ++ ++ a.eight1 = 9; ++ a.eight2 = 57; ++ b = bfxil (a); ++ ++ if (b.eight1 != a.eight2) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_CONSUME (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME); ++} ++ ++int ++atomic_fetch_sub_CONSUME (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME); ++} ++ ++int ++atomic_fetch_and_CONSUME (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME); ++} ++ ++int ++atomic_fetch_nand_CONSUME (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME); ++} ++ ++int ++atomic_fetch_xor_CONSUME (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME); ++} ++ ++int ++atomic_fetch_or_CONSUME (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-short v = 0; ++#include "atomic-op-short.x" + +-short +-atomic_fetch_add_RELAXED (short a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); +-} +- +-short +-atomic_fetch_sub_RELAXED (short a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); +-} +- +-short +-atomic_fetch_and_RELAXED (short a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); +-} +- +-short +-atomic_fetch_nand_RELAXED (short a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); +-} +- +-short +-atomic_fetch_xor_RELAXED (short a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); +-} +- +-short +-atomic_fetch_or_RELAXED (short a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); +-} +- + /* { dg-final { scan-assembler-times "ldxrh\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stxrh\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.x +@@ -0,0 +1,37 @@ ++char v = 0; ++ ++char ++atomic_fetch_add_RELAXED (char a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); ++} ++ ++char ++atomic_fetch_sub_RELAXED (char a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); ++} ++ ++char ++atomic_fetch_and_RELAXED (char a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); ++} ++ ++char ++atomic_fetch_nand_RELAXED (char a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); ++} ++ ++char ++atomic_fetch_xor_RELAXED (char a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); ++} ++ ++char ++atomic_fetch_or_RELAXED (char a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-f.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-f.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE float ++#define ITYPE int + #define OP == + #define INV_OP != + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */ + /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */ + /* { dg-final { cleanup-tree-dump "vect" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp-compile.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp-compile.c +@@ -11,3 +11,4 @@ + /* { dg-final { scan-assembler "fdiv\\tv" } } */ + /* { dg-final { scan-assembler "fneg\\tv" } } */ + /* { dg-final { scan-assembler "fabs\\tv" } } */ ++/* { dg-final { scan-assembler "fabd\\tv" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/adds1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/adds1.c +@@ -0,0 +1,149 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++adds_si_test1 (int a, int b, int c) ++{ ++ int d = a + b; ++ ++ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++adds_si_test2 (int a, int b, int c) ++{ ++ int d = a + 0xff; ++ ++ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, 255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++adds_si_test3 (int a, int b, int c) ++{ ++ int d = a + (b << 3); ++ ++ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++adds_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + b; ++ ++ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++adds_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + 0xff; ++ ++ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, 255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++adds_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + (b << 3); ++ ++ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = adds_si_test1 (29, 4, 5); ++ if (x != 42) ++ abort (); ++ ++ x = adds_si_test1 (5, 2, 20); ++ if (x != 29) ++ abort (); ++ ++ x = adds_si_test2 (29, 4, 5); ++ if (x != 293) ++ abort (); ++ ++ x = adds_si_test2 (1024, 2, 20); ++ if (x != 1301) ++ abort (); ++ ++ x = adds_si_test3 (35, 4, 5); ++ if (x != 76) ++ abort (); ++ ++ x = adds_si_test3 (5, 2, 20); ++ if (x != 43) ++ abort (); ++ ++ y = adds_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != 0xc75050536) ++ abort (); ++ ++ y = adds_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x9222922294249) ++ abort (); ++ ++ y = adds_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x955050631) ++ abort (); ++ ++ y = adds_di_test2 (0x130002900ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x955052f08) ++ abort (); ++ ++ y = adds_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != 0x9b9050576) ++ abort (); ++ ++ y = adds_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != 0xafd052e4d) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/insv_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/insv_1.c +@@ -0,0 +1,85 @@ ++/* { dg-do run { target aarch64*-*-* } } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++/* { dg-require-effective-target aarch64_little_endian } */ ++ ++extern void abort (void); ++ ++typedef struct bitfield ++{ ++ unsigned short eight: 8; ++ unsigned short four: 4; ++ unsigned short five: 5; ++ unsigned short seven: 7; ++ unsigned int sixteen: 16; ++} bitfield; ++ ++bitfield ++bfi1 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 0, 8" } } */ ++ a.eight = 3; ++ return a; ++} ++ ++bitfield ++bfi2 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 16, 5" } } */ ++ a.five = 7; ++ return a; ++} ++ ++bitfield ++movk (bitfield a) ++{ ++ /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 32" } } */ ++ a.sixteen = 7531; ++ return a; ++} ++ ++bitfield ++set1 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 2031616" } } */ ++ a.five = 0x1f; ++ return a; ++} ++ ++bitfield ++set0 (bitfield a) ++{ ++ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -2031617" } } */ ++ a.five = 0; ++ return a; ++} ++ ++ ++int ++main (int argc, char** argv) ++{ ++ static bitfield a; ++ bitfield b = bfi1 (a); ++ bitfield c = bfi2 (b); ++ bitfield d = movk (c); ++ ++ if (d.eight != 3) ++ abort (); ++ ++ if (d.five != 7) ++ abort (); ++ ++ if (d.sixteen != 7531) ++ abort (); ++ ++ d = set1 (d); ++ if (d.five != 0x1f) ++ abort (); ++ ++ d = set0 (d); ++ if (d.five != 0) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/ror.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/ror.c +@@ -0,0 +1,34 @@ ++/* { dg-options "-O2 --save-temps" } */ ++/* { dg-do run } */ ++ ++extern void abort (void); ++ ++int ++test_si (int a) ++{ ++ /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 27\n" } } */ ++ return (a << 5) | ((unsigned int) a >> 27); ++} ++ ++long long ++test_di (long long a) ++{ ++ /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 45\n" } } */ ++ return (a << 19) | ((unsigned long long) a >> 45); ++} ++ ++int ++main () ++{ ++ int v; ++ long long w; ++ v = test_si (0x0203050); ++ if (v != 0x4060a00) ++ abort(); ++ w = test_di (0x0000020506010304ll); ++ if (w != 0x1028300818200000ll) ++ abort(); ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/ands_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/ands_1.c +@@ -0,0 +1,151 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++ands_si_test1 (int a, int b, int c) ++{ ++ int d = a & b; ++ ++ /* { dg-final { scan-assembler-times "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++ands_si_test2 (int a, int b, int c) ++{ ++ int d = a & 0xff; ++ ++ /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, 255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++ands_si_test3 (int a, int b, int c) ++{ ++ int d = a & (b << 3); ++ ++ /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++ands_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & b; ++ ++ /* { dg-final { scan-assembler-times "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++ands_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & 0xff; ++ ++ /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, 255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++ands_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a & (b << 3); ++ ++ /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++main () ++{ ++ int x; ++ s64 y; ++ ++ x = ands_si_test1 (29, 4, 5); ++ if (x != 13) ++ abort (); ++ ++ x = ands_si_test1 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ x = ands_si_test2 (29, 4, 5); ++ if (x != 38) ++ abort (); ++ ++ x = ands_si_test2 (1024, 2, 20); ++ if (x != 1044) ++ abort (); ++ ++ x = ands_si_test3 (35, 4, 5); ++ if (x != 41) ++ abort (); ++ ++ x = ands_si_test3 (5, 2, 20); ++ if (x != 25) ++ abort (); ++ ++ y = ands_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x5000500052025ll) ++ abort (); ++ ++ y = ands_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & 0xff) + 0x320000004ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test2 (0x130002900ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != (0x130002900ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != ((0x130000029ll & (0x064000008ll << 3)) ++ + 0x064000008ll + 0x505050505ll)) ++ abort (); ++ ++ y = ands_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != (0x130002900ll + 0x505050505ll)) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-release.x" + +-int +-atomic_fetch_add_RELEASE (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE); +-} +- +-int +-atomic_fetch_sub_RELEASE (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE); +-} +- +-int +-atomic_fetch_and_RELEASE (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE); +-} +- +-int +-atomic_fetch_nand_RELEASE (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE); +-} +- +-int +-atomic_fetch_xor_RELEASE (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE); +-} +- +-int +-atomic_fetch_or_RELEASE (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE); +-} +- + /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vfmaxv.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vfmaxv.c +@@ -0,0 +1,169 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps -ffast-math" } */ ++ ++#include ++ ++extern void abort (void); ++ ++extern float fabsf (float); ++extern double fabs (double); ++extern int isnan (double); ++extern float fmaxf (float, float); ++extern float fminf (float, float); ++extern double fmax (double, double); ++extern double fmin (double, double); ++ ++#define NUM_TESTS 16 ++#define DELTA 0.000001 ++#define NAN (0.0 / 0.0) ++ ++float input_float32[] = {0.1f, -0.1f, 0.4f, 10.3f, ++ 200.0f, -800.0f, -13.0f, -0.5f, ++ NAN, -870.0f, 10.4f, 310.11f, ++ 0.0f, -865.0f, -2213.0f, -1.5f}; ++ ++double input_float64[] = {0.1, -0.1, 0.4, 10.3, ++ 200.0, -800.0, -13.0, -0.5, ++ NAN, -870.0, 10.4, 310.11, ++ 0.0, -865.0, -2213.0, -1.5}; ++ ++#define EQUALF(a, b) (fabsf (a - b) < DELTA) ++#define EQUALD(a, b) (fabs (a - b) < DELTA) ++ ++/* Floating point 'unordered' variants. */ ++ ++#undef TEST ++#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \ ++int \ ++test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void) \ ++{ \ ++ int i, j; \ ++ int moves = (NUM_TESTS - LANES) + 1; \ ++ TYPE##_t out_l[NUM_TESTS]; \ ++ TYPE##_t out_v[NUM_TESTS]; \ ++ \ ++ /* Calculate linearly. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ out_l[i] = input_##TYPE[i]; \ ++ for (j = 0; j < LANES; j++) \ ++ { \ ++ if (isnan (out_l[i])) \ ++ continue; \ ++ if (isnan (input_##TYPE[i + j]) \ ++ || input_##TYPE[i + j] CMP_OP out_l[i]) \ ++ out_l[i] = input_##TYPE[i + j]; \ ++ } \ ++ } \ ++ \ ++ /* Calculate using vector reduction intrinsics. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \ ++ out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1); \ ++ } \ ++ \ ++ /* Compare. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ if (!EQUAL##FLOAT (out_v[i], out_l[i]) \ ++ && !(isnan (out_v[i]) && isnan (out_l[i]))) \ ++ return 0; \ ++ } \ ++ return 1; \ ++} ++ ++#define BUILD_VARIANTS(TYPE, STYPE, W32, W64, F) \ ++TEST (max, >, STYPE, , TYPE, W32, F) \ ++TEST (max, >, STYPE, q, TYPE, W64, F) \ ++TEST (min, <, STYPE, , TYPE, W32, F) \ ++TEST (min, <, STYPE, q, TYPE, W64, F) ++ ++BUILD_VARIANTS (float32, f32, 2, 4, F) ++/* { dg-final { scan-assembler "fmaxp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fminp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fmaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++TEST (max, >, f64, q, float64, 2, D) ++/* { dg-final { scan-assembler "fmaxp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */ ++TEST (min, <, f64, q, float64, 2, D) ++/* { dg-final { scan-assembler "fminp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */ ++ ++/* Floating point 'nm' variants. */ ++ ++#undef TEST ++#define TEST(MAXMIN, F, SUFFIX, Q, TYPE, LANES, FLOAT) \ ++int \ ++test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t (void) \ ++{ \ ++ int i, j; \ ++ int moves = (NUM_TESTS - LANES) + 1; \ ++ TYPE##_t out_l[NUM_TESTS]; \ ++ TYPE##_t out_v[NUM_TESTS]; \ ++ \ ++ /* Calculate linearly. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ out_l[i] = input_##TYPE[i]; \ ++ for (j = 0; j < LANES; j++) \ ++ out_l[i] = f##MAXMIN##F (input_##TYPE[i + j], out_l[i]); \ ++ } \ ++ \ ++ /* Calculate using vector reduction intrinsics. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \ ++ out_v[i] = v##MAXMIN##nmv##Q##_##SUFFIX (t1); \ ++ } \ ++ \ ++ /* Compare. */ \ ++ for (i = 0; i < moves; i++) \ ++ { \ ++ if (!EQUAL##FLOAT (out_v[i], out_l[i])) \ ++ return 0; \ ++ } \ ++ return 1; \ ++} ++ ++TEST (max, f, f32, , float32, 2, D) ++/* { dg-final { scan-assembler "fmaxnmp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */ ++TEST (min, f, f32, , float32, 2, D) ++/* { dg-final { scan-assembler "fminnmp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */ ++TEST (max, f, f32, q, float32, 4, D) ++/* { dg-final { scan-assembler "fmaxnmv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++TEST (min, f, f32, q, float32, 4, D) ++/* { dg-final { scan-assembler "fminnmv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */ ++TEST (max, , f64, q, float64, 2, D) ++/* { dg-final { scan-assembler "fmaxnmp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */ ++TEST (min, , f64, q, float64, 2, D) ++/* { dg-final { scan-assembler "fminnmp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */ ++ ++#undef TEST ++#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \ ++{ \ ++ if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++int ++main (int argc, char **argv) ++{ ++ BUILD_VARIANTS (float32, f32, 2, 4, F) ++ TEST (max, >, f64, q, float64, 2, D) ++ TEST (min, <, f64, q, float64, 2, D) ++ ++#undef TEST ++#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \ ++{ \ ++ if (!test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++ BUILD_VARIANTS (float32, f32, 2, 4, F) ++ TEST (max, >, f64, q, float64, 2, D) ++ TEST (min, <, f64, q, float64, 2, D) ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.x +@@ -0,0 +1,37 @@ ++short v = 0; ++ ++short ++atomic_fetch_add_RELAXED (short a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED); ++} ++ ++short ++atomic_fetch_sub_RELAXED (short a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED); ++} ++ ++short ++atomic_fetch_and_RELAXED (short a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED); ++} ++ ++short ++atomic_fetch_nand_RELAXED (short a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED); ++} ++ ++short ++atomic_fetch_xor_RELAXED (short a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); ++} ++ ++short ++atomic_fetch_or_RELAXED (short a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c +@@ -0,0 +1,132 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 --save-temps -ffast-math" } */ ++ ++#include ++ ++extern void abort (void); ++extern double fabs (double); ++ ++#define NUM_TESTS 8 ++#define DELTA 0.000001 ++ ++float input_f32[] = {0.1f, -0.1f, 0.4f, 10.3f, ++ 200.0f, -800.0f, -13.0f, -0.5f}; ++double input_f64[] = {0.1, -0.1, 0.4, 10.3, ++ 200.0, -800.0, -13.0, -0.5}; ++ ++#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D) \ ++int \ ++test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t (void) \ ++{ \ ++ int ret = 1; \ ++ int i = 0; \ ++ int nlanes = LANES; \ ++ U##int##WIDTH##_t expected_out[NUM_TESTS]; \ ++ U##int##WIDTH##_t actual_out[NUM_TESTS]; \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ { \ ++ expected_out[i] \ ++ = vcvt##SUFFIX##D##_##S##WIDTH##_f##WIDTH (input_f##WIDTH[i]); \ ++ /* Don't vectorize this. */ \ ++ asm volatile ("" : : : "memory"); \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i+=nlanes) \ ++ { \ ++ U##int##WIDTH##x##LANES##_t out = \ ++ vcvt##SUFFIX##Q##_##S##WIDTH##_f##WIDTH \ ++ (vld1##Q##_f##WIDTH (input_f##WIDTH + i)); \ ++ vst1##Q##_##S##WIDTH (actual_out + i, out); \ ++ } \ ++ \ ++ for (i = 0; i < NUM_TESTS; i++) \ ++ ret &= fabs (expected_out[i] - actual_out[i]) < DELTA; \ ++ \ ++ return ret; \ ++} \ ++ ++ ++#define BUILD_VARIANTS(SUFFIX) \ ++TEST (SUFFIX, , 32, 2, s, ,s) \ ++TEST (SUFFIX, q, 32, 4, s, ,s) \ ++TEST (SUFFIX, q, 64, 2, s, ,d) \ ++TEST (SUFFIX, , 32, 2, u,u,s) \ ++TEST (SUFFIX, q, 32, 4, u,u,s) \ ++TEST (SUFFIX, q, 64, 2, u,u,d) \ ++ ++BUILD_VARIANTS ( ) ++/* { dg-final { scan-assembler "fcvtzs\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtzs\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "fcvtzu\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtzu\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (a) ++/* { dg-final { scan-assembler "fcvtas\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtas\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "fcvtau\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtau\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (m) ++/* { dg-final { scan-assembler "fcvtms\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtms\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "fcvtmu\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtmu\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (n) ++/* { dg-final { scan-assembler "fcvtns\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtns\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "fcvtnu\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtnu\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++BUILD_VARIANTS (p) ++/* { dg-final { scan-assembler "fcvtps\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtps\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++/* { dg-final { scan-assembler "fcvtpu\\tw\[0-9\]+, s\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtpu\\tx\[0-9\]+, d\[0-9\]+" } } */ ++/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */ ++/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */ ++/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ ++ ++#undef TEST ++#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D) \ ++{ \ ++ if (!test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t ()) \ ++ abort (); \ ++} ++ ++int ++main (int argc, char **argv) ++{ ++ BUILD_VARIANTS ( ) ++ BUILD_VARIANTS (a) ++ BUILD_VARIANTS (m) ++ BUILD_VARIANTS (n) ++ BUILD_VARIANTS (p) ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.x +@@ -0,0 +1,37 @@ ++int v = 0; ++ ++int ++atomic_fetch_add_RELEASE (int a) ++{ ++ return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE); ++} ++ ++int ++atomic_fetch_sub_RELEASE (int a) ++{ ++ return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE); ++} ++ ++int ++atomic_fetch_and_RELEASE (int a) ++{ ++ return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE); ++} ++ ++int ++atomic_fetch_nand_RELEASE (int a) ++{ ++ return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE); ++} ++ ++int ++atomic_fetch_xor_RELEASE (int a) ++{ ++ return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE); ++} ++ ++int ++atomic_fetch_or_RELEASE (int a) ++{ ++ return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE); ++} +--- a/src/gcc/testsuite/gcc.target/aarch64/fabd.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/fabd.c +@@ -0,0 +1,38 @@ ++/* { dg-do run } */ ++/* { dg-options "-O1 -fno-inline --save-temps" } */ ++ ++extern double fabs (double); ++extern float fabsf (float); ++extern void abort (); ++extern void exit (int); ++ ++void ++fabd_d (double x, double y, double d) ++{ ++ if ((fabs (x - y) - d) > 0.00001) ++ abort (); ++} ++ ++/* { dg-final { scan-assembler "fabd\td\[0-9\]+" } } */ ++ ++void ++fabd_f (float x, float y, float d) ++{ ++ if ((fabsf (x - y) - d) > 0.00001) ++ abort (); ++} ++ ++/* { dg-final { scan-assembler "fabd\ts\[0-9\]+" } } */ ++ ++int ++main () ++{ ++ fabd_d (10.0, 5.0, 5.0); ++ fabd_d (5.0, 10.0, 5.0); ++ fabd_f (10.0, 5.0, 5.0); ++ fabd_f (5.0, 10.0, 5.0); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp.c +@@ -117,6 +117,16 @@ + 9.0, 10.0, 11.0, 12.0, + 13.0, 14.0, 15.0, 16.0 }; + ++ F32 fabd_F32_vector[] = { 1.0f, 1.0f, 1.0f, 1.0f, ++ 1.0f, 1.0f, 1.0f, 1.0f, ++ 1.0f, 1.0f, 1.0f, 1.0f, ++ 1.0f, 1.0f, 1.0f, 1.0f }; ++ ++ F64 fabd_F64_vector[] = { 1.0, 1.0, 1.0, 1.0, ++ 1.0, 1.0, 1.0, 1.0, ++ 1.0, 1.0, 1.0, 1.0, ++ 1.0, 1.0, 1.0, 1.0 }; ++ + /* Setup input vectors. */ + for (i=1; i<=16; i++) + { +@@ -132,6 +142,7 @@ + TEST (div, 3); + TEST (neg, 2); + TEST (abs, 2); ++ TEST (fabd, 3); + + return 0; + } +--- a/src/gcc/testsuite/gcc.target/aarch64/ngc.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/ngc.c +@@ -0,0 +1,66 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++typedef unsigned int u32; ++ ++u32 ++ngc_si (u32 a, u32 b, u32 c, u32 d) ++{ ++ a = -b - (c < d); ++ return a; ++} ++ ++typedef unsigned long long u64; ++ ++u64 ++ngc_si_tst (u64 a, u32 b, u32 c, u32 d) ++{ ++ a = -b - (c < d); ++ return a; ++} ++ ++u64 ++ngc_di (u64 a, u64 b, u64 c, u64 d) ++{ ++ a = -b - (c < d); ++ return a; ++} ++ ++int ++main () ++{ ++ int x; ++ u64 y; ++ ++ x = ngc_si (29, 4, 5, 4); ++ if (x != -4) ++ abort (); ++ ++ x = ngc_si (1024, 2, 20, 13); ++ if (x != -2) ++ abort (); ++ ++ y = ngc_si_tst (0x130000029ll, 32, 50, 12); ++ if (y != 0xffffffe0) ++ abort (); ++ ++ y = ngc_si_tst (0x5000500050005ll, 21, 2, 14); ++ if (y != 0xffffffea) ++ abort (); ++ ++ y = ngc_di (0x130000029ll, 0x320000004ll, 0x505050505ll, 0x123123123ll); ++ if (y != 0xfffffffcdffffffc) ++ abort (); ++ ++ y = ngc_di (0x5000500050005ll, ++ 0x2111211121112ll, 0x0000000002020ll, 0x1414575046477ll); ++ if (y != 0xfffdeeedeeedeeed) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-times "ngc\tw\[0-9\]+, w\[0-9\]+" 2 } } */ ++/* { dg-final { scan-assembler-times "ngc\tx\[0-9\]+, x\[0-9\]+" 1 } } */ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/sha1_1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/sha1_1.c +@@ -0,0 +1,55 @@ ++ ++/* { dg-do compile } */ ++/* { dg-options "-march=armv8-a+crypto" } */ ++ ++#include "arm_neon.h" ++ ++uint32x4_t ++test_vsha1cq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return vsha1cq_u32 (hash_abcd, hash_e, wk); ++} ++ ++/* { dg-final { scan-assembler-times "sha1c\\tq" 1 } } */ ++ ++uint32x4_t ++test_vsha1mq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return vsha1mq_u32 (hash_abcd, hash_e, wk); ++} ++ ++/* { dg-final { scan-assembler-times "sha1m\\tq" 1 } } */ ++ ++uint32x4_t ++test_vsha1pq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return vsha1pq_u32 (hash_abcd, hash_e, wk); ++} ++ ++/* { dg-final { scan-assembler-times "sha1p\\tq" 1 } } */ ++ ++uint32_t ++test_vsha1h_u32 (uint32_t hash_e) ++{ ++ return vsha1h_u32 (hash_e); ++} ++ ++/* { dg-final { scan-assembler-times "sha1h\\ts" 1 } } */ ++ ++uint32x4_t ++test_vsha1su0q_u32 (uint32x4_t w0_3, uint32x4_t w4_7, uint32x4_t w8_11) ++{ ++ return vsha1su0q_u32 (w0_3, w4_7, w8_11); ++} ++ ++/* { dg-final { scan-assembler-times "sha1su0\\tv" 1 } } */ ++ ++uint32x4_t ++test_vsha1su1q_u32 (uint32x4_t tw0_3, uint32x4_t w12_15) ++{ ++ return vsha1su1q_u32 (tw0_3, w12_15); ++} ++ ++/* { dg-final { scan-assembler-times "sha1su1\\tv" 1 } } */ ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/cmp.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/cmp.c +@@ -0,0 +1,61 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2" } */ ++ ++int ++cmp_si_test1 (int a, int b, int c) ++{ ++ if (a > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++int ++cmp_si_test2 (int a, int b, int c) ++{ ++ if ((a >> 3) > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++typedef long long s64; ++ ++s64 ++cmp_di_test1 (s64 a, s64 b, s64 c) ++{ ++ if (a > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++s64 ++cmp_di_test2 (s64 a, s64 b, s64 c) ++{ ++ if ((a >> 3) > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++int ++cmp_di_test3 (int a, s64 b, s64 c) ++{ ++ if (a > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++int ++cmp_di_test4 (int a, s64 b, s64 c) ++{ ++ if (((s64)a << 3) > b) ++ return a + c; ++ else ++ return a + b + c; ++} ++ ++/* { dg-final { scan-assembler-times "cmp\tw\[0-9\]+, w\[0-9\]+" 2 } } */ ++/* { dg-final { scan-assembler-times "cmp\tx\[0-9\]+, x\[0-9\]+" 4 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-f.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-f.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE float ++#define ITYPE int + #define OP >= + #define INV_OP < + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */ + /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */ + /* { dg-final { scan-assembler "fcmlt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/bfxil_2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/bfxil_2.c +@@ -0,0 +1,42 @@ ++/* { dg-do run { target aarch64*-*-* } } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++/* { dg-require-effective-target aarch64_big_endian } */ ++ ++extern void abort (void); ++ ++typedef struct bitfield ++{ ++ unsigned short eight1: 8; ++ unsigned short four: 4; ++ unsigned short eight2: 8; ++ unsigned short seven: 7; ++ unsigned int sixteen: 16; ++ unsigned short eight3: 8; ++ unsigned short eight4: 8; ++} bitfield; ++ ++bitfield ++bfxil (bitfield a) ++{ ++ /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 40, 8" } } */ ++ a.eight4 = a.eight2; ++ return a; ++} ++ ++int ++main (void) ++{ ++ static bitfield a; ++ bitfield b; ++ ++ a.eight4 = 9; ++ a.eight2 = 57; ++ b = bfxil (a); ++ ++ if (b.eight4 != a.eight2) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp.x ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp.x +@@ -7,6 +7,16 @@ + extern float fabsf (float); + extern double fabs (double); + ++#define DEF3a(fname, type, op) \ ++ void fname##_##type (pR##type a, \ ++ pR##type b, \ ++ pR##type c) \ ++ { \ ++ int i; \ ++ for (i = 0; i < 16; i++) \ ++ a[i] = op (b[i] - c[i]); \ ++ } ++ + #define DEF3(fname, type, op) \ + void fname##_##type (pR##type a, \ + pR##type b, \ +@@ -13,7 +23,7 @@ + pR##type c) \ + { \ + int i; \ +- for (i=0; i<16; i++) \ ++ for (i = 0; i < 16; i++) \ + a[i] = b[i] op c[i]; \ + } + +@@ -22,11 +32,15 @@ + pR##type b) \ + { \ + int i; \ +- for (i=0; i<16; i++) \ ++ for (i = 0; i < 16; i++) \ + a[i] = op(b[i]); \ + } + + ++#define DEFN3a(fname, op) \ ++ DEF3a (fname, F32, op) \ ++ DEF3a (fname, F64, op) ++ + #define DEFN3(fname, op) \ + DEF3 (fname, F32, op) \ + DEF3 (fname, F64, op) +@@ -42,3 +56,5 @@ + DEFN2 (neg, -) + DEF2 (abs, F32, fabsf) + DEF2 (abs, F64, fabs) ++DEF3a (fabd, F32, fabsf) ++DEF3a (fabd, F64, fabs) +--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.c +@@ -1,43 +1,7 @@ + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + +-int v = 0; ++#include "atomic-op-acq_rel.x" + +-int +-atomic_fetch_add_ACQ_REL (int a) +-{ +- return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL); +-} +- +-int +-atomic_fetch_sub_ACQ_REL (int a) +-{ +- return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL); +-} +- +-int +-atomic_fetch_and_ACQ_REL (int a) +-{ +- return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL); +-} +- +-int +-atomic_fetch_nand_ACQ_REL (int a) +-{ +- return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL); +-} +- +-int +-atomic_fetch_xor_ACQ_REL (int a) +-{ +- return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL); +-} +- +-int +-atomic_fetch_or_ACQ_REL (int a) +-{ +- return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL); +-} +- + /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ + /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/subs1.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/subs1.c +@@ -0,0 +1,149 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++subs_si_test1 (int a, int b, int c) ++{ ++ int d = a - c; ++ ++ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++subs_si_test2 (int a, int b, int c) ++{ ++ int d = a - 0xff; ++ ++ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, #255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++subs_si_test3 (int a, int b, int c) ++{ ++ int d = a - (b << 3); ++ ++ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++subs_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - c; ++ ++ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++subs_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - 0xff; ++ ++ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, #255" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++subs_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a - (b << 3); ++ ++ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d == 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = subs_si_test1 (29, 4, 5); ++ if (x != 33) ++ abort (); ++ ++ x = subs_si_test1 (5, 2, 20); ++ if (x != 7) ++ abort (); ++ ++ x = subs_si_test2 (29, 4, 5); ++ if (x != -217) ++ abort (); ++ ++ x = subs_si_test2 (1024, 2, 20); ++ if (x != 791) ++ abort (); ++ ++ x = subs_si_test3 (35, 4, 5); ++ if (x != 12) ++ abort (); ++ ++ x = subs_si_test3 (5, 2, 20); ++ if (x != 11) ++ abort (); ++ ++ y = subs_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != 0x45000002d) ++ abort (); ++ ++ y = subs_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x7111711171117) ++ abort (); ++ ++ y = subs_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x955050433) ++ abort (); ++ ++ y = subs_di_test2 (0x130002900ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x955052d0a) ++ abort (); ++ ++ y = subs_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != 0x3790504f6) ++ abort (); ++ ++ y = subs_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != 0x27d052dcd) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/adds2.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/adds2.c +@@ -0,0 +1,155 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 --save-temps -fno-inline" } */ ++ ++extern void abort (void); ++ ++int ++adds_si_test1 (int a, int b, int c) ++{ ++ int d = a + b; ++ ++ /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++adds_si_test2 (int a, int b, int c) ++{ ++ int d = a + 0xfff; ++ ++ /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, 4095" } } */ ++ /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, 4095" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int ++adds_si_test3 (int a, int b, int c) ++{ ++ int d = a + (b << 3); ++ ++ /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++typedef long long s64; ++ ++s64 ++adds_di_test1 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + b; ++ ++ /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++adds_di_test2 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + 0x1000ll; ++ ++ /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, 4096" } } */ ++ /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, 4096" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++s64 ++adds_di_test3 (s64 a, s64 b, s64 c) ++{ ++ s64 d = a + (b << 3); ++ ++ /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */ ++ if (d <= 0) ++ return a + c; ++ else ++ return b + d + c; ++} ++ ++int main () ++{ ++ int x; ++ s64 y; ++ ++ x = adds_si_test1 (29, 4, 5); ++ if (x != 42) ++ abort (); ++ ++ x = adds_si_test1 (5, 2, 20); ++ if (x != 29) ++ abort (); ++ ++ x = adds_si_test2 (29, 4, 5); ++ if (x != 4133) ++ abort (); ++ ++ x = adds_si_test2 (1024, 2, 20); ++ if (x != 5141) ++ abort (); ++ ++ x = adds_si_test3 (35, 4, 5); ++ if (x != 76) ++ abort (); ++ ++ x = adds_si_test3 (5, 2, 20); ++ if (x != 43) ++ abort (); ++ ++ y = adds_di_test1 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ ++ if (y != 0xc75050536) ++ abort (); ++ ++ y = adds_di_test1 (0x5000500050005ll, ++ 0x2111211121112ll, ++ 0x0000000002020ll); ++ if (y != 0x9222922294249) ++ abort (); ++ ++ y = adds_di_test2 (0x130000029ll, ++ 0x320000004ll, ++ 0x505050505ll); ++ if (y != 0x955051532) ++ abort (); ++ ++ y = adds_di_test2 (0x540004100ll, ++ 0x320000004ll, ++ 0x805050205ll); ++ if (y != 0x1065055309) ++ abort (); ++ ++ y = adds_di_test3 (0x130000029ll, ++ 0x064000008ll, ++ 0x505050505ll); ++ if (y != 0x9b9050576) ++ abort (); ++ ++ y = adds_di_test3 (0x130002900ll, ++ 0x088000008ll, ++ 0x505050505ll); ++ if (y != 0xafd052e4d) ++ abort (); ++ ++ return 0; ++} ++ ++/* { dg-final { cleanup-saved-temps } } */ +--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-d.c ++++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-d.c +@@ -2,12 +2,13 @@ + /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */ + + #define FTYPE double ++#define ITYPE long + #define OP > + #define INV_OP <= + + #include "vect-fcm.x" + +-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ ++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */ + /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */ + /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */ + /* { dg-final { scan-assembler "fcmle\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */ +--- a/src/gcc/testsuite/lib/target-supports.exp ++++ b/src/gcc/testsuite/lib/target-supports.exp +@@ -487,13 +487,6 @@ + return 0 + } + +- # We don't yet support profiling for AArch64. +- if { [istarget aarch64*-*-*] +- && ([lindex $test_what 1] == "-p" +- || [lindex $test_what 1] == "-pg") } { +- return 0 +- } +- + # cygwin does not support -p. + if { [istarget *-*-cygwin*] && $test_what == "-p" } { + return 0 +@@ -2012,6 +2005,7 @@ + || ([istarget powerpc*-*-*] + && ![istarget powerpc-*-linux*paired*]) + || [istarget x86_64-*-*] ++ || [istarget aarch64*-*-*] + || ([istarget arm*-*-*] + && [check_effective_target_arm_neon_ok])} { + set et_vect_uintfloat_cvt_saved 1 +@@ -2078,6 +2072,15 @@ + }] + } + ++# Return 1 if this is a AArch64 target supporting little endian ++proc check_effective_target_aarch64_little_endian { } { ++ return [check_no_compiler_messages aarch64_little_endian assembly { ++ #if !defined(__aarch64__) || defined(__AARCH64EB__) ++ #error FOO ++ #endif ++ }] ++} ++ + # Return 1 is this is an arm target using 32-bit instructions + proc check_effective_target_arm32 { } { + return [check_no_compiler_messages arm32 assembly { +@@ -2147,22 +2150,6 @@ + } + } + +-# Return 1 if this is an ARM target supporting -mfpu=neon-fp-armv8 +-# -mfloat-abi=softfp +-proc check_effective_target_arm_v8_neon_ok {} { +- if { [check_effective_target_arm32] } { +- return [check_no_compiler_messages arm_v8_neon_ok object { +- int foo (void) +- { +- __asm__ volatile ("vrintn.f32 q0, q0"); +- return 0; +- } +- } "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"] +- } else { +- return 0 +- } +-} +- + # Return 1 if this is an ARM target supporting -mfpu=vfp + # -mfloat-abi=hard. Some multilibs may be incompatible with these + # options. +@@ -2202,6 +2189,49 @@ + }] + } + ++# Return 1 if this is an ARM target supporting -mfpu=crypto-neon-fp-armv8 ++# -mfloat-abi=softfp or equivalent options. Some multilibs may be ++# incompatible with these options. Also set et_arm_crypto_flags to the ++# best options to add. ++ ++proc check_effective_target_arm_crypto_ok_nocache { } { ++ global et_arm_crypto_flags ++ set et_arm_crypto_flags "" ++ if { [check_effective_target_arm32] } { ++ foreach flags {"" "-mfloat-abi=softfp" "-mfpu=crypto-neon-fp-armv8" "-mfpu=crypto-neon-fp-armv8 -mfloat-abi=softfp"} { ++ if { [check_no_compiler_messages_nocache arm_crypto_ok object { ++ #include "arm_neon.h" ++ uint8x16_t ++ foo (uint8x16_t a, uint8x16_t b) ++ { ++ return vaeseq_u8 (a, b); ++ } ++ } "$flags"] } { ++ set et_arm_crypto_flags $flags ++ return 1 ++ } ++ } ++ } ++ ++ return 0 ++} ++ ++# Return 1 if this is an ARM target supporting -mfpu=crypto-neon-fp-armv8 ++ ++proc check_effective_target_arm_crypto_ok { } { ++ return [check_cached_effective_target arm_crypto_ok \ ++ check_effective_target_arm_crypto_ok_nocache] ++} ++ ++# Add options for crypto extensions. ++proc add_options_for_arm_crypto { flags } { ++ if { ! [check_effective_target_arm_crypto_ok] } { ++ return "$flags" ++ } ++ global et_arm_crypto_flags ++ return "$flags $et_arm_crypto_flags" ++} ++ + # Add the options needed for NEON. We need either -mfloat-abi=softfp + # or -mfloat-abi=hard, but if one is already specified by the + # multilib, use it. Similarly, if a -mfpu option already enables +@@ -2226,9 +2256,18 @@ + if { ! [check_effective_target_arm_v8_neon_ok] } { + return "$flags" + } +- return "$flags -march=armv8-a -mfpu=neon-fp-armv8 -mfloat-abi=softfp" ++ global et_arm_v8_neon_flags ++ return "$flags $et_arm_v8_neon_flags -march=armv8-a" + } + ++proc add_options_for_arm_crc { flags } { ++ if { ! [check_effective_target_arm_crc_ok] } { ++ return "$flags" ++ } ++ global et_arm_crc_flags ++ return "$flags $et_arm_crc_flags" ++} ++ + # Add the options needed for NEON. We need either -mfloat-abi=softfp + # or -mfloat-abi=hard, but if one is already specified by the + # multilib, use it. Similarly, if a -mfpu option already enables +@@ -2270,6 +2309,94 @@ + check_effective_target_arm_neon_ok_nocache] + } + ++proc check_effective_target_arm_crc_ok_nocache { } { ++ global et_arm_crc_flags ++ set et_arm_crc_flags "-march=armv8-a+crc" ++ return [check_no_compiler_messages_nocache arm_crc_ok object { ++ #if !defined (__ARM_FEATURE_CRC32) ++ #error FOO ++ #endif ++ } "$et_arm_crc_flags"] ++} ++ ++proc check_effective_target_arm_crc_ok { } { ++ return [check_cached_effective_target arm_crc_ok \ ++ check_effective_target_arm_crc_ok_nocache] ++} ++ ++# Return 1 if this is an ARM target supporting -mfpu=neon-fp16 ++# -mfloat-abi=softfp or equivalent options. Some multilibs may be ++# incompatible with these options. Also set et_arm_neon_flags to the ++# best options to add. ++ ++proc check_effective_target_arm_neon_fp16_ok_nocache { } { ++ global et_arm_neon_fp16_flags ++ set et_arm_neon_fp16_flags "" ++ if { [check_effective_target_arm32] } { ++ foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp16" ++ "-mfpu=neon-fp16 -mfloat-abi=softfp"} { ++ if { [check_no_compiler_messages_nocache arm_neon_fp_16_ok object { ++ #include "arm_neon.h" ++ float16x4_t ++ foo (float32x4_t arg) ++ { ++ return vcvt_f16_f32 (arg); ++ } ++ } "$flags"] } { ++ set et_arm_neon_fp16_flags $flags ++ return 1 ++ } ++ } ++ } ++ ++ return 0 ++} ++ ++proc check_effective_target_arm_neon_fp16_ok { } { ++ return [check_cached_effective_target arm_neon_fp16_ok \ ++ check_effective_target_arm_neon_fp16_ok_nocache] ++} ++ ++proc add_options_for_arm_neon_fp16 { flags } { ++ if { ! [check_effective_target_arm_neon_fp16_ok] } { ++ return "$flags" ++ } ++ global et_arm_neon_fp16_flags ++ return "$flags $et_arm_neon_fp16_flags" ++} ++ ++# Return 1 if this is an ARM target supporting -mfpu=neon-fp-armv8 ++# -mfloat-abi=softfp or equivalent options. Some multilibs may be ++# incompatible with these options. Also set et_arm_v8_neon_flags to the ++# best options to add. ++ ++proc check_effective_target_arm_v8_neon_ok_nocache { } { ++ global et_arm_v8_neon_flags ++ set et_arm_v8_neon_flags "" ++ if { [check_effective_target_arm32] } { ++ foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp-armv8" "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"} { ++ if { [check_no_compiler_messages_nocache arm_v8_neon_ok object { ++ #include "arm_neon.h" ++ void ++ foo () ++ { ++ __asm__ volatile ("vrintn.f32 q0, q0"); ++ } ++ } "$flags"] } { ++ set et_arm_v8_neon_flags $flags ++ return 1 ++ } ++ } ++ } ++ ++ return 0 ++} ++ ++proc check_effective_target_arm_v8_neon_ok { } { ++ return [check_cached_effective_target arm_v8_neon_ok \ ++ check_effective_target_arm_v8_neon_ok_nocache] ++} ++ + # Return 1 if this is an ARM target supporting -mfpu=neon-vfpv4 + # -mfloat-abi=softfp or equivalent options. Some multilibs may be + # incompatible with these options. Also set et_arm_neonv2_flags to the +@@ -2332,6 +2459,11 @@ + # Must generate floating-point instructions. + return 0 + } ++ if [check_effective_target_arm_hf_eabi] { ++ # Use existing float-abi and force an fpu which supports fp16 ++ set et_arm_fp16_flags "-mfpu=vfpv4" ++ return 1; ++ } + if [check-flags [list "" { *-*-* } { "-mfpu=*" } { "" } ]] { + # The existing -mfpu value is OK; use it, but add softfp. + set et_arm_fp16_flags "-mfloat-abi=softfp" +@@ -2464,6 +2596,17 @@ + } ""] + } + ++# Return 1 if this is an ARM target where conditional execution is available. ++ ++proc check_effective_target_arm_cond_exec { } { ++ return [check_no_compiler_messages arm_cond_exec assembly { ++ #if defined(__arm__) && defined(__thumb__) && !defined(__thumb2__) ++ #error FOO ++ #endif ++ int i; ++ } ""] ++} ++ + # Return 1 if this is an ARM cortex-M profile cpu + + proc check_effective_target_arm_cortex_m { } { +@@ -2509,6 +2652,24 @@ + } [add_options_for_arm_neonv2 ""]] + } + ++# Return 1 if the target supports executing ARMv8 NEON instructions, 0 ++# otherwise. ++ ++proc check_effective_target_arm_v8_neon_hw { } { ++ return [check_runtime arm_v8_neon_hw_available { ++ #include "arm_neon.h" ++ int ++ main (void) ++ { ++ float32x2_t a; ++ asm ("vrinta.f32 %P0, %P1" ++ : "=w" (a) ++ : "0" (a)); ++ return 0; ++ } ++ } [add_options_for_arm_v8_neon ""]] ++} ++ + # Return 1 if this is a ARM target with NEON enabled. + + proc check_effective_target_arm_neon { } { +@@ -4591,6 +4752,33 @@ + return 0 + } + ++# Return 1 if programs are intended to be run on hardware rather than ++# on a simulator ++ ++proc check_effective_target_hw { } { ++ ++ # All "src/sim" simulators set this one. ++ if [board_info target exists is_simulator] { ++ if [board_info target is_simulator] { ++ return 0 ++ } else { ++ return 1 ++ } ++ } ++ ++ # The "sid" simulators don't set that one, but at least they set ++ # this one. ++ if [board_info target exists slow_simulator] { ++ if [board_info target slow_simulator] { ++ return 0 ++ } else { ++ return 1 ++ } ++ } ++ ++ return 1 ++} ++ + # Return 1 if the target is a VxWorks kernel. + + proc check_effective_target_vxworks_kernel { } { +--- a/src/gcc/testsuite/ChangeLog.linaro ++++ b/src/gcc/testsuite/ChangeLog.linaro +@@ -0,0 +1,978 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206519 ++ 2014-01-10 Kyrylo Tkachov ++ ++ * lib/target-supports.exp ++ (check_effective_target_arm_crypto_ok_nocache): New. ++ (check_effective_target_arm_crypto_ok): Use above procedure. ++ (add_options_for_arm_crypto): Use et_arm_crypto_flags. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206151 ++ 2013-12-20 Kyrylo Tkachov ++ ++ * gcc.target/arm/neon-vceq_p64.c: New test. ++ * gcc.target/arm/neon-vtst_p64.c: Likewise. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206131 ++ 2013-12-04 Kyrylo Tkachov ++ ++ * lib/target-supports.exp (check_effective_target_arm_crypto_ok): ++ New procedure. ++ (add_options_for_arm_crypto): Likewise. ++ * gcc.target/arm/crypto-vaesdq_u8.c: New test. ++ * gcc.target/arm/crypto-vaeseq_u8.c: Likewise. ++ * gcc.target/arm/crypto-vaesimcq_u8.c: Likewise. ++ * gcc.target/arm/crypto-vaesmcq_u8.c: Likewise. ++ * gcc.target/arm/crypto-vldrq_p128.c: Likewise. ++ * gcc.target/arm/crypto-vmull_high_p64.c: Likewise. ++ * gcc.target/arm/crypto-vmullp64.c: Likewise. ++ * gcc.target/arm/crypto-vsha1cq_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha1h_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha1mq_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha1pq_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha1su0q_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha1su1q_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha256h2q_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha256hq_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha256su0q_u32.c: Likewise. ++ * gcc.target/arm/crypto-vsha256su1q_u32.c: Likewise. ++ * gcc.target/arm/crypto-vstrq_p128.c: Likewise. ++ * gcc.target/arm/neon/vbslQp64: Generate. ++ * gcc.target/arm/neon/vbslp64: Likewise. ++ * gcc.target/arm/neon/vcombinep64: Likewise. ++ * gcc.target/arm/neon/vcreatep64: Likewise. ++ * gcc.target/arm/neon/vdupQ_lanep64: Likewise. ++ * gcc.target/arm/neon/vdupQ_np64: Likewise. ++ * gcc.target/arm/neon/vdup_lanep64: Likewise. ++ * gcc.target/arm/neon/vdup_np64: Likewise. ++ * gcc.target/arm/neon/vextQp64: Likewise. ++ * gcc.target/arm/neon/vextp64: Likewise. ++ * gcc.target/arm/neon/vget_highp64: Likewise. ++ * gcc.target/arm/neon/vget_lowp64: Likewise. ++ * gcc.target/arm/neon/vld1Q_dupp64: Likewise. ++ * gcc.target/arm/neon/vld1Q_lanep64: Likewise. ++ * gcc.target/arm/neon/vld1Qp64: Likewise. ++ * gcc.target/arm/neon/vld1_dupp64: Likewise. ++ * gcc.target/arm/neon/vld1_lanep64: Likewise. ++ * gcc.target/arm/neon/vld1p64: Likewise. ++ * gcc.target/arm/neon/vld2_dupp64: Likewise. ++ * gcc.target/arm/neon/vld2p64: Likewise. ++ * gcc.target/arm/neon/vld3_dupp64: Likewise. ++ * gcc.target/arm/neon/vld3p64: Likewise. ++ * gcc.target/arm/neon/vld4_dupp64: Likewise. ++ * gcc.target/arm/neon/vld4p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQf32_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQf32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_f32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_p16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_p8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_s16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_s32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_s64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_s8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_u16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_u32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_u64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp128_u8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp16_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_f32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_p16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_p8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_s16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_s32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_s64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_s8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_u16: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_u32: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_u64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp64_u8: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp8_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQp8_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs16_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs32_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs64_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs64_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs8_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQs8_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu16_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu32_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu64_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu64_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu8_p128: Likewise. ++ * gcc.target/arm/neon/vreinterpretQu8_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretf32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretp16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_f32: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_p16: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_p8: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_s16: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_s32: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_s64: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_s8: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_u16: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_u32: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_u64: Likewise. ++ * gcc.target/arm/neon/vreinterpretp64_u8: Likewise. ++ * gcc.target/arm/neon/vreinterpretp8_p64: Likewise. ++ * gcc.target/arm/neon/vreinterprets16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterprets32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterprets64_p64: Likewise. ++ * gcc.target/arm/neon/vreinterprets8_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretu16_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretu32_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretu64_p64: Likewise. ++ * gcc.target/arm/neon/vreinterpretu8_p64: Likewise. ++ * gcc.target/arm/neon/vsliQ_np64: Likewise. ++ * gcc.target/arm/neon/vsli_np64: Likewise. ++ * gcc.target/arm/neon/vsriQ_np64: Likewise. ++ * gcc.target/arm/neon/vsri_np64: Likewise. ++ * gcc.target/arm/neon/vst1Q_lanep64: Likewise. ++ * gcc.target/arm/neon/vst1Qp64: Likewise. ++ * gcc.target/arm/neon/vst1_lanep64: Likewise. ++ * gcc.target/arm/neon/vst1p64: Likewise. ++ * gcc.target/arm/neon/vst2p64: Likewise. ++ * gcc.target/arm/neon/vst3p64: Likewise. ++ * gcc.target/arm/neon/vst4p64: Likewise. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206128 ++ 2013-12-19 Kyrylo Tkachov ++ ++ * lib/target-supports.exp (add_options_for_arm_crc): New procedure. ++ (check_effective_target_arm_crc_ok_nocache): Likewise. ++ (check_effective_target_arm_crc_ok): Likewise. ++ * gcc.target/arm/acle/: New directory. ++ * gcc.target/arm/acle/acle.exp: New. ++ * gcc.target/arm/acle/crc32b.c: New test. ++ * gcc.target/arm/acle/crc32h.c: Likewise. ++ * gcc.target/arm/acle/crc32w.c: Likewise. ++ * gcc.target/arm/acle/crc32d.c: Likewise. ++ * gcc.target/arm/acle/crc32cb.c: Likewise. ++ * gcc.target/arm/acle/crc32ch.c: Likewise. ++ * gcc.target/arm/acle/crc32cw.c: Likewise. ++ * gcc.target/arm/acle/crc32cd.c: Likewise. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206120 ++ 2013-12-19 Tejas Belagod ++ ++ * gcc.target/aarch64/pmull_1.c: New. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206119 ++ 2013-12-19 Tejas Belagod ++ ++ * gcc.target/aarch64/sha256_1.c: New. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206118 ++ 2013-12-19 Tejas Belagod ++ ++ * gcc.target/aarch64/sha1_1.c: New. ++ ++2014-02-10 Michael Collison ++ ++ Backport from trunk r206117 ++ 2013-12-19 Tejas Belagod ++ ++ * gcc.target/aarch64/aes_1.c: New. ++ ++2014-02-01 Christophe Lyon ++ ++ Backport from trunk r203057. ++ 2013-10-01 Kyrylo Tkachov ++ ++ PR tree-optimization/58556 ++ * gcc.dg/tree-ssa/gen-vect-26.c: Use dynamic vector cost model. ++ * gcc.dg/tree-ssa/gen-vect-28.c: Likewise. ++ ++2014-01-21 Zhenqiang Chen ++ ++ Backport from trunk r205509 and r200103 ++ 2013-11-29 Zhenqiang Chen ++ ++ * gcc.target/arm/lp1243022.c: Skip target arm-neon. ++ ++ Backport mainline r200103 ++ 2013-06-15 Jeff Law ++ ++ * gcc.dg/tree-ssa/coalesce-1.c: New test. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-12-06 Michael Collison ++ ++ Backport from trunk r202872. ++ 2013-09-24 Kyrylo Tkachov ++ ++ * lib/target-supports.exp (check_effective_target_arm_cond_exec): ++ New Procedure ++ * gcc.target/arm/minmax_minus.c: Check for cond_exec target. ++ ++2013-12-06 Christophe Lyon ++ ++ Backport from trunk r203327. ++ 2013-10-09 Zhenqiang Chen ++ ++ * gcc.dg/tree-ssa/phi-opt-11.c: New test. ++ ++2013-12-06 Charles Baylis ++ ++ Backport from trunk r203799. ++ 2013-10-17 Charles Bayis ++ ++ * gcc.dg/builtin-apply2.c: Skip test on arm hardfloat ABI ++ targets. ++ * gcc.dg/tls/pr42894.c: Remove dg-options for arm*-*-* targets. ++ * gcc.target/arm/thumb-ltu.c: Remove dg-skip-if and require ++ effective target arm_thumb1_ok. ++ * lib/target-supports.exp ++ (check_effective_target_arm_fp16_ok_nocache): Don't force ++ -mfloat-abi=soft when building for hardfloat target. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-11-06 Christophe Lyon ++ ++ Revert backport from trunk r197526. ++ 2013-04-05 Greta Yorsh ++ ++ * gcc.target/arm/negdi-1.c: New test. ++ * gcc.target/arm/negdi-2.c: Likewise. ++ * gcc.target/arm/negdi-3.c: Likewise. ++ * gcc.target/arm/negdi-4.c: Likewise. ++ ++2013-11-05 Zhenqiang Chen ++ ++ Backport from trunk r204247. ++ 2013-10-31 Zhenqiang Chen ++ ++ * gcc.target/arm/lp1243022.c: New test. ++ ++2013-11-04 Kugan Vivekanandarajah ++ ++ Backport from trunk r204336 ++ 2013-11-03 Kugan Vivekanandarajah ++ ++ * gcc.target/arm/neon-vcond-gt.c: Scan for vbsl or vbit or vbif. ++ * gcc.target/arm/neon-vcond-ltgt.c: Scan for vbsl or vbit or vbif. ++ * gcc.target/arm/neon-vcond-unordered.c: Scan for vbsl or vbit or ++ vbif. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-10-09 Christophe Lyon ++ ++ Backport from trunk r198526,200595,200597. ++ 2013-05-02 Ian Bolton ++ ++ * gcc.target/aarch64/bics_1.c: New test. ++ * gcc.target/aarch64/bics_2.c: Likewise. ++ ++ 2013-07-02 Ian Bolton ++ ++ * gcc.target/aarch64/bfxil_1.c: New test. ++ * gcc.target/aarch64/bfxil_2.c: Likewise. ++ ++ 2013-07-02 Ian Bolton ++ ++ * gcc.target/config/aarch64/insv_1.c: Update to show it doesn't work ++ on big endian. ++ * gcc.target/config/aarch64/insv_2.c: New test for big endian. ++ * lib/target-supports.exp: Define aarch64_little_endian. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202400. ++ 2013-09-09 Kyrylo Tkachov ++ ++ * gcc.target/aarch64/cmn-neg.c: New test. ++ ++2013-10-03 Christophe Lyon ++ ++ Backport from trunk r202164. ++ 2013-09-02 Bin Cheng ++ ++ * gcc.target/arm/ivopts-orig_biv-inc.c: New testcase. ++ ++2013-10-01 Kugan Vivekanandarajah ++ ++ Backport from trunk r203059,203116. ++ 2013-10-01 Kugan Vivekanandarajah ++ ++ PR Target/58578 ++ * gcc.target/arm/pr58578.c: New test. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-09-06 Venkataramanan Kumar ++ ++ Backport from trunk r201411. ++ 2013-08-01 Kyrylo Tkachov ++ ++ * gcc.target/arm/pr46972-2.c: New test. ++ ++2013-09-05 Yvan Roux ++ ++ Backport from trunk r201267. ++ 2013-07-26 Kyrylo Tkachov ++ ++ * gcc.target/arm/minmax_minus.c: Scan for absence of mov. ++ ++2013-09-05 Christophe Lyon ++ ++ Backport from trunk r199527,199814,201435. ++ 2013-05-31 Kyrylo Tkachov ++ ++ PR target/56315 ++ * gcc.target/arm/iordi3-opt.c: New test. ++ ++ 2013-06-07 Kyrylo Tkachov ++ ++ PR target/56315 ++ * gcc.target/arm/xordi3-opt.c: New test. ++ ++ 2013-08-02 Kyrylo Tkachov ++ ++ * gcc.target/arm/neon-for-64bits-2.c: Delete. ++ ++2013-09-05 Christophe Lyon ++ ++ Backport from trunk r201730,201731. ++ ++ 2013-08-14 Janis Johnson ++ ++ * gcc.target/arm/atomic-comp-swap-release-acquire.c: Move dg-do ++ to be the first test directive. ++ * gcc.target/arm/atomic-op-acq_rel.c: Likewise. ++ * gcc.target/arm/atomic-op-acquire.c: Likewise. ++ * gcc.target/arm/atomic-op-char.c: Likewise. ++ * gcc.target/arm/atomic-op-consume.c: Likewise. ++ * gcc.target/arm/atomic-op-int.c: Likewise. ++ * gcc.target/arm/atomic-op-relaxed.c: Likewise. ++ * gcc.target/arm/atomic-op-release.c: Likewise. ++ * gcc.target/arm/atomic-op-seq_cst.c: Likewise. ++ * gcc.target/arm/atomic-op-short.c: Likewise. ++ ++ 2013-08-14 Janis Johnson ++ ++ * gcc.target/arm/pr19599.c: Skip for -mthumb. ++ ++2013-09-03 Venkataramanan Kumar ++ ++ Backport from trunk r201624. ++ 2013-08-09 James Greenhalgh ++ ++ * gcc.target/aarch64/scalar_intrinsics.c: Update expected ++ output of vdup intrinsics ++ ++2013-08-26 Kugan Vivekanandarajah ++ ++ Backport from trunk r201636. ++ 2013-08-09 Yufeng Zhang ++ ++ * gcc.dg/lower-subreg-1.c: Skip aarch64*-*-*. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-08-07 Christophe Lyon ++ ++ Backport from trunk r199720 ++ 2013-06-06 Marcus Shawcroft ++ ++ * gcc.dg/vect/no-section-anchors-vect-68.c: ++ Add dg-skip-if aarch64_tiny. ++ ++2013-08-07 Christophe Lyon ++ ++ Backport from trunk r201237. ++ 2013-07-25 Terry Guo ++ ++ * gcc.target/arm/thumb1-Os-mult.c: New test case. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r200596,201067,201083. ++ 2013-07-02 Ian Bolton ++ ++ * gcc.target/aarch64/abs_1.c: New test. ++ ++ 2013-07-19 Ian Bolton ++ ++ * gcc.target/aarch64/scalar_intrinsics.c (test_vabs_s64): Added ++ new testcase. ++ ++ 2013-07-20 James Greenhalgh ++ ++ * gcc.target/aarch64/vabs_intrinsic_1.c: New file. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r198864. ++ 2013-05-07 Ian Bolton ++ ++ * gcc.target/aarch64/ands_1.c: New test. ++ * gcc.target/aarch64/ands_2.c: Likewise ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r199439,199533,201326. ++ ++ 2013-05-30 Zhenqiang Chen ++ ++ * gcc.dg/shrink-wrap-alloca.c: New added. ++ * gcc.dg/shrink-wrap-pretend.c: New added. ++ * gcc.dg/shrink-wrap-sibcall.c: New added. ++ ++ 2013-05-31 Rainer Orth ++ ++ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca. ++ ++ 2013-07-30 Zhenqiang Chen ++ ++ * gcc.target/arm/pr57637.c: New testcase. ++ ++2013-08-06 Christophe Lyon ++ ++ Backport from trunk r198928,198973,199203,201240,201241. ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * gcc.target/arm/pr40887.c: Adjust testcase. ++ * gcc.target/arm/pr19599.c: New test. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200922. ++ 2013-07-12 Tejas Belagod ++ ++ * gcc.target/aarch64/vect-movi.c: New. ++ ++2013-08-05 Yvan Roux ++ ++ Backport from trunk r200720. ++ 2013-07-05 Marcus Shawcroft ++ ++ * gcc.dg/pr57518.c: Adjust scan-rtl-dump-not pattern. ++ ++2013-07-21 Yvan Roux ++ ++ Backport from trunk r200204. ++ 2013-06-19 Yufeng Zhang ++ ++ * gcc.dg/torture/stackalign/builtin-apply-2.c: set ++ STACK_ARGUMENTS_SIZE with 0 if __aarch64__ is defined. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-07-03 Christophe Lyon ++ ++ Revert backport from trunk r198928. ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * gcc.target/arm/pr40887.c: Adjust testcase. ++ * gcc.target/arm/pr19599.c: New test. ++ ++2013-07-03 Christophe Lyon ++ ++ Revert backport from trunk 199439, 199533 ++ 2013-05-31 Rainer Orth ++ ++ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca. ++ ++ 2013-05-30 Zhenqiang Chen ++ ++ * gcc.dg/shrink-wrap-alloca.c: New added. ++ * gcc.dg/shrink-wrap-pretend.c: New added. ++ * gcc.dg/shrink-wrap-sibcall.c: New added. ++ ++2013-07-02 Rob Savoye ++ ++ Backport from trunk 200096 ++ ++ 2013-06-14 Vidya Praveen ++ ++ * gcc.target/aarch64/vect_smlal_1.c: New file. ++ ++2013-07-02 Rob Savoye ++ ++ Backport from trunk 200019 ++ 2013-06-12 Ramana Radhakrishnan ++ ++ * gcc.target/arm/unaligned-memcpy-4.c (src, dst): Initialize ++ to ensure alignment. ++ * gcc.target/arm/unaligned-memcpy-3.c (src): Likewise. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 200152 ++ 2013-06-17 Sofiane Naci ++ ++ * gcc.target/aarch64/scalar_intrinsics.c: Update. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 200148 ++ 2013-06-17 Kyrylo Tkachov ++ ++ * gcc.target/arm/unaligned-memcpy-2.c (dest): Initialize to ++ ensure alignment. ++ ++2013-06-20 Rob Savoye ++ ++ Backport from trunk 199533 ++ 2013-05-31 Rainer Orth ++ ++ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca. ++ ++2013-06-20 Christophe Lyon ++ ++ Backport from trunk r198683. ++ 2013-05-07 Christophe Lyon ++ ++ * lib/target-supports.exp (check_effective_target_hw): New ++ function. ++ * c-c++-common/asan/clone-test-1.c: Call ++ check_effective_target_hw. ++ * c-c++-common/asan/rlimit-mmap-test-1.c: Likewise. ++ * c-c++-common/asan/heap-overflow-1.c: Update regexps to accept ++ possible decorations. ++ * c-c++-common/asan/null-deref-1.c: Likewise. ++ * c-c++-common/asan/stack-overflow-1.c: Likewise. ++ * c-c++-common/asan/strncpy-overflow-1.c: Likewise. ++ * c-c++-common/asan/use-after-free-1.c: Likewise. ++ * g++.dg/asan/deep-thread-stack-1.C: Likewise. ++ * g++.dg/asan/large-func-test-1.C: Likewise. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-06-06 Zhenqiang Chen ++ ++ Backport from mainline r199439. ++ 2013-05-30 Zhenqiang Chen ++ ++ * gcc.dg/shrink-wrap-alloca.c: New added. ++ * gcc.dg/shrink-wrap-pretend.c: New added. ++ * gcc.dg/shrink-wrap-sibcall.c: New added. ++ ++2013-06-05 Christophe Lyon ++ ++ Backport from trunk r199658. ++ 2013-06-04 Ian Bolton ++ ++ * gcc.target/aarch64/movi_1.c: New test. ++ ++2013-06-04 Christophe Lyon ++ ++ Backport from trunk r199261. ++ 2013-05-23 Christian Bruel ++ ++ PR debug/57351 ++ * gcc.dg/debug/pr57351.c: New test ++ ++2013-06-03 Christophe Lyon ++ Backport from trunk r198890,199254,199294,199454. ++ ++ 2013-05-30 Ian Bolton ++ ++ * gcc.target/aarch64/insv_1.c: New test. ++ ++ 2013-05-24 Ian Bolton ++ ++ * gcc.target/aarch64/scalar_intrinsics.c ++ (force_simd): Use a valid instruction. ++ (test_vdupd_lane_s64): Pass a valid lane argument. ++ (test_vdupd_lane_u64): Likewise. ++ ++ 2013-05-23 Vidya Praveen ++ ++ * gcc.target/aarch64/vect-clz.c: New file. ++ ++ 2013-05-14 James Greenhalgh ++ ++ * gcc.target/aarch64/vect-fcm.x: Add cases testing ++ FLOAT cmp FLOAT ? INT : INT. ++ * gcc.target/aarch64/vect-fcm-eq-d.c: Define IMODE. ++ * gcc.target/aarch64/vect-fcm-eq-f.c: Likewise. ++ * gcc.target/aarch64/vect-fcm-ge-d.c: Likewise. ++ * gcc.target/aarch64/vect-fcm-ge-f.c: Likewise. ++ * gcc.target/aarch64/vect-fcm-gt-d.c: Likewise. ++ * gcc.target/aarch64/vect-fcm-gt-f.c: Likewise. ++ ++2013-05-29 Christophe Lyon ++ ++ Backport from trunk r198928. ++ 2013-05-15 Ramana Radhakrishnan ++ ++ PR target/19599 ++ * gcc.target/arm/pr40887.c: Adjust testcase. ++ * gcc.target/arm/pr19599.c: New test. ++ ++2013-05-28 Christophe Lyon ++ ++ Backport from trunk r198680. ++ 2013-05-07 Sofiane Naci ++ ++ * gcc.target/aarch64/scalar_intrinsics.c: Update. ++ ++2013-05-28 Christophe Lyon ++ ++ Backport from trunk r198499-198500. ++ 2013-05-01 James Greenhalgh ++ * gcc.target/aarch64/vect-vaddv.c: New. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * gcc.target/aarch64/vect-vmaxv.c: New. ++ * gcc.target/aarch64/vect-vfmaxv.c: Likewise. ++ ++2013-05-23 Christophe Lyon ++ ++ Backport from trunk r198970. ++ 2013-05-16 Greta Yorsh ++ ++ * gcc.target/arm/unaligned-memcpy-2.c: Adjust expected output. ++ * gcc.target/arm/unaligned-memcpy-3.c: Likewise. ++ * gcc.target/arm/unaligned-memcpy-4.c: Likewise. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198574-198575. ++ 2013-05-03 Vidya Praveen ++ ++ * gcc.target/aarch64/fabd.c: New file. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198490-198496. ++ 2013-05-01 James Greenhalgh ++ ++ * gcc.target/aarch64/scalar-vca.c: New. ++ * gcc.target/aarch64/vect-vca.c: Likewise. ++ ++ 2013-05-01 James Greenhalgh ++ ++ * gcc.target/aarch64/scalar_intrinsics.c (force_simd): New. ++ (test_vceqd_s64): Force arguments to SIMD registers. ++ (test_vceqzd_s64): Likewise. ++ (test_vcged_s64): Likewise. ++ (test_vcled_s64): Likewise. ++ (test_vcgezd_s64): Likewise. ++ (test_vcged_u64): Likewise. ++ (test_vcgtd_s64): Likewise. ++ (test_vcltd_s64): Likewise. ++ (test_vcgtzd_s64): Likewise. ++ (test_vcgtd_u64): Likewise. ++ (test_vclezd_s64): Likewise. ++ (test_vcltzd_s64): Likewise. ++ (test_vtst_s64): Likewise. ++ (test_vtst_u64): Likewise. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r198191. ++ 2013-04-23 Sofiane Naci ++ ++ * gcc.target/aarch64/scalar-mov.c: New testcase. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ Backport from trunk r197838. ++ 2013-04-11 Naveen H.S ++ ++ * gcc.target/aarch64/negs.c: New. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198019. ++ 2013-04-16 Naveen H.S ++ ++ * gcc.target/aarch64/adds1.c: New. ++ * gcc.target/aarch64/adds2.c: New. ++ * gcc.target/aarch64/subs1.c: New. ++ * gcc.target/aarch64/subs2.c: New. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198394,198396-198400,198402-198404,198406. ++ 2013-04-29 James Greenhalgh ++ ++ * lib/target-supports.exp (vect_uintfloat_cvt): Enable for AArch64. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * gcc.target/aarch64/vect-vcvt.c: New. ++ ++ 2013-04-29 James Greenhalgh ++ ++ * gcc.target/aarch64/vect-vrnd.c: New. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198302-198306,198316. ++ 2013-04-25 James Greenhalgh ++ Tejas Belagod ++ ++ * gcc.target/aarch64/vaddv-intrinsic.c: New. ++ * gcc.target/aarch64/vaddv-intrinsic-compile.c: Likewise. ++ * gcc.target/aarch64/vaddv-intrinsic.x: Likewise. ++ ++ 2013-04-25 Naveen H.S ++ ++ * gcc.target/aarch64/cmp.c: New. ++ ++ 2013-04-25 Naveen H.S ++ ++ * gcc.target/aarch64/ngc.c: New. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198298. ++ 2013-04-25 Kyrylo Tkachov ++ ++ * lib/target-supports.exp ++ (check_effective_target_arm_neon_fp16_ok_nocache): New procedure. ++ (check_effective_target_arm_neon_fp16_ok): Likewise. ++ (add_options_for_arm_neon_fp16): Likewise. ++ * gcc.target/arm/neon/vcvtf16_f32.c: New test. Generated. ++ * gcc.target/arm/neon/vcvtf32_f16.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198136-198137,198142,198176 ++ 2013-04-22 James Greenhalgh ++ ++ * gcc.target/aarch64/vrecps.c: New. ++ * gcc.target/aarch64/vrecpx.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r198020. ++ 2013-04-16 Naveen H.S ++ ++ * gcc.target/aarch64/adds3.c: New. ++ * gcc.target/aarch64/subs3.c: New. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197965. ++ 2013-04-15 Kyrylo Tkachov ++ ++ * gcc.target/arm/anddi3-opt.c: New test. ++ * gcc.target/arm/anddi3-opt2.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197642. ++ 2013-04-09 Kyrylo Tkachov ++ ++ * gcc.target/arm/minmax_minus.c: New test. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197530,197921. ++ 2013-04-05 Greta Yorsh ++ ++ * gcc.target/arm/peep-ldrd-1.c: New test. ++ * gcc.target/arm/peep-strd-1.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197523. ++ 2013-04-05 Kyrylo Tkachov ++ ++ * lib/target-supports.exp (add_options_for_arm_v8_neon): ++ Add -march=armv8-a when we use v8 NEON. ++ (check_effective_target_vect_call_btruncf): Remove arm-*-*-*. ++ (check_effective_target_vect_call_ceilf): Likewise. ++ (check_effective_target_vect_call_floorf): Likewise. ++ (check_effective_target_vect_call_roundf): Likewise. ++ (check_vect_support_and_set_flags): Remove check for arm_v8_neon. ++ * gcc.target/arm/vect-rounding-btruncf.c: New testcase. ++ * gcc.target/arm/vect-rounding-ceilf.c: Likewise. ++ * gcc.target/arm/vect-rounding-floorf.c: Likewise. ++ * gcc.target/arm/vect-rounding-roundf.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197518-197522,197516-197528. ++ 2013-04-05 Greta Yorsh ++ ++ * gcc.target/arm/negdi-1.c: New test. ++ * gcc.target/arm/negdi-2.c: Likewise. ++ * gcc.target/arm/negdi-3.c: Likewise. ++ * gcc.target/arm/negdi-4.c: Likewise. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r197489-197491. ++ 2013-04-04 Kyrylo Tkachov ++ ++ * lib/target-supports.exp (check_effective_target_arm_v8_neon_hw): ++ New procedure. ++ (check_effective_target_arm_v8_neon_ok_nocache): ++ Likewise. ++ (check_effective_target_arm_v8_neon_ok): Change to use ++ check_effective_target_arm_v8_neon_ok_nocache. ++ (add_options_for_arm_v8_neon): Use et_arm_v8_neon_flags to set ARMv8 ++ NEON flags. ++ (check_effective_target_vect_call_btruncf): ++ Enable for arm and ARMv8 NEON. ++ (check_effective_target_vect_call_ceilf): Likewise. ++ (check_effective_target_vect_call_floorf): Likewise. ++ (check_effective_target_vect_call_roundf): Likewise. ++ (check_vect_support_and_set_flags): Handle ARMv8 NEON effective ++ target. ++ ++2013-05-02 Matthew Gretton-Dann ++ ++ Backport from trunk r196795-196797,196957. ++ 2013-03-19 Ian Bolton ++ ++ * gcc.target/aarch64/sbc.c: New test. ++ ++ 2013-03-19 Ian Bolton ++ ++ * gcc.target/aarch64/ror.c: New test. ++ ++ 2013-03-19 Ian Bolton ++ ++ * gcc.target/aarch64/extr.c: New test. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197052. ++ 2013-03-25 Kyrylo Tkachov ++ ++ * gcc.target/arm/vseleqdf.c: New test. ++ * gcc.target/arm/vseleqsf.c: Likewise. ++ * gcc.target/arm/vselgedf.c: Likewise. ++ * gcc.target/arm/vselgesf.c: Likewise. ++ * gcc.target/arm/vselgtdf.c: Likewise. ++ * gcc.target/arm/vselgtsf.c: Likewise. ++ * gcc.target/arm/vselledf.c: Likewise. ++ * gcc.target/arm/vsellesf.c: Likewise. ++ * gcc.target/arm/vselltdf.c: Likewise. ++ * gcc.target/arm/vselltsf.c: Likewise. ++ * gcc.target/arm/vselnedf.c: Likewise. ++ * gcc.target/arm/vselnesf.c: Likewise. ++ * gcc.target/arm/vselvcdf.c: Likewise. ++ * gcc.target/arm/vselvcsf.c: Likewise. ++ * gcc.target/arm/vselvsdf.c: Likewise. ++ * gcc.target/arm/vselvssf.c: Likewise. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r197051. ++ 2013-03-25 Kyrylo Tkachov ++ ++ * gcc.target/aarch64/atomic-comp-swap-release-acquire.c: Move test ++ body from here... ++ * gcc.target/aarch64/atomic-comp-swap-release-acquire.x: ... to here. ++ * gcc.target/aarch64/atomic-op-acq_rel.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-acq_rel.x: ... to here. ++ * gcc.target/aarch64/atomic-op-acquire.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-acquire.x: ... to here. ++ * gcc.target/aarch64/atomic-op-char.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-char.x: ... to here. ++ * gcc.target/aarch64/atomic-op-consume.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-consume.x: ... to here. ++ * gcc.target/aarch64/atomic-op-int.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-int.x: ... to here. ++ * gcc.target/aarch64/atomic-op-relaxed.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-relaxed.x: ... to here. ++ * gcc.target/aarch64/atomic-op-release.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-release.x: ... to here. ++ * gcc.target/aarch64/atomic-op-seq_cst.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-seq_cst.x: ... to here. ++ * gcc.target/aarch64/atomic-op-short.c: Move test body from here... ++ * gcc.target/aarch64/atomic-op-short.x: ... to here. ++ * gcc.target/arm/atomic-comp-swap-release-acquire.c: New test. ++ * gcc.target/arm/atomic-op-acq_rel.c: Likewise. ++ * gcc.target/arm/atomic-op-acquire.c: Likewise. ++ * gcc.target/arm/atomic-op-char.c: Likewise. ++ * gcc.target/arm/atomic-op-consume.c: Likewise. ++ * gcc.target/arm/atomic-op-int.c: Likewise. ++ * gcc.target/arm/atomic-op-relaxed.c: Likewise. ++ * gcc.target/arm/atomic-op-release.c: Likewise. ++ * gcc.target/arm/atomic-op-seq_cst.c: Likewise. ++ * gcc.target/arm/atomic-op-short.c: Likewise. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r196876. ++ 2013-03-21 Christophe Lyon ++ ++ * gcc.target/arm/neon-for-64bits-1.c: New tests. ++ * gcc.target/arm/neon-for-64bits-2.c: Likewise. ++ ++2013-04-08 Matthew Gretton-Dann ++ ++ Backport from trunk r196858. ++ 2013-03-21 Naveen H.S ++ ++ * gcc.target/aarch64/vect.c: Test and result vector added ++ for sabd and saba instructions. ++ * gcc.target/aarch64/vect-compile.c: Check for sabd and saba ++ instructions in assembly. ++ * gcc.target/aarch64/vect.x: Add sabd and saba test functions. ++ * gcc.target/aarch64/vect-fp.c: Test and result vector added ++ for fabd instruction. ++ * gcc.target/aarch64/vect-fp-compile.c: Check for fabd ++ instruction in assembly. ++ * gcc.target/aarch64/vect-fp.x: Add fabd test function. +--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c ++++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c +@@ -0,0 +1,11 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -g" } */ ++ ++int *p; ++ ++void ++test (int a) ++{ ++ if (a > 0) ++ p = __builtin_alloca (4); ++} +--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c ++++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c +@@ -0,0 +1,36 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -g" } */ ++ ++#include ++#include ++#include ++ ++#define DEBUG_BUFFER_SIZE 80 ++int unifi_debug = 5; ++ ++void ++unifi_trace (void* ospriv, int level, const char *fmt, ...) ++{ ++ static char s[DEBUG_BUFFER_SIZE]; ++ va_list args; ++ unsigned int len; ++ ++ if (!ospriv) ++ return; ++ ++ if (unifi_debug >= level) ++ { ++ va_start (args, fmt); ++ len = vsnprintf (&(s)[0], (DEBUG_BUFFER_SIZE), fmt, args); ++ va_end (args); ++ ++ if (len >= DEBUG_BUFFER_SIZE) ++ { ++ (s)[DEBUG_BUFFER_SIZE - 2] = '\n'; ++ (s)[DEBUG_BUFFER_SIZE - 1] = 0; ++ } ++ ++ printf ("%s", s); ++ } ++} ++ +--- a/src/gcc/testsuite/gcc.dg/debug/pr57351.c ++++ b/src/gcc/testsuite/gcc.dg/debug/pr57351.c +@@ -0,0 +1,54 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target arm_neon } */ ++/* { dg-options "-std=c99 -Os -g -march=armv7-a" } */ ++/* { dg-add-options arm_neon } */ ++ ++typedef unsigned int size_t; ++typedef int ptrdiff_t; ++typedef signed char int8_t ; ++typedef signed long long int64_t; ++typedef int8_t GFC_INTEGER_1; ++typedef GFC_INTEGER_1 GFC_LOGICAL_1; ++typedef int64_t GFC_INTEGER_8; ++typedef GFC_INTEGER_8 GFC_LOGICAL_8; ++typedef ptrdiff_t index_type; ++typedef struct descriptor_dimension ++{ ++ index_type lower_bound; ++ index_type _ubound; ++} ++descriptor_dimension; ++typedef struct { GFC_LOGICAL_1 *base_addr; size_t offset; index_type dtype; descriptor_dimension dim[7];} gfc_array_l1; ++typedef struct { GFC_LOGICAL_8 *base_addr; size_t offset; index_type dtype; descriptor_dimension dim[7];} gfc_array_l8; ++void ++all_l8 (gfc_array_l8 * const restrict retarray, ++ gfc_array_l1 * const restrict array, ++ const index_type * const restrict pdim) ++{ ++ GFC_LOGICAL_8 * restrict dest; ++ index_type n; ++ index_type len; ++ index_type delta; ++ index_type dim; ++ dim = (*pdim) - 1; ++ len = ((array)->dim[dim]._ubound + 1 - (array)->dim[dim].lower_bound); ++ for (n = 0; n < dim; n++) ++ { ++ const GFC_LOGICAL_1 * restrict src; ++ GFC_LOGICAL_8 result; ++ { ++ result = 1; ++ { ++ for (n = 0; n < len; n++, src += delta) ++ { ++ if (! *src) ++ { ++ result = 0; ++ break; ++ } ++ } ++ *dest = result; ++ } ++ } ++ } ++} +--- a/src/gcc/testsuite/gcc.dg/lower-subreg-1.c ++++ b/src/gcc/testsuite/gcc.dg/lower-subreg-1.c +@@ -1,4 +1,4 @@ +-/* { dg-do compile { target { ! { mips64 || { arm*-*-* ia64-*-* sparc*-*-* spu-*-* tilegx-*-* } } } } } */ ++/* { dg-do compile { target { ! { mips64 || { aarch64*-*-* arm*-*-* ia64-*-* sparc*-*-* spu-*-* tilegx-*-* } } } } } */ + /* { dg-options "-O -fdump-rtl-subreg1" } */ + /* { dg-skip-if "" { { i?86-*-* x86_64-*-* } && x32 } { "*" } { "" } } */ + /* { dg-require-effective-target ilp32 } */ +--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-sibcall.c ++++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-sibcall.c +@@ -0,0 +1,26 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -g" } */ ++ ++unsigned char a, b, d, f, g; ++ ++int test (void); ++ ++int ++baz (int c) ++{ ++ if (c == 0) return test (); ++ if (b & 1) ++ { ++ g = 0; ++ int e = (a & 0x0f) - (g & 0x0f); ++ ++ if (!a) b |= 0x80; ++ a = e + test (); ++ f = g/5 + a*3879 + b *2985; ++ } ++ else ++ { ++ f = g + a*39879 + b *25; ++ } ++ return test (); ++} +--- a/src/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c ++++ b/src/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c +@@ -16,7 +16,7 @@ + E, F and G are passed on stack. So the size of the stack argument + data is 20. */ + #define STACK_ARGUMENTS_SIZE 20 +-#elif defined __MMIX__ ++#elif defined __aarch64__ || defined __MMIX__ + /* No parameters on stack for bar. */ + #define STACK_ARGUMENTS_SIZE 0 + #else +--- a/src/gcc/testsuite/gcc.dg/tree-ssa/coalesce-1.c ++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/coalesce-1.c +@@ -0,0 +1,195 @@ ++/* { dg-do compile } */ ++ ++/* { dg-options "-O2 -fdump-rtl-expand-details" } */ ++ ++typedef long unsigned int size_t; ++union tree_node; ++typedef union tree_node *tree; ++union gimple_statement_d; ++typedef union gimple_statement_d *gimple; ++typedef const union tree_node *const_tree; ++typedef const union gimple_statement_d *const_gimple; ++struct gimple_seq_d; ++typedef struct gimple_seq_d *gimple_seq; ++struct edge_def; ++typedef struct edge_def *edge; ++struct basic_block_def; ++typedef struct basic_block_def *basic_block; ++typedef const struct basic_block_def *const_basic_block; ++struct tree_exp ++{ ++ tree operands[1]; ++}; ++typedef struct ssa_use_operand_d ++{ ++ tree *use; ++} ssa_use_operand_t; ++struct phi_arg_d ++{ ++ struct ssa_use_operand_d imm_use; ++}; ++union tree_node ++{ ++ struct tree_exp exp; ++}; ++struct function ++{ ++}; ++extern struct function *cfun; ++struct edge_def ++{ ++ unsigned int dest_idx; ++}; ++static __inline__ void ++VEC_edge_must_be_pointer_type (void) ++{ ++ (void) ((edge) 1 == (void *) 1); ++} typedef struct VEC_edge_base ++ ++{ ++ unsigned num; ++ unsigned alloc; ++ edge vec[1]; ++} VEC_edge_base; ++typedef struct VEC_edge_none ++{ ++ VEC_edge_base base; ++} VEC_edge_none; ++ ++static __inline__ edge ++VEC_edge_base_index (const VEC_edge_base * vec_, unsigned ix_, ++ const char *file_, unsigned line_, const char *function_) ++{ ++ return vec_->vec[ix_]; ++} ++ ++typedef struct VEC_edge_gc ++{ ++ VEC_edge_base base; ++} VEC_edge_gc; ++struct basic_block_def ++{ ++ VEC_edge_gc *succs; ++}; ++static __inline__ edge ++single_succ_edge (const_basic_block bb) ++{ ++ return (VEC_edge_base_index ++ ((((bb)->succs) ? &((bb)->succs)->base : 0), (0), ++ "/home/gcc/virgin-gcc/gcc/basic-block.h", 563, __FUNCTION__)); ++} ++ ++edge find_edge (basic_block, basic_block); ++typedef tree *def_operand_p; ++typedef ssa_use_operand_t *use_operand_p; ++struct gimple_seq_node_d; ++typedef struct gimple_seq_node_d *gimple_seq_node; ++struct gimple_seq_node_d ++{ ++ gimple stmt; ++}; ++typedef struct ++{ ++ gimple_seq_node ptr; ++ gimple_seq seq; ++ basic_block bb; ++} gimple_stmt_iterator; ++struct gimple_statement_phi ++{ ++ struct phi_arg_d args[1]; ++}; ++union gimple_statement_d ++{ ++ struct gimple_statement_phi gimple_phi; ++}; ++extern size_t const gimple_ops_offset_[]; ++static __inline__ tree * ++gimple_ops (gimple gs) ++{ ++ size_t off; ++ off = gimple_ops_offset_[gimple_statement_structure (gs)]; ++ return (tree *) ((char *) gs + off); ++} ++ ++static __inline__ tree ++gimple_op (const_gimple gs, unsigned i) ++{ ++ return gimple_ops ((((union ++ { ++ const union gimple_statement_d * _q; ++ union gimple_statement_d * _nq;}) (((gs))))._nq))[i]; ++} ++ ++static __inline__ struct phi_arg_d * ++gimple_phi_arg (gimple gs, unsigned index) ++{ ++ return &(gs->gimple_phi.args[index]); ++} ++ ++static __inline__ tree ++gimple_switch_label (const_gimple gs, unsigned index) ++{ ++ return gimple_op (gs, index + 1); ++} ++ ++gimple_stmt_iterator gsi_start_phis (basic_block); ++extern basic_block label_to_block_fn (struct function *, tree); ++ ++static __inline__ tree ++get_use_from_ptr (use_operand_p use) ++{ ++ return *(use->use); ++} ++ ++static __inline__ use_operand_p ++gimple_phi_arg_imm_use_ptr (gimple gs, int i) ++{ ++ return &gimple_phi_arg (gs, i)->imm_use; ++} ++ ++struct switch_conv_info ++{ ++ basic_block final_bb; ++ basic_block switch_bb; ++ const char *reason; ++ tree *default_values; ++}; ++static struct switch_conv_info info; ++ ++static void ++gather_default_values (tree default_case) ++{ ++ gimple_stmt_iterator gsi; ++ basic_block bb = ++ (label_to_block_fn ((cfun + 0), default_case->exp.operands[2])); ++ edge e; ++ int i = 0; ++ if (bb == info.final_bb) ++ e = find_edge (info.switch_bb, bb); ++ else ++ e = single_succ_edge (bb); ++ for (gsi = gsi_start_phis (info.final_bb); ++ gsi_gsi_start_phis (info.final_bb); gsi_next (&gsi)) ++ { ++ gimple phi = gsi.ptr->stmt; ++ tree val = get_use_from_ptr (gimple_phi_arg_imm_use_ptr ++ ((((phi))), (((e)->dest_idx)))); ++ info.default_values[i++] = val; ++ } ++} ++ ++unsigned char ++process_switch (gimple swtch) ++{ ++ unsigned int i, branch_num = gimple_switch_num_labels (swtch); ++ tree index_type; ++ info.reason = "switch has no labels\n"; ++ gather_default_values (gimple_switch_label (swtch, 0)); ++} ++ ++/* Verify that out-of-ssa coalescing did its job by verifying there are not ++ any partition copies inserted. */ ++ ++/* { dg-final { scan-rtl-dump-not "partition copy" "expand"} } */ ++/* { dg-final { cleanup-rtl-dump "expand" } } */ ++ +--- a/src/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c ++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c +@@ -1,6 +1,6 @@ + /* { dg-do run { target vect_cmdline_needed } } */ +-/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ +-/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ ++/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ ++/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ + + #include + +--- a/src/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-11.c ++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-11.c +@@ -0,0 +1,25 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O1 -fdump-tree-optimized" } */ ++ ++int f(int a, int b, int c) ++{ ++ if (a == 0 && b > c) ++ return 0; ++ return a; ++} ++ ++int g(int a, int b, int c) ++{ ++ if (a == 42 && b > c) ++ return 42; ++ return a; ++} ++ ++int h(int a, int b, int c, int d) ++{ ++ if (a == d && b > c) ++ return d; ++ return a; ++} ++/* { dg-final { scan-tree-dump-times "if" 0 "optimized"} } */ ++/* { dg-final { cleanup-tree-dump "optimized" } } */ +--- a/src/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c ++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c +@@ -1,6 +1,6 @@ + /* { dg-do run { target vect_cmdline_needed } } */ +-/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ +-/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ ++/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ ++/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ + + #include + +--- a/src/gcc/testsuite/gcc.dg/tls/pr42894.c ++++ b/src/gcc/testsuite/gcc.dg/tls/pr42894.c +@@ -1,6 +1,5 @@ + /* PR target/42894 */ + /* { dg-do compile } */ +-/* { dg-options "-march=armv5te -mthumb" { target arm*-*-* } } */ + /* { dg-require-effective-target tls } */ + + extern __thread int t; +--- a/src/gcc/testsuite/gcc.dg/builtin-apply2.c ++++ b/src/gcc/testsuite/gcc.dg/builtin-apply2.c +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-skip-if "Variadic funcs have all args on stack. Normal funcs have args in registers." { "aarch64*-*-* avr-*-* " } { "*" } { "" } } */ +-/* { dg-skip-if "Variadic funcs use Base AAPCS. Normal funcs use VFP variant." { "arm*-*-*" } { "-mfloat-abi=hard" } { "" } } */ ++/* { dg-skip-if "Variadic funcs use Base AAPCS. Normal funcs use VFP variant." { arm*-*-* && arm_hf_eabi } { "*" } { "" } } */ + + /* PR target/12503 */ + /* Origin: */ +--- a/src/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c ++++ b/src/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c +@@ -1,4 +1,6 @@ +-/* { dg-require-effective-target vect_int } */ ++/* { dg-require-effective-target vect_int } ++ { dg-skip-if "AArch64 tiny code model does not support programs larger than 1MiB" {aarch64_tiny} {"*"} {""} } ++ */ + + #include + #include "tree-vect.h" +--- a/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C ++++ b/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C +@@ -37,9 +37,9 @@ + + // { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" } + // { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } +-// { dg-output "READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*LargeFunction\[^\n\r]*(large-func-test-1.C:18|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } +-// { dg-output "0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" } +-// { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #0( 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } + // { dg-output " #1|) 0x\[0-9a-f\]+ (in (operator new|_*_Zn\[aw\]\[mj\])|\[(\])\[^\n\r]*(\n|\r\n|\r)" } +--- a/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C ++++ b/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C +@@ -45,9 +45,9 @@ + } + + // { dg-output "ERROR: AddressSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } +-// { dg-output "WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" } +-// { dg-output "freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } +-// { dg-output "previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } ++// { dg-output "\[^\n\r]*previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\2 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\8 created by T0 here:.*(\n|\r\n|\r)" } + // { dg-output "Thread T\\4 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" } +--- a/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c +@@ -15,7 +15,7 @@ + /* { dg-output "WRITE of size \[0-9\]* at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)strncpy|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:11|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +--- a/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c +@@ -2,6 +2,7 @@ + + /* { dg-do run { target setrlimit } } */ + /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ ++/* { dg-require-effective-target hw } */ + /* { dg-shouldfail "asan" } */ + + #include +--- a/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c +@@ -19,4 +19,4 @@ + + /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*stack-overflow-1.c:16|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "Address 0x\[0-9a-f\]+ is\[^\n\r]*frame
" } */ ++/* { dg-output "\[^\n\r]*Address 0x\[0-9a-f\]+ is\[^\n\r]*frame
" } */ +--- a/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c +@@ -11,12 +11,12 @@ + + /* { dg-output "ERROR: AddressSanitizer:? heap-use-after-free on address\[^\n\r]*" } */ + /* { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:9|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)free|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:8|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:7|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +--- a/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c +@@ -3,6 +3,7 @@ + + /* { dg-do run { target { *-*-linux* } } } */ + /* { dg-require-effective-target clone } */ ++/* { dg-require-effective-target hw } */ + /* { dg-options "-D_GNU_SOURCE" } */ + + #include +--- a/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c +@@ -25,7 +25,7 @@ + + /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0.*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:21|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */ +-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:19|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +--- a/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c ++++ b/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c +@@ -18,6 +18,6 @@ + + /* { dg-output "ERROR: AddressSanitizer:? SEGV on unknown address\[^\n\r]*" } */ + /* { dg-output "0x\[0-9a-f\]+ \[^\n\r]*pc 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */ +-/* { dg-output "AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */ ++/* { dg-output "\[^\n\r]*AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */ + /* { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*NullDeref\[^\n\r]* (\[^\n\r]*null-deref-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ + /* { dg-output " #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*null-deref-1.c:15|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */ +--- a/src/gcc/objcp/ChangeLog.linaro ++++ b/src/gcc/objcp/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/cp/ChangeLog.linaro ++++ b/src/gcc/cp/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/tree-ssa-loop-ivopts.c ++++ b/src/gcc/tree-ssa-loop-ivopts.c +@@ -4827,22 +4827,36 @@ + for (i = 0; i < n_iv_cands (data); i++) + { + struct iv_cand *cand = iv_cand (data, i); +- struct iv_use *closest = NULL; ++ struct iv_use *closest_before = NULL; ++ struct iv_use *closest_after = NULL; + if (cand->pos != IP_ORIGINAL) + continue; ++ + for (j = 0; j < n_iv_uses (data); j++) + { + struct iv_use *use = iv_use (data, j); + unsigned uid = gimple_uid (use->stmt); +- if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at) +- || uid > gimple_uid (cand->incremented_at)) ++ ++ if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at)) + continue; +- if (closest == NULL || uid > gimple_uid (closest->stmt)) +- closest = use; ++ ++ if (uid < gimple_uid (cand->incremented_at) ++ && (closest_before == NULL ++ || uid > gimple_uid (closest_before->stmt))) ++ closest_before = use; ++ ++ if (uid > gimple_uid (cand->incremented_at) ++ && (closest_after == NULL ++ || uid < gimple_uid (closest_after->stmt))) ++ closest_after = use; + } +- if (closest == NULL || !autoinc_possible_for_pair (data, closest, cand)) +- continue; +- cand->ainc_use = closest; ++ ++ if (closest_before != NULL ++ && autoinc_possible_for_pair (data, closest_before, cand)) ++ cand->ainc_use = closest_before; ++ else if (closest_after != NULL ++ && autoinc_possible_for_pair (data, closest_after, cand)) ++ cand->ainc_use = closest_after; + } + } + +--- a/src/gcc/rtl.def ++++ b/src/gcc/rtl.def +@@ -937,8 +937,9 @@ + relational operator. Operands should have only one alternative. + 1: A C expression giving an additional condition for recognizing + the generated pattern. +- 2: A template or C code to produce assembler output. */ +-DEF_RTL_EXPR(DEFINE_COND_EXEC, "define_cond_exec", "Ess", RTX_EXTRA) ++ 2: A template or C code to produce assembler output. ++ 3: A vector of attributes to append to the resulting cond_exec insn. */ ++DEF_RTL_EXPR(DEFINE_COND_EXEC, "define_cond_exec", "EssV", RTX_EXTRA) + + /* Definition of an operand predicate. The difference between + DEFINE_PREDICATE and DEFINE_SPECIAL_PREDICATE is that genrecog will +--- a/src/gcc/go/ChangeLog.linaro ++++ b/src/gcc/go/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/opts.c ++++ b/src/gcc/opts.c +@@ -484,6 +484,7 @@ + { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 }, + { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 }, + { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 }, ++ { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP }, + { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 }, + { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 }, + +@@ -497,7 +498,7 @@ + { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 }, + { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, + { OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 }, +- { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model, NULL, 1 }, ++ { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC }, + { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 }, + { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 }, + +@@ -822,6 +823,17 @@ + } + } + ++ /* Tune vectorization related parametees according to cost model. */ ++ if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP) ++ { ++ maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS, ++ 6, opts->x_param_values, opts_set->x_param_values); ++ maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS, ++ 0, opts->x_param_values, opts_set->x_param_values); ++ maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT, ++ 0, opts->x_param_values, opts_set->x_param_values); ++ } ++ + /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion + is disabled. */ + if (!opts->x_flag_tree_vectorize || !opts->x_flag_tree_loop_if_convert) +@@ -1592,7 +1604,7 @@ + if (!opts_set->x_flag_tree_vectorize) + opts->x_flag_tree_vectorize = value; + if (!opts_set->x_flag_vect_cost_model) +- opts->x_flag_vect_cost_model = value; ++ opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC; + if (!opts_set->x_flag_tree_loop_distribute_patterns) + opts->x_flag_tree_loop_distribute_patterns = value; + break; +--- a/src/gcc/ada/ChangeLog.linaro ++++ b/src/gcc/ada/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/common/config/aarch64/aarch64-common.c ++++ b/src/gcc/common/config/aarch64/aarch64-common.c +@@ -44,6 +44,8 @@ + { + /* Enable section anchors by default at -O1 or higher. */ + { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 }, ++ /* Enable redundant extension instructions removal at -O2 and higher. */ ++ { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 }, + { OPT_LEVELS_NONE, 0, NULL, 0 } + }; + +--- a/src/gcc/common/config/i386/i386-common.c ++++ b/src/gcc/common/config/i386/i386-common.c +@@ -729,7 +729,6 @@ + + opts->x_flag_pcc_struct_return = 2; + opts->x_flag_asynchronous_unwind_tables = 2; +- opts->x_flag_vect_cost_model = 1; + } + + /* On the x86 -fsplit-stack and -fstack-protector both use the same +--- a/src/gcc/fortran/ChangeLog.linaro ++++ b/src/gcc/fortran/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/configure.ac ++++ b/src/gcc/configure.ac +@@ -813,7 +813,7 @@ + ) + AC_SUBST(CONFIGURE_SPECS) + +-ACX_PKGVERSION([GCC]) ++ACX_PKGVERSION([Linaro GCC `cat $srcdir/LINARO-VERSION`]) + ACX_BUGURL([http://gcc.gnu.org/bugs.html]) + + # Sanity check enable_languages in case someone does not run the toplevel +@@ -4202,8 +4202,9 @@ + # ??? Once 2.11 is released, probably need to add first known working + # version to the per-target configury. + case "$cpu_type" in +- alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze | mips \ +- | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 | xtensa) ++ aarch64 | alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze \ ++ | mips | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 \ ++ | xtensa) + insn="nop" + ;; + ia64 | s390) +--- a/src/gcc/tree-vectorizer.h ++++ b/src/gcc/tree-vectorizer.h +@@ -838,6 +838,14 @@ + return (DR_MISALIGNMENT (data_ref_info) != -1); + } + ++ ++/* Return true if the vect cost model is unlimited. */ ++static inline bool ++unlimited_cost_model () ++{ ++ return flag_vect_cost_model == VECT_COST_MODEL_UNLIMITED; ++} ++ + /* Source location */ + extern LOC vect_location; + +--- a/src/gcc/tree-vect-loop.c ++++ b/src/gcc/tree-vect-loop.c +@@ -2629,7 +2629,7 @@ + void *target_cost_data = LOOP_VINFO_TARGET_COST_DATA (loop_vinfo); + + /* Cost model disabled. */ +- if (!flag_vect_cost_model) ++ if (unlimited_cost_model ()) + { + dump_printf_loc (MSG_NOTE, vect_location, "cost model disabled."); + *ret_min_profitable_niters = 0; +--- a/src/gcc/flag-types.h ++++ b/src/gcc/flag-types.h +@@ -191,4 +191,13 @@ + FP_CONTRACT_FAST = 2 + }; + ++/* Vectorizer cost-model. */ ++enum vect_cost_model { ++ VECT_COST_MODEL_UNLIMITED = 0, ++ VECT_COST_MODEL_CHEAP = 1, ++ VECT_COST_MODEL_DYNAMIC = 2, ++ VECT_COST_MODEL_DEFAULT = 3 ++}; ++ ++ + #endif /* ! GCC_FLAG_TYPES_H */ +--- a/src/gcc/tree-vect-data-refs.c ++++ b/src/gcc/tree-vect-data-refs.c +@@ -1328,7 +1328,7 @@ + *new_slot = slot; + } + +- if (!supportable_dr_alignment && !flag_vect_cost_model) ++ if (!supportable_dr_alignment && unlimited_cost_model ()) + slot->count += VECT_MAX_COST; + } + +@@ -1438,7 +1438,7 @@ + res.peel_info.dr = NULL; + res.body_cost_vec = stmt_vector_for_cost(); + +- if (flag_vect_cost_model) ++ if (!unlimited_cost_model ()) + { + res.inside_cost = INT_MAX; + res.outside_cost = INT_MAX; +@@ -1668,7 +1668,7 @@ + vectorization factor. + We do this automtically for cost model, since we calculate cost + for every peeling option. */ +- if (!flag_vect_cost_model) ++ if (unlimited_cost_model ()) + possible_npeel_number = vf /nelements; + + /* Handle the aligned case. We may decide to align some other +@@ -1676,7 +1676,7 @@ + if (DR_MISALIGNMENT (dr) == 0) + { + npeel_tmp = 0; +- if (!flag_vect_cost_model) ++ if (unlimited_cost_model ()) + possible_npeel_number++; + } + +@@ -1926,6 +1926,30 @@ + + if (do_peeling) + { ++ unsigned max_allowed_peel ++ = PARAM_VALUE (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT); ++ if (max_allowed_peel != (unsigned)-1) ++ { ++ unsigned max_peel = npeel; ++ if (max_peel == 0) ++ { ++ gimple dr_stmt = DR_STMT (dr0); ++ stmt_vec_info vinfo = vinfo_for_stmt (dr_stmt); ++ tree vtype = STMT_VINFO_VECTYPE (vinfo); ++ max_peel = TYPE_VECTOR_SUBPARTS (vtype) - 1; ++ } ++ if (max_peel > max_allowed_peel) ++ { ++ do_peeling = false; ++ if (dump_enabled_p ()) ++ dump_printf_loc (MSG_NOTE, vect_location, ++ "Disable peeling, max peels reached: %d\n", max_peel); ++ } ++ } ++ } ++ ++ if (do_peeling) ++ { + stmt_info_for_cost *si; + void *data = LOOP_VINFO_TARGET_COST_DATA (loop_vinfo); + +@@ -1979,16 +2003,14 @@ + /* (2) Versioning to force alignment. */ + + /* Try versioning if: +- 1) flag_tree_vect_loop_version is TRUE +- 2) optimize loop for speed +- 3) there is at least one unsupported misaligned data ref with an unknown ++ 1) optimize loop for speed ++ 2) there is at least one unsupported misaligned data ref with an unknown + misalignment, and +- 4) all misaligned data refs with a known misalignment are supported, and +- 5) the number of runtime alignment checks is within reason. */ ++ 3) all misaligned data refs with a known misalignment are supported, and ++ 4) the number of runtime alignment checks is within reason. */ + + do_versioning = +- flag_tree_vect_loop_version +- && optimize_loop_nest_for_speed_p (loop) ++ optimize_loop_nest_for_speed_p (loop) + && (!loop->inner); /* FORNOW */ + + if (do_versioning) +--- a/src/gcc/coretypes.h ++++ b/src/gcc/coretypes.h +@@ -62,6 +62,8 @@ + typedef union gimple_statement_d *gimple; + typedef const union gimple_statement_d *const_gimple; + typedef gimple gimple_seq; ++struct gimple_stmt_iterator_d; ++typedef struct gimple_stmt_iterator_d gimple_stmt_iterator; + union section; + typedef union section section; + struct gcc_options; +--- a/src/gcc/tree-ssa-phiopt.c ++++ b/src/gcc/tree-ssa-phiopt.c +@@ -108,6 +108,26 @@ + This opportunity can sometimes occur as a result of other + optimizations. + ++ ++ Another case caught by value replacement looks like this: ++ ++ bb0: ++ t1 = a == CONST; ++ t2 = b > c; ++ t3 = t1 & t2; ++ if (t3 != 0) goto bb1; else goto bb2; ++ bb1: ++ bb2: ++ x = PHI (CONST, a) ++ ++ Gets replaced with: ++ bb0: ++ bb2: ++ t1 = a == CONST; ++ t2 = b > c; ++ t3 = t1 & t2; ++ x = a; ++ + ABS Replacement + --------------- + +@@ -153,7 +173,7 @@ + + Adjacent Load Hoisting + ---------------------- +- ++ + This transformation replaces + + bb0: +@@ -275,7 +295,7 @@ + phi optimizations. Both share much of the infrastructure in how + to match applicable basic block patterns. DO_STORE_ELIM is true + when we want to do conditional store replacement, false otherwise. +- DO_HOIST_LOADS is true when we want to hoist adjacent loads out ++ DO_HOIST_LOADS is true when we want to hoist adjacent loads out + of diamond control flow patterns, false otherwise. */ + static unsigned int + tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads) +@@ -378,7 +398,7 @@ + continue; + } + else +- continue; ++ continue; + + e1 = EDGE_SUCC (bb1, 0); + +@@ -426,7 +446,7 @@ + + if (!candorest) + continue; +- ++ + phi = single_non_singleton_phi_for_edges (phis, e1, e2); + if (!phi) + continue; +@@ -714,6 +734,93 @@ + return false; + } + ++/* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional ++ of the form SSA_NAME NE 0. ++ ++ If RHS is fed by a simple EQ_EXPR comparison of two values, see if ++ the two input values of the EQ_EXPR match arg0 and arg1. ++ ++ If so update *code and return TRUE. Otherwise return FALSE. */ ++ ++static bool ++rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1, ++ enum tree_code *code, const_tree rhs) ++{ ++ /* Obviously if RHS is not an SSA_NAME, we can't look at the defining ++ statement. */ ++ if (TREE_CODE (rhs) == SSA_NAME) ++ { ++ gimple def1 = SSA_NAME_DEF_STMT (rhs); ++ ++ /* Verify the defining statement has an EQ_EXPR on the RHS. */ ++ if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR) ++ { ++ /* Finally verify the source operands of the EQ_EXPR are equal ++ to arg0 and arg1. */ ++ tree op0 = gimple_assign_rhs1 (def1); ++ tree op1 = gimple_assign_rhs2 (def1); ++ if ((operand_equal_for_phi_arg_p (arg0, op0) ++ && operand_equal_for_phi_arg_p (arg1, op1)) ++ || (operand_equal_for_phi_arg_p (arg0, op1) ++ && operand_equal_for_phi_arg_p (arg1, op0))) ++ { ++ /* We will perform the optimization. */ ++ *code = gimple_assign_rhs_code (def1); ++ return true; ++ } ++ } ++ } ++ return false; ++} ++ ++/* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND. ++ ++ Also return TRUE if arg0/arg1 are equal to the source arguments of a ++ an EQ comparison feeding a BIT_AND_EXPR which feeds COND. ++ ++ Return FALSE otherwise. */ ++ ++static bool ++operand_equal_for_value_replacement (const_tree arg0, const_tree arg1, ++ enum tree_code *code, gimple cond) ++{ ++ gimple def; ++ tree lhs = gimple_cond_lhs (cond); ++ tree rhs = gimple_cond_rhs (cond); ++ ++ if ((operand_equal_for_phi_arg_p (arg0, lhs) ++ && operand_equal_for_phi_arg_p (arg1, rhs)) ++ || (operand_equal_for_phi_arg_p (arg1, lhs) ++ && operand_equal_for_phi_arg_p (arg0, rhs))) ++ return true; ++ ++ /* Now handle more complex case where we have an EQ comparison ++ which feeds a BIT_AND_EXPR which feeds COND. ++ ++ First verify that COND is of the form SSA_NAME NE 0. */ ++ if (*code != NE_EXPR || !integer_zerop (rhs) ++ || TREE_CODE (lhs) != SSA_NAME) ++ return false; ++ ++ /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR. */ ++ def = SSA_NAME_DEF_STMT (lhs); ++ if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR) ++ return false; ++ ++ /* Now verify arg0/arg1 correspond to the source arguments of an ++ EQ comparison feeding the BIT_AND_EXPR. */ ++ ++ tree tmp = gimple_assign_rhs1 (def); ++ if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp)) ++ return true; ++ ++ tmp = gimple_assign_rhs2 (def); ++ if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp)) ++ return true; ++ ++ return false; ++} ++ + /* The function value_replacement does the main work of doing the value + replacement. Return non-zero if the replacement is done. Otherwise return + 0. If we remove the middle basic block, return 2. +@@ -783,10 +890,7 @@ + We now need to verify that the two arguments in the PHI node match + the two arguments to the equality comparison. */ + +- if ((operand_equal_for_phi_arg_p (arg0, gimple_cond_lhs (cond)) +- && operand_equal_for_phi_arg_p (arg1, gimple_cond_rhs (cond))) +- || (operand_equal_for_phi_arg_p (arg1, gimple_cond_lhs (cond)) +- && operand_equal_for_phi_arg_p (arg0, gimple_cond_rhs (cond)))) ++ if (operand_equal_for_value_replacement (arg0, arg1, &code, cond)) + { + edge e; + tree arg; +@@ -1807,7 +1911,7 @@ + + /* Given a "diamond" control-flow pattern where BB0 tests a condition, + BB1 and BB2 are "then" and "else" blocks dependent on this test, +- and BB3 rejoins control flow following BB1 and BB2, look for ++ and BB3 rejoins control flow following BB1 and BB2, look for + opportunities to hoist loads as follows. If BB3 contains a PHI of + two loads, one each occurring in BB1 and BB2, and the loads are + provably of adjacent fields in the same structure, then move both +@@ -1857,7 +1961,7 @@ + + arg1 = gimple_phi_arg_def (phi_stmt, 0); + arg2 = gimple_phi_arg_def (phi_stmt, 1); +- ++ + if (TREE_CODE (arg1) != SSA_NAME + || TREE_CODE (arg2) != SSA_NAME + || SSA_NAME_IS_DEFAULT_DEF (arg1) +--- a/src/gcc/tree-ssa-coalesce.c ++++ b/src/gcc/tree-ssa-coalesce.c +@@ -979,8 +979,7 @@ + continue; + + register_ssa_partition (map, arg); +- if ((SSA_NAME_VAR (arg) == SSA_NAME_VAR (res) +- && TREE_TYPE (arg) == TREE_TYPE (res)) ++ if (gimple_can_coalesce_p (arg, res) + || (e->flags & EDGE_ABNORMAL)) + { + saw_copy = true; +@@ -1021,8 +1020,7 @@ + if (gimple_assign_copy_p (stmt) + && TREE_CODE (lhs) == SSA_NAME + && TREE_CODE (rhs1) == SSA_NAME +- && SSA_NAME_VAR (lhs) == SSA_NAME_VAR (rhs1) +- && TREE_TYPE (lhs) == TREE_TYPE (rhs1)) ++ && gimple_can_coalesce_p (lhs, rhs1)) + { + v1 = SSA_NAME_VERSION (lhs); + v2 = SSA_NAME_VERSION (rhs1); +@@ -1073,8 +1071,7 @@ + v1 = SSA_NAME_VERSION (outputs[match]); + v2 = SSA_NAME_VERSION (input); + +- if (SSA_NAME_VAR (outputs[match]) == SSA_NAME_VAR (input) +- && TREE_TYPE (outputs[match]) == TREE_TYPE (input)) ++ if (gimple_can_coalesce_p (outputs[match], input)) + { + cost = coalesce_cost (REG_BR_PROB_BASE, + optimize_bb_for_size_p (bb)); +@@ -1108,8 +1105,7 @@ + first = var; + else + { +- gcc_assert (SSA_NAME_VAR (var) == SSA_NAME_VAR (first) +- && TREE_TYPE (var) == TREE_TYPE (first)); ++ gcc_assert (gimple_can_coalesce_p (var, first)); + v1 = SSA_NAME_VERSION (first); + v2 = SSA_NAME_VERSION (var); + bitmap_set_bit (used_in_copy, v1); +@@ -1246,8 +1242,7 @@ + var2 = ssa_name (y); + + /* Assert the coalesces have the same base variable. */ +- gcc_assert (SSA_NAME_VAR (var1) == SSA_NAME_VAR (var2) +- && TREE_TYPE (var1) == TREE_TYPE (var2)); ++ gcc_assert (gimple_can_coalesce_p (var1, var2)); + + if (debug) + fprintf (debug, "Coalesce list: "); +@@ -1377,3 +1372,38 @@ + + return map; + } ++ ++/* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates for ++ coalescing together, false otherwise. ++ ++ This must stay consistent with var_map_base_init in tree-ssa-live.c. */ ++ ++bool ++gimple_can_coalesce_p (tree name1, tree name2) ++{ ++ /* First check the SSA_NAME's associated DECL. We only want to ++ coalesce if they have the same DECL or both have no associated DECL. */ ++ if (SSA_NAME_VAR (name1) != SSA_NAME_VAR (name2)) ++ return false; ++ ++ /* Now check the types. If the types are the same, then we should ++ try to coalesce V1 and V2. */ ++ tree t1 = TREE_TYPE (name1); ++ tree t2 = TREE_TYPE (name2); ++ if (t1 == t2) ++ return true; ++ ++ /* If the types are not the same, check for a canonical type match. This ++ (for example) allows coalescing when the types are fundamentally the ++ same, but just have different names. ++ ++ Note pointer types with different address spaces may have the same ++ canonical type. Those are rejected for coalescing by the ++ types_compatible_p check. */ ++ if (TYPE_CANONICAL (t1) ++ && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2) ++ && types_compatible_p (t1, t2)) ++ return true; ++ ++ return false; ++} +--- a/src/gcc/lower-subreg.c ++++ b/src/gcc/lower-subreg.c +@@ -966,7 +966,20 @@ + rtx reg; + + reg = gen_reg_rtx (orig_mode); ++ ++#ifdef AUTO_INC_DEC ++ { ++ rtx move = emit_move_insn (reg, src); ++ if (MEM_P (src)) ++ { ++ rtx note = find_reg_note (insn, REG_INC, NULL_RTX); ++ if (note) ++ add_reg_note (move, REG_INC, XEXP (note, 0)); ++ } ++ } ++#else + emit_move_insn (reg, src); ++#endif + src = reg; + } + +@@ -1056,6 +1069,16 @@ + mdest = simplify_gen_subreg (orig_mode, dest, GET_MODE (dest), 0); + minsn = emit_move_insn (real_dest, mdest); + ++#ifdef AUTO_INC_DEC ++ if (MEM_P (real_dest) ++ && !(resolve_reg_p (real_dest) || resolve_subreg_p (real_dest))) ++ { ++ rtx note = find_reg_note (insn, REG_INC, NULL_RTX); ++ if (note) ++ add_reg_note (minsn, REG_INC, XEXP (note, 0)); ++ } ++#endif ++ + smove = single_set (minsn); + gcc_assert (smove != NULL_RTX); + +--- a/src/gcc/gimple-fold.c ++++ b/src/gcc/gimple-fold.c +@@ -1151,6 +1151,8 @@ + gimplify_and_update_call_from_tree (gsi, result); + changed = true; + } ++ else if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD) ++ changed |= targetm.gimple_fold_builtin (gsi); + } + + return changed; +--- a/src/gcc/tree-ssa-live.c ++++ b/src/gcc/tree-ssa-live.c +@@ -88,8 +88,12 @@ + as it restricts the sets we compute conflicts for. + Using TREE_TYPE to generate sets is the easies as + type equivalency also holds for SSA names with the same +- underlying decl. */ +- m->base.from = TREE_TYPE (var); ++ underlying decl. ++ ++ Check gimple_can_coalesce_p when changing this code. */ ++ m->base.from = (TYPE_CANONICAL (TREE_TYPE (var)) ++ ? TYPE_CANONICAL (TREE_TYPE (var)) ++ : TREE_TYPE (var)); + /* If base variable hasn't been seen, set it up. */ + slot = (struct tree_int_map **) htab_find_slot (tree_to_index, + m, INSERT); +--- a/src/gcc/lto/ChangeLog.linaro ++++ b/src/gcc/lto/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/po/ChangeLog.linaro ++++ b/src/gcc/po/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/gcc/common.opt ++++ b/src/gcc/common.opt +@@ -2233,13 +2233,33 @@ + Common Report Var(flag_tree_slp_vectorize) Init(2) Optimization + Enable basic block vectorization (SLP) on trees + ++fvect-cost-model= ++Common Joined RejectNegative Enum(vect_cost_model) Var(flag_vect_cost_model) Init(VECT_COST_MODEL_DEFAULT) ++Specifies the cost model for vectorization ++ ++Enum ++Name(vect_cost_model) Type(enum vect_cost_model) UnknownError(unknown vectorizer cost model %qs) ++ ++EnumValue ++Enum(vect_cost_model) String(unlimited) Value(VECT_COST_MODEL_UNLIMITED) ++ ++EnumValue ++Enum(vect_cost_model) String(dynamic) Value(VECT_COST_MODEL_DYNAMIC) ++ ++EnumValue ++Enum(vect_cost_model) String(cheap) Value(VECT_COST_MODEL_CHEAP) ++ + fvect-cost-model +-Common Report Var(flag_vect_cost_model) Optimization +-Enable use of cost model in vectorization ++Common RejectNegative Alias(fvect-cost-model=,dynamic) ++Enables the dynamic vectorizer cost model. Preserved for backward compatibility. + ++fno-vect-cost-model ++Common RejectNegative Alias(fvect-cost-model=,unlimited) ++Enables the unlimited vectorizer cost model. Preserved for backward compatibility. ++ + ftree-vect-loop-version +-Common Report Var(flag_tree_vect_loop_version) Init(1) Optimization +-Enable loop versioning when doing loop vectorization on trees ++Common Ignore ++Does nothing. Preserved for backward compatibility. + + ftree-scev-cprop + Common Report Var(flag_tree_scev_cprop) Init(1) Optimization +--- a/src/gcc/combine.c ++++ b/src/gcc/combine.c +@@ -11996,6 +11996,13 @@ + } + } + ++ /* We may have changed the comparison operands. Re-canonicalize. */ ++ if (swap_commutative_operands_p (op0, op1)) ++ { ++ tem = op0, op0 = op1, op1 = tem; ++ code = swap_condition (code); ++ } ++ + /* If this machine only supports a subset of valid comparisons, see if we + can convert an unsupported one into a supported one. */ + target_canonicalize_comparison (&code, &op0, &op1, 0); +--- a/src/gcc/config.gcc ++++ b/src/gcc/config.gcc +@@ -325,10 +325,11 @@ + ;; + arm*-*-*) + cpu_type=arm +- extra_headers="mmintrin.h arm_neon.h" ++ extra_headers="mmintrin.h arm_neon.h arm_acle.h" + target_type_format_char='%' + c_target_objs="arm-c.o" + cxx_target_objs="arm-c.o" ++ need_64bit_hwint=yes + extra_options="${extra_options} arm/arm-tables.opt" + ;; + avr-*-*) +@@ -877,7 +878,7 @@ + tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" + ;; + esac +- tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" ++ tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi arm/t-mlibs" + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h" + # Define multilib configuration for arm-linux-androideabi. + case ${target} in +@@ -885,10 +886,6 @@ + tmake_file="$tmake_file arm/t-linux-androideabi" + ;; + esac +- # The BPABI long long divmod functions return a 128-bit value in +- # registers r0-r3. Correctly modeling that requires the use of +- # TImode. +- need_64bit_hwint=yes + # The EABI requires the use of __cxa_atexit. + default_use_cxa_atexit=yes + with_tls=${with_tls:-gnu} +@@ -897,10 +894,6 @@ + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/linux-gas.h arm/uclinux-elf.h glibc-stdint.h" + tmake_file="arm/t-arm arm/t-arm-elf arm/t-bpabi" + tm_file="$tm_file arm/bpabi.h arm/uclinux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h" +- # The BPABI long long divmod functions return a 128-bit value in +- # registers r0-r3. Correctly modeling that requires the use of +- # TImode. +- need_64bit_hwint=yes + # The EABI requires the use of __cxa_atexit. + default_use_cxa_atexit=yes + ;; +@@ -909,10 +902,6 @@ + arm*eb-*-eabi*) + tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" + esac +- # The BPABI long long divmod functions return a 128-bit value in +- # registers r0-r3. Correctly modeling that requires the use of +- # TImode. +- need_64bit_hwint=yes + default_use_cxa_atexit=yes + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/bpabi.h" + tmake_file="arm/t-arm arm/t-arm-elf" +@@ -3310,6 +3299,43 @@ + if test "x$with_arch" != x && test "x$with_cpu" != x; then + echo "Warning: --with-arch overrides --with-cpu=$with_cpu" 1>&2 + fi ++ ++ # Add extra multilibs ++ if test "x$with_multilib_list" != x; then ++ arm_multilibs=`echo $with_multilib_list | sed -e 's/,/ /g'` ++ for arm_multilib in ${arm_multilibs}; do ++ case ${arm_multilib} in ++ aprofile) ++ # Note that arm/t-aprofile is a ++ # stand-alone make file fragment to be ++ # used only with itself. We do not ++ # specifically use the ++ # TM_MULTILIB_OPTION framework because ++ # this shorthand is more ++ # pragmatic. Additionally it is only ++ # designed to work without any ++ # with-cpu, with-arch with-mode ++ # with-fpu or with-float options. ++ if test "x$with_arch" != x \ ++ || test "x$with_cpu" != x \ ++ || test "x$with_float" != x \ ++ || test "x$with_fpu" != x \ ++ || test "x$with_mode" != x ; then ++ echo "Error: You cannot use any of --with-arch/cpu/fpu/float/mode with --with-multilib-list=aprofile" 1>&2 ++ exit 1 ++ fi ++ tmake_file="${tmake_file} arm/t-aprofile" ++ break ++ ;; ++ default) ++ ;; ++ *) ++ echo "Error: --with-multilib-list=${with_multilib_list} not supported." 1>&2 ++ exit 1 ++ ;; ++ esac ++ done ++ fi + ;; + + fr*-*-*linux*) +--- a/src/gcc/Makefile.in ++++ b/src/gcc/Makefile.in +@@ -4282,7 +4282,8 @@ + gcov.texi trouble.texi bugreport.texi service.texi \ + contribute.texi compat.texi funding.texi gnu.texi gpl_v3.texi \ + fdl.texi contrib.texi cppenv.texi cppopts.texi avr-mmcu.texi \ +- implement-c.texi implement-cxx.texi arm-neon-intrinsics.texi ++ implement-c.texi implement-cxx.texi arm-neon-intrinsics.texi \ ++ arm-acle-intrinsics.texi + + # we explicitly use $(srcdir)/doc/tm.texi here to avoid confusion with + # the generated tm.texi; the latter might have a more recent timestamp, +--- a/src/gcc/gimple.h ++++ b/src/gcc/gimple.h +@@ -130,7 +130,7 @@ + + /* Iterator object for GIMPLE statement sequences. */ + +-typedef struct ++struct gimple_stmt_iterator_d + { + /* Sequence node holding the current statement. */ + gimple_seq_node ptr; +@@ -141,9 +141,8 @@ + block/sequence is removed. */ + gimple_seq *seq; + basic_block bb; +-} gimple_stmt_iterator; ++}; + +- + /* Data structure definitions for GIMPLE tuples. NOTE: word markers + are for 64 bit hosts. */ + +@@ -1033,6 +1032,9 @@ + extern bool useless_type_conversion_p (tree, tree); + extern bool types_compatible_p (tree, tree); + ++/* In tree-ssa-coalesce.c */ ++extern bool gimple_can_coalesce_p (tree, tree); ++ + /* Return the first node in GIMPLE sequence S. */ + + static inline gimple_seq_node +--- a/src/gcc/config/i386/linux-common.h ++++ b/src/gcc/config/i386/linux-common.h +@@ -40,7 +40,7 @@ + #undef LIB_SPEC + #define LIB_SPEC \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \ +- GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC) ++ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC) + + #undef STARTFILE_SPEC + #define STARTFILE_SPEC \ +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -42262,20 +42262,17 @@ + unsigned *cost = (unsigned *) data; + unsigned retval = 0; + +- if (flag_vect_cost_model) +- { +- tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; +- int stmt_cost = ix86_builtin_vectorization_cost (kind, vectype, misalign); ++ tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; ++ int stmt_cost = ix86_builtin_vectorization_cost (kind, vectype, misalign); + +- /* Statements in an inner loop relative to the loop being +- vectorized are weighted more heavily. The value here is +- arbitrary and could potentially be improved with analysis. */ +- if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) +- count *= 50; /* FIXME. */ ++ /* Statements in an inner loop relative to the loop being ++ vectorized are weighted more heavily. The value here is ++ arbitrary and could potentially be improved with analysis. */ ++ if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) ++ count *= 50; /* FIXME. */ + +- retval = (unsigned) (count * stmt_cost); +- cost[where] += retval; +- } ++ retval = (unsigned) (count * stmt_cost); ++ cost[where] += retval; + + return retval; + } +--- a/src/gcc/config/gnu-user.h ++++ b/src/gcc/config/gnu-user.h +@@ -73,10 +73,14 @@ + #undef CPLUSPLUS_CPP_SPEC + #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" + ++#define GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC \ ++ "%{shared:-lc} \ ++ %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}" ++ + #define GNU_USER_TARGET_LIB_SPEC \ +- "%{pthread:-lpthread} \ +- %{shared:-lc} \ +- %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}" ++ "%{pthread:-lpthread} " \ ++ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC ++ + #undef LIB_SPEC + #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC + +--- a/src/gcc/config/aarch64/aarch64-simd.md ++++ b/src/gcc/config/aarch64/aarch64-simd.md +@@ -21,7 +21,7 @@ + + ; Main data types used by the insntructions + +-(define_attr "simd_mode" "unknown,none,V8QI,V16QI,V4HI,V8HI,V2SI,V4SI,V2DI,V2SF,V4SF,V2DF,OI,CI,XI,DI,DF,SI,SF,HI,QI" ++(define_attr "simd_mode" "unknown,none,V8QI,V16QI,V4HI,V8HI,V2SI,V4SI,V2DI,V2SF,V4SF,V2DF,OI,CI,XI,TI,DI,DF,SI,SF,HI,QI" + (const_string "unknown")) + + +@@ -44,6 +44,7 @@ + ; simd_dup duplicate element. + ; simd_dupgp duplicate general purpose register. + ; simd_ext bitwise extract from pair. ++; simd_fabd floating point absolute difference. + ; simd_fadd floating point add/sub. + ; simd_fcmp floating point compare. + ; simd_fcvti floating point convert to integer. +@@ -58,9 +59,9 @@ + ; simd_fmul floating point multiply. + ; simd_fmul_elt floating point multiply (by element). + ; simd_fnegabs floating point neg/abs. +-; simd_frcpe floating point reciprocal estimate. +-; simd_frcps floating point reciprocal step. +-; simd_frecx floating point reciprocal exponent. ++; simd_frecpe floating point reciprocal estimate. ++; simd_frecps floating point reciprocal step. ++; simd_frecpx floating point reciprocal exponent. + ; simd_frint floating point round to integer. + ; simd_fsqrt floating point square root. + ; simd_icvtf integer convert to floating point. +@@ -147,6 +148,7 @@ + simd_dup,\ + simd_dupgp,\ + simd_ext,\ ++ simd_fabd,\ + simd_fadd,\ + simd_fcmp,\ + simd_fcvti,\ +@@ -161,9 +163,9 @@ + simd_fmul,\ + simd_fmul_elt,\ + simd_fnegabs,\ +- simd_frcpe,\ +- simd_frcps,\ +- simd_frecx,\ ++ simd_frecpe,\ ++ simd_frecps,\ ++ simd_frecpx,\ + simd_frint,\ + simd_fsqrt,\ + simd_icvtf,\ +@@ -193,6 +195,7 @@ + simd_move,\ + simd_move_imm,\ + simd_mul,\ ++ simd_mul_d_long,\ + simd_mul_elt,\ + simd_mull,\ + simd_mull_elt,\ +@@ -233,6 +236,12 @@ + simd_trn,\ + simd_uzp,\ + simd_zip,\ ++ simd_crypto_aes,\ ++ simd_crypto_sha1_xor,\ ++ simd_crypto_sha1_fast,\ ++ simd_crypto_sha1_slow,\ ++ simd_crypto_sha256_fast,\ ++ simd_crypto_sha256_slow,\ + none" + (const_string "none")) + +@@ -303,8 +312,8 @@ + (eq_attr "simd_type" "simd_store3,simd_store4") (const_string "neon_vst1_3_4_regs") + (eq_attr "simd_type" "simd_store1s,simd_store2s") (const_string "neon_vst1_vst2_lane") + (eq_attr "simd_type" "simd_store3s,simd_store4s") (const_string "neon_vst3_vst4_lane") +- (and (eq_attr "simd_type" "simd_frcpe,simd_frcps") (eq_attr "simd_mode" "V2SF")) (const_string "neon_fp_vrecps_vrsqrts_ddd") +- (and (eq_attr "simd_type" "simd_frcpe,simd_frcps") (eq_attr "simd_mode" "V4SF,V2DF")) (const_string "neon_fp_vrecps_vrsqrts_qqq") ++ (and (eq_attr "simd_type" "simd_frecpe,simd_frecps") (eq_attr "simd_mode" "V2SF")) (const_string "neon_fp_vrecps_vrsqrts_ddd") ++ (and (eq_attr "simd_type" "simd_frecpe,simd_frecps") (eq_attr "simd_mode" "V4SF,V2DF")) (const_string "neon_fp_vrecps_vrsqrts_qqq") + (eq_attr "simd_type" "none") (const_string "none") + ] + (const_string "unknown"))) +@@ -355,18 +364,6 @@ + (set_attr "simd_mode" "")] + ) + +-(define_insn "aarch64_dup_lane" +- [(set (match_operand:SDQ_I 0 "register_operand" "=w") +- (vec_select: +- (match_operand: 1 "register_operand" "w") +- (parallel [(match_operand:SI 2 "immediate_operand" "i")]) +- ))] +- "TARGET_SIMD" +- "dup\\t%0, %1.[%2]" +- [(set_attr "simd_type" "simd_dup") +- (set_attr "simd_mode" "")] +-) +- + (define_insn "aarch64_simd_dup" + [(set (match_operand:VDQF 0 "register_operand" "=w") + (vec_duplicate:VDQF (match_operand: 1 "register_operand" "w")))] +@@ -394,7 +391,7 @@ + case 4: return "ins\t%0.d[0], %1"; + case 5: return "mov\t%0, %1"; + case 6: +- return aarch64_output_simd_mov_immediate (&operands[1], ++ return aarch64_output_simd_mov_immediate (operands[1], + mode, 64); + default: gcc_unreachable (); + } +@@ -414,16 +411,20 @@ + { + switch (which_alternative) + { +- case 0: return "ld1\t{%0.}, %1"; +- case 1: return "st1\t{%1.}, %0"; +- case 2: return "orr\t%0., %1., %1."; +- case 3: return "umov\t%0, %1.d[0]\;umov\t%H0, %1.d[1]"; +- case 4: return "ins\t%0.d[0], %1\;ins\t%0.d[1], %H1"; +- case 5: return "#"; ++ case 0: ++ return "ld1\t{%0.}, %1"; ++ case 1: ++ return "st1\t{%1.}, %0"; ++ case 2: ++ return "orr\t%0., %1., %1."; ++ case 3: ++ case 4: ++ case 5: ++ return "#"; + case 6: +- return aarch64_output_simd_mov_immediate (&operands[1], +- mode, 128); +- default: gcc_unreachable (); ++ return aarch64_output_simd_mov_immediate (operands[1], mode, 128); ++ default: ++ gcc_unreachable (); + } + } + [(set_attr "simd_type" "simd_load1,simd_store1,simd_move,simd_movgp,simd_insgp,simd_move,simd_move_imm") +@@ -452,6 +453,77 @@ + aarch64_simd_disambiguate_copy (operands, dest, src, 2); + }) + ++(define_split ++ [(set (match_operand:VQ 0 "register_operand" "") ++ (match_operand:VQ 1 "register_operand" ""))] ++ "TARGET_SIMD && reload_completed ++ && ((FP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[1]))) ++ || (GP_REGNUM_P (REGNO (operands[0])) && FP_REGNUM_P (REGNO (operands[1]))))" ++ [(const_int 0)] ++{ ++ aarch64_split_simd_move (operands[0], operands[1]); ++ DONE; ++}) ++ ++(define_expand "aarch64_split_simd_mov" ++ [(set (match_operand:VQ 0) ++ (match_operand:VQ 1))] ++ "TARGET_SIMD" ++ { ++ rtx dst = operands[0]; ++ rtx src = operands[1]; ++ ++ if (GP_REGNUM_P (REGNO (src))) ++ { ++ rtx src_low_part = gen_lowpart (mode, src); ++ rtx src_high_part = gen_highpart (mode, src); ++ ++ emit_insn ++ (gen_move_lo_quad_ (dst, src_low_part)); ++ emit_insn ++ (gen_move_hi_quad_ (dst, src_high_part)); ++ } ++ ++ else ++ { ++ rtx dst_low_part = gen_lowpart (mode, dst); ++ rtx dst_high_part = gen_highpart (mode, dst); ++ rtx lo = aarch64_simd_vect_par_cnst_half (mode, false); ++ rtx hi = aarch64_simd_vect_par_cnst_half (mode, true); ++ ++ emit_insn ++ (gen_aarch64_simd_mov_from_low (dst_low_part, src, lo)); ++ emit_insn ++ (gen_aarch64_simd_mov_from_high (dst_high_part, src, hi)); ++ } ++ DONE; ++ } ++) ++ ++(define_insn "aarch64_simd_mov_from_low" ++ [(set (match_operand: 0 "register_operand" "=r") ++ (vec_select: ++ (match_operand:VQ 1 "register_operand" "w") ++ (match_operand:VQ 2 "vect_par_cnst_lo_half" "")))] ++ "TARGET_SIMD && reload_completed" ++ "umov\t%0, %1.d[0]" ++ [(set_attr "simd_type" "simd_movgp") ++ (set_attr "simd_mode" "") ++ (set_attr "length" "4") ++ ]) ++ ++(define_insn "aarch64_simd_mov_from_high" ++ [(set (match_operand: 0 "register_operand" "=r") ++ (vec_select: ++ (match_operand:VQ 1 "register_operand" "w") ++ (match_operand:VQ 2 "vect_par_cnst_hi_half" "")))] ++ "TARGET_SIMD && reload_completed" ++ "umov\t%0, %1.d[1]" ++ [(set_attr "simd_type" "simd_movgp") ++ (set_attr "simd_mode" "") ++ (set_attr "length" "4") ++ ]) ++ + (define_insn "orn3" + [(set (match_operand:VDQ 0 "register_operand" "=w") + (ior:VDQ (not:VDQ (match_operand:VDQ 1 "register_operand" "w")) +@@ -503,8 +575,8 @@ + ) + + (define_insn "neg2" +- [(set (match_operand:VDQM 0 "register_operand" "=w") +- (neg:VDQM (match_operand:VDQM 1 "register_operand" "w")))] ++ [(set (match_operand:VDQ 0 "register_operand" "=w") ++ (neg:VDQ (match_operand:VDQ 1 "register_operand" "w")))] + "TARGET_SIMD" + "neg\t%0., %1." + [(set_attr "simd_type" "simd_negabs") +@@ -520,6 +592,51 @@ + (set_attr "simd_mode" "")] + ) + ++(define_insn "abd_3" ++ [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w") ++ (abs:VDQ_BHSI (minus:VDQ_BHSI ++ (match_operand:VDQ_BHSI 1 "register_operand" "w") ++ (match_operand:VDQ_BHSI 2 "register_operand" "w"))))] ++ "TARGET_SIMD" ++ "sabd\t%0., %1., %2." ++ [(set_attr "simd_type" "simd_abd") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "aba_3" ++ [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w") ++ (plus:VDQ_BHSI (abs:VDQ_BHSI (minus:VDQ_BHSI ++ (match_operand:VDQ_BHSI 1 "register_operand" "w") ++ (match_operand:VDQ_BHSI 2 "register_operand" "w"))) ++ (match_operand:VDQ_BHSI 3 "register_operand" "0")))] ++ "TARGET_SIMD" ++ "saba\t%0., %1., %2." ++ [(set_attr "simd_type" "simd_abd") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "fabd_3" ++ [(set (match_operand:VDQF 0 "register_operand" "=w") ++ (abs:VDQF (minus:VDQF ++ (match_operand:VDQF 1 "register_operand" "w") ++ (match_operand:VDQF 2 "register_operand" "w"))))] ++ "TARGET_SIMD" ++ "fabd\t%0., %1., %2." ++ [(set_attr "simd_type" "simd_fabd") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*fabd_scalar3" ++ [(set (match_operand:GPF 0 "register_operand" "=w") ++ (abs:GPF (minus:GPF ++ (match_operand:GPF 1 "register_operand" "w") ++ (match_operand:GPF 2 "register_operand" "w"))))] ++ "TARGET_SIMD" ++ "fabd\t%0, %1, %2" ++ [(set_attr "simd_type" "simd_fabd") ++ (set_attr "mode" "")] ++) ++ + (define_insn "and3" + [(set (match_operand:VDQ 0 "register_operand" "=w") + (and:VDQ (match_operand:VDQ 1 "register_operand" "w") +@@ -904,12 +1021,12 @@ + ) + + ;; Max/Min operations. +-(define_insn "3" ++(define_insn "3" + [(set (match_operand:VQ_S 0 "register_operand" "=w") + (MAXMIN:VQ_S (match_operand:VQ_S 1 "register_operand" "w") + (match_operand:VQ_S 2 "register_operand" "w")))] + "TARGET_SIMD" +- "\t%0., %1., %2." ++ "\t%0., %1., %2." + [(set_attr "simd_type" "simd_minmax") + (set_attr "simd_mode" "")] + ) +@@ -917,29 +1034,39 @@ + ;; Move into low-half clearing high half to 0. + + (define_insn "move_lo_quad_" +- [(set (match_operand:VQ 0 "register_operand" "=w") ++ [(set (match_operand:VQ 0 "register_operand" "=w,w,w") + (vec_concat:VQ +- (match_operand: 1 "register_operand" "w") ++ (match_operand: 1 "register_operand" "w,r,r") + (vec_duplicate: (const_int 0))))] + "TARGET_SIMD" +- "mov\\t%d0, %d1"; +- [(set_attr "simd_type" "simd_dup") +- (set_attr "simd_mode" "")] ++ "@ ++ dup\\t%d0, %1.d[0] ++ fmov\\t%d0, %1 ++ dup\\t%d0, %1" ++ [(set_attr "v8type" "*,fmov,*") ++ (set_attr "simd_type" "simd_dup,*,simd_dup") ++ (set_attr "simd_mode" "") ++ (set_attr "simd" "yes,*,yes") ++ (set_attr "fp" "*,yes,*") ++ (set_attr "length" "4")] + ) + + ;; Move into high-half. + + (define_insn "aarch64_simd_move_hi_quad_" +- [(set (match_operand:VQ 0 "register_operand" "+w") ++ [(set (match_operand:VQ 0 "register_operand" "+w,w") + (vec_concat:VQ + (vec_select: + (match_dup 0) + (match_operand:VQ 2 "vect_par_cnst_lo_half" "")) +- (match_operand: 1 "register_operand" "w")))] ++ (match_operand: 1 "register_operand" "w,r")))] + "TARGET_SIMD" +- "ins\\t%0.d[1], %1.d[0]"; +- [(set_attr "simd_type" "simd_ins") +- (set_attr "simd_mode" "")] ++ "@ ++ ins\\t%0.d[1], %1.d[0] ++ ins\\t%0.d[1], %1" ++ [(set_attr "simd_type" "simd_ins,simd_ins") ++ (set_attr "simd_mode" "") ++ (set_attr "length" "4")] + ) + + (define_expand "move_hi_quad_" +@@ -1045,6 +1172,104 @@ + + ;; Widening arithmetic. + ++(define_insn "*aarch64_mlal_lo" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (plus: ++ (mult: ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 2 "register_operand" "w") ++ (match_operand:VQW 3 "vect_par_cnst_lo_half" ""))) ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 4 "register_operand" "w") ++ (match_dup 3)))) ++ (match_operand: 1 "register_operand" "0")))] ++ "TARGET_SIMD" ++ "mlal\t%0., %2., %4." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*aarch64_mlal_hi" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (plus: ++ (mult: ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 2 "register_operand" "w") ++ (match_operand:VQW 3 "vect_par_cnst_hi_half" ""))) ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 4 "register_operand" "w") ++ (match_dup 3)))) ++ (match_operand: 1 "register_operand" "0")))] ++ "TARGET_SIMD" ++ "mlal2\t%0., %2., %4." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*aarch64_mlsl_lo" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (minus: ++ (match_operand: 1 "register_operand" "0") ++ (mult: ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 2 "register_operand" "w") ++ (match_operand:VQW 3 "vect_par_cnst_lo_half" ""))) ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 4 "register_operand" "w") ++ (match_dup 3))))))] ++ "TARGET_SIMD" ++ "mlsl\t%0., %2., %4." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*aarch64_mlsl_hi" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (minus: ++ (match_operand: 1 "register_operand" "0") ++ (mult: ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 2 "register_operand" "w") ++ (match_operand:VQW 3 "vect_par_cnst_hi_half" ""))) ++ (ANY_EXTEND: (vec_select: ++ (match_operand:VQW 4 "register_operand" "w") ++ (match_dup 3))))))] ++ "TARGET_SIMD" ++ "mlsl2\t%0., %2., %4." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*aarch64_mlal" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (plus: ++ (mult: ++ (ANY_EXTEND: ++ (match_operand:VDW 1 "register_operand" "w")) ++ (ANY_EXTEND: ++ (match_operand:VDW 2 "register_operand" "w"))) ++ (match_operand: 3 "register_operand" "0")))] ++ "TARGET_SIMD" ++ "mlal\t%0., %1., %2." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "*aarch64_mlsl" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (minus: ++ (match_operand: 1 "register_operand" "0") ++ (mult: ++ (ANY_EXTEND: ++ (match_operand:VDW 2 "register_operand" "w")) ++ (ANY_EXTEND: ++ (match_operand:VDW 3 "register_operand" "w")))))] ++ "TARGET_SIMD" ++ "mlsl\t%0., %2., %3." ++ [(set_attr "simd_type" "simd_mlal") ++ (set_attr "simd_mode" "")] ++) ++ + (define_insn "aarch64_simd_vec_mult_lo_" + [(set (match_operand: 0 "register_operand" "=w") + (mult: (ANY_EXTEND: (vec_select: +@@ -1196,7 +1421,9 @@ + (set_attr "simd_mode" "")] + ) + +-(define_insn "aarch64_frint" ++;; Vector versions of the floating-point frint patterns. ++;; Expands to btrunc, ceil, floor, nearbyint, rint, round. ++(define_insn "2" + [(set (match_operand:VDQF 0 "register_operand" "=w") + (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")] + FRINT))] +@@ -1206,16 +1433,9 @@ + (set_attr "simd_mode" "")] + ) + +-;; Vector versions of the floating-point frint patterns. +-;; Expands to btrunc, ceil, floor, nearbyint, rint, round. +-(define_expand "2" +- [(set (match_operand:VDQF 0 "register_operand") +- (unspec:VDQF [(match_operand:VDQF 1 "register_operand")] +- FRINT))] +- "TARGET_SIMD" +- {}) +- +-(define_insn "aarch64_fcvt" ++;; Vector versions of the fcvt standard patterns. ++;; Expands to lbtrunc, lround, lceil, lfloor ++(define_insn "l2" + [(set (match_operand: 0 "register_operand" "=w") + (FIXUORS: (unspec: + [(match_operand:VDQF 1 "register_operand" "w")] +@@ -1226,16 +1446,141 @@ + (set_attr "simd_mode" "")] + ) + +-;; Vector versions of the fcvt standard patterns. +-;; Expands to lbtrunc, lround, lceil, lfloor +-(define_expand "l2" ++(define_expand "2" + [(set (match_operand: 0 "register_operand") + (FIXUORS: (unspec: + [(match_operand:VDQF 1 "register_operand")] +- FCVT)))] ++ UNSPEC_FRINTZ)))] + "TARGET_SIMD" + {}) + ++(define_expand "2" ++ [(set (match_operand: 0 "register_operand") ++ (FIXUORS: (unspec: ++ [(match_operand:VDQF 1 "register_operand")] ++ UNSPEC_FRINTZ)))] ++ "TARGET_SIMD" ++ {}) ++ ++(define_expand "ftrunc2" ++ [(set (match_operand:VDQF 0 "register_operand") ++ (unspec:VDQF [(match_operand:VDQF 1 "register_operand")] ++ UNSPEC_FRINTZ))] ++ "TARGET_SIMD" ++ {}) ++ ++(define_insn "2" ++ [(set (match_operand:VDQF 0 "register_operand" "=w") ++ (FLOATUORS:VDQF ++ (match_operand: 1 "register_operand" "w")))] ++ "TARGET_SIMD" ++ "cvtf\\t%0., %1." ++ [(set_attr "simd_type" "simd_icvtf") ++ (set_attr "simd_mode" "")] ++) ++ ++;; Conversions between vectors of floats and doubles. ++;; Contains a mix of patterns to match standard pattern names ++;; and those for intrinsics. ++ ++;; Float widening operations. ++ ++(define_insn "vec_unpacks_lo_v4sf" ++ [(set (match_operand:V2DF 0 "register_operand" "=w") ++ (float_extend:V2DF ++ (vec_select:V2SF ++ (match_operand:V4SF 1 "register_operand" "w") ++ (parallel [(const_int 0) (const_int 1)]) ++ )))] ++ "TARGET_SIMD" ++ "fcvtl\\t%0.2d, %1.2s" ++ [(set_attr "simd_type" "simd_fcvtl") ++ (set_attr "simd_mode" "V2DF")] ++) ++ ++(define_insn "aarch64_float_extend_lo_v2df" ++ [(set (match_operand:V2DF 0 "register_operand" "=w") ++ (float_extend:V2DF ++ (match_operand:V2SF 1 "register_operand" "w")))] ++ "TARGET_SIMD" ++ "fcvtl\\t%0.2d, %1.2s" ++ [(set_attr "simd_type" "simd_fcvtl") ++ (set_attr "simd_mode" "V2DF")] ++) ++ ++(define_insn "vec_unpacks_hi_v4sf" ++ [(set (match_operand:V2DF 0 "register_operand" "=w") ++ (float_extend:V2DF ++ (vec_select:V2SF ++ (match_operand:V4SF 1 "register_operand" "w") ++ (parallel [(const_int 2) (const_int 3)]) ++ )))] ++ "TARGET_SIMD" ++ "fcvtl2\\t%0.2d, %1.4s" ++ [(set_attr "simd_type" "simd_fcvtl") ++ (set_attr "simd_mode" "V2DF")] ++) ++ ++;; Float narrowing operations. ++ ++(define_insn "aarch64_float_truncate_lo_v2sf" ++ [(set (match_operand:V2SF 0 "register_operand" "=w") ++ (float_truncate:V2SF ++ (match_operand:V2DF 1 "register_operand" "w")))] ++ "TARGET_SIMD" ++ "fcvtn\\t%0.2s, %1.2d" ++ [(set_attr "simd_type" "simd_fcvtl") ++ (set_attr "simd_mode" "V2SF")] ++) ++ ++(define_insn "aarch64_float_truncate_hi_v4sf" ++ [(set (match_operand:V4SF 0 "register_operand" "=w") ++ (vec_concat:V4SF ++ (match_operand:V2SF 1 "register_operand" "0") ++ (float_truncate:V2SF ++ (match_operand:V2DF 2 "register_operand" "w"))))] ++ "TARGET_SIMD" ++ "fcvtn2\\t%0.4s, %2.2d" ++ [(set_attr "simd_type" "simd_fcvtl") ++ (set_attr "simd_mode" "V4SF")] ++) ++ ++(define_expand "vec_pack_trunc_v2df" ++ [(set (match_operand:V4SF 0 "register_operand") ++ (vec_concat:V4SF ++ (float_truncate:V2SF ++ (match_operand:V2DF 1 "register_operand")) ++ (float_truncate:V2SF ++ (match_operand:V2DF 2 "register_operand")) ++ ))] ++ "TARGET_SIMD" ++ { ++ rtx tmp = gen_reg_rtx (V2SFmode); ++ emit_insn (gen_aarch64_float_truncate_lo_v2sf (tmp, operands[1])); ++ emit_insn (gen_aarch64_float_truncate_hi_v4sf (operands[0], ++ tmp, operands[2])); ++ DONE; ++ } ++) ++ ++(define_expand "vec_pack_trunc_df" ++ [(set (match_operand:V2SF 0 "register_operand") ++ (vec_concat:V2SF ++ (float_truncate:SF ++ (match_operand:DF 1 "register_operand")) ++ (float_truncate:SF ++ (match_operand:DF 2 "register_operand")) ++ ))] ++ "TARGET_SIMD" ++ { ++ rtx tmp = gen_reg_rtx (V2SFmode); ++ emit_insn (gen_move_lo_quad_v2df (tmp, operands[1])); ++ emit_insn (gen_move_hi_quad_v2df (tmp, operands[2])); ++ emit_insn (gen_aarch64_float_truncate_lo_v2sf (operands[0], tmp)); ++ DONE; ++ } ++) ++ + (define_insn "aarch64_vmls" + [(set (match_operand:VDQF 0 "register_operand" "=w") + (minus:VDQF (match_operand:VDQF 1 "register_operand" "0") +@@ -1261,51 +1606,70 @@ + ;; only introduces MIN_EXPR/MAX_EXPR in fast math mode or when not honouring + ;; NaNs. + +-(define_insn "smax3" ++(define_insn "3" + [(set (match_operand:VDQF 0 "register_operand" "=w") +- (smax:VDQF (match_operand:VDQF 1 "register_operand" "w") ++ (FMAXMIN:VDQF (match_operand:VDQF 1 "register_operand" "w") + (match_operand:VDQF 2 "register_operand" "w")))] + "TARGET_SIMD" +- "fmaxnm\\t%0., %1., %2." ++ "fnm\\t%0., %1., %2." + [(set_attr "simd_type" "simd_fminmax") + (set_attr "simd_mode" "")] + ) + +-(define_insn "smin3" ++(define_insn "3" + [(set (match_operand:VDQF 0 "register_operand" "=w") +- (smin:VDQF (match_operand:VDQF 1 "register_operand" "w") +- (match_operand:VDQF 2 "register_operand" "w")))] ++ (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w") ++ (match_operand:VDQF 2 "register_operand" "w")] ++ FMAXMIN_UNS))] + "TARGET_SIMD" +- "fminnm\\t%0., %1., %2." ++ "\\t%0., %1., %2." + [(set_attr "simd_type" "simd_fminmax") + (set_attr "simd_mode" "")] + ) + +-;; FP 'across lanes' max and min ops. ++;; 'across lanes' add. + +-(define_insn "reduc_s_v4sf" +- [(set (match_operand:V4SF 0 "register_operand" "=w") +- (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")] +- FMAXMINV))] ++(define_insn "reduc_plus_" ++ [(set (match_operand:VDQV 0 "register_operand" "=w") ++ (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")] ++ SUADDV))] + "TARGET_SIMD" +- "fnmv\\t%s0, %1.4s"; +- [(set_attr "simd_type" "simd_fminmaxv") +- (set_attr "simd_mode" "V4SF")] ++ "addv\\t%0, %1." ++ [(set_attr "simd_type" "simd_addv") ++ (set_attr "simd_mode" "")] + ) + +-(define_insn "reduc_s_" ++(define_insn "reduc_plus_v2di" ++ [(set (match_operand:V2DI 0 "register_operand" "=w") ++ (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")] ++ SUADDV))] ++ "TARGET_SIMD" ++ "addp\\t%d0, %1.2d" ++ [(set_attr "simd_type" "simd_addv") ++ (set_attr "simd_mode" "V2DI")] ++) ++ ++(define_insn "reduc_plus_v2si" ++ [(set (match_operand:V2SI 0 "register_operand" "=w") ++ (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")] ++ SUADDV))] ++ "TARGET_SIMD" ++ "addp\\t%0.2s, %1.2s, %1.2s" ++ [(set_attr "simd_type" "simd_addv") ++ (set_attr "simd_mode" "V2SI")] ++) ++ ++(define_insn "reduc_plus_" + [(set (match_operand:V2F 0 "register_operand" "=w") + (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")] +- FMAXMINV))] ++ SUADDV))] + "TARGET_SIMD" +- "fnmp\\t%0., %1., %1."; +- [(set_attr "simd_type" "simd_fminmax") ++ "faddp\\t%0, %1." ++ [(set_attr "simd_type" "simd_fadd") + (set_attr "simd_mode" "")] + ) + +-;; FP 'across lanes' add. +- +-(define_insn "aarch64_addvv4sf" ++(define_insn "aarch64_addpv4sf" + [(set (match_operand:V4SF 0 "register_operand" "=w") + (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")] + UNSPEC_FADDV))] +@@ -1315,169 +1679,106 @@ + (set_attr "simd_mode" "V4SF")] + ) + +-(define_expand "reduc_uplus_v4sf" +- [(set (match_operand:V4SF 0 "register_operand" "=w") +- (match_operand:V4SF 1 "register_operand" "w"))] ++(define_expand "reduc_plus_v4sf" ++ [(set (match_operand:V4SF 0 "register_operand") ++ (unspec:V4SF [(match_operand:V4SF 1 "register_operand")] ++ SUADDV))] + "TARGET_SIMD" + { + rtx tmp = gen_reg_rtx (V4SFmode); +- emit_insn (gen_aarch64_addvv4sf (tmp, operands[1])); +- emit_insn (gen_aarch64_addvv4sf (operands[0], tmp)); ++ emit_insn (gen_aarch64_addpv4sf (tmp, operands[1])); ++ emit_insn (gen_aarch64_addpv4sf (operands[0], tmp)); + DONE; + }) + +-(define_expand "reduc_splus_v4sf" +- [(set (match_operand:V4SF 0 "register_operand" "=w") +- (match_operand:V4SF 1 "register_operand" "w"))] ++(define_insn "clz2" ++ [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w") ++ (clz:VDQ_BHSI (match_operand:VDQ_BHSI 1 "register_operand" "w")))] + "TARGET_SIMD" +-{ +- rtx tmp = gen_reg_rtx (V4SFmode); +- emit_insn (gen_aarch64_addvv4sf (tmp, operands[1])); +- emit_insn (gen_aarch64_addvv4sf (operands[0], tmp)); +- DONE; +-}) +- +-(define_insn "aarch64_addv" +- [(set (match_operand:V2F 0 "register_operand" "=w") +- (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")] +- UNSPEC_FADDV))] +- "TARGET_SIMD" +- "faddp\\t%0, %1." +- [(set_attr "simd_type" "simd_fadd") +- (set_attr "simd_mode" "")] ++ "clz\\t%0., %1." ++ [(set_attr "simd_type" "simd_cls") ++ (set_attr "simd_mode" "")] + ) + +-(define_expand "reduc_uplus_" +- [(set (match_operand:V2F 0 "register_operand" "=w") +- (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")] +- UNSPEC_FADDV))] +- "TARGET_SIMD" +- "" +-) ++;; 'across lanes' max and min ops. + +-(define_expand "reduc_splus_" +- [(set (match_operand:V2F 0 "register_operand" "=w") +- (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")] +- UNSPEC_FADDV))] +- "TARGET_SIMD" +- "" +-) +- +-;; Reduction across lanes. +- +-(define_insn "aarch64_addv" ++(define_insn "reduc__" + [(set (match_operand:VDQV 0 "register_operand" "=w") + (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")] +- UNSPEC_ADDV))] ++ MAXMINV))] + "TARGET_SIMD" +- "addv\\t%0, %1." +- [(set_attr "simd_type" "simd_addv") ++ "v\\t%0, %1." ++ [(set_attr "simd_type" "simd_minmaxv") + (set_attr "simd_mode" "")] + ) + +-(define_expand "reduc_splus_" +- [(set (match_operand:VDQV 0 "register_operand" "=w") +- (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")] +- UNSPEC_ADDV))] +- "TARGET_SIMD" +- "" +-) +- +-(define_expand "reduc_uplus_" +- [(set (match_operand:VDQV 0 "register_operand" "=w") +- (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")] +- UNSPEC_ADDV))] +- "TARGET_SIMD" +- "" +-) +- +-(define_insn "aarch64_addvv2di" ++(define_insn "reduc__v2di" + [(set (match_operand:V2DI 0 "register_operand" "=w") + (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")] +- UNSPEC_ADDV))] ++ MAXMINV))] + "TARGET_SIMD" +- "addp\\t%d0, %1.2d" +- [(set_attr "simd_type" "simd_add") ++ "p\\t%d0, %1.2d" ++ [(set_attr "simd_type" "simd_minmaxv") + (set_attr "simd_mode" "V2DI")] + ) + +-(define_expand "reduc_uplus_v2di" +- [(set (match_operand:V2DI 0 "register_operand" "=w") +- (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")] +- UNSPEC_ADDV))] +- "TARGET_SIMD" +- "" +-) +- +-(define_expand "reduc_splus_v2di" +- [(set (match_operand:V2DI 0 "register_operand" "=w") +- (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")] +- UNSPEC_ADDV))] +- "TARGET_SIMD" +- "" +-) +- +-(define_insn "aarch64_addvv2si" ++(define_insn "reduc__v2si" + [(set (match_operand:V2SI 0 "register_operand" "=w") + (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")] +- UNSPEC_ADDV))] ++ MAXMINV))] + "TARGET_SIMD" +- "addp\\t%0.2s, %1.2s, %1.2s" +- [(set_attr "simd_type" "simd_add") ++ "p\\t%0.2s, %1.2s, %1.2s" ++ [(set_attr "simd_type" "simd_minmaxv") + (set_attr "simd_mode" "V2SI")] + ) + +-(define_expand "reduc_uplus_v2si" +- [(set (match_operand:V2SI 0 "register_operand" "=w") +- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")] +- UNSPEC_ADDV))] ++(define_insn "reduc__" ++ [(set (match_operand:V2F 0 "register_operand" "=w") ++ (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")] ++ FMAXMINV))] + "TARGET_SIMD" +- "" +-) +- +-(define_expand "reduc_splus_v2si" +- [(set (match_operand:V2SI 0 "register_operand" "=w") +- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")] +- UNSPEC_ADDV))] +- "TARGET_SIMD" +- "" +-) +- +-(define_insn "reduc__" +- [(set (match_operand:VDQV 0 "register_operand" "=w") +- (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")] +- MAXMINV))] +- "TARGET_SIMD" +- "v\\t%0, %1." +- [(set_attr "simd_type" "simd_minmaxv") ++ "p\\t%0, %1." ++ [(set_attr "simd_type" "simd_fminmaxv") + (set_attr "simd_mode" "")] + ) + +-(define_insn "reduc__v2si" +- [(set (match_operand:V2SI 0 "register_operand" "=w") +- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")] +- MAXMINV))] ++(define_insn "reduc__v4sf" ++ [(set (match_operand:V4SF 0 "register_operand" "=w") ++ (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")] ++ FMAXMINV))] + "TARGET_SIMD" +- "p\\t%0.2s, %1.2s, %1.2s" +- [(set_attr "simd_type" "simd_minmax") +- (set_attr "simd_mode" "V2SI")] ++ "v\\t%s0, %1.4s" ++ [(set_attr "simd_type" "simd_fminmaxv") ++ (set_attr "simd_mode" "V4SF")] + ) + +-;; vbsl_* intrinsics may compile to any of bsl/bif/bit depending on register +-;; allocation. For an intrinsic of form: +-;; vD = bsl_* (vS, vN, vM) ++;; aarch64_simd_bsl may compile to any of bsl/bif/bit depending on register ++;; allocation. ++;; Operand 1 is the mask, operands 2 and 3 are the bitfields from which ++;; to select. ++;; ++;; Thus our BSL is of the form: ++;; op0 = bsl (mask, op2, op3) + ;; We can use any of: +-;; bsl vS, vN, vM (if D = S) +-;; bit vD, vN, vS (if D = M, so 1-bits in vS choose bits from vN, else vM) +-;; bif vD, vM, vS (if D = N, so 0-bits in vS choose bits from vM, else vN) ++;; ++;; if (op0 = mask) ++;; bsl mask, op1, op2 ++;; if (op0 = op1) (so 1-bits in mask choose bits from op2, else op0) ++;; bit op0, op2, mask ++;; if (op0 = op2) (so 0-bits in mask choose bits from op1, else op0) ++;; bif op0, op1, mask + + (define_insn "aarch64_simd_bsl_internal" + [(set (match_operand:VALL 0 "register_operand" "=w,w,w") +- (unspec:VALL +- [(match_operand: 1 "register_operand" " 0,w,w") +- (match_operand:VALL 2 "register_operand" " w,w,0") +- (match_operand:VALL 3 "register_operand" " w,0,w")] +- UNSPEC_BSL))] ++ (ior:VALL ++ (and:VALL ++ (match_operand: 1 "register_operand" " 0,w,w") ++ (match_operand:VALL 2 "register_operand" " w,w,0")) ++ (and:VALL ++ (not: ++ (match_dup: 1)) ++ (match_operand:VALL 3 "register_operand" " w,0,w")) ++ ))] + "TARGET_SIMD" + "@ + bsl\\t%0., %2., %3. +@@ -1486,28 +1787,32 @@ + ) + + (define_expand "aarch64_simd_bsl" +- [(set (match_operand:VALL 0 "register_operand") +- (unspec:VALL [(match_operand: 1 "register_operand") +- (match_operand:VALL 2 "register_operand") +- (match_operand:VALL 3 "register_operand")] +- UNSPEC_BSL))] +- "TARGET_SIMD" ++ [(match_operand:VALL 0 "register_operand") ++ (match_operand: 1 "register_operand") ++ (match_operand:VALL 2 "register_operand") ++ (match_operand:VALL 3 "register_operand")] ++ "TARGET_SIMD" + { + /* We can't alias operands together if they have different modes. */ + operands[1] = gen_lowpart (mode, operands[1]); ++ emit_insn (gen_aarch64_simd_bsl_internal (operands[0], operands[1], ++ operands[2], operands[3])); ++ DONE; + }) + +-(define_expand "aarch64_vcond_internal" ++(define_expand "aarch64_vcond_internal" + [(set (match_operand:VDQ 0 "register_operand") + (if_then_else:VDQ + (match_operator 3 "comparison_operator" + [(match_operand:VDQ 4 "register_operand") + (match_operand:VDQ 5 "nonmemory_operand")]) +- (match_operand:VDQ 1 "register_operand") +- (match_operand:VDQ 2 "register_operand")))] ++ (match_operand:VDQ 1 "nonmemory_operand") ++ (match_operand:VDQ 2 "nonmemory_operand")))] + "TARGET_SIMD" + { + int inverse = 0, has_zero_imm_form = 0; ++ rtx op1 = operands[1]; ++ rtx op2 = operands[2]; + rtx mask = gen_reg_rtx (mode); + + switch (GET_CODE (operands[3])) +@@ -1566,30 +1871,47 @@ + } + + if (inverse) +- emit_insn (gen_aarch64_simd_bsl (operands[0], mask, operands[2], +- operands[1])); +- else +- emit_insn (gen_aarch64_simd_bsl (operands[0], mask, operands[1], +- operands[2])); ++ { ++ op1 = operands[2]; ++ op2 = operands[1]; ++ } + ++ /* If we have (a = (b CMP c) ? -1 : 0); ++ Then we can simply move the generated mask. */ ++ ++ if (op1 == CONSTM1_RTX (mode) ++ && op2 == CONST0_RTX (mode)) ++ emit_move_insn (operands[0], mask); ++ else ++ { ++ if (!REG_P (op1)) ++ op1 = force_reg (mode, op1); ++ if (!REG_P (op2)) ++ op2 = force_reg (mode, op2); ++ emit_insn (gen_aarch64_simd_bsl (operands[0], mask, ++ op1, op2)); ++ } ++ + DONE; + }) + +-(define_expand "aarch64_vcond_internal" +- [(set (match_operand:VDQF 0 "register_operand") ++(define_expand "aarch64_vcond_internal" ++ [(set (match_operand:VDQF_COND 0 "register_operand") + (if_then_else:VDQF + (match_operator 3 "comparison_operator" + [(match_operand:VDQF 4 "register_operand") + (match_operand:VDQF 5 "nonmemory_operand")]) +- (match_operand:VDQF 1 "register_operand") +- (match_operand:VDQF 2 "register_operand")))] ++ (match_operand:VDQF_COND 1 "nonmemory_operand") ++ (match_operand:VDQF_COND 2 "nonmemory_operand")))] + "TARGET_SIMD" + { + int inverse = 0; + int use_zero_form = 0; + int swap_bsl_operands = 0; +- rtx mask = gen_reg_rtx (mode); +- rtx tmp = gen_reg_rtx (mode); ++ rtx op1 = operands[1]; ++ rtx op2 = operands[2]; ++ rtx mask = gen_reg_rtx (mode); ++ rtx tmp = gen_reg_rtx (mode); + + rtx (*base_comparison) (rtx, rtx, rtx); + rtx (*complimentary_comparison) (rtx, rtx, rtx); +@@ -1609,7 +1931,7 @@ + /* Fall through. */ + default: + if (!REG_P (operands[5])) +- operands[5] = force_reg (mode, operands[5]); ++ operands[5] = force_reg (mode, operands[5]); + } + + switch (GET_CODE (operands[3])) +@@ -1622,8 +1944,8 @@ + case UNGE: + case ORDERED: + case UNORDERED: +- base_comparison = gen_aarch64_cmge; +- complimentary_comparison = gen_aarch64_cmgt; ++ base_comparison = gen_aarch64_cmge; ++ complimentary_comparison = gen_aarch64_cmgt; + break; + case LE: + case UNLE: +@@ -1631,14 +1953,14 @@ + /* Fall through. */ + case GT: + case UNGT: +- base_comparison = gen_aarch64_cmgt; +- complimentary_comparison = gen_aarch64_cmge; ++ base_comparison = gen_aarch64_cmgt; ++ complimentary_comparison = gen_aarch64_cmge; + break; + case EQ: + case NE: + case UNEQ: +- base_comparison = gen_aarch64_cmeq; +- complimentary_comparison = gen_aarch64_cmeq; ++ base_comparison = gen_aarch64_cmeq; ++ complimentary_comparison = gen_aarch64_cmeq; + break; + default: + gcc_unreachable (); +@@ -1666,10 +1988,10 @@ + switch (GET_CODE (operands[3])) + { + case LT: +- base_comparison = gen_aarch64_cmlt; ++ base_comparison = gen_aarch64_cmlt; + break; + case LE: +- base_comparison = gen_aarch64_cmle; ++ base_comparison = gen_aarch64_cmle; + break; + default: + /* Do nothing, other zero form cases already have the correct +@@ -1712,9 +2034,9 @@ + true iff !(a != b && a ORDERED b), swapping the operands to BSL + will then give us (a == b || a UNORDERED b) as intended. */ + +- emit_insn (gen_aarch64_cmgt (mask, operands[4], operands[5])); +- emit_insn (gen_aarch64_cmgt (tmp, operands[5], operands[4])); +- emit_insn (gen_ior3 (mask, mask, tmp)); ++ emit_insn (gen_aarch64_cmgt (mask, operands[4], operands[5])); ++ emit_insn (gen_aarch64_cmgt (tmp, operands[5], operands[4])); ++ emit_insn (gen_ior3 (mask, mask, tmp)); + swap_bsl_operands = 1; + break; + case UNORDERED: +@@ -1723,9 +2045,9 @@ + swap_bsl_operands = 1; + /* Fall through. */ + case ORDERED: +- emit_insn (gen_aarch64_cmgt (tmp, operands[4], operands[5])); +- emit_insn (gen_aarch64_cmge (mask, operands[5], operands[4])); +- emit_insn (gen_ior3 (mask, mask, tmp)); ++ emit_insn (gen_aarch64_cmgt (tmp, operands[4], operands[5])); ++ emit_insn (gen_aarch64_cmge (mask, operands[5], operands[4])); ++ emit_insn (gen_ior3 (mask, mask, tmp)); + break; + default: + gcc_unreachable (); +@@ -1732,11 +2054,27 @@ + } + + if (swap_bsl_operands) +- emit_insn (gen_aarch64_simd_bsl (operands[0], mask, operands[2], +- operands[1])); +- else +- emit_insn (gen_aarch64_simd_bsl (operands[0], mask, operands[1], +- operands[2])); ++ { ++ op1 = operands[2]; ++ op2 = operands[1]; ++ } ++ ++ /* If we have (a = (b CMP c) ? -1 : 0); ++ Then we can simply move the generated mask. */ ++ ++ if (op1 == CONSTM1_RTX (mode) ++ && op2 == CONST0_RTX (mode)) ++ emit_move_insn (operands[0], mask); ++ else ++ { ++ if (!REG_P (op1)) ++ op1 = force_reg (mode, op1); ++ if (!REG_P (op2)) ++ op2 = force_reg (mode, op2); ++ emit_insn (gen_aarch64_simd_bsl (operands[0], mask, ++ op1, op2)); ++ } ++ + DONE; + }) + +@@ -1746,16 +2084,32 @@ + (match_operator 3 "comparison_operator" + [(match_operand:VALL 4 "register_operand") + (match_operand:VALL 5 "nonmemory_operand")]) +- (match_operand:VALL 1 "register_operand") +- (match_operand:VALL 2 "register_operand")))] ++ (match_operand:VALL 1 "nonmemory_operand") ++ (match_operand:VALL 2 "nonmemory_operand")))] + "TARGET_SIMD" + { +- emit_insn (gen_aarch64_vcond_internal (operands[0], operands[1], ++ emit_insn (gen_aarch64_vcond_internal (operands[0], operands[1], + operands[2], operands[3], + operands[4], operands[5])); + DONE; + }) + ++(define_expand "vcond" ++ [(set (match_operand: 0 "register_operand") ++ (if_then_else: ++ (match_operator 3 "comparison_operator" ++ [(match_operand:VDQF 4 "register_operand") ++ (match_operand:VDQF 5 "nonmemory_operand")]) ++ (match_operand: 1 "nonmemory_operand") ++ (match_operand: 2 "nonmemory_operand")))] ++ "TARGET_SIMD" ++{ ++ emit_insn (gen_aarch64_vcond_internal ( ++ operands[0], operands[1], ++ operands[2], operands[3], ++ operands[4], operands[5])); ++ DONE; ++}) + + (define_expand "vcondu" + [(set (match_operand:VDQ 0 "register_operand") +@@ -1763,11 +2117,11 @@ + (match_operator 3 "comparison_operator" + [(match_operand:VDQ 4 "register_operand") + (match_operand:VDQ 5 "nonmemory_operand")]) +- (match_operand:VDQ 1 "register_operand") +- (match_operand:VDQ 2 "register_operand")))] ++ (match_operand:VDQ 1 "nonmemory_operand") ++ (match_operand:VDQ 2 "nonmemory_operand")))] + "TARGET_SIMD" + { +- emit_insn (gen_aarch64_vcond_internal (operands[0], operands[1], ++ emit_insn (gen_aarch64_vcond_internal (operands[0], operands[1], + operands[2], operands[3], + operands[4], operands[5])); + DONE; +@@ -1785,45 +2139,50 @@ + DONE; + }) + +-(define_insn "aarch64_get_lane_signed" +- [(set (match_operand: 0 "register_operand" "=r") +- (sign_extend: ++;; Lane extraction with sign extension to general purpose register. ++(define_insn "*aarch64_get_lane_extend" ++ [(set (match_operand:GPI 0 "register_operand" "=r") ++ (sign_extend:GPI + (vec_select: +- (match_operand:VQ_S 1 "register_operand" "w") ++ (match_operand:VDQQH 1 "register_operand" "w") + (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] + "TARGET_SIMD" +- "smov\\t%0, %1.[%2]" ++ "smov\\t%0, %1.[%2]" + [(set_attr "simd_type" "simd_movgp") +- (set_attr "simd_mode" "")] ++ (set_attr "simd_mode" "")] + ) + +-(define_insn "aarch64_get_lane_unsigned" +- [(set (match_operand: 0 "register_operand" "=r") +- (zero_extend: ++(define_insn "*aarch64_get_lane_zero_extendsi" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (zero_extend:SI + (vec_select: +- (match_operand:VDQ 1 "register_operand" "w") ++ (match_operand:VDQQH 1 "register_operand" "w") + (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))] + "TARGET_SIMD" +- "umov\\t%0, %1.[%2]" ++ "umov\\t%w0, %1.[%2]" + [(set_attr "simd_type" "simd_movgp") + (set_attr "simd_mode" "")] + ) + ++;; Lane extraction of a value, neither sign nor zero extension ++;; is guaranteed so upper bits should be considered undefined. + (define_insn "aarch64_get_lane" +- [(set (match_operand: 0 "register_operand" "=w") ++ [(set (match_operand: 0 "register_operand" "=r, w") + (vec_select: +- (match_operand:VDQF 1 "register_operand" "w") +- (parallel [(match_operand:SI 2 "immediate_operand" "i")])))] ++ (match_operand:VALL 1 "register_operand" "w, w") ++ (parallel [(match_operand:SI 2 "immediate_operand" "i, i")])))] + "TARGET_SIMD" +- "mov\\t%0.[0], %1.[%2]" +- [(set_attr "simd_type" "simd_ins") ++ "@ ++ umov\\t%0, %1.[%2] ++ dup\\t%0, %1.[%2]" ++ [(set_attr "simd_type" "simd_movgp, simd_dup") + (set_attr "simd_mode" "")] + ) + + (define_expand "aarch64_get_lanedi" +- [(match_operand:DI 0 "register_operand" "=r") +- (match_operand:DI 1 "register_operand" "w") +- (match_operand:SI 2 "immediate_operand" "i")] ++ [(match_operand:DI 0 "register_operand") ++ (match_operand:DI 1 "register_operand") ++ (match_operand:SI 2 "immediate_operand")] + "TARGET_SIMD" + { + aarch64_simd_lane_bounds (operands[2], 0, 1); +@@ -1944,16 +2303,30 @@ + (set_attr "simd_mode" "")] + ) + +-(define_insn "aarch64_combine" ++(define_insn_and_split "aarch64_combine" + [(set (match_operand: 0 "register_operand" "=&w") + (vec_concat: (match_operand:VDC 1 "register_operand" "w") + (match_operand:VDC 2 "register_operand" "w")))] + "TARGET_SIMD" +- "mov\\t%0.d[0], %1.d[0]\;ins\\t%0.d[1], %2.d[0]" +- [(set_attr "simd_type" "simd_ins") +- (set_attr "simd_mode" "")] +-) ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++{ ++ aarch64_split_simd_combine (operands[0], operands[1], operands[2]); ++ DONE; ++}) + ++(define_expand "aarch64_simd_combine" ++ [(set (match_operand: 0 "register_operand" "=&w") ++ (vec_concat: (match_operand:VDC 1 "register_operand" "w") ++ (match_operand:VDC 2 "register_operand" "w")))] ++ "TARGET_SIMD" ++ { ++ emit_insn (gen_move_lo_quad_ (operands[0], operands[1])); ++ emit_insn (gen_move_hi_quad_ (operands[0], operands[2])); ++ DONE; ++ }) ++ + ;; l. + + (define_insn "aarch64_l2_internal" +@@ -2861,28 +3234,6 @@ + (set_attr "simd_mode" "")] + ) + +-;; vshl_n +- +-(define_expand "aarch64_sshl_n" +- [(match_operand:VSDQ_I_DI 0 "register_operand" "=w") +- (match_operand:VSDQ_I_DI 1 "register_operand" "w") +- (match_operand:SI 2 "immediate_operand" "i")] +- "TARGET_SIMD" +-{ +- emit_insn (gen_ashl3 (operands[0], operands[1], operands[2])); +- DONE; +-}) +- +-(define_expand "aarch64_ushl_n" +- [(match_operand:VSDQ_I_DI 0 "register_operand" "=w") +- (match_operand:VSDQ_I_DI 1 "register_operand" "w") +- (match_operand:SI 2 "immediate_operand" "i")] +- "TARGET_SIMD" +-{ +- emit_insn (gen_ashl3 (operands[0], operands[1], operands[2])); +- DONE; +-}) +- + ;; vshll_n + + (define_insn "aarch64_shll_n" +@@ -2927,28 +3278,6 @@ + (set_attr "simd_mode" "")] + ) + +-;; vshr_n +- +-(define_expand "aarch64_sshr_n" +- [(match_operand:VSDQ_I_DI 0 "register_operand" "=w") +- (match_operand:VSDQ_I_DI 1 "register_operand" "w") +- (match_operand:SI 2 "immediate_operand" "i")] +- "TARGET_SIMD" +-{ +- emit_insn (gen_ashr3 (operands[0], operands[1], operands[2])); +- DONE; +-}) +- +-(define_expand "aarch64_ushr_n" +- [(match_operand:VSDQ_I_DI 0 "register_operand" "=w") +- (match_operand:VSDQ_I_DI 1 "register_operand" "w") +- (match_operand:SI 2 "immediate_operand" "i")] +- "TARGET_SIMD" +-{ +- emit_insn (gen_lshr3 (operands[0], operands[1], operands[2])); +- DONE; +-}) +- + ;; vrshr_n + + (define_insn "aarch64_shr_n" +@@ -3059,7 +3388,8 @@ + (COMPARISONS:DI + (match_operand:DI 1 "register_operand" "w,w,r") + (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,ZDz,r") +- )))] ++ ))) ++ (clobber (reg:CC CC_REGNUM))] + "TARGET_SIMD" + "@ + cm\t%d0, %d, %d +@@ -3070,15 +3400,7 @@ + happening in the 'w' constraint cases. */ + && GP_REGNUM_P (REGNO (operands[0])) + && GP_REGNUM_P (REGNO (operands[1]))" +- [(set (reg:CC CC_REGNUM) +- (compare:CC +- (match_dup 1) +- (match_dup 2))) +- (set (match_dup 0) +- (neg:DI +- (COMPARISONS:DI +- (match_operand 3 "cc_register" "") +- (const_int 0))))] ++ [(const_int 0)] + { + enum machine_mode mode = SELECT_CC_MODE (, operands[1], operands[2]); + rtx cc_reg = aarch64_gen_compare_reg (, operands[1], operands[2]); +@@ -3111,7 +3433,8 @@ + (UCOMPARISONS:DI + (match_operand:DI 1 "register_operand" "w,r") + (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,r") +- )))] ++ ))) ++ (clobber (reg:CC CC_REGNUM))] + "TARGET_SIMD" + "@ + cm\t%d0, %d, %d +@@ -3121,17 +3444,9 @@ + happening in the 'w' constraint cases. */ + && GP_REGNUM_P (REGNO (operands[0])) + && GP_REGNUM_P (REGNO (operands[1]))" +- [(set (reg:CC CC_REGNUM) +- (compare:CC +- (match_dup 1) +- (match_dup 2))) +- (set (match_dup 0) +- (neg:DI +- (UCOMPARISONS:DI +- (match_operand 3 "cc_register" "") +- (const_int 0))))] ++ [(const_int 0)] + { +- enum machine_mode mode = SELECT_CC_MODE (, operands[1], operands[2]); ++ enum machine_mode mode = CCmode; + rtx cc_reg = aarch64_gen_compare_reg (, operands[1], operands[2]); + rtx comparison = gen_rtx_ (mode, operands[1], operands[2]); + emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg)); +@@ -3164,7 +3479,8 @@ + (and:DI + (match_operand:DI 1 "register_operand" "w,r") + (match_operand:DI 2 "register_operand" "w,r")) +- (const_int 0))))] ++ (const_int 0)))) ++ (clobber (reg:CC CC_REGNUM))] + "TARGET_SIMD" + "@ + cmtst\t%d0, %d1, %d2 +@@ -3174,16 +3490,7 @@ + happening in the 'w' constraint cases. */ + && GP_REGNUM_P (REGNO (operands[0])) + && GP_REGNUM_P (REGNO (operands[1]))" +- [(set (reg:CC_NZ CC_REGNUM) +- (compare:CC_NZ +- (and:DI (match_dup 1) +- (match_dup 2)) +- (const_int 0))) +- (set (match_dup 0) +- (neg:DI +- (ne:DI +- (match_operand 3 "cc_register" "") +- (const_int 0))))] ++ [(const_int 0)] + { + rtx and_tree = gen_rtx_AND (DImode, operands[1], operands[2]); + enum machine_mode mode = SELECT_CC_MODE (NE, and_tree, const0_rtx); +@@ -3213,6 +3520,23 @@ + (set_attr "simd_mode" "")] + ) + ++;; fac(ge|gt) ++;; Note we can also handle what would be fac(le|lt) by ++;; generating fac(ge|gt). ++ ++(define_insn "*aarch64_fac" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (neg: ++ (FAC_COMPARISONS: ++ (abs:VALLF (match_operand:VALLF 1 "register_operand" "w")) ++ (abs:VALLF (match_operand:VALLF 2 "register_operand" "w")) ++ )))] ++ "TARGET_SIMD" ++ "fac\t%0, %, %" ++ [(set_attr "simd_type" "simd_fcmp") ++ (set_attr "simd_mode" "")] ++) ++ + ;; addp + + (define_insn "aarch64_addp" +@@ -3238,30 +3562,6 @@ + (set_attr "simd_mode" "DI")] + ) + +-;; v(max|min) +- +-(define_expand "aarch64_" +- [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w") +- (MAXMIN:VDQ_BHSI (match_operand:VDQ_BHSI 1 "register_operand" "w") +- (match_operand:VDQ_BHSI 2 "register_operand" "w")))] +- "TARGET_SIMD" +-{ +- emit_insn (gen_3 (operands[0], operands[1], operands[2])); +- DONE; +-}) +- +- +-(define_insn "aarch64_" +- [(set (match_operand:VDQF 0 "register_operand" "=w") +- (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w") +- (match_operand:VDQF 2 "register_operand" "w")] +- FMAXMIN))] +- "TARGET_SIMD" +- "\t%0., %1., %2." +- [(set_attr "simd_type" "simd_fminmax") +- (set_attr "simd_mode" "")] +-) +- + ;; sqrt + + (define_insn "sqrt2" +@@ -3273,16 +3573,6 @@ + (set_attr "simd_mode" "")] + ) + +-(define_expand "aarch64_sqrt" +- [(match_operand:VDQF 0 "register_operand" "=w") +- (match_operand:VDQF 1 "register_operand" "w")] +- "TARGET_SIMD" +-{ +- emit_insn (gen_sqrt2 (operands[0], operands[1])); +- DONE; +-}) +- +- + ;; Patterns for vector struct loads and stores. + + (define_insn "vec_load_lanesoi" +@@ -3869,3 +4159,147 @@ + "ld1r\\t{%0.}, %1" + [(set_attr "simd_type" "simd_load1r") + (set_attr "simd_mode" "")]) ++ ++(define_insn "aarch64_frecpe" ++ [(set (match_operand:VDQF 0 "register_operand" "=w") ++ (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")] ++ UNSPEC_FRECPE))] ++ "TARGET_SIMD" ++ "frecpe\\t%0., %1." ++ [(set_attr "simd_type" "simd_frecpe") ++ (set_attr "simd_mode" "")] ++) ++ ++(define_insn "aarch64_frecps" ++ [(set (match_operand:VDQF 0 "register_operand" "=w") ++ (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w") ++ (match_operand:VDQF 2 "register_operand" "w")] ++ UNSPEC_FRECPS))] ++ "TARGET_SIMD" ++ "frecps\\t%0., %1., %2." ++ [(set_attr "simd_type" "simd_frecps") ++ (set_attr "simd_mode" "")] ++) ++ ++;; aes ++ ++(define_insn "aarch64_crypto_aesv16qi" ++ [(set (match_operand:V16QI 0 "register_operand" "=w") ++ (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0") ++ (match_operand:V16QI 2 "register_operand" "w")] ++ CRYPTO_AES))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "aes\\t%0.16b, %2.16b" ++ [(set_attr "simd_type" "simd_crypto_aes") ++ (set_attr "simd_mode" "V16QI")]) ++ ++(define_insn "aarch64_crypto_aesv16qi" ++ [(set (match_operand:V16QI 0 "register_operand" "=w") ++ (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "w")] ++ CRYPTO_AESMC))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "aes\\t%0.16b, %1.16b" ++ [(set_attr "simd_type" "simd_crypto_aes") ++ (set_attr "simd_mode" "V16QI")]) ++ ++;; sha1 ++ ++(define_insn "aarch64_crypto_sha1hsi" ++ [(set (match_operand:SI 0 "register_operand" "=w") ++ (unspec:SI [(match_operand:SI 1 ++ "register_operand" "w")] ++ UNSPEC_SHA1H))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "sha1h\\t%s0, %s1" ++ [(set_attr "simd_type" "simd_crypto_sha1_fast") ++ (set_attr "simd_mode" "SI")]) ++ ++(define_insn "aarch64_crypto_sha1su1v4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:V4SI 2 "register_operand" "w")] ++ UNSPEC_SHA1SU1))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "sha1su1\\t%0.4s, %2.4s" ++ [(set_attr "simd_type" "simd_crypto_sha1_fast") ++ (set_attr "simd_mode" "V4SI")]) ++ ++(define_insn "aarch64_crypto_sha1v4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:SI 2 "register_operand" "w") ++ (match_operand:V4SI 3 "register_operand" "w")] ++ CRYPTO_SHA1))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "sha1\\t%q0, %s2, %3.4s" ++ [(set_attr "simd_type" "simd_crypto_sha1_slow") ++ (set_attr "simd_mode" "V4SI")]) ++ ++(define_insn "aarch64_crypto_sha1su0v4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:V4SI 2 "register_operand" "w") ++ (match_operand:V4SI 3 "register_operand" "w")] ++ UNSPEC_SHA1SU0))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "sha1su0\\t%0.4s, %2.4s, %3.4s" ++ [(set_attr "simd_type" "simd_crypto_sha1_xor") ++ (set_attr "simd_mode" "V4SI")]) ++ ++ ++;; sha256 ++ ++(define_insn "aarch64_crypto_sha256hv4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:V4SI 2 "register_operand" "w") ++ (match_operand:V4SI 3 "register_operand" "w")] ++ CRYPTO_SHA256))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "sha256h\\t%q0, %q2, %3.4s" ++ [(set_attr "simd_type" "simd_crypto_sha256_slow") ++ (set_attr "simd_mode" "V4SI")]) ++ ++(define_insn "aarch64_crypto_sha256su0v4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:V4SI 2 "register_operand" "w")] ++ UNSPEC_SHA256SU0))] ++ "TARGET_SIMD &&TARGET_CRYPTO" ++ "sha256su0\\t%0.4s, %2.4s" ++ [(set_attr "simd_type" "simd_crypto_sha256_fast") ++ (set_attr "simd_mode" "V4SI")]) ++ ++(define_insn "aarch64_crypto_sha256su1v4si" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "0") ++ (match_operand:V4SI 2 "register_operand" "w") ++ (match_operand:V4SI 3 "register_operand" "w")] ++ UNSPEC_SHA256SU1))] ++ "TARGET_SIMD &&TARGET_CRYPTO" ++ "sha256su1\\t%0.4s, %2.4s, %3.4s" ++ [(set_attr "simd_type""simd_crypto_sha256_slow") ++ (set_attr "simd_mode" "V4SI")]) ++ ++ ++;; pmull ++ ++(define_insn "aarch64_crypto_pmulldi" ++ [(set (match_operand:TI 0 "register_operand" "=w") ++ (unspec:TI [(match_operand:DI 1 "register_operand" "w") ++ (match_operand:DI 2 "register_operand" "w")] ++ UNSPEC_PMULL))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "pmull\\t%0.1q, %1.1d, %2.1d" ++ [(set_attr "simd_type" "simd_mul_d_long") ++ (set_attr "simd_mode" "TI")]) ++ ++(define_insn "aarch64_crypto_pmullv2di" ++ [(set (match_operand:TI 0 "register_operand" "=w") ++ (unspec:TI [(match_operand:V2DI 1 "register_operand" "w") ++ (match_operand:V2DI 2 "register_operand" "w")] ++ UNSPEC_PMULL2))] ++ "TARGET_SIMD && TARGET_CRYPTO" ++ "pmull2\\t%0.1q, %1.2d, %2.2d" ++ [(set_attr "simd_type" "simd_mul_d_long") ++ (set_attr "simd_mode" "TI")]) +\ No newline at end of file +--- a/src/gcc/config/aarch64/predicates.md ++++ b/src/gcc/config/aarch64/predicates.md +@@ -115,16 +115,11 @@ + (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), PARALLEL, + 0)"))) + +-(define_predicate "aarch64_const_address" +- (and (match_code "symbol_ref") +- (match_test "mode == DImode && CONSTANT_ADDRESS_P (op)"))) +- + (define_predicate "aarch64_valid_symref" + (match_code "const, symbol_ref, label_ref") + { +- enum aarch64_symbol_type symbol_type; +- return (aarch64_symbolic_constant_p (op, SYMBOL_CONTEXT_ADR, &symbol_type) +- && symbol_type != SYMBOL_FORCE_TO_MEM); ++ return (aarch64_classify_symbolic_expression (op, SYMBOL_CONTEXT_ADR) ++ != SYMBOL_FORCE_TO_MEM); + }) + + (define_predicate "aarch64_tls_ie_symref" +@@ -170,15 +165,10 @@ + }) + + (define_predicate "aarch64_mov_operand" +- (and (match_code "reg,subreg,mem,const_int,symbol_ref,high") ++ (and (match_code "reg,subreg,mem,const,const_int,symbol_ref,label_ref,high") + (ior (match_operand 0 "register_operand") + (ior (match_operand 0 "memory_operand") +- (ior (match_test "GET_CODE (op) == HIGH +- && aarch64_valid_symref (XEXP (op, 0), +- GET_MODE (XEXP (op, 0)))") +- (ior (match_test "CONST_INT_P (op) +- && aarch64_move_imm (INTVAL (op), mode)") +- (match_test "aarch64_const_address (op, mode)"))))))) ++ (match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)"))))) + + (define_predicate "aarch64_movti_operand" + (and (match_code "reg,subreg,mem,const_int") +--- a/src/gcc/config/aarch64/aarch64-elf.h ++++ b/src/gcc/config/aarch64/aarch64-elf.h +@@ -106,7 +106,6 @@ + + #define ASM_COMMENT_START "//" + +-#define REGISTER_PREFIX "" + #define LOCAL_LABEL_PREFIX "." + #define USER_LABEL_PREFIX "" + +--- a/src/gcc/config/aarch64/arm_neon.h ++++ b/src/gcc/config/aarch64/arm_neon.h +@@ -29,6 +29,9 @@ + + #include + ++#define __AARCH64_UINT64_C(__C) ((uint64_t) __C) ++#define __AARCH64_INT64_C(__C) ((int64_t) __C) ++ + typedef __builtin_aarch64_simd_qi int8x8_t + __attribute__ ((__vector_size__ (8))); + typedef __builtin_aarch64_simd_hi int16x4_t +@@ -72,6 +75,8 @@ + __attribute__ ((__vector_size__ (16))); + typedef __builtin_aarch64_simd_poly16 poly16x8_t + __attribute__ ((__vector_size__ (16))); ++typedef __builtin_aarch64_simd_poly64 poly64x2_t ++ __attribute__ ((__vector_size__ (16))); + typedef __builtin_aarch64_simd_uqi uint8x16_t + __attribute__ ((__vector_size__ (16))); + typedef __builtin_aarch64_simd_uhi uint16x8_t +@@ -85,6 +90,8 @@ + typedef double float64_t; + typedef __builtin_aarch64_simd_poly8 poly8_t; + typedef __builtin_aarch64_simd_poly16 poly16_t; ++typedef __builtin_aarch64_simd_poly64 poly64_t; ++typedef __builtin_aarch64_simd_poly128 poly128_t; + + typedef struct int8x8x2_t + { +@@ -446,7 +453,66 @@ + poly16x8_t val[4]; + } poly16x8x4_t; + ++/* vget_lane internal macros. */ + ++#define __aarch64_vget_lane_any(__size, __cast_ret, __cast_a, __a, __b) \ ++ (__cast_ret \ ++ __builtin_aarch64_get_lane##__size (__cast_a __a, __b)) ++ ++#define __aarch64_vget_lane_f32(__a, __b) \ ++ __aarch64_vget_lane_any (v2sf, , , __a, __b) ++#define __aarch64_vget_lane_f64(__a, __b) (__a) ++ ++#define __aarch64_vget_lane_p8(__a, __b) \ ++ __aarch64_vget_lane_any (v8qi, (poly8_t), (int8x8_t), __a, __b) ++#define __aarch64_vget_lane_p16(__a, __b) \ ++ __aarch64_vget_lane_any (v4hi, (poly16_t), (int16x4_t), __a, __b) ++ ++#define __aarch64_vget_lane_s8(__a, __b) \ ++ __aarch64_vget_lane_any (v8qi, , ,__a, __b) ++#define __aarch64_vget_lane_s16(__a, __b) \ ++ __aarch64_vget_lane_any (v4hi, , ,__a, __b) ++#define __aarch64_vget_lane_s32(__a, __b) \ ++ __aarch64_vget_lane_any (v2si, , ,__a, __b) ++#define __aarch64_vget_lane_s64(__a, __b) (__a) ++ ++#define __aarch64_vget_lane_u8(__a, __b) \ ++ __aarch64_vget_lane_any (v8qi, (uint8_t), (int8x8_t), __a, __b) ++#define __aarch64_vget_lane_u16(__a, __b) \ ++ __aarch64_vget_lane_any (v4hi, (uint16_t), (int16x4_t), __a, __b) ++#define __aarch64_vget_lane_u32(__a, __b) \ ++ __aarch64_vget_lane_any (v2si, (uint32_t), (int32x2_t), __a, __b) ++#define __aarch64_vget_lane_u64(__a, __b) (__a) ++ ++#define __aarch64_vgetq_lane_f32(__a, __b) \ ++ __aarch64_vget_lane_any (v4sf, , , __a, __b) ++#define __aarch64_vgetq_lane_f64(__a, __b) \ ++ __aarch64_vget_lane_any (v2df, , , __a, __b) ++ ++#define __aarch64_vgetq_lane_p8(__a, __b) \ ++ __aarch64_vget_lane_any (v16qi, (poly8_t), (int8x16_t), __a, __b) ++#define __aarch64_vgetq_lane_p16(__a, __b) \ ++ __aarch64_vget_lane_any (v8hi, (poly16_t), (int16x8_t), __a, __b) ++ ++#define __aarch64_vgetq_lane_s8(__a, __b) \ ++ __aarch64_vget_lane_any (v16qi, , ,__a, __b) ++#define __aarch64_vgetq_lane_s16(__a, __b) \ ++ __aarch64_vget_lane_any (v8hi, , ,__a, __b) ++#define __aarch64_vgetq_lane_s32(__a, __b) \ ++ __aarch64_vget_lane_any (v4si, , ,__a, __b) ++#define __aarch64_vgetq_lane_s64(__a, __b) \ ++ __aarch64_vget_lane_any (v2di, , ,__a, __b) ++ ++#define __aarch64_vgetq_lane_u8(__a, __b) \ ++ __aarch64_vget_lane_any (v16qi, (uint8_t), (int8x16_t), __a, __b) ++#define __aarch64_vgetq_lane_u16(__a, __b) \ ++ __aarch64_vget_lane_any (v8hi, (uint16_t), (int16x8_t), __a, __b) ++#define __aarch64_vgetq_lane_u32(__a, __b) \ ++ __aarch64_vget_lane_any (v4si, (uint32_t), (int32x4_t), __a, __b) ++#define __aarch64_vgetq_lane_u64(__a, __b) \ ++ __aarch64_vget_lane_any (v2di, (uint64_t), (int64x2_t), __a, __b) ++ ++/* vadd */ + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vadd_s8 (int8x8_t __a, int8x8_t __b) + { +@@ -2307,155 +2373,156 @@ + return (poly16x4_t) __a; + } + ++/* vget_lane */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vget_lane_f32 (float32x2_t __a, const int __b) ++{ ++ return __aarch64_vget_lane_f32 (__a, __b); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vget_lane_f64 (float64x1_t __a, const int __b) ++{ ++ return __aarch64_vget_lane_f64 (__a, __b); ++} ++ ++__extension__ static __inline poly8_t __attribute__ ((__always_inline__)) ++vget_lane_p8 (poly8x8_t __a, const int __b) ++{ ++ return __aarch64_vget_lane_p8 (__a, __b); ++} ++ ++__extension__ static __inline poly16_t __attribute__ ((__always_inline__)) ++vget_lane_p16 (poly16x4_t __a, const int __b) ++{ ++ return __aarch64_vget_lane_p16 (__a, __b); ++} ++ + __extension__ static __inline int8_t __attribute__ ((__always_inline__)) + vget_lane_s8 (int8x8_t __a, const int __b) + { +- return (int8_t) __builtin_aarch64_get_lane_signedv8qi (__a, __b); ++ return __aarch64_vget_lane_s8 (__a, __b); + } + + __extension__ static __inline int16_t __attribute__ ((__always_inline__)) + vget_lane_s16 (int16x4_t __a, const int __b) + { +- return (int16_t) __builtin_aarch64_get_lane_signedv4hi (__a, __b); ++ return __aarch64_vget_lane_s16 (__a, __b); + } + + __extension__ static __inline int32_t __attribute__ ((__always_inline__)) + vget_lane_s32 (int32x2_t __a, const int __b) + { +- return (int32_t) __builtin_aarch64_get_lane_signedv2si (__a, __b); ++ return __aarch64_vget_lane_s32 (__a, __b); + } + +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vget_lane_f32 (float32x2_t __a, const int __b) ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vget_lane_s64 (int64x1_t __a, const int __b) + { +- return (float32_t) __builtin_aarch64_get_lanev2sf (__a, __b); ++ return __aarch64_vget_lane_s64 (__a, __b); + } + + __extension__ static __inline uint8_t __attribute__ ((__always_inline__)) + vget_lane_u8 (uint8x8_t __a, const int __b) + { +- return (uint8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a, +- __b); ++ return __aarch64_vget_lane_u8 (__a, __b); + } + + __extension__ static __inline uint16_t __attribute__ ((__always_inline__)) + vget_lane_u16 (uint16x4_t __a, const int __b) + { +- return (uint16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a, +- __b); ++ return __aarch64_vget_lane_u16 (__a, __b); + } + + __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) + vget_lane_u32 (uint32x2_t __a, const int __b) + { +- return (uint32_t) __builtin_aarch64_get_lane_unsignedv2si ((int32x2_t) __a, +- __b); ++ return __aarch64_vget_lane_u32 (__a, __b); + } + +-__extension__ static __inline poly8_t __attribute__ ((__always_inline__)) +-vget_lane_p8 (poly8x8_t __a, const int __b) ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vget_lane_u64 (uint64x1_t __a, const int __b) + { +- return (poly8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a, +- __b); ++ return __aarch64_vget_lane_u64 (__a, __b); + } + +-__extension__ static __inline poly16_t __attribute__ ((__always_inline__)) +-vget_lane_p16 (poly16x4_t __a, const int __b) ++/* vgetq_lane */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vgetq_lane_f32 (float32x4_t __a, const int __b) + { +- return (poly16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a, +- __b); ++ return __aarch64_vgetq_lane_f32 (__a, __b); + } + +-__extension__ static __inline int64_t __attribute__ ((__always_inline__)) +-vget_lane_s64 (int64x1_t __a, const int __b) ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vgetq_lane_f64 (float64x2_t __a, const int __b) + { +- return (int64_t) __builtin_aarch64_get_lanedi (__a, __b); ++ return __aarch64_vgetq_lane_f64 (__a, __b); + } + +-__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) +-vget_lane_u64 (uint64x1_t __a, const int __b) ++__extension__ static __inline poly8_t __attribute__ ((__always_inline__)) ++vgetq_lane_p8 (poly8x16_t __a, const int __b) + { +- return (uint64_t) __builtin_aarch64_get_lanedi ((int64x1_t) __a, __b); ++ return __aarch64_vgetq_lane_p8 (__a, __b); + } + ++__extension__ static __inline poly16_t __attribute__ ((__always_inline__)) ++vgetq_lane_p16 (poly16x8_t __a, const int __b) ++{ ++ return __aarch64_vgetq_lane_p16 (__a, __b); ++} ++ + __extension__ static __inline int8_t __attribute__ ((__always_inline__)) + vgetq_lane_s8 (int8x16_t __a, const int __b) + { +- return (int8_t) __builtin_aarch64_get_lane_signedv16qi (__a, __b); ++ return __aarch64_vgetq_lane_s8 (__a, __b); + } + + __extension__ static __inline int16_t __attribute__ ((__always_inline__)) + vgetq_lane_s16 (int16x8_t __a, const int __b) + { +- return (int16_t) __builtin_aarch64_get_lane_signedv8hi (__a, __b); ++ return __aarch64_vgetq_lane_s16 (__a, __b); + } + + __extension__ static __inline int32_t __attribute__ ((__always_inline__)) + vgetq_lane_s32 (int32x4_t __a, const int __b) + { +- return (int32_t) __builtin_aarch64_get_lane_signedv4si (__a, __b); ++ return __aarch64_vgetq_lane_s32 (__a, __b); + } + +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vgetq_lane_f32 (float32x4_t __a, const int __b) ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vgetq_lane_s64 (int64x2_t __a, const int __b) + { +- return (float32_t) __builtin_aarch64_get_lanev4sf (__a, __b); ++ return __aarch64_vgetq_lane_s64 (__a, __b); + } + +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vgetq_lane_f64 (float64x2_t __a, const int __b) +-{ +- return (float64_t) __builtin_aarch64_get_lanev2df (__a, __b); +-} +- + __extension__ static __inline uint8_t __attribute__ ((__always_inline__)) + vgetq_lane_u8 (uint8x16_t __a, const int __b) + { +- return (uint8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a, +- __b); ++ return __aarch64_vgetq_lane_u8 (__a, __b); + } + + __extension__ static __inline uint16_t __attribute__ ((__always_inline__)) + vgetq_lane_u16 (uint16x8_t __a, const int __b) + { +- return (uint16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a, +- __b); ++ return __aarch64_vgetq_lane_u16 (__a, __b); + } + + __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) + vgetq_lane_u32 (uint32x4_t __a, const int __b) + { +- return (uint32_t) __builtin_aarch64_get_lane_unsignedv4si ((int32x4_t) __a, +- __b); ++ return __aarch64_vgetq_lane_u32 (__a, __b); + } + +-__extension__ static __inline poly8_t __attribute__ ((__always_inline__)) +-vgetq_lane_p8 (poly8x16_t __a, const int __b) +-{ +- return (poly8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a, +- __b); +-} +- +-__extension__ static __inline poly16_t __attribute__ ((__always_inline__)) +-vgetq_lane_p16 (poly16x8_t __a, const int __b) +-{ +- return (poly16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a, +- __b); +-} +- +-__extension__ static __inline int64_t __attribute__ ((__always_inline__)) +-vgetq_lane_s64 (int64x2_t __a, const int __b) +-{ +- return __builtin_aarch64_get_lane_unsignedv2di (__a, __b); +-} +- + __extension__ static __inline uint64_t __attribute__ ((__always_inline__)) + vgetq_lane_u64 (uint64x2_t __a, const int __b) + { +- return (uint64_t) __builtin_aarch64_get_lane_unsignedv2di ((int64x2_t) __a, +- __b); ++ return __aarch64_vgetq_lane_u64 (__a, __b); + } + ++/* vreinterpret */ ++ + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) + vreinterpret_p8_s8 (int8x8_t __a) + { +@@ -3805,6 +3872,85 @@ + return (uint32x4_t) __builtin_aarch64_reinterpretv4siv8hi ((int16x8_t) __a); + } + ++#define __GET_LOW(__TYPE) \ ++ uint64x2_t tmp = vreinterpretq_u64_##__TYPE (__a); \ ++ uint64_t lo = vgetq_lane_u64 (tmp, 0); \ ++ return vreinterpret_##__TYPE##_u64 (lo); ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vget_low_f32 (float32x4_t __a) ++{ ++ __GET_LOW (f32); ++} ++ ++__extension__ static __inline float64x1_t __attribute__ ((__always_inline__)) ++vget_low_f64 (float64x2_t __a) ++{ ++ return vgetq_lane_f64 (__a, 0); ++} ++ ++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) ++vget_low_p8 (poly8x16_t __a) ++{ ++ __GET_LOW (p8); ++} ++ ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vget_low_p16 (poly16x8_t __a) ++{ ++ __GET_LOW (p16); ++} ++ ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vget_low_s8 (int8x16_t __a) ++{ ++ __GET_LOW (s8); ++} ++ ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vget_low_s16 (int16x8_t __a) ++{ ++ __GET_LOW (s16); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vget_low_s32 (int32x4_t __a) ++{ ++ __GET_LOW (s32); ++} ++ ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vget_low_s64 (int64x2_t __a) ++{ ++ return vgetq_lane_s64 (__a, 0); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vget_low_u8 (uint8x16_t __a) ++{ ++ __GET_LOW (u8); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vget_low_u16 (uint16x8_t __a) ++{ ++ __GET_LOW (u16); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vget_low_u32 (uint32x4_t __a) ++{ ++ __GET_LOW (u32); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vget_low_u64 (uint64x2_t __a) ++{ ++ return vgetq_lane_u64 (__a, 0); ++} ++ ++#undef __GET_LOW ++ + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vcombine_s8 (int8x8_t __a, int8x8_t __b) + { +@@ -4468,160 +4614,6 @@ + return result; + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vabs_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("fabs %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vabs_s8 (int8x8_t a) +-{ +- int8x8_t result; +- __asm__ ("abs %0.8b,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vabs_s16 (int16x4_t a) +-{ +- int16x4_t result; +- __asm__ ("abs %0.4h,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vabs_s32 (int32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("abs %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vabsq_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("fabs %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vabsq_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("fabs %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vabsq_s8 (int8x16_t a) +-{ +- int8x16_t result; +- __asm__ ("abs %0.16b,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vabsq_s16 (int16x8_t a) +-{ +- int16x8_t result; +- __asm__ ("abs %0.8h,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vabsq_s32 (int32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("abs %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vabsq_s64 (int64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("abs %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vacged_f64 (float64_t a, float64_t b) +-{ +- float64_t result; +- __asm__ ("facge %d0,%d1,%d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vacges_f32 (float32_t a, float32_t b) +-{ +- float32_t result; +- __asm__ ("facge %s0,%s1,%s2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vacgtd_f64 (float64_t a, float64_t b) +-{ +- float64_t result; +- __asm__ ("facgt %d0,%d1,%d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vacgts_f32 (float32_t a, float32_t b) +-{ +- float32_t result; +- __asm__ ("facgt %s0,%s1,%s2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline int16_t __attribute__ ((__always_inline__)) + vaddlv_s8 (int8x8_t a) + { +@@ -4732,116 +4724,6 @@ + return result; + } + +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vaddv_s8 (int8x8_t a) +-{ +- int8_t result; +- __asm__ ("addv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vaddv_s16 (int16x4_t a) +-{ +- int16_t result; +- __asm__ ("addv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vaddv_u8 (uint8x8_t a) +-{ +- uint8_t result; +- __asm__ ("addv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vaddv_u16 (uint16x4_t a) +-{ +- uint16_t result; +- __asm__ ("addv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vaddvq_s8 (int8x16_t a) +-{ +- int8_t result; +- __asm__ ("addv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vaddvq_s16 (int16x8_t a) +-{ +- int16_t result; +- __asm__ ("addv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vaddvq_s32 (int32x4_t a) +-{ +- int32_t result; +- __asm__ ("addv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vaddvq_u8 (uint8x16_t a) +-{ +- uint8_t result; +- __asm__ ("addv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vaddvq_u16 (uint16x8_t a) +-{ +- uint16_t result; +- __asm__ ("addv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vaddvq_u32 (uint32x4_t a) +-{ +- uint32_t result; +- __asm__ ("addv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vbsl_f32 (uint32x2_t a, float32x2_t b, float32x2_t c) + { +@@ -5095,358 +4977,6 @@ + return result; + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcage_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("facge %0.2s, %1.2s, %2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcageq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("facge %0.4s, %1.4s, %2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcageq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("facge %0.2d, %1.2d, %2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcagt_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("facgt %0.2s, %1.2s, %2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcagtq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("facgt %0.4s, %1.4s, %2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcagtq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("facgt %0.2d, %1.2d, %2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcale_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("facge %0.2s, %2.2s, %1.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcaleq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("facge %0.4s, %2.4s, %1.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcaleq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("facge %0.2d, %2.2d, %1.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcalt_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("facgt %0.2s, %2.2s, %1.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcaltq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("facgt %0.4s, %2.4s, %1.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcaltq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("facgt %0.2d, %2.2d, %1.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vceq_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("fcmeq %0.2s, %1.2s, %2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vceq_f64 (float64x1_t a, float64x1_t b) +-{ +- uint64x1_t result; +- __asm__ ("fcmeq %d0, %d1, %d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vceqd_f64 (float64_t a, float64_t b) +-{ +- float64_t result; +- __asm__ ("fcmeq %d0,%d1,%d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vceqq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("fcmeq %0.4s, %1.4s, %2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vceqq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("fcmeq %0.2d, %1.2d, %2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vceqs_f32 (float32_t a, float32_t b) +-{ +- float32_t result; +- __asm__ ("fcmeq %s0,%s1,%s2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vceqzd_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcmeq %d0,%d1,#0" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vceqzs_f32 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcmeq %s0,%s1,#0" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcge_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("fcmge %0.2s, %1.2s, %2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vcge_f64 (float64x1_t a, float64x1_t b) +-{ +- uint64x1_t result; +- __asm__ ("fcmge %d0, %d1, %d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcgeq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("fcmge %0.4s, %1.4s, %2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcgeq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("fcmge %0.2d, %1.2d, %2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcgt_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("fcmgt %0.2s, %1.2s, %2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vcgt_f64 (float64x1_t a, float64x1_t b) +-{ +- uint64x1_t result; +- __asm__ ("fcmgt %d0, %d1, %d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcgtq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("fcmgt %0.4s, %1.4s, %2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcgtq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("fcmgt %0.2d, %1.2d, %2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcle_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("fcmge %0.2s, %2.2s, %1.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vcle_f64 (float64x1_t a, float64x1_t b) +-{ +- uint64x1_t result; +- __asm__ ("fcmge %d0, %d2, %d1" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcleq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("fcmge %0.4s, %2.4s, %1.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcleq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("fcmge %0.2d, %2.2d, %1.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vcls_s8 (int8x8_t a) + { +@@ -5513,50 +5043,6 @@ + return result; + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vclt_f32 (float32x2_t a, float32x2_t b) +-{ +- uint32x2_t result; +- __asm__ ("fcmgt %0.2s, %2.2s, %1.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vclt_f64 (float64x1_t a, float64x1_t b) +-{ +- uint64x1_t result; +- __asm__ ("fcmgt %d0, %d2, %d1" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcltq_f32 (float32x4_t a, float32x4_t b) +-{ +- uint32x4_t result; +- __asm__ ("fcmgt %0.4s, %2.4s, %1.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcltq_f64 (float64x2_t a, float64x2_t b) +-{ +- uint64x2_t result; +- __asm__ ("fcmgt %0.2d, %2.2d, %1.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vclz_s8 (int8x8_t a) + { +@@ -5915,72 +5401,6 @@ + + /* vcvt_f32_f16 not supported */ + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vcvt_f32_f64 (float64x2_t a) +-{ +- float32x2_t result; +- __asm__ ("fcvtn %0.2s,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vcvt_f32_s32 (int32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("scvtf %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vcvt_f32_u32 (uint32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("ucvtf %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vcvt_f64_f32 (float32x2_t a) +-{ +- float64x2_t result; +- __asm__ ("fcvtl %0.2d,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__)) +-vcvt_f64_s64 (uint64x1_t a) +-{ +- float64x1_t result; +- __asm__ ("scvtf %d0, %d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__)) +-vcvt_f64_u64 (uint64x1_t a) +-{ +- float64x1_t result; +- __asm__ ("ucvtf %d0, %d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + /* vcvt_high_f16_f32 not supported */ + + /* vcvt_high_f32_f16 not supported */ +@@ -5987,28 +5407,6 @@ + + static float32x2_t vdup_n_f32 (float32_t); + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vcvt_high_f32_f64 (float32x2_t a, float64x2_t b) +-{ +- float32x4_t result = vcombine_f32 (a, vdup_n_f32 (0.0f)); +- __asm__ ("fcvtn2 %0.4s,%2.2d" +- : "+w"(result) +- : "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vcvt_high_f64_f32 (float32x4_t a) +-{ +- float64x2_t result; +- __asm__ ("fcvtl2 %0.2d,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vcvt_n_f32_s32(a, b) \ + __extension__ \ + ({ \ +@@ -6057,160 +5455,6 @@ + result; \ + }) + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vcvt_s32_f32 (float32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("fcvtzs %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcvt_u32_f32 (float32x2_t a) +-{ +- uint32x2_t result; +- __asm__ ("fcvtzu %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vcvta_s32_f32 (float32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("fcvtas %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcvta_u32_f32 (float32x2_t a) +-{ +- uint32x2_t result; +- __asm__ ("fcvtau %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtad_s64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtas %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtad_u64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtau %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vcvtaq_s32_f32 (float32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("fcvtas %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vcvtaq_s64_f64 (float64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("fcvtas %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcvtaq_u32_f32 (float32x4_t a) +-{ +- uint32x4_t result; +- __asm__ ("fcvtau %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcvtaq_u64_f64 (float64x2_t a) +-{ +- uint64x2_t result; +- __asm__ ("fcvtau %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtas_s64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtas %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtas_u64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtau %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64_t __attribute__ ((__always_inline__)) +-vcvtd_f64_s64 (int64_t a) +-{ +- int64_t result; +- __asm__ ("scvtf %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) +-vcvtd_f64_u64 (uint64_t a) +-{ +- uint64_t result; +- __asm__ ("ucvtf %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vcvtd_n_f64_s64(a, b) \ + __extension__ \ + ({ \ +@@ -6259,402 +5503,6 @@ + result; \ + }) + +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtd_s64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtzs %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtd_u64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtzu %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vcvtm_s32_f32 (float32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("fcvtms %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcvtm_u32_f32 (float32x2_t a) +-{ +- uint32x2_t result; +- __asm__ ("fcvtmu %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtmd_s64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtms %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtmd_u64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtmu %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vcvtmq_s32_f32 (float32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("fcvtms %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vcvtmq_s64_f64 (float64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("fcvtms %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcvtmq_u32_f32 (float32x4_t a) +-{ +- uint32x4_t result; +- __asm__ ("fcvtmu %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcvtmq_u64_f64 (float64x2_t a) +-{ +- uint64x2_t result; +- __asm__ ("fcvtmu %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtms_s64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtms %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtms_u64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtmu %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vcvtn_s32_f32 (float32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("fcvtns %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcvtn_u32_f32 (float32x2_t a) +-{ +- uint32x2_t result; +- __asm__ ("fcvtnu %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtnd_s64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtns %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtnd_u64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtnu %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vcvtnq_s32_f32 (float32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("fcvtns %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vcvtnq_s64_f64 (float64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("fcvtns %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcvtnq_u32_f32 (float32x4_t a) +-{ +- uint32x4_t result; +- __asm__ ("fcvtnu %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcvtnq_u64_f64 (float64x2_t a) +-{ +- uint64x2_t result; +- __asm__ ("fcvtnu %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtns_s64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtns %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtns_u64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtnu %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vcvtp_s32_f32 (float32x2_t a) +-{ +- int32x2_t result; +- __asm__ ("fcvtps %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vcvtp_u32_f32 (float32x2_t a) +-{ +- uint32x2_t result; +- __asm__ ("fcvtpu %0.2s, %1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtpd_s64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtps %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vcvtpd_u64_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("fcvtpu %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vcvtpq_s32_f32 (float32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("fcvtps %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vcvtpq_s64_f64 (float64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("fcvtps %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcvtpq_u32_f32 (float32x4_t a) +-{ +- uint32x4_t result; +- __asm__ ("fcvtpu %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcvtpq_u64_f64 (float64x2_t a) +-{ +- uint64x2_t result; +- __asm__ ("fcvtpu %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtps_s64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtps %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvtps_u64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtpu %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vcvtq_f32_s32 (int32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("scvtf %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vcvtq_f32_u32 (uint32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("ucvtf %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vcvtq_f64_s64 (int64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("scvtf %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vcvtq_f64_u64 (uint64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("ucvtf %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vcvtq_n_f32_s32(a, b) \ + __extension__ \ + ({ \ +@@ -6751,72 +5599,6 @@ + result; \ + }) + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vcvtq_s32_f32 (float32x4_t a) +-{ +- int32x4_t result; +- __asm__ ("fcvtzs %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vcvtq_s64_f64 (float64x2_t a) +-{ +- int64x2_t result; +- __asm__ ("fcvtzs %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vcvtq_u32_f32 (float32x4_t a) +-{ +- uint32x4_t result; +- __asm__ ("fcvtzu %0.4s, %1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vcvtq_u64_f64 (float64x2_t a) +-{ +- uint64x2_t result; +- __asm__ ("fcvtzu %0.2d, %1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vcvts_f64_s32 (int32_t a) +-{ +- int32_t result; +- __asm__ ("scvtf %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vcvts_f64_u32 (uint32_t a) +-{ +- uint32_t result; +- __asm__ ("ucvtf %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vcvts_n_f32_s32(a, b) \ + __extension__ \ + ({ \ +@@ -6865,28 +5647,6 @@ + result; \ + }) + +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvts_s64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtzs %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vcvts_u64_f64 (float32_t a) +-{ +- float32_t result; +- __asm__ ("fcvtzu %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vcvtx_f32_f64 (float64x2_t a) + { +@@ -8110,151 +6870,7 @@ + return result; + } + +-#define vget_lane_f64(a, b) \ +- __extension__ \ +- ({ \ +- float64x1_t a_ = (a); \ +- float64_t result; \ +- __asm__ ("umov %x0, %1.d[%2]" \ +- : "=r"(result) \ +- : "w"(a_), "i"(b) \ +- : /* No clobbers */); \ +- result; \ +- }) +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vget_low_f32 (float32x4_t a) +-{ +- float32x2_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__)) +-vget_low_f64 (float64x2_t a) +-{ +- float64x1_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vget_low_p8 (poly8x16_t a) +-{ +- poly8x8_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) +-vget_low_p16 (poly16x8_t a) +-{ +- poly16x4_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vget_low_s8 (int8x16_t a) +-{ +- int8x8_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vget_low_s16 (int16x8_t a) +-{ +- int16x4_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vget_low_s32 (int32x4_t a) +-{ +- int32x2_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +-vget_low_s64 (int64x2_t a) +-{ +- int64x1_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vget_low_u8 (uint8x16_t a) +-{ +- uint8x8_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vget_low_u16 (uint16x8_t a) +-{ +- uint16x4_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vget_low_u32 (uint32x4_t a) +-{ +- uint32x2_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vget_low_u64 (uint64x2_t a) +-{ +- uint64x1_t result; +- __asm__ ("ins %0.d[0], %1.d[0]" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vhsub_s8 (int8x8_t a, int8x8_t b) + { + int8x8_t result; +@@ -8962,303 +7578,6 @@ + result; \ + }) + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vmaxnm_f32 (float32x2_t a, float32x2_t b) +-{ +- float32x2_t result; +- __asm__ ("fmaxnm %0.2s,%1.2s,%2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vmaxnmq_f32 (float32x4_t a, float32x4_t b) +-{ +- float32x4_t result; +- __asm__ ("fmaxnm %0.4s,%1.4s,%2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vmaxnmq_f64 (float64x2_t a, float64x2_t b) +-{ +- float64x2_t result; +- __asm__ ("fmaxnm %0.2d,%1.2d,%2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vmaxnmvq_f32 (float32x4_t a) +-{ +- float32_t result; +- __asm__ ("fmaxnmv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vmaxv_s8 (int8x8_t a) +-{ +- int8_t result; +- __asm__ ("smaxv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vmaxv_s16 (int16x4_t a) +-{ +- int16_t result; +- __asm__ ("smaxv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vmaxv_u8 (uint8x8_t a) +-{ +- uint8_t result; +- __asm__ ("umaxv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vmaxv_u16 (uint16x4_t a) +-{ +- uint16_t result; +- __asm__ ("umaxv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vmaxvq_f32 (float32x4_t a) +-{ +- float32_t result; +- __asm__ ("fmaxv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vmaxvq_s8 (int8x16_t a) +-{ +- int8_t result; +- __asm__ ("smaxv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vmaxvq_s16 (int16x8_t a) +-{ +- int16_t result; +- __asm__ ("smaxv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vmaxvq_s32 (int32x4_t a) +-{ +- int32_t result; +- __asm__ ("smaxv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vmaxvq_u8 (uint8x16_t a) +-{ +- uint8_t result; +- __asm__ ("umaxv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vmaxvq_u16 (uint16x8_t a) +-{ +- uint16_t result; +- __asm__ ("umaxv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vmaxvq_u32 (uint32x4_t a) +-{ +- uint32_t result; +- __asm__ ("umaxv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vminnmvq_f32 (float32x4_t a) +-{ +- float32_t result; +- __asm__ ("fminnmv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vminv_s8 (int8x8_t a) +-{ +- int8_t result; +- __asm__ ("sminv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vminv_s16 (int16x4_t a) +-{ +- int16_t result; +- __asm__ ("sminv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vminv_u8 (uint8x8_t a) +-{ +- uint8_t result; +- __asm__ ("uminv %b0,%1.8b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vminv_u16 (uint16x4_t a) +-{ +- uint16_t result; +- __asm__ ("uminv %h0,%1.4h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vminvq_f32 (float32x4_t a) +-{ +- float32_t result; +- __asm__ ("fminv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int8_t __attribute__ ((__always_inline__)) +-vminvq_s8 (int8x16_t a) +-{ +- int8_t result; +- __asm__ ("sminv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int16_t __attribute__ ((__always_inline__)) +-vminvq_s16 (int16x8_t a) +-{ +- int16_t result; +- __asm__ ("sminv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vminvq_s32 (int32x4_t a) +-{ +- int32_t result; +- __asm__ ("sminv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) +-vminvq_u8 (uint8x16_t a) +-{ +- uint8_t result; +- __asm__ ("uminv %b0,%1.16b" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) +-vminvq_u16 (uint16x8_t a) +-{ +- uint16_t result; +- __asm__ ("uminv %h0,%1.8h" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vminvq_u32 (uint32x4_t a) +-{ +- uint32_t result; +- __asm__ ("uminv %s0,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vmla_lane_f32(a, b, c, d) \ + __extension__ \ + ({ \ +@@ -11382,7 +9701,7 @@ + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vmovn_high_s16 (int8x8_t a, int16x8_t b) + { +- int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.16b,%1.8h" + : "+w"(result) + : "w"(b) +@@ -11393,7 +9712,7 @@ + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vmovn_high_s32 (int16x4_t a, int32x4_t b) + { +- int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0))); ++ int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.8h,%1.4s" + : "+w"(result) + : "w"(b) +@@ -11404,7 +9723,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vmovn_high_s64 (int32x2_t a, int64x2_t b) + { +- int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0))); ++ int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.4s,%1.2d" + : "+w"(result) + : "w"(b) +@@ -11415,7 +9734,7 @@ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vmovn_high_u16 (uint8x8_t a, uint16x8_t b) + { +- uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.16b,%1.8h" + : "+w"(result) + : "w"(b) +@@ -11426,7 +9745,7 @@ + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vmovn_high_u32 (uint16x4_t a, uint32x4_t b) + { +- uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0))); ++ uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.8h,%1.4s" + : "+w"(result) + : "w"(b) +@@ -11437,7 +9756,7 @@ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vmovn_high_u64 (uint32x2_t a, uint64x2_t b) + { +- uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0))); ++ uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("xtn2 %0.4s,%1.2d" + : "+w"(result) + : "w"(b) +@@ -13856,7 +12175,7 @@ + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vqmovn_high_s16 (int8x8_t a, int16x8_t b) + { +- int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtn2 %0.16b, %1.8h" + : "+w"(result) + : "w"(b) +@@ -13867,7 +12186,7 @@ + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vqmovn_high_s32 (int16x4_t a, int32x4_t b) + { +- int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0))); ++ int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtn2 %0.8h, %1.4s" + : "+w"(result) + : "w"(b) +@@ -13878,7 +12197,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vqmovn_high_s64 (int32x2_t a, int64x2_t b) + { +- int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0))); ++ int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtn2 %0.4s, %1.2d" + : "+w"(result) + : "w"(b) +@@ -13889,7 +12208,7 @@ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vqmovn_high_u16 (uint8x8_t a, uint16x8_t b) + { +- uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("uqxtn2 %0.16b, %1.8h" + : "+w"(result) + : "w"(b) +@@ -13900,7 +12219,7 @@ + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vqmovn_high_u32 (uint16x4_t a, uint32x4_t b) + { +- uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0))); ++ uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("uqxtn2 %0.8h, %1.4s" + : "+w"(result) + : "w"(b) +@@ -13911,7 +12230,7 @@ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vqmovn_high_u64 (uint32x2_t a, uint64x2_t b) + { +- uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0))); ++ uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("uqxtn2 %0.4s, %1.2d" + : "+w"(result) + : "w"(b) +@@ -13922,7 +12241,7 @@ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vqmovun_high_s16 (uint8x8_t a, int16x8_t b) + { +- uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtun2 %0.16b, %1.8h" + : "+w"(result) + : "w"(b) +@@ -13933,7 +12252,7 @@ + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vqmovun_high_s32 (uint16x4_t a, int32x4_t b) + { +- uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0))); ++ uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtun2 %0.8h, %1.4s" + : "+w"(result) + : "w"(b) +@@ -13944,7 +12263,7 @@ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vqmovun_high_s64 (uint32x2_t a, int64x2_t b) + { +- uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0))); ++ uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("sqxtun2 %0.4s, %1.2d" + : "+w"(result) + : "w"(b) +@@ -14002,7 +12321,8 @@ + int16x8_t b_ = (b); \ + int8x8_t a_ = (a); \ + int8x16_t result = vcombine_s8 \ +- (a_, vcreate_s8 (UINT64_C (0x0))); \ ++ (a_, vcreate_s8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrn2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14016,7 +12336,8 @@ + int32x4_t b_ = (b); \ + int16x4_t a_ = (a); \ + int16x8_t result = vcombine_s16 \ +- (a_, vcreate_s16 (UINT64_C (0x0))); \ ++ (a_, vcreate_s16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrn2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14030,7 +12351,8 @@ + int64x2_t b_ = (b); \ + int32x2_t a_ = (a); \ + int32x4_t result = vcombine_s32 \ +- (a_, vcreate_s32 (UINT64_C (0x0))); \ ++ (a_, vcreate_s32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrn2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14044,7 +12366,8 @@ + uint16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqrshrn2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14058,7 +12381,8 @@ + uint32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqrshrn2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14072,7 +12396,8 @@ + uint64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqrshrn2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14086,7 +12411,8 @@ + int16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrun2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14100,7 +12426,8 @@ + int32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrun2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14114,7 +12441,8 @@ + int64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqrshrun2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14128,7 +12456,8 @@ + int16x8_t b_ = (b); \ + int8x8_t a_ = (a); \ + int8x16_t result = vcombine_s8 \ +- (a_, vcreate_s8 (UINT64_C (0x0))); \ ++ (a_, vcreate_s8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrn2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14142,7 +12471,8 @@ + int32x4_t b_ = (b); \ + int16x4_t a_ = (a); \ + int16x8_t result = vcombine_s16 \ +- (a_, vcreate_s16 (UINT64_C (0x0))); \ ++ (a_, vcreate_s16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrn2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14156,7 +12486,8 @@ + int64x2_t b_ = (b); \ + int32x2_t a_ = (a); \ + int32x4_t result = vcombine_s32 \ +- (a_, vcreate_s32 (UINT64_C (0x0))); \ ++ (a_, vcreate_s32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrn2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14170,7 +12501,8 @@ + uint16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqshrn2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14184,7 +12516,8 @@ + uint32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqshrn2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14198,7 +12531,8 @@ + uint64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("uqshrn2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14212,7 +12546,8 @@ + int16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrun2 %0.16b, %1.8h, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14226,7 +12561,8 @@ + int32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrun2 %0.8h, %1.4s, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14240,7 +12576,8 @@ + int64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("sqshrun2 %0.4s, %1.2d, #%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -14292,17 +12629,6 @@ + return result; + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrecpe_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frecpe %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) + vrecpe_u32 (uint32x2_t a) + { +@@ -14314,39 +12640,6 @@ + return result; + } + +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vrecped_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("frecpe %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrecpeq_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frecpe %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrecpeq_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frecpe %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vrecpeq_u32 (uint32x4_t a) + { +@@ -14358,94 +12651,6 @@ + return result; + } + +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vrecpes_f32 (float32_t a) +-{ +- float32_t result; +- __asm__ ("frecpe %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrecps_f32 (float32x2_t a, float32x2_t b) +-{ +- float32x2_t result; +- __asm__ ("frecps %0.2s,%1.2s,%2.2s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vrecpsd_f64 (float64_t a, float64_t b) +-{ +- float64_t result; +- __asm__ ("frecps %d0,%d1,%d2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrecpsq_f32 (float32x4_t a, float32x4_t b) +-{ +- float32x4_t result; +- __asm__ ("frecps %0.4s,%1.4s,%2.4s" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrecpsq_f64 (float64x2_t a, float64x2_t b) +-{ +- float64x2_t result; +- __asm__ ("frecps %0.2d,%1.2d,%2.2d" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vrecpss_f32 (float32_t a, float32_t b) +-{ +- float32_t result; +- __asm__ ("frecps %s0,%s1,%s2" +- : "=w"(result) +- : "w"(a), "w"(b) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vrecpxd_f64 (float64_t a) +-{ +- float64_t result; +- __asm__ ("frecpe %d0,%d1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vrecpxs_f32 (float32_t a) +-{ +- float32_t result; +- __asm__ ("frecpe %s0,%s1" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) + vrev16_p8 (poly8x8_t a) + { +@@ -14842,171 +13047,6 @@ + return result; + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrnd_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frintz %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrnda_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frinta %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrndm_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frintm %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrndn_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frintn %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vrndp_f32 (float32x2_t a) +-{ +- float32x2_t result; +- __asm__ ("frintp %0.2s,%1.2s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrndq_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frintz %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrndq_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frintz %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrndqa_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frinta %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrndqa_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frinta %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrndqm_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frintm %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrndqm_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frintm %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrndqn_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frintn %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrndqn_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frintn %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vrndqp_f32 (float32x4_t a) +-{ +- float32x4_t result; +- __asm__ ("frintp %0.4s,%1.4s" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- +-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) +-vrndqp_f64 (float64x2_t a) +-{ +- float64x2_t result; +- __asm__ ("frintp %0.2d,%1.2d" +- : "=w"(result) +- : "w"(a) +- : /* No clobbers */); +- return result; +-} +- + #define vrshrn_high_n_s16(a, b, c) \ + __extension__ \ + ({ \ +@@ -15013,7 +13053,8 @@ + int16x8_t b_ = (b); \ + int8x8_t a_ = (a); \ + int8x16_t result = vcombine_s8 \ +- (a_, vcreate_s8 (UINT64_C (0x0))); \ ++ (a_, vcreate_s8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.16b,%1.8h,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15027,7 +13068,8 @@ + int32x4_t b_ = (b); \ + int16x4_t a_ = (a); \ + int16x8_t result = vcombine_s16 \ +- (a_, vcreate_s16 (UINT64_C (0x0))); \ ++ (a_, vcreate_s16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.8h,%1.4s,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15041,7 +13083,8 @@ + int64x2_t b_ = (b); \ + int32x2_t a_ = (a); \ + int32x4_t result = vcombine_s32 \ +- (a_, vcreate_s32 (UINT64_C (0x0))); \ ++ (a_, vcreate_s32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.4s,%1.2d,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15055,7 +13098,8 @@ + uint16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.16b,%1.8h,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15069,7 +13113,8 @@ + uint32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.8h,%1.4s,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15083,7 +13128,8 @@ + uint64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("rshrn2 %0.4s,%1.2d,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15320,7 +13366,7 @@ + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vrsubhn_high_s16 (int8x8_t a, int16x8_t b, int16x8_t c) + { +- int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.16b, %1.8h, %2.8h" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15331,7 +13377,7 @@ + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vrsubhn_high_s32 (int16x4_t a, int32x4_t b, int32x4_t c) + { +- int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0))); ++ int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.8h, %1.4s, %2.4s" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15342,7 +13388,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vrsubhn_high_s64 (int32x2_t a, int64x2_t b, int64x2_t c) + { +- int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0))); ++ int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.4s, %1.2d, %2.2d" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15353,7 +13399,7 @@ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vrsubhn_high_u16 (uint8x8_t a, uint16x8_t b, uint16x8_t c) + { +- uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.16b, %1.8h, %2.8h" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15364,7 +13410,7 @@ + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vrsubhn_high_u32 (uint16x4_t a, uint32x4_t b, uint32x4_t c) + { +- uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0))); ++ uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.8h, %1.4s, %2.4s" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15375,7 +13421,7 @@ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vrsubhn_high_u64 (uint32x2_t a, uint64x2_t b, uint64x2_t c) + { +- uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0))); ++ uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("rsubhn2 %0.4s, %1.2d, %2.2d" + : "+w"(result) + : "w"(b), "w"(c) +@@ -15767,7 +13813,8 @@ + int16x8_t b_ = (b); \ + int8x8_t a_ = (a); \ + int8x16_t result = vcombine_s8 \ +- (a_, vcreate_s8 (UINT64_C (0x0))); \ ++ (a_, vcreate_s8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.16b,%1.8h,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15781,7 +13828,8 @@ + int32x4_t b_ = (b); \ + int16x4_t a_ = (a); \ + int16x8_t result = vcombine_s16 \ +- (a_, vcreate_s16 (UINT64_C (0x0))); \ ++ (a_, vcreate_s16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.8h,%1.4s,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15795,7 +13843,8 @@ + int64x2_t b_ = (b); \ + int32x2_t a_ = (a); \ + int32x4_t result = vcombine_s32 \ +- (a_, vcreate_s32 (UINT64_C (0x0))); \ ++ (a_, vcreate_s32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.4s,%1.2d,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15809,7 +13858,8 @@ + uint16x8_t b_ = (b); \ + uint8x8_t a_ = (a); \ + uint8x16_t result = vcombine_u8 \ +- (a_, vcreate_u8 (UINT64_C (0x0))); \ ++ (a_, vcreate_u8 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.16b,%1.8h,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15823,7 +13873,8 @@ + uint32x4_t b_ = (b); \ + uint16x4_t a_ = (a); \ + uint16x8_t result = vcombine_u16 \ +- (a_, vcreate_u16 (UINT64_C (0x0))); \ ++ (a_, vcreate_u16 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.8h,%1.4s,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -15837,7 +13888,8 @@ + uint64x2_t b_ = (b); \ + uint32x2_t a_ = (a); \ + uint32x4_t result = vcombine_u32 \ +- (a_, vcreate_u32 (UINT64_C (0x0))); \ ++ (a_, vcreate_u32 \ ++ (__AARCH64_UINT64_C (0x0))); \ + __asm__ ("shrn2 %0.4s,%1.2d,#%2" \ + : "+w"(result) \ + : "w"(b_), "i"(c) \ +@@ -16289,7 +14341,7 @@ + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vsubhn_high_s16 (int8x8_t a, int16x8_t b, int16x8_t c) + { +- int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.16b, %1.8h, %2.8h" + : "+w"(result) + : "w"(b), "w"(c) +@@ -16300,7 +14352,7 @@ + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vsubhn_high_s32 (int16x4_t a, int32x4_t b, int32x4_t c) + { +- int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0))); ++ int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.8h, %1.4s, %2.4s" + : "+w"(result) + : "w"(b), "w"(c) +@@ -16311,7 +14363,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vsubhn_high_s64 (int32x2_t a, int64x2_t b, int64x2_t c) + { +- int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0))); ++ int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.4s, %1.2d, %2.2d" + : "+w"(result) + : "w"(b), "w"(c) +@@ -16322,7 +14374,7 @@ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vsubhn_high_u16 (uint8x8_t a, uint16x8_t b, uint16x8_t c) + { +- uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.16b, %1.8h, %2.8h" + : "+w"(result) + : "w"(b), "w"(c) +@@ -16333,7 +14385,7 @@ + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vsubhn_high_u32 (uint16x4_t a, uint32x4_t b, uint32x4_t c) + { +- uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0))); ++ uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.8h, %1.4s, %2.4s" + : "+w"(result) + : "w"(b), "w"(c) +@@ -16344,7 +14396,7 @@ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vsubhn_high_u64 (uint32x2_t a, uint64x2_t b, uint64x2_t c) + { +- uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0))); ++ uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0))); + __asm__ ("subhn2 %0.4s, %1.2d, %2.2d" + : "+w"(result) + : "w"(b), "w"(c) +@@ -18309,86 +16361,6 @@ + return result; + } + +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vaddv_s32 (int32x2_t a) +-{ +- int32_t result; +- __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vaddv_u32 (uint32x2_t a) +-{ +- uint32_t result; +- __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vmaxnmv_f32 (float32x2_t a) +-{ +- float32_t result; +- __asm__ ("fmaxnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +-vminnmv_f32 (float32x2_t a) +-{ +- float32_t result; +- __asm__ ("fminnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vmaxnmvq_f64 (float64x2_t a) +-{ +- float64_t result; +- __asm__ ("fmaxnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vmaxv_s32 (int32x2_t a) +-{ +- int32_t result; +- __asm__ ("smaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vmaxv_u32 (uint32x2_t a) +-{ +- uint32_t result; +- __asm__ ("umaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +-vminnmvq_f64 (float64x2_t a) +-{ +- float64_t result; +- __asm__ ("fminnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline int32_t __attribute__ ((__always_inline__)) +-vminv_s32 (int32x2_t a) +-{ +- int32_t result; +- __asm__ ("sminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- +-__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) +-vminv_u32 (uint32x2_t a) +-{ +- uint32_t result; +- __asm__ ("uminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : ); +- return result; +-} +- + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vpaddd_s64 (int64x2_t __a) + { +@@ -19022,7 +16994,7 @@ + vtbl1_s8 (int8x8_t tab, int8x8_t idx) + { + int8x8_t result; +- int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("tbl %0.8b, {%1.16b}, %2.8b" + : "=w"(result) + : "w"(temp), "w"(idx) +@@ -19034,7 +17006,7 @@ + vtbl1_u8 (uint8x8_t tab, uint8x8_t idx) + { + uint8x8_t result; +- uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("tbl %0.8b, {%1.16b}, %2.8b" + : "=w"(result) + : "w"(temp), "w"(idx) +@@ -19046,7 +17018,7 @@ + vtbl1_p8 (poly8x8_t tab, uint8x8_t idx) + { + poly8x8_t result; +- poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (UINT64_C (0x0))); ++ poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("tbl %0.8b, {%1.16b}, %2.8b" + : "=w"(result) + : "w"(temp), "w"(idx) +@@ -19096,7 +17068,7 @@ + int8x8_t result; + int8x16x2_t temp; + temp.val[0] = vcombine_s8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t" + "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t" + : "=w"(result) +@@ -19111,7 +17083,7 @@ + uint8x8_t result; + uint8x16x2_t temp; + temp.val[0] = vcombine_u8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t" + "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t" + : "=w"(result) +@@ -19126,7 +17098,7 @@ + poly8x8_t result; + poly8x16x2_t temp; + temp.val[0] = vcombine_p8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t" + "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t" + : "=w"(result) +@@ -19185,7 +17157,7 @@ + { + int8x8_t result; + int8x8_t tmp1; +- int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (UINT64_C (0x0))); ++ int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("movi %0.8b, 8\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" + "tbl %1.8b, {%2.16b}, %3.8b\n\t" +@@ -19201,7 +17173,7 @@ + { + uint8x8_t result; + uint8x8_t tmp1; +- uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (UINT64_C (0x0))); ++ uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("movi %0.8b, 8\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" + "tbl %1.8b, {%2.16b}, %3.8b\n\t" +@@ -19217,7 +17189,7 @@ + { + poly8x8_t result; + poly8x8_t tmp1; +- poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (UINT64_C (0x0))); ++ poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("movi %0.8b, 8\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" + "tbl %1.8b, {%2.16b}, %3.8b\n\t" +@@ -19271,7 +17243,7 @@ + int8x8_t tmp1; + int8x16x2_t temp; + temp.val[0] = vcombine_s8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t" + "movi %0.8b, 24\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" +@@ -19290,7 +17262,7 @@ + uint8x8_t tmp1; + uint8x16x2_t temp; + temp.val[0] = vcombine_u8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t" + "movi %0.8b, 24\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" +@@ -19309,7 +17281,7 @@ + poly8x8_t tmp1; + poly8x16x2_t temp; + temp.val[0] = vcombine_p8 (tab.val[0], tab.val[1]); +- temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (UINT64_C (0x0))); ++ temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (__AARCH64_UINT64_C (0x0))); + __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t" + "movi %0.8b, 24\n\t" + "cmhs %0.8b, %3.8b, %0.8b\n\t" +@@ -19370,6 +17342,80 @@ + + /* Start of optimal implementations in approved order. */ + ++/* vabs */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vabs_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_absv2sf (__a); ++} ++ ++__extension__ static __inline float64x1_t __attribute__ ((__always_inline__)) ++vabs_f64 (float64x1_t __a) ++{ ++ return __builtin_fabs (__a); ++} ++ ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vabs_s8 (int8x8_t __a) ++{ ++ return __builtin_aarch64_absv8qi (__a); ++} ++ ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vabs_s16 (int16x4_t __a) ++{ ++ return __builtin_aarch64_absv4hi (__a); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vabs_s32 (int32x2_t __a) ++{ ++ return __builtin_aarch64_absv2si (__a); ++} ++ ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vabs_s64 (int64x1_t __a) ++{ ++ return __builtin_llabs (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vabsq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_absv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vabsq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_absv2df (__a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vabsq_s8 (int8x16_t __a) ++{ ++ return __builtin_aarch64_absv16qi (__a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vabsq_s16 (int16x8_t __a) ++{ ++ return __builtin_aarch64_absv8hi (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vabsq_s32 (int32x4_t __a) ++{ ++ return __builtin_aarch64_absv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vabsq_s64 (int64x2_t __a) ++{ ++ return __builtin_aarch64_absv2di (__a); ++} ++ + /* vadd */ + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +@@ -19384,8 +17430,269 @@ + return __a + __b; + } + +-/* vceq */ ++/* vaddv */ + ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vaddv_s8 (int8x8_t __a) ++{ ++ return vget_lane_s8 (__builtin_aarch64_reduc_splus_v8qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vaddv_s16 (int16x4_t __a) ++{ ++ return vget_lane_s16 (__builtin_aarch64_reduc_splus_v4hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vaddv_s32 (int32x2_t __a) ++{ ++ return vget_lane_s32 (__builtin_aarch64_reduc_splus_v2si (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vaddv_u8 (uint8x8_t __a) ++{ ++ return vget_lane_u8 ((uint8x8_t) ++ __builtin_aarch64_reduc_uplus_v8qi ((int8x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vaddv_u16 (uint16x4_t __a) ++{ ++ return vget_lane_u16 ((uint16x4_t) ++ __builtin_aarch64_reduc_uplus_v4hi ((int16x4_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vaddv_u32 (uint32x2_t __a) ++{ ++ return vget_lane_u32 ((uint32x2_t) ++ __builtin_aarch64_reduc_uplus_v2si ((int32x2_t) __a), 0); ++} ++ ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vaddvq_s8 (int8x16_t __a) ++{ ++ return vgetq_lane_s8 (__builtin_aarch64_reduc_splus_v16qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vaddvq_s16 (int16x8_t __a) ++{ ++ return vgetq_lane_s16 (__builtin_aarch64_reduc_splus_v8hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vaddvq_s32 (int32x4_t __a) ++{ ++ return vgetq_lane_s32 (__builtin_aarch64_reduc_splus_v4si (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vaddvq_s64 (int64x2_t __a) ++{ ++ return vgetq_lane_s64 (__builtin_aarch64_reduc_splus_v2di (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vaddvq_u8 (uint8x16_t __a) ++{ ++ return vgetq_lane_u8 ((uint8x16_t) ++ __builtin_aarch64_reduc_uplus_v16qi ((int8x16_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vaddvq_u16 (uint16x8_t __a) ++{ ++ return vgetq_lane_u16 ((uint16x8_t) ++ __builtin_aarch64_reduc_uplus_v8hi ((int16x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vaddvq_u32 (uint32x4_t __a) ++{ ++ return vgetq_lane_u32 ((uint32x4_t) ++ __builtin_aarch64_reduc_uplus_v4si ((int32x4_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vaddvq_u64 (uint64x2_t __a) ++{ ++ return vgetq_lane_u64 ((uint64x2_t) ++ __builtin_aarch64_reduc_uplus_v2di ((int64x2_t) __a), 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vaddv_f32 (float32x2_t __a) ++{ ++ float32x2_t t = __builtin_aarch64_reduc_splus_v2sf (__a); ++ return vget_lane_f32 (t, 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vaddvq_f32 (float32x4_t __a) ++{ ++ float32x4_t t = __builtin_aarch64_reduc_splus_v4sf (__a); ++ return vgetq_lane_f32 (t, 0); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vaddvq_f64 (float64x2_t __a) ++{ ++ float64x2_t t = __builtin_aarch64_reduc_splus_v2df (__a); ++ return vgetq_lane_f64 (t, 0); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++ ++/* vaes */ ++ ++static __inline uint8x16_t ++vaeseq_u8 (uint8x16_t data, uint8x16_t key) ++{ ++ return __builtin_aarch64_crypto_aesev16qi_uuu (data, key); ++} ++ ++static __inline uint8x16_t ++__attribute__ ((__always_inline__)) ++vaesdq_u8 (uint8x16_t data, uint8x16_t key) ++{ ++ return __builtin_aarch64_crypto_aesdv16qi_uuu (data, key); ++} ++ ++static __inline uint8x16_t ++vaesmcq_u8 (uint8x16_t data) ++{ ++ return __builtin_aarch64_crypto_aesmcv16qi_uu (data); ++} ++ ++static __inline uint8x16_t ++vaesimcq_u8 (uint8x16_t data) ++{ ++ return __builtin_aarch64_crypto_aesimcv16qi_uu (data); ++} ++ ++#endif ++ ++/* vcage */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcages_f32 (float32_t __a, float32_t __b) ++{ ++ return __builtin_fabsf (__a) >= __builtin_fabsf (__b) ? -1 : 0; ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcage_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return vabs_f32 (__a) >= vabs_f32 (__b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcageq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return vabsq_f32 (__a) >= vabsq_f32 (__b); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcaged_f64 (float64_t __a, float64_t __b) ++{ ++ return __builtin_fabs (__a) >= __builtin_fabs (__b) ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcageq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return vabsq_f64 (__a) >= vabsq_f64 (__b); ++} ++ ++/* vcagt */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcagts_f32 (float32_t __a, float32_t __b) ++{ ++ return __builtin_fabsf (__a) > __builtin_fabsf (__b) ? -1 : 0; ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcagt_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return vabs_f32 (__a) > vabs_f32 (__b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcagtq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return vabsq_f32 (__a) > vabsq_f32 (__b); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcagtd_f64 (float64_t __a, float64_t __b) ++{ ++ return __builtin_fabs (__a) > __builtin_fabs (__b) ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcagtq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return vabsq_f64 (__a) > vabsq_f64 (__b); ++} ++ ++/* vcale */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcale_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return vabs_f32 (__a) <= vabs_f32 (__b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcaleq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return vabsq_f32 (__a) <= vabsq_f32 (__b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcaleq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return vabsq_f64 (__a) <= vabsq_f64 (__b); ++} ++ ++/* vcalt */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcalt_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return vabs_f32 (__a) < vabs_f32 (__b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcaltq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return vabsq_f32 (__a) < vabsq_f32 (__b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcaltq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return vabsq_f64 (__a) < vabsq_f64 (__b); ++} ++ ++/* vceq - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vceq_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceq_f64 (float64x1_t __a, float64x1_t __b) ++{ ++ return __a == __b ? -1ll : 0ll; ++} ++ + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vceq_p8 (poly8x8_t __a, poly8x8_t __b) + { +@@ -19414,7 +17721,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vceq_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b); ++ return __a == __b ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -19441,10 +17748,21 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vceq_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmeqdi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return __a == __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vceqq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vceqq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b); ++} ++ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vceqq_p8 (poly8x16_t __a, poly8x16_t __b) + { +@@ -19504,27 +17822,245 @@ + (int64x2_t) __b); + } + ++/* vceq - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vceqs_f32 (float32_t __a, float32_t __b) ++{ ++ return __a == __b ? -1 : 0; ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vceqd_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b); ++ return __a == __b ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vceqd_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b); ++ return __a == __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vceqd_f64 (float64_t __a, float64_t __b) ++{ ++ return __a == __b ? -1ll : 0ll; ++} ++ ++/* vceqz - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vceqz_f32 (float32x2_t __a) ++{ ++ float32x2_t __b = {0.0f, 0.0f}; ++ return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b); ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceqz_f64 (float64x1_t __a) ++{ ++ return __a == 0.0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vceqz_p8 (poly8x8_t __a) ++{ ++ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vceqz_s8 (int8x8_t __a) ++{ ++ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmeqv8qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vceqz_s16 (int16x4_t __a) ++{ ++ int16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmeqv4hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vceqz_s32 (int32x2_t __a) ++{ ++ int32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmeqv2si (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceqz_s64 (int64x1_t __a) ++{ ++ return __a == 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vceqz_u8 (uint8x8_t __a) ++{ ++ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vceqz_u16 (uint16x4_t __a) ++{ ++ uint16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmeqv4hi ((int16x4_t) __a, ++ (int16x4_t) __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vceqz_u32 (uint32x2_t __a) ++{ ++ uint32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmeqv2si ((int32x2_t) __a, ++ (int32x2_t) __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceqz_u64 (uint64x1_t __a) ++{ ++ return __a == 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vceqzq_f32 (float32x4_t __a) ++{ ++ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f}; ++ return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vceqzq_f64 (float64x2_t __a) ++{ ++ float64x2_t __b = {0.0, 0.0}; ++ return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vceqzq_p8 (poly8x16_t __a) ++{ ++ poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmeqv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vceqzq_s8 (int8x16_t __a) ++{ ++ int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmeqv16qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vceqzq_s16 (int16x8_t __a) ++{ ++ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmeqv8hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vceqzq_s32 (int32x4_t __a) ++{ ++ int32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmeqv4si (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vceqzq_s64 (int64x2_t __a) ++{ ++ int64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmeqv2di (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vceqzq_u8 (uint8x16_t __a) ++{ ++ uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmeqv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vceqzq_u16 (uint16x8_t __a) ++{ ++ uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmeqv8hi ((int16x8_t) __a, ++ (int16x8_t) __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vceqzq_u32 (uint32x4_t __a) ++{ ++ uint32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmeqv4si ((int32x4_t) __a, ++ (int32x4_t) __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vceqzq_u64 (uint64x2_t __a) ++{ ++ uint64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmeqv2di ((int64x2_t) __a, ++ (int64x2_t) __b); ++} ++ ++/* vceqz - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vceqzs_f32 (float32_t __a) ++{ ++ return __a == 0.0f ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vceqzd_s64 (int64x1_t __a) + { +- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, 0); ++ return __a == 0 ? -1ll : 0ll; + } + +-/* vcge */ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceqzd_u64 (int64x1_t __a) ++{ ++ return __a == 0 ? -1ll : 0ll; ++} + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vceqzd_f64 (float64_t __a) ++{ ++ return __a == 0.0 ? -1ll : 0ll; ++} ++ ++/* vcge - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcge_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcge_f64 (float64x1_t __a, float64x1_t __b) ++{ ++ return __a >= __b ? -1ll : 0ll; ++} ++ + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcge_p8 (poly8x8_t __a, poly8x8_t __b) ++{ ++ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vcge_s8 (int8x8_t __a, int8x8_t __b) + { + return (uint8x8_t) __builtin_aarch64_cmgev8qi (__a, __b); +@@ -19545,7 +18081,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcge_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b); ++ return __a >= __b ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -19572,11 +18108,29 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcge_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgeudi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return __a >= __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgeq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgeq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b); ++} ++ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgeq_p8 (poly8x16_t __a, poly8x16_t __b) ++{ ++ return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vcgeq_s8 (int8x16_t __a, int8x16_t __b) + { + return (uint8x16_t) __builtin_aarch64_cmgev16qi (__a, __b); +@@ -19628,28 +18182,245 @@ + (int64x2_t) __b); + } + ++/* vcge - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcges_f32 (float32_t __a, float32_t __b) ++{ ++ return __a >= __b ? -1 : 0; ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcged_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b); ++ return __a >= __b ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcged_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgeudi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return __a >= __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcged_f64 (float64_t __a, float64_t __b) ++{ ++ return __a >= __b ? -1ll : 0ll; ++} ++ ++/* vcgez - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgez_f32 (float32x2_t __a) ++{ ++ float32x2_t __b = {0.0f, 0.0f}; ++ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b); ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgez_f64 (float64x1_t __a) ++{ ++ return __a >= 0.0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgez_p8 (poly8x8_t __a) ++{ ++ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgez_s8 (int8x8_t __a) ++{ ++ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgev8qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vcgez_s16 (int16x4_t __a) ++{ ++ int16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmgev4hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgez_s32 (int32x2_t __a) ++{ ++ int32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmgev2si (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgez_s64 (int64x1_t __a) ++{ ++ return __a >= 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgez_u8 (uint8x8_t __a) ++{ ++ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vcgez_u16 (uint16x4_t __a) ++{ ++ uint16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __a, ++ (int16x4_t) __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgez_u32 (uint32x2_t __a) ++{ ++ uint32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __a, ++ (int32x2_t) __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgez_u64 (uint64x1_t __a) ++{ ++ return __a >= 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgezq_f32 (float32x4_t __a) ++{ ++ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f}; ++ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgezq_f64 (float64x2_t __a) ++{ ++ float64x2_t __b = {0.0, 0.0}; ++ return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgezq_p8 (poly8x16_t __a) ++{ ++ poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgezq_s8 (int8x16_t __a) ++{ ++ int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgev16qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vcgezq_s16 (int16x8_t __a) ++{ ++ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmgev8hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgezq_s32 (int32x4_t __a) ++{ ++ int32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmgev4si (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgezq_s64 (int64x2_t __a) ++{ ++ int64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmgev2di (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgezq_u8 (uint8x16_t __a) ++{ ++ uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vcgezq_u16 (uint16x8_t __a) ++{ ++ uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __a, ++ (int16x8_t) __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgezq_u32 (uint32x4_t __a) ++{ ++ uint32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __a, ++ (int32x4_t) __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgezq_u64 (uint64x2_t __a) ++{ ++ uint64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __a, ++ (int64x2_t) __b); ++} ++ ++/* vcgez - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcgezs_f32 (float32_t __a) ++{ ++ return __a >= 0.0f ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgezd_s64 (int64x1_t __a) + { +- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, 0); ++ return __a >= 0 ? -1ll : 0ll; + } + +-/* vcgt */ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgezd_u64 (int64x1_t __a) ++{ ++ return __a >= 0 ? -1ll : 0ll; ++} + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcgezd_f64 (float64_t __a) ++{ ++ return __a >= 0.0 ? -1ll : 0ll; ++} ++ ++/* vcgt - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgt_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgt_f64 (float64x1_t __a, float64x1_t __b) ++{ ++ return __a > __b ? -1ll : 0ll; ++} ++ + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgt_p8 (poly8x8_t __a, poly8x8_t __b) ++{ ++ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vcgt_s8 (int8x8_t __a, int8x8_t __b) + { + return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__a, __b); +@@ -19670,7 +18441,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgt_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b); ++ return __a > __b ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -19697,11 +18468,29 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgt_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtudi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return __a > __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgtq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgtq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b); ++} ++ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgtq_p8 (poly8x16_t __a, poly8x16_t __b) ++{ ++ return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vcgtq_s8 (int8x16_t __a, int8x16_t __b) + { + return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__a, __b); +@@ -19753,28 +18542,245 @@ + (int64x2_t) __b); + } + ++/* vcgt - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcgts_f32 (float32_t __a, float32_t __b) ++{ ++ return __a > __b ? -1 : 0; ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgtd_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b); ++ return __a > __b ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgtd_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtudi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return __a > __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcgtd_f64 (float64_t __a, float64_t __b) ++{ ++ return __a > __b ? -1ll : 0ll; ++} ++ ++/* vcgtz - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgtz_f32 (float32x2_t __a) ++{ ++ float32x2_t __b = {0.0f, 0.0f}; ++ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b); ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgtz_f64 (float64x1_t __a) ++{ ++ return __a > 0.0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgtz_p8 (poly8x8_t __a) ++{ ++ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgtz_s8 (int8x8_t __a) ++{ ++ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vcgtz_s16 (int16x4_t __a) ++{ ++ int16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmgtv4hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgtz_s32 (int32x2_t __a) ++{ ++ int32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmgtv2si (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgtz_s64 (int64x1_t __a) ++{ ++ return __a > 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcgtz_u8 (uint8x8_t __a) ++{ ++ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vcgtz_u16 (uint16x4_t __a) ++{ ++ uint16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __a, ++ (int16x4_t) __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcgtz_u32 (uint32x2_t __a) ++{ ++ uint32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __a, ++ (int32x2_t) __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgtz_u64 (uint64x1_t __a) ++{ ++ return __a > 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgtzq_f32 (float32x4_t __a) ++{ ++ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f}; ++ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgtzq_f64 (float64x2_t __a) ++{ ++ float64x2_t __b = {0.0, 0.0}; ++ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgtzq_p8 (poly8x16_t __a) ++{ ++ poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgtzq_s8 (int8x16_t __a) ++{ ++ int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vcgtzq_s16 (int16x8_t __a) ++{ ++ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmgtv8hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgtzq_s32 (int32x4_t __a) ++{ ++ int32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmgtv4si (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgtzq_s64 (int64x2_t __a) ++{ ++ int64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmgtv2di (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcgtzq_u8 (uint8x16_t __a) ++{ ++ uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vcgtzq_u16 (uint16x8_t __a) ++{ ++ uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __a, ++ (int16x8_t) __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcgtzq_u32 (uint32x4_t __a) ++{ ++ uint32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __a, ++ (int32x4_t) __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcgtzq_u64 (uint64x2_t __a) ++{ ++ uint64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __a, ++ (int64x2_t) __b); ++} ++ ++/* vcgtz - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcgtzs_f32 (float32_t __a) ++{ ++ return __a > 0.0f ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcgtzd_s64 (int64x1_t __a) + { +- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, 0); ++ return __a > 0 ? -1ll : 0ll; + } + +-/* vcle */ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcgtzd_u64 (int64x1_t __a) ++{ ++ return __a > 0 ? -1ll : 0ll; ++} + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcgtzd_f64 (float64_t __a) ++{ ++ return __a > 0.0 ? -1ll : 0ll; ++} ++ ++/* vcle - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcle_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__b, __a); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcle_f64 (float64x1_t __a, float64x1_t __b) ++{ ++ return __a <= __b ? -1ll : 0ll; ++} ++ + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcle_p8 (poly8x8_t __a, poly8x8_t __b) ++{ ++ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __b, ++ (int8x8_t) __a); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vcle_s8 (int8x8_t __a, int8x8_t __b) + { + return (uint8x8_t) __builtin_aarch64_cmgev8qi (__b, __a); +@@ -19795,7 +18801,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcle_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a); ++ return __a <= __b ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -19822,11 +18828,29 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcle_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgeudi ((int64x1_t) __b, +- (int64x1_t) __a); ++ return __a <= __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcleq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__b, __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcleq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return (uint64x2_t) __builtin_aarch64_cmgev2df (__b, __a); ++} ++ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcleq_p8 (poly8x16_t __a, poly8x16_t __b) ++{ ++ return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __b, ++ (int8x16_t) __a); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vcleq_s8 (int8x16_t __a, int8x16_t __b) + { + return (uint8x16_t) __builtin_aarch64_cmgev16qi (__b, __a); +@@ -19878,21 +18902,188 @@ + (int64x2_t) __a); + } + ++/* vcle - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcles_f32 (float32_t __a, float32_t __b) ++{ ++ return __a <= __b ? -1 : 0; ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcled_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a); ++ return __a <= __b ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcled_u64 (uint64x1_t __a, uint64x1_t __b) ++{ ++ return __a <= __b ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcled_f64 (float64_t __a, float64_t __b) ++{ ++ return __a <= __b ? -1ll : 0ll; ++} ++ ++/* vclez - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vclez_f32 (float32x2_t __a) ++{ ++ float32x2_t __b = {0.0f, 0.0f}; ++ return (uint32x2_t) __builtin_aarch64_cmlev2sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vclez_f64 (float64x1_t __a) ++{ ++ return __a <= 0.0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vclez_p8 (poly8x8_t __a) ++{ ++ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmlev8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vclez_s8 (int8x8_t __a) ++{ ++ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmlev8qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vclez_s16 (int16x4_t __a) ++{ ++ int16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmlev4hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vclez_s32 (int32x2_t __a) ++{ ++ int32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmlev2si (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vclez_s64 (int64x1_t __a) ++{ ++ return __a <= 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vclez_u64 (uint64x1_t __a) ++{ ++ return __a <= 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vclezq_f32 (float32x4_t __a) ++{ ++ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f}; ++ return (uint32x4_t) __builtin_aarch64_cmlev4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vclezq_f64 (float64x2_t __a) ++{ ++ float64x2_t __b = {0.0, 0.0}; ++ return (uint64x2_t) __builtin_aarch64_cmlev2df (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vclezq_p8 (poly8x16_t __a) ++{ ++ poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmlev16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vclezq_s8 (int8x16_t __a) ++{ ++ int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmlev16qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vclezq_s16 (int16x8_t __a) ++{ ++ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmlev8hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vclezq_s32 (int32x4_t __a) ++{ ++ int32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmlev4si (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vclezq_s64 (int64x2_t __a) ++{ ++ int64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmlev2di (__a, __b); ++} ++ ++/* vclez - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vclezs_f32 (float32_t __a) ++{ ++ return __a <= 0.0f ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vclezd_s64 (int64x1_t __a) + { +- return (uint64x1_t) __builtin_aarch64_cmledi (__a, 0); ++ return __a <= 0 ? -1ll : 0ll; + } + +-/* vclt */ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vclezd_u64 (int64x1_t __a) ++{ ++ return __a <= 0 ? -1ll : 0ll; ++} + ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vclezd_f64 (float64_t __a) ++{ ++ return __a <= 0.0 ? -1ll : 0ll; ++} ++ ++/* vclt - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vclt_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__b, __a); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vclt_f64 (float64x1_t __a, float64x1_t __b) ++{ ++ return __a < __b ? -1ll : 0ll; ++} ++ + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vclt_p8 (poly8x8_t __a, poly8x8_t __b) ++{ ++ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __b, ++ (int8x8_t) __a); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vclt_s8 (int8x8_t __a, int8x8_t __b) + { + return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__b, __a); +@@ -19913,7 +19104,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vclt_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a); ++ return __a < __b ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -19940,11 +19131,29 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vclt_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtudi ((int64x1_t) __b, +- (int64x1_t) __a); ++ return __a < __b ? -1ll : 0ll; + } + ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcltq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__b, __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcltq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__b, __a); ++} ++ + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcltq_p8 (poly8x16_t __a, poly8x16_t __b) ++{ ++ return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __b, ++ (int8x16_t) __a); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vcltq_s8 (int8x16_t __a, int8x16_t __b) + { + return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__b, __a); +@@ -19996,66 +19205,639 @@ + (int64x2_t) __a); + } + ++/* vclt - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vclts_f32 (float32_t __a, float32_t __b) ++{ ++ return __a < __b ? -1 : 0; ++} ++ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcltd_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a); ++ return __a < __b ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcltd_u64 (uint64x1_t __a, uint64x1_t __b) ++{ ++ return __a < __b ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcltd_f64 (float64_t __a, float64_t __b) ++{ ++ return __a < __b ? -1ll : 0ll; ++} ++ ++/* vcltz - vector. */ ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcltz_f32 (float32x2_t __a) ++{ ++ float32x2_t __b = {0.0f, 0.0f}; ++ return (uint32x2_t) __builtin_aarch64_cmltv2sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcltz_f64 (float64x1_t __a) ++{ ++ return __a < 0.0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcltz_p8 (poly8x8_t __a) ++{ ++ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmltv8qi ((int8x8_t) __a, ++ (int8x8_t) __b); ++} ++ ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vcltz_s8 (int8x8_t __a) ++{ ++ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x8_t) __builtin_aarch64_cmltv8qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vcltz_s16 (int16x4_t __a) ++{ ++ int16x4_t __b = {0, 0, 0, 0}; ++ return (uint16x4_t) __builtin_aarch64_cmltv4hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcltz_s32 (int32x2_t __a) ++{ ++ int32x2_t __b = {0, 0}; ++ return (uint32x2_t) __builtin_aarch64_cmltv2si (__a, __b); ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcltz_s64 (int64x1_t __a) ++{ ++ return __a < 0ll ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcltzq_f32 (float32x4_t __a) ++{ ++ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f}; ++ return (uint32x4_t) __builtin_aarch64_cmltv4sf (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcltzq_f64 (float64x2_t __a) ++{ ++ float64x2_t __b = {0.0, 0.0}; ++ return (uint64x2_t) __builtin_aarch64_cmltv2df (__a, __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcltzq_p8 (poly8x16_t __a) ++{ ++ poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmltv16qi ((int8x16_t) __a, ++ (int8x16_t) __b); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vcltzq_s8 (int8x16_t __a) ++{ ++ int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint8x16_t) __builtin_aarch64_cmltv16qi (__a, __b); ++} ++ ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vcltzq_s16 (int16x8_t __a) ++{ ++ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0}; ++ return (uint16x8_t) __builtin_aarch64_cmltv8hi (__a, __b); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcltzq_s32 (int32x4_t __a) ++{ ++ int32x4_t __b = {0, 0, 0, 0}; ++ return (uint32x4_t) __builtin_aarch64_cmltv4si (__a, __b); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcltzq_s64 (int64x2_t __a) ++{ ++ int64x2_t __b = {0, 0}; ++ return (uint64x2_t) __builtin_aarch64_cmltv2di (__a, __b); ++} ++ ++/* vcltz - scalar. */ ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcltzs_f32 (float32_t __a) ++{ ++ return __a < 0.0f ? -1 : 0; ++} ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vcltzd_s64 (int64x1_t __a) + { +- return (uint64x1_t) __builtin_aarch64_cmltdi (__a, 0); ++ return __a < 0 ? -1ll : 0ll; + } + ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vcltzd_u64 (int64x1_t __a) ++{ ++ return __a < 0 ? -1ll : 0ll; ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcltzd_f64 (float64_t __a) ++{ ++ return __a < 0.0 ? -1ll : 0ll; ++} ++ ++/* vcvt (double -> float). */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vcvt_f32_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_float_truncate_lo_v2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vcvt_high_f32_f64 (float32x2_t __a, float64x2_t __b) ++{ ++ return __builtin_aarch64_float_truncate_hi_v4sf (__a, __b); ++} ++ ++/* vcvt (float -> double). */ ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vcvt_f64_f32 (float32x2_t __a) ++{ ++ ++ return __builtin_aarch64_float_extend_lo_v2df (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vcvt_high_f64_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_vec_unpacks_hi_v4sf (__a); ++} ++ ++/* vcvt (int -> float) */ ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vcvtd_f64_s64 (int64_t __a) ++{ ++ return (float64_t) __a; ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vcvtd_f64_u64 (uint64_t __a) ++{ ++ return (float64_t) __a; ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vcvts_f32_s32 (int32_t __a) ++{ ++ return (float32_t) __a; ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vcvts_f32_u32 (uint32_t __a) ++{ ++ return (float32_t) __a; ++} ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vcvt_f32_s32 (int32x2_t __a) ++{ ++ return __builtin_aarch64_floatv2siv2sf (__a); ++} ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vcvt_f32_u32 (uint32x2_t __a) ++{ ++ return __builtin_aarch64_floatunsv2siv2sf ((int32x2_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vcvtq_f32_s32 (int32x4_t __a) ++{ ++ return __builtin_aarch64_floatv4siv4sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vcvtq_f32_u32 (uint32x4_t __a) ++{ ++ return __builtin_aarch64_floatunsv4siv4sf ((int32x4_t) __a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vcvtq_f64_s64 (int64x2_t __a) ++{ ++ return __builtin_aarch64_floatv2div2df (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vcvtq_f64_u64 (uint64x2_t __a) ++{ ++ return __builtin_aarch64_floatunsv2div2df ((int64x2_t) __a); ++} ++ ++/* vcvt (float -> int) */ ++ ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vcvtd_s64_f64 (float64_t __a) ++{ ++ return (int64_t) __a; ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcvtd_u64_f64 (float64_t __a) ++{ ++ return (uint64_t) __a; ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vcvts_s32_f32 (float32_t __a) ++{ ++ return (int32_t) __a; ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcvts_u32_f32 (float32_t __a) ++{ ++ return (uint32_t) __a; ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vcvt_s32_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_lbtruncv2sfv2si (__a); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcvt_u32_f32 (float32x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x2_t) __builtin_aarch64_lbtruncuv2sfv2si (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vcvtq_s32_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_lbtruncv4sfv4si (__a); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcvtq_u32_f32 (float32x4_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x4_t) __builtin_aarch64_lbtruncuv4sfv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vcvtq_s64_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_lbtruncv2dfv2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcvtq_u64_f64 (float64x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint64x2_t) __builtin_aarch64_lbtruncuv2dfv2di (__a); ++} ++ ++/* vcvta */ ++ ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vcvtad_s64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lrounddfdi (__a); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcvtad_u64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lroundudfdi (__a); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vcvtas_s32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lroundsfsi (__a); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcvtas_u32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lroundusfsi (__a); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vcvta_s32_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_lroundv2sfv2si (__a); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcvta_u32_f32 (float32x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x2_t) __builtin_aarch64_lrounduv2sfv2si (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vcvtaq_s32_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_lroundv4sfv4si (__a); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcvtaq_u32_f32 (float32x4_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x4_t) __builtin_aarch64_lrounduv4sfv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vcvtaq_s64_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_lroundv2dfv2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcvtaq_u64_f64 (float64x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint64x2_t) __builtin_aarch64_lrounduv2dfv2di (__a); ++} ++ ++/* vcvtm */ ++ ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vcvtmd_s64_f64 (float64_t __a) ++{ ++ return __builtin_lfloor (__a); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcvtmd_u64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lfloorudfdi (__a); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vcvtms_s32_f32 (float32_t __a) ++{ ++ return __builtin_ifloorf (__a); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcvtms_u32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lfloorusfsi (__a); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vcvtm_s32_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_lfloorv2sfv2si (__a); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcvtm_u32_f32 (float32x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x2_t) __builtin_aarch64_lflooruv2sfv2si (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vcvtmq_s32_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_lfloorv4sfv4si (__a); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcvtmq_u32_f32 (float32x4_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x4_t) __builtin_aarch64_lflooruv4sfv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vcvtmq_s64_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_lfloorv2dfv2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcvtmq_u64_f64 (float64x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint64x2_t) __builtin_aarch64_lflooruv2dfv2di (__a); ++} ++ ++/* vcvtn */ ++ ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vcvtnd_s64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lfrintndfdi (__a); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcvtnd_u64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lfrintnudfdi (__a); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vcvtns_s32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lfrintnsfsi (__a); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcvtns_u32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lfrintnusfsi (__a); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vcvtn_s32_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_lfrintnv2sfv2si (__a); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcvtn_u32_f32 (float32x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x2_t) __builtin_aarch64_lfrintnuv2sfv2si (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vcvtnq_s32_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_lfrintnv4sfv4si (__a); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcvtnq_u32_f32 (float32x4_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x4_t) __builtin_aarch64_lfrintnuv4sfv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vcvtnq_s64_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_lfrintnv2dfv2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcvtnq_u64_f64 (float64x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint64x2_t) __builtin_aarch64_lfrintnuv2dfv2di (__a); ++} ++ ++/* vcvtp */ ++ ++__extension__ static __inline int64_t __attribute__ ((__always_inline__)) ++vcvtpd_s64_f64 (float64_t __a) ++{ ++ return __builtin_lceil (__a); ++} ++ ++__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) ++vcvtpd_u64_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_lceiludfdi (__a); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vcvtps_s32_f32 (float32_t __a) ++{ ++ return __builtin_iceilf (__a); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vcvtps_u32_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_lceilusfsi (__a); ++} ++ ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vcvtp_s32_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_lceilv2sfv2si (__a); ++} ++ ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vcvtp_u32_f32 (float32x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x2_t) __builtin_aarch64_lceiluv2sfv2si (__a); ++} ++ ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vcvtpq_s32_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_lceilv4sfv4si (__a); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vcvtpq_u32_f32 (float32x4_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint32x4_t) __builtin_aarch64_lceiluv4sfv4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vcvtpq_s64_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_lceilv2dfv2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vcvtpq_u64_f64 (float64x2_t __a) ++{ ++ /* TODO: This cast should go away when builtins have ++ their correct types. */ ++ return (uint64x2_t) __builtin_aarch64_lceiluv2dfv2di (__a); ++} ++ + /* vdup */ + + __extension__ static __inline int8x1_t __attribute__ ((__always_inline__)) + vdupb_lane_s8 (int8x16_t a, int const b) + { +- return __builtin_aarch64_dup_laneqi (a, b); ++ return __aarch64_vgetq_lane_s8 (a, b); + } + + __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__)) + vdupb_lane_u8 (uint8x16_t a, int const b) + { +- return (uint8x1_t) __builtin_aarch64_dup_laneqi ((int8x16_t) a, b); ++ return __aarch64_vgetq_lane_u8 (a, b); + } + + __extension__ static __inline int16x1_t __attribute__ ((__always_inline__)) + vduph_lane_s16 (int16x8_t a, int const b) + { +- return __builtin_aarch64_dup_lanehi (a, b); ++ return __aarch64_vgetq_lane_s16 (a, b); + } + + __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__)) + vduph_lane_u16 (uint16x8_t a, int const b) + { +- return (uint16x1_t) __builtin_aarch64_dup_lanehi ((int16x8_t) a, b); ++ return __aarch64_vgetq_lane_u16 (a, b); + } + + __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) + vdups_lane_s32 (int32x4_t a, int const b) + { +- return __builtin_aarch64_dup_lanesi (a, b); ++ return __aarch64_vgetq_lane_s32 (a, b); + } + + __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__)) + vdups_lane_u32 (uint32x4_t a, int const b) + { +- return (uint32x1_t) __builtin_aarch64_dup_lanesi ((int32x4_t) a, b); ++ return __aarch64_vgetq_lane_u32 (a, b); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vdupd_lane_s64 (int64x2_t a, int const b) + { +- return __builtin_aarch64_dup_lanedi (a, b); ++ return __aarch64_vgetq_lane_s64 (a, b); + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vdupd_lane_u64 (uint64x2_t a, int const b) + { +- return (uint64x1_t) __builtin_aarch64_dup_lanedi ((int64x2_t) a, b); ++ return __aarch64_vgetq_lane_u64 (a, b); + } + + /* vld1 */ +@@ -21088,7 +20870,7 @@ + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vmax_f32 (float32x2_t __a, float32x2_t __b) + { +- return __builtin_aarch64_fmaxv2sf (__a, __b); ++ return __builtin_aarch64_smax_nanv2sf (__a, __b); + } + + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +@@ -21133,13 +20915,13 @@ + __extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) + vmaxq_f32 (float32x4_t __a, float32x4_t __b) + { +- return __builtin_aarch64_fmaxv4sf (__a, __b); ++ return __builtin_aarch64_smax_nanv4sf (__a, __b); + } + + __extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) + vmaxq_f64 (float64x2_t __a, float64x2_t __b) + { +- return __builtin_aarch64_fmaxv2df (__a, __b); ++ return __builtin_aarch64_smax_nanv2df (__a, __b); + } + + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +@@ -21181,12 +20963,150 @@ + (int32x4_t) __b); + } + +-/* vmin */ ++/* vmaxnm */ + + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vmaxnm_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return __builtin_aarch64_smaxv2sf (__a, __b); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vmaxnmq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return __builtin_aarch64_smaxv4sf (__a, __b); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vmaxnmq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return __builtin_aarch64_smaxv2df (__a, __b); ++} ++ ++/* vmaxv */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vmaxv_f32 (float32x2_t __a) ++{ ++ return vget_lane_f32 (__builtin_aarch64_reduc_smax_nan_v2sf (__a), 0); ++} ++ ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vmaxv_s8 (int8x8_t __a) ++{ ++ return vget_lane_s8 (__builtin_aarch64_reduc_smax_v8qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vmaxv_s16 (int16x4_t __a) ++{ ++ return vget_lane_s16 (__builtin_aarch64_reduc_smax_v4hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vmaxv_s32 (int32x2_t __a) ++{ ++ return vget_lane_s32 (__builtin_aarch64_reduc_smax_v2si (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vmaxv_u8 (uint8x8_t __a) ++{ ++ return vget_lane_u8 ((uint8x8_t) ++ __builtin_aarch64_reduc_umax_v8qi ((int8x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vmaxv_u16 (uint16x4_t __a) ++{ ++ return vget_lane_u16 ((uint16x4_t) ++ __builtin_aarch64_reduc_umax_v4hi ((int16x4_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vmaxv_u32 (uint32x2_t __a) ++{ ++ return vget_lane_u32 ((uint32x2_t) ++ __builtin_aarch64_reduc_umax_v2si ((int32x2_t) __a), 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vmaxvq_f32 (float32x4_t __a) ++{ ++ return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_nan_v4sf (__a), 0); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vmaxvq_f64 (float64x2_t __a) ++{ ++ return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_nan_v2df (__a), 0); ++} ++ ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vmaxvq_s8 (int8x16_t __a) ++{ ++ return vgetq_lane_s8 (__builtin_aarch64_reduc_smax_v16qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vmaxvq_s16 (int16x8_t __a) ++{ ++ return vgetq_lane_s16 (__builtin_aarch64_reduc_smax_v8hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vmaxvq_s32 (int32x4_t __a) ++{ ++ return vgetq_lane_s32 (__builtin_aarch64_reduc_smax_v4si (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vmaxvq_u8 (uint8x16_t __a) ++{ ++ return vgetq_lane_u8 ((uint8x16_t) ++ __builtin_aarch64_reduc_umax_v16qi ((int8x16_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vmaxvq_u16 (uint16x8_t __a) ++{ ++ return vgetq_lane_u16 ((uint16x8_t) ++ __builtin_aarch64_reduc_umax_v8hi ((int16x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vmaxvq_u32 (uint32x4_t __a) ++{ ++ return vgetq_lane_u32 ((uint32x4_t) ++ __builtin_aarch64_reduc_umax_v4si ((int32x4_t) __a), 0); ++} ++ ++/* vmaxnmv */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vmaxnmv_f32 (float32x2_t __a) ++{ ++ return vget_lane_f32 (__builtin_aarch64_reduc_smax_v2sf (__a), 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vmaxnmvq_f32 (float32x4_t __a) ++{ ++ return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_v4sf (__a), 0); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vmaxnmvq_f64 (float64x2_t __a) ++{ ++ return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_v2df (__a), 0); ++} ++ ++/* vmin */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vmin_f32 (float32x2_t __a, float32x2_t __b) + { +- return __builtin_aarch64_fminv2sf (__a, __b); ++ return __builtin_aarch64_smin_nanv2sf (__a, __b); + } + + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +@@ -21231,13 +21151,13 @@ + __extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) + vminq_f32 (float32x4_t __a, float32x4_t __b) + { +- return __builtin_aarch64_fminv4sf (__a, __b); ++ return __builtin_aarch64_smin_nanv4sf (__a, __b); + } + + __extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) + vminq_f64 (float64x2_t __a, float64x2_t __b) + { +- return __builtin_aarch64_fminv2df (__a, __b); ++ return __builtin_aarch64_smin_nanv2df (__a, __b); + } + + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +@@ -21279,6 +21199,144 @@ + (int32x4_t) __b); + } + ++/* vminnm */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vminnm_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return __builtin_aarch64_sminv2sf (__a, __b); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vminnmq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return __builtin_aarch64_sminv4sf (__a, __b); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vminnmq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return __builtin_aarch64_sminv2df (__a, __b); ++} ++ ++/* vminv */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vminv_f32 (float32x2_t __a) ++{ ++ return vget_lane_f32 (__builtin_aarch64_reduc_smin_nan_v2sf (__a), 0); ++} ++ ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vminv_s8 (int8x8_t __a) ++{ ++ return vget_lane_s8 (__builtin_aarch64_reduc_smin_v8qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vminv_s16 (int16x4_t __a) ++{ ++ return vget_lane_s16 (__builtin_aarch64_reduc_smin_v4hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vminv_s32 (int32x2_t __a) ++{ ++ return vget_lane_s32 (__builtin_aarch64_reduc_smin_v2si (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vminv_u8 (uint8x8_t __a) ++{ ++ return vget_lane_u8 ((uint8x8_t) ++ __builtin_aarch64_reduc_umin_v8qi ((int8x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vminv_u16 (uint16x4_t __a) ++{ ++ return vget_lane_u16 ((uint16x4_t) ++ __builtin_aarch64_reduc_umin_v4hi ((int16x4_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vminv_u32 (uint32x2_t __a) ++{ ++ return vget_lane_u32 ((uint32x2_t) ++ __builtin_aarch64_reduc_umin_v2si ((int32x2_t) __a), 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vminvq_f32 (float32x4_t __a) ++{ ++ return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_nan_v4sf (__a), 0); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vminvq_f64 (float64x2_t __a) ++{ ++ return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_nan_v2df (__a), 0); ++} ++ ++__extension__ static __inline int8_t __attribute__ ((__always_inline__)) ++vminvq_s8 (int8x16_t __a) ++{ ++ return vgetq_lane_s8 (__builtin_aarch64_reduc_smin_v16qi (__a), 0); ++} ++ ++__extension__ static __inline int16_t __attribute__ ((__always_inline__)) ++vminvq_s16 (int16x8_t __a) ++{ ++ return vgetq_lane_s16 (__builtin_aarch64_reduc_smin_v8hi (__a), 0); ++} ++ ++__extension__ static __inline int32_t __attribute__ ((__always_inline__)) ++vminvq_s32 (int32x4_t __a) ++{ ++ return vgetq_lane_s32 (__builtin_aarch64_reduc_smin_v4si (__a), 0); ++} ++ ++__extension__ static __inline uint8_t __attribute__ ((__always_inline__)) ++vminvq_u8 (uint8x16_t __a) ++{ ++ return vgetq_lane_u8 ((uint8x16_t) ++ __builtin_aarch64_reduc_umin_v16qi ((int8x16_t) __a), 0); ++} ++ ++__extension__ static __inline uint16_t __attribute__ ((__always_inline__)) ++vminvq_u16 (uint16x8_t __a) ++{ ++ return vgetq_lane_u16 ((uint16x8_t) ++ __builtin_aarch64_reduc_umin_v8hi ((int16x8_t) __a), 0); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vminvq_u32 (uint32x4_t __a) ++{ ++ return vgetq_lane_u32 ((uint32x4_t) ++ __builtin_aarch64_reduc_umin_v4si ((int32x4_t) __a), 0); ++} ++ ++/* vminnmv */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vminnmv_f32 (float32x2_t __a) ++{ ++ return vget_lane_f32 (__builtin_aarch64_reduc_smin_v2sf (__a), 0); ++} ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vminnmvq_f32 (float32x4_t __a) ++{ ++ return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_v4sf (__a), 0); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vminnmvq_f64 (float64x2_t __a) ++{ ++ return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_v2df (__a), 0); ++} ++ + /* vmla */ + + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +@@ -21430,7 +21488,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vqdmlal_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d) + { +- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (INT64_C (0))); ++ int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __tmp, __d); + } + +@@ -21481,7 +21539,7 @@ + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vqdmlal_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d) + { +- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (INT64_C (0))); ++ int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __tmp, __d); + } + +@@ -21558,7 +21616,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vqdmlsl_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d) + { +- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (INT64_C (0))); ++ int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __tmp, __d); + } + +@@ -21609,7 +21667,7 @@ + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vqdmlsl_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d) + { +- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (INT64_C (0))); ++ int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __tmp, __d); + } + +@@ -21734,7 +21792,7 @@ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vqdmull_lane_s16 (int16x4_t __a, int16x4_t __b, int const __c) + { +- int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (INT64_C (0))); ++ int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmull_lanev4hi (__a, __tmp, __c); + } + +@@ -21783,7 +21841,7 @@ + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vqdmull_lane_s32 (int32x2_t __a, int32x2_t __b, int const __c) + { +- int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (INT64_C (0))); ++ int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (__AARCH64_INT64_C (0))); + return __builtin_aarch64_sqdmull_lanev2si (__a, __tmp, __c); + } + +@@ -22795,6 +22853,223 @@ + return (uint64x1_t) __builtin_aarch64_uqsubdi (__a, __b); + } + ++/* vrecpe */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vrecpes_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_frecpesf (__a); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vrecped_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_frecpedf (__a); ++} ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrecpe_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_frecpev2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrecpeq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_frecpev4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrecpeq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_frecpev2df (__a); ++} ++ ++/* vrecps */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vrecpss_f32 (float32_t __a, float32_t __b) ++{ ++ return __builtin_aarch64_frecpssf (__a, __b); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vrecpsd_f64 (float64_t __a, float64_t __b) ++{ ++ return __builtin_aarch64_frecpsdf (__a, __b); ++} ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrecps_f32 (float32x2_t __a, float32x2_t __b) ++{ ++ return __builtin_aarch64_frecpsv2sf (__a, __b); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrecpsq_f32 (float32x4_t __a, float32x4_t __b) ++{ ++ return __builtin_aarch64_frecpsv4sf (__a, __b); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrecpsq_f64 (float64x2_t __a, float64x2_t __b) ++{ ++ return __builtin_aarch64_frecpsv2df (__a, __b); ++} ++ ++/* vrecpx */ ++ ++__extension__ static __inline float32_t __attribute__ ((__always_inline__)) ++vrecpxs_f32 (float32_t __a) ++{ ++ return __builtin_aarch64_frecpxsf (__a); ++} ++ ++__extension__ static __inline float64_t __attribute__ ((__always_inline__)) ++vrecpxd_f64 (float64_t __a) ++{ ++ return __builtin_aarch64_frecpxdf (__a); ++} ++ ++/* vrnd */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrnd_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_btruncv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_btruncv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_btruncv2df (__a); ++} ++ ++/* vrnda */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrnda_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_roundv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndaq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_roundv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndaq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_roundv2df (__a); ++} ++ ++/* vrndi */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrndi_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_nearbyintv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndiq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_nearbyintv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndiq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_nearbyintv2df (__a); ++} ++ ++/* vrndm */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrndm_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_floorv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndmq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_floorv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndmq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_floorv2df (__a); ++} ++ ++/* vrndn */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrndn_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_frintnv2sf (__a); ++} ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndnq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_frintnv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndnq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_frintnv2df (__a); ++} ++ ++/* vrndp */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrndp_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_ceilv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndpq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_ceilv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndpq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_ceilv2df (__a); ++} ++ ++/* vrndx */ ++ ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vrndx_f32 (float32x2_t __a) ++{ ++ return __builtin_aarch64_rintv2sf (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vrndxq_f32 (float32x4_t __a) ++{ ++ return __builtin_aarch64_rintv4sf (__a); ++} ++ ++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__)) ++vrndxq_f64 (float64x2_t __a) ++{ ++ return __builtin_aarch64_rintv2df (__a); ++} ++ + /* vrshl */ + + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +@@ -23133,114 +23408,191 @@ + return (uint64x1_t) __builtin_aarch64_ursra_ndi (__a, __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++ ++/* vsha1 */ ++ ++static __inline uint32x4_t ++vsha1cq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return __builtin_aarch64_crypto_sha1cv4si_uuuu (hash_abcd, hash_e, wk); ++} ++static __inline uint32x4_t ++vsha1mq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return __builtin_aarch64_crypto_sha1mv4si_uuuu (hash_abcd, hash_e, wk); ++} ++static __inline uint32x4_t ++vsha1pq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk) ++{ ++ return __builtin_aarch64_crypto_sha1pv4si_uuuu (hash_abcd, hash_e, wk); ++} ++ ++static __inline uint32_t ++vsha1h_u32 (uint32_t hash_e) ++{ ++ return __builtin_aarch64_crypto_sha1hsi_uu (hash_e); ++} ++ ++static __inline uint32x4_t ++vsha1su0q_u32 (uint32x4_t w0_3, uint32x4_t w4_7, uint32x4_t w8_11) ++{ ++ return __builtin_aarch64_crypto_sha1su0v4si_uuuu (w0_3, w4_7, w8_11); ++} ++ ++static __inline uint32x4_t ++vsha1su1q_u32 (uint32x4_t tw0_3, uint32x4_t w12_15) ++{ ++ return __builtin_aarch64_crypto_sha1su1v4si_uuu (tw0_3, w12_15); ++} ++ ++static __inline uint32x4_t ++vsha256hq_u32 (uint32x4_t hash_abcd, uint32x4_t hash_efgh, uint32x4_t wk) ++{ ++ return __builtin_aarch64_crypto_sha256hv4si_uuuu (hash_abcd, hash_efgh, wk); ++} ++ ++static __inline uint32x4_t ++vsha256h2q_u32 (uint32x4_t hash_efgh, uint32x4_t hash_abcd, uint32x4_t wk) ++{ ++ return __builtin_aarch64_crypto_sha256h2v4si_uuuu (hash_efgh, hash_abcd, wk); ++} ++ ++static __inline uint32x4_t ++vsha256su0q_u32 (uint32x4_t w0_3, uint32x4_t w4_7) ++{ ++ return __builtin_aarch64_crypto_sha256su0v4si_uuu (w0_3, w4_7); ++} ++ ++static __inline uint32x4_t ++vsha256su1q_u32 (uint32x4_t tw0_3, uint32x4_t w8_11, uint32x4_t w12_15) ++{ ++ return __builtin_aarch64_crypto_sha256su1v4si_uuuu (tw0_3, w8_11, w12_15); ++} ++ ++static __inline poly128_t ++vmull_p64 (poly64_t a, poly64_t b) ++{ ++ return ++ __builtin_aarch64_crypto_pmulldi_ppp (a, b); ++} ++ ++static __inline poly128_t ++vmull_high_p64 (poly64x2_t a, poly64x2_t b) ++{ ++ return __builtin_aarch64_crypto_pmullv2di_ppp (a, b); ++} ++ ++#endif ++ + /* vshl */ + + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vshl_n_s8 (int8x8_t __a, const int __b) + { +- return (int8x8_t) __builtin_aarch64_sshl_nv8qi (__a, __b); ++ return (int8x8_t) __builtin_aarch64_ashlv8qi (__a, __b); + } + + __extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) + vshl_n_s16 (int16x4_t __a, const int __b) + { +- return (int16x4_t) __builtin_aarch64_sshl_nv4hi (__a, __b); ++ return (int16x4_t) __builtin_aarch64_ashlv4hi (__a, __b); + } + + __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) + vshl_n_s32 (int32x2_t __a, const int __b) + { +- return (int32x2_t) __builtin_aarch64_sshl_nv2si (__a, __b); ++ return (int32x2_t) __builtin_aarch64_ashlv2si (__a, __b); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vshl_n_s64 (int64x1_t __a, const int __b) + { +- return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b); ++ return (int64x1_t) __builtin_aarch64_ashldi (__a, __b); + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vshl_n_u8 (uint8x8_t __a, const int __b) + { +- return (uint8x8_t) __builtin_aarch64_ushl_nv8qi ((int8x8_t) __a, __b); ++ return (uint8x8_t) __builtin_aarch64_ashlv8qi ((int8x8_t) __a, __b); + } + + __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) + vshl_n_u16 (uint16x4_t __a, const int __b) + { +- return (uint16x4_t) __builtin_aarch64_ushl_nv4hi ((int16x4_t) __a, __b); ++ return (uint16x4_t) __builtin_aarch64_ashlv4hi ((int16x4_t) __a, __b); + } + + __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) + vshl_n_u32 (uint32x2_t __a, const int __b) + { +- return (uint32x2_t) __builtin_aarch64_ushl_nv2si ((int32x2_t) __a, __b); ++ return (uint32x2_t) __builtin_aarch64_ashlv2si ((int32x2_t) __a, __b); + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vshl_n_u64 (uint64x1_t __a, const int __b) + { +- return (uint64x1_t) __builtin_aarch64_ushl_ndi ((int64x1_t) __a, __b); ++ return (uint64x1_t) __builtin_aarch64_ashldi ((int64x1_t) __a, __b); + } + + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vshlq_n_s8 (int8x16_t __a, const int __b) + { +- return (int8x16_t) __builtin_aarch64_sshl_nv16qi (__a, __b); ++ return (int8x16_t) __builtin_aarch64_ashlv16qi (__a, __b); + } + + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vshlq_n_s16 (int16x8_t __a, const int __b) + { +- return (int16x8_t) __builtin_aarch64_sshl_nv8hi (__a, __b); ++ return (int16x8_t) __builtin_aarch64_ashlv8hi (__a, __b); + } + + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vshlq_n_s32 (int32x4_t __a, const int __b) + { +- return (int32x4_t) __builtin_aarch64_sshl_nv4si (__a, __b); ++ return (int32x4_t) __builtin_aarch64_ashlv4si (__a, __b); + } + + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vshlq_n_s64 (int64x2_t __a, const int __b) + { +- return (int64x2_t) __builtin_aarch64_sshl_nv2di (__a, __b); ++ return (int64x2_t) __builtin_aarch64_ashlv2di (__a, __b); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vshlq_n_u8 (uint8x16_t __a, const int __b) + { +- return (uint8x16_t) __builtin_aarch64_ushl_nv16qi ((int8x16_t) __a, __b); ++ return (uint8x16_t) __builtin_aarch64_ashlv16qi ((int8x16_t) __a, __b); + } + + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vshlq_n_u16 (uint16x8_t __a, const int __b) + { +- return (uint16x8_t) __builtin_aarch64_ushl_nv8hi ((int16x8_t) __a, __b); ++ return (uint16x8_t) __builtin_aarch64_ashlv8hi ((int16x8_t) __a, __b); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vshlq_n_u32 (uint32x4_t __a, const int __b) + { +- return (uint32x4_t) __builtin_aarch64_ushl_nv4si ((int32x4_t) __a, __b); ++ return (uint32x4_t) __builtin_aarch64_ashlv4si ((int32x4_t) __a, __b); + } + + __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) + vshlq_n_u64 (uint64x2_t __a, const int __b) + { +- return (uint64x2_t) __builtin_aarch64_ushl_nv2di ((int64x2_t) __a, __b); ++ return (uint64x2_t) __builtin_aarch64_ashlv2di ((int64x2_t) __a, __b); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vshld_n_s64 (int64x1_t __a, const int __b) + { +- return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b); ++ return (int64x1_t) __builtin_aarch64_ashldi (__a, __b); + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vshld_n_u64 (uint64x1_t __a, const int __b) + { +- return (uint64x1_t) __builtin_aarch64_ushl_ndi (__a, __b); ++ return (uint64x1_t) __builtin_aarch64_ashldi (__a, __b); + } + + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +@@ -23428,109 +23780,109 @@ + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vshr_n_s8 (int8x8_t __a, const int __b) + { +- return (int8x8_t) __builtin_aarch64_sshr_nv8qi (__a, __b); ++ return (int8x8_t) __builtin_aarch64_ashrv8qi (__a, __b); + } + + __extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) + vshr_n_s16 (int16x4_t __a, const int __b) + { +- return (int16x4_t) __builtin_aarch64_sshr_nv4hi (__a, __b); ++ return (int16x4_t) __builtin_aarch64_ashrv4hi (__a, __b); + } + + __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) + vshr_n_s32 (int32x2_t __a, const int __b) + { +- return (int32x2_t) __builtin_aarch64_sshr_nv2si (__a, __b); ++ return (int32x2_t) __builtin_aarch64_ashrv2si (__a, __b); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vshr_n_s64 (int64x1_t __a, const int __b) + { +- return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b); ++ return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b); + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) + vshr_n_u8 (uint8x8_t __a, const int __b) + { +- return (uint8x8_t) __builtin_aarch64_ushr_nv8qi ((int8x8_t) __a, __b); ++ return (uint8x8_t) __builtin_aarch64_lshrv8qi ((int8x8_t) __a, __b); + } + + __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) + vshr_n_u16 (uint16x4_t __a, const int __b) + { +- return (uint16x4_t) __builtin_aarch64_ushr_nv4hi ((int16x4_t) __a, __b); ++ return (uint16x4_t) __builtin_aarch64_lshrv4hi ((int16x4_t) __a, __b); + } + + __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) + vshr_n_u32 (uint32x2_t __a, const int __b) + { +- return (uint32x2_t) __builtin_aarch64_ushr_nv2si ((int32x2_t) __a, __b); ++ return (uint32x2_t) __builtin_aarch64_lshrv2si ((int32x2_t) __a, __b); + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vshr_n_u64 (uint64x1_t __a, const int __b) + { +- return (uint64x1_t) __builtin_aarch64_ushr_ndi ((int64x1_t) __a, __b); ++ return (uint64x1_t) __builtin_aarch64_lshrdi ((int64x1_t) __a, __b); + } + + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vshrq_n_s8 (int8x16_t __a, const int __b) + { +- return (int8x16_t) __builtin_aarch64_sshr_nv16qi (__a, __b); ++ return (int8x16_t) __builtin_aarch64_ashrv16qi (__a, __b); + } + + __extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) + vshrq_n_s16 (int16x8_t __a, const int __b) + { +- return (int16x8_t) __builtin_aarch64_sshr_nv8hi (__a, __b); ++ return (int16x8_t) __builtin_aarch64_ashrv8hi (__a, __b); + } + + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vshrq_n_s32 (int32x4_t __a, const int __b) + { +- return (int32x4_t) __builtin_aarch64_sshr_nv4si (__a, __b); ++ return (int32x4_t) __builtin_aarch64_ashrv4si (__a, __b); + } + + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vshrq_n_s64 (int64x2_t __a, const int __b) + { +- return (int64x2_t) __builtin_aarch64_sshr_nv2di (__a, __b); ++ return (int64x2_t) __builtin_aarch64_ashrv2di (__a, __b); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vshrq_n_u8 (uint8x16_t __a, const int __b) + { +- return (uint8x16_t) __builtin_aarch64_ushr_nv16qi ((int8x16_t) __a, __b); ++ return (uint8x16_t) __builtin_aarch64_lshrv16qi ((int8x16_t) __a, __b); + } + + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) + vshrq_n_u16 (uint16x8_t __a, const int __b) + { +- return (uint16x8_t) __builtin_aarch64_ushr_nv8hi ((int16x8_t) __a, __b); ++ return (uint16x8_t) __builtin_aarch64_lshrv8hi ((int16x8_t) __a, __b); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) + vshrq_n_u32 (uint32x4_t __a, const int __b) + { +- return (uint32x4_t) __builtin_aarch64_ushr_nv4si ((int32x4_t) __a, __b); ++ return (uint32x4_t) __builtin_aarch64_lshrv4si ((int32x4_t) __a, __b); + } + + __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) + vshrq_n_u64 (uint64x2_t __a, const int __b) + { +- return (uint64x2_t) __builtin_aarch64_ushr_nv2di ((int64x2_t) __a, __b); ++ return (uint64x2_t) __builtin_aarch64_lshrv2di ((int64x2_t) __a, __b); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vshrd_n_s64 (int64x1_t __a, const int __b) + { +- return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b); ++ return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b); + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vshrd_n_u64 (uint64x1_t __a, const int __b) + { +- return (uint64x1_t) __builtin_aarch64_ushr_ndi (__a, __b); ++ return (uint64x1_t) __builtin_aarch64_lshrdi (__a, __b); + } + + /* vsli */ +@@ -24153,8 +24505,8 @@ + { + __builtin_aarch64_simd_oi __o; + int64x2x2_t temp; +- temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0))); +- temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0))); ++ temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[1], 1); + __builtin_aarch64_st2di ((__builtin_aarch64_simd_di *) __a, __o); +@@ -24165,8 +24517,8 @@ + { + __builtin_aarch64_simd_oi __o; + uint64x2x2_t temp; +- temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0))); +- temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0))); ++ temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[1], 1); + __builtin_aarch64_st2di ((__builtin_aarch64_simd_di *) __a, __o); +@@ -24177,8 +24529,8 @@ + { + __builtin_aarch64_simd_oi __o; + float64x2x2_t temp; +- temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0))); +- temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0))); ++ temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv2df (__o, (float64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv2df (__o, (float64x2_t) temp.val[1], 1); + __builtin_aarch64_st2df ((__builtin_aarch64_simd_df *) __a, __o); +@@ -24189,8 +24541,8 @@ + { + __builtin_aarch64_simd_oi __o; + int8x16x2_t temp; +- temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0))); +- temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0))); ++ temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1); + __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o); +@@ -24201,8 +24553,8 @@ + { + __builtin_aarch64_simd_oi __o; + poly8x16x2_t temp; +- temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0))); +- temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0))); ++ temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1); + __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o); +@@ -24213,8 +24565,8 @@ + { + __builtin_aarch64_simd_oi __o; + int16x8x2_t temp; +- temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0))); +- temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0))); ++ temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1); + __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o); +@@ -24225,8 +24577,8 @@ + { + __builtin_aarch64_simd_oi __o; + poly16x8x2_t temp; +- temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0))); +- temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0))); ++ temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1); + __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o); +@@ -24237,8 +24589,8 @@ + { + __builtin_aarch64_simd_oi __o; + int32x4x2_t temp; +- temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0))); +- temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0))); ++ temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[1], 1); + __builtin_aarch64_st2v2si ((__builtin_aarch64_simd_si *) __a, __o); +@@ -24249,8 +24601,8 @@ + { + __builtin_aarch64_simd_oi __o; + uint8x16x2_t temp; +- temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0))); +- temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0))); ++ temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1); + __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o); +@@ -24261,8 +24613,8 @@ + { + __builtin_aarch64_simd_oi __o; + uint16x8x2_t temp; +- temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0))); +- temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0))); ++ temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1); + __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o); +@@ -24273,8 +24625,8 @@ + { + __builtin_aarch64_simd_oi __o; + uint32x4x2_t temp; +- temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0))); +- temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0))); ++ temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[1], 1); + __builtin_aarch64_st2v2si ((__builtin_aarch64_simd_si *) __a, __o); +@@ -24285,8 +24637,8 @@ + { + __builtin_aarch64_simd_oi __o; + float32x4x2_t temp; +- temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0))); +- temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0))); ++ temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregoiv4sf (__o, (float32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregoiv4sf (__o, (float32x4_t) temp.val[1], 1); + __builtin_aarch64_st2v2sf ((__builtin_aarch64_simd_sf *) __a, __o); +@@ -24405,9 +24757,9 @@ + { + __builtin_aarch64_simd_ci __o; + int64x2x3_t temp; +- temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0))); +- temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0))); +- temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (INT64_C (0))); ++ temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[2], 2); +@@ -24419,9 +24771,9 @@ + { + __builtin_aarch64_simd_ci __o; + uint64x2x3_t temp; +- temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0))); +- temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0))); +- temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (UINT64_C (0))); ++ temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[2], 2); +@@ -24433,9 +24785,9 @@ + { + __builtin_aarch64_simd_ci __o; + float64x2x3_t temp; +- temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0))); +- temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0))); +- temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (UINT64_C (0))); ++ temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[2], 2); +@@ -24447,9 +24799,9 @@ + { + __builtin_aarch64_simd_ci __o; + int8x16x3_t temp; +- temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0))); +- temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0))); +- temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (INT64_C (0))); ++ temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24461,9 +24813,9 @@ + { + __builtin_aarch64_simd_ci __o; + poly8x16x3_t temp; +- temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0))); +- temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0))); +- temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (UINT64_C (0))); ++ temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24475,9 +24827,9 @@ + { + __builtin_aarch64_simd_ci __o; + int16x8x3_t temp; +- temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0))); +- temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0))); +- temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (INT64_C (0))); ++ temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24489,9 +24841,9 @@ + { + __builtin_aarch64_simd_ci __o; + poly16x8x3_t temp; +- temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0))); +- temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0))); +- temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (UINT64_C (0))); ++ temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24503,9 +24855,9 @@ + { + __builtin_aarch64_simd_ci __o; + int32x4x3_t temp; +- temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0))); +- temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0))); +- temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (INT64_C (0))); ++ temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[2], 2); +@@ -24517,9 +24869,9 @@ + { + __builtin_aarch64_simd_ci __o; + uint8x16x3_t temp; +- temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0))); +- temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0))); +- temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (UINT64_C (0))); ++ temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24531,9 +24883,9 @@ + { + __builtin_aarch64_simd_ci __o; + uint16x8x3_t temp; +- temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0))); +- temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0))); +- temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (UINT64_C (0))); ++ temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24545,9 +24897,9 @@ + { + __builtin_aarch64_simd_ci __o; + uint32x4x3_t temp; +- temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0))); +- temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0))); +- temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (UINT64_C (0))); ++ temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[2], 2); +@@ -24559,9 +24911,9 @@ + { + __builtin_aarch64_simd_ci __o; + float32x4x3_t temp; +- temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0))); +- temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0))); +- temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (UINT64_C (0))); ++ temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[2], 2); +@@ -24693,10 +25045,10 @@ + { + __builtin_aarch64_simd_xi __o; + int64x2x4_t temp; +- temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0))); +- temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0))); +- temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (INT64_C (0))); +- temp.val[3] = vcombine_s64 (val.val[3], vcreate_s64 (INT64_C (0))); ++ temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (__AARCH64_INT64_C (0))); ++ temp.val[3] = vcombine_s64 (val.val[3], vcreate_s64 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[2], 2); +@@ -24709,10 +25061,10 @@ + { + __builtin_aarch64_simd_xi __o; + uint64x2x4_t temp; +- temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0))); +- temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0))); +- temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (UINT64_C (0))); +- temp.val[3] = vcombine_u64 (val.val[3], vcreate_u64 (UINT64_C (0))); ++ temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_u64 (val.val[3], vcreate_u64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[2], 2); +@@ -24725,10 +25077,10 @@ + { + __builtin_aarch64_simd_xi __o; + float64x2x4_t temp; +- temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0))); +- temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0))); +- temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (UINT64_C (0))); +- temp.val[3] = vcombine_f64 (val.val[3], vcreate_f64 (UINT64_C (0))); ++ temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_f64 (val.val[3], vcreate_f64 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[2], 2); +@@ -24741,10 +25093,10 @@ + { + __builtin_aarch64_simd_xi __o; + int8x16x4_t temp; +- temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0))); +- temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0))); +- temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (INT64_C (0))); +- temp.val[3] = vcombine_s8 (val.val[3], vcreate_s8 (INT64_C (0))); ++ temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (__AARCH64_INT64_C (0))); ++ temp.val[3] = vcombine_s8 (val.val[3], vcreate_s8 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24757,10 +25109,10 @@ + { + __builtin_aarch64_simd_xi __o; + poly8x16x4_t temp; +- temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0))); +- temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0))); +- temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (UINT64_C (0))); +- temp.val[3] = vcombine_p8 (val.val[3], vcreate_p8 (UINT64_C (0))); ++ temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_p8 (val.val[3], vcreate_p8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24773,10 +25125,10 @@ + { + __builtin_aarch64_simd_xi __o; + int16x8x4_t temp; +- temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0))); +- temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0))); +- temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (INT64_C (0))); +- temp.val[3] = vcombine_s16 (val.val[3], vcreate_s16 (INT64_C (0))); ++ temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (__AARCH64_INT64_C (0))); ++ temp.val[3] = vcombine_s16 (val.val[3], vcreate_s16 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24789,10 +25141,10 @@ + { + __builtin_aarch64_simd_xi __o; + poly16x8x4_t temp; +- temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0))); +- temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0))); +- temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (UINT64_C (0))); +- temp.val[3] = vcombine_p16 (val.val[3], vcreate_p16 (UINT64_C (0))); ++ temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_p16 (val.val[3], vcreate_p16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24805,10 +25157,10 @@ + { + __builtin_aarch64_simd_xi __o; + int32x4x4_t temp; +- temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0))); +- temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0))); +- temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (INT64_C (0))); +- temp.val[3] = vcombine_s32 (val.val[3], vcreate_s32 (INT64_C (0))); ++ temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (__AARCH64_INT64_C (0))); ++ temp.val[3] = vcombine_s32 (val.val[3], vcreate_s32 (__AARCH64_INT64_C (0))); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[2], 2); +@@ -24821,10 +25173,10 @@ + { + __builtin_aarch64_simd_xi __o; + uint8x16x4_t temp; +- temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0))); +- temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0))); +- temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (UINT64_C (0))); +- temp.val[3] = vcombine_u8 (val.val[3], vcreate_u8 (UINT64_C (0))); ++ temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_u8 (val.val[3], vcreate_u8 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2); +@@ -24837,10 +25189,10 @@ + { + __builtin_aarch64_simd_xi __o; + uint16x8x4_t temp; +- temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0))); +- temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0))); +- temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (UINT64_C (0))); +- temp.val[3] = vcombine_u16 (val.val[3], vcreate_u16 (UINT64_C (0))); ++ temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_u16 (val.val[3], vcreate_u16 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2); +@@ -24853,10 +25205,10 @@ + { + __builtin_aarch64_simd_xi __o; + uint32x4x4_t temp; +- temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0))); +- temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0))); +- temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (UINT64_C (0))); +- temp.val[3] = vcombine_u32 (val.val[3], vcreate_u32 (UINT64_C (0))); ++ temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_u32 (val.val[3], vcreate_u32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[2], 2); +@@ -24869,10 +25221,10 @@ + { + __builtin_aarch64_simd_xi __o; + float32x4x4_t temp; +- temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0))); +- temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0))); +- temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (UINT64_C (0))); +- temp.val[3] = vcombine_f32 (val.val[3], vcreate_f32 (UINT64_C (0))); ++ temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (__AARCH64_UINT64_C (0))); ++ temp.val[3] = vcombine_f32 (val.val[3], vcreate_f32 (__AARCH64_UINT64_C (0))); + __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[0], 0); + __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[1], 1); + __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[2], 2); +@@ -25159,7 +25511,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vtst_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b); ++ return (__a & __b) ? -1ll : 0ll; + } + + __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +@@ -25186,8 +25538,7 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vtst_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return (__a & __b) ? -1ll : 0ll; + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +@@ -25245,14 +25596,13 @@ + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vtstd_s64 (int64x1_t __a, int64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b); ++ return (__a & __b) ? -1ll : 0ll; + } + + __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) + vtstd_u64 (uint64x1_t __a, uint64x1_t __b) + { +- return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a, +- (int64x1_t) __b); ++ return (__a & __b) ? -1ll : 0ll; + } + + /* vuqadd */ +@@ -25371,4 +25721,31 @@ + + /* End of optimal implementations in approved order. */ + ++#undef __aarch64_vget_lane_any ++#undef __aarch64_vget_lane_f32 ++#undef __aarch64_vget_lane_f64 ++#undef __aarch64_vget_lane_p8 ++#undef __aarch64_vget_lane_p16 ++#undef __aarch64_vget_lane_s8 ++#undef __aarch64_vget_lane_s16 ++#undef __aarch64_vget_lane_s32 ++#undef __aarch64_vget_lane_s64 ++#undef __aarch64_vget_lane_u8 ++#undef __aarch64_vget_lane_u16 ++#undef __aarch64_vget_lane_u32 ++#undef __aarch64_vget_lane_u64 ++ ++#undef __aarch64_vgetq_lane_f32 ++#undef __aarch64_vgetq_lane_f64 ++#undef __aarch64_vgetq_lane_p8 ++#undef __aarch64_vgetq_lane_p16 ++#undef __aarch64_vgetq_lane_s8 ++#undef __aarch64_vgetq_lane_s16 ++#undef __aarch64_vgetq_lane_s32 ++#undef __aarch64_vgetq_lane_s64 ++#undef __aarch64_vgetq_lane_u8 ++#undef __aarch64_vgetq_lane_u16 ++#undef __aarch64_vgetq_lane_u32 ++#undef __aarch64_vgetq_lane_u64 ++ + #endif +--- a/src/gcc/config/aarch64/aarch64.md ++++ b/src/gcc/config/aarch64/aarch64.md +@@ -68,14 +68,19 @@ + (define_c_enum "unspec" [ + UNSPEC_CASESI + UNSPEC_CLS ++ UNSPEC_FRECPE ++ UNSPEC_FRECPS ++ UNSPEC_FRECPX + UNSPEC_FRINTA + UNSPEC_FRINTI + UNSPEC_FRINTM ++ UNSPEC_FRINTN + UNSPEC_FRINTP + UNSPEC_FRINTX + UNSPEC_FRINTZ + UNSPEC_GOTSMALLPIC + UNSPEC_GOTSMALLTLS ++ UNSPEC_GOTTINYPIC + UNSPEC_LD2 + UNSPEC_LD3 + UNSPEC_LD4 +@@ -230,6 +235,9 @@ + fmovf2i,\ + fmovi2f,\ + fmul,\ ++ frecpe,\ ++ frecps,\ ++ frecpx,\ + frint,\ + fsqrt,\ + load_acq,\ +@@ -763,19 +771,41 @@ + ) + + (define_insn "*mov_aarch64" +- [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r,r,m, r,*w") +- (match_operand:SHORT 1 "general_operand" " r,M,m,rZ,*w,r"))] ++ [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r, *w,r,*w, m, m, r,*w,*w") ++ (match_operand:SHORT 1 "general_operand" " r,M,D,m, m,rZ,*w,*w, r,*w"))] + "(register_operand (operands[0], mode) + || aarch64_reg_or_zero (operands[1], mode))" +- "@ +- mov\\t%w0, %w1 +- mov\\t%w0, %1 +- ldr\\t%w0, %1 +- str\\t%w1, %0 +- umov\\t%w0, %1.[0] +- dup\\t%0., %w1" +- [(set_attr "v8type" "move,alu,load1,store1,*,*") +- (set_attr "simd_type" "*,*,*,*,simd_movgp,simd_dupgp") ++{ ++ switch (which_alternative) ++ { ++ case 0: ++ return "mov\t%w0, %w1"; ++ case 1: ++ return "mov\t%w0, %1"; ++ case 2: ++ return aarch64_output_scalar_simd_mov_immediate (operands[1], ++ mode); ++ case 3: ++ return "ldr\t%w0, %1"; ++ case 4: ++ return "ldr\t%0, %1"; ++ case 5: ++ return "str\t%w1, %0"; ++ case 6: ++ return "str\t%1, %0"; ++ case 7: ++ return "umov\t%w0, %1.[0]"; ++ case 8: ++ return "dup\t%0., %w1"; ++ case 9: ++ return "dup\t%0, %1.[0]"; ++ default: ++ gcc_unreachable (); ++ } ++} ++ [(set_attr "v8type" "move,alu,alu,load1,load1,store1,store1,*,*,*") ++ (set_attr "simd_type" "*,*,simd_move_imm,*,*,*,*,simd_movgp,simd_dupgp,simd_dup") ++ (set_attr "simd" "*,*,yes,*,*,*,*,yes,yes,yes") + (set_attr "mode" "") + (set_attr "simd_mode" "")] + ) +@@ -797,8 +827,8 @@ + ) + + (define_insn "*movsi_aarch64" +- [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,m, *w, r,*w") +- (match_operand:SI 1 "aarch64_mov_operand" " r,M,m,rZ,rZ,*w,*w"))] ++ [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,*w,m, m,*w, r,*w") ++ (match_operand:SI 1 "aarch64_mov_operand" " r,M,m, m,rZ,*w,rZ,*w,*w"))] + "(register_operand (operands[0], SImode) + || aarch64_reg_or_zero (operands[1], SImode))" + "@ +@@ -805,18 +835,20 @@ + mov\\t%w0, %w1 + mov\\t%w0, %1 + ldr\\t%w0, %1 ++ ldr\\t%s0, %1 + str\\t%w1, %0 ++ str\\t%s1, %0 + fmov\\t%s0, %w1 + fmov\\t%w0, %s1 + fmov\\t%s0, %s1" +- [(set_attr "v8type" "move,alu,load1,store1,fmov,fmov,fmov") ++ [(set_attr "v8type" "move,alu,load1,load1,store1,store1,fmov,fmov,fmov") + (set_attr "mode" "SI") +- (set_attr "fp" "*,*,*,*,yes,yes,yes")] ++ (set_attr "fp" "*,*,*,yes,*,yes,yes,yes,yes")] + ) + + (define_insn "*movdi_aarch64" +- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,m, r, r, *w, r,*w,w") +- (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,m,rZ,Usa,Ush,rZ,*w,*w,Dd"))] ++ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,*w,m, m,r,r, *w, r,*w,w") ++ (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,m, m,rZ,*w,S,Ush,rZ,*w,*w,Dd"))] + "(register_operand (operands[0], DImode) + || aarch64_reg_or_zero (operands[1], DImode))" + "@ +@@ -825,7 +857,9 @@ + mov\\t%x0, %1 + mov\\t%x0, %1 + ldr\\t%x0, %1 ++ ldr\\t%d0, %1 + str\\t%x1, %0 ++ str\\t%d1, %0 + adr\\t%x0, %a1 + adrp\\t%x0, %A1 + fmov\\t%d0, %x1 +@@ -832,10 +866,10 @@ + fmov\\t%x0, %d1 + fmov\\t%d0, %d1 + movi\\t%d0, %1" +- [(set_attr "v8type" "move,move,move,alu,load1,store1,adr,adr,fmov,fmov,fmov,fmov") ++ [(set_attr "v8type" "move,move,move,alu,load1,load1,store1,store1,adr,adr,fmov,fmov,fmov,fmov") + (set_attr "mode" "DI") +- (set_attr "fp" "*,*,*,*,*,*,*,*,yes,yes,yes,*") +- (set_attr "simd" "*,*,*,*,*,*,*,*,*,*,*,yes")] ++ (set_attr "fp" "*,*,*,*,*,yes,*,yes,*,*,yes,yes,yes,*") ++ (set_attr "simd" "*,*,*,*,*,*,*,*,*,*,*,*,*,yes")] + ) + + (define_insn "insv_imm" +@@ -843,9 +877,8 @@ + (const_int 16) + (match_operand:GPI 1 "const_int_operand" "n")) + (match_operand:GPI 2 "const_int_operand" "n"))] +- "INTVAL (operands[1]) < GET_MODE_BITSIZE (mode) +- && INTVAL (operands[1]) % 16 == 0 +- && UINTVAL (operands[2]) <= 0xffff" ++ "UINTVAL (operands[1]) < GET_MODE_BITSIZE (mode) ++ && UINTVAL (operands[1]) % 16 == 0" + "movk\\t%0, %X2, lsl %1" + [(set_attr "v8type" "movk") + (set_attr "mode" "")] +@@ -982,9 +1015,9 @@ + || register_operand (operands[1], TFmode))" + "@ + orr\\t%0.16b, %1.16b, %1.16b +- mov\\t%0, %1\;mov\\t%H0, %H1 +- fmov\\t%d0, %Q1\;fmov\\t%0.d[1], %R1 +- fmov\\t%Q0, %d1\;fmov\\t%R0, %1.d[1] ++ # ++ # ++ # + movi\\t%0.2d, #0 + fmov\\t%s0, wzr + ldr\\t%q0, %1 +@@ -998,6 +1031,17 @@ + (set_attr "simd" "yes,*,*,*,yes,*,*,*,*,*")] + ) + ++(define_split ++ [(set (match_operand:TF 0 "register_operand" "") ++ (match_operand:TF 1 "aarch64_reg_or_imm" ""))] ++ "reload_completed && aarch64_split_128bit_move_p (operands[0], operands[1])" ++ [(const_int 0)] ++ { ++ aarch64_split_128bit_move (operands[0], operands[1]); ++ DONE; ++ } ++) ++ + ;; Operands 1 and 3 are tied together by the final condition; so we allow + ;; fairly lax checking on the second memory operation. + (define_insn "load_pair" +@@ -1150,13 +1194,14 @@ + ) + + (define_insn "*zero_extend2_aarch64" +- [(set (match_operand:GPI 0 "register_operand" "=r,r") +- (zero_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m")))] ++ [(set (match_operand:GPI 0 "register_operand" "=r,r,*w") ++ (zero_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m,m")))] + "" + "@ + uxt\t%0, %w1 +- ldr\t%w0, %1" +- [(set_attr "v8type" "extend,load1") ++ ldr\t%w0, %1 ++ ldr\t%0, %1" ++ [(set_attr "v8type" "extend,load1,load1") + (set_attr "mode" "")] + ) + +@@ -1287,6 +1332,112 @@ + (set_attr "mode" "SI")] + ) + ++(define_insn "*adds_mul_imm_" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (plus:GPI (mult:GPI ++ (match_operand:GPI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_pwr_2_" "n")) ++ (match_operand:GPI 3 "register_operand" "rk")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (plus:GPI (mult:GPI (match_dup 1) (match_dup 2)) ++ (match_dup 3)))] ++ "" ++ "adds\\t%0, %3, %1, lsl %p2" ++ [(set_attr "v8type" "alus_shift") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*subs_mul_imm_" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (minus:GPI (match_operand:GPI 1 "register_operand" "rk") ++ (mult:GPI ++ (match_operand:GPI 2 "register_operand" "r") ++ (match_operand:QI 3 "aarch64_pwr_2_" "n"))) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (minus:GPI (match_dup 1) ++ (mult:GPI (match_dup 2) (match_dup 3))))] ++ "" ++ "subs\\t%0, %1, %2, lsl %p3" ++ [(set_attr "v8type" "alus_shift") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*adds__" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (plus:GPI ++ (ANY_EXTEND:GPI (match_operand:ALLX 1 "register_operand" "r")) ++ (match_operand:GPI 2 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (plus:GPI (ANY_EXTEND:GPI (match_dup 1)) (match_dup 2)))] ++ "" ++ "adds\\t%0, %2, %1, xt" ++ [(set_attr "v8type" "alus_ext") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*subs__" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (minus:GPI (match_operand:GPI 1 "register_operand" "r") ++ (ANY_EXTEND:GPI ++ (match_operand:ALLX 2 "register_operand" "r"))) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (minus:GPI (match_dup 1) (ANY_EXTEND:GPI (match_dup 2))))] ++ "" ++ "subs\\t%0, %1, %2, xt" ++ [(set_attr "v8type" "alus_ext") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*adds__multp2" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (plus:GPI (ANY_EXTRACT:GPI ++ (mult:GPI (match_operand:GPI 1 "register_operand" "r") ++ (match_operand 2 "aarch64_pwr_imm3" "Up3")) ++ (match_operand 3 "const_int_operand" "n") ++ (const_int 0)) ++ (match_operand:GPI 4 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (plus:GPI (ANY_EXTRACT:GPI (mult:GPI (match_dup 1) (match_dup 2)) ++ (match_dup 3) ++ (const_int 0)) ++ (match_dup 4)))] ++ "aarch64_is_extend_from_extract (mode, operands[2], operands[3])" ++ "adds\\t%0, %4, %1, xt%e3 %p2" ++ [(set_attr "v8type" "alus_ext") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*subs__multp2" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (minus:GPI (match_operand:GPI 4 "register_operand" "r") ++ (ANY_EXTRACT:GPI ++ (mult:GPI (match_operand:GPI 1 "register_operand" "r") ++ (match_operand 2 "aarch64_pwr_imm3" "Up3")) ++ (match_operand 3 "const_int_operand" "n") ++ (const_int 0))) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (minus:GPI (match_dup 4) (ANY_EXTRACT:GPI ++ (mult:GPI (match_dup 1) (match_dup 2)) ++ (match_dup 3) ++ (const_int 0))))] ++ "aarch64_is_extend_from_extract (mode, operands[2], operands[3])" ++ "subs\\t%0, %4, %1, xt%e3 %p2" ++ [(set_attr "v8type" "alus_ext") ++ (set_attr "mode" "")] ++) ++ + (define_insn "*add3nr_compare0" + [(set (reg:CC_NZ CC_REGNUM) + (compare:CC_NZ +@@ -1302,12 +1453,12 @@ + ) + + (define_insn "*compare_neg" +- [(set (reg:CC CC_REGNUM) +- (compare:CC +- (match_operand:GPI 0 "register_operand" "r") +- (neg:GPI (match_operand:GPI 1 "register_operand" "r"))))] ++ [(set (reg:CC_SWP CC_REGNUM) ++ (compare:CC_SWP ++ (neg:GPI (match_operand:GPI 0 "register_operand" "r")) ++ (match_operand:GPI 1 "register_operand" "r")))] + "" +- "cmn\\t%0, %1" ++ "cmn\\t%1, %0" + [(set_attr "v8type" "alus") + (set_attr "mode" "")] + ) +@@ -1791,6 +1942,34 @@ + (set_attr "mode" "SI")] + ) + ++(define_insn "*sub3_carryin" ++ [(set ++ (match_operand:GPI 0 "register_operand" "=r") ++ (minus:GPI (minus:GPI ++ (match_operand:GPI 1 "register_operand" "r") ++ (ltu:GPI (reg:CC CC_REGNUM) (const_int 0))) ++ (match_operand:GPI 2 "register_operand" "r")))] ++ "" ++ "sbc\\t%0, %1, %2" ++ [(set_attr "v8type" "adc") ++ (set_attr "mode" "")] ++) ++ ++;; zero_extend version of the above ++(define_insn "*subsi3_carryin_uxtw" ++ [(set ++ (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI ++ (minus:SI (minus:SI ++ (match_operand:SI 1 "register_operand" "r") ++ (ltu:SI (reg:CC CC_REGNUM) (const_int 0))) ++ (match_operand:SI 2 "register_operand" "r"))))] ++ "" ++ "sbc\\t%w0, %w1, %w2" ++ [(set_attr "v8type" "adc") ++ (set_attr "mode" "SI")] ++) ++ + (define_insn "*sub_uxt_multp2" + [(set (match_operand:GPI 0 "register_operand" "=rk") + (minus:GPI (match_operand:GPI 4 "register_operand" "r") +@@ -1825,6 +2004,38 @@ + (set_attr "mode" "SI")] + ) + ++(define_insn_and_split "absdi2" ++ [(set (match_operand:DI 0 "register_operand" "=r,w") ++ (abs:DI (match_operand:DI 1 "register_operand" "r,w"))) ++ (clobber (match_scratch:DI 2 "=&r,X"))] ++ "" ++ "@ ++ # ++ abs\\t%d0, %d1" ++ "reload_completed ++ && GP_REGNUM_P (REGNO (operands[0])) ++ && GP_REGNUM_P (REGNO (operands[1]))" ++ [(const_int 0)] ++ { ++ emit_insn (gen_rtx_SET (VOIDmode, operands[2], ++ gen_rtx_XOR (DImode, ++ gen_rtx_ASHIFTRT (DImode, ++ operands[1], ++ GEN_INT (63)), ++ operands[1]))); ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_MINUS (DImode, ++ operands[2], ++ gen_rtx_ASHIFTRT (DImode, ++ operands[1], ++ GEN_INT (63))))); ++ DONE; ++ } ++ [(set_attr "v8type" "alu") ++ (set_attr "mode" "DI")] ++) ++ + (define_insn "neg2" + [(set (match_operand:GPI 0 "register_operand" "=r") + (neg:GPI (match_operand:GPI 1 "register_operand" "r")))] +@@ -1844,6 +2055,27 @@ + (set_attr "mode" "SI")] + ) + ++(define_insn "*ngc" ++ [(set (match_operand:GPI 0 "register_operand" "=r") ++ (minus:GPI (neg:GPI (ltu:GPI (reg:CC CC_REGNUM) (const_int 0))) ++ (match_operand:GPI 1 "register_operand" "r")))] ++ "" ++ "ngc\\t%0, %1" ++ [(set_attr "v8type" "adc") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*ngcsi_uxtw" ++ [(set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI ++ (minus:SI (neg:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0))) ++ (match_operand:SI 1 "register_operand" "r"))))] ++ "" ++ "ngc\\t%w0, %w1" ++ [(set_attr "v8type" "adc") ++ (set_attr "mode" "SI")] ++) ++ + (define_insn "*neg2_compare0" + [(set (reg:CC_NZ CC_REGNUM) + (compare:CC_NZ (neg:GPI (match_operand:GPI 1 "register_operand" "r")) +@@ -1869,6 +2101,21 @@ + (set_attr "mode" "SI")] + ) + ++(define_insn "*neg_3_compare0" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (neg:GPI (ASHIFT:GPI ++ (match_operand:GPI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_shift_imm_" "n"))) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (neg:GPI (ASHIFT:GPI (match_dup 1) (match_dup 2))))] ++ "" ++ "negs\\t%0, %1, %2" ++ [(set_attr "v8type" "alus_shift") ++ (set_attr "mode" "")] ++) ++ + (define_insn "*neg__2" + [(set (match_operand:GPI 0 "register_operand" "=r") + (neg:GPI (ASHIFT:GPI +@@ -2158,6 +2405,18 @@ + (set_attr "mode" "")] + ) + ++(define_insn "*cmp_swp__shft_" ++ [(set (reg:CC_SWP CC_REGNUM) ++ (compare:CC_SWP (ashift:GPI ++ (ANY_EXTEND:GPI ++ (match_operand:ALLX 0 "register_operand" "r")) ++ (match_operand 1 "aarch64_imm3" "Ui3")) ++ (match_operand:GPI 2 "register_operand" "r")))] ++ "" ++ "cmp\\t%2, %0, xt %1" ++ [(set_attr "v8type" "alus_ext") ++ (set_attr "mode" "")] ++) + + ;; ------------------------------------------------------------------- + ;; Store-flag and conditional select insns +@@ -2434,6 +2693,69 @@ + [(set_attr "v8type" "logic,logic_imm") + (set_attr "mode" "SI")]) + ++(define_insn "*and3_compare0" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:GPI (match_operand:GPI 1 "register_operand" "%r,r") ++ (match_operand:GPI 2 "aarch64_logical_operand" "r,")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r,r") ++ (and:GPI (match_dup 1) (match_dup 2)))] ++ "" ++ "ands\\t%0, %1, %2" ++ [(set_attr "v8type" "logics,logics_imm") ++ (set_attr "mode" "")] ++) ++ ++;; zero_extend version of above ++(define_insn "*andsi3_compare0_uxtw" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:SI (match_operand:SI 1 "register_operand" "%r,r") ++ (match_operand:SI 2 "aarch64_logical_operand" "r,K")) ++ (const_int 0))) ++ (set (match_operand:DI 0 "register_operand" "=r,r") ++ (zero_extend:DI (and:SI (match_dup 1) (match_dup 2))))] ++ "" ++ "ands\\t%w0, %w1, %w2" ++ [(set_attr "v8type" "logics,logics_imm") ++ (set_attr "mode" "SI")] ++) ++ ++(define_insn "*and_3_compare0" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:GPI (SHIFT:GPI ++ (match_operand:GPI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_shift_imm_" "n")) ++ (match_operand:GPI 3 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (and:GPI (SHIFT:GPI (match_dup 1) (match_dup 2)) (match_dup 3)))] ++ "" ++ "ands\\t%0, %3, %1, %2" ++ [(set_attr "v8type" "logics_shift") ++ (set_attr "mode" "")] ++) ++ ++;; zero_extend version of above ++(define_insn "*and_si3_compare0_uxtw" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:SI (SHIFT:SI ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_shift_imm_si" "n")) ++ (match_operand:SI 3 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI (and:SI (SHIFT:SI (match_dup 1) (match_dup 2)) ++ (match_dup 3))))] ++ "" ++ "ands\\t%w0, %w3, %w1, %2" ++ [(set_attr "v8type" "logics_shift") ++ (set_attr "mode" "SI")] ++) ++ + (define_insn "*_3" + [(set (match_operand:GPI 0 "register_operand" "=r") + (LOGICAL:GPI (SHIFT:GPI +@@ -2485,6 +2807,35 @@ + [(set_attr "v8type" "logic") + (set_attr "mode" "")]) + ++(define_insn "*and_one_cmpl3_compare0" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:GPI (not:GPI ++ (match_operand:GPI 1 "register_operand" "r")) ++ (match_operand:GPI 2 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (and:GPI (not:GPI (match_dup 1)) (match_dup 2)))] ++ "" ++ "bics\\t%0, %2, %1" ++ [(set_attr "v8type" "logics") ++ (set_attr "mode" "")]) ++ ++;; zero_extend version of above ++(define_insn "*and_one_cmplsi3_compare0_uxtw" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:SI (not:SI ++ (match_operand:SI 1 "register_operand" "r")) ++ (match_operand:SI 2 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI (and:SI (not:SI (match_dup 1)) (match_dup 2))))] ++ "" ++ "bics\\t%w0, %w2, %w1" ++ [(set_attr "v8type" "logics") ++ (set_attr "mode" "SI")]) ++ + (define_insn "*_one_cmpl_3" + [(set (match_operand:GPI 0 "register_operand" "=r") + (LOGICAL:GPI (not:GPI +@@ -2497,6 +2848,43 @@ + [(set_attr "v8type" "logic_shift") + (set_attr "mode" "")]) + ++(define_insn "*and_one_cmpl_3_compare0" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:GPI (not:GPI ++ (SHIFT:GPI ++ (match_operand:GPI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_shift_imm_" "n"))) ++ (match_operand:GPI 3 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:GPI 0 "register_operand" "=r") ++ (and:GPI (not:GPI ++ (SHIFT:GPI ++ (match_dup 1) (match_dup 2))) (match_dup 3)))] ++ "" ++ "bics\\t%0, %3, %1, %2" ++ [(set_attr "v8type" "logics_shift") ++ (set_attr "mode" "")]) ++ ++;; zero_extend version of above ++(define_insn "*and_one_cmpl_si3_compare0_uxtw" ++ [(set (reg:CC_NZ CC_REGNUM) ++ (compare:CC_NZ ++ (and:SI (not:SI ++ (SHIFT:SI ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:QI 2 "aarch64_shift_imm_si" "n"))) ++ (match_operand:SI 3 "register_operand" "r")) ++ (const_int 0))) ++ (set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI (and:SI ++ (not:SI ++ (SHIFT:SI (match_dup 1) (match_dup 2))) (match_dup 3))))] ++ "" ++ "bics\\t%w0, %w3, %w1, %2" ++ [(set_attr "v8type" "logics_shift") ++ (set_attr "mode" "SI")]) ++ + (define_insn "clz2" + [(set (match_operand:GPI 0 "register_operand" "=r") + (clz:GPI (match_operand:GPI 1 "register_operand" "r")))] +@@ -2704,6 +3092,62 @@ + (set_attr "mode" "")] + ) + ++(define_insn "*extr5_insn" ++ [(set (match_operand:GPI 0 "register_operand" "=r") ++ (ior:GPI (ashift:GPI (match_operand:GPI 1 "register_operand" "r") ++ (match_operand 3 "const_int_operand" "n")) ++ (lshiftrt:GPI (match_operand:GPI 2 "register_operand" "r") ++ (match_operand 4 "const_int_operand" "n"))))] ++ "UINTVAL (operands[3]) < GET_MODE_BITSIZE (mode) && ++ (UINTVAL (operands[3]) + UINTVAL (operands[4]) == GET_MODE_BITSIZE (mode))" ++ "extr\\t%0, %1, %2, %4" ++ [(set_attr "v8type" "shift") ++ (set_attr "mode" "")] ++) ++ ++;; zero_extend version of the above ++(define_insn "*extrsi5_insn_uxtw" ++ [(set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI ++ (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand 3 "const_int_operand" "n")) ++ (lshiftrt:SI (match_operand:SI 2 "register_operand" "r") ++ (match_operand 4 "const_int_operand" "n")))))] ++ "UINTVAL (operands[3]) < 32 && ++ (UINTVAL (operands[3]) + UINTVAL (operands[4]) == 32)" ++ "extr\\t%w0, %w1, %w2, %4" ++ [(set_attr "v8type" "shift") ++ (set_attr "mode" "SI")] ++) ++ ++(define_insn "*ror3_insn" ++ [(set (match_operand:GPI 0 "register_operand" "=r") ++ (rotate:GPI (match_operand:GPI 1 "register_operand" "r") ++ (match_operand 2 "const_int_operand" "n")))] ++ "UINTVAL (operands[2]) < GET_MODE_BITSIZE (mode)" ++{ ++ operands[3] = GEN_INT ( - UINTVAL (operands[2])); ++ return "ror\\t%0, %1, %3"; ++} ++ [(set_attr "v8type" "shift") ++ (set_attr "mode" "")] ++) ++ ++;; zero_extend version of the above ++(define_insn "*rorsi3_insn_uxtw" ++ [(set (match_operand:DI 0 "register_operand" "=r") ++ (zero_extend:DI ++ (rotate:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand 2 "const_int_operand" "n"))))] ++ "UINTVAL (operands[2]) < 32" ++{ ++ operands[3] = GEN_INT (32 - UINTVAL (operands[2])); ++ return "ror\\t%w0, %w1, %3"; ++} ++ [(set_attr "v8type" "shift") ++ (set_attr "mode" "SI")] ++) ++ + (define_insn "*_ashl" + [(set (match_operand:GPI 0 "register_operand" "=r") + (ANY_EXTEND:GPI +@@ -2770,6 +3214,65 @@ + (set_attr "mode" "")] + ) + ++;; Bitfield Insert (insv) ++(define_expand "insv" ++ [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand") ++ (match_operand 1 "const_int_operand") ++ (match_operand 2 "const_int_operand")) ++ (match_operand:GPI 3 "general_operand"))] ++ "" ++{ ++ unsigned HOST_WIDE_INT width = UINTVAL (operands[1]); ++ unsigned HOST_WIDE_INT pos = UINTVAL (operands[2]); ++ rtx value = operands[3]; ++ ++ if (width == 0 || (pos + width) > GET_MODE_BITSIZE (mode)) ++ FAIL; ++ ++ if (CONST_INT_P (value)) ++ { ++ unsigned HOST_WIDE_INT mask = ((unsigned HOST_WIDE_INT)1 << width) - 1; ++ ++ /* Prefer AND/OR for inserting all zeros or all ones. */ ++ if ((UINTVAL (value) & mask) == 0 ++ || (UINTVAL (value) & mask) == mask) ++ FAIL; ++ ++ /* 16-bit aligned 16-bit wide insert is handled by insv_imm. */ ++ if (width == 16 && (pos % 16) == 0) ++ DONE; ++ } ++ operands[3] = force_reg (mode, value); ++}) ++ ++(define_insn "*insv_reg" ++ [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand" "+r") ++ (match_operand 1 "const_int_operand" "n") ++ (match_operand 2 "const_int_operand" "n")) ++ (match_operand:GPI 3 "register_operand" "r"))] ++ "!(UINTVAL (operands[1]) == 0 ++ || (UINTVAL (operands[2]) + UINTVAL (operands[1]) ++ > GET_MODE_BITSIZE (mode)))" ++ "bfi\\t%0, %3, %2, %1" ++ [(set_attr "v8type" "bfm") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "*extr_insv_lower_reg" ++ [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand" "+r") ++ (match_operand 1 "const_int_operand" "n") ++ (const_int 0)) ++ (zero_extract:GPI (match_operand:GPI 2 "register_operand" "+r") ++ (match_dup 1) ++ (match_operand 3 "const_int_operand" "n")))] ++ "!(UINTVAL (operands[1]) == 0 ++ || (UINTVAL (operands[3]) + UINTVAL (operands[1]) ++ > GET_MODE_BITSIZE (mode)))" ++ "bfxil\\t%0, %2, %3, %1" ++ [(set_attr "v8type" "bfm") ++ (set_attr "mode" "")] ++) ++ + (define_insn "*_shft_" + [(set (match_operand:GPI 0 "register_operand" "=r") + (ashift:GPI (ANY_EXTEND:GPI +@@ -3090,6 +3593,27 @@ + (set_attr "mode" "")] + ) + ++(define_insn "aarch64_frecp" ++ [(set (match_operand:GPF 0 "register_operand" "=w") ++ (unspec:GPF [(match_operand:GPF 1 "register_operand" "w")] ++ FRECP))] ++ "TARGET_FLOAT" ++ "frecp\\t%0, %1" ++ [(set_attr "v8type" "frecp") ++ (set_attr "mode" "")] ++) ++ ++(define_insn "aarch64_frecps" ++ [(set (match_operand:GPF 0 "register_operand" "=w") ++ (unspec:GPF [(match_operand:GPF 1 "register_operand" "w") ++ (match_operand:GPF 2 "register_operand" "w")] ++ UNSPEC_FRECPS))] ++ "TARGET_FLOAT" ++ "frecps\\t%0, %1, %2" ++ [(set_attr "v8type" "frecps") ++ (set_attr "mode" "")] ++) ++ + ;; ------------------------------------------------------------------- + ;; Reload support + ;; ------------------------------------------------------------------- +@@ -3146,9 +3670,9 @@ + ;; after or during reload as we don't want these patterns to start + ;; kicking in during the combiner. + +-(define_insn "aarch64_movdi_tilow" ++(define_insn "aarch64_movdi_low" + [(set (match_operand:DI 0 "register_operand" "=r") +- (truncate:DI (match_operand:TI 1 "register_operand" "w")))] ++ (truncate:DI (match_operand:TX 1 "register_operand" "w")))] + "reload_completed || reload_in_progress" + "fmov\\t%x0, %d1" + [(set_attr "v8type" "fmovf2i") +@@ -3156,10 +3680,10 @@ + (set_attr "length" "4") + ]) + +-(define_insn "aarch64_movdi_tihigh" ++(define_insn "aarch64_movdi_high" + [(set (match_operand:DI 0 "register_operand" "=r") + (truncate:DI +- (lshiftrt:TI (match_operand:TI 1 "register_operand" "w") ++ (lshiftrt:TX (match_operand:TX 1 "register_operand" "w") + (const_int 64))))] + "reload_completed || reload_in_progress" + "fmov\\t%x0, %1.d[1]" +@@ -3168,24 +3692,22 @@ + (set_attr "length" "4") + ]) + +-(define_insn "aarch64_movtihigh_di" +- [(set (zero_extract:TI (match_operand:TI 0 "register_operand" "+w") ++(define_insn "aarch64_movhigh_di" ++ [(set (zero_extract:TX (match_operand:TX 0 "register_operand" "+w") + (const_int 64) (const_int 64)) +- (zero_extend:TI (match_operand:DI 1 "register_operand" "r")))] ++ (zero_extend:TX (match_operand:DI 1 "register_operand" "r")))] + "reload_completed || reload_in_progress" + "fmov\\t%0.d[1], %x1" +- + [(set_attr "v8type" "fmovi2f") + (set_attr "mode" "DI") + (set_attr "length" "4") + ]) + +-(define_insn "aarch64_movtilow_di" +- [(set (match_operand:TI 0 "register_operand" "=w") +- (zero_extend:TI (match_operand:DI 1 "register_operand" "r")))] ++(define_insn "aarch64_movlow_di" ++ [(set (match_operand:TX 0 "register_operand" "=w") ++ (zero_extend:TX (match_operand:DI 1 "register_operand" "r")))] + "reload_completed || reload_in_progress" + "fmov\\t%d0, %x1" +- + [(set_attr "v8type" "fmovi2f") + (set_attr "mode" "DI") + (set_attr "length" "4") +@@ -3197,7 +3719,6 @@ + (truncate:DI (match_operand:TI 1 "register_operand" "w"))))] + "reload_completed || reload_in_progress" + "fmov\\t%d0, %d1" +- + [(set_attr "v8type" "fmovi2f") + (set_attr "mode" "DI") + (set_attr "length" "4") +@@ -3231,6 +3752,16 @@ + (set_attr "mode" "DI")] + ) + ++(define_insn "ldr_got_tiny" ++ [(set (match_operand:DI 0 "register_operand" "=r") ++ (unspec:DI [(match_operand:DI 1 "aarch64_valid_symref" "S")] ++ UNSPEC_GOTTINYPIC))] ++ "" ++ "ldr\\t%0, %L1" ++ [(set_attr "v8type" "load1") ++ (set_attr "mode" "DI")] ++) ++ + (define_insn "aarch64_load_tp_hard" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec:DI [(const_int 0)] UNSPEC_TLS))] +--- a/src/gcc/config/aarch64/aarch64-option-extensions.def ++++ b/src/gcc/config/aarch64/aarch64-option-extensions.def +@@ -35,3 +35,4 @@ + AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, AARCH64_FL_FPSIMD | AARCH64_FL_CRYPTO) + AARCH64_OPT_EXTENSION("simd", AARCH64_FL_FPSIMD, AARCH64_FL_SIMD | AARCH64_FL_CRYPTO) + AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO | AARCH64_FL_FPSIMD, AARCH64_FL_CRYPTO) ++AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, AARCH64_FL_CRC) +--- a/src/gcc/config/aarch64/aarch64-builtins.c ++++ b/src/gcc/config/aarch64/aarch64-builtins.c +@@ -30,6 +30,7 @@ + #include "langhooks.h" + #include "diagnostic-core.h" + #include "optabs.h" ++#include "gimple.h" + + enum aarch64_simd_builtin_type_mode + { +@@ -50,6 +51,7 @@ + T_OI, + T_XI, + T_SI, ++ T_SF, + T_HI, + T_QI, + T_MAX +@@ -72,172 +74,251 @@ + #define oi_UP T_OI + #define xi_UP T_XI + #define si_UP T_SI ++#define sf_UP T_SF + #define hi_UP T_HI + #define qi_UP T_QI + + #define UP(X) X##_UP + +-typedef enum ++#define SIMD_MAX_BUILTIN_ARGS 5 ++ ++enum aarch64_type_qualifiers + { +- AARCH64_SIMD_BINOP, +- AARCH64_SIMD_TERNOP, +- AARCH64_SIMD_QUADOP, +- AARCH64_SIMD_UNOP, +- AARCH64_SIMD_GETLANE, +- AARCH64_SIMD_SETLANE, +- AARCH64_SIMD_CREATE, +- AARCH64_SIMD_DUP, +- AARCH64_SIMD_DUPLANE, +- AARCH64_SIMD_COMBINE, +- AARCH64_SIMD_SPLIT, +- AARCH64_SIMD_LANEMUL, +- AARCH64_SIMD_LANEMULL, +- AARCH64_SIMD_LANEMULH, +- AARCH64_SIMD_LANEMAC, +- AARCH64_SIMD_SCALARMUL, +- AARCH64_SIMD_SCALARMULL, +- AARCH64_SIMD_SCALARMULH, +- AARCH64_SIMD_SCALARMAC, +- AARCH64_SIMD_CONVERT, +- AARCH64_SIMD_FIXCONV, +- AARCH64_SIMD_SELECT, +- AARCH64_SIMD_RESULTPAIR, +- AARCH64_SIMD_REINTERP, +- AARCH64_SIMD_VTBL, +- AARCH64_SIMD_VTBX, +- AARCH64_SIMD_LOAD1, +- AARCH64_SIMD_LOAD1LANE, +- AARCH64_SIMD_STORE1, +- AARCH64_SIMD_STORE1LANE, +- AARCH64_SIMD_LOADSTRUCT, +- AARCH64_SIMD_LOADSTRUCTLANE, +- AARCH64_SIMD_STORESTRUCT, +- AARCH64_SIMD_STORESTRUCTLANE, +- AARCH64_SIMD_LOGICBINOP, +- AARCH64_SIMD_SHIFTINSERT, +- AARCH64_SIMD_SHIFTIMM, +- AARCH64_SIMD_SHIFTACC +-} aarch64_simd_itype; ++ /* T foo. */ ++ qualifier_none = 0x0, ++ /* unsigned T foo. */ ++ qualifier_unsigned = 0x1, /* 1 << 0 */ ++ /* const T foo. */ ++ qualifier_const = 0x2, /* 1 << 1 */ ++ /* T *foo. */ ++ qualifier_pointer = 0x4, /* 1 << 2 */ ++ /* const T *foo. */ ++ qualifier_const_pointer = 0x6, /* qualifier_const | qualifier_pointer */ ++ /* Used when expanding arguments if an operand could ++ be an immediate. */ ++ qualifier_immediate = 0x8, /* 1 << 3 */ ++ qualifier_maybe_immediate = 0x10, /* 1 << 4 */ ++ /* void foo (...). */ ++ qualifier_void = 0x20, /* 1 << 5 */ ++ /* Some patterns may have internal operands, this qualifier is an ++ instruction to the initialisation code to skip this operand. */ ++ qualifier_internal = 0x40, /* 1 << 6 */ ++ /* Some builtins should use the T_*mode* encoded in a simd_builtin_datum ++ rather than using the type of the operand. */ ++ qualifier_map_mode = 0x80, /* 1 << 7 */ ++ /* qualifier_pointer | qualifier_map_mode */ ++ qualifier_pointer_map_mode = 0x84, ++ /* qualifier_const_pointer | qualifier_map_mode */ ++ qualifier_const_pointer_map_mode = 0x86, ++ /* Polynomial types. */ ++ qualifier_poly = 0x100 ++}; + + typedef struct + { + const char *name; +- const aarch64_simd_itype itype; + enum aarch64_simd_builtin_type_mode mode; + const enum insn_code code; + unsigned int fcode; ++ enum aarch64_type_qualifiers *qualifiers; + } aarch64_simd_builtin_datum; + +-#define CF(N, X) CODE_FOR_aarch64_##N##X ++static enum aarch64_type_qualifiers ++aarch64_types_unop_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none }; ++#define TYPES_UNOP (aarch64_types_unop_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_unopu_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_unsigned, qualifier_unsigned }; ++#define TYPES_UNOPU (aarch64_types_unopu_qualifiers) ++#define TYPES_CREATE (aarch64_types_unop_qualifiers) ++#define TYPES_REINTERP (aarch64_types_unop_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_binop_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_maybe_immediate }; ++#define TYPES_BINOP (aarch64_types_binop_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_binopu_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned }; ++#define TYPES_BINOPU (aarch64_types_binopu_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_binopp_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_poly, qualifier_poly, qualifier_poly }; ++#define TYPES_BINOPP (aarch64_types_binopp_qualifiers) + +-#define VAR1(T, N, A) \ +- {#N, AARCH64_SIMD_##T, UP (A), CF (N, A), 0}, +-#define VAR2(T, N, A, B) \ +- VAR1 (T, N, A) \ +- VAR1 (T, N, B) +-#define VAR3(T, N, A, B, C) \ +- VAR2 (T, N, A, B) \ +- VAR1 (T, N, C) +-#define VAR4(T, N, A, B, C, D) \ +- VAR3 (T, N, A, B, C) \ +- VAR1 (T, N, D) +-#define VAR5(T, N, A, B, C, D, E) \ +- VAR4 (T, N, A, B, C, D) \ +- VAR1 (T, N, E) +-#define VAR6(T, N, A, B, C, D, E, F) \ +- VAR5 (T, N, A, B, C, D, E) \ +- VAR1 (T, N, F) +-#define VAR7(T, N, A, B, C, D, E, F, G) \ +- VAR6 (T, N, A, B, C, D, E, F) \ +- VAR1 (T, N, G) +-#define VAR8(T, N, A, B, C, D, E, F, G, H) \ +- VAR7 (T, N, A, B, C, D, E, F, G) \ +- VAR1 (T, N, H) +-#define VAR9(T, N, A, B, C, D, E, F, G, H, I) \ +- VAR8 (T, N, A, B, C, D, E, F, G, H) \ +- VAR1 (T, N, I) +-#define VAR10(T, N, A, B, C, D, E, F, G, H, I, J) \ +- VAR9 (T, N, A, B, C, D, E, F, G, H, I) \ +- VAR1 (T, N, J) +-#define VAR11(T, N, A, B, C, D, E, F, G, H, I, J, K) \ +- VAR10 (T, N, A, B, C, D, E, F, G, H, I, J) \ +- VAR1 (T, N, K) +-#define VAR12(T, N, A, B, C, D, E, F, G, H, I, J, K, L) \ +- VAR11 (T, N, A, B, C, D, E, F, G, H, I, J, K) \ +- VAR1 (T, N, L) ++static enum aarch64_type_qualifiers ++aarch64_types_ternop_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_none, qualifier_none }; ++#define TYPES_TERNOP (aarch64_types_ternop_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_ternopu_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_unsigned, qualifier_unsigned, ++ qualifier_unsigned, qualifier_unsigned }; ++#define TYPES_TERNOPU (aarch64_types_ternopu_qualifiers) + ++static enum aarch64_type_qualifiers ++aarch64_types_quadop_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_none, ++ qualifier_none, qualifier_none }; ++#define TYPES_QUADOP (aarch64_types_quadop_qualifiers) ++ ++static enum aarch64_type_qualifiers ++aarch64_types_getlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_immediate }; ++#define TYPES_GETLANE (aarch64_types_getlane_qualifiers) ++#define TYPES_SHIFTIMM (aarch64_types_getlane_qualifiers) ++static enum aarch64_type_qualifiers ++aarch64_types_setlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_none, qualifier_immediate }; ++#define TYPES_SETLANE (aarch64_types_setlane_qualifiers) ++#define TYPES_SHIFTINSERT (aarch64_types_setlane_qualifiers) ++#define TYPES_SHIFTACC (aarch64_types_setlane_qualifiers) ++ ++static enum aarch64_type_qualifiers ++aarch64_types_combine_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_none, qualifier_none }; ++#define TYPES_COMBINE (aarch64_types_combine_qualifiers) ++ ++static enum aarch64_type_qualifiers ++aarch64_types_load1_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_none, qualifier_const_pointer_map_mode }; ++#define TYPES_LOAD1 (aarch64_types_load1_qualifiers) ++#define TYPES_LOADSTRUCT (aarch64_types_load1_qualifiers) ++ ++/* The first argument (return type) of a store should be void type, ++ which we represent with qualifier_void. Their first operand will be ++ a DImode pointer to the location to store to, so we must use ++ qualifier_map_mode | qualifier_pointer to build a pointer to the ++ element type of the vector. */ ++static enum aarch64_type_qualifiers ++aarch64_types_store1_qualifiers[SIMD_MAX_BUILTIN_ARGS] ++ = { qualifier_void, qualifier_pointer_map_mode, qualifier_none }; ++#define TYPES_STORE1 (aarch64_types_store1_qualifiers) ++#define TYPES_STORESTRUCT (aarch64_types_store1_qualifiers) ++ ++#define CF0(N, X) CODE_FOR_aarch64_##N##X ++#define CF1(N, X) CODE_FOR_##N##X##1 ++#define CF2(N, X) CODE_FOR_##N##X##2 ++#define CF3(N, X) CODE_FOR_##N##X##3 ++#define CF4(N, X) CODE_FOR_##N##X##4 ++#define CF10(N, X) CODE_FOR_##N##X ++ ++#define VAR1(T, N, MAP, A) \ ++ {#N, UP (A), CF##MAP (N, A), 0, TYPES_##T}, ++#define VAR2(T, N, MAP, A, B) \ ++ VAR1 (T, N, MAP, A) \ ++ VAR1 (T, N, MAP, B) ++#define VAR3(T, N, MAP, A, B, C) \ ++ VAR2 (T, N, MAP, A, B) \ ++ VAR1 (T, N, MAP, C) ++#define VAR4(T, N, MAP, A, B, C, D) \ ++ VAR3 (T, N, MAP, A, B, C) \ ++ VAR1 (T, N, MAP, D) ++#define VAR5(T, N, MAP, A, B, C, D, E) \ ++ VAR4 (T, N, MAP, A, B, C, D) \ ++ VAR1 (T, N, MAP, E) ++#define VAR6(T, N, MAP, A, B, C, D, E, F) \ ++ VAR5 (T, N, MAP, A, B, C, D, E) \ ++ VAR1 (T, N, MAP, F) ++#define VAR7(T, N, MAP, A, B, C, D, E, F, G) \ ++ VAR6 (T, N, MAP, A, B, C, D, E, F) \ ++ VAR1 (T, N, MAP, G) ++#define VAR8(T, N, MAP, A, B, C, D, E, F, G, H) \ ++ VAR7 (T, N, MAP, A, B, C, D, E, F, G) \ ++ VAR1 (T, N, MAP, H) ++#define VAR9(T, N, MAP, A, B, C, D, E, F, G, H, I) \ ++ VAR8 (T, N, MAP, A, B, C, D, E, F, G, H) \ ++ VAR1 (T, N, MAP, I) ++#define VAR10(T, N, MAP, A, B, C, D, E, F, G, H, I, J) \ ++ VAR9 (T, N, MAP, A, B, C, D, E, F, G, H, I) \ ++ VAR1 (T, N, MAP, J) ++#define VAR11(T, N, MAP, A, B, C, D, E, F, G, H, I, J, K) \ ++ VAR10 (T, N, MAP, A, B, C, D, E, F, G, H, I, J) \ ++ VAR1 (T, N, MAP, K) ++#define VAR12(T, N, MAP, A, B, C, D, E, F, G, H, I, J, K, L) \ ++ VAR11 (T, N, MAP, A, B, C, D, E, F, G, H, I, J, K) \ ++ VAR1 (T, N, MAP, L) ++ + /* BUILTIN_ macros should expand to cover the same range of + modes as is given for each define_mode_iterator in + config/aarch64/iterators.md. */ + +-#define BUILTIN_DX(T, N) \ +- VAR2 (T, N, di, df) +-#define BUILTIN_SDQ_I(T, N) \ +- VAR4 (T, N, qi, hi, si, di) +-#define BUILTIN_SD_HSI(T, N) \ +- VAR2 (T, N, hi, si) +-#define BUILTIN_V2F(T, N) \ +- VAR2 (T, N, v2sf, v2df) +-#define BUILTIN_VALL(T, N) \ +- VAR10 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, v2sf, v4sf, v2df) +-#define BUILTIN_VB(T, N) \ +- VAR2 (T, N, v8qi, v16qi) +-#define BUILTIN_VD(T, N) \ +- VAR4 (T, N, v8qi, v4hi, v2si, v2sf) +-#define BUILTIN_VDC(T, N) \ +- VAR6 (T, N, v8qi, v4hi, v2si, v2sf, di, df) +-#define BUILTIN_VDIC(T, N) \ +- VAR3 (T, N, v8qi, v4hi, v2si) +-#define BUILTIN_VDN(T, N) \ +- VAR3 (T, N, v4hi, v2si, di) +-#define BUILTIN_VDQ(T, N) \ +- VAR7 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di) +-#define BUILTIN_VDQF(T, N) \ +- VAR3 (T, N, v2sf, v4sf, v2df) +-#define BUILTIN_VDQHS(T, N) \ +- VAR4 (T, N, v4hi, v8hi, v2si, v4si) +-#define BUILTIN_VDQIF(T, N) \ +- VAR9 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2sf, v4sf, v2df) +-#define BUILTIN_VDQM(T, N) \ +- VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si) +-#define BUILTIN_VDQV(T, N) \ +- VAR5 (T, N, v8qi, v16qi, v4hi, v8hi, v4si) +-#define BUILTIN_VDQ_BHSI(T, N) \ +- VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si) +-#define BUILTIN_VDQ_I(T, N) \ +- VAR7 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di) +-#define BUILTIN_VDW(T, N) \ +- VAR3 (T, N, v8qi, v4hi, v2si) +-#define BUILTIN_VD_BHSI(T, N) \ +- VAR3 (T, N, v8qi, v4hi, v2si) +-#define BUILTIN_VD_HSI(T, N) \ +- VAR2 (T, N, v4hi, v2si) +-#define BUILTIN_VD_RE(T, N) \ +- VAR6 (T, N, v8qi, v4hi, v2si, v2sf, di, df) +-#define BUILTIN_VQ(T, N) \ +- VAR6 (T, N, v16qi, v8hi, v4si, v2di, v4sf, v2df) +-#define BUILTIN_VQN(T, N) \ +- VAR3 (T, N, v8hi, v4si, v2di) +-#define BUILTIN_VQW(T, N) \ +- VAR3 (T, N, v16qi, v8hi, v4si) +-#define BUILTIN_VQ_HSI(T, N) \ +- VAR2 (T, N, v8hi, v4si) +-#define BUILTIN_VQ_S(T, N) \ +- VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si) +-#define BUILTIN_VSDQ_HSI(T, N) \ +- VAR6 (T, N, v4hi, v8hi, v2si, v4si, hi, si) +-#define BUILTIN_VSDQ_I(T, N) \ +- VAR11 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si, di) +-#define BUILTIN_VSDQ_I_BHSI(T, N) \ +- VAR10 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si) +-#define BUILTIN_VSDQ_I_DI(T, N) \ +- VAR8 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, di) +-#define BUILTIN_VSD_HSI(T, N) \ +- VAR4 (T, N, v4hi, v2si, hi, si) +-#define BUILTIN_VSQN_HSDI(T, N) \ +- VAR6 (T, N, v8hi, v4si, v2di, hi, si, di) +-#define BUILTIN_VSTRUCT(T, N) \ +- VAR3 (T, N, oi, ci, xi) ++#define BUILTIN_DX(T, N, MAP) \ ++ VAR2 (T, N, MAP, di, df) ++#define BUILTIN_GPF(T, N, MAP) \ ++ VAR2 (T, N, MAP, sf, df) ++#define BUILTIN_SDQ_I(T, N, MAP) \ ++ VAR4 (T, N, MAP, qi, hi, si, di) ++#define BUILTIN_SD_HSI(T, N, MAP) \ ++ VAR2 (T, N, MAP, hi, si) ++#define BUILTIN_V2F(T, N, MAP) \ ++ VAR2 (T, N, MAP, v2sf, v2df) ++#define BUILTIN_VALL(T, N, MAP) \ ++ VAR10 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, \ ++ v4si, v2di, v2sf, v4sf, v2df) ++#define BUILTIN_VALLDI(T, N, MAP) \ ++ VAR11 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, \ ++ v4si, v2di, v2sf, v4sf, v2df, di) ++#define BUILTIN_VB(T, N, MAP) \ ++ VAR2 (T, N, MAP, v8qi, v16qi) ++#define BUILTIN_VD(T, N, MAP) \ ++ VAR4 (T, N, MAP, v8qi, v4hi, v2si, v2sf) ++#define BUILTIN_VDC(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8qi, v4hi, v2si, v2sf, di, df) ++#define BUILTIN_VDIC(T, N, MAP) \ ++ VAR3 (T, N, MAP, v8qi, v4hi, v2si) ++#define BUILTIN_VDN(T, N, MAP) \ ++ VAR3 (T, N, MAP, v4hi, v2si, di) ++#define BUILTIN_VDQ(T, N, MAP) \ ++ VAR7 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di) ++#define BUILTIN_VDQF(T, N, MAP) \ ++ VAR3 (T, N, MAP, v2sf, v4sf, v2df) ++#define BUILTIN_VDQH(T, N, MAP) \ ++ VAR2 (T, N, MAP, v4hi, v8hi) ++#define BUILTIN_VDQHS(T, N, MAP) \ ++ VAR4 (T, N, MAP, v4hi, v8hi, v2si, v4si) ++#define BUILTIN_VDQIF(T, N, MAP) \ ++ VAR9 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2sf, v4sf, v2df) ++#define BUILTIN_VDQM(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si) ++#define BUILTIN_VDQV(T, N, MAP) \ ++ VAR5 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v4si) ++#define BUILTIN_VDQ_BHSI(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si) ++#define BUILTIN_VDQ_I(T, N, MAP) \ ++ VAR7 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di) ++#define BUILTIN_VDW(T, N, MAP) \ ++ VAR3 (T, N, MAP, v8qi, v4hi, v2si) ++#define BUILTIN_VD_BHSI(T, N, MAP) \ ++ VAR3 (T, N, MAP, v8qi, v4hi, v2si) ++#define BUILTIN_VD_HSI(T, N, MAP) \ ++ VAR2 (T, N, MAP, v4hi, v2si) ++#define BUILTIN_VD_RE(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8qi, v4hi, v2si, v2sf, di, df) ++#define BUILTIN_VQ(T, N, MAP) \ ++ VAR6 (T, N, MAP, v16qi, v8hi, v4si, v2di, v4sf, v2df) ++#define BUILTIN_VQN(T, N, MAP) \ ++ VAR3 (T, N, MAP, v8hi, v4si, v2di) ++#define BUILTIN_VQW(T, N, MAP) \ ++ VAR3 (T, N, MAP, v16qi, v8hi, v4si) ++#define BUILTIN_VQ_HSI(T, N, MAP) \ ++ VAR2 (T, N, MAP, v8hi, v4si) ++#define BUILTIN_VQ_S(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si) ++#define BUILTIN_VSDQ_HSI(T, N, MAP) \ ++ VAR6 (T, N, MAP, v4hi, v8hi, v2si, v4si, hi, si) ++#define BUILTIN_VSDQ_I(T, N, MAP) \ ++ VAR11 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si, di) ++#define BUILTIN_VSDQ_I_BHSI(T, N, MAP) \ ++ VAR10 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si) ++#define BUILTIN_VSDQ_I_DI(T, N, MAP) \ ++ VAR8 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, di) ++#define BUILTIN_VSD_HSI(T, N, MAP) \ ++ VAR4 (T, N, MAP, v4hi, v2si, hi, si) ++#define BUILTIN_VSQN_HSDI(T, N, MAP) \ ++ VAR6 (T, N, MAP, v8hi, v4si, v2di, hi, si, di) ++#define BUILTIN_VSTRUCT(T, N, MAP) \ ++ VAR3 (T, N, MAP, oi, ci, xi) + + static aarch64_simd_builtin_datum aarch64_simd_builtin_data[] = { + #include "aarch64-simd-builtins.def" +@@ -244,8 +325,8 @@ + }; + + #undef VAR1 +-#define VAR1(T, N, A) \ +- AARCH64_SIMD_BUILTIN_##N##A, ++#define VAR1(T, N, MAP, A) \ ++ AARCH64_SIMD_BUILTIN_##T##_##N##A, + + enum aarch64_builtins + { +@@ -257,171 +338,218 @@ + AARCH64_BUILTIN_MAX + }; + +-#undef BUILTIN_DX +-#undef BUILTIN_SDQ_I +-#undef BUILTIN_SD_HSI +-#undef BUILTIN_V2F +-#undef BUILTIN_VALL +-#undef BUILTIN_VB +-#undef BUILTIN_VD +-#undef BUILTIN_VDC +-#undef BUILTIN_VDIC +-#undef BUILTIN_VDN +-#undef BUILTIN_VDQ +-#undef BUILTIN_VDQF +-#undef BUILTIN_VDQHS +-#undef BUILTIN_VDQIF +-#undef BUILTIN_VDQM +-#undef BUILTIN_VDQV +-#undef BUILTIN_VDQ_BHSI +-#undef BUILTIN_VDQ_I +-#undef BUILTIN_VDW +-#undef BUILTIN_VD_BHSI +-#undef BUILTIN_VD_HSI +-#undef BUILTIN_VD_RE +-#undef BUILTIN_VQ +-#undef BUILTIN_VQN +-#undef BUILTIN_VQW +-#undef BUILTIN_VQ_HSI +-#undef BUILTIN_VQ_S +-#undef BUILTIN_VSDQ_HSI +-#undef BUILTIN_VSDQ_I +-#undef BUILTIN_VSDQ_I_BHSI +-#undef BUILTIN_VSDQ_I_DI +-#undef BUILTIN_VSD_HSI +-#undef BUILTIN_VSQN_HSDI +-#undef BUILTIN_VSTRUCT +-#undef CF +-#undef VAR1 +-#undef VAR2 +-#undef VAR3 +-#undef VAR4 +-#undef VAR5 +-#undef VAR6 +-#undef VAR7 +-#undef VAR8 +-#undef VAR9 +-#undef VAR10 +-#undef VAR11 +- + static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX]; + + #define NUM_DREG_TYPES 6 + #define NUM_QREG_TYPES 6 + +-static void +-aarch64_init_simd_builtins (void) ++/* Return a tree for a signed or unsigned argument of either ++ the mode specified by MODE, or the inner mode of MODE. */ ++tree ++aarch64_build_scalar_type (enum machine_mode mode, ++ bool unsigned_p, ++ bool poly_p) + { +- unsigned int i, fcode = AARCH64_SIMD_BUILTIN_BASE + 1; ++#undef INT_TYPES ++#define INT_TYPES \ ++ AARCH64_TYPE_BUILDER (QI) \ ++ AARCH64_TYPE_BUILDER (HI) \ ++ AARCH64_TYPE_BUILDER (SI) \ ++ AARCH64_TYPE_BUILDER (DI) \ ++ AARCH64_TYPE_BUILDER (EI) \ ++ AARCH64_TYPE_BUILDER (OI) \ ++ AARCH64_TYPE_BUILDER (CI) \ ++ AARCH64_TYPE_BUILDER (XI) \ ++ AARCH64_TYPE_BUILDER (TI) \ + +- /* Scalar type nodes. */ +- tree aarch64_simd_intQI_type_node; +- tree aarch64_simd_intHI_type_node; +- tree aarch64_simd_polyQI_type_node; +- tree aarch64_simd_polyHI_type_node; +- tree aarch64_simd_intSI_type_node; +- tree aarch64_simd_intDI_type_node; +- tree aarch64_simd_float_type_node; +- tree aarch64_simd_double_type_node; ++/* Statically declare all the possible types we might need. */ ++#undef AARCH64_TYPE_BUILDER ++#define AARCH64_TYPE_BUILDER(X) \ ++ static tree X##_aarch64_type_node_p = NULL; \ ++ static tree X##_aarch64_type_node_s = NULL; \ ++ static tree X##_aarch64_type_node_u = NULL; + +- /* Pointer to scalar type nodes. */ +- tree intQI_pointer_node; +- tree intHI_pointer_node; +- tree intSI_pointer_node; +- tree intDI_pointer_node; +- tree float_pointer_node; +- tree double_pointer_node; ++ INT_TYPES + +- /* Const scalar type nodes. */ +- tree const_intQI_node; +- tree const_intHI_node; +- tree const_intSI_node; +- tree const_intDI_node; +- tree const_float_node; +- tree const_double_node; ++ static tree float_aarch64_type_node = NULL; ++ static tree double_aarch64_type_node = NULL; + +- /* Pointer to const scalar type nodes. */ +- tree const_intQI_pointer_node; +- tree const_intHI_pointer_node; +- tree const_intSI_pointer_node; +- tree const_intDI_pointer_node; +- tree const_float_pointer_node; +- tree const_double_pointer_node; ++ gcc_assert (!VECTOR_MODE_P (mode)); + +- /* Vector type nodes. */ +- tree V8QI_type_node; +- tree V4HI_type_node; +- tree V2SI_type_node; +- tree V2SF_type_node; +- tree V16QI_type_node; +- tree V8HI_type_node; +- tree V4SI_type_node; +- tree V4SF_type_node; +- tree V2DI_type_node; +- tree V2DF_type_node; ++/* If we've already initialised this type, don't initialise it again, ++ otherwise ask for a new type of the correct size. */ ++#undef AARCH64_TYPE_BUILDER ++#define AARCH64_TYPE_BUILDER(X) \ ++ case X##mode: \ ++ if (unsigned_p) \ ++ return (X##_aarch64_type_node_u \ ++ ? X##_aarch64_type_node_u \ ++ : X##_aarch64_type_node_u \ ++ = make_unsigned_type (GET_MODE_PRECISION (mode))); \ ++ else if (poly_p) \ ++ return (X##_aarch64_type_node_p \ ++ ? X##_aarch64_type_node_p \ ++ : X##_aarch64_type_node_p \ ++ = make_unsigned_type (GET_MODE_PRECISION (mode))); \ ++ else \ ++ return (X##_aarch64_type_node_s \ ++ ? X##_aarch64_type_node_s \ ++ : X##_aarch64_type_node_s \ ++ = make_signed_type (GET_MODE_PRECISION (mode))); \ ++ break; + +- /* Scalar unsigned type nodes. */ +- tree intUQI_type_node; +- tree intUHI_type_node; +- tree intUSI_type_node; +- tree intUDI_type_node; ++ switch (mode) ++ { ++ INT_TYPES ++ case SFmode: ++ if (!float_aarch64_type_node) ++ { ++ float_aarch64_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (float_aarch64_type_node) = FLOAT_TYPE_SIZE; ++ layout_type (float_aarch64_type_node); ++ } ++ return float_aarch64_type_node; ++ break; ++ case DFmode: ++ if (!double_aarch64_type_node) ++ { ++ double_aarch64_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (double_aarch64_type_node) = DOUBLE_TYPE_SIZE; ++ layout_type (double_aarch64_type_node); ++ } ++ return double_aarch64_type_node; ++ break; ++ default: ++ gcc_unreachable (); ++ } ++} + +- /* Opaque integer types for structures of vectors. */ +- tree intEI_type_node; +- tree intOI_type_node; +- tree intCI_type_node; +- tree intXI_type_node; ++tree ++aarch64_build_vector_type (enum machine_mode mode, ++ bool unsigned_p, ++ bool poly_p) ++{ ++ tree eltype; + +- /* Pointer to vector type nodes. */ +- tree V8QI_pointer_node; +- tree V4HI_pointer_node; +- tree V2SI_pointer_node; +- tree V2SF_pointer_node; +- tree V16QI_pointer_node; +- tree V8HI_pointer_node; +- tree V4SI_pointer_node; +- tree V4SF_pointer_node; +- tree V2DI_pointer_node; +- tree V2DF_pointer_node; ++#define VECTOR_TYPES \ ++ AARCH64_TYPE_BUILDER (V16QI) \ ++ AARCH64_TYPE_BUILDER (V8HI) \ ++ AARCH64_TYPE_BUILDER (V4SI) \ ++ AARCH64_TYPE_BUILDER (V2DI) \ ++ AARCH64_TYPE_BUILDER (V8QI) \ ++ AARCH64_TYPE_BUILDER (V4HI) \ ++ AARCH64_TYPE_BUILDER (V2SI) \ ++ \ ++ AARCH64_TYPE_BUILDER (V4SF) \ ++ AARCH64_TYPE_BUILDER (V2DF) \ ++ AARCH64_TYPE_BUILDER (V2SF) \ ++/* Declare our "cache" of values. */ ++#undef AARCH64_TYPE_BUILDER ++#define AARCH64_TYPE_BUILDER(X) \ ++ static tree X##_aarch64_type_node_s = NULL; \ ++ static tree X##_aarch64_type_node_u = NULL; \ ++ static tree X##_aarch64_type_node_p = NULL; + +- /* Operations which return results as pairs. */ +- tree void_ftype_pv8qi_v8qi_v8qi; +- tree void_ftype_pv4hi_v4hi_v4hi; +- tree void_ftype_pv2si_v2si_v2si; +- tree void_ftype_pv2sf_v2sf_v2sf; +- tree void_ftype_pdi_di_di; +- tree void_ftype_pv16qi_v16qi_v16qi; +- tree void_ftype_pv8hi_v8hi_v8hi; +- tree void_ftype_pv4si_v4si_v4si; +- tree void_ftype_pv4sf_v4sf_v4sf; +- tree void_ftype_pv2di_v2di_v2di; +- tree void_ftype_pv2df_v2df_v2df; ++ VECTOR_TYPES + +- tree reinterp_ftype_dreg[NUM_DREG_TYPES][NUM_DREG_TYPES]; +- tree reinterp_ftype_qreg[NUM_QREG_TYPES][NUM_QREG_TYPES]; +- tree dreg_types[NUM_DREG_TYPES], qreg_types[NUM_QREG_TYPES]; ++ gcc_assert (VECTOR_MODE_P (mode)); + +- /* Create distinguished type nodes for AARCH64_SIMD vector element types, +- and pointers to values of such types, so we can detect them later. */ +- aarch64_simd_intQI_type_node = +- make_signed_type (GET_MODE_PRECISION (QImode)); +- aarch64_simd_intHI_type_node = +- make_signed_type (GET_MODE_PRECISION (HImode)); +- aarch64_simd_polyQI_type_node = +- make_signed_type (GET_MODE_PRECISION (QImode)); +- aarch64_simd_polyHI_type_node = +- make_signed_type (GET_MODE_PRECISION (HImode)); +- aarch64_simd_intSI_type_node = +- make_signed_type (GET_MODE_PRECISION (SImode)); +- aarch64_simd_intDI_type_node = +- make_signed_type (GET_MODE_PRECISION (DImode)); +- aarch64_simd_float_type_node = make_node (REAL_TYPE); +- aarch64_simd_double_type_node = make_node (REAL_TYPE); +- TYPE_PRECISION (aarch64_simd_float_type_node) = FLOAT_TYPE_SIZE; +- TYPE_PRECISION (aarch64_simd_double_type_node) = DOUBLE_TYPE_SIZE; +- layout_type (aarch64_simd_float_type_node); +- layout_type (aarch64_simd_double_type_node); ++#undef AARCH64_TYPE_BUILDER ++#define AARCH64_TYPE_BUILDER(X) \ ++ case X##mode: \ ++ if (unsigned_p) \ ++ return X##_aarch64_type_node_u \ ++ ? X##_aarch64_type_node_u \ ++ : X##_aarch64_type_node_u \ ++ = build_vector_type_for_mode (aarch64_build_scalar_type \ ++ (GET_MODE_INNER (mode), \ ++ unsigned_p, poly_p), mode); \ ++ else if (poly_p) \ ++ return X##_aarch64_type_node_p \ ++ ? X##_aarch64_type_node_p \ ++ : X##_aarch64_type_node_p \ ++ = build_vector_type_for_mode (aarch64_build_scalar_type \ ++ (GET_MODE_INNER (mode), \ ++ unsigned_p, poly_p), mode); \ ++ else \ ++ return X##_aarch64_type_node_s \ ++ ? X##_aarch64_type_node_s \ ++ : X##_aarch64_type_node_s \ ++ = build_vector_type_for_mode (aarch64_build_scalar_type \ ++ (GET_MODE_INNER (mode), \ ++ unsigned_p, poly_p), mode); \ ++ break; + ++ switch (mode) ++ { ++ default: ++ eltype = aarch64_build_scalar_type (GET_MODE_INNER (mode), ++ unsigned_p, poly_p); ++ return build_vector_type_for_mode (eltype, mode); ++ break; ++ VECTOR_TYPES ++ } ++} ++ ++tree ++aarch64_build_type (enum machine_mode mode, bool unsigned_p, bool poly_p) ++{ ++ if (VECTOR_MODE_P (mode)) ++ return aarch64_build_vector_type (mode, unsigned_p, poly_p); ++ else ++ return aarch64_build_scalar_type (mode, unsigned_p, poly_p); ++} ++ ++tree ++aarch64_build_signed_type (enum machine_mode mode) ++{ ++ return aarch64_build_type (mode, false, false); ++} ++ ++tree ++aarch64_build_unsigned_type (enum machine_mode mode) ++{ ++ return aarch64_build_type (mode, true, false); ++} ++ ++tree ++aarch64_build_poly_type (enum machine_mode mode) ++{ ++ return aarch64_build_type (mode, false, true); ++} ++ ++static void ++aarch64_init_simd_builtins (void) ++{ ++ unsigned int i, fcode = AARCH64_SIMD_BUILTIN_BASE + 1; ++ ++ /* Signed scalar type nodes. */ ++ tree aarch64_simd_intQI_type_node = aarch64_build_signed_type (QImode); ++ tree aarch64_simd_intHI_type_node = aarch64_build_signed_type (HImode); ++ tree aarch64_simd_intSI_type_node = aarch64_build_signed_type (SImode); ++ tree aarch64_simd_intDI_type_node = aarch64_build_signed_type (DImode); ++ tree aarch64_simd_intTI_type_node = aarch64_build_signed_type (TImode); ++ tree aarch64_simd_intEI_type_node = aarch64_build_signed_type (EImode); ++ tree aarch64_simd_intOI_type_node = aarch64_build_signed_type (OImode); ++ tree aarch64_simd_intCI_type_node = aarch64_build_signed_type (CImode); ++ tree aarch64_simd_intXI_type_node = aarch64_build_signed_type (XImode); ++ ++ /* Unsigned scalar type nodes. */ ++ tree aarch64_simd_intUQI_type_node = aarch64_build_unsigned_type (QImode); ++ tree aarch64_simd_intUHI_type_node = aarch64_build_unsigned_type (HImode); ++ tree aarch64_simd_intUSI_type_node = aarch64_build_unsigned_type (SImode); ++ tree aarch64_simd_intUDI_type_node = aarch64_build_unsigned_type (DImode); ++ ++ /* Poly scalar type nodes. */ ++ tree aarch64_simd_polyQI_type_node = aarch64_build_poly_type (QImode); ++ tree aarch64_simd_polyHI_type_node = aarch64_build_poly_type (HImode); ++ tree aarch64_simd_polyDI_type_node = aarch64_build_poly_type (DImode); ++ tree aarch64_simd_polyTI_type_node = aarch64_build_poly_type (TImode); ++ ++ /* Float type nodes. */ ++ tree aarch64_simd_float_type_node = aarch64_build_signed_type (SFmode); ++ tree aarch64_simd_double_type_node = aarch64_build_signed_type (DFmode); ++ + /* Define typedefs which exactly correspond to the modes we are basing vector + types on. If you change these names you'll need to change + the table used by aarch64_mangle_type too. */ +@@ -441,518 +569,139 @@ + "__builtin_aarch64_simd_poly8"); + (*lang_hooks.types.register_builtin_type) (aarch64_simd_polyHI_type_node, + "__builtin_aarch64_simd_poly16"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_polyDI_type_node, ++ "__builtin_aarch64_simd_poly64"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_polyTI_type_node, ++ "__builtin_aarch64_simd_poly128"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intTI_type_node, ++ "__builtin_aarch64_simd_ti"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intEI_type_node, ++ "__builtin_aarch64_simd_ei"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intOI_type_node, ++ "__builtin_aarch64_simd_oi"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intCI_type_node, ++ "__builtin_aarch64_simd_ci"); ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intXI_type_node, ++ "__builtin_aarch64_simd_xi"); + +- intQI_pointer_node = build_pointer_type (aarch64_simd_intQI_type_node); +- intHI_pointer_node = build_pointer_type (aarch64_simd_intHI_type_node); +- intSI_pointer_node = build_pointer_type (aarch64_simd_intSI_type_node); +- intDI_pointer_node = build_pointer_type (aarch64_simd_intDI_type_node); +- float_pointer_node = build_pointer_type (aarch64_simd_float_type_node); +- double_pointer_node = build_pointer_type (aarch64_simd_double_type_node); +- +- /* Next create constant-qualified versions of the above types. */ +- const_intQI_node = build_qualified_type (aarch64_simd_intQI_type_node, +- TYPE_QUAL_CONST); +- const_intHI_node = build_qualified_type (aarch64_simd_intHI_type_node, +- TYPE_QUAL_CONST); +- const_intSI_node = build_qualified_type (aarch64_simd_intSI_type_node, +- TYPE_QUAL_CONST); +- const_intDI_node = build_qualified_type (aarch64_simd_intDI_type_node, +- TYPE_QUAL_CONST); +- const_float_node = build_qualified_type (aarch64_simd_float_type_node, +- TYPE_QUAL_CONST); +- const_double_node = build_qualified_type (aarch64_simd_double_type_node, +- TYPE_QUAL_CONST); +- +- const_intQI_pointer_node = build_pointer_type (const_intQI_node); +- const_intHI_pointer_node = build_pointer_type (const_intHI_node); +- const_intSI_pointer_node = build_pointer_type (const_intSI_node); +- const_intDI_pointer_node = build_pointer_type (const_intDI_node); +- const_float_pointer_node = build_pointer_type (const_float_node); +- const_double_pointer_node = build_pointer_type (const_double_node); +- +- /* Now create vector types based on our AARCH64 SIMD element types. */ +- /* 64-bit vectors. */ +- V8QI_type_node = +- build_vector_type_for_mode (aarch64_simd_intQI_type_node, V8QImode); +- V4HI_type_node = +- build_vector_type_for_mode (aarch64_simd_intHI_type_node, V4HImode); +- V2SI_type_node = +- build_vector_type_for_mode (aarch64_simd_intSI_type_node, V2SImode); +- V2SF_type_node = +- build_vector_type_for_mode (aarch64_simd_float_type_node, V2SFmode); +- /* 128-bit vectors. */ +- V16QI_type_node = +- build_vector_type_for_mode (aarch64_simd_intQI_type_node, V16QImode); +- V8HI_type_node = +- build_vector_type_for_mode (aarch64_simd_intHI_type_node, V8HImode); +- V4SI_type_node = +- build_vector_type_for_mode (aarch64_simd_intSI_type_node, V4SImode); +- V4SF_type_node = +- build_vector_type_for_mode (aarch64_simd_float_type_node, V4SFmode); +- V2DI_type_node = +- build_vector_type_for_mode (aarch64_simd_intDI_type_node, V2DImode); +- V2DF_type_node = +- build_vector_type_for_mode (aarch64_simd_double_type_node, V2DFmode); +- + /* Unsigned integer types for various mode sizes. */ +- intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode)); +- intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode)); +- intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode)); +- intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode)); +- +- (*lang_hooks.types.register_builtin_type) (intUQI_type_node, ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intUQI_type_node, + "__builtin_aarch64_simd_uqi"); +- (*lang_hooks.types.register_builtin_type) (intUHI_type_node, ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intUHI_type_node, + "__builtin_aarch64_simd_uhi"); +- (*lang_hooks.types.register_builtin_type) (intUSI_type_node, ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intUSI_type_node, + "__builtin_aarch64_simd_usi"); +- (*lang_hooks.types.register_builtin_type) (intUDI_type_node, ++ (*lang_hooks.types.register_builtin_type) (aarch64_simd_intUDI_type_node, + "__builtin_aarch64_simd_udi"); + +- /* Opaque integer types for structures of vectors. */ +- intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode)); +- intOI_type_node = make_signed_type (GET_MODE_PRECISION (OImode)); +- intCI_type_node = make_signed_type (GET_MODE_PRECISION (CImode)); +- intXI_type_node = make_signed_type (GET_MODE_PRECISION (XImode)); +- +- (*lang_hooks.types.register_builtin_type) (intTI_type_node, +- "__builtin_aarch64_simd_ti"); +- (*lang_hooks.types.register_builtin_type) (intEI_type_node, +- "__builtin_aarch64_simd_ei"); +- (*lang_hooks.types.register_builtin_type) (intOI_type_node, +- "__builtin_aarch64_simd_oi"); +- (*lang_hooks.types.register_builtin_type) (intCI_type_node, +- "__builtin_aarch64_simd_ci"); +- (*lang_hooks.types.register_builtin_type) (intXI_type_node, +- "__builtin_aarch64_simd_xi"); +- +- /* Pointers to vector types. */ +- V8QI_pointer_node = build_pointer_type (V8QI_type_node); +- V4HI_pointer_node = build_pointer_type (V4HI_type_node); +- V2SI_pointer_node = build_pointer_type (V2SI_type_node); +- V2SF_pointer_node = build_pointer_type (V2SF_type_node); +- V16QI_pointer_node = build_pointer_type (V16QI_type_node); +- V8HI_pointer_node = build_pointer_type (V8HI_type_node); +- V4SI_pointer_node = build_pointer_type (V4SI_type_node); +- V4SF_pointer_node = build_pointer_type (V4SF_type_node); +- V2DI_pointer_node = build_pointer_type (V2DI_type_node); +- V2DF_pointer_node = build_pointer_type (V2DF_type_node); +- +- /* Operations which return results as pairs. */ +- void_ftype_pv8qi_v8qi_v8qi = +- build_function_type_list (void_type_node, V8QI_pointer_node, +- V8QI_type_node, V8QI_type_node, NULL); +- void_ftype_pv4hi_v4hi_v4hi = +- build_function_type_list (void_type_node, V4HI_pointer_node, +- V4HI_type_node, V4HI_type_node, NULL); +- void_ftype_pv2si_v2si_v2si = +- build_function_type_list (void_type_node, V2SI_pointer_node, +- V2SI_type_node, V2SI_type_node, NULL); +- void_ftype_pv2sf_v2sf_v2sf = +- build_function_type_list (void_type_node, V2SF_pointer_node, +- V2SF_type_node, V2SF_type_node, NULL); +- void_ftype_pdi_di_di = +- build_function_type_list (void_type_node, intDI_pointer_node, +- aarch64_simd_intDI_type_node, +- aarch64_simd_intDI_type_node, NULL); +- void_ftype_pv16qi_v16qi_v16qi = +- build_function_type_list (void_type_node, V16QI_pointer_node, +- V16QI_type_node, V16QI_type_node, NULL); +- void_ftype_pv8hi_v8hi_v8hi = +- build_function_type_list (void_type_node, V8HI_pointer_node, +- V8HI_type_node, V8HI_type_node, NULL); +- void_ftype_pv4si_v4si_v4si = +- build_function_type_list (void_type_node, V4SI_pointer_node, +- V4SI_type_node, V4SI_type_node, NULL); +- void_ftype_pv4sf_v4sf_v4sf = +- build_function_type_list (void_type_node, V4SF_pointer_node, +- V4SF_type_node, V4SF_type_node, NULL); +- void_ftype_pv2di_v2di_v2di = +- build_function_type_list (void_type_node, V2DI_pointer_node, +- V2DI_type_node, V2DI_type_node, NULL); +- void_ftype_pv2df_v2df_v2df = +- build_function_type_list (void_type_node, V2DF_pointer_node, +- V2DF_type_node, V2DF_type_node, NULL); +- +- dreg_types[0] = V8QI_type_node; +- dreg_types[1] = V4HI_type_node; +- dreg_types[2] = V2SI_type_node; +- dreg_types[3] = V2SF_type_node; +- dreg_types[4] = aarch64_simd_intDI_type_node; +- dreg_types[5] = aarch64_simd_double_type_node; +- +- qreg_types[0] = V16QI_type_node; +- qreg_types[1] = V8HI_type_node; +- qreg_types[2] = V4SI_type_node; +- qreg_types[3] = V4SF_type_node; +- qreg_types[4] = V2DI_type_node; +- qreg_types[5] = V2DF_type_node; +- +- /* If NUM_DREG_TYPES != NUM_QREG_TYPES, we will need separate nested loops +- for qreg and dreg reinterp inits. */ +- for (i = 0; i < NUM_DREG_TYPES; i++) +- { +- int j; +- for (j = 0; j < NUM_DREG_TYPES; j++) +- { +- reinterp_ftype_dreg[i][j] +- = build_function_type_list (dreg_types[i], dreg_types[j], NULL); +- reinterp_ftype_qreg[i][j] +- = build_function_type_list (qreg_types[i], qreg_types[j], NULL); +- } +- } +- + for (i = 0; i < ARRAY_SIZE (aarch64_simd_builtin_data); i++, fcode++) + { ++ bool print_type_signature_p = false; ++ char type_signature[SIMD_MAX_BUILTIN_ARGS] = { 0 }; + aarch64_simd_builtin_datum *d = &aarch64_simd_builtin_data[i]; + const char *const modenames[] = +- { +- "v8qi", "v4hi", "v2si", "v2sf", "di", "df", +- "v16qi", "v8hi", "v4si", "v4sf", "v2di", "v2df", +- "ti", "ei", "oi", "xi", "si", "hi", "qi" +- }; ++ { ++ "v8qi", "v4hi", "v2si", "v2sf", "di", "df", ++ "v16qi", "v8hi", "v4si", "v4sf", "v2di", "v2df", ++ "ti", "ei", "oi", "xi", "si", "sf", "hi", "qi" ++ }; ++ const enum machine_mode modes[] = ++ { ++ V8QImode, V4HImode, V2SImode, V2SFmode, DImode, DFmode, ++ V16QImode, V8HImode, V4SImode, V4SFmode, V2DImode, ++ V2DFmode, TImode, EImode, OImode, XImode, SImode, ++ SFmode, HImode, QImode ++ }; + char namebuf[60]; + tree ftype = NULL; + tree fndecl = NULL; +- int is_load = 0; +- int is_store = 0; + + gcc_assert (ARRAY_SIZE (modenames) == T_MAX); + + d->fcode = fcode; + +- switch (d->itype) ++ /* We must track two variables here. op_num is ++ the operand number as in the RTL pattern. This is ++ required to access the mode (e.g. V4SF mode) of the ++ argument, from which the base type can be derived. ++ arg_num is an index in to the qualifiers data, which ++ gives qualifiers to the type (e.g. const unsigned). ++ The reason these two variables may differ by one is the ++ void return type. While all return types take the 0th entry ++ in the qualifiers array, there is no operand for them in the ++ RTL pattern. */ ++ int op_num = insn_data[d->code].n_operands - 1; ++ int arg_num = d->qualifiers[0] & qualifier_void ++ ? op_num + 1 ++ : op_num; ++ tree return_type = void_type_node, args = void_list_node; ++ tree eltype; ++ ++ /* Build a function type directly from the insn_data for this ++ builtin. The build_function_type () function takes care of ++ removing duplicates for us. */ ++ for (; op_num >= 0; arg_num--, op_num--) + { +- case AARCH64_SIMD_LOAD1: +- case AARCH64_SIMD_LOAD1LANE: +- case AARCH64_SIMD_LOADSTRUCT: +- case AARCH64_SIMD_LOADSTRUCTLANE: +- is_load = 1; +- /* Fall through. */ +- case AARCH64_SIMD_STORE1: +- case AARCH64_SIMD_STORE1LANE: +- case AARCH64_SIMD_STORESTRUCT: +- case AARCH64_SIMD_STORESTRUCTLANE: +- if (!is_load) +- is_store = 1; +- /* Fall through. */ +- case AARCH64_SIMD_UNOP: +- case AARCH64_SIMD_BINOP: +- case AARCH64_SIMD_TERNOP: +- case AARCH64_SIMD_QUADOP: +- case AARCH64_SIMD_COMBINE: +- case AARCH64_SIMD_CONVERT: +- case AARCH64_SIMD_CREATE: +- case AARCH64_SIMD_DUP: +- case AARCH64_SIMD_DUPLANE: +- case AARCH64_SIMD_FIXCONV: +- case AARCH64_SIMD_GETLANE: +- case AARCH64_SIMD_LANEMAC: +- case AARCH64_SIMD_LANEMUL: +- case AARCH64_SIMD_LANEMULH: +- case AARCH64_SIMD_LANEMULL: +- case AARCH64_SIMD_LOGICBINOP: +- case AARCH64_SIMD_SCALARMAC: +- case AARCH64_SIMD_SCALARMUL: +- case AARCH64_SIMD_SCALARMULH: +- case AARCH64_SIMD_SCALARMULL: +- case AARCH64_SIMD_SELECT: +- case AARCH64_SIMD_SETLANE: +- case AARCH64_SIMD_SHIFTACC: +- case AARCH64_SIMD_SHIFTIMM: +- case AARCH64_SIMD_SHIFTINSERT: +- case AARCH64_SIMD_SPLIT: +- case AARCH64_SIMD_VTBL: +- case AARCH64_SIMD_VTBX: +- { +- int k; +- tree return_type = void_type_node, args = void_list_node; +- tree eltype; +- /* Build a function type directly from the insn_data for this +- builtin. The build_function_type () function takes care of +- removing duplicates for us. */ ++ enum machine_mode op_mode = insn_data[d->code].operand[op_num].mode; ++ enum aarch64_type_qualifiers qualifiers = d->qualifiers[arg_num]; + +- for (k = insn_data[d->code].n_operands -1; k >= 0; k--) +- { +- /* Skip an internal operand for vget_{low, high}. */ +- if (k == 2 && d->itype == AARCH64_SIMD_SPLIT) +- continue; ++ if (qualifiers & qualifier_unsigned) ++ { ++ type_signature[arg_num] = 'u'; ++ print_type_signature_p = true; ++ } ++ else if (qualifiers & qualifier_poly) ++ { ++ type_signature[arg_num] = 'p'; ++ print_type_signature_p = true; ++ } ++ else ++ type_signature[arg_num] = 's'; + +- if (is_load && k == 1) +- { +- /* AdvSIMD load patterns always have the memory operand +- (a DImode pointer) in the operand 1 position. We +- want a const pointer to the element type in that +- position. */ +- gcc_assert (insn_data[d->code].operand[k].mode == DImode); ++ /* Skip an internal operand for vget_{low, high}. */ ++ if (qualifiers & qualifier_internal) ++ continue; + +- switch (d->mode) +- { +- case T_V8QI: +- case T_V16QI: +- eltype = const_intQI_pointer_node; +- break; ++ /* Some builtins have different user-facing types ++ for certain arguments, encoded in d->mode. */ ++ if (qualifiers & qualifier_map_mode) ++ op_mode = modes[d->mode]; + +- case T_V4HI: +- case T_V8HI: +- eltype = const_intHI_pointer_node; +- break; ++ /* For pointers, we want a pointer to the basic type ++ of the vector. */ ++ if (qualifiers & qualifier_pointer && VECTOR_MODE_P (op_mode)) ++ op_mode = GET_MODE_INNER (op_mode); + +- case T_V2SI: +- case T_V4SI: +- eltype = const_intSI_pointer_node; +- break; ++ eltype = aarch64_build_type (op_mode, ++ qualifiers & qualifier_unsigned, ++ qualifiers & qualifier_poly); + +- case T_V2SF: +- case T_V4SF: +- eltype = const_float_pointer_node; +- break; ++ /* Add qualifiers. */ ++ if (qualifiers & qualifier_const) ++ eltype = build_qualified_type (eltype, TYPE_QUAL_CONST); + +- case T_DI: +- case T_V2DI: +- eltype = const_intDI_pointer_node; +- break; ++ if (qualifiers & qualifier_pointer) ++ eltype = build_pointer_type (eltype); + +- case T_DF: +- case T_V2DF: +- eltype = const_double_pointer_node; +- break; ++ /* If we have reached arg_num == 0, we are at a non-void ++ return type. Otherwise, we are still processing ++ arguments. */ ++ if (arg_num == 0) ++ return_type = eltype; ++ else ++ args = tree_cons (NULL_TREE, eltype, args); ++ } + +- default: +- gcc_unreachable (); +- } +- } +- else if (is_store && k == 0) +- { +- /* Similarly, AdvSIMD store patterns use operand 0 as +- the memory location to store to (a DImode pointer). +- Use a pointer to the element type of the store in +- that position. */ +- gcc_assert (insn_data[d->code].operand[k].mode == DImode); ++ ftype = build_function_type (return_type, args); + +- switch (d->mode) +- { +- case T_V8QI: +- case T_V16QI: +- eltype = intQI_pointer_node; +- break; +- +- case T_V4HI: +- case T_V8HI: +- eltype = intHI_pointer_node; +- break; +- +- case T_V2SI: +- case T_V4SI: +- eltype = intSI_pointer_node; +- break; +- +- case T_V2SF: +- case T_V4SF: +- eltype = float_pointer_node; +- break; +- +- case T_DI: +- case T_V2DI: +- eltype = intDI_pointer_node; +- break; +- +- case T_DF: +- case T_V2DF: +- eltype = double_pointer_node; +- break; +- +- default: +- gcc_unreachable (); +- } +- } +- else +- { +- switch (insn_data[d->code].operand[k].mode) +- { +- case VOIDmode: +- eltype = void_type_node; +- break; +- /* Scalars. */ +- case QImode: +- eltype = aarch64_simd_intQI_type_node; +- break; +- case HImode: +- eltype = aarch64_simd_intHI_type_node; +- break; +- case SImode: +- eltype = aarch64_simd_intSI_type_node; +- break; +- case SFmode: +- eltype = aarch64_simd_float_type_node; +- break; +- case DFmode: +- eltype = aarch64_simd_double_type_node; +- break; +- case DImode: +- eltype = aarch64_simd_intDI_type_node; +- break; +- case TImode: +- eltype = intTI_type_node; +- break; +- case EImode: +- eltype = intEI_type_node; +- break; +- case OImode: +- eltype = intOI_type_node; +- break; +- case CImode: +- eltype = intCI_type_node; +- break; +- case XImode: +- eltype = intXI_type_node; +- break; +- /* 64-bit vectors. */ +- case V8QImode: +- eltype = V8QI_type_node; +- break; +- case V4HImode: +- eltype = V4HI_type_node; +- break; +- case V2SImode: +- eltype = V2SI_type_node; +- break; +- case V2SFmode: +- eltype = V2SF_type_node; +- break; +- /* 128-bit vectors. */ +- case V16QImode: +- eltype = V16QI_type_node; +- break; +- case V8HImode: +- eltype = V8HI_type_node; +- break; +- case V4SImode: +- eltype = V4SI_type_node; +- break; +- case V4SFmode: +- eltype = V4SF_type_node; +- break; +- case V2DImode: +- eltype = V2DI_type_node; +- break; +- case V2DFmode: +- eltype = V2DF_type_node; +- break; +- default: +- gcc_unreachable (); +- } +- } +- +- if (k == 0 && !is_store) +- return_type = eltype; +- else +- args = tree_cons (NULL_TREE, eltype, args); +- } +- ftype = build_function_type (return_type, args); +- } +- break; +- +- case AARCH64_SIMD_RESULTPAIR: +- { +- switch (insn_data[d->code].operand[1].mode) +- { +- case V8QImode: +- ftype = void_ftype_pv8qi_v8qi_v8qi; +- break; +- case V4HImode: +- ftype = void_ftype_pv4hi_v4hi_v4hi; +- break; +- case V2SImode: +- ftype = void_ftype_pv2si_v2si_v2si; +- break; +- case V2SFmode: +- ftype = void_ftype_pv2sf_v2sf_v2sf; +- break; +- case DImode: +- ftype = void_ftype_pdi_di_di; +- break; +- case V16QImode: +- ftype = void_ftype_pv16qi_v16qi_v16qi; +- break; +- case V8HImode: +- ftype = void_ftype_pv8hi_v8hi_v8hi; +- break; +- case V4SImode: +- ftype = void_ftype_pv4si_v4si_v4si; +- break; +- case V4SFmode: +- ftype = void_ftype_pv4sf_v4sf_v4sf; +- break; +- case V2DImode: +- ftype = void_ftype_pv2di_v2di_v2di; +- break; +- case V2DFmode: +- ftype = void_ftype_pv2df_v2df_v2df; +- break; +- default: +- gcc_unreachable (); +- } +- } +- break; +- +- case AARCH64_SIMD_REINTERP: +- { +- /* We iterate over 6 doubleword types, then 6 quadword +- types. */ +- int rhs_d = d->mode % NUM_DREG_TYPES; +- int rhs_q = (d->mode - NUM_DREG_TYPES) % NUM_QREG_TYPES; +- switch (insn_data[d->code].operand[0].mode) +- { +- case V8QImode: +- ftype = reinterp_ftype_dreg[0][rhs_d]; +- break; +- case V4HImode: +- ftype = reinterp_ftype_dreg[1][rhs_d]; +- break; +- case V2SImode: +- ftype = reinterp_ftype_dreg[2][rhs_d]; +- break; +- case V2SFmode: +- ftype = reinterp_ftype_dreg[3][rhs_d]; +- break; +- case DImode: +- ftype = reinterp_ftype_dreg[4][rhs_d]; +- break; +- case DFmode: +- ftype = reinterp_ftype_dreg[5][rhs_d]; +- break; +- case V16QImode: +- ftype = reinterp_ftype_qreg[0][rhs_q]; +- break; +- case V8HImode: +- ftype = reinterp_ftype_qreg[1][rhs_q]; +- break; +- case V4SImode: +- ftype = reinterp_ftype_qreg[2][rhs_q]; +- break; +- case V4SFmode: +- ftype = reinterp_ftype_qreg[3][rhs_q]; +- break; +- case V2DImode: +- ftype = reinterp_ftype_qreg[4][rhs_q]; +- break; +- case V2DFmode: +- ftype = reinterp_ftype_qreg[5][rhs_q]; +- break; +- default: +- gcc_unreachable (); +- } +- } +- break; +- +- default: +- gcc_unreachable (); +- } + gcc_assert (ftype != NULL); + +- snprintf (namebuf, sizeof (namebuf), "__builtin_aarch64_%s%s", +- d->name, modenames[d->mode]); ++ if (print_type_signature_p) ++ snprintf (namebuf, sizeof (namebuf), "__builtin_aarch64_%s%s_%s", ++ d->name, modenames[d->mode], type_signature); ++ else ++ snprintf (namebuf, sizeof (namebuf), "__builtin_aarch64_%s%s", ++ d->name, modenames[d->mode]); + + fndecl = add_builtin_function (namebuf, ftype, fcode, BUILT_IN_MD, + NULL, NULL_TREE); +@@ -983,8 +732,6 @@ + SIMD_ARG_STOP + } builtin_simd_arg; + +-#define SIMD_MAX_BUILTIN_ARGS 5 +- + static rtx + aarch64_simd_expand_args (rtx target, int icode, int have_retval, + tree exp, ...) +@@ -1110,99 +857,58 @@ + { + aarch64_simd_builtin_datum *d = + &aarch64_simd_builtin_data[fcode - (AARCH64_SIMD_BUILTIN_BASE + 1)]; +- aarch64_simd_itype itype = d->itype; + enum insn_code icode = d->code; ++ builtin_simd_arg args[SIMD_MAX_BUILTIN_ARGS]; ++ int num_args = insn_data[d->code].n_operands; ++ int is_void = 0; ++ int k; + +- switch (itype) +- { +- case AARCH64_SIMD_UNOP: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_STOP); ++ is_void = !!(d->qualifiers[0] & qualifier_void); + +- case AARCH64_SIMD_BINOP: +- { +- rtx arg2 = expand_normal (CALL_EXPR_ARG (exp, 1)); +- /* Handle constants only if the predicate allows it. */ +- bool op1_const_int_p = +- (CONST_INT_P (arg2) +- && (*insn_data[icode].operand[2].predicate) +- (arg2, insn_data[icode].operand[2].mode)); +- return aarch64_simd_expand_args +- (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- op1_const_int_p ? SIMD_ARG_CONSTANT : SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_STOP); +- } ++ num_args += is_void; + +- case AARCH64_SIMD_TERNOP: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_STOP); ++ for (k = 1; k < num_args; k++) ++ { ++ /* We have four arrays of data, each indexed in a different fashion. ++ qualifiers - element 0 always describes the function return type. ++ operands - element 0 is either the operand for return value (if ++ the function has a non-void return type) or the operand for the ++ first argument. ++ expr_args - element 0 always holds the first argument. ++ args - element 0 is always used for the return type. */ ++ int qualifiers_k = k; ++ int operands_k = k - is_void; ++ int expr_args_k = k - 1; + +- case AARCH64_SIMD_QUADOP: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_STOP); +- case AARCH64_SIMD_LOAD1: +- case AARCH64_SIMD_LOADSTRUCT: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, SIMD_ARG_STOP); ++ if (d->qualifiers[qualifiers_k] & qualifier_immediate) ++ args[k] = SIMD_ARG_CONSTANT; ++ else if (d->qualifiers[qualifiers_k] & qualifier_maybe_immediate) ++ { ++ rtx arg ++ = expand_normal (CALL_EXPR_ARG (exp, ++ (expr_args_k))); ++ /* Handle constants only if the predicate allows it. */ ++ bool op_const_int_p = ++ (CONST_INT_P (arg) ++ && (*insn_data[icode].operand[operands_k].predicate) ++ (arg, insn_data[icode].operand[operands_k].mode)); ++ args[k] = op_const_int_p ? SIMD_ARG_CONSTANT : SIMD_ARG_COPY_TO_REG; ++ } ++ else ++ args[k] = SIMD_ARG_COPY_TO_REG; + +- case AARCH64_SIMD_STORE1: +- case AARCH64_SIMD_STORESTRUCT: +- return aarch64_simd_expand_args (target, icode, 0, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, SIMD_ARG_STOP); ++ } ++ args[k] = SIMD_ARG_STOP; + +- case AARCH64_SIMD_REINTERP: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, SIMD_ARG_STOP); +- +- case AARCH64_SIMD_CREATE: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, SIMD_ARG_STOP); +- +- case AARCH64_SIMD_COMBINE: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, SIMD_ARG_STOP); +- +- case AARCH64_SIMD_GETLANE: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_CONSTANT, +- SIMD_ARG_STOP); +- +- case AARCH64_SIMD_SETLANE: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_CONSTANT, +- SIMD_ARG_STOP); +- +- case AARCH64_SIMD_SHIFTIMM: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_CONSTANT, +- SIMD_ARG_STOP); +- +- case AARCH64_SIMD_SHIFTACC: +- case AARCH64_SIMD_SHIFTINSERT: +- return aarch64_simd_expand_args (target, icode, 1, exp, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_COPY_TO_REG, +- SIMD_ARG_CONSTANT, +- SIMD_ARG_STOP); +- +- default: +- gcc_unreachable (); +- } ++ /* The interface to aarch64_simd_expand_args expects a 0 if ++ the function is void, and a 1 if it is not. */ ++ return aarch64_simd_expand_args ++ (target, icode, !is_void, exp, ++ args[1], ++ args[2], ++ args[3], ++ args[4], ++ SIMD_ARG_STOP); + } + + /* Expand an expression EXP that calls a built-in function, +@@ -1242,11 +948,11 @@ + #define AARCH64_CHECK_BUILTIN_MODE(C, N) 1 + #define AARCH64_FIND_FRINT_VARIANT(N) \ + (AARCH64_CHECK_BUILTIN_MODE (2, D) \ +- ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_##N##v2df] \ ++ ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_##N##v2df] \ + : (AARCH64_CHECK_BUILTIN_MODE (4, S) \ +- ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_##N##v4sf] \ ++ ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_##N##v4sf] \ + : (AARCH64_CHECK_BUILTIN_MODE (2, S) \ +- ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_##N##v2sf] \ ++ ? aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_##N##v2sf] \ + : NULL_TREE))) + if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) + { +@@ -1259,30 +965,82 @@ + && in_mode == N##Fmode && in_n == C) + case BUILT_IN_FLOOR: + case BUILT_IN_FLOORF: +- return AARCH64_FIND_FRINT_VARIANT (frintm); ++ return AARCH64_FIND_FRINT_VARIANT (floor); + case BUILT_IN_CEIL: + case BUILT_IN_CEILF: +- return AARCH64_FIND_FRINT_VARIANT (frintp); ++ return AARCH64_FIND_FRINT_VARIANT (ceil); + case BUILT_IN_TRUNC: + case BUILT_IN_TRUNCF: +- return AARCH64_FIND_FRINT_VARIANT (frintz); ++ return AARCH64_FIND_FRINT_VARIANT (btrunc); + case BUILT_IN_ROUND: + case BUILT_IN_ROUNDF: +- return AARCH64_FIND_FRINT_VARIANT (frinta); ++ return AARCH64_FIND_FRINT_VARIANT (round); + case BUILT_IN_NEARBYINT: + case BUILT_IN_NEARBYINTF: +- return AARCH64_FIND_FRINT_VARIANT (frinti); ++ return AARCH64_FIND_FRINT_VARIANT (nearbyint); + case BUILT_IN_SQRT: + case BUILT_IN_SQRTF: + return AARCH64_FIND_FRINT_VARIANT (sqrt); + #undef AARCH64_CHECK_BUILTIN_MODE + #define AARCH64_CHECK_BUILTIN_MODE(C, N) \ ++ (out_mode == SImode && out_n == C \ ++ && in_mode == N##Imode && in_n == C) ++ case BUILT_IN_CLZ: ++ { ++ if (AARCH64_CHECK_BUILTIN_MODE (4, S)) ++ return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOP_clzv4si]; ++ return NULL_TREE; ++ } ++#undef AARCH64_CHECK_BUILTIN_MODE ++#define AARCH64_CHECK_BUILTIN_MODE(C, N) \ + (out_mode == N##Imode && out_n == C \ + && in_mode == N##Fmode && in_n == C) + case BUILT_IN_LFLOOR: +- return AARCH64_FIND_FRINT_VARIANT (fcvtms); ++ case BUILT_IN_IFLOORF: ++ { ++ enum aarch64_builtins builtin; ++ if (AARCH64_CHECK_BUILTIN_MODE (2, D)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lfloorv2dfv2di; ++ else if (AARCH64_CHECK_BUILTIN_MODE (4, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lfloorv4sfv4si; ++ else if (AARCH64_CHECK_BUILTIN_MODE (2, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lfloorv2sfv2si; ++ else ++ return NULL_TREE; ++ ++ return aarch64_builtin_decls[builtin]; ++ } + case BUILT_IN_LCEIL: +- return AARCH64_FIND_FRINT_VARIANT (fcvtps); ++ case BUILT_IN_ICEILF: ++ { ++ enum aarch64_builtins builtin; ++ if (AARCH64_CHECK_BUILTIN_MODE (2, D)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lceilv2dfv2di; ++ else if (AARCH64_CHECK_BUILTIN_MODE (4, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lceilv4sfv4si; ++ else if (AARCH64_CHECK_BUILTIN_MODE (2, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lceilv2sfv2si; ++ else ++ return NULL_TREE; ++ ++ return aarch64_builtin_decls[builtin]; ++ } ++ case BUILT_IN_LROUND: ++ case BUILT_IN_IROUNDF: ++ { ++ enum aarch64_builtins builtin; ++ if (AARCH64_CHECK_BUILTIN_MODE (2, D)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lroundv2dfv2di; ++ else if (AARCH64_CHECK_BUILTIN_MODE (4, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lroundv4sfv4si; ++ else if (AARCH64_CHECK_BUILTIN_MODE (2, S)) ++ builtin = AARCH64_SIMD_BUILTIN_UNOP_lroundv2sfv2si; ++ else ++ return NULL_TREE; ++ ++ return aarch64_builtin_decls[builtin]; ++ } ++ + default: + return NULL_TREE; + } +@@ -1290,5 +1048,160 @@ + + return NULL_TREE; + } ++ ++#undef VAR1 ++#define VAR1(T, N, MAP, A) \ ++ case AARCH64_SIMD_BUILTIN_##T##_##N##A: ++ ++tree ++aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args, ++ bool ignore ATTRIBUTE_UNUSED) ++{ ++ int fcode = DECL_FUNCTION_CODE (fndecl); ++ tree type = TREE_TYPE (TREE_TYPE (fndecl)); ++ ++ switch (fcode) ++ { ++ BUILTIN_VALLDI (UNOP, abs, 2) ++ return fold_build1 (ABS_EXPR, type, args[0]); ++ break; ++ BUILTIN_VALLDI (BINOP, cmge, 0) ++ return fold_build2 (GE_EXPR, type, args[0], args[1]); ++ break; ++ BUILTIN_VALLDI (BINOP, cmgt, 0) ++ return fold_build2 (GT_EXPR, type, args[0], args[1]); ++ break; ++ BUILTIN_VALLDI (BINOP, cmeq, 0) ++ return fold_build2 (EQ_EXPR, type, args[0], args[1]); ++ break; ++ BUILTIN_VSDQ_I_DI (BINOP, cmtst, 0) ++ { ++ tree and_node = fold_build2 (BIT_AND_EXPR, type, args[0], args[1]); ++ tree vec_zero_node = build_zero_cst (type); ++ return fold_build2 (NE_EXPR, type, and_node, vec_zero_node); ++ break; ++ } ++ VAR1 (UNOP, floatv2si, 2, v2sf) ++ VAR1 (UNOP, floatv4si, 2, v4sf) ++ VAR1 (UNOP, floatv2di, 2, v2df) ++ return fold_build1 (FLOAT_EXPR, type, args[0]); ++ default: ++ break; ++ } ++ ++ return NULL_TREE; ++} ++ ++bool ++aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi) ++{ ++ bool changed = false; ++ gimple stmt = gsi_stmt (*gsi); ++ tree call = gimple_call_fn (stmt); ++ tree fndecl; ++ gimple new_stmt = NULL; ++ if (call) ++ { ++ fndecl = gimple_call_fndecl (stmt); ++ if (fndecl) ++ { ++ int fcode = DECL_FUNCTION_CODE (fndecl); ++ int nargs = gimple_call_num_args (stmt); ++ tree *args = (nargs > 0 ++ ? gimple_call_arg_ptr (stmt, 0) ++ : &error_mark_node); ++ ++ switch (fcode) ++ { ++ BUILTIN_VALL (UNOP, reduc_splus_, 10) ++ new_stmt = gimple_build_assign_with_ops ( ++ REDUC_PLUS_EXPR, ++ gimple_call_lhs (stmt), ++ args[0], ++ NULL_TREE); ++ break; ++ BUILTIN_VDQIF (UNOP, reduc_smax_, 10) ++ new_stmt = gimple_build_assign_with_ops ( ++ REDUC_MAX_EXPR, ++ gimple_call_lhs (stmt), ++ args[0], ++ NULL_TREE); ++ break; ++ BUILTIN_VDQIF (UNOP, reduc_smin_, 10) ++ new_stmt = gimple_build_assign_with_ops ( ++ REDUC_MIN_EXPR, ++ gimple_call_lhs (stmt), ++ args[0], ++ NULL_TREE); ++ break; ++ ++ default: ++ break; ++ } ++ } ++ } ++ ++ if (new_stmt) ++ { ++ gsi_replace (gsi, new_stmt, true); ++ changed = true; ++ } ++ ++ return changed; ++} ++ + #undef AARCH64_CHECK_BUILTIN_MODE + #undef AARCH64_FIND_FRINT_VARIANT ++#undef BUILTIN_DX ++#undef BUILTIN_SDQ_I ++#undef BUILTIN_SD_HSI ++#undef BUILTIN_V2F ++#undef BUILTIN_VALL ++#undef BUILTIN_VB ++#undef BUILTIN_VD ++#undef BUILTIN_VDC ++#undef BUILTIN_VDIC ++#undef BUILTIN_VDN ++#undef BUILTIN_VDQ ++#undef BUILTIN_VDQF ++#undef BUILTIN_VDQH ++#undef BUILTIN_VDQHS ++#undef BUILTIN_VDQIF ++#undef BUILTIN_VDQM ++#undef BUILTIN_VDQV ++#undef BUILTIN_VDQ_BHSI ++#undef BUILTIN_VDQ_I ++#undef BUILTIN_VDW ++#undef BUILTIN_VD_BHSI ++#undef BUILTIN_VD_HSI ++#undef BUILTIN_VD_RE ++#undef BUILTIN_VQ ++#undef BUILTIN_VQN ++#undef BUILTIN_VQW ++#undef BUILTIN_VQ_HSI ++#undef BUILTIN_VQ_S ++#undef BUILTIN_VSDQ_HSI ++#undef BUILTIN_VSDQ_I ++#undef BUILTIN_VSDQ_I_BHSI ++#undef BUILTIN_VSDQ_I_DI ++#undef BUILTIN_VSD_HSI ++#undef BUILTIN_VSQN_HSDI ++#undef BUILTIN_VSTRUCT ++#undef CF0 ++#undef CF1 ++#undef CF2 ++#undef CF3 ++#undef CF4 ++#undef CF10 ++#undef VAR1 ++#undef VAR2 ++#undef VAR3 ++#undef VAR4 ++#undef VAR5 ++#undef VAR6 ++#undef VAR7 ++#undef VAR8 ++#undef VAR9 ++#undef VAR10 ++#undef VAR11 ++ +--- a/src/gcc/config/aarch64/aarch64-protos.h ++++ b/src/gcc/config/aarch64/aarch64-protos.h +@@ -68,6 +68,24 @@ + Each of of these represents a thread-local symbol, and corresponds to the + thread local storage relocation operator for the symbol being referred to. + ++ SYMBOL_TINY_ABSOLUTE ++ ++ Generate symbol accesses as a PC relative address using a single ++ instruction. To compute the address of symbol foo, we generate: ++ ++ ADR x0, foo ++ ++ SYMBOL_TINY_GOT ++ ++ Generate symbol accesses via the GOT using a single PC relative ++ instruction. To compute the address of symbol foo, we generate: ++ ++ ldr t0, :got:foo ++ ++ The value of foo can subsequently read using: ++ ++ ldrb t0, [t0] ++ + SYMBOL_FORCE_TO_MEM : Global variables are addressed using + constant pool. All variable addresses are spilled into constant + pools. The constant pools themselves are addressed using PC +@@ -81,6 +99,8 @@ + SYMBOL_SMALL_TLSDESC, + SYMBOL_SMALL_GOTTPREL, + SYMBOL_SMALL_TPREL, ++ SYMBOL_TINY_ABSOLUTE, ++ SYMBOL_TINY_GOT, + SYMBOL_FORCE_TO_MEM + }; + +@@ -126,25 +146,55 @@ + const int FP2FP; + }; + ++/* Cost for vector insn classes. */ ++struct cpu_vector_cost ++{ ++ const int scalar_stmt_cost; /* Cost of any scalar operation, ++ excluding load and store. */ ++ const int scalar_load_cost; /* Cost of scalar load. */ ++ const int scalar_store_cost; /* Cost of scalar store. */ ++ const int vec_stmt_cost; /* Cost of any vector operation, ++ excluding load, store, ++ vector-to-scalar and ++ scalar-to-vector operation. */ ++ const int vec_to_scalar_cost; /* Cost of vec-to-scalar operation. */ ++ const int scalar_to_vec_cost; /* Cost of scalar-to-vector ++ operation. */ ++ const int vec_align_load_cost; /* Cost of aligned vector load. */ ++ const int vec_unalign_load_cost; /* Cost of unaligned vector load. */ ++ const int vec_unalign_store_cost; /* Cost of unaligned vector store. */ ++ const int vec_store_cost; /* Cost of vector store. */ ++ const int cond_taken_branch_cost; /* Cost of taken branch. */ ++ const int cond_not_taken_branch_cost; /* Cost of not taken branch. */ ++}; ++ + struct tune_params + { + const struct cpu_rtx_cost_table *const insn_extra_cost; + const struct cpu_addrcost_table *const addr_cost; + const struct cpu_regmove_cost *const regmove_cost; ++ const struct cpu_vector_cost *const vec_costs; + const int memmov_cost; + }; + + HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned); + bool aarch64_bitmask_imm (HOST_WIDE_INT val, enum machine_mode); ++enum aarch64_symbol_type ++aarch64_classify_symbolic_expression (rtx, enum aarch64_symbol_context); + bool aarch64_constant_address_p (rtx); + bool aarch64_float_const_zero_rtx_p (rtx); + bool aarch64_function_arg_regno_p (unsigned); + bool aarch64_gen_movmemqi (rtx *); ++bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *); + bool aarch64_is_extend_from_extract (enum machine_mode, rtx, rtx); + bool aarch64_is_long_call_p (rtx); + bool aarch64_label_mentioned_p (rtx); + bool aarch64_legitimate_pic_operand_p (rtx); + bool aarch64_move_imm (HOST_WIDE_INT, enum machine_mode); ++bool aarch64_mov_operand_p (rtx, enum aarch64_symbol_context, ++ enum machine_mode); ++char *aarch64_output_scalar_simd_mov_immediate (rtx, enum machine_mode); ++char *aarch64_output_simd_mov_immediate (rtx, enum machine_mode, unsigned); + bool aarch64_pad_arg_upward (enum machine_mode, const_tree); + bool aarch64_pad_reg_upward (enum machine_mode, const_tree, bool); + bool aarch64_regno_ok_for_base_p (int, bool); +@@ -151,10 +201,11 @@ + bool aarch64_regno_ok_for_index_p (int, bool); + bool aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode); + bool aarch64_simd_imm_zero_p (rtx, enum machine_mode); ++bool aarch64_simd_scalar_immediate_valid_for_move (rtx, enum machine_mode); + bool aarch64_simd_shift_imm_p (rtx, enum machine_mode, bool); ++bool aarch64_simd_valid_immediate (rtx, enum machine_mode, bool, ++ struct simd_immediate_info *); + bool aarch64_symbolic_address_p (rtx); +-bool aarch64_symbolic_constant_p (rtx, enum aarch64_symbol_context, +- enum aarch64_symbol_type *); + bool aarch64_uimm12_shift (HOST_WIDE_INT); + const char *aarch64_output_casesi (rtx *); + enum aarch64_symbol_type aarch64_classify_symbol (rtx, +@@ -165,9 +216,6 @@ + int aarch64_hard_regno_mode_ok (unsigned, enum machine_mode); + int aarch64_hard_regno_nregs (unsigned, enum machine_mode); + int aarch64_simd_attr_length_move (rtx); +-int aarch64_simd_immediate_valid_for_move (rtx, enum machine_mode, rtx *, +- int *, unsigned char *, int *, +- int *); + int aarch64_uxt_size (int, HOST_WIDE_INT); + rtx aarch64_final_eh_return_addr (void); + rtx aarch64_legitimize_reload_address (rtx *, enum machine_mode, int, int, int); +@@ -177,6 +225,7 @@ + bool aarch64_simd_mem_operand_p (rtx); + rtx aarch64_simd_vect_par_cnst_half (enum machine_mode, bool); + rtx aarch64_tls_get_addr (void); ++tree aarch64_fold_builtin (tree, int, tree *, bool); + unsigned aarch64_dbx_register_number (unsigned); + unsigned aarch64_trampoline_size (void); + void aarch64_asm_output_labelref (FILE *, const char *); +@@ -216,6 +265,10 @@ + + bool aarch64_split_128bit_move_p (rtx, rtx); + ++void aarch64_split_simd_combine (rtx, rtx, rtx); ++ ++void aarch64_split_simd_move (rtx, rtx); ++ + /* Check for a legitimate floating point constant for FMOV. */ + bool aarch64_float_const_representable_p (rtx); + +@@ -249,6 +302,4 @@ + extern void aarch64_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel); + extern bool + aarch64_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel); +- +-char* aarch64_output_simd_mov_immediate (rtx *, enum machine_mode, unsigned); + #endif /* GCC_AARCH64_PROTOS_H */ +--- a/src/gcc/config/aarch64/aarch64-simd-builtins.def ++++ b/src/gcc/config/aarch64/aarch64-simd-builtins.def +@@ -18,248 +18,367 @@ + along with GCC; see the file COPYING3. If not see + . */ + +-/* In the list below, the BUILTIN_ macros should +- correspond to the iterator used to construct the instruction's +- patterns in aarch64-simd.md. A helpful idiom to follow when +- adding new builtins is to add a line for each pattern in the md +- file. Thus, ADDP, which has one pattern defined for the VD_BHSI +- iterator, and one for DImode, has two entries below. */ ++/* In the list below, the BUILTIN_ macros expand to create ++ builtins for each of the modes described by . When adding ++ new builtins to this list, a helpful idiom to follow is to add ++ a line for each pattern in the md file. Thus, ADDP, which has one ++ pattern defined for the VD_BHSI iterator, and one for DImode, has two ++ entries below. + +- BUILTIN_VD_RE (CREATE, create) +- BUILTIN_VQ_S (GETLANE, get_lane_signed) +- BUILTIN_VDQ (GETLANE, get_lane_unsigned) +- BUILTIN_VDQF (GETLANE, get_lane) +- VAR1 (GETLANE, get_lane, di) +- BUILTIN_VDC (COMBINE, combine) +- BUILTIN_VB (BINOP, pmul) +- BUILTIN_VDQF (UNOP, sqrt) +- BUILTIN_VD_BHSI (BINOP, addp) +- VAR1 (UNOP, addp, di) ++ Parameter 1 is the 'type' of the intrinsic. This is used to ++ describe the type modifiers (for example; unsigned) applied to ++ each of the parameters to the intrinsic function. + +- BUILTIN_VD_RE (REINTERP, reinterpretdi) +- BUILTIN_VDC (REINTERP, reinterpretv8qi) +- BUILTIN_VDC (REINTERP, reinterpretv4hi) +- BUILTIN_VDC (REINTERP, reinterpretv2si) +- BUILTIN_VDC (REINTERP, reinterpretv2sf) +- BUILTIN_VQ (REINTERP, reinterpretv16qi) +- BUILTIN_VQ (REINTERP, reinterpretv8hi) +- BUILTIN_VQ (REINTERP, reinterpretv4si) +- BUILTIN_VQ (REINTERP, reinterpretv4sf) +- BUILTIN_VQ (REINTERP, reinterpretv2di) +- BUILTIN_VQ (REINTERP, reinterpretv2df) ++ Parameter 2 is the name of the intrinsic. This is appended ++ to `__builtin_aarch64_` to give the intrinsic name ++ as exported to the front-ends. + +- BUILTIN_VDQ_I (BINOP, dup_lane) +- BUILTIN_SDQ_I (BINOP, dup_lane) ++ Parameter 3 describes how to map from the name to the CODE_FOR_ ++ macro holding the RTL pattern for the intrinsic. This mapping is: ++ 0 - CODE_FOR_aarch64_ ++ 1-9 - CODE_FOR_<1-9> ++ 10 - CODE_FOR_. */ ++ ++ BUILTIN_VD_RE (CREATE, create, 0) ++ BUILTIN_VDC (COMBINE, combine, 0) ++ BUILTIN_VB (BINOP, pmul, 0) ++ BUILTIN_VDQF (UNOP, sqrt, 2) ++ BUILTIN_VD_BHSI (BINOP, addp, 0) ++ VAR1 (UNOP, addp, 0, di) ++ VAR1 (UNOP, clz, 2, v4si) ++ ++ BUILTIN_VALL (GETLANE, get_lane, 0) ++ VAR1 (GETLANE, get_lane, 0, di) ++ ++ BUILTIN_VD_RE (REINTERP, reinterpretdi, 0) ++ BUILTIN_VDC (REINTERP, reinterpretv8qi, 0) ++ BUILTIN_VDC (REINTERP, reinterpretv4hi, 0) ++ BUILTIN_VDC (REINTERP, reinterpretv2si, 0) ++ BUILTIN_VDC (REINTERP, reinterpretv2sf, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv16qi, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv8hi, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv4si, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv4sf, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv2di, 0) ++ BUILTIN_VQ (REINTERP, reinterpretv2df, 0) ++ ++ BUILTIN_VDQ_I (BINOP, dup_lane, 0) + /* Implemented by aarch64_qshl. */ +- BUILTIN_VSDQ_I (BINOP, sqshl) +- BUILTIN_VSDQ_I (BINOP, uqshl) +- BUILTIN_VSDQ_I (BINOP, sqrshl) +- BUILTIN_VSDQ_I (BINOP, uqrshl) ++ BUILTIN_VSDQ_I (BINOP, sqshl, 0) ++ BUILTIN_VSDQ_I (BINOP, uqshl, 0) ++ BUILTIN_VSDQ_I (BINOP, sqrshl, 0) ++ BUILTIN_VSDQ_I (BINOP, uqrshl, 0) + /* Implemented by aarch64_. */ +- BUILTIN_VSDQ_I (BINOP, sqadd) +- BUILTIN_VSDQ_I (BINOP, uqadd) +- BUILTIN_VSDQ_I (BINOP, sqsub) +- BUILTIN_VSDQ_I (BINOP, uqsub) ++ BUILTIN_VSDQ_I (BINOP, sqadd, 0) ++ BUILTIN_VSDQ_I (BINOP, uqadd, 0) ++ BUILTIN_VSDQ_I (BINOP, sqsub, 0) ++ BUILTIN_VSDQ_I (BINOP, uqsub, 0) + /* Implemented by aarch64_qadd. */ +- BUILTIN_VSDQ_I (BINOP, suqadd) +- BUILTIN_VSDQ_I (BINOP, usqadd) ++ BUILTIN_VSDQ_I (BINOP, suqadd, 0) ++ BUILTIN_VSDQ_I (BINOP, usqadd, 0) + + /* Implemented by aarch64_get_dreg. */ +- BUILTIN_VDC (GETLANE, get_dregoi) +- BUILTIN_VDC (GETLANE, get_dregci) +- BUILTIN_VDC (GETLANE, get_dregxi) ++ BUILTIN_VDC (GETLANE, get_dregoi, 0) ++ BUILTIN_VDC (GETLANE, get_dregci, 0) ++ BUILTIN_VDC (GETLANE, get_dregxi, 0) + /* Implemented by aarch64_get_qreg. */ +- BUILTIN_VQ (GETLANE, get_qregoi) +- BUILTIN_VQ (GETLANE, get_qregci) +- BUILTIN_VQ (GETLANE, get_qregxi) ++ BUILTIN_VQ (GETLANE, get_qregoi, 0) ++ BUILTIN_VQ (GETLANE, get_qregci, 0) ++ BUILTIN_VQ (GETLANE, get_qregxi, 0) + /* Implemented by aarch64_set_qreg. */ +- BUILTIN_VQ (SETLANE, set_qregoi) +- BUILTIN_VQ (SETLANE, set_qregci) +- BUILTIN_VQ (SETLANE, set_qregxi) ++ BUILTIN_VQ (SETLANE, set_qregoi, 0) ++ BUILTIN_VQ (SETLANE, set_qregci, 0) ++ BUILTIN_VQ (SETLANE, set_qregxi, 0) + /* Implemented by aarch64_ld. */ +- BUILTIN_VDC (LOADSTRUCT, ld2) +- BUILTIN_VDC (LOADSTRUCT, ld3) +- BUILTIN_VDC (LOADSTRUCT, ld4) ++ BUILTIN_VDC (LOADSTRUCT, ld2, 0) ++ BUILTIN_VDC (LOADSTRUCT, ld3, 0) ++ BUILTIN_VDC (LOADSTRUCT, ld4, 0) + /* Implemented by aarch64_ld. */ +- BUILTIN_VQ (LOADSTRUCT, ld2) +- BUILTIN_VQ (LOADSTRUCT, ld3) +- BUILTIN_VQ (LOADSTRUCT, ld4) ++ BUILTIN_VQ (LOADSTRUCT, ld2, 0) ++ BUILTIN_VQ (LOADSTRUCT, ld3, 0) ++ BUILTIN_VQ (LOADSTRUCT, ld4, 0) + /* Implemented by aarch64_st. */ +- BUILTIN_VDC (STORESTRUCT, st2) +- BUILTIN_VDC (STORESTRUCT, st3) +- BUILTIN_VDC (STORESTRUCT, st4) ++ BUILTIN_VDC (STORESTRUCT, st2, 0) ++ BUILTIN_VDC (STORESTRUCT, st3, 0) ++ BUILTIN_VDC (STORESTRUCT, st4, 0) + /* Implemented by aarch64_st. */ +- BUILTIN_VQ (STORESTRUCT, st2) +- BUILTIN_VQ (STORESTRUCT, st3) +- BUILTIN_VQ (STORESTRUCT, st4) ++ BUILTIN_VQ (STORESTRUCT, st2, 0) ++ BUILTIN_VQ (STORESTRUCT, st3, 0) ++ BUILTIN_VQ (STORESTRUCT, st4, 0) + +- BUILTIN_VQW (BINOP, saddl2) +- BUILTIN_VQW (BINOP, uaddl2) +- BUILTIN_VQW (BINOP, ssubl2) +- BUILTIN_VQW (BINOP, usubl2) +- BUILTIN_VQW (BINOP, saddw2) +- BUILTIN_VQW (BINOP, uaddw2) +- BUILTIN_VQW (BINOP, ssubw2) +- BUILTIN_VQW (BINOP, usubw2) ++ BUILTIN_VQW (BINOP, saddl2, 0) ++ BUILTIN_VQW (BINOP, uaddl2, 0) ++ BUILTIN_VQW (BINOP, ssubl2, 0) ++ BUILTIN_VQW (BINOP, usubl2, 0) ++ BUILTIN_VQW (BINOP, saddw2, 0) ++ BUILTIN_VQW (BINOP, uaddw2, 0) ++ BUILTIN_VQW (BINOP, ssubw2, 0) ++ BUILTIN_VQW (BINOP, usubw2, 0) + /* Implemented by aarch64_l. */ +- BUILTIN_VDW (BINOP, saddl) +- BUILTIN_VDW (BINOP, uaddl) +- BUILTIN_VDW (BINOP, ssubl) +- BUILTIN_VDW (BINOP, usubl) ++ BUILTIN_VDW (BINOP, saddl, 0) ++ BUILTIN_VDW (BINOP, uaddl, 0) ++ BUILTIN_VDW (BINOP, ssubl, 0) ++ BUILTIN_VDW (BINOP, usubl, 0) + /* Implemented by aarch64_w. */ +- BUILTIN_VDW (BINOP, saddw) +- BUILTIN_VDW (BINOP, uaddw) +- BUILTIN_VDW (BINOP, ssubw) +- BUILTIN_VDW (BINOP, usubw) ++ BUILTIN_VDW (BINOP, saddw, 0) ++ BUILTIN_VDW (BINOP, uaddw, 0) ++ BUILTIN_VDW (BINOP, ssubw, 0) ++ BUILTIN_VDW (BINOP, usubw, 0) + /* Implemented by aarch64_h. */ +- BUILTIN_VQ_S (BINOP, shadd) +- BUILTIN_VQ_S (BINOP, uhadd) +- BUILTIN_VQ_S (BINOP, srhadd) +- BUILTIN_VQ_S (BINOP, urhadd) ++ BUILTIN_VQ_S (BINOP, shadd, 0) ++ BUILTIN_VQ_S (BINOP, uhadd, 0) ++ BUILTIN_VQ_S (BINOP, srhadd, 0) ++ BUILTIN_VQ_S (BINOP, urhadd, 0) + /* Implemented by aarch64_hn. */ +- BUILTIN_VQN (BINOP, addhn) +- BUILTIN_VQN (BINOP, raddhn) ++ BUILTIN_VQN (BINOP, addhn, 0) ++ BUILTIN_VQN (BINOP, raddhn, 0) + /* Implemented by aarch64_hn2. */ +- BUILTIN_VQN (TERNOP, addhn2) +- BUILTIN_VQN (TERNOP, raddhn2) ++ BUILTIN_VQN (TERNOP, addhn2, 0) ++ BUILTIN_VQN (TERNOP, raddhn2, 0) + +- BUILTIN_VSQN_HSDI (UNOP, sqmovun) ++ BUILTIN_VSQN_HSDI (UNOP, sqmovun, 0) + /* Implemented by aarch64_qmovn. */ +- BUILTIN_VSQN_HSDI (UNOP, sqmovn) +- BUILTIN_VSQN_HSDI (UNOP, uqmovn) ++ BUILTIN_VSQN_HSDI (UNOP, sqmovn, 0) ++ BUILTIN_VSQN_HSDI (UNOP, uqmovn, 0) + /* Implemented by aarch64_s. */ +- BUILTIN_VSDQ_I_BHSI (UNOP, sqabs) +- BUILTIN_VSDQ_I_BHSI (UNOP, sqneg) ++ BUILTIN_VSDQ_I_BHSI (UNOP, sqabs, 0) ++ BUILTIN_VSDQ_I_BHSI (UNOP, sqneg, 0) + +- BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane) +- BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane) +- BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq) +- BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq) +- BUILTIN_VQ_HSI (TERNOP, sqdmlal2) +- BUILTIN_VQ_HSI (TERNOP, sqdmlsl2) +- BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane) +- BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane) +- BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq) +- BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq) +- BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n) +- BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n) ++ BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane, 0) ++ BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane, 0) ++ BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq, 0) ++ BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmlal2, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmlsl2, 0) ++ BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane, 0) ++ BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane, 0) ++ BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq, 0) ++ BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n, 0) + /* Implemented by aarch64_sqdmll. */ +- BUILTIN_VSD_HSI (TERNOP, sqdmlal) +- BUILTIN_VSD_HSI (TERNOP, sqdmlsl) ++ BUILTIN_VSD_HSI (TERNOP, sqdmlal, 0) ++ BUILTIN_VSD_HSI (TERNOP, sqdmlsl, 0) + /* Implemented by aarch64_sqdmll_n. */ +- BUILTIN_VD_HSI (TERNOP, sqdmlal_n) +- BUILTIN_VD_HSI (TERNOP, sqdmlsl_n) ++ BUILTIN_VD_HSI (TERNOP, sqdmlal_n, 0) ++ BUILTIN_VD_HSI (TERNOP, sqdmlsl_n, 0) + +- BUILTIN_VSD_HSI (BINOP, sqdmull) +- BUILTIN_VSD_HSI (TERNOP, sqdmull_lane) +- BUILTIN_VD_HSI (TERNOP, sqdmull_laneq) +- BUILTIN_VD_HSI (BINOP, sqdmull_n) +- BUILTIN_VQ_HSI (BINOP, sqdmull2) +- BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane) +- BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq) +- BUILTIN_VQ_HSI (BINOP, sqdmull2_n) ++ BUILTIN_VSD_HSI (BINOP, sqdmull, 0) ++ BUILTIN_VSD_HSI (TERNOP, sqdmull_lane, 0) ++ BUILTIN_VD_HSI (TERNOP, sqdmull_laneq, 0) ++ BUILTIN_VD_HSI (BINOP, sqdmull_n, 0) ++ BUILTIN_VQ_HSI (BINOP, sqdmull2, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane, 0) ++ BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq, 0) ++ BUILTIN_VQ_HSI (BINOP, sqdmull2_n, 0) + /* Implemented by aarch64_sqdmulh. */ +- BUILTIN_VSDQ_HSI (BINOP, sqdmulh) +- BUILTIN_VSDQ_HSI (BINOP, sqrdmulh) ++ BUILTIN_VSDQ_HSI (BINOP, sqdmulh, 0) ++ BUILTIN_VSDQ_HSI (BINOP, sqrdmulh, 0) + /* Implemented by aarch64_sqdmulh_lane. */ +- BUILTIN_VDQHS (TERNOP, sqdmulh_lane) +- BUILTIN_VDQHS (TERNOP, sqdmulh_laneq) +- BUILTIN_VDQHS (TERNOP, sqrdmulh_lane) +- BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq) +- BUILTIN_SD_HSI (TERNOP, sqdmulh_lane) +- BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane) ++ BUILTIN_VDQHS (TERNOP, sqdmulh_lane, 0) ++ BUILTIN_VDQHS (TERNOP, sqdmulh_laneq, 0) ++ BUILTIN_VDQHS (TERNOP, sqrdmulh_lane, 0) ++ BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq, 0) ++ BUILTIN_SD_HSI (TERNOP, sqdmulh_lane, 0) ++ BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane, 0) + +- BUILTIN_VSDQ_I_DI (BINOP, sshl_n) +- BUILTIN_VSDQ_I_DI (BINOP, ushl_n) ++ BUILTIN_VSDQ_I_DI (BINOP, ashl, 3) + /* Implemented by aarch64_shl. */ +- BUILTIN_VSDQ_I_DI (BINOP, sshl) +- BUILTIN_VSDQ_I_DI (BINOP, ushl) +- BUILTIN_VSDQ_I_DI (BINOP, srshl) +- BUILTIN_VSDQ_I_DI (BINOP, urshl) ++ BUILTIN_VSDQ_I_DI (BINOP, sshl, 0) ++ BUILTIN_VSDQ_I_DI (BINOP, ushl, 0) ++ BUILTIN_VSDQ_I_DI (BINOP, srshl, 0) ++ BUILTIN_VSDQ_I_DI (BINOP, urshl, 0) + +- BUILTIN_VSDQ_I_DI (SHIFTIMM, sshr_n) +- BUILTIN_VSDQ_I_DI (SHIFTIMM, ushr_n) ++ BUILTIN_VSDQ_I_DI (SHIFTIMM, ashr, 3) ++ BUILTIN_VSDQ_I_DI (SHIFTIMM, lshr, 3) + /* Implemented by aarch64_shr_n. */ +- BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n) +- BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n) ++ BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n, 0) + /* Implemented by aarch64_sra_n. */ +- BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n) +- BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n) +- BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n) +- BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n) ++ BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n, 0) + /* Implemented by aarch64_shll_n. */ +- BUILTIN_VDW (SHIFTIMM, sshll_n) +- BUILTIN_VDW (SHIFTIMM, ushll_n) ++ BUILTIN_VDW (SHIFTIMM, sshll_n, 0) ++ BUILTIN_VDW (SHIFTIMM, ushll_n, 0) + /* Implemented by aarch64_shll2_n. */ +- BUILTIN_VQW (SHIFTIMM, sshll2_n) +- BUILTIN_VQW (SHIFTIMM, ushll2_n) ++ BUILTIN_VQW (SHIFTIMM, sshll2_n, 0) ++ BUILTIN_VQW (SHIFTIMM, ushll2_n, 0) + /* Implemented by aarch64_qshrn_n. */ +- BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n) +- BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n) +- BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n) +- BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n) +- BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n) +- BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n, 0) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n, 0) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n, 0) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n, 0) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n, 0) ++ BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n, 0) + /* Implemented by aarch64_si_n. */ +- BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n) +- BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n) +- BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n) +- BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n) ++ BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n, 0) ++ BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n, 0) + /* Implemented by aarch64_qshl_n. */ +- BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n) +- BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n) +- BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n) ++ BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n, 0) ++ BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n, 0) ++ BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n, 0) + + /* Implemented by aarch64_cm. */ +- BUILTIN_VSDQ_I_DI (BINOP, cmeq) +- BUILTIN_VSDQ_I_DI (BINOP, cmge) +- BUILTIN_VSDQ_I_DI (BINOP, cmgt) +- BUILTIN_VSDQ_I_DI (BINOP, cmle) +- BUILTIN_VSDQ_I_DI (BINOP, cmlt) ++ BUILTIN_VALLDI (BINOP, cmeq, 0) ++ BUILTIN_VALLDI (BINOP, cmge, 0) ++ BUILTIN_VALLDI (BINOP, cmgt, 0) ++ BUILTIN_VALLDI (BINOP, cmle, 0) ++ BUILTIN_VALLDI (BINOP, cmlt, 0) + /* Implemented by aarch64_cm. */ +- BUILTIN_VSDQ_I_DI (BINOP, cmgeu) +- BUILTIN_VSDQ_I_DI (BINOP, cmgtu) +- BUILTIN_VSDQ_I_DI (BINOP, cmtst) ++ BUILTIN_VSDQ_I_DI (BINOP, cmgeu, 0) ++ BUILTIN_VSDQ_I_DI (BINOP, cmgtu, 0) ++ BUILTIN_VSDQ_I_DI (BINOP, cmtst, 0) + +- /* Implemented by aarch64_. */ +- BUILTIN_VDQF (BINOP, fmax) +- BUILTIN_VDQF (BINOP, fmin) +- /* Implemented by aarch64_. */ +- BUILTIN_VDQ_BHSI (BINOP, smax) +- BUILTIN_VDQ_BHSI (BINOP, smin) +- BUILTIN_VDQ_BHSI (BINOP, umax) +- BUILTIN_VDQ_BHSI (BINOP, umin) ++ /* Implemented by reduc_plus_. */ ++ BUILTIN_VALL (UNOP, reduc_splus_, 10) ++ BUILTIN_VDQ (UNOP, reduc_uplus_, 10) + +- /* Implemented by aarch64_frint. */ +- BUILTIN_VDQF (UNOP, frintz) +- BUILTIN_VDQF (UNOP, frintp) +- BUILTIN_VDQF (UNOP, frintm) +- BUILTIN_VDQF (UNOP, frinti) +- BUILTIN_VDQF (UNOP, frintx) +- BUILTIN_VDQF (UNOP, frinta) ++ /* Implemented by reduc__. */ ++ BUILTIN_VDQIF (UNOP, reduc_smax_, 10) ++ BUILTIN_VDQIF (UNOP, reduc_smin_, 10) ++ BUILTIN_VDQ_BHSI (UNOP, reduc_umax_, 10) ++ BUILTIN_VDQ_BHSI (UNOP, reduc_umin_, 10) ++ BUILTIN_VDQF (UNOP, reduc_smax_nan_, 10) ++ BUILTIN_VDQF (UNOP, reduc_smin_nan_, 10) + +- /* Implemented by aarch64_fcvt. */ +- BUILTIN_VDQF (UNOP, fcvtzs) +- BUILTIN_VDQF (UNOP, fcvtzu) +- BUILTIN_VDQF (UNOP, fcvtas) +- BUILTIN_VDQF (UNOP, fcvtau) +- BUILTIN_VDQF (UNOP, fcvtps) +- BUILTIN_VDQF (UNOP, fcvtpu) +- BUILTIN_VDQF (UNOP, fcvtms) +- BUILTIN_VDQF (UNOP, fcvtmu) ++ /* Implemented by 3. ++ smax variants map to fmaxnm, ++ smax_nan variants map to fmax. */ ++ BUILTIN_VDQIF (BINOP, smax, 3) ++ BUILTIN_VDQIF (BINOP, smin, 3) ++ BUILTIN_VDQ_BHSI (BINOP, umax, 3) ++ BUILTIN_VDQ_BHSI (BINOP, umin, 3) ++ BUILTIN_VDQF (BINOP, smax_nan, 3) ++ BUILTIN_VDQF (BINOP, smin_nan, 3) + ++ /* Implemented by 2. */ ++ BUILTIN_VDQF (UNOP, btrunc, 2) ++ BUILTIN_VDQF (UNOP, ceil, 2) ++ BUILTIN_VDQF (UNOP, floor, 2) ++ BUILTIN_VDQF (UNOP, nearbyint, 2) ++ BUILTIN_VDQF (UNOP, rint, 2) ++ BUILTIN_VDQF (UNOP, round, 2) ++ BUILTIN_VDQF (UNOP, frintn, 2) ++ ++ /* Implemented by l2. */ ++ VAR1 (UNOP, lbtruncv2sf, 2, v2si) ++ VAR1 (UNOP, lbtruncv4sf, 2, v4si) ++ VAR1 (UNOP, lbtruncv2df, 2, v2di) ++ ++ VAR1 (UNOP, lbtruncuv2sf, 2, v2si) ++ VAR1 (UNOP, lbtruncuv4sf, 2, v4si) ++ VAR1 (UNOP, lbtruncuv2df, 2, v2di) ++ ++ VAR1 (UNOP, lroundv2sf, 2, v2si) ++ VAR1 (UNOP, lroundv4sf, 2, v4si) ++ VAR1 (UNOP, lroundv2df, 2, v2di) ++ /* Implemented by l2. */ ++ VAR1 (UNOP, lroundsf, 2, si) ++ VAR1 (UNOP, lrounddf, 2, di) ++ ++ VAR1 (UNOP, lrounduv2sf, 2, v2si) ++ VAR1 (UNOP, lrounduv4sf, 2, v4si) ++ VAR1 (UNOP, lrounduv2df, 2, v2di) ++ VAR1 (UNOP, lroundusf, 2, si) ++ VAR1 (UNOP, lroundudf, 2, di) ++ ++ VAR1 (UNOP, lceilv2sf, 2, v2si) ++ VAR1 (UNOP, lceilv4sf, 2, v4si) ++ VAR1 (UNOP, lceilv2df, 2, v2di) ++ ++ VAR1 (UNOP, lceiluv2sf, 2, v2si) ++ VAR1 (UNOP, lceiluv4sf, 2, v4si) ++ VAR1 (UNOP, lceiluv2df, 2, v2di) ++ VAR1 (UNOP, lceilusf, 2, si) ++ VAR1 (UNOP, lceiludf, 2, di) ++ ++ VAR1 (UNOP, lfloorv2sf, 2, v2si) ++ VAR1 (UNOP, lfloorv4sf, 2, v4si) ++ VAR1 (UNOP, lfloorv2df, 2, v2di) ++ ++ VAR1 (UNOP, lflooruv2sf, 2, v2si) ++ VAR1 (UNOP, lflooruv4sf, 2, v4si) ++ VAR1 (UNOP, lflooruv2df, 2, v2di) ++ VAR1 (UNOP, lfloorusf, 2, si) ++ VAR1 (UNOP, lfloorudf, 2, di) ++ ++ VAR1 (UNOP, lfrintnv2sf, 2, v2si) ++ VAR1 (UNOP, lfrintnv4sf, 2, v4si) ++ VAR1 (UNOP, lfrintnv2df, 2, v2di) ++ VAR1 (UNOP, lfrintnsf, 2, si) ++ VAR1 (UNOP, lfrintndf, 2, di) ++ ++ VAR1 (UNOP, lfrintnuv2sf, 2, v2si) ++ VAR1 (UNOP, lfrintnuv4sf, 2, v4si) ++ VAR1 (UNOP, lfrintnuv2df, 2, v2di) ++ VAR1 (UNOP, lfrintnusf, 2, si) ++ VAR1 (UNOP, lfrintnudf, 2, di) ++ ++ /* Implemented by 2. */ ++ VAR1 (UNOP, floatv2si, 2, v2sf) ++ VAR1 (UNOP, floatv4si, 2, v4sf) ++ VAR1 (UNOP, floatv2di, 2, v2df) ++ ++ VAR1 (UNOP, floatunsv2si, 2, v2sf) ++ VAR1 (UNOP, floatunsv4si, 2, v4sf) ++ VAR1 (UNOP, floatunsv2di, 2, v2df) ++ + /* Implemented by + aarch64_. */ +- BUILTIN_VALL (BINOP, zip1) +- BUILTIN_VALL (BINOP, zip2) +- BUILTIN_VALL (BINOP, uzp1) +- BUILTIN_VALL (BINOP, uzp2) +- BUILTIN_VALL (BINOP, trn1) +- BUILTIN_VALL (BINOP, trn2) ++ BUILTIN_VALL (BINOP, zip1, 0) ++ BUILTIN_VALL (BINOP, zip2, 0) ++ BUILTIN_VALL (BINOP, uzp1, 0) ++ BUILTIN_VALL (BINOP, uzp2, 0) ++ BUILTIN_VALL (BINOP, trn1, 0) ++ BUILTIN_VALL (BINOP, trn2, 0) + ++ /* Implemented by ++ aarch64_frecp. */ ++ BUILTIN_GPF (UNOP, frecpe, 0) ++ BUILTIN_GPF (BINOP, frecps, 0) ++ BUILTIN_GPF (UNOP, frecpx, 0) ++ ++ BUILTIN_VDQF (UNOP, frecpe, 0) ++ BUILTIN_VDQF (BINOP, frecps, 0) ++ ++ BUILTIN_VALLDI (UNOP, abs, 2) ++ ++ VAR1 (UNOP, vec_unpacks_hi_, 10, v4sf) ++ VAR1 (BINOP, float_truncate_hi_, 0, v4sf) ++ ++ VAR1 (UNOP, float_extend_lo_, 0, v2df) ++ VAR1 (UNOP, float_truncate_lo_, 0, v2sf) ++ + /* Implemented by aarch64_ld1. */ +- BUILTIN_VALL (LOAD1, ld1) ++ BUILTIN_VALL (LOAD1, ld1, 0) + + /* Implemented by aarch64_st1. */ +- BUILTIN_VALL (STORE1, st1) ++ BUILTIN_VALL (STORE1, st1, 0) + ++ /* Implemented by aarch64_crypto_aes. */ ++ VAR1 (BINOPU, crypto_aese, 0, v16qi) ++ VAR1 (BINOPU, crypto_aesd, 0, v16qi) ++ VAR1 (UNOPU, crypto_aesmc, 0, v16qi) ++ VAR1 (UNOPU, crypto_aesimc, 0, v16qi) ++ ++ /* Implemented by aarch64_crypto_sha1. */ ++ VAR1 (UNOPU, crypto_sha1h, 0, si) ++ VAR1 (BINOPU, crypto_sha1su1, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha1c, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha1m, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha1p, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha1su0, 0, v4si) ++ ++ /* Implemented by aarch64_crypto_sha256. */ ++ VAR1 (TERNOPU, crypto_sha256h, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha256h2, 0, v4si) ++ VAR1 (BINOPU, crypto_sha256su0, 0, v4si) ++ VAR1 (TERNOPU, crypto_sha256su1, 0, v4si) ++ ++ /* Implemented by aarch64_crypto_pmull. */ ++ VAR1 (BINOPP, crypto_pmull, 0, di) ++ VAR1 (BINOPP, crypto_pmull, 0, v2di) +--- a/src/gcc/config/aarch64/constraints.md ++++ b/src/gcc/config/aarch64/constraints.md +@@ -75,11 +75,6 @@ + "Integer constant zero." + (match_test "op == const0_rtx")) + +-(define_constraint "Usa" +- "A constraint that matches an absolute symbolic address." +- (and (match_code "const,symbol_ref") +- (match_test "aarch64_symbolic_address_p (op)"))) +- + (define_constraint "Ush" + "A constraint that matches an absolute symbolic address high part." + (and (match_code "high") +@@ -148,10 +143,25 @@ + "@internal + A constraint that matches vector of immediates." + (and (match_code "const_vector") +- (match_test "aarch64_simd_immediate_valid_for_move (op, GET_MODE (op), +- NULL, NULL, NULL, +- NULL, NULL) != 0"))) ++ (match_test "aarch64_simd_valid_immediate (op, GET_MODE (op), ++ false, NULL)"))) + ++(define_constraint "Dh" ++ "@internal ++ A constraint that matches an immediate operand valid for\ ++ AdvSIMD scalar move in HImode." ++ (and (match_code "const_int") ++ (match_test "aarch64_simd_scalar_immediate_valid_for_move (op, ++ HImode)"))) ++ ++(define_constraint "Dq" ++ "@internal ++ A constraint that matches an immediate operand valid for\ ++ AdvSIMD scalar move in QImode." ++ (and (match_code "const_int") ++ (match_test "aarch64_simd_scalar_immediate_valid_for_move (op, ++ QImode)"))) ++ + (define_constraint "Dl" + "@internal + A constraint that matches vector of immediates for left shifts." +--- a/src/gcc/config/aarch64/aarch64.c ++++ b/src/gcc/config/aarch64/aarch64.c +@@ -45,6 +45,8 @@ + #include "gimple.h" + #include "optabs.h" + #include "dwarf2.h" ++#include "cfgloop.h" ++#include "tree-vectorizer.h" + + /* Classifies an address. + +@@ -87,6 +89,15 @@ + enum aarch64_symbol_type symbol_type; + }; + ++struct simd_immediate_info ++{ ++ rtx value; ++ int shift; ++ int element_width; ++ bool mvn; ++ bool msl; ++}; ++ + /* The current code model. */ + enum aarch64_code_model aarch64_cmodel; + +@@ -103,8 +114,6 @@ + static void aarch64_elf_asm_constructor (rtx, int) ATTRIBUTE_UNUSED; + static void aarch64_elf_asm_destructor (rtx, int) ATTRIBUTE_UNUSED; + static void aarch64_override_options_after_change (void); +-static int aarch64_simd_valid_immediate (rtx, enum machine_mode, int, rtx *, +- int *, unsigned char *, int *, int *); + static bool aarch64_vector_mode_supported_p (enum machine_mode); + static unsigned bit_count (unsigned HOST_WIDE_INT); + static bool aarch64_const_vec_all_same_int_p (rtx, +@@ -178,14 +187,35 @@ + NAMED_PARAM (FP2FP, 4) + }; + ++/* Generic costs for vector insn classes. */ + #if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007 + __extension__ + #endif ++static const struct cpu_vector_cost generic_vector_cost = ++{ ++ NAMED_PARAM (scalar_stmt_cost, 1), ++ NAMED_PARAM (scalar_load_cost, 1), ++ NAMED_PARAM (scalar_store_cost, 1), ++ NAMED_PARAM (vec_stmt_cost, 1), ++ NAMED_PARAM (vec_to_scalar_cost, 1), ++ NAMED_PARAM (scalar_to_vec_cost, 1), ++ NAMED_PARAM (vec_align_load_cost, 1), ++ NAMED_PARAM (vec_unalign_load_cost, 1), ++ NAMED_PARAM (vec_unalign_store_cost, 1), ++ NAMED_PARAM (vec_store_cost, 1), ++ NAMED_PARAM (cond_taken_branch_cost, 3), ++ NAMED_PARAM (cond_not_taken_branch_cost, 1) ++}; ++ ++#if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007 ++__extension__ ++#endif + static const struct tune_params generic_tunings = + { + &generic_rtx_cost_table, + &generic_addrcost_table, + &generic_regmove_cost, ++ &generic_vector_cost, + NAMED_PARAM (memmov_cost, 4) + }; + +@@ -524,13 +554,15 @@ + return; + } + ++ case SYMBOL_TINY_ABSOLUTE: ++ emit_insn (gen_rtx_SET (Pmode, dest, imm)); ++ return; ++ + case SYMBOL_SMALL_GOT: + { + rtx tmp_reg = dest; + if (can_create_pseudo_p ()) +- { +- tmp_reg = gen_reg_rtx (Pmode); +- } ++ tmp_reg = gen_reg_rtx (Pmode); + emit_move_insn (tmp_reg, gen_rtx_HIGH (Pmode, imm)); + emit_insn (gen_ldr_got_small (dest, tmp_reg, imm)); + return; +@@ -581,6 +613,10 @@ + return; + } + ++ case SYMBOL_TINY_GOT: ++ emit_insn (gen_ldr_got_tiny (dest, imm)); ++ return; ++ + default: + gcc_unreachable (); + } +@@ -604,49 +640,85 @@ + { + rtx low_dst; + +- gcc_assert (GET_MODE (dst) == TImode); ++ enum machine_mode src_mode = GET_MODE (src); ++ enum machine_mode dst_mode = GET_MODE (dst); ++ int src_regno = REGNO (src); ++ int dst_regno = REGNO (dst); + ++ gcc_assert (dst_mode == TImode || dst_mode == TFmode); ++ + if (REG_P (dst) && REG_P (src)) + { +- int src_regno = REGNO (src); +- int dst_regno = REGNO (dst); ++ gcc_assert (src_mode == TImode || src_mode == TFmode); + +- gcc_assert (GET_MODE (src) == TImode); +- + /* Handle r -> w, w -> r. */ + if (FP_REGNUM_P (dst_regno) && GP_REGNUM_P (src_regno)) + { +- emit_insn (gen_aarch64_movtilow_di (dst, +- gen_lowpart (word_mode, src))); +- emit_insn (gen_aarch64_movtihigh_di (dst, +- gen_highpart (word_mode, src))); +- return; ++ switch (src_mode) { ++ case TImode: ++ emit_insn ++ (gen_aarch64_movtilow_di (dst, gen_lowpart (word_mode, src))); ++ emit_insn ++ (gen_aarch64_movtihigh_di (dst, gen_highpart (word_mode, src))); ++ return; ++ case TFmode: ++ emit_insn ++ (gen_aarch64_movtflow_di (dst, gen_lowpart (word_mode, src))); ++ emit_insn ++ (gen_aarch64_movtfhigh_di (dst, gen_highpart (word_mode, src))); ++ return; ++ default: ++ gcc_unreachable (); ++ } + } + else if (GP_REGNUM_P (dst_regno) && FP_REGNUM_P (src_regno)) + { +- emit_insn (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst), +- src)); +- emit_insn (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst), +- src)); +- return; ++ switch (src_mode) { ++ case TImode: ++ emit_insn ++ (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst), src)); ++ emit_insn ++ (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst), src)); ++ return; ++ case TFmode: ++ emit_insn ++ (gen_aarch64_movdi_tflow (gen_lowpart (word_mode, dst), src)); ++ emit_insn ++ (gen_aarch64_movdi_tfhigh (gen_highpart (word_mode, dst), src)); ++ return; ++ default: ++ gcc_unreachable (); ++ } + } + /* Fall through to r -> r cases. */ + } + +- low_dst = gen_lowpart (word_mode, dst); +- if (REG_P (low_dst) +- && reg_overlap_mentioned_p (low_dst, src)) +- { +- aarch64_emit_move (gen_highpart (word_mode, dst), +- gen_highpart_mode (word_mode, TImode, src)); +- aarch64_emit_move (low_dst, gen_lowpart (word_mode, src)); +- } +- else +- { +- aarch64_emit_move (low_dst, gen_lowpart (word_mode, src)); +- aarch64_emit_move (gen_highpart (word_mode, dst), +- gen_highpart_mode (word_mode, TImode, src)); +- } ++ switch (dst_mode) { ++ case TImode: ++ low_dst = gen_lowpart (word_mode, dst); ++ if (REG_P (low_dst) ++ && reg_overlap_mentioned_p (low_dst, src)) ++ { ++ aarch64_emit_move (gen_highpart (word_mode, dst), ++ gen_highpart_mode (word_mode, TImode, src)); ++ aarch64_emit_move (low_dst, gen_lowpart (word_mode, src)); ++ } ++ else ++ { ++ aarch64_emit_move (low_dst, gen_lowpart (word_mode, src)); ++ aarch64_emit_move (gen_highpart (word_mode, dst), ++ gen_highpart_mode (word_mode, TImode, src)); ++ } ++ return; ++ case TFmode: ++ emit_move_insn (gen_rtx_REG (DFmode, dst_regno), ++ gen_rtx_REG (DFmode, src_regno)); ++ emit_move_insn (gen_rtx_REG (DFmode, dst_regno + 1), ++ gen_rtx_REG (DFmode, src_regno + 1)); ++ return; ++ default: ++ gcc_unreachable (); ++ } + } + + bool +@@ -656,11 +728,99 @@ + || ! (FP_REGNUM_P (REGNO (dst)) && FP_REGNUM_P (REGNO (src)))); + } + ++/* Split a complex SIMD combine. */ ++ ++void ++aarch64_split_simd_combine (rtx dst, rtx src1, rtx src2) ++{ ++ enum machine_mode src_mode = GET_MODE (src1); ++ enum machine_mode dst_mode = GET_MODE (dst); ++ ++ gcc_assert (VECTOR_MODE_P (dst_mode)); ++ ++ if (REG_P (dst) && REG_P (src1) && REG_P (src2)) ++ { ++ rtx (*gen) (rtx, rtx, rtx); ++ ++ switch (src_mode) ++ { ++ case V8QImode: ++ gen = gen_aarch64_simd_combinev8qi; ++ break; ++ case V4HImode: ++ gen = gen_aarch64_simd_combinev4hi; ++ break; ++ case V2SImode: ++ gen = gen_aarch64_simd_combinev2si; ++ break; ++ case V2SFmode: ++ gen = gen_aarch64_simd_combinev2sf; ++ break; ++ case DImode: ++ gen = gen_aarch64_simd_combinedi; ++ break; ++ case DFmode: ++ gen = gen_aarch64_simd_combinedf; ++ break; ++ default: ++ gcc_unreachable (); ++ } ++ ++ emit_insn (gen (dst, src1, src2)); ++ return; ++ } ++} ++ ++/* Split a complex SIMD move. */ ++ ++void ++aarch64_split_simd_move (rtx dst, rtx src) ++{ ++ enum machine_mode src_mode = GET_MODE (src); ++ enum machine_mode dst_mode = GET_MODE (dst); ++ ++ gcc_assert (VECTOR_MODE_P (dst_mode)); ++ ++ if (REG_P (dst) && REG_P (src)) ++ { ++ rtx (*gen) (rtx, rtx); ++ ++ gcc_assert (VECTOR_MODE_P (src_mode)); ++ ++ switch (src_mode) ++ { ++ case V16QImode: ++ gen = gen_aarch64_split_simd_movv16qi; ++ break; ++ case V8HImode: ++ gen = gen_aarch64_split_simd_movv8hi; ++ break; ++ case V4SImode: ++ gen = gen_aarch64_split_simd_movv4si; ++ break; ++ case V2DImode: ++ gen = gen_aarch64_split_simd_movv2di; ++ break; ++ case V4SFmode: ++ gen = gen_aarch64_split_simd_movv4sf; ++ break; ++ case V2DFmode: ++ gen = gen_aarch64_split_simd_movv2df; ++ break; ++ default: ++ gcc_unreachable (); ++ } ++ ++ emit_insn (gen (dst, src)); ++ return; ++ } ++} ++ + static rtx +-aarch64_force_temporary (rtx x, rtx value) ++aarch64_force_temporary (enum machine_mode mode, rtx x, rtx value) + { + if (can_create_pseudo_p ()) +- return force_reg (Pmode, value); ++ return force_reg (mode, value); + else + { + x = aarch64_emit_move (x, value); +@@ -672,7 +832,7 @@ + static rtx + aarch64_add_offset (enum machine_mode mode, rtx temp, rtx reg, HOST_WIDE_INT offset) + { +- if (!aarch64_plus_immediate (GEN_INT (offset), DImode)) ++ if (!aarch64_plus_immediate (GEN_INT (offset), mode)) + { + rtx high; + /* Load the full offset into a register. This +@@ -679,8 +839,9 @@ + might be improvable in the future. */ + high = GEN_INT (offset); + offset = 0; +- high = aarch64_force_temporary (temp, high); +- reg = aarch64_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg)); ++ high = aarch64_force_temporary (mode, temp, high); ++ reg = aarch64_force_temporary (mode, temp, ++ gen_rtx_PLUS (mode, high, reg)); + } + return plus_constant (mode, reg, offset); + } +@@ -719,7 +880,7 @@ + && targetm.cannot_force_const_mem (mode, imm)) + { + gcc_assert(can_create_pseudo_p ()); +- base = aarch64_force_temporary (dest, base); ++ base = aarch64_force_temporary (mode, dest, base); + base = aarch64_add_offset (mode, NULL, base, INTVAL (offset)); + aarch64_emit_move (dest, base); + return; +@@ -733,10 +894,11 @@ + case SYMBOL_SMALL_TLSDESC: + case SYMBOL_SMALL_GOTTPREL: + case SYMBOL_SMALL_GOT: ++ case SYMBOL_TINY_GOT: + if (offset != const0_rtx) + { + gcc_assert(can_create_pseudo_p ()); +- base = aarch64_force_temporary (dest, base); ++ base = aarch64_force_temporary (mode, dest, base); + base = aarch64_add_offset (mode, NULL, base, INTVAL (offset)); + aarch64_emit_move (dest, base); + return; +@@ -745,6 +907,7 @@ + + case SYMBOL_SMALL_TPREL: + case SYMBOL_SMALL_ABSOLUTE: ++ case SYMBOL_TINY_ABSOLUTE: + aarch64_load_symref_appropriately (dest, imm, sty); + return; + +@@ -1810,7 +1973,7 @@ + Establish the stack frame by decreasing the stack pointer with a + properly calculated size and, if necessary, create a frame record + filled with the values of LR and previous frame pointer. The +- current FP is also set up is it is in use. */ ++ current FP is also set up if it is in use. */ + + void + aarch64_expand_prologue (void) +@@ -2553,12 +2716,14 @@ + aarch64_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x) + { + rtx base, offset; ++ + if (GET_CODE (x) == HIGH) + return true; + + split_const (x, &base, &offset); + if (GET_CODE (base) == SYMBOL_REF || GET_CODE (base) == LABEL_REF) +- return (aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR) != SYMBOL_FORCE_TO_MEM); ++ return (aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR) ++ != SYMBOL_FORCE_TO_MEM); + + return aarch64_tls_referenced_p (x); + } +@@ -2996,10 +3161,13 @@ + + /* Classify the base of symbolic expression X, given that X appears in + context CONTEXT. */ +-static enum aarch64_symbol_type +-aarch64_classify_symbolic_expression (rtx x, enum aarch64_symbol_context context) ++ ++enum aarch64_symbol_type ++aarch64_classify_symbolic_expression (rtx x, ++ enum aarch64_symbol_context context) + { + rtx offset; ++ + split_const (x, &x, &offset); + return aarch64_classify_symbol (x, context); + } +@@ -3087,10 +3255,11 @@ + if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode) + && y == const0_rtx + && (code == EQ || code == NE || code == LT || code == GE) +- && (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS || GET_CODE (x) == AND)) ++ && (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS || GET_CODE (x) == AND ++ || GET_CODE (x) == NEG)) + return CC_NZmode; + +- /* A compare with a shifted operand. Because of canonicalization, ++ /* A compare with a shifted or negated operand. Because of canonicalization, + the comparison will have to be swapped when we emit the assembly + code. */ + if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode) +@@ -3097,7 +3266,8 @@ + && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG) + && (GET_CODE (x) == ASHIFT || GET_CODE (x) == ASHIFTRT + || GET_CODE (x) == LSHIFTRT +- || GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)) ++ || GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND ++ || GET_CODE (x) == NEG)) + return CC_SWPmode; + + /* A compare of a mode narrower than SI mode against zero can be done +@@ -3282,26 +3452,6 @@ + asm_fprintf (f, "%s", reg_names [REGNO (x) + 1]); + break; + +- case 'Q': +- /* Print the least significant register of a pair (TImode) of regs. */ +- if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1)) +- { +- output_operand_lossage ("invalid operand for '%%%c'", code); +- return; +- } +- asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 1 : 0)]); +- break; +- +- case 'R': +- /* Print the most significant register of a pair (TImode) of regs. */ +- if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1)) +- { +- output_operand_lossage ("invalid operand for '%%%c'", code); +- return; +- } +- asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 0 : 1)]); +- break; +- + case 'm': + /* Print a condition (eq, ne, etc). */ + +@@ -3349,7 +3499,7 @@ + output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code); + return; + } +- asm_fprintf (f, "%s%c%d", REGISTER_PREFIX, code, REGNO (x) - V0_REGNUM); ++ asm_fprintf (f, "%c%d", code, REGNO (x) - V0_REGNUM); + break; + + case 'S': +@@ -3362,18 +3512,17 @@ + output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code); + return; + } +- asm_fprintf (f, "%sv%d", REGISTER_PREFIX, +- REGNO (x) - V0_REGNUM + (code - 'S')); ++ asm_fprintf (f, "v%d", REGNO (x) - V0_REGNUM + (code - 'S')); + break; + + case 'X': +- /* Print integer constant in hex. */ ++ /* Print bottom 16 bits of integer constant in hex. */ + if (GET_CODE (x) != CONST_INT) + { + output_operand_lossage ("invalid operand for '%%%c'", code); + return; + } +- asm_fprintf (f, "0x%wx", UINTVAL (x)); ++ asm_fprintf (f, "0x%wx", UINTVAL (x) & 0xffff); + break; + + case 'w': +@@ -3383,20 +3532,19 @@ + if (x == const0_rtx + || (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x))) + { +- asm_fprintf (f, "%s%czr", REGISTER_PREFIX, code); ++ asm_fprintf (f, "%czr", code); + break; + } + + if (REG_P (x) && GP_REGNUM_P (REGNO (x))) + { +- asm_fprintf (f, "%s%c%d", REGISTER_PREFIX, code, +- REGNO (x) - R0_REGNUM); ++ asm_fprintf (f, "%c%d", code, REGNO (x) - R0_REGNUM); + break; + } + + if (REG_P (x) && REGNO (x) == SP_REGNUM) + { +- asm_fprintf (f, "%s%ssp", REGISTER_PREFIX, code == 'w' ? "w" : ""); ++ asm_fprintf (f, "%ssp", code == 'w' ? "w" : ""); + break; + } + +@@ -3504,6 +3652,10 @@ + asm_fprintf (asm_out_file, ":tprel:"); + break; + ++ case SYMBOL_TINY_GOT: ++ gcc_unreachable (); ++ break; ++ + default: + break; + } +@@ -3533,6 +3685,10 @@ + asm_fprintf (asm_out_file, ":tprel_lo12_nc:"); + break; + ++ case SYMBOL_TINY_GOT: ++ asm_fprintf (asm_out_file, ":got:"); ++ break; ++ + default: + break; + } +@@ -3647,13 +3803,6 @@ + output_addr_const (f, x); + } + +-void +-aarch64_function_profiler (FILE *f ATTRIBUTE_UNUSED, +- int labelno ATTRIBUTE_UNUSED) +-{ +- sorry ("function profiling"); +-} +- + bool + aarch64_label_mentioned_p (rtx x) + { +@@ -3919,7 +4068,7 @@ + return offset - crtl->outgoing_args_size; + + if (from == FRAME_POINTER_REGNUM) +- return cfun->machine->frame.saved_regs_size; ++ return cfun->machine->frame.saved_regs_size + get_frame_size (); + } + + if (to == STACK_POINTER_REGNUM) +@@ -3928,6 +4077,7 @@ + { + HOST_WIDE_INT elim = crtl->outgoing_args_size + + cfun->machine->frame.saved_regs_size ++ + get_frame_size () + - cfun->machine->frame.fp_lr_offset; + elim = AARCH64_ROUND_UP (elim, STACK_BOUNDARY / BITS_PER_UNIT); + return elim; +@@ -4601,6 +4751,101 @@ + return aarch64_tune_params->memmov_cost; + } + ++/* Vectorizer cost model target hooks. */ ++ ++/* Implement targetm.vectorize.builtin_vectorization_cost. */ ++static int ++aarch64_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, ++ tree vectype, ++ int misalign ATTRIBUTE_UNUSED) ++{ ++ unsigned elements; ++ ++ switch (type_of_cost) ++ { ++ case scalar_stmt: ++ return aarch64_tune_params->vec_costs->scalar_stmt_cost; ++ ++ case scalar_load: ++ return aarch64_tune_params->vec_costs->scalar_load_cost; ++ ++ case scalar_store: ++ return aarch64_tune_params->vec_costs->scalar_store_cost; ++ ++ case vector_stmt: ++ return aarch64_tune_params->vec_costs->vec_stmt_cost; ++ ++ case vector_load: ++ return aarch64_tune_params->vec_costs->vec_align_load_cost; ++ ++ case vector_store: ++ return aarch64_tune_params->vec_costs->vec_store_cost; ++ ++ case vec_to_scalar: ++ return aarch64_tune_params->vec_costs->vec_to_scalar_cost; ++ ++ case scalar_to_vec: ++ return aarch64_tune_params->vec_costs->scalar_to_vec_cost; ++ ++ case unaligned_load: ++ return aarch64_tune_params->vec_costs->vec_unalign_load_cost; ++ ++ case unaligned_store: ++ return aarch64_tune_params->vec_costs->vec_unalign_store_cost; ++ ++ case cond_branch_taken: ++ return aarch64_tune_params->vec_costs->cond_taken_branch_cost; ++ ++ case cond_branch_not_taken: ++ return aarch64_tune_params->vec_costs->cond_not_taken_branch_cost; ++ ++ case vec_perm: ++ case vec_promote_demote: ++ return aarch64_tune_params->vec_costs->vec_stmt_cost; ++ ++ case vec_construct: ++ elements = TYPE_VECTOR_SUBPARTS (vectype); ++ return elements / 2 + 1; ++ ++ default: ++ gcc_unreachable (); ++ } ++} ++ ++/* Implement targetm.vectorize.add_stmt_cost. */ ++static unsigned ++aarch64_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind, ++ struct _stmt_vec_info *stmt_info, int misalign, ++ enum vect_cost_model_location where) ++{ ++ unsigned *cost = (unsigned *) data; ++ unsigned retval = 0; ++ ++ if (flag_vect_cost_model) ++ { ++ tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; ++ int stmt_cost = ++ aarch64_builtin_vectorization_cost (kind, vectype, misalign); ++ ++ /* Statements in an inner loop relative to the loop being ++ vectorized are weighted more heavily. The value here is ++ a function (linear for now) of the loop nest level. */ ++ if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) ++ { ++ loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (stmt_info); ++ struct loop *loop = LOOP_VINFO_LOOP (loop_info); ++ unsigned nest_level = loop_depth (loop); ++ ++ count *= nest_level; ++ } ++ ++ retval = (unsigned) (count * stmt_cost); ++ cost[where] += retval; ++ } ++ ++ return retval; ++} ++ + static void initialize_aarch64_code_model (void); + + /* Parse the architecture extension string. */ +@@ -4956,6 +5201,7 @@ + + /* Return the method that should be used to access SYMBOL_REF or + LABEL_REF X in context CONTEXT. */ ++ + enum aarch64_symbol_type + aarch64_classify_symbol (rtx x, + enum aarch64_symbol_context context ATTRIBUTE_UNUSED) +@@ -4969,6 +5215,8 @@ + + case AARCH64_CMODEL_TINY_PIC: + case AARCH64_CMODEL_TINY: ++ return SYMBOL_TINY_ABSOLUTE; ++ + case AARCH64_CMODEL_SMALL_PIC: + case AARCH64_CMODEL_SMALL: + return SYMBOL_SMALL_ABSOLUTE; +@@ -4978,71 +5226,47 @@ + } + } + +- gcc_assert (GET_CODE (x) == SYMBOL_REF); +- +- switch (aarch64_cmodel) ++ if (GET_CODE (x) == SYMBOL_REF) + { +- case AARCH64_CMODEL_LARGE: +- return SYMBOL_FORCE_TO_MEM; +- +- case AARCH64_CMODEL_TINY: +- case AARCH64_CMODEL_SMALL: +- +- /* This is needed to get DFmode, TImode constants to be loaded off +- the constant pool. Is it necessary to dump TImode values into +- the constant pool. We don't handle TImode constant loads properly +- yet and hence need to use the constant pool. */ +- if (CONSTANT_POOL_ADDRESS_P (x)) ++ if (aarch64_cmodel == AARCH64_CMODEL_LARGE ++ || CONSTANT_POOL_ADDRESS_P (x)) + return SYMBOL_FORCE_TO_MEM; + + if (aarch64_tls_symbol_p (x)) + return aarch64_classify_tls_symbol (x); + +- if (SYMBOL_REF_WEAK (x)) +- return SYMBOL_FORCE_TO_MEM; ++ switch (aarch64_cmodel) ++ { ++ case AARCH64_CMODEL_TINY: ++ if (SYMBOL_REF_WEAK (x)) ++ return SYMBOL_FORCE_TO_MEM; ++ return SYMBOL_TINY_ABSOLUTE; + +- return SYMBOL_SMALL_ABSOLUTE; ++ case AARCH64_CMODEL_SMALL: ++ if (SYMBOL_REF_WEAK (x)) ++ return SYMBOL_FORCE_TO_MEM; ++ return SYMBOL_SMALL_ABSOLUTE; + +- case AARCH64_CMODEL_TINY_PIC: +- case AARCH64_CMODEL_SMALL_PIC: ++ case AARCH64_CMODEL_TINY_PIC: ++ if (!aarch64_symbol_binds_local_p (x)) ++ return SYMBOL_TINY_GOT; ++ return SYMBOL_TINY_ABSOLUTE; + +- if (CONSTANT_POOL_ADDRESS_P (x)) +- return SYMBOL_FORCE_TO_MEM; ++ case AARCH64_CMODEL_SMALL_PIC: ++ if (!aarch64_symbol_binds_local_p (x)) ++ return SYMBOL_SMALL_GOT; ++ return SYMBOL_SMALL_ABSOLUTE; + +- if (aarch64_tls_symbol_p (x)) +- return aarch64_classify_tls_symbol (x); ++ default: ++ gcc_unreachable (); ++ } ++ } + +- if (!aarch64_symbol_binds_local_p (x)) +- return SYMBOL_SMALL_GOT; +- +- return SYMBOL_SMALL_ABSOLUTE; +- +- default: +- gcc_unreachable (); +- } + /* By default push everything into the constant pool. */ + return SYMBOL_FORCE_TO_MEM; + } + +-/* Return true if X is a symbolic constant that can be used in context +- CONTEXT. If it is, store the type of the symbol in *SYMBOL_TYPE. */ +- + bool +-aarch64_symbolic_constant_p (rtx x, enum aarch64_symbol_context context, +- enum aarch64_symbol_type *symbol_type) +-{ +- rtx offset; +- split_const (x, &x, &offset); +- if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF) +- *symbol_type = aarch64_classify_symbol (x, context); +- else +- return false; +- +- /* No checking of offset at this point. */ +- return true; +-} +- +-bool + aarch64_constant_address_p (rtx x) + { + return (CONSTANT_P (x) && memory_address_p (DImode, x)); +@@ -5092,8 +5316,7 @@ + /* This could probably go away because + we now decompose CONST_INTs according to expand_mov_immediate. */ + if ((GET_CODE (x) == CONST_VECTOR +- && aarch64_simd_valid_immediate (x, mode, false, +- NULL, NULL, NULL, NULL, NULL) != -1) ++ && aarch64_simd_valid_immediate (x, mode, false, NULL)) + || CONST_INT_P (x) || aarch64_valid_floating_const (mode, x)) + return !targetm.cannot_force_const_mem (mode, x); + +@@ -5924,32 +6147,57 @@ + return false; + } + +-/* Return quad mode as the preferred SIMD mode. */ ++/* Return appropriate SIMD container ++ for MODE within a vector of WIDTH bits. */ + static enum machine_mode +-aarch64_preferred_simd_mode (enum machine_mode mode) ++aarch64_simd_container_mode (enum machine_mode mode, unsigned width) + { ++ gcc_assert (width == 64 || width == 128); + if (TARGET_SIMD) +- switch (mode) +- { +- case DFmode: +- return V2DFmode; +- case SFmode: +- return V4SFmode; +- case SImode: +- return V4SImode; +- case HImode: +- return V8HImode; +- case QImode: +- return V16QImode; +- case DImode: +- return V2DImode; +- break; +- +- default:; +- } ++ { ++ if (width == 128) ++ switch (mode) ++ { ++ case DFmode: ++ return V2DFmode; ++ case SFmode: ++ return V4SFmode; ++ case SImode: ++ return V4SImode; ++ case HImode: ++ return V8HImode; ++ case QImode: ++ return V16QImode; ++ case DImode: ++ return V2DImode; ++ default: ++ break; ++ } ++ else ++ switch (mode) ++ { ++ case SFmode: ++ return V2SFmode; ++ case SImode: ++ return V2SImode; ++ case HImode: ++ return V4HImode; ++ case QImode: ++ return V8QImode; ++ default: ++ break; ++ } ++ } + return word_mode; + } + ++/* Return 128-bit container as the preferred SIMD mode for MODE. */ ++static enum machine_mode ++aarch64_preferred_simd_mode (enum machine_mode mode) ++{ ++ return aarch64_simd_container_mode (mode, 128); ++} ++ + /* Return the bitmask of possible vector sizes for the vectorizer + to iterate over. */ + static unsigned int +@@ -5999,6 +6247,7 @@ + { V2DFmode, "__builtin_aarch64_simd_df", "13__Float64x2_t" }, + { V16QImode, "__builtin_aarch64_simd_poly8", "12__Poly8x16_t" }, + { V8HImode, "__builtin_aarch64_simd_poly16", "12__Poly16x8_t" }, ++ { V2DImode, "__builtin_aarch64_simd_poly64", "12__Poly64x2_t" }, + { VOIDmode, NULL, NULL } + }; + +@@ -6037,7 +6286,7 @@ + } + + /* Return the equivalent letter for size. */ +-static unsigned char ++static char + sizetochar (int size) + { + switch (size) +@@ -6084,15 +6333,10 @@ + return aarch64_float_const_representable_p (x0); + } + +-/* TODO: This function returns values similar to those +- returned by neon_valid_immediate in gcc/config/arm/arm.c +- but the API here is different enough that these magic numbers +- are not used. It should be sufficient to return true or false. */ +-static int +-aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, int inverse, +- rtx *modconst, int *elementwidth, +- unsigned char *elementchar, +- int *mvn, int *shift) ++/* Return true for valid and false for invalid. */ ++bool ++aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, bool inverse, ++ struct simd_immediate_info *info) + { + #define CHECK(STRIDE, ELSIZE, CLASS, TEST, SHIFT, NEG) \ + matches = 1; \ +@@ -6103,7 +6347,6 @@ + { \ + immtype = (CLASS); \ + elsize = (ELSIZE); \ +- elchar = sizetochar (elsize); \ + eshift = (SHIFT); \ + emvn = (NEG); \ + break; \ +@@ -6112,7 +6355,6 @@ + unsigned int i, elsize = 0, idx = 0, n_elts = CONST_VECTOR_NUNITS (op); + unsigned int innersize = GET_MODE_SIZE (GET_MODE_INNER (mode)); + unsigned char bytes[16]; +- unsigned char elchar = 0; + int immtype = -1, matches; + unsigned int invmask = inverse ? 0xff : 0; + int eshift, emvn; +@@ -6119,29 +6361,19 @@ + + if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT) + { +- bool simd_imm_zero = aarch64_simd_imm_zero_p (op, mode); +- int elem_width = GET_MODE_BITSIZE (GET_MODE (CONST_VECTOR_ELT (op, 0))); ++ if (! (aarch64_simd_imm_zero_p (op, mode) ++ || aarch64_vect_float_const_representable_p (op))) ++ return false; + +- if (!(simd_imm_zero +- || aarch64_vect_float_const_representable_p (op))) +- return -1; ++ if (info) ++ { ++ info->value = CONST_VECTOR_ELT (op, 0); ++ info->element_width = GET_MODE_BITSIZE (GET_MODE (info->value)); ++ info->mvn = false; ++ info->shift = 0; ++ } + +- if (modconst) +- *modconst = CONST_VECTOR_ELT (op, 0); +- +- if (elementwidth) +- *elementwidth = elem_width; +- +- if (elementchar) +- *elementchar = sizetochar (elem_width); +- +- if (shift) +- *shift = 0; +- +- if (simd_imm_zero) +- return 19; +- else +- return 18; ++ return true; + } + + /* Splat vector constant out into a byte vector. */ +@@ -6215,16 +6447,16 @@ + CHECK (2, 16, 11, bytes[i] == 0xff && bytes[i + 1] == bytes[1], 8, 1); + + CHECK (4, 32, 12, bytes[i] == 0xff && bytes[i + 1] == bytes[1] +- && bytes[i + 2] == 0 && bytes[i + 3] == 0, 0, 0); ++ && bytes[i + 2] == 0 && bytes[i + 3] == 0, 8, 0); + + CHECK (4, 32, 13, bytes[i] == 0 && bytes[i + 1] == bytes[1] +- && bytes[i + 2] == 0xff && bytes[i + 3] == 0xff, 0, 1); ++ && bytes[i + 2] == 0xff && bytes[i + 3] == 0xff, 8, 1); + + CHECK (4, 32, 14, bytes[i] == 0xff && bytes[i + 1] == 0xff +- && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0, 0, 0); ++ && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0, 16, 0); + + CHECK (4, 32, 15, bytes[i] == 0 && bytes[i + 1] == 0 +- && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0xff, 0, 1); ++ && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0xff, 16, 1); + + CHECK (1, 8, 16, bytes[i] == bytes[0], 0, 0); + +@@ -6233,31 +6465,20 @@ + } + while (0); + +- /* TODO: Currently the assembler cannot handle types 12 to 15. +- And there is no way to specify cmode through the compiler. +- Disable them till there is support in the assembler. */ +- if (immtype == -1 +- || (immtype >= 12 && immtype <= 15) +- || immtype == 18) +- return -1; ++ if (immtype == -1) ++ return false; + ++ if (info) ++ { ++ info->element_width = elsize; ++ info->mvn = emvn != 0; ++ info->shift = eshift; + +- if (elementwidth) +- *elementwidth = elsize; ++ unsigned HOST_WIDE_INT imm = 0; + +- if (elementchar) +- *elementchar = elchar; ++ if (immtype >= 12 && immtype <= 15) ++ info->msl = true; + +- if (mvn) +- *mvn = emvn; +- +- if (shift) +- *shift = eshift; +- +- if (modconst) +- { +- unsigned HOST_WIDE_INT imm = 0; +- + /* Un-invert bytes of recognized vector, if necessary. */ + if (invmask != 0) + for (i = 0; i < idx; i++) +@@ -6272,68 +6493,27 @@ + imm |= (unsigned HOST_WIDE_INT) (bytes[i] ? 0xff : 0) + << (i * BITS_PER_UNIT); + +- *modconst = GEN_INT (imm); +- } ++ ++ info->value = GEN_INT (imm); ++ } + else +- { +- unsigned HOST_WIDE_INT imm = 0; ++ { ++ for (i = 0; i < elsize / BITS_PER_UNIT; i++) ++ imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT); + +- for (i = 0; i < elsize / BITS_PER_UNIT; i++) +- imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT); +- + /* Construct 'abcdefgh' because the assembler cannot handle +- generic constants. */ +- gcc_assert (shift != NULL && mvn != NULL); +- if (*mvn) ++ generic constants. */ ++ if (info->mvn) + imm = ~imm; +- imm = (imm >> *shift) & 0xff; +- *modconst = GEN_INT (imm); +- } ++ imm = (imm >> info->shift) & 0xff; ++ info->value = GEN_INT (imm); ++ } + } + +- return immtype; ++ return true; + #undef CHECK + } + +-/* Return TRUE if rtx X is legal for use as either a AdvSIMD MOVI instruction +- (or, implicitly, MVNI) immediate. Write back width per element +- to *ELEMENTWIDTH, and a modified constant (whatever should be output +- for a MOVI instruction) in *MODCONST. */ +-int +-aarch64_simd_immediate_valid_for_move (rtx op, enum machine_mode mode, +- rtx *modconst, int *elementwidth, +- unsigned char *elementchar, +- int *mvn, int *shift) +-{ +- rtx tmpconst; +- int tmpwidth; +- unsigned char tmpwidthc; +- int tmpmvn = 0, tmpshift = 0; +- int retval = aarch64_simd_valid_immediate (op, mode, 0, &tmpconst, +- &tmpwidth, &tmpwidthc, +- &tmpmvn, &tmpshift); +- +- if (retval == -1) +- return 0; +- +- if (modconst) +- *modconst = tmpconst; +- +- if (elementwidth) +- *elementwidth = tmpwidth; +- +- if (elementchar) +- *elementchar = tmpwidthc; +- +- if (mvn) +- *mvn = tmpmvn; +- +- if (shift) +- *shift = tmpshift; +- +- return 1; +-} +- + static bool + aarch64_const_vec_all_same_int_p (rtx x, + HOST_WIDE_INT minval, +@@ -6395,6 +6575,25 @@ + return true; + } + ++bool ++aarch64_mov_operand_p (rtx x, ++ enum aarch64_symbol_context context, ++ enum machine_mode mode) ++{ ++ if (GET_CODE (x) == HIGH ++ && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0)))) ++ return true; ++ ++ if (CONST_INT_P (x) && aarch64_move_imm (INTVAL (x), mode)) ++ return true; ++ ++ if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x)) ++ return true; ++ ++ return aarch64_classify_symbolic_expression (x, context) ++ == SYMBOL_TINY_ABSOLUTE; ++} ++ + /* Return a const_int vector of VAL. */ + rtx + aarch64_simd_gen_const_vector_dup (enum machine_mode mode, int val) +@@ -6409,6 +6608,19 @@ + return gen_rtx_CONST_VECTOR (mode, v); + } + ++/* Check OP is a legal scalar immediate for the MOVI instruction. */ ++ ++bool ++aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode) ++{ ++ enum machine_mode vmode; ++ ++ gcc_assert (!VECTOR_MODE_P (mode)); ++ vmode = aarch64_preferred_simd_mode (mode); ++ rtx op_v = aarch64_simd_gen_const_vector_dup (vmode, INTVAL (op)); ++ return aarch64_simd_valid_immediate (op_v, vmode, false, NULL); ++} ++ + /* Construct and return a PARALLEL RTX vector. */ + rtx + aarch64_simd_vect_par_cnst_half (enum machine_mode mode, bool high) +@@ -6634,8 +6846,7 @@ + gcc_unreachable (); + + if (const_vec != NULL_RTX +- && aarch64_simd_immediate_valid_for_move (const_vec, mode, NULL, NULL, +- NULL, NULL, NULL)) ++ && aarch64_simd_valid_immediate (const_vec, mode, false, NULL)) + /* Load using MOVI/MVNI. */ + return const_vec; + else if ((const_dup = aarch64_simd_dup_constant (vals)) != NULL_RTX) +@@ -7193,49 +7404,80 @@ + } + + char* +-aarch64_output_simd_mov_immediate (rtx *const_vector, ++aarch64_output_simd_mov_immediate (rtx const_vector, + enum machine_mode mode, + unsigned width) + { +- int is_valid; +- unsigned char widthc; +- int lane_width_bits; ++ bool is_valid; + static char templ[40]; +- int shift = 0, mvn = 0; + const char *mnemonic; ++ const char *shift_op; + unsigned int lane_count = 0; ++ char element_char; + +- is_valid = +- aarch64_simd_immediate_valid_for_move (*const_vector, mode, +- const_vector, &lane_width_bits, +- &widthc, &mvn, &shift); ++ struct simd_immediate_info info = { NULL_RTX, 0, 0, false, false }; ++ ++ /* This will return true to show const_vector is legal for use as either ++ a AdvSIMD MOVI instruction (or, implicitly, MVNI) immediate. It will ++ also update INFO to show how the immediate should be generated. */ ++ is_valid = aarch64_simd_valid_immediate (const_vector, mode, false, &info); + gcc_assert (is_valid); + ++ element_char = sizetochar (info.element_width); ++ lane_count = width / info.element_width; ++ + mode = GET_MODE_INNER (mode); + if (mode == SFmode || mode == DFmode) + { +- bool zero_p = +- aarch64_float_const_zero_rtx_p (*const_vector); +- gcc_assert (shift == 0); +- mnemonic = zero_p ? "movi" : "fmov"; ++ gcc_assert (info.shift == 0 && ! info.mvn); ++ if (aarch64_float_const_zero_rtx_p (info.value)) ++ info.value = GEN_INT (0); ++ else ++ { ++#define buf_size 20 ++ REAL_VALUE_TYPE r; ++ REAL_VALUE_FROM_CONST_DOUBLE (r, info.value); ++ char float_buf[buf_size] = {'\0'}; ++ real_to_decimal_for_mode (float_buf, &r, buf_size, buf_size, 1, mode); ++#undef buf_size ++ ++ if (lane_count == 1) ++ snprintf (templ, sizeof (templ), "fmov\t%%d0, %s", float_buf); ++ else ++ snprintf (templ, sizeof (templ), "fmov\t%%0.%d%c, %s", ++ lane_count, element_char, float_buf); ++ return templ; ++ } + } +- else +- mnemonic = mvn ? "mvni" : "movi"; + +- gcc_assert (lane_width_bits != 0); +- lane_count = width / lane_width_bits; ++ mnemonic = info.mvn ? "mvni" : "movi"; ++ shift_op = info.msl ? "msl" : "lsl"; + + if (lane_count == 1) +- snprintf (templ, sizeof (templ), "%s\t%%d0, %%1", mnemonic); +- else if (shift) +- snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, %%1, lsl %d", +- mnemonic, lane_count, widthc, shift); ++ snprintf (templ, sizeof (templ), "%s\t%%d0, " HOST_WIDE_INT_PRINT_HEX, ++ mnemonic, UINTVAL (info.value)); ++ else if (info.shift) ++ snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, " HOST_WIDE_INT_PRINT_HEX ++ ", %s %d", mnemonic, lane_count, element_char, ++ UINTVAL (info.value), shift_op, info.shift); + else +- snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, %%1", +- mnemonic, lane_count, widthc); ++ snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, " HOST_WIDE_INT_PRINT_HEX, ++ mnemonic, lane_count, element_char, UINTVAL (info.value)); + return templ; + } + ++char* ++aarch64_output_scalar_simd_mov_immediate (rtx immediate, ++ enum machine_mode mode) ++{ ++ enum machine_mode vmode; ++ ++ gcc_assert (!VECTOR_MODE_P (mode)); ++ vmode = aarch64_simd_container_mode (mode, 64); ++ rtx v_op = aarch64_simd_gen_const_vector_dup (vmode, INTVAL (immediate)); ++ return aarch64_output_simd_mov_immediate (v_op, vmode, 64); ++} ++ + /* Split operands into moves from op[1] + op[2] into op[0]. */ + + void +@@ -7860,6 +8102,9 @@ + #undef TARGET_EXPAND_BUILTIN_VA_START + #define TARGET_EXPAND_BUILTIN_VA_START aarch64_expand_builtin_va_start + ++#undef TARGET_FOLD_BUILTIN ++#define TARGET_FOLD_BUILTIN aarch64_fold_builtin ++ + #undef TARGET_FUNCTION_ARG + #define TARGET_FUNCTION_ARG aarch64_function_arg + +@@ -7881,6 +8126,9 @@ + #undef TARGET_FRAME_POINTER_REQUIRED + #define TARGET_FRAME_POINTER_REQUIRED aarch64_frame_pointer_required + ++#undef TARGET_GIMPLE_FOLD_BUILTIN ++#define TARGET_GIMPLE_FOLD_BUILTIN aarch64_gimple_fold_builtin ++ + #undef TARGET_GIMPLIFY_VA_ARG_EXPR + #define TARGET_GIMPLIFY_VA_ARG_EXPR aarch64_gimplify_va_arg_expr + +@@ -7960,6 +8208,13 @@ + #undef TARGET_ARRAY_MODE_SUPPORTED_P + #define TARGET_ARRAY_MODE_SUPPORTED_P aarch64_array_mode_supported_p + ++#undef TARGET_VECTORIZE_ADD_STMT_COST ++#define TARGET_VECTORIZE_ADD_STMT_COST aarch64_add_stmt_cost ++ ++#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST ++#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \ ++ aarch64_builtin_vectorization_cost ++ + #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE + #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE aarch64_preferred_simd_mode + +--- a/src/gcc/config/aarch64/iterators.md ++++ b/src/gcc/config/aarch64/iterators.md +@@ -83,6 +83,9 @@ + ;; Vector Float modes. + (define_mode_iterator VDQF [V2SF V4SF V2DF]) + ++;; Modes suitable to use as the return type of a vcond expression. ++(define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI]) ++ + ;; All Float modes. + (define_mode_iterator VALLF [V2SF V4SF V2DF SF DF]) + +@@ -125,9 +128,15 @@ + ;; Vector modes except double int. + (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF]) + ++;; Vector modes for Q and H types. ++(define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI]) ++ + ;; Vector modes for H and S types. + (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) + ++;; Vector modes for Q, H and S types. ++(define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI]) ++ + ;; Vector and scalar integer modes for H and S + (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI]) + +@@ -163,10 +172,15 @@ + [ + UNSPEC_ASHIFT_SIGNED ; Used in aarch-simd.md. + UNSPEC_ASHIFT_UNSIGNED ; Used in aarch64-simd.md. ++ UNSPEC_FMAX ; Used in aarch64-simd.md. ++ UNSPEC_FMAXNMV ; Used in aarch64-simd.md. + UNSPEC_FMAXV ; Used in aarch64-simd.md. ++ UNSPEC_FMIN ; Used in aarch64-simd.md. ++ UNSPEC_FMINNMV ; Used in aarch64-simd.md. + UNSPEC_FMINV ; Used in aarch64-simd.md. + UNSPEC_FADDV ; Used in aarch64-simd.md. +- UNSPEC_ADDV ; Used in aarch64-simd.md. ++ UNSPEC_SADDV ; Used in aarch64-simd.md. ++ UNSPEC_UADDV ; Used in aarch64-simd.md. + UNSPEC_SMAXV ; Used in aarch64-simd.md. + UNSPEC_SMINV ; Used in aarch64-simd.md. + UNSPEC_UMAXV ; Used in aarch64-simd.md. +@@ -223,9 +237,6 @@ + UNSPEC_SSHLL ; Used in aarch64-simd.md. + UNSPEC_USHLL ; Used in aarch64-simd.md. + UNSPEC_ADDP ; Used in aarch64-simd.md. +- UNSPEC_FMAX ; Used in aarch64-simd.md. +- UNSPEC_FMIN ; Used in aarch64-simd.md. +- UNSPEC_BSL ; Used in aarch64-simd.md. + UNSPEC_TBL ; Used in vector permute patterns. + UNSPEC_CONCAT ; Used in vector permute patterns. + UNSPEC_ZIP1 ; Used in vector permute patterns. +@@ -234,6 +245,22 @@ + UNSPEC_UZP2 ; Used in vector permute patterns. + UNSPEC_TRN1 ; Used in vector permute patterns. + UNSPEC_TRN2 ; Used in vector permute patterns. ++ UNSPEC_AESE ; Used in aarch64-simd.md. ++ UNSPEC_AESD ; Used in aarch64-simd.md. ++ UNSPEC_AESMC ; Used in aarch64-simd.md. ++ UNSPEC_AESIMC ; Used in aarch64-simd.md. ++ UNSPEC_SHA1C ; Used in aarch64-simd.md. ++ UNSPEC_SHA1M ; Used in aarch64-simd.md. ++ UNSPEC_SHA1P ; Used in aarch64-simd.md. ++ UNSPEC_SHA1H ; Used in aarch64-simd.md. ++ UNSPEC_SHA1SU0 ; Used in aarch64-simd.md. ++ UNSPEC_SHA1SU1 ; Used in aarch64-simd.md. ++ UNSPEC_SHA256H ; Used in aarch64-simd.md. ++ UNSPEC_SHA256H2 ; Used in aarch64-simd.md. ++ UNSPEC_SHA256SU0 ; Used in aarch64-simd.md. ++ UNSPEC_SHA256SU1 ; Used in aarch64-simd.md. ++ UNSPEC_PMULL ; Used in aarch64-simd.md. ++ UNSPEC_PMULL2 ; Used in aarch64-simd.md. + ]) + + ;; ------------------------------------------------------------------- +@@ -244,6 +271,9 @@ + ;; 32-bit version and "%x0" in the 64-bit version. + (define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")]) + ++;; For constraints used in scalar immediate vector moves ++(define_mode_attr hq [(HI "h") (QI "q")]) ++ + ;; For scalar usage of vector/FP registers + (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d") + (SF "s") (DF "d") +@@ -377,7 +407,8 @@ + ;; Double modes of vector modes (lower case). + (define_mode_attr Vdbl [(V8QI "v16qi") (V4HI "v8hi") + (V2SI "v4si") (V2SF "v4sf") +- (SI "v2si") (DI "v2di")]) ++ (SI "v2si") (DI "v2di") ++ (DF "v2df")]) + + ;; Narrowed modes for VDN. + (define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI") +@@ -432,6 +463,15 @@ + (V2SF "s") (V4SF "s") + (V2DF "d")]) + ++;; Corresponding core element mode for each vector mode. This is a ++;; variation on mapping FP modes to GP regs. ++(define_mode_attr vwcore [(V8QI "w") (V16QI "w") ++ (V4HI "w") (V8HI "w") ++ (V2SI "w") (V4SI "w") ++ (DI "x") (V2DI "x") ++ (V2SF "w") (V4SF "w") ++ (V2DF "x")]) ++ + ;; Double vector types for ALLX. + (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")]) + +@@ -527,9 +567,14 @@ + ;; Iterator for integer conversions + (define_code_iterator FIXUORS [fix unsigned_fix]) + ++;; Iterator for float conversions ++(define_code_iterator FLOATUORS [float unsigned_float]) ++ + ;; Code iterator for variants of vector max and min. + (define_code_iterator MAXMIN [smax smin umax umin]) + ++(define_code_iterator FMAXMIN [smax smin]) ++ + ;; Code iterator for variants of vector max and min. + (define_code_iterator ADDSUB [plus minus]) + +@@ -548,6 +593,9 @@ + ;; Unsigned comparison operators. + (define_code_iterator UCOMPARISONS [ltu leu geu gtu]) + ++;; Unsigned comparison operators. ++(define_code_iterator FAC_COMPARISONS [lt le ge gt]) ++ + ;; ------------------------------------------------------------------- + ;; Code Attributes + ;; ------------------------------------------------------------------- +@@ -560,6 +608,10 @@ + (zero_extend "zero_extend") + (sign_extract "extv") + (zero_extract "extzv") ++ (fix "fix") ++ (unsigned_fix "fixuns") ++ (float "float") ++ (unsigned_float "floatuns") + (and "and") + (ior "ior") + (xor "xor") +@@ -599,10 +651,14 @@ + (define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT") + (ltu "LTU") (leu "LEU") (geu "GEU") (gtu "GTU")]) + ++(define_code_attr fix_trunc_optab [(fix "fix_trunc") ++ (unsigned_fix "fixuns_trunc")]) ++ + ;; Optab prefix for sign/zero-extending operations + (define_code_attr su_optab [(sign_extend "") (zero_extend "u") + (div "") (udiv "u") + (fix "") (unsigned_fix "u") ++ (float "s") (unsigned_float "u") + (ss_plus "s") (us_plus "u") + (ss_minus "s") (us_minus "u")]) + +@@ -627,7 +683,9 @@ + (define_code_attr su [(sign_extend "s") (zero_extend "u") + (sign_extract "s") (zero_extract "u") + (fix "s") (unsigned_fix "u") +- (div "s") (udiv "u")]) ++ (div "s") (udiv "u") ++ (smax "s") (umax "u") ++ (smin "s") (umin "u")]) + + ;; Emit cbz/cbnz depending on comparison type. + (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")]) +@@ -636,10 +694,10 @@ + (define_code_attr tbz [(eq "tbz") (ne "tbnz") (lt "tbnz") (ge "tbz")]) + + ;; Max/min attributes. +-(define_code_attr maxmin [(smax "smax") +- (smin "smin") +- (umax "umax") +- (umin "umin")]) ++(define_code_attr maxmin [(smax "max") ++ (smin "min") ++ (umax "max") ++ (umin "min")]) + + ;; MLA/MLS attributes. + (define_code_attr as [(ss_plus "a") (ss_minus "s")]) +@@ -661,8 +719,11 @@ + (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV + UNSPEC_SMAXV UNSPEC_SMINV]) + +-(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV]) ++(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV ++ UNSPEC_FMAXNMV UNSPEC_FMINNMV]) + ++(define_int_iterator SUADDV [UNSPEC_SADDV UNSPEC_UADDV]) ++ + (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD + UNSPEC_SRHADD UNSPEC_URHADD + UNSPEC_SHSUB UNSPEC_UHSUB +@@ -675,7 +736,7 @@ + (define_int_iterator ADDSUBHN2 [UNSPEC_ADDHN2 UNSPEC_RADDHN2 + UNSPEC_SUBHN2 UNSPEC_RSUBHN2]) + +-(define_int_iterator FMAXMIN [UNSPEC_FMAX UNSPEC_FMIN]) ++(define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN]) + + (define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH]) + +@@ -711,25 +772,46 @@ + UNSPEC_UZP1 UNSPEC_UZP2]) + + (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM +- UNSPEC_FRINTI UNSPEC_FRINTX UNSPEC_FRINTA]) ++ UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX ++ UNSPEC_FRINTA]) + + (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM +- UNSPEC_FRINTA]) ++ UNSPEC_FRINTA UNSPEC_FRINTN]) + ++(define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX]) ++ ++(define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD]) ++(define_int_iterator CRYPTO_AESMC [UNSPEC_AESMC UNSPEC_AESIMC]) ++ ++(define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P]) ++ ++(define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2]) ++ + ;; ------------------------------------------------------------------- + ;; Int Iterators Attributes. + ;; ------------------------------------------------------------------- +-(define_int_attr maxminv [(UNSPEC_UMAXV "umax") +- (UNSPEC_UMINV "umin") +- (UNSPEC_SMAXV "smax") +- (UNSPEC_SMINV "smin")]) ++(define_int_attr maxmin_uns [(UNSPEC_UMAXV "umax") ++ (UNSPEC_UMINV "umin") ++ (UNSPEC_SMAXV "smax") ++ (UNSPEC_SMINV "smin") ++ (UNSPEC_FMAX "smax_nan") ++ (UNSPEC_FMAXNMV "smax") ++ (UNSPEC_FMAXV "smax_nan") ++ (UNSPEC_FMIN "smin_nan") ++ (UNSPEC_FMINNMV "smin") ++ (UNSPEC_FMINV "smin_nan")]) + +-(define_int_attr fmaxminv [(UNSPEC_FMAXV "max") +- (UNSPEC_FMINV "min")]) ++(define_int_attr maxmin_uns_op [(UNSPEC_UMAXV "umax") ++ (UNSPEC_UMINV "umin") ++ (UNSPEC_SMAXV "smax") ++ (UNSPEC_SMINV "smin") ++ (UNSPEC_FMAX "fmax") ++ (UNSPEC_FMAXNMV "fmaxnm") ++ (UNSPEC_FMAXV "fmax") ++ (UNSPEC_FMIN "fmin") ++ (UNSPEC_FMINNMV "fminnm") ++ (UNSPEC_FMINV "fmin")]) + +-(define_int_attr fmaxmin [(UNSPEC_FMAX "fmax") +- (UNSPEC_FMIN "fmin")]) +- + (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u") + (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur") + (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u") +@@ -740,6 +822,7 @@ + (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r") + (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u") + (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su") ++ (UNSPEC_SADDV "s") (UNSPEC_UADDV "u") + (UNSPEC_SSLI "s") (UNSPEC_USLI "u") + (UNSPEC_SSRI "s") (UNSPEC_USRI "u") + (UNSPEC_USRA "u") (UNSPEC_SSRA "s") +@@ -798,15 +881,18 @@ + (UNSPEC_FRINTM "floor") + (UNSPEC_FRINTI "nearbyint") + (UNSPEC_FRINTX "rint") +- (UNSPEC_FRINTA "round")]) ++ (UNSPEC_FRINTA "round") ++ (UNSPEC_FRINTN "frintn")]) + + ;; frint suffix for floating-point rounding instructions. + (define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p") + (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i") +- (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a")]) ++ (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a") ++ (UNSPEC_FRINTN "n")]) + + (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round") +- (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor")]) ++ (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor") ++ (UNSPEC_FRINTN "frintn")]) + + (define_int_attr perm_insn [(UNSPEC_ZIP1 "zip") (UNSPEC_ZIP2 "zip") + (UNSPEC_TRN1 "trn") (UNSPEC_TRN2 "trn") +@@ -815,3 +901,13 @@ + (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2") + (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2") + (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2")]) ++ ++(define_int_attr frecp_suffix [(UNSPEC_FRECPE "e") (UNSPEC_FRECPX "x")]) ++ ++(define_int_attr aes_op [(UNSPEC_AESE "e") (UNSPEC_AESD "d")]) ++(define_int_attr aesmc_op [(UNSPEC_AESMC "mc") (UNSPEC_AESIMC "imc")]) ++ ++(define_int_attr sha1_op [(UNSPEC_SHA1C "c") (UNSPEC_SHA1P "p") ++ (UNSPEC_SHA1M "m")]) ++ ++(define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")]) +--- a/src/gcc/config/aarch64/aarch64.h ++++ b/src/gcc/config/aarch64/aarch64.h +@@ -49,6 +49,8 @@ + break; \ + } \ + \ ++ if (TARGET_CRYPTO) \ ++ builtin_define ("__ARM_FEATURE_CRYPTO"); \ + } while (0) + + +@@ -151,6 +153,7 @@ + #define AARCH64_FL_FP (1 << 1) /* Has FP. */ + #define AARCH64_FL_CRYPTO (1 << 2) /* Has crypto. */ + #define AARCH64_FL_SLOWMUL (1 << 3) /* A slow multiply core. */ ++#define AARCH64_FL_CRC (1 << 4) /* Has CRC. */ + + /* Has FP and SIMD. */ + #define AARCH64_FL_FPSIMD (AARCH64_FL_FP | AARCH64_FL_SIMD) +@@ -163,6 +166,7 @@ + + /* Macros to test ISA flags. */ + extern unsigned long aarch64_isa_flags; ++#define AARCH64_ISA_CRC (aarch64_isa_flags & AARCH64_FL_CRC) + #define AARCH64_ISA_CRYPTO (aarch64_isa_flags & AARCH64_FL_CRYPTO) + #define AARCH64_ISA_FP (aarch64_isa_flags & AARCH64_FL_FP) + #define AARCH64_ISA_SIMD (aarch64_isa_flags & AARCH64_FL_SIMD) +@@ -171,6 +175,8 @@ + extern unsigned long aarch64_tune_flags; + #define AARCH64_TUNE_SLOWMUL (aarch64_tune_flags & AARCH64_FL_SLOWMUL) + ++/* Crypto is an optional feature. */ ++#define TARGET_CRYPTO AARCH64_ISA_CRYPTO + + /* Standard register usage. */ + +@@ -434,7 +440,7 @@ + #define INDEX_REG_CLASS CORE_REGS + #define BASE_REG_CLASS POINTER_REGS + +-/* Register pairs used to eliminate unneeded registers that point intoi ++/* Register pairs used to eliminate unneeded registers that point into + the stack frame. */ + #define ELIMINABLE_REGS \ + { \ +@@ -475,7 +481,7 @@ + /* Stack layout; function entry, exit and calling. */ + #define STACK_GROWS_DOWNWARD 1 + +-#define FRAME_GROWS_DOWNWARD 0 ++#define FRAME_GROWS_DOWNWARD 1 + + #define STARTING_FRAME_OFFSET 0 + +@@ -521,12 +527,6 @@ + #endif + + +-/* Which ABI to use. */ +-enum arm_abi_type +-{ +- ARM_ABI_AAPCS64 +-}; +- + enum arm_pcs + { + ARM_PCS_AAPCS64, /* Base standard AAPCS for 64 bit. */ +@@ -534,11 +534,7 @@ + }; + + +-extern enum arm_abi_type arm_abi; + extern enum arm_pcs arm_pcs_variant; +-#ifndef ARM_DEFAULT_ABI +-#define ARM_DEFAULT_ABI ARM_ABI_AAPCS64 +-#endif + + #ifndef ARM_DEFAULT_PCS + #define ARM_DEFAULT_PCS ARM_PCS_AAPCS64 +@@ -709,6 +705,8 @@ + + #define SELECT_CC_MODE(OP, X, Y) aarch64_select_cc_mode (OP, X, Y) + ++#define REVERSIBLE_CC_MODE(MODE) 1 ++ + #define REVERSE_CONDITION(CODE, MODE) \ + (((MODE) == CCFPmode || (MODE) == CCFPEmode) \ + ? reverse_condition_maybe_unordered (CODE) \ +@@ -758,9 +756,23 @@ + #define PRINT_OPERAND_ADDRESS(STREAM, X) \ + aarch64_print_operand_address (STREAM, X) + +-#define FUNCTION_PROFILER(STREAM, LABELNO) \ +- aarch64_function_profiler (STREAM, LABELNO) ++#define MCOUNT_NAME "_mcount" + ++#define NO_PROFILE_COUNTERS 1 ++ ++/* Emit rtl for profiling. Output assembler code to FILE ++ to call "_mcount" for profiling a function entry. */ ++#define PROFILE_HOOK(LABEL) \ ++{ \ ++ rtx fun,lr; \ ++ lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \ ++ fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \ ++ emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \ ++} ++ ++/* All the work done in PROFILE_HOOK, but still required. */ ++#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0) ++ + /* For some reason, the Linux headers think they know how to define + these macros. They don't!!! */ + #undef ASM_APP_ON +--- a/src/gcc/config/arm/arm1020e.md ++++ b/src/gcc/config/arm/arm1020e.md +@@ -66,13 +66,14 @@ + ;; ALU operations with no shifted operand + (define_insn_reservation "1020alu_op" 1 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "1020a_e,1020a_m,1020a_w") + + ;; ALU operations with a shift-by-constant operand + (define_insn_reservation "1020alu_shift_op" 1 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "type" "simple_alu_shift,alu_shift")) ++ (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift")) + "1020a_e,1020a_m,1020a_w") + + ;; ALU operations with a shift-by-register operand +@@ -81,7 +82,7 @@ + ;; the execute stage. + (define_insn_reservation "1020alu_shift_reg_op" 2 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "type" "alu_shift_reg")) ++ (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")) + "1020a_e*2,1020a_m,1020a_w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -96,7 +97,7 @@ + ;; until after the memory stage. + (define_insn_reservation "1020mult1" 2 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "smulxy,smulwy")) ++ (eq_attr "type" "smulxy,smulwy")) + "1020a_e,1020a_m,1020a_w") + + ;; The "smlaxy" and "smlawx" instructions require two iterations through +@@ -104,7 +105,7 @@ + ;; the execute stage. + (define_insn_reservation "1020mult2" 2 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "smlaxy,smlalxy,smlawx")) ++ (eq_attr "type" "smlaxy,smlalxy,smlawx")) + "1020a_e*2,1020a_m,1020a_w") + + ;; The "smlalxy", "mul", and "mla" instructions require two iterations +@@ -112,7 +113,7 @@ + ;; the memory stage. + (define_insn_reservation "1020mult3" 3 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "smlalxy,mul,mla")) ++ (eq_attr "type" "smlalxy,mul,mla")) + "1020a_e*2,1020a_m,1020a_w") + + ;; The "muls" and "mlas" instructions loop in the execute stage for +@@ -120,7 +121,7 @@ + ;; available after three iterations. + (define_insn_reservation "1020mult4" 3 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "muls,mlas")) ++ (eq_attr "type" "muls,mlas")) + "1020a_e*4,1020a_m,1020a_w") + + ;; Long multiply instructions that produce two registers of +@@ -135,7 +136,7 @@ + ;; available after the memory cycle. + (define_insn_reservation "1020mult5" 4 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "umull,umlal,smull,smlal")) ++ (eq_attr "type" "umull,umlal,smull,smlal")) + "1020a_e*3,1020a_m,1020a_w") + + ;; The "umulls", "umlals", "smulls", and "smlals" instructions loop in +@@ -143,7 +144,7 @@ + ;; The value result is available after four iterations. + (define_insn_reservation "1020mult6" 4 + (and (eq_attr "tune" "arm1020e,arm1022e") +- (eq_attr "insn" "umulls,umlals,smulls,smlals")) ++ (eq_attr "type" "umulls,umlals,smulls,smlals")) + "1020a_e*5,1020a_m,1020a_w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/cortex-a15.md ++++ b/src/gcc/config/arm/cortex-a15.md +@@ -61,7 +61,9 @@ + ;; Simple ALU without shift + (define_insn_reservation "cortex_a15_alu" 2 + (and (eq_attr "tune" "cortexa15") +- (and (eq_attr "type" "alu_reg,simple_alu_imm") ++ (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,\ ++ mvn_imm,mvn_reg") + (eq_attr "neon_type" "none"))) + "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)") + +@@ -68,7 +70,7 @@ + ;; ALU ops with immediate shift + (define_insn_reservation "cortex_a15_alu_shift" 3 + (and (eq_attr "tune" "cortexa15") +- (and (eq_attr "type" "simple_alu_shift,alu_shift") ++ (and (eq_attr "type" "extend,arlo_shift,,mov_shift,mvn_shift") + (eq_attr "neon_type" "none"))) + "ca15_issue1,(ca15_sx1,ca15_sx1+ca15_sx1_shf,ca15_sx1_alu)\ + |(ca15_sx2,ca15_sx2+ca15_sx2_shf,ca15_sx2_alu)") +@@ -76,7 +78,7 @@ + ;; ALU ops with register controlled shift + (define_insn_reservation "cortex_a15_alu_shift_reg" 3 + (and (eq_attr "tune" "cortexa15") +- (and (eq_attr "type" "alu_shift_reg") ++ (and (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg") + (eq_attr "neon_type" "none"))) + "(ca15_issue2,ca15_sx1+ca15_sx2,ca15_sx1_shf,ca15_sx2_alu)\ + |(ca15_issue1,(ca15_issue1+ca15_sx2,ca15_sx1+ca15_sx2_shf)\ +@@ -87,28 +89,26 @@ + ;; 32-bit multiplies + (define_insn_reservation "cortex_a15_mult32" 3 + (and (eq_attr "tune" "cortexa15") +- (and (eq_attr "type" "mult") +- (and (eq_attr "neon_type" "none") +- (eq_attr "mul64" "no")))) ++ (and (eq_attr "mul32" "yes") ++ (eq_attr "neon_type" "none"))) + "ca15_issue1,ca15_mx") + + ;; 64-bit multiplies + (define_insn_reservation "cortex_a15_mult64" 4 + (and (eq_attr "tune" "cortexa15") +- (and (eq_attr "type" "mult") +- (and (eq_attr "neon_type" "none") +- (eq_attr "mul64" "yes")))) ++ (and (eq_attr "mul64" "yes") ++ (eq_attr "neon_type" "none"))) + "ca15_issue1,ca15_mx*2") + + ;; Integer divide + (define_insn_reservation "cortex_a15_udiv" 9 + (and (eq_attr "tune" "cortexa15") +- (eq_attr "insn" "udiv")) ++ (eq_attr "type" "udiv")) + "ca15_issue1,ca15_mx") + + (define_insn_reservation "cortex_a15_sdiv" 10 + (and (eq_attr "tune" "cortexa15") +- (eq_attr "insn" "sdiv")) ++ (eq_attr "type" "sdiv")) + "ca15_issue1,ca15_mx") + + ;; Block all issue pipes for a cycle +--- a/src/gcc/config/arm/arm-tables.opt ++++ b/src/gcc/config/arm/arm-tables.opt +@@ -250,6 +250,9 @@ + Enum(processor_type) String(cortex-a15) Value(cortexa15) + + EnumValue ++Enum(processor_type) String(cortex-a53) Value(cortexa53) ++ ++EnumValue + Enum(processor_type) String(cortex-r4) Value(cortexr4) + + EnumValue +@@ -259,6 +262,9 @@ + Enum(processor_type) String(cortex-r5) Value(cortexr5) + + EnumValue ++Enum(processor_type) String(cortex-r7) Value(cortexr7) ++ ++EnumValue + Enum(processor_type) String(cortex-m4) Value(cortexm4) + + EnumValue +@@ -353,11 +359,14 @@ + Enum(arm_arch) String(armv8-a) Value(23) + + EnumValue +-Enum(arm_arch) String(iwmmxt) Value(24) ++Enum(arm_arch) String(armv8-a+crc) Value(24) + + EnumValue +-Enum(arm_arch) String(iwmmxt2) Value(25) ++Enum(arm_arch) String(iwmmxt) Value(25) + ++EnumValue ++Enum(arm_arch) String(iwmmxt2) Value(26) ++ + Enum + Name(arm_fpu) Type(int) + Known ARM FPUs (for use with the -mfpu= option): +--- a/src/gcc/config/arm/arm1026ejs.md ++++ b/src/gcc/config/arm/arm1026ejs.md +@@ -66,13 +66,14 @@ + ;; ALU operations with no shifted operand + (define_insn_reservation "alu_op" 1 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "a_e,a_m,a_w") + + ;; ALU operations with a shift-by-constant operand + (define_insn_reservation "alu_shift_op" 1 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "type" "simple_alu_shift,alu_shift")) ++ (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift")) + "a_e,a_m,a_w") + + ;; ALU operations with a shift-by-register operand +@@ -81,7 +82,7 @@ + ;; the execute stage. + (define_insn_reservation "alu_shift_reg_op" 2 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "type" "alu_shift_reg")) ++ (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")) + "a_e*2,a_m,a_w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -96,7 +97,7 @@ + ;; until after the memory stage. + (define_insn_reservation "mult1" 2 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "smulxy,smulwy")) ++ (eq_attr "type" "smulxy,smulwy")) + "a_e,a_m,a_w") + + ;; The "smlaxy" and "smlawx" instructions require two iterations through +@@ -104,7 +105,7 @@ + ;; the execute stage. + (define_insn_reservation "mult2" 2 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "smlaxy,smlalxy,smlawx")) ++ (eq_attr "type" "smlaxy,smlalxy,smlawx")) + "a_e*2,a_m,a_w") + + ;; The "smlalxy", "mul", and "mla" instructions require two iterations +@@ -112,7 +113,7 @@ + ;; the memory stage. + (define_insn_reservation "mult3" 3 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "smlalxy,mul,mla")) ++ (eq_attr "type" "smlalxy,mul,mla")) + "a_e*2,a_m,a_w") + + ;; The "muls" and "mlas" instructions loop in the execute stage for +@@ -120,7 +121,7 @@ + ;; available after three iterations. + (define_insn_reservation "mult4" 3 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "muls,mlas")) ++ (eq_attr "type" "muls,mlas")) + "a_e*4,a_m,a_w") + + ;; Long multiply instructions that produce two registers of +@@ -135,7 +136,7 @@ + ;; available after the memory cycle. + (define_insn_reservation "mult5" 4 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "umull,umlal,smull,smlal")) ++ (eq_attr "type" "umull,umlal,smull,smlal")) + "a_e*3,a_m,a_w") + + ;; The "umulls", "umlals", "smulls", and "smlals" instructions loop in +@@ -143,7 +144,7 @@ + ;; The value result is available after four iterations. + (define_insn_reservation "mult6" 4 + (and (eq_attr "tune" "arm1026ejs") +- (eq_attr "insn" "umulls,umlals,smulls,smlals")) ++ (eq_attr "type" "umulls,umlals,smulls,smlals")) + "a_e*5,a_m,a_w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/linux-elf.h ++++ b/src/gcc/config/arm/linux-elf.h +@@ -44,9 +44,9 @@ + + #define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + ++/* We do not have any MULTILIB_OPTIONS specified, so there are no ++ MULTILIB_DEFAULTS. */ + #undef MULTILIB_DEFAULTS +-#define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mfloat-abi=hard", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +--- a/src/gcc/config/arm/arm1136jfs.md ++++ b/src/gcc/config/arm/arm1136jfs.md +@@ -75,13 +75,14 @@ + ;; ALU operations with no shifted operand + (define_insn_reservation "11_alu_op" 2 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "e_1,e_2,e_3,e_wb") + + ;; ALU operations with a shift-by-constant operand + (define_insn_reservation "11_alu_shift_op" 2 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "type" "simple_alu_shift,alu_shift")) ++ (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift")) + "e_1,e_2,e_3,e_wb") + + ;; ALU operations with a shift-by-register operand +@@ -90,7 +91,7 @@ + ;; the shift stage. + (define_insn_reservation "11_alu_shift_reg_op" 3 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "type" "alu_shift_reg")) ++ (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")) + "e_1*2,e_2,e_3,e_wb") + + ;; alu_ops can start sooner, if there is no shifter dependency +@@ -129,13 +130,13 @@ + ;; Multiply and multiply-accumulate results are available after four stages. + (define_insn_reservation "11_mult1" 4 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "mul,mla")) ++ (eq_attr "type" "mul,mla")) + "e_1*2,e_2,e_3,e_wb") + + ;; The *S variants set the condition flags, which requires three more cycles. + (define_insn_reservation "11_mult2" 4 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "muls,mlas")) ++ (eq_attr "type" "muls,mlas")) + "e_1*2,e_2,e_3,e_wb") + + (define_bypass 3 "11_mult1,11_mult2" +@@ -160,13 +161,13 @@ + ;; the two multiply-accumulate instructions. + (define_insn_reservation "11_mult3" 5 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "smull,umull,smlal,umlal")) ++ (eq_attr "type" "smull,umull,smlal,umlal")) + "e_1*3,e_2,e_3,e_wb*2") + + ;; The *S variants set the condition flags, which requires three more cycles. + (define_insn_reservation "11_mult4" 5 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "smulls,umulls,smlals,umlals")) ++ (eq_attr "type" "smulls,umulls,smlals,umlals")) + "e_1*3,e_2,e_3,e_wb*2") + + (define_bypass 4 "11_mult3,11_mult4" +@@ -190,7 +191,8 @@ + ;; cycles. + (define_insn_reservation "11_mult5" 3 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "smulxy,smlaxy,smulwy,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx")) ++ (eq_attr "type" "smulxy,smlaxy,smulwy,smlawy,smuad,smuadx,smlad,smladx,\ ++ smusd,smusdx,smlsd,smlsdx")) + "e_1,e_2,e_3,e_wb") + + (define_bypass 2 "11_mult5" +@@ -211,7 +213,7 @@ + ;; The same idea, then the 32-bit result is added to a 64-bit quantity. + (define_insn_reservation "11_mult6" 4 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "smlalxy")) ++ (eq_attr "type" "smlalxy")) + "e_1*2,e_2,e_3,e_wb*2") + + ;; Signed 32x32 multiply, then the most significant 32 bits are extracted +@@ -218,7 +220,7 @@ + ;; and are available after the memory stage. + (define_insn_reservation "11_mult7" 4 + (and (eq_attr "tune" "arm1136js,arm1136jfs") +- (eq_attr "insn" "smmul,smmulr")) ++ (eq_attr "type" "smmul,smmulr")) + "e_1*2,e_2,e_3,e_wb") + + (define_bypass 3 "11_mult6,11_mult7" +--- a/src/gcc/config/arm/marvell-pj4.md ++++ b/src/gcc/config/arm/marvell-pj4.md +@@ -41,41 +41,39 @@ + + (define_insn_reservation "pj4_alu_e1" 1 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "simple_alu_imm,alu_reg") +- (not (eq_attr "conds" "set")) +- (eq_attr "insn" "mov,mvn")) ++ (eq_attr "type" "mov_imm,mov_reg,mvn_imm,mvn_reg") ++ (not (eq_attr "conds" "set"))) + "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_alu_e1_conds" 4 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "simple_alu_imm,alu_reg") +- (eq_attr "conds" "set") +- (eq_attr "insn" "mov,mvn")) ++ (eq_attr "type" "mov_imm,mov_reg,mvn_imm,mvn_reg") ++ (eq_attr "conds" "set")) + "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_alu" 1 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "simple_alu_imm,alu_reg") +- (not (eq_attr "conds" "set")) +- (not (eq_attr "insn" "mov,mvn"))) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg") ++ (not (eq_attr "conds" "set"))) + "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_alu_conds" 4 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "simple_alu_imm,alu_reg") +- (eq_attr "conds" "set") +- (not (eq_attr "insn" "mov,mvn"))) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg") ++ (eq_attr "conds" "set")) + "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_shift" 1 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift") ++ (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\ ++ mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg") + (not (eq_attr "conds" "set")) + (eq_attr "shift" "1")) "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_shift_conds" 4 + (and (eq_attr "tune" "marvell_pj4") +- (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift") ++ (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\ ++ mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg") + (eq_attr "conds" "set") + (eq_attr "shift" "1")) "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)") + +@@ -82,13 +80,15 @@ + (define_insn_reservation "pj4_alu_shift" 1 + (and (eq_attr "tune" "marvell_pj4") + (not (eq_attr "conds" "set")) +- (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift")) ++ (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\ ++ mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg")) + "pj4_is,(pj4_alu1,nothing,pj4_w1+pj4_cp)|(pj4_alu2,nothing,pj4_w2+pj4_cp)") + + (define_insn_reservation "pj4_alu_shift_conds" 4 + (and (eq_attr "tune" "marvell_pj4") + (eq_attr "conds" "set") +- (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift")) ++ (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\ ++ mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg")) + "pj4_is,(pj4_alu1,nothing,pj4_w1+pj4_cp)|(pj4_alu2,nothing,pj4_w2+pj4_cp)") + + (define_bypass 2 "pj4_alu_shift,pj4_shift" +@@ -95,10 +95,14 @@ + "pj4_ir_mul,pj4_ir_div,pj4_core_to_vfp") + + (define_insn_reservation "pj4_ir_mul" 3 +- (and (eq_attr "tune" "marvell_pj4") (eq_attr "type" "mult")) "pj4_is,pj4_mul,nothing*2,pj4_cp") ++ (and (eq_attr "tune" "marvell_pj4") ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes"))) ++ "pj4_is,pj4_mul,nothing*2,pj4_cp") + + (define_insn_reservation "pj4_ir_div" 20 +- (and (eq_attr "tune" "marvell_pj4") (eq_attr "insn" "udiv,sdiv")) "pj4_is,pj4_div*19,pj4_cp") ++ (and (eq_attr "tune" "marvell_pj4") ++ (eq_attr "type" "udiv,sdiv")) "pj4_is,pj4_div*19,pj4_cp") + + ;; Branches and calls. + +--- a/src/gcc/config/arm/thumb2.md ++++ b/src/gcc/config/arm/thumb2.md +@@ -60,105 +60,230 @@ + "TARGET_THUMB2" + "bic%?\\t%0, %1, %2%S4" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "shift" "2") +- (set_attr "type" "alu_shift")] ++ (set_attr "type" "arlo_shift")] + ) + +-(define_insn "*thumb2_smaxsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +- (smax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") +- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) ++;; We use the '0' constraint for operand 1 because reload should ++;; be smart enough to generate an appropriate move for the r/r/r case. ++(define_insn_and_split "*thumb2_smaxsi3" ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r") ++ (smax:SI (match_operand:SI 1 "s_register_operand" "%0,0,0") ++ (match_operand:SI 2 "arm_rhs_operand" "r,Py,I"))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_THUMB2" +- "@ +- cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %2 +- cmp\\t%1, %2\;it\\tge\;movge\\t%0, %1 +- cmp\\t%1, %2\;ite\\tge\;movge\\t%0, %1\;movlt\\t%0, %2" ++ "TARGET_THUMB2" ++ "#" ++ ; cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %2 ++ "TARGET_THUMB2 && reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (cond_exec (lt:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") +- (set_attr "length" "10,10,14")] ++ (set_attr "enabled_for_depr_it" "yes,yes,no") ++ (set_attr "length" "6,6,10")] + ) + +-(define_insn "*thumb2_sminsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +- (smin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") +- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) ++(define_insn_and_split "*thumb2_sminsi3" ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r") ++ (smin:SI (match_operand:SI 1 "s_register_operand" "%0,0,0") ++ (match_operand:SI 2 "arm_rhs_operand" "r,Py,I"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "@ +- cmp\\t%1, %2\;it\\tge\;movge\\t%0, %2 +- cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %1 +- cmp\\t%1, %2\;ite\\tlt\;movlt\\t%0, %1\;movge\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;it\\tge\;movge\\t%0, %2 ++ "TARGET_THUMB2 && reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (cond_exec (ge:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") +- (set_attr "length" "10,10,14")] ++ (set_attr "enabled_for_depr_it" "yes,yes,no") ++ (set_attr "length" "6,6,10")] + ) + +-(define_insn "*thumb32_umaxsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +- (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") +- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) +- (clobber (reg:CC CC_REGNUM))] ++(define_insn_and_split "*thumb32_umaxsi3" ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r") ++ (umax:SI (match_operand:SI 1 "s_register_operand" "%0,0,0") ++ (match_operand:SI 2 "arm_rhs_operand" "r,Py,I"))) ++ (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "@ +- cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %2 +- cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %1 +- cmp\\t%1, %2\;ite\\tcs\;movcs\\t%0, %1\;movcc\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %2 ++ "TARGET_THUMB2 && reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (cond_exec (ltu:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") +- (set_attr "length" "10,10,14")] ++ (set_attr "length" "6,6,10") ++ (set_attr "enabled_for_depr_it" "yes,yes,no")] + ) + +-(define_insn "*thumb2_uminsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +- (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") +- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) ++(define_insn_and_split "*thumb2_uminsi3" ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r") ++ (umin:SI (match_operand:SI 1 "s_register_operand" "%0,0,0") ++ (match_operand:SI 2 "arm_rhs_operand" "r,Py,I"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "@ +- cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %2 +- cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %1 +- cmp\\t%1, %2\;ite\\tcc\;movcc\\t%0, %1\;movcs\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %2 ++ "TARGET_THUMB2 && reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (cond_exec (geu:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") +- (set_attr "length" "10,10,14")] ++ (set_attr "length" "6,6,10") ++ (set_attr "enabled_for_depr_it" "yes,yes,no")] + ) + + ;; Thumb-2 does not have rsc, so use a clever trick with shifter operands. +-(define_insn "*thumb2_negdi2" ++(define_insn_and_split "*thumb2_negdi2" + [(set (match_operand:DI 0 "s_register_operand" "=&r,r") + (neg:DI (match_operand:DI 1 "s_register_operand" "?r,0"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "negs\\t%Q0, %Q1\;sbc\\t%R0, %R1, %R1, lsl #1" ++ "#" ; negs\\t%Q0, %Q1\;sbc\\t%R0, %R1, %R1, lsl #1 ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (const_int 0) (match_dup 1))) ++ (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1)))]) ++ (set (match_dup 2) (minus:SI (minus:SI (match_dup 3) ++ (ashift:SI (match_dup 3) ++ (const_int 1))) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[2] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[3] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) + +-(define_insn "*thumb2_abssi2" +- [(set (match_operand:SI 0 "s_register_operand" "=r,&r") +- (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))) ++(define_insn_and_split "*thumb2_abssi2" ++ [(set (match_operand:SI 0 "s_register_operand" "=&r,l,r") ++ (abs:SI (match_operand:SI 1 "s_register_operand" "r,0,0"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "@ +- cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0 +- eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31" +- [(set_attr "conds" "clob,*") ++ "#" ++ ; eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31 ++ ; cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0 ++ ; cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0 ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ if (REGNO(operands[0]) == REGNO(operands[1])) ++ { ++ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM); ++ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ cc_reg, ++ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx))); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ (gen_rtx_LT (SImode, ++ cc_reg, ++ const0_rtx)), ++ (gen_rtx_SET (VOIDmode, ++ operands[0], ++ (gen_rtx_MINUS (SImode, ++ const0_rtx, ++ operands[1])))))); ++ } ++ else ++ { ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_XOR (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[1]))); ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_MINUS (SImode, ++ operands[0], ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31))))); ++ } ++ DONE; ++ } ++ [(set_attr "conds" "*,clob,clob") + (set_attr "shift" "1") +- (set_attr "predicable" "no, yes") ++ (set_attr "predicable" "yes,no,no") ++ (set_attr "predicable_short_it" "no") ++ (set_attr "enabled_for_depr_it" "yes,yes,no") + (set_attr "ce_count" "2") +- (set_attr "length" "10,8")] ++ (set_attr "length" "8,6,10")] + ) + +-(define_insn "*thumb2_neg_abssi2" +- [(set (match_operand:SI 0 "s_register_operand" "=r,&r") +- (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))) ++(define_insn_and_split "*thumb2_neg_abssi2" ++ [(set (match_operand:SI 0 "s_register_operand" "=&r,l,r") ++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "r,0,0")))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "@ +- cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0 +- eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31" +- [(set_attr "conds" "clob,*") ++ "#" ++ ; eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31 ++ ; cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0 ++ ; cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0 ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ if (REGNO(operands[0]) == REGNO(operands[1])) ++ { ++ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM); ++ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ cc_reg, ++ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx))); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ (gen_rtx_GT (SImode, ++ cc_reg, ++ const0_rtx)), ++ (gen_rtx_SET (VOIDmode, ++ operands[0], ++ (gen_rtx_MINUS (SImode, ++ const0_rtx, ++ operands[1])))))); ++ } ++ else ++ { ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_XOR (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[1]))); ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_MINUS (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[0]))); ++ } ++ DONE; ++ } ++ [(set_attr "conds" "*,clob,clob") + (set_attr "shift" "1") +- (set_attr "predicable" "no, yes") ++ (set_attr "predicable" "yes,no,no") ++ (set_attr "enabled_for_depr_it" "yes,yes,no") ++ (set_attr "predicable_short_it" "no") + (set_attr "ce_count" "2") +- (set_attr "length" "10,8")] ++ (set_attr "length" "8,6,10")] + ) + + ;; We have two alternatives here for memory loads (and similarly for stores) +@@ -167,8 +292,8 @@ + ;; regs. The high register alternatives are not taken into account when + ;; choosing register preferences in order to reflect their expense. + (define_insn "*thumb2_movsi_insn" +- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,l ,*hk,m,*m") +- (match_operand:SI 1 "general_operand" "rk ,I,K,j,mi,*mi,l,*hk"))] ++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,l,r,r,l ,*hk,m,*m") ++ (match_operand:SI 1 "general_operand" "rk,I,Py,K,j,mi,*mi,l,*hk"))] + "TARGET_THUMB2 && ! TARGET_IWMMXT + && !(TARGET_HARD_FLOAT && TARGET_VFP) + && ( register_operand (operands[0], SImode) +@@ -176,6 +301,7 @@ + "@ + mov%?\\t%0, %1 + mov%?\\t%0, %1 ++ mov%?\\t%0, %1 + mvn%?\\t%0, #%B1 + movw%?\\t%0, %1 + ldr%?\\t%0, %1 +@@ -182,10 +308,12 @@ + ldr%?\\t%0, %1 + str%?\\t%1, %0 + str%?\\t%1, %0" +- [(set_attr "type" "*,*,simple_alu_imm,*,load1,load1,store1,store1") ++ [(set_attr "type" "*,arlo_imm,arlo_imm,arlo_imm,*,load1,load1,store1,store1") ++ (set_attr "length" "2,4,2,4,4,4,4,4,4") + (set_attr "predicable" "yes") +- (set_attr "pool_range" "*,*,*,*,1018,4094,*,*") +- (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")] ++ (set_attr "predicable_short_it" "yes,no,yes,no,no,no,no,no,no") ++ (set_attr "pool_range" "*,*,*,*,*,1018,4094,*,*") ++ (set_attr "neg_pool_range" "*,*,*,*,*,0,0,*,*")] + ) + + (define_insn "tls_load_dot_plus_four" +@@ -223,6 +351,21 @@ + (set_attr "neg_pool_range" "*,*,*,250")] + ) + ++(define_insn "*thumb2_storewb_pairsi" ++ [(set (match_operand:SI 0 "register_operand" "=&kr") ++ (plus:SI (match_operand:SI 1 "register_operand" "0") ++ (match_operand:SI 2 "const_int_operand" "n"))) ++ (set (mem:SI (plus:SI (match_dup 0) (match_dup 2))) ++ (match_operand:SI 3 "register_operand" "r")) ++ (set (mem:SI (plus:SI (match_dup 0) ++ (match_operand:SI 5 "const_int_operand" "n"))) ++ (match_operand:SI 4 "register_operand" "r"))] ++ "TARGET_THUMB2 ++ && INTVAL (operands[5]) == INTVAL (operands[2]) + 4" ++ "strd\\t%3, %4, [%0, %2]!" ++ [(set_attr "type" "store2")] ++) ++ + (define_insn "*thumb2_cmpsi_neg_shiftsi" + [(set (reg:CC CC_REGNUM) + (compare:CC (match_operand:SI 0 "s_register_operand" "r") +@@ -233,57 +376,170 @@ + "cmn%?\\t%0, %1%S3" + [(set_attr "conds" "set") + (set_attr "shift" "1") +- (set_attr "type" "alu_shift")] ++ (set_attr "type" "arlo_shift")] + ) + +-(define_insn "*thumb2_mov_scc" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++(define_insn_and_split "*thumb2_mov_scc" ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r") + (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)]))] + "TARGET_THUMB2" +- "ite\\t%D1\;mov%D1\\t%0, #0\;mov%d1\\t%0, #1" ++ "#" ; "ite\\t%D1\;mov%D1\\t%0, #0\;mov%d1\\t%0, #1" ++ "TARGET_THUMB2" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (const_int 1) ++ (const_int 0)))] ++ "" + [(set_attr "conds" "use") +- (set_attr "length" "10")] ++ (set_attr "enabled_for_depr_it" "yes,no") ++ (set_attr "length" "8,10")] + ) + +-(define_insn "*thumb2_mov_negscc" ++(define_insn_and_split "*thumb2_mov_negscc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (neg:SI (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)])))] ++ "TARGET_THUMB2 && !arm_restrict_it" ++ "#" ; "ite\\t%D1\;mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" + "TARGET_THUMB2" +- "ite\\t%D1\;mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (match_dup 3) ++ (const_int 0)))] ++ { ++ operands[3] = GEN_INT (~0); ++ } + [(set_attr "conds" "use") + (set_attr "length" "10")] + ) + +-(define_insn "*thumb2_mov_notscc" ++(define_insn_and_split "*thumb2_mov_negscc_strict_it" ++ [(set (match_operand:SI 0 "low_register_operand" "=l") ++ (neg:SI (match_operator:SI 1 "arm_comparison_operator" ++ [(match_operand 2 "cc_register" "") (const_int 0)])))] ++ "TARGET_THUMB2 && arm_restrict_it" ++ "#" ; ";mvn\\t%0, #0 ;it\\t%D1\;mov%D1\\t%0, #0\" ++ "&& reload_completed" ++ [(set (match_dup 0) ++ (match_dup 3)) ++ (cond_exec (match_dup 4) ++ (set (match_dup 0) ++ (const_int 0)))] ++ { ++ operands[3] = GEN_INT (~0); ++ enum machine_mode mode = GET_MODE (operands[2]); ++ enum rtx_code rc = GET_CODE (operands[1]); ++ ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ ++ } ++ [(set_attr "conds" "use") ++ (set_attr "length" "8")] ++) ++ ++(define_insn_and_split "*thumb2_mov_notscc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (not:SI (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)])))] ++ "TARGET_THUMB2 && !arm_restrict_it" ++ "#" ; "ite\\t%D1\;mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1" + "TARGET_THUMB2" +- "ite\\t%D1\;mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (match_dup 3) ++ (match_dup 4)))] ++ { ++ operands[3] = GEN_INT (~1); ++ operands[4] = GEN_INT (~0); ++ } + [(set_attr "conds" "use") + (set_attr "length" "10")] + ) + +-(define_insn "*thumb2_movsicc_insn" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r") ++(define_insn_and_split "*thumb2_mov_notscc_strict_it" ++ [(set (match_operand:SI 0 "low_register_operand" "=l") ++ (not:SI (match_operator:SI 1 "arm_comparison_operator" ++ [(match_operand 2 "cc_register" "") (const_int 0)])))] ++ "TARGET_THUMB2 && arm_restrict_it" ++ "#" ; "mvn %0, #0 ; it%d1 ; lsl%d1 %0, %0, #1" ++ "&& reload_completed" ++ [(set (match_dup 0) ++ (match_dup 3)) ++ (cond_exec (match_dup 4) ++ (set (match_dup 0) ++ (ashift:SI (match_dup 0) ++ (const_int 1))))] ++ { ++ operands[3] = GEN_INT (~0); ++ operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]), ++ VOIDmode, operands[2], const0_rtx); ++ } ++ [(set_attr "conds" "use") ++ (set_attr "length" "8")] ++) ++ ++(define_insn_and_split "*thumb2_movsicc_insn" ++ [(set (match_operand:SI 0 "s_register_operand" "=l,l,r,r,r,r,r,r,r,r,r") + (if_then_else:SI + (match_operator 3 "arm_comparison_operator" + [(match_operand 4 "cc_register" "") (const_int 0)]) +- (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K") +- (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))] ++ (match_operand:SI 1 "arm_not_operand" "0 ,lPy,0 ,0,rI,K,rI,rI,K ,K,r") ++ (match_operand:SI 2 "arm_not_operand" "lPy,0 ,rI,K,0 ,0,rI,K ,rI,K,r")))] + "TARGET_THUMB2" + "@ + it\\t%D3\;mov%D3\\t%0, %2 ++ it\\t%d3\;mov%d3\\t%0, %1 ++ it\\t%D3\;mov%D3\\t%0, %2 + it\\t%D3\;mvn%D3\\t%0, #%B2 + it\\t%d3\;mov%d3\\t%0, %1 + it\\t%d3\;mvn%d3\\t%0, #%B1 +- ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2 +- ite\\t%d3\;mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 +- ite\\t%d3\;mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 +- ite\\t%d3\;mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" +- [(set_attr "length" "6,6,6,6,10,10,10,10") ++ # ++ # ++ # ++ # ++ #" ++ ; alt 6: ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2 ++ ; alt 7: ite\\t%d3\;mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 ++ ; alt 8: ite\\t%d3\;mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 ++ ; alt 9: ite\\t%d3\;mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2 ++ ; alt 10: ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2 ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ enum rtx_code rev_code; ++ enum machine_mode mode; ++ rtx rev_cond; ++ ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ operands[3], ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ operands[1]))); ++ rev_code = GET_CODE (operands[3]); ++ mode = GET_MODE (operands[4]); ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rev_code = reverse_condition_maybe_unordered (rev_code); ++ else ++ rev_code = reverse_condition (rev_code); ++ ++ rev_cond = gen_rtx_fmt_ee (rev_code, ++ VOIDmode, ++ gen_rtx_REG (mode, CC_REGNUM), ++ const0_rtx); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ rev_cond, ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ operands[2]))); ++ DONE; ++ } ++ [(set_attr "length" "4,4,6,6,6,6,10,10,10,10,6") ++ (set_attr "enabled_for_depr_it" "yes,yes,no,no,no,no,no,no,no,no,yes") + (set_attr "conds" "use")] + ) + +@@ -333,28 +589,74 @@ + ;; addresses will have the thumb bit set correctly. + + +-(define_insn "*thumb2_and_scc" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++(define_insn_and_split "*thumb2_and_scc" ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts") + (and:SI (match_operator:SI 1 "arm_comparison_operator" +- [(match_operand 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 2 "s_register_operand" "r")))] ++ [(match_operand 2 "cc_register" "") (const_int 0)]) ++ (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_THUMB2" +- "ite\\t%D1\;mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1" ++ "#" ; "and\\t%0, %3, #1\;it\\t%D1\;mov%D1\\t%0, #0" ++ "&& reload_completed" ++ [(set (match_dup 0) ++ (and:SI (match_dup 3) (const_int 1))) ++ (cond_exec (match_dup 4) (set (match_dup 0) (const_int 0)))] ++ { ++ enum machine_mode mode = GET_MODE (operands[2]); ++ enum rtx_code rc = GET_CODE (operands[1]); ++ ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ } + [(set_attr "conds" "use") +- (set_attr "length" "10")] ++ (set (attr "length") (if_then_else (match_test "arm_restrict_it") ++ (const_int 8) ++ (const_int 10)))] + ) + +-(define_insn "*thumb2_ior_scc" ++(define_insn_and_split "*thumb2_ior_scc" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") ++ (ior:SI (match_operator:SI 1 "arm_comparison_operator" ++ [(match_operand 2 "cc_register" "") (const_int 0)]) ++ (match_operand:SI 3 "s_register_operand" "0,?r")))] ++ "TARGET_THUMB2 && !arm_restrict_it" ++ "@ ++ it\\t%d1\;orr%d1\\t%0, %3, #1 ++ #" ++ ; alt 1: ite\\t%D1\;mov%D1\\t%0, %3\;orr%d1\\t%0, %3, #1 ++ "&& reload_completed ++ && REGNO (operands [0]) != REGNO (operands[3])" ++ [(cond_exec (match_dup 5) (set (match_dup 0) (match_dup 3))) ++ (cond_exec (match_dup 4) (set (match_dup 0) ++ (ior:SI (match_dup 3) (const_int 1))))] ++ { ++ enum machine_mode mode = GET_MODE (operands[2]); ++ enum rtx_code rc = GET_CODE (operands[1]); ++ ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ } ++ [(set_attr "conds" "use") ++ (set_attr "length" "6,10")] ++) ++ ++(define_insn "*thumb2_ior_scc_strict_it" ++ [(set (match_operand:SI 0 "s_register_operand" "=l,l") + (ior:SI (match_operator:SI 2 "arm_comparison_operator" + [(match_operand 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 1 "s_register_operand" "0,?r")))] +- "TARGET_THUMB2" ++ (match_operand:SI 1 "s_register_operand" "0,?l")))] ++ "TARGET_THUMB2 && arm_restrict_it" + "@ +- it\\t%d2\;orr%d2\\t%0, %1, #1 +- ite\\t%D2\;mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1" ++ it\\t%d2\;mov%d2\\t%0, #1\;it\\t%d2\;orr%d2\\t%0, %1 ++ mov\\t%0, #1\;orr\\t%0, %1\;it\\t%D2\;mov%D2\\t%0, %1" + [(set_attr "conds" "use") +- (set_attr "length" "6,10")] ++ (set_attr "length" "8")] + ) + + (define_insn "*thumb2_cond_move" +@@ -384,13 +686,20 @@ + output_asm_insn (\"it\\t%D4\", operands); + break; + case 2: +- output_asm_insn (\"ite\\t%D4\", operands); ++ if (arm_restrict_it) ++ output_asm_insn (\"it\\t%D4\", operands); ++ else ++ output_asm_insn (\"ite\\t%D4\", operands); + break; + default: + abort(); + } + if (which_alternative != 0) +- output_asm_insn (\"mov%D4\\t%0, %1\", operands); ++ { ++ output_asm_insn (\"mov%D4\\t%0, %1\", operands); ++ if (arm_restrict_it && which_alternative == 2) ++ output_asm_insn (\"it\\t%d4\", operands); ++ } + if (which_alternative != 1) + output_asm_insn (\"mov%d4\\t%0, %2\", operands); + return \"\"; +@@ -407,7 +716,7 @@ + (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) + (match_operand:SI 1 "s_register_operand" "0,?r")])) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_THUMB2" ++ "TARGET_THUMB2 && !arm_restrict_it" + "* + if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx) + return \"%i5\\t%0, %1, %2, lsr #31\"; +@@ -436,9 +745,78 @@ + (set_attr "length" "14")] + ) + ++(define_insn_and_split "*thumb2_cond_arith_strict_it" ++ [(set (match_operand:SI 0 "s_register_operand" "=l") ++ (match_operator:SI 5 "shiftable_operator_strict_it" ++ [(match_operator:SI 4 "arm_comparison_operator" ++ [(match_operand:SI 2 "s_register_operand" "r") ++ (match_operand:SI 3 "arm_rhs_operand" "rI")]) ++ (match_operand:SI 1 "s_register_operand" "0")])) ++ (clobber (reg:CC CC_REGNUM))] ++ "TARGET_THUMB2 && arm_restrict_it" ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx) ++ { ++ /* %i5 %0, %1, %2, lsr #31 */ ++ rtx shifted_op = gen_rtx_LSHIFTRT (SImode, operands[2], GEN_INT (31)); ++ rtx op = NULL_RTX; ++ ++ switch (GET_CODE (operands[5])) ++ { ++ case AND: ++ op = gen_rtx_AND (SImode, shifted_op, operands[1]); ++ break; ++ case PLUS: ++ op = gen_rtx_PLUS (SImode, shifted_op, operands[1]); ++ break; ++ default: gcc_unreachable (); ++ } ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], op)); ++ DONE; ++ } ++ ++ /* "cmp %2, %3" */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ gen_rtx_REG (CCmode, CC_REGNUM), ++ gen_rtx_COMPARE (CCmode, operands[2], operands[3]))); ++ ++ if (GET_CODE (operands[5]) == AND) ++ { ++ /* %i5 %0, %1, #1 ++ it%D4 ++ mov%D4 %0, #0 */ ++ enum rtx_code rc = reverse_condition (GET_CODE (operands[4])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_AND (SImode, operands[1], GEN_INT (1)))); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_fmt_ee (rc, VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM), const0_rtx), ++ gen_rtx_SET (VOIDmode, operands[0], const0_rtx))); ++ DONE; ++ } ++ else ++ { ++ /* it\\t%d4 ++ %i5%d4\\t%0, %1, #1 */ ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, gen_rtx_fmt_ee (GET_CODE (operands[4]), ++ VOIDmode, ++ gen_rtx_REG (CCmode, CC_REGNUM), const0_rtx), ++ gen_rtx_SET(VOIDmode, operands[0], ++ gen_rtx_PLUS (SImode, ++ operands[1], ++ GEN_INT (1))))); ++ DONE; ++ } ++ FAIL; ++ } ++ [(set_attr "conds" "clob") ++ (set_attr "length" "12")] ++) ++ + (define_insn "*thumb2_cond_sub" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts") ++ (minus:SI (match_operand:SI 1 "s_register_operand" "0,?Ts") + (match_operator:SI 4 "arm_comparison_operator" + [(match_operand:SI 2 "s_register_operand" "r,r") + (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]))) +@@ -448,8 +826,16 @@ + output_asm_insn (\"cmp\\t%2, %3\", operands); + if (which_alternative != 0) + { +- output_asm_insn (\"ite\\t%D4\", operands); +- output_asm_insn (\"mov%D4\\t%0, %1\", operands); ++ if (arm_restrict_it) ++ { ++ output_asm_insn (\"mov\\t%0, %1\", operands); ++ output_asm_insn (\"it\\t%d4\", operands); ++ } ++ else ++ { ++ output_asm_insn (\"ite\\t%D4\", operands); ++ output_asm_insn (\"mov%D4\\t%0, %1\", operands); ++ } + } + else + output_asm_insn (\"it\\t%d4\", operands); +@@ -459,37 +845,82 @@ + (set_attr "length" "10,14")] + ) + +-(define_insn "*thumb2_negscc" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++(define_insn_and_split "*thumb2_negscc" ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts") + (neg:SI (match_operator 3 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand" "r") + (match_operand:SI 2 "arm_rhs_operand" "rI")]))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" +- "* +- if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx) +- return \"asr\\t%0, %1, #31\"; ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM); + +- if (GET_CODE (operands[3]) == NE) +- return \"subs\\t%0, %1, %2\;it\\tne\;mvnne\\t%0, #0\"; ++ if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx) ++ { ++ /* Emit asr\\t%0, %1, #31 */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)))); ++ DONE; ++ } ++ else if (GET_CODE (operands[3]) == NE && !arm_restrict_it) ++ { ++ /* Emit subs\\t%0, %1, %2\;it\\tne\;mvnne\\t%0, #0 */ ++ if (CONST_INT_P (operands[2])) ++ emit_insn (gen_cmpsi2_addneg (operands[0], operands[1], operands[2], ++ GEN_INT (- INTVAL (operands[2])))); ++ else ++ emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2])); + +- output_asm_insn (\"cmp\\t%1, %2\", operands); +- output_asm_insn (\"ite\\t%D3\", operands); +- output_asm_insn (\"mov%D3\\t%0, #0\", operands); +- return \"mvn%d3\\t%0, #0\"; +- " ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_NE (SImode, ++ cc_reg, ++ const0_rtx), ++ gen_rtx_SET (SImode, ++ operands[0], ++ GEN_INT (~0)))); ++ DONE; ++ } ++ else ++ { ++ /* Emit: cmp\\t%1, %2\;mvn\\t%0, #0\;it\\t%D3\;mov%D3\\t%0, #0\;*/ ++ enum rtx_code rc = reverse_condition (GET_CODE (operands[3])); ++ enum machine_mode mode = SELECT_CC_MODE (rc, operands[1], operands[2]); ++ rtx tmp1 = gen_rtx_REG (mode, CC_REGNUM); ++ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ cc_reg, ++ gen_rtx_COMPARE (CCmode, operands[1], operands[2]))); ++ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], GEN_INT (~0))); ++ ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_fmt_ee (rc, ++ VOIDmode, ++ tmp1, ++ const0_rtx), ++ gen_rtx_SET (VOIDmode, operands[0], const0_rtx))); ++ DONE; ++ } ++ FAIL; ++ } + [(set_attr "conds" "clob") + (set_attr "length" "14")] + ) + + (define_insn "*thumb2_movcond" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts,Ts") + (if_then_else:SI + (match_operator 5 "arm_comparison_operator" + [(match_operand:SI 3 "s_register_operand" "r,r,r") + (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL")]) +- (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI") +- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) ++ (match_operand:SI 1 "arm_rhs_operand" "0,TsI,?TsI") ++ (match_operand:SI 2 "arm_rhs_operand" "TsI,0,TsI"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_THUMB2" + "* +@@ -544,12 +975,18 @@ + output_asm_insn (\"it\\t%d5\", operands); + break; + case 2: +- output_asm_insn (\"ite\\t%d5\", operands); ++ if (arm_restrict_it) ++ { ++ output_asm_insn (\"mov\\t%0, %1\", operands); ++ output_asm_insn (\"it\\t%D5\", operands); ++ } ++ else ++ output_asm_insn (\"ite\\t%d5\", operands); + break; + default: + abort(); + } +- if (which_alternative != 0) ++ if (which_alternative != 0 && !(arm_restrict_it && which_alternative == 2)) + output_asm_insn (\"mov%d5\\t%0, %1\", operands); + if (which_alternative != 1) + output_asm_insn (\"mov%D5\\t%0, %2\", operands); +@@ -570,8 +1007,9 @@ + "@ + sxtb%?\\t%0, %1 + ldr%(sb%)\\t%0, %1" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "pool_range" "*,4094") + (set_attr "neg_pool_range" "*,250")] + ) +@@ -583,8 +1021,9 @@ + "@ + uxth%?\\t%0, %1 + ldr%(h%)\\t%0, %1" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "pool_range" "*,4094") + (set_attr "neg_pool_range" "*,250")] + ) +@@ -596,8 +1035,9 @@ + "@ + uxtb%(%)\\t%0, %1 + ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "pool_range" "*,4094") + (set_attr "neg_pool_range" "*,250")] + ) +@@ -688,8 +1128,8 @@ + (set_attr "shift" "1") + (set_attr "length" "2") + (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg")))] + ) + + (define_insn "*thumb2_mov_shortim" +@@ -811,7 +1251,7 @@ + " + [(set_attr "conds" "set") + (set_attr "length" "2,2,4,4") +- (set_attr "type" "simple_alu_imm,*,simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,*,arlo_imm,*")] + ) + + (define_insn "*thumb2_mulsi_short" +@@ -823,7 +1263,7 @@ + "mul%!\\t%0, %2, %0" + [(set_attr "predicable" "yes") + (set_attr "length" "2") +- (set_attr "insn" "muls")]) ++ (set_attr "type" "muls")]) + + (define_insn "*thumb2_mulsi_short_compare0" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -836,7 +1276,7 @@ + "TARGET_THUMB2 && optimize_size" + "muls\\t%0, %2, %0" + [(set_attr "length" "2") +- (set_attr "insn" "muls")]) ++ (set_attr "type" "muls")]) + + (define_insn "*thumb2_mulsi_short_compare0_scratch" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -848,7 +1288,7 @@ + "TARGET_THUMB2 && optimize_size" + "muls\\t%0, %2, %0" + [(set_attr "length" "2") +- (set_attr "insn" "muls")]) ++ (set_attr "type" "muls")]) + + (define_insn "*thumb2_cbz" + [(set (pc) (if_then_else +@@ -922,7 +1362,8 @@ + (match_operand:SI 1 "s_register_operand" "r")))] + "TARGET_THUMB2" + "orn%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*orsi_not_shiftsi_si" +@@ -934,8 +1375,9 @@ + "TARGET_THUMB2" + "orn%?\\t%0, %1, %2%S4" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "shift" "2") +- (set_attr "type" "alu_shift")] ++ (set_attr "type" "arlo_shift")] + ) + + (define_peephole2 +--- a/src/gcc/config/arm/arm.c ++++ b/src/gcc/config/arm/arm.c +@@ -173,6 +173,7 @@ + static tree arm_builtin_decl (unsigned, bool); + static void emit_constant_insn (rtx cond, rtx pattern); + static rtx emit_set_insn (rtx, rtx); ++static rtx emit_multi_reg_push (unsigned long); + static int arm_arg_partial_bytes (cumulative_args_t, enum machine_mode, + tree, bool); + static rtx arm_function_arg (cumulative_args_t, enum machine_mode, +@@ -280,6 +281,7 @@ + + static void arm_canonicalize_comparison (int *code, rtx *op0, rtx *op1, + bool op0_preserve_value); ++static unsigned HOST_WIDE_INT arm_asan_shadow_offset (void); + + /* Table of machine attributes. */ + static const struct attribute_spec arm_attribute_table[] = +@@ -620,6 +622,13 @@ + #undef TARGET_CLASS_LIKELY_SPILLED_P + #define TARGET_CLASS_LIKELY_SPILLED_P arm_class_likely_spilled_p + ++#undef TARGET_VECTORIZE_BUILTINS ++#define TARGET_VECTORIZE_BUILTINS ++ ++#undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION ++#define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \ ++ arm_builtin_vectorized_function ++ + #undef TARGET_VECTOR_ALIGNMENT + #define TARGET_VECTOR_ALIGNMENT arm_vector_alignment + +@@ -649,6 +658,13 @@ + #define TARGET_CANONICALIZE_COMPARISON \ + arm_canonicalize_comparison + ++#undef TARGET_ASAN_SHADOW_OFFSET ++#define TARGET_ASAN_SHADOW_OFFSET arm_asan_shadow_offset ++ ++#undef MAX_INSN_PER_IT_BLOCK ++#define MAX_INSN_PER_IT_BLOCK (arm_restrict_it ? 1 : 4) ++ ++ + struct gcc_target targetm = TARGET_INITIALIZER; + + /* Obstack for minipool constant handling. */ +@@ -710,6 +726,7 @@ + #define FL_ARCH7 (1 << 22) /* Architecture 7. */ + #define FL_ARM_DIV (1 << 23) /* Hardware divide (ARM mode). */ + #define FL_ARCH8 (1 << 24) /* Architecture 8. */ ++#define FL_CRC32 (1 << 25) /* ARMv8 CRC32 instructions. */ + + #define FL_IWMMXT (1 << 29) /* XScale v2 or "Intel Wireless MMX technology". */ + #define FL_IWMMXT2 (1 << 30) /* "Intel Wireless MMX2 technology". */ +@@ -839,6 +856,10 @@ + int arm_arch_arm_hwdiv; + int arm_arch_thumb_hwdiv; + ++/* Nonzero if we should use Neon to handle 64-bits operations rather ++ than core registers. */ ++int prefer_neon_for_64bits = 0; ++ + /* In case of a PRE_INC, POST_INC, PRE_DEC, POST_DEC memory reference, + we must report the mode of the memory reference from + TARGET_PRINT_OPERAND to TARGET_PRINT_OPERAND_ADDRESS. */ +@@ -868,6 +889,9 @@ + /* The number of bits used in arm_condexec_mask. */ + int arm_condexec_masklen = 0; + ++/* Nonzero if chip supports the ARMv8 CRC instructions. */ ++int arm_arch_crc = 0; ++ + /* The condition codes of the ARM, and the inverse function. */ + static const char * const arm_condition_codes[] = + { +@@ -936,6 +960,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_fastmul_tune = +@@ -950,6 +975,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + /* StrongARM has early execution of branches, so a sequence that is worth +@@ -967,6 +993,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_xscale_tune = +@@ -981,6 +1008,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_9e_tune = +@@ -995,6 +1023,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_v6t2_tune = +@@ -1009,6 +1038,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + /* Generic Cortex tuning. Use more specific tunings if appropriate. */ +@@ -1024,6 +1054,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_cortex_a15_tune = +@@ -1031,7 +1062,7 @@ + arm_9e_rtx_costs, + NULL, + 1, /* Constant limit. */ +- 5, /* Max cond insns. */ ++ 2, /* Max cond insns. */ + ARM_PREFETCH_NOT_BENEFICIAL, + false, /* Prefer constant pool. */ + arm_default_branch_cost, +@@ -1038,6 +1069,7 @@ + true, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + /* Branches can be dual-issued on Cortex-A5, so conditional execution is +@@ -1055,6 +1087,7 @@ + false, /* Prefer LDRD/STRD. */ + {false, false}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_cortex_a9_tune = +@@ -1069,6 +1102,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + /* The arm_v6m_tune is duplicated from arm_cortex_tune, rather than +@@ -1085,6 +1119,7 @@ + false, /* Prefer LDRD/STRD. */ + {false, false}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + const struct tune_params arm_fa726te_tune = +@@ -1099,6 +1134,7 @@ + false, /* Prefer LDRD/STRD. */ + {true, true}, /* Prefer non short circuit. */ + &arm_default_vec_cost, /* Vectorizer costs. */ ++ false /* Prefer Neon for 64-bits bitops. */ + }; + + +@@ -1842,7 +1878,13 @@ + arm_arch_thumb_hwdiv = (insn_flags & FL_THUMB_DIV) != 0; + arm_arch_arm_hwdiv = (insn_flags & FL_ARM_DIV) != 0; + arm_tune_cortex_a9 = (arm_tune == cortexa9) != 0; ++ arm_arch_crc = (insn_flags & FL_CRC32) != 0; ++ if (arm_restrict_it == 2) ++ arm_restrict_it = arm_arch8 && TARGET_THUMB2; + ++ if (!TARGET_THUMB2) ++ arm_restrict_it = 0; ++ + /* If we are not using the default (ARM mode) section anchor offset + ranges, then set the correct ranges now. */ + if (TARGET_THUMB1) +@@ -2129,11 +2171,25 @@ + global_options.x_param_values, + global_options_set.x_param_values); + ++ /* Use Neon to perform 64-bits operations rather than core ++ registers. */ ++ prefer_neon_for_64bits = current_tune->prefer_neon_for_64bits; ++ if (use_neon_for_64bits == 1) ++ prefer_neon_for_64bits = true; ++ + /* Use the alternative scheduling-pressure algorithm by default. */ + maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM, 2, + global_options.x_param_values, + global_options_set.x_param_values); + ++ /* Disable shrink-wrap when optimizing function for size, since it tends to ++ generate additional returns. */ ++ if (optimize_function_for_size_p (cfun) && TARGET_THUMB2) ++ flag_shrink_wrap = false; ++ /* TBD: Dwarf info for apcs frame is not handled yet. */ ++ if (TARGET_APCS_FRAME) ++ flag_shrink_wrap = false; ++ + /* Register global variables with the garbage collector. */ + arm_add_gc_roots (); + } +@@ -2382,6 +2438,10 @@ + if (IS_INTERRUPT (func_type) && (frame_pointer_needed || TARGET_THUMB)) + return 0; + ++ if (TARGET_LDRD && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)) ++ return 0; ++ + offsets = arm_get_frame_offsets (); + stack_adjust = offsets->outgoing_args - offsets->saved_regs; + +@@ -2479,6 +2539,18 @@ + return 1; + } + ++/* Return TRUE if we should try to use a simple_return insn, i.e. perform ++ shrink-wrapping if possible. This is the case if we need to emit a ++ prologue, which we can test by looking at the offsets. */ ++bool ++use_simple_return_p (void) ++{ ++ arm_stack_offsets *offsets; ++ ++ offsets = arm_get_frame_offsets (); ++ return offsets->outgoing_args != 0; ++} ++ + /* Return TRUE if int I is a valid immediate ARM constant. */ + + int +@@ -2617,6 +2689,11 @@ + + switch (code) + { ++ case AND: ++ case IOR: ++ case XOR: ++ return (const_ok_for_op (hi_val, code) || hi_val == 0xFFFFFFFF) ++ && (const_ok_for_op (lo_val, code) || lo_val == 0xFFFFFFFF); + case PLUS: + return arm_not_operand (hi, SImode) && arm_add_operand (lo, SImode); + +@@ -5337,9 +5414,8 @@ + if (cfun->machine->sibcall_blocked) + return false; + +- /* Never tailcall something for which we have no decl, or if we +- are generating code for Thumb-1. */ +- if (decl == NULL || TARGET_THUMB1) ++ /* Never tailcall something if we are generating code for Thumb-1. */ ++ if (TARGET_THUMB1) + return false; + + /* The PIC register is live on entry to VxWorks PLT entries, so we +@@ -5349,13 +5425,14 @@ + + /* Cannot tail-call to long calls, since these are out of range of + a branch instruction. */ +- if (arm_is_long_call_p (decl)) ++ if (decl && arm_is_long_call_p (decl)) + return false; + + /* If we are interworking and the function is not declared static + then we can't tail-call it unless we know that it exists in this + compilation unit (since it might be a Thumb routine). */ +- if (TARGET_INTERWORK && TREE_PUBLIC (decl) && !TREE_ASM_WRITTEN (decl)) ++ if (TARGET_INTERWORK && decl && TREE_PUBLIC (decl) ++ && !TREE_ASM_WRITTEN (decl)) + return false; + + func_type = arm_current_func_type (); +@@ -5387,6 +5464,7 @@ + sibling calls. */ + if (TARGET_AAPCS_BASED + && arm_abi == ARM_ABI_AAPCS ++ && decl + && DECL_WEAK (decl)) + return false; + +@@ -8592,7 +8670,12 @@ + instruction we depend on is another ALU instruction, then we may + have to account for an additional stall. */ + if (shift_opnum != 0 +- && (attr_type == TYPE_ALU_SHIFT || attr_type == TYPE_ALU_SHIFT_REG)) ++ && (attr_type == TYPE_ARLO_SHIFT ++ || attr_type == TYPE_ARLO_SHIFT_REG ++ || attr_type == TYPE_MOV_SHIFT ++ || attr_type == TYPE_MVN_SHIFT ++ || attr_type == TYPE_MOV_SHIFT_REG ++ || attr_type == TYPE_MVN_SHIFT_REG)) + { + rtx shifted_operand; + int opno; +@@ -8873,12 +8956,12 @@ + if (recog_memoized (insn) < 0) + return false; + +- if (get_attr_insn (insn) == INSN_MOV) +- return false; +- + switch (get_attr_type (insn)) + { +- case TYPE_ALU_REG: ++ case TYPE_ARLO_REG: ++ case TYPE_MVN_REG: ++ case TYPE_SHIFT: ++ case TYPE_SHIFT_REG: + case TYPE_LOAD_BYTE: + case TYPE_LOAD1: + case TYPE_STORE1: +@@ -8919,13 +9002,15 @@ + return false; + } + +- if (get_attr_insn (insn) == INSN_MOV) +- return true; +- + switch (get_attr_type (insn)) + { +- case TYPE_SIMPLE_ALU_IMM: +- case TYPE_SIMPLE_ALU_SHIFT: ++ case TYPE_ARLO_IMM: ++ case TYPE_EXTEND: ++ case TYPE_MVN_IMM: ++ case TYPE_MOV_IMM: ++ case TYPE_MOV_REG: ++ case TYPE_MOV_SHIFT: ++ case TYPE_MOV_SHIFT_REG: + case TYPE_BRANCH: + case TYPE_CALL: + return true; +@@ -9084,6 +9169,12 @@ + return cost; + } + ++int ++arm_max_conditional_execute (void) ++{ ++ return max_insns_skipped; ++} ++ + static int + arm_default_branch_cost (bool speed_p, bool predictable_p ATTRIBUTE_UNUSED) + { +@@ -11839,6 +11930,142 @@ + return 1; + } + ++/* Helper for gen_movmem_ldrd_strd. Increase the address of memory rtx ++by mode size. */ ++inline static rtx ++next_consecutive_mem (rtx mem) ++{ ++ enum machine_mode mode = GET_MODE (mem); ++ HOST_WIDE_INT offset = GET_MODE_SIZE (mode); ++ rtx addr = plus_constant (Pmode, XEXP (mem, 0), offset); ++ ++ return adjust_automodify_address (mem, mode, addr, offset); ++} ++ ++/* Copy using LDRD/STRD instructions whenever possible. ++ Returns true upon success. */ ++bool ++gen_movmem_ldrd_strd (rtx *operands) ++{ ++ unsigned HOST_WIDE_INT len; ++ HOST_WIDE_INT align; ++ rtx src, dst, base; ++ rtx reg0; ++ bool src_aligned, dst_aligned; ++ bool src_volatile, dst_volatile; ++ ++ gcc_assert (CONST_INT_P (operands[2])); ++ gcc_assert (CONST_INT_P (operands[3])); ++ ++ len = UINTVAL (operands[2]); ++ if (len > 64) ++ return false; ++ ++ /* Maximum alignment we can assume for both src and dst buffers. */ ++ align = INTVAL (operands[3]); ++ ++ if ((!unaligned_access) && (len >= 4) && ((align & 3) != 0)) ++ return false; ++ ++ /* Place src and dst addresses in registers ++ and update the corresponding mem rtx. */ ++ dst = operands[0]; ++ dst_volatile = MEM_VOLATILE_P (dst); ++ dst_aligned = MEM_ALIGN (dst) >= BITS_PER_WORD; ++ base = copy_to_mode_reg (SImode, XEXP (dst, 0)); ++ dst = adjust_automodify_address (dst, VOIDmode, base, 0); ++ ++ src = operands[1]; ++ src_volatile = MEM_VOLATILE_P (src); ++ src_aligned = MEM_ALIGN (src) >= BITS_PER_WORD; ++ base = copy_to_mode_reg (SImode, XEXP (src, 0)); ++ src = adjust_automodify_address (src, VOIDmode, base, 0); ++ ++ if (!unaligned_access && !(src_aligned && dst_aligned)) ++ return false; ++ ++ if (src_volatile || dst_volatile) ++ return false; ++ ++ /* If we cannot generate any LDRD/STRD, try to generate LDM/STM. */ ++ if (!(dst_aligned || src_aligned)) ++ return arm_gen_movmemqi (operands); ++ ++ src = adjust_address (src, DImode, 0); ++ dst = adjust_address (dst, DImode, 0); ++ while (len >= 8) ++ { ++ len -= 8; ++ reg0 = gen_reg_rtx (DImode); ++ if (src_aligned) ++ emit_move_insn (reg0, src); ++ else ++ emit_insn (gen_unaligned_loaddi (reg0, src)); ++ ++ if (dst_aligned) ++ emit_move_insn (dst, reg0); ++ else ++ emit_insn (gen_unaligned_storedi (dst, reg0)); ++ ++ src = next_consecutive_mem (src); ++ dst = next_consecutive_mem (dst); ++ } ++ ++ gcc_assert (len < 8); ++ if (len >= 4) ++ { ++ /* More than a word but less than a double-word to copy. Copy a word. */ ++ reg0 = gen_reg_rtx (SImode); ++ src = adjust_address (src, SImode, 0); ++ dst = adjust_address (dst, SImode, 0); ++ if (src_aligned) ++ emit_move_insn (reg0, src); ++ else ++ emit_insn (gen_unaligned_loadsi (reg0, src)); ++ ++ if (dst_aligned) ++ emit_move_insn (dst, reg0); ++ else ++ emit_insn (gen_unaligned_storesi (dst, reg0)); ++ ++ src = next_consecutive_mem (src); ++ dst = next_consecutive_mem (dst); ++ len -= 4; ++ } ++ ++ if (len == 0) ++ return true; ++ ++ /* Copy the remaining bytes. */ ++ if (len >= 2) ++ { ++ dst = adjust_address (dst, HImode, 0); ++ src = adjust_address (src, HImode, 0); ++ reg0 = gen_reg_rtx (SImode); ++ if (src_aligned) ++ emit_insn (gen_zero_extendhisi2 (reg0, src)); ++ else ++ emit_insn (gen_unaligned_loadhiu (reg0, src)); ++ ++ if (dst_aligned) ++ emit_insn (gen_movhi (dst, gen_lowpart(HImode, reg0))); ++ else ++ emit_insn (gen_unaligned_storehi (dst, gen_lowpart (HImode, reg0))); ++ ++ src = next_consecutive_mem (src); ++ dst = next_consecutive_mem (dst); ++ if (len == 2) ++ return true; ++ } ++ ++ dst = adjust_address (dst, QImode, 0); ++ src = adjust_address (src, QImode, 0); ++ reg0 = gen_reg_rtx (QImode); ++ emit_move_insn (reg0, src); ++ emit_move_insn (dst, reg0); ++ return true; ++} ++ + /* Select a dominance comparison mode if possible for a test of the general + form (OP (COND_OR (X) (Y)) (const_int 0)). We support three forms. + COND_OR == DOM_CC_X_AND_Y => (X && Y) +@@ -12639,6 +12866,277 @@ + return true; + } + ++/* Helper for gen_operands_ldrd_strd. Returns true iff the memory ++ operand ADDR is an immediate offset from the base register and is ++ not volatile, in which case it sets BASE and OFFSET ++ accordingly. */ ++bool ++mem_ok_for_ldrd_strd (rtx addr, rtx *base, rtx *offset) ++{ ++ /* TODO: Handle more general memory operand patterns, such as ++ PRE_DEC and PRE_INC. */ ++ ++ /* Convert a subreg of mem into mem itself. */ ++ if (GET_CODE (addr) == SUBREG) ++ addr = alter_subreg (&addr, true); ++ ++ gcc_assert (MEM_P (addr)); ++ ++ /* Don't modify volatile memory accesses. */ ++ if (MEM_VOLATILE_P (addr)) ++ return false; ++ ++ *offset = const0_rtx; ++ ++ addr = XEXP (addr, 0); ++ if (REG_P (addr)) ++ { ++ *base = addr; ++ return true; ++ } ++ else if (GET_CODE (addr) == PLUS || GET_CODE (addr) == MINUS) ++ { ++ *base = XEXP (addr, 0); ++ *offset = XEXP (addr, 1); ++ return (REG_P (*base) && CONST_INT_P (*offset)); ++ } ++ ++ return false; ++} ++ ++#define SWAP_RTX(x,y) do { rtx tmp = x; x = y; y = tmp; } while (0) ++ ++/* Called from a peephole2 to replace two word-size accesses with a ++ single LDRD/STRD instruction. Returns true iff we can generate a ++ new instruction sequence. That is, both accesses use the same base ++ register and the gap between constant offsets is 4. This function ++ may reorder its operands to match ldrd/strd RTL templates. ++ OPERANDS are the operands found by the peephole matcher; ++ OPERANDS[0,1] are register operands, and OPERANDS[2,3] are the ++ corresponding memory operands. LOAD indicaates whether the access ++ is load or store. CONST_STORE indicates a store of constant ++ integer values held in OPERANDS[4,5] and assumes that the pattern ++ is of length 4 insn, for the purpose of checking dead registers. ++ COMMUTE indicates that register operands may be reordered. */ ++bool ++gen_operands_ldrd_strd (rtx *operands, bool load, ++ bool const_store, bool commute) ++{ ++ int nops = 2; ++ HOST_WIDE_INT offsets[2], offset; ++ rtx base = NULL_RTX; ++ rtx cur_base, cur_offset, tmp; ++ int i, gap; ++ HARD_REG_SET regset; ++ ++ gcc_assert (!const_store || !load); ++ /* Check that the memory references are immediate offsets from the ++ same base register. Extract the base register, the destination ++ registers, and the corresponding memory offsets. */ ++ for (i = 0; i < nops; i++) ++ { ++ if (!mem_ok_for_ldrd_strd (operands[nops+i], &cur_base, &cur_offset)) ++ return false; ++ ++ if (i == 0) ++ base = cur_base; ++ else if (REGNO (base) != REGNO (cur_base)) ++ return false; ++ ++ offsets[i] = INTVAL (cur_offset); ++ if (GET_CODE (operands[i]) == SUBREG) ++ { ++ tmp = SUBREG_REG (operands[i]); ++ gcc_assert (GET_MODE (operands[i]) == GET_MODE (tmp)); ++ operands[i] = tmp; ++ } ++ } ++ ++ /* Make sure there is no dependency between the individual loads. */ ++ if (load && REGNO (operands[0]) == REGNO (base)) ++ return false; /* RAW */ ++ ++ if (load && REGNO (operands[0]) == REGNO (operands[1])) ++ return false; /* WAW */ ++ ++ /* If the same input register is used in both stores ++ when storing different constants, try to find a free register. ++ For example, the code ++ mov r0, 0 ++ str r0, [r2] ++ mov r0, 1 ++ str r0, [r2, #4] ++ can be transformed into ++ mov r1, 0 ++ strd r1, r0, [r2] ++ in Thumb mode assuming that r1 is free. */ ++ if (const_store ++ && REGNO (operands[0]) == REGNO (operands[1]) ++ && INTVAL (operands[4]) != INTVAL (operands[5])) ++ { ++ if (TARGET_THUMB2) ++ { ++ CLEAR_HARD_REG_SET (regset); ++ tmp = peep2_find_free_register (0, 4, "r", SImode, ®set); ++ if (tmp == NULL_RTX) ++ return false; ++ ++ /* Use the new register in the first load to ensure that ++ if the original input register is not dead after peephole, ++ then it will have the correct constant value. */ ++ operands[0] = tmp; ++ } ++ else if (TARGET_ARM) ++ { ++ return false; ++ int regno = REGNO (operands[0]); ++ if (!peep2_reg_dead_p (4, operands[0])) ++ { ++ /* When the input register is even and is not dead after the ++ pattern, it has to hold the second constant but we cannot ++ form a legal STRD in ARM mode with this register as the second ++ register. */ ++ if (regno % 2 == 0) ++ return false; ++ ++ /* Is regno-1 free? */ ++ SET_HARD_REG_SET (regset); ++ CLEAR_HARD_REG_BIT(regset, regno - 1); ++ tmp = peep2_find_free_register (0, 4, "r", SImode, ®set); ++ if (tmp == NULL_RTX) ++ return false; ++ ++ operands[0] = tmp; ++ } ++ else ++ { ++ /* Find a DImode register. */ ++ CLEAR_HARD_REG_SET (regset); ++ tmp = peep2_find_free_register (0, 4, "r", DImode, ®set); ++ if (tmp != NULL_RTX) ++ { ++ operands[0] = simplify_gen_subreg (SImode, tmp, DImode, 0); ++ operands[1] = simplify_gen_subreg (SImode, tmp, DImode, 4); ++ } ++ else ++ { ++ /* Can we use the input register to form a DI register? */ ++ SET_HARD_REG_SET (regset); ++ CLEAR_HARD_REG_BIT(regset, ++ regno % 2 == 0 ? regno + 1 : regno - 1); ++ tmp = peep2_find_free_register (0, 4, "r", SImode, ®set); ++ if (tmp == NULL_RTX) ++ return false; ++ operands[regno % 2 == 1 ? 0 : 1] = tmp; ++ } ++ } ++ ++ gcc_assert (operands[0] != NULL_RTX); ++ gcc_assert (operands[1] != NULL_RTX); ++ gcc_assert (REGNO (operands[0]) % 2 == 0); ++ gcc_assert (REGNO (operands[1]) == REGNO (operands[0]) + 1); ++ } ++ } ++ ++ /* Make sure the instructions are ordered with lower memory access first. */ ++ if (offsets[0] > offsets[1]) ++ { ++ gap = offsets[0] - offsets[1]; ++ offset = offsets[1]; ++ ++ /* Swap the instructions such that lower memory is accessed first. */ ++ SWAP_RTX (operands[0], operands[1]); ++ SWAP_RTX (operands[2], operands[3]); ++ if (const_store) ++ SWAP_RTX (operands[4], operands[5]); ++ } ++ else ++ { ++ gap = offsets[1] - offsets[0]; ++ offset = offsets[0]; ++ } ++ ++ /* Make sure accesses are to consecutive memory locations. */ ++ if (gap != 4) ++ return false; ++ ++ /* Make sure we generate legal instructions. */ ++ if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset, ++ false, load)) ++ return true; ++ ++ /* In Thumb state, where registers are almost unconstrained, there ++ is little hope to fix it. */ ++ if (TARGET_THUMB2) ++ return false; ++ ++ if (load && commute) ++ { ++ /* Try reordering registers. */ ++ SWAP_RTX (operands[0], operands[1]); ++ if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset, ++ false, load)) ++ return true; ++ } ++ ++ if (const_store) ++ { ++ /* If input registers are dead after this pattern, they can be ++ reordered or replaced by other registers that are free in the ++ current pattern. */ ++ if (!peep2_reg_dead_p (4, operands[0]) ++ || !peep2_reg_dead_p (4, operands[1])) ++ return false; ++ ++ /* Try to reorder the input registers. */ ++ /* For example, the code ++ mov r0, 0 ++ mov r1, 1 ++ str r1, [r2] ++ str r0, [r2, #4] ++ can be transformed into ++ mov r1, 0 ++ mov r0, 1 ++ strd r0, [r2] ++ */ ++ if (operands_ok_ldrd_strd (operands[1], operands[0], base, offset, ++ false, false)) ++ { ++ SWAP_RTX (operands[0], operands[1]); ++ return true; ++ } ++ ++ /* Try to find a free DI register. */ ++ CLEAR_HARD_REG_SET (regset); ++ add_to_hard_reg_set (®set, SImode, REGNO (operands[0])); ++ add_to_hard_reg_set (®set, SImode, REGNO (operands[1])); ++ while (true) ++ { ++ tmp = peep2_find_free_register (0, 4, "r", DImode, ®set); ++ if (tmp == NULL_RTX) ++ return false; ++ ++ /* DREG must be an even-numbered register in DImode. ++ Split it into SI registers. */ ++ operands[0] = simplify_gen_subreg (SImode, tmp, DImode, 0); ++ operands[1] = simplify_gen_subreg (SImode, tmp, DImode, 4); ++ gcc_assert (operands[0] != NULL_RTX); ++ gcc_assert (operands[1] != NULL_RTX); ++ gcc_assert (REGNO (operands[0]) % 2 == 0); ++ gcc_assert (REGNO (operands[0]) + 1 == REGNO (operands[1])); ++ ++ return (operands_ok_ldrd_strd (operands[0], operands[1], ++ base, offset, ++ false, load)); ++ } ++ } ++ ++ return false; ++} ++#undef SWAP_RTX ++ ++ ++ + + /* Print a symbolic form of X to the debug file, F. */ + static void +@@ -13872,6 +14370,16 @@ + && IN_RANGE (INTVAL (op1), -7, 7)) + action = CONV; + } ++ /* ADCS , */ ++ else if (GET_CODE (XEXP (src, 0)) == PLUS ++ && rtx_equal_p (XEXP (XEXP (src, 0), 0), dst) ++ && low_register_operand (XEXP (XEXP (src, 0), 1), ++ SImode) ++ && COMPARISON_P (op1) ++ && cc_register (XEXP (op1, 0), VOIDmode) ++ && maybe_get_arm_condition_code (op1) == ARM_CS ++ && XEXP (op1, 1) == const0_rtx) ++ action = CONV; + break; + + case MINUS: +@@ -14830,7 +15338,8 @@ + { + /* Constraints should ensure this. */ + gcc_assert (code0 == MEM && code1 == REG); +- gcc_assert (REGNO (operands[1]) != IP_REGNUM); ++ gcc_assert ((REGNO (operands[1]) != IP_REGNUM) ++ || (TARGET_ARM && TARGET_LDRD)); + + switch (GET_CODE (XEXP (operands[0], 0))) + { +@@ -16303,124 +16812,308 @@ + } + } + +-/* Generate and emit a pattern that will be recognized as STRD pattern. If even +- number of registers are being pushed, multiple STRD patterns are created for +- all register pairs. If odd number of registers are pushed, emit a +- combination of STRDs and STR for the prologue saves. */ ++/* Generate and emit a sequence of insns equivalent to PUSH, but using ++ STR and STRD. If an even number of registers are being pushed, one ++ or more STRD patterns are created for each register pair. If an ++ odd number of registers are pushed, emit an initial STR followed by ++ as many STRD instructions as are needed. This works best when the ++ stack is initially 64-bit aligned (the normal case), since it ++ ensures that each STRD is also 64-bit aligned. */ + static void + thumb2_emit_strd_push (unsigned long saved_regs_mask) + { + int num_regs = 0; +- int i, j; ++ int i; ++ int regno; + rtx par = NULL_RTX; +- rtx insn = NULL_RTX; + rtx dwarf = NULL_RTX; +- rtx tmp, reg, tmp1; ++ rtx tmp; ++ bool first = true; + ++ num_regs = bit_count (saved_regs_mask); ++ ++ /* Must be at least one register to save, and can't save SP or PC. */ ++ gcc_assert (num_regs > 0 && num_regs <= 14); ++ gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM))); ++ gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM))); ++ ++ /* Create sequence for DWARF info. All the frame-related data for ++ debugging is held in this wrapper. */ ++ dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1)); ++ ++ /* Describe the stack adjustment. */ ++ tmp = gen_rtx_SET (VOIDmode, ++ stack_pointer_rtx, ++ plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (dwarf, 0, 0) = tmp; ++ ++ /* Find the first register. */ ++ for (regno = 0; (saved_regs_mask & (1 << regno)) == 0; regno++) ++ ; ++ ++ i = 0; ++ ++ /* If there's an odd number of registers to push. Start off by ++ pushing a single register. This ensures that subsequent strd ++ operations are dword aligned (assuming that SP was originally ++ 64-bit aligned). */ ++ if ((num_regs & 1) != 0) ++ { ++ rtx reg, mem, insn; ++ ++ reg = gen_rtx_REG (SImode, regno); ++ if (num_regs == 1) ++ mem = gen_frame_mem (Pmode, gen_rtx_PRE_DEC (Pmode, ++ stack_pointer_rtx)); ++ else ++ mem = gen_frame_mem (Pmode, ++ gen_rtx_PRE_MODIFY ++ (Pmode, stack_pointer_rtx, ++ plus_constant (Pmode, stack_pointer_rtx, ++ -4 * num_regs))); ++ ++ tmp = gen_rtx_SET (VOIDmode, mem, reg); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ insn = emit_insn (tmp); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf); ++ tmp = gen_rtx_SET (VOIDmode, gen_frame_mem (Pmode, stack_pointer_rtx), ++ reg); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ i++; ++ regno++; ++ XVECEXP (dwarf, 0, i) = tmp; ++ first = false; ++ } ++ ++ while (i < num_regs) ++ if (saved_regs_mask & (1 << regno)) ++ { ++ rtx reg1, reg2, mem1, mem2; ++ rtx tmp0, tmp1, tmp2; ++ int regno2; ++ ++ /* Find the register to pair with this one. */ ++ for (regno2 = regno + 1; (saved_regs_mask & (1 << regno2)) == 0; ++ regno2++) ++ ; ++ ++ reg1 = gen_rtx_REG (SImode, regno); ++ reg2 = gen_rtx_REG (SImode, regno2); ++ ++ if (first) ++ { ++ rtx insn; ++ ++ first = false; ++ mem1 = gen_frame_mem (Pmode, plus_constant (Pmode, ++ stack_pointer_rtx, ++ -4 * num_regs)); ++ mem2 = gen_frame_mem (Pmode, plus_constant (Pmode, ++ stack_pointer_rtx, ++ -4 * (num_regs - 1))); ++ tmp0 = gen_rtx_SET (VOIDmode, stack_pointer_rtx, ++ plus_constant (Pmode, stack_pointer_rtx, ++ -4 * (num_regs))); ++ tmp1 = gen_rtx_SET (VOIDmode, mem1, reg1); ++ tmp2 = gen_rtx_SET (VOIDmode, mem2, reg2); ++ RTX_FRAME_RELATED_P (tmp0) = 1; ++ RTX_FRAME_RELATED_P (tmp1) = 1; ++ RTX_FRAME_RELATED_P (tmp2) = 1; ++ par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3)); ++ XVECEXP (par, 0, 0) = tmp0; ++ XVECEXP (par, 0, 1) = tmp1; ++ XVECEXP (par, 0, 2) = tmp2; ++ insn = emit_insn (par); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf); ++ } ++ else ++ { ++ mem1 = gen_frame_mem (Pmode, plus_constant (Pmode, ++ stack_pointer_rtx, ++ 4 * i)); ++ mem2 = gen_frame_mem (Pmode, plus_constant (Pmode, ++ stack_pointer_rtx, ++ 4 * (i + 1))); ++ tmp1 = gen_rtx_SET (VOIDmode, mem1, reg1); ++ tmp2 = gen_rtx_SET (VOIDmode, mem2, reg2); ++ RTX_FRAME_RELATED_P (tmp1) = 1; ++ RTX_FRAME_RELATED_P (tmp2) = 1; ++ par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2)); ++ XVECEXP (par, 0, 0) = tmp1; ++ XVECEXP (par, 0, 1) = tmp2; ++ emit_insn (par); ++ } ++ ++ /* Create unwind information. This is an approximation. */ ++ tmp1 = gen_rtx_SET (VOIDmode, ++ gen_frame_mem (Pmode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ 4 * i)), ++ reg1); ++ tmp2 = gen_rtx_SET (VOIDmode, ++ gen_frame_mem (Pmode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ 4 * (i + 1))), ++ reg2); ++ ++ RTX_FRAME_RELATED_P (tmp1) = 1; ++ RTX_FRAME_RELATED_P (tmp2) = 1; ++ XVECEXP (dwarf, 0, i + 1) = tmp1; ++ XVECEXP (dwarf, 0, i + 2) = tmp2; ++ i += 2; ++ regno = regno2 + 1; ++ } ++ else ++ regno++; ++ ++ return; ++} ++ ++/* STRD in ARM mode requires consecutive registers. This function emits STRD ++ whenever possible, otherwise it emits single-word stores. The first store ++ also allocates stack space for all saved registers, using writeback with ++ post-addressing mode. All other stores use offset addressing. If no STRD ++ can be emitted, this function emits a sequence of single-word stores, ++ and not an STM as before, because single-word stores provide more freedom ++ scheduling and can be turned into an STM by peephole optimizations. */ ++static void ++arm_emit_strd_push (unsigned long saved_regs_mask) ++{ ++ int num_regs = 0; ++ int i, j, dwarf_index = 0; ++ int offset = 0; ++ rtx dwarf = NULL_RTX; ++ rtx insn = NULL_RTX; ++ rtx tmp, mem; ++ ++ /* TODO: A more efficient code can be emitted by changing the ++ layout, e.g., first push all pairs that can use STRD to keep the ++ stack aligned, and then push all other registers. */ + for (i = 0; i <= LAST_ARM_REGNUM; i++) + if (saved_regs_mask & (1 << i)) + num_regs++; + +- gcc_assert (num_regs && num_regs <= 16); ++ gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM))); ++ gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM))); ++ gcc_assert (num_regs > 0); + +- /* Pre-decrement the stack pointer, based on there being num_regs 4-byte +- registers to push. */ +- tmp = gen_rtx_SET (VOIDmode, +- stack_pointer_rtx, +- plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs)); +- RTX_FRAME_RELATED_P (tmp) = 1; +- insn = emit_insn (tmp); +- + /* Create sequence for DWARF info. */ + dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1)); + +- /* RTLs cannot be shared, hence create new copy for dwarf. */ +- tmp1 = gen_rtx_SET (VOIDmode, ++ /* For dwarf info, we generate explicit stack update. */ ++ tmp = gen_rtx_SET (VOIDmode, + stack_pointer_rtx, + plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs)); +- RTX_FRAME_RELATED_P (tmp1) = 1; +- XVECEXP (dwarf, 0, 0) = tmp1; ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (dwarf, 0, dwarf_index++) = tmp; + +- gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM))); +- gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM))); +- +- /* Var j iterates over all the registers to gather all the registers in +- saved_regs_mask. Var i gives index of register R_j in stack frame. +- A PARALLEL RTX of register-pair is created here, so that pattern for +- STRD can be matched. If num_regs is odd, 1st register will be pushed +- using STR and remaining registers will be pushed with STRD in pairs. +- If num_regs is even, all registers are pushed with STRD in pairs. +- Hence, skip first element for odd num_regs. */ +- for (i = num_regs - 1, j = LAST_ARM_REGNUM; i >= (num_regs % 2); j--) ++ /* Save registers. */ ++ offset = - 4 * num_regs; ++ j = 0; ++ while (j <= LAST_ARM_REGNUM) + if (saved_regs_mask & (1 << j)) + { +- /* Create RTX for store. New RTX is created for dwarf as +- they are not sharable. */ +- reg = gen_rtx_REG (SImode, j); +- tmp = gen_rtx_SET (SImode, +- gen_frame_mem +- (SImode, +- plus_constant (Pmode, stack_pointer_rtx, 4 * i)), +- reg); ++ if ((j % 2 == 0) ++ && (saved_regs_mask & (1 << (j + 1)))) ++ { ++ /* Current register and previous register form register pair for ++ which STRD can be generated. */ ++ if (offset < 0) ++ { ++ /* Allocate stack space for all saved registers. */ ++ tmp = plus_constant (Pmode, stack_pointer_rtx, offset); ++ tmp = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, tmp); ++ mem = gen_frame_mem (DImode, tmp); ++ offset = 0; ++ } ++ else if (offset > 0) ++ mem = gen_frame_mem (DImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ else ++ mem = gen_frame_mem (DImode, stack_pointer_rtx); + +- tmp1 = gen_rtx_SET (SImode, +- gen_frame_mem +- (SImode, +- plus_constant (Pmode, stack_pointer_rtx, 4 * i)), +- reg); +- RTX_FRAME_RELATED_P (tmp) = 1; +- RTX_FRAME_RELATED_P (tmp1) = 1; ++ tmp = gen_rtx_SET (DImode, mem, gen_rtx_REG (DImode, j)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ tmp = emit_insn (tmp); + +- if (((i - (num_regs % 2)) % 2) == 1) +- /* When (i - (num_regs % 2)) is odd, the RTX to be emitted is yet to +- be created. Hence create it first. The STRD pattern we are +- generating is : +- [ (SET (MEM (PLUS (SP) (NUM))) (reg_t1)) +- (SET (MEM (PLUS (SP) (NUM + 4))) (reg_t2)) ] +- where the target registers need not be consecutive. */ +- par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2)); ++ /* Record the first store insn. */ ++ if (dwarf_index == 1) ++ insn = tmp; + +- /* Register R_j is added in PARALLEL RTX. If (i - (num_regs % 2)) is +- even, the reg_j is added as 0th element and if it is odd, reg_i is +- added as 1st element of STRD pattern shown above. */ +- XVECEXP (par, 0, ((i - (num_regs % 2)) % 2)) = tmp; +- XVECEXP (dwarf, 0, (i + 1)) = tmp1; ++ /* Generate dwarf info. */ ++ mem = gen_frame_mem (SImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (dwarf, 0, dwarf_index++) = tmp; + +- if (((i - (num_regs % 2)) % 2) == 0) +- /* When (i - (num_regs % 2)) is even, RTXs for both the registers +- to be loaded are generated in above given STRD pattern, and the +- pattern can be emitted now. */ +- emit_insn (par); ++ mem = gen_frame_mem (SImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset + 4)); ++ tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j + 1)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (dwarf, 0, dwarf_index++) = tmp; + +- i--; +- } ++ offset += 8; ++ j += 2; ++ } ++ else ++ { ++ /* Emit a single word store. */ ++ if (offset < 0) ++ { ++ /* Allocate stack space for all saved registers. */ ++ tmp = plus_constant (Pmode, stack_pointer_rtx, offset); ++ tmp = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, tmp); ++ mem = gen_frame_mem (SImode, tmp); ++ offset = 0; ++ } ++ else if (offset > 0) ++ mem = gen_frame_mem (SImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ else ++ mem = gen_frame_mem (SImode, stack_pointer_rtx); + +- if ((num_regs % 2) == 1) +- { +- /* If odd number of registers are pushed, generate STR pattern to store +- lone register. */ +- for (; (saved_regs_mask & (1 << j)) == 0; j--); ++ tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ tmp = emit_insn (tmp); + +- tmp1 = gen_frame_mem (SImode, plus_constant (Pmode, +- stack_pointer_rtx, 4 * i)); +- reg = gen_rtx_REG (SImode, j); +- tmp = gen_rtx_SET (SImode, tmp1, reg); +- RTX_FRAME_RELATED_P (tmp) = 1; ++ /* Record the first store insn. */ ++ if (dwarf_index == 1) ++ insn = tmp; + +- emit_insn (tmp); ++ /* Generate dwarf info. */ ++ mem = gen_frame_mem (SImode, ++ plus_constant(Pmode, ++ stack_pointer_rtx, ++ offset)); ++ tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j)); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (dwarf, 0, dwarf_index++) = tmp; + +- tmp1 = gen_rtx_SET (SImode, +- gen_frame_mem +- (SImode, +- plus_constant (Pmode, stack_pointer_rtx, 4 * i)), +- reg); +- RTX_FRAME_RELATED_P (tmp1) = 1; +- XVECEXP (dwarf, 0, (i + 1)) = tmp1; +- } ++ offset += 4; ++ j += 1; ++ } ++ } ++ else ++ j++; + ++ /* Attach dwarf info to the first insn we generate. */ ++ gcc_assert (insn != NULL_RTX); + add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf); + RTX_FRAME_RELATED_P (insn) = 1; +- return; + } + + /* Generate and emit an insn that we will recognize as a push_multi. +@@ -16565,6 +17258,19 @@ + return par; + } + ++/* Add a REG_CFA_ADJUST_CFA REG note to INSN. ++ SIZE is the offset to be adjusted. ++ DEST and SRC might be stack_pointer_rtx or hard_frame_pointer_rtx. */ ++static void ++arm_add_cfa_adjust_cfa_note (rtx insn, int size, rtx dest, rtx src) ++{ ++ rtx dwarf; ++ ++ RTX_FRAME_RELATED_P (insn) = 1; ++ dwarf = gen_rtx_SET (VOIDmode, dest, plus_constant (Pmode, src, size)); ++ add_reg_note (insn, REG_CFA_ADJUST_CFA, dwarf); ++} ++ + /* Generate and emit an insn pattern that we will recognize as a pop_multi. + SAVED_REGS_MASK shows which registers need to be restored. + +@@ -16622,6 +17328,17 @@ + if (saved_regs_mask & (1 << i)) + { + reg = gen_rtx_REG (SImode, i); ++ if ((num_regs == 1) && emit_update && !return_in_pc) ++ { ++ /* Emit single load with writeback. */ ++ tmp = gen_frame_mem (SImode, ++ gen_rtx_POST_INC (Pmode, ++ stack_pointer_rtx)); ++ tmp = emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); ++ REG_NOTES (tmp) = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf); ++ return; ++ } ++ + tmp = gen_rtx_SET (VOIDmode, + reg, + gen_frame_mem +@@ -16644,6 +17361,9 @@ + par = emit_insn (par); + + REG_NOTES (par) = dwarf; ++ if (!return_in_pc) ++ arm_add_cfa_adjust_cfa_note (par, UNITS_PER_WORD * num_regs, ++ stack_pointer_rtx, stack_pointer_rtx); + } + + /* Generate and emit an insn pattern that we will recognize as a pop_multi +@@ -16714,6 +17434,9 @@ + + par = emit_insn (par); + REG_NOTES (par) = dwarf; ++ ++ arm_add_cfa_adjust_cfa_note (par, 2 * UNITS_PER_WORD * num_regs, ++ base_reg, base_reg); + } + + /* Generate and emit a pattern that will be recognized as LDRD pattern. If even +@@ -16789,6 +17512,7 @@ + pattern can be emitted now. */ + par = emit_insn (par); + REG_NOTES (par) = dwarf; ++ RTX_FRAME_RELATED_P (par) = 1; + } + + i++; +@@ -16805,7 +17529,12 @@ + stack_pointer_rtx, + plus_constant (Pmode, stack_pointer_rtx, 4 * i)); + RTX_FRAME_RELATED_P (tmp) = 1; +- emit_insn (tmp); ++ tmp = emit_insn (tmp); ++ if (!return_in_pc) ++ { ++ arm_add_cfa_adjust_cfa_note (tmp, UNITS_PER_WORD * i, ++ stack_pointer_rtx, stack_pointer_rtx); ++ } + + dwarf = NULL_RTX; + +@@ -16839,9 +17568,11 @@ + else + { + par = emit_insn (tmp); ++ REG_NOTES (par) = dwarf; ++ arm_add_cfa_adjust_cfa_note (par, UNITS_PER_WORD, ++ stack_pointer_rtx, stack_pointer_rtx); + } + +- REG_NOTES (par) = dwarf; + } + else if ((num_regs % 2) == 1 && return_in_pc) + { +@@ -16853,6 +17584,132 @@ + return; + } + ++/* LDRD in ARM mode needs consecutive registers as operands. This function ++ emits LDRD whenever possible, otherwise it emits single-word loads. It uses ++ offset addressing and then generates one separate stack udpate. This provides ++ more scheduling freedom, compared to writeback on every load. However, ++ if the function returns using load into PC directly ++ (i.e., if PC is in SAVED_REGS_MASK), the stack needs to be updated ++ before the last load. TODO: Add a peephole optimization to recognize ++ the new epilogue sequence as an LDM instruction whenever possible. TODO: Add ++ peephole optimization to merge the load at stack-offset zero ++ with the stack update instruction using load with writeback ++ in post-index addressing mode. */ ++static void ++arm_emit_ldrd_pop (unsigned long saved_regs_mask) ++{ ++ int j = 0; ++ int offset = 0; ++ rtx par = NULL_RTX; ++ rtx dwarf = NULL_RTX; ++ rtx tmp, mem; ++ ++ /* Restore saved registers. */ ++ gcc_assert (!((saved_regs_mask & (1 << SP_REGNUM)))); ++ j = 0; ++ while (j <= LAST_ARM_REGNUM) ++ if (saved_regs_mask & (1 << j)) ++ { ++ if ((j % 2) == 0 ++ && (saved_regs_mask & (1 << (j + 1))) ++ && (j + 1) != PC_REGNUM) ++ { ++ /* Current register and next register form register pair for which ++ LDRD can be generated. PC is always the last register popped, and ++ we handle it separately. */ ++ if (offset > 0) ++ mem = gen_frame_mem (DImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ else ++ mem = gen_frame_mem (DImode, stack_pointer_rtx); ++ ++ tmp = gen_rtx_SET (DImode, gen_rtx_REG (DImode, j), mem); ++ tmp = emit_insn (tmp); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ ++ /* Generate dwarf info. */ ++ ++ dwarf = alloc_reg_note (REG_CFA_RESTORE, ++ gen_rtx_REG (SImode, j), ++ NULL_RTX); ++ dwarf = alloc_reg_note (REG_CFA_RESTORE, ++ gen_rtx_REG (SImode, j + 1), ++ dwarf); ++ ++ REG_NOTES (tmp) = dwarf; ++ ++ offset += 8; ++ j += 2; ++ } ++ else if (j != PC_REGNUM) ++ { ++ /* Emit a single word load. */ ++ if (offset > 0) ++ mem = gen_frame_mem (SImode, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ else ++ mem = gen_frame_mem (SImode, stack_pointer_rtx); ++ ++ tmp = gen_rtx_SET (SImode, gen_rtx_REG (SImode, j), mem); ++ tmp = emit_insn (tmp); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ ++ /* Generate dwarf info. */ ++ REG_NOTES (tmp) = alloc_reg_note (REG_CFA_RESTORE, ++ gen_rtx_REG (SImode, j), ++ NULL_RTX); ++ ++ offset += 4; ++ j += 1; ++ } ++ else /* j == PC_REGNUM */ ++ j++; ++ } ++ else ++ j++; ++ ++ /* Update the stack. */ ++ if (offset > 0) ++ { ++ tmp = gen_rtx_SET (Pmode, ++ stack_pointer_rtx, ++ plus_constant (Pmode, ++ stack_pointer_rtx, ++ offset)); ++ tmp = emit_insn (tmp); ++ arm_add_cfa_adjust_cfa_note (tmp, offset, ++ stack_pointer_rtx, stack_pointer_rtx); ++ offset = 0; ++ } ++ ++ if (saved_regs_mask & (1 << PC_REGNUM)) ++ { ++ /* Only PC is to be popped. */ ++ par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2)); ++ XVECEXP (par, 0, 0) = ret_rtx; ++ tmp = gen_rtx_SET (SImode, ++ gen_rtx_REG (SImode, PC_REGNUM), ++ gen_frame_mem (SImode, ++ gen_rtx_POST_INC (SImode, ++ stack_pointer_rtx))); ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ XVECEXP (par, 0, 1) = tmp; ++ par = emit_jump_insn (par); ++ ++ /* Generate dwarf info. */ ++ dwarf = alloc_reg_note (REG_CFA_RESTORE, ++ gen_rtx_REG (SImode, PC_REGNUM), ++ NULL_RTX); ++ REG_NOTES (par) = dwarf; ++ arm_add_cfa_adjust_cfa_note (par, UNITS_PER_WORD, ++ stack_pointer_rtx, stack_pointer_rtx); ++ } ++} ++ + /* Calculate the size of the return value that is passed in registers. */ + static unsigned + arm_size_return_regs (void) +@@ -16877,11 +17734,27 @@ + || df_regs_ever_live_p (LR_REGNUM)); + } + ++/* We do not know if r3 will be available because ++ we do have an indirect tailcall happening in this ++ particular case. */ ++static bool ++is_indirect_tailcall_p (rtx call) ++{ ++ rtx pat = PATTERN (call); + ++ /* Indirect tail call. */ ++ pat = XVECEXP (pat, 0, 0); ++ if (GET_CODE (pat) == SET) ++ pat = SET_SRC (pat); ++ ++ pat = XEXP (XEXP (pat, 0), 0); ++ return REG_P (pat); ++} ++ + /* Return true if r3 is used by any of the tail call insns in the + current function. */ + static bool +-any_sibcall_uses_r3 (void) ++any_sibcall_could_use_r3 (void) + { + edge_iterator ei; + edge e; +@@ -16895,7 +17768,8 @@ + if (!CALL_P (call)) + call = prev_nonnote_nondebug_insn (call); + gcc_assert (CALL_P (call) && SIBLING_CALL_P (call)); +- if (find_regno_fusage (call, USE, 3)) ++ if (find_regno_fusage (call, USE, 3) ++ || is_indirect_tailcall_p (call)) + return true; + } + return false; +@@ -17062,9 +17936,11 @@ + /* If it is safe to use r3, then do so. This sometimes + generates better code on Thumb-2 by avoiding the need to + use 32-bit push/pop instructions. */ +- if (! any_sibcall_uses_r3 () ++ if (! any_sibcall_could_use_r3 () + && arm_size_return_regs () <= 12 +- && (offsets->saved_regs_mask & (1 << 3)) == 0) ++ && (offsets->saved_regs_mask & (1 << 3)) == 0 ++ && (TARGET_THUMB2 ++ || !(TARGET_LDRD && current_tune->prefer_ldrd_strd))) + { + reg = 3; + } +@@ -17497,6 +18373,12 @@ + { + thumb2_emit_strd_push (live_regs_mask); + } ++ else if (TARGET_ARM ++ && !TARGET_APCS_FRAME ++ && !IS_INTERRUPT (func_type)) ++ { ++ arm_emit_strd_push (live_regs_mask); ++ } + else + { + insn = emit_multi_reg_push (live_regs_mask); +@@ -18774,7 +19656,14 @@ + enum arm_cond_code code; + int n; + int mask; ++ int max; + ++ /* Maximum number of conditionally executed instructions in a block ++ is minimum of the two max values: maximum allowed in an IT block ++ and maximum that is beneficial according to the cost model and tune. */ ++ max = (max_insns_skipped < MAX_INSN_PER_IT_BLOCK) ? ++ max_insns_skipped : MAX_INSN_PER_IT_BLOCK; ++ + /* Remove the previous insn from the count of insns to be output. */ + if (arm_condexec_count) + arm_condexec_count--; +@@ -18816,9 +19705,9 @@ + /* ??? Recognize conditional jumps, and combine them with IT blocks. */ + if (GET_CODE (body) != COND_EXEC) + break; +- /* Allow up to 4 conditionally executed instructions in a block. */ ++ /* Maximum number of conditionally executed instructions in a block. */ + n = get_attr_ce_count (insn); +- if (arm_condexec_masklen + n > 4) ++ if (arm_condexec_masklen + n > max) + break; + + predicate = COND_EXEC_TEST (body); +@@ -19376,6 +20265,7 @@ + typedef enum { + T_V8QI, + T_V4HI, ++ T_V4HF, + T_V2SI, + T_V2SF, + T_DI, +@@ -19393,8 +20283,8 @@ + #define TYPE_MODE_BIT(X) (1 << (X)) + + #define TB_DREG (TYPE_MODE_BIT (T_V8QI) | TYPE_MODE_BIT (T_V4HI) \ +- | TYPE_MODE_BIT (T_V2SI) | TYPE_MODE_BIT (T_V2SF) \ +- | TYPE_MODE_BIT (T_DI)) ++ | TYPE_MODE_BIT (T_V4HF) | TYPE_MODE_BIT (T_V2SI) \ ++ | TYPE_MODE_BIT (T_V2SF) | TYPE_MODE_BIT (T_DI)) + #define TB_QREG (TYPE_MODE_BIT (T_V16QI) | TYPE_MODE_BIT (T_V8HI) \ + | TYPE_MODE_BIT (T_V4SI) | TYPE_MODE_BIT (T_V4SF) \ + | TYPE_MODE_BIT (T_V2DI) | TYPE_MODE_BIT (T_TI)) +@@ -19401,6 +20291,7 @@ + + #define v8qi_UP T_V8QI + #define v4hi_UP T_V4HI ++#define v4hf_UP T_V4HF + #define v2si_UP T_V2SI + #define v2sf_UP T_V2SF + #define di_UP T_DI +@@ -19436,6 +20327,8 @@ + NEON_SCALARMULH, + NEON_SCALARMAC, + NEON_CONVERT, ++ NEON_FLOAT_WIDEN, ++ NEON_FLOAT_NARROW, + NEON_FIXCONV, + NEON_SELECT, + NEON_RESULTPAIR, +@@ -19496,7 +20389,8 @@ + VAR9 (T, N, A, B, C, D, E, F, G, H, I), \ + {#N, NEON_##T, UP (J), CF (N, J), 0} + +-/* The mode entries in the following table correspond to the "key" type of the ++/* The NEON builtin data can be found in arm_neon_builtins.def. ++ The mode entries in the following table correspond to the "key" type of the + instruction variant, i.e. equivalent to that which would be specified after + the assembler mnemonic, which usually refers to the last vector operand. + (Signed/unsigned/polynomial types are not differentiated between though, and +@@ -19506,196 +20400,7 @@ + + static neon_builtin_datum neon_builtin_data[] = + { +- VAR10 (BINOP, vadd, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR3 (BINOP, vaddl, v8qi, v4hi, v2si), +- VAR3 (BINOP, vaddw, v8qi, v4hi, v2si), +- VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR3 (BINOP, vaddhn, v8hi, v4si, v2di), +- VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si), +- VAR2 (TERNOP, vfma, v2sf, v4sf), +- VAR2 (TERNOP, vfms, v2sf, v4sf), +- VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si), +- VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si), +- VAR2 (TERNOP, vqdmlal, v4hi, v2si), +- VAR2 (TERNOP, vqdmlsl, v4hi, v2si), +- VAR3 (BINOP, vmull, v8qi, v4hi, v2si), +- VAR2 (SCALARMULL, vmull_n, v4hi, v2si), +- VAR2 (LANEMULL, vmull_lane, v4hi, v2si), +- VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si), +- VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si), +- VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si), +- VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si), +- VAR2 (BINOP, vqdmull, v4hi, v2si), +- VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di), +- VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di), +- VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di), +- VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si), +- VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR10 (BINOP, vsub, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR3 (BINOP, vsubl, v8qi, v4hi, v2si), +- VAR3 (BINOP, vsubw, v8qi, v4hi, v2si), +- VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR3 (BINOP, vsubhn, v8hi, v4si, v2di), +- VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR6 (BINOP, vcgeu, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR6 (BINOP, vcgtu, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR2 (BINOP, vcage, v2sf, v4sf), +- VAR2 (BINOP, vcagt, v2sf, v4sf), +- VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR3 (BINOP, vabdl, v8qi, v4hi, v2si), +- VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR3 (TERNOP, vabal, v8qi, v4hi, v2si), +- VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf), +- VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf), +- VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf), +- VAR2 (BINOP, vrecps, v2sf, v4sf), +- VAR2 (BINOP, vrsqrts, v2sf, v4sf), +- VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), +- VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- VAR2 (UNOP, vcnt, v8qi, v16qi), +- VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf), +- VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf), +- VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si), +- /* FIXME: vget_lane supports more variants than this! */ +- VAR10 (GETLANE, vget_lane, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (SETLANE, vset_lane, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di), +- VAR10 (DUP, vdup_n, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (DUPLANE, vdup_lane, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di), +- VAR3 (UNOP, vmovn, v8hi, v4si, v2di), +- VAR3 (UNOP, vqmovn, v8hi, v4si, v2di), +- VAR3 (UNOP, vqmovun, v8hi, v4si, v2di), +- VAR3 (UNOP, vmovl, v8qi, v4hi, v2si), +- VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR2 (LANEMAC, vmlal_lane, v4hi, v2si), +- VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si), +- VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si), +- VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si), +- VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR2 (SCALARMAC, vmlal_n, v4hi, v2si), +- VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si), +- VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si), +- VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si), +- VAR10 (BINOP, vext, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi), +- VAR2 (UNOP, vrev16, v8qi, v16qi), +- VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf), +- VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf), +- VAR10 (SELECT, vbsl, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR2 (RINT, vrintn, v2sf, v4sf), +- VAR2 (RINT, vrinta, v2sf, v4sf), +- VAR2 (RINT, vrintp, v2sf, v4sf), +- VAR2 (RINT, vrintm, v2sf, v4sf), +- VAR2 (RINT, vrintz, v2sf, v4sf), +- VAR2 (RINT, vrintx, v2sf, v4sf), +- VAR1 (VTBL, vtbl1, v8qi), +- VAR1 (VTBL, vtbl2, v8qi), +- VAR1 (VTBL, vtbl3, v8qi), +- VAR1 (VTBL, vtbl4, v8qi), +- VAR1 (VTBX, vtbx1, v8qi), +- VAR1 (VTBX, vtbx2, v8qi), +- VAR1 (VTBX, vtbx3, v8qi), +- VAR1 (VTBX, vtbx4, v8qi), +- VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), +- VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di), +- VAR5 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di), +- VAR5 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOAD1, vld1, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOAD1LANE, vld1_lane, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOAD1, vld1_dup, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (STORE1, vst1, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (STORE1LANE, vst1_lane, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR9 (LOADSTRUCT, +- vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (LOADSTRUCTLANE, vld2_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di), +- VAR9 (STORESTRUCT, vst2, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (STORESTRUCTLANE, vst2_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR9 (LOADSTRUCT, +- vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (LOADSTRUCTLANE, vld3_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di), +- VAR9 (STORESTRUCT, vst3, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (STORESTRUCTLANE, vst3_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR9 (LOADSTRUCT, vld4, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (LOADSTRUCTLANE, vld4_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di), +- VAR9 (STORESTRUCT, vst4, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), +- VAR7 (STORESTRUCTLANE, vst4_lane, +- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), +- VAR10 (LOGICBINOP, vand, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOGICBINOP, vorr, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (BINOP, veor, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOGICBINOP, vbic, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), +- VAR10 (LOGICBINOP, vorn, +- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) ++#include "arm_neon_builtins.def" + }; + + #undef CF +@@ -19710,9 +20415,36 @@ + #undef VAR9 + #undef VAR10 + +-/* Neon defines builtins from ARM_BUILTIN_MAX upwards, though they don't have +- symbolic names defined here (which would require too much duplication). +- FIXME? */ ++#define CF(N,X) ARM_BUILTIN_NEON_##N##X ++#define VAR1(T, N, A) \ ++ CF (N, A) ++#define VAR2(T, N, A, B) \ ++ VAR1 (T, N, A), \ ++ CF (N, B) ++#define VAR3(T, N, A, B, C) \ ++ VAR2 (T, N, A, B), \ ++ CF (N, C) ++#define VAR4(T, N, A, B, C, D) \ ++ VAR3 (T, N, A, B, C), \ ++ CF (N, D) ++#define VAR5(T, N, A, B, C, D, E) \ ++ VAR4 (T, N, A, B, C, D), \ ++ CF (N, E) ++#define VAR6(T, N, A, B, C, D, E, F) \ ++ VAR5 (T, N, A, B, C, D, E), \ ++ CF (N, F) ++#define VAR7(T, N, A, B, C, D, E, F, G) \ ++ VAR6 (T, N, A, B, C, D, E, F), \ ++ CF (N, G) ++#define VAR8(T, N, A, B, C, D, E, F, G, H) \ ++ VAR7 (T, N, A, B, C, D, E, F, G), \ ++ CF (N, H) ++#define VAR9(T, N, A, B, C, D, E, F, G, H, I) \ ++ VAR8 (T, N, A, B, C, D, E, F, G, H), \ ++ CF (N, I) ++#define VAR10(T, N, A, B, C, D, E, F, G, H, I, J) \ ++ VAR9 (T, N, A, B, C, D, E, F, G, H, I), \ ++ CF (N, J) + enum arm_builtins + { + ARM_BUILTIN_GETWCGR0, +@@ -19961,13 +20693,54 @@ + + ARM_BUILTIN_WMERGE, + +- ARM_BUILTIN_NEON_BASE, ++ ARM_BUILTIN_CRC32B, ++ ARM_BUILTIN_CRC32H, ++ ARM_BUILTIN_CRC32W, ++ ARM_BUILTIN_CRC32CB, ++ ARM_BUILTIN_CRC32CH, ++ ARM_BUILTIN_CRC32CW, + +- ARM_BUILTIN_MAX = ARM_BUILTIN_NEON_BASE + ARRAY_SIZE (neon_builtin_data) ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 ++ ++#define CRYPTO1(L, U, M1, M2) \ ++ ARM_BUILTIN_CRYPTO_##U, ++#define CRYPTO2(L, U, M1, M2, M3) \ ++ ARM_BUILTIN_CRYPTO_##U, ++#define CRYPTO3(L, U, M1, M2, M3, M4) \ ++ ARM_BUILTIN_CRYPTO_##U, ++ ++#include "crypto.def" ++ ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 ++ ++#include "arm_neon_builtins.def" ++ ++ ,ARM_BUILTIN_MAX + }; + ++#define ARM_BUILTIN_NEON_BASE (ARM_BUILTIN_MAX - ARRAY_SIZE (neon_builtin_data)) ++ ++#undef CF ++#undef VAR1 ++#undef VAR2 ++#undef VAR3 ++#undef VAR4 ++#undef VAR5 ++#undef VAR6 ++#undef VAR7 ++#undef VAR8 ++#undef VAR9 ++#undef VAR10 ++ + static GTY(()) tree arm_builtin_decls[ARM_BUILTIN_MAX]; + ++#define NUM_DREG_TYPES 5 ++#define NUM_QREG_TYPES 6 ++ + static void + arm_init_neon_builtins (void) + { +@@ -19976,10 +20749,12 @@ + + tree neon_intQI_type_node; + tree neon_intHI_type_node; ++ tree neon_floatHF_type_node; + tree neon_polyQI_type_node; + tree neon_polyHI_type_node; + tree neon_intSI_type_node; + tree neon_intDI_type_node; ++ tree neon_intUTI_type_node; + tree neon_float_type_node; + + tree intQI_pointer_node; +@@ -20002,6 +20777,7 @@ + + tree V8QI_type_node; + tree V4HI_type_node; ++ tree V4HF_type_node; + tree V2SI_type_node; + tree V2SF_type_node; + tree V16QI_type_node; +@@ -20041,9 +20817,9 @@ + tree void_ftype_pv4sf_v4sf_v4sf; + tree void_ftype_pv2di_v2di_v2di; + +- tree reinterp_ftype_dreg[5][5]; +- tree reinterp_ftype_qreg[5][5]; +- tree dreg_types[5], qreg_types[5]; ++ tree reinterp_ftype_dreg[NUM_DREG_TYPES][NUM_DREG_TYPES]; ++ tree reinterp_ftype_qreg[NUM_QREG_TYPES][NUM_QREG_TYPES]; ++ tree dreg_types[NUM_DREG_TYPES], qreg_types[NUM_QREG_TYPES]; + + /* Create distinguished type nodes for NEON vector element types, + and pointers to values of such types, so we can detect them later. */ +@@ -20056,6 +20832,9 @@ + neon_float_type_node = make_node (REAL_TYPE); + TYPE_PRECISION (neon_float_type_node) = FLOAT_TYPE_SIZE; + layout_type (neon_float_type_node); ++ neon_floatHF_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (neon_floatHF_type_node) = GET_MODE_PRECISION (HFmode); ++ layout_type (neon_floatHF_type_node); + + /* Define typedefs which exactly correspond to the modes we are basing vector + types on. If you change these names you'll need to change +@@ -20064,6 +20843,8 @@ + "__builtin_neon_qi"); + (*lang_hooks.types.register_builtin_type) (neon_intHI_type_node, + "__builtin_neon_hi"); ++ (*lang_hooks.types.register_builtin_type) (neon_floatHF_type_node, ++ "__builtin_neon_hf"); + (*lang_hooks.types.register_builtin_type) (neon_intSI_type_node, + "__builtin_neon_si"); + (*lang_hooks.types.register_builtin_type) (neon_float_type_node, +@@ -20105,6 +20886,8 @@ + build_vector_type_for_mode (neon_intQI_type_node, V8QImode); + V4HI_type_node = + build_vector_type_for_mode (neon_intHI_type_node, V4HImode); ++ V4HF_type_node = ++ build_vector_type_for_mode (neon_floatHF_type_node, V4HFmode); + V2SI_type_node = + build_vector_type_for_mode (neon_intSI_type_node, V2SImode); + V2SF_type_node = +@@ -20126,7 +20909,9 @@ + intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode)); + intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode)); + intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode)); ++ neon_intUTI_type_node = make_unsigned_type (GET_MODE_PRECISION (TImode)); + ++ + (*lang_hooks.types.register_builtin_type) (intUQI_type_node, + "__builtin_neon_uqi"); + (*lang_hooks.types.register_builtin_type) (intUHI_type_node, +@@ -20135,6 +20920,10 @@ + "__builtin_neon_usi"); + (*lang_hooks.types.register_builtin_type) (intUDI_type_node, + "__builtin_neon_udi"); ++ (*lang_hooks.types.register_builtin_type) (intUDI_type_node, ++ "__builtin_neon_poly64"); ++ (*lang_hooks.types.register_builtin_type) (neon_intUTI_type_node, ++ "__builtin_neon_poly128"); + + /* Opaque integer types for structures of vectors. */ + intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode)); +@@ -20196,6 +20985,80 @@ + build_function_type_list (void_type_node, V2DI_pointer_node, V2DI_type_node, + V2DI_type_node, NULL); + ++ if (TARGET_CRYPTO && TARGET_HARD_FLOAT) ++ { ++ tree V4USI_type_node = ++ build_vector_type_for_mode (intUSI_type_node, V4SImode); ++ ++ tree V16UQI_type_node = ++ build_vector_type_for_mode (intUQI_type_node, V16QImode); ++ ++ tree v16uqi_ftype_v16uqi ++ = build_function_type_list (V16UQI_type_node, V16UQI_type_node, NULL_TREE); ++ ++ tree v16uqi_ftype_v16uqi_v16uqi ++ = build_function_type_list (V16UQI_type_node, V16UQI_type_node, ++ V16UQI_type_node, NULL_TREE); ++ ++ tree v4usi_ftype_v4usi ++ = build_function_type_list (V4USI_type_node, V4USI_type_node, NULL_TREE); ++ ++ tree v4usi_ftype_v4usi_v4usi ++ = build_function_type_list (V4USI_type_node, V4USI_type_node, ++ V4USI_type_node, NULL_TREE); ++ ++ tree v4usi_ftype_v4usi_v4usi_v4usi ++ = build_function_type_list (V4USI_type_node, V4USI_type_node, ++ V4USI_type_node, V4USI_type_node, NULL_TREE); ++ ++ tree uti_ftype_udi_udi ++ = build_function_type_list (neon_intUTI_type_node, intUDI_type_node, ++ intUDI_type_node, NULL_TREE); ++ ++ #undef CRYPTO1 ++ #undef CRYPTO2 ++ #undef CRYPTO3 ++ #undef C ++ #undef N ++ #undef CF ++ #undef FT1 ++ #undef FT2 ++ #undef FT3 ++ ++ #define C(U) \ ++ ARM_BUILTIN_CRYPTO_##U ++ #define N(L) \ ++ "__builtin_arm_crypto_"#L ++ #define FT1(R, A) \ ++ R##_ftype_##A ++ #define FT2(R, A1, A2) \ ++ R##_ftype_##A1##_##A2 ++ #define FT3(R, A1, A2, A3) \ ++ R##_ftype_##A1##_##A2##_##A3 ++ #define CRYPTO1(L, U, R, A) \ ++ arm_builtin_decls[C (U)] = add_builtin_function (N (L), FT1 (R, A), \ ++ C (U), BUILT_IN_MD, \ ++ NULL, NULL_TREE); ++ #define CRYPTO2(L, U, R, A1, A2) \ ++ arm_builtin_decls[C (U)] = add_builtin_function (N (L), FT2 (R, A1, A2), \ ++ C (U), BUILT_IN_MD, \ ++ NULL, NULL_TREE); ++ ++ #define CRYPTO3(L, U, R, A1, A2, A3) \ ++ arm_builtin_decls[C (U)] = add_builtin_function (N (L), FT3 (R, A1, A2, A3), \ ++ C (U), BUILT_IN_MD, \ ++ NULL, NULL_TREE); ++ #include "crypto.def" ++ ++ #undef CRYPTO1 ++ #undef CRYPTO2 ++ #undef CRYPTO3 ++ #undef C ++ #undef N ++ #undef FT1 ++ #undef FT2 ++ #undef FT3 ++ } + dreg_types[0] = V8QI_type_node; + dreg_types[1] = V4HI_type_node; + dreg_types[2] = V2SI_type_node; +@@ -20207,14 +21070,17 @@ + qreg_types[2] = V4SI_type_node; + qreg_types[3] = V4SF_type_node; + qreg_types[4] = V2DI_type_node; ++ qreg_types[5] = neon_intUTI_type_node; + +- for (i = 0; i < 5; i++) ++ for (i = 0; i < NUM_QREG_TYPES; i++) + { + int j; +- for (j = 0; j < 5; j++) ++ for (j = 0; j < NUM_QREG_TYPES; j++) + { +- reinterp_ftype_dreg[i][j] +- = build_function_type_list (dreg_types[i], dreg_types[j], NULL); ++ if (i < NUM_DREG_TYPES && j < NUM_DREG_TYPES) ++ reinterp_ftype_dreg[i][j] ++ = build_function_type_list (dreg_types[i], dreg_types[j], NULL); ++ + reinterp_ftype_qreg[i][j] + = build_function_type_list (qreg_types[i], qreg_types[j], NULL); + } +@@ -20227,7 +21093,7 @@ + neon_builtin_datum *d = &neon_builtin_data[i]; + + const char* const modenames[] = { +- "v8qi", "v4hi", "v2si", "v2sf", "di", ++ "v8qi", "v4hi", "v4hf", "v2si", "v2sf", "di", + "v16qi", "v8hi", "v4si", "v4sf", "v2di", + "ti", "ei", "oi" + }; +@@ -20429,9 +21295,14 @@ + + case NEON_REINTERP: + { +- /* We iterate over 5 doubleword types, then 5 quadword +- types. */ +- int rhs = d->mode % 5; ++ /* We iterate over NUM_DREG_TYPES doubleword types, ++ then NUM_QREG_TYPES quadword types. ++ V4HF is not a type used in reinterpret, so we translate ++ d->mode to the correct index in reinterp_ftype_dreg. */ ++ bool qreg_p ++ = GET_MODE_SIZE (insn_data[d->code].operand[0].mode) > 8; ++ int rhs = (d->mode - ((!qreg_p && (d->mode > T_V4HF)) ? 1 : 0)) ++ % NUM_QREG_TYPES; + switch (insn_data[d->code].operand[0].mode) + { + case V8QImode: ftype = reinterp_ftype_dreg[0][rhs]; break; +@@ -20444,11 +21315,43 @@ + case V4SImode: ftype = reinterp_ftype_qreg[2][rhs]; break; + case V4SFmode: ftype = reinterp_ftype_qreg[3][rhs]; break; + case V2DImode: ftype = reinterp_ftype_qreg[4][rhs]; break; ++ case TImode: ftype = reinterp_ftype_qreg[5][rhs]; break; + default: gcc_unreachable (); + } + } + break; ++ case NEON_FLOAT_WIDEN: ++ { ++ tree eltype = NULL_TREE; ++ tree return_type = NULL_TREE; + ++ switch (insn_data[d->code].operand[1].mode) ++ { ++ case V4HFmode: ++ eltype = V4HF_type_node; ++ return_type = V4SF_type_node; ++ break; ++ default: gcc_unreachable (); ++ } ++ ftype = build_function_type_list (return_type, eltype, NULL); ++ break; ++ } ++ case NEON_FLOAT_NARROW: ++ { ++ tree eltype = NULL_TREE; ++ tree return_type = NULL_TREE; ++ ++ switch (insn_data[d->code].operand[1].mode) ++ { ++ case V4SFmode: ++ eltype = V4SF_type_node; ++ return_type = V4HF_type_node; ++ break; ++ default: gcc_unreachable (); ++ } ++ ftype = build_function_type_list (return_type, eltype, NULL); ++ break; ++ } + default: + gcc_unreachable (); + } +@@ -20463,6 +21366,9 @@ + } + } + ++#undef NUM_DREG_TYPES ++#undef NUM_QREG_TYPES ++ + #define def_mbuiltin(MASK, NAME, TYPE, CODE) \ + do \ + { \ +@@ -20485,7 +21391,7 @@ + const enum rtx_code comparison; + const unsigned int flag; + }; +- ++ + static const struct builtin_description bdesc_2arg[] = + { + #define IWMMXT_BUILTIN(code, string, builtin) \ +@@ -20591,6 +21497,33 @@ + IWMMXT_BUILTIN2 (iwmmxt_wpackdus, WPACKDUS) + IWMMXT_BUILTIN2 (iwmmxt_wmacuz, WMACUZ) + IWMMXT_BUILTIN2 (iwmmxt_wmacsz, WMACSZ) ++ ++#define CRC32_BUILTIN(L, U) \ ++ {0, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \ ++ UNKNOWN, 0}, ++ CRC32_BUILTIN (crc32b, CRC32B) ++ CRC32_BUILTIN (crc32h, CRC32H) ++ CRC32_BUILTIN (crc32w, CRC32W) ++ CRC32_BUILTIN (crc32cb, CRC32CB) ++ CRC32_BUILTIN (crc32ch, CRC32CH) ++ CRC32_BUILTIN (crc32cw, CRC32CW) ++#undef CRC32_BUILTIN ++ ++ ++#define CRYPTO_BUILTIN(L, U) \ ++ {0, CODE_FOR_crypto_##L, "__builtin_arm_crypto_"#L, ARM_BUILTIN_CRYPTO_##U, \ ++ UNKNOWN, 0}, ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 ++#define CRYPTO2(L, U, R, A1, A2) CRYPTO_BUILTIN (L, U) ++#define CRYPTO1(L, U, R, A) ++#define CRYPTO3(L, U, R, A1, A2, A3) ++#include "crypto.def" ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 ++ + }; + + static const struct builtin_description bdesc_1arg[] = +@@ -20619,8 +21552,28 @@ + IWMMXT_BUILTIN (tbcstv8qi, "tbcstb", TBCSTB) + IWMMXT_BUILTIN (tbcstv4hi, "tbcsth", TBCSTH) + IWMMXT_BUILTIN (tbcstv2si, "tbcstw", TBCSTW) ++ ++#define CRYPTO1(L, U, R, A) CRYPTO_BUILTIN (L, U) ++#define CRYPTO2(L, U, R, A1, A2) ++#define CRYPTO3(L, U, R, A1, A2, A3) ++#include "crypto.def" ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 + }; + ++static const struct builtin_description bdesc_3arg[] = ++{ ++#define CRYPTO3(L, U, R, A1, A2, A3) CRYPTO_BUILTIN (L, U) ++#define CRYPTO1(L, U, R, A) ++#define CRYPTO2(L, U, R, A1, A2) ++#include "crypto.def" ++#undef CRYPTO1 ++#undef CRYPTO2 ++#undef CRYPTO3 ++ }; ++#undef CRYPTO_BUILTIN ++ + /* Set up all the iWMMXt builtins. This is not called if + TARGET_IWMMXT is zero. */ + +@@ -20815,7 +21768,7 @@ + enum machine_mode mode; + tree type; + +- if (d->name == 0) ++ if (d->name == 0 || !(d->mask == FL_IWMMXT || d->mask == FL_IWMMXT2)) + continue; + + mode = insn_data[d->icode].operand[1].mode; +@@ -21010,6 +21963,42 @@ + } + + static void ++arm_init_crc32_builtins () ++{ ++ tree si_ftype_si_qi ++ = build_function_type_list (unsigned_intSI_type_node, ++ unsigned_intSI_type_node, ++ unsigned_intQI_type_node, NULL_TREE); ++ tree si_ftype_si_hi ++ = build_function_type_list (unsigned_intSI_type_node, ++ unsigned_intSI_type_node, ++ unsigned_intHI_type_node, NULL_TREE); ++ tree si_ftype_si_si ++ = build_function_type_list (unsigned_intSI_type_node, ++ unsigned_intSI_type_node, ++ unsigned_intSI_type_node, NULL_TREE); ++ ++ arm_builtin_decls[ARM_BUILTIN_CRC32B] ++ = add_builtin_function ("__builtin_arm_crc32b", si_ftype_si_qi, ++ ARM_BUILTIN_CRC32B, BUILT_IN_MD, NULL, NULL_TREE); ++ arm_builtin_decls[ARM_BUILTIN_CRC32H] ++ = add_builtin_function ("__builtin_arm_crc32h", si_ftype_si_hi, ++ ARM_BUILTIN_CRC32H, BUILT_IN_MD, NULL, NULL_TREE); ++ arm_builtin_decls[ARM_BUILTIN_CRC32W] ++ = add_builtin_function ("__builtin_arm_crc32w", si_ftype_si_si, ++ ARM_BUILTIN_CRC32W, BUILT_IN_MD, NULL, NULL_TREE); ++ arm_builtin_decls[ARM_BUILTIN_CRC32CB] ++ = add_builtin_function ("__builtin_arm_crc32cb", si_ftype_si_qi, ++ ARM_BUILTIN_CRC32CB, BUILT_IN_MD, NULL, NULL_TREE); ++ arm_builtin_decls[ARM_BUILTIN_CRC32CH] ++ = add_builtin_function ("__builtin_arm_crc32ch", si_ftype_si_hi, ++ ARM_BUILTIN_CRC32CH, BUILT_IN_MD, NULL, NULL_TREE); ++ arm_builtin_decls[ARM_BUILTIN_CRC32CW] ++ = add_builtin_function ("__builtin_arm_crc32cw", si_ftype_si_si, ++ ARM_BUILTIN_CRC32CW, BUILT_IN_MD, NULL, NULL_TREE); ++} ++ ++static void + arm_init_builtins (void) + { + if (TARGET_REALLY_IWMMXT) +@@ -21020,6 +22009,9 @@ + + if (arm_fp16_format) + arm_init_fp16_builtins (); ++ ++ if (TARGET_CRC32) ++ arm_init_crc32_builtins (); + } + + /* Return the ARM builtin for CODE. */ +@@ -21113,6 +22105,73 @@ + return x; + } + ++/* Function to expand ternary builtins. */ ++static rtx ++arm_expand_ternop_builtin (enum insn_code icode, ++ tree exp, rtx target) ++{ ++ rtx pat; ++ tree arg0 = CALL_EXPR_ARG (exp, 0); ++ tree arg1 = CALL_EXPR_ARG (exp, 1); ++ tree arg2 = CALL_EXPR_ARG (exp, 2); ++ ++ rtx op0 = expand_normal (arg0); ++ rtx op1 = expand_normal (arg1); ++ rtx op2 = expand_normal (arg2); ++ rtx op3 = NULL_RTX; ++ ++ /* The sha1c, sha1p, sha1m crypto builtins require a different vec_select ++ lane operand depending on endianness. */ ++ bool builtin_sha1cpm_p = false; ++ ++ if (insn_data[icode].n_operands == 5) ++ { ++ gcc_assert (icode == CODE_FOR_crypto_sha1c ++ || icode == CODE_FOR_crypto_sha1p ++ || icode == CODE_FOR_crypto_sha1m); ++ builtin_sha1cpm_p = true; ++ } ++ enum machine_mode tmode = insn_data[icode].operand[0].mode; ++ enum machine_mode mode0 = insn_data[icode].operand[1].mode; ++ enum machine_mode mode1 = insn_data[icode].operand[2].mode; ++ enum machine_mode mode2 = insn_data[icode].operand[3].mode; ++ ++ ++ if (VECTOR_MODE_P (mode0)) ++ op0 = safe_vector_operand (op0, mode0); ++ if (VECTOR_MODE_P (mode1)) ++ op1 = safe_vector_operand (op1, mode1); ++ if (VECTOR_MODE_P (mode2)) ++ op2 = safe_vector_operand (op2, mode2); ++ ++ if (! target ++ || GET_MODE (target) != tmode ++ || ! (*insn_data[icode].operand[0].predicate) (target, tmode)) ++ target = gen_reg_rtx (tmode); ++ ++ gcc_assert ((GET_MODE (op0) == mode0 || GET_MODE (op0) == VOIDmode) ++ && (GET_MODE (op1) == mode1 || GET_MODE (op1) == VOIDmode) ++ && (GET_MODE (op2) == mode2 || GET_MODE (op2) == VOIDmode)); ++ ++ if (! (*insn_data[icode].operand[1].predicate) (op0, mode0)) ++ op0 = copy_to_mode_reg (mode0, op0); ++ if (! (*insn_data[icode].operand[2].predicate) (op1, mode1)) ++ op1 = copy_to_mode_reg (mode1, op1); ++ if (! (*insn_data[icode].operand[3].predicate) (op2, mode2)) ++ op2 = copy_to_mode_reg (mode2, op2); ++ if (builtin_sha1cpm_p) ++ op3 = GEN_INT (TARGET_BIG_END ? 1 : 0); ++ ++ if (builtin_sha1cpm_p) ++ pat = GEN_FCN (icode) (target, op0, op1, op2, op3); ++ else ++ pat = GEN_FCN (icode) (target, op0, op1, op2); ++ if (! pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ + /* Subroutine of arm_expand_builtin to take care of binop insns. */ + + static rtx +@@ -21162,9 +22221,17 @@ + rtx pat; + tree arg0 = CALL_EXPR_ARG (exp, 0); + rtx op0 = expand_normal (arg0); ++ rtx op1 = NULL_RTX; + enum machine_mode tmode = insn_data[icode].operand[0].mode; + enum machine_mode mode0 = insn_data[icode].operand[1].mode; ++ bool builtin_sha1h_p = false; + ++ if (insn_data[icode].n_operands == 3) ++ { ++ gcc_assert (icode == CODE_FOR_crypto_sha1h); ++ builtin_sha1h_p = true; ++ } ++ + if (! target + || GET_MODE (target) != tmode + || ! (*insn_data[icode].operand[0].predicate) (target, tmode)) +@@ -21179,8 +22246,13 @@ + if (! (*insn_data[icode].operand[1].predicate) (op0, mode0)) + op0 = copy_to_mode_reg (mode0, op0); + } ++ if (builtin_sha1h_p) ++ op1 = GEN_INT (TARGET_BIG_END ? 1 : 0); + +- pat = GEN_FCN (icode) (target, op0); ++ if (builtin_sha1h_p) ++ pat = GEN_FCN (icode) (target, op0, op1); ++ else ++ pat = GEN_FCN (icode) (target, op0); + if (! pat) + return 0; + emit_insn (pat); +@@ -21452,6 +22524,8 @@ + case NEON_DUP: + case NEON_RINT: + case NEON_SPLIT: ++ case NEON_FLOAT_WIDEN: ++ case NEON_FLOAT_NARROW: + case NEON_REINTERP: + return arm_expand_neon_args (target, icode, 1, type_mode, exp, fcode, + NEON_ARG_COPY_TO_REG, NEON_ARG_STOP); +@@ -21649,7 +22723,7 @@ + rtx op1; + rtx op2; + rtx pat; +- int fcode = DECL_FUNCTION_CODE (fndecl); ++ unsigned int fcode = DECL_FUNCTION_CODE (fndecl); + size_t i; + enum machine_mode tmode; + enum machine_mode mode0; +@@ -22143,6 +23217,10 @@ + if (d->code == (const enum arm_builtins) fcode) + return arm_expand_unop_builtin (d->icode, exp, target, 0); + ++ for (i = 0, d = bdesc_3arg; i < ARRAY_SIZE (bdesc_3arg); i++, d++) ++ if (d->code == (const enum arm_builtins) fcode) ++ return arm_expand_ternop_builtin (d->icode, exp, target); ++ + /* @@@ Should really do something sensible here. */ + return NULL_RTX; + } +@@ -23366,7 +24444,7 @@ + all we really need to check here is if single register is to be + returned, or multiple register return. */ + void +-thumb2_expand_return (void) ++thumb2_expand_return (bool simple_return) + { + int i, num_regs; + unsigned long saved_regs_mask; +@@ -23379,7 +24457,7 @@ + if (saved_regs_mask & (1 << i)) + num_regs++; + +- if (saved_regs_mask) ++ if (!simple_return && saved_regs_mask) + { + if (num_regs == 1) + { +@@ -23658,6 +24736,7 @@ + + if (frame_pointer_needed) + { ++ rtx insn; + /* Restore stack pointer if necessary. */ + if (TARGET_ARM) + { +@@ -23668,9 +24747,12 @@ + /* Force out any pending memory operations that reference stacked data + before stack de-allocation occurs. */ + emit_insn (gen_blockage ()); +- emit_insn (gen_addsi3 (stack_pointer_rtx, +- hard_frame_pointer_rtx, +- GEN_INT (amount))); ++ insn = emit_insn (gen_addsi3 (stack_pointer_rtx, ++ hard_frame_pointer_rtx, ++ GEN_INT (amount))); ++ arm_add_cfa_adjust_cfa_note (insn, amount, ++ stack_pointer_rtx, ++ hard_frame_pointer_rtx); + + /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not + deleted. */ +@@ -23680,16 +24762,25 @@ + { + /* In Thumb-2 mode, the frame pointer points to the last saved + register. */ +- amount = offsets->locals_base - offsets->saved_regs; +- if (amount) +- emit_insn (gen_addsi3 (hard_frame_pointer_rtx, +- hard_frame_pointer_rtx, +- GEN_INT (amount))); ++ amount = offsets->locals_base - offsets->saved_regs; ++ if (amount) ++ { ++ insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, ++ hard_frame_pointer_rtx, ++ GEN_INT (amount))); ++ arm_add_cfa_adjust_cfa_note (insn, amount, ++ hard_frame_pointer_rtx, ++ hard_frame_pointer_rtx); ++ } + + /* Force out any pending memory operations that reference stacked data + before stack de-allocation occurs. */ + emit_insn (gen_blockage ()); +- emit_insn (gen_movsi (stack_pointer_rtx, hard_frame_pointer_rtx)); ++ insn = emit_insn (gen_movsi (stack_pointer_rtx, ++ hard_frame_pointer_rtx)); ++ arm_add_cfa_adjust_cfa_note (insn, 0, ++ stack_pointer_rtx, ++ hard_frame_pointer_rtx); + /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not + deleted. */ + emit_insn (gen_force_register_use (stack_pointer_rtx)); +@@ -23702,12 +24793,15 @@ + amount = offsets->outgoing_args - offsets->saved_regs; + if (amount) + { ++ rtx tmp; + /* Force out any pending memory operations that reference stacked data + before stack de-allocation occurs. */ + emit_insn (gen_blockage ()); +- emit_insn (gen_addsi3 (stack_pointer_rtx, +- stack_pointer_rtx, +- GEN_INT (amount))); ++ tmp = emit_insn (gen_addsi3 (stack_pointer_rtx, ++ stack_pointer_rtx, ++ GEN_INT (amount))); ++ arm_add_cfa_adjust_cfa_note (tmp, amount, ++ stack_pointer_rtx, stack_pointer_rtx); + /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is + not deleted. */ + emit_insn (gen_force_register_use (stack_pointer_rtx)); +@@ -23760,6 +24854,8 @@ + REG_NOTES (insn) = alloc_reg_note (REG_CFA_RESTORE, + gen_rtx_REG (V2SImode, i), + NULL_RTX); ++ arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD, ++ stack_pointer_rtx, stack_pointer_rtx); + } + + if (saved_regs_mask) +@@ -23807,6 +24903,9 @@ + REG_NOTES (insn) = alloc_reg_note (REG_CFA_RESTORE, + gen_rtx_REG (SImode, i), + NULL_RTX); ++ arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD, ++ stack_pointer_rtx, ++ stack_pointer_rtx); + } + } + } +@@ -23818,6 +24917,8 @@ + { + if (TARGET_THUMB2) + thumb2_emit_ldrd_pop (saved_regs_mask); ++ else if (TARGET_ARM && !IS_INTERRUPT (func_type)) ++ arm_emit_ldrd_pop (saved_regs_mask); + else + arm_emit_multi_reg_pop (saved_regs_mask); + } +@@ -23830,10 +24931,34 @@ + } + + if (crtl->args.pretend_args_size) +- emit_insn (gen_addsi3 (stack_pointer_rtx, +- stack_pointer_rtx, +- GEN_INT (crtl->args.pretend_args_size))); ++ { ++ int i, j; ++ rtx dwarf = NULL_RTX; ++ rtx tmp = emit_insn (gen_addsi3 (stack_pointer_rtx, ++ stack_pointer_rtx, ++ GEN_INT (crtl->args.pretend_args_size))); + ++ RTX_FRAME_RELATED_P (tmp) = 1; ++ ++ if (cfun->machine->uses_anonymous_args) ++ { ++ /* Restore pretend args. Refer arm_expand_prologue on how to save ++ pretend_args in stack. */ ++ int num_regs = crtl->args.pretend_args_size / 4; ++ saved_regs_mask = (0xf0 >> num_regs) & 0xf; ++ for (j = 0, i = 0; j < num_regs; i++) ++ if (saved_regs_mask & (1 << i)) ++ { ++ rtx reg = gen_rtx_REG (SImode, i); ++ dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf); ++ j++; ++ } ++ REG_NOTES (tmp) = dwarf; ++ } ++ arm_add_cfa_adjust_cfa_note (tmp, crtl->args.pretend_args_size, ++ stack_pointer_rtx, stack_pointer_rtx); ++ } ++ + if (!really_return) + return; + +@@ -24229,7 +25354,22 @@ + { + const char *fpu_name; + if (arm_selected_arch) +- asm_fprintf (asm_out_file, "\t.arch %s\n", arm_selected_arch->name); ++ { ++ const char* pos = strchr (arm_selected_arch->name, '+'); ++ if (pos) ++ { ++ char buf[15]; ++ gcc_assert (strlen (arm_selected_arch->name) ++ <= sizeof (buf) / sizeof (*pos)); ++ strncpy (buf, arm_selected_arch->name, ++ (pos - arm_selected_arch->name) * sizeof (*pos)); ++ buf[pos - arm_selected_arch->name] = '\0'; ++ asm_fprintf (asm_out_file, "\t.arch %s\n", buf); ++ asm_fprintf (asm_out_file, "\t.arch_extension %s\n", pos + 1); ++ } ++ else ++ asm_fprintf (asm_out_file, "\t.arch %s\n", arm_selected_arch->name); ++ } + else if (strncmp (arm_selected_cpu->name, "generic", 7) == 0) + asm_fprintf (asm_out_file, "\t.arch %s\n", arm_selected_cpu->name + 8); + else +@@ -25086,7 +26226,7 @@ + { + /* Neon also supports V2SImode, etc. listed in the clause below. */ + if (TARGET_NEON && (mode == V2SFmode || mode == V4SImode || mode == V8HImode +- || mode == V16QImode || mode == V4SFmode || mode == V2DImode)) ++ || mode == V4HFmode || mode == V16QImode || mode == V4SFmode || mode == V2DImode)) + return true; + + if ((TARGET_NEON || TARGET_IWMMXT) +@@ -25249,9 +26389,8 @@ + + nregs = GET_MODE_SIZE (GET_MODE (rtl)) / 8; + p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs)); +- regno = (regno - FIRST_VFP_REGNUM) / 2; + for (i = 0; i < nregs; i++) +- XVECEXP (p, 0, i) = gen_rtx_REG (DImode, 256 + regno + i); ++ XVECEXP (p, 0, i) = gen_rtx_REG (DImode, regno + i); + + return p; + } +@@ -25501,9 +26640,17 @@ + handled_one = true; + break; + ++ /* The INSN is generated in epilogue. It is set as RTX_FRAME_RELATED_P ++ to get correct dwarf information for shrink-wrap. We should not ++ emit unwind information for it because these are used either for ++ pretend arguments or notes to adjust sp and restore registers from ++ stack. */ ++ case REG_CFA_ADJUST_CFA: ++ case REG_CFA_RESTORE: ++ return; ++ + case REG_CFA_DEF_CFA: + case REG_CFA_EXPRESSION: +- case REG_CFA_ADJUST_CFA: + case REG_CFA_OFFSET: + /* ??? Only handling here what we actually emit. */ + gcc_unreachable (); +@@ -25901,6 +27048,7 @@ + case cortexa7: + case cortexa8: + case cortexa9: ++ case cortexa53: + case fa726te: + case marvell_pj4: + return 2; +@@ -25929,11 +27077,13 @@ + { V8QImode, "__builtin_neon_uqi", "16__simd64_uint8_t" }, + { V4HImode, "__builtin_neon_hi", "16__simd64_int16_t" }, + { V4HImode, "__builtin_neon_uhi", "17__simd64_uint16_t" }, ++ { V4HFmode, "__builtin_neon_hf", "18__simd64_float16_t" }, + { V2SImode, "__builtin_neon_si", "16__simd64_int32_t" }, + { V2SImode, "__builtin_neon_usi", "17__simd64_uint32_t" }, + { V2SFmode, "__builtin_neon_sf", "18__simd64_float32_t" }, + { V8QImode, "__builtin_neon_poly8", "16__simd64_poly8_t" }, + { V4HImode, "__builtin_neon_poly16", "17__simd64_poly16_t" }, ++ + /* 128-bit containerized types. */ + { V16QImode, "__builtin_neon_qi", "16__simd128_int8_t" }, + { V16QImode, "__builtin_neon_uqi", "17__simd128_uint8_t" }, +@@ -26027,6 +27177,60 @@ + return !TARGET_THUMB1; + } + ++tree ++arm_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in) ++{ ++ enum machine_mode in_mode, out_mode; ++ int in_n, out_n; ++ ++ if (TREE_CODE (type_out) != VECTOR_TYPE ++ || TREE_CODE (type_in) != VECTOR_TYPE ++ || !(TARGET_NEON && TARGET_FPU_ARMV8 && flag_unsafe_math_optimizations)) ++ return NULL_TREE; ++ ++ out_mode = TYPE_MODE (TREE_TYPE (type_out)); ++ out_n = TYPE_VECTOR_SUBPARTS (type_out); ++ in_mode = TYPE_MODE (TREE_TYPE (type_in)); ++ in_n = TYPE_VECTOR_SUBPARTS (type_in); ++ ++/* ARM_CHECK_BUILTIN_MODE and ARM_FIND_VRINT_VARIANT are used to find the ++ decl of the vectorized builtin for the appropriate vector mode. ++ NULL_TREE is returned if no such builtin is available. */ ++#undef ARM_CHECK_BUILTIN_MODE ++#define ARM_CHECK_BUILTIN_MODE(C) \ ++ (out_mode == SFmode && out_n == C \ ++ && in_mode == SFmode && in_n == C) ++ ++#undef ARM_FIND_VRINT_VARIANT ++#define ARM_FIND_VRINT_VARIANT(N) \ ++ (ARM_CHECK_BUILTIN_MODE (2) \ ++ ? arm_builtin_decl(ARM_BUILTIN_NEON_##N##v2sf, false) \ ++ : (ARM_CHECK_BUILTIN_MODE (4) \ ++ ? arm_builtin_decl(ARM_BUILTIN_NEON_##N##v4sf, false) \ ++ : NULL_TREE)) ++ ++ if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) ++ { ++ enum built_in_function fn = DECL_FUNCTION_CODE (fndecl); ++ switch (fn) ++ { ++ case BUILT_IN_FLOORF: ++ return ARM_FIND_VRINT_VARIANT (vrintm); ++ case BUILT_IN_CEILF: ++ return ARM_FIND_VRINT_VARIANT (vrintp); ++ case BUILT_IN_TRUNCF: ++ return ARM_FIND_VRINT_VARIANT (vrintz); ++ case BUILT_IN_ROUNDF: ++ return ARM_FIND_VRINT_VARIANT (vrinta); ++ default: ++ return NULL_TREE; ++ } ++ } ++ return NULL_TREE; ++} ++#undef ARM_CHECK_BUILTIN_MODE ++#undef ARM_FIND_VRINT_VARIANT ++ + /* The AAPCS sets the maximum alignment of a vector to 64 bits. */ + static HOST_WIDE_INT + arm_vector_alignment (const_tree type) +@@ -26257,40 +27461,72 @@ + emit_insn (gen_memory_barrier ()); + } + +-/* Emit the load-exclusive and store-exclusive instructions. */ ++/* Emit the load-exclusive and store-exclusive instructions. ++ Use acquire and release versions if necessary. */ + + static void +-arm_emit_load_exclusive (enum machine_mode mode, rtx rval, rtx mem) ++arm_emit_load_exclusive (enum machine_mode mode, rtx rval, rtx mem, bool acq) + { + rtx (*gen) (rtx, rtx); + +- switch (mode) ++ if (acq) + { +- case QImode: gen = gen_arm_load_exclusiveqi; break; +- case HImode: gen = gen_arm_load_exclusivehi; break; +- case SImode: gen = gen_arm_load_exclusivesi; break; +- case DImode: gen = gen_arm_load_exclusivedi; break; +- default: +- gcc_unreachable (); ++ switch (mode) ++ { ++ case QImode: gen = gen_arm_load_acquire_exclusiveqi; break; ++ case HImode: gen = gen_arm_load_acquire_exclusivehi; break; ++ case SImode: gen = gen_arm_load_acquire_exclusivesi; break; ++ case DImode: gen = gen_arm_load_acquire_exclusivedi; break; ++ default: ++ gcc_unreachable (); ++ } + } ++ else ++ { ++ switch (mode) ++ { ++ case QImode: gen = gen_arm_load_exclusiveqi; break; ++ case HImode: gen = gen_arm_load_exclusivehi; break; ++ case SImode: gen = gen_arm_load_exclusivesi; break; ++ case DImode: gen = gen_arm_load_exclusivedi; break; ++ default: ++ gcc_unreachable (); ++ } ++ } + + emit_insn (gen (rval, mem)); + } + + static void +-arm_emit_store_exclusive (enum machine_mode mode, rtx bval, rtx rval, rtx mem) ++arm_emit_store_exclusive (enum machine_mode mode, rtx bval, rtx rval, ++ rtx mem, bool rel) + { + rtx (*gen) (rtx, rtx, rtx); + +- switch (mode) ++ if (rel) + { +- case QImode: gen = gen_arm_store_exclusiveqi; break; +- case HImode: gen = gen_arm_store_exclusivehi; break; +- case SImode: gen = gen_arm_store_exclusivesi; break; +- case DImode: gen = gen_arm_store_exclusivedi; break; +- default: +- gcc_unreachable (); ++ switch (mode) ++ { ++ case QImode: gen = gen_arm_store_release_exclusiveqi; break; ++ case HImode: gen = gen_arm_store_release_exclusivehi; break; ++ case SImode: gen = gen_arm_store_release_exclusivesi; break; ++ case DImode: gen = gen_arm_store_release_exclusivedi; break; ++ default: ++ gcc_unreachable (); ++ } + } ++ else ++ { ++ switch (mode) ++ { ++ case QImode: gen = gen_arm_store_exclusiveqi; break; ++ case HImode: gen = gen_arm_store_exclusivehi; break; ++ case SImode: gen = gen_arm_store_exclusivesi; break; ++ case DImode: gen = gen_arm_store_exclusivedi; break; ++ default: ++ gcc_unreachable (); ++ } ++ } + + emit_insn (gen (bval, rval, mem)); + } +@@ -26325,6 +27561,15 @@ + mod_f = operands[7]; + mode = GET_MODE (mem); + ++ /* Normally the succ memory model must be stronger than fail, but in the ++ unlikely event of fail being ACQUIRE and succ being RELEASE we need to ++ promote succ to ACQ_REL so that we don't lose the acquire semantics. */ ++ ++ if (TARGET_HAVE_LDACQ ++ && INTVAL (mod_f) == MEMMODEL_ACQUIRE ++ && INTVAL (mod_s) == MEMMODEL_RELEASE) ++ mod_s = GEN_INT (MEMMODEL_ACQ_REL); ++ + switch (mode) + { + case QImode: +@@ -26399,8 +27644,20 @@ + scratch = operands[7]; + mode = GET_MODE (mem); + +- arm_pre_atomic_barrier (mod_s); ++ bool use_acquire = TARGET_HAVE_LDACQ ++ && !(mod_s == MEMMODEL_RELAXED ++ || mod_s == MEMMODEL_CONSUME ++ || mod_s == MEMMODEL_RELEASE); + ++ bool use_release = TARGET_HAVE_LDACQ ++ && !(mod_s == MEMMODEL_RELAXED ++ || mod_s == MEMMODEL_CONSUME ++ || mod_s == MEMMODEL_ACQUIRE); ++ ++ /* Checks whether a barrier is needed and emits one accordingly. */ ++ if (!(use_acquire || use_release)) ++ arm_pre_atomic_barrier (mod_s); ++ + label1 = NULL_RTX; + if (!is_weak) + { +@@ -26409,7 +27666,7 @@ + } + label2 = gen_label_rtx (); + +- arm_emit_load_exclusive (mode, rval, mem); ++ arm_emit_load_exclusive (mode, rval, mem, use_acquire); + + cond = arm_gen_compare_reg (NE, rval, oldval, scratch); + x = gen_rtx_NE (VOIDmode, cond, const0_rtx); +@@ -26417,7 +27674,7 @@ + gen_rtx_LABEL_REF (Pmode, label2), pc_rtx); + emit_unlikely_jump (gen_rtx_SET (VOIDmode, pc_rtx, x)); + +- arm_emit_store_exclusive (mode, scratch, mem, newval); ++ arm_emit_store_exclusive (mode, scratch, mem, newval, use_release); + + /* Weak or strong, we want EQ to be true for success, so that we + match the flags that we got from the compare above. */ +@@ -26436,7 +27693,9 @@ + if (mod_f != MEMMODEL_RELAXED) + emit_label (label2); + +- arm_post_atomic_barrier (mod_s); ++ /* Checks whether a barrier is needed and emits one accordingly. */ ++ if (!(use_acquire || use_release)) ++ arm_post_atomic_barrier (mod_s); + + if (mod_f == MEMMODEL_RELAXED) + emit_label (label2); +@@ -26451,8 +27710,20 @@ + enum machine_mode wmode = (mode == DImode ? DImode : SImode); + rtx label, x; + +- arm_pre_atomic_barrier (model); ++ bool use_acquire = TARGET_HAVE_LDACQ ++ && !(model == MEMMODEL_RELAXED ++ || model == MEMMODEL_CONSUME ++ || model == MEMMODEL_RELEASE); + ++ bool use_release = TARGET_HAVE_LDACQ ++ && !(model == MEMMODEL_RELAXED ++ || model == MEMMODEL_CONSUME ++ || model == MEMMODEL_ACQUIRE); ++ ++ /* Checks whether a barrier is needed and emits one accordingly. */ ++ if (!(use_acquire || use_release)) ++ arm_pre_atomic_barrier (model); ++ + label = gen_label_rtx (); + emit_label (label); + +@@ -26464,7 +27735,7 @@ + old_out = new_out; + value = simplify_gen_subreg (wmode, value, mode, 0); + +- arm_emit_load_exclusive (mode, old_out, mem); ++ arm_emit_load_exclusive (mode, old_out, mem, use_acquire); + + switch (code) + { +@@ -26512,12 +27783,15 @@ + break; + } + +- arm_emit_store_exclusive (mode, cond, mem, gen_lowpart (mode, new_out)); ++ arm_emit_store_exclusive (mode, cond, mem, gen_lowpart (mode, new_out), ++ use_release); + + x = gen_rtx_NE (VOIDmode, cond, const0_rtx); + emit_unlikely_jump (gen_cbranchsi4 (x, cond, const0_rtx, label)); + +- arm_post_atomic_barrier (model); ++ /* Checks whether a barrier is needed and emits one accordingly. */ ++ if (!(use_acquire || use_release)) ++ arm_post_atomic_barrier (model); + } + + #define MAX_VECT_LEN 16 +@@ -27457,4 +28731,12 @@ + + } + ++/* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */ ++ ++static unsigned HOST_WIDE_INT ++arm_asan_shadow_offset (void) ++{ ++ return (unsigned HOST_WIDE_INT) 1 << 29; ++} ++ + #include "gt-arm.h" +--- a/src/gcc/config/arm/t-aprofile ++++ b/src/gcc/config/arm/t-aprofile +@@ -0,0 +1,177 @@ ++# Copyright (C) 2012-2013 Free Software Foundation, Inc. ++# ++# This file is part of GCC. ++# ++# GCC is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3, or (at your option) ++# any later version. ++# ++# GCC is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with GCC; see the file COPYING3. If not see ++# . ++ ++# This is a target makefile fragment that attempts to get ++# multilibs built for the range of CPU's, FPU's and ABI's that ++# are relevant for the A-profile architecture. It should ++# not be used in conjunction with another make file fragment and ++# assumes --with-arch, --with-cpu, --with-fpu, --with-float, --with-mode ++# have their default values during the configure step. We enforce ++# this during the top-level configury. ++ ++MULTILIB_OPTIONS = ++MULTILIB_DIRNAMES = ++MULTILIB_EXCEPTIONS = ++MULTILIB_MATCHES = ++MULTILIB_REUSE = ++ ++# We have the following hierachy: ++# ISA: A32 (.) or T32 (thumb) ++# Architecture: ARMv7-A (v7-a), ARMv7VE (v7ve), or ARMv8-A (v8-a). ++# FPU: VFPv3-D16 (fpv3), NEONv1 (simdv1), VFPv4-D16 (fpv4), ++# NEON-VFPV4 (simdvfpv4), NEON for ARMv8 (simdv8), or None (.). ++# Float-abi: Soft (.), softfp (softfp), or hard (hardfp). ++ ++# We use the option -mcpu=cortex-a7 because we do not yet have march=armv7ve ++# or march=armv7a+virt as a command line option for the compiler. ++MULTILIB_OPTIONS += mthumb ++MULTILIB_DIRNAMES += thumb ++ ++MULTILIB_OPTIONS += march=armv7-a/mcpu=cortex-a7/march=armv8-a ++MULTILIB_DIRNAMES += v7-a v7ve v8-a ++ ++MULTILIB_OPTIONS += mfpu=vfpv3-d16/mfpu=neon/mfpu=vfpv4-d16/mfpu=neon-vfpv4/mfpu=neon-fp-armv8 ++MULTILIB_DIRNAMES += fpv3 simdv1 fpv4 simdvfpv4 simdv8 ++ ++MULTILIB_OPTIONS += mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES += softfp hard ++ ++# We don't build no-float libraries with an FPU. ++MULTILIB_EXCEPTIONS += *mfpu=vfpv3-d16 ++MULTILIB_EXCEPTIONS += *mfpu=neon ++MULTILIB_EXCEPTIONS += *mfpu=vfpv4-d16 ++MULTILIB_EXCEPTIONS += *mfpu=neon-vfpv4 ++MULTILIB_EXCEPTIONS += *mfpu=neon-fp-armv8 ++ ++# We don't build libraries requiring an FPU at the CPU/Arch/ISA level. ++MULTILIB_EXCEPTIONS += mfloat-abi=* ++MULTILIB_EXCEPTIONS += mfpu=* ++MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=* ++MULTILIB_EXCEPTIONS += mthumb/mfpu=* ++MULTILIB_EXCEPTIONS += *march=armv7-a/mfloat-abi=* ++MULTILIB_EXCEPTIONS += *mcpu=cortex-a7/mfloat-abi=* ++MULTILIB_EXCEPTIONS += *march=armv8-a/mfloat-abi=* ++ ++# Ensure the correct FPU variants apply to the correct base architectures. ++MULTILIB_EXCEPTIONS += *mcpu=cortex-a7/*mfpu=vfpv3-d16* ++MULTILIB_EXCEPTIONS += *mcpu=cortex-a7/*mfpu=neon/* ++MULTILIB_EXCEPTIONS += *march=armv8-a/*mfpu=vfpv3-d16* ++MULTILIB_EXCEPTIONS += *march=armv8-a/*mfpu=neon/* ++MULTILIB_EXCEPTIONS += *march=armv7-a/*mfpu=vfpv4-d16* ++MULTILIB_EXCEPTIONS += *march=armv7-a/*mfpu=neon-vfpv4* ++MULTILIB_EXCEPTIONS += *march=armv8-a/*mfpu=vfpv4-d16* ++MULTILIB_EXCEPTIONS += *march=armv8-a/*mfpu=neon-vfpv4* ++MULTILIB_EXCEPTIONS += *march=armv7-a/*mfpu=neon-fp-armv8* ++MULTILIB_EXCEPTIONS += *mcpu=cortex-a7/*mfpu=neon-fp-armv8* ++ ++# CPU Matches ++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a8 ++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a9 ++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a5 ++MULTILIB_MATCHES += mcpu?cortex-a7=mcpu?cortex-a15 ++MULTILIB_MATCHES += march?armv8-a=mcpu?cortex-a53 ++ ++# FPU matches ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3-fp16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3-fp16-d16 ++MULTILIB_MATCHES += mfpu?vfpv4-d16=mfpu?vfpv4 ++MULTILIB_MATCHES += mfpu?neon-fp-armv8=mfpu?crypto-neon-fp-armv8 ++ ++ ++# Map all requests for vfpv3 with a later CPU to vfpv3-d16 v7-a. ++# So if new CPUs are added above at the newer architecture levels, ++# do something to map them below here. ++# We take the approach of mapping down to v7-a regardless of what ++# the fp option is if the integer architecture brings things down. ++# This applies to any similar combination at the v7ve and v8-a arch ++# levels. ++ ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mcpu.cortex-a7/mfpu.vfpv3-d16/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mcpu.cortex-a7/mfpu.vfpv3-d16/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv7-a/mfpu.fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv7-a/mfpu.fp-armv8/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv7-a/mfpu.vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv7-a/mfpu.vfpv4/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.hard=mcpu.cortex-a7/mfpu.neon/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.softfp=mcpu.cortex-a7/mfpu.neon/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv8-a/mfpu.neon/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv8-a/mfpu.neon/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=mcpu.cortex-a7/mfpu.fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=mcpu.cortex-a7/mfpu.fp-armv8/mfloat-abi.softfp ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=march.armv8-a/mfpu.vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=march.armv8-a/mfpu.vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.hard ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.hard=march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.softfp=march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.hard=mcpu.cortex-a7/mfpu.neon-fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.softfp=mcpu.cortex-a7/mfpu.neon-fp-armv8/mfloat-abi.softfp ++ ++ ++ ++# And again for mthumb. ++ ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/mcpu.cortex-a7/mfpu.vfpv3-d16/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/mcpu.cortex-a7/mfpu.vfpv3-d16/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.fp-armv8/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.vfpv4/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/mcpu.cortex-a7/mfpu.neon/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/mcpu.cortex-a7/mfpu.neon/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.neon/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.neon/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=mthumb/mcpu.cortex-a7/mfpu.fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=mthumb/mcpu.cortex-a7/mfpu.fp-armv8/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.vfpv4-d16/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.softfp ++ ++ ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.softfp ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.hard=mthumb/mcpu.cortex-a7/mfpu.neon-fp-armv8/mfloat-abi.hard ++MULTILIB_REUSE += mthumb/mcpu.cortex-a7/mfpu.neon-vfpv4/mfloat-abi.softfp=mthumb/mcpu.cortex-a7/mfpu.neon-fp-armv8/mfloat-abi.softfp +--- a/src/gcc/config/arm/arm.h ++++ b/src/gcc/config/arm/arm.h +@@ -49,8 +49,14 @@ + builtin_define ("__ARM_FEATURE_QBIT"); \ + if (TARGET_ARM_SAT) \ + builtin_define ("__ARM_FEATURE_SAT"); \ ++ if (TARGET_CRYPTO) \ ++ builtin_define ("__ARM_FEATURE_CRYPTO"); \ + if (unaligned_access) \ + builtin_define ("__ARM_FEATURE_UNALIGNED"); \ ++ if (TARGET_CRC32) \ ++ builtin_define ("__ARM_FEATURE_CRC32"); \ ++ if (TARGET_32BIT) \ ++ builtin_define ("__ARM_32BIT_STATE"); \ + if (TARGET_ARM_FEATURE_LDREX) \ + builtin_define_with_int_value ( \ + "__ARM_FEATURE_LDREX", TARGET_ARM_FEATURE_LDREX); \ +@@ -183,6 +189,11 @@ + + #define ARM_INVERSE_CONDITION_CODE(X) ((arm_cc) (((int)X) ^ 1)) + ++/* The maximaum number of instructions that is beneficial to ++ conditionally execute. */ ++#undef MAX_CONDITIONAL_EXECUTE ++#define MAX_CONDITIONAL_EXECUTE arm_max_conditional_execute () ++ + extern int arm_target_label; + extern int arm_ccfsm_state; + extern GTY(()) rtx arm_target_insn; +@@ -269,6 +280,8 @@ + #define TARGET_LDRD (arm_arch5e && ARM_DOUBLEWORD_ALIGN \ + && !TARGET_THUMB1) + ++#define TARGET_CRC32 (arm_arch_crc) ++ + /* The following two macros concern the ability to execute coprocessor + instructions for VFPv3 or NEON. TARGET_VFP3/TARGET_VFPD32 are currently + only ever tested when we know we are generating for VFP hardware; we need +@@ -350,10 +363,16 @@ + #define TARGET_HAVE_LDREXD (((arm_arch6k && TARGET_ARM) || arm_arch7) \ + && arm_arch_notm) + ++/* Nonzero if this chip supports load-acquire and store-release. */ ++#define TARGET_HAVE_LDACQ (TARGET_ARM_ARCH >= 8) ++ + /* Nonzero if integer division instructions supported. */ + #define TARGET_IDIV ((TARGET_ARM && arm_arch_arm_hwdiv) \ + || (TARGET_THUMB2 && arm_arch_thumb_hwdiv)) + ++/* Should NEON be used for 64-bits bitops. */ ++#define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits) ++ + /* True iff the full BPABI is being used. If TARGET_BPABI is true, + then TARGET_AAPCS_BASED must be true -- but the converse does not + hold. TARGET_BPABI implies the use of the BPABI runtime library, +@@ -539,6 +558,13 @@ + /* Nonzero if chip supports integer division instruction in Thumb mode. */ + extern int arm_arch_thumb_hwdiv; + ++/* Nonzero if we should use Neon to handle 64-bits operations rather ++ than core registers. */ ++extern int prefer_neon_for_64bits; ++ ++/* Nonzero if chip supports the ARMv8 CRC instructions. */ ++extern int arm_arch_crc; ++ + #ifndef TARGET_DEFAULT + #define TARGET_DEFAULT (MASK_APCS_FRAME) + #endif +@@ -630,6 +656,8 @@ + + #define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32) + ++#define MALLOC_ABI_ALIGNMENT BIGGEST_ALIGNMENT ++ + /* XXX Blah -- this macro is used directly by libobjc. Since it + supports no vector modes, cut out the complexity and fall back + on BIGGEST_FIELD_ALIGNMENT. */ +@@ -1040,7 +1068,7 @@ + /* Modes valid for Neon D registers. */ + #define VALID_NEON_DREG_MODE(MODE) \ + ((MODE) == V2SImode || (MODE) == V4HImode || (MODE) == V8QImode \ +- || (MODE) == V2SFmode || (MODE) == DImode) ++ || (MODE) == V4HFmode || (MODE) == V2SFmode || (MODE) == DImode) + + /* Modes valid for Neon Q registers. */ + #define VALID_NEON_QREG_MODE(MODE) \ +@@ -1130,6 +1158,7 @@ + STACK_REG, + BASE_REGS, + HI_REGS, ++ CALLER_SAVE_REGS, + GENERAL_REGS, + CORE_REGS, + VFP_D0_D7_REGS, +@@ -1156,6 +1185,7 @@ + "STACK_REG", \ + "BASE_REGS", \ + "HI_REGS", \ ++ "CALLER_SAVE_REGS", \ + "GENERAL_REGS", \ + "CORE_REGS", \ + "VFP_D0_D7_REGS", \ +@@ -1181,6 +1211,7 @@ + { 0x00002000, 0x00000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \ + { 0x000020FF, 0x00000000, 0x00000000, 0x00000000 }, /* BASE_REGS */ \ + { 0x00005F00, 0x00000000, 0x00000000, 0x00000000 }, /* HI_REGS */ \ ++ { 0x0000100F, 0x00000000, 0x00000000, 0x00000000 }, /* CALLER_SAVE_REGS */ \ + { 0x00005FFF, 0x00000000, 0x00000000, 0x00000000 }, /* GENERAL_REGS */ \ + { 0x00007FFF, 0x00000000, 0x00000000, 0x00000000 }, /* CORE_REGS */ \ + { 0xFFFF0000, 0x00000000, 0x00000000, 0x00000000 }, /* VFP_D0_D7_REGS */ \ +@@ -1643,7 +1674,7 @@ + frame. */ + #define EXIT_IGNORE_STACK 1 + +-#define EPILOGUE_USES(REGNO) ((REGNO) == LR_REGNUM) ++#define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == LR_REGNUM) + + /* Determine if the epilogue should be output as RTL. + You should override this if you define FUNCTION_EXTRA_EPILOGUE. */ +--- a/src/gcc/config/arm/cortex-a8.md ++++ b/src/gcc/config/arm/cortex-a8.md +@@ -85,22 +85,19 @@ + ;; (source read in E2 and destination available at the end of that cycle). + (define_insn_reservation "cortex_a8_alu" 2 + (and (eq_attr "tune" "cortexa8") +- (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm") +- (eq_attr "neon_type" "none")) +- (not (eq_attr "insn" "mov,mvn"))) +- (eq_attr "insn" "clz"))) ++ (ior (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg") ++ (eq_attr "neon_type" "none")) ++ (eq_attr "type" "clz"))) + "cortex_a8_default") + + (define_insn_reservation "cortex_a8_alu_shift" 2 + (and (eq_attr "tune" "cortexa8") +- (and (eq_attr "type" "simple_alu_shift,alu_shift") +- (not (eq_attr "insn" "mov,mvn")))) ++ (eq_attr "type" "extend,arlo_shift")) + "cortex_a8_default") + + (define_insn_reservation "cortex_a8_alu_shift_reg" 2 + (and (eq_attr "tune" "cortexa8") +- (and (eq_attr "type" "alu_shift_reg") +- (not (eq_attr "insn" "mov,mvn")))) ++ (eq_attr "type" "arlo_shift_reg")) + "cortex_a8_default") + + ;; Move instructions. +@@ -107,8 +104,8 @@ + + (define_insn_reservation "cortex_a8_mov" 1 + (and (eq_attr "tune" "cortexa8") +- (and (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg") +- (eq_attr "insn" "mov,mvn"))) ++ (eq_attr "type" "mov_imm,mov_reg,mov_shift,mov_shift_reg,\ ++ mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg")) + "cortex_a8_default") + + ;; Exceptions to the default latencies for data processing instructions. +@@ -139,22 +136,22 @@ + + (define_insn_reservation "cortex_a8_mul" 6 + (and (eq_attr "tune" "cortexa8") +- (eq_attr "insn" "mul,smulxy,smmul")) ++ (eq_attr "type" "mul,smulxy,smmul")) + "cortex_a8_multiply_2") + + (define_insn_reservation "cortex_a8_mla" 6 + (and (eq_attr "tune" "cortexa8") +- (eq_attr "insn" "mla,smlaxy,smlawy,smmla,smlad,smlsd")) ++ (eq_attr "type" "mla,smlaxy,smlawy,smmla,smlad,smlsd")) + "cortex_a8_multiply_2") + + (define_insn_reservation "cortex_a8_mull" 7 + (and (eq_attr "tune" "cortexa8") +- (eq_attr "insn" "smull,umull,smlal,umlal,umaal,smlalxy")) ++ (eq_attr "type" "smull,umull,smlal,umlal,umaal,smlalxy")) + "cortex_a8_multiply_3") + + (define_insn_reservation "cortex_a8_smulwy" 5 + (and (eq_attr "tune" "cortexa8") +- (eq_attr "insn" "smulwy,smuad,smusd")) ++ (eq_attr "type" "smulwy,smuad,smusd")) + "cortex_a8_multiply") + + ;; smlald and smlsld are multiply-accumulate instructions but do not +@@ -162,7 +159,7 @@ + ;; cannot go in cortex_a8_mla above. (See below for bypass details.) + (define_insn_reservation "cortex_a8_smlald" 6 + (and (eq_attr "tune" "cortexa8") +- (eq_attr "insn" "smlald,smlsld")) ++ (eq_attr "type" "smlald,smlsld")) + "cortex_a8_multiply_2") + + ;; A multiply with a single-register result or an MLA, followed by an +--- a/src/gcc/config/arm/arm-fixed.md ++++ b/src/gcc/config/arm/arm-fixed.md +@@ -19,12 +19,13 @@ + ;; This file contains ARM instructions that support fixed-point operations. + + (define_insn "add3" +- [(set (match_operand:FIXED 0 "s_register_operand" "=r") +- (plus:FIXED (match_operand:FIXED 1 "s_register_operand" "r") +- (match_operand:FIXED 2 "s_register_operand" "r")))] ++ [(set (match_operand:FIXED 0 "s_register_operand" "=l,r") ++ (plus:FIXED (match_operand:FIXED 1 "s_register_operand" "l,r") ++ (match_operand:FIXED 2 "s_register_operand" "l,r")))] + "TARGET_32BIT" + "add%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no")]) + + (define_insn "add3" + [(set (match_operand:ADDSUB 0 "s_register_operand" "=r") +@@ -32,7 +33,8 @@ + (match_operand:ADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "sadd%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "usadd3" + [(set (match_operand:UQADDSUB 0 "s_register_operand" "=r") +@@ -40,7 +42,8 @@ + (match_operand:UQADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "uqadd%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "ssadd3" + [(set (match_operand:QADDSUB 0 "s_register_operand" "=r") +@@ -48,15 +51,17 @@ + (match_operand:QADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "qadd%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "sub3" +- [(set (match_operand:FIXED 0 "s_register_operand" "=r") +- (minus:FIXED (match_operand:FIXED 1 "s_register_operand" "r") +- (match_operand:FIXED 2 "s_register_operand" "r")))] ++ [(set (match_operand:FIXED 0 "s_register_operand" "=l,r") ++ (minus:FIXED (match_operand:FIXED 1 "s_register_operand" "l,r") ++ (match_operand:FIXED 2 "s_register_operand" "l,r")))] + "TARGET_32BIT" + "sub%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no")]) + + (define_insn "sub3" + [(set (match_operand:ADDSUB 0 "s_register_operand" "=r") +@@ -64,7 +69,8 @@ + (match_operand:ADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "ssub%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "ussub3" + [(set (match_operand:UQADDSUB 0 "s_register_operand" "=r") +@@ -73,7 +79,8 @@ + (match_operand:UQADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "uqsub%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "sssub3" + [(set (match_operand:QADDSUB 0 "s_register_operand" "=r") +@@ -81,7 +88,8 @@ + (match_operand:QADDSUB 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "qsub%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + ;; Fractional multiplies. + +@@ -96,7 +104,7 @@ + rtx tmp1 = gen_reg_rtx (HImode); + rtx tmp2 = gen_reg_rtx (HImode); + rtx tmp3 = gen_reg_rtx (SImode); +- ++ + emit_insn (gen_extendqihi2 (tmp1, gen_lowpart (QImode, operands[1]))); + emit_insn (gen_extendqihi2 (tmp2, gen_lowpart (QImode, operands[2]))); + emit_insn (gen_mulhisi3 (tmp3, tmp1, tmp2)); +@@ -132,7 +140,7 @@ + rtx tmp1 = gen_reg_rtx (DImode); + rtx tmp2 = gen_reg_rtx (SImode); + rtx tmp3 = gen_reg_rtx (SImode); +- ++ + /* s.31 * s.31 -> s.62 multiplication. */ + emit_insn (gen_mulsidi3 (tmp1, gen_lowpart (SImode, operands[1]), + gen_lowpart (SImode, operands[2]))); +@@ -154,7 +162,7 @@ + rtx tmp1 = gen_reg_rtx (DImode); + rtx tmp2 = gen_reg_rtx (SImode); + rtx tmp3 = gen_reg_rtx (SImode); +- ++ + emit_insn (gen_mulsidi3 (tmp1, gen_lowpart (SImode, operands[1]), + gen_lowpart (SImode, operands[2]))); + emit_insn (gen_lshrsi3 (tmp2, gen_lowpart (SImode, tmp1), GEN_INT (15))); +@@ -173,13 +181,13 @@ + rtx tmp1 = gen_reg_rtx (DImode); + rtx tmp2 = gen_reg_rtx (SImode); + rtx tmp3 = gen_reg_rtx (SImode); +- ++ + emit_insn (gen_umulsidi3 (tmp1, gen_lowpart (SImode, operands[1]), + gen_lowpart (SImode, operands[2]))); + emit_insn (gen_lshrsi3 (tmp2, gen_lowpart (SImode, tmp1), GEN_INT (16))); + emit_insn (gen_ashlsi3 (tmp3, gen_highpart (SImode, tmp1), GEN_INT (16))); + emit_insn (gen_iorsi3 (gen_lowpart (SImode, operands[0]), tmp2, tmp3)); +- ++ + DONE; + }) + +@@ -209,7 +217,7 @@ + } + + /* We have: +- 31 high word 0 31 low word 0 ++ 31 high word 0 31 low word 0 + + [ S i i .... i i i ] [ i f f f ... f f ] + | +@@ -221,9 +229,18 @@ + output_asm_insn ("ssat\\t%R3, #15, %R3", operands); + output_asm_insn ("mrs\\t%4, APSR", operands); + output_asm_insn ("tst\\t%4, #1<<27", operands); +- if (TARGET_THUMB2) +- output_asm_insn ("it\\tne", operands); +- output_asm_insn ("mvnne\\t%Q3, %R3, asr #32", operands); ++ if (arm_restrict_it) ++ { ++ output_asm_insn ("mvn\\t%4, %R3, asr #32", operands); ++ output_asm_insn ("it\\tne", operands); ++ output_asm_insn ("movne\\t%Q3, %4", operands); ++ } ++ else ++ { ++ if (TARGET_THUMB2) ++ output_asm_insn ("it\\tne", operands); ++ output_asm_insn ("mvnne\\t%Q3, %R3, asr #32", operands); ++ } + output_asm_insn ("mov\\t%0, %Q3, lsr #15", operands); + output_asm_insn ("orr\\t%0, %0, %R3, asl #17", operands); + return ""; +@@ -231,7 +248,9 @@ + [(set_attr "conds" "clob") + (set (attr "length") + (if_then_else (eq_attr "is_thumb" "yes") +- (const_int 38) ++ (if_then_else (match_test "arm_restrict_it") ++ (const_int 40) ++ (const_int 38)) + (const_int 32)))]) + + ;; Same goes for this. +@@ -257,7 +276,7 @@ + } + + /* We have: +- 31 high word 0 31 low word 0 ++ 31 high word 0 31 low word 0 + + [ i i i .... i i i ] [ f f f f ... f f ] + | +@@ -269,9 +288,18 @@ + output_asm_insn ("usat\\t%R3, #16, %R3", operands); + output_asm_insn ("mrs\\t%4, APSR", operands); + output_asm_insn ("tst\\t%4, #1<<27", operands); +- if (TARGET_THUMB2) +- output_asm_insn ("it\\tne", operands); +- output_asm_insn ("sbfxne\\t%Q3, %R3, #15, #1", operands); ++ if (arm_restrict_it) ++ { ++ output_asm_insn ("sbfx\\t%4, %R3, #15, #1", operands); ++ output_asm_insn ("it\\tne", operands); ++ output_asm_insn ("movne\\t%Q3, %4", operands); ++ } ++ else ++ { ++ if (TARGET_THUMB2) ++ output_asm_insn ("it\\tne", operands); ++ output_asm_insn ("sbfxne\\t%Q3, %R3, #15, #1", operands); ++ } + output_asm_insn ("lsr\\t%0, %Q3, #16", operands); + output_asm_insn ("orr\\t%0, %0, %R3, asl #16", operands); + return ""; +@@ -279,7 +307,9 @@ + [(set_attr "conds" "clob") + (set (attr "length") + (if_then_else (eq_attr "is_thumb" "yes") +- (const_int 38) ++ (if_then_else (match_test "arm_restrict_it") ++ (const_int 40) ++ (const_int 38)) + (const_int 32)))]) + + (define_expand "mulha3" +@@ -289,7 +319,7 @@ + "TARGET_DSP_MULTIPLY && arm_arch_thumb2" + { + rtx tmp = gen_reg_rtx (SImode); +- ++ + emit_insn (gen_mulhisi3 (tmp, gen_lowpart (HImode, operands[1]), + gen_lowpart (HImode, operands[2]))); + emit_insn (gen_extv (gen_lowpart (SImode, operands[0]), tmp, GEN_INT (16), +@@ -307,7 +337,7 @@ + rtx tmp1 = gen_reg_rtx (SImode); + rtx tmp2 = gen_reg_rtx (SImode); + rtx tmp3 = gen_reg_rtx (SImode); +- ++ + /* 8.8 * 8.8 -> 16.16 multiply. */ + emit_insn (gen_zero_extendhisi2 (tmp1, gen_lowpart (HImode, operands[1]))); + emit_insn (gen_zero_extendhisi2 (tmp2, gen_lowpart (HImode, operands[2]))); +@@ -326,7 +356,7 @@ + { + rtx tmp = gen_reg_rtx (SImode); + rtx rshift; +- ++ + emit_insn (gen_mulhisi3 (tmp, gen_lowpart (HImode, operands[1]), + gen_lowpart (HImode, operands[2]))); + +@@ -348,12 +378,12 @@ + rtx tmp2 = gen_reg_rtx (SImode); + rtx tmp3 = gen_reg_rtx (SImode); + rtx rshift_tmp = gen_reg_rtx (SImode); +- ++ + /* Note: there's no smul[bt][bt] equivalent for unsigned multiplies. Use a + normal 32x32->32-bit multiply instead. */ + emit_insn (gen_zero_extendhisi2 (tmp1, gen_lowpart (HImode, operands[1]))); + emit_insn (gen_zero_extendhisi2 (tmp2, gen_lowpart (HImode, operands[2]))); +- ++ + emit_insn (gen_mulsi3 (tmp3, tmp1, tmp2)); + + /* The operand to "usat" is signed, so we cannot use the "..., asr #8" +@@ -374,9 +404,9 @@ + "TARGET_32BIT && arm_arch6" + "ssat%?\\t%0, #16, %2%S1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "sat") ++ (set_attr "predicable_short_it" "no") + (set_attr "shift" "1") +- (set_attr "type" "alu_shift")]) ++ (set_attr "type" "arlo_shift")]) + + (define_insn "arm_usatsihi" + [(set (match_operand:HI 0 "s_register_operand" "=r") +@@ -384,4 +414,5 @@ + "TARGET_INT_SIMD" + "usat%?\\t%0, #16, %1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "sat")]) ++ (set_attr "predicable_short_it" "no")] ++) +--- a/src/gcc/config/arm/crypto.def ++++ b/src/gcc/config/arm/crypto.def +@@ -0,0 +1,34 @@ ++/* Cryptographic instruction builtin definitions. ++ Copyright (C) 2013-2014 Free Software Foundation, Inc. ++ Contributed by ARM Ltd. ++ This file is part of GCC. ++ ++ GCC is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published ++ by the Free Software Foundation; either version 3, or (at your ++ option) any later version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++ License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . */ ++ ++CRYPTO2 (aesd, AESD, v16uqi, v16uqi, v16uqi) ++CRYPTO2 (aese, AESE, v16uqi, v16uqi, v16uqi) ++CRYPTO1 (aesimc, AESIMC, v16uqi, v16uqi) ++CRYPTO1 (aesmc, AESMC, v16uqi, v16uqi) ++CRYPTO1 (sha1h, SHA1H, v4usi, v4usi) ++CRYPTO2 (sha1su1, SHA1SU1, v4usi, v4usi, v4usi) ++CRYPTO2 (sha256su0, SHA256SU0, v4usi, v4usi, v4usi) ++CRYPTO3 (sha1c, SHA1C, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha1m, SHA1M, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha1p, SHA1P, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha1su0, SHA1SU0, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha256h, SHA256H, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha256h2, SHA256H2, v4usi, v4usi, v4usi, v4usi) ++CRYPTO3 (sha256su1, SHA256SU1, v4usi, v4usi, v4usi, v4usi) ++CRYPTO2 (vmullp64, VMULLP64, uti, udi, udi) +--- a/src/gcc/config/arm/unspecs.md ++++ b/src/gcc/config/arm/unspecs.md +@@ -139,6 +139,10 @@ + VUNSPEC_ATOMIC_OP ; Represent an atomic operation. + VUNSPEC_LL ; Represent a load-register-exclusive. + VUNSPEC_SC ; Represent a store-register-exclusive. ++ VUNSPEC_LAX ; Represent a load-register-acquire-exclusive. ++ VUNSPEC_SLX ; Represent a store-register-release-exclusive. ++ VUNSPEC_LDA ; Represent a store-register-acquire. ++ VUNSPEC_STL ; Represent a store-register-release. + ]) + + ;; Enumerators for NEON unspecs. +@@ -145,6 +149,27 @@ + (define_c_enum "unspec" [ + UNSPEC_ASHIFT_SIGNED + UNSPEC_ASHIFT_UNSIGNED ++ UNSPEC_CRC32B ++ UNSPEC_CRC32H ++ UNSPEC_CRC32W ++ UNSPEC_CRC32CB ++ UNSPEC_CRC32CH ++ UNSPEC_CRC32CW ++ UNSPEC_AESD ++ UNSPEC_AESE ++ UNSPEC_AESIMC ++ UNSPEC_AESMC ++ UNSPEC_SHA1C ++ UNSPEC_SHA1M ++ UNSPEC_SHA1P ++ UNSPEC_SHA1H ++ UNSPEC_SHA1SU0 ++ UNSPEC_SHA1SU1 ++ UNSPEC_SHA256H ++ UNSPEC_SHA256H2 ++ UNSPEC_SHA256SU0 ++ UNSPEC_SHA256SU1 ++ UNSPEC_VMULLP64 + UNSPEC_LOAD_COUNT + UNSPEC_VABD + UNSPEC_VABDL +--- a/src/gcc/config/arm/cortex-m4.md ++++ b/src/gcc/config/arm/cortex-m4.md +@@ -31,7 +31,12 @@ + ;; ALU and multiply is one cycle. + (define_insn_reservation "cortex_m4_alu" 1 + (and (eq_attr "tune" "cortexm4") +- (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg,mult")) ++ (ior (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,extend,\ ++ arlo_shift,arlo_shift_reg,\ ++ mov_imm,mov_reg,mov_shift,mov_shift_reg,\ ++ mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg") ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes")))) + "cortex_m4_ex") + + ;; Byte, half-word and word load is two cycles. +--- a/src/gcc/config/arm/linux-eabi.h ++++ b/src/gcc/config/arm/linux-eabi.h +@@ -84,10 +84,14 @@ + LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \ + LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC) + ++#undef ASAN_CC1_SPEC ++#define ASAN_CC1_SPEC "%{fsanitize=*:-funwind-tables}" ++ + #undef CC1_SPEC + #define CC1_SPEC \ +- LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \ +- GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC) ++ LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC, \ ++ GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " \ ++ ANDROID_CC1_SPEC) + + #define CC1PLUS_SPEC \ + LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC) +@@ -95,7 +99,7 @@ + #undef LIB_SPEC + #define LIB_SPEC \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \ +- GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC) ++ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC) + + #undef STARTFILE_SPEC + #define STARTFILE_SPEC \ +--- a/src/gcc/config/arm/arm-cores.def ++++ b/src/gcc/config/arm/arm-cores.def +@@ -129,9 +129,11 @@ + ARM_CORE("cortex-a8", cortexa8, 7A, FL_LDSCHED, cortex) + ARM_CORE("cortex-a9", cortexa9, 7A, FL_LDSCHED, cortex_a9) + ARM_CORE("cortex-a15", cortexa15, 7A, FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a15) ++ARM_CORE("cortex-a53", cortexa53, 8A, FL_LDSCHED, cortex_a5) + ARM_CORE("cortex-r4", cortexr4, 7R, FL_LDSCHED, cortex) + ARM_CORE("cortex-r4f", cortexr4f, 7R, FL_LDSCHED, cortex) + ARM_CORE("cortex-r5", cortexr5, 7R, FL_LDSCHED | FL_ARM_DIV, cortex) ++ARM_CORE("cortex-r7", cortexr7, 7R, FL_LDSCHED | FL_ARM_DIV, cortex) + ARM_CORE("cortex-m4", cortexm4, 7EM, FL_LDSCHED, cortex) + ARM_CORE("cortex-m3", cortexm3, 7M, FL_LDSCHED, cortex) + ARM_CORE("cortex-m1", cortexm1, 6M, FL_LDSCHED, v6m) +--- a/src/gcc/config/arm/cortex-r4.md ++++ b/src/gcc/config/arm/cortex-r4.md +@@ -78,24 +78,22 @@ + ;; for the purposes of the dual-issue constraints above. + (define_insn_reservation "cortex_r4_alu" 2 + (and (eq_attr "tune_cortexr4" "yes") +- (and (eq_attr "type" "alu_reg,simple_alu_imm") +- (not (eq_attr "insn" "mov")))) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,mvn_imm,mvn_reg")) + "cortex_r4_alu") + + (define_insn_reservation "cortex_r4_mov" 2 + (and (eq_attr "tune_cortexr4" "yes") +- (and (eq_attr "type" "alu_reg,simple_alu_imm") +- (eq_attr "insn" "mov"))) ++ (eq_attr "type" "mov_imm,mov_reg")) + "cortex_r4_mov") + + (define_insn_reservation "cortex_r4_alu_shift" 2 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "type" "simple_alu_shift,alu_shift")) ++ (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift")) + "cortex_r4_alu") + + (define_insn_reservation "cortex_r4_alu_shift_reg" 2 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "type" "alu_shift_reg")) ++ (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")) + "cortex_r4_alu_shift_reg") + + ;; An ALU instruction followed by an ALU instruction with no early dep. +@@ -128,32 +126,32 @@ + + (define_insn_reservation "cortex_r4_mul_4" 4 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "mul,smmul")) ++ (eq_attr "type" "mul,smmul")) + "cortex_r4_mul_2") + + (define_insn_reservation "cortex_r4_mul_3" 3 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "smulxy,smulwy,smuad,smusd")) ++ (eq_attr "type" "smulxy,smulwy,smuad,smusd")) + "cortex_r4_mul") + + (define_insn_reservation "cortex_r4_mla_4" 4 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "mla,smmla")) ++ (eq_attr "type" "mla,smmla")) + "cortex_r4_mul_2") + + (define_insn_reservation "cortex_r4_mla_3" 3 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "smlaxy,smlawy,smlad,smlsd")) ++ (eq_attr "type" "smlaxy,smlawy,smlad,smlsd")) + "cortex_r4_mul") + + (define_insn_reservation "cortex_r4_smlald" 3 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "smlald,smlsld")) ++ (eq_attr "type" "smlald,smlsld")) + "cortex_r4_mul") + + (define_insn_reservation "cortex_r4_mull" 4 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "smull,umull,umlal,umaal")) ++ (eq_attr "type" "smull,umull,umlal,umaal")) + "cortex_r4_mul_2") + + ;; A multiply or an MLA with a single-register result, followed by an +@@ -196,12 +194,12 @@ + ;; This gives a latency of nine for udiv and ten for sdiv. + (define_insn_reservation "cortex_r4_udiv" 9 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "udiv")) ++ (eq_attr "type" "udiv")) + "cortex_r4_div_9") + + (define_insn_reservation "cortex_r4_sdiv" 10 + (and (eq_attr "tune_cortexr4" "yes") +- (eq_attr "insn" "sdiv")) ++ (eq_attr "type" "sdiv")) + "cortex_r4_div_10") + + ;; Branches. We assume correct prediction. +--- a/src/gcc/config/arm/arm-tune.md ++++ b/src/gcc/config/arm/arm-tune.md +@@ -1,5 +1,5 @@ + ;; -*- buffer-read-only: t -*- + ;; Generated automatically by gentune.sh from arm-cores.def + (define_attr "tune" +- "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,fa526,fa626,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,arm1156t2fs,genericv7a,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexr4,cortexr4f,cortexr5,cortexm4,cortexm3,cortexm1,cortexm0,cortexm0plus,marvell_pj4" ++ "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,fa526,fa626,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,arm1156t2fs,genericv7a,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexa53,cortexr4,cortexr4f,cortexr5,cortexr7,cortexm4,cortexm3,cortexm1,cortexm0,cortexm0plus,marvell_pj4" + (const (symbol_ref "((enum attr_tune) arm_tune)"))) +--- a/src/gcc/config/arm/arm_acle.h ++++ b/src/gcc/config/arm/arm_acle.h +@@ -0,0 +1,100 @@ ++/* ARM Non-NEON ACLE intrinsics include file. ++ ++ Copyright (C) 2013-2014 Free Software Foundation, Inc. ++ Contributed by ARM Ltd. ++ ++ This file is part of GCC. ++ ++ GCC is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published ++ by the Free Software Foundation; either version 3, or (at your ++ option) any later version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++ License for more details. ++ ++ Under Section 7 of GPL version 3, you are granted additional ++ permissions described in the GCC Runtime Library Exception, version ++ 3.1, as published by the Free Software Foundation. ++ ++ You should have received a copy of the GNU General Public License and ++ a copy of the GCC Runtime Library Exception along with this program; ++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ++ . */ ++ ++#ifndef _GCC_ARM_ACLE_H ++#define _GCC_ARM_ACLE_H ++ ++#include ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef __ARM_FEATURE_CRC32 ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32b (uint32_t __a, uint8_t __b) ++{ ++ return __builtin_arm_crc32b (__a, __b); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32h (uint32_t __a, uint16_t __b) ++{ ++ return __builtin_arm_crc32h (__a, __b); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32w (uint32_t __a, uint32_t __b) ++{ ++ return __builtin_arm_crc32w (__a, __b); ++} ++ ++#ifdef __ARM_32BIT_STATE ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32d (uint32_t __a, uint64_t __b) ++{ ++ uint32_t __d; ++ ++ __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32); ++ return __d; ++} ++#endif ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32cb (uint32_t __a, uint8_t __b) ++{ ++ return __builtin_arm_crc32cb (__a, __b); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32ch (uint32_t __a, uint16_t __b) ++{ ++ return __builtin_arm_crc32ch (__a, __b); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32cw (uint32_t __a, uint32_t __b) ++{ ++ return __builtin_arm_crc32cw (__a, __b); ++} ++ ++#ifdef __ARM_32BIT_STATE ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++__crc32cd (uint32_t __a, uint64_t __b) ++{ ++ uint32_t __d; ++ ++ __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32); ++ return __d; ++} ++#endif ++ ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- a/src/gcc/config/arm/arm-protos.h ++++ b/src/gcc/config/arm/arm-protos.h +@@ -24,12 +24,13 @@ + + extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *); + extern int use_return_insn (int, rtx); ++extern bool use_simple_return_p (void); + extern enum reg_class arm_regno_class (int); + extern void arm_load_pic_register (unsigned long); + extern int arm_volatile_func (void); + extern void arm_expand_prologue (void); + extern void arm_expand_epilogue (bool); +-extern void thumb2_expand_return (void); ++extern void thumb2_expand_return (bool); + extern const char *arm_strip_name_encoding (const char *); + extern void arm_asm_output_labelref (FILE *, const char *); + extern void thumb2_asm_output_opcode (FILE *); +@@ -78,6 +79,7 @@ + extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode, + rtx (*) (rtx, rtx, rtx)); + extern rtx neon_make_constant (rtx); ++extern tree arm_builtin_vectorized_function (tree, tree, tree); + extern void neon_expand_vector_init (rtx, rtx); + extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT); + extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT); +@@ -117,7 +119,9 @@ + extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *); + extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT); + extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool); ++extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool); + extern int arm_gen_movmemqi (rtx *); ++extern bool gen_movmem_ldrd_strd (rtx *); + extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx); + extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx, + HOST_WIDE_INT); +@@ -224,6 +228,8 @@ + + extern void arm_order_regs_for_local_alloc (void); + ++extern int arm_max_conditional_execute (); ++ + /* Vectorizer cost model implementation. */ + struct cpu_vec_costs { + const int scalar_stmt_cost; /* Cost of any scalar operation, excluding +@@ -253,8 +259,7 @@ + bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool); + bool (*sched_adjust_cost) (rtx, rtx, rtx, int *); + int constant_limit; +- /* Maximum number of instructions to conditionalise in +- arm_final_prescan_insn. */ ++ /* Maximum number of instructions to conditionalise. */ + int max_insns_skipped; + int num_prefetch_slots; + int l1_cache_size; +@@ -269,6 +274,8 @@ + bool logical_op_non_short_circuit[2]; + /* Vectorizer costs. */ + const struct cpu_vec_costs* vec_costs; ++ /* Prefer Neon for 64-bit bitops. */ ++ bool prefer_neon_for_64bits; + }; + + extern const struct tune_params *current_tune; +--- a/src/gcc/config/arm/vfp.md ++++ b/src/gcc/config/arm/vfp.md +@@ -18,31 +18,6 @@ + ;; along with GCC; see the file COPYING3. If not see + ;; . */ + +-;; The VFP "type" attributes differ from those used in the FPA model. +-;; fcpys Single precision cpy. +-;; ffariths Single precision abs, neg. +-;; ffarithd Double precision abs, neg, cpy. +-;; fadds Single precision add/sub. +-;; faddd Double precision add/sub. +-;; fconsts Single precision load immediate. +-;; fconstd Double precision load immediate. +-;; fcmps Single precision comparison. +-;; fcmpd Double precision comparison. +-;; fmuls Single precision multiply. +-;; fmuld Double precision multiply. +-;; fmacs Single precision multiply-accumulate. +-;; fmacd Double precision multiply-accumulate. +-;; ffmas Single precision fused multiply-accumulate. +-;; ffmad Double precision fused multiply-accumulate. +-;; fdivs Single precision sqrt or division. +-;; fdivd Double precision sqrt or division. +-;; f_flag fmstat operation +-;; f_load[sd] Floating point load from memory. +-;; f_store[sd] Floating point store to memory. +-;; f_2_r Transfer vfp to arm reg. +-;; r_2_f Transfer arm to vfp reg. +-;; f_cvt Convert floating<->integral +- + ;; SImode moves + ;; ??? For now do not allow loading constants into vfp regs. This causes + ;; problems because small constants get converted into adds. +@@ -78,9 +53,8 @@ + } + " + [(set_attr "predicable" "yes") +- (set_attr "type" "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") ++ (set_attr "type" "mov_reg,mov_reg,mvn_imm,mov_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") + (set_attr "neon_type" "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") +- (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*") + (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*") + (set_attr "neg_pool_range" "*,*,*,*,4084,*,*,*,*,1008,*")] + ) +@@ -87,9 +61,12 @@ + + ;; See thumb2.md:thumb2_movsi_insn for an explanation of the split + ;; high/low register alternatives for loads and stores here. ++;; The l/Py alternative should come after r/I to ensure that the short variant ++;; is chosen with length 2 when the instruction is predicated for ++;; arm_restrict_it. + (define_insn "*thumb2_movsi_vfp" +- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r, l,*hk,m, *m,*t, r,*t,*t, *Uv") +- (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,*mi,l,*hk, r,*t,*t,*Uvi,*t"))] ++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,l,r,r, l,*hk,m, *m,*t, r,*t,*t, *Uv") ++ (match_operand:SI 1 "general_operand" "rk,I,Py,K,j,mi,*mi,l,*hk, r,*t,*t,*Uvi,*t"))] + "TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT + && ( s_register_operand (operands[0], SImode) + || s_register_operand (operands[1], SImode))" +@@ -96,25 +73,27 @@ + "* + switch (which_alternative) + { +- case 0: case 1: ++ case 0: ++ case 1: ++ case 2: + return \"mov%?\\t%0, %1\"; +- case 2: ++ case 3: + return \"mvn%?\\t%0, #%B1\"; +- case 3: ++ case 4: + return \"movw%?\\t%0, %1\"; +- case 4: + case 5: ++ case 6: + return \"ldr%?\\t%0, %1\"; +- case 6: + case 7: ++ case 8: + return \"str%?\\t%1, %0\"; +- case 8: ++ case 9: + return \"fmsr%?\\t%0, %1\\t%@ int\"; +- case 9: ++ case 10: + return \"fmrs%?\\t%0, %1\\t%@ int\"; +- case 10: ++ case 11: + return \"fcpys%?\\t%0, %1\\t%@ int\"; +- case 11: case 12: ++ case 12: case 13: + return output_move_vfp (operands); + default: + gcc_unreachable (); +@@ -121,11 +100,12 @@ + } + " + [(set_attr "predicable" "yes") +- (set_attr "type" "*,*,*,*,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") +- (set_attr "neon_type" "*,*,*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") +- (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*,*,*") +- (set_attr "pool_range" "*,*,*,*,1018,4094,*,*,*,*,*,1018,*") +- (set_attr "neg_pool_range" "*,*,*,*, 0, 0,*,*,*,*,*,1008,*")] ++ (set_attr "predicable_short_it" "yes,no,yes,no,no,no,no,no,no,no,no,no,no,no") ++ (set_attr "type" "mov_reg,mov_reg,mov_reg,mvn_reg,mov_reg,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores") ++ (set_attr "length" "2,4,2,4,4,4,4,4,4,4,4,4,4,4") ++ (set_attr "neon_type" "*,*,*,*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*") ++ (set_attr "pool_range" "*,*,*,*,*,1018,4094,*,*,*,*,*,1018,*") ++ (set_attr "neg_pool_range" "*,*,*,*,*, 0, 0,*,*,*,*,*,1008,*")] + ) + + +@@ -132,8 +112,8 @@ + ;; DImode moves + + (define_insn "*movdi_vfp" +- [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,r,r,m,w,r,w,w, Uv") +- (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,r,r,w,w,Uvi,w"))] ++ [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,r,w,w, Uv") ++ (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))] + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune != cortexa8 + && ( register_operand (operands[0], DImode) + || register_operand (operands[1], DImode)) +@@ -375,9 +355,8 @@ + " + [(set_attr "predicable" "yes") + (set_attr "type" +- "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*") ++ "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,mov_reg") + (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*") +- (set_attr "insn" "*,*,*,*,*,*,*,*,mov") + (set_attr "pool_range" "*,*,*,1020,*,4096,*,*,*") + (set_attr "neg_pool_range" "*,*,*,1008,*,4080,*,*,*")] + ) +@@ -412,15 +391,14 @@ + } + " + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" +- "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*") ++ "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,mov_reg") + (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*") +- (set_attr "insn" "*,*,*,*,*,*,*,*,mov") + (set_attr "pool_range" "*,*,*,1018,*,4090,*,*,*") + (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")] + ) + +- + ;; DFmode moves + + (define_insn "*movdf_vfp" +@@ -550,7 +528,7 @@ + [(match_operand 4 "cc_register" "") (const_int 0)]) + (match_operand:SF 1 "s_register_operand" "0,t,t,0,?r,?r,0,t,t") + (match_operand:SF 2 "s_register_operand" "t,0,t,?r,0,?r,t,0,t")))] +- "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP" ++ "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP && !arm_restrict_it" + "@ + it\\t%D3\;fcpys%D3\\t%0, %2 + it\\t%d3\;fcpys%d3\\t%0, %1 +@@ -598,7 +576,7 @@ + [(match_operand 4 "cc_register" "") (const_int 0)]) + (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w") + (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))] +- "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" ++ "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE && !arm_restrict_it" + "@ + it\\t%D3\;fcpyd%D3\\t%P0, %P2 + it\\t%d3\;fcpyd%d3\\t%P0, %P1 +@@ -624,6 +602,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fabss%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffariths")] + ) + +@@ -633,6 +612,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fabsd%?\\t%P0, %P1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffarithd")] + ) + +@@ -644,6 +624,7 @@ + fnegs%?\\t%0, %1 + eor%?\\t%0, %1, #-2147483648" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffariths")] + ) + +@@ -689,6 +670,7 @@ + } + " + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "length" "4,4,8") + (set_attr "type" "ffarithd")] + ) +@@ -703,6 +685,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fadds%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fadds")] + ) + +@@ -713,6 +696,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "faddd%?\\t%P0, %P1, %P2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "faddd")] + ) + +@@ -724,6 +708,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fsubs%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fadds")] + ) + +@@ -734,6 +719,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fsubd%?\\t%P0, %P1, %P2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "faddd")] + ) + +@@ -747,6 +733,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fdivs%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fdivs")] + ) + +@@ -757,6 +744,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fdivd%?\\t%P0, %P1, %P2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fdivd")] + ) + +@@ -770,6 +758,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fmuls%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmuls")] + ) + +@@ -780,6 +769,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fmuld%?\\t%P0, %P1, %P2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmuld")] + ) + +@@ -790,6 +780,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fnmuls%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmuls")] + ) + +@@ -800,6 +791,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fnmuld%?\\t%P0, %P1, %P2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmuld")] + ) + +@@ -815,6 +807,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fmacs%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacs")] + ) + +@@ -826,6 +819,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fmacd%?\\t%P0, %P2, %P3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacd")] + ) + +@@ -838,6 +832,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fmscs%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacs")] + ) + +@@ -849,6 +844,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fmscd%?\\t%P0, %P2, %P3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacd")] + ) + +@@ -861,6 +857,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fnmacs%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacs")] + ) + +@@ -872,6 +869,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fnmacd%?\\t%P0, %P2, %P3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacd")] + ) + +@@ -886,6 +884,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fnmscs%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacs")] + ) + +@@ -898,6 +897,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fnmscd%?\\t%P0, %P2, %P3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fmacd")] + ) + +@@ -911,6 +911,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" + "vfma%?.\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffma")] + ) + +@@ -923,6 +924,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" + "vfms%?.\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffma")] + ) + +@@ -934,6 +936,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" + "vfnms%?.\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffma")] + ) + +@@ -946,6 +949,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" + "vfnma%?.\\t%0, %1, %2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "ffma")] + ) + +@@ -958,6 +962,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fcvtds%?\\t%P0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -967,6 +972,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fcvtsd%?\\t%0, %P1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -976,6 +982,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16" + "vcvtb%?.f32.f16\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -985,6 +992,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16" + "vcvtb%?.f16.f32\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -994,6 +1002,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "ftosizs%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1003,6 +1012,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "ftosizd%?\\t%0, %P1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1013,6 +1023,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "ftouizs%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1022,6 +1033,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "ftouizd%?\\t%0, %P1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1032,6 +1044,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fsitos%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1041,6 +1054,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fsitod%?\\t%P0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1051,6 +1065,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fuitos%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1060,6 +1075,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fuitod%?\\t%P0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] + ) + +@@ -1072,6 +1088,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" + "fsqrts%?\\t%0, %1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fdivs")] + ) + +@@ -1081,6 +1098,7 @@ + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" + "fsqrtd%?\\t%P0, %P1" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fdivd")] + ) + +@@ -1168,6 +1186,7 @@ + fcmps%?\\t%0, %1 + fcmpzs%?\\t%0" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fcmps")] + ) + +@@ -1180,6 +1199,7 @@ + fcmpes%?\\t%0, %1 + fcmpezs%?\\t%0" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fcmps")] + ) + +@@ -1192,6 +1212,7 @@ + fcmpd%?\\t%P0, %P1 + fcmpzd%?\\t%P0" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fcmpd")] + ) + +@@ -1204,6 +1225,7 @@ + fcmped%?\\t%P0, %P1 + fcmpezd%?\\t%P0" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "type" "fcmpd")] + ) + +@@ -1264,6 +1286,7 @@ + "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 " + "vrint%?.\\t%0, %1" + [(set_attr "predicable" "") ++ (set_attr "predicable_short_it" "no") + (set_attr "conds" "") + (set_attr "type" "f_rint")] + ) +--- a/src/gcc/config/arm/t-linux-eabi ++++ b/src/gcc/config/arm/t-linux-eabi +@@ -18,6 +18,8 @@ + + # We do not build a Thumb multilib for Linux because the definition of + # CLEAR_INSN_CACHE in linux-gas.h does not work in Thumb mode. ++# If you set MULTILIB_OPTIONS to a non-empty value you should also set ++# MULTILIB_DEFAULTS in linux-elf.h. + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + +--- a/src/gcc/config/arm/neon.md ++++ b/src/gcc/config/arm/neon.md +@@ -61,8 +61,7 @@ + } + } + [(set_attr "neon_type" "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*") +- (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2") +- (set_attr "insn" "*,*,*,*,*,*,mov,*,*") ++ (set_attr "type" "*,f_stored,*,f_loadd,*,*,mov_reg,load2,store2") + (set_attr "length" "4,4,4,4,4,4,8,8,8") + (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*") + (set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*") +@@ -107,8 +106,7 @@ + } + [(set_attr "neon_type" "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\ + neon_mrrc,neon_mcr_2_mcrr,*,*,*") +- (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4") +- (set_attr "insn" "*,*,*,*,*,*,mov,*,*") ++ (set_attr "type" "*,*,*,*,*,*,mov_reg,load4,store4") + (set_attr "length" "4,8,4,8,8,8,16,8,16") + (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*") + (set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*") +@@ -487,7 +485,7 @@ + [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1,*,*,*") + (set_attr "conds" "*,clob,clob,*,clob,clob,clob") + (set_attr "length" "*,8,8,*,8,8,8") +- (set_attr "arch" "nota8,*,*,onlya8,*,*,*")] ++ (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits,*,*,*")] + ) + + (define_insn "*sub3_neon" +@@ -524,7 +522,7 @@ + [(set_attr "neon_type" "neon_int_2,*,*,*,neon_int_2") + (set_attr "conds" "*,clob,clob,clob,*") + (set_attr "length" "*,8,8,8,*") +- (set_attr "arch" "nota8,*,*,*,onlya8")] ++ (set_attr "arch" "neon_for_64bits,*,*,*,avoid_neon_for_64bits")] + ) + + (define_insn "*mul3_neon" +@@ -679,29 +677,6 @@ + [(set_attr "neon_type" "neon_int_1")] + ) + +-(define_insn "iordi3_neon" +- [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r,?w,?w") +- (ior:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r,w,0") +- (match_operand:DI 2 "neon_logic_op2" "w,Dl,r,r,w,Dl")))] +- "TARGET_NEON" +-{ +- switch (which_alternative) +- { +- case 0: /* fall through */ +- case 4: return "vorr\t%P0, %P1, %P2"; +- case 1: /* fall through */ +- case 5: return neon_output_logic_immediate ("vorr", &operands[2], +- DImode, 0, VALID_NEON_QREG_MODE (DImode)); +- case 2: return "#"; +- case 3: return "#"; +- default: gcc_unreachable (); +- } +-} +- [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,neon_int_1,neon_int_1") +- (set_attr "length" "*,*,8,8,*,*") +- (set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")] +-) +- + ;; The concrete forms of the Neon immediate-logic instructions are vbic and + ;; vorr. We support the pseudo-instruction vand instead, because that + ;; corresponds to the canonical form the middle-end expects to use for +@@ -724,29 +699,6 @@ + [(set_attr "neon_type" "neon_int_1")] + ) + +-(define_insn "anddi3_neon" +- [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r,?w,?w") +- (and:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r,w,0") +- (match_operand:DI 2 "neon_inv_logic_op2" "w,DL,r,r,w,DL")))] +- "TARGET_NEON" +-{ +- switch (which_alternative) +- { +- case 0: /* fall through */ +- case 4: return "vand\t%P0, %P1, %P2"; +- case 1: /* fall through */ +- case 5: return neon_output_logic_immediate ("vand", &operands[2], +- DImode, 1, VALID_NEON_QREG_MODE (DImode)); +- case 2: return "#"; +- case 3: return "#"; +- default: gcc_unreachable (); +- } +-} +- [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,neon_int_1,neon_int_1") +- (set_attr "length" "*,*,8,8,*,*") +- (set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")] +-) +- + (define_insn "orn3_neon" + [(set (match_operand:VDQ 0 "s_register_operand" "=w") + (ior:VDQ (not:VDQ (match_operand:VDQ 2 "s_register_operand" "w")) +@@ -828,21 +780,6 @@ + [(set_attr "neon_type" "neon_int_1")] + ) + +-(define_insn "xordi3_neon" +- [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r,?w") +- (xor:DI (match_operand:DI 1 "s_register_operand" "%w,0,r,w") +- (match_operand:DI 2 "s_register_operand" "w,r,r,w")))] +- "TARGET_NEON" +- "@ +- veor\t%P0, %P1, %P2 +- # +- # +- veor\t%P0, %P1, %P2" +- [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1") +- (set_attr "length" "*,8,8,*") +- (set_attr "arch" "nota8,*,*,onlya8")] +-) +- + (define_insn "one_cmpl2" + [(set (match_operand:VDQ 0 "s_register_operand" "=w") + (not:VDQ (match_operand:VDQ 1 "s_register_operand" "w")))] +@@ -1162,7 +1099,7 @@ + } + DONE; + }" +- [(set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8") ++ [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits") + (set_attr "opt" "*,*,speed,speed,*,*")] + ) + +@@ -1263,7 +1200,7 @@ + + DONE; + }" +- [(set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8") ++ [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits") + (set_attr "opt" "*,*,speed,speed,*,*")] + ) + +@@ -3305,6 +3242,24 @@ + (const_string "neon_fp_vadd_qqq_vabs_qq")))] + ) + ++(define_insn "neon_vcvtv4sfv4hf" ++ [(set (match_operand:V4SF 0 "s_register_operand" "=w") ++ (unspec:V4SF [(match_operand:V4HF 1 "s_register_operand" "w")] ++ UNSPEC_VCVT))] ++ "TARGET_NEON && TARGET_FP16" ++ "vcvt.f32.f16\t%q0, %P1" ++ [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")] ++) ++ ++(define_insn "neon_vcvtv4hfv4sf" ++ [(set (match_operand:V4HF 0 "s_register_operand" "=w") ++ (unspec:V4HF [(match_operand:V4SF 1 "s_register_operand" "w")] ++ UNSPEC_VCVT))] ++ "TARGET_NEON && TARGET_FP16" ++ "vcvt.f16.f32\t%P0, %q1" ++ [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")] ++) ++ + (define_insn "neon_vcvt_n" + [(set (match_operand: 0 "s_register_operand" "=w") + (unspec: [(match_operand:VCVTF 1 "s_register_operand" "w") +@@ -4545,9 +4500,19 @@ + DONE; + }) + ++(define_expand "neon_vreinterpretti" ++ [(match_operand:TI 0 "s_register_operand" "") ++ (match_operand:VQXMOV 1 "s_register_operand" "")] ++ "TARGET_NEON" ++{ ++ neon_reinterpret (operands[0], operands[1]); ++ DONE; ++}) ++ ++ + (define_expand "neon_vreinterpretv16qi" + [(match_operand:V16QI 0 "s_register_operand" "") +- (match_operand:VQX 1 "s_register_operand" "")] ++ (match_operand:VQXMOV 1 "s_register_operand" "")] + "TARGET_NEON" + { + neon_reinterpret (operands[0], operands[1]); +@@ -4556,7 +4521,7 @@ + + (define_expand "neon_vreinterpretv8hi" + [(match_operand:V8HI 0 "s_register_operand" "") +- (match_operand:VQX 1 "s_register_operand" "")] ++ (match_operand:VQXMOV 1 "s_register_operand" "")] + "TARGET_NEON" + { + neon_reinterpret (operands[0], operands[1]); +@@ -4565,7 +4530,7 @@ + + (define_expand "neon_vreinterpretv4si" + [(match_operand:V4SI 0 "s_register_operand" "") +- (match_operand:VQX 1 "s_register_operand" "")] ++ (match_operand:VQXMOV 1 "s_register_operand" "")] + "TARGET_NEON" + { + neon_reinterpret (operands[0], operands[1]); +@@ -4574,7 +4539,7 @@ + + (define_expand "neon_vreinterpretv4sf" + [(match_operand:V4SF 0 "s_register_operand" "") +- (match_operand:VQX 1 "s_register_operand" "")] ++ (match_operand:VQXMOV 1 "s_register_operand" "")] + "TARGET_NEON" + { + neon_reinterpret (operands[0], operands[1]); +@@ -4583,7 +4548,7 @@ + + (define_expand "neon_vreinterpretv2di" + [(match_operand:V2DI 0 "s_register_operand" "") +- (match_operand:VQX 1 "s_register_operand" "")] ++ (match_operand:VQXMOV 1 "s_register_operand" "")] + "TARGET_NEON" + { + neon_reinterpret (operands[0], operands[1]); +@@ -4660,21 +4625,22 @@ + ) + + (define_insn "neon_vld1_dup" +- [(set (match_operand:VDX 0 "s_register_operand" "=w") +- (vec_duplicate:VDX (match_operand: 1 "neon_struct_operand" "Um")))] ++ [(set (match_operand:VD 0 "s_register_operand" "=w") ++ (vec_duplicate:VD (match_operand: 1 "neon_struct_operand" "Um")))] + "TARGET_NEON" +-{ +- if (GET_MODE_NUNITS (mode) > 1) +- return "vld1.\t{%P0[]}, %A1"; +- else +- return "vld1.\t%h0, %A1"; +-} +- [(set (attr "neon_type") +- (if_then_else (gt (const_string "") (const_string "1")) +- (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes") +- (const_string "neon_vld1_1_2_regs")))] ++ "vld1.\t{%P0[]}, %A1" ++ [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")] + ) + ++;; Special case for DImode. Treat it exactly like a simple load. ++(define_expand "neon_vld1_dupdi" ++ [(set (match_operand:DI 0 "s_register_operand" "") ++ (unspec:DI [(match_operand:DI 1 "neon_struct_operand" "")] ++ UNSPEC_VLD1))] ++ "TARGET_NEON" ++ "" ++) ++ + (define_insn "neon_vld1_dup" + [(set (match_operand:VQ 0 "s_register_operand" "=w") + (vec_duplicate:VQ (match_operand: 1 "neon_struct_operand" "Um")))] +@@ -5635,7 +5601,7 @@ + (match_operand:SI 3 "immediate_operand" "")] + "TARGET_NEON" + { +- emit_insn (gen_and3 (operands[0], operands[1], operands[2])); ++ emit_insn (gen_and3 (operands[0], operands[1], operands[2])); + DONE; + }) + +@@ -5646,7 +5612,7 @@ + (match_operand:SI 3 "immediate_operand" "")] + "TARGET_NEON" + { +- emit_insn (gen_ior3 (operands[0], operands[1], operands[2])); ++ emit_insn (gen_ior3 (operands[0], operands[1], operands[2])); + DONE; + }) + +@@ -5657,7 +5623,7 @@ + (match_operand:SI 3 "immediate_operand" "")] + "TARGET_NEON" + { +- emit_insn (gen_xor3 (operands[0], operands[1], operands[2])); ++ emit_insn (gen_xor3 (operands[0], operands[1], operands[2])); + DONE; + }) + +--- a/src/gcc/config/arm/ldmstm.md ++++ b/src/gcc/config/arm/ldmstm.md +@@ -37,7 +37,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "ldm%(ia%)\t%5, {%1, %2, %3, %4}" + [(set_attr "type" "load4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm4_ia" + [(match_parallel 0 "load_multiple_operation" +@@ -74,7 +75,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 5" + "ldm%(ia%)\t%5!, {%1, %2, %3, %4}" + [(set_attr "type" "load4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm4_ia_update" + [(match_parallel 0 "load_multiple_operation" +@@ -108,7 +110,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "stm%(ia%)\t%5, {%1, %2, %3, %4}" + [(set_attr "type" "store4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm4_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -125,7 +128,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 5" + "stm%(ia%)\t%5!, {%1, %2, %3, %4}" + [(set_attr "type" "store4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_stm4_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -302,7 +306,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "ldm%(db%)\t%5, {%1, %2, %3, %4}" + [(set_attr "type" "load4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*ldm4_db_update" + [(match_parallel 0 "load_multiple_operation" +@@ -323,7 +328,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 5" + "ldm%(db%)\t%5!, {%1, %2, %3, %4}" + [(set_attr "type" "load4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm4_db" + [(match_parallel 0 "store_multiple_operation" +@@ -338,7 +344,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "stm%(db%)\t%5, {%1, %2, %3, %4}" + [(set_attr "type" "store4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm4_db_update" + [(match_parallel 0 "store_multiple_operation" +@@ -355,7 +362,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 5" + "stm%(db%)\t%5!, {%1, %2, %3, %4}" + [(set_attr "type" "store4") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_peephole2 + [(set (match_operand:SI 0 "s_register_operand" "") +@@ -477,7 +485,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "ldm%(ia%)\t%4, {%1, %2, %3}" + [(set_attr "type" "load3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm3_ia" + [(match_parallel 0 "load_multiple_operation" +@@ -508,7 +517,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "ldm%(ia%)\t%4!, {%1, %2, %3}" + [(set_attr "type" "load3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm3_ia_update" + [(match_parallel 0 "load_multiple_operation" +@@ -537,7 +547,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "stm%(ia%)\t%4, {%1, %2, %3}" + [(set_attr "type" "store3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm3_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -552,7 +563,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "stm%(ia%)\t%4!, {%1, %2, %3}" + [(set_attr "type" "store3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_stm3_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -704,7 +716,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "ldm%(db%)\t%4, {%1, %2, %3}" + [(set_attr "type" "load3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*ldm3_db_update" + [(match_parallel 0 "load_multiple_operation" +@@ -722,7 +735,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "ldm%(db%)\t%4!, {%1, %2, %3}" + [(set_attr "type" "load3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm3_db" + [(match_parallel 0 "store_multiple_operation" +@@ -735,7 +749,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "stm%(db%)\t%4, {%1, %2, %3}" + [(set_attr "type" "store3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm3_db_update" + [(match_parallel 0 "store_multiple_operation" +@@ -750,7 +765,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 4" + "stm%(db%)\t%4!, {%1, %2, %3}" + [(set_attr "type" "store3") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_peephole2 + [(set (match_operand:SI 0 "s_register_operand" "") +@@ -855,7 +871,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 2" + "ldm%(ia%)\t%3, {%1, %2}" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm2_ia" + [(match_parallel 0 "load_multiple_operation" +@@ -880,7 +897,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "ldm%(ia%)\t%3!, {%1, %2}" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_ldm2_ia_update" + [(match_parallel 0 "load_multiple_operation" +@@ -904,7 +922,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 2" + "stm%(ia%)\t%3, {%1, %2}" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm2_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -917,7 +936,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "stm%(ia%)\t%3!, {%1, %2}" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb_stm2_ia_update" + [(match_parallel 0 "store_multiple_operation" +@@ -1044,7 +1064,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 2" + "ldm%(db%)\t%3, {%1, %2}" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*ldm2_db_update" + [(match_parallel 0 "load_multiple_operation" +@@ -1059,7 +1080,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "ldm%(db%)\t%3!, {%1, %2}" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm2_db" + [(match_parallel 0 "store_multiple_operation" +@@ -1070,7 +1092,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 2" + "stm%(db%)\t%3, {%1, %2}" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*stm2_db_update" + [(match_parallel 0 "store_multiple_operation" +@@ -1083,7 +1106,8 @@ + "TARGET_32BIT && XVECLEN (operands[0], 0) == 3" + "stm%(db%)\t%3!, {%1, %2}" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_peephole2 + [(set (match_operand:SI 0 "s_register_operand" "") +--- a/src/gcc/config/arm/arm_neon_builtins.def ++++ b/src/gcc/config/arm/arm_neon_builtins.def +@@ -0,0 +1,213 @@ ++/* NEON builtin definitions for ARM. ++ Copyright (C) 2013 ++ Free Software Foundation, Inc. ++ Contributed by ARM Ltd. ++ ++ This file is part of GCC. ++ ++ GCC is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published ++ by the Free Software Foundation; either version 3, or (at your ++ option) any later version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++ License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . */ ++ ++VAR10 (BINOP, vadd, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR3 (BINOP, vaddl, v8qi, v4hi, v2si), ++VAR3 (BINOP, vaddw, v8qi, v4hi, v2si), ++VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR3 (BINOP, vaddhn, v8hi, v4si, v2di), ++VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si), ++VAR2 (TERNOP, vfma, v2sf, v4sf), ++VAR2 (TERNOP, vfms, v2sf, v4sf), ++VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si), ++VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si), ++VAR2 (TERNOP, vqdmlal, v4hi, v2si), ++VAR2 (TERNOP, vqdmlsl, v4hi, v2si), ++VAR3 (BINOP, vmull, v8qi, v4hi, v2si), ++VAR2 (SCALARMULL, vmull_n, v4hi, v2si), ++VAR2 (LANEMULL, vmull_lane, v4hi, v2si), ++VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si), ++VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si), ++VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si), ++VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si), ++VAR2 (BINOP, vqdmull, v4hi, v2si), ++VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di), ++VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di), ++VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di), ++VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si), ++VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR10 (BINOP, vsub, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR3 (BINOP, vsubl, v8qi, v4hi, v2si), ++VAR3 (BINOP, vsubw, v8qi, v4hi, v2si), ++VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR3 (BINOP, vsubhn, v8hi, v4si, v2di), ++VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR6 (BINOP, vcgeu, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR6 (BINOP, vcgtu, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR2 (BINOP, vcage, v2sf, v4sf), ++VAR2 (BINOP, vcagt, v2sf, v4sf), ++VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR3 (BINOP, vabdl, v8qi, v4hi, v2si), ++VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR3 (TERNOP, vabal, v8qi, v4hi, v2si), ++VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf), ++VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf), ++VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf), ++VAR2 (BINOP, vrecps, v2sf, v4sf), ++VAR2 (BINOP, vrsqrts, v2sf, v4sf), ++VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di), ++VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++VAR2 (UNOP, vcnt, v8qi, v16qi), ++VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf), ++VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf), ++VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si), ++ /* FIXME: vget_lane supports more variants than this! */ ++VAR10 (GETLANE, vget_lane, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (SETLANE, vset_lane, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di), ++VAR10 (DUP, vdup_n, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (DUPLANE, vdup_lane, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di), ++VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di), ++VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di), ++VAR3 (UNOP, vmovn, v8hi, v4si, v2di), ++VAR3 (UNOP, vqmovn, v8hi, v4si, v2di), ++VAR3 (UNOP, vqmovun, v8hi, v4si, v2di), ++VAR3 (UNOP, vmovl, v8qi, v4hi, v2si), ++VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR2 (LANEMAC, vmlal_lane, v4hi, v2si), ++VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si), ++VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si), ++VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si), ++VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR2 (SCALARMAC, vmlal_n, v4hi, v2si), ++VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si), ++VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si), ++VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si), ++VAR10 (BINOP, vext, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi), ++VAR2 (UNOP, vrev16, v8qi, v16qi), ++VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf), ++VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf), ++VAR1 (FLOAT_WIDEN, vcvtv4sf, v4hf), ++VAR1 (FLOAT_NARROW, vcvtv4hf, v4sf), ++VAR10 (SELECT, vbsl, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR2 (RINT, vrintn, v2sf, v4sf), ++VAR2 (RINT, vrinta, v2sf, v4sf), ++VAR2 (RINT, vrintp, v2sf, v4sf), ++VAR2 (RINT, vrintm, v2sf, v4sf), ++VAR2 (RINT, vrintz, v2sf, v4sf), ++VAR2 (RINT, vrintx, v2sf, v4sf), ++VAR1 (VTBL, vtbl1, v8qi), ++VAR1 (VTBL, vtbl2, v8qi), ++VAR1 (VTBL, vtbl3, v8qi), ++VAR1 (VTBL, vtbl4, v8qi), ++VAR1 (VTBX, vtbx1, v8qi), ++VAR1 (VTBX, vtbx2, v8qi), ++VAR1 (VTBX, vtbx3, v8qi), ++VAR1 (VTBX, vtbx4, v8qi), ++VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf), ++VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di), ++VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di), ++VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di), ++VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di), ++VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di), ++VAR6 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR6 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR6 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR6 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR6 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR6 (REINTERP, vreinterpretti, v16qi, v8hi, v4si, v4sf, v2di, ti), ++VAR10 (LOAD1, vld1, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (LOAD1LANE, vld1_lane, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (LOAD1, vld1_dup, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (STORE1, vst1, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (STORE1LANE, vst1_lane, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR9 (LOADSTRUCT, ++ vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (LOADSTRUCTLANE, vld2_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di), ++VAR9 (STORESTRUCT, vst2, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (STORESTRUCTLANE, vst2_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR9 (LOADSTRUCT, ++ vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (LOADSTRUCTLANE, vld3_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di), ++VAR9 (STORESTRUCT, vst3, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (STORESTRUCTLANE, vst3_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR9 (LOADSTRUCT, vld4, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (LOADSTRUCTLANE, vld4_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di), ++VAR9 (STORESTRUCT, vst4, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf), ++VAR7 (STORESTRUCTLANE, vst4_lane, ++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf), ++VAR10 (LOGICBINOP, vand, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (LOGICBINOP, vorr, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (BINOP, veor, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (LOGICBINOP, vbic, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), ++VAR10 (LOGICBINOP, vorn, ++ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) +--- a/src/gcc/config/arm/neon.ml ++++ b/src/gcc/config/arm/neon.ml +@@ -21,8 +21,8 @@ + . *) + + (* Shorthand types for vector elements. *) +-type elts = S8 | S16 | S32 | S64 | F32 | U8 | U16 | U32 | U64 | P8 | P16 +- | I8 | I16 | I32 | I64 | B8 | B16 | B32 | B64 | Conv of elts * elts ++type elts = S8 | S16 | S32 | S64 | F16 | F32 | U8 | U16 | U32 | U64 | P8 | P16 ++ | P64 | P128 | I8 | I16 | I32 | I64 | B8 | B16 | B32 | B64 | Conv of elts * elts + | Cast of elts * elts | NoElts + + type eltclass = Signed | Unsigned | Float | Poly | Int | Bits +@@ -37,6 +37,7 @@ + | T_uint16x4 | T_uint16x8 + | T_uint32x2 | T_uint32x4 + | T_uint64x1 | T_uint64x2 ++ | T_float16x4 + | T_float32x2 | T_float32x4 + | T_poly8x8 | T_poly8x16 + | T_poly16x4 | T_poly16x8 +@@ -46,11 +47,15 @@ + | T_uint8 | T_uint16 + | T_uint32 | T_uint64 + | T_poly8 | T_poly16 +- | T_float32 | T_arrayof of int * vectype ++ | T_poly64 | T_poly64x1 ++ | T_poly64x2 | T_poly128 ++ | T_float16 | T_float32 ++ | T_arrayof of int * vectype + | T_ptrto of vectype | T_const of vectype + | T_void | T_intQI + | T_intHI | T_intSI +- | T_intDI | T_floatSF ++ | T_intDI | T_intTI ++ | T_floatHF | T_floatSF + + (* The meanings of the following are: + TImode : "Tetra", two registers (four words). +@@ -92,8 +97,8 @@ + | Arity3 of vectype * vectype * vectype * vectype + | Arity4 of vectype * vectype * vectype * vectype * vectype + +-type vecmode = V8QI | V4HI | V2SI | V2SF | DI +- | V16QI | V8HI | V4SI | V4SF | V2DI ++type vecmode = V8QI | V4HI | V4HF |V2SI | V2SF | DI ++ | V16QI | V8HI | V4SI | V4SF | V2DI | TI + | QI | HI | SI | SF + + type opcode = +@@ -284,18 +289,23 @@ + | Fixed_core_reg + (* Mark that the intrinsic requires __ARM_FEATURE_string to be defined. *) + | Requires_feature of string ++ (* Mark that the intrinsic requires a particular architecture version. *) + | Requires_arch of int ++ (* Mark that the intrinsic requires a particular bit in __ARM_FP to ++ be set. *) ++ | Requires_FP_bit of int + + exception MixedMode of elts * elts + + let rec elt_width = function + S8 | U8 | P8 | I8 | B8 -> 8 +- | S16 | U16 | P16 | I16 | B16 -> 16 ++ | S16 | U16 | P16 | I16 | B16 | F16 -> 16 + | S32 | F32 | U32 | I32 | B32 -> 32 +- | S64 | U64 | I64 | B64 -> 64 ++ | S64 | U64 | P64 | I64 | B64 -> 64 ++ | P128 -> 128 + | Conv (a, b) -> + let wa = elt_width a and wb = elt_width b in +- if wa = wb then wa else failwith "element width?" ++ if wa = wb then wa else raise (MixedMode (a, b)) + | Cast (a, b) -> raise (MixedMode (a, b)) + | NoElts -> failwith "No elts" + +@@ -302,8 +312,8 @@ + let rec elt_class = function + S8 | S16 | S32 | S64 -> Signed + | U8 | U16 | U32 | U64 -> Unsigned +- | P8 | P16 -> Poly +- | F32 -> Float ++ | P8 | P16 | P64 | P128 -> Poly ++ | F16 | F32 -> Float + | I8 | I16 | I32 | I64 -> Int + | B8 | B16 | B32 | B64 -> Bits + | Conv (a, b) | Cast (a, b) -> ConvClass (elt_class a, elt_class b) +@@ -315,6 +325,7 @@ + | Signed, 16 -> S16 + | Signed, 32 -> S32 + | Signed, 64 -> S64 ++ | Float, 16 -> F16 + | Float, 32 -> F32 + | Unsigned, 8 -> U8 + | Unsigned, 16 -> U16 +@@ -322,6 +333,8 @@ + | Unsigned, 64 -> U64 + | Poly, 8 -> P8 + | Poly, 16 -> P16 ++ | Poly, 64 -> P64 ++ | Poly, 128 -> P128 + | Int, 8 -> I8 + | Int, 16 -> I16 + | Int, 32 -> I32 +@@ -384,20 +397,28 @@ + in + scan ((Array.length operands) - 1) + +-let rec mode_of_elt elt shape = ++(* Find a vecmode from a shape_elt ELT for an instruction with shape_form ++ SHAPE. For a Use_operands shape, if ARGPOS is passed then return the mode ++ for the given argument position, else determine which argument to return a ++ mode for automatically. *) ++ ++let rec mode_of_elt ?argpos elt shape = + let flt = match elt_class elt with + Float | ConvClass(_, Float) -> true | _ -> false in + let idx = + match elt_width elt with +- 8 -> 0 | 16 -> 1 | 32 -> 2 | 64 -> 3 ++ 8 -> 0 | 16 -> 1 | 32 -> 2 | 64 -> 3 | 128 -> 4 + | _ -> failwith "Bad element width" + in match shape with + All (_, Dreg) | By_scalar Dreg | Pair_result Dreg | Unary_scalar Dreg + | Binary_imm Dreg | Long_noreg Dreg | Wide_noreg Dreg -> +- [| V8QI; V4HI; if flt then V2SF else V2SI; DI |].(idx) ++ if flt then ++ [| V8QI; V4HF; V2SF; DI |].(idx) ++ else ++ [| V8QI; V4HI; V2SI; DI |].(idx) + | All (_, Qreg) | By_scalar Qreg | Pair_result Qreg | Unary_scalar Qreg + | Binary_imm Qreg | Long_noreg Qreg | Wide_noreg Qreg -> +- [| V16QI; V8HI; if flt then V4SF else V4SI; V2DI |].(idx) ++ [| V16QI; V8HI; if flt then V4SF else V4SI; V2DI; TI|].(idx) + | All (_, (Corereg | PtrTo _ | CstPtrTo _)) -> + [| QI; HI; if flt then SF else SI; DI |].(idx) + | Long | Wide | Wide_lane | Wide_scalar +@@ -404,7 +425,11 @@ + | Long_imm -> + [| V8QI; V4HI; V2SI; DI |].(idx) + | Narrow | Narrow_imm -> [| V16QI; V8HI; V4SI; V2DI |].(idx) +- | Use_operands ops -> mode_of_elt elt (All (0, (find_key_operand ops))) ++ | Use_operands ops -> ++ begin match argpos with ++ None -> mode_of_elt ?argpos elt (All (0, (find_key_operand ops))) ++ | Some pos -> mode_of_elt ?argpos elt (All (0, ops.(pos))) ++ end + | _ -> failwith "invalid shape" + + (* Modify an element type dependent on the shape of the instruction and the +@@ -454,10 +479,13 @@ + | U16 -> T_uint16x4 + | U32 -> T_uint32x2 + | U64 -> T_uint64x1 ++ | P64 -> T_poly64x1 ++ | P128 -> T_poly128 ++ | F16 -> T_float16x4 + | F32 -> T_float32x2 + | P8 -> T_poly8x8 + | P16 -> T_poly16x4 +- | _ -> failwith "Bad elt type" ++ | _ -> failwith "Bad elt type for Dreg" + end + | Qreg -> + begin match elt with +@@ -472,7 +500,9 @@ + | F32 -> T_float32x4 + | P8 -> T_poly8x16 + | P16 -> T_poly16x8 +- | _ -> failwith "Bad elt type" ++ | P64 -> T_poly64x2 ++ | P128 -> T_poly128 ++ | _ -> failwith "Bad elt type for Qreg" + end + | Corereg -> + begin match elt with +@@ -486,8 +516,10 @@ + | U64 -> T_uint64 + | P8 -> T_poly8 + | P16 -> T_poly16 ++ | P64 -> T_poly64 ++ | P128 -> T_poly128 + | F32 -> T_float32 +- | _ -> failwith "Bad elt type" ++ | _ -> failwith "Bad elt type for Corereg" + end + | Immed -> + T_immediate (0, 0) +@@ -506,10 +538,10 @@ + let vectype_size = function + T_int8x8 | T_int16x4 | T_int32x2 | T_int64x1 + | T_uint8x8 | T_uint16x4 | T_uint32x2 | T_uint64x1 +- | T_float32x2 | T_poly8x8 | T_poly16x4 -> 64 ++ | T_float32x2 | T_poly8x8 | T_poly64x1 | T_poly16x4 | T_float16x4 -> 64 + | T_int8x16 | T_int16x8 | T_int32x4 | T_int64x2 + | T_uint8x16 | T_uint16x8 | T_uint32x4 | T_uint64x2 +- | T_float32x4 | T_poly8x16 | T_poly16x8 -> 128 ++ | T_float32x4 | T_poly8x16 | T_poly64x2 | T_poly16x8 -> 128 + | _ -> raise Not_found + + let inttype_for_array num elttype = +@@ -1020,14 +1052,22 @@ + "vRsraQ_n", shift_right_acc, su_8_64; + + (* Vector shift right and insert. *) ++ Vsri, [Requires_feature "CRYPTO"], Use_operands [| Dreg; Dreg; Immed |], "vsri_n", shift_insert, ++ [P64]; + Vsri, [], Use_operands [| Dreg; Dreg; Immed |], "vsri_n", shift_insert, + P8 :: P16 :: su_8_64; ++ Vsri, [Requires_feature "CRYPTO"], Use_operands [| Qreg; Qreg; Immed |], "vsriQ_n", shift_insert, ++ [P64]; + Vsri, [], Use_operands [| Qreg; Qreg; Immed |], "vsriQ_n", shift_insert, + P8 :: P16 :: su_8_64; + + (* Vector shift left and insert. *) ++ Vsli, [Requires_feature "CRYPTO"], Use_operands [| Dreg; Dreg; Immed |], "vsli_n", shift_insert, ++ [P64]; + Vsli, [], Use_operands [| Dreg; Dreg; Immed |], "vsli_n", shift_insert, + P8 :: P16 :: su_8_64; ++ Vsli, [Requires_feature "CRYPTO"], Use_operands [| Qreg; Qreg; Immed |], "vsliQ_n", shift_insert, ++ [P64]; + Vsli, [], Use_operands [| Qreg; Qreg; Immed |], "vsliQ_n", shift_insert, + P8 :: P16 :: su_8_64; + +@@ -1114,6 +1154,11 @@ + + (* Create vector from literal bit pattern. *) + Vcreate, ++ [Requires_feature "CRYPTO"; No_op], (* Not really, but it can yield various things that are too ++ hard for the test generator at this time. *) ++ Use_operands [| Dreg; Corereg |], "vcreate", create_vector, ++ [P64]; ++ Vcreate, + [No_op], (* Not really, but it can yield various things that are too + hard for the test generator at this time. *) + Use_operands [| Dreg; Corereg |], "vcreate", create_vector, +@@ -1127,6 +1172,12 @@ + Use_operands [| Dreg; Corereg |], "vdup_n", bits_1, + pf_su_8_32; + Vdup_n, ++ [No_op; Requires_feature "CRYPTO"; ++ Instruction_name ["vmov"]; ++ Disassembles_as [Use_operands [| Dreg; Corereg; Corereg |]]], ++ Use_operands [| Dreg; Corereg |], "vdup_n", notype_1, ++ [P64]; ++ Vdup_n, + [No_op; + Instruction_name ["vmov"]; + Disassembles_as [Use_operands [| Dreg; Corereg; Corereg |]]], +@@ -1133,6 +1184,13 @@ + Use_operands [| Dreg; Corereg |], "vdup_n", notype_1, + [S64; U64]; + Vdup_n, ++ [No_op; Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| Qreg; ++ Alternatives [ Corereg; ++ Element_of_dreg ] |]]], ++ Use_operands [| Qreg; Corereg |], "vdupQ_n", bits_1, ++ [P64]; ++ Vdup_n, + [Disassembles_as [Use_operands [| Qreg; + Alternatives [ Corereg; + Element_of_dreg ] |]]], +@@ -1185,6 +1243,9 @@ + [Disassembles_as [Use_operands [| Dreg; Element_of_dreg |]]], + Unary_scalar Dreg, "vdup_lane", bits_2, pf_su_8_32; + Vdup_lane, ++ [No_op; Requires_feature "CRYPTO"; Const_valuator (fun _ -> 0)], ++ Unary_scalar Dreg, "vdup_lane", bits_2, [P64]; ++ Vdup_lane, + [No_op; Const_valuator (fun _ -> 0)], + Unary_scalar Dreg, "vdup_lane", bits_2, [S64; U64]; + Vdup_lane, +@@ -1191,15 +1252,24 @@ + [Disassembles_as [Use_operands [| Qreg; Element_of_dreg |]]], + Unary_scalar Qreg, "vdupQ_lane", bits_2, pf_su_8_32; + Vdup_lane, ++ [No_op; Requires_feature "CRYPTO"; Const_valuator (fun _ -> 0)], ++ Unary_scalar Qreg, "vdupQ_lane", bits_2, [P64]; ++ Vdup_lane, + [No_op; Const_valuator (fun _ -> 0)], + Unary_scalar Qreg, "vdupQ_lane", bits_2, [S64; U64]; + + (* Combining vectors. *) ++ Vcombine, [Requires_feature "CRYPTO"; No_op], ++ Use_operands [| Qreg; Dreg; Dreg |], "vcombine", notype_2, ++ [P64]; + Vcombine, [No_op], + Use_operands [| Qreg; Dreg; Dreg |], "vcombine", notype_2, + pf_su_8_64; + + (* Splitting vectors. *) ++ Vget_high, [Requires_feature "CRYPTO"; No_op], ++ Use_operands [| Dreg; Qreg |], "vget_high", ++ notype_1, [P64]; + Vget_high, [No_op], + Use_operands [| Dreg; Qreg |], "vget_high", + notype_1, pf_su_8_64; +@@ -1208,8 +1278,11 @@ + Fixed_vector_reg], + Use_operands [| Dreg; Qreg |], "vget_low", + notype_1, pf_su_8_32; +- Vget_low, [No_op], ++ Vget_low, [Requires_feature "CRYPTO"; No_op], + Use_operands [| Dreg; Qreg |], "vget_low", ++ notype_1, [P64]; ++ Vget_low, [No_op], ++ Use_operands [| Dreg; Qreg |], "vget_low", + notype_1, [S64; U64]; + + (* Conversions. *) +@@ -1217,6 +1290,10 @@ + [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)]; + Vcvt, [InfoWord], All (2, Qreg), "vcvtQ", conv_1, + [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)]; ++ Vcvt, [Builtin_name "vcvt" ; Requires_FP_bit 1], ++ Use_operands [| Dreg; Qreg; |], "vcvt", conv_1, [Conv (F16, F32)]; ++ Vcvt, [Builtin_name "vcvt" ; Requires_FP_bit 1], ++ Use_operands [| Qreg; Dreg; |], "vcvt", conv_1, [Conv (F32, F16)]; + Vcvt_n, [InfoWord], Use_operands [| Dreg; Dreg; Immed |], "vcvt_n", conv_2, + [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)]; + Vcvt_n, [InfoWord], Use_operands [| Qreg; Qreg; Immed |], "vcvtQ_n", conv_2, +@@ -1387,9 +1464,15 @@ + [S16; S32]; + + (* Vector extract. *) ++ Vext, [Requires_feature "CRYPTO"; Const_valuator (fun _ -> 0)], ++ Use_operands [| Dreg; Dreg; Dreg; Immed |], "vext", extend, ++ [P64]; + Vext, [Const_valuator (fun _ -> 0)], + Use_operands [| Dreg; Dreg; Dreg; Immed |], "vext", extend, + pf_su_8_64; ++ Vext, [Requires_feature "CRYPTO"; Const_valuator (fun _ -> 0)], ++ Use_operands [| Qreg; Qreg; Qreg; Immed |], "vextQ", extend, ++ [P64]; + Vext, [Const_valuator (fun _ -> 0)], + Use_operands [| Qreg; Qreg; Qreg; Immed |], "vextQ", extend, + pf_su_8_64; +@@ -1410,11 +1493,21 @@ + + (* Bit selection. *) + Vbsl, ++ [Requires_feature "CRYPTO"; Instruction_name ["vbsl"; "vbit"; "vbif"]; ++ Disassembles_as [Use_operands [| Dreg; Dreg; Dreg |]]], ++ Use_operands [| Dreg; Dreg; Dreg; Dreg |], "vbsl", bit_select, ++ [P64]; ++ Vbsl, + [Instruction_name ["vbsl"; "vbit"; "vbif"]; + Disassembles_as [Use_operands [| Dreg; Dreg; Dreg |]]], + Use_operands [| Dreg; Dreg; Dreg; Dreg |], "vbsl", bit_select, + pf_su_8_64; + Vbsl, ++ [Requires_feature "CRYPTO"; Instruction_name ["vbsl"; "vbit"; "vbif"]; ++ Disassembles_as [Use_operands [| Qreg; Qreg; Qreg |]]], ++ Use_operands [| Qreg; Qreg; Qreg; Qreg |], "vbslQ", bit_select, ++ [P64]; ++ Vbsl, + [Instruction_name ["vbsl"; "vbit"; "vbif"]; + Disassembles_as [Use_operands [| Qreg; Qreg; Qreg |]]], + Use_operands [| Qreg; Qreg; Qreg; Qreg |], "vbslQ", bit_select, +@@ -1436,10 +1529,21 @@ + + (* Element/structure loads. VLD1 variants. *) + Vldx 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| Dreg; CstPtrTo Corereg |], "vld1", bits_1, ++ [P64]; ++ Vldx 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| Dreg; CstPtrTo Corereg |], "vld1", bits_1, + pf_su_8_64; ++ Vldx 1, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (2, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| Qreg; CstPtrTo Corereg |], "vld1Q", bits_1, ++ [P64]; + Vldx 1, [Disassembles_as [Use_operands [| VecArray (2, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| Qreg; CstPtrTo Corereg |], "vld1Q", bits_1, +@@ -1451,6 +1555,13 @@ + Use_operands [| Dreg; CstPtrTo Corereg; Dreg; Immed |], + "vld1_lane", bits_3, pf_su_8_32; + Vldx_lane 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]; ++ Const_valuator (fun _ -> 0)], ++ Use_operands [| Dreg; CstPtrTo Corereg; Dreg; Immed |], ++ "vld1_lane", bits_3, [P64]; ++ Vldx_lane 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]; + Const_valuator (fun _ -> 0)], +@@ -1462,6 +1573,12 @@ + Use_operands [| Qreg; CstPtrTo Corereg; Qreg; Immed |], + "vld1Q_lane", bits_3, pf_su_8_32; + Vldx_lane 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| Qreg; CstPtrTo Corereg; Qreg; Immed |], ++ "vld1Q_lane", bits_3, [P64]; ++ Vldx_lane 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| Qreg; CstPtrTo Corereg; Qreg; Immed |], +@@ -1473,6 +1590,12 @@ + Use_operands [| Dreg; CstPtrTo Corereg |], "vld1_dup", + bits_1, pf_su_8_32; + Vldx_dup 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| Dreg; CstPtrTo Corereg |], "vld1_dup", ++ bits_1, [P64]; ++ Vldx_dup 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| Dreg; CstPtrTo Corereg |], "vld1_dup", +@@ -1485,6 +1608,12 @@ + (* Treated identically to vld1_dup above as we now + do a single load followed by a duplicate. *) + Vldx_dup 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| Qreg; CstPtrTo Corereg |], "vld1Q_dup", ++ bits_1, [P64]; ++ Vldx_dup 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| Qreg; CstPtrTo Corereg |], "vld1Q_dup", +@@ -1491,10 +1620,20 @@ + bits_1, [S64; U64]; + + (* VST1 variants. *) ++ Vstx 1, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ PtrTo Corereg |]]], ++ Use_operands [| PtrTo Corereg; Dreg |], "vst1", ++ store_1, [P64]; + Vstx 1, [Disassembles_as [Use_operands [| VecArray (1, Dreg); + PtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; Dreg |], "vst1", + store_1, pf_su_8_64; ++ Vstx 1, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (2, Dreg); ++ PtrTo Corereg |]]], ++ Use_operands [| PtrTo Corereg; Qreg |], "vst1Q", ++ store_1, [P64]; + Vstx 1, [Disassembles_as [Use_operands [| VecArray (2, Dreg); + PtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; Qreg |], "vst1Q", +@@ -1506,6 +1645,13 @@ + Use_operands [| PtrTo Corereg; Dreg; Immed |], + "vst1_lane", store_3, pf_su_8_32; + Vstx_lane 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]; ++ Const_valuator (fun _ -> 0)], ++ Use_operands [| PtrTo Corereg; Dreg; Immed |], ++ "vst1_lane", store_3, [P64]; ++ Vstx_lane 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]; + Const_valuator (fun _ -> 0)], +@@ -1517,6 +1663,12 @@ + Use_operands [| PtrTo Corereg; Qreg; Immed |], + "vst1Q_lane", store_3, pf_su_8_32; + Vstx_lane 1, ++ [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (1, Dreg); ++ CstPtrTo Corereg |]]], ++ Use_operands [| PtrTo Corereg; Qreg; Immed |], ++ "vst1Q_lane", store_3, [P64]; ++ Vstx_lane 1, + [Disassembles_as [Use_operands [| VecArray (1, Dreg); + CstPtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; Qreg; Immed |], +@@ -1525,6 +1677,9 @@ + (* VLD2 variants. *) + Vldx 2, [], Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], + "vld2", bits_1, pf_su_8_32; ++ Vldx 2, [Requires_feature "CRYPTO"; Instruction_name ["vld1"]], ++ Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], ++ "vld2", bits_1, [P64]; + Vldx 2, [Instruction_name ["vld1"]], + Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], + "vld2", bits_1, [S64; U64]; +@@ -1556,6 +1711,12 @@ + Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], + "vld2_dup", bits_1, pf_su_8_32; + Vldx_dup 2, ++ [Requires_feature "CRYPTO"; ++ Instruction_name ["vld1"]; Disassembles_as [Use_operands ++ [| VecArray (2, Dreg); CstPtrTo Corereg |]]], ++ Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], ++ "vld2_dup", bits_1, [P64]; ++ Vldx_dup 2, + [Instruction_name ["vld1"]; Disassembles_as [Use_operands + [| VecArray (2, Dreg); CstPtrTo Corereg |]]], + Use_operands [| VecArray (2, Dreg); CstPtrTo Corereg |], +@@ -1566,6 +1727,12 @@ + PtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; VecArray (2, Dreg) |], "vst2", + store_1, pf_su_8_32; ++ Vstx 2, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (2, Dreg); ++ PtrTo Corereg |]]; ++ Instruction_name ["vst1"]], ++ Use_operands [| PtrTo Corereg; VecArray (2, Dreg) |], "vst2", ++ store_1, [P64]; + Vstx 2, [Disassembles_as [Use_operands [| VecArray (2, Dreg); + PtrTo Corereg |]]; + Instruction_name ["vst1"]], +@@ -1594,6 +1761,9 @@ + (* VLD3 variants. *) + Vldx 3, [], Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], + "vld3", bits_1, pf_su_8_32; ++ Vldx 3, [Requires_feature "CRYPTO"; Instruction_name ["vld1"]], ++ Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], ++ "vld3", bits_1, [P64]; + Vldx 3, [Instruction_name ["vld1"]], + Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], + "vld3", bits_1, [S64; U64]; +@@ -1625,6 +1795,12 @@ + Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], + "vld3_dup", bits_1, pf_su_8_32; + Vldx_dup 3, ++ [Requires_feature "CRYPTO"; ++ Instruction_name ["vld1"]; Disassembles_as [Use_operands ++ [| VecArray (3, Dreg); CstPtrTo Corereg |]]], ++ Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], ++ "vld3_dup", bits_1, [P64]; ++ Vldx_dup 3, + [Instruction_name ["vld1"]; Disassembles_as [Use_operands + [| VecArray (3, Dreg); CstPtrTo Corereg |]]], + Use_operands [| VecArray (3, Dreg); CstPtrTo Corereg |], +@@ -1635,6 +1811,12 @@ + PtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; VecArray (3, Dreg) |], "vst3", + store_1, pf_su_8_32; ++ Vstx 3, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (4, Dreg); ++ PtrTo Corereg |]]; ++ Instruction_name ["vst1"]], ++ Use_operands [| PtrTo Corereg; VecArray (3, Dreg) |], "vst3", ++ store_1, [P64]; + Vstx 3, [Disassembles_as [Use_operands [| VecArray (4, Dreg); + PtrTo Corereg |]]; + Instruction_name ["vst1"]], +@@ -1663,6 +1845,9 @@ + (* VLD4/VST4 variants. *) + Vldx 4, [], Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], + "vld4", bits_1, pf_su_8_32; ++ Vldx 4, [Requires_feature "CRYPTO"; Instruction_name ["vld1"]], ++ Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], ++ "vld4", bits_1, [P64]; + Vldx 4, [Instruction_name ["vld1"]], + Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], + "vld4", bits_1, [S64; U64]; +@@ -1694,6 +1879,12 @@ + Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], + "vld4_dup", bits_1, pf_su_8_32; + Vldx_dup 4, ++ [Requires_feature "CRYPTO"; ++ Instruction_name ["vld1"]; Disassembles_as [Use_operands ++ [| VecArray (4, Dreg); CstPtrTo Corereg |]]], ++ Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], ++ "vld4_dup", bits_1, [P64]; ++ Vldx_dup 4, + [Instruction_name ["vld1"]; Disassembles_as [Use_operands + [| VecArray (4, Dreg); CstPtrTo Corereg |]]], + Use_operands [| VecArray (4, Dreg); CstPtrTo Corereg |], +@@ -1703,6 +1894,12 @@ + PtrTo Corereg |]]], + Use_operands [| PtrTo Corereg; VecArray (4, Dreg) |], "vst4", + store_1, pf_su_8_32; ++ Vstx 4, [Requires_feature "CRYPTO"; ++ Disassembles_as [Use_operands [| VecArray (4, Dreg); ++ PtrTo Corereg |]]; ++ Instruction_name ["vst1"]], ++ Use_operands [| PtrTo Corereg; VecArray (4, Dreg) |], "vst4", ++ store_1, [P64]; + Vstx 4, [Disassembles_as [Use_operands [| VecArray (4, Dreg); + PtrTo Corereg |]]; + Instruction_name ["vst1"]], +@@ -1754,27 +1951,33 @@ + Vorn, [], All (3, Qreg), "vornQ", notype_2, su_8_64; + ] + ++let type_in_crypto_only t ++ = (t == P64) or (t == P128) ++ ++let cross_product s1 s2 ++ = List.filter (fun (e, e') -> e <> e') ++ (List.concat (List.map (fun e1 -> List.map (fun e2 -> (e1,e2)) s1) s2)) ++ + let reinterp = +- let elems = P8 :: P16 :: F32 :: su_8_64 in +- List.fold_right +- (fun convto acc -> +- let types = List.fold_right +- (fun convfrom acc -> +- if convfrom <> convto then +- Cast (convto, convfrom) :: acc +- else +- acc) +- elems +- [] +- in +- let dconv = Vreinterp, [No_op], Use_operands [| Dreg; Dreg |], +- "vreinterpret", conv_1, types +- and qconv = Vreinterp, [No_op], Use_operands [| Qreg; Qreg |], +- "vreinterpretQ", conv_1, types in +- dconv :: qconv :: acc) +- elems +- [] ++ let elems = P8 :: P16 :: F32 :: P64 :: su_8_64 in ++ let casts = cross_product elems elems in ++ List.map ++ (fun (convto, convfrom) -> ++ Vreinterp, (if (type_in_crypto_only convto) or (type_in_crypto_only convfrom) ++ then [Requires_feature "CRYPTO"] else []) @ [No_op], Use_operands [| Dreg; Dreg |], ++ "vreinterpret", conv_1, [Cast (convto, convfrom)]) ++ casts + ++let reinterpq = ++ let elems = P8 :: P16 :: F32 :: P64 :: P128 :: su_8_64 in ++ let casts = cross_product elems elems in ++ List.map ++ (fun (convto, convfrom) -> ++ Vreinterp, (if (type_in_crypto_only convto) or (type_in_crypto_only convfrom) ++ then [Requires_feature "CRYPTO"] else []) @ [No_op], Use_operands [| Qreg; Qreg |], ++ "vreinterpretQ", conv_1, [Cast (convto, convfrom)]) ++ casts ++ + (* Output routines. *) + + let rec string_of_elt = function +@@ -1782,7 +1985,8 @@ + | U8 -> "u8" | U16 -> "u16" | U32 -> "u32" | U64 -> "u64" + | I8 -> "i8" | I16 -> "i16" | I32 -> "i32" | I64 -> "i64" + | B8 -> "8" | B16 -> "16" | B32 -> "32" | B64 -> "64" +- | F32 -> "f32" | P8 -> "p8" | P16 -> "p16" ++ | F16 -> "f16" | F32 -> "f32" | P8 -> "p8" | P16 -> "p16" ++ | P64 -> "p64" | P128 -> "p128" + | Conv (a, b) | Cast (a, b) -> string_of_elt a ^ "_" ^ string_of_elt b + | NoElts -> failwith "No elts" + +@@ -1809,6 +2013,7 @@ + | T_uint32x4 -> affix "uint32x4" + | T_uint64x1 -> affix "uint64x1" + | T_uint64x2 -> affix "uint64x2" ++ | T_float16x4 -> affix "float16x4" + | T_float32x2 -> affix "float32x2" + | T_float32x4 -> affix "float32x4" + | T_poly8x8 -> affix "poly8x8" +@@ -1825,6 +2030,11 @@ + | T_uint64 -> affix "uint64" + | T_poly8 -> affix "poly8" + | T_poly16 -> affix "poly16" ++ | T_poly64 -> affix "poly64" ++ | T_poly64x1 -> affix "poly64x1" ++ | T_poly64x2 -> affix "poly64x2" ++ | T_poly128 -> affix "poly128" ++ | T_float16 -> affix "float16" + | T_float32 -> affix "float32" + | T_immediate _ -> "const int" + | T_void -> "void" +@@ -1832,6 +2042,8 @@ + | T_intHI -> "__builtin_neon_hi" + | T_intSI -> "__builtin_neon_si" + | T_intDI -> "__builtin_neon_di" ++ | T_intTI -> "__builtin_neon_ti" ++ | T_floatHF -> "__builtin_neon_hf" + | T_floatSF -> "__builtin_neon_sf" + | T_arrayof (num, base) -> + let basename = name (fun x -> x) base in +@@ -1853,10 +2065,10 @@ + | B_XImode -> "__builtin_neon_xi" + + let string_of_mode = function +- V8QI -> "v8qi" | V4HI -> "v4hi" | V2SI -> "v2si" | V2SF -> "v2sf" +- | DI -> "di" | V16QI -> "v16qi" | V8HI -> "v8hi" | V4SI -> "v4si" +- | V4SF -> "v4sf" | V2DI -> "v2di" | QI -> "qi" | HI -> "hi" | SI -> "si" +- | SF -> "sf" ++ V8QI -> "v8qi" | V4HI -> "v4hi" | V4HF -> "v4hf" | V2SI -> "v2si" ++ | V2SF -> "v2sf" | DI -> "di" | V16QI -> "v16qi" | V8HI -> "v8hi" ++ | V4SI -> "v4si" | V4SF -> "v4sf" | V2DI -> "v2di" | QI -> "qi" ++ | HI -> "hi" | SI -> "si" | SF -> "sf" | TI -> "ti" + + (* Use uppercase chars for letters which form part of the intrinsic name, but + should be omitted from the builtin name (the info is passed in an extra +@@ -1963,3 +2175,181 @@ + | _ -> assert false + with Not_found -> [f shape] + ++(* The crypto intrinsics have unconventional shapes and are not that ++ numerous to be worth the trouble of encoding here. We implement them ++ explicitly here. *) ++let crypto_intrinsics = ++" ++#ifdef __ARM_FEATURE_CRYPTO ++ ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vldrq_p128 (poly128_t const * __ptr) ++{ ++#ifdef __ARM_BIG_ENDIAN ++ poly64_t* __ptmp = (poly64_t*) __ptr; ++ poly64_t __d0 = vld1_p64 (__ptmp); ++ poly64_t __d1 = vld1_p64 (__ptmp + 1); ++ return vreinterpretq_p128_p64 (vcombine_p64 (__d1, __d0)); ++#else ++ return vreinterpretq_p128_p64 (vld1q_p64 ((poly64_t*) __ptr)); ++#endif ++} ++ ++__extension__ static __inline void __attribute__ ((__always_inline__)) ++vstrq_p128 (poly128_t * __ptr, poly128_t __val) ++{ ++#ifdef __ARM_BIG_ENDIAN ++ poly64x2_t __tmp = vreinterpretq_p64_p128 (__val); ++ poly64_t __d0 = vget_high_p64 (__tmp); ++ poly64_t __d1 = vget_low_p64 (__tmp); ++ vst1q_p64 ((poly64_t*) __ptr, vcombine_p64 (__d0, __d1)); ++#else ++ vst1q_p64 ((poly64_t*) __ptr, vreinterpretq_p64_p128 (__val)); ++#endif ++} ++ ++/* The vceq_p64 intrinsic does not map to a single instruction. ++ Instead we emulate it by performing a 32-bit variant of the vceq ++ and applying a pairwise min reduction to the result. ++ vceq_u32 will produce two 32-bit halves, each of which will contain either ++ all ones or all zeros depending on whether the corresponding 32-bit ++ halves of the poly64_t were equal. The whole poly64_t values are equal ++ if and only if both halves are equal, i.e. vceq_u32 returns all ones. ++ If the result is all zeroes for any half then the whole result is zeroes. ++ This is what the pairwise min reduction achieves. */ ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceq_p64 (poly64x1_t __a, poly64x1_t __b) ++{ ++ uint32x2_t __t_a = vreinterpret_u32_p64 (__a); ++ uint32x2_t __t_b = vreinterpret_u32_p64 (__b); ++ uint32x2_t __c = vceq_u32 (__t_a, __t_b); ++ uint32x2_t __m = vpmin_u32 (__c, __c); ++ return vreinterpret_u64_u32 (__m); ++} ++ ++/* The vtst_p64 intrinsic does not map to a single instruction. ++ We emulate it in way similar to vceq_p64 above but here we do ++ a reduction with max since if any two corresponding bits ++ in the two poly64_t's match, then the whole result must be all ones. */ ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vtst_p64 (poly64x1_t __a, poly64x1_t __b) ++{ ++ uint32x2_t __t_a = vreinterpret_u32_p64 (__a); ++ uint32x2_t __t_b = vreinterpret_u32_p64 (__b); ++ uint32x2_t __c = vtst_u32 (__t_a, __t_b); ++ uint32x2_t __m = vpmax_u32 (__c, __c); ++ return vreinterpret_u64_u32 (__m); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaeseq_u8 (uint8x16_t __data, uint8x16_t __key) ++{ ++ return __builtin_arm_crypto_aese (__data, __key); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesdq_u8 (uint8x16_t __data, uint8x16_t __key) ++{ ++ return __builtin_arm_crypto_aesd (__data, __key); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesmcq_u8 (uint8x16_t __data) ++{ ++ return __builtin_arm_crypto_aesmc (__data); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesimcq_u8 (uint8x16_t __data) ++{ ++ return __builtin_arm_crypto_aesimc (__data); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vsha1h_u32 (uint32_t __hash_e) ++{ ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ __t = __builtin_arm_crypto_sha1h (__t); ++ return vgetq_lane_u32 (__t, 0); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha1cq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) ++{ ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1c (__hash_abcd, __t, __wk); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha1pq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) ++{ ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1p (__hash_abcd, __t, __wk); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha1mq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) ++{ ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1m (__hash_abcd, __t, __wk); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha1su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7, uint32x4_t __w8_11) ++{ ++ return __builtin_arm_crypto_sha1su0 (__w0_3, __w4_7, __w8_11); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha1su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w12_15) ++{ ++ return __builtin_arm_crypto_sha1su1 (__tw0_3, __w12_15); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha256hq_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk) ++{ ++ return __builtin_arm_crypto_sha256h (__hash_abcd, __hash_efgh, __wk); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha256h2q_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk) ++{ ++ return __builtin_arm_crypto_sha256h2 (__hash_abcd, __hash_efgh, __wk); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha256su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7) ++{ ++ return __builtin_arm_crypto_sha256su0 (__w0_3, __w4_7); ++} ++ ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vsha256su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w8_11, uint32x4_t __w12_15) ++{ ++ return __builtin_arm_crypto_sha256su1 (__tw0_3, __w8_11, __w12_15); ++} ++ ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vmull_p64 (poly64_t __a, poly64_t __b) ++{ ++ return (poly128_t) __builtin_arm_crypto_vmullp64 ((uint64_t) __a, (uint64_t) __b); ++} ++ ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vmull_high_p64 (poly64x2_t __a, poly64x2_t __b) ++{ ++ poly64_t __t1 = vget_high_p64 (__a); ++ poly64_t __t2 = vget_high_p64 (__b); ++ ++ return (poly128_t) __builtin_arm_crypto_vmullp64 ((uint64_t) __t1, (uint64_t) __t2); ++} ++ ++#endif ++" +--- a/src/gcc/config/arm/constraints.md ++++ b/src/gcc/config/arm/constraints.md +@@ -21,7 +21,7 @@ + ;; The following register constraints have been used: + ;; - in ARM/Thumb-2 state: t, w, x, y, z + ;; - in Thumb state: h, b +-;; - in both states: l, c, k ++;; - in both states: l, c, k, q, US + ;; In ARM state, 'l' is an alias for 'r' + ;; 'f' and 'v' were previously used for FPA and MAVERICK registers. + +@@ -86,6 +86,9 @@ + (define_register_constraint "k" "STACK_REG" + "@internal The stack register.") + ++(define_register_constraint "q" "(TARGET_ARM && TARGET_LDRD) ? CORE_REGS : GENERAL_REGS" ++ "@internal In ARM state with LDRD support, core registers, otherwise general registers.") ++ + (define_register_constraint "b" "TARGET_THUMB ? BASE_REGS : NO_REGS" + "@internal + Thumb only. The union of the low registers and the stack register.") +@@ -93,6 +96,9 @@ + (define_register_constraint "c" "CC_REG" + "@internal The condition code register.") + ++(define_register_constraint "Cs" "CALLER_SAVE_REGS" ++ "@internal The caller save registers. Useful for sibcalls.") ++ + (define_constraint "I" + "In ARM/Thumb-2 state a constant that can be used as an immediate value in a + Data Processing instruction. In Thumb-1 state a constant in the range +@@ -164,9 +170,9 @@ + && ival > 1020 && ival <= 1275"))) + + (define_constraint "Pd" +- "@internal In Thumb-1 state a constant in the range 0 to 7" ++ "@internal In Thumb state a constant in the range 0 to 7" + (and (match_code "const_int") +- (match_test "TARGET_THUMB1 && ival >= 0 && ival <= 7"))) ++ (match_test "TARGET_THUMB && ival >= 0 && ival <= 7"))) + + (define_constraint "Pe" + "@internal In Thumb-1 state a constant in the range 256 to +510" +@@ -208,6 +214,11 @@ + (and (match_code "const_int") + (match_test "TARGET_THUMB2 && ival >= 0 && ival <= 255"))) + ++(define_constraint "Pz" ++ "@internal In Thumb-2 state the constant 0" ++ (and (match_code "const_int") ++ (match_test "TARGET_THUMB2 && (ival == 0)"))) ++ + (define_constraint "G" + "In ARM/Thumb-2 state the floating-point constant 0." + (and (match_code "const_double") +@@ -248,6 +259,24 @@ + (and (match_code "const_int") + (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, PLUS)"))) + ++(define_constraint "De" ++ "@internal ++ In ARM/Thumb-2 state a const_int that can be used by insn anddi." ++ (and (match_code "const_int") ++ (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, AND)"))) ++ ++(define_constraint "Df" ++ "@internal ++ In ARM/Thumb-2 state a const_int that can be used by insn iordi." ++ (and (match_code "const_int") ++ (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, IOR)"))) ++ ++(define_constraint "Dg" ++ "@internal ++ In ARM/Thumb-2 state a const_int that can be used by insn xordi." ++ (and (match_code "const_int") ++ (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, XOR)"))) ++ + (define_constraint "Di" + "@internal + In ARM/Thumb-2 state a const_int or const_double where both the high +@@ -305,6 +334,9 @@ + (and (match_code "const_double") + (match_test "TARGET_32BIT && TARGET_VFP && vfp3_const_double_for_fract_bits (op)"))) + ++(define_register_constraint "Ts" "(arm_restrict_it) ? LO_REGS : GENERAL_REGS" ++ "For arm_restrict_it the core registers @code{r0}-@code{r7}. GENERAL_REGS otherwise.") ++ + (define_memory_constraint "Ua" + "@internal + An address valid for loading/storing register exclusive" +@@ -385,6 +417,12 @@ + 0) + && GET_CODE (XEXP (op, 0)) != POST_INC"))) + ++(define_constraint "US" ++ "@internal ++ US is a symbol reference." ++ (match_code "symbol_ref") ++) ++ + ;; We used to have constraint letters for S and R in ARM state, but + ;; all uses of these now appear to have been removed. + +@@ -391,3 +429,4 @@ + ;; Additionally, we used to have a Q constraint in Thumb state, but + ;; this wasn't really a valid memory constraint. Again, all uses of + ;; this now seem to have been removed. ++ +--- a/src/gcc/config/arm/cortex-a7.md ++++ b/src/gcc/config/arm/cortex-a7.md +@@ -88,9 +88,9 @@ + ;; ALU instruction with an immediate operand can dual-issue. + (define_insn_reservation "cortex_a7_alu_imm" 2 + (and (eq_attr "tune" "cortexa7") +- (and (ior (eq_attr "type" "simple_alu_imm") +- (ior (eq_attr "type" "simple_alu_shift") +- (and (eq_attr "insn" "mov") ++ (and (ior (eq_attr "type" "arlo_imm,mov_imm,mvn_imm") ++ (ior (eq_attr "type" "extend") ++ (and (eq_attr "type" "mov_reg,mov_shift,mov_shift_reg") + (not (eq_attr "length" "8"))))) + (eq_attr "neon_type" "none"))) + "cortex_a7_ex2|cortex_a7_ex1") +@@ -99,13 +99,15 @@ + ;; with a younger immediate-based instruction. + (define_insn_reservation "cortex_a7_alu_reg" 2 + (and (eq_attr "tune" "cortexa7") +- (and (eq_attr "type" "alu_reg") ++ (and (eq_attr "type" "arlo_reg,shift,shift_reg,mov_reg,mvn_reg") + (eq_attr "neon_type" "none"))) + "cortex_a7_ex1") + + (define_insn_reservation "cortex_a7_alu_shift" 2 + (and (eq_attr "tune" "cortexa7") +- (and (eq_attr "type" "alu_shift,alu_shift_reg") ++ (and (eq_attr "type" "arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg") + (eq_attr "neon_type" "none"))) + "cortex_a7_ex1") + +@@ -127,8 +129,9 @@ + + (define_insn_reservation "cortex_a7_mul" 2 + (and (eq_attr "tune" "cortexa7") +- (and (eq_attr "type" "mult") +- (eq_attr "neon_type" "none"))) ++ (and (eq_attr "neon_type" "none") ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes")))) + "cortex_a7_both") + + ;; Forward the result of a multiply operation to the accumulator +@@ -140,7 +143,7 @@ + ;; The latency depends on the operands, so we use an estimate here. + (define_insn_reservation "cortex_a7_idiv" 5 + (and (eq_attr "tune" "cortexa7") +- (eq_attr "insn" "udiv,sdiv")) ++ (eq_attr "type" "udiv,sdiv")) + "cortex_a7_both*5") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/arm-arches.def ++++ b/src/gcc/config/arm/arm-arches.def +@@ -53,6 +53,7 @@ + ARM_ARCH("armv7-r", cortexr4, 7R, FL_CO_PROC | FL_FOR_ARCH7R) + ARM_ARCH("armv7-m", cortexm3, 7M, FL_CO_PROC | FL_FOR_ARCH7M) + ARM_ARCH("armv7e-m", cortexm4, 7EM, FL_CO_PROC | FL_FOR_ARCH7EM) +-ARM_ARCH("armv8-a", cortexa15, 8A, FL_CO_PROC | FL_FOR_ARCH8A) ++ARM_ARCH("armv8-a", cortexa53, 8A, FL_CO_PROC | FL_FOR_ARCH8A) ++ARM_ARCH("armv8-a+crc",cortexa53, 8A,FL_CO_PROC | FL_CRC32 | FL_FOR_ARCH8A) + ARM_ARCH("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT) + ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2) +--- a/src/gcc/config/arm/t-arm ++++ b/src/gcc/config/arm/t-arm +@@ -39,6 +39,7 @@ + $(srcdir)/config/arm/cortex-a8-neon.md \ + $(srcdir)/config/arm/cortex-a9.md \ + $(srcdir)/config/arm/cortex-a9-neon.md \ ++ $(srcdir)/config/arm/cortex-a53.md \ + $(srcdir)/config/arm/cortex-m4-fpu.md \ + $(srcdir)/config/arm/cortex-m4.md \ + $(srcdir)/config/arm/cortex-r4f.md \ +@@ -52,6 +53,7 @@ + $(srcdir)/config/arm/iwmmxt.md \ + $(srcdir)/config/arm/iwmmxt2.md \ + $(srcdir)/config/arm/ldmstm.md \ ++ $(srcdir)/config/arm/ldrdstrd.md \ + $(srcdir)/config/arm/marvell-f-iwmmxt.md \ + $(srcdir)/config/arm/neon.md \ + $(srcdir)/config/arm/predicates.md \ +@@ -84,7 +86,8 @@ + $(GGC_H) except.h $(C_PRAGMA_H) $(TM_P_H) \ + $(TARGET_H) $(TARGET_DEF_H) debug.h langhooks.h $(DF_H) \ + intl.h libfuncs.h $(PARAMS_H) $(OPTS_H) $(srcdir)/config/arm/arm-cores.def \ +- $(srcdir)/config/arm/arm-arches.def $(srcdir)/config/arm/arm-fpus.def ++ $(srcdir)/config/arm/arm-arches.def $(srcdir)/config/arm/arm-fpus.def \ ++ $(srcdir)/config/arm/arm_neon_builtins.def + + arm-c.o: $(srcdir)/config/arm/arm-c.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TM_H) $(TREE_H) output.h $(C_COMMON_H) +--- a/src/gcc/config/arm/arm.opt ++++ b/src/gcc/config/arm/arm.opt +@@ -239,6 +239,10 @@ + Target Report Var(target_word_relocations) Init(TARGET_DEFAULT_WORD_RELOCATIONS) + Only generate absolute relocations on word sized values. + ++mrestrict-it ++Target Report Var(arm_restrict_it) Init(2) ++Generate IT blocks appropriate for ARMv8. ++ + mfix-cortex-m3-ldrd + Target Report Var(fix_cm3_ldrd) Init(2) + Avoid overlapping destination and address registers on LDRD instructions +@@ -247,3 +251,7 @@ + munaligned-access + Target Report Var(unaligned_access) Init(2) + Enable unaligned word and halfword accesses to packed data. ++ ++mneon-for-64bits ++Target Report RejectNegative Var(use_neon_for_64bits) Init(0) ++Use Neon to perform 64-bits operations rather than core registers. +--- a/src/gcc/config/arm/arm926ejs.md ++++ b/src/gcc/config/arm/arm926ejs.md +@@ -58,7 +58,9 @@ + ;; ALU operations with no shifted operand + (define_insn_reservation "9_alu_op" 1 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,extend,arlo_shift,\ ++ mov_imm,mov_reg,mov_shift,\ ++ mvn_imm,mvn_reg,mvn_shift")) + "e,m,w") + + ;; ALU operations with a shift-by-register operand +@@ -67,7 +69,7 @@ + ;; the execute stage. + (define_insn_reservation "9_alu_shift_reg_op" 2 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "type" "alu_shift_reg")) ++ (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")) + "e*2,m,w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -81,32 +83,32 @@ + + (define_insn_reservation "9_mult1" 3 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "smlalxy,mul,mla")) ++ (eq_attr "type" "smlalxy,mul,mla")) + "e*2,m,w") + + (define_insn_reservation "9_mult2" 4 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "muls,mlas")) ++ (eq_attr "type" "muls,mlas")) + "e*3,m,w") + + (define_insn_reservation "9_mult3" 4 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "umull,umlal,smull,smlal")) ++ (eq_attr "type" "umull,umlal,smull,smlal")) + "e*3,m,w") + + (define_insn_reservation "9_mult4" 5 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "umulls,umlals,smulls,smlals")) ++ (eq_attr "type" "umulls,umlals,smulls,smlals")) + "e*4,m,w") + + (define_insn_reservation "9_mult5" 2 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "smulxy,smlaxy,smlawx")) ++ (eq_attr "type" "smulxy,smlaxy,smlawx")) + "e,m,w") + + (define_insn_reservation "9_mult6" 3 + (and (eq_attr "tune" "arm926ejs") +- (eq_attr "insn" "smlalxy")) ++ (eq_attr "type" "smlalxy")) + "e*2,m,w") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/ldrdstrd.md ++++ b/src/gcc/config/arm/ldrdstrd.md +@@ -0,0 +1,260 @@ ++;; ARM ldrd/strd peephole optimizations. ++;; ++;; Copyright (C) 2013 Free Software Foundation, Inc. ++;; ++;; Written by Greta Yorsh ++ ++;; This file is part of GCC. ++;; ++;; GCC is free software; you can redistribute it and/or modify it ++;; under the terms of the GNU General Public License as published by ++;; the Free Software Foundation; either version 3, or (at your option) ++;; any later version. ++;; ++;; GCC is distributed in the hope that it will be useful, but ++;; WITHOUT ANY WARRANTY; without even the implied warranty of ++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++;; General Public License for more details. ++;; ++;; You should have received a copy of the GNU General Public License ++;; along with GCC; see the file COPYING3. If not see ++;; . ++ ++;; The following peephole optimizations identify consecutive memory ++;; accesses, and try to rearrange the operands to enable generation of ++;; ldrd/strd. ++ ++(define_peephole2 ; ldrd ++ [(set (match_operand:SI 0 "arm_general_register_operand" "") ++ (match_operand:SI 2 "memory_operand" "")) ++ (set (match_operand:SI 1 "arm_general_register_operand" "") ++ (match_operand:SI 3 "memory_operand" ""))] ++ "TARGET_LDRD ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)" ++ [(const_int 0)] ++{ ++ if (!gen_operands_ldrd_strd (operands, true, false, false)) ++ FAIL; ++ else if (TARGET_ARM) ++ { ++ /* In ARM state, the destination registers of LDRD/STRD must be ++ consecutive. We emit DImode access. */ ++ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ /* Emit [(set (match_dup 0) (match_dup 2))] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[2])); ++ DONE; ++ } ++ else if (TARGET_THUMB2) ++ { ++ /* Emit the pattern: ++ [(parallel [(set (match_dup 0) (match_dup 2)) ++ (set (match_dup 1) (match_dup 3))])] */ ++ rtx t1 = gen_rtx_SET (VOIDmode, operands[0], operands[2]); ++ rtx t2 = gen_rtx_SET (VOIDmode, operands[1], operands[3]); ++ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); ++ DONE; ++ } ++}) ++ ++(define_peephole2 ; strd ++ [(set (match_operand:SI 2 "memory_operand" "") ++ (match_operand:SI 0 "arm_general_register_operand" "")) ++ (set (match_operand:SI 3 "memory_operand" "") ++ (match_operand:SI 1 "arm_general_register_operand" ""))] ++ "TARGET_LDRD ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)" ++ [(const_int 0)] ++{ ++ if (!gen_operands_ldrd_strd (operands, false, false, false)) ++ FAIL; ++ else if (TARGET_ARM) ++ { ++ /* In ARM state, the destination registers of LDRD/STRD must be ++ consecutive. We emit DImode access. */ ++ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ /* Emit [(set (match_dup 2) (match_dup 0))] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[2], operands[0])); ++ DONE; ++ } ++ else if (TARGET_THUMB2) ++ { ++ /* Emit the pattern: ++ [(parallel [(set (match_dup 2) (match_dup 0)) ++ (set (match_dup 3) (match_dup 1))])] */ ++ rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]); ++ rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]); ++ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); ++ DONE; ++ } ++}) ++ ++;; The following peepholes reorder registers to enable LDRD/STRD. ++(define_peephole2 ; strd of constants ++ [(set (match_operand:SI 0 "arm_general_register_operand" "") ++ (match_operand:SI 4 "const_int_operand" "")) ++ (set (match_operand:SI 2 "memory_operand" "") ++ (match_dup 0)) ++ (set (match_operand:SI 1 "arm_general_register_operand" "") ++ (match_operand:SI 5 "const_int_operand" "")) ++ (set (match_operand:SI 3 "memory_operand" "") ++ (match_dup 1))] ++ "TARGET_LDRD ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)" ++ [(const_int 0)] ++{ ++ if (!gen_operands_ldrd_strd (operands, false, true, false)) ++ FAIL; ++ else if (TARGET_ARM) ++ { ++ rtx tmp = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ /* Emit the pattern: ++ [(set (match_dup 0) (match_dup 4)) ++ (set (match_dup 1) (match_dup 5)) ++ (set (match_dup 2) tmp)] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[2], tmp)); ++ DONE; ++ } ++ else if (TARGET_THUMB2) ++ { ++ /* Emit the pattern: ++ [(set (match_dup 0) (match_dup 4)) ++ (set (match_dup 1) (match_dup 5)) ++ (parallel [(set (match_dup 2) (match_dup 0)) ++ (set (match_dup 3) (match_dup 1))])] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5])); ++ rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]); ++ rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]); ++ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); ++ DONE; ++ } ++}) ++ ++(define_peephole2 ; strd of constants ++ [(set (match_operand:SI 0 "arm_general_register_operand" "") ++ (match_operand:SI 4 "const_int_operand" "")) ++ (set (match_operand:SI 1 "arm_general_register_operand" "") ++ (match_operand:SI 5 "const_int_operand" "")) ++ (set (match_operand:SI 2 "memory_operand" "") ++ (match_dup 0)) ++ (set (match_operand:SI 3 "memory_operand" "") ++ (match_dup 1))] ++ "TARGET_LDRD ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)" ++ [(const_int 0)] ++{ ++ if (!gen_operands_ldrd_strd (operands, false, true, false)) ++ FAIL; ++ else if (TARGET_ARM) ++ { ++ rtx tmp = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ /* Emit the pattern ++ [(set (match_dup 0) (match_dup 4)) ++ (set (match_dup 1) (match_dup 5)) ++ (set (match_dup 2) tmp)] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[2], tmp)); ++ DONE; ++ } ++ else if (TARGET_THUMB2) ++ { ++ /* Emit the pattern: ++ [(set (match_dup 0) (match_dup 4)) ++ (set (match_dup 1) (match_dup 5)) ++ (parallel [(set (match_dup 2) (match_dup 0)) ++ (set (match_dup 3) (match_dup 1))])] */ ++ emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4])); ++ emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5])); ++ rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]); ++ rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]); ++ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); ++ DONE; ++ } ++}) ++ ++;; The following two peephole optimizations are only relevant for ARM ++;; mode where LDRD/STRD require consecutive registers. ++ ++(define_peephole2 ; swap the destination registers of two loads ++ ; before a commutative operation. ++ [(set (match_operand:SI 0 "arm_general_register_operand" "") ++ (match_operand:SI 2 "memory_operand" "")) ++ (set (match_operand:SI 1 "arm_general_register_operand" "") ++ (match_operand:SI 3 "memory_operand" "")) ++ (set (match_operand:SI 4 "arm_general_register_operand" "") ++ (match_operator:SI 5 "commutative_binary_operator" ++ [(match_operand 6 "arm_general_register_operand" "") ++ (match_operand 7 "arm_general_register_operand" "") ]))] ++ "TARGET_LDRD && TARGET_ARM ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun) ++ && ( ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7]))) ++ ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6])))) ++ && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4])) ++ && (peep2_reg_dead_p (3, operands[1]) || rtx_equal_p (operands[1], operands[4]))" ++ [(set (match_dup 0) (match_dup 2)) ++ (set (match_dup 4) (match_op_dup 5 [(match_dup 6) (match_dup 7)]))] ++ { ++ if (!gen_operands_ldrd_strd (operands, true, false, true)) ++ { ++ FAIL; ++ } ++ else ++ { ++ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ } ++ } ++) ++ ++(define_peephole2 ; swap the destination registers of two loads ++ ; before a commutative operation that sets the flags. ++ [(set (match_operand:SI 0 "arm_general_register_operand" "") ++ (match_operand:SI 2 "memory_operand" "")) ++ (set (match_operand:SI 1 "arm_general_register_operand" "") ++ (match_operand:SI 3 "memory_operand" "")) ++ (parallel ++ [(set (match_operand:SI 4 "arm_general_register_operand" "") ++ (match_operator:SI 5 "commutative_binary_operator" ++ [(match_operand 6 "arm_general_register_operand" "") ++ (match_operand 7 "arm_general_register_operand" "") ])) ++ (clobber (reg:CC CC_REGNUM))])] ++ "TARGET_LDRD && TARGET_ARM ++ && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun) ++ && ( ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7]))) ++ ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6])))) ++ && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4])) ++ && (peep2_reg_dead_p (3, operands[1]) || rtx_equal_p (operands[1], operands[4]))" ++ [(set (match_dup 0) (match_dup 2)) ++ (parallel ++ [(set (match_dup 4) ++ (match_op_dup 5 [(match_dup 6) (match_dup 7)])) ++ (clobber (reg:CC CC_REGNUM))])] ++ { ++ if (!gen_operands_ldrd_strd (operands, true, false, true)) ++ { ++ FAIL; ++ } ++ else ++ { ++ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); ++ operands[2] = adjust_address (operands[2], DImode, 0); ++ } ++ } ++) ++ ++;; TODO: Handle LDRD/STRD with writeback: ++;; (a) memory operands can be POST_INC, POST_DEC, PRE_MODIFY, POST_MODIFY ++;; (b) Patterns may be followed by an update of the base address. +--- a/src/gcc/config/arm/predicates.md ++++ b/src/gcc/config/arm/predicates.md +@@ -31,6 +31,28 @@ + || REGNO_REG_CLASS (REGNO (op)) != NO_REGS)); + }) + ++(define_predicate "imm_for_neon_inv_logic_operand" ++ (match_code "const_vector") ++{ ++ return (TARGET_NEON ++ && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL)); ++}) ++ ++(define_predicate "neon_inv_logic_op2" ++ (ior (match_operand 0 "imm_for_neon_inv_logic_operand") ++ (match_operand 0 "s_register_operand"))) ++ ++(define_predicate "imm_for_neon_logic_operand" ++ (match_code "const_vector") ++{ ++ return (TARGET_NEON ++ && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL)); ++}) ++ ++(define_predicate "neon_logic_op2" ++ (ior (match_operand 0 "imm_for_neon_logic_operand") ++ (match_operand 0 "s_register_operand"))) ++ + ;; Any general register. + (define_predicate "arm_hard_general_register_operand" + (match_code "reg") +@@ -151,6 +173,23 @@ + (ior (match_operand 0 "arm_rhs_operand") + (match_operand 0 "arm_neg_immediate_operand"))) + ++(define_predicate "arm_anddi_operand_neon" ++ (ior (match_operand 0 "s_register_operand") ++ (and (match_code "const_int") ++ (match_test "const_ok_for_dimode_op (INTVAL (op), AND)")) ++ (match_operand 0 "neon_inv_logic_op2"))) ++ ++(define_predicate "arm_iordi_operand_neon" ++ (ior (match_operand 0 "s_register_operand") ++ (and (match_code "const_int") ++ (match_test "const_ok_for_dimode_op (INTVAL (op), IOR)")) ++ (match_operand 0 "neon_logic_op2"))) ++ ++(define_predicate "arm_xordi_operand" ++ (ior (match_operand 0 "s_register_operand") ++ (and (match_code "const_int") ++ (match_test "const_ok_for_dimode_op (INTVAL (op), XOR)")))) ++ + (define_predicate "arm_adddi_operand" + (ior (match_operand 0 "s_register_operand") + (and (match_code "const_int") +@@ -213,6 +252,10 @@ + (and (match_code "plus,minus,ior,xor,and") + (match_test "mode == GET_MODE (op)"))) + ++(define_special_predicate "shiftable_operator_strict_it" ++ (and (match_code "plus,and") ++ (match_test "mode == GET_MODE (op)"))) ++ + ;; True for logical binary operators. + (define_special_predicate "logical_binary_operator" + (and (match_code "ior,xor,and") +@@ -276,6 +319,24 @@ + (define_special_predicate "lt_ge_comparison_operator" + (match_code "lt,ge")) + ++;; The vsel instruction only accepts the ARM condition codes listed below. ++(define_special_predicate "arm_vsel_comparison_operator" ++ (and (match_operand 0 "expandable_comparison_operator") ++ (match_test "maybe_get_arm_condition_code (op) == ARM_GE ++ || maybe_get_arm_condition_code (op) == ARM_GT ++ || maybe_get_arm_condition_code (op) == ARM_EQ ++ || maybe_get_arm_condition_code (op) == ARM_VS ++ || maybe_get_arm_condition_code (op) == ARM_LT ++ || maybe_get_arm_condition_code (op) == ARM_LE ++ || maybe_get_arm_condition_code (op) == ARM_NE ++ || maybe_get_arm_condition_code (op) == ARM_VC"))) ++ ++(define_special_predicate "arm_cond_move_operator" ++ (if_then_else (match_test "arm_restrict_it") ++ (and (match_test "TARGET_FPU_ARMV8") ++ (match_operand 0 "arm_vsel_comparison_operator")) ++ (match_operand 0 "expandable_comparison_operator"))) ++ + (define_special_predicate "noov_comparison_operator" + (match_code "lt,ge,eq,ne")) + +@@ -512,28 +573,6 @@ + (ior (match_operand 0 "s_register_operand") + (match_operand 0 "imm_for_neon_rshift_operand"))) + +-(define_predicate "imm_for_neon_logic_operand" +- (match_code "const_vector") +-{ +- return (TARGET_NEON +- && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL)); +-}) +- +-(define_predicate "imm_for_neon_inv_logic_operand" +- (match_code "const_vector") +-{ +- return (TARGET_NEON +- && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL)); +-}) +- +-(define_predicate "neon_logic_op2" +- (ior (match_operand 0 "imm_for_neon_logic_operand") +- (match_operand 0 "s_register_operand"))) +- +-(define_predicate "neon_inv_logic_op2" +- (ior (match_operand 0 "imm_for_neon_inv_logic_operand") +- (match_operand 0 "s_register_operand"))) +- + ;; Predicates for named expanders that overlap multiple ISAs. + + (define_predicate "cmpdi_operand" +@@ -623,3 +662,7 @@ + (define_predicate "mem_noofs_operand" + (and (match_code "mem") + (match_code "reg" "0"))) ++ ++(define_predicate "call_insn_operand" ++ (ior (match_code "symbol_ref") ++ (match_operand 0 "s_register_operand"))) +--- a/src/gcc/config/arm/arm_neon.h ++++ b/src/gcc/config/arm/arm_neon.h +@@ -42,9 +42,13 @@ + typedef __builtin_neon_hi int16x4_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_si int32x2_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_di int64x1_t; ++typedef __builtin_neon_hf float16x4_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_sf float32x2_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_poly8 poly8x8_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_poly16 poly16x4_t __attribute__ ((__vector_size__ (8))); ++#ifdef __ARM_FEATURE_CRYPTO ++typedef __builtin_neon_poly64 poly64x1_t; ++#endif + typedef __builtin_neon_uqi uint8x8_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_uhi uint16x4_t __attribute__ ((__vector_size__ (8))); + typedef __builtin_neon_usi uint32x2_t __attribute__ ((__vector_size__ (8))); +@@ -56,6 +60,9 @@ + typedef __builtin_neon_sf float32x4_t __attribute__ ((__vector_size__ (16))); + typedef __builtin_neon_poly8 poly8x16_t __attribute__ ((__vector_size__ (16))); + typedef __builtin_neon_poly16 poly16x8_t __attribute__ ((__vector_size__ (16))); ++#ifdef __ARM_FEATURE_CRYPTO ++typedef __builtin_neon_poly64 poly64x2_t __attribute__ ((__vector_size__ (16))); ++#endif + typedef __builtin_neon_uqi uint8x16_t __attribute__ ((__vector_size__ (16))); + typedef __builtin_neon_uhi uint16x8_t __attribute__ ((__vector_size__ (16))); + typedef __builtin_neon_usi uint32x4_t __attribute__ ((__vector_size__ (16))); +@@ -64,6 +71,10 @@ + typedef float float32_t; + typedef __builtin_neon_poly8 poly8_t; + typedef __builtin_neon_poly16 poly16_t; ++#ifdef __ARM_FEATURE_CRYPTO ++typedef __builtin_neon_poly64 poly64_t; ++typedef __builtin_neon_poly128 poly128_t; ++#endif + + typedef struct int8x8x2_t + { +@@ -175,6 +186,22 @@ + poly16x8_t val[2]; + } poly16x8x2_t; + ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x1x2_t ++{ ++ poly64x1_t val[2]; ++} poly64x1x2_t; ++#endif ++ ++ ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x2x2_t ++{ ++ poly64x2_t val[2]; ++} poly64x2x2_t; ++#endif ++ ++ + typedef struct int8x8x3_t + { + int8x8_t val[3]; +@@ -285,6 +312,22 @@ + poly16x8_t val[3]; + } poly16x8x3_t; + ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x1x3_t ++{ ++ poly64x1_t val[3]; ++} poly64x1x3_t; ++#endif ++ ++ ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x2x3_t ++{ ++ poly64x2_t val[3]; ++} poly64x2x3_t; ++#endif ++ ++ + typedef struct int8x8x4_t + { + int8x8_t val[4]; +@@ -395,7 +438,23 @@ + poly16x8_t val[4]; + } poly16x8x4_t; + ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x1x4_t ++{ ++ poly64x1_t val[4]; ++} poly64x1x4_t; ++#endif + ++ ++#ifdef __ARM_FEATURE_CRYPTO ++typedef struct poly64x2x4_t ++{ ++ poly64x2_t val[4]; ++} poly64x2x4_t; ++#endif ++ ++ ++ + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vadd_s8 (int8x8_t __a, int8x8_t __b) + { +@@ -4360,6 +4419,14 @@ + return (uint64x2_t)__builtin_neon_vsra_nv2di ((int64x2_t) __a, (int64x2_t) __b, __c, 4); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vsri_n_p64 (poly64x1_t __a, poly64x1_t __b, const int __c) ++{ ++ return (poly64x1_t)__builtin_neon_vsri_ndi (__a, __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vsri_n_s8 (int8x8_t __a, int8x8_t __b, const int __c) + { +@@ -4420,6 +4487,14 @@ + return (poly16x4_t)__builtin_neon_vsri_nv4hi ((int16x4_t) __a, (int16x4_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vsriq_n_p64 (poly64x2_t __a, poly64x2_t __b, const int __c) ++{ ++ return (poly64x2_t)__builtin_neon_vsri_nv2di ((int64x2_t) __a, (int64x2_t) __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vsriq_n_s8 (int8x16_t __a, int8x16_t __b, const int __c) + { +@@ -4480,6 +4555,14 @@ + return (poly16x8_t)__builtin_neon_vsri_nv8hi ((int16x8_t) __a, (int16x8_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vsli_n_p64 (poly64x1_t __a, poly64x1_t __b, const int __c) ++{ ++ return (poly64x1_t)__builtin_neon_vsli_ndi (__a, __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vsli_n_s8 (int8x8_t __a, int8x8_t __b, const int __c) + { +@@ -4540,6 +4623,14 @@ + return (poly16x4_t)__builtin_neon_vsli_nv4hi ((int16x4_t) __a, (int16x4_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vsliq_n_p64 (poly64x2_t __a, poly64x2_t __b, const int __c) ++{ ++ return (poly64x2_t)__builtin_neon_vsli_nv2di ((int64x2_t) __a, (int64x2_t) __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vsliq_n_s8 (int8x16_t __a, int8x16_t __b, const int __c) + { +@@ -5308,6 +5399,14 @@ + return (uint64x2_t)__builtin_neon_vset_lanev2di ((__builtin_neon_di) __a, (int64x2_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vcreate_p64 (uint64_t __a) ++{ ++ return (poly64x1_t)__builtin_neon_vcreatedi ((__builtin_neon_di) __a); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vcreate_s8 (uint64_t __a) + { +@@ -5428,6 +5527,14 @@ + return (poly16x4_t)__builtin_neon_vdup_nv4hi ((__builtin_neon_hi) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vdup_n_p64 (poly64_t __a) ++{ ++ return (poly64x1_t)__builtin_neon_vdup_ndi ((__builtin_neon_di) __a); ++} ++ ++#endif + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vdup_n_s64 (int64_t __a) + { +@@ -5440,6 +5547,14 @@ + return (uint64x1_t)__builtin_neon_vdup_ndi ((__builtin_neon_di) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vdupq_n_p64 (poly64_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vdup_nv2di ((__builtin_neon_di) __a); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vdupq_n_s8 (int8_t __a) + { +@@ -5692,6 +5807,14 @@ + return (poly16x4_t)__builtin_neon_vdup_lanev4hi ((int16x4_t) __a, __b); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vdup_lane_p64 (poly64x1_t __a, const int __b) ++{ ++ return (poly64x1_t)__builtin_neon_vdup_lanedi (__a, __b); ++} ++ ++#endif + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vdup_lane_s64 (int64x1_t __a, const int __b) + { +@@ -5758,6 +5881,14 @@ + return (poly16x8_t)__builtin_neon_vdup_lanev8hi ((int16x4_t) __a, __b); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vdupq_lane_p64 (poly64x1_t __a, const int __b) ++{ ++ return (poly64x2_t)__builtin_neon_vdup_lanev2di (__a, __b); ++} ++ ++#endif + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vdupq_lane_s64 (int64x1_t __a, const int __b) + { +@@ -5770,6 +5901,14 @@ + return (uint64x2_t)__builtin_neon_vdup_lanev2di ((int64x1_t) __a, __b); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vcombine_p64 (poly64x1_t __a, poly64x1_t __b) ++{ ++ return (poly64x2_t)__builtin_neon_vcombinedi (__a, __b); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vcombine_s8 (int8x8_t __a, int8x8_t __b) + { +@@ -5836,6 +5975,14 @@ + return (poly16x8_t)__builtin_neon_vcombinev4hi ((int16x4_t) __a, (int16x4_t) __b); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vget_high_p64 (poly64x2_t __a) ++{ ++ return (poly64x1_t)__builtin_neon_vget_highv2di ((int64x2_t) __a); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vget_high_s8 (int8x16_t __a) + { +@@ -5956,6 +6103,14 @@ + return (poly16x4_t)__builtin_neon_vget_lowv8hi ((int16x8_t) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vget_low_p64 (poly64x2_t __a) ++{ ++ return (poly64x1_t)__builtin_neon_vget_lowv2di ((int64x2_t) __a); ++} ++ ++#endif + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vget_low_s64 (int64x2_t __a) + { +@@ -6016,6 +6171,22 @@ + return (uint32x4_t)__builtin_neon_vcvtv4sf (__a, 0); + } + ++#if ((__ARM_FP & 0x2) != 0) ++__extension__ static __inline float16x4_t __attribute__ ((__always_inline__)) ++vcvt_f16_f32 (float32x4_t __a) ++{ ++ return (float16x4_t)__builtin_neon_vcvtv4hfv4sf (__a); ++} ++ ++#endif ++#if ((__ARM_FP & 0x2) != 0) ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vcvt_f32_f16 (float16x4_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vcvtv4sfv4hf (__a); ++} ++ ++#endif + __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) + vcvt_n_s32_f32 (float32x2_t __a, const int __b) + { +@@ -7024,6 +7195,14 @@ + return (int64x2_t)__builtin_neon_vqdmlsl_nv2si (__a, __b, (__builtin_neon_si) __c, 1); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vext_p64 (poly64x1_t __a, poly64x1_t __b, const int __c) ++{ ++ return (poly64x1_t)__builtin_neon_vextdi (__a, __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vext_s8 (int8x8_t __a, int8x8_t __b, const int __c) + { +@@ -7090,6 +7269,14 @@ + return (poly16x4_t)__builtin_neon_vextv4hi ((int16x4_t) __a, (int16x4_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vextq_p64 (poly64x2_t __a, poly64x2_t __b, const int __c) ++{ ++ return (poly64x2_t)__builtin_neon_vextv2di ((int64x2_t) __a, (int64x2_t) __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vextq_s8 (int8x16_t __a, int8x16_t __b, const int __c) + { +@@ -7372,6 +7559,14 @@ + return (poly8x16_t) __builtin_shuffle (__a, (uint8x16_t) { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 }); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vbsl_p64 (uint64x1_t __a, poly64x1_t __b, poly64x1_t __c) ++{ ++ return (poly64x1_t)__builtin_neon_vbsldi ((int64x1_t) __a, __b, __c); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vbsl_s8 (uint8x8_t __a, int8x8_t __b, int8x8_t __c) + { +@@ -7438,6 +7633,14 @@ + return (poly16x4_t)__builtin_neon_vbslv4hi ((int16x4_t) __a, (int16x4_t) __b, (int16x4_t) __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vbslq_p64 (uint64x2_t __a, poly64x2_t __b, poly64x2_t __c) ++{ ++ return (poly64x2_t)__builtin_neon_vbslv2di ((int64x2_t) __a, (int64x2_t) __b, (int64x2_t) __c); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vbslq_s8 (uint8x16_t __a, int8x16_t __b, int8x16_t __c) + { +@@ -7990,6 +8193,14 @@ + return __rv; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vld1_p64 (const poly64_t * __a) ++{ ++ return (poly64x1_t)__builtin_neon_vld1di ((const __builtin_neon_di *) __a); ++} ++ ++#endif + __extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) + vld1_s8 (const int8_t * __a) + { +@@ -8056,6 +8267,14 @@ + return (poly16x4_t)__builtin_neon_vld1v4hi ((const __builtin_neon_hi *) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vld1q_p64 (const poly64_t * __a) ++{ ++ return (poly64x2_t)__builtin_neon_vld1v2di ((const __builtin_neon_di *) __a); ++} ++ ++#endif + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) + vld1q_s8 (const int8_t * __a) + { +@@ -8176,6 +8395,14 @@ + return (poly16x4_t)__builtin_neon_vld1_lanev4hi ((const __builtin_neon_hi *) __a, (int16x4_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vld1_lane_p64 (const poly64_t * __a, poly64x1_t __b, const int __c) ++{ ++ return (poly64x1_t)__builtin_neon_vld1_lanedi ((const __builtin_neon_di *) __a, __b, __c); ++} ++ ++#endif + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vld1_lane_s64 (const int64_t * __a, int64x1_t __b, const int __c) + { +@@ -8242,6 +8469,14 @@ + return (poly16x8_t)__builtin_neon_vld1_lanev8hi ((const __builtin_neon_hi *) __a, (int16x8_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vld1q_lane_p64 (const poly64_t * __a, poly64x2_t __b, const int __c) ++{ ++ return (poly64x2_t)__builtin_neon_vld1_lanev2di ((const __builtin_neon_di *) __a, (int64x2_t) __b, __c); ++} ++ ++#endif + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vld1q_lane_s64 (const int64_t * __a, int64x2_t __b, const int __c) + { +@@ -8308,6 +8543,14 @@ + return (poly16x4_t)__builtin_neon_vld1_dupv4hi ((const __builtin_neon_hi *) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vld1_dup_p64 (const poly64_t * __a) ++{ ++ return (poly64x1_t)__builtin_neon_vld1_dupdi ((const __builtin_neon_di *) __a); ++} ++ ++#endif + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vld1_dup_s64 (const int64_t * __a) + { +@@ -8374,6 +8617,14 @@ + return (poly16x8_t)__builtin_neon_vld1_dupv8hi ((const __builtin_neon_hi *) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vld1q_dup_p64 (const poly64_t * __a) ++{ ++ return (poly64x2_t)__builtin_neon_vld1_dupv2di ((const __builtin_neon_di *) __a); ++} ++ ++#endif + __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) + vld1q_dup_s64 (const int64_t * __a) + { +@@ -8386,7 +8637,15 @@ + return (uint64x2_t)__builtin_neon_vld1_dupv2di ((const __builtin_neon_di *) __a); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst1_p64 (poly64_t * __a, poly64x1_t __b) ++{ ++ __builtin_neon_vst1di ((__builtin_neon_di *) __a, __b); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst1_s8 (int8_t * __a, int8x8_t __b) + { + __builtin_neon_vst1v8qi ((__builtin_neon_qi *) __a, __b); +@@ -8452,7 +8711,15 @@ + __builtin_neon_vst1v4hi ((__builtin_neon_hi *) __a, (int16x4_t) __b); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst1q_p64 (poly64_t * __a, poly64x2_t __b) ++{ ++ __builtin_neon_vst1v2di ((__builtin_neon_di *) __a, (int64x2_t) __b); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst1q_s8 (int8_t * __a, int8x16_t __b) + { + __builtin_neon_vst1v16qi ((__builtin_neon_qi *) __a, __b); +@@ -8572,7 +8839,15 @@ + __builtin_neon_vst1_lanev4hi ((__builtin_neon_hi *) __a, (int16x4_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst1_lane_p64 (poly64_t * __a, poly64x1_t __b, const int __c) ++{ ++ __builtin_neon_vst1_lanedi ((__builtin_neon_di *) __a, __b, __c); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst1_lane_s64 (int64_t * __a, int64x1_t __b, const int __c) + { + __builtin_neon_vst1_lanedi ((__builtin_neon_di *) __a, __b, __c); +@@ -8638,7 +8913,15 @@ + __builtin_neon_vst1_lanev8hi ((__builtin_neon_hi *) __a, (int16x8_t) __b, __c); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst1q_lane_p64 (poly64_t * __a, poly64x2_t __b, const int __c) ++{ ++ __builtin_neon_vst1_lanev2di ((__builtin_neon_di *) __a, (int64x2_t) __b, __c); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst1q_lane_s64 (int64_t * __a, int64x2_t __b, const int __c) + { + __builtin_neon_vst1_lanev2di ((__builtin_neon_di *) __a, __b, __c); +@@ -8722,6 +9005,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x2_t __attribute__ ((__always_inline__)) ++vld2_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x2_t __i; __builtin_neon_ti __o; } __rv; ++ __rv.__o = __builtin_neon_vld2di ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x2_t __attribute__ ((__always_inline__)) + vld2_s64 (const int64_t * __a) + { +@@ -9017,6 +9310,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x2_t __attribute__ ((__always_inline__)) ++vld2_dup_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x2_t __i; __builtin_neon_ti __o; } __rv; ++ __rv.__o = __builtin_neon_vld2_dupdi ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x2_t __attribute__ ((__always_inline__)) + vld2_dup_s64 (const int64_t * __a) + { +@@ -9096,7 +9399,16 @@ + __builtin_neon_vst2v4hi ((__builtin_neon_hi *) __a, __bu.__o); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst2_p64 (poly64_t * __a, poly64x1x2_t __b) ++{ ++ union { poly64x1x2_t __i; __builtin_neon_ti __o; } __bu = { __b }; ++ __builtin_neon_vst2di ((__builtin_neon_di *) __a, __bu.__o); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst2_s64 (int64_t * __a, int64x1x2_t __b) + { + union { int64x1x2_t __i; __builtin_neon_ti __o; } __bu = { __b }; +@@ -9350,6 +9662,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x3_t __attribute__ ((__always_inline__)) ++vld3_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x3_t __i; __builtin_neon_ei __o; } __rv; ++ __rv.__o = __builtin_neon_vld3di ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x3_t __attribute__ ((__always_inline__)) + vld3_s64 (const int64_t * __a) + { +@@ -9645,6 +9967,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x3_t __attribute__ ((__always_inline__)) ++vld3_dup_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x3_t __i; __builtin_neon_ei __o; } __rv; ++ __rv.__o = __builtin_neon_vld3_dupdi ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x3_t __attribute__ ((__always_inline__)) + vld3_dup_s64 (const int64_t * __a) + { +@@ -9724,7 +10056,16 @@ + __builtin_neon_vst3v4hi ((__builtin_neon_hi *) __a, __bu.__o); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst3_p64 (poly64_t * __a, poly64x1x3_t __b) ++{ ++ union { poly64x1x3_t __i; __builtin_neon_ei __o; } __bu = { __b }; ++ __builtin_neon_vst3di ((__builtin_neon_di *) __a, __bu.__o); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst3_s64 (int64_t * __a, int64x1x3_t __b) + { + union { int64x1x3_t __i; __builtin_neon_ei __o; } __bu = { __b }; +@@ -9978,6 +10319,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x4_t __attribute__ ((__always_inline__)) ++vld4_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x4_t __i; __builtin_neon_oi __o; } __rv; ++ __rv.__o = __builtin_neon_vld4di ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x4_t __attribute__ ((__always_inline__)) + vld4_s64 (const int64_t * __a) + { +@@ -10273,6 +10624,16 @@ + return __rv.__i; + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1x4_t __attribute__ ((__always_inline__)) ++vld4_dup_p64 (const poly64_t * __a) ++{ ++ union { poly64x1x4_t __i; __builtin_neon_oi __o; } __rv; ++ __rv.__o = __builtin_neon_vld4_dupdi ((const __builtin_neon_di *) __a); ++ return __rv.__i; ++} ++ ++#endif + __extension__ static __inline int64x1x4_t __attribute__ ((__always_inline__)) + vld4_dup_s64 (const int64_t * __a) + { +@@ -10352,7 +10713,16 @@ + __builtin_neon_vst4v4hi ((__builtin_neon_hi *) __a, __bu.__o); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline void __attribute__ ((__always_inline__)) ++vst4_p64 (poly64_t * __a, poly64x1x4_t __b) ++{ ++ union { poly64x1x4_t __i; __builtin_neon_oi __o; } __bu = { __b }; ++ __builtin_neon_vst4di ((__builtin_neon_di *) __a, __bu.__o); ++} ++ ++#endif ++__extension__ static __inline void __attribute__ ((__always_inline__)) + vst4_s64 (int64_t * __a, int64x1x4_t __b) + { + union { int64x1x4_t __i; __builtin_neon_oi __o; } __bu = { __b }; +@@ -11016,23 +11386,25 @@ + + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_s8 (int8x8_t __a) ++vreinterpret_p8_p16 (poly16x4_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv8qi (__a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_s16 (int16x4_t __a) ++vreinterpret_p8_f32 (float32x2_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_s32 (int32x2_t __a) ++vreinterpret_p8_p64 (poly64x1_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qidi (__a); + } + ++#endif + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) + vreinterpret_p8_s64 (int64x1_t __a) + { +@@ -11040,101 +11412,79 @@ + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_f32 (float32x2_t __a) ++vreinterpret_p8_u64 (uint64x1_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_u8 (uint8x8_t __a) ++vreinterpret_p8_s8 (int8x8_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv8qi (__a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_u16 (uint16x4_t __a) ++vreinterpret_p8_s16 (int16x4_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_u32 (uint32x2_t __a) ++vreinterpret_p8_s32 (int32x2_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_u64 (uint64x1_t __a) ++vreinterpret_p8_u8 (uint8x8_t __a) + { +- return (poly8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); + } + + __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_p8_p16 (poly16x4_t __a) ++vreinterpret_p8_u16 (uint16x4_t __a) + { + return (poly8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_s8 (int8x16_t __a) ++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_p8_u32 (uint32x2_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv16qi (__a); ++ return (poly8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_s16 (int16x8_t __a) ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_p16_p8 (poly8x8_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); ++ return (poly16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_s32 (int32x4_t __a) ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_p16_f32 (float32x2_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); ++ return (poly16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_s64 (int64x2_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_p16_p64 (poly64x1_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); ++ return (poly16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_f32 (float32x4_t __a) ++#endif ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_p16_s64 (int64x1_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); ++ return (poly16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_u8 (uint8x16_t __a) ++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_p16_u64 (uint64x1_t __a) + { +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++ return (poly16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); + } + +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_u16 (uint16x8_t __a) +-{ +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); +-} +- +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_u32 (uint32x4_t __a) +-{ +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); +-} +- +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_u64 (uint64x2_t __a) +-{ +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); +-} +- +-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_p8_p16 (poly16x8_t __a) +-{ +- return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); +-} +- + __extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) + vreinterpret_p16_s8 (int8x8_t __a) + { +@@ -11154,18 +11504,6 @@ + } + + __extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_p16_s64 (int64x1_t __a) +-{ +- return (poly16x4_t)__builtin_neon_vreinterpretv4hidi (__a); +-} +- +-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_p16_f32 (float32x2_t __a) +-{ +- return (poly16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); +-} +- +-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) + vreinterpret_p16_u8 (uint8x8_t __a) + { + return (poly16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); +@@ -11183,78 +11521,38 @@ + return (poly16x4_t)__builtin_neon_vreinterpretv4hiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_p16_u64 (uint64x1_t __a) ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_f32_p8 (poly8x8_t __a) + { +- return (poly16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); ++ return (float32x2_t)__builtin_neon_vreinterpretv2sfv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_p16_p8 (poly8x8_t __a) ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_f32_p16 (poly16x4_t __a) + { +- return (poly16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); ++ return (float32x2_t)__builtin_neon_vreinterpretv2sfv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_s8 (int8x16_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_f32_p64 (poly64x1_t __a) + { +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi (__a); ++ return (float32x2_t)__builtin_neon_vreinterpretv2sfdi (__a); + } + +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_s16 (int16x8_t __a) ++#endif ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_f32_s64 (int64x1_t __a) + { +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv8hi (__a); ++ return (float32x2_t)__builtin_neon_vreinterpretv2sfdi (__a); + } + +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_s32 (int32x4_t __a) ++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_f32_u64 (uint64x1_t __a) + { +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4si (__a); ++ return (float32x2_t)__builtin_neon_vreinterpretv2sfdi ((int64x1_t) __a); + } + +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_s64 (int64x2_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_f32 (float32x4_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_u8 (uint8x16_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_u16 (uint16x8_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_u32 (uint32x4_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_u64 (uint64x2_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); +-} +- +-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_p16_p8 (poly8x16_t __a) +-{ +- return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); +-} +- + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vreinterpret_f32_s8 (int8x8_t __a) + { +@@ -11274,12 +11572,6 @@ + } + + __extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_f32_s64 (int64x1_t __a) +-{ +- return (float32x2_t)__builtin_neon_vreinterpretv2sfdi (__a); +-} +- +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) + vreinterpret_f32_u8 (uint8x8_t __a) + { + return (float32x2_t)__builtin_neon_vreinterpretv2sfv8qi ((int8x8_t) __a); +@@ -11297,85 +11589,127 @@ + return (float32x2_t)__builtin_neon_vreinterpretv2sfv2si ((int32x2_t) __a); + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_f32_u64 (uint64x1_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_p8 (poly8x8_t __a) + { +- return (float32x2_t)__builtin_neon_vreinterpretv2sfdi ((int64x1_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_f32_p8 (poly8x8_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_p16 (poly16x4_t __a) + { +- return (float32x2_t)__builtin_neon_vreinterpretv2sfv8qi ((int8x8_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_f32_p16 (poly16x4_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_f32 (float32x2_t __a) + { +- return (float32x2_t)__builtin_neon_vreinterpretv2sfv4hi ((int16x4_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv2sf (__a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_s8 (int8x16_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_s64 (int64x1_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi (__a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdidi (__a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_s16 (int16x8_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_u64 (uint64x1_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi (__a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdidi ((int64x1_t) __a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_s32 (int32x4_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_s8 (int8x8_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv4si (__a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv8qi (__a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_s64 (int64x2_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_s16 (int16x4_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv2di (__a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv4hi (__a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_u8 (uint8x16_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_s32 (int32x2_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi ((int8x16_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv2si (__a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_u16 (uint16x8_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_u8 (uint8x8_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi ((int16x8_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_u32 (uint32x4_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_u16 (uint16x4_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv4si ((int32x4_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_u64 (uint64x2_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_p64_u32 (uint32x2_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv2di ((int64x2_t) __a); ++ return (poly64x1_t)__builtin_neon_vreinterpretdiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_p8 (poly8x16_t __a) ++#endif ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_s64_p8 (poly8x8_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi ((int8x16_t) __a); ++ return (int64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_f32_p16 (poly16x8_t __a) ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_s64_p16 (poly16x4_t __a) + { +- return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi ((int16x8_t) __a); ++ return (int64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_s64_f32 (float32x2_t __a) ++{ ++ return (int64x1_t)__builtin_neon_vreinterpretdiv2sf (__a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_s64_p64 (poly64x1_t __a) ++{ ++ return (int64x1_t)__builtin_neon_vreinterpretdidi (__a); ++} ++ ++#endif ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_s64_u64 (uint64x1_t __a) ++{ ++ return (int64x1_t)__builtin_neon_vreinterpretdidi ((int64x1_t) __a); ++} ++ ++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vreinterpret_s64_s8 (int8x8_t __a) + { + return (int64x1_t)__builtin_neon_vreinterpretdiv8qi (__a); +@@ -11394,12 +11728,6 @@ + } + + __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_s64_f32 (float32x2_t __a) +-{ +- return (int64x1_t)__builtin_neon_vreinterpretdiv2sf (__a); +-} +- +-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) + vreinterpret_s64_u8 (uint8x8_t __a) + { + return (int64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); +@@ -11417,552 +11745,1206 @@ + return (int64x1_t)__builtin_neon_vreinterpretdiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_s64_u64 (uint64x1_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_p8 (poly8x8_t __a) + { +- return (int64x1_t)__builtin_neon_vreinterpretdidi ((int64x1_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_s64_p8 (poly8x8_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_p16 (poly16x4_t __a) + { +- return (int64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_s64_p16 (poly16x4_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_f32 (float32x2_t __a) + { +- return (int64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv2sf (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_s8 (int8x16_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_p64 (poly64x1_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div16qi (__a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdidi (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_s16 (int16x8_t __a) ++#endif ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_s64 (int64x1_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div8hi (__a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdidi (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_s32 (int32x4_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_s8 (int8x8_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div4si (__a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_f32 (float32x4_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_s16 (int16x4_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div4sf (__a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_u8 (uint8x16_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_s32 (int32x2_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv2si (__a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_u16 (uint16x8_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_u8 (uint8x8_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_u32 (uint32x4_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_u16 (uint16x4_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div4si ((int32x4_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_u64 (uint64x2_t __a) ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vreinterpret_u64_u32 (uint32x2_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div2di ((int64x2_t) __a); ++ return (uint64x1_t)__builtin_neon_vreinterpretdiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_p8 (poly8x16_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_p8 (poly8x8_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_s64_p16 (poly16x8_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_p16 (poly16x4_t __a) + { +- return (int64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_s8 (int8x8_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_f32 (float32x2_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi (__a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_s16 (int16x4_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_p64 (poly64x1_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi (__a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qidi (__a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_s32 (int32x2_t __a) ++#endif ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_s64 (int64x1_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv2si (__a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qidi (__a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_s64 (int64x1_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_u64 (uint64x1_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdidi (__a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_f32 (float32x2_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_s16 (int16x4_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv2sf (__a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_u8 (uint8x8_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_s32 (int32x2_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_u16 (uint16x4_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_u8 (uint8x8_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_u32 (uint32x2_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_u16 (uint16x4_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv2si ((int32x2_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_p8 (poly8x8_t __a) ++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_s8_u32 (uint32x2_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv8qi ((int8x8_t) __a); ++ return (int8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) +-vreinterpret_u64_p16 (poly16x4_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_p8 (poly8x8_t __a) + { +- return (uint64x1_t)__builtin_neon_vreinterpretdiv4hi ((int16x4_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_s8 (int8x16_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_p16 (poly16x4_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi (__a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_s16 (int16x8_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_f32 (float32x2_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi (__a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_s32 (int32x4_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_p64 (poly64x1_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div4si (__a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_s64 (int64x2_t __a) ++#endif ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_s64 (int64x1_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div2di (__a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_f32 (float32x4_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_u64 (uint64x1_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div4sf (__a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_u8 (uint8x16_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_s8 (int8x8_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi (__a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_u16 (uint16x8_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_s32 (int32x2_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv2si (__a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_u32 (uint32x4_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_u8 (uint8x8_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div4si ((int32x4_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_p8 (poly8x16_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_u16 (uint16x4_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) +-vreinterpretq_u64_p16 (poly16x8_t __a) ++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_s16_u32 (uint32x2_t __a) + { +- return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++ return (int16x4_t)__builtin_neon_vreinterpretv4hiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_s16 (int16x4_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_p8 (poly8x8_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_s32 (int32x2_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_p16 (poly16x4_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_s64 (int64x1_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_f32 (float32x2_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qidi (__a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv2sf (__a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_f32 (float32x2_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_p64 (poly64x1_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2sidi (__a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_u8 (uint8x8_t __a) ++#endif ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_s64 (int64x1_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2sidi (__a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_u16 (uint16x4_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_u64 (uint64x1_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2sidi ((int64x1_t) __a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_u32 (uint32x2_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_s8 (int8x8_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi (__a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_u64 (uint64x1_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_s16 (int16x4_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi (__a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_p8 (poly8x8_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_u8 (uint8x8_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_s8_p16 (poly16x4_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_u16 (uint16x4_t __a) + { +- return (int8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_s16 (int16x8_t __a) ++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_s32_u32 (uint32x2_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); ++ return (int32x2_t)__builtin_neon_vreinterpretv2siv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_s32 (int32x4_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_p8 (poly8x8_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_s64 (int64x2_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_p16 (poly16x4_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_f32 (float32x4_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_f32 (float32x2_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_u8 (uint8x16_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_p64 (poly64x1_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qidi (__a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_u16 (uint16x8_t __a) ++#endif ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_s64 (int64x1_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qidi (__a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_u32 (uint32x4_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_u64 (uint64x1_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_u64 (uint64x2_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_s8 (int8x8_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv8qi (__a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_p8 (poly8x16_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_s16 (int16x4_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); + } + +-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_s8_p16 (poly16x8_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_s32 (int32x2_t __a) + { +- return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_s8 (int8x8_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_u16 (uint16x4_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi (__a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_s32 (int32x2_t __a) ++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) ++vreinterpret_u8_u32 (uint32x2_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv2si (__a); ++ return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_s64 (int64x1_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_p8 (poly8x8_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hidi (__a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_f32 (float32x2_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_p16 (poly16x4_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_u8 (uint8x8_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_f32 (float32x2_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_u16 (uint16x4_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_p64 (poly64x1_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_u32 (uint32x2_t __a) ++#endif ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_s64 (int64x1_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv2si ((int32x2_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hidi (__a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_u64 (uint64x1_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_u64 (uint64x1_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_p8 (poly8x8_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_s8 (int8x8_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi (__a); + } + +-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_s16_p16 (poly16x4_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_s16 (int16x4_t __a) + { +- return (int16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv4hi (__a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_s8 (int8x16_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_s32 (int32x2_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi (__a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2si (__a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_s32 (int32x4_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_u8 (uint8x8_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv4si (__a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_s64 (int64x2_t __a) ++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) ++vreinterpret_u16_u32 (uint32x2_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); ++ return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2si ((int32x2_t) __a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_f32 (float32x4_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_p8 (poly8x8_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_u8 (uint8x16_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_p16 (poly16x4_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_u16 (uint16x8_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_f32 (float32x2_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv2sf (__a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_u32 (uint32x4_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_p64 (poly64x1_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2sidi (__a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_u64 (uint64x2_t __a) ++#endif ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_s64 (int64x1_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2sidi (__a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_p8 (poly8x16_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_u64 (uint64x1_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2sidi ((int64x1_t) __a); + } + +-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_s16_p16 (poly16x8_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_s8 (int8x8_t __a) + { +- return (int16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi (__a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_s8 (int8x8_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_s16 (int16x4_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi (__a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi (__a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_s16 (int16x4_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_s32 (int32x2_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi (__a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv2si (__a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_s64 (int64x1_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_u8 (uint8x8_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2sidi (__a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_f32 (float32x2_t __a) ++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) ++vreinterpret_u32_u16 (uint16x4_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv2sf (__a); ++ return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_u8 (uint8x8_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_p16 (poly16x8_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_u16 (uint16x4_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_f32 (float32x4_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_u32 (uint32x2_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_p64 (poly64x2_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv2si ((int32x2_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_u64 (uint64x1_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_p128 (poly128_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2sidi ((int64x1_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiti ((__builtin_neon_ti) __a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_p8 (poly8x8_t __a) ++#endif ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_s64 (int64x2_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); + } + +-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_s32_p16 (poly16x4_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_u64 (uint64x2_t __a) + { +- return (int32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_s8 (int8x16_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_s8 (int8x16_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv16qi (__a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv16qi (__a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_s16 (int16x8_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_s16 (int16x8_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv8hi (__a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_s64 (int64x2_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_s32 (int32x4_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv2di (__a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_f32 (float32x4_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_u8 (uint8x16_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv4sf (__a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_u8 (uint8x16_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_u16 (uint16x8_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_u16 (uint16x8_t __a) ++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_p8_u32 (uint32x4_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); ++ return (poly8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_u32 (uint32x4_t __a) ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_p8 (poly8x16_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv4si ((int32x4_t) __a); ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_s32_u64 (uint64x2_t __a) ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_f32 (float32x4_t __a) + { +- return (int32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); + } + ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_p64 (poly64x2_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_p128 (poly128_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_s64 (int64x2_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_u64 (uint64x2_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_s8 (int8x16_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi (__a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_s16 (int16x8_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv8hi (__a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_s32 (int32x4_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4si (__a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_u8 (uint8x16_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_u16 (uint16x8_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_p16_u32 (uint32x4_t __a) ++{ ++ return (poly16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_p8 (poly8x16_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_p16 (poly16x8_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi ((int16x8_t) __a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_p64 (poly64x2_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_p128 (poly128_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_s64 (int64x2_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv2di (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_u64 (uint64x2_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv2di ((int64x2_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_s8 (int8x16_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_s16 (int16x8_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_s32 (int32x4_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv4si (__a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_u8 (uint8x16_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_u16 (uint16x8_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_f32_u32 (uint32x4_t __a) ++{ ++ return (float32x4_t)__builtin_neon_vreinterpretv4sfv4si ((int32x4_t) __a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_p8 (poly8x16_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_p16 (poly16x8_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_f32 (float32x4_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div4sf (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_p128 (poly128_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2diti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_s64 (int64x2_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div2di (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_u64 (uint64x2_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_s8 (int8x16_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div16qi (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_s16 (int16x8_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div8hi (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_s32 (int32x4_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div4si (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_u8 (uint8x16_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_u16 (uint16x8_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_p64_u32 (uint32x4_t __a) ++{ ++ return (poly64x2_t)__builtin_neon_vreinterpretv2div4si ((int32x4_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_p8 (poly8x16_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv16qi ((int8x16_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_p16 (poly16x8_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv8hi ((int16x8_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_f32 (float32x4_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv4sf (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_p64 (poly64x2_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_s64 (int64x2_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv2di (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_u64 (uint64x2_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_s8 (int8x16_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv16qi (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_s16 (int16x8_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv8hi (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_s32 (int32x4_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv4si (__a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_u8 (uint8x16_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv16qi ((int8x16_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_u16 (uint16x8_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv8hi ((int16x8_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vreinterpretq_p128_u32 (uint32x4_t __a) ++{ ++ return (poly128_t)__builtin_neon_vreinterprettiv4si ((int32x4_t) __a); ++} ++ ++#endif ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_p8 (poly8x16_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_p16 (poly16x8_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_f32 (float32x4_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div4sf (__a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_p64 (poly64x2_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_p128 (poly128_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2diti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_u64 (uint64x2_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div2di ((int64x2_t) __a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_s8 (int8x16_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div16qi (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_s16 (int16x8_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div8hi (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_s32 (int32x4_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div4si (__a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_u8 (uint8x16_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_u16 (uint16x8_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_s64_u32 (uint32x4_t __a) ++{ ++ return (int64x2_t)__builtin_neon_vreinterpretv2div4si ((int32x4_t) __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_p8 (poly8x16_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_p16 (poly16x8_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_f32 (float32x4_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div4sf (__a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_p64 (poly64x2_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_p128 (poly128_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2diti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_s64 (int64x2_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div2di (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_s8 (int8x16_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_s16 (int16x8_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_s32 (int32x4_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div4si (__a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_u8 (uint8x16_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_u16 (uint16x8_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) ++vreinterpretq_u64_u32 (uint32x4_t __a) ++{ ++ return (uint64x2_t)__builtin_neon_vreinterpretv2div4si ((int32x4_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_p8 (poly8x16_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_p16 (poly16x8_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_f32 (float32x4_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_p64 (poly64x2_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_p128 (poly128_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_s64 (int64x2_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_u64 (uint64x2_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_s16 (int16x8_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_s32 (int32x4_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_u8 (uint8x16_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_u16 (uint16x8_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_s8_u32 (uint32x4_t __a) ++{ ++ return (int8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_p8 (poly8x16_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_p16 (poly16x8_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_f32 (float32x4_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); ++} ++ ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_p64 (poly64x2_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++} ++ ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_p128 (poly128_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiti ((__builtin_neon_ti) __a); ++} ++ ++#endif ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_s64 (int64x2_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_u64 (uint64x2_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_s8 (int8x16_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi (__a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_s32 (int32x4_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv4si (__a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_u8 (uint8x16_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_u16 (uint16x8_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++} ++ ++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_s16_u32 (uint32x4_t __a) ++{ ++ return (int16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); ++} ++ + __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) + vreinterpretq_s32_p8 (poly8x16_t __a) + { +@@ -11975,109 +12957,111 @@ + return (int32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_s8 (int8x8_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_f32 (float32x4_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv8qi (__a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv4sf (__a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_s16 (int16x4_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_p64 (poly64x2_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi (__a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_s32 (int32x2_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_p128 (poly128_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2si (__a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siti ((__builtin_neon_ti) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_s64 (int64x1_t __a) ++#endif ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_s64 (int64x2_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qidi (__a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv2di (__a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_f32 (float32x2_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_u64 (uint64x2_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2sf (__a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_u16 (uint16x4_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_s8 (int8x16_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv16qi (__a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_u32 (uint32x2_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_s16 (int16x8_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv2si ((int32x2_t) __a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv8hi (__a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_u64 (uint64x1_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_u8 (uint8x16_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qidi ((int64x1_t) __a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_p8 (poly8x8_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_u16 (uint16x8_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv8qi ((int8x8_t) __a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) +-vreinterpret_u8_p16 (poly16x4_t __a) ++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_s32_u32 (uint32x4_t __a) + { +- return (uint8x8_t)__builtin_neon_vreinterpretv8qiv4hi ((int16x4_t) __a); ++ return (int32x4_t)__builtin_neon_vreinterpretv4siv4si ((int32x4_t) __a); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_s8 (int8x16_t __a) ++vreinterpretq_u8_p8 (poly8x16_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv16qi (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_s16 (int16x8_t __a) ++vreinterpretq_u8_p16 (poly16x8_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_s32 (int32x4_t __a) ++vreinterpretq_u8_f32 (float32x4_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); + } + ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_s64 (int64x2_t __a) ++vreinterpretq_u8_p64 (poly64x2_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); + } + ++#endif ++#ifdef __ARM_FEATURE_CRYPTO + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_f32 (float32x4_t __a) ++vreinterpretq_u8_p128 (poly128_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4sf (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiti ((__builtin_neon_ti) __a); + } + ++#endif + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_u16 (uint16x8_t __a) ++vreinterpretq_u8_s64 (int64x2_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv2di (__a); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_u32 (uint32x4_t __a) +-{ +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); +-} +- +-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) + vreinterpretq_u8_u64 (uint64x2_t __a) + { + return (uint8x16_t)__builtin_neon_vreinterpretv16qiv2di ((int64x2_t) __a); +@@ -12084,75 +13068,79 @@ + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_p8 (poly8x16_t __a) ++vreinterpretq_u8_s8 (int8x16_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv16qi ((int8x16_t) __a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv16qi (__a); + } + + __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) +-vreinterpretq_u8_p16 (poly16x8_t __a) ++vreinterpretq_u8_s16 (int16x8_t __a) + { +- return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi (__a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_s8 (int8x8_t __a) ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_u8_s32 (int32x4_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4si (__a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_s16 (int16x4_t __a) ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_u8_u16 (uint16x8_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv4hi (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_s32 (int32x2_t __a) ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vreinterpretq_u8_u32 (uint32x4_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2si (__a); ++ return (uint8x16_t)__builtin_neon_vreinterpretv16qiv4si ((int32x4_t) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_s64 (int64x1_t __a) ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_p8 (poly8x16_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hidi (__a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_f32 (float32x2_t __a) ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_p16 (poly16x8_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2sf (__a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_u8 (uint8x8_t __a) ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_f32 (float32x4_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_u32 (uint32x2_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_p64 (poly64x2_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv2si ((int32x2_t) __a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_u64 (uint64x1_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_p128 (poly128_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hidi ((int64x1_t) __a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiti ((__builtin_neon_ti) __a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_p8 (poly8x8_t __a) ++#endif ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_s64 (int64x2_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv8qi ((int8x8_t) __a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); + } + +-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) +-vreinterpret_u16_p16 (poly16x4_t __a) ++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) ++vreinterpretq_u16_u64 (uint64x2_t __a) + { +- return (uint16x4_t)__builtin_neon_vreinterpretv4hiv4hi ((int16x4_t) __a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); + } + + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +@@ -12174,167 +13162,266 @@ + } + + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_s64 (int64x2_t __a) ++vreinterpretq_u16_u8 (uint8x16_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv2di (__a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); + } + + __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_f32 (float32x4_t __a) ++vreinterpretq_u16_u32 (uint32x4_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv4sf (__a); ++ return (uint16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); + } + +-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_u8 (uint8x16_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_p8 (poly8x16_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_u32 (uint32x4_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_p16 (poly16x8_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv4si ((int32x4_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_u64 (uint64x2_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_f32 (float32x4_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv2di ((int64x2_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv4sf (__a); + } + +-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_p8 (poly8x16_t __a) ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_p64 (poly64x2_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv16qi ((int8x16_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); + } + +-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) +-vreinterpretq_u16_p16 (poly16x8_t __a) ++#endif ++#ifdef __ARM_FEATURE_CRYPTO ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_p128 (poly128_t __a) + { +- return (uint16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siti ((__builtin_neon_ti) __a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_s8 (int8x8_t __a) ++#endif ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_s64 (int64x2_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi (__a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv2di (__a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_s16 (int16x4_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_u64 (uint64x2_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi (__a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_s32 (int32x2_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_s8 (int8x16_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv2si (__a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi (__a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_s64 (int64x1_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_s16 (int16x8_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2sidi (__a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi (__a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_f32 (float32x2_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_s32 (int32x4_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv2sf (__a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv4si (__a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_u8 (uint8x8_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_u8 (uint8x16_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_u16 (uint16x4_t __a) ++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) ++vreinterpretq_u32_u16 (uint16x8_t __a) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); ++ return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_u64 (uint64x1_t __a) ++ ++#ifdef __ARM_FEATURE_CRYPTO ++ ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vldrq_p128 (poly128_t const * __ptr) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2sidi ((int64x1_t) __a); ++#ifdef __ARM_BIG_ENDIAN ++ poly64_t* __ptmp = (poly64_t*) __ptr; ++ poly64_t __d0 = vld1_p64 (__ptmp); ++ poly64_t __d1 = vld1_p64 (__ptmp + 1); ++ return vreinterpretq_p128_p64 (vcombine_p64 (__d1, __d0)); ++#else ++ return vreinterpretq_p128_p64 (vld1q_p64 ((poly64_t*) __ptr)); ++#endif + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_p8 (poly8x8_t __a) ++__extension__ static __inline void __attribute__ ((__always_inline__)) ++vstrq_p128 (poly128_t * __ptr, poly128_t __val) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv8qi ((int8x8_t) __a); ++#ifdef __ARM_BIG_ENDIAN ++ poly64x2_t __tmp = vreinterpretq_p64_p128 (__val); ++ poly64_t __d0 = vget_high_p64 (__tmp); ++ poly64_t __d1 = vget_low_p64 (__tmp); ++ vst1q_p64 ((poly64_t*) __ptr, vcombine_p64 (__d0, __d1)); ++#else ++ vst1q_p64 ((poly64_t*) __ptr, vreinterpretq_p64_p128 (__val)); ++#endif + } + +-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) +-vreinterpret_u32_p16 (poly16x4_t __a) ++/* The vceq_p64 intrinsic does not map to a single instruction. ++ Instead we emulate it by performing a 32-bit variant of the vceq ++ and applying a pairwise min reduction to the result. ++ vceq_u32 will produce two 32-bit halves, each of which will contain either ++ all ones or all zeros depending on whether the corresponding 32-bit ++ halves of the poly64_t were equal. The whole poly64_t values are equal ++ if and only if both halves are equal, i.e. vceq_u32 returns all ones. ++ If the result is all zeroes for any half then the whole result is zeroes. ++ This is what the pairwise min reduction achieves. */ ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vceq_p64 (poly64x1_t __a, poly64x1_t __b) + { +- return (uint32x2_t)__builtin_neon_vreinterpretv2siv4hi ((int16x4_t) __a); ++ uint32x2_t __t_a = vreinterpret_u32_p64 (__a); ++ uint32x2_t __t_b = vreinterpret_u32_p64 (__b); ++ uint32x2_t __c = vceq_u32 (__t_a, __t_b); ++ uint32x2_t __m = vpmin_u32 (__c, __c); ++ return vreinterpret_u64_u32 (__m); + } + +-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_s8 (int8x16_t __a) ++/* The vtst_p64 intrinsic does not map to a single instruction. ++ We emulate it in way similar to vceq_p64 above but here we do ++ a reduction with max since if any two corresponding bits ++ in the two poly64_t's match, then the whole result must be all ones. */ ++ ++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) ++vtst_p64 (poly64x1_t __a, poly64x1_t __b) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi (__a); ++ uint32x2_t __t_a = vreinterpret_u32_p64 (__a); ++ uint32x2_t __t_b = vreinterpret_u32_p64 (__b); ++ uint32x2_t __c = vtst_u32 (__t_a, __t_b); ++ uint32x2_t __m = vpmax_u32 (__c, __c); ++ return vreinterpret_u64_u32 (__m); + } + ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaeseq_u8 (uint8x16_t __data, uint8x16_t __key) ++{ ++ return __builtin_arm_crypto_aese (__data, __key); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesdq_u8 (uint8x16_t __data, uint8x16_t __key) ++{ ++ return __builtin_arm_crypto_aesd (__data, __key); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesmcq_u8 (uint8x16_t __data) ++{ ++ return __builtin_arm_crypto_aesmc (__data); ++} ++ ++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) ++vaesimcq_u8 (uint8x16_t __data) ++{ ++ return __builtin_arm_crypto_aesimc (__data); ++} ++ ++__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) ++vsha1h_u32 (uint32_t __hash_e) ++{ ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ __t = __builtin_arm_crypto_sha1h (__t); ++ return vgetq_lane_u32 (__t, 0); ++} ++ + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_s16 (int16x8_t __a) ++vsha1cq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi (__a); ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1c (__hash_abcd, __t, __wk); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_s32 (int32x4_t __a) ++vsha1pq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv4si (__a); ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1p (__hash_abcd, __t, __wk); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_s64 (int64x2_t __a) ++vsha1mq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv2di (__a); ++ uint32x4_t __t = vdupq_n_u32 (0); ++ __t = vsetq_lane_u32 (__hash_e, __t, 0); ++ return __builtin_arm_crypto_sha1m (__hash_abcd, __t, __wk); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_f32 (float32x4_t __a) ++vsha1su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7, uint32x4_t __w8_11) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv4sf (__a); ++ return __builtin_arm_crypto_sha1su0 (__w0_3, __w4_7, __w8_11); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_u8 (uint8x16_t __a) ++vsha1su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w12_15) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); ++ return __builtin_arm_crypto_sha1su1 (__tw0_3, __w12_15); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_u16 (uint16x8_t __a) ++vsha256hq_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); ++ return __builtin_arm_crypto_sha256h (__hash_abcd, __hash_efgh, __wk); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_u64 (uint64x2_t __a) ++vsha256h2q_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv2di ((int64x2_t) __a); ++ return __builtin_arm_crypto_sha256h2 (__hash_abcd, __hash_efgh, __wk); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_p8 (poly8x16_t __a) ++vsha256su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv16qi ((int8x16_t) __a); ++ return __builtin_arm_crypto_sha256su0 (__w0_3, __w4_7); + } + + __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) +-vreinterpretq_u32_p16 (poly16x8_t __a) ++vsha256su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w8_11, uint32x4_t __w12_15) + { +- return (uint32x4_t)__builtin_neon_vreinterpretv4siv8hi ((int16x8_t) __a); ++ return __builtin_arm_crypto_sha256su1 (__tw0_3, __w8_11, __w12_15); + } + ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vmull_p64 (poly64_t __a, poly64_t __b) ++{ ++ return (poly128_t) __builtin_arm_crypto_vmullp64 ((uint64_t) __a, (uint64_t) __b); ++} ++ ++__extension__ static __inline poly128_t __attribute__ ((__always_inline__)) ++vmull_high_p64 (poly64x2_t __a, poly64x2_t __b) ++{ ++ poly64_t __t1 = vget_high_p64 (__a); ++ poly64_t __t2 = vget_high_p64 (__b); ++ ++ return (poly128_t) __builtin_arm_crypto_vmullp64 ((uint64_t) __t1, (uint64_t) __t2); ++} ++ ++#endif + #ifdef __cplusplus + } + #endif +--- a/src/gcc/config/arm/arm-ldmstm.ml ++++ b/src/gcc/config/arm/arm-ldmstm.ml +@@ -149,6 +149,8 @@ + | IA, true, true -> true + | _ -> false + ++exception InvalidAddrMode of string;; ++ + let target addrmode thumb = + match addrmode, thumb with + IA, true -> "TARGET_THUMB1" +@@ -155,6 +157,7 @@ + | IA, false -> "TARGET_32BIT" + | DB, false -> "TARGET_32BIT" + | _, false -> "TARGET_ARM" ++ | _, _ -> raise (InvalidAddrMode "ERROR: Invalid Addressing mode for Thumb1.") + + let write_pattern_1 name ls addrmode nregs write_set_fn update thumb = + let astr = string_of_addrmode addrmode in +@@ -184,8 +187,10 @@ + done; + Printf.printf "}\"\n"; + Printf.printf " [(set_attr \"type\" \"%s%d\")" ls nregs; +- begin if not thumb then ++ if not thumb then begin + Printf.printf "\n (set_attr \"predicable\" \"yes\")"; ++ if addrmode == IA || addrmode == DB then ++ Printf.printf "\n (set_attr \"predicable_short_it\" \"no\")"; + end; + Printf.printf "])\n\n" + +--- a/src/gcc/config/arm/iwmmxt.md ++++ b/src/gcc/config/arm/iwmmxt.md +@@ -33,7 +33,7 @@ + "TARGET_REALLY_IWMMXT" + "tbcstb%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tbcst")] ++ (set_attr "type" "wmmx_tbcst")] + ) + + (define_insn "tbcstv4hi" +@@ -42,7 +42,7 @@ + "TARGET_REALLY_IWMMXT" + "tbcsth%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tbcst")] ++ (set_attr "type" "wmmx_tbcst")] + ) + + (define_insn "tbcstv2si" +@@ -51,7 +51,7 @@ + "TARGET_REALLY_IWMMXT" + "tbcstw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tbcst")] ++ (set_attr "type" "wmmx_tbcst")] + ) + + (define_insn "iwmmxt_iordi3" +@@ -65,7 +65,7 @@ + #" + [(set_attr "predicable" "yes") + (set_attr "length" "4,8,8") +- (set_attr "wtype" "wor,none,none")] ++ (set_attr "type" "wmmx_wor,*,*")] + ) + + (define_insn "iwmmxt_xordi3" +@@ -79,7 +79,7 @@ + #" + [(set_attr "predicable" "yes") + (set_attr "length" "4,8,8") +- (set_attr "wtype" "wxor,none,none")] ++ (set_attr "type" "wmmx_wxor,*,*")] + ) + + (define_insn "iwmmxt_anddi3" +@@ -93,7 +93,7 @@ + #" + [(set_attr "predicable" "yes") + (set_attr "length" "4,8,8") +- (set_attr "wtype" "wand,none,none")] ++ (set_attr "type" "wmmx_wand,*,*")] + ) + + (define_insn "iwmmxt_nanddi3" +@@ -103,7 +103,7 @@ + "TARGET_REALLY_IWMMXT" + "wandn%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wandn")] ++ (set_attr "type" "wmmx_wandn")] + ) + + (define_insn "*iwmmxt_arm_movdi" +@@ -155,10 +155,9 @@ + (const_int 8) + (const_int 4))] + (const_int 4))) +- (set_attr "type" "*,*,*,load2,store2,*,*,*,*,*,r_2_f,f_2_r,ffarithd,f_loadd,f_stored") ++ (set_attr "type" "*,*,*,load2,store2,wmmx_wmov,wmmx_tmcrr,wmmx_tmrrc,wmmx_wldr,wmmx_wstr,r_2_f,f_2_r,ffarithd,f_loadd,f_stored") + (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,*,*,*,*,*,*,1020,*") +- (set_attr "arm_neg_pool_range" "*,*,*,1008,*,*,*,*,*,*,*,*,*,1008,*") +- (set_attr "wtype" "*,*,*,*,*,wmov,tmcrr,tmrrc,wldr,wstr,*,*,*,*,*")] ++ (set_attr "arm_neg_pool_range" "*,*,*,1008,*,*,*,*,*,*,*,*,*,1008,*")] + ) + + (define_insn "*iwmmxt_movsi_insn" +@@ -188,7 +187,7 @@ + default: + gcc_unreachable (); + }" +- [(set_attr "type" "*,*,*,*,load1,store1,*,*,*,*,r_2_f,f_2_r,fcpys,f_loads,f_stores") ++ [(set_attr "type" "*,*,*,*,load1,store1,wmmx_tmcr,wmmx_tmrc,wmmx_wldr,wmmx_wstr,r_2_f,f_2_r,fcpys,f_loads,f_stores") + (set_attr "length" "*,*,*,*,*, *,*,*, 16, *,*,*,*,*,*") + (set_attr "pool_range" "*,*,*,*,4096, *,*,*,1024, *,*,*,*,1020,*") + (set_attr "neg_pool_range" "*,*,*,*,4084, *,*,*, *, 1012,*,*,*,1008,*") +@@ -200,8 +199,7 @@ + ;; Also - we have to pretend that these insns clobber the condition code + ;; bits as otherwise arm_final_prescan_insn() will try to conditionalize + ;; them. +- (set_attr "conds" "clob") +- (set_attr "wtype" "*,*,*,*,*,*,tmcr,tmrc,wldr,wstr,*,*,*,*,*")] ++ (set_attr "conds" "clob")] + ) + + ;; Because iwmmxt_movsi_insn is not predicable, we provide the +@@ -249,10 +247,9 @@ + }" + [(set_attr "predicable" "yes") + (set_attr "length" "4, 4, 4,4,4,8, 8,8") +- (set_attr "type" "*,*,*,*,*,*,load1,store1") ++ (set_attr "type" "wmmx_wmov,wmmx_wstr,wmmx_wldr,wmmx_tmrrc,wmmx_tmcrr,*,load1,store1") + (set_attr "pool_range" "*, *, 256,*,*,*, 256,*") +- (set_attr "neg_pool_range" "*, *, 244,*,*,*, 244,*") +- (set_attr "wtype" "wmov,wstr,wldr,tmrrc,tmcrr,*,*,*")] ++ (set_attr "neg_pool_range" "*, *, 244,*,*,*, 244,*")] + ) + + (define_expand "iwmmxt_setwcgr0" +@@ -318,7 +315,7 @@ + "TARGET_REALLY_IWMMXT" + "wand\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wand")] ++ (set_attr "type" "wmmx_wand")] + ) + + (define_insn "*ior3_iwmmxt" +@@ -328,7 +325,7 @@ + "TARGET_REALLY_IWMMXT" + "wor\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wor")] ++ (set_attr "type" "wmmx_wor")] + ) + + (define_insn "*xor3_iwmmxt" +@@ -338,7 +335,7 @@ + "TARGET_REALLY_IWMMXT" + "wxor\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wxor")] ++ (set_attr "type" "wmmx_wxor")] + ) + + +@@ -351,7 +348,7 @@ + "TARGET_REALLY_IWMMXT" + "wadd%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "ssaddv8qi3" +@@ -361,7 +358,7 @@ + "TARGET_REALLY_IWMMXT" + "waddbss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "ssaddv4hi3" +@@ -371,7 +368,7 @@ + "TARGET_REALLY_IWMMXT" + "waddhss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "ssaddv2si3" +@@ -381,7 +378,7 @@ + "TARGET_REALLY_IWMMXT" + "waddwss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "usaddv8qi3" +@@ -391,7 +388,7 @@ + "TARGET_REALLY_IWMMXT" + "waddbus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "usaddv4hi3" +@@ -401,7 +398,7 @@ + "TARGET_REALLY_IWMMXT" + "waddhus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "usaddv2si3" +@@ -411,7 +408,7 @@ + "TARGET_REALLY_IWMMXT" + "waddwus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "*sub3_iwmmxt" +@@ -421,7 +418,7 @@ + "TARGET_REALLY_IWMMXT" + "wsub%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "sssubv8qi3" +@@ -431,7 +428,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubbss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "sssubv4hi3" +@@ -441,7 +438,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubhss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "sssubv2si3" +@@ -451,7 +448,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubwss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "ussubv8qi3" +@@ -461,7 +458,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubbus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "ussubv4hi3" +@@ -471,7 +468,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubhus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "ussubv2si3" +@@ -481,7 +478,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubwus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsub")] ++ (set_attr "type" "wmmx_wsub")] + ) + + (define_insn "*mulv4hi3_iwmmxt" +@@ -491,7 +488,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulul%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "smulv4hi3_highpart" +@@ -504,7 +501,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulsm%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "umulv4hi3_highpart" +@@ -517,7 +514,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulum%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "iwmmxt_wmacs" +@@ -528,7 +525,7 @@ + "TARGET_REALLY_IWMMXT" + "wmacs%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmac")] ++ (set_attr "type" "wmmx_wmac")] + ) + + (define_insn "iwmmxt_wmacsz" +@@ -538,7 +535,7 @@ + "TARGET_REALLY_IWMMXT" + "wmacsz%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmac")] ++ (set_attr "type" "wmmx_wmac")] + ) + + (define_insn "iwmmxt_wmacu" +@@ -549,7 +546,7 @@ + "TARGET_REALLY_IWMMXT" + "wmacu%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmac")] ++ (set_attr "type" "wmmx_wmac")] + ) + + (define_insn "iwmmxt_wmacuz" +@@ -559,7 +556,7 @@ + "TARGET_REALLY_IWMMXT" + "wmacuz%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmac")] ++ (set_attr "type" "wmmx_wmac")] + ) + + ;; Same as xordi3, but don't show input operands so that we don't think +@@ -570,7 +567,7 @@ + "TARGET_REALLY_IWMMXT" + "wxor%?\\t%0, %0, %0" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wxor")] ++ (set_attr "type" "wmmx_wxor")] + ) + + ;; Seems like cse likes to generate these, so we have to support them. +@@ -584,7 +581,7 @@ + "TARGET_REALLY_IWMMXT" + "wxor%?\\t%0, %0, %0" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wxor")] ++ (set_attr "type" "wmmx_wxor")] + ) + + (define_insn "iwmmxt_clrv4hi" +@@ -594,7 +591,7 @@ + "TARGET_REALLY_IWMMXT" + "wxor%?\\t%0, %0, %0" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wxor")] ++ (set_attr "type" "wmmx_wxor")] + ) + + (define_insn "iwmmxt_clrv2si" +@@ -603,7 +600,7 @@ + "TARGET_REALLY_IWMMXT" + "wxor%?\\t%0, %0, %0" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wxor")] ++ (set_attr "type" "wmmx_wxor")] + ) + + ;; Unsigned averages/sum of absolute differences +@@ -627,7 +624,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg2br%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg2")] ++ (set_attr "type" "wmmx_wavg2")] + ) + + (define_insn "iwmmxt_uavgrndv4hi3" +@@ -645,7 +642,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg2hr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg2")] ++ (set_attr "type" "wmmx_wavg2")] + ) + + (define_insn "iwmmxt_uavgv8qi3" +@@ -658,7 +655,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg2b%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg2")] ++ (set_attr "type" "wmmx_wavg2")] + ) + + (define_insn "iwmmxt_uavgv4hi3" +@@ -671,7 +668,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg2h%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg2")] ++ (set_attr "type" "wmmx_wavg2")] + ) + + ;; Insert/extract/shuffle +@@ -690,7 +687,7 @@ + } + " + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tinsr")] ++ (set_attr "type" "wmmx_tinsr")] + ) + + (define_insn "iwmmxt_tinsrh" +@@ -707,7 +704,7 @@ + } + " + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tinsr")] ++ (set_attr "type" "wmmx_tinsr")] + ) + + (define_insn "iwmmxt_tinsrw" +@@ -724,7 +721,7 @@ + } + " + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tinsr")] ++ (set_attr "type" "wmmx_tinsr")] + ) + + (define_insn "iwmmxt_textrmub" +@@ -735,7 +732,7 @@ + "TARGET_REALLY_IWMMXT" + "textrmub%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrm")] ++ (set_attr "type" "wmmx_textrm")] + ) + + (define_insn "iwmmxt_textrmsb" +@@ -746,7 +743,7 @@ + "TARGET_REALLY_IWMMXT" + "textrmsb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrm")] ++ (set_attr "type" "wmmx_textrm")] + ) + + (define_insn "iwmmxt_textrmuh" +@@ -757,7 +754,7 @@ + "TARGET_REALLY_IWMMXT" + "textrmuh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrm")] ++ (set_attr "type" "wmmx_textrm")] + ) + + (define_insn "iwmmxt_textrmsh" +@@ -768,7 +765,7 @@ + "TARGET_REALLY_IWMMXT" + "textrmsh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrm")] ++ (set_attr "type" "wmmx_textrm")] + ) + + ;; There are signed/unsigned variants of this instruction, but they are +@@ -780,7 +777,7 @@ + "TARGET_REALLY_IWMMXT" + "textrmsw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrm")] ++ (set_attr "type" "wmmx_textrm")] + ) + + (define_insn "iwmmxt_wshufh" +@@ -790,7 +787,7 @@ + "TARGET_REALLY_IWMMXT" + "wshufh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wshufh")] ++ (set_attr "type" "wmmx_wshufh")] + ) + + ;; Mask-generating comparisons +@@ -812,7 +809,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpeqb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpeq")] ++ (set_attr "type" "wmmx_wcmpeq")] + ) + + (define_insn "eqv4hi3" +@@ -823,7 +820,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpeqh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpeq")] ++ (set_attr "type" "wmmx_wcmpeq")] + ) + + (define_insn "eqv2si3" +@@ -835,7 +832,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpeqw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpeq")] ++ (set_attr "type" "wmmx_wcmpeq")] + ) + + (define_insn "gtuv8qi3" +@@ -846,7 +843,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtub%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + (define_insn "gtuv4hi3" +@@ -857,7 +854,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtuh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + (define_insn "gtuv2si3" +@@ -868,7 +865,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtuw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + (define_insn "gtv8qi3" +@@ -879,7 +876,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtsb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + (define_insn "gtv4hi3" +@@ -890,7 +887,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtsh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + (define_insn "gtv2si3" +@@ -901,7 +898,7 @@ + "TARGET_REALLY_IWMMXT" + "wcmpgtsw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wcmpgt")] ++ (set_attr "type" "wmmx_wcmpgt")] + ) + + ;; Max/min insns +@@ -913,7 +910,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaxs%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmax")] ++ (set_attr "type" "wmmx_wmax")] + ) + + (define_insn "*umax3_iwmmxt" +@@ -923,7 +920,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaxu%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmax")] ++ (set_attr "type" "wmmx_wmax")] + ) + + (define_insn "*smin3_iwmmxt" +@@ -933,7 +930,7 @@ + "TARGET_REALLY_IWMMXT" + "wmins%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmin")] ++ (set_attr "type" "wmmx_wmin")] + ) + + (define_insn "*umin3_iwmmxt" +@@ -943,7 +940,7 @@ + "TARGET_REALLY_IWMMXT" + "wminu%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmin")] ++ (set_attr "type" "wmmx_wmin")] + ) + + ;; Pack/unpack insns. +@@ -956,7 +953,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackhss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wpackwss" +@@ -967,7 +964,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackwss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wpackdss" +@@ -978,7 +975,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackdss%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wpackhus" +@@ -989,7 +986,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackhus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wpackwus" +@@ -1000,7 +997,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackwus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wpackdus" +@@ -1011,7 +1008,7 @@ + "TARGET_REALLY_IWMMXT" + "wpackdus%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wpack")] ++ (set_attr "type" "wmmx_wpack")] + ) + + (define_insn "iwmmxt_wunpckihb" +@@ -1039,7 +1036,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckihb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckih")] ++ (set_attr "type" "wmmx_wunpckih")] + ) + + (define_insn "iwmmxt_wunpckihh" +@@ -1059,7 +1056,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckihh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckih")] ++ (set_attr "type" "wmmx_wunpckih")] + ) + + (define_insn "iwmmxt_wunpckihw" +@@ -1075,7 +1072,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckihw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckih")] ++ (set_attr "type" "wmmx_wunpckih")] + ) + + (define_insn "iwmmxt_wunpckilb" +@@ -1103,7 +1100,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckilb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckil")] ++ (set_attr "type" "wmmx_wunpckil")] + ) + + (define_insn "iwmmxt_wunpckilh" +@@ -1123,7 +1120,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckilh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckil")] ++ (set_attr "type" "wmmx_wunpckil")] + ) + + (define_insn "iwmmxt_wunpckilw" +@@ -1139,7 +1136,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckilw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckil")] ++ (set_attr "type" "wmmx_wunpckil")] + ) + + (define_insn "iwmmxt_wunpckehub" +@@ -1151,7 +1148,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehub%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckehuh" +@@ -1162,7 +1159,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehuh%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckehuw" +@@ -1173,7 +1170,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehuw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckehsb" +@@ -1185,7 +1182,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehsb%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckehsh" +@@ -1196,7 +1193,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehsh%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckehsw" +@@ -1207,7 +1204,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckehsw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckeh")] ++ (set_attr "type" "wmmx_wunpckeh")] + ) + + (define_insn "iwmmxt_wunpckelub" +@@ -1219,7 +1216,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckelub%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + (define_insn "iwmmxt_wunpckeluh" +@@ -1230,7 +1227,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckeluh%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + (define_insn "iwmmxt_wunpckeluw" +@@ -1241,7 +1238,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckeluw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + (define_insn "iwmmxt_wunpckelsb" +@@ -1253,7 +1250,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckelsb%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + (define_insn "iwmmxt_wunpckelsh" +@@ -1264,7 +1261,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckelsh%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + (define_insn "iwmmxt_wunpckelsw" +@@ -1275,7 +1272,7 @@ + "TARGET_REALLY_IWMMXT" + "wunpckelsw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wunpckel")] ++ (set_attr "type" "wmmx_wunpckel")] + ) + + ;; Shifts +@@ -1298,7 +1295,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wror, wror")] ++ (set_attr "type" "wmmx_wror, wmmx_wror")] + ) + + (define_insn "ashr3_iwmmxt" +@@ -1319,7 +1316,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsra, wsra")] ++ (set_attr "type" "wmmx_wsra, wmmx_wsra")] + ) + + (define_insn "lshr3_iwmmxt" +@@ -1340,7 +1337,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsrl, wsrl")] ++ (set_attr "type" "wmmx_wsrl, wmmx_wsrl")] + ) + + (define_insn "ashl3_iwmmxt" +@@ -1361,7 +1358,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsll, wsll")] ++ (set_attr "type" "wmmx_wsll, wmmx_wsll")] + ) + + (define_insn "ror3_di" +@@ -1382,7 +1379,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wror, wror")] ++ (set_attr "type" "wmmx_wror, wmmx_wror")] + ) + + (define_insn "ashr3_di" +@@ -1403,7 +1400,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsra, wsra")] ++ (set_attr "type" "wmmx_wsra, wmmx_wsra")] + ) + + (define_insn "lshr3_di" +@@ -1424,7 +1421,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsrl, wsrl")] ++ (set_attr "type" "wmmx_wsrl, wmmx_wsrl")] + ) + + (define_insn "ashl3_di" +@@ -1445,7 +1442,7 @@ + " + [(set_attr "predicable" "yes") + (set_attr "arch" "*, iwmmxt2") +- (set_attr "wtype" "wsll, wsll")] ++ (set_attr "type" "wmmx_wsll, wmmx_wsll")] + ) + + (define_insn "iwmmxt_wmadds" +@@ -1464,7 +1461,7 @@ + "TARGET_REALLY_IWMMXT" + "wmadds%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_wmaddu" +@@ -1483,7 +1480,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaddu%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_tmia" +@@ -1496,7 +1493,7 @@ + "TARGET_REALLY_IWMMXT" + "tmia%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmia")] ++ (set_attr "type" "wmmx_tmia")] + ) + + (define_insn "iwmmxt_tmiaph" +@@ -1514,7 +1511,7 @@ + "TARGET_REALLY_IWMMXT" + "tmiaph%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmiaph")] ++ (set_attr "type" "wmmx_tmiaph")] + ) + + (define_insn "iwmmxt_tmiabb" +@@ -1527,7 +1524,7 @@ + "TARGET_REALLY_IWMMXT" + "tmiabb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmiaxy")] ++ (set_attr "type" "wmmx_tmiaxy")] + ) + + (define_insn "iwmmxt_tmiatb" +@@ -1544,7 +1541,7 @@ + "TARGET_REALLY_IWMMXT" + "tmiatb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmiaxy")] ++ (set_attr "type" "wmmx_tmiaxy")] + ) + + (define_insn "iwmmxt_tmiabt" +@@ -1561,7 +1558,7 @@ + "TARGET_REALLY_IWMMXT" + "tmiabt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmiaxy")] ++ (set_attr "type" "wmmx_tmiaxy")] + ) + + (define_insn "iwmmxt_tmiatt" +@@ -1580,7 +1577,7 @@ + "TARGET_REALLY_IWMMXT" + "tmiatt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmiaxy")] ++ (set_attr "type" "wmmx_tmiaxy")] + ) + + (define_insn "iwmmxt_tmovmskb" +@@ -1589,7 +1586,7 @@ + "TARGET_REALLY_IWMMXT" + "tmovmskb%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmovmsk")] ++ (set_attr "type" "wmmx_tmovmsk")] + ) + + (define_insn "iwmmxt_tmovmskh" +@@ -1598,7 +1595,7 @@ + "TARGET_REALLY_IWMMXT" + "tmovmskh%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmovmsk")] ++ (set_attr "type" "wmmx_tmovmsk")] + ) + + (define_insn "iwmmxt_tmovmskw" +@@ -1607,7 +1604,7 @@ + "TARGET_REALLY_IWMMXT" + "tmovmskw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tmovmsk")] ++ (set_attr "type" "wmmx_tmovmsk")] + ) + + (define_insn "iwmmxt_waccb" +@@ -1616,7 +1613,7 @@ + "TARGET_REALLY_IWMMXT" + "waccb%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wacc")] ++ (set_attr "type" "wmmx_wacc")] + ) + + (define_insn "iwmmxt_wacch" +@@ -1625,7 +1622,7 @@ + "TARGET_REALLY_IWMMXT" + "wacch%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wacc")] ++ (set_attr "type" "wmmx_wacc")] + ) + + (define_insn "iwmmxt_waccw" +@@ -1634,7 +1631,7 @@ + "TARGET_REALLY_IWMMXT" + "waccw%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wacc")] ++ (set_attr "type" "wmmx_wacc")] + ) + + ;; use unspec here to prevent 8 * imm to be optimized by cse +@@ -1651,7 +1648,7 @@ + "TARGET_REALLY_IWMMXT" + "waligni%?\\t%0, %1, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "waligni")] ++ (set_attr "type" "wmmx_waligni")] + ) + + (define_insn "iwmmxt_walignr" +@@ -1666,7 +1663,7 @@ + "TARGET_REALLY_IWMMXT" + "walignr%U3%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "walignr")] ++ (set_attr "type" "wmmx_walignr")] + ) + + (define_insn "iwmmxt_walignr0" +@@ -1681,7 +1678,7 @@ + "TARGET_REALLY_IWMMXT" + "walignr0%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "walignr")] ++ (set_attr "type" "wmmx_walignr")] + ) + + (define_insn "iwmmxt_walignr1" +@@ -1696,7 +1693,7 @@ + "TARGET_REALLY_IWMMXT" + "walignr1%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "walignr")] ++ (set_attr "type" "wmmx_walignr")] + ) + + (define_insn "iwmmxt_walignr2" +@@ -1711,7 +1708,7 @@ + "TARGET_REALLY_IWMMXT" + "walignr2%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "walignr")] ++ (set_attr "type" "wmmx_walignr")] + ) + + (define_insn "iwmmxt_walignr3" +@@ -1726,7 +1723,7 @@ + "TARGET_REALLY_IWMMXT" + "walignr3%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "walignr")] ++ (set_attr "type" "wmmx_walignr")] + ) + + (define_insn "iwmmxt_wsadb" +@@ -1738,7 +1735,7 @@ + "TARGET_REALLY_IWMMXT" + "wsadb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsad")] ++ (set_attr "type" "wmmx_wsad")] + ) + + (define_insn "iwmmxt_wsadh" +@@ -1750,7 +1747,7 @@ + "TARGET_REALLY_IWMMXT" + "wsadh%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsad")] ++ (set_attr "type" "wmmx_wsad")] + ) + + (define_insn "iwmmxt_wsadbz" +@@ -1760,7 +1757,7 @@ + "TARGET_REALLY_IWMMXT" + "wsadbz%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsad")] ++ (set_attr "type" "wmmx_wsad")] + ) + + (define_insn "iwmmxt_wsadhz" +@@ -1770,7 +1767,7 @@ + "TARGET_REALLY_IWMMXT" + "wsadhz%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsad")] ++ (set_attr "type" "wmmx_wsad")] + ) + + (include "iwmmxt2.md") +--- a/src/gcc/config/arm/cortex-a53.md ++++ b/src/gcc/config/arm/cortex-a53.md +@@ -0,0 +1,300 @@ ++;; ARM Cortex-A53 pipeline description ++;; Copyright (C) 2013 Free Software Foundation, Inc. ++;; ++;; Contributed by ARM Ltd. ++;; ++;; This file is part of GCC. ++;; ++;; GCC is free software; you can redistribute it and/or modify it ++;; under the terms of the GNU General Public License as published by ++;; the Free Software Foundation; either version 3, or (at your option) ++;; any later version. ++;; ++;; GCC is distributed in the hope that it will be useful, but ++;; WITHOUT ANY WARRANTY; without even the implied warranty of ++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++;; General Public License for more details. ++;; ++;; You should have received a copy of the GNU General Public License ++;; along with GCC; see the file COPYING3. If not see ++;; . ++ ++(define_automaton "cortex_a53") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; Functional units. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++;; There are two main integer execution pipelines, described as ++;; slot 0 and issue slot 1. ++ ++(define_cpu_unit "cortex_a53_slot0" "cortex_a53") ++(define_cpu_unit "cortex_a53_slot1" "cortex_a53") ++ ++(define_reservation "cortex_a53_slot_any" "cortex_a53_slot0|cortex_a53_slot1") ++(define_reservation "cortex_a53_single_issue" "cortex_a53_slot0+cortex_a53_slot1") ++ ++;; The load/store pipeline. Load/store instructions can dual-issue from ++;; either pipeline, but two load/stores cannot simultaneously issue. ++ ++(define_cpu_unit "cortex_a53_ls" "cortex_a53") ++ ++;; The store pipeline. Shared between both execution pipelines. ++ ++(define_cpu_unit "cortex_a53_store" "cortex_a53") ++ ++;; The branch pipeline. Branches can dual-issue with other instructions ++;; (except when those instructions take multiple cycles to issue). ++ ++(define_cpu_unit "cortex_a53_branch" "cortex_a53") ++ ++;; The integer divider. ++ ++(define_cpu_unit "cortex_a53_idiv" "cortex_a53") ++ ++;; The floating-point add pipeline used to model the usage ++;; of the add pipeline by fmac instructions. ++ ++(define_cpu_unit "cortex_a53_fpadd_pipe" "cortex_a53") ++ ++;; Floating-point div/sqrt (long latency, out-of-order completion). ++ ++(define_cpu_unit "cortex_a53_fp_div_sqrt" "cortex_a53") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; ALU instructions. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++(define_insn_reservation "cortex_a53_alu" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) ++ "cortex_a53_slot_any") ++ ++(define_insn_reservation "cortex_a53_alu_shift" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg")) ++ "cortex_a53_slot_any") ++ ++;; Forwarding path for unshifted operands. ++ ++(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift" ++ "cortex_a53_alu") ++ ++(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift" ++ "cortex_a53_alu_shift" ++ "arm_no_early_alu_shift_dep") ++ ++;; The multiplier pipeline can forward results so there's no need to specify ++;; bypasses. Multiplies can only single-issue currently. ++ ++(define_insn_reservation "cortex_a53_mul" 3 ++ (and (eq_attr "tune" "cortexa53") ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes"))) ++ "cortex_a53_single_issue") ++ ++;; A multiply with a single-register result or an MLA, followed by an ++;; MLA with an accumulator dependency, has its result forwarded so two ++;; such instructions can issue back-to-back. ++ ++(define_bypass 1 "cortex_a53_mul" ++ "cortex_a53_mul" ++ "arm_mac_accumulator_is_mul_result") ++ ++;; Punt with a high enough latency for divides. ++(define_insn_reservation "cortex_a53_udiv" 8 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "udiv")) ++ "(cortex_a53_slot0+cortex_a53_idiv),cortex_a53_idiv*7") ++ ++(define_insn_reservation "cortex_a53_sdiv" 9 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "sdiv")) ++ "(cortex_a53_slot0+cortex_a53_idiv),cortex_a53_idiv*8") ++ ++ ++(define_bypass 2 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv" ++ "cortex_a53_alu") ++(define_bypass 2 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv" ++ "cortex_a53_alu_shift" ++ "arm_no_early_alu_shift_dep") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; Load/store instructions. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++;; Address-generation happens in the issue stage. ++ ++(define_insn_reservation "cortex_a53_load1" 3 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "load_byte,load1")) ++ "cortex_a53_slot_any+cortex_a53_ls") ++ ++(define_insn_reservation "cortex_a53_store1" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "store1")) ++ "cortex_a53_slot_any+cortex_a53_ls+cortex_a53_store") ++ ++(define_insn_reservation "cortex_a53_load2" 3 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "load2")) ++ "cortex_a53_single_issue+cortex_a53_ls") ++ ++(define_insn_reservation "cortex_a53_store2" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "store2")) ++ "cortex_a53_single_issue+cortex_a53_ls+cortex_a53_store") ++ ++(define_insn_reservation "cortex_a53_load3plus" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "load3,load4")) ++ "(cortex_a53_single_issue+cortex_a53_ls)*2") ++ ++(define_insn_reservation "cortex_a53_store3plus" 3 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "store3,store4")) ++ "(cortex_a53_single_issue+cortex_a53_ls+cortex_a53_store)*2") ++ ++;; Load/store addresses are required early in Issue. ++(define_bypass 3 "cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus,cortex_a53_alu,cortex_a53_alu_shift" ++ "cortex_a53_load*" ++ "arm_early_load_addr_dep") ++(define_bypass 3 "cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus,cortex_a53_alu,cortex_a53_alu_shift" ++ "cortex_a53_store*" ++ "arm_early_store_addr_dep") ++ ++;; Load data can forward in the ALU pipeline ++(define_bypass 2 "cortex_a53_load1,cortex_a53_load2" ++ "cortex_a53_alu") ++(define_bypass 2 "cortex_a53_load1,cortex_a53_load2" ++ "cortex_a53_alu_shift" ++ "arm_no_early_alu_shift_dep") ++ ++;; ALU ops can forward to stores. ++(define_bypass 0 "cortex_a53_alu,cortex_a53_alu_shift" ++ "cortex_a53_store1,cortex_a53_store2,cortex_a53_store3plus" ++ "arm_no_early_store_addr_dep") ++ ++(define_bypass 1 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv,cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus" ++ "cortex_a53_store1,cortex_a53_store2,cortex_a53_store3plus" ++ "arm_no_early_store_addr_dep") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; Branches. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++;; Currently models all branches as dual-issuable from either execution ++;; slot, which isn't true for all cases. We still need to model indirect ++;; branches. ++ ++(define_insn_reservation "cortex_a53_branch" 0 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "branch,call")) ++ "cortex_a53_slot_any+cortex_a53_branch") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; Floating-point arithmetic. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++(define_insn_reservation "cortex_a53_fpalu" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "ffariths, fadds, ffarithd, faddd, fcpys, fmuls, f_cvt,\ ++ fcmps, fcmpd")) ++ "cortex_a53_slot0+cortex_a53_fpadd_pipe") ++ ++(define_insn_reservation "cortex_a53_fconst" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "fconsts,fconstd")) ++ "cortex_a53_slot0+cortex_a53_fpadd_pipe") ++ ++(define_insn_reservation "cortex_a53_fpmul" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "fmuls,fmuld")) ++ "cortex_a53_slot0") ++ ++;; For single-precision multiply-accumulate, the add (accumulate) is issued after ++;; the multiply completes. Model that accordingly. ++ ++(define_insn_reservation "cortex_a53_fpmac" 8 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "fmacs,fmacd,ffmas,ffmad")) ++ "cortex_a53_slot0, nothing*3, cortex_a53_fpadd_pipe") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; Floating-point divide/square root instructions. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; fsqrt really takes one cycle less, but that is not modelled. ++ ++(define_insn_reservation "cortex_a53_fdivs" 14 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "fdivs")) ++ "cortex_a53_slot0, cortex_a53_fp_div_sqrt * 13") ++ ++(define_insn_reservation "cortex_a53_fdivd" 29 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "fdivd")) ++ "cortex_a53_slot0, cortex_a53_fp_div_sqrt * 28") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; VFP to/from core transfers. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++(define_insn_reservation "cortex_a53_r2f" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "r_2_f")) ++ "cortex_a53_slot0") ++ ++(define_insn_reservation "cortex_a53_f2r" 2 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_2_r")) ++ "cortex_a53_slot0") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; VFP flag transfer. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++(define_insn_reservation "cortex_a53_f_flags" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_flag")) ++ "cortex_a53_slot0") ++ ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++;; VFP load/store. ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ++ ++(define_insn_reservation "cortex_a53_f_loads" 4 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_loads")) ++ "cortex_a53_slot0") ++ ++(define_insn_reservation "cortex_a53_f_loadd" 5 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_loadd")) ++ "cortex_a53_slot0") ++ ++(define_insn_reservation "cortex_a53_f_stores" 0 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_stores")) ++ "cortex_a53_slot0") ++ ++(define_insn_reservation "cortex_a53_f_stored" 0 ++ (and (eq_attr "tune" "cortexa53") ++ (eq_attr "type" "f_stored")) ++ "cortex_a53_slot0") ++ ++;; Load-to-use for floating-point values has a penalty of one cycle, ++;; i.e. a latency of two. ++ ++(define_bypass 2 "cortex_a53_f_loads" ++ "cortex_a53_fpalu, cortex_a53_fpmac, cortex_a53_fpmul,\ ++ cortex_a53_fdivs, cortex_a53_fdivd,\ ++ cortex_a53_f2r") ++ ++(define_bypass 2 "cortex_a53_f_loadd" ++ "cortex_a53_fpalu, cortex_a53_fpmac, cortex_a53_fpmul,\ ++ cortex_a53_fdivs, cortex_a53_fdivd,\ ++ cortex_a53_f2r") ++ +--- a/src/gcc/config/arm/bpabi.h ++++ b/src/gcc/config/arm/bpabi.h +@@ -60,6 +60,7 @@ + |mcpu=cortex-a7 \ + |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15 \ + |mcpu=marvell-pj4 \ ++ |mcpu=cortex-a53 \ + |mcpu=generic-armv7-a \ + |march=armv7-m|mcpu=cortex-m3 \ + |march=armv7e-m|mcpu=cortex-m4 \ +@@ -71,6 +72,7 @@ + " %{mbig-endian:%{march=armv7-a|mcpu=cortex-a5 \ + |mcpu=cortex-a7 \ + |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15 \ ++ |mcpu=cortex-a53 \ + |mcpu=marvell-pj4 \ + |mcpu=generic-armv7-a \ + |march=armv7-m|mcpu=cortex-m3 \ +--- a/src/gcc/config/arm/marvell-f-iwmmxt.md ++++ b/src/gcc/config/arm/marvell-f-iwmmxt.md +@@ -63,52 +63,62 @@ + ;; An attribute appended to instructions for classification + + (define_attr "wmmxt_shift" "yes,no" +- (if_then_else (eq_attr "wtype" "wror, wsll, wsra, wsrl") ++ (if_then_else (eq_attr "type" "wmmx_wror, wmmx_wsll, wmmx_wsra, wmmx_wsrl") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_pack" "yes,no" +- (if_then_else (eq_attr "wtype" "waligni, walignr, wmerge, wpack, wshufh, wunpckeh, wunpckih, wunpckel, wunpckil") ++ (if_then_else (eq_attr "type" "wmmx_waligni, wmmx_walignr, wmmx_wmerge,\ ++ wmmx_wpack, wmmx_wshufh, wmmx_wunpckeh,\ ++ wmmx_wunpckih, wmmx_wunpckel, wmmx_wunpckil") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_mult_c1" "yes,no" +- (if_then_else (eq_attr "wtype" "wmac, wmadd, wmiaxy, wmiawxy, wmulw, wqmiaxy, wqmulwm") ++ (if_then_else (eq_attr "type" "wmmx_wmac, wmmx_wmadd, wmmx_wmiaxy,\ ++ wmmx_wmiawxy, wmmx_wmulw, wmmx_wqmiaxy,\ ++ wmmx_wqmulwm") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_mult_c2" "yes,no" +- (if_then_else (eq_attr "wtype" "wmul, wqmulm") ++ (if_then_else (eq_attr "type" "wmmx_wmul, wmmx_wqmulm") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_alu_c1" "yes,no" +- (if_then_else (eq_attr "wtype" "wabs, wabsdiff, wand, wandn, wmov, wor, wxor") ++ (if_then_else (eq_attr "type" "wmmx_wabs, wmmx_wabsdiff, wmmx_wand,\ ++ wmmx_wandn, wmmx_wmov, wmmx_wor, wmmx_wxor") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_alu_c2" "yes,no" +- (if_then_else (eq_attr "wtype" "wacc, wadd, waddsubhx, wavg2, wavg4, wcmpeq, wcmpgt, wmax, wmin, wsub, waddbhus, wsubaddhx") ++ (if_then_else (eq_attr "type" "wmmx_wacc, wmmx_wadd, wmmx_waddsubhx,\ ++ wmmx_wavg2, wmmx_wavg4, wmmx_wcmpeq,\ ++ wmmx_wcmpgt, wmmx_wmax, wmmx_wmin,\ ++ wmmx_wsub, wmmx_waddbhus, wmmx_wsubaddhx") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_alu_c3" "yes,no" +- (if_then_else (eq_attr "wtype" "wsad") ++ (if_then_else (eq_attr "type" "wmmx_wsad") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_transfer_c1" "yes,no" +- (if_then_else (eq_attr "wtype" "tbcst, tinsr, tmcr, tmcrr") ++ (if_then_else (eq_attr "type" "wmmx_tbcst, wmmx_tinsr,\ ++ wmmx_tmcr, wmmx_tmcrr") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_transfer_c2" "yes,no" +- (if_then_else (eq_attr "wtype" "textrm, tmovmsk, tmrc, tmrrc") ++ (if_then_else (eq_attr "type" "wmmx_textrm, wmmx_tmovmsk,\ ++ wmmx_tmrc, wmmx_tmrrc") + (const_string "yes") (const_string "no")) + ) + + (define_attr "wmmxt_transfer_c3" "yes,no" +- (if_then_else (eq_attr "wtype" "tmia, tmiaph, tmiaxy") ++ (if_then_else (eq_attr "type" "wmmx_tmia, wmmx_tmiaph, wmmx_tmiaxy") + (const_string "yes") (const_string "no")) + ) + +@@ -169,11 +179,11 @@ + + (define_insn_reservation "marvell_f_iwmmxt_wstr" 0 + (and (eq_attr "marvell_f_iwmmxt" "yes") +- (eq_attr "wtype" "wstr")) ++ (eq_attr "type" "wmmx_wstr")) + "mf_iwmmxt_pipeline") + + ;There is a forwarding path from MW stage + (define_insn_reservation "marvell_f_iwmmxt_wldr" 5 + (and (eq_attr "marvell_f_iwmmxt" "yes") +- (eq_attr "wtype" "wldr")) ++ (eq_attr "type" "wmmx_wldr")) + "mf_iwmmxt_pipeline") +--- a/src/gcc/config/arm/t-mlibs ++++ b/src/gcc/config/arm/t-mlibs +@@ -0,0 +1,21 @@ ++# A set of predefined MULTILIB for different ARM targets. ++# Through the configure option --with-multilib-list, user can customize the ++# final MULTILIB implementation. ++ ++comma := , ++space := ++space += ++ ++MULTILIB_OPTIONS = marm ++MULTILIB_DIRNAMES = arm ++MULTILIB_OPTIONS += march=armv4t ++MULTILIB_DIRNAMES += armv4t ++MULTILIB_OPTIONS += mfloat-abi=soft ++MULTILIB_DIRNAMES += soft ++ ++MULTILIB_EXCEPTIONS = ++ ++MULTILIB_REQUIRED = marm/march=armv4t/mfloat-abi=soft ++ ++MULTILIB_OSDIRNAMES = marm/march.armv4t/mfloat-abi.soft=!arm-linux-gnueabi ++ +--- a/src/gcc/config/arm/iterators.md ++++ b/src/gcc/config/arm/iterators.md +@@ -201,6 +201,20 @@ + (define_int_iterator NEON_VRINT [UNSPEC_NVRINTP UNSPEC_NVRINTZ UNSPEC_NVRINTM + UNSPEC_NVRINTX UNSPEC_NVRINTA UNSPEC_NVRINTN]) + ++(define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W ++ UNSPEC_CRC32CB UNSPEC_CRC32CH UNSPEC_CRC32CW]) ++ ++(define_int_iterator CRYPTO_UNARY [UNSPEC_AESMC UNSPEC_AESIMC]) ++ ++(define_int_iterator CRYPTO_BINARY [UNSPEC_AESD UNSPEC_AESE ++ UNSPEC_SHA1SU1 UNSPEC_SHA256SU0]) ++ ++(define_int_iterator CRYPTO_TERNARY [UNSPEC_SHA1SU0 UNSPEC_SHA256H ++ UNSPEC_SHA256H2 UNSPEC_SHA256SU1]) ++ ++(define_int_iterator CRYPTO_SELECTING [UNSPEC_SHA1C UNSPEC_SHA1M ++ UNSPEC_SHA1P]) ++ + ;;---------------------------------------------------------------------------- + ;; Mode attributes + ;;---------------------------------------------------------------------------- +@@ -500,3 +514,54 @@ + (define_int_attr nvrint_variant [(UNSPEC_NVRINTZ "z") (UNSPEC_NVRINTP "p") + (UNSPEC_NVRINTA "a") (UNSPEC_NVRINTM "m") + (UNSPEC_NVRINTX "x") (UNSPEC_NVRINTN "n")]) ++ ++(define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h") ++ (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32CB "crc32cb") ++ (UNSPEC_CRC32CH "crc32ch") (UNSPEC_CRC32CW "crc32cw")]) ++ ++(define_int_attr crc_mode [(UNSPEC_CRC32B "QI") (UNSPEC_CRC32H "HI") ++ (UNSPEC_CRC32W "SI") (UNSPEC_CRC32CB "QI") ++ (UNSPEC_CRC32CH "HI") (UNSPEC_CRC32CW "SI")]) ++ ++(define_int_attr crypto_pattern [(UNSPEC_SHA1H "sha1h") (UNSPEC_AESMC "aesmc") ++ (UNSPEC_AESIMC "aesimc") (UNSPEC_AESD "aesd") ++ (UNSPEC_AESE "aese") (UNSPEC_SHA1SU1 "sha1su1") ++ (UNSPEC_SHA256SU0 "sha256su0") (UNSPEC_SHA1C "sha1c") ++ (UNSPEC_SHA1M "sha1m") (UNSPEC_SHA1P "sha1p") ++ (UNSPEC_SHA1SU0 "sha1su0") (UNSPEC_SHA256H "sha256h") ++ (UNSPEC_SHA256H2 "sha256h2") ++ (UNSPEC_SHA256SU1 "sha256su1")]) ++ ++(define_int_attr crypto_type ++ [(UNSPEC_AESE "neon_crypto_aes") (UNSPEC_AESD "neon_crypto_aes") ++ (UNSPEC_AESMC "neon_crypto_aes") (UNSPEC_AESIMC "neon_crypto_aes") ++ (UNSPEC_SHA1C "neon_crypto_sha1_slow") (UNSPEC_SHA1P "neon_crypto_sha1_slow") ++ (UNSPEC_SHA1M "neon_crypto_sha1_slow") (UNSPEC_SHA1SU1 "neon_crypto_sha1_fast") ++ (UNSPEC_SHA1SU0 "neon_crypto_sha1_xor") (UNSPEC_SHA256H "neon_crypto_sha256_slow") ++ (UNSPEC_SHA256H2 "neon_crypto_sha256_slow") (UNSPEC_SHA256SU0 "neon_crypto_sha256_fast") ++ (UNSPEC_SHA256SU1 "neon_crypto_sha256_slow")]) ++ ++(define_int_attr crypto_size_sfx [(UNSPEC_SHA1H "32") (UNSPEC_AESMC "8") ++ (UNSPEC_AESIMC "8") (UNSPEC_AESD "8") ++ (UNSPEC_AESE "8") (UNSPEC_SHA1SU1 "32") ++ (UNSPEC_SHA256SU0 "32") (UNSPEC_SHA1C "32") ++ (UNSPEC_SHA1M "32") (UNSPEC_SHA1P "32") ++ (UNSPEC_SHA1SU0 "32") (UNSPEC_SHA256H "32") ++ (UNSPEC_SHA256H2 "32") (UNSPEC_SHA256SU1 "32")]) ++ ++(define_int_attr crypto_mode [(UNSPEC_SHA1H "V4SI") (UNSPEC_AESMC "V16QI") ++ (UNSPEC_AESIMC "V16QI") (UNSPEC_AESD "V16QI") ++ (UNSPEC_AESE "V16QI") (UNSPEC_SHA1SU1 "V4SI") ++ (UNSPEC_SHA256SU0 "V4SI") (UNSPEC_SHA1C "V4SI") ++ (UNSPEC_SHA1M "V4SI") (UNSPEC_SHA1P "V4SI") ++ (UNSPEC_SHA1SU0 "V4SI") (UNSPEC_SHA256H "V4SI") ++ (UNSPEC_SHA256H2 "V4SI") (UNSPEC_SHA256SU1 "V4SI")]) ++ ++;; Both kinds of return insn. ++(define_code_iterator returns [return simple_return]) ++(define_code_attr return_str [(return "") (simple_return "simple_")]) ++(define_code_attr return_simple_p [(return "false") (simple_return "true")]) ++(define_code_attr return_cond_false [(return " && USE_RETURN_INSN (FALSE)") ++ (simple_return " && use_simple_return_p ()")]) ++(define_code_attr return_cond_true [(return " && USE_RETURN_INSN (TRUE)") ++ (simple_return " && use_simple_return_p ()")]) +--- a/src/gcc/config/arm/sync.md ++++ b/src/gcc/config/arm/sync.md +@@ -65,6 +65,42 @@ + (set_attr "conds" "unconditional") + (set_attr "predicable" "no")]) + ++(define_insn "atomic_load" ++ [(set (match_operand:QHSI 0 "register_operand" "=r") ++ (unspec_volatile:QHSI ++ [(match_operand:QHSI 1 "arm_sync_memory_operand" "Q") ++ (match_operand:SI 2 "const_int_operand")] ;; model ++ VUNSPEC_LDA))] ++ "TARGET_HAVE_LDACQ" ++ { ++ enum memmodel model = (enum memmodel) INTVAL (operands[2]); ++ if (model == MEMMODEL_RELAXED ++ || model == MEMMODEL_CONSUME ++ || model == MEMMODEL_RELEASE) ++ return \"ldr\\t%0, %1\"; ++ else ++ return \"lda\\t%0, %1\"; ++ } ++) ++ ++(define_insn "atomic_store" ++ [(set (match_operand:QHSI 0 "memory_operand" "=Q") ++ (unspec_volatile:QHSI ++ [(match_operand:QHSI 1 "general_operand" "r") ++ (match_operand:SI 2 "const_int_operand")] ;; model ++ VUNSPEC_STL))] ++ "TARGET_HAVE_LDACQ" ++ { ++ enum memmodel model = (enum memmodel) INTVAL (operands[2]); ++ if (model == MEMMODEL_RELAXED ++ || model == MEMMODEL_CONSUME ++ || model == MEMMODEL_ACQUIRE) ++ return \"str\t%1, %0\"; ++ else ++ return \"stl\t%1, %0\"; ++ } ++) ++ + ;; Note that ldrd and vldr are *not* guaranteed to be single-copy atomic, + ;; even for a 64-bit aligned address. Instead we use a ldrexd unparied + ;; with a store. +@@ -88,7 +124,8 @@ + UNSPEC_LL))] + "TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN" + "ldrexd%?\t%0, %H0, %C1" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_expand "atomic_compare_and_swap" + [(match_operand:SI 0 "s_register_operand" "") ;; bool out +@@ -325,8 +362,20 @@ + VUNSPEC_LL)))] + "TARGET_HAVE_LDREXBH" + "ldrex%?\t%0, %C1" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + ++(define_insn "arm_load_acquire_exclusive" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (zero_extend:SI ++ (unspec_volatile:NARROW ++ [(match_operand:NARROW 1 "mem_noofs_operand" "Ua")] ++ VUNSPEC_LAX)))] ++ "TARGET_HAVE_LDACQ" ++ "ldaex%?\\t%0, %C1" ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) ++ + (define_insn "arm_load_exclusivesi" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (unspec_volatile:SI +@@ -334,8 +383,19 @@ + VUNSPEC_LL))] + "TARGET_HAVE_LDREX" + "ldrex%?\t%0, %C1" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + ++(define_insn "arm_load_acquire_exclusivesi" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (unspec_volatile:SI ++ [(match_operand:SI 1 "mem_noofs_operand" "Ua")] ++ VUNSPEC_LAX))] ++ "TARGET_HAVE_LDACQ" ++ "ldaex%?\t%0, %C1" ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) ++ + (define_insn "arm_load_exclusivedi" + [(set (match_operand:DI 0 "s_register_operand" "=r") + (unspec_volatile:DI +@@ -343,8 +403,19 @@ + VUNSPEC_LL))] + "TARGET_HAVE_LDREXD" + "ldrexd%?\t%0, %H0, %C1" +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + ++(define_insn "arm_load_acquire_exclusivedi" ++ [(set (match_operand:DI 0 "s_register_operand" "=r") ++ (unspec_volatile:DI ++ [(match_operand:DI 1 "mem_noofs_operand" "Ua")] ++ VUNSPEC_LAX))] ++ "TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN" ++ "ldaexd%?\t%0, %H0, %C1" ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) ++ + (define_insn "arm_store_exclusive" + [(set (match_operand:SI 0 "s_register_operand" "=&r") + (unspec_volatile:SI [(const_int 0)] VUNSPEC_SC)) +@@ -367,4 +438,35 @@ + } + return "strex%?\t%0, %2, %C1"; + } +- [(set_attr "predicable" "yes")]) ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) ++ ++(define_insn "arm_store_release_exclusivedi" ++ [(set (match_operand:SI 0 "s_register_operand" "=&r") ++ (unspec_volatile:SI [(const_int 0)] VUNSPEC_SLX)) ++ (set (match_operand:DI 1 "mem_noofs_operand" "=Ua") ++ (unspec_volatile:DI ++ [(match_operand:DI 2 "s_register_operand" "r")] ++ VUNSPEC_SLX))] ++ "TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN" ++ { ++ rtx value = operands[2]; ++ /* See comment in arm_store_exclusive above. */ ++ gcc_assert ((REGNO (value) & 1) == 0 || TARGET_THUMB2); ++ operands[3] = gen_rtx_REG (SImode, REGNO (value) + 1); ++ return "stlexd%?\t%0, %2, %3, %C1"; ++ } ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) ++ ++(define_insn "arm_store_release_exclusive" ++ [(set (match_operand:SI 0 "s_register_operand" "=&r") ++ (unspec_volatile:SI [(const_int 0)] VUNSPEC_SLX)) ++ (set (match_operand:QHSI 1 "mem_noofs_operand" "=Ua") ++ (unspec_volatile:QHSI ++ [(match_operand:QHSI 2 "s_register_operand" "r")] ++ VUNSPEC_SLX))] ++ "TARGET_HAVE_LDACQ" ++ "stlex%?\t%0, %2, %C1" ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) +--- a/src/gcc/config/arm/fa726te.md ++++ b/src/gcc/config/arm/fa726te.md +@@ -78,7 +78,8 @@ + ;; Move instructions. + (define_insn_reservation "726te_shift_op" 1 + (and (eq_attr "tune" "fa726te") +- (eq_attr "insn" "mov,mvn")) ++ (eq_attr "type" "mov_imm,mov_reg,mov_shift,mov_shift_reg,\ ++ mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg")) + "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") + + ;; ALU operations with no shifted operand will finished in 1 cycle +@@ -85,8 +86,7 @@ + ;; Other ALU instructions 2 cycles. + (define_insn_reservation "726te_alu_op" 1 + (and (eq_attr "tune" "fa726te") +- (and (eq_attr "type" "alu_reg,simple_alu_imm") +- (not (eq_attr "insn" "mov,mvn")))) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg")) + "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") + + ;; ALU operations with a shift-by-register operand. +@@ -95,14 +95,12 @@ + ;; it takes 3 cycles. + (define_insn_reservation "726te_alu_shift_op" 3 + (and (eq_attr "tune" "fa726te") +- (and (eq_attr "type" "simple_alu_shift,alu_shift") +- (not (eq_attr "insn" "mov,mvn")))) ++ (eq_attr "type" "extend,arlo_shift")) + "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") + + (define_insn_reservation "726te_alu_shift_reg_op" 3 + (and (eq_attr "tune" "fa726te") +- (and (eq_attr "type" "alu_shift_reg") +- (not (eq_attr "insn" "mov,mvn")))) ++ (eq_attr "type" "arlo_shift_reg")) + "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Multiplication Instructions +@@ -115,7 +113,7 @@ + + (define_insn_reservation "726te_mult_op" 3 + (and (eq_attr "tune" "fa726te") +- (eq_attr "insn" "smlalxy,mul,mla,muls,mlas,umull,umlal,smull,smlal,\ ++ (eq_attr "type" "smlalxy,mul,mla,muls,mlas,umull,umlal,smull,smlal,\ + umulls,umlals,smulls,smlals,smlawx,smulxy,smlaxy")) + "fa726te_issue+fa726te_mac_pipe") + +--- a/src/gcc/config/arm/neon-testgen.ml ++++ b/src/gcc/config/arm/neon-testgen.ml +@@ -163,10 +163,13 @@ + match List.find (fun feature -> + match feature with Requires_feature _ -> true + | Requires_arch _ -> true ++ | Requires_FP_bit 1 -> true + | _ -> false) + features with + Requires_feature "FMA" -> "arm_neonv2" ++ | Requires_feature "CRYPTO" -> "arm_crypto" + | Requires_arch 8 -> "arm_v8_neon" ++ | Requires_FP_bit 1 -> "arm_neon_fp16" + | _ -> assert false + with Not_found -> "arm_neon" + +@@ -298,5 +301,5 @@ + (* Program entry point. *) + let _ = + let directory = if Array.length Sys.argv <> 1 then Sys.argv.(1) else "." in +- List.iter (test_intrinsic_group directory) (reinterp @ ops) ++ List.iter (test_intrinsic_group directory) (reinterp @ reinterpq @ ops) + +--- a/src/gcc/config/arm/arm.md ++++ b/src/gcc/config/arm/arm.md +@@ -74,6 +74,15 @@ + ; IS_THUMB1 is set to 'yes' iff we are generating Thumb-1 code. + (define_attr "is_thumb1" "no,yes" (const (symbol_ref "thumb1_code"))) + ++; We use this attribute to disable alternatives that can produce 32-bit ++; instructions inside an IT-block in Thumb2 state. ARMv8 deprecates IT blocks ++; that contain 32-bit instructions. ++(define_attr "enabled_for_depr_it" "no,yes" (const_string "yes")) ++ ++; This attribute is used to disable a predicated alternative when we have ++; arm_restrict_it. ++(define_attr "predicable_short_it" "no,yes" (const_string "yes")) ++ + ;; Operand number of an input operand that is shifted. Zero if the + ;; given instruction does not shift one of its input operands. + (define_attr "shift" "" (const_int 0)) +@@ -84,6 +93,8 @@ + (define_attr "fpu" "none,vfp" + (const (symbol_ref "arm_fpu_attr"))) + ++(define_attr "predicated" "yes,no" (const_string "no")) ++ + ; LENGTH of an instruction (in bytes) + (define_attr "length" "" + (const_int 4)) +@@ -94,7 +105,7 @@ + ; for ARM or Thumb-2 with arm_arch6, and nov6 for ARM without + ; arm_arch6. This attribute is used to compute attribute "enabled", + ; use type "any" to enable an alternative in all cases. +-(define_attr "arch" "any,a,t,32,t1,t2,v6,nov6,onlya8,neon_onlya8,nota8,neon_nota8,iwmmxt,iwmmxt2" ++(define_attr "arch" "any,a,t,32,t1,t2,v6,nov6,neon_for_64bits,avoid_neon_for_64bits,iwmmxt,iwmmxt2" + (const_string "any")) + + (define_attr "arch_enabled" "no,yes" +@@ -129,24 +140,16 @@ + (match_test "TARGET_32BIT && !arm_arch6")) + (const_string "yes") + +- (and (eq_attr "arch" "onlya8") +- (eq_attr "tune" "cortexa8")) ++ (and (eq_attr "arch" "avoid_neon_for_64bits") ++ (match_test "TARGET_NEON") ++ (not (match_test "TARGET_PREFER_NEON_64BITS"))) + (const_string "yes") + +- (and (eq_attr "arch" "neon_onlya8") +- (eq_attr "tune" "cortexa8") +- (match_test "TARGET_NEON")) ++ (and (eq_attr "arch" "neon_for_64bits") ++ (match_test "TARGET_NEON") ++ (match_test "TARGET_PREFER_NEON_64BITS")) + (const_string "yes") + +- (and (eq_attr "arch" "nota8") +- (not (eq_attr "tune" "cortexa8"))) +- (const_string "yes") +- +- (and (eq_attr "arch" "neon_nota8") +- (not (eq_attr "tune" "cortexa8")) +- (match_test "TARGET_NEON")) +- (const_string "yes") +- + (and (eq_attr "arch" "iwmmxt2") + (match_test "TARGET_REALLY_IWMMXT2")) + (const_string "yes")] +@@ -179,6 +182,15 @@ + (cond [(eq_attr "insn_enabled" "no") + (const_string "no") + ++ (and (eq_attr "predicable_short_it" "no") ++ (and (eq_attr "predicated" "yes") ++ (match_test "arm_restrict_it"))) ++ (const_string "no") ++ ++ (and (eq_attr "enabled_for_depr_it" "no") ++ (match_test "arm_restrict_it")) ++ (const_string "no") ++ + (eq_attr "arch_enabled" "no") + (const_string "no") + +@@ -214,126 +226,341 @@ + (set_attr "length" "4") + (set_attr "pool_range" "250")]) + +-;; The instruction used to implement a particular pattern. This +-;; information is used by pipeline descriptions to provide accurate +-;; scheduling information. +- +-(define_attr "insn" +- "mov,mvn,smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,umaal,smlald,smlsld,clz,mrs,msr,xtab,sdiv,udiv,sat,other" +- (const_string "other")) +- +-; TYPE attribute is used to detect floating point instructions which, if +-; running on a co-processor can run in parallel with other, basic instructions +-; If write-buffer scheduling is enabled then it can also be used in the +-; scheduling of writes. +- +-; Classification of each insn +-; Note: vfp.md has different meanings for some of these, and some further +-; types as well. See that file for details. +-; simple_alu_imm a simple alu instruction that doesn't hit memory or fp +-; regs or have a shifted source operand and has an immediate +-; operand. This currently only tracks very basic immediate +-; alu operations. +-; alu_reg any alu instruction that doesn't hit memory or fp +-; regs or have a shifted source operand +-; and does not have an immediate operand. This is +-; also the default +-; simple_alu_shift covers UXTH, UXTB, SXTH, SXTB +-; alu_shift any data instruction that doesn't hit memory or fp +-; regs, but has a source operand shifted by a constant +-; alu_shift_reg any data instruction that doesn't hit memory or fp +-; regs, but has a source operand shifted by a register value +-; mult a multiply instruction +-; block blockage insn, this blocks all functional units +-; float a floating point arithmetic operation (subject to expansion) +-; fdivd DFmode floating point division +-; fdivs SFmode floating point division +-; f_load[sd] A single/double load from memory. Used for VFP unit. +-; f_store[sd] A single/double store to memory. Used for VFP unit. +-; f_flag a transfer of co-processor flags to the CPSR +-; f_2_r transfer float to core (no memory needed) +-; r_2_f transfer core to float +-; f_cvt convert floating<->integral +-; branch a branch +-; call a subroutine call +-; load_byte load byte(s) from memory to arm registers +-; load1 load 1 word from memory to arm registers +-; load2 load 2 words from memory to arm registers +-; load3 load 3 words from memory to arm registers +-; load4 load 4 words from memory to arm registers +-; store store 1 word to memory from arm registers +-; store2 store 2 words +-; store3 store 3 words +-; store4 store 4 (or more) words ++; TYPE attribute is used to classify instructions for use in scheduling. + ; ++; Instruction classification: ++; ++; arlo_imm any arithmetic or logical instruction that doesn't have ++; a shifted operand and has an immediate operand. This ++; excludes MOV, MVN and RSB(S) immediate. ++; arlo_reg any arithmetic or logical instruction that doesn't have ++; a shifted or an immediate operand. This excludes ++; MOV and MVN but includes MOVT. This is also the default. ++; arlo_shift any arithmetic or logical instruction that has a source ++; operand shifted by a constant. This excludes ++; simple shifts. ++; arlo_shift_reg as arlo_shift, with the shift amount specified in a ++; register. ++; block blockage insn, this blocks all functional units. ++; branch branch. ++; call subroutine call. ++; clz count leading zeros (CLZ). ++; extend extend instruction (SXTB, SXTH, UXTB, UXTH). ++; f_2_r transfer from float to core (no memory needed). ++; f_cvt conversion between float and integral. ++; f_flag transfer of co-processor flags to the CPSR. ++; f_load[d,s] double/single load from memory. Used for VFP unit. ++; f_minmax[d,s] double/single floating point minimum/maximum. ++; f_rint[d,s] double/single floating point rount to integral. ++; f_sel[d,s] double/single floating byte select. ++; f_store[d,s] double/single store to memory. Used for VFP unit. ++; fadd[d,s] double/single floating-point scalar addition. ++; fcmp[d,s] double/single floating-point compare. ++; fconst[d,s] double/single load immediate. ++; fcpys single precision floating point cpy. ++; fdiv[d,s] double/single precision floating point division. ++; ffarith[d,s] double/single floating point abs/neg/cpy. ++; ffma[d,s] double/single floating point fused multiply-accumulate. ++; float floating point arithmetic operation. ++; fmac[d,s] double/single floating point multiply-accumulate. ++; fmul[d,s] double/single floating point multiply. ++; load_byte load byte(s) from memory to arm registers. ++; load1 load 1 word from memory to arm registers. ++; load2 load 2 words from memory to arm registers. ++; load3 load 3 words from memory to arm registers. ++; load4 load 4 words from memory to arm registers. ++; mla integer multiply accumulate. ++; mlas integer multiply accumulate, flag setting. ++; mov_imm simple MOV instruction that moves an immediate to ++; register. This includes MOVW, but not MOVT. ++; mov_reg simple MOV instruction that moves a register to another ++; register. This includes MOVW, but not MOVT. ++; mov_shift simple MOV instruction, shifted operand by a constant. ++; mov_shift_reg simple MOV instruction, shifted operand by a register. ++; mul integer multiply. ++; muls integer multiply, flag setting. ++; mvn_imm inverting move instruction, immediate. ++; mvn_reg inverting move instruction, register. ++; mvn_shift inverting move instruction, shifted operand by a constant. ++; mvn_shift_reg inverting move instruction, shifted operand by a register. ++; r_2_f transfer from core to float. ++; sdiv signed division. ++; shift simple shift operation (LSL, LSR, ASR, ROR) with an ++; immediate. ++; shift_reg simple shift by a register. ++; smlad signed multiply accumulate dual. ++; smladx signed multiply accumulate dual reverse. ++; smlal signed multiply accumulate long. ++; smlald signed multiply accumulate long dual. ++; smlals signed multiply accumulate long, flag setting. ++; smlalxy signed multiply accumulate, 16x16-bit, 64-bit accumulate. ++; smlawx signed multiply accumulate, 32x16-bit, 32-bit accumulate. ++; smlawy signed multiply accumulate wide, 32x16-bit, ++; 32-bit accumulate. ++; smlaxy signed multiply accumulate, 16x16-bit, 32-bit accumulate. ++; smlsd signed multiply subtract dual. ++; smlsdx signed multiply subtract dual reverse. ++; smlsld signed multiply subtract long dual. ++; smmla signed most significant word multiply accumulate. ++; smmul signed most significant word multiply. ++; smmulr signed most significant word multiply, rounded. ++; smuad signed dual multiply add. ++; smuadx signed dual multiply add reverse. ++; smull signed multiply long. ++; smulls signed multiply long, flag setting. ++; smulwy signed multiply wide, 32x16-bit, 32-bit accumulate. ++; smulxy signed multiply, 16x16-bit, 32-bit accumulate. ++; smusd signed dual multiply subtract. ++; smusdx signed dual multiply subtract reverse. ++; store1 store 1 word to memory from arm registers. ++; store2 store 2 words to memory from arm registers. ++; store3 store 3 words to memory from arm registers. ++; store4 store 4 (or more) words to memory from arm registers. ++; udiv unsigned division. ++; umaal unsigned multiply accumulate accumulate long. ++; umlal unsigned multiply accumulate long. ++; umlals unsigned multiply accumulate long, flag setting. ++; umull unsigned multiply long. ++; umulls unsigned multiply long, flag setting. ++; ++; The classification below is for instructions used by the Wireless MMX ++; Technology. Each attribute value is used to classify an instruction of the ++; same name or family. ++; ++; wmmx_tandc ++; wmmx_tbcst ++; wmmx_textrc ++; wmmx_textrm ++; wmmx_tinsr ++; wmmx_tmcr ++; wmmx_tmcrr ++; wmmx_tmia ++; wmmx_tmiaph ++; wmmx_tmiaxy ++; wmmx_tmrc ++; wmmx_tmrrc ++; wmmx_tmovmsk ++; wmmx_torc ++; wmmx_torvsc ++; wmmx_wabs ++; wmmx_wdiff ++; wmmx_wacc ++; wmmx_wadd ++; wmmx_waddbhus ++; wmmx_waddsubhx ++; wmmx_waligni ++; wmmx_walignr ++; wmmx_wand ++; wmmx_wandn ++; wmmx_wavg2 ++; wmmx_wavg4 ++; wmmx_wcmpeq ++; wmmx_wcmpgt ++; wmmx_wmac ++; wmmx_wmadd ++; wmmx_wmax ++; wmmx_wmerge ++; wmmx_wmiawxy ++; wmmx_wmiaxy ++; wmmx_wmin ++; wmmx_wmov ++; wmmx_wmul ++; wmmx_wmulw ++; wmmx_wldr ++; wmmx_wor ++; wmmx_wpack ++; wmmx_wqmiaxy ++; wmmx_wqmulm ++; wmmx_wqmulwm ++; wmmx_wror ++; wmmx_wsad ++; wmmx_wshufh ++; wmmx_wsll ++; wmmx_wsra ++; wmmx_wsrl ++; wmmx_wstr ++; wmmx_wsub ++; wmmx_wsubaddhx ++; wmmx_wunpckeh ++; wmmx_wunpckel ++; wmmx_wunpckih ++; wmmx_wunpckil ++; wmmx_wxor + + (define_attr "type" +- "simple_alu_imm,\ +- alu_reg,\ +- simple_alu_shift,\ +- alu_shift,\ +- alu_shift_reg,\ +- mult,\ ++ "arlo_imm,\ ++ arlo_reg,\ ++ arlo_shift,\ ++ arlo_shift_reg,\ + block,\ +- float,\ ++ branch,\ ++ call,\ ++ clz,\ ++ crc,\ ++ extend,\ ++ f_2_r,\ ++ f_cvt,\ ++ f_flag,\ ++ f_loadd,\ ++ f_loads,\ ++ f_minmaxd,\ ++ f_minmaxs,\ ++ f_rintd,\ ++ f_rints,\ ++ f_seld,\ ++ f_sels,\ ++ f_stored,\ ++ f_stores,\ ++ faddd,\ ++ fadds,\ ++ fcmpd,\ ++ fcmps,\ ++ fconstd,\ ++ fconsts,\ ++ fcpys,\ + fdivd,\ + fdivs,\ ++ ffarithd,\ ++ ffariths,\ ++ ffmad,\ ++ ffmas,\ ++ float,\ ++ fmacd,\ ++ fmacs,\ ++ fmuld,\ + fmuls,\ +- fmuld,\ +- fmacs,\ +- fmacd,\ +- ffmas,\ +- ffmad,\ +- f_rints,\ +- f_rintd,\ +- f_minmaxs,\ +- f_minmaxd,\ +- f_flag,\ +- f_loads,\ +- f_loadd,\ +- f_stores,\ +- f_stored,\ +- f_2_r,\ +- r_2_f,\ +- f_cvt,\ +- branch,\ +- call,\ + load_byte,\ + load1,\ + load2,\ + load3,\ + load4,\ ++ mla,\ ++ mlas,\ ++ mov_imm,\ ++ mov_reg,\ ++ mov_shift,\ ++ mov_shift_reg,\ ++ mul,\ ++ muls,\ ++ mvn_imm,\ ++ mvn_reg,\ ++ mvn_shift,\ ++ mvn_shift_reg,\ ++ r_2_f,\ ++ sdiv,\ ++ shift,\ ++ shift_reg,\ ++ smlad,\ ++ smladx,\ ++ smlal,\ ++ smlald,\ ++ smlals,\ ++ smlalxy,\ ++ smlawx,\ ++ smlawy,\ ++ smlaxy,\ ++ smlsd,\ ++ smlsdx,\ ++ smlsld,\ ++ smmla,\ ++ smmul,\ ++ smmulr,\ ++ smuad,\ ++ smuadx,\ ++ smull,\ ++ smulls,\ ++ smulwy,\ ++ smulxy,\ ++ smusd,\ ++ smusdx,\ + store1,\ + store2,\ + store3,\ + store4,\ +- fconsts,\ +- fconstd,\ +- fadds,\ +- faddd,\ +- ffariths,\ +- ffarithd,\ +- fcmps,\ +- fcmpd,\ +- fcpys" +- (if_then_else +- (eq_attr "insn" "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\ +- umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") +- (const_string "mult") +- (const_string "alu_reg"))) ++ udiv,\ ++ umaal,\ ++ umlal,\ ++ umlals,\ ++ umull,\ ++ umulls,\ ++ wmmx_tandc,\ ++ wmmx_tbcst,\ ++ wmmx_textrc,\ ++ wmmx_textrm,\ ++ wmmx_tinsr,\ ++ wmmx_tmcr,\ ++ wmmx_tmcrr,\ ++ wmmx_tmia,\ ++ wmmx_tmiaph,\ ++ wmmx_tmiaxy,\ ++ wmmx_tmrc,\ ++ wmmx_tmrrc,\ ++ wmmx_tmovmsk,\ ++ wmmx_torc,\ ++ wmmx_torvsc,\ ++ wmmx_wabs,\ ++ wmmx_wabsdiff,\ ++ wmmx_wacc,\ ++ wmmx_wadd,\ ++ wmmx_waddbhus,\ ++ wmmx_waddsubhx,\ ++ wmmx_waligni,\ ++ wmmx_walignr,\ ++ wmmx_wand,\ ++ wmmx_wandn,\ ++ wmmx_wavg2,\ ++ wmmx_wavg4,\ ++ wmmx_wcmpeq,\ ++ wmmx_wcmpgt,\ ++ wmmx_wmac,\ ++ wmmx_wmadd,\ ++ wmmx_wmax,\ ++ wmmx_wmerge,\ ++ wmmx_wmiawxy,\ ++ wmmx_wmiaxy,\ ++ wmmx_wmin,\ ++ wmmx_wmov,\ ++ wmmx_wmul,\ ++ wmmx_wmulw,\ ++ wmmx_wldr,\ ++ wmmx_wor,\ ++ wmmx_wpack,\ ++ wmmx_wqmiaxy,\ ++ wmmx_wqmulm,\ ++ wmmx_wqmulwm,\ ++ wmmx_wror,\ ++ wmmx_wsad,\ ++ wmmx_wshufh,\ ++ wmmx_wsll,\ ++ wmmx_wsra,\ ++ wmmx_wsrl,\ ++ wmmx_wstr,\ ++ wmmx_wsub,\ ++ wmmx_wsubaddhx,\ ++ wmmx_wunpckeh,\ ++ wmmx_wunpckel,\ ++ wmmx_wunpckih,\ ++ wmmx_wunpckil,\ ++ wmmx_wxor" ++ (const_string "arlo_reg")) + ++; Is this an (integer side) multiply with a 32-bit (or smaller) result? ++(define_attr "mul32" "no,yes" ++ (if_then_else ++ (eq_attr "type" ++ "smulxy,smlaxy,smulwy,smlawx,mul,muls,mla,mlas,smlawy,smuad,smuadx,\ ++ smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,smlald,smlsld") ++ (const_string "yes") ++ (const_string "no"))) ++ + ; Is this an (integer side) multiply with a 64-bit result? + (define_attr "mul64" "no,yes" + (if_then_else +- (eq_attr "insn" +- "smlalxy,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals") ++ (eq_attr "type" ++ "smlalxy,umull,umulls,umaal,umlal,umlals,smull,smulls,smlal,smlals") + (const_string "yes") + (const_string "no"))) + +-; wtype for WMMX insn scheduling purposes. +-(define_attr "wtype" +- "none,wor,wxor,wand,wandn,wmov,tmcrr,tmrrc,wldr,wstr,tmcr,tmrc,wadd,wsub,wmul,wmac,wavg2,tinsr,textrm,wshufh,wcmpeq,wcmpgt,wmax,wmin,wpack,wunpckih,wunpckil,wunpckeh,wunpckel,wror,wsra,wsrl,wsll,wmadd,tmia,tmiaph,tmiaxy,tbcst,tmovmsk,wacc,waligni,walignr,tandc,textrc,torc,torvsc,wsad,wabs,wabsdiff,waddsubhx,wsubaddhx,wavg4,wmulw,wqmulm,wqmulwm,waddbhus,wqmiaxy,wmiaxy,wmiawxy,wmerge" (const_string "none")) +- + ; Load scheduling, set from the arm_ld_sched variable + ; initialized by arm_option_override() + (define_attr "ldsched" "no,yes" (const (symbol_ref "arm_ld_sched"))) +@@ -402,6 +629,13 @@ + neon_mrrc,\ + neon_ldm_2,\ + neon_stm_2,\ ++ neon_crypto_aes,\ ++ neon_crypto_sha1_xor,\ ++ neon_crypto_sha1_fast,\ ++ neon_crypto_sha1_slow,\ ++ neon_crypto_sha256_fast,\ ++ neon_crypto_sha256_slow,\ ++ neon_mul_d_long,\ + none" + (const_string "none")) + +@@ -458,9 +692,19 @@ + ; than one on the main cpu execution unit. + (define_attr "core_cycles" "single,multi" + (if_then_else (eq_attr "type" +- "simple_alu_imm,alu_reg,\ +- simple_alu_shift,alu_shift,\ +- float,fdivd,fdivs") ++ "arlo_imm, arlo_reg,\ ++ extend, shift, arlo_shift, float, fdivd, fdivs,\ ++ wmmx_wor, wmmx_wxor, wmmx_wand, wmmx_wandn, wmmx_wmov, wmmx_tmcrr,\ ++ wmmx_tmrrc, wmmx_wldr, wmmx_wstr, wmmx_tmcr, wmmx_tmrc, wmmx_wadd,\ ++ wmmx_wsub, wmmx_wmul, wmmx_wmac, wmmx_wavg2, wmmx_tinsr, wmmx_textrm,\ ++ wmmx_wshufh, wmmx_wcmpeq, wmmx_wcmpgt, wmmx_wmax, wmmx_wmin, wmmx_wpack,\ ++ wmmx_wunpckih, wmmx_wunpckil, wmmx_wunpckeh, wmmx_wunpckel, wmmx_wror,\ ++ wmmx_wsra, wmmx_wsrl, wmmx_wsll, wmmx_wmadd, wmmx_tmia, wmmx_tmiaph,\ ++ wmmx_tmiaxy, wmmx_tbcst, wmmx_tmovmsk, wmmx_wacc, wmmx_waligni,\ ++ wmmx_walignr, wmmx_tandc, wmmx_textrc, wmmx_torc, wmmx_torvsc, wmmx_wsad,\ ++ wmmx_wabs, wmmx_wabsdiff, wmmx_waddsubhx, wmmx_wsubaddhx, wmmx_wavg4,\ ++ wmmx_wmulw, wmmx_wqmulm, wmmx_wqmulwm, wmmx_waddbhus, wmmx_wqmiaxy,\ ++ wmmx_wmiaxy, wmmx_wmiawxy, wmmx_wmerge") + (const_string "single") + (const_string "multi"))) + +@@ -502,7 +746,7 @@ + + (define_attr "generic_sched" "yes,no" + (const (if_then_else +- (ior (eq_attr "tune" "fa526,fa626,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexm4,marvell_pj4") ++ (ior (eq_attr "tune" "fa526,fa626,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexa53,cortexm4,marvell_pj4") + (eq_attr "tune_cortexr4" "yes")) + (const_string "no") + (const_string "yes")))) +@@ -510,7 +754,7 @@ + (define_attr "generic_vfp" "yes,no" + (const (if_then_else + (and (eq_attr "fpu" "vfp") +- (eq_attr "tune" "!arm1020e,arm1022e,cortexa5,cortexa7,cortexa8,cortexa9,cortexm4,marvell_pj4") ++ (eq_attr "tune" "!arm1020e,arm1022e,cortexa5,cortexa7,cortexa8,cortexa9,cortexa53,cortexm4,marvell_pj4") + (eq_attr "tune_cortexr4" "no")) + (const_string "yes") + (const_string "no")))) +@@ -531,6 +775,7 @@ + (include "cortex-a8.md") + (include "cortex-a9.md") + (include "cortex-a15.md") ++(include "cortex-a53.md") + (include "cortex-r4.md") + (include "cortex-r4f.md") + (include "cortex-m4.md") +@@ -697,14 +942,17 @@ + ;; (plus (reg rN) (reg sp)) into (reg rN). In this case reload will + ;; put the duplicated register first, and not try the commutative version. + (define_insn_and_split "*arm_addsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=rk, r,k, r,r, k, r, k,k,r, k, r") +- (plus:SI (match_operand:SI 1 "s_register_operand" "%0, rk,k, r,rk,k, rk,k,r,rk,k, rk") +- (match_operand:SI 2 "reg_or_int_operand" "rk, rI,rI,k,Pj,Pj,L, L,L,PJ,PJ,?n")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=rk,l,l ,l ,r ,k ,r,r ,k ,r ,k,k,r ,k ,r") ++ (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,k ,r,rk,k ,rk,k,r,rk,k ,rk") ++ (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,rI,rI,k,Pj,Pj,L ,L,L,PJ,PJ,?n")))] + "TARGET_32BIT" + "@ + add%?\\t%0, %0, %2 + add%?\\t%0, %1, %2 + add%?\\t%0, %1, %2 ++ add%?\\t%0, %1, %2 ++ add%?\\t%0, %1, %2 ++ add%?\\t%0, %1, %2 + add%?\\t%0, %2, %1 + addw%?\\t%0, %1, %2 + addw%?\\t%0, %1, %2 +@@ -725,12 +973,13 @@ + operands[1], 0); + DONE; + " +- [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16") ++ [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,16") + (set_attr "predicable" "yes") +- (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*") ++ (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no") ++ (set_attr "arch" "t2,t2,t2,t2,*,*,*,t2,t2,*,*,a,t2,t2,*") + (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") +- (const_string "simple_alu_imm") +- (const_string "alu_reg"))) ++ (const_string "arlo_imm") ++ (const_string "arlo_reg"))) + ] + ) + +@@ -811,7 +1060,7 @@ + sub%.\\t%0, %1, #%n2 + add%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm, simple_alu_imm, *")] ++ (set_attr "type" "arlo_imm,arlo_imm,*")] + ) + + (define_insn "*addsi3_compare0_scratch" +@@ -827,7 +1076,7 @@ + cmn%?\\t%0, %1" + [(set_attr "conds" "set") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm, simple_alu_imm, *") ++ (set_attr "type" "arlo_imm,arlo_imm,*") + ] + ) + +@@ -834,17 +1083,20 @@ + (define_insn "*compare_negsi_si" + [(set (reg:CC_Z CC_REGNUM) + (compare:CC_Z +- (neg:SI (match_operand:SI 0 "s_register_operand" "r")) +- (match_operand:SI 1 "s_register_operand" "r")))] ++ (neg:SI (match_operand:SI 0 "s_register_operand" "l,r")) ++ (match_operand:SI 1 "s_register_operand" "l,r")))] + "TARGET_32BIT" + "cmn%?\\t%1, %0" + [(set_attr "conds" "set") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "arch" "t2,*") ++ (set_attr "length" "2,4") ++ (set_attr "predicable_short_it" "yes,no")] + ) + + ;; This is the canonicalization of addsi3_compare0_for_combiner when the + ;; addend is a constant. +-(define_insn "*cmpsi2_addneg" ++(define_insn "cmpsi2_addneg" + [(set (reg:CC CC_REGNUM) + (compare:CC + (match_operand:SI 1 "s_register_operand" "r,r") +@@ -914,7 +1166,7 @@ + sub%.\\t%0, %1, #%n2 + add%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,arlo_imm,*")] + ) + + (define_insn "*addsi3_compare_op2" +@@ -931,63 +1183,84 @@ + add%.\\t%0, %1, %2 + sub%.\\t%0, %1, #%n2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,arlo_imm,*")] + ) + + (define_insn "*compare_addsi2_op0" + [(set (reg:CC_C CC_REGNUM) +- (compare:CC_C +- (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") +- (match_operand:SI 1 "arm_add_operand" "I,L,r")) +- (match_dup 0)))] ++ (compare:CC_C ++ (plus:SI (match_operand:SI 0 "s_register_operand" "l,l,r,r,r") ++ (match_operand:SI 1 "arm_add_operand" "Pv,l,I,L,r")) ++ (match_dup 0)))] + "TARGET_32BIT" + "@ ++ cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1 ++ cmn%?\\t%0, %1 + cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1" + [(set_attr "conds" "set") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ++ (set_attr "arch" "t2,t2,*,*,*") ++ (set_attr "predicable_short_it" "yes,yes,no,no,no") ++ (set_attr "length" "2,2,4,4,4") ++ (set_attr "type" "arlo_imm,*,arlo_imm,arlo_imm,*")] + ) + + (define_insn "*compare_addsi2_op1" + [(set (reg:CC_C CC_REGNUM) +- (compare:CC_C +- (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r") +- (match_operand:SI 1 "arm_add_operand" "I,L,r")) +- (match_dup 1)))] ++ (compare:CC_C ++ (plus:SI (match_operand:SI 0 "s_register_operand" "l,l,r,r,r") ++ (match_operand:SI 1 "arm_add_operand" "Pv,l,I,L,r")) ++ (match_dup 1)))] + "TARGET_32BIT" + "@ ++ cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1 ++ cmn%?\\t%0, %1 + cmp%?\\t%0, #%n1 + cmn%?\\t%0, %1" + [(set_attr "conds" "set") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] +-) ++ (set_attr "arch" "t2,t2,*,*,*") ++ (set_attr "predicable_short_it" "yes,yes,no,no,no") ++ (set_attr "length" "2,2,4,4,4") ++ (set_attr "type" ++ "arlo_imm,*,arlo_imm,arlo_imm,*")] ++ ) + + (define_insn "*addsi3_carryin_" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (plus:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%r,r") +- (match_operand:SI 2 "arm_not_operand" "rI,K")) +- (LTUGEU:SI (reg: CC_REGNUM) (const_int 0))))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r,r") ++ (plus:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%l,r,r") ++ (match_operand:SI 2 "arm_not_operand" "0,rI,K")) ++ (LTUGEU:SI (reg: CC_REGNUM) (const_int 0))))] + "TARGET_32BIT" + "@ + adc%?\\t%0, %1, %2 ++ adc%?\\t%0, %1, %2 + sbc%?\\t%0, %1, #%B2" +- [(set_attr "conds" "use")] ++ [(set_attr "conds" "use") ++ (set_attr "predicable" "yes") ++ (set_attr "arch" "t2,*,*") ++ (set_attr "length" "4") ++ (set_attr "predicable_short_it" "yes,no,no")] + ) + + (define_insn "*addsi3_carryin_alt2_" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (plus:SI (plus:SI (LTUGEU:SI (reg: CC_REGNUM) (const_int 0)) +- (match_operand:SI 1 "s_register_operand" "%r,r")) +- (match_operand:SI 2 "arm_rhs_operand" "rI,K")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r,r") ++ (plus:SI (plus:SI (LTUGEU:SI (reg: CC_REGNUM) (const_int 0)) ++ (match_operand:SI 1 "s_register_operand" "%l,r,r")) ++ (match_operand:SI 2 "arm_rhs_operand" "l,rI,K")))] + "TARGET_32BIT" + "@ + adc%?\\t%0, %1, %2 ++ adc%?\\t%0, %1, %2 + sbc%?\\t%0, %1, #%B2" +- [(set_attr "conds" "use")] ++ [(set_attr "conds" "use") ++ (set_attr "predicable" "yes") ++ (set_attr "arch" "t2,*,*") ++ (set_attr "length" "4") ++ (set_attr "predicable_short_it" "yes,no,no")] + ) + + (define_insn "*addsi3_carryin_shift_" +@@ -1001,9 +1274,11 @@ + "TARGET_32BIT" + "adc%?\\t%0, %1, %3%S2" + [(set_attr "conds" "use") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg")))] + ) + + (define_insn "*addsi3_carryin_clobercc_" +@@ -1017,26 +1292,89 @@ + [(set_attr "conds" "set")] + ) + +-(define_expand "incscc" ++(define_insn "*subsi3_carryin" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (plus:SI (match_operator:SI 2 "arm_comparison_operator" +- [(match_operand:CC 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 1 "s_register_operand" "0,?r")))] ++ (minus:SI (minus:SI (match_operand:SI 1 "reg_or_int_operand" "r,I") ++ (match_operand:SI 2 "s_register_operand" "r,r")) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] + "TARGET_32BIT" +- "" ++ "@ ++ sbc%?\\t%0, %1, %2 ++ rsc%?\\t%0, %2, %1" ++ [(set_attr "conds" "use") ++ (set_attr "arch" "*,a") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + +-(define_insn "*arm_incscc" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (plus:SI (match_operator:SI 2 "arm_comparison_operator" +- [(match_operand:CC 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 1 "s_register_operand" "0,?r")))] ++(define_insn "*subsi3_carryin_const" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (minus:SI (plus:SI (match_operand:SI 1 "reg_or_int_operand" "r") ++ (match_operand:SI 2 "arm_not_operand" "K")) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ "TARGET_32BIT" ++ "sbc\\t%0, %1, #%B2" ++ [(set_attr "conds" "use")] ++) ++ ++(define_insn "*subsi3_carryin_compare" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_operand:SI 1 "s_register_operand" "r") ++ (match_operand:SI 2 "s_register_operand" "r"))) ++ (set (match_operand:SI 0 "s_register_operand" "=r") ++ (minus:SI (minus:SI (match_dup 1) ++ (match_dup 2)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ "TARGET_32BIT" ++ "sbcs\\t%0, %1, %2" ++ [(set_attr "conds" "set")] ++) ++ ++(define_insn "*subsi3_carryin_compare_const" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_operand:SI 1 "reg_or_int_operand" "r") ++ (match_operand:SI 2 "arm_not_operand" "K"))) ++ (set (match_operand:SI 0 "s_register_operand" "=r") ++ (minus:SI (plus:SI (match_dup 1) ++ (match_dup 2)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ "TARGET_32BIT" ++ "sbcs\\t%0, %1, #%B2" ++ [(set_attr "conds" "set")] ++) ++ ++(define_insn "*subsi3_carryin_shift" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (minus:SI (minus:SI ++ (match_operand:SI 1 "s_register_operand" "r") ++ (match_operator:SI 2 "shift_operator" ++ [(match_operand:SI 3 "s_register_operand" "r") ++ (match_operand:SI 4 "reg_or_int_operand" "rM")])) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ "TARGET_32BIT" ++ "sbc%?\\t%0, %1, %3%S2" ++ [(set_attr "conds" "use") ++ (set_attr "predicable" "yes") ++ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "") ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg")))] ++) ++ ++(define_insn "*rsbsi3_carryin_shift" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (minus:SI (minus:SI ++ (match_operator:SI 2 "shift_operator" ++ [(match_operand:SI 3 "s_register_operand" "r") ++ (match_operand:SI 4 "reg_or_int_operand" "rM")]) ++ (match_operand:SI 1 "s_register_operand" "r")) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] + "TARGET_ARM" +- "@ +- add%d2\\t%0, %1, #1 +- mov%D2\\t%0, %1\;add%d2\\t%0, %1, #1" ++ "rsc%?\\t%0, %1, %3%S2" + [(set_attr "conds" "use") +- (set_attr "length" "4,8")] ++ (set_attr "predicable" "yes") ++ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "") ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg")))] + ) + + ; transform ((x << y) - 1) to ~(~(x-1) << y) Where X is a constant. +@@ -1087,13 +1425,27 @@ + " + ) + +-(define_insn "*arm_subdi3" ++(define_insn_and_split "*arm_subdi3" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r,&r") + (minus:DI (match_operand:DI 1 "s_register_operand" "0,r,0") + (match_operand:DI 2 "s_register_operand" "r,0,0"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT && !TARGET_NEON" +- "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2" ++ "#" ; "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))]) ++ (set (match_dup 3) (minus:SI (minus:SI (match_dup 4) (match_dup 5)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ operands[5] = gen_highpart (SImode, operands[2]); ++ operands[2] = gen_lowpart (SImode, operands[2]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) +@@ -1108,7 +1460,7 @@ + [(set_attr "length" "4")] + ) + +-(define_insn "*subdi_di_zesidi" ++(define_insn_and_split "*subdi_di_zesidi" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (minus:DI (match_operand:DI 1 "s_register_operand" "0,r") + (zero_extend:DI +@@ -1115,12 +1467,25 @@ + (match_operand:SI 2 "s_register_operand" "r,r")))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT" +- "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, #0" ++ "#" ; "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, #0" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))]) ++ (set (match_dup 3) (minus:SI (plus:SI (match_dup 4) (match_dup 5)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ operands[5] = GEN_INT (~0); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) + +-(define_insn "*subdi_di_sesidi" ++(define_insn_and_split "*subdi_di_sesidi" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (minus:DI (match_operand:DI 1 "s_register_operand" "0,r") + (sign_extend:DI +@@ -1127,12 +1492,26 @@ + (match_operand:SI 2 "s_register_operand" "r,r")))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT" +- "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, %2, asr #31" ++ "#" ; "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, %2, asr #31" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))]) ++ (set (match_dup 3) (minus:SI (minus:SI (match_dup 4) ++ (ashiftrt:SI (match_dup 2) ++ (const_int 31))) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) + +-(define_insn "*subdi_zesidi_di" ++(define_insn_and_split "*subdi_zesidi_di" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (minus:DI (zero_extend:DI + (match_operand:SI 2 "s_register_operand" "r,r")) +@@ -1139,12 +1518,26 @@ + (match_operand:DI 1 "s_register_operand" "0,r"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, #0" ++ "#" ; "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, #0" ++ ; is equivalent to: ++ ; "subs\\t%Q0, %2, %Q1\;rsc\\t%R0, %R1, #0" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 2) (match_dup 1))) ++ (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 1)))]) ++ (set (match_dup 3) (minus:SI (minus:SI (const_int 0) (match_dup 4)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) + +-(define_insn "*subdi_sesidi_di" ++(define_insn_and_split "*subdi_sesidi_di" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (minus:DI (sign_extend:DI + (match_operand:SI 2 "s_register_operand" "r,r")) +@@ -1151,12 +1544,29 @@ + (match_operand:DI 1 "s_register_operand" "0,r"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, %2, asr #31" ++ "#" ; "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, %2, asr #31" ++ ; is equivalent to: ++ ; "subs\\t%Q0, %2, %Q1\;rsc\\t%R0, %R1, %2, asr #31" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 2) (match_dup 1))) ++ (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 1)))]) ++ (set (match_dup 3) (minus:SI (minus:SI ++ (ashiftrt:SI (match_dup 2) ++ (const_int 31)) ++ (match_dup 4)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) + +-(define_insn "*subdi_zesidi_zesidi" ++(define_insn_and_split "*subdi_zesidi_zesidi" + [(set (match_operand:DI 0 "s_register_operand" "=r") + (minus:DI (zero_extend:DI + (match_operand:SI 1 "s_register_operand" "r")) +@@ -1164,7 +1574,17 @@ + (match_operand:SI 2 "s_register_operand" "r")))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT" +- "subs\\t%Q0, %1, %2\;sbc\\t%R0, %1, %1" ++ "#" ; "subs\\t%Q0, %1, %2\;sbc\\t%R0, %1, %1" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))]) ++ (set (match_dup 3) (minus:SI (minus:SI (match_dup 1) (match_dup 1)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) +@@ -1201,12 +1621,16 @@ + + ; ??? Check Thumb-2 split length + (define_insn_and_split "*arm_subsi3_insn" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,rk,r") +- (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n") +- (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,l ,l ,l ,r ,r,r,rk,r") ++ (minus:SI (match_operand:SI 1 "reg_or_int_operand" "l ,0 ,l ,Pz,rI,r,r,k ,?n") ++ (match_operand:SI 2 "reg_or_int_operand" "l ,Py,Pd,l ,r ,I,r,r ,r")))] + "TARGET_32BIT" + "@ ++ sub%?\\t%0, %1, %2 ++ sub%?\\t%0, %2 ++ sub%?\\t%0, %1, %2 + rsb%?\\t%0, %2, %1 ++ rsb%?\\t%0, %2, %1 + sub%?\\t%0, %1, %2 + sub%?\\t%0, %1, %2 + sub%?\\t%0, %1, %2 +@@ -1219,9 +1643,11 @@ + INTVAL (operands[1]), operands[0], operands[2], 0); + DONE; + " +- [(set_attr "length" "4,4,4,4,16") ++ [(set_attr "length" "4,4,4,4,4,4,4,4,16") ++ (set_attr "arch" "t2,t2,t2,t2,*,*,*,*,*") + (set_attr "predicable" "yes") +- (set_attr "type" "*,simple_alu_imm,*,*,*")] ++ (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no") ++ (set_attr "type" "*,*,*,*,arlo_imm,arlo_imm,*,*,arlo_imm")] + ) + + (define_peephole2 +@@ -1251,10 +1677,10 @@ + sub%.\\t%0, %1, %2 + rsb%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,*,*")] ++ (set_attr "type" "arlo_imm,*,*")] + ) + +-(define_insn "*subsi3_compare" ++(define_insn "subsi3_compare" + [(set (reg:CC CC_REGNUM) + (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I") + (match_operand:SI 2 "arm_rhs_operand" "I,r,r"))) +@@ -1266,32 +1692,9 @@ + sub%.\\t%0, %1, %2 + rsb%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,*,*")] ++ (set_attr "type" "arlo_imm,*,*")] + ) + +-(define_expand "decscc" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") +- (match_operator:SI 2 "arm_comparison_operator" +- [(match_operand 3 "cc_register" "") (const_int 0)])))] +- "TARGET_32BIT" +- "" +-) +- +-(define_insn "*arm_decscc" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") +- (match_operator:SI 2 "arm_comparison_operator" +- [(match_operand 3 "cc_register" "") (const_int 0)])))] +- "TARGET_ARM" +- "@ +- sub%d2\\t%0, %1, #1 +- mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" +- [(set_attr "conds" "use") +- (set_attr "length" "*,8") +- (set_attr "type" "simple_alu_imm,*")] +-) +- + (define_expand "subsf3" + [(set (match_operand:SF 0 "s_register_operand" "") + (minus:SF (match_operand:SF 1 "s_register_operand" "") +@@ -1311,6 +1714,20 @@ + + ;; Multiplication insns + ++(define_expand "mulhi3" ++ [(set (match_operand:HI 0 "s_register_operand" "") ++ (mult:HI (match_operand:HI 1 "s_register_operand" "") ++ (match_operand:HI 2 "s_register_operand" "")))] ++ "TARGET_DSP_MULTIPLY" ++ " ++ { ++ rtx result = gen_reg_rtx (SImode); ++ emit_insn (gen_mulhisi3 (result, operands[1], operands[2])); ++ emit_move_insn (operands[0], gen_lowpart (HImode, result)); ++ DONE; ++ }" ++) ++ + (define_expand "mulsi3" + [(set (match_operand:SI 0 "s_register_operand" "") + (mult:SI (match_operand:SI 2 "s_register_operand" "") +@@ -1326,18 +1743,21 @@ + (match_operand:SI 1 "s_register_operand" "%0,r")))] + "TARGET_32BIT && !arm_arch6" + "mul%?\\t%0, %2, %1" +- [(set_attr "insn" "mul") ++ [(set_attr "type" "mul") + (set_attr "predicable" "yes")] + ) + + (define_insn "*arm_mulsi3_v6" +- [(set (match_operand:SI 0 "s_register_operand" "=r") +- (mult:SI (match_operand:SI 1 "s_register_operand" "r") +- (match_operand:SI 2 "s_register_operand" "r")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,l,r") ++ (mult:SI (match_operand:SI 1 "s_register_operand" "0,l,r") ++ (match_operand:SI 2 "s_register_operand" "l,0,r")))] + "TARGET_32BIT && arm_arch6" + "mul%?\\t%0, %1, %2" +- [(set_attr "insn" "mul") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "mul") ++ (set_attr "predicable" "yes") ++ (set_attr "arch" "t2,t2,*") ++ (set_attr "length" "4") ++ (set_attr "predicable_short_it" "yes,yes,no")] + ) + + ; Unfortunately with the Thumb the '&'/'0' trick can fails when operands +@@ -1357,7 +1777,7 @@ + return \"mul\\t%0, %2\"; + " + [(set_attr "length" "4,4,2") +- (set_attr "insn" "mul")] ++ (set_attr "type" "muls")] + ) + + (define_insn "*thumb_mulsi3_v6" +@@ -1370,7 +1790,7 @@ + mul\\t%0, %1 + mul\\t%0, %1" + [(set_attr "length" "2") +- (set_attr "insn" "mul")] ++ (set_attr "type" "muls")] + ) + + (define_insn "*mulsi3_compare0" +@@ -1384,7 +1804,7 @@ + "TARGET_ARM && !arm_arch6" + "mul%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "muls")] ++ (set_attr "type" "muls")] + ) + + (define_insn "*mulsi3_compare0_v6" +@@ -1398,7 +1818,7 @@ + "TARGET_ARM && arm_arch6 && optimize_size" + "mul%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "muls")] ++ (set_attr "type" "muls")] + ) + + (define_insn "*mulsi_compare0_scratch" +@@ -1411,7 +1831,7 @@ + "TARGET_ARM && !arm_arch6" + "mul%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "muls")] ++ (set_attr "type" "muls")] + ) + + (define_insn "*mulsi_compare0_scratch_v6" +@@ -1424,7 +1844,7 @@ + "TARGET_ARM && arm_arch6 && optimize_size" + "mul%.\\t%0, %2, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "muls")] ++ (set_attr "type" "muls")] + ) + + ;; Unnamed templates to match MLA instruction. +@@ -1437,7 +1857,7 @@ + (match_operand:SI 3 "s_register_operand" "r,r,0,0")))] + "TARGET_32BIT && !arm_arch6" + "mla%?\\t%0, %2, %1, %3" +- [(set_attr "insn" "mla") ++ [(set_attr "type" "mla") + (set_attr "predicable" "yes")] + ) + +@@ -1449,8 +1869,9 @@ + (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_32BIT && arm_arch6" + "mla%?\\t%0, %2, %1, %3" +- [(set_attr "insn" "mla") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "mla") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*mulsi3addsi_compare0" +@@ -1467,7 +1888,7 @@ + "TARGET_ARM && arm_arch6" + "mla%.\\t%0, %2, %1, %3" + [(set_attr "conds" "set") +- (set_attr "insn" "mlas")] ++ (set_attr "type" "mlas")] + ) + + (define_insn "*mulsi3addsi_compare0_v6" +@@ -1484,7 +1905,7 @@ + "TARGET_ARM && arm_arch6 && optimize_size" + "mla%.\\t%0, %2, %1, %3" + [(set_attr "conds" "set") +- (set_attr "insn" "mlas")] ++ (set_attr "type" "mlas")] + ) + + (define_insn "*mulsi3addsi_compare0_scratch" +@@ -1499,7 +1920,7 @@ + "TARGET_ARM && !arm_arch6" + "mla%.\\t%0, %2, %1, %3" + [(set_attr "conds" "set") +- (set_attr "insn" "mlas")] ++ (set_attr "type" "mlas")] + ) + + (define_insn "*mulsi3addsi_compare0_scratch_v6" +@@ -1514,7 +1935,7 @@ + "TARGET_ARM && arm_arch6 && optimize_size" + "mla%.\\t%0, %2, %1, %3" + [(set_attr "conds" "set") +- (set_attr "insn" "mlas")] ++ (set_attr "type" "mlas")] + ) + + (define_insn "*mulsi3subsi" +@@ -1525,8 +1946,9 @@ + (match_operand:SI 1 "s_register_operand" "r"))))] + "TARGET_32BIT && arm_arch_thumb2" + "mls%?\\t%0, %2, %1, %3" +- [(set_attr "insn" "mla") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "mla") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "maddsidi4" +@@ -1548,7 +1970,7 @@ + (match_operand:DI 1 "s_register_operand" "0")))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "smlal%?\\t%Q0, %R0, %3, %2" +- [(set_attr "insn" "smlal") ++ [(set_attr "type" "smlal") + (set_attr "predicable" "yes")] + ) + +@@ -1561,8 +1983,9 @@ + (match_operand:DI 1 "s_register_operand" "0")))] + "TARGET_32BIT && arm_arch6" + "smlal%?\\t%Q0, %R0, %3, %2" +- [(set_attr "insn" "smlal") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smlal") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + ;; 32x32->64 widening multiply. +@@ -1587,7 +2010,7 @@ + (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "smull%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "smull") ++ [(set_attr "type" "smull") + (set_attr "predicable" "yes")] + ) + +@@ -1598,8 +2021,9 @@ + (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] + "TARGET_32BIT && arm_arch6" + "smull%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "smull") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smull") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "umulsidi3" +@@ -1618,7 +2042,7 @@ + (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "umull%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "umull") ++ [(set_attr "type" "umull") + (set_attr "predicable" "yes")] + ) + +@@ -1629,8 +2053,9 @@ + (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] + "TARGET_32BIT && arm_arch6" + "umull%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "umull") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "umull") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "umaddsidi4" +@@ -1652,7 +2077,7 @@ + (match_operand:DI 1 "s_register_operand" "0")))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "umlal%?\\t%Q0, %R0, %3, %2" +- [(set_attr "insn" "umlal") ++ [(set_attr "type" "umlal") + (set_attr "predicable" "yes")] + ) + +@@ -1665,8 +2090,9 @@ + (match_operand:DI 1 "s_register_operand" "0")))] + "TARGET_32BIT && arm_arch6" + "umlal%?\\t%Q0, %R0, %3, %2" +- [(set_attr "insn" "umlal") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "umlal") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "smulsi3_highpart" +@@ -1694,7 +2120,7 @@ + (clobber (match_scratch:SI 3 "=&r,&r"))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "smull%?\\t%3, %0, %2, %1" +- [(set_attr "insn" "smull") ++ [(set_attr "type" "smull") + (set_attr "predicable" "yes")] + ) + +@@ -1709,8 +2135,9 @@ + (clobber (match_scratch:SI 3 "=r"))] + "TARGET_32BIT && arm_arch6" + "smull%?\\t%3, %0, %2, %1" +- [(set_attr "insn" "smull") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smull") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "umulsi3_highpart" +@@ -1738,7 +2165,7 @@ + (clobber (match_scratch:SI 3 "=&r,&r"))] + "TARGET_32BIT && arm_arch3m && !arm_arch6" + "umull%?\\t%3, %0, %2, %1" +- [(set_attr "insn" "umull") ++ [(set_attr "type" "umull") + (set_attr "predicable" "yes")] + ) + +@@ -1753,8 +2180,9 @@ + (clobber (match_scratch:SI 3 "=r"))] + "TARGET_32BIT && arm_arch6" + "umull%?\\t%3, %0, %2, %1" +- [(set_attr "insn" "umull") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "umull") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "mulhisi3" +@@ -1765,7 +2193,7 @@ + (match_operand:HI 2 "s_register_operand" "r"))))] + "TARGET_DSP_MULTIPLY" + "smulbb%?\\t%0, %1, %2" +- [(set_attr "insn" "smulxy") ++ [(set_attr "type" "smulxy") + (set_attr "predicable" "yes")] + ) + +@@ -1778,8 +2206,9 @@ + (match_operand:HI 2 "s_register_operand" "r"))))] + "TARGET_DSP_MULTIPLY" + "smultb%?\\t%0, %1, %2" +- [(set_attr "insn" "smulxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smulxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*mulhisi3bt" +@@ -1791,8 +2220,9 @@ + (const_int 16))))] + "TARGET_DSP_MULTIPLY" + "smulbt%?\\t%0, %1, %2" +- [(set_attr "insn" "smulxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smulxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*mulhisi3tt" +@@ -1805,8 +2235,9 @@ + (const_int 16))))] + "TARGET_DSP_MULTIPLY" + "smultt%?\\t%0, %1, %2" +- [(set_attr "insn" "smulxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smulxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "maddhisi4" +@@ -1818,8 +2249,9 @@ + (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_DSP_MULTIPLY" + "smlabb%?\\t%0, %1, %2, %3" +- [(set_attr "insn" "smlaxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smlaxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + ;; Note: there is no maddhisi4ibt because this one is canonical form +@@ -1833,8 +2265,9 @@ + (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_DSP_MULTIPLY" + "smlatb%?\\t%0, %1, %2, %3" +- [(set_attr "insn" "smlaxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smlaxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*maddhisi4tt" +@@ -1848,8 +2281,9 @@ + (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_DSP_MULTIPLY" + "smlatt%?\\t%0, %1, %2, %3" +- [(set_attr "insn" "smlaxy") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "smlaxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "maddhidi4" +@@ -1856,14 +2290,15 @@ + [(set (match_operand:DI 0 "s_register_operand" "=r") + (plus:DI + (mult:DI (sign_extend:DI +- (match_operand:HI 1 "s_register_operand" "r")) ++ (match_operand:HI 1 "s_register_operand" "r")) + (sign_extend:DI + (match_operand:HI 2 "s_register_operand" "r"))) + (match_operand:DI 3 "s_register_operand" "0")))] + "TARGET_DSP_MULTIPLY" + "smlalbb%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "smlalxy") +- (set_attr "predicable" "yes")]) ++ [(set_attr "type" "smlalxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + ;; Note: there is no maddhidi4ibt because this one is canonical form + (define_insn "*maddhidi4tb" +@@ -1878,8 +2313,9 @@ + (match_operand:DI 3 "s_register_operand" "0")))] + "TARGET_DSP_MULTIPLY" + "smlaltb%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "smlalxy") +- (set_attr "predicable" "yes")]) ++ [(set_attr "type" "smlalxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*maddhidi4tt" + [(set (match_operand:DI 0 "s_register_operand" "=r") +@@ -1895,8 +2331,9 @@ + (match_operand:DI 3 "s_register_operand" "0")))] + "TARGET_DSP_MULTIPLY" + "smlaltt%?\\t%Q0, %R0, %1, %2" +- [(set_attr "insn" "smlalxy") +- (set_attr "predicable" "yes")]) ++ [(set_attr "type" "smlalxy") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_expand "mulsf3" + [(set (match_operand:SF 0 "s_register_operand" "") +@@ -2024,13 +2461,49 @@ + "" + ) + +-(define_insn "*anddi3_insn" +- [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") +- (and:DI (match_operand:DI 1 "s_register_operand" "%0,r") +- (match_operand:DI 2 "s_register_operand" "r,r")))] +- "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON" +- "#" +- [(set_attr "length" "8")] ++(define_insn_and_split "*anddi3_insn" ++ [(set (match_operand:DI 0 "s_register_operand" "=w,w ,&r,&r,&r,&r,?w,?w") ++ (and:DI (match_operand:DI 1 "s_register_operand" "%w,0 ,0 ,r ,0 ,r ,w ,0") ++ (match_operand:DI 2 "arm_anddi_operand_neon" "w ,DL,r ,r ,De,De,w ,DL")))] ++ "TARGET_32BIT && !TARGET_IWMMXT" ++{ ++ switch (which_alternative) ++ { ++ case 0: /* fall through */ ++ case 6: return "vand\t%P0, %P1, %P2"; ++ case 1: /* fall through */ ++ case 7: return neon_output_logic_immediate ("vand", &operands[2], ++ DImode, 1, VALID_NEON_QREG_MODE (DImode)); ++ case 2: ++ case 3: ++ case 4: ++ case 5: /* fall through */ ++ return "#"; ++ default: gcc_unreachable (); ++ } ++} ++ "TARGET_32BIT && !TARGET_IWMMXT && reload_completed ++ && !(IS_VFP_REGNUM (REGNO (operands[0])))" ++ [(set (match_dup 3) (match_dup 4)) ++ (set (match_dup 5) (match_dup 6))] ++ " ++ { ++ operands[3] = gen_lowpart (SImode, operands[0]); ++ operands[5] = gen_highpart (SImode, operands[0]); ++ ++ operands[4] = simplify_gen_binary (AND, SImode, ++ gen_lowpart (SImode, operands[1]), ++ gen_lowpart (SImode, operands[2])); ++ operands[6] = simplify_gen_binary (AND, SImode, ++ gen_highpart (SImode, operands[1]), ++ gen_highpart_mode (SImode, DImode, operands[2])); ++ ++ }" ++ [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,*,*,neon_int_1,neon_int_1") ++ (set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,*, ++ avoid_neon_for_64bits,avoid_neon_for_64bits") ++ (set_attr "length" "*,*,8,8,8,8,*,*") ++ ] + ) + + (define_insn_and_split "*anddi_zesidi_di" +@@ -2145,12 +2618,13 @@ + + ; ??? Check split length for Thumb-2 + (define_insn_and_split "*arm_andsi3_insn" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") +- (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r") +- (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r,r,r") ++ (and:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r,r") ++ (match_operand:SI 2 "reg_or_int_operand" "I,l,K,r,?n")))] + "TARGET_32BIT" + "@ + and%?\\t%0, %1, %2 ++ and%?\\t%0, %1, %2 + bic%?\\t%0, %1, #%B2 + and%?\\t%0, %1, %2 + #" +@@ -2164,9 +2638,11 @@ + INTVAL (operands[2]), operands[0], operands[1], 0); + DONE; + " +- [(set_attr "length" "4,4,4,16") ++ [(set_attr "length" "4,4,4,4,16") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")] ++ (set_attr "predicable_short_it" "no,yes,no,no,no") ++ (set_attr "type" ++ "arlo_imm,arlo_imm,*,*,arlo_imm")] + ) + + (define_insn "*thumb1_andsi3_insn" +@@ -2176,7 +2652,7 @@ + "TARGET_THUMB1" + "and\\t%0, %2" + [(set_attr "length" "2") +- (set_attr "type" "simple_alu_imm") ++ (set_attr "type" "arlo_imm") + (set_attr "conds" "set")]) + + (define_insn "*andsi3_compare0" +@@ -2193,7 +2669,7 @@ + bic%.\\t%0, %1, #%B2 + and%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,arlo_imm,*")] + ) + + (define_insn "*andsi3_compare0_scratch" +@@ -2209,7 +2685,7 @@ + bic%.\\t%2, %0, #%B1 + tst%?\\t%0, %1" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,arlo_imm,*")] + ) + + (define_insn "*zeroextractsi_compare0_scratch" +@@ -2216,7 +2692,7 @@ + [(set (reg:CC_NOOV CC_REGNUM) + (compare:CC_NOOV (zero_extract:SI + (match_operand:SI 0 "s_register_operand" "r") +- (match_operand 1 "const_int_operand" "n") ++ (match_operand 1 "const_int_operand" "n") + (match_operand 2 "const_int_operand" "n")) + (const_int 0)))] + "TARGET_32BIT +@@ -2232,7 +2708,8 @@ + " + [(set_attr "conds" "set") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm")] ++ (set_attr "predicable_short_it" "no") ++ (set_attr "type" "arlo_imm")] + ) + + (define_insn_and_split "*ne_zeroextractsi" +@@ -2659,7 +3136,8 @@ + "arm_arch_thumb2" + "bfc%?\t%0, %2, %1" + [(set_attr "length" "4") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "insv_t2" +@@ -2670,7 +3148,8 @@ + "arm_arch_thumb2" + "bfi%?\t%0, %3, %2, %1" + [(set_attr "length" "4") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + ; constants for op 2 will never be given to these patterns. +@@ -2697,7 +3176,7 @@ + [(set_attr "length" "8") + (set_attr "predicable" "yes")] + ) +- ++ + (define_insn_and_split "*anddi_notzesidi_di" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (and:DI (not:DI (zero_extend:DI +@@ -2722,9 +3201,10 @@ + operands[1] = gen_lowpart (SImode, operands[1]); + }" + [(set_attr "length" "4,8") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) +- ++ + (define_insn_and_split "*anddi_notsesidi_di" + [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") + (and:DI (not:DI (sign_extend:DI +@@ -2745,9 +3225,10 @@ + operands[1] = gen_lowpart (SImode, operands[1]); + }" + [(set_attr "length" "8") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) +- ++ + (define_insn "andsi_notsi_si" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r")) +@@ -2754,7 +3235,8 @@ + (match_operand:SI 1 "s_register_operand" "r")))] + "TARGET_32BIT" + "bic%?\\t%0, %1, %2" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "thumb1_bicsi3" +@@ -2777,8 +3259,8 @@ + [(set_attr "predicable" "yes") + (set_attr "shift" "2") + (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg")))] + ) + + (define_insn "*andsi_notsi_si_compare0" +@@ -2814,14 +3296,47 @@ + "" + ) + +-(define_insn "*iordi3_insn" +- [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") +- (ior:DI (match_operand:DI 1 "s_register_operand" "%0,r") +- (match_operand:DI 2 "s_register_operand" "r,r")))] +- "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON" +- "#" +- [(set_attr "length" "8") +- (set_attr "predicable" "yes")] ++(define_insn_and_split "*iordi3_insn" ++ [(set (match_operand:DI 0 "s_register_operand" "=w,w ,&r,&r,&r,&r,?w,?w") ++ (ior:DI (match_operand:DI 1 "s_register_operand" "%w,0 ,0 ,r ,0 ,r ,w ,0") ++ (match_operand:DI 2 "arm_iordi_operand_neon" "w ,Dl,r ,r ,Df,Df,w ,Dl")))] ++ "TARGET_32BIT && !TARGET_IWMMXT" ++ { ++ switch (which_alternative) ++ { ++ case 0: /* fall through */ ++ case 6: return "vorr\t%P0, %P1, %P2"; ++ case 1: /* fall through */ ++ case 7: return neon_output_logic_immediate ("vorr", &operands[2], ++ DImode, 0, VALID_NEON_QREG_MODE (DImode)); ++ case 2: ++ case 3: ++ case 4: ++ case 5: ++ return "#"; ++ default: gcc_unreachable (); ++ } ++ } ++ "TARGET_32BIT && !TARGET_IWMMXT && reload_completed ++ && !(IS_VFP_REGNUM (REGNO (operands[0])))" ++ [(set (match_dup 3) (match_dup 4)) ++ (set (match_dup 5) (match_dup 6))] ++ " ++ { ++ operands[3] = gen_lowpart (SImode, operands[0]); ++ operands[5] = gen_highpart (SImode, operands[0]); ++ ++ operands[4] = simplify_gen_binary (IOR, SImode, ++ gen_lowpart (SImode, operands[1]), ++ gen_lowpart (SImode, operands[2])); ++ operands[6] = simplify_gen_binary (IOR, SImode, ++ gen_highpart (SImode, operands[1]), ++ gen_highpart_mode (SImode, DImode, operands[2])); ++ ++ }" ++ [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,*,*,neon_int_1,neon_int_1") ++ (set_attr "length" "*,*,8,8,8,8,*,*") ++ (set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")] + ) + + (define_insn "*iordi_zesidi_di" +@@ -2834,7 +3349,8 @@ + orr%?\\t%Q0, %Q1, %2 + #" + [(set_attr "length" "4,8") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*iordi_sesidi_di" +@@ -2879,12 +3395,13 @@ + ) + + (define_insn_and_split "*iorsi3_insn" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") +- (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r") +- (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r,r,r") ++ (ior:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r,r") ++ (match_operand:SI 2 "reg_or_int_operand" "I,l,K,r,?n")))] + "TARGET_32BIT" + "@ + orr%?\\t%0, %1, %2 ++ orr%?\\t%0, %1, %2 + orn%?\\t%0, %1, #%B2 + orr%?\\t%0, %1, %2 + #" +@@ -2894,14 +3411,15 @@ + || (TARGET_THUMB2 && const_ok_for_arm (~INTVAL (operands[2]))))" + [(clobber (const_int 0))] + { +- arm_split_constant (IOR, SImode, curr_insn, ++ arm_split_constant (IOR, SImode, curr_insn, + INTVAL (operands[2]), operands[0], operands[1], 0); + DONE; + } +- [(set_attr "length" "4,4,4,16") +- (set_attr "arch" "32,t2,32,32") ++ [(set_attr "length" "4,4,4,4,16") ++ (set_attr "arch" "32,t2,t2,32,32") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")] ++ (set_attr "predicable_short_it" "no,yes,no,no,no") ++ (set_attr "type" "arlo_imm,*,arlo_imm,*,*")] + ) + + (define_insn "*thumb1_iorsi3_insn" +@@ -2936,7 +3454,7 @@ + "TARGET_32BIT" + "orr%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,*")] + ) + + (define_insn "*iorsi3_compare0_scratch" +@@ -2948,25 +3466,55 @@ + "TARGET_32BIT" + "orr%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm, *")] ++ (set_attr "type" "arlo_imm,*")] + ) + + (define_expand "xordi3" + [(set (match_operand:DI 0 "s_register_operand" "") + (xor:DI (match_operand:DI 1 "s_register_operand" "") +- (match_operand:DI 2 "s_register_operand" "")))] ++ (match_operand:DI 2 "arm_xordi_operand" "")))] + "TARGET_32BIT" + "" + ) + +-(define_insn "*xordi3_insn" +- [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") +- (xor:DI (match_operand:DI 1 "s_register_operand" "%0,r") +- (match_operand:DI 2 "s_register_operand" "r,r")))] +- "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON" +- "#" +- [(set_attr "length" "8") +- (set_attr "predicable" "yes")] ++(define_insn_and_split "*xordi3_insn" ++ [(set (match_operand:DI 0 "s_register_operand" "=w,&r,&r,&r,&r,?w") ++ (xor:DI (match_operand:DI 1 "s_register_operand" "w ,%0,r ,0 ,r ,w") ++ (match_operand:DI 2 "arm_xordi_operand" "w ,r ,r ,Dg,Dg,w")))] ++ "TARGET_32BIT && !TARGET_IWMMXT" ++{ ++ switch (which_alternative) ++ { ++ case 1: ++ case 2: ++ case 3: ++ case 4: /* fall through */ ++ return "#"; ++ case 0: /* fall through */ ++ case 5: return "veor\t%P0, %P1, %P2"; ++ default: gcc_unreachable (); ++ } ++} ++ "TARGET_32BIT && !TARGET_IWMMXT && reload_completed ++ && !(IS_VFP_REGNUM (REGNO (operands[0])))" ++ [(set (match_dup 3) (match_dup 4)) ++ (set (match_dup 5) (match_dup 6))] ++ " ++ { ++ operands[3] = gen_lowpart (SImode, operands[0]); ++ operands[5] = gen_highpart (SImode, operands[0]); ++ ++ operands[4] = simplify_gen_binary (XOR, SImode, ++ gen_lowpart (SImode, operands[1]), ++ gen_lowpart (SImode, operands[2])); ++ operands[6] = simplify_gen_binary (XOR, SImode, ++ gen_highpart (SImode, operands[1]), ++ gen_highpart_mode (SImode, DImode, operands[2])); ++ ++ }" ++ [(set_attr "length" "*,8,8,8,8,*") ++ (set_attr "neon_type" "neon_int_1,*,*,*,*,neon_int_1") ++ (set_attr "arch" "neon_for_64bits,*,*,*,*,avoid_neon_for_64bits")] + ) + + (define_insn "*xordi_zesidi_di" +@@ -2979,7 +3527,8 @@ + eor%?\\t%Q0, %Q1, %2 + #" + [(set_attr "length" "4,8") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*xordi_sesidi_di" +@@ -3022,13 +3571,14 @@ + ) + + (define_insn_and_split "*arm_xorsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +- (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r") +- (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r,r") ++ (xor:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r") ++ (match_operand:SI 2 "reg_or_int_operand" "I,l,r,?n")))] + "TARGET_32BIT" + "@ + eor%?\\t%0, %1, %2 + eor%?\\t%0, %1, %2 ++ eor%?\\t%0, %1, %2 + #" + "TARGET_32BIT + && CONST_INT_P (operands[2]) +@@ -3039,9 +3589,10 @@ + INTVAL (operands[2]), operands[0], operands[1], 0); + DONE; + } +- [(set_attr "length" "4,4,16") ++ [(set_attr "length" "4,4,4,16") + (set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_imm,*,*")] ++ (set_attr "predicable_short_it" "no,yes,no,no") ++ (set_attr "type" "arlo_imm,*,*,*")] + ) + + (define_insn "*thumb1_xorsi3_insn" +@@ -3052,7 +3603,7 @@ + "eor\\t%0, %2" + [(set_attr "length" "2") + (set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm")] ++ (set_attr "type" "arlo_imm")] + ) + + (define_insn "*xorsi3_compare0" +@@ -3065,7 +3616,7 @@ + "TARGET_32BIT" + "eor%.\\t%0, %1, %2" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,*")] ++ (set_attr "type" "arlo_imm,*")] + ) + + (define_insn "*xorsi3_compare0_scratch" +@@ -3076,7 +3627,7 @@ + "TARGET_32BIT" + "teq%?\\t%0, %1" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm, *")] ++ (set_attr "type" "arlo_imm,*")] + ) + + ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), +@@ -3096,16 +3647,21 @@ + "" + ) + +-(define_insn "*andsi_iorsi3_notsi" ++(define_insn_and_split "*andsi_iorsi3_notsi" + [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r") + (and:SI (ior:SI (match_operand:SI 1 "s_register_operand" "%0,r,r") + (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")) + (not:SI (match_operand:SI 3 "arm_rhs_operand" "rI,rI,rI"))))] + "TARGET_32BIT" +- "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3" ++ "#" ; "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3" ++ "&& reload_completed" ++ [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (and:SI (not:SI (match_dup 3)) (match_dup 0)))] ++ "" + [(set_attr "length" "8") + (set_attr "ce_count" "2") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + ; ??? Are these four splitters still beneficial when the Thumb-2 bitfield +@@ -3241,7 +3797,8 @@ + (const_int 0)))] + "TARGET_32BIT" + "bic%?\\t%0, %1, %1, asr #31" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "*smax_m1" +@@ -3250,18 +3807,27 @@ + (const_int -1)))] + "TARGET_32BIT" + "orr%?\\t%0, %1, %1, asr #31" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + +-(define_insn "*arm_smax_insn" ++(define_insn_and_split "*arm_smax_insn" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") + (smax:SI (match_operand:SI 1 "s_register_operand" "%0,?r") + (match_operand:SI 2 "arm_rhs_operand" "rI,rI"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%1, %2\;movlt\\t%0, %2 +- cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;movlt\\t%0, %2 ++ ; cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2" ++ "TARGET_ARM" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) ++ (if_then_else:SI (ge:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (match_dup 1) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") + (set_attr "length" "8,12")] + ) +@@ -3290,18 +3856,27 @@ + (const_int 0)))] + "TARGET_32BIT" + "and%?\\t%0, %1, %1, asr #31" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + +-(define_insn "*arm_smin_insn" ++(define_insn_and_split "*arm_smin_insn" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") + (smin:SI (match_operand:SI 1 "s_register_operand" "%0,?r") + (match_operand:SI 2 "arm_rhs_operand" "rI,rI"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%1, %2\;movge\\t%0, %2 +- cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;movge\\t%0, %2 ++ ; cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2" ++ "TARGET_ARM" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) ++ (if_then_else:SI (lt:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (match_dup 1) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") + (set_attr "length" "8,12")] + ) +@@ -3316,16 +3891,24 @@ + "" + ) + +-(define_insn "*arm_umaxsi3" ++(define_insn_and_split "*arm_umaxsi3" + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") + (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") + (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%1, %2\;movcc\\t%0, %2 +- cmp\\t%1, %2\;movcs\\t%0, %1 +- cmp\\t%1, %2\;movcs\\t%0, %1\;movcc\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;movcc\\t%0, %2 ++ ; cmp\\t%1, %2\;movcs\\t%0, %1 ++ ; cmp\\t%1, %2\;movcs\\t%0, %1\;movcc\\t%0, %2" ++ "TARGET_ARM" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) ++ (if_then_else:SI (geu:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (match_dup 1) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") + (set_attr "length" "8,8,12")] + ) +@@ -3340,16 +3923,24 @@ + "" + ) + +-(define_insn "*arm_uminsi3" ++(define_insn_and_split "*arm_uminsi3" + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") + (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") + (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%1, %2\;movcs\\t%0, %2 +- cmp\\t%1, %2\;movcc\\t%0, %1 +- cmp\\t%1, %2\;movcc\\t%0, %1\;movcs\\t%0, %2" ++ "#" ++ ; cmp\\t%1, %2\;movcs\\t%0, %2 ++ ; cmp\\t%1, %2\;movcc\\t%0, %1 ++ ; cmp\\t%1, %2\;movcc\\t%0, %1\;movcs\\t%0, %2" ++ "TARGET_ARM" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) ++ (if_then_else:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (match_dup 1) ++ (match_dup 2)))] ++ "" + [(set_attr "conds" "clob") + (set_attr "length" "8,8,12")] + ) +@@ -3360,7 +3951,7 @@ + [(match_operand:SI 1 "s_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")])) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_32BIT" ++ "TARGET_32BIT && optimize_insn_for_size_p()" + "* + operands[3] = gen_rtx_fmt_ee (minmax_code (operands[3]), SImode, + operands[1], operands[2]); +@@ -3389,7 +3980,7 @@ + (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) + (match_operand:SI 1 "s_register_operand" "0,?r")])) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_32BIT && !arm_eliminable_register (operands[1])" ++ "TARGET_32BIT && !arm_eliminable_register (operands[1]) && !arm_restrict_it" + "* + { + enum rtx_code code = GET_CODE (operands[4]); +@@ -3423,6 +4014,54 @@ + (const_int 12)))] + ) + ++; Reject the frame pointer in operand[1], since reloading this after ++; it has been eliminated can cause carnage. ++(define_insn_and_split "*minmax_arithsi_non_canon" ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts") ++ (minus:SI ++ (match_operand:SI 1 "s_register_operand" "0,?Ts") ++ (match_operator:SI 4 "minmax_operator" ++ [(match_operand:SI 2 "s_register_operand" "Ts,Ts") ++ (match_operand:SI 3 "arm_rhs_operand" "TsI,TsI")]))) ++ (clobber (reg:CC CC_REGNUM))] ++ "TARGET_32BIT && !arm_eliminable_register (operands[1]) ++ && !(arm_restrict_it && CONST_INT_P (operands[3]))" ++ "#" ++ "TARGET_32BIT && !arm_eliminable_register (operands[1]) && reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 2) (match_dup 3))) ++ ++ (cond_exec (match_op_dup 4 [(reg:CC CC_REGNUM) (const_int 0)]) ++ (set (match_dup 0) ++ (minus:SI (match_dup 1) ++ (match_dup 2)))) ++ (cond_exec (match_op_dup 5 [(reg:CC CC_REGNUM) (const_int 0)]) ++ (set (match_dup 0) ++ (match_dup 6)))] ++ { ++ enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), ++ operands[2], operands[3]); ++ enum rtx_code rc = minmax_code (operands[4]); ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, ++ operands[2], operands[3]); ++ ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[5] = gen_rtx_fmt_ee (rc, SImode, operands[2], operands[3]); ++ if (CONST_INT_P (operands[3])) ++ operands[6] = plus_constant (SImode, operands[1], -INTVAL (operands[3])); ++ else ++ operands[6] = gen_rtx_MINUS (SImode, operands[1], operands[3]); ++ } ++ [(set_attr "conds" "clob") ++ (set (attr "length") ++ (if_then_else (eq_attr "is_thumb" "yes") ++ (const_int 14) ++ (const_int 12)))] ++) ++ + (define_code_iterator SAT [smin smax]) + (define_code_iterator SATrev [smin smax]) + (define_code_attr SATlo [(smin "1") (smax "2")]) +@@ -3449,7 +4088,8 @@ + return "usat%?\t%0, %1, %3"; + } + [(set_attr "predicable" "yes") +- (set_attr "insn" "sat")]) ++ (set_attr "predicable_short_it" "no")] ++) + + (define_insn "*satsi__shift" + [(set (match_operand:SI 0 "s_register_operand" "=r") +@@ -3474,9 +4114,9 @@ + return "usat%?\t%0, %1, %4%S3"; + } + [(set_attr "predicable" "yes") +- (set_attr "insn" "sat") ++ (set_attr "predicable_short_it" "no") + (set_attr "shift" "3") +- (set_attr "type" "alu_shift")]) ++ (set_attr "type" "arlo_shift")]) + + ;; Shift and rotation insns + +@@ -3566,6 +4206,7 @@ + "TARGET_THUMB1" + "lsl\\t%0, %1, %2" + [(set_attr "length" "2") ++ (set_attr "type" "shift,shift_reg") + (set_attr "conds" "set")]) + + (define_expand "ashrdi3" +@@ -3623,7 +4264,6 @@ + "TARGET_32BIT" + "movs\\t%R0, %R1, asr #1\;mov\\t%Q0, %Q1, rrx" + [(set_attr "conds" "clob") +- (set_attr "insn" "mov") + (set_attr "length" "8")] + ) + +@@ -3646,6 +4286,7 @@ + "TARGET_THUMB1" + "asr\\t%0, %1, %2" + [(set_attr "length" "2") ++ (set_attr "type" "shift,shift_reg") + (set_attr "conds" "set")]) + + (define_expand "lshrdi3" +@@ -3703,7 +4344,6 @@ + "TARGET_32BIT" + "movs\\t%R0, %R1, lsr #1\;mov\\t%Q0, %Q1, rrx" + [(set_attr "conds" "clob") +- (set_attr "insn" "mov") + (set_attr "length" "8")] + ) + +@@ -3729,6 +4369,7 @@ + "TARGET_THUMB1" + "lsr\\t%0, %1, %2" + [(set_attr "length" "2") ++ (set_attr "type" "shift,shift_reg") + (set_attr "conds" "set")]) + + (define_expand "rotlsi3" +@@ -3774,51 +4415,52 @@ + (match_operand:SI 2 "register_operand" "l")))] + "TARGET_THUMB1" + "ror\\t%0, %0, %2" +- [(set_attr "length" "2")] ++ [(set_attr "type" "shift_reg") ++ (set_attr "length" "2")] + ) + + (define_insn "*arm_shiftsi3" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r,r") + (match_operator:SI 3 "shift_operator" +- [(match_operand:SI 1 "s_register_operand" "r") +- (match_operand:SI 2 "reg_or_int_operand" "rM")]))] ++ [(match_operand:SI 1 "s_register_operand" "0,r,r") ++ (match_operand:SI 2 "reg_or_int_operand" "l,M,r")]))] + "TARGET_32BIT" + "* return arm_output_shift(operands, 0);" + [(set_attr "predicable" "yes") ++ (set_attr "arch" "t2,*,*") ++ (set_attr "predicable_short_it" "yes,no,no") ++ (set_attr "length" "4") + (set_attr "shift" "1") +- (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (set_attr "type" "arlo_shift_reg,arlo_shift,arlo_shift_reg")] + ) + + (define_insn "*shiftsi3_compare0" + [(set (reg:CC_NOOV CC_REGNUM) + (compare:CC_NOOV (match_operator:SI 3 "shift_operator" +- [(match_operand:SI 1 "s_register_operand" "r") +- (match_operand:SI 2 "arm_rhs_operand" "rM")]) ++ [(match_operand:SI 1 "s_register_operand" "r,r") ++ (match_operand:SI 2 "arm_rhs_operand" "M,r")]) + (const_int 0))) +- (set (match_operand:SI 0 "s_register_operand" "=r") ++ (set (match_operand:SI 0 "s_register_operand" "=r,r") + (match_op_dup 3 [(match_dup 1) (match_dup 2)]))] + "TARGET_32BIT" + "* return arm_output_shift(operands, 1);" + [(set_attr "conds" "set") + (set_attr "shift" "1") +- (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (set_attr "type" "arlo_shift,arlo_shift_reg")] + ) + + (define_insn "*shiftsi3_compare0_scratch" + [(set (reg:CC_NOOV CC_REGNUM) + (compare:CC_NOOV (match_operator:SI 3 "shift_operator" +- [(match_operand:SI 1 "s_register_operand" "r") +- (match_operand:SI 2 "arm_rhs_operand" "rM")]) ++ [(match_operand:SI 1 "s_register_operand" "r,r") ++ (match_operand:SI 2 "arm_rhs_operand" "M,r")]) + (const_int 0))) +- (clobber (match_scratch:SI 0 "=r"))] ++ (clobber (match_scratch:SI 0 "=r,r"))] + "TARGET_32BIT" + "* return arm_output_shift(operands, 1);" + [(set_attr "conds" "set") +- (set_attr "shift" "1")] ++ (set_attr "shift" "1") ++ (set_attr "type" "shift,shift_reg")] + ) + + (define_insn "*not_shiftsi" +@@ -3829,10 +4471,10 @@ + "TARGET_32BIT" + "mvn%?\\t%0, %1%S3" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "shift" "1") +- (set_attr "insn" "mvn") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "mvn_shift,mvn_shift_reg")]) + + (define_insn "*not_shiftsi_compare0" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -3847,9 +4489,8 @@ + "mvn%.\\t%0, %1%S3" + [(set_attr "conds" "set") + (set_attr "shift" "1") +- (set_attr "insn" "mvn") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "mvn_shift,mvn_shift_reg")]) + + (define_insn "*not_shiftsi_compare0_scratch" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -3863,9 +4504,8 @@ + "mvn%.\\t%0, %1%S3" + [(set_attr "conds" "set") + (set_attr "shift" "1") +- (set_attr "insn" "mvn") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "mvn_shift,mvn_shift_reg")]) + + ;; We don't really have extzv, but defining this using shifts helps + ;; to reduce register pressure later on. +@@ -4042,6 +4682,7 @@ + [(set_attr "arch" "t2,any") + (set_attr "length" "2,4") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") + (set_attr "type" "load1")]) + + (define_insn "unaligned_loadhis" +@@ -4054,6 +4695,7 @@ + [(set_attr "arch" "t2,any") + (set_attr "length" "2,4") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") + (set_attr "type" "load_byte")]) + + (define_insn "unaligned_loadhiu" +@@ -4066,6 +4708,7 @@ + [(set_attr "arch" "t2,any") + (set_attr "length" "2,4") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") + (set_attr "type" "load_byte")]) + + (define_insn "unaligned_storesi" +@@ -4077,6 +4720,7 @@ + [(set_attr "arch" "t2,any") + (set_attr "length" "2,4") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") + (set_attr "type" "store1")]) + + (define_insn "unaligned_storehi" +@@ -4088,8 +4732,67 @@ + [(set_attr "arch" "t2,any") + (set_attr "length" "2,4") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") + (set_attr "type" "store1")]) + ++;; Unaligned double-word load and store. ++;; Split after reload into two unaligned single-word accesses. ++;; It prevents lower_subreg from splitting some other aligned ++;; double-word accesses too early. Used for internal memcpy. ++ ++(define_insn_and_split "unaligned_loaddi" ++ [(set (match_operand:DI 0 "s_register_operand" "=l,r") ++ (unspec:DI [(match_operand:DI 1 "memory_operand" "o,o")] ++ UNSPEC_UNALIGNED_LOAD))] ++ "unaligned_access && TARGET_32BIT" ++ "#" ++ "&& reload_completed" ++ [(set (match_dup 0) (unspec:SI [(match_dup 1)] UNSPEC_UNALIGNED_LOAD)) ++ (set (match_dup 2) (unspec:SI [(match_dup 3)] UNSPEC_UNALIGNED_LOAD))] ++ { ++ operands[2] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[3] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ ++ /* If the first destination register overlaps with the base address, ++ swap the order in which the loads are emitted. */ ++ if (reg_overlap_mentioned_p (operands[0], operands[1])) ++ { ++ rtx tmp = operands[1]; ++ operands[1] = operands[3]; ++ operands[3] = tmp; ++ tmp = operands[0]; ++ operands[0] = operands[2]; ++ operands[2] = tmp; ++ } ++ } ++ [(set_attr "arch" "t2,any") ++ (set_attr "length" "4,8") ++ (set_attr "predicable" "yes") ++ (set_attr "type" "load2")]) ++ ++(define_insn_and_split "unaligned_storedi" ++ [(set (match_operand:DI 0 "memory_operand" "=o,o") ++ (unspec:DI [(match_operand:DI 1 "s_register_operand" "l,r")] ++ UNSPEC_UNALIGNED_STORE))] ++ "unaligned_access && TARGET_32BIT" ++ "#" ++ "&& reload_completed" ++ [(set (match_dup 0) (unspec:SI [(match_dup 1)] UNSPEC_UNALIGNED_STORE)) ++ (set (match_dup 2) (unspec:SI [(match_dup 3)] UNSPEC_UNALIGNED_STORE))] ++ { ++ operands[2] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[3] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } ++ [(set_attr "arch" "t2,any") ++ (set_attr "length" "4,8") ++ (set_attr "predicable" "yes") ++ (set_attr "type" "store2")]) ++ ++ + (define_insn "*extv_reg" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r") +@@ -4098,7 +4801,8 @@ + "arm_arch_thumb2" + "sbfx%?\t%0, %1, %3, %2" + [(set_attr "length" "4") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_insn "extzv_t2" +@@ -4109,7 +4813,8 @@ + "arm_arch_thumb2" + "ubfx%?\t%0, %1, %3, %2" + [(set_attr "length" "4") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + +@@ -4121,7 +4826,8 @@ + "TARGET_IDIV" + "sdiv%?\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "insn" "sdiv")] ++ (set_attr "predicable_short_it" "no") ++ (set_attr "type" "sdiv")] + ) + + (define_insn "udivsi3" +@@ -4131,7 +4837,8 @@ + "TARGET_IDIV" + "udiv%?\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "insn" "udiv")] ++ (set_attr "predicable_short_it" "no") ++ (set_attr "type" "udiv")] + ) + + +@@ -4154,12 +4861,24 @@ + + ;; The constraints here are to prevent a *partial* overlap (where %Q0 == %R1). + ;; The first alternative allows the common case of a *full* overlap. +-(define_insn "*arm_negdi2" ++(define_insn_and_split "*arm_negdi2" + [(set (match_operand:DI 0 "s_register_operand" "=r,&r") + (neg:DI (match_operand:DI 1 "s_register_operand" "0,r"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "rsbs\\t%Q0, %Q1, #0\;rsc\\t%R0, %R1, #0" ++ "#" ; "rsbs\\t%Q0, %Q1, #0\;rsc\\t%R0, %R1, #0" ++ "&& reload_completed" ++ [(parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (const_int 0) (match_dup 1))) ++ (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1)))]) ++ (set (match_dup 2) (minus:SI (minus:SI (const_int 0) (match_dup 3)) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] ++ { ++ operands[2] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ operands[3] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "clob") + (set_attr "length" "8")] + ) +@@ -4181,11 +4900,14 @@ + ) + + (define_insn "*arm_negsi2" +- [(set (match_operand:SI 0 "s_register_operand" "=r") +- (neg:SI (match_operand:SI 1 "s_register_operand" "r")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r") ++ (neg:SI (match_operand:SI 1 "s_register_operand" "l,r")))] + "TARGET_32BIT" + "rsb%?\\t%0, %1, #0" +- [(set_attr "predicable" "yes")] ++ [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "yes,no") ++ (set_attr "arch" "t2,*") ++ (set_attr "length" "4")] + ) + + (define_insn "*thumb1_negsi2" +@@ -4227,14 +4949,67 @@ + operands[2] = gen_rtx_REG (CCmode, CC_REGNUM); + ") + +-(define_insn "*arm_abssi2" ++(define_insn_and_split "*arm_abssi2" + [(set (match_operand:SI 0 "s_register_operand" "=r,&r") + (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%0, #0\;rsblt\\t%0, %0, #0 +- eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31" ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ /* if (which_alternative == 0) */ ++ if (REGNO(operands[0]) == REGNO(operands[1])) ++ { ++ /* Emit the pattern: ++ cmp\\t%0, #0\;rsblt\\t%0, %0, #0 ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 0) (const_int 0))) ++ (cond_exec (lt:CC (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1))))] ++ */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ gen_rtx_REG (CCmode, CC_REGNUM), ++ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx))); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ (gen_rtx_LT (SImode, ++ gen_rtx_REG (CCmode, CC_REGNUM), ++ const0_rtx)), ++ (gen_rtx_SET (VOIDmode, ++ operands[0], ++ (gen_rtx_MINUS (SImode, ++ const0_rtx, ++ operands[1])))))); ++ DONE; ++ } ++ else ++ { ++ /* Emit the pattern: ++ alt1: eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31 ++ [(set (match_dup 0) ++ (xor:SI (match_dup 1) ++ (ashiftrt:SI (match_dup 1) (const_int 31)))) ++ (set (match_dup 0) ++ (minus:SI (match_dup 0) ++ (ashiftrt:SI (match_dup 1) (const_int 31))))] ++ */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_XOR (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[1]))); ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_MINUS (SImode, ++ operands[0], ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31))))); ++ DONE; ++ } ++ } + [(set_attr "conds" "clob,*") + (set_attr "shift" "1") + (set_attr "predicable" "no, yes") +@@ -4255,14 +5030,56 @@ + [(set_attr "length" "6")] + ) + +-(define_insn "*arm_neg_abssi2" ++(define_insn_and_split "*arm_neg_abssi2" + [(set (match_operand:SI 0 "s_register_operand" "=r,&r") + (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "@ +- cmp\\t%0, #0\;rsbgt\\t%0, %0, #0 +- eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31" ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ /* if (which_alternative == 0) */ ++ if (REGNO (operands[0]) == REGNO (operands[1])) ++ { ++ /* Emit the pattern: ++ cmp\\t%0, #0\;rsbgt\\t%0, %0, #0 ++ */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ gen_rtx_REG (CCmode, CC_REGNUM), ++ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx))); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_GT (SImode, ++ gen_rtx_REG (CCmode, CC_REGNUM), ++ const0_rtx), ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ (gen_rtx_MINUS (SImode, ++ const0_rtx, ++ operands[1]))))); ++ } ++ else ++ { ++ /* Emit the pattern: ++ eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31 ++ */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_XOR (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[1]))); ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_MINUS (SImode, ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)), ++ operands[0]))); ++ } ++ DONE; ++ } + [(set_attr "conds" "clob,*") + (set_attr "shift" "1") + (set_attr "predicable" "no, yes") +@@ -4330,7 +5147,7 @@ + [(set_attr "length" "*,8,8,*") + (set_attr "predicable" "no,yes,yes,no") + (set_attr "neon_type" "neon_int_1,*,*,neon_int_1") +- (set_attr "arch" "neon_nota8,*,*,neon_onlya8")] ++ (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits")] + ) + + (define_expand "one_cmplsi2" +@@ -4341,12 +5158,15 @@ + ) + + (define_insn "*arm_one_cmplsi2" +- [(set (match_operand:SI 0 "s_register_operand" "=r") +- (not:SI (match_operand:SI 1 "s_register_operand" "r")))] ++ [(set (match_operand:SI 0 "s_register_operand" "=l,r") ++ (not:SI (match_operand:SI 1 "s_register_operand" "l,r")))] + "TARGET_32BIT" + "mvn%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "mvn")] ++ (set_attr "predicable_short_it" "yes,no") ++ (set_attr "arch" "t2,*") ++ (set_attr "length" "4") ++ (set_attr "type" "mvn_reg")] + ) + + (define_insn "*thumb1_one_cmplsi2" +@@ -4355,7 +5175,7 @@ + "TARGET_THUMB1" + "mvn\\t%0, %1" + [(set_attr "length" "2") +- (set_attr "insn" "mvn")] ++ (set_attr "type" "mvn_reg")] + ) + + (define_insn "*notsi_compare0" +@@ -4367,7 +5187,7 @@ + "TARGET_32BIT" + "mvn%.\\t%0, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "mvn")] ++ (set_attr "type" "mvn_reg")] + ) + + (define_insn "*notsi_compare0_scratch" +@@ -4378,7 +5198,7 @@ + "TARGET_32BIT" + "mvn%.\\t%0, %1" + [(set_attr "conds" "set") +- (set_attr "insn" "mvn")] ++ (set_attr "type" "mvn_reg")] + ) + + ;; Fixed <--> Floating conversion insns +@@ -4498,7 +5318,7 @@ + "TARGET_32BIT " + "#" + [(set_attr "length" "8,4,8,8") +- (set_attr "arch" "neon_nota8,*,*,neon_onlya8") ++ (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits") + (set_attr "ce_count" "2") + (set_attr "predicable" "yes")] + ) +@@ -4513,7 +5333,7 @@ + (set_attr "ce_count" "2") + (set_attr "shift" "1") + (set_attr "predicable" "yes") +- (set_attr "arch" "neon_nota8,*,a,t,neon_onlya8")] ++ (set_attr "arch" "neon_for_64bits,*,a,t,avoid_neon_for_64bits")] + ) + + ;; Splits for all extensions to DImode +@@ -4639,7 +5459,7 @@ + [(if_then_else (eq_attr "is_arch6" "yes") + (const_int 2) (const_int 4)) + (const_int 4)]) +- (set_attr "type" "simple_alu_shift, load_byte")] ++ (set_attr "type" "extend,load_byte")] + ) + + (define_insn "*arm_zero_extendhisi2" +@@ -4649,7 +5469,7 @@ + "@ + # + ldr%(h%)\\t%0, %1" +- [(set_attr "type" "alu_shift,load_byte") ++ [(set_attr "type" "arlo_shift,load_byte") + (set_attr "predicable" "yes")] + ) + +@@ -4661,7 +5481,7 @@ + uxth%?\\t%0, %1 + ldr%(h%)\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "type" "simple_alu_shift,load_byte")] ++ (set_attr "type" "extend,load_byte")] + ) + + (define_insn "*arm_zero_extendhisi2addsi" +@@ -4670,8 +5490,9 @@ + (match_operand:SI 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "uxtah%?\\t%0, %2, %1" +- [(set_attr "type" "alu_shift") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "arlo_shift") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "zero_extendqisi2" +@@ -4719,7 +5540,7 @@ + # + ldrb\\t%0, %1" + [(set_attr "length" "4,2") +- (set_attr "type" "alu_shift,load_byte") ++ (set_attr "type" "arlo_shift,load_byte") + (set_attr "pool_range" "*,32")] + ) + +@@ -4731,7 +5552,7 @@ + uxtb\\t%0, %1 + ldrb\\t%0, %1" + [(set_attr "length" "2") +- (set_attr "type" "simple_alu_shift,load_byte")] ++ (set_attr "type" "extend,load_byte")] + ) + + (define_insn "*arm_zero_extendqisi2" +@@ -4742,7 +5563,7 @@ + # + ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" + [(set_attr "length" "8,4") +- (set_attr "type" "alu_shift,load_byte") ++ (set_attr "type" "arlo_shift,load_byte") + (set_attr "predicable" "yes")] + ) + +@@ -4753,7 +5574,7 @@ + "@ + uxtb%(%)\\t%0, %1 + ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes")] + ) + +@@ -4764,8 +5585,8 @@ + "TARGET_INT_SIMD" + "uxtab%?\\t%0, %2, %1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "xtab") +- (set_attr "type" "alu_shift")] ++ (set_attr "predicable_short_it" "no") ++ (set_attr "type" "arlo_shift")] + ) + + (define_split +@@ -4816,7 +5637,8 @@ + "TARGET_32BIT" + "tst%?\\t%0, #255" + [(set_attr "conds" "set") +- (set_attr "predicable" "yes")] ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_expand "extendhisi2" +@@ -4927,7 +5749,7 @@ + [(if_then_else (eq_attr "is_arch6" "yes") + (const_int 2) (const_int 4)) + (const_int 4)]) +- (set_attr "type" "simple_alu_shift,load_byte") ++ (set_attr "type" "extend,load_byte") + (set_attr "pool_range" "*,1018")] + ) + +@@ -4986,7 +5808,7 @@ + # + ldr%(sh%)\\t%0, %1" + [(set_attr "length" "8,4") +- (set_attr "type" "alu_shift,load_byte") ++ (set_attr "type" "arlo_shift,load_byte") + (set_attr "predicable" "yes") + (set_attr "pool_range" "*,256") + (set_attr "neg_pool_range" "*,244")] +@@ -5000,8 +5822,9 @@ + "@ + sxth%?\\t%0, %1 + ldr%(sh%)\\t%0, %1" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "pool_range" "*,256") + (set_attr "neg_pool_range" "*,244")] + ) +@@ -5086,7 +5909,7 @@ + # + ldr%(sb%)\\t%0, %1" + [(set_attr "length" "8,4") +- (set_attr "type" "alu_shift,load_byte") ++ (set_attr "type" "arlo_shift,load_byte") + (set_attr "predicable" "yes") + (set_attr "pool_range" "*,256") + (set_attr "neg_pool_range" "*,244")] +@@ -5100,7 +5923,7 @@ + "@ + sxtb%?\\t%0, %1 + ldr%(sb%)\\t%0, %1" +- [(set_attr "type" "simple_alu_shift,load_byte") ++ [(set_attr "type" "extend,load_byte") + (set_attr "predicable" "yes") + (set_attr "pool_range" "*,256") + (set_attr "neg_pool_range" "*,244")] +@@ -5112,9 +5935,9 @@ + (match_operand:SI 2 "s_register_operand" "r")))] + "TARGET_INT_SIMD" + "sxtab%?\\t%0, %2, %1" +- [(set_attr "type" "alu_shift") +- (set_attr "insn" "xtab") +- (set_attr "predicable" "yes")] ++ [(set_attr "type" "arlo_shift") ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")] + ) + + (define_split +@@ -5213,7 +6036,7 @@ + (const_int 2) + (if_then_else (eq_attr "is_arch6" "yes") + (const_int 4) (const_int 6))]) +- (set_attr "type" "simple_alu_shift,load_byte,load_byte")] ++ (set_attr "type" "extend,load_byte,load_byte")] + ) + + (define_expand "extendsfdf2" +@@ -5313,8 +6136,8 @@ + ) + + (define_insn "*arm_movdi" +- [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m") +- (match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,r"))] ++ [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, q, m") ++ (match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,q"))] + "TARGET_32BIT + && !(TARGET_HARD_FLOAT && TARGET_VFP) + && !TARGET_IWMMXT +@@ -5472,8 +6295,7 @@ + } + }" + [(set_attr "length" "4,4,6,2,2,6,4,4") +- (set_attr "type" "*,*,*,load2,store2,load2,store2,*") +- (set_attr "insn" "*,mov,*,*,*,*,*,mov") ++ (set_attr "type" "*,mov_reg,*,load2,store2,load2,store2,mov_reg") + (set_attr "pool_range" "*,*,*,*,*,1018,*,*")] + ) + +@@ -5570,6 +6392,7 @@ + "arm_arch_thumb2" + "movt%?\t%0, #:upper16:%c2" + [(set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no") + (set_attr "length" "4")] + ) + +@@ -5587,8 +6410,7 @@ + movw%?\\t%0, %1 + ldr%?\\t%0, %1 + str%?\\t%1, %0" +- [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1") +- (set_attr "insn" "mov,mov,mvn,mov,*,*") ++ [(set_attr "type" "mov_reg,mov_imm,mvn_imm,mov_imm,load1,store1") + (set_attr "predicable" "yes") + (set_attr "pool_range" "*,*,*,*,4096,*") + (set_attr "neg_pool_range" "*,*,*,*,4084,*")] +@@ -5890,7 +6712,7 @@ + cmp%?\\t%0, #0 + sub%.\\t%0, %1, #0" + [(set_attr "conds" "set") +- (set_attr "type" "simple_alu_imm,simple_alu_imm")] ++ (set_attr "type" "arlo_imm,arlo_imm")] + ) + + ;; Subroutine to store a half word from a register into memory. +@@ -6304,14 +7126,13 @@ + str%(h%)\\t%1, %0\\t%@ movhi + ldr%(h%)\\t%0, %1\\t%@ movhi" + [(set_attr "predicable" "yes") +- (set_attr "insn" "mov,mvn,*,*") + (set_attr "pool_range" "*,*,*,256") + (set_attr "neg_pool_range" "*,*,*,244") + (set_attr_alternative "type" + [(if_then_else (match_operand 1 "const_int_operand" "") +- (const_string "simple_alu_imm" ) +- (const_string "*")) +- (const_string "simple_alu_imm") ++ (const_string "mov_imm" ) ++ (const_string "mov_reg")) ++ (const_string "mvn_imm") + (const_string "store1") + (const_string "load1")])] + ) +@@ -6325,8 +7146,7 @@ + mov%?\\t%0, %1\\t%@ movhi + mvn%?\\t%0, #%B1\\t%@ movhi" + [(set_attr "predicable" "yes") +- (set_attr "insn" "mov, mov,mvn") +- (set_attr "type" "simple_alu_imm,*,simple_alu_imm")] ++ (set_attr "type" "mov_imm,mov_reg,mvn_imm")] + ) + + (define_expand "thumb_movhi_clobber" +@@ -6449,10 +7269,9 @@ + " + ) + +- + (define_insn "*arm_movqi_insn" +- [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,Uu,r,m") +- (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))] ++ [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,r,l,Uu,r,m") ++ (match_operand:QI 1 "general_operand" "r,r,I,Py,K,Uu,l,m,r"))] + "TARGET_32BIT + && ( register_operand (operands[0], QImode) + || register_operand (operands[1], QImode))" +@@ -6459,16 +7278,18 @@ + "@ + mov%?\\t%0, %1 + mov%?\\t%0, %1 ++ mov%?\\t%0, %1 ++ mov%?\\t%0, %1 + mvn%?\\t%0, #%B1 + ldr%(b%)\\t%0, %1 + str%(b%)\\t%1, %0 + ldr%(b%)\\t%0, %1 + str%(b%)\\t%1, %0" +- [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, load1, store1") +- (set_attr "insn" "mov,mov,mvn,*,*,*,*") ++ [(set_attr "type" "mov_reg,mov_reg,mov_imm,mov_imm,mvn_imm,load1,store1,load1,store1") + (set_attr "predicable" "yes") +- (set_attr "arch" "any,any,any,t2,t2,any,any") +- (set_attr "length" "4,4,4,2,2,4,4")] ++ (set_attr "predicable_short_it" "yes,yes,yes,no,no,no,no,no,no") ++ (set_attr "arch" "t2,any,any,t2,any,t2,t2,any,any") ++ (set_attr "length" "2,4,4,2,4,2,2,4,4")] + ) + + (define_insn "*thumb1_movqi_insn" +@@ -6485,8 +7306,7 @@ + mov\\t%0, %1 + mov\\t%0, %1" + [(set_attr "length" "2") +- (set_attr "type" "simple_alu_imm,load1,store1,*,*,simple_alu_imm") +- (set_attr "insn" "*,*,*,mov,mov,mov") ++ (set_attr "type" "arlo_imm,load1,store1,mov_reg,mov_imm,mov_imm") + (set_attr "pool_range" "*,32,*,*,*,*") + (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")]) + +@@ -6515,7 +7335,7 @@ + (define_insn "*arm32_movhf" + [(set (match_operand:HF 0 "nonimmediate_operand" "=r,m,r,r") + (match_operand:HF 1 "general_operand" " m,r,r,F"))] +- "TARGET_32BIT && !(TARGET_HARD_FLOAT && TARGET_FP16) ++ "TARGET_32BIT && !(TARGET_HARD_FLOAT && TARGET_FP16) && !arm_restrict_it + && ( s_register_operand (operands[0], HFmode) + || s_register_operand (operands[1], HFmode))" + "* +@@ -6551,8 +7371,7 @@ + } + " + [(set_attr "conds" "unconditional") +- (set_attr "type" "load1,store1,*,*") +- (set_attr "insn" "*,*,mov,mov") ++ (set_attr "type" "load1,store1,mov_reg,mov_reg") + (set_attr "length" "4,4,4,8") + (set_attr "predicable" "yes")] + ) +@@ -6587,8 +7406,7 @@ + } + " + [(set_attr "length" "2") +- (set_attr "type" "*,load1,store1,*,*") +- (set_attr "insn" "mov,*,*,mov,mov") ++ (set_attr "type" "mov_reg,load1,store1,mov_reg,mov_reg") + (set_attr "pool_range" "*,1018,*,*,*") + (set_attr "conds" "clob,nocond,nocond,nocond,nocond")]) + +@@ -6642,8 +7460,8 @@ + ldr%?\\t%0, %1\\t%@ float + str%?\\t%1, %0\\t%@ float" + [(set_attr "predicable" "yes") +- (set_attr "type" "*,load1,store1") +- (set_attr "insn" "mov,*,*") ++ (set_attr "predicable_short_it" "no") ++ (set_attr "type" "mov_reg,load1,store1") + (set_attr "arm_pool_range" "*,4096,*") + (set_attr "thumb2_pool_range" "*,4094,*") + (set_attr "arm_neg_pool_range" "*,4084,*") +@@ -6666,9 +7484,8 @@ + mov\\t%0, %1 + mov\\t%0, %1" + [(set_attr "length" "2") +- (set_attr "type" "*,load1,store1,load1,store1,*,*") ++ (set_attr "type" "*,load1,store1,load1,store1,mov_reg,mov_reg") + (set_attr "pool_range" "*,*,*,1018,*,*,*") +- (set_attr "insn" "*,*,*,*,*,mov,mov") + (set_attr "conds" "clob,nocond,nocond,nocond,nocond,nocond,nocond")] + ) + +@@ -6738,8 +7555,8 @@ + ) + + (define_insn "*movdf_soft_insn" +- [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,r,m") +- (match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,r"))] ++ [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,q,m") ++ (match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,q"))] + "TARGET_32BIT && TARGET_SOFT_FLOAT + && ( register_operand (operands[0], DFmode) + || register_operand (operands[1], DFmode))" +@@ -6799,8 +7616,7 @@ + } + " + [(set_attr "length" "4,2,2,6,4,4") +- (set_attr "type" "*,load2,store2,load2,store2,*") +- (set_attr "insn" "*,*,*,*,*,mov") ++ (set_attr "type" "*,load2,store2,load2,store2,mov_reg") + (set_attr "pool_range" "*,*,*,1018,*,*")] + ) + +@@ -6869,10 +7685,18 @@ + (match_operand:BLK 1 "general_operand" "") + (match_operand:SI 2 "const_int_operand" "") + (match_operand:SI 3 "const_int_operand" "")] +- "TARGET_EITHER" ++ "" + " + if (TARGET_32BIT) + { ++ if (TARGET_LDRD && current_tune->prefer_ldrd_strd ++ && !optimize_function_for_size_p (cfun)) ++ { ++ if (gen_movmem_ldrd_strd (operands)) ++ DONE; ++ FAIL; ++ } ++ + if (arm_gen_movmemqi (operands)) + DONE; + FAIL; +@@ -7568,7 +8392,7 @@ + (set_attr "arch" "t2,t2,any,any") + (set_attr "length" "2,2,4,4") + (set_attr "predicable" "yes") +- (set_attr "type" "*,*,*,simple_alu_imm")] ++ (set_attr "type" "*,*,*,arlo_imm")] + ) + + (define_insn "*cmpsi_shiftsi" +@@ -7582,7 +8406,7 @@ + [(set_attr "conds" "set") + (set_attr "shift" "1") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*cmpsi_shiftsi_swp" + [(set (reg:CC_SWP CC_REGNUM) +@@ -7595,7 +8419,7 @@ + [(set_attr "conds" "set") + (set_attr "shift" "1") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*arm_cmpsi_negshiftsi_si" + [(set (reg:CC_Z CC_REGNUM) +@@ -7608,8 +8432,8 @@ + "cmn%?\\t%0, %2%S1" + [(set_attr "conds" "set") + (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg"))) ++ (const_string "arlo_shift") ++ (const_string "arlo_shift_reg"))) + (set_attr "predicable" "yes")] + ) + +@@ -7617,25 +8441,69 @@ + ;; if-conversion can not reduce to a conditional compare, so we do + ;; that directly. + +-(define_insn "*arm_cmpdi_insn" ++(define_insn_and_split "*arm_cmpdi_insn" + [(set (reg:CC_NCV CC_REGNUM) + (compare:CC_NCV (match_operand:DI 0 "s_register_operand" "r") + (match_operand:DI 1 "arm_di_operand" "rDi"))) + (clobber (match_scratch:SI 2 "=r"))] + "TARGET_32BIT" +- "cmp\\t%Q0, %Q1\;sbcs\\t%2, %R0, %R1" ++ "#" ; "cmp\\t%Q0, %Q1\;sbcs\\t%2, %R0, %R1" ++ "&& reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 0) (match_dup 1))) ++ (parallel [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 3) (match_dup 4))) ++ (set (match_dup 2) ++ (minus:SI (match_dup 5) ++ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))])] ++ { ++ operands[3] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ if (CONST_INT_P (operands[1])) ++ { ++ operands[4] = GEN_INT (~INTVAL (gen_highpart_mode (SImode, ++ DImode, ++ operands[1]))); ++ operands[5] = gen_rtx_PLUS (SImode, operands[3], operands[4]); ++ } ++ else ++ { ++ operands[4] = gen_highpart (SImode, operands[1]); ++ operands[5] = gen_rtx_MINUS (SImode, operands[3], operands[4]); ++ } ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ operands[2] = gen_lowpart (SImode, operands[2]); ++ } + [(set_attr "conds" "set") + (set_attr "length" "8")] + ) + +-(define_insn "*arm_cmpdi_unsigned" ++(define_insn_and_split "*arm_cmpdi_unsigned" + [(set (reg:CC_CZ CC_REGNUM) +- (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "r") +- (match_operand:DI 1 "arm_di_operand" "rDi")))] ++ (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r") ++ (match_operand:DI 1 "arm_di_operand" "Py,r,rDi")))] ++ + "TARGET_32BIT" +- "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1" ++ "#" ; "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1" ++ "&& reload_completed" ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 2) (match_dup 3))) ++ (cond_exec (eq:SI (reg:CC CC_REGNUM) (const_int 0)) ++ (set (reg:CC CC_REGNUM) ++ (compare:CC (match_dup 0) (match_dup 1))))] ++ { ++ operands[2] = gen_highpart (SImode, operands[0]); ++ operands[0] = gen_lowpart (SImode, operands[0]); ++ if (CONST_INT_P (operands[1])) ++ operands[3] = gen_highpart_mode (SImode, DImode, operands[1]); ++ else ++ operands[3] = gen_highpart (SImode, operands[1]); ++ operands[1] = gen_lowpart (SImode, operands[1]); ++ } + [(set_attr "conds" "set") +- (set_attr "length" "8")] ++ (set_attr "enabled_for_depr_it" "yes,yes,no") ++ (set_attr "arch" "t2,t2,*") ++ (set_attr "length" "6,6,8")] + ) + + (define_insn "*arm_cmpdi_zero" +@@ -7758,36 +8626,56 @@ + operands[3] = const0_rtx;" + ) + +-(define_insn "*mov_scc" ++(define_insn_and_split "*mov_scc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)]))] + "TARGET_ARM" +- "mov%D1\\t%0, #0\;mov%d1\\t%0, #1" ++ "#" ; "mov%D1\\t%0, #0\;mov%d1\\t%0, #1" ++ "TARGET_ARM" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (const_int 1) ++ (const_int 0)))] ++ "" + [(set_attr "conds" "use") +- (set_attr "insn" "mov") + (set_attr "length" "8")] + ) + +-(define_insn "*mov_negscc" ++(define_insn_and_split "*mov_negscc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (neg:SI (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)])))] + "TARGET_ARM" +- "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" ++ "#" ; "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" ++ "TARGET_ARM" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (match_dup 3) ++ (const_int 0)))] ++ { ++ operands[3] = GEN_INT (~0); ++ } + [(set_attr "conds" "use") +- (set_attr "insn" "mov") + (set_attr "length" "8")] + ) + +-(define_insn "*mov_notscc" ++(define_insn_and_split "*mov_notscc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (not:SI (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 2 "cc_register" "") (const_int 0)])))] + "TARGET_ARM" +- "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1" ++ "#" ; "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1" ++ "TARGET_ARM" ++ [(set (match_dup 0) ++ (if_then_else:SI (match_dup 1) ++ (match_dup 3) ++ (match_dup 4)))] ++ { ++ operands[3] = GEN_INT (~1); ++ operands[4] = GEN_INT (~0); ++ } + [(set_attr "conds" "use") +- (set_attr "insn" "mov") + (set_attr "length" "8")] + ) + +@@ -8069,7 +8957,7 @@ + + (define_expand "movsfcc" + [(set (match_operand:SF 0 "s_register_operand" "") +- (if_then_else:SF (match_operand 1 "expandable_comparison_operator" "") ++ (if_then_else:SF (match_operand 1 "arm_cond_move_operator" "") + (match_operand:SF 2 "s_register_operand" "") + (match_operand:SF 3 "s_register_operand" "")))] + "TARGET_32BIT && TARGET_HARD_FLOAT" +@@ -8091,7 +8979,7 @@ + + (define_expand "movdfcc" + [(set (match_operand:DF 0 "s_register_operand" "") +- (if_then_else:DF (match_operand 1 "expandable_comparison_operator" "") ++ (if_then_else:DF (match_operand 1 "arm_cond_move_operator" "") + (match_operand:DF 2 "s_register_operand" "") + (match_operand:DF 3 "s_register_operand" "")))] + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" +@@ -8110,7 +8998,40 @@ + }" + ) + +-(define_insn "*movsicc_insn" ++(define_insn "*cmov" ++ [(set (match_operand:SDF 0 "s_register_operand" "=") ++ (if_then_else:SDF (match_operator 1 "arm_vsel_comparison_operator" ++ [(match_operand 2 "cc_register" "") (const_int 0)]) ++ (match_operand:SDF 3 "s_register_operand" ++ "") ++ (match_operand:SDF 4 "s_register_operand" ++ "")))] ++ "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 " ++ "* ++ { ++ enum arm_cond_code code = maybe_get_arm_condition_code (operands[1]); ++ switch (code) ++ { ++ case ARM_GE: ++ case ARM_GT: ++ case ARM_EQ: ++ case ARM_VS: ++ return \"vsel%d1.\\t%0, %3, %4\"; ++ case ARM_LT: ++ case ARM_LE: ++ case ARM_NE: ++ case ARM_VC: ++ return \"vsel%D1.\\t%0, %4, %3\"; ++ default: ++ gcc_unreachable (); ++ } ++ return \"\"; ++ }" ++ [(set_attr "conds" "use") ++ (set_attr "type" "f_sel")] ++) ++ ++(define_insn_and_split "*movsicc_insn" + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r") + (if_then_else:SI + (match_operator 3 "arm_comparison_operator" +@@ -8123,26 +9044,60 @@ + mvn%D3\\t%0, #%B2 + mov%d3\\t%0, %1 + mvn%d3\\t%0, #%B1 +- mov%d3\\t%0, %1\;mov%D3\\t%0, %2 +- mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 +- mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 +- mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" ++ # ++ # ++ # ++ #" ++ ; alt4: mov%d3\\t%0, %1\;mov%D3\\t%0, %2 ++ ; alt5: mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 ++ ; alt6: mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 ++ ; alt7: mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ enum rtx_code rev_code; ++ enum machine_mode mode; ++ rtx rev_cond; ++ ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ operands[3], ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ operands[1]))); ++ ++ rev_code = GET_CODE (operands[3]); ++ mode = GET_MODE (operands[4]); ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rev_code = reverse_condition_maybe_unordered (rev_code); ++ else ++ rev_code = reverse_condition (rev_code); ++ ++ rev_cond = gen_rtx_fmt_ee (rev_code, ++ VOIDmode, ++ operands[4], ++ const0_rtx); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ rev_cond, ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ operands[2]))); ++ DONE; ++ } + [(set_attr "length" "4,4,4,4,8,8,8,8") + (set_attr "conds" "use") +- (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn") + (set_attr_alternative "type" + [(if_then_else (match_operand 2 "const_int_operand" "") +- (const_string "simple_alu_imm") +- (const_string "*")) +- (const_string "simple_alu_imm") ++ (const_string "mov_imm") ++ (const_string "mov_reg")) ++ (const_string "mvn_imm") + (if_then_else (match_operand 1 "const_int_operand" "") +- (const_string "simple_alu_imm") +- (const_string "*")) +- (const_string "simple_alu_imm") +- (const_string "*") +- (const_string "*") +- (const_string "*") +- (const_string "*")])] ++ (const_string "mov_imm") ++ (const_string "mov_reg")) ++ (const_string "mvn_imm") ++ (const_string "mov_reg") ++ (const_string "mov_reg") ++ (const_string "mov_reg") ++ (const_string "mov_reg")])] + ) + + (define_insn "*movsfcc_soft_insn" +@@ -8156,7 +9111,7 @@ + mov%D3\\t%0, %2 + mov%d3\\t%0, %1" + [(set_attr "conds" "use") +- (set_attr "insn" "mov")] ++ (set_attr "type" "mov_reg")] + ) + + +@@ -8255,7 +9210,7 @@ + (match_operand 1 "" "")) + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && arm_arch5" ++ "TARGET_ARM && arm_arch5 && !SIBLING_CALL_P (insn)" + "blx%?\\t%0" + [(set_attr "type" "call")] + ) +@@ -8265,7 +9220,7 @@ + (match_operand 1 "" "")) + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && !arm_arch5" ++ "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)" + "* + return output_call (operands); + " +@@ -8284,7 +9239,7 @@ + (match_operand 1 "" "")) + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && !arm_arch5" ++ "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)" + "* + return output_call_mem (operands); + " +@@ -8297,7 +9252,7 @@ + (match_operand 1 "" "")) + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_THUMB1 && arm_arch5" ++ "TARGET_THUMB1 && arm_arch5 && !SIBLING_CALL_P (insn)" + "blx\\t%0" + [(set_attr "length" "2") + (set_attr "type" "call")] +@@ -8308,7 +9263,7 @@ + (match_operand 1 "" "")) + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_THUMB1 && !arm_arch5" ++ "TARGET_THUMB1 && !arm_arch5 && !SIBLING_CALL_P (insn)" + "* + { + if (!TARGET_CALLER_INTERWORKING) +@@ -8367,7 +9322,7 @@ + (match_operand 2 "" ""))) + (use (match_operand 3 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && arm_arch5" ++ "TARGET_ARM && arm_arch5 && !SIBLING_CALL_P (insn)" + "blx%?\\t%1" + [(set_attr "type" "call")] + ) +@@ -8378,7 +9333,7 @@ + (match_operand 2 "" ""))) + (use (match_operand 3 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && !arm_arch5" ++ "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)" + "* + return output_call (&operands[1]); + " +@@ -8394,7 +9349,8 @@ + (match_operand 2 "" ""))) + (use (match_operand 3 "" "")) + (clobber (reg:SI LR_REGNUM))] +- "TARGET_ARM && !arm_arch5 && (!CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))" ++ "TARGET_ARM && !arm_arch5 && (!CONSTANT_ADDRESS_P (XEXP (operands[1], 0))) ++ && !SIBLING_CALL_P (insn)" + "* + return output_call_mem (&operands[1]); + " +@@ -8444,6 +9400,7 @@ + (use (match_operand 2 "" "")) + (clobber (reg:SI LR_REGNUM))] + "TARGET_32BIT ++ && !SIBLING_CALL_P (insn) + && (GET_CODE (operands[0]) == SYMBOL_REF) + && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))" + "* +@@ -8460,6 +9417,7 @@ + (use (match_operand 3 "" "")) + (clobber (reg:SI LR_REGNUM))] + "TARGET_32BIT ++ && !SIBLING_CALL_P (insn) + && (GET_CODE (operands[1]) == SYMBOL_REF) + && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))" + "* +@@ -8505,6 +9463,10 @@ + "TARGET_32BIT" + " + { ++ if (!REG_P (XEXP (operands[0], 0)) ++ && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF)) ++ XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0)); ++ + if (operands[2] == NULL_RTX) + operands[2] = const0_rtx; + }" +@@ -8519,6 +9481,10 @@ + "TARGET_32BIT" + " + { ++ if (!REG_P (XEXP (operands[1], 0)) && ++ (GET_CODE (XEXP (operands[1],0)) != SYMBOL_REF)) ++ XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0)); ++ + if (operands[3] == NULL_RTX) + operands[3] = const0_rtx; + }" +@@ -8525,13 +9491,21 @@ + ) + + (define_insn "*sibcall_insn" +- [(call (mem:SI (match_operand:SI 0 "" "X")) ++ [(call (mem:SI (match_operand:SI 0 "call_insn_operand" "Cs, US")) + (match_operand 1 "" "")) + (return) + (use (match_operand 2 "" ""))] +- "TARGET_32BIT && GET_CODE (operands[0]) == SYMBOL_REF" ++ "TARGET_32BIT && SIBLING_CALL_P (insn)" + "* +- return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\"; ++ if (which_alternative == 1) ++ return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\"; ++ else ++ { ++ if (arm_arch5 || arm_arch4t) ++ return \"bx%?\\t%0\\t%@ indirect register sibling call\"; ++ else ++ return \"mov%?\\t%|pc, %0\\t%@ indirect register sibling call\"; ++ } + " + [(set_attr "type" "call")] + ) +@@ -8538,28 +9512,36 @@ + + (define_insn "*sibcall_value_insn" + [(set (match_operand 0 "" "") +- (call (mem:SI (match_operand:SI 1 "" "X")) ++ (call (mem:SI (match_operand:SI 1 "call_insn_operand" "Cs,US")) + (match_operand 2 "" ""))) + (return) + (use (match_operand 3 "" ""))] +- "TARGET_32BIT && GET_CODE (operands[1]) == SYMBOL_REF" ++ "TARGET_32BIT && SIBLING_CALL_P (insn)" + "* +- return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\"; ++ if (which_alternative == 1) ++ return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\"; ++ else ++ { ++ if (arm_arch5 || arm_arch4t) ++ return \"bx%?\\t%1\"; ++ else ++ return \"mov%?\\t%|pc, %1\\t@ indirect sibling call \"; ++ } + " + [(set_attr "type" "call")] + ) + +-(define_expand "return" +- [(return)] ++(define_expand "return" ++ [(returns)] + "(TARGET_ARM || (TARGET_THUMB2 + && ARM_FUNC_TYPE (arm_current_func_type ()) == ARM_FT_NORMAL + && !IS_STACKALIGN (arm_current_func_type ()))) +- && USE_RETURN_INSN (FALSE)" ++ " + " + { + if (TARGET_THUMB2) + { +- thumb2_expand_return (); ++ thumb2_expand_return (); + DONE; + } + } +@@ -8584,13 +9566,13 @@ + (set_attr "predicable" "yes")] + ) + +-(define_insn "*cond_return" ++(define_insn "*cond_return" + [(set (pc) + (if_then_else (match_operator 0 "arm_comparison_operator" + [(match_operand 1 "cc_register" "") (const_int 0)]) +- (return) ++ (returns) + (pc)))] +- "TARGET_ARM && USE_RETURN_INSN (TRUE)" ++ "TARGET_ARM " + "* + { + if (arm_ccfsm_state == 2) +@@ -8598,7 +9580,8 @@ + arm_ccfsm_state += 2; + return \"\"; + } +- return output_return_instruction (operands[0], true, false, false); ++ return output_return_instruction (operands[0], true, false, ++ ); + }" + [(set_attr "conds" "use") + (set_attr "length" "12") +@@ -8605,13 +9588,13 @@ + (set_attr "type" "load1")] + ) + +-(define_insn "*cond_return_inverted" ++(define_insn "*cond_return_inverted" + [(set (pc) + (if_then_else (match_operator 0 "arm_comparison_operator" + [(match_operand 1 "cc_register" "") (const_int 0)]) + (pc) +- (return)))] +- "TARGET_ARM && USE_RETURN_INSN (TRUE)" ++ (returns)))] ++ "TARGET_ARM " + "* + { + if (arm_ccfsm_state == 2) +@@ -8619,7 +9602,8 @@ + arm_ccfsm_state += 2; + return \"\"; + } +- return output_return_instruction (operands[0], true, true, false); ++ return output_return_instruction (operands[0], true, true, ++ ); + }" + [(set_attr "conds" "use") + (set_attr "length" "12") +@@ -8991,7 +9975,7 @@ + (if_then_else + (match_operand:SI 3 "mult_operator" "") + (const_string "no") (const_string "yes"))]) +- (set_attr "type" "alu_shift,alu_shift,alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift,arlo_shift,arlo_shift_reg")]) + + (define_split + [(set (match_operand:SI 0 "s_register_operand" "") +@@ -9028,7 +10012,7 @@ + [(set_attr "conds" "set") + (set_attr "shift" "4") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*arith_shiftsi_compare0_scratch" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -9045,7 +10029,7 @@ + [(set_attr "conds" "set") + (set_attr "shift" "4") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*sub_shiftsi" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") +@@ -9058,7 +10042,7 @@ + [(set_attr "predicable" "yes") + (set_attr "shift" "3") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*sub_shiftsi_compare0" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -9076,7 +10060,7 @@ + [(set_attr "conds" "set") + (set_attr "shift" "3") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + (define_insn "*sub_shiftsi_compare0_scratch" + [(set (reg:CC_NOOV CC_REGNUM) +@@ -9092,30 +10076,67 @@ + [(set_attr "conds" "set") + (set_attr "shift" "3") + (set_attr "arch" "32,a") +- (set_attr "type" "alu_shift,alu_shift_reg")]) ++ (set_attr "type" "arlo_shift,arlo_shift_reg")]) + + +-(define_insn "*and_scc" ++(define_insn_and_split "*and_scc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (and:SI (match_operator:SI 1 "arm_comparison_operator" +- [(match_operand 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 2 "s_register_operand" "r")))] ++ [(match_operand 2 "cc_register" "") (const_int 0)]) ++ (match_operand:SI 3 "s_register_operand" "r")))] + "TARGET_ARM" +- "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1" ++ "#" ; "mov%D1\\t%0, #0\;and%d1\\t%0, %3, #1" ++ "&& reload_completed" ++ [(cond_exec (match_dup 5) (set (match_dup 0) (const_int 0))) ++ (cond_exec (match_dup 4) (set (match_dup 0) ++ (and:SI (match_dup 3) (const_int 1))))] ++ { ++ enum machine_mode mode = GET_MODE (operands[2]); ++ enum rtx_code rc = GET_CODE (operands[1]); ++ ++ /* Note that operands[4] is the same as operands[1], ++ but with VOIDmode as the result. */ ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ } + [(set_attr "conds" "use") +- (set_attr "insn" "mov") ++ (set_attr "type" "mov_reg") + (set_attr "length" "8")] + ) + +-(define_insn "*ior_scc" ++(define_insn_and_split "*ior_scc" + [(set (match_operand:SI 0 "s_register_operand" "=r,r") +- (ior:SI (match_operator:SI 2 "arm_comparison_operator" +- [(match_operand 3 "cc_register" "") (const_int 0)]) +- (match_operand:SI 1 "s_register_operand" "0,?r")))] ++ (ior:SI (match_operator:SI 1 "arm_comparison_operator" ++ [(match_operand 2 "cc_register" "") (const_int 0)]) ++ (match_operand:SI 3 "s_register_operand" "0,?r")))] + "TARGET_ARM" + "@ +- orr%d2\\t%0, %1, #1 +- mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1" ++ orr%d1\\t%0, %3, #1 ++ #" ++ "&& reload_completed ++ && REGNO (operands [0]) != REGNO (operands[3])" ++ ;; && which_alternative == 1 ++ ; mov%D1\\t%0, %3\;orr%d1\\t%0, %3, #1 ++ [(cond_exec (match_dup 5) (set (match_dup 0) (match_dup 3))) ++ (cond_exec (match_dup 4) (set (match_dup 0) ++ (ior:SI (match_dup 3) (const_int 1))))] ++ { ++ enum machine_mode mode = GET_MODE (operands[2]); ++ enum rtx_code rc = GET_CODE (operands[1]); ++ ++ /* Note that operands[4] is the same as operands[1], ++ but with VOIDmode as the result. */ ++ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ if (mode == CCFPmode || mode == CCFPEmode) ++ rc = reverse_condition_maybe_unordered (rc); ++ else ++ rc = reverse_condition (rc); ++ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx); ++ } + [(set_attr "conds" "use") + (set_attr "length" "4,8")] + ) +@@ -9144,6 +10165,16 @@ + (eq:SI (match_operand:SI 1 "s_register_operand" "") + (const_int 0))) + (clobber (reg:CC CC_REGNUM))] ++ "arm_arch5 && TARGET_32BIT" ++ [(set (match_dup 0) (clz:SI (match_dup 1))) ++ (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))] ++) ++ ++(define_split ++ [(set (match_operand:SI 0 "s_register_operand" "") ++ (eq:SI (match_operand:SI 1 "s_register_operand" "") ++ (const_int 0))) ++ (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT && reload_completed" + [(parallel + [(set (reg:CC CC_REGNUM) +@@ -9184,7 +10215,7 @@ + (set (match_dup 0) (const_int 1)))]) + + (define_insn_and_split "*compare_scc" +- [(set (match_operand:SI 0 "s_register_operand" "=r,r") ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts") + (match_operator:SI 1 "arm_comparison_operator" + [(match_operand:SI 2 "s_register_operand" "r,r") + (match_operand:SI 3 "arm_add_operand" "rI,L")])) +@@ -9213,29 +10244,93 @@ + + ;; Attempt to improve the sequence generated by the compare_scc splitters + ;; not to use conditional execution. ++ ++;; Rd = (eq (reg1) (const_int0)) // ARMv5 ++;; clz Rd, reg1 ++;; lsr Rd, Rd, #5 + (define_peephole2 + [(set (reg:CC CC_REGNUM) + (compare:CC (match_operand:SI 1 "register_operand" "") ++ (const_int 0))) ++ (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_operand:SI 0 "register_operand" "") (const_int 0))) ++ (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) (const_int 1)))] ++ "arm_arch5 && TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)" ++ [(set (match_dup 0) (clz:SI (match_dup 1))) ++ (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))] ++) ++ ++;; Rd = (eq (reg1) (const_int0)) // !ARMv5 ++;; negs Rd, reg1 ++;; adc Rd, Rd, reg1 ++(define_peephole2 ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_operand:SI 1 "register_operand" "") ++ (const_int 0))) ++ (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_operand:SI 0 "register_operand" "") (const_int 0))) ++ (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) (const_int 1))) ++ (match_scratch:SI 2 "r")] ++ "TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)" ++ [(parallel ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (const_int 0) (match_dup 1))) ++ (set (match_dup 2) (minus:SI (const_int 0) (match_dup 1)))]) ++ (set (match_dup 0) ++ (plus:SI (plus:SI (match_dup 1) (match_dup 2)) ++ (geu:SI (reg:CC CC_REGNUM) (const_int 0))))] ++) ++ ++;; Rd = (eq (reg1) (reg2/imm)) // ARMv5 and optimising for speed. ++;; sub Rd, Reg1, reg2 ++;; clz Rd, Rd ++;; lsr Rd, Rd, #5 ++(define_peephole2 ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "arm_rhs_operand" ""))) + (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0)) + (set (match_operand:SI 0 "register_operand" "") (const_int 0))) + (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_dup 0) (const_int 1)))] ++ "arm_arch5 && TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM) ++ && !(TARGET_THUMB2 && optimize_insn_for_size_p ())" ++ [(set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2))) ++ (set (match_dup 0) (clz:SI (match_dup 0))) ++ (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))] ++) ++ ++ ++;; Rd = (eq (reg1) (reg2)) // ! ARMv5 or optimising for size. ++;; sub T1, Reg1, reg2 ++;; negs Rd, T1 ++;; adc Rd, Rd, T1 ++(define_peephole2 ++ [(set (reg:CC CC_REGNUM) ++ (compare:CC (match_operand:SI 1 "register_operand" "") ++ (match_operand:SI 2 "arm_rhs_operand" ""))) ++ (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0)) ++ (set (match_operand:SI 0 "register_operand" "") (const_int 0))) ++ (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0)) + (set (match_dup 0) (const_int 1))) + (match_scratch:SI 3 "r")] +- "TARGET_32BIT" +- [(parallel +- [(set (reg:CC CC_REGNUM) +- (compare:CC (match_dup 1) (match_dup 2))) +- (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2)))]) ++ "TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)" ++ [(set (match_dup 3) (match_dup 4)) + (parallel + [(set (reg:CC CC_REGNUM) + (compare:CC (const_int 0) (match_dup 3))) + (set (match_dup 0) (minus:SI (const_int 0) (match_dup 3)))]) +- (parallel +- [(set (match_dup 0) +- (plus:SI (plus:SI (match_dup 0) (match_dup 3)) +- (geu:SI (reg:CC CC_REGNUM) (const_int 0)))) +- (clobber (reg:CC CC_REGNUM))])]) ++ (set (match_dup 0) ++ (plus:SI (plus:SI (match_dup 0) (match_dup 3)) ++ (geu:SI (reg:CC CC_REGNUM) (const_int 0))))] ++ " ++ if (CONST_INT_P (operands[2])) ++ operands[4] = plus_constant (SImode, operands[1], -INTVAL (operands[2])); ++ else ++ operands[4] = gen_rtx_MINUS (SImode, operands[1], operands[2]); ++ ") + + (define_insn "*cond_move" + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") +@@ -9262,7 +10357,7 @@ + return \"\"; + " + [(set_attr "conds" "use") +- (set_attr "insn" "mov") ++ (set_attr "type" "mov_reg") + (set_attr "length" "4,4,8")] + ) + +@@ -9636,7 +10731,7 @@ + ) + + (define_insn_and_split "*ior_scc_scc" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts") + (ior:SI (match_operator:SI 3 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand" "r") + (match_operand:SI 2 "arm_add_operand" "rIL")]) +@@ -9674,7 +10769,7 @@ + [(match_operand:SI 4 "s_register_operand" "r") + (match_operand:SI 5 "arm_add_operand" "rIL")])) + (const_int 0))) +- (set (match_operand:SI 7 "s_register_operand" "=r") ++ (set (match_operand:SI 7 "s_register_operand" "=Ts") + (ior:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) + (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] + "TARGET_32BIT" +@@ -9692,7 +10787,7 @@ + (set_attr "length" "16")]) + + (define_insn_and_split "*and_scc_scc" +- [(set (match_operand:SI 0 "s_register_operand" "=r") ++ [(set (match_operand:SI 0 "s_register_operand" "=Ts") + (and:SI (match_operator:SI 3 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand" "r") + (match_operand:SI 2 "arm_add_operand" "rIL")]) +@@ -9732,7 +10827,7 @@ + [(match_operand:SI 4 "s_register_operand" "r") + (match_operand:SI 5 "arm_add_operand" "rIL")])) + (const_int 0))) +- (set (match_operand:SI 7 "s_register_operand" "=r") ++ (set (match_operand:SI 7 "s_register_operand" "=Ts") + (and:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) + (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] + "TARGET_32BIT" +@@ -9754,7 +10849,7 @@ + ;; need only zero the value if false (if true, then the value is already + ;; correct). + (define_insn_and_split "*and_scc_scc_nodom" +- [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r") ++ [(set (match_operand:SI 0 "s_register_operand" "=&Ts,&Ts,&Ts") + (and:SI (match_operator:SI 3 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand" "r,r,0") + (match_operand:SI 2 "arm_add_operand" "rIL,0,rIL")]) +@@ -9822,7 +10917,7 @@ + "") + ;; ??? The conditional patterns above need checking for Thumb-2 usefulness + +-(define_insn "*negscc" ++(define_insn_and_split "*negscc" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (neg:SI (match_operator 3 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand" "r") +@@ -9829,21 +10924,110 @@ + (match_operand:SI 2 "arm_rhs_operand" "rI")]))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM" +- "* +- if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx) +- return \"mov\\t%0, %1, asr #31\"; ++ "#" ++ "&& reload_completed" ++ [(const_int 0)] ++ { ++ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM); + +- if (GET_CODE (operands[3]) == NE) +- return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\"; ++ if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx) ++ { ++ /* Emit mov\\t%0, %1, asr #31 */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ operands[0], ++ gen_rtx_ASHIFTRT (SImode, ++ operands[1], ++ GEN_INT (31)))); ++ DONE; ++ } ++ else if (GET_CODE (operands[3]) == NE) ++ { ++ /* Emit subs\\t%0, %1, %2\;mvnne\\t%0, #0 */ ++ if (CONST_INT_P (operands[2])) ++ emit_insn (gen_cmpsi2_addneg (operands[0], operands[1], operands[2], ++ GEN_INT (- INTVAL (operands[2])))); ++ else ++ emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2])); + +- output_asm_insn (\"cmp\\t%1, %2\", operands); +- output_asm_insn (\"mov%D3\\t%0, #0\", operands); +- return \"mvn%d3\\t%0, #0\"; +- " ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_NE (SImode, ++ cc_reg, ++ const0_rtx), ++ gen_rtx_SET (SImode, ++ operands[0], ++ GEN_INT (~0)))); ++ DONE; ++ } ++ else ++ { ++ /* Emit: cmp\\t%1, %2\;mov%D3\\t%0, #0\;mvn%d3\\t%0, #0 */ ++ emit_insn (gen_rtx_SET (VOIDmode, ++ cc_reg, ++ gen_rtx_COMPARE (CCmode, operands[1], operands[2]))); ++ enum rtx_code rc = GET_CODE (operands[3]); ++ ++ rc = reverse_condition (rc); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_fmt_ee (rc, ++ VOIDmode, ++ cc_reg, ++ const0_rtx), ++ gen_rtx_SET (VOIDmode, operands[0], const0_rtx))); ++ rc = GET_CODE (operands[3]); ++ emit_insn (gen_rtx_COND_EXEC (VOIDmode, ++ gen_rtx_fmt_ee (rc, ++ VOIDmode, ++ cc_reg, ++ const0_rtx), ++ gen_rtx_SET (VOIDmode, ++ operands[0], ++ GEN_INT (~0)))); ++ DONE; ++ } ++ FAIL; ++ } + [(set_attr "conds" "clob") + (set_attr "length" "12")] + ) + ++(define_insn_and_split "movcond_addsi" ++ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r") ++ (if_then_else:SI ++ (match_operator 5 "comparison_operator" ++ [(plus:SI (match_operand:SI 3 "s_register_operand" "r,r,r") ++ (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL")) ++ (const_int 0)]) ++ (match_operand:SI 1 "arm_rhs_operand" "rI,rPy,r") ++ (match_operand:SI 2 "arm_rhs_operand" "rI,rPy,r"))) ++ (clobber (reg:CC CC_REGNUM))] ++ "TARGET_32BIT" ++ "#" ++ "&& reload_completed" ++ [(set (reg:CC_NOOV CC_REGNUM) ++ (compare:CC_NOOV ++ (plus:SI (match_dup 3) ++ (match_dup 4)) ++ (const_int 0))) ++ (set (match_dup 0) (match_dup 1)) ++ (cond_exec (match_dup 6) ++ (set (match_dup 0) (match_dup 2)))] ++ " ++ { ++ enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[5]), ++ operands[3], operands[4]); ++ enum rtx_code rc = GET_CODE (operands[5]); ++ ++ operands[6] = gen_rtx_REG (mode, CC_REGNUM); ++ gcc_assert (!(mode == CCFPmode || mode == CCFPEmode)); ++ rc = reverse_condition (rc); ++ ++ operands[6] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); ++ } ++ " ++ [(set_attr "conds" "clob") ++ (set_attr "enabled_for_depr_it" "no,yes,yes")] ++) ++ + (define_insn "movcond" + [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") + (if_then_else:SI +@@ -9944,9 +11128,9 @@ + (set_attr "length" "4,4,8,8") + (set_attr_alternative "type" + [(if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "simple_alu_imm" ) ++ (const_string "arlo_imm" ) + (const_string "*")) +- (const_string "simple_alu_imm") ++ (const_string "arlo_imm") + (const_string "*") + (const_string "*")])] + ) +@@ -9986,9 +11170,9 @@ + (set_attr "length" "4,4,8,8") + (set_attr_alternative "type" + [(if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "simple_alu_imm" ) ++ (const_string "arlo_imm" ) + (const_string "*")) +- (const_string "simple_alu_imm") ++ (const_string "arlo_imm") + (const_string "*") + (const_string "*")])] + ) +@@ -10174,7 +11358,7 @@ + mov%d4\\t%0, %1\;mvn%D4\\t%0, %2 + mvn%d4\\t%0, #%B1\;mvn%D4\\t%0, %2" + [(set_attr "conds" "use") +- (set_attr "insn" "mvn") ++ (set_attr "type" "mvn_reg") + (set_attr "length" "4,8,8")] + ) + +@@ -10207,7 +11391,7 @@ + mov%D4\\t%0, %1\;mvn%d4\\t%0, %2 + mvn%D4\\t%0, #%B1\;mvn%d4\\t%0, %2" + [(set_attr "conds" "use") +- (set_attr "insn" "mvn") ++ (set_attr "type" "mvn_reg") + (set_attr "length" "4,8,8")] + ) + +@@ -10245,10 +11429,9 @@ + [(set_attr "conds" "use") + (set_attr "shift" "2") + (set_attr "length" "4,8,8") +- (set_attr "insn" "mov") + (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "mov_shift") ++ (const_string "mov_shift_reg")))] + ) + + (define_insn "*ifcompare_move_shift" +@@ -10285,10 +11468,9 @@ + [(set_attr "conds" "use") + (set_attr "shift" "2") + (set_attr "length" "4,8,8") +- (set_attr "insn" "mov") + (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "mov_shift") ++ (const_string "mov_shift_reg")))] + ) + + (define_insn "*ifcompare_shift_shift" +@@ -10326,12 +11508,11 @@ + [(set_attr "conds" "use") + (set_attr "shift" "1") + (set_attr "length" "8") +- (set_attr "insn" "mov") + (set (attr "type") (if_then_else + (and (match_operand 2 "const_int_operand" "") + (match_operand 4 "const_int_operand" "")) +- (const_string "alu_shift") +- (const_string "alu_shift_reg")))] ++ (const_string "mov_shift") ++ (const_string "mov_shift_reg")))] + ) + + (define_insn "*ifcompare_not_arith" +@@ -10363,7 +11544,7 @@ + "TARGET_ARM" + "mvn%d5\\t%0, %1\;%I6%D5\\t%0, %2, %3" + [(set_attr "conds" "use") +- (set_attr "insn" "mvn") ++ (set_attr "type" "mvn_reg") + (set_attr "length" "8")] + ) + +@@ -10396,7 +11577,7 @@ + "TARGET_ARM" + "mvn%D5\\t%0, %1\;%I6%d5\\t%0, %2, %3" + [(set_attr "conds" "use") +- (set_attr "insn" "mvn") ++ (set_attr "type" "mvn_reg") + (set_attr "length" "8")] + ) + +@@ -10844,7 +12025,7 @@ + mvn%D4\\t%0, %2 + mov%d4\\t%0, %1\;mvn%D4\\t%0, %2" + [(set_attr "conds" "use") +- (set_attr "insn" "mvn") ++ (set_attr "type" "mvn_reg") + (set_attr "length" "4,8")] + ) + +@@ -11239,7 +12420,7 @@ + "TARGET_32BIT && arm_arch5" + "clz%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "clz")]) ++ (set_attr "type" "clz")]) + + (define_insn "rbitsi2" + [(set (match_operand:SI 0 "s_register_operand" "=r") +@@ -11247,7 +12428,7 @@ + "TARGET_32BIT && arm_arch_thumb2" + "rbit%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "insn" "clz")]) ++ (set_attr "type" "clz")]) + + (define_expand "ctzsi2" + [(set (match_operand:SI 0 "s_register_operand" "") +@@ -11282,6 +12463,7 @@ + (const_int 0)])] + "TARGET_32BIT" + "" ++[(set_attr "predicated" "yes")] + ) + + (define_insn "force_register_use" +@@ -11401,7 +12583,8 @@ + "arm_arch_thumb2" + "movt%?\t%0, %L1" + [(set_attr "predicable" "yes") +- (set_attr "length" "4")] ++ (set_attr "predicable_short_it" "no") ++ (set_attr "length" "4")] + ) + + (define_insn "*arm_rev" +@@ -11552,7 +12735,8 @@ + false, true))" + "ldrd%?\t%0, %3, [%1, %2]" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb2_ldrd_base" + [(set (match_operand:SI 0 "s_register_operand" "=r") +@@ -11566,7 +12750,8 @@ + operands[1], 0, false, true))" + "ldrd%?\t%0, %2, [%1]" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb2_ldrd_base_neg" + [(set (match_operand:SI 0 "s_register_operand" "=r") +@@ -11580,7 +12765,8 @@ + operands[1], -4, false, true))" + "ldrd%?\t%0, %2, [%1, #-4]" + [(set_attr "type" "load2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb2_strd" + [(set (mem:SI (plus:SI (match_operand:SI 0 "s_register_operand" "rk") +@@ -11597,7 +12783,8 @@ + false, false))" + "strd%?\t%2, %4, [%0, %1]" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb2_strd_base" + [(set (mem:SI (match_operand:SI 0 "s_register_operand" "rk")) +@@ -11611,7 +12798,8 @@ + operands[0], 0, false, false))" + "strd%?\t%1, %2, [%0]" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + + (define_insn "*thumb2_strd_base_neg" + [(set (mem:SI (plus:SI (match_operand:SI 0 "s_register_operand" "rk") +@@ -11625,9 +12813,24 @@ + operands[0], -4, false, false))" + "strd%?\t%1, %2, [%0, #-4]" + [(set_attr "type" "store2") +- (set_attr "predicable" "yes")]) ++ (set_attr "predicable" "yes") ++ (set_attr "predicable_short_it" "no")]) + ++;; ARMv8 CRC32 instructions. ++(define_insn "" ++ [(set (match_operand:SI 0 "s_register_operand" "=r") ++ (unspec:SI [(match_operand:SI 1 "s_register_operand" "r") ++ (match_operand: 2 "s_register_operand" "r")] ++ CRC))] ++ "TARGET_CRC32" ++ "\\t%0, %1, %2" ++ [(set_attr "type" "crc") ++ (set_attr "conds" "unconditional")] ++) + ++;; Load the load/store double peephole optimizations. ++(include "ldrdstrd.md") ++ + ;; Load the load/store multiple patterns + (include "ldmstm.md") + +@@ -11661,6 +12864,8 @@ + (include "thumb2.md") + ;; Neon patterns + (include "neon.md") ++;; Crypto patterns ++(include "crypto.md") + ;; Synchronization Primitives + (include "sync.md") + ;; Fixed-point patterns +--- a/src/gcc/config/arm/fmp626.md ++++ b/src/gcc/config/arm/fmp626.md +@@ -63,12 +63,15 @@ + ;; ALU operations + (define_insn_reservation "mp626_alu_op" 1 + (and (eq_attr "tune" "fmp626") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "fmp626_core") + + (define_insn_reservation "mp626_alu_shift_op" 2 + (and (eq_attr "tune" "fmp626") +- (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg")) ++ (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg")) + "fmp626_core") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -77,22 +80,22 @@ + + (define_insn_reservation "mp626_mult1" 2 + (and (eq_attr "tune" "fmp626") +- (eq_attr "insn" "smulwy,smlawy,smulxy,smlaxy")) ++ (eq_attr "type" "smulwy,smlawy,smulxy,smlaxy")) + "fmp626_core") + + (define_insn_reservation "mp626_mult2" 2 + (and (eq_attr "tune" "fmp626") +- (eq_attr "insn" "mul,mla")) ++ (eq_attr "type" "mul,mla")) + "fmp626_core") + + (define_insn_reservation "mp626_mult3" 3 + (and (eq_attr "tune" "fmp626") +- (eq_attr "insn" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx")) ++ (eq_attr "type" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx")) + "fmp626_core*2") + + (define_insn_reservation "mp626_mult4" 4 + (and (eq_attr "tune" "fmp626") +- (eq_attr "insn" "smulls,smlals,umulls,umlals")) ++ (eq_attr "type" "smulls,smlals,umulls,umlals")) + "fmp626_core*3") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/crypto.md ++++ b/src/gcc/config/arm/crypto.md +@@ -0,0 +1,86 @@ ++;; ARMv8-A crypto patterns. ++;; Copyright (C) 2013-2014 Free Software Foundation, Inc. ++;; Contributed by ARM Ltd. ++ ++;; This file is part of GCC. ++ ++;; GCC is free software; you can redistribute it and/or modify it ++;; under the terms of the GNU General Public License as published ++;; by the Free Software Foundation; either version 3, or (at your ++;; option) any later version. ++ ++;; GCC is distributed in the hope that it will be useful, but WITHOUT ++;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++;; License for more details. ++ ++;; You should have received a copy of the GNU General Public License ++;; along with GCC; see the file COPYING3. If not see ++;; . ++ ++(define_insn "crypto_" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (unspec: [(match_operand: 1 ++ "register_operand" "w")] ++ CRYPTO_UNARY))] ++ "TARGET_CRYPTO" ++ ".\\t%q0, %q1" ++ [(set_attr "neon_type" "")] ++) ++ ++(define_insn "crypto_" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (unspec: [(match_operand: 1 "register_operand" "0") ++ (match_operand: 2 "register_operand" "w")] ++ CRYPTO_BINARY))] ++ "TARGET_CRYPTO" ++ ".\\t%q0, %q2" ++ [(set_attr "neon_type" "")] ++) ++ ++(define_insn "crypto_" ++ [(set (match_operand: 0 "register_operand" "=w") ++ (unspec: [(match_operand: 1 "register_operand" "0") ++ (match_operand: 2 "register_operand" "w") ++ (match_operand: 3 "register_operand" "w")] ++ CRYPTO_TERNARY))] ++ "TARGET_CRYPTO" ++ ".\\t%q0, %q2, %q3" ++ [(set_attr "neon_type" "")] ++) ++ ++(define_insn "crypto_sha1h" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (zero_extend:V4SI ++ (unspec:SI [(vec_select:SI ++ (match_operand:V4SI 1 "register_operand" "w") ++ (parallel [(match_operand:SI 2 "immediate_operand" "i")]))] ++ UNSPEC_SHA1H)))] ++ "TARGET_CRYPTO" ++ "sha1h.32\\t%q0, %q1" ++ [(set_attr "neon_type" "neon_crypto_sha1_fast")] ++) ++ ++(define_insn "crypto_vmullp64" ++ [(set (match_operand:TI 0 "register_operand" "=w") ++ (unspec:TI [(match_operand:DI 1 "register_operand" "w") ++ (match_operand:DI 2 "register_operand" "w")] ++ UNSPEC_VMULLP64))] ++ "TARGET_CRYPTO" ++ "vmull.p64\\t%q0, %P1, %P2" ++ [(set_attr "neon_type" "neon_mul_d_long")] ++) ++ ++(define_insn "crypto_" ++ [(set (match_operand:V4SI 0 "register_operand" "=w") ++ (unspec: ++ [(match_operand: 1 "register_operand" "0") ++ (vec_select:SI ++ (match_operand: 2 "register_operand" "w") ++ (parallel [(match_operand:SI 4 "immediate_operand" "i")])) ++ (match_operand: 3 "register_operand" "w")] ++ CRYPTO_SELECTING))] ++ "TARGET_CRYPTO" ++ ".\\t%q0, %q2, %q3" ++ [(set_attr "neon_type" "")] ++) +--- a/src/gcc/config/arm/fa526.md ++++ b/src/gcc/config/arm/fa526.md +@@ -62,12 +62,15 @@ + ;; ALU operations + (define_insn_reservation "526_alu_op" 1 + (and (eq_attr "tune" "fa526") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "fa526_core") + + (define_insn_reservation "526_alu_shift_op" 2 + (and (eq_attr "tune" "fa526") +- (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg")) ++ (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg")) + "fa526_core") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -76,12 +79,12 @@ + + (define_insn_reservation "526_mult1" 2 + (and (eq_attr "tune" "fa526") +- (eq_attr "insn" "smlalxy,smulxy,smlaxy,smlalxy")) ++ (eq_attr "type" "smlalxy,smulxy,smlaxy,smlalxy")) + "fa526_core") + + (define_insn_reservation "526_mult2" 5 + (and (eq_attr "tune" "fa526") +- (eq_attr "insn" "mul,mla,muls,mlas,umull,umlal,smull,smlal,umulls,\ ++ (eq_attr "type" "mul,mla,muls,mlas,umull,umlal,smull,smlal,umulls,\ + umlals,smulls,smlals,smlawx")) + "fa526_core*4") + +--- a/src/gcc/config/arm/arm-generic.md ++++ b/src/gcc/config/arm/arm-generic.md +@@ -114,7 +114,9 @@ + + (define_insn_reservation "mult" 16 + (and (eq_attr "generic_sched" "yes") +- (and (eq_attr "ldsched" "no") (eq_attr "type" "mult"))) ++ (and (eq_attr "ldsched" "no") ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes")))) + "core*16") + + (define_insn_reservation "mult_ldsched_strongarm" 3 +@@ -122,7 +124,8 @@ + (and (eq_attr "ldsched" "yes") + (and (eq_attr "tune" + "strongarm,strongarm110,strongarm1100,strongarm1110") +- (eq_attr "type" "mult")))) ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes"))))) + "core*2") + + (define_insn_reservation "mult_ldsched" 4 +@@ -130,13 +133,17 @@ + (and (eq_attr "ldsched" "yes") + (and (eq_attr "tune" + "!strongarm,strongarm110,strongarm1100,strongarm1110") +- (eq_attr "type" "mult")))) ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes"))))) + "core*4") + + (define_insn_reservation "multi_cycle" 32 + (and (eq_attr "generic_sched" "yes") + (and (eq_attr "core_cycles" "multi") +- (eq_attr "type" "!mult,load_byte,load1,load2,load3,load4,store1,store2,store3,store4"))) ++ (and (eq_attr "type" "!load_byte,load1,load2,load3,load4,\ ++ store1,store2,store3,store4") ++ (not (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes")))))) + "core*32") + + (define_insn_reservation "single_cycle" 1 +--- a/src/gcc/config/arm/neon-docgen.ml ++++ b/src/gcc/config/arm/neon-docgen.ml +@@ -329,6 +329,85 @@ + "@c This file is generated automatically using gcc/config/arm/neon-docgen.ml"; + "@c Please do not edit manually."] + ++let crypto_doc = ++" ++@itemize @bullet ++@item poly128_t vldrq_p128(poly128_t const *) ++@end itemize ++ ++@itemize @bullet ++@item void vstrq_p128(poly128_t *, poly128_t) ++@end itemize ++ ++@itemize @bullet ++@item uint64x1_t vceq_p64 (poly64x1_t, poly64x1_t) ++@end itemize ++ ++@itemize @bullet ++@item uint64x1_t vtst_p64 (poly64x1_t, poly64x1_t) ++@end itemize ++ ++@itemize @bullet ++@item uint32_t vsha1h_u32 (uint32_t) ++@*@emph{Form of expected instruction(s):} @code{sha1h.32 @var{q0}, @var{q1}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1cq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1c.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1pq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1p.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1mq_u32 (uint32x4_t, uint32_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1m.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1su0q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1su0.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha1su1q_u32 (uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha1su1.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256hq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256h.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256h2q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256h2.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256su0q_u32 (uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256su0.32 @var{q0}, @var{q1}} ++@end itemize ++ ++@itemize @bullet ++@item uint32x4_t vsha256su1q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) ++@*@emph{Form of expected instruction(s):} @code{sha256su1.32 @var{q0}, @var{q1}, @var{q2}} ++@end itemize ++ ++@itemize @bullet ++@item poly128_t vmull_p64 (poly64_t a, poly64_t b) ++@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} ++@end itemize ++ ++@itemize @bullet ++@item poly128_t vmull_high_p64 (poly64x2_t a, poly64x2_t b) ++@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} ++@end itemize ++" ++ + (* Program entry point. *) + let _ = + if Array.length Sys.argv <> 2 then +@@ -339,6 +418,7 @@ + let chan = open_out file in + gnu_header chan; + List.iter (document_group chan) intrinsic_groups; ++ Printf.fprintf chan "%s\n" crypto_doc; + close_out chan + with Sys_error sys -> + failwith ("Could not create output file " ^ file ^ ": " ^ sys) +--- a/src/gcc/config/arm/iwmmxt2.md ++++ b/src/gcc/config/arm/iwmmxt2.md +@@ -24,7 +24,7 @@ + "TARGET_REALLY_IWMMXT" + "wabs%?\\t%0, %1" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wabs")] ++ (set_attr "type" "wmmx_wabs")] + ) + + (define_insn "iwmmxt_wabsdiffb" +@@ -37,7 +37,7 @@ + "TARGET_REALLY_IWMMXT" + "wabsdiffb%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wabsdiff")] ++ (set_attr "type" "wmmx_wabsdiff")] + ) + + (define_insn "iwmmxt_wabsdiffh" +@@ -50,7 +50,7 @@ + "TARGET_REALLY_IWMMXT" + "wabsdiffh%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wabsdiff")] ++ (set_attr "type" "wmmx_wabsdiff")] + ) + + (define_insn "iwmmxt_wabsdiffw" +@@ -63,7 +63,7 @@ + "TARGET_REALLY_IWMMXT" + "wabsdiffw%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wabsdiff")] ++ (set_attr "type" "wmmx_wabsdiff")] + ) + + (define_insn "iwmmxt_waddsubhx" +@@ -81,7 +81,7 @@ + "TARGET_REALLY_IWMMXT" + "waddsubhx%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "waddsubhx")] ++ (set_attr "type" "wmmx_waddsubhx")] + ) + + (define_insn "iwmmxt_wsubaddhx" +@@ -99,7 +99,7 @@ + "TARGET_REALLY_IWMMXT" + "wsubaddhx%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wsubaddhx")] ++ (set_attr "type" "wmmx_wsubaddhx")] + ) + + (define_insn "addc3" +@@ -111,7 +111,7 @@ + "TARGET_REALLY_IWMMXT" + "waddc%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wadd")] ++ (set_attr "type" "wmmx_wadd")] + ) + + (define_insn "iwmmxt_avg4" +@@ -143,7 +143,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg4%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg4")] ++ (set_attr "type" "wmmx_wavg4")] + ) + + (define_insn "iwmmxt_avg4r" +@@ -175,7 +175,7 @@ + "TARGET_REALLY_IWMMXT" + "wavg4r%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wavg4")] ++ (set_attr "type" "wmmx_wavg4")] + ) + + (define_insn "iwmmxt_wmaddsx" +@@ -194,7 +194,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaddsx%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_wmaddux" +@@ -213,7 +213,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaddux%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_wmaddsn" +@@ -232,7 +232,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaddsn%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_wmaddun" +@@ -251,7 +251,7 @@ + "TARGET_REALLY_IWMMXT" + "wmaddun%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmadd")] ++ (set_attr "type" "wmmx_wmadd")] + ) + + (define_insn "iwmmxt_wmulwsm" +@@ -265,7 +265,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulwsm%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmulw")] ++ (set_attr "type" "wmmx_wmulw")] + ) + + (define_insn "iwmmxt_wmulwum" +@@ -279,7 +279,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulwum%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmulw")] ++ (set_attr "type" "wmmx_wmulw")] + ) + + (define_insn "iwmmxt_wmulsmr" +@@ -297,7 +297,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulsmr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "iwmmxt_wmulumr" +@@ -316,7 +316,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulumr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "iwmmxt_wmulwsmr" +@@ -333,7 +333,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulwsmr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmul")] ++ (set_attr "type" "wmmx_wmul")] + ) + + (define_insn "iwmmxt_wmulwumr" +@@ -350,7 +350,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulwumr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmulw")] ++ (set_attr "type" "wmmx_wmulw")] + ) + + (define_insn "iwmmxt_wmulwl" +@@ -361,7 +361,7 @@ + "TARGET_REALLY_IWMMXT" + "wmulwl%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmulw")] ++ (set_attr "type" "wmmx_wmulw")] + ) + + (define_insn "iwmmxt_wqmulm" +@@ -371,7 +371,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmulm%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmulm")] ++ (set_attr "type" "wmmx_wqmulm")] + ) + + (define_insn "iwmmxt_wqmulwm" +@@ -381,7 +381,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmulwm%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmulwm")] ++ (set_attr "type" "wmmx_wqmulwm")] + ) + + (define_insn "iwmmxt_wqmulmr" +@@ -391,7 +391,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmulmr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmulm")] ++ (set_attr "type" "wmmx_wqmulm")] + ) + + (define_insn "iwmmxt_wqmulwmr" +@@ -401,7 +401,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmulwmr%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmulwm")] ++ (set_attr "type" "wmmx_wqmulwm")] + ) + + (define_insn "iwmmxt_waddbhusm" +@@ -417,7 +417,7 @@ + "TARGET_REALLY_IWMMXT" + "waddbhusm%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "waddbhus")] ++ (set_attr "type" "wmmx_waddbhus")] + ) + + (define_insn "iwmmxt_waddbhusl" +@@ -433,7 +433,7 @@ + "TARGET_REALLY_IWMMXT" + "waddbhusl%?\\t%0, %1, %2" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "waddbhus")] ++ (set_attr "type" "wmmx_waddbhus")] + ) + + (define_insn "iwmmxt_wqmiabb" +@@ -446,7 +446,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiabb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiabt" +@@ -459,7 +459,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiabt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiatb" +@@ -472,7 +472,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiatb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiatt" +@@ -485,7 +485,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiatt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiabbn" +@@ -498,7 +498,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiabbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiabtn" +@@ -511,7 +511,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiabtn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiatbn" +@@ -524,7 +524,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiatbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wqmiattn" +@@ -537,7 +537,7 @@ + "TARGET_REALLY_IWMMXT" + "wqmiattn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wqmiaxy")] ++ (set_attr "type" "wmmx_wqmiaxy")] + ) + + (define_insn "iwmmxt_wmiabb" +@@ -561,7 +561,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiabb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiabt" +@@ -585,7 +585,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiabt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiatb" +@@ -609,7 +609,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiatb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiatt" +@@ -633,7 +633,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiatt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiabbn" +@@ -657,7 +657,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiabbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiabtn" +@@ -681,7 +681,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiabtn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiatbn" +@@ -705,7 +705,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiatbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiattn" +@@ -729,7 +729,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiattn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiaxy")] ++ (set_attr "type" "wmmx_wmiaxy")] + ) + + (define_insn "iwmmxt_wmiawbb" +@@ -742,7 +742,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawbb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawbt" +@@ -755,7 +755,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawbt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawtb" +@@ -768,7 +768,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawtb%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawtt" +@@ -781,7 +781,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawtt%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawbbn" +@@ -794,7 +794,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawbbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawbtn" +@@ -807,7 +807,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawbtn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawtbn" +@@ -820,7 +820,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawtbn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmiawttn" +@@ -833,7 +833,7 @@ + "TARGET_REALLY_IWMMXT" + "wmiawttn%?\\t%0, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmiawxy")] ++ (set_attr "type" "wmmx_wmiawxy")] + ) + + (define_insn "iwmmxt_wmerge" +@@ -858,7 +858,7 @@ + "TARGET_REALLY_IWMMXT" + "wmerge%?\\t%0, %1, %2, %3" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "wmerge")] ++ (set_attr "type" "wmmx_wmerge")] + ) + + (define_insn "iwmmxt_tandc3" +@@ -868,7 +868,7 @@ + "TARGET_REALLY_IWMMXT" + "tandc%?\\t r15" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "tandc")] ++ (set_attr "type" "wmmx_tandc")] + ) + + (define_insn "iwmmxt_torc3" +@@ -878,7 +878,7 @@ + "TARGET_REALLY_IWMMXT" + "torc%?\\t r15" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "torc")] ++ (set_attr "type" "wmmx_torc")] + ) + + (define_insn "iwmmxt_torvsc3" +@@ -888,7 +888,7 @@ + "TARGET_REALLY_IWMMXT" + "torvsc%?\\t r15" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "torvsc")] ++ (set_attr "type" "wmmx_torvsc")] + ) + + (define_insn "iwmmxt_textrc3" +@@ -899,5 +899,5 @@ + "TARGET_REALLY_IWMMXT" + "textrc%?\\t r15, %0" + [(set_attr "predicable" "yes") +- (set_attr "wtype" "textrc")] ++ (set_attr "type" "wmmx_textrc")] + ) +--- a/src/gcc/config/arm/cortex-a5.md ++++ b/src/gcc/config/arm/cortex-a5.md +@@ -58,12 +58,15 @@ + + (define_insn_reservation "cortex_a5_alu" 2 + (and (eq_attr "tune" "cortexa5") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "cortex_a5_ex1") + + (define_insn_reservation "cortex_a5_alu_shift" 2 + (and (eq_attr "tune" "cortexa5") +- (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg")) ++ (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg")) + "cortex_a5_ex1") + + ;; Forwarding path for unshifted operands. +@@ -80,7 +83,8 @@ + + (define_insn_reservation "cortex_a5_mul" 2 + (and (eq_attr "tune" "cortexa5") +- (eq_attr "type" "mult")) ++ (ior (eq_attr "mul32" "yes") ++ (eq_attr "mul64" "yes"))) + "cortex_a5_ex1") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/fa606te.md ++++ b/src/gcc/config/arm/fa606te.md +@@ -62,7 +62,10 @@ + ;; ALU operations + (define_insn_reservation "606te_alu_op" 1 + (and (eq_attr "tune" "fa606te") +- (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg, ++ extend,arlo_shift,arlo_shift_reg,\ ++ mov_imm,mov_reg,mov_shift,mov_shift_reg,\ ++ mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg")) + "fa606te_core") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -71,22 +74,22 @@ + + (define_insn_reservation "606te_mult1" 2 + (and (eq_attr "tune" "fa606te") +- (eq_attr "insn" "smlalxy")) ++ (eq_attr "type" "smlalxy")) + "fa606te_core") + + (define_insn_reservation "606te_mult2" 3 + (and (eq_attr "tune" "fa606te") +- (eq_attr "insn" "smlaxy,smulxy,smulwy,smlawy")) ++ (eq_attr "type" "smlaxy,smulxy,smulwy,smlawy")) + "fa606te_core*2") + + (define_insn_reservation "606te_mult3" 4 + (and (eq_attr "tune" "fa606te") +- (eq_attr "insn" "mul,mla,muls,mlas")) ++ (eq_attr "type" "mul,mla,muls,mlas")) + "fa606te_core*3") + + (define_insn_reservation "606te_mult4" 5 + (and (eq_attr "tune" "fa606te") +- (eq_attr "insn" "umull,umlal,smull,smlal,umulls,umlals,smulls,smlals")) ++ (eq_attr "type" "umull,umlal,smull,smlal,umulls,umlals,smulls,smlals")) + "fa606te_core*4") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/cortex-a9.md ++++ b/src/gcc/config/arm/cortex-a9.md +@@ -80,18 +80,17 @@ + ;; which can go down E2 without any problem. + (define_insn_reservation "cortex_a9_dp" 2 + (and (eq_attr "tune" "cortexa9") +- (ior (and (eq_attr "type" "alu_reg,simple_alu_imm") +- (eq_attr "neon_type" "none")) +- (and (and (eq_attr "type" "alu_shift_reg, simple_alu_shift,alu_shift") +- (eq_attr "insn" "mov")) +- (eq_attr "neon_type" "none")))) ++ (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg,\ ++ mov_shift_reg,mov_shift") ++ (eq_attr "neon_type" "none"))) + "cortex_a9_p0_default|cortex_a9_p1_default") + + ;; An instruction using the shifter will go down E1. + (define_insn_reservation "cortex_a9_dp_shift" 3 + (and (eq_attr "tune" "cortexa9") +- (and (eq_attr "type" "alu_shift_reg, simple_alu_shift,alu_shift") +- (not (eq_attr "insn" "mov")))) ++ (eq_attr "type" "arlo_shift_reg,extend,arlo_shift,\ ++ mvn_shift,mvn_shift_reg")) + "cortex_a9_p0_shift | cortex_a9_p1_shift") + + ;; Loads have a latency of 4 cycles. +@@ -130,7 +129,7 @@ + ;; We get 16*16 multiply / mac results in 3 cycles. + (define_insn_reservation "cortex_a9_mult16" 3 + (and (eq_attr "tune" "cortexa9") +- (eq_attr "insn" "smulxy")) ++ (eq_attr "type" "smulxy")) + "cortex_a9_mult16") + + ;; The 16*16 mac is slightly different that it +@@ -137,22 +136,22 @@ + ;; reserves M1 and M2 in the same cycle. + (define_insn_reservation "cortex_a9_mac16" 3 + (and (eq_attr "tune" "cortexa9") +- (eq_attr "insn" "smlaxy")) ++ (eq_attr "type" "smlaxy")) + "cortex_a9_mac16") + + (define_insn_reservation "cortex_a9_multiply" 4 + (and (eq_attr "tune" "cortexa9") +- (eq_attr "insn" "mul,smmul,smmulr")) ++ (eq_attr "type" "mul,smmul,smmulr")) + "cortex_a9_mult") + + (define_insn_reservation "cortex_a9_mac" 4 + (and (eq_attr "tune" "cortexa9") +- (eq_attr "insn" "mla,smmla")) ++ (eq_attr "type" "mla,smmla")) + "cortex_a9_mac") + + (define_insn_reservation "cortex_a9_multiply_long" 5 + (and (eq_attr "tune" "cortexa9") +- (eq_attr "insn" "smull,umull,smulls,umulls,smlal,smlals,umlal,umlals")) ++ (eq_attr "type" "smull,umull,smulls,umulls,smlal,smlals,umlal,umlals")) + "cortex_a9_mult_long") + + ;; An instruction with a result in E2 can be forwarded +--- a/src/gcc/config/arm/fa626te.md ++++ b/src/gcc/config/arm/fa626te.md +@@ -68,12 +68,15 @@ + ;; ALU operations + (define_insn_reservation "626te_alu_op" 1 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "type" "alu_reg,simple_alu_imm")) ++ (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\ ++ mov_imm,mov_reg,mvn_imm,mvn_reg")) + "fa626te_core") + + (define_insn_reservation "626te_alu_shift_op" 2 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg")) ++ (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\ ++ mov_shift,mov_shift_reg,\ ++ mvn_shift,mvn_shift_reg")) + "fa626te_core") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@@ -82,22 +85,22 @@ + + (define_insn_reservation "626te_mult1" 2 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "insn" "smulwy,smlawy,smulxy,smlaxy")) ++ (eq_attr "type" "smulwy,smlawy,smulxy,smlaxy")) + "fa626te_core") + + (define_insn_reservation "626te_mult2" 2 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "insn" "mul,mla")) ++ (eq_attr "type" "mul,mla")) + "fa626te_core") + + (define_insn_reservation "626te_mult3" 3 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "insn" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx")) ++ (eq_attr "type" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx")) + "fa626te_core*2") + + (define_insn_reservation "626te_mult4" 4 + (and (eq_attr "tune" "fa626,fa626te") +- (eq_attr "insn" "smulls,smlals,umulls,umlals")) ++ (eq_attr "type" "smulls,smlals,umulls,umlals")) + "fa626te_core*3") + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +--- a/src/gcc/config/arm/neon-gen.ml ++++ b/src/gcc/config/arm/neon-gen.ml +@@ -114,6 +114,7 @@ + | T_uint32x4 -> T_int32x4 + | T_uint64x1 -> T_int64x1 + | T_uint64x2 -> T_int64x2 ++ | T_poly64x2 -> T_int64x2 + (* Cast to types defined by mode in arm.c, not random types pulled in from + the header in use. This fixes incompatible pointer errors when + compiling with C++. *) +@@ -121,9 +122,12 @@ + | T_uint16 | T_int16 -> T_intHI + | T_uint32 | T_int32 -> T_intSI + | T_uint64 | T_int64 -> T_intDI ++ | T_float16 -> T_floatHF + | T_float32 -> T_floatSF + | T_poly8 -> T_intQI + | T_poly16 -> T_intHI ++ | T_poly64 -> T_intDI ++ | T_poly128 -> T_intTI + | T_arrayof (n, elt) -> T_arrayof (n, signed_ctype elt) + | T_ptrto elt -> T_ptrto (signed_ctype elt) + | T_const elt -> T_const (signed_ctype elt) +@@ -275,8 +279,8 @@ + let mode = mode_of_elt elttype shape in + string_of_mode mode + with MixedMode (dst, src) -> +- let dstmode = mode_of_elt dst shape +- and srcmode = mode_of_elt src shape in ++ let dstmode = mode_of_elt ~argpos:0 dst shape ++ and srcmode = mode_of_elt ~argpos:1 src shape in + string_of_mode dstmode ^ string_of_mode srcmode + + let get_shuffle features = +@@ -291,19 +295,24 @@ + match List.find (fun feature -> + match feature with Requires_feature _ -> true + | Requires_arch _ -> true ++ | Requires_FP_bit _ -> true + | _ -> false) + features with +- Requires_feature feature -> ++ Requires_feature feature -> + Format.printf "#ifdef __ARM_FEATURE_%s@\n" feature + | Requires_arch arch -> + Format.printf "#if __ARM_ARCH >= %d@\n" arch ++ | Requires_FP_bit bit -> ++ Format.printf "#if ((__ARM_FP & 0x%X) != 0)@\n" ++ (1 lsl bit) + | _ -> assert false + with Not_found -> assert true + + let print_feature_test_end features = + let feature = +- List.exists (function Requires_feature x -> true +- | Requires_arch x -> true ++ List.exists (function Requires_feature _ -> true ++ | Requires_arch _ -> true ++ | Requires_FP_bit _ -> true + | _ -> false) features in + if feature then Format.printf "#endif@\n" + +@@ -356,79 +365,96 @@ + abase : "ARM" base name for the type (i.e. int in int8x8_t). + esize : element size. + enum : element count. ++ alevel: architecture level at which available. + *) + ++type fpulevel = CRYPTO | ALL ++ + let deftypes () = + let typeinfo = [ + (* Doubleword vector types. *) +- "__builtin_neon_qi", "int", 8, 8; +- "__builtin_neon_hi", "int", 16, 4; +- "__builtin_neon_si", "int", 32, 2; +- "__builtin_neon_di", "int", 64, 1; +- "__builtin_neon_sf", "float", 32, 2; +- "__builtin_neon_poly8", "poly", 8, 8; +- "__builtin_neon_poly16", "poly", 16, 4; +- "__builtin_neon_uqi", "uint", 8, 8; +- "__builtin_neon_uhi", "uint", 16, 4; +- "__builtin_neon_usi", "uint", 32, 2; +- "__builtin_neon_udi", "uint", 64, 1; ++ "__builtin_neon_qi", "int", 8, 8, ALL; ++ "__builtin_neon_hi", "int", 16, 4, ALL; ++ "__builtin_neon_si", "int", 32, 2, ALL; ++ "__builtin_neon_di", "int", 64, 1, ALL; ++ "__builtin_neon_hf", "float", 16, 4, ALL; ++ "__builtin_neon_sf", "float", 32, 2, ALL; ++ "__builtin_neon_poly8", "poly", 8, 8, ALL; ++ "__builtin_neon_poly16", "poly", 16, 4, ALL; ++ "__builtin_neon_poly64", "poly", 64, 1, CRYPTO; ++ "__builtin_neon_uqi", "uint", 8, 8, ALL; ++ "__builtin_neon_uhi", "uint", 16, 4, ALL; ++ "__builtin_neon_usi", "uint", 32, 2, ALL; ++ "__builtin_neon_udi", "uint", 64, 1, ALL; + + (* Quadword vector types. *) +- "__builtin_neon_qi", "int", 8, 16; +- "__builtin_neon_hi", "int", 16, 8; +- "__builtin_neon_si", "int", 32, 4; +- "__builtin_neon_di", "int", 64, 2; +- "__builtin_neon_sf", "float", 32, 4; +- "__builtin_neon_poly8", "poly", 8, 16; +- "__builtin_neon_poly16", "poly", 16, 8; +- "__builtin_neon_uqi", "uint", 8, 16; +- "__builtin_neon_uhi", "uint", 16, 8; +- "__builtin_neon_usi", "uint", 32, 4; +- "__builtin_neon_udi", "uint", 64, 2 ++ "__builtin_neon_qi", "int", 8, 16, ALL; ++ "__builtin_neon_hi", "int", 16, 8, ALL; ++ "__builtin_neon_si", "int", 32, 4, ALL; ++ "__builtin_neon_di", "int", 64, 2, ALL; ++ "__builtin_neon_sf", "float", 32, 4, ALL; ++ "__builtin_neon_poly8", "poly", 8, 16, ALL; ++ "__builtin_neon_poly16", "poly", 16, 8, ALL; ++ "__builtin_neon_poly64", "poly", 64, 2, CRYPTO; ++ "__builtin_neon_uqi", "uint", 8, 16, ALL; ++ "__builtin_neon_uhi", "uint", 16, 8, ALL; ++ "__builtin_neon_usi", "uint", 32, 4, ALL; ++ "__builtin_neon_udi", "uint", 64, 2, ALL + ] in + List.iter +- (fun (cbase, abase, esize, enum) -> ++ (fun (cbase, abase, esize, enum, fpulevel) -> + let attr = + match enum with + 1 -> "" + | _ -> Printf.sprintf "\t__attribute__ ((__vector_size__ (%d)))" + (esize * enum / 8) in +- Format.printf "typedef %s %s%dx%d_t%s;@\n" cbase abase esize enum attr) ++ if fpulevel == CRYPTO then ++ Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n"; ++ Format.printf "typedef %s %s%dx%d_t%s;@\n" cbase abase esize enum attr; ++ if fpulevel == CRYPTO then ++ Format.printf "#endif\n";) + typeinfo; + Format.print_newline (); + (* Extra types not in . *) + Format.printf "typedef float float32_t;\n"; + Format.printf "typedef __builtin_neon_poly8 poly8_t;\n"; +- Format.printf "typedef __builtin_neon_poly16 poly16_t;\n" ++ Format.printf "typedef __builtin_neon_poly16 poly16_t;\n"; ++ Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n"; ++ Format.printf "typedef __builtin_neon_poly64 poly64_t;\n"; ++ Format.printf "typedef __builtin_neon_poly128 poly128_t;\n"; ++ Format.printf "#endif\n" + +-(* Output structs containing arrays, for load & store instructions etc. *) ++(* Output structs containing arrays, for load & store instructions etc. ++ poly128_t is deliberately not included here because it has no array types ++ defined for it. *) + + let arrtypes () = + let typeinfo = [ +- "int", 8; "int", 16; +- "int", 32; "int", 64; +- "uint", 8; "uint", 16; +- "uint", 32; "uint", 64; +- "float", 32; "poly", 8; +- "poly", 16 ++ "int", 8, ALL; "int", 16, ALL; ++ "int", 32, ALL; "int", 64, ALL; ++ "uint", 8, ALL; "uint", 16, ALL; ++ "uint", 32, ALL; "uint", 64, ALL; ++ "float", 32, ALL; "poly", 8, ALL; ++ "poly", 16, ALL; "poly", 64, CRYPTO + ] in +- let writestruct elname elsize regsize arrsize = ++ let writestruct elname elsize regsize arrsize fpulevel = + let elnum = regsize / elsize in + let structname = + Printf.sprintf "%s%dx%dx%d_t" elname elsize elnum arrsize in + let sfmt = start_function () in +- Format.printf "typedef struct %s" structname; ++ Format.printf "%stypedef struct %s" ++ (if fpulevel == CRYPTO then "#ifdef __ARM_FEATURE_CRYPTO\n" else "") structname; + open_braceblock sfmt; + Format.printf "%s%dx%d_t val[%d];" elname elsize elnum arrsize; + close_braceblock sfmt; +- Format.printf " %s;" structname; ++ Format.printf " %s;%s" structname (if fpulevel == CRYPTO then "\n#endif\n" else ""); + end_function sfmt; + in + for n = 2 to 4 do + List.iter +- (fun (elname, elsize) -> +- writestruct elname elsize 64 n; +- writestruct elname elsize 128 n) ++ (fun (elname, elsize, alevel) -> ++ writestruct elname elsize 64 n alevel; ++ writestruct elname elsize 128 n alevel) + typeinfo + done + +@@ -484,6 +510,8 @@ + print_ops ops; + Format.print_newline (); + print_ops reinterp; ++ print_ops reinterpq; ++ Format.printf "%s" crypto_intrinsics; + print_lines [ + "#ifdef __cplusplus"; + "}"; +--- a/src/gcc/config/mips/linux-common.h ++++ b/src/gcc/config/mips/linux-common.h +@@ -44,7 +44,7 @@ + #undef LIB_SPEC + #define LIB_SPEC \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \ +- GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC) ++ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC) + + #undef STARTFILE_SPEC + #define STARTFILE_SPEC \ +--- a/src/gcc/tree-vect-slp.c ++++ b/src/gcc/tree-vect-slp.c +@@ -2192,7 +2192,7 @@ + } + + /* Cost model: check if the vectorization is worthwhile. */ +- if (flag_vect_cost_model ++ if (!unlimited_cost_model () + && !vect_bb_vectorization_profitable_p (bb_vinfo)) + { + if (dump_enabled_p ()) +--- a/src/gcc/params.def ++++ b/src/gcc/params.def +@@ -544,6 +544,11 @@ + "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alias check", + 10, 0, 0) + ++DEFPARAM(PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT, ++ "vect-max-peeling-for-alignment", ++ "Max number of loop peels to enhancement alignment of data references in a loop", ++ -1, -1, 64) ++ + DEFPARAM(PARAM_MAX_CSELIB_MEMORY_LOCATIONS, + "max-cselib-memory-locations", + "The maximum memory locations recorded by cselib", +--- a/src/libobjc/ChangeLog.linaro ++++ b/src/libobjc/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libgfortran/ChangeLog.linaro ++++ b/src/libgfortran/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libada/ChangeLog.linaro ++++ b/src/libada/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libffi/ChangeLog.linaro ++++ b/src/libffi/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libssp/ChangeLog.linaro ++++ b/src/libssp/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libcpp/configure ++++ b/src/libcpp/configure +@@ -7152,9 +7152,7 @@ + case $target in + aarch64*-*-* | \ + alpha*-*-* | \ +- arm*-*-*eabi* | \ +- arm*-*-rtems* | \ +- arm*-*-symbianelf* | \ ++ arm*-*-* | \ + x86_64-*-* | \ + ia64-*-* | \ + hppa*64*-*-* | \ +--- a/src/libcpp/configure.ac ++++ b/src/libcpp/configure.ac +@@ -184,9 +184,7 @@ + case $target in + aarch64*-*-* | \ + alpha*-*-* | \ +- arm*-*-*eabi* | \ +- arm*-*-rtems* | \ +- arm*-*-symbianelf* | \ ++ arm*-*-* | \ + x86_64-*-* | \ + ia64-*-* | \ + hppa*64*-*-* | \ +--- a/src/libcpp/ChangeLog.linaro ++++ b/src/libcpp/ChangeLog.linaro +@@ -0,0 +1,59 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-09-05 Yvan Roux ++ ++ Backport from trunk r201566. ++ 2013-08-07 Richard Earnshaw ++ ++ * configure.ac: Set need_64bit_hwint for all arm targets. ++ * configure: Regenerated. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/libcpp/po/ChangeLog.linaro ++++ b/src/libcpp/po/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. +--- a/src/fixincludes/ChangeLog.linaro ++++ b/src/fixincludes/ChangeLog.linaro +@@ -0,0 +1,51 @@ ++2014-03-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.03 released. ++ ++2014-02-11 Yvan Roux ++ ++ GCC Linaro 4.8-2014.02 released. ++ ++2014-01-17 Christophe Lyon ++ ++ GCC Linaro 4.8-2014.01 released. ++ ++2013-12-21 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.12 released. ++ ++2013-11-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.11 released. ++ ++2013-10-15 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.10 released. ++ ++2013-09-10 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.09 released. ++ ++2013-08-14 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.08 released. ++ ++2013-07-19 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.07-1 released. ++ ++2013-07-05 Christophe Lyon ++ ++ GCC Linaro 4.8-2013.07 released. ++ ++2013-06-11 Rob Savoye ++ ++ GCC Linaro gcc-linaro-4.8-2013.06 released. ++ ++2013-05-14 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.05 released. ++ ++2013-04-09 Matthew Gretton-Dann ++ ++ GCC Linaro 4.8-2013.04 released. --- gcc-4.8-4.8.2.orig/debian/patches/gcc-multiarch.diff +++ gcc-4.8-4.8.2/debian/patches/gcc-multiarch.diff @@ -0,0 +1,176 @@ +# DP: - Remaining multiarch patches, not yet submitted upstream. +# DP: - Add MULTIARCH_DIRNAME definitions for multilib configurations, +# DP: which are used for the non-multilib builds. + +2013-06-12 Matthias Klose + + * config/i386/t-linux64: Set MULTIARCH_DIRNAME. + * config/i386/t-kfreebsd: Set MULTIARCH_DIRNAME. + * config.gcc (i[34567]86-*-linux* | x86_64-*-linux*): Prepend + i386/t-linux to $tmake_file. + * config/mips/t-linux64: Set MULTIARCH_DIRNAME. + * config/rs6000/t-linux64: Set MULTIARCH_DIRNAME. + * config/s390/t-linux64: Set MULTIARCH_DIRNAME. + * config/sparc/t-linux64: Set MULTIARCH_DIRNAME. + +Index: b/src/libstdc++-v3/python/hook.in +=================================================================== +--- a/src/libstdc++-v3/python/hook.in ++++ b/src/libstdc++-v3/python/hook.in +@@ -47,14 +47,18 @@ + libdir = libdir[len (prefix):] + + # Compute the ".."s needed to get from libdir to the prefix. +- dotdots = ('..' + os.sep) * len (libdir.split (os.sep)) ++ backdirs = len (libdir.split (os.sep)) ++ if not os.path.basename(os.path.dirname(__file__)).startswith('lib'): ++ backdirs += 1 # multiarch subdir ++ dotdots = ('..' + os.sep) * backdirs + + objfile = gdb.current_objfile ().filename + dir_ = os.path.join (os.path.dirname (objfile), dotdots, pythondir) + +- if not dir_ in sys.path: ++ if not objfile.startswith('/usr/lib/debug/') and not dir_ in sys.path: + sys.path.insert(0, dir_) + + # Load the pretty-printers. +-from libstdcxx.v6.printers import register_libstdcxx_printers +-register_libstdcxx_printers (gdb.current_objfile ()) ++if gdb.current_objfile () is None or not gdb.current_objfile ().filename.startswith ('/usr/lib/debug/'): ++ from libstdcxx.v6.printers import register_libstdcxx_printers ++ register_libstdcxx_printers (gdb.current_objfile ()) +Index: b/src/gcc/config/sh/t-linux +=================================================================== +--- a/src/gcc/config/sh/t-linux ++++ b/src/gcc/config/sh/t-linux +@@ -1,2 +1,4 @@ + MULTILIB_DIRNAMES= + MULTILIB_MATCHES = ++ ++MULTILIB_OSDIRNAMES = sh4-linux-gnu:sh4-linux-gnu sh4_nofpu-linux-gnu:sh4-linux-gnu +Index: b/src/gcc/config/sparc/t-linux64 +=================================================================== +--- a/src/gcc/config/sparc/t-linux64 ++++ b/src/gcc/config/sparc/t-linux64 +@@ -27,3 +27,5 @@ + MULTILIB_DIRNAMES = 64 32 + MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:sparc64-linux-gnu) + MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:sparc-linux-gnu) ++ ++MULTIARCH_DIRNAME = $(call if_multiarch,sparc$(if $(findstring 64,$(target)),64)-linux-gnu) +Index: b/src/gcc/config/s390/t-linux64 +=================================================================== +--- a/src/gcc/config/s390/t-linux64 ++++ b/src/gcc/config/s390/t-linux64 +@@ -9,3 +9,5 @@ + MULTILIB_DIRNAMES = 64 32 + MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu) + MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu) ++ ++MULTIARCH_DIRNAME = $(call if_multiarch,s390$(if $(findstring s390x,$(target)),x)-linux-gnu) +Index: b/src/gcc/config/rs6000/t-linux +=================================================================== +--- a/src/gcc/config/rs6000/t-linux ++++ b/src/gcc/config/rs6000/t-linux +@@ -2,7 +2,7 @@ + # or soft-float. + ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float))) + ifneq (,$(findstring spe,$(target))) +-MULTIARCH_DIRNAME = powerpc-linux-gnuspe$(if $(findstring rs6000/e500-double.h, $(tm_file_list)),,v1) ++MULTIARCH_DIRNAME = powerpc-linux-gnuspe$(if $(findstring 8548,$(with_cpu)),,v1) + else + MULTIARCH_DIRNAME = powerpc-linux-gnu + endif +Index: b/src/gcc/config/rs6000/t-linux64 +=================================================================== +--- a/src/gcc/config/rs6000/t-linux64 ++++ b/src/gcc/config/rs6000/t-linux64 +@@ -30,3 +30,5 @@ + MULTILIB_EXTRA_OPTS := + MULTILIB_OSDIRNAMES := m64=../lib64$(call if_multiarch,:powerpc64-linux-gnu) + MULTILIB_OSDIRNAMES += m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu) ++ ++MULTIARCH_DIRNAME = $(call if_multiarch,powerpc$(if $(findstring 64,$(target)),64)-linux-gnu) +Index: b/src/gcc/config/i386/t-linux64 +=================================================================== +--- a/src/gcc/config/i386/t-linux64 ++++ b/src/gcc/config/i386/t-linux64 +@@ -36,3 +36,13 @@ + MULTILIB_OSDIRNAMES = m64=../lib64$(call if_multiarch,:x86_64-linux-gnu) + MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu) + MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32) ++ ++ifneq (,$(findstring x86_64,$(target))) ++ ifneq (,$(findstring biarchx32.h,$(tm_include_list))) ++ MULTIARCH_DIRNAME = $(call if_multiarch,x86_64-linux-gnux32) ++ else ++ MULTIARCH_DIRNAME = $(call if_multiarch,x86_64-linux-gnu) ++ endif ++else ++ MULTIARCH_DIRNAME = $(call if_multiarch,i386-linux-gnu) ++endif +Index: b/src/gcc/config/i386/t-kfreebsd +=================================================================== +--- a/src/gcc/config/i386/t-kfreebsd ++++ b/src/gcc/config/i386/t-kfreebsd +@@ -1,5 +1,9 @@ +-MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu) ++ifeq (,$(MULTIARCH_DIRNAME)) ++ MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu) ++endif + + # MULTILIB_OSDIRNAMES are set in t-linux64. + KFREEBSD_OS = $(filter kfreebsd%, $(word 3, $(subst -, ,$(target)))) + MULTILIB_OSDIRNAMES := $(filter-out mx32=%,$(subst linux,$(KFREEBSD_OS),$(MULTILIB_OSDIRNAMES))) ++ ++MULTIARCH_DIRNAME := $(subst linux,$(KFREEBSD_OS),$(MULTIARCH_DIRNAME)) +Index: b/src/gcc/config.gcc +=================================================================== +--- a/src/gcc/config.gcc ++++ b/src/gcc/config.gcc +@@ -1806,8 +1806,11 @@ + mips64*-*-linux* | mipsisa64*-*-linux*) + tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h" + tmake_file="${tmake_file} mips/t-linux64" +- tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_N32" ++ tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_64" + case ${target} in ++ *gnuabin32*) ++ tm_defines=$(echo ${tm_defines}| sed 's/MIPS_ABI_DEFAULT=ABI_64/MIPS_ABI_DEFAULT=ABI_N32/g') ++ ;; + mips64el-st-linux-gnu) + tm_file="${tm_file} mips/st.h" + tmake_file="${tmake_file} mips/t-st" +@@ -3746,7 +3749,7 @@ + i[34567]86-*-darwin* | x86_64-*-darwin*) + ;; + i[34567]86-*-linux* | x86_64-*-linux*) +- tmake_file="$tmake_file i386/t-linux" ++ tmake_file="i386/t-linux $tmake_file" + ;; + i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu) + tmake_file="$tmake_file i386/t-kfreebsd" +Index: b/src/gcc/java/jvspec.c +=================================================================== +--- a/src/gcc/java/jvspec.c ++++ b/src/gcc/java/jvspec.c +@@ -59,7 +59,7 @@ + "jvgenmain %{findirect-dispatch} %{D*} %b %m.i |\n\ + cc1 %m.i %1 \ + %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*}\ +- %{g*} %{O*} \ ++ %{g*} %{O*} %I \ + %{v:-version} %{pg:-p} %{p}\ + % + toolexecdir = $(glibgo_toolexecdir) + toolexeclibdir = $(glibgo_toolexeclibdir) +-toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(gcc_version)/$(target_alias) ++toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(short_version) + WARN_CFLAGS = $(WARN_FLAGS) $(WERROR) + + # -I/-D flags to pass when compiling. +Index: b/src/libgo/Makefile.am +=================================================================== +--- a/src/libgo/Makefile.am ++++ b/src/libgo/Makefile.am +@@ -15,7 +15,7 @@ + + SUBDIRS = ${subdirs} + +-gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++short_version := $(shell sed -r 's/([0-9]+\.[0-9]+)\..*/\1/' $(top_srcdir)/../gcc/BASE-VER) + + MAINT_CHARSET = latin1 + +@@ -25,7 +25,7 @@ + + toolexecdir = $(glibgo_toolexecdir) + toolexeclibdir = $(glibgo_toolexeclibdir) +-toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(gcc_version)/$(target_alias) ++toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(short_version) + + LIBFFI = @LIBFFI@ + LIBFFIINCS = @LIBFFIINCS@ --- gcc-4.8-4.8.2.orig/debian/patches/gcj-arm-mode.diff +++ gcc-4.8-4.8.2/debian/patches/gcj-arm-mode.diff @@ -0,0 +1,33 @@ +# DP: For armhf, force arm mode instead of thumb mode + +--- a/src/libjava/configure.host ++++ b/src/libjava/configure.host +@@ -66,6 +66,9 @@ + ;; + esac + ++# on armhf force arm mode ++libgcj_flags="${libgcj_flags} -marm" ++ + AM_RUNTESTFLAGS= + + # Set any host dependent compiler flags. +--- a/src/gcc/java/lang-specs.h ++++ b/src/gcc/java/lang-specs.h +@@ -47,7 +47,7 @@ + %{.class|.zip|.jar|!fsyntax-only:jc1 \ + %{.java|fsaw-java-file:%U.jar -fsource-filename=%i %x_flag_exceptions = 1; ++ opts->x_flag_exceptions = 0; + + // Avoid range issues for complex multiply and divide. + opts->x_flag_complex_method = 2; +--- a/src/gcc/d/d-spec.c ++++ b/src/gcc/d/d-spec.c +@@ -84,7 +84,7 @@ + + /* If nonzero, use the standard D runtime library when linking with + standard libraries. */ +- int phobos = 1; ++ int phobos = 0; + + /* The number of arguments being added to what's in argv, other than + libraries. We use this to track the number of times we've inserted --- gcc-4.8-4.8.2.orig/debian/patches/gdc-frontend-posix.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-frontend-posix.diff @@ -0,0 +1,13 @@ +# DP: Fix build of the D frontend on the Hurd and KFreeBSD. + +--- a/src/gcc/d/dfrontend/object.h ++++ b/src/gcc/d/dfrontend/object.h +@@ -10,7 +10,7 @@ + #ifndef OBJECT_H + #define OBJECT_H + +-#define POSIX (linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) ++#define POSIX (__linux__ || __GLIBC__ || __gnu_hurd__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) + + #if __DMC__ + #pragma once --- gcc-4.8-4.8.2.orig/debian/patches/gdc-libphobos-build.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-libphobos-build.diff @@ -0,0 +1,727 @@ +# DP: This implements building of libphobos library in GCC. + +Index: b/src/configure +=================================================================== +--- a/src/configure ++++ b/src/configure +@@ -2781,7 +2781,8 @@ + ${libgcj} \ + target-libobjc \ + target-libada \ +- target-libgo" ++ target-libgo \ ++ target-libphobos" + + # these tools are built using the target libraries, and are intended to + # run only in the target environment +Index: b/src/configure.ac +=================================================================== +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -164,6 +164,7 @@ + target-libssp \ + target-libquadmath \ + target-libgfortran \ ++ target-libphobos \ + target-boehm-gc \ + ${libgcj} \ + target-libobjc \ +Index: b/src/Makefile.def +=================================================================== +--- a/src/Makefile.def ++++ b/src/Makefile.def +@@ -131,6 +131,7 @@ + target_modules = { module= libgfortran; }; + target_modules = { module= libobjc; }; + target_modules = { module= libgo; }; ++target_modules = { module= libphobos; }; + target_modules = { module= libtermcap; no_check=true; + missing=mostlyclean; + missing=clean; +@@ -505,6 +506,8 @@ + dependencies = { module=all-target-libgo; on=all-target-libbacktrace; }; + dependencies = { module=all-target-libgo; on=all-target-libffi; }; + dependencies = { module=all-target-libgo; on=all-target-libatomic; }; ++dependencies = { module=configure-target-libphobos; on=configure-target-zlib; }; ++dependencies = { module=all-target-libphobos; on=all-target-zlib; }; + dependencies = { module=configure-target-libjava; on=configure-target-zlib; }; + dependencies = { module=configure-target-libjava; on=configure-target-boehm-gc; }; + dependencies = { module=configure-target-libjava; on=configure-target-libffi; }; +@@ -560,6 +563,8 @@ + languages = { language=obj-c++; gcc-check-target=check-obj-c++; }; + languages = { language=go; gcc-check-target=check-go; + lib-check-target=check-target-libgo; }; ++languages = { language=d; gcc-check-target=check-d; ++ lib-check-target=check-target-libphobos; }; + + // Toplevel bootstrap + bootstrap_stage = { id=1 ; }; +Index: b/src/Makefile.in +=================================================================== +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -933,6 +933,7 @@ + maybe-configure-target-libgfortran \ + maybe-configure-target-libobjc \ + maybe-configure-target-libgo \ ++ maybe-configure-target-libphobos \ + maybe-configure-target-libtermcap \ + maybe-configure-target-winsup \ + maybe-configure-target-libgloss \ +@@ -1086,6 +1087,7 @@ + all-target: maybe-all-target-libgfortran + all-target: maybe-all-target-libobjc + all-target: maybe-all-target-libgo ++all-target: maybe-all-target-libphobos + all-target: maybe-all-target-libtermcap + all-target: maybe-all-target-winsup + all-target: maybe-all-target-libgloss +@@ -1175,6 +1177,7 @@ + info-target: maybe-info-target-libgfortran + info-target: maybe-info-target-libobjc + info-target: maybe-info-target-libgo ++info-target: maybe-info-target-libphobos + info-target: maybe-info-target-libtermcap + info-target: maybe-info-target-winsup + info-target: maybe-info-target-libgloss +@@ -1257,6 +1260,7 @@ + dvi-target: maybe-dvi-target-libgfortran + dvi-target: maybe-dvi-target-libobjc + dvi-target: maybe-dvi-target-libgo ++dvi-target: maybe-dvi-target-libphobos + dvi-target: maybe-dvi-target-libtermcap + dvi-target: maybe-dvi-target-winsup + dvi-target: maybe-dvi-target-libgloss +@@ -1339,6 +1343,7 @@ + pdf-target: maybe-pdf-target-libgfortran + pdf-target: maybe-pdf-target-libobjc + pdf-target: maybe-pdf-target-libgo ++pdf-target: maybe-pdf-target-libphobos + pdf-target: maybe-pdf-target-libtermcap + pdf-target: maybe-pdf-target-winsup + pdf-target: maybe-pdf-target-libgloss +@@ -1421,6 +1426,7 @@ + html-target: maybe-html-target-libgfortran + html-target: maybe-html-target-libobjc + html-target: maybe-html-target-libgo ++html-target: maybe-html-target-libphobos + html-target: maybe-html-target-libtermcap + html-target: maybe-html-target-winsup + html-target: maybe-html-target-libgloss +@@ -1503,6 +1509,7 @@ + TAGS-target: maybe-TAGS-target-libgfortran + TAGS-target: maybe-TAGS-target-libobjc + TAGS-target: maybe-TAGS-target-libgo ++TAGS-target: maybe-TAGS-target-libphobos + TAGS-target: maybe-TAGS-target-libtermcap + TAGS-target: maybe-TAGS-target-winsup + TAGS-target: maybe-TAGS-target-libgloss +@@ -1585,6 +1592,7 @@ + install-info-target: maybe-install-info-target-libgfortran + install-info-target: maybe-install-info-target-libobjc + install-info-target: maybe-install-info-target-libgo ++install-info-target: maybe-install-info-target-libphobos + install-info-target: maybe-install-info-target-libtermcap + install-info-target: maybe-install-info-target-winsup + install-info-target: maybe-install-info-target-libgloss +@@ -1667,6 +1675,7 @@ + install-pdf-target: maybe-install-pdf-target-libgfortran + install-pdf-target: maybe-install-pdf-target-libobjc + install-pdf-target: maybe-install-pdf-target-libgo ++install-pdf-target: maybe-install-pdf-target-libphobos + install-pdf-target: maybe-install-pdf-target-libtermcap + install-pdf-target: maybe-install-pdf-target-winsup + install-pdf-target: maybe-install-pdf-target-libgloss +@@ -1749,6 +1758,7 @@ + install-html-target: maybe-install-html-target-libgfortran + install-html-target: maybe-install-html-target-libobjc + install-html-target: maybe-install-html-target-libgo ++install-html-target: maybe-install-html-target-libphobos + install-html-target: maybe-install-html-target-libtermcap + install-html-target: maybe-install-html-target-winsup + install-html-target: maybe-install-html-target-libgloss +@@ -1831,6 +1841,7 @@ + installcheck-target: maybe-installcheck-target-libgfortran + installcheck-target: maybe-installcheck-target-libobjc + installcheck-target: maybe-installcheck-target-libgo ++installcheck-target: maybe-installcheck-target-libphobos + installcheck-target: maybe-installcheck-target-libtermcap + installcheck-target: maybe-installcheck-target-winsup + installcheck-target: maybe-installcheck-target-libgloss +@@ -1913,6 +1924,7 @@ + mostlyclean-target: maybe-mostlyclean-target-libgfortran + mostlyclean-target: maybe-mostlyclean-target-libobjc + mostlyclean-target: maybe-mostlyclean-target-libgo ++mostlyclean-target: maybe-mostlyclean-target-libphobos + mostlyclean-target: maybe-mostlyclean-target-libtermcap + mostlyclean-target: maybe-mostlyclean-target-winsup + mostlyclean-target: maybe-mostlyclean-target-libgloss +@@ -1995,6 +2007,7 @@ + clean-target: maybe-clean-target-libgfortran + clean-target: maybe-clean-target-libobjc + clean-target: maybe-clean-target-libgo ++clean-target: maybe-clean-target-libphobos + clean-target: maybe-clean-target-libtermcap + clean-target: maybe-clean-target-winsup + clean-target: maybe-clean-target-libgloss +@@ -2077,6 +2090,7 @@ + distclean-target: maybe-distclean-target-libgfortran + distclean-target: maybe-distclean-target-libobjc + distclean-target: maybe-distclean-target-libgo ++distclean-target: maybe-distclean-target-libphobos + distclean-target: maybe-distclean-target-libtermcap + distclean-target: maybe-distclean-target-winsup + distclean-target: maybe-distclean-target-libgloss +@@ -2159,6 +2173,7 @@ + maintainer-clean-target: maybe-maintainer-clean-target-libgfortran + maintainer-clean-target: maybe-maintainer-clean-target-libobjc + maintainer-clean-target: maybe-maintainer-clean-target-libgo ++maintainer-clean-target: maybe-maintainer-clean-target-libphobos + maintainer-clean-target: maybe-maintainer-clean-target-libtermcap + maintainer-clean-target: maybe-maintainer-clean-target-winsup + maintainer-clean-target: maybe-maintainer-clean-target-libgloss +@@ -2296,6 +2311,7 @@ + maybe-check-target-libgfortran \ + maybe-check-target-libobjc \ + maybe-check-target-libgo \ ++ maybe-check-target-libphobos \ + maybe-check-target-libtermcap \ + maybe-check-target-winsup \ + maybe-check-target-libgloss \ +@@ -2451,6 +2467,7 @@ + maybe-install-target-libgfortran \ + maybe-install-target-libobjc \ + maybe-install-target-libgo \ ++ maybe-install-target-libphobos \ + maybe-install-target-libtermcap \ + maybe-install-target-winsup \ + maybe-install-target-libgloss \ +@@ -2553,6 +2570,7 @@ + maybe-install-strip-target-libgfortran \ + maybe-install-strip-target-libobjc \ + maybe-install-strip-target-libgo \ ++ maybe-install-strip-target-libphobos \ + maybe-install-strip-target-libtermcap \ + maybe-install-strip-target-winsup \ + maybe-install-strip-target-libgloss \ +@@ -37320,6 +37338,463 @@ + + + ++.PHONY: configure-target-libphobos maybe-configure-target-libphobos ++maybe-configure-target-libphobos: ++@if gcc-bootstrap ++configure-target-libphobos: stage_current ++@endif gcc-bootstrap ++@if target-libphobos ++maybe-configure-target-libphobos: configure-target-libphobos ++configure-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ echo "Checking multilib configuration for libphobos..."; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libphobos ; \ ++ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libphobos/multilib.tmp 2> /dev/null ; \ ++ if test -r $(TARGET_SUBDIR)/libphobos/multilib.out; then \ ++ if cmp -s $(TARGET_SUBDIR)/libphobos/multilib.tmp $(TARGET_SUBDIR)/libphobos/multilib.out; then \ ++ rm -f $(TARGET_SUBDIR)/libphobos/multilib.tmp; \ ++ else \ ++ rm -f $(TARGET_SUBDIR)/libphobos/Makefile; \ ++ mv $(TARGET_SUBDIR)/libphobos/multilib.tmp $(TARGET_SUBDIR)/libphobos/multilib.out; \ ++ fi; \ ++ else \ ++ mv $(TARGET_SUBDIR)/libphobos/multilib.tmp $(TARGET_SUBDIR)/libphobos/multilib.out; \ ++ fi; \ ++ test ! -f $(TARGET_SUBDIR)/libphobos/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libphobos ; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo Configuring in $(TARGET_SUBDIR)/libphobos; \ ++ cd "$(TARGET_SUBDIR)/libphobos" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(TARGET_SUBDIR)/libphobos/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libphobos"; \ ++ libsrcdir="$$s/libphobos"; \ ++ rm -f no-such-file || : ; \ ++ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ ++ $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif target-libphobos ++ ++ ++ ++ ++ ++.PHONY: all-target-libphobos maybe-all-target-libphobos ++maybe-all-target-libphobos: ++@if gcc-bootstrap ++all-target-libphobos: stage_current ++@endif gcc-bootstrap ++@if target-libphobos ++TARGET-target-libphobos=all ++maybe-all-target-libphobos: all-target-libphobos ++all-target-libphobos: configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) \ ++ $(TARGET-target-libphobos)) ++@endif target-libphobos ++ ++ ++ ++ ++ ++.PHONY: check-target-libphobos maybe-check-target-libphobos ++maybe-check-target-libphobos: ++@if target-libphobos ++maybe-check-target-libphobos: check-target-libphobos ++ ++check-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) check) ++ ++@endif target-libphobos ++ ++.PHONY: install-target-libphobos maybe-install-target-libphobos ++maybe-install-target-libphobos: ++@if target-libphobos ++maybe-install-target-libphobos: install-target-libphobos ++ ++install-target-libphobos: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ ++@endif target-libphobos ++ ++.PHONY: install-strip-target-libphobos maybe-install-strip-target-libphobos ++maybe-install-strip-target-libphobos: ++@if target-libphobos ++maybe-install-strip-target-libphobos: install-strip-target-libphobos ++ ++install-strip-target-libphobos: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install-strip) ++ ++@endif target-libphobos ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-target-libphobos info-target-libphobos ++maybe-info-target-libphobos: ++@if target-libphobos ++maybe-info-target-libphobos: info-target-libphobos ++ ++info-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing info in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ info) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-dvi-target-libphobos dvi-target-libphobos ++maybe-dvi-target-libphobos: ++@if target-libphobos ++maybe-dvi-target-libphobos: dvi-target-libphobos ++ ++dvi-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing dvi in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ dvi) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-pdf-target-libphobos pdf-target-libphobos ++maybe-pdf-target-libphobos: ++@if target-libphobos ++maybe-pdf-target-libphobos: pdf-target-libphobos ++ ++pdf-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing pdf in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-html-target-libphobos html-target-libphobos ++maybe-html-target-libphobos: ++@if target-libphobos ++maybe-html-target-libphobos: html-target-libphobos ++ ++html-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing html in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ html) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-TAGS-target-libphobos TAGS-target-libphobos ++maybe-TAGS-target-libphobos: ++@if target-libphobos ++maybe-TAGS-target-libphobos: TAGS-target-libphobos ++ ++TAGS-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing TAGS in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ TAGS) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-install-info-target-libphobos install-info-target-libphobos ++maybe-install-info-target-libphobos: ++@if target-libphobos ++maybe-install-info-target-libphobos: install-info-target-libphobos ++ ++install-info-target-libphobos: \ ++ configure-target-libphobos \ ++ info-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-info in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-info) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-install-pdf-target-libphobos install-pdf-target-libphobos ++maybe-install-pdf-target-libphobos: ++@if target-libphobos ++maybe-install-pdf-target-libphobos: install-pdf-target-libphobos ++ ++install-pdf-target-libphobos: \ ++ configure-target-libphobos \ ++ pdf-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-pdf in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-install-html-target-libphobos install-html-target-libphobos ++maybe-install-html-target-libphobos: ++@if target-libphobos ++maybe-install-html-target-libphobos: install-html-target-libphobos ++ ++install-html-target-libphobos: \ ++ configure-target-libphobos \ ++ html-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-html in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-installcheck-target-libphobos installcheck-target-libphobos ++maybe-installcheck-target-libphobos: ++@if target-libphobos ++maybe-installcheck-target-libphobos: installcheck-target-libphobos ++ ++installcheck-target-libphobos: \ ++ configure-target-libphobos ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing installcheck in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ installcheck) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-mostlyclean-target-libphobos mostlyclean-target-libphobos ++maybe-mostlyclean-target-libphobos: ++@if target-libphobos ++maybe-mostlyclean-target-libphobos: mostlyclean-target-libphobos ++ ++mostlyclean-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing mostlyclean in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-clean-target-libphobos clean-target-libphobos ++maybe-clean-target-libphobos: ++@if target-libphobos ++maybe-clean-target-libphobos: clean-target-libphobos ++ ++clean-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing clean in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-distclean-target-libphobos distclean-target-libphobos ++maybe-distclean-target-libphobos: ++@if target-libphobos ++maybe-distclean-target-libphobos: distclean-target-libphobos ++ ++distclean-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing distclean in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++.PHONY: maybe-maintainer-clean-target-libphobos maintainer-clean-target-libphobos ++maybe-maintainer-clean-target-libphobos: ++@if target-libphobos ++maybe-maintainer-clean-target-libphobos: maintainer-clean-target-libphobos ++ ++maintainer-clean-target-libphobos: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libphobos/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libphobos" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libphobos && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif target-libphobos ++ ++ ++ ++ ++ + .PHONY: configure-target-libtermcap maybe-configure-target-libtermcap + maybe-configure-target-libtermcap: + @if gcc-bootstrap +@@ -43344,6 +43819,14 @@ + (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-go); + check-go: check-gcc-go check-target-libgo + ++.PHONY: check-gcc-d check-d ++check-gcc-d: ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-d); ++check-d: check-gcc-d check-target-libphobos ++ + + # The gcc part of install-no-fixedincludes, which relies on an intimate + # knowledge of how a number of gcc internal targets (inter)operate. Delegate. +@@ -45397,6 +45880,7 @@ + configure-target-libgfortran: stage_last + configure-target-libobjc: stage_last + configure-target-libgo: stage_last ++configure-target-libphobos: stage_last + configure-target-libtermcap: stage_last + configure-target-winsup: stage_last + configure-target-libgloss: stage_last +@@ -45428,6 +45912,7 @@ + configure-target-libgfortran: maybe-all-gcc + configure-target-libobjc: maybe-all-gcc + configure-target-libgo: maybe-all-gcc ++configure-target-libphobos: maybe-all-gcc + configure-target-libtermcap: maybe-all-gcc + configure-target-winsup: maybe-all-gcc + configure-target-libgloss: maybe-all-gcc +@@ -46170,6 +46655,8 @@ + all-target-libgo: maybe-all-target-libbacktrace + all-target-libgo: maybe-all-target-libffi + all-target-libgo: maybe-all-target-libatomic ++configure-target-libphobos: maybe-configure-target-zlib ++all-target-libphobos: maybe-all-target-zlib + configure-target-libjava: maybe-configure-target-zlib + configure-target-libjava: maybe-configure-target-boehm-gc + configure-target-libjava: maybe-configure-target-libffi +@@ -46256,6 +46743,7 @@ + configure-target-libgfortran: maybe-all-target-libgcc + configure-target-libobjc: maybe-all-target-libgcc + configure-target-libgo: maybe-all-target-libgcc ++configure-target-libphobos: maybe-all-target-libgcc + configure-target-libtermcap: maybe-all-target-libgcc + configure-target-winsup: maybe-all-target-libgcc + configure-target-libgloss: maybe-all-target-libgcc +@@ -46291,6 +46779,8 @@ + + configure-target-libgo: maybe-all-target-newlib maybe-all-target-libgloss + ++configure-target-libphobos: maybe-all-target-newlib maybe-all-target-libgloss ++ + configure-target-libtermcap: maybe-all-target-newlib maybe-all-target-libgloss + + configure-target-winsup: maybe-all-target-newlib maybe-all-target-libgloss --- gcc-4.8-4.8.2.orig/debian/patches/gdc-multiarch.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-multiarch.diff @@ -0,0 +1,17 @@ +# DP: Set the D target include directory to a multiarch location. + +--- a/src/gcc/d/Make-lang.in ++++ b/src/gcc/d/Make-lang.in +@@ -61,7 +61,11 @@ + $(D_DMD_H) + + +-gcc_d_target_include_dir=$(gcc_d_include_dir)/$(target_noncanonical) ++ifneq (,$(MULTIARCH_DIRNAME)) ++ gcc_d_target_include_dir = /usr/include/$(MULTIARCH_DIRNAME)/d/$(version) ++else ++ gcc_d_target_include_dir=$(gcc_d_include_dir)/$(target_noncanonical) ++endif + + # Name of phobos library + D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos2\" --- gcc-4.8-4.8.2.orig/debian/patches/gdc-texinfo.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-texinfo.diff @@ -0,0 +1,53 @@ +# DP: Add macros for the gdc texinfo documentation. + +--- a/src/gcc/d/gdc.texi ++++ b/src/gcc/d/gdc.texi +@@ -43,6 +43,22 @@ + @insertcopying + @end ifinfo + ++@macro versionsubtitle ++@ifclear DEVELOPMENT ++@subtitle For @sc{gcc} version @value{version-GCC} ++@end ifclear ++@ifset DEVELOPMENT ++@subtitle For @sc{gcc} version @value{version-GCC} (pre-release) ++@end ifset ++@ifset VERSION_PACKAGE ++@sp 1 ++@subtitle @value{VERSION_PACKAGE} ++@end ifset ++@c Even if there are no authors, the second titlepage line should be ++@c forced to the bottom of the page. ++@vskip 0pt plus 1filll ++@end macro ++ + @titlepage + @title The GNU D Compiler + @versionsubtitle +@@ -138,6 +154,25 @@ + + @c man end + ++@macro gcctabopt{body} ++@code{\body\} ++@end macro ++@macro gccoptlist{body} ++@smallexample ++\body\ ++@end smallexample ++@end macro ++@c Makeinfo handles the above macro OK, TeX needs manual line breaks; ++@c they get lost at some point in handling the macro. But if @macro is ++@c used here rather than @alias, it produces double line breaks. ++@iftex ++@alias gol = * ++@end iftex ++@ifnottex ++@macro gol ++@end macro ++@end ifnottex ++ + @c man begin OPTIONS gdc + + @table @gcctabopt --- gcc-4.8-4.8.2.orig/debian/patches/gdc-updates.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-updates.diff @@ -0,0 +1,227397 @@ +# DP: gdc updates up to 20140401. + +--- a/src/gcc/d/ChangeLog 2013-06-02 11:37:56.000000000 +0100 ++++ b/src/gcc/d/ChangeLog 2014-04-01 16:32:51.000000000 +0100 +@@ -1,694 +1,280 @@ +-2013-06-01 Johannes Pfau ++2014-03-31 Iain Buclaw + +- * d-codegen.cc(maybe_set_builtin_frontend): Check parameter and +- return types of intrinsics. ++ * d-codegen.cc(error_mark_p): Removed function, replace uses with ++ error_operand_p. ++ (error_mark): Removed function, replace uses with error_mark_node. ++ * d-ctype.cc(Type::toCtype): Return d_unknown_type_node for frontend ++ error types. ++ * d-objfile.cc(VarDeclaration::toObjFile): Don't build CONST_DECLs for ++ non-scalar manifests. ++ ++2014-03-23 Iain Buclaw ++ ++ * d-decls.cc(Dsymbol::toImport): Prevent GC from collecting ++ IMPORTED_DECL nodes whilst front-end compilation in progress. ++ ++2014-03-19 Iain Buclaw ++ ++ * d-codegen.cc(AggLayout::visit): Rename to layout_aggregate_type. ++ (AggLayout::doFields, AggLayout::doInterfaces): Remove function and ++ move implementation into layout_aggregate_type. ++ (AggLayout::addField): Rename to insert_aggregate_field. ++ (AggLayout::finish): Rename to finish_aggregate_type. ++ * d-codegen.h(AggLayout): Update definition. ++ * d-ctype.cc(TypeStruct::toCtype): Update for glue changes. ++ (TypeFunction::toCtype): Fix ICE on generic function types. ++ (TypeClass::toCtype): Move generation of vptr and monitor fields into ++ layout_aggregate_type. Moved generation of TYPE_METHODS from ... ++ * d-objfile.cc(FuncDeclaration::toObjFile): ... here into ++ TypeClass::toCtype. Don't build up TYPE_METHODS on a per-function ++ basis, generate the entire vtable. ++ ++2014-03-18 Iain Buclaw ++ ++ * d-decls.cc(Dsymbol::toSymbolX): Set the symbol prettyIdent. ++ (Dsymbol::toImport): Emit packages as their fully qualified names. ++ (ClassDeclaration::toSymbol): Distinguish between the classinfo ++ assembler and decl name. ++ (InterfaceDeclaration::toSymbol): Likewise for interface symbol. ++ (Module::toSymbol): Likewise for moduleinfo symbol. ++ (ClassDeclaration::toVtblSymbol): Likewise for class vtable symbol. ++ (AggregateDeclaration::toInitializer) ++ (TypedefDeclaration::toInitializer, EnumDeclaration::toInitializer): ++ Likewise for default initialisers. ++ * d-objfile.cc(Module::genobjfile): Don't set-up moduleinfo symbol ++ storage twice. ++ ++2014-03-17 Iain Buclaw ++ ++ * d-codegen.cc(d_decl_context): Fix null pointer dereference. ++ * d-objfile.cc(FuncDeclaration::toObjFile): Don't override the setting ++ of DECL_CONTEXT on the declaration here. ++ (d_finish_symbol): Likewise. ++ * d-objfile.cc(VarDeclaration::toObjFile): Move the generation of ++ manifest constants to ... ++ * d-decls.cc(VarDeclaration::toSymbol): ... here, and emit them as ++ CONST_DECLs. Set the DECL_CONTEXT for all variable symbols. ++ ++ * d-builtins.cc(d_gcc_magic_builtins_module): Don't store compiler ++ generated builtins in Symbol::isym, use Symbol::csym instead. ++ (d_gcc_magic_libbuiltins_check): Likewise. ++ * d-codegen.cc(d_decl_context): Return the imported symbol tree of ++ modules where the NAMESPACE_DECL is now stored. ++ (d_build_module): Remove function. Move implementation to ... ++ * d-decls.cc(Dsymbol::toImport): ... here. Build an IMPORTED_DECL for ++ all imported declarations. ++ (FuncDeclaration::toSymbol): Remove special handling of Symbol::isym. ++ (Module::toSymbol): Remove call to d_build_module. ++ * d-objfile.cc(Dsymbol::toObjFile): Handle emission of IMPORTED_DECL ++ symbols to debug. ++ ++2014-03-16 Iain Buclaw ++ ++ * d-codegen.cc(build_attributes): Ensure D-specific attributes have ++ their value interpreted through CTFE. ++ ++2014-02-21 Iain Buclaw ++ ++ * d-codegen.cc(d_build_module): Update signature to accept a Loc ++ location to the module declaration. ++ * d-decls.cc(Module::toSymbol): Update call to d_build_module. ++ Set TREE_PUBLIC/DECL_EXTERNAL to distingush which modules are being ++ compiled. ++ * d-objfile.cc(Dsymbol::toObjFile): Handle Import symbols, and emit ++ debug information for imported modules. ++ (ImportStatement::toIR): Likewise. ++ (set_input_location): New function to implement the equivalent of ++ set_decl_location, but instead sets input_location. ++ ++2014-02-19 Johannes Pfau ++ ++ * d-objfile.cc(build_call_function): Call set_input_location ++ to set debug info correctly ++ ++2014-02-18 Iain Buclaw ++ ++ * d-objfile.cc(VarDeclaration::toObjFile): Remove toplevel check. ++ DECL_CONTEXT is never set on manifest constants. ++ (d_finish_compilation): Remove fancy check on force outputting ++ symbols to object file. ++ (build_type_decl): Don't emit the qualified identifier in debug ++ information. The fully qualified name is now determined through the ++ NAMESPACE_DECL context chain. ++ * d-ctype.cc(TypeEnum::toCtype): Likewise for enum members. ++ (VarDeclaration::toSymbol): Likewise for static variables. ++ (FuncDeclaration::toSymbol): Likewise for functions. ++ ++ * d-decls.cc(FuncDeclaration::toSymbol): Don't emit the 'D main' ++ symbol to debug as plain 'main'. ++ * d-objfile.cc(VarDeclaration::toObjFile): Don't emit the qualified ++ identifier of manifest constants in debug information. ++ ++2014-02-17 Iain Buclaw ++ ++ * d-codegen.cc(d_build_module): New function. ++ * d-decls.cc(Module::toSymbol): Use d_build_module to build up the ++ qualified module namespace. ++ ++ * d-codegen.cc(expand_intrinsic_op, expand_intrinsic_op2): New ++ functions to build a call to a builtin code. ++ (expand_intrinsic_bsr, expand_intrinsic_bt): New functions to expand a ++ BUILTIN_FRONTEND call to core.bitop intrinsics. ++ (expand_intrinsic_vaarg, expand_intrinsic_vastart): New functions to ++ expand a BUILTIN_FRONTEND call to core.vararg intrinsics. ++ (maybe_expand_builtin): Update. ++ ++2014-02-16 Iain Buclaw ++ ++ * d-decls.cc(Module::toSymbol): Build a NAMESPACE_DECL to populate the ++ DECL_CONTEXT of toplevel functions. ++ * d-codegen.cc(d_decl_context): Return the enclosing module ++ NAMESPACE_DECL as the decl context only when the symbol is extern(D) ++ and not D main. + +-2013-06-01 Iain Buclaw ++2014-02-15 Iain Buclaw + +- * d-codegen.cc(IRState::var): Handle variables used for NRVO. +- * d-ir.cc(ReturnStatement::toIR): Return result decl directly if NRVO. +- * d-objfile.cc(Symbol::SnamedResult): New member to hold the named +- RESULT_DECL of the function. +- (FuncDeclaration::toObjFile): Set-up function for NRVO. +- (build_tlssections): Align _tlsstart and _tlsend symbols to target +- address size. +- * d-ctype(TypeFunction::toSymbol): Mark functions returning non-POD +- structs as TREE_ADDRESSABLE to force return in memory. +- * d-decls.cc(FuncDeclaration::toSymbol): Propagate TREE_ADDRESSABLE +- from the original function type. +- +-2013-05-29 Iain Buclaw +- +- * d-target.cc: New source file to handle Target structure. +- +- * d-builtins.c(d_bi_init): Remove function. +- (d_gcc_type_align): Move to Target::alignsize. +- (d_gcc_field_align): Move to Target::fieldalign. +- (d_init_builtins): Build va_list type for D frontend. +- * d-lang.cc(d_init): Use isLP64 to determine LP64 targets. +- (d_add_builtin_version): Set is64bit if target is X86_64. +- * d-codegen.cc(convert_for_assignment): Use memset to implement front +- end code (struct = 0) here, rather than build an empty constructor. +- * d-elem.cc(AssignExp::toElem): Remove handling of (struct = 0) and +- call convert_for_assignment. +- +-2013-05-28 Iain Buclaw +- +- * d-gcc-complex_t.h: Rename to complex_t.h. +- * d-gcc-real.cc: Rename to d-longdouble.cc. +- * d-gcc-real.h: Rename to longdouble.h +- * d-port.cc: New source file to handle Port structure. +- * gdc_alloca.h: Remove source. +- +- * d-longdouble.cc(real_t): Rename to longdouble. +- (longdouble::getnan): Move to Port::nan. +- (longdouble::getsnan): Move to Port::snan. +- (longdouble::getinfinity): Move to Port::infinity. +- (longdouble::isInf): Move to Port::isInfinite. +- (longdouble::isNan): Move to Port::isNan. +- (longdouble::isSignallingNan): Move to Port::isSignallingNan. +- * d-builtins.c(gcc_d_backend_init): Rename to d_backend_init. +- (gcc_d_backend_term): Rename to d_backend_term. +- (gcc_type_to_d_type): Don't map 128bit integers to D front end. +- +- * d-elem.cc(AssignExp::toElem): Remove handling of fillHoles, use +- memset to implement (struct = 0). +- (StructLiteralExp::toElem): Handle fillHoles here, creating a +- temporary var that is zero init'd with memset and returned. +- +-2013-05-27 Iain Buclaw +- +- * d-codegen.cc(IRState::localVar): Rename to build_local_var. +- (IRState::exprVar): Rename to create_temporary_var. +- (IRState::maybeExprvar): Rename to maybe_temporary_var. +- (IRState::pointerIntSum): Rename to build_array_index. +- * d-lang.cc(d_handle_target_attribute): New function to handle D +- target attributes. +- +-2013-05-26 Iain Buclaw +- +- * d-incpath.cc(prefixed_path): Add cpp_GCC_INCLUDE_DIR back in as +- second method for relocation. +- * d-elem.cc(IndexExp::toElem): Fix call to _aaGetX as from +- IRState::toElemLvalue. +- * d-codegen.cc(IRState::toElemLvalue): Remove function. +- (IRState::convertForAssignment): Rename to convert_for_assignment. +- (IRState::convertForCondition): Rename to convert_for_condition. +- (IRState::checkedIndex): Rename to d_checked_index. +- (IRState::boundsCond): Rename to d_bounds_condition. +- (IRState::arrayBoundsCheck): Rename to array_bounds_check. +- (IRState::assertCall): Rename to d_assert_call. +- (IRState::doLineNote): Move to irstate.h. +- * d-irstate.cc(IRBase::getLocalContext): Remove function. +- * d-decls.cc(VarDeclaration::toSymbol): Build decl lang specific for +- decl to point back to D front end type. +- (FuncDeclaration::toSymbol): Likewise. +- +-2013-05-23 Iain Buclaw +- +- * d-codegen.cc(AggLayout::finish): Unset TYPE_SIZE before +- re-calculating. +- * d-ctype.cc(TypeStruct::toCtype): Don't call decl_attribute on the +- type twice. +- +-2013-05-21 Iain Buclaw +- +- * d-lang.cc(d_gcc_dump_source): Remove function. +- (d_post_options): Set flag_excess_precision_cmd as standard. +- * d-gcc-real.cc(real_t::convert): Remove function. +- (real_t::floatCompare): Remove function. +- (real_t::operator): Always perform floating point compilation at the +- precision of the target real mode. +- * d-todt.cc(dt_last): Remove function. +- (dtlist_to_tree): Rename to dtvector_to_tree. +- (dt_cons): Replace TREE_CHAIN implementation for use of CONSTRUCTOR. +- (dt_chainon): Likewise. +- (dt_container): Likewise. +- (dt_container2): Likewise. +- (StructInitializer::toDt): Likewise. +- (StructLiteralExp::toDt): Likewise. +- +-2013-05-17 Iain Buclaw +- +- * d-codegen.cc(IRState::convertTo): Replace with d_convert and +- convert_expr. +- (IRState::declContext): Replace with d_decl_context. +- (IRState::functionNeedsChain): Replace with needs_static_chain. +- (IRState::label): Replace with d_build_label. +- (IRState::emitTemplates): Move to ObjectFile. +- (functionDegenerateClosure): Replace with is_degenerate_closure. +- (get_object_method): Assert that function is a method. +- (IRState::startCond): Move to IRBase. +- (IRState::startElse): Likewise. +- (IRState::endCond): Likewise. +- (IRState::startLoop): Likewise. +- (IRState::continueHere): Likewise. +- (IRState::setContinueLabel): Likewise. +- (IRState::exitIfFalse): Likewise. +- (IRState::endLoop): Likewise. +- (IRState::startCase): Likewise. +- (IRState::doCase): Likewise. +- (IRState::endCase): Likewise. +- (IRState::continueLoop): Likewise. +- (IRState::exitLoop): Likewise. +- (IRState::startTry): Likewise. +- (IRState::startCatches): Likewise. +- (IRState::startCatch): Likewise. +- (IRState::endCatch): Likewise. +- (IRState::endCatches): Likewise. +- (IRState::startFinally): Likewise. +- (IRState::endFinally): Likewise. +- (IRState::doReturn): Likewise. +- (IRState::doJump): Likewise. +- (IRState::pushLabel): Likewise. +- (IRState::checkSwitchCase): Likewise. +- (IRState::checkGoto): Likewise. +- (IRState::checkPreviousGoto): Likewise. +- +- * d-elem.cc(CatAssignExp::toElem): Call postblit on appending array of +- structs if required. +- +-2013-05-16 Johannes Pfau ++ * d-decls.cc(VarDeclaration::toSymbol): Don't call ++ setup_symbol_storage until after SET_DECL_ASSEMBLER_NAME has been set. + +- * d-incpath.cc(prefixed_path): use cpp_PREFIX instead of +- cpp_GCC_INCLUDE_DIR for relocation. +- +-2013-05-16 Iain Buclaw +- +- * d-codegen.cc(IRState::convertForAssignment): Remove use of +- CtorEltMaker wrapper for vec. +- (d_array_value): Likewise. +- (build_delegate_cst): Likewise. +- (extract_from_method_call): Likewise. +- * d-elem.cc(NewExp::toElem): Likewise. +- (ArrayLiteralExp::toElem): Likewise. +- (AssocArrayLiteralExp::toElem): Likewise. +- (StructLiteralExp::toElem): Likewise. +- (NullExp::toElem): Likewise. +- (VectorExp::toElem): Likewise. +- * d-objfile.cc(build_moduleinfo): Likewise. +- * d-todt.cc(dt_container): Likewise. +- (dt_container2): Likewise. +- +- * d-asmstmt.cc(ExtAsmStatement::toIR): Remove use of ListMaker +- wrapper for tree chaining. +- * d-builtins.c(d_bi_builtin_func): Likewise. +- (d_bi_builtin_type): Likewise. +- (d_gcc_magic_builtins_module): Likewise. +- (d_gcc_magic_libbuiltins_module): Likewise. +- * d-codegen.cc(build_attributes): Likewise. +- (IRState::call): Likewise. +- (IRState::buildFrameForFunction): Likewise. +- (AggLayout::doFields): Likewise. +- (AggLayout::addField): Likewise. +- * d-ctype.cc(TypeEnum::toCtype): Likewise. +- (TypeFunction::toCtype): Likewise. +- * d-todt.cc(dt_container2): Likewise. +- +- * d-codegen.cc(IRState::getFrameInfo): Replace with get_frameinfo. +- (IRState::buildFrameForFunction): Replace with build_frame_type. +- (IRState::isClassNestedInFunction): Replace with d_nested_class. +- (IRState::isStructNestedInFunction): Replace with d_nested_struct. +- (IRState::getFrameForFunction): Fold into IRState::getFrameForSymbol. +- (IRState::getFrameForNestedClass): Likewise. +- (IRState::getFrameForNestedStruct): Likewise. +- +-2013-05-15 Iain Buclaw +- +- * d-codegen.cc(IRState::buildFrameForFunction): Also copy the +- parameters of functions with 'in' contracts to a local frame decl. +- * d-lang.cc(d_handle_flatten_attribute): New function to handle D +- flatten attributes. +- +-2013-05-14 Iain Buclaw +- +- * d-codegen.cc(IRState::chainLink): Remove function. +- (IRState::chainFunc): Remove function. +- (IRState::sthis): New member which holds the chain of function. +- (IRState::buildChain): Update to use new static chain decl. +- (IRState::getFrameInfo): Likewise. +- * d-objfile.cc(FuncDeclaration::buildClosure): Likewise. +- (FuncDeclaration::toObjFile): Default the function static chain decl +- to null unless vthis is given for the function. +- +-2013-05-13 Iain Buclaw +- +- * d-lang.cc(d_handle_noinline_attribute): New function to handle D +- noinline attributes. +- (d_handle_forceinline_attribute): New function to handle D forceinline +- attributes. +- * d-elem.cc(StructLiteralExp::toElem): Return the struct initialiser +- symbol directly if the tree has already been built. +- * d-decls.cc(Dsymbol::toSymbolX): Constify the mangling name to use. +- +-2013-05-10 Iain Buclaw +- +- * d-typinf.cc: New file containing type info routines originally in +- the D Front End. +- +- * d-todt.cc(dt_last): New helper function to retrieve last node in a +- dt_t tree list. +- (dt_cons): New helper function to append nodes to the end of a list. +- (dt_chainon): New helper function to concatenate two lists together. +- (dt_container): New helper function to build a ctor from a list. +- (build_vptr_monitor): New helper function to generate the class +- vtable, and put out __vptr and __monitor. +- symbol default values in a class declaration. +- (dtlist_to_tree): New helper function to convert a dt_t list into a +- constructor tree. +- (Type::toDt): Implement routines for new dt_t format. +- (TypeInfoDeclaration::toDt): Likewise. +- (Initializer::toDt): Likewise. +- (Expression::toDt): Likewise. +- (Declaration::toDt): Likewise. +- +- * d-objfile.cc(Dsymbol::toObjFile): Update for new dt_t format. +- (Module::genmoduleinfo): Likewise. +- (Symbol::Symbol): Moved from symbol.cc +- (Obj::objmod): Remove abstraction layer. +- (Obj::moduleinfo): Renamed to build_moduleinfo. +- (obj_tlssections): Renamed to build_tlssections. +- (outdata): Renamed to d_finish_symbol. +- (check_static_sym): Moved into d_finish_symbol. +- +- * d-codegen.cc(d_gcc_emit_local_variable): Remove. +- +- * d-decls.cc(Dsymbol::toSymbolX): Update to not call symbol_calloc. +- (FuncDeclaration::toThunkSymbol): Likewise. +- (ClassDeclaration::toSymbol): Build type as d_unknown_type_node. +- (InterfaceDeclaration::toSymbol): Likewise. +- (Module::toSymbol): Likewise. +- (ClassDeclaration::toVtblSymbol): Update call to toSymbolX. +- (AggregateDeclaration::toInitializer): Likewise. +- (TypedefDeclaration::toInitializer): Likewise. +- (EnumDeclaration::toInitializer): Likewise. +- +- * d-ir.cc(CaseStatement::toIR): Don't call static_sym. +- +- * d-lang.cc(rtlsym): Remove symbol. +- (D_DECL_READONLY_STATIC): Remove macro. +- (d_unknown_type_node): New LANG_TYPE node for marking TypeInfo_Class, +- Interface, and ModuleInfo types that are of a variable size determined +- at compile time. +- +- * d-elem.cc(StringExp::toElem): Clean up for new dt_t format. +- +- * symbol.cc: Remove file. +- +-2013-05-08 Iain Buclaw +- +- * d-codegen.cc(IRState::getFrameInfo): Don't create a frame/closure +- for member functions, only required for nested. +- * d-elem.cc(Expression::toElemDtor): Call dtors in the correct order. +- (DeclarationExp::toElem): Don't call dtor on static, manifest, or +- extern symbols upon declaration. +- (AssignExp::toElem): Only call postblit on lvalues in assignment. +- (ArrayLiteralExp::toElem): Always generate literals on heap. +- +-2013-05-06 Iain Buclaw +- +- * d-elem.cc(StructLiteralExp::toElem): Return the default initialiser +- symbol if one exists. +- * d-builtins.c(d_gcc_magic_libbuiltins_check): Override the function +- type with the correct built-in function type as defined in backend. +- +-2013-04-15 Iain Buclaw +- +- * d-elem.cc(IdentityExp::toElem): Remove special handling of class, +- reference and array types. +- +-2013-04-12 Iain Buclaw +- +- * d-codegen.cc(maybe_make_temp): Save call expressions so aren't +- evaluated more than once. +- (d_has_side_effects): Remove check for exceptional class types. +- +-2013-04-10 Iain Buclaw +- +- * d-decls.cc(FuncDeclaration::toSymbol): Harden logic for marking +- functions pure as in 'has no side effects'. +- +-2013-04-07 Iain Buclaw +- +- * d-decls.cc(FuncDeclaration::toSymbol): Push deferred functions to +- FuncDeclaration::deferred. +- * d-elem.cc(DelegateExp::toElem): Likewise. +- (FuncExp::toElem): Likewise. +- * d-objfile.cc(ObjectFile::shouldEmit): Likewise. +- (FuncDeclaration::toObjFile): Process all deferred functions in +- FuncDeclaration::deferred. +- * symbol.cc(Symbol::deferredNestedFuncs): Remove. +- +-2013-04-05 Iain Buclaw +- +- * d-elem.cc(FuncExp::toElem): Defer function literals and lambdas +- until parent function has finished processing. +- +-2013-04-04 Iain Buclaw +- +- * d-codegen.cc(IRState::buildChain): Use __frame decl directly when +- setting up the function frame. +- (maybe_set_builtin_frontend): Exit early if symbol has no parent. +- * d-decls.cc(FuncDeclaration::toSymbol): Defer all nested functions, +- not just templated instances. +- * d-objfile.cc(FuncDeclaration::toObjFile): Delay processed deferred +- nested functions until function has finished being generated. +- (ObjectFile::shouldEmit): Don't emit nested functions if the parent +- function hasn't finished processing. +- +-2013-04-03 Iain Buclaw +- +- * d-codegen.cc(maybe_set_builtin_frontend): Merged from +- maybe_set_builtin and maybe_set_libcall. +- * d-decls.cc(FuncDeclaration::toSymbol): Use +- maybe_set_builtin_frontend. +- +-2013-03-31 Iain Buclaw +- +- * d-lang.cc(d_init_options): Default module info emission to on. +- (d_handle_option): New femit-moduleinfo switch. +- * d-objfile.cc(Module::genobjfile): Don't emit module if disabled +- explicitly. +- * d-builtins(is_intrinsic_module_p): New function to test whether +- module is core.bitops. +- (is_math_module_p): New function to test whether module is std.math or +- core.stdc.math. +- (is_builtin_va_arg_p): New function to test whether symbol is +- specially handled va_arg template. +- (is_builtin_va_start_p): New function to test whether symbol is +- specially handled va_start template. +- * d-codegen.cc(IRState::binding): Replace with bind_expr. +- (IRState::mathModule): Replace with std_math_module. +- (IRState::mathCoreModule): Replace with core_math_module. +- (IRState::intrinsicModule): Replace with std_intrinsic_module. +- (IRState::cstdargTemplateDecl): Replace with va_arg_template. +- (IRState::stdargTemplateDecl): Replace with va_arg2_template. +- (IRState::cstdargStartTemplateDecl): Replace with va_start_template. +- (IRState::getLibCallDecl): Replace with get_libcall. +- (IRState::maybeSetLibCallDecl): Replace with maybe_set_libcall. +- (IRState::libCall): Replace with build_libcall. +- (IRState::maybeSetUpBuiltin): Replace with maybe_set_builtin. +- (IRState::Intrinsic): Move enum out of IRState. +- +-2013-03-30 Iain Buclaw +- +- * d-codegen.cc(IRState::darrayPtrRef): Replace with d_array_ptr. +- (IRState::darrayLenRef): Replace with d_array_length. +- (IRState::darrayVal): Replace with d_array_value. +- (IRState::darrayString): Replace with d_array_string. +- (IRState::arrayLength): Replace with get_array_length. +- (get_object_method): Remove dependancy on irs parameter. +- * d-lang.cc(d_init): Use static bool std_inc to determine whether to +- include standard module paths. +- (d_post_options): Canonicalize the input filename. +- (d_parse_file): Correctly catch cases where input file is stdin. +- +-2013-03-27 Iain Buclaw +- +- * d-codegen.cc(IRState::getFrameInfo) Create a custom static chain for +- all nested functions. +- * d-gcc-includes.h: Rename to d-system.h +- +-2013-03-23 Iain Buclaw +- +- * d-builtins.c(d_bi_init): Set REALPAD to be TYPE_PRECISION of +- long_double_type_node. +- * d-codegen.cc(IRState::twoFieldType): Replace with +- build_two_field_type. +- (IRState::arrayOpNotImplemented): Replace with unhandled_arrayop_p. +- (IRState::delegateMethodRef): Replace with delegate_method. +- (IRState::delegateObjectRef): Replace with delegate_object. +- (IRState::delegateVal): Replace with build_delegate_cst. +- (IRState::methodCallExpr): Replace with build_method_call. +- (IRState::extractMethodCallExpr): Replace with +- extract_from_method_call. +- (IRState::objectInstanceMethod): Replace with get_object_method. +- (IRState::twoFieldCtor): Remove. +- (IRState::call): Assert that if calling a normal FUNCTION_TYPE, +- 'object' is not set. +- * d-ctype.cc(TypeDelegate::toCtype): Build a METHOD_TYPE for the .func +- field type in delegates. +- * d-lang.h(D_IS_METHOD_CALL_EXPR): Rename to D_METHOD_CALL_EXPR. +- * d-objfile.cc(FuncDeclaration::toObjFile): Remove assert for chain +- function. +- +-2013-03-20 Johannes Pfau +- +- * d-codegen.cc(IRState::objectInstanceMethod): Recursively check +- for TOKsuper / TOKdottype. Do not ignore CastExp. +- * d-elem.cc(IdentityExp::toElem): Ignore padding in bitwise floating +- point comparisons. +- * testsuite: Cleanup. Remove invalid tests, adjust tests, etc. +- +-2013-03-20 Iain Buclaw +- +- * d-codegen.cc(IRState::objectInstanceMethod): Get function pointer +- off function TREE_TYPE. +- (build_deref): Handle cases where expression to dereference is an +- address expression. +- (modify_expr): New function overload to set return type directly. +- * d-elem.cc(CatAssignExp::toElem): Use new modify_expr. +- (AssignExp::toElem): Likewise. +- * d-decls.cc(FuncDeclaration::toSymbol): Don't build a method type for +- nested functions / delegates. Just add on the hidden 'this' pointer +- containing the custom static chain/closure object. +- +- * d-codegen.cc(GlobalValues): Replace with current_module, +- current_irs, object_file. +- (IRState::getFuncType): Replace with get_function_type. +- (IRState::isCallByAlias): Replace with call_by_alias_p. +- (IRState::isFuncType): Replace with function_type_p. +- (IRState::doExp): Remove. +- +- * d-asmstmt.cc(ExtAsmStatement::syntaxCopy): Use arraySyntaxCopy to +- copy front end expressions. +- +- * d-codegen.cc(AssignExp::toElem): Call _d_arrayassign / _d_arrayctor +- when assigning arrays of structs. +- +-2013-03-18 Iain Buclaw +- +- * d-codegen.cc(IRState::realPart): Replace with real_part. +- (IRState::imagPart): Replace with imaginary_part. +- (IRState::integerConstant): Replace with build_integer_cst. +- (IRState::floatConstant): Replace with build_float_cst. +- (IRState::hwi2toli): Replace with cst_to_hwi. +- (IRState::addressOf): Replace with build_address. +- (IRState::markAddressable): Replace with d_mark_addressable. +- (IRState::markUsed): Replace with d_mark_used. +- (IRState::markRead): Replace with d_mark_read. +- (IRState::indirect): Replace with indirect_ref. +- (IRState::pvoidOkay): Replace with void_okay_p. +- (IRState::maybeCompound): Replace with maybe_compound_expr. +- (IRState::maybeVoidCompound): Replace with maybe_vcompound_expr. +- (IRState::isErrorMark): Replace with error_mark_p. +- (IRState::getTargetSizeConst): Replace with tree_to_hwi. +- (IRState::modify): Replace with modify_expr. +- (IRState::vmodify): Replace with vmodify_expr. +- (IRState::vinit): Replace with build_vinit. +- (IRState::nop): Replace with build_nop. +- (IRState::vconvert): Replace with build_vconvert. +- (IRState::boolOp): Replace with build_boolop. +- (IRState::compound): Replace with compound_expr. +- (IRState::voidCompound): Replace with vcompound_expr. +- (IRState::component): Replace with component_ref. +- (IRState::errorMark): Replace with error_mark. +- (IRState::typesSame): Replace with d_types_same. +- (IRState::typesCompatible): Replace with d_types_compatible. +- (IRState::getDType): Replace with build_dtype. +- (IRState::getObjectType): Replace with build_object_type. +- (IRState::isDeclarationReferenceType): Replace with decl_reference_p. +- (IRState::trueDeclarationType): Replace with declaration_type. +- (IRState::isArgumentReferenceType): Replace with arg_reference_p. +- (IRState::trueArgumentType): Replace with type_passed_as. +- (IRState::arrayType): Replace with d_array_type. +- (IRState::addTypeAttribute): Replace with insert_type_attributes. +- (IRState::addDeclAttribute): Replace with insert_decl_attributes. +- (IRState::attributes): Replace with build_attributes. +- (IRState::addTypeModifiers): Replace with insert_type_modifiers. +- (IRState::maybeMakeTemp): Replace with maybe_make_temp. +- (IRState::isFreeOfSideEffects): Replace with d_has_side_effects. +- (IRState::pointerOffsetOp): Replace with build_offset_op. +- (IRState::pointerOffset): Replace with build_offset. +- (IRState::buildCall): Replace with d_build_call. +- (IRState::exceptionObject): Replace with build_exception_object. +- +-2013-03-17 Iain Buclaw +- +- * d-asmstmt.cc(d_build_asm_stmt): Remove. +- (ExtAsmStatement::ExtAsmStatement): Update to match renamed members. +- (ExtAsmStatement::syntaxCopy): Likewise. +- (ExtAsmStatement::semantic): Likewise. +- (ExtAsmStatement::toCBuffer): Likewise. +- (ExtAsmStatement::comeFrom): New. +- (ExtAsmStatement::blockExit): Don't error if must not throw. +- (naturalString): Remove. +- (ExtAsmStatement::toIR): Inline IRState::doAsm implementation. +- * d-codegen.cc(IRState::doAsm): Remove. +- * d-decls.cc(FuncDeclaration::toSymbol): Don't generate 'naked' +- attribute. +- (binfo_for): Move into d-decls.cc. +- (intfc_binfo_for): Likewise. +- (ClassDeclaration::toDebug): Likewise. +- (EnumDeclaration::toDebug): Likewise. +- (TypedefDeclaration::toDebug): Likewise. +- (StructDeclaration::toDebug): Likewise. +- * d-objfile.cc(FuncDeclaration::toObjFile): Move into d-objfile.cc. +- (FuncDeclaration::buildClosure): Likewise. +- (Module::genobjfile): Likewise. +- * d-glue.cc: Remove file. +- +-2013-03-16 Iain Buclaw +- +- * d-ir.cc(SynchronizedStatement::toIR): Remove implementation as is +- now handled by the frontend. +- +-2013-03-15 Iain Buclaw +- +- * d-codegen.cc(IRState::maybeExpandSpecialCall): Handle ref argptr +- arguments. +- +-2013-03-13 Iain Buclaw +- +- * d-builtins.c(handle_alias_attribute): New function to handle +- internal 'alias' attribute. +- (handle_weakref_attribute): New function to handle internal 'weakref' +- attribute. +- * d-objfile.cc(ObjectFile::outputThunk): Define thunks to external +- symbols as weakref, alias +- +-2013-03-12 Johannes Pfau +- +- * patch-versym-os-4.8.x(mingw32.h): Fix typo +- * patch-versym-cpu-4.8.x(mips.h): Fix typo +- Update version symbols to latest dlang specification. +- +-2013-03-10 Iain Buclaw +- +- * d-decls.cc(FuncDeclaration::toSymbol): Delay setting TREE_TYPE as +- function type could be hidden in a nested function not yet built. +- * d-codegen.cc(IRState::findThis): Don't get 'this' from outer +- function if it's a closure type. This has already been handled by +- IRState::getFrameForSymbol. +- (IRState::buildChain): Give frame decl debug name '__frame'. +- Always set '__chain' link field. +- (IRState::getFrameInfo): Don't build a frame for all nested functions. +- Search through nested aggregates for static chain in outer functions. +- * d-codegen.h(IRState::useParentChain): Remove. +- * d-glue.cc(FuncDeclaration::toObjFile): Don't call useParentChain. +- Don't create a local var for the chain link for a function. +- (FuncDeclaration::buildClosure): Always set '__chain' link field. +- +-2013-03-08 Iain Buclaw +- +- * d-codegen.cc(d_gcc_force_templates): Only check for emitting +- templates as private. +- * d-lang.cc(d_handle_option): Remove -femit-templates= option. +- * d-objfile.cc(ObjectFile::makeDeclOneOnly): Fix code logic so +- fallback method could be reached. +- * d-objfile.h(TEall, TEauto): Remove. +- +-2013-03-07 Iain Buclaw +- +- * d-ir.cc(ReturnStatement::toIR): Don't call postblit on return. +- * d-codegen.cc(IRState::trueDeclarationType): Don't set +- D_TYPE_ADDRESSABLE. +- (IRState::makeTemp): Remove. +- (IRState::maybeMakeTemp): Copy makeTemp into function. +- * d-glue.cc(d_genericize): Remove D_TYPE_ADDRESSABLE handling. +- * d-lang.h(D_TYPE_ADDRESSABLE): Remove macro. +- +-2013-03-04 Johannes Pfau +- +- * d-ctype.cc(Type::toCtype): Always call gen.addTypeModifiers to +- make sure TYPE_MAIN_VARIANT is set. Reuse tree from unqualified +- variant for that. Also cache the resulting qualified tree. +- (TypeTypedef::toCtype): Likewise. +- (TypeEnum::toCtype): Likewise. +- (TypeStruct::toCtype): Likewise. +- (TypeFunction::toCtype): Likewise. +- (TypeVector::toCtype): Likewise. +- (TypeSArray::toCtype): Likewise. +- (TypeDArray::toCtype): Likewise. +- (TypeAArray::toCtype): Likewise. +- (TypeDelegate::toCtype): Likewise. +- (TypeClass::toCtype): Likewise. +- * d-objfile.cc(ObjectFile::giveDeclUniqueName): Make sure DECL_NAME is set +- +-2013-03-01 Iain Buclaw +- +- * d-decls.cc(VarDeclaration::toSymbol): Remove use of c_ident. ++ * d-decls.cc(VarDeclaration::toSymbol): Give prettyIdent precedence ++ for the DECL_NAME over the simple identifier. + (FuncDeclaration::toSymbol): Likewise. +- * d-builtins.c(handle_noreturn_attribute): Assert that this is only +- used for internal purposes. +- (handle_const_attribute): Likewise. +- (handle_malloc_attribute): Likewise. +- (handle_pure_attribute): Likewise. +- (handle_nonnull_attribute): Likewise. +- (handle_nothrow_attribute): Likewise. +- (handle_sentinel_attribute): Likewise. +- (handle_transaction_pure_attribute): Likewise. +- (handle_returns_twice_attribute): Likewise. +- * d-glue.cc(FuncDeclaration::toObjFile): Result variables have no +- default initialiser. +- * d-codegen.cc(IRState::emitLocalVar): Add in assert that the local +- variable has no initialiser if called with no_init = true. +- (IRState::getLibCallDecl): Mark exceptional library functions as +- noreturn. +- (IRState::attributes): Gracefully handle @attribute, and +- @attribute(null). +- +-2013-02-28 Jernej Krempus +- +- * d-builtins.c(d_attribute_table): Renamed it to +- d_builtins_attribute_table. +- * d-lang.cc(d_attribute_table): Added an empty table +- * d-lang.cc(LANG_HOOKS_COMMON_ATTRIBUTE_TABLE): Defined it as +- d_builtins_attribute_table. +- * d-lang.h(d_builtins_attribute_table): Added a declaration. +- * d-codegen.cc(IRState::attributes): Changed it so it goes through +- in_attrs and looks for any @gcc.attribute.attribute("attr_name"). +- * d-objfile.cc(ObjectFile::setupSymbolStorage): Pass userAttributes +- instead of attributes in all calls to IRState::attributes. +- * d-ctype.cc(TypeTypedef::toCtype): Likewise. +- (TypeEnum::toCtype): Likewise. +- (TypeStruct::toCtype): Likewise. +- (TypeClass::toCtype): Likewise. +- * libphobos/libdruntime/gcc/attribute.d: New file. +- +-2013-02-28 Iain Buclaw ++ * d-objfile.cc(d_finish_symbol): Remove setting DECL_NAME as ++ prettyIdent, this has already been done in Declaration::toSymbol. ++ (d_finish_function): Likewise. + +- * d-lang.cc(d_handle_option): Remove OPT_fdeprecated and +- OPT_Wsign_compare, add handling for OPT_Wdeprecated. +- (d_post_options): Handle Wdeprecated and Werror switch combination. +- +-2013-02-27 Iain Buclaw +- +- * d-codegen.cc(ArrayScope::ArrayScope): Don't setup length var if its +- value is known at compile time. +- (ArrayScope::setArrayExp): Likewise. +- * d-decls.cc(uniqueName): Remove function. +- (VarDeclaration::toSymbol): Set decl assembler name directly. ++ * d-decls.cc(VarDeclaration::toSymbol): Call set_user_assembler_name ++ if pragma(mangle) was seen. + (FuncDeclaration::toSymbol): Likewise. + +-2013-02-15 Iain Buclaw ++2014-02-12 Johannes Pfau + +- * Make-lang.in(GDC_EXTENDED_ASM_SYNTAX): Remove macro. ++ * d-decls.cc(FuncDeclaration::toSymbol): Do not set TREE_NOTHROW on ++ nothrow functions. ++ * d-decls.cc(TypeInfoDeclaration::toSymbol): Call relayout_decl after ++ changing the type. + +-2013-02-14 Iain Buclaw ++2014-02-03 Iain Buclaw + +- * d-lang.h(D_DECL_IS_CONTRACT): Remove macro. +- * d-decls.cc(FuncDeclaration::toSymbol): Likewise. + +-2013-02-13 Iain Buclaw ++ * d-codegen.cc(d_build_call): Remove special handling of ++ flag_split_darrays switch. ++ (maybe_expand_builtin): Likewise. ++ * d-elem.cc(CatExp::toElem): Likewise. ++ * lang.opt(fsplit-dynamic-arrays): Remove. + +- * d-lang.cc(d_gcc_is_target_win32): Remove. +- (d_add_builtin_version): New function to handle define_builtin +- callback from backend. +- * d-codegen.cc(IRState::maybeExpandSpecialCall): Remove intrinsic bt. ++2014-02-02 Iain Buclaw + +- * d-builtins.c: Merge with d-builtins2.cc. +- * d-builtins2.cc: Remove. ++ * d-glue.cc(readFile, writeFile, ensurePathToNameExists): Define. ++ * d-incpath.cc(add_import_path): Update for frontend changes. ++ (add_fileimp_path): Likewise. ++ * d-lang.cc(deps_write): Likewise. ++ (d_parse_file): Likewise. ++ * d-todt.cc(Dts): Update define for frontend changes. ++ * d-decls.cc(ClassDeclaration::toVtblSymbol): Don't mark __vtbl ++ symbols as virtual. They are global static symbols. + +-2013-02-07 Johannes Pfau ++2014-01-12 Iain Buclaw + +- * d-lang.cc(d_init): Use gcc's config system for predefined OS versions. +- * setup-gcc.sh: Likewise. +- * target-ver-syms.sh: Likewise. ++ * d-decls.cc(EnumDeclaration::toDebug): Build TYPE_DECL only for ++ enumeral types. + +-2013-02-05 Iain Buclaw ++2014-01-06 Iain Buclaw + +- * d-builtins2.cc(gcc_type_to_d_type): Remove STRUCTTHISREF condition. +- * d-decls.cc(FuncDeclaration::toSymbol): Likewise. +- * d-elem.cc(ThisExp::toElem): Likewise. +- * d-ctype.cc(TypeSArray::toCtype): Remove SARRAYVALUE condition. +- * d-codegen.cc(IRState::isDeclarationReferenceType): Likewise. +- (IRState::isArgumentReferenceType): Likewise. ++ * d-ctype.cc(TypeClass::toCtype): Don't add __monitor field for ++ extern(C++) classes. + +-2013-02-01 Johannes Pfau ++ * d-builtins.c(d_gcc_magic_module): Remove tdata. ++ * d-codegen.cc(build_interface_binfo): Likewise. ++ * d-ctype.cc(TypeEnum::toCtype): Likewise. ++ (TypeClass::toCtype): Likewise. ++ * d-lang.cc(deps_write): Likewise. ++ ++2014-01-05 Iain Buclaw + +- * d-lang.cc(d_init): Use gcc's config system for predefined CPU versions. +- (d_init): Fix definition of D_LP64 version. +- * setup-gcc.sh: Likewise. +- * target-ver-syms.sh: Likewise. ++ * d-ctype.cc(TypeEnum::toCtype): Don't push CONST_DECLs into current ++ function. ++ * d-decls.cc(FuncDeclaration::toThunkSymbol): Don't mark symbol as ++ TREE_PRIVATE, just TREE_PUBLIC as false. ++ (StructLiteralExp::toSymbol): Likewise. ++ (ClassReferenceExp::toSymbol): Likewise. ++ * d-objfile.cc(d_comdat_linkage): Likewise. ++ (d_finish_symbol): Likewise. ++ (build_moduleinfo): Likewise. ++ ++ * config-lang.in: Add d-lang.cc to gtfiles. ++ * d-irstate.h(IRState::varsInScope): Change from Array to vec<> type. ++ (IRState::statementList_): Likewise. ++ (IRState::scopes_): Likewise. ++ (IRState::loops_): Likewise. ++ (IRState::labels_): Likewise. ++ * d-lang.h(d_bi_builtin_func): Remove declaration. ++ (d_bi_builtin_type): Likewise. ++ (d_keep_list): Likewise. ++ * d-objfile.h(Symbol::thunks): Change from Array to vec<> type. ++ (ModuleInfo::classes): Likewise. ++ (ModuleInfo::ctors): Likewise. ++ (ModuleInfo::dtors): Likewise. ++ (ModuleInfo::ctorgates): Likewise. ++ (ModuleInfo::sharedctors): Likewise. ++ (ModuleInfo::shareddtors): Likewise. ++ (ModuleInfo::sharedctorgates): Likewise. ++ (ModuleInfo::unitTests): Likewise. ++ (build_simple_function): Remove declaration. ++ (build_call_function): Likewise. ++ (build_ctor_function): Likewise. ++ (build_dtor_function): Likewise. ++ (build_unittest_function): Likewise. ++ * d-builtins.c(bi_fn_list): Rename to gcc_builtins_functions. ++ (bi_lib_list): Rename to gcc_builtins_libfuncs. ++ (bi_type_list): Rename to gcc_builtins_types. ++ (builtin_converted_types): Remove. ++ (builtin_converted_decls): Change from Array to vec<> type. ++ (gcc_type_to_d_type): Update. ++ (d_bi_builtin_func): Remove and move to d_builtin_function. ++ (d_bi_builtin_type): Remove and move to d_register_builtin_type. ++ (d_gcc_magic_builtins_module): Update. ++ * d-ctype.cc(TypeClass::toCtype): Remove unused var. ++ * d-decls.cc(FuncDeclaration::toThunkSymbol): Update for change to ++ vec<> type. ++ * d-elem.cc(CatExp::toElem): Change stashed vars from Array to vec<>. ++ (Expression::toElemDtor): Update for change to vec<> type. ++ * d-irstate.cc(IRState::startFunction): Likewise. ++ (IRState::endFunction): Likewise. ++ (IRState::addExp): Likewise. ++ (IRState::pushStatementList): Likewise. ++ (IRState::popStatementList): Likewise. ++ (IRState::getLabelBlock): Likewise. ++ (IRState::getLoopForLabel): Likewise. ++ (IRState::beginFlow): Likewise. ++ (IRState::endFlow): Likewise. ++ (IRState::startScope): Likewise. ++ (IRState::pushLabel): Likewise. ++ (IRState::checkGoto): Likewise. ++ (IRState::checkPreviousGoto): Change from Array to Blocks type. ++ * d-lang.cc(global_declarations): Change from Array to vec<> type. ++ (d_add_global_declaration): Update for change to vec<> type. ++ (d_write_global_declarations): Likewise. ++ (d_keep_list): Make static to source file. ++ * d-objfile.cc(static_ctor_list): Change from Array to vec<> type. ++ (static_dtor_list): Likewise. ++ (Module::genobjfile): Update for change to vec<> type. ++ (d_finish_module): Likewise. ++ (d_finish_function): Likewise. ++ (deferred_thunks): Change from ArrayBase<> to vec<> type. ++ (write_deferred_thunks): Update for change to vec<> type. ++ (use_thunk): Likewise. ++ (build_simple_function): Make static to source file. ++ (build_call_function): Likewise. ++ (build_ctor_function): Likewise. ++ (build_dtor_function): Likewise. ++ (build_unittest_function): Likewise. ++ ++2014-01-02 Iain Buclaw ++ ++ * d-objfile.cc(setup_symbol_storage): Use output_module_p on template ++ instantiating module to determine if symbol is externally compiled. ++ (d_finish_function): Set function local if function body was compiled. ++ * d-decls.cc(Dsymbol::toSymbolX): Use unsigned integer format for the ++ prefix string length. + +--- a/src/gcc/d/ChangeLog-2013 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/ChangeLog-2013 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,1215 @@ ++2013-12-27 Iain Buclaw ++ ++ * d-codegen.cc(build_two_field_type): Declare builtin types as ++ toplevel declarations. ++ * d-ctype(EnumDeclaration::toDebug): Build type decl in debug code. ++ * d-lang.cc(nametype): Rename to d_nametype. ++ ++2013-12-23 Iain Buclaw ++ ++ * d-decls.cc(EnumDeclaration::toDebug): Don't send array types to ++ rest_of_type_compilation. ++ ++2013-12-16 Iain Buclaw ++ ++ * d-spec.cc(lang_specific_driver): Require linking in library for all ++ files except D interface files. ++ * d-lang.cc(d_write_global_declarations): Call d_finish_compilation. ++ * d-objfile.cc(mark_needed): Mark static. ++ (d_finish_symbol): Don't call mark_needed. ++ (d_finish_function): Likewise. ++ (d_finish_compilation): New function to wrapup all global ++ declarations, mark templates/comdats as needed if required, and start ++ the final compilation. ++ ++2013-12-10 Iain Buclaw ++ ++ * d-ctype.cc(TypeVector::toCtype): Treat void vectors as ubyte. ++ * d-objfile.cc(VarDeclaration::toObjFile): Gag all errors compiling ++ manifest constants. ++ * d-todt.cc(TypeVector::toDt): New function to generate correct static ++ data for vector initialisers. ++ ++2013-12-05 Iain Buclaw ++ ++ * d-lang.cc(d_init_options_struct): Don't define strict aliasing. ++ (d_get_alias_set): New function to return language-specific alias set. ++ * d-convert.cc(d_convert_basic): Always zero extend pointer to integer ++ conversions. ++ ++2013-12-04 Iain Buclaw ++ ++ * d-codegen.cc(maybe_set_builtin_frontend): Assert that all runtime ++ library functions have been set-up correctly. ++ (libcall_ids): Remove unhandled library functions. ++ (get_libcall): Likewise. ++ * d-codegen.h(LibCall): Likewise. ++ * d-objfile.cc(output_symbol_p): Remove. ++ ++2013-12-03 Iain Buclaw ++ ++ * d-lang.cc(d_init_options): Update for frontend changes. ++ (d_handle_option): Set frontend allInst option if -femit-templates. ++ * d-objfile.cc(output_template_p): Want to emit all instantiated ++ templates if -femit-templates or -fdebug was passed to the compiler. ++ * d-objfile.h(TemplateEmission): Define TEallinst. ++ * d-todt.cc(StructDeclaration::toDt): Update for frontend changes. ++ * d-spec.cc(THREAD_LIBRARY): Define default thread library to link if ++ one is not already specified in the configuration process. ++ (TIME_LIBRARY): Define default real time library to link if one is not ++ already specified in the configuration process. ++ (LIBSTDCXX): Define C++ library to link if compiling C++ and D sources. ++ (lang_specific_driver): Update implementation to use new macros. ++ ++2013-12-02 Iain Buclaw ++ ++ * d-elem.cc(CatAssignExp::toElem): Don't call postblit after element ++ append to array. ++ (NewExp::toElem): Handle calling 'new' on opaque types. ++ (ArrayLiteralExp::toElem): Ensure array literal elements have no side ++ effects by making temporaries as necessary. ++ * d-todt.cc(StructLiteralExp::toDt): Update for frontend changes. ++ * d-codegen.cc(build_frame_type): Check for scoped variables if ++ building a closure. ++ * d-objfile.cc(d_finish_symbol): Relax toDt checking rule. ++ ++2013-12-01 Iain Buclaw ++ ++ * d-asmstmt.cc(ExtAsmStatement::ExtAsmStatement): Remove labels ++ member from class. ++ * d-codegen.cc(d_gcc_force_templates): Remove. ++ (convert_expr): Update for frontend changes. ++ (convert_for_assignment): Likewise. ++ (maybe_set_builtin_frontend): Update for changes to libdruntime ++ core.bitops signatures. ++ * d-ctype.cc(TypeFunction::toCtype): Update for frontend changes. ++ * d-decls.cc(Dsymbol::toSymbolX): Likewise. ++ (VarDeclaration::toSymbol): Likewise. ++ (FuncDeclaration::toSymbol): Don't defer nested functions here. ++ * d-elem.cc(PowAssignExp::toElem): Update for frontend changes. ++ (DeleteExp::toElem): Likewise. ++ (AssertExp::toElem): Don't call invariant on an extern C++ class. ++ * d-glue.cc(Global::init): Initialise new stdmsg member. ++ * d-lang.cc(d_handle_option): Handle -fdeps switch. Remove TEprivate ++ for -femit-templates switch. ++ (genCmain): Update for frontend changes. ++ (d_parse_file): Likewise. ++ * d-longdouble.cc(longdouble::dump): Likewise. ++ * d-objfile.cc(ClassDeclaration::toObjFile): Update for frontend ++ changes. ++ (InterfaceDeclaration::toObjFile): Likewise. ++ (EnumDeclaration::toObjFile): Likewise. ++ (Symbol::Symbol): Remove outputSymbol member. ++ (output_symbol_p): Mark static. ++ (output_declaration_p): Determine symbol codegen status from ++ semanticRun. ++ (output_template_p): New function to determine whether an instantiated ++ template is to be written to object file. ++ (FuncDeclaration::toObjFile): Use semanticRun to update codegen status ++ of function. ++ (FuncDeclaration::buildClosure): Error if putting a scoped variable in ++ a closure. ++ (Module::genobjfile): Update for frontend changes. ++ (d_comdat_linkage): Don't determine linkage from TE setting. Mark all ++ comdat symbols as DECL_COMDAT. ++ (setup_symbol_storage): Use output_template_p to determine whether the ++ symbol is being written to object file. ++ (mark_needed): New function to mark decls that must be emitted. ++ (d_finish_symbol): Mark finished symbols as needed. ++ (d_finish_function): Mark finished functions as needed. ++ (build_simple_function): Set semanticRun for glue changes. ++ * d-objfile.h(OutputStage): Remove enum. ++ * d-todt.cc(build_vptr_monitor): Update for frontend changes. ++ (StructInitializer::toDt): Likewise. ++ (StructDeclaration::toDt): Likewise. ++ (TypeInfoEnumDeclaration::toDt): Likewise. ++ (TypeInfoStructDeclaration::toDt): Likewise. ++ (Type::getTypeInfo): Likewise. ++ ++2013-11-30 Iain Buclaw ++ ++ * d-lang.cc(genCmain): Implement code generation of __entrypoint ++ module to provide the target C main function. ++ (deps_write): Ignore the module __entrypoint when writing make deps. ++ (d_parse_file): Handle writing __entrypoint module to object file. ++ * d-objfile.cc(d_finish_symbol): Remove special handling of _tlsstart ++ symbol, but ensure _tlsend gets written to the thread common section. ++ (d_finish_function): Remove call to build_tlssections. ++ (build_tlssections): Remove. ++ ++2013-11-29 Iain Buclaw ++ ++ * d-decls.cc(ClassDeclaration::toVtblSymbol): Use TypeSArray::makeType ++ to generate frontend static array type. ++ * d-glue.cc(Dsymbol::ungagSpeculative): Define. ++ * d-lang.cc(genCmain): Define as empty. ++ (d_parse_file): Update for frontend changes. ++ * d-objfile.cc(StructDeclaration::toObjFile): Likewise. ++ * d-typinf.cc(TypeBasic::builtinTypeInfo): Likewise. ++ * d-longdouble.cc(longdouble::isIdenticalTo): Remove. ++ * d-port.cc(Port::fequal): Define. ++ ++2013-11-28 Iain Buclaw ++ ++ * d-builtins.cc(gcc_type_to_d_type): Use TypeSArray::makeType to ++ generate frontend static array types. ++ * d-codegen.cc(build_attributes): Use optimize as don't want the ++ ctfeInterpret of TypeExp expressions. ++ (get_object_method): Update for frontend changes. ++ (get_libcall): Update to use Type::dtypeinfo. ++ * d-elem.cc(IndexExp::toElem): Don't generate bounds checking codegen ++ if frontend explictly requests it. ++ (ArrayLiteralExp::toElem): Use TypeSArray::makeType to generate ++ frontend static array type. ++ (StructLiteralExp::toElem): Update for frontend changes. ++ * d-glue.cc(Global::increaseErrorCount): Define. ++ * d-objfile.cc(Module::genmoduleinfo): Remove moduleinfo 'New' ++ implementation for libdruntime changes. ++ * d-todt.cc(StructLiteralExp::toDt): Literal initialisers override ++ default initialisers. ++ (TypeInfoDeclaration::toDt): Update to use Type::dtypeinfo. ++ (TypeInfoStructDeclaration::toDt): Update for frontend changes. ++ * d-typinf.c(Type::getInternalTypeInfo): Update to use ++ Type::dtypeinfo. ++ ++2013-11-25 Iain Buclaw ++ ++ * d-asmstmt.cc(ExtAsmStatement::comeFromImpl): Define for frontend ++ implementation changes. ++ * d-codegen.cc(get_libcall): Update to use Type::typeinfoclass. ++ * d-codegen.cc(WrappedExp): Define as class. ++ * d-convert.cc(d_convert_basic): Fix format warnings. ++ * d-decls.cc(ModuleInfoDeclaration::toSymbol): Remove. ++ (FuncDeclaration::toSymbol): Use mangleExact to get decl mangle. ++ * d-elem.cc(ClassReferenceExp::toElem): Return reference to class. ++ * d-glue.cc(verror): Fix format warnings. ++ (verrorSupplemental): Likewise. ++ (vwarning): Likewise. ++ (vdeprecation): Likewise. ++ (escapePath): Define for frontend implementation changes. ++ * d-irstate.cc(IRState::getLoopForLabel): Implement breaking on named ++ scope labels in for/while loops. ++ * d-lang.cc(d_handle_option): Add handler for new -fdeps and ++ -fmake-deps options. ++ (d_parse_file): Handle new -fdeps and fmake-deps options. ++ * d-objfile.cc(Dsymbol::toObjFile): Update to use RootObject. ++ (Type::typeinfoclass): Update to use Type::typeinfoclass. ++ (InterfaceDeclaration::toObjFile): Likewise. ++ * d-objfile.h(Symbol): Remove inheritance from Object. ++ * d-todt.cc(TypeInfoStructDeclaration::toDt): Update to use ++ Type::immutableOf. ++ ++2013-11-24 Iain Buclaw ++ ++ * d-builtins.c(gcc_type_to_d_type): Use TREE_INT_CST_LOW macro instead ++ of tree_low_cst. ++ (eval_builtin): Likewise. ++ (gcc_cst_to_d_expr): Use tree_cst_hwi. ++ * d-codegen.cc(tree_to_hwi): Remove call to deleted host_integerp. ++ (maybe_expand_builtin): Use TREE_INT_CST_LOW macro. ++ * d-lang.cc(d_parse_file): Update debug_hooks call for middle-end ++ changes. ++ * d-system.h: Update includes for middle-end changes. ++ ++2013-11-17 Iain Buclaw ++ ++ * d-objfile.cc(finish_thunk): Update for conversion of symtab types to ++ a true class hierarchy. ++ ++ * d-ctype.cc(TypeClass::toCtype): Fix ABI to emit correct vtable and ++ monitor field names. ++ ++ * d-ctype.cc(TypeClass:toCtype): Set TYPE_LANG_SPECIFIC on record as ++ well as reference type. ++ * d-lang.cc(d_classify_record): New langhook to return appropriate ++ class/interface/struct type to the debugger. ++ ++2013-10-27 Iain Buclaw ++ ++ * d-elem.cc(ArrayLiteralExp::toElem): Build empty constructor for zero ++ sized arrays. ++ ++2013-10-23 Iain Buclaw ++ ++ * d-elem.cc(AssignExp::toElem): Optimise assigning array literal to a ++ static array. ++ (ArrayLiteralExp::toElem): Do not allocate static or const array ++ literals on the heap using the GC. ++ ++2013-10-16 Iain Buclaw ++ ++ * d-builtins.c(DEF_FUNCTION_TYPE_8): Define. ++ ++2013-10-10 Iain Buclaw ++ ++ * d-builtins.c(gcc_cst_to_d_expr): Add support for VECTOR_CST to ++ Expression conversion. ++ (d_gcc_paint_type): Add support for painting to/from array literals. ++ ++2013-10-01 Iain Buclaw ++ ++ * d-objfile.cc(cvtLocToloc_t): Rename to get_linemap. ++ * d-glue.cc: New source to provide interface for defined globals and ++ error handling called from the front-end. ++ ++2013-09-16 Iain Buclaw ++ ++ * d-codegen.cc(IRState::call): Rename to d_build_call. ++ (IRState::emitLocalVar): Rename to build_local_var. ++ (IRState::buildAssignOp): Move to BinExp::toElemBin. ++ (IRState::IRState): Remove IRState class. ++ * d-irstate.cc(IRBase::IRBase): Rename to IRState, remove inheritance ++ from Object class. ++ * d-decls.cc(VarDeclaration::toSymbol): Remove redundant CONST_DECL ++ code as VarDeclaration::toObjFile does not emit manifest constants. ++ * d-ctype.cc(TypeEnum::toCtype): Generate CONST_DECLs for enumeration ++ members for correct debugging. ++ * d-objfile.cc(build_type_decl): Use fully qualified type name in ++ debugging code. ++ (VarDeclaration::toObjFile): Emit manifest constant values in debug ++ code generation. ++ ++2013-09-10 Iain Buclaw ++ ++ * d-elem.cc(SliceExp::toElem): Don't build D array for slices that ++ return a static array. ++ ++2013-09-03 Iain Buclaw ++ ++ * d-codegen.cc(IRState::buildOp): Rename to build_binary_op. ++ ++2013-09-01 Iain Buclaw ++ ++ * d-decls.cc(binfo_for): Rename to build_class_binfo. ++ (intfc_binfo_for): Rename to build_interface_binfo. ++ (ClassDeclaration::toDebug): Move binfo generation into toCtype. ++ * d-lang.cc(pushlevel): Rename to push_binding_level. ++ (poplevel): Rename to pop_binding_level. ++ (global_bindings_p): Rename to d_global_bindings_p, add langhook. ++ (pushdecl): Rename to d_pushdecl, add langhook. ++ (getdecls): Rename to d_getdecls, add langhook. ++ (set_block): Remove function. ++ (insert_block): Remove function. ++ * d-irstate.cc(IRBase::startBindings): Inline set_block here. ++ (IRBase::endBindings): Inline insert_block here. ++ ++2013-08-29 Iain Buclaw ++ ++ * d-spec.c (lang_specific_spec_functions): Remove. ++ ++2013-08-28 Iain Buclaw ++ ++ * d-codegen.cc(IRState::doArraySet): Rename to IRBase::doArraySet. ++ (IRState::arraySetExpr): Remove function. ++ (IRState::expandDecl): Rename to expand_decl. ++ (IRState::typeinfoReference): Rename to build_typeinfo. ++ (IRState::buildChain): Merge into FuncDeclaration::buildClosure. ++ (IRState::getVThis): Rename to build_vthis. ++ (IRState::maybeExpandSpecialCall): Rename to maybe_expand_builtin. ++ (IRState::toDArray): Rename to d_array_convert. ++ ++2013-08-26 Iain Buclaw ++ ++ * d-codegen.cc(convert_expr): Check that the class type the codegen is ++ casting from is a base class of the class type the codegen is casting ++ to, not the other way round. ++ ++2013-08-14 Iain Buclaw ++ ++ * d-elem.cc(ArrayLiteralExp::toElem): Return null for zero length ++ array literals. ++ ++2013-08-07 Iain Buclaw ++ ++ * d-objfile.cc(finish_thunk): Don't emit thunks to external symbols as ++ weakref declarations. ++ * d-codegen.cc(IRState::maybeExpandSpecialCall): Remove intrinsic yl2x ++ and yl2xp1 builtins. ++ (maybe_set_builtin_frontend): Likewise. ++ ++2013-07-09 Iain Buclaw ++ ++ * d-builtins.c(d_gcc_magic_builtins_module): Set builtins solely ++ provided by the compiler as @safe, pure and nothrow. ++ * d-codegen.cc(IRState::getVThis): Don't set outer 'this' of structs ++ to be parent function chain if no frame has been created. ++ ++2013-07-08 Iain Buclaw ++ ++ * d-elem.cc(Expression::toElemDtor): Wrap temp variables destructor ++ calls in a try/finally expression. ++ ++2013-07-05 Johannes Pfau ++ ++ * patch-versym-os-4.8.x: Set versions on powerpc and alpha. ++ Remove SysV4 support and therefore fix macro redefinition warnings. ++ * patch-versym-os-4.9.x: Likewise. ++ ++2013-07-03 Iain Buclaw ++ ++ * d-longdouble.cc(longdouble::set): Intepret set values at higher ++ precision for min/max properties. ++ * d-codegen.cc(maybe_set_builtin_frontend): Add yl2x and yl2xp1 ++ math intrinsics. ++ (IRState::maybeExpandSpecialCall): Likewise. ++ ++2013-07-02 Iain Buclaw ++ ++ * d-objfile.cc(Module::genobjfile): Don't free current_module_info. ++ * d-codegen.cc(IRState::buildAssignOp): Don't create a SAVE_EXPR ++ around comma expressions used as lvalues. ++ * d-todt.cc(TypeSArray::toDtElem): Get underlying vector basetype when ++ layouting out data in a static array. ++ ++2013-06-29 Iain Buclaw ++ ++ * complex_t.h: Move into dfrontend. ++ * d-builtins.c(gcc_cst_to_d_expr): Explicitly create longdouble. ++ * d-longdouble.cc(longdouble::parse): Remove function. ++ (longdouble::longdouble): Remove constructors from longdouble. ++ Replaced with operator= template and longdouble::set. ++ (longdouble::rv): Update for new class layout. ++ (longdouble::from_shwi): New function to create a longdouble value ++ from a HOST_WIDE_INT. ++ (longdouble::from_uhwi): Likewise, but from an unsigned HOST_WIDE_INT. ++ (longdouble::to_shwi): New function to return a HOST_WIDE_INT value ++ from a longdouble. ++ (longdouble::to_uhwi): Likewise, but from an unsigedn HOST_WIDE_INT. ++ (longdouble::set): New function to explicitly set longdouble value. ++ (longdouble::toInt): Remove function. ++ (longdouble::isZero): Remove function. ++ (longdouble::isNegative): Remove function. ++ * d-port.cc(Port::nan): Rename to Port::ldbl_nan. ++ (Port::infinity): Rename to Port::ldbl_infinity. ++ (Port::ldbl_max): New static field. ++ (Port::init): Set ldbl_max to be maximimum value for long double type. ++ (Port::strtof): New function to convert string to longdouble. ++ (Port::strtod): Likewise. ++ (Port::strtold): Likewise. ++ ++2013-06-24 Iain Buclaw ++ ++ * d-objfile.cc(make_alias_for_thunk): Do not set ++ TREE_SYMBOL_REFERENCED. ++ ++2013-06-17 Iain Buclaw ++ ++ * d-codegen.cc(build_struct_memcmp): New function. ++ * d-elem.cc(IdentityExp::toElem): Use build_struct_memcmp for field ++ comparisons of small structs. ++ ++2013-06-13 Iain Buclaw ++ ++ * d-codegen.cc(make_temp): New function. ++ * d-decls.cc(StructLiteralExp::toSymbol): Implement correctly to ++ generate an anonymous symbol to reference to in the codegen. ++ (ClassReferenceExp::toSymbol): Likewise, but also use an anonymous ++ type as size is not determined until the data has been layed out. ++ * d-elem.cc(EqualExp::toElem): Optimise comparisons of arrays of basic ++ types, also ensure left-to-right evaluation. ++ (SliceExp::toElem): Handle returing slice as a static array type. ++ (AddrExp::toElem): Handle taking the address of StructLiteralExp and ++ ClassReferenceExp symbols. ++ (FuncExp::toElem): Relax type checking to allow returning function ++ addresses as generic pointer types. ++ (ArrayLiteralExp::toElem): Implicitly convert static arrays of void to ++ static arrays of ubyte. ++ (StructLiteralExp::toElem): Remove code generation of postblit calls, ++ now taken care of in the front end. ++ * d-objfile.cc(Module::genmoduleinfo): Emit module name as a null ++ terminated static array. ++ * d-ctype.cc(TypeAArray::toCtype): Pass AA types around like pointers. ++ ++2013-06-11 Iain Buclaw ++ ++ * dfrontend: Update to D front-end version 2.063. ++ ++ * d-builtins.c(gcc_type_to_d_type): Use Loc for unknown locations. ++ (d_gcc_magic_builtins_module): Likewise. ++ (gcc_cst_to_d_expr): Likewise. ++ * d-codegen.cc(get_libcall): Use FuncDeclaration::genCfunc to build ++ D runtime library functions. ++ * d-decl.cc(SymbolDeclaration::SymbolDeclaration): Remove function. ++ (StructLiteralExp::toSymbol): New function. ++ (ClassReferenceExp::toSymbol): New function. ++ * d-elem.cc(AssertExp::toElem): Call struct/class invariants only if ++ compiler is generating invariant code. ++ (TupleExp::toElem): Update for new front-end. ++ (ClassReferenceExp::toElem): New function. ++ * d-lang.cc(d_init_options): Set compiler.vendor front-end parameter. ++ (d_init): Call Expression::init. ++ * d-objfile.cc(InterfaceDeclaration::toObjFile): Correctly set the ++ xgetRTInfo field in the record layout. ++ * d-todt.cc(CastExp::toDt): New function. ++ (AddrExp::toDt): New function. ++ (ClassReferenceExp::toDt): New function. ++ (ClassReferenceExp::toDtI): New function. ++ (ClassReferenceExp::toInstanceDt): New function. ++ (ClassReferenceExp::toDt2): New function. ++ ++2013-06-10 Iain Buclaw ++ ++ * d-objfile.cc(FuncDeclaration::toObjFile): Set 'this' parameter as ++ implicitly read-only. ++ * d-codegen.cc(declaration_type): Set 'this' declaration type as ++ implicitly const. ++ (build_frame_type): Set frame or closure type as implicitly const. ++ ++2013-06-09 Iain Buclaw ++ ++ * d-builtins.c(d_init_builtins): Make d_unknown_type_node a ++ RECORD_TYPE. ++ * d-lang.cc(d_build_eh_type_type): Cast the returned typeinfo decl to ++ void pointer type. ++ ++2013-06-07 Iain Buclaw ++ ++ * d-codegen.cc(IRState::var): Rename to get_decl_tree. ++ (IRState::convertForArgument): Rename to convert_for_argument. ++ (IRState::floatMod): Rename to build_float_modulus. ++ (IRState::findThis): Rename to find_this_tree. ++ (IRState::emitLocalVar): Update signature. ++ (IRState::arrayElemRef): Remove function. ++ * d-elem.cc(IndexExp::toElem): Move implementation of ++ IRState::arrayElemRef here. ++ ++2013-06-04 Iain Buclaw ++ ++ * d-codegen.cc(cmodule): Rename to current_module_decl. ++ (object_file): Remove variable. ++ * d-objfile.cc(ObjectFile::moduleInfo): Rename to current_module_info. ++ (ObjectFile::modules): Rename to output_modules. ++ (ObjectFile::staticCtorList): Rename to static_ctor_list. ++ (ObjectFile::staticDtorList): Rename to static_dtor_list. ++ (ObjectFile::emitTemplates): Rename to flag_emit_templates. ++ (ObjectFile::beginModule): Remove function. ++ (ObjectFile::endModule): Remove function. ++ (ObjectFile::finish): Rename to d_finish_module. ++ (ObjectFile::doLineNote): Remove function. ++ (ObjectFile::setLoc): Rename to set_input_location. ++ (ObjectFile::setDeclLoc): Rename to set_decl_location. ++ (ObjectFile::setCfunEndLoc): Rename to set_function_end_locus. ++ (ObjectFile::giveDeclUniqueName): Rename to get_unique_name. ++ (ObjectFile::setupSymbolStorage): Rename to setup_symbol_storage. ++ (ObjectFile::setupStaticStorage): Remove function. ++ (ObjectFile::makeDeclOneOnly): Rename to d_comdat_linkage. ++ (ObjectFile::outputStaticSymbol): Rename to d_finish_symbol. ++ (ObjectFile::outputFunction): Rename to d_finish_function. ++ (ObjectFile::addAggMethod): Remove function. ++ (ObjectFile::initTypeDecl): Rename to build_type_decl. ++ (ObjectFile::declareType): Remove function. ++ (ObjectFile::shouldEmit): Rename to output_declaration_p. ++ (ObjectFile::shouldEmit): Rename variant to output_symbol_p. ++ (ObjectFile::doThunk): Rename to use_thunk. ++ (ObjectFile::stripVarDecl): Remove function. ++ (ObjectFile::doSimpleFunction): Rename to build_simple_function. ++ (ObjectFile::doFunctionToCallFunctions): Rename to ++ build_call_function. ++ (ObjectFile::doCtorFunction): Rename to build_ctor_function. ++ (ObjectFile::doDtorFunction): Rename to build_dtor_function. ++ (ObjectFile::doUnittestFunction): Rename to build_unittest_function. ++ (ObjectFile::hasModule): Rename to output_module_p. ++ (ObjectFile::outputThunk): Rename to finish_thunk. ++ (write_deferred_thunks): New function to emit deferred thunks. ++ ++2013-06-03 Iain Buclaw ++ ++ * d-decls.cc(VarDeclaration::toSymbol): Don't set default tls model. ++ * d-objfile.cc(ObjectFile::setupSymbolStorage): Set default tls ++ model for var decls before determining whether symbol is public. ++ (build_tlssections): Likewise for TLS symbols. ++ ++2013-06-01 Johannes Pfau ++ ++ * d-codegen.cc(maybe_set_builtin_frontend): Check parameter and ++ return types of intrinsics. ++ ++2013-06-01 Iain Buclaw ++ ++ * d-codegen.cc(IRState::var): Handle variables used for NRVO. ++ * d-ir.cc(ReturnStatement::toIR): Return result decl directly if NRVO. ++ * d-objfile.cc(Symbol::SnamedResult): New member to hold the named ++ RESULT_DECL of the function. ++ (FuncDeclaration::toObjFile): Set-up function for NRVO. ++ (build_tlssections): Align _tlsstart and _tlsend symbols to target ++ address size. ++ * d-ctype(TypeFunction::toSymbol): Mark functions returning non-POD ++ structs as TREE_ADDRESSABLE to force return in memory. ++ * d-decls.cc(FuncDeclaration::toSymbol): Propagate TREE_ADDRESSABLE ++ from the original function type. ++ ++2013-05-29 Iain Buclaw ++ ++ * d-target.cc: New source file to handle Target structure. ++ ++ * d-builtins.c(d_bi_init): Remove function. ++ (d_gcc_type_align): Move to Target::alignsize. ++ (d_gcc_field_align): Move to Target::fieldalign. ++ (d_init_builtins): Build va_list type for D frontend. ++ * d-lang.cc(d_init): Use isLP64 to determine LP64 targets. ++ (d_add_builtin_version): Set is64bit if target is X86_64. ++ * d-codegen.cc(convert_for_assignment): Use memset to implement front ++ end code (struct = 0) here, rather than build an empty constructor. ++ * d-elem.cc(AssignExp::toElem): Remove handling of (struct = 0) and ++ call convert_for_assignment. ++ ++2013-05-28 Iain Buclaw ++ ++ * d-gcc-complex_t.h: Rename to complex_t.h. ++ * d-gcc-real.cc: Rename to d-longdouble.cc. ++ * d-gcc-real.h: Rename to longdouble.h ++ * d-port.cc: New source file to handle Port structure. ++ * gdc_alloca.h: Remove source. ++ ++ * d-longdouble.cc(real_t): Rename to longdouble. ++ (longdouble::getnan): Move to Port::nan. ++ (longdouble::getsnan): Move to Port::snan. ++ (longdouble::getinfinity): Move to Port::infinity. ++ (longdouble::isInf): Move to Port::isInfinite. ++ (longdouble::isNan): Move to Port::isNan. ++ (longdouble::isSignallingNan): Move to Port::isSignallingNan. ++ * d-builtins.c(gcc_d_backend_init): Rename to d_backend_init. ++ (gcc_d_backend_term): Rename to d_backend_term. ++ (gcc_type_to_d_type): Don't map 128bit integers to D front end. ++ ++ * d-elem.cc(AssignExp::toElem): Remove handling of fillHoles, use ++ memset to implement (struct = 0). ++ (StructLiteralExp::toElem): Handle fillHoles here, creating a ++ temporary var that is zero init'd with memset and returned. ++ ++2013-05-27 Iain Buclaw ++ ++ * d-codegen.cc(IRState::localVar): Rename to build_local_var. ++ (IRState::exprVar): Rename to create_temporary_var. ++ (IRState::maybeExprvar): Rename to maybe_temporary_var. ++ (IRState::pointerIntSum): Rename to build_array_index. ++ * d-lang.cc(d_handle_target_attribute): New function to handle D ++ target attributes. ++ ++2013-05-26 Iain Buclaw ++ ++ * d-incpath.cc(prefixed_path): Add cpp_GCC_INCLUDE_DIR back in as ++ second method for relocation. ++ * d-elem.cc(IndexExp::toElem): Fix call to _aaGetX as from ++ IRState::toElemLvalue. ++ * d-codegen.cc(IRState::toElemLvalue): Remove function. ++ (IRState::convertForAssignment): Rename to convert_for_assignment. ++ (IRState::convertForCondition): Rename to convert_for_condition. ++ (IRState::checkedIndex): Rename to d_checked_index. ++ (IRState::boundsCond): Rename to d_bounds_condition. ++ (IRState::arrayBoundsCheck): Rename to array_bounds_check. ++ (IRState::assertCall): Rename to d_assert_call. ++ (IRState::doLineNote): Move to irstate.h. ++ * d-irstate.cc(IRBase::getLocalContext): Remove function. ++ * d-decls.cc(VarDeclaration::toSymbol): Build decl lang specific for ++ decl to point back to D front end type. ++ (FuncDeclaration::toSymbol): Likewise. ++ ++2013-05-23 Iain Buclaw ++ ++ * d-codegen.cc(AggLayout::finish): Unset TYPE_SIZE before ++ re-calculating. ++ * d-ctype.cc(TypeStruct::toCtype): Don't call decl_attribute on the ++ type twice. ++ ++2013-05-21 Iain Buclaw ++ ++ * d-lang.cc(d_gcc_dump_source): Remove function. ++ (d_post_options): Set flag_excess_precision_cmd as standard. ++ * d-gcc-real.cc(real_t::convert): Remove function. ++ (real_t::floatCompare): Remove function. ++ (real_t::operator): Always perform floating point compilation at the ++ precision of the target real mode. ++ * d-todt.cc(dt_last): Remove function. ++ (dtlist_to_tree): Rename to dtvector_to_tree. ++ (dt_cons): Replace TREE_CHAIN implementation for use of CONSTRUCTOR. ++ (dt_chainon): Likewise. ++ (dt_container): Likewise. ++ (dt_container2): Likewise. ++ (StructInitializer::toDt): Likewise. ++ (StructLiteralExp::toDt): Likewise. ++ ++2013-05-17 Iain Buclaw ++ ++ * d-codegen.cc(IRState::convertTo): Replace with d_convert and ++ convert_expr. ++ (IRState::declContext): Replace with d_decl_context. ++ (IRState::functionNeedsChain): Replace with needs_static_chain. ++ (IRState::label): Replace with d_build_label. ++ (IRState::emitTemplates): Move to ObjectFile. ++ (functionDegenerateClosure): Replace with is_degenerate_closure. ++ (get_object_method): Assert that function is a method. ++ (IRState::startCond): Move to IRBase. ++ (IRState::startElse): Likewise. ++ (IRState::endCond): Likewise. ++ (IRState::startLoop): Likewise. ++ (IRState::continueHere): Likewise. ++ (IRState::setContinueLabel): Likewise. ++ (IRState::exitIfFalse): Likewise. ++ (IRState::endLoop): Likewise. ++ (IRState::startCase): Likewise. ++ (IRState::doCase): Likewise. ++ (IRState::endCase): Likewise. ++ (IRState::continueLoop): Likewise. ++ (IRState::exitLoop): Likewise. ++ (IRState::startTry): Likewise. ++ (IRState::startCatches): Likewise. ++ (IRState::startCatch): Likewise. ++ (IRState::endCatch): Likewise. ++ (IRState::endCatches): Likewise. ++ (IRState::startFinally): Likewise. ++ (IRState::endFinally): Likewise. ++ (IRState::doReturn): Likewise. ++ (IRState::doJump): Likewise. ++ (IRState::pushLabel): Likewise. ++ (IRState::checkSwitchCase): Likewise. ++ (IRState::checkGoto): Likewise. ++ (IRState::checkPreviousGoto): Likewise. ++ ++ * d-elem.cc(CatAssignExp::toElem): Call postblit on appending array of ++ structs if required. ++ ++2013-05-16 Johannes Pfau ++ ++ * d-incpath.cc(prefixed_path): use cpp_PREFIX instead of ++ cpp_GCC_INCLUDE_DIR for relocation. ++ ++2013-05-16 Iain Buclaw ++ ++ * d-codegen.cc(IRState::convertForAssignment): Remove use of ++ CtorEltMaker wrapper for vec. ++ (d_array_value): Likewise. ++ (build_delegate_cst): Likewise. ++ (extract_from_method_call): Likewise. ++ * d-elem.cc(NewExp::toElem): Likewise. ++ (ArrayLiteralExp::toElem): Likewise. ++ (AssocArrayLiteralExp::toElem): Likewise. ++ (StructLiteralExp::toElem): Likewise. ++ (NullExp::toElem): Likewise. ++ (VectorExp::toElem): Likewise. ++ * d-objfile.cc(build_moduleinfo): Likewise. ++ * d-todt.cc(dt_container): Likewise. ++ (dt_container2): Likewise. ++ ++ * d-asmstmt.cc(ExtAsmStatement::toIR): Remove use of ListMaker ++ wrapper for tree chaining. ++ * d-builtins.c(d_bi_builtin_func): Likewise. ++ (d_bi_builtin_type): Likewise. ++ (d_gcc_magic_builtins_module): Likewise. ++ (d_gcc_magic_libbuiltins_module): Likewise. ++ * d-codegen.cc(build_attributes): Likewise. ++ (IRState::call): Likewise. ++ (IRState::buildFrameForFunction): Likewise. ++ (AggLayout::doFields): Likewise. ++ (AggLayout::addField): Likewise. ++ * d-ctype.cc(TypeEnum::toCtype): Likewise. ++ (TypeFunction::toCtype): Likewise. ++ * d-todt.cc(dt_container2): Likewise. ++ ++ * d-codegen.cc(IRState::getFrameInfo): Replace with get_frameinfo. ++ (IRState::buildFrameForFunction): Replace with build_frame_type. ++ (IRState::isClassNestedInFunction): Replace with d_nested_class. ++ (IRState::isStructNestedInFunction): Replace with d_nested_struct. ++ (IRState::getFrameForFunction): Fold into IRState::getFrameForSymbol. ++ (IRState::getFrameForNestedClass): Likewise. ++ (IRState::getFrameForNestedStruct): Likewise. ++ ++2013-05-15 Iain Buclaw ++ ++ * d-codegen.cc(IRState::buildFrameForFunction): Also copy the ++ parameters of functions with 'in' contracts to a local frame decl. ++ * d-lang.cc(d_handle_flatten_attribute): New function to handle D ++ flatten attributes. ++ ++2013-05-14 Iain Buclaw ++ ++ * d-codegen.cc(IRState::chainLink): Remove function. ++ (IRState::chainFunc): Remove function. ++ (IRState::sthis): New member which holds the chain of function. ++ (IRState::buildChain): Update to use new static chain decl. ++ (IRState::getFrameInfo): Likewise. ++ * d-objfile.cc(FuncDeclaration::buildClosure): Likewise. ++ (FuncDeclaration::toObjFile): Default the function static chain decl ++ to null unless vthis is given for the function. ++ ++2013-05-13 Iain Buclaw ++ ++ * d-lang.cc(d_handle_noinline_attribute): New function to handle D ++ noinline attributes. ++ (d_handle_forceinline_attribute): New function to handle D forceinline ++ attributes. ++ * d-elem.cc(StructLiteralExp::toElem): Return the struct initialiser ++ symbol directly if the tree has already been built. ++ * d-decls.cc(Dsymbol::toSymbolX): Constify the mangling name to use. ++ ++2013-05-10 Iain Buclaw ++ ++ * d-typinf.cc: New file containing type info routines originally in ++ the D Front End. ++ ++ * d-todt.cc(dt_last): New helper function to retrieve last node in a ++ dt_t tree list. ++ (dt_cons): New helper function to append nodes to the end of a list. ++ (dt_chainon): New helper function to concatenate two lists together. ++ (dt_container): New helper function to build a ctor from a list. ++ (build_vptr_monitor): New helper function to generate the class ++ vtable, and put out __vptr and __monitor. ++ symbol default values in a class declaration. ++ (dtlist_to_tree): New helper function to convert a dt_t list into a ++ constructor tree. ++ (Type::toDt): Implement routines for new dt_t format. ++ (TypeInfoDeclaration::toDt): Likewise. ++ (Initializer::toDt): Likewise. ++ (Expression::toDt): Likewise. ++ (Declaration::toDt): Likewise. ++ ++ * d-objfile.cc(Dsymbol::toObjFile): Update for new dt_t format. ++ (Module::genmoduleinfo): Likewise. ++ (Symbol::Symbol): Moved from symbol.cc ++ (Obj::objmod): Remove abstraction layer. ++ (Obj::moduleinfo): Renamed to build_moduleinfo. ++ (obj_tlssections): Renamed to build_tlssections. ++ (outdata): Renamed to d_finish_symbol. ++ (check_static_sym): Moved into d_finish_symbol. ++ ++ * d-codegen.cc(d_gcc_emit_local_variable): Remove. ++ ++ * d-decls.cc(Dsymbol::toSymbolX): Update to not call symbol_calloc. ++ (FuncDeclaration::toThunkSymbol): Likewise. ++ (ClassDeclaration::toSymbol): Build type as d_unknown_type_node. ++ (InterfaceDeclaration::toSymbol): Likewise. ++ (Module::toSymbol): Likewise. ++ (ClassDeclaration::toVtblSymbol): Update call to toSymbolX. ++ (AggregateDeclaration::toInitializer): Likewise. ++ (TypedefDeclaration::toInitializer): Likewise. ++ (EnumDeclaration::toInitializer): Likewise. ++ ++ * d-ir.cc(CaseStatement::toIR): Don't call static_sym. ++ ++ * d-lang.cc(rtlsym): Remove symbol. ++ (D_DECL_READONLY_STATIC): Remove macro. ++ (d_unknown_type_node): New LANG_TYPE node for marking TypeInfo_Class, ++ Interface, and ModuleInfo types that are of a variable size determined ++ at compile time. ++ ++ * d-elem.cc(StringExp::toElem): Clean up for new dt_t format. ++ ++ * symbol.cc: Remove file. ++ ++2013-05-08 Iain Buclaw ++ ++ * d-codegen.cc(IRState::getFrameInfo): Don't create a frame/closure ++ for member functions, only required for nested. ++ * d-elem.cc(Expression::toElemDtor): Call dtors in the correct order. ++ (DeclarationExp::toElem): Don't call dtor on static, manifest, or ++ extern symbols upon declaration. ++ (AssignExp::toElem): Only call postblit on lvalues in assignment. ++ (ArrayLiteralExp::toElem): Always generate literals on heap. ++ ++2013-05-06 Iain Buclaw ++ ++ * d-elem.cc(StructLiteralExp::toElem): Return the default initialiser ++ symbol if one exists. ++ * d-builtins.c(d_gcc_magic_libbuiltins_check): Override the function ++ type with the correct built-in function type as defined in backend. ++ ++2013-04-15 Iain Buclaw ++ ++ * d-elem.cc(IdentityExp::toElem): Remove special handling of class, ++ reference and array types. ++ ++2013-04-12 Iain Buclaw ++ ++ * d-codegen.cc(maybe_make_temp): Save call expressions so aren't ++ evaluated more than once. ++ (d_has_side_effects): Remove check for exceptional class types. ++ ++2013-04-10 Iain Buclaw ++ ++ * d-decls.cc(FuncDeclaration::toSymbol): Harden logic for marking ++ functions pure as in 'has no side effects'. ++ ++2013-04-07 Iain Buclaw ++ ++ * d-decls.cc(FuncDeclaration::toSymbol): Push deferred functions to ++ FuncDeclaration::deferred. ++ * d-elem.cc(DelegateExp::toElem): Likewise. ++ (FuncExp::toElem): Likewise. ++ * d-objfile.cc(ObjectFile::shouldEmit): Likewise. ++ (FuncDeclaration::toObjFile): Process all deferred functions in ++ FuncDeclaration::deferred. ++ * symbol.cc(Symbol::deferredNestedFuncs): Remove. ++ ++2013-04-05 Iain Buclaw ++ ++ * d-elem.cc(FuncExp::toElem): Defer function literals and lambdas ++ until parent function has finished processing. ++ ++2013-04-04 Iain Buclaw ++ ++ * d-codegen.cc(IRState::buildChain): Use __frame decl directly when ++ setting up the function frame. ++ (maybe_set_builtin_frontend): Exit early if symbol has no parent. ++ * d-decls.cc(FuncDeclaration::toSymbol): Defer all nested functions, ++ not just templated instances. ++ * d-objfile.cc(FuncDeclaration::toObjFile): Delay processed deferred ++ nested functions until function has finished being generated. ++ (ObjectFile::shouldEmit): Don't emit nested functions if the parent ++ function hasn't finished processing. ++ ++2013-04-03 Iain Buclaw ++ ++ * d-codegen.cc(maybe_set_builtin_frontend): Merged from ++ maybe_set_builtin and maybe_set_libcall. ++ * d-decls.cc(FuncDeclaration::toSymbol): Use ++ maybe_set_builtin_frontend. ++ ++2013-03-31 Iain Buclaw ++ ++ * d-lang.cc(d_init_options): Default module info emission to on. ++ (d_handle_option): New femit-moduleinfo switch. ++ * d-objfile.cc(Module::genobjfile): Don't emit module if disabled ++ explicitly. ++ * d-builtins(is_intrinsic_module_p): New function to test whether ++ module is core.bitops. ++ (is_math_module_p): New function to test whether module is std.math or ++ core.stdc.math. ++ (is_builtin_va_arg_p): New function to test whether symbol is ++ specially handled va_arg template. ++ (is_builtin_va_start_p): New function to test whether symbol is ++ specially handled va_start template. ++ * d-codegen.cc(IRState::binding): Replace with bind_expr. ++ (IRState::mathModule): Replace with std_math_module. ++ (IRState::mathCoreModule): Replace with core_math_module. ++ (IRState::intrinsicModule): Replace with std_intrinsic_module. ++ (IRState::cstdargTemplateDecl): Replace with va_arg_template. ++ (IRState::stdargTemplateDecl): Replace with va_arg2_template. ++ (IRState::cstdargStartTemplateDecl): Replace with va_start_template. ++ (IRState::getLibCallDecl): Replace with get_libcall. ++ (IRState::maybeSetLibCallDecl): Replace with maybe_set_libcall. ++ (IRState::libCall): Replace with build_libcall. ++ (IRState::maybeSetUpBuiltin): Replace with maybe_set_builtin. ++ (IRState::Intrinsic): Move enum out of IRState. ++ ++2013-03-30 Iain Buclaw ++ ++ * d-codegen.cc(IRState::darrayPtrRef): Replace with d_array_ptr. ++ (IRState::darrayLenRef): Replace with d_array_length. ++ (IRState::darrayVal): Replace with d_array_value. ++ (IRState::darrayString): Replace with d_array_string. ++ (IRState::arrayLength): Replace with get_array_length. ++ (get_object_method): Remove dependancy on irs parameter. ++ * d-lang.cc(d_init): Use static bool std_inc to determine whether to ++ include standard module paths. ++ (d_post_options): Canonicalize the input filename. ++ (d_parse_file): Correctly catch cases where input file is stdin. ++ ++2013-03-27 Iain Buclaw ++ ++ * d-codegen.cc(IRState::getFrameInfo) Create a custom static chain for ++ all nested functions. ++ * d-gcc-includes.h: Rename to d-system.h ++ ++2013-03-23 Iain Buclaw ++ ++ * d-builtins.c(d_bi_init): Set REALPAD to be TYPE_PRECISION of ++ long_double_type_node. ++ * d-codegen.cc(IRState::twoFieldType): Replace with ++ build_two_field_type. ++ (IRState::arrayOpNotImplemented): Replace with unhandled_arrayop_p. ++ (IRState::delegateMethodRef): Replace with delegate_method. ++ (IRState::delegateObjectRef): Replace with delegate_object. ++ (IRState::delegateVal): Replace with build_delegate_cst. ++ (IRState::methodCallExpr): Replace with build_method_call. ++ (IRState::extractMethodCallExpr): Replace with ++ extract_from_method_call. ++ (IRState::objectInstanceMethod): Replace with get_object_method. ++ (IRState::twoFieldCtor): Remove. ++ (IRState::call): Assert that if calling a normal FUNCTION_TYPE, ++ 'object' is not set. ++ * d-ctype.cc(TypeDelegate::toCtype): Build a METHOD_TYPE for the .func ++ field type in delegates. ++ * d-lang.h(D_IS_METHOD_CALL_EXPR): Rename to D_METHOD_CALL_EXPR. ++ * d-objfile.cc(FuncDeclaration::toObjFile): Remove assert for chain ++ function. ++ ++2013-03-20 Johannes Pfau ++ ++ * d-codegen.cc(IRState::objectInstanceMethod): Recursively check ++ for TOKsuper / TOKdottype. Do not ignore CastExp. ++ * d-elem.cc(IdentityExp::toElem): Ignore padding in bitwise floating ++ point comparisons. ++ * testsuite: Cleanup. Remove invalid tests, adjust tests, etc. ++ ++2013-03-20 Iain Buclaw ++ ++ * d-codegen.cc(IRState::objectInstanceMethod): Get function pointer ++ off function TREE_TYPE. ++ (build_deref): Handle cases where expression to dereference is an ++ address expression. ++ (modify_expr): New function overload to set return type directly. ++ * d-elem.cc(CatAssignExp::toElem): Use new modify_expr. ++ (AssignExp::toElem): Likewise. ++ * d-decls.cc(FuncDeclaration::toSymbol): Don't build a method type for ++ nested functions / delegates. Just add on the hidden 'this' pointer ++ containing the custom static chain/closure object. ++ ++ * d-codegen.cc(GlobalValues): Replace with current_module, ++ current_irs, object_file. ++ (IRState::getFuncType): Replace with get_function_type. ++ (IRState::isCallByAlias): Replace with call_by_alias_p. ++ (IRState::isFuncType): Replace with function_type_p. ++ (IRState::doExp): Remove. ++ ++ * d-asmstmt.cc(ExtAsmStatement::syntaxCopy): Use arraySyntaxCopy to ++ copy front end expressions. ++ ++ * d-codegen.cc(AssignExp::toElem): Call _d_arrayassign / _d_arrayctor ++ when assigning arrays of structs. ++ ++2013-03-18 Iain Buclaw ++ ++ * d-codegen.cc(IRState::realPart): Replace with real_part. ++ (IRState::imagPart): Replace with imaginary_part. ++ (IRState::integerConstant): Replace with build_integer_cst. ++ (IRState::floatConstant): Replace with build_float_cst. ++ (IRState::hwi2toli): Replace with cst_to_hwi. ++ (IRState::addressOf): Replace with build_address. ++ (IRState::markAddressable): Replace with d_mark_addressable. ++ (IRState::markUsed): Replace with d_mark_used. ++ (IRState::markRead): Replace with d_mark_read. ++ (IRState::indirect): Replace with indirect_ref. ++ (IRState::pvoidOkay): Replace with void_okay_p. ++ (IRState::maybeCompound): Replace with maybe_compound_expr. ++ (IRState::maybeVoidCompound): Replace with maybe_vcompound_expr. ++ (IRState::isErrorMark): Replace with error_mark_p. ++ (IRState::getTargetSizeConst): Replace with tree_to_hwi. ++ (IRState::modify): Replace with modify_expr. ++ (IRState::vmodify): Replace with vmodify_expr. ++ (IRState::vinit): Replace with build_vinit. ++ (IRState::nop): Replace with build_nop. ++ (IRState::vconvert): Replace with build_vconvert. ++ (IRState::boolOp): Replace with build_boolop. ++ (IRState::compound): Replace with compound_expr. ++ (IRState::voidCompound): Replace with vcompound_expr. ++ (IRState::component): Replace with component_ref. ++ (IRState::errorMark): Replace with error_mark. ++ (IRState::typesSame): Replace with d_types_same. ++ (IRState::typesCompatible): Replace with d_types_compatible. ++ (IRState::getDType): Replace with build_dtype. ++ (IRState::getObjectType): Replace with build_object_type. ++ (IRState::isDeclarationReferenceType): Replace with decl_reference_p. ++ (IRState::trueDeclarationType): Replace with declaration_type. ++ (IRState::isArgumentReferenceType): Replace with arg_reference_p. ++ (IRState::trueArgumentType): Replace with type_passed_as. ++ (IRState::arrayType): Replace with d_array_type. ++ (IRState::addTypeAttribute): Replace with insert_type_attributes. ++ (IRState::addDeclAttribute): Replace with insert_decl_attributes. ++ (IRState::attributes): Replace with build_attributes. ++ (IRState::addTypeModifiers): Replace with insert_type_modifiers. ++ (IRState::maybeMakeTemp): Replace with maybe_make_temp. ++ (IRState::isFreeOfSideEffects): Replace with d_has_side_effects. ++ (IRState::pointerOffsetOp): Replace with build_offset_op. ++ (IRState::pointerOffset): Replace with build_offset. ++ (IRState::buildCall): Replace with d_build_call. ++ (IRState::exceptionObject): Replace with build_exception_object. ++ ++2013-03-17 Iain Buclaw ++ ++ * d-asmstmt.cc(d_build_asm_stmt): Remove. ++ (ExtAsmStatement::ExtAsmStatement): Update to match renamed members. ++ (ExtAsmStatement::syntaxCopy): Likewise. ++ (ExtAsmStatement::semantic): Likewise. ++ (ExtAsmStatement::toCBuffer): Likewise. ++ (ExtAsmStatement::comeFrom): New. ++ (ExtAsmStatement::blockExit): Don't error if must not throw. ++ (naturalString): Remove. ++ (ExtAsmStatement::toIR): Inline IRState::doAsm implementation. ++ * d-codegen.cc(IRState::doAsm): Remove. ++ * d-decls.cc(FuncDeclaration::toSymbol): Don't generate 'naked' ++ attribute. ++ (binfo_for): Move into d-decls.cc. ++ (intfc_binfo_for): Likewise. ++ (ClassDeclaration::toDebug): Likewise. ++ (EnumDeclaration::toDebug): Likewise. ++ (TypedefDeclaration::toDebug): Likewise. ++ (StructDeclaration::toDebug): Likewise. ++ * d-objfile.cc(FuncDeclaration::toObjFile): Move into d-objfile.cc. ++ (FuncDeclaration::buildClosure): Likewise. ++ (Module::genobjfile): Likewise. ++ * d-glue.cc: Remove file. ++ ++2013-03-16 Iain Buclaw ++ ++ * d-ir.cc(SynchronizedStatement::toIR): Remove implementation as is ++ now handled by the frontend. ++ ++2013-03-15 Iain Buclaw ++ ++ * d-codegen.cc(IRState::maybeExpandSpecialCall): Handle ref argptr ++ arguments. ++ ++2013-03-13 Iain Buclaw ++ ++ * d-builtins.c(handle_alias_attribute): New function to handle ++ internal 'alias' attribute. ++ (handle_weakref_attribute): New function to handle internal 'weakref' ++ attribute. ++ * d-objfile.cc(ObjectFile::outputThunk): Define thunks to external ++ symbols as weakref, alias ++ ++2013-03-12 Johannes Pfau ++ ++ * patch-versym-os-4.8.x(mingw32.h): Fix typo ++ * patch-versym-cpu-4.8.x(mips.h): Fix typo ++ Update version symbols to latest dlang specification. ++ ++2013-03-10 Iain Buclaw ++ ++ * d-decls.cc(FuncDeclaration::toSymbol): Delay setting TREE_TYPE as ++ function type could be hidden in a nested function not yet built. ++ * d-codegen.cc(IRState::findThis): Don't get 'this' from outer ++ function if it's a closure type. This has already been handled by ++ IRState::getFrameForSymbol. ++ (IRState::buildChain): Give frame decl debug name '__frame'. ++ Always set '__chain' link field. ++ (IRState::getFrameInfo): Don't build a frame for all nested functions. ++ Search through nested aggregates for static chain in outer functions. ++ * d-codegen.h(IRState::useParentChain): Remove. ++ * d-glue.cc(FuncDeclaration::toObjFile): Don't call useParentChain. ++ Don't create a local var for the chain link for a function. ++ (FuncDeclaration::buildClosure): Always set '__chain' link field. ++ ++2013-03-08 Iain Buclaw ++ ++ * d-codegen.cc(d_gcc_force_templates): Only check for emitting ++ templates as private. ++ * d-lang.cc(d_handle_option): Remove -femit-templates= option. ++ * d-objfile.cc(ObjectFile::makeDeclOneOnly): Fix code logic so ++ fallback method could be reached. ++ * d-objfile.h(TEall, TEauto): Remove. ++ ++2013-03-07 Iain Buclaw ++ ++ * d-ir.cc(ReturnStatement::toIR): Don't call postblit on return. ++ * d-codegen.cc(IRState::trueDeclarationType): Don't set ++ D_TYPE_ADDRESSABLE. ++ (IRState::makeTemp): Remove. ++ (IRState::maybeMakeTemp): Copy makeTemp into function. ++ * d-glue.cc(d_genericize): Remove D_TYPE_ADDRESSABLE handling. ++ * d-lang.h(D_TYPE_ADDRESSABLE): Remove macro. ++ ++2013-03-04 Johannes Pfau ++ ++ * d-ctype.cc(Type::toCtype): Always call gen.addTypeModifiers to ++ make sure TYPE_MAIN_VARIANT is set. Reuse tree from unqualified ++ variant for that. Also cache the resulting qualified tree. ++ (TypeTypedef::toCtype): Likewise. ++ (TypeEnum::toCtype): Likewise. ++ (TypeStruct::toCtype): Likewise. ++ (TypeFunction::toCtype): Likewise. ++ (TypeVector::toCtype): Likewise. ++ (TypeSArray::toCtype): Likewise. ++ (TypeDArray::toCtype): Likewise. ++ (TypeAArray::toCtype): Likewise. ++ (TypeDelegate::toCtype): Likewise. ++ (TypeClass::toCtype): Likewise. ++ * d-objfile.cc(ObjectFile::giveDeclUniqueName): Make sure DECL_NAME is set ++ ++2013-03-01 Iain Buclaw ++ ++ * d-decls.cc(VarDeclaration::toSymbol): Remove use of c_ident. ++ (FuncDeclaration::toSymbol): Likewise. ++ * d-builtins.c(handle_noreturn_attribute): Assert that this is only ++ used for internal purposes. ++ (handle_const_attribute): Likewise. ++ (handle_malloc_attribute): Likewise. ++ (handle_pure_attribute): Likewise. ++ (handle_nonnull_attribute): Likewise. ++ (handle_nothrow_attribute): Likewise. ++ (handle_sentinel_attribute): Likewise. ++ (handle_transaction_pure_attribute): Likewise. ++ (handle_returns_twice_attribute): Likewise. ++ * d-glue.cc(FuncDeclaration::toObjFile): Result variables have no ++ default initialiser. ++ * d-codegen.cc(IRState::emitLocalVar): Add in assert that the local ++ variable has no initialiser if called with no_init = true. ++ (IRState::getLibCallDecl): Mark exceptional library functions as ++ noreturn. ++ (IRState::attributes): Gracefully handle @attribute, and ++ @attribute(null). ++ ++2013-02-28 Jernej Krempus ++ ++ * d-builtins.c(d_attribute_table): Renamed it to ++ d_builtins_attribute_table. ++ * d-lang.cc(d_attribute_table): Added an empty table ++ * d-lang.cc(LANG_HOOKS_COMMON_ATTRIBUTE_TABLE): Defined it as ++ d_builtins_attribute_table. ++ * d-lang.h(d_builtins_attribute_table): Added a declaration. ++ * d-codegen.cc(IRState::attributes): Changed it so it goes through ++ in_attrs and looks for any @gcc.attribute.attribute("attr_name"). ++ * d-objfile.cc(ObjectFile::setupSymbolStorage): Pass userAttributes ++ instead of attributes in all calls to IRState::attributes. ++ * d-ctype.cc(TypeTypedef::toCtype): Likewise. ++ (TypeEnum::toCtype): Likewise. ++ (TypeStruct::toCtype): Likewise. ++ (TypeClass::toCtype): Likewise. ++ * libphobos/libdruntime/gcc/attribute.d: New file. ++ ++2013-02-28 Iain Buclaw ++ ++ * d-lang.cc(d_handle_option): Remove OPT_fdeprecated and ++ OPT_Wsign_compare, add handling for OPT_Wdeprecated. ++ (d_post_options): Handle Wdeprecated and Werror switch combination. ++ ++2013-02-27 Iain Buclaw ++ ++ * d-codegen.cc(ArrayScope::ArrayScope): Don't setup length var if its ++ value is known at compile time. ++ (ArrayScope::setArrayExp): Likewise. ++ * d-decls.cc(uniqueName): Remove function. ++ (VarDeclaration::toSymbol): Set decl assembler name directly. ++ (FuncDeclaration::toSymbol): Likewise. ++ ++2013-02-15 Iain Buclaw ++ ++ * Make-lang.in(GDC_EXTENDED_ASM_SYNTAX): Remove macro. ++ ++2013-02-14 Iain Buclaw ++ ++ * d-lang.h(D_DECL_IS_CONTRACT): Remove macro. ++ * d-decls.cc(FuncDeclaration::toSymbol): Likewise. ++ ++2013-02-13 Iain Buclaw ++ ++ * d-lang.cc(d_gcc_is_target_win32): Remove. ++ (d_add_builtin_version): New function to handle define_builtin ++ callback from backend. ++ * d-codegen.cc(IRState::maybeExpandSpecialCall): Remove intrinsic bt. ++ ++ * d-builtins.c: Merge with d-builtins2.cc. ++ * d-builtins2.cc: Remove. ++ ++2013-02-07 Johannes Pfau ++ ++ * d-lang.cc(d_init): Use gcc's config system for predefined OS versions. ++ * setup-gcc.sh: Likewise. ++ * target-ver-syms.sh: Likewise. ++ ++2013-02-05 Iain Buclaw ++ ++ * d-builtins2.cc(gcc_type_to_d_type): Remove STRUCTTHISREF condition. ++ * d-decls.cc(FuncDeclaration::toSymbol): Likewise. ++ * d-elem.cc(ThisExp::toElem): Likewise. ++ * d-ctype.cc(TypeSArray::toCtype): Remove SARRAYVALUE condition. ++ * d-codegen.cc(IRState::isDeclarationReferenceType): Likewise. ++ (IRState::isArgumentReferenceType): Likewise. ++ ++2013-02-01 Johannes Pfau ++ ++ * d-lang.cc(d_init): Use gcc's config system for predefined CPU versions. ++ (d_init): Fix definition of D_LP64 version. ++ * setup-gcc.sh: Likewise. ++ * target-ver-syms.sh: Likewise. ++ +--- a/src/gcc/d/complex_t.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/complex_t.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,132 +0,0 @@ +-// complex_t.h -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +-// GCC is free software; you can redistribute it and/or modify it under +-// the terms of the GNU General Public License as published by the Free +-// Software Foundation; either version 3, or (at your option) any later +-// version. +- +-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY +-// WARRANTY; without even the implied warranty of MERCHANTABILITY or +-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-// for more details. +- +-// You should have received a copy of the GNU General Public License +-// along with GCC; see the file COPYING3. If not see +-// . +- +-#ifndef GCC_DCMPLR_COMPLEX_T_H +-#define GCC_DCMPLR_COMPLEX_T_H +- +-/* Roll our own complex type for compilers that don't support complex +- */ +- +- +-struct complex_t +-{ +- longdouble re; +- longdouble im; +- +- complex_t (void) +- { +- this->re = 0; +- this->im = 0; +- } +- +- complex_t (longdouble re) +- { +- this->re = re; +- this->im = 0; +- } +- +- complex_t (longdouble re, longdouble im) +- { +- this->re = re; +- this->im = im; +- } +- +- complex_t operator+ (complex_t y) +- { +- complex_t r; +- r.re = this->re + y.re; +- r.im = this->im + y.im; +- return r; +- } +- +- complex_t operator- (complex_t y) +- { +- complex_t r; +- r.re = this->re - y.re; +- r.im = this->im - y.im; +- return r; +- } +- +- complex_t operator- (void) +- { +- complex_t r; +- r.re = -this->re; +- r.im = -this->im; +- return r; +- } +- +- complex_t operator* (complex_t y) +- { return complex_t (this->re * y.re - this->im * y.im, this->im * y.re + this->re * y.im); } +- +- complex_t operator/ (complex_t y) +- { +- longdouble abs_y_re = y.re.isNegative() ? -y.re : y.re; +- longdouble abs_y_im = y.im.isNegative() ? -y.im : y.im; +- longdouble r, den; +- +- if (abs_y_re < abs_y_im) +- { +- r = y.re / y.im; +- den = y.im + r * y.re; +- return complex_t ((this->re * r + this->im) / den, +- (this->im * r - this->re) / den); +- } +- else +- { +- r = y.im / y.re; +- den = y.re + r * y.im; +- return complex_t ((this->re + r * this->im) / den, +- (this->im - r * this->re) / den); +- } +- } +- +- operator bool (void) +- { return !re.isZero() || !im.isZero(); } +- +- int operator== (complex_t y) +- { return this->re == y.re && this->im == y.im; } +- +- int operator!= (complex_t y) +- { return this->re != y.re || this->im != y.im; } +-}; +- +-inline complex_t operator* (longdouble x, complex_t y) +-{ +- return complex_t (x) * y; +-} +- +-inline complex_t operator* (complex_t x, longdouble y) +-{ +- return x * complex_t (y); +-} +- +-inline complex_t operator/ (complex_t x, longdouble y) +-{ +- return x / complex_t (y); +-} +- +-inline longdouble creall (complex_t x) +-{ +- return x.re; +-} +- +-inline longdouble cimagl (complex_t x) +-{ +- return x.im; +-} +- +-#endif +--- a/src/gcc/d/config-lang.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/config-lang.in 2014-04-01 16:32:51.000000000 +0100 +@@ -1,7 +1,7 @@ + # config-lang.in for D front-end + + # GDC -- D front-end for GCC +-# Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++# Copyright (C) 2011-2013 Free Software Foundation, Inc. + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -14,20 +14,25 @@ + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with GCC; see the file COPYING3. If not see +-# . ++# along with this program. If not, see . ++ ++# Configure looks for the existence of this file to auto-config each language. ++# We define several parameters used by configure: ++# ++# language - name of language as it would appear in $(LANGUAGES) ++# compilers - value to add to $(COMPILERS) + + language="d" + + compilers="cc1d\$(exeext)" + +-stagestuff="gdc\$(exeext) gdc-cross\$(exeext) cc1d\$(exeext)" +- +-gtfiles="\$(srcdir)/d/d-lang.h \$(srcdir)/d/d-builtins.c" ++target_libs="target-libphobos target-zlib target-libbacktrace" + +-target_libs="target-libphobos target-zlib" +- +-lang_requires=c++ ++# The D frontend is written in C++, so we need to build the C++ ++# compiler during stage 1. + lang_requires_boot_languages=c++ + ++gtfiles="\$(srcdir)/d/d-builtins.c \$(srcdir)/d/d-lang.h" ++ ++# Do not build by default. + build_by_default="no" +--- a/src/gcc/d/d-asmstmt.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-asmstmt.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-asmstmt.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -49,7 +49,7 @@ AsmStatement::toIR (IRState *) + ExtAsmStatement::ExtAsmStatement (Loc loc, Expression *insn, + Expressions *args, Identifiers *names, + Expressions *constraints, int outputargs, +- Expressions *clobbers, Dsymbols * labels) ++ Expressions *clobbers) + : Statement (loc) + { + this->insn = insn; +@@ -58,7 +58,6 @@ ExtAsmStatement::ExtAsmStatement (Loc lo + this->constraints = constraints; + this->outputargs = outputargs; + this->clobbers = clobbers; +- this->labels = labels; + } + + // Create a copy of ExtAsmStatement. +@@ -70,15 +69,13 @@ ExtAsmStatement::syntaxCopy (void) + Expressions *args = NULL; + Expressions *constraints = NULL; + Expressions *clobbers = NULL; +- Dsymbols *labels = NULL; + + args = Expression::arraySyntaxCopy (this->args); + constraints = Expression::arraySyntaxCopy (this->constraints); + clobbers = Expression::arraySyntaxCopy (this->clobbers); +- labels = Dsymbol::arraySyntaxCopy (this->labels); + + return new ExtAsmStatement (this->loc, insn, args, this->names, constraints, +- this->outputargs, clobbers, labels); ++ this->outputargs, clobbers); + } + + // Semantically analyze ExtAsmStatement where SC is the scope of the statment. +@@ -200,9 +197,10 @@ ExtAsmStatement::toCBuffer (OutBuffer *b + + // TRUE if statement 'comes from' somewhere else, like a goto. + +-int ExtAsmStatement::comeFrom() ++bool ++ExtAsmStatement::comeFromImpl() + { +- return 1; ++ return true; + } + + // Return how an ExtAsmStatement exits. +--- a/src/gcc/d/d-builtins.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-builtins.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + /* d-builtins.c -- D frontend for GCC. +- Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc. ++ Copyright (C) 2011-2013 Free Software Foundation, Inc. + + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free +@@ -24,13 +24,23 @@ + #include "template.h" + #include "d-codegen.h" + +-static tree bi_fn_list; +-static tree bi_lib_list; +-static tree bi_type_list; ++static GTY(()) vec *gcc_builtins_functions = NULL; ++static GTY(()) vec *gcc_builtins_libfuncs = NULL; ++static GTY(()) vec *gcc_builtins_types = NULL; + + // Necessary for built-in struct types +-static Array builtin_converted_types; +-static Dsymbols builtin_converted_decls; ++struct builtin_sym ++{ ++ builtin_sym (Dsymbol *d, Type *t, tree c) ++ : decl(d), dtype(t), ctype(c) ++ { } ++ ++ Dsymbol *decl; ++ Type *dtype; ++ tree ctype; ++}; ++ ++static vec *builtin_converted_decls = NULL; + + // Built-in symbols that require special handling. + static Module *std_intrinsic_module; +@@ -71,7 +81,6 @@ tree d_global_trees[DTI_MAX]; + static Type * + gcc_type_to_d_type (tree t) + { +- Expression *e; + Type *d; + unsigned type_size; + bool is_unsigned; +@@ -121,7 +130,7 @@ gcc_type_to_d_type (tree t) + return Type::tbool; + + case INTEGER_TYPE: +- type_size = tree_low_cst (TYPE_SIZE_UNIT (t), 1); ++ type_size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (t)); + is_unsigned = TYPE_UNSIGNED (t); + + // This search assumes that integer types come before char and bit... +@@ -136,7 +145,7 @@ gcc_type_to_d_type (tree t) + break; + + case REAL_TYPE: +- type_size = tree_low_cst (TYPE_SIZE_UNIT (t), 1); ++ type_size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (t)); + for (size_t i = 0; i < TMAX; i++) + { + d = Type::basic[i]; +@@ -146,7 +155,7 @@ gcc_type_to_d_type (tree t) + break; + + case COMPLEX_TYPE: +- type_size = tree_low_cst (TYPE_SIZE_UNIT (t), 1); ++ type_size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (t)); + for (size_t i = 0; i < TMAX; i++) + { + d = Type::basic[i]; +@@ -170,10 +179,7 @@ gcc_type_to_d_type (tree t) + length = size_binop (PLUS_EXPR, size_one_node, + convert (sizetype, length)); + +- e = new IntegerExp (0, tree_to_hwi (length), +- Type::tindex); +- d = new TypeSArray (d, e); +- d = d->semantic (0, NULL); ++ d = TypeSArray::makeType (Loc(), d, tree_to_hwi (length)); + d->ctype = t; + return d; + } +@@ -183,8 +189,7 @@ gcc_type_to_d_type (tree t) + d = gcc_type_to_d_type (TREE_TYPE (t)); + if (d) + { +- e = new IntegerExp (0, TYPE_VECTOR_SUBPARTS (t), Type::tindex); +- d = new TypeSArray (d, e); ++ d = TypeSArray::makeType (Loc(), d, TYPE_VECTOR_SUBPARTS (t)); + + if (d->nextOf()->isTypeBasic() == NULL) + break; +@@ -194,18 +199,17 @@ gcc_type_to_d_type (tree t) + if (type_size != 8 && type_size != 16 && type_size != 32) + break; + +- d = new TypeVector (0, d); +- d = d->semantic (0, NULL); ++ d = new TypeVector (Loc(), d); + return d; + } + break; + + case RECORD_TYPE: +- for (size_t i = 0; i < builtin_converted_types.dim; i += 2) ++ for (size_t i = 0; i < vec_safe_length (builtin_converted_decls); ++i) + { +- tree ti = (tree) builtin_converted_types.data[i]; ++ tree ti = (*builtin_converted_decls)[i]->ctype; + if (TYPE_MAIN_VARIANT (ti) == TYPE_MAIN_VARIANT (t)) +- return (Type *) builtin_converted_types.data[i + 1]; ++ return (*builtin_converted_decls)[i]->dtype; + } + + if (TYPE_NAME (t)) +@@ -217,7 +221,7 @@ gcc_type_to_d_type (tree t) + structname = structname_buf; + } + +- sdecl = new StructDeclaration (0, Lexer::idPool (structname)); ++ sdecl = new StructDeclaration (Loc(), Lexer::idPool (structname)); + // The gcc.builtins module may not exist yet, so cannot set + // sdecl->parent here. If it is va_list, the parent needs to + // be set to the object module which will not exist when +@@ -225,22 +229,18 @@ gcc_type_to_d_type (tree t) + sdecl->structsize = int_size_in_bytes (t); + sdecl->alignsize = TYPE_ALIGN_UNIT (t); + sdecl->sizeok = SIZEOKdone; +- +- d = new TypeStruct (sdecl); +- d->ctype = t; +- +- sdecl->type = d; +- sdecl->handle = d; ++ sdecl->type = new TypeStruct (sdecl); ++ sdecl->type->ctype = t; ++ sdecl->handle = sdecl->type; ++ sdecl->type->merge(); + + // Does not seem necessary to convert fields, but the + // members field must be non-null for the above size + // setting to stick. + sdecl->members = new Dsymbols; +- +- builtin_converted_types.push (t); +- builtin_converted_types.push (d); +- builtin_converted_decls.push (sdecl); +- return d; ++ d = sdecl->type; ++ vec_safe_push (builtin_converted_decls, new builtin_sym (sdecl, d, t)); ++ return sdecl->type; + + case FUNCTION_TYPE: + typefunc_ret= gcc_type_to_d_type (TREE_TYPE (t)); +@@ -290,30 +290,6 @@ gcc_type_to_d_type (tree t) + } + + +-// Hook from d_builtin_function. +-// Add DECL to builtin functions list for maybe processing later +-// if gcc.builtins was imported into the current module. +- +-void +-d_bi_builtin_func (tree decl) +-{ +- if (!flag_no_builtin && DECL_ASSEMBLER_NAME_SET_P (decl)) +- bi_lib_list = chainon (bi_lib_list, build_tree_list (0, decl)); +- +- bi_fn_list = chainon (bi_fn_list, build_tree_list (0, decl)); +-} +- +-// Hook from d_register_builtin_type. +-// Add DECL to builtin types list for maybe processing later +-// if gcc.builtins was imported into the current module. +- +-void +-d_bi_builtin_type (tree decl) +-{ +- bi_type_list = chainon (bi_type_list, build_tree_list (0, decl)); +-} +- +- + // Returns TRUE if M is a module that contains specially handled intrinsics. + // If module was never imported into current compilation, return false. + +@@ -445,10 +421,10 @@ static void + d_gcc_magic_builtins_module (Module *m) + { + Dsymbols *funcs = new Dsymbols; ++ tree decl; + +- for (tree n = bi_fn_list; n != NULL_TREE; n = TREE_CHAIN (n)) ++ for (size_t i = 0; vec_safe_iterate (gcc_builtins_functions, i, &decl); ++i) + { +- tree decl = TREE_VALUE (n); + const char *name = IDENTIFIER_POINTER (DECL_NAME (decl)); + TypeFunction *dtf = (TypeFunction *) gcc_type_to_d_type (TREE_TYPE (decl)); + +@@ -460,33 +436,34 @@ d_gcc_magic_builtins_module (Module *m) + if (dtf->parameters && dtf->parameters->dim == 0 && dtf->varargs) + continue; + +- // %% D2 - builtins are trusted and optionally nothrow. +- // The purity of a builtins can vary depending on compiler +- // flags set at init, or by the -foptions passed, such as ++ // D2 @safe/pure/nothrow functions. ++ // It is assumed that builtins solely provided by the compiler are ++ // considered @safe, pure and nothrow. Builtins that correspond to ++ // functions in the standard library that don't throw are considered ++ // @trusted. The purity of a builtin can vary depending on compiler ++ // flags set upon initialisation, or by the -foptions passed, such as + // flag_unsafe_math_optimizations. +- +- // Similiarly, if a builtin does not correspond to a function +- // in the standard library (is provided by the compiler), then +- // will also mark the function as weakly pure in the D frontend. +- dtf->trust = TREE_NOTHROW (decl) ? TRUSTtrusted : TRUSTsystem; +- dtf->isnothrow = TREE_NOTHROW (decl); ++ dtf->isnothrow = TREE_NOTHROW (decl) || !DECL_ASSEMBLER_NAME_SET_P (decl); + dtf->purity = DECL_PURE_P (decl) ? PUREstrong : + TREE_READONLY (decl) ? PUREconst : + DECL_IS_NOVOPS (decl) ? PUREweak : + !DECL_ASSEMBLER_NAME_SET_P (decl) ? PUREweak : + PUREimpure; ++ dtf->trust = !DECL_ASSEMBLER_NAME_SET_P (decl) ? TRUSTsafe : ++ TREE_NOTHROW (decl) ? TRUSTtrusted : ++ TRUSTsystem; + +- FuncDeclaration *func = new FuncDeclaration (0, 0, Lexer::idPool (name), ++ FuncDeclaration *func = new FuncDeclaration (Loc(), Loc(), Lexer::idPool (name), + STCextern, dtf); +- func->isym = new Symbol; +- func->isym->Stree = decl; ++ func->csym = new Symbol; ++ func->csym->Sident = name; ++ func->csym->Stree = decl; + + funcs->push (func); + } + +- for (tree n = bi_type_list; n != NULL_TREE; n = TREE_CHAIN (n)) ++ for (size_t i = 0; vec_safe_iterate (gcc_builtins_types, i, &decl); ++i) + { +- tree decl = TREE_VALUE (n); + tree type = TREE_TYPE (decl); + const char *name = IDENTIFIER_POINTER (DECL_NAME (decl)); + Type *dt = gcc_type_to_d_type (type); +@@ -494,7 +471,7 @@ d_gcc_magic_builtins_module (Module *m) + if (!dt) + continue; + +- funcs->push (new AliasDeclaration (0, Lexer::idPool (name), dt)); ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool (name), dt)); + } + + // Iterate through the target-specific builtin types for va_list. +@@ -510,13 +487,13 @@ d_gcc_magic_builtins_module (Module *m) + if (!dt) + continue; + +- funcs->push (new AliasDeclaration (0, Lexer::idPool (name), dt)); ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool (name), dt)); + } + } + +- for (size_t i = 0; i < builtin_converted_decls.dim ; ++i) ++ for (size_t i = 0; i < vec_safe_length (builtin_converted_decls); ++i) + { +- Dsymbol *sym = builtin_converted_decls[i]; ++ Dsymbol *sym = (*builtin_converted_decls)[i]->decl; + // va_list is a pain. It can be referenced without importing + // gcc.builtins so it really needs to go in the object module. + if (!sym->parent) +@@ -524,48 +501,48 @@ d_gcc_magic_builtins_module (Module *m) + Declaration *decl = sym->isDeclaration(); + if (!decl || decl->type != Type::tvalist) + { +- sym->parent = m; + // Currently, there is no need to run semantic, but we do + // want to output inits, etc. ++ sym->parent = m; + funcs->push (sym); + } + } + } + + // va_list should already be built, so no need to convert to D type again. +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_va_list"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_va_list"), + Type::tvalist)); + + // Provide access to target-specific integer types. +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_clong"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_clong"), + gcc_type_to_d_type (long_integer_type_node))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_culong"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_culong"), + gcc_type_to_d_type (long_unsigned_type_node))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_machine_byte"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_machine_byte"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (byte_mode, 0)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_machine_ubyte"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_machine_ubyte"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (byte_mode, 1)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_machine_int"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_machine_int"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (word_mode, 0)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_machine_uint"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_machine_uint"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (word_mode, 1)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_pointer_int"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_pointer_int"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (ptr_mode, 0)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_pointer_uint"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_pointer_uint"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (ptr_mode, 1)))); + + // _Unwind_Word has it's own target specific mode. +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_unwind_int"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_unwind_int"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (targetm.unwind_word_mode(), 0)))); + +- funcs->push (new AliasDeclaration (0, Lexer::idPool ("__builtin_unwind_uint"), ++ funcs->push (new AliasDeclaration (Loc(), Lexer::idPool ("__builtin_unwind_uint"), + gcc_type_to_d_type (lang_hooks.types.type_for_mode (targetm.unwind_word_mode(), 1)))); + + m->members->push (new LinkDeclaration (LINKc, funcs)); +@@ -595,9 +572,10 @@ d_gcc_magic_libbuiltins_check (Dsymbol * + } + else if (fd && !fd->fbody) + { +- for (tree n = bi_lib_list; n != NULL_TREE; n = TREE_CHAIN (n)) ++ tree decl; ++ ++ for (size_t i = 0; vec_safe_iterate (gcc_builtins_libfuncs, i, &decl); ++i) + { +- tree decl = TREE_VALUE (n); + gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl)); + + const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); +@@ -614,8 +592,9 @@ d_gcc_magic_libbuiltins_check (Dsymbol * + (*tf->parameters)[i]->storageClass |= STCref; + } + } +- fd->isym = new Symbol; +- fd->isym->Stree = decl; ++ fd->csym = new Symbol; ++ fd->csym->Sident = name; ++ fd->csym->Stree = decl; + return; + } + } +@@ -649,19 +628,19 @@ d_gcc_magic_module (Module *m) + + if (md->packages->dim == 1) + { +- if (!strcmp ((md->packages->tdata()[0])->string, "gcc")) ++ if (!strcmp ((*md->packages)[0]->string, "gcc")) + { + if (!strcmp (md->id->string, "builtins")) + d_gcc_magic_builtins_module (m); + } +- else if (!strcmp ((md->packages->tdata()[0])->string, "core")) ++ else if (!strcmp ((*md->packages)[0]->string, "core")) + { + if (!strcmp (md->id->string, "bitop")) + std_intrinsic_module = m; + else if (!strcmp (md->id->string, "math")) + core_math_module = m; + } +- else if (!strcmp ((md->packages->tdata()[0])->string, "std")) ++ else if (!strcmp ((*md->packages)[0]->string, "std")) + { + if (!strcmp (md->id->string, "math")) + std_math_module = m; +@@ -669,8 +648,8 @@ d_gcc_magic_module (Module *m) + } + else if (md->packages->dim == 2) + { +- if (!strcmp ((md->packages->tdata()[0])->string, "core") +- && !strcmp ((md->packages->tdata()[1])->string, "stdc")) ++ if (!strcmp ((*md->packages)[0]->string, "core") ++ && !strcmp ((*md->packages)[1]->string, "stdc")) + { + if (!strcmp (md->id->string, "stdarg")) + d_gcc_magic_stdarg_module (m); +@@ -699,31 +678,51 @@ gcc_cst_to_d_expr (tree cst) + complex_t value; + value.re = TREE_REAL_CST (TREE_REALPART (cst)); + value.im = TREE_REAL_CST (TREE_IMAGPART (cst)); +- return new ComplexExp (0, value, type); ++ return new ComplexExp (Loc(), value, type); + } + else if (code == INTEGER_CST) + { +- dinteger_t value = cst_to_hwi (TREE_INT_CST (cst)); +- return new IntegerExp (0, value, type); ++ dinteger_t value = tree_to_hwi (cst); ++ return new IntegerExp (Loc(), value, type); + } + else if (code == REAL_CST) + { +- real_t value = TREE_REAL_CST (cst); +- return new RealExp (0, value, type); ++ real_value value = TREE_REAL_CST (cst); ++ return new RealExp (Loc(), ldouble(value), type); + } + else if (code == STRING_CST) + { + const void *string = TREE_STRING_POINTER (cst); + size_t len = TREE_STRING_LENGTH (cst); +- return new StringExp (0, CONST_CAST (void *, string), len); ++ return new StringExp (Loc(), CONST_CAST (void *, string), len); ++ } ++ else if (code == VECTOR_CST) ++ { ++ dinteger_t nunits = VECTOR_CST_NELTS (cst); ++ Expressions *elements = new Expressions; ++ elements->setDim (nunits); ++ ++ for (size_t i = 0; i < nunits; i++) ++ { ++ Expression *elem = gcc_cst_to_d_expr (VECTOR_CST_ELT (cst, i)); ++ if (elem == NULL) ++ return NULL; ++ ++ (*elements)[i] = elem; ++ } ++ ++ Expression *e = new ArrayLiteralExp (Loc(), elements); ++ e->type = ((TypeVector *) type)->basetype; ++ ++ return new VectorExp (Loc(), e, type); + } + } ++ + return NULL; + } + +-// Helper for d_gcc_eval_builtin. Evaluate builtin D +-// function BUILTIN whose argument list is ARGUMENTS. +-// Return result; NULL if cannot evaluate it. ++// Helper for d_gcc_eval_builtin. Evaluate builtin D function BUILTIN whose ++// argument list is ARGUMENTS. Return result; NULL if cannot evaluate it. + + Expression * + eval_builtin (Loc loc, BUILTIN builtin, Expressions *arguments) +@@ -732,10 +731,10 @@ eval_builtin (Loc loc, BUILTIN builtin, + Expression *arg0 = (*arguments)[0]; + Type *t0 = arg0->type; + +- static IRState irs; + tree callee = NULL_TREE; + tree result; +- irs.doLineNote (loc); ++ ++ set_input_location (loc); + + switch (builtin) + { +@@ -806,14 +805,14 @@ eval_builtin (Loc loc, BUILTIN builtin, + } + + TypeFunction *tf = (TypeFunction *) gcc_type_to_d_type (TREE_TYPE (callee)); +- result = irs.call (tf, callee, NULL, arguments); ++ result = d_build_call (tf, callee, NULL, arguments); + result = fold (result); + + // Special case bsr. + if (builtin == BUILTINbsr) + { + tree type = t0->toCtype(); +- tree lhs = size_int (tree_low_cst (TYPE_SIZE (type), 1) - 1); ++ tree lhs = size_int (TREE_INT_CST_LOW (TYPE_SIZE (type)) - 1); + result = fold_build2(MINUS_EXPR, type, + fold_convert (type, lhs), result); + } +@@ -826,7 +825,6 @@ eval_builtin (Loc loc, BUILTIN builtin, + } + + return e; +- + } + + // Evaluate builtin D function FD whose argument list is ARGUMENTS. +@@ -845,10 +843,8 @@ d_gcc_eval_builtin (Loc loc, FuncDeclara + TypeFunction *tf = (TypeFunction *) fd->type; + tree callee = NULL_TREE; + +- // cirstate is not available. +- IRState irs; +- irs.doLineNote (loc); +- tree result = irs.call (tf, callee, NULL, arguments); ++ set_input_location (loc); ++ tree result = d_build_call (tf, callee, NULL, arguments); + result = fold (result); + + // Builtin should be successfully evaluated. +@@ -860,27 +856,85 @@ d_gcc_eval_builtin (Loc loc, FuncDeclara + } + } + ++// Perform a reinterpret cast of EXPR to type TYPE for use in CTFE. ++// The front end should have already ensured that EXPR is a constant, ++// so we just lower the value to GCC and return the converted CST. ++ + Expression * + d_gcc_paint_type (Expression *expr, Type *type) + { + /* We support up to 512-bit values. */ + unsigned char buffer[64]; +- int len; +- Expression *e; + tree cst; + +- if (type->isintegral()) ++ Type *tb = type->toBasetype(); ++ ++ if (expr->type->isintegral()) ++ cst = build_integer_cst (expr->toInteger(), expr->type->toCtype()); ++ else if (expr->type->isfloating()) + cst = build_float_cst (expr->toReal(), expr->type); ++ else if (expr->op == TOKarrayliteral) ++ { ++ // Build array as VECTOR_CST, assumes EXPR is constant. ++ Expressions *elements = ((ArrayLiteralExp *) expr)->elements; ++ vec *elms = NULL; ++ ++ vec_safe_reserve (elms, elements->dim); ++ for (size_t i = 0; i < elements->dim; i++) ++ { ++ Expression *e = (*elements)[i]; ++ if (e->type->isintegral()) ++ { ++ tree value = build_integer_cst (e->toInteger(), e->type->toCtype()); ++ CONSTRUCTOR_APPEND_ELT (elms, size_int (i), value); ++ } ++ else if (e->type->isfloating()) ++ { ++ tree value = build_float_cst (e->toReal(), e->type); ++ CONSTRUCTOR_APPEND_ELT (elms, size_int (i), value); ++ } ++ else ++ gcc_unreachable(); ++ } ++ ++ // Build vector type. ++ int nunits = ((TypeSArray *) expr->type)->dim->toUInteger(); ++ Type *telem = expr->type->nextOf(); ++ tree vectype = build_vector_type (telem->toCtype(), nunits); ++ ++ cst = build_vector_from_ctor (vectype, elms); ++ } + else +- cst = build_integer_cst (expr->toInteger(), expr->type->toCtype()); ++ gcc_unreachable(); + +- len = native_encode_expr (cst, buffer, sizeof (buffer)); +- cst = native_interpret_expr (type->toCtype(), buffer, len); ++ // Encode CST to buffer. ++ int len = native_encode_expr (cst, buffer, sizeof (buffer)); + +- e = gcc_cst_to_d_expr (cst); +- gcc_assert (e != NULL); ++ if (tb->ty == Tsarray) ++ { ++ // Interpret value as a vector of the same size, ++ // then return the array literal. ++ int nunits = ((TypeSArray *) type)->dim->toUInteger(); ++ Type *elem = type->nextOf(); ++ tree vectype = build_vector_type (elem->toCtype(), nunits); + +- return e; ++ cst = native_interpret_expr (vectype, buffer, len); ++ ++ Expression *e = gcc_cst_to_d_expr (cst); ++ gcc_assert (e != NULL && e->op == TOKvector); ++ ++ return ((VectorExp *) e)->e1; ++ } ++ else ++ { ++ // Normal interpret cast. ++ cst = native_interpret_expr (type->toCtype(), buffer, len); ++ ++ Expression *e = gcc_cst_to_d_expr (cst); ++ gcc_assert (e != NULL); ++ ++ return e; ++ } + } + + /* Used to help initialize the builtin-types.def table. When a type of +@@ -979,9 +1033,9 @@ lookup_ctype_name (const char *p) + } + + static void +-do_build_builtin_fn (enum built_in_function fncode, ++do_build_builtin_fn (built_in_function fncode, + const char *name, +- enum built_in_class fnclass, ++ built_in_class fnclass, + tree fntype, bool both_p, bool fallback_p, + tree fnattrs, bool implicit_p) + { +@@ -1014,6 +1068,7 @@ enum d_builtin_type + #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, + #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, + #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, ++#define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, + #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, + #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, + #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, +@@ -1031,6 +1086,7 @@ enum d_builtin_type + #undef DEF_FUNCTION_TYPE_5 + #undef DEF_FUNCTION_TYPE_6 + #undef DEF_FUNCTION_TYPE_7 ++#undef DEF_FUNCTION_TYPE_8 + #undef DEF_FUNCTION_TYPE_VAR_0 + #undef DEF_FUNCTION_TYPE_VAR_1 + #undef DEF_FUNCTION_TYPE_VAR_2 +@@ -1177,7 +1233,7 @@ d_init_builtins (void) + D_TYPE_IMAGINARY_FLOAT (d_ireal_type_node) = 1; + + /* Used for ModuleInfo, ClassInfo, and Interface decls. */ +- d_unknown_type_node = make_node (LANG_TYPE); ++ d_unknown_type_node = make_node (RECORD_TYPE); + + { + /* Make sure we get a unique function type, so we can give +@@ -1217,6 +1273,10 @@ d_init_builtins (void) + #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7) \ + def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7); ++#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ++ ARG6, ARG7, ARG8) \ ++ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ++ ARG7, ARG8); + #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ + def_fn_type (ENUM, RETURN, 1, 0); + #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ +@@ -1241,6 +1301,8 @@ d_init_builtins (void) + #undef DEF_FUNCTION_TYPE_4 + #undef DEF_FUNCTION_TYPE_5 + #undef DEF_FUNCTION_TYPE_6 ++#undef DEF_FUNCTION_TYPE_7 ++#undef DEF_FUNCTION_TYPE_8 + #undef DEF_FUNCTION_TYPE_VAR_0 + #undef DEF_FUNCTION_TYPE_VAR_1 + #undef DEF_FUNCTION_TYPE_VAR_2 +@@ -1267,7 +1329,10 @@ d_init_builtins (void) + build_common_builtin_nodes (); + } + +-/* Registration of machine- or os-specific builtin types. */ ++/* Registration of machine- or os-specific builtin types. ++ Add to builtin types list for maybe processing later ++ if gcc.builtins was imported into the current module. */ ++ + void + d_register_builtin_type (tree type, const char *name) + { +@@ -1278,28 +1343,25 @@ d_register_builtin_type (tree type, cons + if (!TYPE_NAME (type)) + TYPE_NAME (type) = decl; + +- d_bi_builtin_type (decl); ++ vec_safe_push (gcc_builtins_types, decl); + } + +-/* Return a definition for a builtin function named NAME and whose data type +- is TYPE. TYPE should be a function type with argument types. +- FUNCTION_CODE tells later passes how to compile calls to this function. +- See tree.h for its possible values. +- +- If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, +- the name to be called if we can't opencode the function. If +- ATTRS is nonzero, use that for the function's attribute list. */ ++/* Add DECL to builtin functions list for maybe processing later ++ if gcc.builtins was imported into the current module. */ + + tree + d_builtin_function (tree decl) + { +- d_bi_builtin_func (decl); ++ if (!flag_no_builtin && DECL_ASSEMBLER_NAME_SET_P (decl)) ++ vec_safe_push (gcc_builtins_libfuncs, decl); ++ ++ vec_safe_push (gcc_builtins_functions, decl); + return decl; + } + + + /* Table of machine-independent attributes supported in GIMPLE. */ +-const struct attribute_spec d_builtins_attribute_table[] = ++const attribute_spec d_builtins_attribute_table[] = + { + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, + affects_type_identity } */ +@@ -1345,7 +1407,7 @@ const struct attribute_spec d_builtins_a + /* Give the specifications for the format attributes, used by C and all + descendants. */ + +-const struct attribute_spec d_format_attribute_table[] = ++const attribute_spec d_format_attribute_table[] = + { + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, + affects_type_identity } */ +@@ -1687,30 +1749,29 @@ ignore_attribute (tree * ARG_UNUSED (nod + } + + +-/* Backend init. */ ++// Backend init. + + void + d_backend_init (void) + { +- init_global_binding_level (); ++ init_global_binding_level(); + +- /* This allows the code in d-builtins2 to not have to worry about +- converting (C signed char *) to (D char *) for string arguments of +- built-in functions. +- Parameters are (signed_char = false, short_double = false). */ ++ // This allows the code in d-builtins.c to not have to worry about ++ // converting (C signed char *) to (D char *) for string arguments of ++ // built-in functions. ++ // Parameters are (signed_char = false, short_double = false). + build_common_tree_nodes (false, false); + +- d_init_builtins (); ++ d_init_builtins(); + + if (flag_exceptions) +- d_init_exceptions (); ++ d_init_exceptions(); + +- /* This is the C main, not the D main. */ ++ // This is the C main, not the D main. + main_identifier_node = get_identifier ("main"); + } + +- +-/* Backend term. */ ++// Backend term. + + void + d_backend_term (void) +--- a/src/gcc/d/d-codegen.cc 2013-06-02 11:37:56.000000000 +0100 ++++ b/src/gcc/d/d-codegen.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-codegen.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -25,140 +25,92 @@ + #include "dfrontend/target.h" + + +-Module *cmodule; +-IRState *cirstate; +-ObjectFile *object_file; ++Module *current_module_decl; ++IRState *current_irstate; + + +-// Public routine called from D frontend to hide from glue interface. +-// Returns TRUE if all templates are being emitted, either publicly +-// or privately, into the current compilation. +- +-bool +-d_gcc_force_templates (void) +-{ +- return ObjectFile::emitTemplates == TEprivate; +-} +- + // Return the DECL_CONTEXT for symbol DSYM. + + tree + d_decl_context (Dsymbol *dsym) + { +- Dsymbol *orig_sym = dsym; ++ Dsymbol *parent = dsym; + AggregateDeclaration *ad; + +- while ((dsym = dsym->toParent2())) ++ while ((parent = parent->toParent2())) + { +- if (dsym->isFuncDeclaration()) ++ if (parent->isFuncDeclaration()) + { +- // dwarf2out chokes without this check... (output_pubnames) +- FuncDeclaration *f = orig_sym->isFuncDeclaration(); +- if (f && !needs_static_chain (f)) ++ FuncDeclaration *fd = dsym->isFuncDeclaration(); ++ if (fd && !needs_static_chain (fd)) + return NULL_TREE; + +- return dsym->toSymbol()->Stree; ++ return parent->toSymbol()->Stree; + } +- else if ((ad = dsym->isAggregateDeclaration())) ++ else if ((ad = parent->isAggregateDeclaration())) + { + tree context = ad->type->toCtype(); ++ // Want the underlying RECORD_TYPE. + if (ad->isClassDeclaration()) +- { +- // RECORD_TYPE instead of REFERENCE_TYPE +- context = TREE_TYPE (context); +- } ++ context = TREE_TYPE (context); ++ + return context; + } +- else if (dsym->isModule()) +- return dsym->toSymbol()->ScontextDecl; ++ else if (parent->isModule()) ++ { ++ // We've reached the top-level module namespace. ++ // Set DECL_CONTEXT as the NAMESPACE_DECL of the enclosing ++ // module, but only for extern(D) symbols. ++ Declaration *decl = dsym->isDeclaration(); ++ if (decl != NULL && decl->linkage != LINKd) ++ return NULL_TREE; ++ ++ return parent->toImport()->Stree; ++ } + } + + return NULL_TREE; + } + +-// Add local variable VD into the current body. If NO_INIT, +-// then variable does not have a default initialiser. ++// Add local variable VD into the current body of function fd. + + void +-IRState::emitLocalVar (VarDeclaration *vd, bool no_init) ++build_local_var (VarDeclaration *vd, FuncDeclaration *fd) + { +- if (vd->isDataseg() || vd->isMember()) +- return; ++ gcc_assert (!vd->isDataseg() && !vd->isMember()); + + Symbol *sym = vd->toSymbol(); +- tree var_decl = sym->Stree; +- +- gcc_assert (!TREE_STATIC (var_decl)); +- pushdecl (var_decl); ++ tree var = sym->Stree; + +- if (TREE_CODE (var_decl) == CONST_DECL) +- return; ++ gcc_assert (!TREE_STATIC (var)); + +- DECL_CONTEXT (var_decl) = current_function_decl; ++ set_input_location (vd->loc); ++ d_pushdecl (var); ++ DECL_CONTEXT (var) = fd->toSymbol()->Stree; + + // Compiler generated symbols +- if (vd == this->func->vresult || vd == this->func->v_argptr +- || vd == this->func->v_arguments_var) +- DECL_ARTIFICIAL (var_decl) = 1; ++ if (vd == fd->vresult || vd == fd->v_argptr || vd == fd->v_arguments_var) ++ DECL_ARTIFICIAL (var) = 1; + +- tree var_exp; + if (sym->SframeField) + { + // Fixes debugging local variables. +- SET_DECL_VALUE_EXPR (var_decl, var (vd)); +- DECL_HAS_VALUE_EXPR_P (var_decl) = 1; +- } +- var_exp = var_decl; +- +- // Complete initializer expression (include MODIFY_EXPR, e.g.) +- tree init_exp = NULL_TREE; +- tree init_val = NULL_TREE; +- +- if (!no_init && !DECL_INITIAL (var_decl) && vd->init) +- { +- if (!vd->init->isVoidInitializer()) +- { +- ExpInitializer *exp_init = vd->init->isExpInitializer(); +- Expression *ie = exp_init->toExpression(); +- init_exp = ie->toElem (this); +- } +- else +- no_init = true; +- } +- else +- gcc_assert (vd->init == NULL); +- +- if (!no_init) +- { +- object_file->doLineNote (vd->loc); +- +- if (!init_val) +- { +- init_val = DECL_INITIAL (var_decl); +- DECL_INITIAL (var_decl) = NULL_TREE; +- } +- if (!init_exp && init_val) +- init_exp = build_vinit (var_exp, init_val); +- +- if (init_exp) +- addExp (init_exp); +- else if (!init_val && vd->size (vd->loc)) +- // Zero-length arrays do not have an initializer +- warning (OPT_Wuninitialized, "uninitialized variable '%s'", vd->ident ? vd->ident->string : "(no name)"); ++ SET_DECL_VALUE_EXPR (var, get_decl_tree (vd, fd)); ++ DECL_HAS_VALUE_EXPR_P (var) = 1; + } + } + + // Return an unnamed local temporary of type TYPE. + + tree +-build_local_var (tree type) ++build_local_temp (tree type) + { + tree decl = build_decl (BUILTINS_LOCATION, VAR_DECL, NULL_TREE, type); + + DECL_CONTEXT (decl) = current_function_decl; + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; +- pushdecl (decl); ++ d_pushdecl (decl); + + return decl; + } +@@ -205,22 +157,22 @@ maybe_temporary_var (tree exp, tree *out + // Emit an INIT_EXPR for decl DECL. + + void +-IRState::expandDecl (tree decl) ++expand_decl (tree decl) + { +- // nothing, pushdecl will add decl to a BIND_EXPR ++ // Nothing, d_pushdecl will add decl to a BIND_EXPR + if (DECL_INITIAL (decl)) + { + tree exp = build_vinit (decl, DECL_INITIAL (decl)); +- addExp (exp); ++ current_irstate->addExp (exp); + DECL_INITIAL (decl) = NULL_TREE; + } + } + +-// Return the correct decl to be used for variable VD. +-// Could be a VAR_DECL, or a FIELD_DECL from a closure. ++// Return the correct decl to be used for variable DECL accessed from ++// function FUNC. Could be a VAR_DECL, or a FIELD_DECL from a closure. + + tree +-IRState::var (Declaration *decl) ++get_decl_tree (Declaration *decl, FuncDeclaration *func) + { + VarDeclaration *vd = decl->isVarDeclaration(); + +@@ -236,12 +188,10 @@ IRState::var (Declaration *decl) + else if (vsym->SframeField != NULL_TREE) + { + // Get the closure holding the var decl. +- FuncDeclaration *fd = vd->toParent2()->isFuncDeclaration(); +- tree frame_ref = get_framedecl (this->func, fd); +- tree field = vsym->SframeField; ++ FuncDeclaration *parent = vd->toParent2()->isFuncDeclaration(); ++ tree frame_ref = get_framedecl (func, parent); + +- gcc_assert (field != NULL_TREE); +- return component_ref (build_deref (frame_ref), field); ++ return component_ref (build_deref (frame_ref), vsym->SframeField); + } + } + +@@ -255,33 +205,33 @@ tree + d_convert (tree type, tree exp) + { + // Check this first before passing to build_dtype. +- if (error_mark_p (type) || error_mark_p (TREE_TYPE (exp))) ++ if (error_operand_p (type) || error_operand_p (exp)) + return error_mark_node; + +- Type *target_type = build_dtype (type); +- Type *expr_type = build_dtype (TREE_TYPE (exp)); ++ Type *totype = build_dtype (type); ++ Type *etype = build_dtype (TREE_TYPE (exp)); + +- if (target_type && expr_type) +- return convert_expr (exp, expr_type, target_type); ++ if (totype && etype) ++ return convert_expr (exp, etype, totype); + + return convert (type, exp); + } + +-// Return expression EXP, whose type has been convert from EXP_TYPE to TARGET_TYPE. ++// Return expression EXP, whose type has been convert from ETYPE to TOTYPE. + + tree +-convert_expr (tree exp, Type *exp_type, Type *target_type) ++convert_expr (tree exp, Type *etype, Type *totype) + { + tree result = NULL_TREE; + +- gcc_assert (exp_type && target_type); +- Type *ebtype = exp_type->toBasetype(); +- Type *tbtype = target_type->toBasetype(); ++ gcc_assert (etype && totype); ++ Type *ebtype = etype->toBasetype(); ++ Type *tbtype = totype->toBasetype(); + +- if (d_types_same (exp_type, target_type)) ++ if (d_types_same (etype, totype)) + return exp; + +- if (error_mark_p (exp)) ++ if (error_operand_p (exp)) + return exp; + + switch (ebtype->ty) +@@ -290,8 +240,7 @@ convert_expr (tree exp, Type *exp_type, + if (tbtype->ty == Tdelegate) + { + exp = maybe_make_temp (exp); +- return build_delegate_cst (delegate_method (exp), delegate_object (exp), +- target_type); ++ return build_delegate_cst (delegate_method (exp), delegate_object (exp), totype); + } + else if (tbtype->ty == Tpointer) + { +@@ -301,28 +250,28 @@ convert_expr (tree exp, Type *exp_type, + } + else + { +- ::error ("can't convert a delegate expression to %s", target_type->toChars()); +- return error_mark (target_type); ++ error ("can't convert a delegate expression to %s", totype->toChars()); ++ return error_mark_node; + } + break; + + case Tstruct: + if (tbtype->ty == Tstruct) + { +- if (target_type->size() == exp_type->size()) ++ if (totype->size() == etype->size()) + { + // Allowed to cast to structs with same type size. +- result = build_vconvert (target_type->toCtype(), exp); ++ result = build_vconvert (totype->toCtype(), exp); + } + else if (tbtype->ty == Taarray) + { + tbtype = ((TypeAArray *) tbtype)->getImpl()->type; +- return convert_expr (exp, exp_type, tbtype); ++ return convert_expr (exp, etype, tbtype); + } + else + { +- ::error ("can't convert struct %s to %s", exp_type->toChars(), target_type->toChars()); +- return error_mark (target_type); ++ error ("can't convert struct %s to %s", etype->toChars(), totype->toChars()); ++ return error_mark_node; + } + } + // else, default conversion, which should produce an error +@@ -331,62 +280,56 @@ convert_expr (tree exp, Type *exp_type, + case Tclass: + if (tbtype->ty == Tclass) + { +- ClassDeclaration *target_class_decl = ((TypeClass *) tbtype)->sym; +- ClassDeclaration *obj_class_decl = ((TypeClass *) ebtype)->sym; +- bool use_dynamic = false; ++ ClassDeclaration *cdfrom = tbtype->isClassHandle(); ++ ClassDeclaration *cdto = ebtype->isClassHandle(); + int offset; + +- if (target_class_decl->isBaseOf (obj_class_decl, &offset)) ++ if (cdfrom->isBaseOf (cdto, &offset) && offset != OFFSET_RUNTIME) + { + // Casting up the inheritance tree: Don't do anything special. + // Cast to an implemented interface: Handle at compile time. +- if (offset == OFFSET_RUNTIME) +- use_dynamic = true; +- else if (offset) ++ if (offset) + { +- tree t = target_type->toCtype(); ++ tree t = totype->toCtype(); + exp = maybe_make_temp (exp); + return build3 (COND_EXPR, t, + build_boolop (NE_EXPR, exp, d_null_pointer), + build_nop (t, build_offset (exp, size_int (offset))), + build_nop (t, d_null_pointer)); + } +- else +- { +- // d_convert will make a NOP cast +- break; +- } +- } +- else if (target_class_decl == obj_class_decl) +- { +- // d_convert will make a NOP cast ++ ++ // d_convert will make a no-op cast + break; + } +- else if (!obj_class_decl->isCOMclass()) +- use_dynamic = true; + +- if (use_dynamic) +- { +- // Otherwise, do dynamic cast +- tree args[2]; ++ // More cases for no-op cast ++ if (cdfrom == cdto) ++ break; + +- args[0] = exp; +- args[1] = build_address (target_class_decl->toSymbol()->Stree); ++ if (cdfrom->cpp && cdto->cpp) ++ break; + +- return build_libcall (obj_class_decl->isInterfaceDeclaration() +- ? LIBCALL_INTERFACE_CAST : LIBCALL_DYNAMIC_CAST, 2, args); +- } +- else ++ // Casting from a C++ interface to a class/non-C++ interface ++ // always results in null as there is no runtime information, ++ // and no way one can derive from the other. ++ if (cdto->isCOMclass() || cdfrom->cpp != cdto->cpp) + { +- warning (OPT_Wcast_result, "cast to %s will produce null result", target_type->toChars()); +- result = d_convert (target_type->toCtype(), d_null_pointer); ++ warning (OPT_Wcast_result, "cast to %s will produce null result", totype->toChars()); ++ result = d_convert (totype->toCtype(), d_null_pointer); ++ // Make sure the expression is still evaluated if necessary + if (TREE_SIDE_EFFECTS (exp)) +- { +- // make sure the expression is still evaluated if necessary +- result = compound_expr (exp, result); +- } ++ result = compound_expr (exp, result); ++ + return result; + } ++ ++ // The offset can only be determined at runtime, do dynamic cast ++ tree args[2]; ++ args[0] = exp; ++ args[1] = build_address (cdfrom->toSymbol()->Stree); ++ ++ return build_libcall (cdto->isInterfaceDeclaration() ++ ? LIBCALL_INTERFACE_CAST : LIBCALL_DYNAMIC_CAST, 2, args); + } + // else default conversion + break; +@@ -394,7 +337,7 @@ convert_expr (tree exp, Type *exp_type, + case Tsarray: + if (tbtype->ty == Tpointer) + { +- result = build_nop (target_type->toCtype(), build_address (exp)); ++ result = build_nop (totype->toCtype(), build_address (exp)); + } + else if (tbtype->ty == Tarray) + { +@@ -406,40 +349,40 @@ convert_expr (tree exp, Type *exp_type, + + if ((dim * esize) % tsize != 0) + { +- ::error ("cannot cast %s to %s since sizes don't line up", +- exp_type->toChars(), target_type->toChars()); +- return error_mark (target_type); ++ error ("cannot cast %s to %s since sizes don't line up", ++ etype->toChars(), totype->toChars()); ++ return error_mark_node; + } + dim = (dim * esize) / tsize; + + // Assumes casting to dynamic array of same type or void +- return d_array_value (target_type->toCtype(), +- size_int (dim), build_nop (ptrtype, build_address (exp))); ++ return d_array_value (totype->toCtype(), size_int (dim), ++ build_nop (ptrtype, build_address (exp))); + } + else if (tbtype->ty == Tsarray) + { + // D apparently allows casting a static array to any static array type +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + } + else if (tbtype->ty == Tstruct) + { + // And allows casting a static array to any struct type too. + // %% type sizes should have already been checked by the frontend. +- gcc_assert (target_type->size() == exp_type->size()); +- result = build_vconvert (target_type->toCtype(), exp); ++ gcc_assert (totype->size() == etype->size()); ++ result = build_vconvert (totype->toCtype(), exp); + } + else + { +- ::error ("cannot cast expression of type %s to type %s", +- exp_type->toChars(), target_type->toChars()); +- return error_mark (target_type); ++ error ("cannot cast expression of type %s to type %s", ++ etype->toChars(), totype->toChars()); ++ return error_mark_node; + } + break; + + case Tarray: + if (tbtype->ty == Tpointer) + { +- return d_convert (target_type->toCtype(), d_array_ptr (exp)); ++ return d_convert (totype->toCtype(), d_array_ptr (exp)); + } + else if (tbtype->ty == Tarray) + { +@@ -452,7 +395,7 @@ convert_expr (tree exp, Type *exp_type, + if (sz_src == sz_dst) + { + // Convert from void[] or elements are the same size -- don't change length +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + } + else + { +@@ -463,49 +406,49 @@ convert_expr (tree exp, Type *exp_type, + args[1] = build_integer_cst (sz_src * mult, Type::tsize_t->toCtype()); + args[2] = exp; + +- return build_libcall (LIBCALL_ARRAYCAST, 3, args, target_type->toCtype()); ++ return build_libcall (LIBCALL_ARRAYCAST, 3, args, totype->toCtype()); + } + } + else if (tbtype->ty == Tsarray) + { + // %% Strings are treated as dynamic arrays D2. + if (ebtype->isString() && tbtype->isString()) +- return indirect_ref (target_type->toCtype(), d_array_ptr (exp)); ++ return indirect_ref (totype->toCtype(), d_array_ptr (exp)); + } + else + { +- ::error ("cannot cast expression of type %s to %s", +- exp_type->toChars(), target_type->toChars()); +- return error_mark (target_type); ++ error ("cannot cast expression of type %s to %s", ++ etype->toChars(), totype->toChars()); ++ return error_mark_node; + } + break; + + case Taarray: + if (tbtype->ty == Taarray) +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + else if (tbtype->ty == Tstruct) + { + ebtype = ((TypeAArray *) ebtype)->getImpl()->type; +- return convert_expr (exp, ebtype, target_type); ++ return convert_expr (exp, ebtype, totype); + } + // Can convert associative arrays to void pointers. + else if (tbtype == Type::tvoidptr) +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + // else, default conversion, which should product an error + break; + + case Tpointer: + // Can convert void pointers to associative arrays too... + if (tbtype->ty == Taarray && ebtype == Type::tvoidptr) +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + break; + + case Tnull: + if (tbtype->ty == Tarray) + { + tree ptrtype = tbtype->nextOf()->pointerTo()->toCtype(); +- return d_array_value (target_type->toCtype(), +- size_int (0), build_nop (ptrtype, exp)); ++ return d_array_value (totype->toCtype(), size_int (0), ++ build_nop (ptrtype, exp)); + } + break; + +@@ -513,57 +456,61 @@ convert_expr (tree exp, Type *exp_type, + if (tbtype->ty == Tsarray) + { + if (tbtype->size() == ebtype->size()) +- return build_vconvert (target_type->toCtype(), exp); ++ return build_vconvert (totype->toCtype(), exp); + } + break; + + default: +- exp = fold_convert (exp_type->toCtype(), exp); ++ exp = fold_convert (etype->toCtype(), exp); + gcc_assert (TREE_CODE (exp) != STRING_CST); + break; + } + + return result ? result : +- convert (target_type->toCtype(), exp); ++ convert (totype->toCtype(), exp); + } + + +-// Apply semantics of assignment to a values of type TARGET_TYPE to EXPR ++// Apply semantics of assignment to a values of type TOTYPE to EXPR + // (e.g., pointer = array -> pointer = &array[0]) + +-// Return a TREE representation of EXPR implictly converted to TARGET_TYPE ++// Return a TREE representation of EXPR implictly converted to TOTYPE + // for use in assignment expressions MODIFY_EXPR, INIT_EXPR... + + tree +-convert_for_assignment (tree expr, Type *exp_type, Type *target_type) ++convert_for_assignment (tree expr, Type *etype, Type *totype) + { +- Type *ebtype = exp_type->toBasetype(); +- Type *tbtype = target_type->toBasetype(); ++ Type *ebtype = etype->toBasetype(); ++ Type *tbtype = totype->toBasetype(); + + // Assuming this only has to handle converting a non Tsarray type to + // arbitrarily dimensioned Tsarrays. + if (tbtype->ty == Tsarray) + { +- Type *sa_elem_type = tbtype->nextOf()->toBasetype(); +- +- while (sa_elem_type->ty == Tsarray) +- sa_elem_type = sa_elem_type->nextOf()->toBasetype(); ++ Type *telem = tbtype->nextOf()->baseElemOf(); + +- if (d_types_compatible (sa_elem_type, ebtype)) ++ if (d_types_compatible (telem, ebtype)) + { + // %% what about implicit converions...? + TypeSArray *sa_type = (TypeSArray *) tbtype; + uinteger_t count = sa_type->dim->toUInteger(); + +- tree ctor = build_constructor (target_type->toCtype(), NULL); ++ tree ctor = build_constructor (totype->toCtype(), NULL); + if (count) + { + vec *ce = NULL; + tree index = build2 (RANGE_EXPR, Type::tsize_t->toCtype(), + integer_zero_node, build_integer_cst (count - 1)); +- tree value = convert_for_assignment (expr, exp_type, sa_type->next); ++ tree value = convert_for_assignment (expr, etype, sa_type->next); ++ ++ // Can't use VAR_DECLs in CONSTRUCTORS. ++ if (TREE_CODE (value) == VAR_DECL) ++ { ++ value = DECL_INITIAL (value); ++ gcc_assert (value); ++ } + +- CONSTRUCTOR_APPEND_ELT (ce, index, object_file->stripVarDecl (value)); ++ CONSTRUCTOR_APPEND_ELT (ce, index, value); + CONSTRUCTOR_ELTS (ctor) = ce; + } + TREE_READONLY (ctor) = 1; +@@ -579,7 +526,7 @@ convert_for_assignment (tree expr, Type + if (integer_zerop (expr)) + { + StructDeclaration *sd = ((TypeStruct *) tbtype)->sym; +- tree var = build_local_var (target_type->toCtype()); ++ tree var = build_local_temp (totype->toCtype()); + + tree init = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMSET), 3, + build_address (var), expr, +@@ -591,29 +538,25 @@ convert_for_assignment (tree expr, Type + gcc_unreachable(); + } + +- return convert_expr (expr, exp_type, target_type); ++ return convert_expr (expr, etype, totype); + } + + // Return a TREE representation of EXPR converted to represent parameter type ARG. + + tree +-IRState::convertForArgument (Expression *expr, Parameter *arg) ++convert_for_argument (tree exp_tree, Expression *expr, Parameter *arg) + { + if (arg_reference_p (arg)) + { +- tree exp_tree = expr->toElem (this); +- // front-end already sometimes automatically takes the address +- // TODO: Make this safer? Can this be confused by a non-zero SymOff? ++ // Front-end already sometimes automatically takes the address + if (expr->op != TOKaddress && expr->op != TOKsymoff && expr->op != TOKadd) + exp_tree = build_address (exp_tree); + + return convert (type_passed_as (arg), exp_tree); + } +- else +- { +- // Lazy arguments: expr should already be a delegate +- return expr->toElem (this); +- } ++ ++ // Lazy arguments: expr should already be a delegate ++ return exp_tree; + } + + // Perform default promotions for data used in expressions. +@@ -633,7 +576,7 @@ convert_for_condition (tree expr, Type * + { + case Taarray: + // Shouldn't this be... +- // result = build_libcall (LIBCALL_AALEN, 1, &expr); ++ // result = _aaLen (&expr); + result = component_ref (expr, TYPE_FIELDS (TREE_TYPE (expr))); + break; + +@@ -687,17 +630,17 @@ convert_for_condition (tree expr, Type * + // EXP must be a static array or dynamic array. + + tree +-IRState::toDArray (Expression *exp) ++d_array_convert (Expression *exp) + { + TY ty = exp->type->toBasetype()->ty; + +- if (ty == Tsarray) ++ if (ty == Tarray) ++ return exp->toElem (current_irstate); ++ else if (ty == Tsarray) + { + Type *totype = exp->type->toBasetype()->nextOf()->arrayOf(); +- return convert_expr (exp->toElem (this), exp->type, totype); ++ return convert_expr (exp->toElem (current_irstate), exp->type, totype); + } +- else if (ty == Tarray) +- return exp->toElem (this); + + // Invalid type passed. + gcc_unreachable(); +@@ -736,6 +679,8 @@ declaration_type (Declaration *decl) + TypeDelegate *t = new TypeDelegate (tf); + decl_type = t->merge()->toCtype(); + } ++ else if (decl->isThisDeclaration()) ++ decl_type = insert_type_modifiers (decl_type, MODconst); + + return decl_type; + } +@@ -765,6 +710,7 @@ tree + type_passed_as (Parameter *arg) + { + tree arg_type = arg->type->toCtype(); ++ + if (arg_reference_p (arg)) + arg_type = build_reference_type (arg_type); + else if (arg->storageClass & STClazy) +@@ -773,6 +719,7 @@ type_passed_as (Parameter *arg) + TypeDelegate *t = new TypeDelegate (tf); + arg_type = t->merge()->toCtype(); + } ++ + return arg_type; + } + +@@ -794,11 +741,13 @@ d_array_type (Type *d_type, uinteger_t s + NULL_TREE); + + tree array_type = build_array_type (type_node, index_type_node); ++ + if (size == 0) + { + TYPE_SIZE (array_type) = bitsize_zero_node; + TYPE_SIZE_UNIT (array_type) = size_zero_node; + } ++ + return array_type; + } + +@@ -853,7 +802,7 @@ d_attribute_p (const char* name) + return false; + + table = new StringTable(); +- table->init(n); ++ table->_init(n); + + for (const attribute_spec *p = d_attribute_table; p->name; p++) + table->insert(p->name, strlen(p->name)); +@@ -876,19 +825,22 @@ build_attributes (Expressions *in_attrs) + + for (size_t i = 0; i < in_attrs->dim; i++) + { +- Expression *attr = (*in_attrs)[i]->ctfeInterpret(); ++ Expression *attr = (*in_attrs)[i]->optimize (WANTexpand); + Dsymbol *sym = attr->type->toDsymbol (0); + + if (!sym) + continue; + +- Dsymbol *mod = (Dsymbol*) sym->getModule(); ++ Dsymbol *mod = (Dsymbol*) sym->getModule(); + if (!(strcmp(mod->toChars(), "attribute") == 0 +- && mod->parent ++ && mod->parent != NULL + && strcmp(mod->parent->toChars(), "gcc") == 0 + && !mod->parent->parent)) + continue; + ++ if (attr->op == TOKcall) ++ attr = attr->ctfeInterpret(); ++ + gcc_assert(attr->op == TOKstructliteral); + Expressions *elem = ((StructLiteralExp*) attr)->elements; + +@@ -921,7 +873,7 @@ build_attributes (Expressions *in_attrs) + aet = build_string (s->len, (const char *) s->string); + } + else +- aet = ae->toElem (cirstate); ++ aet = ae->toElem (current_irstate); + + args = chainon (args, build_tree_list (0, aet)); + } +@@ -975,31 +927,29 @@ tree + build_integer_cst (dinteger_t value, tree type) + { + // The type is error_mark_node, we can't do anything. +- if (error_mark_p (type)) ++ if (error_operand_p (type)) + return type; + + return build_int_cst_type (type, value); + } + +-// Build REAL_CST of type TARGET_TYPE with the value VALUE. ++// Build REAL_CST of type TOTYPE with the value VALUE. + + tree +-build_float_cst (const real_t& value, Type *target_type) ++build_float_cst (const real_t& value, Type *totype) + { + real_t new_value; +- TypeBasic *tb = target_type->isTypeBasic(); ++ TypeBasic *tb = totype->isTypeBasic(); + + gcc_assert (tb != NULL); + + tree type_node = tb->toCtype(); + real_convert (&new_value.rv(), TYPE_MODE (type_node), &value.rv()); + ++ // Value grew as a result of the conversion. %% precision bug ?? ++ // For now just revert back to original. + if (new_value > value) +- { +- // value grew as a result of the conversion. %% precision bug ?? +- // For now just revert back to original. +- new_value = value; +- } ++ new_value = value; + + return build_real (type_node, new_value.rv()); + } +@@ -1022,8 +972,11 @@ cst_to_hwi (double_int cst) + dinteger_t + tree_to_hwi (tree t) + { +- if (host_integerp (t, 0) || host_integerp (t, 1)) +- return tree_low_cst (t, 1); ++ if (TREE_INT_CST_HIGH (t) == 0 ++ || (TREE_INT_CST_HIGH (t) == -1 ++ && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0 ++ && !TYPE_UNSIGNED (TREE_TYPE (t)))) ++ return TREE_INT_CST_LOW (t); + + return cst_to_hwi (TREE_INT_CST (t)); + } +@@ -1034,7 +987,7 @@ tree + d_array_length (tree exp) + { + // backend will ICE otherwise +- if (error_mark_p (exp)) ++ if (error_operand_p (exp)) + return exp; + + // Get the backend type for the array and pick out the array +@@ -1049,7 +1002,7 @@ tree + d_array_ptr (tree exp) + { + // backend will ICE otherwise +- if (error_mark_p (exp)) ++ if (error_operand_p (exp)) + return exp; + + // Get the backend type for the array and pick out the array +@@ -1091,7 +1044,7 @@ tree + d_array_string (const char *str) + { + unsigned len = strlen (str); +- // Assumes str is null-terminated. ++ // Assumes STR is 0-terminated. + tree str_tree = build_string (len + 1, str); + + TREE_TYPE (str_tree) = d_array_type (Type::tchar, len); +@@ -1117,8 +1070,8 @@ get_array_length (tree exp, Type *type) + return d_array_length (exp); + + default: +- ::error ("can't determine the length of a %s", type->toChars()); +- return error_mark (type); ++ error ("can't determine the length of a %s", type->toChars()); ++ return error_mark_node; + } + } + +@@ -1140,6 +1093,52 @@ unhandled_arrayop_p (BinExp *exp) + return false; + } + ++// Create BINFO for a ClassDeclaration's inheritance tree. ++// Interfaces are not included. ++ ++tree ++build_class_binfo (tree super, ClassDeclaration *cd) ++{ ++ tree binfo = make_tree_binfo (1); ++ tree ctype = cd->type->toCtype(); ++ ++ // Want RECORD_TYPE, not REFERENCE_TYPE ++ BINFO_TYPE (binfo) = TREE_TYPE (ctype); ++ BINFO_INHERITANCE_CHAIN (binfo) = super; ++ BINFO_OFFSET (binfo) = integer_zero_node; ++ ++ if (cd->baseClass) ++ BINFO_BASE_APPEND (binfo, build_class_binfo (binfo, cd->baseClass)); ++ ++ return binfo; ++} ++ ++// Create BINFO for an InterfaceDeclaration's inheritance tree. ++// In order to access all inherited methods in the debugger, ++// the entire tree must be described. ++// This function makes assumptions about interface layout. ++ ++tree ++build_interface_binfo (tree super, ClassDeclaration *cd, unsigned& offset) ++{ ++ tree binfo = make_tree_binfo (cd->baseclasses->dim); ++ tree ctype = cd->type->toCtype(); ++ ++ // Want RECORD_TYPE, not REFERENCE_TYPE ++ BINFO_TYPE (binfo) = TREE_TYPE (ctype); ++ BINFO_INHERITANCE_CHAIN (binfo) = super; ++ BINFO_OFFSET (binfo) = size_int (offset * Target::ptrsize); ++ BINFO_VIRTUAL_P (binfo) = 1; ++ ++ for (size_t i = 0; i < cd->baseclasses->dim; i++, offset++) ++ { ++ BaseClass *bc = (*cd->baseclasses)[i]; ++ BINFO_BASE_APPEND (binfo, build_interface_binfo (binfo, bc->base, offset)); ++ } ++ ++ return binfo; ++} ++ + // Returns the .funcptr component from the D delegate EXP. + + tree +@@ -1163,7 +1162,7 @@ delegate_object (tree exp) + } + + // Build a delegate literal of type TYPE whose pointer function is +-// METHOD, and hidden object is OBJECT. ++// METHOD, and hidden object is OBJECT. + + tree + build_delegate_cst (tree method, tree object, Type *type) +@@ -1254,7 +1253,7 @@ get_object_method (tree thisexp, Express + + if (objexp->op == TOKsuper + || objtype->ty == Tstruct || objtype->ty == Tpointer +- || func->isFinal() || !func->isVirtual() || is_dottype) ++ || func->isFinalFunc() || !func->isVirtual() || is_dottype) + { + if (objtype->ty == Tstruct) + thisexp = build_address (thisexp); +@@ -1287,56 +1286,58 @@ get_object_method (tree thisexp, Express + tree + build_two_field_type (tree t1, tree t2, Type *type, const char *n1, const char *n2) + { +- tree rec_type = make_node (RECORD_TYPE); ++ tree rectype = make_node (RECORD_TYPE); + tree f0 = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier (n1), t1); + tree f1 = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier (n2), t2); +- DECL_CONTEXT (f0) = rec_type; +- DECL_CONTEXT (f1) = rec_type; +- TYPE_FIELDS (rec_type) = chainon (f0, f1); +- layout_type (rec_type); ++ ++ DECL_CONTEXT (f0) = rectype; ++ DECL_CONTEXT (f1) = rectype; ++ TYPE_FIELDS (rectype) = chainon (f0, f1); ++ layout_type (rectype); ++ + if (type) + { +- /* This is needed so that maybeExpandSpecialCall knows to +- split dynamic array varargs. */ +- TYPE_LANG_SPECIFIC (rec_type) = build_d_type_lang_specific (type); +- +- /* ObjectFile::declareType will try to declare it as top-level type +- which can break debugging info for element types. */ +- tree stub_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL, +- get_identifier (type->toChars()), rec_type); +- TYPE_STUB_DECL (rec_type) = stub_decl; +- TYPE_NAME (rec_type) = stub_decl; +- DECL_ARTIFICIAL (stub_decl) = 1; +- rest_of_decl_compilation (stub_decl, 0, 0); ++ tree ident = get_identifier (type->toChars()); ++ tree stubdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ident, rectype); ++ ++ TYPE_STUB_DECL (rectype) = stubdecl; ++ TYPE_NAME (rectype) = stubdecl; ++ DECL_ARTIFICIAL (stubdecl) = 1; ++ rest_of_decl_compilation (stubdecl, 1, 0); + } +- return rec_type; ++ ++ return rectype; + } + +-// Create a SAVE_EXPR if T might have unwanted side effects if referenced ++// Create a SAVE_EXPR if EXP might have unwanted side effects if referenced + // more than once in an expression. + + tree +-maybe_make_temp (tree t) ++make_temp (tree exp) + { +- if (d_has_side_effects (t)) +- { +- if (TREE_CODE (t) == CALL_EXPR +- || TREE_CODE (TREE_TYPE (t)) != ARRAY_TYPE) +- return save_expr (t); +- else +- return stabilize_reference (t); +- } ++ if (TREE_CODE (exp) == CALL_EXPR ++ || TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE) ++ return save_expr (exp); ++ else ++ return stabilize_reference (exp); ++} + +- return t; ++tree ++maybe_make_temp (tree exp) ++{ ++ if (d_has_side_effects (exp)) ++ return make_temp (exp); ++ ++ return exp; + } + +-// Return TRUE if T can not be evaluated multiple times (i.e., in a loop body) ++// Return TRUE if EXP can not be evaluated multiple times (i.e., in a loop body) + // without unwanted side effects. + + bool +-d_has_side_effects (tree expr) ++d_has_side_effects (tree exp) + { +- tree t = STRIP_NOPS (expr); ++ tree t = STRIP_NOPS (exp); + + // SAVE_EXPR is safe to reference more than once, but not to + // expand in a loop. +@@ -1362,14 +1363,14 @@ tree + build_address (tree exp) + { + tree t, ptrtype; +- tree exp_type = TREE_TYPE (exp); ++ tree type = TREE_TYPE (exp); + d_mark_addressable (exp); + + // Gimplify doesn't like &(* (ptr-to-array-type)) with static arrays + if (TREE_CODE (exp) == INDIRECT_REF) + { + t = TREE_OPERAND (exp, 0); +- ptrtype = build_pointer_type (exp_type); ++ ptrtype = build_pointer_type (type); + t = build_nop (ptrtype, t); + } + else +@@ -1377,18 +1378,18 @@ build_address (tree exp) + /* Just convert string literals (char[]) to C-style strings (char *), otherwise + the latter method (char[]*) causes conversion problems during gimplification. */ + if (TREE_CODE (exp) == STRING_CST) +- ptrtype = build_pointer_type (TREE_TYPE (exp_type)); ++ ptrtype = build_pointer_type (TREE_TYPE (type)); + /* Special case for va_list. The backends will be expecting a pointer to vatype, + * but some targets use an array. So fix it. */ +- else if (TYPE_MAIN_VARIANT (exp_type) == TYPE_MAIN_VARIANT (va_list_type_node)) ++ else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (va_list_type_node)) + { +- if (TREE_CODE (TYPE_MAIN_VARIANT (exp_type)) == ARRAY_TYPE) +- ptrtype = build_pointer_type (TREE_TYPE (exp_type)); ++ if (TREE_CODE (TYPE_MAIN_VARIANT (type)) == ARRAY_TYPE) ++ ptrtype = build_pointer_type (TREE_TYPE (type)); + else +- ptrtype = build_pointer_type (exp_type); ++ ptrtype = build_pointer_type (type); + } + else +- ptrtype = build_pointer_type (exp_type); ++ ptrtype = build_pointer_type (type); + + t = build1 (ADDR_EXPR, ptrtype, exp); + } +@@ -1532,6 +1533,79 @@ d_mark_read (tree exp) + return exp; + } + ++// Build equality expression between two RECORD_TYPES T1 and T2. ++// CODE is the EQ_EXPR or NE_EXPR comparison. ++// SD is the front-end struct type. ++ ++tree ++build_struct_memcmp (tree_code code, StructDeclaration *sd, tree t1, tree t2) ++{ ++ tree_code tcode = (code == EQ_EXPR) ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR; ++ tree tmemcmp = NULL_TREE; ++ ++ // Let backend take care of empty struct or union comparisons. ++ if (!sd->fields.dim || sd->isUnionDeclaration()) ++ { ++ tmemcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ build_address (t1), build_address (t2), ++ size_int (sd->structsize)); ++ ++ return build_boolop (code, tmemcmp, integer_zero_node); ++ } ++ ++ for (size_t i = 0; i < sd->fields.dim; i++) ++ { ++ VarDeclaration *vd = sd->fields[i]; ++ tree sfield = vd->toSymbol()->Stree; ++ ++ tree t1ref = component_ref (t1, sfield); ++ tree t2ref = component_ref (t2, sfield); ++ tree tcmp; ++ ++ if (vd->type->ty == Tstruct) ++ { ++ // Compare inner data structures. ++ StructDeclaration *decl = ((TypeStruct *) vd->type)->sym; ++ tcmp = build_struct_memcmp (code, decl, t1ref, t2ref); ++ } ++ else ++ { ++ tree stype = vd->type->toCtype(); ++ machine_mode mode = int_mode_for_mode (TYPE_MODE (stype)); ++ ++ if (vd->type->isintegral()) ++ { ++ // Integer comparison, no special handling required. ++ tcmp = build_boolop (code, t1ref, t2ref); ++ } ++ else if (mode != BLKmode) ++ { ++ // Compare field bits as their corresponding integer type. ++ // *((T*) &t1) == *((T*) &t2) ++ tree tmode = lang_hooks.types.type_for_mode (mode, 1); ++ ++ t1ref = build_vconvert (tmode, t1ref); ++ t2ref = build_vconvert (tmode, t2ref); ++ ++ tcmp = build_boolop (code, t1ref, t2ref); ++ } ++ else ++ { ++ // Simple memcmp between types. ++ tcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ build_address (t1ref), build_address (t2ref), ++ TYPE_SIZE_UNIT (stype)); ++ ++ tcmp = build_boolop (code, tcmp, integer_zero_node); ++ } ++ } ++ ++ tmemcmp = (tmemcmp) ? build_boolop (tcode, tmemcmp, tcmp) : tcmp; ++ } ++ ++ return tmemcmp; ++} ++ + // Cast EXP (which should be a pointer) to TYPE * and then indirect. The + // back-end requires this cast in many cases. + +@@ -1606,7 +1680,7 @@ build_array_index (tree ptr, tree index) + } + + // backend will ICE otherwise +- if (error_mark_p (result_type_node)) ++ if (error_operand_p (result_type_node)) + return result_type_node; + + if (integer_zerop (index)) +@@ -1619,7 +1693,7 @@ build_array_index (tree ptr, tree index) + // OP could be a plus or minus expression. + + tree +-build_offset_op (enum tree_code op, tree ptr, tree idx) ++build_offset_op (tree_code op, tree ptr, tree idx) + { + gcc_assert (op == MINUS_EXPR || op == PLUS_EXPR); + +@@ -1656,7 +1730,7 @@ void_okay_p (tree t) + // and ARG1. Perform relevant conversions needs for correct code operations. + + tree +-IRState::buildOp (tree_code code, tree type, tree arg0, tree arg1) ++build_binary_op (tree_code code, tree type, tree arg0, tree arg1) + { + tree t0 = TREE_TYPE (arg0); + tree t1 = TREE_TYPE (arg1); +@@ -1667,7 +1741,7 @@ IRState::buildOp (tree_code code, tree t + + // Deal with float mod expressions immediately. + if (code == FLOAT_MOD_EXPR) +- return floatMod (TREE_TYPE (arg0), arg0, arg1); ++ return build_float_modulus (TREE_TYPE (arg0), arg0, arg1); + + if (POINTER_TYPE_P (t0) && INTEGRAL_TYPE_P (t1)) + return build_nop (type, build_offset_op (code, arg0, arg1)); +@@ -1687,8 +1761,8 @@ IRState::buildOp (tree_code code, tree t + } + else if (INTEGRAL_TYPE_P (type) && (TYPE_UNSIGNED (type) != unsignedp)) + { +- t = build2 (code, unsignedp ? d_unsigned_type (type) : d_signed_type (type), +- arg0, arg1); ++ tree inttype = unsignedp ? d_unsigned_type (type) : d_signed_type (type); ++ t = build2 (code, inttype, arg0, arg1); + } + else + { +@@ -1705,34 +1779,6 @@ IRState::buildOp (tree_code code, tree t + return d_convert (type, t); + } + +-// Build an assignment expression of code CODE, data type TYPE, and +-// operands E1 and E2. +- +-tree +-IRState::buildAssignOp (tree_code code, Type *type, Expression *e1, Expression *e2) +-{ +- // Skip casts for lhs assignment. +- Expression *e1b = e1; +- while (e1b->op == TOKcast) +- { +- CastExp *ce = (CastExp *) e1b; +- gcc_assert (d_types_compatible (ce->type, ce->to)); +- e1b = ce->e1; +- } +- +- // Prevent multiple evaluations of LHS +- tree lhs = e1b->toElem (this); +- lhs = stabilize_reference (lhs); +- +- tree rhs = buildOp (code, e1->type->toCtype(), +- convert_expr (lhs, e1b->type, e1->type), e2->toElem (this)); +- +- tree expr = modify_expr (lhs, convert_expr (rhs, e1->type, e1b->type)); +- +- return convert_expr (expr, e1b->type, type); +-} +- +- + // Builds an array bounds checking condition, returning INDEX if true, + // else throws a RangeError exception. + +@@ -1781,7 +1827,7 @@ array_bounds_check (void) + if (result == 1) + { + // For D2 safe functions only +- FuncDeclaration *func = cirstate->func; ++ FuncDeclaration *func = current_irstate->func; + if (func && func->type->ty == Tfunction) + { + TypeFunction *tf = (TypeFunction *) func->type; +@@ -1793,133 +1839,6 @@ array_bounds_check (void) + return false; + } + +-// Builds an array index expression from AE. ASC may build a +-// BIND_EXPR if temporaries were created for bounds checking. +- +-tree +-IRState::arrayElemRef (IndexExp *ae, ArrayScope *asc) +-{ +- Expression *e1 = ae->e1; +- Expression *e2 = ae->e2; +- +- Type *base_type = e1->type->toBasetype(); +- TY base_type_ty = base_type->ty; +- // expression that holds the array data. +- tree array_expr = e1->toElem (this); +- // expression that indexes the array data +- tree subscript_expr = e2->toElem (this); +- // base pointer to the elements +- tree ptr_exp; +- // reference the the element +- tree elem_ref; +- +- switch (base_type_ty) +- { +- case Tarray: +- case Tsarray: +- array_expr = asc->setArrayExp (array_expr, e1->type); +- +- // If it's a static array and the index is constant, +- // the front end has already checked the bounds. +- if (array_bounds_check() && !(base_type_ty == Tsarray && e2->isConst())) +- { +- tree array_len_expr; +- // implement bounds check as a conditional expression: +- // array [inbounds(index) ? index : { throw ArrayBoundsError }] +- +- // First, set up the index expression to only be evaluated once. +- tree index_expr = maybe_make_temp (subscript_expr); +- +- if (base_type_ty == Tarray) +- { +- array_expr = maybe_make_temp (array_expr); +- array_len_expr = d_array_length (array_expr); +- } +- else +- array_len_expr = ((TypeSArray *) base_type)->dim->toElem (this); +- +- subscript_expr = d_checked_index (ae->loc, index_expr, +- array_len_expr, false); +- } +- +- if (base_type_ty == Tarray) +- ptr_exp = d_array_ptr (array_expr); +- else +- ptr_exp = build_address (array_expr); +- +- // This conversion is required for static arrays and is just-to-be-safe +- // for dynamic arrays +- ptr_exp = convert (base_type->nextOf()->pointerTo()->toCtype(), ptr_exp); +- break; +- +- case Tpointer: +- // Ignores array scope. +- ptr_exp = array_expr; +- break; +- +- default: +- gcc_unreachable(); +- } +- +- ptr_exp = void_okay_p (ptr_exp); +- subscript_expr = asc->finish (subscript_expr); +- elem_ref = indirect_ref (TREE_TYPE (TREE_TYPE (ptr_exp)), +- build_array_index (ptr_exp, subscript_expr)); +- +- return elem_ref; +-} +- +- +-void +-IRState::doArraySet (tree in_ptr, tree in_value, tree in_count) +-{ +- startBindings(); +- +- tree count = build_local_var (size_type_node); +- DECL_INITIAL (count) = in_count; +- expandDecl (count); +- +- tree ptr = build_local_var (TREE_TYPE (in_ptr)); +- DECL_INITIAL (ptr) = in_ptr; +- expandDecl (ptr); +- +- tree ptr_type = TREE_TYPE (ptr); +- tree count_type = TREE_TYPE (count); +- +- tree value = NULL_TREE; +- +- if (!d_has_side_effects (in_value)) +- value = in_value; +- else +- { +- value = build_local_var (TREE_TYPE (in_value)); +- DECL_INITIAL (value) = in_value; +- expandDecl (value); +- } +- +- startLoop (NULL); +- continueHere(); +- exitIfFalse (build2 (NE_EXPR, boolean_type_node, +- d_convert (TREE_TYPE (count), integer_zero_node), count)); +- +- addExp (vmodify_expr (build_deref (ptr), value)); +- addExp (vmodify_expr (ptr, build_offset (ptr, TYPE_SIZE_UNIT (TREE_TYPE (ptr_type))))); +- addExp (vmodify_expr (count, build2 (MINUS_EXPR, count_type, count, +- d_convert (count_type, integer_one_node)))); +- +- endLoop(); +- endBindings(); +-} +- +-// Create a tree node to set multiple elements to a single value +-tree +-IRState::arraySetExpr (tree ptr, tree value, tree count) +-{ +- pushStatementList(); +- doArraySet (ptr, value, count); +- return popStatementList(); +-} +- + // Builds a BIND_EXPR around BODY for the variables VAR_CHAIN. + + tree +@@ -1935,7 +1854,7 @@ bind_expr (tree var_chain, tree body) + body = compound_expr (ini, body); + } + +- return save_expr (build3 (BIND_EXPR, TREE_TYPE (body), var_chain, body, NULL_TREE)); ++ return make_temp (build3 (BIND_EXPR, TREE_TYPE (body), var_chain, body, NULL_TREE)); + } + + // Like compound_expr, but ARG0 or ARG1 might be NULL_TREE. +@@ -1964,17 +1883,6 @@ maybe_vcompound_expr (tree arg0, tree ar + return vcompound_expr (arg0, arg1); + } + +-// Returns TRUE if T is an ERROR_MARK node. +- +-bool +-error_mark_p (tree t) +-{ +- return (t == error_mark_node +- || (t && TREE_TYPE (t) == error_mark_node) +- || (t && TREE_CODE (t) == NOP_EXPR +- && TREE_OPERAND (t, 0) == error_mark_node)); +-} +- + // Returns the TypeFunction class for Type T. + // Assumes T is already ->toBasetype() + +@@ -2014,133 +1922,46 @@ call_by_alias_p (FuncDeclaration *caller + return true; + } + +-// Entry point for call routines. Extracts the callee, object, +-// and function type from expression EXPR, passing down ARGUMENTS. +- +-tree +-IRState::call (Expression *expr, Expressions *arguments) +-{ +- // Calls to delegates can sometimes look like this: +- if (expr->op == TOKcomma) +- { +- CommaExp *ce = (CommaExp *) expr; +- expr = ce->e2; +- +- VarExp *ve; +- gcc_assert (ce->e2->op == TOKvar); +- ve = (VarExp *) ce->e2; +- gcc_assert (ve->var->isFuncDeclaration() && !ve->var->needThis()); +- } +- +- Type *t = expr->type->toBasetype(); +- TypeFunction *tf = NULL; +- tree callee = expr->toElem (this); +- tree object = NULL_TREE; +- +- if (D_METHOD_CALL_EXPR (callee)) +- { +- /* This could be a delegate expression (TY == Tdelegate), but not +- actually a delegate variable. */ +- // %% Is this ever not a DotVarExp ? +- if (expr->op == TOKdotvar) +- { +- /* This gets the true function type, the latter way can sometimes +- be incorrect. Example: ref functions in D2. */ +- tf = get_function_type (((DotVarExp *) expr)->var->type); +- } +- else +- tf = get_function_type (t); +- +- extract_from_method_call (callee, callee, object); +- } +- else if (t->ty == Tdelegate) +- { +- tf = (TypeFunction *) ((TypeDelegate *) t)->next; +- callee = maybe_make_temp (callee); +- object = delegate_object (callee); +- callee = delegate_method (callee); +- } +- else if (expr->op == TOKvar) +- { +- FuncDeclaration *fd = ((VarExp *) expr)->var->isFuncDeclaration(); +- gcc_assert (fd); +- tf = (TypeFunction *) fd->type; +- if (fd->isNested()) +- { +- if (call_by_alias_p (func, fd)) +- { +- // Re-evaluate symbol storage treating 'fd' as public. +- object_file->setupSymbolStorage (fd, callee, true); +- } +- object = getFrameForSymbol (fd); +- } +- else if (fd->needThis()) +- { +- expr->error ("need 'this' to access member %s", fd->toChars()); +- object = d_null_pointer; // continue processing... +- } +- } +- else +- { +- tf = get_function_type (t); +- } +- return call (tf, callee, object, arguments); +-} +- +-// Like above, but is assumed to be a direct call to FUNC_DECL. +-// ARGS are the arguments passed. ++// Entry point for call routines. Builds a function call to FD. ++// OBJECT is the 'this' reference passed and ARGS are the arguments to FD. + + tree +-IRState::call (FuncDeclaration *func_decl, Expressions *args) ++d_build_call (FuncDeclaration *fd, tree object, Expressions *args) + { +- // Otherwise need to copy code from above +- gcc_assert (!func_decl->isNested()); +- +- return call (get_function_type (func_decl->type), +- func_decl->toSymbol()->Stree, NULL_TREE, args); ++ return d_build_call (get_function_type (fd->type), ++ build_address (fd->toSymbol()->Stree), object, args); + } + +-// Like above, but FUNC_DECL is a nested function, method, delegate or lambda. +-// OBJECT is the 'this' reference passed and ARGS are the arguments passed. +- +-tree +-IRState::call (FuncDeclaration *func_decl, tree object, Expressions *args) +-{ +- return call (get_function_type (func_decl->type), +- build_address (func_decl->toSymbol()->Stree), object, args); +-} +- +-// Builds a CALL_EXPR of type FUNC_TYPE to CALLABLE. OBJECT holds the 'this' pointer, ++// Builds a CALL_EXPR of type TF to CALLABLE. OBJECT holds the 'this' pointer, + // ARGUMENTS are evaluated in left to right order, saved and promoted before passing. + + tree +-IRState::call (TypeFunction *func_type, tree callable, tree object, Expressions *arguments) ++d_build_call (TypeFunction *tf, tree callable, tree object, Expressions *arguments) + { +- tree func_type_node = TREE_TYPE (callable); +- tree actual_callee = callable; ++ IRState *irs = current_irstate; ++ tree ctype = TREE_TYPE (callable); ++ tree callee = callable; + tree saved_args = NULL_TREE; + + tree arg_list = NULL_TREE; + +- if (POINTER_TYPE_P (func_type_node)) +- func_type_node = TREE_TYPE (func_type_node); ++ if (POINTER_TYPE_P (ctype)) ++ ctype = TREE_TYPE (ctype); + else +- actual_callee = build_address (callable); ++ callee = build_address (callable); + +- gcc_assert (function_type_p (func_type_node)); +- gcc_assert (func_type != NULL); +- gcc_assert (func_type->ty == Tfunction); ++ gcc_assert (function_type_p (ctype)); ++ gcc_assert (tf != NULL); ++ gcc_assert (tf->ty == Tfunction); + + // Evaluate the callee before calling it. +- if (TREE_SIDE_EFFECTS (actual_callee)) ++ if (TREE_SIDE_EFFECTS (callee)) + { +- actual_callee = maybe_make_temp (actual_callee); +- saved_args = actual_callee; ++ callee = maybe_make_temp (callee); ++ saved_args = callee; + } + +- bool is_d_vararg = func_type->varargs == 1 && func_type->linkage == LINKd; +- +- if (TREE_CODE (func_type_node) == FUNCTION_TYPE) ++ if (TREE_CODE (ctype) == FUNCTION_TYPE) + { + if (object != NULL_TREE) + gcc_unreachable(); +@@ -2151,72 +1972,82 @@ IRState::call (TypeFunction *func_type, + if (TREE_CODE (callable) == FUNCTION_DECL) + { + error ("need 'this' to access member %s", IDENTIFIER_POINTER (DECL_NAME (callable))); +- return error_mark (func_type); ++ return error_mark_node; + } + + // Probably an internal error + gcc_unreachable(); + } ++ + /* If this is a delegate call or a nested function being called as + a delegate, the object should not be NULL. */ + if (object != NULL_TREE) + arg_list = build_tree_list (NULL_TREE, object); + +- Parameters *formal_args = func_type->parameters; // can be NULL for genCfunc decls +- size_t n_formal_args = formal_args ? (int) Parameter::dim (formal_args) : 0; +- size_t n_actual_args = arguments ? arguments->dim : 0; +- size_t fi = 0; +- +- // assumes arguments->dim <= formal_args->dim if (!this->varargs) +- for (size_t ai = 0; ai < n_actual_args; ++ai) ++ if (arguments) + { +- tree arg_tree; +- Expression *arg_exp = (*arguments)[ai]; +- +- if (ai == 0 && is_d_vararg) +- { +- // The hidden _arguments parameter +- arg_tree = arg_exp->toElem (this); +- } +- else if (fi < n_formal_args) ++ // First pass, evaluated expanded tuples in function arguments. ++ for (size_t i = 0; i < arguments->dim; ++i) + { +- // Actual arguments for declared formal arguments +- Parameter *formal_arg = Parameter::getNth (formal_args, fi); +- arg_tree = convertForArgument (arg_exp, formal_arg); +- ++fi; ++ Lagain: ++ Expression *arg = (*arguments)[i]; ++ gcc_assert (arg->op != TOKtuple); ++ ++ if (arg->op == TOKcomma) ++ { ++ CommaExp *ce = (CommaExp *) arg; ++ tree tce = ce->e1->toElem (irs); ++ saved_args = maybe_vcompound_expr (saved_args, tce); ++ (*arguments)[i] = ce->e2; ++ goto Lagain; ++ } + } +- else ++ ++ // if _arguments[] is the first argument. ++ size_t dvarargs = (tf->linkage == LINKd && tf->varargs == 1); ++ size_t nparams = Parameter::dim (tf->parameters); ++ ++ // Assumes arguments->dim <= formal_args->dim if (!this->varargs) ++ for (size_t i = 0; i < arguments->dim; ++i) + { +- if (flag_split_darrays && arg_exp->type->toBasetype()->ty == Tarray) ++ Expression *arg = (*arguments)[i]; ++ tree targ; ++ ++ if (i < dvarargs) + { +- tree da_exp = maybe_make_temp (arg_exp->toElem (this)); +- arg_list = chainon (arg_list, build_tree_list (0, d_array_length (da_exp))); +- arg_list = chainon (arg_list, build_tree_list (0, d_array_ptr (da_exp))); +- continue; ++ // The hidden _arguments parameter ++ targ = arg->toElem (irs); ++ } ++ else if (i - dvarargs < nparams && i >= dvarargs) ++ { ++ // Actual arguments for declared formal arguments ++ Parameter *parg = Parameter::getNth (tf->parameters, i - dvarargs); ++ targ = convert_for_argument (arg->toElem (irs), arg, parg); + } + else + { +- arg_tree = arg_exp->toElem (this); +- /* Not all targets support passing unpromoted types, so +- promote anyway. */ +- tree prom_type = lang_hooks.types.type_promotes_to (TREE_TYPE (arg_tree)); +- if (prom_type != TREE_TYPE (arg_tree)) +- arg_tree = convert (prom_type, arg_tree); ++ // Not all targets support passing unpromoted types, so ++ // promote anyway. ++ targ = arg->toElem (irs); ++ tree ptype = lang_hooks.types.type_promotes_to (TREE_TYPE (targ)); ++ ++ if (ptype != TREE_TYPE (targ)) ++ targ = convert (ptype, targ); + } +- } +- /* Evaluate the argument before passing to the function. +- Needed for left to right evaluation. */ +- if (func_type->linkage == LINKd && TREE_SIDE_EFFECTS (arg_tree)) +- { +- arg_tree = maybe_make_temp (arg_tree); +- saved_args = maybe_vcompound_expr (saved_args, arg_tree); +- } + +- arg_list = chainon (arg_list, build_tree_list (0, arg_tree)); ++ // Evaluate the argument before passing to the function. ++ // Needed for left to right evaluation. ++ if (tf->linkage == LINKd && TREE_SIDE_EFFECTS (targ)) ++ { ++ targ = maybe_make_temp (targ); ++ saved_args = maybe_vcompound_expr (saved_args, targ); ++ } ++ arg_list = chainon (arg_list, build_tree_list (0, targ)); ++ } + } + +- tree result = d_build_call (TREE_TYPE (func_type_node), actual_callee, arg_list); +- result = maybeExpandSpecialCall (result); ++ tree result = d_build_call_list (TREE_TYPE (ctype), callee, arg_list); ++ result = maybe_expand_builtin (result); + + return maybe_compound_expr (saved_args, result); + } +@@ -2253,21 +2084,11 @@ d_assert_call (Loc loc, LibCall libcall, + // List kept in ascii collating order to allow binary search + + static const char *libcall_ids[LIBCALL_count] = { +- /*"_d_invariant",*/ "_D9invariant12_d_invariantFC6ObjectZv", +- "_aApplyRcd1", "_aApplyRcd2", "_aApplyRcw1", "_aApplyRcw2", +- "_aApplyRdc1", "_aApplyRdc2", "_aApplyRdw1", "_aApplyRdw2", +- "_aApplyRwc1", "_aApplyRwc2", "_aApplyRwd1", "_aApplyRwd2", +- "_aApplycd1", "_aApplycd2", "_aApplycw1", "_aApplycw2", +- "_aApplydc1", "_aApplydc2", "_aApplydw1", "_aApplydw2", +- "_aApplywc1", "_aApplywc2", "_aApplywd1", "_aApplywd2", +- "_aaApply", "_aaApply2", ++ "_D9invariant12_d_invariantFC6ObjectZv", + "_aaDelX", "_aaEqual", + "_aaGetRvalueX", "_aaGetX", +- "_aaInX", "_aaLen", +- "_adCmp", "_adCmp2", +- "_adDupT", "_adEq", "_adEq2", +- "_adReverse", "_adReverseChar", "_adReverseWchar", +- "_adSort", "_adSortChar", "_adSortWchar", ++ "_aaInX", ++ "_adCmp2", "_adEq2", + "_d_allocmemory", "_d_array_bounds", + "_d_arrayappendT", "_d_arrayappendcTX", + "_d_arrayappendcd", "_d_arrayappendwd", +@@ -2280,11 +2101,9 @@ static const char *libcall_ids[LIBCALL_c + "_d_assert", "_d_assert_msg", + "_d_assocarrayliteralTX", + "_d_callfinalizer", "_d_callinterfacefinalizer", +- "_d_criticalenter", "_d_criticalexit", + "_d_delarray", "_d_delarray_t", "_d_delclass", + "_d_delinterface", "_d_delmemory", + "_d_dynamic_cast", "_d_hidden_func", "_d_interface_cast", +- "_d_monitorenter", "_d_monitorexit", + "_d_newarrayT", "_d_newarrayiT", + "_d_newarraymTX", "_d_newarraymiTX", + "_d_newclass", "_d_newitemT", "_d_newitemiT", +@@ -2304,9 +2123,7 @@ get_libcall (LibCall libcall) + { + FuncDeclaration *decl = libcall_decls[libcall]; + +- static Type *aa_type = NULL; +- static Type *dg_type = NULL; +- static Type *dg2_type = NULL; ++ static Type *aatype = NULL; + + if (!decl) + { +@@ -2315,27 +2132,8 @@ get_libcall (LibCall libcall) + bool varargs = false; + + // Build generic AA type void*[void*] +- if (aa_type == NULL) +- aa_type = new TypeAArray (Type::tvoidptr, Type::tvoidptr); +- +- // Build generic delegate type int(void*) +- if (dg_type == NULL) +- { +- Parameters *fn_parms = new Parameters; +- fn_parms->push (new Parameter (STCin, Type::tvoidptr, NULL, NULL)); +- Type *fn_type = new TypeFunction (fn_parms, Type::tint32, false, LINKd); +- dg_type = new TypeDelegate (fn_type); +- } +- +- // Build generic delegate type int(void*, void*) +- if (dg2_type == NULL) +- { +- Parameters *fn_parms = new Parameters; +- fn_parms->push (new Parameter (STCin, Type::tvoidptr, NULL, NULL)); +- fn_parms->push (new Parameter (STCin, Type::tvoidptr, NULL, NULL)); +- Type *fn_type = new TypeFunction (fn_parms, Type::tint32, false, LINKd); +- dg2_type = new TypeDelegate (fn_type); +- } ++ if (aatype == NULL) ++ aatype = new TypeAArray (Type::tvoidptr, Type::tvoidptr); + + switch (libcall) + { +@@ -2365,20 +2163,20 @@ get_libcall (LibCall libcall) + break; + + case LIBCALL_NEWCLASS: +- targs.push (ClassDeclaration::classinfo->type->constOf()); +- treturn = build_object_type (); ++ targs.push (Type::typeinfoclass->type->constOf()); ++ treturn = build_object_type(); + break; + + case LIBCALL_NEWARRAYT: + case LIBCALL_NEWARRAYIT: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + treturn = Type::tvoid->arrayOf(); + break; + + case LIBCALL_NEWARRAYMTX: + case LIBCALL_NEWARRAYMITX: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + targs.push (Type::tsize_t); + treturn = Type::tvoid->arrayOf(); +@@ -2386,7 +2184,7 @@ get_libcall (LibCall libcall) + + case LIBCALL_NEWITEMT: + case LIBCALL_NEWITEMIT: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + treturn = Type::tvoidptr; + break; + +@@ -2406,7 +2204,7 @@ get_libcall (LibCall libcall) + + case LIBCALL_DELARRAYT: + targs.push (Type::tvoid->arrayOf()->pointerTo()); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + break; + + case LIBCALL_DELMEMORY: +@@ -2420,7 +2218,7 @@ get_libcall (LibCall libcall) + + case LIBCALL_ARRAYSETLENGTHT: + case LIBCALL_ARRAYSETLENGTHIT: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + targs.push (Type::tvoid->arrayOf()->pointerTo()); + treturn = Type::tvoid->arrayOf(); +@@ -2428,59 +2226,52 @@ get_libcall (LibCall libcall) + + case LIBCALL_DYNAMIC_CAST: + case LIBCALL_INTERFACE_CAST: +- targs.push (build_object_type ()); +- targs.push (ClassDeclaration::classinfo->type); +- treturn = build_object_type (); ++ targs.push (build_object_type()); ++ targs.push (Type::typeinfoclass->type); ++ treturn = build_object_type(); + break; + +- case LIBCALL_ADEQ: + case LIBCALL_ADEQ2: +- case LIBCALL_ADCMP: + case LIBCALL_ADCMP2: + targs.push (Type::tvoid->arrayOf()); + targs.push (Type::tvoid->arrayOf()); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + treturn = Type::tint32; + break; + + case LIBCALL_AAEQUAL: +- targs.push (Type::typeinfo->type->constOf()); +- targs.push (aa_type); +- targs.push (aa_type); ++ targs.push (Type::dtypeinfo->type->constOf()); ++ targs.push (aatype); ++ targs.push (aatype); + treturn = Type::tint32; + break; + +- case LIBCALL_AALEN: +- targs.push (aa_type); +- treturn = Type::tsize_t; +- break; +- + case LIBCALL_AAINX: +- targs.push (aa_type); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (aatype); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tvoidptr); + treturn = Type::tvoidptr; + break; + + case LIBCALL_AAGETX: +- targs.push (aa_type->pointerTo()); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (aatype->pointerTo()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + targs.push (Type::tvoidptr); + treturn = Type::tvoidptr; + break; + + case LIBCALL_AAGETRVALUEX: +- targs.push (aa_type); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (aatype); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + targs.push (Type::tvoidptr); + treturn = Type::tvoidptr; + break; + + case LIBCALL_AADELX: +- targs.push (aa_type); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (aatype); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tvoidptr); + treturn = Type::tbool; + break; +@@ -2500,28 +2291,29 @@ get_libcall (LibCall libcall) + break; + + case LIBCALL_ARRAYCATT: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tint8->arrayOf()); + targs.push (Type::tint8->arrayOf()); + treturn = Type::tint8->arrayOf(); + break; + + case LIBCALL_ARRAYCATNT: +- targs.push (Type::typeinfo->type->constOf()); +- targs.push (Type::tuns32); // Currently 'uint', even if 64-bit ++ targs.push (Type::dtypeinfo->type->constOf()); ++ // Currently 'uint', even if 64-bit ++ targs.push (Type::tuns32); + varargs = true; + treturn = Type::tvoid->arrayOf(); + break; + + case LIBCALL_ARRAYAPPENDT: +- targs.push (Type::typeinfo->type); //->constOf()); ++ targs.push (Type::dtypeinfo->type); //->constOf()); + targs.push (Type::tint8->arrayOf()->pointerTo()); + targs.push (Type::tint8->arrayOf()); + treturn = Type::tvoid->arrayOf(); + break; + + case LIBCALL_ARRAYAPPENDCTX: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tint8->arrayOf()->pointerTo()); + targs.push (Type::tsize_t); + treturn = Type::tint8->arrayOf(); +@@ -2541,7 +2333,7 @@ get_libcall (LibCall libcall) + + case LIBCALL_ARRAYASSIGN: + case LIBCALL_ARRAYCTOR: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tvoid->arrayOf()); + targs.push (Type::tvoid->arrayOf()); + treturn = Type::tvoid->arrayOf(); +@@ -2552,20 +2344,13 @@ get_libcall (LibCall libcall) + targs.push (Type::tvoidptr); + targs.push (Type::tvoidptr); + targs.push (Type::tsize_t); +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + treturn = Type::tvoidptr; + break; + +- case LIBCALL_MONITORENTER: +- case LIBCALL_MONITOREXIT: + case LIBCALL_THROW: + case LIBCALL_INVARIANT: +- targs.push (build_object_type ()); +- break; +- +- case LIBCALL_CRITICALENTER: +- case LIBCALL_CRITICALEXIT: +- targs.push (Type::tvoidptr); ++ targs.push (build_object_type()); + break; + + case LIBCALL_SWITCH_USTRING: +@@ -2585,117 +2370,20 @@ get_libcall (LibCall libcall) + targs.push (Type::tchar->arrayOf()); + treturn = Type::tint32; + break; ++ + case LIBCALL_ASSOCARRAYLITERALTX: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tvoid->arrayOf()); + targs.push (Type::tvoid->arrayOf()); + treturn = Type::tvoidptr; + break; + + case LIBCALL_ARRAYLITERALTX: +- targs.push (Type::typeinfo->type->constOf()); ++ targs.push (Type::dtypeinfo->type->constOf()); + targs.push (Type::tsize_t); + treturn = Type::tvoidptr; + break; + +- case LIBCALL_ADSORTCHAR: +- case LIBCALL_ADREVERSECHAR: +- targs.push (Type::tchar->arrayOf()); +- treturn = Type::tchar->arrayOf(); +- break; +- +- case LIBCALL_ADSORTWCHAR: +- case LIBCALL_ADREVERSEWCHAR: +- targs.push (Type::twchar->arrayOf()); +- treturn = Type::twchar->arrayOf(); +- break; +- +- case LIBCALL_ADDUPT: +- targs.push (Type::typeinfo->type->constOf()); +- targs.push (Type::tvoid->arrayOf()); +- treturn = Type::tvoid->arrayOf(); +- break; +- +- case LIBCALL_ADREVERSE: +- targs.push (Type::tvoid->arrayOf()); +- targs.push (Type::tsize_t); +- treturn = Type::tvoid->arrayOf(); +- break; +- +- case LIBCALL_ADSORT: +- targs.push (Type::tvoid->arrayOf()); +- targs.push (Type::typeinfo->type->constOf()); +- treturn = Type::tvoid->arrayOf(); +- break; +- +- case LIBCALL_AAAPPLY: +- targs.push (aa_type); +- targs.push (Type::tsize_t); +- targs.push (dg_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAAPPLY2: +- targs.push (aa_type); +- targs.push (Type::tsize_t); +- targs.push (dg2_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYCD1: +- case LIBCALL_AAPPLYCW1: +- case LIBCALL_AAPPLYRCD1: +- case LIBCALL_AAPPLYRCW1: +- targs.push (Type::tchar->arrayOf()); +- targs.push (dg_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYCD2: +- case LIBCALL_AAPPLYCW2: +- case LIBCALL_AAPPLYRCD2: +- case LIBCALL_AAPPLYRCW2: +- targs.push (Type::tchar->arrayOf()); +- targs.push (dg2_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYDC1: +- case LIBCALL_AAPPLYDW1: +- case LIBCALL_AAPPLYRDC1: +- case LIBCALL_AAPPLYRDW1: +- targs.push (Type::tdchar->arrayOf()); +- targs.push (dg_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYDC2: +- case LIBCALL_AAPPLYDW2: +- case LIBCALL_AAPPLYRDC2: +- case LIBCALL_AAPPLYRDW2: +- targs.push (Type::tdchar->arrayOf()); +- targs.push (dg2_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYWC1: +- case LIBCALL_AAPPLYWD1: +- case LIBCALL_AAPPLYRWC1: +- case LIBCALL_AAPPLYRWD1: +- targs.push (Type::twchar->arrayOf()); +- targs.push (dg_type); +- treturn = Type::tint32; +- break; +- +- case LIBCALL_AAPPLYWC2: +- case LIBCALL_AAPPLYWD2: +- case LIBCALL_AAPPLYRWC2: +- case LIBCALL_AAPPLYRWD2: +- targs.push (Type::twchar->arrayOf()); +- targs.push (dg2_type); +- treturn = Type::tint32; +- break; +- + case LIBCALL_HIDDEN_FUNC: + /* Argument is an Object, but can't use that as + LIBCALL_HIDDEN_FUNC is needed before the Object type is +@@ -2707,22 +2395,17 @@ get_libcall (LibCall libcall) + gcc_unreachable(); + } + +- // Build extern(C) function. +- Identifier *id = Lexer::idPool(libcall_ids[libcall]); +- TypeFunction *tf = new TypeFunction(NULL, treturn, 0, LINKc); +- tf->varargs = varargs ? 1 : 0; +- +- decl = new FuncDeclaration(0, 0, id, STCstatic, tf); +- decl->protection = PROTpublic; +- decl->linkage = LINKc; +- + // Add parameter types. + Parameters *args = new Parameters; + args->setDim (targs.dim); + for (size_t i = 0; i < targs.dim; i++) + (*args)[i] = new Parameter (0, targs[i], NULL, NULL); + +- tf->parameters = args; ++ // Build extern(C) function. ++ decl = FuncDeclaration::genCfunc (args, treturn, libcall_ids[libcall]); ++ ++ TypeFunction *tf = (TypeFunction *) decl->type; ++ tf->varargs = varargs ? 1 : 0; + libcall_decls[libcall] = decl; + + // These functions do not return except through catching a thrown exception. +@@ -2753,7 +2436,7 @@ build_libcall (LibCall libcall, unsigned + for (int i = n_args - 1; i >= 0; i--) + arg_list = tree_cons (NULL_TREE, args[i], arg_list); + +- tree result = d_build_call (type->toCtype(), callee, arg_list); ++ tree result = d_build_call_list (type->toCtype(), callee, arg_list); + + // Assumes caller knows what it is doing. + if (force_type != NULL_TREE) +@@ -2767,7 +2450,7 @@ build_libcall (LibCall libcall, unsigned + // attributes of the funcion and the SIDE_EFFECTS flags of the arguments. + + tree +-d_build_call (tree type, tree callee, tree args) ++d_build_call_list (tree type, tree callee, tree args) + { + int nargs = list_length (args); + tree *pargs = new tree[nargs]; +@@ -2778,7 +2461,7 @@ d_build_call (tree type, tree callee, tr + } + + // Conveniently construct the function arguments for passing +-// to the real d_build_call function. ++// to the d_build_call_list function. + + tree + d_build_call_nary (tree callee, int n_args, ...) +@@ -2792,22 +2475,166 @@ d_build_call_nary (tree callee, int n_ar + arg_list = tree_cons (NULL_TREE, va_arg (ap, tree), arg_list); + va_end (ap); + +- return d_build_call (TREE_TYPE (fntype), build_address (callee), nreverse (arg_list)); ++ return d_build_call_list (TREE_TYPE (fntype), build_address (callee), nreverse (arg_list)); ++} ++ ++// Call an fold the intrinsic call CALLEE with the argument ARG ++// with the built-in function CODE passed. ++ ++static tree ++expand_intrinsic_op (built_in_function code, tree callee, tree arg) ++{ ++ tree exp = d_build_call_nary (builtin_decl_explicit (code), 1, arg); ++ return fold_convert (TREE_TYPE (callee), fold (exp)); ++} ++ ++// Like expand_intrinsic_op, but takes two arguments. ++ ++static tree ++expand_intrinsic_op2 (built_in_function code, tree callee, tree arg1, tree arg2) ++{ ++ tree exp = d_build_call_nary (builtin_decl_explicit (code), 2, arg1, arg2); ++ return fold_convert (TREE_TYPE (callee), fold (exp)); ++} ++ ++// Expand a front-end instrinsic call to bsr whose arguments are ARG. ++// The original call expression is held in CALLEE. ++ ++static tree ++expand_intrinsic_bsr (tree callee, tree arg) ++{ ++ // Intrinsic bsr gets turned into (size - 1) - count_leading_zeros(arg). ++ // %% TODO: The return value is supposed to be undefined if arg is zero. ++ tree type = TREE_TYPE (arg); ++ tree tsize = build_integer_cst (TREE_INT_CST_LOW (TYPE_SIZE (type)) - 1, type); ++ tree exp = expand_intrinsic_op (BUILT_IN_CLZL, callee, arg); ++ ++ // Handle int -> long conversions. ++ if (TREE_TYPE (exp) != type) ++ exp = fold_convert (type, exp); ++ ++ exp = fold_build2 (MINUS_EXPR, type, tsize, exp); ++ return fold_convert (TREE_TYPE (callee), exp); ++} ++ ++// Expand the front-end built-in function INTRINSIC, which is either a ++// call to bt, btc, btr, or bts. These intrinsics take two arguments, ++// ARG1 and ARG2, and the original call expression is held in CALLEE. ++ ++static tree ++expand_intrinsic_bt (Intrinsic intrinsic, tree callee, tree arg1, tree arg2) ++{ ++ tree type = TREE_TYPE (TREE_TYPE (arg1)); ++ tree exp = build_integer_cst (TREE_INT_CST_LOW (TYPE_SIZE (type)), type); ++ tree_code code; ++ tree tval; ++ ++ // arg1[arg2 / exp] ++ arg1 = build_array_index (arg1, fold_build2 (TRUNC_DIV_EXPR, type, arg2, exp)); ++ arg1 = indirect_ref (type, arg1); ++ ++ // mask = 1 << (arg2 % exp); ++ arg2 = fold_build2 (TRUNC_MOD_EXPR, type, arg2, exp); ++ arg2 = fold_build2 (LSHIFT_EXPR, type, size_one_node, arg2); ++ ++ // cond = arg1[arg2 / size] & mask; ++ exp = fold_build2 (BIT_AND_EXPR, type, arg1, arg2); ++ ++ // cond ? -1 : 0; ++ exp = fold_build3 (COND_EXPR, TREE_TYPE (callee), d_truthvalue_conversion (exp), ++ integer_minus_one_node, integer_zero_node); ++ ++ // Update the bit as needed. ++ code = (intrinsic == INTRINSIC_BTC) ? BIT_XOR_EXPR : ++ (intrinsic == INTRINSIC_BTR) ? BIT_AND_EXPR : ++ (intrinsic == INTRINSIC_BTS) ? BIT_IOR_EXPR : ERROR_MARK; ++ gcc_assert (code != ERROR_MARK); ++ ++ // arg1[arg2 / size] op= mask ++ if (intrinsic == INTRINSIC_BTR) ++ arg2 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg2), arg2); ++ ++ tval = build_local_temp (TREE_TYPE (callee)); ++ exp = vmodify_expr (tval, exp); ++ arg1 = vmodify_expr (arg1, fold_build2 (code, TREE_TYPE (arg1), arg1, arg2)); ++ ++ return compound_expr (exp, compound_expr (arg1, tval)); ++} ++ ++// Expand a front-end built-in call to va_arg, whose arguments are ++// ARG1 and optionally ARG2. ++// The original call expression is held in CALLEE. ++ ++// The cases handled here are: ++// va_arg!T(ap); ++// => return (T) VA_ARG_EXP ++// ++// va_arg!T(ap, T arg); ++// => return arg = (T) VA_ARG_EXP; ++ ++static tree ++expand_intrinsic_vaarg (tree callee, tree arg1, tree arg2) ++{ ++ tree type; ++ ++ STRIP_NOPS (arg1); ++ ++ if (TREE_CODE (arg1) == ADDR_EXPR) ++ arg1 = TREE_OPERAND (arg1, 0); ++ ++ if (arg2 == NULL_TREE) ++ type = TREE_TYPE (callee); ++ else ++ { ++ STRIP_NOPS (arg2); ++ gcc_assert (TREE_CODE (arg2) == ADDR_EXPR); ++ arg2 = TREE_OPERAND (arg2, 0); ++ type = TREE_TYPE (arg2); ++ } ++ ++ // Silently convert promoted types. ++ tree ptype = lang_hooks.types.type_promotes_to (type); ++ tree exp = build1 (VA_ARG_EXPR, ptype, arg1); ++ ++ if (type != ptype) ++ exp = fold_convert (type, exp); ++ ++ if (arg2 != NULL_TREE) ++ exp = vmodify_expr (arg2, exp); ++ ++ return exp; + } + +-// If CALL_EXP is a BUILT_IN_FRONTEND, expand and return inlined ++// Expand a front-end built-in call to va_start, whose arguments are ++// ARG1 and ARG2. The original call expression is held in CALLEE. ++ ++static tree ++expand_intrinsic_vastart (tree callee, tree arg1, tree arg2) ++{ ++ // The va_list argument should already have its address taken. ++ // The second argument, however, is inout and that needs to be ++ // fixed to prevent a warning. ++ ++ // Could be casting... so need to check type too? ++ STRIP_NOPS (arg1); ++ STRIP_NOPS (arg2); ++ gcc_assert (TREE_CODE (arg1) == ADDR_EXPR && TREE_CODE (arg2) == ADDR_EXPR); ++ ++ arg2 = TREE_OPERAND (arg2, 0); ++ // Assuming nobody tries to change the return type. ++ return expand_intrinsic_op2 (BUILT_IN_VA_START, callee, arg1, arg2); ++} ++ ++// If CALLEXP is a BUILT_IN_FRONTEND, expand and return inlined + // compiler generated instructions. Most map onto GCC builtins, + // others require a little extra work around them. + + tree +-IRState::maybeExpandSpecialCall (tree call_exp) ++maybe_expand_builtin (tree callexp) + { + // More code duplication from C +- CallExpr ce (call_exp); ++ CallExpr ce (callexp); + tree callee = ce.callee(); +- tree op1 = NULL_TREE, op2 = NULL_TREE; +- tree exp = NULL_TREE, val; +- enum tree_code code; + + if (POINTER_TYPE_P (TREE_TYPE (callee))) + callee = TREE_OPERAND (callee, 0); +@@ -2816,210 +2643,107 @@ IRState::maybeExpandSpecialCall (tree ca + && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_FRONTEND) + { + Intrinsic intrinsic = (Intrinsic) DECL_FUNCTION_CODE (callee); ++ tree op1, op2; + tree type; +- Type *d_type; ++ + switch (intrinsic) + { + case INTRINSIC_BSF: +- /* builtin count_trailing_zeros matches behaviour of bsf. +- %% TODO: The return value is supposed to be undefined if op1 is zero. */ ++ // builtin count_trailing_zeros matches behaviour of bsf. ++ // %% TODO: The return value is supposed to be undefined if op1 is zero. + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_CTZL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_CTZL, callexp, op1); + + case INTRINSIC_BSR: +- /* bsr becomes 31-(clz), but parameter passed to bsf may not be a 32bit type!! +- %% TODO: The return value is supposed to be undefined if op1 is zero. */ + op1 = ce.nextArg(); +- type = TREE_TYPE (op1); +- +- op2 = build_integer_cst (tree_low_cst (TYPE_SIZE (type), 1) - 1, type); +- exp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_CLZL), 1, op1); +- +- // Handle int -> long conversions. +- if (TREE_TYPE (exp) != type) +- exp = fold_convert (type, exp); +- +- return fold_build2 (MINUS_EXPR, type, op2, exp); ++ return expand_intrinsic_bsr (callexp, op1); + + case INTRINSIC_BTC: + case INTRINSIC_BTR: + case INTRINSIC_BTS: + op1 = ce.nextArg(); + op2 = ce.nextArg(); +- type = TREE_TYPE (TREE_TYPE (op1)); +- +- exp = build_integer_cst (tree_low_cst (TYPE_SIZE (type), 1), type); +- +- // op1[op2 / exp] +- op1 = build_array_index (op1, fold_build2 (TRUNC_DIV_EXPR, type, op2, exp)); +- op1 = indirect_ref (type, op1); +- +- // mask = 1 << (op2 % exp); +- op2 = fold_build2 (TRUNC_MOD_EXPR, type, op2, exp); +- op2 = fold_build2 (LSHIFT_EXPR, type, size_one_node, op2); +- +- // cond = op1[op2 / size] & mask; +- exp = fold_build2 (BIT_AND_EXPR, type, op1, op2); +- +- // cond ? -1 : 0; +- exp = build3 (COND_EXPR, TREE_TYPE (call_exp), d_truthvalue_conversion (exp), +- integer_minus_one_node, integer_zero_node); +- +- // Update the bit as needed. +- code = (intrinsic == INTRINSIC_BTC) ? BIT_XOR_EXPR : +- (intrinsic == INTRINSIC_BTR) ? BIT_AND_EXPR : +- (intrinsic == INTRINSIC_BTS) ? BIT_IOR_EXPR : ERROR_MARK; +- gcc_assert (code != ERROR_MARK); +- +- // op1[op2 / size] op= mask +- if (intrinsic == INTRINSIC_BTR) +- op2 = build1 (BIT_NOT_EXPR, TREE_TYPE (op2), op2); +- +- val = build_local_var (TREE_TYPE (call_exp)); +- exp = vmodify_expr (val, exp); +- op1 = vmodify_expr (op1, fold_build2 (code, TREE_TYPE (op1), op1, op2)); +- return compound_expr (exp, compound_expr (op1, val)); ++ return expand_intrinsic_bt (intrinsic, callexp, op1, op2); + + case INTRINSIC_BSWAP: + /* Backend provides builtin bswap32. + Assumes first argument and return type is uint. */ + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_BSWAP32), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_BSWAP32, callexp, op1); + +- case INTRINSIC_COS: + // Math intrinsics just map to their GCC equivalents. ++ case INTRINSIC_COS: + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_COSL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_COSL, callexp, op1); + + case INTRINSIC_SIN: + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_SINL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_SINL, callexp, op1); + + case INTRINSIC_RNDTOL: +- // %% not sure if llroundl stands as a good replacement +- // for the expected behaviour of rndtol. ++ // Not sure if llroundl stands as a good replacement for the ++ // expected behaviour of rndtol. + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_LLROUNDL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_LLROUNDL, callexp, op1); + + case INTRINSIC_SQRT: + // Have float, double and real variants of sqrt. + op1 = ce.nextArg(); +- type = TREE_TYPE (op1); +- // Could have used mathfn_built_in, but that only returns +- // implicit built in decls. +- if (TYPE_MAIN_VARIANT (type) == double_type_node) +- exp = builtin_decl_explicit (BUILT_IN_SQRT); +- else if (TYPE_MAIN_VARIANT (type) == float_type_node) +- exp = builtin_decl_explicit (BUILT_IN_SQRTF); +- else if (TYPE_MAIN_VARIANT (type) == long_double_type_node) +- exp = builtin_decl_explicit (BUILT_IN_SQRTL); ++ type = TYPE_MAIN_VARIANT (TREE_TYPE (op1)); + // op1 is an integral type - use double precision. +- else if (INTEGRAL_TYPE_P (TYPE_MAIN_VARIANT (type))) +- { +- op1 = convert (double_type_node, op1); +- exp = builtin_decl_explicit (BUILT_IN_SQRT); +- } ++ if (INTEGRAL_TYPE_P (type)) ++ op1 = convert (double_type_node, op1); + +- gcc_assert (exp); // Should never trigger. +- return d_build_call_nary (exp, 1, op1); ++ if (type == double_type_node) ++ return expand_intrinsic_op (BUILT_IN_SQRT, callexp, op1); ++ else if (type == float_type_node) ++ return expand_intrinsic_op (BUILT_IN_SQRTF, callexp, op1); ++ else if (type == long_double_type_node) ++ return expand_intrinsic_op (BUILT_IN_SQRTL, callexp, op1); ++ ++ gcc_unreachable(); ++ break; + + case INTRINSIC_LDEXP: + op1 = ce.nextArg(); + op2 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_LDEXPL), 2, op1, op2); ++ return expand_intrinsic_op2 (BUILT_IN_LDEXPL, callexp, op1, op2); + + case INTRINSIC_FABS: + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_FABSL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_FABSL, callexp, op1); + + case INTRINSIC_RINT: + op1 = ce.nextArg(); +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_RINTL), 1, op1); ++ return expand_intrinsic_op (BUILT_IN_RINTL, callexp, op1); + + case INTRINSIC_VA_ARG: +- case INTRINSIC_C_VA_ARG: + op1 = ce.nextArg(); +- STRIP_NOPS (op1); +- +- if (TREE_CODE (op1) == ADDR_EXPR) +- op1 = TREE_OPERAND (op1, 0); +- +- if (intrinsic == INTRINSIC_C_VA_ARG) +- type = TREE_TYPE (TREE_TYPE (callee)); +- else +- { +- op2 = ce.nextArg(); +- STRIP_NOPS (op2); +- gcc_assert (TREE_CODE (op2) == ADDR_EXPR); +- op2 = TREE_OPERAND (op2, 0); +- type = TREE_TYPE (op2); +- } +- +- d_type = build_dtype (type); +- if (flag_split_darrays +- && (d_type && d_type->toBasetype()->ty == Tarray)) +- { +- /* should create a temp var of type TYPE and move the binding +- to outside this expression. */ +- tree ltype = TREE_TYPE (TYPE_FIELDS (type)); +- tree ptype = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type))); +- tree lvar = create_temporary_var (ltype); +- tree pvar = create_temporary_var (ptype); +- +- op1 = stabilize_reference (op1); +- +- tree e1 = vmodify_expr (lvar, build1 (VA_ARG_EXPR, ltype, op1)); +- tree e2 = vmodify_expr (pvar, build1 (VA_ARG_EXPR, ptype, op1)); +- tree val = d_array_value (type, lvar, pvar); +- +- exp = compound_expr (compound_expr (e1, e2), val); +- exp = bind_expr (lvar, bind_expr (pvar, exp)); +- } +- else +- { +- tree type2 = lang_hooks.types.type_promotes_to (type); +- exp = build1 (VA_ARG_EXPR, type2, op1); +- // silently convert promoted type... +- if (type != type2) +- exp = convert (type, exp); +- } +- +- if (intrinsic == INTRINSIC_VA_ARG) +- exp = vmodify_expr (op2, exp); ++ op2 = ce.nextArg(); ++ return expand_intrinsic_vaarg (callexp, op1, op2); + +- return exp; ++ case INTRINSIC_C_VA_ARG: ++ op1 = ce.nextArg(); ++ return expand_intrinsic_vaarg (callexp, op1, NULL_TREE); + + case INTRINSIC_VA_START: +- /* The va_list argument should already have its +- address taken. The second argument, however, is +- inout and that needs to be fixed to prevent a warning. */ + op1 = ce.nextArg(); + op2 = ce.nextArg(); +- type = TREE_TYPE (op1); +- +- // could be casting... so need to check type too? +- STRIP_NOPS (op1); +- STRIP_NOPS (op2); +- gcc_assert (TREE_CODE (op1) == ADDR_EXPR +- && TREE_CODE (op2) == ADDR_EXPR); +- +- op2 = TREE_OPERAND (op2, 0); +- // assuming nobody tries to change the return type +- return d_build_call_nary (builtin_decl_explicit (BUILT_IN_VA_START), 2, op1, op2); ++ return expand_intrinsic_vastart (callexp, op1, op2); + + default: + gcc_unreachable(); + } + } + +- return call_exp; ++ return callexp; + } + + // Build and return the correct call to fmod depending on TYPE. + // ARG0 and ARG1 are the arguments pass to the function. + + tree +-IRState::floatMod (tree type, tree arg0, tree arg1) ++build_float_modulus (tree type, tree arg0, tree arg1) + { + tree fmodfn = NULL_TREE; + tree basetype = type; +@@ -3037,7 +2761,7 @@ IRState::floatMod (tree type, tree arg0, + if (!fmodfn) + { + // %qT pretty prints the tree type. +- ::error ("tried to perform floating-point modulo division on %qT", type); ++ error ("tried to perform floating-point modulo division on %qT", type); + return error_mark_node; + } + +@@ -3056,11 +2780,11 @@ IRState::floatMod (tree type, tree arg0, + // Returns typeinfo reference for type T. + + tree +-IRState::typeinfoReference (Type *t) ++build_typeinfo (Type *t) + { +- tree ti_ref = t->getInternalTypeInfo (NULL)->toElem (this); +- gcc_assert (POINTER_TYPE_P (TREE_TYPE (ti_ref))); +- return ti_ref; ++ tree tinfo = t->getInternalTypeInfo (NULL)->toElem (current_irstate); ++ gcc_assert (POINTER_TYPE_P (TREE_TYPE (tinfo))); ++ return tinfo; + } + + // Checks if DECL is an intrinsic or runtime library function that +@@ -3081,29 +2805,23 @@ maybe_set_builtin_frontend (FuncDeclarat + if (libcall_decls[libcall] == decl) + return; + ++ // This should have been done either by the front-end or get_libcall. + TypeFunction *tf = (TypeFunction *) decl->type; +- if (tf->parameters == NULL) +- { +- FuncDeclaration *new_decl = get_libcall (libcall); +- new_decl->toSymbol(); +- +- decl->type = new_decl->type; +- decl->csym = new_decl->csym; +- } ++ gcc_assert (tf->parameters != NULL); + + libcall_decls[libcall] = decl; + } + else + { + // Check if it's a front-end builtin. +- static const char FeZe [] = "FNaNbNfeZe"; // @safe pure nothrow real function(real) +- static const char FeZe2[] = "FNaNbNeeZe"; // @trusted pure nothrow real function(real) +- static const char FuintZint[] = "FNaNbNfkZi"; // @safe pure nothrow int function(uint) +- static const char FuintZuint[] = "FNaNbNfkZk"; // @safe pure nothrow uint function(uint) +- static const char FulongZint[] = "FNaNbNfmZi"; // @safe pure nothrow int function(uint) +- static const char FrealZlong [] = "FNaNbNfeZl"; // @safe pure nothrow long function(real) +- static const char FlongplongZint [] = "FNaNbNfPmmZi"; // @safe pure nothrow int function(long*, long) +- static const char FintpintZint [] = "FNaNbNfPkkZi"; // @safe pure nothrow int function(int*, int) ++ static const char FeZe [] = "FNaNbNfeZe"; // @safe pure nothrow real function(real) ++ static const char FeZe2[] = "FNaNbNeeZe"; // @trusted pure nothrow real function(real) ++ static const char FuintZint[] = "FNaNbNfkZi"; // @safe pure nothrow int function(uint) ++ static const char FuintZuint[] = "FNaNbNfkZk"; // @safe pure nothrow uint function(uint) ++ static const char FulongZint[] = "FNaNbNfmZi"; // @safe pure nothrow int function(uint) ++ static const char FrealZlong [] = "FNaNbNfeZl"; // @safe pure nothrow long function(real) ++ static const char FlongplongZint [] = "FNaNbPmmZi"; // pure nothrow int function(long*, long) ++ static const char FintpintZint [] = "FNaNbPkkZi"; // pure nothrow int function(int*, int) + static const char FrealintZint [] = "FNaNbNfeiZe"; // @safe pure nothrow real function(real, int) + + Dsymbol *dsym = decl->toParent(); +@@ -3130,20 +2848,20 @@ maybe_set_builtin_frontend (FuncDeclarat + + switch (i) + { +- case 0: +- case 1: ++ case INTRINSIC_BSF: ++ case INTRINSIC_BSR: + if (!(strcmp (ftype->deco, FuintZint) == 0 || strcmp (ftype->deco, FulongZint) == 0)) + return; + break; + +- case 2: ++ case INTRINSIC_BSWAP: + if (!(strcmp (ftype->deco, FuintZuint) == 0)) + return; + break; + +- case 3: +- case 4: +- case 5: ++ case INTRINSIC_BTC: ++ case INTRINSIC_BTR: ++ case INTRINSIC_BTS: + if (!(strcmp (ftype->deco, FlongplongZint) == 0 || strcmp (ftype->deco, FintpintZint) == 0)) + return; + break; +@@ -3161,8 +2879,7 @@ maybe_set_builtin_frontend (FuncDeclarat + // Matches order of Intrinsic enum + static const char *math_names[] = { + "cos", "fabs", "ldexp", +- "rint", "rndtol", "sin", +- "sqrt", ++ "rint", "rndtol", "sin", "sqrt", + }; + const size_t sz = sizeof (math_names) / sizeof (char *); + int i = binary (decl->ident->string, math_names, sz); +@@ -3170,38 +2887,39 @@ maybe_set_builtin_frontend (FuncDeclarat + if (i == -1) + return; + ++ // Adjust 'i' for this range of enums ++ i += INTRINSIC_COS; ++ gcc_assert (i >= INTRINSIC_COS && i <= INTRINSIC_SQRT); ++ + switch (i) + { +- case 0: +- case 1: +- case 3: +- case 5: ++ case INTRINSIC_COS: ++ case INTRINSIC_FABS: ++ case INTRINSIC_RINT: ++ case INTRINSIC_SIN: + if (!(strcmp (ftype->deco, FeZe) == 0 || strcmp (ftype->deco, FeZe2) == 0)) + return; + break; + +- case 2: ++ case INTRINSIC_LDEXP: + if (!(strcmp (ftype->deco, FrealintZint) == 0)) + return; + break; + +- case 4: ++ case INTRINSIC_RNDTOL: + if (!(strcmp (ftype->deco, FrealZlong) == 0)) + return; + break; + +- case 6: +- if (!(strcmp (ftype->deco, "FNaNbNfdZd") == 0 || //double +- strcmp (ftype->deco, "FNaNbNffZf") == 0 || //& float version +- strcmp (ftype->deco, FeZe) == 0 || +- strcmp (ftype->deco, FeZe2) == 0)) ++ case INTRINSIC_SQRT: ++ if (!(strcmp (ftype->deco, "FNaNbNfdZd") == 0 ++ || strcmp (ftype->deco, "FNaNbNffZf") == 0 ++ || strcmp (ftype->deco, FeZe) == 0 ++ || strcmp (ftype->deco, FeZe2) == 0)) + return; + break; + } + +- // Adjust 'i' for this range of enums +- i += INTRINSIC_COS; +- gcc_assert (i >= INTRINSIC_COS && i <= INTRINSIC_SQRT); + tree t = decl->toSymbol()->Stree; + + // rndtol returns a long type, sqrt any float type, +@@ -3278,24 +2996,24 @@ d_build_label (Loc loc, Identifier *iden + + // Not setting this doesn't seem to cause problems (unlike VAR_DECLs). + if (loc.filename) +- object_file->setDeclLoc (decl, loc); ++ set_decl_location (decl, loc); + + return decl; + } + +-// If NESTED_SYM is a nested function, return the static chain to be +-// used when invoking that function. ++// If SYM is a nested function, return the static chain to be ++// used when calling that function from FUNC. + +-// If NESTED_SYM is a nested class or struct, return the static chain +-// to be used when creating an instance of the class. ++// If SYM is a nested class or struct, return the static chain ++// to be used when creating an instance of the class from FUNC. + + tree +-IRState::getFrameForSymbol (Dsymbol *nested_sym) ++get_frame_for_symbol (FuncDeclaration *func, Dsymbol *sym) + { +- FuncDeclaration *nested_func = NULL; ++ FuncDeclaration *nested_func = sym->isFuncDeclaration(); + FuncDeclaration *outer_func = NULL; + +- if ((nested_func = nested_sym->isFuncDeclaration())) ++ if (nested_func != NULL) + { + // Check that the nested function is properly defined. + if (!nested_func->fbody) +@@ -3308,16 +3026,19 @@ IRState::getFrameForSymbol (Dsymbol *nes + outer_func = nested_func->toParent2()->isFuncDeclaration(); + gcc_assert (outer_func != NULL); + +- if (this->func != outer_func) ++ if (func != outer_func) + { +- Dsymbol *this_func = this->func; +- if (!this->func->vthis) // if no frame pointer for this function ++ // If no frame pointer for this function ++ if (!func->vthis) + { +- nested_sym->error ("is a nested function and cannot be accessed from %s", this->func->toChars()); ++ sym->error ("is a nested function and cannot be accessed from %s", func->toChars()); + return d_null_pointer; + } +- /* Make sure we can get the frame pointer to the outer function, +- else we'll ICE later in tree-ssa. */ ++ ++ Dsymbol *this_func = func; ++ ++ // Make sure we can get the frame pointer to the outer function, ++ // else we'll ICE later in tree-ssa. + while (nested_func != this_func) + { + FuncDeclaration *fd; +@@ -3327,7 +3048,7 @@ IRState::getFrameForSymbol (Dsymbol *nes + // Special case for __ensure and __require. + if (nested_func->ident == Id::ensure || nested_func->ident == Id::require) + { +- outer_func = this->func; ++ outer_func = func; + break; + } + +@@ -3335,12 +3056,14 @@ IRState::getFrameForSymbol (Dsymbol *nes + { + if (outer_func == fd->toParent2()) + break; ++ + gcc_assert (fd->isNested() || fd->vthis); + } + else if ((cd = this_func->isClassDeclaration())) + { + if (!cd->isNested() || !cd->vthis) + goto cannot_get_frame; ++ + if (outer_func == cd->toParent2()) + break; + } +@@ -3348,13 +3071,14 @@ IRState::getFrameForSymbol (Dsymbol *nes + { + if (!sd->isNested() || !sd->vthis) + goto cannot_get_frame; ++ + if (outer_func == sd->toParent2()) + break; + } + else + { +- cannot_get_frame: +- this->func->error ("cannot get frame pointer to %s", nested_sym->toChars()); ++ cannot_get_frame: ++ func->error ("cannot get frame pointer to %s", sym->toChars()); + return d_null_pointer; + } + this_func = this_func->toParent2(); +@@ -3366,33 +3090,41 @@ IRState::getFrameForSymbol (Dsymbol *nes + /* It's a class (or struct). NewExp::toElem has already determined its + outer scope is not another class, so it must be a function. */ + +- Dsymbol *sym = nested_sym; +- +- while (sym && !(outer_func = sym->isFuncDeclaration())) ++ while (sym && !sym->isFuncDeclaration()) + sym = sym->toParent2(); + ++ outer_func = (FuncDeclaration *) sym; ++ + /* Make sure we can access the frame of outer_func. */ +- if (outer_func != this->func) ++ if (outer_func != func) + { +- Dsymbol *o = nested_func = this->func; +- do { ++ nested_func = func; ++ while (nested_func && nested_func != outer_func) ++ { ++ Dsymbol *outer = nested_func->toParent2(); ++ + if (!nested_func->isNested()) + { + if (!nested_func->isMember2()) + goto cannot_access_frame; + } +- while ((o = o->toParent2())) ++ ++ while (outer) + { +- if ((nested_func = o->isFuncDeclaration())) ++ if (outer->isFuncDeclaration()) + break; ++ ++ outer = outer->toParent2(); + } +- } while (o && o != outer_func); + +- if (!o) ++ nested_func = (FuncDeclaration *) outer; ++ } ++ ++ if (!nested_func) + { +- cannot_access_frame: ++ cannot_access_frame: + error ("cannot access frame of function '%s' from '%s'", +- outer_func->toChars(), this->func->toChars()); ++ outer_func->toChars(), func->toChars()); + return d_null_pointer; + } + } +@@ -3400,11 +3132,12 @@ IRState::getFrameForSymbol (Dsymbol *nes + + if (!outer_func) + outer_func = nested_func->toParent2()->isFuncDeclaration(); ++ + gcc_assert (outer_func != NULL); + + FuncFrameInfo *ffo = get_frameinfo (outer_func); + if (ffo->creates_frame || ffo->static_chain) +- return get_framedecl (this->func, outer_func); ++ return get_framedecl (func, outer_func); + + return d_null_pointer; + } +@@ -3444,48 +3177,47 @@ d_nested_struct (StructDeclaration *sd) + } + + +-// Starting from the current function, try to find a suitable value of +-// 'this' in nested function instances. +- +-// A suitable 'this' value is an instance of OCD or a class that has +-// OCD as a base. ++// Starting from the current function FUNC, try to find a suitable value of ++// 'this' in nested function instances. A suitable 'this' value is an ++// instance of OCD or a class that has OCD as a base. + +-tree +-IRState::findThis (ClassDeclaration *ocd) ++static tree ++find_this_tree (FuncDeclaration *func, ClassDeclaration *ocd) + { +- FuncDeclaration *fd = func; +- +- while (fd) ++ while (func) + { +- AggregateDeclaration *ad = fd->isThis(); ++ AggregateDeclaration *ad = func->isThis(); + ClassDeclaration *cd = ad ? ad->isClassDeclaration() : NULL; + + if (cd != NULL) + { + if (ocd == cd) +- return var (fd->vthis); ++ return get_decl_tree (func->vthis, func); + else if (ocd->isBaseOf (cd, NULL)) +- return convert_expr (var (fd->vthis), cd->type, ocd->type); +- else +- fd = d_nested_class (cd); ++ return convert_expr (get_decl_tree (func->vthis, func), cd->type, ocd->type); ++ ++ func = d_nested_class (cd); + } + else + { +- if (fd->isNested()) +- fd = fd->toParent2()->isFuncDeclaration(); +- else +- fd = NULL; ++ if (func->isNested()) ++ { ++ func = func->toParent2()->isFuncDeclaration(); ++ continue; ++ } ++ ++ func = NULL; + } + } ++ + return NULL_TREE; + } + +-// Return the outer class/struct 'this' value. +-// This is here mostly due to removing duplicate code, +-// and clean implementation purposes. ++// Retrieve the outer class/struct 'this' value of DECL from the function FD ++// where E is the expression requiring 'this'. + + tree +-IRState::getVThis (Dsymbol *decl, Expression *e) ++build_vthis (Dsymbol *decl, FuncDeclaration *fd, Expression *e) + { + ClassDeclaration *cd = decl->isClassDeclaration(); + StructDeclaration *sd = decl->isStructDeclaration(); +@@ -3500,25 +3232,23 @@ IRState::getVThis (Dsymbol *decl, Expres + + if (cdo) + { +- vthis_value = findThis (cdo); ++ vthis_value = find_this_tree (fd, cdo); + if (vthis_value == NULL_TREE) + e->error ("outer class %s 'this' needed to 'new' nested class %s", + cdo->toChars(), cd->toChars()); + } + else if (fdo) + { +- /* If a class nested in a function has no methods +- and there are no other nested functions, +- lower_nested_functions is never called and any +- STATIC_CHAIN_EXPR created here will never be +- translated. Use a null pointer for the link in +- this case. */ ++ // If a class nested in a function has no methods and there ++ // are no other nested functions, any static chain created ++ // here will never be translated. Use a null pointer for the ++ // link in this case. + FuncFrameInfo *ffo = get_frameinfo (fdo); + if (ffo->creates_frame || ffo->static_chain + || fdo->hasNestedFrameRefs()) +- vthis_value = getFrameForSymbol (cd); ++ vthis_value = get_frame_for_symbol (fd, cd); + else if (fdo->vthis && fdo->vthis->type != Type::tvoidptr) +- vthis_value = var (fdo->vthis); ++ vthis_value = get_decl_tree (fdo->vthis, fd); + else + vthis_value = d_null_pointer; + } +@@ -3533,7 +3263,7 @@ IRState::getVThis (Dsymbol *decl, Expres + + if (cdo) + { +- vthis_value = findThis (cdo); ++ vthis_value = find_this_tree (fd, cdo); + if (vthis_value == NULL_TREE) + e->error ("outer class %s 'this' needed to create nested struct %s", + cdo->toChars(), sd->toChars()); +@@ -3543,9 +3273,7 @@ IRState::getVThis (Dsymbol *decl, Expres + FuncFrameInfo *ffo = get_frameinfo (fdo); + if (ffo->creates_frame || ffo->static_chain + || fdo->hasNestedFrameRefs()) +- vthis_value = getFrameForSymbol (sd); +- else if (fdo->vthis && fdo->vthis->type != Type::tvoidptr) +- vthis_value = var (fdo->vthis); ++ vthis_value = get_frame_for_symbol (fd, sd); + else + vthis_value = d_null_pointer; + } +@@ -3556,53 +3284,6 @@ IRState::getVThis (Dsymbol *decl, Expres + return vthis_value; + } + +-// Build static chain decl for FUNC to be passed to nested functions in D. +- +-void +-IRState::buildChain (FuncDeclaration *func) +-{ +- FuncFrameInfo *ffi = get_frameinfo (func); +- +- if (ffi->is_closure) +- { +- // Build closure pointer, which is initialised on heap. +- func->buildClosure (this); +- return; +- } +- +- if (!ffi->creates_frame) +- return; +- +- tree frame_rec_type = build_frame_type (func); +- gcc_assert(COMPLETE_TYPE_P (frame_rec_type)); +- +- tree frame_decl = build_local_var (frame_rec_type); +- DECL_NAME (frame_decl) = get_identifier ("__frame"); +- DECL_IGNORED_P (frame_decl) = 0; +- expandDecl (frame_decl); +- +- // set the first entry to the parent frame, if any +- tree chain_field = component_ref (frame_decl, TYPE_FIELDS (frame_rec_type)); +- tree chain_expr = vmodify_expr (chain_field, this->sthis); +- addExp (chain_expr); +- +- // copy parameters that are referenced nonlocally +- for (size_t i = 0; i < func->closureVars.dim; i++) +- { +- VarDeclaration *v = func->closureVars[i]; +- if (!v->isParameter()) +- continue; +- +- Symbol *vsym = v->toSymbol(); +- +- tree frame_field = component_ref (frame_decl, vsym->SframeField); +- tree frame_expr = vmodify_expr (frame_field, vsym->Stree); +- addExp (frame_expr); +- } +- +- this->sthis = build_address (frame_decl); +-} +- + tree + build_frame_type (FuncDeclaration *func) + { +@@ -3620,6 +3301,7 @@ build_frame_type (FuncDeclaration *func) + tree ptr_field = build_decl (BUILTINS_LOCATION, FIELD_DECL, + get_identifier ("__chain"), ptr_type_node); + DECL_CONTEXT (ptr_field) = frame_rec_type; ++ TYPE_READONLY (frame_rec_type) = 1; + + tree fields = chainon (NULL_TREE, ptr_field); + +@@ -3672,15 +3354,20 @@ build_frame_type (FuncDeclaration *func) + v->ident ? get_identifier (v->ident->string) : NULL_TREE, + declaration_type (v)); + s->SframeField = field; +- object_file->setDeclLoc (field, v); ++ set_decl_location (field, v); + DECL_CONTEXT (field) = frame_rec_type; + fields = chainon (fields, field); + TREE_USED (s->Stree) = 1; + +- /* Can't do nrvo if the variable is put in a frame. */ ++ // Can't do nrvo if the variable is put in a frame. + if (func->nrvo_can && func->nrvo_var == v) + func->nrvo_can = 0; ++ ++ // Because the value needs to survive the end of the scope. ++ if (ffi->is_closure && v->needsAutoDtor()) ++ v->error("has scoped destruction, cannot build closure"); + } ++ + TYPE_FIELDS (frame_rec_type) = fields; + layout_type (frame_rec_type); + d_keep (frame_rec_type); +@@ -3782,7 +3469,7 @@ get_frameinfo (FuncDeclaration *fd) + tree + get_framedecl (FuncDeclaration *inner, FuncDeclaration *outer) + { +- tree result = cirstate->sthis; ++ tree result = current_irstate->sthis; + FuncDeclaration *fd = inner; + + while (fd && fd != outer) +@@ -3835,7 +3522,7 @@ get_framedecl (FuncDeclaration *inner, F + } + + // Special case: If a function returns a nested class with functions +-// but there are no "closure variables" the frontend (needsClosure) ++// but there are no "closure variables" the frontend (needsClosure) + // returns false even though the nested class _is_ returned from the + // function. (See case 4 in needsClosure) + // A closure is strictly speaking not necessary, but we also can not +@@ -3853,7 +3540,7 @@ is_degenerate_closure (FuncDeclaration * + gcc_assert(tret); + tret = tret->toBasetype(); + if (tret->ty == Tclass || tret->ty == Tstruct) +- { ++ { + Dsymbol *st = tret->toDsymbol(NULL); + for (Dsymbol *s = st->parent; s; s = s->parent) + { +@@ -3880,7 +3567,7 @@ needs_static_chain (FuncDeclaration *f) + { + s = f->toParent(); + ti = s->isTemplateInstance(); +- if (ti && ti->isnested == NULL && ti->parent->isModule()) ++ if (ti && ti->enclosing == NULL && ti->parent->isModule()) + return false; + + pf = f->toParent2()->isFuncDeclaration(); +@@ -3916,7 +3603,7 @@ needs_static_chain (FuncDeclaration *f) + // Construct a WrappedExp, whose components are an EXP_NODE, which contains + // a list of instructions in GCC to be passed through. + +-WrappedExp::WrappedExp (Loc loc, enum TOK op, tree exp_node, Type *type) ++WrappedExp::WrappedExp (Loc loc, TOK op, tree exp_node, Type *type) + : Expression (loc, op, sizeof (WrappedExp)) + { + this->exp_node = exp_node; +@@ -3943,135 +3630,149 @@ WrappedExp::toElem (IRState *) + // out base class fields first, and adds all interfaces last. + + void +-AggLayout::visit (AggregateDeclaration *decl) ++layout_aggregate_type (AggLayout *al, AggregateDeclaration *decl) + { +- ClassDeclaration *class_decl = decl->isClassDeclaration(); ++ ClassDeclaration *cd = decl->isClassDeclaration(); ++ bool inherited_p = (al->decl != decl); + +- if (class_decl && class_decl->baseClass) +- AggLayout::visit (class_decl->baseClass); ++ if (cd != NULL) ++ { ++ if (cd->baseClass) ++ layout_aggregate_type (al, cd->baseClass); ++ else ++ { ++ // This is the base class (Object) or interface. ++ tree objtype = TREE_TYPE (cd->type->toCtype()); + +- if (decl->fields.dim) +- doFields (&decl->fields, decl); ++ // Add the virtual table pointer, and optionally the monitor fields. ++ tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, ++ get_identifier ("__vptr"), d_vtbl_ptr_type_node); ++ DECL_ARTIFICIAL (field) = 1; ++ DECL_IGNORED_P (field) = inherited_p; + +- if (class_decl && class_decl->vtblInterfaces) +- doInterfaces (class_decl->vtblInterfaces); +-} ++ insert_aggregate_field (al, field, 0); + ++ DECL_VIRTUAL_P (field) = 1; ++ DECL_FCONTEXT (field) = objtype; ++ TYPE_VFIELD (al->type) = field; + +-// Add all FIELDS into aggregate AGG. ++ if (cd->cpp == false) ++ { ++ field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, ++ get_identifier ("__monitor"), ptr_type_node); ++ DECL_FCONTEXT (field) = objtype; ++ DECL_ARTIFICIAL (field) = 1; ++ DECL_IGNORED_P (field) = inherited_p; ++ insert_aggregate_field (al, field, Target::ptrsize); ++ } ++ } ++ } + +-void +-AggLayout::doFields (VarDeclarations *fields, AggregateDeclaration *agg) +-{ +- bool inherited = agg != this->aggDecl_; +- tree fcontext; ++ if (decl->fields.dim) ++ { ++ tree fcontext = decl->type->toCtype(); + +- fcontext = agg->type->toCtype(); +- if (POINTER_TYPE_P (fcontext)) +- fcontext = TREE_TYPE (fcontext); ++ if (POINTER_TYPE_P (fcontext)) ++ fcontext = TREE_TYPE (fcontext); + +- for (size_t i = 0; i < fields->dim; i++) +- { +- // %% D anonymous unions just put the fields into the outer struct... +- // does this cause problems? +- VarDeclaration *var_decl = (*fields)[i]; +- gcc_assert (var_decl && var_decl->storage_class & STCfield); ++ for (size_t i = 0; i < decl->fields.dim; i++) ++ { ++ // D anonymous unions just put the fields into the outer struct... ++ // Does this cause problems? ++ VarDeclaration *var = decl->fields[i]; ++ gcc_assert (var && var->isField()); + +- tree ident = var_decl->ident ? get_identifier (var_decl->ident->string) : NULL_TREE; +- tree field_decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, ident, +- declaration_type (var_decl)); +- object_file->setDeclLoc (field_decl, var_decl); +- var_decl->csym = new Symbol; +- var_decl->csym->Stree = field_decl; ++ tree ident = var->ident ? get_identifier (var->ident->string) : NULL_TREE; ++ tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, ident, ++ declaration_type (var)); ++ set_decl_location (field, var); ++ var->csym = new Symbol; ++ var->csym->Stree = field; + +- DECL_CONTEXT (field_decl) = this->aggType_; +- DECL_FCONTEXT (field_decl) = fcontext; +- DECL_FIELD_OFFSET (field_decl) = size_int (var_decl->offset); +- DECL_FIELD_BIT_OFFSET (field_decl) = bitsize_zero_node; ++ DECL_CONTEXT (field) = al->type; ++ DECL_FCONTEXT (field) = fcontext; ++ DECL_FIELD_OFFSET (field) = size_int (var->offset); ++ DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node; + +- DECL_ARTIFICIAL (field_decl) = DECL_IGNORED_P (field_decl) = inherited; +- SET_DECL_OFFSET_ALIGN (field_decl, TYPE_ALIGN (TREE_TYPE (field_decl))); ++ DECL_ARTIFICIAL (field) = inherited_p; ++ DECL_IGNORED_P (field) = inherited_p; ++ SET_DECL_OFFSET_ALIGN (field, TYPE_ALIGN (TREE_TYPE (field))); + +- layout_decl (field_decl, 0); ++ TREE_THIS_VOLATILE (field) = TYPE_VOLATILE (TREE_TYPE (field)); ++ layout_decl (field, 0); + +- TREE_THIS_VOLATILE (field_decl) = TYPE_VOLATILE (TREE_TYPE (field_decl)); ++ if (var->size (var->loc)) ++ { ++ gcc_assert (DECL_MODE (field) != VOIDmode); ++ gcc_assert (DECL_SIZE (field) != NULL_TREE); ++ } + +- if (var_decl->size (var_decl->loc)) +- { +- gcc_assert (DECL_MODE (field_decl) != VOIDmode); +- gcc_assert (DECL_SIZE (field_decl) != NULL_TREE); ++ TYPE_FIELDS(al->type) = chainon (TYPE_FIELDS (al->type), field); + } +- +- TYPE_FIELDS(this->aggType_) = chainon (TYPE_FIELDS (this->aggType_), field_decl); + } +-} + +-// Write out all interfaces BASES for a class. +- +-void +-AggLayout::doInterfaces (BaseClasses *bases) +-{ +- for (size_t i = 0; i < bases->dim; i++) ++ if (cd && cd->vtblInterfaces) + { +- BaseClass *bc = (*bases)[i]; +- tree decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, +- Type::tvoidptr->pointerTo()->toCtype()); +- DECL_ARTIFICIAL (decl) = 1; +- DECL_IGNORED_P (decl) = 1; +- addField (decl, bc->offset); ++ for (size_t i = 0; i < cd->vtblInterfaces->dim; i++) ++ { ++ BaseClass *bc = (*cd->vtblInterfaces)[i]; ++ tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, ++ Type::tvoidptr->pointerTo()->toCtype()); ++ DECL_ARTIFICIAL (field) = 1; ++ DECL_IGNORED_P (field) = 1; ++ insert_aggregate_field (al, field, bc->offset); ++ } + } + } + +-// Add single field FIELD_DECL at OFFSET into aggregate. ++// Add a compiler generated field DECL at OFFSET into aggregate. + + void +-AggLayout::addField (tree field_decl, size_t offset) ++insert_aggregate_field (AggLayout *al, tree decl, size_t offset) + { +- Loc l (this->aggDecl_->getModule(), 1); +- +- DECL_CONTEXT (field_decl) = this->aggType_; +- SET_DECL_OFFSET_ALIGN (field_decl, TYPE_ALIGN (TREE_TYPE (field_decl))); +- DECL_FIELD_OFFSET (field_decl) = size_int (offset); +- DECL_FIELD_BIT_OFFSET (field_decl) = bitsize_zero_node; ++ DECL_CONTEXT (decl) = al->type; ++ SET_DECL_OFFSET_ALIGN (decl, TYPE_ALIGN (TREE_TYPE (decl))); ++ DECL_FIELD_OFFSET (decl) = size_int (offset); ++ DECL_FIELD_BIT_OFFSET (decl) = bitsize_zero_node; + + // Must set this or we crash with DWARF debugging. +- object_file->setDeclLoc (field_decl, l); ++ set_decl_location (decl, al->decl->loc); + +- TREE_THIS_VOLATILE (field_decl) = TYPE_VOLATILE (TREE_TYPE (field_decl)); ++ TREE_THIS_VOLATILE (decl) = TYPE_VOLATILE (TREE_TYPE (decl)); + +- layout_decl (field_decl, 0); +- TYPE_FIELDS(this->aggType_) = chainon (TYPE_FIELDS (this->aggType_), field_decl); ++ layout_decl (decl, 0); ++ TYPE_FIELDS(al->type) = chainon (TYPE_FIELDS (al->type), decl); + } + +-// Wrap-up and compute finalised aggregate type. ATTRS are +-// if any GCC attributes were applied to the type declaration. ++// Wrap-up and compute finalised aggregate type. Writing out ++// any GCC attributes that were applied to the type declaration. + + void +-AggLayout::finish (Expressions *attrs) ++finish_aggregate_type (AggLayout *al, Expressions *attrs) + { +- unsigned structsize = this->aggDecl_->structsize; +- unsigned alignsize = this->aggDecl_->alignsize; ++ unsigned structsize = al->decl->structsize; ++ unsigned alignsize = al->decl->alignsize; + +- TYPE_SIZE (this->aggType_) = NULL_TREE; ++ TYPE_SIZE (al->type) = NULL_TREE; + + if (attrs) +- decl_attributes (&this->aggType_, build_attributes (attrs), ++ decl_attributes (&al->type, build_attributes (attrs), + ATTR_FLAG_TYPE_IN_PLACE); + +- TYPE_SIZE (this->aggType_) = bitsize_int (structsize * BITS_PER_UNIT); +- TYPE_SIZE_UNIT (this->aggType_) = size_int (structsize); +- TYPE_ALIGN (this->aggType_) = alignsize * BITS_PER_UNIT; +- TYPE_PACKED (this->aggType_) = (alignsize == 1); ++ TYPE_SIZE (al->type) = bitsize_int (structsize * BITS_PER_UNIT); ++ TYPE_SIZE_UNIT (al->type) = size_int (structsize); ++ TYPE_ALIGN (al->type) = alignsize * BITS_PER_UNIT; ++ TYPE_PACKED (al->type) = (alignsize == 1); + +- compute_record_mode (this->aggType_); ++ compute_record_mode (al->type); + + // Set up variants. +- for (tree x = TYPE_MAIN_VARIANT (this->aggType_); x; x = TYPE_NEXT_VARIANT (x)) ++ for (tree x = TYPE_MAIN_VARIANT (al->type); x; x = TYPE_NEXT_VARIANT (x)) + { +- TYPE_FIELDS (x) = TYPE_FIELDS (this->aggType_); +- TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (this->aggType_); +- TYPE_ALIGN (x) = TYPE_ALIGN (this->aggType_); +- TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (this->aggType_); ++ TYPE_FIELDS (x) = TYPE_FIELDS (al->type); ++ TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (al->type); ++ TYPE_ALIGN (x) = TYPE_ALIGN (al->type); ++ TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (al->type); + } + } + +--- a/src/gcc/d/d-codegen.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-codegen.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-codegen.h -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -45,34 +45,12 @@ enum LibCall + { + LIBCALL_NONE = -1, + LIBCALL_INVARIANT, +- LIBCALL_AAPPLYRCD1, LIBCALL_AAPPLYRCD2, +- LIBCALL_AAPPLYRCW1, LIBCALL_AAPPLYRCW2, +- LIBCALL_AAPPLYRDC1, LIBCALL_AAPPLYRDC2, +- LIBCALL_AAPPLYRDW1, LIBCALL_AAPPLYRDW2, +- LIBCALL_AAPPLYRWC1, LIBCALL_AAPPLYRWC2, +- LIBCALL_AAPPLYRWD1, LIBCALL_AAPPLYRWD2, +- LIBCALL_AAPPLYCD1, LIBCALL_AAPPLYCD2, +- LIBCALL_AAPPLYCW1, LIBCALL_AAPPLYCW2, +- LIBCALL_AAPPLYDC1, LIBCALL_AAPPLYDC2, +- LIBCALL_AAPPLYDW1, LIBCALL_AAPPLYDW2, +- LIBCALL_AAPPLYWC1, LIBCALL_AAPPLYWC2, +- LIBCALL_AAPPLYWD1, LIBCALL_AAPPLYWD2, +- LIBCALL_AAAPPLY, LIBCALL_AAAPPLY2, + + LIBCALL_AADELX, LIBCALL_AAEQUAL, + LIBCALL_AAGETRVALUEX, LIBCALL_AAGETX, + LIBCALL_AAINX, +- LIBCALL_AALEN, + +- LIBCALL_ADCMP, LIBCALL_ADCMP2, +- LIBCALL_ADDUPT, +- LIBCALL_ADEQ, LIBCALL_ADEQ2, +- LIBCALL_ADREVERSE, +- LIBCALL_ADREVERSECHAR, +- LIBCALL_ADREVERSEWCHAR, +- LIBCALL_ADSORT, +- LIBCALL_ADSORTCHAR, +- LIBCALL_ADSORTWCHAR, ++ LIBCALL_ADCMP2, LIBCALL_ADEQ2, + + LIBCALL_ALLOCMEMORY, + LIBCALL_ARRAY_BOUNDS, +@@ -96,9 +74,6 @@ enum LibCall + LIBCALL_CALLFINALIZER, + LIBCALL_CALLINTERFACEFINALIZER, + +- LIBCALL_CRITICALENTER, +- LIBCALL_CRITICALEXIT, +- + LIBCALL_DELARRAY, LIBCALL_DELARRAYT, + LIBCALL_DELCLASS, LIBCALL_DELINTERFACE, + LIBCALL_DELMEMORY, +@@ -107,9 +82,6 @@ enum LibCall + LIBCALL_HIDDEN_FUNC, + LIBCALL_INTERFACE_CAST, + +- LIBCALL_MONITORENTER, +- LIBCALL_MONITOREXIT, +- + LIBCALL_NEWARRAYT, LIBCALL_NEWARRAYIT, + LIBCALL_NEWARRAYMTX, LIBCALL_NEWARRAYMITX, + LIBCALL_NEWCLASS, LIBCALL_NEWITEMT, +@@ -147,6 +119,8 @@ extern tree d_mark_used (tree exp); + extern tree d_mark_read (tree exp); + extern tree build_address (tree exp); + ++extern tree build_struct_memcmp (tree_code code, StructDeclaration *sd, tree arg0, tree arg1); ++ + // Routines to handle variables that are references. + extern bool decl_reference_p (Declaration *decl); + extern tree declaration_type (Declaration *decl); +@@ -163,6 +137,7 @@ extern tree insert_type_modifiers (tree + extern tree build_two_field_type (tree t1, tree t2, Type *type, const char *n1, const char *n2); + + extern tree build_exception_object (void); ++extern tree build_float_modulus (tree type, tree t1, tree t2); + + extern tree indirect_ref (tree type, tree exp); + extern tree build_deref (tree exp); +@@ -171,9 +146,6 @@ extern tree maybe_compound_expr (tree ar + extern tree maybe_vcompound_expr (tree arg0, tree arg1); + + extern tree bind_expr (tree var_chain, tree body); +- +-extern bool error_mark_p (tree t); +- + extern tree d_build_label (Loc loc, Identifier *ident); + + // Type conversion. +@@ -184,9 +156,11 @@ extern tree convert_expr (tree exp, Type + extern tree convert_for_assignment (tree expr, Type *exp_type, Type *target_type); + extern tree convert_for_condition (tree expr, Type *type); + ++extern tree d_array_convert (Expression *exp); ++ + // Simple constants + extern tree build_integer_cst (dinteger_t value, tree type = integer_type_node); +-extern tree build_float_cst (const real_t& value, Type *target_type); ++extern tree build_float_cst (const real_t& value, Type *totype); + + extern dinteger_t cst_to_hwi (double_int cst); + extern dinteger_t tree_to_hwi (tree t); +@@ -205,12 +179,15 @@ extern tree get_array_length (tree exp, + extern tree void_okay_p (tree t); + + // Various expressions ++extern tree build_binary_op (tree_code code, tree type, tree arg0, tree arg1); + extern tree build_array_index (tree ptr, tree index); +-extern tree build_offset_op (enum tree_code op, tree ptr, tree idx); ++extern tree build_offset_op (tree_code op, tree ptr, tree idx); + extern tree build_offset (tree ptr_node, tree byte_offset); + + // Function calls +-extern tree d_build_call (tree type, tree callee, tree args); ++extern tree d_build_call (FuncDeclaration *fd, tree object, Expressions *args); ++extern tree d_build_call (TypeFunction *tf, tree callable, tree object, Expressions *arguments); ++extern tree d_build_call_list (tree type, tree callee, tree args); + extern tree d_build_call_nary (tree callee, int n_args, ...); + + extern tree d_assert_call (Loc loc, LibCall libcall, tree msg = NULL_TREE); +@@ -220,14 +197,24 @@ extern tree build_frame_type (FuncDeclar + extern FuncFrameInfo *get_frameinfo (FuncDeclaration *fd); + extern tree get_framedecl (FuncDeclaration *inner, FuncDeclaration *outer); + ++extern tree build_vthis (Dsymbol *decl, FuncDeclaration *fd, Expression *e); ++ ++// Static chain for nested functions ++extern tree get_frame_for_symbol (FuncDeclaration *func, Dsymbol *sym); ++ + extern bool needs_static_chain (FuncDeclaration *f); + + // Local variables +-extern tree build_local_var (tree type); ++extern void build_local_var (VarDeclaration *vd, FuncDeclaration *fd); ++extern tree build_local_temp (tree type); + extern tree create_temporary_var (tree type); + extern tree maybe_temporary_var (tree exp, tree *out_var); ++extern void expand_decl (tree decl); ++ ++extern tree get_decl_tree (Declaration *decl, FuncDeclaration *func); + + // Temporaries (currently just SAVE_EXPRs) ++extern tree make_temp (tree t); + extern tree maybe_make_temp (tree t); + extern bool d_has_side_effects (tree t); + +@@ -238,6 +225,10 @@ extern bool array_bounds_check (void); + extern tree d_checked_index (Loc loc, tree index, tree upr, bool inclusive); + extern tree d_bounds_condition (tree index, tree upr, bool inclusive); + ++// Classes ++extern tree build_class_binfo (tree super, ClassDeclaration *cd); ++extern tree build_interface_binfo (tree super, ClassDeclaration *cd, unsigned& offset); ++ + // Delegates + extern tree delegate_method (tree exp); + extern tree delegate_object (tree exp); +@@ -255,6 +246,8 @@ extern tree maybe_expand_builtin (tree c + + extern void maybe_set_builtin_frontend (FuncDeclaration *decl); + ++extern tree build_typeinfo (Type *t); ++ + // Type management for D frontend types. + // Returns TRUE if T1 and T2 are mutably the same type. + inline bool +@@ -342,7 +335,7 @@ build_vconvert (tree t, tree e) + } + + inline tree +-build_boolop (enum tree_code code, tree arg0, tree arg1) ++build_boolop (tree_code code, tree arg0, tree arg1) + { + return fold_build2_loc (input_location, code, boolean_type_node, arg0, arg1); + } +@@ -359,14 +352,6 @@ vcompound_expr (tree arg0, tree arg1) + return build2_loc (input_location, COMPOUND_EXPR, void_type_node, arg0, arg1); + } + +-// Giving error_mark_node a type allows for some assumptions about +-// the type of an arbitrary expression. +-inline tree +-error_mark (Type *t) +-{ +- return build1_loc (input_location, NOP_EXPR, t->toCtype(), error_mark_node); +-} +- + // Routines for built in structured types + inline tree + real_part (tree c) +@@ -391,99 +376,34 @@ extern TypeFunction *get_function_type ( + extern bool call_by_alias_p (FuncDeclaration *caller, FuncDeclaration *callee); + + +-// Code generation routines should be in a separate namespace, but so many +-// routines need a reference to an IRState to expand Expressions. Solution +-// is to make IRState the code generation namespace with the actual IR state +-// routines as a mixin. Also a lot of routines are static (don't need IR +-// state or expand Expressions), but are still called using . or ->. +- +-// Functions without a verb create trees +-// Functions with 'do' affect the current instruction stream (or output assembler code). +-// functions with other names are for attribute manipulate, etc. +- +-struct IRState : IRBase +-{ +- public: +- // ** Local variables +- void emitLocalVar (VarDeclaration *v, bool no_init = false); +- +- void expandDecl (tree t_decl); +- +- tree var (Declaration *decl); +- +- // ** Type conversion +- tree convertForArgument (Expression *exp, Parameter *arg); +- tree toDArray (Expression *exp); +- +- // ** Various expressions +- static tree buildOp (enum tree_code code, tree type, tree arg0, tree arg1); +- tree buildAssignOp (enum tree_code code, Type *type, Expression *e1, Expression *e2); +- +- tree arrayElemRef (IndexExp *aer_exp, ArrayScope *aryscp); +- +- void doArraySet (tree in_ptr, tree in_value, tree in_count); +- tree arraySetExpr (tree ptr, tree value, tree count); +- +- // ** Function calls +- tree call (Expression *expr, Expressions *arguments); +- tree call (FuncDeclaration *func_decl, Expressions *args); +- tree call (FuncDeclaration *func_decl, tree object, Expressions *args); +- tree call (TypeFunction *guess, tree callable, tree object, Expressions *arguments); +- +- static tree floatMod (tree type, tree arg0, tree arg1); +- +- tree typeinfoReference (Type *t); +- +- void buildChain (FuncDeclaration *func); +- +- tree findThis (ClassDeclaration *target_cd); +- tree getVThis (Dsymbol *decl, Expression *e); +- +- // Static chain for nested functions +- tree getFrameForSymbol (Dsymbol *nested_sym); +- +- protected: +- tree maybeExpandSpecialCall (tree call_exp); +-}; +- + // Globals. +-extern Module *cmodule; +-extern IRState *cirstate; +-extern ObjectFile *object_file; ++extern Module *current_module_decl; ++extern IRState *current_irstate; + + // Various helpers that need extra state + +-struct WrappedExp : Expression ++class WrappedExp : public Expression + { ++public: + tree exp_node; +- WrappedExp (Loc loc, enum TOK op, tree exp_node, Type *type); ++ WrappedExp (Loc loc, TOK op, tree exp_node, Type *type); + void toCBuffer (OutBuffer *buf, HdrGenState *hgs); + elem *toElem (IRState *irs); + }; + +-class AggLayout ++struct AggLayout + { +- public: +- AggLayout (AggregateDeclaration *ini_agg_decl, tree ini_agg_type) +- : aggDecl_(ini_agg_decl), +- aggType_(ini_agg_type) +- { } +- +- void go (void) +- { visit (this->aggDecl_); } +- +- void visit (AggregateDeclaration *decl); +- +- void doFields (VarDeclarations *fields, AggregateDeclaration *agg); +- void doInterfaces (BaseClasses *bases); +- void addField (tree field_decl, size_t offset); +- void finish (Expressions *attrs); +- +- private: +- AggregateDeclaration *aggDecl_; +- tree aggType_; ++ AggLayout (AggregateDeclaration *indecl, tree intype) ++ : decl (indecl), type (intype) { } ++ ++ AggregateDeclaration *decl; ++ tree type; + }; + ++extern void layout_aggregate_type (AggLayout *al, AggregateDeclaration *decl); ++extern void insert_aggregate_field (AggLayout *al, tree field, size_t offset); ++extern void finish_aggregate_type (AggLayout *al, Expressions *attrs); ++ + class ArrayScope + { + public: +--- a/src/gcc/d/d-convert.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-convert.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-convert.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -26,19 +26,19 @@ static tree + d_convert_basic (tree type, tree expr) + { + tree e = expr; +- enum tree_code code = TREE_CODE (type); +- const char *invalid_conv_diag; +- tree ret; ++ tree_code code = TREE_CODE (type); + + if (type == error_mark_node + || expr == error_mark_node + || TREE_TYPE (expr) == error_mark_node) + return error_mark_node; + +- invalid_conv_diag = targetm.invalid_conversion (TREE_TYPE (expr), type); ++ const char *invalid_conv_diag ++ = targetm.invalid_conversion (TREE_TYPE (expr), type); ++ + if (invalid_conv_diag) + { +- error (invalid_conv_diag); ++ error ("%s", invalid_conv_diag); + return error_mark_node; + } + +@@ -50,11 +50,12 @@ d_convert_basic (tree type, tree expr) + && TYPE_DOMAIN (type) == TYPE_DOMAIN (TREE_TYPE (expr))) + return expr; + +- ret = targetm.convert_to_type (type, expr); ++ tree ret = targetm.convert_to_type (type, expr); + if (ret) + return ret; + + STRIP_TYPE_NOPS (e); ++ tree etype = TREE_TYPE (e); + + if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr))) + return fold_convert (type, expr); +@@ -73,6 +74,14 @@ d_convert_basic (tree type, tree expr) + + case INTEGER_TYPE: + case ENUMERAL_TYPE: ++ if (TREE_CODE (etype) == POINTER_TYPE ++ || TREE_CODE (etype) == REFERENCE_TYPE) ++ { ++ // Convert to an unsigned integer of the correct width first. ++ tree utype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), 1); ++ e = fold_build1 (CONVERT_EXPR, utype, e); ++ } ++ + ret = convert_to_integer (type, e); + goto maybe_fold; + +@@ -121,7 +130,7 @@ d_convert_basic (tree type, tree expr) + tree + convert (tree type, tree expr) + { +- enum tree_code code = TREE_CODE (type); ++ tree_code code = TREE_CODE (type); + tree etype = TREE_TYPE (expr); + + switch (code) +--- a/src/gcc/d/d-ctype.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-ctype.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-ctype.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -32,7 +32,7 @@ Type::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + switch (ty) + { +@@ -134,7 +134,7 @@ Type::toCtype (void) + + + case Terror: +- return error_mark_node; ++ return d_unknown_type_node; + + /* We can get Tident with forward references. There seems to + be a legitame case (dstress:debug_info_03). I have not seen this +@@ -186,7 +186,7 @@ TypeTypedef::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + tree basetype = sym->basetype->toCtype(); + const char *name = toChars(); +@@ -217,10 +217,10 @@ TypeEnum::toCtype (void) + { + if (!ctype) + { +- /* Enums in D2 can have a base type that is not necessarily integral. +- So don't bother trying to make an ENUMERAL_TYPE using them. */ + if (!sym->memtype->isintegral() || sym->memtype->ty == Tbool) + { ++ // Enums in D2 can have a base type that is not necessarily integral. ++ // So don't bother trying to make an ENUMERAL_TYPE using them. + ctype = sym->memtype->toCtype(); + } + else +@@ -234,9 +234,8 @@ TypeEnum::toCtype (void) + if (flag_short_enums) + TYPE_PACKED (ctype) = 1; + +- TYPE_PRECISION (ctype) = size (0) * 8; ++ TYPE_PRECISION (ctype) = size (sym->loc) * 8; + TYPE_SIZE (ctype) = 0; +- TYPE_MAIN_VARIANT (ctype) = TYPE_MAIN_VARIANT (cmemtype); + + if (sym->userAttributes) + decl_attributes (&ctype, build_attributes (sym->userAttributes), +@@ -247,34 +246,34 @@ TypeEnum::toCtype (void) + layout_type (ctype); + TYPE_UNSIGNED (ctype) = TYPE_UNSIGNED (cmemtype); + +- // Move this to toDebug() ? + tree enum_values = NULL_TREE; + if (sym->members) + { + for (size_t i = 0; i < sym->members->dim; i++) + { +- EnumMember *member = (sym->members->tdata()[i])->isEnumMember(); ++ EnumMember *member = (*sym->members)[i]->isEnumMember(); + // Templated functions can seep through to the backend - just ignore for now. + if (member == NULL) + continue; + +- char *ident = NULL; +- if (sym->ident) +- ident = concat (sym->ident->string, ".", +- member->ident->string, NULL); +- +- tree tident = get_identifier (ident ? ident : member->ident->string); +- tree tvalue = build_integer_cst (member->value->toInteger(), ctype); +- enum_values = chainon (enum_values, build_tree_list (tident, tvalue)); ++ tree ident = get_identifier (member->ident->string); ++ tree value = build_integer_cst (member->value->toInteger(), cmemtype); ++ ++ // Build a identifier for the enumeration constant. ++ tree decl = build_decl (UNKNOWN_LOCATION, CONST_DECL, ident, cmemtype); ++ set_decl_location (decl, member->loc); ++ DECL_CONTEXT (decl) = ctype; ++ TREE_CONSTANT (decl) = 1; ++ TREE_READONLY (decl) = 1; ++ DECL_INITIAL (decl) = value; + +- if (sym->ident) +- free (ident); ++ // Add this enumeration constant to the list for this type. ++ enum_values = chainon (enum_values, build_tree_list (ident, decl)); + } + } +- TYPE_VALUES (ctype) = enum_values; + +- object_file->initTypeDecl (ctype, sym); +- object_file->declareType (ctype, sym); ++ TYPE_VALUES (ctype) = enum_values; ++ build_type_decl (ctype, sym); + } + } + +@@ -291,7 +290,7 @@ TypeStruct::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + // need to set this right away in case of self-references + ctype = make_node (sym->isUnionDeclaration() ? UNION_TYPE : RECORD_TYPE); +@@ -307,11 +306,11 @@ TypeStruct::toCtype (void) + TYPE_PACKED (ctype) = (sym->alignsize == 1); + compute_record_mode (ctype); + +- AggLayout agg_layout (sym, ctype); +- agg_layout.go(); +- agg_layout.finish (sym->userAttributes); ++ AggLayout al = AggLayout (sym, ctype); ++ layout_aggregate_type (&al, sym); ++ finish_aggregate_type (&al, sym->userAttributes); + +- object_file->initTypeDecl (ctype, sym); ++ build_type_decl (ctype, sym); + TYPE_CONTEXT (ctype) = d_decl_context (sym); + } + } +@@ -335,7 +334,7 @@ TypeFunction::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + tree type_list = NULL_TREE; + tree ret_type; +@@ -372,12 +371,16 @@ TypeFunction::toCtype (void) + TYPE_LANG_SPECIFIC (ctype) = build_d_type_lang_specific (this); + d_keep (ctype); + +- if (next->toBasetype()->ty == Tstruct) ++ if (ret_type != void_type_node) + { +- // Non-POD structs must return in memory. +- TypeStruct *ts = (TypeStruct *) next->toBasetype(); +- if (!ts->sym->isPOD()) +- TREE_ADDRESSABLE (ctype) = 1; ++ Type *tn = next->baseElemOf(); ++ if (tn->ty == Tstruct) ++ { ++ // Non-POD structs must return in memory. ++ TypeStruct *ts = (TypeStruct *) tn->toBasetype(); ++ if (!ts->sym->isPOD()) ++ TREE_ADDRESSABLE (ctype) = 1; ++ } + } + + switch (linkage) +@@ -394,7 +397,7 @@ TypeFunction::toCtype (void) + break; + + default: +- fprintf (stderr, "linkage = %d\n", linkage); ++ fprintf (global.stdmsg, "linkage = %d\n", linkage); + gcc_unreachable(); + } + } +@@ -403,7 +406,7 @@ TypeFunction::toCtype (void) + return ctype; + } + +-enum RET ++RET + TypeFunction::retStyle (void) + { + /* Return by reference or pointer. */ +@@ -426,13 +429,13 @@ TypeVector::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + int nunits = ((TypeSArray *) basetype)->dim->toUInteger(); + tree inner = elementType()->toCtype(); + + if (inner == void_type_node) +- inner = Type::tint8->toCtype(); ++ inner = Type::tuns8->toCtype(); + + ctype = build_vector_type (inner, nunits); + layout_type (ctype); +@@ -518,7 +521,7 @@ TypeAArray::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + /* Library functions expect a struct-of-pointer which could be passed + differently from a pointer. */ +@@ -528,6 +531,7 @@ TypeAArray::toCtype (void) + DECL_CONTEXT (ptr) = ctype; + TYPE_FIELDS (ctype) = ptr; + TYPE_NAME (ctype) = get_identifier (toChars()); ++ TYPE_TRANSPARENT_AGGR (ctype) = 1; + layout_type (ctype); + + TYPE_LANG_SPECIFIC (ctype) = build_d_type_lang_specific (this); +@@ -548,7 +552,7 @@ TypePointer::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + ctype = build_pointer_type (next->toCtype()); + } +@@ -567,7 +571,7 @@ TypeDelegate::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { + gcc_assert (next->toBasetype()->ty == Tfunction); + tree nexttype = next->toCtype(); +@@ -599,81 +603,48 @@ TypeClass::toCtype (void) + ctype = castMod(0)->toCtype(); + ctype = insert_type_modifiers (ctype, mod); + } +- else ++ else + { +- tree rec_type; +- Array base_class_decls; +- bool inherited = sym->baseClass != 0; +- tree obj_rec_type; +- tree vfield; +- +- /* Need to set ctype right away in case of self-references to +- the type during this call. */ +- rec_type = make_node (RECORD_TYPE); +- ctype = build_reference_type (rec_type); +- d_keep (ctype); // because BINFO moved out to toDebug +- +- obj_rec_type = TREE_TYPE (build_object_type()->toCtype()); ++ // Need to set ctype right away in case of self-references to ++ // the type during this call. ++ tree basetype = make_node (RECORD_TYPE); ++ ctype = build_reference_type (basetype); ++ d_keep (ctype); + +- // Note that this is set on the reference type, not the record type. ++ // Note that this is set on both the reference type and record type. + TYPE_LANG_SPECIFIC (ctype) = build_d_type_lang_specific (this); ++ TYPE_LANG_SPECIFIC (basetype) = TYPE_LANG_SPECIFIC (ctype); + +- AggLayout agg_layout (sym, rec_type); +- +- // Most of this silly code is just to produce correct debugging information. ++ // Add the fields of each base class ++ AggLayout al = AggLayout (sym, basetype); ++ layout_aggregate_type (&al, sym); ++ finish_aggregate_type (&al, sym->userAttributes); + +- /* gdb apparently expects the vtable field to be named +- "_vptr$...." (stabsread.c) Otherwise, the debugger gives +- lots of annoying error messages. C++ appends the class +- name of the first base witht that field after the '$'. */ +- /* update: annoying messages might not appear anymore after making +- other changes */ +- // Add the virtual table pointer +- tree decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, +- get_identifier ("_vptr$"), d_vtbl_ptr_type_node); +- agg_layout.addField (decl, 0); // %% target stuff.. +- +- if (inherited) +- { +- vfield = copy_node (decl); +- DECL_ARTIFICIAL (decl) = DECL_IGNORED_P (decl) = 1; +- } ++ // Create BINFO even if debugging is off. This is needed to keep ++ // references to inherited types. ++ if (!sym->isInterfaceDeclaration()) ++ TYPE_BINFO (basetype) = build_class_binfo (NULL_TREE, sym); + else + { +- vfield = decl; ++ unsigned offset = 0; ++ TYPE_BINFO (basetype) = build_interface_binfo (NULL_TREE, sym, offset); + } +- DECL_VIRTUAL_P (vfield) = 1; +- TYPE_VFIELD (rec_type) = vfield; // This only seems to affect debug info +- TREE_ADDRESSABLE (rec_type) = 1; + +- if (!sym->isInterfaceDeclaration()) ++ // Same for virtual methods too. ++ for (size_t i = 0; i < sym->vtbl.dim; i++) + { +- DECL_FCONTEXT (vfield) = obj_rec_type; +- +- // Add the monitor +- // %% target type +- decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, +- get_identifier ("_monitor"), ptr_type_node); +- DECL_FCONTEXT (decl) = obj_rec_type; +- DECL_ARTIFICIAL (decl) = DECL_IGNORED_P (decl) = inherited; +- agg_layout.addField (decl, Target::ptrsize); ++ FuncDeclaration *fd = sym->vtbl[i]->isFuncDeclaration(); ++ tree method = fd ? fd->toSymbol()->Stree : NULL_TREE; + +- // Add the fields of each base class +- agg_layout.go(); +- } +- else +- { +- ClassDeclaration *p = sym; +- while (p->baseclasses->dim) +- p = (p->baseclasses->tdata()[0])->base; +- +- DECL_FCONTEXT (vfield) = TREE_TYPE (p->type->toCtype()); ++ if (method && DECL_CONTEXT (method) == basetype) ++ { ++ DECL_CHAIN (method) = TYPE_METHODS (basetype); ++ TYPE_METHODS (basetype) = method; ++ } + } + +- agg_layout.finish (sym->userAttributes); +- +- object_file->initTypeDecl (rec_type, sym); +- TYPE_CONTEXT (rec_type) = d_decl_context (sym); ++ build_type_decl (basetype, sym); ++ TYPE_CONTEXT (basetype) = d_decl_context (sym); + } + } + +--- a/src/gcc/d/d-decls.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-decls.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-decls.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -28,34 +28,16 @@ + #include "init.h" + #include "module.h" + #include "statement.h" ++#include "ctfe.h" + + #include "dfrontend/target.h" + +-// Construct a SymbolDeclaration, whose components are a symbol S +-// and a struct declaration DSYM. +- +-SymbolDeclaration::SymbolDeclaration (Loc loc, Symbol *s, StructDeclaration *dsym) +- : Declaration (new Identifier (s->Sident, TOKidentifier)) +-{ +- this->loc = loc; +- sym = s; +- this->dsym = dsym; +- storage_class |= STCconst; +-} +- + // Create the symbol with tree for struct initialisers. + + Symbol * + SymbolDeclaration::toSymbol (void) + { +- // Create the actual back-end value if not yet done +- if (!sym->Stree) +- { +- if (dsym) +- dsym->toInitializer(); +- gcc_assert (sym->Stree); +- } +- return sym; ++ return dsym->toInitializer(); + } + + +@@ -65,14 +47,19 @@ SymbolDeclaration::toSymbol (void) + Symbol * + Dsymbol::toSymbolX (const char *prefix, int, type *, const char *suffix) + { +- const char *n = mangle(); +- unsigned nlen = strlen (n); +- size_t sz = (2 + nlen + sizeof (size_t) * 3 + strlen (prefix) + strlen (suffix) + 1); ++ const char *symbol = mangle(); ++ unsigned prefixlen = strlen (prefix); ++ size_t sz = (2 + strlen (symbol) + sizeof (size_t) * 3 + prefixlen + strlen (suffix) + 1); + Symbol *s = new Symbol(); + + s->Sident = XNEWVEC (const char, sz); +- snprintf (CONST_CAST (char *, s->Sident), sz, "_D%s%zu%s%s", +- n, strlen (prefix), prefix, suffix); ++ snprintf (CONST_CAST (char *, s->Sident), sz, "_D%s%u%s%s", ++ symbol, prefixlen, prefix, suffix); ++ ++ s->prettyIdent = XNEWVEC (const char, sz); ++ snprintf (CONST_CAST (char *, s->prettyIdent), sz, "%s.%s", ++ toPrettyChars(), prefix); ++ + return s; + } + +@@ -80,30 +67,69 @@ Dsymbol::toSymbolX (const char *prefix, + Symbol * + Dsymbol::toSymbol (void) + { +- fprintf (stderr, "Dsymbol::toSymbol() '%s', kind = '%s'\n", toChars(), kind()); ++ fprintf (global.stdmsg, "Dsymbol::toSymbol() '%s', kind = '%s'\n", toChars(), kind()); + gcc_unreachable(); // BUG: implement + return NULL; + } + +-// Generate an import symbol from symbol. ++// Generate an import symbol for debug. If this is a module or package symbol, ++// then build the chain of NAMESPACE_DECLs. + + Symbol * + Dsymbol::toImport (void) + { + if (!isym) + { +- if (!csym) +- csym = toSymbol(); +- isym = toImport (csym); ++ Module *m = this->isModule(); ++ if (m != NULL) ++ { ++ isym = new Symbol(); ++ isym->prettyIdent = this->toPrettyChars(); ++ ++ // Build the module namespace, this is considered toplevel, ++ // regardless if there are parent packages. ++ tree decl = build_decl (UNKNOWN_LOCATION, NAMESPACE_DECL, ++ get_identifier (isym->prettyIdent), ++ void_type_node); ++ isym->Stree = decl; ++ d_keep (decl); ++ ++ Loc loc = (m->md != NULL) ? m->md->loc : Loc (m, 1); ++ set_decl_location (decl, loc); ++ ++ if (output_module_p (m)) ++ DECL_EXTERNAL (decl) = 1; ++ ++ TREE_PUBLIC (decl) = 1; ++ DECL_CONTEXT (decl) = NULL_TREE; ++ } ++ else ++ { ++ // Any other kind of symbol should have their csym set. ++ // If this is an unexpected import, the compiler will throw an error. ++ if (!csym) ++ csym = toSymbol(); ++ ++ isym = toImport (csym); ++ } + } ++ + return isym; + } + ++// Generate an IMPORTED_DECL from symbol SYM. ++ + Symbol * +-Dsymbol::toImport (Symbol *) ++Dsymbol::toImport (Symbol *sym) + { +- // This is not used in GDC (yet?) +- return NULL; ++ tree decl = make_node (IMPORTED_DECL); ++ TREE_TYPE (decl) = void_type_node; ++ IMPORTED_DECL_ASSOCIATED_DECL (decl) = sym->Stree; ++ d_keep (decl); ++ ++ Symbol *s = new Symbol(); ++ s->Stree = decl; ++ return s; + } + + +@@ -114,12 +140,9 @@ VarDeclaration::toSymbol (void) + { + if (!csym) + { +- tree var_decl; +- enum tree_code decl_kind; +- + // For field declaration, it is possible for toSymbol to be called + // before the parent's toCtype() +- if (storage_class & STCfield) ++ if (isField()) + { + AggregateDeclaration *parent_decl = toParent()->isAggregateDeclaration(); + gcc_assert (parent_decl); +@@ -139,115 +162,88 @@ VarDeclaration::toSymbol (void) + else + csym->Sident = ident->string; + +- if (storage_class & STCparameter) +- decl_kind = PARM_DECL; +- else if (storage_class & STCmanifest) +- decl_kind = CONST_DECL; +- else +- decl_kind = VAR_DECL; +- +- var_decl = build_decl (UNKNOWN_LOCATION, decl_kind, get_identifier (csym->Sident), +- declaration_type (this)); +- +- csym->Stree = var_decl; ++ tree_code code = isParameter() ? PARM_DECL ++ : !canTakeAddressOf() ? CONST_DECL ++ : VAR_DECL; ++ ++ tree decl = build_decl (UNKNOWN_LOCATION, code, ++ get_identifier (ident->string), ++ declaration_type (this)); ++ DECL_CONTEXT (decl) = d_decl_context (this); ++ set_decl_location (decl, this); + +- if (decl_kind != CONST_DECL) ++ if (isParameter()) + { +- if (isDataseg()) +- { +- tree id = get_identifier (csym->Sident); +- if (protection == PROTpublic || storage_class & (STCstatic | STCextern)) +- id = targetm.mangle_decl_assembler_name (var_decl, id); +- SET_DECL_ASSEMBLER_NAME (var_decl, id); +- } ++ DECL_ARG_TYPE (decl) = TREE_TYPE (decl); ++ gcc_assert (TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL); + } ++ else if (!canTakeAddressOf()) ++ { ++ // Manifest constants have no address in memory. ++ TREE_CONSTANT (decl) = 1; ++ TREE_READONLY (decl) = 1; ++ TREE_STATIC (decl) = 0; ++ } ++ else if (isDataseg()) ++ { ++ if (this->mangleOverride) ++ set_user_assembler_name (decl, this->mangleOverride); ++ else ++ { ++ tree mangle = get_identifier (csym->Sident); + +- DECL_LANG_SPECIFIC (var_decl) = build_d_decl_lang_specific (this); +- d_keep (var_decl); +- object_file->setDeclLoc (var_decl, this); +- +- if (decl_kind == VAR_DECL) +- object_file->setupSymbolStorage (this, var_decl); +- else if (decl_kind == PARM_DECL) +- { +- /* from gcc code: Some languages have different nominal and real types. */ +- // %% What about DECL_ORIGINAL_TYPE, DECL_ARG_TYPE_AS_WRITTEN, DECL_ARG_TYPE ? +- DECL_ARG_TYPE (var_decl) = TREE_TYPE (var_decl); +- DECL_CONTEXT (var_decl) = d_decl_context (this); +- gcc_assert (TREE_CODE (DECL_CONTEXT (var_decl)) == FUNCTION_DECL); +- } +- else if (decl_kind == CONST_DECL) +- { +- /* Not sure how much of an optimization this is... It is needed +- for foreach loops on tuples which 'declare' the index variable +- as a constant for each iteration. */ +- Expression *e = NULL; ++ if (protection == PROTpublic || storage_class & (STCstatic | STCextern)) ++ mangle = targetm.mangle_decl_assembler_name (decl, mangle); + +- if (init) +- { +- if (!init->isVoidInitializer()) +- { +- e = init->toExpression(); +- gcc_assert (e != NULL); +- } ++ SET_DECL_ASSEMBLER_NAME (decl, mangle); + } +- else +- e = type->defaultInit(); + +- if (e) +- DECL_INITIAL (var_decl) = e->toElem (cirstate); ++ setup_symbol_storage (this, decl, false); + } + ++ DECL_LANG_SPECIFIC (decl) = build_d_decl_lang_specific (this); ++ d_keep (decl); ++ csym->Stree = decl; ++ + // Can't set TREE_STATIC, etc. until we get to toObjFile as this could be +- // called from a varaible in an imported module +- // %% (out const X x) doesn't mean the reference is const... ++ // called from a variable in an imported module. + if ((isConst() || isImmutable()) && (storage_class & STCinit) + && !decl_reference_p (this)) + { +- // %% CONST_DECLS don't have storage, so we can't use those, +- // but it would be nice to get the benefit of them (could handle in +- // VarExp -- makeAddressOf could switch back to the VAR_DECL +- +- if (!TREE_STATIC (var_decl)) +- TREE_READONLY (var_decl) = 1; ++ if (!TREE_STATIC (decl)) ++ TREE_READONLY (decl) = 1; + else + csym->Sreadonly = true; + +- // can at least do this... +- // const doesn't seem to matter for aggregates, so prevent problems.. ++ // Const doesn't seem to matter for aggregates, so prevent problems. + if (isConst() && isDataseg()) +- TREE_CONSTANT (var_decl) = 1; ++ TREE_CONSTANT (decl) = 1; + } + + // Propagate volatile. +- if (TYPE_VOLATILE (TREE_TYPE (var_decl))) +- TREE_THIS_VOLATILE (var_decl) = 1; ++ if (TYPE_VOLATILE (TREE_TYPE (decl))) ++ TREE_THIS_VOLATILE (decl) = 1; + + #if TARGET_DLLIMPORT_DECL_ATTRIBUTES + // Have to test for import first + if (isImportedSymbol()) + { +- insert_decl_attributes (var_decl, "dllimport"); +- DECL_DLLIMPORT_P (var_decl) = 1; ++ insert_decl_attribute (decl, "dllimport"); ++ DECL_DLLIMPORT_P (decl) = 1; + } + else if (isExport()) +- insert_decl_attributes (var_decl, "dllexport"); ++ insert_decl_attribute (decl, "dllexport"); + #endif + +- if (isDataseg() && isThreadlocal()) ++ if (global.params.vtls && isDataseg() && isThreadlocal()) + { +- // Tell backend this is a thread local decl. +- DECL_TLS_MODEL (var_decl) = decl_default_tls_model (var_decl); +- +- if (global.params.vtls) +- { +- char *p = loc.toChars(); +- fprintf (stderr, "%s: %s is thread local\n", p ? p : "", toChars()); +- if (p) +- free (p); +- } ++ char *p = loc.toChars(); ++ fprintf (global.stdmsg, "%s: %s is thread local\n", p ? p : "", toChars()); ++ if (p) ++ free (p); + } + } ++ + return csym; + } + +@@ -259,14 +255,6 @@ ClassInfoDeclaration::toSymbol (void) + return cd->toSymbol(); + } + +-// Create the symbol with tree for moduleinfo decls. +- +-Symbol * +-ModuleInfoDeclaration::toSymbol (void) +-{ +- return mod->toSymbol(); +-} +- + // Create the symbol with tree for typeinfo decls. + + Symbol * +@@ -280,12 +268,14 @@ TypeInfoDeclaration::toSymbol (void) + // given TypeInfo. It is the actual data, not a reference + gcc_assert (TREE_CODE (TREE_TYPE (csym->Stree)) == REFERENCE_TYPE); + TREE_TYPE (csym->Stree) = TREE_TYPE (TREE_TYPE (csym->Stree)); ++ relayout_decl (csym->Stree); + TREE_USED (csym->Stree) = 1; + +- // In gdc, built-in typeinfo will be referenced as one-only. ++ // Built-in typeinfo will be referenced as one-only. + D_DECL_ONE_ONLY (csym->Stree) = 1; +- object_file->makeDeclOneOnly (csym->Stree); ++ d_comdat_linkage (csym->Stree); + } ++ + return csym; + } + +@@ -317,180 +307,154 @@ FuncDeclaration::toSymbol (void) + { + csym = new Symbol(); + +- if (!isym) +- { +- tree id; +- TypeFunction *ftype = (TypeFunction *) (tintro ? tintro : type); +- tree fndecl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, +- NULL_TREE, NULL_TREE); +- tree fntype = NULL_TREE; +- tree vindex = NULL_TREE; ++ TypeFunction *ftype = (TypeFunction *) (tintro ? tintro : type); ++ tree fntype = NULL_TREE; ++ tree vindex = NULL_TREE; + +- csym->Stree = fndecl; +- +- if (ident) +- id = get_identifier (ident->string); +- else +- { +- static unsigned unamed_seq = 0; +- char buf[64]; +- snprintf (buf, sizeof(buf), "___unamed_%u", ++unamed_seq); +- id = get_identifier (buf); +- } +- DECL_NAME (fndecl) = id; +- DECL_CONTEXT (fndecl) = d_decl_context (this); +- +- if (needs_static_chain (this)) +- { +- D_DECL_STATIC_CHAIN (fndecl) = 1; +- // Save context and set decl_function_context for cgraph. +- csym->ScontextDecl = DECL_CONTEXT (fndecl); +- DECL_CONTEXT (fndecl) = decl_function_context (fndecl); +- } ++ // Save mangle/debug names for making thunks. ++ csym->Sident = mangleExact(); ++ csym->prettyIdent = toPrettyChars(); + ++ tree id = get_identifier (this->isMain() ++ ? csym->prettyIdent : ident->string); ++ tree fndecl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, id, NULL_TREE); ++ DECL_CONTEXT (fndecl) = d_decl_context (this); + +- /* Nested functions may not have its toObjFile called before the outer +- function is finished. GCC requires that nested functions be finished +- first so we need to arrange for toObjFile to be called earlier. */ +- Dsymbol *outer = toParent2(); +- if (outer && outer->isFuncDeclaration()) +- { +- Symbol *osym = outer->toSymbol(); ++ csym->Stree = fndecl; + +- if (osym->outputStage != Finished) +- ((FuncDeclaration *) outer)->deferred.push (this); +- } ++ if (needs_static_chain (this)) ++ { ++ D_DECL_STATIC_CHAIN (fndecl) = 1; ++ // Save context and set decl_function_context for cgraph. ++ csym->ScontextDecl = DECL_CONTEXT (fndecl); ++ DECL_CONTEXT (fndecl) = decl_function_context (fndecl); ++ } + +- TREE_TYPE (fndecl) = ftype->toCtype(); +- DECL_LANG_SPECIFIC (fndecl) = build_d_decl_lang_specific (this); +- d_keep (fndecl); ++ TREE_TYPE (fndecl) = ftype->toCtype(); ++ DECL_LANG_SPECIFIC (fndecl) = build_d_decl_lang_specific (this); ++ d_keep (fndecl); + +- if (isNested()) +- { +- /* Even if D-style nested functions are not implemented, add an +- extra argument to be compatible with delegates. */ +- fntype = build_method_type (void_type_node, TREE_TYPE (fndecl)); +- } +- else if (isThis()) +- { +- // Do this even if there is no debug info. It is needed to make +- // sure member functions are not called statically +- AggregateDeclaration *agg_decl = isMember2(); +- tree handle = agg_decl->handle->toCtype(); +- +- // If handle is a pointer type, get record type. +- if (!agg_decl->isStructDeclaration()) +- handle = TREE_TYPE (handle); ++ if (isNested()) ++ { ++ // Even if D-style nested functions are not implemented, add an ++ // extra argument to be compatible with delegates. ++ fntype = build_method_type (void_type_node, TREE_TYPE (fndecl)); ++ } ++ else if (isThis()) ++ { ++ // Do this even if there is no debug info. It is needed to make ++ // sure member functions are not called statically ++ AggregateDeclaration *agg_decl = isMember2(); ++ tree handle = agg_decl->handle->toCtype(); + +- fntype = build_method_type (handle, TREE_TYPE (fndecl)); ++ // If handle is a pointer type, get record type. ++ if (!agg_decl->isStructDeclaration()) ++ handle = TREE_TYPE (handle); + +- if (isVirtual()) +- vindex = size_int (vtblIndex); +- } +- else if (isMain() && ftype->nextOf()->toBasetype()->ty == Tvoid) +- { +- // void main() implicitly converted to int main(). +- fntype = build_function_type (integer_type_node, TYPE_ARG_TYPES (TREE_TYPE (fndecl))); +- } ++ fntype = build_method_type (handle, TREE_TYPE (fndecl)); + +- if (fntype != NULL_TREE) +- { +- TYPE_ATTRIBUTES (fntype) = TYPE_ATTRIBUTES (TREE_TYPE (fndecl)); +- TYPE_LANG_SPECIFIC (fntype) = TYPE_LANG_SPECIFIC (TREE_TYPE (fndecl)); +- TREE_ADDRESSABLE (fntype) = TREE_ADDRESSABLE (TREE_TYPE (fndecl)); +- TREE_TYPE (fndecl) = fntype; +- d_keep (fntype); +- } ++ if (isVirtual() && vtblIndex != -1) ++ vindex = size_int (vtblIndex); ++ } ++ else if (isMain() && ftype->nextOf()->toBasetype()->ty == Tvoid) ++ { ++ // void main() implicitly converted to int main(). ++ fntype = build_function_type (integer_type_node, TYPE_ARG_TYPES (TREE_TYPE (fndecl))); ++ } + +- if (ident) +- { +- csym->Sident = mangle(); // save for making thunks +- csym->prettyIdent = toPrettyChars(); +- tree id = get_identifier (csym->Sident); +- id = targetm.mangle_decl_assembler_name (fndecl, id); +- SET_DECL_ASSEMBLER_NAME (fndecl, id); +- } ++ if (fntype != NULL_TREE) ++ { ++ TYPE_ATTRIBUTES (fntype) = TYPE_ATTRIBUTES (TREE_TYPE (fndecl)); ++ TYPE_LANG_SPECIFIC (fntype) = TYPE_LANG_SPECIFIC (TREE_TYPE (fndecl)); ++ TREE_ADDRESSABLE (fntype) = TREE_ADDRESSABLE (TREE_TYPE (fndecl)); ++ TREE_TYPE (fndecl) = fntype; ++ d_keep (fntype); ++ } + +- if (vindex) +- { +- DECL_VINDEX (fndecl) = vindex; +- DECL_VIRTUAL_P (fndecl) = 1; +- } ++ if (this->mangleOverride) ++ set_user_assembler_name (fndecl, this->mangleOverride); ++ else ++ { ++ tree mangle = get_identifier (csym->Sident); ++ mangle = targetm.mangle_decl_assembler_name (fndecl, mangle); ++ SET_DECL_ASSEMBLER_NAME (fndecl, mangle); ++ } + +- if (isMember2() || isFuncLiteralDeclaration()) +- { +- // See grokmethod in cp/decl.c +- DECL_DECLARED_INLINE_P (fndecl) = 1; +- DECL_NO_INLINE_WARNING_P (fndecl) = 1; +- } +- // Don't know what to do with this. +- else if (flag_inline_functions && canInline (0, 1, 0)) +- { +- DECL_DECLARED_INLINE_P (fndecl) = 1; +- DECL_NO_INLINE_WARNING_P (fndecl) = 1; +- } ++ if (vindex) ++ { ++ DECL_VINDEX (fndecl) = vindex; ++ DECL_VIRTUAL_P (fndecl) = 1; ++ } + +- if (naked) +- { +- DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl) = 1; +- DECL_UNINLINABLE (fndecl) = 1; +- } ++ if (isMember2() || isFuncLiteralDeclaration()) ++ { ++ // See grokmethod in cp/decl.c ++ DECL_DECLARED_INLINE_P (fndecl) = 1; ++ DECL_NO_INLINE_WARNING_P (fndecl) = 1; ++ } ++ // Don't know what to do with this. ++ else if (flag_inline_functions && canInline (0, 1, 0)) ++ { ++ DECL_DECLARED_INLINE_P (fndecl) = 1; ++ DECL_NO_INLINE_WARNING_P (fndecl) = 1; ++ } + +- // These are always compiler generated. +- if (isArrayOp) +- { +- DECL_ARTIFICIAL (fndecl) = 1; +- D_DECL_ONE_ONLY (fndecl) = 1; +- } +- // So are ensure and require contracts. +- if (ident == Id::ensure || ident == Id::require) +- { +- DECL_ARTIFICIAL (fndecl) = 1; +- TREE_PUBLIC (fndecl) = 1; +- } ++ if (naked) ++ { ++ DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl) = 1; ++ DECL_UNINLINABLE (fndecl) = 1; ++ } + +- if (isStatic()) +- TREE_STATIC (fndecl) = 1; ++ // These are always compiler generated. ++ if (isArrayOp) ++ { ++ DECL_ARTIFICIAL (fndecl) = 1; ++ D_DECL_ONE_ONLY (fndecl) = 1; ++ } ++ // So are ensure and require contracts. ++ if (ident == Id::ensure || ident == Id::require) ++ { ++ DECL_ARTIFICIAL (fndecl) = 1; ++ TREE_PUBLIC (fndecl) = 1; ++ } + +- // Assert contracts in functions cause implicit side effects that could +- // cause wrong codegen if pure/nothrow is thrown in the equation. +- if (!global.params.useAssert) +- { +- // Cannot mark as pure as in 'no side effects' if the function either +- // returns by ref, or has an internal state 'this'. +- // Note, pure D functions don't imply nothrow. +- if (isPure() == PUREstrong && vthis == NULL +- && ftype->isnothrow && ftype->retStyle() == RETstack) +- DECL_PURE_P (fndecl) = 1; ++ // Storage class attributes ++ if (storage_class & STCstatic) ++ TREE_STATIC (fndecl) = 1; + +- if (ftype->isnothrow) +- TREE_NOTHROW (fndecl) = 1; +- } ++ // Assert contracts in functions cause implicit side effects that could ++ // cause wrong codegen if pure/nothrow is thrown in the equation. ++ if (!global.params.useAssert) ++ { ++ // Cannot mark as pure as in 'no side effects' if the function either ++ // returns by ref, or has an internal state 'this'. ++ // Note, pure D functions don't imply nothrow. ++ if (isPure() == PUREstrong && vthis == NULL ++ && ftype->isnothrow && ftype->retStyle() == RETstack) ++ DECL_PURE_P (fndecl) = 1; ++ } + + #if TARGET_DLLIMPORT_DECL_ATTRIBUTES +- // Have to test for import first +- if (isImportedSymbol()) +- { +- insert_decl_attributes (fndecl, "dllimport"); +- DECL_DLLIMPORT_P (fndecl) = 1; +- } +- else if (isExport()) +- insert_decl_attributes (fndecl, "dllexport"); ++ // Have to test for import first ++ if (isImportedSymbol()) ++ { ++ insert_decl_attribute (fndecl, "dllimport"); ++ DECL_DLLIMPORT_P (fndecl) = 1; ++ } ++ else if (isExport()) ++ insert_decl_attribute (fndecl, "dllexport"); + #endif +- object_file->setDeclLoc (fndecl, this); +- object_file->setupSymbolStorage (this, fndecl); +- if (!ident) +- TREE_PUBLIC (fndecl) = 0; ++ set_decl_location (fndecl, this); ++ setup_symbol_storage (this, fndecl, false); + +- TREE_USED (fndecl) = 1; // %% Probably should be a little more intelligent about this ++ if (!ident) ++ TREE_PUBLIC (fndecl) = 0; + +- maybe_set_builtin_frontend (this); +- } +- else +- { +- csym->Stree = isym->Stree; +- } ++ TREE_USED (fndecl) = 1; // %% Probably should be a little more intelligent about this ++ ++ maybe_set_builtin_frontend (this); + } ++ + return csym; + } + +@@ -511,7 +475,7 @@ FuncDeclaration::toThunkSymbol (int offs + is a list of all thunks for a given function. */ + bool found = false; + +- for (size_t i = 0; i < csym->thunks.dim; i++) ++ for (size_t i = 0; i < csym->thunks.length(); i++) + { + thunk = csym->thunks[i]; + if (thunk->offset == offset) +@@ -525,7 +489,7 @@ FuncDeclaration::toThunkSymbol (int offs + { + thunk = new Thunk(); + thunk->offset = offset; +- csym->thunks.push (thunk); ++ csym->thunks.safe_push (thunk); + } + + if (!thunk->symbol) +@@ -540,14 +504,14 @@ FuncDeclaration::toThunkSymbol (int offs + tree thunk_decl = build_decl (DECL_SOURCE_LOCATION (target_func_decl), + FUNCTION_DECL, NULL_TREE, TREE_TYPE (target_func_decl)); + DECL_LANG_SPECIFIC (thunk_decl) = DECL_LANG_SPECIFIC (target_func_decl); +- DECL_CONTEXT (thunk_decl) = d_decl_context (this); // from c++... + TREE_READONLY (thunk_decl) = TREE_READONLY (target_func_decl); + TREE_THIS_VOLATILE (thunk_decl) = TREE_THIS_VOLATILE (target_func_decl); + TREE_NOTHROW (thunk_decl) = TREE_NOTHROW (target_func_decl); + +- /* Thunks inherit the public/private access of the function they are targetting. */ ++ DECL_CONTEXT (thunk_decl) = d_decl_context (this); ++ ++ /* Thunks inherit the public access of the function they are targetting. */ + TREE_PUBLIC (thunk_decl) = TREE_PUBLIC (target_func_decl); +- TREE_PRIVATE (thunk_decl) = TREE_PRIVATE (target_func_decl); + DECL_EXTERNAL (thunk_decl) = 0; + + /* Thunks are always addressable. */ +@@ -569,10 +533,11 @@ FuncDeclaration::toThunkSymbol (int offs + d_keep (thunk_decl); + sthunk->Stree = thunk_decl; + +- object_file->doThunk (thunk_decl, target_func_decl, offset); ++ use_thunk (thunk_decl, target_func_decl, offset); + + thunk->symbol = sthunk; + } ++ + return thunk->symbol; + } + +@@ -587,16 +552,19 @@ ClassDeclaration::toSymbol (void) + csym = toSymbolX ("__Class", 0, 0, "Z"); + + tree decl = build_decl (BUILTINS_LOCATION, VAR_DECL, +- get_identifier (csym->Sident), d_unknown_type_node); ++ get_identifier (csym->prettyIdent), d_unknown_type_node); ++ SET_DECL_ASSEMBLER_NAME (decl, get_identifier (csym->Sident)); + csym->Stree = decl; + d_keep (decl); + +- object_file->setupStaticStorage (this, decl); +- object_file->setDeclLoc (decl, this); ++ setup_symbol_storage (this, decl, true); ++ set_decl_location (decl, this); + ++ DECL_ARTIFICIAL (decl) = 1; + // ClassInfo cannot be const data, because we use the monitor on it. + TREE_CONSTANT (decl) = 0; + } ++ + return csym; + } + +@@ -610,19 +578,22 @@ InterfaceDeclaration::toSymbol (void) + csym = toSymbolX ("__Interface", 0, 0, "Z"); + + tree decl = build_decl (BUILTINS_LOCATION, VAR_DECL, +- get_identifier (csym->Sident), d_unknown_type_node); ++ get_identifier (csym->prettyIdent), d_unknown_type_node); ++ SET_DECL_ASSEMBLER_NAME (decl, get_identifier (csym->Sident)); + csym->Stree = decl; + d_keep (decl); + +- object_file->setupStaticStorage (this, decl); +- object_file->setDeclLoc (decl, this); ++ setup_symbol_storage (this, decl, true); ++ set_decl_location (decl, this); + ++ DECL_ARTIFICIAL (decl) = 1; + TREE_CONSTANT (decl) = 1; + } ++ + return csym; + } + +-// Create the "ModuleInfo" symbol for given module. ++// Create the "ModuleInfo" symbol for a given module. + + Symbol * + Module::toSymbol (void) +@@ -632,20 +603,85 @@ Module::toSymbol (void) + csym = toSymbolX ("__ModuleInfo", 0, 0, "Z"); + + tree decl = build_decl (BUILTINS_LOCATION, VAR_DECL, +- get_identifier (csym->Sident), d_unknown_type_node); ++ get_identifier (csym->prettyIdent), d_unknown_type_node); ++ SET_DECL_ASSEMBLER_NAME (decl, get_identifier (csym->Sident)); + csym->Stree = decl; + d_keep (decl); + +- object_file->setupStaticStorage (this, decl); +- object_file->setDeclLoc (decl, this); ++ setup_symbol_storage (this, decl, true); ++ set_decl_location (decl, this); + ++ DECL_ARTIFICIAL (decl) = 1; + // Not readonly, moduleinit depends on this. + TREE_CONSTANT (decl) = 0; + TREE_READONLY (decl) = 0; + } ++ + return csym; + } + ++Symbol * ++StructLiteralExp::toSymbol (void) ++{ ++ if (!sym) ++ { ++ sym = new Symbol(); ++ ++ // Build reference symbol. ++ tree ctype = type->toCtype(); ++ tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, ctype); ++ get_unique_name (decl, "*"); ++ set_decl_location (decl, loc); ++ ++ TREE_PUBLIC (decl) = 0; ++ TREE_STATIC (decl) = 1; ++ TREE_READONLY (decl) = 1; ++ TREE_USED (decl) = 1; ++ DECL_ARTIFICIAL (decl) = 1; ++ ++ sym->Stree = decl; ++ this->sinit = sym; ++ ++ toDt (&sym->Sdt); ++ d_finish_symbol (sym); ++ } ++ ++ return sym; ++} ++ ++Symbol * ++ClassReferenceExp::toSymbol (void) ++{ ++ if (!value->sym) ++ { ++ value->sym = new Symbol(); ++ ++ // Build reference symbol. ++ tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, d_unknown_type_node); ++ char *ident; ++ ++ ASM_FORMAT_PRIVATE_NAME (ident, "*", DECL_UID (decl)); ++ DECL_NAME (decl) = get_identifier (ident); ++ set_decl_location (decl, loc); ++ ++ TREE_PUBLIC (decl) = 0; ++ TREE_STATIC (decl) = 1; ++ TREE_READONLY (decl) = 1; ++ TREE_USED (decl) = 1; ++ DECL_ARTIFICIAL (decl) = 1; ++ ++ value->sym->Stree = decl; ++ value->sym->Sident = ident; ++ ++ toInstanceDt (&value->sym->Sdt); ++ d_finish_symbol (value->sym); ++ ++ value->sinit = value->sym; ++ } ++ ++ return value->sym; ++} ++ + // Create the "vtbl" symbol for ClassDeclaration. + // This is accessible via the ClassData, but since it is frequently + // needed directly (like for rtti comparisons), make it directly accessible. +@@ -655,30 +691,26 @@ ClassDeclaration::toVtblSymbol (void) + { + if (!vtblsym) + { +- tree decl; +- + vtblsym = toSymbolX ("__vtbl", 0, 0, "Z"); + + /* The DECL_INITIAL value will have a different type object from the + VAR_DECL. The back end seems to accept this. */ +- TypeSArray *vtbl_type = new TypeSArray (Type::tvoidptr, +- new IntegerExp (loc, vtbl.dim, Type::tindex)); +- +- decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, +- get_identifier (vtblsym->Sident), vtbl_type->toCtype()); ++ Type *vtbltype = TypeSArray::makeType (loc, Type::tvoidptr, vtbl.dim); ++ tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, ++ get_identifier (vtblsym->prettyIdent), vtbltype->toCtype()); ++ SET_DECL_ASSEMBLER_NAME (decl, get_identifier (vtblsym->Sident)); + vtblsym->Stree = decl; + d_keep (decl); + +- object_file->setupStaticStorage (this, decl); +- object_file->setDeclLoc (decl, this); ++ setup_symbol_storage (this, decl, true); ++ set_decl_location (decl, this); + + TREE_READONLY (decl) = 1; + TREE_CONSTANT (decl) = 1; + TREE_ADDRESSABLE (decl) = 1; +- // from cp/class.c +- DECL_CONTEXT (decl) = d_decl_context (this); + DECL_ARTIFICIAL (decl) = 1; +- DECL_VIRTUAL_P (decl) = 1; ++ ++ DECL_CONTEXT (decl) = d_decl_context (this); + DECL_ALIGN (decl) = TARGET_VTABLE_ENTRY_ALIGN; + } + return vtblsym; +@@ -700,31 +732,37 @@ AggregateDeclaration::toInitializer (voi + { + if (!sinit) + { ++ StructDeclaration *sd = isStructDeclaration(); + sinit = toSymbolX ("__init", 0, 0, "Z"); + +- StructDeclaration *sd = isStructDeclaration(); + if (sd) + sinit->Salignment = sd->alignment; + } + +- if (!sinit->Stree && object_file != NULL) ++ if (!sinit->Stree && current_module_decl) + { +- tree struct_type = type->toCtype(); +- if (POINTER_TYPE_P (struct_type)) +- struct_type = TREE_TYPE (struct_type); // for TypeClass, want the RECORD_TYPE, not the REFERENCE_TYPE +- tree t = build_decl (UNKNOWN_LOCATION, VAR_DECL, +- get_identifier (sinit->Sident), struct_type); +- sinit->Stree = t; +- d_keep (t); +- +- object_file->setupStaticStorage (this, t); +- object_file->setDeclLoc (t, this); +- +- TREE_ADDRESSABLE (t) = 1; +- TREE_READONLY (t) = 1; +- TREE_CONSTANT (t) = 1; +- DECL_CONTEXT (t) = 0; // These are always global ++ tree stype; ++ if (isStructDeclaration()) ++ stype = type->toCtype(); ++ else ++ stype = TREE_TYPE (type->toCtype()); ++ ++ sinit->Stree = build_decl (UNKNOWN_LOCATION, VAR_DECL, ++ get_identifier (sinit->prettyIdent), stype); ++ SET_DECL_ASSEMBLER_NAME (sinit->Stree, get_identifier (sinit->Sident)); ++ d_keep (sinit->Stree); ++ ++ setup_symbol_storage (this, sinit->Stree, true); ++ set_decl_location (sinit->Stree, this); ++ ++ TREE_ADDRESSABLE (sinit->Stree) = 1; ++ TREE_READONLY (sinit->Stree) = 1; ++ TREE_CONSTANT (sinit->Stree) = 1; ++ DECL_ARTIFICIAL (sinit->Stree) = 1; ++ // These initialisers are always global. ++ DECL_CONTEXT (sinit->Stree) = NULL_TREE; + } ++ + return sinit; + } + +@@ -733,28 +771,25 @@ AggregateDeclaration::toInitializer (voi + Symbol * + TypedefDeclaration::toInitializer (void) + { +- Symbol *s; +- + if (!sinit) ++ sinit = toSymbolX ("__init", 0, 0, "Z"); ++ ++ if (!sinit->Stree && current_module_decl) + { +- s = toSymbolX ("__init", 0, 0, "Z"); +- sinit = s; +- sinit->Sdt = ((TypeTypedef *) type)->sym->init->toDt(); +- } +- +- if (!sinit->Stree && object_file != NULL) +- { +- tree t = build_decl (UNKNOWN_LOCATION, VAR_DECL, +- get_identifier (sinit->Sident), type->toCtype()); +- sinit->Stree = t; +- d_keep (t); +- +- object_file->setupStaticStorage (this, t); +- object_file->setDeclLoc (t, this); +- TREE_CONSTANT (t) = 1; +- TREE_READONLY (t) = 1; +- DECL_CONTEXT (t) = 0; ++ sinit->Stree = build_decl (UNKNOWN_LOCATION, VAR_DECL, ++ get_identifier (sinit->prettyIdent), type->toCtype()); ++ SET_DECL_ASSEMBLER_NAME (sinit->Stree, get_identifier (sinit->Sident)); ++ d_keep (sinit->Stree); ++ ++ setup_symbol_storage (this, sinit->Stree, true); ++ set_decl_location (sinit->Stree, this); ++ ++ TREE_CONSTANT (sinit->Stree) = 1; ++ TREE_READONLY (sinit->Stree) = 1; ++ DECL_ARTIFICIAL (sinit->Stree) = 1; ++ DECL_CONTEXT (sinit->Stree) = NULL_TREE; + } ++ + return sinit; + } + +@@ -763,92 +798,43 @@ TypedefDeclaration::toInitializer (void) + Symbol * + EnumDeclaration::toInitializer (void) + { +- Symbol *s; +- + if (!sinit) + { + Identifier *ident_save = ident; + if (!ident) + ident = Lexer::uniqueId("__enum"); +- s = toSymbolX ("__init", 0, 0, "Z"); ++ sinit = toSymbolX ("__init", 0, 0, "Z"); + ident = ident_save; +- sinit = s; + } + +- if (!sinit->Stree && object_file != NULL) ++ if (!sinit->Stree && current_module_decl) + { +- tree t = build_decl (UNKNOWN_LOCATION, VAR_DECL, +- get_identifier (sinit->Sident), type->toCtype()); +- sinit->Stree = t; +- d_keep (t); +- +- object_file->setupStaticStorage (this, t); +- object_file->setDeclLoc (t, this); +- TREE_CONSTANT (t) = 1; +- TREE_READONLY (t) = 1; +- DECL_CONTEXT (t) = 0; ++ sinit->Stree = build_decl (UNKNOWN_LOCATION, VAR_DECL, ++ get_identifier (sinit->prettyIdent), type->toCtype()); ++ SET_DECL_ASSEMBLER_NAME (sinit->Stree, get_identifier (sinit->Sident)); ++ d_keep (sinit->Stree); ++ ++ setup_symbol_storage (this, sinit->Stree, true); ++ set_decl_location (sinit->Stree, this); ++ ++ TREE_CONSTANT (sinit->Stree) = 1; ++ TREE_READONLY (sinit->Stree) = 1; ++ DECL_ARTIFICIAL (sinit->Stree) = 1; ++ DECL_CONTEXT (sinit->Stree) = NULL_TREE; + } ++ + return sinit; + } + + +-/* Create debug information for a ClassDeclaration's inheritance tree. +- Interfaces are not included. */ +-static tree +-binfo_for (tree tgt_binfo, ClassDeclaration *cls) +-{ +- tree binfo = make_tree_binfo (1); +- // Want RECORD_TYPE, not REFERENCE_TYPE +- TREE_TYPE (binfo) = TREE_TYPE (cls->type->toCtype()); +- BINFO_INHERITANCE_CHAIN (binfo) = tgt_binfo; +- BINFO_OFFSET (binfo) = integer_zero_node; +- +- if (cls->baseClass) +- BINFO_BASE_APPEND (binfo, binfo_for (binfo, cls->baseClass)); +- +- return binfo; +-} +- +-/* Create debug information for an InterfaceDeclaration's inheritance +- tree. In order to access all inherited methods in the debugger, +- the entire tree must be described. +- +- This function makes assumptions about inherface layout. */ +-static tree +-intfc_binfo_for (tree tgt_binfo, ClassDeclaration *iface, unsigned& inout_offset) +-{ +- tree binfo = make_tree_binfo (iface->baseclasses->dim); +- +- // Want RECORD_TYPE, not REFERENCE_TYPE +- TREE_TYPE (binfo) = TREE_TYPE (iface->type->toCtype()); +- BINFO_INHERITANCE_CHAIN (binfo) = tgt_binfo; +- BINFO_OFFSET (binfo) = size_int (inout_offset * Target::ptrsize); +- +- for (size_t i = 0; i < iface->baseclasses->dim; i++, inout_offset++) +- { +- BaseClass *bc = iface->baseclasses->tdata()[i]; +- BINFO_BASE_APPEND (binfo, intfc_binfo_for (binfo, bc->base, inout_offset)); +- } +- +- return binfo; +-} ++// + + void + ClassDeclaration::toDebug (void) + { +- /* Used to create BINFO even if debugging was off. This was needed to keep +- references to inherited types. */ + tree rec_type = TREE_TYPE (type->toCtype()); +- +- if (!isInterfaceDeclaration()) +- TYPE_BINFO (rec_type) = binfo_for (NULL_TREE, this); +- else +- { +- unsigned offset = 0; +- TYPE_BINFO (rec_type) = intfc_binfo_for (NULL_TREE, this, offset); +- } +- +- object_file->declareType (rec_type, this); ++ build_type_decl (rec_type, this); ++ rest_of_type_compilation (rec_type, 1); + } + + void +@@ -860,9 +846,12 @@ EnumDeclaration::toDebug (void) + + tree ctype = type->toCtype(); + ++ if (TREE_CODE (ctype) == ENUMERAL_TYPE) ++ build_type_decl (ctype, this); ++ + // The ctype is not necessarily enum, which doesn't sit well with + // rest_of_type_compilation. Can call this on structs though. +- if (AGGREGATE_TYPE_P (ctype) || TREE_CODE (ctype) == ENUMERAL_TYPE) ++ if (RECORD_OR_UNION_TYPE_P (ctype) || TREE_CODE (ctype) == ENUMERAL_TYPE) + rest_of_type_compilation (ctype, 1); + } + +@@ -875,7 +864,7 @@ void + StructDeclaration::toDebug (void) + { + tree ctype = type->toCtype(); +- object_file->declareType (ctype, this); ++ build_type_decl (ctype, this); + rest_of_type_compilation (ctype, 1); + } + +--- a/src/gcc/d/d-dmd-gcc.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-dmd-gcc.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + /* d-dmd-gcc.h -- D frontend for GCC. +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ Copyright (C) 2011-2013 Free Software Foundation, Inc. + + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free +@@ -30,10 +30,6 @@ + /* used in module.c */ + extern void d_gcc_magic_module (Module *); + +-/* used in template.c */ +-extern bool d_gcc_force_templates (void); +-extern Module *d_gcc_get_output_module (void); +- + /* used in interpret.c */ + extern Expression *d_gcc_eval_builtin (Loc, FuncDeclaration *, Expressions *); + +--- a/src/gcc/d/d-elem.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-elem.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-elem.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -17,17 +17,18 @@ + + #include "d-system.h" + +-#include "id.h" +-#include "module.h" + #include "d-lang.h" + #include "d-codegen.h" + ++#include "id.h" ++#include "module.h" ++#include "ctfe.h" + + elem * + Expression::toElem (IRState *) + { + error ("abstract Expression::toElem called"); +- return error_mark (type); ++ return error_mark_node; + } + + elem * +@@ -45,47 +46,64 @@ IdentityExp::toElem (IRState *irs) + Type *tb1 = e1->type->toBasetype(); + Type *tb2 = e2->type->toBasetype(); + +- tree_code code = op == TOKidentity ? EQ_EXPR : NE_EXPR; ++ tree_code code = (op == TOKidentity) ? EQ_EXPR : NE_EXPR; + +- if (tb1->ty == Tstruct || tb1->isfloating()) ++ if ((tb1->ty == Tsarray || tb1->ty == Tarray) ++ && (tb2->ty == Tsarray || tb2->ty == Tarray)) + { +- tree size; +- if (tb1->isfloating()) +- { +- // Assume all padding is at the end of the type. +- size = build_integer_cst (TYPE_PRECISION (e1->type->toCtype()) / BITS_PER_UNIT); +- } +- else +- size = build_integer_cst (e1->type->size()); ++ // Convert arrays to D array types. ++ return build2 (code, type->toCtype(), ++ d_array_convert (e1), d_array_convert (e2)); ++ } ++ else if (tb1->isfloating()) ++ { ++ tree t1 = e1->toElem (irs); ++ tree t2 = e2->toElem (irs); ++ // Assume all padding is at the end of the type. ++ tree size = build_integer_cst (TYPE_PRECISION (e1->type->toCtype()) / BITS_PER_UNIT); + +- // Do bit compare. +- tree t_memcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, +- build_address (e1->toElem (irs)), +- build_address (e2->toElem (irs)), +- size); ++ // Do bit compare of floats. ++ tree tmemcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ build_address (t1), build_address (t2), size); + +- return build_boolop (code, t_memcmp, integer_zero_node); ++ return build_boolop (code, tmemcmp, integer_zero_node); + } +- else if ((tb1->ty == Tsarray || tb1->ty == Tarray) +- && (tb2->ty == Tsarray || tb2->ty == Tarray)) ++ else if (tb1->ty == Tstruct) + { +- return build2 (code, type->toCtype(), +- irs->toDArray (e1), irs->toDArray (e2)); +- } +- else +- { +- // For operands of other types, identity is defined as being the same as equality. + tree t1 = e1->toElem (irs); + tree t2 = e2->toElem (irs); + +- if (type->iscomplex()) ++ if (TYPE_MODE (TREE_TYPE (t1)) != BLKmode) + { ++ // Bitwise comparison of small structs not returned in memory may ++ // not work due to data holes loosing its zero padding upon return. ++ // Instead do field-by-field comparison of the two structs. ++ StructDeclaration *sd = ((TypeStruct *) tb1)->sym; ++ gcc_assert (d_types_same (tb1, tb2)); ++ ++ // Make temporaries to prevent multiple evaluations. + t1 = maybe_make_temp (t1); + t2 = maybe_make_temp (t2); ++ ++ return build_struct_memcmp (code, sd, t1, t2); + } ++ else ++ { ++ // Do bit compare of structs. ++ tree size = build_integer_cst (e1->type->size()); ++ ++ tree tmemcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ build_address (t1), build_address (t2), size); + +- tree t_cmp = build_boolop (code, t1, t2); +- return d_convert (type->toCtype(), t_cmp); ++ return build_boolop (code, tmemcmp, integer_zero_node); ++ } ++ } ++ else ++ { ++ // For operands of other types, identity is defined as being the same as equality. ++ tree tcmp = build_boolop (code, e1->toElem (irs), e2->toElem (irs)); ++ ++ return d_convert (type->toCtype(), tcmp); + } + } + +@@ -95,35 +113,110 @@ EqualExp::toElem (IRState *irs) + Type *tb1 = e1->type->toBasetype(); + Type *tb2 = e2->type->toBasetype(); + +- tree_code code = op == TOKequal ? EQ_EXPR : NE_EXPR; ++ tree_code code = (op == TOKequal) ? EQ_EXPR : NE_EXPR; + + if (tb1->ty == Tstruct) + { +- // Do bit compare of struct's +- tree t_memcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, +- build_address (e1->toElem (irs)), +- build_address (e2->toElem (irs)), +- build_integer_cst (e1->type->size())); ++ // Do bit compare of structs ++ tree tmemcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ build_address (e1->toElem (irs)), ++ build_address (e2->toElem (irs)), ++ build_integer_cst (e1->type->size())); + +- return build2 (code, type->toCtype(), t_memcmp, integer_zero_node); ++ return build2 (code, type->toCtype(), tmemcmp, integer_zero_node); + } + else if ((tb1->ty == Tsarray || tb1->ty == Tarray) + && (tb2->ty == Tsarray || tb2->ty == Tarray)) + { +- // _adEq2 compares each element. +- Type *telem = tb1->nextOf()->toBasetype(); +- tree args[3]; +- tree result; ++ Type *t1elem = tb1->nextOf()->toBasetype(); ++ Type *t2elem = tb1->nextOf()->toBasetype(); + +- args[0] = irs->toDArray (e1); +- args[1] = irs->toDArray (e2); +- args[2] = irs->typeinfoReference (telem->arrayOf()); +- result = d_convert (type->toCtype(), build_libcall (LIBCALL_ADEQ2, 3, args)); ++ if ((t1elem->isintegral() || t1elem->ty == Tvoid) && t1elem->ty == t2elem->ty) ++ { ++ // Optimise comparisons of arrays of basic types. ++ // For arrays of integers/characters, and void[], replace _adEq2 call with: ++ // e1 == e2 => e1.length == e2.length && memcmp (e1.ptr, e2.ptr, size) == 0; ++ // e1 != e2 => e1.length != e2.length || memcmp (e1.ptr, e2.ptr, size) != 0; ++ // 'size' is e1.length * sizeof(e1[0]) for dynamic arrays, or sizeof(e1) for static arrays. ++ tree t1 = e1->toElem (irs); ++ tree t2 = e2->toElem (irs); ++ // Length, for comparison. ++ tree t1len, t2len; ++ // Pointer to data and data size, to pass to memcmp. ++ tree t1ptr, t2ptr; ++ tree t1size, t2size; ++ ++ // Make temporaries to prevent multiple evaluations. ++ tree t1saved = maybe_make_temp (t1); ++ tree t2saved = maybe_make_temp (t2); ++ ++ if (tb1->ty == Tarray) ++ { ++ t1len = d_array_length (t1saved); ++ t1ptr = d_array_ptr (t1saved); ++ t1size = build2 (MULT_EXPR, size_type_node, t1len, size_int (t1elem->size())); ++ } ++ else ++ { ++ t1len = size_int (((TypeSArray *) tb1)->dim->toInteger()); ++ t1ptr = build_address (t1saved); ++ t1size = size_int (tb1->size()); ++ } + +- if (op == TOKnotequal) +- return build1 (TRUTH_NOT_EXPR, type->toCtype(), result); ++ if (tb2->ty == Tarray) ++ { ++ t2len = d_array_length (t2saved); ++ t2ptr = d_array_ptr (t2saved); ++ t2size = build2 (MULT_EXPR, size_type_node, t2len, size_int (t2elem->size())); ++ } ++ else ++ { ++ t2len = size_int (((TypeSArray *) tb2)->dim->toInteger()); ++ t2ptr = build_address (t2saved); ++ t2size = size_int (tb2->size()); ++ } + +- return result; ++ tree tmemcmp = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCMP), 3, ++ t1ptr, t2ptr, (tb2->ty == Tsarray) ? t2size : t1size); ++ ++ tree result = build2 (code, type->toCtype(), tmemcmp, integer_zero_node); ++ ++ if (tb1->ty == Tsarray && tb2->ty == Tsarray) ++ gcc_assert (tb1->size() == tb2->size()); ++ else ++ { ++ tree_code tcode = (op == TOKequal) ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR; ++ tree tlencmp = build2 (code, size_type_node, t1len, t2len); ++ ++ result = build_boolop (tcode, tlencmp, result); ++ } ++ ++ // Ensure left-to-right order of evaluation. ++ if (t2 != t2saved) ++ result = compound_expr (t2saved, result); ++ ++ if (t1 != t1saved) ++ result = compound_expr (t1saved, result); ++ ++ return result; ++ } ++ else ++ { ++ // _adEq2 compares each element. ++ tree args[3]; ++ tree result; ++ ++ args[0] = d_array_convert (e1); ++ args[1] = d_array_convert (e2); ++ args[2] = build_typeinfo (t1elem->arrayOf()); ++ ++ result = d_convert (type->toCtype(), build_libcall (LIBCALL_ADEQ2, 3, args)); ++ ++ if (op == TOKnotequal) ++ return build1 (TRUTH_NOT_EXPR, type->toCtype(), result); ++ ++ return result; ++ } + } + else if (tb1->ty == Taarray && tb2->ty == Taarray) + { +@@ -131,7 +224,7 @@ EqualExp::toElem (IRState *irs) + tree args[3]; + tree result; + +- args[0] = irs->typeinfoReference (taa1); ++ args[0] = build_typeinfo (taa1); + args[1] = e1->toElem (irs); + args[2] = e2->toElem (irs); + result = d_convert (type->toCtype(), build_libcall (LIBCALL_AAEQUAL, 3, args)); +@@ -143,33 +236,25 @@ EqualExp::toElem (IRState *irs) + } + else + { +- tree t1 = e1->toElem (irs); +- tree t2 = e2->toElem (irs); ++ tree tcmp = build_boolop (code, e1->toElem (irs), e2->toElem (irs)); + +- if (type->iscomplex()) +- { +- t1 = maybe_make_temp (t1); +- t2 = maybe_make_temp (t2); +- } +- +- tree t_cmp = build_boolop (code, t1, t2); +- return d_convert (type->toCtype(), t_cmp); ++ return d_convert (type->toCtype(), tcmp); + } + } + + elem * + InExp::toElem (IRState *irs) + { +- Type *e2_base_type = e2->type->toBasetype(); ++ Type *tb2 = e2->type->toBasetype(); + AddrOfExpr aoe; +- gcc_assert (e2_base_type->ty == Taarray); ++ gcc_assert (tb2->ty == Taarray); + +- Type *key_type = ((TypeAArray *) e2_base_type)->index->toBasetype(); ++ Type *tkey = ((TypeAArray *) tb2)->index->toBasetype(); + tree args[3]; + + args[0] = e2->toElem (irs); +- args[1] = irs->typeinfoReference (key_type); +- args[2] = aoe.set (convert_expr (e1->toElem (irs), e1->type, key_type)); ++ args[1] = build_typeinfo (tkey); ++ args[2] = aoe.set (convert_expr (e1->toElem (irs), e1->type, tkey)); + + return convert (type->toCtype(), + aoe.finish (build_libcall (LIBCALL_AAINX, 3, args))); +@@ -250,9 +335,9 @@ CmpExp::toElem (IRState *irs) + Type *telem = tb1->nextOf()->toBasetype(); + tree args[3]; + +- args[0] = irs->toDArray (e1); +- args[1] = irs->toDArray (e2); +- args[2] = irs->typeinfoReference (telem->arrayOf()); ++ args[0] = d_array_convert (e1); ++ args[1] = d_array_convert (e2); ++ args[2] = build_typeinfo (telem->arrayOf()); + result = build_libcall (LIBCALL_ADCMP2, 3, args); + + // %% For float element types, warn that NaN is not taken into account? +@@ -294,14 +379,7 @@ AndAndExp::toElem (IRState *irs) + tree t1 = convert_for_condition (e1->toElem (irs), e1->type); + tree t2 = convert_for_condition (e2->toElem (irs), e2->type); + +- if (type->iscomplex()) +- { +- t1 = maybe_make_temp (t1); +- t2 = maybe_make_temp (t2); +- } +- +- tree t = build_boolop (TRUTH_ANDIF_EXPR, t1, t2); +- return d_convert (type->toCtype(), t); ++ return d_convert (type->toCtype(), build_boolop (TRUTH_ANDIF_EXPR, t1, t2)); + } + else + { +@@ -319,14 +397,7 @@ OrOrExp::toElem (IRState *irs) + tree t1 = convert_for_condition (e1->toElem (irs), e1->type); + tree t2 = convert_for_condition (e2->toElem (irs), e2->type); + +- if (type->iscomplex()) +- { +- t1 = maybe_make_temp (t1); +- t2 = maybe_make_temp (t2); +- } +- +- tree t = build_boolop (TRUTH_ORIF_EXPR, t1, t2); +- return d_convert (type->toCtype(), t); ++ return d_convert (type->toCtype(), build_boolop (TRUTH_ORIF_EXPR, t1, t2)); + } + else + { +@@ -341,90 +412,90 @@ elem * + XorExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (BIT_XOR_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (BIT_XOR_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + OrExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (BIT_IOR_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (BIT_IOR_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + AndExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (BIT_AND_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (BIT_AND_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + UshrExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (UNSIGNED_RSHIFT_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (UNSIGNED_RSHIFT_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + ShrExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (RSHIFT_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (RSHIFT_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + ShlExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (LSHIFT_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (LSHIFT_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + ModExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (e1->type->isfloating() ? FLOAT_MOD_EXPR : TRUNC_MOD_EXPR, +- type->toCtype(), e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (e1->type->isfloating() ? FLOAT_MOD_EXPR : TRUNC_MOD_EXPR, ++ type->toCtype(), e1->toElem (irs), e2->toElem (irs)); + } + + elem * + DivExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (e1->type->isintegral() ? TRUNC_DIV_EXPR : RDIV_EXPR, +- type->toCtype(), e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (e1->type->isintegral() ? TRUNC_DIV_EXPR : RDIV_EXPR, ++ type->toCtype(), e1->toElem (irs), e2->toElem (irs)); + } + + elem * + MulExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildOp (MULT_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (MULT_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * +@@ -455,7 +526,7 @@ PowExp::toElem (IRState *irs) + error ("Array operation %s not implemented", toChars()); + else + error ("%s ^^ %s is not supported", e1->type->toChars(), e2->type->toChars()); +- return error_mark (type); ++ return error_mark_node; + } + + e1_t = d_convert (powtype, e1->toElem (irs)); +@@ -481,31 +552,26 @@ CatExp::toElem (IRState *irs) + + // Flatten multiple concatenations + unsigned n_operands = 2; +- unsigned n_args; +- tree *args; +- Array elem_vars; +- tree result; +- +- { +- Expression *e = e1; +- while (e->op == TOKcat) +- { +- e = ((CatExp *) e)->e1; +- n_operands += 1; +- } +- } ++ { ++ Expression *e = e1; ++ while (e->op == TOKcat) ++ { ++ e = ((CatExp *) e)->e1; ++ n_operands += 1; ++ } ++ } + +- n_args = (1 + (n_operands > 2 ? 1 : 0) + +- n_operands * (n_operands > 2 && flag_split_darrays ? 2 : 1)); ++ unsigned n_args = (1 + (n_operands > 2 ? 1 : 0) + n_operands); + +- args = new tree[n_args]; +- args[0] = irs->typeinfoReference (type); ++ tree *args = new tree[n_args]; ++ args[0] = build_typeinfo (type); + + if (n_operands > 2) + args[1] = build_integer_cst (n_operands, Type::tuns32->toCtype()); + + unsigned ai = n_args - 1; + CatExp *ce = this; ++ vec *elem_vars = NULL; + + while (ce) + { +@@ -521,32 +587,26 @@ CatExp::toElem (IRState *irs) + size_int (1), build_address (expr)); + + if (elem_var) +- elem_vars.push (elem_var); ++ vec_safe_push (elem_vars, elem_var); + } + else +- array_exp = irs->toDArray (oe); ++ array_exp = d_array_convert (oe); + +- if (n_operands > 2 && flag_split_darrays) +- { +- array_exp = maybe_make_temp (array_exp); +- args[ai--] = d_array_ptr (array_exp); // note: filling array +- args[ai--] = d_array_length (array_exp); // backwards, so ptr 1st +- } +- else +- args[ai--] = array_exp; ++ args[ai--] = array_exp; + +- if (ce) ++ if (ce != NULL) + { + if (ce->e1->op != TOKcat) + { ++ // Finish with atomtic lhs + oe = ce->e1; + ce = NULL; +- // finish with atomtic lhs + } + else + { ++ // Continue with lhs CatExp + ce = (CatExp *) ce->e1; +- break; // continue with lhs CatExp ++ break; + } + } + else +@@ -555,14 +615,11 @@ CatExp::toElem (IRState *irs) + } + all_done: + +- result = build_libcall (n_operands > 2 ? LIBCALL_ARRAYCATNT : LIBCALL_ARRAYCATT, +- n_args, args, type->toCtype()); ++ tree result = build_libcall (n_operands > 2 ? LIBCALL_ARRAYCATNT : LIBCALL_ARRAYCATT, ++ n_args, args, type->toCtype()); + +- for (size_t i = 0; i < elem_vars.dim; ++i) +- { +- tree elem_var = (tree) elem_vars.data[i]; +- result = bind_expr (elem_var, result); +- } ++ for (size_t i = 0; i < vec_safe_length (elem_vars); ++i) ++ result = bind_expr ((*elem_vars)[i], result); + + return result; + } +@@ -571,7 +628,7 @@ elem * + MinExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + + // %% faster: check if result is complex + if ((e1->type->isreal() && e2->type->isimaginary()) +@@ -590,15 +647,15 @@ MinExp::toElem (IRState *irs) + } + + // The front end has already taken care of pointer-int and pointer-pointer +- return irs->buildOp (MINUS_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (MINUS_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); + } + + elem * + AddExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + + // %% faster: check if result is complex + if ((e1->type->isreal() && e2->type->isimaginary()) +@@ -615,116 +672,168 @@ AddExp::toElem (IRState *irs) + } + + // The front end has already taken care of (pointer + integer) +- return irs->buildOp (PLUS_EXPR, type->toCtype(), +- e1->toElem (irs), e2->toElem (irs)); ++ return build_binary_op (PLUS_EXPR, type->toCtype(), ++ e1->toElem (irs), e2->toElem (irs)); ++} ++ ++elem * ++BinExp::toElemBin (IRState *irs, int op) ++{ ++ tree_code code = (tree_code) op; ++ ++ // Skip casts for lhs assignment. ++ Expression *e1b = e1; ++ while (e1b->op == TOKcast) ++ { ++ CastExp *ce = (CastExp *) e1b; ++ gcc_assert (d_types_compatible (ce->type, ce->to)); ++ e1b = ce->e1; ++ } ++ ++ // Prevent multiple evaluations of LHS, but watch out! ++ // The LHS expression could be an assignment, to which ++ // it's operation gets lost during gimplification. ++ tree lexpr = NULL_TREE; ++ tree lhs; ++ ++ if (e1b->op == TOKcomma) ++ { ++ CommaExp *ce = (CommaExp *) e1b; ++ lexpr = ce->e1->toElem (irs); ++ lhs = ce->e2->toElem (irs); ++ } ++ else ++ lhs = e1b->toElem (irs); ++ ++ // Build assignment expression. Stabilize lhs for assignment. ++ lhs = stabilize_reference (lhs); ++ ++ tree rhs = build_binary_op (code, e1->type->toCtype(), ++ convert_expr (lhs, e1b->type, e1->type), e2->toElem (irs)); ++ ++ tree expr = modify_expr (lhs, convert_expr (rhs, e1->type, e1b->type)); ++ ++ if (lexpr) ++ expr = compound_expr (lexpr, expr); ++ ++ return expr; + } + + elem * + XorAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (BIT_XOR_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, BIT_XOR_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + OrAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (BIT_IOR_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, BIT_IOR_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + AndAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (BIT_AND_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, BIT_AND_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + UshrAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (UNSIGNED_RSHIFT_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, UNSIGNED_RSHIFT_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + ShrAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (RSHIFT_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, RSHIFT_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + ShlAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (LSHIFT_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, LSHIFT_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + ModAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (e1->type->isfloating() ? +- FLOAT_MOD_EXPR : TRUNC_MOD_EXPR, +- type, e1, e2); ++ tree exp = toElemBin (irs, e1->type->isfloating() ? ++ FLOAT_MOD_EXPR : TRUNC_MOD_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + DivAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (e1->type->isintegral() ? +- TRUNC_DIV_EXPR : RDIV_EXPR, +- type, e1, e2); ++ tree exp = toElemBin (irs, e1->type->isintegral() ? ++ TRUNC_DIV_EXPR : RDIV_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + MulAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (MULT_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, MULT_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + PowAssignExp::toElem (IRState *) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + + gcc_unreachable(); + } + + // Determine if type is an array of structs that need a postblit. ++ + static StructDeclaration * + needsPostblit (Type *t) + { +- t = t->toBasetype(); +- while (t->ty == Tsarray) +- t = t->nextOf()->toBasetype(); ++ t = t->baseElemOf(); ++ + if (t->ty == Tstruct) +- { StructDeclaration *sd = ((TypeStruct *) t)->sym; ++ { ++ StructDeclaration *sd = ((TypeStruct *) t)->sym; + if (sd->postblit) + return sd; + } ++ + return NULL; + } + +@@ -760,9 +869,9 @@ CatAssignExp::toElem (IRState *irs) + // Append an array + tree args[3]; + +- args[0] = irs->typeinfoReference (type); ++ args[0] = build_typeinfo (type); + args[1] = build_address (e1->toElem (irs)); +- args[2] = irs->toDArray (e2); ++ args[2] = d_array_convert (e2); + + result = build_libcall (LIBCALL_ARRAYAPPENDT, 3, args, type->toCtype()); + } +@@ -771,12 +880,12 @@ CatAssignExp::toElem (IRState *irs) + // Append an element + tree args[3]; + +- args[0] = irs->typeinfoReference (type); ++ args[0] = build_typeinfo (type); + args[1] = build_address (e1->toElem (irs)); + args[2] = size_one_node; + + result = build_libcall (LIBCALL_ARRAYAPPENDCTX, 3, args, type->toCtype()); +- result = save_expr (result); ++ result = make_temp (result); + + // Assign e2 to last element + tree off_exp = d_array_length (result); +@@ -789,17 +898,8 @@ CatAssignExp::toElem (IRState *irs) + + // Evaluate expression before appending + tree e2e = e2->toElem (irs); +- e2e = save_expr (e2e); ++ e2e = maybe_make_temp (e2e); + result = modify_expr (etype->toCtype(), build_deref (ptr_exp), e2e); +- +- // Maybe call postblit on e2. +- StructDeclaration *sd = needsPostblit (tb2); +- if (sd != NULL) +- { +- Expressions args; +- tree callexp = irs->call (sd->postblit, build_address (e2e), &args); +- result = compound_expr (callexp, result); +- } + result = compound_expr (e2e, result); + } + } +@@ -811,18 +911,20 @@ elem * + MinAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (MINUS_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, MINUS_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * + AddAssignExp::toElem (IRState *irs) + { + if (unhandled_arrayop_p (this)) +- return error_mark (type); ++ return error_mark_node; + +- return irs->buildAssignOp (PLUS_EXPR, type, e1, e2); ++ tree exp = toElemBin (irs, PLUS_EXPR); ++ return convert_expr (exp, e1->type, type); + } + + elem * +@@ -840,7 +942,7 @@ AssignExp::toElem (IRState *irs) + tree args[3]; + LibCall libcall; + +- args[0] = irs->typeinfoReference (ale->e1->type); ++ args[0] = build_typeinfo (ale->e1->type); + args[1] = convert_expr (e2->toElem (irs), e2->type, Type::tsize_t); + args[2] = build_address (ale->e1->toElem (irs)); + libcall = etype->isZeroInit() ? LIBCALL_ARRAYSETLENGTHT : LIBCALL_ARRAYSETLENGTHIT; +@@ -852,7 +954,30 @@ AssignExp::toElem (IRState *irs) + // Look for array[] = n; + if (e1->op == TOKslice) + { +- Type *etype = e1->type->toBasetype()->nextOf()->toBasetype(); ++ SliceExp *se = (SliceExp *) e1; ++ Type *stype = se->e1->type->toBasetype(); ++ Type *tb2 = e2->type->toBasetype(); ++ Type *etype = stype->nextOf()->toBasetype(); ++ ++ // Optimize static array assignment with array literal. ++ // Front-end writes these as an assignment of a dynamic ++ // array literal with a slice. ++ if (se->lwr == NULL && stype->ty == Tsarray ++ && e2->op == TOKarrayliteral ++ && tb2->nextOf()->mutableOf()->implicitConvTo(stype->nextOf())) ++ { ++ Expression *e1 = se->e1; ++ Type *t2save = e2->type; ++ ++ // Treat [e2] as a static array literal. ++ e2->type = stype; ++ tree t1 = e1->toElem (irs); ++ tree t2 = convert_for_assignment (e2->toElem (irs), e2->type, e1->type); ++ tree result = modify_expr (e1->type->toCtype(), t1, t2); ++ e2->type = t2save; ++ ++ return convert_expr (result, e1->type, type); ++ } + + // Determine if we need to do postblit. + int postblit = 0; +@@ -863,7 +988,7 @@ AssignExp::toElem (IRState *irs) + || (e2->op == TOKcast && ((UnaExp *) e2)->e1->isLvalue()))) + postblit = 1; + +- if (d_types_compatible (etype, e2->type->toBasetype())) ++ if (d_types_compatible (etype, tb2)) + { + // Set a range of elements to one value. + tree t1 = maybe_make_temp (e1->toElem (irs)); +@@ -879,7 +1004,7 @@ AssignExp::toElem (IRState *irs) + args[0] = d_array_ptr (t1); + args[1] = aoe.set (e2->toElem (irs)); + args[2] = d_array_length (t1); +- args[3] = irs->typeinfoReference (etype); ++ args[3] = build_typeinfo (etype); + libcall = (op == TOKconstruct) ? LIBCALL_ARRAYSETCTOR : LIBCALL_ARRAYSETASSIGN; + + tree call = build_libcall (libcall, 4, args); +@@ -887,8 +1012,7 @@ AssignExp::toElem (IRState *irs) + } + } + +- tree set_exp = irs->arraySetExpr (d_array_ptr (t1), +- e2->toElem (irs), d_array_length (t1)); ++ tree set_exp = irs->doArraySet (d_array_ptr (t1), e2->toElem (irs), d_array_length (t1)); + return compound_expr (set_exp, t1); + } + +@@ -898,9 +1022,9 @@ AssignExp::toElem (IRState *irs) + tree args[3]; + LibCall libcall; + +- args[0] = irs->typeinfoReference (etype); +- args[1] = irs->toDArray (e1); +- args[2] = irs->toDArray (e2); ++ args[0] = build_typeinfo (etype); ++ args[1] = d_array_convert (e1); ++ args[2] = d_array_convert (e2); + libcall = (op == TOKconstruct) ? LIBCALL_ARRAYCTOR : LIBCALL_ARRAYASSIGN; + + return build_libcall (libcall, 3, args, type->toCtype()); +@@ -911,15 +1035,15 @@ AssignExp::toElem (IRState *irs) + tree args[3]; + + args[0] = build_integer_cst (etype->size(), Type::tsize_t->toCtype()); +- args[1] = irs->toDArray (e2); +- args[2] = irs->toDArray (e1); ++ args[1] = d_array_convert (e2); ++ args[2] = d_array_convert (e1); + + return build_libcall (LIBCALL_ARRAYCOPY, 3, args, type->toCtype()); + } + else + { +- tree t1 = maybe_make_temp (irs->toDArray (e1)); +- tree t2 = irs->toDArray (e2); ++ tree t1 = maybe_make_temp (d_array_convert (e1)); ++ tree t2 = d_array_convert (e2); + tree size = fold_build2 (MULT_EXPR, size_type_node, + d_convert (size_type_node, d_array_length (t1)), + size_int (etype->size())); +@@ -960,7 +1084,7 @@ AssignExp::toElem (IRState *irs) + if (sd->isNested()) + { + tree vthis_field = sd->vthis->toSymbol()->Stree; +- tree vthis_value = irs->getVThis (sd, this); ++ tree vthis_value = build_vthis (sd, irs->func, this); + + tree vthis_exp = modify_expr (component_ref (lhs, vthis_field), vthis_value); + result = compound_expr (result, vthis_exp); +@@ -1004,7 +1128,7 @@ IndexExp::toElem (IRState *irs) + + if (tb1->ty == Taarray) + { +- Type *key_type = ((TypeAArray *) tb1)->index->toBasetype(); ++ Type *tkey = ((TypeAArray *) tb1)->index->toBasetype(); + AddrOfExpr aoe; + tree args[4]; + LibCall libcall; +@@ -1021,15 +1145,15 @@ IndexExp::toElem (IRState *irs) + args[0] = e1->toElem (irs); + } + +- args[1] = irs->typeinfoReference (key_type); ++ args[1] = build_typeinfo (tkey); + args[2] = build_integer_cst (tb1->nextOf()->size(), Type::tsize_t->toCtype()); +- args[3] = aoe.set (convert_expr (e2->toElem (irs), e2->type, key_type)); ++ args[3] = aoe.set (convert_expr (e2->toElem (irs), e2->type, tkey)); + + index = aoe.finish (build_libcall (libcall, 4, args, type->pointerTo()->toCtype())); + +- if (array_bounds_check()) ++ if (array_bounds_check() && !skipboundscheck) + { +- index = save_expr (index); ++ index = make_temp (index); + index = build3 (COND_EXPR, TREE_TYPE (index), d_truthvalue_conversion (index), + index, d_assert_call (loc, LIBCALL_ARRAY_BOUNDS)); + } +@@ -1038,11 +1162,69 @@ IndexExp::toElem (IRState *irs) + } + else + { +- /* arrayElemRef will call aryscp.finish. This result +- of this function may be used as an lvalue and we +- do not want it to be a BIND_EXPR. */ +- ArrayScope aryscp (lengthVar, loc); +- return irs->arrayElemRef (this, &aryscp); ++ // Build an array index expression. ArrayScope may build a BIND_EXPR ++ // if temporaries were created for bounds checking. ++ ArrayScope arrscope (lengthVar, loc); ++ ++ // The expression that holds the array data. ++ tree t1 = e1->toElem (irs); ++ // The expression that indexes the array data. ++ tree t2 = e2->toElem (irs); ++ // The base pointer to the elements. ++ tree ptrexp; ++ ++ switch (tb1->ty) ++ { ++ case Tarray: ++ case Tsarray: ++ t1 = arrscope.setArrayExp (t1, e1->type); ++ ++ // If it's a static array and the index is constant, ++ // the front end has already checked the bounds. ++ if (array_bounds_check() && !(tb1->ty == Tsarray && e2->isConst())) ++ { ++ // Implement bounds check as a conditional expression: ++ // array [inbounds(index) ? index : { throw ArrayBoundsError}] ++ tree length; ++ ++ // First, set up the index expression to only be evaluated once. ++ tree index = maybe_make_temp (t2); ++ ++ if (tb1->ty == Tarray) ++ { ++ t1 = maybe_make_temp (t1); ++ length = d_array_length (t1); ++ } ++ else ++ length = ((TypeSArray *) tb1)->dim->toElem (irs); ++ ++ t2 = d_checked_index (loc, index, length, false); ++ } ++ ++ if (tb1->ty == Tarray) ++ ptrexp = d_array_ptr (t1); ++ else ++ ptrexp = build_address (t1); ++ ++ // This conversion is required for static arrays and is ++ // just-to-be-safe for dynamic arrays. ++ ptrexp = convert (tb1->nextOf()->pointerTo()->toCtype(), ptrexp); ++ break; ++ ++ case Tpointer: ++ // Ignores ArrayScope. ++ ptrexp = t1; ++ break; ++ ++ default: ++ gcc_unreachable(); ++ } ++ ++ ptrexp = void_okay_p (ptrexp); ++ t2 = arrscope.finish (t2); ++ ++ return indirect_ref (TREE_TYPE (TREE_TYPE (ptrexp)), ++ build_array_index (ptrexp, t2)); + } + } + +@@ -1065,24 +1247,24 @@ ArrayLengthExp::toElem (IRState *irs) + { + // Tsarray case seems to be handled by front-end + error ("unexpected type for array length: %s", type->toChars()); +- return error_mark (type); ++ return error_mark_node; + } + } + + elem * + SliceExp::toElem (IRState *irs) + { +- // This function assumes that the front end casts the result to a dynamic array. +- gcc_assert (type->toBasetype()->ty == Tarray); ++ Type *tb = type->toBasetype(); ++ gcc_assert (tb->ty == Tarray || tb->ty == Tsarray); + + // Use convert-to-dynamic-array code if possible + if (e1->type->toBasetype()->ty == Tsarray && !upr && !lwr) + return convert_expr (e1->toElem (irs), e1->type, type); + +- Type *orig_array_type = e1->type->toBasetype(); ++ Type *tb1 = e1->type->toBasetype(); + + tree orig_array_expr, orig_pointer_expr; +- tree final_len_expr, final_ptr_expr; ++ tree len_expr, ptr_expr; + tree array_len_expr = NULL_TREE; + tree lwr_tree = NULL_TREE; + tree upr_tree = NULL_TREE; +@@ -1094,18 +1276,18 @@ SliceExp::toElem (IRState *irs) + // specs don't say bounds if are checked for error or clipped to current size + + // Get the data pointer for static and dynamic arrays +- orig_pointer_expr = convert_expr (orig_array_expr, orig_array_type, +- orig_array_type->nextOf()->pointerTo()); ++ orig_pointer_expr = convert_expr (orig_array_expr, tb1, ++ tb1->nextOf()->pointerTo()); + +- final_ptr_expr = orig_pointer_expr; ++ ptr_expr = orig_pointer_expr; + +- // orig_array_expr is already a save_expr if necessary, so +- // we don't make array_len_expr a save_expr which is, at most, ++ // orig_array_expr is already a SAVE_EXPR if necessary, so ++ // we don't make array_len_expr a SAVE_EXPR which is, at most, + // a COMPONENT_REF on top of orig_array_expr. +- if (orig_array_type->ty == Tarray) ++ if (tb1->ty == Tarray) + array_len_expr = d_array_length (orig_array_expr); +- else if (orig_array_type->ty == Tsarray) +- array_len_expr = ((TypeSArray *) orig_array_type)->dim->toElem (irs); ++ else if (tb1->ty == Tsarray) ++ array_len_expr = ((TypeSArray *) tb1)->dim->toElem (irs); + + if (lwr) + { +@@ -1115,8 +1297,8 @@ SliceExp::toElem (IRState *irs) + { + lwr_tree = maybe_make_temp (lwr_tree); + // Adjust .ptr offset +- final_ptr_expr = build_array_index (void_okay_p (final_ptr_expr), lwr_tree); +- final_ptr_expr = build_nop (TREE_TYPE (orig_pointer_expr), final_ptr_expr); ++ ptr_expr = build_array_index (void_okay_p (ptr_expr), lwr_tree); ++ ptr_expr = build_nop (TREE_TYPE (orig_pointer_expr), ptr_expr); + } + else + lwr_tree = NULL_TREE; +@@ -1132,58 +1314,66 @@ SliceExp::toElem (IRState *irs) + // %% && ! is zero + if (array_len_expr) + { +- final_len_expr = d_checked_index (loc, upr_tree, array_len_expr, true); ++ len_expr = d_checked_index (loc, upr_tree, array_len_expr, true); + } + else + { + // Still need to check bounds lwr <= upr for pointers. +- gcc_assert (orig_array_type->ty == Tpointer); +- final_len_expr = upr_tree; ++ gcc_assert (tb1->ty == Tpointer); ++ len_expr = upr_tree; + } + if (lwr_tree) + { + // Enforces lwr <= upr. No need to check lwr <= length as + // we've already ensured that upr <= length. + tree lwr_bounds_check = d_checked_index (loc, lwr_tree, upr_tree, true); +- final_len_expr = compound_expr (lwr_bounds_check, final_len_expr); ++ len_expr = compound_expr (lwr_bounds_check, len_expr); + } + } + else + { +- final_len_expr = upr_tree; ++ len_expr = upr_tree; + } + + if (lwr_tree) + { + // %% Need to ensure lwr always gets evaluated first, as it may be a function call. + // Does (-lwr + upr) rather than (upr - lwr) +- final_len_expr = build2 (PLUS_EXPR, TREE_TYPE (final_len_expr), +- build1 (NEGATE_EXPR, TREE_TYPE (lwr_tree), lwr_tree), +- final_len_expr); ++ len_expr = build2 (PLUS_EXPR, TREE_TYPE (len_expr), ++ build1 (NEGATE_EXPR, TREE_TYPE (lwr_tree), lwr_tree), len_expr); + } + } + else + { + // If this is the case, than there is no lower bound specified and + // there is no need to subtract. +- switch (orig_array_type->ty) ++ switch (tb1->ty) + { + case Tarray: +- final_len_expr = d_array_length (orig_array_expr); ++ len_expr = d_array_length (orig_array_expr); + break; + + case Tsarray: +- final_len_expr = ((TypeSArray *) orig_array_type)->dim->toElem (irs); ++ len_expr = ((TypeSArray *) tb1)->dim->toElem (irs); + break; + + default: +- ::error ("Attempt to take length of something that was not an array"); +- return error_mark (type); ++ error ("Attempt to take length of something that was not an array"); ++ return error_mark_node; + } + } + +- tree result = d_array_value (type->toCtype(), final_len_expr, final_ptr_expr); +- return aryscp.finish (result); ++ tree exp; ++ ++ if (tb->ty == Tarray) ++ exp = d_array_value (type->toCtype(), len_expr, ptr_expr); ++ else ++ { ++ gcc_assert (lwr && tb->ty == Tsarray); ++ exp = indirect_ref (type->toCtype(), ptr_expr); ++ } ++ ++ return aryscp.finish (exp); + } + + elem * +@@ -1193,11 +1383,9 @@ CastExp::toElem (IRState *irs) + Type *tbtype = to->toBasetype(); + tree t = e1->toElem (irs); + ++ // Just evaluate e1 if it has any side effects + if (tbtype->ty == Tvoid) +- { +- // Just evaluate e1 if it has any side effects +- return build1 (NOP_EXPR, tbtype->toCtype(), t); +- } ++ return build1 (NOP_EXPR, tbtype->toCtype(), t); + + return convert_expr (t, ebtype, tbtype); + } +@@ -1231,15 +1419,13 @@ DeleteExp::toElem (IRState *irs) + else if (tb1->ty == Tarray) + { + // Might need to run destructor on array contents +- Type *next_type = tb1->nextOf()->toBasetype(); ++ Type *telem = tb1->nextOf()->baseElemOf(); + tree ti = d_null_pointer; + tree args[2]; + +- while (next_type->ty == Tsarray) +- next_type = next_type->nextOf()->toBasetype(); +- if (next_type->ty == Tstruct) ++ if (telem->ty == Tstruct) + { +- TypeStruct *ts = (TypeStruct *) next_type; ++ TypeStruct *ts = (TypeStruct *) telem; + if (ts->sym->dtor) + ti = tb1->nextOf()->getTypeInfo (NULL)->toElem (irs); + } +@@ -1258,7 +1444,7 @@ DeleteExp::toElem (IRState *irs) + else + { + error ("don't know how to delete %s", e1->toChars()); +- return error_mark (type); ++ return error_mark_node; + } + } + +@@ -1271,20 +1457,20 @@ RemoveExp::toElem (IRState *irs) + if (array->type->toBasetype()->ty == Taarray) + { + Type *a_type = array->type->toBasetype(); +- Type *key_type = ((TypeAArray *) a_type)->index->toBasetype(); ++ Type *tkey = ((TypeAArray *) a_type)->index->toBasetype(); + AddrOfExpr aoe; + tree args[3]; + + args[0] = array->toElem (irs); +- args[1] = irs->typeinfoReference (key_type); +- args[2] = aoe.set (convert_expr (index->toElem (irs), index->type, key_type)); ++ args[1] = build_typeinfo (tkey); ++ args[2] = aoe.set (convert_expr (index->toElem (irs), index->type, tkey)); + + return aoe.finish (build_libcall (LIBCALL_AADELX, 3, args)); + } + else + { + error ("%s is not an associative array", array->toChars()); +- return error_mark (type); ++ return error_mark_node; + } + } + +@@ -1326,7 +1512,7 @@ NegExp::toElem (IRState *irs) + if (ty1 == Tarray || ty1 == Tsarray) + { + error ("Array operation %s not implemented", toChars()); +- return error_mark (type); ++ return error_mark_node; + } + + return build1 (NEGATE_EXPR, type->toCtype(), e1->toElem (irs)); +@@ -1360,7 +1546,7 @@ PtrExp::toElem (IRState *irs) + if (!decl_reference_p (sym_exp->var)) + { + rec_type = sym_exp->var->type->toBasetype(); +- rec_tree = irs->var (sym_exp->var); ++ rec_tree = get_decl_tree (sym_exp->var, irs->func); + the_offset = sym_exp->offset; + } + } +@@ -1374,8 +1560,10 @@ PtrExp::toElem (IRState *irs) + if (field->offset == the_offset + && d_types_same (field->type, this->type)) + { +- if (error_mark_p (rec_tree)) +- return rec_tree; // backend will ICE otherwise ++ // Catch errors, backend will ICE otherwise. ++ if (error_operand_p (rec_tree)) ++ return rec_tree; ++ + return component_ref (rec_tree, field->toSymbol()->Stree); + } + else if (field->offset > the_offset) +@@ -1389,25 +1577,104 @@ PtrExp::toElem (IRState *irs) + elem * + AddrExp::toElem (IRState *irs) + { +- tree addrexp = build_address (e1->toElem (irs)); +- return build_nop (type->toCtype(), addrexp); ++ tree exp; ++ ++ if (e1->op == TOKstructliteral) ++ { ++ StructLiteralExp *sle = ((StructLiteralExp *) e1)->origin; ++ exp = build_address (sle->toElem (irs)); ++ } ++ else ++ exp = build_address (e1->toElem (irs)); ++ ++ return build_nop (type->toCtype(), exp); + } + + elem * + CallExp::toElem (IRState *irs) + { +- tree call_exp = irs->call (e1, arguments); ++ Type *tb = e1->type->toBasetype(); ++ Expression *e1b = e1; ++ tree object = NULL_TREE; ++ ++ // Calls to delegates can sometimes look like this: ++ if (e1b->op == TOKcomma) ++ { ++ e1b = ((CommaExp *) e1b)->e2; ++ gcc_assert (e1b->op == TOKvar); ++ ++ Declaration *var = ((VarExp *) e1b)->var; ++ gcc_assert (var->isFuncDeclaration() && !var->needThis()); ++ } ++ ++ tree callee = e1b->toElem (irs); ++ TypeFunction *tf = NULL; ++ ++ if (D_METHOD_CALL_EXPR (callee)) ++ { ++ // This could be a delegate expression (TY == Tdelegate), but not ++ // actually a delegate variable. ++ if (e1b->op == TOKdotvar) ++ { ++ // This gets the true function type, getting the function type from ++ // e1->type can sometimes be incorrect, eg: ref return functions. ++ tf = get_function_type (((DotVarExp *) e1b)->var->type); ++ } ++ else ++ tf = get_function_type (tb); ++ ++ extract_from_method_call (callee, callee, object); ++ } ++ else if (tb->ty == Tdelegate) ++ { ++ // Delegate call, extract .object and .funcptr from var. ++ callee = maybe_make_temp (callee); ++ tf = get_function_type (tb); ++ object = delegate_object (callee); ++ callee = delegate_method (callee); ++ } ++ else if (e1b->op == TOKvar) ++ { ++ FuncDeclaration *fd = ((VarExp *) e1b)->var->isFuncDeclaration(); ++ gcc_assert (fd); ++ tf = get_function_type (fd->type); ++ ++ if (fd->isNested()) ++ { ++ // Maybe re-evaluate symbol storage treating 'fd' as public. ++ if (call_by_alias_p (irs->func, fd)) ++ setup_symbol_storage (fd, callee, true); ++ ++ object = get_frame_for_symbol (irs->func, fd); ++ } ++ else if (fd->needThis()) ++ { ++ e1b->error ("need 'this' to access member %s", fd->toChars()); ++ // Continue processing... ++ object = d_null_pointer; ++ } ++ } ++ else ++ { ++ // Normal direct function call. ++ tf = get_function_type (tb); ++ } ++ ++ gcc_assert (tf != NULL); ++ ++ // Now we have the type, callee and maybe object reference, ++ // build the call expression. ++ tree exp = d_build_call (tf, callee, object, arguments); + +- TypeFunction *tf = get_function_type (e1->type->toBasetype()); + if (tf->isref) +- call_exp = build_deref (call_exp); ++ exp = build_deref (exp); + + // Some library calls are defined to return a generic type. +- // this->type is the real type. (See crash2.d) ++ // this->type is the real type we want to return. + if (type->isTypeBasic()) +- call_exp = d_convert (type->toCtype(), call_exp); ++ exp = d_convert (type->toCtype(), exp); + +- return call_exp; ++ return exp; + } + + /******************************************* +@@ -1417,9 +1684,9 @@ CallExp::toElem (IRState *irs) + elem * + Expression::toElemDtor (IRState *irs) + { +- size_t starti = irs->varsInScope ? irs->varsInScope->dim : 0; +- tree t = toElem (irs); +- size_t endi = irs->varsInScope ? irs->varsInScope->dim : 0; ++ size_t starti = irs->varsInScope.length(); ++ tree exp = toElem (irs); ++ size_t endi = irs->varsInScope.length(); + + // Codegen can be improved by determining if no exceptions can be thrown + // between the ctor and dtor, and eliminating the ctor and dtor. +@@ -1429,10 +1696,10 @@ Expression::toElemDtor (IRState *irs) + tree tdtors = NULL_TREE; + for (size_t i = starti; i != endi; ++i) + { +- VarDeclaration *vd = irs->varsInScope->tdata()[i]; ++ VarDeclaration *vd = irs->varsInScope[i]; + if (vd) + { +- irs->varsInScope->tdata()[i] = NULL; ++ irs->varsInScope[i] = NULL; + tree td = vd->edtor->toElem (irs); + // Execute in reverse order. + tdtors = maybe_compound_expr (tdtors, td); +@@ -1441,11 +1708,35 @@ Expression::toElemDtor (IRState *irs) + + if (tdtors != NULL_TREE) + { +- t = save_expr (t); +- t = compound_expr (compound_expr (t, tdtors), t); ++ if (op == TOKcall) ++ { ++ // Wrap expression and dtors in a try/finally expression. ++ tree body = exp; ++ ++ if (type->ty == Tvoid) ++ exp = build2 (TRY_FINALLY_EXPR, void_type_node, body, tdtors); ++ else ++ { ++ body = maybe_make_temp (body); ++ tree tfexp = build2 (TRY_FINALLY_EXPR, void_type_node, body, tdtors); ++ exp = compound_expr (tfexp, body); ++ } ++ } ++ else if (op == TOKcomma && ((CommaExp *) this)->e2->op == TOKvar) ++ { ++ // Split comma expressions, so as don't require a save_expr. ++ tree lexp = TREE_OPERAND (exp, 0); ++ tree rvalue = TREE_OPERAND (exp, 1); ++ exp = compound_expr (compound_expr (lexp, tdtors), rvalue); ++ } ++ else ++ { ++ exp = maybe_make_temp (exp); ++ exp = compound_expr (compound_expr (exp, tdtors), exp); ++ } + } + +- return t; ++ return exp; + } + + +@@ -1453,8 +1744,7 @@ elem * + DotTypeExp::toElem (IRState *irs) + { + // Just a pass through to e1. +- tree t = e1->toElem (irs); +- return t; ++ return e1->toElem (irs); + } + + // The result will probably just be converted to a CONSTRUCTOR for a Tdelegate struct +@@ -1479,7 +1769,7 @@ DelegateExp::toElem (IRState *irs) + if (!func->isThis()) + { + error ("delegates are only for non-static functions"); +- return error_mark (type); ++ return error_mark_node; + } + + return get_object_method (e1->toElem (irs), e1, func, type); +@@ -1492,7 +1782,7 @@ DelegateExp::toElem (IRState *irs) + if (e1->op == TOKnull) + this_tree = e1->toElem (irs); + else +- this_tree = irs->getFrameForSymbol (func); ++ this_tree = get_frame_for_symbol (irs->func, func); + } + else + { +@@ -1536,8 +1826,8 @@ DotVarExp::toElem (IRState *irs) + } + else if (var_decl) + { +- if (!(var_decl->storage_class & STCfield)) +- return irs->var (var_decl); ++ if (!var_decl->isField()) ++ return get_decl_tree (var_decl, irs->func); + else + { + tree this_tree = e1->toElem (irs); +@@ -1553,38 +1843,51 @@ DotVarExp::toElem (IRState *irs) + default: + break; + } +- ::error ("Don't know how to handle %s", toChars()); +- return error_mark (type); ++ ++ error ("Don't know how to handle %s", toChars()); ++ return error_mark_node; + } + + elem * + AssertExp::toElem (IRState *irs) + { +- // %% todo: Do we call a Tstruct's invariant if +- // e1 is a pointer to the struct? + if (global.params.useAssert) + { + Type *tb1 = e1->type->toBasetype(); +- TY ty = tb1->ty; +- tree assert_call; ++ tree tmsg = NULL_TREE; ++ LibCall libcall; + ++ // Build _d_assert call. + if (irs->func->isUnitTestDeclaration()) + { +- assert_call = (msg != NULL) +- ? d_assert_call (loc, LIBCALL_UNITTEST_MSG, msg->toElem (irs)) +- : d_assert_call (loc, LIBCALL_UNITTEST, NULL_TREE); ++ if (msg) ++ { ++ tmsg = msg->toElemDtor (irs); ++ libcall = LIBCALL_UNITTEST_MSG; ++ } ++ else ++ libcall = LIBCALL_UNITTEST; + } + else + { +- assert_call = (msg != NULL) +- ? d_assert_call (loc, LIBCALL_ASSERT_MSG, msg->toElem (irs)) +- : d_assert_call (loc, LIBCALL_ASSERT, NULL_TREE); ++ if (msg) ++ { ++ tmsg = msg->toElemDtor (irs); ++ libcall = LIBCALL_ASSERT_MSG; ++ } ++ else ++ libcall = LIBCALL_ASSERT; + } + +- if (ty == Tclass) ++ tree assert_call = d_assert_call (loc, libcall, tmsg); ++ ++ // Build condition that we are asserting in this contract. ++ if (tb1->ty == Tclass) + { + ClassDeclaration *cd = tb1->isClassHandle(); + tree arg = e1->toElem (irs); ++ tree invc = NULL_TREE; ++ + if (cd->isCOMclass()) + { + return build3 (COND_EXPR, void_type_node, +@@ -1592,13 +1895,15 @@ AssertExp::toElem (IRState *irs) + d_void_zero_node, assert_call); + } + else if (cd->isInterfaceDeclaration()) +- { +- arg = convert_expr (arg, tb1, build_object_type()); +- } +- // this does a null pointer check before calling _d_invariant ++ arg = convert_expr (arg, tb1, build_object_type()); ++ ++ if (global.params.useInvariants && !cd->isCPPclass()) ++ invc = build_libcall (LIBCALL_INVARIANT, 1, &arg); ++ ++ // This does a null pointer check before calling _d_invariant + return build3 (COND_EXPR, void_type_node, + build_boolop (NE_EXPR, arg, d_null_pointer), +- build_libcall (LIBCALL_INVARIANT, 1, &arg), assert_call); ++ invc ? invc : d_void_zero_node, assert_call); + } + else + { +@@ -1608,18 +1913,15 @@ AssertExp::toElem (IRState *irs) + tree invc = NULL_TREE; + tree e1_t = e1->toElem (irs); + +- if (ty == Tpointer) ++ if (global.params.useInvariants ++ && tb1->ty == Tpointer && tb1->nextOf()->ty == Tstruct) + { +- Type *sub_type = tb1->nextOf()->toBasetype(); +- if (sub_type->ty == Tstruct) ++ FuncDeclaration *inv = ((TypeStruct *) tb1->nextOf())->sym->inv; ++ if (inv != NULL) + { +- AggregateDeclaration *agg_decl = ((TypeStruct *) sub_type)->sym; +- if (agg_decl->inv) +- { +- Expressions args; +- e1_t = maybe_make_temp (e1_t); +- invc = irs->call (agg_decl->inv, e1_t, &args); +- } ++ Expressions args; ++ e1_t = maybe_make_temp (e1_t); ++ invc = d_build_call (inv, e1_t, &args); + } + } + result = build3 (COND_EXPR, void_type_node, +@@ -1636,6 +1938,7 @@ elem * + DeclarationExp::toElem (IRState *irs) + { + VarDeclaration *vd = declaration->isVarDeclaration(); ++ + if (vd != NULL) + { + if (!vd->isStatic() && !(vd->storage_class & STCmanifest) +@@ -1643,16 +1946,10 @@ DeclarationExp::toElem (IRState *irs) + { + // Put variable on list of things needing destruction + if (vd->edtor && !vd->noscope) +- { +- if (!irs->varsInScope) +- irs->varsInScope = new VarDeclarations(); +- irs->varsInScope->push (vd); +- } ++ irs->varsInScope.safe_push (vd); + } + } + +- // VarDeclaration::toObjFile was modified to call d_gcc_emit_local_variable +- // if needed. This assumes irs == cirstate + irs->pushStatementList(); + declaration->toObjFile (0); + tree t = irs->popStatementList(); +@@ -1670,37 +1967,27 @@ DeclarationExp::toElem (IRState *irs) + elem * + FuncExp::toElem (IRState *irs) + { +- Type *func_type = type->toBasetype(); ++ Type *ftype = type->toBasetype(); + +- if (func_type->ty == Tpointer) ++ // This check is for lambda's, remove 'vthis' as function isn't nested. ++ if (fd->tok == TOKreserved && ftype->ty == Tpointer) + { +- // This check is for lambda's, remove 'vthis' as function isn't nested. +- if (fd->tok == TOKreserved && fd->vthis) +- { +- fd->tok = TOKfunction; +- fd->vthis = NULL; +- } +- +- func_type = func_type->nextOf()->toBasetype(); ++ fd->tok = TOKfunction; ++ fd->vthis = NULL; + } + + // Emit after current function body has finished. +- irs->func->deferred.push (fd); ++ if (irs->func) ++ irs->func->deferred.push (fd); + + // If nested, this will be a trampoline... +- switch (func_type->ty) ++ if (fd->isNested()) + { +- case Tfunction: +- return build_nop (type->toCtype(), build_address (fd->toSymbol()->Stree)); +- +- case Tdelegate: + return build_method_call (build_address (fd->toSymbol()->Stree), +- irs->getFrameForSymbol (fd), type); +- +- default: +- ::error ("Unexpected FuncExp type"); +- return error_mark (type); ++ get_frame_for_symbol (irs->func, fd), type); + } ++ ++ return build_nop (type->toCtype(), build_address (fd->toSymbol()->Stree)); + } + + elem * +@@ -1720,14 +2007,14 @@ SymbolExp::toElem (IRState *irs) + if (var->needThis()) + { + error ("need 'this' to access member %s", var->ident->string); +- return error_mark (type); ++ return error_mark_node; + } + + // __ctfe is always false at runtime + if (var->ident == Id::ctfe) + return integer_zero_node; + +- exp = irs->var (var); ++ exp = get_decl_tree (var, irs->func); + TREE_USED (exp) = 1; + + // For variables that are references (currently only out/inout arguments; +@@ -1741,7 +2028,7 @@ SymbolExp::toElem (IRState *irs) + { + size_t offset = ((SymOffExp *) this)->offset; + +- exp = irs->var (var); ++ exp = get_decl_tree (var, irs->func); + TREE_USED (exp) = 1; + + if (decl_reference_p (var)) +@@ -1786,15 +2073,15 @@ NewExp::toElem (IRState *irs) + // Call allocator (custom allocator or _d_newclass). + if (onstack) + { +- tree stack_var = build_local_var (rec_type); +- irs->expandDecl (stack_var); ++ tree stack_var = build_local_temp (rec_type); ++ expand_decl (stack_var); + new_call = build_address (stack_var); + setup_exp = modify_expr (indirect_ref (rec_type, new_call), + class_decl->toInitializer()->Stree); + } + else if (allocator) + { +- new_call = irs->call (allocator, newargs); ++ new_call = d_build_call (allocator, NULL_TREE, newargs); + new_call = maybe_make_temp (new_call); + // copy memory... + setup_exp = modify_expr (indirect_ref (rec_type, new_call), +@@ -1829,7 +2116,7 @@ NewExp::toElem (IRState *irs) + } + else + { +- vthis_value = irs->getVThis (class_decl, this); ++ vthis_value = build_vthis (class_decl, irs->func, this); + } + + if (vthis_value) +@@ -1843,55 +2130,57 @@ NewExp::toElem (IRState *irs) + + // Call constructor. + if (member) +- result = irs->call (member, new_call, arguments); ++ result = d_build_call (member, new_call, arguments); + else + result = new_call; + } + // New'ing a struct. + else if (tb->ty == Tpointer && tb->nextOf()->toBasetype()->ty == Tstruct) + { ++ Type *htype = newtype->toBasetype(); ++ gcc_assert (htype->ty == Tstruct); + gcc_assert (!onstack); + +- Type * handle_type = newtype->toBasetype(); +- gcc_assert (handle_type->ty == Tstruct); +- TypeStruct *struct_type = (TypeStruct *) handle_type; +- StructDeclaration *sd = struct_type->sym; +- Expression *init = struct_type->defaultInit (loc); +- ++ TypeStruct *stype = (TypeStruct *) htype; ++ StructDeclaration *sd = stype->sym; ++ Expression *init = stype->defaultInit (loc); + tree new_call; +- tree setup_exp; +- tree init_exp; ++ ++ // Struct size is unknown. ++ if (sd->size (loc) == 0) ++ return d_convert (type->toCtype(), integer_zero_node); + + if (allocator) +- new_call = irs->call (allocator, newargs); ++ new_call = d_build_call (allocator, NULL_TREE, newargs); + else + { +- libcall = struct_type->isZeroInit (loc) ? LIBCALL_NEWITEMT : LIBCALL_NEWITEMIT; ++ libcall = stype->isZeroInit (loc) ? LIBCALL_NEWITEMT : LIBCALL_NEWITEMIT; + tree arg = type->getTypeInfo(NULL)->toElem (irs); + new_call = build_libcall (libcall, 1, &arg); + } + new_call = build_nop (tb->toCtype(), new_call); + + // Save the result allocation call. +- init_exp = convert_for_assignment (init->toElem (irs), init->type, struct_type); ++ tree init_exp = convert_for_assignment (init->toElem (irs), init->type, stype); + new_call = maybe_make_temp (new_call); +- setup_exp = modify_expr (build_deref (new_call), init_exp); ++ ++ tree setup_exp = modify_expr (build_deref (new_call), init_exp); + new_call = compound_expr (setup_exp, new_call); + + // Set vthis for nested structs/classes. + if (sd->isNested()) + { +- tree vthis_value = irs->getVThis (sd, this); ++ tree vthis_value = build_vthis (sd, irs->func, this); + tree vthis_field; + new_call = maybe_make_temp (new_call); +- vthis_field = component_ref (indirect_ref (struct_type->toCtype(), new_call), ++ vthis_field = component_ref (indirect_ref (stype->toCtype(), new_call), + sd->vthis->toSymbol()->Stree); + new_call = compound_expr (modify_expr (vthis_field, vthis_value), new_call); + } + + // Call constructor. + if (member) +- result = irs->call (member, new_call, arguments); ++ result = d_build_call (member, new_call, arguments); + else + result = new_call; + } +@@ -1908,8 +2197,13 @@ NewExp::toElem (IRState *irs) + { + // Single dimension array allocations. + Expression *arg = (*arguments)[0]; +- libcall = tarray->next->isZeroInit() ? LIBCALL_NEWARRAYT : LIBCALL_NEWARRAYIT; + tree args[2]; ++ ++ // Elem size is unknown. ++ if (tarray->next->size() == 0) ++ return d_array_value (type->toCtype(), size_int (0), d_null_pointer); ++ ++ libcall = tarray->next->isZeroInit() ? LIBCALL_NEWARRAYT : LIBCALL_NEWARRAYIT; + args[0] = type->getTypeInfo(NULL)->toElem (irs); + args[1] = arg->toElem (irs); + result = build_libcall (libcall, 2, args, tb->toCtype()); +@@ -1933,6 +2227,7 @@ NewExp::toElem (IRState *irs) + telem = telem->toBasetype()->nextOf(); + gcc_assert (telem); + } ++ + CONSTRUCTOR_ELTS (dims_init) = elms; + DECL_INITIAL (dims_var) = dims_init; + +@@ -1947,9 +2242,14 @@ NewExp::toElem (IRState *irs) + // New'ing a pointer + else if (tb->ty == Tpointer) + { +- TypePointer *pointer_type = (TypePointer *) tb; ++ TypePointer *tpointer = (TypePointer *) tb; ++ ++ // Elem size is unknown. ++ if (tpointer->next->size() == 0) ++ return d_convert (type->toCtype(), integer_zero_node); ++ ++ libcall = tpointer->next->isZeroInit (loc) ? LIBCALL_NEWITEMT : LIBCALL_NEWITEMIT; + +- libcall = pointer_type->next->isZeroInit (loc) ? LIBCALL_NEWITEMT : LIBCALL_NEWITEMIT; + tree arg = type->getTypeInfo(NULL)->toElem (irs); + result = build_libcall (libcall, 1, &arg, tb->toCtype()); + } +@@ -1962,15 +2262,15 @@ NewExp::toElem (IRState *irs) + elem * + ScopeExp::toElem (IRState *) + { +- ::error ("%s is not an expression", toChars()); +- return error_mark (type); ++ error ("%s is not an expression", toChars()); ++ return error_mark_node; + } + + elem * + TypeExp::toElem (IRState *) + { +- ::error ("type %s is not an expression", toChars()); +- return error_mark (type); ++ error ("type %s is not an expression", toChars()); ++ return error_mark_node; + } + + elem * +@@ -2043,7 +2343,7 @@ StringExp::toElem (IRState *) + + default: + error ("Invalid type for string constant: %s", type->toChars()); +- return error_mark (type); ++ return error_mark_node; + } + + return value; +@@ -2052,45 +2352,76 @@ StringExp::toElem (IRState *) + elem * + TupleExp::toElem (IRState *irs) + { +- tree result = NULL_TREE; +- if (exps && exps->dim) ++ tree exp = NULL_TREE; ++ ++ if (e0) ++ exp = e0->toElem (irs); ++ ++ for (size_t i = 0; i < exps->dim; ++i) + { +- for (size_t i = 0; i < exps->dim; ++i) +- { +- Expression *e = (*exps)[i]; +- result = maybe_vcompound_expr (result, e->toElem (irs)); +- } ++ Expression *e = (*exps)[i]; ++ exp = maybe_vcompound_expr (exp, e->toElem (irs)); + } +- else +- result = d_void_zero_node; + +- return result; ++ if (exp == NULL_TREE) ++ exp = d_void_zero_node; ++ ++ return exp; + } + + elem * + ArrayLiteralExp::toElem (IRState *irs) + { +- Type *typeb = type->toBasetype(); +- gcc_assert (typeb->ty == Tarray || typeb->ty == Tsarray || typeb->ty == Tpointer); +- Type *etype = typeb->nextOf(); +- tree sa_type = d_array_type (etype, elements->dim); ++ Type *tb = type->toBasetype(); ++ gcc_assert (tb->ty == Tarray || tb->ty == Tsarray || tb->ty == Tpointer); ++ ++ // Convert void[n] to ubyte[n] ++ if (tb->ty == Tsarray && tb->nextOf()->toBasetype()->ty == Tvoid) ++ tb = TypeSArray::makeType(loc, Type::tuns8, ((TypeSArray *)tb)->dim->toUInteger()); ++ ++ Type *etype = tb->nextOf(); ++ tree tsa = d_array_type (etype, elements->dim); + tree result = NULL_TREE; ++ bool constant_p = tb->isImmutable(); ++ ++ // Handle empty array literals. ++ if (elements->dim == 0) ++ { ++ if (tb->ty == Tarray) ++ return d_array_value (type->toCtype(), size_int (0), d_null_pointer); ++ else ++ return build_constructor (tsa, NULL); ++ } + +- /* Build an expression that assigns the expressions in ELEMENTS to a constructor. */ ++ // Build an expression that assigns the expressions in ELEMENTS to a constructor. + vec *elms = NULL; + vec_safe_reserve (elms, elements->dim); + + for (size_t i = 0; i < elements->dim; i++) + { + Expression *e = (*elements)[i]; ++ tree elem = e->toElem (irs); ++ ++ elem = maybe_make_temp (elem); + CONSTRUCTOR_APPEND_ELT (elms, build_integer_cst (i, size_type_node), +- convert_expr (e->toElem (irs), e->type, etype)); ++ convert_expr (elem, e->type, etype)); ++ ++ if (constant_p && !e->isConst()) ++ constant_p = false; + } + +- tree ctor = build_constructor (sa_type, elms); ++ tree ctor = build_constructor (tsa, elms); + tree args[2]; + +- args[0] = irs->typeinfoReference (etype->arrayOf()); ++ // Nothing else to do for static arrays. ++ if (tb->ty == Tsarray) ++ return d_convert (type->toCtype(), ctor); ++ ++ // Don't allocate immutable arrays on the heap. ++ if (tb->ty == Tarray && constant_p) ++ return d_array_value (type->toCtype(), size_int (elements->dim), build_address (ctor)); ++ ++ args[0] = build_typeinfo (etype->arrayOf()); + args[1] = build_integer_cst (elements->dim, size_type_node); + + // Call _d_arrayliteralTX (ti, dim); +@@ -2099,7 +2430,7 @@ ArrayLiteralExp::toElem (IRState *irs) + + // memcpy (mem, &ctor, size) + tree size = fold_build2 (MULT_EXPR, size_type_node, +- size_int (elements->dim), size_int (typeb->nextOf()->size())); ++ size_int (elements->dim), size_int (tb->nextOf()->size())); + + result = d_build_call_nary (builtin_decl_explicit (BUILT_IN_MEMCPY), 3, + mem, build_address (ctor), size); +@@ -2107,10 +2438,8 @@ ArrayLiteralExp::toElem (IRState *irs) + // Returns array pointed to by MEM. + result = maybe_compound_expr (result, mem); + +- if (typeb->ty == Tarray) ++ if (tb->ty == Tarray) + result = d_array_value (type->toCtype(), size_int (elements->dim), result); +- else if (typeb->ty == Tsarray) +- result = indirect_ref (sa_type, result); + + return result; + } +@@ -2171,7 +2500,7 @@ AssocArrayLiteralExp::toElem (IRState *i + + tree args[3]; + +- args[0] = irs->typeinfoReference (aa_type); ++ args[0] = build_typeinfo (aa_type); + args[1] = d_array_value (index->arrayOf()->toCtype(), size_int (keys->dim), keys_ptr); + args[2] = d_array_value (next->arrayOf()->toCtype(), size_int (keys->dim), vals_ptr); + result = maybe_compound_expr (result, build_libcall (LIBCALL_ASSOCARRAYLITERALTX, 3, args)); +@@ -2196,100 +2525,69 @@ StructLiteralExp::toElem (IRState *irs) + if (sinit && sinit->Stree) + return sinit->Stree; + +- if (elements) +- { +- size_t dim = elements->dim; +- gcc_assert (dim <= sd->fields.dim - sd->isnested); ++ // CTFE may fill the hidden pointer by NullExp. ++ size_t dim = elements ? elements->dim : 0; ++ gcc_assert (dim <= sd->fields.dim); + +- for (size_t i = 0; i < dim; i++) +- { +- if (!(*elements)[i]) +- continue; ++ for (size_t i = 0; i < dim; i++) ++ { ++ if (!(*elements)[i]) ++ continue; + +- Expression *exp = (*elements)[i]; +- Type *exp_type = exp->type->toBasetype(); +- tree exp_tree = NULL_TREE; +- tree call_exp = NULL_TREE; ++ Expression *exp = (*elements)[i]; ++ Type *exp_type = exp->type->toBasetype(); ++ tree exp_tree = NULL_TREE; + +- VarDeclaration *fld = sd->fields[i]; +- Type *fld_type = fld->type->toBasetype(); ++ VarDeclaration *fld = sd->fields[i]; ++ Type *fld_type = fld->type->toBasetype(); + +- if (fld_type->ty == Tsarray) ++ if (fld_type->ty == Tsarray) ++ { ++ if (d_types_compatible (exp_type, fld_type)) + { +- if (d_types_compatible (exp_type, fld_type)) +- { +- StructDeclaration *sd = needsPostblit (fld_type); +- if (sd != NULL) +- { +- // Generate _d_arrayctor (ti, from = exp, to = exp_tree) +- Type *ti = fld_type->nextOf(); +- tree args[3]; +- +- exp_tree = build_local_var (exp_type->toCtype()); +- args[0] = irs->typeinfoReference (ti); +- args[1] = irs->toDArray (exp); +- args[2] = convert_expr (exp_tree, exp_type, ti->arrayOf()); +- call_exp = build_libcall (LIBCALL_ARRAYCTOR, 3, args); +- } +- else +- { +- // %% This would call _d_newarrayT ... use memcpy? +- exp_tree = convert_expr (exp->toElem (irs), exp->type, fld->type); +- } +- } +- else +- { +- // %% Could use memset if is zero init... +- exp_tree = build_local_var (fld_type->toCtype()); +- Type *etype = fld_type; +- +- while (etype->ty == Tsarray) +- etype = etype->nextOf(); +- +- gcc_assert (fld_type->size() % etype->size() == 0); +- tree size = fold_build2 (TRUNC_DIV_EXPR, size_type_node, +- size_int (fld_type->size()), size_int (etype->size())); +- +- tree ptr_tree = build_nop (etype->pointerTo()->toCtype(), +- build_address (exp_tree)); +- tree set_exp = irs->arraySetExpr (ptr_tree, exp->toElem (irs), size); +- exp_tree = compound_expr (set_exp, exp_tree); +- } ++ // %% This would call _d_newarrayT ... use memcpy? ++ exp_tree = convert_expr (exp->toElem (irs), exp->type, fld->type); + } + else + { +- exp_tree = convert_expr (exp->toElem (irs), exp->type, fld->type); +- StructDeclaration *sd = needsPostblit (fld_type); +- if (sd && exp->isLvalue()) +- { +- // Call __postblit (&exp_tree) +- Expressions args; +- call_exp = irs->call (sd->postblit, build_address (exp_tree), &args); +- } ++ // %% Could use memset if is zero init... ++ exp_tree = build_local_temp (fld_type->toCtype()); ++ Type *etype = fld_type; ++ ++ while (etype->ty == Tsarray) ++ etype = etype->nextOf(); ++ ++ gcc_assert (fld_type->size() % etype->size() == 0); ++ tree size = fold_build2 (TRUNC_DIV_EXPR, size_type_node, ++ size_int (fld_type->size()), size_int (etype->size())); ++ ++ tree ptr_tree = build_nop (etype->pointerTo()->toCtype(), ++ build_address (exp_tree)); ++ tree set_exp = irs->doArraySet (ptr_tree, exp->toElem (irs), size); ++ exp_tree = compound_expr (set_exp, exp_tree); + } ++ } ++ else ++ exp_tree = convert_expr (exp->toElem (irs), exp->type, fld->type); + +- if (call_exp) +- irs->addExp (call_exp); +- +- CONSTRUCTOR_APPEND_ELT (ce, fld->toSymbol()->Stree, exp_tree); ++ CONSTRUCTOR_APPEND_ELT (ce, fld->toSymbol()->Stree, exp_tree); + +- // Unions only have one field that gets assigned. +- if (sd->isUnionDeclaration()) +- break; +- } ++ // Unions only have one field that gets assigned. ++ if (sd->isUnionDeclaration()) ++ break; + } + +- if (sd->isNested()) ++ if (sd->isNested() && dim != sd->fields.dim) + { + // Maybe setup hidden pointer to outer scope context. + tree vthis_field = sd->vthis->toSymbol()->Stree; +- tree vthis_value = irs->getVThis (sd, this); ++ tree vthis_value = build_vthis (sd, irs->func, this); + CONSTRUCTOR_APPEND_ELT (ce, vthis_field, vthis_value); + gcc_assert (sinit == NULL); + } + + tree ctor = build_constructor (type->toCtype(), ce); +- tree var = build_local_var (TREE_TYPE (ctor)); ++ tree var = build_local_temp (TREE_TYPE (ctor)); + tree init = NULL_TREE; + + if (fillHoles) +@@ -2347,16 +2645,17 @@ elem * + ThisExp::toElem (IRState *irs) + { + tree this_tree = NULL_TREE; ++ FuncDeclaration *fd = irs->func; + + if (var) + { + gcc_assert(var->isVarDeclaration()); +- this_tree = irs->var (var); ++ this_tree = get_decl_tree (var, fd); + } + else + { +- gcc_assert (irs->func && irs->func->vthis); +- this_tree = irs->var (irs->func->vthis); ++ gcc_assert (fd && fd->vthis); ++ this_tree = get_decl_tree (fd->vthis, fd); + } + + if (type->ty == Tstruct) +@@ -2404,3 +2703,13 @@ VectorExp::toElem (IRState *irs) + } + } + ++elem * ++ClassReferenceExp::toElem (IRState *) ++{ ++ // ClassReferenceExp builds the RECORD_TYPE, ++ // we want to return a reference to it. ++ tree exp = toSymbol()->Stree; ++ ++ return build_address (exp); ++} ++ +--- a/src/gcc/d/dfrontend/aav.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/aav.c 2014-04-01 16:32:51.000000000 +0100 +@@ -14,20 +14,17 @@ + + #include + #include ++#include + #include + + #include "aav.h" + +-static const size_t prime_list[] = { +- 31UL, +- 97UL, 389UL, +- 1543UL, 6151UL, +- 24593UL, 98317UL, +- 393241UL, 1572869UL, +- 6291469UL, 25165843UL, +- 100663319UL, 402653189UL, +- 1610612741UL, 4294967291UL, +-}; ++ ++inline size_t hash(size_t a) ++{ ++ a ^= (a >> 20) ^ (a >> 12); ++ return a ^ (a >> 7) ^ (a >> 4); ++} + + struct aaA + { +@@ -42,9 +39,9 @@ struct AA + size_t b_length; + size_t nodes; // total number of aaA nodes + aaA* binit[4]; // initial value of b[] +-}; + +-static const AA bbinit = { NULL, }; ++ aaA aafirst; // a lot of these AA's have only one entry ++}; + + /**************************************************** + * Determine number of entries in associative array. +@@ -67,16 +64,20 @@ Value* _aaGet(AA** paa, Key key) + + if (!*paa) + { AA *a = new AA(); +- *a = bbinit; + a->b = a->binit; + a->b_length = sizeof(a->binit) / sizeof(a->binit[0]); ++ a->nodes = 0; ++ a->binit[0] = NULL; ++ a->binit[1] = NULL; ++ a->binit[2] = NULL; ++ a->binit[3] = NULL; + *paa = a; + assert((*paa)->b_length == 4); + } + //printf("paa = %p, *paa = %p\n", paa, *paa); + + assert((*paa)->b_length); +- size_t i = (size_t)key % (*paa)->b_length; ++ size_t i = hash((size_t)key) & ((*paa)->b_length - 1); + aaA** pe = &(*paa)->b[i]; + aaA *e; + while ((e = *pe) != NULL) +@@ -88,15 +89,17 @@ Value* _aaGet(AA** paa, Key key) + + // Not found, create new elem + //printf("create new one\n"); +- e = new aaA(); ++ ++ size_t nodes = ++(*paa)->nodes; ++ e = (nodes != 1) ? new aaA() : &(*paa)->aafirst; ++ //e = new aaA(); + e->next = NULL; + e->key = key; + e->value = NULL; + *pe = e; + +- size_t nodes = ++(*paa)->nodes; +- //printf("length = %d, nodes = %d\n", paa.a.b.length, nodes); +- if (nodes > (*paa)->b_length * 4) ++ //printf("length = %d, nodes = %d\n", (*paa)->b_length, nodes); ++ if (nodes > (*paa)->b_length * 2) + { + //printf("rehash\n"); + _aaRehash(paa); +@@ -114,14 +117,11 @@ Value* _aaGet(AA** paa, Key key) + Value _aaGetRvalue(AA* aa, Key key) + { + //printf("_aaGetRvalue(key = %p)\n", key); +- if (!aa) +- return NULL; +- +- size_t len = aa->b_length; +- +- if (len) ++ if (aa) + { +- size_t i = (size_t)key % len; ++ size_t i; ++ size_t len = aa->b_length; ++ i = hash((size_t)key) & (len-1); + aaA* e = aa->b[i]; + while (e) + { +@@ -143,39 +143,33 @@ void _aaRehash(AA** paa) + //printf("Rehash\n"); + if (*paa) + { +- AA newb = bbinit; + AA *aa = *paa; +- size_t len = _aaLen(*paa); +- if (len) +- { size_t i; +- +- for (i = 0; i < sizeof(prime_list)/sizeof(prime_list[0]) - 1; i++) +- { +- if (len <= prime_list[i]) +- break; +- } +- len = prime_list[i]; +- newb.b = new aaA*[len]; +- memset(newb.b, 0, len * sizeof(aaA*)); +- newb.b_length = len; ++ if (aa) ++ { ++ size_t len = aa->b_length; ++ if (len == 4) ++ len = 32; ++ else ++ len *= 4; ++ aaA** newb = new aaA*[len]; ++ memset(newb, 0, len * sizeof(aaA*)); + + for (size_t k = 0; k < aa->b_length; k++) + { aaA *e = aa->b[k]; + while (e) + { aaA* enext = e->next; +- size_t j = (size_t)e->key % len; +- e->next = newb.b[j]; +- newb.b[j] = e; ++ size_t j = hash((size_t)e->key) & (len-1); ++ e->next = newb[j]; ++ newb[j] = e; + e = enext; + } + } + if (aa->b != aa->binit) + delete[] aa->b; + +- newb.nodes = aa->nodes; ++ aa->b = newb; ++ aa->b_length = len; + } +- +- **paa = newb; + } + } + +--- a/src/gcc/d/dfrontend/access.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/access.c 2014-04-01 16:32:51.000000000 +0100 +@@ -38,14 +38,14 @@ int hasPackageAccess(Scope *sc, Dsymbol + * Return PROT access for Dsymbol smember in this declaration. + */ + +-enum PROT AggregateDeclaration::getAccess(Dsymbol *smember) ++PROT AggregateDeclaration::getAccess(Dsymbol *smember) + { + return PROTpublic; + } + +-enum PROT StructDeclaration::getAccess(Dsymbol *smember) ++PROT StructDeclaration::getAccess(Dsymbol *smember) + { +- enum PROT access_ret = PROTnone; ++ PROT access_ret = PROTnone; + + #if LOG + printf("+StructDeclaration::getAccess(this = '%s', smember = '%s')\n", +@@ -62,9 +62,9 @@ enum PROT StructDeclaration::getAccess(D + return access_ret; + } + +-enum PROT ClassDeclaration::getAccess(Dsymbol *smember) ++PROT ClassDeclaration::getAccess(Dsymbol *smember) + { +- enum PROT access_ret = PROTnone; ++ PROT access_ret = PROTnone; + + #if LOG + printf("+ClassDeclaration::getAccess(this = '%s', smember = '%s')\n", +@@ -84,7 +84,7 @@ enum PROT ClassDeclaration::getAccess(Ds + for (size_t i = 0; i < baseclasses->dim; i++) + { BaseClass *b = (*baseclasses)[i]; + +- enum PROT access = b->base->getAccess(smember); ++ PROT access = b->base->getAccess(smember); + switch (access) + { + case PROTnone: +@@ -152,7 +152,7 @@ static int accessCheckX( + { + for (size_t i = 0; i < cdthis->baseclasses->dim; i++) + { BaseClass *b = (*cdthis->baseclasses)[i]; +- enum PROT access = b->base->getAccess(smember); ++ PROT access = b->base->getAccess(smember); + if (access >= PROTprotected || + accessCheckX(smember, sfunc, b->base, cdscope) + ) +@@ -192,7 +192,7 @@ void AggregateDeclaration::accessCheck(L + + FuncDeclaration *f = sc->func; + AggregateDeclaration *cdscope = sc->getStructClassScope(); +- enum PROT access; ++ PROT access; + + #if LOG + printf("AggregateDeclaration::accessCheck() for %s.%s in function %s() in scope %s\n", +@@ -214,7 +214,7 @@ void AggregateDeclaration::accessCheck(L + //assert(smember->parent->isBaseOf(this, NULL)); + + if (smemberparent == this) +- { enum PROT access2 = smember->prot(); ++ { PROT access2 = smember->prot(); + + result = access2 >= PROTpublic || + hasPrivateAccess(f) || +@@ -290,25 +290,60 @@ int hasPackageAccess(Scope *sc, Dsymbol + printf("hasPackageAccess(s = '%s', sc = '%p')\n", s->toChars(), sc); + #endif + ++ Package *pkg = NULL; + for (; s; s = s->parent) + { +- if (s->isPackage() && !s->isModule()) ++ if (Module *m = s->isModule()) ++ { ++ DsymbolTable *dst = Package::resolve(m->md ? m->md->packages : NULL, NULL, NULL); ++ assert(dst); ++ Dsymbol *s2 = dst->lookup(m->ident); ++ assert(s2); ++ Package *p = s2->isPackage(); ++ if (p && p->isPkgMod == PKGmodule) ++ { ++ assert(p->mod == m); ++ pkg = p; ++ break; ++ } ++ } ++ else if ((pkg = s->isPackage()) != NULL) + break; + } + #if LOG +- if (s) +- printf("\tthis is in package '%s'\n", s->toChars()); ++ if (pkg) ++ printf("\tthis is in package '%s'\n", pkg->toChars()); + #endif + +- if (s && s == sc->module->parent) ++ if (pkg) + { ++ if (pkg == sc->module->parent) ++ { + #if LOG +- printf("\ts is in same package as sc\n"); ++ printf("\ts is in same package as sc\n"); + #endif +- return 1; ++ return 1; ++ } ++ if (pkg->isPkgMod == PKGmodule && pkg->mod == sc->module) ++ { ++#if LOG ++ printf("\ts is in same package.d module as sc\n"); ++#endif ++ return 1; ++ } ++ s = sc->module->parent; ++ for (; s; s = s->parent) ++ { ++ if (s == pkg) ++ { ++#if LOG ++ printf("\ts is in ancestor package of sc\n"); ++#endif ++ return 1; ++ } ++ } + } + +- + #if LOG + printf("\tno package access\n"); + #endif +@@ -375,6 +410,9 @@ int AggregateDeclaration::hasPrivateAcce + + void accessCheck(Loc loc, Scope *sc, Expression *e, Declaration *d) + { ++ if (sc->flags & SCOPEnoaccesscheck) ++ return; ++ + #if LOG + if (e) + { printf("accessCheck(%s . %s)\n", e->toChars(), d->toChars()); +@@ -395,7 +433,8 @@ void accessCheck(Loc loc, Scope *sc, Exp + } + } + else if (e->type->ty == Tclass) +- { // Do access check ++ { ++ // Do access check + ClassDeclaration *cd = (ClassDeclaration *)(((TypeClass *)e->type)->sym); + if (e->op == TOKsuper) + { +@@ -406,7 +445,8 @@ void accessCheck(Loc loc, Scope *sc, Exp + cd->accessCheck(loc, sc, d); + } + else if (e->type->ty == Tstruct) +- { // Do access check ++ { ++ // Do access check + StructDeclaration *cd = (StructDeclaration *)(((TypeStruct *)e->type)->sym); + cd->accessCheck(loc, sc, d); + } +--- a/src/gcc/d/dfrontend/aggregate.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/aggregate.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -18,21 +18,21 @@ + #include "root.h" + + #include "dsymbol.h" ++#include "declaration.h" + +-struct Identifier; +-struct Type; +-struct TypeFunction; +-struct Expression; +-struct FuncDeclaration; +-struct CtorDeclaration; +-struct DtorDeclaration; +-struct InvariantDeclaration; +-struct NewDeclaration; +-struct DeleteDeclaration; +-struct InterfaceDeclaration; +-struct TypeInfoClassDeclaration; +-struct VarDeclaration; +- ++class Identifier; ++class Type; ++class TypeFunction; ++class Expression; ++class FuncDeclaration; ++class CtorDeclaration; ++class DtorDeclaration; ++class InvariantDeclaration; ++class NewDeclaration; ++class DeleteDeclaration; ++class InterfaceDeclaration; ++class TypeInfoClassDeclaration; ++class VarDeclaration; + #ifdef IN_GCC + typedef union tree_node dt_t; + #else +@@ -46,33 +46,41 @@ enum Sizeok + SIZEOKfwd, // error in computing size of aggregate + }; + +-struct AggregateDeclaration : ScopeDsymbol ++class AggregateDeclaration : public ScopeDsymbol + { ++public: + Type *type; + StorageClass storage_class; +- enum PROT protection; ++ PROT protection; + Type *handle; // 'this' type + unsigned structsize; // size of struct + unsigned alignsize; // size of struct for alignment purposes + int hasUnions; // set if aggregate has overlapping fields + VarDeclarations fields; // VarDeclaration fields +- enum Sizeok sizeok; // set when structsize contains valid data ++ Sizeok sizeok; // set when structsize contains valid data + Dsymbol *deferred; // any deferred semantic2() or semantic3() symbol + bool isdeprecated; // !=0 if deprecated + + #if DMDV2 +- bool isnested; // !=0 if is nested ++ Dsymbol *enclosing; /* !=NULL if is nested ++ * pointing to the dsymbol that directly enclosing it. ++ * 1. The function that enclosing it (nested struct and class) ++ * 2. The class that enclosing it (nested class only) ++ * 3. If enclosing aggregate is template, its enclosing dsymbol. ++ * See AggregateDeclaraton::makeNested for the details. ++ */ + VarDeclaration *vthis; // 'this' parameter if this aggregate is nested + #endif + // Special member functions +- InvariantDeclaration *inv; // invariant ++ FuncDeclarations invs; // Array of invariants ++ FuncDeclaration *inv; // invariant + NewDeclaration *aggNew; // allocator + DeleteDeclaration *aggDelete; // deallocator + + #if DMDV2 +- //CtorDeclaration *ctor; + Dsymbol *ctor; // CtorDeclaration or TemplateDeclaration +- CtorDeclaration *defaultCtor; // default constructor ++ CtorDeclaration *defaultCtor; // default constructor - should have no arguments, because ++ // it would be stored in TypeInfo_Class.defaultConstructor + Dsymbol *aliasthis; // forward unresolved lookups to aliasthis + bool noDefaultCtor; // no default construction + #endif +@@ -95,18 +103,22 @@ struct AggregateDeclaration : ScopeDsymb + Type *getType(); + int firstFieldInUnion(int indx); // first field in union that includes indx + int numFieldsInUnion(int firstIndex); // #fields in union starting at index +- int isDeprecated(); // is aggregate deprecated? ++ bool isDeprecated(); // is aggregate deprecated? + FuncDeclaration *buildDtor(Scope *sc); +- int isNested(); +- int isExport(); ++ FuncDeclaration *buildInv(Scope *sc); ++ bool isNested(); ++ void makeNested(); ++ bool isExport(); ++ void searchCtor(); + + void emitComment(Scope *sc); + void toJson(JsonOut *json); + void toDocBuffer(OutBuffer *buf, Scope *sc); + +- FuncDeclaration *hasIdentityOpAssign(Scope *sc, Dsymbol *assign); ++ FuncDeclaration *hasIdentityOpAssign(Scope *sc); ++ FuncDeclaration *hasIdentityOpEquals(Scope *sc); + +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); + + // For access checking + virtual PROT getAccess(Dsymbol *smember); // determine access to smember +@@ -114,7 +126,7 @@ struct AggregateDeclaration : ScopeDsymb + int hasPrivateAccess(Dsymbol *smember); // does smember have private access to members of this class? + void accessCheck(Loc loc, Scope *sc, Dsymbol *smember); + +- enum PROT prot(); ++ PROT prot(); + + // Back end + Symbol *stag; // tag symbol for debug data +@@ -124,8 +136,18 @@ struct AggregateDeclaration : ScopeDsymb + AggregateDeclaration *isAggregateDeclaration() { return this; } + }; + +-struct StructDeclaration : AggregateDeclaration ++struct StructFlags ++{ ++ typedef unsigned Type; ++ enum Enum ++ { ++ hasPointers = 0x1, // NB: should use noPointers as in ClassFlags ++ }; ++}; ++ ++class StructDeclaration : public AggregateDeclaration + { ++public: + int zeroInit; // !=0 if initialize with 0 fill + #if DMDV2 + int hasIdentityAssign; // !=0 if has identity opAssign +@@ -135,7 +157,9 @@ struct StructDeclaration : AggregateDecl + FuncDeclaration *postblit; // aggregate postblit + + FuncDeclaration *xeq; // TypeInfo_Struct.xopEquals ++ FuncDeclaration *xcmp; // TypeInfo_Struct.xopCmp + static FuncDeclaration *xerreq; // object.xopEquals ++ static FuncDeclaration *xerrcmp; // object.xopCmp + + structalign_t alignment; // alignment applied outside of the struct + #endif +@@ -149,7 +173,7 @@ struct StructDeclaration : AggregateDecl + void semantic(Scope *sc); + Dsymbol *search(Loc, Identifier *ident, int flags); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); + const char *kind(); + void finalizeSize(Scope *sc); + bool isPOD(); +@@ -160,12 +184,11 @@ struct StructDeclaration : AggregateDecl + int needOpAssign(); + int needOpEquals(); + FuncDeclaration *buildOpAssign(Scope *sc); +- FuncDeclaration *buildOpEquals(Scope *sc); + FuncDeclaration *buildPostBlit(Scope *sc); + FuncDeclaration *buildCpCtor(Scope *sc); +- ++ FuncDeclaration *buildOpEquals(Scope *sc); + FuncDeclaration *buildXopEquals(Scope *sc); +- void makeNested(); ++ FuncDeclaration *buildXopCmp(Scope *sc); + #endif + void toDocBuffer(OutBuffer *buf, Scope *sc); + +@@ -178,8 +201,9 @@ struct StructDeclaration : AggregateDecl + StructDeclaration *isStructDeclaration() { return this; } + }; + +-struct UnionDeclaration : StructDeclaration ++class UnionDeclaration : public StructDeclaration + { ++public: + UnionDeclaration(Loc loc, Identifier *id); + Dsymbol *syntaxCopy(Dsymbol *s); + const char *kind(); +@@ -190,10 +214,10 @@ struct UnionDeclaration : StructDeclarat + struct BaseClass + { + Type *type; // (before semantic processing) +- enum PROT protection; // protection for the base interface ++ PROT protection; // protection for the base interface + + ClassDeclaration *base; +- int offset; // 'this' pointer offset ++ unsigned offset; // 'this' pointer offset + FuncDeclarations vtbl; // for interfaces: Array of FuncDeclaration's + // making up the vtbl[] + +@@ -202,7 +226,7 @@ struct BaseClass + // are a copy of the InterfaceDeclaration::interfaces + + BaseClass(); +- BaseClass(Type *type, enum PROT protection); ++ BaseClass(Type *type, PROT protection); + + int fillVtbl(ClassDeclaration *cd, FuncDeclarations *vtbl, int newinstance); + void copyBaseInterfaces(BaseClasses *); +@@ -211,10 +235,26 @@ struct BaseClass + extern int CLASSINFO_SIZE; // value of ClassInfo.size + extern int CLASSINFO_SIZE_64; // value of ClassInfo.size + +-struct ClassDeclaration : AggregateDeclaration ++struct ClassFlags + { ++ typedef unsigned Type; ++ enum Enum ++ { ++ isCOMclass = 0x1, ++ noPointers = 0x2, ++ hasOffTi = 0x4, ++ hasCtor = 0x8, ++ hasGetMembers = 0x10, ++ hasTypeInfo = 0x20, ++ isAbstract = 0x40, ++ isCPPclass = 0x80, ++ }; ++}; ++ ++class ClassDeclaration : public AggregateDeclaration ++{ ++public: + static ClassDeclaration *object; +- static ClassDeclaration *classinfo; + static ClassDeclaration *throwable; + static ClassDeclaration *exception; + static ClassDeclaration *errorException; +@@ -242,15 +282,17 @@ struct ClassDeclaration : AggregateDecla + TypeInfoClassDeclaration *vclassinfo; // the ClassInfo object for this ClassDeclaration + int com; // !=0 if this is a COM class (meaning + // it derives from IUnknown) +- int isscope; // !=0 if this is an auto class +- int isabstract; // !=0 if abstract class +-#if DMDV1 +- bool isnested; // !=0 if is nested +- VarDeclaration *vthis; // 'this' parameter if this class is nested ++#if DMDV2 ++ int cpp; // !=0 if this is a C++ interface + #endif ++ int isscope; // !=0 if this is an auto class ++ int isabstract; // !=0 if abstract class + int inuse; // to prevent recursive attempts ++ Semantic doAncestorsSemantic; // Before searching symbol, whole ancestors should finish ++ // calling semantic() at least once, due to fill symtab ++ // and do addMember(). [== Semantic(Start,In,Done)] + +- ClassDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses); ++ ClassDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses, bool inObject = false); + Dsymbol *syntaxCopy(Dsymbol *s); + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -267,18 +309,16 @@ struct ClassDeclaration : AggregateDecla + #endif + FuncDeclaration *findFunc(Identifier *ident, TypeFunction *tf); + void interfaceSemantic(Scope *sc); +-#if DMDV1 +- int isNested(); +-#endif + int isCOMclass(); + virtual int isCOMinterface(); + #if DMDV2 ++ int isCPPclass(); + virtual int isCPPinterface(); + #endif +- int isAbstract(); ++ bool isAbstract(); + virtual int vtblOffset(); + const char *kind(); +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); + void toDocBuffer(OutBuffer *buf, Scope *sc); + + PROT getAccess(Dsymbol *smember); // determine access to smember +@@ -299,11 +339,9 @@ struct ClassDeclaration : AggregateDecla + ClassDeclaration *isClassDeclaration() { return (ClassDeclaration *)this; } + }; + +-struct InterfaceDeclaration : ClassDeclaration ++class InterfaceDeclaration : public ClassDeclaration + { +-#if DMDV2 +- int cpp; // !=0 if this is a C++ interface +-#endif ++public: + InterfaceDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses); + Dsymbol *syntaxCopy(Dsymbol *s); + void semantic(Scope *sc); +--- a/src/gcc/d/dfrontend/aliasthis.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/aliasthis.c 2014-04-01 16:32:51.000000000 +0100 +@@ -36,8 +36,22 @@ Expression *resolveAliasThis(Scope *sc, + L1: + if (ad && ad->aliasthis) + { ++ bool isstatic = (e->op == TOKtype); + e = new DotIdExp(e->loc, e, ad->aliasthis->ident); + e = e->semantic(sc); ++ if (isstatic && ad->aliasthis->needThis()) ++ { ++ /* non-@property function is not called inside typeof(), ++ * so resolve it ahead. ++ */ ++ int save = sc->intypeof; ++ sc->intypeof = 1; // bypass "need this" error check ++ e = resolveProperties(sc, e); ++ sc->intypeof = save; ++ ++ e = new TypeExp(e->loc, new TypeTypeof(e->loc, e)); ++ e = e->semantic(sc); ++ } + e = resolveProperties(sc, e); + } + } +@@ -74,7 +88,7 @@ void AliasThis::semantic(Scope *sc) + assert(ad->members); + Dsymbol *s = ad->search(loc, ident, 0); + if (!s) +- { s = sc->search(loc, ident, 0); ++ { s = sc->search(loc, ident, NULL); + if (s) + ::error(loc, "%s is not a member of %s", s->toChars(), ad->toChars()); + else +--- a/src/gcc/d/dfrontend/aliasthis.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/aliasthis.h 2014-04-01 16:32:51.000000000 +0100 +@@ -22,8 +22,9 @@ + + #if DMDV2 + +-struct AliasThis : Dsymbol ++class AliasThis : public Dsymbol + { ++public: + // alias Identifier this; + Identifier *ident; + +--- a/src/gcc/d/dfrontend/apply.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/apply.c 2014-04-01 16:32:51.000000000 +0100 +@@ -26,9 +26,7 @@ + * Creating an iterator for this would be much more complex. + */ + +-typedef int (*fp_t)(Expression *, void *); +- +-int Expression::apply(fp_t fp, void *param) ++int Expression::apply(apply_fp_t fp, void *param) + { + return (*fp)(this, param); + } +@@ -36,14 +34,9 @@ int Expression::apply(fp_t fp, void *par + /****************************** + * Perform apply() on an t if not null + */ +-template +-int condApply(T* t, fp_t fp, void* param) +-{ +- return t ? t->apply(fp, param) : 0; +-} ++#define condApply(t, fp, param) (t ? t->apply(fp, param) : 0) + +- +-int NewExp::apply(int (*fp)(Expression *, void *), void *param) ++int NewExp::apply(apply_fp_t fp, void *param) + { + //printf("NewExp::apply(): %s\n", toChars()); + +@@ -53,7 +46,7 @@ int NewExp::apply(int (*fp)(Expression * + (*fp)(this, param); + } + +-int NewAnonClassExp::apply(int (*fp)(Expression *, void *), void *param) ++int NewAnonClassExp::apply(apply_fp_t fp, void *param) + { + //printf("NewAnonClassExp::apply(): %s\n", toChars()); + +@@ -63,47 +56,47 @@ int NewAnonClassExp::apply(int (*fp)(Exp + (*fp)(this, param); + } + +-int UnaExp::apply(fp_t fp, void *param) ++int UnaExp::apply(apply_fp_t fp, void *param) + { + return e1->apply(fp, param) || + (*fp)(this, param); + } + +-int BinExp::apply(fp_t fp, void *param) ++int BinExp::apply(apply_fp_t fp, void *param) + { + return e1->apply(fp, param) || + e2->apply(fp, param) || + (*fp)(this, param); + } + +-int AssertExp::apply(fp_t fp, void *param) ++int AssertExp::apply(apply_fp_t fp, void *param) + { +- //printf("CallExp::apply(fp_t fp, void *param): %s\n", toChars()); ++ //printf("CallExp::apply(apply_fp_t fp, void *param): %s\n", toChars()); + return e1->apply(fp, param) || + condApply(msg, fp, param) || + (*fp)(this, param); + } + + +-int CallExp::apply(fp_t fp, void *param) ++int CallExp::apply(apply_fp_t fp, void *param) + { +- //printf("CallExp::apply(fp_t fp, void *param): %s\n", toChars()); ++ //printf("CallExp::apply(apply_fp_t fp, void *param): %s\n", toChars()); + return e1->apply(fp, param) || + condApply(arguments, fp, param) || + (*fp)(this, param); + } + + +-int ArrayExp::apply(fp_t fp, void *param) ++int ArrayExp::apply(apply_fp_t fp, void *param) + { +- //printf("ArrayExp::apply(fp_t fp, void *param): %s\n", toChars()); ++ //printf("ArrayExp::apply(apply_fp_t fp, void *param): %s\n", toChars()); + return e1->apply(fp, param) || + condApply(arguments, fp, param) || + (*fp)(this, param); + } + + +-int SliceExp::apply(fp_t fp, void *param) ++int SliceExp::apply(apply_fp_t fp, void *param) + { + return e1->apply(fp, param) || + condApply(lwr, fp, param) || +@@ -112,14 +105,14 @@ int SliceExp::apply(fp_t fp, void *param + } + + +-int ArrayLiteralExp::apply(fp_t fp, void *param) ++int ArrayLiteralExp::apply(apply_fp_t fp, void *param) + { + return condApply(elements, fp, param) || + (*fp)(this, param); + } + + +-int AssocArrayLiteralExp::apply(fp_t fp, void *param) ++int AssocArrayLiteralExp::apply(apply_fp_t fp, void *param) + { + return condApply(keys, fp, param) || + condApply(values, fp, param) || +@@ -127,21 +120,27 @@ int AssocArrayLiteralExp::apply(fp_t fp, + } + + +-int StructLiteralExp::apply(fp_t fp, void *param) ++int StructLiteralExp::apply(apply_fp_t fp, void *param) + { +- return condApply(elements, fp, param) || ++ if(stageflags & stageApply) return 0; ++ int old = stageflags; ++ stageflags |= stageApply; ++ int ret = condApply(elements, fp, param) || + (*fp)(this, param); ++ stageflags = old; ++ return ret; + } + + +-int TupleExp::apply(fp_t fp, void *param) ++int TupleExp::apply(apply_fp_t fp, void *param) + { +- return condApply(exps, fp, param) || ++ return (e0 ? (*fp)(e0, param) : 0) || ++ condApply(exps, fp, param) || + (*fp)(this, param); + } + + +-int CondExp::apply(fp_t fp, void *param) ++int CondExp::apply(apply_fp_t fp, void *param) + { + return econd->apply(fp, param) || + e1->apply(fp, param) || +--- a/src/gcc/d/dfrontend/argtypes.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/argtypes.c 2014-04-01 16:32:51.000000000 +0100 +@@ -26,9 +26,6 @@ + #include "aggregate.h" + #include "hdrgen.h" + +-#define tfloat2 tfloat64 +-//#define tfloat2 tcomplex32 +- + /**************************************************** + * This breaks a type down into 'simpler' types that can be passed to a function + * in registers, and returned in registers. +@@ -84,7 +81,7 @@ TypeTuple *TypeBasic::toArgTypes() + + case Tcomplex32: + if (global.params.is64bit) +- t1 = Type::tfloat2; ++ t1 = Type::tfloat64; + else + { + t1 = Type::tfloat64; +@@ -157,14 +154,6 @@ TypeTuple *TypeSArray::toArgTypes() + #endif + } + +-TypeTuple *TypeDArray::toArgTypes() +-{ +- /* Should be done as if it were: +- * struct S { size_t length; void* ptr; } +- */ +- return new TypeTuple(Type::tsize_t, Type::tvoidptr); +-} +- + TypeTuple *TypeAArray::toArgTypes() + { + return new TypeTuple(Type::tvoidptr); +@@ -175,14 +164,6 @@ TypeTuple *TypePointer::toArgTypes() + return new TypeTuple(Type::tvoidptr); + } + +-TypeTuple *TypeDelegate::toArgTypes() +-{ +- /* Should be done as if it were: +- * struct S { void* ptr; void* funcptr; } +- */ +- return new TypeTuple(Type::tvoidptr, Type::tvoidptr); +-} +- + /************************************* + * Convert a floating point type into the equivalent integral type. + */ +@@ -223,8 +204,8 @@ Type *argtypemerge(Type *t1, Type *t2, u + if (!t2) + return t1; + +- unsigned sz1 = t1->size(0); +- unsigned sz2 = t2->size(0); ++ unsigned sz1 = t1->size(Loc()); ++ unsigned sz2 = t2->size(Loc()); + + if (t1->ty != t2->ty && + (t1->ty == Tfloat80 || t2->ty == Tfloat80)) +@@ -232,7 +213,7 @@ Type *argtypemerge(Type *t1, Type *t2, u + + // [float,float] => [cfloat] + if (t1->ty == Tfloat32 && t2->ty == Tfloat32 && offset2 == 4) +- return Type::tfloat2; ++ return Type::tfloat64; + + // Merging floating and non-floating types produces the non-floating type + if (t1->isfloating()) +@@ -276,6 +257,38 @@ Type *argtypemerge(Type *t1, Type *t2, u + return t; + } + ++TypeTuple *TypeDArray::toArgTypes() ++{ ++ /* Should be done as if it were: ++ * struct S { size_t length; void* ptr; } ++ */ ++ if (global.params.is64bit && !global.params.isLP64) ++ { ++ // For AMD64 ILP32 ABI, D arrays fit into a single integer register. ++ unsigned offset = Type::tsize_t->size(Loc()); ++ Type *t = argtypemerge(Type::tsize_t, Type::tvoidptr, offset); ++ if (t) ++ return new TypeTuple(t); ++ } ++ return new TypeTuple(Type::tsize_t, Type::tvoidptr); ++} ++ ++TypeTuple *TypeDelegate::toArgTypes() ++{ ++ /* Should be done as if it were: ++ * struct S { size_t length; void* ptr; } ++ */ ++ if (global.params.is64bit && !global.params.isLP64) ++ { ++ // For AMD64 ILP32 ABI, delegates fit into a single integer register. ++ unsigned offset = Type::tsize_t->size(Loc()); ++ Type *t = argtypemerge(Type::tsize_t, Type::tvoidptr, offset); ++ if (t) ++ return new TypeTuple(t); ++ } ++ return new TypeTuple(Type::tvoidptr, Type::tvoidptr); ++} ++ + TypeTuple *TypeStruct::toArgTypes() + { + //printf("TypeStruct::toArgTypes() %s\n", toChars()); +@@ -287,7 +300,7 @@ TypeTuple *TypeStruct::toArgTypes() + } + Type *t1 = NULL; + Type *t2 = NULL; +- d_uns64 sz = size(0); ++ d_uns64 sz = size(Loc()); + assert(sz < 0xFFFFFFFF); + switch ((unsigned)sz) + { +@@ -312,8 +325,6 @@ TypeTuple *TypeStruct::toArgTypes() + if (global.params.is64bit && sym->fields.dim) + { + #if 1 +- unsigned sz1 = 0; +- unsigned sz2 = 0; + t1 = NULL; + for (size_t i = 0; i < sym->fields.dim; i++) + { VarDeclaration *f = sym->fields[i]; +@@ -349,7 +360,7 @@ TypeTuple *TypeStruct::toArgTypes() + goto Lmemory; + + // Fields that overlap the 8byte boundary goto Lmemory +- unsigned fieldsz = f->type->size(0); ++ unsigned fieldsz = f->type->size(Loc()); + if (f->offset < 8 && (f->offset + fieldsz) > 8) + goto Lmemory; + } +--- a/src/gcc/d/dfrontend/array.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/array.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,222 +0,0 @@ +- +-// Copyright (c) 1999-2013 by Digital Mars +-// All Rights Reserved +-// written by Walter Bright +-// http://www.digitalmars.com +-// License for redistribution is by either the Artistic License +-// in artistic.txt, or the GNU General Public License in gnu.txt. +-// See the included readme.txt for details. +- +-#include +-#include +-#include +-#include +- +-#include "port.h" +-#include "root.h" +-#include "rmem.h" +- +- +-/********************************* Array ****************************/ +- +-Array::Array() +-{ +- data = SMALLARRAYCAP ? &smallarray[0] : NULL; +- dim = 0; +- allocdim = SMALLARRAYCAP; +-} +- +-Array::~Array() +-{ +- if (data != &smallarray[0]) +- mem.free(data); +-} +- +-void Array::mark() +-{ +- mem.mark(data); +- for (size_t u = 0; u < dim; u++) +- mem.mark(data[u]); // BUG: what if arrays of Object's? +-} +- +-void Array::reserve(size_t nentries) +-{ +- //printf("Array::reserve: dim = %d, allocdim = %d, nentries = %d\n", (int)dim, (int)allocdim, (int)nentries); +- if (allocdim - dim < nentries) +- { +- if (allocdim == 0) +- { // Not properly initialized, someone memset it to zero +- if (nentries <= SMALLARRAYCAP) +- { allocdim = SMALLARRAYCAP; +- data = SMALLARRAYCAP ? &smallarray[0] : NULL; +- } +- else +- { allocdim = nentries; +- data = (void **)mem.malloc(allocdim * sizeof(*data)); +- } +- } +- else if (allocdim == SMALLARRAYCAP) +- { +- allocdim = dim + nentries; +- data = (void **)mem.malloc(allocdim * sizeof(*data)); +- memcpy(data, &smallarray[0], dim * sizeof(*data)); +- } +- else +- { allocdim = dim + nentries; +- data = (void **)mem.realloc(data, allocdim * sizeof(*data)); +- } +- } +-} +- +-void Array::setDim(size_t newdim) +-{ +- if (dim < newdim) +- { +- reserve(newdim - dim); +- } +- dim = newdim; +-} +- +-void Array::fixDim() +-{ +- if (dim != allocdim) +- { +- if (allocdim >= SMALLARRAYCAP) +- { +- if (dim <= SMALLARRAYCAP) +- { +- memcpy(&smallarray[0], data, dim * sizeof(*data)); +- mem.free(data); +- } +- else +- data = (void **)mem.realloc(data, dim * sizeof(*data)); +- } +- allocdim = dim; +- } +-} +- +-void Array::push(void *ptr) +-{ +- reserve(1); +- data[dim++] = ptr; +-} +- +-void *Array::pop() +-{ +- return data[--dim]; +-} +- +-void Array::shift(void *ptr) +-{ +- reserve(1); +- memmove(data + 1, data, dim * sizeof(*data)); +- data[0] = ptr; +- dim++; +-} +- +-void Array::insert(size_t index, void *ptr) +-{ +- reserve(1); +- memmove(data + index + 1, data + index, (dim - index) * sizeof(*data)); +- data[index] = ptr; +- dim++; +-} +- +- +-void Array::insert(size_t index, Array *a) +-{ +- if (a) +- { +- size_t d = a->dim; +- reserve(d); +- if (dim != index) +- memmove(data + index + d, data + index, (dim - index) * sizeof(*data)); +- memcpy(data + index, a->data, d * sizeof(*data)); +- dim += d; +- } +-} +- +- +-/*********************************** +- * Append array a to this array. +- */ +- +-void Array::append(Array *a) +-{ +- insert(dim, a); +-} +- +-void Array::remove(size_t i) +-{ +- if (dim - i - 1) +- memmove(data + i, data + i + 1, (dim - i - 1) * sizeof(data[0])); +- dim--; +-} +- +-char *Array::toChars() +-{ +- char **buf = (char **)malloc(dim * sizeof(char *)); +- assert(buf); +- size_t len = 2; +- for (size_t u = 0; u < dim; u++) +- { +- buf[u] = ((Object *)data[u])->toChars(); +- len += strlen(buf[u]) + 1; +- } +- char *str = (char *)mem.malloc(len); +- +- str[0] = '['; +- char *p = str + 1; +- for (size_t u = 0; u < dim; u++) +- { +- if (u) +- *p++ = ','; +- len = strlen(buf[u]); +- memcpy(p,buf[u],len); +- p += len; +- } +- *p++ = ']'; +- *p = 0; +- free(buf); +- return str; +-} +- +-void Array::zero() +-{ +- memset(data,0,dim * sizeof(data[0])); +-} +- +-void *Array::tos() +-{ +- return dim ? data[dim - 1] : NULL; +-} +- +-int +-#if _WIN32 +- __cdecl +-#endif +- Array_sort_compare(const void *x, const void *y) +-{ +- Object *ox = *(Object **)x; +- Object *oy = *(Object **)y; +- +- return ox->compare(oy); +-} +- +-void Array::sort() +-{ +- if (dim) +- { +- qsort(data, dim, sizeof(Object *), Array_sort_compare); +- } +-} +- +-Array *Array::copy() +-{ +- Array *a = new Array(); +- +- a->setDim(dim); +- memcpy(a->data, data, dim * sizeof(void *)); +- return a; +-} +- +--- a/src/gcc/d/dfrontend/array.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/array.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,296 @@ ++ ++// Copyright (c) 1999-2011 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef ARRAY_H ++#define ARRAY_H ++ ++#if __DMC__ ++#pragma once ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "object.h" ++#ifdef IN_GCC ++// rmem uses functions poisoned by GCC. ++void *mem_malloc(size_t size); ++void *mem_realloc(void *p, size_t size); ++void mem_free(void *p); ++#else ++#include "rmem.h" ++#endif ++ ++template ++struct Array ++{ ++ size_t dim; ++ TYPE **data; ++ ++ private: ++ size_t allocdim; ++ #define SMALLARRAYCAP 1 ++ TYPE *smallarray[SMALLARRAYCAP]; // inline storage for small arrays ++ ++ public: ++ Array() ++ { ++ data = SMALLARRAYCAP ? &smallarray[0] : NULL; ++ dim = 0; ++ allocdim = SMALLARRAYCAP; ++ } ++ ++ ~Array() ++ { ++ if (data != &smallarray[0]) ++#ifdef IN_GCC ++ mem_free(data); ++#else ++ mem.free(data); ++#endif ++ } ++ ++ char *toChars() ++ { ++#ifdef IN_GCC ++ char **buf = (char **)mem_malloc(dim * sizeof(char *)); ++#else ++ char **buf = (char **)mem.malloc(dim * sizeof(char *)); ++#endif ++ assert(buf); ++ size_t len = 2; ++ for (size_t u = 0; u < dim; u++) ++ { ++ buf[u] = ((RootObject *)data[u])->toChars(); ++ len += strlen(buf[u]) + 1; ++ } ++#ifdef IN_GCC ++ char *str = (char *)mem_malloc(len); ++#else ++ char *str = (char *)mem.malloc(len); ++#endif ++ ++ str[0] = '['; ++ char *p = str + 1; ++ for (size_t u = 0; u < dim; u++) ++ { ++ if (u) ++ *p++ = ','; ++ len = strlen(buf[u]); ++ memcpy(p,buf[u],len); ++ p += len; ++ } ++ *p++ = ']'; ++ *p = 0; ++#ifdef IN_GCC ++ mem_free(buf); ++#else ++ mem.free(buf); ++#endif ++ return str; ++ } ++ ++ void reserve(size_t nentries) ++ { ++ //printf("Array::reserve: dim = %d, allocdim = %d, nentries = %d\n", (int)dim, (int)allocdim, (int)nentries); ++ if (allocdim - dim < nentries) ++ { ++ if (allocdim == 0) ++ { // Not properly initialized, someone memset it to zero ++ if (nentries <= SMALLARRAYCAP) ++ { allocdim = SMALLARRAYCAP; ++ data = SMALLARRAYCAP ? &smallarray[0] : NULL; ++ } ++ else ++ { allocdim = nentries; ++#ifdef IN_GCC ++ data = (TYPE **)mem_malloc(allocdim * sizeof(*data)); ++#else ++ data = (TYPE **)mem.malloc(allocdim * sizeof(*data)); ++#endif ++ } ++ } ++ else if (allocdim == SMALLARRAYCAP) ++ { ++ allocdim = dim + nentries; ++#ifdef IN_GCC ++ data = (TYPE **)mem_malloc(allocdim * sizeof(*data)); ++#else ++ data = (TYPE **)mem.malloc(allocdim * sizeof(*data)); ++#endif ++ memcpy(data, &smallarray[0], dim * sizeof(*data)); ++ } ++ else ++ { allocdim = dim + nentries; ++#ifdef IN_GCC ++ data = (TYPE **)mem_realloc(data, allocdim * sizeof(*data)); ++#else ++ data = (TYPE **)mem.realloc(data, allocdim * sizeof(*data)); ++#endif ++ } ++ } ++ } ++ ++ void setDim(size_t newdim) ++ { ++ if (dim < newdim) ++ { ++ reserve(newdim - dim); ++ } ++ dim = newdim; ++ } ++ ++ void fixDim() ++ { ++ if (dim != allocdim) ++ { ++ if (allocdim >= SMALLARRAYCAP) ++ { ++ if (dim <= SMALLARRAYCAP) ++ { ++ memcpy(&smallarray[0], data, dim * sizeof(*data)); ++#ifdef IN_GCC ++ mem_free(data); ++#else ++ mem.free(data); ++#endif ++ } ++ else ++#ifdef IN_GCC ++ data = (TYPE **)mem_realloc(data, dim * sizeof(*data)); ++#else ++ data = (TYPE **)mem.realloc(data, dim * sizeof(*data)); ++#endif ++ } ++ allocdim = dim; ++ } ++ } ++ ++ TYPE *pop() ++ { ++ return data[--dim]; ++ } ++ ++ void shift(TYPE *ptr) ++ { ++ reserve(1); ++ memmove(data + 1, data, dim * sizeof(*data)); ++ data[0] = ptr; ++ dim++; ++ } ++ ++ void remove(size_t i) ++ { ++ if (dim - i - 1) ++ memmove(data + i, data + i + 1, (dim - i - 1) * sizeof(data[0])); ++ dim--; ++ } ++ ++ void zero() ++ { ++ memset(data,0,dim * sizeof(data[0])); ++ } ++ ++ TYPE *tos() ++ { ++ return dim ? data[dim - 1] : NULL; ++ } ++ ++ void sort() ++ { ++ struct ArraySort ++ { ++ static int Array_sort_compare(const void *x, const void *y) ++ { ++ RootObject *ox = *(RootObject **)const_cast(x); ++ RootObject *oy = *(RootObject **)const_cast(y); ++ ++ return ox->compare(oy); ++ } ++ }; ++ ++ if (dim) ++ { ++ qsort(data, dim, sizeof(RootObject *), &ArraySort::Array_sort_compare); ++ } ++ } ++ ++ TYPE **tdata() ++ { ++ return data; ++ } ++ ++ TYPE*& operator[] (size_t index) ++ { ++#ifdef DEBUG ++ assert(index < dim); ++#endif ++ return data[index]; ++ } ++ ++ void insert(size_t index, TYPE *v) ++ { ++ reserve(1); ++ memmove(data + index + 1, data + index, (dim - index) * sizeof(*data)); ++ data[index] = v; ++ dim++; ++ } ++ ++ void insert(size_t index, Array *a) ++ { ++ if (a) ++ { ++ size_t d = a->dim; ++ reserve(d); ++ if (dim != index) ++ memmove(data + index + d, data + index, (dim - index) * sizeof(*data)); ++ memcpy(data + index, a->data, d * sizeof(*data)); ++ dim += d; ++ } ++ } ++ ++ void append(Array *a) ++ { ++ insert(dim, a); ++ } ++ ++ void push(TYPE *a) ++ { ++ reserve(1); ++ data[dim++] = a; ++ } ++ ++ Array *copy() ++ { ++ Array *a = new Array(); ++ ++ a->setDim(dim); ++ memcpy(a->data, data, dim * sizeof(*data)); ++ return a; ++ } ++ ++ typedef int (*Array_apply_ft_t)(TYPE *, void *); ++ int apply(Array_apply_ft_t fp, void *param) ++ { ++ for (size_t i = 0; i < dim; i++) ++ { TYPE *e = (*this)[i]; ++ ++ if (e) ++ { ++ if (e->apply(fp, param)) ++ return 1; ++ } ++ } ++ return 0; ++ } ++}; ++ ++#endif +--- a/src/gcc/d/dfrontend/arrayop.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/arrayop.c 2014-04-01 16:32:51.000000000 +0100 +@@ -32,6 +32,276 @@ extern int binary(const char *p , const + + AA *arrayfuncs; + ++/************************************** ++ * Structure to contain information needed to insert an array op call ++ */ ++ ++struct ArrayOp ++{ ++ FuncDeclaration *cFunc; // Stub for optimized druntime version ++ FuncDeclaration *dFunc; // Full D version for ctfe ++}; ++ ++/************************************** ++ * Search for a druntime array op ++ */ ++int isDruntimeArrayOp(Identifier *ident) ++{ ++ /* Some of the array op functions are written as library functions, ++ * presumably to optimize them with special CPU vector instructions. ++ * List those library functions here, in alpha order. ++ */ ++ static const char *libArrayopFuncs[] = ++ { ++ "_arrayExpSliceAddass_a", ++ "_arrayExpSliceAddass_d", // T[]+=T ++ "_arrayExpSliceAddass_f", // T[]+=T ++ "_arrayExpSliceAddass_g", ++ "_arrayExpSliceAddass_h", ++ "_arrayExpSliceAddass_i", ++ "_arrayExpSliceAddass_k", ++ "_arrayExpSliceAddass_s", ++ "_arrayExpSliceAddass_t", ++ "_arrayExpSliceAddass_u", ++ "_arrayExpSliceAddass_w", ++ ++ "_arrayExpSliceDivass_d", // T[]/=T ++ "_arrayExpSliceDivass_f", // T[]/=T ++ ++ "_arrayExpSliceMinSliceAssign_a", ++ "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[] ++ "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[] ++ "_arrayExpSliceMinSliceAssign_g", ++ "_arrayExpSliceMinSliceAssign_h", ++ "_arrayExpSliceMinSliceAssign_i", ++ "_arrayExpSliceMinSliceAssign_k", ++ "_arrayExpSliceMinSliceAssign_s", ++ "_arrayExpSliceMinSliceAssign_t", ++ "_arrayExpSliceMinSliceAssign_u", ++ "_arrayExpSliceMinSliceAssign_w", ++ ++ "_arrayExpSliceMinass_a", ++ "_arrayExpSliceMinass_d", // T[]-=T ++ "_arrayExpSliceMinass_f", // T[]-=T ++ "_arrayExpSliceMinass_g", ++ "_arrayExpSliceMinass_h", ++ "_arrayExpSliceMinass_i", ++ "_arrayExpSliceMinass_k", ++ "_arrayExpSliceMinass_s", ++ "_arrayExpSliceMinass_t", ++ "_arrayExpSliceMinass_u", ++ "_arrayExpSliceMinass_w", ++ ++ "_arrayExpSliceMulass_d", // T[]*=T ++ "_arrayExpSliceMulass_f", // T[]*=T ++ "_arrayExpSliceMulass_i", ++ "_arrayExpSliceMulass_k", ++ "_arrayExpSliceMulass_s", ++ "_arrayExpSliceMulass_t", ++ "_arrayExpSliceMulass_u", ++ "_arrayExpSliceMulass_w", ++ ++ "_arraySliceExpAddSliceAssign_a", ++ "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T ++ "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T ++ "_arraySliceExpAddSliceAssign_g", ++ "_arraySliceExpAddSliceAssign_h", ++ "_arraySliceExpAddSliceAssign_i", ++ "_arraySliceExpAddSliceAssign_k", ++ "_arraySliceExpAddSliceAssign_s", ++ "_arraySliceExpAddSliceAssign_t", ++ "_arraySliceExpAddSliceAssign_u", ++ "_arraySliceExpAddSliceAssign_w", ++ ++ "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T ++ "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T ++ ++ "_arraySliceExpMinSliceAssign_a", ++ "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T ++ "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T ++ "_arraySliceExpMinSliceAssign_g", ++ "_arraySliceExpMinSliceAssign_h", ++ "_arraySliceExpMinSliceAssign_i", ++ "_arraySliceExpMinSliceAssign_k", ++ "_arraySliceExpMinSliceAssign_s", ++ "_arraySliceExpMinSliceAssign_t", ++ "_arraySliceExpMinSliceAssign_u", ++ "_arraySliceExpMinSliceAssign_w", ++ ++ "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T ++ "_arraySliceExpMulSliceAddass_f", ++ "_arraySliceExpMulSliceAddass_r", ++ ++ "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T ++ "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T ++ "_arraySliceExpMulSliceAssign_i", ++ "_arraySliceExpMulSliceAssign_k", ++ "_arraySliceExpMulSliceAssign_s", ++ "_arraySliceExpMulSliceAssign_t", ++ "_arraySliceExpMulSliceAssign_u", ++ "_arraySliceExpMulSliceAssign_w", ++ ++ "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T ++ "_arraySliceExpMulSliceMinass_f", ++ "_arraySliceExpMulSliceMinass_r", ++ ++ "_arraySliceSliceAddSliceAssign_a", ++ "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[] ++ "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[] ++ "_arraySliceSliceAddSliceAssign_g", ++ "_arraySliceSliceAddSliceAssign_h", ++ "_arraySliceSliceAddSliceAssign_i", ++ "_arraySliceSliceAddSliceAssign_k", ++ "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[] ++ "_arraySliceSliceAddSliceAssign_s", ++ "_arraySliceSliceAddSliceAssign_t", ++ "_arraySliceSliceAddSliceAssign_u", ++ "_arraySliceSliceAddSliceAssign_w", ++ ++ "_arraySliceSliceAddass_a", ++ "_arraySliceSliceAddass_d", // T[]+=T[] ++ "_arraySliceSliceAddass_f", // T[]+=T[] ++ "_arraySliceSliceAddass_g", ++ "_arraySliceSliceAddass_h", ++ "_arraySliceSliceAddass_i", ++ "_arraySliceSliceAddass_k", ++ "_arraySliceSliceAddass_s", ++ "_arraySliceSliceAddass_t", ++ "_arraySliceSliceAddass_u", ++ "_arraySliceSliceAddass_w", ++ ++ "_arraySliceSliceMinSliceAssign_a", ++ "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[] ++ "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[] ++ "_arraySliceSliceMinSliceAssign_g", ++ "_arraySliceSliceMinSliceAssign_h", ++ "_arraySliceSliceMinSliceAssign_i", ++ "_arraySliceSliceMinSliceAssign_k", ++ "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[] ++ "_arraySliceSliceMinSliceAssign_s", ++ "_arraySliceSliceMinSliceAssign_t", ++ "_arraySliceSliceMinSliceAssign_u", ++ "_arraySliceSliceMinSliceAssign_w", ++ ++ "_arraySliceSliceMinass_a", ++ "_arraySliceSliceMinass_d", // T[]-=T[] ++ "_arraySliceSliceMinass_f", // T[]-=T[] ++ "_arraySliceSliceMinass_g", ++ "_arraySliceSliceMinass_h", ++ "_arraySliceSliceMinass_i", ++ "_arraySliceSliceMinass_k", ++ "_arraySliceSliceMinass_s", ++ "_arraySliceSliceMinass_t", ++ "_arraySliceSliceMinass_u", ++ "_arraySliceSliceMinass_w", ++ ++ "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[] ++ "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[] ++ "_arraySliceSliceMulSliceAssign_i", ++ "_arraySliceSliceMulSliceAssign_k", ++ "_arraySliceSliceMulSliceAssign_s", ++ "_arraySliceSliceMulSliceAssign_t", ++ "_arraySliceSliceMulSliceAssign_u", ++ "_arraySliceSliceMulSliceAssign_w", ++ ++ "_arraySliceSliceMulass_d", // T[]*=T[] ++ "_arraySliceSliceMulass_f", // T[]*=T[] ++ "_arraySliceSliceMulass_i", ++ "_arraySliceSliceMulass_k", ++ "_arraySliceSliceMulass_s", ++ "_arraySliceSliceMulass_t", ++ "_arraySliceSliceMulass_u", ++ "_arraySliceSliceMulass_w", ++ }; ++ char *name = ident->toChars(); ++ int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *)); ++ if (i != -1) ++ return 1; ++ ++#ifdef DEBUG // Make sure our array is alphabetized ++ for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++) ++ { ++ if (strcmp(name, libArrayopFuncs[i]) == 0) ++ assert(0); ++ } ++#endif ++ return 0; ++} ++ ++ArrayOp *buildArrayOp(Identifier *ident, BinExp *exp, Scope *sc, Loc loc) ++{ ++ Parameters *fparams = new Parameters(); ++ Expression *loopbody = exp->buildArrayLoop(fparams); ++ ++ ArrayOp *op = new ArrayOp; ++ if (isDruntimeArrayOp(ident)) ++ op->cFunc = FuncDeclaration::genCfunc(fparams, exp->type, ident); ++ else ++ op->cFunc = NULL; ++ ++ /* Construct the function body: ++ * foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++) ++ * loopbody; ++ * return p; ++ */ ++ ++ Parameter *p = (*fparams)[0 /*fparams->dim - 1*/]; ++#if DMDV1 ++ // for (size_t i = 0; i < p.length; i++) ++ Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t)); ++ Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init); ++ Statement *s1 = new ForStatement(0, ++ new ExpStatement(0, d), ++ new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))), ++ new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)), ++ new ExpStatement(0, loopbody)); ++#else ++ // foreach (i; 0 .. p.length) ++ Statement *s1 = new ForeachRangeStatement(Loc(), TOKforeach, ++ new Parameter(0, NULL, Id::p, NULL), ++ new IntegerExp(Loc(), 0, Type::tsize_t), ++ new ArrayLengthExp(Loc(), new IdentifierExp(Loc(), p->ident)), ++ new ExpStatement(Loc(), loopbody)); ++#endif ++ //printf("%s\n", s1->toChars()); ++ Statement *s2 = new ReturnStatement(Loc(), new IdentifierExp(Loc(), p->ident)); ++ //printf("s2: %s\n", s2->toChars()); ++ Statement *fbody = new CompoundStatement(Loc(), s1, s2); ++ ++ // Built-in array ops should be @trusted, pure and nothrow ++ StorageClass stc = STCtrusted | STCpure | STCnothrow; ++ ++ /* Construct the function ++ */ ++ TypeFunction *ftype = new TypeFunction(fparams, exp->type, 0, LINKc, stc); ++ //printf("ftype: %s\n", ftype->toChars()); ++ FuncDeclaration *fd = new FuncDeclaration(Loc(), Loc(), ident, STCundefined, ftype); ++ fd->fbody = fbody; ++ fd->protection = PROTpublic; ++ fd->linkage = LINKc; ++ fd->isArrayOp = 1; ++ ++ if (!op->cFunc) ++ sc->module->importedFrom->members->push(fd); ++ ++ sc = sc->push(); ++ sc->parent = sc->module->importedFrom; ++ sc->stc = 0; ++ sc->linkage = LINKc; ++ fd->semantic(sc); ++ fd->semantic2(sc); ++ fd->semantic3(sc); ++ sc->pop(); ++ ++ if (op->cFunc) ++ { ++ op->cFunc->dArrayOp = fd; ++ op->cFunc->type = fd->type; ++ } ++ op->dFunc = fd; ++ return op; ++} ++ + /********************************************** + * Check that there are no uses of arrays without []. + */ +@@ -39,6 +309,13 @@ bool isArrayOpValid(Expression *e) + { + if (e->op == TOKslice) + return true; ++ if (e->op == TOKarrayliteral) ++ { ++ Type *t = e->type->toBasetype(); ++ while (t->ty == Tarray || t->ty == Tsarray) ++ t = t->nextOf()->toBasetype(); ++ return (t->ty != Tvoid); ++ } + Type *tb = e->type->toBasetype(); + + if ( (tb->ty == Tarray) || (tb->ty == Tsarray) ) +@@ -127,268 +404,19 @@ Expression *BinExp::arrayOp(Scope *sc) + char *name = buf.toChars(); + Identifier *ident = Lexer::idPool(name); + +- /* Look up name in hash table +- */ +- FuncDeclaration **pfd = (FuncDeclaration **)_aaGet(&arrayfuncs, ident); +- FuncDeclaration *fd = (FuncDeclaration *)*pfd; +- if (!fd) +- { +- /* Some of the array op functions are written as library functions, +- * presumably to optimize them with special CPU vector instructions. +- * List those library functions here, in alpha order. +- */ +- static const char *libArrayopFuncs[] = +- { +- "_arrayExpSliceAddass_a", +- "_arrayExpSliceAddass_d", // T[]+=T +- "_arrayExpSliceAddass_f", // T[]+=T +- "_arrayExpSliceAddass_g", +- "_arrayExpSliceAddass_h", +- "_arrayExpSliceAddass_i", +- "_arrayExpSliceAddass_k", +- "_arrayExpSliceAddass_s", +- "_arrayExpSliceAddass_t", +- "_arrayExpSliceAddass_u", +- "_arrayExpSliceAddass_w", +- +- "_arrayExpSliceDivass_d", // T[]/=T +- "_arrayExpSliceDivass_f", // T[]/=T +- +- "_arrayExpSliceMinSliceAssign_a", +- "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[] +- "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[] +- "_arrayExpSliceMinSliceAssign_g", +- "_arrayExpSliceMinSliceAssign_h", +- "_arrayExpSliceMinSliceAssign_i", +- "_arrayExpSliceMinSliceAssign_k", +- "_arrayExpSliceMinSliceAssign_s", +- "_arrayExpSliceMinSliceAssign_t", +- "_arrayExpSliceMinSliceAssign_u", +- "_arrayExpSliceMinSliceAssign_w", +- +- "_arrayExpSliceMinass_a", +- "_arrayExpSliceMinass_d", // T[]-=T +- "_arrayExpSliceMinass_f", // T[]-=T +- "_arrayExpSliceMinass_g", +- "_arrayExpSliceMinass_h", +- "_arrayExpSliceMinass_i", +- "_arrayExpSliceMinass_k", +- "_arrayExpSliceMinass_s", +- "_arrayExpSliceMinass_t", +- "_arrayExpSliceMinass_u", +- "_arrayExpSliceMinass_w", +- +- "_arrayExpSliceMulass_d", // T[]*=T +- "_arrayExpSliceMulass_f", // T[]*=T +- "_arrayExpSliceMulass_i", +- "_arrayExpSliceMulass_k", +- "_arrayExpSliceMulass_s", +- "_arrayExpSliceMulass_t", +- "_arrayExpSliceMulass_u", +- "_arrayExpSliceMulass_w", +- +- "_arraySliceExpAddSliceAssign_a", +- "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T +- "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T +- "_arraySliceExpAddSliceAssign_g", +- "_arraySliceExpAddSliceAssign_h", +- "_arraySliceExpAddSliceAssign_i", +- "_arraySliceExpAddSliceAssign_k", +- "_arraySliceExpAddSliceAssign_s", +- "_arraySliceExpAddSliceAssign_t", +- "_arraySliceExpAddSliceAssign_u", +- "_arraySliceExpAddSliceAssign_w", +- +- "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T +- "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T +- +- "_arraySliceExpMinSliceAssign_a", +- "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T +- "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T +- "_arraySliceExpMinSliceAssign_g", +- "_arraySliceExpMinSliceAssign_h", +- "_arraySliceExpMinSliceAssign_i", +- "_arraySliceExpMinSliceAssign_k", +- "_arraySliceExpMinSliceAssign_s", +- "_arraySliceExpMinSliceAssign_t", +- "_arraySliceExpMinSliceAssign_u", +- "_arraySliceExpMinSliceAssign_w", +- +- "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T +- "_arraySliceExpMulSliceAddass_f", +- "_arraySliceExpMulSliceAddass_r", +- +- "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T +- "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T +- "_arraySliceExpMulSliceAssign_i", +- "_arraySliceExpMulSliceAssign_k", +- "_arraySliceExpMulSliceAssign_s", +- "_arraySliceExpMulSliceAssign_t", +- "_arraySliceExpMulSliceAssign_u", +- "_arraySliceExpMulSliceAssign_w", +- +- "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T +- "_arraySliceExpMulSliceMinass_f", +- "_arraySliceExpMulSliceMinass_r", +- +- "_arraySliceSliceAddSliceAssign_a", +- "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[] +- "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[] +- "_arraySliceSliceAddSliceAssign_g", +- "_arraySliceSliceAddSliceAssign_h", +- "_arraySliceSliceAddSliceAssign_i", +- "_arraySliceSliceAddSliceAssign_k", +- "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[] +- "_arraySliceSliceAddSliceAssign_s", +- "_arraySliceSliceAddSliceAssign_t", +- "_arraySliceSliceAddSliceAssign_u", +- "_arraySliceSliceAddSliceAssign_w", +- +- "_arraySliceSliceAddass_a", +- "_arraySliceSliceAddass_d", // T[]+=T[] +- "_arraySliceSliceAddass_f", // T[]+=T[] +- "_arraySliceSliceAddass_g", +- "_arraySliceSliceAddass_h", +- "_arraySliceSliceAddass_i", +- "_arraySliceSliceAddass_k", +- "_arraySliceSliceAddass_s", +- "_arraySliceSliceAddass_t", +- "_arraySliceSliceAddass_u", +- "_arraySliceSliceAddass_w", +- +- "_arraySliceSliceMinSliceAssign_a", +- "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[] +- "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[] +- "_arraySliceSliceMinSliceAssign_g", +- "_arraySliceSliceMinSliceAssign_h", +- "_arraySliceSliceMinSliceAssign_i", +- "_arraySliceSliceMinSliceAssign_k", +- "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[] +- "_arraySliceSliceMinSliceAssign_s", +- "_arraySliceSliceMinSliceAssign_t", +- "_arraySliceSliceMinSliceAssign_u", +- "_arraySliceSliceMinSliceAssign_w", +- +- "_arraySliceSliceMinass_a", +- "_arraySliceSliceMinass_d", // T[]-=T[] +- "_arraySliceSliceMinass_f", // T[]-=T[] +- "_arraySliceSliceMinass_g", +- "_arraySliceSliceMinass_h", +- "_arraySliceSliceMinass_i", +- "_arraySliceSliceMinass_k", +- "_arraySliceSliceMinass_s", +- "_arraySliceSliceMinass_t", +- "_arraySliceSliceMinass_u", +- "_arraySliceSliceMinass_w", +- +- "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[] +- "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[] +- "_arraySliceSliceMulSliceAssign_i", +- "_arraySliceSliceMulSliceAssign_k", +- "_arraySliceSliceMulSliceAssign_s", +- "_arraySliceSliceMulSliceAssign_t", +- "_arraySliceSliceMulSliceAssign_u", +- "_arraySliceSliceMulSliceAssign_w", +- +- "_arraySliceSliceMulass_d", // T[]*=T[] +- "_arraySliceSliceMulass_f", // T[]*=T[] +- "_arraySliceSliceMulass_i", +- "_arraySliceSliceMulass_k", +- "_arraySliceSliceMulass_s", +- "_arraySliceSliceMulass_t", +- "_arraySliceSliceMulass_u", +- "_arraySliceSliceMulass_w", +- }; ++ ArrayOp **pOp = (ArrayOp **)_aaGet(&arrayfuncs, ident); ++ ArrayOp *op = *pOp; + +- int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *)); +- if (i == -1) +- { +-#ifdef DEBUG // Make sure our array is alphabetized +- for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++) +- { +- if (strcmp(name, libArrayopFuncs[i]) == 0) +- assert(0); +- } +-#endif +- /* Not in library, so generate it. +- * Construct the function body: +- * foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++) +- * loopbody; +- * return p; +- */ +- +- Parameters *fparams = new Parameters(); +- Expression *loopbody = buildArrayLoop(fparams); +- Parameter *p = (*fparams)[0 /*fparams->dim - 1*/]; +-#if DMDV1 +- // for (size_t i = 0; i < p.length; i++) +- Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t)); +- Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init); +- Statement *s1 = new ForStatement(0, +- new ExpStatement(0, d), +- new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))), +- new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)), +- new ExpStatement(0, loopbody)); +-#else +- // foreach (i; 0 .. p.length) +- Statement *s1 = new ForeachRangeStatement(0, TOKforeach, +- new Parameter(0, NULL, Id::p, NULL), +- new IntegerExp(0, 0, Type::tsize_t), +- new ArrayLengthExp(0, new IdentifierExp(0, p->ident)), +- new ExpStatement(0, loopbody)); +-#endif +- Statement *s2 = new ReturnStatement(0, new IdentifierExp(0, p->ident)); +- //printf("s2: %s\n", s2->toChars()); +- Statement *fbody = new CompoundStatement(0, s1, s2); +- +- /* Construct the function +- */ +- TypeFunction *ftype = new TypeFunction(fparams, type, 0, LINKc); +- //printf("ftype: %s\n", ftype->toChars()); +- fd = new FuncDeclaration(loc, 0, ident, STCundefined, ftype); +- fd->fbody = fbody; +- fd->protection = PROTpublic; +- fd->linkage = LINKc; +- fd->isArrayOp = 1; +- +- sc->module->importedFrom->members->push(fd); +- +- sc = sc->push(); +- sc->parent = sc->module->importedFrom; +- sc->stc = 0; +- sc->linkage = LINKc; +- fd->semantic(sc); +- fd->semantic2(sc); +- fd->semantic3(sc); +- sc->pop(); +- } +- else +- { /* In library, refer to it. +- */ +- fd = FuncDeclaration::genCfunc(type, ident); +-#ifdef IN_GCC +- /* Setup function parameters for GCC backend +- */ +- TypeFunction * tf = (TypeFunction *) fd->type; +- Parameters * targs = new Parameters; +- targs->setDim(arguments->dim); +- for (unsigned i = 0; i < arguments->dim; i++) +- { +- targs->tdata()[i] = new Parameter(STCin, +- ((*arguments)[i])->type, NULL, NULL); +- } +- tf->parameters = targs; +-#endif +- } +- *pfd = fd; // cache symbol in hash table +- } ++ if (!op) ++ op = buildArrayOp(ident, this, sc, loc); + +- /* Call the function fd(arguments) +- */ +- Expression *ec = new VarExp(0, fd); ++ *pOp = op; ++ ++ FuncDeclaration *fd = op->cFunc ? op->cFunc : op->dFunc; ++ Expression *ec = new VarExp(loc, fd); + Expression *e = new CallExp(loc, ec, arguments); +- e->type = type; +- return e; ++ ++ return e->semantic(sc); + } + + Expression *BinAssignExp::arrayOp(Scope *sc) +@@ -430,6 +458,12 @@ void CastExp::buildArrayIdent(OutBuffer + Expression::buildArrayIdent(buf, arguments); + } + ++void ArrayLiteralExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) ++{ ++ buf->writestring("Slice"); ++ arguments->shift(this); ++} ++ + void SliceExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) + { + buf->writestring("Slice"); +@@ -445,30 +479,30 @@ void AssignExp::buildArrayIdent(OutBuffe + buf->writestring("Assign"); + } + +-#define X(Str) \ +-void Str##AssignExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) \ +-{ \ +- /* Evaluate assign expressions right to left \ +- */ \ +- e2->buildArrayIdent(buf, arguments); \ +- e1->buildArrayIdent(buf, arguments); \ +- buf->writestring(#Str); \ +- buf->writestring("ass"); \ +-} +- +-X(Add) +-X(Min) +-X(Mul) +-X(Div) +-X(Mod) +-X(Xor) +-X(And) +-X(Or) ++void BinAssignExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) ++{ ++ /* Evaluate assign expressions right to left ++ */ ++ e2->buildArrayIdent(buf, arguments); ++ e1->buildArrayIdent(buf, arguments); ++ const char *s; ++ switch(op) ++ { ++ case TOKaddass: s = "Addass"; break; ++ case TOKminass: s = "Subass"; break; ++ case TOKmulass: s = "Mulass"; break; ++ case TOKdivass: s = "Divass"; break; ++ case TOKmodass: s = "Modass"; break; ++ case TOKxorass: s = "Xorass"; break; ++ case TOKandass: s = "Andass"; break; ++ case TOKorass: s = "Orass"; break; + #if DMDV2 +-X(Pow) ++ case TOKpowass: s = "Powass"; break; + #endif +- +-#undef X ++ default: assert(0); ++ } ++ buf->writestring(s); ++} + + void NegExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) + { +@@ -482,29 +516,35 @@ void ComExp::buildArrayIdent(OutBuffer * + buf->writestring("Com"); + } + +-#define X(Str) \ +-void Str##Exp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) \ +-{ \ +- /* Evaluate assign expressions left to right \ +- */ \ +- e1->buildArrayIdent(buf, arguments); \ +- e2->buildArrayIdent(buf, arguments); \ +- buf->writestring(#Str); \ +-} +- +-X(Add) +-X(Min) +-X(Mul) +-X(Div) +-X(Mod) +-X(Xor) +-X(And) +-X(Or) ++void BinExp::buildArrayIdent(OutBuffer *buf, Expressions *arguments) ++{ ++ /* Evaluate assign expressions left to right ++ */ ++ const char *s = NULL; ++ switch(op) ++ { ++ case TOKadd: s = "Add"; break; ++ case TOKmin: s = "Sub"; break; ++ case TOKmul: s = "Mul"; break; ++ case TOKdiv: s = "Div"; break; ++ case TOKmod: s = "Mod"; break; ++ case TOKxor: s = "Xor"; break; ++ case TOKand: s = "And"; break; ++ case TOKor: s = "Or"; break; + #if DMDV2 +-X(Pow) ++ case TOKpow: s = "Pow"; break; + #endif +- +-#undef X ++ default: break; ++ } ++ if (s) ++ { ++ e1->buildArrayIdent(buf, arguments); ++ e2->buildArrayIdent(buf, arguments); ++ buf->writestring(s); ++ } ++ else ++ Expression::buildArrayIdent(buf, arguments); ++} + + /****************************************** + * Construct the inner loop for the array operation function, +@@ -516,7 +556,7 @@ Expression *Expression::buildArrayLoop(P + Identifier *id = Identifier::generateId("c", fparams->dim); + Parameter *param = new Parameter(0, type, id, NULL); + fparams->shift(param); +- Expression *e = new IdentifierExp(0, id); ++ Expression *e = new IdentifierExp(Loc(), id); + return e; + } + +@@ -531,16 +571,29 @@ Expression *CastExp::buildArrayLoop(Para + return Expression::buildArrayLoop(fparams); + } + ++Expression *ArrayLiteralExp::buildArrayLoop(Parameters *fparams) ++{ ++ Identifier *id = Identifier::generateId("p", fparams->dim); ++ Parameter *param = new Parameter(STCconst, type, id, NULL); ++ fparams->shift(param); ++ Expression *e = new IdentifierExp(Loc(), id); ++ Expressions *arguments = new Expressions(); ++ Expression *index = new IdentifierExp(Loc(), Id::p); ++ arguments->push(index); ++ e = new ArrayExp(Loc(), e, arguments); ++ return e; ++} ++ + Expression *SliceExp::buildArrayLoop(Parameters *fparams) + { + Identifier *id = Identifier::generateId("p", fparams->dim); + Parameter *param = new Parameter(STCconst, type, id, NULL); + fparams->shift(param); +- Expression *e = new IdentifierExp(0, id); ++ Expression *e = new IdentifierExp(Loc(), id); + Expressions *arguments = new Expressions(); +- Expression *index = new IdentifierExp(0, Id::p); ++ Expression *index = new IdentifierExp(Loc(), Id::p); + arguments->push(index); +- e = new ArrayExp(0, e, arguments); ++ e = new ArrayExp(Loc(), e, arguments); + return e; + } + +@@ -555,81 +608,85 @@ Expression *AssignExp::buildArrayLoop(Pa + * where b is a byte fails because (c + p[i]) is an int + * which cannot be implicitly cast to byte. + */ +- ex2 = new CastExp(0, ex2, e1->type->nextOf()); ++ ex2 = new CastExp(Loc(), ex2, e1->type->nextOf()); + #endif + Expression *ex1 = e1->buildArrayLoop(fparams); + Parameter *param = (*fparams)[0]; + param->storageClass = 0; +- Expression *e = new AssignExp(0, ex1, ex2); ++ Expression *e = new AssignExp(Loc(), ex1, ex2); + return e; + } + +-#define X(Str) \ +-Expression *Str##AssignExp::buildArrayLoop(Parameters *fparams) \ +-{ \ +- /* Evaluate assign expressions right to left \ +- */ \ +- Expression *ex2 = e2->buildArrayLoop(fparams); \ +- Expression *ex1 = e1->buildArrayLoop(fparams); \ +- Parameter *param = (*fparams)[0]; \ +- param->storageClass = 0; \ +- Expression *e = new Str##AssignExp(loc, ex1, ex2); \ +- return e; \ +-} +- +-X(Add) +-X(Min) +-X(Mul) +-X(Div) +-X(Mod) +-X(Xor) +-X(And) +-X(Or) ++Expression *BinAssignExp::buildArrayLoop(Parameters *fparams) ++{ ++ /* Evaluate assign expressions right to left ++ */ ++ Expression *ex2 = e2->buildArrayLoop(fparams); ++ Expression *ex1 = e1->buildArrayLoop(fparams); ++ Parameter *param = (*fparams)[0]; ++ param->storageClass = 0; ++ Expression *e; ++ switch(op) ++ { ++ case TOKaddass: return new AddAssignExp(loc, ex1, ex2); ++ case TOKminass: return new MinAssignExp(loc, ex1, ex2); ++ case TOKmulass: return new MulAssignExp(loc, ex1, ex2); ++ case TOKdivass: return new DivAssignExp(loc, ex1, ex2); ++ case TOKmodass: return new ModAssignExp(loc, ex1, ex2); ++ case TOKxorass: return new XorAssignExp(loc, ex1, ex2); ++ case TOKandass: return new AndAssignExp(loc, ex1, ex2); ++ case TOKorass: return new OrAssignExp(loc, ex1, ex2); + #if DMDV2 +-X(Pow) ++ case TOKpowass: return new PowAssignExp(loc, ex1, ex2); + #endif +- +-#undef X ++ default: ++ assert(0); ++ return NULL; ++ } ++} + + Expression *NegExp::buildArrayLoop(Parameters *fparams) + { + Expression *ex1 = e1->buildArrayLoop(fparams); +- Expression *e = new NegExp(0, ex1); ++ Expression *e = new NegExp(Loc(), ex1); + return e; + } + + Expression *ComExp::buildArrayLoop(Parameters *fparams) + { + Expression *ex1 = e1->buildArrayLoop(fparams); +- Expression *e = new ComExp(0, ex1); ++ Expression *e = new ComExp(Loc(), ex1); + return e; + } + +-#define X(Str) \ +-Expression *Str##Exp::buildArrayLoop(Parameters *fparams) \ +-{ \ +- /* Evaluate assign expressions left to right \ +- */ \ +- Expression *ex1 = e1->buildArrayLoop(fparams); \ +- Expression *ex2 = e2->buildArrayLoop(fparams); \ +- Expression *e = new Str##Exp(0, ex1, ex2); \ +- return e; \ +-} +- +-X(Add) +-X(Min) +-X(Mul) +-X(Div) +-X(Mod) +-X(Xor) +-X(And) +-X(Or) ++Expression *BinExp::buildArrayLoop(Parameters *fparams) ++{ ++ switch(op) ++ { ++ case TOKadd: ++ case TOKmin: ++ case TOKmul: ++ case TOKdiv: ++ case TOKmod: ++ case TOKxor: ++ case TOKand: ++ case TOKor: + #if DMDV2 +-X(Pow) ++ case TOKpow: + #endif +- +-#undef X +- ++ { ++ /* Evaluate assign expressions left to right ++ */ ++ BinExp *e = (BinExp *)copy(); ++ e->e1 = e->e1->buildArrayLoop(fparams); ++ e->e2 = e->e2->buildArrayLoop(fparams); ++ e->type = NULL; ++ return e; ++ } ++ default: ++ return Expression::buildArrayLoop(fparams); ++ } ++} + + /*********************************************** + * Test if operand is a valid array op operand. +@@ -640,6 +697,13 @@ int Expression::isArrayOperand() + //printf("Expression::isArrayOperand() %s\n", toChars()); + if (op == TOKslice) + return 1; ++ if (op == TOKarrayliteral) ++ { ++ Type *t = type->toBasetype(); ++ while (t->ty == Tarray || t->ty == Tsarray) ++ t = t->nextOf()->toBasetype(); ++ return (t->ty != Tvoid); ++ } + if (type->toBasetype()->ty == Tarray) + { + switch (op) +--- a/src/gcc/d/dfrontend/arraytypes.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/arraytypes.h 2014-04-01 16:32:51.000000000 +0100 +@@ -18,66 +18,71 @@ + + #include "root.h" + +-typedef ArrayBase TemplateParameters; ++typedef Array TemplateParameters; + +-typedef ArrayBase Expressions; ++typedef Array Expressions; + +-typedef ArrayBase Statements; ++typedef Array Statements; + +-typedef ArrayBase BaseClasses; ++typedef Array BaseClasses; + +-typedef ArrayBase ClassDeclarations; ++typedef Array ClassDeclarations; + +-typedef ArrayBase Dsymbols; ++typedef Array Dsymbols; + +-typedef ArrayBase Objects; ++typedef Array Objects; + +-typedef ArrayBase FuncDeclarations; ++typedef Array FuncDeclarations; + +-typedef ArrayBase Parameters; ++typedef Array Parameters; + +-typedef ArrayBase Identifiers; ++typedef Array Identifiers; + +-typedef ArrayBase Initializers; ++typedef Array Initializers; + +-typedef ArrayBase VarDeclarations; ++typedef Array VarDeclarations; + +-typedef ArrayBase Types; ++typedef Array Types; + +-typedef ArrayBase ScopeDsymbols; ++typedef Array ScopeDsymbols; + +-typedef ArrayBase Catches; ++typedef Array Catches; + +-typedef ArrayBase StaticDtorDeclarations; ++typedef Array StaticDtorDeclarations; + +-typedef ArrayBase SharedStaticDtorDeclarations; ++typedef Array SharedStaticDtorDeclarations; + +-typedef ArrayBase AliasDeclarations; ++typedef Array AliasDeclarations; + +-typedef ArrayBase Modules; ++typedef Array Modules; + +-typedef ArrayBase Files; ++typedef Array Files; + +-typedef ArrayBase CaseStatements; ++typedef Array CaseStatements; + +-typedef ArrayBase CompoundStatements; ++typedef Array CompoundStatements; + +-typedef ArrayBase GotoCaseStatements; ++typedef Array GotoCaseStatements; + +-typedef ArrayBase ReturnStatements; ++typedef Array ReturnStatements; + +-typedef ArrayBase TemplateInstances; ++typedef Array TemplateInstances; + +-//typedef ArrayBase Strings; ++//typedef Array Strings; + +-typedef ArrayBase Voids; ++typedef Array Voids; + + #ifdef IN_GCC +-typedef ArrayBase Blocks; ++typedef Array Blocks; + #else +-typedef ArrayBase Blocks; ++typedef Array Blocks; + #endif + +-typedef ArrayBase Symbols; ++typedef Array Symbols; + ++#ifdef IN_GCC ++typedef Array Dts; ++#else ++typedef Array Dts; ++#endif + #endif +--- a/src/gcc/d/dfrontend/artistic.txt 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/artistic.txt 2014-04-01 16:32:51.000000000 +0100 +@@ -1,117 +1,117 @@ +- +- +- +- +- The "Artistic License" +- +- Preamble +- +-The intent of this document is to state the conditions under which a +-Package may be copied, such that the Copyright Holder maintains some +-semblance of artistic control over the development of the package, +-while giving the users of the package the right to use and distribute +-the Package in a more-or-less customary fashion, plus the right to make +-reasonable modifications. +- +-Definitions: +- +- "Package" refers to the collection of files distributed by the +- Copyright Holder, and derivatives of that collection of files +- created through textual modification. +- +- "Standard Version" refers to such a Package if it has not been +- modified, or has been modified in accordance with the wishes +- of the Copyright Holder as specified below. +- +- "Copyright Holder" is whoever is named in the copyright or +- copyrights for the package. +- +- "You" is you, if you're thinking about copying or distributing +- this Package. +- +- "Reasonable copying fee" is whatever you can justify on the +- basis of media cost, duplication charges, time of people involved, +- and so on. (You will not be required to justify it to the +- Copyright Holder, but only to the computing community at large +- as a market that must bear the fee.) +- +- "Freely Available" means that no fee is charged for the item +- itself, though there may be fees involved in handling the item. +- It also means that recipients of the item may redistribute it +- under the same conditions they received it. +- +-1. You may make and give away verbatim copies of the source form of the +-Standard Version of this Package without restriction, provided that you +-duplicate all of the original copyright notices and associated disclaimers. +- +-2. You may apply bug fixes, portability fixes and other modifications +-derived from the Public Domain or from the Copyright Holder. A Package +-modified in such a way shall still be considered the Standard Version. +- +-3. You may otherwise modify your copy of this Package in any way, provided +-that you insert a prominent notice in each changed file stating how and +-when you changed that file, and provided that you do at least ONE of the +-following: +- +- a) place your modifications in the Public Domain or otherwise make them +- Freely Available, such as by posting said modifications to Usenet or +- an equivalent medium, or placing the modifications on a major archive +- site such as uunet.uu.net, or by allowing the Copyright Holder to include +- your modifications in the Standard Version of the Package. +- +- b) use the modified Package only within your corporation or organization. +- +- c) rename any non-standard executables so the names do not conflict +- with standard executables, which must also be provided, and provide +- a separate manual page for each non-standard executable that clearly +- documents how it differs from the Standard Version. +- +- d) make other distribution arrangements with the Copyright Holder. +- +-4. You may distribute the programs of this Package in object code or +-executable form, provided that you do at least ONE of the following: +- +- a) distribute a Standard Version of the executables and library files, +- together with instructions (in the manual page or equivalent) on where +- to get the Standard Version. +- +- b) accompany the distribution with the machine-readable source of +- the Package with your modifications. +- +- c) give non-standard executables non-standard names, and clearly +- document the differences in manual pages (or equivalent), together +- with instructions on where to get the Standard Version. +- +- d) make other distribution arrangements with the Copyright Holder. +- +-5. You may charge a reasonable copying fee for any distribution of this +-Package. You may charge any fee you choose for support of this +-Package. You may not charge a fee for this Package itself. However, +-you may distribute this Package in aggregate with other (possibly +-commercial) programs as part of a larger (possibly commercial) software +-distribution provided that you do not advertise this Package as a +-product of your own. You may embed this Package's interpreter within +-an executable of yours (by linking); this shall be construed as a mere +-form of aggregation, provided that the complete Standard Version of the +-interpreter is so embedded. +- +-6. The source code and object code supplied as input to or produced as +-output from the programs of this Package do not automatically fall +-under the copyright of this Package, but belong to whoever generated +-them, and may be sold commercially, and may be aggregated with this +-Package. +- +-7. Aggregation of this Package with a commercial distribution is always +-permitted provided that the use of this Package is embedded; that is, +-when no overt attempt is made to make this Package's interfaces visible +-to the end user of the commercial distribution. Such use shall not be +-construed as a distribution of this Package. +- +-8. The name of the Copyright Holder may not be used to endorse or promote +-products derived from this software without specific prior written permission. +- +-9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +-IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +-WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +- +- The End ++ ++ ++ ++ ++ The "Artistic License" ++ ++ Preamble ++ ++The intent of this document is to state the conditions under which a ++Package may be copied, such that the Copyright Holder maintains some ++semblance of artistic control over the development of the package, ++while giving the users of the package the right to use and distribute ++the Package in a more-or-less customary fashion, plus the right to make ++reasonable modifications. ++ ++Definitions: ++ ++ "Package" refers to the collection of files distributed by the ++ Copyright Holder, and derivatives of that collection of files ++ created through textual modification. ++ ++ "Standard Version" refers to such a Package if it has not been ++ modified, or has been modified in accordance with the wishes ++ of the Copyright Holder as specified below. ++ ++ "Copyright Holder" is whoever is named in the copyright or ++ copyrights for the package. ++ ++ "You" is you, if you're thinking about copying or distributing ++ this Package. ++ ++ "Reasonable copying fee" is whatever you can justify on the ++ basis of media cost, duplication charges, time of people involved, ++ and so on. (You will not be required to justify it to the ++ Copyright Holder, but only to the computing community at large ++ as a market that must bear the fee.) ++ ++ "Freely Available" means that no fee is charged for the item ++ itself, though there may be fees involved in handling the item. ++ It also means that recipients of the item may redistribute it ++ under the same conditions they received it. ++ ++1. You may make and give away verbatim copies of the source form of the ++Standard Version of this Package without restriction, provided that you ++duplicate all of the original copyright notices and associated disclaimers. ++ ++2. You may apply bug fixes, portability fixes and other modifications ++derived from the Public Domain or from the Copyright Holder. A Package ++modified in such a way shall still be considered the Standard Version. ++ ++3. You may otherwise modify your copy of this Package in any way, provided ++that you insert a prominent notice in each changed file stating how and ++when you changed that file, and provided that you do at least ONE of the ++following: ++ ++ a) place your modifications in the Public Domain or otherwise make them ++ Freely Available, such as by posting said modifications to Usenet or ++ an equivalent medium, or placing the modifications on a major archive ++ site such as uunet.uu.net, or by allowing the Copyright Holder to include ++ your modifications in the Standard Version of the Package. ++ ++ b) use the modified Package only within your corporation or organization. ++ ++ c) rename any non-standard executables so the names do not conflict ++ with standard executables, which must also be provided, and provide ++ a separate manual page for each non-standard executable that clearly ++ documents how it differs from the Standard Version. ++ ++ d) make other distribution arrangements with the Copyright Holder. ++ ++4. You may distribute the programs of this Package in object code or ++executable form, provided that you do at least ONE of the following: ++ ++ a) distribute a Standard Version of the executables and library files, ++ together with instructions (in the manual page or equivalent) on where ++ to get the Standard Version. ++ ++ b) accompany the distribution with the machine-readable source of ++ the Package with your modifications. ++ ++ c) give non-standard executables non-standard names, and clearly ++ document the differences in manual pages (or equivalent), together ++ with instructions on where to get the Standard Version. ++ ++ d) make other distribution arrangements with the Copyright Holder. ++ ++5. You may charge a reasonable copying fee for any distribution of this ++Package. You may charge any fee you choose for support of this ++Package. You may not charge a fee for this Package itself. However, ++you may distribute this Package in aggregate with other (possibly ++commercial) programs as part of a larger (possibly commercial) software ++distribution provided that you do not advertise this Package as a ++product of your own. You may embed this Package's interpreter within ++an executable of yours (by linking); this shall be construed as a mere ++form of aggregation, provided that the complete Standard Version of the ++interpreter is so embedded. ++ ++6. The source code and object code supplied as input to or produced as ++output from the programs of this Package do not automatically fall ++under the copyright of this Package, but belong to whoever generated ++them, and may be sold commercially, and may be aggregated with this ++Package. ++ ++7. Aggregation of this Package with a commercial distribution is always ++permitted provided that the use of this Package is embedded; that is, ++when no overt attempt is made to make this Package's interfaces visible ++to the end user of the commercial distribution. Such use shall not be ++construed as a distribution of this Package. ++ ++8. The name of the Copyright Holder may not be used to endorse or promote ++products derived from this software without specific prior written permission. ++ ++9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR ++IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ ++ The End +--- a/src/gcc/d/dfrontend/async.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/async.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,337 +0,0 @@ +- +-// Copyright (c) 2009-2012 by Digital Mars +-// All Rights Reserved +-// written by Walter Bright +-// http://www.digitalmars.com +-// License for redistribution is by either the Artistic License +-// in artistic.txt, or the GNU General Public License in gnu.txt. +-// See the included readme.txt for details. +- +-#define _MT 1 +- +-#include +-#include +-#include +- +-#ifndef IN_GCC +- +-#if _WIN32 +- +-#include +-#include +-#include +- +-#include "root.h" +- +-static unsigned __stdcall startthread(void *p); +- +-struct FileData +-{ +- File *file; +- int result; +- HANDLE event; +-}; +- +-struct AsyncRead +-{ +- static AsyncRead *create(size_t nfiles); +- void addFile(File *file); +- void start(); +- int read(size_t i); +- static void dispose(AsyncRead *); +- +- HANDLE hThread; +- +- size_t filesdim; +- size_t filesmax; +- FileData files[1]; +-}; +- +- +-AsyncRead *AsyncRead::create(size_t nfiles) +-{ +- AsyncRead *aw = (AsyncRead *)calloc(1, sizeof(AsyncRead) + +- (nfiles - 1) * sizeof(FileData)); +- aw->filesmax = nfiles; +- return aw; +-} +- +-void AsyncRead::addFile(File *file) +-{ +- //printf("addFile(file = %p)\n", file); +- //printf("filesdim = %d, filesmax = %d\n", filesdim, filesmax); +- assert(filesdim < filesmax); +- files[filesdim].file = file; +- files[filesdim].event = CreateEvent(NULL, TRUE, FALSE, NULL); +- ResetEvent(files[filesdim].event); +- filesdim++; +-} +- +-void AsyncRead::start() +-{ +- //printf("aw->filesdim = %p %d\n", this, filesdim); +- if (filesdim) +- { +- unsigned threadaddr; +- hThread = (HANDLE) _beginthreadex(NULL, +- 0, +- &startthread, +- this, +- 0, +- (unsigned *)&threadaddr); +- +- if (hThread) +- { +- SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); +- } +- else +- { +- assert(0); +- } +- } +-} +- +-int AsyncRead::read(size_t i) +-{ +- FileData *f = &files[i]; +- WaitForSingleObject(f->event, INFINITE); +- Sleep(0); // give up time slice +- return f->result; +-} +- +-void AsyncRead::dispose(AsyncRead *aw) +-{ +- free(aw); +-} +- +- +- +-unsigned __stdcall startthread(void *p) +-{ +- AsyncRead *aw = (AsyncRead *)p; +- +- //printf("aw->filesdim = %p %d\n", aw, aw->filesdim); +- for (size_t i = 0; i < aw->filesdim; i++) +- { FileData *f = &aw->files[i]; +- +- f->result = f->file->read(); +- SetEvent(f->event); +- } +- _endthreadex(EXIT_SUCCESS); +- return EXIT_SUCCESS; // if skidding +-} +- +-#elif linux // Posix +- +-#include +-#include +-#include +- +-#include "root.h" +- +-void *startthread(void *arg); +- +-void err_abort(int status, const char *msg) +-{ +- fprintf(stderr, "fatal error = %d, %s\n", status, msg); +- exit(EXIT_FAILURE); +-} +- +-struct FileData +-{ +- File *file; +- int result; +- +- pthread_mutex_t mutex; +- pthread_cond_t cond; +- int value; +-}; +- +-struct AsyncRead +-{ +- static AsyncRead *create(size_t nfiles); +- void addFile(File *file); +- void start(); +- int read(size_t i); +- static void dispose(AsyncRead *); +- +- size_t filesdim; +- size_t filesmax; +- FileData files[1]; +-}; +- +- +-AsyncRead *AsyncRead::create(size_t nfiles) +-{ +- AsyncRead *aw = (AsyncRead *)calloc(1, sizeof(AsyncRead) + +- (nfiles - 1) * sizeof(FileData)); +- aw->filesmax = nfiles; +- return aw; +-} +- +-void AsyncRead::addFile(File *file) +-{ +- //printf("addFile(file = %p)\n", file); +- //printf("filesdim = %d, filesmax = %d\n", filesdim, filesmax); +- assert(filesdim < filesmax); +- FileData *f = &files[filesdim]; +- f->file = file; +- +- int status = pthread_mutex_init(&f->mutex, NULL); +- if (status != 0) +- err_abort(status, "init mutex"); +- status = pthread_cond_init(&f->cond, NULL); +- if (status != 0) +- err_abort(status, "init cond"); +- +- filesdim++; +-} +- +-void AsyncRead::start() +-{ +- //printf("aw->filesdim = %p %d\n", this, filesdim); +- if (filesdim) +- { +- pthread_t thread_id; +- int status = pthread_create(&thread_id, +- NULL, +- &startthread, +- this); +- if (status != 0) +- err_abort(status, "create thread"); +- } +-} +- +-int AsyncRead::read(size_t i) +-{ +- FileData *f = &files[i]; +- +- // Wait for the event +- int status = pthread_mutex_lock(&f->mutex); +- if (status != 0) +- err_abort(status, "lock mutex"); +- while (f->value == 0) +- { +- status = pthread_cond_wait(&f->cond, &f->mutex); +- if (status != 0) +- err_abort(status, "wait on condition"); +- } +- status = pthread_mutex_unlock(&f->mutex); +- if (status != 0) +- err_abort(status, "unlock mutex"); +- +- return f->result; +-} +- +-void AsyncRead::dispose(AsyncRead *aw) +-{ +- //printf("AsyncRead::dispose()\n"); +- for (int i = 0; i < aw->filesdim; i++) +- { +- FileData *f = &aw->files[i]; +- int status = pthread_cond_destroy(&f->cond); +- if (status != 0) +- err_abort(status, "cond destroy"); +- status = pthread_mutex_destroy(&f->mutex); +- if (status != 0) +- err_abort(status, "mutex destroy"); +- } +- free(aw); +-} +- +- +-void *startthread(void *p) +-{ +- AsyncRead *aw = (AsyncRead *)p; +- +- //printf("startthread: aw->filesdim = %p %d\n", aw, aw->filesdim); +- size_t dim = aw->filesdim; +- for (size_t i = 0; i < dim; i++) +- { FileData *f = &aw->files[i]; +- +- f->result = f->file->read(); +- +- // Set event +- int status = pthread_mutex_lock(&f->mutex); +- if (status != 0) +- err_abort(status, "lock mutex"); +- f->value = 1; +- status = pthread_cond_signal(&f->cond); +- if (status != 0) +- err_abort(status, "signal condition"); +- status = pthread_mutex_unlock(&f->mutex); +- if (status != 0) +- err_abort(status, "unlock mutex"); +- } +- +- return NULL; // end thread +-} +- +-#endif +- +-#else +- +-#include +-#include +- +-#include "root.h" +- +-struct FileData +-{ +- File *file; +- int result; +- //HANDLE event; +-}; +- +-struct AsyncRead +-{ +- static AsyncRead *create(size_t nfiles); +- void addFile(File *file); +- void start(); +- int read(size_t i); +- static void dispose(AsyncRead *); +- +- //HANDLE hThread; +- +- size_t filesdim; +- size_t filesmax; +- FileData files[1]; +-}; +- +- +-AsyncRead *AsyncRead::create(size_t nfiles) +-{ +- AsyncRead *aw = (AsyncRead *)calloc(1, sizeof(AsyncRead) + +- (nfiles - 1) * sizeof(FileData)); +- aw->filesmax = nfiles; +- return aw; +-} +- +-void AsyncRead::addFile(File *file) +-{ +- //printf("addFile(file = %p)\n", file); +- //printf("filesdim = %d, filesmax = %d\n", filesdim, filesmax); +- assert(filesdim < filesmax); +- files[filesdim].file = file; +- //files[filesdim].event = CreateEvent(NULL, TRUE, FALSE, NULL); +- //ResetEvent(files[filesdim].event); +- filesdim++; +-} +- +-void AsyncRead::start() +-{ +-} +- +-int AsyncRead::read(size_t i) +-{ +- FileData *f = &files[i]; +- f->result = f->file->read(); +- return f->result; +-} +- +-void AsyncRead::dispose(AsyncRead *aw) +-{ +- free(aw); +-} +- +-#endif +--- a/src/gcc/d/dfrontend/async.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/async.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,33 +0,0 @@ +- +-// Copyright (c) 2009-2009 by Digital Mars +-// All Rights Reserved +-// written by Walter Bright +-// http://www.digitalmars.com +-// License for redistribution is by either the Artistic License +-// in artistic.txt, or the GNU General Public License in gnu.txt. +-// See the included readme.txt for details. +- +-#ifndef ASYNC_H +-#define ASYNC_H +- +-#if __DMC__ +-#pragma once +-#endif +- +- +-/******************* +- * Simple interface to read files asynchronously in another +- * thread. +- */ +- +-struct AsyncRead +-{ +- static AsyncRead *create(size_t nfiles); +- void addFile(File *file); +- void start(); +- int read(size_t i); +- static void dispose(AsyncRead *); +-}; +- +- +-#endif +--- a/src/gcc/d/dfrontend/attrib.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/attrib.c 2014-04-01 16:32:51.000000000 +0100 +@@ -27,6 +27,8 @@ + #include "module.h" + #include "parse.h" + #include "template.h" ++#include "hdrgen.h" ++#include "utf.h" + + + /********************************* AttribDeclaration ****************************/ +@@ -77,7 +79,7 @@ int AttribDeclaration::addMember(Scope * + } + + void AttribDeclaration::setScopeNewSc(Scope *sc, +- StorageClass stc, enum LINK linkage, enum PROT protection, int explicitProtection, ++ StorageClass stc, LINK linkage, PROT protection, int explicitProtection, + structalign_t structalign) + { + if (decl) +@@ -112,7 +114,7 @@ void AttribDeclaration::setScopeNewSc(Sc + } + + void AttribDeclaration::semanticNewSc(Scope *sc, +- StorageClass stc, enum LINK linkage, enum PROT protection, int explicitProtection, ++ StorageClass stc, LINK linkage, PROT protection, int explicitProtection, + structalign_t structalign) + { + if (decl) +@@ -202,7 +204,7 @@ void AttribDeclaration::inlineScan() + } + } + +-void AttribDeclaration::addComment(unsigned char *comment) ++void AttribDeclaration::addComment(utf8_t *comment) + { + //printf("AttribDeclaration::addComment %s\n", comment); + if (comment) +@@ -257,7 +259,7 @@ void AttribDeclaration::setFieldOffset(A + } + } + +-int AttribDeclaration::hasPointers() ++bool AttribDeclaration::hasPointers() + { + Dsymbols *d = include(NULL, NULL); + +@@ -267,10 +269,10 @@ int AttribDeclaration::hasPointers() + { + Dsymbol *s = (*d)[i]; + if (s->hasPointers()) +- return 1; ++ return true; + } + } +- return 0; ++ return false; + } + + bool AttribDeclaration::hasStaticCtorOrDtor() +@@ -294,7 +296,7 @@ const char *AttribDeclaration::kind() + return "attribute"; + } + +-int AttribDeclaration::oneMember(Dsymbol **ps, Identifier *ident) ++bool AttribDeclaration::oneMember(Dsymbol **ps, Identifier *ident) + { + Dsymbols *d = include(NULL, NULL); + +@@ -337,6 +339,10 @@ void AttribDeclaration::toCBuffer(OutBuf + { + if (decl->dim == 0) + buf->writestring("{}"); ++ else if (hgs->hdrgen && decl->dim == 1 && (*decl)[0]->isUnitTestDeclaration()) ++ { // hack for bugzilla 8081 ++ buf->writestring("{}"); ++ } + else if (decl->dim == 1) + ((*decl)[0])->toCBuffer(buf, hgs); + else +@@ -376,10 +382,10 @@ Dsymbol *StorageClassDeclaration::syntax + return scd; + } + +-int StorageClassDeclaration::oneMember(Dsymbol **ps, Identifier *ident) ++bool StorageClassDeclaration::oneMember(Dsymbol **ps, Identifier *ident) + { + +- int t = Dsymbol::oneMembers(decl, ps, ident); ++ bool t = Dsymbol::oneMembers(decl, ps, ident); + if (t && *ps) + { + /* This is to deal with the following case: +@@ -468,8 +474,8 @@ const char *StorageClassDeclaration::stc + struct SCstring + { + StorageClass stc; +- enum TOK tok; +- Identifier *id; ++ TOK tok; ++ const char *id; + }; + + static SCstring table[] = +@@ -495,13 +501,13 @@ const char *StorageClassDeclaration::stc + { STCnothrow, TOKnothrow }, + { STCpure, TOKpure }, + { STCref, TOKref }, +- { STCtls, TOKtls }, ++ { STCtls }, + { STCgshared, TOKgshared }, +- { STCproperty, TOKat, Id::property }, +- { STCsafe, TOKat, Id::safe }, +- { STCtrusted, TOKat, Id::trusted }, +- { STCsystem, TOKat, Id::system }, +- { STCdisable, TOKat, Id::disable }, ++ { STCproperty, TOKat, "property" }, ++ { STCsafe, TOKat, "safe" }, ++ { STCtrusted, TOKat, "trusted" }, ++ { STCsystem, TOKat, "system" }, ++ { STCdisable, TOKat, "disable" }, + #endif + }; + +@@ -512,12 +518,15 @@ const char *StorageClassDeclaration::stc + if (stc & tbl) + { + stc &= ~tbl; +- enum TOK tok = table[i].tok; ++ if (tbl == STCtls) // TOKtls was removed ++ return "__thread"; ++ ++ TOK tok = table[i].tok; + #if DMDV2 + if (tok == TOKat) + { + tmp[0] = '@'; +- strcpy(tmp + 1, table[i].id->toChars()); ++ strcpy(tmp + 1, table[i].id); + return tmp; + } + else +@@ -536,7 +545,7 @@ void StorageClassDeclaration::stcToCBuff + const char *p = stcToChars(tmp, stc); + if (!p) + break; +- assert(strlen(p) < sizeof(tmp)); ++ assert(strlen(p) < sizeof(tmp) / sizeof(tmp[0])); + buf->writestring(p); + buf->writeByte(' '); + } +@@ -588,7 +597,7 @@ void DeprecatedDeclaration::toCBuffer(Ou + + /********************************* LinkDeclaration ****************************/ + +-LinkDeclaration::LinkDeclaration(enum LINK p, Dsymbols *decl) ++LinkDeclaration::LinkDeclaration(LINK p, Dsymbols *decl) + : AttribDeclaration(decl) + { + //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl); +@@ -626,7 +635,7 @@ void LinkDeclaration::semantic3(Scope *s + { + //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl); + if (decl) +- { enum LINK linkage_save = sc->linkage; ++ { LINK linkage_save = sc->linkage; + + sc->linkage = linkage; + for (size_t i = 0; i < decl->dim; i++) +@@ -670,7 +679,7 @@ char *LinkDeclaration::toChars() + + /********************************* ProtDeclaration ****************************/ + +-ProtDeclaration::ProtDeclaration(enum PROT p, Dsymbols *decl) ++ProtDeclaration::ProtDeclaration(PROT p, Dsymbols *decl) + : AttribDeclaration(decl) + { + protection = p; +@@ -725,7 +734,7 @@ void ProtDeclaration::semantic(Scope *sc + } + } + +-void ProtDeclaration::protectionToCBuffer(OutBuffer *buf, enum PROT protection) ++void ProtDeclaration::protectionToCBuffer(OutBuffer *buf, PROT protection) + { + const char *p; + +@@ -790,7 +799,7 @@ void AlignDeclaration::toCBuffer(OutBuff + + /********************************* AnonDeclaration ****************************/ + +-AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Dsymbols *decl) ++AnonDeclaration::AnonDeclaration(Loc loc, bool isunion, Dsymbols *decl) + : AttribDeclaration(decl) + { + this->loc = loc; +@@ -956,6 +965,30 @@ void PragmaDeclaration::setScope(Scope * + { + } + ++static unsigned setMangleOverride(Dsymbol *s, char *sym) ++{ ++ AttribDeclaration *ad = s->isAttribDeclaration(); ++ ++ if (ad) ++ { ++ Dsymbols *decls = ad->include(NULL, NULL); ++ unsigned nestedCount = 0; ++ ++ if (decls && decls->dim) ++ for (size_t i = 0; i < decls->dim; ++i) ++ nestedCount += setMangleOverride((*decls)[i], sym); ++ ++ return nestedCount; ++ } ++ else if (s->isFuncDeclaration() || s->isVarDeclaration()) ++ { ++ s->isDeclaration()->mangleOverride = sym; ++ return 1; ++ } ++ else ++ return 0; ++} ++ + void PragmaDeclaration::semantic(Scope *sc) + { // Should be merged with PragmaStatement + +@@ -968,10 +1001,13 @@ void PragmaDeclaration::semantic(Scope * + { + Expression *e = (*args)[i]; + ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); +- if (e->op != TOKerror && e->op != TOKtype) +- e = e->ctfeInterpret(); ++ sc = sc->endCTFE(); ++ ++ // pragma(msg) is allowed to contain types as well as expressions ++ e = ctfeInterpretForPragmaMsg(e); + if (e->op == TOKerror) + { errorSupplemental(loc, "while evaluating pragma(msg, %s)", (*args)[i]->toChars()); + return; +@@ -979,12 +1015,12 @@ void PragmaDeclaration::semantic(Scope * + StringExp *se = e->toString(); + if (se) + { +- fprintf(stdmsg, "%.*s", (int)se->len, (char *)se->string); ++ fprintf(stderr, "%.*s", (int)se->len, (char *)se->string); + } + else +- fprintf(stdmsg, "%s", e->toChars()); ++ fprintf(stderr, "%s", e->toChars()); + } +- fprintf(stdmsg, "\n"); ++ fprintf(stderr, "\n"); + } + goto Lnodecl; + } +@@ -996,8 +1032,11 @@ void PragmaDeclaration::semantic(Scope * + { + Expression *e = (*args)[0]; + ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + e = e->ctfeInterpret(); + (*args)[0] = e; + if (e->op == TOKerror) +@@ -1005,12 +1044,25 @@ void PragmaDeclaration::semantic(Scope * + StringExp *se = e->toString(); + if (!se) + error("string expected for library name, not '%s'", e->toChars()); +- else if (global.params.verbose) ++ else + { + char *name = (char *)mem.malloc(se->len + 1); + memcpy(name, se->string, se->len); + name[se->len] = 0; +- fprintf(stdmsg, "library %s\n", name); ++ if (global.params.verbose) ++ fprintf(global.stdmsg, "library %s\n", name); ++ if (global.params.moduleDeps && !global.params.moduleDepsFile) ++ { ++ OutBuffer *ob = global.params.moduleDeps; ++ Module* imod = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ ob->writestring("depsLib "); ++ ob->writestring(imod->toPrettyChars()); ++ ob->writestring(" ("); ++ escapePath(ob, imod->srcfile->toChars()); ++ ob->writestring(") : "); ++ ob->writestring((char *) name); ++ ob->writenl(); ++ } + mem.free(name); + } + } +@@ -1024,8 +1076,12 @@ void PragmaDeclaration::semantic(Scope * + else + { + Expression *e = (*args)[0]; ++ ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + e = e->ctfeInterpret(); + (*args)[0] = e; + Dsymbol *sa = getDsymbol(e); +@@ -1035,31 +1091,106 @@ void PragmaDeclaration::semantic(Scope * + goto Lnodecl; + } + #endif ++ else if (ident == Id::mangle) ++ { ++ if (!args || args->dim != 1) ++ error("string expected for mangled name"); ++ else ++ { ++ Expression *e = (*args)[0]; ++ ++ e = e->semantic(sc); ++ e = e->ctfeInterpret(); ++ (*args)[0] = e; ++ ++ if (e->op == TOKerror) ++ goto Lnodecl; ++ ++ StringExp *se = e->toString(); ++ ++ if (!se) ++ { ++ error("string expected for mangled name, not '%s'", e->toChars()); ++ return; ++ } ++ ++ if (!se->len) ++ error("zero-length string not allowed for mangled name"); ++ ++ if (se->sz != 1) ++ error("mangled name characters can only be of type char"); ++ ++#if 1 ++ /* Note: D language specification should not have any assumption about backend ++ * implementation. Ideally pragma(mangle) can accept a string of any content. ++ * ++ * Therefore, this validation is compiler implementation specific. ++ */ ++ for (size_t i = 0; i < se->len; ) ++ { ++ utf8_t *p = (utf8_t *)se->string; ++ dchar_t c = p[i]; ++ if (c < 0x80) ++ { ++ if (c >= 'A' && c <= 'Z' || ++ c >= 'a' && c <= 'z' || ++ c >= '0' && c <= '9' || ++ c != 0 && strchr("$%().:?@[]_", c)) ++ { ++ ++i; ++ continue; ++ } ++ else ++ { ++ error("char 0x%02x not allowed in mangled name", c); ++ break; ++ } ++ } ++ ++ if (const char* msg = utf_decodeChar((utf8_t *)se->string, se->len, &i, &c)) ++ { ++ error("%s", msg); ++ break; ++ } ++ ++ if (!isUniAlpha(c)) ++ { ++ error("char 0x%04x not allowed in mangled name", c); ++ break; ++ } ++ } ++#endif ++ } ++ } + else if (global.params.ignoreUnsupportedPragmas) + { + if (global.params.verbose) + { + /* Print unrecognized pragmas + */ +- fprintf(stdmsg, "pragma %s", ident->toChars()); ++ fprintf(global.stdmsg, "pragma %s", ident->toChars()); + if (args) + { + for (size_t i = 0; i < args->dim; i++) + { + Expression *e = (*args)[i]; ++ ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + e = e->ctfeInterpret(); + if (i == 0) +- printf(" ("); ++ fprintf(global.stdmsg, " ("); + else +- printf(","); +- printf("%s", e->toChars()); ++ fprintf(global.stdmsg, ","); ++ fprintf(global.stdmsg, "%s", e->toChars()); + } + if (args->dim) +- printf(")"); ++ fprintf(global.stdmsg, ")"); + } +- printf("\n"); ++ fprintf(global.stdmsg, "\n"); + } + goto Lnodecl; + } +@@ -1074,6 +1205,20 @@ Ldecl: + Dsymbol *s = (*decl)[i]; + + s->semantic(sc); ++ ++ if (ident == Id::mangle) ++ { ++ StringExp *e = (*args)[0]->toString(); ++ ++ char *name = (char *)mem.malloc(e->len + 1); ++ memcpy(name, e->string, e->len); ++ name[e->len] = 0; ++ ++ unsigned cnt = setMangleOverride(s, name); ++ ++ if (cnt > 1) ++ error("can only apply to a single declaration"); ++ } + } + } + return; +@@ -1086,10 +1231,10 @@ Lnodecl: + } + } + +-int PragmaDeclaration::oneMember(Dsymbol **ps, Identifier *ident) ++bool PragmaDeclaration::oneMember(Dsymbol **ps, Identifier *ident) + { + *ps = NULL; +- return TRUE; ++ return true; + } + + const char *PragmaDeclaration::kind() +@@ -1132,7 +1277,7 @@ Dsymbol *ConditionalDeclaration::syntaxC + } + + +-int ConditionalDeclaration::oneMember(Dsymbol **ps, Identifier *ident) ++bool ConditionalDeclaration::oneMember(Dsymbol **ps, Identifier *ident) + { + //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc); + if (condition->inc) +@@ -1140,8 +1285,13 @@ int ConditionalDeclaration::oneMember(Ds + Dsymbols *d = condition->include(NULL, NULL) ? decl : elsedecl; + return Dsymbol::oneMembers(d, ps, ident); + } +- *ps = NULL; +- return TRUE; ++ else ++ { ++ bool res = (Dsymbol::oneMembers( decl, ps, ident) && *ps == NULL && ++ Dsymbol::oneMembers(elsedecl, ps, ident) && *ps == NULL); ++ *ps = NULL; ++ return res; ++ } + } + + void ConditionalDeclaration::emitComment(Scope *sc) +@@ -1205,7 +1355,7 @@ void ConditionalDeclaration::importAll(S + } + } + +-void ConditionalDeclaration::addComment(unsigned char *comment) ++void ConditionalDeclaration::addComment(utf8_t *comment) + { + /* Because addComment is called by the parser, if we called + * include() it would define a version before it was used. +@@ -1302,7 +1452,13 @@ Dsymbols *StaticIfDeclaration::include(S + + if (condition->inc == 0) + { ++ /* Bugzilla 10101: Condition evaluation may cause self-recursive ++ * condition evaluation. To resolve it, temporarily save sc into scope. ++ */ ++ bool x = !scope && sc; ++ if (x) scope = sc; + Dsymbols *d = ConditionalDeclaration::include(sc, sd); ++ if (x) scope = NULL; + + // Set the scopes lazily. + if (scope && d) +@@ -1411,6 +1567,9 @@ Dsymbol *CompileDeclaration::syntaxCopy( + int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum) + { + //printf("CompileDeclaration::addMember(sc = %p, sd = %p, memnum = %d)\n", sc, sd, memnum); ++ if (compiled) ++ return 1; ++ + this->sd = sd; + if (memnum == 0) + { /* No members yet, so parse the mixin now +@@ -1425,8 +1584,10 @@ int CompileDeclaration::addMember(Scope + void CompileDeclaration::compileIt(Scope *sc) + { + //printf("CompileDeclaration::compileIt(loc = %d) %s\n", loc.linnum, exp->toChars()); ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); ++ sc = sc->endCTFE(); + exp = exp->ctfeInterpret(); + StringExp *se = exp->toString(); + if (!se) +@@ -1435,12 +1596,15 @@ void CompileDeclaration::compileIt(Scope + else + { + se = se->toUTF8(sc); +- Parser p(sc->module, (unsigned char *)se->string, se->len, 0); +- p.loc = loc; ++ Parser p(sc->module, (utf8_t *)se->string, se->len, 0); ++ p.scanloc = loc; + p.nextToken(); ++ unsigned errors = global.errors; + decl = p.parseDeclDefs(0); + if (p.token.value != TOKeof) + exp->error("incomplete mixin declaration (%s)", se->toChars()); ++ if (global.errors != errors) ++ decl = NULL; + } + } + +@@ -1533,8 +1697,8 @@ Expressions *UserAttributeDeclaration::c + * (do not append to left operand, as this is a copy-on-write operation) + */ + udas = new Expressions(); +- udas->push(new TupleExp(0, udas1)); +- udas->push(new TupleExp(0, udas2)); ++ udas->push(new TupleExp(Loc(), udas1)); ++ udas->push(new TupleExp(Loc(), udas2)); + } + return udas; + } +@@ -1559,8 +1723,8 @@ void UserAttributeDeclaration::setScope( + { + // Create a tuple that combines them + Expressions *exps = new Expressions(); +- exps->push(new TupleExp(0, newsc->userAttributes)); +- exps->push(new TupleExp(0, atts)); ++ exps->push(new TupleExp(Loc(), newsc->userAttributes)); ++ exps->push(new TupleExp(Loc(), atts)); + newsc->userAttributes = exps; + } + } +--- a/src/gcc/d/dfrontend/attrib.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/attrib.h 2014-04-01 16:32:51.000000000 +0100 +@@ -17,18 +17,19 @@ + + #include "dsymbol.h" + +-struct Expression; +-struct Statement; +-struct LabelDsymbol; +-struct Initializer; +-struct Module; +-struct Condition; ++class Expression; ++class Statement; ++class LabelDsymbol; ++class Initializer; ++class Module; ++class Condition; + struct HdrGenState; + + /**************************************************************/ + +-struct AttribDeclaration : Dsymbol ++class AttribDeclaration : public Dsymbol + { ++public: + Dsymbols *decl; // array of Dsymbol's + + AttribDeclaration(Dsymbols *decl); +@@ -36,21 +37,21 @@ struct AttribDeclaration : Dsymbol + int apply(Dsymbol_apply_ft_t fp, void *param); + int addMember(Scope *sc, ScopeDsymbol *s, int memnum); + void setScopeNewSc(Scope *sc, +- StorageClass newstc, enum LINK linkage, enum PROT protection, int explictProtection, ++ StorageClass newstc, LINK linkage, PROT protection, int explictProtection, + structalign_t structalign); + void semanticNewSc(Scope *sc, +- StorageClass newstc, enum LINK linkage, enum PROT protection, int explictProtection, ++ StorageClass newstc, LINK linkage, PROT protection, int explictProtection, + structalign_t structalign); + void semantic(Scope *sc); + void semantic2(Scope *sc); + void semantic3(Scope *sc); + void inlineScan(); +- void addComment(unsigned char *comment); ++ void addComment(utf8_t *comment); + void emitComment(Scope *sc); + const char *kind(); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); +- int hasPointers(); ++ bool hasPointers(); + bool hasStaticCtorOrDtor(); + void checkCtorConstInit(); + void addLocalClass(ClassDeclarations *); +@@ -61,23 +62,25 @@ struct AttribDeclaration : Dsymbol + void toObjFile(int multiobj); // compile to .obj file + }; + +-struct StorageClassDeclaration : AttribDeclaration ++class StorageClassDeclaration : public AttribDeclaration + { ++public: + StorageClass stc; + + StorageClassDeclaration(StorageClass stc, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void setScope(Scope *sc); + void semantic(Scope *sc); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + static const char *stcToChars(char tmp[], StorageClass& stc); + static void stcToCBuffer(OutBuffer *buf, StorageClass stc); + }; + +-struct DeprecatedDeclaration : StorageClassDeclaration ++class DeprecatedDeclaration : public StorageClassDeclaration + { ++public: + Expression *msg; + + DeprecatedDeclaration(Expression *msg, Dsymbols *decl); +@@ -86,11 +89,12 @@ struct DeprecatedDeclaration : StorageCl + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct LinkDeclaration : AttribDeclaration ++class LinkDeclaration : public AttribDeclaration + { +- enum LINK linkage; ++public: ++ LINK linkage; + +- LinkDeclaration(enum LINK p, Dsymbols *decl); ++ LinkDeclaration(LINK p, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void setScope(Scope *sc); + void semantic(Scope *sc); +@@ -99,22 +103,24 @@ struct LinkDeclaration : AttribDeclarati + char *toChars(); + }; + +-struct ProtDeclaration : AttribDeclaration ++class ProtDeclaration : public AttribDeclaration + { +- enum PROT protection; ++public: ++ PROT protection; + +- ProtDeclaration(enum PROT p, Dsymbols *decl); ++ ProtDeclaration(PROT p, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void importAll(Scope *sc); + void setScope(Scope *sc); + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +- static void protectionToCBuffer(OutBuffer *buf, enum PROT protection); ++ static void protectionToCBuffer(OutBuffer *buf, PROT protection); + }; + +-struct AlignDeclaration : AttribDeclaration ++class AlignDeclaration : public AttribDeclaration + { ++public: + unsigned salign; + + AlignDeclaration(unsigned sa, Dsymbols *decl); +@@ -124,13 +130,14 @@ struct AlignDeclaration : AttribDeclarat + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct AnonDeclaration : AttribDeclaration ++class AnonDeclaration : public AttribDeclaration + { ++public: + bool isunion; + structalign_t alignment; + int sem; // 1 if successful semantic() + +- AnonDeclaration(Loc loc, int isunion, Dsymbols *decl); ++ AnonDeclaration(Loc loc, bool isunion, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void semantic(Scope *sc); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); +@@ -138,39 +145,42 @@ struct AnonDeclaration : AttribDeclarati + const char *kind(); + }; + +-struct PragmaDeclaration : AttribDeclaration ++class PragmaDeclaration : public AttribDeclaration + { ++public: + Expressions *args; // array of Expression's + + PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void semantic(Scope *sc); + void setScope(Scope *sc); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + const char *kind(); + void toObjFile(int multiobj); // compile to .obj file + }; + +-struct ConditionalDeclaration : AttribDeclaration ++class ConditionalDeclaration : public AttribDeclaration + { ++public: + Condition *condition; + Dsymbols *elsedecl; // array of Dsymbol's for else block + + ConditionalDeclaration(Condition *condition, Dsymbols *decl, Dsymbols *elsedecl); + Dsymbol *syntaxCopy(Dsymbol *s); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void emitComment(Scope *sc); + Dsymbols *include(Scope *sc, ScopeDsymbol *s); +- void addComment(unsigned char *comment); ++ void addComment(utf8_t *comment); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void toJson(JsonOut *json); + void importAll(Scope *sc); + void setScope(Scope *sc); + }; + +-struct StaticIfDeclaration : ConditionalDeclaration ++class StaticIfDeclaration : public ConditionalDeclaration + { ++public: + ScopeDsymbol *sd; + int addisdone; + +@@ -186,8 +196,9 @@ struct StaticIfDeclaration : Conditional + + // Mixin declarations + +-struct CompileDeclaration : AttribDeclaration ++class CompileDeclaration : public AttribDeclaration + { ++public: + Expression *exp; + + ScopeDsymbol *sd; +@@ -206,8 +217,9 @@ struct CompileDeclaration : AttribDeclar + * User defined attributes look like: + * [ args, ... ] + */ +-struct UserAttributeDeclaration : AttribDeclaration ++class UserAttributeDeclaration : public AttribDeclaration + { ++public: + Expressions *atts; + + UserAttributeDeclaration(Expressions *atts, Dsymbols *decl); +--- a/src/gcc/d/dfrontend/builtin.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/builtin.c 2014-04-01 16:32:51.000000000 +0100 +@@ -30,7 +30,7 @@ + * Determine if function is a builtin one that we can + * evaluate at compile time. + */ +-enum BUILTIN FuncDeclaration::isBuiltin() ++BUILTIN FuncDeclaration::isBuiltin() + { + static const char FeZe [] = "FNaNbNfeZe"; // @safe pure nothrow real function(real) + static const char FeZe2[] = "FNaNbNeeZe"; // @trusted pure nothrow real function(real) +@@ -165,7 +165,7 @@ uinteger_t eval_bswap(Expression *arg0) + * Return result; NULL if cannot evaluate it. + */ + +-Expression *eval_builtin(Loc loc, enum BUILTIN builtin, Expressions *arguments) ++Expression *eval_builtin(Loc loc, BUILTIN builtin, Expressions *arguments) + { + assert(arguments && arguments->dim); + Expression *arg0 = (*arguments)[0]; +@@ -174,27 +174,27 @@ Expression *eval_builtin(Loc loc, enum B + { + case BUILTINsin: + if (arg0->op == TOKfloat64) +- e = new RealExp(0, sinl(arg0->toReal()), arg0->type); ++ e = new RealExp(Loc(), sinl(arg0->toReal()), arg0->type); + break; + + case BUILTINcos: + if (arg0->op == TOKfloat64) +- e = new RealExp(0, cosl(arg0->toReal()), arg0->type); ++ e = new RealExp(Loc(), cosl(arg0->toReal()), arg0->type); + break; + + case BUILTINtan: + if (arg0->op == TOKfloat64) +- e = new RealExp(0, tanl(arg0->toReal()), arg0->type); ++ e = new RealExp(Loc(), tanl(arg0->toReal()), arg0->type); + break; + + case BUILTINsqrt: + if (arg0->op == TOKfloat64) +- e = new RealExp(0, sqrtl(arg0->toReal()), arg0->type); ++ e = new RealExp(Loc(), sqrtl(arg0->toReal()), arg0->type); + break; + + case BUILTINfabs: + if (arg0->op == TOKfloat64) +- e = new RealExp(0, fabsl(arg0->toReal()), arg0->type); ++ e = new RealExp(Loc(), fabsl(arg0->toReal()), arg0->type); + break; + // These math intrinsics are not yet implemented + case BUILTINatan2: +--- a/src/gcc/d/dfrontend/canthrow.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/canthrow.c 2014-04-01 16:32:51.000000000 +0100 +@@ -56,14 +56,15 @@ int lambdaCanThrow(Expression *e, void * + switch (e->op) + { + case TOKdeclaration: +- { DeclarationExp *de = (DeclarationExp *)e; ++ { ++ DeclarationExp *de = (DeclarationExp *)e; + pct->can = Dsymbol_canThrow(de->declaration, pct->mustnot); + break; + } + + case TOKcall: +- { CallExp *ce = (CallExp *)e; +- ++ { ++ CallExp *ce = (CallExp *)e; + if (global.errors && !ce->e1->type) + break; // error recovery + +@@ -79,14 +80,15 @@ int lambdaCanThrow(Expression *e, void * + else + { + if (pct->mustnot) +- e->error("%s is not nothrow", ce->e1->toChars()); ++ e->error("'%s' is not nothrow", ce->f ? ce->f->toPrettyChars() : ce->e1->toChars()); + pct->can = TRUE; + } + break; + } + + case TOKnew: +- { NewExp *ne = (NewExp *)e; ++ { ++ NewExp *ne = (NewExp *)e; + if (ne->member) + { + // See if constructor call can throw +@@ -102,6 +104,33 @@ int lambdaCanThrow(Expression *e, void * + break; + } + ++ case TOKassign: ++ case TOKconstruct: ++ { ++ /* Element-wise assignment could invoke postblits. ++ */ ++ AssignExp *ae = (AssignExp *)e; ++ if (ae->e1->op != TOKslice) ++ break; ++ ++ Type *tv = ae->e1->type->toBasetype()->nextOf()->baseElemOf(); ++ if (tv->ty != Tstruct) ++ break; ++ StructDeclaration *sd = ((TypeStruct *)tv)->sym; ++ if (!sd->postblit || sd->postblit->type->ty != Tfunction) ++ break; ++ ++ if (((TypeFunction *)sd->postblit->type)->isnothrow) ++ ; ++ else ++ { ++ if (pct->mustnot) ++ e->error("'%s' is not nothrow", sd->postblit->toPrettyChars()); ++ pct->can = TRUE; ++ } ++ break; ++ } ++ + case TOKnewanonclass: + assert(0); // should have been lowered by semantic() + break; +@@ -175,7 +204,7 @@ int Dsymbol_canThrow(Dsymbol *s, bool mu + else if ((td = s->isTupleDeclaration()) != NULL) + { + for (size_t i = 0; i < td->objects->dim; i++) +- { Object *o = (*td->objects)[i]; ++ { RootObject *o = (*td->objects)[i]; + if (o->dyncast() == DYNCAST_EXPRESSION) + { Expression *eo = (Expression *)o; + if (eo->op == TOKdsymbol) +--- a/src/gcc/d/dfrontend/cast.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/cast.c 2014-04-01 16:32:51.000000000 +0100 +@@ -20,6 +20,7 @@ + #include "aggregate.h" + #include "template.h" + #include "scope.h" ++#include "id.h" + + //#define DUMP .dump(__PRETTY_FUNCTION__, this) + #define DUMP +@@ -162,7 +163,7 @@ MATCH Expression::implicitConvTo(Type *t + type = Type::terror; + } + Expression *e = optimize(WANTvalue | WANTflags); +- if (e->type == t) ++ if (e->type->equals(t)) + return MATCHexact; + if (e != this) + { //printf("\toptimized to %s of type %s\n", e->toChars(), e->type->toChars()); +@@ -280,7 +281,11 @@ MATCH IntegerExp::implicitConvTo(Type *t + goto Lyes; + + case Tint8: +- if ((signed char)value != value) ++ if (ty == Tuns64 && value & ~0x7FUL) ++ goto Lno; ++ //else if (ty == Tint64 && 0x7FUL < value && value < ~0x7FUL) ++ // goto Lno; ++ else if ((signed char)value != value) + goto Lno; + goto Lyes; + +@@ -294,7 +299,11 @@ MATCH IntegerExp::implicitConvTo(Type *t + goto Lyes; + + case Tint16: +- if ((short)value != value) ++ if (ty == Tuns64 && value & ~0x7FFFUL) ++ goto Lno; ++ //else if (ty == Tint64 && 0x7FFFUL < value && value < ~0x7FFFUL) ++ // goto Lno; ++ else if ((short)value != value) + goto Lno; + goto Lyes; + +@@ -310,6 +319,10 @@ MATCH IntegerExp::implicitConvTo(Type *t + if (ty == Tuns32) + { + } ++ else if (ty == Tuns64 && value & ~0x7FFFFFFFUL) ++ goto Lno; ++ //else if (ty == Tint64 && 0x7FFFFFFFUL < value && value < ~0x7FFFFFFFUL) ++ // goto Lno; + else if ((int)value != value) + goto Lno; + goto Lyes; +@@ -327,27 +340,6 @@ MATCH IntegerExp::implicitConvTo(Type *t + goto Lno; + goto Lyes; + +-#ifdef IN_GCC +- case Tfloat32: +- case Tfloat64: +- case Tfloat80: +- { +- real_t f; +- if (type->isunsigned()) +- { +- f = real_t((d_uns64) value); +- if ((d_uns64) f.toInt() != (d_uns64) value) +- goto Lno; +- } +- else +- { +- f = real_t((d_int64) value); +- if ((d_int64) f.toInt() != (d_int64) value) +- goto Lno; +- } +- goto Lyes; +- } +-#else + case Tfloat32: + { + volatile float f; +@@ -359,8 +351,8 @@ MATCH IntegerExp::implicitConvTo(Type *t + } + else + { +- f = (float)(long long)value; +- if (f != (long long)value) ++ f = (float)(sinteger_t)value; ++ if (f != (sinteger_t)value) + goto Lno; + } + goto Lyes; +@@ -377,8 +369,8 @@ MATCH IntegerExp::implicitConvTo(Type *t + } + else + { +- f = (double)(long long)value; +- if (f != (long long)value) ++ f = (double)(sinteger_t)value; ++ if (f != (sinteger_t)value) + goto Lno; + } + goto Lyes; +@@ -395,13 +387,13 @@ MATCH IntegerExp::implicitConvTo(Type *t + } + else + { +- f = ldouble((long long)value); +- if (f != (long long)value) ++ f = ldouble((sinteger_t)value); ++ if (f != (sinteger_t)value) + goto Lno; + } + goto Lyes; + } +-#endif ++ + case Tpointer: + //printf("type = %s\n", type->toBasetype()->toChars()); + //printf("t = %s\n", t->toBasetype()->toChars()); +@@ -426,6 +418,11 @@ Lno: + return MATCHnomatch; + } + ++MATCH ErrorExp::implicitConvTo(Type *t) ++{ ++ return MATCHnomatch; ++} ++ + MATCH NullExp::implicitConvTo(Type *t) + { + #if 0 +@@ -439,7 +436,7 @@ MATCH NullExp::implicitConvTo(Type *t) + * and mutable to immutable. It works because, after all, a null + * doesn't actually point to anything. + */ +- if (t->invariantOf()->equals(type->invariantOf())) ++ if (t->immutableOf()->equals(type->immutableOf())) + return MATCHconst; + + return Expression::implicitConvTo(t); +@@ -460,9 +457,12 @@ MATCH StructLiteralExp::implicitConvTo(T + { + m = MATCHconst; + for (size_t i = 0; i < elements->dim; i++) +- { Expression *e = (*elements)[i]; ++ { ++ Expression *e = (*elements)[i]; ++ if (!e) ++ continue; + Type *te = e->type; +- te = te->castMod(t->mod); ++ te = sd->fields[i]->type->addMod(t->mod); + MATCH m2 = e->implicitConvTo(te); + //printf("\t%s => %s, match = %d\n", e->toChars(), te->toChars(), m2); + if (m2 < m) +@@ -659,8 +659,35 @@ MATCH CallExp::implicitConvTo(Type *t) + /* Allow the result of strongly pure functions to + * convert to immutable + */ +- if (f && f->isPure() == PUREstrong && !f->type->hasWild()) +- return type->invariantOf()->implicitConvTo(t); ++ if (f && f->isolateReturn()) ++ return type->immutableOf()->implicitConvTo(t); ++ ++ /* The result of arr.dup and arr.idup can be unique essentially. ++ * So deal with this case specially. ++ */ ++ if (!f && e1->op == TOKvar && ((VarExp *)e1)->var->ident == Id::adDup && ++ t->toBasetype()->ty == Tarray) ++ { ++ assert(type->toBasetype()->ty == Tarray); ++ assert(arguments->dim == 2); ++ Expression *eorg = (*arguments)[1]; ++ Type *tn = t->nextOf(); ++ if (type->nextOf()->implicitConvTo(tn) < MATCHconst) ++ { ++ /* If the operand is an unique array literal, then allow conversion. ++ */ ++ if (eorg->op != TOKarrayliteral) ++ return MATCHnomatch; ++ Expressions *elements = ((ArrayLiteralExp *)eorg)->elements; ++ for (size_t i = 0; i < elements->dim; i++) ++ { ++ if (!(*elements)[i]->implicitConvTo(tn)) ++ return MATCHnomatch; ++ } ++ } ++ m = type->immutableOf()->implicitConvTo(t); ++ return m; ++ } + + return MATCHnomatch; + } +@@ -990,10 +1017,43 @@ MATCH NewExp::implicitConvTo(Type *t) + return MATCHnomatch; + } + ++Type *SliceExp::toStaticArrayType() ++{ ++ if (lwr && upr) ++ { ++ Expression *lwr = this->lwr->optimize(WANTvalue); ++ Expression *upr = this->upr->optimize(WANTvalue); ++ if (lwr->isConst() && upr->isConst()) ++ { ++ size_t len = upr->toUInteger() - lwr->toUInteger(); ++ return TypeSArray::makeType(loc, type->toBasetype()->nextOf(), len); ++ } ++ } ++ return NULL; ++} ++ ++MATCH SliceExp::implicitConvTo(Type *t) ++{ ++ MATCH result = Expression::implicitConvTo(t); ++ ++ Type *tb = t->toBasetype(); ++ Type *typeb = type->toBasetype(); ++ if (result == MATCHnomatch && ++ tb->ty == Tsarray && typeb->ty == Tarray && ++ lwr && upr) ++ { ++ typeb = toStaticArrayType(); ++ if (typeb) ++ result = typeb->implicitConvTo(t); ++ } ++ return result; ++} ++ + /* ==================== castTo ====================== */ + + /************************************** + * Do an explicit cast. ++ * Assume that the 'this' expression does not have any indirections. + */ + + Expression *Expression::castTo(Scope *sc, Type *t) +@@ -1003,12 +1063,21 @@ Expression *Expression::castTo(Scope *sc + printf("Expression::castTo(this=%s, type=%s, t=%s)\n", + toChars(), type->toChars(), t->toChars()); + #endif +- if (type == t) ++ if (type->equals(t)) + return this; ++ if (op == TOKvar) ++ { ++ VarDeclaration *v = ((VarExp *)this)->var->isVarDeclaration(); ++ if (v && v->storage_class & STCmanifest) ++ { ++ Expression *e = ctfeInterpret(); ++ return e->castTo(sc, t); ++ } ++ } + Expression *e = this; + Type *tb = t->toBasetype(); + Type *typeb = type->toBasetype(); +- if (tb != typeb) ++ if (!tb->equals(typeb)) + { + // Do (type *) cast of (type [dim]) + if (tb->ty == Tpointer && +@@ -1076,7 +1145,7 @@ Expression *Expression::castTo(Scope *sc + e = e->semantic(sc); + return e; + } +- else if (typeb->implicitConvTo(tb) == MATCHconst && t == type->constOf()) ++ else if (typeb->implicitConvTo(tb) == MATCHconst && t->equals(type->constOf())) + { + Expression *e = copy(); + e->type = t; +@@ -1103,8 +1172,9 @@ Expression *ErrorExp::castTo(Scope *sc, + + + Expression *RealExp::castTo(Scope *sc, Type *t) +-{ Expression *e = this; +- if (type != t) ++{ ++ Expression *e = this; ++ if (!type->equals(t)) + { + if ((type->isreal() && t->isreal()) || + (type->isimaginary() && t->isimaginary()) +@@ -1120,8 +1190,9 @@ Expression *RealExp::castTo(Scope *sc, T + + + Expression *ComplexExp::castTo(Scope *sc, Type *t) +-{ Expression *e = this; +- if (type != t) ++{ ++ Expression *e = this; ++ if (!type->equals(t)) + { + if (type->iscomplex() && t->iscomplex()) + { e = copy(); +@@ -1136,8 +1207,8 @@ Expression *ComplexExp::castTo(Scope *sc + + Expression *NullExp::castTo(Scope *sc, Type *t) + { +- //printf("NullExp::castTo(t = %p)\n", t); +- if (type == t) ++ //printf("NullExp::castTo(t = %s) %s\n", t->toChars(), toChars()); ++ if (type->equals(t)) + { + committed = 1; + return this; +@@ -1148,7 +1219,7 @@ Expression *NullExp::castTo(Scope *sc, T + Type *tb = t->toBasetype(); + #if 0 + e->type = type->toBasetype(); +- if (tb != e->type) ++ if (!tb->equals(e->type)) + { + // NULL implicitly converts to any pointer type or dynamic array + if (e->type->ty == Tpointer && e->type->nextOf()->ty == Tvoid && +@@ -1179,10 +1250,22 @@ Expression *NullExp::castTo(Scope *sc, T + return e->Expression::castTo(sc, t); + } + #endif ++ if (tb->ty == Tsarray || tb->ty == Tstruct) ++ { ++ error("cannot cast null to %s", t->toChars()); ++ } + e->type = t; + return e; + } + ++Expression *StructLiteralExp::castTo(Scope *sc, Type *t) ++{ ++ Expression *e = Expression::castTo(sc, t); ++ if (e->op == TOKstructliteral) ++ ((StructLiteralExp *)e)->stype = t; // commit type ++ return e; ++} ++ + Expression *StringExp::castTo(Scope *sc, Type *t) + { + /* This follows copy-on-write; any changes to 'this' +@@ -1206,7 +1289,7 @@ Expression *StringExp::castTo(Scope *sc, + copied = 1; + } + +- if (type == t) ++ if (type->equals(t)) + { + return se; + } +@@ -1217,7 +1300,7 @@ Expression *StringExp::castTo(Scope *sc, + return Expression::castTo(sc, t); + + Type *typeb = type->toBasetype(); +- if (typeb == tb) ++ if (typeb->equals(tb)) + { + if (!copied) + { se = (StringExp *)copy(); +@@ -1236,6 +1319,16 @@ Expression *StringExp::castTo(Scope *sc, + se->len = (len * sz) / se->sz; + se->committed = 1; + se->type = t; ++ ++ /* Assure space for terminating 0 ++ */ ++ if ((se->len + 1) * se->sz > (len + 1) * sz) ++ { ++ void *s = (void *)mem.malloc((se->len + 1) * se->sz); ++ memcpy(s, se->string, se->len * se->sz); ++ memset((char *)s + se->len * se->sz, 0, se->sz); ++ se->string = s; ++ } + return se; + } + +@@ -1285,7 +1378,7 @@ Expression *StringExp::castTo(Scope *sc, + case X(Tchar, Twchar): + for (size_t u = 0; u < len;) + { unsigned c; +- const char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c); ++ const char *p = utf_decodeChar((utf8_t *)se->string, len, &u, &c); + if (p) + error("%s", p); + else +@@ -1298,7 +1391,7 @@ Expression *StringExp::castTo(Scope *sc, + case X(Tchar, Tdchar): + for (size_t u = 0; u < len;) + { unsigned c; +- const char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c); ++ const char *p = utf_decodeChar((utf8_t *)se->string, len, &u, &c); + if (p) + error("%s", p); + buffer.write4(c); +@@ -1397,7 +1490,7 @@ L2: + // Copy when changing the string literal + size_t newsz = se->sz; + size_t d = (dim2 < se->len) ? dim2 : se->len; +- void *s = (unsigned char *)mem.malloc((dim2 + 1) * newsz); ++ void *s = (void *)mem.malloc((dim2 + 1) * newsz); + memcpy(s, se->string, d * newsz); + // Extend with 0, add terminating 0 + memset((char *)s + d * newsz, 0, (dim2 + 1 - d) * newsz); +@@ -1426,7 +1519,7 @@ Expression *AddrExp::castTo(Scope *sc, T + + tb = t->toBasetype(); + type = type->toBasetype(); +- if (tb != type) ++ if (!tb->equals(type)) + { + // Look for pointers to functions where the functions are overloaded. + +@@ -1486,7 +1579,12 @@ Expression *AddrExp::castTo(Scope *sc, T + + + Expression *TupleExp::castTo(Scope *sc, Type *t) +-{ TupleExp *e = (TupleExp *)copy(); ++{ ++ if (type->equals(t)) ++ return this; ++ ++ TupleExp *e = (TupleExp *)copy(); ++ e->e0 = e0 ? e0->copy() : NULL; + e->exps = (Expressions *)exps->copy(); + for (size_t i = 0; i < e->exps->dim; i++) + { Expression *ex = (*e->exps)[i]; +@@ -1511,7 +1609,9 @@ Expression *ArrayLiteralExp::castTo(Scop + if ((tb->ty == Tarray || tb->ty == Tsarray) && + (typeb->ty == Tarray || typeb->ty == Tsarray) && + // Not trying to convert non-void[] to void[] +- !(tb->nextOf()->toBasetype()->ty == Tvoid && typeb->nextOf()->toBasetype()->ty != Tvoid)) ++ !(tb->nextOf()->toBasetype()->ty == Tvoid && typeb->nextOf()->toBasetype()->ty != Tvoid) && ++ // Not trying to convert void[n] to others ++ !(typeb->ty == Tsarray && typeb->nextOf()->toBasetype()->ty == Tvoid)) + { + if (tb->ty == Tsarray) + { TypeSArray *tsa = (TypeSArray *)tb; +@@ -1598,12 +1698,12 @@ Expression *SymOffExp::castTo(Scope *sc, + printf("SymOffExp::castTo(this=%s, type=%s, t=%s)\n", + toChars(), type->toChars(), t->toChars()); + #endif +- if (type == t && hasOverloads == 0) ++ if (type == t && !hasOverloads) + return this; + Expression *e; + Type *tb = t->toBasetype(); + Type *typeb = type->toBasetype(); +- if (tb != typeb) ++ if (!tb->equals(typeb)) + { + // Look for pointers to functions where the functions are overloaded. + FuncDeclaration *f; +@@ -1656,7 +1756,7 @@ Expression *SymOffExp::castTo(Scope *sc, + else + { e = copy(); + e->type = t; +- ((SymOffExp *)e)->hasOverloads = 0; ++ ((SymOffExp *)e)->hasOverloads = false; + } + return e; + } +@@ -1667,12 +1767,12 @@ Expression *DelegateExp::castTo(Scope *s + printf("DelegateExp::castTo(this=%s, type=%s, t=%s)\n", + toChars(), type->toChars(), t->toChars()); + #endif +- static char msg[] = "cannot form delegate due to covariant return type"; ++ static const char msg[] = "cannot form delegate due to covariant return type"; + + Expression *e = this; + Type *tb = t->toBasetype(); + Type *typeb = type->toBasetype(); +- if (tb != typeb || hasOverloads) ++ if (!tb->equals(typeb) || hasOverloads) + { + // Look for delegates to functions where the functions are overloaded. + FuncDeclaration *f; +@@ -1717,14 +1817,15 @@ Expression *FuncExp::castTo(Scope *sc, T + if (e) + { + if (e != this) +- e = e->castTo(sc, t); +- else if (!e->type->equals(t)) ++ return e->castTo(sc, t); ++ if (!e->type->equals(t) && e->type->implicitConvTo(t)) + { +- assert(e->type->nextOf()->covariant(t->nextOf()) == 1); ++ assert(t->ty == Tpointer && t->nextOf()->ty == Tvoid || // Bugzilla 9928 ++ e->type->nextOf()->covariant(t->nextOf()) == 1); + e = e->copy(); + e->type = t; ++ return e; + } +- return e; + } + return Expression::castTo(sc, t); + } +@@ -1733,7 +1834,7 @@ Expression *CondExp::castTo(Scope *sc, T + { + Expression *e = this; + +- if (type != t) ++ if (!type->equals(t)) + { + if (1 || e1->op == TOKstring || e2->op == TOKstring) + { e = new CondExp(loc, econd, e1->castTo(sc, t), e2->castTo(sc, t)); +@@ -1762,19 +1863,50 @@ Expression *CommaExp::castTo(Scope *sc, + return e; + } + ++Expression *SliceExp::castTo(Scope *sc, Type *t) ++{ ++ Type *typeb = type->toBasetype(); ++ Type *tb = t->toBasetype(); ++ Expression *e; ++ if (typeb->ty == Tarray && tb->ty == Tsarray) ++ { ++ /* If a SliceExp has Tsarray, it will become lvalue. ++ * That's handled in SliceExp::isLvalue and toLvalue ++ */ ++ e = copy(); ++ e->type = t; ++ } ++ else if (typeb->ty == Tarray && tb->ty == Tarray && ++ typeb->nextOf()->constConv(tb->nextOf()) == MATCHconst) ++ { ++ // immutable(T)[] to const(T)[] ++ // T [] to const(T)[] ++ e = copy(); ++ e->type = t; ++ } ++ else ++ { ++ e = Expression::castTo(sc, t); ++ } ++ return e; ++} ++ + /* ==================== inferType ====================== */ + + /**************************************** + * Set type inference target ++ * t Target type + * flag 1: don't put an error when inference fails ++ * sc it is used for the semantic of t, when != NULL ++ * tparams template parameters should be inferred + */ + +-Expression *Expression::inferType(Type *t, int flag, TemplateParameters *tparams) ++Expression *Expression::inferType(Type *t, int flag, Scope *sc, TemplateParameters *tparams) + { + return this; + } + +-Expression *ArrayLiteralExp::inferType(Type *t, int flag, TemplateParameters *tparams) ++Expression *ArrayLiteralExp::inferType(Type *t, int flag, Scope *sc, TemplateParameters *tparams) + { + if (t) + { +@@ -1785,7 +1917,7 @@ Expression *ArrayLiteralExp::inferType(T + for (size_t i = 0; i < elements->dim; i++) + { Expression *e = (*elements)[i]; + if (e) +- { e = e->inferType(tn, flag, tparams); ++ { e = e->inferType(tn, flag, sc, tparams); + (*elements)[i] = e; + } + } +@@ -1794,7 +1926,7 @@ Expression *ArrayLiteralExp::inferType(T + return this; + } + +-Expression *AssocArrayLiteralExp::inferType(Type *t, int flag, TemplateParameters *tparams) ++Expression *AssocArrayLiteralExp::inferType(Type *t, int flag, Scope *sc, TemplateParameters *tparams) + { + if (t) + { +@@ -1806,14 +1938,14 @@ Expression *AssocArrayLiteralExp::inferT + for (size_t i = 0; i < keys->dim; i++) + { Expression *e = (*keys)[i]; + if (e) +- { e = e->inferType(ti, flag, tparams); ++ { e = e->inferType(ti, flag, sc, tparams); + (*keys)[i] = e; + } + } + for (size_t i = 0; i < values->dim; i++) + { Expression *e = (*values)[i]; + if (e) +- { e = e->inferType(tv, flag, tparams); ++ { e = e->inferType(tv, flag, sc, tparams); + (*values)[i] = e; + } + } +@@ -1822,7 +1954,7 @@ Expression *AssocArrayLiteralExp::inferT + return this; + } + +-Expression *FuncExp::inferType(Type *to, int flag, TemplateParameters *tparams) ++Expression *FuncExp::inferType(Type *to, int flag, Scope *sc, TemplateParameters *tparams) + { + if (!to) + return this; +@@ -1880,7 +2012,10 @@ Expression *FuncExp::inferType(Type *to, + Type *tprm = p->type; + if (tprm->reliesOnTident(tparams)) + goto L1; +- tprm = tprm->semantic(loc, td->scope); ++ if (sc) ++ tprm = tprm->semantic(loc, sc); ++ if (tprm->ty == Terror) ++ goto L1; + tiargs->push(tprm); + u = dim; // break inner loop + } +@@ -1936,13 +2071,13 @@ L1: + return e; + } + +-Expression *CondExp::inferType(Type *t, int flag, TemplateParameters *tparams) ++Expression *CondExp::inferType(Type *t, int flag, Scope *sc, TemplateParameters *tparams) + { + if (t) + { + t = t->toBasetype(); +- e1 = e1->inferType(t, flag, tparams); +- e2 = e2->inferType(t, flag, tparams); ++ e1 = e1->inferType(t, flag, sc, tparams); ++ e2 = e2->inferType(t, flag, sc, tparams); + } + return this; + } +@@ -1969,7 +2104,7 @@ Expression *BinExp::scaleFactor(Scope *s + if (!t->equals(t2b)) + e2 = e2->castTo(sc, t); + eoff = e2; +- e2 = new MulExp(loc, e2, new IntegerExp(0, stride, t)); ++ e2 = new MulExp(loc, e2, new IntegerExp(Loc(), stride, t)); + e2->type = t; + type = e1->type; + } +@@ -1985,7 +2120,7 @@ Expression *BinExp::scaleFactor(Scope *s + else + e = e1; + eoff = e; +- e = new MulExp(loc, e, new IntegerExp(0, stride, t)); ++ e = new MulExp(loc, e, new IntegerExp(Loc(), stride, t)); + e->type = t; + type = e2->type; + e1 = e2; +@@ -2070,6 +2205,14 @@ int typeMerge(Scope *sc, Expression *e, + assert(t1); + Type *t = t1; + ++ /* The start type of alias this type recursion. ++ * In following case, we should save A, and stop recursion ++ * if it appears again. ++ * X -> Y -> [A] -> B -> A -> B -> ... ++ */ ++ Type *att1 = NULL; ++ Type *att2 = NULL; ++ + //if (t1) printf("\tt1 = %s\n", t1->toChars()); + //if (t2) printf("\tt2 = %s\n", t2->toChars()); + #ifdef DEBUG +@@ -2089,13 +2232,13 @@ Lagain: + + if (t1b->ty == ty1) // if no promotions + { +- if (t1 == t2) ++ if (t1->equals(t2)) + { + t = t1; + goto Lret; + } + +- if (t1b == t2b) ++ if (t1b->equals(t2b)) + { + t = t1b; + goto Lret; +@@ -2117,8 +2260,14 @@ Lagain: + t1 = t1b; + t2 = t2b; + +- if (t1 == t2) ++ if (t1->ty == Ttuple || t2->ty == Ttuple) ++ goto Lincompatible; ++ ++ if (t1->equals(t2)) + { ++ // merging can not result in new enum type ++ if (t->ty == Tenum) ++ t = t1b; + } + else if ((t1->ty == Tpointer && t2->ty == Tpointer) || + (t1->ty == Tdelegate && t2->ty == Tdelegate)) +@@ -2127,7 +2276,7 @@ Lagain: + Type *t1n = t1->nextOf(); + Type *t2n = t2->nextOf(); + +- if (t1n == t2n) ++ if (t1n->equals(t2n)) + ; + else if (t1n->ty == Tvoid) // pointers to void are always compatible + t = t2; +@@ -2373,12 +2522,22 @@ Lcc: + } + else if (t1->ty == Tstruct && ((TypeStruct *)t1)->sym->aliasthis) + { ++ if (att1 && e1->type == att1) ++ goto Lincompatible; ++ if (!att1 && e1->type->checkAliasThisRec()) ++ att1 = e1->type; ++ //printf("att tmerge(c || c) e1 = %s\n", e1->type->toChars()); + e1 = resolveAliasThis(sc, e1); + t1 = e1->type; + continue; + } + else if (t2->ty == Tstruct && ((TypeStruct *)t2)->sym->aliasthis) + { ++ if (att2 && e2->type == att2) ++ goto Lincompatible; ++ if (!att2 && e2->type->checkAliasThisRec()) ++ att2 = e2->type; ++ //printf("att tmerge(c || c) e2 = %s\n", e2->type->toChars()); + e2 = resolveAliasThis(sc, e2); + t2 = e2->type; + continue; +@@ -2414,11 +2573,21 @@ Lcc: + Expression *e2b = NULL; + if (ts2->sym->aliasthis) + { ++ if (att2 && e2->type == att2) ++ goto Lincompatible; ++ if (!att2 && e2->type->checkAliasThisRec()) ++ att2 = e2->type; ++ //printf("att tmerge(s && s) e2 = %s\n", e2->type->toChars()); + e2b = resolveAliasThis(sc, e2); + i1 = e2b->implicitConvTo(t1); + } + if (ts1->sym->aliasthis) + { ++ if (att1 && e1->type == att1) ++ goto Lincompatible; ++ if (!att1 && e1->type->checkAliasThisRec()) ++ att1 = e1->type; ++ //printf("att tmerge(s && s) e1 = %s\n", e1->type->toChars()); + e1b = resolveAliasThis(sc, e1); + i2 = e1b->implicitConvTo(t2); + } +@@ -2446,6 +2615,11 @@ Lcc: + { + if (t1->ty == Tstruct && ((TypeStruct *)t1)->sym->aliasthis) + { ++ if (att1 && e1->type == att1) ++ goto Lincompatible; ++ if (!att1 && e1->type->checkAliasThisRec()) ++ att1 = e1->type; ++ //printf("att tmerge(s || s) e1 = %s\n", e1->type->toChars()); + e1 = resolveAliasThis(sc, e1); + t1 = e1->type; + t = t1; +@@ -2453,6 +2627,11 @@ Lcc: + } + if (t2->ty == Tstruct && ((TypeStruct *)t2)->sym->aliasthis) + { ++ if (att2 && e2->type == att2) ++ goto Lincompatible; ++ if (!att2 && e2->type->checkAliasThisRec()) ++ att2 = e2->type; ++ //printf("att tmerge(s || s) e2 = %s\n", e2->type->toChars()); + e2 = resolveAliasThis(sc, e2); + t2 = e2->type; + t = t2; +@@ -2595,6 +2774,11 @@ Expression *BinExp::typeCombine(Scope *s + + if (!typeMerge(sc, this, &type, &e1, &e2)) + goto Lerror; ++ // If the types have no value, return an error ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + return this; + + Lerror: +@@ -2634,6 +2818,8 @@ Expression *Expression::integralPromotio + case Tdchar: + e = e->castTo(sc, Type::tuns32); + break; ++ default: ++ break; + } + return e; + } +@@ -2648,8 +2834,8 @@ Expression *Expression::integralPromotio + + int arrayTypeCompatible(Loc loc, Type *t1, Type *t2) + { +- t1 = t1->toBasetype(); +- t2 = t2->toBasetype(); ++ t1 = t1->toBasetype()->merge2(); ++ t2 = t2->toBasetype()->merge2(); + + if ((t1->ty == Tarray || t1->ty == Tsarray || t1->ty == Tpointer) && + (t2->ty == Tarray || t2->ty == Tsarray || t2->ty == Tpointer)) +@@ -2712,7 +2898,7 @@ IntRange Expression::getIntRange() + + IntRange IntegerExp::getIntRange() + { +- return IntRange(value).cast(type) DUMP; ++ return IntRange(SignExtendedNumber(value)).cast(type) DUMP; + } + + IntRange CastExp::getIntRange() +--- a/src/gcc/d/dfrontend/class.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/class.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -32,16 +32,15 @@ + + /********************************* ClassDeclaration ****************************/ + +-ClassDeclaration *ClassDeclaration::classinfo; + ClassDeclaration *ClassDeclaration::object; + ClassDeclaration *ClassDeclaration::throwable; + ClassDeclaration *ClassDeclaration::exception; + ClassDeclaration *ClassDeclaration::errorException; + +-ClassDeclaration::ClassDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses) ++ClassDeclaration::ClassDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses, bool inObject) + : AggregateDeclaration(loc, id) + { +- static char msg[] = "only object.d can define this reserved class name"; ++ static const char msg[] = "only object.d can define this reserved class name"; + + if (baseclasses) + // Actually, this is a transfer +@@ -77,158 +76,160 @@ ClassDeclaration::ClassDeclaration(Loc l + if (id->toChars()[0] == 'T') + { + if (id == Id::TypeInfo) +- { if (Type::typeinfo) +- Type::typeinfo->error("%s", msg); +- Type::typeinfo = this; ++ { if (!inObject) ++ error("%s", msg); ++ Type::dtypeinfo = this; + } + + if (id == Id::TypeInfo_Class) +- { if (Type::typeinfoclass) +- Type::typeinfoclass->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoclass = this; + } + + if (id == Id::TypeInfo_Interface) +- { if (Type::typeinfointerface) +- Type::typeinfointerface->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfointerface = this; + } + + if (id == Id::TypeInfo_Struct) +- { if (Type::typeinfostruct) +- Type::typeinfostruct->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfostruct = this; + } + + if (id == Id::TypeInfo_Typedef) +- { if (Type::typeinfotypedef) +- Type::typeinfotypedef->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfotypedef = this; + } + + if (id == Id::TypeInfo_Pointer) +- { if (Type::typeinfopointer) +- Type::typeinfopointer->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfopointer = this; + } + + if (id == Id::TypeInfo_Array) +- { if (Type::typeinfoarray) +- Type::typeinfoarray->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoarray = this; + } + + if (id == Id::TypeInfo_StaticArray) +- { //if (Type::typeinfostaticarray) ++ { //if (!inObject) + //Type::typeinfostaticarray->error("%s", msg); + Type::typeinfostaticarray = this; + } + + if (id == Id::TypeInfo_AssociativeArray) +- { if (Type::typeinfoassociativearray) +- Type::typeinfoassociativearray->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoassociativearray = this; + } + + if (id == Id::TypeInfo_Enum) +- { if (Type::typeinfoenum) +- Type::typeinfoenum->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoenum = this; + } + + if (id == Id::TypeInfo_Function) +- { if (Type::typeinfofunction) +- Type::typeinfofunction->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfofunction = this; + } + + if (id == Id::TypeInfo_Delegate) +- { if (Type::typeinfodelegate) +- Type::typeinfodelegate->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfodelegate = this; + } + + if (id == Id::TypeInfo_Tuple) +- { if (Type::typeinfotypelist) +- Type::typeinfotypelist->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfotypelist = this; + } + + #if DMDV2 + if (id == Id::TypeInfo_Const) +- { if (Type::typeinfoconst) +- Type::typeinfoconst->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoconst = this; + } + + if (id == Id::TypeInfo_Invariant) +- { if (Type::typeinfoinvariant) +- Type::typeinfoinvariant->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoinvariant = this; + } + + if (id == Id::TypeInfo_Shared) +- { if (Type::typeinfoshared) +- Type::typeinfoshared->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfoshared = this; + } + + if (id == Id::TypeInfo_Wild) +- { if (Type::typeinfowild) +- Type::typeinfowild->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfowild = this; + } + + if (id == Id::TypeInfo_Vector) +- { if (Type::typeinfovector) +- Type::typeinfovector->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + Type::typeinfovector = this; + } + #endif + } + + if (id == Id::Object) +- { if (object) +- object->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + object = this; + } + + if (id == Id::Throwable) +- { if (throwable) +- throwable->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + throwable = this; + } + + if (id == Id::Exception) +- { if (exception) +- exception->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + exception = this; + } + + if (id == Id::Error) +- { if (errorException) +- errorException->error("%s", msg); ++ { if (!inObject) ++ error("%s", msg); + errorException = this; + } + +- //if (id == Id::ClassInfo) +- if (id == Id::TypeInfo_Class) +- { if (classinfo) +- classinfo->error("%s", msg); +- classinfo = this; +- } +- ++#if !MODULEINFO_IS_STRUCT ++ #ifdef DMDV2 ++ if (id == Id::ModuleInfo && !Module::moduleinfo) ++ Module::moduleinfo = this; ++ #else + if (id == Id::ModuleInfo) + { if (Module::moduleinfo) +- Module::moduleinfo->error("%s", msg); ++ error("%s", msg); + Module::moduleinfo = this; + } ++ #endif ++#endif + } + + com = 0; ++ cpp = 0; + isscope = 0; + isabstract = 0; + inuse = 0; ++ doAncestorsSemantic = SemanticStart; + } + + Dsymbol *ClassDeclaration::syntaxCopy(Dsymbol *s) +@@ -277,7 +278,7 @@ void ClassDeclaration::semantic(Scope *s + type = type->semantic(loc, sc); + handle = type; + +- if (!members) // if forward reference ++ if (!members) // if opaque declaration + { //printf("\tclass '%s' is forward referenced\n", toChars()); + return; + } +@@ -292,13 +293,13 @@ void ClassDeclaration::semantic(Scope *s + + Scope *scx = NULL; + if (scope) +- { sc = scope; ++ { ++ sc = scope; + scx = scope; // save so we don't make redundant copies + scope = NULL; + } + unsigned dprogress_save = Module::dprogress; +- +- int errors = global.gaggedErrors; ++ int errors = global.errors; + + if (sc->stc & STCdeprecated) + { +@@ -307,17 +308,21 @@ void ClassDeclaration::semantic(Scope *s + userAttributes = sc->userAttributes; + + if (sc->linkage == LINKcpp) +- error("cannot create C++ classes"); ++ cpp = 1; + + // Expand any tuples in baseclasses[] + for (size_t i = 0; i < baseclasses->dim; ) +- { BaseClass *b = (*baseclasses)[i]; ++ { ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); ++ ++ BaseClass *b = (*baseclasses)[i]; + b->type = b->type->semantic(loc, sc); +- Type *tb = b->type->toBasetype(); + ++ Type *tb = b->type->toBasetype(); + if (tb->ty == Ttuple) + { TypeTuple *tup = (TypeTuple *)tb; +- enum PROT protection = b->protection; ++ PROT protection = b->protection; + baseclasses->remove(i); + size_t dim = Parameter::dim(tup->arguments); + for (size_t j = 0; j < dim; j++) +@@ -332,21 +337,23 @@ void ClassDeclaration::semantic(Scope *s + + // See if there's a base class as first in baseclasses[] + if (baseclasses->dim) +- { TypeClass *tc; +- BaseClass *b; +- Type *tb; ++ { ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); + +- b = (*baseclasses)[0]; ++ BaseClass *b = (*baseclasses)[0]; + //b->type = b->type->semantic(loc, sc); +- tb = b->type->toBasetype(); ++ ++ Type *tb = b->type->toBasetype(); + if (tb->ty != Tclass) +- { if (b->type != Type::terror) ++ { ++ if (b->type != Type::terror) + error("base type must be class or interface, not %s", b->type->toChars()); + baseclasses->remove(0); + } + else + { +- tc = (TypeClass *)(tb); ++ TypeClass *tc = (TypeClass *)(tb); + + if (tc->sym->isDeprecated()) + { +@@ -374,7 +381,7 @@ void ClassDeclaration::semantic(Scope *s + } + if (!tc->sym->symtab || tc->sym->sizeok == SIZEOKnone) + { // Try to resolve forward reference +- if (/*sc->mustsemantic &&*/ tc->sym->scope) ++ if (/*doAncestorsSemantic == SemanticIn &&*/ tc->sym->scope) + tc->sym->semantic(NULL); + } + if (!tc->sym->symtab || tc->sym->scope || tc->sym->sizeok == SIZEOKnone) +@@ -402,19 +409,18 @@ void ClassDeclaration::semantic(Scope *s + // Treat the remaining entries in baseclasses as interfaces + // Check for errors, handle forward references + for (size_t i = (baseClass ? 1 : 0); i < baseclasses->dim; ) +- { TypeClass *tc; +- BaseClass *b; +- Type *tb; ++ { ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); + +- b = (*baseclasses)[i]; ++ BaseClass *b = (*baseclasses)[i]; + b->type = b->type->semantic(loc, sc); +- tb = b->type->toBasetype(); +- if (tb->ty == Tclass) +- tc = (TypeClass *)tb; +- else +- tc = NULL; ++ ++ Type *tb = b->type->toBasetype(); ++ TypeClass *tc = (tb->ty == Tclass) ? (TypeClass *)tb : NULL; + if (!tc || !tc->sym->isInterfaceDeclaration()) +- { if (b->type != Type::terror) ++ { ++ if (b->type != Type::terror) + error("base type must be interface, not %s", b->type->toChars()); + baseclasses->remove(i); + continue; +@@ -442,7 +448,7 @@ void ClassDeclaration::semantic(Scope *s + + if (!tc->sym->symtab) + { // Try to resolve forward reference +- if (/*sc->mustsemantic &&*/ tc->sym->scope) ++ if (/*doAncestorsSemantic == SemanticIn &&*/ tc->sym->scope) + tc->sym->semantic(NULL); + } + +@@ -462,64 +468,69 @@ void ClassDeclaration::semantic(Scope *s + } + i++; + } ++ if (doAncestorsSemantic == SemanticIn) ++ doAncestorsSemantic = SemanticDone; + + +- // If no base class, and this is not an Object, use Object as base class +- if (!baseClass && ident != Id::Object) ++ if (sizeok == SIZEOKnone) + { +- if (!object) ++ // If no base class, and this is not an Object, use Object as base class ++ if (!baseClass && ident != Id::Object && !cpp) + { +- error("missing or corrupt object.d"); +- fatal(); +- } +- +- Type *t = object->type; +- t = t->semantic(loc, sc)->toBasetype(); +- assert(t->ty == Tclass); +- TypeClass *tc = (TypeClass *)t; ++ if (!object) ++ { ++ error("missing or corrupt object.d"); ++ fatal(); ++ } + +- BaseClass *b = new BaseClass(tc, PROTpublic); +- baseclasses->shift(b); ++ Type *t = object->type; ++ t = t->semantic(loc, sc)->toBasetype(); ++ assert(t->ty == Tclass); ++ TypeClass *tc = (TypeClass *)t; + +- baseClass = tc->sym; +- assert(!baseClass->isInterfaceDeclaration()); +- b->base = baseClass; +- } ++ BaseClass *b = new BaseClass(tc, PROTpublic); ++ baseclasses->shift(b); + +- interfaces_dim = baseclasses->dim; +- interfaces = baseclasses->tdata(); ++ baseClass = tc->sym; ++ assert(!baseClass->isInterfaceDeclaration()); ++ b->base = baseClass; ++ } + ++ interfaces_dim = baseclasses->dim; ++ interfaces = baseclasses->tdata(); + +- if (baseClass) +- { +- if (baseClass->storage_class & STCfinal) +- error("cannot inherit from final class %s", baseClass->toChars()); ++ if (baseClass) ++ { ++ if (baseClass->storage_class & STCfinal) ++ error("cannot inherit from final class %s", baseClass->toChars()); + +- interfaces_dim--; +- interfaces++; ++ interfaces_dim--; ++ interfaces++; + +- // Copy vtbl[] from base class +- vtbl.setDim(baseClass->vtbl.dim); +- memcpy(vtbl.tdata(), baseClass->vtbl.tdata(), sizeof(void *) * vtbl.dim); ++ // Copy vtbl[] from base class ++ vtbl.setDim(baseClass->vtbl.dim); ++ memcpy(vtbl.tdata(), baseClass->vtbl.tdata(), sizeof(void *) * vtbl.dim); + +- // Inherit properties from base class +- com = baseClass->isCOMclass(); +- isscope = baseClass->isscope; +- vthis = baseClass->vthis; +- storage_class |= baseClass->storage_class & STC_TYPECTOR; +- } +- else +- { +- // No base class, so this is the root of the class hierarchy +- vtbl.setDim(0); +- vtbl.push(this); // leave room for classinfo as first member +- } ++ // Inherit properties from base class ++ com = baseClass->isCOMclass(); ++ if (baseClass->isCPPclass()) ++ cpp = 1; ++ isscope = baseClass->isscope; ++ vthis = baseClass->vthis; ++ enclosing = baseClass->enclosing; ++ storage_class |= baseClass->storage_class & STC_TYPECTOR; ++ } ++ else ++ { ++ // No base class, so this is the root of the class hierarchy ++ vtbl.setDim(0); ++ if (vtblOffset()) ++ vtbl.push(this); // leave room for classinfo as first member ++ } + +- protection = sc->protection; +- storage_class |= sc->stc; ++ protection = sc->protection; ++ storage_class |= sc->stc; + +- if (sizeok == SIZEOKnone) +- { + interfaceSemantic(sc); + + for (size_t i = 0; i < members->dim; i++) +@@ -532,8 +543,8 @@ void ClassDeclaration::semantic(Scope *s + * member which is a pointer to the enclosing scope. + */ + if (vthis) // if inheriting from nested class +- { // Use the base class's 'this' member +- isnested = true; ++ { ++ // Use the base class's 'this' member + if (storage_class & STCstatic) + error("static class cannot inherit from nested class %s", baseClass->toChars()); + if (toParent2() != baseClass->toParent2() && +@@ -554,57 +565,26 @@ void ClassDeclaration::semantic(Scope *s + baseClass->toChars(), + baseClass->toParent2()->toChars()); + } +- isnested = false; ++ enclosing = NULL; + } + } +- else if (!(storage_class & STCstatic)) +- { Dsymbol *s = toParent2(); +- if (s) +- { +- AggregateDeclaration *ad = s->isClassDeclaration(); +- FuncDeclaration *fd = s->isFuncDeclaration(); +- ++ else ++ makeNested(); + +- if (ad || fd) +- { isnested = true; +- Type *t; +- if (ad) +- t = ad->handle; +- else if (fd) +- { AggregateDeclaration *ad2 = fd->isMember2(); +- if (ad2) +- t = ad2->handle; +- else +- { +- t = Type::tvoidptr; +- } +- } +- else +- assert(0); +- if (t->ty == Tstruct) // ref to struct +- t = Type::tvoidptr; +- assert(!vthis); +- vthis = new ThisDeclaration(loc, t); +- members->push(vthis); +- } +- } +- } ++ if (storage_class & STCauto) ++ error("storage class 'auto' is invalid when declaring a class, did you mean to use 'scope'?"); ++ if (storage_class & STCscope) ++ isscope = 1; ++ if (storage_class & STCabstract) ++ isabstract = 1; + } + +- if (storage_class & STCauto) +- error("storage class 'auto' is invalid when declaring a class, did you mean to use 'scope'?"); +- if (storage_class & STCscope) +- isscope = 1; +- if (storage_class & STCabstract) +- isabstract = 1; +- + sc = sc->push(this); + //sc->stc &= ~(STCfinal | STCauto | STCscope | STCstatic | STCabstract | STCdeprecated | STC_TYPECTOR | STCtls | STCgshared); + //sc->stc |= storage_class & STC_TYPECTOR; + sc->stc &= STCsafe | STCtrusted | STCsystem; + sc->parent = this; + sc->inunion = 0; +- + if (isCOMclass()) + { + if (global.params.isWindows) +@@ -619,13 +599,19 @@ void ClassDeclaration::semantic(Scope *s + sc->explicitProtection = 0; + sc->structalign = STRUCTALIGN_DEFAULT; + if (baseClass) +- { sc->offset = baseClass->structsize; ++ { ++ sc->offset = baseClass->structsize; + alignsize = baseClass->alignsize; +-// if (isnested) ++ sc->offset = (sc->offset + alignsize - 1) & ~(alignsize - 1); ++// if (enclosing) + // sc->offset += Target::ptrsize; // room for uplevel context pointer + } + else +- { sc->offset = Target::ptrsize * 2; // allow room for __vptr and __monitor ++ { ++ if (cpp) ++ sc->offset = Target::ptrsize; // allow room for __vptr ++ else ++ sc->offset = Target::ptrsize * 2; // allow room for __vptr and __monitor + alignsize = Target::ptrsize; + } + sc->userAttributes = NULL; +@@ -638,50 +624,45 @@ void ClassDeclaration::semantic(Scope *s + * resolve individual members like enums. + */ + for (size_t i = 0; i < members_dim; i++) +- { Dsymbol *s = (*members)[i]; +- /* There are problems doing this in the general case because +- * Scope keeps track of things like 'offset' +- */ +- if (s->isEnumDeclaration() || +- (s->isAggregateDeclaration() && s->ident) || +- s->isTemplateMixin() || +- s->isAttribDeclaration() || +- s->isAliasDeclaration()) +- { +- //printf("[%d] setScope %s %s, sc = %p\n", i, s->kind(), s->toChars(), sc); +- s->setScope(sc); +- } ++ { ++ Dsymbol *s = (*members)[i]; ++ //printf("[%d] setScope %s %s, sc = %p\n", i, s->kind(), s->toChars(), sc); ++ s->setScope(sc); + } + + for (size_t i = 0; i < members_dim; i++) +- { Dsymbol *s = (*members)[i]; ++ { ++ Dsymbol *s = (*members)[i]; ++ ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); + s->semantic(sc); + } + + // Set the offsets of the fields and determine the size of the class + + unsigned offset = structsize; +- bool isunion = isUnionDeclaration() != NULL; + for (size_t i = 0; i < members->dim; i++) +- { Dsymbol *s = (*members)[i]; ++ { ++ Dsymbol *s = (*members)[i]; + s->setFieldOffset(this, &offset, false); + } + sc->offset = structsize; + +- if (global.gag && global.gaggedErrors != errors) +- { // The type is no good, yet the error messages were gagged. ++ if (global.errors != errors) ++ { ++ // The type is no good. + type = Type::terror; + } + + if (sizeok == SIZEOKfwd) // failed due to forward references +- { // semantic() failed due to forward references ++ { ++ // semantic() failed due to forward references + // Unwind what we did, and defer it for later +- + for (size_t i = 0; i < fields.dim; i++) +- { Dsymbol *s = fields[i]; +- VarDeclaration *vd = s->isVarDeclaration(); +- if (vd) +- vd->offset = 0; ++ { ++ if (VarDeclaration *v = fields[i]) ++ v->offset = 0; + } + fields.setDim(0); + structsize = 0; +@@ -707,43 +688,52 @@ void ClassDeclaration::semantic(Scope *s + /* Look for special member functions. + * They must be in this class, not in a base class. + */ +- ctor = search(0, Id::ctor, 0); +-#if DMDV1 +- if (ctor && (ctor->toParent() != this || !ctor->isCtorDeclaration())) +- ctor = NULL; +-#else ++ searchCtor(); + if (ctor && (ctor->toParent() != this || !(ctor->isCtorDeclaration() || ctor->isTemplateDeclaration()))) + ctor = NULL; // search() looks through ancestor classes +-#endif ++ if (!ctor && noDefaultCtor) ++ { ++ // A class object is always created by constructor, so this check is legitimate. ++ for (size_t i = 0; i < fields.dim; i++) ++ { ++ VarDeclaration *v = fields[i]->isVarDeclaration(); ++ if (v->storage_class & STCnodefaultctor) ++ ::error(v->loc, "field %s must be initialized in constructor", v->toChars()); ++ } ++ } + +-// dtor = (DtorDeclaration *)search(Id::dtor, 0); +-// if (dtor && dtor->toParent() != this) +-// dtor = NULL; +- +-// inv = (InvariantDeclaration *)search(Id::classInvariant, 0); +-// if (inv && inv->toParent() != this) +-// inv = NULL; ++ inv = buildInv(sc); + + // Can be in base class +- aggNew = (NewDeclaration *)search(0, Id::classNew, 0); +- aggDelete = (DeleteDeclaration *)search(0, Id::classDelete, 0); ++ aggNew = (NewDeclaration *)search(Loc(), Id::classNew, 0); ++ aggDelete = (DeleteDeclaration *)search(Loc(), Id::classDelete, 0); + +- // If this class has no constructor, but base class does, create +- // a constructor: ++ // If this class has no constructor, but base class has a default ++ // ctor, create a constructor: + // this() { } + if (!ctor && baseClass && baseClass->ctor) + { +- //printf("Creating default this(){} for class %s\n", toChars()); +- Type *tf = new TypeFunction(NULL, NULL, 0, LINKd, 0); +- CtorDeclaration *ctor = new CtorDeclaration(loc, 0, 0, tf); +- ctor->isImplicit = true; +- ctor->fbody = new CompoundStatement(0, new Statements()); +- members->push(ctor); +- ctor->addMember(sc, this, 1); +- *sc = scsave; // why? What about sc->nofree? +- ctor->semantic(sc); +- this->ctor = ctor; +- defaultCtor = ctor; ++ if (FuncDeclaration *fd = resolveFuncCall(loc, sc, baseClass->ctor, NULL, NULL, NULL, 1)) ++ { ++ //printf("Creating default this(){} for class %s\n", toChars()); ++ TypeFunction *btf = (TypeFunction *)fd->type; ++ TypeFunction *tf = new TypeFunction(NULL, NULL, 0, LINKd, fd->storage_class); ++ tf->purity = btf->purity; ++ tf->isnothrow = btf->isnothrow; ++ tf->trust = btf->trust; ++ CtorDeclaration *ctor = new CtorDeclaration(loc, Loc(), 0, tf); ++ ctor->fbody = new CompoundStatement(Loc(), new Statements()); ++ members->push(ctor); ++ ctor->addMember(sc, this, 1); ++ *sc = scsave; // why? What about sc->nofree? ++ ctor->semantic(sc); ++ this->ctor = ctor; ++ defaultCtor = ctor; ++ } ++ else ++ { ++ error("Cannot implicitly generate a default ctor when base class %s is missing a default ctor", baseClass->toPrettyChars()); ++ } + } + + #if 0 +@@ -782,13 +772,10 @@ void ClassDeclaration::semantic(Scope *s + Module::dprogress++; + + dtor = buildDtor(sc); +- if (Dsymbol *assign = search_function(this, Id::assign)) ++ if (FuncDeclaration *f = hasIdentityOpAssign(sc)) + { +- if (FuncDeclaration *f = hasIdentityOpAssign(sc, assign)) +- { +- if (!(f->storage_class & STCdisable)) +- error("identity assignment operator overload is illegal"); +- } ++ if (!(f->storage_class & STCdisable)) ++ error(f->loc, "identity assignment operator overload is illegal"); + } + sc->pop(); + +@@ -808,6 +795,13 @@ void ClassDeclaration::semantic(Scope *s + deferred->semantic2(sc); + deferred->semantic3(sc); + } ++ ++ if (type->ty == Tclass && ((TypeClass *)type)->sym != this) ++ { ++ error("failed semantic analysis"); ++ this->errors = true; ++ type = Type::terror; ++ } + } + + void ClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -824,7 +818,7 @@ void ClassDeclaration::toCBuffer(OutBuff + BaseClass *b = (*baseclasses)[i]; + + if (i) +- buf->writeByte(','); ++ buf->writestring(", "); + //buf->writestring(b->base->ident->toChars()); + b->type->toCBuffer(buf, NULL, hgs); + } +@@ -891,10 +885,10 @@ int ClassDeclaration::isBaseOf(ClassDecl + { + /* cd->baseClass might not be set if cd is forward referenced. + */ +- if (!cd->baseClass && cd->baseclasses->dim && !cd->isInterfaceDeclaration()) ++ if (!cd->baseClass && cd->scope && !cd->isInterfaceDeclaration()) + { + cd->semantic(NULL); +- if (!cd->baseClass) ++ if (!cd->baseClass && cd->scope) + cd->error("base class is forward referenced by %s", toChars()); + } + +@@ -928,19 +922,17 @@ Dsymbol *ClassDeclaration::search(Loc lo + Dsymbol *s; + //printf("%s.ClassDeclaration::search('%s')\n", toChars(), ident->toChars()); + +- if (scope && !symtab) +- { Scope *sc = scope; +- sc->mustsemantic++; +- // If speculatively gagged, ungag now. +- unsigned oldgag = global.gag; +- if (global.isSpeculativeGagging()) +- global.gag = 0; +- semantic(sc); +- global.gag = oldgag; +- sc->mustsemantic--; ++ //if (scope) printf("%s doAncestorsSemantic = %d\n", toChars(), doAncestorsSemantic); ++ if (scope && doAncestorsSemantic == SemanticStart) ++ { ++ // must semantic on base class/interfaces ++ doAncestorsSemantic = SemanticIn; ++ semantic(scope); ++ if (doAncestorsSemantic != SemanticDone) ++ doAncestorsSemantic = SemanticStart; + } + +- if (!members || !symtab) ++ if (!members || !symtab) // opaque or semantic() is not yet called + { + error("is forward referenced when looking for '%s'", ident->toChars()); + //*(char*)0=0; +@@ -982,6 +974,8 @@ ClassDeclaration *ClassDeclaration::sear + { + BaseClass *b = (*baseclasses)[i]; + ClassDeclaration *cdb = b->type->isClassHandle(); ++ if (!cdb) // Bugzilla 10616 ++ return NULL; + if (cdb->ident->equals(ident)) + return cdb; + cdb = cdb->searchBase(loc, ident); +@@ -997,18 +991,22 @@ ClassDeclaration *ClassDeclaration::sear + */ + + #if DMDV2 +-int isf(void *param, FuncDeclaration *fd) ++int isf(void *param, Dsymbol *s) + { ++ FuncDeclaration *fd = s->isFuncDeclaration(); ++ if (!fd) ++ return 0; + //printf("param = %p, fd = %p %s\n", param, fd, fd->toChars()); +- return param == fd; ++ return (RootObject *)param == fd; + } + + int ClassDeclaration::isFuncHidden(FuncDeclaration *fd) + { + //printf("ClassDeclaration::isFuncHidden(class = %s, fd = %s)\n", toChars(), fd->toChars()); +- Dsymbol *s = search(0, fd->ident, 4|2); ++ Dsymbol *s = search(Loc(), fd->ident, 4|2); + if (!s) +- { //printf("not found\n"); ++ { ++ //printf("not found\n"); + /* Because, due to a hack, if there are multiple definitions + * of fd->ident, NULL is returned. + */ +@@ -1019,9 +1017,10 @@ int ClassDeclaration::isFuncHidden(FuncD + if (os) + { + for (size_t i = 0; i < os->a.dim; i++) +- { Dsymbol *s2 = os->a[i]; ++ { ++ Dsymbol *s2 = os->a[i]; + FuncDeclaration *f2 = s2->isFuncDeclaration(); +- if (f2 && overloadApply(f2, &isf, fd)) ++ if (f2 && overloadApply(f2, (void *)fd, &isf)) + return 0; + } + return 1; +@@ -1030,7 +1029,7 @@ int ClassDeclaration::isFuncHidden(FuncD + { + FuncDeclaration *fdstart = s->isFuncDeclaration(); + //printf("%s fdstart = %p\n", s->kind(), fdstart); +- if (overloadApply(fdstart, &isf, fd)) ++ if (overloadApply(fdstart, (void *)fd, &isf)) + return 0; + + return !fd->parent->isTemplateMixin(); +@@ -1139,9 +1138,13 @@ void ClassDeclaration::interfaceSemantic + if (b->base->isCOMinterface()) + com = 1; + ++#if 1 + if (b->base->isCPPinterface() && id) + id->cpp = 1; +- ++#else ++ if (b->base->isCPPinterface()) ++ cpp = 1; ++#endif + vtblInterfaces->push(b); + b->copyBaseInterfaces(vtblInterfaces); + } +@@ -1161,6 +1164,11 @@ int ClassDeclaration::isCOMinterface() + } + + #if DMDV2 ++int ClassDeclaration::isCPPclass() ++{ ++ return cpp; ++} ++ + int ClassDeclaration::isCPPinterface() + { + return 0; +@@ -1171,10 +1179,10 @@ int ClassDeclaration::isCPPinterface() + /**************************************** + */ + +-int ClassDeclaration::isAbstract() ++bool ClassDeclaration::isAbstract() + { + if (isabstract) +- return TRUE; ++ return true; + for (size_t i = 1; i < vtbl.dim; i++) + { + FuncDeclaration *fd = vtbl[i]->isFuncDeclaration(); +@@ -1183,10 +1191,10 @@ int ClassDeclaration::isAbstract() + if (!fd || fd->isAbstract()) + { + isabstract |= 1; +- return TRUE; ++ return true; + } + } +- return FALSE; ++ return false; + } + + +@@ -1195,11 +1203,14 @@ int ClassDeclaration::isAbstract() + * For class objects, yes, this is where the classinfo ptr goes. + * For COM interfaces, no. + * For non-COM interfaces, yes, this is where the Interface ptr goes. ++ * Returns: ++ * 0 vtbl[0] is first virtual function pointer ++ * 1 vtbl[0] is classinfo/interfaceinfo pointer + */ + + int ClassDeclaration::vtblOffset() + { +- return 1; ++ return cpp ? 0 : 1; + } + + /**************************************** +@@ -1223,8 +1234,6 @@ void ClassDeclaration::addLocalClass(Cla + InterfaceDeclaration::InterfaceDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses) + : ClassDeclaration(loc, id, baseclasses) + { +- com = 0; +- cpp = 0; + if (id == Id::IUnknown) // IUnknown is the root of all COM interfaces + { com = 1; + cpp = 1; // IUnknown is also a C++ interface +@@ -1271,12 +1280,13 @@ void InterfaceDeclaration::semantic(Scop + + Scope *scx = NULL; + if (scope) +- { sc = scope; ++ { ++ sc = scope; + scx = scope; // save so we don't make redundant copies + scope = NULL; + } + +- int errors = global.gaggedErrors; ++ int errors = global.errors; + + if (sc->stc & STCdeprecated) + { +@@ -1286,13 +1296,17 @@ void InterfaceDeclaration::semantic(Scop + + // Expand any tuples in baseclasses[] + for (size_t i = 0; i < baseclasses->dim; ) +- { BaseClass *b = (*baseclasses)[i]; ++ { ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); ++ ++ BaseClass *b = (*baseclasses)[i]; + b->type = b->type->semantic(loc, sc); +- Type *tb = b->type->toBasetype(); + ++ Type *tb = b->type->toBasetype(); + if (tb->ty == Ttuple) + { TypeTuple *tup = (TypeTuple *)tb; +- enum PROT protection = b->protection; ++ PROT protection = b->protection; + baseclasses->remove(i); + size_t dim = Parameter::dim(tup->arguments); + for (size_t j = 0; j < dim; j++) +@@ -1310,19 +1324,18 @@ void InterfaceDeclaration::semantic(Scop + + // Check for errors, handle forward references + for (size_t i = 0; i < baseclasses->dim; ) +- { TypeClass *tc; +- BaseClass *b; +- Type *tb; ++ { ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); + +- b = (*baseclasses)[i]; ++ BaseClass *b = (*baseclasses)[i]; + b->type = b->type->semantic(loc, sc); +- tb = b->type->toBasetype(); +- if (tb->ty == Tclass) +- tc = (TypeClass *)tb; +- else +- tc = NULL; ++ ++ Type *tb = b->type->toBasetype(); ++ TypeClass *tc = (tb->ty == Tclass) ? (TypeClass *)tb : NULL; + if (!tc || !tc->sym->isInterfaceDeclaration()) +- { if (b->type != Type::terror) ++ { ++ if (b->type != Type::terror) + error("base type must be interface, not %s", b->type->toChars()); + baseclasses->remove(i); + continue; +@@ -1346,7 +1359,7 @@ void InterfaceDeclaration::semantic(Scop + } + if (!b->base->symtab) + { // Try to resolve forward reference +- if (sc->mustsemantic && b->base->scope) ++ if (doAncestorsSemantic == SemanticIn && b->base->scope) + b->base->semantic(NULL); + } + if (!b->base->symtab || b->base->scope || b->base->inuse) +@@ -1366,6 +1379,8 @@ void InterfaceDeclaration::semantic(Scop + #endif + i++; + } ++ if (doAncestorsSemantic == SemanticIn) ++ doAncestorsSemantic = SemanticDone; + + interfaces_dim = baseclasses->dim; + interfaces = baseclasses->tdata(); +@@ -1417,9 +1432,9 @@ void InterfaceDeclaration::semantic(Scop + sc = sc->push(this); + sc->stc &= STCsafe | STCtrusted | STCsystem; + sc->parent = this; +- if (isCOMinterface()) ++ if (com) + sc->linkage = LINKwindows; +- else if (isCPPinterface()) ++ else if (cpp) + sc->linkage = LINKcpp; + sc->structalign = STRUCTALIGN_DEFAULT; + sc->protection = PROTpublic; +@@ -1448,11 +1463,14 @@ void InterfaceDeclaration::semantic(Scop + for (size_t i = 0; i < members->dim; i++) + { + Dsymbol *s = (*members)[i]; ++ ++ // Ungag errors when not speculative ++ Ungag ungag = ungagSpeculative(); + s->semantic(sc); + } + +- if (global.gag && global.gaggedErrors != errors) +- { // The type is no good, yet the error messages were gagged. ++ if (global.errors != errors) ++ { // The type is no good. + type = Type::terror; + } + +@@ -1460,6 +1478,13 @@ void InterfaceDeclaration::semantic(Scop + //members->print(); + sc->pop(); + //printf("-InterfaceDeclaration::semantic(%s), type = %p\n", toChars(), type); ++ ++ if (type->ty == Tclass && ((TypeClass *)type)->sym != this) ++ { ++ error("failed semantic analysis"); ++ this->errors = true; ++ type = Type::terror; ++ } + } + + +@@ -1594,7 +1619,7 @@ BaseClass::BaseClass() + memset(this, 0, sizeof(BaseClass)); + } + +-BaseClass::BaseClass(Type *type, enum PROT protection) ++BaseClass::BaseClass(Type *type, PROT protection) + { + //printf("BaseClass(this = %p, '%s')\n", this, type->toChars()); + this->type = type; +@@ -1619,7 +1644,6 @@ BaseClass::BaseClass(Type *type, enum PR + + int BaseClass::fillVtbl(ClassDeclaration *cd, FuncDeclarations *vtbl, int newinstance) + { +- ClassDeclaration *id = base; + int result = 0; + + //printf("BaseClass::fillVtbl(this='%s', cd='%s')\n", base->toChars(), cd->toChars()); +@@ -1651,8 +1675,7 @@ int BaseClass::fillVtbl(ClassDeclaration + if (newinstance && + fd->toParent() != cd && + ifd->toParent() == base) +- cd->error("interface function %s.%s is not implemented", +- id->toChars(), ifd->ident->toChars()); ++ cd->error("interface function '%s' is not implemented", ifd->toFullSignature()); + + if (fd->toParent() == cd) + result = 1; +@@ -1662,9 +1685,7 @@ int BaseClass::fillVtbl(ClassDeclaration + //printf(" not found\n"); + // BUG: should mark this class as abstract? + if (!cd->isAbstract()) +- cd->error("interface function %s.%s%s isn't implemented", +- id->toChars(), ifd->ident->toChars(), +- Parameter::argsTypesToChars(tf->parameters, tf->varargs)); ++ cd->error("interface function '%s' is not implemented", ifd->toFullSignature()); + + fd = NULL; + } +--- a/src/gcc/d/dfrontend/clone.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/clone.c 2014-04-01 16:32:51.000000000 +0100 +@@ -25,43 +25,71 @@ + + + /******************************************* ++ * Merge function attributes pure, nothrow, @safe, and @disable ++ */ ++StorageClass mergeFuncAttrs(StorageClass s1, StorageClass s2) ++{ ++ StorageClass stc = 0; ++ StorageClass sa = s1 & s2; ++ StorageClass so = s1 | s2; ++ ++ if (so & STCsystem) ++ stc |= STCsystem; ++ else if (sa & STCtrusted) ++ stc |= STCtrusted; ++ else if ((so & (STCtrusted | STCsafe)) == (STCtrusted | STCsafe)) ++ stc |= STCtrusted; ++ else if (sa & STCsafe) ++ stc |= STCsafe; ++ ++ if (sa & STCpure) ++ stc |= STCpure; ++ ++ if (sa & STCnothrow) ++ stc |= STCnothrow; ++ ++ if (so & STCdisable) ++ stc |= STCdisable; ++ ++ return stc; ++} ++ ++/******************************************* + * Check given opAssign symbol is really identity opAssign or not. + */ + +-FuncDeclaration *AggregateDeclaration::hasIdentityOpAssign(Scope *sc, Dsymbol *assign) ++FuncDeclaration *AggregateDeclaration::hasIdentityOpAssign(Scope *sc) + { ++ Dsymbol *assign = search_function(this, Id::assign); + if (assign) + { +- assert(assign->ident == Id::assign); +- + /* check identity opAssign exists + */ + Expression *er = new NullExp(loc, type); // dummy rvalue + Expression *el = new IdentifierExp(loc, Id::p); // dummy lvalue + el->type = type; +- Expressions ar; ar.push(er); +- Expressions al; al.push(el); ++ Expressions *a = new Expressions(); ++ a->setDim(1); + FuncDeclaration *f = NULL; +- if (FuncDeclaration *fd = assign->isFuncDeclaration()) ++ ++ unsigned errors = global.startGagging(); // Do not report errors, even if the ++ unsigned oldspec = global.speculativeGag; // template opAssign fbody makes it. ++ global.speculativeGag = global.gag; ++ sc = sc->push(); ++ sc->speculative = true; ++ ++ for (size_t i = 0; i < 2; i++) + { +- f = fd->overloadResolve(loc, er, &ar, 1); +- if (!f) f = fd->overloadResolve(loc, er, &al, 1); ++ (*a)[0] = (i == 0 ? er : el); ++ f = resolveFuncCall(loc, sc, assign, NULL, type, a, 1); ++ if (f) ++ break; + } +- if (TemplateDeclaration *td = assign->isTemplateDeclaration()) +- { +- unsigned errors = global.startGagging(); // Do not report errors, even if the +- unsigned oldspec = global.speculativeGag; // template opAssign fbody makes it. +- global.speculativeGag = global.gag; +- Scope *sc2 = sc->push(); +- sc2->speculative = true; + +- f = td->deduceFunctionTemplate(sc2, loc, NULL, er, &ar, 1); +- if (!f) f = td->deduceFunctionTemplate(sc2, loc, NULL, er, &al, 1); ++ sc = sc->pop(); ++ global.speculativeGag = oldspec; ++ global.endGagging(errors); + +- sc2->pop(); +- global.speculativeGag = oldspec; +- global.endGagging(errors); +- } + if (f) + { + int varargs; +@@ -104,16 +132,13 @@ int StructDeclaration::needOpAssign() + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + if (v->storage_class & STCref) + continue; +- Type *tv = v->type->toBasetype(); +- while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- tv = tv->nextOf()->toBasetype(); +- } ++ Type *tv = v->type->baseElemOf(); + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->needOpAssign()) + goto Lneed; +@@ -133,41 +158,80 @@ Lneed: + * Build opAssign for struct. + * ref S opAssign(S s) { ... } + * +- * Note that s will be constructed onto the stack, probably copy-constructed. +- * Then, the body is: +- * S tmp = this; // bit copy +- * this = s; // bit copy +- * tmp.dtor(); ++ * Note that s will be constructed onto the stack, and probably ++ * copy-constructed in caller site. ++ * ++ * If S has copy copy construction and/or destructor, ++ * the body will make bit-wise object swap: ++ * S __tmp = this; // bit copy ++ * this = s; // bit copy ++ * __tmp.dtor(); + * Instead of running the destructor on s, run it on tmp instead. ++ * ++ * Otherwise, the body will make member-wise assignments: ++ * Then, the body is: ++ * this.field1 = s.field1; ++ * this.field2 = s.field2; ++ * ...; + */ + + FuncDeclaration *StructDeclaration::buildOpAssign(Scope *sc) + { +- Dsymbol *assign = search_function(this, Id::assign); +- if (assign) ++ if (FuncDeclaration *f = hasIdentityOpAssign(sc)) + { +- if (FuncDeclaration *f = hasIdentityOpAssign(sc, assign)) +- return f; +- // Even if non-identity opAssign is defined, built-in identity opAssign +- // will be defined. (Is this an exception of operator overloading rule?) ++ hasIdentityAssign = 1; ++ return f; + } ++ // Even if non-identity opAssign is defined, built-in identity opAssign ++ // will be defined. + + if (!needOpAssign()) + return NULL; + + //printf("StructDeclaration::buildOpAssign() %s\n", toChars()); ++ StorageClass stc = STCsafe | STCnothrow | STCpure; ++ Loc declLoc = this->loc; ++ Loc loc = Loc(); // internal code should have no loc to prevent coverage ++ ++ if (dtor || postblit) ++ { ++ if (dtor) ++ stc = mergeFuncAttrs(stc, dtor->storage_class); ++ } ++ else ++ { ++ for (size_t i = 0; i < fields.dim; i++) ++ { ++ Dsymbol *s = fields[i]; ++ VarDeclaration *v = s->isVarDeclaration(); ++ assert(v && v->isField()); ++ if (v->storage_class & STCref) ++ continue; ++ Type *tv = v->type->baseElemOf(); ++ if (tv->ty == Tstruct) ++ { ++ TypeStruct *ts = (TypeStruct *)tv; ++ StructDeclaration *sd = ts->sym; ++ if (FuncDeclaration *f = sd->hasIdentityOpAssign(sc)) ++ stc = mergeFuncAttrs(stc, f->storage_class); ++ } ++ } ++ } + + Parameters *fparams = new Parameters; + fparams->push(new Parameter(STCnodtor, type, Id::p, NULL)); +- Type *ftype = new TypeFunction(fparams, handle, FALSE, LINKd); +- ((TypeFunction *)ftype)->isref = 1; ++ Type *tf = new TypeFunction(fparams, handle, 0, LINKd, stc | STCref); + +- FuncDeclaration *fop = new FuncDeclaration(loc, 0, Id::assign, STCundefined, ftype); ++ FuncDeclaration *fop = new FuncDeclaration(declLoc, Loc(), Id::assign, stc, tf); + + Expression *e = NULL; +- if (postblit) +- { /* Swap: +- * tmp = *this; *this = s; tmp.dtor(); ++ if (stc & STCdisable) ++ { ++ } ++ else if (dtor || postblit) ++ { ++ /* Do swap this and rhs ++ * tmp = this; this = s; tmp.dtor(); + */ + //printf("\tswap copy\n"); + Identifier *idtmp = Lexer::uniqueId("__tmp"); +@@ -175,20 +239,20 @@ FuncDeclaration *StructDeclaration::buil + AssignExp *ec = NULL; + if (dtor) + { +- tmp = new VarDeclaration(0, type, idtmp, new VoidInitializer(0)); ++ tmp = new VarDeclaration(loc, type, idtmp, new VoidInitializer(loc)); + tmp->noscope = 1; + tmp->storage_class |= STCctfe; +- e = new DeclarationExp(0, tmp); +- ec = new AssignExp(0, +- new VarExp(0, tmp), +- new ThisExp(0) ++ e = new DeclarationExp(loc, tmp); ++ ec = new AssignExp(loc, ++ new VarExp(loc, tmp), ++ new ThisExp(loc) + ); + ec->op = TOKblit; + e = Expression::combine(e, ec); + } +- ec = new AssignExp(0, +- new ThisExp(0), +- new IdentifierExp(0, Id::p)); ++ ec = new AssignExp(loc, ++ new ThisExp(loc), ++ new IdentifierExp(loc, Id::p)); + ec->op = TOKblit; + e = Expression::combine(e, ec); + if (dtor) +@@ -196,38 +260,44 @@ FuncDeclaration *StructDeclaration::buil + /* Instead of running the destructor on s, run it + * on tmp. This avoids needing to copy tmp back in to s. + */ +- Expression *ec2 = new DotVarExp(0, new VarExp(0, tmp), dtor, 0); +- ec2 = new CallExp(0, ec2); ++ Expression *ec2 = new DotVarExp(loc, new VarExp(loc, tmp), dtor, 0); ++ ec2 = new CallExp(loc, ec2); + e = Expression::combine(e, ec2); + } + } + else +- { /* Do memberwise copy ++ { ++ /* Do memberwise copy + */ + //printf("\tmemberwise copy\n"); + for (size_t i = 0; i < fields.dim; i++) + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + // this.v = s.v; +- AssignExp *ec = new AssignExp(0, +- new DotVarExp(0, new ThisExp(0), v, 0), +- new DotVarExp(0, new IdentifierExp(0, Id::p), v, 0)); ++ AssignExp *ec = new AssignExp(loc, ++ new DotVarExp(loc, new ThisExp(loc), v, 0), ++ new DotVarExp(loc, new IdentifierExp(loc, Id::p), v, 0)); + e = Expression::combine(e, ec); + } + } +- Statement *s1 = new ExpStatement(0, e); ++ if (e) ++ { ++ Statement *s1 = new ExpStatement(loc, e); + +- /* Add: +- * return this; +- */ +- e = new ThisExp(0); +- Statement *s2 = new ReturnStatement(0, e); ++ /* Add: ++ * return this; ++ */ ++ e = new ThisExp(loc); ++ Statement *s2 = new ReturnStatement(loc, e); + +- fop->fbody = new CompoundStatement(0, s1, s2); ++ fop->fbody = new CompoundStatement(loc, s1, s2); ++ } + + Dsymbol *s = fop; ++#if 1 // workaround until fixing issue 1528 ++ Dsymbol *assign = search_function(this, Id::assign); + if (assign && assign->isTemplateDeclaration()) + { + // Wrap a template around the function declaration +@@ -238,6 +308,7 @@ FuncDeclaration *StructDeclaration::buil + new TemplateDeclaration(assign->loc, fop->ident, tpl, NULL, decldefs, 0); + s = tempdecl; + } ++#endif + members->push(s); + s->addMember(sc, this, 1); + this->hasIdentityAssign = 1; // temporary mark identity assignable +@@ -281,10 +352,8 @@ int StructDeclaration::needOpEquals() + if (hasIdentityEquals) + goto Lneed; + +-#if 0 + if (isUnionDeclaration()) + goto Ldontneed; +-#endif + + /* If any of the fields has an opEquals, then we + * need it too. +@@ -293,24 +362,22 @@ int StructDeclaration::needOpEquals() + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + if (v->storage_class & STCref) + continue; + Type *tv = v->type->toBasetype(); +-#if 0 + if (tv->isfloating()) + goto Lneed; + if (tv->ty == Tarray) + goto Lneed; ++ if (tv->ty == Taarray) ++ goto Lneed; + if (tv->ty == Tclass) + goto Lneed; +-#endif +- while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- tv = tv->nextOf()->toBasetype(); +- } ++ tv = tv->baseElemOf(); + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->needOpEquals()) + goto Lneed; +@@ -326,180 +393,299 @@ Lneed: + #undef X + } + ++FuncDeclaration *AggregateDeclaration::hasIdentityOpEquals(Scope *sc) ++{ ++ Dsymbol *eq = search_function(this, Id::eq); ++ if (eq) ++ { ++ /* check identity opEquals exists ++ */ ++ Expression *er = new NullExp(loc, NULL); // dummy rvalue ++ Expression *el = new IdentifierExp(loc, Id::p); // dummy lvalue ++ Expressions *a = new Expressions(); ++ a->setDim(1); ++ for (size_t i = 0; ; i++) ++ { ++ Type *tthis; ++ if (i == 0) tthis = type; ++ if (i == 1) tthis = type->constOf(); ++ if (i == 2) tthis = type->immutableOf(); ++ if (i == 3) tthis = type->sharedOf(); ++ if (i == 4) tthis = type->sharedConstOf(); ++ if (i == 5) break; ++ FuncDeclaration *f = NULL; ++ ++ unsigned errors = global.startGagging(); // Do not report errors, even if the ++ unsigned oldspec = global.speculativeGag; // template opAssign fbody makes it. ++ global.speculativeGag = global.gag; ++ sc = sc->push(); ++ sc->speculative = true; ++ ++ for (size_t j = 0; j < 2; j++) ++ { ++ (*a)[0] = (j == 0 ? er : el); ++ (*a)[0]->type = tthis; ++ f = resolveFuncCall(loc, sc, eq, NULL, tthis, a, 1); ++ if (f) ++ break; ++ } ++ ++ sc = sc->pop(); ++ global.speculativeGag = oldspec; ++ global.endGagging(errors); ++ ++ if (f) ++ return f; ++ } ++ } ++ return NULL; ++} ++ + /****************************************** + * Build opEquals for struct. + * const bool opEquals(const S s) { ... } ++ * ++ * By fixing bugzilla 3789, opEquals is changed to be never implicitly generated. ++ * Now, struct objects comparison s1 == s2 is translated to: ++ * s1.tupleof == s2.tupleof ++ * to calculate structural equality. See EqualExp::semantic. + */ + + FuncDeclaration *StructDeclaration::buildOpEquals(Scope *sc) + { +- Dsymbol *eq = search_function(this, Id::eq); +- if (eq) ++ if (FuncDeclaration *f = hasIdentityOpEquals(sc)) + { +- for (size_t i = 0; i <= 1; i++) +- { +- Expression *e = +- i == 0 ? new NullExp(loc, type->constOf()) // dummy rvalue +- : type->constOf()->defaultInit(); // dummy lvalue +- Expressions *arguments = new Expressions(); +- arguments->push(e); ++ hasIdentityEquals = 1; ++ } ++ return NULL; ++} + +- // check identity opEquals exists +- FuncDeclaration *fd = eq->isFuncDeclaration(); +- if (fd) +- { fd = fd->overloadResolve(loc, e, arguments, 1); +- if (fd && !(fd->storage_class & STCdisable)) +- return fd; +- } ++/****************************************** ++ * Build __xopEquals for TypeInfo_Struct ++ * static bool __xopEquals(ref const S p, ref const S q) ++ * { ++ * return p == q; ++ * } ++ * ++ * This is called by TypeInfo.equals(p1, p2). If the struct does not support ++ * const objects comparison, it will throw "not implemented" Error in runtime. ++ */ ++ ++FuncDeclaration *StructDeclaration::buildXopEquals(Scope *sc) ++{ ++ if (!needOpEquals()) ++ return NULL; // bitwise comparison would work + +- TemplateDeclaration *td = eq->isTemplateDeclaration(); +- if (td) +- { fd = td->deduceFunctionTemplate(sc, loc, NULL, e, arguments, 1); +- if (fd && !(fd->storage_class & STCdisable)) +- return fd; ++ //printf("StructDeclaration::buildXopEquals() %s\n", toChars()); ++ if (Dsymbol *eq = search_function(this, Id::eq)) ++ { ++ if (FuncDeclaration *fd = eq->isFuncDeclaration()) ++ { ++ TypeFunction *tfeqptr; ++ { ++ Scope sc; ++ ++ /* const bool opEquals(ref const S s); ++ */ ++ Parameters *parameters = new Parameters; ++ parameters->push(new Parameter(STCref | STCconst, type, NULL, NULL)); ++ tfeqptr = new TypeFunction(parameters, Type::tbool, 0, LINKd); ++ tfeqptr->mod = MODconst; ++ tfeqptr = (TypeFunction *)tfeqptr->semantic(Loc(), &sc); + } ++ fd = fd->overloadExactMatch(tfeqptr); ++ if (fd) ++ return fd; + } +- return NULL; + } + +- if (!needOpEquals()) +- return NULL; ++ if (!xerreq) ++ { ++ Identifier *id = Lexer::idPool("_xopEquals"); ++ Expression *e = new IdentifierExp(loc, Id::empty); ++ e = new DotIdExp(loc, e, Id::object); ++ e = new DotIdExp(loc, e, id); ++ e = e->semantic(sc); ++ Dsymbol *s = getDsymbol(e); ++ if (!s) ++ { ++ ::error(Loc(), "ICE: %s not found in object module. You must update druntime", id->toChars()); ++ fatal(); ++ } ++ assert(s); ++ xerreq = s->isFuncDeclaration(); ++ } + +- //printf("StructDeclaration::buildOpEquals() %s\n", toChars()); ++ Loc declLoc = Loc(); // loc is unnecessary so __xopEquals is never called directly ++ Loc loc = Loc(); // loc is unnecessary so errors are gagged + + Parameters *parameters = new Parameters; +- parameters->push(new Parameter(STCin, type, Id::p, NULL)); ++ parameters->push(new Parameter(STCref | STCconst, type, Id::p, NULL)); ++ parameters->push(new Parameter(STCref | STCconst, type, Id::q, NULL)); + TypeFunction *tf = new TypeFunction(parameters, Type::tbool, 0, LINKd); +- tf->mod = MODconst; + tf = (TypeFunction *)tf->semantic(loc, sc); + +- FuncDeclaration *fop = new FuncDeclaration(loc, 0, Id::eq, STCundefined, tf); +- +- Expression *e = NULL; +- /* Do memberwise compare +- */ +- //printf("\tmemberwise compare\n"); +- for (size_t i = 0; i < fields.dim; i++) +- { +- Dsymbol *s = fields[i]; +- VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); +- if (v->storage_class & STCref) +- assert(0); // what should we do with this? +- // this.v == s.v; +- EqualExp *ec = new EqualExp(TOKequal, loc, +- new DotVarExp(loc, new ThisExp(loc), v, 0), +- new DotVarExp(loc, new IdentifierExp(loc, Id::p), v, 0)); +- if (e) +- e = new AndAndExp(loc, e, ec); +- else +- e = ec; +- } +- if (!e) +- e = new IntegerExp(loc, 1, Type::tbool); +- fop->fbody = new ReturnStatement(loc, e); ++ Identifier *id = Lexer::idPool("__xopEquals"); ++ FuncDeclaration *fop = new FuncDeclaration(declLoc, Loc(), id, STCstatic, tf); + +- members->push(fop); +- fop->addMember(sc, this, 1); ++ Expression *e1 = new IdentifierExp(loc, Id::p); ++ Expression *e2 = new IdentifierExp(loc, Id::q); ++ Expression *e = new EqualExp(TOKequal, loc, e1, e2); + +- sc = sc->push(); +- sc->stc = 0; +- sc->linkage = LINKd; ++ fop->fbody = new ReturnStatement(loc, e); + +- fop->semantic(sc); ++ unsigned errors = global.startGagging(); // Do not report errors ++ Scope *sc2 = sc->push(); ++ sc2->stc = 0; ++ sc2->linkage = LINKd; + +- sc->pop(); ++ fop->semantic(sc2); ++ fop->semantic2(sc2); + +- //printf("-StructDeclaration::buildOpEquals() %s\n", toChars()); ++ sc2->pop(); ++ if (global.endGagging(errors)) // if errors happened ++ fop = xerreq; + + return fop; + } + + /****************************************** +- * Build __xopEquals for TypeInfo_Struct +- * bool __xopEquals(in void* p, in void* q) { ... } ++ * Build __xopCmp for TypeInfo_Struct ++ * static bool __xopCmp(ref const S p, ref const S q) ++ * { ++ * return p.opCmp(q); ++ * } ++ * ++ * This is called by TypeInfo.compare(p1, p2). If the struct does not support ++ * const objects comparison, it will throw "not implemented" Error in runtime. + */ + +-FuncDeclaration *StructDeclaration::buildXopEquals(Scope *sc) ++FuncDeclaration *StructDeclaration::buildXopCmp(Scope *sc) + { +- if (!search_function(this, Id::eq)) ++ //printf("StructDeclaration::buildXopCmp() %s\n", toChars()); ++ if (Dsymbol *cmp = search_function(this, Id::cmp)) ++ { ++ if (FuncDeclaration *fd = cmp->isFuncDeclaration()) ++ { ++ TypeFunction *tfcmpptr; ++ { ++ Scope sc; ++ ++ /* const int opCmp(ref const S s); ++ */ ++ Parameters *parameters = new Parameters; ++ parameters->push(new Parameter(STCref | STCconst, type, NULL, NULL)); ++ tfcmpptr = new TypeFunction(parameters, Type::tint32, 0, LINKd); ++ tfcmpptr->mod = MODconst; ++ tfcmpptr = (TypeFunction *)tfcmpptr->semantic(Loc(), &sc); ++ } ++ fd = fd->overloadExactMatch(tfcmpptr); ++ if (fd) ++ return fd; ++ } ++ } ++ else ++ { ++#if 0 // FIXME: doesn't work for recursive alias this ++ /* Check opCmp member exists. ++ * Consider 'alias this', but except opDispatch. ++ */ ++ Expression *e = new DsymbolExp(loc, this); ++ e = new DotIdExp(loc, e, Id::cmp); ++ Scope *sc2 = sc->push(); ++ e = e->trySemantic(sc2); ++ sc2->pop(); ++ if (e) ++ { ++ Dsymbol *s = NULL; ++ switch (e->op) ++ { ++ case TOKoverloadset: s = ((OverExp *)e)->vars; break; ++ case TOKimport: s = ((ScopeExp *)e)->sds; break; ++ case TOKvar: s = ((VarExp *)e)->var; break; ++ default: break; ++ } ++ if (!s || s->ident != Id::cmp) ++ e = NULL; // there's no valid member 'opCmp' ++ } ++ if (!e) ++ return NULL; // bitwise comparison would work ++ /* Essentially, a struct which does not define opCmp is not comparable. ++ * At this time, typeid(S).compare might be correct that throwing "not implement" Error. ++ * But implementing it would break existing code, such as: ++ * ++ * struct S { int value; } // no opCmp ++ * int[S] aa; // Currently AA key uses bitwise comparison ++ * // (It's default behavior of TypeInfo_Strust.compare). ++ * ++ * Not sure we should fix this inconsistency, so just keep current behavior. ++ */ ++#else + return NULL; ++#endif ++ } + +- /* static bool__xopEquals(in void* p, in void* q) { +- * return ( *cast(const S*)(p) ).opEquals( *cast(const S*)(q) ); +- * } +- */ ++ if (!xerrcmp) ++ { ++ Identifier *id = Lexer::idPool("_xopCmp"); ++ Expression *e = new IdentifierExp(loc, Id::empty); ++ e = new DotIdExp(loc, e, Id::object); ++ e = new DotIdExp(loc, e, id); ++ e = e->semantic(sc); ++ Dsymbol *s = getDsymbol(e); ++ if (!s) ++ { ++ ::error(Loc(), "ICE: %s not found in object module. You must update druntime", id->toChars()); ++ fatal(); ++ } ++ assert(s); ++ xerrcmp = s->isFuncDeclaration(); ++ } + +- Parameters *parameters = new Parameters; +- parameters->push(new Parameter(STCin, Type::tvoidptr, Id::p, NULL)); +- parameters->push(new Parameter(STCin, Type::tvoidptr, Id::q, NULL)); +- TypeFunction *tf = new TypeFunction(parameters, Type::tbool, 0, LINKd); +- tf = (TypeFunction *)tf->semantic(0, sc); ++ Loc declLoc = Loc(); // loc is unnecessary so __xopCmp is never called directly ++ Loc loc = Loc(); // loc is unnecessary so errors are gagged + +- Identifier *id = Lexer::idPool("__xopEquals"); +- FuncDeclaration *fop = new FuncDeclaration(0, 0, id, STCstatic, tf); ++ Parameters *parameters = new Parameters; ++ parameters->push(new Parameter(STCref | STCconst, type, Id::p, NULL)); ++ parameters->push(new Parameter(STCref | STCconst, type, Id::q, NULL)); ++ TypeFunction *tf = new TypeFunction(parameters, Type::tint32, 0, LINKd); ++ tf = (TypeFunction *)tf->semantic(loc, sc); + +- Expression *e = new CallExp(0, +- new DotIdExp(0, +- new PtrExp(0, new CastExp(0, +- new IdentifierExp(0, Id::p), type->pointerTo()->constOf())), +- Id::eq), +- new PtrExp(0, new CastExp(0, +- new IdentifierExp(0, Id::q), type->pointerTo()->constOf()))); ++ Identifier *id = Lexer::idPool("__xopCmp"); ++ FuncDeclaration *fop = new FuncDeclaration(declLoc, Loc(), id, STCstatic, tf); + +- fop->fbody = new ReturnStatement(0, e); ++ Expression *e1 = new IdentifierExp(loc, Id::p); ++ Expression *e2 = new IdentifierExp(loc, Id::q); ++ Expression *e = new CallExp(loc, new DotIdExp(loc, e1, Id::cmp), e2); + +- size_t index = members->dim; +- members->push(fop); ++ fop->fbody = new ReturnStatement(loc, e); + +- unsigned errors = global.startGagging(); // Do not report errors, even if the +- unsigned oldspec = global.speculativeGag; // template opAssign fbody makes it. +- global.speculativeGag = global.gag; ++ unsigned errors = global.startGagging(); // Do not report errors + Scope *sc2 = sc->push(); + sc2->stc = 0; + sc2->linkage = LINKd; +- sc2->speculative = true; + + fop->semantic(sc2); + fop->semantic2(sc2); +- fop->semantic3(sc2); + + sc2->pop(); +- global.speculativeGag = oldspec; + if (global.endGagging(errors)) // if errors happened +- { +- members->remove(index); +- +- if (!xerreq) +- { +- Expression *e = new IdentifierExp(0, Id::empty); +- e = new DotIdExp(0, e, Id::object); +- e = new DotIdExp(0, e, Lexer::idPool("_xopEquals")); +- e = e->semantic(sc); +- Dsymbol *s = getDsymbol(e); +- FuncDeclaration *fd = s->isFuncDeclaration(); +- +- xerreq = fd; +- } +- fop = xerreq; +- } +- else +- fop->addMember(sc, this, 1); ++ fop = xerrcmp; + + return fop; + } + +- + /******************************************* + * Build copy constructor for struct. ++ * void __cpctpr(ref const S s) const [pure nothrow @trusted] ++ * { ++ * (*cast(S*)&this) = *cast(S*)s; ++ * (*cast(S*)&this).postBlit(); ++ * } ++ * + * Copy constructors are compiler generated only, and are only + * callable from the compiler. They are not user accessible. +- * A copy constructor is: +- * void cpctpr(ref const S s) const +- * { +- * (*cast(S*)&this) = *cast(S*)s; +- * (*cast(S*)&this).postBlit(); +- * } ++ * + * This is done so: + * - postBlit() never sees uninitialized data + * - memcpy can be much more efficient than memberwise copy +@@ -508,62 +694,59 @@ FuncDeclaration *StructDeclaration::buil + + FuncDeclaration *StructDeclaration::buildCpCtor(Scope *sc) + { +- //printf("StructDeclaration::buildCpCtor() %s\n", toChars()); +- FuncDeclaration *fcp = NULL; +- + /* Copy constructor is only necessary if there is a postblit function, + * otherwise the code generator will just do a bit copy. + */ +- if (postblit) +- { +- //printf("generating cpctor\n"); +- +- StorageClass stc = postblit->storage_class & +- (STCdisable | STCsafe | STCtrusted | STCsystem | STCpure | STCnothrow); +- if (stc & (STCsafe | STCtrusted)) +- stc = stc & ~STCsafe | STCtrusted; +- +- Parameters *fparams = new Parameters; +- fparams->push(new Parameter(STCref, type->constOf(), Id::p, NULL)); +- Type *ftype = new TypeFunction(fparams, Type::tvoid, FALSE, LINKd, stc); +- ftype->mod = MODconst; +- +- fcp = new FuncDeclaration(loc, 0, Id::cpctor, stc, ftype); +- +- if (!(fcp->storage_class & STCdisable)) +- { +- // Build *this = p; +- Expression *e = new ThisExp(0); +- AssignExp *ea = new AssignExp(0, +- new PtrExp(0, new CastExp(0, new AddrExp(0, e), type->mutableOf()->pointerTo())), +- new PtrExp(0, new CastExp(0, new AddrExp(0, new IdentifierExp(0, Id::p)), type->mutableOf()->pointerTo())) +- ); +- ea->op = TOKblit; +- Statement *s = new ExpStatement(0, ea); +- +- // Build postBlit(); +- e = new ThisExp(0); +- e = new PtrExp(0, new CastExp(0, new AddrExp(0, e), type->mutableOf()->pointerTo())); +- e = new DotVarExp(0, e, postblit, 0); +- e = new CallExp(0, e); ++ if (!postblit) ++ return NULL; + +- s = new CompoundStatement(0, s, new ExpStatement(0, e)); +- fcp->fbody = s; +- } +- else +- fcp->fbody = new ExpStatement(0, (Expression *)NULL); ++ //printf("StructDeclaration::buildCpCtor() %s\n", toChars()); ++ StorageClass stc = STCsafe | STCnothrow | STCpure; ++ Loc declLoc = postblit->loc; ++ Loc loc = Loc(); // internal code should have no loc to prevent coverage ++ ++ stc = mergeFuncAttrs(stc, postblit->storage_class); ++ if (stc & STCsafe) // change to @trusted for unsafe casts ++ stc = (stc & ~STCsafe) | STCtrusted; + +- members->push(fcp); ++ Parameters *fparams = new Parameters; ++ fparams->push(new Parameter(STCref, type->constOf(), Id::p, NULL)); ++ Type *tf = new TypeFunction(fparams, Type::tvoid, 0, LINKd, stc); ++ tf->mod = MODconst; + +- sc = sc->push(); +- sc->stc = 0; +- sc->linkage = LINKd; ++ FuncDeclaration *fcp = new FuncDeclaration(declLoc, Loc(), Id::cpctor, stc, tf); + +- fcp->semantic(sc); ++ if (!(stc & STCdisable)) ++ { ++ // Build *this = p; ++ Expression *e = new ThisExp(loc); ++ AssignExp *ea = new AssignExp(loc, ++ new PtrExp(loc, new CastExp(loc, new AddrExp(loc, e), type->mutableOf()->pointerTo())), ++ new PtrExp(loc, new CastExp(loc, new AddrExp(loc, new IdentifierExp(loc, Id::p)), type->mutableOf()->pointerTo())) ++ ); ++ ea->op = TOKblit; ++ Statement *s = new ExpStatement(loc, ea); ++ ++ // Build postBlit(); ++ e = new ThisExp(loc); ++ e = new PtrExp(loc, new CastExp(loc, new AddrExp(loc, e), type->mutableOf()->pointerTo())); ++ e = new DotVarExp(loc, e, postblit, 0); ++ e = new CallExp(loc, e); + +- sc->pop(); ++ s = new CompoundStatement(loc, s, new ExpStatement(loc, e)); ++ fcp->fbody = s; + } + ++ members->push(fcp); ++ ++ sc = sc->push(); ++ sc->stc = 0; ++ sc->linkage = LINKd; ++ ++ fcp->semantic(sc); ++ ++ sc->pop(); ++ + return fcp; + } + +@@ -579,30 +762,33 @@ FuncDeclaration *StructDeclaration::buil + FuncDeclaration *StructDeclaration::buildPostBlit(Scope *sc) + { + //printf("StructDeclaration::buildPostBlit() %s\n", toChars()); +- Expression *e = NULL; +- StorageClass stc = 0; ++ StorageClass stc = STCsafe | STCnothrow | STCpure; ++ Loc declLoc = postblits.dim ? postblits[0]->loc : this->loc; ++ Loc loc = Loc(); // internal code should have no loc to prevent coverage + ++ Expression *e = NULL; + for (size_t i = 0; i < fields.dim; i++) + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + if (v->storage_class & STCref) + continue; + Type *tv = v->type->toBasetype(); + dinteger_t dim = 1; + while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- dim *= ((TypeSArray *)tv)->dim->toInteger(); +- tv = tv->nextOf()->toBasetype(); ++ { ++ TypeSArray *tsa = (TypeSArray *)tv; ++ dim *= tsa->dim->toInteger(); ++ tv = tsa->next->toBasetype(); + } + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->postblit && dim) + { +- stc |= sd->postblit->storage_class & STCdisable; +- ++ stc = mergeFuncAttrs(stc, sd->postblit->storage_class); + if (stc & STCdisable) + { + e = NULL; +@@ -610,24 +796,24 @@ FuncDeclaration *StructDeclaration::buil + } + + // this.v +- Expression *ex = new ThisExp(0); +- ex = new DotVarExp(0, ex, v, 0); ++ Expression *ex = new ThisExp(loc); ++ ex = new DotVarExp(loc, ex, v, 0); + + if (v->type->toBasetype()->ty == Tstruct) + { // this.v.postblit() +- ex = new DotVarExp(0, ex, sd->postblit, 0); +- ex = new CallExp(0, ex); ++ ex = new DotVarExp(loc, ex, sd->postblit, 0); ++ ex = new CallExp(loc, ex); + } + else + { + // Typeinfo.postblit(cast(void*)&this.v); +- Expression *ea = new AddrExp(0, ex); +- ea = new CastExp(0, ea, Type::tvoid->pointerTo()); ++ Expression *ea = new AddrExp(loc, ex); ++ ea = new CastExp(loc, ea, Type::tvoid->pointerTo()); + + Expression *et = v->type->getTypeInfo(sc); +- et = new DotIdExp(0, et, Id::postblit); ++ et = new DotIdExp(loc, et, Id::postblit); + +- ex = new CallExp(0, et, ea); ++ ex = new CallExp(loc, et, ea); + } + e = Expression::combine(e, ex); // combine in forward order + } +@@ -638,8 +824,8 @@ FuncDeclaration *StructDeclaration::buil + */ + if (e || (stc & STCdisable)) + { //printf("Building __fieldPostBlit()\n"); +- PostBlitDeclaration *dd = new PostBlitDeclaration(loc, 0, stc, Lexer::idPool("__fieldPostBlit")); +- dd->fbody = new ExpStatement(0, e); ++ PostBlitDeclaration *dd = new PostBlitDeclaration(declLoc, Loc(), stc, Lexer::idPool("__fieldPostBlit")); ++ dd->fbody = new ExpStatement(loc, e); + postblits.shift(dd); + members->push(dd); + dd->semantic(sc); +@@ -655,21 +841,23 @@ FuncDeclaration *StructDeclaration::buil + + default: + e = NULL; ++ stc = STCsafe | STCnothrow | STCpure; + for (size_t i = 0; i < postblits.dim; i++) +- { FuncDeclaration *fd = postblits[i]; +- stc |= fd->storage_class & STCdisable; ++ { ++ FuncDeclaration *fd = postblits[i]; ++ stc = mergeFuncAttrs(stc, fd->storage_class); + if (stc & STCdisable) + { + e = NULL; + break; + } +- Expression *ex = new ThisExp(0); +- ex = new DotVarExp(0, ex, fd, 0); +- ex = new CallExp(0, ex); ++ Expression *ex = new ThisExp(loc); ++ ex = new DotVarExp(loc, ex, fd, 0); ++ ex = new CallExp(loc, ex); + e = Expression::combine(e, ex); + } +- PostBlitDeclaration *dd = new PostBlitDeclaration(loc, 0, stc, Lexer::idPool("__aggrPostBlit")); +- dd->fbody = new ExpStatement(0, e); ++ PostBlitDeclaration *dd = new PostBlitDeclaration(declLoc, Loc(), stc, Lexer::idPool("__aggrPostBlit")); ++ dd->fbody = new ExpStatement(loc, e); + members->push(dd); + dd->semantic(sc); + return dd; +@@ -689,48 +877,59 @@ FuncDeclaration *StructDeclaration::buil + FuncDeclaration *AggregateDeclaration::buildDtor(Scope *sc) + { + //printf("AggregateDeclaration::buildDtor() %s\n", toChars()); +- Expression *e = NULL; ++ StorageClass stc = STCsafe | STCnothrow | STCpure; ++ Loc declLoc = dtors.dim ? dtors[0]->loc : this->loc; ++ Loc loc = Loc(); // internal code should have no loc to prevent coverage + ++ Expression *e = NULL; + #if DMDV2 + for (size_t i = 0; i < fields.dim; i++) + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + if (v->storage_class & STCref) + continue; + Type *tv = v->type->toBasetype(); + dinteger_t dim = 1; + while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- dim *= ((TypeSArray *)tv)->dim->toInteger(); +- tv = tv->nextOf()->toBasetype(); ++ { ++ TypeSArray *tsa = (TypeSArray *)tv; ++ dim *= tsa->dim->toInteger(); ++ tv = tsa->next->toBasetype(); + } + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->dtor && dim) +- { Expression *ex; ++ { ++ stc = mergeFuncAttrs(stc, sd->dtor->storage_class); ++ if (stc & STCdisable) ++ { ++ e = NULL; ++ break; ++ } + + // this.v +- ex = new ThisExp(0); +- ex = new DotVarExp(0, ex, v, 0); ++ Expression *ex = new ThisExp(loc); ++ ex = new DotVarExp(loc, ex, v, 0); + + if (v->type->toBasetype()->ty == Tstruct) + { // this.v.dtor() +- ex = new DotVarExp(0, ex, sd->dtor, 0); +- ex = new CallExp(0, ex); ++ ex = new DotVarExp(loc, ex, sd->dtor, 0); ++ ex = new CallExp(loc, ex); + } + else + { + // Typeinfo.destroy(cast(void*)&this.v); +- Expression *ea = new AddrExp(0, ex); +- ea = new CastExp(0, ea, Type::tvoid->pointerTo()); ++ Expression *ea = new AddrExp(loc, ex); ++ ea = new CastExp(loc, ea, Type::tvoid->pointerTo()); + + Expression *et = v->type->getTypeInfo(sc); +- et = new DotIdExp(0, et, Id::destroy); ++ et = new DotIdExp(loc, et, Id::destroy); + +- ex = new CallExp(0, et, ea); ++ ex = new CallExp(loc, et, ea); + } + e = Expression::combine(ex, e); // combine in reverse order + } +@@ -739,10 +938,10 @@ FuncDeclaration *AggregateDeclaration::b + + /* Build our own "destructor" which executes e + */ +- if (e) ++ if (e || (stc & STCdisable)) + { //printf("Building __fieldDtor()\n"); +- DtorDeclaration *dd = new DtorDeclaration(loc, 0, Lexer::idPool("__fieldDtor")); +- dd->fbody = new ExpStatement(0, e); ++ DtorDeclaration *dd = new DtorDeclaration(declLoc, Loc(), stc, Lexer::idPool("__fieldDtor")); ++ dd->fbody = new ExpStatement(loc, e); + dtors.shift(dd); + members->push(dd); + dd->semantic(sc); +@@ -759,19 +958,82 @@ FuncDeclaration *AggregateDeclaration::b + + default: + e = NULL; ++ stc = STCsafe | STCnothrow | STCpure; + for (size_t i = 0; i < dtors.dim; i++) +- { FuncDeclaration *fd = dtors[i]; +- Expression *ex = new ThisExp(0); +- ex = new DotVarExp(0, ex, fd, 0); +- ex = new CallExp(0, ex); ++ { ++ FuncDeclaration *fd = dtors[i]; ++ stc = mergeFuncAttrs(stc, fd->storage_class); ++ if (stc & STCdisable) ++ { ++ e = NULL; ++ break; ++ } ++ Expression *ex = new ThisExp(loc); ++ ex = new DotVarExp(loc, ex, fd, 0); ++ ex = new CallExp(loc, ex); + e = Expression::combine(ex, e); + } +- DtorDeclaration *dd = new DtorDeclaration(loc, 0, Lexer::idPool("__aggrDtor")); +- dd->fbody = new ExpStatement(0, e); ++ DtorDeclaration *dd = new DtorDeclaration(declLoc, Loc(), stc, Lexer::idPool("__aggrDtor")); ++ dd->fbody = new ExpStatement(loc, e); + members->push(dd); + dd->semantic(sc); + return dd; + } + } + ++/****************************************** ++ * Create inclusive invariant for struct/class by aggregating ++ * all the invariants in invs[]. ++ * void __invariant() const [pure nothrow @trusted] ++ * { ++ * invs[0](), invs[1](), ...; ++ * } ++ */ ++ ++FuncDeclaration *AggregateDeclaration::buildInv(Scope *sc) ++{ ++ StorageClass stc = STCsafe | STCnothrow | STCpure; ++ Loc declLoc = this->loc; ++ Loc loc = Loc(); // internal code should have no loc to prevent coverage ++ ++ switch (invs.dim) ++ { ++ case 0: ++ return NULL; ++ ++ case 1: ++ // Don't return invs[0] so it has uniquely generated name. ++ /* fall through */ ++ ++ default: ++ Expression *e = NULL; ++ StorageClass stcx = 0; ++ for (size_t i = 0; i < invs.dim; i++) ++ { ++ stc = mergeFuncAttrs(stc, invs[i]->storage_class); ++ if (stc & STCdisable) ++ { ++ // What should do? ++ } ++ StorageClass stcy = invs[i]->storage_class & (STCshared | STCsynchronized); ++ if (i == 0) ++ stcx = stcy; ++ else if (stcx ^ stcy) ++ { ++ #if 1 // currently rejects ++ error(invs[i]->loc, "mixing invariants with shared/synchronized differene is not supported"); ++ e = NULL; ++ break; ++ #endif ++ } ++ e = Expression::combine(e, new CallExp(loc, new VarExp(loc, invs[i]))); ++ } ++ InvariantDeclaration *inv; ++ inv = new InvariantDeclaration(declLoc, Loc(), stc | stcx, Id::classInvariant); ++ inv->fbody = new ExpStatement(loc, e); ++ members->push(inv); ++ inv->semantic(sc); ++ return inv; ++ } ++} + +--- a/src/gcc/d/dfrontend/complex_t.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/complex_t.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,76 @@ ++ ++// Compiler implementation of the D programming language ++// Copyright (c) 1999-2006 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright and Burton Radons ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef DMD_COMPLEX_T_H ++#define DMD_COMPLEX_T_H ++ ++/* Roll our own complex type for compilers that don't support complex ++ */ ++ ++struct complex_t ++{ ++ longdouble re; ++ longdouble im; ++ ++ complex_t() { this->re = 0; this->im = 0; } ++ complex_t(longdouble re) { this->re = re; this->im = 0; } ++ complex_t(double re) { this->re = re; this->im = 0; } ++ complex_t(longdouble re, longdouble im) { this->re = re; this->im = im; } ++ complex_t(double re, double im) { this->re = re; this->im = im; } ++ ++ complex_t operator + (complex_t y) { complex_t r; r.re = re + y.re; r.im = im + y.im; return r; } ++ complex_t operator - (complex_t y) { complex_t r; r.re = re - y.re; r.im = im - y.im; return r; } ++ complex_t operator - () { complex_t r; r.re = -re; r.im = -im; return r; } ++ complex_t operator * (complex_t y) { return complex_t(re * y.re - im * y.im, im * y.re + re * y.im); } ++ ++ complex_t operator / (complex_t y) ++ { ++ longdouble abs_y_re = y.re < 0 ? -y.re : y.re; ++ longdouble abs_y_im = y.im < 0 ? -y.im : y.im; ++ longdouble r, den; ++ ++ if (abs_y_re < abs_y_im) ++ { ++ r = y.re / y.im; ++ den = y.im + r * y.re; ++ return complex_t((re * r + im) / den, ++ (im * r - re) / den); ++ } ++ else ++ { ++ r = y.im / y.re; ++ den = y.re + r * y.im; ++ return complex_t((re + r * im) / den, ++ (im - r * re) / den); ++ } ++ } ++ ++ operator bool () { return re || im; } ++ ++ int operator == (complex_t y) { return re == y.re && im == y.im; } ++ int operator != (complex_t y) { return re != y.re || im != y.im; } ++}; ++ ++inline complex_t operator * (longdouble x, complex_t y) { return complex_t(x) * y; } ++inline complex_t operator * (complex_t x, longdouble y) { return x * complex_t(y); } ++inline complex_t operator / (complex_t x, longdouble y) { return x / complex_t(y); } ++ ++ ++inline longdouble creall(complex_t x) ++{ ++ return x.re; ++} ++ ++inline longdouble cimagl(complex_t x) ++{ ++ return x.im; ++} ++ ++#endif +--- a/src/gcc/d/dfrontend/cond.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/cond.c 2014-04-01 16:32:51.000000000 +0100 +@@ -52,7 +52,7 @@ Condition::Condition(Loc loc) + /* ============================================================ */ + + DVCondition::DVCondition(Module *mod, unsigned level, Identifier *ident) +- : Condition(0) ++ : Condition(Loc()) + { + this->mod = mod; + this->level = level; +@@ -84,16 +84,41 @@ DebugCondition::DebugCondition(Module *m + { + } + ++// Helper for printing dependency information ++void printDepsConditional(Scope *sc, DVCondition* condition, const char* depType) ++{ ++ if (!global.params.moduleDeps || global.params.moduleDepsFile) ++ return; ++ OutBuffer *ob = global.params.moduleDeps; ++ Module* imod = sc ? (sc->instantiatingModule ? sc->instantiatingModule : sc->module) : condition->mod; ++ if (!imod) ++ return; ++ ob->writestring(depType); ++ ob->writestring(imod->toPrettyChars()); ++ ob->writestring(" ("); ++ escapePath(ob, imod->srcfile->toChars()); ++ ob->writestring(") : "); ++ if (condition->ident) ++ ob->printf("%s\n", condition->ident->toChars()); ++ else ++ ob->printf("%d\n", condition->level); ++} ++ ++ + int DebugCondition::include(Scope *sc, ScopeDsymbol *s) + { + //printf("DebugCondition::include() level = %d, debuglevel = %d\n", level, global.params.debuglevel); + if (inc == 0) + { + inc = 2; ++ bool definedInModule = false; + if (ident) + { + if (findCondition(mod->debugids, ident)) ++ { + inc = 1; ++ definedInModule = true; ++ } + else if (findCondition(global.params.debugids, ident)) + inc = 1; + else +@@ -104,6 +129,8 @@ int DebugCondition::include(Scope *sc, S + } + else if (level <= global.params.debuglevel || level <= mod->debuglevel) + inc = 1; ++ if (!definedInModule) ++ printDepsConditional(sc, this, "depsDebug "); + } + return (inc == 1); + } +@@ -123,24 +150,87 @@ void VersionCondition::setGlobalLevel(un + global.params.versionlevel = level; + } + +-void VersionCondition::checkPredefined(Loc loc, const char *ident) ++bool VersionCondition::isPredefined(const char *ident) + { + static const char* reserved[] = + { +- "DigitalMars", "X86", "X86_64", +- "Windows", "Win32", "Win64", ++ "DigitalMars", ++ "GNU", ++ "LDC", ++ "SDC", ++ "Windows", ++ "Win32", ++ "Win64", + "linux", +-#if DMDV2 +- /* Although Posix is predefined by D1, disallowing its +- * redefinition breaks makefiles and older builds. +- */ +- "Posix", +- "D_NET", +-#endif +- "OSX", "FreeBSD", ++ "OSX", ++ "FreeBSD", + "OpenBSD", ++ "NetBSD", ++ "DragonFlyBSD", ++ "BSD", + "Solaris", +- "LittleEndian", "BigEndian", ++ "Posix", ++ "AIX", ++ "Haiku", ++ "SkyOS", ++ "SysV3", ++ "SysV4", ++ "Hurd", ++ "Android", ++ "Cygwin", ++ "MinGW", ++ "X86", ++ "X86_64", ++ "ARM", ++ "ARM_Thumb", ++ "ARM_SoftFloat", ++ "ARM_SoftFP", ++ "ARM_HardFloat", ++ "AArch64", ++ "PPC", ++ "PPC_SoftFloat", ++ "PPC_HardFloat", ++ "PPC64", ++ "IA64", ++ "MIPS32", ++ "MIPS64", ++ "MIPS_O32", ++ "MIPS_N32", ++ "MIPS_O64", ++ "MIPS_N64", ++ "MIPS_EABI", ++ "MIPS_SoftFloat", ++ "MIPS_HardFloat", ++ "SPARC", ++ "SPARC_V8Plus", ++ "SPARC_SoftFloat", ++ "SPARC_HardFloat", ++ "SPARC64", ++ "S390", ++ "S390X", ++ "HPPA", ++ "HPPA64", ++ "SH", ++ "SH64", ++ "Alpha", ++ "Alpha_SoftFloat", ++ "Alpha_HardFloat", ++ "LittleEndian", ++ "BigEndian", ++ "D_Coverage", ++ "D_Ddoc", ++ "D_InlineAsm_X86", ++ "D_InlineAsm_X86_64", ++ "D_LP64", ++ "D_X32", ++ "D_HardFloat", ++ "D_SoftFloat", ++ "D_PIC", ++ "D_SIMD", ++ "D_Version2", ++ "D_NoBoundsChecks", ++ "unittest", ++ "assert", + "all", + "none", + }; +@@ -148,21 +238,17 @@ void VersionCondition::checkPredefined(L + for (unsigned i = 0; i < sizeof(reserved) / sizeof(reserved[0]); i++) + { + if (strcmp(ident, reserved[i]) == 0) +- goto Lerror; ++ return true; + } + + if (ident[0] == 'D' && ident[1] == '_') +- goto Lerror; +- +- return; +- +- Lerror: +- error(loc, "version identifier '%s' is reserved and cannot be set", ident); ++ return true; ++ return false; + } + + void VersionCondition::addGlobalIdent(const char *ident) + { +- checkPredefined(0, ident); ++ checkPredefined(Loc(), ident); + addPredefinedGlobalIdent(ident); + } + +@@ -186,10 +272,14 @@ int VersionCondition::include(Scope *sc, + if (inc == 0) + { + inc = 2; ++ bool definedInModule=false; + if (ident) + { + if (findCondition(mod->versionids, ident)) ++ { + inc = 1; ++ definedInModule = true; ++ } + else if (findCondition(global.params.versionids, ident)) + inc = 1; + else +@@ -201,6 +291,8 @@ int VersionCondition::include(Scope *sc, + } + else if (level <= global.params.versionlevel || level <= mod->versionlevel) + inc = 1; ++ if (!definedInModule && (!ident || (!isPredefined(ident->toChars()) && ident != Lexer::idPool(Token::toChars(TOKunittest)) && ident != Lexer::idPool(Token::toChars(TOKassert))))) ++ printDepsConditional(sc, this, "depsVersion "); + } + return (inc == 1); + } +@@ -243,9 +335,7 @@ int StaticIfCondition::include(Scope *sc + { + error(loc, (nest > 1000) ? "unresolvable circular static if expression" + : "error evaluating static if expression"); +- if (!global.gag) +- inc = 2; // so we don't see the error message again +- return 0; ++ goto Lerror; + } + + if (!sc) +@@ -259,21 +349,25 @@ int StaticIfCondition::include(Scope *sc + sc = sc->push(sc->scopesym); + sc->sd = s; // s gets any addMember() + sc->flags |= SCOPEstaticif; ++ ++ sc = sc->startCTFE(); + Expression *e = exp->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + sc->pop(); ++ --nest; ++ + if (!e->type->checkBoolean()) + { + if (e->type->toBasetype() != Type::terror) + exp->error("expression %s of type %s does not have a boolean value", exp->toChars(), e->type->toChars()); +- inc = 0; +- return 0; ++ goto Lerror; + } + e = e->ctfeInterpret(); +- --nest; + if (e->op == TOKerror) +- { exp = e; +- inc = 0; ++ { ++ goto Lerror; + } + else if (e->isBool(TRUE)) + inc = 1; +@@ -282,144 +376,20 @@ int StaticIfCondition::include(Scope *sc + else + { + e->error("expression %s is not constant or does not evaluate to a bool", e->toChars()); +- inc = 2; ++ goto Lerror; + } + } + return (inc == 1); ++ ++Lerror: ++ if (!global.gag) ++ inc = 2; // so we don't see the error message again ++ return 0; + } + + void StaticIfCondition::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { +- buf->writestring("static if("); ++ buf->writestring("static if ("); + exp->toCBuffer(buf, hgs); + buf->writeByte(')'); + } +- +- +-/**************************** IftypeCondition *******************************/ +- +-IftypeCondition::IftypeCondition(Loc loc, Type *targ, Identifier *id, enum TOK tok, Type *tspec) +- : Condition(loc) +-{ +- this->targ = targ; +- this->id = id; +- this->tok = tok; +- this->tspec = tspec; +-} +- +-Condition *IftypeCondition::syntaxCopy() +-{ +- return new IftypeCondition(loc, +- targ->syntaxCopy(), +- id, +- tok, +- tspec ? tspec->syntaxCopy() : NULL); +-} +- +-int IftypeCondition::include(Scope *sc, ScopeDsymbol *sd) +-{ +- //printf("IftypeCondition::include()\n"); +- if (inc == 0) +- { +- if (!sc) +- { +- error(loc, "iftype conditional cannot be at global scope"); +- inc = 2; +- return 0; +- } +- Type *t = targ->trySemantic(loc, sc); +- if (t) +- targ = t; +- else +- inc = 2; // condition is false +- +- if (!t) +- { +- } +- else if (id && tspec) +- { +- /* Evaluate to TRUE if targ matches tspec. +- * If TRUE, declare id as an alias for the specialized type. +- */ +- +- MATCH m; +- TemplateTypeParameter tp(loc, id, NULL, NULL); +- +- TemplateParameters parameters; +- parameters.setDim(1); +- parameters[0] = &tp; +- +- Objects dedtypes; +- dedtypes.setDim(1); +- +- m = targ->deduceType(sc, tspec, ¶meters, &dedtypes); +- if (m == MATCHnomatch || +- (m != MATCHexact && tok == TOKequal)) +- inc = 2; +- else +- { +- inc = 1; +- Type *tded = (Type *)dedtypes[0]; +- if (!tded) +- tded = targ; +- Dsymbol *s = new AliasDeclaration(loc, id, tded); +- s->semantic(sc); +- sc->insert(s); +- if (sd) +- s->addMember(sc, sd, 1); +- } +- } +- else if (id) +- { +- /* Declare id as an alias for type targ. Evaluate to TRUE +- */ +- Dsymbol *s = new AliasDeclaration(loc, id, targ); +- s->semantic(sc); +- sc->insert(s); +- if (sd) +- s->addMember(sc, sd, 1); +- inc = 1; +- } +- else if (tspec) +- { +- /* Evaluate to TRUE if targ matches tspec +- */ +- tspec = tspec->semantic(loc, sc); +- //printf("targ = %s\n", targ->toChars()); +- //printf("tspec = %s\n", tspec->toChars()); +- if (tok == TOKcolon) +- { if (targ->implicitConvTo(tspec)) +- inc = 1; +- else +- inc = 2; +- } +- else /* == */ +- { if (targ->equals(tspec)) +- inc = 1; +- else +- inc = 2; +- } +- } +- else +- inc = 1; +- //printf("inc = %d\n", inc); +- } +- return (inc == 1); +-} +- +-void IftypeCondition::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +-{ +- buf->writestring("iftype("); +- targ->toCBuffer(buf, id, hgs); +- if (tspec) +- { +- if (tok == TOKcolon) +- buf->writestring(" : "); +- else +- buf->writestring(" == "); +- tspec->toCBuffer(buf, NULL, hgs); +- } +- buf->writeByte(')'); +-} +- +- +--- a/src/gcc/d/dfrontend/cond.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/cond.h 2014-04-01 16:32:51.000000000 +0100 +@@ -11,21 +11,22 @@ + #ifndef DMD_DEBCOND_H + #define DMD_DEBCOND_H + +-struct Expression; +-struct Identifier; ++class Expression; ++class Identifier; + struct OutBuffer; +-struct Module; ++class Module; + struct Scope; +-struct ScopeDsymbol; +-struct DebugCondition; ++class ScopeDsymbol; ++class DebugCondition; + #include "lexer.h" // dmdhg + enum TOK; + struct HdrGenState; + + int findCondition(Strings *ids, Identifier *ident); + +-struct Condition ++class Condition + { ++public: + Loc loc; + int inc; // 0: not computed yet + // 1: include +@@ -39,8 +40,9 @@ struct Condition + virtual DebugCondition *isDebugCondition() { return NULL; } + }; + +-struct DVCondition : Condition ++class DVCondition : public Condition + { ++public: + unsigned level; + Identifier *ident; + Module *mod; +@@ -50,11 +52,11 @@ struct DVCondition : Condition + Condition *syntaxCopy(); + }; + +-struct DebugCondition : DVCondition ++class DebugCondition : public DVCondition + { ++public: + static void setGlobalLevel(unsigned level); + static void addGlobalIdent(const char *ident); +- static void addPredefinedGlobalIdent(const char *ident); + + DebugCondition(Module *mod, unsigned level, Identifier *ident); + +@@ -63,10 +65,16 @@ struct DebugCondition : DVCondition + DebugCondition *isDebugCondition() { return this; } + }; + +-struct VersionCondition : DVCondition ++class VersionCondition : public DVCondition + { ++public: + static void setGlobalLevel(unsigned level); +- static void checkPredefined(Loc loc, const char *ident); ++ static bool isPredefined(const char *ident); ++ static void checkPredefined(Loc loc, const char *ident) ++ { ++ if (isPredefined(ident)) ++ error(loc, "version identifier '%s' is reserved and cannot be set", ident); ++ } + static void addGlobalIdent(const char *ident); + static void addPredefinedGlobalIdent(const char *ident); + +@@ -76,8 +84,9 @@ struct VersionCondition : DVCondition + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct StaticIfCondition : Condition ++class StaticIfCondition : public Condition + { ++public: + Expression *exp; + int nest; // limit circular dependencies + +@@ -87,20 +96,4 @@ struct StaticIfCondition : Condition + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct IftypeCondition : Condition +-{ +- /* iftype (targ id tok tspec) +- */ +- Type *targ; +- Identifier *id; // can be NULL +- enum TOK tok; // ':' or '==' +- Type *tspec; // can be NULL +- +- IftypeCondition(Loc loc, Type *targ, Identifier *id, enum TOK tok, Type *tspec); +- Condition *syntaxCopy(); +- int include(Scope *sc, ScopeDsymbol *s); +- void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +-}; +- +- + #endif +--- a/src/gcc/d/dfrontend/constfold.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/constfold.c 2014-04-01 16:32:51.000000000 +0100 +@@ -326,11 +326,7 @@ Expression *Mul(Type *type, Expression * + + if (type->isfloating()) + { complex_t c; +-#ifdef IN_GCC +- real_t r; +-#else + d_float80 r; +-#endif + + if (e1->type->isreal()) + { +@@ -397,11 +393,7 @@ Expression *Div(Type *type, Expression * + + if (type->isfloating()) + { complex_t c; +-#ifdef IN_GCC +- real_t r; +-#else + d_float80 r; +-#endif + + //e1->type->print(); + //e2->type->print(); +@@ -578,8 +570,8 @@ Expression *Pow(Type *type, Expression * + } + else + { +- r = new RealExp(loc, e1->toReal(), Type::tfloat64); +- v = new RealExp(loc, ldouble(1.0), Type::tfloat64); ++ r = new IntegerExp(loc, e1->toInteger(), e1->type); ++ v = new IntegerExp(loc, 1, e1->type); + } + + while (n != 0) +@@ -603,7 +595,7 @@ Expression *Pow(Type *type, Expression * + // x ^^ y for x < 0 and y not an integer is not defined + if (e1->toReal() < 0.0) + { +- e = new RealExp(loc, ldouble(Port::nan), type); ++ e = new RealExp(loc, Port::ldbl_nan, type); + } + else if (e2->toReal() == 0.5) + { +@@ -753,7 +745,7 @@ Expression *Xor(Type *type, Expression * + + /* Also returns EXP_CANT_INTERPRET if cannot be computed. + */ +-Expression *Equal(enum TOK op, Type *type, Expression *e1, Expression *e2) ++Expression *Equal(TOK op, Type *type, Expression *e1, Expression *e2) + { Expression *e; + Loc loc = e1->loc; + int cmp; +@@ -951,7 +943,7 @@ Expression *Equal(enum TOK op, Type *typ + return e; + } + +-Expression *Identity(enum TOK op, Type *type, Expression *e1, Expression *e2) ++Expression *Identity(TOK op, Type *type, Expression *e1, Expression *e2) + { + Loc loc = e1->loc; + int cmp; +@@ -998,7 +990,7 @@ Expression *Identity(enum TOK op, Type * + } + + +-Expression *Cmp(enum TOK op, Type *type, Expression *e1, Expression *e2) ++Expression *Cmp(TOK op, Type *type, Expression *e1, Expression *e2) + { Expression *e; + Loc loc = e1->loc; + dinteger_t n; +@@ -1222,7 +1214,7 @@ Expression *Cast(Type *type, Type *to, E + } + + if (e1->op == TOKarrayliteral && typeb == tb) +- return e1; ++ return expType(to, e1); + + if (e1->isConst() != 1) + return EXP_CANT_INTERPRET; +@@ -1233,23 +1225,7 @@ Expression *Cast(Type *type, Type *to, E + { + if (e1->type->isfloating()) + { dinteger_t result; +-#ifdef IN_GCC +- Type * rt = e1->type; +- if (rt->iscomplex()) +- { +- switch (rt->toBasetype()->ty) +- { +- case Tcomplex32: rt = Type::tfloat32; break; +- case Tcomplex64: rt = Type::tfloat64; break; +- case Tcomplex80: rt = Type::tfloat80; break; +- default: +- assert(0); +- } +- } +- d_int64 r = e1->toReal().toInt(rt, type); +-#else + real_t r = e1->toReal(); +-#endif + + switch (typeb->ty) + { +@@ -1345,6 +1321,8 @@ Expression *ArrayLength(Type *type, Expr + + e = new IntegerExp(loc, dim, type); + } ++ else if (e1->type->toBasetype()->ty == Tsarray) ++ e = ((TypeSArray *)e1->type->toBasetype())->dim; + else + e = EXP_CANT_INTERPRET; + return e; +@@ -1386,6 +1364,7 @@ Expression *Index(Type *type, Expression + { ArrayLiteralExp *ale = (ArrayLiteralExp *)e1; + e = (*ale->elements)[i]; + e->type = type; ++ e->loc = loc; + if (e->hasSideEffect()) + e = EXP_CANT_INTERPRET; + } +@@ -1404,6 +1383,7 @@ Expression *Index(Type *type, Expression + else + { e = (*ale->elements)[i]; + e->type = type; ++ e->loc = loc; + if (e->hasSideEffect()) + e = EXP_CANT_INTERPRET; + } +@@ -1424,6 +1404,7 @@ Expression *Index(Type *type, Expression + if (ex->isBool(TRUE)) + { e = (*ae->values)[i]; + e->type = type; ++ e->loc = loc; + if (e->hasSideEffect()) + e = EXP_CANT_INTERPRET; + break; +@@ -1465,12 +1446,12 @@ Expression *Slice(Type *type, Expression + StringExp *es; + + s = mem.malloc((len + 1) * sz); +- memcpy((unsigned char *)s, (unsigned char *)es1->string + ilwr * sz, len * sz); +- memset((unsigned char *)s + len * sz, 0, sz); ++ memcpy((utf8_t *)s, (utf8_t *)es1->string + ilwr * sz, len * sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + es = new StringExp(loc, s, len, es1->postfix); + es->sz = sz; +- es->committed = 1; ++ es->committed = es1->committed; + es->type = type; + e = es; + } +@@ -1508,7 +1489,7 @@ void sliceAssignArrayLiteralFromString(A + { + size_t newlen = newval->len; + size_t sz = newval->sz; +- unsigned char *s = (unsigned char *)newval->string; ++ utf8_t *s = (utf8_t *)newval->string; + Type *elemType = existingAE->type->nextOf(); + for (size_t j = 0; j < newlen; j++) + { +@@ -1532,7 +1513,7 @@ void sliceAssignArrayLiteralFromString(A + */ + void sliceAssignStringFromArrayLiteral(StringExp *existingSE, ArrayLiteralExp *newae, size_t firstIndex) + { +- unsigned char *s = (unsigned char *)existingSE->string; ++ utf8_t *s = (utf8_t *)existingSE->string; + for (size_t j = 0; j < newae->elements->dim; j++) + { + unsigned value = (unsigned)((*newae->elements)[j]->toInteger()); +@@ -1553,7 +1534,7 @@ void sliceAssignStringFromArrayLiteral(S + */ + void sliceAssignStringFromString(StringExp *existingSE, StringExp *newstr, size_t firstIndex) + { +- unsigned char *s = (unsigned char *)existingSE->string; ++ utf8_t *s = (utf8_t *)existingSE->string; + size_t sz = existingSE->sz; + assert(sz == newstr->sz); + memcpy(s + firstIndex * sz, newstr->string, sz * newstr->len); +@@ -1564,8 +1545,8 @@ void sliceAssignStringFromString(StringE + */ + int sliceCmpStringWithString(StringExp *se1, StringExp *se2, size_t lo1, size_t lo2, size_t len) + { +- unsigned char *s1 = (unsigned char *)se1->string; +- unsigned char *s2 = (unsigned char *)se2->string; ++ utf8_t *s1 = (utf8_t *)se1->string; ++ utf8_t *s2 = (utf8_t *)se2->string; + size_t sz = se1->sz; + assert(sz == se2->sz); + +@@ -1577,11 +1558,9 @@ int sliceCmpStringWithString(StringExp * + */ + int sliceCmpStringWithArray(StringExp *se1, ArrayLiteralExp *ae2, size_t lo1, size_t lo2, size_t len) + { +- unsigned char *s = (unsigned char *)se1->string; ++ utf8_t *s = (utf8_t *)se1->string; + size_t sz = se1->sz; + +- int c = 0; +- + for (size_t j = 0; j < len; j++) + { + unsigned value = (unsigned)((*ae2->elements)[j + lo2]->toInteger()); +@@ -1637,12 +1616,12 @@ Expression *Cat(Type *type, Expression * + size_t len = (t->ty == tn->ty) ? 1 : utf_codeLength(sz, v); + s = mem.malloc((len + 1) * sz); + if (t->ty == tn->ty) +- memcpy((unsigned char *)s, &v, sz); ++ memcpy((utf8_t *)s, &v, sz); + else + utf_encode(sz, s, v); + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1696,10 +1675,10 @@ Expression *Cat(Type *type, Expression * + } + s = mem.malloc((len + 1) * sz); + memcpy(s, es1->string, es1->len * sz); +- memcpy((unsigned char *)s + es1->len * sz, es2->string, es2->len * sz); ++ memcpy((utf8_t *)s + es1->len * sz, es2->string, es2->len * sz); + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1761,12 +1740,12 @@ Expression *Cat(Type *type, Expression * + s = mem.malloc((len + 1) * sz); + memcpy(s, es1->string, es1->len * sz); + if (homoConcat) +- memcpy((unsigned char *)s + (sz * es1->len), &v, sz); ++ memcpy((utf8_t *)s + (sz * es1->len), &v, sz); + else +- utf_encode(sz, (unsigned char *)s + (sz * es1->len), v); ++ utf_encode(sz, (utf8_t *)s + (sz * es1->len), v); + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1785,11 +1764,11 @@ Expression *Cat(Type *type, Expression * + dinteger_t v = e1->toInteger(); + + s = mem.malloc((len + 1) * sz); +- memcpy((unsigned char *)s, &v, sz); +- memcpy((unsigned char *)s + sz, es2->string, es2->len * sz); ++ memcpy((utf8_t *)s, &v, sz); ++ memcpy((utf8_t *)s + sz, es2->string, es2->len * sz); + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1810,8 +1789,7 @@ Expression *Cat(Type *type, Expression * + + if (type->toBasetype()->ty == Tsarray) + { +- e->type = new TypeSArray(t1->nextOf(), new IntegerExp(loc, es1->elements->dim, Type::tindex)); +- e->type = e->type->semantic(loc, NULL); ++ e->type = TypeSArray::makeType(loc, t1->nextOf(), es1->elements->dim); + } + else + e->type = type; +@@ -1835,8 +1813,7 @@ Expression *Cat(Type *type, Expression * + + if (type->toBasetype()->ty == Tsarray) + { +- e->type = new TypeSArray(t1->nextOf(), new IntegerExp(loc, es->elements->dim, Type::tindex)); +- e->type = e->type->semantic(loc, NULL); ++ e->type = TypeSArray::makeType(loc, t1->nextOf(), es->elements->dim); + } + else + e->type = type; +@@ -1858,8 +1835,7 @@ Expression *Cat(Type *type, Expression * + + if (type->toBasetype()->ty == Tsarray) + { +- e->type = new TypeSArray(e2->type, new IntegerExp(loc, es1->elements->dim, Type::tindex)); +- e->type = e->type->semantic(loc, NULL); ++ e->type = TypeSArray::makeType(loc, e2->type, es1->elements->dim); + } + else + e->type = type; +@@ -1875,8 +1851,7 @@ Expression *Cat(Type *type, Expression * + + if (type->toBasetype()->ty == Tsarray) + { +- e->type = new TypeSArray(e1->type, new IntegerExp(loc, es2->elements->dim, Type::tindex)); +- e->type = e->type->semantic(loc, NULL); ++ e->type = TypeSArray::makeType(loc, e1->type, es2->elements->dim); + } + else + e->type = type; +--- a/src/gcc/d/dfrontend/cppmangle.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/cppmangle.c 2014-04-01 16:32:51.000000000 +0100 +@@ -129,16 +129,24 @@ void cpp_mangle_name(OutBuffer *buf, Cpp + buf->writeByte('N'); + + FuncDeclaration *fd = s->isFuncDeclaration(); +- if (!fd) ++ VarDeclaration *vd = s->isVarDeclaration(); ++ if (fd && fd->type->isConst()) + { +- s->error("C++ static variables not supported"); +- } +- else if (fd->type->isConst()) + buf->writeByte('K'); +- +- prefix_name(buf, cms, p); +- source_name(buf, s); +- ++ } ++ if (vd && !(vd->storage_class & (STCextern | STCgshared))) ++ { ++ s->error("C++ static non- __gshared non-extern variables not supported"); ++ } ++ if (vd || fd) ++ { ++ prefix_name(buf, cms, p); ++ source_name(buf, s); ++ } ++ else ++ { ++ assert(0); ++ } + buf->writeByte('E'); + } + else +@@ -402,11 +410,17 @@ void TypeTypedef::toCppMangle(OutBuffer + + void TypeClass::toCppMangle(OutBuffer *buf, CppMangleState *cms) + { +- if (!cms->substitute(buf, this)) +- { buf->writeByte('P'); ++ if (!cms->exist(this)) ++ { ++ buf->writeByte('P'); ++ + if (!cms->substitute(buf, sym)) + cpp_mangle_name(buf, cms, sym); ++ ++ cms->store(this); + } ++ else ++ cms->substitute(buf, this); + } + + struct ArgsCppMangleCtx +@@ -420,7 +434,7 @@ static int argsCppMangleDg(void *ctx, si + { + ArgsCppMangleCtx *p = (ArgsCppMangleCtx *)ctx; + +- Type *t = arg->type; ++ Type *t = arg->type->merge2(); + if (arg->storageClass & (STCout | STCref)) + t = t->referenceTo(); + else if (arg->storageClass & STClazy) +@@ -430,7 +444,7 @@ static int argsCppMangleDg(void *ctx, si + t = t->merge(); + } + if (t->ty == Tsarray) +- { // Mangle static arrays as pointers ++ { // Mangle static arrays as pointers. + t = t->pointerTo(); + } + +--- a/src/gcc/d/dfrontend/ctfeexpr.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/ctfeexpr.c 2014-04-01 16:32:51.000000000 +0100 +@@ -44,9 +44,9 @@ Expression *ClassReferenceExp::interpret + return this; + } + +-char *ClassReferenceExp::toChars() ++void ClassReferenceExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { +- return value->toChars(); ++ buf->writestring(value->toChars()); + } + + ClassDeclaration *ClassReferenceExp::originalClass() +@@ -160,8 +160,10 @@ char *ThrownExceptionExp::toChars() + // Generate an error message when this exception is not caught + void ThrownExceptionExp::generateUncaughtError() + { +- thrown->error("Uncaught CTFE exception %s(%s)", thrown->type->toChars(), +- thrown->value->elements->tdata()[0]->toChars()); ++ Expression *e = (*thrown->value->elements)[0]; ++ StringExp* se = e->toString(); ++ thrown->error("Uncaught CTFE exception %s(%s)", thrown->type->toChars(), se ? se->toChars() : e->toChars()); ++ + /* Also give the line where the throw statement was. We won't have it + * in the case where the ThrowStatement is generated internally + * (eg, in ScopeStatement) +@@ -174,6 +176,8 @@ void ThrownExceptionExp::generateUncaugh + // True if 'e' is EXP_CANT_INTERPRET, or an exception + bool exceptionOrCantInterpret(Expression *e) + { ++ assert(EXP_CANT_INTERPRET && "EXP_CANT_INTERPRET must be distinct from " ++ "null, Expression::init not called?"); + if (e == EXP_CANT_INTERPRET) return true; + if (!e || e == EXP_GOTO_INTERPRET || e == EXP_VOID_INTERPRET + || e == EXP_BREAK_INTERPRET || e == EXP_CONTINUE_INTERPRET) +@@ -229,7 +233,7 @@ Expressions *copyLiteralArray(Expression + Expressions *newelems = new Expressions(); + newelems->setDim(oldelems->dim); + for (size_t i = 0; i < oldelems->dim; i++) +- newelems->tdata()[i] = copyLiteral(oldelems->tdata()[i]); ++ (*newelems)[i] = copyLiteral((*oldelems)[i]); + return newelems; + } + +@@ -240,8 +244,7 @@ Expression *copyLiteral(Expression *e) + if (e->op == TOKstring) // syntaxCopy doesn't make a copy for StringExp! + { + StringExp *se = (StringExp *)e; +- unsigned char *s; +- s = (unsigned char *)mem.calloc(se->len + 1, se->sz); ++ utf8_t *s = (utf8_t *)mem.calloc(se->len + 1, se->sz); + memcpy(s, se->string, se->len * se->sz); + StringExp *se2 = new StringExp(se->loc, s, se->len); + se2->committed = se->committed; +@@ -281,7 +284,7 @@ Expression *copyLiteral(Expression *e) + newelems->setDim(oldelems->dim); + for (size_t i = 0; i < newelems->dim; i++) + { +- Expression *m = oldelems->tdata()[i]; ++ Expression *m = (*oldelems)[i]; + // We need the struct definition to detect block assignment + AggregateDeclaration *sd = se->sd; + Dsymbol *s = sd->fields[i]; +@@ -301,7 +304,7 @@ Expression *copyLiteral(Expression *e) + } + else if (v->type->ty != Tarray && v->type->ty!=Taarray) // NOTE: do not copy array references + m = copyLiteral(m); +- newelems->tdata()[i] = m; ++ (*newelems)[i] = m; + } + #if DMDV2 + StructLiteralExp *r = new StructLiteralExp(e->loc, se->sd, newelems, se->stype); +@@ -310,6 +313,7 @@ Expression *copyLiteral(Expression *e) + #endif + r->type = e->type; + r->ownedByCtfe = true; ++ r->origin = ((StructLiteralExp*)e)->origin; + return r; + } + else if (e->op == TOKfunction || e->op == TOKdelegate +@@ -317,7 +321,7 @@ Expression *copyLiteral(Expression *e) + || e->op == TOKvar + || e->op == TOKint64 || e->op == TOKfloat64 + || e->op == TOKchar || e->op == TOKcomplex80 +- || e->op == TOKvoid) ++ || e->op == TOKvoid || e->op == TOKvector) + { // Simple value types + Expression *r = e->syntaxCopy(); + r->type = e->type; +@@ -331,12 +335,12 @@ Expression *copyLiteral(Expression *e) + else if (e->op == TOKindex) + r = new IndexExp(e->loc, ((IndexExp *)e)->e1, ((IndexExp *)e)->e2); + else if (e->op == TOKdotvar) +- r = new DotVarExp(e->loc, ((DotVarExp *)e)->e1, +- ((DotVarExp *)e)->var + #if DMDV2 +- , ((DotVarExp *)e)->hasOverloads ++ r = new DotVarExp(e->loc, ((DotVarExp *)e)->e1, ++ ((DotVarExp *)e)->var, ((DotVarExp *)e)->hasOverloads); ++#else ++ r = new DotVarExp(e->loc, ((DotVarExp *)e)->e1, ((DotVarExp *)e)->var); + #endif +- ); + else + assert(0); + r->type = e->type; +@@ -351,6 +355,8 @@ Expression *copyLiteral(Expression *e) + } + else if (e->op == TOKclassreference) + return new ClassReferenceExp(e->loc, ((ClassReferenceExp *)e)->value, e->type); ++ else if (e->op == TOKerror) ++ return e; + else + { + e->error("Internal Compiler Error: CTFE literal %s", e->toChars()); +@@ -367,8 +373,13 @@ Expression *copyLiteral(Expression *e) + */ + Expression *paintTypeOntoLiteral(Type *type, Expression *lit) + { +- if (lit->type == type) ++ if (lit->type->equals(type)) ++ return lit; ++ ++ // If it is a cast to inout, retain the original type. ++ if (type->hasWild()) + return lit; ++ + Expression *e; + if (lit->op == TOKslice) + { +@@ -383,13 +394,13 @@ Expression *paintTypeOntoLiteral(Type *t + else if (lit->op == TOKarrayliteral) + { + e = new SliceExp(lit->loc, lit, +- new IntegerExp(0, 0, Type::tsize_t), ArrayLength(Type::tsize_t, lit)); ++ new IntegerExp(Loc(), 0, Type::tsize_t), ArrayLength(Type::tsize_t, lit)); + } + else if (lit->op == TOKstring) + { + // For strings, we need to introduce another level of indirection + e = new SliceExp(lit->loc, lit, +- new IntegerExp(0, 0, Type::tsize_t), ArrayLength(Type::tsize_t, lit)); ++ new IntegerExp(Loc(), 0, Type::tsize_t), ArrayLength(Type::tsize_t, lit)); + } + else if (lit->op == TOKassocarrayliteral) + { +@@ -458,6 +469,13 @@ ArrayLiteralExp *createBlockDuplicatedAr + { + Expressions *elements = new Expressions(); + elements->setDim(dim); ++ if (type->ty == Tsarray && type->nextOf()->ty == Tsarray && ++ elem->type->ty != Tsarray) ++ { ++ // If it is a multidimensional array literal, do it recursively ++ elem = createBlockDuplicatedArrayLiteral(loc, type->nextOf(), elem, ++ ((TypeSArray *)type->nextOf())->dim->toInteger()); ++ } + bool mustCopy = needToCopyLiteral(elem); + for (size_t i = 0; i < dim; i++) + { if (mustCopy) +@@ -477,8 +495,7 @@ ArrayLiteralExp *createBlockDuplicatedAr + StringExp *createBlockDuplicatedStringLiteral(Loc loc, Type *type, + unsigned value, size_t dim, int sz) + { +- unsigned char *s; +- s = (unsigned char *)mem.calloc(dim + 1, sz); ++ utf8_t *s = (utf8_t *)mem.calloc(dim + 1, sz); + for (size_t elemi = 0; elemi < dim; ++elemi) + { + switch (sz) +@@ -529,13 +546,23 @@ TypeAArray *toBuiltinAAType(Type *t) + assert(sym->ident == Id::AssociativeArray); + TemplateInstance *tinst = sym->parent->isTemplateInstance(); + assert(tinst); +- return new TypeAArray((Type *)(tinst->tiargs->tdata()[1]), (Type *)(tinst->tiargs->tdata()[0])); ++ return new TypeAArray((Type *)(*tinst->tiargs)[1], (Type *)(*tinst->tiargs)[0]); + #else + assert(0); + return NULL; + #endif + } + ++/************** TypeInfo operations ************************************/ ++ ++// Return true if type is TypeInfo_Class ++bool isTypeInfo_Class(Type *type) ++{ ++ return type->ty == Tclass && ++ (( Type::dtypeinfo == ((TypeClass*)type)->sym) ++ || Type::dtypeinfo->isBaseOf(((TypeClass*)type)->sym, NULL)); ++} ++ + /************** Pointer operations ************************************/ + + // Return true if t is a pointer (not a function pointer) +@@ -557,20 +584,36 @@ int isTrueBool(Expression *e) + * destPointee may be void. + */ + bool isSafePointerCast(Type *srcPointee, Type *destPointee) +-{ // It's OK if both are the same (modulo const) ++{ ++ // It's safe to cast S** to D** if it's OK to cast S* to D* ++ while (srcPointee->ty == Tpointer && destPointee->ty == Tpointer) ++ { ++ srcPointee = srcPointee->nextOf(); ++ destPointee = destPointee->nextOf(); ++ } ++ + #if DMDV2 +- if (srcPointee->castMod(0) == destPointee->castMod(0)) +- return true; +-#else ++ // It's OK if both are the same (modulo const) ++ srcPointee = srcPointee->castMod(0); ++ destPointee = destPointee->castMod(0); ++#endif + if (srcPointee == destPointee) + return true; +-#endif ++ ++ // It's OK if function pointers differ only in safe/pure/nothrow ++ if (srcPointee->ty == Tfunction && destPointee->ty == Tfunction) ++ return srcPointee->covariant(destPointee) == 1; ++ + // it's OK to cast to void* + if (destPointee->ty == Tvoid) + return true; +- // It's OK if they are the same size integers, eg int* and uint* +- return srcPointee->isintegral() && destPointee->isintegral() +- && srcPointee->size() == destPointee->size(); ++ ++ // It's OK if they are the same size (static array of) integers, eg: ++ // int* --> uint* ++ // int[5][] --> uint[5][] ++ return srcPointee->baseElemOf()->isintegral() && ++ destPointee->baseElemOf()->isintegral() && ++ srcPointee->size() == destPointee->size(); + } + + Expression *getAggregateFromPointer(Expression *e, dinteger_t *ofs) +@@ -578,6 +621,8 @@ Expression *getAggregateFromPointer(Expr + *ofs = 0; + if (e->op == TOKaddress) + e = ((AddrExp *)e)->e1; ++ if (e->op == TOKsymoff) ++ *ofs = ((SymOffExp *)e)->offset; + if (e->op == TOKdotvar) + { + Expression *ex = ((DotVarExp *)e)->e1; +@@ -590,7 +635,7 @@ Expression *getAggregateFromPointer(Expr + i = ((ClassReferenceExp *)ex)->getFieldIndex(e->type, v->offset); + else + i = se->getFieldIndex(e->type, v->offset); +- e = se->elements->tdata()[i]; ++ e = (*se->elements)[i]; + } + if (e->op == TOKindex) + { +@@ -611,11 +656,19 @@ Expression *getAggregateFromPointer(Expr + */ + bool pointToSameMemoryBlock(Expression *agg1, Expression *agg2) + { ++ // For integers cast to pointers, we regard them as non-comparable ++ // unless they are identical. (This may be overly strict). ++ if (agg1->op == TOKint64 && agg2->op == TOKint64 ++ && agg1->toInteger() == agg2->toInteger()) ++ return true; ++ + // Note that type painting can occur with VarExp, so we + // must compare the variables being pointed to. + return agg1 == agg2 || + (agg1->op == TOKvar && agg2->op == TOKvar && +- ((VarExp *)agg1)->var == ((VarExp *)agg2)->var); ++ ((VarExp *)agg1)->var == ((VarExp *)agg2)->var) || ++ (agg1->op == TOKsymoff && agg2->op == TOKsymoff && ++ ((SymOffExp *)agg1)->var == ((SymOffExp *)agg2)->var); + } + + // return e1 - e2 as an integer, or error if not possible +@@ -634,11 +687,16 @@ Expression *pointerDifference(Loc loc, T + { + if (((StringExp *)agg1)->string == ((StringExp *)agg2)->string) + { +- Type *pointee = ((TypePointer *)agg1->type)->next; +- dinteger_t sz = pointee->size(); +- return new IntegerExp(loc, (ofs1-ofs2)*sz, type); ++ Type *pointee = ((TypePointer *)agg1->type)->next; ++ dinteger_t sz = pointee->size(); ++ return new IntegerExp(loc, (ofs1-ofs2)*sz, type); + } + } ++ else if (agg1->op == TOKsymoff && agg2->op == TOKsymoff && ++ ((SymOffExp *)agg1)->var == ((SymOffExp *)agg2)->var) ++ { ++ return new IntegerExp(loc, ofs1-ofs2, type); ++ } + error(loc, "%s - %s cannot be interpreted at compile time: cannot subtract " + "pointers to two different memory blocks", + e1->toChars(), e2->toChars()); +@@ -647,7 +705,7 @@ Expression *pointerDifference(Loc loc, T + + // Return eptr op e2, where eptr is a pointer, e2 is an integer, + // and op is TOKadd or TOKmin +-Expression *pointerArithmetic(Loc loc, enum TOK op, Type *type, ++Expression *pointerArithmetic(Loc loc, TOK op, Type *type, + Expression *eptr, Expression *e2) + { + if (eptr->type->nextOf()->ty == Tvoid) +@@ -659,21 +717,36 @@ Expression *pointerArithmetic(Loc loc, e + if (eptr->op == TOKaddress) + eptr = ((AddrExp *)eptr)->e1; + Expression *agg1 = getAggregateFromPointer(eptr, &ofs1); +- if (agg1->op != TOKstring && agg1->op != TOKarrayliteral) ++ if (agg1->op == TOKsymoff) ++ { ++ if (((SymOffExp *)agg1)->var->type->ty != Tsarray) ++ { ++ error(loc, "cannot perform pointer arithmetic on arrays of unknown length at compile time"); ++ return EXP_CANT_INTERPRET; ++ } ++ } ++ else if (agg1->op != TOKstring && agg1->op != TOKarrayliteral) + { + error(loc, "cannot perform pointer arithmetic on non-arrays at compile time"); + return EXP_CANT_INTERPRET; + } + ofs2 = e2->toInteger(); + Type *pointee = ((TypePointer *)agg1->type)->next; ++ sinteger_t indx = ofs1; + dinteger_t sz = pointee->size(); +- Expression *dollar = ArrayLength(Type::tsize_t, agg1); +- assert(dollar != EXP_CANT_INTERPRET); ++ Expression *dollar; ++ if (agg1->op == TOKsymoff) ++ { ++ dollar = ((TypeSArray *)(((SymOffExp *)agg1)->var->type))->dim; ++ indx = ofs1/sz; ++ } ++ else ++ { ++ dollar = ArrayLength(Type::tsize_t, agg1); ++ assert(dollar != EXP_CANT_INTERPRET); ++ } + dinteger_t len = dollar->toInteger(); + +- Expression *val = agg1; +- TypeArray *tar = (TypeArray *)val->type; +- sinteger_t indx = ofs1; + if (op == TOKadd || op == TOKaddass || op == TOKplusplus) + indx = indx + ofs2/sz; + else if (op == TOKmin || op == TOKminass || op == TOKminusminus) +@@ -683,14 +756,24 @@ Expression *pointerArithmetic(Loc loc, e + error(loc, "CTFE Internal compiler error: bad pointer operation"); + return EXP_CANT_INTERPRET; + } +- if (val->op != TOKarrayliteral && val->op != TOKstring) ++ ++ if (indx < 0 || indx > len) + { +- error(loc, "CTFE Internal compiler error: pointer arithmetic %s", val->toChars()); ++ error(loc, "cannot assign pointer to index %lld inside memory block [0..%lld]", indx, len); + return EXP_CANT_INTERPRET; + } +- if (indx < 0 || indx > len) ++ ++ if (agg1->op == TOKsymoff) + { +- error(loc, "cannot assign pointer to index %lld inside memory block [0..%lld]", indx, len); ++ SymOffExp *se = new SymOffExp(loc, ((SymOffExp *)agg1)->var, indx*sz); ++ se->type = type; ++ return se; ++ } ++ ++ Expression *val = agg1; ++ if (val->op != TOKarrayliteral && val->op != TOKstring) ++ { ++ error(loc, "CTFE Internal compiler error: pointer arithmetic %s", val->toChars()); + return EXP_CANT_INTERPRET; + } + +@@ -702,14 +785,12 @@ Expression *pointerArithmetic(Loc loc, e + + // Return 1 if true, 0 if false + // -1 if comparison is illegal because they point to non-comparable memory blocks +-int comparePointers(Loc loc, enum TOK op, Type *type, Expression *agg1, dinteger_t ofs1, ++int comparePointers(Loc loc, TOK op, Type *type, Expression *agg1, dinteger_t ofs1, + Expression *agg2, dinteger_t ofs2) + { + if ( pointToSameMemoryBlock(agg1, agg2) ) + { +- dinteger_t cm = ofs1 - ofs2; + dinteger_t n; +- dinteger_t zero = 0; + switch(op) + { + case TOKlt: n = (ofs1 < ofs2); break; +@@ -743,6 +824,8 @@ int comparePointers(Loc loc, enum TOK op + case TOKnotequal: + cmp = (null1 == null2); + break; ++ default: ++ assert(0); + } + } + else +@@ -801,7 +884,7 @@ Expression *paintFloatInt(Expression *fr + if (to->isintegral()) + { + u.f = fromVal->toReal(); +- return new IntegerExp(fromVal->loc, ldouble(u.x), to); ++ return new IntegerExp(fromVal->loc, (dinteger_t)ldouble(u.x), to); + } + else + { +@@ -845,6 +928,9 @@ void intUnary(TOK op, IntegerExp *e) + case TOKtilde: + e->value = ~e->value; + break; ++ default: ++ assert(0); ++ break; + } + } + +@@ -1047,6 +1133,8 @@ bool isCtfeComparable(Expression *e) + if (x->isConst() != 1 && + x->op != TOKnull && + x->op != TOKstring && ++ x->op != TOKfunction && ++ x->op != TOKdelegate && + x->op != TOKarrayliteral && + x->op != TOKstructliteral && + x->op != TOKclassreference) +@@ -1202,16 +1290,16 @@ int ctfeCmpArrays(Loc loc, Expression *e + { lo1 = ((SliceExp *)x)->lwr->toInteger(); + x = ((SliceExp*)x)->e1; + } +- StringExp *se1 = (x->op == TOKstring) ? (StringExp *)x : 0; +- ArrayLiteralExp *ae1 = (x->op == TOKarrayliteral) ? (ArrayLiteralExp *)x : 0; ++ StringExp *se1 = (x->op == TOKstring) ? (StringExp *)x : NULL; ++ ArrayLiteralExp *ae1 = (x->op == TOKarrayliteral) ? (ArrayLiteralExp *)x : NULL; + + x = e2; + if (x->op == TOKslice) + { lo2 = ((SliceExp *)x)->lwr->toInteger(); + x = ((SliceExp*)x)->e1; + } +- StringExp *se2 = (x->op == TOKstring) ? (StringExp *)x : 0; +- ArrayLiteralExp *ae2 = (x->op == TOKarrayliteral) ? (ArrayLiteralExp *)x : 0; ++ StringExp *se2 = (x->op == TOKstring) ? (StringExp *)x : NULL; ++ ArrayLiteralExp *ae2 = (x->op == TOKarrayliteral) ? (ArrayLiteralExp *)x : NULL; + + // Now both must be either TOKarrayliteral or TOKstring + if (se1 && se2) +@@ -1244,6 +1332,21 @@ int ctfeCmpArrays(Loc loc, Expression *e + return 0; + } + ++/* Given a delegate expression e, return .funcptr. ++ * If e is NullExp, return NULL. ++ */ ++FuncDeclaration *funcptrOf(Expression *e) ++{ ++ assert(e->type->ty == Tdelegate); ++ ++ if (e->op == TOKdelegate) ++ return ((DelegateExp *)e)->func; ++ if (e->op == TOKfunction) ++ return ((FuncExp *)e)->fd; ++ assert(e->op == TOKnull); ++ return NULL; ++} ++ + bool isArray(Expression *e) + { + return e->op == TOKarrayliteral || e->op == TOKstring || +@@ -1261,13 +1364,16 @@ int ctfeRawCmp(Loc loc, Expression *e1, + return 0; + return 1; + } ++ ++ // null == null, regardless of type ++ + if (e1->op == TOKnull && e2->op == TOKnull) + return 0; + + if (e1->type->ty == Tpointer && e2->type->ty == Tpointer) +- { // Can only be an equality test. +- if (e1->op == TOKnull && e2->op == TOKnull) +- return 0; ++ { ++ // Can only be an equality test. ++ + dinteger_t ofs1, ofs2; + Expression *agg1 = getAggregateFromPointer(e1, &ofs1); + Expression *agg2 = getAggregateFromPointer(e2, &ofs2); +@@ -1278,6 +1384,35 @@ int ctfeRawCmp(Loc loc, Expression *e1, + } + return 1; + } ++ if (e1->type->ty == Tdelegate && e2->type->ty == Tdelegate) ++ { ++ // If .funcptr isn't the same, they are not equal ++ ++ if (funcptrOf(e1) != funcptrOf(e2)) ++ return 1; ++ ++ // If both are delegate literals, assume they have the ++ // same closure pointer. TODO: We don't support closures yet! ++ if (e1->op == TOKfunction && e2->op == TOKfunction) ++ return 0; ++ assert(e1->op == TOKdelegate && e2->op == TOKdelegate); ++ ++ // Same .funcptr. Do they have the same .ptr? ++ Expression * ptr1 = ((DelegateExp *)e1)->e1; ++ Expression * ptr2 = ((DelegateExp *)e2)->e1; ++ ++ dinteger_t ofs1, ofs2; ++ Expression *agg1 = getAggregateFromPointer(ptr1, &ofs1); ++ Expression *agg2 = getAggregateFromPointer(ptr2, &ofs2); ++ // If they are TOKvar, it means they are FuncDeclarations ++ if ((agg1 == agg2 && ofs1 == ofs2) || ++ (agg1->op == TOKvar && agg2->op == TOKvar && ++ ((VarExp *)agg1)->var == ((VarExp *)agg2)->var)) ++ { ++ return 0; ++ } ++ return 1; ++ } + if (isArray(e1) && isArray(e2)) + { + uinteger_t len1 = resolveArrayLength(e1); +@@ -1367,7 +1502,7 @@ int ctfeRawCmp(Loc loc, Expression *e1, + + + /// Evaluate ==, !=. Resolves slices before comparing. Returns 0 or 1 +-int ctfeEqual(Loc loc, enum TOK op, Expression *e1, Expression *e2) ++int ctfeEqual(Loc loc, TOK op, Expression *e1, Expression *e2) + { + int cmp = !ctfeRawCmp(loc, e1, e2); + if (op == TOKnotequal) +@@ -1377,7 +1512,7 @@ int ctfeEqual(Loc loc, enum TOK op, Expr + + + /// Evaluate is, !is. Resolves slices before comparing. Returns 0 or 1 +-int ctfeIdentity(Loc loc, enum TOK op, Expression *e1, Expression *e2) ++int ctfeIdentity(Loc loc, TOK op, Expression *e1, Expression *e2) + { + int cmp; + if (e1->op == TOKnull) +@@ -1414,10 +1549,12 @@ int ctfeIdentity(Loc loc, enum TOK op, E + + + /// Evaluate >,<=, etc. Resolves slices before comparing. Returns 0 or 1 +-int ctfeCmp(Loc loc, enum TOK op, Expression *e1, Expression *e2) ++int ctfeCmp(Loc loc, TOK op, Expression *e1, Expression *e2) + { + int n; +- if (e1->type->isString() && e2->type->isString()) ++ Type *t1 = e1->type->toBasetype(); ++ Type *t2 = e2->type->toBasetype(); ++ if (t1->isString() && t2->isString()) + { + int cmp = ctfeRawCmp(loc, e1, e2); + switch (op) +@@ -1440,15 +1577,15 @@ int ctfeCmp(Loc loc, enum TOK op, Expres + assert(0); + } + } +- else if (e1->type->isreal()) ++ else if (t1->isreal()) + { + n = realCmp(op, e1->toReal(), e2->toReal()); + } +- else if (e1->type->isimaginary()) ++ else if (t1->isimaginary()) + { + n = realCmp(op, e1->toImaginary(), e2->toImaginary()); + } +- else if (e1->type->isunsigned() || e2->type->isunsigned()) ++ else if (t1->isunsigned() || t2->isunsigned()) + { + n = intUnsignedCmp(op, e1->toInteger(), e2->toInteger()); + } +@@ -1478,15 +1615,16 @@ Expression *ctfeCat(Type *type, Expressi + void *s = mem.malloc((len + 1) * sz); + memcpy((char *)s + sz * es2->elements->dim, es1->string, es1->len * sz); + for (size_t i = 0; i < es2->elements->dim; i++) +- { Expression *es2e = es2->elements->tdata()[i]; ++ { ++ Expression *es2e = (*es2->elements)[i]; + if (es2e->op != TOKint64) + return EXP_CANT_INTERPRET; + dinteger_t v = es2e->toInteger(); +- memcpy((unsigned char *)s + i * sz, &v, sz); ++ memcpy((utf8_t *)s + i * sz, &v, sz); + } + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + StringExp *es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1508,15 +1646,16 @@ Expression *ctfeCat(Type *type, Expressi + void *s = mem.malloc((len + 1) * sz); + memcpy(s, es1->string, es1->len * sz); + for (size_t i = 0; i < es2->elements->dim; i++) +- { Expression *es2e = es2->elements->tdata()[i]; ++ { ++ Expression *es2e = (*es2->elements)[i]; + if (es2e->op != TOKint64) + return EXP_CANT_INTERPRET; + dinteger_t v = es2e->toInteger(); +- memcpy((unsigned char *)s + (es1->len + i) * sz, &v, sz); ++ memcpy((utf8_t *)s + (es1->len + i) * sz, &v, sz); + } + + // Add terminating 0 +- memset((unsigned char *)s + len * sz, 0, sz); ++ memset((utf8_t *)s + len * sz, 0, sz); + + StringExp *es = new StringExp(loc, s, len); + es->sz = sz; +@@ -1525,6 +1664,32 @@ Expression *ctfeCat(Type *type, Expressi + e = es; + return e; + } ++ else if (e1->op == TOKarrayliteral && e2->op == TOKarrayliteral && ++ t1->nextOf()->equals(t2->nextOf())) ++ { ++ // [ e1 ] ~ [ e2 ] ---> [ e1, e2 ] ++ ArrayLiteralExp *es1 = (ArrayLiteralExp *)e1; ++ ArrayLiteralExp *es2 = (ArrayLiteralExp *)e2; ++ ++ es1 = new ArrayLiteralExp(es1->loc, copyLiteralArray(es1->elements)); ++ es1->elements->insert(es1->elements->dim, copyLiteralArray(es2->elements)); ++ e = es1; ++ e->type = type; ++ return e; ++ } ++ else if (e1->op == TOKarrayliteral && e2->op == TOKnull && ++ t1->nextOf()->equals(t2->nextOf())) ++ { ++ // [ e1 ] ~ null ----> [ e1 ].dup ++ return paintTypeOntoLiteral(type, copyLiteral(e1)); ++ } ++ else if (e1->op == TOKnull && e2->op == TOKarrayliteral && ++ t1->nextOf()->equals(t2->nextOf())) ++ { ++ // null ~ [ e2 ] ----> [ e2 ].dup ++ return paintTypeOntoLiteral(type, copyLiteral(e2)); ++ } ++ + return Cat(type, e1, e2); + } + +@@ -1538,11 +1703,11 @@ Expression *findKeyInAA(Loc loc, AssocAr + for (size_t i = ae->keys->dim; i;) + { + i--; +- Expression *ekey = ae->keys->tdata()[i]; ++ Expression *ekey = (*ae->keys)[i]; + int eq = ctfeEqual(loc, TOKequal, ekey, e2); + if (eq) + { +- return ae->values->tdata()[i]; ++ return (*ae->values)[i]; + } + } + return NULL; +@@ -1572,7 +1737,7 @@ Expression *ctfeIndex(Loc loc, Type *typ + error(loc, "array index %llu is out of bounds %s[0 .. %llu]", indx, e1->toChars(), (ulonglong)ale->elements->dim); + return EXP_CANT_INTERPRET; + } +- Expression *e = ale->elements->tdata()[indx]; ++ Expression *e = (*ale->elements)[indx]; + return paintTypeOntoLiteral(type, e); + } + +@@ -1589,6 +1754,15 @@ Expression *ctfeCast(Loc loc, Type *type + else + return new NullExp(loc, to); + } ++ // Allow TypeInfo type painting ++ if (isTypeInfo_Class(e->type) && e->type->implicitConvTo(to)) ++ return paintTypeOntoLiteral(to, e); ++#if DMDV2 ++ // Allow casting away const for struct literals ++ if (e->op == TOKstructliteral && ++ e->type->toBasetype()->castMod(0) == to->toBasetype()->castMod(0)) ++ return paintTypeOntoLiteral(to, e); ++#endif + Expression *r = Cast(type, to, e); + if (r == EXP_CANT_INTERPRET) + error(loc, "cannot cast %s to %s at compile time", e->toChars(), to->toChars()); +@@ -1645,8 +1819,8 @@ void assignInPlace(Expression *dest, Exp + + for (size_t i= 0; i < oldelems->dim; ++i) + { +- Expression *e = newelems->tdata()[i]; +- Expression *o = oldelems->tdata()[i]; ++ Expression *e = (*newelems)[i]; ++ Expression *o = (*oldelems)[i]; + if (e->op == TOKstructliteral) + { + assert(o->op == e->op); +@@ -1658,7 +1832,7 @@ void assignInPlace(Expression *dest, Exp + } + else + { +- oldelems->tdata()[i] = newelems->tdata()[i]; ++ (*oldelems)[i] = (*newelems)[i]; + } + } + } +@@ -1668,10 +1842,10 @@ void recursiveBlockAssign(ArrayLiteralEx + assert( ae->type->ty == Tsarray || ae->type->ty == Tarray); + #if DMDV2 + Type *desttype = ((TypeArray *)ae->type)->next->castMod(0); +- bool directblk = (val->type->toBasetype()->castMod(0)) == desttype; ++ bool directblk = (val->type->toBasetype()->castMod(0))->equals(desttype); + #else + Type *desttype = ((TypeArray *)ae->type)->next; +- bool directblk = (val->type->toBasetype()) == desttype; ++ bool directblk = (val->type->toBasetype())->equals(desttype); + #endif + + bool cow = !(val->op == TOKstructliteral || val->op == TOKarrayliteral +@@ -1679,16 +1853,16 @@ void recursiveBlockAssign(ArrayLiteralEx + + for (size_t k = 0; k < ae->elements->dim; k++) + { +- if (!directblk && ae->elements->tdata()[k]->op == TOKarrayliteral) ++ if (!directblk && (*ae->elements)[k]->op == TOKarrayliteral) + { +- recursiveBlockAssign((ArrayLiteralExp *)ae->elements->tdata()[k], val, wantRef); ++ recursiveBlockAssign((ArrayLiteralExp *)(*ae->elements)[k], val, wantRef); + } + else + { + if (wantRef || cow) +- ae->elements->tdata()[k] = val; ++ (*ae->elements)[k] = val; + else +- assignInPlace(ae->elements->tdata()[k], val); ++ assignInPlace((*ae->elements)[k], val); + } + } + } +@@ -1704,7 +1878,7 @@ Expressions *changeOneElement(Expression + if (j == indexToChange) + (*expsx)[j] = newelem; + else +- (*expsx)[j] = oldelems->tdata()[j]; ++ (*expsx)[j] = (*oldelems)[j]; + } + return expsx; + } +@@ -1735,10 +1909,11 @@ Expression *assignAssocArrayElement(Loc + int updated = 0; + for (size_t j = valuesx->dim; j; ) + { j--; +- Expression *ekey = aae->keys->tdata()[j]; ++ Expression *ekey = (*aae->keys)[j]; + int eq = ctfeEqual(loc, TOKequal, ekey, index); + if (eq) +- { valuesx->tdata()[j] = newval; ++ { ++ (*valuesx)[j] = newval; + updated = 1; + } + } +@@ -1756,7 +1931,7 @@ Expression *assignAssocArrayElement(Loc + Expression *changeArrayLiteralLength(Loc loc, TypeArray *arrayType, + Expression *oldval, size_t oldlen, size_t newlen) + { +- Type *elemType = elemType = arrayType->next; ++ Type *elemType = arrayType->next; + assert(elemType); + Expression *defaultElem = elemType->defaultInitLiteral(loc); + Expressions *elements = new Expressions(); +@@ -1772,7 +1947,7 @@ Expression *changeArrayLiteralLength(Loc + if (oldval->op == TOKstring) + { + StringExp *oldse = (StringExp *)oldval; +- unsigned char *s = (unsigned char *)mem.calloc(newlen + 1, oldse->sz); ++ utf8_t *s = (utf8_t *)mem.calloc(newlen + 1, oldse->sz); + memcpy(s, oldse->string, copylen * oldse->sz); + unsigned defaultValue = (unsigned)(defaultElem->toInteger()); + for (size_t elemi = copylen; elemi < newlen; ++elemi) +@@ -1824,11 +1999,12 @@ Expression *changeArrayLiteralLength(Loc + + bool isCtfeValueValid(Expression *newval) + { +- if ( + #if DMDV2 +- newval->type->ty == Tnull || ++ bool isnull = newval->type->ty == Tnull; ++#else ++ bool isnull = false; + #endif +- isPointer(newval->type) ) ++ if (isnull || isPointer(newval->type)) + { + if (newval->op == TOKaddress || newval->op == TOKnull || + newval->op == TOKstring) +@@ -1880,13 +2056,30 @@ bool isCtfeValueValid(Expression *newval + if (ie->e2->op == TOKvar) + return true; + } +- if (newval->op == TOKfunction) return true; // function/delegate literal +- if (newval->op == TOKdelegate) return true; ++ ++ if (newval->op == TOKfunction) ++ return true; // function literal or delegate literal ++ ++ if (newval->op == TOKvector) ++ return true; // vector literal ++ ++ if (newval->op == TOKdelegate) ++ { ++ Expression *dge = ((DelegateExp *)newval)->e1; ++ if (dge->op == TOKvar && ((VarExp *)dge)->var->isFuncDeclaration()) ++ return true; // &nestedfunc ++ ++ if (dge->op == TOKstructliteral || dge->op == TOKclassreference) ++ return true; // &struct.func or &clasinst.func ++ } + if (newval->op == TOKsymoff) // function pointer + { + if (((SymOffExp *)newval)->var->isFuncDeclaration()) + return true; ++ if (((SymOffExp *)newval)->var->isDataseg()) ++ return true; // pointer to static variable + } ++ + if (newval->op == TOKint64 || newval->op == TOKfloat64 || + newval->op == TOKchar || newval->op == TOKcomplex80) + return true; +--- a/src/gcc/d/dfrontend/ctfe.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/ctfe.h 2014-04-01 16:32:51.000000000 +0100 +@@ -14,6 +14,7 @@ + #pragma once + #endif /* __DMC__ */ + ++#include "arraytypes.h" + + /** + Global status of the CTFE engine. Mostly used for performance diagnostics +@@ -29,22 +30,17 @@ struct CtfeStatus + static int numAssignments; // total number of assignments executed + }; + +- +-/** Expression subclasses which only exist in CTFE */ +- +-#define TOKclassreference ((TOK)(TOKMAX+1)) +-#define TOKthrownexception ((TOK)(TOKMAX+2)) +- + /** + A reference to a class, or an interface. We need this when we + point to a base class (we must record what the type is). + */ +-struct ClassReferenceExp : Expression ++class ClassReferenceExp : public Expression + { ++public: + StructLiteralExp *value; + ClassReferenceExp(Loc loc, StructLiteralExp *lit, Type *type); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- char *toChars(); ++ void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + ClassDeclaration *originalClass(); + VarDeclaration *getFieldAt(unsigned index); + +@@ -53,6 +49,12 @@ struct ClassReferenceExp : Expression + /// Return index of the field, or -1 if not found + /// Same as getFieldIndex, but checks for a direct match with the VarDeclaration + int findFieldIndexByName(VarDeclaration *v); ++ dt_t **toDt(dt_t **pdt); ++ dt_t **toDtI(dt_t **pdt, int offset); ++ Symbol* toSymbol(); ++ dt_t **toInstanceDt(dt_t **pdt); ++ dt_t **toDt2(dt_t **pdt, ClassDeclaration *cd, Dts *dts); ++ elem *toElem(IRState *irs); + }; + + /// Return index of the field, or -1 if not found +@@ -62,8 +64,9 @@ int findFieldIndexByName(StructDeclarati + + /** An uninitialized value + */ +-struct VoidInitExp : Expression ++class VoidInitExp : public Expression + { ++public: + VarDeclaration *var; + + VoidInitExp(VarDeclaration *var, Type *type); +@@ -75,8 +78,9 @@ struct VoidInitExp : Expression + /** Fake class which holds the thrown exception. + Used for implementing exception handling. + */ +-struct ThrownExceptionExp : Expression ++class ThrownExceptionExp : public Expression + { ++public: + ClassReferenceExp *thrown; // the thing being tossed + ThrownExceptionExp(Loc loc, ClassReferenceExp *victim); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +@@ -175,11 +179,11 @@ Expression *pointerDifference(Loc loc, T + + /// Return 1 if true, 0 if false + /// -1 if comparison is illegal because they point to non-comparable memory blocks +-int comparePointers(Loc loc, enum TOK op, Type *type, Expression *agg1, dinteger_t ofs1, Expression *agg2, dinteger_t ofs2); ++int comparePointers(Loc loc, TOK op, Type *type, Expression *agg1, dinteger_t ofs1, Expression *agg2, dinteger_t ofs2); + + // Return eptr op e2, where eptr is a pointer, e2 is an integer, + // and op is TOKadd or TOKmin +-Expression *pointerArithmetic(Loc loc, enum TOK op, Type *type, ++Expression *pointerArithmetic(Loc loc, TOK op, Type *type, + Expression *eptr, Expression *e2); + + // True if conversion from type 'from' to 'to' involves a reinterpret_cast +@@ -201,6 +205,9 @@ TypeAArray *toBuiltinAAType(Type *t); + */ + Expression *findKeyInAA(Loc loc, AssocArrayLiteralExp *ae, Expression *e2); + ++/// True if type is TypeInfo_Class ++bool isTypeInfo_Class(Type *type); ++ + /*********************************************** + In-place integer operations + ***********************************************/ +@@ -221,13 +228,13 @@ void intBinary(TOK op, IntegerExp *dest, + bool isCtfeComparable(Expression *e); + + /// Evaluate ==, !=. Resolves slices before comparing. Returns 0 or 1 +-int ctfeEqual(Loc loc, enum TOK op, Expression *e1, Expression *e2); ++int ctfeEqual(Loc loc, TOK op, Expression *e1, Expression *e2); + + /// Evaluate is, !is. Resolves slices before comparing. Returns 0 or 1 +-int ctfeIdentity(Loc loc, enum TOK op, Expression *e1, Expression *e2); ++int ctfeIdentity(Loc loc, TOK op, Expression *e1, Expression *e2); + + /// Evaluate >,<=, etc. Resolves slices before comparing. Returns 0 or 1 +-int ctfeCmp(Loc loc, enum TOK op, Expression *e1, Expression *e2); ++int ctfeCmp(Loc loc, TOK op, Expression *e1, Expression *e2); + + /// Returns e1 ~ e2. Resolves slices before concatenation. + Expression *ctfeCat(Type *type, Expression *e1, Expression *e2); +--- a/src/gcc/d/dfrontend/declaration.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/declaration.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -24,13 +24,14 @@ + #include "expression.h" + #include "statement.h" + #include "hdrgen.h" ++#include "ctfe.h" + #include "target.h" + + AggregateDeclaration *isAggregate(Type *t); // from opover.c + + void checkFrameAccess(Loc loc, Scope *sc, AggregateDeclaration *ad) + { +- if (!ad->isnested) ++ if (!ad->isNested()) + return; + + Dsymbol *s = sc->func; +@@ -83,6 +84,7 @@ Declaration::Declaration(Identifier *id) + linkage = LINKdefault; + inuse = 0; + sem = SemanticStart; ++ mangleOverride = NULL; + } + + void Declaration::semantic(Scope *sc) +@@ -100,27 +102,27 @@ unsigned Declaration::size(Loc loc) + return type->size(); + } + +-int Declaration::isDelete() ++bool Declaration::isDelete() + { +- return FALSE; ++ return false; + } + +-int Declaration::isDataseg() ++bool Declaration::isDataseg() + { +- return FALSE; ++ return false; + } + +-int Declaration::isThreadlocal() ++bool Declaration::isThreadlocal() + { +- return FALSE; ++ return false; + } + +-int Declaration::isCodeseg() ++bool Declaration::isCodeseg() + { +- return FALSE; ++ return false; + } + +-enum PROT Declaration::prot() ++PROT Declaration::prot() + { + return protection; + } +@@ -138,18 +140,20 @@ int Declaration::checkModify(Loc loc, Sc + if (v && v->canassign) + return 2; + +- if ((sc->flags & SCOPEcontract) && isParameter()) ++ if (isParameter() || isResult()) + { +- if (!flag) error(loc, "cannot modify parameter '%s' in contract", toChars()); +- return 0; +- } +- if ((sc->flags & SCOPEcontract) && isResult()) +- { +- if (!flag) error(loc, "cannot modify result '%s' in contract", toChars()); +- return 0; ++ for (Scope *scx = sc; scx; scx = scx->enclosing) ++ { ++ if (scx->func == parent && (scx->flags & SCOPEcontract)) ++ { ++ const char *s = isParameter() && parent->ident != Id::ensure ? "parameter" : "result"; ++ if (!flag) error(loc, "cannot modify %s '%s' in contract", s, toChars()); ++ return 2; // do not report type related errors ++ } ++ } + } + +- if (v && isCtorinit()) ++ if (v && (isCtorinit() || isField())) + { // It's only modifiable if inside the right constructor + if ((storage_class & (STCforeach | STCref)) == (STCforeach | STCref)) + return 2; +@@ -180,7 +184,7 @@ TupleDeclaration::TupleDeclaration(Loc l + this->loc = loc; + this->type = NULL; + this->objects = objects; +- this->isexp = 0; ++ this->isexp = false; + this->tupletype = NULL; + } + +@@ -208,7 +212,7 @@ Type *TupleDeclaration::getType() + /* It's only a type tuple if all the Object's are types + */ + for (size_t i = 0; i < objects->dim; i++) +- { Object *o = (*objects)[i]; ++ { RootObject *o = (*objects)[i]; + + if (o->dyncast() != DYNCAST_TYPE) + { +@@ -243,17 +247,17 @@ Type *TupleDeclaration::getType() + + tupletype = new TypeTuple(args); + if (hasdeco) +- return tupletype->semantic(0, NULL); ++ return tupletype->semantic(Loc(), NULL); + } + + return tupletype; + } + +-int TupleDeclaration::needThis() ++bool TupleDeclaration::needThis() + { + //printf("TupleDeclaration::needThis(%s)\n", toChars()); + for (size_t i = 0; i < objects->dim; i++) +- { Object *o = (*objects)[i]; ++ { RootObject *o = (*objects)[i]; + if (o->dyncast() == DYNCAST_EXPRESSION) + { Expression *e = (Expression *)o; + if (e->op == TOKdsymbol) +@@ -261,12 +265,12 @@ int TupleDeclaration::needThis() + Declaration *d = ve->s->isDeclaration(); + if (d && d->needThis()) + { +- return 1; ++ return true; + } + } + } + } +- return 0; ++ return false; + } + + +@@ -367,7 +371,7 @@ void TypedefDeclaration::semantic2(Scope + Initializer *savedinit = init; + int errors = global.errors; + init = init->semantic(sc, basetype, INITinterpret); +- if (errors != global.errors) ++ if (errors != global.errors || init->isErrorInitializer()) + { + init = savedinit; + return; +@@ -420,7 +424,7 @@ AliasDeclaration::AliasDeclaration(Loc l + this->htype = NULL; + this->haliassym = NULL; + this->overnext = NULL; +- this->inSemantic = 0; ++ this->inSemantic = false; + assert(type); + } + +@@ -436,7 +440,7 @@ AliasDeclaration::AliasDeclaration(Loc l + this->htype = NULL; + this->haliassym = NULL; + this->overnext = NULL; +- this->inSemantic = 0; ++ this->inSemantic = false; + assert(s); + } + +@@ -481,7 +485,7 @@ void AliasDeclaration::semantic(Scope *s + aliassym->semantic(sc); + return; + } +- this->inSemantic = 1; ++ this->inSemantic = true; + + #if DMDV1 // don't really know why this is here + if (storage_class & STCconst) +@@ -514,6 +518,12 @@ void AliasDeclaration::semantic(Scope *s + * try to alias y to 3. + */ + s = type->toDsymbol(sc); ++ if (s && s == this) ++ { ++ error("cannot resolve"); ++ s = NULL; ++ type = Type::terror; ++ } + if (s + #if DMDV2 + && ((s->getType() && type->equals(s->getType())) || s->isEnumMember()) +@@ -555,8 +565,8 @@ void AliasDeclaration::semantic(Scope *s + //printf("\talias resolved to type %s\n", type->toChars()); + } + if (overnext) +- ScopeDsymbol::multiplyDefined(0, overnext, this); +- this->inSemantic = 0; ++ ScopeDsymbol::multiplyDefined(Loc(), overnext, this); ++ this->inSemantic = false; + + if (global.gag && errors != global.errors) + type = savedtype; +@@ -581,7 +591,7 @@ void AliasDeclaration::semantic(Scope *s + { + FuncAliasDeclaration *fa = new FuncAliasDeclaration(f); + if (!fa->overloadInsert(overnext)) +- ScopeDsymbol::multiplyDefined(0, overnext, f); ++ ScopeDsymbol::multiplyDefined(Loc(), overnext, f); + overnext = NULL; + s = fa; + s->parent = sc->parent; +@@ -599,7 +609,7 @@ void AliasDeclaration::semantic(Scope *s + } + } + if (overnext) +- ScopeDsymbol::multiplyDefined(0, overnext, this); ++ ScopeDsymbol::multiplyDefined(Loc(), overnext, this); + if (s == this) + { + assert(global.errors); +@@ -610,16 +620,16 @@ void AliasDeclaration::semantic(Scope *s + type = savedtype; + overnext = savedovernext; + aliassym = NULL; +- inSemantic = 0; ++ inSemantic = false; + return; + } + } + //printf("setting aliassym %s to %s %s\n", toChars(), s->kind(), s->toChars()); + aliassym = s; +- this->inSemantic = 0; ++ this->inSemantic = false; + } + +-int AliasDeclaration::overloadInsert(Dsymbol *s) ++bool AliasDeclaration::overloadInsert(Dsymbol *s) + { + /* Don't know yet what the aliased symbol is, so assume it can + * be overloaded and check later for correctness. +@@ -642,10 +652,10 @@ int AliasDeclaration::overloadInsert(Dsy + { + if (s == this) + { +- return TRUE; ++ return true; + } + overnext = s; +- return TRUE; ++ return true; + } + else + { +@@ -671,15 +681,21 @@ Dsymbol *AliasDeclaration::toAlias() + assert(this != aliassym); + //static int count; if (++count == 10) *(char*)0=0; + if (inSemantic) +- { error("recursive alias declaration"); ++ { ++ error("recursive alias declaration"); ++ ++ // Avoid breaking "recursive alias" state during errors gagged ++ if (global.isSpeculativeGagging()) ++ return this; ++ + aliassym = new AliasDeclaration(loc, ident, Type::terror); + type = Type::terror; + } + else if (aliassym || type->deco) + ; // semantic is already done. +- else if (import) ++ else if (import && import->scope) + { +- /* If this is an internal alias for selective import, ++ /* If this is an internal alias for selective/renamed import, + * resolve it under the correct scope. + */ + import->semantic(NULL); +@@ -816,8 +832,13 @@ void VarDeclaration::semantic(Scope *sc) + // return; + // sem = SemanticIn; + ++ if (sem >= SemanticDone) ++ return; ++ ++ Scope *scx = NULL; + if (scope) + { sc = scope; ++ scx = sc; + scope = NULL; + } + +@@ -839,6 +860,11 @@ void VarDeclaration::semantic(Scope *sc) + if (!type) + { inuse++; + ++ // Infering the type requires running semantic, ++ // so mark the scope as ctfe if required ++ bool needctfe = (storage_class & (STCmanifest | STCstatic)); ++ if (needctfe) sc = sc->startCTFE(); ++ + //printf("inferring type for %s with init %s\n", toChars(), init->toChars()); + ArrayInitializer *ai = init->isArrayInitializer(); + if (ai) +@@ -858,8 +884,11 @@ void VarDeclaration::semantic(Scope *sc) + type = type->nextOf()->arrayOf(); + } + else ++ { + type = init->inferType(sc); ++ } + ++ if (needctfe) sc = sc->endCTFE(); + // type = type->semantic(loc, sc); + + inuse--; +@@ -879,7 +908,9 @@ void VarDeclaration::semantic(Scope *sc) + else + { if (!originalType) + originalType = type->syntaxCopy(); ++ inuse++; + type = type->semantic(loc, sc); ++ inuse--; + } + //printf(" semantic type = %s\n", type ? type->toChars() : "null"); + +@@ -933,6 +964,7 @@ void VarDeclaration::semantic(Scope *sc) + FuncDeclaration *fd = parent->isFuncDeclaration(); + + Type *tb = type->toBasetype(); ++ Type *tbn = tb->baseElemOf(); + if (tb->ty == Tvoid && !(storage_class & STClazy)) + { + if (inferred) +@@ -969,7 +1001,7 @@ void VarDeclaration::semantic(Scope *sc) + size_t nelems = Parameter::dim(tt->arguments); + Objects *exps = new Objects(); + exps->setDim(nelems); +- Expression *ie = init ? init->toExpression() : NULL; ++ Expression *ie = (init && !init->isVoidInitializer()) ? init->toExpression() : NULL; + if (ie) ie = ie->semantic(sc); + + if (nelems > 0 && ie) +@@ -1005,6 +1037,7 @@ void VarDeclaration::semantic(Scope *sc) + + iexps->remove(pos); + iexps->insert(pos, te->exps); ++ (*iexps)[pos] = Expression::combine(te->e0, (*iexps)[pos]); + goto Lexpand1; + } + else if (isAliasThisTuple(e)) +@@ -1060,16 +1093,19 @@ void VarDeclaration::semantic(Scope *sc) + Lnomatch: + + if (ie && ie->op == TOKtuple) +- { size_t tedim = ((TupleExp *)ie)->exps->dim; ++ { ++ TupleExp *te = (TupleExp *)ie; ++ size_t tedim = te->exps->dim; + if (tedim != nelems) + { ::error(loc, "tuple of %d elements cannot be assigned to tuple of %d elements", (int)tedim, (int)nelems); + for (size_t u = tedim; u < nelems; u++) // fill dummy expression +- ((TupleExp *)ie)->exps->push(new ErrorExp()); ++ te->exps->push(new ErrorExp()); + } + } + + for (size_t i = 0; i < nelems; i++) +- { Parameter *arg = Parameter::getNth(tt->arguments, i); ++ { ++ Parameter *arg = Parameter::getNth(tt->arguments, i); + + OutBuffer buf; + buf.printf("_%s_field_%llu", ident->toChars(), (ulonglong)i); +@@ -1077,16 +1113,24 @@ Lnomatch: + const char *name = (const char *)buf.extractData(); + Identifier *id = Lexer::idPool(name); + +- Expression *einit = ie; +- if (ie && ie->op == TOKtuple) +- { einit = (*((TupleExp *)ie)->exps)[i]; +- } +- Initializer *ti = init; +- if (einit) +- { ti = new ExpInitializer(einit->loc, einit); ++ Initializer *ti; ++ if (ie) ++ { ++ Expression *einit = ie; ++ if (ie->op == TOKtuple) ++ { ++ TupleExp *te = (TupleExp *)ie; ++ einit = (*te->exps)[i]; ++ if (i == 0) ++ einit = Expression::combine(te->e0, einit); ++ } ++ ti = new ExpInitializer(einit->loc, einit); + } ++ else ++ ti = init ? init->syntaxCopy() : NULL; + + VarDeclaration *v = new VarDeclaration(loc, arg->type, id, ti); ++ v->storage_class |= storage_class; + if (arg->storageClass & STCparameter) + v->storage_class |= arg->storageClass; + //printf("declaring field %s of type %s\n", v->toChars(), v->type->toChars()); +@@ -1103,7 +1147,7 @@ Lnomatch: + } + TupleDeclaration *v2 = new TupleDeclaration(loc, ident, exps); + v2->parent = this->parent; +- v2->isexp = 1; ++ v2->isexp = true; + aliassym = v2; + return; + } +@@ -1126,7 +1170,10 @@ Lnomatch: + else if (type->isWild()) + storage_class |= STCwild; + +- if (isSynchronized()) ++ if (storage_class & (STCmanifest | STCstatic | STCgshared)) ++ { ++ } ++ else if (isSynchronized()) + { + error("variable %s cannot be synchronized", toChars()); + } +@@ -1151,24 +1198,46 @@ Lnomatch: + AggregateDeclaration *aad = parent->isAggregateDeclaration(); + if (aad) + { +-#if DMDV2 ++#if PULL93 + assert(!(storage_class & (STCextern | STCstatic | STCtls | STCgshared))); +- ++ if (storage_class & (STCconst | STCimmutable) && init && ++ global.params.vfield) ++ { ++ const char *p = loc.toChars(); ++ const char *s = (storage_class & STCimmutable) ? "immutable" : "const"; ++ fprintf(global.stdmsg, "%s: %s.%s is %s field\n", p ? p : "", ad->toPrettyChars(), toChars(), s); ++ } ++ storage_class |= STCfield; ++#if DMDV2 ++ if (tbn->ty == Tstruct && ((TypeStruct *)tbn)->sym->noDefaultCtor || ++ tbn->ty == Tclass && ((TypeClass *)tbn)->sym->noDefaultCtor) ++ { ++ if (!isThisDeclaration()) ++ aad->noDefaultCtor = TRUE; ++ } ++#endif ++#else + if (storage_class & (STCconst | STCimmutable) && init) + { ++ StorageClass stc = storage_class & (STCconst | STCimmutable); ++ warning(loc, "%s field with initializer should be static, __gshared, or an enum", ++ StorageClassDeclaration::stcToChars(NULL, stc)); + if (!tb->isTypeBasic()) + storage_class |= STCstatic; + } + else +-#endif + { + storage_class |= STCfield; + #if DMDV2 +- if (tb->ty == Tstruct && ((TypeStruct *)tb)->sym->noDefaultCtor || +- tb->ty == Tclass && ((TypeClass *)tb)->sym->noDefaultCtor) +- aad->noDefaultCtor = TRUE; ++ if ((tbn->ty == Tstruct && ((TypeStruct *)tbn)->sym->noDefaultCtor) || ++ (tbn->ty == Tclass && ((TypeClass *)tbn)->sym->noDefaultCtor)) ++ { ++ if (!isThisDeclaration()) ++ aad->noDefaultCtor = TRUE; ++ } + #endif + } ++#endif + } + + InterfaceDeclaration *id = parent->isInterfaceDeclaration(); +@@ -1221,25 +1290,35 @@ Lnomatch: + { + if (func->fes) + func = func->fes->func; +- if (!((TypeFunction *)func->type)->iswild) ++ bool isWild = false; ++ for (FuncDeclaration *fd = func; fd; fd = fd->toParent2()->isFuncDeclaration()) ++ { ++ if (((TypeFunction *)fd->type)->iswild) ++ { ++ isWild = true; ++ break; ++ } ++ } ++ if (!isWild) + { + error("inout variables can only be declared inside inout functions"); + } + } + } + +- if (!(storage_class & (STCctfe | STCref)) && tb->ty == Tstruct && +- ((TypeStruct *)tb)->sym->noDefaultCtor) ++ if (!(storage_class & (STCctfe | STCref | STCresult)) && tbn->ty == Tstruct && ++ ((TypeStruct *)tbn)->sym->noDefaultCtor) + { + if (!init) +- { if (storage_class & STCfield) ++ { ++ if (isField()) + /* For fields, we'll check the constructor later to make sure it is initialized + */ + storage_class |= STCnodefaultctor; + else if (storage_class & STCparameter) + ; + else +- error("initializer required for type %s", type->toChars()); ++ error("default construction is disabled for type %s", type->toChars()); + } + } + #endif +@@ -1268,8 +1347,8 @@ Lnomatch: + else if (storage_class & STCmanifest) + error("manifest constants must have initializers"); + +- enum TOK op = TOKconstruct; +- if (!init && !sc->inunion && !isStatic() && fd && ++ TOK op = TOKconstruct; ++ if (!init && !sc->inunion && !(storage_class & (STCstatic | STCgshared | STCextern)) && fd && + (!(storage_class & (STCfield | STCin | STCforeach | STCparameter | STCresult)) + || (storage_class & STCout)) && + type->size() != 0) +@@ -1344,7 +1423,6 @@ Lnomatch: + init = new ExpInitializer(e->loc, e); + } + +- StructInitializer *si = init->isStructInitializer(); + ExpInitializer *ei = init->isExpInitializer(); + + if (ei && isScope()) +@@ -1413,7 +1491,7 @@ Lnomatch: + if (t->ty != Tsarray) + break; + dim *= ((TypeSArray *)t)->dim->toInteger(); +- e1->type = new TypeSArray(t->nextOf(), new IntegerExp(0, dim, Type::tindex)); ++ e1->type = TypeSArray::makeType(Loc(), t->nextOf(), dim); + } + } + e1 = new SliceExp(loc, e1, NULL, NULL); +@@ -1440,7 +1518,7 @@ Lnomatch: + /* Look for form of constructor call which is: + * *__ctmp.ctor(arguments...) + */ +- if (1) ++ if ((*pinit)->type->implicitConvTo(t)) + { CallExp *ce = (CallExp *)(*pinit); + if (ce->e1->op == TOKdotvar) + { DotVarExp *dve = (DotVarExp *)ce->e1; +@@ -1459,17 +1537,19 @@ Lnomatch: + */ + storage_class &= ~(STCref | STCforeach | STCparameter); + +- Expression *e; ++ Expression *e = new VarExp(loc, this); + if (sd->zeroInit == 1) + { +- e = new ConstructExp(loc, new VarExp(loc, this), new IntegerExp(loc, 0, Type::tint32)); ++ e = new ConstructExp(loc, e, new IntegerExp(loc, 0, Type::tint32)); + } + else if (sd->isNested()) +- { e = new AssignExp(loc, new VarExp(loc, this), t->defaultInitLiteral(loc)); ++ { ++ e = new AssignExp(loc, e, t->defaultInitLiteral(loc)); + e->op = TOKblit; + } + else +- { e = new AssignExp(loc, new VarExp(loc, this), t->defaultInit(loc)); ++ { ++ e = new AssignExp(loc, e, t->defaultInit(loc)); + e->op = TOKblit; + } + e->type = t; +@@ -1548,6 +1628,11 @@ Lnomatch: + init = init->semantic(sc, type, INITinterpret); + } + } ++ else if (parent->isAggregateDeclaration()) ++ { ++ scope = scx ? scx : new Scope(*sc); ++ scope->setNoFree(); ++ } + else if (storage_class & (STCconst | STCimmutable | STCmanifest) || + type->isConst() || type->isImmutable()) + { +@@ -1557,18 +1642,21 @@ Lnomatch: + * Ignore failure. + */ + +- if (!global.errors && !inferred) ++ if (!inferred) + { +- unsigned errors = global.startGagging(); +- Expression *exp; +- Initializer *i2 = init; ++ unsigned errors = global.errors; + inuse++; ++#if DMDV2 + if (ei) + { +- exp = ei->exp->syntaxCopy(); ++ Expression *exp = ei->exp->syntaxCopy(); ++ ++ bool needctfe = isDataseg() || (storage_class & STCmanifest); ++ if (needctfe) sc = sc->startCTFE(); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); +-#if DMDV2 ++ if (needctfe) sc = sc->endCTFE(); ++ + Type *tb = type->toBasetype(); + Type *ti = exp->type->toBasetype(); + +@@ -1584,103 +1672,35 @@ Lnomatch: + * because the postblit doesn't get run on the initialization of w. + */ + if (ti->ty == Tstruct) +- { StructDeclaration *sd = ((TypeStruct *)ti)->sym; ++ { ++ StructDeclaration *sd = ((TypeStruct *)ti)->sym; + /* Look to see if initializer involves a copy constructor + * (which implies a postblit) + */ + if (sd->cpctor && // there is a copy constructor +- tb->equals(ti)) // rvalue is the same struct ++ tb->toDsymbol(NULL) == sd) // exp is the same struct + { + // The only allowable initializer is a (non-copy) constructor +- if (exp->op == TOKcall) +- { +- CallExp *ce = (CallExp *)exp; +- if (ce->e1->op == TOKdotvar) +- { +- DotVarExp *dve = (DotVarExp *)ce->e1; +- if (dve->var->isCtorDeclaration()) +- goto LNoCopyConstruction; +- } +- } +- global.gag--; +- error("of type struct %s uses this(this), which is not allowed in static initialization", tb->toChars()); +- global.gag++; +- +- LNoCopyConstruction: +- ; ++ if (exp->isLvalue()) ++ error("of type struct %s uses this(this), which is not allowed in static initialization", tb->toChars()); + } + } +- +- // Look for implicit constructor call +- if (tb->ty == Tstruct && +- !(ti->ty == Tstruct && tb->toDsymbol(sc) == ti->toDsymbol(sc)) && +- !exp->implicitConvTo(type)) +- { +- StructDeclaration *sd = ((TypeStruct *)tb)->sym; +- if (sd->ctor) +- { // Look for constructor first +- // Rewrite as e1.ctor(arguments) +- Expression *e; +- e = new StructLiteralExp(loc, sd, NULL, NULL); +- e = new DotIdExp(loc, e, Id::ctor); +- e = new CallExp(loc, e, exp); +- e = e->semantic(sc); +- exp = e->ctfeInterpret(); +- } +- } +-#endif +- exp = exp->implicitCastTo(sc, type); +- } +- else if (si || ai) +- { i2 = init->syntaxCopy(); +- i2 = i2->semantic(sc, type, INITinterpret); ++ ei->exp = exp; + } ++#endif ++ init = init->semantic(sc, type, INITinterpret); + inuse--; +- if (global.endGagging(errors)) // if errors happened ++ if (global.errors > errors) + { +-#if DMDV2 +- /* Save scope for later use, to try again +- */ +- scope = new Scope(*sc); +- scope->setNoFree(); +-#endif ++ init = new ErrorInitializer(); ++ type = Type::terror; + } +- else if (ei) +- { +- if (isDataseg() || (storage_class & STCmanifest)) +- exp = exp->ctfeInterpret(); +- else +- exp = exp->optimize(WANTvalue); +- switch (exp->op) +- { +- case TOKint64: +- case TOKfloat64: +- case TOKstring: +- case TOKarrayliteral: +- case TOKassocarrayliteral: +- case TOKstructliteral: +- case TOKnull: +- ei->exp = exp; // no errors, keep result +- break; +- +- default: +-#if DMDV2 +- /* Save scope for later use, to try again +- */ +- scope = new Scope(*sc); +- scope->setNoFree(); +-#endif +- break; +- } +- } +- else +- init = i2; // no errors, keep result + } +- } +- else if (parent->isAggregateDeclaration()) +- { +- scope = new Scope(*sc); +- scope->setNoFree(); ++ else ++ { ++ scope = scx ? scx : new Scope(*sc); ++ scope->setNoFree(); ++ } + } + sc = sc->pop(); + } +@@ -1691,7 +1711,10 @@ Ldtor: + edtor = callScopeDtor(sc); + if (edtor) + { +- edtor = edtor->semantic(sc); ++ if (sc->func && storage_class & (STCstatic | STCgshared)) ++ edtor = edtor->semantic(sc->module->scope); ++ else ++ edtor = edtor->semantic(sc); + + #if 0 // currently disabled because of std.stdio.stdin, stdout and stderr + if (isDataseg() && !(storage_class & STCextern)) +@@ -1700,6 +1723,9 @@ Ldtor: + } + + sem = SemanticDone; ++ ++ if (type->toBasetype()->ty == Terror) ++ errors = true; + } + + void VarDeclaration::semantic2(Scope *sc) +@@ -1743,6 +1769,55 @@ void VarDeclaration::semantic2(Scope *sc + init = init->semantic(sc, type, INITinterpret); + inuse--; + } ++ if (storage_class & STCmanifest) ++ { ++ #if 0 ++ if ((type->ty == Tclass)&&type->isMutable()) ++ { ++ error("is mutable. Only const and immutable class enum are allowed, not %s", type->toChars()); ++ } ++ else if (type->ty == Tpointer && type->nextOf()->ty == Tstruct && type->nextOf()->isMutable()) ++ { ++ ExpInitializer *ei = init->isExpInitializer(); ++ if (ei->exp->op == TOKaddress && ((AddrExp *)ei->exp)->e1->op == TOKstructliteral) ++ { ++ error("is a pointer to mutable struct. Only pointers to const or immutable struct enum are allowed, not %s", type->toChars()); ++ } ++ } ++ #else ++ if (type->ty == Tclass && init) ++ { ++ ExpInitializer *ei = init->isExpInitializer(); ++ if (ei->exp->op == TOKclassreference) ++ error(": Unable to initialize enum with class or pointer to struct. Use static const variable instead."); ++ } ++ else if (type->ty == Tpointer && type->nextOf()->ty == Tstruct) ++ { ++ ExpInitializer *ei = init->isExpInitializer(); ++ if (ei && ei->exp->op == TOKaddress && ((AddrExp *)ei->exp)->e1->op == TOKstructliteral) ++ { ++ error(": Unable to initialize enum with class or pointer to struct. Use static const variable instead."); ++ } ++ } ++ #endif ++ } ++ else if (init && isThreadlocal()) ++ { ++ if ((type->ty == Tclass)&&type->isMutable()&&!type->isShared()) ++ { ++ ExpInitializer *ei = init->isExpInitializer(); ++ if (ei->exp->op == TOKclassreference) ++ error("is mutable. Only const or immutable class thread local variable are allowed, not %s", type->toChars()); ++ } ++ else if (type->ty == Tpointer && type->nextOf()->ty == Tstruct && type->nextOf()->isMutable() &&!type->nextOf()->isShared()) ++ { ++ ExpInitializer *ei = init->isExpInitializer(); ++ if (ei && ei->exp->op == TOKaddress && ((AddrExp *)ei->exp)->e1->op == TOKstructliteral) ++ { ++ error("is a pointer to mutable struct. Only pointers to const, immutable or shared struct thread local variable are allowed are allowed, not %s", type->toChars()); ++ } ++ } ++ } + sem = Semantic2Done; + } + +@@ -1755,7 +1830,7 @@ void VarDeclaration::setFieldOffset(Aggr + TupleDeclaration *v2 = aliassym->isTupleDeclaration(); + assert(v2); + for (size_t i = 0; i < v2->objects->dim; i++) +- { Object *o = (*v2->objects)[i]; ++ { RootObject *o = (*v2->objects)[i]; + assert(o->dyncast() == DYNCAST_EXPRESSION); + Expression *e = (Expression *)o; + assert(e->op == TOKdsymbol); +@@ -1765,7 +1840,7 @@ void VarDeclaration::setFieldOffset(Aggr + return; + } + +- if (!(storage_class & STCfield)) ++ if (!isField()) + return; + assert(!(storage_class & (STCstatic | STCextern | STCparameter | STCtls))); + +@@ -1786,47 +1861,32 @@ void VarDeclaration::setFieldOffset(Aggr + { // References are the size of a pointer + t = Type::tvoidptr; + } +- if (t->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)t; +-#if DMDV2 +- if (ts->sym == ad) +- { +- ad->error("cannot have field %s with same struct type", toChars()); +- } +-#endif +- +- if (ts->sym->sizeok != SIZEOKdone && ts->sym->scope) +- ts->sym->semantic(NULL); +- if (ts->sym->sizeok != SIZEOKdone) +- { +- ad->sizeok = SIZEOKfwd; // cannot finish; flag as forward referenced +- return; +- } +- } +- if (t->ty == Tident) ++ if (t->ty == Tstruct || t->ty == Tsarray) + { +- ad->sizeok = SIZEOKfwd; // cannot finish; flag as forward referenced +- return; +- } +-#if DMDV2 +- else if (t->ty == Tsarray) +- { +- Type *tv = t->toBasetype(); +- while (tv->ty == Tsarray) +- { +- tv = tv->nextOf()->toBasetype(); +- } ++ Type *tv = t->baseElemOf(); + if (tv->ty == Tstruct) + { + TypeStruct *ts = (TypeStruct *)tv; +- if (ad == ts->sym) ++ if (ts->sym == ad) ++ { ++ const char *s = (t->ty == Tsarray) ? "static array of " : ""; ++ ad->error("cannot have field %s with %ssame struct type", toChars(), s); ++ } ++ if (ts->sym->sizeok != SIZEOKdone && ts->sym->scope) ++ ts->sym->semantic(NULL); ++ if (ts->sym->sizeok != SIZEOKdone) + { +- ad->error("cannot have field %s with same struct type", toChars()); ++ ad->sizeok = SIZEOKfwd; // cannot finish; flag as forward referenced + return; + } + } + } +-#endif ++ if (t->ty == Tident) ++ { ++ ad->sizeok = SIZEOKfwd; // cannot finish; flag as forward referenced ++ return; ++ } ++ + + unsigned memsize = t->size(loc); // size of member + unsigned memalignsize = Target::fieldalign(t); // size of member for alignment purposes +@@ -1885,9 +1945,10 @@ AggregateDeclaration *VarDeclaration::is + if (!(storage_class & (STCstatic | STCextern | STCmanifest | STCtemplateparameter | + STCtls | STCgshared | STCctfe))) + { ++#if !PULL93 + if ((storage_class & (STCconst | STCimmutable | STCwild)) && init) + return NULL; +- ++#endif + for (Dsymbol *s = this; s; s = s->parent) + { + ad = s->isMember(); +@@ -1899,24 +1960,29 @@ AggregateDeclaration *VarDeclaration::is + return ad; + } + +-int VarDeclaration::needThis() ++bool VarDeclaration::needThis() + { + //printf("VarDeclaration::needThis(%s, x%x)\n", toChars(), storage_class); +- return storage_class & STCfield; ++ return isField(); ++} ++ ++bool VarDeclaration::isExport() ++{ ++ return protection == PROTexport; + } + +-int VarDeclaration::isImportedSymbol() ++bool VarDeclaration::isImportedSymbol() + { + if (protection == PROTexport && !init && + (storage_class & STCstatic || parent->isModule())) +- return TRUE; +- return FALSE; ++ return true; ++ return false; + } + + void VarDeclaration::checkCtorConstInit() + { + #if 0 /* doesn't work if more than one static ctor */ +- if (ctorinit == 0 && isCtorinit() && !(storage_class & STCfield)) ++ if (ctorinit == 0 && isCtorinit() && !isField()) + error("missing initializer in static constructor for const variable"); + #endif + } +@@ -1970,6 +2036,16 @@ void VarDeclaration::checkNestedReferenc + if (FuncLiteralDeclaration *fld = s->isFuncLiteralDeclaration()) + { + fld->tok = TOKdelegate; ++ ++ /* This is necessary to avoid breaking tests for 8751 & 8793. ++ * See: compilable/testInference.d ++ */ ++ if (type->isMutable() || // mutable variable ++ !type->implicitConvTo(type->immutableOf()) || // has any mutable indirections ++ !fdv->isPureBypassingInference()) // does not belong to pure function ++ { ++ fld->setImpure(); // Bugzilla 9415 ++ } + } + } + +@@ -2021,28 +2097,37 @@ ExpInitializer *VarDeclaration::getExpIn + * Otherwise, return NULL. + */ + +-Expression *VarDeclaration::getConstInitializer() ++Expression *VarDeclaration::getConstInitializer(bool needFullType) + { +- if ((isConst() || isImmutable() || storage_class & STCmanifest) && +- storage_class & STCinit) ++ assert(type && init); ++ ++ // Ungag errors when not speculative ++ unsigned oldgag = global.gag; ++ if (global.isSpeculativeGagging()) + { +- ExpInitializer *ei = getExpInitializer(); +- if (ei) +- return ei->exp; +- else if (init) +- { +- return init->toExpression(); +- } ++ Dsymbol *sym = toParent()->isAggregateDeclaration(); ++ if (sym && !sym->isSpeculative()) ++ global.gag = 0; + } + +- return NULL; ++ if (scope) ++ { ++ inuse++; ++ init = init->semantic(scope, type, INITinterpret); ++ scope = NULL; ++ inuse--; ++ } ++ Expression *e = init->toExpression(needFullType ? type : NULL); ++ ++ global.gag = oldgag; ++ return e; + } + + /************************************* +- * Return !=0 if we can take the address of this variable. ++ * Return true if we can take the address of this variable. + */ + +-int VarDeclaration::canTakeAddressOf() ++bool VarDeclaration::canTakeAddressOf() + { + #if 0 + /* Global variables and struct/class fields of the form: +@@ -2051,18 +2136,18 @@ int VarDeclaration::canTakeAddressOf() + */ + if ((isConst() || isImmutable()) && + storage_class & STCinit && +- (!(storage_class & (STCstatic | STCextern)) || (storage_class & STCfield)) && ++ (!(storage_class & (STCstatic | STCextern)) || isField()) && + (!parent || toParent()->isModule() || toParent()->isTemplateInstance()) && + type->toBasetype()->isTypeBasic() + ) + { +- return 0; ++ return false; + } + #else + if (storage_class & STCmanifest) +- return 0; ++ return false; + #endif +- return 1; ++ return true; + } + + +@@ -2071,7 +2156,7 @@ int VarDeclaration::canTakeAddressOf() + * Includes extern variables. + */ + +-int VarDeclaration::isDataseg() ++bool VarDeclaration::isDataseg() + { + #if 0 + printf("VarDeclaration::isDataseg(%p, '%s')\n", this, toChars()); +@@ -2079,12 +2164,12 @@ int VarDeclaration::isDataseg() + printf("parent = '%s'\n", parent->toChars()); + #endif + if (storage_class & STCmanifest) +- return 0; ++ return false; + Dsymbol *parent = this->toParent(); + if (!parent && !(storage_class & STCstatic)) + { error("forward referenced"); + type = Type::terror; +- return 0; ++ return false; + } + return canTakeAddressOf() && + (storage_class & (STCstatic | STCextern | STCtls | STCgshared) || +@@ -2096,7 +2181,7 @@ int VarDeclaration::isDataseg() + * Does symbol go into thread local storage? + */ + +-int VarDeclaration::isThreadlocal() ++bool VarDeclaration::isThreadlocal() + { + //printf("VarDeclaration::isThreadlocal(%p, '%s')\n", this, toChars()); + #if 0 //|| TARGET_OSX +@@ -2109,7 +2194,7 @@ int VarDeclaration::isThreadlocal() + /* Data defaults to being thread-local. It is not thread-local + * if it is immutable, const or shared. + */ +- int i = isDataseg() && ++ bool i = isDataseg() && + !(storage_class & (STCimmutable | STCconst | STCshared | STCgshared)); + //printf("\treturn %d\n", i); + return i; +@@ -2120,29 +2205,29 @@ int VarDeclaration::isThreadlocal() + * Can variable be read and written by CTFE? + */ + +-int VarDeclaration::isCTFE() ++bool VarDeclaration::isCTFE() + { + return (storage_class & STCctfe) != 0; // || !isDataseg(); + } + +-int VarDeclaration::hasPointers() ++bool VarDeclaration::hasPointers() + { + //printf("VarDeclaration::hasPointers() %s, ty = %d\n", toChars(), type->ty); + return (!isDataseg() && type->hasPointers()); + } + + /****************************************** +- * Return TRUE if variable needs to call the destructor. ++ * Return true if variable needs to call the destructor. + */ + +-int VarDeclaration::needsAutoDtor() ++bool VarDeclaration::needsAutoDtor() + { + //printf("VarDeclaration::needsAutoDtor() %s\n", toChars()); + + if (noscope || !edtor) +- return FALSE; ++ return false; + +- return TRUE; ++ return true; + } + + +@@ -2163,19 +2248,14 @@ Expression *VarDeclaration::callScopeDto + } + + // Destructors for structs and arrays of structs +- bool array = false; +- Type *tv = type->toBasetype(); +- while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- array = true; +- tv = tv->nextOf()->toBasetype(); +- } ++ Type *tv = type->baseElemOf(); + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->dtor) + { +- if (array) ++ if (type->toBasetype()->ty == Tsarray) + { + // Typeinfo.destroy(cast(void*)&v); + Expression *ea = new SymOffExp(loc, this, 0, 0); +@@ -2236,15 +2316,24 @@ Expression *VarDeclaration::callScopeDto + + void ObjectNotFound(Identifier *id) + { +- Type::error(0, "%s not found. object.d may be incorrectly installed or corrupt.", id->toChars()); ++ Type::error(Loc(), "%s not found. object.d may be incorrectly installed or corrupt.", id->toChars()); + fatal(); + } + ++/******************************** SymbolDeclaration ********************************/ ++ ++SymbolDeclaration::SymbolDeclaration(Loc loc, StructDeclaration *dsym) ++ : Declaration(dsym->ident) ++{ ++ this->loc = loc; ++ this->dsym = dsym; ++ storage_class |= STCconst; ++} + + /********************************* ClassInfoDeclaration ****************************/ + + ClassInfoDeclaration::ClassInfoDeclaration(ClassDeclaration *cd) +- : VarDeclaration(0, ClassDeclaration::classinfo->type, cd->ident, NULL) ++ : VarDeclaration(Loc(), Type::typeinfoclass->type, cd->ident, NULL) + { + this->cd = cd; + storage_class = STCstatic | STCgshared; +@@ -2260,29 +2349,10 @@ void ClassInfoDeclaration::semantic(Scop + { + } + +-/********************************* ModuleInfoDeclaration ****************************/ +- +-ModuleInfoDeclaration::ModuleInfoDeclaration(Module *mod) +- : VarDeclaration(0, Module::moduleinfo->type, mod->ident, NULL) +-{ +- this->mod = mod; +- storage_class = STCstatic | STCgshared; +-} +- +-Dsymbol *ModuleInfoDeclaration::syntaxCopy(Dsymbol *s) +-{ +- assert(0); // should never be produced by syntax +- return NULL; +-} +- +-void ModuleInfoDeclaration::semantic(Scope *sc) +-{ +-} +- + /********************************* TypeInfoDeclaration ****************************/ + + TypeInfoDeclaration::TypeInfoDeclaration(Type *tinfo, int internal) +- : VarDeclaration(0, Type::typeinfo->type, tinfo->getTypeInfoIdent(internal), NULL) ++ : VarDeclaration(Loc(), Type::dtypeinfo->type, tinfo->getTypeInfoIdent(internal), NULL) + { + this->tinfo = tinfo; + storage_class = STCstatic | STCgshared; +@@ -2301,6 +2371,17 @@ void TypeInfoDeclaration::semantic(Scope + assert(linkage == LINKc); + } + ++char *TypeInfoDeclaration::toChars() ++{ ++ //printf("TypeInfoDeclaration::toChars() tinfo = %s\n", tinfo->toChars()); ++ OutBuffer buf; ++ buf.writestring("typeid("); ++ buf.writestring(tinfo->toChars()); ++ buf.writeByte(')'); ++ buf.writeByte(0); ++ return buf.extractData(); ++} ++ + /***************************** TypeInfoConstDeclaration **********************/ + + #if DMDV2 +--- a/src/gcc/d/dfrontend/declaration.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/declaration.h 2014-04-01 16:32:51.000000000 +0100 +@@ -19,19 +19,19 @@ + #include "lexer.h" + #include "mtype.h" + +-struct Expression; +-struct Statement; +-struct LabelDsymbol; +-struct Initializer; +-struct Module; ++class Expression; ++class Statement; ++class LabelDsymbol; ++class Initializer; ++class Module; + struct InlineScanState; +-struct ForeachStatement; +-struct FuncDeclaration; +-struct ExpInitializer; +-struct StructDeclaration; +-struct TupleType; ++class ForeachStatement; ++class FuncDeclaration; ++class ExpInitializer; ++class StructDeclaration; + struct InterState; + struct IRState; ++struct CompiledCtfeFunction; + + enum PROT; + enum LINK; +@@ -87,15 +87,11 @@ enum PURE; + #define STCtemp 0x10000000000LL // temporary variable introduced by inlining + // and used only in backend process, so it's rvalue + +-#define STCStorageClass (STCauto | STCscope | STCstatic | STCextern | STCconst | STCfinal | \ +- STCabstract | STCsynchronized | STCdeprecated | STCoverride | STClazy | STCalias | \ +- STCout | STCin | \ +- STCmanifest | STCimmutable | STCshared | STCnothrow | STCpure | STCref | STCtls | \ +- STCgshared | STCproperty | STCsafe | STCtrusted | STCsystem | STCdisable) +- +-#ifdef BUG6652 +-#define STCbug6652 0x800000000000LL // +-#endif ++const StorageClass STCStorageClass = (STCauto | STCscope | STCstatic | STCextern | STCconst | STCfinal | ++ STCabstract | STCsynchronized | STCdeprecated | STCoverride | STClazy | STCalias | ++ STCout | STCin | ++ STCmanifest | STCimmutable | STCshared | STCnothrow | STCpure | STCref | STCtls | ++ STCgshared | STCproperty | STCsafe | STCtrusted | STCsystem | STCdisable); + + struct Match + { +@@ -106,11 +102,10 @@ struct Match + FuncDeclaration *anyf; // pick a func, any func, to use for error recovery + }; + +-void overloadResolveX(Match *m, FuncDeclaration *f, +- Expression *ethis, Expressions *arguments); +-int overloadApply(FuncDeclaration *fstart, +- int (*fp)(void *, FuncDeclaration *), +- void *param); ++void functionResolve(Match *m, Dsymbol *fd, Loc loc, Scope *sc, Objects *tiargs, Type *tthis, Expressions *fargs); ++int overloadApply(Dsymbol *fstart, void *param, int (*fp)(void *, Dsymbol *)); ++ ++void ObjectNotFound(Identifier *id); + + enum Semantic + { +@@ -122,16 +117,17 @@ enum Semantic + + /**************************************************************/ + +-struct Declaration : Dsymbol ++class Declaration : public Dsymbol + { ++public: + Type *type; + Type *originalType; // before semantic analysis + StorageClass storage_class; +- enum PROT protection; +- enum LINK linkage; ++ PROT protection; ++ LINK linkage; + int inuse; // used to detect cycles +- +- enum Semantic sem; ++ const char *mangleOverride; // overridden symbol with pragma(mangle, "...") ++ Semantic sem; + + Declaration(Identifier *id); + void semantic(Scope *sc); +@@ -143,44 +139,46 @@ struct Declaration : Dsymbol + + void emitComment(Scope *sc); + void toJson(JsonOut *json); +- void jsonProperties(JsonOut *json); ++ virtual void jsonProperties(JsonOut *json); + void toDocBuffer(OutBuffer *buf, Scope *sc); + +- char *mangle(bool isv = false); +- int isStatic() { return storage_class & STCstatic; } +- virtual int isDelete(); +- virtual int isDataseg(); +- virtual int isThreadlocal(); +- virtual int isCodeseg(); +- int isCtorinit() { return storage_class & STCctorinit; } +- int isFinal() { return storage_class & STCfinal; } +- int isAbstract() { return storage_class & STCabstract; } +- int isConst() { return storage_class & STCconst; } +- int isImmutable() { return storage_class & STCimmutable; } +- int isWild() { return storage_class & STCwild; } +- int isAuto() { return storage_class & STCauto; } +- int isScope() { return storage_class & STCscope; } +- int isSynchronized() { return storage_class & STCsynchronized; } +- int isParameter() { return storage_class & STCparameter; } +- int isDeprecated() { return storage_class & STCdeprecated; } +- int isOverride() { return storage_class & STCoverride; } +- StorageClass isResult() { return storage_class & STCresult; } +- +- int isIn() { return storage_class & STCin; } +- int isOut() { return storage_class & STCout; } +- int isRef() { return storage_class & STCref; } ++ const char *mangle(bool isv = false); ++ bool isStatic() { return (storage_class & STCstatic) != 0; } ++ virtual bool isDelete(); ++ virtual bool isDataseg(); ++ virtual bool isThreadlocal(); ++ virtual bool isCodeseg(); ++ bool isCtorinit() { return (storage_class & STCctorinit) != 0; } ++ bool isFinal() { return (storage_class & STCfinal) != 0; } ++ bool isAbstract() { return (storage_class & STCabstract) != 0; } ++ bool isConst() { return (storage_class & STCconst) != 0; } ++ bool isImmutable() { return (storage_class & STCimmutable) != 0; } ++ bool isWild() { return (storage_class & STCwild) != 0; } ++ bool isAuto() { return (storage_class & STCauto) != 0; } ++ bool isScope() { return (storage_class & STCscope) != 0; } ++ bool isSynchronized() { return (storage_class & STCsynchronized) != 0; } ++ bool isParameter() { return (storage_class & STCparameter) != 0; } ++ bool isDeprecated() { return (storage_class & STCdeprecated) != 0; } ++ bool isOverride() { return (storage_class & STCoverride) != 0; } ++ bool isResult() { return (storage_class & STCresult) != 0; } ++ bool isField() { return (storage_class & STCfield) != 0; } ++ ++ bool isIn() { return (storage_class & STCin) != 0; } ++ bool isOut() { return (storage_class & STCout) != 0; } ++ bool isRef() { return (storage_class & STCref) != 0; } + +- enum PROT prot(); ++ PROT prot(); + + Declaration *isDeclaration() { return this; } + }; + + /**************************************************************/ + +-struct TupleDeclaration : Declaration ++class TupleDeclaration : public Declaration + { ++public: + Objects *objects; +- int isexp; // 1: expression tuple ++ bool isexp; // true: expression tuple + + TypeTuple *tupletype; // !=NULL if this is a type tuple + +@@ -188,15 +186,16 @@ struct TupleDeclaration : Declaration + Dsymbol *syntaxCopy(Dsymbol *); + const char *kind(); + Type *getType(); +- int needThis(); ++ bool needThis(); + + TupleDeclaration *isTupleDeclaration() { return this; } + }; + + /**************************************************************/ + +-struct TypedefDeclaration : Declaration ++class TypedefDeclaration : public Declaration + { ++public: + Type *basetype; + Initializer *init; + +@@ -204,7 +203,7 @@ struct TypedefDeclaration : Declaration + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + void semantic2(Scope *sc); +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); + const char *kind(); + Type *getType(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -226,18 +225,19 @@ struct TypedefDeclaration : Declaration + + /**************************************************************/ + +-struct AliasDeclaration : Declaration ++class AliasDeclaration : public Declaration + { ++public: + Dsymbol *aliassym; + Dsymbol *overnext; // next in overload list + Dsymbol *import; // !=NULL if unresolved internal alias for selective import +- int inSemantic; ++ bool inSemantic; + + AliasDeclaration(Loc loc, Identifier *ident, Type *type); + AliasDeclaration(Loc loc, Identifier *ident, Dsymbol *s); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); +- int overloadInsert(Dsymbol *s); ++ bool overloadInsert(Dsymbol *s); + const char *kind(); + Type *getType(); + Dsymbol *toAlias(); +@@ -252,8 +252,9 @@ struct AliasDeclaration : Declaration + + /**************************************************************/ + +-struct VarDeclaration : Declaration ++class VarDeclaration : public Declaration + { ++public: + Initializer *init; + unsigned offset; + bool noscope; // no auto semantics +@@ -298,27 +299,27 @@ struct VarDeclaration : Declaration + Type *htype; + Initializer *hinit; + AggregateDeclaration *isThis(); +- int needThis(); +- int isImportedSymbol(); +- int isDataseg(); +- int isThreadlocal(); +- int isCTFE(); +- int hasPointers(); ++ bool needThis(); ++ bool isExport(); ++ bool isImportedSymbol(); ++ bool isDataseg(); ++ bool isThreadlocal(); ++ bool isCTFE(); ++ bool hasPointers(); + #if DMDV2 +- int canTakeAddressOf(); +- int needsAutoDtor(); ++ bool canTakeAddressOf(); ++ bool needsAutoDtor(); + #endif + Expression *callScopeDtor(Scope *sc); + ExpInitializer *getExpInitializer(); +- Expression *getConstInitializer(); ++ Expression *getConstInitializer(bool needFullType = true); + void checkCtorConstInit(); + void checkNestedReference(Scope *sc, Loc loc); + Dsymbol *toAlias(); +- + Symbol *toSymbol(); + void toObjFile(int multiobj); // compile to .obj file + int cvMember(unsigned char *p); +- ++ const char *mangle(bool isv = false); + // Eliminate need for dynamic_cast + VarDeclaration *isVarDeclaration() { return (VarDeclaration *)this; } + }; +@@ -327,12 +328,12 @@ struct VarDeclaration : Declaration + + // This is a shell around a back end symbol + +-struct SymbolDeclaration : Declaration ++class SymbolDeclaration : public Declaration + { +- Symbol *sym; ++public: + StructDeclaration *dsym; + +- SymbolDeclaration(Loc loc, Symbol *s, StructDeclaration *dsym); ++ SymbolDeclaration(Loc loc, StructDeclaration *dsym); + + Symbol *toSymbol(); + +@@ -340,8 +341,9 @@ struct SymbolDeclaration : Declaration + SymbolDeclaration *isSymbolDeclaration() { return (SymbolDeclaration *)this; } + }; + +-struct ClassInfoDeclaration : VarDeclaration ++class ClassInfoDeclaration : public VarDeclaration + { ++public: + ClassDeclaration *cd; + + ClassInfoDeclaration(ClassDeclaration *cd); +@@ -354,27 +356,15 @@ struct ClassInfoDeclaration : VarDeclara + Symbol *toSymbol(); + }; + +-struct ModuleInfoDeclaration : VarDeclaration +-{ +- Module *mod; +- +- ModuleInfoDeclaration(Module *mod); +- Dsymbol *syntaxCopy(Dsymbol *); +- void semantic(Scope *sc); +- +- void emitComment(Scope *sc); +- void toJson(JsonOut *json); +- +- Symbol *toSymbol(); +-}; +- +-struct TypeInfoDeclaration : VarDeclaration ++class TypeInfoDeclaration : public VarDeclaration + { ++public: + Type *tinfo; + + TypeInfoDeclaration(Type *tinfo, int internal); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); ++ char *toChars(); + + void emitComment(Scope *sc); + void toJson(JsonOut *json); +@@ -382,124 +372,143 @@ struct TypeInfoDeclaration : VarDeclarat + Symbol *toSymbol(); + void toObjFile(int multiobj); // compile to .obj file + virtual void toDt(dt_t **pdt); ++ ++ TypeInfoDeclaration *isTypeInfoDeclaration() { return this; } + }; + +-struct TypeInfoStructDeclaration : TypeInfoDeclaration ++class TypeInfoStructDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoStructDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoClassDeclaration : TypeInfoDeclaration ++class TypeInfoClassDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoClassDeclaration(Type *tinfo); + Symbol *toSymbol(); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoInterfaceDeclaration : TypeInfoDeclaration ++class TypeInfoInterfaceDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoInterfaceDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoTypedefDeclaration : TypeInfoDeclaration ++class TypeInfoTypedefDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoTypedefDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoPointerDeclaration : TypeInfoDeclaration ++class TypeInfoPointerDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoPointerDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoArrayDeclaration : TypeInfoDeclaration ++class TypeInfoArrayDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoArrayDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoStaticArrayDeclaration : TypeInfoDeclaration ++class TypeInfoStaticArrayDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoStaticArrayDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoAssociativeArrayDeclaration : TypeInfoDeclaration ++class TypeInfoAssociativeArrayDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoAssociativeArrayDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoEnumDeclaration : TypeInfoDeclaration ++class TypeInfoEnumDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoEnumDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoFunctionDeclaration : TypeInfoDeclaration ++class TypeInfoFunctionDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoFunctionDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoDelegateDeclaration : TypeInfoDeclaration ++class TypeInfoDelegateDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoDelegateDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoTupleDeclaration : TypeInfoDeclaration ++class TypeInfoTupleDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoTupleDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + + #if DMDV2 +-struct TypeInfoConstDeclaration : TypeInfoDeclaration ++class TypeInfoConstDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoConstDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoInvariantDeclaration : TypeInfoDeclaration ++class TypeInfoInvariantDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoInvariantDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoSharedDeclaration : TypeInfoDeclaration ++class TypeInfoSharedDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoSharedDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoWildDeclaration : TypeInfoDeclaration ++class TypeInfoWildDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoWildDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); + }; + +-struct TypeInfoVectorDeclaration : TypeInfoDeclaration ++class TypeInfoVectorDeclaration : public TypeInfoDeclaration + { ++public: + TypeInfoVectorDeclaration(Type *tinfo); + + void toDt(dt_t **pdt); +@@ -508,8 +517,9 @@ struct TypeInfoVectorDeclaration : TypeI + + /**************************************************************/ + +-struct ThisDeclaration : VarDeclaration ++class ThisDeclaration : public VarDeclaration + { ++public: + ThisDeclaration(Loc loc, Type *t); + Dsymbol *syntaxCopy(Dsymbol *); + ThisDeclaration *isThisDeclaration() { return this; } +@@ -548,14 +558,15 @@ enum BUILTIN + #endif + }; + +-Expression *eval_builtin(Loc loc, enum BUILTIN builtin, Expressions *arguments); ++Expression *eval_builtin(Loc loc, BUILTIN builtin, Expressions *arguments); + + #else + enum BUILTIN { }; + #endif + +-struct FuncDeclaration : Declaration ++class FuncDeclaration : public Declaration + { ++public: + Types *fthrows; // Array of Type's of exceptions (not used) + Statement *frequire; + Statement *fensure; +@@ -581,23 +592,26 @@ struct FuncDeclaration : Declaration + VarDeclaration *v_argsave; // save area for args passed in registers for variadic functions + VarDeclarations *parameters; // Array of VarDeclaration's for parameters + DsymbolTable *labtab; // statement label symbol table +- Declaration *overnext; // next in overload list ++ Dsymbol *overnext; // next in overload list ++ FuncDeclaration *overnext0; // next in overload list (only used during IFTI) + Loc endloc; // location of closing curly bracket + int vtblIndex; // for member functions, index into vtbl[] +- bool naked; // !=0 if naked ++ bool naked; // true if naked + ILS inlineStatusStmt; + ILS inlineStatusExp; ++ ++ CompiledCtfeFunction *ctfeCode; // Compiled code for interpreter + int inlineNest; // !=0 if nested inline +- bool isArrayOp; // !=0 if array operation +- enum PASS semanticRun; ++ bool isArrayOp; // true if array operation ++ FuncDeclaration *dArrayOp; // D version of array op for ctfe + int semantic3Errors; // !=0 if errors in semantic3 + // this function's frame ptr + ForeachStatement *fes; // if foreach body, this is the foreach +- bool introducing; // !=0 if 'introducing' function ++ bool introducing; // true if 'introducing' function + Type *tintro; // if !=NULL, then this is the type + // of the 'introducing' function + // this one is overriding +- int inferRetType; // !=0 if return type is to be inferred ++ bool inferRetType; // true if return type is to be inferred + StorageClass storage_class2; // storage class for template onemember's + + // Things that should really go into Scope +@@ -607,14 +621,14 @@ struct FuncDeclaration : Declaration + // 8 if there's inline asm + + // Support for NRVO (named return value optimization) +- bool nrvo_can; // !=0 means we can do it ++ bool nrvo_can; // true means we can do it + VarDeclaration *nrvo_var; // variable to replace with shidden + Symbol *shidden; // hidden pointer passed to function + + ReturnStatements *returns; + + #if DMDV2 +- enum BUILTIN builtin; // set if this is a known, builtin ++ BUILTIN builtin; // set if this is a known, builtin + // function we can evaluate at compile + // time + +@@ -645,16 +659,16 @@ struct FuncDeclaration : Declaration + bool functionSemantic3(); + // called from semantic3 + VarDeclaration *declareThis(Scope *sc, AggregateDeclaration *ad); +- int equals(Object *o); ++ bool equals(RootObject *o); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void bodyToCBuffer(OutBuffer *buf, HdrGenState *hgs); + void toJson(JsonOut *json); + int overrides(FuncDeclaration *fd); + int findVtblIndex(Dsymbols *vtbl, int dim); +- int overloadInsert(Dsymbol *s); ++ bool overloadInsert(Dsymbol *s); + FuncDeclaration *overloadExactMatch(Type *t); +- FuncDeclaration *overloadResolve(Loc loc, Expression *ethis, Expressions *arguments, int flags = 0); ++ TemplateDeclaration *findTemplateDeclRoot(); + MATCH leastAsSpecialized(FuncDeclaration *g); + LabelDsymbol *searchLabel(Identifier *ident); + AggregateDeclaration *isThis(); +@@ -662,33 +676,37 @@ struct FuncDeclaration : Declaration + int getLevel(Loc loc, Scope *sc, FuncDeclaration *fd); // lexical nesting level difference + void appendExp(Expression *e); + void appendState(Statement *s); +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); ++ const char *mangleExact(bool isv = false); + const char *toPrettyChars(); +- int isMain(); +- int isWinMain(); +- int isDllMain(); +- enum BUILTIN isBuiltin(); +- int isExport(); +- int isImportedSymbol(); +- int isAbstract(); +- int isCodeseg(); +- int isOverloadable(); +- int hasOverloads(); +- enum PURE isPure(); +- enum PURE isPureBypassingInference(); ++ const char *toFullSignature(); // for diagnostics, e.g. 'int foo(int x, int y) pure' ++ bool isMain(); ++ bool isWinMain(); ++ bool isDllMain(); ++ BUILTIN isBuiltin(); ++ bool isExport(); ++ bool isImportedSymbol(); ++ bool isCodeseg(); ++ bool isOverloadable(); ++ bool hasOverloads(); ++ PURE isPure(); ++ PURE isPureBypassingInference(); + bool setImpure(); +- int isSafe(); ++ bool isSafe(); + bool isSafeBypassingInference(); +- int isTrusted(); ++ bool isTrusted(); + bool setUnsafe(); +- virtual int isNested(); +- int needThis(); +- int isVirtualMethod(); +- virtual int isVirtual(); +- virtual int isFinal(); +- virtual int addPreInvariant(); +- virtual int addPostInvariant(); ++ bool isolateReturn(); ++ bool parametersIntersect(Type *t); ++ virtual bool isNested(); ++ bool needThis(); ++ bool isVirtualMethod(); ++ virtual bool isVirtual(); ++ virtual bool isFinalFunc(); ++ virtual bool addPreInvariant(); ++ virtual bool addPostInvariant(); + Expression *interpret(InterState *istate, Expressions *arguments, Expression *thisexp = NULL); ++ void ctfeCompile(); + void inlineScan(); + int canInline(int hasthis, int hdrscan, int statementsToo); + Expression *expandInline(InlineScanState *iss, Expression *ethis, Expressions *arguments, Statement **ps); +@@ -696,15 +714,15 @@ struct FuncDeclaration : Declaration + void toDocBuffer(OutBuffer *buf, Scope *sc); + FuncDeclaration *isUnique(); + void checkNestedReference(Scope *sc, Loc loc); +- int needsClosure(); +- int hasNestedFrameRefs(); ++ bool needsClosure(); ++ bool hasNestedFrameRefs(); + void buildResultVar(); + Statement *mergeFrequire(Statement *); +- Statement *mergeFensure(Statement *); ++ Statement *mergeFensure(Statement *, Identifier *oid); + Parameters *getParameters(int *pvarargs); + +- static FuncDeclaration *genCfunc(Type *treturn, const char *name); +- static FuncDeclaration *genCfunc(Type *treturn, Identifier *id); ++ static FuncDeclaration *genCfunc(Parameters *args, Type *treturn, const char *name); ++ static FuncDeclaration *genCfunc(Parameters *args, Type *treturn, Identifier *id); + + Symbol *toSymbol(); + Symbol *toThunkSymbol(int offset); // thunk version +@@ -718,105 +736,110 @@ struct FuncDeclaration : Declaration + }; + + #if DMDV2 +-FuncDeclaration *resolveFuncCall(Scope *sc, Loc loc, Dsymbol *s, ++FuncDeclaration *resolveFuncCall(Loc loc, Scope *sc, Dsymbol *s, + Objects *tiargs, +- Expression *ethis, ++ Type *tthis, + Expressions *arguments, +- int flags); ++ int flags = 0); + #endif + +-struct FuncAliasDeclaration : FuncDeclaration ++class FuncAliasDeclaration : public FuncDeclaration + { ++public: + FuncDeclaration *funcalias; +- int hasOverloads; ++ bool hasOverloads; + +- FuncAliasDeclaration(FuncDeclaration *funcalias, int hasOverloads = 1); ++ FuncAliasDeclaration(FuncDeclaration *funcalias, bool hasOverloads = true); + + FuncAliasDeclaration *isFuncAliasDeclaration() { return this; } + const char *kind(); + Symbol *toSymbol(); +- char *mangle(bool isv = false) { return toAliasFunc()->mangle(isv); } ++ const char *mangle(bool isv = false); + + FuncDeclaration *toAliasFunc(); + }; + +-struct FuncLiteralDeclaration : FuncDeclaration ++class FuncLiteralDeclaration : public FuncDeclaration + { +- enum TOK tok; // TOKfunction or TOKdelegate ++public: ++ TOK tok; // TOKfunction or TOKdelegate + Type *treq; // target of return type inference + +- FuncLiteralDeclaration(Loc loc, Loc endloc, Type *type, enum TOK tok, +- ForeachStatement *fes); ++ FuncLiteralDeclaration(Loc loc, Loc endloc, Type *type, TOK tok, ++ ForeachStatement *fes, Identifier *id = NULL); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Dsymbol *syntaxCopy(Dsymbol *); +- int isNested(); +- int isVirtual(); ++ bool isNested(); ++ bool isVirtual(); + + FuncLiteralDeclaration *isFuncLiteralDeclaration() { return this; } + const char *kind(); + }; + +-struct CtorDeclaration : FuncDeclaration ++class CtorDeclaration : public FuncDeclaration + { ++public: + CtorDeclaration(Loc loc, Loc endloc, StorageClass stc, Type *type); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + const char *kind(); + char *toChars(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); +- bool isImplicit; // implicitly generated ctor ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + + CtorDeclaration *isCtorDeclaration() { return this; } + }; + + #if DMDV2 +-struct PostBlitDeclaration : FuncDeclaration ++class PostBlitDeclaration : public FuncDeclaration + { ++public: + PostBlitDeclaration(Loc loc, Loc endloc, StorageClass stc, Identifier *id); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void toJson(JsonOut *json); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); +- int overloadInsert(Dsymbol *s); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); ++ bool overloadInsert(Dsymbol *s); + void emitComment(Scope *sc); + + PostBlitDeclaration *isPostBlitDeclaration() { return this; } + }; + #endif + +-struct DtorDeclaration : FuncDeclaration ++class DtorDeclaration : public FuncDeclaration + { ++public: + DtorDeclaration(Loc loc, Loc endloc); +- DtorDeclaration(Loc loc, Loc endloc, Identifier *id); ++ DtorDeclaration(Loc loc, Loc endloc, StorageClass stc, Identifier *id); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + const char *kind(); + char *toChars(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); +- int overloadInsert(Dsymbol *s); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); ++ bool overloadInsert(Dsymbol *s); + void emitComment(Scope *sc); + + DtorDeclaration *isDtorDeclaration() { return this; } + }; + +-struct StaticCtorDeclaration : FuncDeclaration ++class StaticCtorDeclaration : public FuncDeclaration + { ++public: + StaticCtorDeclaration(Loc loc, Loc endloc); + StaticCtorDeclaration(Loc loc, Loc endloc, const char *name); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + AggregateDeclaration *isThis(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + bool hasStaticCtorOrDtor(); + void emitComment(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -825,8 +848,9 @@ struct StaticCtorDeclaration : FuncDecla + }; + + #if DMDV2 +-struct SharedStaticCtorDeclaration : StaticCtorDeclaration ++class SharedStaticCtorDeclaration : public StaticCtorDeclaration + { ++public: + SharedStaticCtorDeclaration(Loc loc, Loc endloc); + Dsymbol *syntaxCopy(Dsymbol *); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -835,18 +859,20 @@ struct SharedStaticCtorDeclaration : Sta + }; + #endif + +-struct StaticDtorDeclaration : FuncDeclaration +-{ VarDeclaration *vgate; // 'gate' variable ++class StaticDtorDeclaration : public FuncDeclaration ++{ ++public: ++ VarDeclaration *vgate; // 'gate' variable + +- StaticDtorDeclaration(Loc loc, Loc endloc); +- StaticDtorDeclaration(Loc loc, Loc endloc, const char *name); ++ StaticDtorDeclaration(Loc loc, Loc endloc, StorageClass stc); ++ StaticDtorDeclaration(Loc loc, Loc endloc, const char *name, StorageClass stc); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + AggregateDeclaration *isThis(); +- int isVirtual(); ++ bool isVirtual(); + bool hasStaticCtorOrDtor(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + void emitComment(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +@@ -854,9 +880,10 @@ struct StaticDtorDeclaration : FuncDecla + }; + + #if DMDV2 +-struct SharedStaticDtorDeclaration : StaticDtorDeclaration ++class SharedStaticDtorDeclaration : public StaticDtorDeclaration + { +- SharedStaticDtorDeclaration(Loc loc, Loc endloc); ++public: ++ SharedStaticDtorDeclaration(Loc loc, Loc endloc, StorageClass stc); + Dsymbol *syntaxCopy(Dsymbol *); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +@@ -864,36 +891,42 @@ struct SharedStaticDtorDeclaration : Sta + }; + #endif + +-struct InvariantDeclaration : FuncDeclaration ++class InvariantDeclaration : public FuncDeclaration + { +- InvariantDeclaration(Loc loc, Loc endloc); ++public: ++ InvariantDeclaration(Loc loc, Loc endloc, StorageClass stc, Identifier *id = NULL); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + void emitComment(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + InvariantDeclaration *isInvariantDeclaration() { return this; } + }; + +-struct UnitTestDeclaration : FuncDeclaration ++class UnitTestDeclaration : public FuncDeclaration + { +- UnitTestDeclaration(Loc loc, Loc endloc); ++public: ++ char *codedoc; /** For documented unittest. */ ++ UnitTestDeclaration(Loc loc, Loc endloc, char *codedoc); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + AggregateDeclaration *isThis(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); ++ void emitComment(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + UnitTestDeclaration *isUnitTestDeclaration() { return this; } + }; + +-struct NewDeclaration : FuncDeclaration +-{ Parameters *arguments; ++class NewDeclaration : public FuncDeclaration ++{ ++public: ++ Parameters *arguments; + int varargs; + + NewDeclaration(Loc loc, Loc endloc, Parameters *arguments, int varargs); +@@ -901,26 +934,28 @@ struct NewDeclaration : FuncDeclaration + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + const char *kind(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + + NewDeclaration *isNewDeclaration() { return this; } + }; + + +-struct DeleteDeclaration : FuncDeclaration +-{ Parameters *arguments; ++class DeleteDeclaration : public FuncDeclaration ++{ ++public: ++ Parameters *arguments; + + DeleteDeclaration(Loc loc, Loc endloc, Parameters *arguments); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + const char *kind(); +- int isDelete(); +- int isVirtual(); +- int addPreInvariant(); +- int addPostInvariant(); ++ bool isDelete(); ++ bool isVirtual(); ++ bool addPreInvariant(); ++ bool addPostInvariant(); + DeleteDeclaration *isDeleteDeclaration() { return this; } + }; + +--- a/src/gcc/d/dfrontend/delegatize.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/delegatize.c 2014-04-01 16:32:51.000000000 +0100 +@@ -116,7 +116,7 @@ int lambdaCheckForNestedRef(Expression * + { SymOffExp *se = (SymOffExp *)e; + VarDeclaration *v = se->var->isVarDeclaration(); + if (v) +- v->checkNestedReference(sc, 0); ++ v->checkNestedReference(sc, Loc()); + break; + } + +@@ -124,7 +124,7 @@ int lambdaCheckForNestedRef(Expression * + { VarExp *ve = (VarExp *)e; + VarDeclaration *v = ve->var->isVarDeclaration(); + if (v) +- v->checkNestedReference(sc, 0); ++ v->checkNestedReference(sc, Loc()); + break; + } + +@@ -133,7 +133,7 @@ int lambdaCheckForNestedRef(Expression * + { ThisExp *te = (ThisExp *)e; + VarDeclaration *v = te->var->isVarDeclaration(); + if (v) +- v->checkNestedReference(sc, 0); ++ v->checkNestedReference(sc, Loc()); + break; + } + +@@ -142,7 +142,7 @@ int lambdaCheckForNestedRef(Expression * + VarDeclaration *v = de->declaration->isVarDeclaration(); + if (v) + { +- v->checkNestedReference(sc, 0); ++ v->checkNestedReference(sc, Loc()); + + /* Some expressions cause the frontend to create a temporary. + * For example, structs with cpctors replace the original +--- a/src/gcc/d/dfrontend/doc.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/doc.c 2014-04-01 16:32:51.000000000 +0100 +@@ -44,12 +44,13 @@ struct Escape + const char *escapeChar(unsigned c); + }; + +-struct Section ++class Section + { +- unsigned char *name; ++public: ++ utf8_t *name; + size_t namelen; + +- unsigned char *body; ++ utf8_t *body; + size_t bodylen; + + int nooutput; +@@ -57,17 +58,19 @@ struct Section + virtual void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf); + }; + +-struct ParamSection : Section ++class ParamSection : public Section + { ++public: + void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf); + }; + +-struct MacroSection : Section ++class MacroSection : public Section + { ++public: + void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf); + }; + +-typedef ArrayBase
Sections; ++typedef Array
Sections; + + struct DocComment + { +@@ -83,32 +86,35 @@ struct DocComment + summary(NULL), copyright(NULL), macros(NULL), pmacrotable(NULL), pescapetable(NULL) + { } + +- static DocComment *parse(Scope *sc, Dsymbol *s, unsigned char *comment); +- static void parseMacros(Escape **pescapetable, Macro **pmacrotable, unsigned char *m, size_t mlen); +- static void parseEscapes(Escape **pescapetable, unsigned char *textstart, size_t textlen); ++ static DocComment *parse(Scope *sc, Dsymbol *s, utf8_t *comment); ++ static void parseMacros(Escape **pescapetable, Macro **pmacrotable, utf8_t *m, size_t mlen); ++ static void parseEscapes(Escape **pescapetable, utf8_t *textstart, size_t textlen); + +- void parseSections(unsigned char *comment); ++ void parseSections(utf8_t *comment); + void writeSections(Scope *sc, Dsymbol *s, OutBuffer *buf); + }; + + + int cmp(const char *stringz, void *s, size_t slen); + int icmp(const char *stringz, void *s, size_t slen); +-int isDitto(unsigned char *comment); +-unsigned char *skipwhitespace(unsigned char *p); ++int isDitto(utf8_t *comment); ++utf8_t *skipwhitespace(utf8_t *p); + size_t skiptoident(OutBuffer *buf, size_t i); + size_t skippastident(OutBuffer *buf, size_t i); + size_t skippastURL(OutBuffer *buf, size_t i); + void highlightText(Scope *sc, Dsymbol *s, OutBuffer *buf, size_t offset); + void highlightCode(Scope *sc, Dsymbol *s, OutBuffer *buf, size_t offset, bool anchor = true); + void highlightCode2(Scope *sc, Dsymbol *s, OutBuffer *buf, size_t offset); +-Parameter *isFunctionParameter(Dsymbol *s, unsigned char *p, size_t len); ++TypeFunction *isTypeFunction(Dsymbol *s); ++Parameter *isFunctionParameter(Dsymbol *s, utf8_t *p, size_t len); ++TemplateParameter *isTemplateParameter(Dsymbol *s, utf8_t *p, size_t len); ++ ++int isIdStart(utf8_t *p); ++int isIdTail(utf8_t *p); ++int isIndentWS(utf8_t *p); ++int utfStride(utf8_t *p); + +-int isIdStart(unsigned char *p); +-int isIdTail(unsigned char *p); +-int utfStride(unsigned char *p); +- +-static unsigned char ddoc_default[] = "\ ++static const char ddoc_default[] = "\ + DDOC = \n\ + \n\ + $(TITLE)\n\ +@@ -140,6 +146,7 @@ LINK2 = $+\n\ + LPAREN= (\n\ + RPAREN= )\n\ + DOLLAR= $\n\ ++DEPRECATED= $0\n\ + \n\ + RED = $0\n\ + BLUE = $0\n\ +@@ -183,6 +190,7 @@ DDOC_CLASS_MEMBERS = $(DDOC_MEMBERS $0) + DDOC_STRUCT_MEMBERS = $(DDOC_MEMBERS $0)\n\ + DDOC_ENUM_MEMBERS = $(DDOC_MEMBERS $0)\n\ + DDOC_TEMPLATE_MEMBERS = $(DDOC_MEMBERS $0)\n\ ++DDOC_ENUM_BASETYPE = $0\n\ + DDOC_PARAMS = $(B Params:)$(BR)\n$(TABLE $0)$(BR)\n\ + DDOC_PARAM_ROW = $(TR $0)\n\ + DDOC_PARAM_ID = $(TD $0)\n\ +@@ -199,11 +207,11 @@ ESCAPES = /toChars(); +- Macro::define(¯otable, (unsigned char *)"SRCFILENAME", 11, (unsigned char *)srcfilename, strlen(srcfilename)); ++ Macro::define(¯otable, (utf8_t *)"SRCFILENAME", 11, (utf8_t *)srcfilename, strlen(srcfilename)); + + char *docfilename = docfile->toChars(); +- Macro::define(¯otable, (unsigned char *)"DOCFILENAME", 11, (unsigned char *)docfilename, strlen(docfilename)); ++ Macro::define(¯otable, (utf8_t *)"DOCFILENAME", 11, (utf8_t *)docfilename, strlen(docfilename)); + + if (dc->copyright) + { + dc->copyright->nooutput = 1; +- Macro::define(¯otable, (unsigned char *)"COPYRIGHT", 9, dc->copyright->body, dc->copyright->bodylen); ++ Macro::define(¯otable, (utf8_t *)"COPYRIGHT", 9, dc->copyright->body, dc->copyright->bodylen); + } + + buf.printf("$(DDOC_COMMENT Generated by Ddoc from %s)\n", srcfile->toChars()); +@@ -297,7 +305,7 @@ void Module::gendocfile() + } + + //printf("BODY= '%.*s'\n", buf.offset, buf.data); +- Macro::define(¯otable, (unsigned char *)"BODY", 4, buf.data, buf.offset); ++ Macro::define(¯otable, (utf8_t *)"BODY", 4, buf.data, buf.offset); + + OutBuffer buf2; + buf2.writestring("$(DDOC)\n"); +@@ -311,10 +319,10 @@ void Module::gendocfile() + { + buf.setsize(0); + buf.reserve(buf2.offset); +- unsigned char *p = buf2.data; ++ utf8_t *p = buf2.data; + for (size_t j = 0; j < buf2.offset; j++) + { +- unsigned char c = p[j]; ++ utf8_t c = p[j]; + if (c == 0xFF && j + 1 < buf2.offset) + { + j++; +@@ -339,13 +347,13 @@ void Module::gendocfile() + assert(docfile); + docfile->setbuffer(buf.data, buf.offset); + docfile->ref = 1; +- FileName::ensurePathToNameExists(docfile->toChars()); +- docfile->writev(); ++ ensurePathToNameExists(Loc(), docfile->toChars()); ++ writeFile(loc, docfile); + #else + /* Remove all the escape sequences from buf2 + */ + { size_t i = 0; +- unsigned char *p = buf2.data; ++ utf8_t *p = buf2.data; + for (size_t j = 0; j < buf2.offset; j++) + { + if (p[j] == 0xFF && j + 1 < buf2.offset) +@@ -362,8 +370,8 @@ void Module::gendocfile() + // Transfer image to file + docfile->setbuffer(buf2.data, buf2.offset); + docfile->ref = 1; +- FileName::ensurePathToNameExists(docfile->toChars()); +- docfile->writev(); ++ ensurePathToNameExists(Loc(), docfile->toChars()); ++ writeFile(loc, docfile); + #endif + } + +@@ -378,7 +386,7 @@ void escapeDdocString(OutBuffer *buf, si + { + for (size_t u = start; u < buf->offset; u++) + { +- unsigned char c = buf->data[u]; ++ utf8_t c = buf->data[u]; + switch(c) + { + case '$': +@@ -408,13 +416,20 @@ void escapeDdocString(OutBuffer *buf, si + + * Fix by replacing unmatched ( with $(LPAREN) and unmatched ) with $(RPAREN). + */ +-void escapeStrayParenthesis(OutBuffer *buf, size_t start, Loc loc) ++void escapeStrayParenthesis(OutBuffer *buf, size_t start, Dsymbol *s) + { + unsigned par_open = 0; ++ Loc loc = s->loc; ++ ++ if (Module *m = s->isModule()) ++ { ++ if (m->md) ++ loc = m->md->loc; ++ } + + for (size_t u = start; u < buf->offset; u++) + { +- unsigned char c = buf->data[u]; ++ utf8_t c = buf->data[u]; + switch(c) + { + case '(': +@@ -449,7 +464,7 @@ void escapeStrayParenthesis(OutBuffer *b + { par_open = 0; + for (size_t u = buf->offset; u > start;) + { u--; +- unsigned char c = buf->data[u]; ++ utf8_t c = buf->data[u]; + switch(c) + { + case ')': +@@ -473,8 +488,93 @@ void escapeStrayParenthesis(OutBuffer *b + } + } + ++static bool emitAnchorName(OutBuffer *buf, Dsymbol *s) ++{ ++ if (!s || s->isPackage() || s->isModule()) ++ return false; ++ ++ TemplateDeclaration *td; ++ bool dot; ++ ++ // Add parent names first ++ dot = emitAnchorName(buf, s->parent); ++ // Eponymous template members can share the parent anchor name ++ if (s->parent && (td = s->parent->isTemplateDeclaration()) != NULL && ++ td->onemember == s) ++ return dot; ++ if (dot) ++ buf->writeByte('.'); ++ // Use "this" not "__ctor" ++ if (s->isCtorDeclaration() || ((td = s->isTemplateDeclaration()) != NULL && ++ td->onemember && td->onemember->isCtorDeclaration())) ++ buf->writestring("this"); ++ else ++ { ++ /* We just want the identifier, not overloads like TemplateDeclaration::toChars. ++ * We don't want the template parameter list and constraints. */ ++ buf->writestring(s->Dsymbol::toChars()); ++ } ++ ++ return true; ++} ++ ++static void emitAnchor(OutBuffer *buf, Dsymbol *s) ++{ ++ buf->writestring("$(DDOC_ANCHOR "); ++ emitAnchorName(buf, s); ++ buf->writeByte(')'); ++} ++ + /******************************* emitComment **********************************/ + ++/** Get leading indentation from 'src' which represents lines of code. */ ++static size_t getCodeIndent(const char *src) ++{ ++ while (src && *src == '\n') ++ ++src; // skip until we find the first non-empty line ++ ++ size_t codeIndent = 0; ++ while (src && (*src == ' ' || *src == '\t')) ++ { ++ codeIndent++; ++ src++; ++ } ++ return codeIndent; ++} ++ ++void emitUnittestComment(Scope *sc, Dsymbol *s, size_t ofs) ++{ ++ OutBuffer *buf = sc->docbuf; ++ ++ for (UnitTestDeclaration *utd = s->ddocUnittest; utd; utd = utd->ddocUnittest) ++ { ++ if (utd->protection == PROTprivate || !utd->comment || !utd->fbody) ++ continue; ++ ++ // Strip whitespaces to avoid showing empty summary ++ utf8_t *c = utd->comment; ++ while (*c == ' ' || *c == '\t' || *c == '\n' || *c == '\r') ++c; ++ ++ OutBuffer codebuf; ++ codebuf.writestring("$(DDOC_EXAMPLES \n"); ++ size_t o = codebuf.offset; ++ codebuf.writestring((char *)c); ++ ++ if (utd->codedoc) ++ { ++ size_t i = getCodeIndent(utd->codedoc); ++ while (i--) codebuf.writeByte(' '); ++ codebuf.writestring("----\n"); ++ codebuf.writestring(utd->codedoc); ++ codebuf.writestring("----\n"); ++ highlightText(sc, s, &codebuf, o); ++ } ++ ++ codebuf.writestring(")"); ++ buf->insert(buf->offset - ofs, codebuf.data, codebuf.offset); ++ } ++} ++ + /* + * Emit doc comment to documentation file + */ +@@ -505,34 +605,12 @@ void Dsymbol::emitDitto(Scope *sc) + buf->spread(sc->lastoffset, b.offset); + memcpy(buf->data + sc->lastoffset, b.data, b.offset); + sc->lastoffset += b.offset; +-} +- +-void emitUnittestComment(Scope *sc, Dsymbol *s, UnitTestDeclaration *test) +-{ +- static char pre[] = "$(D_CODE \n"; +- OutBuffer *buf = sc->docbuf; +- +- buf->writestring("$(DDOC_SECTION "); +- buf->writestring("$(B Example:)"); +- for (UnitTestDeclaration *utd = test; utd; utd = utd->unittest) +- { +- if (utd->protection == PROTprivate || !utd->comment || !utd->fbody) +- continue; +- +- OutBuffer codebuf; +- const char *body = utd->fbody->toChars(); +- if (strlen(body)) +- { +- codebuf.writestring(pre); +- codebuf.writestring(body); +- codebuf.writestring(")"); +- codebuf.writeByte(0); +- highlightCode2(sc, s, &codebuf, 0); +- buf->writestring(codebuf.toChars()); +- } +- } + +- buf->writestring(")"); ++ Dsymbol *s = this; ++ if (!s->ddocUnittest && parent) ++ s = parent->isTemplateDeclaration(); ++ if (s) ++ emitUnittestComment(sc, s, strlen(ddoc_decl_dd_e)); + } + + void ScopeDsymbol::emitMemberComments(Scope *sc) +@@ -586,6 +664,7 @@ void emitProtection(OutBuffer *buf, PROT + + void Dsymbol::emitComment(Scope *sc) { } + void InvariantDeclaration::emitComment(Scope *sc) { } ++void UnitTestDeclaration::emitComment(Scope *sc) { } + #if DMDV2 + void PostBlitDeclaration::emitComment(Scope *sc) { } + #endif +@@ -593,7 +672,6 @@ void DtorDeclaration::emitComment(Scope + void StaticCtorDeclaration::emitComment(Scope *sc) { } + void StaticDtorDeclaration::emitComment(Scope *sc) { } + void ClassInfoDeclaration::emitComment(Scope *sc) { } +-void ModuleInfoDeclaration::emitComment(Scope *sc) { } + void TypeInfoDeclaration::emitComment(Scope *sc) { } + + +@@ -650,8 +728,10 @@ void AggregateDeclaration::emitComment(S + dc->pmacrotable = &sc->module->macrotable; + + buf->writestring(ddoc_decl_s); +- toDocBuffer(buf, sc); +- sc->lastoffset = buf->offset; ++ size_t o = buf->offset; ++ toDocBuffer(buf, sc); ++ highlightCode(sc, this, buf, o); ++ sc->lastoffset = buf->offset; + buf->writestring(ddoc_decl_e); + + buf->writestring(ddoc_decl_dd_s); +@@ -666,7 +746,7 @@ void TemplateDeclaration::emitComment(Sc + if (prot() == PROTprivate) + return; + +- unsigned char *com = comment; ++ utf8_t *com = comment; + int hasmembers = 1; + + Dsymbol *ss = this; +@@ -747,7 +827,9 @@ void EnumDeclaration::emitComment(Scope + dc->pmacrotable = &sc->module->macrotable; + + buf->writestring(ddoc_decl_s); ++ size_t o = buf->offset; + toDocBuffer(buf, sc); ++ highlightCode(sc, this, buf, o); + sc->lastoffset = buf->offset; + buf->writestring(ddoc_decl_e); + +@@ -767,7 +849,6 @@ void EnumMember::emitComment(Scope *sc) + + OutBuffer *buf = sc->docbuf; + DocComment *dc = DocComment::parse(sc, this, comment); +- size_t o; + + if (!dc) + { +@@ -777,7 +858,7 @@ void EnumMember::emitComment(Scope *sc) + dc->pmacrotable = &sc->module->macrotable; + + buf->writestring(ddoc_decl_s); +- o = buf->offset; ++ size_t o = buf->offset; + toDocBuffer(buf, sc); + highlightCode(sc, this, buf, o); + sc->lastoffset = buf->offset; +@@ -788,42 +869,6 @@ void EnumMember::emitComment(Scope *sc) + buf->writestring(ddoc_decl_dd_e); + } + +-static bool emitAnchorName(OutBuffer *buf, Dsymbol *s) +-{ +- if (!s || s->isPackage() || s->isModule()) +- return false; +- +- TemplateDeclaration *td; +- bool dot; +- +- // Add parent names first +- dot = emitAnchorName(buf, s->parent); +- // Eponymous template members can share the parent anchor name +- if (s->parent && (td = s->parent->isTemplateDeclaration()) != NULL && +- td->onemember == s) +- return dot; +- if (dot) +- buf->writeByte('.'); +- // Use "this" not "__ctor" +- if (s->isCtorDeclaration() || ((td = s->isTemplateDeclaration()) != NULL && +- td->onemember && td->onemember->isCtorDeclaration())) +- buf->writestring("this"); +- else +- { +- /* We just want the identifier, not overloads like TemplateDeclaration::toChars. +- * We don't want the template parameter list and constraints. */ +- buf->writestring(s->Dsymbol::toChars()); +- } +- return true; +-} +- +-static void emitAnchor(OutBuffer *buf, Dsymbol *s) +-{ +- buf->writestring("$(DDOC_ANCHOR "); +- emitAnchorName(buf, s); +- buf->writeByte(')'); +-} +- + /******************************* toDocBuffer **********************************/ + + void Dsymbol::toDocBuffer(OutBuffer *buf, Scope *sc) +@@ -851,14 +896,17 @@ void prefix(OutBuffer *buf, Dsymbol *s) + else if (d->isAbstract()) + buf->writestring("abstract "); + +- if (d->isConst()) +- buf->writestring("const "); +-#if DMDV2 +- if (d->isImmutable()) +- buf->writestring("immutable "); +-#endif +- if (d->isSynchronized()) +- buf->writestring("synchronized "); ++ if (!d->isFuncDeclaration()) // toCBufferWithAttributes handles this ++ { ++ if (d->isConst()) ++ buf->writestring("const "); ++ #if DMDV2 ++ if (d->isImmutable()) ++ buf->writestring("immutable "); ++ #endif ++ if (d->isSynchronized()) ++ buf->writestring("synchronized "); ++ } + } + } + +@@ -867,6 +915,9 @@ void declarationToDocBuffer(Declaration + //printf("declarationToDocBuffer() %s, originalType = %s, td = %s\n", decl->toChars(), decl->originalType ? decl->originalType->toChars() : "--", td ? td->toChars() : "--"); + if (decl->ident) + { ++ if (decl->isDeprecated()) ++ buf->writestring("$(DEPRECATED "); ++ + prefix(buf, decl); + + if (decl->type) +@@ -883,6 +934,20 @@ void declarationToDocBuffer(Declaration + } + else + buf->writestring(decl->ident->toChars()); ++ ++ // emit constraints if declaration is a templated declaration ++ if (td && td->constraint) ++ { ++ HdrGenState hgs; ++ hgs.ddoc = 1; ++ buf->writestring(" if ("); ++ td->constraint->toCBuffer(buf, &hgs); ++ buf->writeByte(')'); ++ } ++ ++ if (decl->isDeprecated()) ++ buf->writestring(")"); ++ + buf->writestring(";\n"); + } + } +@@ -901,7 +966,7 @@ void AliasDeclaration::toDocBuffer(OutBu + buf->writestring("deprecated "); + + emitProtection(buf, protection); +- buf->writestring("alias "); ++ buf->printf("alias %s = ", toChars()); + + if (Dsymbol *s = aliassym) // ident alias + { +@@ -923,8 +988,6 @@ void AliasDeclaration::toDocBuffer(OutBu + } + } + +- buf->writestring(" "); +- buf->writestring(toChars()); + buf->writestring(";\n"); + } + } +@@ -1033,11 +1096,10 @@ void AggregateDeclaration::toDocBuffer(O + { + if (ident) + { +- emitAnchor(buf, this); + #if 0 + emitProtection(buf, protection); + #endif +- buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars()); ++ buf->printf("%s %s", kind(), toChars()); + buf->writestring(";\n"); + } + } +@@ -1061,8 +1123,7 @@ void StructDeclaration::toDocBuffer(OutB + } + else + { +- emitAnchor(buf, this); +- buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars()); ++ buf->printf("%s %s", kind(), toChars()); + } + buf->writestring(";\n"); + } +@@ -1087,10 +1148,9 @@ void ClassDeclaration::toDocBuffer(OutBu + } + else + { +- emitAnchor(buf, this); +- if (isAbstract()) ++ if (!isInterfaceDeclaration() && isAbstract()) + buf->writestring("abstract "); +- buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars()); ++ buf->printf("%s %s", kind(), toChars()); + } + int any = 0; + for (size_t i = 0; i < baseclasses->dim; i++) +@@ -1127,8 +1187,14 @@ void EnumDeclaration::toDocBuffer(OutBuf + { + if (ident) + { +- emitAnchor(buf, this); +- buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars()); ++ buf->printf("%s %s", kind(), toChars()); ++ if (memtype) ++ { ++ buf->writestring(": $(DDOC_ENUM_BASETYPE "); ++ HdrGenState *hgs = NULL; ++ memtype->toCBuffer(buf, NULL, hgs); ++ buf->writestring(")"); ++ } + buf->writestring(";\n"); + } + } +@@ -1144,7 +1210,7 @@ void EnumMember::toDocBuffer(OutBuffer * + + /********************************* DocComment *********************************/ + +-DocComment *DocComment::parse(Scope *sc, Dsymbol *s, unsigned char *comment) ++DocComment *DocComment::parse(Scope *sc, Dsymbol *s, utf8_t *comment) + { + //printf("parse(%s): '%s'\n", s->toChars(), comment); + if (sc->lastdc && isDitto(comment)) +@@ -1181,20 +1247,21 @@ DocComment *DocComment::parse(Scope *sc, + * then (*pcomment)[0 .. idlen] is the identifier. + */ + +-void DocComment::parseSections(unsigned char *comment) +-{ unsigned char *p; +- unsigned char *pstart; +- unsigned char *pend; +- unsigned char *idstart; ++void DocComment::parseSections(utf8_t *comment) ++{ utf8_t *p; ++ utf8_t *pstart; ++ utf8_t *pend; ++ utf8_t *idstart; + size_t idlen; + +- unsigned char *name = NULL; ++ utf8_t *name = NULL; + size_t namelen = 0; + + //printf("parseSections('%s')\n", comment); + p = comment; + while (*p) + { ++ utf8_t *pstart0 = p; + p = skipwhitespace(p); + pstart = p; + pend = p; +@@ -1210,6 +1277,11 @@ void DocComment::parseSections(unsigned + // Check for start/end of a code section + if (*p == '-') + { ++ if (!inCode) ++ { // restore leading indentation ++ while (pstart0 < pstart && isIndentWS(pstart-1)) --pstart; ++ } ++ + int numdash = 0; + while (*p == '-') + { +@@ -1224,7 +1296,7 @@ void DocComment::parseSections(unsigned + + if (!inCode && isIdStart(p)) + { +- unsigned char *q = p + utfStride(p); ++ utf8_t *q = p + utfStride(p); + while (isIdTail(q)) + q += utfStride(q); + if (*q == ':') // identifier: ends it +@@ -1298,7 +1370,7 @@ void DocComment::parseSections(unsigned + void DocComment::writeSections(Scope *sc, Dsymbol *s, OutBuffer *buf) + { + //printf("DocComment::writeSections()\n"); +- if (sections.dim) ++ if (sections.dim || s->ddocUnittest) + { + buf->writestring("$(DDOC_SECTIONS \n"); + for (size_t i = 0; i < sections.dim; i++) +@@ -1314,13 +1386,13 @@ void DocComment::writeSections(Scope *sc + buf->writestring("$(DDOC_SUMMARY "); + size_t o = buf->offset; + buf->write(sec->body, sec->bodylen); +- escapeStrayParenthesis(buf, o, s->loc); ++ escapeStrayParenthesis(buf, o, s); + highlightText(sc, s, buf, o); + buf->writestring(")\n"); + } + } +- if (s->unittest) +- emitUnittestComment(sc, s, s->unittest); ++ if (s->ddocUnittest) ++ emitUnittestComment(sc, s, 0); + buf->writestring(")\n"); + } + else +@@ -1356,10 +1428,10 @@ void Section::write(DocComment *dc, Scop + buf->writestring("$(DDOC_SECTION_H "); + size_t o = buf->offset; + for (size_t u = 0; u < namelen; u++) +- { unsigned char c = name[u]; ++ { utf8_t c = name[u]; + buf->writeByte((c == '_') ? ' ' : c); + } +- escapeStrayParenthesis(buf, o, s->loc); ++ escapeStrayParenthesis(buf, o, s); + buf->writestring(":)\n"); + } + else +@@ -1369,7 +1441,7 @@ void Section::write(DocComment *dc, Scop + L1: + size_t o = buf->offset; + buf->write(body, bodylen); +- escapeStrayParenthesis(buf, o, s->loc); ++ escapeStrayParenthesis(buf, o, s); + highlightText(sc, s, buf, o); + buf->writestring(")\n"); + } +@@ -1379,20 +1451,20 @@ void Section::write(DocComment *dc, Scop + + void ParamSection::write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf) + { +- unsigned char *p = body; ++ utf8_t *p = body; + size_t len = bodylen; +- unsigned char *pend = p + len; ++ utf8_t *pend = p + len; + +- unsigned char *tempstart; ++ utf8_t *tempstart; + size_t templen; + +- unsigned char *namestart; ++ utf8_t *namestart; + size_t namelen = 0; // !=0 if line continuation + +- unsigned char *textstart; ++ utf8_t *textstart; + size_t textlen; + +- size_t o; ++ size_t o, paramcount = 0; + Parameter *arg; + + buf->writestring("$(DDOC_PARAMS \n"); +@@ -1442,23 +1514,37 @@ void ParamSection::write(DocComment *dc, + + L1: + //printf("param '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart); ++ ++paramcount; + HdrGenState hgs; + buf->writestring("$(DDOC_PARAM_ROW "); + buf->writestring("$(DDOC_PARAM_ID "); + o = buf->offset; + arg = isFunctionParameter(s, namestart, namelen); + if (arg && arg->type && arg->ident) ++ { + arg->type->toCBuffer(buf, arg->ident, &hgs); ++ } + else ++ { ++ if (isTemplateParameter(s, namestart, namelen)) ++ { ++ // 10236: Don't count template parameters for params check ++ --paramcount; ++ } ++ else if (!arg) ++ { ++ warning(s->loc, "Ddoc: function declaration has no parameter '%.*s'", namelen, namestart); ++ } + buf->write(namestart, namelen); +- escapeStrayParenthesis(buf, o, s->loc); ++ } ++ escapeStrayParenthesis(buf, o, s); + highlightCode(sc, s, buf, o, false); + buf->writestring(")\n"); + + buf->writestring("$(DDOC_PARAM_DESC "); + o = buf->offset; + buf->write(textstart, textlen); +- escapeStrayParenthesis(buf, o, s->loc); ++ escapeStrayParenthesis(buf, o, s); + highlightText(sc, s, buf, o); + buf->writestring(")"); + buf->writestring(")\n"); +@@ -1491,6 +1577,16 @@ void ParamSection::write(DocComment *dc, + if (namelen) + goto L1; // write out last one + buf->writestring(")\n"); ++ ++ TypeFunction *tf = isTypeFunction(s); ++ if (tf) ++ { ++ size_t pcount = tf->parameters ? tf->parameters->dim : 0; ++ if (pcount != paramcount) ++ { ++ warning(s->loc, "Ddoc: parameter count mismatch"); ++ } ++ } + } + + /*************************************************** +@@ -1510,19 +1606,19 @@ void MacroSection::write(DocComment *dc, + * name2 = value2 + */ + +-void DocComment::parseMacros(Escape **pescapetable, Macro **pmacrotable, unsigned char *m, size_t mlen) ++void DocComment::parseMacros(Escape **pescapetable, Macro **pmacrotable, utf8_t *m, size_t mlen) + { +- unsigned char *p = m; ++ utf8_t *p = m; + size_t len = mlen; +- unsigned char *pend = p + len; ++ utf8_t *pend = p + len; + +- unsigned char *tempstart; ++ utf8_t *tempstart; + size_t templen; + +- unsigned char *namestart; ++ utf8_t *namestart; + size_t namelen = 0; // !=0 if line continuation + +- unsigned char *textstart; ++ utf8_t *textstart; + size_t textlen; + + while (p < pend) +@@ -1635,7 +1731,7 @@ Ldone: + * by whitespace and/or commas. + */ + +-void DocComment::parseEscapes(Escape **pescapetable, unsigned char *textstart, size_t textlen) ++void DocComment::parseEscapes(Escape **pescapetable, utf8_t *textstart, size_t textlen) + { Escape *escapetable = *pescapetable; + + if (!escapetable) +@@ -1644,8 +1740,8 @@ void DocComment::parseEscapes(Escape **p + *pescapetable = escapetable; + } + //printf("parseEscapes('%.*s') pescapetable = %p\n", textlen, textstart, pescapetable); +- unsigned char *p = textstart; +- unsigned char *pend = p + textlen; ++ utf8_t *p = textstart; ++ utf8_t *pend = p + textlen; + + while (1) + { +@@ -1659,9 +1755,9 @@ void DocComment::parseEscapes(Escape **p + } + if (p[0] != '/' || p[2] != '/') + return; +- unsigned char c = p[1]; ++ utf8_t c = p[1]; + p += 3; +- unsigned char *start = p; ++ utf8_t *start = p; + while (1) + { + if (p >= pend) +@@ -1707,11 +1803,11 @@ int icmp(const char *stringz, void *s, s + * Return !=0 if comment consists entirely of "ditto". + */ + +-int isDitto(unsigned char *comment) ++int isDitto(utf8_t *comment) + { + if (comment) + { +- unsigned char *p = skipwhitespace(comment); ++ utf8_t *p = skipwhitespace(comment); + + if (Port::memicmp((char *)p, "ditto", 5) == 0 && *skipwhitespace(p + 5) == 0) + return 1; +@@ -1723,7 +1819,7 @@ int isDitto(unsigned char *comment) + * Skip white space. + */ + +-unsigned char *skipwhitespace(unsigned char *p) ++utf8_t *skipwhitespace(utf8_t *p) + { + for (; 1; p++) + { switch (*p) +@@ -1752,7 +1848,7 @@ size_t skiptoident(OutBuffer *buf, size_ + { dchar_t c; + + size_t oi = i; +- if (utf_decodeChar((unsigned char *)buf->data, buf->offset, &i, &c)) ++ if (utf_decodeChar((utf8_t *)buf->data, buf->offset, &i, &c)) + /* Ignore UTF errors, but still consume input + */ + break; +@@ -1779,7 +1875,7 @@ size_t skippastident(OutBuffer *buf, siz + { dchar_t c; + + size_t oi = i; +- if (utf_decodeChar((unsigned char *)buf->data, buf->offset, &i, &c)) ++ if (utf_decodeChar((utf8_t *)buf->data, buf->offset, &i, &c)) + /* Ignore UTF errors, but still consume input + */ + break; +@@ -1807,7 +1903,7 @@ size_t skippastident(OutBuffer *buf, siz + + size_t skippastURL(OutBuffer *buf, size_t i) + { size_t length = buf->offset - i; +- unsigned char *p = &buf->data[i]; ++ utf8_t *p = &buf->data[i]; + size_t j; + unsigned sawdot = 0; + +@@ -1823,7 +1919,7 @@ size_t skippastURL(OutBuffer *buf, size_ + goto Lno; + + for (; j < length; j++) +- { unsigned char c = p[j]; ++ { utf8_t c = p[j]; + if (isalnum(c)) + continue; + if (c == '-' || c == '_' || c == '?' || +@@ -1849,7 +1945,7 @@ Lno: + /**************************************************** + */ + +-int isKeyword(unsigned char *p, size_t len) ++int isKeyword(utf8_t *p, size_t len) + { + static const char *table[] = { "true", "false", "null" }; + +@@ -1864,10 +1960,17 @@ int isKeyword(unsigned char *p, size_t l + /**************************************************** + */ + +-Parameter *isFunctionParameter(Dsymbol *s, unsigned char *p, size_t len) ++TypeFunction *isTypeFunction(Dsymbol *s) + { + FuncDeclaration *f = s->isFuncDeclaration(); + ++ /* Check whether s refers to an eponymous function template. ++ */ ++ if (f == NULL && s->isTemplateDeclaration() && s->isTemplateDeclaration()->onemember) ++ { ++ f = s->isTemplateDeclaration()->onemember->isFuncDeclaration(); ++ } ++ + /* f->type may be NULL for template members. + */ + if (f && f->type) +@@ -1880,15 +1983,45 @@ Parameter *isFunctionParameter(Dsymbol * + else + tf = (TypeFunction *)f->type; + +- if (tf->parameters) ++ return tf; ++ } ++ return NULL; ++} ++ ++/**************************************************** ++ */ ++ ++Parameter *isFunctionParameter(Dsymbol *s, utf8_t *p, size_t len) ++{ ++ TypeFunction *tf = isTypeFunction(s); ++ if (tf && tf->parameters) ++ { ++ for (size_t k = 0; k < tf->parameters->dim; k++) + { +- for (size_t k = 0; k < tf->parameters->dim; k++) +- { Parameter *arg = (*tf->parameters)[k]; ++ Parameter *arg = (*tf->parameters)[k]; ++ if (arg->ident && cmp(arg->ident->toChars(), p, len) == 0) ++ { ++ return arg; ++ } ++ } ++ } ++ return NULL; ++} + +- if (arg->ident && cmp(arg->ident->toChars(), p, len) == 0) +- { +- return arg; +- } ++/**************************************************** ++ */ ++ ++TemplateParameter *isTemplateParameter(Dsymbol *s, utf8_t *p, size_t len) ++{ ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (td && td->origParameters) ++ { ++ for (size_t k = 0; k < td->origParameters->dim; k++) ++ { ++ TemplateParameter *arg = (*td->origParameters)[k]; ++ if (arg->ident && cmp(arg->ident->toChars(), p, len) == 0) ++ { ++ return arg; + } + } + } +@@ -1904,18 +2037,19 @@ void highlightText(Scope *sc, Dsymbol *s + //printf("highlightText()\n"); + const char *sid = s->ident->toChars(); + FuncDeclaration *f = s->isFuncDeclaration(); +- unsigned char *p; ++ utf8_t *p; + const char *se; + + int leadingBlank = 1; + int inCode = 0; + //int inComment = 0; // in comment + size_t iCodeStart; // start of code section ++ size_t codeIndent = 0; + + size_t iLineStart = offset; + + for (size_t i = offset; i < buf->offset; i++) +- { unsigned char c = buf->data[i]; ++ { utf8_t c = buf->data[i]; + + Lcont: + switch (c) +@@ -1930,7 +2064,7 @@ void highlightText(Scope *sc, Dsymbol *s + { + static char blankline[] = "$(DDOC_BLANKLINE)\n"; + +- i = buf->insert(i, blankline, sizeof(blankline) - 1); ++ i = buf->insert(i, blankline, strlen(blankline)); + } + leadingBlank = 1; + iLineStart = i + 1; +@@ -2083,6 +2217,30 @@ void highlightText(Scope *sc, Dsymbol *s + + codebuf.write(buf->data + iCodeStart, i - iCodeStart); + codebuf.writeByte(0); ++ ++ // Remove leading indentations from all lines ++ bool lineStart = true; ++ utf8_t *endp = codebuf.data + codebuf.offset; ++ for (utf8_t *p = codebuf.data; p < endp; ) ++ { ++ if (lineStart) ++ { ++ size_t j = codeIndent; ++ utf8_t *q = p; ++ while (j-- > 0 && q < endp && isIndentWS(q)) ++ ++q; ++ codebuf.remove(p - codebuf.data, q - p); ++ assert(codebuf.data <= p); ++ assert(p < codebuf.data + codebuf.offset); ++ lineStart = false; ++ endp = codebuf.data + codebuf.offset; // update ++ continue; ++ } ++ if (*p == '\n') ++ lineStart = true; ++ ++p; ++ } ++ + highlightCode2(sc, s, &codebuf, 0); + buf->remove(iCodeStart, i - iCodeStart); + i = buf->insert(iCodeStart, codebuf.data, codebuf.offset); +@@ -2093,7 +2251,8 @@ void highlightText(Scope *sc, Dsymbol *s + { static char pre[] = "$(D_CODE \n"; + + inCode = 1; +- i = buf->insert(i, pre, sizeof(pre) - 1); ++ codeIndent = istart - iLineStart; // save indent count ++ i = buf->insert(i, pre, strlen(pre)); + iCodeStart = i; + i--; // place i on > + leadingBlank = true; +@@ -2172,7 +2331,7 @@ void highlightCode(Scope *sc, Dsymbol *s + + //printf("highlightCode(s = '%s', kind = %s)\n", sid, s->kind()); + for (size_t i = offset; i < buf->offset; i++) +- { unsigned char c = buf->data[i]; ++ { utf8_t c = buf->data[i]; + const char *se; + + se = sc->module->escapetable->escapeChar(c); +@@ -2211,7 +2370,7 @@ void highlightCode(Scope *sc, Dsymbol *s + /**************************************** + */ + +-void highlightCode3(Scope *sc, OutBuffer *buf, unsigned char *p, unsigned char *pend) ++void highlightCode3(Scope *sc, OutBuffer *buf, utf8_t *p, utf8_t *pend) + { + for (; p < pend; p++) + { const char *s = sc->module->escapetable->escapeChar(*p); +@@ -2229,15 +2388,18 @@ void highlightCode3(Scope *sc, OutBuffer + + void highlightCode2(Scope *sc, Dsymbol *s, OutBuffer *buf, size_t offset) + { +- char *sid = s->ident->toChars(); ++ const char *sid = s->ident->toChars(); + FuncDeclaration *f = s->isFuncDeclaration(); + unsigned errorsave = global.errors; + Lexer lex(NULL, buf->data, 0, buf->offset - 1, 0, 1); + Token tok; + OutBuffer res; +- unsigned char *lastp = buf->data; ++ utf8_t *lastp = buf->data; + const char *highlight; + ++ if (s->isModule() && ((Module *)s)->isDocFile) ++ sid = ""; ++ + //printf("highlightCode2('%.*s')\n", buf->offset - 1, buf->data); + res.reserve(buf->offset); + while (1) +@@ -2280,10 +2442,16 @@ void highlightCode2(Scope *sc, Dsymbol * + break; + } + if (highlight) ++ { + res.writestring(highlight); +- highlightCode3(sc, &res, tok.ptr, lex.p); +- if (highlight) ++ size_t o = res.offset; ++ highlightCode3(sc, &res, tok.ptr, lex.p); ++ if (tok.value == TOKcomment || tok.value == TOKstring) ++ escapeDdocString(&res, o); // Bugzilla 7656, 7715, and 10519 + res.writeByte(')'); ++ } ++ else ++ highlightCode3(sc, &res, tok.ptr, lex.p); + if (tok.value == TOKeof) + break; + lastp = lex.p; +@@ -2328,7 +2496,7 @@ const char *Escape::escapeChar(unsigned + * Determine if p points to the start of an identifier. + */ + +-int isIdStart(unsigned char *p) ++int isIdStart(utf8_t *p) + { + unsigned c = *p; + if (isalpha(c) || c == '_') +@@ -2347,7 +2515,7 @@ int isIdStart(unsigned char *p) + * Determine if p points to the rest of an identifier. + */ + +-int isIdTail(unsigned char *p) ++int isIdTail(utf8_t *p) + { + unsigned c = *p; + if (isalnum(c) || c == '_') +@@ -2362,11 +2530,20 @@ int isIdTail(unsigned char *p) + return 0; + } + ++/**************************************** ++ * Determine if p points to the indentation space. ++ */ ++ ++int isIndentWS(utf8_t *p) ++{ ++ return (*p == ' ') || (*p == '\t'); ++} ++ + /***************************************** + * Return number of bytes in UTF character. + */ + +-int utfStride(unsigned char *p) ++int utfStride(utf8_t *p) + { + unsigned c = *p; + if (c < 0x80) +--- a/src/gcc/d/dfrontend/dsymbol.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/dsymbol.c 2014-04-01 16:32:51.000000000 +0100 +@@ -45,12 +45,14 @@ Dsymbol::Dsymbol() + this->parent = NULL; + this->csym = NULL; + this->isym = NULL; +- this->loc = 0; ++ this->loc = Loc(); + this->comment = NULL; + this->scope = NULL; ++ this->semanticRun = PASSinit; + this->errors = false; ++ this->depmsg = NULL; + this->userAttributes = NULL; +- this->unittest = NULL; ++ this->ddocUnittest = NULL; + } + + Dsymbol::Dsymbol(Identifier *ident) +@@ -60,25 +62,25 @@ Dsymbol::Dsymbol(Identifier *ident) + this->parent = NULL; + this->csym = NULL; + this->isym = NULL; +- this->loc = 0; ++ this->loc = Loc(); + this->comment = NULL; + this->scope = NULL; ++ this->semanticRun = PASSinit; + this->errors = false; + this->depmsg = NULL; + this->userAttributes = NULL; +- this->unittest = NULL; ++ this->ddocUnittest = NULL; + } + +-int Dsymbol::equals(Object *o) +-{ Dsymbol *s; +- ++bool Dsymbol::equals(RootObject *o) ++{ + if (this == o) +- return TRUE; +- s = (Dsymbol *)(o); ++ return true; ++ Dsymbol *s = (Dsymbol *)(o); + // Overload sets don't have an ident + if (s && ident && s->ident && ident->equals(s->ident)) +- return TRUE; +- return FALSE; ++ return true; ++ return false; + } + + /************************************** +@@ -98,23 +100,23 @@ Dsymbol *Dsymbol::syntaxCopy(Dsymbol *s) + /************************************** + * Determine if this symbol is only one. + * Returns: +- * FALSE, *ps = NULL: There are 2 or more symbols +- * TRUE, *ps = NULL: There are zero symbols +- * TRUE, *ps = symbol: The one and only one symbol ++ * false, *ps = NULL: There are 2 or more symbols ++ * true, *ps = NULL: There are zero symbols ++ * true, *ps = symbol: The one and only one symbol + */ + +-int Dsymbol::oneMember(Dsymbol **ps, Identifier *ident) ++bool Dsymbol::oneMember(Dsymbol **ps, Identifier *ident) + { + //printf("Dsymbol::oneMember()\n"); + *ps = this; +- return TRUE; ++ return true; + } + + /***************************************** + * Same as Dsymbol::oneMember(), but look at an array of Dsymbols. + */ + +-int Dsymbol::oneMembers(Dsymbols *members, Dsymbol **ps, Identifier *ident) ++bool Dsymbol::oneMembers(Dsymbols *members, Dsymbol **ps, Identifier *ident) + { + //printf("Dsymbol::oneMembers() %d\n", members ? members->dim : 0); + Dsymbol *s = NULL; +@@ -124,46 +126,61 @@ int Dsymbol::oneMembers(Dsymbols *member + for (size_t i = 0; i < members->dim; i++) + { Dsymbol *sx = (*members)[i]; + +- int x = sx->oneMember(ps, ident); ++ bool x = sx->oneMember(ps, ident); + //printf("\t[%d] kind %s = %d, s = %p\n", i, sx->kind(), x, *ps); + if (!x) + { + //printf("\tfalse 1\n"); + assert(*ps == NULL); +- return FALSE; ++ return false; + } + if (*ps) + { +- if (ident) +- { +- if (!(*ps)->ident || !(*ps)->ident->equals(ident)) +- continue; +- } ++ assert(ident); ++ if (!(*ps)->ident || !(*ps)->ident->equals(ident)) ++ continue; + if (!s) + s = *ps; + else if (s->isOverloadable() && (*ps)->isOverloadable()) +- ; // keep head of overload set ++ { ++ // keep head of overload set ++ FuncDeclaration *f1 = s->isFuncDeclaration(); ++ FuncDeclaration *f2 = (*ps)->isFuncDeclaration(); ++ if (f1 && f2) ++ { ++ assert(!f1->isFuncAliasDeclaration()); ++ assert(!f2->isFuncAliasDeclaration()); ++ for (; f1 != f2; f1 = f1->overnext0) ++ { ++ if (f1->overnext0 == NULL) ++ { ++ f1->overnext0 = f2; ++ break; ++ } ++ } ++ } ++ } + else // more than one symbol + { *ps = NULL; + //printf("\tfalse 2\n"); +- return FALSE; ++ return false; + } + } + } + } + *ps = s; // s is the one symbol, NULL if none + //printf("\ttrue\n"); +- return TRUE; ++ return true; + } + + /***************************************** + * Is Dsymbol a variable that contains pointers? + */ + +-int Dsymbol::hasPointers() ++bool Dsymbol::hasPointers() + { + //printf("Dsymbol::hasPointers() %s\n", toChars()); +- return 0; ++ return false; + } + + bool Dsymbol::hasStaticCtorOrDtor() +@@ -176,6 +193,11 @@ void Dsymbol::setFieldOffset(AggregateDe + { + } + ++Identifier *Dsymbol::getIdent() ++{ ++ return ident; ++} ++ + char *Dsymbol::toChars() + { + return ident ? ident->toChars() : (char *)"__anonymous"; +@@ -301,9 +323,9 @@ TemplateInstance *Dsymbol::isSpeculative + return NULL; + } + +-int Dsymbol::isAnonymous() ++bool Dsymbol::isAnonymous() + { +- return ident ? 0 : 1; ++ return ident == NULL; + } + + /************************************* +@@ -329,10 +351,6 @@ void Dsymbol::importAll(Scope *sc) + * Does semantic analysis on the public face of declarations. + */ + +-void Dsymbol::semantic0(Scope *sc) +-{ +-} +- + void Dsymbol::semantic(Scope *sc) + { + error("%p has no semantic routine", this); +@@ -400,8 +418,7 @@ void *symbol_search_fp(void *arg, const + assert(id); + + Dsymbol *s = (Dsymbol *)arg; +- Module::clearCache(); +- return s->search(0, id, 4|2); ++ return (void *)s->search(Loc(), id, 4|2); + } + + Dsymbol *Dsymbol::search_correct(Identifier *ident) +@@ -409,7 +426,7 @@ Dsymbol *Dsymbol::search_correct(Identif + if (global.gag) + return NULL; // don't do it for speculative compiles; too time consuming + +- return (Dsymbol *)speller(ident->toChars(), &symbol_search_fp, this, idchars); ++ return (Dsymbol *)speller(ident->toChars(), &symbol_search_fp, (void *)this, idchars); + } + + /*************************************** +@@ -419,7 +436,7 @@ Dsymbol *Dsymbol::search_correct(Identif + * symbol found, NULL if not + */ + +-Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, Identifier *id) ++Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, RootObject *id) + { + //printf("Dsymbol::searchX(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars()); + Dsymbol *s = toAlias(); +@@ -428,7 +445,7 @@ Dsymbol *Dsymbol::searchX(Loc loc, Scope + switch (id->dyncast()) + { + case DYNCAST_IDENTIFIER: +- sm = s->search(loc, id, 0); ++ sm = s->search(loc, (Identifier *)id, 0); + break; + + case DYNCAST_DSYMBOL: +@@ -436,7 +453,7 @@ Dsymbol *Dsymbol::searchX(Loc loc, Scope + //printf("\ttemplate instance id\n"); + Dsymbol *st = (Dsymbol *)id; + TemplateInstance *ti = st->isTemplateInstance(); +- id = ti->name; ++ Identifier *id = ti->name; + sm = s->search(loc, id, 0); + if (!sm) + { +@@ -469,10 +486,10 @@ Dsymbol *Dsymbol::searchX(Loc loc, Scope + return sm; + } + +-int Dsymbol::overloadInsert(Dsymbol *s) ++bool Dsymbol::overloadInsert(Dsymbol *s) + { + //printf("Dsymbol::overloadInsert('%s')\n", s->toChars()); +- return FALSE; ++ return false; + } + + void Dsymbol::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -486,9 +503,9 @@ unsigned Dsymbol::size(Loc loc) + return 0; + } + +-int Dsymbol::isforwardRef() ++bool Dsymbol::isforwardRef() + { +- return FALSE; ++ return false; + } + + AggregateDeclaration *Dsymbol::isThis() +@@ -523,30 +540,30 @@ void Dsymbol::defineRef(Dsymbol *s) + assert(0); + } + +-int Dsymbol::isExport() ++bool Dsymbol::isExport() + { +- return FALSE; ++ return false; + } + +-int Dsymbol::isImportedSymbol() ++bool Dsymbol::isImportedSymbol() + { +- return FALSE; ++ return false; + } + +-int Dsymbol::isDeprecated() ++bool Dsymbol::isDeprecated() + { +- return FALSE; ++ return false; + } + + #if DMDV2 +-int Dsymbol::isOverloadable() ++bool Dsymbol::isOverloadable() + { +- return 0; ++ return false; + } + +-int Dsymbol::hasOverloads() ++bool Dsymbol::hasOverloads() + { +- return 0; ++ return false; + } + #endif + +@@ -568,9 +585,9 @@ Type *Dsymbol::getType() + return NULL; + } + +-int Dsymbol::needThis() ++bool Dsymbol::needThis() + { +- return FALSE; ++ return false; + } + + int Dsymbol::apply(Dsymbol_apply_ft_t fp, void *param) +@@ -593,7 +610,7 @@ int Dsymbol::addMember(Scope *sc, ScopeD + s2 = sd->symtab->lookup(ident); + if (!s2->overloadInsert(this)) + { +- sd->multiplyDefined(0, this, s2); ++ sd->multiplyDefined(Loc(), this, s2); + } + } + if (sd->isAggregateDeclaration() || sd->isEnumDeclaration()) +@@ -728,7 +745,7 @@ Module *Dsymbol::getAccessModule() + if (m) + return m; + TemplateInstance *ti = s->isTemplateInstance(); +- if (ti && ti->isnested) ++ if (ti && ti->enclosing) + /* Because of local template instantiation, the parent isn't where the access + * rights come from - it's the template declaration + */ +@@ -742,7 +759,7 @@ Module *Dsymbol::getAccessModule() + /************************************* + */ + +-enum PROT Dsymbol::prot() ++PROT Dsymbol::prot() + { + return PROTpublic; + } +@@ -776,7 +793,7 @@ Dsymbols *Dsymbol::arraySyntaxCopy(Dsymb + * Ignore NULL comments. + */ + +-void Dsymbol::addComment(unsigned char *comment) ++void Dsymbol::addComment(utf8_t *comment) + { + //if (comment) + //printf("adding comment '%s' to symbol %p '%s'\n", comment, this, toChars()); +@@ -794,8 +811,8 @@ void Dsymbol::addComment(unsigned char * + /********************************* OverloadSet ****************************/ + + #if DMDV2 +-OverloadSet::OverloadSet() +- : Dsymbol() ++OverloadSet::OverloadSet(Identifier *ident) ++ : Dsymbol(ident) + { + } + +@@ -844,35 +861,44 @@ Dsymbol *ScopeDsymbol::syntaxCopy(Dsymbo + return sd; + } + ++/***************************************** ++ * This function is #1 on the list of functions that eat cpu time. ++ * Be very, very careful about slowing it down. ++ */ ++ + Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags) + { + //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags); + //if (strcmp(ident->toChars(),"c") == 0) *(char*)0=0; + + // Look in symbols declared in this module +- Dsymbol *s = symtab ? symtab->lookup(ident) : NULL; +- //printf("\ts = %p, imports = %p, %d\n", s, imports, imports ? imports->dim : 0); +- if (s) ++ Dsymbol *s1 = symtab ? symtab->lookup(ident) : NULL; ++ //printf("\ts1 = %p, imports = %p, %d\n", s1, imports, imports ? imports->dim : 0); ++ if (s1) + { +- //printf("\ts = '%s.%s'\n",toChars(),s->toChars()); ++ //printf("\ts = '%s.%s'\n",toChars(),s1->toChars()); ++ return s1; + } +- else if (imports) ++ else if (!imports) ++ return NULL; ++ else + { ++ Dsymbol *s = NULL; + OverloadSet *a = NULL; + + // Look in imported modules + for (size_t i = 0; i < imports->dim; i++) +- { Dsymbol *ss = (*imports)[i]; +- Dsymbol *s2; +- ++ { + // If private import, don't search it + if (flags & 1 && prots[i] == PROTprivate) + continue; + ++ Dsymbol *ss = (*imports)[i]; ++ + //printf("\tscanning import '%s', prots = %d, isModule = %p, isImport = %p\n", ss->toChars(), prots[i], ss->isModule(), ss->isImport()); + /* Don't find private members if ss is a module + */ +- s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0); ++ Dsymbol *s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0); + if (!s) + s = s2; + else if (s2 && s != s2) +@@ -904,12 +930,23 @@ Dsymbol *ScopeDsymbol::search(Loc loc, I + ) + ) + { ++ /* Bugzilla 8668: ++ * Public selective import adds AliasDeclaration in module. ++ * To make an overload set, resolve aliases in here and ++ * get actual overload roots which accessible via s and s2. ++ */ ++ s = s->toAlias(); ++ s2 = s2->toAlias(); ++ + /* If both s2 and s are overloadable (though we only + * need to check s once) + */ + if (s2->isOverloadable() && (a || s->isOverloadable())) + { if (!a) +- a = new OverloadSet(); ++ { ++ a = new OverloadSet(s->ident); ++ a->parent = this; ++ } + /* Don't add to a[] if s2 is alias of previous sym + */ + for (size_t j = 0; j < a->a.dim; j++) +@@ -946,33 +983,17 @@ Dsymbol *ScopeDsymbol::search(Loc loc, I + + if (s) + { +- if (!(flags & 2)) +- { Declaration *d = s->isDeclaration(); +- if (d && d->protection == PROTprivate && +- !d->parent->isTemplateMixin()) +- error(loc, "%s is private", d->toPrettyChars()); +- +- AggregateDeclaration *ad = s->isAggregateDeclaration(); +- if (ad && ad->protection == PROTprivate && +- !ad->parent->isTemplateMixin()) +- error(loc, "%s is private", ad->toPrettyChars()); +- +- EnumDeclaration *ed = s->isEnumDeclaration(); +- if (ed && ed->protection == PROTprivate && +- !ed->parent->isTemplateMixin()) +- error(loc, "%s is private", ed->toPrettyChars()); +- +- TemplateDeclaration *td = s->isTemplateDeclaration(); +- if (td && td->protection == PROTprivate && +- !td->parent->isTemplateMixin()) +- error(loc, "%s is private", td->toPrettyChars()); ++ if (!(flags & 2) && s->prot() == PROTprivate && !s->parent->isTemplateMixin()) ++ { ++ if (!s->isImport()) ++ error(loc, "%s %s is private", s->kind(), s->toPrettyChars()); + } + } ++ return s; + } +- return s; + } + +-void ScopeDsymbol::importScope(Dsymbol *s, enum PROT protection) ++void ScopeDsymbol::importScope(Dsymbol *s, PROT protection) + { + //printf("%s->ScopeDsymbol::importScope(%s, %d)\n", toChars(), s->toChars(), protection); + +@@ -999,7 +1020,7 @@ void ScopeDsymbol::importScope(Dsymbol * + } + } + +-int ScopeDsymbol::isforwardRef() ++bool ScopeDsymbol::isforwardRef() + { + return (members == NULL); + } +@@ -1054,7 +1075,7 @@ Dsymbol *ScopeDsymbol::nameCollision(Dsy + return sprev; + } + } +- multiplyDefined(0, s, sprev); ++ multiplyDefined(Loc(), s, sprev); + return sprev; + } + +@@ -1205,7 +1226,7 @@ FuncDeclaration *ScopeDsymbol::findGetMe + + Type *tret = NULL; + tfgetmembers = new TypeFunction(arguments, tret, 0, LINKd); +- tfgetmembers = (TypeFunction *)tfgetmembers->semantic(0, &sc); ++ tfgetmembers = (TypeFunction *)tfgetmembers->semantic(Loc(), &sc); + } + if (fdx) + fdx = fdx->overloadExactMatch(tfgetmembers); +@@ -1229,7 +1250,24 @@ WithScopeSymbol::WithScopeSymbol(WithSta + Dsymbol *WithScopeSymbol::search(Loc loc, Identifier *ident, int flags) + { + // Acts as proxy to the with class declaration +- return withstate->exp->type->toDsymbol(NULL)->search(loc, ident, 0); ++ Dsymbol *s = NULL; ++ Expression *eold = NULL; ++ for (Expression *e = withstate->exp; e != eold; e = resolveAliasThis(scope, e)) ++ { ++ Type *t = e->type->toBasetype(); ++ if (t->ty == Taarray) ++ s = ((TypeAArray *)t)->getImpl(); ++ else ++ s = t->toDsymbol(NULL); ++ if (s) ++ { ++ s = s->search(loc, ident, 0); ++ if (s) ++ return s; ++ } ++ eold = e; ++ } ++ return NULL; + } + + /****************************** ArrayScopeSymbol ******************************/ +@@ -1275,8 +1313,8 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + { /* $ gives the number of elements in the tuple + */ + VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL); +- Expression *e = new IntegerExp(0, td->objects->dim, Type::tsize_t); +- v->init = new ExpInitializer(0, e); ++ Expression *e = new IntegerExp(Loc(), td->objects->dim, Type::tsize_t); ++ v->init = new ExpInitializer(Loc(), e); + v->storage_class |= STCstatic | STCconst; + v->semantic(sc); + return v; +@@ -1286,8 +1324,8 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + { /* $ gives the number of type entries in the type tuple + */ + VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL); +- Expression *e = new IntegerExp(0, type->arguments->dim, Type::tsize_t); +- v->init = new ExpInitializer(0, e); ++ Expression *e = new IntegerExp(Loc(), type->arguments->dim, Type::tsize_t); ++ v->init = new ExpInitializer(Loc(), e); + v->storage_class |= STCstatic | STCconst; + v->semantic(sc); + return v; +@@ -1351,8 +1389,8 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + { /* It is for an expression tuple, so the + * length will be a const. + */ +- Expression *e = new IntegerExp(0, ((TupleExp *)ce)->exps->dim, Type::tsize_t); +- v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, new ExpInitializer(0, e)); ++ Expression *e = new IntegerExp(Loc(), ((TupleExp *)ce)->exps->dim, Type::tsize_t); ++ v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, new ExpInitializer(Loc(), e)); + v->storage_class |= STCstatic | STCconst; + } + else if (ce->type && (t = ce->type->toBasetype()) != NULL && +@@ -1376,29 +1414,6 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + return NULL; + s = s->toAlias(); + +- if (ce->hasSideEffect()) +- { +- /* Even if opDollar is needed, 'ce' should be evaluate only once. So +- * Rewrite: +- * ce.opIndex( ... use of $ ... ) +- * ce.opSlice( ... use of $ ... ) +- * as: +- * (ref __dop = ce, __dop).opIndex( ... __dop.opDollar ...) +- * (ref __dop = ce, __dop).opSlice( ... __dop.opDollar ...) +- */ +- Identifier *id = Lexer::uniqueId("__dop"); +- ExpInitializer *ei = new ExpInitializer(loc, ce); +- VarDeclaration *v = new VarDeclaration(loc, NULL, id, ei); +- v->storage_class |= STCctfe | STCforeach | STCref; +- DeclarationExp *de = new DeclarationExp(loc, v); +- VarExp *ve = new VarExp(loc, v); +- v->semantic(sc); +- de->type = ce->type; +- ve->type = ce->type; +- ((UnaExp *)exp)->e1 = new CommaExp(loc, de, ve); +- ce = ve; +- } +- + Expression *e = NULL; + // Check for multi-dimensional opDollar(dim) template. + if (TemplateDeclaration *td = s->isTemplateDeclaration()) +@@ -1414,7 +1429,7 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + } + + Objects *tdargs = new Objects(); +- Expression *edim = new IntegerExp(0, dim, Type::tsize_t); ++ Expression *edim = new IntegerExp(Loc(), dim, Type::tsize_t); + edim = edim->semantic(sc); + tdargs->push(edim); + +@@ -1444,7 +1459,7 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + t = e->type->toBasetype(); + if (t && t->ty == Tfunction) + e = new CallExp(e->loc, e); +- v = new VarDeclaration(loc, NULL, Id::dollar, new ExpInitializer(0, e)); ++ v = new VarDeclaration(loc, NULL, Id::dollar, new ExpInitializer(Loc(), e)); + } + else + { /* For arrays, $ will either be a compile-time constant +@@ -1452,7 +1467,7 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + * or a variable (in which case an expression is created in + * toir.c). + */ +- VoidInitializer *e = new VoidInitializer(0); ++ VoidInitializer *e = new VoidInitializer(Loc()); + e->type = Type::tsize_t; + v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, e); + v->storage_class |= STCctfe; // it's never a true static variable +@@ -1470,90 +1485,42 @@ Dsymbol *ArrayScopeSymbol::search(Loc lo + + DsymbolTable::DsymbolTable() + { +-#if STRINGTABLE +- tab = new StringTable; +- tab->init(); +-#else + tab = NULL; +-#endif +-} +- +-DsymbolTable::~DsymbolTable() +-{ +-#if STRINGTABLE +- delete tab; +-#endif + } + + Dsymbol *DsymbolTable::lookup(Identifier *ident) + { +-#if STRINGTABLE +-#ifdef DEBUG +- assert(ident); +- assert(tab); +-#endif +- //printf("DsymbolTable::lookup(%s)\n", (char*)ident->string); +- StringValue *sv = tab->lookup((char*)ident->string, ident->len); +- return (Dsymbol *)(sv ? sv->ptrvalue : NULL); +-#else + //printf("DsymbolTable::lookup(%s)\n", (char*)ident->string); + return (Dsymbol *)_aaGetRvalue(tab, ident); +-#endif + } + + Dsymbol *DsymbolTable::insert(Dsymbol *s) + { + //printf("DsymbolTable::insert(this = %p, '%s')\n", this, s->ident->toChars()); + Identifier *ident = s->ident; +-#if STRINGTABLE +-#ifdef DEBUG +- assert(ident); +- assert(tab); +-#endif +- StringValue *sv = tab->insert(ident->toChars(), ident->len); +- if (!sv) +- return NULL; // already in table +- sv->ptrvalue = s; +- return s; +-#else + Dsymbol **ps = (Dsymbol **)_aaGet(&tab, ident); + if (*ps) + return NULL; // already in table + *ps = s; + return s; +-#endif + } + + Dsymbol *DsymbolTable::insert(Identifier *ident, Dsymbol *s) + { + //printf("DsymbolTable::insert()\n"); +-#if STRINGTABLE +- StringValue *sv = tab->insert(ident->toChars(), ident->len); +- if (!sv) +- return NULL; // already in table +- sv->ptrvalue = s; +- return s; +-#else + Dsymbol **ps = (Dsymbol **)_aaGet(&tab, ident); + if (*ps) + return NULL; // already in table + *ps = s; + return s; +-#endif + } + + Dsymbol *DsymbolTable::update(Dsymbol *s) + { + Identifier *ident = s->ident; +-#if STRINGTABLE +- StringValue *sv = tab->update(ident->toChars(), ident->len); +- sv->ptrvalue = s; +- return s; +-#else + Dsymbol **ps = (Dsymbol **)_aaGet(&tab, ident); + *ps = s; + return s; +-#endif + } + + +--- a/src/gcc/d/dfrontend/dsymbol.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/dsymbol.h 2014-04-01 16:32:51.000000000 +0100 +@@ -21,56 +21,56 @@ + #include "mars.h" + #include "arraytypes.h" + +-struct Identifier; ++class Identifier; + struct Scope; +-struct DsymbolTable; +-struct Declaration; +-struct ThisDeclaration; +-struct TupleDeclaration; +-struct TypedefDeclaration; +-struct AliasDeclaration; +-struct AggregateDeclaration; +-struct EnumDeclaration; +-struct ClassDeclaration; +-struct InterfaceDeclaration; +-struct StructDeclaration; +-struct UnionDeclaration; +-struct FuncDeclaration; +-struct FuncAliasDeclaration; +-struct FuncLiteralDeclaration; +-struct CtorDeclaration; +-struct PostBlitDeclaration; +-struct DtorDeclaration; +-struct StaticCtorDeclaration; +-struct StaticDtorDeclaration; +-struct SharedStaticCtorDeclaration; +-struct SharedStaticDtorDeclaration; +-struct InvariantDeclaration; +-struct UnitTestDeclaration; +-struct NewDeclaration; +-struct VarDeclaration; +-struct AttribDeclaration; ++class DsymbolTable; ++class Declaration; ++class ThisDeclaration; ++class TypeInfoDeclaration; ++class TupleDeclaration; ++class TypedefDeclaration; ++class AliasDeclaration; ++class AggregateDeclaration; ++class EnumDeclaration; ++class ClassDeclaration; ++class InterfaceDeclaration; ++class StructDeclaration; ++class UnionDeclaration; ++class FuncDeclaration; ++class FuncAliasDeclaration; ++class FuncLiteralDeclaration; ++class CtorDeclaration; ++class PostBlitDeclaration; ++class DtorDeclaration; ++class StaticCtorDeclaration; ++class StaticDtorDeclaration; ++class SharedStaticCtorDeclaration; ++class SharedStaticDtorDeclaration; ++class InvariantDeclaration; ++class UnitTestDeclaration; ++class NewDeclaration; ++class VarDeclaration; ++class AttribDeclaration; + struct Symbol; +-struct Package; +-struct Module; +-struct Import; +-struct Type; +-struct TypeTuple; +-struct WithStatement; +-struct LabelDsymbol; +-struct ScopeDsymbol; +-struct TemplateDeclaration; +-struct TemplateInstance; +-struct TemplateMixin; +-struct EnumMember; +-struct ScopeDsymbol; +-struct WithScopeSymbol; +-struct ArrayScopeSymbol; +-struct SymbolDeclaration; +-struct Expression; +-struct DeleteDeclaration; ++class Package; ++class Module; ++class Import; ++class Type; ++class TypeTuple; ++class WithStatement; ++class LabelDsymbol; ++class ScopeDsymbol; ++class TemplateDeclaration; ++class TemplateInstance; ++class TemplateMixin; ++class EnumMember; ++class WithScopeSymbol; ++class ArrayScopeSymbol; ++class SymbolDeclaration; ++class Expression; ++class DeleteDeclaration; + struct HdrGenState; +-struct OverloadSet; ++class OverloadSet; + struct AA; + struct JsonOut; + #ifdef IN_GCC +@@ -103,35 +103,40 @@ enum PASS + PASSinit, // initial state + PASSsemantic, // semantic() started + PASSsemanticdone, // semantic() done +- PASSsemantic2, // semantic2() run ++ PASSsemantic2, // semantic2() started ++ PASSsemantic2done, // semantic2() done + PASSsemantic3, // semantic3() started + PASSsemantic3done, // semantic3() done ++ PASSinline, // inline started ++ PASSinlinedone, // inline done + PASSobj, // toObjFile() run + }; + + typedef int (*Dsymbol_apply_ft_t)(Dsymbol *, void *); + +-struct Dsymbol : Object ++class Dsymbol : public RootObject + { ++public: + Identifier *ident; + Dsymbol *parent; + Symbol *csym; // symbol for code generator + Symbol *isym; // import version of csym +- unsigned char *comment; // documentation comment for this Dsymbol ++ utf8_t *comment; // documentation comment for this Dsymbol + Loc loc; // where defined + Scope *scope; // !=NULL means context to use for semantic() + bool errors; // this symbol failed to pass semantic() ++ PASS semanticRun; + char *depmsg; // customized deprecation message + Expressions *userAttributes; // user defined attributes from UserAttributeDeclaration +- UnitTestDeclaration *unittest; // !=NULL means there's a unittest associated with this symbol ++ UnitTestDeclaration *ddocUnittest; // !=NULL means there's a ddoc unittest associated with this symbol (only use this with ddoc) + + Dsymbol(); + Dsymbol(Identifier *); + char *toChars(); + Loc& getLoc(); + char *locToChars(); +- int equals(Object *o); +- int isAnonymous(); ++ bool equals(RootObject *o); ++ bool isAnonymous(); + void error(Loc loc, const char *format, ...); + void error(const char *format, ...); + void deprecation(Loc loc, const char *format, ...); +@@ -144,11 +149,13 @@ struct Dsymbol : Object + Dsymbol *toParent2(); + TemplateInstance *inTemplateInstance(); + TemplateInstance *isSpeculative(); ++ Ungag ungagSpeculative(); + + int dyncast() { return DYNCAST_DSYMBOL; } // kludge for template.isSymbol() + + static Dsymbols *arraySyntaxCopy(Dsymbols *a); + ++ virtual Identifier *getIdent(); + virtual const char *toPrettyChars(); + virtual const char *kind(); + virtual Dsymbol *toAlias(); // resolve real symbol +@@ -156,51 +163,49 @@ struct Dsymbol : Object + virtual int addMember(Scope *sc, ScopeDsymbol *s, int memnum); + virtual void setScope(Scope *sc); + virtual void importAll(Scope *sc); +- virtual void semantic0(Scope *sc); + virtual void semantic(Scope *sc); + virtual void semantic2(Scope *sc); + virtual void semantic3(Scope *sc); + virtual void inlineScan(); + virtual Dsymbol *search(Loc loc, Identifier *ident, int flags); + Dsymbol *search_correct(Identifier *id); +- Dsymbol *searchX(Loc loc, Scope *sc, Identifier *id); +- virtual int overloadInsert(Dsymbol *s); +- char *toHChars(); ++ Dsymbol *searchX(Loc loc, Scope *sc, RootObject *id); ++ virtual bool overloadInsert(Dsymbol *s); + virtual void toHBuffer(OutBuffer *buf, HdrGenState *hgs); + virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + virtual void toDocBuffer(OutBuffer *buf, Scope *sc); + virtual void toJson(JsonOut *json); + virtual void jsonProperties(JsonOut *json); + virtual unsigned size(Loc loc); +- virtual int isforwardRef(); ++ virtual bool isforwardRef(); + virtual void defineRef(Dsymbol *s); + virtual AggregateDeclaration *isThis(); // is a 'this' required to access the member + AggregateDeclaration *isAggregateMember(); // are we a member of an aggregate? + AggregateDeclaration *isAggregateMember2(); // are we a member of an aggregate? + ClassDeclaration *isClassMember(); // are we a member of a class? +- virtual int isExport(); // is Dsymbol exported? +- virtual int isImportedSymbol(); // is Dsymbol imported? +- virtual int isDeprecated(); // is Dsymbol deprecated? ++ virtual bool isExport(); // is Dsymbol exported? ++ virtual bool isImportedSymbol(); // is Dsymbol imported? ++ virtual bool isDeprecated(); // is Dsymbol deprecated? + #if DMDV2 +- virtual int isOverloadable(); +- virtual int hasOverloads(); ++ virtual bool isOverloadable(); ++ virtual bool hasOverloads(); + #endif + virtual LabelDsymbol *isLabel(); // is this a LabelDsymbol? + virtual AggregateDeclaration *isMember(); // is this symbol a member of an AggregateDeclaration? + virtual Type *getType(); // is this a type? +- virtual char *mangle(bool isv = false); +- virtual int needThis(); // need a 'this' pointer? +- virtual enum PROT prot(); ++ virtual const char *mangle(bool isv = false); ++ virtual bool needThis(); // need a 'this' pointer? ++ virtual PROT prot(); + virtual Dsymbol *syntaxCopy(Dsymbol *s); // copy only syntax trees +- virtual int oneMember(Dsymbol **ps, Identifier *ident); +- static int oneMembers(Dsymbols *members, Dsymbol **ps, Identifier *ident = NULL); ++ virtual bool oneMember(Dsymbol **ps, Identifier *ident); ++ static bool oneMembers(Dsymbols *members, Dsymbol **ps, Identifier *ident); + virtual void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); +- virtual int hasPointers(); ++ virtual bool hasPointers(); + virtual bool hasStaticCtorOrDtor(); + virtual void addLocalClass(ClassDeclarations *) { } + virtual void checkCtorConstInit() { } + +- virtual void addComment(unsigned char *comment); ++ virtual void addComment(utf8_t *comment); + virtual void emitComment(Scope *sc); + void emitDitto(Scope *sc); + +@@ -224,6 +229,7 @@ struct Dsymbol : Object + virtual TemplateMixin *isTemplateMixin() { return NULL; } + virtual Declaration *isDeclaration() { return NULL; } + virtual ThisDeclaration *isThisDeclaration() { return NULL; } ++ virtual TypeInfoDeclaration *isTypeInfoDeclaration() { return NULL; } + virtual TupleDeclaration *isTupleDeclaration() { return NULL; } + virtual TypedefDeclaration *isTypedefDeclaration() { return NULL; } + virtual AliasDeclaration *isAliasDeclaration() { return NULL; } +@@ -259,8 +265,9 @@ struct Dsymbol : Object + + // Dsymbol that generates a scope + +-struct ScopeDsymbol : Dsymbol ++class ScopeDsymbol : public Dsymbol + { ++public: + Dsymbols *members; // all Dsymbol's in this scope + DsymbolTable *symtab; // members[] sorted into table + +@@ -271,8 +278,8 @@ struct ScopeDsymbol : Dsymbol + ScopeDsymbol(Identifier *id); + Dsymbol *syntaxCopy(Dsymbol *s); + Dsymbol *search(Loc loc, Identifier *ident, int flags); +- void importScope(Dsymbol *s, enum PROT protection); +- int isforwardRef(); ++ void importScope(Dsymbol *s, PROT protection); ++ bool isforwardRef(); + void defineRef(Dsymbol *s); + static void multiplyDefined(Loc loc, Dsymbol *s1, Dsymbol *s2); + Dsymbol *nameCollision(Dsymbol *s); +@@ -294,8 +301,9 @@ struct ScopeDsymbol : Dsymbol + + // With statement scope + +-struct WithScopeSymbol : ScopeDsymbol ++class WithScopeSymbol : public ScopeDsymbol + { ++public: + WithStatement *withstate; + + WithScopeSymbol(WithStatement *withstate); +@@ -306,8 +314,9 @@ struct WithScopeSymbol : ScopeDsymbol + + // Array Index/Slice scope + +-struct ArrayScopeSymbol : ScopeDsymbol ++class ArrayScopeSymbol : public ScopeDsymbol + { ++public: + Expression *exp; // IndexExp or SliceExp + TypeTuple *type; // for tuple[length] + TupleDeclaration *td; // for tuples of objects +@@ -324,11 +333,12 @@ struct ArrayScopeSymbol : ScopeDsymbol + // Overload Sets + + #if DMDV2 +-struct OverloadSet : Dsymbol ++class OverloadSet : public Dsymbol + { ++public: + Dsymbols a; // array of Dsymbols + +- OverloadSet(); ++ OverloadSet(Identifier *ident); + void push(Dsymbol *s); + OverloadSet *isOverloadSet() { return this; } + const char *kind(); +@@ -337,12 +347,12 @@ struct OverloadSet : Dsymbol + + // Table of Dsymbol's + +-struct DsymbolTable : Object ++class DsymbolTable : public RootObject + { ++public: + AA *tab; + + DsymbolTable(); +- ~DsymbolTable(); + + // Look up Identifier. Return Dsymbol if found, NULL if not. + Dsymbol *lookup(Identifier *ident); +--- a/src/gcc/d/dfrontend/entity.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/entity.c 2014-04-01 16:32:51.000000000 +0100 +@@ -11,6 +11,8 @@ + #include + #include + ++#include "port.h" ++ + /********************************************* + * Convert from named entity to its encoding. + * For reference: +@@ -25,2344 +27,2344 @@ struct NameId + }; + + static NameId namesA[]={ +- "Aacgr", 0x00386, // GREEK CAPITAL LETTER ALPHA WITH TONOS +- "aacgr", 0x003AC, // GREEK SMALL LETTER ALPHA WITH TONOS +- "Aacute", 0x000C1, // LATIN CAPITAL LETTER A WITH ACUTE +- "aacute", 0x000E1, // LATIN SMALL LETTER A WITH ACUTE +- "Abreve", 0x00102, // LATIN CAPITAL LETTER A WITH BREVE +- "abreve", 0x00103, // LATIN SMALL LETTER A WITH BREVE +- "ac", 0x0223E, // INVERTED LAZY S +- "acd", 0x0223F, // SINE WAVE +-// "acE", 0x0223E;0x00333, // INVERTED LAZY S with double underline +- "Acirc", 0x000C2, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX +- "acirc", 0x000E2, // LATIN SMALL LETTER A WITH CIRCUMFLEX +- "acute", 0x000B4, // ACUTE ACCENT +- "Acy", 0x00410, // CYRILLIC CAPITAL LETTER A +- "acy", 0x00430, // CYRILLIC SMALL LETTER A +- "AElig", 0x000C6, // LATIN CAPITAL LETTER AE +- "aelig", 0x000E6, // LATIN SMALL LETTER AE +- "af", 0x02061, // FUNCTION APPLICATION +- "Afr", 0x1D504, // MATHEMATICAL FRAKTUR CAPITAL A +- "afr", 0x1D51E, // MATHEMATICAL FRAKTUR SMALL A +- "Agr", 0x00391, // GREEK CAPITAL LETTER ALPHA +- "agr", 0x003B1, // GREEK SMALL LETTER ALPHA +- "Agrave", 0x000C0, // LATIN CAPITAL LETTER A WITH GRAVE +- "agrave", 0x000E0, // LATIN SMALL LETTER A WITH GRAVE +- "alefsym", 0x02135, // ALEF SYMBOL +- "aleph", 0x02135, // ALEF SYMBOL +- "Alpha", 0x00391, // GREEK CAPITAL LETTER ALPHA +- "alpha", 0x003B1, // GREEK SMALL LETTER ALPHA +- "Amacr", 0x00100, // LATIN CAPITAL LETTER A WITH MACRON +- "amacr", 0x00101, // LATIN SMALL LETTER A WITH MACRON +- "amalg", 0x02A3F, // AMALGAMATION OR COPRODUCT +- "amp", 0x00026, // AMPERSAND +- "AMP", 0x00026, // AMPERSAND +- "and", 0x02227, // LOGICAL AND +- "And", 0x02A53, // DOUBLE LOGICAL AND +- "andand", 0x02A55, // TWO INTERSECTING LOGICAL AND +- "andd", 0x02A5C, // LOGICAL AND WITH HORIZONTAL DASH +- "andslope", 0x02A58, // SLOPING LARGE AND +- "andv", 0x02A5A, // LOGICAL AND WITH MIDDLE STEM +- "ang", 0x02220, // ANGLE +- "ange", 0x029A4, // ANGLE WITH UNDERBAR +- "angle", 0x02220, // ANGLE +- "angmsd", 0x02221, // MEASURED ANGLE +- "angmsdaa", 0x029A8, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +- "angmsdab", 0x029A9, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +- "angmsdac", 0x029AA, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +- "angmsdad", 0x029AB, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +- "angmsdae", 0x029AC, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +- "angmsdaf", 0x029AD, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +- "angmsdag", 0x029AE, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +- "angmsdah", 0x029AF, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +- "angrt", 0x0221F, // RIGHT ANGLE +- "angrtvb", 0x022BE, // RIGHT ANGLE WITH ARC +- "angrtvbd", 0x0299D, // MEASURED RIGHT ANGLE WITH DOT +- "angsph", 0x02222, // SPHERICAL ANGLE +- "angst", 0x000C5, // LATIN CAPITAL LETTER A WITH RING ABOVE +- "angzarr", 0x0237C, // RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +- "Aogon", 0x00104, // LATIN CAPITAL LETTER A WITH OGONEK +- "aogon", 0x00105, // LATIN SMALL LETTER A WITH OGONEK +- "Aopf", 0x1D538, // MATHEMATICAL DOUBLE-STRUCK CAPITAL A +- "aopf", 0x1D552, // MATHEMATICAL DOUBLE-STRUCK SMALL A +- "ap", 0x02248, // ALMOST EQUAL TO +- "apacir", 0x02A6F, // ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +- "ape", 0x0224A, // ALMOST EQUAL OR EQUAL TO +- "apE", 0x02A70, // APPROXIMATELY EQUAL OR EQUAL TO +- "apid", 0x0224B, // TRIPLE TILDE +- "apos", 0x00027, // APOSTROPHE +- "ApplyFunction", 0x02061, // FUNCTION APPLICATION +- "approx", 0x02248, // ALMOST EQUAL TO +- "approxeq", 0x0224A, // ALMOST EQUAL OR EQUAL TO +- "Aring", 0x000C5, // LATIN CAPITAL LETTER A WITH RING ABOVE +- "aring", 0x000E5, // LATIN SMALL LETTER A WITH RING ABOVE +- "Ascr", 0x1D49C, // MATHEMATICAL SCRIPT CAPITAL A +- "ascr", 0x1D4B6, // MATHEMATICAL SCRIPT SMALL A +- "Assign", 0x02254, // COLON EQUALS +- "ast", 0x0002A, // ASTERISK +- "asymp", 0x02248, // ALMOST EQUAL TO +- "asympeq", 0x0224D, // EQUIVALENT TO +- "Atilde", 0x000C3, // LATIN CAPITAL LETTER A WITH TILDE +- "atilde", 0x000E3, // LATIN SMALL LETTER A WITH TILDE +- "Auml", 0x000C4, // LATIN CAPITAL LETTER A WITH DIAERESIS +- "auml", 0x000E4, // LATIN SMALL LETTER A WITH DIAERESIS +- "awconint", 0x02233, // ANTICLOCKWISE CONTOUR INTEGRAL +- "awint", 0x02A11, // ANTICLOCKWISE INTEGRATION +- NULL, 0 ++ {"Aacgr", 0x00386}, // GREEK CAPITAL LETTER ALPHA WITH TONOS ++ {"aacgr", 0x003AC}, // GREEK SMALL LETTER ALPHA WITH TONOS ++ {"Aacute", 0x000C1}, // LATIN CAPITAL LETTER A WITH ACUTE ++ {"aacute", 0x000E1}, // LATIN SMALL LETTER A WITH ACUTE ++ {"Abreve", 0x00102}, // LATIN CAPITAL LETTER A WITH BREVE ++ {"abreve", 0x00103}, // LATIN SMALL LETTER A WITH BREVE ++ {"ac", 0x0223E}, // INVERTED LAZY S ++ {"acd", 0x0223F}, // SINE WAVE ++// {"acE", 0x0223E;0x00333}, // INVERTED LAZY S with double underline ++ {"Acirc", 0x000C2}, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX ++ {"acirc", 0x000E2}, // LATIN SMALL LETTER A WITH CIRCUMFLEX ++ {"acute", 0x000B4}, // ACUTE ACCENT ++ {"Acy", 0x00410}, // CYRILLIC CAPITAL LETTER A ++ {"acy", 0x00430}, // CYRILLIC SMALL LETTER A ++ {"AElig", 0x000C6}, // LATIN CAPITAL LETTER AE ++ {"aelig", 0x000E6}, // LATIN SMALL LETTER AE ++ {"af", 0x02061}, // FUNCTION APPLICATION ++ {"Afr", 0x1D504}, // MATHEMATICAL FRAKTUR CAPITAL A ++ {"afr", 0x1D51E}, // MATHEMATICAL FRAKTUR SMALL A ++ {"Agr", 0x00391}, // GREEK CAPITAL LETTER ALPHA ++ {"agr", 0x003B1}, // GREEK SMALL LETTER ALPHA ++ {"Agrave", 0x000C0}, // LATIN CAPITAL LETTER A WITH GRAVE ++ {"agrave", 0x000E0}, // LATIN SMALL LETTER A WITH GRAVE ++ {"alefsym", 0x02135}, // ALEF SYMBOL ++ {"aleph", 0x02135}, // ALEF SYMBOL ++ {"Alpha", 0x00391}, // GREEK CAPITAL LETTER ALPHA ++ {"alpha", 0x003B1}, // GREEK SMALL LETTER ALPHA ++ {"Amacr", 0x00100}, // LATIN CAPITAL LETTER A WITH MACRON ++ {"amacr", 0x00101}, // LATIN SMALL LETTER A WITH MACRON ++ {"amalg", 0x02A3F}, // AMALGAMATION OR COPRODUCT ++ {"amp", 0x00026}, // AMPERSAND ++ {"AMP", 0x00026}, // AMPERSAND ++ {"and", 0x02227}, // LOGICAL AND ++ {"And", 0x02A53}, // DOUBLE LOGICAL AND ++ {"andand", 0x02A55}, // TWO INTERSECTING LOGICAL AND ++ {"andd", 0x02A5C}, // LOGICAL AND WITH HORIZONTAL DASH ++ {"andslope", 0x02A58}, // SLOPING LARGE AND ++ {"andv", 0x02A5A}, // LOGICAL AND WITH MIDDLE STEM ++ {"ang", 0x02220}, // ANGLE ++ {"ange", 0x029A4}, // ANGLE WITH UNDERBAR ++ {"angle", 0x02220}, // ANGLE ++ {"angmsd", 0x02221}, // MEASURED ANGLE ++ {"angmsdaa", 0x029A8}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT ++ {"angmsdab", 0x029A9}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT ++ {"angmsdac", 0x029AA}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT ++ {"angmsdad", 0x029AB}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT ++ {"angmsdae", 0x029AC}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP ++ {"angmsdaf", 0x029AD}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP ++ {"angmsdag", 0x029AE}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN ++ {"angmsdah", 0x029AF}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN ++ {"angrt", 0x0221F}, // RIGHT ANGLE ++ {"angrtvb", 0x022BE}, // RIGHT ANGLE WITH ARC ++ {"angrtvbd", 0x0299D}, // MEASURED RIGHT ANGLE WITH DOT ++ {"angsph", 0x02222}, // SPHERICAL ANGLE ++ {"angst", 0x000C5}, // LATIN CAPITAL LETTER A WITH RING ABOVE ++ {"angzarr", 0x0237C}, // RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW ++ {"Aogon", 0x00104}, // LATIN CAPITAL LETTER A WITH OGONEK ++ {"aogon", 0x00105}, // LATIN SMALL LETTER A WITH OGONEK ++ {"Aopf", 0x1D538}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL A ++ {"aopf", 0x1D552}, // MATHEMATICAL DOUBLE-STRUCK SMALL A ++ {"ap", 0x02248}, // ALMOST EQUAL TO ++ {"apacir", 0x02A6F}, // ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT ++ {"ape", 0x0224A}, // ALMOST EQUAL OR EQUAL TO ++ {"apE", 0x02A70}, // APPROXIMATELY EQUAL OR EQUAL TO ++ {"apid", 0x0224B}, // TRIPLE TILDE ++ {"apos", 0x00027}, // APOSTROPHE ++ {"ApplyFunction", 0x02061}, // FUNCTION APPLICATION ++ {"approx", 0x02248}, // ALMOST EQUAL TO ++ {"approxeq", 0x0224A}, // ALMOST EQUAL OR EQUAL TO ++ {"Aring", 0x000C5}, // LATIN CAPITAL LETTER A WITH RING ABOVE ++ {"aring", 0x000E5}, // LATIN SMALL LETTER A WITH RING ABOVE ++ {"Ascr", 0x1D49C}, // MATHEMATICAL SCRIPT CAPITAL A ++ {"ascr", 0x1D4B6}, // MATHEMATICAL SCRIPT SMALL A ++ {"Assign", 0x02254}, // COLON EQUALS ++ {"ast", 0x0002A}, // ASTERISK ++ {"asymp", 0x02248}, // ALMOST EQUAL TO ++ {"asympeq", 0x0224D}, // EQUIVALENT TO ++ {"Atilde", 0x000C3}, // LATIN CAPITAL LETTER A WITH TILDE ++ {"atilde", 0x000E3}, // LATIN SMALL LETTER A WITH TILDE ++ {"Auml", 0x000C4}, // LATIN CAPITAL LETTER A WITH DIAERESIS ++ {"auml", 0x000E4}, // LATIN SMALL LETTER A WITH DIAERESIS ++ {"awconint", 0x02233}, // ANTICLOCKWISE CONTOUR INTEGRAL ++ {"awint", 0x02A11}, // ANTICLOCKWISE INTEGRATION ++ {NULL, 0} + }; + + static NameId namesB[]={ +- "backcong", 0x0224C, // ALL EQUAL TO +- "backepsilon", 0x003F6, // GREEK REVERSED LUNATE EPSILON SYMBOL +- "backprime", 0x02035, // REVERSED PRIME +- "backsim", 0x0223D, // REVERSED TILDE +- "backsimeq", 0x022CD, // REVERSED TILDE EQUALS +- "Backslash", 0x02216, // SET MINUS +-// "b.alpha", 0x1D6C2, // MATHEMATICAL BOLD SMALL ALPHA +- "Barv", 0x02AE7, // SHORT DOWN TACK WITH OVERBAR +- "barvee", 0x022BD, // NOR +- "barwed", 0x02305, // PROJECTIVE +- "Barwed", 0x02306, // PERSPECTIVE +- "barwedge", 0x02305, // PROJECTIVE +-// "b.beta", 0x1D6C3, // MATHEMATICAL BOLD SMALL BETA +- "bbrk", 0x023B5, // BOTTOM SQUARE BRACKET +- "bbrktbrk", 0x023B6, // BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +-// "b.chi", 0x1D6D8, // MATHEMATICAL BOLD SMALL CHI +- "bcong", 0x0224C, // ALL EQUAL TO +- "Bcy", 0x00411, // CYRILLIC CAPITAL LETTER BE +- "bcy", 0x00431, // CYRILLIC SMALL LETTER BE +-// "b.Delta", 0x1D6AB, // MATHEMATICAL BOLD CAPITAL DELTA +-// "b.delta", 0x1D6C5, // MATHEMATICAL BOLD SMALL DELTA +- "bdquo", 0x0201E, // DOUBLE LOW-9 QUOTATION MARK +- "becaus", 0x02235, // BECAUSE +- "because", 0x02235, // BECAUSE +- "Because", 0x02235, // BECAUSE +- "bemptyv", 0x029B0, // REVERSED EMPTY SET +- "bepsi", 0x003F6, // GREEK REVERSED LUNATE EPSILON SYMBOL +-// "b.epsi", 0x1D6C6, // MATHEMATICAL BOLD SMALL EPSILON +-// "b.epsiv", 0x1D6DC, // MATHEMATICAL BOLD EPSILON SYMBOL +- "bernou", 0x0212C, // SCRIPT CAPITAL B +- "Bernoullis", 0x0212C, // SCRIPT CAPITAL B +- "Beta", 0x00392, // GREEK CAPITAL LETTER BETA +- "beta", 0x003B2, // GREEK SMALL LETTER BETA +-// "b.eta", 0x1D6C8, // MATHEMATICAL BOLD SMALL ETA +- "beth", 0x02136, // BET SYMBOL +- "between", 0x0226C, // BETWEEN +- "Bfr", 0x1D505, // MATHEMATICAL FRAKTUR CAPITAL B +- "bfr", 0x1D51F, // MATHEMATICAL FRAKTUR SMALL B +-// "b.Gamma", 0x1D6AA, // MATHEMATICAL BOLD CAPITAL GAMMA +-// "b.gamma", 0x1D6C4, // MATHEMATICAL BOLD SMALL GAMMA +-// "b.Gammad", 0x1D7CA, // MATHEMATICAL BOLD CAPITAL DIGAMMA +-// "b.gammad", 0x1D7CB, // MATHEMATICAL BOLD SMALL DIGAMMA +- "Bgr", 0x00392, // GREEK CAPITAL LETTER BETA +- "bgr", 0x003B2, // GREEK SMALL LETTER BETA +- "bigcap", 0x022C2, // N-ARY INTERSECTION +- "bigcirc", 0x025EF, // LARGE CIRCLE +- "bigcup", 0x022C3, // N-ARY UNION +- "bigodot", 0x02A00, // N-ARY CIRCLED DOT OPERATOR +- "bigoplus", 0x02A01, // N-ARY CIRCLED PLUS OPERATOR +- "bigotimes", 0x02A02, // N-ARY CIRCLED TIMES OPERATOR +- "bigsqcup", 0x02A06, // N-ARY SQUARE UNION OPERATOR +- "bigstar", 0x02605, // BLACK STAR +- "bigtriangledown", 0x025BD, // WHITE DOWN-POINTING TRIANGLE +- "bigtriangleup", 0x025B3, // WHITE UP-POINTING TRIANGLE +- "biguplus", 0x02A04, // N-ARY UNION OPERATOR WITH PLUS +- "bigvee", 0x022C1, // N-ARY LOGICAL OR +- "bigwedge", 0x022C0, // N-ARY LOGICAL AND +-// "b.iota", 0x1D6CA, // MATHEMATICAL BOLD SMALL IOTA +-// "b.kappa", 0x1D6CB, // MATHEMATICAL BOLD SMALL KAPPA +-// "b.kappav", 0x1D6DE, // MATHEMATICAL BOLD KAPPA SYMBOL +- "bkarow", 0x0290D, // RIGHTWARDS DOUBLE DASH ARROW +- "blacklozenge", 0x029EB, // BLACK LOZENGE +- "blacksquare", 0x025AA, // BLACK SMALL SQUARE +- "blacktriangle", 0x025B4, // BLACK UP-POINTING SMALL TRIANGLE +- "blacktriangledown", 0x025BE, // BLACK DOWN-POINTING SMALL TRIANGLE +- "blacktriangleleft", 0x025C2, // BLACK LEFT-POINTING SMALL TRIANGLE +- "blacktriangleright", 0x025B8, // BLACK RIGHT-POINTING SMALL TRIANGLE +-// "b.Lambda", 0x1D6B2, // MATHEMATICAL BOLD CAPITAL LAMDA +-// "b.lambda", 0x1D6CC, // MATHEMATICAL BOLD SMALL LAMDA +- "blank", 0x02423, // OPEN BOX +- "blk12", 0x02592, // MEDIUM SHADE +- "blk14", 0x02591, // LIGHT SHADE +- "blk34", 0x02593, // DARK SHADE +- "block", 0x02588, // FULL BLOCK +-// "b.mu", 0x1D6CD, // MATHEMATICAL BOLD SMALL MU +-// "bne", 0x0003D;0x020E5, // EQUALS SIGN with reverse slash +-// "bnequiv", 0x02261;0x020E5, // IDENTICAL TO with reverse slash +- "bnot", 0x02310, // REVERSED NOT SIGN +- "bNot", 0x02AED, // REVERSED DOUBLE STROKE NOT SIGN +-// "b.nu", 0x1D6CE, // MATHEMATICAL BOLD SMALL NU +-// "b.Omega", 0x1D6C0, // MATHEMATICAL BOLD CAPITAL OMEGA +-// "b.omega", 0x1D6DA, // MATHEMATICAL BOLD SMALL OMEGA +- "Bopf", 0x1D539, // MATHEMATICAL DOUBLE-STRUCK CAPITAL B +- "bopf", 0x1D553, // MATHEMATICAL DOUBLE-STRUCK SMALL B +- "bot", 0x022A5, // UP TACK +- "bottom", 0x022A5, // UP TACK +- "bowtie", 0x022C8, // BOWTIE +- "boxbox", 0x029C9, // TWO JOINED SQUARES +- "boxdl", 0x02510, // BOX DRAWINGS LIGHT DOWN AND LEFT +- "boxdL", 0x02555, // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +- "boxDl", 0x02556, // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +- "boxDL", 0x02557, // BOX DRAWINGS DOUBLE DOWN AND LEFT +- "boxdr", 0x0250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT +- "boxdR", 0x02552, // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +- "boxDr", 0x02553, // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +- "boxDR", 0x02554, // BOX DRAWINGS DOUBLE DOWN AND RIGHT +- "boxh", 0x02500, // BOX DRAWINGS LIGHT HORIZONTAL +- "boxH", 0x02550, // BOX DRAWINGS DOUBLE HORIZONTAL +- "boxhd", 0x0252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +- "boxHd", 0x02564, // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +- "boxhD", 0x02565, // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +- "boxHD", 0x02566, // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +- "boxhu", 0x02534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL +- "boxHu", 0x02567, // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +- "boxhU", 0x02568, // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +- "boxHU", 0x02569, // BOX DRAWINGS DOUBLE UP AND HORIZONTAL +- "boxminus", 0x0229F, // SQUARED MINUS +- "boxplus", 0x0229E, // SQUARED PLUS +- "boxtimes", 0x022A0, // SQUARED TIMES +- "boxul", 0x02518, // BOX DRAWINGS LIGHT UP AND LEFT +- "boxuL", 0x0255B, // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +- "boxUl", 0x0255C, // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +- "boxUL", 0x0255D, // BOX DRAWINGS DOUBLE UP AND LEFT +- "boxur", 0x02514, // BOX DRAWINGS LIGHT UP AND RIGHT +- "boxuR", 0x02558, // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +- "boxUr", 0x02559, // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +- "boxUR", 0x0255A, // BOX DRAWINGS DOUBLE UP AND RIGHT +- "boxv", 0x02502, // BOX DRAWINGS LIGHT VERTICAL +- "boxV", 0x02551, // BOX DRAWINGS DOUBLE VERTICAL +- "boxvh", 0x0253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +- "boxvH", 0x0256A, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +- "boxVh", 0x0256B, // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +- "boxVH", 0x0256C, // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +- "boxvl", 0x02524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT +- "boxvL", 0x02561, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +- "boxVl", 0x02562, // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +- "boxVL", 0x02563, // BOX DRAWINGS DOUBLE VERTICAL AND LEFT +- "boxvr", 0x0251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT +- "boxvR", 0x0255E, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +- "boxVr", 0x0255F, // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +- "boxVR", 0x02560, // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +-// "b.Phi", 0x1D6BD, // MATHEMATICAL BOLD CAPITAL PHI +-// "b.phi", 0x1D6D7, // MATHEMATICAL BOLD SMALL PHI +-// "b.phiv", 0x1D6DF, // MATHEMATICAL BOLD PHI SYMBOL +-// "b.Pi", 0x1D6B7, // MATHEMATICAL BOLD CAPITAL PI +-// "b.pi", 0x1D6D1, // MATHEMATICAL BOLD SMALL PI +-// "b.piv", 0x1D6E1, // MATHEMATICAL BOLD PI SYMBOL +- "bprime", 0x02035, // REVERSED PRIME +-// "b.Psi", 0x1D6BF, // MATHEMATICAL BOLD CAPITAL PSI +-// "b.psi", 0x1D6D9, // MATHEMATICAL BOLD SMALL PSI +- "breve", 0x002D8, // BREVE +- "Breve", 0x002D8, // BREVE +-// "b.rho", 0x1D6D2, // MATHEMATICAL BOLD SMALL RHO +-// "b.rhov", 0x1D6E0, // MATHEMATICAL BOLD RHO SYMBOL +- "brvbar", 0x000A6, // BROKEN BAR +- "Bscr", 0x0212C, // SCRIPT CAPITAL B +- "bscr", 0x1D4B7, // MATHEMATICAL SCRIPT SMALL B +- "bsemi", 0x0204F, // REVERSED SEMICOLON +-// "b.Sigma", 0x1D6BA, // MATHEMATICAL BOLD CAPITAL SIGMA +-// "b.sigma", 0x1D6D4, // MATHEMATICAL BOLD SMALL SIGMA +-// "b.sigmav", 0x1D6D3, // MATHEMATICAL BOLD SMALL FINAL SIGMA +- "bsim", 0x0223D, // REVERSED TILDE +- "bsime", 0x022CD, // REVERSED TILDE EQUALS +- "bsol", 0x0005C, // REVERSE SOLIDUS +- "bsolb", 0x029C5, // SQUARED FALLING DIAGONAL SLASH +- "bsolhsub", 0x027C8, // REVERSE SOLIDUS PRECEDING SUBSET +-// "b.tau", 0x1D6D5, // MATHEMATICAL BOLD SMALL TAU +-// "b.Theta", 0x1D6AF, // MATHEMATICAL BOLD CAPITAL THETA +-// "b.thetas", 0x1D6C9, // MATHEMATICAL BOLD SMALL THETA +-// "b.thetav", 0x1D6DD, // MATHEMATICAL BOLD THETA SYMBOL +- "bull", 0x02022, // BULLET +- "bullet", 0x02022, // BULLET +- "bump", 0x0224E, // GEOMETRICALLY EQUIVALENT TO +- "bumpe", 0x0224F, // DIFFERENCE BETWEEN +- "bumpE", 0x02AAE, // EQUALS SIGN WITH BUMPY ABOVE +- "Bumpeq", 0x0224E, // GEOMETRICALLY EQUIVALENT TO +- "bumpeq", 0x0224F, // DIFFERENCE BETWEEN +-// "b.Upsi", 0x1D6BC, // MATHEMATICAL BOLD CAPITAL UPSILON +-// "b.upsi", 0x1D6D6, // MATHEMATICAL BOLD SMALL UPSILON +-// "b.Xi", 0x1D6B5, // MATHEMATICAL BOLD CAPITAL XI +-// "b.xi", 0x1D6CF, // MATHEMATICAL BOLD SMALL XI +-// "b.zeta", 0x1D6C7, // MATHEMATICAL BOLD SMALL ZETA +- NULL, 0 ++ {"backcong", 0x0224C}, // ALL EQUAL TO ++ {"backepsilon", 0x003F6}, // GREEK REVERSED LUNATE EPSILON SYMBOL ++ {"backprime", 0x02035}, // REVERSED PRIME ++ {"backsim", 0x0223D}, // REVERSED TILDE ++ {"backsimeq", 0x022CD}, // REVERSED TILDE EQUALS ++ {"Backslash", 0x02216}, // SET MINUS ++// "b.alpha", 0x1D6C2}, // MATHEMATICAL BOLD SMALL ALPHA ++ {"Barv", 0x02AE7}, // SHORT DOWN TACK WITH OVERBAR ++ {"barvee", 0x022BD}, // NOR ++ {"barwed", 0x02305}, // PROJECTIVE ++ {"Barwed", 0x02306}, // PERSPECTIVE ++ {"barwedge", 0x02305}, // PROJECTIVE ++// "b.beta", 0x1D6C3}, // MATHEMATICAL BOLD SMALL BETA ++ {"bbrk", 0x023B5}, // BOTTOM SQUARE BRACKET ++ {"bbrktbrk", 0x023B6}, // BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET ++// "b.chi", 0x1D6D8}, // MATHEMATICAL BOLD SMALL CHI ++ {"bcong", 0x0224C}, // ALL EQUAL TO ++ {"Bcy", 0x00411}, // CYRILLIC CAPITAL LETTER BE ++ {"bcy", 0x00431}, // CYRILLIC SMALL LETTER BE ++// "b.Delta", 0x1D6AB}, // MATHEMATICAL BOLD CAPITAL DELTA ++// "b.delta", 0x1D6C5}, // MATHEMATICAL BOLD SMALL DELTA ++ {"bdquo", 0x0201E}, // DOUBLE LOW-9 QUOTATION MARK ++ {"becaus", 0x02235}, // BECAUSE ++ {"because", 0x02235}, // BECAUSE ++ {"Because", 0x02235}, // BECAUSE ++ {"bemptyv", 0x029B0}, // REVERSED EMPTY SET ++ {"bepsi", 0x003F6}, // GREEK REVERSED LUNATE EPSILON SYMBOL ++// "b.epsi", 0x1D6C6}, // MATHEMATICAL BOLD SMALL EPSILON ++// "b.epsiv", 0x1D6DC}, // MATHEMATICAL BOLD EPSILON SYMBOL ++ {"bernou", 0x0212C}, // SCRIPT CAPITAL B ++ {"Bernoullis", 0x0212C}, // SCRIPT CAPITAL B ++ {"Beta", 0x00392}, // GREEK CAPITAL LETTER BETA ++ {"beta", 0x003B2}, // GREEK SMALL LETTER BETA ++// "b.eta", 0x1D6C8}, // MATHEMATICAL BOLD SMALL ETA ++ {"beth", 0x02136}, // BET SYMBOL ++ {"between", 0x0226C}, // BETWEEN ++ {"Bfr", 0x1D505}, // MATHEMATICAL FRAKTUR CAPITAL B ++ {"bfr", 0x1D51F}, // MATHEMATICAL FRAKTUR SMALL B ++// "b.Gamma", 0x1D6AA}, // MATHEMATICAL BOLD CAPITAL GAMMA ++// "b.gamma", 0x1D6C4}, // MATHEMATICAL BOLD SMALL GAMMA ++// "b.Gammad", 0x1D7CA}, // MATHEMATICAL BOLD CAPITAL DIGAMMA ++// "b.gammad", 0x1D7CB}, // MATHEMATICAL BOLD SMALL DIGAMMA ++ {"Bgr", 0x00392}, // GREEK CAPITAL LETTER BETA ++ {"bgr", 0x003B2}, // GREEK SMALL LETTER BETA ++ {"bigcap", 0x022C2}, // N-ARY INTERSECTION ++ {"bigcirc", 0x025EF}, // LARGE CIRCLE ++ {"bigcup", 0x022C3}, // N-ARY UNION ++ {"bigodot", 0x02A00}, // N-ARY CIRCLED DOT OPERATOR ++ {"bigoplus", 0x02A01}, // N-ARY CIRCLED PLUS OPERATOR ++ {"bigotimes", 0x02A02}, // N-ARY CIRCLED TIMES OPERATOR ++ {"bigsqcup", 0x02A06}, // N-ARY SQUARE UNION OPERATOR ++ {"bigstar", 0x02605}, // BLACK STAR ++ {"bigtriangledown", 0x025BD}, // WHITE DOWN-POINTING TRIANGLE ++ {"bigtriangleup", 0x025B3}, // WHITE UP-POINTING TRIANGLE ++ {"biguplus", 0x02A04}, // N-ARY UNION OPERATOR WITH PLUS ++ {"bigvee", 0x022C1}, // N-ARY LOGICAL OR ++ {"bigwedge", 0x022C0}, // N-ARY LOGICAL AND ++// "b.iota", 0x1D6CA}, // MATHEMATICAL BOLD SMALL IOTA ++// "b.kappa", 0x1D6CB}, // MATHEMATICAL BOLD SMALL KAPPA ++// "b.kappav", 0x1D6DE}, // MATHEMATICAL BOLD KAPPA SYMBOL ++ {"bkarow", 0x0290D}, // RIGHTWARDS DOUBLE DASH ARROW ++ {"blacklozenge", 0x029EB}, // BLACK LOZENGE ++ {"blacksquare", 0x025AA}, // BLACK SMALL SQUARE ++ {"blacktriangle", 0x025B4}, // BLACK UP-POINTING SMALL TRIANGLE ++ {"blacktriangledown", 0x025BE}, // BLACK DOWN-POINTING SMALL TRIANGLE ++ {"blacktriangleleft", 0x025C2}, // BLACK LEFT-POINTING SMALL TRIANGLE ++ {"blacktriangleright", 0x025B8}, // BLACK RIGHT-POINTING SMALL TRIANGLE ++// "b.Lambda", 0x1D6B2}, // MATHEMATICAL BOLD CAPITAL LAMDA ++// "b.lambda", 0x1D6CC}, // MATHEMATICAL BOLD SMALL LAMDA ++ {"blank", 0x02423}, // OPEN BOX ++ {"blk12", 0x02592}, // MEDIUM SHADE ++ {"blk14", 0x02591}, // LIGHT SHADE ++ {"blk34", 0x02593}, // DARK SHADE ++ {"block", 0x02588}, // FULL BLOCK ++// "b.mu", 0x1D6CD}, // MATHEMATICAL BOLD SMALL MU ++// "bne", 0x0003D;0x020E5}, // EQUALS SIGN with reverse slash ++// "bnequiv", 0x02261;0x020E5}, // IDENTICAL TO with reverse slash ++ {"bnot", 0x02310}, // REVERSED NOT SIGN ++ {"bNot", 0x02AED}, // REVERSED DOUBLE STROKE NOT SIGN ++// "b.nu", 0x1D6CE}, // MATHEMATICAL BOLD SMALL NU ++// "b.Omega", 0x1D6C0}, // MATHEMATICAL BOLD CAPITAL OMEGA ++// "b.omega", 0x1D6DA}, // MATHEMATICAL BOLD SMALL OMEGA ++ {"Bopf", 0x1D539}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL B ++ {"bopf", 0x1D553}, // MATHEMATICAL DOUBLE-STRUCK SMALL B ++ {"bot", 0x022A5}, // UP TACK ++ {"bottom", 0x022A5}, // UP TACK ++ {"bowtie", 0x022C8}, // BOWTIE ++ {"boxbox", 0x029C9}, // TWO JOINED SQUARES ++ {"boxdl", 0x02510}, // BOX DRAWINGS LIGHT DOWN AND LEFT ++ {"boxdL", 0x02555}, // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE ++ {"boxDl", 0x02556}, // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE ++ {"boxDL", 0x02557}, // BOX DRAWINGS DOUBLE DOWN AND LEFT ++ {"boxdr", 0x0250C}, // BOX DRAWINGS LIGHT DOWN AND RIGHT ++ {"boxdR", 0x02552}, // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE ++ {"boxDr", 0x02553}, // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE ++ {"boxDR", 0x02554}, // BOX DRAWINGS DOUBLE DOWN AND RIGHT ++ {"boxh", 0x02500}, // BOX DRAWINGS LIGHT HORIZONTAL ++ {"boxH", 0x02550}, // BOX DRAWINGS DOUBLE HORIZONTAL ++ {"boxhd", 0x0252C}, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL ++ {"boxHd", 0x02564}, // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE ++ {"boxhD", 0x02565}, // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE ++ {"boxHD", 0x02566}, // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL ++ {"boxhu", 0x02534}, // BOX DRAWINGS LIGHT UP AND HORIZONTAL ++ {"boxHu", 0x02567}, // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE ++ {"boxhU", 0x02568}, // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE ++ {"boxHU", 0x02569}, // BOX DRAWINGS DOUBLE UP AND HORIZONTAL ++ {"boxminus", 0x0229F}, // SQUARED MINUS ++ {"boxplus", 0x0229E}, // SQUARED PLUS ++ {"boxtimes", 0x022A0}, // SQUARED TIMES ++ {"boxul", 0x02518}, // BOX DRAWINGS LIGHT UP AND LEFT ++ {"boxuL", 0x0255B}, // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE ++ {"boxUl", 0x0255C}, // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE ++ {"boxUL", 0x0255D}, // BOX DRAWINGS DOUBLE UP AND LEFT ++ {"boxur", 0x02514}, // BOX DRAWINGS LIGHT UP AND RIGHT ++ {"boxuR", 0x02558}, // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE ++ {"boxUr", 0x02559}, // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE ++ {"boxUR", 0x0255A}, // BOX DRAWINGS DOUBLE UP AND RIGHT ++ {"boxv", 0x02502}, // BOX DRAWINGS LIGHT VERTICAL ++ {"boxV", 0x02551}, // BOX DRAWINGS DOUBLE VERTICAL ++ {"boxvh", 0x0253C}, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL ++ {"boxvH", 0x0256A}, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE ++ {"boxVh", 0x0256B}, // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE ++ {"boxVH", 0x0256C}, // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL ++ {"boxvl", 0x02524}, // BOX DRAWINGS LIGHT VERTICAL AND LEFT ++ {"boxvL", 0x02561}, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE ++ {"boxVl", 0x02562}, // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE ++ {"boxVL", 0x02563}, // BOX DRAWINGS DOUBLE VERTICAL AND LEFT ++ {"boxvr", 0x0251C}, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT ++ {"boxvR", 0x0255E}, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE ++ {"boxVr", 0x0255F}, // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE ++ {"boxVR", 0x02560}, // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT ++// "b.Phi", 0x1D6BD}, // MATHEMATICAL BOLD CAPITAL PHI ++// "b.phi", 0x1D6D7}, // MATHEMATICAL BOLD SMALL PHI ++// "b.phiv", 0x1D6DF}, // MATHEMATICAL BOLD PHI SYMBOL ++// "b.Pi", 0x1D6B7}, // MATHEMATICAL BOLD CAPITAL PI ++// "b.pi", 0x1D6D1}, // MATHEMATICAL BOLD SMALL PI ++// "b.piv", 0x1D6E1}, // MATHEMATICAL BOLD PI SYMBOL ++ {"bprime", 0x02035}, // REVERSED PRIME ++// "b.Psi", 0x1D6BF}, // MATHEMATICAL BOLD CAPITAL PSI ++// "b.psi", 0x1D6D9}, // MATHEMATICAL BOLD SMALL PSI ++ {"breve", 0x002D8}, // BREVE ++ {"Breve", 0x002D8}, // BREVE ++// "b.rho", 0x1D6D2}, // MATHEMATICAL BOLD SMALL RHO ++// "b.rhov", 0x1D6E0}, // MATHEMATICAL BOLD RHO SYMBOL ++ {"brvbar", 0x000A6}, // BROKEN BAR ++ {"Bscr", 0x0212C}, // SCRIPT CAPITAL B ++ {"bscr", 0x1D4B7}, // MATHEMATICAL SCRIPT SMALL B ++ {"bsemi", 0x0204F}, // REVERSED SEMICOLON ++// "b.Sigma", 0x1D6BA}, // MATHEMATICAL BOLD CAPITAL SIGMA ++// "b.sigma", 0x1D6D4}, // MATHEMATICAL BOLD SMALL SIGMA ++// "b.sigmav", 0x1D6D3}, // MATHEMATICAL BOLD SMALL FINAL SIGMA ++ {"bsim", 0x0223D}, // REVERSED TILDE ++ {"bsime", 0x022CD}, // REVERSED TILDE EQUALS ++ {"bsol", 0x0005C}, // REVERSE SOLIDUS ++ {"bsolb", 0x029C5}, // SQUARED FALLING DIAGONAL SLASH ++ {"bsolhsub", 0x027C8}, // REVERSE SOLIDUS PRECEDING SUBSET ++// "b.tau", 0x1D6D5}, // MATHEMATICAL BOLD SMALL TAU ++// "b.Theta", 0x1D6AF}, // MATHEMATICAL BOLD CAPITAL THETA ++// "b.thetas", 0x1D6C9}, // MATHEMATICAL BOLD SMALL THETA ++// "b.thetav", 0x1D6DD}, // MATHEMATICAL BOLD THETA SYMBOL ++ {"bull", 0x02022}, // BULLET ++ {"bullet", 0x02022}, // BULLET ++ {"bump", 0x0224E}, // GEOMETRICALLY EQUIVALENT TO ++ {"bumpe", 0x0224F}, // DIFFERENCE BETWEEN ++ {"bumpE", 0x02AAE}, // EQUALS SIGN WITH BUMPY ABOVE ++ {"Bumpeq", 0x0224E}, // GEOMETRICALLY EQUIVALENT TO ++ {"bumpeq", 0x0224F}, // DIFFERENCE BETWEEN ++// "b.Upsi", 0x1D6BC}, // MATHEMATICAL BOLD CAPITAL UPSILON ++// "b.upsi", 0x1D6D6}, // MATHEMATICAL BOLD SMALL UPSILON ++// "b.Xi", 0x1D6B5}, // MATHEMATICAL BOLD CAPITAL XI ++// "b.xi", 0x1D6CF}, // MATHEMATICAL BOLD SMALL XI ++// "b.zeta", 0x1D6C7}, // MATHEMATICAL BOLD SMALL ZETA ++ {NULL, 0} + }; + + static NameId namesC[]={ +- "Cacute", 0x00106, // LATIN CAPITAL LETTER C WITH ACUTE +- "cacute", 0x00107, // LATIN SMALL LETTER C WITH ACUTE +- "cap", 0x02229, // INTERSECTION +- "Cap", 0x022D2, // DOUBLE INTERSECTION +- "capand", 0x02A44, // INTERSECTION WITH LOGICAL AND +- "capbrcup", 0x02A49, // INTERSECTION ABOVE BAR ABOVE UNION +- "capcap", 0x02A4B, // INTERSECTION BESIDE AND JOINED WITH INTERSECTION +- "capcup", 0x02A47, // INTERSECTION ABOVE UNION +- "capdot", 0x02A40, // INTERSECTION WITH DOT +- "CapitalDifferentialD", 0x02145, // DOUBLE-STRUCK ITALIC CAPITAL D +-// "caps", 0x02229;0x0FE00, // INTERSECTION with serifs +- "caret", 0x02041, // CARET INSERTION POINT +- "caron", 0x002C7, // CARON +- "Cayleys", 0x0212D, // BLACK-LETTER CAPITAL C +- "ccaps", 0x02A4D, // CLOSED INTERSECTION WITH SERIFS +- "Ccaron", 0x0010C, // LATIN CAPITAL LETTER C WITH CARON +- "ccaron", 0x0010D, // LATIN SMALL LETTER C WITH CARON +- "Ccedil", 0x000C7, // LATIN CAPITAL LETTER C WITH CEDILLA +- "ccedil", 0x000E7, // LATIN SMALL LETTER C WITH CEDILLA +- "Ccirc", 0x00108, // LATIN CAPITAL LETTER C WITH CIRCUMFLEX +- "ccirc", 0x00109, // LATIN SMALL LETTER C WITH CIRCUMFLEX +- "Cconint", 0x02230, // VOLUME INTEGRAL +- "ccups", 0x02A4C, // CLOSED UNION WITH SERIFS +- "ccupssm", 0x02A50, // CLOSED UNION WITH SERIFS AND SMASH PRODUCT +- "Cdot", 0x0010A, // LATIN CAPITAL LETTER C WITH DOT ABOVE +- "cdot", 0x0010B, // LATIN SMALL LETTER C WITH DOT ABOVE +- "cedil", 0x000B8, // CEDILLA +- "Cedilla", 0x000B8, // CEDILLA +- "cemptyv", 0x029B2, // EMPTY SET WITH SMALL CIRCLE ABOVE +- "cent", 0x000A2, // CENT SIGN +- "centerdot", 0x000B7, // MIDDLE DOT +- "CenterDot", 0x000B7, // MIDDLE DOT +- "Cfr", 0x0212D, // BLACK-LETTER CAPITAL C +- "cfr", 0x1D520, // MATHEMATICAL FRAKTUR SMALL C +- "CHcy", 0x00427, // CYRILLIC CAPITAL LETTER CHE +- "chcy", 0x00447, // CYRILLIC SMALL LETTER CHE +- "check", 0x02713, // CHECK MARK +- "checkmark", 0x02713, // CHECK MARK +- "Chi", 0x003A7, // GREEK CAPITAL LETTER CHI +- "chi", 0x003C7, // GREEK SMALL LETTER CHI +- "cir", 0x025CB, // WHITE CIRCLE +- "circ", 0x002C6, // MODIFIER LETTER CIRCUMFLEX ACCENT +- "circeq", 0x02257, // RING EQUAL TO +- "circlearrowleft", 0x021BA, // ANTICLOCKWISE OPEN CIRCLE ARROW +- "circlearrowright", 0x021BB, // CLOCKWISE OPEN CIRCLE ARROW +- "circledast", 0x0229B, // CIRCLED ASTERISK OPERATOR +- "circledcirc", 0x0229A, // CIRCLED RING OPERATOR +- "circleddash", 0x0229D, // CIRCLED DASH +- "CircleDot", 0x02299, // CIRCLED DOT OPERATOR +- "circledR", 0x000AE, // REGISTERED SIGN +- "circledS", 0x024C8, // CIRCLED LATIN CAPITAL LETTER S +- "CircleMinus", 0x02296, // CIRCLED MINUS +- "CirclePlus", 0x02295, // CIRCLED PLUS +- "CircleTimes", 0x02297, // CIRCLED TIMES +- "cire", 0x02257, // RING EQUAL TO +- "cirE", 0x029C3, // CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +- "cirfnint", 0x02A10, // CIRCULATION FUNCTION +- "cirmid", 0x02AEF, // VERTICAL LINE WITH CIRCLE ABOVE +- "cirscir", 0x029C2, // CIRCLE WITH SMALL CIRCLE TO THE RIGHT +- "ClockwiseContourIntegral", 0x02232, // CLOCKWISE CONTOUR INTEGRAL +- "CloseCurlyDoubleQuote", 0x0201D, // RIGHT DOUBLE QUOTATION MARK +- "CloseCurlyQuote", 0x02019, // RIGHT SINGLE QUOTATION MARK +- "clubs", 0x02663, // BLACK CLUB SUIT +- "clubsuit", 0x02663, // BLACK CLUB SUIT +- "colon", 0x0003A, // COLON +- "Colon", 0x02237, // PROPORTION +- "colone", 0x02254, // COLON EQUALS +- "Colone", 0x02A74, // DOUBLE COLON EQUAL +- "coloneq", 0x02254, // COLON EQUALS +- "comma", 0x0002C, // COMMA +- "commat", 0x00040, // COMMERCIAL AT +- "comp", 0x02201, // COMPLEMENT +- "compfn", 0x02218, // RING OPERATOR +- "complement", 0x02201, // COMPLEMENT +- "complexes", 0x02102, // DOUBLE-STRUCK CAPITAL C +- "cong", 0x02245, // APPROXIMATELY EQUAL TO +- "congdot", 0x02A6D, // CONGRUENT WITH DOT ABOVE +- "Congruent", 0x02261, // IDENTICAL TO +- "conint", 0x0222E, // CONTOUR INTEGRAL +- "Conint", 0x0222F, // SURFACE INTEGRAL +- "ContourIntegral", 0x0222E, // CONTOUR INTEGRAL +- "Copf", 0x02102, // DOUBLE-STRUCK CAPITAL C +- "copf", 0x1D554, // MATHEMATICAL DOUBLE-STRUCK SMALL C +- "coprod", 0x02210, // N-ARY COPRODUCT +- "Coproduct", 0x02210, // N-ARY COPRODUCT +- "copy", 0x000A9, // COPYRIGHT SIGN +- "COPY", 0x000A9, // COPYRIGHT SIGN +- "copysr", 0x02117, // SOUND RECORDING COPYRIGHT +- "CounterClockwiseContourIntegral", 0x02233, // ANTICLOCKWISE CONTOUR INTEGRAL +- "crarr", 0x021B5, // DOWNWARDS ARROW WITH CORNER LEFTWARDS +- "cross", 0x02717, // BALLOT X +- "Cross", 0x02A2F, // VECTOR OR CROSS PRODUCT +- "Cscr", 0x1D49E, // MATHEMATICAL SCRIPT CAPITAL C +- "cscr", 0x1D4B8, // MATHEMATICAL SCRIPT SMALL C +- "csub", 0x02ACF, // CLOSED SUBSET +- "csube", 0x02AD1, // CLOSED SUBSET OR EQUAL TO +- "csup", 0x02AD0, // CLOSED SUPERSET +- "csupe", 0x02AD2, // CLOSED SUPERSET OR EQUAL TO +- "ctdot", 0x022EF, // MIDLINE HORIZONTAL ELLIPSIS +- "cudarrl", 0x02938, // RIGHT-SIDE ARC CLOCKWISE ARROW +- "cudarrr", 0x02935, // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +- "cuepr", 0x022DE, // EQUAL TO OR PRECEDES +- "cuesc", 0x022DF, // EQUAL TO OR SUCCEEDS +- "cularr", 0x021B6, // ANTICLOCKWISE TOP SEMICIRCLE ARROW +- "cularrp", 0x0293D, // TOP ARC ANTICLOCKWISE ARROW WITH PLUS +- "cup", 0x0222A, // UNION +- "Cup", 0x022D3, // DOUBLE UNION +- "cupbrcap", 0x02A48, // UNION ABOVE BAR ABOVE INTERSECTION +- "CupCap", 0x0224D, // EQUIVALENT TO +- "cupcap", 0x02A46, // UNION ABOVE INTERSECTION +- "cupcup", 0x02A4A, // UNION BESIDE AND JOINED WITH UNION +- "cupdot", 0x0228D, // MULTISET MULTIPLICATION +- "cupor", 0x02A45, // UNION WITH LOGICAL OR +-// "cups", 0x0222A;0x0FE00, // UNION with serifs +- "curarr", 0x021B7, // CLOCKWISE TOP SEMICIRCLE ARROW +- "curarrm", 0x0293C, // TOP ARC CLOCKWISE ARROW WITH MINUS +- "curlyeqprec", 0x022DE, // EQUAL TO OR PRECEDES +- "curlyeqsucc", 0x022DF, // EQUAL TO OR SUCCEEDS +- "curlyvee", 0x022CE, // CURLY LOGICAL OR +- "curlywedge", 0x022CF, // CURLY LOGICAL AND +- "curren", 0x000A4, // CURRENCY SIGN +- "curvearrowleft", 0x021B6, // ANTICLOCKWISE TOP SEMICIRCLE ARROW +- "curvearrowright", 0x021B7, // CLOCKWISE TOP SEMICIRCLE ARROW +- "cuvee", 0x022CE, // CURLY LOGICAL OR +- "cuwed", 0x022CF, // CURLY LOGICAL AND +- "cwconint", 0x02232, // CLOCKWISE CONTOUR INTEGRAL +- "cwint", 0x02231, // CLOCKWISE INTEGRAL +- "cylcty", 0x0232D, // CYLINDRICITY +- NULL, 0 ++ {"Cacute", 0x00106}, // LATIN CAPITAL LETTER C WITH ACUTE ++ {"cacute", 0x00107}, // LATIN SMALL LETTER C WITH ACUTE ++ {"cap", 0x02229}, // INTERSECTION ++ {"Cap", 0x022D2}, // DOUBLE INTERSECTION ++ {"capand", 0x02A44}, // INTERSECTION WITH LOGICAL AND ++ {"capbrcup", 0x02A49}, // INTERSECTION ABOVE BAR ABOVE UNION ++ {"capcap", 0x02A4B}, // INTERSECTION BESIDE AND JOINED WITH INTERSECTION ++ {"capcup", 0x02A47}, // INTERSECTION ABOVE UNION ++ {"capdot", 0x02A40}, // INTERSECTION WITH DOT ++ {"CapitalDifferentialD", 0x02145}, // DOUBLE-STRUCK ITALIC CAPITAL D ++// "caps", 0x02229;0x0FE00}, // INTERSECTION with serifs ++ {"caret", 0x02041}, // CARET INSERTION POINT ++ {"caron", 0x002C7}, // CARON ++ {"Cayleys", 0x0212D}, // BLACK-LETTER CAPITAL C ++ {"ccaps", 0x02A4D}, // CLOSED INTERSECTION WITH SERIFS ++ {"Ccaron", 0x0010C}, // LATIN CAPITAL LETTER C WITH CARON ++ {"ccaron", 0x0010D}, // LATIN SMALL LETTER C WITH CARON ++ {"Ccedil", 0x000C7}, // LATIN CAPITAL LETTER C WITH CEDILLA ++ {"ccedil", 0x000E7}, // LATIN SMALL LETTER C WITH CEDILLA ++ {"Ccirc", 0x00108}, // LATIN CAPITAL LETTER C WITH CIRCUMFLEX ++ {"ccirc", 0x00109}, // LATIN SMALL LETTER C WITH CIRCUMFLEX ++ {"Cconint", 0x02230}, // VOLUME INTEGRAL ++ {"ccups", 0x02A4C}, // CLOSED UNION WITH SERIFS ++ {"ccupssm", 0x02A50}, // CLOSED UNION WITH SERIFS AND SMASH PRODUCT ++ {"Cdot", 0x0010A}, // LATIN CAPITAL LETTER C WITH DOT ABOVE ++ {"cdot", 0x0010B}, // LATIN SMALL LETTER C WITH DOT ABOVE ++ {"cedil", 0x000B8}, // CEDILLA ++ {"Cedilla", 0x000B8}, // CEDILLA ++ {"cemptyv", 0x029B2}, // EMPTY SET WITH SMALL CIRCLE ABOVE ++ {"cent", 0x000A2}, // CENT SIGN ++ {"centerdot", 0x000B7}, // MIDDLE DOT ++ {"CenterDot", 0x000B7}, // MIDDLE DOT ++ {"Cfr", 0x0212D}, // BLACK-LETTER CAPITAL C ++ {"cfr", 0x1D520}, // MATHEMATICAL FRAKTUR SMALL C ++ {"CHcy", 0x00427}, // CYRILLIC CAPITAL LETTER CHE ++ {"chcy", 0x00447}, // CYRILLIC SMALL LETTER CHE ++ {"check", 0x02713}, // CHECK MARK ++ {"checkmark", 0x02713}, // CHECK MARK ++ {"Chi", 0x003A7}, // GREEK CAPITAL LETTER CHI ++ {"chi", 0x003C7}, // GREEK SMALL LETTER CHI ++ {"cir", 0x025CB}, // WHITE CIRCLE ++ {"circ", 0x002C6}, // MODIFIER LETTER CIRCUMFLEX ACCENT ++ {"circeq", 0x02257}, // RING EQUAL TO ++ {"circlearrowleft", 0x021BA}, // ANTICLOCKWISE OPEN CIRCLE ARROW ++ {"circlearrowright", 0x021BB}, // CLOCKWISE OPEN CIRCLE ARROW ++ {"circledast", 0x0229B}, // CIRCLED ASTERISK OPERATOR ++ {"circledcirc", 0x0229A}, // CIRCLED RING OPERATOR ++ {"circleddash", 0x0229D}, // CIRCLED DASH ++ {"CircleDot", 0x02299}, // CIRCLED DOT OPERATOR ++ {"circledR", 0x000AE}, // REGISTERED SIGN ++ {"circledS", 0x024C8}, // CIRCLED LATIN CAPITAL LETTER S ++ {"CircleMinus", 0x02296}, // CIRCLED MINUS ++ {"CirclePlus", 0x02295}, // CIRCLED PLUS ++ {"CircleTimes", 0x02297}, // CIRCLED TIMES ++ {"cire", 0x02257}, // RING EQUAL TO ++ {"cirE", 0x029C3}, // CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT ++ {"cirfnint", 0x02A10}, // CIRCULATION FUNCTION ++ {"cirmid", 0x02AEF}, // VERTICAL LINE WITH CIRCLE ABOVE ++ {"cirscir", 0x029C2}, // CIRCLE WITH SMALL CIRCLE TO THE RIGHT ++ {"ClockwiseContourIntegral", 0x02232}, // CLOCKWISE CONTOUR INTEGRAL ++ {"CloseCurlyDoubleQuote", 0x0201D}, // RIGHT DOUBLE QUOTATION MARK ++ {"CloseCurlyQuote", 0x02019}, // RIGHT SINGLE QUOTATION MARK ++ {"clubs", 0x02663}, // BLACK CLUB SUIT ++ {"clubsuit", 0x02663}, // BLACK CLUB SUIT ++ {"colon", 0x0003A}, // COLON ++ {"Colon", 0x02237}, // PROPORTION ++ {"colone", 0x02254}, // COLON EQUALS ++ {"Colone", 0x02A74}, // DOUBLE COLON EQUAL ++ {"coloneq", 0x02254}, // COLON EQUALS ++ {"comma", 0x0002C}, // COMMA ++ {"commat", 0x00040}, // COMMERCIAL AT ++ {"comp", 0x02201}, // COMPLEMENT ++ {"compfn", 0x02218}, // RING OPERATOR ++ {"complement", 0x02201}, // COMPLEMENT ++ {"complexes", 0x02102}, // DOUBLE-STRUCK CAPITAL C ++ {"cong", 0x02245}, // APPROXIMATELY EQUAL TO ++ {"congdot", 0x02A6D}, // CONGRUENT WITH DOT ABOVE ++ {"Congruent", 0x02261}, // IDENTICAL TO ++ {"conint", 0x0222E}, // CONTOUR INTEGRAL ++ {"Conint", 0x0222F}, // SURFACE INTEGRAL ++ {"ContourIntegral", 0x0222E}, // CONTOUR INTEGRAL ++ {"Copf", 0x02102}, // DOUBLE-STRUCK CAPITAL C ++ {"copf", 0x1D554}, // MATHEMATICAL DOUBLE-STRUCK SMALL C ++ {"coprod", 0x02210}, // N-ARY COPRODUCT ++ {"Coproduct", 0x02210}, // N-ARY COPRODUCT ++ {"copy", 0x000A9}, // COPYRIGHT SIGN ++ {"COPY", 0x000A9}, // COPYRIGHT SIGN ++ {"copysr", 0x02117}, // SOUND RECORDING COPYRIGHT ++ {"CounterClockwiseContourIntegral", 0x02233}, // ANTICLOCKWISE CONTOUR INTEGRAL ++ {"crarr", 0x021B5}, // DOWNWARDS ARROW WITH CORNER LEFTWARDS ++ {"cross", 0x02717}, // BALLOT X ++ {"Cross", 0x02A2F}, // VECTOR OR CROSS PRODUCT ++ {"Cscr", 0x1D49E}, // MATHEMATICAL SCRIPT CAPITAL C ++ {"cscr", 0x1D4B8}, // MATHEMATICAL SCRIPT SMALL C ++ {"csub", 0x02ACF}, // CLOSED SUBSET ++ {"csube", 0x02AD1}, // CLOSED SUBSET OR EQUAL TO ++ {"csup", 0x02AD0}, // CLOSED SUPERSET ++ {"csupe", 0x02AD2}, // CLOSED SUPERSET OR EQUAL TO ++ {"ctdot", 0x022EF}, // MIDLINE HORIZONTAL ELLIPSIS ++ {"cudarrl", 0x02938}, // RIGHT-SIDE ARC CLOCKWISE ARROW ++ {"cudarrr", 0x02935}, // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS ++ {"cuepr", 0x022DE}, // EQUAL TO OR PRECEDES ++ {"cuesc", 0x022DF}, // EQUAL TO OR SUCCEEDS ++ {"cularr", 0x021B6}, // ANTICLOCKWISE TOP SEMICIRCLE ARROW ++ {"cularrp", 0x0293D}, // TOP ARC ANTICLOCKWISE ARROW WITH PLUS ++ {"cup", 0x0222A}, // UNION ++ {"Cup", 0x022D3}, // DOUBLE UNION ++ {"cupbrcap", 0x02A48}, // UNION ABOVE BAR ABOVE INTERSECTION ++ {"CupCap", 0x0224D}, // EQUIVALENT TO ++ {"cupcap", 0x02A46}, // UNION ABOVE INTERSECTION ++ {"cupcup", 0x02A4A}, // UNION BESIDE AND JOINED WITH UNION ++ {"cupdot", 0x0228D}, // MULTISET MULTIPLICATION ++ {"cupor", 0x02A45}, // UNION WITH LOGICAL OR ++// "cups", 0x0222A;0x0FE00}, // UNION with serifs ++ {"curarr", 0x021B7}, // CLOCKWISE TOP SEMICIRCLE ARROW ++ {"curarrm", 0x0293C}, // TOP ARC CLOCKWISE ARROW WITH MINUS ++ {"curlyeqprec", 0x022DE}, // EQUAL TO OR PRECEDES ++ {"curlyeqsucc", 0x022DF}, // EQUAL TO OR SUCCEEDS ++ {"curlyvee", 0x022CE}, // CURLY LOGICAL OR ++ {"curlywedge", 0x022CF}, // CURLY LOGICAL AND ++ {"curren", 0x000A4}, // CURRENCY SIGN ++ {"curvearrowleft", 0x021B6}, // ANTICLOCKWISE TOP SEMICIRCLE ARROW ++ {"curvearrowright", 0x021B7}, // CLOCKWISE TOP SEMICIRCLE ARROW ++ {"cuvee", 0x022CE}, // CURLY LOGICAL OR ++ {"cuwed", 0x022CF}, // CURLY LOGICAL AND ++ {"cwconint", 0x02232}, // CLOCKWISE CONTOUR INTEGRAL ++ {"cwint", 0x02231}, // CLOCKWISE INTEGRAL ++ {"cylcty", 0x0232D}, // CYLINDRICITY ++ {NULL, 0} + }; + + static NameId namesD[]={ +- "dagger", 0x02020, // DAGGER +- "Dagger", 0x02021, // DOUBLE DAGGER +- "daleth", 0x02138, // DALET SYMBOL +- "darr", 0x02193, // DOWNWARDS ARROW +- "Darr", 0x021A1, // DOWNWARDS TWO HEADED ARROW +- "dArr", 0x021D3, // DOWNWARDS DOUBLE ARROW +- "dash", 0x02010, // HYPHEN +- "dashv", 0x022A3, // LEFT TACK +- "Dashv", 0x02AE4, // VERTICAL BAR DOUBLE LEFT TURNSTILE +- "dbkarow", 0x0290F, // RIGHTWARDS TRIPLE DASH ARROW +- "dblac", 0x002DD, // DOUBLE ACUTE ACCENT +- "Dcaron", 0x0010E, // LATIN CAPITAL LETTER D WITH CARON +- "dcaron", 0x0010F, // LATIN SMALL LETTER D WITH CARON +- "Dcy", 0x00414, // CYRILLIC CAPITAL LETTER DE +- "dcy", 0x00434, // CYRILLIC SMALL LETTER DE +- "DD", 0x02145, // DOUBLE-STRUCK ITALIC CAPITAL D +- "dd", 0x02146, // DOUBLE-STRUCK ITALIC SMALL D +- "ddagger", 0x02021, // DOUBLE DAGGER +- "ddarr", 0x021CA, // DOWNWARDS PAIRED ARROWS +- "DDotrahd", 0x02911, // RIGHTWARDS ARROW WITH DOTTED STEM +- "ddotseq", 0x02A77, // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +- "deg", 0x000B0, // DEGREE SIGN +- "Del", 0x02207, // NABLA +- "Delta", 0x00394, // GREEK CAPITAL LETTER DELTA +- "delta", 0x003B4, // GREEK SMALL LETTER DELTA +- "demptyv", 0x029B1, // EMPTY SET WITH OVERBAR +- "dfisht", 0x0297F, // DOWN FISH TAIL +- "Dfr", 0x1D507, // MATHEMATICAL FRAKTUR CAPITAL D +- "dfr", 0x1D521, // MATHEMATICAL FRAKTUR SMALL D +- "Dgr", 0x00394, // GREEK CAPITAL LETTER DELTA +- "dgr", 0x003B4, // GREEK SMALL LETTER DELTA +- "dHar", 0x02965, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +- "dharl", 0x021C3, // DOWNWARDS HARPOON WITH BARB LEFTWARDS +- "dharr", 0x021C2, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS +- "DiacriticalAcute", 0x000B4, // ACUTE ACCENT +- "DiacriticalDot", 0x002D9, // DOT ABOVE +- "DiacriticalDoubleAcute", 0x002DD, // DOUBLE ACUTE ACCENT +- "DiacriticalGrave", 0x00060, // GRAVE ACCENT +- "DiacriticalTilde", 0x002DC, // SMALL TILDE +- "diam", 0x022C4, // DIAMOND OPERATOR +- "diamond", 0x022C4, // DIAMOND OPERATOR +- "Diamond", 0x022C4, // DIAMOND OPERATOR +- "diamondsuit", 0x02666, // BLACK DIAMOND SUIT +- "diams", 0x02666, // BLACK DIAMOND SUIT +- "die", 0x000A8, // DIAERESIS +- "DifferentialD", 0x02146, // DOUBLE-STRUCK ITALIC SMALL D +- "digamma", 0x003DD, // GREEK SMALL LETTER DIGAMMA +- "disin", 0x022F2, // ELEMENT OF WITH LONG HORIZONTAL STROKE +- "div", 0x000F7, // DIVISION SIGN +- "divide", 0x000F7, // DIVISION SIGN +- "divideontimes", 0x022C7, // DIVISION TIMES +- "divonx", 0x022C7, // DIVISION TIMES +- "DJcy", 0x00402, // CYRILLIC CAPITAL LETTER DJE +- "djcy", 0x00452, // CYRILLIC SMALL LETTER DJE +- "dlcorn", 0x0231E, // BOTTOM LEFT CORNER +- "dlcrop", 0x0230D, // BOTTOM LEFT CROP +- "dollar", 0x00024, // DOLLAR SIGN +- "Dopf", 0x1D53B, // MATHEMATICAL DOUBLE-STRUCK CAPITAL D +- "dopf", 0x1D555, // MATHEMATICAL DOUBLE-STRUCK SMALL D +- "Dot", 0x000A8, // DIAERESIS +- "dot", 0x002D9, // DOT ABOVE +- "DotDot", 0x020DC, // COMBINING FOUR DOTS ABOVE +- "doteq", 0x02250, // APPROACHES THE LIMIT +- "doteqdot", 0x02251, // GEOMETRICALLY EQUAL TO +- "DotEqual", 0x02250, // APPROACHES THE LIMIT +- "dotminus", 0x02238, // DOT MINUS +- "dotplus", 0x02214, // DOT PLUS +- "dotsquare", 0x022A1, // SQUARED DOT OPERATOR +- "doublebarwedge", 0x02306, // PERSPECTIVE +- "DoubleContourIntegral", 0x0222F, // SURFACE INTEGRAL +- "DoubleDot", 0x000A8, // DIAERESIS +- "DoubleDownArrow", 0x021D3, // DOWNWARDS DOUBLE ARROW +- "DoubleLeftArrow", 0x021D0, // LEFTWARDS DOUBLE ARROW +- "DoubleLeftRightArrow", 0x021D4, // LEFT RIGHT DOUBLE ARROW +- "DoubleLeftTee", 0x02AE4, // VERTICAL BAR DOUBLE LEFT TURNSTILE +- "DoubleLongLeftArrow", 0x027F8, // LONG LEFTWARDS DOUBLE ARROW +- "DoubleLongLeftRightArrow", 0x027FA, // LONG LEFT RIGHT DOUBLE ARROW +- "DoubleLongRightArrow", 0x027F9, // LONG RIGHTWARDS DOUBLE ARROW +- "DoubleRightArrow", 0x021D2, // RIGHTWARDS DOUBLE ARROW +- "DoubleRightTee", 0x022A8, // TRUE +- "DoubleUpArrow", 0x021D1, // UPWARDS DOUBLE ARROW +- "DoubleUpDownArrow", 0x021D5, // UP DOWN DOUBLE ARROW +- "DoubleVerticalBar", 0x02225, // PARALLEL TO +- "downarrow", 0x02193, // DOWNWARDS ARROW +- "DownArrow", 0x02193, // DOWNWARDS ARROW +- "Downarrow", 0x021D3, // DOWNWARDS DOUBLE ARROW +- "DownArrowBar", 0x02913, // DOWNWARDS ARROW TO BAR +- "DownArrowUpArrow", 0x021F5, // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +- "DownBreve", 0x00311, // COMBINING INVERTED BREVE +- "downdownarrows", 0x021CA, // DOWNWARDS PAIRED ARROWS +- "downharpoonleft", 0x021C3, // DOWNWARDS HARPOON WITH BARB LEFTWARDS +- "downharpoonright", 0x021C2, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS +- "DownLeftRightVector", 0x02950, // LEFT BARB DOWN RIGHT BARB DOWN HARPOON +- "DownLeftTeeVector", 0x0295E, // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +- "DownLeftVector", 0x021BD, // LEFTWARDS HARPOON WITH BARB DOWNWARDS +- "DownLeftVectorBar", 0x02956, // LEFTWARDS HARPOON WITH BARB DOWN TO BAR +- "DownRightTeeVector", 0x0295F, // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +- "DownRightVector", 0x021C1, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS +- "DownRightVectorBar", 0x02957, // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +- "DownTee", 0x022A4, // DOWN TACK +- "DownTeeArrow", 0x021A7, // DOWNWARDS ARROW FROM BAR +- "drbkarow", 0x02910, // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +- "drcorn", 0x0231F, // BOTTOM RIGHT CORNER +- "drcrop", 0x0230C, // BOTTOM RIGHT CROP +- "Dscr", 0x1D49F, // MATHEMATICAL SCRIPT CAPITAL D +- "dscr", 0x1D4B9, // MATHEMATICAL SCRIPT SMALL D +- "DScy", 0x00405, // CYRILLIC CAPITAL LETTER DZE +- "dscy", 0x00455, // CYRILLIC SMALL LETTER DZE +- "dsol", 0x029F6, // SOLIDUS WITH OVERBAR +- "Dstrok", 0x00110, // LATIN CAPITAL LETTER D WITH STROKE +- "dstrok", 0x00111, // LATIN SMALL LETTER D WITH STROKE +- "dtdot", 0x022F1, // DOWN RIGHT DIAGONAL ELLIPSIS +- "dtri", 0x025BF, // WHITE DOWN-POINTING SMALL TRIANGLE +- "dtrif", 0x025BE, // BLACK DOWN-POINTING SMALL TRIANGLE +- "duarr", 0x021F5, // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +- "duhar", 0x0296F, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +- "dwangle", 0x029A6, // OBLIQUE ANGLE OPENING UP +- "DZcy", 0x0040F, // CYRILLIC CAPITAL LETTER DZHE +- "dzcy", 0x0045F, // CYRILLIC SMALL LETTER DZHE +- "dzigrarr", 0x027FF, // LONG RIGHTWARDS SQUIGGLE ARROW +- NULL, 0 ++ {"dagger", 0x02020}, // DAGGER ++ {"Dagger", 0x02021}, // DOUBLE DAGGER ++ {"daleth", 0x02138}, // DALET SYMBOL ++ {"darr", 0x02193}, // DOWNWARDS ARROW ++ {"Darr", 0x021A1}, // DOWNWARDS TWO HEADED ARROW ++ {"dArr", 0x021D3}, // DOWNWARDS DOUBLE ARROW ++ {"dash", 0x02010}, // HYPHEN ++ {"dashv", 0x022A3}, // LEFT TACK ++ {"Dashv", 0x02AE4}, // VERTICAL BAR DOUBLE LEFT TURNSTILE ++ {"dbkarow", 0x0290F}, // RIGHTWARDS TRIPLE DASH ARROW ++ {"dblac", 0x002DD}, // DOUBLE ACUTE ACCENT ++ {"Dcaron", 0x0010E}, // LATIN CAPITAL LETTER D WITH CARON ++ {"dcaron", 0x0010F}, // LATIN SMALL LETTER D WITH CARON ++ {"Dcy", 0x00414}, // CYRILLIC CAPITAL LETTER DE ++ {"dcy", 0x00434}, // CYRILLIC SMALL LETTER DE ++ {"DD", 0x02145}, // DOUBLE-STRUCK ITALIC CAPITAL D ++ {"dd", 0x02146}, // DOUBLE-STRUCK ITALIC SMALL D ++ {"ddagger", 0x02021}, // DOUBLE DAGGER ++ {"ddarr", 0x021CA}, // DOWNWARDS PAIRED ARROWS ++ {"DDotrahd", 0x02911}, // RIGHTWARDS ARROW WITH DOTTED STEM ++ {"ddotseq", 0x02A77}, // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW ++ {"deg", 0x000B0}, // DEGREE SIGN ++ {"Del", 0x02207}, // NABLA ++ {"Delta", 0x00394}, // GREEK CAPITAL LETTER DELTA ++ {"delta", 0x003B4}, // GREEK SMALL LETTER DELTA ++ {"demptyv", 0x029B1}, // EMPTY SET WITH OVERBAR ++ {"dfisht", 0x0297F}, // DOWN FISH TAIL ++ {"Dfr", 0x1D507}, // MATHEMATICAL FRAKTUR CAPITAL D ++ {"dfr", 0x1D521}, // MATHEMATICAL FRAKTUR SMALL D ++ {"Dgr", 0x00394}, // GREEK CAPITAL LETTER DELTA ++ {"dgr", 0x003B4}, // GREEK SMALL LETTER DELTA ++ {"dHar", 0x02965}, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT ++ {"dharl", 0x021C3}, // DOWNWARDS HARPOON WITH BARB LEFTWARDS ++ {"dharr", 0x021C2}, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS ++ {"DiacriticalAcute", 0x000B4}, // ACUTE ACCENT ++ {"DiacriticalDot", 0x002D9}, // DOT ABOVE ++ {"DiacriticalDoubleAcute", 0x002DD}, // DOUBLE ACUTE ACCENT ++ {"DiacriticalGrave", 0x00060}, // GRAVE ACCENT ++ {"DiacriticalTilde", 0x002DC}, // SMALL TILDE ++ {"diam", 0x022C4}, // DIAMOND OPERATOR ++ {"diamond", 0x022C4}, // DIAMOND OPERATOR ++ {"Diamond", 0x022C4}, // DIAMOND OPERATOR ++ {"diamondsuit", 0x02666}, // BLACK DIAMOND SUIT ++ {"diams", 0x02666}, // BLACK DIAMOND SUIT ++ {"die", 0x000A8}, // DIAERESIS ++ {"DifferentialD", 0x02146}, // DOUBLE-STRUCK ITALIC SMALL D ++ {"digamma", 0x003DD}, // GREEK SMALL LETTER DIGAMMA ++ {"disin", 0x022F2}, // ELEMENT OF WITH LONG HORIZONTAL STROKE ++ {"div", 0x000F7}, // DIVISION SIGN ++ {"divide", 0x000F7}, // DIVISION SIGN ++ {"divideontimes", 0x022C7}, // DIVISION TIMES ++ {"divonx", 0x022C7}, // DIVISION TIMES ++ {"DJcy", 0x00402}, // CYRILLIC CAPITAL LETTER DJE ++ {"djcy", 0x00452}, // CYRILLIC SMALL LETTER DJE ++ {"dlcorn", 0x0231E}, // BOTTOM LEFT CORNER ++ {"dlcrop", 0x0230D}, // BOTTOM LEFT CROP ++ {"dollar", 0x00024}, // DOLLAR SIGN ++ {"Dopf", 0x1D53B}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL D ++ {"dopf", 0x1D555}, // MATHEMATICAL DOUBLE-STRUCK SMALL D ++ {"Dot", 0x000A8}, // DIAERESIS ++ {"dot", 0x002D9}, // DOT ABOVE ++ {"DotDot", 0x020DC}, // COMBINING FOUR DOTS ABOVE ++ {"doteq", 0x02250}, // APPROACHES THE LIMIT ++ {"doteqdot", 0x02251}, // GEOMETRICALLY EQUAL TO ++ {"DotEqual", 0x02250}, // APPROACHES THE LIMIT ++ {"dotminus", 0x02238}, // DOT MINUS ++ {"dotplus", 0x02214}, // DOT PLUS ++ {"dotsquare", 0x022A1}, // SQUARED DOT OPERATOR ++ {"doublebarwedge", 0x02306}, // PERSPECTIVE ++ {"DoubleContourIntegral", 0x0222F}, // SURFACE INTEGRAL ++ {"DoubleDot", 0x000A8}, // DIAERESIS ++ {"DoubleDownArrow", 0x021D3}, // DOWNWARDS DOUBLE ARROW ++ {"DoubleLeftArrow", 0x021D0}, // LEFTWARDS DOUBLE ARROW ++ {"DoubleLeftRightArrow", 0x021D4}, // LEFT RIGHT DOUBLE ARROW ++ {"DoubleLeftTee", 0x02AE4}, // VERTICAL BAR DOUBLE LEFT TURNSTILE ++ {"DoubleLongLeftArrow", 0x027F8}, // LONG LEFTWARDS DOUBLE ARROW ++ {"DoubleLongLeftRightArrow", 0x027FA}, // LONG LEFT RIGHT DOUBLE ARROW ++ {"DoubleLongRightArrow", 0x027F9}, // LONG RIGHTWARDS DOUBLE ARROW ++ {"DoubleRightArrow", 0x021D2}, // RIGHTWARDS DOUBLE ARROW ++ {"DoubleRightTee", 0x022A8}, // TRUE ++ {"DoubleUpArrow", 0x021D1}, // UPWARDS DOUBLE ARROW ++ {"DoubleUpDownArrow", 0x021D5}, // UP DOWN DOUBLE ARROW ++ {"DoubleVerticalBar", 0x02225}, // PARALLEL TO ++ {"downarrow", 0x02193}, // DOWNWARDS ARROW ++ {"DownArrow", 0x02193}, // DOWNWARDS ARROW ++ {"Downarrow", 0x021D3}, // DOWNWARDS DOUBLE ARROW ++ {"DownArrowBar", 0x02913}, // DOWNWARDS ARROW TO BAR ++ {"DownArrowUpArrow", 0x021F5}, // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW ++ {"DownBreve", 0x00311}, // COMBINING INVERTED BREVE ++ {"downdownarrows", 0x021CA}, // DOWNWARDS PAIRED ARROWS ++ {"downharpoonleft", 0x021C3}, // DOWNWARDS HARPOON WITH BARB LEFTWARDS ++ {"downharpoonright", 0x021C2}, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS ++ {"DownLeftRightVector", 0x02950}, // LEFT BARB DOWN RIGHT BARB DOWN HARPOON ++ {"DownLeftTeeVector", 0x0295E}, // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR ++ {"DownLeftVector", 0x021BD}, // LEFTWARDS HARPOON WITH BARB DOWNWARDS ++ {"DownLeftVectorBar", 0x02956}, // LEFTWARDS HARPOON WITH BARB DOWN TO BAR ++ {"DownRightTeeVector", 0x0295F}, // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR ++ {"DownRightVector", 0x021C1}, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS ++ {"DownRightVectorBar", 0x02957}, // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR ++ {"DownTee", 0x022A4}, // DOWN TACK ++ {"DownTeeArrow", 0x021A7}, // DOWNWARDS ARROW FROM BAR ++ {"drbkarow", 0x02910}, // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW ++ {"drcorn", 0x0231F}, // BOTTOM RIGHT CORNER ++ {"drcrop", 0x0230C}, // BOTTOM RIGHT CROP ++ {"Dscr", 0x1D49F}, // MATHEMATICAL SCRIPT CAPITAL D ++ {"dscr", 0x1D4B9}, // MATHEMATICAL SCRIPT SMALL D ++ {"DScy", 0x00405}, // CYRILLIC CAPITAL LETTER DZE ++ {"dscy", 0x00455}, // CYRILLIC SMALL LETTER DZE ++ {"dsol", 0x029F6}, // SOLIDUS WITH OVERBAR ++ {"Dstrok", 0x00110}, // LATIN CAPITAL LETTER D WITH STROKE ++ {"dstrok", 0x00111}, // LATIN SMALL LETTER D WITH STROKE ++ {"dtdot", 0x022F1}, // DOWN RIGHT DIAGONAL ELLIPSIS ++ {"dtri", 0x025BF}, // WHITE DOWN-POINTING SMALL TRIANGLE ++ {"dtrif", 0x025BE}, // BLACK DOWN-POINTING SMALL TRIANGLE ++ {"duarr", 0x021F5}, // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW ++ {"duhar", 0x0296F}, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT ++ {"dwangle", 0x029A6}, // OBLIQUE ANGLE OPENING UP ++ {"DZcy", 0x0040F}, // CYRILLIC CAPITAL LETTER DZHE ++ {"dzcy", 0x0045F}, // CYRILLIC SMALL LETTER DZHE ++ {"dzigrarr", 0x027FF}, // LONG RIGHTWARDS SQUIGGLE ARROW ++ {NULL, 0} + }; + + static NameId namesE[]={ +- "Eacgr", 0x00388, // GREEK CAPITAL LETTER EPSILON WITH TONOS +- "eacgr", 0x003AD, // GREEK SMALL LETTER EPSILON WITH TONOS +- "Eacute", 0x000C9, // LATIN CAPITAL LETTER E WITH ACUTE +- "eacute", 0x000E9, // LATIN SMALL LETTER E WITH ACUTE +- "easter", 0x02A6E, // EQUALS WITH ASTERISK +- "Ecaron", 0x0011A, // LATIN CAPITAL LETTER E WITH CARON +- "ecaron", 0x0011B, // LATIN SMALL LETTER E WITH CARON +- "ecir", 0x02256, // RING IN EQUAL TO +- "Ecirc", 0x000CA, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX +- "ecirc", 0x000EA, // LATIN SMALL LETTER E WITH CIRCUMFLEX +- "ecolon", 0x02255, // EQUALS COLON +- "Ecy", 0x0042D, // CYRILLIC CAPITAL LETTER E +- "ecy", 0x0044D, // CYRILLIC SMALL LETTER E +- "eDDot", 0x02A77, // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +- "Edot", 0x00116, // LATIN CAPITAL LETTER E WITH DOT ABOVE +- "edot", 0x00117, // LATIN SMALL LETTER E WITH DOT ABOVE +- "eDot", 0x02251, // GEOMETRICALLY EQUAL TO +- "ee", 0x02147, // DOUBLE-STRUCK ITALIC SMALL E +- "EEacgr", 0x00389, // GREEK CAPITAL LETTER ETA WITH TONOS +- "eeacgr", 0x003AE, // GREEK SMALL LETTER ETA WITH TONOS +- "EEgr", 0x00397, // GREEK CAPITAL LETTER ETA +- "eegr", 0x003B7, // GREEK SMALL LETTER ETA +- "efDot", 0x02252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF +- "Efr", 0x1D508, // MATHEMATICAL FRAKTUR CAPITAL E +- "efr", 0x1D522, // MATHEMATICAL FRAKTUR SMALL E +- "eg", 0x02A9A, // DOUBLE-LINE EQUAL TO OR GREATER-THAN +- "Egr", 0x00395, // GREEK CAPITAL LETTER EPSILON +- "egr", 0x003B5, // GREEK SMALL LETTER EPSILON +- "Egrave", 0x000C8, // LATIN CAPITAL LETTER E WITH GRAVE +- "egrave", 0x000E8, // LATIN SMALL LETTER E WITH GRAVE +- "egs", 0x02A96, // SLANTED EQUAL TO OR GREATER-THAN +- "egsdot", 0x02A98, // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +- "el", 0x02A99, // DOUBLE-LINE EQUAL TO OR LESS-THAN +- "Element", 0x02208, // ELEMENT OF +- "elinters", 0x023E7, // ELECTRICAL INTERSECTION +- "ell", 0x02113, // SCRIPT SMALL L +- "els", 0x02A95, // SLANTED EQUAL TO OR LESS-THAN +- "elsdot", 0x02A97, // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +- "Emacr", 0x00112, // LATIN CAPITAL LETTER E WITH MACRON +- "emacr", 0x00113, // LATIN SMALL LETTER E WITH MACRON +- "empty", 0x02205, // EMPTY SET +- "emptyset", 0x02205, // EMPTY SET +- "EmptySmallSquare", 0x025FB, // WHITE MEDIUM SQUARE +- "emptyv", 0x02205, // EMPTY SET +- "EmptyVerySmallSquare", 0x025AB, // WHITE SMALL SQUARE +- "emsp", 0x02003, // EM SPACE +- "emsp13", 0x02004, // THREE-PER-EM SPACE +- "emsp14", 0x02005, // FOUR-PER-EM SPACE +- "ENG", 0x0014A, // LATIN CAPITAL LETTER ENG +- "eng", 0x0014B, // LATIN SMALL LETTER ENG +- "ensp", 0x02002, // EN SPACE +- "Eogon", 0x00118, // LATIN CAPITAL LETTER E WITH OGONEK +- "eogon", 0x00119, // LATIN SMALL LETTER E WITH OGONEK +- "Eopf", 0x1D53C, // MATHEMATICAL DOUBLE-STRUCK CAPITAL E +- "eopf", 0x1D556, // MATHEMATICAL DOUBLE-STRUCK SMALL E +- "epar", 0x022D5, // EQUAL AND PARALLEL TO +- "eparsl", 0x029E3, // EQUALS SIGN AND SLANTED PARALLEL +- "eplus", 0x02A71, // EQUALS SIGN ABOVE PLUS SIGN +- "epsi", 0x003B5, // GREEK SMALL LETTER EPSILON +- "Epsilon", 0x00395, // GREEK CAPITAL LETTER EPSILON +- "epsilon", 0x003B5, // GREEK SMALL LETTER EPSILON +- "epsiv", 0x003F5, // GREEK LUNATE EPSILON SYMBOL +- "eqcirc", 0x02256, // RING IN EQUAL TO +- "eqcolon", 0x02255, // EQUALS COLON +- "eqsim", 0x02242, // MINUS TILDE +- "eqslantgtr", 0x02A96, // SLANTED EQUAL TO OR GREATER-THAN +- "eqslantless", 0x02A95, // SLANTED EQUAL TO OR LESS-THAN +- "Equal", 0x02A75, // TWO CONSECUTIVE EQUALS SIGNS +- "equals", 0x0003D, // EQUALS SIGN +- "EqualTilde", 0x02242, // MINUS TILDE +- "equest", 0x0225F, // QUESTIONED EQUAL TO +- "Equilibrium", 0x021CC, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +- "equiv", 0x02261, // IDENTICAL TO +- "equivDD", 0x02A78, // EQUIVALENT WITH FOUR DOTS ABOVE +- "eqvparsl", 0x029E5, // IDENTICAL TO AND SLANTED PARALLEL +- "erarr", 0x02971, // EQUALS SIGN ABOVE RIGHTWARDS ARROW +- "erDot", 0x02253, // IMAGE OF OR APPROXIMATELY EQUAL TO +- "escr", 0x0212F, // SCRIPT SMALL E +- "Escr", 0x02130, // SCRIPT CAPITAL E +- "esdot", 0x02250, // APPROACHES THE LIMIT +- "esim", 0x02242, // MINUS TILDE +- "Esim", 0x02A73, // EQUALS SIGN ABOVE TILDE OPERATOR +- "Eta", 0x00397, // GREEK CAPITAL LETTER ETA +- "eta", 0x003B7, // GREEK SMALL LETTER ETA +- "ETH", 0x000D0, // LATIN CAPITAL LETTER ETH +- "eth", 0x000F0, // LATIN SMALL LETTER ETH +- "Euml", 0x000CB, // LATIN CAPITAL LETTER E WITH DIAERESIS +- "euml", 0x000EB, // LATIN SMALL LETTER E WITH DIAERESIS +- "euro", 0x020AC, // EURO SIGN +- "excl", 0x00021, // EXCLAMATION MARK +- "exist", 0x02203, // THERE EXISTS +- "Exists", 0x02203, // THERE EXISTS +- "expectation", 0x02130, // SCRIPT CAPITAL E +- "exponentiale", 0x02147, // DOUBLE-STRUCK ITALIC SMALL E +- "ExponentialE", 0x02147, // DOUBLE-STRUCK ITALIC SMALL E +- NULL, 0 ++ {"Eacgr", 0x00388}, // GREEK CAPITAL LETTER EPSILON WITH TONOS ++ {"eacgr", 0x003AD}, // GREEK SMALL LETTER EPSILON WITH TONOS ++ {"Eacute", 0x000C9}, // LATIN CAPITAL LETTER E WITH ACUTE ++ {"eacute", 0x000E9}, // LATIN SMALL LETTER E WITH ACUTE ++ {"easter", 0x02A6E}, // EQUALS WITH ASTERISK ++ {"Ecaron", 0x0011A}, // LATIN CAPITAL LETTER E WITH CARON ++ {"ecaron", 0x0011B}, // LATIN SMALL LETTER E WITH CARON ++ {"ecir", 0x02256}, // RING IN EQUAL TO ++ {"Ecirc", 0x000CA}, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX ++ {"ecirc", 0x000EA}, // LATIN SMALL LETTER E WITH CIRCUMFLEX ++ {"ecolon", 0x02255}, // EQUALS COLON ++ {"Ecy", 0x0042D}, // CYRILLIC CAPITAL LETTER E ++ {"ecy", 0x0044D}, // CYRILLIC SMALL LETTER E ++ {"eDDot", 0x02A77}, // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW ++ {"Edot", 0x00116}, // LATIN CAPITAL LETTER E WITH DOT ABOVE ++ {"edot", 0x00117}, // LATIN SMALL LETTER E WITH DOT ABOVE ++ {"eDot", 0x02251}, // GEOMETRICALLY EQUAL TO ++ {"ee", 0x02147}, // DOUBLE-STRUCK ITALIC SMALL E ++ {"EEacgr", 0x00389}, // GREEK CAPITAL LETTER ETA WITH TONOS ++ {"eeacgr", 0x003AE}, // GREEK SMALL LETTER ETA WITH TONOS ++ {"EEgr", 0x00397}, // GREEK CAPITAL LETTER ETA ++ {"eegr", 0x003B7}, // GREEK SMALL LETTER ETA ++ {"efDot", 0x02252}, // APPROXIMATELY EQUAL TO OR THE IMAGE OF ++ {"Efr", 0x1D508}, // MATHEMATICAL FRAKTUR CAPITAL E ++ {"efr", 0x1D522}, // MATHEMATICAL FRAKTUR SMALL E ++ {"eg", 0x02A9A}, // DOUBLE-LINE EQUAL TO OR GREATER-THAN ++ {"Egr", 0x00395}, // GREEK CAPITAL LETTER EPSILON ++ {"egr", 0x003B5}, // GREEK SMALL LETTER EPSILON ++ {"Egrave", 0x000C8}, // LATIN CAPITAL LETTER E WITH GRAVE ++ {"egrave", 0x000E8}, // LATIN SMALL LETTER E WITH GRAVE ++ {"egs", 0x02A96}, // SLANTED EQUAL TO OR GREATER-THAN ++ {"egsdot", 0x02A98}, // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE ++ {"el", 0x02A99}, // DOUBLE-LINE EQUAL TO OR LESS-THAN ++ {"Element", 0x02208}, // ELEMENT OF ++ {"elinters", 0x023E7}, // ELECTRICAL INTERSECTION ++ {"ell", 0x02113}, // SCRIPT SMALL L ++ {"els", 0x02A95}, // SLANTED EQUAL TO OR LESS-THAN ++ {"elsdot", 0x02A97}, // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE ++ {"Emacr", 0x00112}, // LATIN CAPITAL LETTER E WITH MACRON ++ {"emacr", 0x00113}, // LATIN SMALL LETTER E WITH MACRON ++ {"empty", 0x02205}, // EMPTY SET ++ {"emptyset", 0x02205}, // EMPTY SET ++ {"EmptySmallSquare", 0x025FB}, // WHITE MEDIUM SQUARE ++ {"emptyv", 0x02205}, // EMPTY SET ++ {"EmptyVerySmallSquare", 0x025AB}, // WHITE SMALL SQUARE ++ {"emsp", 0x02003}, // EM SPACE ++ {"emsp13", 0x02004}, // THREE-PER-EM SPACE ++ {"emsp14", 0x02005}, // FOUR-PER-EM SPACE ++ {"ENG", 0x0014A}, // LATIN CAPITAL LETTER ENG ++ {"eng", 0x0014B}, // LATIN SMALL LETTER ENG ++ {"ensp", 0x02002}, // EN SPACE ++ {"Eogon", 0x00118}, // LATIN CAPITAL LETTER E WITH OGONEK ++ {"eogon", 0x00119}, // LATIN SMALL LETTER E WITH OGONEK ++ {"Eopf", 0x1D53C}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL E ++ {"eopf", 0x1D556}, // MATHEMATICAL DOUBLE-STRUCK SMALL E ++ {"epar", 0x022D5}, // EQUAL AND PARALLEL TO ++ {"eparsl", 0x029E3}, // EQUALS SIGN AND SLANTED PARALLEL ++ {"eplus", 0x02A71}, // EQUALS SIGN ABOVE PLUS SIGN ++ {"epsi", 0x003B5}, // GREEK SMALL LETTER EPSILON ++ {"Epsilon", 0x00395}, // GREEK CAPITAL LETTER EPSILON ++ {"epsilon", 0x003B5}, // GREEK SMALL LETTER EPSILON ++ {"epsiv", 0x003F5}, // GREEK LUNATE EPSILON SYMBOL ++ {"eqcirc", 0x02256}, // RING IN EQUAL TO ++ {"eqcolon", 0x02255}, // EQUALS COLON ++ {"eqsim", 0x02242}, // MINUS TILDE ++ {"eqslantgtr", 0x02A96}, // SLANTED EQUAL TO OR GREATER-THAN ++ {"eqslantless", 0x02A95}, // SLANTED EQUAL TO OR LESS-THAN ++ {"Equal", 0x02A75}, // TWO CONSECUTIVE EQUALS SIGNS ++ {"equals", 0x0003D}, // EQUALS SIGN ++ {"EqualTilde", 0x02242}, // MINUS TILDE ++ {"equest", 0x0225F}, // QUESTIONED EQUAL TO ++ {"Equilibrium", 0x021CC}, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON ++ {"equiv", 0x02261}, // IDENTICAL TO ++ {"equivDD", 0x02A78}, // EQUIVALENT WITH FOUR DOTS ABOVE ++ {"eqvparsl", 0x029E5}, // IDENTICAL TO AND SLANTED PARALLEL ++ {"erarr", 0x02971}, // EQUALS SIGN ABOVE RIGHTWARDS ARROW ++ {"erDot", 0x02253}, // IMAGE OF OR APPROXIMATELY EQUAL TO ++ {"escr", 0x0212F}, // SCRIPT SMALL E ++ {"Escr", 0x02130}, // SCRIPT CAPITAL E ++ {"esdot", 0x02250}, // APPROACHES THE LIMIT ++ {"esim", 0x02242}, // MINUS TILDE ++ {"Esim", 0x02A73}, // EQUALS SIGN ABOVE TILDE OPERATOR ++ {"Eta", 0x00397}, // GREEK CAPITAL LETTER ETA ++ {"eta", 0x003B7}, // GREEK SMALL LETTER ETA ++ {"ETH", 0x000D0}, // LATIN CAPITAL LETTER ETH ++ {"eth", 0x000F0}, // LATIN SMALL LETTER ETH ++ {"Euml", 0x000CB}, // LATIN CAPITAL LETTER E WITH DIAERESIS ++ {"euml", 0x000EB}, // LATIN SMALL LETTER E WITH DIAERESIS ++ {"euro", 0x020AC}, // EURO SIGN ++ {"excl", 0x00021}, // EXCLAMATION MARK ++ {"exist", 0x02203}, // THERE EXISTS ++ {"Exists", 0x02203}, // THERE EXISTS ++ {"expectation", 0x02130}, // SCRIPT CAPITAL E ++ {"exponentiale", 0x02147}, // DOUBLE-STRUCK ITALIC SMALL E ++ {"ExponentialE", 0x02147}, // DOUBLE-STRUCK ITALIC SMALL E ++ {NULL, 0} + }; + + static NameId namesF[]={ +- "fallingdotseq", 0x02252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF +- "Fcy", 0x00424, // CYRILLIC CAPITAL LETTER EF +- "fcy", 0x00444, // CYRILLIC SMALL LETTER EF +- "female", 0x02640, // FEMALE SIGN +- "ffilig", 0x0FB03, // LATIN SMALL LIGATURE FFI +- "fflig", 0x0FB00, // LATIN SMALL LIGATURE FF +- "ffllig", 0x0FB04, // LATIN SMALL LIGATURE FFL +- "Ffr", 0x1D509, // MATHEMATICAL FRAKTUR CAPITAL F +- "ffr", 0x1D523, // MATHEMATICAL FRAKTUR SMALL F +- "filig", 0x0FB01, // LATIN SMALL LIGATURE FI +- "FilledSmallSquare", 0x025FC, // BLACK MEDIUM SQUARE +- "FilledVerySmallSquare", 0x025AA, // BLACK SMALL SQUARE +-// "fjlig", 0x00066;0x0006A, // fj ligature +- "flat", 0x0266D, // MUSIC FLAT SIGN +- "fllig", 0x0FB02, // LATIN SMALL LIGATURE FL +- "fltns", 0x025B1, // WHITE PARALLELOGRAM +- "fnof", 0x00192, // LATIN SMALL LETTER F WITH HOOK +- "Fopf", 0x1D53D, // MATHEMATICAL DOUBLE-STRUCK CAPITAL F +- "fopf", 0x1D557, // MATHEMATICAL DOUBLE-STRUCK SMALL F +- "forall", 0x02200, // FOR ALL +- "ForAll", 0x02200, // FOR ALL +- "fork", 0x022D4, // PITCHFORK +- "forkv", 0x02AD9, // ELEMENT OF OPENING DOWNWARDS +- "Fouriertrf", 0x02131, // SCRIPT CAPITAL F +- "fpartint", 0x02A0D, // FINITE PART INTEGRAL +- "frac12", 0x000BD, // VULGAR FRACTION ONE HALF +- "frac13", 0x02153, // VULGAR FRACTION ONE THIRD +- "frac14", 0x000BC, // VULGAR FRACTION ONE QUARTER +- "frac15", 0x02155, // VULGAR FRACTION ONE FIFTH +- "frac16", 0x02159, // VULGAR FRACTION ONE SIXTH +- "frac18", 0x0215B, // VULGAR FRACTION ONE EIGHTH +- "frac23", 0x02154, // VULGAR FRACTION TWO THIRDS +- "frac25", 0x02156, // VULGAR FRACTION TWO FIFTHS +- "frac34", 0x000BE, // VULGAR FRACTION THREE QUARTERS +- "frac35", 0x02157, // VULGAR FRACTION THREE FIFTHS +- "frac38", 0x0215C, // VULGAR FRACTION THREE EIGHTHS +- "frac45", 0x02158, // VULGAR FRACTION FOUR FIFTHS +- "frac56", 0x0215A, // VULGAR FRACTION FIVE SIXTHS +- "frac58", 0x0215D, // VULGAR FRACTION FIVE EIGHTHS +- "frac78", 0x0215E, // VULGAR FRACTION SEVEN EIGHTHS +- "frasl", 0x02044, // FRACTION SLASH +- "frown", 0x02322, // FROWN +- "Fscr", 0x02131, // SCRIPT CAPITAL F +- "fscr", 0x1D4BB, // MATHEMATICAL SCRIPT SMALL F +- NULL, 0 ++ {"fallingdotseq", 0x02252}, // APPROXIMATELY EQUAL TO OR THE IMAGE OF ++ {"Fcy", 0x00424}, // CYRILLIC CAPITAL LETTER EF ++ {"fcy", 0x00444}, // CYRILLIC SMALL LETTER EF ++ {"female", 0x02640}, // FEMALE SIGN ++ {"ffilig", 0x0FB03}, // LATIN SMALL LIGATURE FFI ++ {"fflig", 0x0FB00}, // LATIN SMALL LIGATURE FF ++ {"ffllig", 0x0FB04}, // LATIN SMALL LIGATURE FFL ++ {"Ffr", 0x1D509}, // MATHEMATICAL FRAKTUR CAPITAL F ++ {"ffr", 0x1D523}, // MATHEMATICAL FRAKTUR SMALL F ++ {"filig", 0x0FB01}, // LATIN SMALL LIGATURE FI ++ {"FilledSmallSquare", 0x025FC}, // BLACK MEDIUM SQUARE ++ {"FilledVerySmallSquare", 0x025AA}, // BLACK SMALL SQUARE ++// "fjlig", 0x00066;0x0006A}, // fj ligature ++ {"flat", 0x0266D}, // MUSIC FLAT SIGN ++ {"fllig", 0x0FB02}, // LATIN SMALL LIGATURE FL ++ {"fltns", 0x025B1}, // WHITE PARALLELOGRAM ++ {"fnof", 0x00192}, // LATIN SMALL LETTER F WITH HOOK ++ {"Fopf", 0x1D53D}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL F ++ {"fopf", 0x1D557}, // MATHEMATICAL DOUBLE-STRUCK SMALL F ++ {"forall", 0x02200}, // FOR ALL ++ {"ForAll", 0x02200}, // FOR ALL ++ {"fork", 0x022D4}, // PITCHFORK ++ {"forkv", 0x02AD9}, // ELEMENT OF OPENING DOWNWARDS ++ {"Fouriertrf", 0x02131}, // SCRIPT CAPITAL F ++ {"fpartint", 0x02A0D}, // FINITE PART INTEGRAL ++ {"frac12", 0x000BD}, // VULGAR FRACTION ONE HALF ++ {"frac13", 0x02153}, // VULGAR FRACTION ONE THIRD ++ {"frac14", 0x000BC}, // VULGAR FRACTION ONE QUARTER ++ {"frac15", 0x02155}, // VULGAR FRACTION ONE FIFTH ++ {"frac16", 0x02159}, // VULGAR FRACTION ONE SIXTH ++ {"frac18", 0x0215B}, // VULGAR FRACTION ONE EIGHTH ++ {"frac23", 0x02154}, // VULGAR FRACTION TWO THIRDS ++ {"frac25", 0x02156}, // VULGAR FRACTION TWO FIFTHS ++ {"frac34", 0x000BE}, // VULGAR FRACTION THREE QUARTERS ++ {"frac35", 0x02157}, // VULGAR FRACTION THREE FIFTHS ++ {"frac38", 0x0215C}, // VULGAR FRACTION THREE EIGHTHS ++ {"frac45", 0x02158}, // VULGAR FRACTION FOUR FIFTHS ++ {"frac56", 0x0215A}, // VULGAR FRACTION FIVE SIXTHS ++ {"frac58", 0x0215D}, // VULGAR FRACTION FIVE EIGHTHS ++ {"frac78", 0x0215E}, // VULGAR FRACTION SEVEN EIGHTHS ++ {"frasl", 0x02044}, // FRACTION SLASH ++ {"frown", 0x02322}, // FROWN ++ {"Fscr", 0x02131}, // SCRIPT CAPITAL F ++ {"fscr", 0x1D4BB}, // MATHEMATICAL SCRIPT SMALL F ++ {NULL, 0} + }; + + static NameId namesG[]={ +- "gacute", 0x001F5, // LATIN SMALL LETTER G WITH ACUTE +- "Gamma", 0x00393, // GREEK CAPITAL LETTER GAMMA +- "gamma", 0x003B3, // GREEK SMALL LETTER GAMMA +- "Gammad", 0x003DC, // GREEK LETTER DIGAMMA +- "gammad", 0x003DD, // GREEK SMALL LETTER DIGAMMA +- "gap", 0x02A86, // GREATER-THAN OR APPROXIMATE +- "Gbreve", 0x0011E, // LATIN CAPITAL LETTER G WITH BREVE +- "gbreve", 0x0011F, // LATIN SMALL LETTER G WITH BREVE +- "Gcedil", 0x00122, // LATIN CAPITAL LETTER G WITH CEDILLA +- "Gcirc", 0x0011C, // LATIN CAPITAL LETTER G WITH CIRCUMFLEX +- "gcirc", 0x0011D, // LATIN SMALL LETTER G WITH CIRCUMFLEX +- "Gcy", 0x00413, // CYRILLIC CAPITAL LETTER GHE +- "gcy", 0x00433, // CYRILLIC SMALL LETTER GHE +- "Gdot", 0x00120, // LATIN CAPITAL LETTER G WITH DOT ABOVE +- "gdot", 0x00121, // LATIN SMALL LETTER G WITH DOT ABOVE +- "ge", 0x02265, // GREATER-THAN OR EQUAL TO +- "gE", 0x02267, // GREATER-THAN OVER EQUAL TO +- "gel", 0x022DB, // GREATER-THAN EQUAL TO OR LESS-THAN +- "gEl", 0x02A8C, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +- "geq", 0x02265, // GREATER-THAN OR EQUAL TO +- "geqq", 0x02267, // GREATER-THAN OVER EQUAL TO +- "geqslant", 0x02A7E, // GREATER-THAN OR SLANTED EQUAL TO +- "ges", 0x02A7E, // GREATER-THAN OR SLANTED EQUAL TO +- "gescc", 0x02AA9, // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +- "gesdot", 0x02A80, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +- "gesdoto", 0x02A82, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +- "gesdotol", 0x02A84, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +-// "gesl", 0x022DB;0x0FE00, // GREATER-THAN slanted EQUAL TO OR LESS-THAN +- "gesles", 0x02A94, // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +- "Gfr", 0x1D50A, // MATHEMATICAL FRAKTUR CAPITAL G +- "gfr", 0x1D524, // MATHEMATICAL FRAKTUR SMALL G +- "gg", 0x0226B, // MUCH GREATER-THAN +- "Gg", 0x022D9, // VERY MUCH GREATER-THAN +- "ggg", 0x022D9, // VERY MUCH GREATER-THAN +- "Ggr", 0x00393, // GREEK CAPITAL LETTER GAMMA +- "ggr", 0x003B3, // GREEK SMALL LETTER GAMMA +- "gimel", 0x02137, // GIMEL SYMBOL +- "GJcy", 0x00403, // CYRILLIC CAPITAL LETTER GJE +- "gjcy", 0x00453, // CYRILLIC SMALL LETTER GJE +- "gl", 0x02277, // GREATER-THAN OR LESS-THAN +- "gla", 0x02AA5, // GREATER-THAN BESIDE LESS-THAN +- "glE", 0x02A92, // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +- "glj", 0x02AA4, // GREATER-THAN OVERLAPPING LESS-THAN +- "gnap", 0x02A8A, // GREATER-THAN AND NOT APPROXIMATE +- "gnapprox", 0x02A8A, // GREATER-THAN AND NOT APPROXIMATE +- "gnE", 0x02269, // GREATER-THAN BUT NOT EQUAL TO +- "gne", 0x02A88, // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +- "gneq", 0x02A88, // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +- "gneqq", 0x02269, // GREATER-THAN BUT NOT EQUAL TO +- "gnsim", 0x022E7, // GREATER-THAN BUT NOT EQUIVALENT TO +- "Gopf", 0x1D53E, // MATHEMATICAL DOUBLE-STRUCK CAPITAL G +- "gopf", 0x1D558, // MATHEMATICAL DOUBLE-STRUCK SMALL G +- "grave", 0x00060, // GRAVE ACCENT +- "GreaterEqual", 0x02265, // GREATER-THAN OR EQUAL TO +- "GreaterEqualLess", 0x022DB, // GREATER-THAN EQUAL TO OR LESS-THAN +- "GreaterFullEqual", 0x02267, // GREATER-THAN OVER EQUAL TO +- "GreaterGreater", 0x02AA2, // DOUBLE NESTED GREATER-THAN +- "GreaterLess", 0x02277, // GREATER-THAN OR LESS-THAN +- "GreaterSlantEqual", 0x02A7E, // GREATER-THAN OR SLANTED EQUAL TO +- "GreaterTilde", 0x02273, // GREATER-THAN OR EQUIVALENT TO +- "gscr", 0x0210A, // SCRIPT SMALL G +- "Gscr", 0x1D4A2, // MATHEMATICAL SCRIPT CAPITAL G +- "gsim", 0x02273, // GREATER-THAN OR EQUIVALENT TO +- "gsime", 0x02A8E, // GREATER-THAN ABOVE SIMILAR OR EQUAL +- "gsiml", 0x02A90, // GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +- "gt", 0x0003E, // GREATER-THAN SIGN +- "GT", 0x0003E, // GREATER-THAN SIGN +- "Gt", 0x0226B, // MUCH GREATER-THAN +- "gtcc", 0x02AA7, // GREATER-THAN CLOSED BY CURVE +- "gtcir", 0x02A7A, // GREATER-THAN WITH CIRCLE INSIDE +- "gtdot", 0x022D7, // GREATER-THAN WITH DOT +- "gtlPar", 0x02995, // DOUBLE LEFT ARC GREATER-THAN BRACKET +- "gtquest", 0x02A7C, // GREATER-THAN WITH QUESTION MARK ABOVE +- "gtrapprox", 0x02A86, // GREATER-THAN OR APPROXIMATE +- "gtrarr", 0x02978, // GREATER-THAN ABOVE RIGHTWARDS ARROW +- "gtrdot", 0x022D7, // GREATER-THAN WITH DOT +- "gtreqless", 0x022DB, // GREATER-THAN EQUAL TO OR LESS-THAN +- "gtreqqless", 0x02A8C, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +- "gtrless", 0x02277, // GREATER-THAN OR LESS-THAN +- "gtrsim", 0x02273, // GREATER-THAN OR EQUIVALENT TO +-// "gvertneqq", 0x02269;0x0FE00, // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke +-// "gvnE", 0x02269;0x0FE00, // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke +- NULL, 0 ++ {"gacute", 0x001F5}, // LATIN SMALL LETTER G WITH ACUTE ++ {"Gamma", 0x00393}, // GREEK CAPITAL LETTER GAMMA ++ {"gamma", 0x003B3}, // GREEK SMALL LETTER GAMMA ++ {"Gammad", 0x003DC}, // GREEK LETTER DIGAMMA ++ {"gammad", 0x003DD}, // GREEK SMALL LETTER DIGAMMA ++ {"gap", 0x02A86}, // GREATER-THAN OR APPROXIMATE ++ {"Gbreve", 0x0011E}, // LATIN CAPITAL LETTER G WITH BREVE ++ {"gbreve", 0x0011F}, // LATIN SMALL LETTER G WITH BREVE ++ {"Gcedil", 0x00122}, // LATIN CAPITAL LETTER G WITH CEDILLA ++ {"Gcirc", 0x0011C}, // LATIN CAPITAL LETTER G WITH CIRCUMFLEX ++ {"gcirc", 0x0011D}, // LATIN SMALL LETTER G WITH CIRCUMFLEX ++ {"Gcy", 0x00413}, // CYRILLIC CAPITAL LETTER GHE ++ {"gcy", 0x00433}, // CYRILLIC SMALL LETTER GHE ++ {"Gdot", 0x00120}, // LATIN CAPITAL LETTER G WITH DOT ABOVE ++ {"gdot", 0x00121}, // LATIN SMALL LETTER G WITH DOT ABOVE ++ {"ge", 0x02265}, // GREATER-THAN OR EQUAL TO ++ {"gE", 0x02267}, // GREATER-THAN OVER EQUAL TO ++ {"gel", 0x022DB}, // GREATER-THAN EQUAL TO OR LESS-THAN ++ {"gEl", 0x02A8C}, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN ++ {"geq", 0x02265}, // GREATER-THAN OR EQUAL TO ++ {"geqq", 0x02267}, // GREATER-THAN OVER EQUAL TO ++ {"geqslant", 0x02A7E}, // GREATER-THAN OR SLANTED EQUAL TO ++ {"ges", 0x02A7E}, // GREATER-THAN OR SLANTED EQUAL TO ++ {"gescc", 0x02AA9}, // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL ++ {"gesdot", 0x02A80}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE ++ {"gesdoto", 0x02A82}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE ++ {"gesdotol", 0x02A84}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT ++// "gesl", 0x022DB;0x0FE00}, // GREATER-THAN slanted EQUAL TO OR LESS-THAN ++ {"gesles", 0x02A94}, // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL ++ {"Gfr", 0x1D50A}, // MATHEMATICAL FRAKTUR CAPITAL G ++ {"gfr", 0x1D524}, // MATHEMATICAL FRAKTUR SMALL G ++ {"gg", 0x0226B}, // MUCH GREATER-THAN ++ {"Gg", 0x022D9}, // VERY MUCH GREATER-THAN ++ {"ggg", 0x022D9}, // VERY MUCH GREATER-THAN ++ {"Ggr", 0x00393}, // GREEK CAPITAL LETTER GAMMA ++ {"ggr", 0x003B3}, // GREEK SMALL LETTER GAMMA ++ {"gimel", 0x02137}, // GIMEL SYMBOL ++ {"GJcy", 0x00403}, // CYRILLIC CAPITAL LETTER GJE ++ {"gjcy", 0x00453}, // CYRILLIC SMALL LETTER GJE ++ {"gl", 0x02277}, // GREATER-THAN OR LESS-THAN ++ {"gla", 0x02AA5}, // GREATER-THAN BESIDE LESS-THAN ++ {"glE", 0x02A92}, // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL ++ {"glj", 0x02AA4}, // GREATER-THAN OVERLAPPING LESS-THAN ++ {"gnap", 0x02A8A}, // GREATER-THAN AND NOT APPROXIMATE ++ {"gnapprox", 0x02A8A}, // GREATER-THAN AND NOT APPROXIMATE ++ {"gnE", 0x02269}, // GREATER-THAN BUT NOT EQUAL TO ++ {"gne", 0x02A88}, // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO ++ {"gneq", 0x02A88}, // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO ++ {"gneqq", 0x02269}, // GREATER-THAN BUT NOT EQUAL TO ++ {"gnsim", 0x022E7}, // GREATER-THAN BUT NOT EQUIVALENT TO ++ {"Gopf", 0x1D53E}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL G ++ {"gopf", 0x1D558}, // MATHEMATICAL DOUBLE-STRUCK SMALL G ++ {"grave", 0x00060}, // GRAVE ACCENT ++ {"GreaterEqual", 0x02265}, // GREATER-THAN OR EQUAL TO ++ {"GreaterEqualLess", 0x022DB}, // GREATER-THAN EQUAL TO OR LESS-THAN ++ {"GreaterFullEqual", 0x02267}, // GREATER-THAN OVER EQUAL TO ++ {"GreaterGreater", 0x02AA2}, // DOUBLE NESTED GREATER-THAN ++ {"GreaterLess", 0x02277}, // GREATER-THAN OR LESS-THAN ++ {"GreaterSlantEqual", 0x02A7E}, // GREATER-THAN OR SLANTED EQUAL TO ++ {"GreaterTilde", 0x02273}, // GREATER-THAN OR EQUIVALENT TO ++ {"gscr", 0x0210A}, // SCRIPT SMALL G ++ {"Gscr", 0x1D4A2}, // MATHEMATICAL SCRIPT CAPITAL G ++ {"gsim", 0x02273}, // GREATER-THAN OR EQUIVALENT TO ++ {"gsime", 0x02A8E}, // GREATER-THAN ABOVE SIMILAR OR EQUAL ++ {"gsiml", 0x02A90}, // GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN ++ {"gt", 0x0003E}, // GREATER-THAN SIGN ++ {"GT", 0x0003E}, // GREATER-THAN SIGN ++ {"Gt", 0x0226B}, // MUCH GREATER-THAN ++ {"gtcc", 0x02AA7}, // GREATER-THAN CLOSED BY CURVE ++ {"gtcir", 0x02A7A}, // GREATER-THAN WITH CIRCLE INSIDE ++ {"gtdot", 0x022D7}, // GREATER-THAN WITH DOT ++ {"gtlPar", 0x02995}, // DOUBLE LEFT ARC GREATER-THAN BRACKET ++ {"gtquest", 0x02A7C}, // GREATER-THAN WITH QUESTION MARK ABOVE ++ {"gtrapprox", 0x02A86}, // GREATER-THAN OR APPROXIMATE ++ {"gtrarr", 0x02978}, // GREATER-THAN ABOVE RIGHTWARDS ARROW ++ {"gtrdot", 0x022D7}, // GREATER-THAN WITH DOT ++ {"gtreqless", 0x022DB}, // GREATER-THAN EQUAL TO OR LESS-THAN ++ {"gtreqqless", 0x02A8C}, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN ++ {"gtrless", 0x02277}, // GREATER-THAN OR LESS-THAN ++ {"gtrsim", 0x02273}, // GREATER-THAN OR EQUIVALENT TO ++// "gvertneqq", 0x02269;0x0FE00}, // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke ++// "gvnE", 0x02269;0x0FE00}, // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke ++ {NULL, 0} + }; + + static NameId namesH[]={ +- "Hacek", 0x002C7, // CARON +- "hairsp", 0x0200A, // HAIR SPACE +- "half", 0x000BD, // VULGAR FRACTION ONE HALF +- "hamilt", 0x0210B, // SCRIPT CAPITAL H +- "HARDcy", 0x0042A, // CYRILLIC CAPITAL LETTER HARD SIGN +- "hardcy", 0x0044A, // CYRILLIC SMALL LETTER HARD SIGN +- "harr", 0x02194, // LEFT RIGHT ARROW +- "hArr", 0x021D4, // LEFT RIGHT DOUBLE ARROW +- "harrcir", 0x02948, // LEFT RIGHT ARROW THROUGH SMALL CIRCLE +- "harrw", 0x021AD, // LEFT RIGHT WAVE ARROW +- "Hat", 0x0005E, // CIRCUMFLEX ACCENT +- "hbar", 0x0210F, // PLANCK CONSTANT OVER TWO PI +- "Hcirc", 0x00124, // LATIN CAPITAL LETTER H WITH CIRCUMFLEX +- "hcirc", 0x00125, // LATIN SMALL LETTER H WITH CIRCUMFLEX +- "hearts", 0x02665, // BLACK HEART SUIT +- "heartsuit", 0x02665, // BLACK HEART SUIT +- "hellip", 0x02026, // HORIZONTAL ELLIPSIS +- "hercon", 0x022B9, // HERMITIAN CONJUGATE MATRIX +- "Hfr", 0x0210C, // BLACK-LETTER CAPITAL H +- "hfr", 0x1D525, // MATHEMATICAL FRAKTUR SMALL H +- "HilbertSpace", 0x0210B, // SCRIPT CAPITAL H +- "hksearow", 0x02925, // SOUTH EAST ARROW WITH HOOK +- "hkswarow", 0x02926, // SOUTH WEST ARROW WITH HOOK +- "hoarr", 0x021FF, // LEFT RIGHT OPEN-HEADED ARROW +- "homtht", 0x0223B, // HOMOTHETIC +- "hookleftarrow", 0x021A9, // LEFTWARDS ARROW WITH HOOK +- "hookrightarrow", 0x021AA, // RIGHTWARDS ARROW WITH HOOK +- "Hopf", 0x0210D, // DOUBLE-STRUCK CAPITAL H +- "hopf", 0x1D559, // MATHEMATICAL DOUBLE-STRUCK SMALL H +- "horbar", 0x02015, // HORIZONTAL BAR +- "HorizontalLine", 0x02500, // BOX DRAWINGS LIGHT HORIZONTAL +- "Hscr", 0x0210B, // SCRIPT CAPITAL H +- "hscr", 0x1D4BD, // MATHEMATICAL SCRIPT SMALL H +- "hslash", 0x0210F, // PLANCK CONSTANT OVER TWO PI +- "Hstrok", 0x00126, // LATIN CAPITAL LETTER H WITH STROKE +- "hstrok", 0x00127, // LATIN SMALL LETTER H WITH STROKE +- "HumpDownHump", 0x0224E, // GEOMETRICALLY EQUIVALENT TO +- "HumpEqual", 0x0224F, // DIFFERENCE BETWEEN +- "hybull", 0x02043, // HYPHEN BULLET +- "hyphen", 0x02010, // HYPHEN +- NULL, 0 ++ {"Hacek", 0x002C7}, // CARON ++ {"hairsp", 0x0200A}, // HAIR SPACE ++ {"half", 0x000BD}, // VULGAR FRACTION ONE HALF ++ {"hamilt", 0x0210B}, // SCRIPT CAPITAL H ++ {"HARDcy", 0x0042A}, // CYRILLIC CAPITAL LETTER HARD SIGN ++ {"hardcy", 0x0044A}, // CYRILLIC SMALL LETTER HARD SIGN ++ {"harr", 0x02194}, // LEFT RIGHT ARROW ++ {"hArr", 0x021D4}, // LEFT RIGHT DOUBLE ARROW ++ {"harrcir", 0x02948}, // LEFT RIGHT ARROW THROUGH SMALL CIRCLE ++ {"harrw", 0x021AD}, // LEFT RIGHT WAVE ARROW ++ {"Hat", 0x0005E}, // CIRCUMFLEX ACCENT ++ {"hbar", 0x0210F}, // PLANCK CONSTANT OVER TWO PI ++ {"Hcirc", 0x00124}, // LATIN CAPITAL LETTER H WITH CIRCUMFLEX ++ {"hcirc", 0x00125}, // LATIN SMALL LETTER H WITH CIRCUMFLEX ++ {"hearts", 0x02665}, // BLACK HEART SUIT ++ {"heartsuit", 0x02665}, // BLACK HEART SUIT ++ {"hellip", 0x02026}, // HORIZONTAL ELLIPSIS ++ {"hercon", 0x022B9}, // HERMITIAN CONJUGATE MATRIX ++ {"Hfr", 0x0210C}, // BLACK-LETTER CAPITAL H ++ {"hfr", 0x1D525}, // MATHEMATICAL FRAKTUR SMALL H ++ {"HilbertSpace", 0x0210B}, // SCRIPT CAPITAL H ++ {"hksearow", 0x02925}, // SOUTH EAST ARROW WITH HOOK ++ {"hkswarow", 0x02926}, // SOUTH WEST ARROW WITH HOOK ++ {"hoarr", 0x021FF}, // LEFT RIGHT OPEN-HEADED ARROW ++ {"homtht", 0x0223B}, // HOMOTHETIC ++ {"hookleftarrow", 0x021A9}, // LEFTWARDS ARROW WITH HOOK ++ {"hookrightarrow", 0x021AA}, // RIGHTWARDS ARROW WITH HOOK ++ {"Hopf", 0x0210D}, // DOUBLE-STRUCK CAPITAL H ++ {"hopf", 0x1D559}, // MATHEMATICAL DOUBLE-STRUCK SMALL H ++ {"horbar", 0x02015}, // HORIZONTAL BAR ++ {"HorizontalLine", 0x02500}, // BOX DRAWINGS LIGHT HORIZONTAL ++ {"Hscr", 0x0210B}, // SCRIPT CAPITAL H ++ {"hscr", 0x1D4BD}, // MATHEMATICAL SCRIPT SMALL H ++ {"hslash", 0x0210F}, // PLANCK CONSTANT OVER TWO PI ++ {"Hstrok", 0x00126}, // LATIN CAPITAL LETTER H WITH STROKE ++ {"hstrok", 0x00127}, // LATIN SMALL LETTER H WITH STROKE ++ {"HumpDownHump", 0x0224E}, // GEOMETRICALLY EQUIVALENT TO ++ {"HumpEqual", 0x0224F}, // DIFFERENCE BETWEEN ++ {"hybull", 0x02043}, // HYPHEN BULLET ++ {"hyphen", 0x02010}, // HYPHEN ++ {NULL, 0} + }; + + static NameId namesI[]={ +- "Iacgr", 0x0038A, // GREEK CAPITAL LETTER IOTA WITH TONOS +- "iacgr", 0x003AF, // GREEK SMALL LETTER IOTA WITH TONOS +- "Iacute", 0x000CD, // LATIN CAPITAL LETTER I WITH ACUTE +- "iacute", 0x000ED, // LATIN SMALL LETTER I WITH ACUTE +- "ic", 0x02063, // INVISIBLE SEPARATOR +- "Icirc", 0x000CE, // LATIN CAPITAL LETTER I WITH CIRCUMFLEX +- "icirc", 0x000EE, // LATIN SMALL LETTER I WITH CIRCUMFLEX +- "Icy", 0x00418, // CYRILLIC CAPITAL LETTER I +- "icy", 0x00438, // CYRILLIC SMALL LETTER I +- "idiagr", 0x00390, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +- "Idigr", 0x003AA, // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +- "idigr", 0x003CA, // GREEK SMALL LETTER IOTA WITH DIALYTIKA +- "Idot", 0x00130, // LATIN CAPITAL LETTER I WITH DOT ABOVE +- "IEcy", 0x00415, // CYRILLIC CAPITAL LETTER IE +- "iecy", 0x00435, // CYRILLIC SMALL LETTER IE +- "iexcl", 0x000A1, // INVERTED EXCLAMATION MARK +- "iff", 0x021D4, // LEFT RIGHT DOUBLE ARROW +- "Ifr", 0x02111, // BLACK-LETTER CAPITAL I +- "ifr", 0x1D526, // MATHEMATICAL FRAKTUR SMALL I +- "Igr", 0x00399, // GREEK CAPITAL LETTER IOTA +- "igr", 0x003B9, // GREEK SMALL LETTER IOTA +- "Igrave", 0x000CC, // LATIN CAPITAL LETTER I WITH GRAVE +- "igrave", 0x000EC, // LATIN SMALL LETTER I WITH GRAVE +- "ii", 0x02148, // DOUBLE-STRUCK ITALIC SMALL I +- "iiiint", 0x02A0C, // QUADRUPLE INTEGRAL OPERATOR +- "iiint", 0x0222D, // TRIPLE INTEGRAL +- "iinfin", 0x029DC, // INCOMPLETE INFINITY +- "iiota", 0x02129, // TURNED GREEK SMALL LETTER IOTA +- "IJlig", 0x00132, // LATIN CAPITAL LIGATURE IJ +- "ijlig", 0x00133, // LATIN SMALL LIGATURE IJ +- "Im", 0x02111, // BLACK-LETTER CAPITAL I +- "Imacr", 0x0012A, // LATIN CAPITAL LETTER I WITH MACRON +- "imacr", 0x0012B, // LATIN SMALL LETTER I WITH MACRON +- "image", 0x02111, // BLACK-LETTER CAPITAL I +- "ImaginaryI", 0x02148, // DOUBLE-STRUCK ITALIC SMALL I +- "imagline", 0x02110, // SCRIPT CAPITAL I +- "imagpart", 0x02111, // BLACK-LETTER CAPITAL I +- "imath", 0x00131, // LATIN SMALL LETTER DOTLESS I +- "imof", 0x022B7, // IMAGE OF +- "imped", 0x001B5, // LATIN CAPITAL LETTER Z WITH STROKE +- "Implies", 0x021D2, // RIGHTWARDS DOUBLE ARROW +- "in", 0x02208, // ELEMENT OF +- "incare", 0x02105, // CARE OF +- "infin", 0x0221E, // INFINITY +- "infintie", 0x029DD, // TIE OVER INFINITY +- "inodot", 0x00131, // LATIN SMALL LETTER DOTLESS I +- "int", 0x0222B, // INTEGRAL +- "Int", 0x0222C, // DOUBLE INTEGRAL +- "intcal", 0x022BA, // INTERCALATE +- "integers", 0x02124, // DOUBLE-STRUCK CAPITAL Z +- "Integral", 0x0222B, // INTEGRAL +- "intercal", 0x022BA, // INTERCALATE +- "Intersection", 0x022C2, // N-ARY INTERSECTION +- "intlarhk", 0x02A17, // INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +- "intprod", 0x02A3C, // INTERIOR PRODUCT +- "InvisibleComma", 0x02063, // INVISIBLE SEPARATOR +- "InvisibleTimes", 0x02062, // INVISIBLE TIMES +- "IOcy", 0x00401, // CYRILLIC CAPITAL LETTER IO +- "iocy", 0x00451, // CYRILLIC SMALL LETTER IO +- "Iogon", 0x0012E, // LATIN CAPITAL LETTER I WITH OGONEK +- "iogon", 0x0012F, // LATIN SMALL LETTER I WITH OGONEK +- "Iopf", 0x1D540, // MATHEMATICAL DOUBLE-STRUCK CAPITAL I +- "iopf", 0x1D55A, // MATHEMATICAL DOUBLE-STRUCK SMALL I +- "Iota", 0x00399, // GREEK CAPITAL LETTER IOTA +- "iota", 0x003B9, // GREEK SMALL LETTER IOTA +- "iprod", 0x02A3C, // INTERIOR PRODUCT +- "iquest", 0x000BF, // INVERTED QUESTION MARK +- "Iscr", 0x02110, // SCRIPT CAPITAL I +- "iscr", 0x1D4BE, // MATHEMATICAL SCRIPT SMALL I +- "isin", 0x02208, // ELEMENT OF +- "isindot", 0x022F5, // ELEMENT OF WITH DOT ABOVE +- "isinE", 0x022F9, // ELEMENT OF WITH TWO HORIZONTAL STROKES +- "isins", 0x022F4, // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +- "isinsv", 0x022F3, // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +- "isinv", 0x02208, // ELEMENT OF +- "it", 0x02062, // INVISIBLE TIMES +- "Itilde", 0x00128, // LATIN CAPITAL LETTER I WITH TILDE +- "itilde", 0x00129, // LATIN SMALL LETTER I WITH TILDE +- "Iukcy", 0x00406, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +- "iukcy", 0x00456, // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +- "Iuml", 0x000CF, // LATIN CAPITAL LETTER I WITH DIAERESIS +- "iuml", 0x000EF, // LATIN SMALL LETTER I WITH DIAERESIS +- NULL, 0 ++ {"Iacgr", 0x0038A}, // GREEK CAPITAL LETTER IOTA WITH TONOS ++ {"iacgr", 0x003AF}, // GREEK SMALL LETTER IOTA WITH TONOS ++ {"Iacute", 0x000CD}, // LATIN CAPITAL LETTER I WITH ACUTE ++ {"iacute", 0x000ED}, // LATIN SMALL LETTER I WITH ACUTE ++ {"ic", 0x02063}, // INVISIBLE SEPARATOR ++ {"Icirc", 0x000CE}, // LATIN CAPITAL LETTER I WITH CIRCUMFLEX ++ {"icirc", 0x000EE}, // LATIN SMALL LETTER I WITH CIRCUMFLEX ++ {"Icy", 0x00418}, // CYRILLIC CAPITAL LETTER I ++ {"icy", 0x00438}, // CYRILLIC SMALL LETTER I ++ {"idiagr", 0x00390}, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS ++ {"Idigr", 0x003AA}, // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA ++ {"idigr", 0x003CA}, // GREEK SMALL LETTER IOTA WITH DIALYTIKA ++ {"Idot", 0x00130}, // LATIN CAPITAL LETTER I WITH DOT ABOVE ++ {"IEcy", 0x00415}, // CYRILLIC CAPITAL LETTER IE ++ {"iecy", 0x00435}, // CYRILLIC SMALL LETTER IE ++ {"iexcl", 0x000A1}, // INVERTED EXCLAMATION MARK ++ {"iff", 0x021D4}, // LEFT RIGHT DOUBLE ARROW ++ {"Ifr", 0x02111}, // BLACK-LETTER CAPITAL I ++ {"ifr", 0x1D526}, // MATHEMATICAL FRAKTUR SMALL I ++ {"Igr", 0x00399}, // GREEK CAPITAL LETTER IOTA ++ {"igr", 0x003B9}, // GREEK SMALL LETTER IOTA ++ {"Igrave", 0x000CC}, // LATIN CAPITAL LETTER I WITH GRAVE ++ {"igrave", 0x000EC}, // LATIN SMALL LETTER I WITH GRAVE ++ {"ii", 0x02148}, // DOUBLE-STRUCK ITALIC SMALL I ++ {"iiiint", 0x02A0C}, // QUADRUPLE INTEGRAL OPERATOR ++ {"iiint", 0x0222D}, // TRIPLE INTEGRAL ++ {"iinfin", 0x029DC}, // INCOMPLETE INFINITY ++ {"iiota", 0x02129}, // TURNED GREEK SMALL LETTER IOTA ++ {"IJlig", 0x00132}, // LATIN CAPITAL LIGATURE IJ ++ {"ijlig", 0x00133}, // LATIN SMALL LIGATURE IJ ++ {"Im", 0x02111}, // BLACK-LETTER CAPITAL I ++ {"Imacr", 0x0012A}, // LATIN CAPITAL LETTER I WITH MACRON ++ {"imacr", 0x0012B}, // LATIN SMALL LETTER I WITH MACRON ++ {"image", 0x02111}, // BLACK-LETTER CAPITAL I ++ {"ImaginaryI", 0x02148}, // DOUBLE-STRUCK ITALIC SMALL I ++ {"imagline", 0x02110}, // SCRIPT CAPITAL I ++ {"imagpart", 0x02111}, // BLACK-LETTER CAPITAL I ++ {"imath", 0x00131}, // LATIN SMALL LETTER DOTLESS I ++ {"imof", 0x022B7}, // IMAGE OF ++ {"imped", 0x001B5}, // LATIN CAPITAL LETTER Z WITH STROKE ++ {"Implies", 0x021D2}, // RIGHTWARDS DOUBLE ARROW ++ {"in", 0x02208}, // ELEMENT OF ++ {"incare", 0x02105}, // CARE OF ++ {"infin", 0x0221E}, // INFINITY ++ {"infintie", 0x029DD}, // TIE OVER INFINITY ++ {"inodot", 0x00131}, // LATIN SMALL LETTER DOTLESS I ++ {"int", 0x0222B}, // INTEGRAL ++ {"Int", 0x0222C}, // DOUBLE INTEGRAL ++ {"intcal", 0x022BA}, // INTERCALATE ++ {"integers", 0x02124}, // DOUBLE-STRUCK CAPITAL Z ++ {"Integral", 0x0222B}, // INTEGRAL ++ {"intercal", 0x022BA}, // INTERCALATE ++ {"Intersection", 0x022C2}, // N-ARY INTERSECTION ++ {"intlarhk", 0x02A17}, // INTEGRAL WITH LEFTWARDS ARROW WITH HOOK ++ {"intprod", 0x02A3C}, // INTERIOR PRODUCT ++ {"InvisibleComma", 0x02063}, // INVISIBLE SEPARATOR ++ {"InvisibleTimes", 0x02062}, // INVISIBLE TIMES ++ {"IOcy", 0x00401}, // CYRILLIC CAPITAL LETTER IO ++ {"iocy", 0x00451}, // CYRILLIC SMALL LETTER IO ++ {"Iogon", 0x0012E}, // LATIN CAPITAL LETTER I WITH OGONEK ++ {"iogon", 0x0012F}, // LATIN SMALL LETTER I WITH OGONEK ++ {"Iopf", 0x1D540}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL I ++ {"iopf", 0x1D55A}, // MATHEMATICAL DOUBLE-STRUCK SMALL I ++ {"Iota", 0x00399}, // GREEK CAPITAL LETTER IOTA ++ {"iota", 0x003B9}, // GREEK SMALL LETTER IOTA ++ {"iprod", 0x02A3C}, // INTERIOR PRODUCT ++ {"iquest", 0x000BF}, // INVERTED QUESTION MARK ++ {"Iscr", 0x02110}, // SCRIPT CAPITAL I ++ {"iscr", 0x1D4BE}, // MATHEMATICAL SCRIPT SMALL I ++ {"isin", 0x02208}, // ELEMENT OF ++ {"isindot", 0x022F5}, // ELEMENT OF WITH DOT ABOVE ++ {"isinE", 0x022F9}, // ELEMENT OF WITH TWO HORIZONTAL STROKES ++ {"isins", 0x022F4}, // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE ++ {"isinsv", 0x022F3}, // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE ++ {"isinv", 0x02208}, // ELEMENT OF ++ {"it", 0x02062}, // INVISIBLE TIMES ++ {"Itilde", 0x00128}, // LATIN CAPITAL LETTER I WITH TILDE ++ {"itilde", 0x00129}, // LATIN SMALL LETTER I WITH TILDE ++ {"Iukcy", 0x00406}, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I ++ {"iukcy", 0x00456}, // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I ++ {"Iuml", 0x000CF}, // LATIN CAPITAL LETTER I WITH DIAERESIS ++ {"iuml", 0x000EF}, // LATIN SMALL LETTER I WITH DIAERESIS ++ {NULL, 0} + }; + + static NameId namesJ[]={ +- "Jcirc", 0x00134, // LATIN CAPITAL LETTER J WITH CIRCUMFLEX +- "jcirc", 0x00135, // LATIN SMALL LETTER J WITH CIRCUMFLEX +- "Jcy", 0x00419, // CYRILLIC CAPITAL LETTER SHORT I +- "jcy", 0x00439, // CYRILLIC SMALL LETTER SHORT I +- "Jfr", 0x1D50D, // MATHEMATICAL FRAKTUR CAPITAL J +- "jfr", 0x1D527, // MATHEMATICAL FRAKTUR SMALL J +- "jmath", 0x00237, // LATIN SMALL LETTER DOTLESS J +- "Jopf", 0x1D541, // MATHEMATICAL DOUBLE-STRUCK CAPITAL J +- "jopf", 0x1D55B, // MATHEMATICAL DOUBLE-STRUCK SMALL J +- "Jscr", 0x1D4A5, // MATHEMATICAL SCRIPT CAPITAL J +- "jscr", 0x1D4BF, // MATHEMATICAL SCRIPT SMALL J +- "Jsercy", 0x00408, // CYRILLIC CAPITAL LETTER JE +- "jsercy", 0x00458, // CYRILLIC SMALL LETTER JE +- "Jukcy", 0x00404, // CYRILLIC CAPITAL LETTER UKRAINIAN IE +- "jukcy", 0x00454, // CYRILLIC SMALL LETTER UKRAINIAN IE +- NULL, 0 ++ {"Jcirc", 0x00134}, // LATIN CAPITAL LETTER J WITH CIRCUMFLEX ++ {"jcirc", 0x00135}, // LATIN SMALL LETTER J WITH CIRCUMFLEX ++ {"Jcy", 0x00419}, // CYRILLIC CAPITAL LETTER SHORT I ++ {"jcy", 0x00439}, // CYRILLIC SMALL LETTER SHORT I ++ {"Jfr", 0x1D50D}, // MATHEMATICAL FRAKTUR CAPITAL J ++ {"jfr", 0x1D527}, // MATHEMATICAL FRAKTUR SMALL J ++ {"jmath", 0x00237}, // LATIN SMALL LETTER DOTLESS J ++ {"Jopf", 0x1D541}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL J ++ {"jopf", 0x1D55B}, // MATHEMATICAL DOUBLE-STRUCK SMALL J ++ {"Jscr", 0x1D4A5}, // MATHEMATICAL SCRIPT CAPITAL J ++ {"jscr", 0x1D4BF}, // MATHEMATICAL SCRIPT SMALL J ++ {"Jsercy", 0x00408}, // CYRILLIC CAPITAL LETTER JE ++ {"jsercy", 0x00458}, // CYRILLIC SMALL LETTER JE ++ {"Jukcy", 0x00404}, // CYRILLIC CAPITAL LETTER UKRAINIAN IE ++ {"jukcy", 0x00454}, // CYRILLIC SMALL LETTER UKRAINIAN IE ++ {NULL, 0} + }; + + static NameId namesK[]={ +- "Kappa", 0x0039A, // GREEK CAPITAL LETTER KAPPA +- "kappa", 0x003BA, // GREEK SMALL LETTER KAPPA +- "kappav", 0x003F0, // GREEK KAPPA SYMBOL +- "Kcedil", 0x00136, // LATIN CAPITAL LETTER K WITH CEDILLA +- "kcedil", 0x00137, // LATIN SMALL LETTER K WITH CEDILLA +- "Kcy", 0x0041A, // CYRILLIC CAPITAL LETTER KA +- "kcy", 0x0043A, // CYRILLIC SMALL LETTER KA +- "Kfr", 0x1D50E, // MATHEMATICAL FRAKTUR CAPITAL K +- "kfr", 0x1D528, // MATHEMATICAL FRAKTUR SMALL K +- "Kgr", 0x0039A, // GREEK CAPITAL LETTER KAPPA +- "kgr", 0x003BA, // GREEK SMALL LETTER KAPPA +- "kgreen", 0x00138, // LATIN SMALL LETTER KRA +- "KHcy", 0x00425, // CYRILLIC CAPITAL LETTER HA +- "khcy", 0x00445, // CYRILLIC SMALL LETTER HA +- "KHgr", 0x003A7, // GREEK CAPITAL LETTER CHI +- "khgr", 0x003C7, // GREEK SMALL LETTER CHI +- "KJcy", 0x0040C, // CYRILLIC CAPITAL LETTER KJE +- "kjcy", 0x0045C, // CYRILLIC SMALL LETTER KJE +- "Kopf", 0x1D542, // MATHEMATICAL DOUBLE-STRUCK CAPITAL K +- "kopf", 0x1D55C, // MATHEMATICAL DOUBLE-STRUCK SMALL K +- "Kscr", 0x1D4A6, // MATHEMATICAL SCRIPT CAPITAL K +- "kscr", 0x1D4C0, // MATHEMATICAL SCRIPT SMALL K +- NULL, 0 ++ {"Kappa", 0x0039A}, // GREEK CAPITAL LETTER KAPPA ++ {"kappa", 0x003BA}, // GREEK SMALL LETTER KAPPA ++ {"kappav", 0x003F0}, // GREEK KAPPA SYMBOL ++ {"Kcedil", 0x00136}, // LATIN CAPITAL LETTER K WITH CEDILLA ++ {"kcedil", 0x00137}, // LATIN SMALL LETTER K WITH CEDILLA ++ {"Kcy", 0x0041A}, // CYRILLIC CAPITAL LETTER KA ++ {"kcy", 0x0043A}, // CYRILLIC SMALL LETTER KA ++ {"Kfr", 0x1D50E}, // MATHEMATICAL FRAKTUR CAPITAL K ++ {"kfr", 0x1D528}, // MATHEMATICAL FRAKTUR SMALL K ++ {"Kgr", 0x0039A}, // GREEK CAPITAL LETTER KAPPA ++ {"kgr", 0x003BA}, // GREEK SMALL LETTER KAPPA ++ {"kgreen", 0x00138}, // LATIN SMALL LETTER KRA ++ {"KHcy", 0x00425}, // CYRILLIC CAPITAL LETTER HA ++ {"khcy", 0x00445}, // CYRILLIC SMALL LETTER HA ++ {"KHgr", 0x003A7}, // GREEK CAPITAL LETTER CHI ++ {"khgr", 0x003C7}, // GREEK SMALL LETTER CHI ++ {"KJcy", 0x0040C}, // CYRILLIC CAPITAL LETTER KJE ++ {"kjcy", 0x0045C}, // CYRILLIC SMALL LETTER KJE ++ {"Kopf", 0x1D542}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL K ++ {"kopf", 0x1D55C}, // MATHEMATICAL DOUBLE-STRUCK SMALL K ++ {"Kscr", 0x1D4A6}, // MATHEMATICAL SCRIPT CAPITAL K ++ {"kscr", 0x1D4C0}, // MATHEMATICAL SCRIPT SMALL K ++ {NULL, 0} + }; + + static NameId namesL[]={ +- "lAarr", 0x021DA, // LEFTWARDS TRIPLE ARROW +- "Lacute", 0x00139, // LATIN CAPITAL LETTER L WITH ACUTE +- "lacute", 0x0013A, // LATIN SMALL LETTER L WITH ACUTE +- "laemptyv", 0x029B4, // EMPTY SET WITH LEFT ARROW ABOVE +- "lagran", 0x02112, // SCRIPT CAPITAL L +- "Lambda", 0x0039B, // GREEK CAPITAL LETTER LAMDA +- "lambda", 0x003BB, // GREEK SMALL LETTER LAMDA +- "lang", 0x027E8, // MATHEMATICAL LEFT ANGLE BRACKET +- "Lang", 0x027EA, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +- "langd", 0x02991, // LEFT ANGLE BRACKET WITH DOT +- "langle", 0x027E8, // MATHEMATICAL LEFT ANGLE BRACKET +- "lap", 0x02A85, // LESS-THAN OR APPROXIMATE +- "Laplacetrf", 0x02112, // SCRIPT CAPITAL L +- "laquo", 0x000AB, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +- "larr", 0x02190, // LEFTWARDS ARROW +- "Larr", 0x0219E, // LEFTWARDS TWO HEADED ARROW +- "lArr", 0x021D0, // LEFTWARDS DOUBLE ARROW +- "larrb", 0x021E4, // LEFTWARDS ARROW TO BAR +- "larrbfs", 0x0291F, // LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +- "larrfs", 0x0291D, // LEFTWARDS ARROW TO BLACK DIAMOND +- "larrhk", 0x021A9, // LEFTWARDS ARROW WITH HOOK +- "larrlp", 0x021AB, // LEFTWARDS ARROW WITH LOOP +- "larrpl", 0x02939, // LEFT-SIDE ARC ANTICLOCKWISE ARROW +- "larrsim", 0x02973, // LEFTWARDS ARROW ABOVE TILDE OPERATOR +- "larrtl", 0x021A2, // LEFTWARDS ARROW WITH TAIL +- "lat", 0x02AAB, // LARGER THAN +- "latail", 0x02919, // LEFTWARDS ARROW-TAIL +- "lAtail", 0x0291B, // LEFTWARDS DOUBLE ARROW-TAIL +- "late", 0x02AAD, // LARGER THAN OR EQUAL TO +-// "lates", 0x02AAD;0x0FE00, // LARGER THAN OR slanted EQUAL +- "lbarr", 0x0290C, // LEFTWARDS DOUBLE DASH ARROW +- "lBarr", 0x0290E, // LEFTWARDS TRIPLE DASH ARROW +- "lbbrk", 0x02772, // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +- "lbrace", 0x0007B, // LEFT CURLY BRACKET +- "lbrack", 0x0005B, // LEFT SQUARE BRACKET +- "lbrke", 0x0298B, // LEFT SQUARE BRACKET WITH UNDERBAR +- "lbrksld", 0x0298F, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +- "lbrkslu", 0x0298D, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +- "Lcaron", 0x0013D, // LATIN CAPITAL LETTER L WITH CARON +- "lcaron", 0x0013E, // LATIN SMALL LETTER L WITH CARON +- "Lcedil", 0x0013B, // LATIN CAPITAL LETTER L WITH CEDILLA +- "lcedil", 0x0013C, // LATIN SMALL LETTER L WITH CEDILLA +- "lceil", 0x02308, // LEFT CEILING +- "lcub", 0x0007B, // LEFT CURLY BRACKET +- "Lcy", 0x0041B, // CYRILLIC CAPITAL LETTER EL +- "lcy", 0x0043B, // CYRILLIC SMALL LETTER EL +- "ldca", 0x02936, // ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +- "ldquo", 0x0201C, // LEFT DOUBLE QUOTATION MARK +- "ldquor", 0x0201E, // DOUBLE LOW-9 QUOTATION MARK +- "ldrdhar", 0x02967, // LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +- "ldrushar", 0x0294B, // LEFT BARB DOWN RIGHT BARB UP HARPOON +- "ldsh", 0x021B2, // DOWNWARDS ARROW WITH TIP LEFTWARDS +- "le", 0x02264, // LESS-THAN OR EQUAL TO +- "lE", 0x02266, // LESS-THAN OVER EQUAL TO +- "LeftAngleBracket", 0x027E8, // MATHEMATICAL LEFT ANGLE BRACKET +- "leftarrow", 0x02190, // LEFTWARDS ARROW +- "LeftArrow", 0x02190, // LEFTWARDS ARROW +- "Leftarrow", 0x021D0, // LEFTWARDS DOUBLE ARROW +- "LeftArrowBar", 0x021E4, // LEFTWARDS ARROW TO BAR +- "LeftArrowRightArrow", 0x021C6, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW +- "leftarrowtail", 0x021A2, // LEFTWARDS ARROW WITH TAIL +- "LeftCeiling", 0x02308, // LEFT CEILING +- "LeftDoubleBracket", 0x027E6, // MATHEMATICAL LEFT WHITE SQUARE BRACKET +- "LeftDownTeeVector", 0x02961, // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +- "LeftDownVector", 0x021C3, // DOWNWARDS HARPOON WITH BARB LEFTWARDS +- "LeftDownVectorBar", 0x02959, // DOWNWARDS HARPOON WITH BARB LEFT TO BAR +- "LeftFloor", 0x0230A, // LEFT FLOOR +- "leftharpoondown", 0x021BD, // LEFTWARDS HARPOON WITH BARB DOWNWARDS +- "leftharpoonup", 0x021BC, // LEFTWARDS HARPOON WITH BARB UPWARDS +- "leftleftarrows", 0x021C7, // LEFTWARDS PAIRED ARROWS +- "leftrightarrow", 0x02194, // LEFT RIGHT ARROW +- "LeftRightArrow", 0x02194, // LEFT RIGHT ARROW +- "Leftrightarrow", 0x021D4, // LEFT RIGHT DOUBLE ARROW +- "leftrightarrows", 0x021C6, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW +- "leftrightharpoons", 0x021CB, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +- "leftrightsquigarrow", 0x021AD, // LEFT RIGHT WAVE ARROW +- "LeftRightVector", 0x0294E, // LEFT BARB UP RIGHT BARB UP HARPOON +- "LeftTee", 0x022A3, // LEFT TACK +- "LeftTeeArrow", 0x021A4, // LEFTWARDS ARROW FROM BAR +- "LeftTeeVector", 0x0295A, // LEFTWARDS HARPOON WITH BARB UP FROM BAR +- "leftthreetimes", 0x022CB, // LEFT SEMIDIRECT PRODUCT +- "LeftTriangle", 0x022B2, // NORMAL SUBGROUP OF +- "LeftTriangleBar", 0x029CF, // LEFT TRIANGLE BESIDE VERTICAL BAR +- "LeftTriangleEqual", 0x022B4, // NORMAL SUBGROUP OF OR EQUAL TO +- "LeftUpDownVector", 0x02951, // UP BARB LEFT DOWN BARB LEFT HARPOON +- "LeftUpTeeVector", 0x02960, // UPWARDS HARPOON WITH BARB LEFT FROM BAR +- "LeftUpVector", 0x021BF, // UPWARDS HARPOON WITH BARB LEFTWARDS +- "LeftUpVectorBar", 0x02958, // UPWARDS HARPOON WITH BARB LEFT TO BAR +- "LeftVector", 0x021BC, // LEFTWARDS HARPOON WITH BARB UPWARDS +- "LeftVectorBar", 0x02952, // LEFTWARDS HARPOON WITH BARB UP TO BAR +- "leg", 0x022DA, // LESS-THAN EQUAL TO OR GREATER-THAN +- "lEg", 0x02A8B, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +- "leq", 0x02264, // LESS-THAN OR EQUAL TO +- "leqq", 0x02266, // LESS-THAN OVER EQUAL TO +- "leqslant", 0x02A7D, // LESS-THAN OR SLANTED EQUAL TO +- "les", 0x02A7D, // LESS-THAN OR SLANTED EQUAL TO +- "lescc", 0x02AA8, // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +- "lesdot", 0x02A7F, // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +- "lesdoto", 0x02A81, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +- "lesdotor", 0x02A83, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +-// "lesg", 0x022DA;0x0FE00, // LESS-THAN slanted EQUAL TO OR GREATER-THAN +- "lesges", 0x02A93, // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +- "lessapprox", 0x02A85, // LESS-THAN OR APPROXIMATE +- "lessdot", 0x022D6, // LESS-THAN WITH DOT +- "lesseqgtr", 0x022DA, // LESS-THAN EQUAL TO OR GREATER-THAN +- "lesseqqgtr", 0x02A8B, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +- "LessEqualGreater", 0x022DA, // LESS-THAN EQUAL TO OR GREATER-THAN +- "LessFullEqual", 0x02266, // LESS-THAN OVER EQUAL TO +- "LessGreater", 0x02276, // LESS-THAN OR GREATER-THAN +- "lessgtr", 0x02276, // LESS-THAN OR GREATER-THAN +- "LessLess", 0x02AA1, // DOUBLE NESTED LESS-THAN +- "lesssim", 0x02272, // LESS-THAN OR EQUIVALENT TO +- "LessSlantEqual", 0x02A7D, // LESS-THAN OR SLANTED EQUAL TO +- "LessTilde", 0x02272, // LESS-THAN OR EQUIVALENT TO +- "lfisht", 0x0297C, // LEFT FISH TAIL +- "lfloor", 0x0230A, // LEFT FLOOR +- "Lfr", 0x1D50F, // MATHEMATICAL FRAKTUR CAPITAL L +- "lfr", 0x1D529, // MATHEMATICAL FRAKTUR SMALL L +- "lg", 0x02276, // LESS-THAN OR GREATER-THAN +- "lgE", 0x02A91, // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +- "Lgr", 0x0039B, // GREEK CAPITAL LETTER LAMDA +- "lgr", 0x003BB, // GREEK SMALL LETTER LAMDA +- "lHar", 0x02962, // LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +- "lhard", 0x021BD, // LEFTWARDS HARPOON WITH BARB DOWNWARDS +- "lharu", 0x021BC, // LEFTWARDS HARPOON WITH BARB UPWARDS +- "lharul", 0x0296A, // LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +- "lhblk", 0x02584, // LOWER HALF BLOCK +- "LJcy", 0x00409, // CYRILLIC CAPITAL LETTER LJE +- "ljcy", 0x00459, // CYRILLIC SMALL LETTER LJE +- "ll", 0x0226A, // MUCH LESS-THAN +- "Ll", 0x022D8, // VERY MUCH LESS-THAN +- "llarr", 0x021C7, // LEFTWARDS PAIRED ARROWS +- "llcorner", 0x0231E, // BOTTOM LEFT CORNER +- "Lleftarrow", 0x021DA, // LEFTWARDS TRIPLE ARROW +- "llhard", 0x0296B, // LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +- "lltri", 0x025FA, // LOWER LEFT TRIANGLE +- "Lmidot", 0x0013F, // LATIN CAPITAL LETTER L WITH MIDDLE DOT +- "lmidot", 0x00140, // LATIN SMALL LETTER L WITH MIDDLE DOT +- "lmoust", 0x023B0, // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +- "lmoustache", 0x023B0, // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +- "lnap", 0x02A89, // LESS-THAN AND NOT APPROXIMATE +- "lnapprox", 0x02A89, // LESS-THAN AND NOT APPROXIMATE +- "lnE", 0x02268, // LESS-THAN BUT NOT EQUAL TO +- "lne", 0x02A87, // LESS-THAN AND SINGLE-LINE NOT EQUAL TO +- "lneq", 0x02A87, // LESS-THAN AND SINGLE-LINE NOT EQUAL TO +- "lneqq", 0x02268, // LESS-THAN BUT NOT EQUAL TO +- "lnsim", 0x022E6, // LESS-THAN BUT NOT EQUIVALENT TO +- "loang", 0x027EC, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +- "loarr", 0x021FD, // LEFTWARDS OPEN-HEADED ARROW +- "lobrk", 0x027E6, // MATHEMATICAL LEFT WHITE SQUARE BRACKET +- "longleftarrow", 0x027F5, // LONG LEFTWARDS ARROW +- "LongLeftArrow", 0x027F5, // LONG LEFTWARDS ARROW +- "Longleftarrow", 0x027F8, // LONG LEFTWARDS DOUBLE ARROW +- "longleftrightarrow", 0x027F7, // LONG LEFT RIGHT ARROW +- "LongLeftRightArrow", 0x027F7, // LONG LEFT RIGHT ARROW +- "Longleftrightarrow", 0x027FA, // LONG LEFT RIGHT DOUBLE ARROW +- "longmapsto", 0x027FC, // LONG RIGHTWARDS ARROW FROM BAR +- "longrightarrow", 0x027F6, // LONG RIGHTWARDS ARROW +- "LongRightArrow", 0x027F6, // LONG RIGHTWARDS ARROW +- "Longrightarrow", 0x027F9, // LONG RIGHTWARDS DOUBLE ARROW +- "looparrowleft", 0x021AB, // LEFTWARDS ARROW WITH LOOP +- "looparrowright", 0x021AC, // RIGHTWARDS ARROW WITH LOOP +- "lopar", 0x02985, // LEFT WHITE PARENTHESIS +- "Lopf", 0x1D543, // MATHEMATICAL DOUBLE-STRUCK CAPITAL L +- "lopf", 0x1D55D, // MATHEMATICAL DOUBLE-STRUCK SMALL L +- "loplus", 0x02A2D, // PLUS SIGN IN LEFT HALF CIRCLE +- "lotimes", 0x02A34, // MULTIPLICATION SIGN IN LEFT HALF CIRCLE +- "lowast", 0x02217, // ASTERISK OPERATOR +- "lowbar", 0x0005F, // LOW LINE +- "LowerLeftArrow", 0x02199, // SOUTH WEST ARROW +- "LowerRightArrow", 0x02198, // SOUTH EAST ARROW +- "loz", 0x025CA, // LOZENGE +- "lozenge", 0x025CA, // LOZENGE +- "lozf", 0x029EB, // BLACK LOZENGE +- "lpar", 0x00028, // LEFT PARENTHESIS +- "lparlt", 0x02993, // LEFT ARC LESS-THAN BRACKET +- "lrarr", 0x021C6, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW +- "lrcorner", 0x0231F, // BOTTOM RIGHT CORNER +- "lrhar", 0x021CB, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +- "lrhard", 0x0296D, // RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +- "lrm", 0x0200E, // LEFT-TO-RIGHT MARK +- "lrtri", 0x022BF, // RIGHT TRIANGLE +- "lsaquo", 0x02039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK +- "Lscr", 0x02112, // SCRIPT CAPITAL L +- "lscr", 0x1D4C1, // MATHEMATICAL SCRIPT SMALL L +- "lsh", 0x021B0, // UPWARDS ARROW WITH TIP LEFTWARDS +- "Lsh", 0x021B0, // UPWARDS ARROW WITH TIP LEFTWARDS +- "lsim", 0x02272, // LESS-THAN OR EQUIVALENT TO +- "lsime", 0x02A8D, // LESS-THAN ABOVE SIMILAR OR EQUAL +- "lsimg", 0x02A8F, // LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +- "lsqb", 0x0005B, // LEFT SQUARE BRACKET +- "lsquo", 0x02018, // LEFT SINGLE QUOTATION MARK +- "lsquor", 0x0201A, // SINGLE LOW-9 QUOTATION MARK +- "Lstrok", 0x00141, // LATIN CAPITAL LETTER L WITH STROKE +- "lstrok", 0x00142, // LATIN SMALL LETTER L WITH STROKE +- "lt", 0x0003C, // LESS-THAN SIGN +- "LT", 0x0003C, // LESS-THAN SIGN +- "Lt", 0x0226A, // MUCH LESS-THAN +- "ltcc", 0x02AA6, // LESS-THAN CLOSED BY CURVE +- "ltcir", 0x02A79, // LESS-THAN WITH CIRCLE INSIDE +- "ltdot", 0x022D6, // LESS-THAN WITH DOT +- "lthree", 0x022CB, // LEFT SEMIDIRECT PRODUCT +- "ltimes", 0x022C9, // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +- "ltlarr", 0x02976, // LESS-THAN ABOVE LEFTWARDS ARROW +- "ltquest", 0x02A7B, // LESS-THAN WITH QUESTION MARK ABOVE +- "ltri", 0x025C3, // WHITE LEFT-POINTING SMALL TRIANGLE +- "ltrie", 0x022B4, // NORMAL SUBGROUP OF OR EQUAL TO +- "ltrif", 0x025C2, // BLACK LEFT-POINTING SMALL TRIANGLE +- "ltrPar", 0x02996, // DOUBLE RIGHT ARC LESS-THAN BRACKET +- "lurdshar", 0x0294A, // LEFT BARB UP RIGHT BARB DOWN HARPOON +- "luruhar", 0x02966, // LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +-// "lvertneqq", 0x02268;0x0FE00, // LESS-THAN BUT NOT EQUAL TO - with vertical stroke +-// "lvnE", 0x02268;0x0FE00, // LESS-THAN BUT NOT EQUAL TO - with vertical stroke +- NULL, 0 ++ {"lAarr", 0x021DA}, // LEFTWARDS TRIPLE ARROW ++ {"Lacute", 0x00139}, // LATIN CAPITAL LETTER L WITH ACUTE ++ {"lacute", 0x0013A}, // LATIN SMALL LETTER L WITH ACUTE ++ {"laemptyv", 0x029B4}, // EMPTY SET WITH LEFT ARROW ABOVE ++ {"lagran", 0x02112}, // SCRIPT CAPITAL L ++ {"Lambda", 0x0039B}, // GREEK CAPITAL LETTER LAMDA ++ {"lambda", 0x003BB}, // GREEK SMALL LETTER LAMDA ++ {"lang", 0x027E8}, // MATHEMATICAL LEFT ANGLE BRACKET ++ {"Lang", 0x027EA}, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET ++ {"langd", 0x02991}, // LEFT ANGLE BRACKET WITH DOT ++ {"langle", 0x027E8}, // MATHEMATICAL LEFT ANGLE BRACKET ++ {"lap", 0x02A85}, // LESS-THAN OR APPROXIMATE ++ {"Laplacetrf", 0x02112}, // SCRIPT CAPITAL L ++ {"laquo", 0x000AB}, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK ++ {"larr", 0x02190}, // LEFTWARDS ARROW ++ {"Larr", 0x0219E}, // LEFTWARDS TWO HEADED ARROW ++ {"lArr", 0x021D0}, // LEFTWARDS DOUBLE ARROW ++ {"larrb", 0x021E4}, // LEFTWARDS ARROW TO BAR ++ {"larrbfs", 0x0291F}, // LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND ++ {"larrfs", 0x0291D}, // LEFTWARDS ARROW TO BLACK DIAMOND ++ {"larrhk", 0x021A9}, // LEFTWARDS ARROW WITH HOOK ++ {"larrlp", 0x021AB}, // LEFTWARDS ARROW WITH LOOP ++ {"larrpl", 0x02939}, // LEFT-SIDE ARC ANTICLOCKWISE ARROW ++ {"larrsim", 0x02973}, // LEFTWARDS ARROW ABOVE TILDE OPERATOR ++ {"larrtl", 0x021A2}, // LEFTWARDS ARROW WITH TAIL ++ {"lat", 0x02AAB}, // LARGER THAN ++ {"latail", 0x02919}, // LEFTWARDS ARROW-TAIL ++ {"lAtail", 0x0291B}, // LEFTWARDS DOUBLE ARROW-TAIL ++ {"late", 0x02AAD}, // LARGER THAN OR EQUAL TO ++// "lates", 0x02AAD;0x0FE00}, // LARGER THAN OR slanted EQUAL ++ {"lbarr", 0x0290C}, // LEFTWARDS DOUBLE DASH ARROW ++ {"lBarr", 0x0290E}, // LEFTWARDS TRIPLE DASH ARROW ++ {"lbbrk", 0x02772}, // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT ++ {"lbrace", 0x0007B}, // LEFT CURLY BRACKET ++ {"lbrack", 0x0005B}, // LEFT SQUARE BRACKET ++ {"lbrke", 0x0298B}, // LEFT SQUARE BRACKET WITH UNDERBAR ++ {"lbrksld", 0x0298F}, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER ++ {"lbrkslu", 0x0298D}, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER ++ {"Lcaron", 0x0013D}, // LATIN CAPITAL LETTER L WITH CARON ++ {"lcaron", 0x0013E}, // LATIN SMALL LETTER L WITH CARON ++ {"Lcedil", 0x0013B}, // LATIN CAPITAL LETTER L WITH CEDILLA ++ {"lcedil", 0x0013C}, // LATIN SMALL LETTER L WITH CEDILLA ++ {"lceil", 0x02308}, // LEFT CEILING ++ {"lcub", 0x0007B}, // LEFT CURLY BRACKET ++ {"Lcy", 0x0041B}, // CYRILLIC CAPITAL LETTER EL ++ {"lcy", 0x0043B}, // CYRILLIC SMALL LETTER EL ++ {"ldca", 0x02936}, // ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS ++ {"ldquo", 0x0201C}, // LEFT DOUBLE QUOTATION MARK ++ {"ldquor", 0x0201E}, // DOUBLE LOW-9 QUOTATION MARK ++ {"ldrdhar", 0x02967}, // LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN ++ {"ldrushar", 0x0294B}, // LEFT BARB DOWN RIGHT BARB UP HARPOON ++ {"ldsh", 0x021B2}, // DOWNWARDS ARROW WITH TIP LEFTWARDS ++ {"le", 0x02264}, // LESS-THAN OR EQUAL TO ++ {"lE", 0x02266}, // LESS-THAN OVER EQUAL TO ++ {"LeftAngleBracket", 0x027E8}, // MATHEMATICAL LEFT ANGLE BRACKET ++ {"leftarrow", 0x02190}, // LEFTWARDS ARROW ++ {"LeftArrow", 0x02190}, // LEFTWARDS ARROW ++ {"Leftarrow", 0x021D0}, // LEFTWARDS DOUBLE ARROW ++ {"LeftArrowBar", 0x021E4}, // LEFTWARDS ARROW TO BAR ++ {"LeftArrowRightArrow", 0x021C6}, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW ++ {"leftarrowtail", 0x021A2}, // LEFTWARDS ARROW WITH TAIL ++ {"LeftCeiling", 0x02308}, // LEFT CEILING ++ {"LeftDoubleBracket", 0x027E6}, // MATHEMATICAL LEFT WHITE SQUARE BRACKET ++ {"LeftDownTeeVector", 0x02961}, // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR ++ {"LeftDownVector", 0x021C3}, // DOWNWARDS HARPOON WITH BARB LEFTWARDS ++ {"LeftDownVectorBar", 0x02959}, // DOWNWARDS HARPOON WITH BARB LEFT TO BAR ++ {"LeftFloor", 0x0230A}, // LEFT FLOOR ++ {"leftharpoondown", 0x021BD}, // LEFTWARDS HARPOON WITH BARB DOWNWARDS ++ {"leftharpoonup", 0x021BC}, // LEFTWARDS HARPOON WITH BARB UPWARDS ++ {"leftleftarrows", 0x021C7}, // LEFTWARDS PAIRED ARROWS ++ {"leftrightarrow", 0x02194}, // LEFT RIGHT ARROW ++ {"LeftRightArrow", 0x02194}, // LEFT RIGHT ARROW ++ {"Leftrightarrow", 0x021D4}, // LEFT RIGHT DOUBLE ARROW ++ {"leftrightarrows", 0x021C6}, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW ++ {"leftrightharpoons", 0x021CB}, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON ++ {"leftrightsquigarrow", 0x021AD}, // LEFT RIGHT WAVE ARROW ++ {"LeftRightVector", 0x0294E}, // LEFT BARB UP RIGHT BARB UP HARPOON ++ {"LeftTee", 0x022A3}, // LEFT TACK ++ {"LeftTeeArrow", 0x021A4}, // LEFTWARDS ARROW FROM BAR ++ {"LeftTeeVector", 0x0295A}, // LEFTWARDS HARPOON WITH BARB UP FROM BAR ++ {"leftthreetimes", 0x022CB}, // LEFT SEMIDIRECT PRODUCT ++ {"LeftTriangle", 0x022B2}, // NORMAL SUBGROUP OF ++ {"LeftTriangleBar", 0x029CF}, // LEFT TRIANGLE BESIDE VERTICAL BAR ++ {"LeftTriangleEqual", 0x022B4}, // NORMAL SUBGROUP OF OR EQUAL TO ++ {"LeftUpDownVector", 0x02951}, // UP BARB LEFT DOWN BARB LEFT HARPOON ++ {"LeftUpTeeVector", 0x02960}, // UPWARDS HARPOON WITH BARB LEFT FROM BAR ++ {"LeftUpVector", 0x021BF}, // UPWARDS HARPOON WITH BARB LEFTWARDS ++ {"LeftUpVectorBar", 0x02958}, // UPWARDS HARPOON WITH BARB LEFT TO BAR ++ {"LeftVector", 0x021BC}, // LEFTWARDS HARPOON WITH BARB UPWARDS ++ {"LeftVectorBar", 0x02952}, // LEFTWARDS HARPOON WITH BARB UP TO BAR ++ {"leg", 0x022DA}, // LESS-THAN EQUAL TO OR GREATER-THAN ++ {"lEg", 0x02A8B}, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN ++ {"leq", 0x02264}, // LESS-THAN OR EQUAL TO ++ {"leqq", 0x02266}, // LESS-THAN OVER EQUAL TO ++ {"leqslant", 0x02A7D}, // LESS-THAN OR SLANTED EQUAL TO ++ {"les", 0x02A7D}, // LESS-THAN OR SLANTED EQUAL TO ++ {"lescc", 0x02AA8}, // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL ++ {"lesdot", 0x02A7F}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE ++ {"lesdoto", 0x02A81}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE ++ {"lesdotor", 0x02A83}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT ++// "lesg", 0x022DA;0x0FE00}, // LESS-THAN slanted EQUAL TO OR GREATER-THAN ++ {"lesges", 0x02A93}, // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL ++ {"lessapprox", 0x02A85}, // LESS-THAN OR APPROXIMATE ++ {"lessdot", 0x022D6}, // LESS-THAN WITH DOT ++ {"lesseqgtr", 0x022DA}, // LESS-THAN EQUAL TO OR GREATER-THAN ++ {"lesseqqgtr", 0x02A8B}, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN ++ {"LessEqualGreater", 0x022DA}, // LESS-THAN EQUAL TO OR GREATER-THAN ++ {"LessFullEqual", 0x02266}, // LESS-THAN OVER EQUAL TO ++ {"LessGreater", 0x02276}, // LESS-THAN OR GREATER-THAN ++ {"lessgtr", 0x02276}, // LESS-THAN OR GREATER-THAN ++ {"LessLess", 0x02AA1}, // DOUBLE NESTED LESS-THAN ++ {"lesssim", 0x02272}, // LESS-THAN OR EQUIVALENT TO ++ {"LessSlantEqual", 0x02A7D}, // LESS-THAN OR SLANTED EQUAL TO ++ {"LessTilde", 0x02272}, // LESS-THAN OR EQUIVALENT TO ++ {"lfisht", 0x0297C}, // LEFT FISH TAIL ++ {"lfloor", 0x0230A}, // LEFT FLOOR ++ {"Lfr", 0x1D50F}, // MATHEMATICAL FRAKTUR CAPITAL L ++ {"lfr", 0x1D529}, // MATHEMATICAL FRAKTUR SMALL L ++ {"lg", 0x02276}, // LESS-THAN OR GREATER-THAN ++ {"lgE", 0x02A91}, // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL ++ {"Lgr", 0x0039B}, // GREEK CAPITAL LETTER LAMDA ++ {"lgr", 0x003BB}, // GREEK SMALL LETTER LAMDA ++ {"lHar", 0x02962}, // LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN ++ {"lhard", 0x021BD}, // LEFTWARDS HARPOON WITH BARB DOWNWARDS ++ {"lharu", 0x021BC}, // LEFTWARDS HARPOON WITH BARB UPWARDS ++ {"lharul", 0x0296A}, // LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH ++ {"lhblk", 0x02584}, // LOWER HALF BLOCK ++ {"LJcy", 0x00409}, // CYRILLIC CAPITAL LETTER LJE ++ {"ljcy", 0x00459}, // CYRILLIC SMALL LETTER LJE ++ {"ll", 0x0226A}, // MUCH LESS-THAN ++ {"Ll", 0x022D8}, // VERY MUCH LESS-THAN ++ {"llarr", 0x021C7}, // LEFTWARDS PAIRED ARROWS ++ {"llcorner", 0x0231E}, // BOTTOM LEFT CORNER ++ {"Lleftarrow", 0x021DA}, // LEFTWARDS TRIPLE ARROW ++ {"llhard", 0x0296B}, // LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH ++ {"lltri", 0x025FA}, // LOWER LEFT TRIANGLE ++ {"Lmidot", 0x0013F}, // LATIN CAPITAL LETTER L WITH MIDDLE DOT ++ {"lmidot", 0x00140}, // LATIN SMALL LETTER L WITH MIDDLE DOT ++ {"lmoust", 0x023B0}, // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION ++ {"lmoustache", 0x023B0}, // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION ++ {"lnap", 0x02A89}, // LESS-THAN AND NOT APPROXIMATE ++ {"lnapprox", 0x02A89}, // LESS-THAN AND NOT APPROXIMATE ++ {"lnE", 0x02268}, // LESS-THAN BUT NOT EQUAL TO ++ {"lne", 0x02A87}, // LESS-THAN AND SINGLE-LINE NOT EQUAL TO ++ {"lneq", 0x02A87}, // LESS-THAN AND SINGLE-LINE NOT EQUAL TO ++ {"lneqq", 0x02268}, // LESS-THAN BUT NOT EQUAL TO ++ {"lnsim", 0x022E6}, // LESS-THAN BUT NOT EQUIVALENT TO ++ {"loang", 0x027EC}, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET ++ {"loarr", 0x021FD}, // LEFTWARDS OPEN-HEADED ARROW ++ {"lobrk", 0x027E6}, // MATHEMATICAL LEFT WHITE SQUARE BRACKET ++ {"longleftarrow", 0x027F5}, // LONG LEFTWARDS ARROW ++ {"LongLeftArrow", 0x027F5}, // LONG LEFTWARDS ARROW ++ {"Longleftarrow", 0x027F8}, // LONG LEFTWARDS DOUBLE ARROW ++ {"longleftrightarrow", 0x027F7}, // LONG LEFT RIGHT ARROW ++ {"LongLeftRightArrow", 0x027F7}, // LONG LEFT RIGHT ARROW ++ {"Longleftrightarrow", 0x027FA}, // LONG LEFT RIGHT DOUBLE ARROW ++ {"longmapsto", 0x027FC}, // LONG RIGHTWARDS ARROW FROM BAR ++ {"longrightarrow", 0x027F6}, // LONG RIGHTWARDS ARROW ++ {"LongRightArrow", 0x027F6}, // LONG RIGHTWARDS ARROW ++ {"Longrightarrow", 0x027F9}, // LONG RIGHTWARDS DOUBLE ARROW ++ {"looparrowleft", 0x021AB}, // LEFTWARDS ARROW WITH LOOP ++ {"looparrowright", 0x021AC}, // RIGHTWARDS ARROW WITH LOOP ++ {"lopar", 0x02985}, // LEFT WHITE PARENTHESIS ++ {"Lopf", 0x1D543}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL L ++ {"lopf", 0x1D55D}, // MATHEMATICAL DOUBLE-STRUCK SMALL L ++ {"loplus", 0x02A2D}, // PLUS SIGN IN LEFT HALF CIRCLE ++ {"lotimes", 0x02A34}, // MULTIPLICATION SIGN IN LEFT HALF CIRCLE ++ {"lowast", 0x02217}, // ASTERISK OPERATOR ++ {"lowbar", 0x0005F}, // LOW LINE ++ {"LowerLeftArrow", 0x02199}, // SOUTH WEST ARROW ++ {"LowerRightArrow", 0x02198}, // SOUTH EAST ARROW ++ {"loz", 0x025CA}, // LOZENGE ++ {"lozenge", 0x025CA}, // LOZENGE ++ {"lozf", 0x029EB}, // BLACK LOZENGE ++ {"lpar", 0x00028}, // LEFT PARENTHESIS ++ {"lparlt", 0x02993}, // LEFT ARC LESS-THAN BRACKET ++ {"lrarr", 0x021C6}, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW ++ {"lrcorner", 0x0231F}, // BOTTOM RIGHT CORNER ++ {"lrhar", 0x021CB}, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON ++ {"lrhard", 0x0296D}, // RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH ++ {"lrm", 0x0200E}, // LEFT-TO-RIGHT MARK ++ {"lrtri", 0x022BF}, // RIGHT TRIANGLE ++ {"lsaquo", 0x02039}, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK ++ {"Lscr", 0x02112}, // SCRIPT CAPITAL L ++ {"lscr", 0x1D4C1}, // MATHEMATICAL SCRIPT SMALL L ++ {"lsh", 0x021B0}, // UPWARDS ARROW WITH TIP LEFTWARDS ++ {"Lsh", 0x021B0}, // UPWARDS ARROW WITH TIP LEFTWARDS ++ {"lsim", 0x02272}, // LESS-THAN OR EQUIVALENT TO ++ {"lsime", 0x02A8D}, // LESS-THAN ABOVE SIMILAR OR EQUAL ++ {"lsimg", 0x02A8F}, // LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN ++ {"lsqb", 0x0005B}, // LEFT SQUARE BRACKET ++ {"lsquo", 0x02018}, // LEFT SINGLE QUOTATION MARK ++ {"lsquor", 0x0201A}, // SINGLE LOW-9 QUOTATION MARK ++ {"Lstrok", 0x00141}, // LATIN CAPITAL LETTER L WITH STROKE ++ {"lstrok", 0x00142}, // LATIN SMALL LETTER L WITH STROKE ++ {"lt", 0x0003C}, // LESS-THAN SIGN ++ {"LT", 0x0003C}, // LESS-THAN SIGN ++ {"Lt", 0x0226A}, // MUCH LESS-THAN ++ {"ltcc", 0x02AA6}, // LESS-THAN CLOSED BY CURVE ++ {"ltcir", 0x02A79}, // LESS-THAN WITH CIRCLE INSIDE ++ {"ltdot", 0x022D6}, // LESS-THAN WITH DOT ++ {"lthree", 0x022CB}, // LEFT SEMIDIRECT PRODUCT ++ {"ltimes", 0x022C9}, // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT ++ {"ltlarr", 0x02976}, // LESS-THAN ABOVE LEFTWARDS ARROW ++ {"ltquest", 0x02A7B}, // LESS-THAN WITH QUESTION MARK ABOVE ++ {"ltri", 0x025C3}, // WHITE LEFT-POINTING SMALL TRIANGLE ++ {"ltrie", 0x022B4}, // NORMAL SUBGROUP OF OR EQUAL TO ++ {"ltrif", 0x025C2}, // BLACK LEFT-POINTING SMALL TRIANGLE ++ {"ltrPar", 0x02996}, // DOUBLE RIGHT ARC LESS-THAN BRACKET ++ {"lurdshar", 0x0294A}, // LEFT BARB UP RIGHT BARB DOWN HARPOON ++ {"luruhar", 0x02966}, // LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP ++// "lvertneqq", 0x02268;0x0FE00}, // LESS-THAN BUT NOT EQUAL TO - with vertical stroke ++// "lvnE", 0x02268;0x0FE00}, // LESS-THAN BUT NOT EQUAL TO - with vertical stroke ++ {NULL, 0} + }; + + static NameId namesM[]={ +- "macr", 0x000AF, // MACRON +- "male", 0x02642, // MALE SIGN +- "malt", 0x02720, // MALTESE CROSS +- "maltese", 0x02720, // MALTESE CROSS +- "map", 0x021A6, // RIGHTWARDS ARROW FROM BAR +- "Map", 0x02905, // RIGHTWARDS TWO-HEADED ARROW FROM BAR +- "mapsto", 0x021A6, // RIGHTWARDS ARROW FROM BAR +- "mapstodown", 0x021A7, // DOWNWARDS ARROW FROM BAR +- "mapstoleft", 0x021A4, // LEFTWARDS ARROW FROM BAR +- "mapstoup", 0x021A5, // UPWARDS ARROW FROM BAR +- "marker", 0x025AE, // BLACK VERTICAL RECTANGLE +- "mcomma", 0x02A29, // MINUS SIGN WITH COMMA ABOVE +- "Mcy", 0x0041C, // CYRILLIC CAPITAL LETTER EM +- "mcy", 0x0043C, // CYRILLIC SMALL LETTER EM +- "mdash", 0x02014, // EM DASH +- "mDDot", 0x0223A, // GEOMETRIC PROPORTION +- "measuredangle", 0x02221, // MEASURED ANGLE +- "MediumSpace", 0x0205F, // MEDIUM MATHEMATICAL SPACE +- "Mellintrf", 0x02133, // SCRIPT CAPITAL M +- "Mfr", 0x1D510, // MATHEMATICAL FRAKTUR CAPITAL M +- "mfr", 0x1D52A, // MATHEMATICAL FRAKTUR SMALL M +- "Mgr", 0x0039C, // GREEK CAPITAL LETTER MU +- "mgr", 0x003BC, // GREEK SMALL LETTER MU +- "mho", 0x02127, // INVERTED OHM SIGN +- "micro", 0x000B5, // MICRO SIGN +- "mid", 0x02223, // DIVIDES +- "midast", 0x0002A, // ASTERISK +- "midcir", 0x02AF0, // VERTICAL LINE WITH CIRCLE BELOW +- "middot", 0x000B7, // MIDDLE DOT +- "minus", 0x02212, // MINUS SIGN +- "minusb", 0x0229F, // SQUARED MINUS +- "minusd", 0x02238, // DOT MINUS +- "minusdu", 0x02A2A, // MINUS SIGN WITH DOT BELOW +- "MinusPlus", 0x02213, // MINUS-OR-PLUS SIGN +- "mlcp", 0x02ADB, // TRANSVERSAL INTERSECTION +- "mldr", 0x02026, // HORIZONTAL ELLIPSIS +- "mnplus", 0x02213, // MINUS-OR-PLUS SIGN +- "models", 0x022A7, // MODELS +- "Mopf", 0x1D544, // MATHEMATICAL DOUBLE-STRUCK CAPITAL M +- "mopf", 0x1D55E, // MATHEMATICAL DOUBLE-STRUCK SMALL M +- "mp", 0x02213, // MINUS-OR-PLUS SIGN +- "Mscr", 0x02133, // SCRIPT CAPITAL M +- "mscr", 0x1D4C2, // MATHEMATICAL SCRIPT SMALL M +- "mstpos", 0x0223E, // INVERTED LAZY S +- "Mu", 0x0039C, // GREEK CAPITAL LETTER MU +- "mu", 0x003BC, // GREEK SMALL LETTER MU +- "multimap", 0x022B8, // MULTIMAP +- "mumap", 0x022B8, // MULTIMAP +- NULL, 0 ++ {"macr", 0x000AF}, // MACRON ++ {"male", 0x02642}, // MALE SIGN ++ {"malt", 0x02720}, // MALTESE CROSS ++ {"maltese", 0x02720}, // MALTESE CROSS ++ {"map", 0x021A6}, // RIGHTWARDS ARROW FROM BAR ++ {"Map", 0x02905}, // RIGHTWARDS TWO-HEADED ARROW FROM BAR ++ {"mapsto", 0x021A6}, // RIGHTWARDS ARROW FROM BAR ++ {"mapstodown", 0x021A7}, // DOWNWARDS ARROW FROM BAR ++ {"mapstoleft", 0x021A4}, // LEFTWARDS ARROW FROM BAR ++ {"mapstoup", 0x021A5}, // UPWARDS ARROW FROM BAR ++ {"marker", 0x025AE}, // BLACK VERTICAL RECTANGLE ++ {"mcomma", 0x02A29}, // MINUS SIGN WITH COMMA ABOVE ++ {"Mcy", 0x0041C}, // CYRILLIC CAPITAL LETTER EM ++ {"mcy", 0x0043C}, // CYRILLIC SMALL LETTER EM ++ {"mdash", 0x02014}, // EM DASH ++ {"mDDot", 0x0223A}, // GEOMETRIC PROPORTION ++ {"measuredangle", 0x02221}, // MEASURED ANGLE ++ {"MediumSpace", 0x0205F}, // MEDIUM MATHEMATICAL SPACE ++ {"Mellintrf", 0x02133}, // SCRIPT CAPITAL M ++ {"Mfr", 0x1D510}, // MATHEMATICAL FRAKTUR CAPITAL M ++ {"mfr", 0x1D52A}, // MATHEMATICAL FRAKTUR SMALL M ++ {"Mgr", 0x0039C}, // GREEK CAPITAL LETTER MU ++ {"mgr", 0x003BC}, // GREEK SMALL LETTER MU ++ {"mho", 0x02127}, // INVERTED OHM SIGN ++ {"micro", 0x000B5}, // MICRO SIGN ++ {"mid", 0x02223}, // DIVIDES ++ {"midast", 0x0002A}, // ASTERISK ++ {"midcir", 0x02AF0}, // VERTICAL LINE WITH CIRCLE BELOW ++ {"middot", 0x000B7}, // MIDDLE DOT ++ {"minus", 0x02212}, // MINUS SIGN ++ {"minusb", 0x0229F}, // SQUARED MINUS ++ {"minusd", 0x02238}, // DOT MINUS ++ {"minusdu", 0x02A2A}, // MINUS SIGN WITH DOT BELOW ++ {"MinusPlus", 0x02213}, // MINUS-OR-PLUS SIGN ++ {"mlcp", 0x02ADB}, // TRANSVERSAL INTERSECTION ++ {"mldr", 0x02026}, // HORIZONTAL ELLIPSIS ++ {"mnplus", 0x02213}, // MINUS-OR-PLUS SIGN ++ {"models", 0x022A7}, // MODELS ++ {"Mopf", 0x1D544}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL M ++ {"mopf", 0x1D55E}, // MATHEMATICAL DOUBLE-STRUCK SMALL M ++ {"mp", 0x02213}, // MINUS-OR-PLUS SIGN ++ {"Mscr", 0x02133}, // SCRIPT CAPITAL M ++ {"mscr", 0x1D4C2}, // MATHEMATICAL SCRIPT SMALL M ++ {"mstpos", 0x0223E}, // INVERTED LAZY S ++ {"Mu", 0x0039C}, // GREEK CAPITAL LETTER MU ++ {"mu", 0x003BC}, // GREEK SMALL LETTER MU ++ {"multimap", 0x022B8}, // MULTIMAP ++ {"mumap", 0x022B8}, // MULTIMAP ++ {NULL, 0} + }; + + static NameId namesN[]={ +- "nabla", 0x02207, // NABLA +- "Nacute", 0x00143, // LATIN CAPITAL LETTER N WITH ACUTE +- "nacute", 0x00144, // LATIN SMALL LETTER N WITH ACUTE +-// "nang", 0x02220;0x020D2, // ANGLE with vertical line +- "nap", 0x02249, // NOT ALMOST EQUAL TO +-// "napE", 0x02A70;0x00338, // APPROXIMATELY EQUAL OR EQUAL TO with slash +-// "napid", 0x0224B;0x00338, // TRIPLE TILDE with slash +- "napos", 0x00149, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +- "napprox", 0x02249, // NOT ALMOST EQUAL TO +- "natur", 0x0266E, // MUSIC NATURAL SIGN +- "natural", 0x0266E, // MUSIC NATURAL SIGN +- "naturals", 0x02115, // DOUBLE-STRUCK CAPITAL N +- "nbsp", 0x000A0, // NO-BREAK SPACE +-// "nbump", 0x0224E;0x00338, // GEOMETRICALLY EQUIVALENT TO with slash +-// "nbumpe", 0x0224F;0x00338, // DIFFERENCE BETWEEN with slash +- "ncap", 0x02A43, // INTERSECTION WITH OVERBAR +- "Ncaron", 0x00147, // LATIN CAPITAL LETTER N WITH CARON +- "ncaron", 0x00148, // LATIN SMALL LETTER N WITH CARON +- "Ncedil", 0x00145, // LATIN CAPITAL LETTER N WITH CEDILLA +- "ncedil", 0x00146, // LATIN SMALL LETTER N WITH CEDILLA +- "ncong", 0x02247, // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +-// "ncongdot", 0x02A6D;0x00338, // CONGRUENT WITH DOT ABOVE with slash +- "ncup", 0x02A42, // UNION WITH OVERBAR +- "Ncy", 0x0041D, // CYRILLIC CAPITAL LETTER EN +- "ncy", 0x0043D, // CYRILLIC SMALL LETTER EN +- "ndash", 0x02013, // EN DASH +- "ne", 0x02260, // NOT EQUAL TO +- "nearhk", 0x02924, // NORTH EAST ARROW WITH HOOK +- "nearr", 0x02197, // NORTH EAST ARROW +- "neArr", 0x021D7, // NORTH EAST DOUBLE ARROW +- "nearrow", 0x02197, // NORTH EAST ARROW +-// "nedot", 0x02250;0x00338, // APPROACHES THE LIMIT with slash +- "NegativeMediumSpace", 0x0200B, // ZERO WIDTH SPACE +- "NegativeThickSpace", 0x0200B, // ZERO WIDTH SPACE +- "NegativeThinSpace", 0x0200B, // ZERO WIDTH SPACE +- "NegativeVeryThinSpace", 0x0200B, // ZERO WIDTH SPACE +- "nequiv", 0x02262, // NOT IDENTICAL TO +- "nesear", 0x02928, // NORTH EAST ARROW AND SOUTH EAST ARROW +-// "nesim", 0x02242;0x00338, // MINUS TILDE with slash +- "NestedGreaterGreater", 0x0226B, // MUCH GREATER-THAN +- "NestedLessLess", 0x0226A, // MUCH LESS-THAN +- "NewLine", 0x0000A, // LINE FEED (LF) +- "nexist", 0x02204, // THERE DOES NOT EXIST +- "nexists", 0x02204, // THERE DOES NOT EXIST +- "Nfr", 0x1D511, // MATHEMATICAL FRAKTUR CAPITAL N +- "nfr", 0x1D52B, // MATHEMATICAL FRAKTUR SMALL N +-// "ngE", 0x02267;0x00338, // GREATER-THAN OVER EQUAL TO with slash +- "nge", 0x02271, // NEITHER GREATER-THAN NOR EQUAL TO +- "ngeq", 0x02271, // NEITHER GREATER-THAN NOR EQUAL TO +-// "ngeqq", 0x02267;0x00338, // GREATER-THAN OVER EQUAL TO with slash +-// "ngeqslant", 0x02A7E;0x00338, // GREATER-THAN OR SLANTED EQUAL TO with slash +-// "nges", 0x02A7E;0x00338, // GREATER-THAN OR SLANTED EQUAL TO with slash +-// "nGg", 0x022D9;0x00338, // VERY MUCH GREATER-THAN with slash +- "Ngr", 0x0039D, // GREEK CAPITAL LETTER NU +- "ngr", 0x003BD, // GREEK SMALL LETTER NU +- "ngsim", 0x02275, // NEITHER GREATER-THAN NOR EQUIVALENT TO +-// "nGt", 0x0226B;0x020D2, // MUCH GREATER THAN with vertical line +- "ngt", 0x0226F, // NOT GREATER-THAN +- "ngtr", 0x0226F, // NOT GREATER-THAN +-// "nGtv", 0x0226B;0x00338, // MUCH GREATER THAN with slash +- "nharr", 0x021AE, // LEFT RIGHT ARROW WITH STROKE +- "nhArr", 0x021CE, // LEFT RIGHT DOUBLE ARROW WITH STROKE +- "nhpar", 0x02AF2, // PARALLEL WITH HORIZONTAL STROKE +- "ni", 0x0220B, // CONTAINS AS MEMBER +- "nis", 0x022FC, // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +- "nisd", 0x022FA, // CONTAINS WITH LONG HORIZONTAL STROKE +- "niv", 0x0220B, // CONTAINS AS MEMBER +- "NJcy", 0x0040A, // CYRILLIC CAPITAL LETTER NJE +- "njcy", 0x0045A, // CYRILLIC SMALL LETTER NJE +- "nlarr", 0x0219A, // LEFTWARDS ARROW WITH STROKE +- "nlArr", 0x021CD, // LEFTWARDS DOUBLE ARROW WITH STROKE +- "nldr", 0x02025, // TWO DOT LEADER +-// "nlE", 0x02266;0x00338, // LESS-THAN OVER EQUAL TO with slash +- "nle", 0x02270, // NEITHER LESS-THAN NOR EQUAL TO +- "nleftarrow", 0x0219A, // LEFTWARDS ARROW WITH STROKE +- "nLeftarrow", 0x021CD, // LEFTWARDS DOUBLE ARROW WITH STROKE +- "nleftrightarrow", 0x021AE, // LEFT RIGHT ARROW WITH STROKE +- "nLeftrightarrow", 0x021CE, // LEFT RIGHT DOUBLE ARROW WITH STROKE +- "nleq", 0x02270, // NEITHER LESS-THAN NOR EQUAL TO +-// "nleqq", 0x02266;0x00338, // LESS-THAN OVER EQUAL TO with slash +-// "nleqslant", 0x02A7D;0x00338, // LESS-THAN OR SLANTED EQUAL TO with slash +-// "nles", 0x02A7D;0x00338, // LESS-THAN OR SLANTED EQUAL TO with slash +- "nless", 0x0226E, // NOT LESS-THAN +-// "nLl", 0x022D8;0x00338, // VERY MUCH LESS-THAN with slash +- "nlsim", 0x02274, // NEITHER LESS-THAN NOR EQUIVALENT TO +-// "nLt", 0x0226A;0x020D2, // MUCH LESS THAN with vertical line +- "nlt", 0x0226E, // NOT LESS-THAN +- "nltri", 0x022EA, // NOT NORMAL SUBGROUP OF +- "nltrie", 0x022EC, // NOT NORMAL SUBGROUP OF OR EQUAL TO +-// "nLtv", 0x0226A;0x00338, // MUCH LESS THAN with slash +- "nmid", 0x02224, // DOES NOT DIVIDE +- "NoBreak", 0x02060, // WORD JOINER +- "NonBreakingSpace", 0x000A0, // NO-BREAK SPACE +- "Nopf", 0x02115, // DOUBLE-STRUCK CAPITAL N +- "nopf", 0x1D55F, // MATHEMATICAL DOUBLE-STRUCK SMALL N +- "not", 0x000AC, // NOT SIGN +- "Not", 0x02AEC, // DOUBLE STROKE NOT SIGN +- "NotCongruent", 0x02262, // NOT IDENTICAL TO +- "NotCupCap", 0x0226D, // NOT EQUIVALENT TO +- "NotDoubleVerticalBar", 0x02226, // NOT PARALLEL TO +- "NotElement", 0x02209, // NOT AN ELEMENT OF +- "NotEqual", 0x02260, // NOT EQUAL TO +-// "NotEqualTilde", 0x02242;0x00338, // MINUS TILDE with slash +- "NotExists", 0x02204, // THERE DOES NOT EXIST +- "NotGreater", 0x0226F, // NOT GREATER-THAN +- "NotGreaterEqual", 0x02271, // NEITHER GREATER-THAN NOR EQUAL TO +-// "NotGreaterFullEqual", 0x02267;0x00338, // GREATER-THAN OVER EQUAL TO with slash +-// "NotGreaterGreater", 0x0226B;0x00338, // MUCH GREATER THAN with slash +- "NotGreaterLess", 0x02279, // NEITHER GREATER-THAN NOR LESS-THAN +-// "NotGreaterSlantEqual", 0x02A7E;0x00338, // GREATER-THAN OR SLANTED EQUAL TO with slash +- "NotGreaterTilde", 0x02275, // NEITHER GREATER-THAN NOR EQUIVALENT TO +-// "NotHumpDownHump", 0x0224E;0x00338, // GEOMETRICALLY EQUIVALENT TO with slash +-// "NotHumpEqual", 0x0224F;0x00338, // DIFFERENCE BETWEEN with slash +- "notin", 0x02209, // NOT AN ELEMENT OF +-// "notindot", 0x022F5;0x00338, // ELEMENT OF WITH DOT ABOVE with slash +-// "notinE", 0x022F9;0x00338, // ELEMENT OF WITH TWO HORIZONTAL STROKES with slash +- "notinva", 0x02209, // NOT AN ELEMENT OF +- "notinvb", 0x022F7, // SMALL ELEMENT OF WITH OVERBAR +- "notinvc", 0x022F6, // ELEMENT OF WITH OVERBAR +- "NotLeftTriangle", 0x022EA, // NOT NORMAL SUBGROUP OF +-// "NotLeftTriangleBar", 0x029CF;0x00338, // LEFT TRIANGLE BESIDE VERTICAL BAR with slash +- "NotLeftTriangleEqual", 0x022EC, // NOT NORMAL SUBGROUP OF OR EQUAL TO +- "NotLess", 0x0226E, // NOT LESS-THAN +- "NotLessEqual", 0x02270, // NEITHER LESS-THAN NOR EQUAL TO +- "NotLessGreater", 0x02278, // NEITHER LESS-THAN NOR GREATER-THAN +-// "NotLessLess", 0x0226A;0x00338, // MUCH LESS THAN with slash +-// "NotLessSlantEqual", 0x02A7D;0x00338, // LESS-THAN OR SLANTED EQUAL TO with slash +- "NotLessTilde", 0x02274, // NEITHER LESS-THAN NOR EQUIVALENT TO +-// "NotNestedGreaterGreater", 0x02AA2;0x00338, // DOUBLE NESTED GREATER-THAN with slash +-// "NotNestedLessLess", 0x02AA1;0x00338, // DOUBLE NESTED LESS-THAN with slash +- "notni", 0x0220C, // DOES NOT CONTAIN AS MEMBER +- "notniva", 0x0220C, // DOES NOT CONTAIN AS MEMBER +- "notnivb", 0x022FE, // SMALL CONTAINS WITH OVERBAR +- "notnivc", 0x022FD, // CONTAINS WITH OVERBAR +- "NotPrecedes", 0x02280, // DOES NOT PRECEDE +-// "NotPrecedesEqual", 0x02AAF;0x00338, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +- "NotPrecedesSlantEqual", 0x022E0, // DOES NOT PRECEDE OR EQUAL +- "NotReverseElement", 0x0220C, // DOES NOT CONTAIN AS MEMBER +- "NotRightTriangle", 0x022EB, // DOES NOT CONTAIN AS NORMAL SUBGROUP +-// "NotRightTriangleBar", 0x029D0;0x00338, // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash +- "NotRightTriangleEqual", 0x022ED, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +-// "NotSquareSubset", 0x0228F;0x00338, // SQUARE IMAGE OF with slash +- "NotSquareSubsetEqual", 0x022E2, // NOT SQUARE IMAGE OF OR EQUAL TO +-// "NotSquareSuperset", 0x02290;0x00338, // SQUARE ORIGINAL OF with slash +- "NotSquareSupersetEqual", 0x022E3, // NOT SQUARE ORIGINAL OF OR EQUAL TO +-// "NotSubset", 0x02282;0x020D2, // SUBSET OF with vertical line +- "NotSubsetEqual", 0x02288, // NEITHER A SUBSET OF NOR EQUAL TO +- "NotSucceeds", 0x02281, // DOES NOT SUCCEED +-// "NotSucceedsEqual", 0x02AB0;0x00338, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +- "NotSucceedsSlantEqual", 0x022E1, // DOES NOT SUCCEED OR EQUAL +-// "NotSucceedsTilde", 0x0227F;0x00338, // SUCCEEDS OR EQUIVALENT TO with slash +-// "NotSuperset", 0x02283;0x020D2, // SUPERSET OF with vertical line +- "NotSupersetEqual", 0x02289, // NEITHER A SUPERSET OF NOR EQUAL TO +- "NotTilde", 0x02241, // NOT TILDE +- "NotTildeEqual", 0x02244, // NOT ASYMPTOTICALLY EQUAL TO +- "NotTildeFullEqual", 0x02247, // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +- "NotTildeTilde", 0x02249, // NOT ALMOST EQUAL TO +- "NotVerticalBar", 0x02224, // DOES NOT DIVIDE +- "npar", 0x02226, // NOT PARALLEL TO +- "nparallel", 0x02226, // NOT PARALLEL TO +-// "nparsl", 0x02AFD;0x020E5, // DOUBLE SOLIDUS OPERATOR with reverse slash +-// "npart", 0x02202;0x00338, // PARTIAL DIFFERENTIAL with slash +- "npolint", 0x02A14, // LINE INTEGRATION NOT INCLUDING THE POLE +- "npr", 0x02280, // DOES NOT PRECEDE +- "nprcue", 0x022E0, // DOES NOT PRECEDE OR EQUAL +-// "npre", 0x02AAF;0x00338, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +- "nprec", 0x02280, // DOES NOT PRECEDE +-// "npreceq", 0x02AAF;0x00338, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +- "nrarr", 0x0219B, // RIGHTWARDS ARROW WITH STROKE +- "nrArr", 0x021CF, // RIGHTWARDS DOUBLE ARROW WITH STROKE +-// "nrarrc", 0x02933;0x00338, // WAVE ARROW POINTING DIRECTLY RIGHT with slash +-// "nrarrw", 0x0219D;0x00338, // RIGHTWARDS WAVE ARROW with slash +- "nrightarrow", 0x0219B, // RIGHTWARDS ARROW WITH STROKE +- "nRightarrow", 0x021CF, // RIGHTWARDS DOUBLE ARROW WITH STROKE +- "nrtri", 0x022EB, // DOES NOT CONTAIN AS NORMAL SUBGROUP +- "nrtrie", 0x022ED, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +- "nsc", 0x02281, // DOES NOT SUCCEED +- "nsccue", 0x022E1, // DOES NOT SUCCEED OR EQUAL +-// "nsce", 0x02AB0;0x00338, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +- "Nscr", 0x1D4A9, // MATHEMATICAL SCRIPT CAPITAL N +- "nscr", 0x1D4C3, // MATHEMATICAL SCRIPT SMALL N +- "nshortmid", 0x02224, // DOES NOT DIVIDE +- "nshortparallel", 0x02226, // NOT PARALLEL TO +- "nsim", 0x02241, // NOT TILDE +- "nsime", 0x02244, // NOT ASYMPTOTICALLY EQUAL TO +- "nsimeq", 0x02244, // NOT ASYMPTOTICALLY EQUAL TO +- "nsmid", 0x02224, // DOES NOT DIVIDE +- "nspar", 0x02226, // NOT PARALLEL TO +- "nsqsube", 0x022E2, // NOT SQUARE IMAGE OF OR EQUAL TO +- "nsqsupe", 0x022E3, // NOT SQUARE ORIGINAL OF OR EQUAL TO +- "nsub", 0x02284, // NOT A SUBSET OF +- "nsube", 0x02288, // NEITHER A SUBSET OF NOR EQUAL TO +-// "nsubE", 0x02AC5;0x00338, // SUBSET OF ABOVE EQUALS SIGN with slash +-// "nsubset", 0x02282;0x020D2, // SUBSET OF with vertical line +- "nsubseteq", 0x02288, // NEITHER A SUBSET OF NOR EQUAL TO +-// "nsubseteqq", 0x02AC5;0x00338, // SUBSET OF ABOVE EQUALS SIGN with slash +- "nsucc", 0x02281, // DOES NOT SUCCEED +-// "nsucceq", 0x02AB0;0x00338, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +- "nsup", 0x02285, // NOT A SUPERSET OF +- "nsupe", 0x02289, // NEITHER A SUPERSET OF NOR EQUAL TO +-// "nsupE", 0x02AC6;0x00338, // SUPERSET OF ABOVE EQUALS SIGN with slash +-// "nsupset", 0x02283;0x020D2, // SUPERSET OF with vertical line +- "nsupseteq", 0x02289, // NEITHER A SUPERSET OF NOR EQUAL TO +-// "nsupseteqq", 0x02AC6;0x00338, // SUPERSET OF ABOVE EQUALS SIGN with slash +- "ntgl", 0x02279, // NEITHER GREATER-THAN NOR LESS-THAN +- "Ntilde", 0x000D1, // LATIN CAPITAL LETTER N WITH TILDE +- "ntilde", 0x000F1, // LATIN SMALL LETTER N WITH TILDE +- "ntlg", 0x02278, // NEITHER LESS-THAN NOR GREATER-THAN +- "ntriangleleft", 0x022EA, // NOT NORMAL SUBGROUP OF +- "ntrianglelefteq", 0x022EC, // NOT NORMAL SUBGROUP OF OR EQUAL TO +- "ntriangleright", 0x022EB, // DOES NOT CONTAIN AS NORMAL SUBGROUP +- "ntrianglerighteq", 0x022ED, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +- "Nu", 0x0039D, // GREEK CAPITAL LETTER NU +- "nu", 0x003BD, // GREEK SMALL LETTER NU +- "num", 0x00023, // NUMBER SIGN +- "numero", 0x02116, // NUMERO SIGN +- "numsp", 0x02007, // FIGURE SPACE +-// "nvap", 0x0224D;0x020D2, // EQUIVALENT TO with vertical line +- "nvdash", 0x022AC, // DOES NOT PROVE +- "nvDash", 0x022AD, // NOT TRUE +- "nVdash", 0x022AE, // DOES NOT FORCE +- "nVDash", 0x022AF, // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +-// "nvge", 0x02265;0x020D2, // GREATER-THAN OR EQUAL TO with vertical line +-// "nvgt", 0x0003E;0x020D2, // GREATER-THAN SIGN with vertical line +- "nvHarr", 0x02904, // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +- "nvinfin", 0x029DE, // INFINITY NEGATED WITH VERTICAL BAR +- "nvlArr", 0x02902, // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +-// "nvle", 0x02264;0x020D2, // LESS-THAN OR EQUAL TO with vertical line +-// "nvlt", 0x0003C;0x020D2, // LESS-THAN SIGN with vertical line +-// "nvltrie", 0x022B4;0x020D2, // NORMAL SUBGROUP OF OR EQUAL TO with vertical line +- "nvrArr", 0x02903, // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +-// "nvrtrie", 0x022B5;0x020D2, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line +-// "nvsim", 0x0223C;0x020D2, // TILDE OPERATOR with vertical line +- "nwarhk", 0x02923, // NORTH WEST ARROW WITH HOOK +- "nwarr", 0x02196, // NORTH WEST ARROW +- "nwArr", 0x021D6, // NORTH WEST DOUBLE ARROW +- "nwarrow", 0x02196, // NORTH WEST ARROW +- "nwnear", 0x02927, // NORTH WEST ARROW AND NORTH EAST ARROW +- NULL, 0 ++ {"nabla", 0x02207}, // NABLA ++ {"Nacute", 0x00143}, // LATIN CAPITAL LETTER N WITH ACUTE ++ {"nacute", 0x00144}, // LATIN SMALL LETTER N WITH ACUTE ++// "nang", 0x02220;0x020D2}, // ANGLE with vertical line ++ {"nap", 0x02249}, // NOT ALMOST EQUAL TO ++// "napE", 0x02A70;0x00338}, // APPROXIMATELY EQUAL OR EQUAL TO with slash ++// "napid", 0x0224B;0x00338}, // TRIPLE TILDE with slash ++ {"napos", 0x00149}, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE ++ {"napprox", 0x02249}, // NOT ALMOST EQUAL TO ++ {"natur", 0x0266E}, // MUSIC NATURAL SIGN ++ {"natural", 0x0266E}, // MUSIC NATURAL SIGN ++ {"naturals", 0x02115}, // DOUBLE-STRUCK CAPITAL N ++ {"nbsp", 0x000A0}, // NO-BREAK SPACE ++// "nbump", 0x0224E;0x00338}, // GEOMETRICALLY EQUIVALENT TO with slash ++// "nbumpe", 0x0224F;0x00338}, // DIFFERENCE BETWEEN with slash ++ {"ncap", 0x02A43}, // INTERSECTION WITH OVERBAR ++ {"Ncaron", 0x00147}, // LATIN CAPITAL LETTER N WITH CARON ++ {"ncaron", 0x00148}, // LATIN SMALL LETTER N WITH CARON ++ {"Ncedil", 0x00145}, // LATIN CAPITAL LETTER N WITH CEDILLA ++ {"ncedil", 0x00146}, // LATIN SMALL LETTER N WITH CEDILLA ++ {"ncong", 0x02247}, // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO ++// "ncongdot", 0x02A6D;0x00338}, // CONGRUENT WITH DOT ABOVE with slash ++ {"ncup", 0x02A42}, // UNION WITH OVERBAR ++ {"Ncy", 0x0041D}, // CYRILLIC CAPITAL LETTER EN ++ {"ncy", 0x0043D}, // CYRILLIC SMALL LETTER EN ++ {"ndash", 0x02013}, // EN DASH ++ {"ne", 0x02260}, // NOT EQUAL TO ++ {"nearhk", 0x02924}, // NORTH EAST ARROW WITH HOOK ++ {"nearr", 0x02197}, // NORTH EAST ARROW ++ {"neArr", 0x021D7}, // NORTH EAST DOUBLE ARROW ++ {"nearrow", 0x02197}, // NORTH EAST ARROW ++// "nedot", 0x02250;0x00338}, // APPROACHES THE LIMIT with slash ++ {"NegativeMediumSpace", 0x0200B}, // ZERO WIDTH SPACE ++ {"NegativeThickSpace", 0x0200B}, // ZERO WIDTH SPACE ++ {"NegativeThinSpace", 0x0200B}, // ZERO WIDTH SPACE ++ {"NegativeVeryThinSpace", 0x0200B}, // ZERO WIDTH SPACE ++ {"nequiv", 0x02262}, // NOT IDENTICAL TO ++ {"nesear", 0x02928}, // NORTH EAST ARROW AND SOUTH EAST ARROW ++// "nesim", 0x02242;0x00338}, // MINUS TILDE with slash ++ {"NestedGreaterGreater", 0x0226B}, // MUCH GREATER-THAN ++ {"NestedLessLess", 0x0226A}, // MUCH LESS-THAN ++ {"NewLine", 0x0000A}, // LINE FEED (LF) ++ {"nexist", 0x02204}, // THERE DOES NOT EXIST ++ {"nexists", 0x02204}, // THERE DOES NOT EXIST ++ {"Nfr", 0x1D511}, // MATHEMATICAL FRAKTUR CAPITAL N ++ {"nfr", 0x1D52B}, // MATHEMATICAL FRAKTUR SMALL N ++// "ngE", 0x02267;0x00338}, // GREATER-THAN OVER EQUAL TO with slash ++ {"nge", 0x02271}, // NEITHER GREATER-THAN NOR EQUAL TO ++ {"ngeq", 0x02271}, // NEITHER GREATER-THAN NOR EQUAL TO ++// "ngeqq", 0x02267;0x00338}, // GREATER-THAN OVER EQUAL TO with slash ++// "ngeqslant", 0x02A7E;0x00338}, // GREATER-THAN OR SLANTED EQUAL TO with slash ++// "nges", 0x02A7E;0x00338}, // GREATER-THAN OR SLANTED EQUAL TO with slash ++// "nGg", 0x022D9;0x00338}, // VERY MUCH GREATER-THAN with slash ++ {"Ngr", 0x0039D}, // GREEK CAPITAL LETTER NU ++ {"ngr", 0x003BD}, // GREEK SMALL LETTER NU ++ {"ngsim", 0x02275}, // NEITHER GREATER-THAN NOR EQUIVALENT TO ++// "nGt", 0x0226B;0x020D2}, // MUCH GREATER THAN with vertical line ++ {"ngt", 0x0226F}, // NOT GREATER-THAN ++ {"ngtr", 0x0226F}, // NOT GREATER-THAN ++// "nGtv", 0x0226B;0x00338}, // MUCH GREATER THAN with slash ++ {"nharr", 0x021AE}, // LEFT RIGHT ARROW WITH STROKE ++ {"nhArr", 0x021CE}, // LEFT RIGHT DOUBLE ARROW WITH STROKE ++ {"nhpar", 0x02AF2}, // PARALLEL WITH HORIZONTAL STROKE ++ {"ni", 0x0220B}, // CONTAINS AS MEMBER ++ {"nis", 0x022FC}, // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE ++ {"nisd", 0x022FA}, // CONTAINS WITH LONG HORIZONTAL STROKE ++ {"niv", 0x0220B}, // CONTAINS AS MEMBER ++ {"NJcy", 0x0040A}, // CYRILLIC CAPITAL LETTER NJE ++ {"njcy", 0x0045A}, // CYRILLIC SMALL LETTER NJE ++ {"nlarr", 0x0219A}, // LEFTWARDS ARROW WITH STROKE ++ {"nlArr", 0x021CD}, // LEFTWARDS DOUBLE ARROW WITH STROKE ++ {"nldr", 0x02025}, // TWO DOT LEADER ++// "nlE", 0x02266;0x00338}, // LESS-THAN OVER EQUAL TO with slash ++ {"nle", 0x02270}, // NEITHER LESS-THAN NOR EQUAL TO ++ {"nleftarrow", 0x0219A}, // LEFTWARDS ARROW WITH STROKE ++ {"nLeftarrow", 0x021CD}, // LEFTWARDS DOUBLE ARROW WITH STROKE ++ {"nleftrightarrow", 0x021AE}, // LEFT RIGHT ARROW WITH STROKE ++ {"nLeftrightarrow", 0x021CE}, // LEFT RIGHT DOUBLE ARROW WITH STROKE ++ {"nleq", 0x02270}, // NEITHER LESS-THAN NOR EQUAL TO ++// "nleqq", 0x02266;0x00338}, // LESS-THAN OVER EQUAL TO with slash ++// "nleqslant", 0x02A7D;0x00338}, // LESS-THAN OR SLANTED EQUAL TO with slash ++// "nles", 0x02A7D;0x00338}, // LESS-THAN OR SLANTED EQUAL TO with slash ++ {"nless", 0x0226E}, // NOT LESS-THAN ++// "nLl", 0x022D8;0x00338}, // VERY MUCH LESS-THAN with slash ++ {"nlsim", 0x02274}, // NEITHER LESS-THAN NOR EQUIVALENT TO ++// "nLt", 0x0226A;0x020D2}, // MUCH LESS THAN with vertical line ++ {"nlt", 0x0226E}, // NOT LESS-THAN ++ {"nltri", 0x022EA}, // NOT NORMAL SUBGROUP OF ++ {"nltrie", 0x022EC}, // NOT NORMAL SUBGROUP OF OR EQUAL TO ++// "nLtv", 0x0226A;0x00338}, // MUCH LESS THAN with slash ++ {"nmid", 0x02224}, // DOES NOT DIVIDE ++ {"NoBreak", 0x02060}, // WORD JOINER ++ {"NonBreakingSpace", 0x000A0}, // NO-BREAK SPACE ++ {"Nopf", 0x02115}, // DOUBLE-STRUCK CAPITAL N ++ {"nopf", 0x1D55F}, // MATHEMATICAL DOUBLE-STRUCK SMALL N ++ {"not", 0x000AC}, // NOT SIGN ++ {"Not", 0x02AEC}, // DOUBLE STROKE NOT SIGN ++ {"NotCongruent", 0x02262}, // NOT IDENTICAL TO ++ {"NotCupCap", 0x0226D}, // NOT EQUIVALENT TO ++ {"NotDoubleVerticalBar", 0x02226}, // NOT PARALLEL TO ++ {"NotElement", 0x02209}, // NOT AN ELEMENT OF ++ {"NotEqual", 0x02260}, // NOT EQUAL TO ++// "NotEqualTilde", 0x02242;0x00338}, // MINUS TILDE with slash ++ {"NotExists", 0x02204}, // THERE DOES NOT EXIST ++ {"NotGreater", 0x0226F}, // NOT GREATER-THAN ++ {"NotGreaterEqual", 0x02271}, // NEITHER GREATER-THAN NOR EQUAL TO ++// "NotGreaterFullEqual", 0x02267;0x00338}, // GREATER-THAN OVER EQUAL TO with slash ++// "NotGreaterGreater", 0x0226B;0x00338}, // MUCH GREATER THAN with slash ++ {"NotGreaterLess", 0x02279}, // NEITHER GREATER-THAN NOR LESS-THAN ++// "NotGreaterSlantEqual", 0x02A7E;0x00338}, // GREATER-THAN OR SLANTED EQUAL TO with slash ++ {"NotGreaterTilde", 0x02275}, // NEITHER GREATER-THAN NOR EQUIVALENT TO ++// "NotHumpDownHump", 0x0224E;0x00338}, // GEOMETRICALLY EQUIVALENT TO with slash ++// "NotHumpEqual", 0x0224F;0x00338}, // DIFFERENCE BETWEEN with slash ++ {"notin", 0x02209}, // NOT AN ELEMENT OF ++// "notindot", 0x022F5;0x00338}, // ELEMENT OF WITH DOT ABOVE with slash ++// "notinE", 0x022F9;0x00338}, // ELEMENT OF WITH TWO HORIZONTAL STROKES with slash ++ {"notinva", 0x02209}, // NOT AN ELEMENT OF ++ {"notinvb", 0x022F7}, // SMALL ELEMENT OF WITH OVERBAR ++ {"notinvc", 0x022F6}, // ELEMENT OF WITH OVERBAR ++ {"NotLeftTriangle", 0x022EA}, // NOT NORMAL SUBGROUP OF ++// "NotLeftTriangleBar", 0x029CF;0x00338}, // LEFT TRIANGLE BESIDE VERTICAL BAR with slash ++ {"NotLeftTriangleEqual", 0x022EC}, // NOT NORMAL SUBGROUP OF OR EQUAL TO ++ {"NotLess", 0x0226E}, // NOT LESS-THAN ++ {"NotLessEqual", 0x02270}, // NEITHER LESS-THAN NOR EQUAL TO ++ {"NotLessGreater", 0x02278}, // NEITHER LESS-THAN NOR GREATER-THAN ++// "NotLessLess", 0x0226A;0x00338}, // MUCH LESS THAN with slash ++// "NotLessSlantEqual", 0x02A7D;0x00338}, // LESS-THAN OR SLANTED EQUAL TO with slash ++ {"NotLessTilde", 0x02274}, // NEITHER LESS-THAN NOR EQUIVALENT TO ++// "NotNestedGreaterGreater", 0x02AA2;0x00338}, // DOUBLE NESTED GREATER-THAN with slash ++// "NotNestedLessLess", 0x02AA1;0x00338}, // DOUBLE NESTED LESS-THAN with slash ++ {"notni", 0x0220C}, // DOES NOT CONTAIN AS MEMBER ++ {"notniva", 0x0220C}, // DOES NOT CONTAIN AS MEMBER ++ {"notnivb", 0x022FE}, // SMALL CONTAINS WITH OVERBAR ++ {"notnivc", 0x022FD}, // CONTAINS WITH OVERBAR ++ {"NotPrecedes", 0x02280}, // DOES NOT PRECEDE ++// "NotPrecedesEqual", 0x02AAF;0x00338}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"NotPrecedesSlantEqual", 0x022E0}, // DOES NOT PRECEDE OR EQUAL ++ {"NotReverseElement", 0x0220C}, // DOES NOT CONTAIN AS MEMBER ++ {"NotRightTriangle", 0x022EB}, // DOES NOT CONTAIN AS NORMAL SUBGROUP ++// "NotRightTriangleBar", 0x029D0;0x00338}, // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash ++ {"NotRightTriangleEqual", 0x022ED}, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL ++// "NotSquareSubset", 0x0228F;0x00338}, // SQUARE IMAGE OF with slash ++ {"NotSquareSubsetEqual", 0x022E2}, // NOT SQUARE IMAGE OF OR EQUAL TO ++// "NotSquareSuperset", 0x02290;0x00338}, // SQUARE ORIGINAL OF with slash ++ {"NotSquareSupersetEqual", 0x022E3}, // NOT SQUARE ORIGINAL OF OR EQUAL TO ++// "NotSubset", 0x02282;0x020D2}, // SUBSET OF with vertical line ++ {"NotSubsetEqual", 0x02288}, // NEITHER A SUBSET OF NOR EQUAL TO ++ {"NotSucceeds", 0x02281}, // DOES NOT SUCCEED ++// "NotSucceedsEqual", 0x02AB0;0x00338}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"NotSucceedsSlantEqual", 0x022E1}, // DOES NOT SUCCEED OR EQUAL ++// "NotSucceedsTilde", 0x0227F;0x00338}, // SUCCEEDS OR EQUIVALENT TO with slash ++// "NotSuperset", 0x02283;0x020D2}, // SUPERSET OF with vertical line ++ {"NotSupersetEqual", 0x02289}, // NEITHER A SUPERSET OF NOR EQUAL TO ++ {"NotTilde", 0x02241}, // NOT TILDE ++ {"NotTildeEqual", 0x02244}, // NOT ASYMPTOTICALLY EQUAL TO ++ {"NotTildeFullEqual", 0x02247}, // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO ++ {"NotTildeTilde", 0x02249}, // NOT ALMOST EQUAL TO ++ {"NotVerticalBar", 0x02224}, // DOES NOT DIVIDE ++ {"npar", 0x02226}, // NOT PARALLEL TO ++ {"nparallel", 0x02226}, // NOT PARALLEL TO ++// "nparsl", 0x02AFD;0x020E5}, // DOUBLE SOLIDUS OPERATOR with reverse slash ++// "npart", 0x02202;0x00338}, // PARTIAL DIFFERENTIAL with slash ++ {"npolint", 0x02A14}, // LINE INTEGRATION NOT INCLUDING THE POLE ++ {"npr", 0x02280}, // DOES NOT PRECEDE ++ {"nprcue", 0x022E0}, // DOES NOT PRECEDE OR EQUAL ++// "npre", 0x02AAF;0x00338}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"nprec", 0x02280}, // DOES NOT PRECEDE ++// "npreceq", 0x02AAF;0x00338}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"nrarr", 0x0219B}, // RIGHTWARDS ARROW WITH STROKE ++ {"nrArr", 0x021CF}, // RIGHTWARDS DOUBLE ARROW WITH STROKE ++// "nrarrc", 0x02933;0x00338}, // WAVE ARROW POINTING DIRECTLY RIGHT with slash ++// "nrarrw", 0x0219D;0x00338}, // RIGHTWARDS WAVE ARROW with slash ++ {"nrightarrow", 0x0219B}, // RIGHTWARDS ARROW WITH STROKE ++ {"nRightarrow", 0x021CF}, // RIGHTWARDS DOUBLE ARROW WITH STROKE ++ {"nrtri", 0x022EB}, // DOES NOT CONTAIN AS NORMAL SUBGROUP ++ {"nrtrie", 0x022ED}, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL ++ {"nsc", 0x02281}, // DOES NOT SUCCEED ++ {"nsccue", 0x022E1}, // DOES NOT SUCCEED OR EQUAL ++// "nsce", 0x02AB0;0x00338}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"Nscr", 0x1D4A9}, // MATHEMATICAL SCRIPT CAPITAL N ++ {"nscr", 0x1D4C3}, // MATHEMATICAL SCRIPT SMALL N ++ {"nshortmid", 0x02224}, // DOES NOT DIVIDE ++ {"nshortparallel", 0x02226}, // NOT PARALLEL TO ++ {"nsim", 0x02241}, // NOT TILDE ++ {"nsime", 0x02244}, // NOT ASYMPTOTICALLY EQUAL TO ++ {"nsimeq", 0x02244}, // NOT ASYMPTOTICALLY EQUAL TO ++ {"nsmid", 0x02224}, // DOES NOT DIVIDE ++ {"nspar", 0x02226}, // NOT PARALLEL TO ++ {"nsqsube", 0x022E2}, // NOT SQUARE IMAGE OF OR EQUAL TO ++ {"nsqsupe", 0x022E3}, // NOT SQUARE ORIGINAL OF OR EQUAL TO ++ {"nsub", 0x02284}, // NOT A SUBSET OF ++ {"nsube", 0x02288}, // NEITHER A SUBSET OF NOR EQUAL TO ++// "nsubE", 0x02AC5;0x00338}, // SUBSET OF ABOVE EQUALS SIGN with slash ++// "nsubset", 0x02282;0x020D2}, // SUBSET OF with vertical line ++ {"nsubseteq", 0x02288}, // NEITHER A SUBSET OF NOR EQUAL TO ++// "nsubseteqq", 0x02AC5;0x00338}, // SUBSET OF ABOVE EQUALS SIGN with slash ++ {"nsucc", 0x02281}, // DOES NOT SUCCEED ++// "nsucceq", 0x02AB0;0x00338}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash ++ {"nsup", 0x02285}, // NOT A SUPERSET OF ++ {"nsupe", 0x02289}, // NEITHER A SUPERSET OF NOR EQUAL TO ++// "nsupE", 0x02AC6;0x00338}, // SUPERSET OF ABOVE EQUALS SIGN with slash ++// "nsupset", 0x02283;0x020D2}, // SUPERSET OF with vertical line ++ {"nsupseteq", 0x02289}, // NEITHER A SUPERSET OF NOR EQUAL TO ++// "nsupseteqq", 0x02AC6;0x00338}, // SUPERSET OF ABOVE EQUALS SIGN with slash ++ {"ntgl", 0x02279}, // NEITHER GREATER-THAN NOR LESS-THAN ++ {"Ntilde", 0x000D1}, // LATIN CAPITAL LETTER N WITH TILDE ++ {"ntilde", 0x000F1}, // LATIN SMALL LETTER N WITH TILDE ++ {"ntlg", 0x02278}, // NEITHER LESS-THAN NOR GREATER-THAN ++ {"ntriangleleft", 0x022EA}, // NOT NORMAL SUBGROUP OF ++ {"ntrianglelefteq", 0x022EC}, // NOT NORMAL SUBGROUP OF OR EQUAL TO ++ {"ntriangleright", 0x022EB}, // DOES NOT CONTAIN AS NORMAL SUBGROUP ++ {"ntrianglerighteq", 0x022ED}, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL ++ {"Nu", 0x0039D}, // GREEK CAPITAL LETTER NU ++ {"nu", 0x003BD}, // GREEK SMALL LETTER NU ++ {"num", 0x00023}, // NUMBER SIGN ++ {"numero", 0x02116}, // NUMERO SIGN ++ {"numsp", 0x02007}, // FIGURE SPACE ++// "nvap", 0x0224D;0x020D2}, // EQUIVALENT TO with vertical line ++ {"nvdash", 0x022AC}, // DOES NOT PROVE ++ {"nvDash", 0x022AD}, // NOT TRUE ++ {"nVdash", 0x022AE}, // DOES NOT FORCE ++ {"nVDash", 0x022AF}, // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE ++// "nvge", 0x02265;0x020D2}, // GREATER-THAN OR EQUAL TO with vertical line ++// "nvgt", 0x0003E;0x020D2}, // GREATER-THAN SIGN with vertical line ++ {"nvHarr", 0x02904}, // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE ++ {"nvinfin", 0x029DE}, // INFINITY NEGATED WITH VERTICAL BAR ++ {"nvlArr", 0x02902}, // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE ++// "nvle", 0x02264;0x020D2}, // LESS-THAN OR EQUAL TO with vertical line ++// "nvlt", 0x0003C;0x020D2}, // LESS-THAN SIGN with vertical line ++// "nvltrie", 0x022B4;0x020D2}, // NORMAL SUBGROUP OF OR EQUAL TO with vertical line ++ {"nvrArr", 0x02903}, // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE ++// "nvrtrie", 0x022B5;0x020D2}, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line ++// "nvsim", 0x0223C;0x020D2}, // TILDE OPERATOR with vertical line ++ {"nwarhk", 0x02923}, // NORTH WEST ARROW WITH HOOK ++ {"nwarr", 0x02196}, // NORTH WEST ARROW ++ {"nwArr", 0x021D6}, // NORTH WEST DOUBLE ARROW ++ {"nwarrow", 0x02196}, // NORTH WEST ARROW ++ {"nwnear", 0x02927}, // NORTH WEST ARROW AND NORTH EAST ARROW ++ {NULL, 0} + }; + + static NameId namesO[]={ +- "Oacgr", 0x0038C, // GREEK CAPITAL LETTER OMICRON WITH TONOS +- "oacgr", 0x003CC, // GREEK SMALL LETTER OMICRON WITH TONOS +- "Oacute", 0x000D3, // LATIN CAPITAL LETTER O WITH ACUTE +- "oacute", 0x000F3, // LATIN SMALL LETTER O WITH ACUTE +- "oast", 0x0229B, // CIRCLED ASTERISK OPERATOR +- "ocir", 0x0229A, // CIRCLED RING OPERATOR +- "Ocirc", 0x000D4, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX +- "ocirc", 0x000F4, // LATIN SMALL LETTER O WITH CIRCUMFLEX +- "Ocy", 0x0041E, // CYRILLIC CAPITAL LETTER O +- "ocy", 0x0043E, // CYRILLIC SMALL LETTER O +- "odash", 0x0229D, // CIRCLED DASH +- "Odblac", 0x00150, // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +- "odblac", 0x00151, // LATIN SMALL LETTER O WITH DOUBLE ACUTE +- "odiv", 0x02A38, // CIRCLED DIVISION SIGN +- "odot", 0x02299, // CIRCLED DOT OPERATOR +- "odsold", 0x029BC, // CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +- "OElig", 0x00152, // LATIN CAPITAL LIGATURE OE +- "oelig", 0x00153, // LATIN SMALL LIGATURE OE +- "ofcir", 0x029BF, // CIRCLED BULLET +- "Ofr", 0x1D512, // MATHEMATICAL FRAKTUR CAPITAL O +- "ofr", 0x1D52C, // MATHEMATICAL FRAKTUR SMALL O +- "ogon", 0x002DB, // OGONEK +- "Ogr", 0x0039F, // GREEK CAPITAL LETTER OMICRON +- "ogr", 0x003BF, // GREEK SMALL LETTER OMICRON +- "Ograve", 0x000D2, // LATIN CAPITAL LETTER O WITH GRAVE +- "ograve", 0x000F2, // LATIN SMALL LETTER O WITH GRAVE +- "ogt", 0x029C1, // CIRCLED GREATER-THAN +- "OHacgr", 0x0038F, // GREEK CAPITAL LETTER OMEGA WITH TONOS +- "ohacgr", 0x003CE, // GREEK SMALL LETTER OMEGA WITH TONOS +- "ohbar", 0x029B5, // CIRCLE WITH HORIZONTAL BAR +- "OHgr", 0x003A9, // GREEK CAPITAL LETTER OMEGA +- "ohgr", 0x003C9, // GREEK SMALL LETTER OMEGA +- "ohm", 0x003A9, // GREEK CAPITAL LETTER OMEGA +- "oint", 0x0222E, // CONTOUR INTEGRAL +- "olarr", 0x021BA, // ANTICLOCKWISE OPEN CIRCLE ARROW +- "olcir", 0x029BE, // CIRCLED WHITE BULLET +- "olcross", 0x029BB, // CIRCLE WITH SUPERIMPOSED X +- "oline", 0x0203E, // OVERLINE +- "olt", 0x029C0, // CIRCLED LESS-THAN +- "Omacr", 0x0014C, // LATIN CAPITAL LETTER O WITH MACRON +- "omacr", 0x0014D, // LATIN SMALL LETTER O WITH MACRON +- "Omega", 0x003A9, // GREEK CAPITAL LETTER OMEGA +- "omega", 0x003C9, // GREEK SMALL LETTER OMEGA +- "Omicron", 0x0039F, // GREEK CAPITAL LETTER OMICRON +- "omicron", 0x003BF, // GREEK SMALL LETTER OMICRON +- "omid", 0x029B6, // CIRCLED VERTICAL BAR +- "ominus", 0x02296, // CIRCLED MINUS +- "Oopf", 0x1D546, // MATHEMATICAL DOUBLE-STRUCK CAPITAL O +- "oopf", 0x1D560, // MATHEMATICAL DOUBLE-STRUCK SMALL O +- "opar", 0x029B7, // CIRCLED PARALLEL +- "OpenCurlyDoubleQuote", 0x0201C, // LEFT DOUBLE QUOTATION MARK +- "OpenCurlyQuote", 0x02018, // LEFT SINGLE QUOTATION MARK +- "operp", 0x029B9, // CIRCLED PERPENDICULAR +- "oplus", 0x02295, // CIRCLED PLUS +- "or", 0x02228, // LOGICAL OR +- "Or", 0x02A54, // DOUBLE LOGICAL OR +- "orarr", 0x021BB, // CLOCKWISE OPEN CIRCLE ARROW +- "ord", 0x02A5D, // LOGICAL OR WITH HORIZONTAL DASH +- "order", 0x02134, // SCRIPT SMALL O +- "orderof", 0x02134, // SCRIPT SMALL O +- "ordf", 0x000AA, // FEMININE ORDINAL INDICATOR +- "ordm", 0x000BA, // MASCULINE ORDINAL INDICATOR +- "origof", 0x022B6, // ORIGINAL OF +- "oror", 0x02A56, // TWO INTERSECTING LOGICAL OR +- "orslope", 0x02A57, // SLOPING LARGE OR +- "orv", 0x02A5B, // LOGICAL OR WITH MIDDLE STEM +- "oS", 0x024C8, // CIRCLED LATIN CAPITAL LETTER S +- "oscr", 0x02134, // SCRIPT SMALL O +- "Oscr", 0x1D4AA, // MATHEMATICAL SCRIPT CAPITAL O +- "Oslash", 0x000D8, // LATIN CAPITAL LETTER O WITH STROKE +- "oslash", 0x000F8, // LATIN SMALL LETTER O WITH STROKE +- "osol", 0x02298, // CIRCLED DIVISION SLASH +- "Otilde", 0x000D5, // LATIN CAPITAL LETTER O WITH TILDE +- "otilde", 0x000F5, // LATIN SMALL LETTER O WITH TILDE +- "otimes", 0x02297, // CIRCLED TIMES +- "Otimes", 0x02A37, // MULTIPLICATION SIGN IN DOUBLE CIRCLE +- "otimesas", 0x02A36, // CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +- "Ouml", 0x000D6, // LATIN CAPITAL LETTER O WITH DIAERESIS +- "ouml", 0x000F6, // LATIN SMALL LETTER O WITH DIAERESIS +- "ovbar", 0x0233D, // APL FUNCTIONAL SYMBOL CIRCLE STILE +- "OverBar", 0x0203E, // OVERLINE +- "OverBrace", 0x023DE, // TOP CURLY BRACKET +- "OverBracket", 0x023B4, // TOP SQUARE BRACKET +- "OverParenthesis", 0x023DC, // TOP PARENTHESIS +- NULL, 0 ++ {"Oacgr", 0x0038C}, // GREEK CAPITAL LETTER OMICRON WITH TONOS ++ {"oacgr", 0x003CC}, // GREEK SMALL LETTER OMICRON WITH TONOS ++ {"Oacute", 0x000D3}, // LATIN CAPITAL LETTER O WITH ACUTE ++ {"oacute", 0x000F3}, // LATIN SMALL LETTER O WITH ACUTE ++ {"oast", 0x0229B}, // CIRCLED ASTERISK OPERATOR ++ {"ocir", 0x0229A}, // CIRCLED RING OPERATOR ++ {"Ocirc", 0x000D4}, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX ++ {"ocirc", 0x000F4}, // LATIN SMALL LETTER O WITH CIRCUMFLEX ++ {"Ocy", 0x0041E}, // CYRILLIC CAPITAL LETTER O ++ {"ocy", 0x0043E}, // CYRILLIC SMALL LETTER O ++ {"odash", 0x0229D}, // CIRCLED DASH ++ {"Odblac", 0x00150}, // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE ++ {"odblac", 0x00151}, // LATIN SMALL LETTER O WITH DOUBLE ACUTE ++ {"odiv", 0x02A38}, // CIRCLED DIVISION SIGN ++ {"odot", 0x02299}, // CIRCLED DOT OPERATOR ++ {"odsold", 0x029BC}, // CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN ++ {"OElig", 0x00152}, // LATIN CAPITAL LIGATURE OE ++ {"oelig", 0x00153}, // LATIN SMALL LIGATURE OE ++ {"ofcir", 0x029BF}, // CIRCLED BULLET ++ {"Ofr", 0x1D512}, // MATHEMATICAL FRAKTUR CAPITAL O ++ {"ofr", 0x1D52C}, // MATHEMATICAL FRAKTUR SMALL O ++ {"ogon", 0x002DB}, // OGONEK ++ {"Ogr", 0x0039F}, // GREEK CAPITAL LETTER OMICRON ++ {"ogr", 0x003BF}, // GREEK SMALL LETTER OMICRON ++ {"Ograve", 0x000D2}, // LATIN CAPITAL LETTER O WITH GRAVE ++ {"ograve", 0x000F2}, // LATIN SMALL LETTER O WITH GRAVE ++ {"ogt", 0x029C1}, // CIRCLED GREATER-THAN ++ {"OHacgr", 0x0038F}, // GREEK CAPITAL LETTER OMEGA WITH TONOS ++ {"ohacgr", 0x003CE}, // GREEK SMALL LETTER OMEGA WITH TONOS ++ {"ohbar", 0x029B5}, // CIRCLE WITH HORIZONTAL BAR ++ {"OHgr", 0x003A9}, // GREEK CAPITAL LETTER OMEGA ++ {"ohgr", 0x003C9}, // GREEK SMALL LETTER OMEGA ++ {"ohm", 0x003A9}, // GREEK CAPITAL LETTER OMEGA ++ {"oint", 0x0222E}, // CONTOUR INTEGRAL ++ {"olarr", 0x021BA}, // ANTICLOCKWISE OPEN CIRCLE ARROW ++ {"olcir", 0x029BE}, // CIRCLED WHITE BULLET ++ {"olcross", 0x029BB}, // CIRCLE WITH SUPERIMPOSED X ++ {"oline", 0x0203E}, // OVERLINE ++ {"olt", 0x029C0}, // CIRCLED LESS-THAN ++ {"Omacr", 0x0014C}, // LATIN CAPITAL LETTER O WITH MACRON ++ {"omacr", 0x0014D}, // LATIN SMALL LETTER O WITH MACRON ++ {"Omega", 0x003A9}, // GREEK CAPITAL LETTER OMEGA ++ {"omega", 0x003C9}, // GREEK SMALL LETTER OMEGA ++ {"Omicron", 0x0039F}, // GREEK CAPITAL LETTER OMICRON ++ {"omicron", 0x003BF}, // GREEK SMALL LETTER OMICRON ++ {"omid", 0x029B6}, // CIRCLED VERTICAL BAR ++ {"ominus", 0x02296}, // CIRCLED MINUS ++ {"Oopf", 0x1D546}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL O ++ {"oopf", 0x1D560}, // MATHEMATICAL DOUBLE-STRUCK SMALL O ++ {"opar", 0x029B7}, // CIRCLED PARALLEL ++ {"OpenCurlyDoubleQuote", 0x0201C}, // LEFT DOUBLE QUOTATION MARK ++ {"OpenCurlyQuote", 0x02018}, // LEFT SINGLE QUOTATION MARK ++ {"operp", 0x029B9}, // CIRCLED PERPENDICULAR ++ {"oplus", 0x02295}, // CIRCLED PLUS ++ {"or", 0x02228}, // LOGICAL OR ++ {"Or", 0x02A54}, // DOUBLE LOGICAL OR ++ {"orarr", 0x021BB}, // CLOCKWISE OPEN CIRCLE ARROW ++ {"ord", 0x02A5D}, // LOGICAL OR WITH HORIZONTAL DASH ++ {"order", 0x02134}, // SCRIPT SMALL O ++ {"orderof", 0x02134}, // SCRIPT SMALL O ++ {"ordf", 0x000AA}, // FEMININE ORDINAL INDICATOR ++ {"ordm", 0x000BA}, // MASCULINE ORDINAL INDICATOR ++ {"origof", 0x022B6}, // ORIGINAL OF ++ {"oror", 0x02A56}, // TWO INTERSECTING LOGICAL OR ++ {"orslope", 0x02A57}, // SLOPING LARGE OR ++ {"orv", 0x02A5B}, // LOGICAL OR WITH MIDDLE STEM ++ {"oS", 0x024C8}, // CIRCLED LATIN CAPITAL LETTER S ++ {"oscr", 0x02134}, // SCRIPT SMALL O ++ {"Oscr", 0x1D4AA}, // MATHEMATICAL SCRIPT CAPITAL O ++ {"Oslash", 0x000D8}, // LATIN CAPITAL LETTER O WITH STROKE ++ {"oslash", 0x000F8}, // LATIN SMALL LETTER O WITH STROKE ++ {"osol", 0x02298}, // CIRCLED DIVISION SLASH ++ {"Otilde", 0x000D5}, // LATIN CAPITAL LETTER O WITH TILDE ++ {"otilde", 0x000F5}, // LATIN SMALL LETTER O WITH TILDE ++ {"otimes", 0x02297}, // CIRCLED TIMES ++ {"Otimes", 0x02A37}, // MULTIPLICATION SIGN IN DOUBLE CIRCLE ++ {"otimesas", 0x02A36}, // CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT ++ {"Ouml", 0x000D6}, // LATIN CAPITAL LETTER O WITH DIAERESIS ++ {"ouml", 0x000F6}, // LATIN SMALL LETTER O WITH DIAERESIS ++ {"ovbar", 0x0233D}, // APL FUNCTIONAL SYMBOL CIRCLE STILE ++ {"OverBar", 0x0203E}, // OVERLINE ++ {"OverBrace", 0x023DE}, // TOP CURLY BRACKET ++ {"OverBracket", 0x023B4}, // TOP SQUARE BRACKET ++ {"OverParenthesis", 0x023DC}, // TOP PARENTHESIS ++ {NULL, 0} + }; + + static NameId namesP[]={ +- "par", 0x02225, // PARALLEL TO +- "para", 0x000B6, // PILCROW SIGN +- "parallel", 0x02225, // PARALLEL TO +- "parsim", 0x02AF3, // PARALLEL WITH TILDE OPERATOR +- "parsl", 0x02AFD, // DOUBLE SOLIDUS OPERATOR +- "part", 0x02202, // PARTIAL DIFFERENTIAL +- "PartialD", 0x02202, // PARTIAL DIFFERENTIAL +- "Pcy", 0x0041F, // CYRILLIC CAPITAL LETTER PE +- "pcy", 0x0043F, // CYRILLIC SMALL LETTER PE +- "percnt", 0x00025, // PERCENT SIGN +- "period", 0x0002E, // FULL STOP +- "permil", 0x02030, // PER MILLE SIGN +- "perp", 0x022A5, // UP TACK +- "pertenk", 0x02031, // PER TEN THOUSAND SIGN +- "Pfr", 0x1D513, // MATHEMATICAL FRAKTUR CAPITAL P +- "pfr", 0x1D52D, // MATHEMATICAL FRAKTUR SMALL P +- "Pgr", 0x003A0, // GREEK CAPITAL LETTER PI +- "pgr", 0x003C0, // GREEK SMALL LETTER PI +- "PHgr", 0x003A6, // GREEK CAPITAL LETTER PHI +- "phgr", 0x003C6, // GREEK SMALL LETTER PHI +- "Phi", 0x003A6, // GREEK CAPITAL LETTER PHI +- "phi", 0x003C6, // GREEK SMALL LETTER PHI +- "phiv", 0x003D5, // GREEK PHI SYMBOL +- "phmmat", 0x02133, // SCRIPT CAPITAL M +- "phone", 0x0260E, // BLACK TELEPHONE +- "Pi", 0x003A0, // GREEK CAPITAL LETTER PI +- "pi", 0x003C0, // GREEK SMALL LETTER PI +- "pitchfork", 0x022D4, // PITCHFORK +- "piv", 0x003D6, // GREEK PI SYMBOL +- "planck", 0x0210F, // PLANCK CONSTANT OVER TWO PI +- "planckh", 0x0210E, // PLANCK CONSTANT +- "plankv", 0x0210F, // PLANCK CONSTANT OVER TWO PI +- "plus", 0x0002B, // PLUS SIGN +- "plusacir", 0x02A23, // PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +- "plusb", 0x0229E, // SQUARED PLUS +- "pluscir", 0x02A22, // PLUS SIGN WITH SMALL CIRCLE ABOVE +- "plusdo", 0x02214, // DOT PLUS +- "plusdu", 0x02A25, // PLUS SIGN WITH DOT BELOW +- "pluse", 0x02A72, // PLUS SIGN ABOVE EQUALS SIGN +- "PlusMinus", 0x000B1, // PLUS-MINUS SIGN +- "plusmn", 0x000B1, // PLUS-MINUS SIGN +- "plussim", 0x02A26, // PLUS SIGN WITH TILDE BELOW +- "plustwo", 0x02A27, // PLUS SIGN WITH SUBSCRIPT TWO +- "pm", 0x000B1, // PLUS-MINUS SIGN +- "Poincareplane", 0x0210C, // BLACK-LETTER CAPITAL H +- "pointint", 0x02A15, // INTEGRAL AROUND A POINT OPERATOR +- "Popf", 0x02119, // DOUBLE-STRUCK CAPITAL P +- "popf", 0x1D561, // MATHEMATICAL DOUBLE-STRUCK SMALL P +- "pound", 0x000A3, // POUND SIGN +- "pr", 0x0227A, // PRECEDES +- "Pr", 0x02ABB, // DOUBLE PRECEDES +- "prap", 0x02AB7, // PRECEDES ABOVE ALMOST EQUAL TO +- "prcue", 0x0227C, // PRECEDES OR EQUAL TO +- "pre", 0x02AAF, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +- "prE", 0x02AB3, // PRECEDES ABOVE EQUALS SIGN +- "prec", 0x0227A, // PRECEDES +- "precapprox", 0x02AB7, // PRECEDES ABOVE ALMOST EQUAL TO +- "preccurlyeq", 0x0227C, // PRECEDES OR EQUAL TO +- "Precedes", 0x0227A, // PRECEDES +- "PrecedesEqual", 0x02AAF, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +- "PrecedesSlantEqual", 0x0227C, // PRECEDES OR EQUAL TO +- "PrecedesTilde", 0x0227E, // PRECEDES OR EQUIVALENT TO +- "preceq", 0x02AAF, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +- "precnapprox", 0x02AB9, // PRECEDES ABOVE NOT ALMOST EQUAL TO +- "precneqq", 0x02AB5, // PRECEDES ABOVE NOT EQUAL TO +- "precnsim", 0x022E8, // PRECEDES BUT NOT EQUIVALENT TO +- "precsim", 0x0227E, // PRECEDES OR EQUIVALENT TO +- "prime", 0x02032, // PRIME +- "Prime", 0x02033, // DOUBLE PRIME +- "primes", 0x02119, // DOUBLE-STRUCK CAPITAL P +- "prnap", 0x02AB9, // PRECEDES ABOVE NOT ALMOST EQUAL TO +- "prnE", 0x02AB5, // PRECEDES ABOVE NOT EQUAL TO +- "prnsim", 0x022E8, // PRECEDES BUT NOT EQUIVALENT TO +- "prod", 0x0220F, // N-ARY PRODUCT +- "Product", 0x0220F, // N-ARY PRODUCT +- "profalar", 0x0232E, // ALL AROUND-PROFILE +- "profline", 0x02312, // ARC +- "profsurf", 0x02313, // SEGMENT +- "prop", 0x0221D, // PROPORTIONAL TO +- "Proportion", 0x02237, // PROPORTION +- "Proportional", 0x0221D, // PROPORTIONAL TO +- "propto", 0x0221D, // PROPORTIONAL TO +- "prsim", 0x0227E, // PRECEDES OR EQUIVALENT TO +- "prurel", 0x022B0, // PRECEDES UNDER RELATION +- "Pscr", 0x1D4AB, // MATHEMATICAL SCRIPT CAPITAL P +- "pscr", 0x1D4C5, // MATHEMATICAL SCRIPT SMALL P +- "PSgr", 0x003A8, // GREEK CAPITAL LETTER PSI +- "psgr", 0x003C8, // GREEK SMALL LETTER PSI +- "Psi", 0x003A8, // GREEK CAPITAL LETTER PSI +- "psi", 0x003C8, // GREEK SMALL LETTER PSI +- "puncsp", 0x02008, // PUNCTUATION SPACE +- NULL, 0 ++ {"par", 0x02225}, // PARALLEL TO ++ {"para", 0x000B6}, // PILCROW SIGN ++ {"parallel", 0x02225}, // PARALLEL TO ++ {"parsim", 0x02AF3}, // PARALLEL WITH TILDE OPERATOR ++ {"parsl", 0x02AFD}, // DOUBLE SOLIDUS OPERATOR ++ {"part", 0x02202}, // PARTIAL DIFFERENTIAL ++ {"PartialD", 0x02202}, // PARTIAL DIFFERENTIAL ++ {"Pcy", 0x0041F}, // CYRILLIC CAPITAL LETTER PE ++ {"pcy", 0x0043F}, // CYRILLIC SMALL LETTER PE ++ {"percnt", 0x00025}, // PERCENT SIGN ++ {"period", 0x0002E}, // FULL STOP ++ {"permil", 0x02030}, // PER MILLE SIGN ++ {"perp", 0x022A5}, // UP TACK ++ {"pertenk", 0x02031}, // PER TEN THOUSAND SIGN ++ {"Pfr", 0x1D513}, // MATHEMATICAL FRAKTUR CAPITAL P ++ {"pfr", 0x1D52D}, // MATHEMATICAL FRAKTUR SMALL P ++ {"Pgr", 0x003A0}, // GREEK CAPITAL LETTER PI ++ {"pgr", 0x003C0}, // GREEK SMALL LETTER PI ++ {"PHgr", 0x003A6}, // GREEK CAPITAL LETTER PHI ++ {"phgr", 0x003C6}, // GREEK SMALL LETTER PHI ++ {"Phi", 0x003A6}, // GREEK CAPITAL LETTER PHI ++ {"phi", 0x003C6}, // GREEK SMALL LETTER PHI ++ {"phiv", 0x003D5}, // GREEK PHI SYMBOL ++ {"phmmat", 0x02133}, // SCRIPT CAPITAL M ++ {"phone", 0x0260E}, // BLACK TELEPHONE ++ {"Pi", 0x003A0}, // GREEK CAPITAL LETTER PI ++ {"pi", 0x003C0}, // GREEK SMALL LETTER PI ++ {"pitchfork", 0x022D4}, // PITCHFORK ++ {"piv", 0x003D6}, // GREEK PI SYMBOL ++ {"planck", 0x0210F}, // PLANCK CONSTANT OVER TWO PI ++ {"planckh", 0x0210E}, // PLANCK CONSTANT ++ {"plankv", 0x0210F}, // PLANCK CONSTANT OVER TWO PI ++ {"plus", 0x0002B}, // PLUS SIGN ++ {"plusacir", 0x02A23}, // PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE ++ {"plusb", 0x0229E}, // SQUARED PLUS ++ {"pluscir", 0x02A22}, // PLUS SIGN WITH SMALL CIRCLE ABOVE ++ {"plusdo", 0x02214}, // DOT PLUS ++ {"plusdu", 0x02A25}, // PLUS SIGN WITH DOT BELOW ++ {"pluse", 0x02A72}, // PLUS SIGN ABOVE EQUALS SIGN ++ {"PlusMinus", 0x000B1}, // PLUS-MINUS SIGN ++ {"plusmn", 0x000B1}, // PLUS-MINUS SIGN ++ {"plussim", 0x02A26}, // PLUS SIGN WITH TILDE BELOW ++ {"plustwo", 0x02A27}, // PLUS SIGN WITH SUBSCRIPT TWO ++ {"pm", 0x000B1}, // PLUS-MINUS SIGN ++ {"Poincareplane", 0x0210C}, // BLACK-LETTER CAPITAL H ++ {"pointint", 0x02A15}, // INTEGRAL AROUND A POINT OPERATOR ++ {"Popf", 0x02119}, // DOUBLE-STRUCK CAPITAL P ++ {"popf", 0x1D561}, // MATHEMATICAL DOUBLE-STRUCK SMALL P ++ {"pound", 0x000A3}, // POUND SIGN ++ {"pr", 0x0227A}, // PRECEDES ++ {"Pr", 0x02ABB}, // DOUBLE PRECEDES ++ {"prap", 0x02AB7}, // PRECEDES ABOVE ALMOST EQUAL TO ++ {"prcue", 0x0227C}, // PRECEDES OR EQUAL TO ++ {"pre", 0x02AAF}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN ++ {"prE", 0x02AB3}, // PRECEDES ABOVE EQUALS SIGN ++ {"prec", 0x0227A}, // PRECEDES ++ {"precapprox", 0x02AB7}, // PRECEDES ABOVE ALMOST EQUAL TO ++ {"preccurlyeq", 0x0227C}, // PRECEDES OR EQUAL TO ++ {"Precedes", 0x0227A}, // PRECEDES ++ {"PrecedesEqual", 0x02AAF}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN ++ {"PrecedesSlantEqual", 0x0227C}, // PRECEDES OR EQUAL TO ++ {"PrecedesTilde", 0x0227E}, // PRECEDES OR EQUIVALENT TO ++ {"preceq", 0x02AAF}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN ++ {"precnapprox", 0x02AB9}, // PRECEDES ABOVE NOT ALMOST EQUAL TO ++ {"precneqq", 0x02AB5}, // PRECEDES ABOVE NOT EQUAL TO ++ {"precnsim", 0x022E8}, // PRECEDES BUT NOT EQUIVALENT TO ++ {"precsim", 0x0227E}, // PRECEDES OR EQUIVALENT TO ++ {"prime", 0x02032}, // PRIME ++ {"Prime", 0x02033}, // DOUBLE PRIME ++ {"primes", 0x02119}, // DOUBLE-STRUCK CAPITAL P ++ {"prnap", 0x02AB9}, // PRECEDES ABOVE NOT ALMOST EQUAL TO ++ {"prnE", 0x02AB5}, // PRECEDES ABOVE NOT EQUAL TO ++ {"prnsim", 0x022E8}, // PRECEDES BUT NOT EQUIVALENT TO ++ {"prod", 0x0220F}, // N-ARY PRODUCT ++ {"Product", 0x0220F}, // N-ARY PRODUCT ++ {"profalar", 0x0232E}, // ALL AROUND-PROFILE ++ {"profline", 0x02312}, // ARC ++ {"profsurf", 0x02313}, // SEGMENT ++ {"prop", 0x0221D}, // PROPORTIONAL TO ++ {"Proportion", 0x02237}, // PROPORTION ++ {"Proportional", 0x0221D}, // PROPORTIONAL TO ++ {"propto", 0x0221D}, // PROPORTIONAL TO ++ {"prsim", 0x0227E}, // PRECEDES OR EQUIVALENT TO ++ {"prurel", 0x022B0}, // PRECEDES UNDER RELATION ++ {"Pscr", 0x1D4AB}, // MATHEMATICAL SCRIPT CAPITAL P ++ {"pscr", 0x1D4C5}, // MATHEMATICAL SCRIPT SMALL P ++ {"PSgr", 0x003A8}, // GREEK CAPITAL LETTER PSI ++ {"psgr", 0x003C8}, // GREEK SMALL LETTER PSI ++ {"Psi", 0x003A8}, // GREEK CAPITAL LETTER PSI ++ {"psi", 0x003C8}, // GREEK SMALL LETTER PSI ++ {"puncsp", 0x02008}, // PUNCTUATION SPACE ++ {NULL, 0} + }; + + static NameId namesQ[]={ +- "Qfr", 0x1D514, // MATHEMATICAL FRAKTUR CAPITAL Q +- "qfr", 0x1D52E, // MATHEMATICAL FRAKTUR SMALL Q +- "qint", 0x02A0C, // QUADRUPLE INTEGRAL OPERATOR +- "Qopf", 0x0211A, // DOUBLE-STRUCK CAPITAL Q +- "qopf", 0x1D562, // MATHEMATICAL DOUBLE-STRUCK SMALL Q +- "qprime", 0x02057, // QUADRUPLE PRIME +- "Qscr", 0x1D4AC, // MATHEMATICAL SCRIPT CAPITAL Q +- "qscr", 0x1D4C6, // MATHEMATICAL SCRIPT SMALL Q +- "quaternions", 0x0210D, // DOUBLE-STRUCK CAPITAL H +- "quatint", 0x02A16, // QUATERNION INTEGRAL OPERATOR +- "quest", 0x0003F, // QUESTION MARK +- "questeq", 0x0225F, // QUESTIONED EQUAL TO +- "quot", 0x00022, // QUOTATION MARK +- "QUOT", 0x00022, // QUOTATION MARK +- NULL, 0 ++ {"Qfr", 0x1D514}, // MATHEMATICAL FRAKTUR CAPITAL Q ++ {"qfr", 0x1D52E}, // MATHEMATICAL FRAKTUR SMALL Q ++ {"qint", 0x02A0C}, // QUADRUPLE INTEGRAL OPERATOR ++ {"Qopf", 0x0211A}, // DOUBLE-STRUCK CAPITAL Q ++ {"qopf", 0x1D562}, // MATHEMATICAL DOUBLE-STRUCK SMALL Q ++ {"qprime", 0x02057}, // QUADRUPLE PRIME ++ {"Qscr", 0x1D4AC}, // MATHEMATICAL SCRIPT CAPITAL Q ++ {"qscr", 0x1D4C6}, // MATHEMATICAL SCRIPT SMALL Q ++ {"quaternions", 0x0210D}, // DOUBLE-STRUCK CAPITAL H ++ {"quatint", 0x02A16}, // QUATERNION INTEGRAL OPERATOR ++ {"quest", 0x0003F}, // QUESTION MARK ++ {"questeq", 0x0225F}, // QUESTIONED EQUAL TO ++ {"quot", 0x00022}, // QUOTATION MARK ++ {"QUOT", 0x00022}, // QUOTATION MARK ++ {NULL, 0} + }; + + static NameId namesR[]={ +- "rAarr", 0x021DB, // RIGHTWARDS TRIPLE ARROW +-// "race", 0x0223D;0x00331, // REVERSED TILDE with underline +- "Racute", 0x00154, // LATIN CAPITAL LETTER R WITH ACUTE +- "racute", 0x00155, // LATIN SMALL LETTER R WITH ACUTE +- "radic", 0x0221A, // SQUARE ROOT +- "raemptyv", 0x029B3, // EMPTY SET WITH RIGHT ARROW ABOVE +- "rang", 0x027E9, // MATHEMATICAL RIGHT ANGLE BRACKET +- "Rang", 0x027EB, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +- "rangd", 0x02992, // RIGHT ANGLE BRACKET WITH DOT +- "range", 0x029A5, // REVERSED ANGLE WITH UNDERBAR +- "rangle", 0x027E9, // MATHEMATICAL RIGHT ANGLE BRACKET +- "raquo", 0x000BB, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +- "rarr", 0x02192, // RIGHTWARDS ARROW +- "Rarr", 0x021A0, // RIGHTWARDS TWO HEADED ARROW +- "rArr", 0x021D2, // RIGHTWARDS DOUBLE ARROW +- "rarrap", 0x02975, // RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +- "rarrb", 0x021E5, // RIGHTWARDS ARROW TO BAR +- "rarrbfs", 0x02920, // RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +- "rarrc", 0x02933, // WAVE ARROW POINTING DIRECTLY RIGHT +- "rarrfs", 0x0291E, // RIGHTWARDS ARROW TO BLACK DIAMOND +- "rarrhk", 0x021AA, // RIGHTWARDS ARROW WITH HOOK +- "rarrlp", 0x021AC, // RIGHTWARDS ARROW WITH LOOP +- "rarrpl", 0x02945, // RIGHTWARDS ARROW WITH PLUS BELOW +- "rarrsim", 0x02974, // RIGHTWARDS ARROW ABOVE TILDE OPERATOR +- "rarrtl", 0x021A3, // RIGHTWARDS ARROW WITH TAIL +- "Rarrtl", 0x02916, // RIGHTWARDS TWO-HEADED ARROW WITH TAIL +- "rarrw", 0x0219D, // RIGHTWARDS WAVE ARROW +- "ratail", 0x0291A, // RIGHTWARDS ARROW-TAIL +- "rAtail", 0x0291C, // RIGHTWARDS DOUBLE ARROW-TAIL +- "ratio", 0x02236, // RATIO +- "rationals", 0x0211A, // DOUBLE-STRUCK CAPITAL Q +- "rbarr", 0x0290D, // RIGHTWARDS DOUBLE DASH ARROW +- "rBarr", 0x0290F, // RIGHTWARDS TRIPLE DASH ARROW +- "RBarr", 0x02910, // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +- "rbbrk", 0x02773, // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +- "rbrace", 0x0007D, // RIGHT CURLY BRACKET +- "rbrack", 0x0005D, // RIGHT SQUARE BRACKET +- "rbrke", 0x0298C, // RIGHT SQUARE BRACKET WITH UNDERBAR +- "rbrksld", 0x0298E, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +- "rbrkslu", 0x02990, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +- "Rcaron", 0x00158, // LATIN CAPITAL LETTER R WITH CARON +- "rcaron", 0x00159, // LATIN SMALL LETTER R WITH CARON +- "Rcedil", 0x00156, // LATIN CAPITAL LETTER R WITH CEDILLA +- "rcedil", 0x00157, // LATIN SMALL LETTER R WITH CEDILLA +- "rceil", 0x02309, // RIGHT CEILING +- "rcub", 0x0007D, // RIGHT CURLY BRACKET +- "Rcy", 0x00420, // CYRILLIC CAPITAL LETTER ER +- "rcy", 0x00440, // CYRILLIC SMALL LETTER ER +- "rdca", 0x02937, // ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +- "rdldhar", 0x02969, // RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +- "rdquo", 0x0201D, // RIGHT DOUBLE QUOTATION MARK +- "rdquor", 0x0201D, // RIGHT DOUBLE QUOTATION MARK +- "rdsh", 0x021B3, // DOWNWARDS ARROW WITH TIP RIGHTWARDS +- "Re", 0x0211C, // BLACK-LETTER CAPITAL R +- "real", 0x0211C, // BLACK-LETTER CAPITAL R +- "realine", 0x0211B, // SCRIPT CAPITAL R +- "realpart", 0x0211C, // BLACK-LETTER CAPITAL R +- "reals", 0x0211D, // DOUBLE-STRUCK CAPITAL R +- "rect", 0x025AD, // WHITE RECTANGLE +- "reg", 0x000AE, // REGISTERED SIGN +- "REG", 0x000AE, // REGISTERED SIGN +- "ReverseElement", 0x0220B, // CONTAINS AS MEMBER +- "ReverseEquilibrium", 0x021CB, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +- "ReverseUpEquilibrium", 0x0296F, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +- "rfisht", 0x0297D, // RIGHT FISH TAIL +- "rfloor", 0x0230B, // RIGHT FLOOR +- "Rfr", 0x0211C, // BLACK-LETTER CAPITAL R +- "rfr", 0x1D52F, // MATHEMATICAL FRAKTUR SMALL R +- "Rgr", 0x003A1, // GREEK CAPITAL LETTER RHO +- "rgr", 0x003C1, // GREEK SMALL LETTER RHO +- "rHar", 0x02964, // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +- "rhard", 0x021C1, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS +- "rharu", 0x021C0, // RIGHTWARDS HARPOON WITH BARB UPWARDS +- "rharul", 0x0296C, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +- "Rho", 0x003A1, // GREEK CAPITAL LETTER RHO +- "rho", 0x003C1, // GREEK SMALL LETTER RHO +- "rhov", 0x003F1, // GREEK RHO SYMBOL +- "RightAngleBracket", 0x027E9, // MATHEMATICAL RIGHT ANGLE BRACKET +- "rightarrow", 0x02192, // RIGHTWARDS ARROW +- "RightArrow", 0x02192, // RIGHTWARDS ARROW +- "Rightarrow", 0x021D2, // RIGHTWARDS DOUBLE ARROW +- "RightArrowBar", 0x021E5, // RIGHTWARDS ARROW TO BAR +- "RightArrowLeftArrow", 0x021C4, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW +- "rightarrowtail", 0x021A3, // RIGHTWARDS ARROW WITH TAIL +- "RightCeiling", 0x02309, // RIGHT CEILING +- "RightDoubleBracket", 0x027E7, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET +- "RightDownTeeVector", 0x0295D, // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +- "RightDownVector", 0x021C2, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS +- "RightDownVectorBar", 0x02955, // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +- "RightFloor", 0x0230B, // RIGHT FLOOR +- "rightharpoondown", 0x021C1, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS +- "rightharpoonup", 0x021C0, // RIGHTWARDS HARPOON WITH BARB UPWARDS +- "rightleftarrows", 0x021C4, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW +- "rightleftharpoons", 0x021CC, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +- "rightrightarrows", 0x021C9, // RIGHTWARDS PAIRED ARROWS +- "rightsquigarrow", 0x0219D, // RIGHTWARDS WAVE ARROW +- "RightTee", 0x022A2, // RIGHT TACK +- "RightTeeArrow", 0x021A6, // RIGHTWARDS ARROW FROM BAR +- "RightTeeVector", 0x0295B, // RIGHTWARDS HARPOON WITH BARB UP FROM BAR +- "rightthreetimes", 0x022CC, // RIGHT SEMIDIRECT PRODUCT +- "RightTriangle", 0x022B3, // CONTAINS AS NORMAL SUBGROUP +- "RightTriangleBar", 0x029D0, // VERTICAL BAR BESIDE RIGHT TRIANGLE +- "RightTriangleEqual", 0x022B5, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +- "RightUpDownVector", 0x0294F, // UP BARB RIGHT DOWN BARB RIGHT HARPOON +- "RightUpTeeVector", 0x0295C, // UPWARDS HARPOON WITH BARB RIGHT FROM BAR +- "RightUpVector", 0x021BE, // UPWARDS HARPOON WITH BARB RIGHTWARDS +- "RightUpVectorBar", 0x02954, // UPWARDS HARPOON WITH BARB RIGHT TO BAR +- "RightVector", 0x021C0, // RIGHTWARDS HARPOON WITH BARB UPWARDS +- "RightVectorBar", 0x02953, // RIGHTWARDS HARPOON WITH BARB UP TO BAR +- "ring", 0x002DA, // RING ABOVE +- "risingdotseq", 0x02253, // IMAGE OF OR APPROXIMATELY EQUAL TO +- "rlarr", 0x021C4, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW +- "rlhar", 0x021CC, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +- "rlm", 0x0200F, // RIGHT-TO-LEFT MARK +- "rmoust", 0x023B1, // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +- "rmoustache", 0x023B1, // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +- "rnmid", 0x02AEE, // DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +- "roang", 0x027ED, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +- "roarr", 0x021FE, // RIGHTWARDS OPEN-HEADED ARROW +- "robrk", 0x027E7, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET +- "ropar", 0x02986, // RIGHT WHITE PARENTHESIS +- "Ropf", 0x0211D, // DOUBLE-STRUCK CAPITAL R +- "ropf", 0x1D563, // MATHEMATICAL DOUBLE-STRUCK SMALL R +- "roplus", 0x02A2E, // PLUS SIGN IN RIGHT HALF CIRCLE +- "rotimes", 0x02A35, // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +- "RoundImplies", 0x02970, // RIGHT DOUBLE ARROW WITH ROUNDED HEAD +- "rpar", 0x00029, // RIGHT PARENTHESIS +- "rpargt", 0x02994, // RIGHT ARC GREATER-THAN BRACKET +- "rppolint", 0x02A12, // LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +- "rrarr", 0x021C9, // RIGHTWARDS PAIRED ARROWS +- "Rrightarrow", 0x021DB, // RIGHTWARDS TRIPLE ARROW +- "rsaquo", 0x0203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +- "Rscr", 0x0211B, // SCRIPT CAPITAL R +- "rscr", 0x1D4C7, // MATHEMATICAL SCRIPT SMALL R +- "rsh", 0x021B1, // UPWARDS ARROW WITH TIP RIGHTWARDS +- "Rsh", 0x021B1, // UPWARDS ARROW WITH TIP RIGHTWARDS +- "rsqb", 0x0005D, // RIGHT SQUARE BRACKET +- "rsquo", 0x02019, // RIGHT SINGLE QUOTATION MARK +- "rsquor", 0x02019, // RIGHT SINGLE QUOTATION MARK +- "rthree", 0x022CC, // RIGHT SEMIDIRECT PRODUCT +- "rtimes", 0x022CA, // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +- "rtri", 0x025B9, // WHITE RIGHT-POINTING SMALL TRIANGLE +- "rtrie", 0x022B5, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +- "rtrif", 0x025B8, // BLACK RIGHT-POINTING SMALL TRIANGLE +- "rtriltri", 0x029CE, // RIGHT TRIANGLE ABOVE LEFT TRIANGLE +- "RuleDelayed", 0x029F4, // RULE-DELAYED +- "ruluhar", 0x02968, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +- "rx", 0x0211E, // PRESCRIPTION TAKE +- NULL, 0 ++ {"rAarr", 0x021DB}, // RIGHTWARDS TRIPLE ARROW ++// "race", 0x0223D;0x00331}, // REVERSED TILDE with underline ++ {"Racute", 0x00154}, // LATIN CAPITAL LETTER R WITH ACUTE ++ {"racute", 0x00155}, // LATIN SMALL LETTER R WITH ACUTE ++ {"radic", 0x0221A}, // SQUARE ROOT ++ {"raemptyv", 0x029B3}, // EMPTY SET WITH RIGHT ARROW ABOVE ++ {"rang", 0x027E9}, // MATHEMATICAL RIGHT ANGLE BRACKET ++ {"Rang", 0x027EB}, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET ++ {"rangd", 0x02992}, // RIGHT ANGLE BRACKET WITH DOT ++ {"range", 0x029A5}, // REVERSED ANGLE WITH UNDERBAR ++ {"rangle", 0x027E9}, // MATHEMATICAL RIGHT ANGLE BRACKET ++ {"raquo", 0x000BB}, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK ++ {"rarr", 0x02192}, // RIGHTWARDS ARROW ++ {"Rarr", 0x021A0}, // RIGHTWARDS TWO HEADED ARROW ++ {"rArr", 0x021D2}, // RIGHTWARDS DOUBLE ARROW ++ {"rarrap", 0x02975}, // RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO ++ {"rarrb", 0x021E5}, // RIGHTWARDS ARROW TO BAR ++ {"rarrbfs", 0x02920}, // RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND ++ {"rarrc", 0x02933}, // WAVE ARROW POINTING DIRECTLY RIGHT ++ {"rarrfs", 0x0291E}, // RIGHTWARDS ARROW TO BLACK DIAMOND ++ {"rarrhk", 0x021AA}, // RIGHTWARDS ARROW WITH HOOK ++ {"rarrlp", 0x021AC}, // RIGHTWARDS ARROW WITH LOOP ++ {"rarrpl", 0x02945}, // RIGHTWARDS ARROW WITH PLUS BELOW ++ {"rarrsim", 0x02974}, // RIGHTWARDS ARROW ABOVE TILDE OPERATOR ++ {"rarrtl", 0x021A3}, // RIGHTWARDS ARROW WITH TAIL ++ {"Rarrtl", 0x02916}, // RIGHTWARDS TWO-HEADED ARROW WITH TAIL ++ {"rarrw", 0x0219D}, // RIGHTWARDS WAVE ARROW ++ {"ratail", 0x0291A}, // RIGHTWARDS ARROW-TAIL ++ {"rAtail", 0x0291C}, // RIGHTWARDS DOUBLE ARROW-TAIL ++ {"ratio", 0x02236}, // RATIO ++ {"rationals", 0x0211A}, // DOUBLE-STRUCK CAPITAL Q ++ {"rbarr", 0x0290D}, // RIGHTWARDS DOUBLE DASH ARROW ++ {"rBarr", 0x0290F}, // RIGHTWARDS TRIPLE DASH ARROW ++ {"RBarr", 0x02910}, // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW ++ {"rbbrk", 0x02773}, // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT ++ {"rbrace", 0x0007D}, // RIGHT CURLY BRACKET ++ {"rbrack", 0x0005D}, // RIGHT SQUARE BRACKET ++ {"rbrke", 0x0298C}, // RIGHT SQUARE BRACKET WITH UNDERBAR ++ {"rbrksld", 0x0298E}, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER ++ {"rbrkslu", 0x02990}, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER ++ {"Rcaron", 0x00158}, // LATIN CAPITAL LETTER R WITH CARON ++ {"rcaron", 0x00159}, // LATIN SMALL LETTER R WITH CARON ++ {"Rcedil", 0x00156}, // LATIN CAPITAL LETTER R WITH CEDILLA ++ {"rcedil", 0x00157}, // LATIN SMALL LETTER R WITH CEDILLA ++ {"rceil", 0x02309}, // RIGHT CEILING ++ {"rcub", 0x0007D}, // RIGHT CURLY BRACKET ++ {"Rcy", 0x00420}, // CYRILLIC CAPITAL LETTER ER ++ {"rcy", 0x00440}, // CYRILLIC SMALL LETTER ER ++ {"rdca", 0x02937}, // ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS ++ {"rdldhar", 0x02969}, // RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN ++ {"rdquo", 0x0201D}, // RIGHT DOUBLE QUOTATION MARK ++ {"rdquor", 0x0201D}, // RIGHT DOUBLE QUOTATION MARK ++ {"rdsh", 0x021B3}, // DOWNWARDS ARROW WITH TIP RIGHTWARDS ++ {"Re", 0x0211C}, // BLACK-LETTER CAPITAL R ++ {"real", 0x0211C}, // BLACK-LETTER CAPITAL R ++ {"realine", 0x0211B}, // SCRIPT CAPITAL R ++ {"realpart", 0x0211C}, // BLACK-LETTER CAPITAL R ++ {"reals", 0x0211D}, // DOUBLE-STRUCK CAPITAL R ++ {"rect", 0x025AD}, // WHITE RECTANGLE ++ {"reg", 0x000AE}, // REGISTERED SIGN ++ {"REG", 0x000AE}, // REGISTERED SIGN ++ {"ReverseElement", 0x0220B}, // CONTAINS AS MEMBER ++ {"ReverseEquilibrium", 0x021CB}, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON ++ {"ReverseUpEquilibrium", 0x0296F}, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT ++ {"rfisht", 0x0297D}, // RIGHT FISH TAIL ++ {"rfloor", 0x0230B}, // RIGHT FLOOR ++ {"Rfr", 0x0211C}, // BLACK-LETTER CAPITAL R ++ {"rfr", 0x1D52F}, // MATHEMATICAL FRAKTUR SMALL R ++ {"Rgr", 0x003A1}, // GREEK CAPITAL LETTER RHO ++ {"rgr", 0x003C1}, // GREEK SMALL LETTER RHO ++ {"rHar", 0x02964}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN ++ {"rhard", 0x021C1}, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS ++ {"rharu", 0x021C0}, // RIGHTWARDS HARPOON WITH BARB UPWARDS ++ {"rharul", 0x0296C}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH ++ {"Rho", 0x003A1}, // GREEK CAPITAL LETTER RHO ++ {"rho", 0x003C1}, // GREEK SMALL LETTER RHO ++ {"rhov", 0x003F1}, // GREEK RHO SYMBOL ++ {"RightAngleBracket", 0x027E9}, // MATHEMATICAL RIGHT ANGLE BRACKET ++ {"rightarrow", 0x02192}, // RIGHTWARDS ARROW ++ {"RightArrow", 0x02192}, // RIGHTWARDS ARROW ++ {"Rightarrow", 0x021D2}, // RIGHTWARDS DOUBLE ARROW ++ {"RightArrowBar", 0x021E5}, // RIGHTWARDS ARROW TO BAR ++ {"RightArrowLeftArrow", 0x021C4}, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW ++ {"rightarrowtail", 0x021A3}, // RIGHTWARDS ARROW WITH TAIL ++ {"RightCeiling", 0x02309}, // RIGHT CEILING ++ {"RightDoubleBracket", 0x027E7}, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET ++ {"RightDownTeeVector", 0x0295D}, // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR ++ {"RightDownVector", 0x021C2}, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS ++ {"RightDownVectorBar", 0x02955}, // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR ++ {"RightFloor", 0x0230B}, // RIGHT FLOOR ++ {"rightharpoondown", 0x021C1}, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS ++ {"rightharpoonup", 0x021C0}, // RIGHTWARDS HARPOON WITH BARB UPWARDS ++ {"rightleftarrows", 0x021C4}, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW ++ {"rightleftharpoons", 0x021CC}, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON ++ {"rightrightarrows", 0x021C9}, // RIGHTWARDS PAIRED ARROWS ++ {"rightsquigarrow", 0x0219D}, // RIGHTWARDS WAVE ARROW ++ {"RightTee", 0x022A2}, // RIGHT TACK ++ {"RightTeeArrow", 0x021A6}, // RIGHTWARDS ARROW FROM BAR ++ {"RightTeeVector", 0x0295B}, // RIGHTWARDS HARPOON WITH BARB UP FROM BAR ++ {"rightthreetimes", 0x022CC}, // RIGHT SEMIDIRECT PRODUCT ++ {"RightTriangle", 0x022B3}, // CONTAINS AS NORMAL SUBGROUP ++ {"RightTriangleBar", 0x029D0}, // VERTICAL BAR BESIDE RIGHT TRIANGLE ++ {"RightTriangleEqual", 0x022B5}, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO ++ {"RightUpDownVector", 0x0294F}, // UP BARB RIGHT DOWN BARB RIGHT HARPOON ++ {"RightUpTeeVector", 0x0295C}, // UPWARDS HARPOON WITH BARB RIGHT FROM BAR ++ {"RightUpVector", 0x021BE}, // UPWARDS HARPOON WITH BARB RIGHTWARDS ++ {"RightUpVectorBar", 0x02954}, // UPWARDS HARPOON WITH BARB RIGHT TO BAR ++ {"RightVector", 0x021C0}, // RIGHTWARDS HARPOON WITH BARB UPWARDS ++ {"RightVectorBar", 0x02953}, // RIGHTWARDS HARPOON WITH BARB UP TO BAR ++ {"ring", 0x002DA}, // RING ABOVE ++ {"risingdotseq", 0x02253}, // IMAGE OF OR APPROXIMATELY EQUAL TO ++ {"rlarr", 0x021C4}, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW ++ {"rlhar", 0x021CC}, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON ++ {"rlm", 0x0200F}, // RIGHT-TO-LEFT MARK ++ {"rmoust", 0x023B1}, // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION ++ {"rmoustache", 0x023B1}, // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION ++ {"rnmid", 0x02AEE}, // DOES NOT DIVIDE WITH REVERSED NEGATION SLASH ++ {"roang", 0x027ED}, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET ++ {"roarr", 0x021FE}, // RIGHTWARDS OPEN-HEADED ARROW ++ {"robrk", 0x027E7}, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET ++ {"ropar", 0x02986}, // RIGHT WHITE PARENTHESIS ++ {"Ropf", 0x0211D}, // DOUBLE-STRUCK CAPITAL R ++ {"ropf", 0x1D563}, // MATHEMATICAL DOUBLE-STRUCK SMALL R ++ {"roplus", 0x02A2E}, // PLUS SIGN IN RIGHT HALF CIRCLE ++ {"rotimes", 0x02A35}, // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE ++ {"RoundImplies", 0x02970}, // RIGHT DOUBLE ARROW WITH ROUNDED HEAD ++ {"rpar", 0x00029}, // RIGHT PARENTHESIS ++ {"rpargt", 0x02994}, // RIGHT ARC GREATER-THAN BRACKET ++ {"rppolint", 0x02A12}, // LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE ++ {"rrarr", 0x021C9}, // RIGHTWARDS PAIRED ARROWS ++ {"Rrightarrow", 0x021DB}, // RIGHTWARDS TRIPLE ARROW ++ {"rsaquo", 0x0203A}, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK ++ {"Rscr", 0x0211B}, // SCRIPT CAPITAL R ++ {"rscr", 0x1D4C7}, // MATHEMATICAL SCRIPT SMALL R ++ {"rsh", 0x021B1}, // UPWARDS ARROW WITH TIP RIGHTWARDS ++ {"Rsh", 0x021B1}, // UPWARDS ARROW WITH TIP RIGHTWARDS ++ {"rsqb", 0x0005D}, // RIGHT SQUARE BRACKET ++ {"rsquo", 0x02019}, // RIGHT SINGLE QUOTATION MARK ++ {"rsquor", 0x02019}, // RIGHT SINGLE QUOTATION MARK ++ {"rthree", 0x022CC}, // RIGHT SEMIDIRECT PRODUCT ++ {"rtimes", 0x022CA}, // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT ++ {"rtri", 0x025B9}, // WHITE RIGHT-POINTING SMALL TRIANGLE ++ {"rtrie", 0x022B5}, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO ++ {"rtrif", 0x025B8}, // BLACK RIGHT-POINTING SMALL TRIANGLE ++ {"rtriltri", 0x029CE}, // RIGHT TRIANGLE ABOVE LEFT TRIANGLE ++ {"RuleDelayed", 0x029F4}, // RULE-DELAYED ++ {"ruluhar", 0x02968}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP ++ {"rx", 0x0211E}, // PRESCRIPTION TAKE ++ {NULL, 0} + }; + + static NameId namesS[]={ +- "Sacute", 0x0015A, // LATIN CAPITAL LETTER S WITH ACUTE +- "sacute", 0x0015B, // LATIN SMALL LETTER S WITH ACUTE +- "sbquo", 0x0201A, // SINGLE LOW-9 QUOTATION MARK +- "sc", 0x0227B, // SUCCEEDS +- "Sc", 0x02ABC, // DOUBLE SUCCEEDS +- "scap", 0x02AB8, // SUCCEEDS ABOVE ALMOST EQUAL TO +- "Scaron", 0x00160, // LATIN CAPITAL LETTER S WITH CARON +- "scaron", 0x00161, // LATIN SMALL LETTER S WITH CARON +- "sccue", 0x0227D, // SUCCEEDS OR EQUAL TO +- "sce", 0x02AB0, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +- "scE", 0x02AB4, // SUCCEEDS ABOVE EQUALS SIGN +- "Scedil", 0x0015E, // LATIN CAPITAL LETTER S WITH CEDILLA +- "scedil", 0x0015F, // LATIN SMALL LETTER S WITH CEDILLA +- "Scirc", 0x0015C, // LATIN CAPITAL LETTER S WITH CIRCUMFLEX +- "scirc", 0x0015D, // LATIN SMALL LETTER S WITH CIRCUMFLEX +- "scnap", 0x02ABA, // SUCCEEDS ABOVE NOT ALMOST EQUAL TO +- "scnE", 0x02AB6, // SUCCEEDS ABOVE NOT EQUAL TO +- "scnsim", 0x022E9, // SUCCEEDS BUT NOT EQUIVALENT TO +- "scpolint", 0x02A13, // LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +- "scsim", 0x0227F, // SUCCEEDS OR EQUIVALENT TO +- "Scy", 0x00421, // CYRILLIC CAPITAL LETTER ES +- "scy", 0x00441, // CYRILLIC SMALL LETTER ES +- "sdot", 0x022C5, // DOT OPERATOR +- "sdotb", 0x022A1, // SQUARED DOT OPERATOR +- "sdote", 0x02A66, // EQUALS SIGN WITH DOT BELOW +- "searhk", 0x02925, // SOUTH EAST ARROW WITH HOOK +- "searr", 0x02198, // SOUTH EAST ARROW +- "seArr", 0x021D8, // SOUTH EAST DOUBLE ARROW +- "searrow", 0x02198, // SOUTH EAST ARROW +- "sect", 0x000A7, // SECTION SIGN +- "semi", 0x0003B, // SEMICOLON +- "seswar", 0x02929, // SOUTH EAST ARROW AND SOUTH WEST ARROW +- "setminus", 0x02216, // SET MINUS +- "setmn", 0x02216, // SET MINUS +- "sext", 0x02736, // SIX POINTED BLACK STAR +- "sfgr", 0x003C2, // GREEK SMALL LETTER FINAL SIGMA +- "Sfr", 0x1D516, // MATHEMATICAL FRAKTUR CAPITAL S +- "sfr", 0x1D530, // MATHEMATICAL FRAKTUR SMALL S +- "sfrown", 0x02322, // FROWN +- "Sgr", 0x003A3, // GREEK CAPITAL LETTER SIGMA +- "sgr", 0x003C3, // GREEK SMALL LETTER SIGMA +- "sharp", 0x0266F, // MUSIC SHARP SIGN +- "SHCHcy", 0x00429, // CYRILLIC CAPITAL LETTER SHCHA +- "shchcy", 0x00449, // CYRILLIC SMALL LETTER SHCHA +- "SHcy", 0x00428, // CYRILLIC CAPITAL LETTER SHA +- "shcy", 0x00448, // CYRILLIC SMALL LETTER SHA +- "ShortDownArrow", 0x02193, // DOWNWARDS ARROW +- "ShortLeftArrow", 0x02190, // LEFTWARDS ARROW +- "shortmid", 0x02223, // DIVIDES +- "shortparallel", 0x02225, // PARALLEL TO +- "ShortRightArrow", 0x02192, // RIGHTWARDS ARROW +- "ShortUpArrow", 0x02191, // UPWARDS ARROW +- "shy", 0x000AD, // SOFT HYPHEN +- "Sigma", 0x003A3, // GREEK CAPITAL LETTER SIGMA +- "sigma", 0x003C3, // GREEK SMALL LETTER SIGMA +- "sigmaf", 0x003C2, // GREEK SMALL LETTER FINAL SIGMA +- "sigmav", 0x003C2, // GREEK SMALL LETTER FINAL SIGMA +- "sim", 0x0223C, // TILDE OPERATOR +- "simdot", 0x02A6A, // TILDE OPERATOR WITH DOT ABOVE +- "sime", 0x02243, // ASYMPTOTICALLY EQUAL TO +- "simeq", 0x02243, // ASYMPTOTICALLY EQUAL TO +- "simg", 0x02A9E, // SIMILAR OR GREATER-THAN +- "simgE", 0x02AA0, // SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +- "siml", 0x02A9D, // SIMILAR OR LESS-THAN +- "simlE", 0x02A9F, // SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +- "simne", 0x02246, // APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +- "simplus", 0x02A24, // PLUS SIGN WITH TILDE ABOVE +- "simrarr", 0x02972, // TILDE OPERATOR ABOVE RIGHTWARDS ARROW +- "slarr", 0x02190, // LEFTWARDS ARROW +- "SmallCircle", 0x02218, // RING OPERATOR +- "smallsetminus", 0x02216, // SET MINUS +- "smashp", 0x02A33, // SMASH PRODUCT +- "smeparsl", 0x029E4, // EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +- "smid", 0x02223, // DIVIDES +- "smile", 0x02323, // SMILE +- "smt", 0x02AAA, // SMALLER THAN +- "smte", 0x02AAC, // SMALLER THAN OR EQUAL TO +-// "smtes", 0x02AAC;0x0FE00, // SMALLER THAN OR slanted EQUAL +- "SOFTcy", 0x0042C, // CYRILLIC CAPITAL LETTER SOFT SIGN +- "softcy", 0x0044C, // CYRILLIC SMALL LETTER SOFT SIGN +- "sol", 0x0002F, // SOLIDUS +- "solb", 0x029C4, // SQUARED RISING DIAGONAL SLASH +- "solbar", 0x0233F, // APL FUNCTIONAL SYMBOL SLASH BAR +- "Sopf", 0x1D54A, // MATHEMATICAL DOUBLE-STRUCK CAPITAL S +- "sopf", 0x1D564, // MATHEMATICAL DOUBLE-STRUCK SMALL S +- "spades", 0x02660, // BLACK SPADE SUIT +- "spadesuit", 0x02660, // BLACK SPADE SUIT +- "spar", 0x02225, // PARALLEL TO +- "sqcap", 0x02293, // SQUARE CAP +-// "sqcaps", 0x02293;0x0FE00, // SQUARE CAP with serifs +- "sqcup", 0x02294, // SQUARE CUP +-// "sqcups", 0x02294;0x0FE00, // SQUARE CUP with serifs +- "Sqrt", 0x0221A, // SQUARE ROOT +- "sqsub", 0x0228F, // SQUARE IMAGE OF +- "sqsube", 0x02291, // SQUARE IMAGE OF OR EQUAL TO +- "sqsubset", 0x0228F, // SQUARE IMAGE OF +- "sqsubseteq", 0x02291, // SQUARE IMAGE OF OR EQUAL TO +- "sqsup", 0x02290, // SQUARE ORIGINAL OF +- "sqsupe", 0x02292, // SQUARE ORIGINAL OF OR EQUAL TO +- "sqsupset", 0x02290, // SQUARE ORIGINAL OF +- "sqsupseteq", 0x02292, // SQUARE ORIGINAL OF OR EQUAL TO +- "squ", 0x025A1, // WHITE SQUARE +- "square", 0x025A1, // WHITE SQUARE +- "Square", 0x025A1, // WHITE SQUARE +- "SquareIntersection", 0x02293, // SQUARE CAP +- "SquareSubset", 0x0228F, // SQUARE IMAGE OF +- "SquareSubsetEqual", 0x02291, // SQUARE IMAGE OF OR EQUAL TO +- "SquareSuperset", 0x02290, // SQUARE ORIGINAL OF +- "SquareSupersetEqual", 0x02292, // SQUARE ORIGINAL OF OR EQUAL TO +- "SquareUnion", 0x02294, // SQUARE CUP +- "squarf", 0x025AA, // BLACK SMALL SQUARE +- "squf", 0x025AA, // BLACK SMALL SQUARE +- "srarr", 0x02192, // RIGHTWARDS ARROW +- "Sscr", 0x1D4AE, // MATHEMATICAL SCRIPT CAPITAL S +- "sscr", 0x1D4C8, // MATHEMATICAL SCRIPT SMALL S +- "ssetmn", 0x02216, // SET MINUS +- "ssmile", 0x02323, // SMILE +- "sstarf", 0x022C6, // STAR OPERATOR +- "Star", 0x022C6, // STAR OPERATOR +- "star", 0x02606, // WHITE STAR +- "starf", 0x02605, // BLACK STAR +- "straightepsilon", 0x003F5, // GREEK LUNATE EPSILON SYMBOL +- "straightphi", 0x003D5, // GREEK PHI SYMBOL +- "strns", 0x000AF, // MACRON +- "sub", 0x02282, // SUBSET OF +- "Sub", 0x022D0, // DOUBLE SUBSET +- "subdot", 0x02ABD, // SUBSET WITH DOT +- "sube", 0x02286, // SUBSET OF OR EQUAL TO +- "subE", 0x02AC5, // SUBSET OF ABOVE EQUALS SIGN +- "subedot", 0x02AC3, // SUBSET OF OR EQUAL TO WITH DOT ABOVE +- "submult", 0x02AC1, // SUBSET WITH MULTIPLICATION SIGN BELOW +- "subne", 0x0228A, // SUBSET OF WITH NOT EQUAL TO +- "subnE", 0x02ACB, // SUBSET OF ABOVE NOT EQUAL TO +- "subplus", 0x02ABF, // SUBSET WITH PLUS SIGN BELOW +- "subrarr", 0x02979, // SUBSET ABOVE RIGHTWARDS ARROW +- "subset", 0x02282, // SUBSET OF +- "Subset", 0x022D0, // DOUBLE SUBSET +- "subseteq", 0x02286, // SUBSET OF OR EQUAL TO +- "subseteqq", 0x02AC5, // SUBSET OF ABOVE EQUALS SIGN +- "SubsetEqual", 0x02286, // SUBSET OF OR EQUAL TO +- "subsetneq", 0x0228A, // SUBSET OF WITH NOT EQUAL TO +- "subsetneqq", 0x02ACB, // SUBSET OF ABOVE NOT EQUAL TO +- "subsim", 0x02AC7, // SUBSET OF ABOVE TILDE OPERATOR +- "subsub", 0x02AD5, // SUBSET ABOVE SUBSET +- "subsup", 0x02AD3, // SUBSET ABOVE SUPERSET +- "succ", 0x0227B, // SUCCEEDS +- "succapprox", 0x02AB8, // SUCCEEDS ABOVE ALMOST EQUAL TO +- "succcurlyeq", 0x0227D, // SUCCEEDS OR EQUAL TO +- "Succeeds", 0x0227B, // SUCCEEDS +- "SucceedsEqual", 0x02AB0, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +- "SucceedsSlantEqual", 0x0227D, // SUCCEEDS OR EQUAL TO +- "SucceedsTilde", 0x0227F, // SUCCEEDS OR EQUIVALENT TO +- "succeq", 0x02AB0, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +- "succnapprox", 0x02ABA, // SUCCEEDS ABOVE NOT ALMOST EQUAL TO +- "succneqq", 0x02AB6, // SUCCEEDS ABOVE NOT EQUAL TO +- "succnsim", 0x022E9, // SUCCEEDS BUT NOT EQUIVALENT TO +- "succsim", 0x0227F, // SUCCEEDS OR EQUIVALENT TO +- "SuchThat", 0x0220B, // CONTAINS AS MEMBER +- "sum", 0x02211, // N-ARY SUMMATION +- "Sum", 0x02211, // N-ARY SUMMATION +- "sung", 0x0266A, // EIGHTH NOTE +- "sup", 0x02283, // SUPERSET OF +- "Sup", 0x022D1, // DOUBLE SUPERSET +- "sup1", 0x000B9, // SUPERSCRIPT ONE +- "sup2", 0x000B2, // SUPERSCRIPT TWO +- "sup3", 0x000B3, // SUPERSCRIPT THREE +- "supdot", 0x02ABE, // SUPERSET WITH DOT +- "supdsub", 0x02AD8, // SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +- "supe", 0x02287, // SUPERSET OF OR EQUAL TO +- "supE", 0x02AC6, // SUPERSET OF ABOVE EQUALS SIGN +- "supedot", 0x02AC4, // SUPERSET OF OR EQUAL TO WITH DOT ABOVE +- "Superset", 0x02283, // SUPERSET OF +- "SupersetEqual", 0x02287, // SUPERSET OF OR EQUAL TO +- "suphsol", 0x027C9, // SUPERSET PRECEDING SOLIDUS +- "suphsub", 0x02AD7, // SUPERSET BESIDE SUBSET +- "suplarr", 0x0297B, // SUPERSET ABOVE LEFTWARDS ARROW +- "supmult", 0x02AC2, // SUPERSET WITH MULTIPLICATION SIGN BELOW +- "supne", 0x0228B, // SUPERSET OF WITH NOT EQUAL TO +- "supnE", 0x02ACC, // SUPERSET OF ABOVE NOT EQUAL TO +- "supplus", 0x02AC0, // SUPERSET WITH PLUS SIGN BELOW +- "supset", 0x02283, // SUPERSET OF +- "Supset", 0x022D1, // DOUBLE SUPERSET +- "supseteq", 0x02287, // SUPERSET OF OR EQUAL TO +- "supseteqq", 0x02AC6, // SUPERSET OF ABOVE EQUALS SIGN +- "supsetneq", 0x0228B, // SUPERSET OF WITH NOT EQUAL TO +- "supsetneqq", 0x02ACC, // SUPERSET OF ABOVE NOT EQUAL TO +- "supsim", 0x02AC8, // SUPERSET OF ABOVE TILDE OPERATOR +- "supsub", 0x02AD4, // SUPERSET ABOVE SUBSET +- "supsup", 0x02AD6, // SUPERSET ABOVE SUPERSET +- "swarhk", 0x02926, // SOUTH WEST ARROW WITH HOOK +- "swarr", 0x02199, // SOUTH WEST ARROW +- "swArr", 0x021D9, // SOUTH WEST DOUBLE ARROW +- "swarrow", 0x02199, // SOUTH WEST ARROW +- "swnwar", 0x0292A, // SOUTH WEST ARROW AND NORTH WEST ARROW +- "szlig", 0x000DF, // LATIN SMALL LETTER SHARP S +- NULL, 0 ++ {"Sacute", 0x0015A}, // LATIN CAPITAL LETTER S WITH ACUTE ++ {"sacute", 0x0015B}, // LATIN SMALL LETTER S WITH ACUTE ++ {"sbquo", 0x0201A}, // SINGLE LOW-9 QUOTATION MARK ++ {"sc", 0x0227B}, // SUCCEEDS ++ {"Sc", 0x02ABC}, // DOUBLE SUCCEEDS ++ {"scap", 0x02AB8}, // SUCCEEDS ABOVE ALMOST EQUAL TO ++ {"Scaron", 0x00160}, // LATIN CAPITAL LETTER S WITH CARON ++ {"scaron", 0x00161}, // LATIN SMALL LETTER S WITH CARON ++ {"sccue", 0x0227D}, // SUCCEEDS OR EQUAL TO ++ {"sce", 0x02AB0}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN ++ {"scE", 0x02AB4}, // SUCCEEDS ABOVE EQUALS SIGN ++ {"Scedil", 0x0015E}, // LATIN CAPITAL LETTER S WITH CEDILLA ++ {"scedil", 0x0015F}, // LATIN SMALL LETTER S WITH CEDILLA ++ {"Scirc", 0x0015C}, // LATIN CAPITAL LETTER S WITH CIRCUMFLEX ++ {"scirc", 0x0015D}, // LATIN SMALL LETTER S WITH CIRCUMFLEX ++ {"scnap", 0x02ABA}, // SUCCEEDS ABOVE NOT ALMOST EQUAL TO ++ {"scnE", 0x02AB6}, // SUCCEEDS ABOVE NOT EQUAL TO ++ {"scnsim", 0x022E9}, // SUCCEEDS BUT NOT EQUIVALENT TO ++ {"scpolint", 0x02A13}, // LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE ++ {"scsim", 0x0227F}, // SUCCEEDS OR EQUIVALENT TO ++ {"Scy", 0x00421}, // CYRILLIC CAPITAL LETTER ES ++ {"scy", 0x00441}, // CYRILLIC SMALL LETTER ES ++ {"sdot", 0x022C5}, // DOT OPERATOR ++ {"sdotb", 0x022A1}, // SQUARED DOT OPERATOR ++ {"sdote", 0x02A66}, // EQUALS SIGN WITH DOT BELOW ++ {"searhk", 0x02925}, // SOUTH EAST ARROW WITH HOOK ++ {"searr", 0x02198}, // SOUTH EAST ARROW ++ {"seArr", 0x021D8}, // SOUTH EAST DOUBLE ARROW ++ {"searrow", 0x02198}, // SOUTH EAST ARROW ++ {"sect", 0x000A7}, // SECTION SIGN ++ {"semi", 0x0003B}, // SEMICOLON ++ {"seswar", 0x02929}, // SOUTH EAST ARROW AND SOUTH WEST ARROW ++ {"setminus", 0x02216}, // SET MINUS ++ {"setmn", 0x02216}, // SET MINUS ++ {"sext", 0x02736}, // SIX POINTED BLACK STAR ++ {"sfgr", 0x003C2}, // GREEK SMALL LETTER FINAL SIGMA ++ {"Sfr", 0x1D516}, // MATHEMATICAL FRAKTUR CAPITAL S ++ {"sfr", 0x1D530}, // MATHEMATICAL FRAKTUR SMALL S ++ {"sfrown", 0x02322}, // FROWN ++ {"Sgr", 0x003A3}, // GREEK CAPITAL LETTER SIGMA ++ {"sgr", 0x003C3}, // GREEK SMALL LETTER SIGMA ++ {"sharp", 0x0266F}, // MUSIC SHARP SIGN ++ {"SHCHcy", 0x00429}, // CYRILLIC CAPITAL LETTER SHCHA ++ {"shchcy", 0x00449}, // CYRILLIC SMALL LETTER SHCHA ++ {"SHcy", 0x00428}, // CYRILLIC CAPITAL LETTER SHA ++ {"shcy", 0x00448}, // CYRILLIC SMALL LETTER SHA ++ {"ShortDownArrow", 0x02193}, // DOWNWARDS ARROW ++ {"ShortLeftArrow", 0x02190}, // LEFTWARDS ARROW ++ {"shortmid", 0x02223}, // DIVIDES ++ {"shortparallel", 0x02225}, // PARALLEL TO ++ {"ShortRightArrow", 0x02192}, // RIGHTWARDS ARROW ++ {"ShortUpArrow", 0x02191}, // UPWARDS ARROW ++ {"shy", 0x000AD}, // SOFT HYPHEN ++ {"Sigma", 0x003A3}, // GREEK CAPITAL LETTER SIGMA ++ {"sigma", 0x003C3}, // GREEK SMALL LETTER SIGMA ++ {"sigmaf", 0x003C2}, // GREEK SMALL LETTER FINAL SIGMA ++ {"sigmav", 0x003C2}, // GREEK SMALL LETTER FINAL SIGMA ++ {"sim", 0x0223C}, // TILDE OPERATOR ++ {"simdot", 0x02A6A}, // TILDE OPERATOR WITH DOT ABOVE ++ {"sime", 0x02243}, // ASYMPTOTICALLY EQUAL TO ++ {"simeq", 0x02243}, // ASYMPTOTICALLY EQUAL TO ++ {"simg", 0x02A9E}, // SIMILAR OR GREATER-THAN ++ {"simgE", 0x02AA0}, // SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN ++ {"siml", 0x02A9D}, // SIMILAR OR LESS-THAN ++ {"simlE", 0x02A9F}, // SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN ++ {"simne", 0x02246}, // APPROXIMATELY BUT NOT ACTUALLY EQUAL TO ++ {"simplus", 0x02A24}, // PLUS SIGN WITH TILDE ABOVE ++ {"simrarr", 0x02972}, // TILDE OPERATOR ABOVE RIGHTWARDS ARROW ++ {"slarr", 0x02190}, // LEFTWARDS ARROW ++ {"SmallCircle", 0x02218}, // RING OPERATOR ++ {"smallsetminus", 0x02216}, // SET MINUS ++ {"smashp", 0x02A33}, // SMASH PRODUCT ++ {"smeparsl", 0x029E4}, // EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE ++ {"smid", 0x02223}, // DIVIDES ++ {"smile", 0x02323}, // SMILE ++ {"smt", 0x02AAA}, // SMALLER THAN ++ {"smte", 0x02AAC}, // SMALLER THAN OR EQUAL TO ++// "smtes", 0x02AAC;0x0FE00}, // SMALLER THAN OR slanted EQUAL ++ {"SOFTcy", 0x0042C}, // CYRILLIC CAPITAL LETTER SOFT SIGN ++ {"softcy", 0x0044C}, // CYRILLIC SMALL LETTER SOFT SIGN ++ {"sol", 0x0002F}, // SOLIDUS ++ {"solb", 0x029C4}, // SQUARED RISING DIAGONAL SLASH ++ {"solbar", 0x0233F}, // APL FUNCTIONAL SYMBOL SLASH BAR ++ {"Sopf", 0x1D54A}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL S ++ {"sopf", 0x1D564}, // MATHEMATICAL DOUBLE-STRUCK SMALL S ++ {"spades", 0x02660}, // BLACK SPADE SUIT ++ {"spadesuit", 0x02660}, // BLACK SPADE SUIT ++ {"spar", 0x02225}, // PARALLEL TO ++ {"sqcap", 0x02293}, // SQUARE CAP ++// "sqcaps", 0x02293;0x0FE00}, // SQUARE CAP with serifs ++ {"sqcup", 0x02294}, // SQUARE CUP ++// "sqcups", 0x02294;0x0FE00}, // SQUARE CUP with serifs ++ {"Sqrt", 0x0221A}, // SQUARE ROOT ++ {"sqsub", 0x0228F}, // SQUARE IMAGE OF ++ {"sqsube", 0x02291}, // SQUARE IMAGE OF OR EQUAL TO ++ {"sqsubset", 0x0228F}, // SQUARE IMAGE OF ++ {"sqsubseteq", 0x02291}, // SQUARE IMAGE OF OR EQUAL TO ++ {"sqsup", 0x02290}, // SQUARE ORIGINAL OF ++ {"sqsupe", 0x02292}, // SQUARE ORIGINAL OF OR EQUAL TO ++ {"sqsupset", 0x02290}, // SQUARE ORIGINAL OF ++ {"sqsupseteq", 0x02292}, // SQUARE ORIGINAL OF OR EQUAL TO ++ {"squ", 0x025A1}, // WHITE SQUARE ++ {"square", 0x025A1}, // WHITE SQUARE ++ {"Square", 0x025A1}, // WHITE SQUARE ++ {"SquareIntersection", 0x02293}, // SQUARE CAP ++ {"SquareSubset", 0x0228F}, // SQUARE IMAGE OF ++ {"SquareSubsetEqual", 0x02291}, // SQUARE IMAGE OF OR EQUAL TO ++ {"SquareSuperset", 0x02290}, // SQUARE ORIGINAL OF ++ {"SquareSupersetEqual", 0x02292}, // SQUARE ORIGINAL OF OR EQUAL TO ++ {"SquareUnion", 0x02294}, // SQUARE CUP ++ {"squarf", 0x025AA}, // BLACK SMALL SQUARE ++ {"squf", 0x025AA}, // BLACK SMALL SQUARE ++ {"srarr", 0x02192}, // RIGHTWARDS ARROW ++ {"Sscr", 0x1D4AE}, // MATHEMATICAL SCRIPT CAPITAL S ++ {"sscr", 0x1D4C8}, // MATHEMATICAL SCRIPT SMALL S ++ {"ssetmn", 0x02216}, // SET MINUS ++ {"ssmile", 0x02323}, // SMILE ++ {"sstarf", 0x022C6}, // STAR OPERATOR ++ {"Star", 0x022C6}, // STAR OPERATOR ++ {"star", 0x02606}, // WHITE STAR ++ {"starf", 0x02605}, // BLACK STAR ++ {"straightepsilon", 0x003F5}, // GREEK LUNATE EPSILON SYMBOL ++ {"straightphi", 0x003D5}, // GREEK PHI SYMBOL ++ {"strns", 0x000AF}, // MACRON ++ {"sub", 0x02282}, // SUBSET OF ++ {"Sub", 0x022D0}, // DOUBLE SUBSET ++ {"subdot", 0x02ABD}, // SUBSET WITH DOT ++ {"sube", 0x02286}, // SUBSET OF OR EQUAL TO ++ {"subE", 0x02AC5}, // SUBSET OF ABOVE EQUALS SIGN ++ {"subedot", 0x02AC3}, // SUBSET OF OR EQUAL TO WITH DOT ABOVE ++ {"submult", 0x02AC1}, // SUBSET WITH MULTIPLICATION SIGN BELOW ++ {"subne", 0x0228A}, // SUBSET OF WITH NOT EQUAL TO ++ {"subnE", 0x02ACB}, // SUBSET OF ABOVE NOT EQUAL TO ++ {"subplus", 0x02ABF}, // SUBSET WITH PLUS SIGN BELOW ++ {"subrarr", 0x02979}, // SUBSET ABOVE RIGHTWARDS ARROW ++ {"subset", 0x02282}, // SUBSET OF ++ {"Subset", 0x022D0}, // DOUBLE SUBSET ++ {"subseteq", 0x02286}, // SUBSET OF OR EQUAL TO ++ {"subseteqq", 0x02AC5}, // SUBSET OF ABOVE EQUALS SIGN ++ {"SubsetEqual", 0x02286}, // SUBSET OF OR EQUAL TO ++ {"subsetneq", 0x0228A}, // SUBSET OF WITH NOT EQUAL TO ++ {"subsetneqq", 0x02ACB}, // SUBSET OF ABOVE NOT EQUAL TO ++ {"subsim", 0x02AC7}, // SUBSET OF ABOVE TILDE OPERATOR ++ {"subsub", 0x02AD5}, // SUBSET ABOVE SUBSET ++ {"subsup", 0x02AD3}, // SUBSET ABOVE SUPERSET ++ {"succ", 0x0227B}, // SUCCEEDS ++ {"succapprox", 0x02AB8}, // SUCCEEDS ABOVE ALMOST EQUAL TO ++ {"succcurlyeq", 0x0227D}, // SUCCEEDS OR EQUAL TO ++ {"Succeeds", 0x0227B}, // SUCCEEDS ++ {"SucceedsEqual", 0x02AB0}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN ++ {"SucceedsSlantEqual", 0x0227D}, // SUCCEEDS OR EQUAL TO ++ {"SucceedsTilde", 0x0227F}, // SUCCEEDS OR EQUIVALENT TO ++ {"succeq", 0x02AB0}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN ++ {"succnapprox", 0x02ABA}, // SUCCEEDS ABOVE NOT ALMOST EQUAL TO ++ {"succneqq", 0x02AB6}, // SUCCEEDS ABOVE NOT EQUAL TO ++ {"succnsim", 0x022E9}, // SUCCEEDS BUT NOT EQUIVALENT TO ++ {"succsim", 0x0227F}, // SUCCEEDS OR EQUIVALENT TO ++ {"SuchThat", 0x0220B}, // CONTAINS AS MEMBER ++ {"sum", 0x02211}, // N-ARY SUMMATION ++ {"Sum", 0x02211}, // N-ARY SUMMATION ++ {"sung", 0x0266A}, // EIGHTH NOTE ++ {"sup", 0x02283}, // SUPERSET OF ++ {"Sup", 0x022D1}, // DOUBLE SUPERSET ++ {"sup1", 0x000B9}, // SUPERSCRIPT ONE ++ {"sup2", 0x000B2}, // SUPERSCRIPT TWO ++ {"sup3", 0x000B3}, // SUPERSCRIPT THREE ++ {"supdot", 0x02ABE}, // SUPERSET WITH DOT ++ {"supdsub", 0x02AD8}, // SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET ++ {"supe", 0x02287}, // SUPERSET OF OR EQUAL TO ++ {"supE", 0x02AC6}, // SUPERSET OF ABOVE EQUALS SIGN ++ {"supedot", 0x02AC4}, // SUPERSET OF OR EQUAL TO WITH DOT ABOVE ++ {"Superset", 0x02283}, // SUPERSET OF ++ {"SupersetEqual", 0x02287}, // SUPERSET OF OR EQUAL TO ++ {"suphsol", 0x027C9}, // SUPERSET PRECEDING SOLIDUS ++ {"suphsub", 0x02AD7}, // SUPERSET BESIDE SUBSET ++ {"suplarr", 0x0297B}, // SUPERSET ABOVE LEFTWARDS ARROW ++ {"supmult", 0x02AC2}, // SUPERSET WITH MULTIPLICATION SIGN BELOW ++ {"supne", 0x0228B}, // SUPERSET OF WITH NOT EQUAL TO ++ {"supnE", 0x02ACC}, // SUPERSET OF ABOVE NOT EQUAL TO ++ {"supplus", 0x02AC0}, // SUPERSET WITH PLUS SIGN BELOW ++ {"supset", 0x02283}, // SUPERSET OF ++ {"Supset", 0x022D1}, // DOUBLE SUPERSET ++ {"supseteq", 0x02287}, // SUPERSET OF OR EQUAL TO ++ {"supseteqq", 0x02AC6}, // SUPERSET OF ABOVE EQUALS SIGN ++ {"supsetneq", 0x0228B}, // SUPERSET OF WITH NOT EQUAL TO ++ {"supsetneqq", 0x02ACC}, // SUPERSET OF ABOVE NOT EQUAL TO ++ {"supsim", 0x02AC8}, // SUPERSET OF ABOVE TILDE OPERATOR ++ {"supsub", 0x02AD4}, // SUPERSET ABOVE SUBSET ++ {"supsup", 0x02AD6}, // SUPERSET ABOVE SUPERSET ++ {"swarhk", 0x02926}, // SOUTH WEST ARROW WITH HOOK ++ {"swarr", 0x02199}, // SOUTH WEST ARROW ++ {"swArr", 0x021D9}, // SOUTH WEST DOUBLE ARROW ++ {"swarrow", 0x02199}, // SOUTH WEST ARROW ++ {"swnwar", 0x0292A}, // SOUTH WEST ARROW AND NORTH WEST ARROW ++ {"szlig", 0x000DF}, // LATIN SMALL LETTER SHARP S ++ {NULL, 0} + }; + + static NameId namesT[]={ +- "Tab", 0x00009, // CHARACTER TABULATION +- "target", 0x02316, // POSITION INDICATOR +- "Tau", 0x003A4, // GREEK CAPITAL LETTER TAU +- "tau", 0x003C4, // GREEK SMALL LETTER TAU +- "tbrk", 0x023B4, // TOP SQUARE BRACKET +- "Tcaron", 0x00164, // LATIN CAPITAL LETTER T WITH CARON +- "tcaron", 0x00165, // LATIN SMALL LETTER T WITH CARON +- "Tcedil", 0x00162, // LATIN CAPITAL LETTER T WITH CEDILLA +- "tcedil", 0x00163, // LATIN SMALL LETTER T WITH CEDILLA +- "Tcy", 0x00422, // CYRILLIC CAPITAL LETTER TE +- "tcy", 0x00442, // CYRILLIC SMALL LETTER TE +- "tdot", 0x020DB, // COMBINING THREE DOTS ABOVE +- "telrec", 0x02315, // TELEPHONE RECORDER +- "Tfr", 0x1D517, // MATHEMATICAL FRAKTUR CAPITAL T +- "tfr", 0x1D531, // MATHEMATICAL FRAKTUR SMALL T +- "Tgr", 0x003A4, // GREEK CAPITAL LETTER TAU +- "tgr", 0x003C4, // GREEK SMALL LETTER TAU +- "there4", 0x02234, // THEREFORE +- "therefore", 0x02234, // THEREFORE +- "Therefore", 0x02234, // THEREFORE +- "Theta", 0x00398, // GREEK CAPITAL LETTER THETA +- "theta", 0x003B8, // GREEK SMALL LETTER THETA +- "thetasym", 0x003D1, // GREEK THETA SYMBOL +- "thetav", 0x003D1, // GREEK THETA SYMBOL +- "THgr", 0x00398, // GREEK CAPITAL LETTER THETA +- "thgr", 0x003B8, // GREEK SMALL LETTER THETA +- "thickapprox", 0x02248, // ALMOST EQUAL TO +- "thicksim", 0x0223C, // TILDE OPERATOR +-// "ThickSpace", 0x0205F;0x0200A, // space of width 5/18 em +- "thinsp", 0x02009, // THIN SPACE +- "ThinSpace", 0x02009, // THIN SPACE +- "thkap", 0x02248, // ALMOST EQUAL TO +- "thksim", 0x0223C, // TILDE OPERATOR +- "THORN", 0x000DE, // LATIN CAPITAL LETTER THORN +- "thorn", 0x000FE, // LATIN SMALL LETTER THORN +- "tilde", 0x002DC, // SMALL TILDE +- "Tilde", 0x0223C, // TILDE OPERATOR +- "TildeEqual", 0x02243, // ASYMPTOTICALLY EQUAL TO +- "TildeFullEqual", 0x02245, // APPROXIMATELY EQUAL TO +- "TildeTilde", 0x02248, // ALMOST EQUAL TO +- "times", 0x000D7, // MULTIPLICATION SIGN +- "timesb", 0x022A0, // SQUARED TIMES +- "timesbar", 0x02A31, // MULTIPLICATION SIGN WITH UNDERBAR +- "timesd", 0x02A30, // MULTIPLICATION SIGN WITH DOT ABOVE +- "tint", 0x0222D, // TRIPLE INTEGRAL +- "toea", 0x02928, // NORTH EAST ARROW AND SOUTH EAST ARROW +- "top", 0x022A4, // DOWN TACK +- "topbot", 0x02336, // APL FUNCTIONAL SYMBOL I-BEAM +- "topcir", 0x02AF1, // DOWN TACK WITH CIRCLE BELOW +- "Topf", 0x1D54B, // MATHEMATICAL DOUBLE-STRUCK CAPITAL T +- "topf", 0x1D565, // MATHEMATICAL DOUBLE-STRUCK SMALL T +- "topfork", 0x02ADA, // PITCHFORK WITH TEE TOP +- "tosa", 0x02929, // SOUTH EAST ARROW AND SOUTH WEST ARROW +- "tprime", 0x02034, // TRIPLE PRIME +- "trade", 0x02122, // TRADE MARK SIGN +- "TRADE", 0x02122, // TRADE MARK SIGN +- "triangle", 0x025B5, // WHITE UP-POINTING SMALL TRIANGLE +- "triangledown", 0x025BF, // WHITE DOWN-POINTING SMALL TRIANGLE +- "triangleleft", 0x025C3, // WHITE LEFT-POINTING SMALL TRIANGLE +- "trianglelefteq", 0x022B4, // NORMAL SUBGROUP OF OR EQUAL TO +- "triangleq", 0x0225C, // DELTA EQUAL TO +- "triangleright", 0x025B9, // WHITE RIGHT-POINTING SMALL TRIANGLE +- "trianglerighteq", 0x022B5, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +- "tridot", 0x025EC, // WHITE UP-POINTING TRIANGLE WITH DOT +- "trie", 0x0225C, // DELTA EQUAL TO +- "triminus", 0x02A3A, // MINUS SIGN IN TRIANGLE +- "TripleDot", 0x020DB, // COMBINING THREE DOTS ABOVE +- "triplus", 0x02A39, // PLUS SIGN IN TRIANGLE +- "trisb", 0x029CD, // TRIANGLE WITH SERIFS AT BOTTOM +- "tritime", 0x02A3B, // MULTIPLICATION SIGN IN TRIANGLE +- "trpezium", 0x023E2, // WHITE TRAPEZIUM +- "Tscr", 0x1D4AF, // MATHEMATICAL SCRIPT CAPITAL T +- "tscr", 0x1D4C9, // MATHEMATICAL SCRIPT SMALL T +- "TScy", 0x00426, // CYRILLIC CAPITAL LETTER TSE +- "tscy", 0x00446, // CYRILLIC SMALL LETTER TSE +- "TSHcy", 0x0040B, // CYRILLIC CAPITAL LETTER TSHE +- "tshcy", 0x0045B, // CYRILLIC SMALL LETTER TSHE +- "Tstrok", 0x00166, // LATIN CAPITAL LETTER T WITH STROKE +- "tstrok", 0x00167, // LATIN SMALL LETTER T WITH STROKE +- "twixt", 0x0226C, // BETWEEN +- "twoheadleftarrow", 0x0219E, // LEFTWARDS TWO HEADED ARROW +- "twoheadrightarrow", 0x021A0, // RIGHTWARDS TWO HEADED ARROW +- NULL, 0 ++ {"Tab", 0x00009}, // CHARACTER TABULATION ++ {"target", 0x02316}, // POSITION INDICATOR ++ {"Tau", 0x003A4}, // GREEK CAPITAL LETTER TAU ++ {"tau", 0x003C4}, // GREEK SMALL LETTER TAU ++ {"tbrk", 0x023B4}, // TOP SQUARE BRACKET ++ {"Tcaron", 0x00164}, // LATIN CAPITAL LETTER T WITH CARON ++ {"tcaron", 0x00165}, // LATIN SMALL LETTER T WITH CARON ++ {"Tcedil", 0x00162}, // LATIN CAPITAL LETTER T WITH CEDILLA ++ {"tcedil", 0x00163}, // LATIN SMALL LETTER T WITH CEDILLA ++ {"Tcy", 0x00422}, // CYRILLIC CAPITAL LETTER TE ++ {"tcy", 0x00442}, // CYRILLIC SMALL LETTER TE ++ {"tdot", 0x020DB}, // COMBINING THREE DOTS ABOVE ++ {"telrec", 0x02315}, // TELEPHONE RECORDER ++ {"Tfr", 0x1D517}, // MATHEMATICAL FRAKTUR CAPITAL T ++ {"tfr", 0x1D531}, // MATHEMATICAL FRAKTUR SMALL T ++ {"Tgr", 0x003A4}, // GREEK CAPITAL LETTER TAU ++ {"tgr", 0x003C4}, // GREEK SMALL LETTER TAU ++ {"there4", 0x02234}, // THEREFORE ++ {"therefore", 0x02234}, // THEREFORE ++ {"Therefore", 0x02234}, // THEREFORE ++ {"Theta", 0x00398}, // GREEK CAPITAL LETTER THETA ++ {"theta", 0x003B8}, // GREEK SMALL LETTER THETA ++ {"thetasym", 0x003D1}, // GREEK THETA SYMBOL ++ {"thetav", 0x003D1}, // GREEK THETA SYMBOL ++ {"THgr", 0x00398}, // GREEK CAPITAL LETTER THETA ++ {"thgr", 0x003B8}, // GREEK SMALL LETTER THETA ++ {"thickapprox", 0x02248}, // ALMOST EQUAL TO ++ {"thicksim", 0x0223C}, // TILDE OPERATOR ++// "ThickSpace", 0x0205F;0x0200A}, // space of width 5/18 em ++ {"thinsp", 0x02009}, // THIN SPACE ++ {"ThinSpace", 0x02009}, // THIN SPACE ++ {"thkap", 0x02248}, // ALMOST EQUAL TO ++ {"thksim", 0x0223C}, // TILDE OPERATOR ++ {"THORN", 0x000DE}, // LATIN CAPITAL LETTER THORN ++ {"thorn", 0x000FE}, // LATIN SMALL LETTER THORN ++ {"tilde", 0x002DC}, // SMALL TILDE ++ {"Tilde", 0x0223C}, // TILDE OPERATOR ++ {"TildeEqual", 0x02243}, // ASYMPTOTICALLY EQUAL TO ++ {"TildeFullEqual", 0x02245}, // APPROXIMATELY EQUAL TO ++ {"TildeTilde", 0x02248}, // ALMOST EQUAL TO ++ {"times", 0x000D7}, // MULTIPLICATION SIGN ++ {"timesb", 0x022A0}, // SQUARED TIMES ++ {"timesbar", 0x02A31}, // MULTIPLICATION SIGN WITH UNDERBAR ++ {"timesd", 0x02A30}, // MULTIPLICATION SIGN WITH DOT ABOVE ++ {"tint", 0x0222D}, // TRIPLE INTEGRAL ++ {"toea", 0x02928}, // NORTH EAST ARROW AND SOUTH EAST ARROW ++ {"top", 0x022A4}, // DOWN TACK ++ {"topbot", 0x02336}, // APL FUNCTIONAL SYMBOL I-BEAM ++ {"topcir", 0x02AF1}, // DOWN TACK WITH CIRCLE BELOW ++ {"Topf", 0x1D54B}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL T ++ {"topf", 0x1D565}, // MATHEMATICAL DOUBLE-STRUCK SMALL T ++ {"topfork", 0x02ADA}, // PITCHFORK WITH TEE TOP ++ {"tosa", 0x02929}, // SOUTH EAST ARROW AND SOUTH WEST ARROW ++ {"tprime", 0x02034}, // TRIPLE PRIME ++ {"trade", 0x02122}, // TRADE MARK SIGN ++ {"TRADE", 0x02122}, // TRADE MARK SIGN ++ {"triangle", 0x025B5}, // WHITE UP-POINTING SMALL TRIANGLE ++ {"triangledown", 0x025BF}, // WHITE DOWN-POINTING SMALL TRIANGLE ++ {"triangleleft", 0x025C3}, // WHITE LEFT-POINTING SMALL TRIANGLE ++ {"trianglelefteq", 0x022B4}, // NORMAL SUBGROUP OF OR EQUAL TO ++ {"triangleq", 0x0225C}, // DELTA EQUAL TO ++ {"triangleright", 0x025B9}, // WHITE RIGHT-POINTING SMALL TRIANGLE ++ {"trianglerighteq", 0x022B5}, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO ++ {"tridot", 0x025EC}, // WHITE UP-POINTING TRIANGLE WITH DOT ++ {"trie", 0x0225C}, // DELTA EQUAL TO ++ {"triminus", 0x02A3A}, // MINUS SIGN IN TRIANGLE ++ {"TripleDot", 0x020DB}, // COMBINING THREE DOTS ABOVE ++ {"triplus", 0x02A39}, // PLUS SIGN IN TRIANGLE ++ {"trisb", 0x029CD}, // TRIANGLE WITH SERIFS AT BOTTOM ++ {"tritime", 0x02A3B}, // MULTIPLICATION SIGN IN TRIANGLE ++ {"trpezium", 0x023E2}, // WHITE TRAPEZIUM ++ {"Tscr", 0x1D4AF}, // MATHEMATICAL SCRIPT CAPITAL T ++ {"tscr", 0x1D4C9}, // MATHEMATICAL SCRIPT SMALL T ++ {"TScy", 0x00426}, // CYRILLIC CAPITAL LETTER TSE ++ {"tscy", 0x00446}, // CYRILLIC SMALL LETTER TSE ++ {"TSHcy", 0x0040B}, // CYRILLIC CAPITAL LETTER TSHE ++ {"tshcy", 0x0045B}, // CYRILLIC SMALL LETTER TSHE ++ {"Tstrok", 0x00166}, // LATIN CAPITAL LETTER T WITH STROKE ++ {"tstrok", 0x00167}, // LATIN SMALL LETTER T WITH STROKE ++ {"twixt", 0x0226C}, // BETWEEN ++ {"twoheadleftarrow", 0x0219E}, // LEFTWARDS TWO HEADED ARROW ++ {"twoheadrightarrow", 0x021A0}, // RIGHTWARDS TWO HEADED ARROW ++ {NULL, 0} + }; + + static NameId namesU[]={ +- "Uacgr", 0x0038E, // GREEK CAPITAL LETTER UPSILON WITH TONOS +- "uacgr", 0x003CD, // GREEK SMALL LETTER UPSILON WITH TONOS +- "Uacute", 0x000DA, // LATIN CAPITAL LETTER U WITH ACUTE +- "uacute", 0x000FA, // LATIN SMALL LETTER U WITH ACUTE +- "uarr", 0x02191, // UPWARDS ARROW +- "Uarr", 0x0219F, // UPWARDS TWO HEADED ARROW +- "uArr", 0x021D1, // UPWARDS DOUBLE ARROW +- "Uarrocir", 0x02949, // UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +- "Ubrcy", 0x0040E, // CYRILLIC CAPITAL LETTER SHORT U +- "ubrcy", 0x0045E, // CYRILLIC SMALL LETTER SHORT U +- "Ubreve", 0x0016C, // LATIN CAPITAL LETTER U WITH BREVE +- "ubreve", 0x0016D, // LATIN SMALL LETTER U WITH BREVE +- "Ucirc", 0x000DB, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX +- "ucirc", 0x000FB, // LATIN SMALL LETTER U WITH CIRCUMFLEX +- "Ucy", 0x00423, // CYRILLIC CAPITAL LETTER U +- "ucy", 0x00443, // CYRILLIC SMALL LETTER U +- "udarr", 0x021C5, // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +- "Udblac", 0x00170, // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +- "udblac", 0x00171, // LATIN SMALL LETTER U WITH DOUBLE ACUTE +- "udhar", 0x0296E, // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +- "udiagr", 0x003B0, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +- "Udigr", 0x003AB, // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +- "udigr", 0x003CB, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA +- "ufisht", 0x0297E, // UP FISH TAIL +- "Ufr", 0x1D518, // MATHEMATICAL FRAKTUR CAPITAL U +- "ufr", 0x1D532, // MATHEMATICAL FRAKTUR SMALL U +- "Ugr", 0x003A5, // GREEK CAPITAL LETTER UPSILON +- "ugr", 0x003C5, // GREEK SMALL LETTER UPSILON +- "Ugrave", 0x000D9, // LATIN CAPITAL LETTER U WITH GRAVE +- "ugrave", 0x000F9, // LATIN SMALL LETTER U WITH GRAVE +- "uHar", 0x02963, // UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +- "uharl", 0x021BF, // UPWARDS HARPOON WITH BARB LEFTWARDS +- "uharr", 0x021BE, // UPWARDS HARPOON WITH BARB RIGHTWARDS +- "uhblk", 0x02580, // UPPER HALF BLOCK +- "ulcorn", 0x0231C, // TOP LEFT CORNER +- "ulcorner", 0x0231C, // TOP LEFT CORNER +- "ulcrop", 0x0230F, // TOP LEFT CROP +- "ultri", 0x025F8, // UPPER LEFT TRIANGLE +- "Umacr", 0x0016A, // LATIN CAPITAL LETTER U WITH MACRON +- "umacr", 0x0016B, // LATIN SMALL LETTER U WITH MACRON +- "uml", 0x000A8, // DIAERESIS +- "UnderBar", 0x0005F, // LOW LINE +- "UnderBrace", 0x023DF, // BOTTOM CURLY BRACKET +- "UnderBracket", 0x023B5, // BOTTOM SQUARE BRACKET +- "UnderParenthesis", 0x023DD, // BOTTOM PARENTHESIS +- "Union", 0x022C3, // N-ARY UNION +- "UnionPlus", 0x0228E, // MULTISET UNION +- "Uogon", 0x00172, // LATIN CAPITAL LETTER U WITH OGONEK +- "uogon", 0x00173, // LATIN SMALL LETTER U WITH OGONEK +- "Uopf", 0x1D54C, // MATHEMATICAL DOUBLE-STRUCK CAPITAL U +- "uopf", 0x1D566, // MATHEMATICAL DOUBLE-STRUCK SMALL U +- "uparrow", 0x02191, // UPWARDS ARROW +- "UpArrow", 0x02191, // UPWARDS ARROW +- "Uparrow", 0x021D1, // UPWARDS DOUBLE ARROW +- "UpArrowBar", 0x02912, // UPWARDS ARROW TO BAR +- "UpArrowDownArrow", 0x021C5, // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +- "updownarrow", 0x02195, // UP DOWN ARROW +- "UpDownArrow", 0x02195, // UP DOWN ARROW +- "Updownarrow", 0x021D5, // UP DOWN DOUBLE ARROW +- "UpEquilibrium", 0x0296E, // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +- "upharpoonleft", 0x021BF, // UPWARDS HARPOON WITH BARB LEFTWARDS +- "upharpoonright", 0x021BE, // UPWARDS HARPOON WITH BARB RIGHTWARDS +- "uplus", 0x0228E, // MULTISET UNION +- "UpperLeftArrow", 0x02196, // NORTH WEST ARROW +- "UpperRightArrow", 0x02197, // NORTH EAST ARROW +- "upsi", 0x003C5, // GREEK SMALL LETTER UPSILON +- "Upsi", 0x003D2, // GREEK UPSILON WITH HOOK SYMBOL +- "upsih", 0x003D2, // GREEK UPSILON WITH HOOK SYMBOL +- "Upsilon", 0x003A5, // GREEK CAPITAL LETTER UPSILON +- "upsilon", 0x003C5, // GREEK SMALL LETTER UPSILON +- "UpTee", 0x022A5, // UP TACK +- "UpTeeArrow", 0x021A5, // UPWARDS ARROW FROM BAR +- "upuparrows", 0x021C8, // UPWARDS PAIRED ARROWS +- "urcorn", 0x0231D, // TOP RIGHT CORNER +- "urcorner", 0x0231D, // TOP RIGHT CORNER +- "urcrop", 0x0230E, // TOP RIGHT CROP +- "Uring", 0x0016E, // LATIN CAPITAL LETTER U WITH RING ABOVE +- "uring", 0x0016F, // LATIN SMALL LETTER U WITH RING ABOVE +- "urtri", 0x025F9, // UPPER RIGHT TRIANGLE +- "Uscr", 0x1D4B0, // MATHEMATICAL SCRIPT CAPITAL U +- "uscr", 0x1D4CA, // MATHEMATICAL SCRIPT SMALL U +- "utdot", 0x022F0, // UP RIGHT DIAGONAL ELLIPSIS +- "Utilde", 0x00168, // LATIN CAPITAL LETTER U WITH TILDE +- "utilde", 0x00169, // LATIN SMALL LETTER U WITH TILDE +- "utri", 0x025B5, // WHITE UP-POINTING SMALL TRIANGLE +- "utrif", 0x025B4, // BLACK UP-POINTING SMALL TRIANGLE +- "uuarr", 0x021C8, // UPWARDS PAIRED ARROWS +- "Uuml", 0x000DC, // LATIN CAPITAL LETTER U WITH DIAERESIS +- "uuml", 0x000FC, // LATIN SMALL LETTER U WITH DIAERESIS +- "uwangle", 0x029A7, // OBLIQUE ANGLE OPENING DOWN +- NULL, 0 ++ {"Uacgr", 0x0038E}, // GREEK CAPITAL LETTER UPSILON WITH TONOS ++ {"uacgr", 0x003CD}, // GREEK SMALL LETTER UPSILON WITH TONOS ++ {"Uacute", 0x000DA}, // LATIN CAPITAL LETTER U WITH ACUTE ++ {"uacute", 0x000FA}, // LATIN SMALL LETTER U WITH ACUTE ++ {"uarr", 0x02191}, // UPWARDS ARROW ++ {"Uarr", 0x0219F}, // UPWARDS TWO HEADED ARROW ++ {"uArr", 0x021D1}, // UPWARDS DOUBLE ARROW ++ {"Uarrocir", 0x02949}, // UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE ++ {"Ubrcy", 0x0040E}, // CYRILLIC CAPITAL LETTER SHORT U ++ {"ubrcy", 0x0045E}, // CYRILLIC SMALL LETTER SHORT U ++ {"Ubreve", 0x0016C}, // LATIN CAPITAL LETTER U WITH BREVE ++ {"ubreve", 0x0016D}, // LATIN SMALL LETTER U WITH BREVE ++ {"Ucirc", 0x000DB}, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX ++ {"ucirc", 0x000FB}, // LATIN SMALL LETTER U WITH CIRCUMFLEX ++ {"Ucy", 0x00423}, // CYRILLIC CAPITAL LETTER U ++ {"ucy", 0x00443}, // CYRILLIC SMALL LETTER U ++ {"udarr", 0x021C5}, // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW ++ {"Udblac", 0x00170}, // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE ++ {"udblac", 0x00171}, // LATIN SMALL LETTER U WITH DOUBLE ACUTE ++ {"udhar", 0x0296E}, // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT ++ {"udiagr", 0x003B0}, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS ++ {"Udigr", 0x003AB}, // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA ++ {"udigr", 0x003CB}, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA ++ {"ufisht", 0x0297E}, // UP FISH TAIL ++ {"Ufr", 0x1D518}, // MATHEMATICAL FRAKTUR CAPITAL U ++ {"ufr", 0x1D532}, // MATHEMATICAL FRAKTUR SMALL U ++ {"Ugr", 0x003A5}, // GREEK CAPITAL LETTER UPSILON ++ {"ugr", 0x003C5}, // GREEK SMALL LETTER UPSILON ++ {"Ugrave", 0x000D9}, // LATIN CAPITAL LETTER U WITH GRAVE ++ {"ugrave", 0x000F9}, // LATIN SMALL LETTER U WITH GRAVE ++ {"uHar", 0x02963}, // UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT ++ {"uharl", 0x021BF}, // UPWARDS HARPOON WITH BARB LEFTWARDS ++ {"uharr", 0x021BE}, // UPWARDS HARPOON WITH BARB RIGHTWARDS ++ {"uhblk", 0x02580}, // UPPER HALF BLOCK ++ {"ulcorn", 0x0231C}, // TOP LEFT CORNER ++ {"ulcorner", 0x0231C}, // TOP LEFT CORNER ++ {"ulcrop", 0x0230F}, // TOP LEFT CROP ++ {"ultri", 0x025F8}, // UPPER LEFT TRIANGLE ++ {"Umacr", 0x0016A}, // LATIN CAPITAL LETTER U WITH MACRON ++ {"umacr", 0x0016B}, // LATIN SMALL LETTER U WITH MACRON ++ {"uml", 0x000A8}, // DIAERESIS ++ {"UnderBar", 0x0005F}, // LOW LINE ++ {"UnderBrace", 0x023DF}, // BOTTOM CURLY BRACKET ++ {"UnderBracket", 0x023B5}, // BOTTOM SQUARE BRACKET ++ {"UnderParenthesis", 0x023DD}, // BOTTOM PARENTHESIS ++ {"Union", 0x022C3}, // N-ARY UNION ++ {"UnionPlus", 0x0228E}, // MULTISET UNION ++ {"Uogon", 0x00172}, // LATIN CAPITAL LETTER U WITH OGONEK ++ {"uogon", 0x00173}, // LATIN SMALL LETTER U WITH OGONEK ++ {"Uopf", 0x1D54C}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL U ++ {"uopf", 0x1D566}, // MATHEMATICAL DOUBLE-STRUCK SMALL U ++ {"uparrow", 0x02191}, // UPWARDS ARROW ++ {"UpArrow", 0x02191}, // UPWARDS ARROW ++ {"Uparrow", 0x021D1}, // UPWARDS DOUBLE ARROW ++ {"UpArrowBar", 0x02912}, // UPWARDS ARROW TO BAR ++ {"UpArrowDownArrow", 0x021C5}, // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW ++ {"updownarrow", 0x02195}, // UP DOWN ARROW ++ {"UpDownArrow", 0x02195}, // UP DOWN ARROW ++ {"Updownarrow", 0x021D5}, // UP DOWN DOUBLE ARROW ++ {"UpEquilibrium", 0x0296E}, // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT ++ {"upharpoonleft", 0x021BF}, // UPWARDS HARPOON WITH BARB LEFTWARDS ++ {"upharpoonright", 0x021BE}, // UPWARDS HARPOON WITH BARB RIGHTWARDS ++ {"uplus", 0x0228E}, // MULTISET UNION ++ {"UpperLeftArrow", 0x02196}, // NORTH WEST ARROW ++ {"UpperRightArrow", 0x02197}, // NORTH EAST ARROW ++ {"upsi", 0x003C5}, // GREEK SMALL LETTER UPSILON ++ {"Upsi", 0x003D2}, // GREEK UPSILON WITH HOOK SYMBOL ++ {"upsih", 0x003D2}, // GREEK UPSILON WITH HOOK SYMBOL ++ {"Upsilon", 0x003A5}, // GREEK CAPITAL LETTER UPSILON ++ {"upsilon", 0x003C5}, // GREEK SMALL LETTER UPSILON ++ {"UpTee", 0x022A5}, // UP TACK ++ {"UpTeeArrow", 0x021A5}, // UPWARDS ARROW FROM BAR ++ {"upuparrows", 0x021C8}, // UPWARDS PAIRED ARROWS ++ {"urcorn", 0x0231D}, // TOP RIGHT CORNER ++ {"urcorner", 0x0231D}, // TOP RIGHT CORNER ++ {"urcrop", 0x0230E}, // TOP RIGHT CROP ++ {"Uring", 0x0016E}, // LATIN CAPITAL LETTER U WITH RING ABOVE ++ {"uring", 0x0016F}, // LATIN SMALL LETTER U WITH RING ABOVE ++ {"urtri", 0x025F9}, // UPPER RIGHT TRIANGLE ++ {"Uscr", 0x1D4B0}, // MATHEMATICAL SCRIPT CAPITAL U ++ {"uscr", 0x1D4CA}, // MATHEMATICAL SCRIPT SMALL U ++ {"utdot", 0x022F0}, // UP RIGHT DIAGONAL ELLIPSIS ++ {"Utilde", 0x00168}, // LATIN CAPITAL LETTER U WITH TILDE ++ {"utilde", 0x00169}, // LATIN SMALL LETTER U WITH TILDE ++ {"utri", 0x025B5}, // WHITE UP-POINTING SMALL TRIANGLE ++ {"utrif", 0x025B4}, // BLACK UP-POINTING SMALL TRIANGLE ++ {"uuarr", 0x021C8}, // UPWARDS PAIRED ARROWS ++ {"Uuml", 0x000DC}, // LATIN CAPITAL LETTER U WITH DIAERESIS ++ {"uuml", 0x000FC}, // LATIN SMALL LETTER U WITH DIAERESIS ++ {"uwangle", 0x029A7}, // OBLIQUE ANGLE OPENING DOWN ++ {NULL, 0} + }; + + static NameId namesV[]={ +- "vangrt", 0x0299C, // RIGHT ANGLE VARIANT WITH SQUARE +- "varepsilon", 0x003F5, // GREEK LUNATE EPSILON SYMBOL +- "varkappa", 0x003F0, // GREEK KAPPA SYMBOL +- "varnothing", 0x02205, // EMPTY SET +- "varphi", 0x003D5, // GREEK PHI SYMBOL +- "varpi", 0x003D6, // GREEK PI SYMBOL +- "varpropto", 0x0221D, // PROPORTIONAL TO +- "varr", 0x02195, // UP DOWN ARROW +- "vArr", 0x021D5, // UP DOWN DOUBLE ARROW +- "varrho", 0x003F1, // GREEK RHO SYMBOL +- "varsigma", 0x003C2, // GREEK SMALL LETTER FINAL SIGMA +-// "varsubsetneq", 0x0228A;0x0FE00, // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +-// "varsubsetneqq", 0x02ACB;0x0FE00, // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +-// "varsupsetneq", 0x0228B;0x0FE00, // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +-// "varsupsetneqq", 0x02ACC;0x0FE00, // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +- "vartheta", 0x003D1, // GREEK THETA SYMBOL +- "vartriangleleft", 0x022B2, // NORMAL SUBGROUP OF +- "vartriangleright", 0x022B3, // CONTAINS AS NORMAL SUBGROUP +- "vBar", 0x02AE8, // SHORT UP TACK WITH UNDERBAR +- "Vbar", 0x02AEB, // DOUBLE UP TACK +- "vBarv", 0x02AE9, // SHORT UP TACK ABOVE SHORT DOWN TACK +- "Vcy", 0x00412, // CYRILLIC CAPITAL LETTER VE +- "vcy", 0x00432, // CYRILLIC SMALL LETTER VE +- "vdash", 0x022A2, // RIGHT TACK +- "vDash", 0x022A8, // TRUE +- "Vdash", 0x022A9, // FORCES +- "VDash", 0x022AB, // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +- "Vdashl", 0x02AE6, // LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +- "vee", 0x02228, // LOGICAL OR +- "Vee", 0x022C1, // N-ARY LOGICAL OR +- "veebar", 0x022BB, // XOR +- "veeeq", 0x0225A, // EQUIANGULAR TO +- "vellip", 0x022EE, // VERTICAL ELLIPSIS +- "verbar", 0x0007C, // VERTICAL LINE +- "Verbar", 0x02016, // DOUBLE VERTICAL LINE +- "vert", 0x0007C, // VERTICAL LINE +- "Vert", 0x02016, // DOUBLE VERTICAL LINE +- "VerticalBar", 0x02223, // DIVIDES +- "VerticalLine", 0x0007C, // VERTICAL LINE +- "VerticalSeparator", 0x02758, // LIGHT VERTICAL BAR +- "VerticalTilde", 0x02240, // WREATH PRODUCT +- "VeryThinSpace", 0x0200A, // HAIR SPACE +- "Vfr", 0x1D519, // MATHEMATICAL FRAKTUR CAPITAL V +- "vfr", 0x1D533, // MATHEMATICAL FRAKTUR SMALL V +- "vltri", 0x022B2, // NORMAL SUBGROUP OF +-// "vnsub", 0x02282;0x020D2, // SUBSET OF with vertical line +-// "vnsup", 0x02283;0x020D2, // SUPERSET OF with vertical line +- "Vopf", 0x1D54D, // MATHEMATICAL DOUBLE-STRUCK CAPITAL V +- "vopf", 0x1D567, // MATHEMATICAL DOUBLE-STRUCK SMALL V +- "vprop", 0x0221D, // PROPORTIONAL TO +- "vrtri", 0x022B3, // CONTAINS AS NORMAL SUBGROUP +- "Vscr", 0x1D4B1, // MATHEMATICAL SCRIPT CAPITAL V +- "vscr", 0x1D4CB, // MATHEMATICAL SCRIPT SMALL V +-// "vsubne", 0x0228A;0x0FE00, // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +-// "vsubnE", 0x02ACB;0x0FE00, // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +-// "vsupne", 0x0228B;0x0FE00, // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +-// "vsupnE", 0x02ACC;0x0FE00, // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +- "Vvdash", 0x022AA, // TRIPLE VERTICAL BAR RIGHT TURNSTILE +- "vzigzag", 0x0299A, // VERTICAL ZIGZAG LINE +- NULL, 0 ++ {"vangrt", 0x0299C}, // RIGHT ANGLE VARIANT WITH SQUARE ++ {"varepsilon", 0x003F5}, // GREEK LUNATE EPSILON SYMBOL ++ {"varkappa", 0x003F0}, // GREEK KAPPA SYMBOL ++ {"varnothing", 0x02205}, // EMPTY SET ++ {"varphi", 0x003D5}, // GREEK PHI SYMBOL ++ {"varpi", 0x003D6}, // GREEK PI SYMBOL ++ {"varpropto", 0x0221D}, // PROPORTIONAL TO ++ {"varr", 0x02195}, // UP DOWN ARROW ++ {"vArr", 0x021D5}, // UP DOWN DOUBLE ARROW ++ {"varrho", 0x003F1}, // GREEK RHO SYMBOL ++ {"varsigma", 0x003C2}, // GREEK SMALL LETTER FINAL SIGMA ++// "varsubsetneq", 0x0228A;0x0FE00}, // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members ++// "varsubsetneqq", 0x02ACB;0x0FE00}, // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members ++// "varsupsetneq", 0x0228B;0x0FE00}, // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members ++// "varsupsetneqq", 0x02ACC;0x0FE00}, // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members ++ {"vartheta", 0x003D1}, // GREEK THETA SYMBOL ++ {"vartriangleleft", 0x022B2}, // NORMAL SUBGROUP OF ++ {"vartriangleright", 0x022B3}, // CONTAINS AS NORMAL SUBGROUP ++ {"vBar", 0x02AE8}, // SHORT UP TACK WITH UNDERBAR ++ {"Vbar", 0x02AEB}, // DOUBLE UP TACK ++ {"vBarv", 0x02AE9}, // SHORT UP TACK ABOVE SHORT DOWN TACK ++ {"Vcy", 0x00412}, // CYRILLIC CAPITAL LETTER VE ++ {"vcy", 0x00432}, // CYRILLIC SMALL LETTER VE ++ {"vdash", 0x022A2}, // RIGHT TACK ++ {"vDash", 0x022A8}, // TRUE ++ {"Vdash", 0x022A9}, // FORCES ++ {"VDash", 0x022AB}, // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE ++ {"Vdashl", 0x02AE6}, // LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL ++ {"vee", 0x02228}, // LOGICAL OR ++ {"Vee", 0x022C1}, // N-ARY LOGICAL OR ++ {"veebar", 0x022BB}, // XOR ++ {"veeeq", 0x0225A}, // EQUIANGULAR TO ++ {"vellip", 0x022EE}, // VERTICAL ELLIPSIS ++ {"verbar", 0x0007C}, // VERTICAL LINE ++ {"Verbar", 0x02016}, // DOUBLE VERTICAL LINE ++ {"vert", 0x0007C}, // VERTICAL LINE ++ {"Vert", 0x02016}, // DOUBLE VERTICAL LINE ++ {"VerticalBar", 0x02223}, // DIVIDES ++ {"VerticalLine", 0x0007C}, // VERTICAL LINE ++ {"VerticalSeparator", 0x02758}, // LIGHT VERTICAL BAR ++ {"VerticalTilde", 0x02240}, // WREATH PRODUCT ++ {"VeryThinSpace", 0x0200A}, // HAIR SPACE ++ {"Vfr", 0x1D519}, // MATHEMATICAL FRAKTUR CAPITAL V ++ {"vfr", 0x1D533}, // MATHEMATICAL FRAKTUR SMALL V ++ {"vltri", 0x022B2}, // NORMAL SUBGROUP OF ++// "vnsub", 0x02282;0x020D2}, // SUBSET OF with vertical line ++// "vnsup", 0x02283;0x020D2}, // SUPERSET OF with vertical line ++ {"Vopf", 0x1D54D}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL V ++ {"vopf", 0x1D567}, // MATHEMATICAL DOUBLE-STRUCK SMALL V ++ {"vprop", 0x0221D}, // PROPORTIONAL TO ++ {"vrtri", 0x022B3}, // CONTAINS AS NORMAL SUBGROUP ++ {"Vscr", 0x1D4B1}, // MATHEMATICAL SCRIPT CAPITAL V ++ {"vscr", 0x1D4CB}, // MATHEMATICAL SCRIPT SMALL V ++// "vsubne", 0x0228A;0x0FE00}, // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members ++// "vsubnE", 0x02ACB;0x0FE00}, // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members ++// "vsupne", 0x0228B;0x0FE00}, // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members ++// "vsupnE", 0x02ACC;0x0FE00}, // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members ++ {"Vvdash", 0x022AA}, // TRIPLE VERTICAL BAR RIGHT TURNSTILE ++ {"vzigzag", 0x0299A}, // VERTICAL ZIGZAG LINE ++ {NULL, 0} + }; + + static NameId namesW[]={ +- "Wcirc", 0x00174, // LATIN CAPITAL LETTER W WITH CIRCUMFLEX +- "wcirc", 0x00175, // LATIN SMALL LETTER W WITH CIRCUMFLEX +- "wedbar", 0x02A5F, // LOGICAL AND WITH UNDERBAR +- "wedge", 0x02227, // LOGICAL AND +- "Wedge", 0x022C0, // N-ARY LOGICAL AND +- "wedgeq", 0x02259, // ESTIMATES +- "weierp", 0x02118, // SCRIPT CAPITAL P +- "Wfr", 0x1D51A, // MATHEMATICAL FRAKTUR CAPITAL W +- "wfr", 0x1D534, // MATHEMATICAL FRAKTUR SMALL W +- "Wopf", 0x1D54E, // MATHEMATICAL DOUBLE-STRUCK CAPITAL W +- "wopf", 0x1D568, // MATHEMATICAL DOUBLE-STRUCK SMALL W +- "wp", 0x02118, // SCRIPT CAPITAL P +- "wr", 0x02240, // WREATH PRODUCT +- "wreath", 0x02240, // WREATH PRODUCT +- "Wscr", 0x1D4B2, // MATHEMATICAL SCRIPT CAPITAL W +- "wscr", 0x1D4CC, // MATHEMATICAL SCRIPT SMALL W +- NULL, 0 ++ {"Wcirc", 0x00174}, // LATIN CAPITAL LETTER W WITH CIRCUMFLEX ++ {"wcirc", 0x00175}, // LATIN SMALL LETTER W WITH CIRCUMFLEX ++ {"wedbar", 0x02A5F}, // LOGICAL AND WITH UNDERBAR ++ {"wedge", 0x02227}, // LOGICAL AND ++ {"Wedge", 0x022C0}, // N-ARY LOGICAL AND ++ {"wedgeq", 0x02259}, // ESTIMATES ++ {"weierp", 0x02118}, // SCRIPT CAPITAL P ++ {"Wfr", 0x1D51A}, // MATHEMATICAL FRAKTUR CAPITAL W ++ {"wfr", 0x1D534}, // MATHEMATICAL FRAKTUR SMALL W ++ {"Wopf", 0x1D54E}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL W ++ {"wopf", 0x1D568}, // MATHEMATICAL DOUBLE-STRUCK SMALL W ++ {"wp", 0x02118}, // SCRIPT CAPITAL P ++ {"wr", 0x02240}, // WREATH PRODUCT ++ {"wreath", 0x02240}, // WREATH PRODUCT ++ {"Wscr", 0x1D4B2}, // MATHEMATICAL SCRIPT CAPITAL W ++ {"wscr", 0x1D4CC}, // MATHEMATICAL SCRIPT SMALL W ++ {NULL, 0} + }; + + static NameId namesX[]={ +- "xcap", 0x022C2, // N-ARY INTERSECTION +- "xcirc", 0x025EF, // LARGE CIRCLE +- "xcup", 0x022C3, // N-ARY UNION +- "xdtri", 0x025BD, // WHITE DOWN-POINTING TRIANGLE +- "Xfr", 0x1D51B, // MATHEMATICAL FRAKTUR CAPITAL X +- "xfr", 0x1D535, // MATHEMATICAL FRAKTUR SMALL X +- "Xgr", 0x0039E, // GREEK CAPITAL LETTER XI +- "xgr", 0x003BE, // GREEK SMALL LETTER XI +- "xharr", 0x027F7, // LONG LEFT RIGHT ARROW +- "xhArr", 0x027FA, // LONG LEFT RIGHT DOUBLE ARROW +- "Xi", 0x0039E, // GREEK CAPITAL LETTER XI +- "xi", 0x003BE, // GREEK SMALL LETTER XI +- "xlarr", 0x027F5, // LONG LEFTWARDS ARROW +- "xlArr", 0x027F8, // LONG LEFTWARDS DOUBLE ARROW +- "xmap", 0x027FC, // LONG RIGHTWARDS ARROW FROM BAR +- "xnis", 0x022FB, // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +- "xodot", 0x02A00, // N-ARY CIRCLED DOT OPERATOR +- "Xopf", 0x1D54F, // MATHEMATICAL DOUBLE-STRUCK CAPITAL X +- "xopf", 0x1D569, // MATHEMATICAL DOUBLE-STRUCK SMALL X +- "xoplus", 0x02A01, // N-ARY CIRCLED PLUS OPERATOR +- "xotime", 0x02A02, // N-ARY CIRCLED TIMES OPERATOR +- "xrarr", 0x027F6, // LONG RIGHTWARDS ARROW +- "xrArr", 0x027F9, // LONG RIGHTWARDS DOUBLE ARROW +- "Xscr", 0x1D4B3, // MATHEMATICAL SCRIPT CAPITAL X +- "xscr", 0x1D4CD, // MATHEMATICAL SCRIPT SMALL X +- "xsqcup", 0x02A06, // N-ARY SQUARE UNION OPERATOR +- "xuplus", 0x02A04, // N-ARY UNION OPERATOR WITH PLUS +- "xutri", 0x025B3, // WHITE UP-POINTING TRIANGLE +- "xvee", 0x022C1, // N-ARY LOGICAL OR +- "xwedge", 0x022C0, // N-ARY LOGICAL AND +- NULL, 0 ++ {"xcap", 0x022C2}, // N-ARY INTERSECTION ++ {"xcirc", 0x025EF}, // LARGE CIRCLE ++ {"xcup", 0x022C3}, // N-ARY UNION ++ {"xdtri", 0x025BD}, // WHITE DOWN-POINTING TRIANGLE ++ {"Xfr", 0x1D51B}, // MATHEMATICAL FRAKTUR CAPITAL X ++ {"xfr", 0x1D535}, // MATHEMATICAL FRAKTUR SMALL X ++ {"Xgr", 0x0039E}, // GREEK CAPITAL LETTER XI ++ {"xgr", 0x003BE}, // GREEK SMALL LETTER XI ++ {"xharr", 0x027F7}, // LONG LEFT RIGHT ARROW ++ {"xhArr", 0x027FA}, // LONG LEFT RIGHT DOUBLE ARROW ++ {"Xi", 0x0039E}, // GREEK CAPITAL LETTER XI ++ {"xi", 0x003BE}, // GREEK SMALL LETTER XI ++ {"xlarr", 0x027F5}, // LONG LEFTWARDS ARROW ++ {"xlArr", 0x027F8}, // LONG LEFTWARDS DOUBLE ARROW ++ {"xmap", 0x027FC}, // LONG RIGHTWARDS ARROW FROM BAR ++ {"xnis", 0x022FB}, // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE ++ {"xodot", 0x02A00}, // N-ARY CIRCLED DOT OPERATOR ++ {"Xopf", 0x1D54F}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL X ++ {"xopf", 0x1D569}, // MATHEMATICAL DOUBLE-STRUCK SMALL X ++ {"xoplus", 0x02A01}, // N-ARY CIRCLED PLUS OPERATOR ++ {"xotime", 0x02A02}, // N-ARY CIRCLED TIMES OPERATOR ++ {"xrarr", 0x027F6}, // LONG RIGHTWARDS ARROW ++ {"xrArr", 0x027F9}, // LONG RIGHTWARDS DOUBLE ARROW ++ {"Xscr", 0x1D4B3}, // MATHEMATICAL SCRIPT CAPITAL X ++ {"xscr", 0x1D4CD}, // MATHEMATICAL SCRIPT SMALL X ++ {"xsqcup", 0x02A06}, // N-ARY SQUARE UNION OPERATOR ++ {"xuplus", 0x02A04}, // N-ARY UNION OPERATOR WITH PLUS ++ {"xutri", 0x025B3}, // WHITE UP-POINTING TRIANGLE ++ {"xvee", 0x022C1}, // N-ARY LOGICAL OR ++ {"xwedge", 0x022C0}, // N-ARY LOGICAL AND ++ {NULL, 0} + }; + + static NameId namesY[]={ +- "Yacute", 0x000DD, // LATIN CAPITAL LETTER Y WITH ACUTE +- "yacute", 0x000FD, // LATIN SMALL LETTER Y WITH ACUTE +- "YAcy", 0x0042F, // CYRILLIC CAPITAL LETTER YA +- "yacy", 0x0044F, // CYRILLIC SMALL LETTER YA +- "Ycirc", 0x00176, // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +- "ycirc", 0x00177, // LATIN SMALL LETTER Y WITH CIRCUMFLEX +- "Ycy", 0x0042B, // CYRILLIC CAPITAL LETTER YERU +- "ycy", 0x0044B, // CYRILLIC SMALL LETTER YERU +- "yen", 0x000A5, // YEN SIGN +- "Yfr", 0x1D51C, // MATHEMATICAL FRAKTUR CAPITAL Y +- "yfr", 0x1D536, // MATHEMATICAL FRAKTUR SMALL Y +- "YIcy", 0x00407, // CYRILLIC CAPITAL LETTER YI +- "yicy", 0x00457, // CYRILLIC SMALL LETTER YI +- "Yopf", 0x1D550, // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +- "yopf", 0x1D56A, // MATHEMATICAL DOUBLE-STRUCK SMALL Y +- "Yscr", 0x1D4B4, // MATHEMATICAL SCRIPT CAPITAL Y +- "yscr", 0x1D4CE, // MATHEMATICAL SCRIPT SMALL Y +- "YUcy", 0x0042E, // CYRILLIC CAPITAL LETTER YU +- "yucy", 0x0044E, // CYRILLIC SMALL LETTER YU +- "yuml", 0x000FF, // LATIN SMALL LETTER Y WITH DIAERESIS +- "Yuml", 0x00178, // LATIN CAPITAL LETTER Y WITH DIAERESIS +- NULL, 0 ++ {"Yacute", 0x000DD}, // LATIN CAPITAL LETTER Y WITH ACUTE ++ {"yacute", 0x000FD}, // LATIN SMALL LETTER Y WITH ACUTE ++ {"YAcy", 0x0042F}, // CYRILLIC CAPITAL LETTER YA ++ {"yacy", 0x0044F}, // CYRILLIC SMALL LETTER YA ++ {"Ycirc", 0x00176}, // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX ++ {"ycirc", 0x00177}, // LATIN SMALL LETTER Y WITH CIRCUMFLEX ++ {"Ycy", 0x0042B}, // CYRILLIC CAPITAL LETTER YERU ++ {"ycy", 0x0044B}, // CYRILLIC SMALL LETTER YERU ++ {"yen", 0x000A5}, // YEN SIGN ++ {"Yfr", 0x1D51C}, // MATHEMATICAL FRAKTUR CAPITAL Y ++ {"yfr", 0x1D536}, // MATHEMATICAL FRAKTUR SMALL Y ++ {"YIcy", 0x00407}, // CYRILLIC CAPITAL LETTER YI ++ {"yicy", 0x00457}, // CYRILLIC SMALL LETTER YI ++ {"Yopf", 0x1D550}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y ++ {"yopf", 0x1D56A}, // MATHEMATICAL DOUBLE-STRUCK SMALL Y ++ {"Yscr", 0x1D4B4}, // MATHEMATICAL SCRIPT CAPITAL Y ++ {"yscr", 0x1D4CE}, // MATHEMATICAL SCRIPT SMALL Y ++ {"YUcy", 0x0042E}, // CYRILLIC CAPITAL LETTER YU ++ {"yucy", 0x0044E}, // CYRILLIC SMALL LETTER YU ++ {"yuml", 0x000FF}, // LATIN SMALL LETTER Y WITH DIAERESIS ++ {"Yuml", 0x00178}, // LATIN CAPITAL LETTER Y WITH DIAERESIS ++ {NULL, 0} + }; + + static NameId namesZ[]={ +- "Zacute", 0x00179, // LATIN CAPITAL LETTER Z WITH ACUTE +- "zacute", 0x0017A, // LATIN SMALL LETTER Z WITH ACUTE +- "Zcaron", 0x0017D, // LATIN CAPITAL LETTER Z WITH CARON +- "zcaron", 0x0017E, // LATIN SMALL LETTER Z WITH CARON +- "Zcy", 0x00417, // CYRILLIC CAPITAL LETTER ZE +- "zcy", 0x00437, // CYRILLIC SMALL LETTER ZE +- "Zdot", 0x0017B, // LATIN CAPITAL LETTER Z WITH DOT ABOVE +- "zdot", 0x0017C, // LATIN SMALL LETTER Z WITH DOT ABOVE +- "zeetrf", 0x02128, // BLACK-LETTER CAPITAL Z +- "ZeroWidthSpace", 0x0200B, // ZERO WIDTH SPACE +- "Zeta", 0x00396, // GREEK CAPITAL LETTER ZETA +- "zeta", 0x003B6, // GREEK SMALL LETTER ZETA +- "Zfr", 0x02128, // BLACK-LETTER CAPITAL Z +- "zfr", 0x1D537, // MATHEMATICAL FRAKTUR SMALL Z +- "Zgr", 0x00396, // GREEK CAPITAL LETTER ZETA +- "zgr", 0x003B6, // GREEK SMALL LETTER ZETA +- "ZHcy", 0x00416, // CYRILLIC CAPITAL LETTER ZHE +- "zhcy", 0x00436, // CYRILLIC SMALL LETTER ZHE +- "zigrarr", 0x021DD, // RIGHTWARDS SQUIGGLE ARROW +- "Zopf", 0x02124, // DOUBLE-STRUCK CAPITAL Z +- "zopf", 0x1D56B, // MATHEMATICAL DOUBLE-STRUCK SMALL Z +- "Zscr", 0x1D4B5, // MATHEMATICAL SCRIPT CAPITAL Z +- "zscr", 0x1D4CF, // MATHEMATICAL SCRIPT SMALL Z +- "zwj", 0x0200D, // ZERO WIDTH JOINER +- "zwnj", 0x0200C, // ZERO WIDTH NON-JOINER +- NULL, 0 ++ {"Zacute", 0x00179}, // LATIN CAPITAL LETTER Z WITH ACUTE ++ {"zacute", 0x0017A}, // LATIN SMALL LETTER Z WITH ACUTE ++ {"Zcaron", 0x0017D}, // LATIN CAPITAL LETTER Z WITH CARON ++ {"zcaron", 0x0017E}, // LATIN SMALL LETTER Z WITH CARON ++ {"Zcy", 0x00417}, // CYRILLIC CAPITAL LETTER ZE ++ {"zcy", 0x00437}, // CYRILLIC SMALL LETTER ZE ++ {"Zdot", 0x0017B}, // LATIN CAPITAL LETTER Z WITH DOT ABOVE ++ {"zdot", 0x0017C}, // LATIN SMALL LETTER Z WITH DOT ABOVE ++ {"zeetrf", 0x02128}, // BLACK-LETTER CAPITAL Z ++ {"ZeroWidthSpace", 0x0200B}, // ZERO WIDTH SPACE ++ {"Zeta", 0x00396}, // GREEK CAPITAL LETTER ZETA ++ {"zeta", 0x003B6}, // GREEK SMALL LETTER ZETA ++ {"Zfr", 0x02128}, // BLACK-LETTER CAPITAL Z ++ {"zfr", 0x1D537}, // MATHEMATICAL FRAKTUR SMALL Z ++ {"Zgr", 0x00396}, // GREEK CAPITAL LETTER ZETA ++ {"zgr", 0x003B6}, // GREEK SMALL LETTER ZETA ++ {"ZHcy", 0x00416}, // CYRILLIC CAPITAL LETTER ZHE ++ {"zhcy", 0x00436}, // CYRILLIC SMALL LETTER ZHE ++ {"zigrarr", 0x021DD}, // RIGHTWARDS SQUIGGLE ARROW ++ {"Zopf", 0x02124}, // DOUBLE-STRUCK CAPITAL Z ++ {"zopf", 0x1D56B}, // MATHEMATICAL DOUBLE-STRUCK SMALL Z ++ {"Zscr", 0x1D4B5}, // MATHEMATICAL SCRIPT CAPITAL Z ++ {"zscr", 0x1D4CF}, // MATHEMATICAL SCRIPT SMALL Z ++ {"zwj", 0x0200D}, // ZERO WIDTH JOINER ++ {"zwnj", 0x0200C}, // ZERO WIDTH NON-JOINER ++ {NULL, 0} + }; + + // @todo@ order namesTable and names? by frequency +@@ -2372,7 +2374,7 @@ static NameId* namesTable[] = { + namesS, namesT, namesU, namesV, namesW, namesX, namesY, namesZ, NULL + }; + +-int HtmlNamedEntity(unsigned char *p, size_t length) ++int HtmlNamedEntity(utf8_t *p, size_t length) + { + int tableIndex = tolower(*p) - 'a'; + if (tableIndex >= 0 && tableIndex < 26) +--- a/src/gcc/d/dfrontend/enum.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/enum.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + +-// Copyright (c) 1999-2011 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -18,12 +18,14 @@ + #include "expression.h" + #include "module.h" + #include "declaration.h" ++#include "init.h" + + /********************************* EnumDeclaration ****************************/ + + EnumDeclaration::EnumDeclaration(Loc loc, Identifier *id, Type *memtype) + : ScopeDsymbol(id) + { ++ //printf("EnumDeclaration() %s\n", toChars()); + this->loc = loc; + type = new TypeEnum(this); + this->memtype = memtype; +@@ -31,9 +33,10 @@ EnumDeclaration::EnumDeclaration(Loc loc + minval = NULL; + defaultval = NULL; + sinit = NULL; +- isdeprecated = 0; +- isdone = 0; +- objFileDone = 0; ++ isdeprecated = false; ++ protection = PROTundefined; ++ parent = NULL; ++ added = false; + } + + Dsymbol *EnumDeclaration::syntaxCopy(Dsymbol *s) +@@ -50,64 +53,73 @@ Dsymbol *EnumDeclaration::syntaxCopy(Dsy + else + ed = new EnumDeclaration(loc, ident, t); + ScopeDsymbol::syntaxCopy(ed); ++ if (isAnonymous()) ++ { ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ em->ed = ed; ++ } ++ } + return ed; + } + + void EnumDeclaration::setScope(Scope *sc) + { +- if (isdone) ++ if (semanticRun > PASSinit) + return; + ScopeDsymbol::setScope(sc); + } + +-void EnumDeclaration::semantic0(Scope *sc) ++int EnumDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum) + { +- /* This function is a hack to get around a significant problem. +- * The members of anonymous enums, like: +- * enum { A, B, C } +- * don't get installed into the symbol table until after they are +- * semantically analyzed, yet they're supposed to go into the enclosing +- * scope's table. Hence, when forward referenced, they come out as +- * 'undefined'. The real fix is to add them in at addSymbol() time. +- * But to get code to compile, we'll just do this quick hack at the moment +- * to compile it if it doesn't depend on anything else. +- */ +- +- if (isdone || !scope) +- return; +- if (!isAnonymous() || memtype) +- return; ++#if 0 ++ printf("EnumDeclaration::addMember() %s\n", toChars()); + for (size_t i = 0; i < members->dim; i++) + { + EnumMember *em = (*members)[i]->isEnumMember(); +- if (em && (em->type || em->value)) +- return; ++ printf(" member %s\n", em->toChars()); + } ++#endif + +- // Can do it +- semantic(sc); ++ /* Anonymous enum members get added to enclosing scope. ++ */ ++ ScopeDsymbol *scopesym = isAnonymous() ? sd : this; ++ ++ if (!isAnonymous()) ++ { ++ ScopeDsymbol::addMember(sc, sd, memnum); ++ ++ if (!symtab) ++ symtab = new DsymbolTable(); ++ } ++ ++ if (members) ++ { ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ em->ed = this; ++ //printf("add %s to scope %s\n", em->toChars(), scopesym->toChars()); ++ em->addMember(sc, scopesym, 1); ++ } ++ } ++ added = true; ++ return 1; + } + ++ + void EnumDeclaration::semantic(Scope *sc) + { +- Type *t; +- Scope *sce; +- + //printf("EnumDeclaration::semantic(sd = %p, '%s') %s\n", sc->scopesym, sc->scopesym->toChars(), toChars()); +- //printf("EnumDeclaration::semantic() %s\n", toChars()); +- if (!members) // enum ident; ++ //printf("EnumDeclaration::semantic() %p %s\n", this, toChars()); ++ if (!members && !memtype) // enum ident; + return; + +- if (!memtype && !isAnonymous()) +- { // Set memtype if we can to reduce fwd reference errors +- memtype = Type::tint32; // case 1) enum ident { ... } +- } ++ if (semanticRun > PASSinit) ++ return; // semantic() already completed + +- if (symtab) // if already done +- { if (isdone || !scope) +- return; // semantic() already completed +- } +- else ++ if (!symtab) + symtab = new DsymbolTable(); + + Scope *scx = NULL; +@@ -120,7 +132,7 @@ void EnumDeclaration::semantic(Scope *sc + unsigned dprogress_save = Module::dprogress; + + if (sc->stc & STCdeprecated) +- isdeprecated = 1; ++ isdeprecated = true; + userAttributes = sc->userAttributes; + + parent = sc->parent; +@@ -131,8 +143,12 @@ void EnumDeclaration::semantic(Scope *sc + * 2. enum : memtype { ... } + * 3. enum ident { ... } + * 4. enum ident : memtype { ... } ++ * 5. enum ident : memtype; ++ * 6. enum ident; + */ + ++ type = type->semantic(loc, sc); ++ + if (memtype) + { + memtype = memtype->semantic(loc, sc); +@@ -151,183 +167,243 @@ void EnumDeclaration::semantic(Scope *sc + return; + } + } +-#if 0 // Decided to abandon this restriction for D 2.0 +- if (!memtype->isintegral()) +- { error("base type must be of integral type, not %s", memtype->toChars()); +- memtype = Type::tint32; ++ if (memtype->ty == Tvoid) ++ { ++ error("base type must not be void"); ++ memtype = Type::terror; + } +-#endif ++ if (memtype->ty == Terror) ++ { ++ errors = true; ++ if (members) ++ { ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ Dsymbol *s = (*members)[i]; ++ s->errors = true; // poison all the members ++ } ++ } ++ semanticRun = PASSsemanticdone; ++ return; ++ } ++ } ++ ++ semanticRun = PASSsemanticdone; ++ ++ if (!members) // enum ident : memtype; ++ return; ++ ++ if (members->dim == 0) ++ { ++ error("enum %s must have at least one member", toChars()); ++ errors = true; ++ return; + } + +- isdone = 1; + Module::dprogress++; + +- type = type->semantic(loc, sc); ++ Scope *sce; + if (isAnonymous()) + sce = sc; + else + { sce = sc->push(this); + sce->parent = this; + } +- if (members->dim == 0) +- error("enum %s must have at least one member", toChars()); +- int first = 1; +- Expression *elast = NULL; ++ sce = sce->startCTFE(); ++ sce->setNoFree(); // needed for getMaxMinValue() ++ ++ /* Each enum member gets the sce scope ++ */ + for (size_t i = 0; i < members->dim; i++) + { + EnumMember *em = (*members)[i]->isEnumMember(); +- Expression *e; +- Expression *emax = NULL; +- +- if (!em) +- /* The e->semantic(sce) can insert other symbols, such as +- * template instances and function literals. +- */ +- continue; +- +- //printf(" Enum member '%s'\n",em->toChars()); +- if (em->type) +- em->type = em->type->semantic(em->loc, sce); +- e = em->value; +- if (e) +- { +- assert(e->dyncast() == DYNCAST_EXPRESSION); +- e = e->semantic(sce); +- e = e->ctfeInterpret(); +- if (memtype) +- { +- e = e->implicitCastTo(sce, memtype); +- e = e->ctfeInterpret(); +- if (!isAnonymous()) +- e = e->castTo(sce, type); +- t = memtype; +- } +- else if (em->type) +- { +- e = e->implicitCastTo(sce, em->type); +- e = e->ctfeInterpret(); +- assert(isAnonymous()); +- t = e->type; +- } +- else +- t = e->type; +- } +- else if (first) +- { +- if (memtype) +- t = memtype; +- else if (em->type) +- t = em->type; +- else +- t = Type::tint32; +- e = new IntegerExp(em->loc, 0, Type::tint32); +- e = e->implicitCastTo(sce, t); +- e = e->ctfeInterpret(); +- if (!isAnonymous()) +- e = e->castTo(sce, type); +- } +- else +- { +- // Lazily evaluate enum.max +- if (!emax) +- { +- emax = t->getProperty(0, Id::max); +- emax = emax->semantic(sce); +- emax = emax->ctfeInterpret(); +- } +- +- // Set value to (elast + 1). +- // But first check that (elast != t.max) +- assert(elast); +- e = new EqualExp(TOKequal, em->loc, elast, emax); +- e = e->semantic(sce); +- e = e->ctfeInterpret(); +- if (e->toInteger()) +- error("overflow of enum value %s", elast->toChars()); +- +- // Now set e to (elast + 1) +- e = new AddExp(em->loc, elast, new IntegerExp(em->loc, 1, Type::tint32)); +- e = e->semantic(sce); +- e = e->castTo(sce, elast->type); +- e = e->ctfeInterpret(); +- +- if (t->isfloating()) +- { +- // Check that e != elast (not always true for floats) +- Expression *etest = new EqualExp(TOKequal, em->loc, e, elast); +- etest = etest->semantic(sce); +- etest = etest->ctfeInterpret(); +- if (etest->toInteger()) +- error("enum member %s has inexact value, due to loss of precision", em->toChars()); +- } +- } +- elast = e; +- em->value = e; ++ if (em) ++ em->scope = sce; ++ } + +- // Add to symbol table only after evaluating 'value' ++ if (!added) ++ { ++ /* addMember() is not called when the EnumDeclaration appears as a function statement, ++ * so we have to do what addMember() does and install the enum members in the right symbol ++ * table ++ */ ++ ScopeDsymbol *scopesym = NULL; + if (isAnonymous()) + { + /* Anonymous enum members get added to enclosing scope. + */ +- for (Scope *sct = sce; sct; sct = sct->enclosing) ++ for (Scope *sct = sce; 1; sct = sct->enclosing) + { ++ assert(sct); + if (sct->scopesym) + { ++ scopesym = sct->scopesym; + if (!sct->scopesym->symtab) + sct->scopesym->symtab = new DsymbolTable(); +- em->addMember(sce, sct->scopesym, 1); + break; + } + } + } + else +- em->addMember(sc, this, 1); ++ // Otherwise enum members are in the EnumDeclaration's symbol table ++ scopesym = this; + +- /* Compute .min, .max and .default values. +- * If enum doesn't have a name, we can never identify the enum type, +- * so there is no purpose for a .min, .max or .default +- */ +- if (!isAnonymous()) ++ for (size_t i = 0; i < members->dim; i++) + { +- if (first) +- { defaultval = e; +- minval = e; +- maxval = e; +- } +- else +- { Expression *ec; +- +- /* In order to work successfully with UDTs, +- * build expressions to do the comparisons, +- * and let the semantic analyzer and constant +- * folder give us the result. +- */ +- +- // Compute if(e < minval) +- ec = new CmpExp(TOKlt, em->loc, e, minval); +- ec = ec->semantic(sce); +- ec = ec->ctfeInterpret(); +- if (ec->toInteger()) +- minval = e; +- +- ec = new CmpExp(TOKgt, em->loc, e, maxval); +- ec = ec->semantic(sce); +- ec = ec->ctfeInterpret(); +- if (ec->toInteger()) +- maxval = e; ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ if (em) ++ { ++ em->ed = this; ++ em->addMember(sc, scopesym, 1); + } + } +- first = 0; ++ } ++ ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ if (em) ++ em->semantic(em->scope); + } + //printf("defaultval = %lld\n", defaultval); + + //if (defaultval) printf("defaultval: %s %s\n", defaultval->toChars(), defaultval->type->toChars()); +- if (sc != sce) +- sce->pop(); + //members->print(); + } + +-int EnumDeclaration::oneMember(Dsymbol **ps, Identifier *ident) ++/****************************** ++ * Get the value of the .max/.min property as an Expression ++ * Input: ++ * id Id::max or Id::min ++ */ ++ ++Expression *EnumDeclaration::getMaxMinValue(Loc loc, Identifier *id) ++{ ++ //printf("EnumDeclaration::getMaxValue()\n"); ++ bool first = true; ++ ++ Expression **pval = (id == Id::max) ? &maxval : &minval; ++ ++ if (*pval) ++ return *pval; ++ ++ if (scope) ++ semantic(scope); ++ if (errors) ++ goto Lerrors; ++ if (semanticRun == PASSinit || !members) ++ { ++ error("is forward referenced looking for .%s", id->toChars()); ++ goto Lerrors; ++ } ++ if (!(memtype && memtype->isintegral())) ++ { ++ error(loc, "has no .%s property because base type %s is not an integral type", ++ id->toChars(), ++ memtype ? memtype->toChars() : ""); ++ goto Lerrors; ++ } ++ ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ if (!em) ++ continue; ++ if (em->errors) ++ goto Lerrors; ++ ++ Expression *e = em->value; ++ if (first) ++ { ++ *pval = e; ++ first = false; ++ } ++ else ++ { ++ /* In order to work successfully with UDTs, ++ * build expressions to do the comparisons, ++ * and let the semantic analyzer and constant ++ * folder give us the result. ++ */ ++ ++ /* Compute: ++ * if (e > maxval) ++ * maxval = e; ++ */ ++ Expression *ec = new CmpExp(id == Id::max ? TOKgt : TOKlt, em->loc, e, *pval); ++ ec = ec->semantic(em->scope); ++ ec = ec->ctfeInterpret(); ++ if (ec->toInteger()) ++ *pval = e; ++ } ++ } ++ return *pval; ++ ++Lerrors: ++ *pval = new ErrorExp(); ++ return *pval; ++} ++ ++Expression *EnumDeclaration::getDefaultValue(Loc loc) ++{ ++ //printf("EnumDeclaration::getDefaultValue() %p %s\n", this, toChars()); ++ if (defaultval) ++ return defaultval; ++ ++ if (scope) ++ semantic(scope); ++ if (errors) ++ goto Lerrors; ++ if (semanticRun == PASSinit || !members) ++ { ++ error(loc, "forward reference of %s.init", toChars()); ++ goto Lerrors; ++ } ++ ++ for (size_t i = 0; i < members->dim; i++) ++ { ++ EnumMember *em = (*members)[i]->isEnumMember(); ++ if (!em) ++ continue; ++ defaultval = em->value; ++ return defaultval; ++ } ++ ++Lerrors: ++ defaultval = new ErrorExp(); ++ return defaultval; ++} ++ ++Type *EnumDeclaration::getMemtype(Loc loc) ++{ ++ if (loc.linnum == 0) ++ loc = this->loc; ++ if (scope) ++ { /* Enum is forward referenced. We don't need to resolve the whole thing, ++ * just the base type ++ */ ++ if (memtype) ++ memtype = memtype->semantic(loc, scope); ++ else ++ { ++ if (!isAnonymous()) ++ memtype = Type::tint32; ++ } ++ } ++ if (!memtype) ++ { ++ if (!isAnonymous()) ++ memtype = Type::tint32; ++ else ++ { ++ error(loc, "is forward referenced looking for base type"); ++ return Type::terror; ++ } ++ } ++ return memtype; ++} ++ ++bool EnumDeclaration::oneMember(Dsymbol **ps, Identifier *ident) + { + if (isAnonymous()) + return Dsymbol::oneMembers(members, ps, ident); +@@ -380,11 +456,16 @@ const char *EnumDeclaration::kind() + return "enum"; + } + +-int EnumDeclaration::isDeprecated() ++bool EnumDeclaration::isDeprecated() + { + return isdeprecated; + } + ++PROT EnumDeclaration::prot() ++{ ++ return protection; ++} ++ + Dsymbol *EnumDeclaration::search(Loc loc, Identifier *ident, int flags) + { + //printf("%s.EnumDeclaration::search('%s')\n", toChars(), ident->toChars()); +@@ -407,9 +488,11 @@ Dsymbol *EnumDeclaration::search(Loc loc + EnumMember::EnumMember(Loc loc, Identifier *id, Expression *value, Type *type) + : Dsymbol(id) + { ++ this->ed = NULL; + this->value = value; + this->type = type; + this->loc = loc; ++ this->vd = NULL; + } + + Dsymbol *EnumMember::syntaxCopy(Dsymbol *s) +@@ -452,4 +535,172 @@ const char *EnumMember::kind() + return "enum member"; + } + ++void EnumMember::semantic(Scope *sc) ++{ ++ //printf("EnumMember::semantic() %s\n", toChars()); ++ if (errors || semanticRun >= PASSsemanticdone) ++ return; ++ if (semanticRun == PASSsemantic) ++ { ++ error("circular reference to enum member"); ++ Lerrors: ++ errors = true; ++ semanticRun = PASSsemanticdone; ++ return; ++ } ++ assert(ed); ++ ed->semantic(sc); ++ if (ed->errors) ++ goto Lerrors; + ++ if (errors || semanticRun >= PASSsemanticdone) ++ return; ++ ++ semanticRun = PASSsemantic; ++ if (scope) ++ sc = scope; ++ ++ // The first enum member is special ++ bool first = (this == (*ed->members)[0]); ++ ++ if (type) ++ { ++ type = type->semantic(loc, sc); ++ assert(value); // "type id;" is not a valid enum member declaration ++ } ++ ++ if (value) ++ { ++ Expression *e = value; ++ assert(e->dyncast() == DYNCAST_EXPRESSION); ++ e = e->semantic(sc); ++ e = resolveProperties(sc, e); ++ e = e->ctfeInterpret(); ++ if (first && !ed->memtype && !ed->isAnonymous()) ++ { ++ ed->memtype = e->type; ++ if (ed->memtype->ty == Terror) ++ { ++ ed->errors = true; ++ goto Lerrors; ++ } ++ } ++ ++ if (ed->memtype && !type) ++ { ++ e = e->implicitCastTo(sc, ed->memtype); ++ e = e->ctfeInterpret(); ++ if (!ed->isAnonymous()) ++ e = e->castTo(sc, ed->type); ++ } ++ else if (type) ++ { ++ e = e->implicitCastTo(sc, type); ++ e = e->ctfeInterpret(); ++ assert(ed->isAnonymous()); ++ } ++ value = e; ++ } ++ else if (first) ++ { ++ Type *t; ++ if (ed->memtype) ++ t = ed->memtype; ++ else ++ { ++ t = Type::tint32; ++ if (!ed->isAnonymous()) ++ ed->memtype = t; ++ } ++ Expression *e = new IntegerExp(loc, 0, Type::tint32); ++ e = e->implicitCastTo(sc, t); ++ e = e->ctfeInterpret(); ++ if (!ed->isAnonymous()) ++ e = e->castTo(sc, ed->type); ++ value = e; ++ } ++ else ++ { ++ /* Find the previous enum member, ++ * and set this to be the previous value + 1 ++ */ ++ EnumMember *emprev = NULL; ++ for (size_t i = 0; i < ed->members->dim; i++) ++ { ++ EnumMember *em = (*ed->members)[i]->isEnumMember(); ++ if (em) ++ { ++ if (em == this) ++ break; ++ emprev = em; ++ } ++ } ++ assert(emprev); ++ if (emprev->semanticRun < PASSsemanticdone) // if forward reference ++ emprev->semantic(emprev->scope); // resolve it ++ if (emprev->errors) ++ goto Lerrors; ++ ++ Expression *eprev = emprev->value; ++ Type *tprev = eprev->type->equals(ed->type) ? ed->memtype : eprev->type; ++ ++ Expression *emax = tprev->getProperty(Loc(), Id::max, 0); ++ emax = emax->semantic(sc); ++ emax = emax->ctfeInterpret(); ++ ++ // Set value to (eprev + 1). ++ // But first check that (eprev != emax) ++ assert(eprev); ++ Expression *e = new EqualExp(TOKequal, loc, eprev, emax); ++ e = e->semantic(sc); ++ e = e->ctfeInterpret(); ++ if (e->toInteger()) ++ { ++ error("initialization with (%s.%s + 1) causes overflow for type '%s'", emprev->ed->toChars(), emprev->toChars(), ed->type->toBasetype()->toChars()); ++ goto Lerrors; ++ } ++ ++ // Now set e to (eprev + 1) ++ e = new AddExp(loc, eprev, new IntegerExp(loc, 1, Type::tint32)); ++ e = e->semantic(sc); ++ e = e->castTo(sc, eprev->type); ++ e = e->ctfeInterpret(); ++ ++ if (e->type->isfloating()) ++ { ++ // Check that e != eprev (not always true for floats) ++ Expression *etest = new EqualExp(TOKequal, loc, e, eprev); ++ etest = etest->semantic(sc); ++ etest = etest->ctfeInterpret(); ++ if (etest->toInteger()) ++ { ++ error("has inexact value, due to loss of precision"); ++ goto Lerrors; ++ } ++ } ++ value = e; ++ } ++ ++ semanticRun = PASSsemanticdone; ++} ++ ++Expression *EnumMember::getVarExp(Loc loc, Scope *sc) ++{ ++ semantic(sc); ++ if (errors) ++ return new ErrorExp(); ++ if (!vd) ++ { ++ assert(value); ++ vd = new VarDeclaration(loc, type, ident, new ExpInitializer(loc, value->copy())); ++ ++ vd->storage_class = STCmanifest; ++ vd->semantic(sc); ++ ++ vd->protection = ed->isAnonymous() ? ed->protection : PROTpublic; ++ vd->parent = ed->isAnonymous() ? ed->parent : ed; ++ vd->userAttributes = ed->isAnonymous() ? ed->userAttributes : NULL; ++ } ++ Expression *e = new VarExp(loc, vd); ++ return e->semantic(sc); ++} +--- a/src/gcc/d/dfrontend/enum.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/enum.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2008 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -18,45 +18,53 @@ + #include "root.h" + #include "dsymbol.h" + +-struct Identifier; +-struct Type; +-struct Expression; ++class Identifier; ++class Type; ++class Expression; + struct HdrGenState; ++class VarDeclaration; + +- +-struct EnumDeclaration : ScopeDsymbol +-{ /* enum ident : memtype { ... } ++class EnumDeclaration : public ScopeDsymbol ++{ ++public: ++ /* The separate, and distinct, cases are: ++ * 1. enum { ... } ++ * 2. enum : memtype { ... } ++ * 3. enum id { ... } ++ * 4. enum id : memtype { ... } ++ * 5. enum id : memtype; ++ * 6. enum id; + */ + Type *type; // the TypeEnum + Type *memtype; // type of the members +- enum PROT protection; ++ PROT protection; + +-#if DMDV1 +- dinteger_t maxval; +- dinteger_t minval; +- dinteger_t defaultval; // default initializer +-#else ++private: + Expression *maxval; + Expression *minval; + Expression *defaultval; // default initializer +-#endif +- int isdeprecated; +- int isdone; // 0: not done +- // 1: semantic() successfully completed ++ ++public: ++ bool isdeprecated; ++ bool added; + + EnumDeclaration(Loc loc, Identifier *id, Type *memtype); + Dsymbol *syntaxCopy(Dsymbol *s); ++ int addMember(Scope *sc, ScopeDsymbol *sd, int memnum); + void setScope(Scope *sc); +- void semantic0(Scope *sc); + void semantic(Scope *sc); +- int oneMember(Dsymbol **ps, Identifier *ident = NULL); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Type *getType(); + const char *kind(); + #if DMDV2 + Dsymbol *search(Loc, Identifier *ident, int flags); + #endif +- int isDeprecated(); // is Dsymbol deprecated? ++ bool isDeprecated(); // is Dsymbol deprecated? ++ PROT prot(); ++ Expression *getMaxMinValue(Loc loc, Identifier *id); ++ Expression *getDefaultValue(Loc loc); ++ Type *getMemtype(Loc loc); + + void emitComment(Scope *sc); + void toJson(JsonOut *json); +@@ -64,7 +72,6 @@ struct EnumDeclaration : ScopeDsymbol + + EnumDeclaration *isEnumDeclaration() { return this; } + +- bool objFileDone; // if toObjFile was already called + void toObjFile(int multiobj); // compile to .obj file + void toDebug(); + int cvMember(unsigned char *p); +@@ -74,15 +81,26 @@ struct EnumDeclaration : ScopeDsymbol + }; + + +-struct EnumMember : Dsymbol ++class EnumMember : public Dsymbol + { ++public: ++ /* Can take the following forms: ++ * 1. id ++ * 2. id = value ++ * 3. type id = value ++ */ + Expression *value; + Type *type; + ++ EnumDeclaration *ed; ++ VarDeclaration *vd; ++ + EnumMember(Loc loc, Identifier *id, Expression *value, Type *type); + Dsymbol *syntaxCopy(Dsymbol *s); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + const char *kind(); ++ void semantic(Scope *sc); ++ Expression *getVarExp(Loc loc, Scope *sc); + + void emitComment(Scope *sc); + void toJson(JsonOut *json); +--- a/src/gcc/d/dfrontend/expression.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/expression.c 2014-04-01 16:32:51.000000000 +0100 +@@ -18,10 +18,6 @@ + #include + #endif + +-#if _WIN32 && __DMC__ +-extern "C" char * __cdecl __locale_decpoint; +-#endif +- + #include "rmem.h" + #include "port.h" + #include "root.h" +@@ -45,10 +41,11 @@ extern "C" char * __cdecl __locale_decpo + #include "hdrgen.h" + #include "parse.h" + #include "doc.h" +- ++#include "aav.h" + + Expression *createTypeInfoArray(Scope *sc, Expression *args[], size_t dim); + Expression *expandVar(int result, VarDeclaration *v); ++void functionToCBuffer2(TypeFunction *t, OutBuffer *buf, HdrGenState *hgs, int mod, const char *kind); + + #define LOGSEMANTIC 0 + +@@ -157,11 +154,12 @@ Expression *getRightThis(Loc loc, Scope + */ + + FuncDeclaration *hasThis(Scope *sc) +-{ FuncDeclaration *fd; +- FuncDeclaration *fdthis; +- ++{ + //printf("hasThis()\n"); +- fdthis = sc->parent->isFuncDeclaration(); ++ Dsymbol *p = sc->parent; ++ while (p && p->isTemplateMixin()) ++ p = p->parent; ++ FuncDeclaration *fdthis = p ? p->isFuncDeclaration() : NULL; + //printf("fdthis = %p, '%s'\n", fdthis, fdthis ? fdthis->toChars() : ""); + + /* Special case for inside template constraint +@@ -174,7 +172,7 @@ FuncDeclaration *hasThis(Scope *sc) + } + + // Go upwards until we find the enclosing member function +- fd = fdthis; ++ FuncDeclaration *fd = fdthis; + while (1) + { + if (!fd) +@@ -210,113 +208,318 @@ Lno: + return NULL; // don't have 'this' available + } + ++bool isNeedThisScope(Scope *sc, Declaration *d) ++{ ++ if (sc->intypeof == 1) ++ return false; ++ ++ AggregateDeclaration *ad = d->isThis(); ++ if (!ad) ++ return false; ++ //printf("d = %s, ad = %s\n", d->toChars(), ad->toChars()); ++ ++ for (Dsymbol *s = sc->parent; s; s = s->toParent2()) ++ { ++ //printf("\ts = %s %s, toParent2() = %p\n", s->kind(), s->toChars(), s->toParent2()); ++ if (AggregateDeclaration *ad2 = s->isAggregateDeclaration()) ++ { ++ //printf("\t ad2 = %s\n", ad2->toChars()); ++ if (ad2 == ad) ++ return false; ++ else if (ad2->isNested()) ++ continue; ++ else ++ return true; ++ } ++ if (FuncDeclaration *f = s->isFuncDeclaration()) ++ { ++ if (f->isFuncLiteralDeclaration()) ++ continue; ++ if (f->isMember2()) ++ break; ++ if (TemplateDeclaration *td = f->parent->isTemplateDeclaration()) ++ { ++ if ((td->scope->stc & STCstatic) && td->isMember()) ++ break; // no valid 'this' ++ } ++ } ++ } ++ return true; ++} ++ ++Expression *checkRightThis(Scope *sc, Expression *e) ++{ ++ if (e->op == TOKvar && e->type->ty != Terror) ++ { ++ VarExp *ve = (VarExp *)e; ++ if (isNeedThisScope(sc, ve->var)) ++ { ++ //printf("checkRightThis sc->intypeof = %d, ad = %p, func = %p, fdthis = %p\n", ++ // sc->intypeof, sc->getStructClassScope(), func, fdthis); ++ e->error("need 'this' for '%s' of type '%s'", ve->var->toChars(), ve->var->type->toChars()); ++ e = new ErrorExp(); ++ } ++ } ++ return e; ++} ++ + + /*************************************** + * Pull out any properties. + */ + +-Expression *resolveProperties(Scope *sc, Expression *e) ++Expression *resolvePropertiesX(Scope *sc, Expression *e1, Expression *e2 = NULL) + { +- //printf("resolveProperties(%s)\n", e->toChars()); ++ //printf("resolvePropertiesX, e1 = %s %s, e2 = %s\n", Token::toChars(e1->op), e1->toChars(), e2 ? e2->toChars() : NULL); ++ Loc loc = e1->loc; + +- TemplateDeclaration *td; +- Objects *targsi; +- Expression *ethis; +- if (e->op == TOKdotti) +- { +- DotTemplateInstanceExp* dti = (DotTemplateInstanceExp *)e; +- td = dti->getTempdecl(sc); +- dti->ti->semanticTiargs(sc); +- targsi = dti->ti->tiargs; +- ethis = dti->e1; +- goto L1; +- } +- else if (e->op == TOKdottd) +- { +- DotTemplateExp *dte = (DotTemplateExp *)e; +- td = dte->td; +- targsi = NULL; +- ethis = dte->e1; +- goto L1; +- } +- else if (e->op == TOKimport) ++ OverloadSet *os; ++ Dsymbol *s; ++ Objects *tiargs; ++ Type *tthis; ++ if (e1->op == TOKdotexp) + { +- Dsymbol *s = ((ScopeExp *)e)->sds; +- td = s->isTemplateDeclaration(); +- if (td) ++ DotExp *de = (DotExp *)e1; ++ if (de->e2->op == TOKoverloadset) + { +- targsi = NULL; +- ethis = NULL; +- goto L1; ++ tiargs = NULL; ++ tthis = de->e1->type; ++ os = ((OverExp *)de->e2)->vars; ++ goto Los; + } + } +- else if (e->op == TOKtemplate) ++ else if (e1->op == TOKoverloadset) + { +- td = ((TemplateExp *)e)->td; +- targsi = NULL; +- ethis = NULL; +- L1: +- assert(td); +- unsigned errors = global.startGagging(); +- FuncDeclaration *fd = td->deduceFunctionTemplate(sc, e->loc, targsi, ethis, NULL, 1); +- if (global.endGagging(errors)) +- fd = NULL; // eat "is not a function template" error +- if (fd && fd->type) +- { assert(fd->type->ty == Tfunction); +- TypeFunction *tf = (TypeFunction *)fd->type; +- if (!tf->isproperty && global.params.enforcePropertySyntax) +- { error(e->loc, "not a property %s", e->toChars()); ++ tiargs = NULL; ++ tthis = NULL; ++ os = ((OverExp *)e1)->vars; ++ Los: ++ assert(os); ++ FuncDeclaration *fd = NULL; ++ if (e2) ++ { ++ e2 = e2->semantic(sc); ++ if (e2->op == TOKerror) + return new ErrorExp(); ++ e2 = resolveProperties(sc, e2); ++ ++ Expressions a; ++ a.push(e2); ++ ++ for (size_t i = 0; i < os->a.dim; i++) ++ { ++ Dsymbol *s = os->a[i]; ++ FuncDeclaration *f = resolveFuncCall(loc, sc, s, tiargs, tthis, &a, 1); ++ if (f) ++ { ++ fd = f; ++ assert(fd->type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ goto Leprop; ++ } ++ } ++ if (fd) ++ { ++ Expression *e = new CallExp(loc, e1, e2); ++ return e->semantic(sc); ++ } ++ } ++ { ++ for (size_t i = 0; i < os->a.dim; i++) ++ { ++ Dsymbol *s = os->a[i]; ++ FuncDeclaration *f = resolveFuncCall(loc, sc, s, tiargs, tthis, NULL, 1); ++ if (f) ++ { ++ fd = f; ++ assert(fd->type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (!tf->isref && e2) ++ goto Leproplvalue; ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ goto Leprop; ++ } ++ } ++ if (fd) ++ { ++ Expression *e = new CallExp(loc, e1); ++ if (e2) ++ e = new AssignExp(loc, e, e2); ++ return e->semantic(sc); + } +- e = new CallExp(e->loc, e); +- e = e->semantic(sc); + } +- goto return_expr; ++ if (e2) ++ goto Leprop; + } +- +- if (e->type && +- e->op != TOKtype) // function type is not a property ++ else if (e1->op == TOKdotti) ++ { ++ DotTemplateInstanceExp* dti = (DotTemplateInstanceExp *)e1; ++ if (!dti->findTempDecl(sc)) ++ goto Leprop; ++ if (!dti->ti->semanticTiargs(sc)) ++ goto Leprop; ++ tiargs = dti->ti->tiargs; ++ tthis = dti->e1->type; ++ if ((os = dti->ti->tempdecl->isOverloadSet()) != NULL) ++ goto Los; ++ if ((s = dti->ti->tempdecl) != NULL) ++ goto Lfd; ++ } ++ else if (e1->op == TOKdottd) ++ { ++ DotTemplateExp *dte = (DotTemplateExp *)e1; ++ s = dte->td; ++ tiargs = NULL; ++ tthis = dte->e1->type; ++ goto Lfd; ++ } ++ else if (e1->op == TOKimport) ++ { ++ s = ((ScopeExp *)e1)->sds; ++ if (s->isTemplateDeclaration()) ++ { ++ tiargs = NULL; ++ tthis = NULL; ++ goto Lfd; ++ } ++ TemplateInstance *ti = s->isTemplateInstance(); ++ if (ti && !ti->semanticRun && ti->tempdecl) ++ { ++ //assert(ti->needsTypeInference(sc)); ++ if (!ti->semanticTiargs(sc)) ++ { ++ ti->inst = ti; ++ ti->inst->errors = true; ++ goto Leprop; ++ } ++ tiargs = ti->tiargs; ++ tthis = NULL; ++ if ((os = ti->tempdecl->isOverloadSet()) != NULL) ++ goto Los; ++ if ((s = ti->tempdecl) != NULL) ++ goto Lfd; ++ } ++ } ++ else if (e1->op == TOKtemplate) + { +- Type *t = e->type->toBasetype(); ++ s = ((TemplateExp *)e1)->td; ++ tiargs = NULL; ++ tthis = NULL; ++ goto Lfd; ++ } ++ else if (e1->op == TOKdotvar && e1->type && e1->type->toBasetype()->ty == Tfunction) ++ { ++ DotVarExp *dve = (DotVarExp *)e1; ++ s = dve->var->isFuncDeclaration(); ++ tiargs = NULL; ++ tthis = dve->e1->type; ++ goto Lfd; ++ } ++ else if (e1->op == TOKvar && e1->type && e1->type->toBasetype()->ty == Tfunction) ++ { ++ s = ((VarExp *)e1)->var->isFuncDeclaration(); ++ tiargs = NULL; ++ tthis = NULL; ++ Lfd: ++ assert(s); ++ FuncDeclaration *fd; ++ if (e2) ++ { ++ e2 = e2->semantic(sc); ++ if (e2->op == TOKerror) ++ return new ErrorExp(); ++ e2 = resolveProperties(sc, e2); ++ ++ Expressions a; ++ a.push(e2); + +- if (t->ty == Tfunction || e->op == TOKoverloadset) ++ fd = resolveFuncCall(loc, sc, s, tiargs, tthis, &a, 1); ++ if (fd && fd->type) ++ { ++ assert(fd->type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ goto Leprop; ++ Expression *e = new CallExp(loc, e1, e2); ++ return e->semantic(sc); ++ } ++ } + { +- if (t->ty == Tfunction && !((TypeFunction *)t)->isproperty && +- global.params.enforcePropertySyntax) ++ fd = resolveFuncCall(loc, sc, s, tiargs, tthis, NULL, 1); ++ if (fd && fd->type) + { +- error(e->loc, "not a property %s", e->toChars()); +- return new ErrorExp(); ++ assert(fd->type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (!tf->isref && e2) ++ goto Leproplvalue; ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ goto Leprop; ++ Expression *e = new CallExp(loc, e1); ++ if (e2) ++ e = new AssignExp(loc, e, e2); ++ return e->semantic(sc); + } +- e = new CallExp(e->loc, e); +- e = e->semantic(sc); + } ++ if (FuncDeclaration *fd = s->isFuncDeclaration()) ++ { // Keep better diagnostic message for invalid property usage of functions ++ assert(fd->type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ error(loc, "not a property %s", e1->toChars()); ++ Expression *e = new CallExp(loc, e1, e2); ++ return e->semantic(sc); ++ } ++ if (e2) ++ goto Leprop; ++ } ++ if (e2) ++ return NULL; + +- /* Look for e being a lazy parameter; rewrite as delegate call ++ if (e1->type && ++ e1->op != TOKtype) // function type is not a property ++ { ++ /* Look for e1 being a lazy parameter; rewrite as delegate call + */ +- else if (e->op == TOKvar) +- { VarExp *ve = (VarExp *)e; ++ if (e1->op == TOKvar) ++ { ++ VarExp *ve = (VarExp *)e1; + + if (ve->var->storage_class & STClazy) + { +- e = new CallExp(e->loc, e); +- e = e->semantic(sc); ++ Expression *e = new CallExp(loc, e1); ++ return e->semantic(sc); + } + } +- +- else if (e->op == TOKdotexp) ++ else if (e1->op == TOKdotexp) + { +- e->error("expression has no value"); ++ e1->error("expression has no value"); + return new ErrorExp(); + } +- + } + +-return_expr: +- if (!e->type) ++ if (!e1->type) + { +- error(e->loc, "cannot resolve type for %s", e->toChars()); +- e->type = new TypeError(); ++ error(loc, "cannot resolve type for %s", e1->toChars()); ++ e1 = new ErrorExp(); + } ++ return e1; ++ ++Leprop: ++ error(loc, "not a property %s", e1->toChars()); ++ return new ErrorExp(); ++ ++Leproplvalue: ++ error(loc, "%s is not an lvalue", e1->toChars()); ++ return new ErrorExp(); ++} ++ ++Expression *resolveProperties(Scope *sc, Expression *e) ++{ ++ //printf("resolveProperties(%s)\n", e->toChars()); ++ ++ e = resolvePropertiesX(sc, e); ++ e = checkRightThis(sc, e); + return e; + } + +@@ -342,18 +545,313 @@ void checkPropertyCall(Expression *e, Ex + tf = (TypeFunction *)ce->f->type; + } + } +- else if (ce->e1->type->ty == Tfunction) +- tf = (TypeFunction *)ce->e1->type; +- else if (ce->e1->type->ty == Tdelegate) +- tf = (TypeFunction *)ce->e1->type->nextOf(); +- else if (ce->e1->type->ty == Tpointer && ce->e1->type->nextOf()->ty == Tfunction) +- tf = (TypeFunction *)ce->e1->type->nextOf(); +- else +- assert(0); +- +- if (!tf->isproperty && global.params.enforcePropertySyntax) +- ce->e1->error("not a property %s", emsg->toChars()); ++ else if (ce->e1->type->ty == Tfunction) ++ tf = (TypeFunction *)ce->e1->type; ++ else if (ce->e1->type->ty == Tdelegate) ++ tf = (TypeFunction *)ce->e1->type->nextOf(); ++ else if (ce->e1->type->ty == Tpointer && ce->e1->type->nextOf()->ty == Tfunction) ++ tf = (TypeFunction *)ce->e1->type->nextOf(); ++ else ++ assert(0); ++ ++ if (!tf->isproperty && global.params.enforcePropertySyntax) ++ ce->e1->error("not a property %s", emsg->toChars()); ++ } ++} ++ ++/****************************** ++ * If e1 is a property function (template), resolve it. ++ */ ++ ++Expression *resolvePropertiesOnly(Scope *sc, Expression *e1) ++{ ++ OverloadSet *os; ++ FuncDeclaration *fd; ++ TemplateDeclaration *td; ++ ++ if (e1->op == TOKdotexp) ++ { ++ DotExp *de = (DotExp *)e1; ++ if (de->e2->op == TOKoverloadset) ++ { ++ os = ((OverExp *)de->e2)->vars; ++ goto Los; ++ } ++ } ++ else if (e1->op == TOKoverloadset) ++ { ++ os = ((OverExp *)e1)->vars; ++ Los: ++ assert(os); ++ for (size_t i = 0; i < os->a.dim; i++) ++ { ++ Dsymbol *s = os->a[i]; ++ fd = s->isFuncDeclaration(); ++ td = s->isTemplateDeclaration(); ++ if (fd) ++ { ++ if (((TypeFunction *)fd->type)->isproperty) ++ return resolveProperties(sc, e1); ++ } ++ else if (td && td->onemember && ++ (fd = td->onemember->isFuncDeclaration()) != NULL) ++ { ++ if (((TypeFunction *)fd->type)->isproperty || ++ (fd->storage_class2 & STCproperty) || ++ (td->scope->stc & STCproperty)) ++ { ++ return resolveProperties(sc, e1); ++ } ++ } ++ } ++ } ++ else if (e1->op == TOKdotti) ++ { ++ DotTemplateInstanceExp* dti = (DotTemplateInstanceExp *)e1; ++ if (dti->ti->tempdecl && (td = dti->ti->tempdecl->isTemplateDeclaration()) != NULL) ++ goto Ltd; ++ } ++ else if (e1->op == TOKdottd) ++ { ++ td = ((DotTemplateExp *)e1)->td; ++ goto Ltd; ++ } ++ else if (e1->op == TOKimport) ++ { ++ Dsymbol *s = ((ScopeExp *)e1)->sds; ++ td = s->isTemplateDeclaration(); ++ if (td) ++ goto Ltd; ++ TemplateInstance *ti = s->isTemplateInstance(); ++ if (ti && !ti->semanticRun && ti->tempdecl) ++ { ++ if ((td = ti->tempdecl->isTemplateDeclaration()) != NULL) ++ goto Ltd; ++ } ++ } ++ else if (e1->op == TOKtemplate) ++ { ++ td = ((TemplateExp *)e1)->td; ++ Ltd: ++ assert(td); ++ if (td->onemember && ++ (fd = td->onemember->isFuncDeclaration()) != NULL) ++ { ++ if (((TypeFunction *)fd->type)->isproperty || ++ (fd->storage_class2 & STCproperty) || ++ (td->scope->stc & STCproperty)) ++ { ++ return resolveProperties(sc, e1); ++ } ++ } ++ } ++ else if (e1->op == TOKdotvar && e1->type->ty == Tfunction) ++ { ++ DotVarExp *dve = (DotVarExp *)e1; ++ fd = dve->var->isFuncDeclaration(); ++ goto Lfd; ++ } ++ else if (e1->op == TOKvar && e1->type->ty == Tfunction) ++ { ++ fd = ((VarExp *)e1)->var->isFuncDeclaration(); ++ Lfd: ++ assert(fd); ++ if (((TypeFunction *)fd->type)->isproperty) ++ return resolveProperties(sc, e1); ++ } ++ return e1; ++} ++ ++ ++/****************************** ++ * Find symbol in accordance with the UFCS name look up rule ++ */ ++ ++Expression *searchUFCS(Scope *sc, UnaExp *ue, Identifier *ident) ++{ ++ Loc loc = ue->loc; ++ Dsymbol *s = NULL; ++ ++ for (Scope *scx = sc; scx; scx = scx->enclosing) ++ { ++ if (!scx->scopesym) ++ continue; ++ s = scx->scopesym->search(loc, ident, 0); ++ if (s) ++ { ++ // overload set contains only module scope symbols. ++ if (s->isOverloadSet()) ++ break; ++ // selective/renamed imports also be picked up ++ if (AliasDeclaration *ad = s->isAliasDeclaration()) ++ { ++ if (ad->import) ++ break; ++ } ++ // See only module scope symbols for UFCS target. ++ Dsymbol *p = s->toParent2(); ++ if (p && p->isModule()) ++ break; ++ } ++ s = NULL; ++ } ++ if (!s) ++ return ue->e1->type->Type::getProperty(loc, ident, 0); ++ ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (f) ++ { ++ TemplateDeclaration *td = getFuncTemplateDecl(f); ++ if (td) ++ { ++ if (td->overroot) ++ td = td->overroot; ++ s = td; ++ } ++ } ++ ++ if (ue->op == TOKdotti) ++ { ++ DotTemplateInstanceExp *dti = (DotTemplateInstanceExp *)ue; ++ TemplateInstance *ti = new TemplateInstance(loc, s->ident); ++ ti->tiargs = dti->ti->tiargs; // for better diagnostic message ++ if (!ti->updateTemplateDeclaration(sc, s)) ++ return new ErrorExp(); ++ return new ScopeExp(loc, ti); ++ } ++ else ++ { ++ return new DsymbolExp(loc, s, 1); ++ } ++} ++ ++/****************************** ++ * check e is exp.opDispatch!(tiargs) or not ++ * It's used to switch to UFCS the semantic analysis path ++ */ ++ ++bool isDotOpDispatch(Expression *e) ++{ ++ return e->op == TOKdotti && ++ ((DotTemplateInstanceExp *)e)->ti->name == Id::opDispatch; ++} ++ ++/****************************** ++ * Pull out callable entity with UFCS. ++ */ ++ ++Expression *resolveUFCS(Scope *sc, CallExp *ce) ++{ ++ Loc loc = ce->loc; ++ Expression *eleft; ++ Expression *e; ++ ++ if (ce->e1->op == TOKdot) ++ { ++ DotIdExp *die = (DotIdExp *)ce->e1; ++ Identifier *ident = die->ident; ++ ++ Expression *ex = die->semanticX(sc); ++ if (ex != die) ++ { ++ ce->e1 = ex; ++ return NULL; ++ } ++ eleft = die->e1; ++ ++ Type *t = eleft->type->toBasetype(); ++ if (t->ty == Tarray || t->ty == Tsarray || ++ t->ty == Tnull || (t->isTypeBasic() && t->ty != Tvoid)) ++ { ++ /* Built-in types and arrays have no callable properties, so do shortcut. ++ * It is necessary in: e.init() ++ */ ++ } ++ else if (t->ty == Taarray) ++ { ++ if (ident == Id::remove) ++ { ++ /* Transform: ++ * aa.remove(arg) into delete aa[arg] ++ */ ++ if (!ce->arguments || ce->arguments->dim != 1) ++ { ++ ce->error("expected key as argument to aa.remove()"); ++ return new ErrorExp(); ++ } ++ if (!eleft->type->isMutable()) ++ { ++ ce->error("cannot remove key from %s associative array %s", ++ MODtoChars(t->mod), eleft->toChars()); ++ return new ErrorExp(); ++ } ++ Expression *key = (*ce->arguments)[0]; ++ key = key->semantic(sc); ++ key = resolveProperties(sc, key); ++ ++ TypeAArray *taa = (TypeAArray *)t; ++ key = key->implicitCastTo(sc, taa->index); ++ ++ if (!key->rvalue()) ++ return new ErrorExp(); ++ ++ return new RemoveExp(loc, eleft, key); ++ } ++ else if (ident == Id::apply || ident == Id::applyReverse) ++ { ++ return NULL; ++ } ++ else ++ { ++ TypeAArray *taa = (TypeAArray *)t; ++ assert(taa->ty == Taarray); ++ StructDeclaration *sd = taa->getImpl(); ++ Dsymbol *s = sd->search(Loc(), ident, 2); ++ if (s) ++ return NULL; ++ } ++ } ++ else ++ { ++ if (Expression *ey = die->semanticY(sc, 1)) ++ { ++ ce->e1 = ey; ++ if (isDotOpDispatch(ey)) ++ { ++ unsigned errors = global.startGagging(); ++ e = ce->semantic(sc); ++ if (global.endGagging(errors)) ++ {} /* fall down to UFCS */ ++ else ++ return e; ++ } ++ else ++ return NULL; ++ } ++ } ++ e = searchUFCS(sc, die, ident); ++ } ++ else if (ce->e1->op == TOKdotti) ++ { ++ DotTemplateInstanceExp *dti = (DotTemplateInstanceExp *)ce->e1; ++ if (Expression *ey = dti->semanticY(sc, 1)) ++ { ++ ce->e1 = ey; ++ return NULL; ++ } ++ eleft = dti->e1; ++ e = searchUFCS(sc, dti, dti->ti->name); + } ++ else ++ return NULL; ++ ++ // Rewrite ++ ce->e1 = e; ++ if (!ce->arguments) ++ ce->arguments = new Expressions(); ++ ce->arguments->shift(eleft); ++ ++ return NULL; + } + + /****************************** +@@ -362,130 +860,76 @@ void checkPropertyCall(Expression *e, Ex + + Expression *resolveUFCSProperties(Scope *sc, Expression *e1, Expression *e2 = NULL) + { +- Expression *e = NULL; +- Expression *eleft; +- Identifier *ident; +- Objects* tiargs; + Loc loc = e1->loc; ++ Expression *eleft; ++ Expression *e; + + if (e1->op == TOKdot) + { + DotIdExp *die = (DotIdExp *)e1; +- eleft = die->e1; +- ident = die->ident; +- tiargs = NULL; +- goto L1; ++ eleft = die->e1; ++ e = searchUFCS(sc, die, die->ident); + } + else if (e1->op == TOKdotti) + { + DotTemplateInstanceExp *dti; + dti = (DotTemplateInstanceExp *)e1; +- eleft = dti->e1; +- ident = dti->ti->name; +- tiargs = dti->ti->tiargs; +- L1: +- /* .ident +- * .ident!tiargs +- */ +- e = new IdentifierExp(loc, Id::empty); +- if (tiargs) +- e = new DotTemplateInstanceExp(loc, e, ident, tiargs); +- else +- e = new DotIdExp(loc, e, ident); ++ eleft = dti->e1; ++ e = searchUFCS(sc, dti, dti->ti->name); ++ } ++ else ++ return NULL; + +- if (e2) +- { +- // run semantic without gagging +- e2 = e2->semantic(sc); ++ // Rewrite ++ if (e2) ++ { ++ // run semantic without gagging ++ e2 = e2->semantic(sc); + +- /* .f(e1) = e2 +- */ +- Expression *ex = e->syntaxCopy(); +- Expressions *a1 = new Expressions(); +- a1->setDim(1); +- (*a1)[0] = eleft; +- ex = new CallExp(loc, ex, a1); +- ex = ex->trySemantic(sc); +- +- /* .f(e1, e2) +- */ +- Expressions *a2 = new Expressions(); +- a2->setDim(2); +- (*a2)[0] = eleft; +- (*a2)[1] = e2; +- e = new CallExp(loc, e, a2); +- if (ex) +- { // if fallback setter exists, gag errors +- e = e->trySemantic(sc); +- if (!e) +- { checkPropertyCall(ex, e1); +- ex = new AssignExp(loc, ex, e2); +- return ex->semantic(sc); +- } +- } +- else +- { // strict setter prints errors if fails +- e = e->semantic(sc); ++ /* f(e1) = e2 ++ */ ++ Expression *ex = e->copy(); ++ Expressions *a1 = new Expressions(); ++ a1->setDim(1); ++ (*a1)[0] = eleft; ++ ex = new CallExp(loc, ex, a1); ++ ex = ex->trySemantic(sc); ++ ++ /* f(e1, e2) ++ */ ++ Expressions *a2 = new Expressions(); ++ a2->setDim(2); ++ (*a2)[0] = eleft; ++ (*a2)[1] = e2; ++ e = new CallExp(loc, e, a2); ++ if (ex) ++ { // if fallback setter exists, gag errors ++ e = e->trySemantic(sc); ++ if (!e) ++ { checkPropertyCall(ex, e1); ++ ex = new AssignExp(loc, ex, e2); ++ return ex->semantic(sc); + } +- checkPropertyCall(e, e1); +- return e; + } + else +- { +- /* .f(e1) +- */ +- Expressions *arguments = new Expressions(); +- arguments->setDim(1); +- (*arguments)[0] = eleft; +- e = new CallExp(loc, e, arguments); ++ { // strict setter prints errors if fails + e = e->semantic(sc); +- checkPropertyCall(e, e1); +- return e->semantic(sc); + } ++ checkPropertyCall(e, e1); ++ return e; + } +- return e; +-} +- +-/********************************* +- * Attempt to find a type property. If failed, attempt to find +- * UFCS property. If UFCS found, return expression. Otherwise +- * show type property error message. +- * Returns non-NULL only if UFCS property found. +- */ +-Expression * resolveProperty(Scope *sc, Expression **e1, Expression *e2) +-{ +- enum TOK op = (*e1)->op; +- UnaExp *una = (UnaExp *)(*e1); +- Type *t = una->e1->type; +- int olderrors = global.errors; +- una->e1 = una->e1->semantic(sc); +- if (global.errors == olderrors && una->e1->type) ++ else + { +- unsigned errors = global.startGagging(); +- // try property gagged +- if (op == TOKdotti) +- *e1 = ((DotTemplateInstanceExp *)una)->semantic(sc, 1); +- else if (op == TOKdot) +- *e1 = ((DotIdExp *)una)->semantic(sc, 1); +- +- if (global.endGagging(errors) || (*e1)->op == TOKerror) +- { +- (*e1)->op = op; +- errors = global.startGagging(); // try UFCS gagged +- Expression *e = resolveUFCSProperties(sc, una, e2); +- if (!global.endGagging(errors) && (*e1)->op != TOKerror) +- return e; // found UFCS +- +- // try property non-gagged +- una->type = t; // restore type +- if (op == TOKdotti) +- *e1 = ((DotTemplateInstanceExp *)una)->semantic(sc, 1); +- else if (op == TOKdot) +- *e1 = ((DotIdExp *)una)->semantic(sc, 1); +- } ++ /* f(e1) ++ */ ++ Expressions *arguments = new Expressions(); ++ arguments->setDim(1); ++ (*arguments)[0] = eleft; ++ e = new CallExp(loc, e, arguments); ++ e = e->semantic(sc); ++ checkPropertyCall(e, e1); ++ return e->semantic(sc); + } +- +- return NULL; + } + + /****************************** +@@ -560,12 +1004,13 @@ void expandTuples(Expressions *exps) + + // Inline expand all the tuples + while (arg->op == TOKtuple) +- { TupleExp *te = (TupleExp *)arg; +- ++ { ++ TupleExp *te = (TupleExp *)arg; + exps->remove(i); // remove arg + exps->insert(i, te->exps); // replace with tuple contents + if (i == exps->dim) + return; // empty tuple, no more arguments ++ (*exps)[i] = Expression::combine(te->e0, (*exps)[i]); + arg = (*exps)[i]; + } + } +@@ -578,26 +1023,28 @@ void expandTuples(Expressions *exps) + + TupleDeclaration *isAliasThisTuple(Expression *e) + { +- if (e->type) ++ if (!e->type) ++ return NULL; ++ ++ Type *t = e->type->toBasetype(); ++Lagain: ++ if (Dsymbol *s = t->toDsymbol(NULL)) + { +- Type *t = e->type->toBasetype(); +- AggregateDeclaration *ad; +- if (t->ty == Tstruct) +- { +- ad = ((TypeStruct *)t)->sym; +- goto L1; +- } +- else if (t->ty == Tclass) ++ AggregateDeclaration *ad = s->isAggregateDeclaration(); ++ if (ad) + { +- ad = ((TypeClass *)t)->sym; +- L1: +- Dsymbol *s = ad->aliasthis; ++ s = ad->aliasthis; + if (s && s->isVarDeclaration()) + { + TupleDeclaration *td = s->isVarDeclaration()->toAlias()->isTupleDeclaration(); + if (td && td->isexp) + return td; + } ++ if (Type *att = t->aliasthisOf()) ++ { ++ t = att; ++ goto Lagain; ++ } + } + } + return NULL; +@@ -683,24 +1130,28 @@ Expressions *arrayExpressionToCommonType + */ + //printf("arrayExpressionToCommonType()\n"); + IntegerExp integerexp(0); +- CondExp condexp(0, &integerexp, NULL, NULL); ++ CondExp condexp(Loc(), &integerexp, NULL, NULL); + + Type *t0 = NULL; + Expression *e0; + size_t j0; + for (size_t i = 0; i < exps->dim; i++) +- { Expression *e = (*exps)[i]; +- ++ { ++ Expression *e = (*exps)[i]; + e = resolveProperties(sc, e); + if (!e->type) +- { e->error("%s has no value", e->toChars()); ++ { ++ e->error("%s has no value", e->toChars()); + e = new ErrorExp(); + } + +- e = callCpCtor(e->loc, sc, e, 1); ++ if (Expression *ex = e->isTemp()) ++ e = ex; ++ e = e->isLvalue() ? callCpCtor(sc, e) : valueNoDtor(e); + + if (t0) +- { if (t0 != e->type) ++ { ++ if (t0 != e->type) + { + /* This applies ?: to merge the types. It's backwards; + * ?: should call this function to merge types. +@@ -718,7 +1169,8 @@ Expressions *arrayExpressionToCommonType + } + } + else +- { j0 = i; ++ { ++ j0 = i; + e0 = e; + t0 = e->type; + } +@@ -751,16 +1203,19 @@ TemplateDeclaration *getFuncTemplateDecl + { + FuncDeclaration *f = s->isFuncDeclaration(); + if (f && f->parent) +- { TemplateInstance *ti = f->parent->isTemplateInstance(); +- ++ { ++ TemplateInstance *ti = f->parent->isTemplateInstance(); ++ TemplateDeclaration *td; + if (ti && + !ti->isTemplateMixin() && + (ti->name == f->ident || + ti->toAlias()->ident == f->ident) + && +- ti->tempdecl && ti->tempdecl->onemember) ++ ti->tempdecl && ++ (td = ti->tempdecl->isTemplateDeclaration()) != NULL && ++ td->onemember) + { +- return ti->tempdecl; ++ return td; + } + } + return NULL; +@@ -782,6 +1237,9 @@ void preFunctionParameters(Loc loc, Scop + arg = resolveProperties(sc, arg); + (*exps)[i] = arg; + ++ if (arg->op == TOKtype) ++ arg->error("%s is not an expression", arg->toChars()); ++ + //arg->rvalue(); + } + } +@@ -792,7 +1250,7 @@ void preFunctionParameters(Loc loc, Scop + * the destructor on it. + */ + +-void valueNoDtor(Expression *e) ++Expression *valueNoDtor(Expression *e) + { + if (e->op == TOKcall) + { +@@ -805,70 +1263,94 @@ void valueNoDtor(Expression *e) + */ + CallExp *ce = (CallExp *)e; + if (ce->e1->op == TOKdotvar) +- { DotVarExp *dve = (DotVarExp *)ce->e1; ++ { ++ DotVarExp *dve = (DotVarExp *)ce->e1; + if (dve->var->isCtorDeclaration()) +- { // It's a constructor call ++ { ++ // It's a constructor call + if (dve->e1->op == TOKcomma) +- { CommaExp *comma = (CommaExp *)dve->e1; ++ { ++ CommaExp *comma = (CommaExp *)dve->e1; + if (comma->e2->op == TOKvar) +- { VarExp *ve = (VarExp *)comma->e2; ++ { ++ VarExp *ve = (VarExp *)comma->e2; + VarDeclaration *ctmp = ve->var->isVarDeclaration(); + if (ctmp) ++ { + ctmp->noscope = 1; ++ assert(!ce->isLvalue()); ++ } + } + } + } + } + } ++ return e; + } + + /******************************************** +- * Determine if t is an array of structs that need a postblit. ++ * Determine if t is an array of structs that need a default construction. + */ + #if DMDV2 +-int checkPostblit(Loc loc, Type *t) ++bool checkDefCtor(Loc loc, Type *t) + { +- t = t->toBasetype(); +- while (t->ty == Tsarray) +- t = t->nextOf()->toBasetype(); ++ t = t->baseElemOf(); + if (t->ty == Tstruct) +- { FuncDeclaration *fd = ((TypeStruct *)t)->sym->postblit; +- if (fd) +- { if (fd->storage_class & STCdisable) +- fd->toParent()->error(loc, "is not copyable because it is annotated with @disable"); +- return 1; ++ { ++ StructDeclaration *sd = ((TypeStruct *)t)->sym; ++ if (sd->noDefaultCtor) ++ { ++ sd->error(loc, "default construction is disabled"); ++ return true; + } + } +- return 0; ++ return false; + } + #endif + +-/********************************************* +- * Call copy constructor for struct value argument. ++/******************************************** ++ * Determine if t is an array of structs that need a postblit. + */ + #if DMDV2 +-Expression *callCpCtor(Loc loc, Scope *sc, Expression *e, int noscope) ++bool Expression::checkPostblit(Scope *sc, Type *t) + { +- if (e->op == TOKarrayliteral) ++ t = t->baseElemOf(); ++ if (t->ty == Tstruct) + { +- ArrayLiteralExp *ae = (ArrayLiteralExp *)e; +- for (size_t i = 0; i < ae->elements->dim; i++) ++ // Bugzilla 11395: Require TypeInfo generation for array concatenation ++ if (!t->vtinfo) ++ t->getTypeInfo(sc); ++ ++ StructDeclaration *sd = ((TypeStruct *)t)->sym; ++ if (sd->postblit) + { +- ae->elements->tdata()[i] = +- callCpCtor(loc, sc, ae->elements->tdata()[i], noscope); ++ if (sd->postblit->storage_class & STCdisable) ++ sd->error(loc, "is not copyable because it is annotated with @disable"); ++ else ++ { ++ checkPurity(sc, sd->postblit); ++ checkSafety(sc, sd->postblit); ++ } ++ return true; + } +- e = ae->semantic(sc); +- return e; + } ++ return false; ++} ++#endif + +- Type *tb = e->type->toBasetype(); +- Type *tv = tb; +- while (tv->ty == Tsarray) +- tv = tv->nextOf()->toBasetype(); ++/********************************************* ++ * Call copy constructor for struct value argument. ++ * Input: ++ * sc just used to specify the scope of created temporary variable ++ */ ++#if DMDV2 ++Expression *callCpCtor(Scope *sc, Expression *e) ++{ ++ Type *tv = e->type->baseElemOf(); + if (tv->ty == Tstruct) + { + StructDeclaration *sd = ((TypeStruct *)tv)->sym; +- if (sd->cpctor && e->isLvalue()) ++ if (sd->cpctor) + { + /* Create a variable tmp, and replace the argument e with: + * (tmp = e),tmp +@@ -877,12 +1359,15 @@ Expression *callCpCtor(Loc loc, Scope *s + * directly onto the stack. + */ + Identifier *idtmp = Lexer::uniqueId("__cpcttmp"); +- VarDeclaration *tmp = new VarDeclaration(loc, tb, idtmp, new ExpInitializer(0, e)); ++ VarDeclaration *tmp = new VarDeclaration(e->loc, e->type, idtmp, new ExpInitializer(e->loc, e)); + tmp->storage_class |= STCctfe; +- tmp->noscope = noscope; +- Expression *ae = new DeclarationExp(loc, tmp); +- e = new CommaExp(loc, ae, new VarExp(loc, tmp)); +- e = e->semantic(sc); ++ tmp->noscope = 1; ++ tmp->semantic(sc); ++ Expression *de = new DeclarationExp(e->loc, tmp); ++ Expression *ve = new VarExp(e->loc, tmp); ++ de->type = Type::tvoid; ++ ve->type = e->type; ++ e = Expression::combine(de, ve); + } + } + return e; +@@ -904,7 +1389,7 @@ Expression *callCpCtor(Loc loc, Scope *s + */ + + Type *functionParameters(Loc loc, Scope *sc, TypeFunction *tf, +- Expression *ethis, Expressions *arguments, FuncDeclaration *fd) ++ Type *tthis, Expressions *arguments, FuncDeclaration *fd) + { + //printf("functionParameters()\n"); + assert(arguments); +@@ -930,13 +1415,14 @@ Type *functionParameters(Loc loc, Scope + fd->functionSemantic3(); + } + } ++ bool isCtorCall = fd && fd->needThis() && fd->isCtorDeclaration(); + + size_t n = (nargs > nparams) ? nargs : nparams; // n = max(nargs, nparams) + + unsigned wildmatch = 0; +- if (ethis && tf->isWild()) ++ if (tthis && tf->isWild() && !isCtorCall) + { +- Type *t = ethis->type; ++ Type *t = tthis; + if (t->isWild()) + wildmatch |= MODwild; + else if (t->isConst()) +@@ -963,7 +1449,7 @@ Type *functionParameters(Loc loc, Scope + + if (!arg) + { +- if (!p->defaultArg || !fd) ++ if (!p->defaultArg) + { + if (tf->varargs == 2 && i + 1 == nparams) + goto L2; +@@ -973,19 +1459,12 @@ Type *functionParameters(Loc loc, Scope + arg = p->defaultArg; + arg = arg->inlineCopy(sc); + #if DMDV2 +- arg = arg->resolveLoc(loc, sc); // __FILE__ and __LINE__ ++ // __FILE__, __LINE__, __MODULE__, __FUNCTION__, and __PRETTY_FUNCTION__ ++ arg = arg->resolveLoc(loc, sc); + #endif + arguments->push(arg); + nargs++; + } +- else +- { +- Type *pt = p->type; +- if (tf->varargs == 2 && i + 1 == nparams && pt->nextOf()) +- pt = pt->nextOf(); +- arg = arg->inferType(pt); +- (*arguments)[i] = arg; +- } + + if (tf->varargs == 2 && i + 1 == nparams) + { +@@ -1009,35 +1488,28 @@ Type *functionParameters(Loc loc, Scope + case Tsarray: + case Tarray: + { // Create a static array variable v of type arg->type +-#ifdef IN_GCC +- /* GCC 4.0 does not like zero length arrays used like +- this; pass a null array value instead. Could also +- just make a one-element array. */ +- if (nargs - i == 0) +- { +- arg = new NullExp(loc); +- break; +- } +-#endif + Identifier *id = Lexer::uniqueId("__arrayArg"); + Type *t = new TypeSArray(((TypeArray *)tb)->next, new IntegerExp(nargs - i)); + t = t->semantic(loc, sc); +- bool isSafe = fd ? fd->isSafe() : tf->trust == TRUSTsafe; + VarDeclaration *v = new VarDeclaration(loc, t, id, +- (isSafe && sc->func) ? NULL : new VoidInitializer(loc)); ++ (sc->func && sc->func->isSafe()) ? NULL : new VoidInitializer(loc)); + v->storage_class |= STCctfe; + v->semantic(sc); + v->parent = sc->parent; + //sc->insert(v); + +- Expression *c = new DeclarationExp(0, v); ++ Expression *c = new DeclarationExp(Loc(), v); + c->type = v->type; + + for (size_t u = i; u < nargs; u++) +- { Expression *a = (*arguments)[u]; ++ { ++ Expression *a = (*arguments)[u]; + TypeArray *ta = (TypeArray *)tb; ++ a = a->inferType(ta->next); ++ (*arguments)[u] = a; + if (tret && !ta->next->equals(a->type)) +- { if (tret->toBasetype()->ty == Tvoid || ++ { ++ if (tret->toBasetype()->ty == Tvoid || + a->implicitConvTo(tret)) + { + a = a->toDelegate(sc, tret); +@@ -1097,7 +1569,8 @@ Type *functionParameters(Loc loc, Scope + break; + } + if (wildmatch) +- { /* Calculate wild matching modifier ++ { ++ /* Calculate wild matching modifier + */ + if (wildmatch & MODconst || wildmatch & (wildmatch - 1)) + wildmatch = MODconst; +@@ -1106,9 +1579,52 @@ Type *functionParameters(Loc loc, Scope + else if (wildmatch & MODwild) + wildmatch = MODwild; + else +- { assert(wildmatch & MODmutable); ++ { ++ assert(wildmatch & MODmutable); + wildmatch = MODmutable; + } ++ ++ if ((wildmatch == MODmutable || wildmatch == MODimmutable) && ++ tf->next->hasWild() && ++ (tf->isref || !tf->next->implicitConvTo(tf->next->immutableOf()))) ++ { ++ if (fd) ++ { ++ /* If the called function may return the reference to ++ * outer inout data, it should be rejected. ++ * ++ * void foo(ref inout(int) x) { ++ * ref inout(int) bar(inout(int)) { return x; } ++ * struct S { ref inout(int) bar() inout { return x; } } ++ * bar(int.init) = 1; // bad! ++ * S().bar() = 1; // bad! ++ * } ++ */ ++ FuncDeclaration *f; ++ if (AggregateDeclaration *ad = fd->isThis()) ++ { ++ f = ad->toParent2()->isFuncDeclaration(); ++ goto Linoutnest; ++ } ++ else if (fd->isNested()) ++ { ++ f = fd->toParent2()->isFuncDeclaration(); ++ Linoutnest: ++ for (; f; f = f->toParent2()->isFuncDeclaration()) ++ { ++ if (((TypeFunction *)f->type)->iswild) ++ goto Linouterr; ++ } ++ } ++ } ++ else if (tf->isWild()) ++ { ++ Linouterr: ++ const char *s = wildmatch == MODmutable ? "mutable" : MODtoChars(wildmatch); ++ error(loc, "modify inout to %s is not allowed inside inout function", s); ++ return Type::terror; ++ } ++ } + } + + assert(nargs >= nparams); +@@ -1128,7 +1644,7 @@ Type *functionParameters(Loc loc, Scope + arg = arg->implicitCastTo(sc, p->type->substWildTo(wildmatch)); + arg = arg->optimize(WANTvalue, p->storageClass & STCref); + } +- else if (p->type != arg->type) ++ else if (!p->type->equals(arg->type)) + { + //printf("arg->type = %s, p->type = %s\n", arg->type->toChars(), p->type->toChars()); + if (arg->op == TOKtype) +@@ -1150,6 +1666,8 @@ Type *functionParameters(Loc loc, Scope + Type *t = arg->type; + if (!t->isMutable() || !t->isAssignable()) // check blit assignable + arg->error("cannot modify struct %s with immutable members", arg->toChars()); ++ else ++ checkDefCtor(arg->loc, t); + arg = arg->toLvalue(sc, arg); + } + else if (p->storageClass & STClazy) +@@ -1158,30 +1676,9 @@ Type *functionParameters(Loc loc, Scope + } + else + { +- Type *tb = arg->type->toBasetype(); +- if (tb->ty == Tsarray) +- { +- // call copy constructor of each element +- arg = callCpCtor(loc, sc, arg, 1); +- } +-#if DMDV2 +- else if (tb->ty == Tstruct) +- { +- if (arg->op == TOKcall && !arg->isLvalue()) +- { +- /* The struct value returned from the function is transferred +- * to the function, so the callee should not call the destructor +- * on it. +- */ +- valueNoDtor(arg); +- } +- else +- { /* Not transferring it, so call the copy constructor +- */ +- arg = callCpCtor(loc, sc, arg, 1); +- } +- } +-#endif ++ if (Expression *e = arg->isTemp()) ++ arg = e; ++ arg = arg->isLvalue() ? callCpCtor(sc, arg) : valueNoDtor(arg); + } + + //printf("arg: %s\n", arg->toChars()); +@@ -1247,25 +1744,29 @@ Type *functionParameters(Loc loc, Scope + + // Do not allow types that need destructors + if (arg->type->needsDestruction()) +- { arg->error("cannot pass types that need destruction as variadic arguments"); ++ { ++ arg->error("cannot pass types that need destruction as variadic arguments"); + arg = new ErrorExp(); + } + ++#if 0 ++ arg = arg->isLvalue() ? callCpCtor(sc, arg) : valueNoDtor(arg); ++#else + // Convert static arrays to dynamic arrays + // BUG: I don't think this is right for D2 + Type *tb = arg->type->toBasetype(); + if (tb->ty == Tsarray) +- { TypeSArray *ts = (TypeSArray *)tb; ++ { ++ TypeSArray *ts = (TypeSArray *)tb; + Type *ta = ts->next->arrayOf(); + if (ts->size(arg->loc) == 0) + arg = new NullExp(arg->loc, ta); + else + arg = arg->castTo(sc, ta); + } +-#if DMDV2 + if (tb->ty == Tstruct) + { +- arg = callCpCtor(loc, sc, arg, 1); ++ arg = callCpCtor(sc, arg); + } + #endif + +@@ -1298,7 +1799,29 @@ Type *functionParameters(Loc loc, Scope + } + + Type *tret = tf->next; +- if (wildmatch) ++ if (isCtorCall) ++ { ++ //printf("[%s] fd = %s %s, %d %d %d\n", loc.toChars(), fd->toChars(), fd->type->toChars(), ++ // wildmatch, tf->isWild(), fd->isolateReturn()); ++ if (!tthis) ++ { assert(sc->intypeof || global.errors); ++ tthis = fd->isThis()->type->addMod(fd->type->mod); ++ } ++ if (tf->isWild() && !fd->isolateReturn()) ++ { ++ if (wildmatch) ++ tret = tret->substWildTo(wildmatch); ++ if (!tret->implicitConvTo(tthis)) ++ { ++ const char* s1 = tret ->isNaked() ? " mutable" : tret ->modToChars(); ++ const char* s2 = tthis->isNaked() ? " mutable" : tthis->modToChars(); ++ ::error(loc, "inout constructor %s creates%s object, not%s", ++ fd->toPrettyChars(), s1, s2); ++ } ++ } ++ tret = tthis; ++ } ++ else if (wildmatch) + { /* Adjust function return type based on wildmatch + */ + //printf("wildmatch = x%x, tret = %s\n", wildmatch, tret->toChars()); +@@ -1312,7 +1835,7 @@ Type *functionParameters(Loc loc, Scope + * in ( ) if its precedence is less than pr. + */ + +-void expToCBuffer(OutBuffer *buf, HdrGenState *hgs, Expression *e, enum PREC pr) ++void expToCBuffer(OutBuffer *buf, HdrGenState *hgs, Expression *e, PREC pr) + { + #ifdef DEBUG + if (precedence[e->op] == PREC_zero) +@@ -1336,6 +1859,33 @@ void expToCBuffer(OutBuffer *buf, HdrGen + e->toCBuffer(buf, hgs); + } + ++void sizeToCBuffer(OutBuffer *buf, HdrGenState *hgs, Expression *e) ++{ ++ if (e->type == Type::tsize_t) ++ { ++ Expression *ex = (e->op == TOKcast ? ((CastExp *)e)->e1 : e); ++ ex = ex->optimize(WANTvalue); ++ ++ dinteger_t uval = ex->op == TOKint64 ? ex->toInteger() : (dinteger_t)-1; ++ if ((sinteger_t)uval >= 0) ++ { ++ dinteger_t sizemax; ++ if (Target::ptrsize == 4) ++ sizemax = 0xFFFFFFFFUL; ++ else if (Target::ptrsize == 8) ++ sizemax = 0xFFFFFFFFFFFFFFFFULL; ++ else ++ assert(0); ++ if (uval <= sizemax && uval <= 0x7FFFFFFFFFFFFFFFULL) ++ { ++ buf->printf("%llu", uval); ++ return; ++ } ++ } ++ } ++ expToCBuffer(buf, hgs, e, PREC_assign); ++} ++ + /************************************************** + * Write out argument list to buf. + */ +@@ -1361,14 +1911,14 @@ void argsToCBuffer(OutBuffer *buf, Expre + + void argExpTypesToCBuffer(OutBuffer *buf, Expressions *arguments, HdrGenState *hgs) + { +- if (arguments) +- { OutBuffer argbuf; +- ++ if (arguments && arguments->dim) ++ { ++ OutBuffer argbuf; + for (size_t i = 0; i < arguments->dim; i++) +- { Expression *e = (*arguments)[i]; +- ++ { ++ Expression *e = (*arguments)[i]; + if (i) +- buf->writeByte(','); ++ buf->writestring(", "); + argbuf.reset(); + e->type->toCBuffer2(&argbuf, hgs, 0); + buf->write(&argbuf); +@@ -1378,8 +1928,7 @@ void argExpTypesToCBuffer(OutBuffer *buf + + /******************************** Expression **************************/ + +-Expression::Expression(Loc loc, enum TOK op, int size) +- : loc(loc) ++Expression::Expression(Loc loc, TOK op, int size) + { + //printf("Expression::Expression(op = %d) this = %p\n", op, this); + this->loc = loc; +@@ -1389,6 +1938,21 @@ Expression::Expression(Loc loc, enum TOK + type = NULL; + } + ++Expression *EXP_CANT_INTERPRET; ++Expression *EXP_CONTINUE_INTERPRET; ++Expression *EXP_BREAK_INTERPRET; ++Expression *EXP_GOTO_INTERPRET; ++Expression *EXP_VOID_INTERPRET; ++ ++void Expression::init() ++{ ++ EXP_CANT_INTERPRET = new ErrorExp(); ++ EXP_CONTINUE_INTERPRET = new ErrorExp(); ++ EXP_BREAK_INTERPRET = new ErrorExp(); ++ EXP_GOTO_INTERPRET = new ErrorExp(); ++ EXP_VOID_INTERPRET = new ErrorExp(); ++} ++ + Expression *Expression::syntaxCopy() + { + //printf("Expression::syntaxCopy()\n"); +@@ -1406,7 +1970,7 @@ Expression *Expression::copy() + if (!size) + { + #ifdef DEBUG +- fprintf(stdmsg, "No expression copy for: %s\n", toChars()); ++ fprintf(stderr, "No expression copy for: %s\n", toChars()); + printf("op = %d\n", op); + dump(0); + #endif +@@ -1414,7 +1978,7 @@ Expression *Expression::copy() + } + e = (Expression *)mem.malloc(size); + //printf("Expression::copy(op = %d) e = %p\n", op, e); +- return (Expression *)memcpy(e, this, size); ++ return (Expression *)memcpy((void*)e, (void*)this, size); + } + + /************************** +@@ -1454,8 +2018,8 @@ Expression *Expression::trySemantic(Scop + + void Expression::print() + { +- fprintf(stdmsg, "%s\n", toChars()); +- fflush(stdmsg); ++ fprintf(stderr, "%s\n", toChars()); ++ fflush(stderr); + } + + char *Expression::toChars() +@@ -1562,11 +2126,7 @@ real_t Expression::toImaginary() + complex_t Expression::toComplex() + { + error("Floating point constant expression expected instead of %s", toChars()); +-#ifdef IN_GCC +- return complex_t(real_t(0)); // %% nicer +-#else +- return 0.0; +-#endif ++ return (complex_t)0.0; + } + + StringExp *Expression::toString() +@@ -1634,7 +2194,9 @@ Expression *Expression::modifiableLvalue + if (type->isMutable()) + { + if (!type->isAssignable()) +- error("cannot modify struct %s %s with immutable members", toChars(), type->toChars()); ++ { error("cannot modify struct %s %s with immutable members", toChars(), type->toChars()); ++ goto Lerror; ++ } + } + else + { +@@ -1653,9 +2215,13 @@ Expression *Expression::modifiableLvalue + { + error("cannot modify %s expression %s", MODtoChars(type->mod), toChars()); + } ++ goto Lerror; + } + } + return toLvalue(sc, e); ++ ++Lerror: ++ return new ErrorExp(); + } + + +@@ -1749,12 +2315,13 @@ void Expression::checkPurity(Scope *sc, + } + + // Find the closest pure parent of the called function +- if (getFuncTemplateDecl(f)) +- { // The closest pure parent of instantiated template function is ++ if (getFuncTemplateDecl(f) && !f->isNested() && ++ f->parent->isTemplateInstance()->enclosing == NULL) ++ { // The closest pure parent of instantiated non-nested template function is + // always itself. +- if (!f->isPure() && outerfunc->setImpure()) ++ if (!f->isPure() && outerfunc->setImpure() && !(sc->flags & SCOPEctfe)) + error("pure function '%s' cannot call impure function '%s'", +- outerfunc->toChars(), f->toChars()); ++ outerfunc->toPrettyChars(), f->toPrettyChars()); + return; + } + FuncDeclaration *calledparent = f; +@@ -1791,7 +2358,8 @@ void Expression::checkPurity(Scope *sc, + // If the caller has a pure parent, then either the called func must be pure, + // OR, they must have the same pure parent. + if (/*outerfunc->isPure() &&*/ // comment out because we deduce purity now +- !f->isPure() && calledparent != outerfunc) ++ !f->isPure() && calledparent != outerfunc && ++ !(sc->flags & SCOPEctfe)) + { + if (outerfunc->setImpure()) + error("pure function '%s' cannot call impure function '%s'", +@@ -1808,10 +2376,9 @@ void Expression::checkPurity(Scope *sc, + /******************************************* + * Accessing variable v. + * Check for purity and safety violations. +- * If ethis is not NULL, then ethis is the 'this' pointer as in ethis.v + */ + +-void Expression::checkPurity(Scope *sc, VarDeclaration *v, Expression *ethis) ++void Expression::checkPurity(Scope *sc, VarDeclaration *v) + { + /* Look for purity and safety violations when accessing variable v + * from current function. +@@ -1822,7 +2389,7 @@ void Expression::checkPurity(Scope *sc, + v->ident != Id::ctfe && // magic variable never violates pure and safe + !v->isImmutable() && // always safe and pure to access immutables... + !(v->isConst() && !v->isRef() && (v->isDataseg() || v->isParameter()) && +- v->type->implicitConvTo(v->type->invariantOf())) && ++ v->type->implicitConvTo(v->type->immutableOf())) && + // or const global/parameter values which have no mutable indirections + !(v->storage_class & STCmanifest) // ...or manifest constants + ) +@@ -1839,7 +2406,8 @@ void Expression::checkPurity(Scope *sc, + FuncDeclaration *ff = s->isFuncDeclaration(); + if (!ff) + break; +- if (ff->setImpure() && !msg) ++ // Accessing implicit generated __gate is pure. ++ if (ff->setImpure() && !msg && strcmp(v->ident->toChars(), "__gate")) + { error("pure function '%s' cannot access mutable static data '%s'", + sc->func->toPrettyChars(), v->toChars()); + msg = TRUE; // only need the innermost message +@@ -1848,6 +2416,26 @@ void Expression::checkPurity(Scope *sc, + } + else + { ++ /* Bugzilla 10981: Special case for the contracts of pure virtual function. ++ * Rewrite: ++ * tret foo(int i) pure ++ * in { assert(i); } out { assert(i); } body { ... } ++ * ++ * as: ++ * tret foo(int i) pure { ++ * void __require() pure { assert(i); } // allow accessing to i ++ * void __ensure() pure { assert(i); } // allow accessing to i ++ * __require(); ++ * ... ++ * __ensure(); ++ * } ++ */ ++ if ((sc->func->ident == Id::require || sc->func->ident == Id::ensure) && ++ v->isParameter() && sc->func->parent == v->parent) ++ { ++ return; ++ } ++ + /* Given: + * void f() + * { int fx; +@@ -1892,6 +2480,7 @@ void Expression::checkPurity(Scope *sc, + void Expression::checkSafety(Scope *sc, FuncDeclaration *f) + { + if (sc->func && !sc->intypeof && ++ !(sc->flags & SCOPEctfe) && + !f->isSafe() && !f->isTrusted()) + { + if (sc->func->setUnsafe()) +@@ -1920,8 +2509,12 @@ Expression *Expression::checkToBoolean(S + assert(type); + #endif + +- // Structs can be converted to bool using opCast(bool)() ++ Expression *e = this; ++ Type *t = type; + Type *tb = type->toBasetype(); ++ Type *att = NULL; ++Lagain: ++ // Structs can be converted to bool using opCast(bool)() + if (tb->ty == Tstruct) + { AggregateDeclaration *ad = ((TypeStruct *)tb)->sym; + /* Don't really need to check for opCast first, but by doing so we +@@ -1930,26 +2523,29 @@ Expression *Expression::checkToBoolean(S + Dsymbol *fd = search_function(ad, Id::cast); + if (fd) + { +- Expression *e = new CastExp(loc, this, Type::tbool); ++ e = new CastExp(loc, e, Type::tbool); + e = e->semantic(sc); + return e; + } + + // Forward to aliasthis. +- if (ad->aliasthis) ++ if (ad->aliasthis && tb != att) + { +- Expression *e = resolveAliasThis(sc, this); +- e = e->checkToBoolean(sc); +- return e; ++ if (!att && tb->checkAliasThisRec()) ++ att = tb; ++ e = resolveAliasThis(sc, e); ++ t = e->type; ++ tb = e->type->toBasetype(); ++ goto Lagain; + } + } + +- if (!type->checkBoolean()) +- { if (type->toBasetype() != Type::terror) +- error("expression %s of type %s does not have a boolean value", toChars(), type->toChars()); ++ if (!t->checkBoolean()) ++ { if (tb != Type::terror) ++ error("expression %s of type %s does not have a boolean value", toChars(), t->toChars()); + return new ErrorExp(); + } +- return this; ++ return e; + } + + /**************************** +@@ -2015,7 +2611,7 @@ int Expression::isBit() + } + + /**************************************** +- * Resolve __LINE__ and __FILE__ to loc. ++ * Resolve __FILE__, __LINE__, __MODULE__, __FUNCTION__, __PRETTY_FUNCTION__ to loc. + */ + + Expression *Expression::resolveLoc(Loc loc, Scope *sc) +@@ -2053,20 +2649,25 @@ Expression *Expression::isTemp() + { + //printf("isTemp() %s\n", toChars()); + if (op == TOKcomma) +- { CommaExp *ec = (CommaExp *)this; ++ { ++ CommaExp *ec = (CommaExp *)this; + if (ec->e1->op == TOKdeclaration && + ec->e2->op == TOKvar) +- { DeclarationExp *de = (DeclarationExp *)ec->e1; ++ { ++ DeclarationExp *de = (DeclarationExp *)ec->e1; + VarExp *ve = (VarExp *)ec->e2; +- if (ve->var == de->declaration && ve->var->storage_class & STCctfe) +- { VarDeclaration *v = ve->var->isVarDeclaration(); ++ if (de->declaration == ve->var && ve->var->storage_class & STCctfe) ++ { ++ VarDeclaration *v = ve->var->isVarDeclaration(); + if (v && v->init) + { + ExpInitializer *ei = v->init->isExpInitializer(); + if (ei) +- { Expression *e = ei->exp; ++ { ++ Expression *e = ei->exp; + if (e->op == TOKconstruct) +- { ConstructExp *ce = (ConstructExp *)e; ++ { ++ ConstructExp *ce = (ConstructExp *)e; + if (ce->e1->op == TOKvar && ((VarExp *)ce->e1)->var == ve->var) + e = ce->e2; + } +@@ -2108,21 +2709,26 @@ IntegerExp::IntegerExp(Loc loc, dinteger + } + + IntegerExp::IntegerExp(dinteger_t value) +- : Expression(0, TOKint64, sizeof(IntegerExp)) ++ : Expression(Loc(), TOKint64, sizeof(IntegerExp)) + { + this->type = Type::tint32; + this->value = value; + } + +-int IntegerExp::equals(Object *o) +-{ IntegerExp *ne; +- +- if (this == o || +- (((Expression *)o)->op == TOKint64 && +- ((ne = (IntegerExp *)o), type->toHeadMutable()->equals(ne->type->toHeadMutable())) && +- value == ne->value)) +- return 1; +- return 0; ++bool IntegerExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (((Expression *)o)->op == TOKint64) ++ { ++ IntegerExp *ne = (IntegerExp *)o; ++ if (type->toHeadMutable()->equals(ne->type->toHeadMutable()) && ++ value == ne->value) ++ { ++ return true; ++ } ++ } ++ return false; + } + + char *IntegerExp::toChars() +@@ -2209,7 +2815,7 @@ real_t IntegerExp::toImaginary() + + complex_t IntegerExp::toComplex() + { +- return toReal(); ++ return (complex_t)toReal(); + } + + int IntegerExp::isBool(int result) +@@ -2390,7 +2996,7 @@ void IntegerExp::toMangleBuffer(OutBuffe + */ + + ErrorExp::ErrorExp() +- : IntegerExp(0, 0, Type::terror) ++ : IntegerExp(Loc(), 0, Type::terror) + { + op = TOKerror; + } +@@ -2417,31 +3023,29 @@ RealExp::RealExp(Loc loc, real_t value, + + char *RealExp::toChars() + { ++ /** sizeof(value)*3 is because each byte of mantissa is max ++ of 256 (3 characters). The string will be "-M.MMMMe-4932". ++ (ie, 8 chars more than mantissa). Plus one for trailing \0. ++ Plus one for rounding. */ + char buffer[sizeof(value) * 3 + 8 + 1 + 1]; + + ld_sprint(buffer, 'g', value); ++ + if (type->isimaginary()) + strcat(buffer, "i"); +- assert(strlen(buffer) < sizeof(buffer)); ++ ++ assert(strlen(buffer) < sizeof(buffer) / sizeof(buffer[0])); + return mem.strdup(buffer); + } + + dinteger_t RealExp::toInteger() + { +-#ifdef IN_GCC +- return (sinteger_t) toReal().toInt(); +-#else + return (sinteger_t) toReal(); +-#endif + } + + uinteger_t RealExp::toUInteger() + { +-#ifdef IN_GCC +- return (uinteger_t) toReal().toInt(); +-#else + return (uinteger_t) toReal(); +-#endif + } + + real_t RealExp::toReal() +@@ -2471,29 +3075,24 @@ complex_t RealExp::toComplex() + + int RealEquals(real_t x1, real_t x2) + { +-#ifndef IN_GCC + return (Port::isNan(x1) && Port::isNan(x2)) || +- /* In some cases, the REALPAD bytes get garbage in them, +- * so be sure and ignore them. +- */ +- memcmp(&x1, &x2, Target::realsize - Target::realpad) == 0; +-#else +- return (Port::isNan(x1) && Port::isNan(x2)) || +- x1.isIdenticalTo(x2); +-#endif ++ Port::fequal(x1, x2); + } + +-int RealExp::equals(Object *o) +-{ RealExp *ne; +- +- if (this == o || +- (((Expression *)o)->op == TOKfloat64 && +- ((ne = (RealExp *)o), type->toHeadMutable()->equals(ne->type->toHeadMutable())) && +- RealEquals(value, ne->value) +- ) +- ) +- return 1; +- return 0; ++bool RealExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (((Expression *)o)->op == TOKfloat64) ++ { ++ RealExp *ne = (RealExp *)o; ++ if (type->toHeadMutable()->equals(ne->type->toHeadMutable()) && ++ RealEquals(value, ne->value)) ++ { ++ return true; ++ } ++ } ++ return false; + } + + Expression *RealExp::semantic(Scope *sc) +@@ -2507,12 +3106,8 @@ Expression *RealExp::semantic(Scope *sc) + + int RealExp::isBool(int result) + { +-#ifdef IN_GCC +- return result ? (! value.isZero()) : (value.isZero()); +-#else + return result ? (value != 0) + : (value == 0); +-#endif + } + + void floatToBuffer(OutBuffer *buf, Type *type, const real_t& value) +@@ -2525,35 +3120,14 @@ void floatToBuffer(OutBuffer *buf, Type + * "-1.18973e+4932\0".length == 17 + * "-0xf.fffffffffffffffp+16380\0".length == 28 + */ +-#ifdef IN_GCC +- char buffer[48]; +- real_t parsed_value; +- +- value.format(buffer, sizeof(buffer)); +- parsed_value = real_t::parse(buffer, real_t::LongDouble); +- if (parsed_value.isIdenticalTo(value)) +- buf->writestring(buffer); +- else +- { +- value.formatHex(buffer, sizeof(buffer)); +- buf->writestring(buffer); +- } +-#else + char buffer[32]; + ld_sprint(buffer, 'g', value); +- assert(strlen(buffer) < sizeof(buffer)); +-#if _WIN32 && __DMC__ +- char *save = __locale_decpoint; +- __locale_decpoint = "."; +- real_t r = strtold(buffer, NULL); +- __locale_decpoint = save; +-#else +- real_t r = strtold(buffer, NULL); +-#endif ++ assert(strlen(buffer) < sizeof(buffer) / sizeof(buffer[0])); ++ ++ real_t r = Port::strtold(buffer, NULL); + if (r != value) // if exact duplication + ld_sprint(buffer, 'a', value); + buf->writestring(buffer); +-#endif + + if (type) + { +@@ -2600,15 +3174,13 @@ void realToMangleBuffer(OutBuffer *buf, + + if (Port::isNan(value)) + buf->writestring("NAN"); // no -NAN bugs +-#ifdef IN_GCC + else if (Port::isInfinity(value)) +- buf->writestring(value.isNegative() ? "NINF" : "INF"); +-#endif ++ buf->writestring(value < 0 ? "NINF" : "INF"); + else + { +- char buffer[32]; ++ char buffer[36]; + int n = ld_sprint(buffer, 'A', value); +- assert(n > 0 && n < sizeof(buffer)); ++ assert(n > 0 && n < sizeof(buffer) / sizeof(buffer[0])); + for (int i = 0; i < n; i++) + { char c = buffer[i]; + +@@ -2654,32 +3226,25 @@ ComplexExp::ComplexExp(Loc loc, complex_ + char *ComplexExp::toChars() + { + char buffer[sizeof(value) * 3 + 8 + 1]; ++ + char buf1[sizeof(value) * 3 + 8 + 1]; + char buf2[sizeof(value) * 3 + 8 + 1]; + + ld_sprint(buf1, 'g', creall(value)); + ld_sprint(buf2, 'g', cimagl(value)); + sprintf(buffer, "(%s+%si)", buf1, buf2); +- assert(strlen(buffer) < sizeof(buffer)); ++ assert(strlen(buffer) < sizeof(buffer) / sizeof(buffer[0])); + return mem.strdup(buffer); + } + + dinteger_t ComplexExp::toInteger() + { +-#ifdef IN_GCC +- return (sinteger_t) toReal().toInt(); +-#else + return (sinteger_t) toReal(); +-#endif + } + + uinteger_t ComplexExp::toUInteger() + { +-#ifdef IN_GCC +- return (uinteger_t) toReal().toInt(); +-#else + return (uinteger_t) toReal(); +-#endif + } + + real_t ComplexExp::toReal() +@@ -2697,18 +3262,21 @@ complex_t ComplexExp::toComplex() + return value; + } + +-int ComplexExp::equals(Object *o) +-{ ComplexExp *ne; +- +- if (this == o || +- (((Expression *)o)->op == TOKcomplex80 && +- ((ne = (ComplexExp *)o), type->toHeadMutable()->equals(ne->type->toHeadMutable())) && +- RealEquals(creall(value), creall(ne->value)) && +- RealEquals(cimagl(value), cimagl(ne->value)) +- ) +- ) +- return 1; +- return 0; ++bool ComplexExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (((Expression *)o)->op == TOKcomplex80) ++ { ++ ComplexExp *ne = (ComplexExp *)o; ++ if (type->toHeadMutable()->equals(ne->type->toHeadMutable()) && ++ RealEquals(creall(value), creall(ne->value)) && ++ RealEquals(cimagl(value), cimagl(ne->value))) ++ { ++ return true; ++ } ++ } ++ return false; + } + + Expression *ComplexExp::semantic(Scope *sc) +@@ -2733,19 +3301,11 @@ void ComplexExp::toCBuffer(OutBuffer *bu + /* Print as: + * (re+imi) + */ +-#ifdef IN_GCC +- char buf1[sizeof(value) * 3 + 8 + 1]; +- char buf2[sizeof(value) * 3 + 8 + 1]; +- creall(value).format(buf1, sizeof(buf1)); +- cimagl(value).format(buf2, sizeof(buf2)); +- buf->printf("(%s+%si)", buf1, buf2); +-#else + buf->writeByte('('); + floatToBuffer(buf, type, creall(value)); + buf->writeByte('+'); + floatToBuffer(buf, type, cimagl(value)); + buf->writestring("i)"); +-#endif + } + + void ComplexExp::toMangleBuffer(OutBuffer *buf) +@@ -2777,11 +3337,13 @@ Expression *IdentifierExp::semantic(Scop + s = sc->search(loc, ident, &scopesym); + if (s) + { Expression *e; +- WithScopeSymbol *withsym; ++ ++ if (s->errors) ++ return new ErrorExp(); + + /* See if the symbol was a member of an enclosing 'with' + */ +- withsym = scopesym->isWithScopeSymbol(); ++ WithScopeSymbol *withsym = scopesym->isWithScopeSymbol(); + if (withsym) + { + #if DMDV2 +@@ -2829,12 +3391,13 @@ Expression *IdentifierExp::semantic(Scop + */ + FuncDeclaration *f = s->isFuncDeclaration(); + if (f) +- { TemplateDeclaration *tempdecl = getFuncTemplateDecl(f); +- if (tempdecl) ++ { ++ TemplateDeclaration *td = getFuncTemplateDecl(f); ++ if (td) + { +- if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's +- tempdecl = tempdecl->overroot; // then get the start +- e = new TemplateExp(loc, tempdecl); ++ if (td->overroot) // if not start of overloaded list of TemplateDeclaration's ++ td = td->overroot; // then get the start ++ e = new TemplateExp(loc, td, f); + e = e->semantic(sc); + return e; + } +@@ -2914,7 +3477,7 @@ DollarExp::DollarExp(Loc loc) + + /******************************** DsymbolExp **************************/ + +-DsymbolExp::DsymbolExp(Loc loc, Dsymbol *s, int hasOverloads) ++DsymbolExp::DsymbolExp(Loc loc, Dsymbol *s, bool hasOverloads) + : Expression(loc, TOKdsymbol, sizeof(DsymbolExp)) + { + this->s = s; +@@ -2942,8 +3505,6 @@ Lagain: + + //printf("DsymbolExp:: %p '%s' is a symbol\n", this, toChars()); + //printf("s = '%s', s->kind = '%s'\n", s->toChars(), s->kind()); +- if (type && !s->needThis()) +- return this; + if (!s->isFuncDeclaration()) // functions are checked after overloading + checkDeprecated(sc, s); + Dsymbol *olds = s; +@@ -2974,10 +3535,7 @@ Lagain: + em = s->isEnumMember(); + if (em) + { +- e = em->value; +- e->loc = loc; +- e = e->semantic(sc); +- return e; ++ return em->getVarExp(loc, sc); + } + v = s->isVarDeclaration(); + if (v) +@@ -2988,14 +3546,21 @@ Lagain: + v->semantic(v->scope); + type = v->type; + if (!v->type) +- { error("forward reference of %s %s", v->kind(), v->toChars()); ++ { error("forward reference of %s %s", s->kind(), s->toChars()); + return new ErrorExp(); + } + } + + if ((v->storage_class & STCmanifest) && v->init) + { +- e = v->init->toExpression(); ++ if (v->scope) ++ { ++ v->inuse++; ++ v->init = v->init->semantic(v->scope, v->type, INITinterpret); ++ v->scope = NULL; ++ v->inuse--; ++ } ++ e = v->init->toExpression(v->type); + if (!e) + { error("cannot make expression out of initializer for %s", v->toChars()); + return new ErrorExp(); +@@ -3024,11 +3589,6 @@ Lagain: + if (!f->functionSemantic()) + return new ErrorExp(); + +- if (f->isUnitTestDeclaration()) +- { +- error("cannot call unittest function %s", toChars()); +- return new ErrorExp(); +- } + if (!f->type->deco) + { + error("forward reference to %s", toChars()); +@@ -3041,7 +3601,7 @@ Lagain: + o = s->isOverloadSet(); + if (o) + { //printf("'%s' is an overload set\n", o->toChars()); +- return new OverExp(o); ++ return new OverExp(loc, o); + } + imp = s->isImport(); + if (imp) +@@ -3080,24 +3640,6 @@ Lagain: + TupleDeclaration *tup = s->isTupleDeclaration(); + if (tup) + { +- for (size_t i = 0; i < tup->objects->dim; i++) +- { +- Dsymbol *sa = getDsymbol((*tup->objects)[i]); +- if (sa && sa->needThis()) +- { +- if (hasThis(sc) +-#if DMDV2 +- && !sa->isFuncDeclaration() +-#endif +- ) +- { +- // Supply an implicit 'this', as in +- // this.ident +- (*tup->objects)[i] = new DotVarExp(loc, new ThisExp(loc), sa->isDeclaration()); +- } +- } +- } +- + e = new TupleExp(loc, tup); + e = e->semantic(sc); + return e; +@@ -3123,7 +3665,8 @@ Lagain: + Dsymbol *p = td->toParent2(); + FuncDeclaration *fdthis = hasThis(sc); + AggregateDeclaration *ad = p ? p->isAggregateDeclaration() : NULL; +- if (fdthis && ad && isAggregate(fdthis->vthis->type) == ad) ++ if (fdthis && ad && isAggregate(fdthis->vthis->type) == ad && ++ (td->scope->stc & STCstatic) == 0) + { + e = new DotTemplateExp(loc, new ThisExp(loc), td); + } +@@ -3182,7 +3725,7 @@ Expression *ThisExp::semantic(Scope *sc) + /* Special case for typeof(this) and typeof(super) since both + * should work even if they are not inside a non-static member function + */ +- if (!fd && sc->intypeof) ++ if (!fd && sc->intypeof == 1) + { + // Find enclosing struct or class + for (Dsymbol *s = sc->getStructClassScope(); 1; s = s->parent) +@@ -3278,7 +3821,7 @@ Expression *SuperExp::semantic(Scope *sc + /* Special case for typeof(this) and typeof(super) since both + * should work even if they are not inside a non-static member function + */ +- if (!fd && sc->intypeof) ++ if (!fd && sc->intypeof == 1) + { + // Find enclosing class + for (Dsymbol *s = sc->getStructClassScope(); 1; s = s->parent) +@@ -3356,15 +3899,15 @@ NullExp::NullExp(Loc loc, Type *type) + this->type = type; + } + +-int NullExp::equals(Object *o) ++bool NullExp::equals(RootObject *o) + { + if (o && o->dyncast() == DYNCAST_EXPRESSION) +- { Expression *e = (Expression *)o; +- ++ { ++ Expression *e = (Expression *)o; + if (e->op == TOKnull) +- return TRUE; ++ return true; + } +- return FALSE; ++ return false; + } + + Expression *NullExp::semantic(Scope *sc) +@@ -3428,7 +3971,7 @@ StringExp::StringExp(Loc loc, void *stri + this->ownedByCtfe = false; + } + +-StringExp::StringExp(Loc loc, void *string, size_t len, unsigned char postfix) ++StringExp::StringExp(Loc loc, void *string, size_t len, utf8_t postfix) + : Expression(loc, TOKstring, sizeof(StringExp)) + { + this->string = string; +@@ -3447,18 +3990,18 @@ Expression *StringExp::syntaxCopy() + } + #endif + +-int StringExp::equals(Object *o) ++bool StringExp::equals(RootObject *o) + { + //printf("StringExp::equals('%s') %s\n", o->toChars(), toChars()); + if (o && o->dyncast() == DYNCAST_EXPRESSION) +- { Expression *e = (Expression *)o; +- ++ { ++ Expression *e = (Expression *)o; + if (e->op == TOKstring) + { + return compare(o) == 0; + } + } +- return FALSE; ++ return false; + } + + Expression *StringExp::semantic(Scope *sc) +@@ -3478,7 +4021,7 @@ Expression *StringExp::semantic(Scope *s + case 'd': + for (u = 0; u < len;) + { +- p = utf_decodeChar((unsigned char *)string, len, &u, &c); ++ p = utf_decodeChar((utf8_t *)string, len, &u, &c); + if (p) + { error("%s", p); + return new ErrorExp(); +@@ -3493,14 +4036,14 @@ Expression *StringExp::semantic(Scope *s + len = newlen; + sz = 4; + //type = new TypeSArray(Type::tdchar, new IntegerExp(loc, len, Type::tindex)); +- type = new TypeDArray(Type::tdchar->invariantOf()); ++ type = new TypeDArray(Type::tdchar->immutableOf()); + committed = 1; + break; + + case 'w': + for (u = 0; u < len;) + { +- p = utf_decodeChar((unsigned char *)string, len, &u, &c); ++ p = utf_decodeChar((utf8_t *)string, len, &u, &c); + if (p) + { error("%s", p); + return new ErrorExp(); +@@ -3517,7 +4060,7 @@ Expression *StringExp::semantic(Scope *s + len = newlen; + sz = 2; + //type = new TypeSArray(Type::twchar, new IntegerExp(loc, len, Type::tindex)); +- type = new TypeDArray(Type::twchar->invariantOf()); ++ type = new TypeDArray(Type::twchar->immutableOf()); + committed = 1; + break; + +@@ -3525,11 +4068,11 @@ Expression *StringExp::semantic(Scope *s + committed = 1; + default: + //type = new TypeSArray(Type::tchar, new IntegerExp(loc, len, Type::tindex)); +- type = new TypeDArray(Type::tchar->invariantOf()); ++ type = new TypeDArray(Type::tchar->immutableOf()); + break; + } + type = type->semantic(loc, sc); +- //type = type->invariantOf(); ++ //type = type->immutableOf(); + //printf("type = %s\n", type->toChars()); + } + return this; +@@ -3550,7 +4093,7 @@ size_t StringExp::length() + case 1: + for (size_t u = 0; u < len;) + { +- p = utf_decodeChar((unsigned char *)string, len, &u, &c); ++ p = utf_decodeChar((utf8_t *)string, len, &u, &c); + if (p) + { error("%s", p); + return 0; +@@ -3607,7 +4150,7 @@ StringExp *StringExp::toUTF8(Scope *sc) + return this; + } + +-int StringExp::compare(Object *obj) ++int StringExp::compare(RootObject *obj) + { + //printf("StringExp::compare()\n"); + // Used to sort case statement expressions so we can do an efficient lookup +@@ -3674,13 +4217,14 @@ int StringExp::isLvalue() + /* string literal is rvalue in default, but + * conversion to reference of static array is only allowed. + */ +- return 0; ++ return (type && type->toBasetype()->ty == Tsarray); + } + + Expression *StringExp::toLvalue(Scope *sc, Expression *e) + { +- //printf("StringExp::toLvalue(%s)\n", toChars()); +- return this; ++ //printf("StringExp::toLvalue(%s) type = %s\n", toChars(), type ? type->toChars() : NULL); ++ return (type && type->toBasetype()->ty == Tsarray) ++ ? this : Expression::toLvalue(sc, e); + } + + Expression *StringExp::modifiableLvalue(Scope *sc, Expression *e) +@@ -3695,7 +4239,7 @@ unsigned StringExp::charAt(size_t i) + switch (sz) + { + case 1: +- value = ((unsigned char *)string)[i]; ++ value = ((utf8_t *)string)[i]; + break; + + case 2: +@@ -3754,7 +4298,7 @@ void StringExp::toMangleBuffer(OutBuffer + const char *p; + unsigned c; + size_t u; +- unsigned char *q; ++ utf8_t *q; + size_t qlen; + + /* Write string in UTF-8 format +@@ -3762,7 +4306,7 @@ void StringExp::toMangleBuffer(OutBuffer + switch (sz) + { case 1: + m = 'a'; +- q = (unsigned char *)string; ++ q = (utf8_t *)string; + qlen = len; + break; + case 2: +@@ -3798,12 +4342,12 @@ void StringExp::toMangleBuffer(OutBuffer + buf->writeByte(m); + buf->printf("%d_", (int)qlen); // nbytes <= 11 + +- for (unsigned char *p = buf->data + buf->offset, *pend = p + 2 * qlen; ++ for (utf8_t *p = buf->data + buf->offset, *pend = p + 2 * qlen; + p < pend; p += 2, ++q) + { +- unsigned char hi = *q >> 4 & 0xF; ++ utf8_t hi = *q >> 4 & 0xF; + p[0] = (hi < 10 ? hi + '0' : hi - 10 + 'a'); +- unsigned char lo = *q & 0xF; ++ utf8_t lo = *q & 0xF; + p[1] = (lo < 10 ? lo + '0' : lo - 10 + 'a'); + } + buf->offset += 2 * qlen; +@@ -3828,6 +4372,29 @@ ArrayLiteralExp::ArrayLiteralExp(Loc loc + this->ownedByCtfe = false; + } + ++bool ArrayLiteralExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (o && o->dyncast() == DYNCAST_EXPRESSION && ++ ((Expression *)o)->op == TOKarrayliteral) ++ { ++ ArrayLiteralExp *ae = (ArrayLiteralExp *)o; ++ if (elements->dim != ae->elements->dim) ++ return false; ++ for (size_t i = 0; i < elements->dim; i++) ++ { ++ Expression *e1 = (*elements)[i]; ++ Expression *e2 = (*ae->elements)[i]; ++ if (e1 != e2 && ++ (!e1 || !e2 || !e1->equals(e2))) ++ return false; ++ } ++ return true; ++ } ++ return false; ++} ++ + Expression *ArrayLiteralExp::syntaxCopy() + { + return new ArrayLiteralExp(loc, arraySyntaxCopy(elements)); +@@ -3877,23 +4444,31 @@ StringExp *ArrayLiteralExp::toString() + if (telem == Tchar || telem == Twchar || telem == Tdchar || + (telem == Tvoid && (!elements || elements->dim == 0))) + { ++ unsigned char sz = 1; ++ if (telem == Twchar) sz = 2; ++ else if (telem == Tdchar) sz = 4; ++ + OutBuffer buf; + if (elements) ++ { + for (int i = 0; i < elements->dim; ++i) + { + Expression *ch = (*elements)[i]; + if (ch->op != TOKint64) + return NULL; +- buf.writeUTF8(ch->toInteger()); ++ if (sz == 1) buf.writebyte(ch->toInteger()); ++ else if (sz == 2) buf.writeword(ch->toInteger()); ++ else buf.write4(ch->toInteger()); + } +- buf.writebyte(0); +- +- char prefix = 'c'; +- if (telem == Twchar) prefix = 'w'; +- else if (telem == Tdchar) prefix = 'd'; ++ } ++ char prefix; ++ if (sz == 1) { prefix = 'c'; buf.writebyte(0); } ++ else if (sz == 2) { prefix = 'w'; buf.writeword(0); } ++ else { prefix = 'd'; buf.write4(0); } + +- const size_t len = buf.offset - 1; ++ const size_t len = buf.offset / sz - 1; + StringExp *se = new StringExp(loc, buf.extractData(), len, prefix); ++ se->sz = sz; + se->type = type; + return se; + } +@@ -3985,7 +4560,7 @@ void AssocArrayLiteralExp::toCBuffer(Out + Expression *value = (*values)[i]; + + if (i) +- buf->writeByte(','); ++ buf->writestring(", "); + expToCBuffer(buf, hgs, key, PREC_assign); + buf->writeByte(':'); + expToCBuffer(buf, hgs, value, PREC_assign); +@@ -4023,18 +4598,46 @@ StructLiteralExp::StructLiteralExp(Loc l + this->soffset = 0; + this->fillHoles = 1; + this->ownedByCtfe = false; +- this->ctorinit = 0; ++ this->origin = this; ++ this->stageflags = 0; ++ this->inlinecopy = NULL; + //printf("StructLiteralExp::StructLiteralExp(%s)\n", toChars()); + } + ++bool StructLiteralExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (o && o->dyncast() == DYNCAST_EXPRESSION && ++ ((Expression *)o)->op == TOKstructliteral) ++ { ++ StructLiteralExp *se = (StructLiteralExp *)o; ++ if (sd != se->sd) ++ return false; ++ if (elements->dim != se->elements->dim) ++ return false; ++ for (size_t i = 0; i < elements->dim; i++) ++ { ++ Expression *e1 = (*elements)[i]; ++ Expression *e2 = (*se->elements)[i]; ++ if (e1 != e2 && ++ (!e1 || !e2 || !e1->equals(e2))) ++ return false; ++ } ++ return true; ++ } ++ return false; ++} ++ + Expression *StructLiteralExp::syntaxCopy() + { +- return new StructLiteralExp(loc, sd, arraySyntaxCopy(elements), stype); ++ StructLiteralExp *exp = new StructLiteralExp(loc, sd, arraySyntaxCopy(elements), stype); ++ exp->origin = this; ++ return exp; + } + + Expression *StructLiteralExp::semantic(Scope *sc) +-{ Expression *e; +- ++{ + #if LOGSEMANTIC + printf("StructLiteralExp::semantic('%s')\n", toChars()); + #endif +@@ -4044,19 +4647,24 @@ Expression *StructLiteralExp::semantic(S + sd->size(loc); + if (sd->sizeok != SIZEOKdone) + return new ErrorExp(); +- size_t nfields = sd->fields.dim - sd->isnested; ++ size_t nfields = sd->fields.dim - sd->isNested(); + + elements = arrayExpressionSemantic(elements, sc); // run semantic() on each element + expandTuples(elements); + size_t offset = 0; + for (size_t i = 0; i < elements->dim; i++) +- { e = (*elements)[i]; ++ { ++ Expression *e = (*elements)[i]; + if (!e) + continue; + + e = resolveProperties(sc, e); + if (i >= nfields) + { ++ if (i == sd->fields.dim - 1 && sd->isNested() && e->op == TOKnull) ++ { // CTFE sometimes creates null as hidden pointer; we'll allow this. ++ continue; ++ } + #if 0 + for (size_t i = 0; i < sd->fields.dim; i++) + printf("[%d] = %s\n", i, sd->fields[i]->toChars()); +@@ -4064,11 +4672,10 @@ Expression *StructLiteralExp::semantic(S + error("more initializers than fields (%d) of %s", nfields, sd->toChars()); + return new ErrorExp(); + } +- Dsymbol *s = sd->fields[i]; +- VarDeclaration *v = s->isVarDeclaration(); +- assert(v); ++ VarDeclaration *v = sd->fields[i]; + if (v->offset < offset) +- { error("overlapping initialization for %s", v->toChars()); ++ { ++ error("overlapping initialization for %s", v->toChars()); + return new ErrorExp(); + } + offset = v->offset + v->type->size(); +@@ -4078,7 +4685,8 @@ Expression *StructLiteralExp::semantic(S + telem = telem->addMod(stype->mod); + Type *origType = telem; + while (!e->implicitConvTo(telem) && telem->toBasetype()->ty == Tsarray) +- { /* Static array initialization, as in: ++ { ++ /* Static array initialization, as in: + * T[3][5] = e; + */ + telem = telem->toBasetype()->nextOf(); +@@ -4091,55 +4699,22 @@ Expression *StructLiteralExp::semantic(S + if (e->op == TOKerror) + return e; + +- (*elements)[i] = e; ++ (*elements)[i] = e->isLvalue() ? callCpCtor(sc, e) : valueNoDtor(e); + } + + /* Fill out remainder of elements[] with default initializers for fields[] + */ +- for (size_t i = elements->dim; i < nfields; i++) +- { Dsymbol *s = sd->fields[i]; +- VarDeclaration *v = s->isVarDeclaration(); +- assert(v); +- assert(!v->isThisDeclaration()); +- +- if (v->offset < offset) +- { e = NULL; +- sd->hasUnions = 1; +- } +- else +- { +- if (v->init) +- { if (v->init->isVoidInitializer()) +- e = NULL; +- else +- { e = v->init->toExpression(); +- if (!e) +- { error("cannot make expression out of initializer for %s", v->toChars()); +- return new ErrorExp(); +- } +- else if (v->scope) +- { // Do deferred semantic analysis +- Initializer *i2 = v->init->syntaxCopy(); +- i2 = i2->semantic(v->scope, v->type, INITinterpret); +- e = i2->toExpression(); +- // remove v->scope (see bug 3426) +- // but not if gagged, for we might be called again. +- if (!global.gag) +- { v->scope = NULL; +- v->init = i2; // save result +- } +- } +- } +- } +- else if (v->type->needsNested() && ctorinit) +- e = v->type->defaultInit(loc); +- else +- e = v->type->defaultInitLiteral(loc); +- offset = v->offset + v->type->size(); +- } +- elements->push(e); ++ Expression *e = fill(false); ++ if (e->op == TOKerror) ++ { ++ /* An error in the initializer needs to be recorded as an error ++ * in the enclosing function or template, since the initializer ++ * will be part of the stuct declaration. ++ */ ++ global.increaseErrorCount(); ++ return e; + } +- ++ assert(e == this); + type = stype ? stype : sd->type; + + /* If struct requires a destructor, rewrite as: +@@ -4149,7 +4724,7 @@ Expression *StructLiteralExp::semantic(S + if (sd->dtor && sc->func) + { + Identifier *idtmp = Lexer::uniqueId("__sl"); +- VarDeclaration *tmp = new VarDeclaration(loc, type, idtmp, new ExpInitializer(0, this)); ++ VarDeclaration *tmp = new VarDeclaration(loc, type, idtmp, new ExpInitializer(Loc(), this)); + tmp->storage_class |= STCctfe; + Expression *ae = new DeclarationExp(loc, tmp); + Expression *e = new CommaExp(loc, ae, new VarExp(loc, tmp)); +@@ -4160,6 +4735,115 @@ Expression *StructLiteralExp::semantic(S + return this; + } + ++Expression *StructLiteralExp::fill(bool ctorinit) ++{ ++ assert(sd && sd->sizeok == SIZEOKdone); ++ size_t nfields = sd->fields.dim - sd->isNested(); ++ ++ size_t dim = elements->dim; ++ elements->setDim(nfields); ++ for (size_t i = dim; i < nfields; i++) ++ (*elements)[i] = NULL; ++ ++ // Fill in missing any elements with default initializers ++ for (size_t i = 0; i < nfields; i++) ++ { ++ if ((*elements)[i]) ++ continue; ++ VarDeclaration *vd = sd->fields[i]; ++ VarDeclaration *vx = vd; ++ if (vd->init && vd->init->isVoidInitializer()) ++ vx = NULL; ++ // Find overlapped fields with the hole [vd->offset .. vd->offset->size()]. ++ size_t fieldi = i; ++ for (size_t j = 0; j < nfields; j++) ++ { ++ if (i == j) ++ continue; ++ VarDeclaration *v2 = sd->fields[j]; ++ if (v2->init && v2->init->isVoidInitializer()) ++ continue; ++ ++ bool overlap = (vd->offset < v2->offset + v2->type->size() && ++ v2->offset < vd->offset + vd->type->size()); ++ if (!overlap) ++ continue; ++ ++ sd->hasUnions = 1; // note that directly unrelated... ++ ++ if ((*elements)[j]) ++ { ++ vx = NULL; ++ break; ++ } ++ ++#if 1 ++ /* Prefer first found non-void-initialized field ++ * union U { int a; int b = 2; } ++ * U u; // Error: overlapping initialization for field a and b ++ */ ++ if (!vx) ++ vx = v2, fieldi = j; ++ else if (v2->init) ++ { ++ error("overlapping initialization for field %s and %s", ++ v2->toChars(), vd->toChars()); ++ } ++#else // fix Bugzilla 1432 ++ /* Prefer explicitly initialized field ++ * union U { int a; int b = 2; } ++ * U u; // OK (u.b == 2) ++ */ ++ if (!vx || !vx->init && v2->init) ++ vx = v2, fieldi = j; ++ else if (vx != vd && ++ !(vx->offset < v2->offset + v2->type->size() && ++ v2->offset < vx->offset + vx->type->size())) ++ { ++ // Both vx and v2 fills vd, but vx and v2 does not overlap ++ } ++ else if (vx->init && v2->init) ++ { ++ error("overlapping default initialization for field %s and %s", ++ v2->toChars(), vd->toChars()); ++ } ++ else ++ assert(vx->init || !vx->init && !v2->init); ++#endif ++ } ++ if (vx) ++ { ++ Expression *e; ++ if (vx->init) ++ { ++ assert(!vx->init->isVoidInitializer()); ++ e = vx->getConstInitializer(false); ++ } ++ else ++ { ++ if ((vx->storage_class & STCnodefaultctor) && !ctorinit) ++ { ++ error("field %s.%s must be initialized because it has no default constructor", ++ sd->type->toChars(), vx->toChars()); ++ } ++ if (vx->type->needsNested() && ctorinit) ++ e = vx->type->defaultInit(loc); ++ else ++ e = vx->type->defaultInitLiteral(loc); ++ } ++ (*elements)[fieldi] = e; ++ } ++ } ++ ++ for (size_t i = 0; i < elements->dim; i++) ++ { ++ Expression *e = (*elements)[i]; ++ if (e && e->op == TOKerror) ++ return e; ++ } ++ return this; ++} ++ + /************************************** + * Gets expression at offset of type. + * Returns NULL if not found. +@@ -4252,7 +4936,21 @@ void StructLiteralExp::toCBuffer(OutBuff + { + buf->writestring(sd->toChars()); + buf->writeByte('('); +- argsToCBuffer(buf, elements, hgs); ++ ++ // CTFE can generate struct literals that contain an AddrExp pointing ++ // to themselves, need to avoid infinite recursion: ++ // struct S { this(int){ this.s = &this; } S* s; } ++ // const foo = new S(0); ++ if (stageflags & stageToCBuffer) ++ buf->writestring(""); ++ else ++ { ++ int old = stageflags; ++ stageflags |= stageToCBuffer; ++ argsToCBuffer(buf, elements, hgs); ++ stageflags = old; ++ } ++ + buf->writeByte(')'); + } + +@@ -4278,7 +4976,7 @@ void StructLiteralExp::toMangleBuffer(Ou + * cast(foo).size + */ + +-Expression *typeDotIdExp(Loc loc, Type *type, Identifier *ident) ++DotIdExp *typeDotIdExp(Loc loc, Type *type, Identifier *ident) + { + return new DotIdExp(loc, new TypeExp(loc, type), ident); + } +@@ -4363,16 +5061,49 @@ Expression *ScopeExp::syntaxCopy() + + Expression *ScopeExp::semantic(Scope *sc) + { +- TemplateInstance *ti; +- ScopeDsymbol *sds2; +- + #if LOGSEMANTIC + printf("+ScopeExp::semantic('%s')\n", toChars()); + #endif ++ //if (type == Type::tvoid) ++ // return this; ++ + Lagain: +- ti = sds->isTemplateInstance(); +- if (ti && !ti->errors) ++ TemplateInstance *ti = sds->isTemplateInstance(); ++ if (ti) + { ++ if (!ti->findTemplateDeclaration(sc) || ++ !ti->semanticTiargs(sc)) ++ { ++ ti->inst = ti; ++ ti->inst->errors = true; ++ return new ErrorExp(); ++ } ++ if (ti->needsTypeInference(sc)) ++ { ++ if (TemplateDeclaration *td = ti->tempdecl->isTemplateDeclaration()) ++ { ++ Dsymbol *p = td->toParent2(); ++ FuncDeclaration *fdthis = hasThis(sc); ++ AggregateDeclaration *ad = p ? p->isAggregateDeclaration() : NULL; ++ if (fdthis && ad && isAggregate(fdthis->vthis->type) == ad && ++ (td->scope->stc & STCstatic) == 0) ++ { ++ Expression *e = new DotTemplateInstanceExp(loc, new ThisExp(loc), ti->name, ti->tiargs); ++ return e->semantic(sc); ++ } ++ } ++ else if (OverloadSet *os = ti->tempdecl->isOverloadSet()) ++ { ++ FuncDeclaration *fdthis = hasThis(sc); ++ AggregateDeclaration *ad = os->parent->isAggregateDeclaration(); ++ if (fdthis && ad && isAggregate(fdthis->vthis->type) == ad) ++ { ++ Expression *e = new DotTemplateInstanceExp(loc, new ThisExp(loc), ti->name, ti->tiargs); ++ return e->semantic(sc); ++ } ++ } ++ return this; ++ } + unsigned olderrs = global.errors; + if (!ti->semanticRun) + ti->semantic(sc); +@@ -4381,9 +5112,10 @@ Lagain: + if (ti->inst->errors) + return new ErrorExp(); + Dsymbol *s = ti->inst->toAlias(); +- sds2 = s->isScopeDsymbol(); ++ ScopeDsymbol *sds2 = s->isScopeDsymbol(); + if (!sds2) +- { Expression *e; ++ { ++ Expression *e; + + //printf("s = %s, '%s'\n", s->kind(), s->toChars()); + if (ti->withsym) +@@ -4449,11 +5181,12 @@ void ScopeExp::toCBuffer(OutBuffer *buf, + + // Mainly just a placeholder + +-TemplateExp::TemplateExp(Loc loc, TemplateDeclaration *td) ++TemplateExp::TemplateExp(Loc loc, TemplateDeclaration *td, FuncDeclaration *fd) + : Expression(loc, TOKtemplate, sizeof(TemplateExp)) + { + //printf("TemplateExp(): %s\n", td->toChars()); + this->td = td; ++ this->fd = fd; + } + + void TemplateExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4467,6 +5200,20 @@ int TemplateExp::rvalue() + return 0; + } + ++int TemplateExp::isLvalue() ++{ ++ return fd != NULL; ++} ++ ++Expression *TemplateExp::toLvalue(Scope *sc, Expression *e) ++{ ++ if (!fd) ++ return Expression::toLvalue(sc, e); ++ Expression *ex = new DsymbolExp(loc, fd, 1); ++ ex = ex->semantic(sc); ++ return ex; ++} ++ + /********************** NewExp **************************************/ + + /* thisexp.new(newargs) newtype(arguments) */ +@@ -4497,6 +5244,7 @@ Expression *NewExp::semantic(Scope *sc) + { + Type *tb; + ClassDeclaration *cdthis = NULL; ++ size_t nargs; + + #if LOGSEMANTIC + printf("NewExp::semantic() %s\n", toChars()); +@@ -4541,6 +5289,8 @@ Lagain: + arrayExpressionSemantic(arguments, sc); + preFunctionParameters(loc, sc, arguments); + ++ nargs = arguments ? arguments->dim : 0; ++ + if (thisexp && tb->ty != Tclass) + { error("e.new is only for allocating nested classes, not %s", tb->toChars()); + goto Lerr; +@@ -4561,13 +5311,13 @@ Lagain: + for (size_t i = 0; i < cd->vtbl.dim; i++) + { FuncDeclaration *fd = cd->vtbl[i]->isFuncDeclaration(); + if (fd && fd->isAbstract()) +- error("function %s is abstract", fd->toChars()); ++ errorSupplemental(loc, "function '%s' is not implemented", fd->toFullSignature()); + } + goto Lerr; + } + +- if (cd->noDefaultCtor && (!arguments || !arguments->dim)) +- { error("default construction is disabled for type %s", cd->toChars()); ++ if (cd->noDefaultCtor && !nargs && !cd->defaultCtor) ++ { error("default construction is disabled for type %s", cd->type->toChars()); + goto Lerr; + } + checkDeprecated(sc, cd); +@@ -4611,7 +5361,7 @@ Lagain: + goto Lerr; + } + } +- } ++ } + else if (thisexp) + { error("e.new is only for allocating nested classes"); + goto Lerr; +@@ -4641,10 +5391,14 @@ Lagain: + + FuncDeclaration *f = NULL; + if (cd->ctor) +- f = resolveFuncCall(sc, loc, cd->ctor, NULL, NULL, arguments, 0); ++ f = resolveFuncCall(loc, sc, cd->ctor, NULL, tb, arguments, 0); + if (f) + { + checkDeprecated(sc, f); ++#if DMDV2 ++ checkPurity(sc, f); ++ checkSafety(sc, f); ++#endif + member = f->isCtorDeclaration(); + assert(member); + +@@ -4655,14 +5409,13 @@ Lagain: + if (!arguments) + arguments = new Expressions(); + unsigned olderrors = global.errors; +- functionParameters(loc, sc, tf, NULL, arguments, f); ++ type = functionParameters(loc, sc, tf, type, arguments, f); + if (olderrors != global.errors) + return new ErrorExp(); +- type = type->addMod(tf->nextOf()->mod); + } + else + { +- if (arguments && arguments->dim) ++ if (nargs) + { error("no constructor for %s", cd->toChars()); + goto Lerr; + } +@@ -4676,7 +5429,9 @@ Lagain: + newargs = new Expressions(); + newargs->shift(e); + +- f = cd->aggNew->overloadResolve(loc, NULL, newargs); ++ f = resolveFuncCall(loc, sc, cd->aggNew, NULL, tb, newargs); ++ if (!f) ++ goto Lerr; + allocator = f->isNewDeclaration(); + assert(allocator); + +@@ -4685,7 +5440,6 @@ Lagain: + functionParameters(loc, sc, tf, NULL, newargs, f); + if (olderrors != global.errors) + return new ErrorExp(); +- + } + else + { +@@ -4701,8 +5455,8 @@ Lagain: + StructDeclaration *sd = ts->sym; + if (sd->scope) + sd->semantic(NULL); +- if (sd->noDefaultCtor && (!arguments || !arguments->dim)) +- { error("default construction is disabled for type %s", sd->toChars()); ++ if (sd->noDefaultCtor && !nargs) ++ { error("default construction is disabled for type %s", sd->type->toChars()); + goto Lerr; + } + +@@ -4714,7 +5468,9 @@ Lagain: + newargs = new Expressions(); + newargs->shift(e); + +- FuncDeclaration *f = sd->aggNew->overloadResolve(loc, NULL, newargs); ++ FuncDeclaration *f = resolveFuncCall(loc, sc, sd->aggNew, NULL, tb, newargs); ++ if (!f) ++ goto Lerr; + allocator = f->isNewDeclaration(); + assert(allocator); + +@@ -4733,27 +5489,30 @@ Lagain: + } + + FuncDeclaration *f = NULL; +- if (sd->ctor) +- f = resolveFuncCall(sc, loc, sd->ctor, NULL, NULL, arguments, 0); ++ if (sd->ctor && nargs) ++ f = resolveFuncCall(loc, sc, sd->ctor, NULL, tb, arguments, 0); + if (f) + { + checkDeprecated(sc, f); ++#if DMDV2 ++ checkPurity(sc, f); ++ checkSafety(sc, f); ++#endif + member = f->isCtorDeclaration(); + assert(member); + + sd->accessCheck(loc, sc, member); + + TypeFunction *tf = (TypeFunction *)f->type; +- type = tf->next; + + if (!arguments) + arguments = new Expressions(); + unsigned olderrors = global.errors; +- functionParameters(loc, sc, tf, NULL, arguments, f); ++ type = functionParameters(loc, sc, tf, type, arguments, f); + if (olderrors != global.errors) + return new ErrorExp(); + } +- else if (arguments && arguments->dim) ++ else if (nargs) + { + Type *tptr = type->pointerTo(); + +@@ -4782,9 +5541,16 @@ Lagain: + + type = type->pointerTo(); + } +- else if (tb->ty == Tarray && (arguments && arguments->dim)) ++ else if (tb->ty == Tarray && nargs) + { +- for (size_t i = 0; i < arguments->dim; i++) ++ Type *tn = tb->nextOf()->baseElemOf(); ++ Dsymbol *s = tn->toDsymbol(sc); ++ AggregateDeclaration *ad = s ? s->isAggregateDeclaration() : NULL; ++ if (ad && ad->noDefaultCtor) ++ { error("default construction is disabled for type %s", tb->nextOf()->toChars()); ++ goto Lerr; ++ } ++ for (size_t i = 0; i < nargs; i++) + { + if (tb->ty != Tarray) + { error("too many arguments for array"); +@@ -4805,7 +5571,7 @@ Lagain: + } + else if (tb->isscalar()) + { +- if (arguments && arguments->dim) ++ if (nargs) + { error("no constructor for %s", type->toChars()); + goto Lerr; + } +@@ -4881,7 +5647,11 @@ Expression *NewAnonClassExp::semantic(Sc + #endif + + Expression *d = new DeclarationExp(loc, cd); ++ sc = sc->startCTFE(); // just create new scope ++ sc->flags &= ~SCOPEctfe; // temporary stop CTFE + d = d->semantic(sc); ++ sc->flags |= SCOPEctfe; ++ sc = sc->endCTFE(); + + Expression *n = new NewExp(loc, thisexp, newargs, cd->type, arguments); + +@@ -4920,7 +5690,7 @@ void NewAnonClassExp::toCBuffer(OutBuffe + /********************** SymbolExp **************************************/ + + #if DMDV2 +-SymbolExp::SymbolExp(Loc loc, enum TOK op, int size, Declaration *var, int hasOverloads) ++SymbolExp::SymbolExp(Loc loc, TOK op, int size, Declaration *var, bool hasOverloads) + : Expression(loc, op, size) + { + assert(var); +@@ -4931,7 +5701,7 @@ SymbolExp::SymbolExp(Loc loc, enum TOK o + + /********************** SymOffExp **************************************/ + +-SymOffExp::SymOffExp(Loc loc, Declaration *var, unsigned offset, int hasOverloads) ++SymOffExp::SymOffExp(Loc loc, Declaration *var, unsigned offset, bool hasOverloads) + : SymbolExp(loc, TOKsymoff, sizeof(SymOffExp), var, hasOverloads) + { + this->offset = offset; +@@ -4983,13 +5753,15 @@ void SymOffExp::toCBuffer(OutBuffer *buf + { + if (offset) + buf->printf("(& %s+%u)", var->toChars(), offset); ++ else if (var->isTypeInfoDeclaration()) ++ buf->printf("%s", var->toChars()); + else + buf->printf("& %s", var->toChars()); + } + + /******************************** VarExp **************************/ + +-VarExp::VarExp(Loc loc, Declaration *var, int hasOverloads) ++VarExp::VarExp(Loc loc, Declaration *var, bool hasOverloads) + : SymbolExp(loc, TOKvar, sizeof(VarExp), var, hasOverloads) + { + //printf("VarExp(this = %p, '%s', loc = %s)\n", this, var->toChars(), loc.toChars()); +@@ -4997,15 +5769,20 @@ VarExp::VarExp(Loc loc, Declaration *var + this->type = var->type; + } + +-int VarExp::equals(Object *o) +-{ VarExp *ne; +- +- if (this == o || +- (((Expression *)o)->op == TOKvar && +- ((ne = (VarExp *)o), type->toHeadMutable()->equals(ne->type->toHeadMutable())) && +- var == ne->var)) +- return 1; +- return 0; ++bool VarExp::equals(RootObject *o) ++{ ++ if (this == o) ++ return true; ++ if (((Expression *)o)->op == TOKvar) ++ { ++ VarExp *ne = (VarExp *)o; ++ if (type->toHeadMutable()->equals(ne->type->toHeadMutable()) && ++ var == ne->var) ++ { ++ return true; ++ } ++ } ++ return false; + } + + Expression *VarExp::semantic(Scope *sc) +@@ -5035,9 +5812,10 @@ Expression *VarExp::semantic(Scope *sc) + VarDeclaration *v = var->isVarDeclaration(); + if (v) + { ++ hasOverloads = 0; + v->checkNestedReference(sc, loc); + #if DMDV2 +- checkPurity(sc, v, NULL); ++ checkPurity(sc, v); + #endif + } + FuncDeclaration *f = var->isFuncDeclaration(); +@@ -5085,13 +5863,17 @@ void VarExp::checkEscapeRef() + + int VarExp::isLvalue() + { +- if (var->storage_class & (STClazy | STCtemp)) ++ if (var->storage_class & (STClazy | STCtemp | STCmanifest)) + return 0; + return 1; + } + + Expression *VarExp::toLvalue(Scope *sc, Expression *e) + { ++ if (var->storage_class & STCmanifest) ++ { error("manifest constant '%s' is not lvalue", var->toChars()); ++ return new ErrorExp(); ++ } + if (var->storage_class & STClazy) + { error("lazy variables cannot be lvalues"); + return new ErrorExp(); +@@ -5114,19 +5896,11 @@ int VarExp::checkModifiable(Scope *sc, i + Expression *VarExp::modifiableLvalue(Scope *sc, Expression *e) + { + //printf("VarExp::modifiableLvalue('%s')\n", var->toChars()); +- //if (type && type->toBasetype()->ty == Tsarray) +- //error("cannot change reference to static array '%s'", var->toChars()); +- +-#if (BUG6652 == 1) +- VarDeclaration *v = var->isVarDeclaration(); +- if (v && (v->storage_class & STCbug6652) && v->type->isMutable()) +- warning("variable modified in foreach body requires ref storage class"); +-#elif (BUG6652 == 2) +- VarDeclaration *v = var->isVarDeclaration(); +- if (v && (v->storage_class & STCbug6652) && v->type->isMutable()) +- deprecation("variable modified in foreach body requires ref storage class"); +-#endif +- ++ if (var->storage_class & STCmanifest) ++ { ++ error("Cannot modify '%s'", toChars()); ++ return new ErrorExp(); ++ } + // See if this expression is a modifiable lvalue (i.e. not const) + return Expression::modifiableLvalue(sc, e); + } +@@ -5135,7 +5909,7 @@ Expression *VarExp::modifiableLvalue(Sco + /******************************** OverExp **************************/ + + #if DMDV2 +-OverExp::OverExp(OverloadSet *s) ++OverExp::OverExp(Loc loc, OverloadSet *s) + : Expression(loc, TOKoverloadset, sizeof(OverExp)) + { + //printf("OverExp(this = %p, '%s')\n", this, var->toChars()); +@@ -5152,47 +5926,60 @@ Expression *OverExp::toLvalue(Scope *sc, + { + return this; + } ++ ++void OverExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs) ++{ ++ buf->writestring(vars->ident->toChars()); ++} ++ + #endif + + + /******************************** TupleExp **************************/ + +-TupleExp::TupleExp(Loc loc, Expressions *exps) ++TupleExp::TupleExp(Loc loc, Expression *e0, Expressions *exps) + : Expression(loc, TOKtuple, sizeof(TupleExp)) + { + //printf("TupleExp(this = %p)\n", this); ++ this->e0 = e0; + this->exps = exps; +- this->type = NULL; + } + ++TupleExp::TupleExp(Loc loc, Expressions *exps) ++ : Expression(loc, TOKtuple, sizeof(TupleExp)) ++{ ++ //printf("TupleExp(this = %p)\n", this); ++ this->e0 = NULL; ++ this->exps = exps; ++} + + TupleExp::TupleExp(Loc loc, TupleDeclaration *tup) + : Expression(loc, TOKtuple, sizeof(TupleExp)) + { +- exps = new Expressions(); +- type = NULL; ++ this->e0 = NULL; ++ this->exps = new Expressions(); + +- exps->reserve(tup->objects->dim); ++ this->exps->reserve(tup->objects->dim); + for (size_t i = 0; i < tup->objects->dim; i++) +- { Object *o = (*tup->objects)[i]; +- if (o->dyncast() == DYNCAST_EXPRESSION) ++ { RootObject *o = (*tup->objects)[i]; ++ if (Dsymbol *s = getDsymbol(o)) + { +- Expression *e = (Expression *)o; +- if (e->op == TOKdsymbol) +- e = e->syntaxCopy(); +- exps->push(e); ++ /* If tuple element represents a symbol, translate to DsymbolExp ++ * to supply implicit 'this' if needed later. ++ */ ++ Expression *e = new DsymbolExp(loc, s); ++ this->exps->push(e); + } +- else if (o->dyncast() == DYNCAST_DSYMBOL) ++ else if (o->dyncast() == DYNCAST_EXPRESSION) + { +- Dsymbol *s = (Dsymbol *)o; +- Expression *e = new DsymbolExp(loc, s); +- exps->push(e); ++ Expression *e = (Expression *)o; ++ this->exps->push(e); + } + else if (o->dyncast() == DYNCAST_TYPE) + { + Type *t = (Type *)o; + Expression *e = new TypeExp(loc, t); +- exps->push(e); ++ this->exps->push(e); + } + else + { +@@ -5201,30 +5988,32 @@ TupleExp::TupleExp(Loc loc, TupleDeclara + } + } + +-int TupleExp::equals(Object *o) ++bool TupleExp::equals(RootObject *o) + { + if (this == o) +- return 1; ++ return true; + if (((Expression *)o)->op == TOKtuple) + { + TupleExp *te = (TupleExp *)o; + if (exps->dim != te->exps->dim) +- return 0; ++ return false; ++ if (e0 && !e0->equals(te->e0) || !e0 && te->e0) ++ return false; + for (size_t i = 0; i < exps->dim; i++) +- { Expression *e1 = (*exps)[i]; ++ { ++ Expression *e1 = (*exps)[i]; + Expression *e2 = (*te->exps)[i]; +- + if (!e1->equals(e2)) +- return 0; ++ return false; + } +- return 1; ++ return true; + } +- return 0; ++ return false; + } + + Expression *TupleExp::syntaxCopy() + { +- return new TupleExp(loc, arraySyntaxCopy(exps)); ++ return new TupleExp(loc, e0 ? e0->syntaxCopy() : NULL, arraySyntaxCopy(exps)); + } + + Expression *TupleExp::semantic(Scope *sc) +@@ -5235,6 +6024,9 @@ Expression *TupleExp::semantic(Scope *sc + if (type) + return this; + ++ if (e0) ++ e0 = e0->semantic(sc); ++ + // Run semantic() on each argument + for (size_t i = 0; i < exps->dim; i++) + { Expression *e = (*exps)[i]; +@@ -5256,9 +6048,20 @@ Expression *TupleExp::semantic(Scope *sc + + void TupleExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { +- buf->writestring("tuple("); +- argsToCBuffer(buf, exps, hgs); +- buf->writeByte(')'); ++ if (e0) ++ { ++ buf->writeByte('('); ++ e0->toCBuffer(buf, hgs); ++ buf->writestring(", tuple("); ++ argsToCBuffer(buf, exps, hgs); ++ buf->writestring("))"); ++ } ++ else ++ { ++ buf->writestring("tuple("); ++ argsToCBuffer(buf, exps, hgs); ++ buf->writeByte(')'); ++ } + } + + +@@ -5280,10 +6083,57 @@ FuncExp::FuncExp(Loc loc, FuncLiteralDec + tok = fd->tok; // save original kind of function/delegate/(infer) + } + ++void FuncExp::genIdent(Scope *sc) ++{ ++ if (fd->ident == Id::empty) ++ { ++ const char *s; ++ if (fd->fes) s = "__foreachbody"; ++ else if (fd->tok == TOKreserved) s = "__lambda"; ++ else if (fd->tok == TOKdelegate) s = "__dgliteral"; ++ else s = "__funcliteral"; ++ ++ DsymbolTable *symtab; ++ if (FuncDeclaration *func = sc->parent->isFuncDeclaration()) ++ { ++ symtab = func->localsymtab; ++ if (symtab) ++ { ++ // Inside template constraint, symtab is not set yet. ++ goto L1; ++ } ++ } ++ else ++ { ++ symtab = sc->parent->isScopeDsymbol()->symtab; ++ L1: ++ assert(symtab); ++ int num = _aaLen(symtab->tab) + 1; ++ Identifier *id = Lexer::uniqueId(s, num); ++ fd->ident = id; ++ if (td) td->ident = id; ++ symtab->insert(td ? (Dsymbol *)td : (Dsymbol *)fd); ++ } ++ } ++} ++ + Expression *FuncExp::syntaxCopy() + { +- TemplateDeclaration *td2 = td ? (TemplateDeclaration *)td->syntaxCopy(NULL) : NULL; +- return new FuncExp(loc, (FuncLiteralDeclaration *)fd->syntaxCopy(NULL), td2); ++ TemplateDeclaration *td2; ++ FuncLiteralDeclaration *fd2; ++ if (td) ++ { ++ td2 = (TemplateDeclaration *)td->syntaxCopy(NULL); ++ assert(td2->members->dim == 1); ++ fd2 = (*td2->members)[0]->isFuncLiteralDeclaration(); ++ assert(fd2); ++ } ++ else ++ { ++ td2 = NULL; ++ fd2 = (FuncLiteralDeclaration *)fd->syntaxCopy(NULL); ++ } ++ return new FuncExp(loc, fd2, td2); + } + + Expression *FuncExp::semantic(Scope *sc) +@@ -5292,6 +6142,11 @@ Expression *FuncExp::semantic(Scope *sc) + printf("FuncExp::semantic(%s)\n", toChars()); + if (fd->treq) printf(" treq = %s\n", fd->treq->toChars()); + #endif ++ Expression *e = this; ++ ++ sc = sc->startCTFE(); // just create new scope ++ sc->flags &= ~SCOPEctfe; // temporary stop CTFE ++ + if (!type || type == Type::tvoid) + { + /* fd->treq might be incomplete type, +@@ -5302,6 +6157,8 @@ Expression *FuncExp::semantic(Scope *sc) + //if (fd->treq) + // fd->treq = fd->treq->semantic(loc, sc); + ++ genIdent(sc); ++ + // Set target of return type inference + if (fd->treq && !fd->type->nextOf()) + { TypeFunction *tfv = NULL; +@@ -5321,10 +6178,9 @@ Expression *FuncExp::semantic(Scope *sc) + td->semantic(sc); + type = Type::tvoid; // temporary type + +- if (!fd->treq) // defer type determination +- return this; +- +- return inferType(fd->treq); ++ if (fd->treq) // defer type determination ++ e = inferType(fd->treq); ++ goto Ldone; + } + + unsigned olderrors = global.errors; +@@ -5345,8 +6201,12 @@ Expression *FuncExp::semantic(Scope *sc) + } + + // need to infer return type +- if ((olderrors != global.errors) && fd->type && fd->type->ty == Tfunction && !fd->type->nextOf()) +- ((TypeFunction *)fd->type)->next = Type::terror; ++ if (olderrors != global.errors) ++ { ++ if (fd->type && fd->type->ty == Tfunction && !fd->type->nextOf()) ++ ((TypeFunction *)fd->type)->next = Type::terror; ++ return new ErrorExp(); ++ } + + // Type is a "delegate to" or "pointer to" the function literal + if ((fd->isNested() && fd->tok == TOKdelegate) || +@@ -5379,7 +6239,10 @@ Expression *FuncExp::semantic(Scope *sc) + } + fd->tookAddressOf++; + } +- return this; ++Ldone: ++ sc->flags |= SCOPEctfe; ++ sc = sc->endCTFE(); ++ return e; + } + + // used from CallExp::semantic() +@@ -5393,6 +6256,8 @@ Expression *FuncExp::semantic(Scope *sc, + return checkarg; + } + ++ genIdent(sc); ++ + assert(td->parameters && td->parameters->dim); + td->semantic(sc); + +@@ -5507,7 +6372,7 @@ Expression *DeclarationExp::semantic(Sco + return new ErrorExp(); + } + else if (sc->func) +- { VarDeclaration *v = s->isVarDeclaration(); ++ { + if ( (s->isFuncDeclaration() || s->isTypedefDeclaration() || + s->isAggregateDeclaration() || s->isEnumDeclaration() || + s->isInterfaceDeclaration()) && +@@ -5571,7 +6436,7 @@ void DeclarationExp::toCBuffer(OutBuffer + * typeid(int) + */ + +-TypeidExp::TypeidExp(Loc loc, Object *o) ++TypeidExp::TypeidExp(Loc loc, RootObject *o) + : Expression(loc, TOKtypeid, sizeof(TypeidExp)) + { + this->obj = o; +@@ -5598,7 +6463,7 @@ Expression *TypeidExp::semantic(Scope *s + + if (ta) + { +- ta->resolve(loc, sc, &ea, &ta, &sa); ++ ta->resolve(loc, sc, &ea, &ta, &sa, true); + } + + if (ea) +@@ -5676,8 +6541,8 @@ void TraitsExp::toCBuffer(OutBuffer *buf + { + for (size_t i = 0; i < args->dim; i++) + { +- buf->writeByte(','); +- Object *oarg = (*args)[i]; ++ buf->writestring(", ");; ++ RootObject *oarg = (*args)[i]; + ObjectToCBuffer(buf, hgs, oarg); + } + } +@@ -5709,8 +6574,8 @@ void HaltExp::toCBuffer(OutBuffer *buf, + + /************************************************************/ + +-IsExp::IsExp(Loc loc, Type *targ, Identifier *id, enum TOK tok, +- Type *tspec, enum TOK tok2, TemplateParameters *parameters) ++IsExp::IsExp(Loc loc, Type *targ, Identifier *id, TOK tok, ++ Type *tspec, TOK tok2, TemplateParameters *parameters) + : Expression(loc, TOKis, sizeof(IsExp)) + { + this->targ = targ; +@@ -5810,8 +6675,6 @@ Expression *IsExp::semantic(Scope *sc) + tded = targ; + break; + +- case TOKinvariant: +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); + case TOKimmutable: + if (!targ->isImmutable()) + goto Lno; +@@ -5839,6 +6702,8 @@ Expression *IsExp::semantic(Scope *sc) + { ClassDeclaration *cd = ((TypeClass *)targ)->sym; + Parameters *args = new Parameters; + args->reserve(cd->baseclasses->dim); ++ if (cd->scope && !cd->symtab) ++ cd->semantic(cd->scope); + for (size_t i = 0; i < cd->baseclasses->dim; i++) + { BaseClass *b = (*cd->baseclasses)[i]; + args->push(new Parameter(STCin, b->type, NULL, NULL)); +@@ -5924,21 +6789,51 @@ Expression *IsExp::semantic(Scope *sc) + } + goto Lyes; + } +- else if (id && tspec) ++ else if (tspec && !id && !(parameters && parameters->dim)) ++ { ++ /* Evaluate to TRUE if targ matches tspec ++ * is(targ == tspec) ++ * is(targ : tspec) ++ */ ++ tspec = tspec->semantic(loc, sc); ++ //printf("targ = %s, %s\n", targ->toChars(), targ->deco); ++ //printf("tspec = %s, %s\n", tspec->toChars(), tspec->deco); ++ if (tok == TOKcolon) ++ { if (targ->implicitConvTo(tspec)) ++ goto Lyes; ++ else ++ goto Lno; ++ } ++ else /* == */ ++ { if (targ->equals(tspec)) ++ goto Lyes; ++ else ++ goto Lno; ++ } ++ } ++ else if (tspec) + { + /* Evaluate to TRUE if targ matches tspec. + * If TRUE, declare id as an alias for the specialized type. ++ * is(targ == tspec, tpl) ++ * is(targ : tspec, tpl) ++ * is(targ id == tspec) ++ * is(targ id : tspec) ++ * is(targ id == tspec, tpl) ++ * is(targ id : tspec, tpl) + */ + +- assert(parameters && parameters->dim); ++ Identifier *tid = id ? id : Lexer::uniqueId("__isexp_id"); ++ TemplateParameter *tp = new TemplateTypeParameter(loc, tid, NULL, NULL); ++ parameters->insert(0, tp); + + Objects dedtypes; + dedtypes.setDim(parameters->dim); + dedtypes.zero(); + + MATCH m = targ->deduceType(sc, tspec, parameters, &dedtypes); +-//printf("targ: %s\n", targ->toChars()); +-//printf("tspec: %s\n", tspec->toChars()); ++ //printf("targ: %s\n", targ->toChars()); ++ //printf("tspec: %s\n", tspec->toChars()); + if (m == MATCHnomatch || + (m != MATCHexact && tok == TOKequal)) + { +@@ -5960,7 +6855,7 @@ Expression *IsExp::semantic(Scope *sc) + { TemplateParameter *tp = (*parameters)[i]; + Declaration *s = NULL; + +- m = tp->matchArg(sc, &tiargs, i, parameters, &dedtypes, &s); ++ m = tp->matchArg(loc, sc, &tiargs, i, parameters, &dedtypes, &s); + if (m == MATCHnomatch) + goto Lno; + s->semantic(sc); +@@ -5976,32 +6871,11 @@ Expression *IsExp::semantic(Scope *sc) + else if (id) + { + /* Declare id as an alias for type targ. Evaluate to TRUE ++ * is(targ id) + */ + tded = targ; + goto Lyes; + } +- else if (tspec) +- { +- /* Evaluate to TRUE if targ matches tspec +- * is(targ == tspec) +- * is(targ : tspec) +- */ +- tspec = tspec->semantic(loc, sc); +- //printf("targ = %s, %s\n", targ->toChars(), targ->deco); +- //printf("tspec = %s, %s\n", tspec->toChars(), tspec->deco); +- if (tok == TOKcolon) +- { if (targ->implicitConvTo(tspec)) +- goto Lyes; +- else +- goto Lno; +- } +- else /* == */ +- { if (targ->equals(tspec)) +- goto Lyes; +- else +- goto Lno; +- } +- } + + Lyes: + if (id) +@@ -6047,10 +6921,10 @@ void IsExp::toCBuffer(OutBuffer *buf, Hd + } + #if DMDV2 + if (parameters) +- { // First parameter is already output, so start with second +- for (size_t i = 1; i < parameters->dim; i++) ++ { ++ for (size_t i = 0; i < parameters->dim; i++) + { +- buf->writeByte(','); ++ buf->writestring(", "); + TemplateParameter *tp = (*parameters)[i]; + tp->toCBuffer(buf, hgs); + } +@@ -6062,10 +6936,11 @@ void IsExp::toCBuffer(OutBuffer *buf, Hd + + /************************************************************/ + +-UnaExp::UnaExp(Loc loc, enum TOK op, int size, Expression *e1) ++UnaExp::UnaExp(Loc loc, TOK op, int size, Expression *e1) + : Expression(loc, op, size) + { + this->e1 = e1; ++ this->att1 = NULL; + } + + Expression *UnaExp::syntaxCopy() +@@ -6101,11 +6976,14 @@ void UnaExp::toCBuffer(OutBuffer *buf, H + + /************************************************************/ + +-BinExp::BinExp(Loc loc, enum TOK op, int size, Expression *e1, Expression *e2) ++BinExp::BinExp(Loc loc, TOK op, int size, Expression *e1, Expression *e2) + : Expression(loc, op, size) + { + this->e1 = e1; + this->e2 = e2; ++ ++ this->att1 = NULL; ++ this->att2 = NULL; + } + + Expression *BinExp::syntaxCopy() +@@ -6262,7 +7140,7 @@ void BinExp::toCBuffer(OutBuffer *buf, H + buf->writeByte(' '); + buf->writestring(Token::toChars(op)); + buf->writeByte(' '); +- expToCBuffer(buf, hgs, e2, (enum PREC)(precedence[op] + 1)); ++ expToCBuffer(buf, hgs, e2, (PREC)(precedence[op] + 1)); + } + + int BinExp::isunsigned() +@@ -6313,8 +7191,7 @@ Expression *BinAssignExp::semantic(Scope + e = e->semantic(sc); + return e; + } +- +- if (e1->op == TOKslice) ++ else if (e1->op == TOKslice) + { + // T[] op= ... + e = typeCombine(sc); +@@ -6324,8 +7201,9 @@ Expression *BinAssignExp::semantic(Scope + return arrayOp(sc); + } + +- e1 = e1->modifiableLvalue(sc, e1); + e1 = e1->semantic(sc); ++ e1 = e1->optimize(WANTvalue); ++ e1 = e1->modifiableLvalue(sc, e1); + type = e1->type; + checkScalar(); + +@@ -6380,7 +7258,8 @@ Expression *BinAssignExp::semantic(Scope + if (e1->op == TOKerror || e2->op == TOKerror) + return new ErrorExp(); + +- return checkComplexOpAssign(sc); ++ checkComplexOpAssign(sc); ++ return reorderSettingAAElem(sc); + } + + #if DMDV2 +@@ -6447,8 +7326,10 @@ Expression *CompileExp::semantic(Scope * + #if LOGSEMANTIC + printf("CompileExp::semantic('%s')\n", toChars()); + #endif +- UnaExp::semantic(sc); ++ sc = sc->startCTFE(); ++ e1 = e1->semantic(sc); + e1 = resolveProperties(sc, e1); ++ sc = sc->endCTFE(); + if (e1->op == TOKerror) + return e1; + if (!e1->type->isString()) +@@ -6463,11 +7344,14 @@ Expression *CompileExp::semantic(Scope * + return new ErrorExp(); + } + se = se->toUTF8(sc); +- Parser p(sc->module, (unsigned char *)se->string, se->len, 0); +- p.loc = loc; ++ Parser p(sc->module, (utf8_t *)se->string, se->len, 0); ++ p.scanloc = loc; + p.nextToken(); + //printf("p.loc.linnum = %d\n", p.loc.linnum); ++ unsigned errors = global.errors; + Expression *e = p.parseExpression(); ++ if (global.errors != errors) ++ return new ErrorExp(); + if (p.token.value != TOKeof) + { error("incomplete mixin expression (%s)", se->toChars()); + return new ErrorExp(); +@@ -6497,8 +7381,10 @@ Expression *FileExp::semantic(Scope *sc) + #if LOGSEMANTIC + printf("FileExp::semantic('%s')\n", toChars()); + #endif +- UnaExp::semantic(sc); ++ sc = sc->startCTFE(); ++ e1 = e1->semantic(sc); + e1 = resolveProperties(sc, e1); ++ sc = sc->endCTFE(); + e1 = e1->ctfeInterpret(); + if (e1->op != TOKstring) + { error("file name argument must be a string, not (%s)", e1->toChars()); +@@ -6525,7 +7411,23 @@ Expression *FileExp::semantic(Scope *sc) + } + + if (global.params.verbose) +- fprintf(stdmsg, "file %s\t(%s)\n", (char *)se->string, name); ++ fprintf(global.stdmsg, "file %s\t(%s)\n", (char *)se->string, name); ++ if (global.params.moduleDeps != NULL && global.params.moduleDepsFile == NULL) ++ { ++ OutBuffer *ob = global.params.moduleDeps; ++ Module* imod = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ ++ ob->writestring("depsFile "); ++ ob->writestring(imod->toPrettyChars()); ++ ob->writestring(" ("); ++ escapePath(ob, imod->srcfile->toChars()); ++ ob->writestring(") : "); ++ ob->writestring((char *) se->string); ++ ob->writestring(" ("); ++ escapePath(ob, name); ++ ob->writestring(")"); ++ ob->writenl(); ++ } + + { File f(name); + if (f.read()) +@@ -6606,7 +7508,7 @@ void AssertExp::toCBuffer(OutBuffer *buf + expToCBuffer(buf, hgs, e1, PREC_assign); + if (msg) + { +- buf->writeByte(','); ++ buf->writestring(", "); + expToCBuffer(buf, hgs, msg, PREC_assign); + } + buf->writeByte(')'); +@@ -6622,95 +7524,76 @@ DotIdExp::DotIdExp(Loc loc, Expression * + + Expression *DotIdExp::semantic(Scope *sc) + { +- // Indicate we need to resolve by UFCS. +- return semantic(sc, 0); +-} +- +-Expression *DotIdExp::semantic(Scope *sc, int flag) +-{ Expression *e; +- Expression *eleft; +- Expression *eright; +- + #if LOGSEMANTIC + printf("DotIdExp::semantic(this = %p, '%s')\n", this, toChars()); + //printf("e1->op = %d, '%s'\n", e1->op, Token::toChars(e1->op)); + #endif +- +-//{ static int z; fflush(stdout); if (++z == 10) *(char*)0=0; } +- +- /* Special case: rewrite this.id and super.id +- * to be classtype.id and baseclasstype.id +- * if we have no this pointer. +- */ +- if ((e1->op == TOKthis || e1->op == TOKsuper) && !hasThis(sc)) +- { ClassDeclaration *cd; +- StructDeclaration *sd; +- AggregateDeclaration *ad; +- +- ad = sc->getStructClassScope(); +- if (ad) +- { +- cd = ad->isClassDeclaration(); +- if (cd) +- { +- if (e1->op == TOKthis) +- { +- e = typeDotIdExp(loc, cd->type, ident); +- return e->semantic(sc); +- } +- else if (cd->baseClass && e1->op == TOKsuper) +- { +- e = typeDotIdExp(loc, cd->baseClass->type, ident); +- return e->semantic(sc); +- } +- } +- else +- { +- sd = ad->isStructDeclaration(); +- if (sd) +- { +- if (e1->op == TOKthis) +- { +- e = typeDotIdExp(loc, sd->type, ident); +- return e->semantic(sc); +- } +- } +- } +- } ++ Expression *e = semanticY(sc, 1); ++ if (e && isDotOpDispatch(e)) ++ { ++ unsigned errors = global.startGagging(); ++ e = resolvePropertiesX(sc, e); ++ if (global.endGagging(errors)) ++ e = NULL; /* fall down to UFCS */ ++ else ++ return e; + } ++ if (!e) // if failed to find the property ++ { ++ /* If ident is not a valid property, rewrite: ++ * e1.ident ++ * as: ++ * .ident(e1) ++ */ ++ e = resolveUFCSProperties(sc, this); ++ } ++ return e; ++} + +-// Type *t1save = e1->type; ++// Run sematnic in e1 ++Expression *DotIdExp::semanticX(Scope *sc) ++{ ++ //printf("DotIdExp::semanticX(this = %p, '%s')\n", this, toChars()); ++ Expression *e; + + UnaExp::semantic(sc); ++ if (e1->op == TOKerror) ++ return e1; + + if (ident == Id::mangleof) + { // symbol.mangleof + Dsymbol *ds; + switch (e1->op) + { +- case TOKimport: ds = ((ScopeExp *)e1)->sds; goto L1; +- case TOKvar: ds = ((VarExp *)e1)->var; goto L1; +- case TOKdotvar: ds = ((DotVarExp *)e1)->var; goto L1; +- default: break; +- L1: +- char* s = ds->mangle(); +- e = new StringExp(loc, s, strlen(s), 'c'); ++ case TOKimport: ++ ds = ((ScopeExp *)e1)->sds; ++ goto L1; ++ case TOKvar: ++ ds = ((VarExp *)e1)->var; ++ goto L1; ++ case TOKdotvar: ++ ds = ((DotVarExp *)e1)->var; ++ goto L1; ++ case TOKoverloadset: ++ ds = ((OverExp *)e1)->vars; ++ L1: ++ { ++ const char* s = ds->mangle(); ++ e = new StringExp(loc, (void*)s, strlen(s), 'c'); + e = e->semantic(sc); + return e; ++ } ++ default: ++ break; + } + } + + if (e1->op == TOKdotexp) + { +- DotExp *de = (DotExp *)e1; +- eleft = de->e1; +- eright = de->e2; + } + else + { +- e1 = resolveProperties(sc, e1); +- eleft = NULL; +- eright = e1; ++ e1 = resolvePropertiesX(sc, e1); + } + #if DMDV2 + if (e1->op == TOKtuple && ident == Id::offsetof) +@@ -6725,7 +7608,8 @@ Expression *DotIdExp::semantic(Scope *sc + e = new DotIdExp(e->loc, e, Id::offsetof); + (*exps)[i] = e; + } +- e = new TupleExp(loc, exps); ++ // Don't evaluate te->e0 in runtime ++ e = new TupleExp(loc, /*te->e0*/NULL, exps); + e = e->semantic(sc); + return e; + } +@@ -6734,6 +7618,7 @@ Expression *DotIdExp::semantic(Scope *sc + if (e1->op == TOKtuple && ident == Id::length) + { + TupleExp *te = (TupleExp *)e1; ++ // Don't evaluate te->e0 in runtime + e = new IntegerExp(loc, te->exps->dim, Type::tsize_t); + return e; + } +@@ -6750,6 +7635,56 @@ Expression *DotIdExp::semantic(Scope *sc + return new ErrorExp(); + } + ++ return this; ++} ++ ++// Resolve e1.ident without seeing UFCS. ++// If flag == 1, stop "not a property" error and return NULL. ++Expression *DotIdExp::semanticY(Scope *sc, int flag) ++{ ++ //printf("DotIdExp::semanticY(this = %p, '%s')\n", this, toChars()); ++ ++//{ static int z; fflush(stdout); if (++z == 10) *(char*)0=0; } ++ ++ /* Special case: rewrite this.id and super.id ++ * to be classtype.id and baseclasstype.id ++ * if we have no this pointer. ++ */ ++ if ((e1->op == TOKthis || e1->op == TOKsuper) && !hasThis(sc)) ++ { ++ if (AggregateDeclaration *ad = sc->getStructClassScope()) ++ { ++ if (e1->op == TOKthis) ++ { ++ e1 = new TypeExp(e1->loc, ad->type); ++ } ++ else ++ { ++ ClassDeclaration *cd = ad->isClassDeclaration(); ++ if (cd && cd->baseClass) ++ e1 = new TypeExp(e1->loc, cd->baseClass->type); ++ } ++ } ++ } ++ ++ Expression *e = semanticX(sc); ++ if (e != this) ++ return e; ++ ++ Expression *eleft; ++ Expression *eright; ++ if (e1->op == TOKdotexp) ++ { ++ DotExp *de = (DotExp *)e1; ++ eleft = de->e1; ++ eright = de->e2; ++ } ++ else ++ { ++ eleft = NULL; ++ eright = e1; ++ } ++ + Type *t1b = e1->type->toBasetype(); + + if (eright->op == TOKimport) // also used for template alias's +@@ -6768,7 +7703,7 @@ Expression *DotIdExp::semantic(Scope *sc + * aliases to private symbols are public. + */ + if (Declaration *d = s->isDeclaration()) +- accessCheck(loc, sc, 0, d); ++ accessCheck(loc, sc, NULL, d); + + s = s->toAlias(); + checkDeprecated(sc, s); +@@ -6776,9 +7711,7 @@ Expression *DotIdExp::semantic(Scope *sc + EnumMember *em = s->isEnumMember(); + if (em) + { +- e = em->value; +- e = e->semantic(sc); +- return e; ++ return em->getVarExp(loc, sc); + } + + VarDeclaration *v = s->isVarDeclaration(); +@@ -6814,6 +7747,8 @@ Expression *DotIdExp::semantic(Scope *sc + if (f) + { + //printf("it's a function\n"); ++ if (!f->functionSemantic()) ++ return new ErrorExp(); + if (f->needThis()) + { + if (!eleft) +@@ -6835,7 +7770,7 @@ Expression *DotIdExp::semantic(Scope *sc + OverloadSet *o = s->isOverloadSet(); + if (o) + { //printf("'%s' is an overload set\n", o->toChars()); +- return new OverExp(o); ++ return new OverExp(loc, o); + } + #endif + +@@ -6860,7 +7795,7 @@ Expression *DotIdExp::semantic(Scope *sc + ScopeDsymbol *sds = s->isScopeDsymbol(); + if (sds) + { +- //printf("it's a ScopeDsymbol\n"); ++ //printf("it's a ScopeDsymbol %s\n", ident->toChars()); + e = new ScopeExp(loc, sds); + e = e->semantic(sc); + if (eleft) +@@ -6889,6 +7824,14 @@ Expression *DotIdExp::semantic(Scope *sc + e = e->semantic(sc); + return e; + } ++ if (ie->sds->isPackage() || ++ ie->sds->isImport() || ++ ie->sds->isModule()) ++ { ++ flag = 0; ++ } ++ if (flag) ++ return NULL; + s = ie->sds->search_correct(ident); + if (s) + error("undefined identifier '%s', did you mean '%s %s'?", +@@ -6906,68 +7849,19 @@ Expression *DotIdExp::semantic(Scope *sc + * as: + * (*p).ident + */ ++ if (flag && t1b->nextOf()->ty == Tvoid) ++ return NULL; + e = new PtrExp(loc, e1); +- e->type = ((TypePointer *)t1b)->next; +- return e->type->dotExp(sc, e, ident); +- } +-#if DMDV2 +- else if (!flag) +- { /* If ident is not a valid property, rewrite: +- * e1.ident +- * as: +- * .ident(e1) +- */ +- if (e1->op == TOKtype || +- t1b->ty == Tvoid || +- (t1b->ty == Tarray || t1b->ty == Tsarray || t1b->ty == Taarray) && +- (ident == Id::sort || ident == Id::reverse || ident == Id::dup || ident == Id::idup)) +- { goto L2; +- } +- +- /* This would be much better if we added a "hasProperty" method to types, +- * i.e. the gagging is a bad way. +- */ +- +- if (t1b->ty == Taarray) +- { +- TypeAArray *taa = (TypeAArray *)t1b; +- if (!taa->impl && +- ident != Id::__sizeof && +- ident != Id::__xalignof && +- ident != Id::init && +- ident != Id::mangleof && +- ident != Id::stringof && +- ident != Id::offsetof) +- { +- // Find out about these errors when not gagged +- taa->getImpl(); +- } +- } +- +- Type *t1 = e1->type; +- unsigned errors = global.startGagging(); +- e = t1->dotExp(sc, e1, ident); +- if (global.endGagging(errors)) // if failed to find the property +- { +- e1->type = t1; // kludge to restore type +- errors = global.startGagging(); +- e = resolveUFCSProperties(sc, this); +- if (global.endGagging(errors)) +- { +- // both lookups failed, lookup property again for better error message +- e1->type = t1; // restore type +- e = t1->dotExp(sc, e1, ident); +- } +- } + e = e->semantic(sc); +- return e; ++ return e->type->dotExp(sc, e, ident, flag); + } +-#endif + else + { +- L2: +- e = e1->type->dotExp(sc, e1, ident); +- e = e->semantic(sc); ++ if (e1->op == TOKtype || e1->op == TOKtemplate) ++ flag = 0; ++ e = e1->type->dotExp(sc, e1, ident, flag); ++ if (!flag || e) ++ e = e->semantic(sc); + return e; + } + } +@@ -7001,7 +7895,7 @@ void DotTemplateExp::toCBuffer(OutBuffer + + /************************************************************/ + +-DotVarExp::DotVarExp(Loc loc, Expression *e, Declaration *v, int hasOverloads) ++DotVarExp::DotVarExp(Loc loc, Expression *e, Declaration *v, bool hasOverloads) + : UnaExp(loc, TOKdotvar, sizeof(DotVarExp), e) + { + //printf("DotVarExp()\n"); +@@ -7025,12 +7919,27 @@ Expression *DotVarExp::semantic(Scope *s + * with: + * tuple(e1.a, e1.b, e1.c) + */ ++ e1 = e1->semantic(sc); + Expressions *exps = new Expressions; ++ Expression *e0 = NULL; + Expression *ev = e1; ++ if (sc->func && e1->hasSideEffect()) ++ { ++ Identifier *id = Lexer::uniqueId("__tup"); ++ ExpInitializer *ei = new ExpInitializer(e1->loc, e1); ++ VarDeclaration *v = new VarDeclaration(e1->loc, NULL, id, ei); ++ v->storage_class |= STCctfe; ++ if (e1->isLvalue()) ++ v->storage_class |= STCref | STCforeach; ++ e0 = new DeclarationExp(e1->loc, v); ++ ev = new VarExp(e1->loc, v); ++ e0 = e0->semantic(sc); ++ ev = ev->semantic(sc); ++ } + + exps->reserve(tup->objects->dim); + for (size_t i = 0; i < tup->objects->dim; i++) +- { Object *o = (*tup->objects)[i]; ++ { RootObject *o = (*tup->objects)[i]; + Expression *e; + if (o->dyncast() == DYNCAST_EXPRESSION) + { +@@ -7038,20 +7947,7 @@ Expression *DotVarExp::semantic(Scope *s + if (e->op == TOKdsymbol) + { + Dsymbol *s = ((DsymbolExp *)e)->s; +- if (i == 0 && sc->func && tup->objects->dim > 1 && +- e1->hasSideEffect()) +- { +- Identifier *id = Lexer::uniqueId("__tup"); +- ExpInitializer *ei = new ExpInitializer(e1->loc, e1); +- VarDeclaration *v = new VarDeclaration(e1->loc, NULL, id, ei); +- v->storage_class |= STCctfe | STCref | STCforeach; +- +- ev = new VarExp(e->loc, v); +- e = new CommaExp(e1->loc, new DeclarationExp(e1->loc, v), ev); +- e = new DotVarExp(loc, e, s->isDeclaration()); +- } +- else +- e = new DotVarExp(loc, ev, s->isDeclaration()); ++ e = new DotVarExp(loc, ev, s->isDeclaration()); + } + } + else if (o->dyncast() == DYNCAST_DSYMBOL) +@@ -7069,7 +7965,7 @@ Expression *DotVarExp::semantic(Scope *s + } + exps->push(e); + } +- Expression *e = new TupleExp(loc, exps); ++ Expression *e = new TupleExp(loc, e0, exps); + e = e->semantic(sc); + return e; + } +@@ -7105,13 +8001,25 @@ Expression *DotVarExp::semantic(Scope *s + Dsymbol *vparent = var->toParent(); + AggregateDeclaration *ad = vparent ? vparent->isAggregateDeclaration() : NULL; + e1 = getRightThis(loc, sc, ad, e1, var); +- if (!sc->noaccesscheck) +- accessCheck(loc, sc, e1, var); ++ accessCheck(loc, sc, e1, var); + + VarDeclaration *v = var->isVarDeclaration(); +- Expression *e = expandVar(WANTvalue, v); +- if (e) ++ if (!PULL93 || v && (v->isDataseg() || (v->storage_class & STCmanifest))) ++ { ++ Expression *e = expandVar(WANTvalue, v); ++ if (e) ++ return e; ++ } ++ ++ if (v && v->isDataseg()) // fix bugzilla 8238 ++ { ++ // (e1, v) ++ accessCheck(loc, sc, e1, v); ++ VarExp *ve = new VarExp(loc, v); ++ Expression *e = new CommaExp(loc, e1, ve); ++ e = e->semantic(sc); + return e; ++ } + } + Dsymbol *s; + if (sc->func && !sc->intypeof && t1->hasPointers() && +@@ -7160,15 +8068,49 @@ int modifyFieldVar(Loc loc, Scope *sc, V + if (s) + fd = s->isFuncDeclaration(); + if (fd && +- ((fd->isCtorDeclaration() && var->storage_class & STCfield) || +- (fd->isStaticCtorDeclaration() && !(var->storage_class & STCfield))) && ++ ((fd->isCtorDeclaration() && var->isField()) || ++ (fd->isStaticCtorDeclaration() && !var->isField())) && + fd->toParent2() == var->toParent2() && + (!e1 || e1->op == TOKthis) + ) + { + var->ctorinit = 1; + //printf("setting ctorinit\n"); +- return TRUE; ++ int result = TRUE; ++ if (var->isField() && sc->fieldinit && !sc->intypeof) ++ { ++ assert(e1); ++ bool mustInit = (var->storage_class & STCnodefaultctor || ++ var->type->needsNested()); ++ ++ size_t dim = sc->fieldinit_dim; ++ AggregateDeclaration *ad = fd->isAggregateMember2(); ++ assert(ad); ++ size_t i; ++ for (i = 0; i < dim; i++) // same as findFieldIndexByName in ctfeexp.c ? ++ { ++ if (ad->fields[i] == var) ++ break; ++ } ++ assert(i < dim); ++ unsigned fi = sc->fieldinit[i]; ++ if (fi & CSXthis_ctor) ++ { ++ if (var->type->isMutable() && e1->type->isMutable()) ++ result = FALSE; ++ else ++ ::error(loc, "multiple field %s initialization", var->toChars()); ++ } ++ else if (sc->noctor || fi & CSXlabel) ++ { ++ if (!mustInit && var->type->isMutable() && e1->type->isMutable()) ++ result = FALSE; ++ else ++ ::error(loc, "field %s initializing not allowed in loops or after labels", var->toChars()); ++ } ++ sc->fieldinit[i] |= CSXthis_ctor; ++ } ++ return result; + } + else + { +@@ -7233,89 +8175,127 @@ Expression *DotTemplateInstanceExp::synt + return de; + } + +-TemplateDeclaration *DotTemplateInstanceExp::getTempdecl(Scope *sc) ++bool DotTemplateInstanceExp::findTempDecl(Scope *sc) + { + #if LOGSEMANTIC +- printf("DotTemplateInstanceExp::getTempdecl('%s')\n", toChars()); ++ printf("DotTemplateInstanceExp::findTempDecl('%s')\n", toChars()); + #endif +- if (!ti->tempdecl) ++ if (ti->tempdecl) ++ return true; ++ ++ Expression *e = new DotIdExp(loc, e1, ti->name); ++ e = e->semantic(sc); ++ if (e->op == TOKdotexp) ++ e = ((DotExp *)e)->e2; ++ ++ Dsymbol *s = NULL; ++ switch (e->op) + { +- Expression *e = new DotIdExp(loc, e1, ti->name); +- e = e->semantic(sc); +- if (e->op == TOKdottd) +- { +- DotTemplateExp *dte = (DotTemplateExp *)e; +- ti->tempdecl = dte->td; +- } +- else if (e->op == TOKimport) +- { ScopeExp *se = (ScopeExp *)e; +- ti->tempdecl = se->sds->isTemplateDeclaration(); +- } ++ case TOKoverloadset: s = ((OverExp *)e)->vars; break; ++ case TOKdottd: s = ((DotTemplateExp *)e)->td; break; ++ case TOKimport: s = ((ScopeExp *)e)->sds; break; ++ case TOKdotvar: s = ((DotVarExp *)e)->var; break; ++ case TOKvar: s = ((VarExp *)e)->var; break; ++ default: return false; + } +- return ti->tempdecl; ++ return ti->updateTemplateDeclaration(sc, s); + } + + Expression *DotTemplateInstanceExp::semantic(Scope *sc) + { ++#if LOGSEMANTIC ++ printf("DotTemplateInstanceExp::semantic('%s')\n", toChars()); ++#endif ++ + // Indicate we need to resolve by UFCS. +- return semantic(sc, 0); ++ Expression *e = semanticY(sc, 1); ++ if (!e) ++ e = resolveUFCSProperties(sc, this); ++ return e; + } +-Expression *DotTemplateInstanceExp::semantic(Scope *sc, int flag) ++ ++// Resolve e1.ident!tiargs without seeing UFCS. ++// If flag == 1, stop "not a property" error and return NULL. ++Expression *DotTemplateInstanceExp::semanticY(Scope *sc, int flag) + { + #if LOGSEMANTIC +- printf("DotTemplateInstanceExp::semantic('%s')\n", toChars()); ++ printf("DotTemplateInstanceExpY::semantic('%s')\n", toChars()); + #endif + +- UnaExp::semantic(sc); +- if (e1->op == TOKerror) +- return e1; +- +- Expression *e; + DotIdExp *die = new DotIdExp(loc, e1, ti->name); + +- if (flag || !e1->type || e1->op == TOKtype || +- (e1->op == TOKimport && ((ScopeExp *)e1)->sds->isModule())) +- { +- e = die->semantic(sc, 1); +- } +- else ++ Expression *e = die->semanticX(sc); ++ if (e == die) + { ++ e1 = die->e1; // take back ++ + Type *t1b = e1->type->toBasetype(); + if (t1b->ty == Tarray || t1b->ty == Tsarray || t1b->ty == Taarray || + t1b->ty == Tnull || (t1b->isTypeBasic() && t1b->ty != Tvoid)) + { +- /* No built-in type has templatized property, so can short cut. ++ /* No built-in type has templatized properties, so do shortcut. ++ * It is necessary in: 1024.max!"a < b" + */ +- return resolveUFCSProperties(sc, this); ++ if (flag) ++ return NULL; + } +- +- unsigned errors = global.startGagging(); +- e = die->semantic(sc, 1); +- Type *t = e1->type; +- if (global.endGagging(errors)) ++ e = die->semanticY(sc, flag); ++ if (flag && e && isDotOpDispatch(e)) + { +- errors = global.startGagging(); +- e = resolveUFCSProperties(sc, this); +- if (!global.endGagging(errors)) +- return e; +- +- // both lookups failed, lookup property again for better error message +- e->type = t; // restore type +- e = die->semantic(sc, 1); ++ /* opDispatch!tiargs would be a function template that needs IFTI, ++ * so it's not a template ++ */ ++ e = NULL; /* fall down to UFCS */ + } ++ if (flag && !e) ++ return NULL; + } ++ assert(e); + + L1: + if (e->op == TOKerror) + return e; ++ if (e->op == TOKdotvar) ++ { ++ DotVarExp *dve = (DotVarExp *)e; ++ FuncDeclaration *f = dve->var->isFuncDeclaration(); ++ if (f) ++ { ++ TemplateDeclaration *td = f->findTemplateDeclRoot(); ++ if (td) ++ { ++ e = new DotTemplateExp(dve->loc, dve->e1, td); ++ e = e->semantic(sc); ++ } ++ } ++ } ++ else if (e->op == TOKvar) ++ { ++ VarExp *ve = (VarExp *)e; ++ FuncDeclaration *f = ve->var->isFuncDeclaration(); ++ if (f) ++ { ++ TemplateDeclaration *td = f->findTemplateDeclRoot(); ++ if (td) ++ { ++ e = new ScopeExp(ve->loc, td); ++ e = e->semantic(sc); ++ } ++ } ++ } + if (e->op == TOKdottd) + { + if (ti->errors) + return new ErrorExp(); + DotTemplateExp *dte = (DotTemplateExp *)e; +- TemplateDeclaration *td = dte->td; + Expression *eleft = dte->e1; +- ti->tempdecl = td; ++ ti->tempdecl = dte->td; ++ if (!ti->semanticTiargs(sc)) ++ { ++ ti->inst = ti; ++ ti->inst->errors = true; ++ return new ErrorExp(); ++ } + if (ti->needsTypeInference(sc)) + { + e1 = eleft; // save result of semantic() +@@ -7327,7 +8307,7 @@ L1: + return new ErrorExp(); + Dsymbol *s = ti->inst->toAlias(); + Declaration *v = s->isDeclaration(); +- if (v) ++ if (v && (v->isFuncDeclaration() || v->isVarDeclaration())) + { + /* Fix for Bugzilla 4003 + * The problem is a class template member function v returning a reference to the same +@@ -7352,6 +8332,12 @@ L1: + e = e->semantic(sc); + return e; + } ++ if (eleft->op == TOKtype) ++ { ++ e = new DsymbolExp(loc, s); ++ e = e->semantic(sc); ++ return e; ++ } + e = new ScopeExp(loc, ti); + e = new DotExp(loc, eleft, e); + e = e->semantic(sc); +@@ -7371,9 +8357,39 @@ L1: + } + else if (e->op == TOKdotexp) + { DotExp *de = (DotExp *)e; ++ Expression *eleft = de->e1; + + if (de->e2->op == TOKoverloadset) + { ++ if (!findTempDecl(sc) || ++ !ti->semanticTiargs(sc)) ++ { ++ ti->inst = ti; ++ ti->inst->errors = true; ++ return new ErrorExp(); ++ } ++ if (ti->needsTypeInference(sc)) ++ { ++ e1 = eleft; ++ return this; ++ } ++ else ++ ti->semantic(sc); ++ if (!ti->inst) // if template failed to expand ++ return new ErrorExp(); ++ Dsymbol *s = ti->inst->toAlias(); ++ Declaration *v = s->isDeclaration(); ++ if (v) ++ { ++ if (v->type && !v->type->deco) ++ v->type = v->type->semantic(v->loc, sc); ++ e = new DotVarExp(loc, eleft, v); ++ e = e->semantic(sc); ++ return e; ++ } ++ e = new ScopeExp(loc, ti); ++ e = new DotExp(loc, eleft, e); ++ e = e->semantic(sc); + return e; + } + +@@ -7396,6 +8412,14 @@ L1: + goto Lerr; + goto L1; + } ++ else if (e->op == TOKoverloadset) ++ { ++ OverExp *oe = (OverExp *)e; ++ ti->tempdecl = oe->vars; ++ e = new ScopeExp(loc, ti); ++ e = e->semantic(sc); ++ return e; ++ } + Lerr: + error("%s isn't a template", e->toChars()); + return new ErrorExp(); +@@ -7410,7 +8434,7 @@ void DotTemplateInstanceExp::toCBuffer(O + + /************************************************************/ + +-DelegateExp::DelegateExp(Loc loc, Expression *e, FuncDeclaration *f, int hasOverloads) ++DelegateExp::DelegateExp(Loc loc, Expression *e, FuncDeclaration *f, bool hasOverloads) + : UnaExp(loc, TOKdelegate, sizeof(DelegateExp), e) + { + this->func = f; +@@ -7517,136 +8541,13 @@ Expression *CallExp::syntaxCopy() + return new CallExp(loc, e1->syntaxCopy(), arraySyntaxCopy(arguments)); + } + +- +-Expression *CallExp::resolveUFCS(Scope *sc) +-{ +- Expression *e; +- Identifier *ident; +- Objects *tiargs; +- +- if (e1->op == TOKdot) +- { +- DotIdExp *die = (DotIdExp *)e1; +- e = (die->e1 = die->e1->semantic(sc)); +- ident = die->ident; +- tiargs = NULL; +- } +- else if (e1->op == TOKdotti) +- { +- DotTemplateInstanceExp *dti = (DotTemplateInstanceExp *)e1; +- e = (dti->e1 = dti->e1->semantic(sc)); +- ident = dti->ti->name; +- tiargs = dti->ti->tiargs; +- } +- else +- return NULL; +- +- if (e->op == TOKerror || !e->type) +- return NULL; +- +- if (e->op == TOKtype || e->op == TOKimport || e->op == TOKdotexp) +- return NULL; +- +- e = resolveProperties(sc, e); +- +- Type *t = e->type->toBasetype(); +- //printf("resolveUCSS %s, e = %s, %s, %s\n", +- // toChars(), Token::toChars(e->op), t->toChars(), e->toChars()); +- if (t->ty == Taarray) +- { +- if (tiargs) +- { +- goto Lshift; +- } +- else if (ident == Id::remove) +- { +- /* Transform: +- * aa.remove(arg) into delete aa[arg] +- */ +- if (!arguments || arguments->dim != 1) +- { error("expected key as argument to aa.remove()"); +- return new ErrorExp(); +- } +- if (!e->type->isMutable()) +- { error("cannot remove key from %s associative array %s", MODtoChars(e->type->mod), e->toChars()); +- return new ErrorExp(); +- } +- Expression *key = (*arguments)[0]; +- key = key->semantic(sc); +- key = resolveProperties(sc, key); +- +- TypeAArray *taa = (TypeAArray *)t; +- key = key->implicitCastTo(sc, taa->index); +- +- if (!key->rvalue()) +- return new ErrorExp(); +- +- return new RemoveExp(loc, e, key); +- } +- else if (ident == Id::apply || ident == Id::applyReverse) +- { +- return NULL; +- } +- else +- { TypeAArray *taa = (TypeAArray *)t; +- assert(taa->ty == Taarray); +- StructDeclaration *sd = taa->getImpl(); +- Dsymbol *s = sd->search(0, ident, 2); +- if (s) +- return NULL; +- goto Lshift; +- } +- } +- else if (t->ty == Tarray || t->ty == Tsarray || +- t->ty == Tnull || (t->isTypeBasic() && t->ty != Tvoid)) +- { +- /* In basic, built-in types don't have normal and templatized +- * member functions. So can short cut. +- */ +-Lshift: +- if (!arguments) +- arguments = new Expressions(); +- arguments->shift(e); +- if (!tiargs) +- { +- /* Transform: +- * array.id(args) into .id(array,args) +- */ +- e1 = new DotIdExp(e1->loc, +- new IdentifierExp(e1->loc, Id::empty), +- ident); +- } +- else +- { +- /* Transform: +- * array.foo!(tiargs)(args) into .foo!(tiargs)(array,args) +- */ +- e1 = new DotTemplateInstanceExp(e1->loc, +- new IdentifierExp(e1->loc, Id::empty), +- ident, tiargs); +- } +- } +- else +- { +- DotIdExp *die = new DotIdExp(e->loc, e, ident); +- +- unsigned errors = global.startGagging(); +- Expression *ex = die->semantic(sc, 1); +- if (global.endGagging(errors)) +- { +- goto Lshift; +- } +- } +- return NULL; +-} +- + Expression *CallExp::semantic(Scope *sc) + { + Type *t1; + int istemp; +- Objects *targsi = NULL; // initial list of template arguments +- TemplateInstance *tierror = NULL; ++ Objects *tiargs = NULL; // initial list of template arguments + Expression *ethis = NULL; ++ Type *tthis = NULL; + + #if LOGSEMANTIC + printf("CallExp::semantic() %s\n", toChars()); +@@ -7663,10 +8564,10 @@ Expression *CallExp::semantic(Scope *sc) + #endif + + if (e1->op == TOKcomma) +- { /* Rewrite (a,b)(args) as (a,(b(args))) ++ { ++ /* Rewrite (a,b)(args) as (a,(b(args))) + */ + CommaExp *ce = (CommaExp *)e1; +- + e1 = ce->e2; + e1->type = ce->type; + ce->e2 = this; +@@ -7675,15 +8576,15 @@ Expression *CallExp::semantic(Scope *sc) + } + + if (e1->op == TOKdelegate) +- { DelegateExp *de = (DelegateExp *)e1; +- ++ { ++ DelegateExp *de = (DelegateExp *)e1; + e1 = new DotVarExp(de->loc, de->e1, de->func); + return semantic(sc); + } + + if (e1->op == TOKfunction) +- { FuncExp *fe = (FuncExp *)e1; +- ++ { ++ FuncExp *fe = (FuncExp *)e1; + arguments = arrayExpressionSemantic(arguments, sc); + preFunctionParameters(loc, sc, arguments); + e1 = fe->semantic(sc, arguments); +@@ -7691,7 +8592,7 @@ Expression *CallExp::semantic(Scope *sc) + return e1; + } + +- Expression *e = resolveUFCS(sc); ++ Expression *e = resolveUFCS(sc, this); + if (e) + return e; + +@@ -7706,21 +8607,29 @@ Expression *CallExp::semantic(Scope *sc) + /* Attempt to instantiate ti. If that works, go with it. + * If not, go with partial explicit specialization. + */ +- unsigned olderrors = global.errors; +- ti->semanticTiargs(sc); +- if (olderrors != global.errors) ++ if (!ti->findTemplateDeclaration(sc) || ++ !ti->semanticTiargs(sc)) ++ { ++ ti->inst = ti; ++ ti->inst->errors = true; + return new ErrorExp(); +- if (ti->needsTypeInference(sc)) ++ } ++ if (ti->needsTypeInference(sc, 1)) + { + /* Go with partial explicit specialization + */ +- targsi = ti->tiargs; +- tierror = ti; // for error reporting +- e1 = new IdentifierExp(loc, ti->name); ++ tiargs = ti->tiargs; ++ assert(ti->tempdecl); ++ if (TemplateDeclaration *td = ti->tempdecl->isTemplateDeclaration()) ++ e1 = new TemplateExp(loc, td); ++ else ++ e1 = new OverExp(loc, ti->tempdecl->isOverloadSet()); + } + else + { + ti->semantic(sc); ++ if (ti->errors) ++ e1 = new ErrorExp(); + } + } + } +@@ -7737,18 +8646,23 @@ Ldotti: + /* Attempt to instantiate ti. If that works, go with it. + * If not, go with partial explicit specialization. + */ +- ti->semanticTiargs(sc); +- if (!ti->tempdecl) ++ if (!se->findTempDecl(sc) || ++ !ti->semanticTiargs(sc)) + { +- se->getTempdecl(sc); ++ ti->inst = ti; ++ ti->inst->errors = true; ++ return new ErrorExp(); + } +- if (ti->tempdecl && ti->needsTypeInference(sc)) ++ if (ti->needsTypeInference(sc, 1)) + { + /* Go with partial explicit specialization + */ +- targsi = ti->tiargs; +- tierror = ti; // for error reporting +- e1 = new DotIdExp(loc, se->e1, ti->name); ++ tiargs = ti->tiargs; ++ assert(ti->tempdecl); ++ if (TemplateDeclaration *td = ti->tempdecl->isTemplateDeclaration()) ++ e1 = new DotTemplateExp(loc, se->e1, td); ++ else ++ e1 = new DotExp(loc, se->e1, new OverExp(loc, ti->tempdecl->isOverloadSet())); + } + else + { +@@ -7828,6 +8742,7 @@ Lagain: + if (de->e2->op == TOKoverloadset) + { + ethis = de->e1; ++ tthis = de->e1->type; + e1 = de->e2; + } + +@@ -7849,23 +8764,30 @@ Lagain: + if (e1->type) + t1 = e1->type->toBasetype(); + ++ arguments = arrayExpressionSemantic(arguments, sc); ++ preFunctionParameters(loc, sc, arguments); ++ + // Check for call operator overload + if (t1) +- { AggregateDeclaration *ad; +- ++ { ++ AggregateDeclaration *ad; + if (t1->ty == Tstruct) + { + ad = ((TypeStruct *)t1)->sym; + #if DMDV2 + +- if (ad->sizeok == SIZEOKnone && !ad->ctor && +- ad->search(0, Id::ctor, 0)) ++ if (ad->sizeok == SIZEOKnone) + { +- // The constructor hasn't been found yet, see bug 8741 +- // This can happen if we are inferring type from +- // from VarDeclaration::semantic() in declaration.c +- error("cannot create a struct until its size is determined"); +- return new ErrorExp(); ++ if (ad->scope) ++ ad->semantic(ad->scope); ++ else if (!ad->ctor && ad->search(Loc(), Id::ctor, 0)) ++ { ++ // The constructor hasn't been found yet, see bug 8741 ++ // This can happen if we are inferring type from ++ // from VarDeclaration::semantic() in declaration.c ++ error("cannot create a struct until its size is determined"); ++ return new ErrorExp(); ++ } + } + + // First look for constructor +@@ -7877,26 +8799,32 @@ Lagain: + ExpInitializer *ei = NULL; + if (t1->needsNested()) + { +- Expressions *args = new Expressions(); +- StructLiteralExp *se = new StructLiteralExp(loc, (StructDeclaration *)ad, args); +- se->ctorinit = 1; +- ei = new ExpInitializer(loc, se); ++ StructLiteralExp *sle = new StructLiteralExp(loc, (StructDeclaration *)ad, NULL, e1->type); ++ Expression *e = sle->fill(true); ++ if (e->op == TOKerror) ++ return e; ++ sle->type = type; ++ ei = new ExpInitializer(loc, sle); + } +- + VarDeclaration *tmp = new VarDeclaration(loc, t1, idtmp, ei); + tmp->storage_class |= STCctfe; +- Expression *av = new DeclarationExp(loc, tmp); +- av = new CommaExp(loc, av, new VarExp(loc, tmp)); + +- Expression *e; +- CtorDeclaration *cf = ad->ctor->isCtorDeclaration(); +- if (cf) +- e = new DotVarExp(loc, av, cf, 1); +- else +- { TemplateDeclaration *td = ad->ctor->isTemplateDeclaration(); +- assert(td); +- e = new DotTemplateExp(loc, av, td); ++ Expression *e = new DeclarationExp(loc, tmp); ++ e = new CommaExp(loc, e, new VarExp(loc, tmp)); ++ if (CtorDeclaration *cf = ad->ctor->isCtorDeclaration()) ++ { ++ e = new DotVarExp(loc, e, cf, 1); ++ } ++ else if (TemplateDeclaration *td = ad->ctor->isTemplateDeclaration()) ++ { ++ e = new DotTemplateExp(loc, e, td); + } ++ else if (OverloadSet *os = ad->ctor->isOverloadSet()) ++ { ++ e = new DotExp(loc, e, new OverExp(loc, os)); ++ } ++ else ++ assert(0); + e = new CallExp(loc, e, arguments); + e = e->semantic(sc); + return e; +@@ -7908,8 +8836,10 @@ Lagain: + + if (e1->op != TOKtype) + { +- if (ad->aliasthis) ++ if (ad->aliasthis && e1->type != att1) + { ++ if (!att1 && e1->type->checkAliasThisRec()) ++ att1 = e1->type; + e1 = resolveAliasThis(sc, e1); + goto Lagain; + } +@@ -7936,9 +8866,6 @@ Lagain: + } + } + +- arguments = arrayExpressionSemantic(arguments, sc); +- preFunctionParameters(loc, sc, arguments); +- + // If there was an error processing any argument, or the call, + // return an error without trying to resolve the function call. + if (arguments && arguments->dim) +@@ -7954,10 +8881,10 @@ Lagain: + + // If there was an error processing any template argument, + // return an error without trying to resolve the template. +- if (targsi && targsi->dim) ++ if (tiargs && tiargs->dim) + { +- for (size_t k = 0; k < targsi->dim; k++) +- { Object *o = (*targsi)[k]; ++ for (size_t k = 0; k < tiargs->dim; k++) ++ { RootObject *o = (*tiargs)[k]; + if (isError(o)) + return new ErrorExp(); + } +@@ -7972,6 +8899,7 @@ Lagain: + UnaExp *ue = (UnaExp *)(e1); + + Expression *ue1 = ue->e1; ++ Expression *ue1old = ue1; // need for 'right this' check + VarDeclaration *v; + if (ue1->op == TOKvar && + (v = ((VarExp *)ue1)->var->isVarDeclaration()) != NULL && +@@ -7981,34 +8909,31 @@ Lagain: + ue1 = NULL; + } + ++ Dsymbol *s; + if (e1->op == TOKdotvar) +- { // Do overload resolution ++ { + dve = (DotVarExp *)(e1); +- +- f = dve->var->isFuncDeclaration(); +- assert(f); +- f = f->overloadResolve(loc, ue1, arguments); +- +- ad = f->toParent()->isAggregateDeclaration(); ++ s = dve->var; ++ tiargs = NULL; + } + else + { dte = (DotTemplateExp *)(e1); +- TemplateDeclaration *td = dte->td; +- assert(td); +- if (!arguments) +- // Should fix deduceFunctionTemplate() so it works on NULL argument +- arguments = new Expressions(); +- f = td->deduceFunctionTemplate(sc, loc, targsi, ue1, arguments); +- if (!f) +- return new ErrorExp(); +- ad = td->toParent()->isAggregateDeclaration(); ++ s = dte->td; + } ++ ++ // Do overload resolution ++ f = resolveFuncCall(loc, sc, s, tiargs, ue1 ? ue1->type : NULL, arguments); ++ if (!f) ++ return new ErrorExp(); ++ ad = f->toParent2()->isAggregateDeclaration(); ++ + if (f->needThis()) + { + ue->e1 = getRightThis(loc, sc, ad, ue->e1, f); + if (ue->e1->op == TOKerror) + return ue->e1; + ethis = ue->e1; ++ tthis = ue->e1->type; + } + + /* Cannot call public functions from inside invariant +@@ -8040,6 +8965,7 @@ Lagain: + } + else + { ++ checkRightThis(sc, ue1old); + if (e1->op == TOKdotvar) + { + dve->var = f; +@@ -8049,6 +8975,8 @@ Lagain: + { + e1 = new DotVarExp(loc, dte->e1, f); + e1 = e1->semantic(sc); ++ if (e1->op == TOKerror) ++ return new ErrorExp(); + ue = (UnaExp *)e1; + } + #if 0 +@@ -8102,7 +9030,8 @@ Lagain: + sc->callSuper |= CSXany_ctor | CSXsuper_ctor; + } + +- f = resolveFuncCall(sc, loc, cd->baseClass->ctor, NULL, NULL, arguments, 0); ++ tthis = cd->type->addMod(sc->func->type->mod); ++ f = resolveFuncCall(loc, sc, cd->baseClass->ctor, NULL, tthis, arguments, 0); + if (!f) + return new ErrorExp(); + accessCheck(loc, sc, NULL, f); +@@ -8142,7 +9071,8 @@ Lagain: + sc->callSuper |= CSXany_ctor | CSXthis_ctor; + } + +- f = resolveFuncCall(sc, loc, cd->ctor, NULL, NULL, arguments, 0); ++ tthis = cd->type->addMod(sc->func->type->mod); ++ f = resolveFuncCall(loc, sc, cd->ctor, NULL, tthis, arguments, 0); + if (!f) + return new ErrorExp(); + checkDeprecated(sc, f); +@@ -8169,16 +9099,9 @@ Lagain: + Dsymbol *s = NULL; + for (size_t i = 0; i < eo->vars->a.dim; i++) + { s = eo->vars->a[i]; +- FuncDeclaration *f2 = s->isFuncDeclaration(); +- if (f2) +- { +- f2 = f2->overloadResolve(loc, ethis, arguments, 1); +- } +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- assert(td); +- f2 = td->deduceFunctionTemplate(sc, loc, targsi, ethis, arguments, 1); +- } ++ if (tiargs && s->isFuncDeclaration()) ++ continue; ++ FuncDeclaration *f2 = resolveFuncCall(loc, sc, s, tiargs, tthis, arguments, 1); + if (f2) + { if (f) + /* Error if match in more than one overload set, +@@ -8210,6 +9133,7 @@ Lagain: + { + TypeFunction *tf; + const char *p; ++ f = NULL; + if (e1->op == TOKfunction) + { + // function literal that direct called is always inferred. +@@ -8217,11 +9141,10 @@ Lagain: + f = ((FuncExp *)e1)->fd; + tf = (TypeFunction *)f->type; + p = "function literal"; +- +- f->checkNestedReference(sc, loc); + } + else if (t1->ty == Tdelegate) +- { TypeDelegate *td = (TypeDelegate *)t1; ++ { ++ TypeDelegate *td = (TypeDelegate *)t1; + assert(td->next->ty == Tfunction); + tf = (TypeFunction *)(td->next); + p = "delegate"; +@@ -8234,12 +9157,9 @@ Lagain: + else if (e1->op == TOKtemplate) + { + TemplateExp *te = (TemplateExp *)e1; +- f = te->td->deduceFunctionTemplate(sc, loc, targsi, NULL, arguments); ++ f = resolveFuncCall(loc, sc, te->td, tiargs, NULL, arguments); + if (!f) +- { if (tierror) +- tierror->error("errors instantiating template"); // give better error message + return new ErrorExp(); +- } + if (f->needThis()) + { + if (hasThis(sc)) +@@ -8250,9 +9170,9 @@ Lagain: + e1 = new DotTemplateExp(loc, (new ThisExp(loc))->semantic(sc), te->td); + goto Lagain; + } +- else if (!sc->intypeof && !sc->getStructClassScope()) ++ else if (isNeedThisScope(sc, f)) + { +- error("need 'this' for %s type %s", f->toChars(), f->type->toChars()); ++ error("need 'this' for '%s' of type '%s'", f->toChars(), f->type->toChars()); + return new ErrorExp(); + } + } +@@ -8261,19 +9181,9 @@ Lagain: + goto Lagain; + } + else +- { error("function expected before (), not %s of type %s", e1->toChars(), e1->type->toChars()); +- return new ErrorExp(); +- } +- +- if (sc->func && !tf->purity && !(sc->flags & SCOPEdebug)) +- { +- if (sc->func->setImpure()) +- error("pure function '%s' cannot call impure %s '%s'", sc->func->toPrettyChars(), p, e1->toChars()); +- } +- if (sc->func && tf->trust <= TRUSTsystem) + { +- if (sc->func->setUnsafe()) +- error("safe function '%s' cannot call system %s '%s'", sc->func->toPrettyChars(), p, e1->toChars()); ++ error("function expected before (), not %s of type %s", e1->toChars(), e1->type->toChars()); ++ return new ErrorExp(); + } + + if (!tf->callMatch(NULL, arguments)) +@@ -8287,8 +9197,8 @@ Lagain: + + argExpTypesToCBuffer(&buf, arguments, &hgs); + buf.writeByte(')'); +- if (ethis) +- ethis->type->modToBuffer(&buf); ++ if (tthis) ++ tthis->modToBuffer(&buf); + } + else + buf.writeByte(')'); +@@ -8301,6 +9211,29 @@ Lagain: + return new ErrorExp(); + } + ++ // Purity and safety check should run after testing arguments matching ++ if (f) ++ { ++#if DMDV2 ++ checkPurity(sc, f); ++ checkSafety(sc, f); ++#endif ++ f->checkNestedReference(sc, loc); ++ } ++ else if (sc->func && !(sc->flags & SCOPEctfe)) ++ { ++ if (!tf->purity && !(sc->flags & SCOPEdebug) && sc->func->setImpure()) ++ { ++ error("pure function '%s' cannot call impure %s '%s'", sc->func->toPrettyChars(), p, e1->toChars()); ++ return new ErrorExp(); ++ } ++ if (tf->trust <= TRUSTsystem && sc->func->setUnsafe()) ++ { ++ error("safe function '%s' cannot call system %s '%s'", sc->func->toPrettyChars(), p, e1->toChars()); ++ return new ErrorExp(); ++ } ++ } ++ + if (t1->ty == Tpointer) + { + Expression *e = new PtrExp(loc, e1); +@@ -8316,11 +9249,13 @@ Lagain: + + f = ve->var->isFuncDeclaration(); + assert(f); ++ tiargs = NULL; + + if (ve->hasOverloads) +- f = f->overloadResolve(loc, NULL, arguments, 2); ++ f = resolveFuncCall(loc, sc, f, tiargs, NULL, arguments, 2); + else + { ++ f = f->toAliasFunc(); + TypeFunction *tf = (TypeFunction *)f->type; + if (!tf->callMatch(NULL, arguments)) + { +@@ -8343,6 +9278,8 @@ Lagain: + return new ErrorExp(); + } + } ++ if (!f) ++ return new ErrorExp(); + + if (f->needThis()) + { +@@ -8354,9 +9291,9 @@ Lagain: + e1 = new DotVarExp(loc, (new ThisExp(loc))->semantic(sc), ve->var); + goto Lagain; + } +- else if (!sc->intypeof && !sc->getStructClassScope()) ++ else if (isNeedThisScope(sc, f)) + { +- error("need 'this' for %s type %s", f->toChars(), f->type->toChars()); ++ error("need 'this' for '%s' of type '%s'", f->toChars(), f->type->toChars()); + return new ErrorExp(); + } + } +@@ -8370,10 +9307,13 @@ Lagain: + accessCheck(loc, sc, NULL, f); + + ethis = NULL; ++ tthis = NULL; + +- ve->var = f; +-// ve->hasOverloads = 0; +- ve->type = f->type; ++ if (ve->hasOverloads) ++ { ++ e1 = new VarExp(ve->loc, f, 0); ++ e1->type = f->type; ++ } + t1 = f->type; + } + assert(t1->ty == Tfunction); +@@ -8382,7 +9322,7 @@ Lagain: + if (!arguments) + arguments = new Expressions(); + int olderrors = global.errors; +- type = functionParameters(loc, sc, tf, ethis, arguments, f); ++ type = functionParameters(loc, sc, tf, tthis, arguments, f); + if (olderrors != global.errors) + return new ErrorExp(); + +@@ -8405,6 +9345,13 @@ Lagain: + } + } + ++ // Handle the case of a direct lambda call ++ if (f && f->isFuncLiteralDeclaration() && ++ sc->func && !sc->intypeof) ++ { ++ f->tookAddressOf = 0; ++ } ++ + return this; + } + +@@ -8445,16 +9392,14 @@ Expression *CallExp::addDtorHook(Scope * + return this; + } + +- Type *tv = type->toBasetype(); +- while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- tv = tv->nextOf()->toBasetype(); +- } ++ Type *tv = type->baseElemOf(); + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (sd->dtor) +- { /* Type needs destruction, so declare a tmp ++ { ++ /* Type needs destruction, so declare a tmp + * which the back end will recognize and call dtor on + */ + Identifier *idtmp = Lexer::uniqueId("__tmpfordtor"); +@@ -8466,7 +9411,6 @@ Expression *CallExp::addDtorHook(Scope * + return e; + } + } +-Lnone: + return this; + } + +@@ -8502,10 +9446,42 @@ Expression *AddrExp::semantic(Scope *sc) + if (!type) + { + UnaExp::semantic(sc); +- Expression *olde1 = e1; + if (e1->type == Type::terror) + return new ErrorExp(); + int wasCond = e1->op == TOKquestion; ++ if (e1->op == TOKdotti) ++ { ++ DotTemplateInstanceExp* dti = (DotTemplateInstanceExp *)e1; ++ TemplateInstance *ti = dti->ti; ++ if (!ti->semanticRun) ++ { ++ //assert(ti->needsTypeInference(sc)); ++ ti->semantic(sc); ++ if (!ti->inst) // if template failed to expand ++ return new ErrorExp; ++ Dsymbol *s = ti->inst->toAlias(); ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ assert(f); ++ e1 = new DotVarExp(e1->loc, dti->e1, f); ++ e1 = e1->semantic(sc); ++ } ++ } ++ else if (e1->op == TOKimport) ++ { ++ TemplateInstance *ti = ((ScopeExp *)e1)->sds->isTemplateInstance(); ++ if (ti && !ti->semanticRun) ++ { ++ //assert(ti->needsTypeInference(sc)); ++ ti->semantic(sc); ++ if (!ti->inst) // if template failed to expand ++ return new ErrorExp; ++ Dsymbol *s = ti->inst->toAlias(); ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ assert(f); ++ e1 = new VarExp(e1->loc, f); ++ e1 = e1->semantic(sc); ++ } ++ } + e1 = e1->toLvalue(sc, NULL); + if (e1->op == TOKerror) + return e1; +@@ -8541,9 +9517,9 @@ Expression *AddrExp::semantic(Scope *sc) + { + DotVarExp *dve = (DotVarExp *)e1; + FuncDeclaration *f = dve->var->isFuncDeclaration(); +- + if (f) + { ++ f = f->toAliasFunc(); // FIXME, should see overlods - Bugzilla 1983 + if (!dve->hasOverloads) + f->tookAddressOf++; + +@@ -8581,7 +9557,6 @@ Expression *AddrExp::semantic(Scope *sc) + } + + FuncDeclaration *f = ve->var->isFuncDeclaration(); +- + if (f) + { + if (!ve->hasOverloads || +@@ -8637,6 +9612,7 @@ Expression *AddrExp::semantic(Scope *sc) + ce->e2->type = NULL; + ce->e2 = ce->e2->semantic(sc); + } ++ + return optimize(WANTvalue); + } + return this; +@@ -8827,6 +9803,8 @@ Expression *NotExp::semantic(Scope *sc) + UnaExp::semantic(sc); + e1 = resolveProperties(sc, e1); + e1 = e1->checkToBoolean(sc); ++ if (e1->type == Type::terror) ++ return e1; + type = Type::tboolean; + } + return this; +@@ -8854,6 +9832,8 @@ Expression *BoolExp::semantic(Scope *sc) + UnaExp::semantic(sc); + e1 = resolveProperties(sc, e1); + e1 = e1->checkToBoolean(sc); ++ if (e1->type == Type::terror) ++ return e1; + type = Type::tboolean; + } + return this; +@@ -8928,7 +9908,7 @@ Expression *DeleteExp::semantic(Scope *s + + if (fd) + { Expression *e = ea ? new VarExp(loc, v) : e1; +- e = new DotVarExp(0, e, fd, 0); ++ e = new DotVarExp(Loc(), e, fd, 0); + eb = new CallExp(loc, e); + eb = eb->semantic(sc); + } +@@ -9026,10 +10006,10 @@ Expression *CastExp::semantic(Scope *sc) + if (type) + return this; + UnaExp::semantic(sc); ++ e1 = resolveProperties(sc, e1); ++ + if (e1->type) // if not a tuple + { +- e1 = resolveProperties(sc, e1); +- + if (!to) + { + /* Handle cast(const) and cast(immutable), etc. +@@ -9048,6 +10028,10 @@ Expression *CastExp::semantic(Scope *sc) + if (e1->type->ty == Terror) + return new ErrorExp(); + ++ // cast(void) is used to mark e1 as unused, so it is safe ++ if (to->ty == Tvoid) ++ goto Lsafe; ++ + if (!to->equals(e1->type)) + { + Expression *e = op_overload(sc); +@@ -9089,15 +10073,19 @@ Expression *CastExp::semantic(Scope *sc) + if (tob->ty == Tstruct || t1b->ty == Tstruct || + (tob->ty == Tsarray && t1b->ty == Tsarray)) + { +- size_t fromsize = t1b->size(loc); +- size_t tosize = tob->size(loc); +- if (fromsize != tosize) ++ if (t1b->ty == Tnull || tob->ty == Tnull || t1b->size(loc) != tob->size(loc)) + { + error("cannot cast from %s to %s", e1->type->toChars(), to->toChars()); + return new ErrorExp(); + } + } + ++ if ((t1b->ty == Tarray || t1b->ty == Tsarray) && tob->ty == Tclass) ++ { ++ error("cannot cast from %s to %s", e1->type->toChars(), to->toChars()); ++ return new ErrorExp(); ++ } ++ + // Look for casting to a vector type + if (tob->ty == Tvector && t1b->ty != Tvector) + { +@@ -9105,7 +10093,19 @@ Expression *CastExp::semantic(Scope *sc) + } + + if (tob->isintegral() && t1b->ty == Tarray) +- deprecation("casting %s to %s is deprecated", e1->type->toChars(), to->toChars()); ++ { ++ error("cannot cast %s to integral type %s", e1->toChars(), to->toChars()); ++ return new ErrorExp(); ++ } ++ ++ if (tob->ty == Tpointer && t1b->ty == Tdelegate) ++ deprecation("casting from %s to %s is deprecated", e1->type->toChars(), to->toChars()); ++ ++ if (t1b->ty == Tvoid && tob->ty != Tvoid && e1->op != TOKfunction) ++ { ++ error("cannot cast %s of type %s to %s", e1->toChars(), e1->type->toChars(), to->toChars()); ++ return new ErrorExp(); ++ } + } + else if (!to) + { error("cannot cast tuple"); +@@ -9164,7 +10164,10 @@ Expression *CastExp::semantic(Scope *sc) + { + Type* tobn = tob->nextOf()->toBasetype(); + Type* t1bn = t1b->nextOf()->toBasetype(); +- if (!tobn->hasPointers() && ++ // If the struct is opaque we don't know about the struct members and the cast becomes unsafe ++ bool sfwrd = tobn->ty == Tstruct && !((StructDeclaration *)((TypeStruct *)tobn)->sym)->members || ++ t1bn->ty == Tstruct && !((StructDeclaration *)((TypeStruct *)t1bn)->sym)->members; ++ if (!sfwrd && !tobn->hasPointers() && + tobn->ty != Tfunction && t1bn->ty != Tfunction && + tobn->size() <= t1bn->size() && + MODimplicitConv(t1bn->mod, tobn->mod)) +@@ -9179,6 +10182,16 @@ Expression *CastExp::semantic(Scope *sc) + } + + Lsafe: ++#if DMDV2 ++ /* Instantiate AA implementations during semantic analysis. ++ */ ++ Type *tfrom = e1->type->toBasetype(); ++ Type *t = to->toBasetype(); ++ if (tfrom->ty == Taarray) ++ ((TypeAArray *)tfrom)->getImpl(); ++ if (t->ty == Taarray) ++ ((TypeAArray *)t)->getImpl(); ++#endif + Expression *e = e1->castTo(sc, to); + return e; + } +@@ -9309,6 +10322,26 @@ Lagain: + e = new TypeExp(loc, e1->type->arrayOf()); + return e->semantic(sc); + } ++ if (!lwr && !upr) ++ { ++ if (e1->op == TOKarrayliteral) ++ { // Convert [a,b,c][] to [a,b,c] ++ Type *t1b = e1->type->toBasetype(); ++ Expression *e = e1; ++ if (t1b->ty == Tsarray) ++ { ++ e = e->copy(); ++ e->type = t1b->nextOf()->arrayOf(); ++ } ++ return e; ++ } ++ if (e1->op == TOKslice) ++ { // Convert e[][] to e[] ++ SliceExp *se = (SliceExp *)e1; ++ if (!se->lwr && !se->upr) ++ return se; ++ } ++ } + + e = this; + +@@ -9319,6 +10352,8 @@ Lagain: + { error("need upper and lower bound to slice pointer"); + return new ErrorExp(); + } ++ if (sc->func && !sc->intypeof && sc->func->setUnsafe()) ++ error("pointer slicing not allowed in safe functions"); + } + else if (t->ty == Tarray) + { +@@ -9339,20 +10374,24 @@ Lagain: + if (search_function(ad, Id::slice)) + { + // Rewrite as e1.slice(lwr, upr) +- SliceExp *se = resolveOpDollar(sc, this); ++ Expression *e0 = resolveOpDollar(sc, this); + Expressions *a = new Expressions(); +- assert(!se->lwr || se->upr); +- if (se->lwr) +- { a->push(se->lwr); +- a->push(se->upr); ++ assert(!lwr || upr); ++ if (lwr) ++ { ++ a->push(lwr); ++ a->push(upr); + } +- e = new DotIdExp(loc, se->e1, Id::slice); ++ e = new DotIdExp(loc, e1, Id::slice); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } +- if (ad->aliasthis) ++ if (ad->aliasthis && e1->type != att1) + { ++ if (!att1 && e1->type->checkAliasThisRec()) ++ att1 = e1->type; + e1 = resolveAliasThis(sc, e1); + goto Lagain; + } +@@ -9383,15 +10422,21 @@ Lagain: + } + + if (lwr) +- { lwr = lwr->semantic(sc2); ++ { ++ if (t->ty == Ttuple) sc2 = sc2->startCTFE(); ++ lwr = lwr->semantic(sc2); + lwr = resolveProperties(sc2, lwr); ++ if (t->ty == Ttuple) sc2 = sc2->endCTFE(); + lwr = lwr->implicitCastTo(sc2, Type::tsize_t); + if (lwr->type == Type::terror) + goto Lerr; + } + if (upr) +- { upr = upr->semantic(sc2); ++ { ++ if (t->ty == Ttuple) sc2 = sc2->startCTFE(); ++ upr = upr->semantic(sc2); + upr = resolveProperties(sc2, upr); ++ if (t->ty == Ttuple) sc2 = sc2->endCTFE(); + upr = upr->implicitCastTo(sc2, Type::tsize_t); + if (upr->type == Type::terror) + goto Lerr; +@@ -9434,13 +10479,7 @@ Lagain: + { Expression *e = (*te->exps)[j1 + i]; + (*exps)[i] = e; + } +- if (j1 > 0 && j1 != j2 && sc->func && (*te->exps)[0]->op == TOKdotvar) +- { +- Expression *einit = ((DotVarExp *)(*te->exps)[0])->e1->isTemp(); +- if (einit) +- ((DotVarExp *)(*exps)[0])->e1 = einit; +- } +- e = new TupleExp(loc, exps); ++ e = new TupleExp(loc, te->e0, exps); + } + else + { Parameters *args = new Parameters; +@@ -9492,16 +10531,6 @@ void SliceExp::checkEscapeRef() + e1->checkEscapeRef(); + } + +-int SliceExp::isLvalue() +-{ +- return 1; +-} +- +-Expression *SliceExp::toLvalue(Scope *sc, Expression *e) +-{ +- return this; +-} +- + int SliceExp::checkModifiable(Scope *sc, int flag) + { + //printf("SliceExp::checkModifiable %s\n", toChars()); +@@ -9514,6 +10543,21 @@ int SliceExp::checkModifiable(Scope *sc, + return 1; + } + ++int SliceExp::isLvalue() ++{ ++ /* slice expression is rvalue in default, but ++ * conversion to reference of static array is only allowed. ++ */ ++ return (type && type->toBasetype()->ty == Tsarray); ++} ++ ++Expression *SliceExp::toLvalue(Scope *sc, Expression *e) ++{ ++ //printf("SliceExp::toLvalue(%s) type = %s\n", toChars(), type ? type->toChars() : NULL); ++ return (type && type->toBasetype()->ty == Tsarray) ++ ? this : Expression::toLvalue(sc, e); ++} ++ + Expression *SliceExp::modifiableLvalue(Scope *sc, Expression *e) + { + error("slice expression %s is not a modifiable lvalue", toChars()); +@@ -9532,14 +10576,14 @@ void SliceExp::toCBuffer(OutBuffer *buf, + if (upr || lwr) + { + if (lwr) +- expToCBuffer(buf, hgs, lwr, PREC_assign); ++ sizeToCBuffer(buf, hgs, lwr); + else + buf->writeByte('0'); + buf->writestring(".."); + if (upr) +- expToCBuffer(buf, hgs, upr, PREC_assign); ++ sizeToCBuffer(buf, hgs, upr); + else +- buf->writestring("length"); // BUG: should be array.length ++ buf->writestring("$"); + } + buf->writeByte(']'); + } +@@ -9566,7 +10610,7 @@ Expression *ArrayLengthExp::semantic(Sco + return this; + } + +-Expression *opAssignToOp(Loc loc, enum TOK op, Expression *e1, Expression *e2) ++Expression *opAssignToOp(Loc loc, TOK op, Expression *e1, Expression *e2) + { Expression *e; + + switch (op) +@@ -9815,6 +10859,7 @@ IndexExp::IndexExp(Loc loc, Expression * + //printf("IndexExp::IndexExp('%s')\n", toChars()); + lengthVar = NULL; + modifiable = 0; // assume it is an rvalue ++ skipboundscheck = 0; + } + + Expression *IndexExp::syntaxCopy() +@@ -9865,8 +10910,10 @@ Expression *IndexExp::semantic(Scope *sc + sc = sc->push(sym); + } + ++ if (t1->ty == Ttuple) sc = sc->startCTFE(); + e2 = e2->semantic(sc); + e2 = resolveProperties(sc, e2); ++ if (t1->ty == Ttuple) sc = sc->endCTFE(); + if (e2->type == Type::terror) + goto Lerr; + if (e2->type->ty == Ttuple && ((TupleExp *)e2)->exps->dim == 1) // bug 4444 fix +@@ -9879,10 +10926,12 @@ Expression *IndexExp::semantic(Scope *sc + { + case Tpointer: + e2 = e2->implicitCastTo(sc, Type::tsize_t); ++ if (e2->type == Type::terror) ++ goto Lerr; + e2 = e2->optimize(WANTvalue); + if (e2->op == TOKint64 && e2->toInteger() == 0) + ; +- else if (sc->func->setUnsafe()) ++ else if (sc->func && sc->func->setUnsafe()) + { + error("safe function '%s' cannot index pointer '%s'", + sc->func->toPrettyChars(), e1->toChars()); +@@ -9893,12 +10942,16 @@ Expression *IndexExp::semantic(Scope *sc + + case Tarray: + e2 = e2->implicitCastTo(sc, Type::tsize_t); ++ if (e2->type == Type::terror) ++ goto Lerr; + e->type = ((TypeNext *)t1)->next; + break; + + case Tsarray: + { + e2 = e2->implicitCastTo(sc, Type::tsize_t); ++ if (e2->type == Type::terror) ++ goto Lerr; + TypeSArray *tsa = (TypeSArray *)t1; + e->type = t1->nextOf(); + break; +@@ -9920,6 +10973,8 @@ Expression *IndexExp::semantic(Scope *sc + case Ttuple: + { + e2 = e2->implicitCastTo(sc, Type::tsize_t); ++ if (e2->type == Type::terror) ++ goto Lerr; + e2 = e2->ctfeInterpret(); + uinteger_t index = e2->toUInteger(); + size_t length; +@@ -9944,12 +10999,7 @@ Expression *IndexExp::semantic(Scope *sc + if (e1->op == TOKtuple) + { + e = (*te->exps)[(size_t)index]; +- if (sc->func && (*te->exps)[0]->op == TOKdotvar) +- { +- Expression *einit = ((DotVarExp *)(*te->exps)[0])->e1->isTemp(); +- if (einit) +- ((DotVarExp *)e)->e1 = einit; +- } ++ e = combine(te->e0, e); + } + else + e = new TypeExp(e1->loc, Parameter::getNth(tup->arguments, (size_t)index)->type); +@@ -9971,6 +11021,21 @@ Expression *IndexExp::semantic(Scope *sc + case Terror: + goto Lerr; + } ++ ++ if (t1->ty == Tsarray || t1->ty == Tarray) ++ { ++ Expression *el = new ArrayLengthExp(loc, e1); ++ el = el->semantic(sc); ++ el = el->optimize(WANTvalue); ++ if (el->op == TOKint64) ++ { ++ e2 = e2->optimize(WANTvalue); ++ dinteger_t length = el->toInteger(); ++ if (length) ++ skipboundscheck = IntRange(SignExtendedNumber(0), SignExtendedNumber(length)).contains(e2->getIntRange()); ++ } ++ } ++ + return e; + + Lerr: +@@ -10021,14 +11086,14 @@ void IndexExp::toCBuffer(OutBuffer *buf, + { + expToCBuffer(buf, hgs, e1, PREC_primary); + buf->writeByte('['); +- expToCBuffer(buf, hgs, e2, PREC_assign); ++ sizeToCBuffer(buf, hgs, e2); + buf->writeByte(']'); + } + + + /************************* PostExp ***********************************/ + +-PostExp::PostExp(enum TOK op, Loc loc, Expression *e) ++PostExp::PostExp(TOK op, Loc loc, Expression *e) + : BinExp(loc, op, sizeof(PostExp), e, + new IntegerExp(loc, 1, Type::tint32)) + { +@@ -10037,6 +11102,9 @@ PostExp::PostExp(enum TOK op, Loc loc, E + Expression *PostExp::semantic(Scope *sc) + { Expression *e = this; + ++#if LOGSEMANTIC ++ printf("PostExp::semantic('%s')\n", toChars()); ++#endif + if (!type) + { + BinExp::semantic(sc); +@@ -10053,6 +11121,7 @@ Expression *PostExp::semantic(Scope *sc) + return new ErrorExp(); + } + ++ e1 = e1->optimize(WANTvalue); + if (e1->op != TOKarraylength) + e1 = e1->modifiableLvalue(sc, e1); + +@@ -10118,7 +11187,7 @@ void PostExp::toCBuffer(OutBuffer *buf, + + /************************* PreExp ***********************************/ + +-PreExp::PreExp(enum TOK op, Loc loc, Expression *e) ++PreExp::PreExp(TOK op, Loc loc, Expression *e) + : UnaExp(loc, op, sizeof(PreExp), e) + { + } +@@ -10185,10 +11254,11 @@ Expression *AssignExp::semantic(Scope *s + { + ArrayExp *ae = (ArrayExp *)e1; + AggregateDeclaration *ad = NULL; +- Identifier *id = Id::index; + + ae->e1 = ae->e1->semantic(sc); + ae->e1 = resolveProperties(sc, ae->e1); ++ Expression *ae1old = ae->e1; ++ + Type *t1 = ae->e1->type->toBasetype(); + if (t1->ty == Tstruct) + { +@@ -10203,47 +11273,53 @@ Expression *AssignExp::semantic(Scope *s + if (search_function(ad, Id::indexass)) + { + // Deal with $ +- ae = resolveOpDollar(sc, ae); ++ Expression *e0 = resolveOpDollar(sc, ae); + Expressions *a = (Expressions *)ae->arguments->copy(); + a->insert(0, e2); + + Expression *e = new DotIdExp(loc, ae->e1, Id::indexass); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + } + + // No opIndexAssign found yet, but there might be an alias this to try. +- if (ad && ad->aliasthis) +- { Expression *e = resolveAliasThis(sc, ae->e1); +- Type *t = e->type->toBasetype(); +- +- if (t->ty == Tstruct) ++ if (ad && ad->aliasthis && t1 != att1) ++ { ++ if (!att1 && t1->checkAliasThisRec()) ++ att1 = t1; ++ ae->e1 = resolveAliasThis(sc, ae->e1); ++ t1 = ae->e1->type->toBasetype(); ++ if (t1->ty == Tstruct) + { +- ad = ((TypeStruct *)t)->sym; ++ ad = ((TypeStruct *)t1)->sym; + goto L1; + } +- else if (t->ty == Tclass) ++ else if (t1->ty == Tclass) + { +- ad = ((TypeClass *)t)->sym; ++ ad = ((TypeClass *)t1)->sym; + goto L1; + } + } ++ ++ ae->e1 = ae1old; // restore + } + /* Look for operator overloading of a[i..j]=value. + * Do it before semantic() otherwise the a[i..j] will have been + * converted to a.opSlice() already. + */ + if (e1->op == TOKslice) +- { Type *t1; ++ { + SliceExp *ae = (SliceExp *)e1; + AggregateDeclaration *ad = NULL; +- Identifier *id = Id::index; + + ae->e1 = ae->e1->semantic(sc); + ae->e1 = resolveProperties(sc, ae->e1); +- t1 = ae->e1->type->toBasetype(); ++ Expression *ae1old = ae->e1; ++ ++ Type *t1 = ae->e1->type->toBasetype(); + if (t1->ty == Tstruct) + { + ad = ((TypeStruct *)t1)->sym; +@@ -10256,37 +11332,43 @@ Expression *AssignExp::semantic(Scope *s + // Rewrite (a[i..j] = value) to (a.opSliceAssign(value, i, j)) + if (search_function(ad, Id::sliceass)) + { +- ae = resolveOpDollar(sc, ae); ++ Expression *e0 = resolveOpDollar(sc, ae); + Expressions *a = new Expressions(); + a->push(e2); + assert(!ae->lwr || ae->upr); + if (ae->lwr) +- { a->push(ae->lwr); ++ { ++ a->push(ae->lwr); + a->push(ae->upr); + } + Expression *e = new DotIdExp(loc, ae->e1, Id::sliceass); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + } + + // No opSliceAssign found yet, but there might be an alias this to try. +- if (ad && ad->aliasthis) +- { Expression *e = resolveAliasThis(sc, ae->e1); +- Type *t = e->type->toBasetype(); +- +- if (t->ty == Tstruct) ++ if (ad && ad->aliasthis && t1 != att1) ++ { ++ if (!att1 && t1->checkAliasThisRec()) ++ att1 = t1; ++ ae->e1 = resolveAliasThis(sc, ae->e1); ++ t1 = ae->e1->type->toBasetype(); ++ if (t1->ty == Tstruct) + { +- ad = ((TypeStruct *)t)->sym; ++ ad = ((TypeStruct *)t1)->sym; + goto L2; + } +- else if (t->ty == Tclass) ++ else if (t1->ty == Tclass) + { +- ad = ((TypeClass *)t)->sym; ++ ad = ((TypeClass *)t1)->sym; + goto L2; + } + } ++ ++ ae->e1 = ae1old; // restore + } + + /* With UFCS, e.f = value +@@ -10297,25 +11379,31 @@ Expression *AssignExp::semantic(Scope *s + */ + if (e1->op == TOKdotti) + { +- Expression *e = resolveProperty(sc, &e1, e2); +- if (e) return e; ++ DotTemplateInstanceExp *dti = (DotTemplateInstanceExp *)e1; ++ Expression *e = dti->semanticY(sc, 1); ++ if (!e) ++ return resolveUFCSProperties(sc, e1, e2); ++ e1 = e; + } + else if (e1->op == TOKdot) + { +- Expression *e = resolveProperty(sc, &e1, e2); +- if (e) return e; +- +- VarDeclaration * vd = NULL; +- if (e1->op == TOKvar) +- vd = ((VarExp *)e1)->var->isVarDeclaration(); +- +- if (vd && vd->needThis()) ++ DotIdExp *die = (DotIdExp *)e1; ++ Expression *e = die->semanticY(sc, 1); ++ if (e && isDotOpDispatch(e)) + { +- error("need 'this' to access member %s", e1->toChars()); +- return new ErrorExp(); ++ unsigned errors = global.startGagging(); ++ e = resolvePropertiesX(sc, e, e2); ++ if (global.endGagging(errors)) ++ e = NULL; /* fall down to UFCS */ ++ else ++ return e; + } ++ if (!e) ++ return resolveUFCSProperties(sc, e1, e2); ++ e1 = e; + } +- e1 = e1->semantic(sc); ++ else ++ e1 = e1->semantic(sc); + if (e1->op == TOKerror) + return new ErrorExp(); + +@@ -10325,113 +11413,10 @@ Expression *AssignExp::semantic(Scope *s + * or: + * f() = value + */ +- TemplateDeclaration *td; +- Objects *targsi; +- FuncDeclaration *fd; +- Expression *ethis; +- if (e1->op == TOKdotti) +- { +- DotTemplateInstanceExp* dti = (DotTemplateInstanceExp *)e1; +- td = dti->getTempdecl(sc); +- dti->ti->semanticTiargs(sc); +- targsi = dti->ti->tiargs; +- ethis = dti->e1; +- goto L3; +- } +- else if (e1->op == TOKdottd) +- { +- DotTemplateExp *dte = (DotTemplateExp *)e1; +- td = dte->td; +- targsi = NULL; +- ethis = dte->e1; +- goto L3; +- } +- else if (e1->op == TOKtemplate) +- { +- td = ((TemplateExp *)e1)->td; +- targsi = NULL; +- ethis = NULL; +- L3: +- { +- e2 = e2->semantic(sc); +- if (e2->op == TOKerror) +- return new ErrorExp(); +- e2 = resolveProperties(sc, e2); +- +- assert(td); +- Expressions a; +- a.push(e2); +- +- fd = td->deduceFunctionTemplate(sc, loc, targsi, ethis, &a, 1); +- if (fd && fd->type) +- goto Lsetter; +- +- fd = td->deduceFunctionTemplate(sc, loc, targsi, ethis, NULL, 1); +- if (fd && fd->type) +- goto Lgetter; +- } +- goto Leprop; +- } +- else if (e1->op == TOKdotvar && e1->type->toBasetype()->ty == Tfunction) +- { +- DotVarExp *dve = (DotVarExp *)e1; +- fd = dve->var->isFuncDeclaration(); +- ethis = dve->e1; +- goto L4; +- } +- else if (e1->op == TOKvar && e1->type->toBasetype()->ty == Tfunction) +- { +- fd = ((VarExp *)e1)->var->isFuncDeclaration(); +- ethis = NULL; +- L4: +- { +- e2 = e2->semantic(sc); +- if (e2->op == TOKerror) +- return new ErrorExp(); +- e2 = resolveProperties(sc, e2); +- +- assert(fd); +- FuncDeclaration *f = fd; +- Expressions a; +- a.push(e2); +- +- fd = f->overloadResolve(loc, ethis, &a, 1); +- if (fd && fd->type) +- goto Lsetter; +- +- fd = f->overloadResolve(loc, ethis, NULL, 1); +- if (fd && fd->type) +- goto Lgetter; +- +- goto Leprop; +- } +- +- Expression *e; +- TypeFunction *tf; +- +- Lsetter: +- assert(fd->type->ty == Tfunction); +- tf = (TypeFunction *)fd->type; +- if (!tf->isproperty && global.params.enforcePropertySyntax) +- goto Leprop; +- e = new CallExp(loc, e1, e2); +- return e->semantic(sc); +- +- Lgetter: +- assert(fd->type->ty == Tfunction); +- tf = (TypeFunction *)fd->type; +- if (!tf->isref) +- goto Leprop; +- if (!tf->isproperty && global.params.enforcePropertySyntax) +- goto Leprop; +- e = new CallExp(loc, e1); +- e = new AssignExp(loc, e, e2); +- return e->semantic(sc); ++ if (Expression *e = resolvePropertiesX(sc, e1, e2)) ++ return e; + +- Leprop: +- ::error(e1->loc, "not a property %s", e1->toChars()); +- return new ErrorExp(); +- } ++ e1 = checkRightThis(sc, e1); + + assert(e1->type); + Type *t1 = e1->type->toBasetype(); +@@ -10449,27 +11434,36 @@ Expression *AssignExp::semantic(Scope *s + */ + Ltupleassign: + if (e1->op == TOKtuple && e2->op == TOKtuple) +- { TupleExp *tup1 = (TupleExp *)e1; ++ { ++ TupleExp *tup1 = (TupleExp *)e1; + TupleExp *tup2 = (TupleExp *)e2; + size_t dim = tup1->exps->dim; ++ Expression *e = NULL; + if (dim != tup2->exps->dim) + { + error("mismatched tuple lengths, %d and %d", (int)dim, (int)tup2->exps->dim); + return new ErrorExp(); + } ++ if (dim == 0) ++ { ++ e = new IntegerExp(loc, 0, Type::tint32); ++ e = new CastExp(loc, e, Type::tvoid); // avoid "has no effect" error ++ e = combine(combine(tup1->e0, tup2->e0), e); ++ } + else +- { Expressions *exps = new Expressions; ++ { ++ Expressions *exps = new Expressions; + exps->setDim(dim); +- + for (size_t i = 0; i < dim; i++) +- { Expression *ex1 = (*tup1->exps)[i]; ++ { ++ Expression *ex1 = (*tup1->exps)[i]; + Expression *ex2 = (*tup2->exps)[i]; +- (*exps)[i] = new AssignExp(loc, ex1, ex2); ++ (*exps)[i] = new AssignExp(loc, ex1, ex2); + } +- Expression *e = new TupleExp(loc, exps); +- e = e->semantic(sc); +- return e; ++ e = new TupleExp(loc, combine(tup1->e0, tup2->e0), exps); + } ++ assert(e); ++ return e->semantic(sc); + } + + if (e1->op == TOKtuple) +@@ -10482,12 +11476,15 @@ Ltupleassign: + Identifier *id = Lexer::uniqueId("__tup"); + ExpInitializer *ei = new ExpInitializer(e2->loc, e2); + VarDeclaration *v = new VarDeclaration(e2->loc, NULL, id, ei); +- v->storage_class = STCctfe | STCref | STCforeach; +- Expression *ve = new VarExp(e2->loc, v); +- ve->type = e2->type; ++ v->storage_class = STCctfe; ++ if (e2->isLvalue()) ++ v->storage_class = STCref | STCforeach; ++ Expression *e0 = new DeclarationExp(e2->loc, v); ++ Expression *ev = new VarExp(e2->loc, v); ++ ev->type = e2->type; + + Expressions *iexps = new Expressions(); +- iexps->push(ve); ++ iexps->push(ev); + + for (size_t u = 0; u < iexps->dim ; u++) + { +@@ -10508,8 +11505,7 @@ Ltupleassign: + goto Lnomatch; + } + } +- (*iexps)[0] = new CommaExp(loc, new DeclarationExp(e2->loc, v), (*iexps)[0]); +- e2 = new TupleExp(e2->loc, iexps); ++ e2 = new TupleExp(e2->loc, e0, iexps); + e2 = e2->semantic(sc); + goto Ltupleassign; + +@@ -10518,10 +11514,17 @@ Ltupleassign: + } + } + ++ if (op == TOKassign && e1->checkModifiable(sc) == 2) ++ { ++ //printf("[%s] change to init - %s\n", loc.toChars(), toChars()); ++ op = TOKconstruct; ++ } ++ + // Determine if this is an initialization of a reference + int refinit = 0; + if (op == TOKconstruct && e1->op == TOKvar) +- { VarExp *ve = (VarExp *)e1; ++ { ++ VarExp *ve = (VarExp *)e1; + VarDeclaration *v = ve->var->isVarDeclaration(); + if (v->storage_class & (STCout | STCref)) + refinit = 1; +@@ -10535,88 +11538,238 @@ Ltupleassign: + StructDeclaration *sd = ((TypeStruct *)t1)->sym; + if (op == TOKassign) + { +- Expression *e = op_overload(sc); +- if (e && e1->op == TOKindex && ++ if (e1->op == TOKindex && + ((IndexExp *)e1)->e1->type->toBasetype()->ty == Taarray) + { +- // Deal with AAs (Bugzilla 2451) +- // Rewrite as: +- // e1 = (typeof(aa.value) tmp = void, tmp = e2, tmp); +- Type * aaValueType = ((TypeAArray *)((IndexExp*)e1)->e1->type->toBasetype())->next; +- Identifier *id = Lexer::uniqueId("__aatmp"); +- VarDeclaration *v = new VarDeclaration(loc, aaValueType, +- id, new VoidInitializer(0)); +- v->storage_class |= STCctfe; +- v->semantic(sc); +- v->parent = sc->parent; ++ /* ++ * Rewrite: ++ * aa[key] = e2; ++ * as: ++ * ref __aatmp = aa; ++ * ref __aakey = key; ++ * ref __aaval = e2; ++ * (__aakey in __aatmp ++ * ? __aatmp[__aakey].opAssign(__aaval) ++ * : ConstructExp(__aatmp[__aakey], __aaval)); ++ */ ++ IndexExp *ie = (IndexExp *)e1; ++ Type *t2 = e2->type->toBasetype(); ++ Expression *e0 = NULL; ++ ++ Expression *ea = ie->e1; ++ Expression *ek = ie->e2; ++ Expression *ev = e2; ++ if (ea->hasSideEffect()) ++ { ++ VarDeclaration *v = new VarDeclaration(loc, ie->e1->type, ++ Lexer::uniqueId("__aatmp"), new ExpInitializer(loc, ie->e1)); ++ v->storage_class |= STCctfe; ++ if (ea->isLvalue()) ++ v->storage_class |= STCforeach | STCref; ++ v->semantic(sc); ++ e0 = combine(e0, new DeclarationExp(loc, v)); ++ ea = new VarExp(loc, v); ++ } ++ if (ek->hasSideEffect()) ++ { ++ VarDeclaration *v = new VarDeclaration(loc, ie->e2->type, ++ Lexer::uniqueId("__aakey"), new ExpInitializer(loc, ie->e2)); ++ v->storage_class |= STCctfe; ++ if (ek->isLvalue()) ++ v->storage_class |= STCforeach | STCref; ++ v->semantic(sc); ++ e0 = combine(e0, new DeclarationExp(loc, v)); ++ ek = new VarExp(loc, v); ++ } ++ if (ev->hasSideEffect()) ++ { ++ VarDeclaration *v = new VarDeclaration(loc, e2->type, ++ Lexer::uniqueId("__aaval"), new ExpInitializer(loc, e2)); ++ v->storage_class |= STCctfe; ++ if (ev->isLvalue()) ++ v->storage_class |= STCforeach | STCref; ++ v->semantic(sc); ++ e0 = combine(e0, new DeclarationExp(loc, v)); ++ ev = new VarExp(loc, v); ++ } ++ if (e0) ++ e0 = e0->semantic(sc); + +- Expression *de = new DeclarationExp(loc, v); +- VarExp *ve = new VarExp(loc, v); ++ AssignExp *ae = (AssignExp *)copy(); ++ ae->e1 = new IndexExp(loc, ea, ek); ++ ae->e1 = ae->e1->semantic(sc); ++ ae->e1 = ae->e1->optimize(WANTvalue); ++ ae->e2 = ev; ++ //Expression *e = new CallExp(loc, new DotIdExp(loc, ex, Id::assign), ev); ++ Expression *e = ae->op_overload(sc); ++ if (!e) ++ goto Lx; + +- AssignExp *ae = new AssignExp(loc, ve, e2); +- e = ae->op_overload(sc); +- e2 = new CommaExp(loc, new CommaExp(loc, de, e), ve); +- e2 = e2->semantic(sc); ++ Expression *ey = NULL; ++ if (t2->ty == Tstruct && sd == t2->toDsymbol(sc)) ++ { ++ ey = ev; ++ goto Lctor; ++ } ++ else if (!ev->implicitConvTo(ie->type) && sd->ctor) ++ { ++ // Look for implicit constructor call ++ // Rewrite as S().ctor(e2) ++ ey = new StructLiteralExp(loc, sd, NULL); ++ ey = new DotIdExp(loc, ey, Id::ctor); ++ ey = new CallExp(loc, ey, ev); ++ ey = ey->trySemantic(sc); ++ if (ey) ++ { ++ Lctor: ++ Expression *ex; ++ ex = new IndexExp(loc, ea, ek); ++ ex = ex->semantic(sc); ++ ex = ex->optimize(WANTvalue); ++ ex = ex->modifiableLvalue(sc, ex); // allocate new slot ++ ey = new ConstructExp(loc, ex, ey); + +- e1 = e1->optimize(WANTvalue); +- e1 = e1->modifiableLvalue(sc, e1); +- e2 = e2->implicitCastTo(sc, e1->type); +- type = e1->type; +- assert(type); +- e = this; ++ e = new CastExp(e->loc, e, Type::tvoid); ++ ey = new CastExp(ey->loc, ey, Type::tvoid); ++ } ++ } ++ if (ey) ++ e = new CondExp(loc, new InExp(loc, ek, ea), e, ey); ++ ++ e = combine(e0, e); ++ e = e->semantic(sc); ++ return e; + } ++ ++ Expression *e = op_overload(sc); + if (e) + { + /* See if we need to set ctorinit, i.e. track + * assignments to fields. An assignment to a field counts even + * if done through an opAssign overload. + */ +- e1->checkModifiable(sc); + return e; + } + } + else if (op == TOKconstruct && !refinit) +- { Type *t2 = e2->type->toBasetype(); +- if (t2->ty == Tstruct && +- sd == ((TypeStruct *)t2)->sym && +- sd->cpctor) +- { /* We have a copy constructor for this +- */ +- if (e2->op == TOKquestion) +- { /* Write as: +- * a ? e1 = b : e1 = c; ++ { ++ Type *t2 = e2->type->toBasetype(); ++ if (t2->ty == Tstruct && sd == ((TypeStruct *)t2)->sym) ++ { ++ if (sd->ctor && // there are constructors ++ e2->op == TOKcall && ++ e2->type->implicitConvTo(t1)) ++ { ++ /* Look for form of constructor call which is: ++ * *__ctmp.ctor(arguments...) + */ +- CondExp *econd = (CondExp *)e2; +- AssignExp *ea1 = new AssignExp(econd->e1->loc, e1, econd->e1); +- ea1->op = op; +- AssignExp *ea2 = new AssignExp(econd->e1->loc, e1, econd->e2); +- ea2->op = op; +- Expression *e = new CondExp(loc, econd->econd, ea1, ea2); +- return e->semantic(sc); ++ CallExp *ce = (CallExp *)e2; ++ if (ce->e1->op == TOKdotvar) ++ { ++ DotVarExp *dve = (DotVarExp *)ce->e1; ++ if (dve->var->isCtorDeclaration()) ++ { ++ /* It's a constructor call, currently constructing ++ * a temporary __ctmp. ++ */ ++ /* Before calling the constructor, initialize ++ * variable with a bit copy of the default ++ * initializer ++ */ ++ ++ if (sd->zeroInit == 1) ++ { ++ e2 = new IntegerExp(loc, 0, Type::tint32); ++ } ++ else if (sd->isNested()) ++ { ++ e2 = t1->defaultInitLiteral(loc); ++ this->op = TOKblit; ++ } ++ else ++ { ++ e2 = t1->defaultInit(loc); ++ this->op = TOKblit; ++ } ++ type = e1->type; ++ ++ /* Replace __ctmp being constructed with e1. ++ * We need to copy constructor call expression, ++ * because it may be used in other place. ++ */ ++ DotVarExp *dvx = (DotVarExp *)dve->copy(); ++ dvx->e1 = e1; ++ CallExp *cx = (CallExp *)ce->copy(); ++ cx->e1 = dvx; ++ ++ Expression *e = new CommaExp(loc, this, cx); ++ e = e->semantic(sc); ++ return e; ++ } ++ } + } +- else if (e2->isLvalue()) +- { /* Write as: +- * e1.cpctor(e2); ++ if (sd->cpctor) ++ { ++ /* We have a copy constructor for this + */ +- if (!e2->type->implicitConvTo(e1->type)) +- error("conversion error from %s to %s", e2->type->toChars(), e1->type->toChars()); ++ if (e2->op == TOKquestion) ++ { ++ /* Write as: ++ * a ? e1 = b : e1 = c; ++ */ ++ CondExp *econd = (CondExp *)e2; ++ AssignExp *ea1 = new AssignExp(econd->e1->loc, e1, econd->e1); ++ ea1->op = op; ++ AssignExp *ea2 = new AssignExp(econd->e1->loc, e1, econd->e2); ++ ea2->op = op; ++ Expression *e = new CondExp(loc, econd->econd, ea1, ea2); ++ return e->semantic(sc); ++ } + +- Expression *e = new DotVarExp(loc, e1, sd->cpctor, 0); +- e = new CallExp(loc, e, e2); +- return e->semantic(sc); ++ if (e2->isLvalue()) ++ { ++ /* Write as: ++ * e1.cpctor(e2); ++ */ ++ if (!e2->type->implicitConvTo(e1->type)) ++ error("conversion error from %s to %s", e2->type->toChars(), e1->type->toChars()); ++ ++ Expression *e = new DotVarExp(loc, e1, sd->cpctor, 0); ++ e = new CallExp(loc, e, e2); ++ return e->semantic(sc); ++ } ++ else ++ { ++ /* The struct value returned from the function is transferred ++ * so should not call the destructor on it. ++ */ ++ e2 = valueNoDtor(e2); ++ } + } +- else if (e2->op == TOKcall) ++ } ++ else ++ { ++ if (!e2->implicitConvTo(t1)) + { +- /* The struct value returned from the function is transferred +- * so should not call the destructor on it. +- */ +- valueNoDtor(e2); ++ // Look for implicit constructor call ++ if (sd->ctor) ++ { ++ // Look for constructor first ++ // Rewrite as e1.ctor(arguments) ++ Expression *e; ++ e = new DotIdExp(loc, e1, Id::ctor); ++ e = new CallExp(loc, e, e2); ++ e = e->semantic(sc); ++ return e; ++ } + } + } + } ++ Lx: ; + } + else if (t1->ty == Tclass) +- { // Disallow assignment operator overloads for same type ++ { ++ // Disallow assignment operator overloads for same type + if (op == TOKassign && !e2->implicitConvTo(e1->type)) + { + Expression *e = op_overload(sc); +@@ -10641,11 +11794,32 @@ Ltupleassign: + else + { + // Convert e2 to e2[], unless e2-> e1[0] +- if (t2->ty == Tsarray && !t2->implicitConvTo(t1->nextOf())) ++ if (e2->op != TOKarrayliteral && t2->ty == Tsarray && !t2->implicitConvTo(t1->nextOf())) + { + e2 = new SliceExp(e2->loc, e2, NULL, NULL); + e2 = e2->semantic(sc); + } ++ else if (0 && global.params.warnings && !global.gag && op == TOKassign && ++ e2->op != TOKarrayliteral && e2->op != TOKstring && ++ !e2->implicitConvTo(t1)) ++ { // Disallow sa = da (Converted to sa[] = da[]) ++ // Disallow sa = e (Converted to sa[] = e) ++ const char* e1str = e1->toChars(); ++ const char* e2str = e2->toChars(); ++ if (e2->op == TOKslice || e2->implicitConvTo(t1->nextOf())) ++ warning("explicit element-wise assignment (%s)[] = %s is better than %s = %s", ++ e1str, e2str, e1str, e2str); ++ else ++ warning("explicit element-wise assignment (%s)[] = (%s)[] is better than %s = %s", ++ e1str, e2str, e1str, e2str); ++ ++ // Convert e2 to e2[] to avoid duplicated error message. ++ if (t2->ty == Tarray) ++ { ++ Expression *e = new SliceExp(e2->loc, e2, NULL, NULL); ++ e2 = e->semantic(sc); ++ } ++ } + + // Convert e1 to e1[] + Expression *e = new SliceExp(e1->loc, e1, NULL, NULL); +@@ -10660,12 +11834,17 @@ Ltupleassign: + ArrayLengthExp *ale = (ArrayLengthExp *)e1; + + ale->e1 = ale->e1->modifiableLvalue(sc, e1); ++ if (ale->e1->op == TOKerror) ++ return ale->e1; ++ ++ checkDefCtor(ale->loc, ale->e1->type->toBasetype()->nextOf()); + } + else if (e1->op == TOKslice) + { + Type *tn = e1->type->nextOf(); +- if (op == TOKassign && e1->checkModifiable(sc) == 1 && !tn->isMutable()) +- { error("slice %s is not mutable", e1->toChars()); ++ if (op == TOKassign && !tn->isMutable()) ++ { ++ error("slice %s is not mutable", e1->toChars()); + return new ErrorExp(); + } + } +@@ -10675,7 +11854,7 @@ Ltupleassign: + if (e1->op != TOKvar) + e1 = e1->optimize(WANTvalue); + +- if (op != TOKconstruct) ++ if (op == TOKassign) + e1 = e1->modifiableLvalue(sc, e1old); + } + +@@ -10696,6 +11875,8 @@ Ltupleassign: + { // memset + ismemset = 1; // make it easy for back end to tell what this is + e2 = e2->implicitCastTo(sc, t1->nextOf()); ++ if (op != TOKblit && e2->isLvalue()) ++ e2->checkPostblit(sc, t1->nextOf()); + } + else if (t1->ty == Tsarray) + { +@@ -10714,19 +11895,26 @@ Ltupleassign: + (t2->ty == Tarray || t2->ty == Tsarray) && + t2->nextOf()->implicitConvTo(t1->nextOf())) + { +- if (((SliceExp *)e1)->lwr == NULL) ++ SliceExp *se1 = (SliceExp *)e1; ++ Type *tx1 = se1->e1->type->toBasetype(); ++ if (se1->lwr == NULL && tx1->ty == Tsarray) + { +- Type *tx1 = ((SliceExp *)e1)->e1->type->toBasetype(); + Type *tx2 = t2; + if (e2->op == TOKslice && ((SliceExp *)e2)->lwr == NULL) + tx2 = ((SliceExp *)e2)->e1->type->toBasetype(); +- if (tx1->ty == Tsarray && tx2->ty == Tsarray) ++ uinteger_t dim1, dim2; ++ if (e2->op == TOKarrayliteral) ++ { ++ dim2 = ((ArrayLiteralExp *)e2)->elements->dim; ++ goto Lsa; ++ } ++ if (tx2->ty == Tsarray) + { // sa1[] = sa2[]; + // sa1[] = sa2; +- TypeSArray *tsa1 = (TypeSArray *)tx1; +- TypeSArray *tsa2 = (TypeSArray *)tx2; +- uinteger_t dim1 = tsa1->dim->toInteger(); +- uinteger_t dim2 = tsa2->dim->toInteger(); ++ // sa1[] = [ ... ]; ++ dim2 = ((TypeSArray *)tx2)->dim->toInteger(); ++ Lsa: ++ dim1 = ((TypeSArray *)tx1)->dim->toInteger(); + if (dim1 != dim2) + { + error("mismatched array lengths, %d and %d", (int)dim1, (int)dim2); +@@ -10739,15 +11927,60 @@ Ltupleassign: + e2->op == TOKcast && ((UnaExp *)e2)->e1->isLvalue() || + e2->op != TOKslice && e2->isLvalue())) + { +- checkPostblit(e2->loc, t2->nextOf()); ++ e2->checkPostblit(sc, t2->nextOf()); + } +- if (op == TOKconstruct) ++ if (0 && global.params.warnings && !global.gag && op == TOKassign && ++ e2->op != TOKslice && e2->op != TOKassign && ++ e2->op != TOKarrayliteral && e2->op != TOKstring && ++ !(e2->op == TOKadd || e2->op == TOKmin || ++ e2->op == TOKmul || e2->op == TOKdiv || ++ e2->op == TOKmod || e2->op == TOKxor || ++ e2->op == TOKand || e2->op == TOKor || ++ #if DMDV2 ++ e2->op == TOKpow || ++ #endif ++ e2->op == TOKtilde || e2->op == TOKneg)) ++ { ++ const char* e1str = e1->toChars(); ++ const char* e2str = e2->toChars(); ++ warning("explicit element-wise assignment %s = (%s)[] is better than %s = %s", ++ e1str, e2str, e1str, e2str); ++ } ++ ++ Type *t2n = t2->nextOf(); ++ Type *t1n = t1->nextOf(); ++ int offset; ++ if (t2n->immutableOf()->equals(t1n->immutableOf()) || ++ t1n->isBaseOf(t2n, &offset) && offset == 0) ++ { ++ /* Allow copy of distinct qualifier elements. ++ * eg. ++ * char[] dst; const(char)[] src; ++ * dst[] = src; ++ * ++ * class C {} class D : C {} ++ * C[2] ca; D[] da; ++ * ca[] = da; ++ */ + e2 = e2->castTo(sc, e1->type->constOf()); ++ } + else +- e2 = e2->implicitCastTo(sc, e1->type->constOf()); ++ e2 = e2->implicitCastTo(sc, e1->type); + } + else + { ++ if (0 && global.params.warnings && !global.gag && op == TOKassign && ++ t1->ty == Tarray && t2->ty == Tsarray && ++ e2->op != TOKslice && //e2->op != TOKarrayliteral && ++ t2->implicitConvTo(t1)) ++ { // Disallow ar[] = sa (Converted to ar[] = sa[]) ++ // Disallow da = sa (Converted to da = sa[]) ++ const char* e1str = e1->toChars(); ++ const char* e2str = e2->toChars(); ++ const char* atypestr = e1->op == TOKslice ? "element-wise" : "slice"; ++ warning("explicit %s assignment %s = (%s)[] is better than %s = %s", ++ atypestr, e1str, e2str, e1str, e2str); ++ } + e2 = e2->implicitCastTo(sc, e1->type); + } + if (e2->op == TOKerror) +@@ -10782,7 +12015,7 @@ Ltupleassign: + + type = e1->type; + assert(type); +- return this; ++ return op == TOKassign ? reorderSettingAAElem(sc) : this; + } + + Expression *AssignExp::checkToBoolean(Scope *sc) +@@ -10858,25 +12091,24 @@ Expression *CatAssignExp::semantic(Scope + (e2->implicitConvTo(e1->type) + #if DMDV2 + || (tb2->nextOf()->implicitConvTo(tb1next) && +- (tb2->nextOf()->size(0) == tb1next->size(0) || ++ (tb2->nextOf()->size(Loc()) == tb1next->size(Loc()) || + tb1next->ty == Tchar || tb1next->ty == Twchar || tb1next->ty == Tdchar)) + #endif + ) + ) + { // Append array +- checkPostblit(e1->loc, tb1next); ++ e1->checkPostblit(sc, tb1next); + e2 = e2->castTo(sc, e1->type); + type = e1->type; +- e = this; + } + else if ((tb1->ty == Tarray) && + e2->implicitConvTo(tb1next) + ) + { // Append element +- checkPostblit(e2->loc, tb2); ++ e2->checkPostblit(sc, tb2); + e2 = e2->castTo(sc, tb1next); ++ e2 = e2->isLvalue() ? callCpCtor(sc, e2) : valueNoDtor(e2); + type = e1->type; +- e = this; + } + else if (tb1->ty == Tarray && + (tb1next->ty == Tchar || tb1next->ty == Twchar) && +@@ -10886,7 +12118,6 @@ Expression *CatAssignExp::semantic(Scope + { // Append dchar to char[] or wchar[] + e2 = e2->castTo(sc, Type::tdchar); + type = e1->type; +- e = this; + + /* Do not allow appending wchar to char[] because if wchar happens + * to be a surrogate pair, nothing good can result. +@@ -10896,9 +12127,9 @@ Expression *CatAssignExp::semantic(Scope + { + if (tb1 != Type::terror && tb2 != Type::terror) + error("cannot append type %s to type %s", tb2->toChars(), tb1->toChars()); +- e = new ErrorExp(); ++ return new ErrorExp(); + } +- return e; ++ return reorderSettingAAElem(sc); + } + + /************************************************************/ +@@ -11005,6 +12236,9 @@ Expression *PowAssignExp::semantic(Scope + else + { + e1 = e1->modifiableLvalue(sc, e1); ++ ++ e = reorderSettingAAElem(sc); ++ if (e != this) return e; + } + + if ( (e1->type->isintegral() || e1->type->isfloating()) && +@@ -11059,6 +12293,19 @@ Expression *AddExp::semantic(Scope *sc) + Type *tb1 = e1->type->toBasetype(); + Type *tb2 = e2->type->toBasetype(); + ++ if (tb1->ty == Tdelegate || ++ tb1->ty == Tpointer && tb1->nextOf()->ty == Tfunction) ++ { ++ e = e1->checkArithmetic(); ++ } ++ if (tb2->ty == Tdelegate || ++ tb2->ty == Tpointer && tb2->nextOf()->ty == Tfunction) ++ { ++ e = e2->checkArithmetic(); ++ } ++ if (e) ++ return e; ++ + if ((tb1->ty == Tarray || tb1->ty == Tsarray) && + (tb2->ty == Tarray || tb2->ty == Tsarray) && + tb1->nextOf()->equals(tb2->nextOf()) +@@ -11068,8 +12315,10 @@ Expression *AddExp::semantic(Scope *sc) + e = this; + } + else if (tb1->ty == Tpointer && e2->type->isintegral() || +- tb2->ty == Tpointer && e1->type->isintegral()) ++ tb2->ty == Tpointer && e1->type->isintegral()) ++ { + e = scaleFactor(sc); ++ } + else if (tb1->ty == Tpointer && tb2->ty == Tpointer) + { + return incompatibleTypes(); +@@ -11135,9 +12384,23 @@ Expression *MinExp::semantic(Scope *sc) + if (e) + return e; + +- e = this; + Type *t1 = e1->type->toBasetype(); + Type *t2 = e2->type->toBasetype(); ++ ++ if (t1->ty == Tdelegate || ++ t1->ty == Tpointer && t1->nextOf()->ty == Tfunction) ++ { ++ e = e1->checkArithmetic(); ++ } ++ if (t2->ty == Tdelegate || ++ t2->ty == Tpointer && t2->nextOf()->ty == Tfunction) ++ { ++ e = e2->checkArithmetic(); ++ } ++ if (e) ++ return e; ++ ++ e = this; + if (t1->ty == Tpointer) + { + if (t2->ty == Tpointer) +@@ -11155,7 +12418,7 @@ Expression *MinExp::semantic(Scope *sc) + } + else + { +- e = new DivExp(loc, this, new IntegerExp(0, stride, Type::tptrdiff_t)); ++ e = new DivExp(loc, this, new IntegerExp(Loc(), stride, Type::tptrdiff_t)); + e->type = Type::tptrdiff_t; + } + return e; +@@ -11262,10 +12525,10 @@ Expression *CatExp::semantic(Scope *sc) + e2->implicitConvTo(tb1next) >= MATCHconvert && + tb2->ty != Tvoid) + { +- checkPostblit(e2->loc, tb2); ++ e2->checkPostblit(sc, tb2); + e2 = e2->implicitCastTo(sc, tb1next); + type = tb1next->arrayOf(); +- if (tb2->ty == Tarray) ++ if (tb2->ty == Tarray || tb2->ty == Tsarray) + { // Make e2 into [e2] + e2 = new ArrayLiteralExp(e2->loc, e2); + e2->type = type; +@@ -11276,10 +12539,10 @@ Expression *CatExp::semantic(Scope *sc) + e1->implicitConvTo(tb2next) >= MATCHconvert && + tb1->ty != Tvoid) + { +- checkPostblit(e1->loc, tb1); ++ e1->checkPostblit(sc, tb1); + e1 = e1->implicitCastTo(sc, tb2next); + type = tb2next->arrayOf(); +- if (tb1->ty == Tarray) ++ if (tb1->ty == Tarray || tb1->ty == Tsarray) + { // Make e1 into [e1] + e1 = new ArrayLiteralExp(e1->loc, e1); + e1->type = type; +@@ -11316,9 +12579,9 @@ Expression *CatExp::semantic(Scope *sc) + { + type = type->nextOf()->toHeadMutable()->arrayOf(); + } +- if (tb->nextOf()) ++ if (Type *tbn = tb->nextOf()) + { +- checkPostblit(loc, tb->nextOf()); ++ checkPostblit(sc, tbn); + } + #if 0 + e1->type->print(); +@@ -11569,104 +12832,91 @@ Expression *PowExp::semantic(Scope *sc) + } + } + +- if ( (e1->type->isintegral() || e1->type->isfloating()) && +- (e2->type->isintegral() || e2->type->isfloating())) ++ if ( !(e1->type->isintegral() || e1->type->isfloating()) || ++ !(e2->type->isintegral() || e2->type->isfloating())) + { +- // For built-in numeric types, there are several cases. +- // TODO: backend support, especially for e1 ^^ 2. ++ return incompatibleTypes(); ++ } + +- bool wantSqrt = false; ++ // For built-in numeric types, there are several cases. ++ // TODO: backend support, especially for e1 ^^ 2. + +- // First, attempt to fold the expression. +- e = optimize(WANTvalue); +- if (e->op != TOKpow) +- { +- e = e->semantic(sc); +- return e; +- } ++ bool wantSqrt = false; + +- // Determine if we're raising to an integer power. +- sinteger_t intpow = 0; +- if (e2->op == TOKint64 && ((sinteger_t)e2->toInteger() == 2 || (sinteger_t)e2->toInteger() == 3)) +- intpow = e2->toInteger(); +- else if (e2->op == TOKfloat64 && e2->toReal() == (real_t)(e2->toInteger())) +- intpow = e2->toInteger(); +- +- // Deal with x^^2, x^^3 immediately, since they are of practical importance. +- if (intpow == 2 || intpow == 3) +- { +- // Replace x^^2 with (tmp = x, tmp*tmp) +- // Replace x^^3 with (tmp = x, tmp*tmp*tmp) +- Identifier *idtmp = Lexer::uniqueId("__powtmp"); +- VarDeclaration *tmp = new VarDeclaration(loc, e1->type->toBasetype(), idtmp, new ExpInitializer(0, e1)); +- tmp->storage_class = STCctfe; +- Expression *ve = new VarExp(loc, tmp); +- Expression *ae = new DeclarationExp(loc, tmp); +- /* Note that we're reusing ve. This should be ok. +- */ +- Expression *me = new MulExp(loc, ve, ve); +- if (intpow == 3) +- me = new MulExp(loc, me, ve); +- e = new CommaExp(loc, ae, me); +- e = e->semantic(sc); +- return e; +- } ++ // First, attempt to fold the expression. ++ e = optimize(WANTvalue); ++ if (e->op != TOKpow) ++ { ++ e = e->semantic(sc); ++ return e; ++ } + +- static int importMathChecked = 0; +- static bool importMath = false; +- if (!importMathChecked) +- { +- importMathChecked = 1; +- for (size_t i = 0; i < Module::amodules.dim; i++) +- { Module *mi = Module::amodules[i]; +- //printf("\t[%d] %s\n", i, mi->toChars()); +- if (mi->ident == Id::math && +- mi->parent->ident == Id::std && +- !mi->parent->parent) +- { +- importMath = true; +- goto L1; +- } +- } +-#ifndef IN_GCC +- error("must import std.math to use ^^ operator"); +- return new ErrorExp(); +-#endif ++ // Determine if we're raising to an integer power. ++ sinteger_t intpow = 0; ++ if (e2->op == TOKint64 && ((sinteger_t)e2->toInteger() == 2 || (sinteger_t)e2->toInteger() == 3)) ++ intpow = e2->toInteger(); ++ else if (e2->op == TOKfloat64 && (e2->toReal() == (sinteger_t)(e2->toReal()))) ++ intpow = (sinteger_t)(e2->toReal()); ++ ++ // Deal with x^^2, x^^3 immediately, since they are of practical importance. ++ if (intpow == 2 || intpow == 3) ++ { ++ // Replace x^^2 with (tmp = x, tmp*tmp) ++ // Replace x^^3 with (tmp = x, tmp*tmp*tmp) ++ Identifier *idtmp = Lexer::uniqueId("__powtmp"); ++ VarDeclaration *tmp = new VarDeclaration(loc, e1->type->toBasetype(), idtmp, new ExpInitializer(Loc(), e1)); ++ tmp->storage_class = STCctfe; ++ Expression *ve = new VarExp(loc, tmp); ++ Expression *ae = new DeclarationExp(loc, tmp); ++ /* Note that we're reusing ve. This should be ok. ++ */ ++ Expression *me = new MulExp(loc, ve, ve); ++ if (intpow == 3) ++ me = new MulExp(loc, me, ve); ++ e = new CommaExp(loc, ae, me); ++ e = e->semantic(sc); ++ return e; ++ } + +- L1: ; +- } +- else +- { +- if (!importMath) ++ static int importMathChecked = 0; ++ static bool importMath = false; ++ if (!importMathChecked) ++ { ++ importMathChecked = 1; ++ for (size_t i = 0; i < Module::amodules.dim; i++) ++ { Module *mi = Module::amodules[i]; ++ //printf("\t[%d] %s\n", i, mi->toChars()); ++ if (mi->ident == Id::math && ++ mi->parent->ident == Id::std && ++ !mi->parent->parent) + { +-#ifdef IN_GCC +- // GDC handles PowExp in backend. +- typeCombine(sc); +- e = this; +- return e; +-#else +- error("must import std.math to use ^^ operator"); +- return new ErrorExp(); +-#endif ++ importMath = true; ++ break; + } + } +- +- e = new IdentifierExp(loc, Id::empty); +- e = new DotIdExp(loc, e, Id::std); +- e = new DotIdExp(loc, e, Id::math); +- if (e2->op == TOKfloat64 && e2->toReal() == 0.5) +- { // Replace e1 ^^ 0.5 with .std.math.sqrt(x) +- e = new CallExp(loc, new DotIdExp(loc, e, Id::_sqrt), e1); +- } +- else +- { +- // Replace e1 ^^ e2 with .std.math.pow(e1, e2) +- e = new CallExp(loc, new DotIdExp(loc, e, Id::_pow), e1, e2); +- } +- e = e->semantic(sc); ++ } ++ if (!importMath) ++ { // Leave handling of PowExp to the backend, or throw ++ // an error gracefully if no backend support exists. ++ typeCombine(sc); ++ e = this; + return e; + } +- return incompatibleTypes(); ++ ++ e = new IdentifierExp(loc, Id::empty); ++ e = new DotIdExp(loc, e, Id::std); ++ e = new DotIdExp(loc, e, Id::math); ++ if (e2->op == TOKfloat64 && e2->toReal() == 0.5) ++ { // Replace e1 ^^ 0.5 with .std.math.sqrt(x) ++ e = new CallExp(loc, new DotIdExp(loc, e, Id::_sqrt), e1); ++ } ++ else ++ { ++ // Replace e1 ^^ e2 with .std.math.pow(e1, e2) ++ e = new CallExp(loc, new DotIdExp(loc, e, Id::_pow), e1, e2); ++ } ++ e = e->semantic(sc); ++ return e; + } + + /************************************************************/ +@@ -12054,7 +13304,7 @@ void RemoveExp::toCBuffer(OutBuffer *buf + + /************************************************************/ + +-CmpExp::CmpExp(enum TOK op, Loc loc, Expression *e1, Expression *e2) ++CmpExp::CmpExp(TOK op, Loc loc, Expression *e1, Expression *e2) + : BinExp(loc, op, sizeof(CmpExp), e1, e2) + { + } +@@ -12103,9 +13353,6 @@ Expression *CmpExp::semantic(Scope *sc) + return new ErrorExp(); + } + +- Expression *eb1 = e1; +- Expression *eb2 = e2; +- + e = typeCombine(sc); + if (e->op == TOKerror) + return e; +@@ -12140,6 +13387,11 @@ Expression *CmpExp::semantic(Scope *sc) + error("compare not defined for complex operands"); + e = new ErrorExp(); + } ++ else if (t1->ty == Taarray || t2->ty == Taarray) ++ { ++ error("%s is not defined for associative arrays", Token::toChars(op)); ++ e = new ErrorExp(); ++ } + else if (t1->ty == Tvector) + return incompatibleTypes(); + else +@@ -12159,7 +13411,7 @@ int CmpExp::isBit() + + /************************************************************/ + +-EqualExp::EqualExp(enum TOK op, Loc loc, Expression *e1, Expression *e2) ++EqualExp::EqualExp(TOK op, Loc loc, Expression *e1, Expression *e2) + : BinExp(loc, op, sizeof(EqualExp), e1, e2) + { + assert(op == TOKequal || op == TOKnotequal); +@@ -12189,7 +13441,7 @@ int needDirectEq(Type *t1, Type *t2) + if (t->ty != Tstruct) + return FALSE; + +- return ((TypeStruct *)t)->sym->xeq == StructDeclaration::xerreq; ++ return ((TypeStruct *)t)->sym->hasIdentityEquals; + } + + Expression *EqualExp::semantic(Scope *sc) +@@ -12201,16 +13453,20 @@ Expression *EqualExp::semantic(Scope *sc + + BinExp::semanticp(sc); + ++ if (e1->op == TOKtype || e2->op == TOKtype) ++ return incompatibleTypes(); ++ + /* Before checking for operator overloading, check to see if we're + * comparing the addresses of two statics. If so, we can just see + * if they are the same symbol. + */ + if (e1->op == TOKaddress && e2->op == TOKaddress) +- { AddrExp *ae1 = (AddrExp *)e1; ++ { ++ AddrExp *ae1 = (AddrExp *)e1; + AddrExp *ae2 = (AddrExp *)e2; +- + if (ae1->e1->op == TOKvar && ae2->e1->op == TOKvar) +- { VarExp *ve1 = (VarExp *)ae1->e1; ++ { ++ VarExp *ve1 = (VarExp *)ae1->e1; + VarExp *ve2 = (VarExp *)ae2->e1; + + if (ve1->var == ve2->var /*|| ve1->var->toSymbol() == ve2->var->toSymbol()*/) +@@ -12279,6 +13535,63 @@ Expression *EqualExp::semantic(Scope *sc + return new ErrorExp(); + } + ++ if (t1->ty == Tstruct && t2->ty == Tstruct) ++ { ++ StructDeclaration *sd = ((TypeStruct *)t1)->sym; ++ if (sd == ((TypeStruct *)t2)->sym) ++ { ++ if (sd->needOpEquals()) ++ { ++ this->e1 = new DotIdExp(loc, e1, Id::tupleof); ++ this->e2 = new DotIdExp(loc, e2, Id::tupleof); ++ e = this; ++ } ++ else ++ { ++ e = new IdentityExp(op == TOKequal ? TOKidentity : TOKnotidentity, loc, e1, e2); ++ } ++ e = e->semantic(sc); ++ return e; ++ } ++ } ++ ++ // check tuple equality before typeCombine ++ if (e1->op == TOKtuple && e2->op == TOKtuple) ++ { ++ TupleExp *tup1 = (TupleExp *)e1; ++ TupleExp *tup2 = (TupleExp *)e2; ++ size_t dim = tup1->exps->dim; ++ Expression *e = NULL; ++ if (dim != tup2->exps->dim) ++ { ++ error("mismatched tuple lengths, %d and %d", (int)dim, (int)tup2->exps->dim); ++ return new ErrorExp(); ++ } ++ if (dim == 0) ++ { ++ // zero-length tuple comparison should always return true or false. ++ e = new IntegerExp(loc, (op == TOKequal), Type::tboolean); ++ } ++ else ++ { ++ for (size_t i = 0; i < dim; i++) ++ { ++ Expression *ex1 = (*tup1->exps)[i]; ++ Expression *ex2 = (*tup2->exps)[i]; ++ Expression *eeq = new EqualExp(op, loc, ex1, ex2); ++ if (!e) ++ e = eeq; ++ else if (op == TOKequal) ++ e = new AndAndExp(loc, e, eeq); ++ else ++ e = new OrOrExp(loc, e, eeq); ++ } ++ } ++ assert(e); ++ e = combine(combine(tup1->e0, tup2->e0), e); ++ return e->semantic(sc); ++ } ++ + e = typeCombine(sc); + if (e->op == TOKerror) + return e; +@@ -12311,7 +13624,7 @@ int EqualExp::isBit() + + /************************************************************/ + +-IdentityExp::IdentityExp(enum TOK op, Loc loc, Expression *e1, Expression *e2) ++IdentityExp::IdentityExp(TOK op, Loc loc, Expression *e1, Expression *e2) + : BinExp(loc, op, sizeof(IdentityExp), e1, e2) + { + } +@@ -12362,11 +13675,7 @@ Expression *CondExp::syntaxCopy() + + + Expression *CondExp::semantic(Scope *sc) +-{ Type *t1; +- Type *t2; +- unsigned cs0; +- unsigned cs1; +- ++{ + #if LOGSEMANTIC + printf("CondExp::semantic('%s')\n", toChars()); + #endif +@@ -12378,19 +13687,32 @@ Expression *CondExp::semantic(Scope *sc) + econd = econd->checkToPointer(); + econd = econd->checkToBoolean(sc); + +- cs0 = sc->callSuper; ++ unsigned cs0 = sc->callSuper; ++ unsigned *fi0 = fi0 = sc->saveFieldInit(); + e1 = e1->semantic(sc); + e1 = resolveProperties(sc, e1); +- cs1 = sc->callSuper; ++ ++ unsigned cs1 = sc->callSuper; ++ unsigned *fi1 = sc->fieldinit; + sc->callSuper = cs0; ++ sc->fieldinit = fi0; + e2 = e2->semantic(sc); + e2 = resolveProperties(sc, e2); ++ + sc->mergeCallSuper(loc, cs1); ++ sc->mergeFieldInit(loc, fi1); ++ ++ if (econd->type == Type::terror) ++ return econd; ++ if (e1->type == Type::terror) ++ return e1; ++ if (e2->type == Type::terror) ++ return e2; + + + // If either operand is void, the result is void +- t1 = e1->type; +- t2 = e2->type; ++ Type *t1 = e1->type; ++ Type *t2 = e2->type; + if (t1->ty == Tvoid || t2->ty == Tvoid) + type = Type::tvoid; + else if (t1 == t2) +@@ -12420,6 +13742,7 @@ Expression *CondExp::semantic(Scope *sc) + e2 = e2->castTo(sc, type); + } + } ++ type = type->merge2(); + #if 0 + printf("res: %s\n", type->toChars()); + printf("e1 : %s\n", e1->type->toChars()); +@@ -12496,7 +13819,7 @@ void CondExp::toCBuffer(OutBuffer *buf, + + /****************************************************************/ + +-DefaultInitExp::DefaultInitExp(Loc loc, enum TOK subop, int size) ++DefaultInitExp::DefaultInitExp(Loc loc, TOK subop, int size) + : Expression(loc, TOKdefault, size) + { + this->subop = subop; +@@ -12517,7 +13840,7 @@ FileInitExp::FileInitExp(Loc loc) + Expression *FileInitExp::semantic(Scope *sc) + { + //printf("FileInitExp::semantic()\n"); +- type = Type::tchar->invariantOf()->arrayOf(); ++ type = Type::tstring; + return this; + } + +@@ -12551,15 +13874,144 @@ Expression *LineInitExp::resolveLoc(Loc + return e; + } + ++/****************************************************************/ ++ ++ModuleInitExp::ModuleInitExp(Loc loc) ++ : DefaultInitExp(loc, TOKmodulestring, sizeof(ModuleInitExp)) ++{ ++} ++ ++Expression *ModuleInitExp::semantic(Scope *sc) ++{ ++ //printf("ModuleInitExp::semantic()\n"); ++ type = Type::tstring; ++ return this; ++} ++ ++Expression *ModuleInitExp::resolveLoc(Loc loc, Scope *sc) ++{ ++ const char *s; ++ if (sc->callsc) ++ s = sc->callsc->module->toPrettyChars(); ++ else ++ s = sc->module->toPrettyChars(); ++ Expression *e = new StringExp(loc, (char *)s); ++ e = e->semantic(sc); ++ e = e->castTo(sc, type); ++ return e; ++} ++ ++/****************************************************************/ ++ ++FuncInitExp::FuncInitExp(Loc loc) ++ : DefaultInitExp(loc, TOKfuncstring, sizeof(FuncInitExp)) ++{ ++} ++ ++Expression *FuncInitExp::semantic(Scope *sc) ++{ ++ //printf("FuncInitExp::semantic()\n"); ++ type = Type::tstring; ++ if (sc->func) return this->resolveLoc(Loc(), sc); ++ return this; ++} ++ ++Expression *FuncInitExp::resolveLoc(Loc loc, Scope *sc) ++{ ++ const char *s; ++ if (sc->callsc && sc->callsc->func) ++ s = sc->callsc->func->Dsymbol::toPrettyChars(); ++ else if (sc->func) ++ s = sc->func->Dsymbol::toPrettyChars(); ++ else ++ s = ""; ++ Expression *e = new StringExp(loc, (char *)s); ++ e = e->semantic(sc); ++ e = e->castTo(sc, type); ++ return e; ++} ++ ++/****************************************************************/ ++ ++PrettyFuncInitExp::PrettyFuncInitExp(Loc loc) ++ : DefaultInitExp(loc, TOKprettyfunc, sizeof(PrettyFuncInitExp)) ++{ ++} ++ ++Expression *PrettyFuncInitExp::semantic(Scope *sc) ++{ ++ //printf("PrettyFuncInitExp::semantic()\n"); ++ type = Type::tstring; ++ if (sc->func) return this->resolveLoc(Loc(), sc); ++ return this; ++} ++ ++Expression *PrettyFuncInitExp::resolveLoc(Loc loc, Scope *sc) ++{ ++ FuncDeclaration *fd; ++ if (sc->callsc && sc->callsc->func) ++ fd = sc->callsc->func; ++ else ++ fd = sc->func; ++ ++ const char *s; ++ if (fd) ++ { ++ const char *funcStr = fd->Dsymbol::toPrettyChars(); ++ HdrGenState hgs; ++ OutBuffer buf; ++ functionToCBuffer2((TypeFunction *)fd->type, &buf, &hgs, 0, funcStr); ++ buf.writebyte(0); ++ s = (const char *)buf.extractData(); ++ } ++ else ++ { ++ s = ""; ++ } ++ ++ Expression *e = new StringExp(loc, (char *)s); ++ e = e->semantic(sc); ++ e = e->castTo(sc, type); ++ return e; ++} ++ ++Expression *extractOpDollarSideEffect(Scope *sc, UnaExp *ue) ++{ ++ Expression *e0 = NULL; ++ if (ue->e1->hasSideEffect()) ++ { ++ /* Even if opDollar is needed, 'ue->e1' should be evaluate only once. So ++ * Rewrite: ++ * ue->e1.opIndex( ... use of $ ... ) ++ * ue->e1.opSlice( ... use of $ ... ) ++ * as: ++ * (ref __dop = ue->e1, __dop).opIndex( ... __dop.opDollar ...) ++ * (ref __dop = ue->e1, __dop).opSlice( ... __dop.opDollar ...) ++ */ ++ Identifier *id = Lexer::uniqueId("__dop"); ++ ExpInitializer *ei = new ExpInitializer(ue->loc, ue->e1); ++ VarDeclaration *v = new VarDeclaration(ue->loc, ue->e1->type, id, ei); ++ v->storage_class |= STCctfe ++ | (ue->e1->isLvalue() ? (STCforeach | STCref) : 0); ++ e0 = new DeclarationExp(ue->loc, v); ++ e0 = e0->semantic(sc); ++ ue->e1 = new VarExp(ue->loc, v); ++ ue->e1 = ue->e1->semantic(sc); ++ } ++ return e0; ++} ++ + /************************************** + * Runs semantic on ae->arguments. Declares temporary variables + * if '$' was used. + */ + +-ArrayExp *resolveOpDollar(Scope *sc, ArrayExp *ae) ++Expression *resolveOpDollar(Scope *sc, ArrayExp *ae) + { + assert(!ae->lengthVar); + ++ Expression *e0 = extractOpDollarSideEffect(sc, ae); ++ + for (size_t i = 0; i < ae->arguments->dim; i++) + { + // Create scope for '$' variable for this dimension +@@ -12575,16 +14027,18 @@ ArrayExp *resolveOpDollar(Scope *sc, Arr + e = resolveProperties(sc, e); + if (!e->type) + ae->error("%s has no value", e->toChars()); +- if (ae->lengthVar) +- { // If $ was used, declare it now ++ if (ae->lengthVar && sc->func) ++ { ++ // If $ was used, declare it now + Expression *de = new DeclarationExp(ae->loc, ae->lengthVar); +- e = new CommaExp(0, de, e); ++ e = new CommaExp(Loc(), de, e); + e = e->semantic(sc); + } + (*ae->arguments)[i] = e; + sc = sc->pop(); + } +- return ae; ++ ++ return e0; + } + + /************************************** +@@ -12592,12 +14046,14 @@ ArrayExp *resolveOpDollar(Scope *sc, Arr + * if '$' was used. + */ + +-SliceExp *resolveOpDollar(Scope *sc, SliceExp *se) ++Expression *resolveOpDollar(Scope *sc, SliceExp *se) + { + assert(!se->lengthVar); + assert(!se->lwr || se->upr); + +- if (!se->lwr) return se; ++ if (!se->lwr) return NULL; ++ ++ Expression *e0 = extractOpDollarSideEffect(sc, se); + + // create scope for '$' + ArrayScopeSymbol *sym = new ArrayScopeSymbol(sc, se); +@@ -12612,15 +14068,78 @@ SliceExp *resolveOpDollar(Scope *sc, Sli + e = resolveProperties(sc, e); + if (!e->type) + se->error("%s has no value", e->toChars()); +- i == 0 ? se->lwr : se->upr = e; ++ (i == 0 ? se->lwr : se->upr) = e; + } + +- if (se->lengthVar) +- { // If $ was used, declare it now ++ if (se->lengthVar && sc->func) ++ { ++ // If $ was used, declare it now + Expression *de = new DeclarationExp(se->loc, se->lengthVar); +- se->lwr = new CommaExp(0, de, se->lwr); ++ se->lwr = new CommaExp(Loc(), de, se->lwr); + se->lwr = se->lwr->semantic(sc); + } + sc = sc->pop(); +- return se; ++ ++ return e0; ++} ++ ++Expression *BinExp::reorderSettingAAElem(Scope *sc) ++{ ++ if (this->e1->op != TOKindex) ++ return this; ++ IndexExp *ie = (IndexExp *)e1; ++ Type *t1 = ie->e1->type->toBasetype(); ++ if (t1->ty != Taarray) ++ return this; ++ ++ /* Check recursive conversion */ ++ VarDeclaration *var; ++ bool isrefvar = (e2->op == TOKvar && ++ (var = ((VarExp *)e2)->var->isVarDeclaration()) != NULL && ++ (var->storage_class & STCref)); ++ if (isrefvar) ++ return this; ++ ++ /* Fix evaluation order of setting AA element. (Bugzilla 3825) ++ * Rewrite: ++ * aa[key] op= val; ++ * as: ++ * ref __aatmp = aa; ++ * ref __aakey = key; ++ * ref __aaval = val; ++ * __aatmp[__aakey] op= __aaval; // assignment ++ */ ++ Expression *ec = NULL; ++ if (ie->e1->hasSideEffect()) ++ { ++ Identifier *id = Lexer::uniqueId("__aatmp"); ++ VarDeclaration *vd = new VarDeclaration(ie->e1->loc, ie->e1->type, id, new ExpInitializer(ie->e1->loc, ie->e1)); ++ Expression *de = new DeclarationExp(ie->e1->loc, vd); ++ if (ie->e1->isLvalue()) ++ vd->storage_class |= STCref | STCforeach; ++ ec = de; ++ ie->e1 = new VarExp(ie->e1->loc, vd); ++ } ++ if (ie->e2->hasSideEffect()) ++ { ++ Identifier *id = Lexer::uniqueId("__aakey"); ++ VarDeclaration *vd = new VarDeclaration(ie->e2->loc, ie->e2->type, id, new ExpInitializer(ie->e2->loc, ie->e2)); ++ if (ie->e2->isLvalue()) ++ vd->storage_class |= STCref | STCforeach; ++ Expression *de = new DeclarationExp(ie->e2->loc, vd); ++ ++ ec = ec ? new CommaExp(loc, ec, de) : de; ++ ie->e2 = new VarExp(ie->e2->loc, vd); ++ } ++ { ++ Identifier *id = Lexer::uniqueId("__aaval"); ++ VarDeclaration *vd = new VarDeclaration(loc, this->e2->type, id, new ExpInitializer(this->e2->loc, this->e2)); ++ vd->storage_class |= STCref | STCforeach | (this->e2->isLvalue() ? 0 : STCtemp); ++ Expression *de = new DeclarationExp(this->e2->loc, vd); ++ ++ ec = ec ? new CommaExp(loc, ec, de) : de; ++ this->e2 = new VarExp(this->e2->loc, vd); ++ } ++ ec = new CommaExp(loc, ec, this); ++ return ec->semantic(sc); + } +--- a/src/gcc/d/dfrontend/expression.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/expression.h 2014-04-01 16:32:51.000000000 +0100 +@@ -17,48 +17,53 @@ + #include "arraytypes.h" + #include "intrange.h" + +-struct Type; +-struct TypeVector; ++class Type; ++class TypeVector; + struct Scope; +-struct TupleDeclaration; +-struct VarDeclaration; +-struct FuncDeclaration; +-struct FuncLiteralDeclaration; +-struct Declaration; +-struct CtorDeclaration; +-struct NewDeclaration; +-struct Dsymbol; +-struct Import; +-struct Module; +-struct ScopeDsymbol; ++class TupleDeclaration; ++class VarDeclaration; ++class FuncDeclaration; ++class FuncLiteralDeclaration; ++class Declaration; ++class CtorDeclaration; ++class NewDeclaration; ++class Dsymbol; ++class Import; ++class Module; ++class ScopeDsymbol; + struct InlineCostState; + struct InlineDoState; + struct InlineScanState; +-struct Expression; +-struct Declaration; +-struct AggregateDeclaration; +-struct StructDeclaration; +-struct TemplateInstance; +-struct TemplateDeclaration; +-struct ClassDeclaration; ++class Expression; ++class Declaration; ++class AggregateDeclaration; ++class StructDeclaration; ++class TemplateInstance; ++class TemplateDeclaration; ++class ClassDeclaration; + struct HdrGenState; +-struct BinExp; ++class BinExp; + struct InterState; + struct Symbol; // back end symbol +-struct OverloadSet; +-struct Initializer; +-struct StringExp; ++class OverloadSet; ++class Initializer; ++class StringExp; ++class ArrayExp; ++class SliceExp; + + enum TOK; + + // Back end + struct IRState; +- + #ifdef IN_GCC +-typedef union tree_node elem; + typedef union tree_node dt_t; + #else + struct dt_t; ++#endif ++ ++#ifdef IN_GCC ++typedef union tree_node elem; ++#else + struct elem; + #endif + +@@ -67,6 +72,7 @@ void initPrecedence(); + typedef int (*apply_fp_t)(Expression *, void *); + + Expression *resolveProperties(Scope *sc, Expression *e); ++Expression *resolvePropertiesOnly(Scope *sc, Expression *e1); + void accessCheck(Loc loc, Scope *sc, Expression *e, Declaration *d); + Expression *build_overload(Loc loc, Scope *sc, Expression *ethis, Expression *earg, Dsymbol *d); + Dsymbol *search_function(ScopeDsymbol *ad, Identifier *funcid); +@@ -79,17 +85,21 @@ FuncDeclaration *hasThis(Scope *sc); + Expression *fromConstInitializer(int result, Expression *e); + int arrayExpressionCanThrow(Expressions *exps, bool mustNotThrow); + TemplateDeclaration *getFuncTemplateDecl(Dsymbol *s); +-void valueNoDtor(Expression *e); ++Expression *valueNoDtor(Expression *e); + int modifyFieldVar(Loc loc, Scope *sc, VarDeclaration *var, Expression *e1); + #if DMDV2 + Expression *resolveAliasThis(Scope *sc, Expression *e); +-Expression *callCpCtor(Loc loc, Scope *sc, Expression *e, int noscope); +-int checkPostblit(Loc loc, Type *t); ++Expression *callCpCtor(Scope *sc, Expression *e); + #endif +-struct ArrayExp *resolveOpDollar(Scope *sc, struct ArrayExp *ae); +-struct SliceExp *resolveOpDollar(Scope *sc, struct SliceExp *se); ++Expression *resolveOpDollar(Scope *sc, ArrayExp *ae); ++Expression *resolveOpDollar(Scope *sc, SliceExp *se); + Expressions *arrayExpressionSemantic(Expressions *exps, Scope *sc); + ++/* Run CTFE on the expression, but allow the expression to be a TypeExp ++ * or a tuple containing a TypeExp. (This is required by pragma(msg)). ++ */ ++Expression *ctfeInterpretForPragmaMsg(Expression *e); ++ + /* Interpreter: what form of return value expression is required? + */ + enum CtfeGoal +@@ -100,15 +110,22 @@ enum CtfeGoal + ctfeNeedNothing // The return value is not required + }; + +-struct Expression : Object ++#define WANTflags 1 ++#define WANTvalue 2 ++// Same as WANTvalue, but also expand variables as far as possible ++#define WANTexpand 8 ++ ++class Expression : public RootObject + { ++public: + Loc loc; // file location +- enum TOK op; // handy to minimize use of dynamic_cast ++ TOK op; // handy to minimize use of dynamic_cast + Type *type; // !=NULL means that semantic() has been run + unsigned char size; // # of bytes in Expression so we can copy() it + unsigned char parens; // if this is a parenthesized expression + +- Expression(Loc loc, enum TOK op, int size); ++ Expression(Loc loc, TOK op, int size); ++ static void init(); + Expression *copy(); + virtual Expression *syntaxCopy(); + virtual int apply(apply_fp_t fp, void *param); +@@ -143,7 +160,7 @@ struct Expression : Object + virtual MATCH implicitConvTo(Type *t); + virtual IntRange getIntRange(); + virtual Expression *castTo(Scope *sc, Type *t); +- virtual Expression *inferType(Type *t, int flag = 0, TemplateParameters *tparams = NULL); ++ virtual Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL); + virtual void checkEscape(); + virtual void checkEscapeRef(); + virtual Expression *resolveLoc(Loc loc, Scope *sc); +@@ -153,8 +170,9 @@ struct Expression : Object + Expression *checkArithmetic(); + void checkDeprecated(Scope *sc, Dsymbol *s); + void checkPurity(Scope *sc, FuncDeclaration *f); +- void checkPurity(Scope *sc, VarDeclaration *v, Expression *e1); ++ void checkPurity(Scope *sc, VarDeclaration *v); + void checkSafety(Scope *sc, FuncDeclaration *f); ++ bool checkPostblit(Scope *sc, Type *t); + virtual int checkModifiable(Scope *sc, int flag = 0); + virtual Expression *checkToBoolean(Scope *sc); + virtual Expression *addDtorHook(Scope *sc); +@@ -167,12 +185,6 @@ struct Expression : Object + Expression *toDelegate(Scope *sc, Type *t); + + virtual Expression *optimize(int result, bool keepLvalue = false); +- #define WANTflags 1 +- #define WANTvalue 2 +- // A compile-time result is required. Give an error if not possible +- #define WANTinterpret 4 +- // Same as WANTvalue, but also expand variables as far as possible +- #define WANTexpand 8 + + // Entry point for CTFE. + // A compile-time result is required. Give an error if not possible +@@ -210,13 +222,14 @@ struct Expression : Object + virtual dt_t **toDt(dt_t **pdt); + }; + +-struct IntegerExp : Expression ++class IntegerExp : public Expression + { ++public: + dinteger_t value; + + IntegerExp(Loc loc, dinteger_t value, Type *type); + IntegerExp(dinteger_t value); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + char *toChars(); +@@ -236,22 +249,25 @@ struct IntegerExp : Expression + dt_t **toDt(dt_t **pdt); + }; + +-struct ErrorExp : IntegerExp ++class ErrorExp : public IntegerExp + { ++public: + ErrorExp(); + + Expression *implicitCastTo(Scope *sc, Type *t); ++ MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Expression *toLvalue(Scope *sc, Expression *e); + }; + +-struct RealExp : Expression ++class RealExp : public Expression + { ++public: + real_t value; + + RealExp(Loc loc, real_t value, Type *type); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + char *toChars(); +@@ -269,12 +285,13 @@ struct RealExp : Expression + dt_t **toDt(dt_t **pdt); + }; + +-struct ComplexExp : Expression ++class ComplexExp : public Expression + { ++public: + complex_t value; + + ComplexExp(Loc loc, complex_t value, Type *type); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + char *toChars(); +@@ -288,18 +305,17 @@ struct ComplexExp : Expression + int isBool(int result); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void toMangleBuffer(OutBuffer *buf); +- OutBuffer hexp; + elem *toElem(IRState *irs); + dt_t **toDt(dt_t **pdt); + }; + +-struct IdentifierExp : Expression ++class IdentifierExp : public Expression + { ++public: + Identifier *ident; + Declaration *var; + + IdentifierExp(Loc loc, Identifier *ident); +- IdentifierExp(Loc loc, Declaration *var); + Expression *semantic(Scope *sc); + char *toChars(); + void dump(int indent); +@@ -308,17 +324,19 @@ struct IdentifierExp : Expression + Expression *toLvalue(Scope *sc, Expression *e); + }; + +-struct DollarExp : IdentifierExp ++class DollarExp : public IdentifierExp + { ++public: + DollarExp(Loc loc); + }; + +-struct DsymbolExp : Expression ++class DsymbolExp : public Expression + { ++public: + Dsymbol *s; +- int hasOverloads; ++ bool hasOverloads; + +- DsymbolExp(Loc loc, Dsymbol *s, int hasOverloads = 0); ++ DsymbolExp(Loc loc, Dsymbol *s, bool hasOverloads = false); + Expression *semantic(Scope *sc); + char *toChars(); + void dump(int indent); +@@ -327,8 +345,9 @@ struct DsymbolExp : Expression + Expression *toLvalue(Scope *sc, Expression *e); + }; + +-struct ThisExp : Expression ++class ThisExp : public Expression + { ++public: + Declaration *var; + + ThisExp(Loc loc); +@@ -347,8 +366,9 @@ struct ThisExp : Expression + elem *toElem(IRState *irs); + }; + +-struct SuperExp : ThisExp ++class SuperExp : public ThisExp + { ++public: + SuperExp(Loc loc); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -357,12 +377,13 @@ struct SuperExp : ThisExp + //Expression *inlineScan(InlineScanState *iss); + }; + +-struct NullExp : Expression ++class NullExp : public Expression + { ++public: + unsigned char committed; // !=0 if type is committed + + NullExp(Loc loc, Type *t = NULL); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + int isBool(int result); + int isConst(); +@@ -376,20 +397,21 @@ struct NullExp : Expression + dt_t **toDt(dt_t **pdt); + }; + +-struct StringExp : Expression ++class StringExp : public Expression + { ++public: + void *string; // char, wchar, or dchar data + size_t len; // number of chars, wchars, or dchars + unsigned char sz; // 1: char, 2: wchar, 4: dchar + unsigned char committed; // !=0 if type is committed +- unsigned char postfix; // 'c', 'w', 'd' ++ utf8_t postfix; // 'c', 'w', 'd' + bool ownedByCtfe; // true = created in CTFE + + StringExp(Loc loc, char *s); + StringExp(Loc loc, void *s, size_t len); +- StringExp(Loc loc, void *s, size_t len, unsigned char postfix); ++ StringExp(Loc loc, void *s, size_t len, utf8_t postfix); + //Expression *syntaxCopy(); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + size_t length(); +@@ -398,7 +420,7 @@ struct StringExp : Expression + Expression *implicitCastTo(Scope *sc, Type *t); + MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); +- int compare(Object *obj); ++ int compare(RootObject *obj); + int isBool(int result); + int isLvalue(); + Expression *toLvalue(Scope *sc, Expression *e); +@@ -412,15 +434,25 @@ struct StringExp : Expression + + // Tuple + +-struct TupleExp : Expression ++class TupleExp : public Expression + { ++public: ++ Expression *e0; // side-effect part ++ /* Tuple-field access may need to take out its side effect part. ++ * For example: ++ * foo().tupleof ++ * is rewritten as: ++ * (ref __tup = foo(); tuple(__tup.field0, __tup.field1, ...)) ++ * The declaration of temporary variable __tup will be stored in TupleExp::e0. ++ */ + Expressions *exps; + ++ TupleExp(Loc loc, Expression *e0, Expressions *exps); + TupleExp(Loc loc, Expressions *exps); + TupleExp(Loc loc, TupleDeclaration *tup); + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); +- int equals(Object *o); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void checkEscape(); +@@ -433,8 +465,9 @@ struct TupleExp : Expression + Expression *inlineScan(InlineScanState *iss); + }; + +-struct ArrayLiteralExp : Expression ++class ArrayLiteralExp : public Expression + { ++public: + Expressions *elements; + bool ownedByCtfe; // true = created in CTFE + +@@ -443,6 +476,7 @@ struct ArrayLiteralExp : Expression + + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + int isBool(int result); + elem *toElem(IRState *irs); +@@ -453,15 +487,19 @@ struct ArrayLiteralExp : Expression + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); +- Expression *inferType(Type *t, int flag = 0, TemplateParameters *tparams = NULL); ++ Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL); + dt_t **toDt(dt_t **pdt); + ++ void buildArrayIdent(OutBuffer *buf, Expressions *arguments); ++ Expression *buildArrayLoop(Parameters *fparams); ++ + Expression *doInline(InlineDoState *ids); + Expression *inlineScan(InlineScanState *iss); + }; + +-struct AssocArrayLiteralExp : Expression ++class AssocArrayLiteralExp : public Expression + { ++public: + Expressions *keys; + Expressions *values; + bool ownedByCtfe; // true = created in CTFE +@@ -479,14 +517,28 @@ struct AssocArrayLiteralExp : Expression + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); +- Expression *inferType(Type *t, int flag = 0, TemplateParameters *tparams = NULL); ++ Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL); + + Expression *doInline(InlineDoState *ids); + Expression *inlineScan(InlineScanState *iss); + }; + +-struct StructLiteralExp : Expression ++// scrubReturnValue is running ++#define stageScrub 0x1 ++// hasNonConstPointers is running ++#define stageSearchPointers 0x2 ++// optimize is running ++#define stageOptimize 0x4 ++// apply is running ++#define stageApply 0x8 ++//inlineScan is running ++#define stageInlineScan 0x10 ++// toCBuffer is running ++#define stageToCBuffer 0x20 ++ ++class StructLiteralExp : public Expression + { ++public: + StructDeclaration *sd; // which aggregate this is for + Expressions *elements; // parallels sd->fields[] with + // NULL entries for fields to skip +@@ -497,13 +549,24 @@ struct StructLiteralExp : Expression + size_t soffset; // offset from start of s + int fillHoles; // fill alignment 'holes' with zero + bool ownedByCtfe; // true = created in CTFE +- int ctorinit; + +- StructLiteralExp(Loc loc, StructDeclaration *sd, Expressions *elements, Type *stype = NULL); ++ StructLiteralExp *origin; // pointer to the origin instance of the expression. ++ // once a new expression is created, origin is set to 'this'. ++ // anytime when an expression copy is created, 'origin' pointer is set to ++ // 'origin' pointer value of the original expression. ++ ++ StructLiteralExp *inlinecopy; // those fields need to prevent a infinite recursion when one field of struct initialized with 'this' pointer. ++ int stageflags; // anytime when recursive function is calling, 'stageflags' marks with bit flag of ++ // current stage and unmarks before return from this function. ++ // 'inlinecopy' uses similar 'stageflags' and from multiple evaluation 'doInline' ++ // (with infinite recursion) of this expression. + ++ StructLiteralExp(Loc loc, StructDeclaration *sd, Expressions *elements, Type *stype = NULL); ++ bool equals(RootObject *o); + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); + Expression *semantic(Scope *sc); ++ Expression *fill(bool ctorinit); + Expression *getField(Type *type, unsigned offset); + int getFieldIndex(Type *type, unsigned offset); + elem *toElem(IRState *irs); +@@ -512,17 +575,21 @@ struct StructLiteralExp : Expression + Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + dt_t **toDt(dt_t **pdt); ++ Symbol *toSymbol(); + MATCH implicitConvTo(Type *t); ++ Expression *castTo(Scope *sc, Type *t); + + int inlineCost3(InlineCostState *ics); + Expression *doInline(InlineDoState *ids); + Expression *inlineScan(InlineScanState *iss); + }; + +-Expression *typeDotIdExp(Loc loc, Type *type, Identifier *ident); ++class DotIdExp; ++DotIdExp *typeDotIdExp(Loc loc, Type *type, Identifier *ident); + +-struct TypeExp : Expression ++class TypeExp : public Expression + { ++public: + TypeExp(Loc loc, Type *type); + Expression *syntaxCopy(); + Expression *semantic(Scope *sc); +@@ -532,8 +599,9 @@ struct TypeExp : Expression + elem *toElem(IRState *irs); + }; + +-struct ScopeExp : Expression ++class ScopeExp : public Expression + { ++public: + ScopeDsymbol *sds; + + ScopeExp(Loc loc, ScopeDsymbol *sds); +@@ -543,17 +611,22 @@ struct ScopeExp : Expression + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct TemplateExp : Expression ++class TemplateExp : public Expression + { ++public: + TemplateDeclaration *td; ++ FuncDeclaration *fd; + +- TemplateExp(Loc loc, TemplateDeclaration *td); ++ TemplateExp(Loc loc, TemplateDeclaration *td, FuncDeclaration *fd = NULL); + int rvalue(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); ++ int isLvalue(); ++ Expression *toLvalue(Scope *sc, Expression *e); + }; + +-struct NewExp : Expression ++class NewExp : public Expression + { ++public: + /* thisexp.new(newargs) newtype(arguments) + */ + Expression *thisexp; // if !NULL, 'this' for class being allocated +@@ -581,8 +654,9 @@ struct NewExp : Expression + //Expression *inlineScan(InlineScanState *iss); + }; + +-struct NewAnonClassExp : Expression ++class NewAnonClassExp : public Expression + { ++public: + /* thisexp.new(newargs) class baseclasses { } (arguments) + */ + Expression *thisexp; // if !NULL, 'this' for class being allocated +@@ -599,12 +673,13 @@ struct NewAnonClassExp : Expression + }; + + #if DMDV2 +-struct SymbolExp : Expression ++class SymbolExp : public Expression + { ++public: + Declaration *var; +- int hasOverloads; ++ bool hasOverloads; + +- SymbolExp(Loc loc, enum TOK op, int size, Declaration *var, int hasOverloads); ++ SymbolExp(Loc loc, TOK op, int size, Declaration *var, bool hasOverloads); + + elem *toElem(IRState *irs); + }; +@@ -612,12 +687,14 @@ struct SymbolExp : Expression + + // Offset from symbol + +-struct SymOffExp : SymbolExp ++class SymOffExp : public SymbolExp + { ++public: + unsigned offset; + +- SymOffExp(Loc loc, Declaration *var, unsigned offset, int hasOverloads = 0); ++ SymOffExp(Loc loc, Declaration *var, unsigned offset, bool hasOverloads = false); + Expression *semantic(Scope *sc); ++ Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void checkEscape(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -632,10 +709,11 @@ struct SymOffExp : SymbolExp + + // Variable + +-struct VarExp : SymbolExp ++class VarExp : public SymbolExp + { +- VarExp(Loc loc, Declaration *var, int hasOverloads = 0); +- int equals(Object *o); ++public: ++ VarExp(Loc loc, Declaration *var, bool hasOverloads = false); ++ bool equals(RootObject *o); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +@@ -658,25 +736,29 @@ struct VarExp : SymbolExp + #if DMDV2 + // Overload Set + +-struct OverExp : Expression ++class OverExp : public Expression + { ++public: + OverloadSet *vars; + +- OverExp(OverloadSet *s); ++ OverExp(Loc loc, OverloadSet *s); + int isLvalue(); + Expression *toLvalue(Scope *sc, Expression *e); ++ void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + #endif + + // Function/Delegate literal + +-struct FuncExp : Expression ++class FuncExp : public Expression + { ++public: + FuncLiteralDeclaration *fd; + TemplateDeclaration *td; +- enum TOK tok; ++ TOK tok; + + FuncExp(Loc loc, FuncLiteralDeclaration *fd, TemplateDeclaration *td = NULL); ++ void genIdent(Scope *sc); + Expression *syntaxCopy(); + Expression *semantic(Scope *sc); + Expression *semantic(Scope *sc, Expressions *arguments); +@@ -684,7 +766,7 @@ struct FuncExp : Expression + Expression *implicitCastTo(Scope *sc, Type *t); + MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); +- Expression *inferType(Type *t, int flag = 0, TemplateParameters *tparams = NULL); ++ Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL); + char *toChars(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + elem *toElem(IRState *irs); +@@ -697,8 +779,9 @@ struct FuncExp : Expression + + // Declaration of a symbol + +-struct DeclarationExp : Expression ++class DeclarationExp : public Expression + { ++public: + Dsymbol *declaration; + + DeclarationExp(Loc loc, Dsymbol *declaration); +@@ -713,19 +796,21 @@ struct DeclarationExp : Expression + Expression *inlineScan(InlineScanState *iss); + }; + +-struct TypeidExp : Expression ++class TypeidExp : public Expression + { +- Object *obj; ++public: ++ RootObject *obj; + +- TypeidExp(Loc loc, Object *obj); ++ TypeidExp(Loc loc, RootObject *obj); + Expression *syntaxCopy(); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + + #if DMDV2 +-struct TraitsExp : Expression ++class TraitsExp : public Expression + { ++public: + Identifier *ident; + Objects *args; + +@@ -736,8 +821,9 @@ struct TraitsExp : Expression + }; + #endif + +-struct HaltExp : Expression ++class HaltExp : public Expression + { ++public: + HaltExp(Loc loc); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -745,20 +831,21 @@ struct HaltExp : Expression + elem *toElem(IRState *irs); + }; + +-struct IsExp : Expression ++class IsExp : public Expression + { ++public: + /* is(targ id tok tspec) + * is(targ id == tok2) + */ + Type *targ; + Identifier *id; // can be NULL +- enum TOK tok; // ':' or '==' ++ TOK tok; // ':' or '==' + Type *tspec; // can be NULL +- enum TOK tok2; // 'struct', 'union', 'typedef', etc. ++ TOK tok2; // 'struct', 'union', 'typedef', etc. + TemplateParameters *parameters; + +- IsExp(Loc loc, Type *targ, Identifier *id, enum TOK tok, Type *tspec, +- enum TOK tok2, TemplateParameters *parameters); ++ IsExp(Loc loc, Type *targ, Identifier *id, TOK tok, Type *tspec, ++ TOK tok2, TemplateParameters *parameters); + Expression *syntaxCopy(); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -766,19 +853,20 @@ struct IsExp : Expression + + /****************************************************************/ + +-struct UnaExp : Expression ++class UnaExp : public Expression + { ++public: + Expression *e1; ++ Type *att1; // Save alias this type to detect recursion + +- UnaExp(Loc loc, enum TOK op, int size, Expression *e1); ++ UnaExp(Loc loc, TOK op, int size, Expression *e1); + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Expression *optimize(int result, bool keepLvalue = false); + void dump(int indent); +- Expression *interpretCommon(InterState *istate, CtfeGoal goal, +- Expression *(*fp)(Type *, Expression *)); ++ Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + Expression *resolveLoc(Loc loc, Scope *sc); + + Expression *doInline(InlineDoState *ids); +@@ -787,12 +875,19 @@ struct UnaExp : Expression + virtual Expression *op_overload(Scope *sc); + }; + +-struct BinExp : Expression ++typedef Expression *(*fp_t)(Type *, Expression *, Expression *); ++typedef int (*fp2_t)(Loc loc, TOK, Expression *, Expression *); ++ ++class BinExp : public Expression + { ++public: + Expression *e1; + Expression *e2; + +- BinExp(Loc loc, enum TOK op, int size, Expression *e1, Expression *e2); ++ Type *att1; // Save alias this type to detect recursion ++ Type *att2; // Save alias this type to detect recursion ++ ++ BinExp(Loc loc, TOK op, int size, Expression *e1, Expression *e2); + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); + Expression *semantic(Scope *sc); +@@ -806,12 +901,10 @@ struct BinExp : Expression + Expression *incompatibleTypes(); + void dump(int indent); + +- Expression *interpretCommon(InterState *istate, CtfeGoal goal, +- Expression *(*fp)(Type *, Expression *, Expression *)); +- Expression *interpretCompareCommon(InterState *istate, CtfeGoal goal, +- int (*fp)(Loc, TOK, Expression *, Expression *)); +- Expression *interpretAssignCommon(InterState *istate, CtfeGoal goal, +- Expression *(*fp)(Type *, Expression *, Expression *), int post = 0); ++ Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); ++ Expression *interpretCommon(InterState *istate, CtfeGoal goal, fp_t fp); ++ Expression *interpretCompareCommon(InterState *istate, CtfeGoal goal, fp2_t fp); ++ Expression *interpretAssignCommon(InterState *istate, CtfeGoal goal, fp_t fp, int post = 0); + Expression *interpretFourPointerRelation(InterState *istate, CtfeGoal goal); + virtual Expression *arrayOp(Scope *sc); + +@@ -820,13 +913,18 @@ struct BinExp : Expression + + Expression *op_overload(Scope *sc); + Expression *compare_overload(Scope *sc, Identifier *id); ++ Expression *reorderSettingAAElem(Scope *sc); ++ ++ void buildArrayIdent(OutBuffer *buf, Expressions *arguments); ++ Expression *buildArrayLoop(Parameters *fparams); + + elem *toElemBin(IRState *irs, int op); + }; + +-struct BinAssignExp : BinExp ++class BinAssignExp : public BinExp + { +- BinAssignExp(Loc loc, enum TOK op, int size, Expression *e1, Expression *e2) ++public: ++ BinAssignExp(Loc loc, TOK op, int size, Expression *e1, Expression *e2) + : BinExp(loc, op, size, e1, e2) + { + } +@@ -834,8 +932,13 @@ struct BinAssignExp : BinExp + Expression *semantic(Scope *sc); + Expression *arrayOp(Scope *sc); + ++ Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); ++ + Expression *op_overload(Scope *sc); + ++ void buildArrayIdent(OutBuffer *buf, Expressions *arguments); ++ Expression *buildArrayLoop(Parameters *fparams); ++ + int isLvalue(); + Expression *toLvalue(Scope *sc, Expression *ex); + Expression *modifiableLvalue(Scope *sc, Expression *e); +@@ -843,22 +946,25 @@ struct BinAssignExp : BinExp + + /****************************************************************/ + +-struct CompileExp : UnaExp ++class CompileExp : public UnaExp + { ++public: + CompileExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct FileExp : UnaExp ++class FileExp : public UnaExp + { ++public: + FileExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct AssertExp : UnaExp ++class AssertExp : public UnaExp + { ++public: + Expression *msg; + + AssertExp(Loc loc, Expression *e, Expression *msg = NULL); +@@ -874,31 +980,35 @@ struct AssertExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct DotIdExp : UnaExp ++class DotIdExp : public UnaExp + { ++public: + Identifier *ident; + + DotIdExp(Loc loc, Expression *e, Identifier *ident); + Expression *semantic(Scope *sc); +- Expression *semantic(Scope *sc, int flag); ++ Expression *semanticX(Scope *sc); ++ Expression *semanticY(Scope *sc, int flag); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void dump(int i); + }; + +-struct DotTemplateExp : UnaExp ++class DotTemplateExp : public UnaExp + { ++public: + TemplateDeclaration *td; + + DotTemplateExp(Loc loc, Expression *e, TemplateDeclaration *td); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct DotVarExp : UnaExp ++class DotVarExp : public UnaExp + { ++public: + Declaration *var; +- int hasOverloads; ++ bool hasOverloads; + +- DotVarExp(Loc loc, Expression *e, Declaration *var, int hasOverloads = 0); ++ DotVarExp(Loc loc, Expression *e, Declaration *var, bool hasOverloads = false); + Expression *semantic(Scope *sc); + int checkModifiable(Scope *sc, int flag); + int isLvalue(); +@@ -911,25 +1021,27 @@ struct DotVarExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct DotTemplateInstanceExp : UnaExp ++class DotTemplateInstanceExp : public UnaExp + { ++public: + TemplateInstance *ti; + + DotTemplateInstanceExp(Loc loc, Expression *e, Identifier *name, Objects *tiargs); + Expression *syntaxCopy(); +- TemplateDeclaration *getTempdecl(Scope *sc); ++ bool findTempDecl(Scope *sc); + Expression *semantic(Scope *sc); +- Expression *semantic(Scope *sc, int flag); ++ Expression *semanticY(Scope *sc, int flag); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void dump(int indent); + }; + +-struct DelegateExp : UnaExp ++class DelegateExp : public UnaExp + { ++public: + FuncDeclaration *func; +- int hasOverloads; ++ bool hasOverloads; + +- DelegateExp(Loc loc, Expression *e, FuncDeclaration *func, int hasOverloads = 0); ++ DelegateExp(Loc loc, Expression *e, FuncDeclaration *func, bool hasOverloads = false); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + MATCH implicitConvTo(Type *t); +@@ -941,8 +1053,9 @@ struct DelegateExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct DotTypeExp : UnaExp ++class DotTypeExp : public UnaExp + { ++public: + Dsymbol *sym; // symbol that represents a type + + DotTypeExp(Loc loc, Expression *e, Dsymbol *sym); +@@ -951,8 +1064,9 @@ struct DotTypeExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct CallExp : UnaExp ++class CallExp : public UnaExp + { ++public: + Expressions *arguments; // function arguments + FuncDeclaration *f; // symbol to call + +@@ -963,7 +1077,6 @@ struct CallExp : UnaExp + + Expression *syntaxCopy(); + int apply(apply_fp_t fp, void *param); +- Expression *resolveUFCS(Scope *sc); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +@@ -980,8 +1093,9 @@ struct CallExp : UnaExp + Expression *inlineScan(InlineScanState *iss); + }; + +-struct AddrExp : UnaExp ++class AddrExp : public UnaExp + { ++public: + AddrExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + void checkEscape(); +@@ -990,10 +1104,12 @@ struct AddrExp : UnaExp + Expression *castTo(Scope *sc, Type *t); + Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); ++ dt_t **toDt(dt_t **pdt); + }; + +-struct PtrExp : UnaExp ++class PtrExp : public UnaExp + { ++public: + PtrExp(Loc loc, Expression *e); + PtrExp(Loc loc, Expression *e, Type *t); + Expression *semantic(Scope *sc); +@@ -1011,12 +1127,12 @@ struct PtrExp : UnaExp + Identifier *opId(); + }; + +-struct NegExp : UnaExp ++class NegExp : public UnaExp + { ++public: + NegExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void buildArrayIdent(OutBuffer *buf, Expressions *arguments); + Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); +@@ -1027,8 +1143,9 @@ struct NegExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct UAddExp : UnaExp ++class UAddExp : public UnaExp + { ++public: + UAddExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + +@@ -1036,12 +1153,12 @@ struct UAddExp : UnaExp + Identifier *opId(); + }; + +-struct ComExp : UnaExp ++class ComExp : public UnaExp + { ++public: + ComExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void buildArrayIdent(OutBuffer *buf, Expressions *arguments); + Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); +@@ -1052,28 +1169,29 @@ struct ComExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct NotExp : UnaExp ++class NotExp : public UnaExp + { ++public: + NotExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + int isBit(); + elem *toElem(IRState *irs); + }; + +-struct BoolExp : UnaExp ++class BoolExp : public UnaExp + { ++public: + BoolExp(Loc loc, Expression *e, Type *type); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + int isBit(); + elem *toElem(IRState *irs); + }; + +-struct DeleteExp : UnaExp ++class DeleteExp : public UnaExp + { ++public: + DeleteExp(Loc loc, Expression *e); + Expression *semantic(Scope *sc); + Expression *checkToBoolean(Scope *sc); +@@ -1081,8 +1199,9 @@ struct DeleteExp : UnaExp + elem *toElem(IRState *irs); + }; + +-struct CastExp : UnaExp ++class CastExp : public UnaExp + { ++public: + // Possible to cast to one type while painting to another type + Type *to; // type to cast to + unsigned mod; // MODxxxxx +@@ -1104,10 +1223,12 @@ struct CastExp : UnaExp + // For operator overloading + Identifier *opId(); + Expression *op_overload(Scope *sc); ++ dt_t **toDt(dt_t **pdt); + }; + +-struct VectorExp : UnaExp ++class VectorExp : public UnaExp + { ++public: + TypeVector *to; // the target vector type before semantic() + unsigned dim; // number of elements in the vector + +@@ -1119,8 +1240,9 @@ struct VectorExp : UnaExp + dt_t **toDt(dt_t **pdt); + }; + +-struct SliceExp : UnaExp ++class SliceExp : public UnaExp + { ++public: + Expression *upr; // NULL if implicit 0 + Expression *lwr; // NULL if implicit [length - 1] + VarDeclaration *lengthVar; +@@ -1137,6 +1259,9 @@ struct SliceExp : UnaExp + Expression *modifiableLvalue(Scope *sc, Expression *e); + int isBool(int result); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); ++ Type *toStaticArrayType(); ++ MATCH implicitConvTo(Type *t); ++ Expression *castTo(Scope *sc, Type *t); + Expression *optimize(int result, bool keepLvalue = false); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void dump(int indent); +@@ -1148,8 +1273,9 @@ struct SliceExp : UnaExp + Expression *inlineScan(InlineScanState *iss); + }; + +-struct ArrayLengthExp : UnaExp ++class ArrayLengthExp : public UnaExp + { ++public: + ArrayLengthExp(Loc loc, Expression *e1); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +@@ -1162,8 +1288,9 @@ struct ArrayLengthExp : UnaExp + + // e1[a0,a1,a2,a3,...] + +-struct ArrayExp : UnaExp ++class ArrayExp : public UnaExp + { ++public: + Expressions *arguments; // Array of Expression's + size_t currentDimension; // for opDollar + VarDeclaration *lengthVar; +@@ -1186,15 +1313,17 @@ struct ArrayExp : UnaExp + + /****************************************************************/ + +-struct DotExp : BinExp ++class DotExp : public BinExp + { ++public: + DotExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct CommaExp : BinExp ++class CommaExp : public BinExp + { ++public: + CommaExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + void checkEscape(); +@@ -1213,10 +1342,12 @@ struct CommaExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct IndexExp : BinExp ++class IndexExp : public BinExp + { ++public: + VarDeclaration *lengthVar; + int modifiable; ++ bool skipboundscheck; + + IndexExp(Loc loc, Expression *e1, Expression *e2); + Expression *syntaxCopy(); +@@ -1235,9 +1366,10 @@ struct IndexExp : BinExp + + /* For both i++ and i-- + */ +-struct PostExp : BinExp ++class PostExp : public BinExp + { +- PostExp(enum TOK op, Loc loc, Expression *e); ++public: ++ PostExp(TOK op, Loc loc, Expression *e); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -1247,15 +1379,18 @@ struct PostExp : BinExp + + /* For both ++i and --i + */ +-struct PreExp : UnaExp ++class PreExp : public UnaExp + { +- PreExp(enum TOK op, Loc loc, Expression *e); ++public: ++ PreExp(TOK op, Loc loc, Expression *e); + Expression *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct AssignExp : BinExp +-{ int ismemset; // !=0 if setting the contents of an array ++class AssignExp : public BinExp ++{ ++public: ++ int ismemset; // !=0 if setting the contents of an array + + AssignExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); +@@ -1267,19 +1402,18 @@ struct AssignExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct ConstructExp : AssignExp ++class ConstructExp : public AssignExp + { ++public: + ConstructExp(Loc loc, Expression *e1, Expression *e2); + }; + + #define ASSIGNEXP(op) \ +-struct op##AssignExp : BinAssignExp \ ++class op##AssignExp : public BinAssignExp \ + { \ ++public: \ + op##AssignExp(Loc loc, Expression *e1, Expression *e2); \ + S(Expression *semantic(Scope *sc);) \ +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); \ +- X(void buildArrayIdent(OutBuffer *buf, Expressions *arguments);) \ +- X(Expression *buildArrayLoop(Parameters *fparams);) \ + \ + Identifier *opId(); /* For operator overloading */ \ + \ +@@ -1322,14 +1456,12 @@ ASSIGNEXP(Cat) + #undef X + #undef ASSIGNEXP + +-struct AddExp : BinExp ++class AddExp : public BinExp + { ++public: + AddExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1340,14 +1472,12 @@ struct AddExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct MinExp : BinExp ++class MinExp : public BinExp + { ++public: + MinExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1357,8 +1487,9 @@ struct MinExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct CatExp : BinExp ++class CatExp : public BinExp + { ++public: + CatExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +@@ -1371,14 +1502,12 @@ struct CatExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct MulExp : BinExp ++class MulExp : public BinExp + { ++public: + MulExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1389,14 +1518,12 @@ struct MulExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct DivExp : BinExp ++class DivExp : public BinExp + { ++public: + DivExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1406,14 +1533,12 @@ struct DivExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct ModExp : BinExp ++class ModExp : public BinExp + { ++public: + ModExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1424,14 +1549,12 @@ struct ModExp : BinExp + }; + + #if DMDV2 +-struct PowExp : BinExp ++class PowExp : public BinExp + { ++public: + PowExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + + // For operator overloading + Identifier *opId(); +@@ -1441,12 +1564,12 @@ struct PowExp : BinExp + }; + #endif + +-struct ShlExp : BinExp ++class ShlExp : public BinExp + { ++public: + ShlExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + IntRange getIntRange(); + + // For operator overloading +@@ -1456,12 +1579,12 @@ struct ShlExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct ShrExp : BinExp ++class ShrExp : public BinExp + { ++public: + ShrExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + IntRange getIntRange(); + + // For operator overloading +@@ -1471,12 +1594,12 @@ struct ShrExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct UshrExp : BinExp ++class UshrExp : public BinExp + { ++public: + UshrExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + IntRange getIntRange(); + + // For operator overloading +@@ -1486,14 +1609,12 @@ struct UshrExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct AndExp : BinExp ++class AndExp : public BinExp + { ++public: + AndExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + IntRange getIntRange(); + + // For operator overloading +@@ -1504,14 +1625,12 @@ struct AndExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct OrExp : BinExp ++class OrExp : public BinExp + { ++public: + OrExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + MATCH implicitConvTo(Type *t); + IntRange getIntRange(); + +@@ -1523,14 +1642,12 @@ struct OrExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct XorExp : BinExp ++class XorExp : public BinExp + { ++public: + XorExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +- void buildArrayIdent(OutBuffer *buf, Expressions *arguments); +- Expression *buildArrayLoop(Parameters *fparams); + MATCH implicitConvTo(Type *t); + IntRange getIntRange(); + +@@ -1542,8 +1659,9 @@ struct XorExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct OrOrExp : BinExp ++class OrOrExp : public BinExp + { ++public: + OrOrExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *checkToBoolean(Scope *sc); +@@ -1553,8 +1671,9 @@ struct OrOrExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct AndAndExp : BinExp ++class AndAndExp : public BinExp + { ++public: + AndAndExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *checkToBoolean(Scope *sc); +@@ -1564,12 +1683,12 @@ struct AndAndExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct CmpExp : BinExp ++class CmpExp : public BinExp + { +- CmpExp(enum TOK op, Loc loc, Expression *e1, Expression *e2); ++public: ++ CmpExp(TOK op, Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + int isBit(); + + // For operator overloading +@@ -1580,8 +1699,9 @@ struct CmpExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct InExp : BinExp ++class InExp : public BinExp + { ++public: + InExp(Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); +@@ -1594,8 +1714,9 @@ struct InExp : BinExp + elem *toElem(IRState *irs); + }; + +-struct RemoveExp : BinExp ++class RemoveExp : public BinExp + { ++public: + RemoveExp(Loc loc, Expression *e1, Expression *e2); + Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -1604,12 +1725,12 @@ struct RemoveExp : BinExp + + // == and != + +-struct EqualExp : BinExp ++class EqualExp : public BinExp + { +- EqualExp(enum TOK op, Loc loc, Expression *e1, Expression *e2); ++public: ++ EqualExp(TOK op, Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + int isBit(); + + // For operator overloading +@@ -1622,20 +1743,21 @@ struct EqualExp : BinExp + + // is and !is + +-struct IdentityExp : BinExp ++class IdentityExp : public BinExp + { +- IdentityExp(enum TOK op, Loc loc, Expression *e1, Expression *e2); ++public: ++ IdentityExp(TOK op, Loc loc, Expression *e1, Expression *e2); + Expression *semantic(Scope *sc); + int isBit(); + Expression *optimize(int result, bool keepLvalue = false); +- Expression *interpret(InterState *istate, CtfeGoal goal = ctfeNeedRvalue); + elem *toElem(IRState *irs); + }; + + /****************************************************************/ + +-struct CondExp : BinExp ++class CondExp : public BinExp + { ++public: + Expression *econd; + + CondExp(Loc loc, Expression *econd, Expression *e1, Expression *e2); +@@ -1654,7 +1776,7 @@ struct CondExp : BinExp + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + MATCH implicitConvTo(Type *t); + Expression *castTo(Scope *sc, Type *t); +- Expression *inferType(Type *t, int flag = 0, TemplateParameters *tparams = NULL); ++ Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL); + + Expression *doInline(InlineDoState *ids); + Expression *inlineScan(InlineScanState *iss); +@@ -1665,38 +1787,66 @@ struct CondExp : BinExp + #if DMDV2 + /****************************************************************/ + +-struct DefaultInitExp : Expression ++class DefaultInitExp : public Expression + { +- enum TOK subop; // which of the derived classes this is ++public: ++ TOK subop; // which of the derived classes this is + +- DefaultInitExp(Loc loc, enum TOK subop, int size); ++ DefaultInitExp(Loc loc, TOK subop, int size); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct FileInitExp : DefaultInitExp ++class FileInitExp : public DefaultInitExp + { ++public: + FileInitExp(Loc loc); + Expression *semantic(Scope *sc); + Expression *resolveLoc(Loc loc, Scope *sc); + }; + +-struct LineInitExp : DefaultInitExp ++class LineInitExp : public DefaultInitExp + { ++public: + LineInitExp(Loc loc); + Expression *semantic(Scope *sc); + Expression *resolveLoc(Loc loc, Scope *sc); + }; ++ ++class ModuleInitExp : public DefaultInitExp ++{ ++public: ++ ModuleInitExp(Loc loc); ++ Expression *semantic(Scope *sc); ++ Expression *resolveLoc(Loc loc, Scope *sc); ++}; ++ ++class FuncInitExp : public DefaultInitExp ++{ ++public: ++ FuncInitExp(Loc loc); ++ Expression *semantic(Scope *sc); ++ Expression *resolveLoc(Loc loc, Scope *sc); ++}; ++ ++class PrettyFuncInitExp : public DefaultInitExp ++{ ++public: ++ PrettyFuncInitExp(Loc loc); ++ Expression *semantic(Scope *sc); ++ Expression *resolveLoc(Loc loc, Scope *sc); ++}; ++ + #endif + + /****************************************************************/ + + /* Special values used by the interpreter + */ +-#define EXP_CANT_INTERPRET ((Expression *)1) +-#define EXP_CONTINUE_INTERPRET ((Expression *)2) +-#define EXP_BREAK_INTERPRET ((Expression *)3) +-#define EXP_GOTO_INTERPRET ((Expression *)4) +-#define EXP_VOID_INTERPRET ((Expression *)5) ++extern Expression *EXP_CANT_INTERPRET; ++extern Expression *EXP_CONTINUE_INTERPRET; ++extern Expression *EXP_BREAK_INTERPRET; ++extern Expression *EXP_GOTO_INTERPRET; ++extern Expression *EXP_VOID_INTERPRET; + + Expression *expType(Type *type, Expression *e); + +@@ -1723,9 +1873,9 @@ Expression *Xor(Type *type, Expression * + Expression *Index(Type *type, Expression *e1, Expression *e2); + Expression *Cat(Type *type, Expression *e1, Expression *e2); + +-Expression *Equal(enum TOK op, Type *type, Expression *e1, Expression *e2); +-Expression *Cmp(enum TOK op, Type *type, Expression *e1, Expression *e2); +-Expression *Identity(enum TOK op, Type *type, Expression *e1, Expression *e2); ++Expression *Equal(TOK op, Type *type, Expression *e1, Expression *e2); ++Expression *Cmp(TOK op, Type *type, Expression *e1, Expression *e2); ++Expression *Identity(TOK op, Type *type, Expression *e1, Expression *e2); + + Expression *Slice(Type *type, Expression *e1, Expression *lwr, Expression *upr); + +--- a/src/gcc/d/dfrontend/file.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/file.c 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,514 @@ ++ ++// Copyright (c) 1999-2012 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#include "file.h" ++ ++#if defined (__sun) ++#include ++#endif ++ ++#if _MSC_VER ||__MINGW32__ ++#include ++#include ++#endif ++ ++#if _WIN32 ++#include ++#include ++#include ++#endif ++ ++#if POSIX ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++#include "filename.h" ++#include "array.h" ++#include "port.h" ++#include "rmem.h" ++ ++/****************************** File ********************************/ ++ ++File::File(const FileName *n) ++{ ++ ref = 0; ++ buffer = NULL; ++ len = 0; ++ touchtime = NULL; ++ name = (FileName *)n; ++} ++ ++File::File(const char *n) ++{ ++ ref = 0; ++ buffer = NULL; ++ len = 0; ++ touchtime = NULL; ++ name = new FileName(n); ++} ++ ++File::~File() ++{ ++ if (buffer) ++ { ++ if (ref == 0) ++ mem.free(buffer); ++#if _WIN32 ++ if (ref == 2) ++ UnmapViewOfFile(buffer); ++#endif ++ } ++ if (touchtime) ++ mem.free(touchtime); ++} ++ ++/************************************* ++ */ ++ ++int File::read() ++{ ++ if (len) ++ return 0; // already read the file ++#if POSIX ++ off_t size; ++ ssize_t numread; ++ int fd; ++ struct stat buf; ++ int result = 0; ++ char *name; ++ ++ name = this->name->toChars(); ++ //printf("File::read('%s')\n",name); ++ fd = open(name, O_RDONLY); ++ if (fd == -1) ++ { ++ //printf("\topen error, errno = %d\n",errno); ++ goto err1; ++ } ++ ++ if (!ref) ++ ::free(buffer); ++ ref = 0; // we own the buffer now ++ ++ //printf("\tfile opened\n"); ++ if (fstat(fd, &buf)) ++ { ++ printf("\tfstat error, errno = %d\n",errno); ++ goto err2; ++ } ++ size = buf.st_size; ++ buffer = (utf8_t *) ::malloc(size + 2); ++ if (!buffer) ++ { ++ printf("\tmalloc error, errno = %d\n",errno); ++ goto err2; ++ } ++ ++ numread = ::read(fd, buffer, size); ++ if (numread != size) ++ { ++ printf("\tread error, errno = %d\n",errno); ++ goto err2; ++ } ++ ++ if (touchtime) ++ memcpy(touchtime, &buf, sizeof(buf)); ++ ++ if (close(fd) == -1) ++ { ++ printf("\tclose error, errno = %d\n",errno); ++ goto err; ++ } ++ ++ len = size; ++ ++ // Always store a wchar ^Z past end of buffer so scanner has a sentinel ++ buffer[size] = 0; // ^Z is obsolete, use 0 ++ buffer[size + 1] = 0; ++ return 0; ++ ++err2: ++ close(fd); ++err: ++ ::free(buffer); ++ buffer = NULL; ++ len = 0; ++ ++err1: ++ result = 1; ++ return result; ++#elif _WIN32 ++ DWORD size; ++ DWORD numread; ++ HANDLE h; ++ int result = 0; ++ char *name; ++ ++ name = this->name->toChars(); ++ h = CreateFileA(name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, ++ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); ++ if (h == INVALID_HANDLE_VALUE) ++ goto err1; ++ ++ if (!ref) ++ ::free(buffer); ++ ref = 0; ++ ++ size = GetFileSize(h,NULL); ++ buffer = (utf8_t *) ::malloc(size + 2); ++ if (!buffer) ++ goto err2; ++ ++ if (ReadFile(h,buffer,size,&numread,NULL) != TRUE) ++ goto err2; ++ ++ if (numread != size) ++ goto err2; ++ ++ if (touchtime) ++ { ++ if (!GetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime)) ++ goto err2; ++ } ++ ++ if (!CloseHandle(h)) ++ goto err; ++ ++ len = size; ++ ++ // Always store a wchar ^Z past end of buffer so scanner has a sentinel ++ buffer[size] = 0; // ^Z is obsolete, use 0 ++ buffer[size + 1] = 0; ++ return 0; ++ ++err2: ++ CloseHandle(h); ++err: ++ ::free(buffer); ++ buffer = NULL; ++ len = 0; ++ ++err1: ++ result = 1; ++ return result; ++#else ++ assert(0); ++#endif ++} ++ ++/***************************** ++ * Read a file with memory mapped file I/O. ++ */ ++ ++int File::mmread() ++{ ++#if POSIX ++ return read(); ++#elif _WIN32 ++ HANDLE hFile; ++ HANDLE hFileMap; ++ DWORD size; ++ char *name; ++ ++ name = this->name->toChars(); ++ hFile = CreateFile(name, GENERIC_READ, ++ FILE_SHARE_READ, NULL, ++ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ++ if (hFile == INVALID_HANDLE_VALUE) ++ goto Lerr; ++ size = GetFileSize(hFile, NULL); ++ //printf(" file created, size %d\n", size); ++ ++ hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,size,NULL); ++ if (CloseHandle(hFile) != TRUE) ++ goto Lerr; ++ ++ if (hFileMap == NULL) ++ goto Lerr; ++ ++ //printf(" mapping created\n"); ++ ++ if (!ref) ++ mem.free(buffer); ++ ref = 2; ++ buffer = (utf8_t *)MapViewOfFileEx(hFileMap, FILE_MAP_READ,0,0,size,NULL); ++ if (CloseHandle(hFileMap) != TRUE) ++ goto Lerr; ++ if (buffer == NULL) // mapping view failed ++ goto Lerr; ++ ++ len = size; ++ //printf(" buffer = %p\n", buffer); ++ ++ return 0; ++ ++Lerr: ++ return GetLastError(); // failure ++#else ++ assert(0); ++#endif ++} ++ ++/********************************************* ++ * Write a file. ++ * Returns: ++ * 0 success ++ */ ++ ++int File::write() ++{ ++#if POSIX ++ int fd; ++ ssize_t numwritten; ++ char *name; ++ ++ name = this->name->toChars(); ++ fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644); ++ if (fd == -1) ++ goto err; ++ ++ numwritten = ::write(fd, buffer, len); ++ if (len != numwritten) ++ goto err2; ++ ++ if (close(fd) == -1) ++ goto err; ++ ++ if (touchtime) ++ { struct utimbuf ubuf; ++ ++ ubuf.actime = ((struct stat *)touchtime)->st_atime; ++ ubuf.modtime = ((struct stat *)touchtime)->st_mtime; ++ if (utime(name, &ubuf)) ++ goto err; ++ } ++ return 0; ++ ++err2: ++ close(fd); ++ ::remove(name); ++err: ++ return 1; ++#elif _WIN32 ++ HANDLE h; ++ DWORD numwritten; ++ char *name; ++ ++ name = this->name->toChars(); ++ h = CreateFileA(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, ++ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); ++ if (h == INVALID_HANDLE_VALUE) ++ goto err; ++ ++ if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE) ++ goto err2; ++ ++ if (len != numwritten) ++ goto err2; ++ ++ if (touchtime) { ++ SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime); ++ } ++ if (!CloseHandle(h)) ++ goto err; ++ return 0; ++ ++err2: ++ CloseHandle(h); ++ DeleteFileA(name); ++err: ++ return 1; ++#else ++ assert(0); ++#endif ++} ++ ++/********************************************* ++ * Append to a file. ++ * Returns: ++ * 0 success ++ */ ++ ++int File::append() ++{ ++#if POSIX ++ return 1; ++#elif _WIN32 ++ HANDLE h; ++ DWORD numwritten; ++ char *name; ++ ++ name = this->name->toChars(); ++ h = CreateFileA(name,GENERIC_WRITE,0,NULL,OPEN_ALWAYS, ++ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); ++ if (h == INVALID_HANDLE_VALUE) ++ goto err; ++ ++#if 1 ++ SetFilePointer(h, 0, NULL, FILE_END); ++#else // INVALID_SET_FILE_POINTER doesn't seem to have a definition ++ if (SetFilePointer(h, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) ++ goto err; ++#endif ++ ++ if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE) ++ goto err2; ++ ++ if (len != numwritten) ++ goto err2; ++ ++ if (touchtime) { ++ SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime); ++ } ++ if (!CloseHandle(h)) ++ goto err; ++ return 0; ++ ++err2: ++ CloseHandle(h); ++err: ++ return 1; ++#else ++ assert(0); ++#endif ++} ++ ++/******************************************* ++ * Return !=0 if file exists. ++ * 0: file doesn't exist ++ * 1: normal file ++ * 2: directory ++ */ ++ ++int File::exists() ++{ ++#if POSIX ++ return 0; ++#elif _WIN32 ++ DWORD dw; ++ int result; ++ char *name; ++ ++ name = this->name->toChars(); ++ if (touchtime) ++ dw = ((WIN32_FIND_DATAA *)touchtime)->dwFileAttributes; ++ else ++ dw = GetFileAttributesA(name); ++ if (dw == -1L) ++ result = 0; ++ else if (dw & FILE_ATTRIBUTE_DIRECTORY) ++ result = 2; ++ else ++ result = 1; ++ return result; ++#else ++ assert(0); ++#endif ++} ++ ++void File::remove() ++{ ++#if POSIX ++ int dummy = ::remove(this->name->toChars()); ++#elif _WIN32 ++ DeleteFileA(this->name->toChars()); ++#else ++ assert(0); ++#endif ++} ++ ++Files *File::match(char *n) ++{ ++ return match(new FileName(n)); ++} ++ ++Files *File::match(FileName *n) ++{ ++#if POSIX ++ return NULL; ++#elif _WIN32 ++ HANDLE h; ++ WIN32_FIND_DATAA fileinfo; ++ ++ Files *a = new Files(); ++ const char *c = n->toChars(); ++ const char *name = n->name(); ++ h = FindFirstFileA(c,&fileinfo); ++ if (h != INVALID_HANDLE_VALUE) ++ { ++ do ++ { ++ // Glue path together with name ++ char *fn; ++ File *f; ++ ++ fn = (char *)mem.malloc(name - c + strlen(&fileinfo.cFileName[0]) + 1); ++ memcpy(fn, c, name - c); ++ strcpy(fn + (name - c), &fileinfo.cFileName[0]); ++ f = new File(fn); ++ f->touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA)); ++ memcpy(f->touchtime, &fileinfo, sizeof(fileinfo)); ++ a->push(f); ++ } while (FindNextFileA(h,&fileinfo) != FALSE); ++ FindClose(h); ++ } ++ return a; ++#else ++ assert(0); ++#endif ++} ++ ++int File::compareTime(File *f) ++{ ++#if POSIX ++ return 0; ++#elif _WIN32 ++ if (!touchtime) ++ stat(); ++ if (!f->touchtime) ++ f->stat(); ++ return CompareFileTime(&((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime, &((WIN32_FIND_DATAA *)f->touchtime)->ftLastWriteTime); ++#else ++ assert(0); ++#endif ++} ++ ++void File::stat() ++{ ++#if POSIX ++ if (!touchtime) ++ { ++ touchtime = mem.calloc(1, sizeof(struct stat)); ++ } ++#elif _WIN32 ++ HANDLE h; ++ ++ if (!touchtime) ++ { ++ touchtime = mem.calloc(1, sizeof(WIN32_FIND_DATAA)); ++ } ++ h = FindFirstFileA(name->toChars(),(WIN32_FIND_DATAA *)touchtime); ++ if (h != INVALID_HANDLE_VALUE) ++ { ++ FindClose(h); ++ } ++#else ++ assert(0); ++#endif ++} ++ ++char *File::toChars() ++{ ++ return name->toChars(); ++} +--- a/src/gcc/d/dfrontend/file.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/file.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,103 @@ ++ ++// Copyright (c) 1999-2011 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef FILE_H ++#define FILE_H ++ ++#if __DMC__ ++#pragma once ++#endif ++ ++#include ++ ++#include "array.h" ++ ++template struct Array; ++typedef Array Files; ++ ++struct FileName; ++ ++struct File ++{ ++ int ref; // != 0 if this is a reference to someone else's buffer ++ unsigned char *buffer; // data for our file ++ size_t len; // amount of data in buffer[] ++ void *touchtime; // system time to use for file ++ ++ FileName *name; // name of our file ++ ++ File(const char *); ++ File(const FileName *); ++ ~File(); ++ ++ char *toChars(); ++ ++ /* Read file, return !=0 if error ++ */ ++ ++ int read(); ++ ++ /* Read file, return !=0 if error ++ */ ++ ++ int mmread(); ++ ++ /* Write file, return !=0 if error ++ */ ++ ++ int write(); ++ ++ /* Return !=0 if file exists. ++ * 0: file doesn't exist ++ * 1: normal file ++ * 2: directory ++ */ ++ ++ /* Append to file, return !=0 if error ++ */ ++ ++ int append(); ++ ++ /* Return !=0 if file exists. ++ * 0: file doesn't exist ++ * 1: normal file ++ * 2: directory ++ */ ++ ++ int exists(); ++ ++ /* Given wildcard filespec, return an array of ++ * matching File's. ++ */ ++ ++ static Files *match(char *); ++ static Files *match(FileName *); ++ ++ // Compare file times. ++ // Return <0 this < f ++ // =0 this == f ++ // >0 this > f ++ int compareTime(File *f); ++ ++ // Read system file statistics ++ void stat(); ++ ++ /* Set buffer ++ */ ++ ++ void setbuffer(void *buffer, size_t len) ++ { ++ this->buffer = (unsigned char *)buffer; ++ this->len = len; ++ } ++ ++ void remove(); // delete file ++}; ++ ++#endif +--- a/src/gcc/d/dfrontend/filename.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/filename.c 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,690 @@ ++ ++// Copyright (c) 1999-2012 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#include "filename.h" ++ ++#include ++#include ++ ++#include "outbuffer.h" ++#include "array.h" ++#include "file.h" ++#include "rmem.h" ++ ++#if defined (__sun) ++#include ++#endif ++ ++#if _MSC_VER ||__MINGW32__ ++#include ++#include ++#endif ++ ++#if _WIN32 ++#include ++#include ++#include ++#endif ++ ++#if POSIX ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++/****************************** FileName ********************************/ ++ ++FileName::FileName(const char *str) ++ : str(mem.strdup(str)) ++{ ++} ++ ++const char *FileName::combine(const char *path, const char *name) ++{ char *f; ++ size_t pathlen; ++ size_t namelen; ++ ++ if (!path || !*path) ++ return (char *)name; ++ pathlen = strlen(path); ++ namelen = strlen(name); ++ f = (char *)mem.malloc(pathlen + 1 + namelen + 1); ++ memcpy(f, path, pathlen); ++#if POSIX ++ if (path[pathlen - 1] != '/') ++ { f[pathlen] = '/'; ++ pathlen++; ++ } ++#elif _WIN32 ++ if (path[pathlen - 1] != '\\' && ++ path[pathlen - 1] != '/' && ++ path[pathlen - 1] != ':') ++ { f[pathlen] = '\\'; ++ pathlen++; ++ } ++#else ++ assert(0); ++#endif ++ memcpy(f + pathlen, name, namelen + 1); ++ return f; ++} ++ ++// Split a path into an Array of paths ++Strings *FileName::splitPath(const char *path) ++{ ++ char c = 0; // unnecessary initializer is for VC /W4 ++ const char *p; ++ OutBuffer buf; ++ Strings *array; ++ ++ array = new Strings(); ++ if (path) ++ { ++ p = path; ++ do ++ { char instring = 0; ++ ++ while (isspace((utf8_t)*p)) // skip leading whitespace ++ p++; ++ buf.reserve(strlen(p) + 1); // guess size of path ++ for (; ; p++) ++ { ++ c = *p; ++ switch (c) ++ { ++ case '"': ++ instring ^= 1; // toggle inside/outside of string ++ continue; ++ ++#if MACINTOSH ++ case ',': ++#endif ++#if _WIN32 ++ case ';': ++#endif ++#if POSIX ++ case ':': ++#endif ++ p++; ++ break; // note that ; cannot appear as part ++ // of a path, quotes won't protect it ++ ++ case 0x1A: // ^Z means end of file ++ case 0: ++ break; ++ ++ case '\r': ++ continue; // ignore carriage returns ++ ++#if POSIX ++ case '~': ++ buf.writestring(getenv("HOME")); ++ continue; ++#endif ++ ++#if 0 ++ case ' ': ++ case '\t': // tabs in filenames? ++ if (!instring) // if not in string ++ break; // treat as end of path ++#endif ++ default: ++ buf.writeByte(c); ++ continue; ++ } ++ break; ++ } ++ if (buf.offset) // if path is not empty ++ { ++ buf.writeByte(0); // to asciiz ++ array->push(buf.extractData()); ++ } ++ } while (c); ++ } ++ return array; ++} ++ ++int FileName::compare(RootObject *obj) ++{ ++ return compare(str, ((FileName *)obj)->str); ++} ++ ++int FileName::compare(const char *name1, const char *name2) ++{ ++#if _WIN32 ++ return stricmp(name1, name2); ++#else ++ return strcmp(name1, name2); ++#endif ++} ++ ++bool FileName::equals(RootObject *obj) ++{ ++ return compare(obj) == 0; ++} ++ ++int FileName::equals(const char *name1, const char *name2) ++{ ++ return compare(name1, name2) == 0; ++} ++ ++/************************************ ++ * Return !=0 if absolute path name. ++ */ ++ ++int FileName::absolute(const char *name) ++{ ++#if _WIN32 ++ return (*name == '\\') || ++ (*name == '/') || ++ (*name && name[1] == ':'); ++#elif POSIX ++ return (*name == '/'); ++#else ++ assert(0); ++#endif ++} ++ ++/******************************** ++ * Return filename extension (read-only). ++ * Points past '.' of extension. ++ * If there isn't one, return NULL. ++ */ ++ ++const char *FileName::ext(const char *str) ++{ ++ size_t len = strlen(str); ++ ++ const char *e = str + len; ++ for (;;) ++ { ++ switch (*e) ++ { case '.': ++ return e + 1; ++#if POSIX ++ case '/': ++ break; ++#endif ++#if _WIN32 ++ case '\\': ++ case ':': ++ case '/': ++ break; ++#endif ++ default: ++ if (e == str) ++ break; ++ e--; ++ continue; ++ } ++ return NULL; ++ } ++} ++ ++const char *FileName::ext() ++{ ++ return ext(str); ++} ++ ++/******************************** ++ * Return mem.malloc'd filename with extension removed. ++ */ ++ ++const char *FileName::removeExt(const char *str) ++{ ++ const char *e = ext(str); ++ if (e) ++ { size_t len = (e - str) - 1; ++ char *n = (char *)mem.malloc(len + 1); ++ memcpy(n, str, len); ++ n[len] = 0; ++ return n; ++ } ++ return mem.strdup(str); ++} ++ ++/******************************** ++ * Return filename name excluding path (read-only). ++ */ ++ ++const char *FileName::name(const char *str) ++{ ++ size_t len = strlen(str); ++ ++ const char *e = str + len; ++ for (;;) ++ { ++ switch (*e) ++ { ++#if POSIX ++ case '/': ++ return e + 1; ++#endif ++#if _WIN32 ++ case '/': ++ case '\\': ++ return e + 1; ++ case ':': ++ /* The ':' is a drive letter only if it is the second ++ * character or the last character, ++ * otherwise it is an ADS (Alternate Data Stream) separator. ++ * Consider ADS separators as part of the file name. ++ */ ++ if (e == str + 1 || e == str + len - 1) ++ return e + 1; ++#endif ++ default: ++ if (e == str) ++ break; ++ e--; ++ continue; ++ } ++ return e; ++ } ++} ++ ++const char *FileName::name() ++{ ++ return name(str); ++} ++ ++/************************************** ++ * Return path portion of str. ++ * Path will does not include trailing path separator. ++ */ ++ ++const char *FileName::path(const char *str) ++{ ++ const char *n = name(str); ++ size_t pathlen; ++ ++ if (n > str) ++ { ++#if POSIX ++ if (n[-1] == '/') ++ n--; ++#elif _WIN32 ++ if (n[-1] == '\\' || n[-1] == '/') ++ n--; ++#else ++ assert(0); ++#endif ++ } ++ pathlen = n - str; ++ char *path = (char *)mem.malloc(pathlen + 1); ++ memcpy(path, str, pathlen); ++ path[pathlen] = 0; ++ return path; ++} ++ ++/************************************** ++ * Replace filename portion of path. ++ */ ++ ++const char *FileName::replaceName(const char *path, const char *name) ++{ ++ size_t pathlen; ++ size_t namelen; ++ ++ if (absolute(name)) ++ return name; ++ ++ const char *n = FileName::name(path); ++ if (n == path) ++ return name; ++ pathlen = n - path; ++ namelen = strlen(name); ++ char *f = (char *)mem.malloc(pathlen + 1 + namelen + 1); ++ memcpy(f, path, pathlen); ++#if POSIX ++ if (path[pathlen - 1] != '/') ++ { f[pathlen] = '/'; ++ pathlen++; ++ } ++#elif _WIN32 ++ if (path[pathlen - 1] != '\\' && ++ path[pathlen - 1] != '/' && ++ path[pathlen - 1] != ':') ++ { f[pathlen] = '\\'; ++ pathlen++; ++ } ++#else ++ assert(0); ++#endif ++ memcpy(f + pathlen, name, namelen + 1); ++ return f; ++} ++ ++/*************************** ++ * Free returned value with FileName::free() ++ */ ++ ++const char *FileName::defaultExt(const char *name, const char *ext) ++{ ++ const char *e = FileName::ext(name); ++ if (e) // if already has an extension ++ return mem.strdup(name); ++ ++ size_t len = strlen(name); ++ size_t extlen = strlen(ext); ++ char *s = (char *)mem.malloc(len + 1 + extlen + 1); ++ memcpy(s,name,len); ++ s[len] = '.'; ++ memcpy(s + len + 1, ext, extlen + 1); ++ return s; ++} ++ ++/*************************** ++ * Free returned value with FileName::free() ++ */ ++ ++const char *FileName::forceExt(const char *name, const char *ext) ++{ ++ const char *e = FileName::ext(name); ++ if (e) // if already has an extension ++ { ++ size_t len = e - name; ++ size_t extlen = strlen(ext); ++ ++ char *s = (char *)mem.malloc(len + extlen + 1); ++ memcpy(s,name,len); ++ memcpy(s + len, ext, extlen + 1); ++ return s; ++ } ++ else ++ return defaultExt(name, ext); // doesn't have one ++} ++ ++/****************************** ++ * Return !=0 if extensions match. ++ */ ++ ++int FileName::equalsExt(const char *ext) ++{ ++ return equalsExt(str, ext); ++} ++ ++int FileName::equalsExt(const char *name, const char *ext) ++{ ++ const char *e = FileName::ext(name); ++ if (!e && !ext) ++ return 1; ++ if (!e || !ext) ++ return 0; ++ return FileName::compare(e, ext) == 0; ++} ++ ++/************************************* ++ * Search Path for file. ++ * Input: ++ * cwd if !=0, search current directory before searching path ++ */ ++ ++const char *FileName::searchPath(Strings *path, const char *name, int cwd) ++{ ++ if (absolute(name)) ++ { ++ return exists(name) ? name : NULL; ++ } ++ if (cwd) ++ { ++ if (exists(name)) ++ return name; ++ } ++ if (path) ++ { ++ ++ for (size_t i = 0; i < path->dim; i++) ++ { ++ const char *p = (*path)[i]; ++ const char *n = combine(p, name); ++ ++ if (exists(n)) ++ return n; ++ } ++ } ++ return NULL; ++} ++ ++ ++/************************************* ++ * Search Path for file in a safe manner. ++ * ++ * Be wary of CWE-22: Improper Limitation of a Pathname to a Restricted Directory ++ * ('Path Traversal') attacks. ++ * http://cwe.mitre.org/data/definitions/22.html ++ * More info: ++ * https://www.securecoding.cert.org/confluence/display/seccode/FIO02-C.+Canonicalize+path+names+originating+from+untrusted+sources ++ * Returns: ++ * NULL file not found ++ * !=NULL mem.malloc'd file name ++ */ ++ ++const char *FileName::safeSearchPath(Strings *path, const char *name) ++{ ++#if _WIN32 ++ /* Disallow % / \ : and .. in name characters ++ */ ++ for (const char *p = name; *p; p++) ++ { ++ char c = *p; ++ if (c == '\\' || c == '/' || c == ':' || c == '%' || ++ (c == '.' && p[1] == '.')) ++ { ++ return NULL; ++ } ++ } ++ ++ return FileName::searchPath(path, name, 0); ++#elif POSIX ++ /* Even with realpath(), we must check for // and disallow it ++ */ ++ for (const char *p = name; *p; p++) ++ { ++ char c = *p; ++ if (c == '/' && p[1] == '/') ++ { ++ return NULL; ++ } ++ } ++ ++ if (path) ++ { ++ /* Each path is converted to a cannonical name and then a check is done to see ++ * that the searched name is really a child one of the the paths searched. ++ */ ++ for (size_t i = 0; i < path->dim; i++) ++ { ++ const char *cname = NULL; ++ const char *cpath = canonicalName((*path)[i]); ++ //printf("FileName::safeSearchPath(): name=%s; path=%s; cpath=%s\n", ++ // name, (char *)path->data[i], cpath); ++ if (cpath == NULL) ++ goto cont; ++ cname = canonicalName(combine(cpath, name)); ++ //printf("FileName::safeSearchPath(): cname=%s\n", cname); ++ if (cname == NULL) ++ goto cont; ++ //printf("FileName::safeSearchPath(): exists=%i " ++ // "strncmp(cpath, cname, %i)=%i\n", exists(cname), ++ // strlen(cpath), strncmp(cpath, cname, strlen(cpath))); ++ // exists and name is *really* a "child" of path ++ if (exists(cname) && strncmp(cpath, cname, strlen(cpath)) == 0) ++ { ++ ::free((void *)cpath); ++ const char *p = mem.strdup(cname); ++ ::free((void *)cname); ++ return p; ++ } ++cont: ++ if (cpath) ++ ::free((void *)cpath); ++ if (cname) ++ ::free((void *)cname); ++ } ++ } ++ return NULL; ++#else ++ assert(0); ++#endif ++} ++ ++ ++int FileName::exists(const char *name) ++{ ++#if POSIX ++ struct stat st; ++ ++ if (stat(name, &st) < 0) ++ return 0; ++ if (S_ISDIR(st.st_mode)) ++ return 2; ++ return 1; ++#elif _WIN32 ++ DWORD dw; ++ int result; ++ ++ dw = GetFileAttributesA(name); ++ if (dw == -1L) ++ result = 0; ++ else if (dw & FILE_ATTRIBUTE_DIRECTORY) ++ result = 2; ++ else ++ result = 1; ++ return result; ++#else ++ assert(0); ++#endif ++} ++ ++int FileName::ensurePathExists(const char *path) ++{ ++ //printf("FileName::ensurePathExists(%s)\n", path ? path : ""); ++ if (path && *path) ++ { ++ if (!exists(path)) ++ { ++ const char *p = FileName::path(path); ++ if (*p) ++ { ++#if _WIN32 ++ size_t len = strlen(path); ++ if ((len > 2 && p[-1] == ':' && strcmp(path + 2, p) == 0) || ++ len == strlen(p)) ++ { mem.free((void *)p); ++ return 0; ++ } ++#endif ++ int r = ensurePathExists(p); ++ mem.free((void *)p); ++ if (r) ++ return r; ++ } ++#if _WIN32 ++ char sep = '\\'; ++#elif POSIX ++ char sep = '/'; ++#endif ++ if (path[strlen(path) - 1] != sep) ++ { ++ //printf("mkdir(%s)\n", path); ++#if _WIN32 ++ int r = _mkdir(path); ++#endif ++#if POSIX ++ int r = mkdir(path, 0777); ++#endif ++ if (r) ++ { ++ /* Don't error out if another instance of dmd just created ++ * this directory ++ */ ++ if (errno != EEXIST) ++ return 1; ++ } ++ } ++ } ++ } ++ return 0; ++} ++ ++/****************************************** ++ * Return canonical version of name in a malloc'd buffer. ++ * This code is high risk. ++ */ ++const char *FileName::canonicalName(const char *name) ++{ ++#if linux ++ // Lovely glibc extension to do it for us ++ return canonicalize_file_name(name); ++#elif POSIX ++ #if _POSIX_VERSION >= 200809L || defined (linux) ++ // NULL destination buffer is allowed and preferred ++ return realpath(name, NULL); ++ #else ++ char *cname = NULL; ++ #if PATH_MAX ++ /* PATH_MAX must be defined as a constant in , ++ * otherwise using it is unsafe due to TOCTOU ++ */ ++ size_t path_max = (size_t)PATH_MAX; ++ if (path_max > 0) ++ { ++ /* Need to add one to PATH_MAX because of realpath() buffer overflow bug: ++ * http://isec.pl/vulnerabilities/isec-0011-wu-ftpd.txt ++ */ ++ cname = (char *)malloc(path_max + 1); ++ if (cname == NULL) ++ return NULL; ++ } ++ #endif ++ return realpath(name, cname); ++ #endif ++#elif _WIN32 ++ /* Apparently, there is no good way to do this on Windows. ++ * GetFullPathName isn't it, but use it anyway. ++ */ ++ DWORD result = GetFullPathName(name, 0, NULL, NULL); ++ if (result) ++ { ++ char *buf = (char *)malloc(result); ++ result = GetFullPathName(name, result, buf, NULL); ++ if (result == 0) ++ { ++ ::free(buf); ++ return NULL; ++ } ++ return buf; ++ } ++ return NULL; ++#else ++ assert(0); ++ return NULL; ++#endif ++} ++ ++/******************************** ++ * Free memory allocated by FileName routines ++ */ ++void FileName::free(const char *str) ++{ ++ if (str) ++ { assert(str[0] != 0xAB); ++ memset((void *)str, 0xAB, strlen(str) + 1); // stomp ++ } ++ mem.free((void *)str); ++} ++ ++char *FileName::toChars() ++{ ++ return (char *)str; // toChars() should really be const ++} +--- a/src/gcc/d/dfrontend/filename.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/filename.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,59 @@ ++ ++// Copyright (c) 1999-2011 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef FILENAME_H ++#define FILENAME_H ++ ++#if __DMC__ ++#pragma once ++#endif ++ ++#include "array.h" ++ ++class RootObject; ++ ++template struct Array; ++typedef Array Strings; ++ ++struct FileName ++{ ++ const char *str; ++ FileName(const char *str); ++ bool equals(RootObject *obj); ++ static int equals(const char *name1, const char *name2); ++ int compare(RootObject *obj); ++ static int compare(const char *name1, const char *name2); ++ static int absolute(const char *name); ++ static const char *ext(const char *); ++ const char *ext(); ++ static const char *removeExt(const char *str); ++ static const char *name(const char *); ++ const char *name(); ++ static const char *path(const char *); ++ static const char *replaceName(const char *path, const char *name); ++ ++ static const char *combine(const char *path, const char *name); ++ static Strings *splitPath(const char *path); ++ static const char *defaultExt(const char *name, const char *ext); ++ static const char *forceExt(const char *name, const char *ext); ++ static int equalsExt(const char *name, const char *ext); ++ ++ int equalsExt(const char *ext); ++ ++ static const char *searchPath(Strings *path, const char *name, int cwd); ++ static const char *safeSearchPath(Strings *path, const char *name); ++ static int exists(const char *name); ++ static int ensurePathExists(const char *path); ++ static const char *canonicalName(const char *name); ++ ++ static void free(const char *str); ++ char *toChars(); ++}; ++ ++#endif +--- a/src/gcc/d/dfrontend/func.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/func.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -25,6 +25,11 @@ + #include "template.h" + #include "hdrgen.h" + #include "target.h" ++#include "parse.h" ++#include "rmem.h" ++ ++void functionToCBuffer2(TypeFunction *t, OutBuffer *buf, HdrGenState *hgs, int mod, const char *kind); ++void genCmain(Scope *sc); + + /********************************* FuncDeclaration ****************************/ + +@@ -60,14 +65,16 @@ FuncDeclaration::FuncDeclaration(Loc loc + parameters = NULL; + labtab = NULL; + overnext = NULL; ++ overnext0 = NULL; + vtblIndex = -1; + hasReturnExp = 0; + naked = 0; + inlineStatusExp = ILSuninitialized; + inlineStatusStmt = ILSuninitialized; + inlineNest = 0; ++ ctfeCode = NULL; + isArrayOp = 0; +- semanticRun = PASSinit; ++ dArrayOp = NULL; + semantic3Errors = 0; + #if DMDV1 + nestedFrameRef = 0; +@@ -118,7 +125,6 @@ void FuncDeclaration::semantic(Scope *sc + StructDeclaration *sd; + ClassDeclaration *cd; + InterfaceDeclaration *id; +- Dsymbol *pd; + bool doesoverride; + + #if 0 +@@ -139,25 +145,17 @@ void FuncDeclaration::semantic(Scope *sc + return; + } + ++ if (semanticRun >= PASSsemanticdone) ++ return; ++ assert(semanticRun <= PASSsemantic); ++ semanticRun = PASSsemantic; ++ + parent = sc->parent; + Dsymbol *parent = toParent(); + +- if (semanticRun >= PASSsemanticdone) +- { +- if (!parent->isClassDeclaration()) +- { +- return; +- } +- // need to re-run semantic() in order to set the class's vtbl[] +- } +- else +- { +- assert(semanticRun <= PASSsemantic); +- semanticRun = PASSsemantic; +- } +- + if (scope) +- { sc = scope; ++ { ++ sc = scope; + scope = NULL; + } + +@@ -174,6 +172,9 @@ void FuncDeclaration::semantic(Scope *sc + if (StructDeclaration *sd = ad->isStructDeclaration()) + sd->makeNested(); + } ++ // Remove prefix storage classes silently. ++ if ((storage_class & STC_TYPECTOR) && !(ad || isNested())) ++ storage_class &= ~STC_TYPECTOR; + + //printf("function storage_class = x%llx, sc->stc = x%llx, %x\n", storage_class, sc->stc, Declaration::isFinal()); + +@@ -186,12 +187,34 @@ void FuncDeclaration::semantic(Scope *sc + userAttributes = sc->userAttributes; + + if (!originalType) +- originalType = type; ++ originalType = type->syntaxCopy(); + if (!type->deco) + { + sc = sc->push(); + sc->stc |= storage_class & STCdisable; // forward to function type + TypeFunction *tf = (TypeFunction *)type; ++#if 1 ++ /* If the parent is @safe, then this function defaults to safe ++ * too. ++ * If the parent's @safe-ty is inferred, then this function's @safe-ty needs ++ * to be inferred first. ++ */ ++ if (tf->trust == TRUSTdefault && ++ !(//isFuncLiteralDeclaration() || ++ parent->isTemplateInstance() || ++ ad && ad->parent && ad->parent->isTemplateInstance())) ++ { ++ for (Dsymbol *p = sc->func; p; p = p->toParent2()) ++ { FuncDeclaration *fd = p->isFuncDeclaration(); ++ if (fd) ++ { ++ if (fd->isSafeBypassingInference()) ++ tf->trust = TRUSTsafe; // default to @safe ++ break; ++ } ++ } ++ } ++#endif + if (tf->isref) sc->stc |= STCref; + if (tf->isnothrow) sc->stc |= STCnothrow; + if (tf->isproperty) sc->stc |= STCproperty; +@@ -201,10 +224,37 @@ void FuncDeclaration::semantic(Scope *sc + if (tf->trust == TRUSTtrusted) sc->stc |= STCtrusted; + + if (isCtorDeclaration()) ++ { + sc->flags |= SCOPEctor; + ++ Type *tret; ++ if (!ad || parent->isUnionDeclaration()) ++ { ++ error("constructors are only for class or struct definitions"); ++ tret = Type::tvoid; ++ } ++ else ++ { tret = ad->handle; ++ assert(tret); ++ tret = tret->addStorageClass(storage_class | sc->stc); ++ tret = tret->addMod(type->mod); ++ } ++ tf->next = tret; ++ ++ if (ad && ad->isStructDeclaration()) ++ sc->stc |= STCref; ++ } ++ + sc->linkage = linkage; + ++ if (!tf->isNaked() && !(isThis() || isNested())) ++ { ++ OutBuffer buf; ++ MODtoBuffer(&buf, tf->mod); ++ error("without 'this' cannot be %s", buf.toChars()); ++ tf->mod = 0; // remove qualifiers ++ } ++ + /* Apply const, immutable, wild and shared storage class + * to the function type. Do this before type semantic. + */ +@@ -270,38 +320,33 @@ void FuncDeclaration::semantic(Scope *sc + error("%s must be a function instead of %s", toChars(), type->toChars()); + return; + } +- f = (TypeFunction *)(type); ++ f = (TypeFunction *)type; + size_t nparams = Parameter::dim(f->parameters); + +- /* Purity and safety can be inferred for some functions by examining +- * the function body. +- */ +- if (fbody && +- (isFuncLiteralDeclaration() || parent->isTemplateInstance())) +- { +- if (f->purity == PUREimpure) // purity not specified +- flags |= FUNCFLAGpurityInprocess; +- +- if (f->trust == TRUSTdefault) +- flags |= FUNCFLAGsafetyInprocess; +- +- if (!f->isnothrow) +- flags |= FUNCFLAGnothrowInprocess; +- } +- + if (storage_class & STCscope) + error("functions cannot be scope"); + + if (isAbstract() && !isVirtual()) +- error("non-virtual functions cannot be abstract"); ++ { ++ const char *sfunc; ++ if (isStatic()) ++ sfunc = "static"; ++ else if (protection == PROTprivate || protection == PROTpackage) ++ sfunc = Pprotectionnames[protection]; ++ else ++ sfunc = "non-virtual"; ++ error("%s functions cannot be abstract", sfunc); ++ } + + if (isOverride() && !isVirtual()) +- error("cannot override a non-virtual function"); +- +- if ((f->isConst() || f->isImmutable()) && !isThis()) +- error("without 'this' cannot be const/immutable"); ++ { ++ if ((prot() == PROTprivate || prot() == PROTpackage) && isMember()) ++ error("%s method is not virtual and cannot override", Pprotectionnames[prot()]); ++ else ++ error("cannot override a non-virtual function"); ++ } + +- if (isAbstract() && isFinal()) ++ if (isAbstract() && isFinalFunc()) + error("cannot be both final and abstract"); + #if 0 + if (isAbstract() && fbody) +@@ -337,8 +382,8 @@ void FuncDeclaration::semantic(Scope *sc + error("special member functions not allowed for %ss", sd->kind()); + } + +- if (!sd->inv) +- sd->inv = isInvariantDeclaration(); ++ if (isInvariantDeclaration()) ++ sd->invs.push(this); + + if (!sd->aggNew) + sd->aggNew = isNewDeclaration(); +@@ -376,11 +421,8 @@ void FuncDeclaration::semantic(Scope *sc + + cd = parent->isClassDeclaration(); + if (cd) +- { size_t vi; +- CtorDeclaration *ctor; +- DtorDeclaration *dtor; +- InvariantDeclaration *inv; +- ++ { ++ size_t vi; + if (isCtorDeclaration()) + { + // ctor = (CtorDeclaration *)this; +@@ -389,35 +431,6 @@ void FuncDeclaration::semantic(Scope *sc + goto Ldone; + } + +-#if 0 +- dtor = isDtorDeclaration(); +- if (dtor) +- { +- if (cd->dtor) +- error("multiple destructors for class %s", cd->toChars()); +- cd->dtor = dtor; +- } +- +- inv = isInvariantDeclaration(); +- if (inv) +- { +- cd->inv = inv; +- } +- +- if (isNewDeclaration()) +- { +- if (!cd->aggNew) +- cd->aggNew = (NewDeclaration *)(this); +- } +- +- if (isDelete()) +- { +- if (cd->aggDelete) +- error("multiple delete's for class %s", cd->toChars()); +- cd->aggDelete = (DeleteDeclaration *)(this); +- } +-#endif +- + if (storage_class & STCabstract) + cd->isabstract = 1; + +@@ -431,6 +444,34 @@ void FuncDeclaration::semantic(Scope *sc + if (type->nextOf() == Type::terror) + goto Ldone; + ++ bool may_override = false; ++ for (size_t i = 0; i < cd->baseclasses->dim; i++) ++ { ++ BaseClass *b = (*cd->baseclasses)[i]; ++ ClassDeclaration *cbd = b->type->toBasetype()->isClassHandle(); ++ if (!cbd) ++ continue; ++ for (size_t j = 0; j < cbd->vtbl.dim; j++) ++ { ++ FuncDeclaration *f = cbd->vtbl[j]->isFuncDeclaration(); ++ if (!f || f->ident != ident) ++ continue; ++ if (cbd->parent && cbd->parent->isTemplateInstance()) ++ { ++ if (!f->functionSemantic()) ++ goto Ldone; ++ } ++ may_override = true; ++ } ++ } ++ if (may_override && type->nextOf() == NULL) ++ { ++ /* If same name function exists in base class but 'this' is auto return, ++ * cannot find index of base class's vtbl[] to override. ++ */ ++ error("return type inference is not supported if may override base class function"); ++ } ++ + /* Find index of existing function in base class's vtbl[] to override + * (the index will be the same as in cd's current vtbl[]) + */ +@@ -440,7 +481,7 @@ void FuncDeclaration::semantic(Scope *sc + doesoverride = FALSE; + switch (vi) + { +- case -1: ++ case (size_t)-1: + Lintro: + /* Didn't find one, so + * This is an 'introducing' function which gets a new +@@ -453,13 +494,16 @@ void FuncDeclaration::semantic(Scope *sc + if (s) + { + FuncDeclaration *f = s->isFuncDeclaration(); +- f = f->overloadExactMatch(type); +- if (f && f->isFinal() && f->prot() != PROTprivate) +- error("cannot override final function %s", f->toPrettyChars()); ++ if (f) ++ { ++ f = f->overloadExactMatch(type); ++ if (f && f->isFinalFunc() && f->prot() != PROTprivate) ++ error("cannot override final function %s", f->toPrettyChars()); ++ } + } + } + +- if (isFinal()) ++ if (isFinalFunc()) + { + // Don't check here, as it may override an interface function + //if (isOverride()) +@@ -477,7 +521,7 @@ void FuncDeclaration::semantic(Scope *sc + } + break; + +- case -2: // can't determine because of fwd refs ++ case (size_t)-2: // can't determine because of fwd refs + cd->sizeok = SIZEOKfwd; // can't finish due to forward reference + Module::dprogress = dprogress_save; + return; +@@ -487,6 +531,12 @@ void FuncDeclaration::semantic(Scope *sc + FuncDeclaration *fdc = cd->vtbl[vi]->isFuncDeclaration(); + // This function is covariant with fdv + ++ if (fdc == this) ++ { ++ doesoverride = TRUE; ++ break; ++ } ++ + if (fdc->toParent() == parent) + { + //printf("vi = %d,\tthis = %p %s %s @ [%s]\n\tfdc = %p %s %s @ [%s]\n\tfdv = %p %s %s @ [%s]\n", +@@ -500,7 +550,7 @@ void FuncDeclaration::semantic(Scope *sc + } + + // This function overrides fdv +- if (fdv->isFinal()) ++ if (fdv->isFinalFunc()) + error("cannot override final function %s", fdv->toPrettyChars()); + + doesoverride = TRUE; +@@ -566,10 +616,10 @@ void FuncDeclaration::semantic(Scope *sc + vi = findVtblIndex((Dsymbols *)&b->base->vtbl, b->base->vtbl.dim); + switch (vi) + { +- case -1: ++ case (size_t)-1: + break; + +- case -2: ++ case (size_t)-2: + cd->sizeok = SIZEOKfwd; // can't finish due to forward reference + Module::dprogress = dprogress_save; + return; +@@ -633,7 +683,7 @@ void FuncDeclaration::semantic(Scope *sc + } + } + +- if (!doesoverride && isOverride()) ++ if (!doesoverride && isOverride() && type->nextOf()) + { + Dsymbol *s = NULL; + for (size_t i = 0; i < cd->baseclasses->dim; i++) +@@ -665,7 +715,7 @@ void FuncDeclaration::semantic(Scope *sc + if (f) + { + f = f->overloadExactMatch(type); +- if (f && f->isFinal() && f->prot() != PROTprivate) ++ if (f && f->isFinalFunc() && f->prot() != PROTprivate) + error("cannot override final function %s.%s", b->base->toChars(), f->toPrettyChars()); + } + } +@@ -675,6 +725,10 @@ void FuncDeclaration::semantic(Scope *sc + else if (isOverride() && !parent->isTemplateInstance()) + error("override only applies to class member functions"); + ++ // Reflect this->type to f because it could be changed by findVtblIndex ++ assert(type->ty == Tfunction); ++ f = (TypeFunction *)type; ++ + /* Do not allow template instances to add virtual functions + * to a class. + */ +@@ -742,13 +796,17 @@ void FuncDeclaration::semantic(Scope *sc + * can call them. + */ + if (frequire) +- { /* in { ... } ++ { ++ /* in { ... } + * becomes: + * void __require() { ... } + * __require(); + */ + Loc loc = frequire->loc; + TypeFunction *tf = new TypeFunction(NULL, Type::tvoid, 0, LINKd); ++ tf->isnothrow = f->isnothrow; ++ tf->purity = f->purity; ++ tf->trust = f->trust; + FuncDeclaration *fd = new FuncDeclaration(loc, loc, + Id::require, STCundefined, tf); + fd->fbody = frequire; +@@ -763,9 +821,10 @@ void FuncDeclaration::semantic(Scope *sc + outId = Id::result; // provide a default + + if (fensure) +- { /* out (result) { ... } ++ { ++ /* out (result) { ... } + * becomes: +- * tret __ensure(ref tret result) { ... } ++ * void __ensure(ref tret result) { ... } + * __ensure(result); + */ + Loc loc = fensure->loc; +@@ -776,6 +835,9 @@ void FuncDeclaration::semantic(Scope *sc + arguments->push(a); + } + TypeFunction *tf = new TypeFunction(arguments, Type::tvoid, 0, LINKd); ++ tf->isnothrow = f->isnothrow; ++ tf->purity = f->purity; ++ tf->trust = f->trust; + FuncDeclaration *fd = new FuncDeclaration(loc, loc, + Id::ensure, STCundefined, tf); + fd->fbody = fensure; +@@ -791,6 +853,26 @@ void FuncDeclaration::semantic(Scope *sc + } + + Ldone: ++ /* Purity and safety can be inferred for some functions by examining ++ * the function body. ++ */ ++ if (fbody && ++ (isFuncLiteralDeclaration() || ++ parent->isTemplateInstance() || ++ ad && ad->parent && ad->parent->isTemplateInstance() && !isVirtualMethod())) ++ { ++ /* isVirtualMethod() needs setting correct foverrides ++ */ ++ if (f->purity == PUREimpure) // purity not specified ++ flags |= FUNCFLAGpurityInprocess; ++ ++ if (f->trust == TRUSTdefault) ++ flags |= FUNCFLAGsafetyInprocess; ++ ++ if (!f->isnothrow) ++ flags |= FUNCFLAGnothrowInprocess; ++ } ++ + Module::dprogress++; + semanticRun = PASSsemanticdone; + +@@ -799,6 +881,24 @@ Ldone: + */ + scope = new Scope(*sc); + scope->setNoFree(); ++ ++ static bool printedMain = false; // semantic might run more than once ++ if (global.params.verbose && !printedMain) ++ { ++ const char *type = isMain() ? "main" : isWinMain() ? "winmain" : isDllMain() ? "dllmain" : (const char *)NULL; ++ Module *mod = sc->module; ++ ++ if (type && mod) ++ { ++ printedMain = true; ++ const char *name = FileName::searchPath(global.path, mod->srcfile->toChars(), 1); ++ fprintf(global.stdmsg, "entry %-10s\t%s\n", type, name); ++ } ++ } ++ ++ if (fbody && isMain() && sc->module->isRoot()) ++ genCmain(sc); ++ + return; + } + +@@ -835,7 +935,7 @@ void FuncDeclaration::semantic3(Scope *s + + if (!type || type->ty != Tfunction) + return; +- f = (TypeFunction *)(type); ++ f = (TypeFunction *)type; + if (!inferRetType && f->next->ty == Terror) + return; + +@@ -875,7 +975,7 @@ void FuncDeclaration::semantic3(Scope *s + } + + frequire = mergeFrequire(frequire); +- fensure = mergeFensure(fensure); ++ fensure = mergeFensure(fensure, outId); + + if (fbody || frequire || fensure) + { +@@ -903,11 +1003,15 @@ void FuncDeclaration::semantic3(Scope *s + sc2->protection = PROTpublic; + sc2->explicitProtection = 0; + sc2->structalign = STRUCTALIGN_DEFAULT; +- sc2->flags = sc->flags & ~SCOPEcontract; ++ if (this->ident != Id::require && this->ident != Id::ensure) ++ sc2->flags = sc->flags & ~SCOPEcontract; + sc2->tf = NULL; + sc2->noctor = 0; + sc2->speculative = sc->speculative || isSpeculative() != NULL; + sc2->userAttributes = NULL; ++ if (sc2->intypeof == 1) sc2->intypeof = 2; ++ sc2->fieldinit = NULL; ++ sc2->fieldinit_dim = 0; + + // Declare 'this' + AggregateDeclaration *ad = isThis(); +@@ -950,15 +1054,15 @@ void FuncDeclaration::semantic3(Scope *s + + if (f->linkage == LINKd) + { // Declare _arguments[] +- v_arguments = new VarDeclaration(0, Type::typeinfotypelist->type, Id::_arguments_typeinfo, NULL); ++ v_arguments = new VarDeclaration(Loc(), Type::typeinfotypelist->type, Id::_arguments_typeinfo, NULL); + v_arguments->storage_class = STCparameter; + v_arguments->semantic(sc2); + sc2->insert(v_arguments); + v_arguments->parent = this; + + //t = Type::typeinfo->type->constOf()->arrayOf(); +- t = Type::typeinfo->type->arrayOf(); +- _arguments = new VarDeclaration(0, t, Id::_arguments, NULL); ++ t = Type::dtypeinfo->type->arrayOf(); ++ _arguments = new VarDeclaration(Loc(), t, Id::_arguments, NULL); + _arguments->semantic(sc2); + sc2->insert(_arguments); + _arguments->parent = this; +@@ -966,7 +1070,7 @@ void FuncDeclaration::semantic3(Scope *s + if (f->linkage == LINKd || (f->parameters && Parameter::dim(f->parameters))) + { // Declare _argptr + t = Type::tvalist; +- argptr = new VarDeclaration(0, t, Id::_argptr, NULL); ++ argptr = new VarDeclaration(Loc(), t, Id::_argptr, NULL); + argptr->semantic(sc2); + sc2->insert(argptr); + argptr->parent = this; +@@ -1015,8 +1119,6 @@ void FuncDeclaration::semantic3(Scope *s + arg->ident = id = Identifier::generateId("_param_", i); + } + Type *vtype = arg->type; +- //if (isPure()) +- //vtype = vtype->addMod(MODconst); + VarDeclaration *v = new VarDeclaration(loc, vtype, id, NULL); + //printf("declaring parameter %s of type %s\n", v->toChars(), v->type->toChars()); + v->storage_class |= STCparameter; +@@ -1050,7 +1152,7 @@ void FuncDeclaration::semantic3(Scope *s + for (size_t j = 0; j < dim; j++) + { Parameter *narg = Parameter::getNth(t->arguments, j); + assert(narg->ident); +- VarDeclaration *v = sc2->search(0, narg->ident, NULL)->isVarDeclaration(); ++ VarDeclaration *v = sc2->search(Loc(), narg->ident, NULL)->isVarDeclaration(); + assert(v); + Expression *e = new VarExp(v->loc, v); + (*exps)[j] = e; +@@ -1058,7 +1160,7 @@ void FuncDeclaration::semantic3(Scope *s + assert(arg->ident); + TupleDeclaration *v = new TupleDeclaration(loc, arg->ident, exps); + //printf("declaring tuple %s\n", v->toChars()); +- v->isexp = 1; ++ v->isexp = true; + if (!sc2->insert(v)) + error("parameter %s.%s is already defined", toChars(), v->toChars()); + localsymtab->insert(v); +@@ -1075,7 +1177,7 @@ void FuncDeclaration::semantic3(Scope *s + if (isDtorDeclaration()) + { + // Call invariant directly only if it exists +- InvariantDeclaration *inv = ad->inv; ++ FuncDeclaration *inv = ad->inv; + ClassDeclaration *cd = ad->isClassDeclaration(); + + while (!inv && cd) +@@ -1087,24 +1189,24 @@ void FuncDeclaration::semantic3(Scope *s + } + if (inv) + { +- e = new DsymbolExp(0, inv); +- e = new CallExp(0, e); ++ e = new DsymbolExp(Loc(), inv); ++ e = new CallExp(Loc(), e); + e = e->semantic(sc2); + } + } + else + { // Call invariant virtually +- Expression *v = new ThisExp(0); ++ Expression *v = new ThisExp(Loc()); + v->type = vthis->type; + if (ad->isStructDeclaration()) + v = v->addressOf(sc); +- Expression *se = new StringExp(0, (char *)"null this"); ++ Expression *se = new StringExp(Loc(), (char *)"null this"); + se = se->semantic(sc); + se->type = Type::tchar->arrayOf(); + e = new AssertExp(loc, v, se); + } + if (e) +- fpreinv = new ExpStatement(0, e); ++ fpreinv = new ExpStatement(Loc(), e); + } + + // Postcondition invariant +@@ -1115,7 +1217,7 @@ void FuncDeclaration::semantic3(Scope *s + if (isCtorDeclaration()) + { + // Call invariant directly only if it exists +- InvariantDeclaration *inv = ad->inv; ++ FuncDeclaration *inv = ad->inv; + ClassDeclaration *cd = ad->isClassDeclaration(); + + while (!inv && cd) +@@ -1127,21 +1229,21 @@ void FuncDeclaration::semantic3(Scope *s + } + if (inv) + { +- e = new DsymbolExp(0, inv); +- e = new CallExp(0, e); ++ e = new DsymbolExp(Loc(), inv); ++ e = new CallExp(Loc(), e); + e = e->semantic(sc2); + } + } + else + { // Call invariant virtually +- Expression *v = new ThisExp(0); ++ Expression *v = new ThisExp(Loc()); + v->type = vthis->type; + if (ad->isStructDeclaration()) + v = v->addressOf(sc); +- e = new AssertExp(0, v); ++ e = new AssertExp(Loc(), v); + } + if (e) +- fpostinv = new ExpStatement(0, e); ++ fpostinv = new ExpStatement(Loc(), e); + } + + if (fensure || addPostInvariant()) +@@ -1168,10 +1270,13 @@ void FuncDeclaration::semantic3(Scope *s + */ + if (ad && isCtorDeclaration()) + { ++ sc2->fieldinit = new unsigned[ad->fields.dim]; ++ sc2->fieldinit_dim = ad->fields.dim; + for (size_t i = 0; i < ad->fields.dim; i++) +- { VarDeclaration *v = ad->fields[i]; +- ++ { ++ VarDeclaration *v = ad->fields[i]; + v->ctorinit = 0; ++ sc2->fieldinit[i] = 0; + } + } + +@@ -1180,29 +1285,34 @@ void FuncDeclaration::semantic3(Scope *s + + fbody = fbody->semantic(sc2); + if (!fbody) +- fbody = new CompoundStatement(0, new Statements()); ++ fbody = new CompoundStatement(Loc(), new Statements()); + + if (inferRetType) +- { // If no return type inferred yet, then infer a void ++ { ++ // If no return type inferred yet, then infer a void + if (!type->nextOf()) + { + f->next = Type::tvoid; + //type = type->semantic(loc, sc); // Removed with 6902 + } +- else if (returns && f->next->ty != Tvoid) ++ } ++ if (returns && f->next->ty != Tvoid) ++ { ++ for (size_t i = 0; i < returns->dim; i++) + { +- for (size_t i = 0; i < returns->dim; i++) +- { Expression *exp = (*returns)[i]->exp; +- if (!f->next->invariantOf()->equals(exp->type->invariantOf())) +- { exp = exp->castTo(sc2, f->next); +- exp = exp->optimize(WANTvalue); +- (*returns)[i]->exp = exp; +- } +- //printf("[%d] %s %s\n", i, exp->type->toChars(), exp->toChars()); ++ Expression *exp = (*returns)[i]->exp; ++ if (!nrvo_can && !f->isref && exp->isLvalue()) ++ exp = callCpCtor(sc2, exp); ++ if (!tintro && !f->next->immutableOf()->equals(exp->type->immutableOf())) ++ { ++ exp = exp->castTo(sc2, f->next); ++ exp = exp->optimize(WANTvalue); + } ++ //printf("[%d] %s %s\n", i, exp->type->toChars(), exp->toChars()); ++ (*returns)[i]->exp = exp; + } +- assert(type == f); + } ++ assert(type == f); + + if (isStaticCtorDeclaration()) + { /* It's a static constructor. Ensure that all +@@ -1225,14 +1335,16 @@ void FuncDeclaration::semantic3(Scope *s + } + } + +- if (isCtorDeclaration() && ad) ++ if (fbody->isErrorStatement()) ++ ; ++ else if (isCtorDeclaration() && ad) + { + #if DMDV2 + // Check for errors related to 'nothrow'. + int nothrowErrors = global.errors; + int blockexit = fbody->blockExit(f->isnothrow); + if (f->isnothrow && (global.errors != nothrowErrors) ) +- error("'%s' is nothrow yet may throw", toChars()); ++ ::error(loc, "%s '%s' is nothrow yet may throw", kind(), toPrettyChars()); + if (flags & FUNCFLAGnothrowInprocess) + f->isnothrow = !(blockexit & BEthrow); + #endif +@@ -1261,8 +1373,20 @@ void FuncDeclaration::semantic3(Scope *s + else if (v->type->needsNested()) + error("field %s must be initialized in constructor, because it is nested struct", v->toChars()); + } ++ else ++ { ++ bool mustInit = (v->storage_class & STCnodefaultctor || ++ v->type->needsNested()); ++ if (mustInit && !(sc2->fieldinit[i] & CSXthis_ctor)) ++ { ++ error("field %s must be initialized but skipped", v->toChars()); ++ } ++ } + } + } ++ delete[] sc2->fieldinit; ++ sc2->fieldinit = NULL; ++ sc2->fieldinit_dim = 0; + + if (cd && + !(sc2->callSuper & CSXany_ctor) && +@@ -1271,19 +1395,18 @@ void FuncDeclaration::semantic3(Scope *s + sc2->callSuper = 0; + + // Insert implicit super() at start of fbody +- Expression *e1 = new SuperExp(0); +- Expression *e = new CallExp(0, e1); +- +- e = e->trySemantic(sc2); +- if (!e) ++ if (!resolveFuncCall(Loc(), sc2, cd->baseClass->ctor, NULL, NULL, NULL, 1)) + { +- const char* impGen = ((CtorDeclaration*)this)->isImplicit ? "implicitly generated " : ""; +- error("no match for implicit super() call in %sconstructor", impGen); ++ error("no match for implicit super() call in constructor"); + } + else + { +- Statement *s = new ExpStatement(0, e); +- fbody = new CompoundStatement(0, s, fbody); ++ Expression *e1 = new SuperExp(Loc()); ++ Expression *e = new CallExp(Loc(), e1); ++ e = e->semantic(sc2); ++ ++ Statement *s = new ExpStatement(Loc(), e); ++ fbody = new CompoundStatement(Loc(), s, fbody); + } + } + +@@ -1304,8 +1427,8 @@ void FuncDeclaration::semantic3(Scope *s + else if (fes) + { // For foreach(){} body, append a return 0; + Expression *e = new IntegerExp(0); +- Statement *s = new ReturnStatement(0, e); +- fbody = new CompoundStatement(0, fbody, s); ++ Statement *s = new ReturnStatement(Loc(), e); ++ fbody = new CompoundStatement(Loc(), fbody, s); + assert(!returnLabel); + } + else if (!hasReturnExp && type->nextOf()->ty != Tvoid) +@@ -1321,10 +1444,10 @@ void FuncDeclaration::semantic3(Scope *s + int nothrowErrors = global.errors; + int blockexit = fbody->blockExit(f->isnothrow); + if (f->isnothrow && (global.errors != nothrowErrors) ) +- error("'%s' is nothrow yet may throw", toChars()); ++ ::error(loc, "%s '%s' is nothrow yet may throw", kind(), toPrettyChars()); + if (flags & FUNCFLAGnothrowInprocess) + { +- if (type == f) f = f->copy(); ++ if (type == f) f = (TypeFunction *)f->copy(); + f->isnothrow = !(blockexit & BEthrow); + } + +@@ -1352,10 +1475,10 @@ void FuncDeclaration::semantic3(Scope *s + } + else + e = new HaltExp(endloc); +- e = new CommaExp(0, e, type->nextOf()->defaultInit()); ++ e = new CommaExp(Loc(), e, type->nextOf()->defaultInit()); + e = e->semantic(sc2); +- Statement *s = new ExpStatement(0, e); +- fbody = new CompoundStatement(0, fbody, s); ++ Statement *s = new ExpStatement(Loc(), e); ++ fbody = new CompoundStatement(Loc(), fbody, s); + } + } + } +@@ -1405,6 +1528,12 @@ void FuncDeclaration::semantic3(Scope *s + + // BUG: need to treat parameters as const + // BUG: need to disallow returns and throws ++ if (inferRetType && fdensure && ((TypeFunction *)fdensure->type)->parameters) ++ { ++ // Return type was unknown in the first semantic pass ++ Parameter *p = (*((TypeFunction *)fdensure->type)->parameters)[0]; ++ p->type = ((TypeFunction *)type)->nextOf(); ++ } + fens = fens->semantic(sc2); + + sc2 = sc2->pop(); +@@ -1428,7 +1557,7 @@ void FuncDeclaration::semantic3(Scope *s + assert(ie); + if (ie->exp->op == TOKconstruct) + ie->exp->op = TOKassign; // construction occured in parameter processing +- a->push(new ExpStatement(0, ie->exp)); ++ a->push(new ExpStatement(Loc(), ie->exp)); + } + } + } +@@ -1443,12 +1572,12 @@ void FuncDeclaration::semantic3(Scope *s + Type *t = argptr->type; + if (global.params.is64bit && !global.params.isWindows) + { // Initialize _argptr to point to v_argsave +- Expression *e1 = new VarExp(0, argptr); +- Expression *e = new SymOffExp(0, v_argsave, 6*8 + 8*16); ++ Expression *e1 = new VarExp(Loc(), argptr); ++ Expression *e = new SymOffExp(Loc(), v_argsave, 6*8 + 8*16); + e->type = argptr->type; +- e = new AssignExp(0, e1, e); ++ e = new AssignExp(Loc(), e1, e); + e = e->semantic(sc); +- a->push(new ExpStatement(0, e)); ++ a->push(new ExpStatement(Loc(), e)); + } + else + { // Initialize _argptr to point past non-variadic arg +@@ -1456,7 +1585,7 @@ void FuncDeclaration::semantic3(Scope *s + unsigned offset = 0; + Expression *e; + +- Expression *e1 = new VarExp(0, argptr); ++ Expression *e1 = new VarExp(Loc(), argptr); + // Find the last non-ref parameter + if (parameters && parameters->dim) + { +@@ -1481,16 +1610,16 @@ void FuncDeclaration::semantic3(Scope *s + p = v_arguments; // last parameter is _arguments[] + if (global.params.is64bit && global.params.isWindows) + { offset += Target::ptrsize; +- if (p->storage_class & STClazy) ++ if (p->storage_class & STClazy || p->type->size() > Target::ptrsize) + { + /* Necessary to offset the extra level of indirection the Win64 + * ABI demands + */ +- e = new SymOffExp(0,p,0); ++ e = new SymOffExp(Loc(),p,0); + e->type = Type::tvoidptr; +- e = new AddrExp(0, e); ++ e = new AddrExp(Loc(), e); + e->type = Type::tvoidptr; +- e = new AddExp(0, e, new IntegerExp(offset)); ++ e = new AddExp(Loc(), e, new IntegerExp(offset)); + e->type = Type::tvoidptr; + goto L1; + } +@@ -1501,13 +1630,13 @@ void FuncDeclaration::semantic3(Scope *s + else + offset += p->type->size(); + offset = (offset + Target::ptrsize - 1) & ~(Target::ptrsize - 1); // assume stack aligns on pointer size +- e = new SymOffExp(0, p, offset); ++ e = new SymOffExp(Loc(), p, offset); + e->type = Type::tvoidptr; + //e = e->semantic(sc); + L1: +- e = new AssignExp(0, e1, e); ++ e = new AssignExp(Loc(), e1, e); + e->type = t; +- a->push(new ExpStatement(0, e)); ++ a->push(new ExpStatement(Loc(), e)); + p->isargptr = TRUE; + } + #endif +@@ -1522,12 +1651,12 @@ void FuncDeclaration::semantic3(Scope *s + /* Advance to elements[] member of TypeInfo_Tuple with: + * _arguments = v_arguments.elements; + */ +- Expression *e = new VarExp(0, v_arguments); +- e = new DotIdExp(0, e, Id::elements); +- Expression *e1 = new VarExp(0, _arguments); +- e = new ConstructExp(0, e1, e); ++ Expression *e = new VarExp(Loc(), v_arguments); ++ e = new DotIdExp(Loc(), e, Id::elements); ++ Expression *e1 = new VarExp(Loc(), _arguments); ++ e = new ConstructExp(Loc(), e1, e); + e = e->semantic(sc2); +- a->push(new ExpStatement(0, e)); ++ a->push(new ExpStatement(Loc(), e)); + } + + // Merge contracts together with body into one compound statement +@@ -1537,7 +1666,7 @@ void FuncDeclaration::semantic3(Scope *s + if (!freq) + freq = fpreinv; + else if (fpreinv) +- freq = new CompoundStatement(0, freq, fpreinv); ++ freq = new CompoundStatement(Loc(), freq, fpreinv); + + a->push(freq); + } +@@ -1550,31 +1679,31 @@ void FuncDeclaration::semantic3(Scope *s + if (!fens) + fens = fpostinv; + else if (fpostinv) +- fens = new CompoundStatement(0, fpostinv, fens); ++ fens = new CompoundStatement(Loc(), fpostinv, fens); + +- LabelStatement *ls = new LabelStatement(0, Id::returnLabel, fens); ++ LabelStatement *ls = new LabelStatement(Loc(), Id::returnLabel, fens); + returnLabel->statement = ls; + a->push(returnLabel->statement); + + if (type->nextOf()->ty != Tvoid && vresult) + { + // Create: return vresult; +- Expression *e = new VarExp(0, vresult); ++ Expression *e = new VarExp(Loc(), vresult); + if (tintro) + { e = e->implicitCastTo(sc, tintro->nextOf()); + e = e->semantic(sc); + } +- ReturnStatement *s = new ReturnStatement(0, e); ++ ReturnStatement *s = new ReturnStatement(Loc(), e); + a->push(s); + } + } + if (isMain() && type->nextOf()->ty == Tvoid) + { // Add a return 0; statement +- Statement *s = new ReturnStatement(0, new IntegerExp(0)); ++ Statement *s = new ReturnStatement(Loc(), new IntegerExp(0)); + a->push(s); + } + +- fbody = new CompoundStatement(0, a); ++ fbody = new CompoundStatement(Loc(), a); + #if DMDV2 + /* Append destructor calls for parameters as finally blocks. + */ +@@ -1591,19 +1720,19 @@ void FuncDeclaration::semantic3(Scope *s + + Expression *e = v->edtor; + if (e) +- { Statement *s = new ExpStatement(0, e); ++ { Statement *s = new ExpStatement(Loc(), e); + s = s->semantic(sc2); + int nothrowErrors = global.errors; + bool isnothrow = f->isnothrow & !(flags & FUNCFLAGnothrowInprocess); + int blockexit = s->blockExit(isnothrow); + if (f->isnothrow && (global.errors != nothrowErrors) ) +- error("'%s' is nothrow yet may throw", toChars()); ++ ::error(loc, "%s '%s' is nothrow yet may throw", kind(), toPrettyChars()); + if (flags & FUNCFLAGnothrowInprocess && blockexit & BEthrow) + f->isnothrow = FALSE; + if (fbody->blockExit(f->isnothrow) == BEfallthru) +- fbody = new CompoundStatement(0, fbody, s); ++ fbody = new CompoundStatement(Loc(), fbody, s); + else +- fbody = new TryFinallyStatement(0, fbody, s); ++ fbody = new TryFinallyStatement(Loc(), fbody, s); + } + } + } +@@ -1621,7 +1750,7 @@ void FuncDeclaration::semantic3(Scope *s + { + if (!global.params.is64bit && + global.params.isWindows && +- !isStatic() && !fbody->usesEH()) ++ !isStatic() && !fbody->usesEH() && !global.params.trace) + { + /* The back end uses the "jmonitor" hack for syncing; + * no need to do the sync at this level. +@@ -1659,14 +1788,14 @@ void FuncDeclaration::semantic3(Scope *s + if (flags & FUNCFLAGpurityInprocess) + { + flags &= ~FUNCFLAGpurityInprocess; +- if (type == f) f = f->copy(); ++ if (type == f) f = (TypeFunction *)f->copy(); + f->purity = PUREfwdref; + } + + if (flags & FUNCFLAGsafetyInprocess) + { + flags &= ~FUNCFLAGsafetyInprocess; +- if (type == f) f = f->copy(); ++ if (type == f) f = (TypeFunction *)f->copy(); + f->trust = TRUSTsafe; + } + +@@ -1678,6 +1807,7 @@ void FuncDeclaration::semantic3(Scope *s + if (!f->deco) + { + sc = sc->push(); ++ sc->stc = 0; + sc->linkage = linkage; // Bugzilla 8496 + type = f->semantic(loc, sc); + sc = sc->pop(); +@@ -1705,7 +1835,10 @@ void FuncDeclaration::semantic3(Scope *s + + bool FuncDeclaration::functionSemantic() + { +- if (scope && !originalType) // semantic not yet run ++ if (!scope) ++ return true; ++ ++ if (!originalType) // semantic not yet run + { + TemplateInstance *spec = isSpeculative(); + unsigned olderrs = global.errors; +@@ -1721,10 +1854,26 @@ bool FuncDeclaration::functionSemantic() + } + + // if inferring return type, sematic3 needs to be run +- if (scope && (inferRetType && type && !type->nextOf() || +- getFuncTemplateDecl(this))) +- { ++ if (inferRetType && type && !type->nextOf()) + return functionSemantic3(); ++ ++ TemplateInstance *ti = parent->isTemplateInstance(); ++ if (ti && !ti->isTemplateMixin() && ti->name == ident) ++ return functionSemantic3(); ++ ++ AggregateDeclaration *ad = isThis(); ++ if (ad && ad->parent && ad->parent->isTemplateInstance() && !isVirtualMethod()) ++ { ++ if (ad->sizeok != SIZEOKdone) ++ { ++ /* Currently dmd cannot resolve forward references per methods, ++ * then setting SIZOKfwd is too conservative and would break existing code. ++ * So, just stop method attributes inference until ad->semantic() done. ++ */ ++ //ad->sizeok = SIZEOKfwd; ++ } ++ else ++ return functionSemantic3(); + } + + return true; +@@ -1791,8 +1940,6 @@ VarDeclaration *FuncDeclaration::declare + Type *thandle = ad->handle; + thandle = thandle->addMod(type->mod); + thandle = thandle->addStorageClass(storage_class); +- //if (isPure()) +- //thandle = thandle->addMod(MODconst); + v = new ThisDeclaration(loc, thandle); + //v = new ThisDeclaration(loc, isCtorDeclaration() ? ad->handle : thandle); + v->storage_class |= STCparameter; +@@ -1823,24 +1970,38 @@ VarDeclaration *FuncDeclaration::declare + return NULL; + } + +-int FuncDeclaration::equals(Object *o) ++bool FuncDeclaration::equals(RootObject *o) + { + if (this == o) +- return TRUE; ++ return true; + + Dsymbol *s = isDsymbol(o); + if (s) + { +- FuncDeclaration *fd1 = this->toAliasFunc(); ++ FuncDeclaration *fd1 = this; + FuncDeclaration *fd2 = s->isFuncDeclaration(); +- if (fd2) +- { +- fd2 = fd2->toAliasFunc(); +- return fd1->toParent()->equals(fd2->toParent()) && +- fd1->ident->equals(fd2->ident) && fd1->type->equals(fd2->type); ++ if (!fd2) ++ return false; ++ ++ FuncAliasDeclaration *fa1 = fd1->isFuncAliasDeclaration(); ++ FuncAliasDeclaration *fa2 = fd2->isFuncAliasDeclaration(); ++ if (fa1 && fa2) ++ { ++ return fa1->toAliasFunc()->equals(fa2->toAliasFunc()) && ++ fa1->hasOverloads == fa2->hasOverloads; + } ++ ++ if (fa1 && (fd1 = fa1->toAliasFunc())->isUnique() && !fa1->hasOverloads) ++ fa1 = NULL; ++ if (fa2 && (fd2 = fa2->toAliasFunc())->isUnique() && !fa2->hasOverloads) ++ fa2 = NULL; ++ if ((fa1 != NULL) != (fa2 != NULL)) ++ return false; ++ ++ return fd1->toParent()->equals(fd2->toParent()) && ++ fd1->ident->equals(fd2->ident) && fd1->type->equals(fd2->type); + } +- return FALSE; ++ return false; + } + + void FuncDeclaration::bodyToCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -1909,7 +2070,7 @@ void FuncDeclaration::buildResultVar() + + assert(type->nextOf()); + assert(type->nextOf()->toBasetype()->ty != Tvoid); +- TypeFunction *tf = (TypeFunction *)(type); ++ TypeFunction *tf = (TypeFunction *)type; + + Loc loc = this->loc; + +@@ -2024,7 +2185,7 @@ Statement *FuncDeclaration::mergeFrequir + * 'out's are AND'd together, i.e. all of them need to pass. + */ + +-Statement *FuncDeclaration::mergeFensure(Statement *sf) ++Statement *FuncDeclaration::mergeFensure(Statement *sf, Identifier *oid) + { + /* Same comments as for mergeFrequire(), except that we take care + * of generating a consistent reference to the 'result' local by +@@ -2051,7 +2212,7 @@ Statement *FuncDeclaration::mergeFensure + sc->pop(); + } + +- sf = fdv->mergeFensure(sf); ++ sf = fdv->mergeFensure(sf, oid); + if (fdv->fdensure) + { + //printf("fdv->fensure: %s\n", fdv->fensure->toChars()); +@@ -2059,22 +2220,21 @@ Statement *FuncDeclaration::mergeFensure + Expression *eresult = NULL; + if (outId) + { +- eresult = new IdentifierExp(loc, outId); ++ eresult = new IdentifierExp(loc, oid); + + Type *t1 = fdv->type->nextOf()->toBasetype(); + Type *t2 = this->type->nextOf()->toBasetype(); +- int offset; +- if (t1->isBaseOf(t2, &offset) && offset != 0) ++ if (t1->isBaseOf(t2, NULL)) + { + /* Making temporary reference variable is necessary +- * to match offset difference in covariant return. +- * See bugzilla 5204. ++ * in covariant return. ++ * See bugzilla 5204 and 10479. + */ +- ExpInitializer *ei = new ExpInitializer(0, eresult); +- VarDeclaration *v = new VarDeclaration(0, t1, Lexer::uniqueId("__covres"), ei); +- DeclarationExp *de = new DeclarationExp(0, v); +- VarExp *ve = new VarExp(0, v); +- eresult = new CommaExp(0, de, ve); ++ ExpInitializer *ei = new ExpInitializer(Loc(), eresult); ++ VarDeclaration *v = new VarDeclaration(Loc(), t1, Lexer::uniqueId("__covres"), ei); ++ DeclarationExp *de = new DeclarationExp(Loc(), v); ++ VarExp *ve = new VarExp(Loc(), v); ++ eresult = new CommaExp(Loc(), de, ve); + } + } + Expression *e = new CallExp(loc, new VarExp(loc, fdv->fdensure, 0), eresult); +@@ -2082,7 +2242,7 @@ Statement *FuncDeclaration::mergeFensure + + if (sf) + { +- sf = new CompoundStatement(fensure->loc, s2, sf); ++ sf = new CompoundStatement(sf->loc, s2, sf); + } + else + sf = s2; +@@ -2187,41 +2347,43 @@ int FuncDeclaration::findVtblIndex(Dsymb + type = type->addStorageClass(mismatchstc); + bestvi = mismatchvi; + } +- else +- error("of type %s overrides but is not covariant with %s of type %s", +- type->toChars(), mismatch->toPrettyChars(), mismatch->type->toChars()); + } + return bestvi; + } + + /**************************************************** + * Overload this FuncDeclaration with the new one f. +- * Return !=0 if successful; i.e. no conflict. ++ * Return true if successful; i.e. no conflict. + */ + +-int FuncDeclaration::overloadInsert(Dsymbol *s) ++bool FuncDeclaration::overloadInsert(Dsymbol *s) + { +- FuncDeclaration *f; +- AliasDeclaration *a; +- + //printf("FuncDeclaration::overloadInsert(s = %s) this = %s\n", s->toChars(), toChars()); +- a = s->isAliasDeclaration(); +- if (a) ++ AliasDeclaration *ad = s->isAliasDeclaration(); ++ if (ad) + { + if (overnext) +- return overnext->overloadInsert(a); +- if (!a->aliassym && a->type->ty != Tident && a->type->ty != Tinstance) ++ return overnext->overloadInsert(ad); ++ if (!ad->aliassym && ad->type->ty != Tident && ad->type->ty != Tinstance) + { +- //printf("\ta = '%s'\n", a->type->toChars()); +- return FALSE; ++ //printf("\tad = '%s'\n", ad->type->toChars()); ++ return false; + } +- overnext = a; ++ overnext = ad; + //printf("\ttrue: no conflict\n"); ++ return true; ++ } ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (td) ++ { ++ if (overnext) ++ return overnext->overloadInsert(td); ++ overnext = td; + return TRUE; + } +- f = s->isFuncDeclaration(); +- if (!f) +- return FALSE; ++ FuncDeclaration *fd = s->isFuncDeclaration(); ++ if (!fd) ++ return false; + + #if 0 + /* Disable this check because: +@@ -2231,11 +2393,11 @@ int FuncDeclaration::overloadInsert(Dsym + */ + if (type) + { printf("type = %s\n", type->toChars()); +- printf("f->type = %s\n", f->type->toChars()); ++ printf("fd->type = %s\n", fd->type->toChars()); + } +- if (type && f->type && // can be NULL for overloaded constructors +- f->type->covariant(type) && +- f->type->mod == type->mod && ++ if (type && fd->type && // can be NULL for overloaded constructors ++ fd->type->covariant(type) && ++ fd->type->mod == type->mod && + !isFuncAliasDeclaration()) + { + //printf("\tfalse: conflict %s\n", kind()); +@@ -2244,80 +2406,78 @@ int FuncDeclaration::overloadInsert(Dsym + #endif + + if (overnext) +- return overnext->overloadInsert(f); +- overnext = f; ++ { ++ td = overnext->isTemplateDeclaration(); ++ if (td) ++ fd->overloadInsert(td); ++ else ++ return overnext->overloadInsert(fd); ++ } ++ overnext = fd; + //printf("\ttrue: no conflict\n"); +- return TRUE; ++ return true; + } + +-/******************************************** +- * Find function in overload list that exactly matches t. +- */ +- + /*************************************************** +- * Visit each overloaded function in turn, and call +- * (*fp)(param, f) on it. +- * Exit when no more, or (*fp)(param, f) returns 1. ++ * Visit each overloaded function/template in turn, and call ++ * (*fp)(param, s) on it. ++ * Exit when no more, or (*fp)(param, f) returns nonzero. + * Returns: +- * 0 continue +- * 1 done ++ * ==0 continue ++ * !=0 done + */ + +-int overloadApply(FuncDeclaration *fstart, +- int (*fp)(void *, FuncDeclaration *), +- void *param) ++int overloadApply(Dsymbol *fstart, void *param, int (*fp)(void *, Dsymbol *)) + { +- FuncDeclaration *f; +- Declaration *d; +- Declaration *next; +- ++ Dsymbol *d; ++ Dsymbol *next; + for (d = fstart; d; d = next) +- { FuncAliasDeclaration *fa = d->isFuncAliasDeclaration(); +- +- if (fa) ++ { ++ if (FuncAliasDeclaration *fa = d->isFuncAliasDeclaration()) + { + if (fa->hasOverloads) + { +- if (overloadApply(fa->funcalias, fp, param)) +- return 1; ++ if (int r = overloadApply(fa->funcalias, param, fp)) ++ return r; + } + else + { +- f = fa->toAliasFunc(); +- if (!f) +- { d->error("is aliased to a function"); ++ FuncDeclaration *fd = fa->toAliasFunc(); ++ if (!fd) ++ { ++ d->error("is aliased to a function"); + break; + } +- if ((*fp)(param, f)) +- return 1; ++ if (int r = (*fp)(param, fd)) ++ return r; + } + next = fa->overnext; + } ++ else if (AliasDeclaration *ad = d->isAliasDeclaration()) ++ { ++ next = ad->toAlias(); ++ if (next == ad) ++ break; ++ if (next == fstart) ++ break; ++ } ++ else if (TemplateDeclaration *td = d->isTemplateDeclaration()) ++ { ++ if (int r = (*fp)(param, td)) ++ return r; ++ next = td->overnext; ++ } + else + { +- AliasDeclaration *a = d->isAliasDeclaration(); +- +- if (a) +- { +- Dsymbol *s = a->toAlias(); +- next = s->isDeclaration(); +- if (next == a) +- break; +- if (next == fstart) +- break; +- } +- else ++ FuncDeclaration *fd = d->isFuncDeclaration(); ++ if (!fd) + { +- f = d->isFuncDeclaration(); +- if (!f) +- { d->error("is aliased to a function"); +- break; // BUG: should print error message? +- } +- if ((*fp)(param, f)) +- return 1; +- +- next = f->overnext; ++ d->error("is aliased to a function"); ++ break; // BUG: should print error message? + } ++ if (int r = (*fp)(param, fd)) ++ return r; ++ next = fd->overnext; + } + } + return 0; +@@ -2328,23 +2488,31 @@ int overloadApply(FuncDeclaration *fstar + * otherwise return NULL. + */ + +-static int fpunique(void *param, FuncDeclaration *f) +-{ FuncDeclaration **pf = (FuncDeclaration **)param; +- +- if (*pf) +- { *pf = NULL; +- return 1; // ambiguous, done +- } +- else +- { *pf = f; +- return 0; +- } +-} +- + FuncDeclaration *FuncDeclaration::isUnique() +-{ FuncDeclaration *result = NULL; ++{ ++ struct ParamUnique ++ { ++ static int fp(void *param, Dsymbol *s) ++ { ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (!f) ++ return 0; ++ FuncDeclaration **pf = (FuncDeclaration **)param; + +- overloadApply(this, &fpunique, &result); ++ if (*pf) ++ { ++ *pf = NULL; ++ return 1; // ambiguous, done ++ } ++ else ++ { ++ *pf = f; ++ return 0; ++ } ++ } ++ }; ++ FuncDeclaration *result = NULL; ++ overloadApply(this, &result, &ParamUnique::fp); + return result; + } + +@@ -2352,179 +2520,62 @@ FuncDeclaration *FuncDeclaration::isUniq + * Find function in overload list that exactly matches t. + */ + +-struct Param1 ++FuncDeclaration *FuncDeclaration::overloadExactMatch(Type *t) + { ++ struct ParamExact ++ { + Type *t; // type to match + FuncDeclaration *f; // return value +-}; +- +-int fp1(void *param, FuncDeclaration *f) +-{ Param1 *p = (Param1 *)param; +- Type *t = p->t; + +- if (t->equals(f->type)) +- { p->f = f; +- return 1; +- } ++ static int fp(void *param, Dsymbol *s) ++ { ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (!f) ++ return 0; ++ ParamExact *p = (ParamExact *)param; ++ Type *t = p->t; + +-#if DMDV2 +- /* Allow covariant matches, as long as the return type +- * is just a const conversion. +- * This allows things like pure functions to match with an impure function type. +- */ +- if (t->ty == Tfunction) +- { TypeFunction *tf = (TypeFunction *)f->type; +- if (tf->covariant(t) == 1 && +- tf->nextOf()->implicitConvTo(t->nextOf()) >= MATCHconst) ++ if (t->equals(f->type)) + { + p->f = f; + return 1; + } +- } +-#endif +- return 0; +-} + +-FuncDeclaration *FuncDeclaration::overloadExactMatch(Type *t) +-{ +- Param1 p; ++#if DMDV2 ++ /* Allow covariant matches, as long as the return type ++ * is just a const conversion. ++ * This allows things like pure functions to match with an impure function type. ++ */ ++ if (t->ty == Tfunction) ++ { TypeFunction *tf = (TypeFunction *)f->type; ++ if (tf->covariant(t) == 1 && ++ tf->nextOf()->implicitConvTo(t->nextOf()) >= MATCHconst) ++ { ++ p->f = f; ++ return 1; ++ } ++ } ++#endif ++ return 0; ++ } ++ }; ++ ParamExact p; + p.t = t; + p.f = NULL; +- overloadApply(this, &fp1, &p); ++ overloadApply(this, &p, &ParamExact::fp); + return p.f; + } + +- +-/******************************************** +- * Decide which function matches the arguments best. +- * flags 1: do not issue error message on no match, just return NULL +- * 2: do not issue error on ambiguous matches and need explicit this +- */ +- +-struct Param2 ++static void MODMatchToBuffer(OutBuffer *buf, unsigned char lhsMod, unsigned char rhsMod) + { +- Match *m; +-#if DMDV2 +- Expression *ethis; +- int property; // 0: unintialized +- // 1: seen @property +- // 2: not @property +-#endif +- Expressions *arguments; +-}; +- +-int fp2(void *param, FuncDeclaration *f) +-{ Param2 *p = (Param2 *)param; +- Match *m = p->m; +- Expressions *arguments = p->arguments; +- MATCH match; +- +- if (f != m->lastf) // skip duplicates +- { +- m->anyf = f; +- TypeFunction *tf = (TypeFunction *)f->type; +- +- int property = (tf->isproperty) ? 1 : 2; +- if (p->property == 0) +- p->property = property; +- else if (p->property != property) +- error(f->loc, "cannot overload both property and non-property functions"); +- +- /* For constructors, don't worry about the right type of ethis. It's a problem +- * anyway, because the constructor attribute may not match the ethis attribute, +- * but we don't care because the attribute on the ethis doesn't matter until +- * after it's constructed. +- */ +- match = (MATCH) tf->callMatch(f->needThis() && !f->isCtorDeclaration() ? p->ethis : NULL, arguments); +- //printf("test1: match = %d\n", match); +- if (match != MATCHnomatch) +- { +- if (match > m->last) +- goto LfIsBetter; ++ bool bothMutable = ((lhsMod & rhsMod) == 0); ++ bool sharedMismatch = ((lhsMod ^ rhsMod) & MODshared); ++ bool sharedMismatchOnly = ((lhsMod ^ rhsMod) == MODshared); + +- if (match < m->last) +- goto LlastIsBetter; +- +- /* See if one of the matches overrides the other. +- */ +- if (m->lastf->overrides(f)) +- goto LlastIsBetter; +- else if (f->overrides(m->lastf)) +- goto LfIsBetter; +- +-#if DMDV2 +- /* Try to disambiguate using template-style partial ordering rules. +- * In essence, if f() and g() are ambiguous, if f() can call g(), +- * but g() cannot call f(), then pick f(). +- * This is because f() is "more specialized." +- */ +- { +- MATCH c1 = f->leastAsSpecialized(m->lastf); +- MATCH c2 = m->lastf->leastAsSpecialized(f); +- //printf("c1 = %d, c2 = %d\n", c1, c2); +- if (c1 > c2) +- goto LfIsBetter; +- if (c1 < c2) +- goto LlastIsBetter; +- } +- +- /* If the two functions are the same function, like: +- * int foo(int); +- * int foo(int x) { ... } +- * then pick the one with the body. +- */ +- if (tf->equals(m->lastf->type) && +- f->storage_class == m->lastf->storage_class && +- f->parent == m->lastf->parent && +- f->protection == m->lastf->protection && +- f->linkage == m->lastf->linkage) +- { +- if (f->fbody && !m->lastf->fbody) +- goto LfIsBetter; +- else if (!f->fbody && m->lastf->fbody) +- goto LlastIsBetter; +- } +-#endif +- Lambiguous: +- m->nextf = f; +- m->count++; +- return 0; +- +- LfIsBetter: +- m->last = match; +- m->lastf = f; +- m->count = 1; +- return 0; +- +- LlastIsBetter: +- return 0; +- } +- } +- return 0; +-} +- +- +-void overloadResolveX(Match *m, FuncDeclaration *fstart, +- Expression *ethis, Expressions *arguments) +-{ +- Param2 p; +- p.m = m; +- p.ethis = ethis; +- p.property = 0; +- p.arguments = arguments; +- overloadApply(fstart, &fp2, &p); +-} +- +-static void MODMatchToBuffer(OutBuffer *buf, unsigned char lhsMod, unsigned char rhsMod) +-{ +- bool bothMutable = ((lhsMod & rhsMod) == 0); +- bool sharedMismatch = ((lhsMod ^ rhsMod) & MODshared); +- bool sharedMismatchOnly = ((lhsMod ^ rhsMod) == MODshared); +- +- if (lhsMod & MODshared) +- buf->writestring("shared "); +- else if (sharedMismatch && !(lhsMod & MODimmutable)) +- buf->writestring("non-shared "); ++ if (lhsMod & MODshared) ++ buf->writestring("shared "); ++ else if (sharedMismatch && !(lhsMod & MODimmutable)) ++ buf->writestring("non-shared "); + + if (bothMutable && sharedMismatchOnly) + { } +@@ -2538,95 +2589,22 @@ static void MODMatchToBuffer(OutBuffer * + buf->writestring("mutable "); + } + +-FuncDeclaration *FuncDeclaration::overloadResolve(Loc loc, Expression *ethis, Expressions *arguments, int flags) +-{ +- TypeFunction *tf; +- Match m; +- +-#if 0 +-printf("FuncDeclaration::overloadResolve('%s')\n", toChars()); +-if (arguments) +-{ int i; +- +- for (i = 0; i < arguments->dim; i++) +- { Expression *arg; +- +- arg = (*arguments)[i]; +- assert(arg->type); +- printf("\t%s: ", arg->toChars()); +- arg->type->print(); +- } +-} +-#endif +- +- memset(&m, 0, sizeof(m)); +- m.last = MATCHnomatch; +- overloadResolveX(&m, this, ethis, arguments); ++/******************************************** ++ * find function template root in overload list ++ */ + +- if (m.count == 1) // exactly one match ++TemplateDeclaration *FuncDeclaration::findTemplateDeclRoot() ++{ ++ FuncDeclaration *f = this; ++ while (f && f->overnext) + { +- return m.lastf; +- } +- else +- { +- OutBuffer buf; +- +- buf.writeByte('('); +- if (arguments && arguments->dim) +- { +- HdrGenState hgs; +- argExpTypesToCBuffer(&buf, arguments, &hgs); +- } +- buf.writeByte(')'); +- if (ethis) +- ethis->type->modToBuffer(&buf); +- +- if (m.last == MATCHnomatch) +- { +- if (flags & 1) // if do not print error messages +- return NULL; // no match +- +- tf = (TypeFunction *)type; +- if (ethis && !MODimplicitConv(ethis->type->mod, tf->mod)) // modifier mismatch +- { +- OutBuffer thisBuf, funcBuf; +- MODMatchToBuffer(&thisBuf, ethis->type->mod, tf->mod); +- MODMatchToBuffer(&funcBuf, tf->mod, ethis->type->mod); +- ::error(loc, "%smethod %s is not callable using a %sobject", +- funcBuf.toChars(), this->toPrettyChars(), thisBuf.toChars()); +- } +- else +- { +- //printf("tf = %s, args = %s\n", tf->deco, (*arguments)[0]->type->deco); +- error(loc, "%s%s is not callable using argument types %s", +- Parameter::argsTypesToChars(tf->parameters, tf->varargs), +- tf->modToChars(), +- buf.toChars()); +- } +- +- return m.anyf; // as long as it's not a FuncAliasDeclaration +- } +- else +- { +- if ((flags & 2) && m.lastf->needThis() && !ethis) +- return m.lastf; +-#if 1 +- TypeFunction *t1 = (TypeFunction *)m.lastf->type; +- TypeFunction *t2 = (TypeFunction *)m.nextf->type; +- +- error(loc, "called with argument types:\n\t(%s)\nmatches both:\n\t%s(%d): %s%s\nand:\n\t%s(%d): %s%s", +- buf.toChars(), +- m.lastf->loc.filename, m.lastf->loc.linnum, m.lastf->toPrettyChars(), Parameter::argsTypesToChars(t1->parameters, t1->varargs), +- m.nextf->loc.filename, m.nextf->loc.linnum, m.nextf->toPrettyChars(), Parameter::argsTypesToChars(t2->parameters, t2->varargs)); +-#else +- error(loc, "overloads %s and %s both match argument list for %s", +- m.lastf->type->toChars(), +- m.nextf->type->toChars(), +- m.lastf->toChars()); +-#endif +- return m.lastf; +- } ++ //printf("f->overnext = %p %s\n", f->overnext, f->overnext->toChars()); ++ TemplateDeclaration *td = f->overnext->isTemplateDeclaration(); ++ if (td) ++ return td; ++ f = f->overnext->isFuncDeclaration(); + } ++ return NULL; + } + + /************************************* +@@ -2637,7 +2615,6 @@ if (arguments) + * 0 g is more specialized than 'this' + */ + +-#if DMDV2 + MATCH FuncDeclaration::leastAsSpecialized(FuncDeclaration *g) + { + #define LOG_LEASTAS 0 +@@ -2661,15 +2638,22 @@ MATCH FuncDeclaration::leastAsSpecialize + /* If both functions have a 'this' pointer, and the mods are not + * the same and g's is not const, then this is less specialized. + */ +- if (needThis() && g->needThis()) ++ if (needThis() && g->needThis() && tf->mod != tg->mod) + { +- if (tf->mod != tg->mod) ++ if (isCtorDeclaration()) + { +- if (MODimplicitConv(tf->mod, tg->mod)) ++ if (MODimplicitConv(tg->mod, tf->mod)) + match = MATCHconst; + else + return MATCHnomatch; + } ++ else ++ { ++ if (MODimplicitConv(tf->mod, tg->mod)) ++ match = MATCHconst; ++ else ++ return MATCHnomatch; ++ } + } + + /* Create a dummy array of arguments out of the parameters to f() +@@ -2682,11 +2666,11 @@ MATCH FuncDeclaration::leastAsSpecialize + Expression *e; + if (p->storageClass & (STCref | STCout)) + { +- e = new IdentifierExp(0, p->ident); ++ e = new IdentifierExp(Loc(), p->ident); + e->type = p->type; + } + else +- e = p->type->defaultInitLiteral(0); ++ e = p->type->defaultInitLiteral(Loc()); + args[u] = e; + } + +@@ -2714,34 +2698,172 @@ MATCH FuncDeclaration::leastAsSpecialize + /******************************************* + * Given a symbol that could be either a FuncDeclaration or + * a function template, resolve it to a function symbol. +- * sc instantiation scope + * loc instantiation location +- * targsi initial list of template arguments +- * ethis if !NULL, the 'this' pointer argument ++ * sc instantiation scope ++ * tiargs initial list of template arguments ++ * tthis if !NULL, the 'this' pointer argument + * fargs arguments to function + * flags 1: do not issue error message on no match, just return NULL ++ * 2: overloadResolve only + */ + +-FuncDeclaration *resolveFuncCall(Scope *sc, Loc loc, Dsymbol *s, ++FuncDeclaration *resolveFuncCall(Loc loc, Scope *sc, Dsymbol *s, + Objects *tiargs, +- Expression *ethis, +- Expressions *arguments, ++ Type *tthis, ++ Expressions *fargs, + int flags) + { + if (!s) + return NULL; // no match +- FuncDeclaration *f = s->isFuncDeclaration(); +- if (f) +- f = f->overloadResolve(loc, ethis, arguments); +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- assert(td); +- f = td->deduceFunctionTemplate(sc, loc, tiargs, NULL, arguments, flags); ++ ++#if 0 ++ printf("resolveFuncCall('%s')\n", toChars()); ++ if (fargs) ++ { ++ for (size_t i = 0; i < fargs->dim; i++) ++ { ++ Expression *arg = (*fargs)[i]; ++ assert(arg->type); ++ printf("\t%s: ", arg->toChars()); ++ arg->type->print(); ++ } + } +- return f; +-} + #endif + ++ if (tiargs && arrayObjectIsError(tiargs) || ++ fargs && arrayObjectIsError((Objects *)fargs)) ++ { ++ return NULL; ++ } ++ ++ Match m; ++ memset(&m, 0, sizeof(m)); ++ m.last = MATCHnomatch; ++ ++ functionResolve(&m, s, loc, sc, tiargs, tthis, fargs); ++ ++ if (m.count == 1) // exactly one match ++ { ++ assert(m.lastf); ++ if (!(flags & 1)) ++ m.lastf->functionSemantic(); ++ return m.lastf; ++ } ++ if (m.last != MATCHnomatch && (flags & 2) && !tthis && m.lastf->needThis()) ++ { ++ return m.lastf; ++ } ++ ++Lerror: ++ /* Failed to find a best match. ++ * Do nothing or print error. ++ */ ++ if (m.last == MATCHnomatch && (flags & 1)) ++ { // if do not print error messages ++ return NULL; // no match ++ } ++ ++ HdrGenState hgs; ++ ++ FuncDeclaration *fd = s->isFuncDeclaration(); ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (td && td->funcroot) ++ s = fd = td->funcroot; ++ ++ OutBuffer tiargsBuf; ++ size_t dim = tiargs ? tiargs->dim : 0; ++ for (size_t i = 0; i < dim; i++) ++ { ++ if (i) ++ tiargsBuf.writestring(", "); ++ RootObject *oarg = (*tiargs)[i]; ++ ObjectToCBuffer(&tiargsBuf, &hgs, oarg); ++ } ++ ++ OutBuffer fargsBuf; ++ fargsBuf.writeByte('('); ++ argExpTypesToCBuffer(&fargsBuf, fargs, &hgs); ++ fargsBuf.writeByte(')'); ++ if (tthis) ++ tthis->modToBuffer(&fargsBuf); ++ ++ assert(!m.lastf || m.nextf); ++ if (!m.lastf && !(flags & 1)) // no match ++ { ++ if (td) ++ { ++ if (!fd) // all of overloads are template ++ { ++ ::error(loc, "%s %s.%s does not match any function template declaration. Candidates are:", ++ td->kind(), td->parent->toPrettyChars(), td->ident->toChars()); ++ ++ // Display candidate template functions ++ int numToDisplay = 5; // sensible number to display ++ for (TemplateDeclaration *tdx = td; tdx; tdx = tdx->overnext) ++ { ++ ::errorSupplemental(tdx->loc, "%s", tdx->toPrettyChars()); ++ if (!global.params.verbose && --numToDisplay == 0) ++ { ++ // Too many overloads to sensibly display. ++ // Just show count of remaining overloads. ++ int remaining = 0; ++ for (; tdx; tdx = tdx->overnext) ++ ++remaining; ++ if (remaining > 0) ++ ::errorSupplemental(loc, "... (%d more, -v to show) ...", remaining); ++ break; ++ } ++ } ++ } ++ td->error(loc, "cannot deduce template function from argument types !(%s)%s", ++ tiargsBuf.toChars(), fargsBuf.toChars()); ++ } ++ else ++ { ++ assert(fd); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (tthis && !MODimplicitConv(tthis->mod, tf->mod)) // modifier mismatch ++ { ++ OutBuffer thisBuf, funcBuf; ++ MODMatchToBuffer(&thisBuf, tthis->mod, tf->mod); ++ MODMatchToBuffer(&funcBuf, tf->mod, tthis->mod); ++ ::error(loc, "%smethod %s is not callable using a %sobject", ++ funcBuf.toChars(), fd->toPrettyChars(), thisBuf.toChars()); ++ } ++ else ++ { ++ //printf("tf = %s, args = %s\n", tf->deco, (*fargs)[0]->type->deco); ++ fd->error(loc, "%s%s is not callable using argument types %s", ++ Parameter::argsTypesToChars(tf->parameters, tf->varargs), ++ tf->modToChars(), ++ fargsBuf.toChars()); ++ } ++ } ++ } ++ else if (m.nextf) ++ { ++ /* CAUTION: m.lastf and m.nextf might be incompletely instantiated functions ++ * (created by doHeaderInstantiation), so call toPrettyChars will segfault. ++ */ ++ assert(m.lastf); ++ TypeFunction *t1 = (TypeFunction *)m.lastf->type; ++ TypeFunction *t2 = (TypeFunction *)m.nextf->type; ++ TemplateInstance *lastti = m.lastf->parent->isTemplateInstance(); ++ TemplateInstance *nextti = m.nextf->parent->isTemplateInstance(); ++ Dsymbol *lasts = lastti ? (Dsymbol *)lastti->tempdecl : (Dsymbol *)m.lastf; ++ Dsymbol *nexts = nextti ? (Dsymbol *)nextti->tempdecl : (Dsymbol *)m.nextf; ++ const char *lastprms = lastti ? "" : Parameter::argsTypesToChars(t1->parameters, t1->varargs); ++ const char *nextprms = nextti ? "" : Parameter::argsTypesToChars(t2->parameters, t2->varargs); ++ ::error(loc, "%s.%s called with argument types %s matches both:\n" ++ "\t%s(%d): %s%s\nand:\n\t%s(%d): %s%s", ++ s->parent->toPrettyChars(), s->ident->toChars(), ++ fargsBuf.toChars(), ++ lasts->loc.filename, lasts->loc.linnum, lasts->toChars(), lastprms, ++ nexts->loc.filename, nexts->loc.linnum, nexts->toChars(), nextprms); ++ } ++ return NULL; ++} ++ + /******************************** + * Labels are in a separate scope, one per function. + */ +@@ -2828,7 +2950,8 @@ int FuncDeclaration::getLevel(Loc loc, S + //printf("\ts = %s, '%s'\n", s->kind(), s->toChars()); + FuncDeclaration *thisfd = s->isFuncDeclaration(); + if (thisfd) +- { if (!thisfd->isNested() && !thisfd->vthis && !sc->intypeof) ++ { ++ if (!thisfd->isNested() && !thisfd->vthis && !sc->intypeof) + goto Lerr; + } + else +@@ -2862,14 +2985,18 @@ int FuncDeclaration::getLevel(Loc loc, S + Lerr: + // Don't give error if in template constraint + if (!((sc->flags & SCOPEstaticif) && parent->isTemplateDeclaration())) +- error(loc, "cannot access frame of function %s", fd->toPrettyChars()); ++ { ++ // better diagnostics for static functions ++ ::error(loc, "%s%s %s cannot access frame of function %s", ++ isStatic() ? "static " : "", kind(), toPrettyChars(), fd->toPrettyChars()); ++ } + return 1; + } + + void FuncDeclaration::appendExp(Expression *e) + { Statement *s; + +- s = new ExpStatement(0, e); ++ s = new ExpStatement(Loc(), e); + appendState(s); + } + +@@ -2888,7 +3015,7 @@ void FuncDeclaration::appendState(Statem + cs->statements->push(s); + } + else +- fbody = new CompoundStatement(0, fbody, s); ++ fbody = new CompoundStatement(Loc(), fbody, s); + } + } + +@@ -2900,17 +3027,27 @@ const char *FuncDeclaration::toPrettyCha + return Dsymbol::toPrettyChars(); + } + +-int FuncDeclaration::isMain() ++/** for diagnostics, e.g. 'int foo(int x, int y) pure' */ ++const char *FuncDeclaration::toFullSignature() ++{ ++ OutBuffer buf; ++ HdrGenState hgs; ++ functionToCBuffer2((TypeFunction *)type, &buf, &hgs, 0, toChars()); ++ buf.writeByte(0); ++ return buf.extractData(); ++} ++ ++bool FuncDeclaration::isMain() + { + return ident == Id::main && + linkage != LINKc && !isMember() && !isNested(); + } + +-int FuncDeclaration::isWinMain() ++bool FuncDeclaration::isWinMain() + { + //printf("FuncDeclaration::isWinMain() %s\n", toChars()); + #if 0 +- int x = ident == Id::WinMain && ++ bool x = ident == Id::WinMain && + linkage != LINKc && !isMember(); + printf("%s\n", x ? "yes" : "no"); + return x; +@@ -2920,18 +3057,18 @@ int FuncDeclaration::isWinMain() + #endif + } + +-int FuncDeclaration::isDllMain() ++bool FuncDeclaration::isDllMain() + { + return ident == Id::DllMain && + linkage != LINKc && !isMember(); + } + +-int FuncDeclaration::isExport() ++bool FuncDeclaration::isExport() + { + return protection == PROTexport; + } + +-int FuncDeclaration::isImportedSymbol() ++bool FuncDeclaration::isImportedSymbol() + { + //printf("isImportedSymbol()\n"); + //printf("protection = %d\n", protection); +@@ -2940,7 +3077,7 @@ int FuncDeclaration::isImportedSymbol() + + // Determine if function goes into virtual function pointer table + +-int FuncDeclaration::isVirtual() ++bool FuncDeclaration::isVirtual() + { + if (toAliasFunc() != this) + return toAliasFunc()->isVirtual(); +@@ -2953,40 +3090,40 @@ int FuncDeclaration::isVirtual() + isMember() && + !(isStatic() || protection == PROTprivate || protection == PROTpackage) && + p->isClassDeclaration() && +- !(p->isInterfaceDeclaration() && isFinal())); ++ !(p->isInterfaceDeclaration() && isFinalFunc())); + #endif + return isMember() && + !(isStatic() || protection == PROTprivate || protection == PROTpackage) && + p->isClassDeclaration() && +- !(p->isInterfaceDeclaration() && isFinal()); ++ !(p->isInterfaceDeclaration() && isFinalFunc()); + } + + // Determine if a function is pedantically virtual + +-int FuncDeclaration::isVirtualMethod() ++bool FuncDeclaration::isVirtualMethod() + { + if (toAliasFunc() != this) + return toAliasFunc()->isVirtualMethod(); + + //printf("FuncDeclaration::isVirtualMethod() %s\n", toChars()); + if (!isVirtual()) +- return 0; ++ return false; + // If it's a final method, and does not override anything, then it is not virtual +- if (isFinal() && foverrides.dim == 0) ++ if (isFinalFunc() && foverrides.dim == 0) + { +- return 0; ++ return false; + } +- return 1; ++ return true; + } + +-int FuncDeclaration::isFinal() ++bool FuncDeclaration::isFinalFunc() + { + if (toAliasFunc() != this) +- return toAliasFunc()->isFinal(); ++ return toAliasFunc()->isFinalFunc(); + + ClassDeclaration *cd; + #if 0 +- printf("FuncDeclaration::isFinal(%s), %x\n", toChars(), Declaration::isFinal()); ++ printf("FuncDeclaration::isFinalFunc(%s), %x\n", toChars(), Declaration::isFinal()); + printf("%p %d %d %d\n", isMember(), isStatic(), Declaration::isFinal(), ((cd = toParent()->isClassDeclaration()) != NULL && cd->storage_class & STCfinal)); + printf("result is %d\n", + isMember() && +@@ -3005,27 +3142,22 @@ int FuncDeclaration::isFinal() + ((cd = toParent()->isClassDeclaration()) != NULL && cd->storage_class & STCfinal)); + } + +-int FuncDeclaration::isAbstract() +-{ +- return storage_class & STCabstract; +-} +- +-int FuncDeclaration::isCodeseg() ++bool FuncDeclaration::isCodeseg() + { +- return TRUE; // functions are always in the code segment ++ return true; // functions are always in the code segment + } + +-int FuncDeclaration::isOverloadable() ++bool FuncDeclaration::isOverloadable() + { +- return 1; // functions can be overloaded ++ return true; // functions can be overloaded + } + +-int FuncDeclaration::hasOverloads() ++bool FuncDeclaration::hasOverloads() + { + return overnext != NULL; + } + +-enum PURE FuncDeclaration::isPure() ++PURE FuncDeclaration::isPure() + { + //printf("FuncDeclaration::isPure() '%s'\n", toChars()); + assert(type->ty == Tfunction); +@@ -3034,14 +3166,14 @@ enum PURE FuncDeclaration::isPure() + setImpure(); + if (tf->purity == PUREfwdref) + tf->purityLevel(); +- enum PURE purity = tf->purity; ++ PURE purity = tf->purity; + if (purity > PUREweak && isNested()) + purity = PUREweak; + if (purity > PUREweak && needThis()) + { // The attribute of the 'this' reference affects purity strength +- if (type->mod & (MODimmutable | MODwild)) ++ if (type->mod & MODimmutable) + ; +- else if (type->mod & MODconst && purity >= PUREconst) ++ else if (type->mod & (MODconst | MODwild) && purity >= PUREconst) + purity = PUREconst; + else + purity = PUREweak; +@@ -3052,12 +3184,10 @@ enum PURE FuncDeclaration::isPure() + return purity; + } + +-enum PURE FuncDeclaration::isPureBypassingInference() ++PURE FuncDeclaration::isPureBypassingInference() + { + if (flags & FUNCFLAGpurityInprocess) + return PUREfwdref; +- else if (type->nextOf() == NULL) +- return PUREfwdref; + else + return isPure(); + } +@@ -3078,7 +3208,7 @@ bool FuncDeclaration::setImpure() + return FALSE; + } + +-int FuncDeclaration::isSafe() ++bool FuncDeclaration::isSafe() + { + assert(type->ty == Tfunction); + if (flags & FUNCFLAGsafetyInprocess) +@@ -3094,7 +3224,7 @@ bool FuncDeclaration::isSafeBypassingInf + return isSafe(); + } + +-int FuncDeclaration::isTrusted() ++bool FuncDeclaration::isTrusted() + { + assert(type->ty == Tfunction); + if (flags & FUNCFLAGsafetyInprocess) +@@ -3119,10 +3249,168 @@ bool FuncDeclaration::setUnsafe() + return FALSE; + } + ++/************************************** ++ * Returns an indirect type one step from t. ++ */ ++ ++Type *getIndirection(Type *t) ++{ ++ t = t->baseElemOf(); ++ if (t->ty == Tarray || t->ty == Tpointer) ++ return t->nextOf()->toBasetype(); ++ if (t->ty == Taarray || t->ty == Tclass) ++ return t; ++ if (t->ty == Tstruct) ++ return t->hasPointers() ? t : NULL; // TODO ++ ++ // should consider TypeDelegate? ++ return NULL; ++} ++ ++/************************************** ++ * Traverse this and t, and then check the indirections convertibility. ++ */ ++ ++int traverseIndirections(Type *ta, Type *tb, void *p = NULL, bool a2b = true) ++{ ++ if (a2b) // check ta appears in tb ++ { ++ //printf("\ttraverse(1) %s appears in %s\n", ta->toChars(), tb->toChars()); ++ if (ta->constConv(tb)) ++ return 1; ++ else if (ta->immutableOf()->equals(tb->immutableOf())) ++ return 0; ++ else if (tb->ty == Tvoid && MODimplicitConv(ta->mod, tb->mod)) ++ return 1; ++ } ++ else // check tb appears in ta ++ { ++ //printf("\ttraverse(2) %s appears in %s\n", tb->toChars(), ta->toChars()); ++ if (tb->constConv(ta)) ++ return 1; ++ else if (tb->immutableOf()->equals(ta->immutableOf())) ++ return 0; ++ else if (ta->ty == Tvoid && MODimplicitConv(tb->mod, ta->mod)) ++ return 1; ++ } ++ ++ // context date to detect circular look up ++ struct Ctxt ++ { ++ Ctxt *prev; ++ Type *type; ++ }; ++ Ctxt *ctxt = (Ctxt *)p; ++ ++ Type *tbb = tb->toBasetype(); ++ if (tbb != tb) ++ return traverseIndirections(ta, tbb, ctxt, a2b); ++ ++ tb = tb->baseElemOf(); ++ if (tb->ty == Tclass || tb->ty == Tstruct) ++ { ++ for (Ctxt *c = ctxt; c; c = c->prev) ++ if (tb == c->type) return 0; ++ Ctxt c; ++ c.prev = ctxt; ++ c.type = tb; ++ ++ AggregateDeclaration *sym = tb->toDsymbol(NULL)->isAggregateDeclaration(); ++ for (size_t i = 0; i < sym->fields.dim; i++) ++ { ++ VarDeclaration *v = sym->fields[i]; ++ Type *tprmi = v->type->addMod(tb->mod); ++ if (!(v->storage_class & STCref)) ++ tprmi = getIndirection(tprmi); ++ if (!tprmi) ++ continue; ++ ++ //printf("\ttb = %s, tprmi = %s\n", tb->toChars(), tprmi->toChars()); ++ if (traverseIndirections(ta, tprmi, &c, a2b)) ++ return 1; ++ } ++ } ++ else if (tb->ty == Tarray || tb->ty == Taarray || tb->ty == Tpointer) ++ { ++ Type *tind = tb->nextOf(); ++ if (traverseIndirections(ta, tind, ctxt, a2b)) ++ return 1; ++ } ++ else if (tb->hasPointers()) ++ { ++ // FIXME: function pointer/delegate types should be considered. ++ return 1; ++ } ++ if (a2b) ++ return traverseIndirections(tb, ta, ctxt, false); ++ ++ return 0; ++} ++ ++/******************************************** ++ * Returns true if the function return value has no indirection ++ * which comes from the parameters. ++ */ ++ ++bool FuncDeclaration::isolateReturn() ++{ ++ assert(type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)type; ++ assert(tf->next); ++ ++ Type *treti = tf->next; ++ treti = tf->isref ? treti : getIndirection(treti); ++ if (!treti) ++ return true; // target has no mutable indirection ++ return parametersIntersect(treti); ++} ++ ++/******************************************** ++ * Returns true if an object typed t can have indirections ++ * which come from the parameters. ++ */ ++ ++bool FuncDeclaration::parametersIntersect(Type *t) ++{ ++ assert(t); ++ if (!isPureBypassingInference() || isNested()) ++ return false; ++ ++ assert(type->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)type; ++ ++ //printf("parametersIntersect(%s) t = %s\n", tf->toChars(), t->toChars()); ++ ++ size_t dim = Parameter::dim(tf->parameters); ++ for (size_t i = 0; i < dim; i++) ++ { ++ Parameter *fparam = Parameter::getNth(tf->parameters, i); ++ if (!fparam->type) ++ continue; ++ Type *tprmi = (fparam->storageClass & (STClazy | STCout | STCref)) ++ ? fparam->type : getIndirection(fparam->type); ++ if (!tprmi) ++ continue; // there is no mutable indirection ++ ++ //printf("\t[%d] tprmi = %d %s\n", i, tprmi->ty, tprmi->toChars()); ++ if (traverseIndirections(tprmi, t)) ++ return false; ++ } ++ if (AggregateDeclaration *ad = isCtorDeclaration() ? NULL : isThis()) ++ { ++ Type *tthis = ad ? ad->getType()->addMod(tf->mod) : NULL; ++ //printf("\ttthis = %s\n", tthis->toChars()); ++ if (traverseIndirections(tthis, t)) ++ return false; ++ } ++ ++ return true; ++} ++ + // Determine if function needs + // a static frame pointer to its lexically enclosing function + +-int FuncDeclaration::isNested() ++bool FuncDeclaration::isNested() + { + FuncDeclaration *f = toAliasFunc(); + //printf("\ttoParent2() = '%s'\n", f->toParent2()->toChars()); +@@ -3131,16 +3419,17 @@ int FuncDeclaration::isNested() + (f->toParent2()->isFuncDeclaration() != NULL); + } + +-int FuncDeclaration::needThis() ++bool FuncDeclaration::needThis() + { + //printf("FuncDeclaration::needThis() '%s'\n", toChars()); + return toAliasFunc()->isThis() != NULL; + } + +-int FuncDeclaration::addPreInvariant() ++bool FuncDeclaration::addPreInvariant() + { + AggregateDeclaration *ad = isThis(); +- return (ad && ++ ClassDeclaration *cd = ad ? ad->isClassDeclaration() : NULL; ++ return (ad && !(cd && cd->isCPPclass()) && + //ad->isClassDeclaration() && + global.params.useInvariants && + (protection == PROTprotected || protection == PROTpublic || protection == PROTexport) && +@@ -3148,10 +3437,11 @@ int FuncDeclaration::addPreInvariant() + ident != Id::cpctor); + } + +-int FuncDeclaration::addPostInvariant() ++bool FuncDeclaration::addPostInvariant() + { + AggregateDeclaration *ad = isThis(); +- return (ad && ++ ClassDeclaration *cd = ad ? ad->isClassDeclaration() : NULL; ++ return (ad && !(cd && cd->isCPPclass()) && + ad->inv && + //ad->isClassDeclaration() && + global.params.useInvariants && +@@ -3164,12 +3454,12 @@ int FuncDeclaration::addPostInvariant() + * Generate a FuncDeclaration for a runtime library function. + */ + +-FuncDeclaration *FuncDeclaration::genCfunc(Type *treturn, const char *name) ++FuncDeclaration *FuncDeclaration::genCfunc(Parameters *args, Type *treturn, const char *name) + { +- return genCfunc(treturn, Lexer::idPool(name)); ++ return genCfunc(args, treturn, Lexer::idPool(name)); + } + +-FuncDeclaration *FuncDeclaration::genCfunc(Type *treturn, Identifier *id) ++FuncDeclaration *FuncDeclaration::genCfunc(Parameters *args, Type *treturn, Identifier *id) + { + FuncDeclaration *fd; + TypeFunction *tf; +@@ -3191,8 +3481,8 @@ FuncDeclaration *FuncDeclaration::genCfu + } + else + { +- tf = new TypeFunction(NULL, treturn, 0, LINKc); +- fd = new FuncDeclaration(0, 0, id, STCstatic, tf); ++ tf = new TypeFunction(args, treturn, 0, LINKc); ++ fd = new FuncDeclaration(Loc(), Loc(), id, STCstatic, tf); + fd->protection = PROTpublic; + fd->linkage = LINKc; + +@@ -3275,7 +3565,7 @@ void FuncDeclaration::checkNestedReferen + */ + void markAsNeedingClosure(Dsymbol *f, FuncDeclaration *outerFunc) + { +- for (Dsymbol *sx = f; sx != outerFunc; sx = sx->parent) ++ for (Dsymbol *sx = f; sx && sx != outerFunc; sx = sx->parent) + { + FuncDeclaration *fy = sx->isFuncDeclaration(); + if (fy && fy->closureVars.dim) +@@ -3323,7 +3613,7 @@ bool checkEscapingSiblings(FuncDeclarati + */ + + #if DMDV2 +-int FuncDeclaration::needsClosure() ++bool FuncDeclaration::needsClosure() + { + /* Need a closure for all the closureVars[] if any of the + * closureVars[] are accessed by a +@@ -3411,11 +3701,11 @@ int FuncDeclaration::needsClosure() + } + } + +- return 0; ++ return false; + + Lyes: + //printf("\tneeds closure\n"); +- return 1; ++ return true; + } + #endif + +@@ -3424,14 +3714,14 @@ Lyes: + * nested within it. + */ + +-int FuncDeclaration::hasNestedFrameRefs() ++bool FuncDeclaration::hasNestedFrameRefs() + { + #if DMDV2 + if (closureVars.dim) + #else + if (nestedFrameRef) + #endif +- return 1; ++ return true; + + /* If a virtual method has contracts, assume its variables are referenced + * by those contracts, even if they aren't. Because they might be referenced +@@ -3441,7 +3731,7 @@ int FuncDeclaration::hasNestedFrameRefs( + * context had better match, or Bugzilla 7337 will bite. + */ + if ((fdrequire || fdensure) && isVirtualMethod()) +- return 1; ++ return true; + + if (foverrides.dim && isVirtualMethod()) + { +@@ -3449,11 +3739,11 @@ int FuncDeclaration::hasNestedFrameRefs( + { + FuncDeclaration *fdv = foverrides[i]; + if (fdv->hasNestedFrameRefs()) +- return 1; ++ return true; + } + } + +- return 0; ++ return false; + } + + /********************************************* +@@ -3462,8 +3752,8 @@ int FuncDeclaration::hasNestedFrameRefs( + */ + + Parameters *FuncDeclaration::getParameters(int *pvarargs) +-{ Parameters *fparameters; +- int fvarargs; ++{ Parameters *fparameters = NULL; ++ int fvarargs = 0; + + if (type) + { +@@ -3482,7 +3772,7 @@ Parameters *FuncDeclaration::getParamete + + // Used as a way to import a set of functions from another scope into this one. + +-FuncAliasDeclaration::FuncAliasDeclaration(FuncDeclaration *funcalias, int hasOverloads) ++FuncAliasDeclaration::FuncAliasDeclaration(FuncDeclaration *funcalias, bool hasOverloads) + : FuncDeclaration(funcalias->loc, funcalias->endloc, funcalias->ident, + funcalias->storage_class, funcalias->type) + { +@@ -3498,7 +3788,7 @@ FuncAliasDeclaration::FuncAliasDeclarati + else + { // for internal use + assert(!funcalias->isFuncAliasDeclaration()); +- this->hasOverloads = 0; ++ this->hasOverloads = false; + } + userAttributes = funcalias->userAttributes; + } +@@ -3517,20 +3807,10 @@ FuncDeclaration *FuncAliasDeclaration::t + /****************************** FuncLiteralDeclaration ************************/ + + FuncLiteralDeclaration::FuncLiteralDeclaration(Loc loc, Loc endloc, Type *type, +- enum TOK tok, ForeachStatement *fes) ++ TOK tok, ForeachStatement *fes, Identifier *id) + : FuncDeclaration(loc, endloc, NULL, STCundefined, type) + { +- const char *id; +- +- if (fes) +- id = "__foreachbody"; +- else if (tok == TOKreserved) +- id = "__lambda"; +- else if (tok == TOKdelegate) +- id = "__dgliteral"; +- else +- id = "__funcliteral"; +- this->ident = Lexer::uniqueId(id); ++ this->ident = id ? id : Id::empty; + this->tok = tok; + this->fes = fes; + this->treq = NULL; +@@ -3545,23 +3825,21 @@ Dsymbol *FuncLiteralDeclaration::syntaxC + if (s) + f = (FuncLiteralDeclaration *)s; + else +- { f = new FuncLiteralDeclaration(loc, endloc, type->syntaxCopy(), tok, fes); +- f->ident = ident; // keep old identifier +- f->treq = treq; // don't need to copy +- } ++ f = new FuncLiteralDeclaration(loc, endloc, type->syntaxCopy(), tok, fes, ident); ++ f->treq = treq; // don't need to copy + FuncDeclaration::syntaxCopy(f); + return f; + } + +-int FuncLiteralDeclaration::isNested() ++bool FuncLiteralDeclaration::isNested() + { + //printf("FuncLiteralDeclaration::isNested() '%s'\n", toChars()); + return (tok != TOKfunction); + } + +-int FuncLiteralDeclaration::isVirtual() ++bool FuncLiteralDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + + const char *FuncLiteralDeclaration::kind() +@@ -3580,16 +3858,24 @@ void FuncLiteralDeclaration::toCBuffer(O + + TypeFunction *tf = (TypeFunction *)type; + // Don't print tf->mod, tf->trust, and tf->linkage +- if (tf->next) ++ if (!inferRetType && tf->next) + tf->next->toCBuffer2(buf, hgs, 0); + Parameter::argsToCBuffer(buf, hgs, tf->parameters, tf->varargs); + +- ReturnStatement *ret = !fbody->isCompoundStatement() ? +- fbody->isReturnStatement() : NULL; +- if (ret && ret->exp) ++ CompoundStatement *cs = fbody->isCompoundStatement(); ++ Statement *s1; ++ if (semanticRun >= PASSsemantic3done) ++ { ++ assert(cs); ++ s1 = (*cs->statements)[cs->statements->dim - 1]; ++ } ++ else ++ s1 = !cs ? fbody : NULL; ++ ReturnStatement *rs = s1 ? s1->isReturnStatement() : NULL; ++ if (rs && rs->exp) + { + buf->writestring(" => "); +- ret->exp->toCBuffer(buf, hgs); ++ rs->exp->toCBuffer(buf, hgs); + } + else + { +@@ -3606,7 +3892,6 @@ CtorDeclaration::CtorDeclaration(Loc loc + : FuncDeclaration(loc, endloc, Id::ctor, stc, type) + { + //printf("CtorDeclaration(loc = %s) %s\n", loc.toChars(), toChars()); +- this->isImplicit = false; + } + + Dsymbol *CtorDeclaration::syntaxCopy(Dsymbol *s) +@@ -3638,33 +3923,13 @@ void CtorDeclaration::semantic(Scope *sc + sc->stc &= ~STCstatic; // not a static constructor + sc->flags |= SCOPEctor; + +- parent = sc->parent; +- Dsymbol *parent = toParent2(); +- Type *tret; +- AggregateDeclaration *ad = parent->isAggregateDeclaration(); +- if (!ad || parent->isUnionDeclaration()) +- { +- error("constructors are only for class or struct definitions"); +- tret = Type::tvoid; +- } +- else +- { tret = ad->handle; +- assert(tret); +- tret = tret->addStorageClass(storage_class | sc->stc); +- tret = tret->addMod(type->mod); +- } +- tf->next = tret; +- if (!originalType) +- originalType = type->syntaxCopy(); +- type = type->semantic(loc, sc); +- +- if (ad && ad->isStructDeclaration()) +- ((TypeFunction *)type)->isref = 1; +- + FuncDeclaration::semantic(sc); + + sc->pop(); + ++ Dsymbol *parent = toParent2(); ++ AggregateDeclaration *ad = parent->isAggregateDeclaration(); ++ + /* See if it's the default constructor + * But, template constructor should not become a default constructor. + */ +@@ -3698,17 +3963,17 @@ char *CtorDeclaration::toChars() + return (char *)"this"; + } + +-int CtorDeclaration::isVirtual() ++bool CtorDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + +-int CtorDeclaration::addPreInvariant() ++bool CtorDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int CtorDeclaration::addPostInvariant() ++bool CtorDeclaration::addPostInvariant() + { + return (isThis() && vthis && global.params.useInvariants); + } +@@ -3761,24 +4026,24 @@ void PostBlitDeclaration::semantic(Scope + sc->pop(); + } + +-int PostBlitDeclaration::overloadInsert(Dsymbol *s) ++bool PostBlitDeclaration::overloadInsert(Dsymbol *s) + { +- return FALSE; // cannot overload postblits ++ return false; // cannot overload postblits + } + +-int PostBlitDeclaration::addPreInvariant() ++bool PostBlitDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int PostBlitDeclaration::addPostInvariant() ++bool PostBlitDeclaration::addPostInvariant() + { + return (isThis() && vthis && global.params.useInvariants); + } + +-int PostBlitDeclaration::isVirtual() ++bool PostBlitDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + + void PostBlitDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -3795,15 +4060,15 @@ DtorDeclaration::DtorDeclaration(Loc loc + { + } + +-DtorDeclaration::DtorDeclaration(Loc loc, Loc endloc, Identifier *id) +- : FuncDeclaration(loc, endloc, id, STCundefined, NULL) ++DtorDeclaration::DtorDeclaration(Loc loc, Loc endloc, StorageClass stc, Identifier *id) ++ : FuncDeclaration(loc, endloc, id, stc, NULL) + { + } + + Dsymbol *DtorDeclaration::syntaxCopy(Dsymbol *s) + { + assert(!s); +- DtorDeclaration *dd = new DtorDeclaration(loc, endloc, ident); ++ DtorDeclaration *dd = new DtorDeclaration(loc, endloc, storage_class, ident); + return FuncDeclaration::syntaxCopy(dd); + } + +@@ -3827,7 +4092,7 @@ void DtorDeclaration::semantic(Scope *sc + ad->dtors.push(this); + + if (!type) +- type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); ++ type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd, storage_class); + + sc = sc->push(); + sc->stc &= ~STCstatic; // not a static destructor +@@ -3838,19 +4103,19 @@ void DtorDeclaration::semantic(Scope *sc + sc->pop(); + } + +-int DtorDeclaration::overloadInsert(Dsymbol *s) ++bool DtorDeclaration::overloadInsert(Dsymbol *s) + { +- return FALSE; // cannot overload destructors ++ return false; // cannot overload destructors + } + +-int DtorDeclaration::addPreInvariant() ++bool DtorDeclaration::addPreInvariant() + { + return (isThis() && vthis && global.params.useInvariants); + } + +-int DtorDeclaration::addPostInvariant() ++bool DtorDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + const char *DtorDeclaration::kind() +@@ -3863,10 +4128,10 @@ char *DtorDeclaration::toChars() + return (char *)"~this"; + } + +-int DtorDeclaration::isVirtual() ++bool DtorDeclaration::isVirtual() + { +- // FALSE so that dtor's don't get put into the vtbl[] +- return FALSE; ++ // false so that dtor's don't get put into the vtbl[] ++ return false; + } + + void DtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -3922,19 +4187,19 @@ void StaticCtorDeclaration::semantic(Sco + * during static construction. + */ + Identifier *id = Lexer::idPool("__gate"); +- VarDeclaration *v = new VarDeclaration(0, Type::tint32, id, NULL); ++ VarDeclaration *v = new VarDeclaration(Loc(), Type::tint32, id, NULL); + v->storage_class = isSharedStaticCtorDeclaration() ? STCstatic : STCtls; + Statements *sa = new Statements(); +- Statement *s = new ExpStatement(0, v); ++ Statement *s = new ExpStatement(Loc(), v); + sa->push(s); +- Expression *e = new IdentifierExp(0, id); +- e = new AddAssignExp(0, e, new IntegerExp(1)); +- e = new EqualExp(TOKnotequal, 0, e, new IntegerExp(1)); +- s = new IfStatement(0, NULL, e, new ReturnStatement(0, NULL), NULL); ++ Expression *e = new IdentifierExp(Loc(), id); ++ e = new AddAssignExp(Loc(), e, new IntegerExp(1)); ++ e = new EqualExp(TOKnotequal, Loc(), e, new IntegerExp(1)); ++ s = new IfStatement(Loc(), NULL, e, new ReturnStatement(Loc(), NULL), NULL); + sa->push(s); + if (fbody) + sa->push(fbody); +- fbody = new CompoundStatement(0, sa); ++ fbody = new CompoundStatement(Loc(), sa); + } + + FuncDeclaration::semantic(sc); +@@ -3954,9 +4219,9 @@ AggregateDeclaration *StaticCtorDeclarat + return NULL; + } + +-int StaticCtorDeclaration::isVirtual() ++bool StaticCtorDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + + bool StaticCtorDeclaration::hasStaticCtorOrDtor() +@@ -3964,14 +4229,14 @@ bool StaticCtorDeclaration::hasStaticCto + return TRUE; + } + +-int StaticCtorDeclaration::addPreInvariant() ++bool StaticCtorDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int StaticCtorDeclaration::addPostInvariant() ++bool StaticCtorDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void StaticCtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4008,16 +4273,16 @@ void SharedStaticCtorDeclaration::toCBuf + + /********************************* StaticDtorDeclaration ****************************/ + +-StaticDtorDeclaration::StaticDtorDeclaration(Loc loc, Loc endloc) ++StaticDtorDeclaration::StaticDtorDeclaration(Loc loc, Loc endloc, StorageClass stc) + : FuncDeclaration(loc, endloc, +- Identifier::generateId("_staticDtor"), STCstatic, NULL) ++ Identifier::generateId("_staticDtor"), STCstatic | stc, NULL) + { + vgate = NULL; + } + +-StaticDtorDeclaration::StaticDtorDeclaration(Loc loc, Loc endloc, const char *name) ++StaticDtorDeclaration::StaticDtorDeclaration(Loc loc, Loc endloc, const char *name, StorageClass stc) + : FuncDeclaration(loc, endloc, +- Identifier::generateId(name), STCstatic, NULL) ++ Identifier::generateId(name), STCstatic | stc, NULL) + { + vgate = NULL; + } +@@ -4025,7 +4290,7 @@ StaticDtorDeclaration::StaticDtorDeclara + Dsymbol *StaticDtorDeclaration::syntaxCopy(Dsymbol *s) + { + assert(!s); +- StaticDtorDeclaration *sdd = new StaticDtorDeclaration(loc, endloc); ++ StaticDtorDeclaration *sdd = new StaticDtorDeclaration(loc, endloc, storage_class); + return FuncDeclaration::syntaxCopy(sdd); + } + +@@ -4037,10 +4302,8 @@ void StaticDtorDeclaration::semantic(Sco + scope = NULL; + } + +- ClassDeclaration *cd = sc->scopesym->isClassDeclaration(); +- + if (!type) +- type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); ++ type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd, storage_class); + + /* If the static ctor appears within a template instantiation, + * it could get called multiple times by the module constructors +@@ -4056,19 +4319,19 @@ void StaticDtorDeclaration::semantic(Sco + * during static destruction. + */ + Identifier *id = Lexer::idPool("__gate"); +- VarDeclaration *v = new VarDeclaration(0, Type::tint32, id, NULL); ++ VarDeclaration *v = new VarDeclaration(Loc(), Type::tint32, id, NULL); + v->storage_class = isSharedStaticDtorDeclaration() ? STCstatic : STCtls; + Statements *sa = new Statements(); +- Statement *s = new ExpStatement(0, v); ++ Statement *s = new ExpStatement(Loc(), v); + sa->push(s); +- Expression *e = new IdentifierExp(0, id); +- e = new AddAssignExp(0, e, new IntegerExp(-1)); +- e = new EqualExp(TOKnotequal, 0, e, new IntegerExp(0)); +- s = new IfStatement(0, NULL, e, new ReturnStatement(0, NULL), NULL); ++ Expression *e = new IdentifierExp(Loc(), id); ++ e = new AddAssignExp(Loc(), e, new IntegerExp(-1)); ++ e = new EqualExp(TOKnotequal, Loc(), e, new IntegerExp(0)); ++ s = new IfStatement(Loc(), NULL, e, new ReturnStatement(Loc(), NULL), NULL); + sa->push(s); + if (fbody) + sa->push(fbody); +- fbody = new CompoundStatement(0, sa); ++ fbody = new CompoundStatement(Loc(), sa); + vgate = v; + } + +@@ -4089,9 +4352,9 @@ AggregateDeclaration *StaticDtorDeclarat + return NULL; + } + +-int StaticDtorDeclaration::isVirtual() ++bool StaticDtorDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + + bool StaticDtorDeclaration::hasStaticCtorOrDtor() +@@ -4099,14 +4362,14 @@ bool StaticDtorDeclaration::hasStaticCto + return TRUE; + } + +-int StaticDtorDeclaration::addPreInvariant() ++bool StaticDtorDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int StaticDtorDeclaration::addPostInvariant() ++bool StaticDtorDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void StaticDtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4119,15 +4382,15 @@ void StaticDtorDeclaration::toCBuffer(Ou + + /********************************* SharedStaticDtorDeclaration ****************************/ + +-SharedStaticDtorDeclaration::SharedStaticDtorDeclaration(Loc loc, Loc endloc) +- : StaticDtorDeclaration(loc, endloc, "_sharedStaticDtor") ++SharedStaticDtorDeclaration::SharedStaticDtorDeclaration(Loc loc, Loc endloc, StorageClass stc) ++ : StaticDtorDeclaration(loc, endloc, "_sharedStaticDtor", stc) + { + } + + Dsymbol *SharedStaticDtorDeclaration::syntaxCopy(Dsymbol *s) + { + assert(!s); +- SharedStaticDtorDeclaration *sdd = new SharedStaticDtorDeclaration(loc, endloc); ++ SharedStaticDtorDeclaration *sdd = new SharedStaticDtorDeclaration(loc, endloc, storage_class); + return FuncDeclaration::syntaxCopy(sdd); + } + +@@ -4143,8 +4406,10 @@ void SharedStaticDtorDeclaration::toCBuf + + /********************************* InvariantDeclaration ****************************/ + +-InvariantDeclaration::InvariantDeclaration(Loc loc, Loc endloc) +- : FuncDeclaration(loc, endloc, Id::classInvariant, STCundefined, NULL) ++InvariantDeclaration::InvariantDeclaration(Loc loc, Loc endloc, StorageClass stc, Identifier *id) ++ : FuncDeclaration(loc, endloc, ++ id ? id : Identifier::generateId("__invariant"), ++ stc, NULL) + { + } + +@@ -4153,7 +4418,7 @@ Dsymbol *InvariantDeclaration::syntaxCop + InvariantDeclaration *id; + + assert(!s); +- id = new InvariantDeclaration(loc, endloc); ++ id = new InvariantDeclaration(loc, endloc, storage_class); + FuncDeclaration::syntaxCopy(id); + return id; + } +@@ -4173,13 +4438,12 @@ void InvariantDeclaration::semantic(Scop + error("invariants are only for struct/union/class definitions"); + return; + } +- else if (ad->inv && ad->inv != this && semanticRun < PASSsemantic) ++ if (ident != Id::classInvariant && semanticRun < PASSsemantic) + { +- error("more than one invariant for %s", ad->toChars()); ++ ad->invs.push(this); + } +- ad->inv = this; + if (!type) +- type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); ++ type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd, storage_class); + + sc = sc->push(); + sc->stc &= ~STCstatic; // not a static invariant +@@ -4192,19 +4456,19 @@ void InvariantDeclaration::semantic(Scop + sc->pop(); + } + +-int InvariantDeclaration::isVirtual() ++bool InvariantDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + +-int InvariantDeclaration::addPreInvariant() ++bool InvariantDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int InvariantDeclaration::addPostInvariant() ++bool InvariantDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void InvariantDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4223,22 +4487,21 @@ void InvariantDeclaration::toCBuffer(Out + * instances per module. + */ + +-#if __DMC__ || _MSC_VER +-#define snprintf _snprintf +-#endif + static Identifier *unitTestId(Loc loc) + { + char name[24]; ++#if __DMC__ || _MSC_VER ++ _snprintf(name, 24, "__unittestL%u_", loc.linnum); ++#else + snprintf(name, 24, "__unittestL%u_", loc.linnum); ++#endif + return Lexer::uniqueId(name); + } +-#if __DMC__ || _MSC_VER +-#undef snprintf +-#endif + +-UnitTestDeclaration::UnitTestDeclaration(Loc loc, Loc endloc) ++UnitTestDeclaration::UnitTestDeclaration(Loc loc, Loc endloc, char *codedoc) + : FuncDeclaration(loc, endloc, unitTestId(loc), STCundefined, NULL) + { ++ this->codedoc = codedoc; + } + + Dsymbol *UnitTestDeclaration::syntaxCopy(Dsymbol *s) +@@ -4246,13 +4509,15 @@ Dsymbol *UnitTestDeclaration::syntaxCopy + UnitTestDeclaration *utd; + + assert(!s); +- utd = new UnitTestDeclaration(loc, endloc); ++ utd = new UnitTestDeclaration(loc, endloc, codedoc); + return FuncDeclaration::syntaxCopy(utd); + } + + + void UnitTestDeclaration::semantic(Scope *sc) + { ++ protection = sc->protection; ++ + if (scope) + { sc = scope; + scope = NULL; +@@ -4263,8 +4528,6 @@ void UnitTestDeclaration::semantic(Scope + if (!type) + type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); + Scope *sc2 = sc->push(); +- // It makes no sense for unit tests to be pure or nothrow. +- sc2->stc &= ~(STCnothrow | STCpure); + sc2->linkage = LINKd; + FuncDeclaration::semantic(sc2); + sc2->pop(); +@@ -4291,19 +4554,19 @@ AggregateDeclaration *UnitTestDeclaratio + return NULL; + } + +-int UnitTestDeclaration::isVirtual() ++bool UnitTestDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + +-int UnitTestDeclaration::addPreInvariant() ++bool UnitTestDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int UnitTestDeclaration::addPostInvariant() ++bool UnitTestDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void UnitTestDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4381,19 +4644,19 @@ const char *NewDeclaration::kind() + return "allocator"; + } + +-int NewDeclaration::isVirtual() ++bool NewDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + +-int NewDeclaration::addPreInvariant() ++bool NewDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int NewDeclaration::addPostInvariant() ++bool NewDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void NewDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -4469,24 +4732,24 @@ const char *DeleteDeclaration::kind() + return "deallocator"; + } + +-int DeleteDeclaration::isDelete() ++bool DeleteDeclaration::isDelete() + { +- return TRUE; ++ return true; + } + +-int DeleteDeclaration::isVirtual() ++bool DeleteDeclaration::isVirtual() + { +- return FALSE; ++ return false; + } + +-int DeleteDeclaration::addPreInvariant() ++bool DeleteDeclaration::addPreInvariant() + { +- return FALSE; ++ return false; + } + +-int DeleteDeclaration::addPostInvariant() ++bool DeleteDeclaration::addPostInvariant() + { +- return FALSE; ++ return false; + } + + void DeleteDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +--- a/src/gcc/d/dfrontend/gpl.txt 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/gpl.txt 2014-04-01 16:32:51.000000000 +0100 +@@ -1,248 +1,248 @@ +- GNU GENERAL PUBLIC LICENSE +- Version 1, February 1989 +- +- Copyright (C) 1989 Free Software Foundation, Inc. +- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA +- Everyone is permitted to copy and distribute verbatim copies +- of this license document, but changing it is not allowed. +- +- Preamble +- +- The license agreements of most software companies try to keep users +-at the mercy of those companies. By contrast, our General Public +-License is intended to guarantee your freedom to share and change free +-software--to make sure the software is free for all its users. The +-General Public License applies to the Free Software Foundation's +-software and to any other program whose authors commit to using it. +-You can use it for your programs, too. +- +- When we speak of free software, we are referring to freedom, not +-price. Specifically, the General Public License is designed to make +-sure that you have the freedom to give away or sell copies of free +-software, that you receive source code or can get it if you want it, +-that you can change the software or use pieces of it in new free +-programs; and that you know you can do these things. +- +- To protect your rights, we need to make restrictions that forbid +-anyone to deny you these rights or to ask you to surrender the rights. +-These restrictions translate to certain responsibilities for you if you +-distribute copies of the software, or if you modify it. +- +- For example, if you distribute copies of a such a program, whether +-gratis or for a fee, you must give the recipients all the rights that +-you have. You must make sure that they, too, receive or can get the +-source code. And you must tell them their rights. +- +- We protect your rights with two steps: (1) copyright the software, and +-(2) offer you this license which gives you legal permission to copy, +-distribute and/or modify the software. +- +- Also, for each author's protection and ours, we want to make certain +-that everyone understands that there is no warranty for this free +-software. If the software is modified by someone else and passed on, we +-want its recipients to know that what they have is not the original, so +-that any problems introduced by others will not reflect on the original +-authors' reputations. +- +- The precise terms and conditions for copying, distribution and +-modification follow. +- +- GNU GENERAL PUBLIC LICENSE +- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +- +- 0. This License Agreement applies to any program or other work which +-contains a notice placed by the copyright holder saying it may be +-distributed under the terms of this General Public License. The +-"Program", below, refers to any such program or work, and a "work based +-on the Program" means either the Program or any work containing the +-Program or a portion of it, either verbatim or with modifications. Each +-licensee is addressed as "you". +- +- 1. You may copy and distribute verbatim copies of the Program's source +-code as you receive it, in any medium, provided that you conspicuously and +-appropriately publish on each copy an appropriate copyright notice and +-disclaimer of warranty; keep intact all the notices that refer to this +-General Public License and to the absence of any warranty; and give any +-other recipients of the Program a copy of this General Public License +-along with the Program. You may charge a fee for the physical act of +-transferring a copy. +- +- 2. You may modify your copy or copies of the Program or any portion of +-it, and copy and distribute such modifications under the terms of Paragraph +-1 above, provided that you also do the following: +- +- a) cause the modified files to carry prominent notices stating that +- you changed the files and the date of any change; and +- +- b) cause the whole of any work that you distribute or publish, that +- in whole or in part contains the Program or any part thereof, either +- with or without modifications, to be licensed at no charge to all +- third parties under the terms of this General Public License (except +- that you may choose to grant warranty protection to some or all +- third parties, at your option). +- +- c) If the modified program normally reads commands interactively when +- run, you must cause it, when started running for such interactive use +- in the simplest and most usual way, to print or display an +- announcement including an appropriate copyright notice and a notice +- that there is no warranty (or else, saying that you provide a +- warranty) and that users may redistribute the program under these +- conditions, and telling the user how to view a copy of this General +- Public License. +- +- d) You may charge a fee for the physical act of transferring a +- copy, and you may at your option offer warranty protection in +- exchange for a fee. +- +-Mere aggregation of another independent work with the Program (or its +-derivative) on a volume of a storage or distribution medium does not bring +-the other work under the scope of these terms. +- +- 3. You may copy and distribute the Program (or a portion or derivative of +-it, under Paragraph 2) in object code or executable form under the terms of +-Paragraphs 1 and 2 above provided that you also do one of the following: +- +- a) accompany it with the complete corresponding machine-readable +- source code, which must be distributed under the terms of +- Paragraphs 1 and 2 above; or, +- +- b) accompany it with a written offer, valid for at least three +- years, to give any third party free (except for a nominal charge +- for the cost of distribution) a complete machine-readable copy of the +- corresponding source code, to be distributed under the terms of +- Paragraphs 1 and 2 above; or, +- +- c) accompany it with the information you received as to where the +- corresponding source code may be obtained. (This alternative is +- allowed only for noncommercial distribution and only if you +- received the program in object code or executable form alone.) +- +-Source code for a work means the preferred form of the work for making +-modifications to it. For an executable file, complete source code means +-all the source code for all modules it contains; but, as a special +-exception, it need not include source code for modules which are standard +-libraries that accompany the operating system on which the executable +-file runs, or for standard header files or definitions files that +-accompany that operating system. +- +- 4. You may not copy, modify, sublicense, distribute or transfer the +-Program except as expressly provided under this General Public License. +-Any attempt otherwise to copy, modify, sublicense, distribute or transfer +-the Program is void, and will automatically terminate your rights to use +-the Program under this License. However, parties who have received +-copies, or rights to use copies, from you under this General Public +-License will not have their licenses terminated so long as such parties +-remain in full compliance. +- +- 5. By copying, distributing or modifying the Program (or any work based +-on the Program) you indicate your acceptance of this license to do so, +-and all its terms and conditions. +- +- 6. Each time you redistribute the Program (or any work based on the +-Program), the recipient automatically receives a license from the original +-licensor to copy, distribute or modify the Program subject to these +-terms and conditions. You may not impose any further restrictions on the +-recipients' exercise of the rights granted herein. +- +- 7. The Free Software Foundation may publish revised and/or new versions +-of the General Public License from time to time. Such new versions will +-be similar in spirit to the present version, but may differ in detail to +-address new problems or concerns. +- +-Each version is given a distinguishing version number. If the Program +-specifies a version number of the license which applies to it and "any +-later version", you have the option of following the terms and conditions +-either of that version or of any later version published by the Free +-Software Foundation. If the Program does not specify a version number of +-the license, you may choose any version ever published by the Free Software +-Foundation. +- +- 8. If you wish to incorporate parts of the Program into other free +-programs whose distribution conditions are different, write to the author +-to ask for permission. For software which is copyrighted by the Free +-Software Foundation, write to the Free Software Foundation; we sometimes +-make exceptions for this. Our decision will be guided by the two goals +-of preserving the free status of all derivatives of our free software and +-of promoting the sharing and reuse of software generally. +- +- NO WARRANTY +- +- 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +-REPAIR OR CORRECTION. +- +- 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +-POSSIBILITY OF SUCH DAMAGES. +- +- END OF TERMS AND CONDITIONS +- +- Appendix: How to Apply These Terms to Your New Programs +- +- If you develop a new program, and you want it to be of the greatest +-possible use to humanity, the best way to achieve this is to make it +-free software which everyone can redistribute and change under these +-terms. +- +- To do so, attach the following notices to the program. It is safest to +-attach them to the start of each source file to most effectively convey +-the exclusion of warranty; and each file should have at least the +-"copyright" line and a pointer to where the full notice is found. +- +- +- Copyright (C) 19yy +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 1, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software Foundation, +- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +- +-Also add information on how to contact you by electronic and paper mail. +- +-If the program is interactive, make it output a short notice like this +-when it starts in an interactive mode: +- +- Gnomovision version 69, Copyright (C) 19xx name of author +- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +- This is free software, and you are welcome to redistribute it +- under certain conditions; type `show c' for details. +- +-The hypothetical commands `show w' and `show c' should show the +-appropriate parts of the General Public License. Of course, the +-commands you use may be called something other than `show w' and `show +-c'; they could even be mouse-clicks or menu items--whatever suits your +-program. +- +-You should also get your employer (if you work as a programmer) or your +-school, if any, to sign a "copyright disclaimer" for the program, if +-necessary. Here a sample; alter the names: +- +- Yoyodyne, Inc., hereby disclaims all copyright interest in the +- program `Gnomovision' (a program to direct compilers to make passes +- at assemblers) written by James Hacker. +- +- , 1 April 1989 +- Ty Coon, President of Vice +- +-That's all there is to it! ++ GNU GENERAL PUBLIC LICENSE ++ Version 1, February 1989 ++ ++ Copyright (C) 1989 Free Software Foundation, Inc. ++ 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The license agreements of most software companies try to keep users ++at the mercy of those companies. By contrast, our General Public ++License is intended to guarantee your freedom to share and change free ++software--to make sure the software is free for all its users. The ++General Public License applies to the Free Software Foundation's ++software and to any other program whose authors commit to using it. ++You can use it for your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Specifically, the General Public License is designed to make ++sure that you have the freedom to give away or sell copies of free ++software, that you receive source code or can get it if you want it, ++that you can change the software or use pieces of it in new free ++programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of a such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must tell them their rights. ++ ++ We protect your rights with two steps: (1) copyright the software, and ++(2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ GNU GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License Agreement applies to any program or other work which ++contains a notice placed by the copyright holder saying it may be ++distributed under the terms of this General Public License. The ++"Program", below, refers to any such program or work, and a "work based ++on the Program" means either the Program or any work containing the ++Program or a portion of it, either verbatim or with modifications. Each ++licensee is addressed as "you". ++ ++ 1. You may copy and distribute verbatim copies of the Program's source ++code as you receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice and ++disclaimer of warranty; keep intact all the notices that refer to this ++General Public License and to the absence of any warranty; and give any ++other recipients of the Program a copy of this General Public License ++along with the Program. You may charge a fee for the physical act of ++transferring a copy. ++ ++ 2. You may modify your copy or copies of the Program or any portion of ++it, and copy and distribute such modifications under the terms of Paragraph ++1 above, provided that you also do the following: ++ ++ a) cause the modified files to carry prominent notices stating that ++ you changed the files and the date of any change; and ++ ++ b) cause the whole of any work that you distribute or publish, that ++ in whole or in part contains the Program or any part thereof, either ++ with or without modifications, to be licensed at no charge to all ++ third parties under the terms of this General Public License (except ++ that you may choose to grant warranty protection to some or all ++ third parties, at your option). ++ ++ c) If the modified program normally reads commands interactively when ++ run, you must cause it, when started running for such interactive use ++ in the simplest and most usual way, to print or display an ++ announcement including an appropriate copyright notice and a notice ++ that there is no warranty (or else, saying that you provide a ++ warranty) and that users may redistribute the program under these ++ conditions, and telling the user how to view a copy of this General ++ Public License. ++ ++ d) You may charge a fee for the physical act of transferring a ++ copy, and you may at your option offer warranty protection in ++ exchange for a fee. ++ ++Mere aggregation of another independent work with the Program (or its ++derivative) on a volume of a storage or distribution medium does not bring ++the other work under the scope of these terms. ++ ++ 3. You may copy and distribute the Program (or a portion or derivative of ++it, under Paragraph 2) in object code or executable form under the terms of ++Paragraphs 1 and 2 above provided that you also do one of the following: ++ ++ a) accompany it with the complete corresponding machine-readable ++ source code, which must be distributed under the terms of ++ Paragraphs 1 and 2 above; or, ++ ++ b) accompany it with a written offer, valid for at least three ++ years, to give any third party free (except for a nominal charge ++ for the cost of distribution) a complete machine-readable copy of the ++ corresponding source code, to be distributed under the terms of ++ Paragraphs 1 and 2 above; or, ++ ++ c) accompany it with the information you received as to where the ++ corresponding source code may be obtained. (This alternative is ++ allowed only for noncommercial distribution and only if you ++ received the program in object code or executable form alone.) ++ ++Source code for a work means the preferred form of the work for making ++modifications to it. For an executable file, complete source code means ++all the source code for all modules it contains; but, as a special ++exception, it need not include source code for modules which are standard ++libraries that accompany the operating system on which the executable ++file runs, or for standard header files or definitions files that ++accompany that operating system. ++ ++ 4. You may not copy, modify, sublicense, distribute or transfer the ++Program except as expressly provided under this General Public License. ++Any attempt otherwise to copy, modify, sublicense, distribute or transfer ++the Program is void, and will automatically terminate your rights to use ++the Program under this License. However, parties who have received ++copies, or rights to use copies, from you under this General Public ++License will not have their licenses terminated so long as such parties ++remain in full compliance. ++ ++ 5. By copying, distributing or modifying the Program (or any work based ++on the Program) you indicate your acceptance of this license to do so, ++and all its terms and conditions. ++ ++ 6. Each time you redistribute the Program (or any work based on the ++Program), the recipient automatically receives a license from the original ++licensor to copy, distribute or modify the Program subject to these ++terms and conditions. You may not impose any further restrictions on the ++recipients' exercise of the rights granted herein. ++ ++ 7. The Free Software Foundation may publish revised and/or new versions ++of the General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Program ++specifies a version number of the license which applies to it and "any ++later version", you have the option of following the terms and conditions ++either of that version or of any later version published by the Free ++Software Foundation. If the Program does not specify a version number of ++the license, you may choose any version ever published by the Free Software ++Foundation. ++ ++ 8. If you wish to incorporate parts of the Program into other free ++programs whose distribution conditions are different, write to the author ++to ask for permission. For software which is copyrighted by the Free ++Software Foundation, write to the Free Software Foundation; we sometimes ++make exceptions for this. Our decision will be guided by the two goals ++of preserving the free status of all derivatives of our free software and ++of promoting the sharing and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ++REPAIR OR CORRECTION. ++ ++ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR ++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, ++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING ++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED ++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY ++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER ++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE ++POSSIBILITY OF SUCH DAMAGES. ++ ++ END OF TERMS AND CONDITIONS ++ ++ Appendix: How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to humanity, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these ++terms. ++ ++ To do so, attach the following notices to the program. It is safest to ++attach them to the start of each source file to most effectively convey ++the exclusion of warranty; and each file should have at least the ++"copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) 19yy ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 1, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software Foundation, ++ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++If the program is interactive, make it output a short notice like this ++when it starts in an interactive mode: ++ ++ Gnomovision version 69, Copyright (C) 19xx name of author ++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the ++appropriate parts of the General Public License. Of course, the ++commands you use may be called something other than `show w' and `show ++c'; they could even be mouse-clicks or menu items--whatever suits your ++program. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a "copyright disclaimer" for the program, if ++necessary. Here a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the ++ program `Gnomovision' (a program to direct compilers to make passes ++ at assemblers) written by James Hacker. ++ ++ , 1 April 1989 ++ Ty Coon, President of Vice ++ ++That's all there is to it! +--- a/src/gcc/d/dfrontend/hdrgen.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/hdrgen.c 2014-04-01 16:32:51.000000000 +0100 +@@ -66,8 +66,8 @@ void Module::genhdrfile() + hdrfile->setbuffer(hdrbufr.data, hdrbufr.offset); + hdrbufr.data = NULL; + +- FileName::ensurePathToNameExists(hdrfile->toChars()); +- hdrfile->writev(); ++ ensurePathToNameExists(Loc(), hdrfile->toChars()); ++ writeFile(loc, hdrfile); + } + + +--- a/src/gcc/d/dfrontend/identifier.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/identifier.c 2014-04-01 16:32:51.000000000 +0100 +@@ -25,17 +25,12 @@ Identifier::Identifier(const char *strin + this->len = strlen(string); + } + +-hash_t Identifier::hashCode() +-{ +- return String::calcHash(string); +-} +- +-int Identifier::equals(Object *o) ++bool Identifier::equals(RootObject *o) + { + return this == o || memcmp(string,o->toChars(),len+1) == 0; + } + +-int Identifier::compare(Object *o) ++int Identifier::compare(RootObject *o) + { + return memcmp(string, o->toChars(), len + 1); + } +@@ -51,7 +46,6 @@ const char *Identifier::toHChars2() + + if (this == Id::ctor) p = "this"; + else if (this == Id::dtor) p = "~this"; +- else if (this == Id::classInvariant) p = "invariant"; + else if (this == Id::unitTest) p = "unittest"; + else if (this == Id::dollar) p = "$"; + else if (this == Id::withSym) p = "with"; +@@ -65,6 +59,8 @@ const char *Identifier::toHChars2() + p = "static this"; + else if (memcmp(p, "_staticDtor", 11) == 0) + p = "static ~this"; ++ else if (memcmp(p, "__invariant", 11) == 0) ++ p = "invariant"; + } + } + +@@ -73,7 +69,7 @@ const char *Identifier::toHChars2() + + void Identifier::print() + { +- fprintf(stdmsg, "%s",string); ++ fprintf(stderr, "%s",string); + } + + int Identifier::dyncast() +--- a/src/gcc/d/dfrontend/identifier.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/identifier.h 2014-04-01 16:32:51.000000000 +0100 +@@ -17,19 +17,18 @@ + + #include "root.h" + +-struct Identifier : Object ++class Identifier : public RootObject + { ++public: + int value; + const char *string; + size_t len; + + Identifier(const char *string, int value); +- int equals(Object *o); +- hash_t hashCode(); +- int compare(Object *o); ++ bool equals(RootObject *o); ++ int compare(RootObject *o); + void print(); + char *toChars(); +- char *toHChars(); + const char *toHChars2(); + int dyncast(); + +--- a/src/gcc/d/dfrontend/idgen.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/idgen.c 2014-04-01 16:32:51.000000000 +0100 +@@ -108,6 +108,9 @@ Msgtable msgtable[] = + + { "LINE", "__LINE__" }, + { "FILE", "__FILE__" }, ++ { "MODULE", "__MODULE__" }, ++ { "FUNCTION", "__FUNCTION__" }, ++ { "PRETTY_FUNCTION", "__PRETTY_FUNCTION__" }, + { "DATE", "__DATE__" }, + { "TIME", "__TIME__" }, + { "TIMESTAMP", "__TIMESTAMP__" }, +@@ -263,6 +266,7 @@ Msgtable msgtable[] = + { "lib" }, + { "msg" }, + { "startaddress" }, ++ { "mangle" }, + + // For special functions + { "tohash", "toHash" }, +@@ -275,6 +279,7 @@ Msgtable msgtable[] = + { "WinMain" }, + { "DllMain" }, + { "tls_get_addr", "___tls_get_addr" }, ++ { "entrypoint", "__entrypoint" }, + + // varargs implementation + { "va_argsave_t", "__va_argsave_t" }, +@@ -307,6 +312,7 @@ Msgtable msgtable[] = + { "isAssociativeArray" }, + { "isFinalClass" }, + { "isPOD" }, ++ { "isNested" }, + { "isFloating" }, + { "isIntegral" }, + { "isScalar" }, +@@ -335,6 +341,9 @@ Msgtable msgtable[] = + { "compiles" }, + { "parameters" }, + { "getAttributes" }, ++ { "getUnitTests" }, ++ { "isOverrideFunction" }, ++ { "getVirtualIndex" } + }; + + +@@ -356,7 +365,7 @@ int main() + #endif + fprintf(fp, "#ifndef DMD_ID_H\n"); + fprintf(fp, "#define DMD_ID_H 1\n"); +- fprintf(fp, "struct Identifier;\n"); ++ fprintf(fp, "class Identifier;\n"); + fprintf(fp, "struct Id\n"); + fprintf(fp, "{\n"); + +--- a/src/gcc/d/dfrontend/impcnvgen.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/impcnvgen.c 2014-04-01 16:32:51.000000000 +0100 +@@ -381,44 +381,64 @@ int main() + fprintf(fp,"unsigned char Type::impcnvResult[TMAX][TMAX] =\n{\n"); + for (i = 0; i < TMAX; i++) + { ++ if (i) ++ fprintf(fp, ","); ++ fprintf(fp, "{"); + for (j = 0; j < TMAX; j++) + { +- fprintf(fp, "%d,",impcnvResult[i][j]); ++ if (j) ++ fprintf(fp, ","); ++ fprintf(fp, "%d",impcnvResult[i][j]); + } +- fprintf(fp, "\n"); ++ fprintf(fp, "}\n"); + } + fprintf(fp,"};\n"); + + fprintf(fp,"unsigned char Type::impcnvType1[TMAX][TMAX] =\n{\n"); + for (i = 0; i < TMAX; i++) + { ++ if (i) ++ fprintf(fp, ","); ++ fprintf(fp, "{"); + for (j = 0; j < TMAX; j++) + { +- fprintf(fp, "%d,",impcnvType1[i][j]); ++ if (j) ++ fprintf(fp, ","); ++ fprintf(fp, "%d",impcnvType1[i][j]); + } +- fprintf(fp, "\n"); ++ fprintf(fp, "}\n"); + } + fprintf(fp,"};\n"); + + fprintf(fp,"unsigned char Type::impcnvType2[TMAX][TMAX] =\n{\n"); + for (i = 0; i < TMAX; i++) + { ++ if (i) ++ fprintf(fp, ","); ++ fprintf(fp, "{"); + for (j = 0; j < TMAX; j++) + { +- fprintf(fp, "%d,",impcnvType2[i][j]); ++ if (j) ++ fprintf(fp, ","); ++ fprintf(fp, "%d",impcnvType2[i][j]); + } +- fprintf(fp, "\n"); ++ fprintf(fp, "}\n"); + } + fprintf(fp,"};\n"); + + fprintf(fp,"unsigned char Type::impcnvWarn[TMAX][TMAX] =\n{\n"); + for (i = 0; i < TMAX; i++) + { ++ if (i) ++ fprintf(fp, ","); ++ fprintf(fp, "{"); + for (j = 0; j < TMAX; j++) + { +- fprintf(fp, "%d,",impcnvWarn[i][j]); ++ if (j) ++ fprintf(fp, ","); ++ fprintf(fp, "%d",impcnvWarn[i][j]); + } +- fprintf(fp, "\n"); ++ fprintf(fp, "}\n"); + } + fprintf(fp,"};\n"); + +--- a/src/gcc/d/dfrontend/import.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/import.c 2014-04-01 16:32:51.000000000 +0100 +@@ -30,6 +30,18 @@ Import::Import(Loc loc, Identifiers *pac + : Dsymbol(NULL) + { + assert(id); ++#if 0 ++ printf("Import::Import("); ++ if (packages && packages->dim) ++ { ++ for (size_t i = 0; i < packages->dim; i++) ++ { ++ Identifier *id = (*packages)[i]; ++ printf("%s.", id->toChars()); ++ } ++ } ++ printf("%s)\n", id->toChars()); ++#endif + this->loc = loc; + this->packages = packages; + this->id = id; +@@ -68,7 +80,7 @@ const char *Import::kind() + return isstatic ? (char *)"static import" : (char *)"import"; + } + +-enum PROT Import::prot() ++PROT Import::prot() + { + return protection; + } +@@ -89,10 +101,11 @@ Dsymbol *Import::syntaxCopy(Dsymbol *s) + + void Import::load(Scope *sc) + { +- //printf("Import::load('%s')\n", toChars()); ++ //printf("Import::load('%s') %p\n", toPrettyChars(), this); + + // See if existing module + DsymbolTable *dst = Package::resolve(packages, NULL, &pkg); ++#if 0 + if (pkg && pkg->isModule()) + { + ::error(loc, "can only import from a module, not from a member of module %s. Did you mean `import %s : %s`?", +@@ -100,6 +113,7 @@ void Import::load(Scope *sc) + mod = pkg->isModule(); // Error recovery - treat as import of that module + return; + } ++#endif + Dsymbol *s = dst->lookup(id); + if (s) + { +@@ -107,7 +121,31 @@ void Import::load(Scope *sc) + mod = (Module *)s; + else + { +- if (pkg) ++ if (s->isAliasDeclaration()) ++ { ++ ::error(loc, "%s %s conflicts with %s", s->kind(), s->toPrettyChars(), id->toChars()); ++ } ++ else if (Package *p = s->isPackage()) ++ { ++ if (p->isPkgMod == PKGunknown) ++ { ++ mod = Module::load(loc, packages, id); ++ if (!mod) ++ p->isPkgMod = PKGpackage; ++ else ++ assert(p->isPkgMod == PKGmodule); ++ } ++ else if (p->isPkgMod == PKGmodule) ++ { ++ mod = p->mod; ++ } ++ if (p->isPkgMod != PKGmodule) ++ { ++ ::error(loc, "can only import from a module, not from package %s.%s", ++ p->toPrettyChars(), id->toChars()); ++ } ++ } ++ else if (pkg) + { + ::error(loc, "can only import from a module, not from package %s.%s", + pkg->toPrettyChars(), id->toChars()); +@@ -128,43 +166,23 @@ void Import::load(Scope *sc) + { + dst->insert(id, mod); // id may be different from mod->ident, + // if so then insert alias +- if (!mod->importedFrom) +- mod->importedFrom = sc ? sc->module->importedFrom : Module::rootModule; + } + } ++ if (mod && !mod->importedFrom) ++ mod->importedFrom = sc ? sc->module->importedFrom : Module::rootModule; + if (!pkg) + pkg = mod; + + //printf("-Import::load('%s'), pkg = %p\n", toChars(), pkg); + } + +-void escapePath(OutBuffer *buf, const char *fname) +-{ +- while (1) +- { +- switch (*fname) +- { +- case 0: +- return; +- case '(': +- case ')': +- case '\\': +- buf->writebyte('\\'); +- default: +- buf->writebyte(*fname); +- break; +- } +- fname++; +- } +-} +- + void Import::importAll(Scope *sc) + { + if (!mod) + { + load(sc); + if (mod) // if successfully loaded module +- { mod->importAll(0); ++ { mod->importAll(NULL); + + if (!isstatic && !aliasId && !names.dim) + { +@@ -178,7 +196,7 @@ void Import::importAll(Scope *sc) + + void Import::semantic(Scope *sc) + { +- //printf("Import::semantic('%s')\n", toChars()); ++ //printf("Import::semantic('%s')\n", toPrettyChars()); + + if (scope) + { sc = scope; +@@ -189,7 +207,7 @@ void Import::semantic(Scope *sc) + if (!mod) + { load(sc); + if (mod) +- mod->importAll(0); ++ mod->importAll(NULL); + } + + if (mod) +@@ -245,7 +263,6 @@ void Import::semantic(Scope *sc) + if (mod->search(loc, names[i], 0)) + { + ad->semantic(sc); +- ad->import = NULL; // forward reference resolved + } + else + { +@@ -261,7 +278,10 @@ void Import::semantic(Scope *sc) + + if (global.params.moduleDeps != NULL && + // object self-imports itself, so skip that (Bugzilla 7547) +- !(id == Id::object && sc->module->ident == Id::object)) ++ !(id == Id::object && sc->module->ident == Id::object) && ++ // don't list pseudo modules __entrypoint.d, __main.d (Bugzilla 11117, 11164) ++ sc->module->ident != Id::entrypoint && ++ strcmp(sc->module->ident->string, "__main") != 0) + { + /* The grammar of the file is: + * ImportDeclaration +@@ -277,10 +297,12 @@ void Import::semantic(Scope *sc) + */ + + OutBuffer *ob = global.params.moduleDeps; +- +- ob->writestring(sc->module->toPrettyChars()); ++ Module* imod = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ if (!global.params.moduleDepsFile) ++ ob->writestring("depsImport "); ++ ob->writestring(imod->toPrettyChars()); + ob->writestring(" ("); +- escapePath(ob, sc->module->srcfile->toChars()); ++ escapePath(ob, imod->srcfile->toChars()); + ob->writestring(") : "); + + // use protection instead of sc->protection because it couldn't be +@@ -404,7 +426,7 @@ Dsymbol *Import::search(Loc loc, Identif + return pkg->search(loc, ident, flags); + } + +-int Import::overloadInsert(Dsymbol *s) ++bool Import::overloadInsert(Dsymbol *s) + { + /* Allow multiple imports with the same package base, but disallow + * alias collisions (Bugzilla 5412). +@@ -412,9 +434,9 @@ int Import::overloadInsert(Dsymbol *s) + assert(ident && ident == s->ident); + Import *imp; + if (!aliasId && (imp = s->isImport()) != NULL && !imp->aliasId) +- return TRUE; ++ return true; + else +- return FALSE; ++ return false; + } + + void Import::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +--- a/src/gcc/d/dfrontend/import.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/import.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2007 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -18,37 +18,41 @@ + #include "dsymbol.h" + + +-struct Identifier; ++class Identifier; + struct Scope; + struct OutBuffer; +-struct Module; +-struct Package; +-struct AliasDeclaration; ++class Module; ++class Package; ++class AliasDeclaration; + struct HdrGenState; + +-struct Import : Dsymbol ++class Import : public Dsymbol + { ++public: ++ /* static import aliasId = pkg1.pkg2.id : alias1 = name1, alias2 = name2; ++ */ ++ + Identifiers *packages; // array of Identifier's representing packages + Identifier *id; // module Identifier + Identifier *aliasId; + int isstatic; // !=0 if static import +- enum PROT protection; ++ PROT protection; + + // Pairs of alias=name to bind into current namespace + Identifiers names; + Identifiers aliases; + +- AliasDeclarations aliasdecls; // AliasDeclarations for names/aliases +- +- Module *mod; +- Package *pkg; // leftmost package/module +- + Import(Loc loc, Identifiers *packages, Identifier *id, Identifier *aliasId, + int isstatic); + void addAlias(Identifier *name, Identifier *alias); + ++ AliasDeclarations aliasdecls; // corresponding AliasDeclarations for alias=name pairs ++ ++ Module *mod; ++ Package *pkg; // leftmost package/module ++ + const char *kind(); +- enum PROT prot(); ++ PROT prot(); + Dsymbol *syntaxCopy(Dsymbol *s); // copy only syntax trees + void load(Scope *sc); + void importAll(Scope *sc); +@@ -57,7 +61,7 @@ struct Import : Dsymbol + Dsymbol *toAlias(); + int addMember(Scope *sc, ScopeDsymbol *s, int memnum); + Dsymbol *search(Loc loc, Identifier *ident, int flags); +- int overloadInsert(Dsymbol *s); ++ bool overloadInsert(Dsymbol *s); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + void toJson(JsonOut *json); + +--- a/src/gcc/d/dfrontend/init.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/init.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -65,15 +65,48 @@ Initializers *Initializer::arraySyntaxCo + } + + char *Initializer::toChars() +-{ OutBuffer *buf; ++{ + HdrGenState hgs; + +- memset(&hgs, 0, sizeof(hgs)); +- buf = new OutBuffer(); +- toCBuffer(buf, &hgs); +- return buf->toChars(); ++ OutBuffer buf; ++ toCBuffer(&buf, &hgs); ++ buf.writebyte(0); ++ return buf.extractData(); ++} ++ ++/********************************** ErrorInitializer ***************************/ ++ ++ErrorInitializer::ErrorInitializer() ++ : Initializer(Loc()) ++{ ++} ++ ++ ++Initializer *ErrorInitializer::syntaxCopy() ++{ ++ return this; ++} ++ ++ ++Initializer *ErrorInitializer::semantic(Scope *sc, Type *t, NeedInterpret needInterpret) ++{ ++ //printf("ErrorInitializer::semantic(t = %p)\n", t); ++ return this; ++} ++ ++ ++Expression *ErrorInitializer::toExpression(Type *t) ++{ ++ return new ErrorExp(); ++} ++ ++ ++void ErrorInitializer::toCBuffer(OutBuffer *buf, HdrGenState *hgs) ++{ ++ buf->writestring("__error__"); + } + ++ + /********************************** VoidInitializer ***************************/ + + VoidInitializer::VoidInitializer(Loc loc) +@@ -97,10 +130,9 @@ Initializer *VoidInitializer::semantic(S + } + + +-Expression *VoidInitializer::toExpression() ++Expression *VoidInitializer::toExpression(Type *t) + { +- error(loc, "void initializer has no value"); +- return new IntegerExp(0); ++ return NULL; + } + + +@@ -115,7 +147,6 @@ void VoidInitializer::toCBuffer(OutBuffe + StructInitializer::StructInitializer(Loc loc) + : Initializer(loc) + { +- ad = NULL; + } + + Initializer *StructInitializer::syntaxCopy() +@@ -145,69 +176,48 @@ void StructInitializer::addInit(Identifi + + Initializer *StructInitializer::semantic(Scope *sc, Type *t, NeedInterpret needInterpret) + { +- int errors = 0; +- + //printf("StructInitializer::semantic(t = %s) %s\n", t->toChars(), toChars()); +- vars.setDim(field.dim); + t = t->toBasetype(); + if (t->ty == Tsarray && t->nextOf()->toBasetype()->ty == Tstruct) + t = t->nextOf()->toBasetype(); + if (t->ty == Tstruct) + { +- size_t fieldi = 0; +- +- TypeStruct *ts = (TypeStruct *)t; +- ad = ts->sym; +- if (ad->ctor) ++ StructDeclaration *sd = ((TypeStruct *)t)->sym; ++ if (sd->ctor) ++ { + error(loc, "%s %s has constructors, cannot use { initializers }, use %s( initializers ) instead", +- ad->kind(), ad->toChars(), ad->toChars()); +- StructDeclaration *sd = ad->isStructDeclaration(); +- assert(sd); ++ sd->kind(), sd->toChars(), sd->toChars()); ++ return new ErrorInitializer(); ++ } + sd->size(loc); + if (sd->sizeok != SIZEOKdone) +- { +- error(loc, "struct %s is forward referenced", sd->toChars()); +- errors = 1; +- goto Lerror; +- } +- size_t nfields = sd->fields.dim; +- if (sd->isnested) +- nfields--; +- for (size_t i = 0; i < field.dim; i++) +- { +- Identifier *id = field[i]; +- Initializer *val = value[i]; +- Dsymbol *s; +- VarDeclaration *v; ++ return new ErrorInitializer(); ++ size_t nfields = sd->fields.dim - sd->isNested(); + +- if (id == NULL) +- { +- if (fieldi >= nfields) +- { error(loc, "too many initializers for %s", ad->toChars()); +- errors = 1; +- field.remove(i); +- i--; +- continue; +- } +- else +- { +- s = ad->fields[fieldi]; +- } +- } +- else ++ //expandTuples for non-identity arguments? ++ ++ Expressions *elements = new Expressions(); ++ elements->setDim(nfields); ++ for (size_t i = 0; i < elements->dim; i++) ++ (*elements)[i] = NULL; ++ ++ // Run semantic for explicitly given initializers ++ // TODO: this part is slightly different from StructLiteralExp::semantic. ++ bool errors = false; ++ for (size_t fieldi = 0, i = 0; i < field.dim; i++) ++ { ++ if (Identifier *id = field[i]) + { +- //s = ad->symtab->lookup(id); +- s = ad->search(loc, id, 0); ++ Dsymbol *s = sd->search(loc, id, 0); + if (!s) + { +- s = ad->search_correct(id); ++ s = sd->search_correct(id); + if (s) + error(loc, "'%s' is not a member of '%s', did you mean '%s %s'?", +- id->toChars(), t->toChars(), s->kind(), s->toChars()); ++ id->toChars(), sd->toChars(), s->kind(), s->toChars()); + else +- error(loc, "'%s' is not a member of '%s'", id->toChars(), t->toChars()); +- errors = 1; +- continue; ++ error(loc, "'%s' is not a member of '%s'", id->toChars(), sd->toChars()); ++ return new ErrorInitializer(); + } + s = s->toAlias(); + +@@ -217,52 +227,82 @@ Initializer *StructInitializer::semantic + if (fieldi >= nfields) + { + error(loc, "%s.%s is not a per-instance initializable field", +- t->toChars(), s->toChars()); +- errors = 1; +- break; ++ sd->toChars(), s->toChars()); ++ return new ErrorInitializer(); + } +- if (s == ad->fields[fieldi]) ++ if (s == sd->fields[fieldi]) + break; + } + } +- if (s && (v = s->isVarDeclaration()) != NULL) ++ else if (fieldi >= nfields) + { +- val = val->semantic(sc, v->type->addMod(t->mod), needInterpret); +- value[i] = val; +- vars[i] = v; ++ error(loc, "too many initializers for %s", sd->toChars()); ++ return new ErrorInitializer(); + } +- else +- { error(loc, "%s is not a field of %s", id ? id->toChars() : s->toChars(), ad->toChars()); +- errors = 1; ++ ++ VarDeclaration *vd = sd->fields[fieldi]; ++ if ((*elements)[fieldi]) ++ { ++ error(loc, "duplicate initializer for field '%s'", vd->toChars()); ++ errors = true; ++ continue; + } +- fieldi++; +- } ++ for (size_t j = 0; j < nfields; j++) ++ { ++ VarDeclaration *v2 = sd->fields[j]; ++ bool overlap = (vd->offset < v2->offset + v2->type->size() && ++ v2->offset < vd->offset + vd->type->size()); ++ if (overlap && (*elements)[j]) ++ { ++ error(loc, "overlapping initialization for field %s and %s", ++ v2->toChars(), vd->toChars()); ++ errors = true; ++ continue; ++ } ++ } ++ ++ assert(sc); ++ Initializer *iz = value[i]; ++ iz = iz->semantic(sc, vd->type->addMod(t->mod), needInterpret); ++ Expression *ex = iz->toExpression(); ++ if (ex->op == TOKerror) ++ { ++ errors = true; ++ continue; ++ } ++ value[i] = iz; ++ (*elements)[fieldi] = ex; ++ ++fieldi; ++ } ++ if (errors) ++ return new ErrorInitializer(); ++ ++ StructLiteralExp *sle = new StructLiteralExp(loc, sd, elements, t); ++ Expression *e = sle->fill(false); ++ if (e->op == TOKerror) ++ return new ErrorInitializer(); ++ ++ e->type = t; ++ ++ ExpInitializer *ie = new ExpInitializer(loc, e); ++ return ie->semantic(sc, t, needInterpret); + } + else if (t->ty == Tdelegate && value.dim == 0) +- { /* Rewrite as empty delegate literal { } ++ { ++ /* Rewrite as empty delegate literal { } + */ + Parameters *arguments = new Parameters; + Type *tf = new TypeFunction(arguments, NULL, 0, LINKd); +- FuncLiteralDeclaration *fd = new FuncLiteralDeclaration(loc, 0, tf, TOKdelegate, NULL); ++ FuncLiteralDeclaration *fd = new FuncLiteralDeclaration(loc, Loc(), tf, TOKdelegate, NULL); + fd->fbody = new CompoundStatement(loc, new Statements()); + fd->endloc = loc; + Expression *e = new FuncExp(loc, fd); + ExpInitializer *ie = new ExpInitializer(loc, e); + return ie->semantic(sc, t, needInterpret); + } +- else +- { +- error(loc, "a struct is not a valid initializer for a %s", t->toChars()); +- errors = 1; +- } +-Lerror: +- if (errors) +- { +- field.setDim(0); +- value.setDim(0); +- vars.setDim(0); +- } +- return this; ++ ++ error(loc, "a struct is not a valid initializer for a %s", t->toChars()); ++ return new ErrorInitializer(); + } + + /*************************************** +@@ -270,156 +310,12 @@ Lerror: + * a struct literal. In the future, the two should be the + * same thing. + */ +-Expression *StructInitializer::toExpression() +-{ Expression *e; +- size_t offset; +- +- //printf("StructInitializer::toExpression() %s\n", toChars()); +- if (!ad) // if fwd referenced +- return NULL; +- StructDeclaration *sd = ad->isStructDeclaration(); +- if (!sd) +- return NULL; +- +- Expressions *elements = new Expressions(); +- size_t nfields = ad->fields.dim; +-#if DMDV2 +- if (sd->isnested) +- nfields--; +-#endif +- elements->setDim(nfields); +- for (size_t i = 0; i < elements->dim; i++) +- { +- (*elements)[i] = NULL; +- } +- size_t fieldi = 0; +- for (size_t i = 0; i < value.dim; i++) +- { +- Identifier *id = field[i]; +- if (id) +- { +- Dsymbol * s = ad->search(loc, id, 0); +- if (!s) +- { +- error(loc, "'%s' is not a member of '%s'", id->toChars(), sd->toChars()); +- goto Lno; +- } +- s = s->toAlias(); +- +- // Find out which field index it is +- for (fieldi = 0; 1; fieldi++) +- { +- if (fieldi >= nfields) +- { +- s->error("is not a per-instance initializable field"); +- goto Lno; +- } +- if (s == ad->fields[fieldi]) +- break; +- } +- } +- else if (fieldi >= nfields) +- { error(loc, "too many initializers for '%s'", ad->toChars()); +- goto Lno; +- } +- Initializer *iz = value[i]; +- if (!iz) +- goto Lno; +- Expression *ex = iz->toExpression(); +- if (!ex) +- goto Lno; +- if ((*elements)[fieldi]) +- { error(loc, "duplicate initializer for field '%s'", +- ad->fields[fieldi]->toChars()); +- goto Lno; +- } +- (*elements)[fieldi] = ex; +- ++fieldi; +- } +- // Now, fill in any missing elements with default initializers. +- // We also need to validate any anonymous unions +- offset = 0; +- for (size_t i = 0; i < elements->dim; ) +- { +- VarDeclaration * vd = ad->fields[i]->isVarDeclaration(); +- +- //printf("test2 [%d] : %s %d %d\n", i, vd->toChars(), (int)offset, (int)vd->offset); +- if (vd->offset < offset) +- { +- // Only the first field of a union can have an initializer +- if ((*elements)[i]) +- goto Lno; +- } +- else +- { +- if (!(*elements)[i]) +- { // Default initialize +- if (vd->init) +- { +- if (vd->scope) +- { // Do deferred semantic analysis +- Initializer *i2 = vd->init->syntaxCopy(); +- i2 = i2->semantic(vd->scope, vd->type, INITinterpret); +- (*elements)[i] = i2->toExpression(); +- if (!global.gag) +- { vd->scope = NULL; +- vd->init = i2; // save result +- } +- } +- else +- (*elements)[i] = vd->init->toExpression(); +- } +- else +- (*elements)[i] = vd->type->defaultInit(); +- } +- } +- offset = vd->offset + vd->type->size(); +- i++; +-#if 0 +- int unionSize = ad->numFieldsInUnion(i); +- if (unionSize == 1) +- { // Not a union -- default initialize if missing +- if (!(*elements)[i]) +- (*elements)[i] = vd->type->defaultInit(); +- } +- else +- { // anonymous union -- check for errors +- int found = -1; // index of the first field with an initializer +- for (size_t j = i; j < i + unionSize; ++j) +- { +- if (!(*elements)[j]) +- continue; +- if (found >= 0) +- { +- VarDeclaration * v1 = ((Dsymbol *)ad->fields.data[found])->isVarDeclaration(); +- VarDeclaration * v = ((Dsymbol *)ad->fields.data[j])->isVarDeclaration(); +- error(loc, "%s cannot have initializers for fields %s and %s in same union", +- ad->toChars(), +- v1->toChars(), v->toChars()); +- goto Lno; +- } +- found = j; +- } +- if (found == -1) +- { +- error(loc, "no initializer for union that contains field %s", +- vd->toChars()); +- goto Lno; +- } +- } +- i += unionSize; +-#endif +- } +- e = new StructLiteralExp(loc, sd, elements); +- e->type = sd->type; +- return e; +- +-Lno: +- delete elements; ++Expression *StructInitializer::toExpression(Type *t) ++{ ++ // cannot convert to an expression without target 'ad' + return NULL; + } + +- + void StructInitializer::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + //printf("StructInitializer::toCBuffer()\n"); +@@ -427,7 +323,7 @@ void StructInitializer::toCBuffer(OutBuf + for (size_t i = 0; i < field.dim; i++) + { + if (i > 0) +- buf->writebyte(','); ++ buf->writestring(", "); + Identifier *id = field[i]; + if (id) + { +@@ -485,6 +381,7 @@ Initializer *ArrayInitializer::semantic( + { + size_t length; + const unsigned amax = 0x80000000; ++ bool errors = false; + + //printf("ArrayInitializer::semantic(%s)\n", t->toChars()); + if (sem) // if semantic() already run +@@ -519,10 +416,15 @@ Initializer *ArrayInitializer::semantic( + { + Expression *idx = index[i]; + if (idx) +- { idx = idx->semantic(sc); ++ { ++ sc = sc->startCTFE(); ++ idx = idx->semantic(sc); ++ sc = sc->endCTFE(); + idx = idx->ctfeInterpret(); + index[i] = idx; + length = idx->toInteger(); ++ if (idx->op == TOKerror) ++ errors = true; + } + + Initializer *val = value[i]; +@@ -530,6 +432,8 @@ Initializer *ArrayInitializer::semantic( + if (ei && !idx) + ei->expandTuples = 1; + val = val->semantic(sc, t->nextOf(), needInterpret); ++ if (val->isErrorInitializer()) ++ errors = true; + + ei = val->isExpInitializer(); + // found a tuple, expand it +@@ -570,6 +474,8 @@ Initializer *ArrayInitializer::semantic( + goto Lerr; + } + } ++ if (errors) ++ goto Lerr; + + if ((uinteger_t) dim * t->nextOf()->size() >= amax) + { error(loc, "array dimension %u exceeds max of %u", (unsigned) dim, (unsigned)(amax / t->nextOf()->size())); +@@ -578,7 +484,7 @@ Initializer *ArrayInitializer::semantic( + return this; + + Lerr: +- return new ExpInitializer(loc, new ErrorExp()); ++ return new ErrorInitializer(); + } + + /******************************** +@@ -586,12 +492,12 @@ Lerr: + * Otherwise return NULL. + */ + +-Expression *ArrayInitializer::toExpression() +-{ Expressions *elements; +- ++Expression *ArrayInitializer::toExpression(Type *tx) ++{ + //printf("ArrayInitializer::toExpression(), dim = %d\n", dim); + //static int i; if (++i == 2) halt(); + ++ Expressions *elements; + size_t edim; + Type *t = NULL; + if (type) +@@ -606,6 +512,11 @@ Expression *ArrayInitializer::toExpressi + edim = ((TypeSArray *)t)->dim->toInteger(); + break; + ++ case Tvector: ++ t = ((TypeVector *)t)->basetype; ++ edim = ((TypeSArray *)t)->dim->toInteger(); ++ break; ++ + case Tpointer: + case Tarray: + edim = dim; +@@ -667,6 +578,12 @@ Expression *ArrayInitializer::toExpressi + } + } + ++ for (size_t i = 0; i < edim; i++) ++ { Expression *e = (*elements)[i]; ++ if (e->op == TOKerror) ++ return e; ++ } ++ + Expression *e = new ArrayLiteralExp(loc, elements); + e->type = type; + return e; +@@ -782,7 +699,7 @@ void ArrayInitializer::toCBuffer(OutBuff + for (size_t i = 0; i < index.dim; i++) + { + if (i > 0) +- buf->writebyte(','); ++ buf->writestring(", "); + Expression *ex = index[i]; + if (ex) + { +@@ -842,6 +759,27 @@ bool hasNonConstPointers(Expression *e) + return arrayHasNonConstPointers(ae->keys); + return false; + } ++ if(e->op == TOKaddress) ++ { ++ AddrExp *ae = (AddrExp *)e; ++ if (ae->e1->op == TOKstructliteral) ++ { ++ StructLiteralExp *se = (StructLiteralExp *)ae->e1; ++ if (!(se->stageflags & stageSearchPointers)) ++ { ++ int old = se->stageflags; ++ se->stageflags |= stageSearchPointers; ++ bool ret = arrayHasNonConstPointers(se->elements); ++ se->stageflags = old; ++ return ret; ++ } ++ else ++ { ++ return false; ++ } ++ } ++ return true; ++ } + if (e->type->ty== Tpointer && e->type->nextOf()->ty != Tfunction) + { + if (e->op == TOKsymoff) // address of a global is OK +@@ -870,8 +808,10 @@ bool arrayHasNonConstPointers(Expression + Initializer *ExpInitializer::semantic(Scope *sc, Type *t, NeedInterpret needInterpret) + { + //printf("ExpInitializer::semantic(%s), type = %s\n", exp->toChars(), t->toChars()); ++ if (needInterpret) sc = sc->startCTFE(); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); ++ if (needInterpret) sc = sc->endCTFE(); + if (exp->op == TOKerror) + return this; + +@@ -884,13 +824,16 @@ Initializer *ExpInitializer::semantic(Sc + return this; // Failed, suppress duplicate error messages + + if (exp->op == TOKtype) ++ { + exp->error("initializer must be an expression, not '%s'", exp->toChars()); ++ return new ErrorInitializer(); ++ } + + // Make sure all pointers are constants + if (needInterpret && hasNonConstPointers(exp)) + { + exp->error("cannot use non-constant CTFE pointer in an initializer '%s'", exp->toChars()); +- return this; ++ return new ErrorInitializer(); + } + + Type *tb = t->toBasetype(); +@@ -946,6 +889,9 @@ Initializer *ExpInitializer::semantic(Sc + exp->implicitConvTo(tb->nextOf()) + ) + { ++ /* If the variable is not actually used in compile time, array creation is ++ * redundant. So delay it until invocation of toExpression() or toDt(). ++ */ + t = tb->nextOf(); + } + +@@ -978,18 +924,33 @@ Type *ExpInitializer::inferType(Scope *s + + // Give error for overloaded function addresses + if (exp->op == TOKsymoff) +- { SymOffExp *se = (SymOffExp *)exp; ++ { ++ SymOffExp *se = (SymOffExp *)exp; + if (se->hasOverloads && !se->var->isFuncDeclaration()->isUnique()) ++ { + exp->error("cannot infer type from overloaded function symbol %s", exp->toChars()); ++ return Type::terror; ++ } + } +- +- // Give error for overloaded function addresses + if (exp->op == TOKdelegate) +- { DelegateExp *se = (DelegateExp *)exp; ++ { ++ DelegateExp *se = (DelegateExp *)exp; + if (se->hasOverloads && + se->func->isFuncDeclaration() && + !se->func->isFuncDeclaration()->isUnique()) ++ { + exp->error("cannot infer type from overloaded function symbol %s", exp->toChars()); ++ return Type::terror; ++ } ++ } ++ if (exp->op == TOKaddress) ++ { ++ AddrExp *ae = (AddrExp *)exp; ++ if (ae->e1->op == TOKoverloadset) ++ { ++ exp->error("cannot infer type from overloaded function symbol %s", exp->toChars()); ++ return Type::terror; ++ } + } + + Type *t = exp->type; +@@ -998,8 +959,24 @@ Type *ExpInitializer::inferType(Scope *s + return t; + } + +-Expression *ExpInitializer::toExpression() ++Expression *ExpInitializer::toExpression(Type *t) + { ++ if (t) ++ { ++ Type *tb = t->toBasetype(); ++ if (tb->ty == Tsarray && exp->implicitConvTo(tb->nextOf())) ++ { ++ TypeSArray *tsa = (TypeSArray *)tb; ++ size_t d = tsa->dim->toInteger(); ++ Expressions *elements = new Expressions(); ++ elements->setDim(d); ++ for (size_t i = 0; i < d; i++) ++ (*elements)[i] = exp; ++ ArrayLiteralExp *ae = new ArrayLiteralExp(exp->loc, elements); ++ ae->type = t; ++ exp = ae; ++ } ++ } + return exp; + } + +--- a/src/gcc/d/dfrontend/init.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/init.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2007 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -16,28 +16,28 @@ + #include "mars.h" + #include "arraytypes.h" + +-struct Identifier; +-struct Expression; ++class Identifier; ++class Expression; + struct Scope; +-struct Type; +- ++class Type; + #ifdef IN_GCC + typedef union tree_node dt_t; + #else + struct dt_t; + #endif +- +-struct AggregateDeclaration; +-struct VoidInitializer; +-struct StructInitializer; +-struct ArrayInitializer; +-struct ExpInitializer; ++class AggregateDeclaration; ++class ErrorInitializer; ++class VoidInitializer; ++class StructInitializer; ++class ArrayInitializer; ++class ExpInitializer; + struct HdrGenState; + + enum NeedInterpret { INITnointerpret, INITinterpret }; + +-struct Initializer : Object ++class Initializer : public RootObject + { ++public: + Loc loc; + + Initializer(Loc loc); +@@ -45,7 +45,7 @@ struct Initializer : Object + // needInterpret is INITinterpret if must be a manifest constant, 0 if not. + virtual Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); + virtual Type *inferType(Scope *sc); +- virtual Expression *toExpression() = 0; ++ virtual Expression *toExpression(Type *t = NULL) = 0; + virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs) = 0; + char *toChars(); + +@@ -53,20 +53,22 @@ struct Initializer : Object + + virtual dt_t *toDt(); + +- virtual VoidInitializer *isVoidInitializer() { return NULL; } ++ virtual ErrorInitializer *isErrorInitializer() { return NULL; } ++ virtual VoidInitializer *isVoidInitializer() { return NULL; } + virtual StructInitializer *isStructInitializer() { return NULL; } +- virtual ArrayInitializer *isArrayInitializer() { return NULL; } +- virtual ExpInitializer *isExpInitializer() { return NULL; } ++ virtual ArrayInitializer *isArrayInitializer() { return NULL; } ++ virtual ExpInitializer *isExpInitializer() { return NULL; } + }; + +-struct VoidInitializer : Initializer ++class VoidInitializer : public Initializer + { ++public: + Type *type; // type that this will initialize to + + VoidInitializer(Loc loc); + Initializer *syntaxCopy(); + Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); +- Expression *toExpression(); ++ Expression *toExpression(Type *t = NULL); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + dt_t *toDt(); +@@ -74,19 +76,29 @@ struct VoidInitializer : Initializer + virtual VoidInitializer *isVoidInitializer() { return this; } + }; + +-struct StructInitializer : Initializer ++class ErrorInitializer : public Initializer ++{ ++public: ++ ErrorInitializer(); ++ Initializer *syntaxCopy(); ++ Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); ++ Expression *toExpression(Type *t = NULL); ++ void toCBuffer(OutBuffer *buf, HdrGenState *hgs); ++ ++ virtual ErrorInitializer *isErrorInitializer() { return this; } ++}; ++ ++class StructInitializer : public Initializer + { ++public: + Identifiers field; // of Identifier *'s + Initializers value; // parallel array of Initializer *'s + +- VarDeclarations vars; // parallel array of VarDeclaration *'s +- AggregateDeclaration *ad; // which aggregate this is for +- + StructInitializer(Loc loc); + Initializer *syntaxCopy(); + void addInit(Identifier *field, Initializer *value); + Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); +- Expression *toExpression(); ++ Expression *toExpression(Type *t = NULL); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + dt_t *toDt(); +@@ -94,8 +106,9 @@ struct StructInitializer : Initializer + StructInitializer *isStructInitializer() { return this; } + }; + +-struct ArrayInitializer : Initializer ++class ArrayInitializer : public Initializer + { ++public: + Expressions index; // indices + Initializers value; // of Initializer *'s + size_t dim; // length of array being initialized +@@ -108,7 +121,7 @@ struct ArrayInitializer : Initializer + Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); + int isAssociativeArray(); + Type *inferType(Scope *sc); +- Expression *toExpression(); ++ Expression *toExpression(Type *t = NULL); + Expression *toAssocArrayLiteral(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +@@ -117,8 +130,9 @@ struct ArrayInitializer : Initializer + ArrayInitializer *isArrayInitializer() { return this; } + }; + +-struct ExpInitializer : Initializer ++class ExpInitializer : public Initializer + { ++public: + Expression *exp; + int expandTuples; + +@@ -126,7 +140,7 @@ struct ExpInitializer : Initializer + Initializer *syntaxCopy(); + Initializer *semantic(Scope *sc, Type *t, NeedInterpret needInterpret); + Type *inferType(Scope *sc); +- Expression *toExpression(); ++ Expression *toExpression(Type *t = NULL); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + dt_t *toDt(); +--- a/src/gcc/d/dfrontend/inline.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/inline.c 2014-04-01 16:32:51.000000000 +0100 +@@ -213,7 +213,7 @@ int VarExp::inlineCost3(InlineCostState + if (tb->ty == Tstruct) + { + StructDeclaration *sd = ((TypeStruct *)tb)->sym; +- if (sd->isnested) ++ if (sd->isNested()) + /* An inner struct will be nested inside another function hierarchy than where + * we're inlining into, so don't inline it. + * At least not until we figure out how to 'move' the struct to be nested +@@ -246,7 +246,7 @@ int StructLiteralExp::inlineCost3(Inline + { + //printf("StructLiteralExp::inlineCost3() %s\n", toChars()); + #if DMDV2 +- if (sd->isnested) ++ if (sd->isNested()) + return COST_MAX; + #endif + return 1; +@@ -280,7 +280,7 @@ int DeclarationExp::inlineCost3(InlineCo + return COST_MAX; // finish DeclarationExp::doInline + #else + for (size_t i = 0; i < td->objects->dim; i++) +- { Object *o = (*td->objects)[i]; ++ { RootObject *o = (*td->objects)[i]; + if (o->dyncast() != DYNCAST_EXPRESSION) + return COST_MAX; + Expression *eo = (Expression *)o; +@@ -577,7 +577,7 @@ Expression *IfStatement::doInline(Inline + Expression *ReturnStatement::doInline(InlineDoState *ids) + { + //printf("ReturnStatement::doInline() '%s'\n", exp ? exp->toChars() : ""); +- return exp ? exp->doInline(ids) : 0; ++ return exp ? exp->doInline(ids) : NULL; + } + + #if DMDV2 +@@ -648,11 +648,69 @@ Expression *VarExp::doInline(InlineDoSta + } + } + if (ids->fd && var == ids->fd->vthis) +- { VarExp *ve = new VarExp(loc, ids->vthis); ++ { ++ VarExp *ve = new VarExp(loc, ids->vthis); + ve->type = type; + return ve; + } + ++ /* Inlining context pointer access for nested referenced variables. ++ * For example: ++ * auto fun() { ++ * int i = 40; ++ * auto foo() { ++ * int g = 2; ++ * struct Result { ++ * auto bar() { return i + g; } ++ * } ++ * return Result(); ++ * } ++ * return foo(); ++ * } ++ * auto t = fun(); ++ * 'i' and 'g' are nested referenced variables in Result.bar(), so: ++ * auto x = t.bar(); ++ * should be inlined to: ++ * auto x = *(t.vthis.vthis + i->voffset) + *(t.vthis + g->voffset) ++ */ ++ VarDeclaration *v = var->isVarDeclaration(); ++ if (v && v->nestedrefs.dim && ids->vthis) ++ { ++ Dsymbol *s = ids->fd; ++ FuncDeclaration *fdv = v->toParent()->isFuncDeclaration(); ++ assert(fdv); ++ Expression *ve = new VarExp(loc, ids->vthis); ++ ve->type = ids->vthis->type; ++ while (s != fdv) ++ { ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (AggregateDeclaration *ad = s->isThis()) ++ { ++ assert(ad->vthis); ++ ve = new DotVarExp(loc, ve, ad->vthis); ++ ve->type = ad->vthis->type; ++ s = ad->toParent2(); ++ } ++ else if (f && f->isNested()) ++ { ++ assert(f->vthis); ++ if (f->hasNestedFrameRefs()) ++ { ++ ve = new DotVarExp(loc, ve, f->vthis); ++ ve->type = f->vthis->type; ++ } ++ s = f->toParent2(); ++ } ++ else ++ assert(0); ++ assert(s); ++ } ++ ve = new DotVarExp(loc, ve, v); ++ ve->type = v->type; ++ //printf("\t==> ve = %s, type = %s\n", ve->toChars(), ve->type->toChars()); ++ return ve; ++ } ++ + return this; + } + +@@ -707,7 +765,7 @@ Expression *DeclarationExp::doInline(Inl + VarDeclaration *vto; + + vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init); +- *vto = *vd; ++ memcpy((void*)vto, (void*)vd, sizeof(VarDeclaration)); + vto->parent = ids->parent; + vto->csym = NULL; + vto->isym = NULL; +@@ -801,7 +859,7 @@ Expression *IndexExp::doInline(InlineDoS + VarDeclaration *vto; + + vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init); +- *vto = *vd; ++ memcpy((void*)vto, (void*)vd, sizeof(VarDeclaration)); + vto->parent = ids->parent; + vto->csym = NULL; + vto->isym = NULL; +@@ -838,7 +896,7 @@ Expression *SliceExp::doInline(InlineDoS + VarDeclaration *vto; + + vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init); +- *vto = *vd; ++ memcpy((void*)vto, (void*)vd, sizeof(VarDeclaration)); + vto->parent = ids->parent; + vto->csym = NULL; + vto->isym = NULL; +@@ -869,6 +927,8 @@ Expression *TupleExp::doInline(InlineDoS + TupleExp *ce; + + ce = (TupleExp *)copy(); ++ if (e0) ++ ce->e0 = e0->doInline(ids); + ce->exps = arrayExpressiondoInline(exps, ids); + return ce; + } +@@ -897,10 +957,12 @@ Expression *AssocArrayLiteralExp::doInli + + Expression *StructLiteralExp::doInline(InlineDoState *ids) + { ++ if(inlinecopy) return inlinecopy; + StructLiteralExp *ce; +- + ce = (StructLiteralExp *)copy(); ++ inlinecopy = ce; + ce->elements = arrayExpressiondoInline(elements, ids); ++ inlinecopy = NULL; + return ce; + } + +@@ -1106,12 +1168,7 @@ Statement *ReturnStatement::inlineScan(I + { + //printf("ReturnStatement::inlineScan()\n"); + if (exp) +- { + exp = exp->inlineScan(iss); +- +- FuncDeclaration *func = iss->fd; +- TypeFunction *tf = (TypeFunction *)(func->type); +- } + return this; + } + +@@ -1203,6 +1260,7 @@ Expression *Expression::inlineScan(Inlin + + void scanVar(Dsymbol *s, InlineScanState *iss) + { ++ //printf("scanVar(%s %s)\n", s->kind(), s->toPrettyChars()); + VarDeclaration *vd = s->isVarDeclaration(); + if (vd) + { +@@ -1254,6 +1312,10 @@ void scanVar(Dsymbol *s, InlineScanState + } + } + } ++ else ++ { ++ s->inlineScan(); ++ } + } + + Expression *DeclarationExp::inlineScan(InlineScanState *iss) +@@ -1342,6 +1404,8 @@ Expression *TupleExp::inlineScan(InlineS + { Expression *e = this; + + //printf("TupleExp::inlineScan()\n"); ++ if (e0) ++ e0->inlineScan(iss); + arrayInlineScan(iss, exps); + + return e; +@@ -1373,8 +1437,11 @@ Expression *StructLiteralExp::inlineScan + { Expression *e = this; + + //printf("StructLiteralExp::inlineScan()\n"); ++ if(stageflags & stageInlineScan) return e; ++ int old = stageflags; ++ stageflags |= stageInlineScan; + arrayInlineScan(iss, elements); +- ++ stageflags = old; + return e; + } + +@@ -1406,7 +1473,7 @@ void FuncDeclaration::inlineScan() + InlineScanState iss; + + #if LOG +- printf("FuncDeclaration::inlineScan('%s')\n", toChars()); ++ printf("FuncDeclaration::inlineScan('%s')\n", toPrettyChars()); + #endif + memset(&iss, 0, sizeof(iss)); + iss.fd = this; +@@ -1426,7 +1493,7 @@ int FuncDeclaration::canInline(int hasth + #define CANINLINE_LOG 0 + + #if CANINLINE_LOG +- printf("FuncDeclaration::canInline(hasthis = %d, statementsToo = %d, '%s')\n", hasthis, statementsToo, toChars()); ++ printf("FuncDeclaration::canInline(hasthis = %d, statementsToo = %d, '%s')\n", hasthis, statementsToo, toPrettyChars()); + #endif + + if (needThis() && !hasthis) +@@ -1465,7 +1532,7 @@ int FuncDeclaration::canInline(int hasth + + if (type) + { assert(type->ty == Tfunction); +- TypeFunction *tf = (TypeFunction *)(type); ++ TypeFunction *tf = (TypeFunction *)type; + if (tf->varargs == 1) // no variadic parameter lists + goto Lno; + +@@ -1496,7 +1563,7 @@ int FuncDeclaration::canInline(int hasth + isSynchronized() || + isImportedSymbol() || + hasNestedFrameRefs() || // no nested references to this frame +- (isVirtual() && !isFinal()) ++ (isVirtual() && !isFinalFunc()) + )) + { + goto Lno; +@@ -1637,7 +1704,7 @@ Expression *FuncDeclaration::expandInlin + // Set up parameters + if (ethis) + { +- e = new DeclarationExp(0, ids.vthis); ++ e = new DeclarationExp(Loc(), ids.vthis); + e->type = Type::tvoid; + if (as) + as->push(new ExpStatement(e->loc, e)); +@@ -1677,11 +1744,11 @@ Expression *FuncDeclaration::expandInlin + ids.from.push(vfrom); + ids.to.push(vto); + +- de = new DeclarationExp(0, vto); ++ de = new DeclarationExp(Loc(), vto); + de->type = Type::tvoid; + + if (as) +- as->push(new ExpStatement(0, de)); ++ as->push(new ExpStatement(Loc(), de)); + else + e = Expression::combine(e, de); + } +@@ -1692,7 +1759,7 @@ Expression *FuncDeclaration::expandInlin + inlineNest++; + Statement *s = fbody->doInlineStatement(&ids); + as->push(s); +- *ps = new ScopeStatement(0, new CompoundStatement(0, as)); ++ *ps = new ScopeStatement(Loc(), new CompoundStatement(Loc(), as)); + inlineNest--; + } + else +@@ -1705,6 +1772,7 @@ Expression *FuncDeclaration::expandInlin + //eb->print(); + //eb->dump(0); + } ++ //printf("%s->expandInline = { %s }\n", toChars(), e->toChars()); + + /* There's a problem if what the function returns is used subsequently as an + * lvalue, as in a struct return that is then used as a 'this'. +@@ -1736,7 +1804,7 @@ Expression *FuncDeclaration::expandInlin + ei->exp = new ConstructExp(loc, ve, e); + ei->exp->type = ve->type; + +- DeclarationExp* de = new DeclarationExp(0, vd); ++ DeclarationExp* de = new DeclarationExp(Loc(), vd); + de->type = Type::tvoid; + + // Chain the two together: +--- a/src/gcc/d/dfrontend/interpret.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/interpret.c 2014-04-01 16:32:51.000000000 +0100 +@@ -37,6 +37,7 @@ + + #define LOG 0 + #define LOGASSIGN 0 ++#define LOGCOMPILE 0 + #define SHOWPERFORMANCE 0 + + // Maximum allowable recursive function calls in CTFE +@@ -57,28 +58,36 @@ private: + the stack might not be empty when CTFE begins. + + Ctfe Stack addresses are just 0-based integers, but we save +- them as 'void *' because ArrayBase can only do pointers. ++ them as 'void *' because Array can only do pointers. + */ + Expressions values; // values on the stack + VarDeclarations vars; // corresponding variables +- ArrayBase savedId; // id of the previous state of that var ++ Array savedId; // id of the previous state of that var ++ ++ Array frames; // all previous frame pointers ++ Expressions savedThis; // all previous values of localThis + + /* Global constants get saved here after evaluation, so we never + * have to redo them. This saves a lot of time and memory. + */ + Expressions globalValues; // values of global constants +- size_t framepointer; // current frame pointer +- size_t maxStackPointer; // most stack we've ever used ++ ++ size_t framepointer; // current frame pointer ++ size_t maxStackPointer; // most stack we've ever used ++ Expression *localThis; // value of 'this', or NULL if none + public: + CtfeStack(); + + size_t stackPointer(); + ++ // The current value of 'this', or NULL if none ++ Expression *getThis(); ++ + // Largest number of stack positions we've used + size_t maxStackUsage(); +- // return the previous frame +- size_t startFrame(); +- void endFrame(size_t oldframe); ++ // Start a new stack frame, using the provided 'this'. ++ void startFrame(Expression *thisexp); ++ void endFrame(); + bool isInCurrentFrame(VarDeclaration *v); + Expression *getValue(VarDeclaration *v); + void setValue(VarDeclaration *v, Expression *e); +@@ -92,13 +101,11 @@ struct InterState + { + InterState *caller; // calling function's InterState + FuncDeclaration *fd; // function being interpreted +- size_t framepointer; // frame pointer of previous frame + Statement *start; // if !=NULL, start execution at this statement + Statement *gotoTarget; /* target of EXP_GOTO_INTERPRET result; also + * target of labelled EXP_BREAK_INTERPRET or + * EXP_CONTINUE_INTERPRET. (NULL if no label). + */ +- Expression *localThis; // value of 'this', or NULL if none + bool awaitingLvalueReturn; // Support for ref return values: + // Any return to this function should return an lvalue. + InterState(); +@@ -117,24 +124,34 @@ size_t CtfeStack::stackPointer() + return values.dim; + } + ++Expression *CtfeStack::getThis() ++{ ++ return localThis; ++} ++ + // Largest number of stack positions we've used + size_t CtfeStack::maxStackUsage() + { + return maxStackPointer; + } + +-// return the previous frame +-size_t CtfeStack::startFrame() ++void CtfeStack::startFrame(Expression *thisexp) + { + size_t oldframe = framepointer; ++ frames.push((void *)(size_t)(framepointer)); ++ savedThis.push(localThis); + framepointer = stackPointer(); +- return oldframe; ++ localThis = thisexp; + } + +-void CtfeStack::endFrame(size_t oldframe) ++void CtfeStack::endFrame() + { ++ size_t oldframe = (size_t)(frames[frames.dim-1]); ++ localThis = savedThis[savedThis.dim-1]; + popAll(framepointer); + framepointer = oldframe; ++ frames.setDim(frames.dim - 1); ++ savedThis.setDim(savedThis.dim -1); + } + + bool CtfeStack::isInCurrentFrame(VarDeclaration *v) +@@ -244,13 +261,438 @@ void printCtfePerformanceStats() + } + + +-Expression * resolveReferences(Expression *e, Expression *thisval); ++Expression * resolveReferences(Expression *e); + Expression *getVarExp(Loc loc, InterState *istate, Declaration *d, CtfeGoal goal); +-VarDeclaration *findParentVar(Expression *e, Expression *thisval); ++VarDeclaration *findParentVar(Expression *e); + Expression *evaluateIfBuiltin(InterState *istate, Loc loc, + FuncDeclaration *fd, Expressions *arguments, Expression *pthis); + Expression *scrubReturnValue(Loc loc, Expression *e); + ++ ++ ++/************************************* ++ * CTFE-object code for a single function ++ * ++ * Currently only counts the number of local variables in the function ++ */ ++struct CompiledCtfeFunction ++{ ++ FuncDeclaration *func; // Function being compiled, NULL if global scope ++ int numVars; // Number of variables declared in this function ++ Loc callingloc; ++ ++ CompiledCtfeFunction(FuncDeclaration *f) ++ { ++ func = f; ++ numVars = 0; ++ } ++ ++ void onDeclaration(VarDeclaration *v) ++ { ++ //printf("%s CTFE declare %s\n", v->loc.toChars(), v->toChars()); ++ ++numVars; ++ } ++ static int walkAllVars(Expression *e, void *_this); ++ void onExpression(Expression *e) ++ { ++ e->apply(&walkAllVars, this); ++ } ++}; ++ ++int CompiledCtfeFunction::walkAllVars(Expression *e, void *_this) ++{ ++ CompiledCtfeFunction *ccf = (CompiledCtfeFunction *)_this; ++ if (e->op == TOKerror) ++ { ++ // Currently there's a front-end bug: silent errors ++ // can occur inside delegate literals inside is(typeof()). ++ // Suppress the check in this case. ++ if (global.gag && ccf->func) ++ return 1; ++ ++ e->error("CTFE internal error: ErrorExp in %s\n", ccf->func ? ccf->func->loc.toChars() : ccf->callingloc.toChars()); ++ assert(0); ++ } ++ if (e->op == TOKdeclaration) ++ { ++ DeclarationExp *decl = (DeclarationExp *)e; ++ VarDeclaration *v = decl->declaration->isVarDeclaration(); ++ if (!v) ++ return 0; ++ TupleDeclaration *td = v->toAlias()->isTupleDeclaration(); ++ if (td) ++ { ++ if (!td->objects) ++ return 0; ++ for(size_t i= 0; i < td->objects->dim; ++i) ++ { ++ RootObject *o = td->objects->tdata()[i]; ++ Expression *ex = isExpression(o); ++ DsymbolExp *s = (ex && ex->op == TOKdsymbol) ? (DsymbolExp *)ex : NULL; ++ assert(s); ++ VarDeclaration *v2 = s->s->isVarDeclaration(); ++ assert(v2); ++ if (!v2->isDataseg() || v2->isCTFE()) ++ ccf->onDeclaration(v2); ++ } ++ } ++ else if (!(v->isDataseg() || v->storage_class & STCmanifest) || v->isCTFE()) ++ ccf->onDeclaration(v); ++ Dsymbol *s = v->toAlias(); ++ if (s == v && !v->isStatic() && v->init) ++ { ++ ExpInitializer *ie = v->init->isExpInitializer(); ++ if (ie) ++ ccf->onExpression(ie->exp); ++ } ++ } ++ else if (e->op == TOKindex && ((IndexExp *)e)->lengthVar) ++ ccf->onDeclaration( ((IndexExp *)e)->lengthVar); ++ else if (e->op == TOKslice && ((SliceExp *)e)->lengthVar) ++ ccf->onDeclaration( ((SliceExp *)e)->lengthVar); ++ return 0; ++} ++ ++void Statement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s Statement::ctfeCompile %s\n", loc.toChars(), toChars()); ++#endif ++ assert(0); ++} ++ ++void ExpStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ExpStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (exp) ++ ccf->onExpression(exp); ++} ++ ++void CompoundStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s CompoundStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ for (size_t i = 0; i < statements->dim; i++) ++ { Statement *s = (*statements)[i]; ++ if (s) ++ s->ctfeCompile(ccf); ++ } ++} ++ ++void UnrolledLoopStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s UnrolledLoopStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ for (size_t i = 0; i < statements->dim; i++) ++ { Statement *s = (*statements)[i]; ++ if (s) ++ s->ctfeCompile(ccf); ++ } ++} ++ ++void IfStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s IfStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ ++ ccf->onExpression(condition); ++ if (ifbody) ++ ifbody->ctfeCompile(ccf); ++ if (elsebody) ++ elsebody->ctfeCompile(ccf); ++} ++ ++void ScopeStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ScopeStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (statement) ++ statement->ctfeCompile(ccf); ++} ++ ++void OnScopeStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s OnScopeStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // rewritten to try/catch/finally ++ assert(0); ++} ++ ++void DoStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s DoStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ ccf->onExpression(condition); ++ if (body) ++ body->ctfeCompile(ccf); ++} ++ ++void WhileStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s WhileStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // rewritten to ForStatement ++ assert(0); ++} ++ ++void ForStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ForStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ ++ if (init) ++ init->ctfeCompile(ccf); ++ if (condition) ++ ccf->onExpression(condition); ++ if (increment) ++ ccf->onExpression(increment); ++ if (body) ++ body->ctfeCompile(ccf); ++} ++ ++void ForeachStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ForeachStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // rewritten for ForStatement ++ assert(0); ++} ++ ++ ++void SwitchStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s SwitchStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ ccf->onExpression(condition); ++ // Note that the body contains the the Case and Default ++ // statements, so we only need to compile the expressions ++ for (size_t i = 0; i < cases->dim; i++) ++ { ++ ccf->onExpression((*cases)[i]->exp); ++ } ++ if (body) ++ body->ctfeCompile(ccf); ++} ++ ++void CaseStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s CaseStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (statement) ++ statement->ctfeCompile(ccf); ++} ++ ++void DefaultStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s DefaultStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (statement) ++ statement->ctfeCompile(ccf); ++} ++ ++void GotoDefaultStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s GotoDefaultStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void GotoCaseStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s GotoCaseStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void SwitchErrorStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s SwitchErrorStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void ReturnStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ReturnStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (exp) ++ ccf->onExpression(exp); ++} ++ ++void BreakStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s BreakStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void ContinueStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ContinueStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void WithStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s WithStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // If it is with(Enum) {...}, just execute the body. ++ if (exp->op == TOKimport || exp->op == TOKtype) ++ {} ++ else ++ { ++ ccf->onDeclaration(wthis); ++ ccf->onExpression(exp); ++ } ++ if (body) ++ body->ctfeCompile(ccf); ++} ++ ++void TryCatchStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s TryCatchStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (body) ++ body->ctfeCompile(ccf); ++ for (size_t i = 0; i < catches->dim; i++) ++ { ++#if DMDV1 ++ Catch *ca = (Catch *)catches->data[i]; ++#else ++ Catch *ca = catches->tdata()[i]; ++#endif ++ if (ca->var) ++ ccf->onDeclaration(ca->var); ++ if (ca->handler) ++ ca->handler->ctfeCompile(ccf); ++ } ++} ++ ++void TryFinallyStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s TryFinallyStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (body) ++ body->ctfeCompile(ccf); ++ if (finalbody) ++ finalbody->ctfeCompile(ccf); ++} ++ ++void ThrowStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ThrowStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ ccf->onExpression(exp); ++} ++ ++void GotoStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s GotoStatement::ctfeCompile\n", loc.toChars()); ++#endif ++} ++ ++void LabelStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s LabelStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ if (statement) ++ statement->ctfeCompile(ccf); ++} ++ ++#if DMDV2 ++void ImportStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ImportStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // Contains no variables or executable code ++} ++ ++void ForeachRangeStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s ForeachRangeStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // rewritten for ForStatement ++ assert(0); ++} ++ ++#endif ++ ++void AsmStatement::ctfeCompile(CompiledCtfeFunction *ccf) ++{ ++#if LOGCOMPILE ++ printf("%s AsmStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // we can't compile asm statements ++} ++ ++#ifdef IN_GCC ++// CTFE compile extended asm statement. ++ ++void ++ExtAsmStatement::ctfeCompile (CompiledCtfeFunction *) ++{ ++#if LOGCOMPILE ++ printf("%s ExtAsmStatement::ctfeCompile\n", loc.toChars()); ++#endif ++ // We can't compile extended asm statements. ++} ++#endif ++ ++/************************************* ++ * Compile this function for CTFE. ++ * At present, this merely allocates variables. ++ */ ++void FuncDeclaration::ctfeCompile() ++{ ++#if LOGCOMPILE ++ printf("\n%s FuncDeclaration::ctfeCompile %s\n", loc.toChars(), toChars()); ++#endif ++ assert(!ctfeCode); ++ assert(!semantic3Errors); ++ assert(semanticRun == PASSsemantic3done); ++ ++ ctfeCode = new CompiledCtfeFunction(this); ++ if (parameters) ++ { ++ Type *tb = type->toBasetype(); ++ assert(tb->ty == Tfunction); ++ TypeFunction *tf = (TypeFunction *)tb; ++ for (size_t i = 0; i < parameters->dim; i++) ++ { ++ Parameter *arg = Parameter::getNth(tf->parameters, i); ++ VarDeclaration *v = (*parameters)[i]; ++ ctfeCode->onDeclaration(v); ++ } ++ } ++ if (vresult) ++ ctfeCode->onDeclaration(vresult); ++ fbody->ctfeCompile(ctfeCode); ++} ++ + /************************************* + * + * Entry point for CTFE. +@@ -258,9 +700,75 @@ Expression *scrubReturnValue(Loc loc, Ex + */ + Expression *Expression::ctfeInterpret() + { +- return optimize(WANTvalue | WANTinterpret); ++ if (type == Type::terror) ++ return this; ++ ++ // This code is outside a function, but still needs to be compiled ++ // (there are compiler-generated temporary variables such as __dollar). ++ // However, this will only be run once and can then be discarded. ++ CompiledCtfeFunction ctfeCodeGlobal(NULL); ++ ctfeCodeGlobal.callingloc = loc; ++ ctfeCodeGlobal.onExpression(this); ++ ++ Expression *e = interpret(NULL); ++ if (e != EXP_CANT_INTERPRET) ++ e = scrubReturnValue(loc, e); ++ if (e == EXP_CANT_INTERPRET) ++ e = new ErrorExp(); ++ return e; ++} ++ ++/* Run CTFE on the expression, but allow the expression to be a TypeExp ++ * or a tuple containing a TypeExp. (This is required by pragma(msg)). ++ */ ++Expression *ctfeInterpretForPragmaMsg(Expression *e) ++{ ++ if (e->op == TOKerror || e->op == TOKtype) ++ return e; ++ ++ // It's also OK for it to be a function declaration (happens only with ++ // __traits(getOverloads)) ++ if (e->op == TOKvar && ((VarExp *)e)->var->isFuncDeclaration()) ++ { ++ return e; ++ } ++ ++ if (e->op != TOKtuple) ++ return e->ctfeInterpret(); ++ ++ // Tuples need to be treated seperately, since they are ++ // allowed to contain a TypeExp in this case. ++ ++ TupleExp *tup = (TupleExp *)e; ++ Expressions *expsx = NULL; ++ for (size_t i = 0; i < tup->exps->dim; ++i) ++ { ++ Expression *g = (*tup->exps)[i]; ++ Expression *h = g; ++ h = ctfeInterpretForPragmaMsg(g); ++ if (h != g) ++ { ++ if (!expsx) ++ { ++ expsx = new Expressions(); ++ expsx->setDim(tup->exps->dim); ++ for (size_t j = 0; j < tup->exps->dim; j++) ++ (*expsx)[j] = (*tup->exps)[j]; ++ } ++ (*expsx)[i] = h; ++ } ++ } ++ if (expsx) ++ { ++ TupleExp *te = new TupleExp(e->loc, expsx); ++ expandTuples(te->exps); ++ te->type = new TypeTuple(te->exps); ++ return te; ++ } ++ return e; + } + ++ + /************************************* + * Attempt to interpret a function given the arguments. + * Input: +@@ -287,10 +795,13 @@ Expression *FuncDeclaration::interpret(I + if (semanticRun < PASSsemantic3done) + return EXP_CANT_INTERPRET; + ++ // CTFE-compile the function ++ if (!ctfeCode) ++ ctfeCompile(); ++ + Type *tb = type->toBasetype(); + assert(tb->ty == Tfunction); + TypeFunction *tf = (TypeFunction *)tb; +- Type *tret = tf->next->toBasetype(); + if (tf->varargs && arguments && + ((parameters && arguments->dim != parameters->dim) || (!parameters && arguments->dim))) + { +@@ -303,15 +814,8 @@ Expression *FuncDeclaration::interpret(I + // Func literals report isNested() even if they are in global scope, + // so we need to check that the parent is a function. + if (isNested() && toParent2()->isFuncDeclaration() && !thisarg && istate) +- thisarg = istate->localThis; ++ thisarg = ctfeStack.getThis(); + +- InterState istatex; +- istatex.caller = istate; +- istatex.fd = this; +- istatex.localThis = thisarg; +- istatex.framepointer = ctfeStack.startFrame(); +- +- Expressions vsave; // place to save previous parameter values + size_t dim = 0; + if (needThis() && !thisarg) + { // error, no this. Prevent segfault. +@@ -324,16 +828,19 @@ Expression *FuncDeclaration::interpret(I + return EXP_CANT_INTERPRET; + } + static int evaluatingArgs = 0; ++ ++ // Place to hold all the arguments to the function while ++ // we are evaluating them. ++ Expressions eargs; ++ + if (arguments) + { + dim = arguments->dim; + assert(!dim || (parameters && (parameters->dim == dim))); +- vsave.setDim(dim); + + /* Evaluate all the arguments to the function, + * store the results in eargs[] + */ +- Expressions eargs; + eargs.setDim(dim); + for (size_t i = 0; i < dim; i++) + { Expression *earg = (*arguments)[i]; +@@ -391,6 +898,18 @@ Expression *FuncDeclaration::interpret(I + } + eargs[i] = earg; + } ++ } ++ ++ // Now that we've evaluated all the arguments, we can start the frame ++ // (this is the moment when the 'call' actually takes place). ++ ++ InterState istatex; ++ istatex.caller = istate; ++ istatex.fd = this; ++ ctfeStack.startFrame(thisarg); ++ ++ if (arguments) ++ { + + for (size_t i = 0; i < dim; i++) + { Expression *earg = eargs[i]; +@@ -475,7 +994,7 @@ Expression *FuncDeclaration::interpret(I + // Leave the function + --CtfeStatus::callDepth; + +- ctfeStack.endFrame(istatex.framepointer); ++ ctfeStack.endFrame(); + + // If fell off the end of a void function, return void + if (!e && type->toBasetype()->nextOf()->ty == Tvoid) +@@ -494,12 +1013,6 @@ Expression *FuncDeclaration::interpret(I + return EXP_CANT_INTERPRET; + } + +- // If we're about to leave CTFE, make sure we don't crash the +- // compiler by returning a CTFE-internal expression. +- if (!istate && !evaluatingArgs) +- { +- e = scrubReturnValue(loc, e); +- } + return e; + } + +@@ -682,8 +1195,11 @@ bool stopPointersEscaping(Loc loc, Expre + return true; + if ( isPointer(e->type) ) + { +- if (e->op == TOKvar && ((VarExp *)e)->var->isVarDeclaration() && +- ctfeStack.isInCurrentFrame( ((VarExp *)e)->var->isVarDeclaration() ) ) ++ Expression *x = e; ++ if (e->op == TOKaddress) ++ x = ((AddrExp *)e)->e1; ++ if (x->op == TOKvar && ((VarExp *)x)->var->isVarDeclaration() && ++ ctfeStack.isInCurrentFrame( ((VarExp *)x)->var->isVarDeclaration() ) ) + { error(loc, "returning a pointer to a local stack variable"); + return false; + } +@@ -714,7 +1230,7 @@ bool stopPointersEscapingFromArray(Loc l + { + for (size_t i = 0; i < elems->dim; i++) + { +- Expression *m = elems->tdata()[i]; ++ Expression *m = (*elems)[i]; + if (!m) + continue; + if (m) +@@ -735,8 +1251,16 @@ Expression *scrubReturnValue(Loc loc, Ex + { + if (e->op == TOKclassreference) + { +- error(loc, "%s class literals cannot be returned from CTFE", ((ClassReferenceExp*)e)->originalClass()->toChars()); +- return EXP_CANT_INTERPRET; ++ StructLiteralExp *se = ((ClassReferenceExp*)e)->value; ++ se->ownedByCtfe = false; ++ if (!(se->stageflags & stageScrub)) ++ { ++ int old = se->stageflags; ++ se->stageflags |= stageScrub; ++ if (!scrubArray(loc, se->elements, true)) ++ return EXP_CANT_INTERPRET; ++ se->stageflags = old; ++ } + } + if (e->op == TOKvoid) + { +@@ -751,8 +1275,14 @@ Expression *scrubReturnValue(Loc loc, Ex + { + StructLiteralExp *se = (StructLiteralExp *)e; + se->ownedByCtfe = false; +- if (!scrubArray(loc, se->elements, true)) +- return EXP_CANT_INTERPRET; ++ if (!(se->stageflags & stageScrub)) ++ { ++ int old = se->stageflags; ++ se->stageflags |= stageScrub; ++ if (!scrubArray(loc, se->elements, true)) ++ return EXP_CANT_INTERPRET; ++ se->stageflags = old; ++ } + } + if (e->op == TOKstring) + { +@@ -776,21 +1306,56 @@ Expression *scrubReturnValue(Loc loc, Ex + return e; + } + ++// Return true if every element is either void, ++// or is an array literal or struct literal of void elements. ++bool isEntirelyVoid(Expressions *elems) ++{ ++ for (size_t i = 0; i < elems->dim; i++) ++ { ++ Expression *m = (*elems)[i]; ++ // It can be NULL for performance reasons, ++ // see StructLiteralExp::interpret(). ++ if (!m) ++ continue; ++ ++ if (!(m->op == TOKvoid) && ++ !(m->op == TOKarrayliteral && isEntirelyVoid(((ArrayLiteralExp *)m)->elements)) && ++ !(m->op == TOKstructliteral && isEntirelyVoid(((StructLiteralExp *)m)->elements))) ++ { ++ return false; ++ } ++ } ++ return true; ++} ++ + // Scrub all members of an array. Return false if error + bool scrubArray(Loc loc, Expressions *elems, bool structlit) + { + for (size_t i = 0; i < elems->dim; i++) + { +- Expression *m = elems->tdata()[i]; ++ Expression *m = (*elems)[i]; ++ // It can be NULL for performance reasons, ++ // see StructLiteralExp::interpret(). + if (!m) + continue; +- if (m && m->op == TOKvoid && structlit) +- m = NULL; +- if (m) ++ ++ // A struct .init may contain void members. ++ // Static array members are a weird special case (bug 10994). ++ if (structlit && ++ ((m->op == TOKvoid) || ++ (m->op == TOKarrayliteral && m->type->ty == Tsarray && isEntirelyVoid(((ArrayLiteralExp *)m)->elements)) || ++ (m->op == TOKstructliteral && isEntirelyVoid(((StructLiteralExp *)m)->elements))) ++ ) ++ { ++ m = NULL; ++ } ++ else ++ { + m = scrubReturnValue(loc, m); +- if (m == EXP_CANT_INTERPRET) +- return false; +- elems->tdata()[i] = m; ++ if (m == EXP_CANT_INTERPRET) ++ return false; ++ } ++ (*elems)[i] = m; + } + return true; + } +@@ -835,21 +1400,19 @@ Expression *ReturnStatement::interpret(I + { e = exp->interpret(istate, ctfeNeedLvalue); + if (exceptionOrCantInterpret(e)) + return e; +- // Disallow returning pointers to stack-allocated variables (bug 7876) +- if (e->op == TOKvar && ((VarExp *)e)->var->isVarDeclaration() && +- ctfeStack.isInCurrentFrame( ((VarExp *)e)->var->isVarDeclaration() ) ) +- { error("returning a pointer to a local stack variable"); +- return EXP_CANT_INTERPRET; +- } + } + else + { + e = exp->interpret(istate); + if (exceptionOrCantInterpret(e)) + return e; +- if (!stopPointersEscaping(loc, e)) +- return EXP_CANT_INTERPRET; + } ++ ++ // Disallow returning pointers to stack-allocated variables (bug 7876) ++ ++ if (!stopPointersEscaping(loc, e)) ++ return EXP_CANT_INTERPRET; ++ + if (needToCopyLiteral(e)) + e = copyLiteral(e); + #if LOGASSIGN +@@ -866,13 +1429,19 @@ Expression *BreakStatement::interpret(In + #endif + START() + if (ident) +- { LabelDsymbol *label = istate->fd->searchLabel(ident); ++ { ++ LabelDsymbol *label = istate->fd->searchLabel(ident); + assert(label && label->statement); +- Statement *s = label->statement; +- if (s->isLabelStatement()) +- s = s->isLabelStatement()->statement; +- if (s->isScopeStatement()) +- s = s->isScopeStatement()->statement; ++ LabelStatement *ls = label->statement; ++ Statement *s; ++ if (ls->gotoTarget) ++ s = ls->gotoTarget; ++ else ++ { ++ s = ls->statement; ++ if (s->isScopeStatement()) ++ s = s->isScopeStatement()->statement; ++ } + istate->gotoTarget = s; + return EXP_BREAK_INTERPRET; + } +@@ -890,13 +1459,19 @@ Expression *ContinueStatement::interpret + #endif + START() + if (ident) +- { LabelDsymbol *label = istate->fd->searchLabel(ident); ++ { ++ LabelDsymbol *label = istate->fd->searchLabel(ident); + assert(label && label->statement); +- Statement *s = label->statement; +- if (s->isLabelStatement()) +- s = s->isLabelStatement()->statement; +- if (s->isScopeStatement()) +- s = s->isScopeStatement()->statement; ++ LabelStatement *ls = label->statement; ++ Statement *s; ++ if (ls->gotoTarget) ++ s = ls->gotoTarget; ++ else ++ { ++ s = ls->statement; ++ if (s->isScopeStatement()) ++ s = s->isScopeStatement()->statement; ++ } + istate->gotoTarget = s; + return EXP_CONTINUE_INTERPRET; + } +@@ -944,7 +1519,6 @@ Expression *DoStatement::interpret(Inter + if (istate->gotoTarget && istate->gotoTarget != this) + break; // continue at a higher level + +- Lcontinue: + istate->gotoTarget = NULL; + e = condition->interpret(istate); + if (exceptionOrCantInterpret(e)) +@@ -1206,7 +1780,7 @@ Expression *TryCatchStatement::interpret + #if DMDV1 + Catch *ca = (Catch *)catches->data[i]; + #else +- Catch *ca = catches->tdata()[i]; ++ Catch *ca = (*catches)[i]; + #endif + Type *catype = ca->type; + +@@ -1236,20 +1810,20 @@ ThrownExceptionExp *chainExceptions(Thro + #if DMDV2 + // Little sanity check to make sure it's really a Throwable + ClassReferenceExp *boss = oldest->thrown; +- assert(boss->value->elements->tdata()[4]->type->ty == Tclass); ++ assert((*boss->value->elements)[4]->type->ty == Tclass); + ClassReferenceExp *collateral = newest->thrown; + if (isAnErrorException(collateral->originalClass()) + && !isAnErrorException(boss->originalClass())) + { // The new exception bypass the existing chain +- assert(collateral->value->elements->tdata()[5]->type->ty == Tclass); +- collateral->value->elements->tdata()[5] = boss; ++ assert((*collateral->value->elements)[5]->type->ty == Tclass); ++ (*collateral->value->elements)[5] = boss; + return newest; + } +- while (boss->value->elements->tdata()[4]->op == TOKclassreference) ++ while ((*boss->value->elements)[4]->op == TOKclassreference) + { +- boss = (ClassReferenceExp *)(boss->value->elements->tdata()[4]); ++ boss = (ClassReferenceExp *)(*boss->value->elements)[4]; + } +- boss->value->elements->tdata()[4] = collateral; ++ (*boss->value->elements)[4] = collateral; + return oldest; + #else + // for D1, the newest exception just clobbers the older one +@@ -1335,6 +1909,18 @@ Expression *AsmStatement::interpret(Inte + return EXP_CANT_INTERPRET; + } + ++#ifdef IN_GCC ++Expression *ExtAsmStatement::interpret(InterState *istate) ++{ ++#if LOG ++ printf("%s ExtAsmStatement::interpret()\n", loc.toChars()); ++#endif ++ START() ++ error("extended asm statements cannot be interpreted at compile time"); ++ return EXP_CANT_INTERPRET; ++} ++#endif ++ + #if DMDV2 + Expression *ImportStatement::interpret(InterState *istate) + { +@@ -1361,12 +1947,11 @@ Expression *Expression::interpret(InterS + + Expression *ThisExp::interpret(InterState *istate, CtfeGoal goal) + { +- while (istate && !istate->localThis) +- istate = istate->caller; +- if (istate && istate->localThis && istate->localThis->op == TOKstructliteral) +- return istate->localThis; +- if (istate && istate->localThis) +- return istate->localThis->interpret(istate, goal); ++ Expression *localThis = ctfeStack.getThis(); ++ if (localThis && localThis->op == TOKstructliteral) ++ return localThis; ++ if (localThis) ++ return localThis->interpret(istate, goal); + error("value of 'this' is not known at compile time"); + return EXP_CANT_INTERPRET; + } +@@ -1407,11 +1992,11 @@ Expression *StringExp::interpret(InterSt + * In D2, we also disallow casts of read-only literals to mutable, + * though it isn't strictly necessary. + */ +-#if DMDV2 ++#if 0 //DMDV2 + // Fixed-length char arrays always get duped later anyway. + if (type->ty == Tsarray) + return this; +- if (!(((TypeNext *)type)->next->mod & (MODconst | MODimmutable))) ++ if (!(((TypeNext *)type)->next->toBasetype()->mod & (MODconst | MODimmutable))) + { // It seems this happens only when there has been an explicit cast + error("cannot cast a read-only string literal to mutable in CTFE"); + return EXP_CANT_INTERPRET; +@@ -1437,12 +2022,35 @@ Expression *SymOffExp::interpret(InterSt + { + return this; + } ++ if (isTypeInfo_Class(type) && offset == 0) ++ { ++ return this; ++ } + if (type->ty != Tpointer) + { // Probably impossible + error("Cannot interpret %s at compile time", toChars()); + return EXP_CANT_INTERPRET; + } +- Type *pointee = ((TypePointer *)type)->next; ++ Type *pointee = ((TypePointer *)type)->next; ++ if ( var->isThreadlocal()) ++ { ++ error("cannot take address of thread-local variable %s at compile time", var->toChars()); ++ return EXP_CANT_INTERPRET; ++ } ++ // Check for taking an address of a shared variable. ++ // If the shared variable is an array, the offset might not be zero. ++ Type *fromType = NULL; ++ if (var->type->ty == Tarray || var->type->ty == Tsarray) ++ { ++ fromType = ((TypeArray *)(var->type))->next; ++ } ++ if ( var->isDataseg() && ( ++ (offset == 0 && isSafePointerCast(var->type, pointee)) || ++ (fromType && isSafePointerCast(fromType, pointee)) ++ )) ++ { ++ return this; ++ } + Expression *val = getVarExp(loc, istate, var, goal); + if (val == EXP_CANT_INTERPRET) + return val; +@@ -1472,7 +2080,6 @@ Expression *SymOffExp::interpret(InterSt + return EXP_CANT_INTERPRET; + } + +- TypeArray *tar = (TypeArray *)val->type; + dinteger_t sz = pointee->size(); + dinteger_t indx = offset/sz; + assert(sz * indx == offset); +@@ -1495,9 +2102,12 @@ Expression *SymOffExp::interpret(InterSt + } + else if ( offset == 0 && isSafePointerCast(var->type, pointee) ) + { ++ // Create a CTFE pointer &var + VarExp *ve = new VarExp(loc, var); +- ve->type = type; +- return ve; ++ ve->type = var->type; ++ AddrExp *re = new AddrExp(loc, ve); ++ re->type = type; ++ return re; + } + + error("Cannot convert &%s to %s at compile time", var->type->toChars(), type->toChars()); +@@ -1509,6 +2119,13 @@ Expression *AddrExp::interpret(InterStat + #if LOG + printf("%s AddrExp::interpret() %s\n", loc.toChars(), toChars()); + #endif ++ if (e1->op == TOKvar && ((VarExp *)e1)->var->isDataseg()) ++ { // Normally this is already done by optimize() ++ // Do it here in case optimize(0) wasn't run before CTFE ++ SymOffExp *se = new SymOffExp(loc, ((VarExp *)e1)->var, 0); ++ se->type = type; ++ return se; ++ } + // For reference types, we need to return an lvalue ref. + TY tb = e1->type->toBasetype()->ty; + bool needRef = (tb == Tarray || tb == Taarray || tb == Tclass); +@@ -1526,7 +2143,27 @@ Expression *DelegateExp::interpret(Inter + #if LOG + printf("%s DelegateExp::interpret() %s\n", loc.toChars(), toChars()); + #endif +- return this; ++ // TODO: Really we should create a CTFE-only delegate expression ++ // of a pointer and a funcptr. ++ ++ // If it is &nestedfunc, just return it ++ // TODO: We should save the context pointer ++ if (e1->op == TOKvar && ((VarExp *)e1)->var->isFuncDeclaration()) ++ return this; ++ ++ // If it has already been CTFE'd, just return it ++ if (e1->op == TOKstructliteral || e1->op == TOKclassreference) ++ return this; ++ ++ // Else change it into &structliteral.func or &classref.func ++ Expression *e = e1->interpret(istate, ctfeNeedLvalue); ++ ++ if (exceptionOrCantInterpret(e)) ++ return e; ++ ++ e = new DelegateExp(loc, e, func); ++ e->type = type; ++ return e; + } + + +@@ -1535,12 +2172,13 @@ Expression *DelegateExp::interpret(Inter + // ------------------------------------------------------------- + // The variable used in a dotvar, index, or slice expression, + // after 'out', 'ref', and 'this' have been removed. +-Expression * resolveReferences(Expression *e, Expression *thisval) ++Expression * resolveReferences(Expression *e) + { + for(;;) + { + if (e->op == TOKthis) + { ++ Expression *thisval = ctfeStack.getThis(); + assert(thisval); + assert(e != thisval); + e = thisval; +@@ -1588,12 +2226,29 @@ Expression *getVarExp(Loc loc, InterStat + */ + if (v->ident == Id::ctfe) + return new IntegerExp(loc, 1, Type::tbool); ++ ++ if (!v->originalType && v->scope) // semantic() not yet run ++ { ++ v->semantic (v->scope); ++ if (v->type->ty == Terror) ++ return EXP_CANT_INTERPRET; ++ } ++ + if ((v->isConst() || v->isImmutable() || v->storage_class & STCmanifest) + && v->init && !v->hasValue() && !v->isCTFE()) + #else + if (v->isConst() && v->init && !v->isCTFE()) + #endif +- { e = v->init->toExpression(); ++ { ++ if(v->scope) ++ v->init = v->init->semantic(v->scope, v->type, INITinterpret); // might not be run on aggregate members ++ e = v->init->toExpression(v->type); ++ if (v->inuse) ++ { ++ error(loc, "circular initialization of %s", v->toChars()); ++ return EXP_CANT_INTERPRET; ++ } ++ + if (e && (e->op == TOKconstruct || e->op == TOKblit)) + { AssignExp *ae = (AssignExp *)e; + e = ae->e2; +@@ -1611,14 +2266,19 @@ Expression *getVarExp(Loc loc, InterStat + if (e && !e->type) + e->type = v->type; + if (e) ++ { ++ v->inuse++; + e = e->interpret(istate, ctfeNeedAnyValue); ++ v->inuse--; ++ } + if (e == EXP_CANT_INTERPRET && !global.gag && !CtfeStatus::stackTraceCallsToSuppress) + errorSupplemental(loc, "while evaluating %s.init", v->toChars()); + } + if (e && e != EXP_CANT_INTERPRET && e->op != TOKthrownexception) + { + e = copyLiteral(e); +- ctfeStack.saveGlobalConstant(v, e); ++ if (v->isDataseg() || (v->storage_class & STCmanifest )) ++ ctfeStack.saveGlobalConstant(v, e); + } + } + else if (v->isCTFE() && !v->hasValue()) +@@ -1690,16 +2350,14 @@ Expression *getVarExp(Loc loc, InterStat + } + else if (s) + { // Struct static initializers, for example +- if (s->dsym->toInitializer() == s->sym) +- { e = s->dsym->type->defaultInitLiteral(loc); +- e = e->semantic(NULL); +- if (e->op == TOKerror) +- e = EXP_CANT_INTERPRET; +- else // Convert NULL to VoidExp +- e = e->interpret(istate, goal); +- } +- else +- error(loc, "cannot interpret symbol %s at compile time", s->toChars()); ++ e = s->dsym->type->defaultInitLiteral(loc); ++ if (e->op == TOKerror) ++ error(loc, "CTFE failed because of previous errors in %s.init", s->toChars()); ++ e = e->semantic(NULL); ++ if (e->op == TOKerror) ++ e = EXP_CANT_INTERPRET; ++ else // Convert NULL to VoidExp ++ e = e->interpret(istate, goal); + } + else + error(loc, "cannot interpret declaration %s at compile time", d->toChars()); +@@ -1755,7 +2413,7 @@ Expression *DeclarationExp::interpret(In + return NULL; + for(size_t i= 0; i < td->objects->dim; ++i) + { +- Object * o = td->objects->tdata()[i]; ++ RootObject * o = (*td->objects)[i]; + Expression *ex = isExpression(o); + DsymbolExp *s = (ex && ex->op == TOKdsymbol) ? (DsymbolExp *)ex : NULL; + VarDeclaration *v2 = s ? s->s->isVarDeclaration() : NULL; +@@ -1763,8 +2421,9 @@ Expression *DeclarationExp::interpret(In + if (!v2->isDataseg() || v2->isCTFE()) + ctfeStack.push(v2); + } ++ return NULL; + } +- if (!v->isDataseg() || v->isCTFE()) ++ if (!(v->isDataseg() || v->storage_class & STCmanifest) || v->isCTFE()) + ctfeStack.push(v); + Dsymbol *s = v->toAlias(); + if (s == v && !v->isStatic() && v->init) +@@ -1815,9 +2474,15 @@ Expression *DeclarationExp::interpret(In + declaration->isTupleDeclaration()) + { // Check for static struct declarations, which aren't executable + AttribDeclaration *ad = declaration->isAttribDeclaration(); +- if (ad && ad->decl && ad->decl->dim == 1 +- && ad->decl->tdata()[0]->isAggregateDeclaration()) +- return NULL; // static struct declaration. Nothing to do. ++ if (ad && ad->decl && ad->decl->dim == 1) ++ { ++ Dsymbol *s = (*ad->decl)[0]; ++ if (s->isAggregateDeclaration() || ++ s->isTemplateDeclaration()) ++ { ++ return NULL; // static (template) struct declaration. Nothing to do. ++ } ++ } + + // These can be made to work, too lazy now + error("Declaration %s is not yet implemented in CTFE", toChars()); +@@ -1840,15 +2505,19 @@ Expression *TupleExp::interpret(InterSta + #endif + Expressions *expsx = NULL; + ++ if (e0) ++ { ++ if (e0->interpret(istate) == EXP_CANT_INTERPRET) ++ return EXP_CANT_INTERPRET; ++ } ++ + for (size_t i = 0; i < exps->dim; i++) + { Expression *e = (*exps)[i]; + Expression *ex; + + ex = e->interpret(istate); + if (exceptionOrCantInterpret(ex)) +- { delete expsx; + return ex; +- } + + // A tuple of assignments can contain void (Bug 5676). + if (goal == ctfeNeedNothing) +@@ -1901,9 +2570,7 @@ Expression *ArrayLiteralExp::interpret(I + if (e->op == TOKindex) // segfault bug 6250 + assert( ((IndexExp*)e)->e1 != this); + ex = e->interpret(istate); +- if (ex == EXP_CANT_INTERPRET) +- goto Lerror; +- if (ex->op == TOKthrownexception) ++ if (exceptionOrCantInterpret(ex)) + return ex; + + /* If any changes, do Copy On Write +@@ -1927,7 +2594,10 @@ Expression *ArrayLiteralExp::interpret(I + { + expandTuples(expsx); + if (expsx->dim != elements->dim) +- goto Lerror; ++ { ++ error("Internal Compiler Error: Invalid array literal"); ++ return EXP_CANT_INTERPRET; ++ } + ArrayLiteralExp *ae = new ArrayLiteralExp(loc, expsx); + ae->type = type; + return copyLiteral(ae); +@@ -1939,12 +2609,6 @@ Expression *ArrayLiteralExp::interpret(I + } + #endif + return copyLiteral(this); +- +-Lerror: +- if (expsx) +- delete expsx; +- error("cannot interpret array literal"); +- return EXP_CANT_INTERPRET; + } + + Expression *AssocArrayLiteralExp::interpret(InterState *istate, CtfeGoal goal) +@@ -1957,30 +2621,26 @@ Expression *AssocArrayLiteralExp::interp + if (ownedByCtfe) // We've already interpreted all the elements + return copyLiteral(this); + for (size_t i = 0; i < keys->dim; i++) +- { Expression *ekey = keys->tdata()[i]; +- Expression *evalue = values->tdata()[i]; ++ { ++ Expression *ekey = (*keys)[i]; ++ Expression *evalue = (*values)[i]; + Expression *ex; + + ex = ekey->interpret(istate); +- if (ex == EXP_CANT_INTERPRET) +- goto Lerr; +- if (ex->op == TOKthrownexception) ++ if (exceptionOrCantInterpret(ex)) + return ex; + +- + /* If any changes, do Copy On Write + */ + if (ex != ekey) + { + if (keysx == keys) + keysx = (Expressions *)keys->copy(); +- keysx->tdata()[i] = ex; ++ (*keysx)[i] = ex; + } + + ex = evalue->interpret(istate); +- if (ex == EXP_CANT_INTERPRET) +- goto Lerr; +- if (ex->op == TOKthrownexception) ++ if (exceptionOrCantInterpret(ex)) + return ex; + + /* If any changes, do Copy On Write +@@ -1989,7 +2649,7 @@ Expression *AssocArrayLiteralExp::interp + { + if (valuesx == values) + valuesx = (Expressions *)values->copy(); +- valuesx->tdata()[i] = ex; ++ (*valuesx)[i] = ex; + } + } + if (keysx != keys) +@@ -1997,14 +2657,19 @@ Expression *AssocArrayLiteralExp::interp + if (valuesx != values) + expandTuples(valuesx); + if (keysx->dim != valuesx->dim) +- goto Lerr; ++ { ++ error("Internal Compiler Error: invalid AA"); ++ return EXP_CANT_INTERPRET; ++ } + + /* Remove duplicate keys + */ + for (size_t i = 1; i < keysx->dim; i++) +- { Expression *ekey = keysx->tdata()[i - 1]; ++ { ++ Expression *ekey = (*keysx)[i - 1]; + for (size_t j = i; j < keysx->dim; j++) +- { Expression *ekey2 = keysx->tdata()[j]; ++ { ++ Expression *ekey2 = (*keysx)[j]; + int eq = ctfeEqual(loc, TOKequal, ekey, ekey2); + if (eq) // if a match + { +@@ -2030,13 +2695,6 @@ Expression *AssocArrayLiteralExp::interp + return ae; + } + return this; +- +-Lerr: +- if (keysx != keys) +- delete keysx; +- if (valuesx != values) +- delete values; +- return EXP_CANT_INTERPRET; + } + + Expression *StructLiteralExp::interpret(InterState *istate, CtfeGoal goal) +@@ -2045,50 +2703,70 @@ Expression *StructLiteralExp::interpret( + #if LOG + printf("%s StructLiteralExp::interpret() %s\n", loc.toChars(), toChars()); + #endif +- /* We don't know how to deal with overlapping fields +- */ +- if (sd->hasUnions) +- { error("Unions with overlapping fields are not yet supported in CTFE"); +- return EXP_CANT_INTERPRET; +- } + if (ownedByCtfe) + return copyLiteral(this); + +- if (elements) +- { +- for (size_t i = 0; i < elements->dim; i++) +- { Expression *e = (*elements)[i]; +- if (!e) +- continue; +- +- Expression *ex = e->interpret(istate); +- if (exceptionOrCantInterpret(ex)) +- { delete expsx; +- return ex; +- } ++ size_t elemdim = elements ? elements->dim : 0; + +- /* If any changes, do Copy On Write ++ for (size_t i = 0; i < sd->fields.dim; i++) ++ { Expression *e = NULL; ++ Expression *ex = NULL; ++ if (i >= elemdim) ++ { ++ /* If a nested struct has no initialized hidden pointer, ++ * set it to null to match the runtime behaviour. + */ +- if (ex != e) ++ if (i == sd->fields.dim - 1 && sd->isNested()) ++ { // Context field has not been filled ++ ex = new NullExp(loc); ++ ex->type = sd->fields[i]->type; ++ } ++ } ++ else ++ { ++ e = (*elements)[i]; ++ if (!e) + { +- if (!expsx) +- { expsx = new Expressions(); +- ++CtfeStatus::numArrayAllocs; +- expsx->setDim(elements->dim); +- for (size_t j = 0; j < elements->dim; j++) +- { +- (*expsx)[j] = (*elements)[j]; +- } ++ /* Ideally, we'd convert NULL members into void expressions. ++ * The problem is that the VoidExp will be removed when we ++ * leave CTFE, causing another memory allocation if we use this ++ * same struct literal again. ++ * ++ * ex = sd->fields[i]->type->voidInitLiteral(sd->fields[i]); ++ */ ++ ex = NULL; ++ } ++ else ++ { ++ ex = e->interpret(istate); ++ if (exceptionOrCantInterpret(ex)) ++ return ex; ++ } ++ } ++ ++ /* If any changes, do Copy On Write ++ */ ++ if (ex != e) ++ { ++ if (!expsx) ++ { expsx = new Expressions(); ++ ++CtfeStatus::numArrayAllocs; ++ expsx->setDim(sd->fields.dim); ++ for (size_t j = 0; j < elements->dim; j++) ++ { ++ (*expsx)[j] = (*elements)[j]; + } +- (*expsx)[i] = ex; + } ++ (*expsx)[i] = ex; + } + } ++ + if (elements && expsx) + { + expandTuples(expsx); +- if (expsx->dim != elements->dim) +- { delete expsx; ++ if (expsx->dim != sd->fields.dim) ++ { ++ error("Internal Compiler Error: invalid struct literal"); + return EXP_CANT_INTERPRET; + } + StructLiteralExp *se = new StructLiteralExp(loc, sd, expsx); +@@ -2183,10 +2861,19 @@ Expression *NewExp::interpret(InterState + Dsymbol *s = c->fields[i]; + VarDeclaration *v = s->isVarDeclaration(); + assert(v); +- Expression *m = v->init ? v->init->toExpression() : v->type->defaultInitLiteral(loc); ++ Expression *m; ++ if (v->init) ++ { ++ if (v->init->isVoidInitializer()) ++ m = v->type->voidInitLiteral(v); ++ else ++ m = v->getConstInitializer(true); ++ } ++ else ++ m = v->type->defaultInitLiteral(loc); + if (exceptionOrCantInterpret(m)) + return m; +- elems->tdata()[fieldsSoFar+i] = copyLiteral(m); ++ (*elems)[fieldsSoFar+i] = copyLiteral(m); + } + } + // Hack: we store a ClassDeclaration instead of a StructDeclaration. +@@ -2216,33 +2903,33 @@ Expression *NewExp::interpret(InterState + return EXP_CANT_INTERPRET; + } + +-Expression *UnaExp::interpretCommon(InterState *istate, CtfeGoal goal, Expression *(*fp)(Type *, Expression *)) ++Expression *UnaExp::interpret(InterState *istate, CtfeGoal goal) + { Expression *e; + Expression *e1; + + #if LOG +- printf("%s UnaExp::interpretCommon() %s\n", loc.toChars(), toChars()); ++ printf("%s UnaExp::interpret() %s\n", loc.toChars(), toChars()); + #endif ++ if (op == TOKdottype) ++ { ++ error("Internal Compiler Error: CTFE DotType: %s", toChars()); ++ return EXP_CANT_INTERPRET; ++ } + e1 = this->e1->interpret(istate); + if (exceptionOrCantInterpret(e1)) + return e1; +- e = (*fp)(type, e1); ++ switch(op) ++ { ++ case TOKneg: e = Neg(type, e1); break; ++ case TOKtilde: e = Com(type, e1); break; ++ case TOKnot: e = Not(type, e1); break; ++ case TOKtobool: e = Bool(type, e1); break; ++ case TOKvector: e = this; break; // do nothing ++ default: assert(0); ++ } + return e; + } + +-#define UNA_INTERPRET(op) \ +-Expression *op##Exp::interpret(InterState *istate, CtfeGoal goal) \ +-{ \ +- return interpretCommon(istate, goal, &op); \ +-} +- +-UNA_INTERPRET(Neg) +-UNA_INTERPRET(Com) +-UNA_INTERPRET(Not) +-UNA_INTERPRET(Bool) +- +- +-typedef Expression *(*fp_t)(Type *, Expression *, Expression *); + + Expression *BinExp::interpretCommon(InterState *istate, CtfeGoal goal, fp_t fp) + { Expression *e; +@@ -2291,62 +2978,49 @@ Expression *BinExp::interpretCommon(Inte + if (exceptionOrCantInterpret(e1)) + return e1; + if (e1->isConst() != 1) +- goto Lcant; ++ { ++ error("Internal Compiler Error: non-constant value %s", this->e1->toChars()); ++ return EXP_CANT_INTERPRET; ++ } + + e2 = this->e2->interpret(istate); + if (exceptionOrCantInterpret(e2)) + return e2; + if (e2->isConst() != 1) +- goto Lcant; ++ { ++ error("Internal Compiler Error: non-constant value %s", this->e2->toChars()); ++ return EXP_CANT_INTERPRET; ++ } + ++ if (op == TOKshr || op == TOKshl || op == TOKushr) ++ { ++ sinteger_t i2 = e2->toInteger(); ++ d_uns64 sz = e1->type->size() * 8; ++ if (i2 < 0 || i2 >= sz) ++ { error("shift by %lld is outside the range 0..%llu", i2, (ulonglong)sz - 1); ++ return EXP_CANT_INTERPRET; ++ } ++ } + e = (*fp)(type, e1, e2); + if (e == EXP_CANT_INTERPRET) + error("%s cannot be interpreted at compile time", toChars()); + return e; +- +-Lcant: +- return EXP_CANT_INTERPRET; + } + +-#define BIN_INTERPRET(op) \ +-Expression *op##Exp::interpret(InterState *istate, CtfeGoal goal) \ +-{ \ +- return interpretCommon(istate, goal, &op); \ +-} +- +-BIN_INTERPRET(Add) +-BIN_INTERPRET(Min) +-BIN_INTERPRET(Mul) +-BIN_INTERPRET(Div) +-BIN_INTERPRET(Mod) +-BIN_INTERPRET(Shl) +-BIN_INTERPRET(Shr) +-BIN_INTERPRET(Ushr) +-BIN_INTERPRET(And) +-BIN_INTERPRET(Or) +-BIN_INTERPRET(Xor) +-#if DMDV2 +-BIN_INTERPRET(Pow) +-#endif +- +- +-typedef int (*fp2_t)(Loc loc, enum TOK, Expression *, Expression *); +- +- + Expression *BinExp::interpretCompareCommon(InterState *istate, CtfeGoal goal, fp2_t fp) + { + Expression *e1; + Expression *e2; + + #if LOG +- printf("%s BinExp::interpretCommon2() %s\n", loc.toChars(), toChars()); ++ printf("%s BinExp::interpretCompareCommon() %s\n", loc.toChars(), toChars()); + #endif + if (this->e1->type->ty == Tpointer && this->e2->type->ty == Tpointer) + { +- e1 = this->e1->interpret(istate, ctfeNeedLvalue); ++ e1 = this->e1->interpret(istate); + if (exceptionOrCantInterpret(e1)) + return e1; +- e2 = this->e2->interpret(istate, ctfeNeedLvalue); ++ e2 = this->e2->interpret(istate); + if (exceptionOrCantInterpret(e2)) + return e2; + dinteger_t ofs1, ofs2; +@@ -2384,47 +3058,59 @@ Expression *BinExp::interpretCompareComm + return new IntegerExp(loc, cmp, type); + } + +-#define BIN_INTERPRET2(op, opfunc) \ +-Expression *op##Exp::interpret(InterState *istate, CtfeGoal goal) \ +-{ \ +- return interpretCompareCommon(istate, goal, &opfunc); \ ++Expression *BinExp::interpret(InterState *istate, CtfeGoal goal) ++{ ++ switch(op) ++ { ++ case TOKadd: return interpretCommon(istate, goal, &Add); ++ case TOKmin: return interpretCommon(istate, goal, &Min); ++ case TOKmul: return interpretCommon(istate, goal, &Mul); ++ case TOKdiv: return interpretCommon(istate, goal, &Div); ++ case TOKmod: return interpretCommon(istate, goal, &Mod); ++ case TOKshl: return interpretCommon(istate, goal, &Shl); ++ case TOKshr: return interpretCommon(istate, goal, &Shr); ++ case TOKushr: return interpretCommon(istate, goal, &Ushr); ++ case TOKand: return interpretCommon(istate, goal, &And); ++ case TOKor: return interpretCommon(istate, goal, &Or); ++ case TOKxor: return interpretCommon(istate, goal, &Xor); ++#if DMDV2 ++ case TOKpow: return interpretCommon(istate, goal, &Pow); ++#endif ++ case TOKequal: ++ case TOKnotequal: ++ return interpretCompareCommon(istate, goal, &ctfeEqual); ++ case TOKidentity: ++ case TOKnotidentity: ++ return interpretCompareCommon(istate, goal, &ctfeIdentity); ++ case TOKlt: ++ case TOKle: ++ case TOKgt: ++ case TOKge: ++ case TOKleg: ++ case TOKlg: ++ case TOKunord: ++ case TOKue: ++ case TOKug: ++ case TOKuge: ++ case TOKul: ++ case TOKule: ++ return interpretCompareCommon(istate, goal, &ctfeCmp); ++ default: ++ assert(0); ++ return NULL; ++ } + } + +-BIN_INTERPRET2(Equal, ctfeEqual) +-BIN_INTERPRET2(Identity, ctfeIdentity) +-BIN_INTERPRET2(Cmp, ctfeCmp) +- + /* Helper functions for BinExp::interpretAssignCommon + */ + +-// Return true if e is derived from UnaryExp. +-// Consider moving this function into Expression. +-UnaExp *isUnaExp(Expression *e) +-{ +- switch (e->op) +- { +- case TOKdotvar: +- case TOKindex: +- case TOKslice: +- case TOKcall: +- case TOKdot: +- case TOKdotti: +- case TOKdottype: +- case TOKcast: +- return (UnaExp *)e; +- default: +- break; +- } +- return NULL; +-} +- + // Returns the variable which is eventually modified, or NULL if an rvalue. + // thisval is the current value of 'this'. +-VarDeclaration * findParentVar(Expression *e, Expression *thisval) ++VarDeclaration * findParentVar(Expression *e) + { + for (;;) + { +- e = resolveReferences(e, thisval); ++ e = resolveReferences(e); + if (e->op == TOKvar) + break; + if (e->op == TOKindex) +@@ -2443,6 +3129,13 @@ VarDeclaration * findParentVar(Expressio + return v; + } + ++Expression *interpretAssignToSlice(InterState *istate, CtfeGoal goal, Loc loc, ++ SliceExp *sexp, Expression *newval, bool wantRef, bool isBlockAssignment, ++ BinExp *originalExpression); ++ ++bool interpretAssignToIndex(InterState *istate, Loc loc, ++ IndexExp *ie, Expression *newval, bool wantRef, ++ BinExp *originalExp); + + Expression *BinExp::interpretAssignCommon(InterState *istate, CtfeGoal goal, fp_t fp, int post) + { +@@ -2479,9 +3172,9 @@ Expression *BinExp::interpretAssignCommo + { + desttype = ((TypeArray *)desttype)->next; + #if DMDV2 +- if (srctype == desttype->castMod(0)) ++ if (srctype->equals(desttype->castMod(0))) + #else +- if (srctype == desttype) ++ if (srctype->equals(desttype)) + #endif + { + isBlockAssignment = true; +@@ -2501,7 +3194,7 @@ Expression *BinExp::interpretAssignCommo + bool wantRef = false; + bool wantLvalueRef = false; + +- if (!fp && this->e1->type->toBasetype() == this->e2->type->toBasetype() && ++ if (!fp && this->e1->type->toBasetype()->equals(this->e2->type->toBasetype()) && + (e1->type->toBasetype()->ty == Tarray || isAssocArray(e1->type) + || e1->type->toBasetype()->ty == Tclass) + // e = *x is never a reference, because *x is always a value +@@ -2519,7 +3212,7 @@ Expression *BinExp::interpretAssignCommo + * can be dealt with by making this a non-ref assign (y = x.dup). + * Otherwise it's a big mess. + */ +- VarDeclaration * targetVar = findParentVar(e2, istate->localThis); ++ VarDeclaration * targetVar = findParentVar(e2); + if (!(targetVar && targetVar->isConst())) + wantRef = true; + // slice assignment of static arrays is not reference assignment +@@ -2560,7 +3253,7 @@ Expression *BinExp::interpretAssignCommo + // First, deal with this = e; and call() = e; + if (e1->op == TOKthis) + { +- e1 = istate->localThis; ++ e1 = ctfeStack.getThis(); + } + if (e1->op == TOKcall) + { +@@ -2575,7 +3268,7 @@ Expression *BinExp::interpretAssignCommo + // f() = e2, when f returns an array, is always a slice assignment. + // Convert into arr[0..arr.length] = e2 + e1 = new SliceExp(loc, e1, +- new IntegerExp(0, 0, Type::tsize_t), ++ new IntegerExp(Loc(), 0, Type::tsize_t), + ArrayLength(Type::tsize_t, e1)); + e1->type = type; + } +@@ -2586,7 +3279,7 @@ Expression *BinExp::interpretAssignCommo + if (exceptionOrCantInterpret(e1)) + return e1; + if (!(e1->op == TOKvar || e1->op == TOKdotvar || e1->op == TOKindex +- || e1->op == TOKslice)) ++ || e1->op == TOKslice || e1->op == TOKstructliteral)) + { + error("cannot dereference invalid pointer %s", + this->e1->toChars()); +@@ -2595,7 +3288,7 @@ Expression *BinExp::interpretAssignCommo + } + + if (!(e1->op == TOKarraylength || e1->op == TOKvar || e1->op == TOKdotvar +- || e1->op == TOKindex || e1->op == TOKslice)) ++ || e1->op == TOKindex || e1->op == TOKslice || e1->op == TOKstructliteral)) + { + error("CTFE internal error: unsupported assignment %s", toChars()); + return EXP_CANT_INTERPRET; +@@ -2630,7 +3323,7 @@ Expression *BinExp::interpretAssignCommo + return oldval; + while (oldval->op == TOKvar) + { +- oldval = resolveReferences(oldval, istate->localThis); ++ oldval = resolveReferences(oldval); + oldval = oldval->interpret(istate); + if (exceptionOrCantInterpret(oldval)) + return oldval; +@@ -2699,7 +3392,7 @@ Expression *BinExp::interpretAssignCommo + { // Get the old array literal. + oldval = e1->interpret(istate); + while (oldval->op == TOKvar) +- { oldval = resolveReferences(oldval, istate->localThis); ++ { oldval = resolveReferences(oldval); + oldval = oldval->interpret(istate); + } + } +@@ -2751,14 +3444,14 @@ Expression *BinExp::interpretAssignCommo + // ------------------------------------------------- + // Make sure we're not trying to modify a global or static variable + // We do this by locating the ultimate parent variable which gets modified. +- VarDeclaration * ultimateVar = findParentVar(e1, istate->localThis); ++ VarDeclaration * ultimateVar = findParentVar(e1); + if (ultimateVar && ultimateVar->isDataseg() && !ultimateVar->isCTFE()) + { // Can't modify global or static data + error("%s cannot be modified at compile time", ultimateVar->toChars()); + return EXP_CANT_INTERPRET; + } + +- e1 = resolveReferences(e1, istate->localThis); ++ e1 = resolveReferences(e1); + + // Unless we have a simple var assignment, we're + // only modifying part of the variable. So we need to make sure +@@ -2819,7 +3512,7 @@ Expression *BinExp::interpretAssignCommo + ie = (IndexExp *)ie->e1; + ++depth; + } +- Expression *aggregate = resolveReferences(ie->e1, istate->localThis); ++ Expression *aggregate = resolveReferences(ie->e1); + Expression *oldagg = aggregate; + // Get the AA to be modified. (We do an LvalueRef interpret, unless it + // is a simple ref parameter -- in which case, we just want the value) +@@ -2907,18 +3600,17 @@ Expression *BinExp::interpretAssignCommo + // collapsed into a single assignment. + if (!wantRef && e1->op == TOKdotvar) + { +- // Strip of all of the leading dotvars, unless we started with a call +- // or a ref parameter ++ // Strip of all of the leading dotvars, unless it is a CTFE dotvar ++ // pointer or reference + // (in which case, we already have the lvalue). +- if (this->e1->op != TOKcall && !(this->e1->op==TOKvar +- && ((VarExp*)this->e1)->var->storage_class & (STCref | STCout))) +- e1 = e1->interpret(istate, isPointer(type)? ctfeNeedLvalueRef : ctfeNeedLvalue); +- if (exceptionOrCantInterpret(e1)) +- return e1; +- if (e1->op == TOKstructliteral && newval->op == TOKstructliteral) +- { +- assignInPlace(e1, newval); +- return returnValue; ++ DotVarExp *dve = (DotVarExp *)e1; ++ bool isCtfePointer = (dve->e1->op == TOKstructliteral) ++ && ((StructLiteralExp *)(dve->e1))->ownedByCtfe; ++ if (!isCtfePointer) ++ { ++ e1 = e1->interpret(istate, isPointer(type) ? ctfeNeedLvalueRef : ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(e1)) ++ return e1; + } + } + #if LOGASSIGN +@@ -2968,6 +3660,15 @@ Expression *BinExp::interpretAssignCommo + } + } + } ++ else if (e1->op == TOKstructliteral && newval->op == TOKstructliteral) ++ { ++ /* Assignment to complete struct of the form: ++ * e1 = newval ++ * (e1 was a ref parameter, or was created via TOKstar dereferencing). ++ */ ++ assignInPlace(e1, newval); ++ return returnValue; ++ } + else if (e1->op == TOKdotvar) + { + /* Assignment to member variable of the form: +@@ -3012,496 +3713,552 @@ Expression *BinExp::interpretAssignCommo + for(int i = unionStart; i < unionStart + unionSize; ++i) + { if (i == fieldi) + continue; +- Expression **el = &se->elements->tdata()[i]; ++ Expression **el = &(*se->elements)[i]; + if ((*el)->op != TOKvoid) + *el = (*el)->type->voidInitLiteral(member); + } + } + + if (newval->op == TOKstructliteral) +- assignInPlace(se->elements->tdata()[fieldi], newval); ++ assignInPlace((*se->elements)[fieldi], newval); + else +- se->elements->tdata()[fieldi] = newval; ++ (*se->elements)[fieldi] = newval; + return returnValue; + } + else if (e1->op == TOKindex) + { +- /* Assignment to array element of the form: +- * aggregate[i] = newval +- * aggregate is not AA (AAs were dealt with already). +- */ +- IndexExp *ie = (IndexExp *)e1; +- assert(ie->e1->type->toBasetype()->ty != Taarray); +- uinteger_t destarraylen = 0; ++ if ( !interpretAssignToIndex(istate, loc, (IndexExp *)e1, newval, ++ wantRef, this)) ++ return EXP_CANT_INTERPRET; ++ return returnValue; ++ } ++ else if (e1->op == TOKslice) ++ { ++ // Note that slice assignments don't support things like ++, so ++ // we don't need to remember 'returnValue'. ++ return interpretAssignToSlice(istate, goal, loc, (SliceExp *)e1, ++ newval, wantRef, isBlockAssignment, this); ++ } ++ else ++ { ++ error("%s cannot be evaluated at compile time", toChars()); ++ } ++ return returnValue; ++} ++ ++/************* ++ * Deal with assignments of the form ++ * aggregate[ie] = newval ++ * where aggregate and newval have already been interpreted ++ * ++ * Return true if OK, false if error occured ++ */ ++bool interpretAssignToIndex(InterState *istate, Loc loc, ++ IndexExp *ie, Expression *newval, bool wantRef, ++ BinExp *originalExp) ++{ ++ /* Assignment to array element of the form: ++ * aggregate[i] = newval ++ * aggregate is not AA (AAs were dealt with already). ++ */ ++ assert(ie->e1->type->toBasetype()->ty != Taarray); ++ uinteger_t destarraylen = 0; + +- // Set the $ variable, and find the array literal to modify +- if (ie->e1->type->toBasetype()->ty != Tpointer) ++ // Set the $ variable, and find the array literal to modify ++ if (ie->e1->type->toBasetype()->ty != Tpointer) ++ { ++ Expression *oldval = ie->e1->interpret(istate); ++ if (oldval->op == TOKnull) + { +- Expression *oldval = ie->e1->interpret(istate); +- if (oldval->op == TOKnull) +- { +- error("cannot index null array %s", ie->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- if (oldval->op != TOKarrayliteral && oldval->op != TOKstring +- && oldval->op != TOKslice) +- { +- error("cannot determine length of %s at compile time", +- ie->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- destarraylen = resolveArrayLength(oldval); +- if (ie->lengthVar) +- { +- IntegerExp *dollarExp = new IntegerExp(loc, destarraylen, Type::tsize_t); +- ctfeStack.push(ie->lengthVar); +- ie->lengthVar->setValue(dollarExp); +- } ++ originalExp->error("cannot index null array %s", ie->e1->toChars()); ++ return false; ++ } ++ if (oldval->op != TOKarrayliteral && oldval->op != TOKstring ++ && oldval->op != TOKslice) ++ { ++ originalExp->error("cannot determine length of %s at compile time", ++ ie->e1->toChars()); ++ return false; + } +- Expression *index = ie->e2->interpret(istate); ++ destarraylen = resolveArrayLength(oldval); + if (ie->lengthVar) +- ctfeStack.pop(ie->lengthVar); // $ is defined only inside [] +- if (exceptionOrCantInterpret(index)) +- return index; ++ { ++ IntegerExp *dollarExp = new IntegerExp(loc, destarraylen, Type::tsize_t); ++ ctfeStack.push(ie->lengthVar); ++ ie->lengthVar->setValue(dollarExp); ++ } ++ } ++ Expression *index = ie->e2->interpret(istate); ++ if (ie->lengthVar) ++ ctfeStack.pop(ie->lengthVar); // $ is defined only inside [] ++ if (exceptionOrCantInterpret(index)) ++ return false; + +- assert (index->op != TOKslice); // only happens with AA assignment ++ assert (index->op != TOKslice); // only happens with AA assignment + +- ArrayLiteralExp *existingAE = NULL; +- StringExp *existingSE = NULL; ++ ArrayLiteralExp *existingAE = NULL; ++ StringExp *existingSE = NULL; + +- Expression *aggregate = resolveReferences(ie->e1, istate->localThis); ++ Expression *aggregate = resolveReferences(ie->e1); + +- // Set the index to modify, and check that it is in range +- dinteger_t indexToModify = index->toInteger(); +- if (ie->e1->type->toBasetype()->ty == Tpointer) ++ // Set the index to modify, and check that it is in range ++ dinteger_t indexToModify = index->toInteger(); ++ if (ie->e1->type->toBasetype()->ty == Tpointer) ++ { ++ dinteger_t ofs; ++ aggregate = aggregate->interpret(istate, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(aggregate)) ++ return false; ++ if (aggregate->op == TOKnull) + { +- dinteger_t ofs; +- aggregate = aggregate->interpret(istate, ctfeNeedLvalue); +- if (exceptionOrCantInterpret(aggregate)) +- return aggregate; +- if (aggregate->op == TOKnull) +- { +- error("cannot index through null pointer %s", ie->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- if (aggregate->op == TOKint64) +- { +- error("cannot index through invalid pointer %s of value %s", +- ie->e1->toChars(), aggregate->toChars()); +- return EXP_CANT_INTERPRET; +- } +- aggregate = getAggregateFromPointer(aggregate, &ofs); +- indexToModify += ofs; +- if (aggregate->op != TOKslice && aggregate->op != TOKstring && +- aggregate->op != TOKarrayliteral && aggregate->op != TOKassocarrayliteral) +- { +- if (indexToModify != 0) +- { +- error("pointer index [%lld] lies outside memory block [0..1]", indexToModify); +- return EXP_CANT_INTERPRET; +- } +- // It is equivalent to *aggregate = newval. +- // Aggregate could be varexp, a dotvar, ... +- // TODO: we could support this +- error("indexed assignment of non-array pointers is not yet supported at compile time; use *%s = %s instead", +- ie->e1->toChars(), e2->toChars()); +- return EXP_CANT_INTERPRET; +- } +- destarraylen = resolveArrayLength(aggregate); ++ originalExp->error("cannot index through null pointer %s", ie->e1->toChars()); ++ return false; + } +- if (indexToModify >= destarraylen) ++ if (aggregate->op == TOKint64) + { +- error("array index %lld is out of bounds [0..%lld]", indexToModify, +- destarraylen); +- return EXP_CANT_INTERPRET; ++ originalExp->error("cannot index through invalid pointer %s of value %s", ++ ie->e1->toChars(), aggregate->toChars()); ++ return false; + } +- +- /* The only possible indexable LValue aggregates are array literals, and +- * slices of array literals. +- */ +- if (aggregate->op == TOKindex || aggregate->op == TOKdotvar || +- aggregate->op == TOKslice || aggregate->op == TOKcall || +- aggregate->op == TOKstar) ++ aggregate = getAggregateFromPointer(aggregate, &ofs); ++ indexToModify += ofs; ++ if (aggregate->op != TOKslice && aggregate->op != TOKstring && ++ aggregate->op != TOKarrayliteral && aggregate->op != TOKassocarrayliteral) + { +- Expression *origagg = aggregate; +- aggregate = aggregate->interpret(istate, ctfeNeedLvalue); +- if (exceptionOrCantInterpret(aggregate)) +- return aggregate; +- // The array could be an index of an AA. Resolve it if so. +- if (aggregate->op == TOKindex && +- ((IndexExp *)aggregate)->e1->op == TOKassocarrayliteral) +- { +- IndexExp *ix = (IndexExp *)aggregate; +- aggregate = findKeyInAA(loc, (AssocArrayLiteralExp *)ix->e1, ix->e2); +- if (!aggregate) +- { +- error("key %s not found in associative array %s", +- ix->e2->toChars(), ix->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- if (exceptionOrCantInterpret(aggregate)) +- return aggregate; ++ if (aggregate->op == TOKsymoff) ++ { ++ originalExp->error("mutable variable %s cannot be modified at compile time, even through a pointer", ((SymOffExp *)aggregate)->var->toChars()); ++ return false; ++ } ++ if (indexToModify != 0) ++ { ++ originalExp->error("pointer index [%lld] lies outside memory block [0..1]", indexToModify); ++ return false; + } ++ // It is equivalent to *aggregate = newval. ++ // Aggregate could be varexp, a dotvar, ... ++ // TODO: we could support this ++ originalExp->error("indexed assignment of non-array pointers is not yet supported at compile time; use *%s = %s instead", ++ ie->e1->toChars(), originalExp->e2->toChars()); ++ return false; + } +- if (aggregate->op == TOKvar) +- { +- VarExp *ve = (VarExp *)aggregate; +- VarDeclaration *v = ve->var->isVarDeclaration(); +- aggregate = v->getValue(); +- if (aggregate->op == TOKnull) ++ destarraylen = resolveArrayLength(aggregate); ++ } ++ if (indexToModify >= destarraylen) ++ { ++ originalExp->error("array index %lld is out of bounds [0..%lld]", indexToModify, ++ destarraylen); ++ return false; ++ } ++ ++ /* The only possible indexable LValue aggregates are array literals, and ++ * slices of array literals. ++ */ ++ if (aggregate->op == TOKindex || aggregate->op == TOKdotvar || ++ aggregate->op == TOKslice || aggregate->op == TOKcall || ++ aggregate->op == TOKstar || aggregate->op == TOKcast) ++ { ++ aggregate = aggregate->interpret(istate, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(aggregate)) ++ return false; ++ // The array could be an index of an AA. Resolve it if so. ++ if (aggregate->op == TOKindex && ++ ((IndexExp *)aggregate)->e1->op == TOKassocarrayliteral) ++ { ++ IndexExp *ix = (IndexExp *)aggregate; ++ aggregate = findKeyInAA(loc, (AssocArrayLiteralExp *)ix->e1, ix->e2); ++ if (!aggregate) + { +- // This would be a runtime segfault +- error("cannot index null array %s", v->toChars()); +- return EXP_CANT_INTERPRET; ++ originalExp->error("key %s not found in associative array %s", ++ ix->e2->toChars(), ix->e1->toChars()); ++ return false; + } ++ if (exceptionOrCantInterpret(aggregate)) ++ return false; + } +- if (aggregate->op == TOKslice) +- { +- SliceExp *sexp = (SliceExp *)aggregate; +- aggregate = sexp->e1; +- Expression *lwr = sexp->lwr->interpret(istate); +- indexToModify += lwr->toInteger(); +- } +- if (aggregate->op == TOKarrayliteral) +- existingAE = (ArrayLiteralExp *)aggregate; +- else if (aggregate->op == TOKstring) +- existingSE = (StringExp *)aggregate; +- else ++ } ++ if (aggregate->op == TOKvar) ++ { ++ VarExp *ve = (VarExp *)aggregate; ++ VarDeclaration *v = ve->var->isVarDeclaration(); ++ aggregate = v->getValue(); ++ if (aggregate->op == TOKnull) + { +- error("CTFE internal compiler error %s", aggregate->toChars()); +- return EXP_CANT_INTERPRET; ++ // This would be a runtime segfault ++ originalExp->error("cannot index null array %s", v->toChars()); ++ return false; + } +- if (!wantRef && newval->op == TOKslice) ++ } ++ if (aggregate->op == TOKslice) ++ { ++ SliceExp *sexp = (SliceExp *)aggregate; ++ aggregate = sexp->e1; ++ Expression *lwr = sexp->lwr->interpret(istate); ++ indexToModify += lwr->toInteger(); ++ } ++ if (aggregate->op == TOKarrayliteral) ++ existingAE = (ArrayLiteralExp *)aggregate; ++ else if (aggregate->op == TOKstring) ++ existingSE = (StringExp *)aggregate; ++ else ++ { ++ originalExp->error("CTFE internal compiler error %s", aggregate->toChars()); ++ return false; ++ } ++ if (!wantRef && newval->op == TOKslice) ++ { ++ newval = resolveSlice(newval); ++ if (newval == EXP_CANT_INTERPRET) + { +- newval = resolveSlice(newval); +- if (newval == EXP_CANT_INTERPRET) +- { +- error("Compiler error: CTFE index assign %s", toChars()); +- assert(0); +- } +- } +- if (wantRef && newval->op == TOKindex +- && ((IndexExp *)newval)->e1 == aggregate) +- { // It's a circular reference, resolve it now +- newval = newval->interpret(istate); ++ originalExp->error("Compiler error: CTFE index assign %s", originalExp->toChars()); ++ assert(0); + } ++ } ++ if (wantRef && newval->op == TOKindex ++ && ((IndexExp *)newval)->e1 == aggregate) ++ { // It's a circular reference, resolve it now ++ newval = newval->interpret(istate); ++ } + +- if (existingAE) +- { +- if (newval->op == TOKstructliteral) +- assignInPlace((Expression *)(existingAE->elements->tdata()[indexToModify]), newval); +- else +- existingAE->elements->tdata()[indexToModify] = newval; +- return returnValue; +- } +- if (existingSE) ++ if (existingAE) ++ { ++ if (newval->op == TOKstructliteral) ++ assignInPlace((*existingAE->elements)[indexToModify], newval); ++ else ++ (*existingAE->elements)[indexToModify] = newval; ++ return true; ++ } ++ if (existingSE) ++ { ++ utf8_t *s = (utf8_t *)existingSE->string; ++ if (!existingSE->ownedByCtfe) + { +- unsigned char *s = (unsigned char *)existingSE->string; +- if (!existingSE->ownedByCtfe) +- { +- error("cannot modify read-only string literal %s", ie->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- unsigned value = newval->toInteger(); +- switch (existingSE->sz) +- { +- case 1: s[indexToModify] = value; break; +- case 2: ((unsigned short *)s)[indexToModify] = value; break; +- case 4: ((unsigned *)s)[indexToModify] = value; break; +- default: +- assert(0); +- break; +- } +- return returnValue; ++ originalExp->error("cannot modify read-only string literal %s", ie->e1->toChars()); ++ return false; + } +- else ++ unsigned value = newval->toInteger(); ++ switch (existingSE->sz) + { +- error("Index assignment %s is not yet supported in CTFE ", toChars()); +- return EXP_CANT_INTERPRET; ++ case 1: s[indexToModify] = value; break; ++ case 2: ((unsigned short *)s)[indexToModify] = value; break; ++ case 4: ((unsigned *)s)[indexToModify] = value; break; ++ default: ++ assert(0); ++ break; + } +- return returnValue; ++ return true; + } +- else if (e1->op == TOKslice) ++ else + { +- // ------------------------------ +- // aggregate[] = newval +- // aggregate[low..upp] = newval +- // ------------------------------ +- SliceExp * sexp = (SliceExp *)e1; +- // Set the $ variable +- Expression *oldval = sexp->e1; +- bool assignmentToSlicedPointer = false; +- if (isPointer(oldval->type)) +- { // Slicing a pointer +- oldval = oldval->interpret(istate, ctfeNeedLvalue); +- if (exceptionOrCantInterpret(oldval)) +- return oldval; +- dinteger_t ofs; +- oldval = getAggregateFromPointer(oldval, &ofs); +- assignmentToSlicedPointer = true; +- } else +- oldval = oldval->interpret(istate); ++ originalExp->error("Index assignment %s is not yet supported in CTFE ", originalExp->toChars()); ++ return false; ++ } ++ return true; ++} + +- if (oldval->op != TOKarrayliteral && oldval->op != TOKstring +- && oldval->op != TOKslice && oldval->op != TOKnull) ++/************* ++ * Deal with assignments of the form ++ * dest[] = newval ++ * dest[low..upp] = newval ++ * where newval has already been interpreted ++ * ++ * This could be a slice assignment or a block assignment, and ++ * dest could be either an array literal, or a string. ++ * ++ * Returns EXP_CANT_INTERPRET on failure. If there are no errors, ++ * it returns aggregate[low..upp], except that as an optimisation, ++ * if goal == ctfeNeedNothing, it will return NULL ++ */ ++ ++Expression *interpretAssignToSlice(InterState *istate, CtfeGoal goal, Loc loc, ++ SliceExp *sexp, Expression *newval, bool wantRef, bool isBlockAssignment, ++ BinExp *originalExp) ++{ ++ Expression *e2 = originalExp->e2; ++ ++ // ------------------------------ ++ // aggregate[] = newval ++ // aggregate[low..upp] = newval ++ // ------------------------------ ++ // Set the $ variable ++ Expression *oldval = sexp->e1; ++ bool assignmentToSlicedPointer = false; ++ if (isPointer(oldval->type)) ++ { // Slicing a pointer ++ oldval = oldval->interpret(istate, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(oldval)) ++ return oldval; ++ dinteger_t ofs; ++ oldval = getAggregateFromPointer(oldval, &ofs); ++ assignmentToSlicedPointer = true; ++ } ++ else ++ oldval = oldval->interpret(istate); ++ ++ if (oldval->op != TOKarrayliteral && oldval->op != TOKstring ++ && oldval->op != TOKslice && oldval->op != TOKnull) ++ { ++ if (oldval->op == TOKsymoff) + { +- if (assignmentToSlicedPointer) +- { +- error("pointer %s cannot be sliced at compile time (it does not point to an array)", +- sexp->e1->toChars()); +- } +- else +- error("CTFE ICE: cannot resolve array length"); ++ originalExp->error("pointer %s cannot be sliced at compile time (it points to a static variable)", sexp->e1->toChars()); + return EXP_CANT_INTERPRET; + } +- uinteger_t dollar = resolveArrayLength(oldval); +- if (sexp->lengthVar) ++ if (assignmentToSlicedPointer) + { +- Expression *arraylen = new IntegerExp(loc, dollar, Type::tsize_t); +- ctfeStack.push(sexp->lengthVar); +- sexp->lengthVar->setValue(arraylen); +- } +- +- Expression *upper = NULL; +- Expression *lower = NULL; +- if (sexp->upr) +- upper = sexp->upr->interpret(istate); +- if (exceptionOrCantInterpret(upper)) +- { +- if (sexp->lengthVar) +- ctfeStack.pop(sexp->lengthVar); // $ is defined only in [L..U] +- return upper; ++ originalExp->error("pointer %s cannot be sliced at compile time (it does not point to an array)", ++ sexp->e1->toChars()); + } +- if (sexp->lwr) +- lower = sexp->lwr->interpret(istate); ++ else ++ originalExp->error("CTFE ICE: cannot resolve array length"); ++ return EXP_CANT_INTERPRET; ++ } ++ uinteger_t dollar = resolveArrayLength(oldval); ++ if (sexp->lengthVar) ++ { ++ Expression *arraylen = new IntegerExp(loc, dollar, Type::tsize_t); ++ ctfeStack.push(sexp->lengthVar); ++ sexp->lengthVar->setValue(arraylen); ++ } ++ ++ Expression *upper = NULL; ++ Expression *lower = NULL; ++ if (sexp->upr) ++ upper = sexp->upr->interpret(istate); ++ if (exceptionOrCantInterpret(upper)) ++ { + if (sexp->lengthVar) + ctfeStack.pop(sexp->lengthVar); // $ is defined only in [L..U] +- if (exceptionOrCantInterpret(lower)) +- return lower; +- +- size_t dim = dollar; +- size_t upperbound = upper ? upper->toInteger() : dim; +- int lowerbound = lower ? lower->toInteger() : 0; ++ return upper; ++ } ++ if (sexp->lwr) ++ lower = sexp->lwr->interpret(istate); ++ if (sexp->lengthVar) ++ ctfeStack.pop(sexp->lengthVar); // $ is defined only in [L..U] ++ if (exceptionOrCantInterpret(lower)) ++ return lower; ++ ++ size_t dim = dollar; ++ size_t upperbound = upper ? upper->toInteger() : dim; ++ int lowerbound = lower ? lower->toInteger() : 0; + +- if (!assignmentToSlicedPointer && (((int)lowerbound < 0) || (upperbound > dim))) +- { +- error("Array bounds [0..%d] exceeded in slice [%d..%d]", +- dim, lowerbound, upperbound); +- return EXP_CANT_INTERPRET; +- } +- if (upperbound == lowerbound) +- return newval; ++ if (!assignmentToSlicedPointer && (((int)lowerbound < 0) || (upperbound > dim))) ++ { ++ originalExp->error("Array bounds [0..%d] exceeded in slice [%d..%d]", ++ dim, lowerbound, upperbound); ++ return EXP_CANT_INTERPRET; ++ } ++ if (upperbound == lowerbound) ++ return newval; + +- Expression *aggregate = resolveReferences(((SliceExp *)e1)->e1, istate->localThis); +- dinteger_t firstIndex = lowerbound; ++ Expression *aggregate = resolveReferences(sexp->e1); ++ sinteger_t firstIndex = lowerbound; + +- ArrayLiteralExp *existingAE = NULL; +- StringExp *existingSE = NULL; ++ ArrayLiteralExp *existingAE = NULL; ++ StringExp *existingSE = NULL; + +- /* The only possible slicable LValue aggregates are array literals, +- * and slices of array literals. +- */ ++ /* The only possible slicable LValue aggregates are array literals, ++ * and slices of array literals. ++ */ + +- if (aggregate->op == TOKindex || aggregate->op == TOKdotvar || +- aggregate->op == TOKslice || +- aggregate->op == TOKstar || aggregate->op == TOKcall) +- { +- aggregate = aggregate->interpret(istate, ctfeNeedLvalue); +- if (exceptionOrCantInterpret(aggregate)) +- return aggregate; +- // The array could be an index of an AA. Resolve it if so. +- if (aggregate->op == TOKindex && +- ((IndexExp *)aggregate)->e1->op == TOKassocarrayliteral) +- { +- IndexExp *ix = (IndexExp *)aggregate; +- aggregate = findKeyInAA(loc, (AssocArrayLiteralExp *)ix->e1, ix->e2); +- if (!aggregate) +- { +- error("key %s not found in associative array %s", +- ix->e2->toChars(), ix->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- if (exceptionOrCantInterpret(aggregate)) +- return aggregate; +- } +- } +- if (aggregate->op == TOKvar) +- { +- VarExp *ve = (VarExp *)(aggregate); +- VarDeclaration *v = ve->var->isVarDeclaration(); +- aggregate = v->getValue(); +- } +- if (aggregate->op == TOKslice) +- { // Slice of a slice --> change the bounds +- SliceExp *sexpold = (SliceExp *)aggregate; +- sinteger_t hi = upperbound + sexpold->lwr->toInteger(); +- firstIndex = lowerbound + sexpold->lwr->toInteger(); +- if (hi > sexpold->upr->toInteger()) +- { +- error("slice [%d..%d] exceeds array bounds [0..%lld]", +- lowerbound, upperbound, +- sexpold->upr->toInteger() - sexpold->lwr->toInteger()); +- return EXP_CANT_INTERPRET; +- } +- aggregate = sexpold->e1; +- } +- if ( isPointer(aggregate->type) ) +- { // Slicing a pointer --> change the bounds +- aggregate = sexp->e1->interpret(istate, ctfeNeedLvalue); +- dinteger_t ofs; +- aggregate = getAggregateFromPointer(aggregate, &ofs); +- if (aggregate->op == TOKnull) +- { +- error("cannot slice null pointer %s", sexp->e1->toChars()); +- return EXP_CANT_INTERPRET; +- } +- sinteger_t hi = upperbound + ofs; +- firstIndex = lowerbound + ofs; +- if (firstIndex < 0 || hi > dim) ++ if (aggregate->op == TOKindex || aggregate->op == TOKdotvar || ++ aggregate->op == TOKslice || aggregate->op == TOKcast || ++ aggregate->op == TOKstar || aggregate->op == TOKcall) ++ { ++ aggregate = aggregate->interpret(istate, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(aggregate)) ++ return aggregate; ++ // The array could be an index of an AA. Resolve it if so. ++ if (aggregate->op == TOKindex && ++ ((IndexExp *)aggregate)->e1->op == TOKassocarrayliteral) ++ { ++ IndexExp *ix = (IndexExp *)aggregate; ++ aggregate = findKeyInAA(loc, (AssocArrayLiteralExp *)ix->e1, ix->e2); ++ if (!aggregate) + { +- error("slice [lld..%lld] exceeds memory block bounds [0..%lld]", +- firstIndex, hi, dim); ++ originalExp->error("key %s not found in associative array %s", ++ ix->e2->toChars(), ix->e1->toChars()); + return EXP_CANT_INTERPRET; + } ++ if (exceptionOrCantInterpret(aggregate)) ++ return aggregate; + } +- if (aggregate->op == TOKarrayliteral) +- existingAE = (ArrayLiteralExp *)aggregate; +- else if (aggregate->op == TOKstring) +- existingSE = (StringExp *)aggregate; +- if (existingSE && !existingSE->ownedByCtfe) +- { error("cannot modify read-only string literal %s", sexp->e1->toChars()); ++ } ++ if (aggregate->op == TOKvar) ++ { ++ VarExp *ve = (VarExp *)(aggregate); ++ VarDeclaration *v = ve->var->isVarDeclaration(); ++ aggregate = v->getValue(); ++ } ++ if (aggregate->op == TOKslice) ++ { // Slice of a slice --> change the bounds ++ SliceExp *sexpold = (SliceExp *)aggregate; ++ sinteger_t hi = upperbound + sexpold->lwr->toInteger(); ++ firstIndex = lowerbound + sexpold->lwr->toInteger(); ++ if (hi > sexpold->upr->toInteger()) ++ { ++ originalExp->error("slice [%d..%d] exceeds array bounds [0..%lld]", ++ lowerbound, upperbound, ++ sexpold->upr->toInteger() - sexpold->lwr->toInteger()); + return EXP_CANT_INTERPRET; + } +- +- if (!wantRef && newval->op == TOKslice) ++ aggregate = sexpold->e1; ++ } ++ if ( isPointer(aggregate->type) ) ++ { // Slicing a pointer --> change the bounds ++ aggregate = sexp->e1->interpret(istate, ctfeNeedLvalue); ++ dinteger_t ofs; ++ aggregate = getAggregateFromPointer(aggregate, &ofs); ++ if (aggregate->op == TOKnull) + { +- newval = resolveSlice(newval); +- if (newval == EXP_CANT_INTERPRET) +- { +- error("Compiler error: CTFE slice %s", toChars()); +- assert(0); +- } +- } +- if (wantRef && newval->op == TOKindex +- && ((IndexExp *)newval)->e1 == aggregate) +- { // It's a circular reference, resolve it now +- newval = newval->interpret(istate); ++ originalExp->error("cannot slice null pointer %s", sexp->e1->toChars()); ++ return EXP_CANT_INTERPRET; + } +- +- // For slice assignment, we check that the lengths match. +- size_t srclen = 0; +- if (newval->op == TOKarrayliteral) +- srclen = ((ArrayLiteralExp *)newval)->elements->dim; +- else if (newval->op == TOKstring) +- srclen = ((StringExp *)newval)->len; +- if (!isBlockAssignment && srclen != (upperbound - lowerbound)) ++ sinteger_t hi = upperbound + ofs; ++ firstIndex = lowerbound + ofs; ++ if (firstIndex < 0 || hi > dim) + { +- error("Array length mismatch assigning [0..%d] to [%d..%d]", srclen, lowerbound, upperbound); ++ originalExp->error("slice [lld..%lld] exceeds memory block bounds [0..%lld]", ++ firstIndex, hi, dim); + return EXP_CANT_INTERPRET; + } ++ } ++ if (aggregate->op == TOKarrayliteral) ++ existingAE = (ArrayLiteralExp *)aggregate; ++ else if (aggregate->op == TOKstring) ++ existingSE = (StringExp *)aggregate; ++ if (existingSE && !existingSE->ownedByCtfe) ++ { originalExp->error("cannot modify read-only string literal %s", sexp->e1->toChars()); ++ return EXP_CANT_INTERPRET; ++ } + +- if (!isBlockAssignment && newval->op == TOKarrayliteral && existingAE) ++ if (!wantRef && newval->op == TOKslice) ++ { ++ Expression *orignewval = newval; ++ newval = resolveSlice(newval); ++ if (newval == EXP_CANT_INTERPRET) + { +- Expressions *oldelems = existingAE->elements; +- Expressions *newelems = ((ArrayLiteralExp *)newval)->elements; +- for (size_t j = 0; j < newelems->dim; j++) +- { +- oldelems->tdata()[j + firstIndex] = newelems->tdata()[j]; +- } +- return newval; ++ originalExp->error("Compiler error: CTFE slice %s", orignewval->toChars()); ++ assert(0); + } +- else if (newval->op == TOKstring && existingSE) ++ } ++ if (wantRef && newval->op == TOKindex ++ && ((IndexExp *)newval)->e1 == aggregate) ++ { // It's a circular reference, resolve it now ++ newval = newval->interpret(istate); ++ } ++ ++ // For slice assignment, we check that the lengths match. ++ size_t srclen = 0; ++ if (newval->op == TOKarrayliteral) ++ srclen = ((ArrayLiteralExp *)newval)->elements->dim; ++ else if (newval->op == TOKstring) ++ srclen = ((StringExp *)newval)->len; ++ if (!isBlockAssignment && srclen != (upperbound - lowerbound)) ++ { ++ originalExp->error("Array length mismatch assigning [0..%d] to [%d..%d]", srclen, lowerbound, upperbound); ++ return EXP_CANT_INTERPRET; ++ } ++ ++ if (!isBlockAssignment && newval->op == TOKarrayliteral && existingAE) ++ { ++ Expressions *oldelems = existingAE->elements; ++ Expressions *newelems = ((ArrayLiteralExp *)newval)->elements; ++ Type *elemtype = existingAE->type->nextOf(); ++ for (size_t j = 0; j < newelems->dim; j++) + { +- sliceAssignStringFromString((StringExp *)existingSE, (StringExp *)newval, firstIndex); +- return newval; +- } +- else if (newval->op == TOKstring && existingAE +- && existingAE->type->isString()) +- { /* Mixed slice: it was initialized as an array literal of chars. +- * Now a slice of it is being set with a string. +- */ +- sliceAssignArrayLiteralFromString(existingAE, (StringExp *)newval, firstIndex); +- return newval; +- } +- else if (newval->op == TOKarrayliteral && existingSE) +- { /* Mixed slice: it was initialized as a string literal. +- * Now a slice of it is being set with an array literal. +- */ +- sliceAssignStringFromArrayLiteral(existingSE, (ArrayLiteralExp *)newval, firstIndex); +- return newval; ++ (*oldelems)[j + firstIndex] = paintTypeOntoLiteral(elemtype, (*newelems)[j]); + } +- else if (existingSE) +- { // String literal block slice assign +- unsigned value = newval->toInteger(); +- unsigned char *s = (unsigned char *)existingSE->string; +- for (size_t j = 0; j < upperbound-lowerbound; j++) ++ return newval; ++ } ++ else if (newval->op == TOKstring && existingSE) ++ { ++ sliceAssignStringFromString((StringExp *)existingSE, (StringExp *)newval, firstIndex); ++ return newval; ++ } ++ else if (newval->op == TOKstring && existingAE ++ && existingAE->type->isString()) ++ { /* Mixed slice: it was initialized as an array literal of chars. ++ * Now a slice of it is being set with a string. ++ */ ++ sliceAssignArrayLiteralFromString(existingAE, (StringExp *)newval, firstIndex); ++ return newval; ++ } ++ else if (newval->op == TOKarrayliteral && existingSE) ++ { /* Mixed slice: it was initialized as a string literal. ++ * Now a slice of it is being set with an array literal. ++ */ ++ sliceAssignStringFromArrayLiteral(existingSE, (ArrayLiteralExp *)newval, firstIndex); ++ return newval; ++ } ++ else if (existingSE) ++ { // String literal block slice assign ++ unsigned value = newval->toInteger(); ++ utf8_t *s = (utf8_t *)existingSE->string; ++ for (size_t j = 0; j < upperbound-lowerbound; j++) ++ { ++ switch (existingSE->sz) + { +- switch (existingSE->sz) +- { +- case 1: s[j+firstIndex] = value; break; +- case 2: ((unsigned short *)s)[j+firstIndex] = value; break; +- case 4: ((unsigned *)s)[j+firstIndex] = value; break; +- default: +- assert(0); +- break; +- } ++ case 1: s[j+firstIndex] = value; break; ++ case 2: ((unsigned short *)s)[j+firstIndex] = value; break; ++ case 4: ((unsigned *)s)[j+firstIndex] = value; break; ++ default: ++ assert(0); ++ break; + } +- if (goal == ctfeNeedNothing) +- return NULL; // avoid creating an unused literal +- SliceExp *retslice = new SliceExp(loc, existingSE, +- new IntegerExp(loc, firstIndex, Type::tsize_t), +- new IntegerExp(loc, firstIndex + upperbound-lowerbound, Type::tsize_t)); +- retslice->type = this->type; +- return retslice->interpret(istate); +- } +- else if (existingAE) +- { +- /* Block assignment, initialization of static arrays +- * x[] = e +- * x may be a multidimensional static array. (Note that this +- * only happens with array literals, never with strings). +- */ +- Expressions * w = existingAE->elements; +- assert( existingAE->type->ty == Tsarray || +- existingAE->type->ty == Tarray); ++ } ++ if (goal == ctfeNeedNothing) ++ return NULL; // avoid creating an unused literal ++ SliceExp *retslice = new SliceExp(loc, existingSE, ++ new IntegerExp(loc, firstIndex, Type::tsize_t), ++ new IntegerExp(loc, firstIndex + upperbound-lowerbound, Type::tsize_t)); ++ retslice->type = originalExp->type; ++ return retslice->interpret(istate); ++ } ++ else if (existingAE) ++ { ++ /* Block assignment, initialization of static arrays ++ * x[] = e ++ * x may be a multidimensional static array. (Note that this ++ * only happens with array literals, never with strings). ++ */ ++ Expressions * w = existingAE->elements; ++ assert( existingAE->type->ty == Tsarray || ++ existingAE->type->ty == Tarray); + #if DMDV2 +- Type *desttype = ((TypeArray *)existingAE->type)->next->castMod(0); +- bool directblk = (e2->type->toBasetype()->castMod(0)) == desttype; ++ Type *desttype = ((TypeArray *)existingAE->type)->next->castMod(0); ++ bool directblk = (e2->type->toBasetype()->castMod(0))->equals(desttype); + #else +- Type *desttype = ((TypeArray *)existingAE->type)->next; +- bool directblk = (e2->type->toBasetype()) == desttype; ++ Type *desttype = ((TypeArray *)existingAE->type)->next; ++ bool directblk = (e2->type->toBasetype())->equals(desttype); + #endif +- bool cow = !(newval->op == TOKstructliteral || newval->op == TOKarrayliteral +- || newval->op == TOKstring); +- for (size_t j = 0; j < upperbound-lowerbound; j++) +- { +- if (!directblk) +- // Multidimensional array block assign +- recursiveBlockAssign((ArrayLiteralExp *)w->tdata()[j+firstIndex], newval, wantRef); ++ bool cow = !(newval->op == TOKstructliteral || newval->op == TOKarrayliteral ++ || newval->op == TOKstring); ++ for (size_t j = 0; j < upperbound-lowerbound; j++) ++ { ++ if (!directblk) ++ // Multidimensional array block assign ++ recursiveBlockAssign((ArrayLiteralExp *)(*w)[j+firstIndex], newval, wantRef); ++ else ++ { ++ if (wantRef || cow) ++ (*existingAE->elements)[j+firstIndex] = newval; + else +- { +- if (wantRef || cow) +- existingAE->elements->tdata()[j+firstIndex] = newval; +- else +- assignInPlace(existingAE->elements->tdata()[j+firstIndex], newval); +- } ++ assignInPlace((*existingAE->elements)[j+firstIndex], newval); + } +- if (goal == ctfeNeedNothing) +- return NULL; // avoid creating an unused literal +- SliceExp *retslice = new SliceExp(loc, existingAE, +- new IntegerExp(loc, firstIndex, Type::tsize_t), +- new IntegerExp(loc, firstIndex + upperbound-lowerbound, Type::tsize_t)); +- retslice->type = this->type; +- return retslice->interpret(istate); + } +- else +- error("Slice operation %s cannot be evaluated at compile time", toChars()); ++ if (goal == ctfeNeedNothing) ++ return NULL; // avoid creating an unused literal ++ SliceExp *retslice = new SliceExp(loc, existingAE, ++ new IntegerExp(loc, firstIndex, Type::tsize_t), ++ new IntegerExp(loc, firstIndex + upperbound-lowerbound, Type::tsize_t)); ++ retslice->type = originalExp->type; ++ return retslice->interpret(istate); + } + else + { +- error("%s cannot be evaluated at compile time", toChars()); ++ originalExp->error("Slice operation %s = %s cannot be evaluated at compile time", sexp->toChars(), newval->toChars()); ++ return EXP_CANT_INTERPRET; + } +- return returnValue; + } + + Expression *AssignExp::interpret(InterState *istate, CtfeGoal goal) +@@ -3509,29 +4266,30 @@ Expression *AssignExp::interpret(InterSt + return interpretAssignCommon(istate, goal, NULL); + } + +-#define BIN_ASSIGN_INTERPRET_CTFE(op, ctfeOp) \ +-Expression *op##AssignExp::interpret(InterState *istate, CtfeGoal goal) \ +-{ \ +- return interpretAssignCommon(istate, goal, &ctfeOp); \ +-} +- +-#define BIN_ASSIGN_INTERPRET(op) BIN_ASSIGN_INTERPRET_CTFE(op, op) +- +-BIN_ASSIGN_INTERPRET(Add) +-BIN_ASSIGN_INTERPRET(Min) +-BIN_ASSIGN_INTERPRET_CTFE(Cat, ctfeCat) +-BIN_ASSIGN_INTERPRET(Mul) +-BIN_ASSIGN_INTERPRET(Div) +-BIN_ASSIGN_INTERPRET(Mod) +-BIN_ASSIGN_INTERPRET(Shl) +-BIN_ASSIGN_INTERPRET(Shr) +-BIN_ASSIGN_INTERPRET(Ushr) +-BIN_ASSIGN_INTERPRET(And) +-BIN_ASSIGN_INTERPRET(Or) +-BIN_ASSIGN_INTERPRET(Xor) ++Expression *BinAssignExp::interpret(InterState *istate, CtfeGoal goal) ++{ ++ switch(op) ++ { ++ case TOKaddass: return interpretAssignCommon(istate, goal, &Add); ++ case TOKminass: return interpretAssignCommon(istate, goal, &Min); ++ case TOKcatass: return interpretAssignCommon(istate, goal, &ctfeCat); ++ case TOKmulass: return interpretAssignCommon(istate, goal, &Mul); ++ case TOKdivass: return interpretAssignCommon(istate, goal, &Div); ++ case TOKmodass: return interpretAssignCommon(istate, goal, &Mod); ++ case TOKshlass: return interpretAssignCommon(istate, goal, &Shl); ++ case TOKshrass: return interpretAssignCommon(istate, goal, &Shr); ++ case TOKushrass: return interpretAssignCommon(istate, goal, &Ushr); ++ case TOKandass: return interpretAssignCommon(istate, goal, &And); ++ case TOKorass: return interpretAssignCommon(istate, goal, &Or); ++ case TOKxorass: return interpretAssignCommon(istate, goal, &Xor); + #if DMDV2 +-BIN_ASSIGN_INTERPRET(Pow) ++ case TOKpowass: return interpretAssignCommon(istate, goal, &Pow); + #endif ++ default: ++ assert(0); ++ return NULL; ++ } ++} + + Expression *PostExp::interpret(InterState *istate, CtfeGoal goal) + { +@@ -3891,7 +4649,7 @@ Expression *CallExp::interpret(InterStat + Expression * pe = ((PtrExp*)ecall)->e1; + if (pe->op == TOKvar) { + VarDeclaration *vd = ((VarExp *)((PtrExp*)ecall)->e1)->var->isVarDeclaration(); +- if (vd && vd->getValue() && vd->getValue()->op == TOKsymoff) ++ if (vd && vd->hasValue() && vd->getValue()->op == TOKsymoff) + fd = ((SymOffExp *)vd->getValue())->var->isFuncDeclaration(); + else + { +@@ -3932,7 +4690,7 @@ Expression *CallExp::interpret(InterStat + else if (ecall->op == TOKvar) + { + VarDeclaration *vd = ((VarExp *)ecall)->var->isVarDeclaration(); +- if (vd && vd->getValue()) ++ if (vd && vd->hasValue()) + ecall = vd->getValue(); + else // Calling a function + fd = ((VarExp *)e1)->var->isFuncDeclaration(); +@@ -3953,7 +4711,7 @@ Expression *CallExp::interpret(InterStat + + TypeFunction *tf = fd ? (TypeFunction *)(fd->type) : NULL; + if (!tf) +- { // DAC: This should never happen, it's an internal compiler error. ++ { // This should never happen, it's an internal compiler error. + //printf("ecall=%s %d %d\n", ecall->toChars(), ecall->op, TOKcall); + if (ecall->op == TOKidentifier) + error("cannot evaluate %s at compile time. Circular reference?", toChars()); +@@ -3982,12 +4740,25 @@ Expression *CallExp::interpret(InterStat + { // Make a virtual function call. + Expression *thisval = pthis; + if (pthis->op == TOKvar) +- { assert(((VarExp*)thisval)->var->isVarDeclaration()); +- thisval = ((VarExp*)thisval)->var->isVarDeclaration()->getValue(); ++ { ++ VarDeclaration *vthis = ((VarExp*)thisval)->var->isVarDeclaration(); ++ assert(vthis); ++ thisval = getVarExp(loc, istate, vthis, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(thisval)) ++ return thisval; + // If it is a reference, resolve it + if (thisval->op != TOKnull && thisval->op != TOKclassreference) + thisval = pthis->interpret(istate); + } ++ else if (pthis->op == TOKsymoff) ++ { ++ VarDeclaration *vthis = ((SymOffExp*)thisval)->var->isVarDeclaration(); ++ assert(vthis); ++ thisval = getVarExp(loc, istate, vthis, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(thisval)) ++ return thisval; ++ } ++ + // Get the function from the vtable of the original class + ClassDeclaration *cd; + if (thisval && thisval->op == TOKnull) +@@ -4036,6 +4807,8 @@ Expression *CallExp::interpret(InterStat + } + return e; + } ++ if (fd->dArrayOp) ++ return fd->dArrayOp->interpret(istate, arguments, pthis); + if (!fd->fbody) + { + error("%s cannot be interpreted at compile time," +@@ -4070,7 +4843,7 @@ Expression *CommaExp::interpret(InterSta + InterState istateComma; + if (!istate && firstComma->e1->op == TOKdeclaration) + { +- ctfeStack.startFrame(); ++ ctfeStack.startFrame(NULL); + istate = &istateComma; + } + +@@ -4098,7 +4871,7 @@ Expression *CommaExp::interpret(InterSta + if (exceptionOrCantInterpret(newval)) + { + if (istate == &istateComma) +- ctfeStack.endFrame(0); ++ ctfeStack.endFrame(); + return newval; + } + if (newval != EXP_VOID_INTERPRET) +@@ -4120,7 +4893,7 @@ Expression *CommaExp::interpret(InterSta + } + // If we created a temporary stack frame, end it now. + if (istate == &istateComma) +- ctfeStack.endFrame(0); ++ ctfeStack.endFrame(); + return e; + } + +@@ -4132,7 +4905,7 @@ Expression *CondExp::interpret(InterStat + Expression *e; + if ( isPointer(econd->type) ) + { +- e = econd->interpret(istate, ctfeNeedLvalue); ++ e = econd->interpret(istate); + if (exceptionOrCantInterpret(e)) + return e; + if (e->op != TOKnull) +@@ -4211,22 +4984,40 @@ Expression *IndexExp::interpret(InterSta + { + dinteger_t len = ArrayLength(Type::tsize_t, agg)->toInteger(); + //Type *pointee = ((TypePointer *)agg->type)->next; +- if ((indx + ofs) < 0 || (indx+ofs) > len) ++ if ((sinteger_t)(indx + ofs) < 0 || (indx+ofs) > len) + { + error("pointer index [%lld] exceeds allocated memory block [0..%lld]", + indx+ofs, len); + return EXP_CANT_INTERPRET; + } ++ if (goal == ctfeNeedLvalueRef) ++ { ++ // if we need a reference, IndexExp shouldn't be interpreting ++ // the expression to a value, it should stay as a reference ++ Expression *e = new IndexExp(loc, agg, ++ ofs ? new IntegerExp(loc,indx + ofs, e2->type) : e2); ++ e->type = type; ++ return e; ++ } + return ctfeIndex(loc, type, agg, indx+ofs); + } + else + { // Pointer to a non-array variable ++ if (agg->op == TOKsymoff) ++ { ++ error("mutable variable %s cannot be read at compile time, even through a pointer", ((SymOffExp *)agg)->var->toChars()); ++ return EXP_CANT_INTERPRET; ++ } + if ((indx + ofs) != 0) + { + error("pointer index [%lld] lies outside memory block [0..1]", + indx+ofs); + return EXP_CANT_INTERPRET; + } ++ if (goal == ctfeNeedLvalueRef) ++ { ++ return paintTypeOntoLiteral(type, agg); ++ } + return agg->interpret(istate); + } + } +@@ -4239,7 +5030,7 @@ Expression *IndexExp::interpret(InterSta + + if (e1->op == TOKnull) + { +- if (goal == ctfeNeedLvalue && e1->type->ty == Taarray) ++ if (goal == ctfeNeedLvalue && e1->type->ty == Taarray && modifiable) + return paintTypeOntoLiteral(type, e1); + error("cannot index null array %s", this->e1->toChars()); + return EXP_CANT_INTERPRET; +@@ -4374,6 +5165,11 @@ Expression *SliceExp::interpret(InterSta + error("cannot slice null pointer %s", this->e1->toChars()); + return EXP_CANT_INTERPRET; + } ++ if (agg->op == TOKsymoff) ++ { ++ error("slicing pointers to static variables is not supported in CTFE"); ++ return EXP_CANT_INTERPRET; ++ } + if (agg->op != TOKarrayliteral && agg->op != TOKstring) + { + error("pointer %s cannot be sliced at compile time (it does not point to an array)", +@@ -4633,7 +5429,7 @@ Expression *CastExp::interpret(InterStat + e->type = type; + return e; + } +- if (e1->op == TOKindex && ((IndexExp *)e1)->e1->type != e1->type) ++ if (e1->op == TOKindex && !((IndexExp *)e1)->e1->type->equals(e1->type)) + { // type painting operation + IndexExp *ie = (IndexExp *)e1; + e = new IndexExp(e1->loc, ie->e1, ie->e2); +@@ -4647,7 +5443,7 @@ Expression *CastExp::interpret(InterStat + { ArrayLiteralExp *ale = (ArrayLiteralExp *)ie->e1; + uinteger_t indx = ie->e2->toInteger(); + if (indx < ale->elements->dim) +- xx = ale->elements->tdata()[indx]; ++ xx = (*ale->elements)[indx]; + } + if (xx && xx->op == TOKindex) + origType = ((IndexExp *)xx)->e1->type->nextOf(); +@@ -4667,7 +5463,7 @@ Expression *CastExp::interpret(InterStat + } + if (e1->op == TOKaddress) + { +- Type *origType = ((AddrExp *)e1)->type; ++ Type *origType = ((AddrExp *)e1)->e1->type; + if (isSafePointerCast(origType, pointee)) + { + e = new AddrExp(loc, ((AddrExp *)e1)->e1); +@@ -4675,17 +5471,21 @@ Expression *CastExp::interpret(InterStat + return e; + } + } +- if (e1->op == TOKvar) ++ if (e1->op == TOKvar || e1->op == TOKsymoff) + { // type painting operation +- Type *origType = ((VarExp *)e1)->var->type; ++ Type *origType = (e1->op == TOKvar) ? ((VarExp *)e1)->var->type : ++ ((SymOffExp *)e1)->var->type; + if (castBackFromVoid && !isSafePointerCast(origType, pointee)) + { + error("using void* to reinterpret cast from %s* to %s* is not supported in CTFE", + origType->toChars(), pointee->toChars()); + return EXP_CANT_INTERPRET; + } +- e = new VarExp(loc, ((VarExp *)e1)->var); +- e->type = type; ++ if (e1->op == TOKvar) ++ e = new VarExp(loc, ((VarExp *)e1)->var); ++ else ++ e = new SymOffExp(loc, ((SymOffExp *)e1)->var, ((SymOffExp *)e1)->offset); ++ e->type = to; + return e; + } + +@@ -4768,17 +5568,14 @@ Expression *AssertExp::interpret(InterSt + } + else + error("%s failed", toChars()); +- goto Lcant; ++ return EXP_CANT_INTERPRET; + } + else + { + error("%s is not a compile-time boolean expression", e1->toChars()); +- goto Lcant; ++ return EXP_CANT_INTERPRET; + } + return e1; +- +-Lcant: +- return EXP_CANT_INTERPRET; + } + + Expression *PtrExp::interpret(InterState *istate, CtfeGoal goal) +@@ -4827,12 +5624,39 @@ Expression *PtrExp::interpret(InterState + #else // this is required for D1, where structs return *this instead of 'this'. + else if (e1->op == TOKthis) + { +- if(istate->localThis) +- return istate->localThis->interpret(istate); ++ if (ctfeStack.getThis()) ++ return ctfeStack.getThis()->interpret(istate); + } + #endif + else +- { // It's possible we have an array bounds error. We need to make sure it ++ { ++ // Check for .classinfo, which is lowered in the semantic pass into **(class). ++ if (e1->op == TOKstar && e1->type->ty == Tpointer && isTypeInfo_Class(e1->type->nextOf())) ++ { ++ e = (((PtrExp *)e1)->e1)->interpret(istate, ctfeNeedLvalue); ++ if (exceptionOrCantInterpret(e)) ++ return e; ++ if (e->op == TOKnull) ++ { ++ error("Null pointer dereference evaluating typeid. '%s' is null", ((PtrExp *)e1)->e1->toChars()); ++ return EXP_CANT_INTERPRET; ++ } ++ if (e->op != TOKclassreference) ++ { error("CTFE internal error determining classinfo"); ++ return EXP_CANT_INTERPRET; ++ } ++ ClassDeclaration *cd = ((ClassReferenceExp *)e)->originalClass(); ++ assert(cd); ++ ++ // Create the classinfo, if it doesn't yet exist. ++ // TODO: This belongs in semantic, CTFE should not have to do this. ++ if (!cd->vclassinfo) ++ cd->vclassinfo = new TypeInfoClassDeclaration(cd->type); ++ e = new SymOffExp(loc, cd->vclassinfo, 0); ++ e->type = type; ++ return e; ++ } ++ // It's possible we have an array bounds error. We need to make sure it + // errors with this line number, not the one where the pointer was set. + e = e1->interpret(istate, ctfeNeedLvalue); + if (exceptionOrCantInterpret(e)) +@@ -4840,10 +5664,13 @@ Expression *PtrExp::interpret(InterState + if (!(e->op == TOKvar || e->op == TOKdotvar || e->op == TOKindex + || e->op == TOKslice || e->op == TOKaddress)) + { +- error("dereference of invalid pointer '%s'", e->toChars()); ++ if (e->op == TOKsymoff) ++ error("cannot dereference pointer to static variable %s at compile time", ((SymOffExp *)e)->var->toChars()); ++ else ++ error("dereference of invalid pointer '%s'", e->toChars()); + return EXP_CANT_INTERPRET; + } +- if (goal != ctfeNeedLvalue) ++ if (goal != ctfeNeedLvalue && goal != ctfeNeedLvalueRef) + { + if (e->op == TOKindex && e->type->ty == Tpointer) + { +@@ -4902,8 +5729,26 @@ Expression *PtrExp::interpret(InterState + if (e->op == TOKaddress) + { + e = ((AddrExp*)e)->e1; +- if (e->op == TOKdotvar || e->op == TOKindex) ++ // We're changing *&e to e. ++ // We needed the AddrExp to deal with type painting expressions ++ // we couldn't otherwise express. Now that the type painting is ++ // undone, we must simplify them. This applies to references ++ // (which will be a DotVarExp or IndexExp) and to local structs ++ // (which will be a VarExp). ++ ++ // We sometimes use DotVarExp and IndexExp to represent pointers, ++ // so in that case, they shouldn't be simplified. ++ ++ bool isCtfePtr = (e->op == TOKdotvar || e->op == TOKindex) ++ && isPointer(e->type); ++ ++ // We also must not simplify if it is already a struct Literal ++ // or array literal, because it has already been interpreted. ++ if ( !isCtfePtr && e->op != TOKstructliteral && ++ e->op != TOKassocarrayliteral && e->op != TOKarrayliteral) ++ { + e = e->interpret(istate, goal); ++ } + } + else if (e->op == TOKvar) + { +@@ -4919,7 +5764,7 @@ Expression *PtrExp::interpret(InterState + error("dereference of null pointer '%s'", e1->toChars()); + return EXP_CANT_INTERPRET; + } +- e->type = type; ++ e = paintTypeOntoLiteral(type, e); + } + + #if LOG +@@ -4952,14 +5797,27 @@ Expression *DotVarExp::interpret(InterSt + ex = ((AddrExp *)ex)->e1; + VarDeclaration *v = var->isVarDeclaration(); + if (!v) ++ { + error("CTFE internal error: %s", toChars()); ++ return EXP_CANT_INTERPRET; ++ } + if (ex->op == TOKnull && ex->type->toBasetype()->ty == Tclass) + { error("class '%s' is null and cannot be dereferenced", e1->toChars()); + return EXP_CANT_INTERPRET; + } ++ if (ex->op == TOKnull) ++ { error("dereference of null pointer '%s'", e1->toChars()); ++ return EXP_CANT_INTERPRET; ++ } + if (ex->op == TOKstructliteral || ex->op == TOKclassreference) + { + StructLiteralExp *se = ex->op == TOKclassreference ? ((ClassReferenceExp *)ex)->value : (StructLiteralExp *)ex; ++ /* We don't know how to deal with overlapping fields ++ */ ++ if (se->sd->hasUnions) ++ { error("Unions with overlapping fields are not yet supported in CTFE"); ++ return EXP_CANT_INTERPRET; ++ } + // We can't use getField, because it makes a copy + int i = -1; + if (ex->op == TOKclassreference) +@@ -4971,7 +5829,7 @@ Expression *DotVarExp::interpret(InterSt + error("couldn't find field %s of type %s in %s", v->toChars(), type->toChars(), se->toChars()); + return EXP_CANT_INTERPRET; + } +- e = se->elements->tdata()[i]; ++ e = (*se->elements)[i]; + if (goal == ctfeNeedLvalue || goal == ctfeNeedLvalueRef) + { + // If it is an lvalue literal, return it... +@@ -4986,7 +5844,7 @@ Expression *DotVarExp::interpret(InterSt + * CastExp. + */ + if (goal == ctfeNeedLvalue && e->op == TOKindex && +- e->type == type && ++ e->type->equals(type) && + isPointer(type) ) + return e; + // ...Otherwise, just return the (simplified) dotvar expression +@@ -4996,8 +5854,8 @@ Expression *DotVarExp::interpret(InterSt + } + if (!e) + { +- error("couldn't find field %s in %s", v->toChars(), type->toChars()); +- e = EXP_CANT_INTERPRET; ++ error("Internal Compiler Error: Null field %s", v->toChars()); ++ return EXP_CANT_INTERPRET; + } + // If it is an rvalue literal, return it... + if (e->op == TOKstructliteral || e->op == TOKarrayliteral || +@@ -5006,8 +5864,7 @@ Expression *DotVarExp::interpret(InterSt + if (e->op == TOKvoid) + { + VoidInitExp *ve = (VoidInitExp *)e; +- error("cannot read uninitialized variable %s in ctfe", toChars()); +- ve->var->error("was uninitialized and used before set"); ++ error("cannot read uninitialized variable %s in CTFE", ve->var->toChars()); + return EXP_CANT_INTERPRET; + } + if ( isPointer(type) ) +@@ -5053,13 +5910,15 @@ Expression *RemoveExp::interpret(InterSt + Expressions *valuesx = aae->values; + size_t removed = 0; + for (size_t j = 0; j < valuesx->dim; ++j) +- { Expression *ekey = keysx->tdata()[j]; ++ { ++ Expression *ekey = (*keysx)[j]; + int eq = ctfeEqual(loc, TOKequal, ekey, index); + if (eq) + ++removed; + else if (removed != 0) +- { keysx->tdata()[j - removed] = ekey; +- valuesx->tdata()[j - removed] = valuesx->tdata()[j]; ++ { ++ (*keysx)[j - removed] = ekey; ++ (*valuesx)[j - removed] = (*valuesx)[j]; + } + } + valuesx->dim = valuesx->dim - removed; +@@ -5146,11 +6005,7 @@ Expression *interpret_aaApply(InterState + assert(fd && fd->fbody); + assert(fd->parameters); + int numParams = fd->parameters->dim; +- assert(numParams == 1 || numParams==2); +- +- Type *valueType = fd->parameters->tdata()[numParams-1]->type; +- Type *keyType = numParams == 2 ? fd->parameters->tdata()[0]->type +- : Type::tsize_t; ++ assert(numParams == 1 || numParams == 2); + + Parameter *valueArg = Parameter::getNth(((TypeFunction *)fd->type)->parameters, numParams - 1); + bool wantRefValue = 0 != (valueArg->storageClass & (STCout | STCref)); +@@ -5165,8 +6020,8 @@ Expression *interpret_aaApply(InterState + + for (size_t i = 0; i < ae->keys->dim; ++i) + { +- Expression *ekey = ae->keys->tdata()[i]; +- Expression *evalue = ae->values->tdata()[i]; ++ Expression *ekey = (*ae->keys)[i]; ++ Expression *evalue = (*ae->values)[i]; + if (wantRefValue) + { Type *t = evalue->type; + evalue = new IndexExp(deleg->loc, ae, ekey); +@@ -5217,8 +6072,8 @@ Expression *foreachApplyUtf(InterState * + assert(fd->parameters); + int numParams = fd->parameters->dim; + assert(numParams == 1 || numParams==2); +- Type *charType = fd->parameters->tdata()[numParams-1]->type; +- Type *indexType = numParams == 2 ? fd->parameters->tdata()[0]->type ++ Type *charType = (*fd->parameters)[numParams-1]->type; ++ Type *indexType = numParams == 2 ? (*fd->parameters)[0]->type + : Type::tsize_t; + uinteger_t len = resolveArrayLength(str); + if (len == 0) +@@ -5243,7 +6098,7 @@ Expression *foreachApplyUtf(InterState * + Expression *eresult; + + // Buffers for encoding; also used for decoding array literals +- unsigned char utf8buf[4]; ++ utf8_t utf8buf[4]; + unsigned short utf16buf[2]; + + size_t start = rvs ? len : 0; +@@ -5270,9 +6125,10 @@ Expression *foreachApplyUtf(InterState * + --indx; + buflen = 1; + while (indx > 0 && buflen < 4) +- { Expression * r = ale->elements->tdata()[indx]; ++ { ++ Expression * r = (*ale->elements)[indx]; + assert(r->op == TOKint64); +- unsigned char x = (unsigned char)(((IntegerExp *)r)->value); ++ utf8_t x = (utf8_t)(((IntegerExp *)r)->value); + if ( (x & 0xC0) != 0x80) + break; + ++buflen; +@@ -5282,9 +6138,9 @@ Expression *foreachApplyUtf(InterState * + buflen = (indx + 4 > len) ? len - indx : 4; + for (int i = 0; i < buflen; ++i) + { +- Expression * r = ale->elements->tdata()[indx + i]; ++ Expression * r = (*ale->elements)[indx + i]; + assert(r->op == TOKint64); +- utf8buf[i] = (unsigned char)(((IntegerExp *)r)->value); ++ utf8buf[i] = (utf8_t)(((IntegerExp *)r)->value); + } + n = 0; + errmsg = utf_decodeChar(&utf8buf[0], buflen, &n, &rawvalue); +@@ -5294,7 +6150,7 @@ Expression *foreachApplyUtf(InterState * + { // find the start of the string + --indx; + buflen = 1; +- Expression * r = ale->elements->tdata()[indx]; ++ Expression * r = (*ale->elements)[indx]; + assert(r->op == TOKint64); + unsigned short x = (unsigned short)(((IntegerExp *)r)->value); + if (indx > 0 && x >= 0xDC00 && x <= 0xDFFF) +@@ -5307,7 +6163,7 @@ Expression *foreachApplyUtf(InterState * + buflen = (indx + 2 > len) ? len - indx : 2; + for (int i=0; i < buflen; ++i) + { +- Expression * r = ale->elements->tdata()[indx + i]; ++ Expression * r = (*ale->elements)[indx + i]; + assert(r->op == TOKint64); + utf16buf[i] = (unsigned short)(((IntegerExp *)r)->value); + } +@@ -5319,7 +6175,7 @@ Expression *foreachApplyUtf(InterState * + if (rvs) + --indx; + +- Expression * r = ale->elements->tdata()[indx]; ++ Expression * r = (*ale->elements)[indx]; + assert(r->op == TOKint64); + rawvalue = ((IntegerExp *)r)->value; + n = 1; +@@ -5340,13 +6196,13 @@ Expression *foreachApplyUtf(InterState * + case 1: + if (rvs) + { // find the start of the string +- unsigned char *s = (unsigned char *)se->string; ++ utf8_t *s = (utf8_t *)se->string; + --indx; + while (indx > 0 && ((s[indx]&0xC0)==0x80)) + --indx; + saveindx = indx; + } +- errmsg = utf_decodeChar((unsigned char *)se->string, se->len, &indx, &rawvalue); ++ errmsg = utf_decodeChar((utf8_t *)se->string, se->len, &indx, &rawvalue); + if (rvs) + indx = saveindx; + break; +@@ -5462,7 +6318,7 @@ Expression *evaluateIfBuiltin(InterState + } + if (!pthis) + { +- enum BUILTIN b = fd->isBuiltin(); ++ BUILTIN b = fd->isBuiltin(); + if (b) + { Expressions args; + args.setDim(nargs); +@@ -5525,10 +6381,10 @@ Expression *evaluateIfBuiltin(InterState + assert(arguments->dim <= se->elements->dim); + for (int i = 0; i < arguments->dim; ++i) + { +- Expression *e = (*arguments)[i]->interpret(istate); ++ e = (*arguments)[i]->interpret(istate); + if (exceptionOrCantInterpret(e)) + return e; +- se->elements->tdata()[i] = e; ++ (*se->elements)[i] = e; + } + return EXP_VOID_INTERPRET; + } +--- a/src/gcc/d/dfrontend/intrange.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/intrange.h 2014-04-01 16:32:51.000000000 +0100 +@@ -12,9 +12,9 @@ + #ifndef DMD_SXNUM_H + #define DMD_SXNUM_H + +-#include "port.h" // for uinteger_t +-struct Type; +-struct Expression; ++#include "mars.h" // for uinteger_t ++class Type; ++class Expression; + + /** + This class represents a "sign-extended number", i.e. a 65-bit number, which can +--- a/src/gcc/d/dfrontend/json.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/json.c 2014-04-01 16:32:51.000000000 +0100 +@@ -68,10 +68,9 @@ struct JsonOut + void property(const char *name, Type* type); + void property(const char *name, const char *deconame, Type* type); + void property(const char *name, Parameters* parameters); +- void property(const char *name, Expressions* expressions); +- void property(const char *name, enum TRUST trust); +- void property(const char *name, enum PURE purity); +- void property(const char *name, enum LINK linkage); ++ void property(const char *name, TRUST trust); ++ void property(const char *name, PURE purity); ++ void property(const char *name, LINK linkage); + }; + + +@@ -83,7 +82,7 @@ void json_generate(OutBuffer *buf, Modul + for (size_t i = 0; i < modules->dim; i++) + { Module *m = (*modules)[i]; + if (global.params.verbose) +- fprintf(stdmsg, "json gen %s\n", m->toChars()); ++ fprintf(global.stdmsg, "json gen %s\n", m->toChars()); + m->toJson(&json); + } + json.arrayEnd(); +@@ -129,7 +128,7 @@ void JsonOut::stringPart(const char *s) + { + for (; *s; s++) + { +- unsigned char c = (unsigned char) *s; ++ utf8_t c = (utf8_t) *s; + switch (c) + { + case '\n': +@@ -308,7 +307,7 @@ void JsonOut::propertyBool(const char *n + } + + +-void JsonOut::property(const char *name, enum TRUST trust) ++void JsonOut::property(const char *name, TRUST trust) + { + switch (trust) + { +@@ -330,7 +329,7 @@ void JsonOut::property(const char *name, + } + } + +-void JsonOut::property(const char *name, enum PURE purity) ++void JsonOut::property(const char *name, PURE purity) + { + switch (purity) + { +@@ -355,7 +354,7 @@ void JsonOut::property(const char *name, + } + } + +-void JsonOut::property(const char *name, enum LINK linkage) ++void JsonOut::property(const char *name, LINK linkage) + { + switch (linkage) + { +@@ -396,7 +395,7 @@ void JsonOut::propertyStorageClass(const + { char tmp[20]; + const char *p = StorageClassDeclaration::stcToChars(tmp, stc); + assert(p); +- assert(strlen(p) < sizeof(tmp)); ++ assert(strlen(p) < sizeof(tmp) / sizeof(tmp[0])); + if (p[0] == '@') + { + indent(); +@@ -545,7 +544,7 @@ void TypeQualified::toJson(JsonOut *json + json->arrayStart(); + + for (size_t i = 0; i < idents.dim; i++) +- { Identifier *ident = idents[i]; ++ { RootObject *ident = idents[i]; + json->item(ident->toChars()); + } + +@@ -629,9 +628,11 @@ void Dsymbol::toJson(JsonOut *json) + + void Dsymbol::jsonProperties(JsonOut *json) + { +- json->property("name", toChars()); + if (!isTemplateDeclaration()) // TemplateDeclaration::kind() acts weird sometimes ++ { ++ json->property("name", toChars()); + json->property("kind", kind()); ++ } + + if (prot() != PROTpublic) + json->property("protection", Pprotectionnames[prot()]); +@@ -805,7 +806,6 @@ void ConditionalDeclaration::toJson(Json + + + void ClassInfoDeclaration::toJson(JsonOut *json) { } +-void ModuleInfoDeclaration::toJson(JsonOut *json) { } + void TypeInfoDeclaration::toJson(JsonOut *json) { } + #if DMDV2 + void PostBlitDeclaration::toJson(JsonOut *json) { } +@@ -848,6 +848,16 @@ void Declaration::jsonProperties(JsonOut + } + } + ++void TemplateDeclaration::jsonProperties(JsonOut *json) ++{ ++ Dsymbol::jsonProperties(json); ++ ++ if (onemember && onemember->isCtorDeclaration()) ++ json->property("name", "this"); // __ctor -> this ++ else ++ json->property("name", ident->toChars()); // Foo(T) -> Foo ++} ++ + void TypedefDeclaration::toJson(JsonOut *json) + { + json->objectStart(); +@@ -960,9 +970,10 @@ void TemplateDeclaration::toJson(JsonOut + if (s->isTemplateThisParameter()) + json->property("kind", "this"); + else +-#endif + json->property("kind", "type"); +- ++#else ++ json->property("kind", "type"); ++#endif + json->property("type", "deco", type->specType); + + json->property("default", "defaultDeco", type->defaultType); +@@ -1071,7 +1082,7 @@ void VarDeclaration::toJson(JsonOut *jso + if (init) + json->property("init", init->toChars()); + +- if (storage_class & STCfield) ++ if (isField()) + json->property("offset", offset); + + if (alignment && alignment != STRUCTALIGN_DEFAULT) +--- a/src/gcc/d/dfrontend/lexer.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/lexer.c 2014-04-01 16:32:51.000000000 +0100 +@@ -30,12 +30,7 @@ + #include "id.h" + #include "module.h" + +-#if _WIN32 && __DMC__ +-// from \dm\src\include\setlocal.h +-extern "C" char * __cdecl __locale_decpoint; +-#endif +- +-extern int HtmlNamedEntity(unsigned char *p, size_t length); ++extern int HtmlNamedEntity(utf8_t *p, size_t length); + + #define LS 0x2028 // UTF line separator + #define PS 0x2029 // UTF paragraph separator +@@ -52,9 +47,9 @@ const int CMoctal = 0x1; + const int CMhex = 0x2; + const int CMidchar = 0x4; + +-inline unsigned char isoctal (unsigned char c) { return cmtable[c] & CMoctal; } +-inline unsigned char ishex (unsigned char c) { return cmtable[c] & CMhex; } +-inline unsigned char isidchar(unsigned char c) { return cmtable[c] & CMidchar; } ++inline bool isoctal (utf8_t c) { return cmtable[c] & CMoctal; } ++inline bool ishex (utf8_t c) { return cmtable[c] & CMhex; } ++inline bool isidchar(utf8_t c) { return cmtable[c] & CMidchar; } + + static void cmtable_init() + { +@@ -90,7 +85,7 @@ void *Token::operator new(size_t size) + #ifdef DEBUG + void Token::print() + { +- fprintf(stdmsg, "%s\n", toChars()); ++ fprintf(stderr, "%s\n", toChars()); + } + #endif + +@@ -102,22 +97,14 @@ const char *Token::toChars() + switch (value) + { + case TOKint32v: +-#ifdef IN_GCC +- sprintf(buffer,"%d",(d_int32)int64value); +-#else + sprintf(buffer,"%d",int32value); +-#endif + break; + + case TOKuns32v: + case TOKcharv: + case TOKwcharv: + case TOKdcharv: +-#ifdef IN_GCC +- sprintf(buffer,"%uU",(d_uns32)uns64value); +-#else + sprintf(buffer,"%uU",uns32value); +-#endif + break; + + case TOKint64v: +@@ -128,20 +115,6 @@ const char *Token::toChars() + sprintf(buffer,"%lluUL",(ulonglong)uns64value); + break; + +-#ifdef IN_GCC +- case TOKfloat32v: +- case TOKfloat64v: +- case TOKfloat80v: +- float80value.format(buffer, sizeof(buffer)); +- break; +- case TOKimaginary32v: +- case TOKimaginary64v: +- case TOKimaginary80v: +- float80value.format(buffer, sizeof(buffer)); +- // %% buffer +- strcat(buffer, "i"); +- break; +-#else + case TOKfloat32v: + ld_sprint(buffer, 'g', float80value); + strcat(buffer, "f"); +@@ -170,7 +143,6 @@ const char *Token::toChars() + ld_sprint(buffer, 'g', float80value); + strcat(buffer, "Li"); + break; +-#endif + + case TOKstring: + { OutBuffer buf; +@@ -179,7 +151,7 @@ const char *Token::toChars() + for (size_t i = 0; i < len; ) + { unsigned c; + +- utf_decodeChar((unsigned char *)ustring, len, &i, &c); ++ utf_decodeChar((utf8_t *)ustring, len, &i, &c); + switch (c) + { + case 0: +@@ -224,7 +196,7 @@ const char *Token::toChars() + return p; + } + +-const char *Token::toChars(enum TOK value) ++const char *Token::toChars(TOK value) + { const char *p; + static char buffer[3 + 3 * sizeof(value) + 1]; + +@@ -243,10 +215,10 @@ StringTable Lexer::stringtable; + OutBuffer Lexer::stringbuffer; + + Lexer::Lexer(Module *mod, +- unsigned char *base, size_t begoffset, size_t endoffset, ++ utf8_t *base, size_t begoffset, size_t endoffset, + int doDocComment, int commentToken) +- : loc(mod, 1) + { ++ scanloc = Loc(mod, 1); + //printf("Lexer::Lexer(%p,%d)\n",base,length); + //printf("lexer.mod = %p, %p\n", mod, this->loc.mod); + memset(&token,0,sizeof(token)); +@@ -266,7 +238,7 @@ Lexer::Lexer(Module *mod, + { + p += 2; + while (1) +- { unsigned char c = *p; ++ { utf8_t c = *p; + switch (c) + { + case '\n': +@@ -294,7 +266,7 @@ Lexer::Lexer(Module *mod, + } + break; + } +- loc.linnum = 2; ++ scanloc.linnum = 2; + } + } + +@@ -303,7 +275,7 @@ void Lexer::error(const char *format, .. + { + va_list ap; + va_start(ap, format); +- ::verror(tokenLoc(), format, ap); ++ ::verror(token.loc, format, ap); + va_end(ap); + } + +@@ -319,16 +291,15 @@ void Lexer::deprecation(const char *form + { + va_list ap; + va_start(ap, format); +- ::vdeprecation(tokenLoc(), format, ap); ++ ::vdeprecation(token.loc, format, ap); + va_end(ap); + } + + TOK Lexer::nextToken() +-{ Token *t; +- ++{ + if (token.next) + { +- t = token.next; ++ Token *t = token.next; + memcpy(&token,t,sizeof(Token)); + t->next = freelist; + freelist = t; +@@ -342,8 +313,8 @@ TOK Lexer::nextToken() + } + + Token *Lexer::peek(Token *ct) +-{ Token *t; +- ++{ ++ Token *t; + if (ct->next) + t = ct->next; + else +@@ -448,7 +419,7 @@ int Lexer::isValidIdentifier(char *p) + while (p[idx]) + { dchar_t dc; + +- const char *q = utf_decodeChar((unsigned char *)p, len, &idx, &dc); ++ const char *q = utf_decodeChar((utf8_t *)p, len, &idx, &dc); + if (q) + goto Linvalid; + +@@ -467,7 +438,7 @@ Linvalid: + + void Lexer::scan(Token *t) + { +- unsigned lastLine = loc.linnum; ++ unsigned lastLine = scanloc.linnum; + unsigned linnum; + + t->blockComment = NULL; +@@ -476,6 +447,7 @@ void Lexer::scan(Token *t) + { + t->ptr = p; + //printf("p = %p, *p = '%c'\n",p,*p); ++ t->loc = scanloc; + switch (*p) + { + case 0: +@@ -493,12 +465,12 @@ void Lexer::scan(Token *t) + case '\r': + p++; + if (*p != '\n') // if CR stands by itself +- loc.linnum++; ++ scanloc.linnum++; + continue; // skip white space + + case '\n': + p++; +- loc.linnum++; ++ scanloc.linnum++; + continue; // skip white space + + case '0': case '1': case '2': case '3': case '4': +@@ -550,7 +522,7 @@ void Lexer::scan(Token *t) + #if ! TEXTUAL_ASSEMBLY_OUT + case '\\': // escaped string literal + { unsigned c; +- unsigned char *pstart = p; ++ utf8_t *pstart = p; + + stringbuffer.reset(); + do +@@ -573,7 +545,7 @@ void Lexer::scan(Token *t) + } while (*p == '\\'); + t->len = stringbuffer.offset; + stringbuffer.writeByte(0); +- t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset); ++ t->ustring = (utf8_t *)mem.malloc(stringbuffer.offset); + memcpy(t->ustring, stringbuffer.data, stringbuffer.offset); + t->postfix = 0; + t->value = TOKstring; +@@ -602,7 +574,7 @@ void Lexer::scan(Token *t) + case 'Z': + case '_': + case_ident: +- { unsigned char c; ++ { utf8_t c; + + while (1) + { +@@ -610,7 +582,7 @@ void Lexer::scan(Token *t) + if (isidchar(c)) + continue; + else if (c & 0x80) +- { unsigned char *s = p; ++ { utf8_t *s = p; + unsigned u = decodeUTF(); + if (isUniAlpha(u)) + continue; +@@ -624,23 +596,24 @@ void Lexer::scan(Token *t) + Identifier *id = (Identifier *) sv->ptrvalue; + if (!id) + { id = new Identifier(sv->toDchars(),TOKidentifier); +- sv->ptrvalue = id; ++ sv->ptrvalue = (char *)id; + } + t->ident = id; +- t->value = (enum TOK) id->value; ++ t->value = (TOK) id->value; + anyToken = 1; + if (*t->ptr == '_') // if special identifier token + { ++ static bool initdone = false; + static char date[11+1]; + static char time[8+1]; + static char timestamp[24+1]; + +- if (!date[0]) // lazy evaluation +- { time_t t; +- char *p; +- ++ if (!initdone) // lazy evaluation ++ { ++ initdone = true; ++ time_t t; + ::time(&t); +- p = ctime(&t); ++ char *p = ctime(&t); + assert(p); + sprintf(date, "%.6s %.4s", p + 4, p + 20); + sprintf(time, "%.8s", p + 11); +@@ -650,38 +623,34 @@ void Lexer::scan(Token *t) + #if DMDV1 + if (mod && id == Id::FILE) + { +- t->ustring = (unsigned char *)(loc.filename ? loc.filename : mod->ident->toChars()); ++ t->ustring = (utf8_t *)(loc.filename ? loc.filename : mod->ident->toChars()); + goto Lstr; + } + else if (mod && id == Id::LINE) + { + t->value = TOKint64v; +- t->uns64value = loc.linnum; ++ t->uns64value = scanloc.linnum; + } + else + #endif + if (id == Id::DATE) + { +- t->ustring = (unsigned char *)date; ++ t->ustring = (utf8_t *)date; + goto Lstr; + } + else if (id == Id::TIME) + { +- t->ustring = (unsigned char *)time; ++ t->ustring = (utf8_t *)time; + goto Lstr; + } + else if (id == Id::VENDOR) + { +-#ifdef IN_GCC +- t->ustring = (unsigned char *)"GDC"; +-#else +- t->ustring = (unsigned char *)"Digital Mars D"; +-#endif ++ t->ustring = (utf8_t *)global.compiler.vendor; + goto Lstr; + } + else if (id == Id::TIMESTAMP) + { +- t->ustring = (unsigned char *)timestamp; ++ t->ustring = (utf8_t *)timestamp; + Lstr: + t->value = TOKstring; + t->postfix = 0; +@@ -690,14 +659,19 @@ void Lexer::scan(Token *t) + else if (id == Id::VERSIONX) + { unsigned major = 0; + unsigned minor = 0; ++ bool point = false; + + for (const char *p = global.version + 1; 1; p++) + { + char c = *p; +- if (isdigit((unsigned char)c)) ++ if (isdigit((utf8_t)c)) + minor = minor * 10 + c - '0'; + else if (c == '.') +- { major = minor; ++ { ++ if (point) ++ break; // ignore everything after second '.' ++ point = true; ++ major = minor; + minor = 0; + } + else +@@ -731,31 +705,32 @@ void Lexer::scan(Token *t) + + case '*': + p++; +- linnum = loc.linnum; ++ linnum = scanloc.linnum; + while (1) + { + while (1) +- { unsigned char c = *p; ++ { utf8_t c = *p; + switch (c) + { + case '/': + break; + + case '\n': +- loc.linnum++; ++ scanloc.linnum++; + p++; + continue; + + case '\r': + p++; + if (*p != '\n') +- loc.linnum++; ++ scanloc.linnum++; + continue; + + case 0: + case 0x1A: + error("unterminated /* */ comment"); + p = end; ++ t->loc = scanloc; + t->value = TOKeof; + return; + +@@ -763,7 +738,7 @@ void Lexer::scan(Token *t) + if (c & 0x80) + { unsigned u = decodeUTF(); + if (u == PS || u == LS) +- loc.linnum++; ++ scanloc.linnum++; + } + p++; + continue; +@@ -776,6 +751,8 @@ void Lexer::scan(Token *t) + } + if (commentToken) + { ++ t->loc.filename = scanloc.filename; ++ t->loc.linnum = linnum; + t->value = TOKcomment; + return; + } +@@ -786,9 +763,9 @@ void Lexer::scan(Token *t) + continue; + + case '/': // do // style comments +- linnum = loc.linnum; ++ linnum = scanloc.linnum; + while (1) +- { unsigned char c = *++p; ++ { utf8_t c = *++p; + switch (c) + { + case '\n': +@@ -804,12 +781,15 @@ void Lexer::scan(Token *t) + if (commentToken) + { + p = end; ++ t->loc.filename = scanloc.filename; ++ t->loc.linnum = linnum; + t->value = TOKcomment; + return; + } + if (doDocComment && t->ptr[2] == '/') + getDocComment(t, lastLine == linnum); + p = end; ++ t->loc = scanloc; + t->value = TOKeof; + return; + +@@ -827,7 +807,9 @@ void Lexer::scan(Token *t) + if (commentToken) + { + p++; +- loc.linnum++; ++ scanloc.linnum++; ++ t->loc.filename = scanloc.filename; ++ t->loc.linnum = linnum; + t->value = TOKcomment; + return; + } +@@ -835,17 +817,17 @@ void Lexer::scan(Token *t) + getDocComment(t, lastLine == linnum); + + p++; +- loc.linnum++; ++ scanloc.linnum++; + continue; + + case '+': + { int nest; + +- linnum = loc.linnum; ++ linnum = scanloc.linnum; + p++; + nest = 1; + while (1) +- { unsigned char c = *p; ++ { utf8_t c = *p; + switch (c) + { + case '/': +@@ -870,11 +852,11 @@ void Lexer::scan(Token *t) + case '\r': + p++; + if (*p != '\n') +- loc.linnum++; ++ scanloc.linnum++; + continue; + + case '\n': +- loc.linnum++; ++ scanloc.linnum++; + p++; + continue; + +@@ -882,6 +864,7 @@ void Lexer::scan(Token *t) + case 0x1A: + error("unterminated /+ +/ comment"); + p = end; ++ t->loc = scanloc; + t->value = TOKeof; + return; + +@@ -889,7 +872,7 @@ void Lexer::scan(Token *t) + if (c & 0x80) + { unsigned u = decodeUTF(); + if (u == PS || u == LS) +- loc.linnum++; ++ scanloc.linnum++; + } + p++; + continue; +@@ -898,6 +881,8 @@ void Lexer::scan(Token *t) + } + if (commentToken) + { ++ t->loc.filename = scanloc.filename; ++ t->loc.linnum = linnum; + t->value = TOKcomment; + return; + } +@@ -907,6 +892,8 @@ void Lexer::scan(Token *t) + } + continue; + } ++ default: ++ break; + } + t->value = TOKdiv; + return; +@@ -1057,12 +1044,7 @@ void Lexer::scan(Token *t) + p++; + if (*p == '=') + { p++; +- if (*p == '=' && global.params.Dversion == 1) +- { p++; +- t->value = TOKnotidentity; // !== +- } +- else +- t->value = TOKnotequal; // != ++ t->value = TOKnotequal; // != + } + else if (*p == '<') + { p++; +@@ -1099,12 +1081,7 @@ void Lexer::scan(Token *t) + p++; + if (*p == '=') + { p++; +- if (*p == '=' && global.params.Dversion == 1) +- { p++; +- t->value = TOKidentity; // === +- } +- else +- t->value = TOKequal; // == ++ t->value = TOKequal; // == + } + #if DMDV2 + else if (*p == '>') +@@ -1212,7 +1189,7 @@ void Lexer::scan(Token *t) + + if (c == PS || c == LS) + { +- loc.linnum++; ++ scanloc.linnum++; + p++; + continue; + } +@@ -1303,7 +1280,7 @@ unsigned Lexer::escapeSequence() + break; + + case '&': // named character entity +- for (unsigned char *idstart = ++p; 1; p++) ++ for (utf8_t *idstart = ++p; 1; p++) + { + switch (*p) + { +@@ -1358,8 +1335,9 @@ unsigned Lexer::escapeSequence() + */ + + TOK Lexer::wysiwygStringConstant(Token *t, int tc) +-{ unsigned c; +- Loc start = loc; ++{ ++ unsigned c; ++ Loc start = scanloc; + + p++; + stringbuffer.reset(); +@@ -1369,20 +1347,20 @@ TOK Lexer::wysiwygStringConstant(Token * + switch (c) + { + case '\n': +- loc.linnum++; ++ scanloc.linnum++; + break; + + case '\r': + if (*p == '\n') + continue; // ignore + c = '\n'; // treat EndOfLine as \n character +- loc.linnum++; ++ scanloc.linnum++; + break; + + case 0: + case 0x1A: + error("unterminated string constant starting at %s", start.toChars()); +- t->ustring = (unsigned char *)""; ++ t->ustring = (utf8_t *)""; + t->len = 0; + t->postfix = 0; + return TOKstring; +@@ -1393,7 +1371,7 @@ TOK Lexer::wysiwygStringConstant(Token * + { + t->len = stringbuffer.offset; + stringbuffer.writeByte(0); +- t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset); ++ t->ustring = (utf8_t *)mem.malloc(stringbuffer.offset); + memcpy(t->ustring, stringbuffer.data, stringbuffer.offset); + stringPostfix(t); + return TOKstring; +@@ -1406,7 +1384,7 @@ TOK Lexer::wysiwygStringConstant(Token * + unsigned u = decodeUTF(); + p++; + if (u == PS || u == LS) +- loc.linnum++; ++ scanloc.linnum++; + stringbuffer.writeUTF8(u); + continue; + } +@@ -1422,8 +1400,9 @@ TOK Lexer::wysiwygStringConstant(Token * + */ + + TOK Lexer::hexStringConstant(Token *t) +-{ unsigned c; +- Loc start = loc; ++{ ++ unsigned c; ++ Loc start = scanloc; + unsigned n = 0; + unsigned v; + +@@ -1445,13 +1424,13 @@ TOK Lexer::hexStringConstant(Token *t) + continue; // ignore + // Treat isolated '\r' as if it were a '\n' + case '\n': +- loc.linnum++; ++ scanloc.linnum++; + continue; + + case 0: + case 0x1A: + error("unterminated string constant starting at %s", start.toChars()); +- t->ustring = (unsigned char *)""; ++ t->ustring = (utf8_t *)""; + t->len = 0; + t->postfix = 0; + return TOKstring; +@@ -1463,7 +1442,7 @@ TOK Lexer::hexStringConstant(Token *t) + } + t->len = stringbuffer.offset; + stringbuffer.writeByte(0); +- t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset); ++ t->ustring = (utf8_t *)mem.malloc(stringbuffer.offset); + memcpy(t->ustring, stringbuffer.data, stringbuffer.offset); + stringPostfix(t); + return TOKstring; +@@ -1480,7 +1459,7 @@ TOK Lexer::hexStringConstant(Token *t) + unsigned u = decodeUTF(); + p++; + if (u == PS || u == LS) +- loc.linnum++; ++ scanloc.linnum++; + else + error("non-hex character \\u%04x", u); + } +@@ -1513,8 +1492,9 @@ TOK Lexer::hexStringConstant(Token *t) + */ + + TOK Lexer::delimitedStringConstant(Token *t) +-{ unsigned c; +- Loc start = loc; ++{ ++ unsigned c; ++ Loc start = scanloc; + unsigned delimleft = 0; + unsigned delimright = 0; + unsigned nest = 1; +@@ -1533,7 +1513,7 @@ TOK Lexer::delimitedStringConstant(Token + { + case '\n': + Lnextline: +- loc.linnum++; ++ scanloc.linnum++; + startline = 1; + if (blankrol) + { blankrol = 0; +@@ -1628,7 +1608,7 @@ TOK Lexer::delimitedStringConstant(Token + #endif + ) + { Token t; +- unsigned char *psave = p; ++ utf8_t *psave = p; + p--; + scan(&t); // read in possible heredoc identifier + //printf("endid = '%s'\n", t.ident->toChars()); +@@ -1651,14 +1631,14 @@ Ldone: + error("delimited string must end in %c\"", delimright); + t->len = stringbuffer.offset; + stringbuffer.writeByte(0); +- t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset); ++ t->ustring = (utf8_t *)mem.malloc(stringbuffer.offset); + memcpy(t->ustring, stringbuffer.data, stringbuffer.offset); + stringPostfix(t); + return TOKstring; + + Lerror: + error("unterminated string constant starting at %s", start.toChars()); +- t->ustring = (unsigned char *)""; ++ t->ustring = (utf8_t *)""; + t->len = 0; + t->postfix = 0; + return TOKstring; +@@ -1676,8 +1656,8 @@ Lerror: + TOK Lexer::tokenStringConstant(Token *t) + { + unsigned nest = 1; +- Loc start = loc; +- unsigned char *pstart = ++p; ++ Loc start = scanloc; ++ utf8_t *pstart = ++p; + + while (1) + { Token tok; +@@ -1704,7 +1684,7 @@ TOK Lexer::tokenStringConstant(Token *t) + + Ldone: + t->len = p - 1 - pstart; +- t->ustring = (unsigned char *)mem.malloc(t->len + 1); ++ t->ustring = (utf8_t *)mem.malloc(t->len + 1); + memcpy(t->ustring, pstart, t->len); + t->ustring[t->len] = 0; + stringPostfix(t); +@@ -1712,7 +1692,7 @@ Ldone: + + Lerror: + error("unterminated token string constant starting at %s", start.toChars()); +- t->ustring = (unsigned char *)""; ++ t->ustring = (utf8_t *)""; + t->len = 0; + t->postfix = 0; + return TOKstring; +@@ -1725,8 +1705,9 @@ Lerror: + */ + + TOK Lexer::escapeStringConstant(Token *t, int wide) +-{ unsigned c; +- Loc start = loc; ++{ ++ unsigned c; ++ Loc start = scanloc; + + p++; + stringbuffer.reset(); +@@ -1753,20 +1734,20 @@ TOK Lexer::escapeStringConstant(Token *t + break; + #endif + case '\n': +- loc.linnum++; ++ scanloc.linnum++; + break; + + case '\r': + if (*p == '\n') + continue; // ignore + c = '\n'; // treat EndOfLine as \n character +- loc.linnum++; ++ scanloc.linnum++; + break; + + case '"': + t->len = stringbuffer.offset; + stringbuffer.writeByte(0); +- t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset); ++ t->ustring = (utf8_t *)mem.malloc(stringbuffer.offset); + memcpy(t->ustring, stringbuffer.data, stringbuffer.offset); + stringPostfix(t); + return TOKstring; +@@ -1775,7 +1756,7 @@ TOK Lexer::escapeStringConstant(Token *t + case 0x1A: + p--; + error("unterminated string constant starting at %s", start.toChars()); +- t->ustring = (unsigned char *)""; ++ t->ustring = (utf8_t *)""; + t->len = 0; + t->postfix = 0; + return TOKstring; +@@ -1787,7 +1768,7 @@ TOK Lexer::escapeStringConstant(Token *t + c = decodeUTF(); + if (c == LS || c == PS) + { c = '\n'; +- loc.linnum++; ++ scanloc.linnum++; + } + p++; + stringbuffer.writeUTF8(c); +@@ -1835,7 +1816,7 @@ TOK Lexer::charConstant(Token *t, int wi + #endif + case '\n': + L1: +- loc.linnum++; ++ scanloc.linnum++; + case '\r': + case 0: + case 0x1A: +@@ -1906,17 +1887,19 @@ TOK Lexer::number(Token *t) + enum STATE { STATE_initial, STATE_0, STATE_decimal, STATE_octal, STATE_octale, + STATE_hex, STATE_binary, STATE_hex0, STATE_binary0, + STATE_hexh, STATE_error }; +- enum STATE state; ++ STATE state; + + enum FLAGS +- { FLAGS_decimal = 1, // decimal ++ { ++ FLAGS_none = 0, ++ FLAGS_decimal = 1, // decimal + FLAGS_unsigned = 2, // u or U suffix + FLAGS_long = 4, // l or L suffix + }; +- enum FLAGS flags = FLAGS_decimal; ++ FLAGS flags = FLAGS_decimal; + + unsigned c; +- unsigned char *start; ++ utf8_t *start; + TOK result; + + //printf("Lexer::number()\n"); +@@ -2106,7 +2089,7 @@ done: + p += 2, r = 16; + else if (p[1] == 'b' || p[1] == 'B') + p += 2, r = 2; +- else if (isdigit((unsigned char)p[1])) ++ else if (isdigit((utf8_t)p[1])) + p += 1, r = 8; + } + +@@ -2141,9 +2124,9 @@ done: + } + + // Parse trailing 'u', 'U', 'l' or 'L' in any combination +- const unsigned char *psuffix = p; ++ const utf8_t *psuffix = p; + while (1) +- { unsigned char f; ++ { utf8_t f; + + switch (*p) + { case 'U': +@@ -2173,7 +2156,7 @@ done: + + switch (flags) + { +- case 0: ++ case FLAGS_none: + /* Octal or Hexadecimal constant. + * First that fits: int, uint, long, ulong + */ +@@ -2356,47 +2339,25 @@ done: + + stringbuffer.writeByte(0); + +-#if _WIN32 && __DMC__ +- char *save = __locale_decpoint; +- __locale_decpoint = "."; +-#endif +-#ifdef IN_GCC +- t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble); +-#else +- t->float80value = strtold((char *)stringbuffer.data, NULL); +-#endif ++ t->float80value = Port::strtold((char *)stringbuffer.data, NULL); + errno = 0; + switch (*p) + { + case 'F': + case 'f': +-#ifdef IN_GCC +- real_t::parse((char *)stringbuffer.data, real_t::Float); +-#else +- { // Only interested in errno return +- double d = strtof((char *)stringbuffer.data, NULL); +- // Assign to d to keep gcc warnings at bay, +- // but then CppCheck complains that d is never used. +- } +-#endif ++ // Only interested in errno return ++ (void)Port::strtof((char *)stringbuffer.data, NULL); + result = TOKfloat32v; + p++; + break; + + default: +-#ifdef IN_GCC +- real_t::parse((char *)stringbuffer.data, real_t::Double); +-#else + /* Should do our own strtod(), since dmc and linux gcc + * accept 2.22507e-308, while apple gcc will only take + * 2.22508e-308. Not sure who is right. + */ +- { // Only interested in errno return +- double d = strtod((char *)stringbuffer.data, NULL); +- // Assign to d to keep gcc warnings at bay +- // but then CppCheck complains that d is never used. +- } +-#endif ++ // Only interested in errno return ++ (void)Port::strtod((char *)stringbuffer.data, NULL); + result = TOKfloat64v; + break; + +@@ -2426,9 +2387,6 @@ done: + default: break; + } + } +-#if _WIN32 && __DMC__ +- __locale_decpoint = save; +-#endif + if (errno == ERANGE) + error("number is not representable"); + return result; +@@ -2437,6 +2395,7 @@ done: + /********************************************* + * parse: + * #line linnum [filespec] ++ * also allow __LINE__ for linnum, and __FILE__ for filespec + */ + + void Lexer::poundLine() +@@ -2444,7 +2403,7 @@ void Lexer::poundLine() + Token tok; + int linnum; + char *filespec = NULL; +- Loc loc = this->loc; ++ Loc loc = this->scanloc; + + scan(&tok); + if (tok.value == TOKint32v || tok.value == TOKint64v) +@@ -2452,6 +2411,10 @@ void Lexer::poundLine() + if (linnum != tok.uns64value - 1) + error("line number out of range"); + } ++ else if (tok.value == TOKline) ++ { ++ linnum = this->scanloc.linnum; ++ } + else + goto Lerr; + +@@ -2463,9 +2426,9 @@ void Lexer::poundLine() + case 0x1A: + case '\n': + Lnewline: +- this->loc.linnum = linnum; ++ this->scanloc.linnum = linnum; + if (filespec) +- this->loc.filename = filespec; ++ this->scanloc.filename = filespec; + return; + + case '\r': +@@ -2487,7 +2450,7 @@ void Lexer::poundLine() + if (mod && memcmp(p, "__FILE__", 8) == 0) + { + p += 8; +- filespec = mem.strdup(loc.filename ? loc.filename : mod->ident->toChars()); ++ filespec = mem.strdup(scanloc.filename ? scanloc.filename : mod->ident->toChars()); + continue; + } + goto Lerr; +@@ -2553,8 +2516,8 @@ Lerr: + unsigned Lexer::decodeUTF() + { + dchar_t u; +- unsigned char c; +- unsigned char *s = p; ++ utf8_t c; ++ utf8_t *s = p; + size_t len; + size_t idx; + const char *msg; +@@ -2590,13 +2553,13 @@ void Lexer::getDocComment(Token *t, unsi + { + /* ct tells us which kind of comment it is: '/', '*', or '+' + */ +- unsigned char ct = t->ptr[2]; ++ utf8_t ct = t->ptr[2]; + + /* Start of comment text skips over / * *, / + +, or / / / + */ +- unsigned char *q = t->ptr + 3; // start of comment text ++ utf8_t *q = t->ptr + 3; // start of comment text + +- unsigned char *qend = p; ++ utf8_t *qend = p; + if (ct == '*' || ct == '+') + qend -= 2; + +@@ -2627,7 +2590,7 @@ void Lexer::getDocComment(Token *t, unsi + + for (; q < qend; q++) + { +- unsigned char c = *q; ++ utf8_t c = *q; + + switch (c) + { +@@ -2689,15 +2652,15 @@ void Lexer::getDocComment(Token *t, unsi + + // It's a line comment if the start of the doc comment comes + // after other non-whitespace on the same line. +- unsigned char** dc = (lineComment && anyToken) ++ utf8_t** dc = (lineComment && anyToken) + ? &t->lineComment + : &t->blockComment; + + // Combine with previous doc comment, if any + if (*dc) +- *dc = combineComments(*dc, (unsigned char *)buf.data); ++ *dc = combineComments(*dc, (utf8_t *)buf.data); + else +- *dc = (unsigned char *)buf.extractData(); ++ *dc = (utf8_t *)buf.extractData(); + } + + /******************************************** +@@ -2705,11 +2668,11 @@ void Lexer::getDocComment(Token *t, unsi + * separated by a newline. + */ + +-unsigned char *Lexer::combineComments(unsigned char *c1, unsigned char *c2) ++utf8_t *Lexer::combineComments(utf8_t *c1, utf8_t *c2) + { + //printf("Lexer::combineComments('%s', '%s')\n", c1, c2); + +- unsigned char *c = c2; ++ utf8_t *c = c2; + + if (c1) + { c = c1; +@@ -2717,7 +2680,7 @@ unsigned char *Lexer::combineComments(un + { size_t len1 = strlen((char *)c1); + size_t len2 = strlen((char *)c2); + +- c = (unsigned char *)mem.malloc(len1 + 1 + len2 + 1); ++ c = (utf8_t *)mem.malloc(len1 + 1 + len2 + 1); + memcpy(c, c1, len1); + if (len1 && c1[len1 - 1] != '\n') + { c[len1] = '\n'; +@@ -2730,38 +2693,6 @@ unsigned char *Lexer::combineComments(un + return c; + } + +-/******************************************* +- * Search actual location of current token +- * even when infinite look-ahead was done. +- */ +-Loc Lexer::tokenLoc() +-{ +- Loc result = this->loc; +- Token* last = &token; +- while (last->next) +- last = last->next; +- +- unsigned char* start = token.ptr; +- unsigned char* stop = last->ptr; +- +- for (unsigned char* p = start; p < stop; ++p) +- { +- switch (*p) +- { +- case '\n': +- result.linnum--; +- break; +- case '\r': +- if (p[1] != '\n') +- result.linnum--; +- break; +- default: +- break; +- } +- } +- return result; +-} +- + /******************************************** + * Create an identifier in the string table. + */ +@@ -2774,7 +2705,7 @@ Identifier *Lexer::idPool(const char *s) + if (!id) + { + id = new Identifier(sv->toDchars(), TOKidentifier); +- sv->ptrvalue = id; ++ sv->ptrvalue = (char *)id; + } + return id; + } +@@ -2787,7 +2718,7 @@ Identifier *Lexer::uniqueId(const char * + { char buffer[32]; + size_t slen = strlen(s); + +- assert(slen + sizeof(num) * 3 + 1 <= sizeof(buffer)); ++ assert(slen + sizeof(num) * 3 + 1 <= sizeof(buffer) / sizeof(buffer[0])); + sprintf(buffer, "%s%d", s, num); + return idPool(buffer); + } +@@ -2803,7 +2734,7 @@ Identifier *Lexer::uniqueId(const char * + + struct Keyword + { const char *name; +- enum TOK value; ++ TOK value; + }; + + static Keyword keywords[] = +@@ -2926,13 +2857,15 @@ static Keyword keywords[] = + #if DMDV2 + { "pure", TOKpure }, + { "nothrow", TOKnothrow }, +- { "__thread", TOKtls }, + { "__gshared", TOKgshared }, + { "__traits", TOKtraits }, + { "__vector", TOKvector }, + { "__overloadset", TOKoverloadset }, + { "__FILE__", TOKfile }, + { "__LINE__", TOKline }, ++ { "__MODULE__", TOKmodulestring }, ++ { "__FUNCTION__", TOKfuncstring }, ++ { "__PRETTY_FUNCTION__", TOKprettyfunc }, + { "shared", TOKshared }, + { "immutable", TOKimmutable }, + #endif +@@ -2952,10 +2885,7 @@ void Lexer::initKeywords() + { + size_t nkeywords = sizeof(keywords) / sizeof(keywords[0]); + +- stringtable.init(6151); +- +- if (global.params.Dversion == 1) +- nkeywords -= 2; ++ stringtable._init(6151); + + cmtable_init(); + +@@ -2963,9 +2893,9 @@ void Lexer::initKeywords() + { + //printf("keyword[%d] = '%s'\n",u, keywords[u].name); + const char *s = keywords[u].name; +- enum TOK v = keywords[u].value; ++ TOK v = keywords[u].value; + StringValue *sv = stringtable.insert(s, strlen(s)); +- sv->ptrvalue = (void *) new Identifier(sv->toDchars(),v); ++ sv->ptrvalue = (char *)new Identifier(sv->toDchars(),v); + + //printf("tochars[%d] = '%s'\n",v, s); + Token::tochars[v] = s; +@@ -3098,8 +3028,8 @@ void unittest_lexer() + + /* Not much here, just trying things out. + */ +- const unsigned char text[] = "int"; +- Lexer lex1(NULL, (unsigned char *)text, 0, sizeof(text), 0, 0); ++ const utf8_t text[] = "int"; ++ Lexer lex1(NULL, (utf8_t *)text, 0, sizeof(text), 0, 0); + TOK tok; + tok = lex1.nextToken(); + //printf("tok == %s, %d, %d\n", Token::toChars(tok), tok, TOKint32); +--- a/src/gcc/d/dfrontend/lexer.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/lexer.h 2014-04-01 16:32:51.000000000 +0100 +@@ -19,8 +19,8 @@ + #include "mars.h" + + struct StringTable; +-struct Identifier; +-struct Module; ++class Identifier; ++class Module; + + /* Tokens: + ( ) +@@ -69,6 +69,8 @@ enum TOK + TOKnewanonclass, TOKcomment, + TOKarrayliteral, TOKassocarrayliteral, + TOKstructliteral, ++ TOKclassreference, ++ TOKthrownexception, + + // Operators + TOKlt, TOKgt, +@@ -161,10 +163,12 @@ enum TOK + TOKoverloadset, + TOKpure, + TOKnothrow, +- TOKtls, + TOKgshared, + TOKline, + TOKfile, ++ TOKmodulestring, ++ TOKfuncstring, ++ TOKprettyfunc, + TOKshared, + TOKat, + TOKpow, +@@ -222,10 +226,11 @@ enum TOK + struct Token + { + Token *next; +- unsigned char *ptr; // pointer to first character of this token within buffer +- enum TOK value; +- unsigned char *blockComment; // doc comment string prior to this token +- unsigned char *lineComment; // doc comment for previous token ++ Loc loc; ++ utf8_t *ptr; // pointer to first character of this token within buffer ++ TOK value; ++ utf8_t *blockComment; // doc comment string prior to this token ++ utf8_t *lineComment; // doc comment for previous token + union + { + // Integers +@@ -235,45 +240,41 @@ struct Token + d_uns64 uns64value; + + // Floats +-#ifdef IN_GCC +- // real_t float80value; // can't use this in a union! +-#else + d_float80 float80value; +-#endif + + struct +- { unsigned char *ustring; // UTF8 string ++ { utf8_t *ustring; // UTF8 string + unsigned len; + unsigned char postfix; // 'c', 'w', 'd' + }; + + Identifier *ident; + }; +-#ifdef IN_GCC +- real_t float80value; // can't use this in a union! +-#endif + + static const char *tochars[TOKMAX]; + static void *operator new(size_t sz); + + Token() : next(NULL) {} + int isKeyword(); ++#ifdef DEBUG + void print(); ++#endif + const char *toChars(); +- static const char *toChars(enum TOK); ++ static const char *toChars(TOK); + }; + +-struct Lexer ++class Lexer + { ++public: + static StringTable stringtable; + static OutBuffer stringbuffer; + static Token *freelist; + +- Loc loc; // for error messages ++ Loc scanloc; // for error messages + +- unsigned char *base; // pointer to start of buffer +- unsigned char *end; // past end of buffer +- unsigned char *p; // current character ++ utf8_t *base; // pointer to start of buffer ++ utf8_t *end; // past end of buffer ++ utf8_t *p; // current character + Token token; + Module *mod; + int doDocComment; // collect doc comment information +@@ -281,7 +282,7 @@ struct Lexer + int commentToken; // !=0 means comments are TOKcomment's + + Lexer(Module *mod, +- unsigned char *base, size_t begoffset, size_t endoffset, ++ utf8_t *base, size_t begoffset, size_t endoffset, + int doDocComment, int commentToken); + + static void initKeywords(); +@@ -305,7 +306,6 @@ struct Lexer + TOK escapeStringConstant(Token *t, int wide); + TOK charConstant(Token *t, int wide); + void stringPostfix(Token *t); +- unsigned wchar(unsigned u); + TOK number(Token *t); + TOK inreal(Token *t); + void error(const char *format, ...); +@@ -316,9 +316,7 @@ struct Lexer + void getDocComment(Token *t, unsigned lineComment); + + static int isValidIdentifier(char *p); +- static unsigned char *combineComments(unsigned char *c1, unsigned char *c2); +- +- Loc tokenLoc(); ++ static utf8_t *combineComments(utf8_t *c1, utf8_t *c2); + }; + + #endif /* DMD_LEXER_H */ +--- a/src/gcc/d/dfrontend/macro.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/macro.c 2014-04-01 16:32:51.000000000 +0100 +@@ -21,16 +21,16 @@ + + #include "macro.h" + +-int isIdStart(unsigned char *p); +-int isIdTail(unsigned char *p); +-int utfStride(unsigned char *p); ++int isIdStart(utf8_t *p); ++int isIdTail(utf8_t *p); ++int utfStride(utf8_t *p); + +-unsigned char *memdup(unsigned char *p, size_t len) ++utf8_t *memdup(utf8_t *p, size_t len) + { +- return (unsigned char *)memcpy(mem.malloc(len), p, len); ++ return (utf8_t *)memcpy(mem.malloc(len), p, len); + } + +-Macro::Macro(unsigned char *name, size_t namelen, unsigned char *text, size_t textlen) ++Macro::Macro(utf8_t *name, size_t namelen, utf8_t *text, size_t textlen) + { + next = NULL; + +@@ -51,7 +51,7 @@ Macro::Macro(unsigned char *name, size_t + } + + +-Macro *Macro::search(unsigned char *name, size_t namelen) ++Macro *Macro::search(utf8_t *name, size_t namelen) + { Macro *table; + + //printf("Macro::search(%.*s)\n", namelen, name); +@@ -67,7 +67,7 @@ Macro *Macro::search(unsigned char *name + return table; + } + +-Macro *Macro::define(Macro **ptable, unsigned char *name, size_t namelen, unsigned char *text, size_t textlen) ++Macro *Macro::define(Macro **ptable, utf8_t *name, size_t namelen, utf8_t *text, size_t textlen) + { + //printf("Macro::define('%.*s' = '%.*s')\n", namelen, name, textlen, text); + +@@ -98,7 +98,7 @@ Macro *Macro::define(Macro **ptable, uns + * -1: get 2nd through end + */ + +-size_t extractArgN(unsigned char *p, size_t end, unsigned char **pmarg, size_t *pmarglen, int n) ++size_t extractArgN(utf8_t *p, size_t end, utf8_t **pmarg, size_t *pmarglen, int n) + { + /* Scan forward for matching right parenthesis. + * Nest parentheses. +@@ -130,7 +130,7 @@ size_t extractArgN(unsigned char *p, siz + *pmarg = p + v; + + for (; v < end; v++) +- { unsigned char c = p[v]; ++ { utf8_t c = p[v]; + + switch (c) + { +@@ -238,7 +238,7 @@ size_t extractArgN(unsigned char *p, siz + */ + + void Macro::expand(OutBuffer *buf, size_t start, size_t *pend, +- unsigned char *arg, size_t arglen) ++ utf8_t *arg, size_t arglen) + { + #if 0 + printf("Macro::expand(buf[%d..%d], arg = '%.*s')\n", start, *pend, arglen, arg); +@@ -259,7 +259,7 @@ void Macro::expand(OutBuffer *buf, size_ + arg = memdup(arg, arglen); + for (size_t u = start; u + 1 < end; ) + { +- unsigned char *p = buf->data; // buf->data is not loop invariant ++ utf8_t *p = buf->data; // buf->data is not loop invariant + + /* Look for $0, but not $$0, and replace it with arg. + */ +@@ -273,10 +273,10 @@ void Macro::expand(OutBuffer *buf, size_ + continue; + } + +- unsigned char c = p[u + 1]; ++ utf8_t c = p[u + 1]; + int n = (c == '+') ? -1 : c - '0'; + +- unsigned char *marg; ++ utf8_t *marg; + size_t marglen; + extractArgN(arg, arglen, &marg, &marglen, n); + if (marglen == 0) +@@ -327,7 +327,7 @@ void Macro::expand(OutBuffer *buf, size_ + */ + for (size_t u = start; u + 4 < end; ) + { +- unsigned char *p = buf->data; // buf->data is not loop invariant ++ utf8_t *p = buf->data; // buf->data is not loop invariant + + /* A valid start of macro expansion is $(c, where c is + * an id start character, and not $$(c. +@@ -335,10 +335,10 @@ void Macro::expand(OutBuffer *buf, size_ + if (p[u] == '$' && p[u + 1] == '(' && isIdStart(p+u+2)) + { + //printf("\tfound macro start '%c'\n", p[u + 2]); +- unsigned char *name = p + u + 2; ++ utf8_t *name = p + u + 2; + size_t namelen = 0; + +- unsigned char *marg; ++ utf8_t *marg; + size_t marglen; + + size_t v; +@@ -346,7 +346,7 @@ void Macro::expand(OutBuffer *buf, size_ + * beginning of macro argument (marg). + */ + for (v = u + 2; v < end; v+=utfStride(p+v)) +- { unsigned char c = p[v]; ++ { utf8_t c = p[v]; + + if (!isIdTail(p+v)) + { // We've gone past the end of the macro name. +--- a/src/gcc/d/dfrontend/macro.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/macro.h 2014-04-01 16:32:51.000000000 +0100 +@@ -24,22 +24,22 @@ struct Macro + private: + Macro *next; // next in list + +- unsigned char *name; // macro name ++ utf8_t *name; // macro name + size_t namelen; // length of macro name + +- unsigned char *text; // macro replacement text ++ utf8_t *text; // macro replacement text + size_t textlen; // length of replacement text + + int inuse; // macro is in use (don't expand) + +- Macro(unsigned char *name, size_t namelen, unsigned char *text, size_t textlen); +- Macro *search(unsigned char *name, size_t namelen); ++ Macro(utf8_t *name, size_t namelen, utf8_t *text, size_t textlen); ++ Macro *search(utf8_t *name, size_t namelen); + + public: +- static Macro *define(Macro **ptable, unsigned char *name, size_t namelen, unsigned char *text, size_t textlen); ++ static Macro *define(Macro **ptable, utf8_t *name, size_t namelen, utf8_t *text, size_t textlen); + + void expand(OutBuffer *buf, size_t start, size_t *pend, +- unsigned char *arg, size_t arglen); ++ utf8_t *arg, size_t arglen); + }; + + #endif +--- a/src/gcc/d/dfrontend/mangle.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/mangle.c 2014-04-01 16:32:51.000000000 +0100 +@@ -46,7 +46,7 @@ char *mangle(Declaration *sthis, bool is + do + { + //printf("mangle: s = %p, '%s', parent = %p\n", s, s->toChars(), s->parent); +- if (s->ident) ++ if (s->getIdent()) + { + FuncDeclaration *fd = s->isFuncDeclaration(); + if (s != sthis && fd) +@@ -79,6 +79,17 @@ L1: + buf.writeByte(Type::needThisPrefix()); + if (isv && fd && (fd->inferRetType || getFuncTemplateDecl(fd))) + { ++#if DDMD ++ TypeFunction *tfn = (TypeFunction *)sthis->type->copy(); ++ TypeFunction *tfo = (TypeFunction *)sthis->originalType; ++ tfn->purity = tfo->purity; ++ tfn->isnothrow = tfo->isnothrow; ++ tfn->isproperty = tfo->isproperty; ++ tfn->isref = fd->storage_class & STCauto ? false : tfo->isref; ++ tfn->trust = tfo->trust; ++ tfn->next = NULL; // do not mangle return type ++ tfn->toDecoBuffer(&buf, 0); ++#else + TypeFunction tfn = *(TypeFunction *)sthis->type; + TypeFunction *tfo = (TypeFunction *)sthis->originalType; + tfn.purity = tfo->purity; +@@ -88,6 +99,7 @@ L1: + tfn.trust = tfo->trust; + tfn.next = NULL; // do not mangle return type + tfn.toDecoBuffer(&buf, 0); ++#endif + } + else if (sthis->type->deco) + buf.writestring(sthis->type->deco); +@@ -105,7 +117,7 @@ L1: + return id; + } + +-char *Declaration::mangle(bool isv) ++const char *Declaration::mangle(bool isv) + #if __DMC__ + __out(result) + { +@@ -150,7 +162,7 @@ char *Declaration::mangle(bool isv) + return ident->toChars(); + + default: +- fprintf(stdmsg, "'%s', linkage = %d\n", toChars(), linkage); ++ fprintf(stderr, "'%s', linkage = %d\n", toChars(), linkage); + assert(0); + } + } +@@ -164,7 +176,49 @@ char *Declaration::mangle(bool isv) + return p; + } + +-char *FuncDeclaration::mangle(bool isv) ++/****************************************************************************** ++ * Normally FuncDeclaration and FuncAliasDeclaration have overloads. ++ * If and only if there is no overloads, mangle() could return ++ * exact mangled name. ++ * ++ * module test; ++ * void foo(long) {} // _D4test3fooFlZv ++ * void foo(string) {} // _D4test3fooFAyaZv ++ * ++ * // from FuncDeclaration::mangle(). ++ * pragma(msg, foo.mangleof); // prints unexact mangled name "4test3foo" ++ * // by calling Dsymbol::mangle() ++ * ++ * // from FuncAliasDeclaration::mangle() ++ * pragma(msg, __traits(getOverloads, test, "foo")[0].mangleof); // "_D4test3fooFlZv" ++ * pragma(msg, __traits(getOverloads, test, "foo")[1].mangleof); // "_D4test3fooFAyaZv" ++ * ++ * If a function has no overloads, .mangleof property still returns exact mangled name. ++ * ++ * void bar() {} ++ * pragma(msg, bar.mangleof); // still prints "_D4test3barFZv" ++ * // by calling FuncDeclaration::mangleExact(). ++ */ ++const char *FuncDeclaration::mangle(bool isv) ++{ ++ return isUnique() ? mangleExact(isv) : Dsymbol::mangle(isv); ++} ++// ditto ++const char *FuncAliasDeclaration::mangle(bool isv) ++{ ++ FuncDeclaration *f = toAliasFunc(); ++ FuncAliasDeclaration *fa = f->isFuncAliasDeclaration(); ++ if (!hasOverloads && !fa) ++ return f->mangleExact(isv); ++ if (fa) ++ return fa->mangle(isv); ++ return Dsymbol::mangle(isv); ++} ++ ++/****************************************************************************** ++ * Returns exact mangled name of function. ++ */ ++const char *FuncDeclaration::mangleExact(bool isv) + #if __DMC__ + __out(result) + { +@@ -173,6 +227,11 @@ char *FuncDeclaration::mangle(bool isv) + __body + #endif + { ++ assert(!isFuncAliasDeclaration()); ++ ++ if (mangleOverride) ++ return mangleOverride; ++ + if (isMain()) + return (char *)"_Dmain"; + +@@ -183,22 +242,36 @@ char *FuncDeclaration::mangle(bool isv) + return Declaration::mangle(isv); + } + ++const char *VarDeclaration::mangle(bool isv) ++#if __DMC__ ++ __out(result) ++ { ++ assert(strlen(result) > 0); ++ } ++ __body ++#endif ++ { ++ if (mangleOverride) ++ return mangleOverride; ++ ++ return Declaration::mangle(); ++ } + +-char *TypedefDeclaration::mangle(bool isv) ++const char *TypedefDeclaration::mangle(bool isv) + { + //printf("TypedefDeclaration::mangle() '%s'\n", toChars()); + return Dsymbol::mangle(isv); + } + + +-char *AggregateDeclaration::mangle(bool isv) ++const char *AggregateDeclaration::mangle(bool isv) + { + #if 1 + //printf("AggregateDeclaration::mangle() '%s'\n", toChars()); + if (Dsymbol *p = toParent2()) + { if (FuncDeclaration *fd = p->isFuncDeclaration()) + { // This might be the Voldemort Type +- char *id = Dsymbol::mangle(fd->inferRetType || getFuncTemplateDecl(fd)); ++ const char *id = Dsymbol::mangle(fd->inferRetType || getFuncTemplateDecl(fd)); + //printf("isv ad %s, %s\n", toChars(), id); + return id; + } +@@ -207,13 +280,13 @@ char *AggregateDeclaration::mangle(bool + return Dsymbol::mangle(isv); + } + +-char *StructDeclaration::mangle(bool isv) ++const char *StructDeclaration::mangle(bool isv) + { + //printf("StructDeclaration::mangle() '%s'\n", toChars()); + return AggregateDeclaration::mangle(isv); + } + +-char *ClassDeclaration::mangle(bool isv) ++const char *ClassDeclaration::mangle(bool isv) + { + Dsymbol *parentsave = parent; + +@@ -233,19 +306,19 @@ char *ClassDeclaration::mangle(bool isv) + ident == Id::TypeInfo_Typedef || + ident == Id::TypeInfo_Tuple || + this == object || +- this == classinfo || ++ this == Type::typeinfoclass || + this == Module::moduleinfo || + memcmp(ident->toChars(), "TypeInfo_", 9) == 0 + ) + parent = NULL; + +- char *id = AggregateDeclaration::mangle(isv); ++ const char *id = AggregateDeclaration::mangle(isv); + parent = parentsave; + return id; + } + + +-char *TemplateInstance::mangle(bool isv) ++const char *TemplateInstance::mangle(bool isv) + { + OutBuffer buf; + +@@ -255,15 +328,16 @@ char *TemplateInstance::mangle(bool isv) + printf(" parent = %s %s", parent->kind(), parent->toChars()); + printf("\n"); + #endif +- char *id = ident ? ident->toChars() : toChars(); ++ getIdent(); ++ const char *id = ident ? ident->toChars() : toChars(); + if (!tempdecl) + error("is not defined"); + else + { +- Dsymbol *par = isnested || isTemplateMixin() ? parent : tempdecl->parent; ++ Dsymbol *par = enclosing || isTemplateMixin() ? parent : tempdecl->parent; + if (par) + { +- char *p = par->mangle(); ++ const char *p = par->mangle(isv); + if (p[0] == '_' && p[1] == 'D') + p += 2; + buf.writestring(p); +@@ -278,7 +352,7 @@ char *TemplateInstance::mangle(bool isv) + + + +-char *Dsymbol::mangle(bool isv) ++const char *Dsymbol::mangle(bool isv) + { + OutBuffer buf; + char *id; +@@ -292,7 +366,8 @@ char *Dsymbol::mangle(bool isv) + id = ident ? ident->toChars() : toChars(); + if (parent) + { +- char *p = parent->mangle(isv); ++ FuncDeclaration *f = parent->isFuncDeclaration(); ++ const char *p = f ? f->mangleExact(isv) : parent->mangle(isv); + if (p[0] == '_' && p[1] == 'D') + p += 2; + buf.writestring(p); +--- a/src/gcc/d/dfrontend/mars.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/mars.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1744 +0,0 @@ +- +-// Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars +-// All Rights Reserved +-// written by Walter Bright +-// http://www.digitalmars.com +-// https://github.com/D-Programming-Language/dmd/blob/master/src/mars.c +-// License for redistribution is by either the Artistic License +-// in artistic.txt, or the GNU General Public License in gnu.txt. +-// See the included readme.txt for details. +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-#if linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun +-#include +-#endif +- +-#include "rmem.h" +-#include "root.h" +-#include "async.h" +- +-#include "mars.h" +-#include "module.h" +-#include "mtype.h" +-#include "id.h" +-#include "cond.h" +-#include "expression.h" +-#include "lexer.h" +-#ifndef IN_GCC +-#include "lib.h" +-#include "json.h" +- +-#if WINDOWS_SEH +-#include +-long __cdecl __ehfilter(LPEXCEPTION_POINTERS ep); +-#endif +-#endif +- +- +-int response_expand(size_t *pargc, char ***pargv); +-void browse(const char *url); +-void getenv_setargv(const char *envvar, size_t *pargc, char** *pargv); +- +-void obj_start(char *srcfile); +-void obj_end(Library *library, File *objfile); +- +-void printCtfePerformanceStats(); +- +-static bool parse_arch(size_t argc, char** argv, bool is64bit); +- +-Global global; +- +-Global::Global() +-{ +- mars_ext = "d"; +- sym_ext = "d"; +- hdr_ext = "di"; +- doc_ext = "html"; +- ddoc_ext = "ddoc"; +- json_ext = "json"; +- map_ext = "map"; +- +-#ifndef IN_GCC +-#if TARGET_WINDOS +- obj_ext = "obj"; +-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- obj_ext = "o"; +-#else +-#error "fix this" +-#endif +-#else +- obj_ext = "o"; +-#endif +- +-#ifndef IN_GCC +-#if TARGET_WINDOS +- lib_ext = "lib"; +-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- lib_ext = "a"; +-#else +-#error "fix this" +-#endif +-#else +- lib_ext = "a"; +-#endif +- +-#ifndef IN_GCC +-#if TARGET_WINDOS +- dll_ext = "dll"; +-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- dll_ext = "so"; +-#elif TARGET_OSX +- dll_ext = "dylib"; +-#else +-#error "fix this" +-#endif +-#else +- dll_ext = "so"; +-#endif +- +- copyright = "Copyright (c) 1999-2012 by Digital Mars"; +- written = "written by Walter Bright"; +- version = "v" +-#include "verstr.h" +- ; +- +- global.structalign = STRUCTALIGN_DEFAULT; +- +- memset(¶ms, 0, sizeof(Param)); +-} +- +-unsigned Global::startGagging() +-{ +- ++gag; +- return gaggedErrors; +-} +- +-bool Global::endGagging(unsigned oldGagged) +-{ +- bool anyErrs = (gaggedErrors != oldGagged); +- --gag; +- // Restore the original state of gagged errors; set total errors +- // to be original errors + new ungagged errors. +- errors -= (gaggedErrors - oldGagged); +- gaggedErrors = oldGagged; +- return anyErrs; +-} +- +-bool Global::isSpeculativeGagging() +-{ +- return gag && gag == speculativeGag; +-} +- +- +-char *Loc::toChars() +-{ +- OutBuffer buf; +- +- if (filename) +- { +- buf.printf("%s", filename); +- } +- +- if (linnum) +-#ifndef IN_GCC +- buf.printf("(%d)", linnum); +-#else +- buf.printf(":%u", linnum); +-#endif +- buf.writeByte(0); +- return (char *)buf.extractData(); +-} +- +-Loc::Loc(Module *mod, unsigned linnum) +-{ +- this->linnum = linnum; +- this->filename = mod ? mod->srcfile->toChars() : NULL; +-} +- +-bool Loc::equals(const Loc& loc) +-{ +- return linnum == loc.linnum && FileName::equals(filename, loc.filename); +-} +- +-/************************************** +- * Print error message +- */ +- +-void error(Loc loc, const char *format, ...) +-{ +- va_list ap; +- va_start(ap, format); +- verror(loc, format, ap); +- va_end( ap ); +-} +- +-void error(const char *filename, unsigned linnum, const char *format, ...) +-{ Loc loc; +- loc.filename = (char *)filename; +- loc.linnum = linnum; +- va_list ap; +- va_start(ap, format); +- verror(loc, format, ap); +- va_end( ap ); +-} +- +-void warning(Loc loc, const char *format, ...) +-{ +- va_list ap; +- va_start(ap, format); +- vwarning(loc, format, ap); +- va_end( ap ); +-} +- +-/************************************** +- * Print supplementary message about the last error +- * Used for backtraces, etc +- */ +-void errorSupplemental(Loc loc, const char *format, ...) +-{ +- va_list ap; +- va_start(ap, format); +- verrorSupplemental(loc, format, ap); +- va_end( ap ); +-} +- +-void deprecation(Loc loc, const char *format, ...) +-{ +- va_list ap; +- va_start(ap, format); +- vdeprecation(loc, format, ap); +- +- va_end( ap ); +-} +- +-// Just print, doesn't care about gagging +-void verrorPrint(Loc loc, const char *header, const char *format, va_list ap, +- const char *p1, const char *p2) +-{ +- char *p = loc.toChars(); +- +- if (*p) +- fprintf(stdmsg, "%s: ", p); +- mem.free(p); +- +- fputs(header, stdmsg); +- if (p1) +- fprintf(stdmsg, "%s ", p1); +- if (p2) +- fprintf(stdmsg, "%s ", p2); +-#if _MSC_VER +- // MS doesn't recognize %zu format +- OutBuffer tmp; +- tmp.vprintf(format, ap); +- fprintf(stdmsg, "%s", tmp.toChars()); +-#else +- vfprintf(stdmsg, format, ap); +-#endif +- fprintf(stdmsg, "\n"); +- fflush(stdmsg); +-} +- +-// header is "Error: " by default (see mars.h) +-void verror(Loc loc, const char *format, va_list ap, +- const char *p1, const char *p2, const char *header) +-{ +- if (!global.gag) +- { +- verrorPrint(loc, header, format, ap, p1, p2); +- if (global.errors >= 20) // moderate blizzard of cascading messages +- fatal(); +-//halt(); +- } +- else +- { +- global.gaggedErrors++; +- } +- global.errors++; +-} +- +-// Doesn't increase error count, doesn't print "Error:". +-void verrorSupplemental(Loc loc, const char *format, va_list ap) +-{ +- if (!global.gag) +- verrorPrint(loc, " ", format, ap); +-} +- +-void vwarning(Loc loc, const char *format, va_list ap) +-{ +- if (global.params.warnings && !global.gag) +- { +- verrorPrint(loc, "Warning: ", format, ap); +-//halt(); +- if (global.params.warnings == 1) +- global.warnings++; // warnings don't count if gagged +- } +-} +- +-void vdeprecation(Loc loc, const char *format, va_list ap, +- const char *p1, const char *p2) +-{ +- static const char *header = "Deprecation: "; +- if (global.params.useDeprecated == 0) +- verror(loc, format, ap, p1, p2, header); +- else if (global.params.useDeprecated == 2 && !global.gag) +- verrorPrint(loc, header, format, ap, p1, p2); +-} +- +-/*************************************** +- * Call this after printing out fatal error messages to clean up and exit +- * the compiler. +- */ +- +-void fatal() +-{ +-#if 0 +- halt(); +-#endif +- exit(EXIT_FAILURE); +-} +- +-/************************************** +- * Try to stop forgetting to remove the breakpoints from +- * release builds. +- */ +-void halt() +-{ +-#ifdef DEBUG +- *(volatile char*)0=0; +-#endif +-} +- +-#ifndef IN_GCC +- +-extern void backend_init(); +-extern void backend_term(); +- +-void usage() +-{ +-#if TARGET_LINUX +- const char fpic[] ="\ +- -fPIC generate position independent code\n\ +-"; +-#else +- const char fpic[] = ""; +-#endif +- printf("DMD%d D Compiler %s\n%s %s\n", +- sizeof(size_t) * 8, +- global.version, global.copyright, global.written); +- printf("\ +-Documentation: http://dlang.org/\n\ +-Usage:\n\ +- dmd files.d ... { -switch }\n\ +-\n\ +- files.d D source files\n\ +- @cmdfile read arguments from cmdfile\n\ +- -c do not link\n\ +- -cov do code coverage analysis\n\ +- -D generate documentation\n\ +- -Dddocdir write documentation file to docdir directory\n\ +- -Dffilename write documentation file to filename\n\ +- -d silently allow deprecated features\n\ +- -dw show use of deprecated features as warnings (default)\n\ +- -de show use of deprecated features as errors (halt compilation)\n\ +- -debug compile in debug code\n\ +- -debug=level compile in debug code <= level\n\ +- -debug=ident compile in debug code identified by ident\n\ +- -debuglib=name set symbolic debug library to name\n\ +- -defaultlib=name set default library to name\n\ +- -deps=filename write module dependencies to filename\n%s" +-" -g add symbolic debug info\n\ +- -gc add symbolic debug info, pretend to be C\n\ +- -gs always emit stack frame\n\ +- -gx add stack stomp code\n\ +- -H generate 'header' file\n\ +- -Hddirectory write 'header' file to directory\n\ +- -Hffilename write 'header' file to filename\n\ +- --help print help\n\ +- -Ipath where to look for imports\n\ +- -ignore ignore unsupported pragmas\n\ +- -inline do function inlining\n\ +- -Jpath where to look for string imports\n\ +- -Llinkerflag pass linkerflag to link\n\ +- -lib generate library rather than object files\n" +-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +-" -m32 generate 32 bit code\n\ +- -m64 generate 64 bit code\n" +-#endif +-" -man open web browser on manual page\n\ +- -map generate linker .map file\n\ +- -noboundscheck turns off array bounds checking for all functions\n\ +- -O optimize\n\ +- -o- do not write object file\n\ +- -odobjdir write object & library files to directory objdir\n\ +- -offilename name output file to filename\n\ +- -op do not strip paths from source file\n\ +- -profile profile runtime performance of generated code\n\ +- -property enforce property syntax\n\ +- -quiet suppress unnecessary messages\n\ +- -release compile release version\n\ +- -run srcfile args... run resulting program, passing args\n" +-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +-" -shared generate shared library\n" +-#endif +-" -unittest compile in unit tests\n\ +- -v verbose\n\ +- -version=level compile in version code >= level\n\ +- -version=ident compile in version code identified by ident\n\ +- -vtls list all variables going into thread local storage\n\ +- -w warnings as errors (compilation will halt)\n\ +- -wi warnings as messages (compilation will continue)\n\ +- -X generate JSON file\n\ +- -Xffilename write JSON file to filename\n\ +-", fpic); +-} +- +-extern signed char tyalignsize[]; +- +-#if _WIN32 && __DMC__ +-extern "C" +-{ +- extern int _xi_a; +- extern int _end; +-} +-#endif +- +-int tryMain(size_t argc, char *argv[]) +-{ +- mem.init(); // initialize storage allocator +- mem.setStackBottom(&argv); +-#if _WIN32 && __DMC__ +- mem.addroots((char *)&_xi_a, (char *)&_end); +-#endif +- +- Strings files; +- Strings libmodules; +- char *p; +- Module *m; +- size_t argcstart = argc; +- int setdebuglib = 0; +- char noboundscheck = 0; +- int setdefaultlib = 0; +- const char *inifilename = NULL; +- +-#ifdef DEBUG +- printf("DMD %s DEBUG\n", global.version); +-#endif +- +- unittests(); +- +- // Check for malformed input +- if (argc < 1 || !argv) +- { +- Largs: +- error(0, "missing or null command line arguments"); +- fatal(); +- } +- for (size_t i = 0; i < argc; i++) +- { +- if (!argv[i]) +- goto Largs; +- } +- +- if (response_expand(&argc,&argv)) // expand response files +- error(0, "can't open response file"); +- +- files.reserve(argc - 1); +- +- // Set default values +- global.params.argv0 = argv[0]; +- global.params.link = 1; +- global.params.useAssert = 1; +- global.params.useInvariants = 1; +- global.params.useIn = 1; +- global.params.useOut = 1; +- global.params.useArrayBounds = 2; // default to all functions +- global.params.useSwitchError = 1; +- global.params.useInline = 0; +- global.params.obj = 1; +- global.params.Dversion = 2; +- global.params.quiet = 1; +- global.params.useDeprecated = 2; +- +- global.params.linkswitches = new Strings(); +- global.params.libfiles = new Strings(); +- global.params.objfiles = new Strings(); +- global.params.ddocfiles = new Strings(); +- +- // Default to -m32 for 32 bit dmd, -m64 for 64 bit dmd +- global.params.is64bit = (sizeof(size_t) == 8); +- +-#if TARGET_WINDOS +- global.params.is64bit = 0; +- global.params.defaultlibname = "phobos"; +-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- global.params.defaultlibname = "phobos2"; +-#else +-#error "fix this" +-#endif +- +- // Predefine version identifiers +- VersionCondition::addPredefinedGlobalIdent("DigitalMars"); +- +-#if TARGET_WINDOS +- VersionCondition::addPredefinedGlobalIdent("Windows"); +- global.params.isWindows = 1; +-#elif TARGET_LINUX +- VersionCondition::addPredefinedGlobalIdent("Posix"); +- VersionCondition::addPredefinedGlobalIdent("linux"); +- global.params.isLinux = 1; +-#elif TARGET_OSX +- VersionCondition::addPredefinedGlobalIdent("Posix"); +- VersionCondition::addPredefinedGlobalIdent("OSX"); +- global.params.isOSX = 1; +- +- // For legacy compatibility +- VersionCondition::addPredefinedGlobalIdent("darwin"); +-#elif TARGET_FREEBSD +- VersionCondition::addPredefinedGlobalIdent("Posix"); +- VersionCondition::addPredefinedGlobalIdent("FreeBSD"); +- global.params.isFreeBSD = 1; +-#elif TARGET_OPENBSD +- VersionCondition::addPredefinedGlobalIdent("Posix"); +- VersionCondition::addPredefinedGlobalIdent("OpenBSD"); +- global.params.isFreeBSD = 1; +-#elif TARGET_SOLARIS +- VersionCondition::addPredefinedGlobalIdent("Posix"); +- VersionCondition::addPredefinedGlobalIdent("Solaris"); +- global.params.isSolaris = 1; +-#else +-#error "fix this" +-#endif +- +- VersionCondition::addPredefinedGlobalIdent("LittleEndian"); +- //VersionCondition::addPredefinedGlobalIdent("D_Bits"); +-#if DMDV2 +- VersionCondition::addPredefinedGlobalIdent("D_Version2"); +-#endif +- VersionCondition::addPredefinedGlobalIdent("all"); +- +-#if _WIN32 +- inifilename = inifile(argv[0], "sc.ini", "Environment"); +-#elif linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun +- inifilename = inifile(argv[0], "dmd.conf", "Environment"); +-#else +-#error "fix this" +-#endif +- +- size_t dflags_argc = 0; +- char** dflags_argv = NULL; +- getenv_setargv("DFLAGS", &dflags_argc, &dflags_argv); +- +- bool is64bit = global.params.is64bit; // use default +- is64bit = parse_arch(argc, argv, is64bit); +- is64bit = parse_arch(dflags_argc, dflags_argv, is64bit); +- global.params.is64bit = is64bit; +- +- inifile(argv[0], inifilename, is64bit ? "Environment64" : "Environment32"); +- +- getenv_setargv("DFLAGS", &argc, &argv); +- +-#if 0 +- for (size_t i = 0; i < argc; i++) +- { +- printf("argv[%d] = '%s'\n", i, argv[i]); +- } +-#endif +- +- for (size_t i = 1; i < argc; i++) +- { +- p = argv[i]; +- if (*p == '-') +- { +- if (strcmp(p + 1, "de") == 0) +- global.params.useDeprecated = 0; +- else if (strcmp(p + 1, "d") == 0) +- global.params.useDeprecated = 1; +- else if (strcmp(p + 1, "dw") == 0) +- global.params.useDeprecated = 2; +- else if (strcmp(p + 1, "c") == 0) +- global.params.link = 0; +- else if (strcmp(p + 1, "cov") == 0) +- global.params.cov = 1; +-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- else if (strcmp(p + 1, "shared") == 0 +-#if TARGET_OSX +- // backwards compatibility with old switch +- || strcmp(p + 1, "dylib") == 0 +-#endif +- ) +- global.params.dll = 1; +- else if (strcmp(p + 1, "fPIC") == 0) +- global.params.pic = 1; +-#endif +- else if (strcmp(p + 1, "map") == 0) +- global.params.map = 1; +- else if (strcmp(p + 1, "multiobj") == 0) +- global.params.multiobj = 1; +- else if (strcmp(p + 1, "g") == 0) +- global.params.symdebug = 1; +- else if (strcmp(p + 1, "gc") == 0) +- global.params.symdebug = 2; +- else if (strcmp(p + 1, "gs") == 0) +- global.params.alwaysframe = 1; +- else if (strcmp(p + 1, "gx") == 0) +- global.params.stackstomp = true; +- else if (strcmp(p + 1, "gt") == 0) +- { error(0, "use -profile instead of -gt"); +- global.params.trace = 1; +- } +- else if (strcmp(p + 1, "m32") == 0) +- global.params.is64bit = 0; +- else if (strcmp(p + 1, "m64") == 0) +- global.params.is64bit = 1; +- else if (strcmp(p + 1, "profile") == 0) +- global.params.trace = 1; +- else if (strcmp(p + 1, "v") == 0) +- global.params.verbose = 1; +-#if DMDV2 +- else if (strcmp(p + 1, "vtls") == 0) +- global.params.vtls = 1; +-#endif +- else if (strcmp(p + 1, "v1") == 0) +- { +-#if DMDV1 +- global.params.Dversion = 1; +-#else +- error(0, "use DMD 1.0 series compilers for -v1 switch"); +- break; +-#endif +- } +- else if (strcmp(p + 1, "w") == 0) +- global.params.warnings = 1; +- else if (strcmp(p + 1, "wi") == 0) +- global.params.warnings = 2; +- else if (strcmp(p + 1, "O") == 0) +- global.params.optimize = 1; +- else if (p[1] == 'o') +- { +- switch (p[2]) +- { +- case '-': +- global.params.obj = 0; +- break; +- +- case 'd': +- if (!p[3]) +- goto Lnoarg; +- global.params.objdir = p + 3; +- break; +- +- case 'f': +- if (!p[3]) +- goto Lnoarg; +- global.params.objname = p + 3; +- break; +- +- case 'p': +- if (p[3]) +- goto Lerror; +- global.params.preservePaths = 1; +- break; +- +- case 0: +- error(0, "-o no longer supported, use -of or -od"); +- break; +- +- default: +- goto Lerror; +- } +- } +- else if (p[1] == 'D') +- { global.params.doDocComments = 1; +- switch (p[2]) +- { +- case 'd': +- if (!p[3]) +- goto Lnoarg; +- global.params.docdir = p + 3; +- break; +- case 'f': +- if (!p[3]) +- goto Lnoarg; +- global.params.docname = p + 3; +- break; +- +- case 0: +- break; +- +- default: +- goto Lerror; +- } +- } +- else if (p[1] == 'H') +- { global.params.doHdrGeneration = 1; +- switch (p[2]) +- { +- case 'd': +- if (!p[3]) +- goto Lnoarg; +- global.params.hdrdir = p + 3; +- break; +- +- case 'f': +- if (!p[3]) +- goto Lnoarg; +- global.params.hdrname = p + 3; +- break; +- +- case 0: +- break; +- +- default: +- goto Lerror; +- } +- } +- else if (p[1] == 'X') +- { global.params.doXGeneration = 1; +- switch (p[2]) +- { +- case 'f': +- if (!p[3]) +- goto Lnoarg; +- global.params.xfilename = p + 3; +- break; +- +- case 0: +- break; +- +- default: +- goto Lerror; +- } +- } +- else if (strcmp(p + 1, "ignore") == 0) +- global.params.ignoreUnsupportedPragmas = 1; +- else if (strcmp(p + 1, "property") == 0) +- global.params.enforcePropertySyntax = 1; +- else if (strcmp(p + 1, "inline") == 0) +- global.params.useInline = 1; +- else if (strcmp(p + 1, "lib") == 0) +- global.params.lib = 1; +- else if (strcmp(p + 1, "nofloat") == 0) +- global.params.nofloat = 1; +- else if (strcmp(p + 1, "quiet") == 0) +- global.params.quiet = 1; +- else if (strcmp(p + 1, "release") == 0) +- global.params.release = 1; +- else if (strcmp(p + 1, "betterC") == 0) +- global.params.betterC = 1; +-#if DMDV2 +- else if (strcmp(p + 1, "noboundscheck") == 0) +- noboundscheck = 1; +-#endif +- else if (strcmp(p + 1, "unittest") == 0) +- global.params.useUnitTests = 1; +- else if (p[1] == 'I') +- { +- if (!global.params.imppath) +- global.params.imppath = new Strings(); +- global.params.imppath->push(p + 2); +- } +- else if (p[1] == 'J') +- { +- if (!global.params.fileImppath) +- global.params.fileImppath = new Strings(); +- global.params.fileImppath->push(p + 2); +- } +- else if (memcmp(p + 1, "debug", 5) == 0 && p[6] != 'l') +- { +- // Parse: +- // -debug +- // -debug=number +- // -debug=identifier +- if (p[6] == '=') +- { +- if (isdigit((unsigned char)p[7])) +- { long level; +- +- errno = 0; +- level = strtol(p + 7, &p, 10); +- if (*p || errno || level > INT_MAX) +- goto Lerror; +- DebugCondition::setGlobalLevel((int)level); +- } +- else if (Lexer::isValidIdentifier(p + 7)) +- DebugCondition::addGlobalIdent(p + 7); +- else +- goto Lerror; +- } +- else if (p[6]) +- goto Lerror; +- else +- global.params.debuglevel = 1; +- } +- else if (memcmp(p + 1, "version", 7) == 0) +- { +- // Parse: +- // -version=number +- // -version=identifier +- if (p[8] == '=') +- { +- if (isdigit((unsigned char)p[9])) +- { long level; +- +- errno = 0; +- level = strtol(p + 9, &p, 10); +- if (*p || errno || level > INT_MAX) +- goto Lerror; +- VersionCondition::setGlobalLevel((int)level); +- } +- else if (Lexer::isValidIdentifier(p + 9)) +- VersionCondition::addGlobalIdent(p + 9); +- else +- goto Lerror; +- } +- else +- goto Lerror; +- } +- else if (strcmp(p + 1, "-b") == 0) +- global.params.debugb = 1; +- else if (strcmp(p + 1, "-c") == 0) +- global.params.debugc = 1; +- else if (strcmp(p + 1, "-f") == 0) +- global.params.debugf = 1; +- else if (strcmp(p + 1, "-help") == 0) +- { usage(); +- exit(EXIT_SUCCESS); +- } +- else if (strcmp(p + 1, "-r") == 0) +- global.params.debugr = 1; +- else if (strcmp(p + 1, "-x") == 0) +- global.params.debugx = 1; +- else if (strcmp(p + 1, "-y") == 0) +- global.params.debugy = 1; +- else if (p[1] == 'L') +- { +- global.params.linkswitches->push(p + 2); +- } +- else if (memcmp(p + 1, "defaultlib=", 11) == 0) +- { +- setdefaultlib = 1; +- global.params.defaultlibname = p + 1 + 11; +- } +- else if (memcmp(p + 1, "debuglib=", 9) == 0) +- { +- setdebuglib = 1; +- global.params.debuglibname = p + 1 + 9; +- } +- else if (memcmp(p + 1, "deps=", 5) == 0) +- { +- global.params.moduleDepsFile = p + 1 + 5; +- if (!global.params.moduleDepsFile[0]) +- goto Lnoarg; +- global.params.moduleDeps = new OutBuffer; +- } +- else if (memcmp(p + 1, "man", 3) == 0) +- { +-#if _WIN32 +-#if DMDV1 +- browse("http://www.digitalmars.com/d/1.0/dmd-windows.html"); +-#else +- browse("http://dlang.org/dmd-windows.html"); +-#endif +-#endif +-#if linux +-#if DMDV1 +- browse("http://www.digitalmars.com/d/1.0/dmd-linux.html"); +-#else +- browse("http://dlang.org/dmd-linux.html"); +-#endif +-#endif +-#if __APPLE__ +-#if DMDV1 +- browse("http://www.digitalmars.com/d/1.0/dmd-osx.html"); +-#else +- browse("http://dlang.org/dmd-osx.html"); +-#endif +-#endif +-#if __FreeBSD__ +-#if DMDV1 +- browse("http://www.digitalmars.com/d/1.0/dmd-freebsd.html"); +-#else +- browse("http://dlang.org/dmd-freebsd.html"); +-#endif +-#endif +-#if __OpenBSD__ +-#if DMDV1 +- browse("http://www.digitalmars.com/d/1.0/dmd-openbsd.html"); +-#else +- browse("http://dlang.org/dmd-openbsd.html"); +-#endif +-#endif +- exit(EXIT_SUCCESS); +- } +- else if (strcmp(p + 1, "run") == 0) +- { global.params.run = 1; +- global.params.runargs_length = ((i >= argcstart) ? argc : argcstart) - i - 1; +- if (global.params.runargs_length) +- { +- const char *ext = FileName::ext(argv[i + 1]); +- if (ext && FileName::equals(ext, "d") == 0 +- && FileName::equals(ext, "di") == 0) +- { +- error(0, "-run must be followed by a source file, not '%s'", argv[i + 1]); +- break; +- } +- +- files.push(argv[i + 1]); +- global.params.runargs = &argv[i + 2]; +- i += global.params.runargs_length; +- global.params.runargs_length--; +- } +- else +- { global.params.run = 0; +- goto Lnoarg; +- } +- } +- else +- { +- Lerror: +- error(0, "unrecognized switch '%s'", argv[i]); +- continue; +- +- Lnoarg: +- error(0, "argument expected for switch '%s'", argv[i]); +- continue; +- } +- } +- else +- { +-#if TARGET_WINDOS +- const char *ext = FileName::ext(p); +- if (ext && FileName::compare(ext, "exe") == 0) +- { +- global.params.objname = p; +- continue; +- } +-#endif +- files.push(p); +- } +- } +- +- if(global.params.is64bit != is64bit) +- error(0, "the architecture must not be changed in the %s section of %s", +- is64bit ? "Environment64" : "Environment32", inifilename); +- +- if (global.errors) +- { +- fatal(); +- } +- if (files.dim == 0) +- { usage(); +- return EXIT_FAILURE; +- } +- +- if (!setdebuglib) +- global.params.debuglibname = global.params.defaultlibname; +- +-#if TARGET_OSX +- global.params.pic = 1; +-#endif +- +-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS +- if (global.params.lib && global.params.dll) +- error(0, "cannot mix -lib and -shared"); +-#endif +- +- if (global.params.release) +- { global.params.useInvariants = 0; +- global.params.useIn = 0; +- global.params.useOut = 0; +- global.params.useAssert = 0; +- global.params.useArrayBounds = 1; +- global.params.useSwitchError = 0; +- } +- if (noboundscheck) +- global.params.useArrayBounds = 0; +- +- if (global.params.run) +- global.params.quiet = 1; +- +- if (global.params.useUnitTests) +- global.params.useAssert = 1; +- +- if (!global.params.obj || global.params.lib) +- global.params.link = 0; +- +- if (global.params.link) +- { +- global.params.exefile = global.params.objname; +- global.params.oneobj = 1; +- if (global.params.objname) +- { +- /* Use this to name the one object file with the same +- * name as the exe file. +- */ +- global.params.objname = const_cast(FileName::forceExt(global.params.objname, global.obj_ext)); +- +- /* If output directory is given, use that path rather than +- * the exe file path. +- */ +- if (global.params.objdir) +- { const char *name = FileName::name(global.params.objname); +- global.params.objname = (char *)FileName::combine(global.params.objdir, name); +- } +- } +- } +- else if (global.params.lib) +- { +- global.params.libname = global.params.objname; +- global.params.objname = NULL; +- +- // Haven't investigated handling these options with multiobj +- if (!global.params.cov && !global.params.trace +-#if 0 && TARGET_WINDOS +- /* multiobj causes class/struct debug info to be attached to init-data, +- * but this will not be linked into the executable, so this info is lost. +- * Bugzilla 4014 +- */ +- && !global.params.symdebug +-#endif +- ) +- global.params.multiobj = 1; +- } +- else if (global.params.run) +- { +- error(0, "flags conflict with -run"); +- fatal(); +- } +- else +- { +- if (global.params.objname && files.dim > 1) +- { +- global.params.oneobj = 1; +- //error("multiple source files, but only one .obj name"); +- //fatal(); +- } +- } +- if (global.params.is64bit) +- { +- VersionCondition::addPredefinedGlobalIdent("D_InlineAsm_X86_64"); +- VersionCondition::addPredefinedGlobalIdent("X86_64"); +- VersionCondition::addPredefinedGlobalIdent("D_LP64"); +- VersionCondition::addPredefinedGlobalIdent("D_SIMD"); +-#if TARGET_WINDOS +- VersionCondition::addPredefinedGlobalIdent("Win64"); +- if (!setdefaultlib) +- { global.params.defaultlibname = "phobos64"; +- if (!setdebuglib) +- global.params.debuglibname = global.params.defaultlibname; +- } +-#endif +- } +- else +- { +- VersionCondition::addPredefinedGlobalIdent("D_InlineAsm"); +- VersionCondition::addPredefinedGlobalIdent("D_InlineAsm_X86"); +- VersionCondition::addPredefinedGlobalIdent("X86"); +-#if TARGET_OSX +- VersionCondition::addPredefinedGlobalIdent("D_SIMD"); +-#endif +-#if TARGET_WINDOS +- VersionCondition::addPredefinedGlobalIdent("Win32"); +-#endif +- } +- if (global.params.doDocComments) +- VersionCondition::addPredefinedGlobalIdent("D_Ddoc"); +- if (global.params.cov) +- VersionCondition::addPredefinedGlobalIdent("D_Coverage"); +- if (global.params.pic) +- VersionCondition::addPredefinedGlobalIdent("D_PIC"); +-#if DMDV2 +- if (global.params.useUnitTests) +- VersionCondition::addPredefinedGlobalIdent("unittest"); +- if (global.params.useAssert) +- VersionCondition::addPredefinedGlobalIdent("assert"); +- if (noboundscheck) +- VersionCondition::addPredefinedGlobalIdent("D_NoBoundsChecks"); +-#endif +- +- VersionCondition::addPredefinedGlobalIdent("D_HardFloat"); +- +- // Initialization +- Type::init(); +- Id::initialize(); +- Module::init(); +- initPrecedence(); +- +- if (global.params.verbose) +- { printf("binary %s\n", argv[0]); +- printf("version %s\n", global.version); +- printf("config %s\n", inifilename ? inifilename : "(none)"); +- } +- +- //printf("%d source files\n",files.dim); +- +- // Build import search path +- if (global.params.imppath) +- { +- for (size_t i = 0; i < global.params.imppath->dim; i++) +- { +- char *path = (*global.params.imppath)[i]; +- Strings *a = FileName::splitPath(path); +- +- if (a) +- { +- if (!global.path) +- global.path = new Strings(); +- global.path->append(a); +- } +- } +- } +- +- // Build string import search path +- if (global.params.fileImppath) +- { +- for (size_t i = 0; i < global.params.fileImppath->dim; i++) +- { +- char *path = (*global.params.fileImppath)[i]; +- Strings *a = FileName::splitPath(path); +- +- if (a) +- { +- if (!global.filePath) +- global.filePath = new Strings(); +- global.filePath->append(a); +- } +- } +- } +- +- // Create Modules +- Modules modules; +- modules.reserve(files.dim); +- int firstmodule = 1; +- for (size_t i = 0; i < files.dim; i++) +- { +- const char *ext; +- char *name; +- +- p = files[i]; +- +-#if _WIN32 +- // Convert / to \ so linker will work +- for (size_t j = 0; p[j]; j++) +- { +- if (p[j] == '/') +- p[j] = '\\'; +- } +-#endif +- +- p = (char *)FileName::name(p); // strip path +- ext = FileName::ext(p); +- if (ext) +- { /* Deduce what to do with a file based on its extension +- */ +- if (FileName::equals(ext, global.obj_ext)) +- { +- global.params.objfiles->push(files[i]); +- libmodules.push(files[i]); +- continue; +- } +- +- if (FileName::equals(ext, global.lib_ext)) +- { +- global.params.libfiles->push(files[i]); +- libmodules.push(files[i]); +- continue; +- } +- +- if (strcmp(ext, global.ddoc_ext) == 0) +- { +- global.params.ddocfiles->push(files[i]); +- continue; +- } +- +- if (FileName::equals(ext, global.json_ext)) +- { +- global.params.doXGeneration = 1; +- global.params.xfilename = files[i]; +- continue; +- } +- +- if (FileName::equals(ext, global.map_ext)) +- { +- global.params.mapfile = files[i]; +- continue; +- } +- +-#if TARGET_WINDOS +- if (FileName::equals(ext, "res")) +- { +- global.params.resfile = files[i]; +- continue; +- } +- +- if (FileName::equals(ext, "def")) +- { +- global.params.deffile = files[i]; +- continue; +- } +- +- if (FileName::equals(ext, "exe")) +- { +- assert(0); // should have already been handled +- } +-#endif +- +- /* Examine extension to see if it is a valid +- * D source file extension +- */ +- if (FileName::equals(ext, global.mars_ext) || +- FileName::equals(ext, global.hdr_ext) || +- FileName::equals(ext, "dd")) +- { +- ext--; // skip onto '.' +- assert(*ext == '.'); +- name = (char *)mem.malloc((ext - p) + 1); +- memcpy(name, p, ext - p); +- name[ext - p] = 0; // strip extension +- +- if (name[0] == 0 || +- strcmp(name, "..") == 0 || +- strcmp(name, ".") == 0) +- { +- Linvalid: +- error(0, "invalid file name '%s'", files[i]); +- fatal(); +- } +- } +- else +- { error(0, "unrecognized file extension %s", ext); +- fatal(); +- } +- } +- else +- { name = p; +- if (!*name) +- goto Linvalid; +- } +- +- /* At this point, name is the D source file name stripped of +- * its path and extension. +- */ +- +- Identifier *id = Lexer::idPool(name); +- m = new Module(files[i], id, global.params.doDocComments, global.params.doHdrGeneration); +- modules.push(m); +- +- if (firstmodule) +- { global.params.objfiles->push((char *)m->objfile->name->str); +- firstmodule = 0; +- } +- } +- +- // Read files +-#define ASYNCREAD 1 +-#if ASYNCREAD +- // Multi threaded +- AsyncRead *aw = AsyncRead::create(modules.dim); +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- aw->addFile(m->srcfile); +- } +- aw->start(); +-#else +- // Single threaded +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- m->read(0); +- } +-#endif +- +- // Parse files +- bool anydocfiles = false; +- size_t filecount = modules.dim; +- for (size_t filei = 0, modi = 0; filei < filecount; filei++, modi++) +- { +- m = modules[modi]; +- if (global.params.verbose) +- printf("parse %s\n", m->toChars()); +- if (!Module::rootModule) +- Module::rootModule = m; +- m->importedFrom = m; +- if (!global.params.oneobj || modi == 0 || m->isDocFile) +- m->deleteObjFile(); +-#if ASYNCREAD +- if (aw->read(filei)) +- { +- error(0, "cannot read file %s", m->srcfile->name->toChars()); +- fatal(); +- } +-#endif +- m->parse(); +- if (m->isDocFile) +- { +- anydocfiles = true; +- m->gendocfile(); +- +- // Remove m from list of modules +- modules.remove(modi); +- modi--; +- +- // Remove m's object file from list of object files +- for (size_t j = 0; j < global.params.objfiles->dim; j++) +- { +- if (m->objfile->name->str == (*global.params.objfiles)[j]) +- { +- global.params.objfiles->remove(j); +- break; +- } +- } +- +- if (global.params.objfiles->dim == 0) +- global.params.link = 0; +- } +- } +-#if ASYNCREAD +- AsyncRead::dispose(aw); +-#endif +- +- if (anydocfiles && modules.dim && +- (global.params.oneobj || global.params.objname)) +- { +- error(0, "conflicting Ddoc and obj generation options"); +- fatal(); +- } +- if (global.errors) +- fatal(); +- if (global.params.doHdrGeneration) +- { +- /* Generate 'header' import files. +- * Since 'header' import files must be independent of command +- * line switches and what else is imported, they are generated +- * before any semantic analysis. +- */ +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("import %s\n", m->toChars()); +- m->genhdrfile(); +- } +- } +- if (global.errors) +- fatal(); +- +- // load all unconditional imports for better symbol resolving +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("importall %s\n", m->toChars()); +- m->importAll(0); +- } +- if (global.errors) +- fatal(); +- +- backend_init(); +- +- // Do semantic analysis +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("semantic %s\n", m->toChars()); +- m->semantic(); +- } +- if (global.errors) +- fatal(); +- +- Module::dprogress = 1; +- Module::runDeferredSemantic(); +- +- // Do pass 2 semantic analysis +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("semantic2 %s\n", m->toChars()); +- m->semantic2(); +- } +- if (global.errors) +- fatal(); +- +- // Do pass 3 semantic analysis +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("semantic3 %s\n", m->toChars()); +- m->semantic3(); +- } +- if (global.errors) +- fatal(); +- +- if (global.params.useInline) +- { +- /* The problem with useArrayBounds and useAssert is that the +- * module being linked to may not have generated them, so if +- * we inline functions from those modules, the symbols for them will +- * not be found at link time. +- * We must do this BEFORE generating the .deps file! +- */ +- if (!global.params.useArrayBounds && !global.params.useAssert) +- { +- // Do pass 3 semantic analysis on all imported modules, +- // since otherwise functions in them cannot be inlined +- for (size_t i = 0; i < Module::amodules.dim; i++) +- { +- m = Module::amodules[i]; +- if (global.params.verbose) +- printf("semantic3 %s\n", m->toChars()); +- m->semantic3(); +- } +- if (global.errors) +- fatal(); +- } +- } +- +- if (global.params.moduleDeps != NULL) +- { +- assert(global.params.moduleDepsFile != NULL); +- +- File deps(global.params.moduleDepsFile); +- OutBuffer* ob = global.params.moduleDeps; +- deps.setbuffer((void*)ob->data, ob->offset); +- deps.writev(); +- } +- +- // Scan for functions to inline +- if (global.params.useInline) +- { +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("inline scan %s\n", m->toChars()); +- m->inlineScan(); +- } +- } +- +- // Do not attempt to generate output files if errors or warnings occurred +- if (global.errors || global.warnings) +- fatal(); +- +- printCtfePerformanceStats(); +- +- Library *library = NULL; +- if (global.params.lib) +- { +- library = Library::factory(); +- library->setFilename(global.params.objdir, global.params.libname); +- +- // Add input object and input library files to output library +- for (size_t i = 0; i < libmodules.dim; i++) +- { +- char *p = libmodules[i]; +- library->addObject(p, NULL, 0); +- } +- } +- +- // Generate output files +- +- if (global.params.doXGeneration) +- { +- OutBuffer buf; +- json_generate(&buf, &modules); +- +- // Write buf to file +- const char *name = global.params.xfilename; +- +- if (name && name[0] == '-' && name[1] == 0) +- { // Write to stdout; assume it succeeds +- int n = fwrite(buf.data, 1, buf.offset, stdout); +- assert(n == buf.offset); // keep gcc happy about return values +- } +- else +- { +- /* The filename generation code here should be harmonized with Module::setOutfile() +- */ +- +- const char *jsonfilename; +- +- if (name && *name) +- { +- jsonfilename = FileName::defaultExt(name, global.json_ext); +- } +- else +- { +- // Generate json file name from first obj name +- const char *n = (*global.params.objfiles)[0]; +- n = FileName::name(n); +- +- //if (!FileName::absolute(name)) +- //name = FileName::combine(dir, name); +- +- jsonfilename = FileName::forceExt(n, global.json_ext); +- } +- +- FileName::ensurePathToNameExists(jsonfilename); +- +- File *jsonfile = new File(jsonfilename); +- +- jsonfile->setbuffer(buf.data, buf.offset); +- jsonfile->ref = 1; +- jsonfile->writev(); +- } +- } +- +- if (global.params.oneobj) +- { +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("code %s\n", m->toChars()); +- if (i == 0) +- obj_start(m->srcfile->toChars()); +- m->genobjfile(0); +- if (!global.errors && global.params.doDocComments) +- m->gendocfile(); +- } +- if (!global.errors && modules.dim) +- { +- obj_end(library, modules[0]->objfile); +- } +- } +- else +- { +- for (size_t i = 0; i < modules.dim; i++) +- { +- m = modules[i]; +- if (global.params.verbose) +- printf("code %s\n", m->toChars()); +- if (global.params.obj) +- { obj_start(m->srcfile->toChars()); +- m->genobjfile(global.params.multiobj); +- obj_end(library, m->objfile); +- obj_write_deferred(library); +- } +- if (global.errors) +- { +- if (!global.params.lib) +- m->deleteObjFile(); +- } +- else +- { +- if (global.params.doDocComments) +- m->gendocfile(); +- } +- } +- } +- +- if (global.params.lib && !global.errors) +- library->write(); +- +- backend_term(); +- if (global.errors) +- fatal(); +- +- int status = EXIT_SUCCESS; +- if (!global.params.objfiles->dim) +- { +- if (global.params.link) +- error(0, "no object files to link"); +- } +- else +- { +- if (global.params.link) +- status = runLINK(); +- +- if (global.params.run) +- { +- if (!status) +- { +- status = runProgram(); +- +- /* Delete .obj files and .exe file +- */ +- for (size_t i = 0; i < modules.dim; i++) +- { +- Module *m = modules[i]; +- m->deleteObjFile(); +- if (global.params.oneobj) +- break; +- } +- deleteExeFile(); +- } +- } +- } +- +- return status; +-} +- +-int main(int argc, char *argv[]) +-{ +- int status = -1; +-#if WINDOWS_SEH +- __try +- { +-#endif +- status = tryMain(argc, argv); +-#if WINDOWS_SEH +- } +- __except (__ehfilter(GetExceptionInformation())) +- { +- printf("Stack overflow\n"); +- fatal(); +- } +-#endif +- return status; +-} +- +- +-/*********************************** +- * Parse and append contents of environment variable envvar +- * to argc and argv[]. +- * The string is separated into arguments, processing \ and ". +- */ +- +-void getenv_setargv(const char *envvar, size_t *pargc, char** *pargv) +-{ +- char *p; +- +- int instring; +- int slash; +- char c; +- +- char *env = getenv(envvar); +- if (!env) +- return; +- +- env = mem.strdup(env); // create our own writable copy +- +- size_t argc = *pargc; +- Strings *argv = new Strings(); +- argv->setDim(argc); +- +- for (size_t i = 0; i < argc; i++) +- (*argv)[i] = (*pargv)[i]; +- +- size_t j = 1; // leave argv[0] alone +- while (1) +- { +- int wildcard = 1; // do wildcard expansion +- switch (*env) +- { +- case ' ': +- case '\t': +- env++; +- break; +- +- case 0: +- goto Ldone; +- +- case '"': +- wildcard = 0; +- default: +- argv->push(env); // append +- //argv->insert(j, env); // insert at position j +- j++; +- argc++; +- p = env; +- slash = 0; +- instring = 0; +- c = 0; +- +- while (1) +- { +- c = *env++; +- switch (c) +- { +- case '"': +- p -= (slash >> 1); +- if (slash & 1) +- { p--; +- goto Laddc; +- } +- instring ^= 1; +- slash = 0; +- continue; +- +- case ' ': +- case '\t': +- if (instring) +- goto Laddc; +- *p = 0; +- //if (wildcard) +- //wildcardexpand(); // not implemented +- break; +- +- case '\\': +- slash++; +- *p++ = c; +- continue; +- +- case 0: +- *p = 0; +- //if (wildcard) +- //wildcardexpand(); // not implemented +- goto Ldone; +- +- default: +- Laddc: +- slash = 0; +- *p++ = c; +- continue; +- } +- break; +- } +- } +- } +- +-Ldone: +- *pargc = argc; +- *pargv = argv->tdata(); +-} +- +-/*********************************** +- * Parse command line arguments for -m32 or -m64 +- * to detect the desired architecture. +- */ +- +-static bool parse_arch(size_t argc, char** argv, bool is64bit) +-{ +- for (size_t i = 0; i < argc; ++i) +- { char* p = argv[i]; +- if (p[0] == '-') +- { +- if (strcmp(p + 1, "m32") == 0) +- is64bit = 0; +- else if (strcmp(p + 1, "m64") == 0) +- is64bit = 1; +- else if (strcmp(p + 1, "run") == 0) +- break; +- } +- } +- return is64bit; +-} +- +-#if WINDOWS_SEH +- +-long __cdecl __ehfilter(LPEXCEPTION_POINTERS ep) +-{ +- //printf("%x\n", ep->ExceptionRecord->ExceptionCode); +- if (ep->ExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) +- { +-#if 1 //ndef DEBUG +- return EXCEPTION_EXECUTE_HANDLER; +-#endif +- } +- return EXCEPTION_CONTINUE_SEARCH; +-} +- +-#endif +- +-#endif +--- a/src/gcc/d/dfrontend/mars.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/mars.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -80,17 +80,11 @@ the target object file format: + #endif + void unittests(); + +-#ifdef IN_GCC +-/* Changes for the GDC compiler by David Friedman */ +-#endif +- + #define DMDV1 0 + #define DMDV2 1 // Version 2.0 features + #define SNAN_DEFAULT_INIT DMDV2 // if floats are default initialized to signalling NaN + #define MODULEINFO_IS_STRUCT DMDV2 // if ModuleInfo is a struct rather than a class +-#define BUG6652 2 // Making foreach range statement parameter non-ref in default +- // 1: Modifying iteratee in body is warned with -w switch +- // 2: Modifying iteratee in body is error without -d switch ++#define PULL93 0 // controversial pull #93 for bugzilla 3449 + + // Set if C++ mangling is done by the front end + #define CPP_MANGLE (IN_GCC || (DMDV2 && (TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS))) +@@ -125,9 +119,9 @@ void unittests(); + struct OutBuffer; + + // Can't include arraytypes.h here, need to declare these directly. +-template struct ArrayBase; +-typedef ArrayBase Identifiers; +-typedef ArrayBase Strings; ++template struct Array; ++typedef Array Identifiers; ++typedef Array Strings; + + // Put command line switches in here + struct Param +@@ -142,11 +136,11 @@ struct Param + char quiet; // suppress non-error messages + char verbose; // verbose compile + char vtls; // identify thread local variables ++ char vfield; // identify non-mutable field variables + char symdebug; // insert debug symbolic information + bool alwaysframe; // always emit standard stack frame + bool optimize; // run optimizer + char map; // generate linker .map file +- char cpu; // target CPU + char is64bit; // generate 64 bit code + char isLP64; // generate code for LP64 + char isLinux; // generate code for linux +@@ -177,12 +171,14 @@ struct Param + // 1: warnings as errors + // 2: informational warnings (no errors) + bool pic; // generate position-independent-code for shared libs +- char cov; // generate code coverage data ++ bool cov; // generate code coverage data ++ unsigned char covPercent; // 0..100 code coverage percentage required + bool nofloat; // code should not pull in floating point support +- char Dversion; // D version number + char ignoreUnsupportedPragmas; // rather than error on them + char enforcePropertySyntax; + char betterC; // be a "better C" compiler; no dependency on D runtime ++ bool addMain; // add a default main() function ++ bool allInst; // generate code for all template instantiations + + char *argv0; // program name + Strings *imppath; // array of char*'s of where to look for import modules +@@ -246,10 +242,23 @@ struct Param + char *mapfile; + }; + ++struct Compiler ++{ ++ const char *vendor; // Compiler backend name ++}; ++ + typedef unsigned structalign_t; + #define STRUCTALIGN_DEFAULT ~0 // magic value means "match whatever the underlying C compiler does" + // other values are all powers of 2 + ++struct Ungag ++{ ++ unsigned oldgag; ++ ++ Ungag(unsigned old) : oldgag(old) {} ++ ~Ungag(); ++}; ++ + struct Global + { + const char *mars_ext; +@@ -264,16 +273,17 @@ struct Global + const char *map_ext; // for .map files + const char *copyright; + const char *written; ++ const char *main_d; // dummy filename for dummy main() + Strings *path; // Array of char*'s which form the import lookup path + Strings *filePath; // Array of char*'s which form the file import lookup path + +- structalign_t structalign; // default alignment for struct fields +- + const char *version; + ++ Compiler compiler; + Param params; + unsigned errors; // number of errors reported so far + unsigned warnings; // number of warnings reported so far ++ FILE *stdmsg; // where to send verbose messages + unsigned gag; // !=0 means gag reporting of errors & warnings + unsigned gaggedErrors; // number of errors reported while gagged + +@@ -291,16 +301,17 @@ struct Global + */ + bool endGagging(unsigned oldGagged); + +- Global(); ++ /* Increment the error count to record that an error ++ * has occured in the current context. An error message ++ * may or may not have been printed. ++ */ ++ void increaseErrorCount(); ++ ++ void init(); + }; + + extern Global global; + +-/* Set if Windows Structured Exception Handling C extensions are supported. +- * Apparently, VC has dropped support for these? +- */ +-#define WINDOWS_SEH _WIN32 +- + #include "longdouble.h" + + #ifdef __DMC__ +@@ -310,17 +321,36 @@ extern Global global; + #include "complex_t.h" + #endif + ++// Be careful not to care about sign when using dinteger_t ++//typedef uint64_t integer_t; ++typedef uint64_t dinteger_t; // use this instead of integer_t to ++ // avoid conflicts with system #include's ++ ++// Signed and unsigned variants ++typedef int64_t sinteger_t; ++typedef uint64_t uinteger_t; ++ ++typedef int8_t d_int8; ++typedef uint8_t d_uns8; ++typedef int16_t d_int16; ++typedef uint16_t d_uns16; ++typedef int32_t d_int32; ++typedef uint32_t d_uns32; ++typedef int64_t d_int64; ++typedef uint64_t d_uns64; ++ ++typedef float d_float32; ++typedef double d_float64; ++typedef longdouble d_float80; ++ ++typedef d_uns8 d_char; ++typedef d_uns16 d_wchar; ++typedef d_uns32 d_dchar; ++ + typedef longdouble real_t; + +-// Modify OutBuffer::writewchar to write the correct size of wchar +-#if _WIN32 +-#define writewchar writeword +-#else +-// This needs a configuration test... +-#define writewchar write4 +-#endif + +-struct Module; ++class Module; + + //typedef unsigned Loc; // file location + struct Loc +@@ -334,12 +364,6 @@ struct Loc + filename = NULL; + } + +- Loc(int x) +- { +- linnum = x; +- filename = NULL; +- } +- + Loc(Module *mod, unsigned linnum); + + char *toChars(); +@@ -414,23 +438,21 @@ void deleteExeFile(); + int runProgram(); + const char *inifile(const char *argv0, const char *inifile, const char* envsectionname); + void halt(); +-void util_progress(); + +-/*** Where to send error messages ***/ +-#ifdef IN_GCC +-#define stdmsg stderr +-#else +-#define stdmsg stderr +-#endif +- +-struct Dsymbol; ++class Dsymbol; + class Library; +-struct File; ++class File; + void obj_start(char *srcfile); + void obj_end(Library *library, File *objfile); + void obj_append(Dsymbol *s); + void obj_write_deferred(Library *library); + ++void readFile(Loc loc, File *f); ++void writeFile(Loc loc, File *f); ++void ensurePathToNameExists(Loc loc, const char *name); ++ + const char *importHint(const char *s); ++/// Little helper function for writting out deps. ++void escapePath(OutBuffer *buf, const char *fname); + + #endif /* DMD_MARS_H */ +--- a/src/gcc/d/dfrontend/module.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/module.c 2014-04-01 16:32:51.000000000 +0100 +@@ -27,15 +27,18 @@ + #include "d-dmd-gcc.h" + #endif + +-ClassDeclaration *Module::moduleinfo; ++AggregateDeclaration *Module::moduleinfo; + + Module *Module::rootModule; + DsymbolTable *Module::modules; + Modules Module::amodules; + + Dsymbols Module::deferred; // deferred Dsymbol's needing semantic() run on them ++Dsymbols Module::deferred3; + unsigned Module::dprogress; + ++const char *lookForSourceFile(const char *filename); ++ + void Module::init() + { + modules = new DsymbolTable(); +@@ -57,13 +60,7 @@ Module::Module(char *filename, Identifie + needmoduleinfo = 0; + selfimports = 0; + insearch = 0; +- searchCacheIdent = NULL; +- searchCacheSymbol = NULL; +- searchCacheFlags = 0; +- semanticstarted = 0; +- semanticRun = 0; + decldefs = NULL; +- vmoduleinfo = NULL; + massert = NULL; + munittest = NULL; + marray = NULL; +@@ -74,7 +71,6 @@ Module::Module(char *filename, Identifie + sshareddtor = NULL; + stest = NULL; + sfilename = NULL; +- root = 0; + importedFrom = NULL; + srcfile = NULL; + docfile = NULL; +@@ -218,55 +214,23 @@ Module *Module::load(Loc loc, Identifier + m = new Module(filename, ident, 0, 0); + m->loc = loc; + +- /* Search along global.path for .di file, then .d file. ++ /* Look for the source file + */ +- const char *result = NULL; +- const char *fdi = FileName::forceExt(filename, global.hdr_ext); +- const char *fd = FileName::forceExt(filename, global.mars_ext); +- const char *sdi = fdi; +- const char *sd = fd; +- +- if (FileName::exists(sdi)) +- result = sdi; +- else if (FileName::exists(sd)) +- result = sd; +- else if (FileName::absolute(filename)) +- ; +- else if (!global.path) +- ; +- else +- { +- for (size_t i = 0; i < global.path->dim; i++) +- { +- const char *p = (*global.path)[i]; +- const char *n = FileName::combine(p, sdi); +- if (FileName::exists(n)) +- { result = n; +- break; +- } +- FileName::free(n); +- n = FileName::combine(p, sd); +- if (FileName::exists(n)) +- { result = n; +- break; +- } +- FileName::free(n); +- } +- } ++ const char *result = lookForSourceFile(filename); + if (result) + m->srcfile = new File(result); + + if (global.params.verbose) + { +- fprintf(stdmsg, "import "); ++ fprintf(global.stdmsg, "import "); + if (packages) + { + for (size_t i = 0; i < packages->dim; i++) + { Identifier *pid = (*packages)[i]; +- fprintf(stdmsg, "%s.", pid->toChars()); ++ fprintf(global.stdmsg, "%s.", pid->toChars()); + } + } +- fprintf(stdmsg, "%s\t(%s)\n", ident->toChars(), m->srcfile->toChars()); ++ fprintf(global.stdmsg, "%s\t(%s)\n", ident->toChars(), m->srcfile->toChars()); + } + + if (!m->read(loc)) +@@ -293,7 +257,15 @@ bool Module::read(Loc loc) + } + else + { +- error(loc, "is in file '%s' which cannot be read", srcfile->toChars()); ++ // if module is not named 'package' but we're trying to read 'package.d', we're looking for a package module ++ bool isPackageMod = (strcmp(toChars(), "package") != 0) && ++ (strcmp(srcfile->name->name(), "package.d") == 0); ++ ++ if (isPackageMod) ++ ::error(loc, "importing package '%s' requires a 'package.d' file which cannot be found in '%s'", ++ toChars(), srcfile->toChars()); ++ else ++ error(loc, "is in file '%s' which cannot be read", srcfile->toChars()); + } + + if (!global.gag) +@@ -304,11 +276,11 @@ bool Module::read(Loc loc) + for (size_t i = 0; i < global.path->dim; i++) + { + char *p = (*global.path)[i]; +- fprintf(stdmsg, "import path[%llu] = %s\n", (ulonglong)i, p); ++ fprintf(stderr, "import path[%llu] = %s\n", (ulonglong)i, p); + } + } + else +- fprintf(stdmsg, "Specify path to file '%s' with -I switch\n", srcfile->toChars()); ++ fprintf(stderr, "Specify path to file '%s' with -I switch\n", srcfile->toChars()); + fatal(); + } + return false; +@@ -349,7 +321,7 @@ void Module::parse() + char *srcname = srcfile->name->toChars(); + //printf("Module::parse(srcname = '%s')\n", srcname); + +- unsigned char *buf = srcfile->buffer; ++ utf8_t *buf = srcfile->buffer; + size_t buflen = srcfile->len; + + if (buflen >= 2) +@@ -399,7 +371,7 @@ void Module::parse() + } + dbuf.writeByte(0); // add 0 as sentinel for scanner + buflen = dbuf.offset - 1; // don't include sentinel in count +- buf = (unsigned char *) dbuf.extractData(); ++ buf = (utf8_t *) dbuf.extractData(); + } + else + { // UTF-16LE (X86) +@@ -452,7 +424,7 @@ void Module::parse() + } + dbuf.writeByte(0); // add 0 as sentinel for scanner + buflen = dbuf.offset - 1; // don't include sentinel in count +- buf = (unsigned char *) dbuf.extractData(); ++ buf = (utf8_t *) dbuf.extractData(); + } + } + else if (buf[0] == 0xFE && buf[1] == 0xFF) +@@ -528,30 +500,43 @@ void Module::parse() + p.nextToken(); + members = p.parseModule(); + +- ::free(srcfile->buffer); ++ if (srcfile->ref == 0) ++ ::free(srcfile->buffer); + srcfile->buffer = NULL; + srcfile->len = 0; + + md = p.md; +- numlines = p.loc.linnum; ++ numlines = p.scanloc.linnum; + ++ /* The symbol table into which the module is to be inserted. ++ */ + DsymbolTable *dst; + + if (md) +- { this->ident = md->id; ++ { ++ /* A ModuleDeclaration, md, was provided. ++ * The ModuleDeclaration sets the packages this module appears in, and ++ * the name of this module. ++ */ ++ this->ident = md->id; + this->safe = md->safe; + Package *ppack = NULL; + dst = Package::resolve(md->packages, &this->parent, &ppack); +- if (ppack && ppack->isModule()) ++ assert(dst); ++ ++ Module *m = ppack ? ppack->isModule() : NULL; ++ if (m && strcmp(m->srcfile->name->name(), "package.d") != 0) + { +- error(loc, "package name '%s' in file %s conflicts with usage as a module name in file %s", +- ppack->toChars(), srcname, ppack->isModule()->srcfile->toChars()); +- dst = modules; ++ ::error(md->loc, "package name '%s' conflicts with usage as a module name in file %s", ++ ppack->toPrettyChars(), m->srcfile->toChars()); + } + } + else + { +- dst = modules; ++ /* The name of the module is set to the source file name. ++ * There are no packages. ++ */ ++ dst = modules; // and so this module goes into global module symbol table + + /* Check to see if module name is a valid identifier + */ +@@ -559,25 +544,71 @@ void Module::parse() + error("has non-identifier characters in filename, use module declaration instead"); + } + +- // Update global list of modules +- if (!dst->insert(this)) ++ // Insert module into the symbol table ++ Dsymbol *s = this; ++ bool isPackageMod = strcmp(srcfile->name->name(), "package.d") == 0; ++ if (isPackageMod) ++ { ++ /* If the source tree is as follows: ++ * pkg/ ++ * +- package.d ++ * +- common.d ++ * the 'pkg' will be incorporated to the internal package tree in two ways: ++ * import pkg; ++ * and: ++ * import pkg.common; ++ * ++ * If both are used in one compilation, 'pkg' as a module (== pkg/package.d) ++ * and a package name 'pkg' will conflict each other. ++ * ++ * To avoid the conflict: ++ * 1. If preceding package name insertion had occurred by Package::resolve, ++ * later package.d loading will change Package::isPkgMod to PKGmodule and set Package::mod. ++ * 2. Otherwise, 'package.d' wrapped by 'Package' is inserted to the internal tree in here. ++ */ ++ Package *p = new Package(ident); ++ p->parent = this->parent; ++ p->isPkgMod = PKGmodule; ++ p->mod = this; ++ p->symtab = new DsymbolTable(); ++ s = p; ++ } ++ if (!dst->insert(s)) + { ++ /* It conflicts with a name that is already in the symbol table. ++ * Figure out what went wrong, and issue error message. ++ */ + Dsymbol *prev = dst->lookup(ident); + assert(prev); +- Module *mprev = prev->isModule(); +- if (mprev) +- error(loc, "from file %s conflicts with another module %s from file %s", +- srcname, mprev->toChars(), mprev->srcfile->toChars()); +- else ++ if (Module *mprev = prev->isModule()) + { +- Package *pkg = prev->isPackage(); +- assert(pkg); +- error(pkg->loc, "from file %s conflicts with package name %s", +- srcname, pkg->toChars()); ++ if (strcmp(srcname, mprev->srcfile->toChars()) == 0) ++ error(loc, "from file %s must be imported as module '%s'", ++ srcname, toPrettyChars()); ++ else ++ error(loc, "from file %s conflicts with another module %s from file %s", ++ srcname, mprev->toChars(), mprev->srcfile->toChars()); + } ++ else if (Package *pkg = prev->isPackage()) ++ { ++ if (pkg->isPkgMod == PKGunknown && isPackageMod) ++ { ++ /* If the previous inserted Package is not yet determined as package.d, ++ * link it to the actual module. ++ */ ++ pkg->isPkgMod = PKGmodule; ++ pkg->mod = this; ++ } ++ else ++ error(pkg->loc, "from file %s conflicts with package name %s", ++ srcname, pkg->toChars()); ++ } ++ else ++ assert(global.errors); + } + else + { ++ // Add to global array of all modules + amodules.push(this); + } + } +@@ -608,7 +639,7 @@ void Module::importAll(Scope *prevsc) + // would fail inside object.d. + if (members->dim == 0 || ((*members)[0])->ident != Id::object) + { +- Import *im = new Import(0, NULL, Id::object, NULL, 0); ++ Import *im = new Import(Loc(), NULL, Id::object, NULL, 0); + members->shift(im); + } + +@@ -647,18 +678,18 @@ void Module::importAll(Scope *prevsc) + + void Module::semantic() + { +- if (semanticstarted) ++ if (semanticRun != PASSinit) + return; + + //printf("+Module::semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent); +- semanticstarted = 1; ++ semanticRun = PASSsemantic; + + // Note that modules get their own scope, from scratch. + // This is so regardless of where in the syntax a module + // gets imported, it is unaffected by context. + Scope *sc = scope; // see if already got one from importAll() + if (!sc) +- { printf("test2\n"); ++ { + Scope::createGlobal(this); // create root scope + } + +@@ -690,14 +721,6 @@ void Module::semantic() + } + #endif + +- // Do semantic() on members that don't depend on others +- for (size_t i = 0; i < members->dim; i++) +- { Dsymbol *s = (*members)[i]; +- +- //printf("\tModule('%s'): '%s'.semantic0()\n", toChars(), s->toChars()); +- s->semantic0(sc); +- } +- + // Pass 1 semantic routines: do public side of the definition + for (size_t i = 0; i < members->dim; i++) + { Dsymbol *s = (*members)[i]; +@@ -711,7 +734,7 @@ void Module::semantic() + { sc = sc->pop(); + sc->pop(); // 2 pops because Scope::createGlobal() created 2 + } +- semanticRun = semanticstarted; ++ semanticRun = PASSsemanticdone; + //printf("-Module::semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent); + } + +@@ -728,12 +751,9 @@ void Module::semantic2() + return; + } + //printf("Module::semantic2('%s'): parent = %p\n", toChars(), parent); +- if (semanticRun == 0) // semantic() not completed yet - could be recursive call +- return; +- if (semanticstarted >= 2) ++ if (semanticRun != PASSsemanticdone) // semantic() not completed yet - could be recursive call + return; +- assert(semanticstarted == 1); +- semanticstarted = 2; ++ semanticRun = PASSsemantic2; + + // Note that modules get their own scope, from scratch. + // This is so regardless of where in the syntax a module +@@ -751,17 +771,16 @@ void Module::semantic2() + + sc = sc->pop(); + sc->pop(); +- semanticRun = semanticstarted; ++ semanticRun = PASSsemantic2done; + //printf("-Module::semantic2('%s'): parent = %p\n", toChars(), parent); + } + + void Module::semantic3() + { + //printf("Module::semantic3('%s'): parent = %p\n", toChars(), parent); +- if (semanticstarted >= 3) ++ if (semanticRun != PASSsemantic2done) + return; +- assert(semanticstarted == 2); +- semanticstarted = 3; ++ semanticRun = PASSsemantic3; + + // Note that modules get their own scope, from scratch. + // This is so regardless of where in the syntax a module +@@ -780,15 +799,14 @@ void Module::semantic3() + + sc = sc->pop(); + sc->pop(); +- semanticRun = semanticstarted; ++ semanticRun = PASSsemantic3done; + } + + void Module::inlineScan() + { +- if (semanticstarted >= 4) ++ if (semanticRun != PASSsemantic3done) + return; +- assert(semanticstarted == 3); +- semanticstarted = 4; ++ semanticRun = PASSinline; + + // Note that modules get their own scope, from scratch. + // This is so regardless of where in the syntax a module +@@ -798,11 +816,11 @@ void Module::inlineScan() + for (size_t i = 0; i < members->dim; i++) + { Dsymbol *s = (*members)[i]; + //if (global.params.verbose) +- //printf("inline scan symbol %s\n", s->toChars()); ++ //fprintf(global.stdmsg, "inline scan symbol %s\n", s->toChars()); + + s->inlineScan(); + } +- semanticRun = semanticstarted; ++ semanticRun = PASSinlinedone; + } + + /**************************************************** +@@ -828,7 +846,7 @@ void Module::gensymfile() + symfile->setbuffer(buf.data, buf.offset); + buf.data = NULL; + +- symfile->writev(); ++ writeFile(loc, symfile); + } + + /********************************** +@@ -853,38 +871,15 @@ Dsymbol *Module::search(Loc loc, Identif + Dsymbol *s; + if (insearch) + s = NULL; +- else if (searchCacheIdent == ident && searchCacheFlags == flags) +- { +- s = searchCacheSymbol; +- //printf("%s Module::search('%s', flags = %d) insearch = %d searchCacheSymbol = %s\n", toChars(), ident->toChars(), flags, insearch, searchCacheSymbol ? searchCacheSymbol->toChars() : "null"); +- } + else + { + insearch = 1; + s = ScopeDsymbol::search(loc, ident, flags); + insearch = 0; +- +- searchCacheIdent = ident; +- searchCacheSymbol = s; +- searchCacheFlags = flags; + } + return s; + } + +-Dsymbol *Module::symtabInsert(Dsymbol *s) +-{ +- searchCacheIdent = 0; // symbol is inserted, so invalidate cache +- return Package::symtabInsert(s); +-} +- +-void Module::clearCache() +-{ +- for (size_t i = 0; i < amodules.dim; i++) +- { Module *m = amodules[i]; +- m->searchCacheIdent = NULL; +- } +-} +- + /******************************************* + * Can't run semantic on s now, try again later. + */ +@@ -959,6 +954,33 @@ void Module::runDeferredSemantic() + //printf("-Module::runDeferredSemantic(), len = %d\n", deferred.dim); + } + ++void Module::addDeferredSemantic3(Dsymbol *s) ++{ ++ // Don't add it if it is already there ++ for (size_t i = 0; i < deferred3.dim; i++) ++ { ++ Dsymbol *sd = deferred3[i]; ++ if (sd == s) ++ return; ++ } ++ deferred3.push(s); ++} ++ ++void Module::runDeferredSemantic3() ++{ ++ Dsymbols *a = &Module::deferred3; ++ for (size_t i = 0; i < a->dim; i++) ++ { ++ Dsymbol *s = (*a)[i]; ++ //printf("[%d] %s semantic3a\n", i, s->toPrettyChars()); ++ ++ s->semantic3(NULL); ++ ++ if (global.errors) ++ break; ++ } ++} ++ + /************************************ + * Recursively look at every module this module imports, + * return TRUE if it imports m. +@@ -1018,8 +1040,9 @@ int Module::selfImports() + + /* =========================== ModuleDeclaration ===================== */ + +-ModuleDeclaration::ModuleDeclaration(Identifiers *packages, Identifier *id, bool safe) ++ModuleDeclaration::ModuleDeclaration(Loc loc, Identifiers *packages, Identifier *id, bool safe) + { ++ this->loc = loc; + this->packages = packages; + this->id = id; + this->safe = safe; +@@ -1048,6 +1071,8 @@ char *ModuleDeclaration::toChars() + Package::Package(Identifier *ident) + : ScopeDsymbol(ident) + { ++ this->isPkgMod = PKGunknown; ++ this->mod = NULL; + } + + +@@ -1056,6 +1081,15 @@ const char *Package::kind() + return "package"; + } + ++/**************************************************** ++ * Input: ++ * packages[] the pkg1.pkg2 of pkg1.pkg2.mod ++ * Returns: ++ * the symbol table that mod should be inserted into ++ * Output: ++ * *pparent the rightmost package, i.e. pkg2, or NULL if no packages ++ * *ppkg the leftmost package, i.e. pkg1, or NULL if no packages ++ */ + + DsymbolTable *Package::resolve(Identifiers *packages, Dsymbol **pparent, Package **ppkg) + { +@@ -1069,40 +1103,135 @@ DsymbolTable *Package::resolve(Identifie + if (packages) + { + for (size_t i = 0; i < packages->dim; i++) +- { Identifier *pid = (*packages)[i]; +- Dsymbol *p; +- +- p = dst->lookup(pid); ++ { ++ Identifier *pid = (*packages)[i]; ++ Package *pkg; ++ Dsymbol *p = dst->lookup(pid); + if (!p) + { +- p = new Package(pid); +- dst->insert(p); +- p->parent = parent; +- ((ScopeDsymbol *)p)->symtab = new DsymbolTable(); ++ pkg = new Package(pid); ++ dst->insert(pkg); ++ pkg->parent = parent; ++ pkg->symtab = new DsymbolTable(); + } + else + { +- assert(p->isPackage()); ++ pkg = p->isPackage(); ++ assert(pkg); + // It might already be a module, not a package, but that needs + // to be checked at a higher level, where a nice error message + // can be generated. + // dot net needs modules and packages with same name ++ ++ // But we still need a symbol table for it ++ if (!pkg->symtab) ++ pkg->symtab = new DsymbolTable(); + } +- parent = p; +- dst = ((Package *)p)->symtab; ++ parent = pkg; ++ dst = pkg->symtab; + if (ppkg && !*ppkg) +- *ppkg = (Package *)p; +- if (p->isModule()) +- { // Return the module so that a nice error message can be generated ++ *ppkg = pkg; ++ if (pkg->isModule()) ++ { ++ // Return the module so that a nice error message can be generated + if (ppkg) + *ppkg = (Package *)p; + break; + } + } +- if (pparent) ++ } ++ if (pparent) ++ *pparent = parent; ++ return dst; ++} ++ ++Dsymbol *Package::search(Loc loc, Identifier *ident, int flags) ++{ ++ if (!isModule() && mod) ++ { ++ // Prefer full package name. ++ Dsymbol *s = symtab ? symtab->lookup(ident) : NULL; ++ if (s) ++ return s; ++ //printf("[%s] through pkdmod: %s\n", loc.toChars(), toChars()); ++ return mod->search(loc, ident, flags); ++ } ++ ++ return ScopeDsymbol::search(loc, ident, flags); ++} ++ ++/* =========================== ===================== */ ++ ++/******************************************** ++ * Look for the source file if it's different from filename. ++ * Look for .di, .d, directory, and along global.path. ++ * Does not open the file. ++ * Input: ++ * filename as supplied by the user ++ * global.path ++ * Returns: ++ * NULL if it's not different from filename. ++ */ ++ ++const char *lookForSourceFile(const char *filename) ++{ ++ ++ /* Search along global.path for .di file, then .d file. ++ */ ++ ++ const char *sdi = FileName::forceExt(filename, global.hdr_ext); ++ if (FileName::exists(sdi) == 1) ++ return sdi; ++ ++ const char *sd = FileName::forceExt(filename, global.mars_ext); ++ if (FileName::exists(sd) == 1) ++ return sd; ++ ++ if (FileName::exists(filename) == 2) ++ { ++ /* The filename exists and it's a directory. ++ * Therefore, the result should be: filename/package.d ++ * iff filename/package.d is a file ++ */ ++ const char *n = FileName::combine(filename, "package.d"); ++ if (FileName::exists(n) == 1) ++ return n; ++ FileName::free(n); ++ } ++ ++ if (FileName::absolute(filename)) ++ return NULL; ++ ++ if (!global.path) ++ return NULL; ++ ++ for (size_t i = 0; i < global.path->dim; i++) ++ { ++ const char *p = (*global.path)[i]; ++ ++ const char *n = FileName::combine(p, sdi); ++ if (FileName::exists(n) == 1) ++ return n; ++ FileName::free(n); ++ ++ n = FileName::combine(p, sd); ++ if (FileName::exists(n) == 1) ++ return n; ++ FileName::free(n); ++ ++ const char *b = FileName::removeExt(filename); ++ n = FileName::combine(p, b); ++ FileName::free(b); ++ if (FileName::exists(n) == 2) + { +- *pparent = parent; ++ const char *n2 = FileName::combine(n, "package.d"); ++ if (FileName::exists(n2) == 1) ++ return n2; ++ FileName::free(n2); + } ++ FileName::free(n); + } +- return dst; ++ return NULL; + } ++ ++ +--- a/src/gcc/d/dfrontend/module.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/module.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -18,12 +18,11 @@ + #include "root.h" + #include "dsymbol.h" + +-struct ModuleInfoDeclaration; +-struct ClassDeclaration; ++class ClassDeclaration; + struct ModuleDeclaration; + struct Macro; + struct Escape; +-struct VarDeclaration; ++class VarDeclaration; + class Library; + + // Back end +@@ -33,8 +32,19 @@ typedef union tree_node elem; + struct elem; + #endif + +-struct Package : ScopeDsymbol ++enum PKG + { ++ PKGunknown, // not yet determined whether it's a package.d or not ++ PKGmodule, // already determined that's an actual package.d ++ PKGpackage, // already determined that's an actual package ++}; ++ ++class Package : public ScopeDsymbol ++{ ++public: ++ PKG isPkgMod; ++ Module *mod; // != NULL if isPkgMod == PKGmodule ++ + Package(Identifier *ident); + const char *kind(); + +@@ -42,19 +52,23 @@ struct Package : ScopeDsymbol + + Package *isPackage() { return this; } + +- virtual void semantic(Scope *sc) { (void)sc; } ++ virtual void semantic(Scope *) { } ++ Dsymbol *search(Loc loc, Identifier *ident, int flags); + }; + +-struct Module : Package ++class Module : public Package + { ++public: + static Module *rootModule; + static DsymbolTable *modules; // symbol table of all modules + static Modules amodules; // array of all modules + static Dsymbols deferred; // deferred Dsymbol's needing semantic() run on them ++ static Dsymbols deferred3; // deferred Dsymbol's needing semantic3() run on them + static unsigned dprogress; // progress resolving the deferred list + static void init(); + +- static ClassDeclaration *moduleinfo; ++ static AggregateDeclaration *moduleinfo; ++ + + const char *arg; // original argument name + ModuleDeclaration *md; // if !NULL, the contents of the ModuleDeclaration declaration +@@ -72,15 +86,7 @@ struct Module : Package + int selfImports(); // returns !=0 if module imports itself + + int insearch; +- Identifier *searchCacheIdent; +- Dsymbol *searchCacheSymbol; // cached value of search +- int searchCacheFlags; // cached flags +- +- int semanticstarted; // has semantic() been started? +- int semanticRun; // has semantic() been done? +- int root; // != 0 if this is a 'root' module, +- // i.e. a module that will be taken all the +- // way to an object file ++ + Module *importedFrom; // module from command line we're imported from, + // i.e. a module that will be taken all the + // way to an object file +@@ -89,8 +95,6 @@ struct Module : Package + + Modules aimports; // all imported modules + +- ModuleInfoDeclaration *vmoduleinfo; +- + unsigned debuglevel; // debug level + Strings *debugids; // debug identifiers + Strings *debugidsNot; // forward referenced debug identifiers +@@ -101,7 +105,7 @@ struct Module : Package + + Macro *macrotable; // document comment macros + Escape *escapetable; // document comment escapes +- bool safe; // TRUE if module is marked as 'safe' ++ bool safe; // true if module is marked as 'safe' + + size_t nameoffset; // offset of module name from start of ModuleInfo + size_t namelen; // length of module name in characters +@@ -130,13 +134,17 @@ struct Module : Package + void gendocfile(); + int needModuleInfo(); + Dsymbol *search(Loc loc, Identifier *ident, int flags); +- Dsymbol *symtabInsert(Dsymbol *s); + void deleteObjFile(); +- void addDeferredSemantic(Dsymbol *s); ++ static void addDeferredSemantic(Dsymbol *s); + static void runDeferredSemantic(); +- static void clearCache(); ++ static void addDeferredSemantic3(Dsymbol *s); ++ static void runDeferredSemantic3(); + int imports(Module *m); + ++ bool isRoot() { return this->importedFrom == this; } ++ // true if the module source file is directly ++ // listed in command line. ++ + // Back end + + int doppelganger; // sub-module +@@ -162,7 +170,6 @@ struct Module : Package + Symbol *toModuleArray(); // get module array bounds function + + +- static Symbol *gencritsec(); + elem *toEfilename(); + + Symbol *toSymbol(); +@@ -174,11 +181,12 @@ struct Module : Package + + struct ModuleDeclaration + { ++ Loc loc; + Identifier *id; + Identifiers *packages; // array of Identifier's representing packages + bool safe; + +- ModuleDeclaration(Identifiers *packages, Identifier *id, bool safe); ++ ModuleDeclaration(Loc loc, Identifiers *packages, Identifier *id, bool safe); + + char *toChars(); + }; +--- a/src/gcc/d/dfrontend/mtype.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/mtype.c 2014-04-01 16:32:51.000000000 +0100 +@@ -41,19 +41,19 @@ + #include "template.h" + #include "id.h" + #include "enum.h" ++#include "module.h" + #include "import.h" + #include "aggregate.h" + #include "hdrgen.h" + + FuncDeclaration *hasThis(Scope *sc); +-void ObjectNotFound(Identifier *id); +- ++void sizeToCBuffer(OutBuffer *buf, HdrGenState *hgs, Expression *e); + + #define LOGDOTEXP 0 // log ::dotExp() + #define LOGDEFAULTINIT 0 // log ::defaultInit() + +-// Allow implicit conversion of T[] to T* +-#define IMPLICIT_ARRAY_TO_PTR global.params.useDeprecated ++// Allow implicit conversion of T[] to T* --> Removed in 2.063 ++#define IMPLICIT_ARRAY_TO_PTR 0 + + int Tsize_t = Tuns32; + int Tptrdiff_t = Tint32; +@@ -62,7 +62,7 @@ int CLASSINFO_SIZE_64 = (0x98); + + /***************************** Type *****************************/ + +-ClassDeclaration *Type::typeinfo; ++ClassDeclaration *Type::dtypeinfo; + ClassDeclaration *Type::typeinfoclass; + ClassDeclaration *Type::typeinfointerface; + ClassDeclaration *Type::typeinfostruct; +@@ -84,6 +84,44 @@ ClassDeclaration *Type::typeinfowild; + TemplateDeclaration *Type::associativearray; + TemplateDeclaration *Type::rtinfo; + ++Type *Type::tvoid; ++Type *Type::tint8; ++Type *Type::tuns8; ++Type *Type::tint16; ++Type *Type::tuns16; ++Type *Type::tint32; ++Type *Type::tuns32; ++Type *Type::tint64; ++Type *Type::tuns64; ++Type *Type::tint128; ++Type *Type::tuns128; ++Type *Type::tfloat32; ++Type *Type::tfloat64; ++Type *Type::tfloat80; ++ ++Type *Type::timaginary32; ++Type *Type::timaginary64; ++Type *Type::timaginary80; ++ ++Type *Type::tcomplex32; ++Type *Type::tcomplex64; ++Type *Type::tcomplex80; ++ ++Type *Type::tbool; ++Type *Type::tchar; ++Type *Type::twchar; ++Type *Type::tdchar; ++ ++Type *Type::tshiftcnt; ++Type *Type::tboolean; ++Type *Type::terror; ++Type *Type::tnull; ++ ++Type *Type::tsize_t; ++Type *Type::tptrdiff_t; ++Type *Type::thash_t; ++Type *Type::tindex; ++ + Type *Type::tvoidptr; + Type *Type::tstring; + Type *Type::tvalist; +@@ -119,28 +157,34 @@ const char *Type::kind() + return NULL; + } + ++Type *Type::copy() ++{ ++ Type *t = (Type *)mem.malloc(sizeTy[ty]); ++ memcpy((void*)t, (void*)this, sizeTy[ty]); ++ return t; ++} ++ + Type *Type::syntaxCopy() + { + print(); +- fprintf(stdmsg, "ty = %d\n", ty); ++ fprintf(stderr, "ty = %d\n", ty); + assert(0); + return this; + } + +-int Type::equals(Object *o) +-{ Type *t; +- +- t = (Type *)o; ++bool Type::equals(RootObject *o) ++{ ++ Type *t = (Type *)o; + //printf("Type::equals(%s, %s)\n", toChars(), t->toChars()); + if (this == o || + ((t && deco == t->deco) && // deco strings are unique + deco != NULL)) // and semantic() has been run + { + //printf("deco = '%s', t->deco = '%s'\n", deco, t->deco); +- return 1; ++ return true; + } + //if (deco && t && t->deco) printf("deco = '%s', t->deco = '%s'\n", deco, t->deco); +- return 0; ++ return false; + } + + char Type::needThisPrefix() +@@ -150,7 +194,7 @@ char Type::needThisPrefix() + + void Type::init() + { +- stringtable.init(1543); ++ stringtable._init(1543); + Lexer::initKeywords(); + + for (size_t i = 0; i < TMAX; i++) +@@ -229,7 +273,7 @@ void Type::init() + + for (size_t i = 0; i < TMAX; i++) + { if (!mangleChar[i]) +- fprintf(stdmsg, "ty = %llu\n", (ulonglong)i); ++ fprintf(stderr, "ty = %llu\n", (ulonglong)i); + assert(mangleChar[i]); + } + +@@ -250,11 +294,43 @@ void Type::init() + } + basic[Terror] = new TypeError(); + ++ tvoid = basic[Tvoid]; ++ tint8 = basic[Tint8]; ++ tuns8 = basic[Tuns8]; ++ tint16 = basic[Tint16]; ++ tuns16 = basic[Tuns16]; ++ tint32 = basic[Tint32]; ++ tuns32 = basic[Tuns32]; ++ tint64 = basic[Tint64]; ++ tuns64 = basic[Tuns64]; ++ tint128 = basic[Tint128]; ++ tuns128 = basic[Tuns128]; ++ tfloat32 = basic[Tfloat32]; ++ tfloat64 = basic[Tfloat64]; ++ tfloat80 = basic[Tfloat80]; ++ ++ timaginary32 = basic[Timaginary32]; ++ timaginary64 = basic[Timaginary64]; ++ timaginary80 = basic[Timaginary80]; ++ ++ tcomplex32 = basic[Tcomplex32]; ++ tcomplex64 = basic[Tcomplex64]; ++ tcomplex80 = basic[Tcomplex80]; ++ ++ tbool = basic[Tbool]; ++ tchar = basic[Tchar]; ++ twchar = basic[Twchar]; ++ tdchar = basic[Tdchar]; ++ ++ tshiftcnt = tint32; ++ tboolean = tbool; ++ terror = basic[Terror]; ++ tnull = basic[Tnull]; + tnull = new TypeNull(); + tnull->deco = tnull->merge()->deco; + + tvoidptr = tvoid->pointerTo(); +- tstring = tchar->invariantOf()->arrayOf(); ++ tstring = tchar->immutableOf()->arrayOf(); + tvalist = tvoid->pointerTo(); + + if (global.params.isLP64) +@@ -267,22 +343,27 @@ void Type::init() + Tsize_t = Tuns32; + Tptrdiff_t = Tint32; + } ++ ++ tsize_t = basic[Tsize_t]; ++ tptrdiff_t = basic[Tptrdiff_t]; ++ thash_t = tsize_t; ++ tindex = tsize_t; + } + + d_uns64 Type::size() + { +- return size(0); ++ return size(Loc()); + } + + d_uns64 Type::size(Loc loc) + { + error(loc, "no size for type %s", toChars()); +- return 1; ++ return SIZE_INVALID; + } + + unsigned Type::alignsize() + { +- return size(0); ++ return size(Loc()); + } + + Type *Type::semantic(Loc loc, Scope *sc) +@@ -301,7 +382,7 @@ Type *Type::trySemantic(Loc loc, Scope * + //printf("+trySemantic(%s) %d\n", toChars(), global.errors); + unsigned errors = global.startGagging(); + Type *t = semantic(loc, sc); +- if (global.endGagging(errors)) // if any errors happened ++ if (global.endGagging(errors) || t->ty == Terror) // if any errors happened + { + t = NULL; + } +@@ -310,6 +391,34 @@ Type *Type::trySemantic(Loc loc, Scope * + } + + /******************************** ++ * Return a copy of this type with all attributes null-initialized. ++ * Useful for creating a type with different modifiers. ++ */ ++ ++Type *Type::nullAttributes() ++{ ++ unsigned sz = sizeTy[ty]; ++ Type *t = (Type *)mem.malloc(sz); ++ memcpy((void*)t, (void*)this, sz); ++ // t->mod = NULL; // leave mod unchanged ++ t->deco = NULL; ++ t->arrayof = NULL; ++ t->pto = NULL; ++ t->rto = NULL; ++ t->cto = NULL; ++ t->ito = NULL; ++ t->sto = NULL; ++ t->scto = NULL; ++ t->wto = NULL; ++ t->swto = NULL; ++ t->vtinfo = NULL; ++ t->ctype = NULL; ++ if (t->ty == Tstruct) ((TypeStruct *)t)->att = RECfwdref; ++ if (t->ty == Tclass) ((TypeClass *)t)->att = RECfwdref; ++ return t; ++} ++ ++/******************************** + * Convert to 'const'. + */ + +@@ -333,9 +442,9 @@ Type *Type::constOf() + * Convert to 'immutable'. + */ + +-Type *Type::invariantOf() ++Type *Type::immutableOf() + { +- //printf("Type::invariantOf() %p %s\n", this, toChars()); ++ //printf("Type::immutableOf() %p %s\n", this, toChars()); + if (isImmutable()) + { + return this; +@@ -459,21 +568,9 @@ Type *Type::unSharedOf() + + if (!t) + { +- unsigned sz = sizeTy[ty]; +- t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ t = this->nullAttributes(); + t->mod = mod & ~MODshared; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; ++ t->ctype = ctype; + t = t->merge(); + + t->fixTo(this); +@@ -826,7 +923,7 @@ void Type::check() + } + + Type *tn = nextOf(); +- if (tn && ty != Tfunction && tn->ty != Tfunction) ++ if (tn && ty != Tfunction && tn->ty != Tfunction && ty != Tenum) + { // Verify transitivity + switch (mod) + { +@@ -867,161 +964,57 @@ void Type::check() + Type *Type::makeConst() + { + //printf("Type::makeConst() %p, %s\n", this, toChars()); +- if (cto) +- return cto; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (cto) return cto; ++ Type *t = this->nullAttributes(); + t->mod = MODconst; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + //printf("-Type::makeConst() %p, %s\n", t, toChars()); + return t; + } + + Type *Type::makeInvariant() + { +- if (ito) +- return ito; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (ito) return ito; ++ Type *t = this->nullAttributes(); + t->mod = MODimmutable; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + return t; + } + + Type *Type::makeShared() + { +- if (sto) +- return sto; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (sto) return sto; ++ Type *t = this->nullAttributes(); + t->mod = MODshared; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + return t; + } + + Type *Type::makeSharedConst() + { +- if (scto) +- return scto; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (scto) return scto; ++ Type *t = this->nullAttributes(); + t->mod = MODshared | MODconst; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + return t; + } + + Type *Type::makeWild() + { +- if (wto) +- return wto; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (wto) return wto; ++ Type *t = this->nullAttributes(); + t->mod = MODwild; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + return t; + } + + Type *Type::makeSharedWild() + { +- if (swto) +- return swto; +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); ++ if (swto) return swto; ++ Type *t = this->nullAttributes(); + t->mod = MODshared | MODwild; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; + return t; + } + + Type *Type::makeMutable() + { +- unsigned sz = sizeTy[ty]; +- Type *t = (Type *)mem.malloc(sz); +- memcpy(t, this, sz); +- t->mod = mod & MODshared; +- t->deco = NULL; +- t->arrayof = NULL; +- t->pto = NULL; +- t->rto = NULL; +- t->cto = NULL; +- t->ito = NULL; +- t->sto = NULL; +- t->scto = NULL; +- t->wto = NULL; +- t->swto = NULL; +- t->vtinfo = NULL; +- t->ctype = NULL; ++ Type *t = this->nullAttributes(); ++ t->mod = mod & MODshared; + return t; + } + +@@ -1074,7 +1067,7 @@ Type *Type::castMod(unsigned mod) + break; + + case MODimmutable: +- t = invariantOf(); ++ t = immutableOf(); + break; + + case MODshared: +@@ -1126,7 +1119,7 @@ Type *Type::addMod(unsigned mod) + break; + + case MODimmutable: +- t = invariantOf(); ++ t = immutableOf(); + break; + + case MODshared: +@@ -1193,10 +1186,15 @@ Type *Type::pointerTo() + if (ty == Terror) + return this; + if (!pto) +- { Type *t; +- +- t = new TypePointer(this); +- pto = t->merge(); ++ { ++ Type *t = new TypePointer(this); ++ if (ty == Tfunction) ++ { ++ t->deco = t->merge()->deco; ++ pto = t; ++ } ++ else ++ pto = t->merge(); + } + return pto; + } +@@ -1252,9 +1250,7 @@ Type *Type::aliasthisOf() + } + else if (d->isFuncDeclaration()) + { +- FuncDeclaration *fd = (FuncDeclaration *)d; +- Expression *ethis = this->defaultInit(0); +- fd = fd->overloadResolve(0, ethis, NULL, 1); ++ FuncDeclaration *fd = resolveFuncCall(Loc(), NULL, d, NULL, this, NULL, 1); + if (fd && fd->functionSemantic()) + { + t = fd->type->nextOf(); +@@ -1274,8 +1270,7 @@ Type *Type::aliasthisOf() + TemplateDeclaration *td = ad->aliasthis->isTemplateDeclaration(); + if (td) + { assert(td->scope); +- Expression *ethis = defaultInit(0); +- FuncDeclaration *fd = td->deduceFunctionTemplate(td->scope, 0, NULL, ethis, NULL, 1); ++ FuncDeclaration *fd = resolveFuncCall(Loc(), NULL, td, NULL, this, NULL, 1); + if (fd && fd->functionSemantic()) + { + Type *t = fd->type->nextOf(); +@@ -1290,6 +1285,27 @@ Type *Type::aliasthisOf() + return NULL; + } + ++int Type::checkAliasThisRec() ++{ ++ Type *tb = toBasetype(); ++ AliasThisRec* pflag; ++ if (tb->ty == Tstruct) ++ pflag = &((TypeStruct *)tb)->att; ++ else if (tb->ty == Tclass) ++ pflag = &((TypeClass *)tb)->att; ++ else ++ return 0; ++ ++ AliasThisRec flag = (AliasThisRec)(*pflag & ~RECtracing); ++ if (flag == RECfwdref) ++ { ++ Type *att = aliasthisOf(); ++ flag = att && att->implicitConvTo(this) ? RECyes : RECno; ++ } ++ *pflag = (AliasThisRec)(flag | (*pflag & RECtracing)); ++ return flag == RECyes; ++} ++ + Dsymbol *Type::toDsymbol(Scope *sc) + { + return NULL; +@@ -1365,57 +1381,19 @@ int MODmerge(unsigned char mod1, unsigne + return mod1; + + //printf("MODmerge(1 = %x, 2 = %x)\n", modfrom, modto); +- #define X(m, n) (((m) << 4) | (n)) +- // cases are commutative +- #define Y(m, n) X(m, n): case X(n, m) +- switch (X(mod1, mod2)) +- { +-#if 0 +- case X(0, 0): +- case X(MODconst, MODconst): +- case X(MODimmutable, MODimmutable): +- case X(MODshared, MODshared): +- case X(MODshared | MODconst, MODshared | MODconst): +- case X(MODwild, MODwild): +- case X(MODshared | MODwild, MODshared | MODwild): +-#endif +- +- case Y(0, MODconst): +- case Y(0, MODimmutable): +- case Y(MODconst, MODimmutable): +- case Y(MODconst, MODwild): +- case Y(0, MODwild): +- case Y(MODimmutable, MODwild): +- return MODconst; +- +- case Y(0, MODshared): +- return MODshared; ++ unsigned char result = 0; + +- case Y(0, MODshared | MODconst): +- case Y(MODconst, MODshared): +- case Y(MODconst, MODshared | MODconst): +- case Y(MODimmutable, MODshared): +- case Y(MODimmutable, MODshared | MODconst): +- case Y(MODshared, MODshared | MODconst): +- case Y(0, MODshared | MODwild): +- case Y(MODconst, MODshared | MODwild): +- case Y(MODimmutable, MODshared | MODwild): +- case Y(MODshared, MODwild): +- case Y(MODshared, MODshared | MODwild): +- case Y(MODshared | MODconst, MODwild): +- case Y(MODshared | MODconst, MODshared | MODwild): +- return MODshared | MODconst; +- +- case Y(MODwild, MODshared | MODwild): +- return MODshared | MODwild; +- +- default: +- assert(0); +- } +- #undef Y +- #undef X +- assert(0); +- return 0; ++ // If either type is shared, the result will be shared ++ if ((mod1 | mod2) & MODshared) ++ result |= MODshared; ++ // If both types are wild, the result will be wild ++ // Otherwise if either type is const or immutable or wild ++ // the result will be const ++ if (mod1 & mod2 & MODwild) ++ result |= MODwild; ++ else if ((mod1 | mod2) & (MODconst | MODimmutable | MODwild)) ++ result |= MODconst; ++ return result; + } + + /********************************* +@@ -1491,6 +1469,7 @@ void MODtoBuffer(OutBuffer *buf, unsigne + char *MODtoChars(unsigned char mod) + { + OutBuffer buf; ++ buf.reserve(16); + MODtoBuffer(&buf, mod); + buf.writebyte(0); + return buf.extractData(); +@@ -1516,12 +1495,13 @@ void Type::toDecoBuffer(OutBuffer *buf, + */ + + char *Type::toChars() +-{ OutBuffer *buf; ++{ OutBuffer buf; ++ buf.reserve(16); + HdrGenState hgs; + +- buf = new OutBuffer(); +- toCBuffer(buf, NULL, &hgs); +- return buf->toChars(); ++ toCBuffer(&buf, NULL, &hgs); ++ buf.writebyte(0); ++ return buf.extractData(); + } + + void Type::toCBuffer(OutBuffer *buf, Identifier *ident, HdrGenState *hgs) +@@ -1587,12 +1567,92 @@ void Type::modToBuffer(OutBuffer *buf) + char *Type::modToChars() + { + OutBuffer buf; ++ buf.reserve(16); + modToBuffer(&buf); + buf.writebyte(0); + return buf.extractData(); + } + + /************************************ ++ * Strip all parameter's idenfiers and their default arguments for merging types. ++ * If some of parameter types or return type are function pointer, delegate, or ++ * the types which contains either, then strip also from them. ++ */ ++ ++Type *stripDefaultArgs(Type *t) ++{ ++ struct N ++ { ++ static Parameters *stripParams(Parameters *arguments) ++ { ++ Parameters *args = arguments; ++ if (args && args->dim > 0) ++ { ++ for (size_t i = 0; i < args->dim; i++) ++ { ++ Parameter *a = (*args)[i]; ++ Type *ta = stripDefaultArgs(a->type); ++ if (ta != a->type || a->defaultArg || a->ident) ++ { ++ if (args == arguments) ++ { ++ args = new Parameters(); ++ args->setDim(arguments->dim); ++ for (size_t j = 0; j < args->dim; j++) ++ (*args)[j] = (*arguments)[j]; ++ } ++ (*args)[i] = new Parameter(a->storageClass, ta, NULL, NULL); ++ } ++ } ++ } ++ return args; ++ } ++ }; ++ ++ if (t == NULL) ++ return t; ++ ++ if (t->ty == Tfunction) ++ { ++ TypeFunction *tf = (TypeFunction *)t; ++ Type *tret = stripDefaultArgs(tf->next); ++ Parameters *args = N::stripParams(tf->parameters); ++ if (tret == tf->next && args == tf->parameters) ++ goto Lnot; ++ tf = (TypeFunction *)tf->copy(); ++ tf->parameters = args; ++ tf->next = tret; ++ //printf("strip %s\n <- %s\n", tf->toChars(), t->toChars()); ++ t = tf; ++ } ++ else if (t->ty == Ttuple) ++ { ++ TypeTuple *tt = (TypeTuple *)t; ++ Parameters *args = N::stripParams(tt->arguments); ++ if (args == tt->arguments) ++ goto Lnot; ++ t = new TypeTuple(args); ++ } ++ else if (t->ty == Tenum) ++ { ++ // TypeEnum::nextOf() may be != NULL, but it's not necessary here. ++ goto Lnot; ++ } ++ else ++ { ++ Type *tn = t->nextOf(); ++ Type *n = stripDefaultArgs(tn); ++ if (n == tn) ++ goto Lnot; ++ t = t->copy(); ++ ((TypeNext *)t)->next = n; ++ } ++ //printf("strip %s\n", t->toChars()); ++Lnot: ++ return t; ++} ++ ++/************************************ + */ + + Type *Type::merge() +@@ -1603,7 +1663,7 @@ Type *Type::merge() + if (ty == Tinstance) return this; + if (ty == Taarray && !((TypeAArray *)this)->index->merge()->deco) + return this; +- if (nextOf() && !nextOf()->deco) ++ if (ty != Tenum && nextOf() && !nextOf()->deco) + return this; + + //printf("merge(%s)\n", toChars()); +@@ -1612,12 +1672,12 @@ Type *Type::merge() + if (!deco) + { + OutBuffer buf; +- StringValue *sv; ++ buf.reserve(32); + + //if (next) + //next = next->merge(); + toDecoBuffer(&buf); +- sv = stringtable.update((char *)buf.data, buf.offset); ++ StringValue *sv = stringtable.update((char *)buf.data, buf.offset); + if (sv->ptrvalue) + { t = (Type *) sv->ptrvalue; + #ifdef DEBUG +@@ -1629,8 +1689,8 @@ Type *Type::merge() + } + else + { +- sv->ptrvalue = this; +- deco = (char *)sv->toDchars(); ++ sv->ptrvalue = (char *)(t = stripDefaultArgs(t)); ++ deco = t->deco = (char *)sv->toDchars(); + //printf("new value, deco = '%s' %p\n", t->deco, t->deco); + } + } +@@ -1800,7 +1860,7 @@ MATCH Type::implicitConvTo(Type *to) + //printf("Type::implicitConvTo(this=%p, to=%p)\n", this, to); + //printf("from: %s\n", toChars()); + //printf("to : %s\n", to->toChars()); +- if (this == to) ++ if (this->equals(to)) + return MATCHexact; + return MATCHnomatch; + } +@@ -1853,10 +1913,17 @@ Type *Type::substWildTo(unsigned mod) + //printf("+Type::substWildTo this = %s, mod = x%x\n", toChars(), mod); + Type *t; + +- if (nextOf()) ++ if (Type *tn = nextOf()) + { +- t = nextOf()->substWildTo(mod); +- if (t == nextOf()) ++ // substitution has no effect on function pointer type. ++ if (ty == Tpointer && tn->ty == Tfunction) ++ { ++ t = this; ++ goto L1; ++ } ++ ++ t = tn->substWildTo(mod); ++ if (t == tn) + t = this; + else + { +@@ -1871,6 +1938,10 @@ Type *Type::substWildTo(unsigned mod) + t = new TypeAArray(t, ((TypeAArray *)this)->index->syntaxCopy()); + ((TypeAArray *)t)->sc = ((TypeAArray *)this)->sc; // duplicate scope + } ++ else if (ty == Tdelegate) ++ { ++ t = new TypeDelegate(t); ++ } + else + assert(0); + +@@ -1880,12 +1951,13 @@ Type *Type::substWildTo(unsigned mod) + else + t = this; + ++L1: + if (isWild()) + { + if (mod & MODconst) + t = isShared() ? t->sharedConstOf() : t->constOf(); + else if (mod & MODimmutable) +- t = t->invariantOf(); ++ t = t->immutableOf(); + else if (mod & MODwild) + t = isShared() ? t->sharedWildOf() : t->wildOf(); + else +@@ -1896,6 +1968,47 @@ Type *Type::substWildTo(unsigned mod) + return t; + } + ++Type *TypeFunction::substWildTo(unsigned) ++{ ++ if (!iswild && !(mod & MODwild)) ++ return this; ++ ++ // Substitude inout qualifier of function type to mutable or immutable ++ // would break type system. Instead substitude inout to the most weak ++ // qualifer - const. ++ unsigned m = MODconst; ++ ++ assert(next); ++ Type *tret = next->substWildTo(m); ++ Parameters *params = parameters; ++ if (mod & MODwild) ++ params = parameters->copy(); ++ for (size_t i = 0; i < params->dim; i++) ++ { ++ Parameter *p = (*params)[i]; ++ Type *t = p->type->substWildTo(m); ++ if (t == p->type) ++ continue; ++ if (params == parameters) ++ params = parameters->copy(); ++ (*params)[i] = new Parameter(p->storageClass, t, NULL, NULL); ++ } ++ if (next == tret && params == parameters) ++ return this; ++ ++ // Similar to TypeFunction::syntaxCopy; ++ TypeFunction *t = new TypeFunction(params, tret, varargs, linkage); ++ t->mod = ((mod & MODwild) ? (mod & ~MODwild) | MODconst : mod); ++ t->isnothrow = isnothrow; ++ t->purity = purity; ++ t->isproperty = isproperty; ++ t->isref = isref; ++ t->iswild = false; // done ++ t->trust = trust; ++ t->fargs = fargs; ++ return t->merge(); ++} ++ + /************************** + * Return type with the top level of it being mutable. + */ +@@ -1906,7 +2019,12 @@ Type *Type::toHeadMutable() + return mutableOf(); + } + +-Expression *Type::getProperty(Loc loc, Identifier *ident) ++/*************************************** ++ * Calculate built-in properties which just the type is necessary. ++ * ++ * If flag == 1, don't report "not a property" error and just return NULL. ++ */ ++Expression *Type::getProperty(Loc loc, Identifier *ident, int flag) + { Expression *e; + + #if LOGDOTEXP +@@ -1914,7 +2032,10 @@ Expression *Type::getProperty(Loc loc, I + #endif + if (ident == Id::__sizeof) + { +- e = new IntegerExp(loc, size(loc), Type::tsize_t); ++ d_uns64 sz = size(loc); ++ if (sz == SIZE_INVALID) ++ return new ErrorExp(); ++ e = new IntegerExp(loc, sz, Type::tsize_t); + } + else if (ident == Id::__xalignof) + { +@@ -1936,16 +2057,18 @@ Expression *Type::getProperty(Loc loc, I + } + } + else if (ident == Id::mangleof) +- { const char *s; ++ { + if (!deco) +- { s = toChars(); +- error(loc, "forward reference of type %s.mangleof", s); ++ { ++ error(loc, "forward reference of type %s.mangleof", toChars()); ++ e = new ErrorExp(); + } + else +- s = deco; +- e = new StringExp(loc, (char *)s, strlen(s), 'c'); +- Scope sc; +- e = e->semantic(&sc); ++ { ++ e = new StringExp(loc, (char *)deco, strlen(deco), 'c'); ++ Scope sc; ++ e = e->semantic(&sc); ++ } + } + else if (ident == Id::stringof) + { char *s = toChars(); +@@ -1953,6 +2076,10 @@ Expression *Type::getProperty(Loc loc, I + Scope sc; + e = e->semantic(&sc); + } ++ else if (flag && this != Type::terror) ++ { ++ return NULL; ++ } + else + { + Dsymbol *s = NULL; +@@ -1972,20 +2099,28 @@ Expression *Type::getProperty(Loc loc, I + return e; + } + +-Expression *Type::dotExp(Scope *sc, Expression *e, Identifier *ident) ++/*************************************** ++ * Access the members of the object e. This type is same as e->type. ++ * ++ * If flag == 1, don't report "not a property" error and just return NULL. ++ */ ++Expression *Type::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { VarDeclaration *v = NULL; + + #if LOGDOTEXP + printf("Type::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); + #endif +- if (e->op == TOKdotvar) ++ Expression *ex = e; ++ while (ex->op == TOKcomma) ++ ex = ((CommaExp *)ex)->e2; ++ if (ex->op == TOKdotvar) + { +- DotVarExp *dv = (DotVarExp *)e; ++ DotVarExp *dv = (DotVarExp *)ex; + v = dv->var->isVarDeclaration(); + } +- else if (e->op == TOKvar) ++ else if (ex->op == TOKvar) + { +- VarExp *ve = (VarExp *)e; ++ VarExp *ve = (VarExp *)ex; + v = ve->var->isVarDeclaration(); + } + if (v) +@@ -1998,7 +2133,7 @@ Expression *Type::dotExp(Scope *sc, Expr + else if (ident == Id::offsetof) + { + Loffset: +- if (v->storage_class & STCfield) ++ if (v->isField()) + { + e = new IntegerExp(e->loc, v->offset, Type::tsize_t); + return e; +@@ -2029,10 +2164,11 @@ Expression *Type::dotExp(Scope *sc, Expr + e = new StringExp(e->loc, s, strlen(s), 'c'); + } + else +- e = getProperty(e->loc, ident); ++ e = getProperty(e->loc, ident, flag); + + Lreturn: +- e = e->semantic(sc); ++ if (!flag || e) ++ e = e->semantic(sc); + return e; + } + +@@ -2048,8 +2184,10 @@ structalign_t Type::alignment() + /*************************************** + * Figures out what to do with an undefined member reference + * for classes and structs. ++ * ++ * If flag == 1, don't report "not a property" error and just return NULL. + */ +-Expression *Type::noMember(Scope *sc, Expression *e, Identifier *ident) ++Expression *Type::noMember(Scope *sc, Expression *e, Identifier *ident, int flag) + { + assert(ty == Tstruct || ty == Tclass); + AggregateDeclaration *sym = toDsymbol(sc)->isAggregateDeclaration(); +@@ -2095,10 +2233,20 @@ Expression *Type::noMember(Scope *sc, Ex + tiargs->push(se); + DotTemplateInstanceExp *dti = new DotTemplateInstanceExp(e->loc, e, Id::opDispatch, tiargs); + dti->ti->tempdecl = td; +- return dti->semantic(sc, 1); +- } + +- /* See if we should forward to the alias this. ++ /* opDispatch, which doesn't need IFTI, may occur instantiate error. ++ * It should be gagged if flag != 0. ++ * e.g. ++ * tempalte opDispatch(name) if (isValid!name) { ... } ++ */ ++ unsigned errors = flag ? global.startGagging() : 0; ++ Expression *e = dti->semanticY(sc, 0); ++ if (flag && global.endGagging(errors)) ++ e = NULL; ++ return e; ++ } ++ ++ /* See if we should forward to the alias this. + */ + if (sym->aliasthis) + { /* Rewrite e.ident as: +@@ -2106,11 +2254,11 @@ Expression *Type::noMember(Scope *sc, Ex + */ + e = resolveAliasThis(sc, e); + DotIdExp *die = new DotIdExp(e->loc, e, ident); +- return die->semantic(sc, 1); ++ return die->semanticY(sc, flag); + } + } + +- return Type::dotExp(sc, e, ident); ++ return Type::dotExp(sc, e, ident, flag); + } + + void Type::error(Loc loc, const char *format, ...) +@@ -2133,6 +2281,7 @@ Identifier *Type::getTypeInfoIdent(int i + { + // _init_10TypeInfo_%s + OutBuffer buf; ++ buf.reserve(32); + + if (internal) + { buf.writeByte(mangleChar[ty]); +@@ -2151,7 +2300,7 @@ Identifier *Type::getTypeInfoIdent(int i + char *name = namelen <= sizeof(namebuf) ? namebuf : (char *)malloc(namelen); + assert(name); + +- sprintf(name, "_D%dTypeInfo_%s6__initZ", 9 + len, buf.data); ++ sprintf(name, "_D%lluTypeInfo_%s6__initZ", (unsigned long long) 9 + len, buf.data); + //printf("name = %s\n", name); + assert(strlen(name) < namelen); // don't overflow the buffer + +@@ -2171,7 +2320,7 @@ TypeBasic *Type::isTypeBasic() + } + + +-void Type::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void Type::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + //printf("Type::resolve() %s, %d\n", toChars(), ty); + Type *t = semantic(loc, sc); +@@ -2234,6 +2383,18 @@ Type *Type::nextOf() + return NULL; + } + ++/************************************* ++ * If this is a type of static array, return its base element type. ++ */ ++ ++Type *Type::baseElemOf() ++{ ++ Type *t = toBasetype(); ++ while (t->ty == Tsarray) ++ t = ((TypeSArray *)t)->next->toBasetype(); ++ return t; ++} ++ + /**************************************** + * Return the mask that an integral type will + * fit into. +@@ -2279,9 +2440,9 @@ void TypeError::toCBuffer(OutBuffer *buf + buf->writestring("_error_"); + } + +-d_uns64 TypeError::size(Loc loc) { return 1; } +-Expression *TypeError::getProperty(Loc loc, Identifier *ident) { return new ErrorExp(); } +-Expression *TypeError::dotExp(Scope *sc, Expression *e, Identifier *ident) { return new ErrorExp(); } ++d_uns64 TypeError::size(Loc loc) { return SIZE_INVALID; } ++Expression *TypeError::getProperty(Loc loc, Identifier *ident, int flag) { return new ErrorExp(); } ++Expression *TypeError::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) { return new ErrorExp(); } + Expression *TypeError::defaultInit(Loc loc) { return new ErrorExp(); } + Expression *TypeError::defaultInitLiteral(Loc loc) { return new ErrorExp(); } + +@@ -2366,7 +2527,7 @@ Type *TypeNext::makeInvariant() + if (ty != Tfunction && next->ty != Tfunction && + //(next->deco || next->ty == Tfunction) && + !next->isImmutable()) +- { t->next = next->invariantOf(); ++ { t->next = next->immutableOf(); + } + if (ty == Taarray) + { +@@ -2543,11 +2704,6 @@ void TypeNext::transitive() + + /* ============================= TypeBasic =========================== */ + +-TypeBasic::TypeBasic(TY ty) +- : Type(ty) +-{ const char *d; +- unsigned flags; +- + #define TFLAGSintegral 1 + #define TFLAGSfloating 2 + #define TFLAGSunsigned 4 +@@ -2556,6 +2712,11 @@ TypeBasic::TypeBasic(TY ty) + #define TFLAGScomplex 0x20 + #define TFLAGSvector 0x40 // valid for a SIMD vector type + ++TypeBasic::TypeBasic(TY ty) ++ : Type(ty) ++{ const char *d; ++ unsigned flags; ++ + flags = 0; + switch (ty) + { +@@ -2745,15 +2906,11 @@ unsigned TypeBasic::alignsize() + } + + +-Expression *TypeBasic::getProperty(Loc loc, Identifier *ident) ++Expression *TypeBasic::getProperty(Loc loc, Identifier *ident, int flag) + { + Expression *e; + d_int64 ivalue; +-#ifdef IN_GCC +- real_t fvalue; +-#else + d_float80 fvalue; +-#endif + + //printf("TypeBasic::getProperty('%s')\n", ident->toChars()); + if (ident == Id::max) +@@ -2781,7 +2938,7 @@ Expression *TypeBasic::getProperty(Loc l + case Tfloat64: fvalue = DBL_MAX; goto Lfvalue; + case Tcomplex80: + case Timaginary80: +- case Tfloat80: fvalue = LDBL_MAX; goto Lfvalue; ++ case Tfloat80: fvalue = Port::ldbl_max; goto Lfvalue; + } + } + else if (ident == Id::min) +@@ -2844,7 +3001,7 @@ Expression *TypeBasic::getProperty(Loc l + case Tfloat64: + case Tfloat80: + { +- fvalue = Port::nan; ++ fvalue = Port::ldbl_nan; + goto Lfvalue; + } + } +@@ -2862,7 +3019,7 @@ Expression *TypeBasic::getProperty(Loc l + case Tfloat32: + case Tfloat64: + case Tfloat80: +- fvalue = Port::infinity; ++ fvalue = Port::ldbl_infinity; + goto Lfvalue; + } + } +@@ -2972,7 +3129,7 @@ Expression *TypeBasic::getProperty(Loc l + } + } + +- return Type::getProperty(loc, ident); ++ return Type::getProperty(loc, ident, flag); + + Livalue: + e = new IntegerExp(loc, ivalue, this); +@@ -3005,7 +3162,7 @@ Lint: + return e; + } + +-Expression *TypeBasic::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeBasic::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeBasic::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -3036,7 +3193,7 @@ Expression *TypeBasic::dotExp(Scope *sc, + break; + + default: +- e = Type::getProperty(e->loc, ident); ++ e = Type::getProperty(e->loc, ident, flag); + break; + } + } +@@ -3068,47 +3225,26 @@ Expression *TypeBasic::dotExp(Scope *sc, + break; + + default: +- e = Type::getProperty(e->loc, ident); ++ e = Type::getProperty(e->loc, ident, flag); + break; + } + } + else + { +- return Type::dotExp(sc, e, ident); ++ return Type::dotExp(sc, e, ident, flag); + } +- e = e->semantic(sc); ++ if (!flag || e) ++ e = e->semantic(sc); + return e; + } + + Expression *TypeBasic::defaultInit(Loc loc) +-{ dinteger_t value = 0; +- +-#if SNAN_DEFAULT_INIT +-#ifndef IN_GCC +- /* +- * Use a payload which is different from the machine NaN, +- * so that uninitialised variables can be +- * detected even if exceptions are disabled. +- */ +- union +- { unsigned short us[8]; +- longdouble ld; +- } snan = {{ 0, 0, 0, 0xA000, 0x7FFF }}; +- /* +- * Although long doubles are 10 bytes long, some +- * C ABIs pad them out to 12 or even 16 bytes, so +- * leave enough space in the snan array. +- */ +- assert(Target::realsize <= sizeof(snan)); +- d_float80 fvalue = snan.ld; +-#else +- real_t fvalue = Port::snan; +-#endif +-#endif +- ++{ + #if LOGDEFAULTINIT + printf("TypeBasic::defaultInit() '%s'\n", toChars()); + #endif ++ dinteger_t value = 0; ++ + switch (ty) + { + case Tchar: +@@ -3127,7 +3263,7 @@ Expression *TypeBasic::defaultInit(Loc l + case Tfloat64: + case Tfloat80: + #if SNAN_DEFAULT_INIT +- return new RealExp(loc, fvalue, this); ++ return new RealExp(loc, Port::snan, this); + #else + return getProperty(loc, Id::nan); + #endif +@@ -3138,8 +3274,8 @@ Expression *TypeBasic::defaultInit(Loc l + #if SNAN_DEFAULT_INIT + { // Can't use fvalue + I*fvalue (the im part becomes a quiet NaN). + complex_t cvalue; +- ((real_t *)&cvalue)[0] = fvalue; +- ((real_t *)&cvalue)[1] = fvalue; ++ ((real_t *)&cvalue)[0] = Port::snan; ++ ((real_t *)&cvalue)[1] = Port::snan; + return new ComplexExp(loc, cvalue, this); + } + #else +@@ -3170,8 +3306,9 @@ int TypeBasic::isZeroInit(Loc loc) + case Tcomplex64: + case Tcomplex80: + return 0; // no ++ default: ++ return 1; // yes + } +- return 1; // yes + } + + int TypeBasic::isintegral() +@@ -3255,8 +3392,8 @@ MATCH TypeBasic::implicitConvTo(Type *to + #if DMDV2 + // If converting from integral to integral + if (tob->flags & TFLAGSintegral) +- { d_uns64 sz = size(0); +- d_uns64 tosz = tob->size(0); ++ { d_uns64 sz = size(Loc()); ++ d_uns64 tosz = tob->size(Loc()); + + /* Can't convert to smaller size + */ +@@ -3320,7 +3457,7 @@ const char *TypeVector::kind() + + Type *TypeVector::syntaxCopy() + { +- return new TypeVector(0, basetype->syntaxCopy()); ++ return new TypeVector(Loc(), basetype->syntaxCopy()); + } + + Type *TypeVector::semantic(Loc loc, Scope *sc) +@@ -3335,16 +3472,6 @@ Type *TypeVector::semantic(Loc loc, Scop + return terror; + } + TypeSArray *t = (TypeSArray *)basetype; +- +- if (sc && sc->parameterSpecialization && t->dim->op == TOKvar && +- ((VarExp *)t->dim)->var->storage_class & STCtemplateparameter) +- { +- /* It could be a template parameter N which has no value yet: +- * template Foo(T : __vector(T[N]), size_t N); +- */ +- return this; +- } +- + d_uns64 sz = t->size(loc); + if (sz != 8 && sz != 16 && sz != 32) + { error(loc, "base type of __vector must be a 8, 16 or 32 byte static array, not %s", t->toChars()); +@@ -3409,12 +3536,12 @@ unsigned TypeVector::alignsize() + return (unsigned)basetype->size(); + } + +-Expression *TypeVector::getProperty(Loc loc, Identifier *ident) ++Expression *TypeVector::getProperty(Loc loc, Identifier *ident, int flag) + { +- return basetype->getProperty(loc, ident); ++ return basetype->getProperty(loc, ident, flag); + } + +-Expression *TypeVector::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeVector::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeVector::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -3424,7 +3551,7 @@ Expression *TypeVector::dotExp(Scope *sc + e = e->castTo(sc, basetype); + return e; + } +- return basetype->dotExp(sc, e->castTo(sc, basetype), ident); ++ return basetype->dotExp(sc, e->castTo(sc, basetype), ident, flag); + } + + Expression *TypeVector::defaultInit(Loc loc) +@@ -3432,6 +3559,11 @@ Expression *TypeVector::defaultInit(Loc + return basetype->defaultInit(loc); + } + ++Expression *TypeVector::defaultInitLiteral(Loc loc) ++{ ++ return basetype->defaultInitLiteral(loc); ++} ++ + int TypeVector::isZeroInit(Loc loc) + { + return basetype->isZeroInit(loc); +@@ -3468,6 +3600,11 @@ MATCH TypeVector::implicitConvTo(Type *t + return MATCHnomatch; + } + ++Type *TypeVector::reliesOnTident(TemplateParameters *tparams) ++{ ++ return basetype->reliesOnTident(tparams); ++} ++ + /***************************** TypeArray *****************************/ + + TypeArray::TypeArray(TY ty, Type *next) +@@ -3475,7 +3612,7 @@ TypeArray::TypeArray(TY ty, Type *next) + { + } + +-Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + Type *n = this->next->toBasetype(); // uncover any typedef's + +@@ -3485,38 +3622,48 @@ Expression *TypeArray::dotExp(Scope *sc, + + if (!n->isMutable()) + if (ident == Id::sort || ident == Id::reverse) +- error(e->loc, "can only %s a mutable array", ident->toChars()); ++ { error(e->loc, "can only %s a mutable array", ident->toChars()); ++ goto Lerror; ++ } + + if (ident == Id::reverse && (n->ty == Tchar || n->ty == Twchar)) + { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- const char *nm; +- static const char *name[2] = { "_adReverseChar", "_adReverseWchar" }; ++ static const char *reverseName[2] = { "_adReverseChar", "_adReverseWchar" }; ++ static FuncDeclaration *reverseFd[2] = { NULL, NULL }; ++ ++ int i = n->ty == Twchar; ++ if (!reverseFd[i]) { ++ Parameters *args = new Parameters; ++ Type *next = n->ty == Twchar ? Type::twchar : Type::tchar; ++ Type *arrty = next->arrayOf(); ++ args->push(new Parameter(STCin, arrty, NULL, NULL)); ++ reverseFd[i] = FuncDeclaration::genCfunc(args, arrty, reverseName[i]); ++ } + +- nm = name[n->ty == Twchar]; +- fd = FuncDeclaration::genCfunc(Type::tindex, nm); +- ec = new VarExp(0, fd); ++ Expression *ec = new VarExp(Loc(), reverseFd[i]); + e = e->castTo(sc, n->arrayOf()); // convert to dynamic array +- arguments = new Expressions(); ++ Expressions *arguments = new Expressions(); + arguments->push(e); + e = new CallExp(e->loc, ec, arguments); + e->type = next->arrayOf(); + } + else if (ident == Id::sort && (n->ty == Tchar || n->ty == Twchar)) + { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- const char *nm; +- static const char *name[2] = { "_adSortChar", "_adSortWchar" }; ++ static const char *sortName[2] = { "_adSortChar", "_adSortWchar" }; ++ static FuncDeclaration *sortFd[2] = { NULL, NULL }; ++ ++ int i = n->ty == Twchar; ++ if (!sortFd[i]) { ++ Parameters *args = new Parameters; ++ Type *next = n->ty == Twchar ? Type::twchar : Type::tchar; ++ Type *arrty = next->arrayOf(); ++ args->push(new Parameter(STCin, arrty, NULL, NULL)); ++ sortFd[i] = FuncDeclaration::genCfunc(args, arrty, sortName[i]); ++ } + +- nm = name[n->ty == Twchar]; +- fd = FuncDeclaration::genCfunc(Type::tindex, nm); +- ec = new VarExp(0, fd); ++ Expression *ec = new VarExp(Loc(), sortFd[i]); + e = e->castTo(sc, n->arrayOf()); // convert to dynamic array +- arguments = new Expressions(); ++ Expressions *arguments = new Expressions(); + arguments->push(e); + e = new CallExp(e->loc, ec, arguments); + e->type = next->arrayOf(); +@@ -3532,29 +3679,53 @@ Expression *TypeArray::dotExp(Scope *sc, + Expression *olde = e; + assert(size); + dup = (ident == Id::dup || ident == Id::idup); +- fd = FuncDeclaration::genCfunc(Type::tindex, dup ? Id::adDup : Id::adReverse); +- ec = new VarExp(0, fd); ++ ++ if (dup) { ++ static FuncDeclaration *adDup_fd = NULL; ++ if (!adDup_fd) { ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, Type::dtypeinfo->type, NULL, NULL)); ++ args->push(new Parameter(STCin, Type::tvoid->arrayOf(), NULL, NULL)); ++ adDup_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::adDup); ++ } ++ fd = adDup_fd; ++ } else { ++ static FuncDeclaration *adReverse_fd = NULL; ++ if (!adReverse_fd) { ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, Type::tvoid->arrayOf(), NULL, NULL)); ++ args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); ++ adReverse_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::adReverse); ++ } ++ fd = adReverse_fd; ++ } ++ ++ ec = new VarExp(Loc(), fd); + e = e->castTo(sc, n->arrayOf()); // convert to dynamic array + arguments = new Expressions(); + if (dup) + arguments->push(getTypeInfo(sc)); + arguments->push(e); + if (!dup) +- arguments->push(new IntegerExp(0, size, Type::tsize_t)); ++ arguments->push(new IntegerExp(Loc(), size, Type::tsize_t)); + e = new CallExp(e->loc, ec, arguments); + if (ident == Id::idup) +- { Type *einv = next->invariantOf(); ++ { Type *einv = next->immutableOf(); + if (next->implicitConvTo(einv) < MATCHconst) +- error(e->loc, "cannot implicitly convert element type %s to immutable in %s.idup", ++ { error(e->loc, "cannot implicitly convert element type %s to immutable in %s.idup", + next->toChars(), olde->toChars()); ++ goto Lerror; ++ } + e->type = einv->arrayOf(); + } + else if (ident == Id::dup) + { + Type *emut = next->mutableOf(); + if (next->implicitConvTo(emut) < MATCHconst) +- error(e->loc, "cannot implicitly convert element type %s to mutable in %s.dup", ++ { error(e->loc, "cannot implicitly convert element type %s to mutable in %s.dup", + next->toChars(), olde->toChars()); ++ goto Lerror; ++ } + e->type = emut->arrayOf(); + } + else +@@ -3562,12 +3733,17 @@ Expression *TypeArray::dotExp(Scope *sc, + } + else if (ident == Id::sort) + { ++ static FuncDeclaration *fd = NULL; + Expression *ec; +- FuncDeclaration *fd; + Expressions *arguments; + +- fd = FuncDeclaration::genCfunc(tint32->arrayOf(), "_adSort"); +- ec = new VarExp(0, fd); ++ if (!fd) { ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, Type::tvoid->arrayOf(), NULL, NULL)); ++ args->push(new Parameter(STCin, Type::dtypeinfo->type, NULL, NULL)); ++ fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), "_adSort"); ++ } ++ ec = new VarExp(Loc(), fd); + e = e->castTo(sc, n->arrayOf()); // convert to dynamic array + arguments = new Expressions(); + arguments->push(e); +@@ -3579,10 +3755,14 @@ Expression *TypeArray::dotExp(Scope *sc, + } + else + { +- e = Type::dotExp(sc, e, ident); ++ e = Type::dotExp(sc, e, ident, flag); + } +- e = e->semantic(sc); ++ if (!flag || e) ++ e = e->semantic(sc); + return e; ++ ++Lerror: ++ return new ErrorExp(); + } + + +@@ -3627,8 +3807,8 @@ d_uns64 TypeSArray::size(Loc loc) + return sz; + + Loverflow: +- error(loc, "index %lld overflow for static array", sz); +- return 1; ++ error(loc, "index %lld overflow for static array", (long long)sz); ++ return SIZE_INVALID; + } + + unsigned TypeSArray::alignsize() +@@ -3643,16 +3823,24 @@ unsigned TypeSArray::alignsize() + Expression *semanticLength(Scope *sc, Type *t, Expression *exp) + { + if (t->ty == Ttuple) +- { ScopeDsymbol *sym = new ArrayScopeSymbol(sc, (TypeTuple *)t); ++ { ++ ScopeDsymbol *sym = new ArrayScopeSymbol(sc, (TypeTuple *)t); + sym->parent = sc->scopesym; + sc = sc->push(sym); + ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); ++ sc = sc->endCTFE(); + + sc->pop(); + } + else ++ { ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); ++ sc = sc->endCTFE(); ++ } ++ + return exp; + } + +@@ -3662,45 +3850,52 @@ Expression *semanticLength(Scope *sc, Tu + sym->parent = sc->scopesym; + sc = sc->push(sym); + ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); ++ sc = sc->endCTFE(); + + sc->pop(); + return exp; + } + +-void TypeSArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeSArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + //printf("TypeSArray::resolve() %s\n", toChars()); +- next->resolve(loc, sc, pe, pt, ps); ++ next->resolve(loc, sc, pe, pt, ps, intypeid); + //printf("s = %p, e = %p, t = %p\n", *ps, *pe, *pt); + if (*pe) +- { // It's really an index expression ++ { ++ // It's really an index expression + Expressions *exps = new Expressions(); + exps->setDim(1); + (*exps)[0] = dim; +- Expression *e = new ArrayExp(loc, *pe, exps); +- *pe = e; ++ if (Dsymbol *s = getDsymbol(*pe)) ++ *pe = new DsymbolExp(loc, s, 1); ++ *pe = new ArrayExp(loc, *pe, exps); + } + else if (*ps) +- { Dsymbol *s = *ps; ++ { ++ Dsymbol *s = *ps; + TupleDeclaration *td = s->isTupleDeclaration(); + if (td) + { + ScopeDsymbol *sym = new ArrayScopeSymbol(sc, td); + sym->parent = sc->scopesym; + sc = sc->push(sym); +- ++ sc = sc->startCTFE(); + dim = dim->semantic(sc); ++ sc = sc->endCTFE(); ++ sc = sc->pop(); ++ + dim = dim->ctfeInterpret(); + uinteger_t d = dim->toUInteger(); + +- sc = sc->pop(); +- + if (d >= td->objects->dim) +- { error(loc, "tuple index %llu exceeds length %u", d, td->objects->dim); ++ { ++ error(loc, "tuple index %llu exceeds length %u", d, td->objects->dim); + goto Ldefault; + } +- Object *o = (*td->objects)[(size_t)d]; ++ RootObject *o = (*td->objects)[(size_t)d]; + if (o->dyncast() == DYNCAST_DSYMBOL) + { + *ps = (Dsymbol *)o; +@@ -3746,7 +3941,7 @@ void TypeSArray::resolve(Loc loc, Scope + else + { + Ldefault: +- Type::resolve(loc, sc, pe, pt, ps); ++ Type::resolve(loc, sc, pe, pt, ps, intypeid); + } + } + +@@ -3769,7 +3964,7 @@ Type *TypeSArray::semantic(Loc loc, Scop + { error(loc, "tuple index %llu exceeds %u", d, sd->objects->dim); + return Type::terror; + } +- Object *o = (*sd->objects)[(size_t)d]; ++ RootObject *o = (*sd->objects)[(size_t)d]; + if (o->dyncast() != DYNCAST_TYPE) + { error(loc, "%s is not a type", toChars()); + return Type::terror; +@@ -3778,7 +3973,7 @@ Type *TypeSArray::semantic(Loc loc, Scop + return t; + } + +- Type *tn = next->semantic(loc,sc); ++ Type *tn = next->semantic(loc, sc); + if (tn->ty == Terror) + return terror; + +@@ -3793,14 +3988,6 @@ Type *TypeSArray::semantic(Loc loc, Scop + goto Lerror; + + dim = dim->optimize(WANTvalue); +- if (sc && sc->parameterSpecialization && dim->op == TOKvar && +- ((VarExp *)dim)->var->storage_class & STCtemplateparameter) +- { +- /* It could be a template parameter N which has no value yet: +- * template Foo(T : T[N], size_t N); +- */ +- return this; +- } + dim = dim->ctfeInterpret(); + errors = global.errors; + dinteger_t d1 = dim->toInteger(); +@@ -3825,6 +4012,7 @@ Type *TypeSArray::semantic(Loc loc, Scop + tbn->ty == Tarray || + tbn->ty == Tsarray || + tbn->ty == Taarray || ++ (tbn->ty == Tstruct && (((TypeStruct *)tbn)->sym->sizeok == SIZEOKdone)) || + tbn->ty == Tclass) + { + /* Only do this for types that don't need to have semantic() +@@ -3859,18 +4047,12 @@ Type *TypeSArray::semantic(Loc loc, Scop + Parameter *arg = (*tt->arguments)[(size_t)d]; + return arg->type->addMod(this->mod); + } +- case Tstruct: +- { TypeStruct *ts = (TypeStruct *)tbn; +- if (0 && ts->sym->isnested) +- { error(loc, "cannot have static array of inner struct %s", ts->toChars()); +- goto Lerror; +- } +- break; +- } + case Tfunction: + case Tnone: + error(loc, "can't have array of %s", tbn->toChars()); + goto Lerror; ++ default: ++ break; + } + if (tbn->isscope()) + { error(loc, "cannot have array of scope %s", tbn->toChars()); +@@ -3890,6 +4072,19 @@ Lerror: + return Type::terror; + } + ++// Make corresponding static array type without semantic ++Type *TypeSArray::makeType(Loc loc, Type *tn, dinteger_t dim) ++{ ++ assert(tn->deco); ++ Type *t = new TypeSArray(tn, new IntegerExp(loc, dim, Type::tindex)); ++ ++ // according to TypeSArray::semantic() ++ t = t->addMod(tn->mod); ++ t = t->merge(); ++ ++ return t; ++} ++ + void TypeSArray::toDecoBuffer(OutBuffer *buf, int flag) + { + Type::toDecoBuffer(buf, flag); +@@ -3911,10 +4106,12 @@ void TypeSArray::toCBuffer2(OutBuffer *b + return; + } + next->toCBuffer2(buf, hgs, this->mod); +- buf->printf("[%s]", dim->toChars()); ++ buf->writeByte('['); ++ sizeToCBuffer(buf, hgs, dim); ++ buf->writeByte(']'); + } + +-Expression *TypeSArray::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeSArray::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeSArray::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -3937,9 +4134,10 @@ Expression *TypeSArray::dotExp(Scope *sc + } + else + { +- e = TypeArray::dotExp(sc, e, ident); ++ e = TypeArray::dotExp(sc, e, ident, flag); + } +- e = e->semantic(sc); ++ if (!flag || e) ++ e = e->semantic(sc); + return e; + } + +@@ -4036,7 +4234,10 @@ Expression *TypeSArray::defaultInit(Loc + #if LOGDEFAULTINIT + printf("TypeSArray::defaultInit() '%s'\n", toChars()); + #endif +- return next->defaultInit(loc); ++ if (next->ty == Tvoid) ++ return tuns8->defaultInit(loc); ++ else ++ return next->defaultInit(loc); + } + + int TypeSArray::isZeroInit(Loc loc) +@@ -4064,12 +4265,16 @@ Expression *TypeSArray::defaultInitLiter + printf("TypeSArray::defaultInitLiteral() '%s'\n", toChars()); + #endif + size_t d = dim->toInteger(); +- Expression *elementinit = next->defaultInitLiteral(loc); ++ Expression *elementinit; ++ if (next->ty == Tvoid) ++ elementinit = tuns8->defaultInitLiteral(loc); ++ else ++ elementinit = next->defaultInitLiteral(loc); + Expressions *elements = new Expressions(); + elements->setDim(d); + for (size_t i = 0; i < d; i++) + (*elements)[i] = elementinit; +- ArrayLiteralExp *ae = new ArrayLiteralExp(0, elements); ++ ArrayLiteralExp *ae = new ArrayLiteralExp(Loc(), elements); + ae->type = this; + return ae; + } +@@ -4151,31 +4356,29 @@ Type *TypeDArray::semantic(Loc loc, Scop + error(loc, "can't have array of %s", tbn->toChars()); + case Terror: + return Type::terror; +- +- case Tstruct: +- { TypeStruct *ts = (TypeStruct *)tbn; +- if (0 && ts->sym->isnested) +- error(loc, "cannot have dynamic array of inner struct %s", ts->toChars()); ++ default: + break; +- } + } + if (tn->isscope()) +- error(loc, "cannot have array of scope %s", tn->toChars()); +- ++ { error(loc, "cannot have array of scope %s", tn->toChars()); ++ return Type::terror; ++ } + next = tn; + transitive(); + return merge(); + } + +-void TypeDArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeDArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + //printf("TypeDArray::resolve() %s\n", toChars()); +- next->resolve(loc, sc, pe, pt, ps); ++ next->resolve(loc, sc, pe, pt, ps, intypeid); + //printf("s = %p, e = %p, t = %p\n", *ps, *pe, *pt); + if (*pe) +- { // It's really a slice expression +- Expression *e = new SliceExp(loc, *pe, NULL, NULL); +- *pe = e; ++ { ++ // It's really a slice expression ++ if (Dsymbol *s = getDsymbol(*pe)) ++ *pe = new DsymbolExp(loc, s, 1); ++ *pe = new SliceExp(loc, *pe, NULL, NULL); + } + else if (*ps) + { +@@ -4188,7 +4391,7 @@ void TypeDArray::resolve(Loc loc, Scope + else + { + Ldefault: +- Type::resolve(loc, sc, pe, pt, ps); ++ Type::resolve(loc, sc, pe, pt, ps, intypeid); + } + } + +@@ -4213,7 +4416,7 @@ void TypeDArray::toCBuffer2(OutBuffer *b + } + } + +-Expression *TypeDArray::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeDArray::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeDArray::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -4238,7 +4441,7 @@ Expression *TypeDArray::dotExp(Scope *sc + } + else + { +- e = TypeArray::dotExp(sc, e, ident); ++ e = TypeArray::dotExp(sc, e, ident, flag); + } + return e; + } +@@ -4268,7 +4471,7 @@ MATCH TypeDArray::implicitConvTo(Type *t + return MATCHconvert; + } + +- return next->constConv(to) ? MATCHconvert : MATCHnomatch; ++ return next->constConv(tp->next) ? MATCHconvert : MATCHnomatch; + } + + if (to->ty == Tarray) +@@ -4334,7 +4537,7 @@ TypeAArray::TypeAArray(Type *t, Type *in + { + this->index = index; + this->impl = NULL; +- this->loc = 0; ++ this->loc = Loc(); + this->sc = NULL; + } + +@@ -4383,22 +4586,23 @@ Type *TypeAArray::semantic(Loc loc, Scop + + index->resolve(loc, sc, &e, &t, &s); + if (e) +- { // It was an expression - ++ { ++ // It was an expression - + // Rewrite as a static array +- TypeSArray *tsa; +- +- tsa = new TypeSArray(next, e); +- return tsa->semantic(loc,sc); ++ TypeSArray *tsa = new TypeSArray(next, e); ++ return tsa->semantic(loc, sc); + } + else if (t) +- index = t; ++ index = t->semantic(loc, sc); + else +- { index->error(loc, "index is not a type or an expression"); ++ { ++ index->error(loc, "index is not a type or an expression"); + return Type::terror; + } + } + else + index = index->semantic(loc,sc); ++ index = index->merge2(); + + if (index->nextOf() && !index->nextOf()->isImmutable()) + { +@@ -4425,7 +4629,7 @@ printf("index->ito->ito = x%x\n", index- + case Terror: + return Type::terror; + } +- next = next->semantic(loc,sc); ++ next = next->semantic(loc,sc)->merge2(); + transitive(); + + switch (next->toBasetype()->ty) +@@ -4458,7 +4662,7 @@ StructDeclaration *TypeAArray::getImpl() + next = terror; + + // Head off future failures +- StructDeclaration *s = new StructDeclaration(0, NULL); ++ StructDeclaration *s = new StructDeclaration(Loc(), NULL); + s->type = terror; + impl = s; + return impl; +@@ -4489,9 +4693,13 @@ StructDeclaration *TypeAArray::getImpl() + dti->semantic(sc); + TemplateInstance *ti = dti->ti; + #endif +- ti->semantic(sc); +- ti->semantic2(sc); +- ti->semantic3(sc); ++ // Instantiate on the root module of import dependency graph. ++ Scope *scx = sc->push(sc->module->importedFrom); ++ scx->instantiatingModule = sc->module->importedFrom; ++ ti->semantic(scx); ++ ti->semantic2(scx); ++ ti->semantic3(scx); ++ scx->pop(); + impl = ti->toAlias()->isStructDeclaration(); + #ifdef DEBUG + if (!impl) +@@ -4504,7 +4712,7 @@ StructDeclaration *TypeAArray::getImpl() + return impl; + } + +-void TypeAArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeAArray::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + //printf("TypeAArray::resolve() %s\n", toChars()); + +@@ -4516,92 +4724,29 @@ void TypeAArray::resolve(Loc loc, Scope + Type *t; + Dsymbol *s; + +- index->resolve(loc, sc, &e, &t, &s); ++ index->resolve(loc, sc, &e, &t, &s, intypeid); + if (e) +- { // It was an expression - ++ { ++ // It was an expression - + // Rewrite as a static array +- + TypeSArray *tsa = new TypeSArray(next, e); +- return tsa->addMod(this->mod)->resolve(loc, sc, pe, pt, ps); ++ tsa->mod = this->mod; // just copy mod field so tsa's semantic is not yet done ++ return tsa->resolve(loc, sc, pe, pt, ps, intypeid); + } + else if (t) + index = t; + else + index->error(loc, "index is not a type or an expression"); + } +- Type::resolve(loc, sc, pe, pt, ps); ++ Type::resolve(loc, sc, pe, pt, ps, intypeid); + } + + +-Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeAArray::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); + #endif +-#if 0 +- if (ident == Id::length) +- { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- +- fd = FuncDeclaration::genCfunc(Type::tsize_t, Id::aaLen); +- ec = new VarExp(0, fd); +- arguments = new Expressions(); +- arguments->push(e); +- e = new CallExp(e->loc, ec, arguments); +- e->type = ((TypeFunction *)fd->type)->next; +- } +- else +- if (ident == Id::keys) +- { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- int size = index->size(e->loc); +- +- assert(size); +- fd = FuncDeclaration::genCfunc(Type::tindex, Id::aaKeys); +- ec = new VarExp(0, fd); +- arguments = new Expressions(); +- arguments->push(e); +- arguments->push(new IntegerExp(0, size, Type::tsize_t)); +- e = new CallExp(e->loc, ec, arguments); +- e->type = index->arrayOf(); +- } +- else if (ident == Id::values) +- { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- +- fd = FuncDeclaration::genCfunc(Type::tindex, Id::aaValues); +- ec = new VarExp(0, fd); +- arguments = new Expressions(); +- arguments->push(e); +- size_t keysize = index->size(e->loc); +- keysize = (keysize + Target::ptrsize - 1) & ~(Target::ptrsize - 1); +- arguments->push(new IntegerExp(0, keysize, Type::tsize_t)); +- arguments->push(new IntegerExp(0, next->size(e->loc), Type::tsize_t)); +- e = new CallExp(e->loc, ec, arguments); +- e->type = next->arrayOf(); +- } +- else if (ident == Id::rehash) +- { +- Expression *ec; +- FuncDeclaration *fd; +- Expressions *arguments; +- +- fd = FuncDeclaration::genCfunc(Type::tint64, Id::aaRehash); +- ec = new VarExp(0, fd); +- arguments = new Expressions(); +- arguments->push(e->addressOf(sc)); +- arguments->push(index->getInternalTypeInfo(sc)); +- e = new CallExp(e->loc, ec, arguments); +- e->type = this; +- } +- else +-#endif + if (ident != Id::__sizeof && + ident != Id::__xalignof && + ident != Id::init && +@@ -4609,15 +4754,13 @@ Expression *TypeAArray::dotExp(Scope *sc + ident != Id::stringof && + ident != Id::offsetof) + { +-//printf("test1: %s, %s\n", e->toChars(), e->type->toChars()); + Type *t = getImpl()->type; +-//printf("test2: %s, %s\n", e->toChars(), e->type->toChars()); ++ e = e->copy(); + e->type = t; +- e = t->dotExp(sc, e, ident); +-//printf("test3: %s, %s\n", e->toChars(), e->type->toChars()); ++ e = t->dotExp(sc, e, ident, flag); + } + else +- e = Type::dotExp(sc, e, ident); ++ e = Type::dotExp(sc, e, ident, flag); + return e; + } + +@@ -4779,6 +4922,8 @@ Type *TypePointer::semantic(Loc loc, Sco + error(loc, "can't have pointer to %s", n->toChars()); + case Terror: + return Type::terror; ++ default: ++ break; + } + if (n != next) + { +@@ -4789,7 +4934,7 @@ Type *TypePointer::semantic(Loc loc, Sco + { transitive(); + return merge(); + } +-#if 1 ++#if 0 + return merge(); + #else + deco = merge()->deco; +@@ -4967,14 +5112,14 @@ void TypeReference::toCBuffer2(OutBuffer + buf->writeByte('&'); + } + +-Expression *TypeReference::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeReference::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeReference::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); + #endif + + // References just forward things along +- return next->dotExp(sc, e, ident); ++ return next->dotExp(sc, e, ident, flag); + } + + Expression *TypeReference::defaultInit(Loc loc) +@@ -4993,7 +5138,7 @@ int TypeReference::isZeroInit(Loc loc) + + /***************************** TypeFunction *****************************/ + +-TypeFunction::TypeFunction(Parameters *parameters, Type *treturn, int varargs, enum LINK linkage, StorageClass stc) ++TypeFunction::TypeFunction(Parameters *parameters, Type *treturn, int varargs, LINK linkage, StorageClass stc) + : TypeNext(Tfunction, treturn) + { + //if (!treturn) *(char*)0=0; +@@ -5034,13 +5179,6 @@ const char *TypeFunction::kind() + return "function"; + } + +-TypeFunction *TypeFunction::copy() +-{ +- TypeFunction *tf = (TypeFunction *)mem.malloc(sizeof(TypeFunction)); +- memcpy(tf, this, sizeof(TypeFunction)); +- return tf; +-} +- + Type *TypeFunction::syntaxCopy() + { + Type *treturn = next ? next->syntaxCopy() : NULL; +@@ -5051,6 +5189,7 @@ Type *TypeFunction::syntaxCopy() + t->purity = purity; + t->isproperty = isproperty; + t->isref = isref; ++ t->iswild = iswild; + t->trust = trust; + t->fargs = fargs; + return t; +@@ -5110,12 +5249,7 @@ int Type::covariant(Type *t, StorageClas + + if (!arg1->type->equals(arg2->type)) + { +-#if 0 // turn on this for contravariant argument types, see bugzilla 3075 +- // BUG: cannot convert ref to const to ref to immutable +- // We can add const, but not subtract it +- if (arg2->type->implicitConvTo(arg1->type) < MATCHconst) +-#endif +- goto Ldistinct; ++ goto Ldistinct; + } + const StorageClass sc = STCref | STCin | STCout | STClazy; + if ((arg1->storageClass & sc) != (arg2->storageClass & sc)) +@@ -5161,13 +5295,9 @@ int Type::covariant(Type *t, StorageClas + + // If t1n is forward referenced: + ClassDeclaration *cd = ((TypeClass *)t1n)->sym; +-// if (cd->scope) +-// cd->semantic(NULL); +-#if 0 +- if (!cd->baseClass && cd->baseclasses->dim && !cd->isInterfaceDeclaration()) +-#else ++ if (cd->scope) ++ cd->semantic(NULL); + if (!cd->isBaseInfoComplete()) +-#endif + { + return 3; // forward references + } +@@ -5180,7 +5310,8 @@ int Type::covariant(Type *t, StorageClas + } + else if (t1n->ty == t2n->ty && t1n->implicitConvTo(t2n)) + goto Lcovariant; +- else if (t1n->ty == Tnull && t1n->implicitConvTo(t2n)) ++ else if (t1n->ty == Tnull && t1n->implicitConvTo(t2n) && ++ t1n->size() == t2n->size()) + goto Lcovariant; + } + goto Lnotcovariant; +@@ -5193,11 +5324,15 @@ Lcovariant: + */ + if (!MODimplicitConv(t2->mod, t1->mod)) + { ++#if 0//stop attribute inference with const + // If adding 'const' will make it covariant + if (MODimplicitConv(t2->mod, MODmerge(t1->mod, MODconst))) + stc |= STCconst; + else + goto Lnotcovariant; ++#else ++ goto Ldistinct; ++#endif + } + + /* Can convert pure to impure, and nothrow to throw +@@ -5476,13 +5611,13 @@ Type *TypeFunction::semantic(Loc loc, Sc + * This can produce redundant copies if inferring return type, + * as semantic() will get called again on this. + */ +- TypeFunction *tf = copy(); ++ TypeFunction *tf = (TypeFunction *)copy(); + if (parameters) + { tf->parameters = (Parameters *)parameters->copy(); + for (size_t i = 0; i < parameters->dim; i++) + { Parameter *arg = (*parameters)[i]; + Parameter *cpy = (Parameter *)mem.malloc(sizeof(Parameter)); +- memcpy(cpy, arg, sizeof(Parameter)); ++ memcpy((void*)cpy, (void*)arg, sizeof(Parameter)); + (*tf->parameters)[i] = cpy; + } + } +@@ -5505,7 +5640,7 @@ Type *TypeFunction::semantic(Loc loc, Sc + tf->isproperty = TRUE; + + tf->linkage = sc->linkage; +- ++#if 0 + /* If the parent is @safe, then this function defaults to safe + * too. + * If the parent's @safe-ty is inferred, then this function's @safe-ty needs +@@ -5521,7 +5656,7 @@ Type *TypeFunction::semantic(Loc loc, Sc + break; + } + } +- ++#endif + bool wildreturn = FALSE; + if (tf->next) + { +@@ -5529,18 +5664,30 @@ Type *TypeFunction::semantic(Loc loc, Sc + sc->stc &= ~(STC_TYPECTOR | STC_FUNCATTR); + tf->next = tf->next->semantic(loc,sc); + sc = sc->pop(); +- if (tf->next->toBasetype()->ty == Tfunction) +- { error(loc, "functions cannot return a function"); ++ Type *tb = tf->next->toBasetype(); ++ if (tb->ty == Tfunction) ++ { ++ error(loc, "functions cannot return a function"); + tf->next = Type::terror; + } +- if (tf->next->toBasetype()->ty == Ttuple) +- { error(loc, "functions cannot return a tuple"); ++ else if (tb->ty == Ttuple) ++ { ++ error(loc, "functions cannot return a tuple"); + tf->next = Type::terror; + } ++ else if (tb->ty == Tstruct) ++ { ++ StructDeclaration *sd = ((TypeStruct *)tb)->sym; ++ if (sd->isforwardRef()) ++ { ++ error(loc, "cannot return opaque struct %s by value", tb->toChars()); ++ tf->next = Type::terror; ++ } ++ } ++ else if (tb->ty == Tvoid) ++ tf->isref = FALSE; // rewrite "ref void" as just "void" + if (tf->next->isscope() && !(sc->flags & SCOPEctor)) + error(loc, "functions cannot return scope %s", tf->next->toChars()); +- if (tf->next->toBasetype()->ty == Tvoid) +- tf->isref = FALSE; // rewrite "ref void" as just "void" + if (tf->next->hasWild() && + !(tf->next->ty == Tpointer && tf->next->nextOf()->ty == Tfunction || tf->next->ty == Tdelegate)) + wildreturn = TRUE; +@@ -5574,15 +5721,27 @@ Type *TypeFunction::semantic(Loc loc, Sc + + Type *t = fparam->type->toBasetype(); + +- if (fparam->storageClass & (STCout | STCref | STClazy)) +- { +- //if (t->ty == Tsarray) +- //error(loc, "cannot have out or ref parameter of type %s", t->toChars()); +- if (fparam->storageClass & STCout && fparam->type->mod & (STCconst | STCimmutable)) +- error(loc, "cannot have const or immutable out parameter of type %s", t->toChars()); +- } + if (!(fparam->storageClass & STClazy) && t->ty == Tvoid) + error(loc, "cannot have parameter of type %s", fparam->type->toChars()); ++ if (fparam->storageClass & (STCref | STClazy)) ++ { ++ } ++ else if (fparam->storageClass & STCout) ++ { ++ if (unsigned m = fparam->type->mod & (MODimmutable | MODconst | MODwild)) ++ error(loc, "cannot have %s out parameter of type %s", MODtoChars(m), t->toChars()); ++ else ++ { ++ Type *tv = t; ++ while (tv->ty == Tsarray) ++ tv = tv->nextOf()->toBasetype(); ++ if (tv->ty == Tstruct && ((TypeStruct *)tv)->sym->noDefaultCtor) ++ { ++ error(loc, "cannot have out parameter of type %s because the default construction is disbaled", ++ fparam->type->toChars()); ++ } ++ } ++ } + + if (t->hasWild() && + !(t->ty == Tpointer && t->nextOf()->ty == Tfunction || t->ty == Tdelegate)) +@@ -5658,7 +5817,10 @@ Type *TypeFunction::semantic(Loc loc, Sc + if (fparam->storageClass & STCauto) + { + if (fargs && i < fargs->dim) +- { Expression *farg = (*fargs)[i]; ++ { ++ Expression *farg = (*fargs)[i]; ++ if (Expression *e = farg->isTemp()) ++ farg = e; + if (farg->isLvalue()) + ; // ref parameter + else +@@ -5703,168 +5865,78 @@ Type *TypeFunction::semantic(Loc loc, Sc + } + + +-Type *getIndirection(Type *t) +-{ +- t = t->toBasetype(); +- +- if (t->ty == Tsarray) +- { while (t->ty == Tsarray) +- t = t->nextOf()->toBasetype(); +- } +- if (t->ty == Tarray || t->ty == Tpointer) +- return t->nextOf()->toBasetype(); +- if (t->ty == Taarray || t->ty == Tclass) +- return t; +- if (t->ty == Tstruct) +- return t->hasPointers() ? t : NULL; // TODO +- +- // should consider TypeDelegate? +- return NULL; +-} +- + /******************************************** + * Do this lazily, as the parameter types might be forward referenced. + */ + void TypeFunction::purityLevel() + { +- //printf("purityLevel(%s)\n", toChars()); +- + TypeFunction *tf = this; +- if (tf->purity == PUREfwdref && tf->next) ++ if (tf->purity == PUREfwdref) + { /* Evaluate what kind of purity based on the modifiers for the parameters + */ +- enum PURE purity = PUREstrong; // assume strong until something weakens it +- size_t dim = Parameter::dim(tf->parameters); +- +- if (dim) ++ tf->purity = PUREstrong; // assume strong until something weakens it ++ if (tf->parameters) + { +- Type *tret = tf->next; +- assert(tret); +- Type *treti = tf->isref ? tret->toBasetype() : getIndirection(tret); +- if (treti && (treti->mod & MODimmutable)) +- treti = NULL; // indirection is immutable +- //printf(" tret = %s, treti = %s\n", tret->toChars(), treti ? treti->toChars() : "NULL"); +- ++ size_t dim = Parameter::dim(tf->parameters); + for (size_t i = 0; i < dim; i++) + { Parameter *fparam = Parameter::getNth(tf->parameters, i); + if (fparam->storageClass & STClazy) + { +- purity = PUREweak; ++ tf->purity = PUREweak; + break; + } + if (fparam->storageClass & STCout) + { +- purity = PUREweak; ++ tf->purity = PUREweak; + break; + } + if (!fparam->type) + continue; +- +- Type *tprm = fparam->type; +- Type *tprmi = fparam->storageClass & STCref ? tprm->toBasetype() : getIndirection(tprm); +- //printf(" [%d] tprm = %s, tprmi = %s\n", i, tprm->toChars(), tprmi ? tprmi->toChars() : "NULL"); +- +- if (!tprmi || (tprmi->mod & MODimmutable)) +- continue; // there is no mutable indirection +- if (tprmi->isMutable()) +- { purity = PUREweak; // indirection is mutable +- break; ++ if (fparam->storageClass & STCref) ++ { ++ if (!(fparam->type->mod & (MODconst | MODimmutable | MODwild))) ++ { tf->purity = PUREweak; ++ break; ++ } ++ if (fparam->type->mod & MODconst) ++ { tf->purity = PUREconst; ++ continue; ++ } + } +- if (!treti) +- continue; // mutable indirection is never returned +- +- if (purity < PUREstrong) ++ Type *t = fparam->type->toBasetype(); ++ if (!t->hasPointers()) + continue; +- +- // Determine the parameter is really PUREconst or not +- assert(tprmi->mod & (MODconst | MODwild)); +- if (tprmi->constConv(treti)) // simple case +- purity = PUREconst; +- else if (tprmi->invariantOf()->equals(treti->invariantOf())) ++ if (t->mod & MODimmutable) ++ continue; ++ /* The rest of this is too strict; fix later. ++ * For example, the only pointer members of a struct may be immutable, ++ * which would maintain strong purity. ++ */ ++ if (t->mod & (MODconst | MODwild)) ++ { tf->purity = PUREconst; + continue; +- else +- { +- /* The rest of this is little strict; fix later. +- * For example: +- * +- * struct S { immutable* p; } +- * pure S foo(const int* p); +- * +- * which would maintain strong purity. +- */ +- if (tprmi->hasPointers() || treti->hasPointers()) +- purity = PUREconst; + } +- ++ Type *tn = t->nextOf(); ++ if (tn) ++ { tn = tn->toBasetype(); ++ if (tn->ty == Tpointer || tn->ty == Tarray) ++ { /* Accept immutable(T)* and immutable(T)[] as being strongly pure ++ */ ++ if (tn->mod & MODimmutable) ++ continue; ++ if (tn->mod & (MODconst | MODwild)) ++ { tf->purity = PUREconst; ++ continue; ++ } ++ } ++ } + /* Should catch delegates and function pointers, and fold in their purity + */ ++ tf->purity = PUREweak; // err on the side of too strict ++ break; + } + } +- +- //printf(" --> purity: %d\n", purity); +- tf->purity = purity; +- } +-} +- +-/******************************************** +- * FIXME: This function is a workaround for fixing Bugzilla 9210. +- * In 2.061, TypeFunction::purityLevel() improved to make more functions +- * strong purity, but immutable conversion on return statemet had broken by that. +- * Because, it is essentially unrelated to PUREstrong. This function is +- * necessary to check the convertibility. +- */ +-bool TypeFunction::hasMutableIndirectionParams() +-{ +- TypeFunction *tf = this; +- size_t dim = Parameter::dim(tf->parameters); +- for (size_t i = 0; i < dim; i++) +- { +- Parameter *fparam = Parameter::getNth(tf->parameters, i); +- if (fparam->storageClass & STClazy) +- { +- return true; +- } +- if (fparam->storageClass & STCout) +- { +- return true; +- } +- if (!fparam->type) +- continue; +- if (fparam->storageClass & STCref) +- { +- if (!(fparam->type->mod & (MODconst | MODimmutable | MODwild))) +- return true; +- if (fparam->type->mod & MODconst) +- return true; +- } +- Type *t = fparam->type->toBasetype(); +- if (!t->hasPointers()) +- continue; +- if (t->mod & (MODimmutable | MODwild)) +- continue; +- /* The rest of this is too strict; fix later. +- * For example, the only pointer members of a struct may be immutable, +- * which would maintain strong purity. +- */ +- if (t->mod & MODconst) +- return true; +- Type *tn = t->nextOf(); +- if (tn) +- { tn = tn->toBasetype(); +- if (tn->ty == Tpointer || tn->ty == Tarray) +- { /* Accept immutable(T)* and immutable(T)[] as being strongly pure +- */ +- if (tn->mod & (MODimmutable | MODwild)) +- continue; +- if (tn->mod & MODconst) +- return true; +- } +- } +- /* Should catch delegates and function pointers, and fold in their purity +- */ +- return true; + } +- return false; + } + + +@@ -5877,14 +5949,14 @@ bool TypeFunction::hasMutableIndirection + * MATCHxxxx + */ + +-MATCH TypeFunction::callMatch(Expression *ethis, Expressions *args, int flag) ++MATCH TypeFunction::callMatch(Type *tthis, Expressions *args, int flag) + { + //printf("TypeFunction::callMatch() %s\n", toChars()); + MATCH match = MATCHexact; // assume exact match + unsigned wildmatch = 0; + +- if (ethis) +- { Type *t = ethis->type; ++ if (tthis) ++ { Type *t = tthis; + if (t->toBasetype()->ty == Tpointer) + t = t->toBasetype()->nextOf(); // change struct* to struct + if (t->mod != mod) +@@ -5971,6 +6043,8 @@ MATCH TypeFunction::callMatch(Expression + { + Expression *arg = (*args)[u]; + assert(arg); ++ if (Expression *e = arg->isTemp()) ++ arg = e; + + if (arg->op == TOKfunction) + { +@@ -5999,24 +6073,37 @@ MATCH TypeFunction::callMatch(Expression + + // Non-lvalues do not match ref or out parameters + if (p->storageClass & STCref) +- { if (m && !arg->isLvalue()) ++ { ++ Type *targb = targ->toBasetype(); ++ Type *tprmb = tprm->toBasetype(); ++ //printf("%s\n", targb->toChars()); ++ //printf("%s\n", tprmb->toChars()); ++ ++ if (m && !arg->isLvalue()) + { +- Type *ta = targ->aliasthisOf(); +- if (arg->op == TOKstring && tprm->ty == Tsarray) +- { if (targ->ty != Tsarray) +- targ = new TypeSArray(targ->nextOf(), +- new IntegerExp(0, ((StringExp *)arg)->len, +- Type::tindex)); ++ if (arg->op == TOKstring && tprmb->ty == Tsarray) ++ { ++ if (targb->ty != Tsarray) ++ { ++ Type *tn = tprmb->nextOf()->castMod(targb->nextOf()->mod); ++ dinteger_t dim = ((StringExp *)arg)->len; ++ targb = TypeSArray::makeType(Loc(), tn, dim); ++ } ++ } ++ else if (arg->op == TOKslice && tprmb->ty == Tsarray) ++ { ++ // Allow conversion from T[lwr .. upr] to ref T[upr-lwr] ++ if (targb->ty != Tsarray) ++ { ++ Type *tn = targb->nextOf(); ++ dinteger_t dim = ((TypeSArray *)tprmb)->dim->toUInteger(); ++ targb = TypeSArray::makeType(Loc(), tn, dim); ++ } + } + else + goto Nomatch; + } + +- Type *targb = targ->toBasetype(); +- Type *tprmb = tprm->toBasetype(); +- //printf("%s\n", targb->toChars()); +- //printf("%s\n", tprmb->toChars()); +- + /* find most derived alias this type being matched. + */ + while (1) +@@ -6178,7 +6265,7 @@ bool TypeFunction::parameterEscapes(Para + if (!nextOf()) + return TRUE; + +- if (purity) ++ if (purity > PUREweak) + { /* With pure functions, we need only be concerned if p escapes + * via any return statement. + */ +@@ -6218,6 +6305,7 @@ Type *TypeFunction::addStorageClass(Stor + tf->isproperty = t->isproperty; + tf->isref = t->isref; + tf->trust = t->trust; ++ tf->iswild = t->iswild; + + if (stc & STCpure) + tf->purity = PUREfwdref; +@@ -6270,7 +6358,7 @@ Type *TypeDelegate::semantic(Loc loc, Sc + * be removed from next before the merge. + */ + +-#if 1 ++#if 0 + return merge(); + #else + /* Don't return merge(), because arg identifiers and default args +@@ -6339,7 +6427,7 @@ int TypeDelegate::checkBoolean() + return TRUE; + } + +-Expression *TypeDelegate::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeDelegate::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeDelegate::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -6349,12 +6437,12 @@ Expression *TypeDelegate::dotExp(Scope * + #ifndef IN_GCC + e->type = tvoidptr; + #else +- if (e->op == TOKdelegate || e->op == TOKcast) +- e = e->castTo(sc, tvoidptr); // Not an lvalue ++ if (!e->isLvalue()) ++ e = e->castTo(sc, tvoidptr); + else + { + e = e->addressOf(sc); +- e = e->castTo(sc, tvoidptr->pointerTo()); ++ e->type = tvoidptr; + e = new PtrExp(e->loc, e); + e->type = tvoidptr; + } +@@ -6366,7 +6454,7 @@ Expression *TypeDelegate::dotExp(Scope * + if (!e->isLvalue()) + { + Identifier *idtmp = Lexer::uniqueId("__dgtmp"); +- VarDeclaration *tmp = new VarDeclaration(e->loc, this, idtmp, new ExpInitializer(0, e)); ++ VarDeclaration *tmp = new VarDeclaration(e->loc, this, idtmp, new ExpInitializer(Loc(), e)); + tmp->storage_class |= STCctfe; + e = new DeclarationExp(e->loc, tmp); + e = new CommaExp(e->loc, e, new VarExp(e->loc, tmp)); +@@ -6382,7 +6470,7 @@ Expression *TypeDelegate::dotExp(Scope * + } + else + { +- e = Type::dotExp(sc, e, ident); ++ e = Type::dotExp(sc, e, ident, flag); + } + return e; + } +@@ -6408,13 +6496,13 @@ void TypeQualified::syntaxCopyHelper(Typ + idents.setDim(t->idents.dim); + for (size_t i = 0; i < idents.dim; i++) + { +- Identifier *id = t->idents[i]; ++ RootObject *id = t->idents[i]; + if (id->dyncast() == DYNCAST_DSYMBOL) + { + TemplateInstance *ti = (TemplateInstance *)id; + + ti = (TemplateInstance *)ti->syntaxCopy(NULL); +- id = (Identifier *)ti; ++ id = ti; + } + idents[i] = id; + } +@@ -6426,10 +6514,15 @@ void TypeQualified::addIdent(Identifier + idents.push(ident); + } + ++void TypeQualified::addInst(TemplateInstance *inst) ++{ ++ idents.push(inst); ++} ++ + void TypeQualified::toCBuffer2Helper(OutBuffer *buf, HdrGenState *hgs) + { + for (size_t i = 0; i < idents.dim; i++) +- { Identifier *id = idents[i]; ++ { RootObject *id = idents[i]; + + buf->writeByte('.'); + +@@ -6446,7 +6539,7 @@ void TypeQualified::toCBuffer2Helper(Out + d_uns64 TypeQualified::size(Loc loc) + { + error(this->loc, "size of type %s is not known", toChars()); +- return 1; ++ return SIZE_INVALID; + } + + /************************************* +@@ -6459,13 +6552,8 @@ d_uns64 TypeQualified::size(Loc loc) + + void TypeQualified::resolveHelper(Loc loc, Scope *sc, + Dsymbol *s, Dsymbol *scopesym, +- Expression **pe, Type **pt, Dsymbol **ps) ++ Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { +- VarDeclaration *v; +- EnumMember *em; +- Expression *e; +- TemplateInstance *ti; +- + #if 0 + printf("TypeQualified::resolveHelper(sc = %p, idents = '%s')\n", sc, toChars()); + if (scopesym) +@@ -6482,66 +6570,63 @@ void TypeQualified::resolveHelper(Loc lo + //printf("\t2: s = '%s' %p, kind = '%s'\n",s->toChars(), s, s->kind()); + for (size_t i = 0; i < idents.dim; i++) + { +- Identifier *id = idents[i]; ++ RootObject *id = idents[i]; ++ Type *t = s->getType(); // type symbol, type alias, or type tuple? + Dsymbol *sm = s->searchX(loc, sc, id); +- //printf("\t3: s = '%s' %p, kind = '%s'\n",s->toChars(), s, s->kind()); +- //printf("\tgetType = '%s'\n", s->getType()->toChars()); ++ //printf("\t3: s = %p %s %s, sm = %p\n", s, s->kind(), s->toChars(), sm); ++ if (intypeid && !t && sm && sm->needThis()) ++ goto L3; + if (!sm) +- { Type *t; +- +- v = s->isVarDeclaration(); +- ti = s->isTemplateInstance(); +- if (v && id == Id::length) +- { +- e = new VarExp(loc, v); +- t = e->type; +- if (!t) +- goto Lerror; +- goto L3; +- } +- else if ((v && (id == Id::stringof || id == Id::offsetof)) +- || (ti && (id == Id::stringof || id == Id::mangleof))) ++ { ++ if (!t) + { +- e = new DsymbolExp(loc, s, 0); +- do ++ if (s->isDeclaration()) // var, func, or tuple declaration? + { +- id = idents[i]; +- e = new DotIdExp(loc, e, id); +- } while (++i < idents.dim); +- e = e->semantic(sc); +- *pe = e; +- return; +- } +- +- t = s->getType(); +- if (!t && s->isDeclaration()) +- { t = s->isDeclaration()->type; +- if (!t && s->isTupleDeclaration()) ++ t = s->isDeclaration()->type; ++ if (!t && s->isTupleDeclaration()) // expression tuple? ++ goto L3; ++ } ++ else if (s->isTemplateInstance() || ++ s->isImport() || s->isPackage() || s->isModule()) + { +- e = new TupleExp(loc, s->isTupleDeclaration()); +- e = e->semantic(sc); +- t = e->type; ++ goto L3; + } + } + if (t) + { + sm = t->toDsymbol(sc); +- if (sm) +- { sm = sm->search(loc, id, 0); ++ if (sm && id->dyncast() == DYNCAST_IDENTIFIER) ++ { ++ sm = sm->search(loc, (Identifier *)id, 0); + if (sm) + goto L2; + } +- //e = t->getProperty(loc, id); +- e = new TypeExp(loc, t); +- e = t->dotExp(sc, e, id); +- i++; + L3: ++ Expression *e; ++ VarDeclaration *v = s->isVarDeclaration(); ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (intypeid || !v && !f) ++ e = new DsymbolExp(loc, s); ++ else ++ e = new VarExp(loc, s->isDeclaration()); ++ e = e->semantic(sc); + for (; i < idents.dim; i++) + { +- id = idents[i]; ++ RootObject *id = idents[i]; + //printf("e: '%s', id: '%s', type = %s\n", e->toChars(), id->toChars(), e->type->toChars()); +- e = new DotIdExp(e->loc, e, id); +- e = e->semantic(sc); ++ if (id->dyncast() == DYNCAST_IDENTIFIER) ++ { ++ DotIdExp *die = new DotIdExp(e->loc, e, (Identifier *)id); ++ e = die->semanticY(sc, 0); ++ } ++ else ++ { ++ assert(id->dyncast() == DYNCAST_DSYMBOL); ++ TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); ++ assert(ti); ++ DotTemplateInstanceExp *dte = new DotTemplateInstanceExp(e->loc, e, ti->name, ti->tiargs); ++ e = dte->semanticY(sc, 0); ++ } + } + if (e->op == TOKtype) + *pt = e->type; +@@ -6550,14 +6635,14 @@ void TypeQualified::resolveHelper(Loc lo + } + else + { +- Lerror: + if (id->dyncast() == DYNCAST_DSYMBOL) + { // searchX already handles errors for template instances + assert(global.errors); + } + else + { +- sm = s->search_correct(id); ++ assert(id->dyncast() == DYNCAST_IDENTIFIER); ++ sm = s->search_correct((Identifier *)id); + if (sm) + error(loc, "identifier '%s' of '%s' is not defined, did you mean '%s %s'?", + id->toChars(), toChars(), sm->kind(), sm->toChars()); +@@ -6572,25 +6657,27 @@ void TypeQualified::resolveHelper(Loc lo + s = sm->toAlias(); + } + +- v = s->isVarDeclaration(); +- if (v) ++ if (VarDeclaration *v = s->isVarDeclaration()) + { ++ if (v && v->inuse && (!v->type || !v->type->deco)) // Bugzilla 9494 ++ { error(loc, "circular reference to '%s'", v->toPrettyChars()); ++ *pe = new ErrorExp(); ++ return; ++ } + *pe = new VarExp(loc, v); + return; + } + #if 0 +- fd = s->isFuncDeclaration(); +- if (fd) ++ if (FuncDeclaration *fd = s->isFuncDeclaration()) + { + *pe = new DsymbolExp(loc, fd, 1); + return; + } + #endif +- em = s->isEnumMember(); +- if (em) ++ if (EnumMember *em = s->isEnumMember()) + { + // It's not a type, it's an expression +- *pe = em->value->copy(); ++ *pe = em->getVarExp(loc, sc); + return; + } + +@@ -6599,10 +6686,7 @@ L1: + if (!t) + { + // If the symbol is an import, try looking inside the import +- Import *si; +- +- si = s->isImport(); +- if (si) ++ if (Import *si = s->isImport()) + { + s = si->search(loc, s->ident, 0); + if (s && s != si) +@@ -6614,6 +6698,7 @@ L1: + } + if (t->ty == Tinstance && t != this && !t->deco) + { error(loc, "forward reference to '%s'", t->toChars()); ++ *pt = Type::terror; + return; + } + +@@ -6633,6 +6718,7 @@ L1: + { + if (!scx) + { error(loc, "forward reference to '%s'", t->toChars()); ++ *pt = Type::terror; + return; + } + if (scx->scopesym == scopesym) +@@ -6718,7 +6804,7 @@ void TypeIdentifier::toCBuffer2(OutBuffe + * if type, *pt is set + */ + +-void TypeIdentifier::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeIdentifier::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + Dsymbol *scopesym; + +@@ -6747,7 +6833,7 @@ void TypeIdentifier::resolve(Loc loc, Sc + } + + Dsymbol *s = sc->search(loc, ident, &scopesym); +- resolveHelper(loc, sc, s, scopesym, pe, pt, ps); ++ resolveHelper(loc, sc, s, scopesym, pe, pt, ps, intypeid); + if (*pt) + (*pt) = (*pt)->addMod(mod); + } +@@ -6770,7 +6856,7 @@ Dsymbol *TypeIdentifier::toDsymbol(Scope + { + for (size_t i = 0; i < idents.dim; i++) + { +- Identifier *id = idents[i]; ++ RootObject *id = idents[i]; + s = s->searchX(loc, sc, id); + if (!s) // failed to find a symbol + { //printf("\tdidn't find a symbol\n"); +@@ -6794,10 +6880,12 @@ Type *TypeIdentifier::semantic(Loc loc, + //printf("\tit's a type %d, %s, %s\n", t->ty, t->toChars(), t->deco); + + if (t->ty == Ttypedef) +- { TypeTypedef *tt = (TypeTypedef *)t; +- ++ { ++ TypeTypedef *tt = (TypeTypedef *)t; + if (tt->sym->sem == SemanticIn) +- error(loc, "circular reference of typedef %s", tt->toChars()); ++ { error(loc, "circular reference of typedef %s", tt->toChars()); ++ return terror; ++ } + } + t = t->addMod(mod); + } +@@ -6820,14 +6908,11 @@ Type *TypeIdentifier::reliesOnTident(Tem + { + if (tparams) + { +- if (idents.dim == 0) ++ for (size_t i = 0; i < tparams->dim; i++) + { +- for (size_t i = 0; i < tparams->dim; i++) +- { TemplateParameter *tp = (*tparams)[i]; +- +- if (tp->ident->equals(ident)) +- return this; +- } ++ TemplateParameter *tp = (*tparams)[i]; ++ if (tp->ident->equals(ident)) ++ return this; + } + return NULL; + } +@@ -6840,8 +6925,18 @@ Expression *TypeIdentifier::toExpression + Expression *e = new IdentifierExp(loc, ident); + for (size_t i = 0; i < idents.dim; i++) + { +- Identifier *id = idents[i]; +- e = new DotIdExp(loc, e, id); ++ RootObject *id = idents[i]; ++ if (id->dyncast() == DYNCAST_IDENTIFIER) ++ { ++ e = new DotIdExp(loc, e, (Identifier *)id); ++ } ++ else ++ { ++ assert(id->dyncast() == DYNCAST_DSYMBOL); ++ TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); ++ assert(ti); ++ e = new DotTemplateInstanceExp(loc, e, ti->name, ti->tiargs); ++ } + } + + return e; +@@ -6882,7 +6977,7 @@ void TypeInstance::toCBuffer2(OutBuffer + toCBuffer2Helper(buf, hgs); + } + +-void TypeInstance::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeInstance::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { + // Note close similarity to TypeIdentifier::resolve() + +@@ -6903,10 +6998,11 @@ void TypeInstance::resolve(Loc loc, Scop + //printf("TypeInstance::resolve(sc = %p, idents = '%s')\n", sc, id->toChars()); + s = tempinst; + if (s) +- { //printf("s = %s\n", s->toChars()); ++ { ++ //printf("s = %s\n", s->toChars()); + s->semantic(sc); + } +- resolveHelper(loc, sc, s, NULL, pe, pt, ps); ++ resolveHelper(loc, sc, s, NULL, pe, pt, ps, intypeid); + if (*pt) + *pt = (*pt)->addMod(mod); + //printf("pt = '%s'\n", (*pt)->toChars()); +@@ -6919,23 +7015,23 @@ Type *TypeInstance::semantic(Loc loc, Sc + Dsymbol *s; + + //printf("TypeInstance::semantic(%p, %s)\n", this, toChars()); +- +- if (sc->parameterSpecialization) + { +- unsigned errors = global.startGagging(); ++ unsigned errors = global.errors; + resolve(loc, sc, &e, &t, &s); +- +- if (global.endGagging(errors)) +- { +- return this; +- } ++ // if we had an error evaluating the symbol, suppress further errors ++ if (!t && errors != global.errors) ++ return terror; + } +- else +- resolve(loc, sc, &e, &t, &s); + + if (!t) + { +- error(loc, "%s is used as a type", toChars()); ++ if (!e && s && s->errors) ++ { // if there was an error evaluating the symbol, it might actually ++ // be a type. Avoid misleading error messages. ++ error(loc, "%s had previous errors", toChars()); ++ } ++ else ++ error(loc, "%s is used as a type", toChars()); + t = terror; + } + return t; +@@ -6948,18 +7044,7 @@ Dsymbol *TypeInstance::toDsymbol(Scope * + Dsymbol *s; + + //printf("TypeInstance::semantic(%s)\n", toChars()); +- +- if (sc->parameterSpecialization) +- { +- unsigned errors = global.startGagging(); +- +- resolve(loc, sc, &e, &t, &s); +- +- if (global.endGagging(errors)) +- return NULL; +- } +- else +- resolve(loc, sc, &e, &t, &s); ++ resolve(loc, sc, &e, &t, &s); + + return s; + } +@@ -6991,6 +7076,28 @@ Type *TypeInstance::reliesOnTident(Templ + } + } + ++Expression *TypeInstance::toExpression() ++{ ++ Expression *e = new ScopeExp(loc, tempinst); ++ for (size_t i = 0; i < idents.dim; i++) ++ { ++ RootObject *id = idents[i]; ++ if (id->dyncast() == DYNCAST_IDENTIFIER) ++ { ++ e = new DotIdExp(loc, e, (Identifier *)id); ++ } ++ else ++ { ++ assert(id->dyncast() == DYNCAST_DSYMBOL); ++ TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); ++ assert(ti); ++ e = new DotTemplateInstanceExp(loc, e, ti->name, ti->tiargs); ++ } ++ } ++ ++ return e; ++} ++ + + /***************************** TypeTypeof *****************************/ + +@@ -7039,83 +7146,36 @@ void TypeTypeof::toCBuffer2(OutBuffer *b + toCBuffer2Helper(buf, hgs); + } + +-Type *TypeTypeof::semantic(Loc loc, Scope *sc) ++void TypeTypeof::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { +- Type *t; +- +- //printf("TypeTypeof::semantic() %s\n", toChars()); ++ *pe = NULL; ++ *pt = NULL; ++ *ps = NULL; + ++ //printf("TypeTypeof::resolve(sc = %p, idents = '%s')\n", sc, toChars()); + //static int nest; if (++nest == 50) *(char*)0=0; + if (inuse) + { + inuse = 2; + error(loc, "circular typeof definition"); +- return Type::terror; ++ goto Lerr; + } + inuse++; + +-#if 0 +- /* Special case for typeof(this) and typeof(super) since both +- * should work even if they are not inside a non-static member function +- */ +- if (exp->op == TOKthis || exp->op == TOKsuper) +- { +- // Find enclosing struct or class +- for (Dsymbol *s = sc->parent; 1; s = s->parent) +- { +- ClassDeclaration *cd; +- StructDeclaration *sd; +- +- if (!s) +- { +- error(loc, "%s is not in a struct or class scope", exp->toChars()); +- goto Lerr; +- } +- cd = s->isClassDeclaration(); +- if (cd) +- { +- if (exp->op == TOKsuper) +- { +- cd = cd->baseClass; +- if (!cd) +- { error(loc, "class %s has no 'super'", s->toChars()); +- goto Lerr; +- } +- } +- t = cd->type; +- break; +- } +- sd = s->isStructDeclaration(); +- if (sd) +- { +- if (exp->op == TOKsuper) +- { +- error(loc, "struct %s has no 'super'", sd->toChars()); +- goto Lerr; +- } +- t = sd->type->pointerTo(); +- break; +- } +- } +- } +- else +-#endif ++ Type *t; + { + Scope *sc2 = sc->push(); +- sc2->intypeof++; ++ sc2->intypeof = 1; + sc2->speculative = true; + sc2->flags |= sc->flags & SCOPEstaticif; + unsigned oldspecgag = global.speculativeGag; + if (global.gag) + global.speculativeGag = global.gag; + exp = exp->semantic(sc2); +- global.speculativeGag = oldspecgag; +- + #if DMDV2 +- if (exp->type && exp->type->ty == Tfunction && +- ((TypeFunction *)exp->type)->isproperty) +- exp = resolveProperties(sc2, exp); ++ exp = resolvePropertiesOnly(sc2, exp); + #endif ++ global.speculativeGag = oldspecgag; + sc2->pop(); + if (exp->op == TOKtype) + { +@@ -7129,47 +7189,75 @@ Type *TypeTypeof::semantic(Loc loc, Scop + goto Lerr; + } + if (t->ty == Ttypeof) +- { error(loc, "forward reference to %s", toChars()); ++ { ++ error(loc, "forward reference to %s", toChars()); + goto Lerr; + } +- +- t = t->addMod(mod); +- +- /* typeof should reflect the true type, +- * not what 'auto' would have gotten us. +- */ +- //t = t->toHeadMutable(); + } +- if (idents.dim) ++ if (idents.dim == 0) ++ *pt = t; ++ else + { +- Dsymbol *s = t->toDsymbol(sc); +- for (size_t i = 0; i < idents.dim; i++) +- { +- if (!s) +- break; +- Identifier *id = idents[i]; +- s = s->searchX(loc, sc, id); +- } +- +- if (s) ++ if (Dsymbol *s = t->toDsymbol(sc)) ++ resolveHelper(loc, sc, s, NULL, pe, pt, ps, intypeid); ++ else + { +- t = s->getType(); +- if (!t) +- { error(loc, "%s is not a type", s->toChars()); +- goto Lerr; ++ Expression *e = new TypeExp(loc, t); ++ for (size_t i = 0; i < idents.dim; i++) ++ { ++ RootObject *id = idents[i]; ++ switch (id->dyncast()) ++ { ++ case DYNCAST_IDENTIFIER: ++ e = new DotIdExp(loc, e, (Identifier *)id); ++ break; ++ case DYNCAST_DSYMBOL: ++ { ++ TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); ++ e = new DotExp(loc, e, new ScopeExp(loc, ti)); ++ break; ++ } ++ default: ++ assert(0); ++ } ++ } ++ e = e->semantic(sc); ++ if ((*ps = getDsymbol(e)) == NULL) ++ { ++ if (e->op == TOKtype) ++ *pt = e->type; ++ else ++ *pe = e; + } +- } +- else +- { error(loc, "cannot resolve .property for %s", toChars()); +- goto Lerr; + } + } ++ if (*pt) ++ (*pt) = (*pt)->addMod(mod); + inuse--; +- return t; ++ return; + + Lerr: ++ *pt = Type::terror; + inuse--; +- return terror; ++ return; ++} ++ ++Type *TypeTypeof::semantic(Loc loc, Scope *sc) ++{ ++ //printf("TypeTypeof::semantic() %s\n", toChars()); ++ ++ Expression *e; ++ Type *t; ++ Dsymbol *s; ++ resolve(loc, sc, &e, &t, &s); ++ if (s && (t = s->getType()) != NULL) ++ t = t->addMod(mod); ++ if (!t) ++ { ++ error(loc, "%s is used as a type", toChars()); ++ t = Type::terror; ++ } ++ return t; + } + + d_uns64 TypeTypeof::size(Loc loc) +@@ -7204,58 +7292,99 @@ Type *TypeReturn::syntaxCopy() + + Dsymbol *TypeReturn::toDsymbol(Scope *sc) + { +- Type *t = semantic(0, sc); ++ Type *t = semantic(Loc(), sc); + if (t == this) +- return NULL; +- return t->toDsymbol(sc); +-} +- +-Type *TypeReturn::semantic(Loc loc, Scope *sc) +-{ +- Type *t; +- FuncDeclaration *func = sc->func; +- if (!func) +- { error(loc, "typeof(return) must be inside function"); +- goto Lerr; +- } +- if (func->fes) +- func = func->fes->func; +- +- t = func->type->nextOf(); +- if (!t) +- { +- error(loc, "cannot use typeof(return) inside function %s with inferred return type", sc->func->toChars()); +- goto Lerr; +- } +- t = t->addMod(mod); ++ return NULL; ++ return t->toDsymbol(sc); ++} ++ ++void TypeReturn::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) ++{ ++ *pe = NULL; ++ *pt = NULL; ++ *ps = NULL; + +- if (idents.dim) ++ //printf("TypeReturn::resolve(sc = %p, idents = '%s')\n", sc, toChars()); ++ Type *t; + { +- Dsymbol *s = t->toDsymbol(sc); +- for (size_t i = 0; i < idents.dim; i++) ++ FuncDeclaration *func = sc->func; ++ if (!func) + { +- if (!s) +- break; +- Identifier *id = idents[i]; +- s = s->searchX(loc, sc, id); ++ error(loc, "typeof(return) must be inside function"); ++ goto Lerr; + } +- if (s) ++ if (func->fes) ++ func = func->fes->func; ++ ++ t = func->type->nextOf(); ++ if (!t) + { +- t = s->getType(); +- if (!t) +- { error(loc, "%s is not a type", s->toChars()); +- goto Lerr; +- } ++ error(loc, "cannot use typeof(return) inside function %s with inferred return type", sc->func->toChars()); ++ goto Lerr; + } ++ } ++ if (idents.dim == 0) ++ *pt = t; ++ else ++ { ++ if (Dsymbol *s = t->toDsymbol(sc)) ++ resolveHelper(loc, sc, s, NULL, pe, pt, ps, intypeid); + else +- { error(loc, "cannot resolve .property for %s", toChars()); +- goto Lerr; ++ { ++ Expression *e = new TypeExp(loc, t); ++ for (size_t i = 0; i < idents.dim; i++) ++ { ++ RootObject *id = idents[i]; ++ switch (id->dyncast()) ++ { ++ case DYNCAST_IDENTIFIER: ++ e = new DotIdExp(loc, e, (Identifier *)id); ++ break; ++ case DYNCAST_DSYMBOL: ++ { ++ TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); ++ e = new DotExp(loc, e, new ScopeExp(loc, ti)); ++ break; ++ } ++ default: ++ assert(0); ++ } ++ } ++ e = e->semantic(sc); ++ if ((*ps = getDsymbol(e)) == NULL) ++ { ++ if (e->op == TOKtype) ++ *pt = e->type; ++ else ++ *pe = e; ++ } + } + } +- return t; ++ if (*pt) ++ (*pt) = (*pt)->addMod(mod); ++ return; + + Lerr: +- return terror; ++ *pt = Type::terror; ++ return; ++} ++ ++Type *TypeReturn::semantic(Loc loc, Scope *sc) ++{ ++ //printf("TypeReturn::semantic() %s\n", toChars()); ++ ++ Expression *e; ++ Type *t; ++ Dsymbol *s; ++ resolve(loc, sc, &e, &t, &s); ++ if (s && (t = s->getType()) != NULL) ++ t = t->addMod(mod); ++ if (!t) ++ { ++ error(loc, "%s is used as a type", toChars()); ++ t = Type::terror; ++ } ++ return t; + } + + void TypeReturn::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod) +@@ -7297,28 +7426,22 @@ Type *TypeEnum::syntaxCopy() + Type *TypeEnum::semantic(Loc loc, Scope *sc) + { + //printf("TypeEnum::semantic() %s\n", toChars()); +- //sym->semantic(sc); ++ if (deco) ++ return this; + return merge(); + } + + d_uns64 TypeEnum::size(Loc loc) + { +- if (!sym->memtype) +- { +- error(loc, "enum %s is forward referenced", sym->toChars()); +- return 4; +- } +- return sym->memtype->size(loc); ++ return sym->getMemtype(loc)->size(loc); + } + + unsigned TypeEnum::alignsize() + { +- if (!sym->memtype) +- { +- error(0, "enum %s is forward referenced", sym->toChars()); ++ Type *t = sym->getMemtype(Loc()); ++ if (t->ty == Terror) + return 4; +- } +- return sym->memtype->alignsize(); ++ return t->alignsize(); + } + + Dsymbol *TypeEnum::toDsymbol(Scope *sc) +@@ -7328,30 +7451,14 @@ Dsymbol *TypeEnum::toDsymbol(Scope *sc) + + Type *TypeEnum::toBasetype() + { +- if (sym->scope) +- { // Enum is forward referenced. We don't need to resolve the whole thing, +- // just the base type +- if (sym->memtype) +- { sym->memtype = sym->memtype->semantic(sym->loc, sym->scope); +- } +- else +- { if (!sym->isAnonymous()) +- sym->memtype = Type::tint32; +- } +- } +- if (!sym->memtype) +- { +- error(sym->loc, "enum %s is forward referenced", sym->toChars()); +- return tint32; +- } +- return sym->memtype->toBasetype(); ++ return sym->getMemtype(Loc())->toBasetype(); + } + + void TypeEnum::toDecoBuffer(OutBuffer *buf, int flag) + { + const char *name = sym->mangle(); + Type::toDecoBuffer(buf, flag); +- buf->printf("%s", name); ++ buf->writestring(name); + } + + void TypeEnum::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod) +@@ -7363,7 +7470,7 @@ void TypeEnum::toCBuffer2(OutBuffer *buf + buf->writestring(sym->toChars()); + } + +-Expression *TypeEnum::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeEnum::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeEnum::dotExp(e = '%s', ident = '%s') '%s'\n", e->toChars(), ident->toChars(), toChars()); +@@ -7378,30 +7485,20 @@ Expression *TypeEnum::dotExp(Scope *sc, + !sym->memtype + ) + { +- return getProperty(e->loc, ident); ++ return getProperty(e->loc, ident, flag); + } +- return sym->memtype->dotExp(sc, e, ident); ++ return sym->getMemtype(Loc())->dotExp(sc, e, ident, flag); + } + EnumMember *m = s->isEnumMember(); +- Expression *em = m->value->copy(); +- em->loc = e->loc; +- return em; ++ return m->getVarExp(e->loc, sc); + } + +-Expression *TypeEnum::getProperty(Loc loc, Identifier *ident) ++Expression *TypeEnum::getProperty(Loc loc, Identifier *ident, int flag) + { Expression *e; + +- if (ident == Id::max) +- { +- if (!sym->maxval) +- goto Lfwd; +- e = sym->maxval; +- } +- else if (ident == Id::min) +- { +- if (!sym->minval) +- goto Lfwd; +- e = sym->minval; ++ if (ident == Id::max || ident == Id::min) ++ { ++ return sym->getMaxMinValue(loc, ident); + } + else if (ident == Id::init) + { +@@ -7415,17 +7512,13 @@ Expression *TypeEnum::getProperty(Loc lo + } + else if (ident == Id::mangleof) + { +- e = Type::getProperty(loc, ident); ++ e = Type::getProperty(loc, ident, flag); + } + else + { +- e = toBasetype()->getProperty(loc, ident); ++ e = toBasetype()->getProperty(loc, ident, flag); + } + return e; +- +-Lfwd: +- error(loc, "forward reference of %s.%s", toChars(), ident->toChars()); +- return new ErrorExp(); + } + + int TypeEnum::isintegral() +@@ -7463,6 +7556,11 @@ int TypeEnum::isscalar() + return sym->memtype->isscalar(); + } + ++int TypeEnum::isString() ++{ ++ return sym->memtype->isString(); ++} ++ + int TypeEnum::isAssignable() + { + return sym->memtype->isAssignable(); +@@ -7513,30 +7611,15 @@ Expression *TypeEnum::defaultInit(Loc lo + printf("TypeEnum::defaultInit() '%s'\n", toChars()); + #endif + // Initialize to first member of enum +- //printf("%s\n", sym->defaultval->type->toChars()); +- if (!sym->defaultval) +- { +- error(loc, "forward reference of %s.init", toChars()); +- return new ErrorExp(); +- } +- Expression *e = sym->defaultval; ++ Expression *e = sym->getDefaultValue(loc); + e = e->copy(); +- e->type = this; ++ e->type = this; // to deal with const, immutable, etc., variants + return e; + } + + int TypeEnum::isZeroInit(Loc loc) + { +- if (!sym->defaultval && sym->scope) +- { // Enum is forward referenced. We need to resolve the whole thing. +- sym->semantic(NULL); +- } +- if (!sym->defaultval) +- { +- error(loc, "enum %s is forward referenced", sym->toChars()); +- return 0; +- } +- return sym->defaultval->isBool(FALSE); ++ return sym->getDefaultValue(loc)->isBool(FALSE); + } + + int TypeEnum::hasPointers() +@@ -7544,6 +7627,17 @@ int TypeEnum::hasPointers() + return toBasetype()->hasPointers(); + } + ++Type *TypeEnum::nextOf() ++{ ++ if (sym->semanticRun == PASSinit) ++ { ++ assert(sym->scope); ++ sym->semantic(sym->scope); ++ } ++ assert(sym->memtype); ++ return sym->memtype->nextOf(); ++} ++ + /***************************** TypeTypedef *****************************/ + + TypeTypedef::TypeTypedef(TypedefDeclaration *sym) +@@ -7572,7 +7666,7 @@ Type *TypeTypedef::semantic(Loc loc, Sco + //printf("TypeTypedef::semantic(%s), sem = %d\n", toChars(), sym->sem); + int errors = global.errors; + sym->semantic(sc); +- if (errors != global.errors) ++ if (errors != global.errors || sym->errors || sym->basetype->ty == Terror) + return terror; + return merge(); + } +@@ -7596,7 +7690,7 @@ void TypeTypedef::toDecoBuffer(OutBuffer + { + Type::toDecoBuffer(buf, flag); + const char *name = sym->mangle(); +- buf->printf("%s", name); ++ buf->writestring(name); + } + + void TypeTypedef::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod) +@@ -7609,16 +7703,16 @@ void TypeTypedef::toCBuffer2(OutBuffer * + buf->writestring(sym->toChars()); + } + +-Expression *TypeTypedef::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeTypedef::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeTypedef::dotExp(e = '%s', ident = '%s') '%s'\n", e->toChars(), ident->toChars(), toChars()); + #endif + if (ident == Id::init) + { +- return Type::dotExp(sc, e, ident); ++ return Type::dotExp(sc, e, ident, flag); + } +- return sym->basetype->dotExp(sc, e, ident); ++ return sym->basetype->dotExp(sc, e, ident, flag); + } + + structalign_t TypeTypedef::alignment() +@@ -7635,16 +7729,16 @@ structalign_t TypeTypedef::alignment() + return a; + } + +-Expression *TypeTypedef::getProperty(Loc loc, Identifier *ident) ++Expression *TypeTypedef::getProperty(Loc loc, Identifier *ident, int flag) + { + #if LOGDOTEXP + printf("TypeTypedef::getProperty(ident = '%s') '%s'\n", ident->toChars(), toChars()); + #endif + if (ident == Id::init) + { +- return Type::getProperty(loc, ident); ++ return Type::getProperty(loc, ident, flag); + } +- return sym->basetype->getProperty(loc, ident); ++ return sym->basetype->getProperty(loc, ident, flag); + } + + int TypeTypedef::isintegral() +@@ -7788,7 +7882,13 @@ Expression *TypeTypedef::defaultInitLite + if (sym->init) + { + //sym->init->toExpression()->print(); +- return sym->init->toExpression(); ++ Expression *e = sym->init->toExpression(); ++ if (!e) ++ { ++ error(loc, "void initializer has no value"); ++ e = new ErrorExp(); ++ } ++ return e; + } + Type *bt = sym->basetype; + Expression *e = bt->defaultInitLiteral(loc); +@@ -7835,6 +7935,7 @@ TypeStruct::TypeStruct(StructDeclaration + : Type(Tstruct) + { + this->sym = sym; ++ this->att = RECfwdref; + } + + const char *TypeStruct::kind() +@@ -7879,7 +7980,7 @@ d_uns64 TypeStruct::size(Loc loc) + + unsigned TypeStruct::alignsize() + { +- sym->size(0); // give error for forward references ++ sym->size(Loc()); // give error for forward references + return sym->alignsize; + } + +@@ -7893,7 +7994,7 @@ void TypeStruct::toDecoBuffer(OutBuffer + const char *name = sym->mangle(); + //printf("TypeStruct::toDecoBuffer('%s') = '%s'\n", toChars(), name); + Type::toDecoBuffer(buf, flag); +- buf->printf("%s", name); ++ buf->writestring(name); + } + + void TypeStruct::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod) +@@ -7909,12 +8010,11 @@ void TypeStruct::toCBuffer2(OutBuffer *b + buf->writestring(sym->toChars()); + } + +-Expression *TypeStruct::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeStruct::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + VarDeclaration *v; + Dsymbol *s; + DotVarExp *de; +- Declaration *d; + + #if LOGDOTEXP + printf("TypeStruct::dotExp(e = '%s', ident = '%s')\n", e->toChars(), ident->toChars()); +@@ -7937,31 +8037,36 @@ Expression *TypeStruct::dotExp(Scope *sc + Expressions *exps = new Expressions; + exps->reserve(sym->fields.dim); + +- Expression *ev = e; ++ Expression *e0 = NULL; ++ Expression *ev = e->op == TOKtype ? NULL : e; ++ if (sc->func && ev && ev->hasSideEffect()) ++ { ++ Identifier *id = Lexer::uniqueId("__tup"); ++ ExpInitializer *ei = new ExpInitializer(e->loc, ev); ++ VarDeclaration *vd = new VarDeclaration(e->loc, NULL, id, ei); ++ vd->storage_class |= STCctfe | STCref | STCforeach; ++ ++ e0 = new DeclarationExp(e->loc, vd); ++ ev = new VarExp(e->loc, vd); ++ } + for (size_t i = 0; i < sym->fields.dim; i++) +- { VarDeclaration *v = sym->fields[i]; +- Expression *fe; +- if (i == 0 && sc->func && sym->fields.dim > 1 && +- e->hasSideEffect()) +- { +- Identifier *id = Lexer::uniqueId("__tup"); +- ExpInitializer *ei = new ExpInitializer(e->loc, e); +- VarDeclaration *vd = new VarDeclaration(e->loc, NULL, id, ei); +- vd->storage_class |= STCctfe | STCref | STCforeach; +- +- ev = new VarExp(e->loc, vd); +- fe = new CommaExp(e->loc, new DeclarationExp(e->loc, vd), ev); +- fe = new DotVarExp(e->loc, fe, v); +- } ++ { ++ VarDeclaration *v = sym->fields[i]; ++ Expression *ex; ++ if (ev) ++ ex = new DotVarExp(e->loc, ev, v); + else +- fe = new DotVarExp(ev->loc, ev, v); +- exps->push(fe); ++ { ++ ex = new VarExp(e->loc, v); ++ ex->type = ex->type->addMod(e->type->mod); ++ } ++ exps->push(ex); + } +- e = new TupleExp(e->loc, exps); +- sc = sc->push(); +- sc->noaccesscheck = 1; +- e = e->semantic(sc); +- sc->pop(); ++ e = new TupleExp(e->loc, e0, exps); ++ Scope *sc2 = sc->push(); ++ sc2->flags = sc->flags | SCOPEnoaccesscheck; ++ e = e->semantic(sc2); ++ sc2->pop(); + return e; + } + +@@ -7988,25 +8093,24 @@ L1: + { + sym->semantic(NULL); + s = sym->search(e->loc, ident, 0); +- if (!s) +- return noMember(sc, e, ident); + } +- else +- return noMember(sc, e, ident); ++ if (!s) ++ return noMember(sc, e, ident, flag); + } + if (!s->isFuncDeclaration()) // because of overloading + s->checkDeprecated(e->loc, sc); + s = s->toAlias(); + + v = s->isVarDeclaration(); +- if (v && !v->isDataseg()) ++ if (v && v->inuse && (!v->type || !v->type->deco)) // Bugzilla 9494 ++ { e->error("circular reference to '%s'", v->toPrettyChars()); ++ return new ErrorExp(); ++ } ++ if (v && !v->isDataseg() && (v->storage_class & STCmanifest)) + { +- Expression *ei = v->getConstInitializer(); +- if (ei) +- { e = ei->copy(); // need to copy it if it's a StringExp +- e = e->semantic(sc); +- return e; +- } ++ Expression *ve = new VarExp(e->loc, v); ++ ve = ve->semantic(sc); ++ return ve; + } + + if (s->getType()) +@@ -8017,8 +8121,7 @@ L1: + EnumMember *em = s->isEnumMember(); + if (em) + { +- assert(em->value); +- return em->value->copy(); ++ return em->getVarExp(e->loc, sc); + } + + TemplateMixin *tm = s->isTemplateMixin(); +@@ -8032,7 +8135,10 @@ L1: + TemplateDeclaration *td = s->isTemplateDeclaration(); + if (td) + { +- e = new DotTemplateExp(e->loc, e, td); ++ if (e->op == TOKtype) ++ e = new ScopeExp(e->loc, td); ++ else ++ e = new DotTemplateExp(e->loc, e, td); + e = e->semantic(sc); + return e; + } +@@ -8063,13 +8169,13 @@ L1: + OverloadSet *o = s->isOverloadSet(); + if (o) + { +- OverExp *oe = new OverExp(o); ++ OverExp *oe = new OverExp(e->loc, o); + if (e->op == TOKtype) + return oe; + return new DotExp(e->loc, e, oe); + } + +- d = s->isDeclaration(); ++ Declaration *d = s->isDeclaration(); + #ifdef DEBUG + if (!d) + printf("d = %s '%s'\n", s->kind(), s->toChars()); +@@ -8077,19 +8183,27 @@ L1: + assert(d); + + if (e->op == TOKtype) +- { FuncDeclaration *fd = sc->func; +- +- if (d->isTupleDeclaration()) ++ { ++ /* It's: ++ * Struct.d ++ */ ++ if (TupleDeclaration *tup = d->isTupleDeclaration()) + { +- e = new TupleExp(e->loc, d->isTupleDeclaration()); ++ e = new TupleExp(e->loc, tup); + e = e->semantic(sc); + return e; + } +- else if (d->needThis() && fd && fd->vthis) ++ if (d->needThis() && sc->intypeof != 1) + { +- e = new DotVarExp(e->loc, new ThisExp(e->loc), d); +- e = e->semantic(sc); +- return e; ++ /* Rewrite as: ++ * this.d ++ */ ++ if (hasThis(sc)) ++ { ++ e = new DotVarExp(e->loc, new ThisExp(e->loc), d); ++ e = e->semantic(sc); ++ return e; ++ } + } + accessCheck(e->loc, sc, e, d); + VarExp *ve = new VarExp(e->loc, d, 1); +@@ -8098,14 +8212,13 @@ L1: + return ve; + } + +- if (d->isDataseg()) ++ bool unreal = e->op == TOKvar && ((VarExp *)e)->var->isField(); ++ if (d->isDataseg() || unreal && d->isField()) + { + // (e, d) +- VarExp *ve; +- + accessCheck(e->loc, sc, e, d); +- ve = new VarExp(e->loc, d); +- e = new CommaExp(e->loc, e, ve); ++ Expression *ve = new VarExp(e->loc, d); ++ e = unreal ? ve : new CommaExp(e->loc, e, ve); + e = e->semantic(sc); + return e; + } +@@ -8135,7 +8248,7 @@ L1: + structalign_t TypeStruct::alignment() + { + if (sym->alignment == 0) +- sym->size(0); ++ sym->size(Loc()); + return sym->alignment; + } + +@@ -8144,8 +8257,7 @@ Expression *TypeStruct::defaultInit(Loc + #if LOGDEFAULTINIT + printf("TypeStruct::defaultInit() '%s'\n", toChars()); + #endif +- Symbol *s = sym->toInitializer(); +- Declaration *d = new SymbolDeclaration(sym->loc, s, sym); ++ Declaration *d = new SymbolDeclaration(sym->loc, sym); + assert(d); + d->type = this; + return new VarExp(sym->loc, d); +@@ -8163,25 +8275,27 @@ Expression *TypeStruct::defaultInitLiter + //if (sym->isNested()) + // return defaultInit(loc); + Expressions *structelems = new Expressions(); +- structelems->setDim(sym->fields.dim - sym->isnested); ++ structelems->setDim(sym->fields.dim - sym->isNested()); ++ unsigned offset = 0; + for (size_t j = 0; j < structelems->dim; j++) + { + VarDeclaration *vd = sym->fields[j]; +- Type *telem = vd->type->addMod(this->mod); + Expression *e; +- if (vd->init) +- { if (vd->init->isVoidInitializer()) ++ if (vd->offset < offset) ++ e = NULL; ++ else if (vd->init) ++ { ++ if (vd->init->isVoidInitializer()) + e = NULL; + else +- e = vd->init->toExpression(); ++ e = vd->getConstInitializer(false); + } + else + e = vd->type->defaultInitLiteral(loc); +- if (e && vd->scope) +- { +- e = e->semantic(vd->scope); +- e = e->implicitCastTo(vd->scope, telem); +- } ++ if (e && e->op == TOKerror) ++ return e; ++ if (e) ++ offset = vd->offset + vd->type->size(); + (*structelems)[j] = e; + } + StructLiteralExp *structinit = new StructLiteralExp(loc, (StructDeclaration *)sym, structelems); +@@ -8214,7 +8328,7 @@ int TypeStruct::needsDestruction() + + bool TypeStruct::needsNested() + { +- if (sym->isnested) ++ if (sym->isNested()) + return true; + + for (size_t i = 0; i < sym->fields.dim; i++) +@@ -8267,7 +8381,7 @@ int TypeStruct::hasPointers() + // Probably should cache this information in sym rather than recompute + StructDeclaration *s = sym; + +- sym->size(0); // give error for forward references ++ sym->size(Loc()); // give error for forward references + for (size_t i = 0; i < s->fields.dim; i++) + { + Dsymbol *sm = s->fields[i]; +@@ -8296,26 +8410,40 @@ MATCH TypeStruct::implicitConvTo(Type *t + } + + if (ty == to->ty && sym == ((TypeStruct *)to)->sym) +- { m = MATCHexact; // exact match ++ { ++ m = MATCHexact; // exact match + if (mod != to->mod) + { + m = MATCHconst; + if (MODimplicitConv(mod, to->mod)) + ; + else +- { /* Check all the fields. If they can all be converted, ++ { ++ /* Check all the fields. If they can all be converted, + * allow the conversion. + */ ++ unsigned offset; + for (size_t i = 0; i < sym->fields.dim; i++) +- { Dsymbol *s = sym->fields[i]; +- VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ { ++ VarDeclaration *v = sym->fields[i]; ++ if (i == 0) ++ ; ++ else if (v->offset == offset) ++ { ++ if (m) ++ continue; ++ } ++ else ++ { ++ if (!m) ++ return m; ++ } + + // 'from' type + Type *tvf = v->type->addMod(mod); + + // 'to' type +- Type *tv = v->type->castMod(to->mod); ++ Type *tv = v->type->addMod(to->mod); + + // field match + MATCH mf = tvf->implicitConvTo(tv); +@@ -8325,12 +8453,17 @@ MATCH TypeStruct::implicitConvTo(Type *t + return mf; + if (mf < m) // if field match is worse + m = mf; ++ offset = v->offset; + } + } + } + } +- else if (sym->aliasthis) ++ else if (sym->aliasthis && !(att & RECtracing)) ++ { ++ att = (AliasThisRec)(att | RECtracing); + m = aliasthisOf()->implicitConvTo(to); ++ att = (AliasThisRec)(att & ~RECtracing); ++ } + else + m = MATCHnomatch; // no match + return m; +@@ -8351,13 +8484,16 @@ unsigned TypeStruct::wildConvTo(Type *tp + if (ty == tprm->ty && sym == ((TypeStruct *)tprm)->sym) + return Type::wildConvTo(tprm); + +- if (sym->aliasthis) +- { Type *t = aliasthisOf(); +- assert(t); +- return t->wildConvTo(tprm); ++ unsigned mod = 0; ++ ++ if (sym->aliasthis && !(att & RECtracing)) ++ { ++ att = (AliasThisRec)(att | RECtracing); ++ mod = aliasthisOf()->wildConvTo(tprm); ++ att = (AliasThisRec)(att & ~RECtracing); + } + +- return 0; ++ return mod; + } + + Type *TypeStruct::toHeadMutable() +@@ -8372,6 +8508,7 @@ TypeClass::TypeClass(ClassDeclaration *s + : Type(Tclass) + { + this->sym = sym; ++ this->att = RECfwdref; + } + + const char *TypeClass::kind() +@@ -8415,7 +8552,7 @@ void TypeClass::toDecoBuffer(OutBuffer * + const char *name = sym->mangle(); + //printf("TypeClass::toDecoBuffer('%s' flag=%d mod=%x) = '%s'\n", toChars(), flag, mod, name); + Type::toDecoBuffer(buf, flag); +- buf->printf("%s", name); ++ buf->writestring(name); + } + + void TypeClass::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod) +@@ -8427,7 +8564,7 @@ void TypeClass::toCBuffer2(OutBuffer *bu + buf->writestring(sym->toChars()); + } + +-Expression *TypeClass::dotExp(Scope *sc, Expression *e, Identifier *ident) ++Expression *TypeClass::dotExp(Scope *sc, Expression *e, Identifier *ident, int flag) + { + VarDeclaration *v; + Dsymbol *s; +@@ -8469,34 +8606,39 @@ Expression *TypeClass::dotExp(Scope *sc, + Expressions *exps = new Expressions; + exps->reserve(sym->fields.dim); + +- Expression *ev = e; ++ Expression *e0 = NULL; ++ Expression *ev = e->op == TOKtype ? NULL : e; ++ if (sc->func && ev && ev->hasSideEffect()) ++ { ++ Identifier *id = Lexer::uniqueId("__tup"); ++ ExpInitializer *ei = new ExpInitializer(e->loc, ev); ++ VarDeclaration *vd = new VarDeclaration(e->loc, NULL, id, ei); ++ vd->storage_class |= STCctfe | STCref | STCforeach; ++ ++ e0 = new DeclarationExp(e->loc, vd); ++ ev = new VarExp(e->loc, vd); ++ } + for (size_t i = 0; i < sym->fields.dim; i++) +- { VarDeclaration *v = sym->fields[i]; ++ { ++ VarDeclaration *v = sym->fields[i]; + // Don't include hidden 'this' pointer + if (v->isThisDeclaration()) + continue; +- Expression *fe; +- if (i == 0 && sc->func && sym->fields.dim > 1 && +- e->hasSideEffect()) +- { +- Identifier *id = Lexer::uniqueId("__tup"); +- ExpInitializer *ei = new ExpInitializer(e->loc, e); +- VarDeclaration *vd = new VarDeclaration(e->loc, NULL, id, ei); +- vd->storage_class |= STCctfe | STCref | STCforeach; +- +- ev = new VarExp(e->loc, vd); +- fe = new CommaExp(e->loc, new DeclarationExp(e->loc, vd), ev); +- fe = new DotVarExp(e->loc, fe, v); +- } ++ Expression *ex; ++ if (ev) ++ ex = new DotVarExp(e->loc, ev, v); + else +- fe = new DotVarExp(e->loc, ev, v); +- exps->push(fe); ++ { ++ ex = new VarExp(e->loc, v); ++ ex->type = ex->type->addMod(e->type->mod); ++ } ++ exps->push(ex); + } +- e = new TupleExp(e->loc, exps); +- sc = sc->push(); +- sc->noaccesscheck = 1; +- e = e->semantic(sc); +- sc->pop(); ++ e = new TupleExp(e->loc, e0, exps); ++ Scope *sc2 = sc->push(); ++ sc2->flags = sc->flags | SCOPEnoaccesscheck; ++ e = e->semantic(sc2); ++ sc2->pop(); + return e; + } + +@@ -8505,34 +8647,27 @@ L1: + if (!s) + { + // See if it's 'this' class or a base class +- if (e->op != TOKtype) ++ if (sym->ident == ident) + { +- if (sym->ident == ident) +- { +- e = new DotTypeExp(0, e, sym); +- return e; +- } +- +- ClassDeclaration *cbase = sym->searchBase(e->loc, ident); +- if (cbase) +- { +- if (InterfaceDeclaration *ifbase = cbase->isInterfaceDeclaration()) +- { +- e = new CastExp(0, e, ifbase->type); +- return e; +- } +- else +- { +- e = new DotTypeExp(0, e, cbase); +- return e; +- } +- } ++ if (e->op == TOKtype) ++ return Type::getProperty(e->loc, ident, 0); ++ return new DotTypeExp(e->loc, e, sym); ++ } ++ if (ClassDeclaration *cbase = sym->searchBase(e->loc, ident)) ++ { ++ if (e->op == TOKtype) ++ return Type::getProperty(e->loc, ident, 0); ++ if (InterfaceDeclaration *ifbase = cbase->isInterfaceDeclaration()) ++ e = new CastExp(e->loc, e, ifbase->type); ++ else ++ e = new DotTypeExp(e->loc, e, cbase); ++ return e; + } + + if (ident == Id::classinfo) + { +- assert(ClassDeclaration::classinfo); +- Type *t = ClassDeclaration::classinfo->type; ++ assert(Type::typeinfoclass); ++ Type *t = Type::typeinfoclass->type; + if (e->op == TOKtype || e->op == TOKdottype) + { + /* For type.classinfo, we know the classinfo +@@ -8578,7 +8713,7 @@ L1: + { /* The pointer to the vtbl[] + * *cast(invariant(void*)**)e + */ +- e = e->castTo(sc, tvoidptr->invariantOf()->pointerTo()->pointerTo()); ++ e = e->castTo(sc, tvoidptr->immutableOf()->pointerTo()->pointerTo()); + e = new PtrExp(e->loc, e); + e = e->semantic(sc); + return e; +@@ -8606,21 +8741,23 @@ L1: + } + else + { +- return noMember(sc, e, ident); ++ return noMember(sc, e, ident, flag); + } + } + if (!s->isFuncDeclaration()) // because of overloading + s->checkDeprecated(e->loc, sc); + s = s->toAlias(); +- v = s->isVarDeclaration(); +- if (v && !v->isDataseg()) +- { Expression *ei = v->getConstInitializer(); + +- if (ei) +- { e = ei->copy(); // need to copy it if it's a StringExp +- e = e->semantic(sc); +- return e; +- } ++ v = s->isVarDeclaration(); ++ if (v && v->inuse && (!v->type || !v->type->deco)) // Bugzilla 9494 ++ { e->error("circular reference to '%s'", v->toPrettyChars()); ++ return new ErrorExp(); ++ } ++ if (v && !v->isDataseg() && (v->storage_class & STCmanifest)) ++ { ++ Expression *ve = new VarExp(e->loc, v); ++ ve = ve->semantic(sc); ++ return ve; + } + + if (s->getType()) +@@ -8631,8 +8768,7 @@ L1: + EnumMember *em = s->isEnumMember(); + if (em) + { +- assert(em->value); +- return em->value->copy(); ++ return em->getVarExp(e->loc, sc); + } + + TemplateMixin *tm = s->isTemplateMixin(); +@@ -8646,7 +8782,10 @@ L1: + TemplateDeclaration *td = s->isTemplateDeclaration(); + if (td) + { +- e = new DotTemplateExp(e->loc, e, td); ++ if (e->op == TOKtype) ++ e = new ScopeExp(e->loc, td); ++ else ++ e = new DotTemplateExp(e->loc, e, td); + e = e->semantic(sc); + return e; + } +@@ -8677,7 +8816,7 @@ L1: + OverloadSet *o = s->isOverloadSet(); + if (o) + { +- OverExp *oe = new OverExp(o); ++ OverExp *oe = new OverExp(e->loc, o); + if (e->op == TOKtype) + return oe; + return new DotExp(e->loc, e, oe); +@@ -8695,30 +8834,27 @@ L1: + /* It's: + * Class.d + */ +- if (d->isTupleDeclaration()) +- { +- e = new TupleExp(e->loc, d->isTupleDeclaration()); +- e = e->semantic(sc); +- return e; +- } + +- #if 1 // Workaround for Bugzilla 9213 +- FuncDeclaration *fd = sc->func; +- if (d->needThis() && d->isVarDeclaration() && fd && fd->vthis) ++ // If Class is in a failed template, return an error ++ TemplateInstance *tiparent = d->inTemplateInstance(); ++ if (tiparent && tiparent->errors) ++ return new ErrorExp(); ++ ++ if (TupleDeclaration *tup = d->isTupleDeclaration()) + { +- e = new DotVarExp(e->loc, new ThisExp(e->loc), d); ++ e = new TupleExp(e->loc, tup); + e = e->semantic(sc); + return e; + } +- #endif +- +- FuncDeclaration *fdthis = hasThis(sc); +- if (d->needThis() && fdthis) ++ if (d->needThis() && sc->intypeof != 1) + { +- if (d->isFuncDeclaration()) ++ /* Rewrite as: ++ * this.d ++ */ ++ if (hasThis(sc)) + { + // This is almost same as getRightThis() in expression.c +- Expression *e1 = new VarExp(e->loc, fdthis->vthis); ++ Expression *e1 = new ThisExp(e->loc); + e1 = e1->semantic(sc); + L2: + Type *t = e1->type->toBasetype(); +@@ -8773,16 +8909,8 @@ L1: + goto L2; + } + } +- else +- { +- /* Rewrite as: +- * this.d +- */ +- DotVarExp *de = new DotVarExp(e->loc, new ThisExp(e->loc), d); +- e = de->semantic(sc); +- return e; +- } + } ++ //printf("e = %s, d = %s\n", e->toChars(), d->toChars()); + accessCheck(e->loc, sc, e, d); + VarExp *ve = new VarExp(e->loc, d, 1); + if (d->isVarDeclaration() && d->needThis()) +@@ -8790,14 +8918,13 @@ L1: + return ve; + } + +- if (d->isDataseg()) ++ bool unreal = e->op == TOKvar && ((VarExp *)e)->var->isField(); ++ if (d->isDataseg() || unreal && d->isField()) + { + // (e, d) +- VarExp *ve; +- + accessCheck(e->loc, sc, e, d); +- ve = new VarExp(e->loc, d); +- e = new CommaExp(e->loc, e, ve); ++ Expression *ve = new VarExp(e->loc, d); ++ e = unreal ? ve : new CommaExp(e->loc, e, ve); + e = e->semantic(sc); + return e; + } +@@ -8849,22 +8976,21 @@ MATCH TypeClass::implicitConvTo(Type *to + { + if (cdto->scope) + cdto->semantic(NULL); ++ if (sym->scope) ++ sym->semantic(NULL); + if (cdto->isBaseOf(sym, NULL) && MODimplicitConv(mod, to->mod)) + { //printf("'to' is base\n"); + return MATCHconvert; + } + } + +- if (global.params.Dversion == 1) +- { +- // Allow conversion to (void *) +- if (to->ty == Tpointer && ((TypePointer *)to)->next->ty == Tvoid) +- return MATCHconvert; +- } +- + m = MATCHnomatch; +- if (sym->aliasthis) ++ if (sym->aliasthis && !(att & RECtracing)) ++ { ++ att = (AliasThisRec)(att | RECtracing); + m = aliasthisOf()->implicitConvTo(to); ++ att = (AliasThisRec)(att & ~RECtracing); ++ } + + return m; + } +@@ -8880,7 +9006,7 @@ MATCH TypeClass::constConv(Type *to) + /* Conversion derived to const(base) + */ + int offset = 0; +- if (to->isBaseOf(this, &offset) && offset == 0 && !to->isMutable()) ++ if (to->isBaseOf(this, &offset) && offset == 0 && !to->isMutable() && !to->isWild()) + return MATCHconvert; + + return MATCHnomatch; +@@ -8897,10 +9023,16 @@ unsigned TypeClass::wildConvTo(Type *tpr + if (cdprm && cdprm->isBaseOf(sym, NULL)) + return Type::wildConvTo(tprm); + +- if (sym->aliasthis) +- return aliasthisOf()->wildConvTo(tprm); ++ unsigned mod = 0; + +- return 0; ++ if (sym->aliasthis && !(att & RECtracing)) ++ { ++ att = (AliasThisRec)(att | RECtracing); ++ mod = aliasthisOf()->wildConvTo(tprm); ++ att = (AliasThisRec)(att & ~RECtracing); ++ } ++ ++ return mod; + } + + Type *TypeClass::toHeadMutable() +@@ -9025,31 +9157,28 @@ Type *TypeTuple::semantic(Loc loc, Scope + return this; + } + +-int TypeTuple::equals(Object *o) +-{ Type *t; +- +- t = (Type *)o; ++bool TypeTuple::equals(RootObject *o) ++{ ++ Type *t = (Type *)o; + //printf("TypeTuple::equals(%s, %s)\n", toChars(), t->toChars()); + if (this == t) +- { +- return 1; +- } ++ return true; + if (t->ty == Ttuple) +- { TypeTuple *tt = (TypeTuple *)t; +- ++ { ++ TypeTuple *tt = (TypeTuple *)t; + if (arguments->dim == tt->arguments->dim) + { + for (size_t i = 0; i < tt->arguments->dim; i++) +- { Parameter *arg1 = (*arguments)[i]; ++ { ++ Parameter *arg1 = (*arguments)[i]; + Parameter *arg2 = (*tt->arguments)[i]; +- + if (!arg1->type->equals(arg2->type)) +- return 0; ++ return false; + } +- return 1; ++ return true; + } + } +- return 0; ++ return false; + } + + Type *TypeTuple::reliesOnTident(TemplateParameters *tparams) +@@ -9095,12 +9224,13 @@ void TypeTuple::toDecoBuffer(OutBuffer * + //printf("TypeTuple::toDecoBuffer() this = %p, %s\n", this, toChars()); + Type::toDecoBuffer(buf, flag); + OutBuffer buf2; ++ buf2.reserve(32); + Parameter::argsToDecoBuffer(&buf2, arguments); + int len = (int)buf2.offset; + buf->printf("%d%.*s", len, len, (char *)buf2.extractData()); + } + +-Expression *TypeTuple::getProperty(Loc loc, Identifier *ident) ++Expression *TypeTuple::getProperty(Loc loc, Identifier *ident, int flag) + { Expression *e; + + #if LOGDOTEXP +@@ -9114,6 +9244,10 @@ Expression *TypeTuple::getProperty(Loc l + { + e = defaultInitLiteral(loc); + } ++ else if (flag) ++ { ++ e = NULL; ++ } + else + { + error(loc, "no property '%s' for tuple '%s'", ident->toChars(), toChars()); +@@ -9200,17 +9334,19 @@ Type *TypeSlice::semantic(Loc loc, Scope + return t; + } + +-void TypeSlice::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps) ++void TypeSlice::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid) + { +- next->resolve(loc, sc, pe, pt, ps); ++ next->resolve(loc, sc, pe, pt, ps, intypeid); + if (*pe) +- { // It's really a slice expression +- Expression *e; +- e = new SliceExp(loc, *pe, lwr, upr); +- *pe = e; ++ { ++ // It's really a slice expression ++ if (Dsymbol *s = getDsymbol(*pe)) ++ *pe = new DsymbolExp(loc, s, 1); ++ *pe = new SliceExp(loc, *pe, lwr, upr); + } + else if (*ps) +- { Dsymbol *s = *ps; ++ { ++ Dsymbol *s = *ps; + TupleDeclaration *td = s->isTupleDeclaration(); + if (td) + { +@@ -9219,19 +9355,20 @@ void TypeSlice::resolve(Loc loc, Scope * + ScopeDsymbol *sym = new ArrayScopeSymbol(sc, td); + sym->parent = sc->scopesym; + sc = sc->push(sym); +- ++ sc = sc->startCTFE(); + lwr = lwr->semantic(sc); +- lwr = lwr->ctfeInterpret(); +- uinteger_t i1 = lwr->toUInteger(); +- + upr = upr->semantic(sc); ++ sc = sc->endCTFE(); ++ sc = sc->pop(); ++ ++ lwr = lwr->ctfeInterpret(); + upr = upr->ctfeInterpret(); ++ uinteger_t i1 = lwr->toUInteger(); + uinteger_t i2 = upr->toUInteger(); + +- sc = sc->pop(); +- + if (!(i1 <= i2 && i2 <= td->objects->dim)) +- { error(loc, "slice [%llu..%llu] is out of range of [0..%u]", i1, i2, td->objects->dim); ++ { ++ error(loc, "slice [%llu..%llu] is out of range of [0..%u]", i1, i2, td->objects->dim); + goto Ldefault; + } + +@@ -9260,7 +9397,7 @@ void TypeSlice::resolve(Loc loc, Scope * + else + { + Ldefault: +- Type::resolve(loc, sc, pe, pt, ps); ++ Type::resolve(loc, sc, pe, pt, ps, intypeid); + } + } + +@@ -9272,8 +9409,11 @@ void TypeSlice::toCBuffer2(OutBuffer *bu + } + next->toCBuffer2(buf, hgs, this->mod); + +- buf->printf("[%s .. ", lwr->toChars()); +- buf->printf("%s]", upr->toChars()); ++ buf->writeByte('['); ++ sizeToCBuffer(buf, hgs, lwr); ++ buf->writestring(" .. "); ++ sizeToCBuffer(buf, hgs, upr); ++ buf->writeByte(']'); + } + + /***************************** TypeNull *****************************/ +@@ -9333,10 +9473,7 @@ void TypeNull::toCBuffer(OutBuffer *buf, + } + + d_uns64 TypeNull::size(Loc loc) { return tvoidptr->size(loc); } +-//Expression *TypeNull::getProperty(Loc loc, Identifier *ident) { return new ErrorExp(); } +-//Expression *TypeNull::dotExp(Scope *sc, Expression *e, Identifier *ident) { return new ErrorExp(); } +-Expression *TypeNull::defaultInit(Loc loc) { return new NullExp(0, Type::tnull); } +-//Expression *TypeNull::defaultInitLiteral(Loc loc) { return new ErrorExp(); } ++Expression *TypeNull::defaultInit(Loc loc) { return new NullExp(Loc(), Type::tnull); } + + /***************************** Parameter *****************************/ + +@@ -9376,12 +9513,14 @@ Parameters *Parameter::arraySyntaxCopy(P + + char *Parameter::argsTypesToChars(Parameters *args, int varargs) + { +- OutBuffer *buf = new OutBuffer(); ++ OutBuffer buf; ++ buf.reserve(16); + + HdrGenState hgs; +- argsToCBuffer(buf, &hgs, args, varargs); ++ argsToCBuffer(&buf, &hgs, args, varargs); + +- return buf->toChars(); ++ buf.writebyte(0); ++ return buf.extractData(); + } + + void Parameter::argsToCBuffer(OutBuffer *buf, HdrGenState *hgs, Parameters *arguments, int varargs) +@@ -9390,6 +9529,7 @@ void Parameter::argsToCBuffer(OutBuffer + if (arguments) + { + OutBuffer argbuf; ++ argbuf.reserve(32); + + size_t dim = Parameter::dim(arguments); + for (size_t i = 0; i < dim; i++) +@@ -9404,8 +9544,7 @@ void Parameter::argsToCBuffer(OutBuffer + if (arg->storageClass & STCout) + buf->writestring("out "); + else if (arg->storageClass & STCref) +- buf->writestring((global.params.Dversion == 1) +- ? "inout " : "ref "); ++ buf->writestring("ref "); + else if (arg->storageClass & STCin) + buf->writestring("in "); + else if (arg->storageClass & STClazy) +--- a/src/gcc/d/dfrontend/mtype.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/mtype.h 2014-04-01 16:32:51.000000000 +0100 +@@ -22,34 +22,33 @@ + #include "expression.h" + + struct Scope; +-struct Identifier; +-struct Expression; +-struct StructDeclaration; +-struct ClassDeclaration; +-struct VarDeclaration; +-struct EnumDeclaration; +-struct TypedefDeclaration; +-struct TypeInfoDeclaration; +-struct Dsymbol; +-struct TemplateInstance; ++class Identifier; ++class Expression; ++class StructDeclaration; ++class ClassDeclaration; ++class VarDeclaration; ++class EnumDeclaration; ++class TypedefDeclaration; ++class TypeInfoDeclaration; ++class Dsymbol; ++class TemplateInstance; + struct CppMangleState; +-struct TemplateDeclaration; ++class TemplateDeclaration; + struct JsonOut; + enum LINK; + +-struct TypeBasic; ++class TypeBasic; + struct HdrGenState; +-struct Parameter; ++class Parameter; + + // Back end + #ifdef IN_GCC +-typedef union tree_node TYPE; +-typedef TYPE type; ++typedef union tree_node type; + #else + typedef struct TYPE type; + #endif + struct Symbol; +-struct TypeTuple; ++class TypeTuple; + + enum ENUMTY + { +@@ -112,20 +111,22 @@ extern int Tsize_t; + extern int Tptrdiff_t; + + +-struct Type : Object ++/* pick this order of numbers so switch statements work better ++ */ ++#define MODconst 1 // type is const ++#define MODimmutable 4 // type is immutable ++#define MODshared 2 // type is shared ++#define MODwild 8 // type is wild ++#define MODmutable 0x10 // type is mutable (only used in wildcard matching) ++ ++class Type : public RootObject + { ++public: + TY ty; + unsigned char mod; // modifiers MODxxxx +- /* pick this order of numbers so switch statements work better +- */ +- #define MODconst 1 // type is const +- #define MODimmutable 4 // type is immutable +- #define MODshared 2 // type is shared +- #define MODwild 8 // type is wild +- #define MODmutable 0x10 // type is mutable (only used in wildcard matching) + char *deco; + +- /* These are cached values that are lazily evaluated by constOf(), invariantOf(), etc. ++ /* These are cached values that are lazily evaluated by constOf(), immutableOf(), etc. + * They should not be referenced by anybody but mtype.c. + * They can be NULL if not lazily evaluated yet. + * Note that there is no "shared immutable", because that is just immutable +@@ -146,51 +147,49 @@ struct Type : Object + + type *ctype; // for back end + +- #define tvoid basic[Tvoid] +- #define tint8 basic[Tint8] +- #define tuns8 basic[Tuns8] +- #define tint16 basic[Tint16] +- #define tuns16 basic[Tuns16] +- #define tint32 basic[Tint32] +- #define tuns32 basic[Tuns32] +- #define tint64 basic[Tint64] +- #define tuns64 basic[Tuns64] +- #define tint128 basic[Tint128] +- #define tuns128 basic[Tuns128] +- #define tfloat32 basic[Tfloat32] +- #define tfloat64 basic[Tfloat64] +- #define tfloat80 basic[Tfloat80] +- +- #define timaginary32 basic[Timaginary32] +- #define timaginary64 basic[Timaginary64] +- #define timaginary80 basic[Timaginary80] +- +- #define tcomplex32 basic[Tcomplex32] +- #define tcomplex64 basic[Tcomplex64] +- #define tcomplex80 basic[Tcomplex80] +- +- #define tbool basic[Tbool] +- #define tchar basic[Tchar] +- #define twchar basic[Twchar] +- #define tdchar basic[Tdchar] ++ static Type *tvoid; ++ static Type *tint8; ++ static Type *tuns8; ++ static Type *tint16; ++ static Type *tuns16; ++ static Type *tint32; ++ static Type *tuns32; ++ static Type *tint64; ++ static Type *tuns64; ++ static Type *tint128; ++ static Type *tuns128; ++ static Type *tfloat32; ++ static Type *tfloat64; ++ static Type *tfloat80; ++ ++ static Type *timaginary32; ++ static Type *timaginary64; ++ static Type *timaginary80; ++ ++ static Type *tcomplex32; ++ static Type *tcomplex64; ++ static Type *tcomplex80; ++ ++ static Type *tbool; ++ static Type *tchar; ++ static Type *twchar; ++ static Type *tdchar; + + // Some special types +- #define tshiftcnt tint32 // right side of shift expression +-// #define tboolean tint32 // result of boolean expression +- #define tboolean tbool // result of boolean expression +- #define tindex tsize_t // array/ptr index ++ static Type *tshiftcnt; ++ static Type *tboolean; + static Type *tvoidptr; // void* + static Type *tstring; // immutable(char)[] + static Type *tvalist; // va_list alias +- #define terror basic[Terror] // for error recovery +- +- #define tnull basic[Tnull] // for null type ++ static Type *terror; // for error recovery ++ static Type *tnull; // for null type + +- #define tsize_t basic[Tsize_t] // matches size_t alias +- #define tptrdiff_t basic[Tptrdiff_t] // matches ptrdiff_t alias +- #define thash_t tsize_t // matches hash_t alias ++ static Type *tsize_t; // matches size_t alias ++ static Type *tptrdiff_t; // matches ptrdiff_t alias ++ static Type *thash_t; // matches hash_t alias ++ static Type *tindex; // array/ptr index + +- static ClassDeclaration *typeinfo; ++ static ClassDeclaration *dtypeinfo; + static ClassDeclaration *typeinfoclass; + static ClassDeclaration *typeinfointerface; + static ClassDeclaration *typeinfostruct; +@@ -228,13 +227,16 @@ struct Type : Object + + Type(TY ty); + virtual const char *kind(); ++ Type *copy(); + virtual Type *syntaxCopy(); +- int equals(Object *o); ++ bool equals(RootObject *o); + int dyncast() { return DYNCAST_TYPE; } // kludge for template.isType() + int covariant(Type *t, StorageClass *pstc = NULL); + char *toChars(); + static char needThisPrefix(); + static void init(); ++ ++ #define SIZE_INVALID (~(d_uns64)0) + d_uns64 size(); + virtual d_uns64 size(Loc loc); + virtual unsigned alignsize(); +@@ -248,7 +250,6 @@ struct Type : Object + void toCBuffer3(OutBuffer *buf, HdrGenState *hgs, int mod); + void modToBuffer(OutBuffer *buf); + char *modToChars(); +- void toJsonProperty(JsonOut *json, const char *); + virtual void toJson(JsonOut *json); + #if CPP_MANGLE + virtual void toCppMangle(OutBuffer *buf, CppMangleState *cms); +@@ -273,8 +274,9 @@ struct Type : Object + int isWild() { return mod & MODwild; } + int isSharedWild() { return mod == (MODshared | MODwild); } + int isNaked() { return mod == 0; } ++ Type *nullAttributes(); + Type *constOf(); +- Type *invariantOf(); ++ Type *immutableOf(); + Type *mutableOf(); + Type *sharedOf(); + Type *sharedConstOf(); +@@ -291,6 +293,7 @@ struct Type : Object + Type *referenceTo(); + Type *arrayOf(); + Type *aliasthisOf(); ++ int checkAliasThisRec(); + virtual Type *makeConst(); + virtual Type *makeInvariant(); + virtual Type *makeShared(); +@@ -304,21 +307,21 @@ struct Type : Object + virtual MATCH implicitConvTo(Type *to); + virtual MATCH constConv(Type *to); + virtual unsigned wildConvTo(Type *tprm); +- Type *substWildTo(unsigned mod); ++ virtual Type *substWildTo(unsigned mod); + virtual Type *toHeadMutable(); + virtual ClassDeclaration *isClassHandle(); +- virtual Expression *getProperty(Loc loc, Identifier *ident); +- virtual Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ virtual Expression *getProperty(Loc loc, Identifier *ident, int flag); ++ virtual Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + virtual structalign_t alignment(); +- Expression *noMember(Scope *sc, Expression *e, Identifier *ident); +- virtual Expression *defaultInit(Loc loc = 0); ++ Expression *noMember(Scope *sc, Expression *e, Identifier *ident, int flag); ++ virtual Expression *defaultInit(Loc loc = Loc()); + virtual Expression *defaultInitLiteral(Loc loc); + virtual Expression *voidInitLiteral(VarDeclaration *var); +- virtual int isZeroInit(Loc loc = 0); // if initializer is 0 ++ virtual int isZeroInit(Loc loc = Loc()); // if initializer is 0 + virtual dt_t **toDt(dt_t **pdt); + Identifier *getTypeInfoIdent(int internal); + virtual MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes, unsigned *wildmatch = NULL); +- virtual void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ virtual void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + Expression *getInternalTypeInfo(Scope *sc); + Expression *getTypeInfo(Scope *sc); + virtual TypeInfoDeclaration *getTypeInfoDeclaration(); +@@ -329,6 +332,7 @@ struct Type : Object + virtual int hasPointers(); + virtual TypeTuple *toArgTypes(); + virtual Type *nextOf(); ++ Type *baseElemOf(); + uinteger_t sizemask(); + virtual int needsDestruction(); + virtual bool needsNested(); +@@ -346,23 +350,25 @@ struct Type : Object + virtual TypeBasic *isTypeBasic(); + }; + +-struct TypeError : Type ++class TypeError : public Type + { ++public: + TypeError(); + Type *syntaxCopy(); + + void toCBuffer(OutBuffer *buf, Identifier *ident, HdrGenState *hgs); + + d_uns64 size(Loc loc); +- Expression *getProperty(Loc loc, Identifier *ident); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + Expression *defaultInit(Loc loc); + Expression *defaultInitLiteral(Loc loc); + TypeTuple *toArgTypes(); + }; + +-struct TypeNext : Type ++class TypeNext : public Type + { ++public: + Type *next; + + TypeNext(TY ty, Type *next); +@@ -383,8 +389,9 @@ struct TypeNext : Type + void transitive(); + }; + +-struct TypeBasic : Type ++class TypeBasic : public Type + { ++public: + const char *dstring; + unsigned flags; + +@@ -393,8 +400,8 @@ struct TypeBasic : Type + Type *syntaxCopy(); + d_uns64 size(Loc loc); + unsigned alignsize(); +- Expression *getProperty(Loc loc, Identifier *ident); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + char *toChars(); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + #if CPP_MANGLE +@@ -417,8 +424,9 @@ struct TypeBasic : Type + TypeBasic *isTypeBasic(); + }; + +-struct TypeVector : Type ++class TypeVector : public Type + { ++public: + Type *basetype; + + TypeVector(Loc loc, Type *basetype); +@@ -427,13 +435,14 @@ struct TypeVector : Type + Type *semantic(Loc loc, Scope *sc); + d_uns64 size(Loc loc); + unsigned alignsize(); +- Expression *getProperty(Loc loc, Identifier *ident); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + char *toChars(); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toDecoBuffer(OutBuffer *buf, int flag); + void toJson(JsonOut *json); + MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes, unsigned *wildmatch = NULL); ++ Type *reliesOnTident(TemplateParameters *tparams); + #if CPP_MANGLE + void toCppMangle(OutBuffer *buf, CppMangleState *cms); + #endif +@@ -444,23 +453,27 @@ struct TypeVector : Type + int checkBoolean(); + MATCH implicitConvTo(Type *to); + Expression *defaultInit(Loc loc); ++ Expression *defaultInitLiteral(Loc loc); + TypeBasic *elementType(); + int isZeroInit(Loc loc); ++ dt_t **toDt(dt_t **pdt); + TypeInfoDeclaration *getTypeInfoDeclaration(); + TypeTuple *toArgTypes(); + + type *toCtype(); + }; + +-struct TypeArray : TypeNext ++class TypeArray : public TypeNext + { ++public: + TypeArray(TY ty, Type *next); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + }; + + // Static array, one with a fixed dimension +-struct TypeSArray : TypeArray ++class TypeSArray : public TypeArray + { ++public: + Expression *dim; + + TypeSArray(Type *t, Expression *dim); +@@ -469,11 +482,11 @@ struct TypeSArray : TypeArray + d_uns64 size(Loc loc); + unsigned alignsize(); + Type *semantic(Loc loc, Scope *sc); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + int isString(); + int isZeroInit(Loc loc); + structalign_t alignment(); +@@ -495,24 +508,27 @@ struct TypeSArray : TypeArray + void toCppMangle(OutBuffer *buf, CppMangleState *cms); + #endif + ++ static Type *makeType(Loc loc, Type *tn, dinteger_t dim); ++ + type *toCtype(); + type *toCParamtype(); + }; + + // Dynamic array, no dimension +-struct TypeDArray : TypeArray ++class TypeDArray : public TypeArray + { ++public: + TypeDArray(Type *t); + const char *kind(); + Type *syntaxCopy(); + d_uns64 size(Loc loc); + unsigned alignsize(); + Type *semantic(Loc loc, Scope *sc); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + int isString(); + int isZeroInit(Loc loc); + int checkBoolean(); +@@ -530,8 +546,9 @@ struct TypeDArray : TypeArray + type *toCtype(); + }; + +-struct TypeAArray : TypeArray ++class TypeAArray : public TypeArray + { ++public: + Type *index; // key type + Loc loc; + Scope *sc; +@@ -544,11 +561,11 @@ struct TypeAArray : TypeArray + d_uns64 size(Loc loc); + Type *semantic(Loc loc, Scope *sc); + StructDeclaration *getImpl(); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + Expression *defaultInit(Loc loc); + MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes, unsigned *wildmatch = NULL); + int isZeroInit(Loc loc); +@@ -570,8 +587,9 @@ struct TypeAArray : TypeArray + type *toCtype(); + }; + +-struct TypePointer : TypeNext ++class TypePointer : public TypeNext + { ++public: + TypePointer(Type *t); + const char *kind(); + Type *syntaxCopy(); +@@ -594,8 +612,9 @@ struct TypePointer : TypeNext + type *toCtype(); + }; + +-struct TypeReference : TypeNext ++class TypeReference : public TypeNext + { ++public: + TypeReference(Type *t); + const char *kind(); + Type *syntaxCopy(); +@@ -603,7 +622,7 @@ struct TypeReference : TypeNext + d_uns64 size(Loc loc); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + Expression *defaultInit(Loc loc); + int isZeroInit(Loc loc); + #if CPP_MANGLE +@@ -634,8 +653,9 @@ enum PURE + PUREfwdref = 4, // it's pure, but not known which level yet + }; + +-struct TypeFunction : TypeNext ++class TypeFunction : public TypeNext + { ++public: + // .next is the return type + + Parameters *parameters; // function parameters +@@ -644,21 +664,19 @@ struct TypeFunction : TypeNext + bool isnothrow; // true: nothrow + bool isproperty; // can be called without parentheses + bool isref; // true: returns a reference +- enum LINK linkage; // calling convention +- enum TRUST trust; // level of trust +- enum PURE purity; // PURExxxx ++ LINK linkage; // calling convention ++ TRUST trust; // level of trust ++ PURE purity; // PURExxxx + bool iswild; // is inout function + Expressions *fargs; // function arguments + + int inuse; + +- TypeFunction(Parameters *parameters, Type *treturn, int varargs, enum LINK linkage, StorageClass stc = 0); ++ TypeFunction(Parameters *parameters, Type *treturn, int varargs, LINK linkage, StorageClass stc = 0); + const char *kind(); +- TypeFunction *copy(); + Type *syntaxCopy(); + Type *semantic(Loc loc, Scope *sc); + void purityLevel(); +- bool hasMutableIndirectionParams(); + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer(OutBuffer *buf, Identifier *ident, HdrGenState *hgs); + void toCBufferWithAttributes(OutBuffer *buf, Identifier *ident, HdrGenState* hgs, TypeFunction *attrs, TemplateDeclaration *td); +@@ -675,17 +693,19 @@ struct TypeFunction : TypeNext + bool parameterEscapes(Parameter *p); + Type *addStorageClass(StorageClass stc); + +- MATCH callMatch(Expression *ethis, Expressions *toargs, int flag = 0); ++ Type *substWildTo(unsigned mod); ++ MATCH callMatch(Type *tthis, Expressions *toargs, int flag = 0); + type *toCtype(); +- enum RET retStyle(); ++ RET retStyle(); + + unsigned totym(); + + Expression *defaultInit(Loc loc); + }; + +-struct TypeDelegate : TypeNext ++class TypeDelegate : public TypeNext + { ++public: + // .next is a TypeFunction + + TypeDelegate(Type *t); +@@ -701,7 +721,7 @@ struct TypeDelegate : TypeNext + int isZeroInit(Loc loc); + int checkBoolean(); + TypeInfoDeclaration *getTypeInfoDeclaration(); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + int hasPointers(); + TypeTuple *toArgTypes(); + #if CPP_MANGLE +@@ -711,23 +731,27 @@ struct TypeDelegate : TypeNext + type *toCtype(); + }; + +-struct TypeQualified : Type ++class TypeQualified : public Type + { ++public: + Loc loc; +- Identifiers idents; // array of Identifier's representing ident.ident.ident etc. ++ Objects idents; // array of Identifier and TypeInstance, ++ // representing ident.ident!tiargs.ident. ... etc. + + TypeQualified(TY ty, Loc loc); + void syntaxCopyHelper(TypeQualified *t); + void addIdent(Identifier *ident); ++ void addInst(TemplateInstance *inst); + void toCBuffer2Helper(OutBuffer *buf, HdrGenState *hgs); + void toJson(JsonOut *json); + d_uns64 size(Loc loc); + void resolveHelper(Loc loc, Scope *sc, Dsymbol *s, Dsymbol *scopesym, +- Expression **pe, Type **pt, Dsymbol **ps); ++ Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + }; + +-struct TypeIdentifier : TypeQualified ++class TypeIdentifier : public TypeQualified + { ++public: + Identifier *ident; + Dsymbol *originalSymbol; // The symbol representing this identifier, before alias resolution + +@@ -738,7 +762,7 @@ struct TypeIdentifier : TypeQualified + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + Dsymbol *toDsymbol(Scope *sc); + Type *semantic(Loc loc, Scope *sc); + MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes, unsigned *wildmatch = NULL); +@@ -748,8 +772,9 @@ struct TypeIdentifier : TypeQualified + + /* Similar to TypeIdentifier, but with a TemplateInstance as the root + */ +-struct TypeInstance : TypeQualified ++class TypeInstance : public TypeQualified + { ++public: + TemplateInstance *tempinst; + + TypeInstance(Loc loc, TemplateInstance *tempinst); +@@ -759,15 +784,17 @@ struct TypeInstance : TypeQualified + //void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + Type *semantic(Loc loc, Scope *sc); + Dsymbol *toDsymbol(Scope *sc); + Type *reliesOnTident(TemplateParameters *tparams = NULL); + MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes, unsigned *wildmatch = NULL); ++ Expression *toExpression(); + }; + +-struct TypeTypeof : TypeQualified ++class TypeTypeof : public TypeQualified + { ++public: + Expression *exp; + int inuse; + +@@ -777,24 +804,39 @@ struct TypeTypeof : TypeQualified + Dsymbol *toDsymbol(Scope *sc); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + Type *semantic(Loc loc, Scope *sc); + d_uns64 size(Loc loc); + }; + +-struct TypeReturn : TypeQualified ++class TypeReturn : public TypeQualified + { ++public: + TypeReturn(Loc loc); + const char *kind(); + Type *syntaxCopy(); + Dsymbol *toDsymbol(Scope *sc); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + Type *semantic(Loc loc, Scope *sc); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); + }; + +-struct TypeStruct : Type ++// Whether alias this dependency is recursive or not. ++enum AliasThisRec ++{ ++ RECno = 0, // no alias this recursion ++ RECyes = 1, // alias this has recursive dependency ++ RECfwdref = 2, // not yet known ++ ++ RECtracing = 0x4, // mark in progress of implicitConvTo/wildConvTo ++}; ++ ++class TypeStruct : public Type + { ++public: + StructDeclaration *sym; ++ AliasThisRec att; + + TypeStruct(StructDeclaration *sym); + const char *kind(); +@@ -807,7 +849,7 @@ struct TypeStruct : Type + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + structalign_t alignment(); + Expression *defaultInit(Loc loc); + Expression *defaultInitLiteral(Loc loc); +@@ -833,8 +875,9 @@ struct TypeStruct : Type + type *toCtype(); + }; + +-struct TypeEnum : Type ++class TypeEnum : public Type + { ++public: + EnumDeclaration *sym; + + TypeEnum(EnumDeclaration *sym); +@@ -848,8 +891,8 @@ struct TypeEnum : Type + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); +- Expression *getProperty(Loc loc, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); + int isintegral(); + int isfloating(); + int isreal(); +@@ -858,6 +901,7 @@ struct TypeEnum : Type + int isscalar(); + int isunsigned(); + int checkBoolean(); ++ int isString(); + int isAssignable(); + int needsDestruction(); + bool needsNested(); +@@ -870,6 +914,7 @@ struct TypeEnum : Type + TypeInfoDeclaration *getTypeInfoDeclaration(); + int hasPointers(); + TypeTuple *toArgTypes(); ++ Type *nextOf(); + #if CPP_MANGLE + void toCppMangle(OutBuffer *buf, CppMangleState *cms); + #endif +@@ -877,8 +922,9 @@ struct TypeEnum : Type + type *toCtype(); + }; + +-struct TypeTypedef : Type ++class TypeTypedef : public Type + { ++public: + TypedefDeclaration *sym; + + TypeTypedef(TypedefDeclaration *sym); +@@ -892,9 +938,9 @@ struct TypeTypedef : Type + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + structalign_t alignment(); +- Expression *getProperty(Loc loc, Identifier *ident); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); + int isintegral(); + int isfloating(); + int isreal(); +@@ -927,9 +973,11 @@ struct TypeTypedef : Type + type *toCParamtype(); + }; + +-struct TypeClass : Type ++class TypeClass : public Type + { ++public: + ClassDeclaration *sym; ++ AliasThisRec att; + + TypeClass(ClassDeclaration *sym); + const char *kind(); +@@ -941,7 +989,7 @@ struct TypeClass : Type + void toDecoBuffer(OutBuffer *buf, int flag); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); +- Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); ++ Expression *dotExp(Scope *sc, Expression *e, Identifier *ident, int flag); + ClassDeclaration *isClassHandle(); + int isBaseOf(Type *t, int *poffset); + MATCH implicitConvTo(Type *to); +@@ -966,8 +1014,9 @@ struct TypeClass : Type + Symbol *toSymbol(); + }; + +-struct TypeTuple : Type ++class TypeTuple : public Type + { ++public: + Parameters *arguments; // types making up the tuple + + TypeTuple(Parameters *arguments); +@@ -978,18 +1027,19 @@ struct TypeTuple : Type + const char *kind(); + Type *syntaxCopy(); + Type *semantic(Loc loc, Scope *sc); +- int equals(Object *o); ++ bool equals(RootObject *o); + Type *reliesOnTident(TemplateParameters *tparams = NULL); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toDecoBuffer(OutBuffer *buf, int flag); + void toJson(JsonOut *json); +- Expression *getProperty(Loc loc, Identifier *ident); ++ Expression *getProperty(Loc loc, Identifier *ident, int flag); + Expression *defaultInit(Loc loc); + TypeInfoDeclaration *getTypeInfoDeclaration(); + }; + +-struct TypeSlice : TypeNext ++class TypeSlice : public TypeNext + { ++public: + Expression *lwr; + Expression *upr; + +@@ -997,13 +1047,14 @@ struct TypeSlice : TypeNext + const char *kind(); + Type *syntaxCopy(); + Type *semantic(Loc loc, Scope *sc); +- void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps); ++ void resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol **ps, bool intypeid = false); + void toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod); + void toJson(JsonOut *json); + }; + +-struct TypeNull : Type ++class TypeNull : public Type + { ++public: + TypeNull(); + const char *kind(); + +@@ -1016,18 +1067,16 @@ struct TypeNull : Type + void toJson(JsonOut *json); + + d_uns64 size(Loc loc); +- //Expression *getProperty(Loc loc, Identifier *ident); +- //Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); + Expression *defaultInit(Loc loc); +- //Expression *defaultInitLiteral(Loc loc); + }; + + /**************************************************************/ + + //enum InOut { None, In, Out, InOut, Lazy }; + +-struct Parameter : Object ++class Parameter : public RootObject + { ++public: + //enum InOut inout; + StorageClass storageClass; + Type *type; +@@ -1039,10 +1088,11 @@ struct Parameter : Object + Type *isLazyArray(); + void toDecoBuffer(OutBuffer *buf); + int dyncast() { return DYNCAST_PARAMETER; } // kludge for template.isType() +- void toJson(JsonOut *json); + static Parameters *arraySyntaxCopy(Parameters *args); + static char *argsTypesToChars(Parameters *args, int varargs); ++#if CPP_MANGLE + static void argsCppMangle(OutBuffer *buf, CppMangleState *cms, Parameters *arguments, int varargs); ++#endif + static void argsToCBuffer(OutBuffer *buf, HdrGenState *hgs, Parameters *arguments, int varargs); + static void argsToDecoBuffer(OutBuffer *buf, Parameters *arguments); + static int isTPL(Parameters *arguments); +--- a/src/gcc/d/dfrontend/object.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/object.c 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,45 @@ ++ ++// Copyright (c) 1999-2012 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#include ++ ++#include "object.h" ++#include "outbuffer.h" ++ ++/****************************** Object ********************************/ ++ ++bool RootObject::equals(RootObject *o) ++{ ++ return o == this; ++} ++ ++int RootObject::compare(RootObject *obj) ++{ ++ return this - obj; ++} ++ ++void RootObject::print() ++{ ++ printf("%s %p\n", toChars(), this); ++} ++ ++char *RootObject::toChars() ++{ ++ return (char *)"Object"; ++} ++ ++int RootObject::dyncast() ++{ ++ return 0; ++} ++ ++void RootObject::toBuffer(OutBuffer *b) ++{ ++ b->writestring("Object"); ++} +--- a/src/gcc/d/dfrontend/object.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/object.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,57 @@ ++ ++// Copyright (c) 1999-2011 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef OBJECT_H ++#define OBJECT_H ++ ++#define POSIX (linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) ++ ++#if __DMC__ ++#pragma once ++#endif ++ ++#include ++ ++typedef size_t hash_t; ++ ++struct OutBuffer; ++ ++/* ++ * Root of our class library. ++ */ ++class RootObject ++{ ++public: ++ RootObject() { } ++ virtual ~RootObject() { } ++ ++ virtual bool equals(RootObject *o); ++ ++ /** ++ * Return <0, ==0, or >0 if this is less than, equal to, or greater than obj. ++ * Useful for sorting Objects. ++ */ ++ virtual int compare(RootObject *obj); ++ ++ /** ++ * Pretty-print an Object. Useful for debugging the old-fashioned way. ++ */ ++ virtual void print(); ++ ++ virtual char *toChars(); ++ virtual void toBuffer(OutBuffer *buf); ++ ++ /** ++ * Used as a replacement for dynamic_cast. Returns a unique number ++ * defined by the library user. For Object, the return value is 0. ++ */ ++ virtual int dyncast(); ++}; ++ ++#endif +--- a/src/gcc/d/dfrontend/opover.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/opover.c 2014-04-01 16:32:51.000000000 +0100 +@@ -39,7 +39,6 @@ + static Dsymbol *inferApplyArgTypesX(Expression *ethis, FuncDeclaration *fstart, Parameters *arguments); + static void inferApplyArgTypesZ(TemplateDeclaration *tstart, Parameters *arguments); + static int inferApplyArgTypesY(TypeFunction *tf, Parameters *arguments, int flags = 0); +-static void templateResolve(Match *m, TemplateDeclaration *td, Scope *sc, Loc loc, Objects *targsi, Expression *ethis, Expressions *arguments); + + /******************************** Expression **************************/ + +@@ -182,7 +181,7 @@ AggregateDeclaration *isAggregate(Type * + /******************************************* + * Helper function to turn operator into template argument list + */ +-Objects *opToArg(Scope *sc, enum TOK op) ++Objects *opToArg(Scope *sc, TOK op) + { + /* Remove the = from op= + */ +@@ -202,11 +201,11 @@ Objects *opToArg(Scope *sc, enum TOK op) + case TOKcatass: op = TOKcat; break; + case TOKpowass: op = TOKpow; break; + } +- Expression *e = new StringExp(0, (char *)Token::toChars(op)); ++ Expression *e = new StringExp(Loc(), (char *)Token::toChars(op)); + e = e->semantic(sc); +- Objects *targsi = new Objects(); +- targsi->push(e); +- return targsi; ++ Objects *tiargs = new Objects(); ++ tiargs->push(e); ++ return tiargs; + } + + /************************************ +@@ -236,27 +235,31 @@ Expression *UnaExp::op_overload(Scope *s + Dsymbol *fd = search_function(ad, Id::opIndexUnary); + if (fd) + { +- ae = resolveOpDollar(sc, ae); +- Objects *targsi = opToArg(sc, op); +- Expression *e = new DotTemplateInstanceExp(loc, ae->e1, fd->ident, targsi); ++ Expression *e0 = resolveOpDollar(sc, ae); ++ Objects *tiargs = opToArg(sc, op); ++ Expression *e = new DotTemplateInstanceExp(loc, ae->e1, fd->ident, tiargs); + e = new CallExp(loc, e, ae->arguments); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && ae->e1->type != att1) + { + /* Rewrite op(a[arguments]) as: + * op(a.aliasthis[arguments]) + */ + Expression *e1 = ae->copy(); + ((ArrayExp *)e1)->e1 = new DotIdExp(loc, ae->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ UnaExp *ue = (UnaExp *)copy(); ++ if (!ue->att1 && ae->e1->type->checkAliasThisRec()) ++ ue->att1 = ae->e1->type; ++ ue->e1 = e1; ++ if (Expression *e = ue->trySemantic(sc)) ++ return e; + } ++ att1 = NULL; + } + } + else if (e1->op == TOKslice) +@@ -274,33 +277,38 @@ Expression *UnaExp::op_overload(Scope *s + Dsymbol *fd = search_function(ad, Id::opSliceUnary); + if (fd) + { +- se = resolveOpDollar(sc, se); ++ Expression *e0 = resolveOpDollar(sc, se); + Expressions *a = new Expressions(); + assert(!se->lwr || se->upr); + if (se->lwr) +- { a->push(se->lwr); ++ { ++ a->push(se->lwr); + a->push(se->upr); + } +- Objects *targsi = opToArg(sc, op); +- Expression *e = new DotTemplateInstanceExp(loc, se->e1, fd->ident, targsi); ++ Objects *tiargs = opToArg(sc, op); ++ Expression *e = new DotTemplateInstanceExp(loc, se->e1, fd->ident, tiargs); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && se->e1->type != att1) + { + /* Rewrite op(a[lwr..upr]) as: + * op(a.aliasthis[lwr..upr]) + */ + Expression *e1 = se->copy(); + ((SliceExp *)e1)->e1 = new DotIdExp(loc, se->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ UnaExp *ue = (UnaExp *)copy(); ++ if (!ue->att1 && se->e1->type->checkAliasThisRec()) ++ ue->att1 = se->e1->type; ++ ue->e1 = e1; ++ if (Expression *e = ue->trySemantic(sc)) ++ return e; + } ++ att1 = NULL; + } + } + #endif +@@ -344,24 +352,26 @@ Expression *UnaExp::op_overload(Scope *s + fd = search_function(ad, Id::opUnary); + if (fd) + { +- Objects *targsi = opToArg(sc, op); +- Expression *e = new DotTemplateInstanceExp(loc, e1, fd->ident, targsi); ++ Objects *tiargs = opToArg(sc, op); ++ Expression *e = new DotTemplateInstanceExp(loc, e1, fd->ident, tiargs); + e = new CallExp(loc, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && this->e1->type != att1) + { + /* Rewrite op(e1) as: + * op(e1.aliasthis) + */ ++ //printf("att una %s e1 = %s\n", Token::toChars(op), this->e1->type->toChars()); + Expression *e1 = new DotIdExp(loc, this->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ UnaExp *ue = (UnaExp *)copy(); ++ if (!ue->att1 && this->e1->type->checkAliasThisRec()) ++ ue->att1 = this->e1->type; ++ ue->e1 = e1; ++ return ue->trySemantic(sc); + } + #endif + } +@@ -380,24 +390,27 @@ Expression *ArrayExp::op_overload(Scope + /* Rewrite op e1[arguments] as: + * e1.opIndex(arguments) + */ +- ArrayExp *ae = resolveOpDollar(sc, this); +- Expression *e = new DotIdExp(loc, ae->e1, fd->ident); +- e = new CallExp(loc, e, ae->arguments); ++ Expression *e0 = resolveOpDollar(sc, this); ++ Expression *e = new DotIdExp(loc, e1, fd->ident); ++ e = new CallExp(loc, e, arguments); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && this->e1->type != att1) + { + /* Rewrite op(e1) as: + * op(e1.aliasthis) + */ ++ //printf("att arr e1 = %s\n", this->e1->type->toChars()); + Expression *e1 = new DotIdExp(loc, this->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ UnaExp *ue = (UnaExp *)copy(); ++ if (!ue->att1 && this->e1->type->checkAliasThisRec()) ++ ue->att1 = this->e1->type; ++ ue->e1 = e1; ++ return ue->trySemantic(sc); + } + } + return NULL; +@@ -426,9 +439,9 @@ Expression *CastExp::op_overload(Scope * + return build_overload(loc, sc, e1, NULL, fd); + } + #endif +- Objects *targsi = new Objects(); +- targsi->push(to); +- Expression *e = new DotTemplateInstanceExp(loc, e1, fd->ident, targsi); ++ Objects *tiargs = new Objects(); ++ tiargs->push(to); ++ Expression *e = new DotTemplateInstanceExp(loc, e1, fd->ident, tiargs); + e = new CallExp(loc, e); + e = e->semantic(sc); + return e; +@@ -487,7 +500,7 @@ Expression *BinExp::op_overload(Scope *s + } + #endif + +- Objects *targsi = NULL; ++ Objects *tiargs = NULL; + #if DMDV2 + if (op == TOKplusplus || op == TOKminusminus) + { // Bug4099 fix +@@ -500,16 +513,28 @@ Expression *BinExp::op_overload(Scope *s + /* Try the new D2 scheme, opBinary and opBinaryRight + */ + if (ad1) ++ { + s = search_function(ad1, Id::opBinary); ++ if (s && !s->isTemplateDeclaration()) ++ { e1->error("%s.opBinary isn't a template", e1->toChars()); ++ return new ErrorExp(); ++ } ++ } + if (ad2) ++ { + s_r = search_function(ad2, Id::opBinaryRight); ++ if (s_r && !s_r->isTemplateDeclaration()) ++ { e2->error("%s.opBinaryRight isn't a template", e2->toChars()); ++ return new ErrorExp(); ++ } ++ } + +- // Set targsi, the template argument list, which will be the operator string ++ // Set tiargs, the template argument list, which will be the operator string + if (s || s_r) + { + id = Id::opBinary; + id_r = Id::opBinaryRight; +- targsi = opToArg(sc, op); ++ tiargs = opToArg(sc, op); + } + } + #endif +@@ -524,8 +549,10 @@ Expression *BinExp::op_overload(Scope *s + + args1.setDim(1); + args1[0] = e1; ++ expandTuples(&args1); + args2.setDim(1); + args2[0] = e2; ++ expandTuples(&args2); + argsset = 1; + + Match m; +@@ -533,32 +560,12 @@ Expression *BinExp::op_overload(Scope *s + m.last = MATCHnomatch; + + if (s) +- { +- FuncDeclaration *fd = s->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args2); +- } +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e1, &args2); +- } +- } ++ functionResolve(&m, s, loc, sc, tiargs, e1->type, &args2); + + FuncDeclaration *lastf = m.lastf; + + if (s_r) +- { +- FuncDeclaration *fd = s_r->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args1); +- } +- else +- { TemplateDeclaration *td = s_r->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e2, &args1); +- } +- } ++ functionResolve(&m, s_r, loc, sc, tiargs, e2->type, &args1); + + if (m.count > 1) + { +@@ -571,7 +578,7 @@ Expression *BinExp::op_overload(Scope *s + else if (m.last == MATCHnomatch) + { + m.lastf = m.anyf; +- if (targsi) ++ if (tiargs) + goto L1; + } + +@@ -593,7 +600,7 @@ Expression *BinExp::op_overload(Scope *s + + L1: + #if 1 // Retained for D1 compatibility +- if (isCommutative() && !targsi) ++ if (isCommutative() && !tiargs) + { + s = NULL; + s_r = NULL; +@@ -615,10 +622,13 @@ L1: + */ + + if (!argsset) +- { args1.setDim(1); ++ { ++ args1.setDim(1); + args1[0] = e1; ++ expandTuples(&args1); + args2.setDim(1); + args2[0] = e2; ++ expandTuples(&args2); + } + + Match m; +@@ -626,31 +636,12 @@ L1: + m.last = MATCHnomatch; + + if (s_r) +- { +- FuncDeclaration *fd = s_r->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args2); +- } +- else +- { TemplateDeclaration *td = s_r->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e1, &args2); +- } +- } ++ functionResolve(&m, s_r, loc, sc, tiargs, e1->type, &args2); ++ + FuncDeclaration *lastf = m.lastf; + + if (s) +- { +- FuncDeclaration *fd = s->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args1); +- } +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e2, &args1); +- } +- } ++ functionResolve(&m, s, loc, sc, tiargs, e2->type, &args1); + + if (m.count > 1) + { +@@ -709,11 +700,15 @@ L1: + /* Rewrite (e1 op e2) as: + * (e1.aliasthis op e2) + */ ++ if (att1 && this->e1->type == att1) ++ return NULL; ++ //printf("att bin e1 = %s\n", this->e1->type->toChars()); + Expression *e1 = new DotIdExp(loc, this->e1, ad1->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att1 && this->e1->type->checkAliasThisRec()) ++ be->att1 = this->e1->type; ++ be->e1 = e1; ++ return be->trySemantic(sc); + } + + // Try alias this on second operand +@@ -726,11 +721,15 @@ L1: + /* Rewrite (e1 op e2) as: + * (e1 op e2.aliasthis) + */ ++ if (att2 && this->e2->type == att2) ++ return NULL; ++ //printf("att bin e2 = %s\n", this->e2->type->toChars()); + Expression *e2 = new DotIdExp(loc, this->e2, ad2->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e2 = e2; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att2 && this->e2->type->checkAliasThisRec()) ++ be->att2 = this->e2->type; ++ be->e2 = e2; ++ return be->trySemantic(sc); + } + #endif + return NULL; +@@ -760,7 +759,7 @@ Expression *BinExp::compare_overload(Sco + s_r = NULL; + } + +- Objects *targsi = NULL; ++ Objects *tiargs = NULL; + + if (s || s_r) + { +@@ -775,8 +774,10 @@ Expression *BinExp::compare_overload(Sco + + args1.setDim(1); + args1[0] = e1; ++ expandTuples(&args1); + args2.setDim(1); + args2[0] = e2; ++ expandTuples(&args2); + + Match m; + memset(&m, 0, sizeof(m)); +@@ -789,33 +790,13 @@ Expression *BinExp::compare_overload(Sco + } + + if (s) +- { +- FuncDeclaration *fd = s->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args2); +- } +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e1, &args2); +- } +- } ++ functionResolve(&m, s, loc, sc, tiargs, e1->type, &args2); + + FuncDeclaration *lastf = m.lastf; + int count = m.count; + + if (s_r) +- { +- FuncDeclaration *fd = s_r->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args1); +- } +- else +- { TemplateDeclaration *td = s_r->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e2, &args1); +- } +- } ++ functionResolve(&m, s_r, loc, sc, tiargs, e2->type, &args1); + + if (m.count > 1) + { +@@ -882,11 +863,15 @@ Expression *BinExp::compare_overload(Sco + /* Rewrite (e1 op e2) as: + * (e1.aliasthis op e2) + */ ++ if (att1 && this->e1->type == att1) ++ return NULL; ++ //printf("att cmp_bin e1 = %s\n", this->e1->type->toChars()); + Expression *e1 = new DotIdExp(loc, this->e1, ad1->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att1 && this->e1->type->checkAliasThisRec()) ++ be->att1 = this->e1->type; ++ be->e1 = e1; ++ return be->trySemantic(sc); + } + + // Try alias this on second operand +@@ -895,11 +880,15 @@ Expression *BinExp::compare_overload(Sco + /* Rewrite (e1 op e2) as: + * (e1 op e2.aliasthis) + */ ++ if (att2 && this->e2->type == att2) ++ return NULL; ++ //printf("att cmp_bin e2 = %s\n", this->e2->type->toChars()); + Expression *e2 = new DotIdExp(loc, this->e2, ad2->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e2 = e2; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att2 && this->e2->type->checkAliasThisRec()) ++ be->att2 = this->e2->type; ++ be->e2 = e2; ++ return be->trySemantic(sc); + } + + return NULL; +@@ -915,7 +904,7 @@ Expression *EqualExp::op_overload(Scope + { ClassDeclaration *cd1 = t1->isClassHandle(); + ClassDeclaration *cd2 = t2->isClassHandle(); + +- if (!(cd1->isCPPinterface() || cd2->isCPPinterface())) ++ if (!(cd1->cpp || cd2->cpp)) + { + /* Rewrite as: + * .object.opEquals(e1, e2) +@@ -975,30 +964,34 @@ Expression *BinAssignExp::op_overload(Sc + Dsymbol *fd = search_function(ad, Id::opIndexOpAssign); + if (fd) + { +- ae = resolveOpDollar(sc, ae); ++ Expression *e0 = resolveOpDollar(sc, ae); + Expressions *a = (Expressions *)ae->arguments->copy(); + a->insert(0, e2); + +- Objects *targsi = opToArg(sc, op); +- Expression *e = new DotTemplateInstanceExp(loc, ae->e1, fd->ident, targsi); ++ Objects *tiargs = opToArg(sc, op); ++ Expression *e = new DotTemplateInstanceExp(loc, ae->e1, fd->ident, tiargs); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && ae->e1->type != att1) + { + /* Rewrite a[arguments] op= e2 as: + * a.aliasthis[arguments] op= e2 + */ + Expression *e1 = ae->copy(); + ((ArrayExp *)e1)->e1 = new DotIdExp(loc, ae->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att1 && ae->e1->type->checkAliasThisRec()) ++ be->att1 = ae->e1->type; ++ be->e1 = e1; ++ if (Expression *e = be->trySemantic(sc)) ++ return e; + } ++ att1 = NULL; + } + } + else if (e1->op == TOKslice) +@@ -1016,35 +1009,40 @@ Expression *BinAssignExp::op_overload(Sc + Dsymbol *fd = search_function(ad, Id::opSliceOpAssign); + if (fd) + { +- se = resolveOpDollar(sc, se); ++ Expression *e0 = resolveOpDollar(sc, se); + Expressions *a = new Expressions(); + a->push(e2); + assert(!se->lwr || se->upr); + if (se->lwr) +- { a->push(se->lwr); ++ { ++ a->push(se->lwr); + a->push(se->upr); + } + +- Objects *targsi = opToArg(sc, op); +- Expression *e = new DotTemplateInstanceExp(loc, se->e1, fd->ident, targsi); ++ Objects *tiargs = opToArg(sc, op); ++ Expression *e = new DotTemplateInstanceExp(loc, se->e1, fd->ident, tiargs); + e = new CallExp(loc, e, a); ++ e = combine(e0, e); + e = e->semantic(sc); + return e; + } + + // Didn't find it. Forward to aliasthis +- if (ad->aliasthis) ++ if (ad->aliasthis && se->e1->type != att1) + { + /* Rewrite a[lwr..upr] op= e2 as: + * a.aliasthis[lwr..upr] op= e2 + */ + Expression *e1 = se->copy(); + ((SliceExp *)e1)->e1 = new DotIdExp(loc, se->e1, ad->aliasthis->ident); +- Expression *e = copy(); +- ((UnaExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att1 && se->e1->type->checkAliasThisRec()) ++ be->att1 = se->e1->type; ++ be->e1 = e1; ++ if (Expression *e = be->trySemantic(sc)) ++ return e; + } ++ att1 = NULL; + } + } + #endif +@@ -1072,19 +1070,25 @@ Expression *BinAssignExp::op_overload(Sc + } + #endif + +- Objects *targsi = NULL; ++ Objects *tiargs = NULL; + #if DMDV2 + if (!s) + { /* Try the new D2 scheme, opOpAssign + */ + if (ad1) ++ { + s = search_function(ad1, Id::opOpAssign); ++ if (s && !s->isTemplateDeclaration()) ++ { error("%s.opOpAssign isn't a template", e1->toChars()); ++ return new ErrorExp(); ++ } ++ } + +- // Set targsi, the template argument list, which will be the operator string ++ // Set tiargs, the template argument list, which will be the operator string + if (s) + { + id = Id::opOpAssign; +- targsi = opToArg(sc, op); ++ tiargs = opToArg(sc, op); + } + } + #endif +@@ -1097,23 +1101,14 @@ Expression *BinAssignExp::op_overload(Sc + + args2.setDim(1); + args2[0] = e2; ++ expandTuples(&args2); + + Match m; + memset(&m, 0, sizeof(m)); + m.last = MATCHnomatch; + + if (s) +- { +- FuncDeclaration *fd = s->isFuncDeclaration(); +- if (fd) +- { +- overloadResolveX(&m, fd, NULL, &args2); +- } +- else +- { TemplateDeclaration *td = s->isTemplateDeclaration(); +- templateResolve(&m, td, sc, loc, targsi, e1, &args2); +- } +- } ++ functionResolve(&m, s, loc, sc, tiargs, e1->type, &args2); + + if (m.count > 1) + { +@@ -1126,7 +1121,7 @@ Expression *BinAssignExp::op_overload(Sc + else if (m.last == MATCHnomatch) + { + m.lastf = m.anyf; +- if (targsi) ++ if (tiargs) + goto L1; + } + +@@ -1143,11 +1138,15 @@ L1: + /* Rewrite (e1 op e2) as: + * (e1.aliasthis op e2) + */ ++ if (att1 && this->e1->type == att1) ++ return NULL; ++ //printf("att %s e1 = %s\n", Token::toChars(op), this->e1->type->toChars()); + Expression *e1 = new DotIdExp(loc, this->e1, ad1->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e1 = e1; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att1 && this->e1->type->checkAliasThisRec()) ++ be->att1 = this->e1->type; ++ be->e1 = e1; ++ return be->trySemantic(sc); + } + + // Try alias this on second operand +@@ -1157,11 +1156,15 @@ L1: + /* Rewrite (e1 op e2) as: + * (e1 op e2.aliasthis) + */ ++ if (att2 && this->e2->type == att2) ++ return NULL; ++ //printf("att %s e2 = %s\n", Token::toChars(op), this->e2->type->toChars()); + Expression *e2 = new DotIdExp(loc, this->e2, ad2->aliasthis->ident); +- Expression *e = copy(); +- ((BinExp *)e)->e2 = e2; +- e = e->trySemantic(sc); +- return e; ++ BinExp *be = (BinExp *)copy(); ++ if (!be->att2 && this->e2->type->checkAliasThisRec()) ++ be->att2 = this->e2->type; ++ be->e2 = e2; ++ return be->trySemantic(sc); + } + #endif + return NULL; +@@ -1201,7 +1204,7 @@ Dsymbol *search_function(ScopeDsymbol *a + FuncDeclaration *fd; + TemplateDeclaration *td; + +- s = ad->search(0, funcid, 0); ++ s = ad->search(Loc(), funcid, 0); + if (s) + { Dsymbol *s2; + +@@ -1228,6 +1231,8 @@ int ForeachStatement::inferAggregate(Sco + int sliced = 0; + #endif + Type *tab; ++ Type *att = NULL; ++ Expression *org_aggr = aggr; + AggregateDeclaration *ad; + + while (1) +@@ -1239,6 +1244,10 @@ int ForeachStatement::inferAggregate(Sco + goto Lerr; + + tab = aggr->type->toBasetype(); ++ if (att == tab) ++ { aggr = org_aggr; ++ goto Lerr; ++ } + switch (tab->ty) + { + case Tarray: +@@ -1277,13 +1286,15 @@ int ForeachStatement::inferAggregate(Sco + } + } + +- if (Dsymbol *shead = ad->search(0, idfront, 0)) ++ if (Dsymbol *shead = ad->search(Loc(), idfront, 0)) + { // range aggregate + break; + } + + if (ad->aliasthis) + { ++ if (!att && tab->checkAliasThisRec()) ++ att = tab; + aggr = new DotIdExp(aggr->loc, aggr, ad->aliasthis->ident); + continue; + } +@@ -1436,7 +1447,7 @@ int ForeachStatement::inferApplyArgTypes + /* Look for a front() or back() overload + */ + Identifier *id = (op == TOKforeach) ? Id::Ffront : Id::Fback; +- Dsymbol *s = ad->search(0, id, 0); ++ Dsymbol *s = ad->search(Loc(), id, 0); + FuncDeclaration *fd = s ? s->isFuncDeclaration() : NULL; + if (fd) + { +@@ -1474,47 +1485,51 @@ int ForeachStatement::inferApplyArgTypes + + static Dsymbol *inferApplyArgTypesX(Expression *ethis, FuncDeclaration *fstart, Parameters *arguments) + { +- struct Param3 +- { +- Parameters *arguments; +- int mod; +- MATCH match; +- FuncDeclaration *fd_best; +- FuncDeclaration *fd_ambig; +- +- static int fp(void *param, FuncDeclaration *f) +- { +- Param3 *p = (Param3 *)param; +- TypeFunction *tf = (TypeFunction *)f->type; +- MATCH m = MATCHexact; +- +- if (f->isThis()) +- { if (!MODimplicitConv(p->mod, tf->mod)) +- m = MATCHnomatch; +- else if (p->mod != tf->mod) +- m = MATCHconst; +- } +- if (!inferApplyArgTypesY(tf, p->arguments, 1)) +- m = MATCHnomatch; ++ struct ParamOpOver ++ { ++ Parameters *arguments; ++ int mod; ++ MATCH match; ++ FuncDeclaration *fd_best; ++ FuncDeclaration *fd_ambig; + +- if (m > p->match) +- { p->fd_best = f; +- p->fd_ambig = NULL; +- p->match = m; +- } +- else if (m == p->match) +- p->fd_ambig = f; ++ static int fp(void *param, Dsymbol *s) ++ { ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (!f) + return 0; ++ ParamOpOver *p = (ParamOpOver *)param; ++ TypeFunction *tf = (TypeFunction *)f->type; ++ MATCH m = MATCHexact; ++ ++ if (f->isThis()) ++ { ++ if (!MODimplicitConv(p->mod, tf->mod)) ++ m = MATCHnomatch; ++ else if (p->mod != tf->mod) ++ m = MATCHconst; + } +- }; ++ if (!inferApplyArgTypesY(tf, p->arguments, 1)) ++ m = MATCHnomatch; + +- Param3 p; ++ if (m > p->match) ++ { ++ p->fd_best = f; ++ p->fd_ambig = NULL; ++ p->match = m; ++ } ++ else if (m == p->match) ++ p->fd_ambig = f; ++ return 0; ++ } ++ }; ++ ParamOpOver p; + p.arguments = arguments; + p.mod = ethis->type->mod; + p.match = MATCHnomatch; + p.fd_best = NULL; + p.fd_ambig = NULL; +- overloadApply(fstart, &Param3::fp, &p); ++ overloadApply(fstart, &p, &ParamOpOver::fp); + if (p.fd_best) + { + inferApplyArgTypesY((TypeFunction *)p.fd_best->type, arguments); +@@ -1571,10 +1586,10 @@ static int inferApplyArgTypesY(TypeFunct + arg->type = arg->type->addStorageClass(arg->storageClass); + } + } +- Lmatch: ++Lmatch: + return 1; + +- Lnomatch: ++Lnomatch: + return 0; + } + +@@ -1610,28 +1625,3 @@ void inferApplyArgTypesZ(TemplateDeclara + } + } + #endif +- +-/************************************** +- */ +- +-static void templateResolve(Match *m, TemplateDeclaration *td, Scope *sc, Loc loc, Objects *targsi, Expression *ethis, Expressions *arguments) +-{ +- FuncDeclaration *fd; +- +- assert(td); +- fd = td->deduceFunctionTemplate(sc, loc, targsi, ethis, arguments, 1); +- if (!fd) +- return; +- m->anyf = fd; +- if (m->last >= MATCHexact) +- { +- m->nextf = fd; +- m->count++; +- } +- else +- { +- m->last = MATCHexact; +- m->lastf = fd; +- m->count = 1; +- } +-} +--- a/src/gcc/d/dfrontend/optimize.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/optimize.c 2014-04-01 16:32:51.000000000 +0100 +@@ -23,7 +23,7 @@ + #include "declaration.h" + #include "aggregate.h" + #include "init.h" +- ++#include "enum.h" + + /************************************* + * If variable has a const initializer, +@@ -44,12 +44,10 @@ Expression *expandVar(int result, VarDec + { + if (!v->type) + { +- //error("ICE"); + return e; + } + Type *tb = v->type->toBasetype(); +- if (result & WANTinterpret || +- v->storage_class & STCmanifest || ++ if ( v->storage_class & STCmanifest || + v->type->toBasetype()->isscalar() || + ((result & WANTexpand) && (tb->ty != Tsarray && tb->ty != Tstruct)) + ) +@@ -58,25 +56,25 @@ Expression *expandVar(int result, VarDec + { + if (v->inuse) + { if (v->storage_class & STCmanifest) ++ { + v->error("recursive initialization of constant"); ++ goto Lerror; ++ } + goto L1; + } +- Expression *ei = v->init->toExpression(); ++ Expression *ei = v->getConstInitializer(); + if (!ei) + { if (v->storage_class & STCmanifest) ++ { + v->error("enum cannot be initialized with %s", v->init->toChars()); ++ goto Lerror; ++ } + goto L1; + } + if (ei->op == TOKconstruct || ei->op == TOKblit) + { AssignExp *ae = (AssignExp *)ei; + ei = ae->e2; +- if (result & WANTinterpret) +- { +- v->inuse++; +- ei = ei->optimize(result); +- v->inuse--; +- } +- else if (ei->isConst() != 1 && ei->op != TOKstring) ++ if (ei->isConst() != 1 && ei->op != TOKstring) + goto L1; + + if (ei->type == v->type) +@@ -84,24 +82,19 @@ Expression *expandVar(int result, VarDec + } + else if (ei->implicitConvTo(v->type) >= MATCHconst) + { // const var initialized with non-const expression +- ei = ei->implicitCastTo(0, v->type); +- ei = ei->semantic(0); ++ ei = ei->implicitCastTo(NULL, v->type); ++ ei = ei->semantic(NULL); + } + else + goto L1; + } +- if (v->scope) ++ else if (!(v->storage_class & STCmanifest) && ++ ei->isConst() != 1 && ei->op != TOKstring && ++ ei->op != TOKaddress) + { +- v->inuse++; +- e = ei->syntaxCopy(); +- e = e->semantic(v->scope); +- e = e->implicitCastTo(v->scope, v->type); +- // enabling this line causes test22 in test suite to fail +- //ei->type = e->type; +- v->scope = NULL; +- v->inuse--; ++ goto L1; + } +- else if (!ei->type) ++ if (!ei->type) + { + goto L1; + } +@@ -132,6 +125,9 @@ Expression *expandVar(int result, VarDec + L1: + //if (e) printf("\te = %p, %s, e->type = %d, %s\n", e, e->toChars(), e->type->ty, e->type->toChars()); + return e; ++ ++Lerror: ++ return new ErrorExp(); + } + + +@@ -163,15 +159,6 @@ Expression *fromConstInitializer(int res + else + { + e = e1; +- /* If we needed to interpret, generate an error. +- * Don't give an error if it's a template parameter +- */ +- if (v && (result & WANTinterpret) && +- !(v->storage_class & STCtemplateparameter)) +- { +- e1->error("variable %s cannot be read at compile time", v->toChars()); +- e->type = Type::terror; +- } + } + } + return e; +@@ -186,15 +173,23 @@ Expression *Expression::optimize(int res + + Expression *VarExp::optimize(int result, bool keepLvalue) + { +- return keepLvalue ? this : fromConstInitializer(result, this); ++ if (keepLvalue) ++ { ++ VarDeclaration *v = var->isVarDeclaration(); ++ if (v && !(v->storage_class & STCmanifest)) ++ return this; ++ } ++ return fromConstInitializer(result, this); + } + + Expression *TupleExp::optimize(int result, bool keepLvalue) + { ++ if (e0) ++ e0 = e0->optimize(WANTvalue); + for (size_t i = 0; i < exps->dim; i++) +- { Expression *e = (*exps)[i]; +- +- e = e->optimize(WANTvalue | (result & WANTinterpret)); ++ { ++ Expression *e = (*exps)[i]; ++ e = e->optimize(WANTvalue); + (*exps)[i] = e; + } + return this; +@@ -207,7 +202,7 @@ Expression *ArrayLiteralExp::optimize(in + for (size_t i = 0; i < elements->dim; i++) + { Expression *e = (*elements)[i]; + +- e = e->optimize(WANTvalue | (result & (WANTinterpret | WANTexpand))); ++ e = e->optimize(WANTvalue | (result & WANTexpand)); + (*elements)[i] = e; + } + } +@@ -220,11 +215,11 @@ Expression *AssocArrayLiteralExp::optimi + for (size_t i = 0; i < keys->dim; i++) + { Expression *e = (*keys)[i]; + +- e = e->optimize(WANTvalue | (result & (WANTinterpret | WANTexpand))); ++ e = e->optimize(WANTvalue | (result & WANTexpand)); + (*keys)[i] = e; + + e = (*values)[i]; +- e = e->optimize(WANTvalue | (result & (WANTinterpret | WANTexpand))); ++ e = e->optimize(WANTvalue | (result & WANTexpand)); + (*values)[i] = e; + } + return this; +@@ -232,16 +227,20 @@ Expression *AssocArrayLiteralExp::optimi + + Expression *StructLiteralExp::optimize(int result, bool keepLvalue) + { ++ if(stageflags & stageOptimize) return this; ++ int old = stageflags; ++ stageflags |= stageOptimize; + if (elements) + { + for (size_t i = 0; i < elements->dim; i++) + { Expression *e = (*elements)[i]; + if (!e) + continue; +- e = e->optimize(WANTvalue | (result & (WANTinterpret | WANTexpand))); ++ e = e->optimize(WANTvalue | (result & WANTexpand)); + (*elements)[i] = e; + } + } ++ stageflags = old; + return this; + } + +@@ -309,6 +308,12 @@ Expression *BoolExp::optimize(int result + return e; + } + ++Expression *SymOffExp::optimize(int result, bool keepLvalue) ++{ ++ assert(var); ++ return this; ++} ++ + Expression *AddrExp::optimize(int result, bool keepLvalue) + { Expression *e; + +@@ -325,13 +330,8 @@ Expression *AddrExp::optimize(int result + return e->optimize(result); + } + +- if (e1->op == TOKvar) +- { VarExp *ve = (VarExp *)e1; +- if (ve->var->storage_class & STCmanifest) +- e1 = e1->optimize(result); +- } +- else +- e1 = e1->optimize(result); ++ // Keep lvalue-ness ++ e1 = e1->optimize(result, true); + + // Convert &*ex to ex + if (e1->op == TOKstar) +@@ -363,7 +363,7 @@ Expression *AddrExp::optimize(int result + + if (ae->e2->op == TOKint64 && ae->e1->op == TOKvar) + { +- dinteger_t index = ae->e2->toInteger(); ++ sinteger_t index = ae->e2->toInteger(); + VarExp *ve = (VarExp *)ae->e1; + if (ve->type->ty == Tsarray + && !ve->var->isImportedSymbol()) +@@ -371,7 +371,10 @@ Expression *AddrExp::optimize(int result + TypeSArray *ts = (TypeSArray *)ve->type; + sinteger_t dim = ts->dim->toInteger(); + if (index < 0 || index >= dim) ++ { + error("array index %lld is out of bounds [0..%lld]", index, dim); ++ return new ErrorExp(); ++ } + e = new SymOffExp(loc, ve->var, index * ts->nextOf()->size()); + e->type = type; + return e; +@@ -480,10 +483,6 @@ Expression *NewExp::optimize(int result, + (*arguments)[i] = e; + } + } +- if (result & WANTinterpret) +- { +- error("cannot evaluate %s at compile time", toChars()); +- } + return this; + } + +@@ -502,12 +501,8 @@ Expression *CallExp::optimize(int result + size_t pdim = Parameter::dim(tf->parameters) - (tf->varargs == 2 ? 1 : 0); + for (size_t i = 0; i < arguments->dim; i++) + { +- bool keepLvalue = false; +- if (i < pdim) +- { +- Parameter *p = Parameter::getNth(tf->parameters, i); +- keepLvalue = ((p->storageClass & (STCref | STCout)) != 0); +- } ++ Parameter *p = Parameter::getNth(tf->parameters, i); ++ bool keepLvalue = (p ? (p->storageClass & (STCref | STCout)) != 0 : false); + Expression *e = (*arguments)[i]; + e = e->optimize(WANTvalue, keepLvalue); + (*arguments)[i] = e; +@@ -519,49 +514,19 @@ Expression *CallExp::optimize(int result + return this; + + #if 1 +- if (result & WANTinterpret) +- { +- Expression *eresult = interpret(NULL); +- if (eresult == EXP_CANT_INTERPRET) +- return e; +- if (eresult && eresult != EXP_VOID_INTERPRET) +- e = eresult; +- else +- error("cannot evaluate %s at compile time", toChars()); +- } + #else + if (e1->op == TOKvar) + { + FuncDeclaration *fd = ((VarExp *)e1)->var->isFuncDeclaration(); + if (fd) + { +- enum BUILTIN b = fd->isBuiltin(); ++ BUILTIN b = fd->isBuiltin(); + if (b) + { + e = eval_builtin(b, arguments); + if (!e) // failed + e = this; // evaluate at runtime + } +- else if (result & WANTinterpret) +- { +- Expression *eresult = fd->interpret(NULL, arguments); +- if (eresult && eresult != EXP_VOID_INTERPRET) +- e = eresult; +- else +- error("cannot evaluate %s at compile time", toChars()); +- } +- } +- } +- else if (e1->op == TOKdotvar && result & WANTinterpret) +- { DotVarExp *dve = (DotVarExp *)e1; +- FuncDeclaration *fd = dve->var->isFuncDeclaration(); +- if (fd) +- { +- Expression *eresult = fd->interpret(NULL, arguments, dve->e1); +- if (eresult && eresult != EXP_VOID_INTERPRET) +- e = eresult; +- else +- error("cannot evaluate %s at compile time", toChars()); + } + } + #endif +@@ -577,7 +542,7 @@ Expression *CastExp::optimize(int result + //printf("e1->type %s\n", e1->type->toChars()); + //printf("type = %p\n", type); + assert(type); +- enum TOK op1 = e1->op; ++ TOK op1 = e1->op; + #define X 0 + + Expression *e1old = e1; +@@ -596,7 +561,7 @@ Expression *CastExp::optimize(int result + + if ((e1->op == TOKstring || e1->op == TOKarrayliteral) && + (type->ty == Tpointer || type->ty == Tarray) && +- e1->type->nextOf()->size() == type->nextOf()->size() ++ e1->type->toBasetype()->nextOf()->size() == type->nextOf()->size() + ) + { + Expression *e = e1->castTo(NULL, type); +@@ -688,7 +653,7 @@ Expression *BinExp::optimize(int result, + d_uns64 sz = e1->type->size() * 8; + if (i2 < 0 || i2 >= sz) + { error("shift assign by %lld is outside the range 0..%llu", i2, (ulonglong)sz - 1); +- e2 = new IntegerExp(0); ++ return new ErrorExp(); + } + } + } +@@ -701,6 +666,10 @@ Expression *AddExp::optimize(int result, + //printf("AddExp::optimize(%s)\n", toChars()); + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() && e2->isConst()) + { + if (e1->op == TOKsymoff && e2->op == TOKsymoff) +@@ -717,6 +686,10 @@ Expression *MinExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() && e2->isConst()) + { + if (e2->op == TOKsymoff) +@@ -734,6 +707,10 @@ Expression *MulExp::optimize(int result, + //printf("MulExp::optimize(result = %d) %s\n", result, toChars()); + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + { + e = Mul(type, e1, e2); +@@ -749,6 +726,10 @@ Expression *DivExp::optimize(int result, + //printf("DivExp::optimize(%s)\n", toChars()); + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + { + e = Div(type, e1, e2); +@@ -763,6 +744,10 @@ Expression *ModExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + { + e = Mod(type, e1, e2); +@@ -777,13 +762,17 @@ Expression *shift_optimize(int result, B + + e->e1 = e->e1->optimize(result); + e->e2 = e->e2->optimize(result); ++ if (e->e1->op == TOKerror) ++ return e->e1; ++ if (e->e2->op == TOKerror) ++ return e->e2; + if (e->e2->isConst() == 1) + { + sinteger_t i2 = e->e2->toInteger(); + d_uns64 sz = e->e1->type->size() * 8; + if (i2 < 0 || i2 >= sz) + { e->error("shift by %lld is outside the range 0..%llu", i2, (ulonglong)sz - 1); +- e->e2 = new IntegerExp(0); ++ return new ErrorExp(); + } + if (e->e1->isConst() == 1) + ex = (*shift)(e->type, e->e1, e->e2); +@@ -794,19 +783,19 @@ Expression *shift_optimize(int result, B + Expression *ShlExp::optimize(int result, bool keepLvalue) + { + //printf("ShlExp::optimize(result = %d) %s\n", result, toChars()); +- return shift_optimize(result, this, Shl); ++ return shift_optimize(result, this, &Shl); + } + + Expression *ShrExp::optimize(int result, bool keepLvalue) + { + //printf("ShrExp::optimize(result = %d) %s\n", result, toChars()); +- return shift_optimize(result, this, Shr); ++ return shift_optimize(result, this, &Shr); + } + + Expression *UshrExp::optimize(int result, bool keepLvalue) + { + //printf("UshrExp::optimize(result = %d) %s\n", result, toChars()); +- return shift_optimize(result, this, Ushr); ++ return shift_optimize(result, this, &Ushr); + } + + Expression *AndExp::optimize(int result, bool keepLvalue) +@@ -814,6 +803,10 @@ Expression *AndExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + e = And(type, e1, e2); + else +@@ -826,6 +819,10 @@ Expression *OrExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + e = Or(type, e1, e2); + else +@@ -838,6 +835,10 @@ Expression *XorExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + if (e1->isConst() == 1 && e2->isConst() == 1) + e = Xor(type, e1, e2); + else +@@ -850,6 +851,10 @@ Expression *PowExp::optimize(int result, + + e1 = e1->optimize(result); + e2 = e2->optimize(result); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + + // Replace 1 ^^ x or 1.0^^x by (x, 1) + if ((e1->op == TOKint64 && e1->toInteger() == 1) || +@@ -896,7 +901,7 @@ Expression *PowExp::optimize(int result, + else + { + // If e2 *could* have been an integer, make it one. +- if (e2->op == TOKfloat64 && (e2->toReal() == (real_t)(sinteger_t)(e2->toInteger()))) ++ if (e2->op == TOKfloat64 && (e2->toReal() == (sinteger_t)(e2->toReal()))) + e2 = new IntegerExp(loc, e2->toInteger(), Type::tint64); + + if (e1->isConst() == 1 && e2->isConst() == 1) +@@ -907,6 +912,21 @@ Expression *PowExp::optimize(int result, + } + e = this; + } ++ ++ if (e1->op == TOKint64 && e1->toInteger() > 0 && ++ !((e1->toInteger() - 1) & e1->toInteger()) && // is power of two ++ e2->type->isintegral() && e2->type->isunsigned()) ++ { ++ dinteger_t i = e1->toInteger(); ++ dinteger_t mul = 1; ++ while ((i >>= 1) > 1) ++ mul++; ++ Expression *shift = new MulExp(loc, e2, new IntegerExp(loc, mul, e2->type)); ++ shift->type = Type::tshiftcnt; ++ e = new ShlExp(loc, new IntegerExp(loc, 1, e1->type), shift); ++ e->type = type; ++ } ++ + return e; + } + +@@ -920,15 +940,10 @@ Expression *CommaExp::optimize(int resul + // In particular, if the comma returns a temporary variable, it needs + // to be an lvalue (this is particularly important for struct constructors) + +- if (result & WANTinterpret) +- { // Interpreting comma needs special treatment, because it may +- // contain compiler-generated declarations. +- e = interpret(NULL); +- return (e == EXP_CANT_INTERPRET) ? this : e; +- } +- +- e1 = e1->optimize(result & WANTinterpret); ++ e1 = e1->optimize(0); + e2 = e2->optimize(result, keepLvalue); ++ if (e1->op == TOKerror) ++ return e1; + if (!e1 || e1->op == TOKint64 || e1->op == TOKfloat64 || !e1->hasSideEffect()) + { + e = e2; +@@ -945,9 +960,12 @@ Expression *ArrayLengthExp::optimize(int + { Expression *e; + + //printf("ArrayLengthExp::optimize(result = %d) %s\n", result, toChars()); +- e1 = e1->optimize(WANTvalue | WANTexpand | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTvalue | WANTexpand); ++ if (e1->op == TOKerror) ++ return e1; + e = this; +- if (e1->op == TOKstring || e1->op == TOKarrayliteral || e1->op == TOKassocarrayliteral) ++ if (e1->op == TOKstring || e1->op == TOKarrayliteral || e1->op == TOKassocarrayliteral || ++ e1->type->toBasetype()->ty == Tsarray) + { + e = ArrayLength(type, e1); + } +@@ -957,11 +975,15 @@ Expression *ArrayLengthExp::optimize(int + Expression *EqualExp::optimize(int result, bool keepLvalue) + { + //printf("EqualExp::optimize(result = %x) %s\n", result, toChars()); +- e1 = e1->optimize(WANTvalue | (result & WANTinterpret)); +- e2 = e2->optimize(WANTvalue | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTvalue); ++ e2 = e2->optimize(WANTvalue); + + Expression *e1 = fromConstInitializer(result, this->e1); + Expression *e2 = fromConstInitializer(result, this->e2); ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; + + Expression *e = Equal(op, type, e1, e2); + if (e == EXP_CANT_INTERPRET) +@@ -972,12 +994,19 @@ Expression *EqualExp::optimize(int resul + Expression *IdentityExp::optimize(int result, bool keepLvalue) + { + //printf("IdentityExp::optimize(result = %d) %s\n", result, toChars()); +- e1 = e1->optimize(WANTvalue | (result & WANTinterpret)); +- e2 = e2->optimize(WANTvalue | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTvalue); ++ e2 = e2->optimize(WANTvalue); ++ ++ if (e1->op == TOKerror) ++ return e1; ++ if (e2->op == TOKerror) ++ return e2; ++ + Expression *e = this; + + if ((this->e1->isConst() && this->e2->isConst()) || +- (this->e1->op == TOKnull && this->e2->op == TOKnull)) ++ (this->e1->op == TOKnull && this->e2->op == TOKnull) ++ ) + { + e = Identity(op, type, this->e1, this->e2); + if (e == EXP_CANT_INTERPRET) +@@ -1010,8 +1039,8 @@ void setLengthVarIfKnown(VarDeclaration + return; // we don't know the length yet + } + +- Expression *dollar = new IntegerExp(0, len, Type::tsize_t); +- lengthVar->init = new ExpInitializer(0, dollar); ++ Expression *dollar = new IntegerExp(Loc(), len, Type::tsize_t); ++ lengthVar->init = new ExpInitializer(Loc(), dollar); + lengthVar->storage_class |= STCstatic | STCconst; + } + +@@ -1020,25 +1049,16 @@ Expression *IndexExp::optimize(int resul + { Expression *e; + + //printf("IndexExp::optimize(result = %d) %s\n", result, toChars()); +- Expression *e1 = this->e1->optimize( +- WANTvalue | (result & (WANTinterpret| WANTexpand))); +- e1 = fromConstInitializer(result, e1); +- if (this->e1->op == TOKvar) +- { VarExp *ve = (VarExp *)this->e1; +- if (ve->var->storage_class & STCmanifest) +- { /* We generally don't want to have more than one copy of an +- * array literal, but if it's an enum we have to because the +- * enum isn't stored elsewhere. See Bugzilla 2559 +- */ +- this->e1 = e1; +- } +- } ++ e1 = e1->optimize(WANTvalue | (result & WANTexpand)); ++ ++ Expression *ex = fromConstInitializer(result, e1); ++ + // We might know $ now +- setLengthVarIfKnown(lengthVar, e1); +- e2 = e2->optimize(WANTvalue | (result & WANTinterpret)); ++ setLengthVarIfKnown(lengthVar, ex); ++ e2 = e2->optimize(WANTvalue); + if (keepLvalue) + return this; +- e = Index(type, e1, e2); ++ e = Index(type, ex, e2); + if (e == EXP_CANT_INTERPRET) + e = this; + return e; +@@ -1050,7 +1070,7 @@ Expression *SliceExp::optimize(int resul + + //printf("SliceExp::optimize(result = %d) %s\n", result, toChars()); + e = this; +- e1 = e1->optimize(WANTvalue | (result & (WANTinterpret|WANTexpand))); ++ e1 = e1->optimize(WANTvalue | (result & WANTexpand)); + if (!lwr) + { if (e1->op == TOKstring) + { // Convert slice of string literal into dynamic array +@@ -1063,8 +1083,8 @@ Expression *SliceExp::optimize(int resul + e1 = fromConstInitializer(result, e1); + // We might know $ now + setLengthVarIfKnown(lengthVar, e1); +- lwr = lwr->optimize(WANTvalue | (result & WANTinterpret)); +- upr = upr->optimize(WANTvalue | (result & WANTinterpret)); ++ lwr = lwr->optimize(WANTvalue); ++ upr = upr->optimize(WANTvalue); + e = Slice(type, e1, lwr, upr); + if (e == EXP_CANT_INTERPRET) + e = this; +@@ -1076,7 +1096,9 @@ Expression *AndAndExp::optimize(int resu + { Expression *e; + + //printf("AndAndExp::optimize(%d) %s\n", result, toChars()); +- e1 = e1->optimize(WANTflags | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTflags); ++ if (e1->op == TOKerror) ++ return e1; + e = this; + if (e1->isBool(FALSE)) + { +@@ -1090,9 +1112,12 @@ Expression *AndAndExp::optimize(int resu + } + else + { +- e2 = e2->optimize(WANTflags | (result & WANTinterpret)); ++ e2 = e2->optimize(WANTflags); + if (result && e2->type->toBasetype()->ty == Tvoid && !global.errors) ++ { + error("void has no value"); ++ return new ErrorExp(); ++ } + if (e1->isConst()) + { + if (e2->isConst()) +@@ -1115,7 +1140,9 @@ Expression *AndAndExp::optimize(int resu + Expression *OrOrExp::optimize(int result, bool keepLvalue) + { Expression *e; + +- e1 = e1->optimize(WANTflags | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTflags); ++ if (e1->op == TOKerror) ++ return e1; + e = this; + if (e1->isBool(TRUE)) + { // Replace with (e1, 1) +@@ -1125,9 +1152,12 @@ Expression *OrOrExp::optimize(int result + } + else + { +- e2 = e2->optimize(WANTflags | (result & WANTinterpret)); ++ e2 = e2->optimize(WANTflags); + if (result && e2->type->toBasetype()->ty == Tvoid && !global.errors) ++ { + error("void has no value"); ++ return new ErrorExp(); ++ } + if (e1->isConst()) + { + if (e2->isConst()) +@@ -1152,8 +1182,8 @@ Expression *CmpExp::optimize(int result, + { Expression *e; + + //printf("CmpExp::optimize() %s\n", toChars()); +- e1 = e1->optimize(WANTvalue | (result & WANTinterpret)); +- e2 = e2->optimize(WANTvalue | (result & WANTinterpret)); ++ e1 = e1->optimize(WANTvalue); ++ e2 = e2->optimize(WANTvalue); + + Expression *e1 = fromConstInitializer(result, this->e1); + Expression *e2 = fromConstInitializer(result, this->e2); +@@ -1180,7 +1210,7 @@ Expression *CatExp::optimize(int result, + Expression *CondExp::optimize(int result, bool keepLvalue) + { Expression *e; + +- econd = econd->optimize(WANTflags | (result & WANTinterpret)); ++ econd = econd->optimize(WANTflags); + if (econd->isBool(TRUE)) + e = e1->optimize(result, keepLvalue); + else if (econd->isBool(FALSE)) +--- a/src/gcc/d/dfrontend/outbuffer.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/outbuffer.c 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,412 @@ ++ ++// Copyright (c) 1999-2012 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "outbuffer.h" ++#include "object.h" ++#include "rmem.h" ++ ++OutBuffer::OutBuffer() ++{ ++ data = NULL; ++ offset = 0; ++ size = 0; ++ ++ doindent = 0; ++ level = 0; ++ notlinehead = 0; ++} ++ ++OutBuffer::~OutBuffer() ++{ ++ mem.free(data); ++} ++ ++char *OutBuffer::extractData() ++{ ++ char *p; ++ ++ p = (char *)data; ++ data = NULL; ++ offset = 0; ++ size = 0; ++ return p; ++} ++ ++void OutBuffer::reserve(size_t nbytes) ++{ ++ //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes); ++ if (size - offset < nbytes) ++ { ++ size = (offset + nbytes) * 2; ++ size = (size + 15) & ~15; ++ data = (utf8_t *)mem.realloc(data, size); ++ } ++} ++ ++void OutBuffer::reset() ++{ ++ offset = 0; ++} ++ ++void OutBuffer::setsize(size_t size) ++{ ++ offset = size; ++} ++ ++void OutBuffer::write(const void *data, size_t nbytes) ++{ ++ if (doindent && !notlinehead) ++ { ++ if (level) ++ { ++ reserve(level); ++ for (size_t i=0; idata[offset] = '\t'; ++ offset++; ++ } ++ } ++ notlinehead = 1; ++ } ++ reserve(nbytes); ++ memcpy(this->data + offset, data, nbytes); ++ offset += nbytes; ++} ++ ++void OutBuffer::writebstring(utf8_t *string) ++{ ++ write(string,*string + 1); ++} ++ ++void OutBuffer::writestring(const char *string) ++{ ++ write(string,strlen(string)); ++} ++ ++void OutBuffer::prependstring(const char *string) ++{ ++ size_t len = strlen(string); ++ reserve(len); ++ memmove(data + len, data, offset); ++ memcpy(data, string, len); ++ offset += len; ++} ++ ++void OutBuffer::writenl() ++{ ++#if _WIN32 ++ writeword(0x0A0D); // newline is CR,LF on Microsoft OS's ++#else ++ writeByte('\n'); ++#endif ++ if (doindent) ++ notlinehead = 0; ++} ++ ++void OutBuffer::writeByte(unsigned b) ++{ ++ if (doindent && !notlinehead ++ && b != '\n') ++ { ++ if (level) ++ { ++ reserve(level); ++ for (size_t i=0; idata[offset] = '\t'; ++ offset++; ++ } ++ } ++ notlinehead = 1; ++ } ++ reserve(1); ++ this->data[offset] = (unsigned char)b; ++ offset++; ++} ++ ++void OutBuffer::writeUTF8(unsigned b) ++{ ++ reserve(6); ++ if (b <= 0x7F) ++ { ++ this->data[offset] = (unsigned char)b; ++ offset++; ++ } ++ else if (b <= 0x7FF) ++ { ++ this->data[offset + 0] = (unsigned char)((b >> 6) | 0xC0); ++ this->data[offset + 1] = (unsigned char)((b & 0x3F) | 0x80); ++ offset += 2; ++ } ++ else if (b <= 0xFFFF) ++ { ++ this->data[offset + 0] = (unsigned char)((b >> 12) | 0xE0); ++ this->data[offset + 1] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); ++ this->data[offset + 2] = (unsigned char)((b & 0x3F) | 0x80); ++ offset += 3; ++ } ++ else if (b <= 0x1FFFFF) ++ { ++ this->data[offset + 0] = (unsigned char)((b >> 18) | 0xF0); ++ this->data[offset + 1] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); ++ this->data[offset + 2] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); ++ this->data[offset + 3] = (unsigned char)((b & 0x3F) | 0x80); ++ offset += 4; ++ } ++ else if (b <= 0x3FFFFFF) ++ { ++ this->data[offset + 0] = (unsigned char)((b >> 24) | 0xF8); ++ this->data[offset + 1] = (unsigned char)(((b >> 18) & 0x3F) | 0x80); ++ this->data[offset + 2] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); ++ this->data[offset + 3] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); ++ this->data[offset + 4] = (unsigned char)((b & 0x3F) | 0x80); ++ offset += 5; ++ } ++ else if (b <= 0x7FFFFFFF) ++ { ++ this->data[offset + 0] = (unsigned char)((b >> 30) | 0xFC); ++ this->data[offset + 1] = (unsigned char)(((b >> 24) & 0x3F) | 0x80); ++ this->data[offset + 2] = (unsigned char)(((b >> 18) & 0x3F) | 0x80); ++ this->data[offset + 3] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); ++ this->data[offset + 4] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); ++ this->data[offset + 5] = (unsigned char)((b & 0x3F) | 0x80); ++ offset += 6; ++ } ++ else ++ assert(0); ++} ++ ++void OutBuffer::prependbyte(unsigned b) ++{ ++ reserve(1); ++ memmove(data + 1, data, offset); ++ data[0] = (unsigned char)b; ++ offset++; ++} ++ ++void OutBuffer::writewchar(unsigned w) ++{ ++#if _WIN32 ++ writeword(w); ++#else ++ write4(w); ++#endif ++} ++ ++void OutBuffer::writeword(unsigned w) ++{ ++#if _WIN32 ++ unsigned newline = 0x0A0D; ++#else ++ unsigned newline = '\n'; ++#endif ++ if (doindent && !notlinehead ++ && w != newline) ++ { ++ if (level) ++ { ++ reserve(level); ++ for (size_t i=0; idata[offset] = '\t'; ++ offset++; ++ } ++ } ++ notlinehead = 1; ++ } ++ reserve(2); ++ *(unsigned short *)(this->data + offset) = (unsigned short)w; ++ offset += 2; ++} ++ ++void OutBuffer::writeUTF16(unsigned w) ++{ ++ reserve(4); ++ if (w <= 0xFFFF) ++ { ++ *(unsigned short *)(this->data + offset) = (unsigned short)w; ++ offset += 2; ++ } ++ else if (w <= 0x10FFFF) ++ { ++ *(unsigned short *)(this->data + offset) = (unsigned short)((w >> 10) + 0xD7C0); ++ *(unsigned short *)(this->data + offset + 2) = (unsigned short)((w & 0x3FF) | 0xDC00); ++ offset += 4; ++ } ++ else ++ assert(0); ++} ++ ++void OutBuffer::write4(unsigned w) ++{ ++#if _WIN32 ++ bool notnewline = w != 0x000A000D; ++#else ++ bool notnewline = true; ++#endif ++ if (doindent && !notlinehead && notnewline) ++ { ++ if (level) ++ { ++ reserve(level); ++ for (size_t i=0; idata[offset] = '\t'; ++ offset++; ++ } ++ } ++ notlinehead = 1; ++ } ++ reserve(4); ++ *(unsigned *)(this->data + offset) = w; ++ offset += 4; ++} ++ ++void OutBuffer::write(OutBuffer *buf) ++{ ++ if (buf) ++ { reserve(buf->offset); ++ memcpy(data + offset, buf->data, buf->offset); ++ offset += buf->offset; ++ } ++} ++ ++void OutBuffer::write(RootObject *obj) ++{ ++ if (obj) ++ { ++ writestring(obj->toChars()); ++ } ++} ++ ++void OutBuffer::fill0(size_t nbytes) ++{ ++ reserve(nbytes); ++ memset(data + offset,0,nbytes); ++ offset += nbytes; ++} ++ ++void OutBuffer::align(size_t size) ++{ ++ size_t nbytes = ((offset + size - 1) & ~(size - 1)) - offset; ++ fill0(nbytes); ++} ++ ++void OutBuffer::vprintf(const char *format, va_list args) ++{ ++ char buffer[128]; ++ char *p; ++ unsigned psize; ++ int count; ++ ++ p = buffer; ++ psize = sizeof(buffer); ++ for (;;) ++ { ++#if _WIN32 ++ count = _vsnprintf(p,psize,format,args); ++ if (count != -1) ++ break; ++ psize *= 2; ++#elif POSIX ++ va_list va; ++ va_copy(va, args); ++/* ++ The functions vprintf(), vfprintf(), vsprintf(), vsnprintf() ++ are equivalent to the functions printf(), fprintf(), sprintf(), ++ snprintf(), respectively, except that they are called with a ++ va_list instead of a variable number of arguments. These ++ functions do not call the va_end macro. Consequently, the value ++ of ap is undefined after the call. The application should call ++ va_end(ap) itself afterwards. ++ */ ++ count = vsnprintf(p,psize,format,va); ++ va_end(va); ++ if (count == -1) ++ psize *= 2; ++ else if (count >= psize) ++ psize = count + 1; ++ else ++ break; ++#else ++ assert(0); ++#endif ++ p = (char *) alloca(psize); // buffer too small, try again with larger size ++ } ++ write(p,count); ++} ++ ++void OutBuffer::printf(const char *format, ...) ++{ ++ va_list ap; ++ va_start(ap, format); ++ vprintf(format,ap); ++ va_end(ap); ++} ++ ++void OutBuffer::bracket(char left, char right) ++{ ++ reserve(2); ++ memmove(data + 1, data, offset); ++ data[0] = left; ++ data[offset + 1] = right; ++ offset += 2; ++} ++ ++/****************** ++ * Insert left at i, and right at j. ++ * Return index just past right. ++ */ ++ ++size_t OutBuffer::bracket(size_t i, const char *left, size_t j, const char *right) ++{ ++ size_t leftlen = strlen(left); ++ size_t rightlen = strlen(right); ++ reserve(leftlen + rightlen); ++ insert(i, left, leftlen); ++ insert(j + leftlen, right, rightlen); ++ return j + leftlen + rightlen; ++} ++ ++void OutBuffer::spread(size_t offset, size_t nbytes) ++{ ++ reserve(nbytes); ++ memmove(data + offset + nbytes, data + offset, ++ this->offset - offset); ++ this->offset += nbytes; ++} ++ ++/**************************************** ++ * Returns: offset + nbytes ++ */ ++ ++size_t OutBuffer::insert(size_t offset, const void *p, size_t nbytes) ++{ ++ spread(offset, nbytes); ++ memmove(data + offset, p, nbytes); ++ return offset + nbytes; ++} ++ ++void OutBuffer::remove(size_t offset, size_t nbytes) ++{ ++ memmove(data + offset, data + offset + nbytes, this->offset - (offset + nbytes)); ++ this->offset -= nbytes; ++} ++ ++char *OutBuffer::toChars() ++{ ++ writeByte(0); ++ return (char *)data; ++} +--- a/src/gcc/d/dfrontend/outbuffer.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/outbuffer.h 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,70 @@ ++ ++// Copyright (c) 1999-2011 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#ifndef OUTBUFFER_H ++#define OUTBUFFER_H ++ ++#include ++#include ++#include ++#include ++#include "port.h" ++ ++#if __DMC__ ++#pragma once ++#endif ++ ++class RootObject; ++ ++struct OutBuffer ++{ ++ unsigned char *data; ++ size_t offset; ++ size_t size; ++ ++ int doindent; ++ int level; ++ int notlinehead; ++ ++ OutBuffer(); ++ ~OutBuffer(); ++ char *extractData(); ++ ++ void reserve(size_t nbytes); ++ void setsize(size_t size); ++ void reset(); ++ void write(const void *data, size_t nbytes); ++ void writebstring(utf8_t *string); ++ void writestring(const char *string); ++ void prependstring(const char *string); ++ void writenl(); // write newline ++ void writeByte(unsigned b); ++ void writebyte(unsigned b) { writeByte(b); } ++ void writeUTF8(unsigned b); ++ void prependbyte(unsigned b); ++ void writewchar(unsigned w); ++ void writeword(unsigned w); ++ void writeUTF16(unsigned w); ++ void write4(unsigned w); ++ void write(OutBuffer *buf); ++ void write(RootObject *obj); ++ void fill0(size_t nbytes); ++ void align(size_t size); ++ void vprintf(const char *format, va_list args); ++ void printf(const char *format, ...); ++ void bracket(char left, char right); ++ size_t bracket(size_t i, const char *left, size_t j, const char *right); ++ void spread(size_t offset, size_t nbytes); ++ size_t insert(size_t offset, const void *data, size_t nbytes); ++ void remove(size_t offset, size_t nbytes); ++ char *toChars(); ++ char *extractString(); ++}; ++ ++#endif +--- a/src/gcc/d/dfrontend/parse.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/parse.c 2014-04-01 16:32:51.000000000 +0100 +@@ -55,15 +55,15 @@ + // Support D1 inout + #define D1INOUT 0 + +-Parser::Parser(Module *module, unsigned char *base, size_t length, int doDocComment) ++Parser::Parser(Module *module, utf8_t *base, size_t length, int doDocComment) + : Lexer(module, base, 0, length, doDocComment, 0) + { + //printf("Parser::Parser()\n"); + md = NULL; + linkage = LINKd; +- endloc = 0; ++ endloc = Loc(); + inBrackets = 0; +- lookingForElse = 0; ++ lookingForElse = Loc(); + //nextToken(); // start up the scanner + } + +@@ -74,7 +74,8 @@ Dsymbols *Parser::parseModule() + // ModuleDeclation leads off + if (token.value == TOKmodule) + { +- unsigned char *comment = token.blockComment; ++ Loc loc = token.loc; ++ utf8_t *comment = token.blockComment; + bool safe = FALSE; + + nextToken(); +@@ -120,7 +121,7 @@ Dsymbols *Parser::parseModule() + id = token.ident; + } + +- md = new ModuleDeclaration(a, id, safe); ++ md = new ModuleDeclaration(loc, a, id, safe); + + if (token.value != TOKsemicolon) + error("';' expected following module declaration instead of %s", token.toChars()); +@@ -131,7 +132,8 @@ Dsymbols *Parser::parseModule() + + decldefs = parseDeclDefs(0); + if (token.value != TOKeof) +- { error(loc, "unrecognized declaration"); ++ { ++ error(token.loc, "unrecognized declaration"); + goto Lerr; + } + return decldefs; +@@ -143,16 +145,19 @@ Lerr: + return new Dsymbols(); + } + +-Dsymbols *Parser::parseDeclDefs(int once) ++Dsymbols *Parser::parseDeclDefs(int once, Dsymbol **pLastDecl) + { Dsymbol *s; + Dsymbols *decldefs; + Dsymbols *a; + Dsymbols *aelse; +- enum PROT prot; ++ PROT prot; + StorageClass stc; + StorageClass storageClass; + Condition *condition; +- unsigned char *comment; ++ utf8_t *comment; ++ Dsymbol *lastDecl = NULL; // used to link unittest to its previous declaration ++ if (!pLastDecl) ++ pLastDecl = &lastDecl; + + //printf("Parser::parseDeclDefs()\n"); + decldefs = new Dsymbols(); +@@ -192,7 +197,8 @@ Dsymbols *Parser::parseDeclDefs(int once + break; + + case TOKmixin: +- { Loc loc = this->loc; ++ { ++ Loc loc = token.loc; + switch (peekNext()) + { + case TOKlparen: +@@ -232,6 +238,7 @@ Dsymbols *Parser::parseDeclDefs(int once + case TOKinterface: + Ldeclaration: + a = parseDeclarations(STCundefined, NULL); ++ if (a->dim) *pLastDecl = (*a)[a->dim-1]; + decldefs->append(a); + continue; + +@@ -260,7 +267,7 @@ Dsymbols *Parser::parseDeclDefs(int once + } + else + { +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + stc = STCimmutable; + goto Lstc; + } +@@ -269,20 +276,7 @@ Dsymbols *Parser::parseDeclDefs(int once + + case TOKunittest: + s = parseUnitTest(); +- if (decldefs && decldefs->dim) +- { +- Dsymbol *ds = (*decldefs)[decldefs->dim-1]; +- AttribDeclaration *ad; +- while ((ad = ds->isAttribDeclaration()) != NULL) +- { +- if (ad->decl && ad->decl->dim) +- ds = (*ad->decl)[ad->decl->dim-1]; +- else +- break; +- } +- +- ds->unittest = (UnitTestDeclaration *)s; +- } ++ if (*pLastDecl) (*pLastDecl)->ddocUnittest = (UnitTestDeclaration *)s; + break; + + case TOKnew: +@@ -308,17 +302,23 @@ Dsymbols *Parser::parseDeclDefs(int once + else if (token.value == TOKassert) + s = parseStaticAssert(); + else if (token.value == TOKif) +- { condition = parseStaticIfCondition(); +- Loc lookingForElseSave = lookingForElse; +- lookingForElse = loc; +- a = parseBlock(); +- lookingForElse = lookingForElseSave; ++ { ++ condition = parseStaticIfCondition(); ++ if (token.value == TOKcolon) ++ a = parseBlock(pLastDecl); ++ else ++ { ++ Loc lookingForElseSave = lookingForElse; ++ lookingForElse = token.loc; ++ a = parseBlock(pLastDecl); ++ lookingForElse = lookingForElseSave; ++ } + aelse = NULL; + if (token.value == TOKelse) + { +- Loc elseloc = this->loc; ++ Loc elseloc = token.loc; + nextToken(); +- aelse = parseBlock(); ++ aelse = parseBlock(pLastDecl); + checkDanglingElse(elseloc); + } + s = new StaticIfDeclaration(condition, a, aelse); +@@ -381,7 +381,6 @@ Dsymbols *Parser::parseDeclDefs(int once + case TOKnothrow: stc = STCnothrow; goto Lstc; + case TOKpure: stc = STCpure; goto Lstc; + case TOKref: stc = STCref; goto Lstc; +- case TOKtls: stc = STCtls; goto Lstc; + case TOKgshared: stc = STCgshared; goto Lstc; + //case TOKmanifest: stc = STCmanifest; goto Lstc; + case TOKat: +@@ -390,7 +389,7 @@ Dsymbols *Parser::parseDeclDefs(int once + stc = parseAttribute(&exps); + if (stc) + goto Lstc; // it's a predefined attribute +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new UserAttributeDeclaration(exps, a); + break; + } +@@ -398,7 +397,7 @@ Dsymbols *Parser::parseDeclDefs(int once + + Lstc: + if (storageClass & stc) +- error("redundant storage class %s", Token::toChars(token.value)); ++ error("redundant storage class '%s'", Token::toChars(token.value)); + composeStorageClass(storageClass | stc); + nextToken(); + Lstc2: +@@ -428,7 +427,7 @@ Dsymbols *Parser::parseDeclDefs(int once + else + { + if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + stc = STCimmutable; + } + goto Lstc; +@@ -446,7 +445,6 @@ Dsymbols *Parser::parseDeclDefs(int once + case TOKnothrow: stc = STCnothrow; goto Lstc; + case TOKpure: stc = STCpure; goto Lstc; + case TOKref: stc = STCref; goto Lstc; +- case TOKtls: stc = STCtls; goto Lstc; + case TOKgshared: stc = STCgshared; goto Lstc; + //case TOKmanifest: stc = STCmanifest; goto Lstc; + case TOKat: +@@ -468,6 +466,7 @@ Dsymbols *Parser::parseDeclDefs(int once + peek(&token)->value == TOKassign) + { + a = parseAutoDeclarations(storageClass, comment); ++ if (a->dim) *pLastDecl = (*a)[a->dim-1]; + decldefs->append(a); + continue; + } +@@ -488,10 +487,11 @@ Dsymbols *Parser::parseDeclDefs(int once + ) + { + a = parseDeclarations(storageClass, comment); ++ if (a->dim) *pLastDecl = (*a)[a->dim-1]; + decldefs->append(a); + continue; + } +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new StorageClassDeclaration(storageClass, a); + break; + +@@ -506,16 +506,16 @@ Dsymbols *Parser::parseDeclDefs(int once + check(TOKlparen); + Expression *e = parseAssignExp(); + check(TOKrparen); +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new DeprecatedDeclaration(e, a); + break; + } + + case TOKlbracket: + { +- warning(loc, "use @(attributes) instead of [attributes]"); ++ warning(token.loc, "use @(attributes) instead of [attributes]"); + Expressions *exps = parseArguments(); +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new UserAttributeDeclaration(exps, a); + break; + } +@@ -526,9 +526,9 @@ Dsymbols *Parser::parseDeclDefs(int once + goto Lstc; + } + { +- enum LINK linksave = linkage; ++ LINK linksave = linkage; + linkage = parseLinkage(); +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new LinkDeclaration(linkage, a); + linkage = linksave; + break; +@@ -552,7 +552,7 @@ Dsymbols *Parser::parseDeclDefs(int once + break; + default: break; + } +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new ProtDeclaration(prot, a); + break; + +@@ -578,16 +578,17 @@ Dsymbols *Parser::parseDeclDefs(int once + check(TOKrparen); + } + else +- n = global.structalign; // default ++ n = STRUCTALIGN_DEFAULT; // default + +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new AlignDeclaration(n, a); + break; + } + + case TOKpragma: +- { Identifier *ident; ++ { + Expressions *args = NULL; ++ Loc loc = token.loc; + + nextToken(); + check(TOKlparen); +@@ -595,7 +596,7 @@ Dsymbols *Parser::parseDeclDefs(int once + { error("pragma(identifier) expected"); + goto Lerror; + } +- ident = token.ident; ++ Identifier *ident = token.ident; + nextToken(); + if (token.value == TOKcomma && peekNext() != TOKrparen) + args = parseArguments(); // pragma(identifier, args...) +@@ -605,7 +606,7 @@ Dsymbols *Parser::parseDeclDefs(int once + if (token.value == TOKsemicolon) + a = NULL; + else +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + s = new PragmaDeclaration(loc, ident, args, a); + break; + } +@@ -616,9 +617,9 @@ Dsymbols *Parser::parseDeclDefs(int once + { + nextToken(); + if (token.value == TOKidentifier) +- s = new DebugSymbol(loc, token.ident); ++ s = new DebugSymbol(token.loc, token.ident); + else if (token.value == TOKint32v || token.value == TOKint64v) +- s = new DebugSymbol(loc, (unsigned)token.uns64value); ++ s = new DebugSymbol(token.loc, (unsigned)token.uns64value); + else + { error("identifier or integer expected, not %s", token.toChars()); + s = NULL; +@@ -639,9 +640,9 @@ Dsymbols *Parser::parseDeclDefs(int once + { + nextToken(); + if (token.value == TOKidentifier) +- s = new VersionSymbol(loc, token.ident); ++ s = new VersionSymbol(token.loc, token.ident); + else if (token.value == TOKint32v || token.value == TOKint64v) +- s = new VersionSymbol(loc, (unsigned)token.uns64value); ++ s = new VersionSymbol(token.loc, (unsigned)token.uns64value); + else + { error("identifier or integer expected, not %s", token.toChars()); + s = NULL; +@@ -658,21 +659,21 @@ Dsymbols *Parser::parseDeclDefs(int once + Lcondition: + { + if (token.value == TOKcolon) +- a = parseBlock(); ++ a = parseBlock(pLastDecl); + else + { + Loc lookingForElseSave = lookingForElse; +- lookingForElse = loc; +- a = parseBlock(); ++ lookingForElse = token.loc; ++ a = parseBlock(pLastDecl); + lookingForElse = lookingForElseSave; + } + } + aelse = NULL; + if (token.value == TOKelse) + { +- Loc elseloc = this->loc; ++ Loc elseloc = token.loc; + nextToken(); +- aelse = parseBlock(); ++ aelse = parseBlock(pLastDecl); + checkDanglingElse(elseloc); + } + s = new ConditionalDeclaration(condition, a, aelse); +@@ -695,6 +696,8 @@ Dsymbols *Parser::parseDeclDefs(int once + if (s) + { decldefs->push(s); + addComment(s, comment); ++ if (!s->isAttribDeclaration()) ++ *pLastDecl = s; + } + } while (!once); + return decldefs; +@@ -755,7 +758,10 @@ StorageClass Parser::parseAttribute(Expr + { // Allow identifier, template instantiation, or function call + Expression *exp = parsePrimaryExp(); + if (token.value == TOKlparen) ++ { ++ Loc loc = token.loc; + exp = new CallExp(loc, exp, parseArguments()); ++ } + + udas = new Expressions(); + udas->push(exp); +@@ -798,7 +804,7 @@ StorageClass Parser::parsePostfix() + { + case TOKconst: stc |= STCconst; break; + case TOKinvariant: +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + case TOKimmutable: stc |= STCimmutable; break; + case TOKshared: stc |= STCshared; break; + case TOKwild: stc |= STCwild; break; +@@ -832,7 +838,7 @@ StorageClass Parser::parseTypeCtor() + { + case TOKconst: stc |= STCconst; break; + case TOKinvariant: +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + case TOKimmutable: stc |= STCimmutable; break; + case TOKshared: stc |= STCshared; break; + case TOKwild: stc |= STCwild; break; +@@ -848,7 +854,7 @@ StorageClass Parser::parseTypeCtor() + * Parse declarations after an align, protection, or extern decl. + */ + +-Dsymbols *Parser::parseBlock() ++Dsymbols *Parser::parseBlock(Dsymbol **pLastDecl) + { + Dsymbols *a = NULL; + +@@ -867,10 +873,10 @@ Dsymbols *Parser::parseBlock() + case TOKlcurly: + { + Loc lookingForElseSave = lookingForElse; +- lookingForElse = 0; ++ lookingForElse = Loc(); + + nextToken(); +- a = parseDeclDefs(0); ++ a = parseDeclDefs(0, pLastDecl); + if (token.value != TOKrcurly) + { /* { */ + error("matching '}' expected, not %s", token.toChars()); +@@ -886,12 +892,12 @@ Dsymbols *Parser::parseBlock() + #if 0 + a = NULL; + #else +- a = parseDeclDefs(0); // grab declarations up to closing curly bracket ++ a = parseDeclDefs(0, pLastDecl); // grab declarations up to closing curly bracket + #endif + break; + + default: +- a = parseDeclDefs(1); ++ a = parseDeclDefs(1, pLastDecl); + break; + } + return a; +@@ -903,7 +909,7 @@ Dsymbols *Parser::parseBlock() + + StaticAssert *Parser::parseStaticAssert() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + Expression *exp; + Expression *msg = NULL; + +@@ -927,8 +933,9 @@ StaticAssert *Parser::parseStaticAssert( + + #if DMDV2 + TypeQualified *Parser::parseTypeof() +-{ TypeQualified *t; +- Loc loc = this->loc; ++{ ++ TypeQualified *t; ++ Loc loc = token.loc; + + nextToken(); + check(TOKlparen); +@@ -938,7 +945,8 @@ TypeQualified *Parser::parseTypeof() + t = new TypeReturn(loc); + } + else +- { Expression *exp = parseExpression(); // typeof(expression) ++ { ++ Expression *exp = parseExpression(); // typeof(expression) + t = new TypeTypeof(loc, exp); + } + check(TOKrparen); +@@ -954,7 +962,7 @@ TypeQualified *Parser::parseTypeof() + #if DMDV2 + Type *Parser::parseVector() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + nextToken(); + check(TOKlparen); + Type *tb = parseType(); +@@ -968,9 +976,9 @@ Type *Parser::parseVector() + * The parser is on the 'extern' token. + */ + +-enum LINK Parser::parseLinkage() ++LINK Parser::parseLinkage() + { +- enum LINK link = LINKdefault; ++ LINK link = LINKdefault; + nextToken(); + assert(token.value == TOKlparen); + nextToken(); +@@ -1089,9 +1097,10 @@ Condition *Parser::parseVersionCondition + */ + + Condition *Parser::parseStaticIfCondition() +-{ Expression *exp; ++{ ++ Expression *exp; + Condition *condition; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + if (token.value == TOKlparen) +@@ -1101,7 +1110,8 @@ Condition *Parser::parseStaticIfConditio + check(TOKrparen); + } + else +- { error("(expression) expected following static if"); ++ { ++ error("(expression) expected following static if"); + exp = NULL; + } + condition = new StaticIfCondition(loc, exp); +@@ -1121,16 +1131,17 @@ Condition *Parser::parseStaticIfConditio + + Dsymbol *Parser::parseCtor() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); +- if (token.value == TOKlparen && peek(&token)->value == TOKthis) +- { // this(this) { ... } ++ if (token.value == TOKlparen && peekNext() == TOKthis && peekNext2() == TOKrparen) ++ { ++ // this(this) { ... } + nextToken(); + nextToken(); + check(TOKrparen); + StorageClass stc = parsePostfix(); +- PostBlitDeclaration *f = new PostBlitDeclaration(loc, 0, stc, Id::_postblit); ++ PostBlitDeclaration *f = new PostBlitDeclaration(loc, Loc(), stc, Id::_postblit); + parseContracts(f); + return f; + } +@@ -1141,7 +1152,8 @@ Dsymbol *Parser::parseCtor() + */ + TemplateParameters *tpl = NULL; + if (token.value == TOKlparen && peekPastParen(&token)->value == TOKlparen) +- { tpl = parseTemplateParameterList(); ++ { ++ tpl = parseTemplateParameterList(); + + int varargs; + Parameters *parameters = parseParameters(&varargs); +@@ -1152,7 +1164,7 @@ Dsymbol *Parser::parseCtor() + Type *tf = new TypeFunction(parameters, NULL, varargs, linkage, stc); // RetrunType -> auto + tf = tf->addSTC(stc); + +- CtorDeclaration *f = new CtorDeclaration(loc, 0, stc, tf); ++ CtorDeclaration *f = new CtorDeclaration(loc, Loc(), stc, tf); + parseContracts(f); + + // Wrap a template around it +@@ -1171,7 +1183,7 @@ Dsymbol *Parser::parseCtor() + Type *tf = new TypeFunction(parameters, NULL, varargs, linkage, stc); // RetrunType -> auto + tf = tf->addSTC(stc); + +- CtorDeclaration *f = new CtorDeclaration(loc, 0, stc, tf); ++ CtorDeclaration *f = new CtorDeclaration(loc, Loc(), stc, tf); + parseContracts(f); + return f; + } +@@ -1185,14 +1197,15 @@ Dsymbol *Parser::parseCtor() + DtorDeclaration *Parser::parseDtor() + { + DtorDeclaration *f; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + check(TOKthis); + check(TOKlparen); + check(TOKrparen); + +- f = new DtorDeclaration(loc, 0); ++ StorageClass stc = parsePostfix(); ++ f = new DtorDeclaration(loc, Loc(), stc, Id::dtor); + parseContracts(f); + return f; + } +@@ -1205,13 +1218,13 @@ DtorDeclaration *Parser::parseDtor() + + StaticCtorDeclaration *Parser::parseStaticCtor() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + check(TOKlparen); + check(TOKrparen); + +- StaticCtorDeclaration *f = new StaticCtorDeclaration(loc, 0); ++ StaticCtorDeclaration *f = new StaticCtorDeclaration(loc, Loc()); + parseContracts(f); + return f; + } +@@ -1224,7 +1237,7 @@ StaticCtorDeclaration *Parser::parseStat + + SharedStaticCtorDeclaration *Parser::parseSharedStaticCtor() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + nextToken(); +@@ -1232,7 +1245,7 @@ SharedStaticCtorDeclaration *Parser::par + check(TOKlparen); + check(TOKrparen); + +- SharedStaticCtorDeclaration *f = new SharedStaticCtorDeclaration(loc, 0); ++ SharedStaticCtorDeclaration *f = new SharedStaticCtorDeclaration(loc, Loc()); + parseContracts(f); + return f; + } +@@ -1245,14 +1258,17 @@ SharedStaticCtorDeclaration *Parser::par + + StaticDtorDeclaration *Parser::parseStaticDtor() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + check(TOKthis); + check(TOKlparen); + check(TOKrparen); ++ StorageClass stc = parsePostfix(); ++ if (stc & STCshared) ++ error("to create a 'shared' static destructor, move 'shared' in front of the declaration"); + +- StaticDtorDeclaration *f = new StaticDtorDeclaration(loc, 0); ++ StaticDtorDeclaration *f = new StaticDtorDeclaration(loc, Loc(), stc); + parseContracts(f); + return f; + } +@@ -1265,7 +1281,7 @@ StaticDtorDeclaration *Parser::parseStat + + SharedStaticDtorDeclaration *Parser::parseSharedStaticDtor() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + nextToken(); +@@ -1273,8 +1289,11 @@ SharedStaticDtorDeclaration *Parser::par + check(TOKthis); + check(TOKlparen); + check(TOKrparen); ++ StorageClass stc = parsePostfix(); ++ if (stc & STCshared) ++ error("static destructor is 'shared' already"); + +- SharedStaticDtorDeclaration *f = new SharedStaticDtorDeclaration(loc, 0); ++ SharedStaticDtorDeclaration *f = new SharedStaticDtorDeclaration(loc, Loc(), stc); + parseContracts(f); + return f; + } +@@ -1288,7 +1307,7 @@ SharedStaticDtorDeclaration *Parser::par + InvariantDeclaration *Parser::parseInvariant() + { + InvariantDeclaration *f; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + if (token.value == TOKlparen) // optional () +@@ -1297,7 +1316,7 @@ InvariantDeclaration *Parser::parseInvar + check(TOKrparen); + } + +- f = new InvariantDeclaration(loc, 0); ++ f = new InvariantDeclaration(loc, Loc(), STCundefined); + f->fbody = parseStatement(PScurly); + return f; + } +@@ -1312,13 +1331,36 @@ UnitTestDeclaration *Parser::parseUnitTe + { + UnitTestDeclaration *f; + Statement *body; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); ++ utf8_t *begPtr = token.ptr + 1; // skip '{' ++ utf8_t *endPtr = NULL; ++ body = parseStatement(PScurly, &endPtr); + +- body = parseStatement(PScurly); ++ /** Extract unittest body as a string. Must be done eagerly since memory ++ will be released by the lexer before doc gen. */ ++ char *docline = NULL; ++ if (global.params.doDocComments && endPtr > begPtr) ++ { ++ /* Remove trailing whitespaces */ ++ for (utf8_t *p = endPtr - 1; ++ begPtr <= p && (*p == ' ' || *p == '\n' || *p == '\t'); --p) ++ { ++ endPtr = p; ++ } + +- f = new UnitTestDeclaration(loc, this->loc); ++ size_t len = endPtr - begPtr; ++ if (len > 0) ++ { ++ docline = (char *)mem.malloc(len + 2); ++ memcpy(docline, begPtr, len); ++ docline[len ] = '\n'; // Terminate all lines by LF ++ docline[len+1] = '\0'; ++ } ++ } ++ ++ f = new UnitTestDeclaration(loc, token.loc, docline); + f->fbody = body; + return f; + } +@@ -1334,11 +1376,11 @@ NewDeclaration *Parser::parseNew() + NewDeclaration *f; + Parameters *arguments; + int varargs; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + arguments = parseParameters(&varargs); +- f = new NewDeclaration(loc, 0, arguments, varargs); ++ f = new NewDeclaration(loc, Loc(), arguments, varargs); + parseContracts(f); + return f; + } +@@ -1354,13 +1396,13 @@ DeleteDeclaration *Parser::parseDelete() + DeleteDeclaration *f; + Parameters *arguments; + int varargs; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + arguments = parseParameters(&varargs); + if (varargs) + error("... not allowed in delete function parameter list"); +- f = new DeleteDeclaration(loc, 0, arguments); ++ f = new DeleteDeclaration(loc, Loc(), arguments); + parseContracts(f); + return f; + } +@@ -1408,7 +1450,7 @@ Parameters *Parser::parseParameters(int + if (peek(&token)->value == TOKlparen) + goto Ldefault; + if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + stc = STCimmutable; + goto L2; + +@@ -1439,7 +1481,7 @@ Parameters *Parser::parseParameters(int + (storageClass & STCin && stc & (STCconst | STCscope)) || + (stc & STCin && storageClass & (STCconst | STCscope)) + ) +- error("redundant storage class %s", Token::toChars(token.value)); ++ error("redundant storage class '%s'", Token::toChars(token.value)); + storageClass |= stc; + composeStorageClass(storageClass); + continue; +@@ -1477,10 +1519,6 @@ Parameters *Parser::parseParameters(int + if (stc & (stc - 1) && // if stc is not a power of 2 + !(stc == (STCin | STCref))) + error("incompatible parameter storage classes"); +- if ((storageClass & (STCconst | STCout)) == (STCconst | STCout)) +- error("out cannot be const"); +- if ((storageClass & (STCimmutable | STCout)) == (STCimmutable | STCout)) +- error("out cannot be immutable"); + if ((storageClass & STCscope) && (storageClass & (STCref | STCout))) + error("scope cannot be ref or out"); + +@@ -1494,7 +1532,9 @@ Parameters *Parser::parseParameters(int + t->value == TOKrparen || + t->value == TOKdotdotdot))) + #endif +- { Identifier *id = Lexer::uniqueId("__T"); ++ { ++ Identifier *id = Lexer::uniqueId("__T"); ++ Loc loc = token.loc; + at = new TypeIdentifier(loc, id); + if (!*tpl) + *tpl = new TemplateParameters(); +@@ -1531,7 +1571,6 @@ Parameters *Parser::parseParameters(int + nextToken(); + break; + } +- L3: + a = new Parameter(storageClass, at, ai, ae); + arguments->push(a); + if (token.value == TOKcomma) +@@ -1557,15 +1596,17 @@ Parameters *Parser::parseParameters(int + */ + + EnumDeclaration *Parser::parseEnum() +-{ EnumDeclaration *e; ++{ ++ EnumDeclaration *e; + Identifier *id; + Type *memtype; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + //printf("Parser::parseEnum()\n"); + nextToken(); + if (token.value == TOKidentifier) +- { id = token.ident; ++ { ++ id = token.ident; + nextToken(); + } + else +@@ -1588,7 +1629,7 @@ EnumDeclaration *Parser::parseEnum() + //printf("enum definition\n"); + e->members = new Dsymbols(); + nextToken(); +- unsigned char *comment = token.blockComment; ++ utf8_t *comment = token.blockComment; + while (token.value != TOKrcurly) + { + /* Can take the following forms: +@@ -1597,7 +1638,7 @@ EnumDeclaration *Parser::parseEnum() + * 3. type ident = value + */ + +- loc = this->loc; ++ loc = token.loc; + + Type *type = NULL; + Identifier *ident; +@@ -1660,15 +1701,16 @@ EnumDeclaration *Parser::parseEnum() + */ + + Dsymbol *Parser::parseAggregate() +-{ AggregateDeclaration *a = NULL; ++{ ++ AggregateDeclaration *a = NULL; + int anon = 0; +- enum TOK tok; + Identifier *id; + TemplateParameters *tpl = NULL; + Expression *constraint = NULL; ++ Loc loc = token.loc; ++ TOK tok = token.value; + + //printf("Parser::parseAggregate()\n"); +- tok = token.value; + nextToken(); + if (token.value != TOKidentifier) + { id = NULL; +@@ -1686,9 +1728,9 @@ Dsymbol *Parser::parseAggregate() + } + } + +- Loc loc = this->loc; + switch (tok) +- { case TOKclass: ++ { ++ case TOKclass: + case TOKinterface: + { + if (!id) +@@ -1701,12 +1743,27 @@ Dsymbol *Parser::parseAggregate() + nextToken(); + baseclasses = parseBaseClasses(); + ++ if (tpl) ++ { ++ Expression *tempCons = parseConstraint(); ++ if (tempCons) ++ { ++ if (constraint) ++ error("members expected"); ++ else ++ constraint = tempCons; ++ } ++ } ++ + if (token.value != TOKlcurly) + error("members expected"); + } + + if (tok == TOKclass) +- a = new ClassDeclaration(loc, id, baseclasses); ++ { ++ bool inObject = md && !md->packages && md->id == Id::object; ++ a = new ClassDeclaration(loc, id, baseclasses, inObject); ++ } + else + a = new InterfaceDeclaration(loc, id, baseclasses); + break; +@@ -1745,7 +1802,7 @@ Dsymbol *Parser::parseAggregate() + { + /* Anonymous structs/unions are more like attributes. + */ +- return new AnonDeclaration(loc, anon - 1, decl); ++ return new AnonDeclaration(loc, anon == 2, decl); + } + else + a->members = decl; +@@ -1779,7 +1836,7 @@ BaseClasses *Parser::parseBaseClasses() + for (; 1; nextToken()) + { + bool prot = false; +- enum PROT protection = PROTpublic; ++ PROT protection = PROTpublic; + switch (token.value) + { + case TOKprivate: +@@ -1846,7 +1903,7 @@ TemplateDeclaration *Parser::parseTempla + TemplateParameters *tpl; + Dsymbols *decldefs; + Expression *constraint = NULL; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + if (token.value != TOKidentifier) +@@ -1902,10 +1959,12 @@ TemplateParameters *Parser::parseTemplat + + // Get array of TemplateParameters + if (flag || token.value != TOKrparen) +- { int isvariadic = 0; +- ++ { ++ int isvariadic = 0; + while (token.value != TOKrparen) +- { TemplateParameter *tp; ++ { ++ TemplateParameter *tp; ++ Loc loc; + Identifier *tp_ident = NULL; + Type *tp_spectype = NULL; + Type *tp_valtype = NULL; +@@ -1921,6 +1980,7 @@ TemplateParameters *Parser::parseTemplat + if (token.value == TOKalias) + { // AliasParameter + nextToken(); ++ loc = token.loc; // todo + Type *spectype = NULL; + if (isDeclaration(&token, 2, TOKreserved, NULL)) + { +@@ -1929,13 +1989,14 @@ TemplateParameters *Parser::parseTemplat + else + { + if (token.value != TOKidentifier) +- { error("identifier expected for template alias parameter"); ++ { ++ error("identifier expected for template alias parameter"); + goto Lerr; + } + tp_ident = token.ident; + nextToken(); + } +- Object *spec = NULL; ++ RootObject *spec = NULL; + if (token.value == TOKcolon) // : Type + { + nextToken(); +@@ -1944,7 +2005,7 @@ TemplateParameters *Parser::parseTemplat + else + spec = parseCondExp(); + } +- Object *def = NULL; ++ RootObject *def = NULL; + if (token.value == TOKassign) // = Type + { + nextToken(); +@@ -1953,15 +2014,18 @@ TemplateParameters *Parser::parseTemplat + else + def = parseCondExp(); + } +- tp = new TemplateAliasParameter(loc, tp_ident, spectype, spec, def); ++ tp = new TemplateAliasParameter(loc/*todo*/, tp_ident, spectype, spec, def); + } + else if (t->value == TOKcolon || t->value == TOKassign || + t->value == TOKcomma || t->value == TOKrparen) +- { // TypeParameter ++ { ++ // TypeParameter + if (token.value != TOKidentifier) +- { error("identifier expected for template type parameter"); ++ { ++ error("identifier expected for template type parameter"); + goto Lerr; + } ++ loc = token.loc; + tp_ident = token.ident; + nextToken(); + if (token.value == TOKcolon) // : Type +@@ -1977,10 +2041,12 @@ TemplateParameters *Parser::parseTemplat + tp = new TemplateTypeParameter(loc, tp_ident, tp_spectype, tp_defaulttype); + } + else if (token.value == TOKidentifier && t->value == TOKdotdotdot) +- { // ident... ++ { ++ // ident... + if (isvariadic) + error("variadic template parameter must be last"); + isvariadic = 1; ++ loc = token.loc; + tp_ident = token.ident; + nextToken(); + nextToken(); +@@ -1988,12 +2054,15 @@ TemplateParameters *Parser::parseTemplat + } + #if DMDV2 + else if (token.value == TOKthis) +- { // ThisParameter ++ { ++ // ThisParameter + nextToken(); + if (token.value != TOKidentifier) +- { error("identifier expected for template this parameter"); ++ { ++ error("identifier expected for template this parameter"); + goto Lerr; + } ++ loc = token.loc; + tp_ident = token.ident; + nextToken(); + if (token.value == TOKcolon) // : Type +@@ -2010,7 +2079,9 @@ TemplateParameters *Parser::parseTemplat + } + #endif + else +- { // ValueParameter ++ { ++ // ValueParameter ++ loc = token.loc; // todo + tp_valtype = parseType(&tp_ident); + if (!tp_ident) + { +@@ -2027,7 +2098,7 @@ TemplateParameters *Parser::parseTemplat + nextToken(); + tp_defaultvalue = parseDefaultInitExp(); + } +- tp = new TemplateValueParameter(loc, tp_ident, tp_valtype, tp_specvalue, tp_defaultvalue); ++ tp = new TemplateValueParameter(loc/*todo*/, tp_ident, tp_valtype, tp_specvalue, tp_defaultvalue); + } + tpl->push(tp); + if (token.value != TOKcomma) +@@ -2053,13 +2124,14 @@ Dsymbol *Parser::parseMixin() + { + TemplateMixin *tm; + Identifier *id; +- Type *tqual; + Objects *tiargs; +- Identifiers *idents; + + //printf("parseMixin()\n"); +- nextToken(); +- tqual = NULL; ++ Loc locMixin = token.loc; ++ nextToken(); // skip 'mixin' ++ ++ Loc loc = token.loc; ++ TypeQualified *tqual = NULL; + if (token.value == TOKdot) + { + id = Id::empty; +@@ -2071,11 +2143,6 @@ Dsymbol *Parser::parseMixin() + tqual = parseTypeof(); + check(TOKdot); + } +- else if (token.value == TOKvector) +- { +- tqual = parseVector(); +- check(TOKdot); +- } + if (token.value != TOKidentifier) + { + error("identifier expected, not %s", token.toChars()); +@@ -2086,7 +2153,6 @@ Dsymbol *Parser::parseMixin() + nextToken(); + } + +- idents = new Identifiers(); + while (1) + { + tiargs = NULL; +@@ -2099,26 +2165,37 @@ Dsymbol *Parser::parseMixin() + tiargs = parseTemplateArgument(); + } + +- if (token.value != TOKdot) +- break; +- +- if (tiargs) +- { TemplateInstance *tempinst = new TemplateInstance(loc, id); ++ if (tiargs && token.value == TOKdot) ++ { ++ TemplateInstance *tempinst = new TemplateInstance(loc, id); + tempinst->tiargs = tiargs; +- id = (Identifier *)tempinst; ++ if (!tqual) ++ tqual = new TypeInstance(loc, tempinst); ++ else ++ tqual->addInst(tempinst); + tiargs = NULL; + } +- idents->push(id); ++ else ++ { ++ if (!tqual) ++ tqual = new TypeIdentifier(loc, id); ++ else ++ tqual->addIdent(id); ++ } ++ ++ if (token.value != TOKdot) ++ break; + + nextToken(); + if (token.value != TOKidentifier) +- { error("identifier expected following '.' instead of '%s'", token.toChars()); ++ { ++ error("identifier expected following '.' instead of '%s'", token.toChars()); + break; + } ++ loc = token.loc; + id = token.ident; + nextToken(); + } +- idents->push(id); + + if (token.value == TOKidentifier) + { +@@ -2128,7 +2205,7 @@ Dsymbol *Parser::parseMixin() + else + id = NULL; + +- tm = new TemplateMixin(loc, id, tqual, idents, tiargs); ++ tm = new TemplateMixin(locMixin, id, tqual, tiargs); + if (token.value != TOKsemicolon) + error("';' expected after mixin"); + nextToken(); +@@ -2158,7 +2235,7 @@ Objects *Parser::parseTemplateArgumentLi + { + //printf("Parser::parseTemplateArgumentList2()\n"); + Objects *tiargs = new Objects(); +- enum TOK endtok = TOKrparen; ++ TOK endtok = TOKrparen; + nextToken(); + + // Get TemplateArgumentList +@@ -2198,7 +2275,7 @@ Objects *Parser::parseTemplateArgument() + switch (token.value) + { + case TOKidentifier: +- ta = new TypeIdentifier(loc, token.ident); ++ ta = new TypeIdentifier(token.loc, token.ident); + goto LabelX; + + case TOKvector: +@@ -2229,6 +2306,9 @@ Objects *Parser::parseTemplateArgument() + case TOKstring: + case TOKfile: + case TOKline: ++ case TOKmodulestring: ++ case TOKfuncstring: ++ case TOKprettyfunc: + case TOKthis: + { // Template argument is an expression + Expression *ea = parsePrimaryExp(); +@@ -2242,7 +2322,7 @@ Objects *Parser::parseTemplateArgument() + } + if (token.value == TOKnot) + { +- enum TOK tok = peekNext(); ++ TOK tok = peekNext(); + if (tok != TOKis && tok != TOKin) + error("multiple ! arguments are not allowed"); + } +@@ -2250,11 +2330,8 @@ Objects *Parser::parseTemplateArgument() + } + + Import *Parser::parseImport(Dsymbols *decldefs, int isstatic) +-{ Import *s; +- Identifier *id; ++{ + Identifier *aliasid = NULL; +- Identifiers *a; +- Loc loc; + + //printf("Parser::parseImport()\n"); + do +@@ -2266,9 +2343,9 @@ Import *Parser::parseImport(Dsymbols *de + break; + } + +- loc = this->loc; +- a = NULL; +- id = token.ident; ++ Loc loc = token.loc; ++ Identifier *id = token.ident; ++ Identifiers *a = NULL; + nextToken(); + if (!aliasid && token.value == TOKassign) + { +@@ -2289,7 +2366,7 @@ Import *Parser::parseImport(Dsymbols *de + nextToken(); + } + +- s = new Import(loc, a, id, aliasid, isstatic); ++ Import *s = new Import(loc, a, id, aliasid, isstatic); + decldefs->push(s); + + /* Look for +@@ -2416,7 +2493,9 @@ Type *Parser::parseType(Identifier **pid + #endif + + Type *Parser::parseBasicType() +-{ Type *t; ++{ ++ Type *t; ++ Loc loc; + Identifier *id; + TypeQualified *tid; + +@@ -2430,10 +2509,12 @@ Type *Parser::parseBasicType() + case TOKthis: + case TOKsuper: + case TOKidentifier: ++ loc = token.loc; + id = token.ident; + nextToken(); + if (token.value == TOKnot) +- { // ident!(template_arguments) ++ { ++ // ident!(template_arguments) + TemplateInstance *tempinst = new TemplateInstance(loc, id); + nextToken(); + if (token.value == TOKlparen) +@@ -2449,11 +2530,14 @@ Type *Parser::parseBasicType() + tid = new TypeIdentifier(loc, id); + Lident2: + while (token.value == TOKdot) +- { nextToken(); ++ { ++ nextToken(); + if (token.value != TOKidentifier) +- { error("identifier expected following '.' instead of '%s'", token.toChars()); ++ { ++ error("identifier expected following '.' instead of '%s'", token.toChars()); + break; + } ++ loc = token.loc; + id = token.ident; + nextToken(); + if (token.value == TOKnot) +@@ -2466,7 +2550,7 @@ Type *Parser::parseBasicType() + else + // ident!template_argument + tempinst->tiargs = parseTemplateArgument(); +- tid->addIdent((Identifier *)tempinst); ++ tid->addInst(tempinst); + } + else + tid->addIdent(id); +@@ -2476,6 +2560,7 @@ Type *Parser::parseBasicType() + + case TOKdot: + // Leading . as in .foo ++ loc = token.loc; + id = Id::empty; + goto Lident; + +@@ -2503,7 +2588,7 @@ Type *Parser::parseBasicType() + break; + + case TOKinvariant: +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + case TOKimmutable: + // invariant(type) + nextToken(); +@@ -2617,7 +2702,7 @@ Type *Parser::parseBasicType2(Type *t) + // t function(parameter list) nothrow pure + Parameters *arguments; + int varargs; +- enum TOK save = token.value; ++ TOK save = token.value; + + nextToken(); + arguments = parseParameters(&varargs); +@@ -2690,7 +2775,8 @@ Type *Parser::parseDeclarator(Type *t, I + * Improve error messages for the common bug of a missing return type + * by looking to see if (a) looks like a parameter list. + */ +- if (isParameters(&peekt)) { ++ if (isParameters(&peekt)) ++ { + error("function declaration without return type. " + "(Note that constructors are always named 'this')"); + } +@@ -2807,7 +2893,7 @@ Type *Parser::parseDeclarator(Type *t, I + * Return array of Declaration *'s. + */ + +-Dsymbols *Parser::parseDeclarations(StorageClass storage_class, unsigned char *comment) ++Dsymbols *Parser::parseDeclarations(StorageClass storage_class, utf8_t *comment) + { + StorageClass stc; + int disable; +@@ -2816,10 +2902,10 @@ Dsymbols *Parser::parseDeclarations(Stor + Type *tfirst; + Identifier *ident; + Dsymbols *a; +- enum TOK tok = TOKreserved; +- enum LINK link = linkage; ++ TOK tok = TOKreserved; ++ LINK link = linkage; + unsigned structalign = 0; +- Loc loc = this->loc; ++ Loc loc = token.loc; + Expressions *udas = NULL; + + //printf("parseDeclarations() %s\n", token.toChars()); +@@ -2834,6 +2920,7 @@ Dsymbols *Parser::parseDeclarations(Stor + switch (token.value) + { + case TOKalias: ++ { + /* Look for: + * alias identifier this; + */ +@@ -2869,32 +2956,116 @@ Dsymbols *Parser::parseDeclarations(Stor + #endif + /* Look for: + * alias identifier = type; ++ * alias identifier(...) = type; + */ +- if (token.value == TOKidentifier && peekNext() == TOKassign) ++ Token *tk = &token; ++ if (tk->value == TOKidentifier && ++ ((tk = peek(tk))->value == TOKlparen ++ ? skipParens(tk, &tk) && (tk = peek(tk), 1) : 1) && ++ tk->value == TOKassign) + { + a = new Dsymbols(); + while (1) + { + ident = token.ident; + nextToken(); ++ TemplateParameters *tpl = NULL; ++ if (token.value == TOKlparen) ++ tpl = parseTemplateParameterList(); + check(TOKassign); + t = parseType(); +- Declaration *v = new AliasDeclaration(loc, ident, t); +- a->push(v); ++ Dsymbol *s = new AliasDeclaration(loc, ident, t); ++ if (tpl) ++ { ++ Dsymbols *a2 = new Dsymbols(); ++ a2->push(s); ++ TemplateDeclaration *tempdecl = ++ new TemplateDeclaration(loc, ident, tpl, NULL/*constraint*/, a2, 0); ++ s = tempdecl; ++ } ++ a->push(s); + switch (token.value) +- { case TOKsemicolon: ++ { ++ case TOKsemicolon: + nextToken(); +- addComment(v, comment); ++ addComment(s, comment); + break; + case TOKcomma: + nextToken(); +- addComment(v, comment); ++ addComment(s, comment); + if (token.value != TOKidentifier) +- { error("Identifier expected following comma, not %s", token.toChars()); ++ { ++ error("Identifier expected following comma, not %s", token.toChars()); + break; + } +- else if (peek(&token)->value != TOKassign) +- { error("= expected following identifier"); ++ if (peekNext() != TOKassign && peekNext() != TOKlparen) ++ { ++ error("= expected following identifier"); ++ nextToken(); ++ break; ++ } ++ continue; ++ default: ++ error("semicolon expected to close %s declaration", Token::toChars(tok)); ++ break; ++ } ++ break; ++ } ++ return a; ++ } ++ break; ++ } ++ case TOKenum: ++ { ++ /* Look for: ++ * enum identifier(...) = type; ++ */ ++ tok = token.value; ++ Token *tk = peek(&token); ++ if (tk->value == TOKidentifier && ++ (tk = peek(tk))->value == TOKlparen && skipParens(tk, &tk) && ++ (tk = peek(tk))->value == TOKassign) ++ { ++ nextToken(); ++ a = new Dsymbols(); ++ while (1) ++ { ++ ident = token.ident; ++ nextToken(); ++ TemplateParameters *tpl = NULL; ++ if (token.value == TOKlparen) ++ tpl = parseTemplateParameterList(); ++ check(TOKassign); ++ Initializer *init = parseInitializer(); ++ VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init); ++ v->storage_class = STCmanifest; ++ Dsymbol *s = v; ++ if (tpl) ++ { ++ Dsymbols *a2 = new Dsymbols(); ++ a2->push(s); ++ TemplateDeclaration *tempdecl = ++ new TemplateDeclaration(loc, ident, tpl, NULL/*constraint*/, a2, 0); ++ s = tempdecl; ++ } ++ a->push(s); ++ switch (token.value) ++ { ++ case TOKsemicolon: ++ nextToken(); ++ addComment(s, comment); ++ break; ++ case TOKcomma: ++ nextToken(); ++ addComment(s, comment); ++ if (token.value != TOKidentifier) ++ { ++ error("Identifier expected following comma, not %s", token.toChars()); ++ break; ++ } ++ if (peekNext() != TOKassign && peekNext() != TOKlparen) ++ { ++ error("= expected following identifier"); + nextToken(); + break; + } +@@ -2907,8 +3078,8 @@ Dsymbols *Parser::parseDeclarations(Stor + } + return a; + } +- + break; ++ } + case TOKtypedef: + deprecation("use of typedef is deprecated; use alias instead"); + tok = token.value; +@@ -2933,7 +3104,7 @@ Dsymbols *Parser::parseDeclarations(Stor + if (peek(&token)->value == TOKlparen) + break; + if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + stc = STCimmutable; + goto L1; + +@@ -2961,7 +3132,6 @@ Dsymbols *Parser::parseDeclarations(Stor + case TOKnothrow: stc = STCnothrow; goto L1; + case TOKpure: stc = STCpure; goto L1; + case TOKref: stc = STCref; goto L1; +- case TOKtls: stc = STCtls; goto L1; + case TOKgshared: stc = STCgshared; goto L1; + case TOKenum: stc = STCmanifest; goto L1; + case TOKat: +@@ -3005,7 +3175,7 @@ Dsymbols *Parser::parseDeclarations(Stor + check(TOKrparen); + } + else +- structalign = global.structalign; // default ++ structalign = STRUCTALIGN_DEFAULT; // default + continue; + } + default: +@@ -3100,7 +3270,7 @@ L2: + + while (1) + { +- loc = this->loc; ++ loc = token.loc; + TemplateParameters *tpl = NULL; + + ident = NULL; +@@ -3111,11 +3281,13 @@ L2: + else if (t != tfirst) + error("multiple declarations must have the same type, not %s and %s", + tfirst->toChars(), t->toChars()); +- if (!ident) ++ bool isThis = (t->ty == Tident && ((TypeIdentifier *)t)->ident == Id::This); ++ if (!isThis && !ident) + error("no identifier for declarator %s", t->toChars()); + + if (tok == TOKtypedef || tok == TOKalias) +- { Declaration *v; ++ { ++ Declaration *v; + Initializer *init = NULL; + + /* Aliases can no longer have multiple declarators, storage classes, +@@ -3132,12 +3304,20 @@ L2: + init = parseInitializer(); + } + if (tok == TOKtypedef) +- { v = new TypedefDeclaration(loc, ident, t, init); +- deprecation("use of typedef is deprecated; use alias instead"); ++ { ++ v = new TypedefDeclaration(loc, ident, t, init); + } + else +- { if (init) +- error("alias cannot have initializer"); ++ { ++ if (init) ++ { ++ if (isThis) ++ error("Cannot use syntax 'alias this = %s', use 'alias %s this' instead", ++ init->toChars(), init->toChars()); ++ else ++ error("alias cannot have initializer"); ++ } ++ + v = new AliasDeclaration(loc, ident, t); + } + v->storage_class = storage_class; +@@ -3181,7 +3361,7 @@ L2: + //printf("%s funcdecl t = %s, storage_class = x%lx\n", loc.toChars(), t->toChars(), storage_class); + + FuncDeclaration *f = +- new FuncDeclaration(loc, 0, ident, storage_class | (disable ? STCdisable : 0), t); ++ new FuncDeclaration(loc, Loc(), ident, storage_class | (disable ? STCdisable : 0), t); + addComment(f, comment); + if (tpl) + constraint = parseConstraint(); +@@ -3269,12 +3449,13 @@ L2: + */ + + #if DMDV2 +-Dsymbols *Parser::parseAutoDeclarations(StorageClass storageClass, unsigned char *comment) ++Dsymbols *Parser::parseAutoDeclarations(StorageClass storageClass, utf8_t *comment) + { + Dsymbols *a = new Dsymbols; + + while (1) + { ++ Loc loc = token.loc; + Identifier *ident = token.ident; + nextToken(); // skip over ident + assert(token.value == TOKassign); +@@ -3314,7 +3495,7 @@ Dsymbols *Parser::parseAutoDeclarations( + + void Parser::parseContracts(FuncDeclaration *f) + { +- enum LINK linksave = linkage; ++ LINK linksave = linkage; + + // The following is irrelevant, as it is overridden by sc->linkage in + // TypeFunction::semantic +@@ -3413,7 +3594,7 @@ Initializer *Parser::parseInitializer() + Identifier *id; + Initializer *value; + int comma; +- Loc loc = this->loc; ++ Loc loc = token.loc; + Token *t; + int braces; + int brackets; +@@ -3626,23 +3807,32 @@ Initializer *Parser::parseInitializer() + + /***************************************** + * Parses default argument initializer expression that is an assign expression, +- * with special handling for __FILE__ and __LINE__. ++ * with special handling for __FILE__, __LINE__, __MODULE__, __FUNCTION__, and __PRETTY_FUNCTION__. + */ + + #if DMDV2 + Expression *Parser::parseDefaultInitExp() + { + if (token.value == TOKfile || +- token.value == TOKline) ++ token.value == TOKline || ++ token.value == TOKmodulestring || ++ token.value == TOKfuncstring || ++ token.value == TOKprettyfunc) + { + Token *t = peek(&token); + if (t->value == TOKcomma || t->value == TOKrparen) +- { Expression *e; +- ++ { ++ Expression *e; + if (token.value == TOKfile) +- e = new FileInitExp(loc); +- else +- e = new LineInitExp(loc); ++ e = new FileInitExp(token.loc); ++ else if (token.value == TOKline) ++ e = new LineInitExp(token.loc); ++ else if (token.value == TOKmodulestring) ++ e = new ModuleInitExp(token.loc); ++ else if (token.value == TOKfuncstring) ++ e = new FuncInitExp(token.loc); ++ else if (token.value == TOKprettyfunc) ++ e = new PrettyFuncInitExp(token.loc); + nextToken(); + return e; + } +@@ -3672,13 +3862,14 @@ void Parser::checkDanglingElse(Loc elsel + * flags PSxxxx + */ + +-Statement *Parser::parseStatement(int flags) +-{ Statement *s; ++Statement *Parser::parseStatement(int flags, utf8_t** endPtr) ++{ ++ Statement *s; + Condition *condition; + Statement *ifbody; + Statement *elsebody; + bool isfinal; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + //printf("parseStatement()\n"); + +@@ -3753,6 +3944,9 @@ Statement *Parser::parseStatement(int fl + case TOKtraits: + case TOKfile: + case TOKline: ++ case TOKmodulestring: ++ case TOKfuncstring: ++ case TOKprettyfunc: + #endif + Lexp: + { +@@ -3818,7 +4012,6 @@ Statement *Parser::parseStatement(int fl + case TOKnothrow: + case TOKpure: + case TOKref: +- case TOKtls: + case TOKgshared: + case TOKat: + #endif +@@ -3906,7 +4099,7 @@ Statement *Parser::parseStatement(int fl + case TOKlcurly: + { + Loc lookingForElseSave = lookingForElse; +- lookingForElse = 0; ++ lookingForElse = Loc(); + + nextToken(); + //if (token.value == TOKsemicolon) +@@ -3916,7 +4109,8 @@ Statement *Parser::parseStatement(int fl + { + statements->push(parseStatement(PSsemi | PScurlyscope)); + } +- endloc = this->loc; ++ if (endPtr) *endPtr = token.ptr; ++ endloc = token.loc; + s = new CompoundStatement(loc, statements); + if (flags & (PSscope | PScurlyscope)) + s = new ScopeStatement(loc, s); +@@ -3956,7 +4150,7 @@ Statement *Parser::parseStatement(int fl + + nextToken(); + Loc lookingForElseSave = lookingForElse; +- lookingForElse = 0; ++ lookingForElse = Loc(); + body = parseStatement(PSscope); + lookingForElse = lookingForElseSave; + check(TOKwhile); +@@ -3987,7 +4181,7 @@ Statement *Parser::parseStatement(int fl + else + { + Loc lookingForElseSave = lookingForElse; +- lookingForElse = 0; ++ lookingForElse = Loc(); + init = parseStatement(0); + lookingForElse = lookingForElseSave; + } +@@ -4011,15 +4205,13 @@ Statement *Parser::parseStatement(int fl + } + body = parseStatement(PSscope); + s = new ForStatement(loc, init, condition, increment, body); +- if (init) +- s = new ScopeStatement(loc, s); + break; + } + + case TOKforeach: + case TOKforeach_reverse: + { +- enum TOK op = token.value; ++ TOK op = token.value; + + nextToken(); + check(TOKlparen); +@@ -4032,22 +4224,29 @@ Statement *Parser::parseStatement(int fl + Type *at; + + StorageClass storageClass = 0; ++ StorageClass stc = 0; + Lagain: ++ if (stc) ++ { ++ if (storageClass & stc) ++ error("redundant storage class '%s'", Token::toChars(token.value)); ++ storageClass |= stc; ++ composeStorageClass(storageClass); ++ nextToken(); ++ } + switch (token.value) + { + case TOKref: + #if D1INOUT + case TOKinout: + #endif +- storageClass |= STCref; +- nextToken(); ++ stc = STCref; + goto Lagain; + + case TOKconst: + if (peekNext() != TOKlparen) + { +- storageClass |= STCconst; +- nextToken(); ++ stc = STCconst; + goto Lagain; + } + break; +@@ -4055,26 +4254,23 @@ Statement *Parser::parseStatement(int fl + case TOKimmutable: + if (peekNext() != TOKlparen) + { +- storageClass |= STCimmutable; ++ stc = STCimmutable; + if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); +- nextToken(); ++ error("use 'immutable' instead of 'invariant'"); + goto Lagain; + } + break; + case TOKshared: + if (peekNext() != TOKlparen) + { +- storageClass |= STCshared; +- nextToken(); ++ stc = STCshared; + goto Lagain; + } + break; + case TOKwild: + if (peekNext() != TOKlparen) + { +- storageClass |= STCwild; +- nextToken(); ++ stc = STCwild; + goto Lagain; + } + break; +@@ -4126,7 +4322,8 @@ Statement *Parser::parseStatement(int fl + } + + case TOKif: +- { Parameter *arg = NULL; ++ { ++ Parameter *arg = NULL; + Expression *condition; + Statement *ifbody; + Statement *elsebody; +@@ -4134,52 +4331,91 @@ Statement *Parser::parseStatement(int fl + nextToken(); + check(TOKlparen); + +- if (token.value == TOKauto) ++ StorageClass storageClass = 0; ++ StorageClass stc = 0; ++ LagainStc: ++ if (stc) + { ++ if (storageClass & stc) ++ error("redundant storage class '%s'", Token::toChars(token.value)); ++ storageClass |= stc; ++ composeStorageClass(storageClass); + nextToken(); +- if (token.value == TOKidentifier) +- { +- Token *t = peek(&token); +- if (t->value == TOKassign) ++ } ++ switch (token.value) ++ { ++ case TOKref: ++ stc = STCref; ++ goto LagainStc; ++ case TOKauto: ++ stc = STCauto; ++ goto LagainStc; ++ case TOKconst: ++ if (peekNext() != TOKlparen) + { +- arg = new Parameter(0, NULL, token.ident, NULL); +- nextToken(); +- nextToken(); ++ stc = STCconst; ++ goto LagainStc; + } +- else +- { error("= expected following auto identifier"); +- goto Lerror; ++ break; ++ case TOKinvariant: ++ case TOKimmutable: ++ if (peekNext() != TOKlparen) ++ { ++ stc = STCimmutable; ++ if (token.value == TOKinvariant) ++ error("use 'immutable' instead of 'invariant'"); ++ goto LagainStc; + } +- } +- else +- { error("identifier expected following auto"); +- goto Lerror; +- } ++ break; ++ case TOKshared: ++ if (peekNext() != TOKlparen) ++ { ++ stc = STCshared; ++ goto LagainStc; ++ } ++ break; ++ case TOKwild: ++ if (peekNext() != TOKlparen) ++ { ++ stc = STCwild; ++ goto LagainStc; ++ } ++ break; ++ default: ++ break; + } +- else if (isDeclaration(&token, 2, TOKassign, NULL)) +- { +- Type *at; +- Identifier *ai; + +- at = parseType(&ai); ++ if (storageClass != 0 && ++ token.value == TOKidentifier && ++ peek(&token)->value == TOKassign) ++ { ++ Identifier *ai = token.ident; ++ Type *at = NULL; // infer argument type ++ nextToken(); + check(TOKassign); +- arg = new Parameter(0, at, ai, NULL); ++ arg = new Parameter(storageClass, at, ai, NULL); + } +- + // Check for " ident;" +- else if (token.value == TOKidentifier) ++ else if (storageClass == 0 && ++ token.value == TOKidentifier && ++ peek(&token)->value == TOKsemicolon) + { +- Token *t = peek(&token); +- if (t->value == TOKsemicolon) +- { +- arg = new Parameter(0, NULL, token.ident, NULL); +- nextToken(); +- nextToken(); +- error("if (v; e) is deprecated, use if (auto v = e)"); +- } ++ arg = new Parameter(0, NULL, token.ident, NULL); ++ nextToken(); ++ nextToken(); ++ error("if (v; e) is deprecated, use if (auto v = e)"); ++ } ++ else if (isDeclaration(&token, 2, TOKassign, NULL)) ++ { ++ Identifier *ai; ++ Type *at = parseType(&ai); ++ check(TOKassign); ++ arg = new Parameter(storageClass, at, ai, NULL); + } + + condition = parseExpression(); ++ if (condition->op == TOKassign) ++ error("assignment cannot be used as a condition, perhaps == was meant?"); + check(TOKrparen); + { + Loc lookingForElseSave = lookingForElse; +@@ -4189,7 +4425,7 @@ Statement *Parser::parseStatement(int fl + } + if (token.value == TOKelse) + { +- Loc elseloc = this->loc; ++ Loc elseloc = token.loc; + nextToken(); + elsebody = parseStatement(PSscope); + checkDanglingElse(elseloc); +@@ -4251,7 +4487,7 @@ Statement *Parser::parseStatement(int fl + elsebody = NULL; + if (token.value == TOKelse) + { +- Loc elseloc = this->loc; ++ Loc elseloc = token.loc; + nextToken(); + elsebody = parseStatement(0 /*PSsemi*/); + checkDanglingElse(elseloc); +@@ -4509,7 +4745,7 @@ Statement *Parser::parseStatement(int fl + + nextToken(); + Loc lookingForElseSave = lookingForElse; +- lookingForElse = 0; ++ lookingForElse = Loc(); + body = parseStatement(PSscope); + lookingForElse = lookingForElseSave; + while (token.value == TOKcatch) +@@ -4518,7 +4754,7 @@ Statement *Parser::parseStatement(int fl + Catch *c; + Type *t; + Identifier *id; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + if (token.value == TOKlcurly || token.value != TOKlparen) +@@ -4604,7 +4840,7 @@ Statement *Parser::parseStatement(int fl + if (t->value == TOKcolon) + { // It's a label + label = token.ident; +- labelloc = this->loc; ++ labelloc = token.loc; + nextToken(); + nextToken(); + continue; +@@ -4635,8 +4871,9 @@ Statement *Parser::parseStatement(int fl + + s = NULL; + if (toklist || label) +- { // Create AsmStatement from list of tokens we've saved +- s = new AsmStatement(this->loc, toklist); ++ { ++ // Create AsmStatement from list of tokens we've saved ++ s = new AsmStatement(token.loc, toklist); + toklist = NULL; + ptoklist = &toklist; + if (label) +@@ -4693,8 +4930,10 @@ Statement *Parser::parseStatement(int fl + } + + case TOKtemplate: +- error("template definitions aren't allowed inside functions"); +- goto Lerror; ++ { Dsymbol *d = parseTemplateDeclaration(0); ++ s = new ExpStatement(loc, d); ++ break; ++ } + + default: + error("found '%s' instead of statement", token.toChars()); +@@ -4723,7 +4962,6 @@ Statement *Parser::parseExtAsm() + Expressions *constraints = NULL; + int outputargs = 0; + Expressions *clobbers = NULL; +- Dsymbols *labels = NULL; + bool isInputPhase = false; // Output operands first, then input. + + insn = parseExpression(); +@@ -4824,24 +5062,24 @@ Statement *Parser::parseExtAsm() + Ldone: + check(TOKsemicolon); + +- return new ExtAsmStatement(loc, insn, args, names, constraints, +- outputargs, clobbers, labels); ++ return new ExtAsmStatement(token.loc, insn, args, names, ++ constraints, outputargs, clobbers); + } + #endif + +-void Parser::check(enum TOK value) ++void Parser::check(TOK value) + { +- check(loc, value); ++ check(token.loc, value); + } + +-void Parser::check(Loc loc, enum TOK value) ++void Parser::check(Loc loc, TOK value) + { + if (token.value != value) + error(loc, "found '%s' when expecting '%s'", token.toChars(), Token::toChars(value)); + nextToken(); + } + +-void Parser::check(enum TOK value, const char *string) ++void Parser::check(TOK value, const char *string) + { + if (token.value != value) + error("found '%s' when expecting '%s' following %s", +@@ -4849,10 +5087,10 @@ void Parser::check(enum TOK value, const + nextToken(); + } + +-void Parser::checkParens(enum TOK value, Expression *e) ++void Parser::checkParens(TOK value, Expression *e) + { + if (precedence[e->op] == PREC_rel && !e->parens) +- error(loc, "%s must be parenthesized when next to operator %s", e->toChars(), Token::toChars(value)); ++ error(e->loc, "%s must be parenthesized when next to operator %s", e->toChars(), Token::toChars(value)); + } + + /************************************ +@@ -4865,10 +5103,11 @@ void Parser::checkParens(enum TOK value, + * if *pt is not NULL, it is set to the ending token, which would be endtok + */ + +-int Parser::isDeclaration(Token *t, int needId, enum TOK endtok, Token **pt) ++int Parser::isDeclaration(Token *t, int needId, TOK endtok, Token **pt) + { + //printf("isDeclaration(needId = %d)\n", needId); + int haveId = 0; ++ int haveTpl = 0; + + #if DMDV2 + while (1) +@@ -4895,7 +5134,7 @@ int Parser::isDeclaration(Token *t, int + { + goto Lisnot; + } +- if (!isDeclarator(&t, &haveId, endtok)) ++ if (!isDeclarator(&t, &haveId, &haveTpl, endtok)) + goto Lisnot; + if ( needId == 1 || + (needId == 0 && !haveId) || +@@ -4920,7 +5159,6 @@ int Parser::isBasicType(Token **pt) + { + // This code parallels parseBasicType() + Token *t = *pt; +- int haveId = 0; + + switch (t->value) + { +@@ -4983,6 +5221,9 @@ int Parser::isBasicType(Token **pt) + case TOKstring: + case TOKfile: + case TOKline: ++ case TOKmodulestring: ++ case TOKfuncstring: ++ case TOKprettyfunc: + goto L2; + default: + goto Lfalse; +@@ -5036,7 +5277,7 @@ Lfalse: + return FALSE; + } + +-int Parser::isDeclarator(Token **pt, int *haveId, enum TOK endtok) ++int Parser::isDeclarator(Token **pt, int *haveId, int *haveTpl, TOK endtok) + { // This code parallels parseDeclarator() + Token *t = *pt; + int parens; +@@ -5109,7 +5350,7 @@ int Parser::isDeclarator(Token **pt, int + } + + +- if (!isDeclarator(&t, haveId, TOKrparen)) ++ if (!isDeclarator(&t, haveId, NULL, TOKrparen)) + return FALSE; + t = peek(t); + parens = TRUE; +@@ -5157,6 +5398,13 @@ int Parser::isDeclarator(Token **pt, int + + case TOKlparen: + parens = FALSE; ++ if (Token *tk = peekPastParen(t)) ++ { if (tk->value == TOKlparen) ++ { if (!haveTpl) return FALSE; ++ *haveTpl = 1; ++ t = tk; ++ } ++ } + if (!isParameters(&t)) + return FALSE; + #if DMDV2 +@@ -5202,6 +5450,8 @@ int Parser::isDeclarator(Token **pt, int + return TRUE; + } + return FALSE; ++ case TOKif: ++ return haveTpl ? TRUE : FALSE; + + default: + return FALSE; +@@ -5280,7 +5530,7 @@ int Parser::isParameters(Token **pt) + L2: + int tmp = FALSE; + if (t->value != TOKdotdotdot && +- !isDeclarator(&t, &tmp, TOKreserved)) ++ !isDeclarator(&t, &tmp, NULL, TOKreserved)) + return FALSE; + if (t->value == TOKassign) + { t = peek(t); +@@ -5459,7 +5709,6 @@ int Parser::skipAttributes(Token *t, Tok + case TOKnothrow: + case TOKpure: + case TOKref: +- case TOKtls: + case TOKgshared: + //case TOKmanifest: + break; +@@ -5538,11 +5787,12 @@ int Parser::skipAttributes(Token *t, Tok + /********************************* Expression Parser ***************************/ + + Expression *Parser::parsePrimaryExp() +-{ Expression *e; ++{ ++ Expression *e; + Type *t; + Identifier *id; +- enum TOK save; +- Loc loc = this->loc; ++ TOK save; ++ Loc loc = token.loc; + + //printf("parsePrimaryExp(): loc = %d\n", loc.linnum); + switch (token.value) +@@ -5660,6 +5910,24 @@ Expression *Parser::parsePrimaryExp() + e = new IntegerExp(loc, loc.linnum, Type::tint32); + nextToken(); + break; ++ ++ case TOKmodulestring: ++ { ++ const char *s = md ? md->toChars() : mod->toChars(); ++ e = new StringExp(loc, (char *)s, strlen(s), 0); ++ nextToken(); ++ break; ++ } ++ ++ case TOKfuncstring: ++ e = new FuncInitExp(loc); ++ nextToken(); ++ break; ++ ++ case TOKprettyfunc: ++ e = new PrettyFuncInitExp(loc); ++ nextToken(); ++ break; + #endif + + case TOKtrue: +@@ -5690,7 +5958,7 @@ Expression *Parser::parsePrimaryExp() + case TOKstring: + { + // cat adjacent strings +- unsigned char *s = token.ustring; ++ utf8_t *s = token.ustring; + size_t len = token.len; + unsigned char postfix = token.postfix; + while (1) +@@ -5707,9 +5975,9 @@ Expression *Parser::parsePrimaryExp() + size_t len1 = len; + size_t len2 = token.len; + len = len1 + len2; +- unsigned char *s2 = (unsigned char *)mem.malloc((len + 1) * sizeof(unsigned char)); +- memcpy(s2, s, len1 * sizeof(unsigned char)); +- memcpy(s2 + len1, token.ustring, (len2 + 1) * sizeof(unsigned char)); ++ utf8_t *s2 = (utf8_t *)mem.malloc((len + 1) * sizeof(utf8_t)); ++ memcpy(s2, s, len1 * sizeof(utf8_t)); ++ memcpy(s2 + len1, token.ustring, (len2 + 1) * sizeof(utf8_t)); + s = s2; + } + else +@@ -5748,7 +6016,7 @@ Expression *Parser::parsePrimaryExp() + { + nextToken(); + check(TOKlparen, "typeid"); +- Object *o; ++ RootObject *o; + if (isDeclaration(&token, 0, TOKreserved, NULL)) + { // argument is a type + o = parseType(); +@@ -5788,13 +6056,14 @@ Expression *Parser::parsePrimaryExp() + #endif + + case TOKis: +- { Type *targ; ++ { ++ Type *targ; + Identifier *ident = NULL; + Type *tspec = NULL; +- enum TOK tok = TOKreserved; +- enum TOK tok2 = TOKreserved; ++ TOK tok = TOKreserved; ++ TOK tok2 = TOKreserved; + TemplateParameters *tpl = NULL; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + if (token.value == TOKlparen) +@@ -5826,9 +6095,12 @@ Expression *Parser::parsePrimaryExp() + token.value == TOKdelegate || + token.value == TOKreturn)) + { +- if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); + tok2 = token.value; ++ if (token.value == TOKinvariant) ++ { ++ error("use 'immutable' instead of 'invariant'"); ++ tok2 = TOKimmutable; ++ } + nextToken(); + } + else +@@ -5836,7 +6108,7 @@ Expression *Parser::parsePrimaryExp() + tspec = parseType(); + } + } +- if (ident && tspec) ++ if (tspec) + { + if (token.value == TOKcomma) + tpl = parseTemplateParameterList(1); +@@ -5844,8 +6116,6 @@ Expression *Parser::parsePrimaryExp() + { tpl = new TemplateParameters(); + check(TOKrparen); + } +- TemplateParameter *tp = new TemplateTypeParameter(loc, ident, NULL, NULL); +- tpl->insert(0, tp); + } + else + check(TOKrparen); +@@ -5893,11 +6163,15 @@ Expression *Parser::parsePrimaryExp() + break; + } + ++ case TOKnew: ++ e = parseNewExp(NULL); ++ break; ++ + case TOKlparen: + { Token *tk = peekPastParen(&token); + if (skipAttributes(tk, &tk)) + { +- enum TOK past = tk->value; ++ TOK past = tk->value; + if (past == TOKgoesto) + { // (arguments) => expression + goto case_delegate; +@@ -5963,8 +6237,8 @@ Expression *Parser::parsePrimaryExp() + int varargs = 0; + Type *tret = NULL; + StorageClass stc = 0; +- enum TOK save = TOKreserved; +- Loc loc = this->loc; ++ TOK save = TOKreserved; ++ Loc loc = token.loc; + + switch (token.value) + { +@@ -5991,7 +6265,6 @@ Expression *Parser::parsePrimaryExp() + /* fall through to TOKlparen */ + + case TOKlparen: +- Lparen: + { // (parameters) => expression + // (parameters) { statements... } + parameters = parseParameters(&varargs, &tpl); +@@ -6025,15 +6298,15 @@ Expression *Parser::parsePrimaryExp() + if (!parameters) + parameters = new Parameters(); + TypeFunction *tf = new TypeFunction(parameters, tret, varargs, linkage, stc); +- FuncLiteralDeclaration *fd = new FuncLiteralDeclaration(loc, 0, tf, save, NULL); ++ FuncLiteralDeclaration *fd = new FuncLiteralDeclaration(loc, Loc(), tf, save, NULL); + + if (token.value == TOKgoesto) + { + check(TOKgoesto); +- Loc loc = this->loc; ++ Loc loc = token.loc; + Expression *ae = parseAssignExp(); + fd->fbody = new ReturnStatement(loc, ae); +- fd->endloc = this->loc; ++ fd->endloc = token.loc; + } + else + { +@@ -6070,7 +6343,7 @@ Expression *Parser::parsePostExp(Express + + while (1) + { +- loc = this->loc; ++ loc = token.loc; + switch (token.value) + { + case TOKdot: +@@ -6081,7 +6354,6 @@ Expression *Parser::parsePostExp(Express + nextToken(); + if (token.value == TOKnot && peekNext() != TOKis && peekNext() != TOKin) + { // identifier!(template-argument-list) +- TemplateInstance *tempinst = new TemplateInstance(loc, id); + Objects *tiargs; + nextToken(); + if (token.value == TOKlparen) +@@ -6174,8 +6446,9 @@ Expression *Parser::parsePostExp(Express + } + + Expression *Parser::parseUnaryExp() +-{ Expression *e; +- Loc loc = this->loc; ++{ ++ Expression *e; ++ Loc loc = token.loc; + + switch (token.value) + { +@@ -6235,10 +6508,6 @@ Expression *Parser::parseUnaryExp() + e = new DeleteExp(loc, e); + break; + +- case TOKnew: +- e = parseNewExp(NULL); +- break; +- + case TOKcast: // cast(type) expression + { + nextToken(); +@@ -6260,7 +6529,7 @@ Expression *Parser::parseUnaryExp() + else if ((token.value == TOKimmutable || token.value == TOKinvariant) && peekNext() == TOKrparen) + { + if (token.value == TOKinvariant) +- deprecation("use of 'invariant' rather than 'immutable' is deprecated"); ++ error("use 'immutable' instead of 'invariant'"); + m = MODimmutable; + goto Lmod2; + } +@@ -6307,13 +6576,25 @@ Expression *Parser::parseUnaryExp() + case TOKshared: + case TOKconst: + case TOKinvariant: +- case TOKimmutable: // immutable(type)(arguments) ++ case TOKimmutable: // immutable(type)(arguments) / immutable(type).init + { + StorageClass stc = parseTypeCtor(); + Type *t = parseBasicType(); + t = t->addSTC(stc); + e = new TypeExp(loc, t); +- if (token.value != TOKlparen) ++ if (stc == 0 && token.value == TOKdot) ++ { ++ nextToken(); ++ if (token.value != TOKidentifier) ++ { error("Identifier expected following (type)."); ++ return NULL; ++ } ++ e = typeDotIdExp(loc, t, token.ident); ++ nextToken(); ++ e = parsePostExp(e); ++ break; ++ } ++ else if (token.value != TOKlparen) + { + error("(arguments) expected following %s", t->toChars()); + return e; +@@ -6378,6 +6659,9 @@ Expression *Parser::parseUnaryExp() + #if DMDV2 + case TOKfile: + case TOKline: ++ case TOKmodulestring: ++ case TOKfuncstring: ++ case TOKprettyfunc: + #endif + case BASIC_TYPES: // (type)int.size + { // (type) una_exp +@@ -6388,15 +6672,15 @@ Expression *Parser::parseUnaryExp() + check(TOKrparen); + + // if .identifier ++ // or .identifier!( ... ) + if (token.value == TOKdot) + { +- nextToken(); +- if (token.value != TOKidentifier) +- { error("Identifier expected following (type)."); ++ if (peekNext() != TOKidentifier && peekNext() != TOKnew) ++ { ++ error("identifier or new keyword expected following (...)."); + return NULL; + } +- e = typeDotIdExp(loc, t, token.ident); +- nextToken(); ++ e = new TypeExp(loc, t); + e = parsePostExp(e); + } + else +@@ -6407,6 +6691,8 @@ Expression *Parser::parseUnaryExp() + } + return e; + } ++ default: ++ break; + } + } + #endif +@@ -6433,9 +6719,10 @@ Expression *Parser::parseUnaryExp() + } + + Expression *Parser::parseMulExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseUnaryExp(); + while (1) +@@ -6455,9 +6742,10 @@ Expression *Parser::parseMulExp() + } + + Expression *Parser::parseAddExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseMulExp(); + while (1) +@@ -6477,9 +6765,10 @@ Expression *Parser::parseAddExp() + } + + Expression *Parser::parseShiftExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseAddExp(); + while (1) +@@ -6500,10 +6789,11 @@ Expression *Parser::parseShiftExp() + + #if DMDV1 + Expression *Parser::parseRelExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- enum TOK op; +- Loc loc = this->loc; ++ TOK op; ++ Loc loc = token.loc; + + e = parseShiftExp(); + while (1) +@@ -6557,14 +6847,15 @@ Expression *Parser::parseRelExp() + + #if DMDV1 + Expression *Parser::parseEqualExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; + Token *t; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseRelExp(); + while (1) +- { enum TOK value = token.value; ++ { TOK value = token.value; + + switch (value) + { +@@ -6612,13 +6903,14 @@ Expression *Parser::parseEqualExp() + #endif + + Expression *Parser::parseCmpExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; + Token *t; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseShiftExp(); +- enum TOK op = token.value; ++ TOK op = token.value; + + switch (op) + { +@@ -6688,7 +6980,7 @@ Expression *Parser::parseCmpExp() + + Expression *Parser::parseAndExp() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + Expression *e = parseCmpExp(); + while (token.value == TOKand) +@@ -6698,14 +6990,14 @@ Expression *Parser::parseAndExp() + Expression *e2 = parseCmpExp(); + checkParens(TOKand, e2); + e = new AndExp(loc,e,e2); +- loc = this->loc; ++ loc = token.loc; + } + return e; + } + + Expression *Parser::parseXorExp() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + Expression *e = parseAndExp(); + while (token.value == TOKxor) +@@ -6721,7 +7013,7 @@ Expression *Parser::parseXorExp() + + Expression *Parser::parseOrExp() + { +- Loc loc = this->loc; ++ Loc loc = token.loc; + + Expression *e = parseXorExp(); + while (token.value == TOKor) +@@ -6736,9 +7028,10 @@ Expression *Parser::parseOrExp() + } + + Expression *Parser::parseAndAndExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseOrExp(); + while (token.value == TOKandand) +@@ -6751,9 +7044,10 @@ Expression *Parser::parseAndAndExp() + } + + Expression *Parser::parseOrOrExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseAndAndExp(); + while (token.value == TOKoror) +@@ -6766,10 +7060,11 @@ Expression *Parser::parseOrOrExp() + } + + Expression *Parser::parseCondExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e1; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + e = parseOrOrExp(); + if (token.value == TOKquestion) +@@ -6784,14 +7079,15 @@ Expression *Parser::parseCondExp() + } + + Expression *Parser::parseAssignExp() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; + Loc loc; + + e = parseCondExp(); + while (1) + { +- loc = this->loc; ++ loc = token.loc; + switch (token.value) + { + #define X(tok,ector) \ +@@ -6822,9 +7118,10 @@ Expression *Parser::parseAssignExp() + } + + Expression *Parser::parseExpression() +-{ Expression *e; ++{ ++ Expression *e; + Expression *e2; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + //printf("Parser::parseExpression() loc = %d\n", loc.linnum); + e = parseAssignExp(); +@@ -6833,7 +7130,7 @@ Expression *Parser::parseExpression() + nextToken(); + e2 = parseAssignExp(); + e = new CommaExp(loc, e, e2); +- loc = this->loc; ++ loc = token.loc; + } + return e; + } +@@ -6848,7 +7145,7 @@ Expressions *Parser::parseArguments() + { // function call + Expressions *arguments; + Expression *arg; +- enum TOK endtok; ++ TOK endtok; + + arguments = new Expressions(); + if (token.value == TOKlbracket) +@@ -6875,11 +7172,12 @@ Expressions *Parser::parseArguments() + */ + + Expression *Parser::parseNewExp(Expression *thisexp) +-{ Type *t; ++{ ++ Type *t; + Expressions *newargs; + Expressions *arguments = NULL; + Expression *e; +- Loc loc = this->loc; ++ Loc loc = token.loc; + + nextToken(); + newargs = NULL; +@@ -6961,7 +7259,7 @@ Expression *Parser::parseNewExp(Expressi + /********************************************** + */ + +-void Parser::addComment(Dsymbol *s, unsigned char *blockComment) ++void Parser::addComment(Dsymbol *s, utf8_t *blockComment) + { + s->addComment(combineComments(blockComment, token.lineComment)); + token.lineComment = NULL; +@@ -6972,7 +7270,7 @@ void Parser::addComment(Dsymbol *s, unsi + * Set operator precedence for each operator. + */ + +-enum PREC precedence[TOKMAX]; ++PREC precedence[TOKMAX]; + + void initPrecedence() + { +@@ -6997,9 +7295,13 @@ void initPrecedence() + precedence[TOKstring] = PREC_primary; + precedence[TOKarrayliteral] = PREC_primary; + precedence[TOKassocarrayliteral] = PREC_primary; ++ precedence[TOKclassreference] = PREC_primary; + #if DMDV2 + precedence[TOKfile] = PREC_primary; + precedence[TOKline] = PREC_primary; ++ precedence[TOKmodulestring] = PREC_primary; ++ precedence[TOKfuncstring] = PREC_primary; ++ precedence[TOKprettyfunc] = PREC_primary; + #endif + precedence[TOKtypeid] = PREC_primary; + precedence[TOKis] = PREC_primary; +--- a/src/gcc/d/dfrontend/parse.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/parse.h 2014-04-01 16:32:51.000000000 +0100 +@@ -19,32 +19,32 @@ + #include "lexer.h" + #include "enum.h" + +-struct Type; +-struct TypeQualified; +-struct Expression; +-struct Declaration; +-struct Statement; +-struct Import; +-struct Initializer; +-struct FuncDeclaration; +-struct CtorDeclaration; +-struct PostBlitDeclaration; +-struct DtorDeclaration; +-struct StaticCtorDeclaration; +-struct StaticDtorDeclaration; +-struct SharedStaticCtorDeclaration; +-struct SharedStaticDtorDeclaration; +-struct ConditionalDeclaration; +-struct InvariantDeclaration; +-struct UnitTestDeclaration; +-struct NewDeclaration; +-struct DeleteDeclaration; +-struct Condition; +-struct Module; ++class Type; ++class TypeQualified; ++class Expression; ++class Declaration; ++class Statement; ++class Import; ++class Initializer; ++class FuncDeclaration; ++class CtorDeclaration; ++class PostBlitDeclaration; ++class DtorDeclaration; ++class StaticCtorDeclaration; ++class StaticDtorDeclaration; ++class SharedStaticCtorDeclaration; ++class SharedStaticDtorDeclaration; ++class ConditionalDeclaration; ++class InvariantDeclaration; ++class UnitTestDeclaration; ++class NewDeclaration; ++class DeleteDeclaration; ++class Condition; ++class Module; + struct ModuleDeclaration; +-struct TemplateDeclaration; +-struct TemplateInstance; +-struct StaticAssert; ++class TemplateDeclaration; ++class TemplateInstance; ++class StaticAssert; + + /************************************ + * These control how parseStatement() works. +@@ -60,20 +60,21 @@ enum ParseStatementFlags + }; + + +-struct Parser : Lexer ++class Parser : public Lexer + { ++public: + ModuleDeclaration *md; +- enum LINK linkage; ++ LINK linkage; + Loc endloc; // set to location of last right curly + int inBrackets; // inside [] of array index or slice + Loc lookingForElse; // location of lonely if looking for an else + +- Parser(Module *module, unsigned char *base, size_t length, int doDocComment); ++ Parser(Module *module, utf8_t *base, size_t length, int doDocComment); + + Dsymbols *parseModule(); +- Dsymbols *parseDeclDefs(int once); +- Dsymbols *parseAutoDeclarations(StorageClass storageClass, unsigned char *comment); +- Dsymbols *parseBlock(); ++ Dsymbols *parseDeclDefs(int once, Dsymbol **pLastDecl = NULL); ++ Dsymbols *parseAutoDeclarations(StorageClass storageClass, utf8_t *comment); ++ Dsymbols *parseBlock(Dsymbol **pLastDecl); + void composeStorageClass(StorageClass stc); + StorageClass parseAttribute(Expressions **pexps); + StorageClass parsePostfix(); +@@ -88,7 +89,7 @@ struct Parser : Lexer + StaticAssert *parseStaticAssert(); + TypeQualified *parseTypeof(); + Type *parseVector(); +- enum LINK parseLinkage(); ++ LINK parseLinkage(); + Condition *parseDebugCondition(); + Condition *parseVersionCondition(); + Condition *parseStaticIfCondition(); +@@ -111,22 +112,23 @@ struct Parser : Lexer + Type *parseBasicType(); + Type *parseBasicType2(Type *t); + Type *parseDeclarator(Type *t, Identifier **pident, TemplateParameters **tpl = NULL, StorageClass storage_class = 0, int* pdisable = NULL); +- Dsymbols *parseDeclarations(StorageClass storage_class, unsigned char *comment); ++ Dsymbols *parseDeclarations(StorageClass storage_class, utf8_t *comment); + void parseContracts(FuncDeclaration *f); + void checkDanglingElse(Loc elseloc); +- Statement *parseStatement(int flags); ++ /** endPtr used for documented unittests */ ++ Statement *parseStatement(int flags, utf8_t** endPtr = NULL); + #ifdef IN_GCC + Statement *parseExtAsm(); + #endif + Initializer *parseInitializer(); + Expression *parseDefaultInitExp(); +- void check(Loc loc, enum TOK value); +- void check(enum TOK value); +- void check(enum TOK value, const char *string); +- void checkParens(enum TOK value, Expression *e); +- int isDeclaration(Token *t, int needId, enum TOK endtok, Token **pt); ++ void check(Loc loc, TOK value); ++ void check(TOK value); ++ void check(TOK value, const char *string); ++ void checkParens(TOK value, Expression *e); ++ int isDeclaration(Token *t, int needId, TOK endtok, Token **pt); + int isBasicType(Token **pt); +- int isDeclarator(Token **pt, int *haveId, enum TOK endtok); ++ int isDeclarator(Token **pt, int *haveId, int *haveTpl, TOK endtok); + int isParameters(Token **pt); + int isExpression(Token **pt); + int skipParens(Token *t, Token **pt); +@@ -156,7 +158,7 @@ struct Parser : Lexer + + Expression *parseNewExp(Expression *thisexp); + +- void addComment(Dsymbol *s, unsigned char *blockComment); ++ void addComment(Dsymbol *s, utf8_t *blockComment); + }; + + // Operator precedence - greater values are higher precedence +@@ -182,7 +184,7 @@ enum PREC + PREC_primary, + }; + +-extern enum PREC precedence[TOKMAX]; ++extern PREC precedence[TOKMAX]; + + void initPrecedence(); + +--- a/src/gcc/d/dfrontend/port.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/port.h 2014-04-01 16:32:51.000000000 +0100 +@@ -10,37 +10,13 @@ + // Portable wrapper around compiler/system specific things. + // The idea is to minimize #ifdef's in the app code. + ++#include // for alloca + #include + + #include "longdouble.h" + +-// Be careful not to care about sign when using dinteger_t +-//typedef uint64_t integer_t; +-typedef uint64_t dinteger_t; // use this instead of integer_t to +- // avoid conflicts with system #include's +- +-// Signed and unsigned variants +-typedef int64_t sinteger_t; +-typedef uint64_t uinteger_t; +- +-typedef int8_t d_int8; +-typedef uint8_t d_uns8; +-typedef int16_t d_int16; +-typedef uint16_t d_uns16; +-typedef int32_t d_int32; +-typedef uint32_t d_uns32; +-typedef int64_t d_int64; +-typedef uint64_t d_uns64; +- +-typedef float d_float32; +-typedef double d_float64; +-typedef longdouble d_float80; +- +-typedef d_uns8 d_char; +-typedef d_uns16 d_wchar; +-typedef d_uns32 d_dchar; +- + #if _MSC_VER ++#include + typedef __int64 longlong; + typedef unsigned __int64 ulonglong; + #else +@@ -48,11 +24,14 @@ typedef long long longlong; + typedef unsigned long long ulonglong; + #endif + ++typedef unsigned char utf8_t; ++ + struct Port + { +- static longdouble nan; ++ static longdouble ldbl_nan; + static longdouble snan; +- static longdouble infinity; ++ static longdouble ldbl_infinity; ++ static longdouble ldbl_max; + + static void init(); + +@@ -61,11 +40,16 @@ struct Port + static int isInfinity(longdouble); + + static longdouble fmodl(longdouble x, longdouble y); ++ static int fequal(longdouble x, longdouble y); + + static char *strupr(char *); + + static int memicmp(const char *s1, const char *s2, int n); + static int stricmp(const char *s1, const char *s2); ++ ++ static longdouble strtof(const char *p, char **endp); ++ static longdouble strtod(const char *p, char **endp); ++ static longdouble strtold(const char *p, char **endp); + }; + + #endif +--- a/src/gcc/d/dfrontend/readme.txt 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/readme.txt 2014-04-01 16:32:51.000000000 +0100 +@@ -1,15 +1,15 @@ + + The D Programming Language + Compiler Front End Source +- Copyright (c) 1999-2009, by Digital Mars +- http://www.digitalmars.com ++ Copyright (c) 1999-2013, by Digital Mars ++ http://www.digitalmars.com/ + All Rights Reserved + + + This is the source code to the front end Digital Mars D compiler. + It covers the lexical analysis, parsing, and semantic analysis + of the D Programming Language defined in the documents at +-http://www.digitalmars.com/d/ ++http://dlang.org/ + + These sources are free, they are redistributable and modifiable + under the terms of the GNU General Public License as published by +--- a/src/gcc/d/dfrontend/rmem.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/rmem.c 2014-04-01 16:32:51.000000000 +0100 +@@ -11,15 +11,7 @@ + #include + #include + +-#ifdef IN_GCC +-#include "rmem.h" +-#else +-#if linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun&&__SVR4 +-#include "../root/rmem.h" +-#else + #include "rmem.h" +-#endif +-#endif + + /* This implementation of the storage allocator uses the standard C allocation package. + */ +@@ -30,6 +22,23 @@ void Mem::init() + { + } + ++#ifdef IN_GCC ++void *mem_malloc(size_t size) ++{ ++ return mem.malloc(size); ++} ++ ++void *mem_realloc(void *p, size_t size) ++{ ++ return mem.realloc(p, size); ++} ++ ++void mem_free(void *p) ++{ ++ mem.free(p); ++} ++#endif ++ + char *Mem::strdup(const char *s) + { + char *p; +@@ -146,6 +155,61 @@ void Mem::addroots(char* pStart, char* p + + /* =================================================== */ + ++#if 1 ++ ++/* Allocate, but never release ++ */ ++ ++// Allocate a little less than 64kB because the C runtime adds some overhead that ++// causes the actual memory block to be larger than 64kB otherwise. E.g. the dmc ++// runtime rounds the size up to 128kB, but the remaining space in the chunk is less ++// than 64kB, so it cannot be used by another chunk. ++#define CHUNK_SIZE (4096 * 16 - 64) ++ ++static size_t heapleft = 0; ++static void *heapp; ++ ++void * operator new(size_t m_size) ++{ ++ // 16 byte alignment is better (and sometimes needed) for doubles ++ m_size = (m_size + 15) & ~15; ++ ++ // The layout of the code is selected so the most common case is straight through ++ if (m_size <= heapleft) ++ { ++ L1: ++ heapleft -= m_size; ++ void *p = heapp; ++ heapp = (void *)((char *)heapp + m_size); ++ return p; ++ } ++ ++ if (m_size > CHUNK_SIZE) ++ { ++ void *p = malloc(m_size); ++ if (p) ++ return p; ++ printf("Error: out of memory\n"); ++ exit(EXIT_FAILURE); ++ return p; ++ } ++ ++ heapleft = CHUNK_SIZE; ++ heapp = malloc(CHUNK_SIZE); ++ if (!heapp) ++ { ++ printf("Error: out of memory\n"); ++ exit(EXIT_FAILURE); ++ } ++ goto L1; ++} ++ ++void operator delete(void *p) ++{ ++} ++ ++#else ++ + void * operator new(size_t m_size) + { + void *p = malloc(m_size); +@@ -161,4 +225,4 @@ void operator delete(void *p) + free(p); + } + +- ++#endif +--- a/src/gcc/d/dfrontend/root.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/root.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1972 +0,0 @@ +- +-// Copyright (c) 1999-2012 by Digital Mars +-// All Rights Reserved +-// written by Walter Bright +-// http://www.digitalmars.com +-// License for redistribution is by either the Artistic License +-// in artistic.txt, or the GNU General Public License in gnu.txt. +-// See the included readme.txt for details. +- +-#define POSIX (linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#if defined (__sun) +-#include +-#endif +- +-#if _MSC_VER ||__MINGW32__ +-#include +-#include +-#endif +- +-#if _WIN32 +-#include +-#include +-#include +-#endif +- +-#if POSIX +-#include +-#include +-#include +-#include +-#include +-#include +-#endif +- +-#include "port.h" +-#include "root.h" +-#include "rmem.h" +- +-#if 0 //__SC__ //def DEBUG +-extern "C" void __cdecl _assert(void *e, void *f, unsigned line) +-{ +- printf("Assert('%s','%s',%d)\n",e,f,line); +- fflush(stdout); +- *(char *)0 = 0; +-} +-#endif +- +-#ifdef IN_GCC +-#include "config.h" +-#include "errors.h" +-#else +-/************************************** +- * Print error message and exit. +- */ +- +-void error(const char *format, ...) +-{ +- va_list ap; +- +- va_start(ap, format); +- fprintf(stderr, "Error: "); +- vfprintf(stderr, format, ap); +- va_end( ap ); +- printf("\n"); +- fflush(stderr); +- +- exit(EXIT_FAILURE); +-} +- +-/************************************** +- * Print warning message. +- */ +- +-void warning(const char *format, ...) +-{ +- va_list ap; +- +- va_start(ap, format); +- fprintf(stderr, "Warning: "); +- vfprintf(stderr, format, ap); +- va_end( ap ); +- printf("\n"); +- fflush(stderr); +-} +-#endif +- +-/****************************** Object ********************************/ +- +-int Object::equals(Object *o) +-{ +- return o == this; +-} +- +-hash_t Object::hashCode() +-{ +- return (hash_t) this; +-} +- +-int Object::compare(Object *obj) +-{ +- return this - obj; +-} +- +-void Object::print() +-{ +- fprintf(stderr, "%s %p\n", toChars(), this); +-} +- +-char *Object::toChars() +-{ +- return (char *)"Object"; +-} +- +-int Object::dyncast() +-{ +- return 0; +-} +- +-void Object::toBuffer(OutBuffer *b) +-{ +- b->writestring("Object"); +-} +- +-void Object::mark() +-{ +-} +- +-/****************************** String ********************************/ +- +-String::String(const char *str) +- : str(mem.strdup(str)) +-{ +-} +- +-String::~String() +-{ +- mem.free((void *)str); +-} +- +-void String::mark() +-{ +- mem.mark((void *)str); +-} +- +-hash_t String::calcHash(const char *str, size_t len) +-{ +- hash_t hash = 0; +- +- for (;;) +- { +- switch (len) +- { +- case 0: +- return hash; +- +- case 1: +- hash *= 37; +- hash += *(uint8_t *)str; +- return hash; +- +- case 2: +- hash *= 37; +- hash += *(uint16_t *)str; +- return hash; +- +- case 3: +- hash *= 37; +- hash += (*(uint16_t *)str << 8) + +- ((uint8_t *)str)[2]; +- return hash; +- +- default: +- hash *= 37; +- hash += *(uint32_t *)str; +- str += 4; +- len -= 4; +- break; +- } +- } +-} +- +-hash_t String::calcHash(const char *str) +-{ +- return calcHash(str, strlen(str)); +-} +- +-hash_t String::hashCode() +-{ +- return calcHash(str, strlen(str)); +-} +- +-size_t String::len() +-{ +- return strlen(str); +-} +- +-int String::equals(Object *obj) +-{ +- return strcmp(str,((String *)obj)->str) == 0; +-} +- +-int String::compare(Object *obj) +-{ +- return strcmp(str,((String *)obj)->str); +-} +- +-char *String::toChars() +-{ +- return (char *)str; // toChars() should really be const +-} +- +-void String::print() +-{ +- fprintf(stderr, "String '%s'\n",str); +-} +- +- +-/****************************** FileName ********************************/ +- +-FileName::FileName(const char *str) +- : String(str) +-{ +-} +- +-const char *FileName::combine(const char *path, const char *name) +-{ char *f; +- size_t pathlen; +- size_t namelen; +- +- if (!path || !*path) +- return (char *)name; +- pathlen = strlen(path); +- namelen = strlen(name); +- f = (char *)mem.malloc(pathlen + 1 + namelen + 1); +- memcpy(f, path, pathlen); +-#if POSIX +- if (path[pathlen - 1] != '/') +- { f[pathlen] = '/'; +- pathlen++; +- } +-#elif _WIN32 +- if (path[pathlen - 1] != '\\' && +- path[pathlen - 1] != '/' && +- path[pathlen - 1] != ':') +- { f[pathlen] = '\\'; +- pathlen++; +- } +-#else +- assert(0); +-#endif +- memcpy(f + pathlen, name, namelen + 1); +- return f; +-} +- +-// Split a path into an Array of paths +-Strings *FileName::splitPath(const char *path) +-{ +- char c = 0; // unnecessary initializer is for VC /W4 +- const char *p; +- OutBuffer buf; +- Strings *array; +- +- array = new Strings(); +- if (path) +- { +- p = path; +- do +- { char instring = 0; +- +- while (isspace((unsigned char)*p)) // skip leading whitespace +- p++; +- buf.reserve(strlen(p) + 1); // guess size of path +- for (; ; p++) +- { +- c = *p; +- switch (c) +- { +- case '"': +- instring ^= 1; // toggle inside/outside of string +- continue; +- +-#if MACINTOSH +- case ',': +-#endif +-#if _WIN32 +- case ';': +-#endif +-#if POSIX +- case ':': +-#endif +- p++; +- break; // note that ; cannot appear as part +- // of a path, quotes won't protect it +- +- case 0x1A: // ^Z means end of file +- case 0: +- break; +- +- case '\r': +- continue; // ignore carriage returns +- +-#if POSIX +- case '~': +- buf.writestring(getenv("HOME")); +- continue; +-#endif +- +-#if 0 +- case ' ': +- case '\t': // tabs in filenames? +- if (!instring) // if not in string +- break; // treat as end of path +-#endif +- default: +- buf.writeByte(c); +- continue; +- } +- break; +- } +- if (buf.offset) // if path is not empty +- { +- buf.writeByte(0); // to asciiz +- array->push(buf.extractData()); +- } +- } while (c); +- } +- return array; +-} +- +-hash_t FileName::hashCode() +-{ +-#if _WIN32 +- // We need a different hashCode because it must be case-insensitive +- size_t len = strlen(str); +- hash_t hash = 0; +- unsigned char *s = (unsigned char *)str; +- +- for (;;) +- { +- switch (len) +- { +- case 0: +- return hash; +- +- case 1: +- hash *= 37; +- hash += *(uint8_t *)s | 0x20; +- return hash; +- +- case 2: +- hash *= 37; +- hash += *(uint16_t *)s | 0x2020; +- return hash; +- +- case 3: +- hash *= 37; +- hash += ((*(uint16_t *)s << 8) + +- ((uint8_t *)s)[2]) | 0x202020; +- break; +- +- default: +- hash *= 37; +- hash += *(uint32_t *)s | 0x20202020; +- s += 4; +- len -= 4; +- break; +- } +- } +-#else +- // darwin HFS is case insensitive, though... +- return String::hashCode(); +-#endif +-} +- +-int FileName::compare(Object *obj) +-{ +- return compare(str, ((FileName *)obj)->str); +-} +- +-int FileName::compare(const char *name1, const char *name2) +-{ +-#if _WIN32 +- return stricmp(name1, name2); +-#else +- return strcmp(name1, name2); +-#endif +-} +- +-int FileName::equals(Object *obj) +-{ +- return compare(obj) == 0; +-} +- +-int FileName::equals(const char *name1, const char *name2) +-{ +- return compare(name1, name2) == 0; +-} +- +-/************************************ +- * Return !=0 if absolute path name. +- */ +- +-int FileName::absolute(const char *name) +-{ +-#if _WIN32 +- return (*name == '\\') || +- (*name == '/') || +- (*name && name[1] == ':'); +-#elif POSIX +- return (*name == '/'); +-#else +- assert(0); +-#endif +-} +- +-/******************************** +- * Return filename extension (read-only). +- * Points past '.' of extension. +- * If there isn't one, return NULL. +- */ +- +-const char *FileName::ext(const char *str) +-{ +- size_t len = strlen(str); +- +- const char *e = str + len; +- for (;;) +- { +- switch (*e) +- { case '.': +- return e + 1; +-#if POSIX +- case '/': +- break; +-#endif +-#if _WIN32 +- case '\\': +- case ':': +- case '/': +- break; +-#endif +- default: +- if (e == str) +- break; +- e--; +- continue; +- } +- return NULL; +- } +-} +- +-const char *FileName::ext() +-{ +- return ext(str); +-} +- +-/******************************** +- * Return mem.malloc'd filename with extension removed. +- */ +- +-const char *FileName::removeExt(const char *str) +-{ +- const char *e = ext(str); +- if (e) +- { size_t len = (e - str) - 1; +- char *n = (char *)mem.malloc(len + 1); +- memcpy(n, str, len); +- n[len] = 0; +- return n; +- } +- return mem.strdup(str); +-} +- +-/******************************** +- * Return filename name excluding path (read-only). +- */ +- +-const char *FileName::name(const char *str) +-{ +- size_t len = strlen(str); +- +- const char *e = str + len; +- for (;;) +- { +- switch (*e) +- { +-#if POSIX +- case '/': +- return e + 1; +-#endif +-#if _WIN32 +- case '/': +- case '\\': +- return e + 1; +- case ':': +- /* The ':' is a drive letter only if it is the second +- * character or the last character, +- * otherwise it is an ADS (Alternate Data Stream) separator. +- * Consider ADS separators as part of the file name. +- */ +- if (e == str + 1 || e == str + len - 1) +- return e + 1; +-#endif +- default: +- if (e == str) +- break; +- e--; +- continue; +- } +- return e; +- } +-} +- +-const char *FileName::name() +-{ +- return name(str); +-} +- +-/************************************** +- * Return path portion of str. +- * Path will does not include trailing path separator. +- */ +- +-const char *FileName::path(const char *str) +-{ +- const char *n = name(str); +- size_t pathlen; +- +- if (n > str) +- { +-#if POSIX +- if (n[-1] == '/') +- n--; +-#elif _WIN32 +- if (n[-1] == '\\' || n[-1] == '/') +- n--; +-#else +- assert(0); +-#endif +- } +- pathlen = n - str; +- char *path = (char *)mem.malloc(pathlen + 1); +- memcpy(path, str, pathlen); +- path[pathlen] = 0; +- return path; +-} +- +-/************************************** +- * Replace filename portion of path. +- */ +- +-const char *FileName::replaceName(const char *path, const char *name) +-{ +- size_t pathlen; +- size_t namelen; +- +- if (absolute(name)) +- return name; +- +- const char *n = FileName::name(path); +- if (n == path) +- return name; +- pathlen = n - path; +- namelen = strlen(name); +- char *f = (char *)mem.malloc(pathlen + 1 + namelen + 1); +- memcpy(f, path, pathlen); +-#if POSIX +- if (path[pathlen - 1] != '/') +- { f[pathlen] = '/'; +- pathlen++; +- } +-#elif _WIN32 +- if (path[pathlen - 1] != '\\' && +- path[pathlen - 1] != '/' && +- path[pathlen - 1] != ':') +- { f[pathlen] = '\\'; +- pathlen++; +- } +-#else +- assert(0); +-#endif +- memcpy(f + pathlen, name, namelen + 1); +- return f; +-} +- +-/*************************** +- * Free returned value with FileName::free() +- */ +- +-const char *FileName::defaultExt(const char *name, const char *ext) +-{ +- const char *e = FileName::ext(name); +- if (e) // if already has an extension +- return mem.strdup(name); +- +- size_t len = strlen(name); +- size_t extlen = strlen(ext); +- char *s = (char *)mem.malloc(len + 1 + extlen + 1); +- memcpy(s,name,len); +- s[len] = '.'; +- memcpy(s + len + 1, ext, extlen + 1); +- return s; +-} +- +-/*************************** +- * Free returned value with FileName::free() +- */ +- +-const char *FileName::forceExt(const char *name, const char *ext) +-{ +- const char *e = FileName::ext(name); +- if (e) // if already has an extension +- { +- size_t len = e - name; +- size_t extlen = strlen(ext); +- +- char *s = (char *)mem.malloc(len + extlen + 1); +- memcpy(s,name,len); +- memcpy(s + len, ext, extlen + 1); +- return s; +- } +- else +- return defaultExt(name, ext); // doesn't have one +-} +- +-/****************************** +- * Return !=0 if extensions match. +- */ +- +-int FileName::equalsExt(const char *ext) +-{ +- return equalsExt(str, ext); +-} +- +-int FileName::equalsExt(const char *name, const char *ext) +-{ +- const char *e = FileName::ext(name); +- if (!e && !ext) +- return 1; +- if (!e || !ext) +- return 0; +- return FileName::compare(e, ext) == 0; +-} +- +-/************************************* +- * Copy file from this to to. +- */ +- +-void FileName::CopyTo(FileName *to) +-{ +- File file(this); +- +-#if _WIN32 +- file.touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA)); // keep same file time +-#elif POSIX +- file.touchtime = mem.malloc(sizeof(struct stat)); // keep same file time +-#else +- assert(0); +-#endif +- file.readv(); +- file.name = to; +- file.writev(); +-} +- +-/************************************* +- * Search Path for file. +- * Input: +- * cwd if !=0, search current directory before searching path +- */ +- +-const char *FileName::searchPath(Strings *path, const char *name, int cwd) +-{ +- if (absolute(name)) +- { +- return exists(name) ? name : NULL; +- } +- if (cwd) +- { +- if (exists(name)) +- return name; +- } +- if (path) +- { +- +- for (size_t i = 0; i < path->dim; i++) +- { +- const char *p = path->tdata()[i]; +- const char *n = combine(p, name); +- +- if (exists(n)) +- return n; +- } +- } +- return NULL; +-} +- +- +-/************************************* +- * Search Path for file in a safe manner. +- * +- * Be wary of CWE-22: Improper Limitation of a Pathname to a Restricted Directory +- * ('Path Traversal') attacks. +- * http://cwe.mitre.org/data/definitions/22.html +- * More info: +- * https://www.securecoding.cert.org/confluence/display/seccode/FIO02-C.+Canonicalize+path+names+originating+from+untrusted+sources +- * Returns: +- * NULL file not found +- * !=NULL mem.malloc'd file name +- */ +- +-const char *FileName::safeSearchPath(Strings *path, const char *name) +-{ +-#if _WIN32 +- /* Disallow % / \ : and .. in name characters +- */ +- for (const char *p = name; *p; p++) +- { +- char c = *p; +- if (c == '\\' || c == '/' || c == ':' || c == '%' || +- (c == '.' && p[1] == '.')) +- { +- return NULL; +- } +- } +- +- return FileName::searchPath(path, name, 0); +-#elif POSIX +- /* Even with realpath(), we must check for // and disallow it +- */ +- for (const char *p = name; *p; p++) +- { +- char c = *p; +- if (c == '/' && p[1] == '/') +- { +- return NULL; +- } +- } +- +- if (path) +- { +- /* Each path is converted to a cannonical name and then a check is done to see +- * that the searched name is really a child one of the the paths searched. +- */ +- for (size_t i = 0; i < path->dim; i++) +- { +- const char *cname = NULL; +- const char *cpath = canonicalName(path->tdata()[i]); +- //printf("FileName::safeSearchPath(): name=%s; path=%s; cpath=%s\n", +- // name, (char *)path->data[i], cpath); +- if (cpath == NULL) +- goto cont; +- cname = canonicalName(combine(cpath, name)); +- //printf("FileName::safeSearchPath(): cname=%s\n", cname); +- if (cname == NULL) +- goto cont; +- //printf("FileName::safeSearchPath(): exists=%i " +- // "strncmp(cpath, cname, %i)=%i\n", exists(cname), +- // strlen(cpath), strncmp(cpath, cname, strlen(cpath))); +- // exists and name is *really* a "child" of path +- if (exists(cname) && strncmp(cpath, cname, strlen(cpath)) == 0) +- { +- ::free((void *)cpath); +- const char *p = mem.strdup(cname); +- ::free((void *)cname); +- return p; +- } +-cont: +- if (cpath) +- ::free((void *)cpath); +- if (cname) +- ::free((void *)cname); +- } +- } +- return NULL; +-#else +- assert(0); +-#endif +-} +- +- +-int FileName::exists(const char *name) +-{ +-#if POSIX +- struct stat st; +- +- if (stat(name, &st) < 0) +- return 0; +- if (S_ISDIR(st.st_mode)) +- return 2; +- return 1; +-#elif _WIN32 +- DWORD dw; +- int result; +- +- dw = GetFileAttributesA(name); +- if (dw == -1L) +- result = 0; +- else if (dw & FILE_ATTRIBUTE_DIRECTORY) +- result = 2; +- else +- result = 1; +- return result; +-#else +- assert(0); +-#endif +-} +- +-void FileName::ensurePathExists(const char *path) +-{ +- //printf("FileName::ensurePathExists(%s)\n", path ? path : ""); +- if (path && *path) +- { +- if (!exists(path)) +- { +- const char *p = FileName::path(path); +- if (*p) +- { +-#if _WIN32 +- size_t len = strlen(path); +- if (len > 2 && p[-1] == ':' && path + 2 == p) +- { mem.free((void *)p); +- return; +- } +-#endif +- ensurePathExists(p); +- mem.free((void *)p); +- } +-#if _WIN32 +- if (path[strlen(path) - 1] != '\\') +-#endif +-#if POSIX +- if (path[strlen(path) - 1] != '\\') +-#endif +- { +- //printf("mkdir(%s)\n", path); +-#if _WIN32 +- if (_mkdir(path)) +-#endif +-#if POSIX +- if (mkdir(path, 0777)) +-#endif +- { +- /* Don't error out if another instance of dmd just created +- * this directory +- */ +- if (errno != EEXIST) +- error("cannot create directory %s", path); +- } +- } +- } +- } +-} +- +-void FileName::ensurePathToNameExists(const char *name) +-{ +- const char *pt = path(name); +- if (*pt) +- ensurePathExists(pt); +- free(pt); +-} +- +- +-/****************************************** +- * Return canonical version of name in a malloc'd buffer. +- * This code is high risk. +- */ +-const char *FileName::canonicalName(const char *name) +-{ +-#if linux +- // Lovely glibc extension to do it for us +- return canonicalize_file_name(name); +-#elif POSIX +- #if _POSIX_VERSION >= 200809L || defined (linux) +- // NULL destination buffer is allowed and preferred +- return realpath(name, NULL); +- #else +- char *cname = NULL; +- #if PATH_MAX +- /* PATH_MAX must be defined as a constant in , +- * otherwise using it is unsafe due to TOCTOU +- */ +- size_t path_max = (size_t)PATH_MAX; +- if (path_max > 0) +- { +- /* Need to add one to PATH_MAX because of realpath() buffer overflow bug: +- * http://isec.pl/vulnerabilities/isec-0011-wu-ftpd.txt +- */ +- cname = (char *)malloc(path_max + 1); +- if (cname == NULL) +- return NULL; +- } +- #endif +- return realpath(name, cname); +- #endif +-#elif _WIN32 +- /* Apparently, there is no good way to do this on Windows. +- * GetFullPathName isn't it, but use it anyway. +- */ +- DWORD result = GetFullPathName(name, 0, NULL, NULL); +- if (result) +- { +- char *buf = (char *)malloc(result); +- result = GetFullPathName(name, result, buf, NULL); +- if (result == 0) +- { +- ::free(buf); +- return NULL; +- } +- return buf; +- } +- return NULL; +-#else +- assert(0); +- return NULL; +-#endif +-} +- +-/******************************** +- * Free memory allocated by FileName routines +- */ +-void FileName::free(const char *str) +-{ +- if (str) +- { assert(str[0] != 0xAB); +- memset((void *)str, 0xAB, strlen(str) + 1); // stomp +- } +- mem.free((void *)str); +-} +- +- +-/****************************** File ********************************/ +- +-File::File(const FileName *n) +-{ +- ref = 0; +- buffer = NULL; +- len = 0; +- touchtime = NULL; +- name = (FileName *)n; +-} +- +-File::File(const char *n) +-{ +- ref = 0; +- buffer = NULL; +- len = 0; +- touchtime = NULL; +- name = new FileName(n); +-} +- +-File::~File() +-{ +- if (buffer) +- { +- if (ref == 0) +- mem.free(buffer); +-#if _WIN32 +- else if (ref == 2) +- UnmapViewOfFile(buffer); +-#endif +- } +- if (touchtime) +- mem.free(touchtime); +-} +- +-void File::mark() +-{ +- mem.mark(buffer); +- mem.mark(touchtime); +- mem.mark(name); +-} +- +-/************************************* +- */ +- +-int File::read() +-{ +-#if POSIX +- off_t size; +- ssize_t numread; +- int fd; +- struct stat buf; +- int result = 0; +- char *name; +- +- name = this->name->toChars(); +- //printf("File::read('%s')\n",name); +- fd = open(name, O_RDONLY); +- if (fd == -1) +- { +- //printf("\topen error, errno = %d\n",errno); +- goto err1; +- } +- +- if (!ref) +- ::free(buffer); +- ref = 0; // we own the buffer now +- +- //printf("\tfile opened\n"); +- if (fstat(fd, &buf)) +- { +- fprintf(stderr, "\tfstat error, errno = %d\n",errno); +- goto err2; +- } +- size = buf.st_size; +- buffer = (unsigned char *) ::malloc(size + 2); +- if (!buffer) +- { +- fprintf(stderr, "\tmalloc error, errno = %d\n",errno); +- goto err2; +- } +- +- numread = ::read(fd, buffer, size); +- if (numread != size) +- { +- fprintf(stderr, "\tread error, errno = %d\n",errno); +- goto err2; +- } +- +- if (touchtime) +- memcpy(touchtime, &buf, sizeof(buf)); +- +- if (close(fd) == -1) +- { +- fprintf(stderr, "\tclose error, errno = %d\n",errno); +- goto err; +- } +- +- len = size; +- +- // Always store a wchar ^Z past end of buffer so scanner has a sentinel +- buffer[size] = 0; // ^Z is obsolete, use 0 +- buffer[size + 1] = 0; +- return 0; +- +-err2: +- close(fd); +-err: +- ::free(buffer); +- buffer = NULL; +- len = 0; +- +-err1: +- result = 1; +- return result; +-#elif _WIN32 +- DWORD size; +- DWORD numread; +- HANDLE h; +- int result = 0; +- char *name; +- +- name = this->name->toChars(); +- h = CreateFileA(name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, +- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,0); +- if (h == INVALID_HANDLE_VALUE) +- goto err1; +- +- if (!ref) +- ::free(buffer); +- ref = 0; +- +- size = GetFileSize(h,NULL); +- buffer = (unsigned char *) ::malloc(size + 2); +- if (!buffer) +- goto err2; +- +- if (ReadFile(h,buffer,size,&numread,NULL) != TRUE) +- goto err2; +- +- if (numread != size) +- goto err2; +- +- if (touchtime) +- { +- if (!GetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime)) +- goto err2; +- } +- +- if (!CloseHandle(h)) +- goto err; +- +- len = size; +- +- // Always store a wchar ^Z past end of buffer so scanner has a sentinel +- buffer[size] = 0; // ^Z is obsolete, use 0 +- buffer[size + 1] = 0; +- return 0; +- +-err2: +- CloseHandle(h); +-err: +- ::free(buffer); +- buffer = NULL; +- len = 0; +- +-err1: +- result = 1; +- return result; +-#else +- assert(0); +-#endif +-} +- +-/***************************** +- * Read a file with memory mapped file I/O. +- */ +- +-int File::mmread() +-{ +-#if POSIX +- return read(); +-#elif _WIN32 +- HANDLE hFile; +- HANDLE hFileMap; +- DWORD size; +- char *name; +- +- name = this->name->toChars(); +- hFile = CreateFile(name, GENERIC_READ, +- FILE_SHARE_READ, NULL, +- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +- if (hFile == INVALID_HANDLE_VALUE) +- goto Lerr; +- size = GetFileSize(hFile, NULL); +- //printf(" file created, size %d\n", size); +- +- hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,size,NULL); +- if (CloseHandle(hFile) != TRUE) +- goto Lerr; +- +- if (hFileMap == NULL) +- goto Lerr; +- +- //printf(" mapping created\n"); +- +- if (!ref) +- mem.free(buffer); +- ref = 2; +- buffer = (unsigned char *)MapViewOfFileEx(hFileMap, FILE_MAP_READ,0,0,size,NULL); +- if (CloseHandle(hFileMap) != TRUE) +- goto Lerr; +- if (buffer == NULL) // mapping view failed +- goto Lerr; +- +- len = size; +- //printf(" buffer = %p\n", buffer); +- +- return 0; +- +-Lerr: +- return GetLastError(); // failure +-#else +- assert(0); +-#endif +-} +- +-/********************************************* +- * Write a file. +- * Returns: +- * 0 success +- */ +- +-int File::write() +-{ +-#if POSIX +- int fd; +- ssize_t numwritten; +- char *name; +- +- name = this->name->toChars(); +- fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644); +- if (fd == -1) +- goto err; +- +- numwritten = ::write(fd, buffer, len); +- if (len != numwritten) +- goto err2; +- +- if (close(fd) == -1) +- goto err; +- +- if (touchtime) +- { struct utimbuf ubuf; +- +- ubuf.actime = ((struct stat *)touchtime)->st_atime; +- ubuf.modtime = ((struct stat *)touchtime)->st_mtime; +- if (utime(name, &ubuf)) +- goto err; +- } +- return 0; +- +-err2: +- close(fd); +- ::remove(name); +-err: +- return 1; +-#elif _WIN32 +- HANDLE h; +- DWORD numwritten; +- char *name; +- +- name = this->name->toChars(); +- h = CreateFileA(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, +- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); +- if (h == INVALID_HANDLE_VALUE) +- goto err; +- +- if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE) +- goto err2; +- +- if (len != numwritten) +- goto err2; +- +- if (touchtime) { +- SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime); +- } +- if (!CloseHandle(h)) +- goto err; +- return 0; +- +-err2: +- CloseHandle(h); +- DeleteFileA(name); +-err: +- return 1; +-#else +- assert(0); +-#endif +-} +- +-/********************************************* +- * Append to a file. +- * Returns: +- * 0 success +- */ +- +-int File::append() +-{ +-#if POSIX +- return 1; +-#elif _WIN32 +- HANDLE h; +- DWORD numwritten; +- char *name; +- +- name = this->name->toChars(); +- h = CreateFileA(name,GENERIC_WRITE,0,NULL,OPEN_ALWAYS, +- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); +- if (h == INVALID_HANDLE_VALUE) +- goto err; +- +-#if 1 +- SetFilePointer(h, 0, NULL, FILE_END); +-#else // INVALID_SET_FILE_POINTER doesn't seem to have a definition +- if (SetFilePointer(h, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) +- goto err; +-#endif +- +- if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE) +- goto err2; +- +- if (len != numwritten) +- goto err2; +- +- if (touchtime) { +- SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime); +- } +- if (!CloseHandle(h)) +- goto err; +- return 0; +- +-err2: +- CloseHandle(h); +-err: +- return 1; +-#else +- assert(0); +-#endif +-} +- +-/************************************** +- */ +- +-void File::readv() +-{ +- if (read()) +- error("Error reading file '%s'",name->toChars()); +-} +- +-/************************************** +- */ +- +-void File::mmreadv() +-{ +- if (mmread()) +- readv(); +-} +- +-void File::writev() +-{ +- if (write()) +- error("Error writing file '%s'",name->toChars()); +-} +- +-void File::appendv() +-{ +- if (write()) +- error("Error appending to file '%s'",name->toChars()); +-} +- +-/******************************************* +- * Return !=0 if file exists. +- * 0: file doesn't exist +- * 1: normal file +- * 2: directory +- */ +- +-int File::exists() +-{ +-#if POSIX +- return 0; +-#elif _WIN32 +- DWORD dw; +- int result; +- char *name; +- +- name = this->name->toChars(); +- if (touchtime) +- dw = ((WIN32_FIND_DATAA *)touchtime)->dwFileAttributes; +- else +- dw = GetFileAttributesA(name); +- if (dw == -1L) +- result = 0; +- else if (dw & FILE_ATTRIBUTE_DIRECTORY) +- result = 2; +- else +- result = 1; +- return result; +-#else +- assert(0); +-#endif +-} +- +-void File::remove() +-{ +-#if POSIX +- ::remove(this->name->toChars()); +-#elif _WIN32 +- DeleteFileA(this->name->toChars()); +-#else +- assert(0); +-#endif +-} +- +-Files *File::match(char *n) +-{ +- return match(new FileName(n)); +-} +- +-Files *File::match(FileName *n) +-{ +-#if POSIX +- return NULL; +-#elif _WIN32 +- HANDLE h; +- WIN32_FIND_DATAA fileinfo; +- +- Files *a = new Files(); +- const char *c = n->toChars(); +- const char *name = n->name(); +- h = FindFirstFileA(c,&fileinfo); +- if (h != INVALID_HANDLE_VALUE) +- { +- do +- { +- // Glue path together with name +- char *fn; +- File *f; +- +- fn = (char *)mem.malloc(name - c + strlen(fileinfo.cFileName) + 1); +- memcpy(fn, c, name - c); +- strcpy(fn + (name - c), fileinfo.cFileName); +- f = new File(fn); +- f->touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA)); +- memcpy(f->touchtime, &fileinfo, sizeof(fileinfo)); +- a->push(f); +- } while (FindNextFileA(h,&fileinfo) != FALSE); +- FindClose(h); +- } +- return a; +-#else +- assert(0); +-#endif +-} +- +-int File::compareTime(File *f) +-{ +-#if POSIX +- return 0; +-#elif _WIN32 +- if (!touchtime) +- stat(); +- if (!f->touchtime) +- f->stat(); +- return CompareFileTime(&((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime, &((WIN32_FIND_DATAA *)f->touchtime)->ftLastWriteTime); +-#else +- assert(0); +-#endif +-} +- +-void File::stat() +-{ +-#if POSIX +- if (!touchtime) +- { +- touchtime = mem.calloc(1, sizeof(struct stat)); +- } +-#elif _WIN32 +- HANDLE h; +- +- if (!touchtime) +- { +- touchtime = mem.calloc(1, sizeof(WIN32_FIND_DATAA)); +- } +- h = FindFirstFileA(name->toChars(),(WIN32_FIND_DATAA *)touchtime); +- if (h != INVALID_HANDLE_VALUE) +- { +- FindClose(h); +- } +-#else +- assert(0); +-#endif +-} +- +-void File::checkoffset(size_t offset, size_t nbytes) +-{ +- if (offset > len || offset + nbytes > len) +- error("Corrupt file '%s': offset x%llx off end of file",toChars(),(ulonglong)offset); +-} +- +-char *File::toChars() +-{ +- return name->toChars(); +-} +- +- +-/************************* OutBuffer *************************/ +- +-OutBuffer::OutBuffer() +-{ +- data = NULL; +- offset = 0; +- size = 0; +- +- doindent = 0; +- level = 0; +- linehead = 1; +-} +- +-OutBuffer::~OutBuffer() +-{ +- mem.free(data); +-} +- +-char *OutBuffer::extractData() +-{ +- char *p; +- +- p = (char *)data; +- data = NULL; +- offset = 0; +- size = 0; +- return p; +-} +- +-void OutBuffer::mark() +-{ +- mem.mark(data); +-} +- +-void OutBuffer::reserve(size_t nbytes) +-{ +- //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes); +- if (size - offset < nbytes) +- { +- size = (offset + nbytes) * 2; +- data = (unsigned char *)mem.realloc(data, size); +- } +-} +- +-void OutBuffer::reset() +-{ +- offset = 0; +-} +- +-void OutBuffer::setsize(size_t size) +-{ +- offset = size; +-} +- +-void OutBuffer::write(const void *data, size_t nbytes) +-{ +- if (doindent && linehead) +- { +- if (level) +- { +- reserve(level); +- for (size_t i=0; idata[offset] = '\t'; +- offset++; +- } +- } +- linehead = 0; +- } +- reserve(nbytes); +- memcpy(this->data + offset, data, nbytes); +- offset += nbytes; +-} +- +-void OutBuffer::writebstring(unsigned char *string) +-{ +- write(string,*string + 1); +-} +- +-void OutBuffer::writestring(const char *string) +-{ +- write(string,strlen(string)); +-} +- +-void OutBuffer::prependstring(const char *string) +-{ +- size_t len = strlen(string); +- reserve(len); +- memmove(data + len, data, offset); +- memcpy(data, string, len); +- offset += len; +-} +- +-void OutBuffer::writenl() +-{ +-#if _WIN32 +- writeword(0x0A0D); // newline is CR,LF on Microsoft OS's +-#else +- writeByte('\n'); +-#endif +- if (doindent) +- linehead = 1; +-} +- +-void OutBuffer::writeByte(unsigned b) +-{ +- if (doindent && linehead +- && b != '\n') +- { +- if (level) +- { +- reserve(level); +- for (size_t i=0; idata[offset] = '\t'; +- offset++; +- } +- } +- linehead = 0; +- } +- reserve(1); +- this->data[offset] = (unsigned char)b; +- offset++; +-} +- +-void OutBuffer::writeUTF8(unsigned b) +-{ +- reserve(6); +- if (b <= 0x7F) +- { +- this->data[offset] = (unsigned char)b; +- offset++; +- } +- else if (b <= 0x7FF) +- { +- this->data[offset + 0] = (unsigned char)((b >> 6) | 0xC0); +- this->data[offset + 1] = (unsigned char)((b & 0x3F) | 0x80); +- offset += 2; +- } +- else if (b <= 0xFFFF) +- { +- this->data[offset + 0] = (unsigned char)((b >> 12) | 0xE0); +- this->data[offset + 1] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); +- this->data[offset + 2] = (unsigned char)((b & 0x3F) | 0x80); +- offset += 3; +- } +- else if (b <= 0x1FFFFF) +- { +- this->data[offset + 0] = (unsigned char)((b >> 18) | 0xF0); +- this->data[offset + 1] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); +- this->data[offset + 2] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); +- this->data[offset + 3] = (unsigned char)((b & 0x3F) | 0x80); +- offset += 4; +- } +- else if (b <= 0x3FFFFFF) +- { +- this->data[offset + 0] = (unsigned char)((b >> 24) | 0xF8); +- this->data[offset + 1] = (unsigned char)(((b >> 18) & 0x3F) | 0x80); +- this->data[offset + 2] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); +- this->data[offset + 3] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); +- this->data[offset + 4] = (unsigned char)((b & 0x3F) | 0x80); +- offset += 5; +- } +- else if (b <= 0x7FFFFFFF) +- { +- this->data[offset + 0] = (unsigned char)((b >> 30) | 0xFC); +- this->data[offset + 1] = (unsigned char)(((b >> 24) & 0x3F) | 0x80); +- this->data[offset + 2] = (unsigned char)(((b >> 18) & 0x3F) | 0x80); +- this->data[offset + 3] = (unsigned char)(((b >> 12) & 0x3F) | 0x80); +- this->data[offset + 4] = (unsigned char)(((b >> 6) & 0x3F) | 0x80); +- this->data[offset + 5] = (unsigned char)((b & 0x3F) | 0x80); +- offset += 6; +- } +- else +- assert(0); +-} +- +-void OutBuffer::prependbyte(unsigned b) +-{ +- reserve(1); +- memmove(data + 1, data, offset); +- data[0] = (unsigned char)b; +- offset++; +-} +- +-void OutBuffer::writeword(unsigned w) +-{ +- if (doindent && linehead +-#if _WIN32 +- && w != 0x0A0D) +-#else +- && w != '\n') +-#endif +- { +- if (level) +- { +- reserve(level); +- for (size_t i=0; idata[offset] = '\t'; +- offset++; +- } +- } +- linehead = 0; +- } +- reserve(2); +- *(unsigned short *)(this->data + offset) = (unsigned short)w; +- offset += 2; +-} +- +-void OutBuffer::writeUTF16(unsigned w) +-{ +- reserve(4); +- if (w <= 0xFFFF) +- { +- *(unsigned short *)(this->data + offset) = (unsigned short)w; +- offset += 2; +- } +- else if (w <= 0x10FFFF) +- { +- *(unsigned short *)(this->data + offset) = (unsigned short)((w >> 10) + 0xD7C0); +- *(unsigned short *)(this->data + offset + 2) = (unsigned short)((w & 0x3FF) | 0xDC00); +- offset += 4; +- } +- else +- assert(0); +-} +- +-void OutBuffer::write4(unsigned w) +-{ +- if (doindent && linehead +-#if _WIN32 +- && w != 0x000A000D) +-#else +- ) +-#endif +- { +- if (level) +- { +- reserve(level); +- for (size_t i=0; idata[offset] = '\t'; +- offset++; +- } +- } +- linehead = 0; +- } +- reserve(4); +- *(unsigned *)(this->data + offset) = w; +- offset += 4; +-} +- +-void OutBuffer::write(OutBuffer *buf) +-{ +- if (buf) +- { reserve(buf->offset); +- memcpy(data + offset, buf->data, buf->offset); +- offset += buf->offset; +- } +-} +- +-void OutBuffer::write(Object *obj) +-{ +- if (obj) +- { +- writestring(obj->toChars()); +- } +-} +- +-void OutBuffer::fill0(size_t nbytes) +-{ +- reserve(nbytes); +- memset(data + offset,0,nbytes); +- offset += nbytes; +-} +- +-void OutBuffer::align(size_t size) +-{ +- size_t nbytes = ((offset + size - 1) & ~(size - 1)) - offset; +- fill0(nbytes); +-} +- +- +-//////////////////////////////////////////////////////////////// +-// The compiler shipped with Visual Studio 2005 (and possible +-// other versions) does not support C99 printf format specfiers +-// such as %z and %j +-#if 0 && _MSC_VER +-using std::string; +-using std::wstring; +- +-template +-inline void +-search_and_replace(S& str, const S& what, const S& replacement) +-{ +- assert(!what.empty()); +- size_t pos = str.find(what); +- while (pos != S::npos) +- { +- str.replace(pos, what.size(), replacement); +- pos = str.find(what, pos + replacement.size()); +- } +-} +-#define WORKAROUND_C99_SPECIFIERS_BUG(S,tmp,f) \ +- S tmp = f; \ +- search_and_replace(fmt, S("%z"), S("%l")); \ +- search_and_replace(fmt, S("%j"), S("%l")); \ +- f = tmp.c_str(); +-#else +-#define WORKAROUND_C99_SPECIFIERS_BUG(S,tmp,f) +-#endif +- +-void OutBuffer::vprintf(const char *format, va_list args) +-{ +- char buffer[128]; +- char *p; +- unsigned psize; +- int count; +- +- WORKAROUND_C99_SPECIFIERS_BUG(string, fmt, format); +- +- p = buffer; +- psize = sizeof(buffer); +- for (;;) +- { +-#if _WIN32 +- count = _vsnprintf(p,psize,format,args); +- if (count != -1) +- break; +- psize *= 2; +-#elif POSIX +- va_list va; +- va_copy(va, args); +-/* +- The functions vprintf(), vfprintf(), vsprintf(), vsnprintf() +- are equivalent to the functions printf(), fprintf(), sprintf(), +- snprintf(), respectively, except that they are called with a +- va_list instead of a variable number of arguments. These +- functions do not call the va_end macro. Consequently, the value +- of ap is undefined after the call. The application should call +- va_end(ap) itself afterwards. +- */ +- count = vsnprintf(p,psize,format,va); +- va_end(va); +- if (count == -1) +- psize *= 2; +- else if (count >= psize) +- psize = count + 1; +- else +- break; +-#else +- assert(0); +-#endif +- p = (char *) alloca(psize); // buffer too small, try again with larger size +- } +- write(p,count); +-} +- +-void OutBuffer::printf(const char *format, ...) +-{ +- va_list ap; +- va_start(ap, format); +- vprintf(format,ap); +- va_end(ap); +-} +- +-void OutBuffer::bracket(char left, char right) +-{ +- reserve(2); +- memmove(data + 1, data, offset); +- data[0] = left; +- data[offset + 1] = right; +- offset += 2; +-} +- +-/****************** +- * Insert left at i, and right at j. +- * Return index just past right. +- */ +- +-size_t OutBuffer::bracket(size_t i, const char *left, size_t j, const char *right) +-{ +- size_t leftlen = strlen(left); +- size_t rightlen = strlen(right); +- reserve(leftlen + rightlen); +- insert(i, left, leftlen); +- insert(j + leftlen, right, rightlen); +- return j + leftlen + rightlen; +-} +- +-void OutBuffer::spread(size_t offset, size_t nbytes) +-{ +- reserve(nbytes); +- memmove(data + offset + nbytes, data + offset, +- this->offset - offset); +- this->offset += nbytes; +-} +- +-/**************************************** +- * Returns: offset + nbytes +- */ +- +-size_t OutBuffer::insert(size_t offset, const void *p, size_t nbytes) +-{ +- spread(offset, nbytes); +- memmove(data + offset, p, nbytes); +- return offset + nbytes; +-} +- +-void OutBuffer::remove(size_t offset, size_t nbytes) +-{ +- memmove(data + offset, data + offset + nbytes, this->offset - (offset + nbytes)); +- this->offset -= nbytes; +-} +- +-char *OutBuffer::toChars() +-{ +- writeByte(0); +- return (char *)data; +-} +- +-// TODO: Remove (only used by disabled GC) +-/********************************* Bits ****************************/ +- +-Bits::Bits() +-{ +- data = NULL; +- bitdim = 0; +- allocdim = 0; +-} +- +-Bits::~Bits() +-{ +- mem.free(data); +-} +- +-void Bits::mark() +-{ +- mem.mark(data); +-} +- +-void Bits::resize(unsigned bitdim) +-{ +- unsigned allocdim; +- unsigned mask; +- +- allocdim = (bitdim + 31) / 32; +- data = (unsigned *)mem.realloc(data, allocdim * sizeof(data[0])); +- if (this->allocdim < allocdim) +- memset(data + this->allocdim, 0, (allocdim - this->allocdim) * sizeof(data[0])); +- +- // Clear other bits in last word +- mask = (1 << (bitdim & 31)) - 1; +- if (mask) +- data[allocdim - 1] &= ~mask; +- +- this->bitdim = bitdim; +- this->allocdim = allocdim; +-} +- +-void Bits::set(unsigned bitnum) +-{ +- data[bitnum / 32] |= 1 << (bitnum & 31); +-} +- +-void Bits::clear(unsigned bitnum) +-{ +- data[bitnum / 32] &= ~(1 << (bitnum & 31)); +-} +- +-int Bits::test(unsigned bitnum) +-{ +- return data[bitnum / 32] & (1 << (bitnum & 31)); +-} +- +-void Bits::set() +-{ unsigned mask; +- +- memset(data, ~0, allocdim * sizeof(data[0])); +- +- // Clear other bits in last word +- mask = (1 << (bitdim & 31)) - 1; +- if (mask) +- data[allocdim - 1] &= mask; +-} +- +-void Bits::clear() +-{ +- memset(data, 0, allocdim * sizeof(data[0])); +-} +- +-void Bits::copy(Bits *from) +-{ +- assert(bitdim == from->bitdim); +- memcpy(data, from->data, allocdim * sizeof(data[0])); +-} +- +-Bits *Bits::clone() +-{ +- Bits *b; +- +- b = new Bits(); +- b->resize(bitdim); +- b->copy(this); +- return b; +-} +- +-void Bits::sub(Bits *b) +-{ +- unsigned u; +- +- for (u = 0; u < allocdim; u++) +- data[u] &= ~b->data[u]; +-} +--- a/src/gcc/d/dfrontend/root.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/root.h 2014-04-01 16:32:51.000000000 +0100 +@@ -10,386 +10,14 @@ + #ifndef ROOT_H + #define ROOT_H + +-#include +-#include +-#ifdef DEBUG +-#include +-#endif +- +-#include "port.h" +- + #if __DMC__ + #pragma once + #endif + +-typedef size_t hash_t; +- +-/* +- * Root of our class library. +- */ +- +-struct OutBuffer; +- +-// Can't include arraytypes.h here, need to declare these directly. +-template struct ArrayBase; +-typedef ArrayBase Files; +-typedef ArrayBase Strings; +- +- +-struct Object +-{ +- Object() { } +- virtual ~Object() { } +- +- virtual int equals(Object *o); +- +- /** +- * Returns a hash code, useful for things like building hash tables of Objects. +- */ +- virtual hash_t hashCode(); +- +- /** +- * Return <0, ==0, or >0 if this is less than, equal to, or greater than obj. +- * Useful for sorting Objects. +- */ +- virtual int compare(Object *obj); +- +- /** +- * Pretty-print an Object. Useful for debugging the old-fashioned way. +- */ +- virtual void print(); +- +- virtual char *toChars(); +- virtual void toBuffer(OutBuffer *buf); +- +- /** +- * Used as a replacement for dynamic_cast. Returns a unique number +- * defined by the library user. For Object, the return value is 0. +- */ +- virtual int dyncast(); +- +- /** +- * Marks pointers for garbage collector by calling mem.mark() for all pointers into heap. +- */ +- /*virtual*/ // not used, disable for now +- void mark(); +-}; +- +-struct String : Object +-{ +- const char *str; // the string itself +- +- String(const char *str); +- ~String(); +- +- static hash_t calcHash(const char *str, size_t len); +- static hash_t calcHash(const char *str); +- hash_t hashCode(); +- size_t len(); +- int equals(Object *obj); +- int compare(Object *obj); +- char *toChars(); +- void print(); +- void mark(); +-}; +- +-struct FileName : String +-{ +- FileName(const char *str); +- hash_t hashCode(); +- int equals(Object *obj); +- static int equals(const char *name1, const char *name2); +- int compare(Object *obj); +- static int compare(const char *name1, const char *name2); +- static int absolute(const char *name); +- static const char *ext(const char *); +- const char *ext(); +- static const char *removeExt(const char *str); +- static const char *name(const char *); +- const char *name(); +- static const char *path(const char *); +- static const char *replaceName(const char *path, const char *name); +- +- static const char *combine(const char *path, const char *name); +- static Strings *splitPath(const char *path); +- static const char *defaultExt(const char *name, const char *ext); +- static const char *forceExt(const char *name, const char *ext); +- static int equalsExt(const char *name, const char *ext); +- +- int equalsExt(const char *ext); +- +- void CopyTo(FileName *to); +- static const char *searchPath(Strings *path, const char *name, int cwd); +- static const char *safeSearchPath(Strings *path, const char *name); +- static int exists(const char *name); +- static void ensurePathExists(const char *path); +- static void ensurePathToNameExists(const char *name); +- static const char *canonicalName(const char *name); +- +- static void free(const char *str); +-}; +- +-struct File : Object +-{ +- int ref; // != 0 if this is a reference to someone else's buffer +- unsigned char *buffer; // data for our file +- size_t len; // amount of data in buffer[] +- void *touchtime; // system time to use for file +- +- FileName *name; // name of our file +- +- File(const char *); +- File(const FileName *); +- ~File(); +- +- void mark(); +- +- char *toChars(); +- +- /* Read file, return !=0 if error +- */ +- +- int read(); +- +- /* Write file, either succeed or fail +- * with error message & exit. +- */ +- +- void readv(); +- +- /* Read file, return !=0 if error +- */ +- +- int mmread(); +- +- /* Write file, either succeed or fail +- * with error message & exit. +- */ +- +- void mmreadv(); +- +- /* Write file, return !=0 if error +- */ +- +- int write(); +- +- /* Write file, either succeed or fail +- * with error message & exit. +- */ +- +- void writev(); +- +- /* Return !=0 if file exists. +- * 0: file doesn't exist +- * 1: normal file +- * 2: directory +- */ +- +- /* Append to file, return !=0 if error +- */ +- +- int append(); +- +- /* Append to file, either succeed or fail +- * with error message & exit. +- */ +- +- void appendv(); +- +- /* Return !=0 if file exists. +- * 0: file doesn't exist +- * 1: normal file +- * 2: directory +- */ +- +- int exists(); +- +- /* Given wildcard filespec, return an array of +- * matching File's. +- */ +- +- static Files *match(char *); +- static Files *match(FileName *); +- +- // Compare file times. +- // Return <0 this < f +- // =0 this == f +- // >0 this > f +- int compareTime(File *f); +- +- // Read system file statistics +- void stat(); +- +- /* Set buffer +- */ +- +- void setbuffer(void *buffer, size_t len) +- { +- this->buffer = (unsigned char *)buffer; +- this->len = len; +- } +- +- void checkoffset(size_t offset, size_t nbytes); +- +- void remove(); // delete file +-}; +- +-struct OutBuffer : Object +-{ +- unsigned char *data; +- size_t offset; +- size_t size; +- +- int doindent, level, linehead; +- +- OutBuffer(); +- ~OutBuffer(); +- char *extractData(); +- void mark(); +- +- void reserve(size_t nbytes); +- void setsize(size_t size); +- void reset(); +- void write(const void *data, size_t nbytes); +- void writebstring(unsigned char *string); +- void writestring(const char *string); +- void prependstring(const char *string); +- void writenl(); // write newline +- void writeByte(unsigned b); +- void writebyte(unsigned b) { writeByte(b); } +- void writeUTF8(unsigned b); +- void prependbyte(unsigned b); +- void writeword(unsigned w); +- void writeUTF16(unsigned w); +- void write4(unsigned w); +- void write(OutBuffer *buf); +- void write(Object *obj); +- void fill0(size_t nbytes); +- void align(size_t size); +- void vprintf(const char *format, va_list args); +- void printf(const char *format, ...); +- void bracket(char left, char right); +- size_t bracket(size_t i, const char *left, size_t j, const char *right); +- void spread(size_t offset, size_t nbytes); +- size_t insert(size_t offset, const void *data, size_t nbytes); +- void remove(size_t offset, size_t nbytes); +- char *toChars(); +- char *extractString(); +-}; +- +-struct Array +-{ +- size_t dim; +- void **data; +- +- private: +- size_t allocdim; +- #define SMALLARRAYCAP 1 +- void *smallarray[SMALLARRAYCAP]; // inline storage for small arrays +- +- public: +- Array(); +- ~Array(); +- //Array(const Array&); +- void mark(); +- char *toChars(); +- +- void reserve(size_t nentries); +- void setDim(size_t newdim); +- void fixDim(); +- void push(void *ptr); +- void *pop(); +- void shift(void *ptr); +- void insert(size_t index, void *ptr); +- void insert(size_t index, Array *a); +- void append(Array *a); +- void remove(size_t i); +- void zero(); +- void *tos(); +- void sort(); +- Array *copy(); +-}; +- +-template +-struct ArrayBase : Array +-{ +- TYPE **tdata() +- { +- return (TYPE **)data; +- } +- +- TYPE*& operator[] (size_t index) +- { +-#ifdef DEBUG +- assert(index < dim); +-#endif +- return ((TYPE **)data)[index]; +- } +- +- void insert(size_t index, TYPE *v) +- { +- Array::insert(index, (void *)v); +- } +- +- void insert(size_t index, ArrayBase *a) +- { +- Array::insert(index, (Array *)a); +- } +- +- void append(ArrayBase *a) +- { +- Array::append((Array *)a); +- } +- +- void push(TYPE *a) +- { +- Array::push((void *)a); +- } +- +- ArrayBase *copy() +- { +- return (ArrayBase *)Array::copy(); +- } +- +- typedef int (*ArrayBase_apply_ft_t)(TYPE *, void *); +- int apply(ArrayBase_apply_ft_t fp, void *param) +- { +- for (size_t i = 0; i < dim; i++) +- { TYPE *e = (*this)[i]; +- +- if (e) +- { +- if (e->apply(fp, param)) +- return 1; +- } +- } +- return 0; +- } +-}; +- +-// TODO: Remove (only used by disabled GC) +-struct Bits : Object +-{ +- unsigned bitdim; +- unsigned allocdim; +- unsigned *data; +- +- Bits(); +- ~Bits(); +- void mark(); +- +- void resize(unsigned bitdim); +- +- void set(unsigned bitnum); +- void clear(unsigned bitnum); +- int test(unsigned bitnum); +- +- void set(); +- void clear(); +- void copy(Bits *from); +- Bits *clone(); +- +- void sub(Bits *b); +-}; ++#include "object.h" ++#include "filename.h" ++#include "file.h" ++#include "outbuffer.h" ++#include "array.h" + + #endif +--- a/src/gcc/d/dfrontend/sapply.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/dfrontend/sapply.c 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,210 @@ ++ ++// Compiler implementation of the D programming language ++// Copyright (c) 1999-2013 by Digital Mars ++// All Rights Reserved ++// written by Walter Bright ++// http://www.digitalmars.com ++// License for redistribution is by either the Artistic License ++// in artistic.txt, or the GNU General Public License in gnu.txt. ++// See the included readme.txt for details. ++ ++#include ++#include ++ ++#include "mars.h" ++#include "statement.h" ++ ++ ++/************************************** ++ * A Statement tree walker that will visit each Statement s in the tree, ++ * in depth-first evaluation order, and call fp(s,param) on it. ++ * fp() signals whether the walking continues with its return value: ++ * Returns: ++ * 0 continue ++ * 1 done ++ * It's a bit slower than using virtual functions, but more encapsulated and less brittle. ++ * Creating an iterator for this would be much more complex. ++ */ ++ ++typedef bool (*sapply_fp_t)(Statement *, void *); ++ ++bool Statement::apply(sapply_fp_t fp, void *param) ++{ ++ return (*fp)(this, param); ++} ++ ++/****************************** ++ * Perform apply() on an t if not null ++ */ ++#define scondApply(t, fp, param) (t ? t->apply(fp, param) : 0) ++ ++ ++ ++bool PeelStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return s->apply(fp, param) || ++ (*fp)(this, param); ++} ++ ++bool CompoundStatement::apply(sapply_fp_t fp, void *param) ++{ ++ for (size_t i = 0; i < statements->dim; i++) ++ { Statement *s = (*statements)[i]; ++ ++ bool r = scondApply(s, fp, param); ++ if (r) ++ return r; ++ } ++ return (*fp)(this, param); ++} ++ ++bool UnrolledLoopStatement::apply(sapply_fp_t fp, void *param) ++{ ++ for (size_t i = 0; i < statements->dim; i++) ++ { Statement *s = (*statements)[i]; ++ ++ bool r = scondApply(s, fp, param); ++ if (r) ++ return r; ++ } ++ return (*fp)(this, param); ++} ++ ++bool ScopeStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool WhileStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool DoStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool ForStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(init, fp, param) || ++ scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool ForeachStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++#if DMDV2 ++bool ForeachRangeStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++#endif ++ ++bool IfStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(ifbody, fp, param) || ++ scondApply(elsebody, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool ConditionalStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(ifbody, fp, param) || ++ scondApply(elsebody, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool PragmaStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool SwitchStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool CaseStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ ++#if DMDV2 ++bool CaseRangeStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++#endif ++ ++bool DefaultStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool SynchronizedStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool WithStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool TryCatchStatement::apply(sapply_fp_t fp, void *param) ++{ ++ bool r = scondApply(body, fp, param); ++ if (r) ++ return r; ++ ++ for (size_t i = 0; i < catches->dim; i++) ++ { Catch *c = (*catches)[i]; ++ ++ bool r = scondApply(c->handler, fp, param); ++ if (r) ++ return r; ++ } ++ return (*fp)(this, param); ++} ++ ++bool TryFinallyStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(body, fp, param) || ++ scondApply(finalbody, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool OnScopeStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool DebugStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ ++bool LabelStatement::apply(sapply_fp_t fp, void *param) ++{ ++ return scondApply(statement, fp, param) || ++ (*fp)(this, param); ++} ++ +--- a/src/gcc/d/dfrontend/scope.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/scope.c 2014-04-01 16:32:51.000000000 +0100 +@@ -12,6 +12,7 @@ + #include // strlen() + + #include "root.h" ++#include "rmem.h" + #include "speller.h" + + #include "mars.h" +@@ -21,6 +22,7 @@ + #include "attrib.h" + #include "dsymbol.h" + #include "declaration.h" ++#include "statement.h" + #include "aggregate.h" + #include "module.h" + #include "id.h" +@@ -50,6 +52,7 @@ Scope::Scope() + + //printf("Scope::Scope() %p\n", this); + this->module = NULL; ++ this->instantiatingModule = NULL; + this->scopesym = NULL; + this->sd = NULL; + this->enclosing = NULL; +@@ -60,7 +63,8 @@ Scope::Scope() + this->sbreak = NULL; + this->scontinue = NULL; + this->fes = NULL; +- this->structalign = global.structalign; ++ this->callsc = NULL; ++ this->structalign = STRUCTALIGN_DEFAULT; + this->func = NULL; + this->slabel = NULL; + this->linkage = LINKd; +@@ -72,12 +76,11 @@ Scope::Scope() + this->inunion = 0; + this->nofree = 0; + this->noctor = 0; +- this->noaccesscheck = 0; +- this->mustsemantic = 0; + this->intypeof = 0; + this->speculative = 0; +- this->parameterSpecialization = 0; + this->callSuper = 0; ++ this->fieldinit = NULL; ++ this->fieldinit_dim = 0; + this->flags = 0; + this->lastdc = NULL; + this->lastoffset = 0; +@@ -90,6 +93,7 @@ Scope::Scope(Scope *enclosing) + //printf("Scope::Scope(enclosing = %p) %p\n", enclosing, this); + assert(!(enclosing->flags & SCOPEfree)); + this->module = enclosing->module; ++ this->instantiatingModule = enclosing->instantiatingModule; + this->func = enclosing->func; + this->parent = enclosing->parent; + this->scopesym = NULL; +@@ -100,6 +104,7 @@ Scope::Scope(Scope *enclosing) + this->sbreak = enclosing->sbreak; + this->scontinue = enclosing->scontinue; + this->fes = enclosing->fes; ++ this->callsc = enclosing->callsc; + this->structalign = enclosing->structalign; + this->enclosing = enclosing; + #ifdef DEBUG +@@ -121,13 +126,12 @@ Scope::Scope(Scope *enclosing) + this->inunion = enclosing->inunion; + this->nofree = 0; + this->noctor = enclosing->noctor; +- this->noaccesscheck = enclosing->noaccesscheck; +- this->mustsemantic = enclosing->mustsemantic; + this->intypeof = enclosing->intypeof; + this->speculative = enclosing->speculative; +- this->parameterSpecialization = enclosing->parameterSpecialization; + this->callSuper = enclosing->callSuper; +- this->flags = (enclosing->flags & (SCOPEcontract | SCOPEdebug)); ++ this->fieldinit = enclosing->saveFieldInit(); ++ this->fieldinit_dim = enclosing->fieldinit_dim; ++ this->flags = (enclosing->flags & (SCOPEcontract | SCOPEdebug | SCOPEctfe)); + this->lastdc = NULL; + this->lastoffset = 0; + this->docbuf = enclosing->docbuf; +@@ -179,7 +183,17 @@ Scope *Scope::pop() + Scope *enc = enclosing; + + if (enclosing) ++ { + enclosing->callSuper |= callSuper; ++ if (enclosing->fieldinit && fieldinit) ++ { ++ size_t dim = fieldinit_dim; ++ for (size_t i = 0; i < dim; i++) ++ enclosing->fieldinit[i] |= fieldinit[i]; ++ delete[] fieldinit; ++ fieldinit = NULL; ++ } ++ } + + if (!nofree) + { enclosing = freelist; +@@ -190,6 +204,19 @@ Scope *Scope::pop() + return enc; + } + ++Scope *Scope::startCTFE() ++{ ++ Scope *sc = this->push(); ++ sc->flags = this->flags | SCOPEctfe; ++ return sc; ++} ++ ++Scope *Scope::endCTFE() ++{ ++ assert(flags & SCOPEctfe); ++ return pop(); ++} ++ + void Scope::mergeCallSuper(Loc loc, unsigned cs) + { + // This does a primitive flow analysis to support the restrictions +@@ -243,6 +270,131 @@ void Scope::mergeCallSuper(Loc loc, unsi + } + } + ++unsigned *Scope::saveFieldInit() ++{ ++ unsigned *fi = NULL; ++ if (fieldinit) // copy ++ { ++ size_t dim = fieldinit_dim; ++ fi = new unsigned[dim]; ++ fi[0] = dim; ++ for (size_t i = 0; i < dim; i++) ++ fi[i] = fieldinit[i]; ++ } ++ return fi; ++} ++ ++bool mergeFieldInit(Loc loc, unsigned &fieldInit, unsigned fi, bool mustInit) ++{ ++ if (fi != fieldInit) ++ { ++ ++ // Have any branches returned? ++ bool aRet = (fi & CSXreturn) != 0; ++ bool bRet = (fieldInit & CSXreturn) != 0; ++ ++ bool ok; ++ ++ if (aRet) ++ { ++ ok = !mustInit || (fi & CSXthis_ctor); ++ fieldInit = fieldInit; ++ } ++ else if (bRet) ++ { ++ ok = !mustInit || (fieldInit & CSXthis_ctor); ++ fieldInit = fi; ++ } ++ else ++ { ++ ok = !mustInit || !((fieldInit ^ fi) & CSXthis_ctor); ++ fieldInit |= fi; ++ } ++ ++ return ok; ++ } ++#if 0 ++ // This does a primitive flow analysis to support the restrictions ++ // regarding when and how constructors can appear. ++ // It merges the results of two paths. ++ // The two paths are fieldInit and fi; the result is merged into fieldInit. ++ ++ if (fi != fieldInit) ++ { // Have ALL branches called a constructor? ++ int aAll = (fi & CSXthis_ctor) != 0; ++ int bAll = (fieldInit & CSXthis_ctor) != 0; ++ ++ // Have ANY branches called a constructor? ++ bool aAny = (fi & CSXany_ctor) != 0; ++ bool bAny = (fieldInit & CSXany_ctor) != 0; ++ ++ // Have any branches returned? ++ bool aRet = (fi & CSXreturn) != 0; ++ bool bRet = (fieldInit & CSXreturn) != 0; ++ ++ bool ok = true; ++ ++printf("L%d fieldInit = x%x, fi = x%x\n", __LINE__, fieldInit, fi); ++ ++ // If one has returned without a constructor call, there must be never ++ // have been ctor calls in the other. ++ if ( (aRet && !aAny && bAny) || ++ (bRet && !bAny && aAny)) ++ { ok = false; ++printf("L%d\n", __LINE__); ++ } ++ // If one branch has called a ctor and then exited, anything the ++ // other branch has done is OK (except returning without a ++ // ctor call, but we already checked that). ++ else if (aRet && aAll) ++ { ++ //fieldInit |= fi & (CSXany_ctor | CSXlabel); ++printf("L%d -> fieldInit = x%x\n", __LINE__, fieldInit); ++ } ++ else if (bRet && bAll) ++ { ++ fieldInit = fi;// | (fieldInit & (CSXany_ctor | CSXlabel)); ++printf("L%d -> fieldInit = x%x\n", __LINE__, fieldInit); ++ } ++ else ++ { // Both branches must have called ctors, or both not. ++ ok = (aAll == bAll); ++ // If one returned without a ctor, we must remember that ++ // (Don't bother if we've already found an error) ++ if (ok && aRet && !aAny) ++ fieldInit |= CSXreturn; ++ fieldInit |= fi & (CSXany_ctor | CSXlabel); ++printf("L%d ok = %d, fieldInit = x%x, fi = x%x\n", __LINE__, ok, fieldInit, fi); ++ } ++ return ok; ++ } ++#endif ++ return true; ++} ++ ++void Scope::mergeFieldInit(Loc loc, unsigned *fies) ++{ ++ if (fieldinit && fies) ++ { ++ FuncDeclaration *f = func; ++ if (fes) f = fes->func; ++ AggregateDeclaration *ad = f->isAggregateMember2(); ++ assert(ad); ++ ++ for (size_t i = 0; i < ad->fields.dim; i++) ++ { ++ VarDeclaration *v = ad->fields[i]; ++ bool mustInit = (v->storage_class & STCnodefaultctor || ++ v->type->needsNested()); ++ ++ if (!::mergeFieldInit(loc, fieldinit[i], fies[i], mustInit)) ++ { ++ ::error(loc, "one path skips field %s", ad->fields[i]->toChars()); ++ } ++ } ++ } ++} ++ + Dsymbol *Scope::search(Loc loc, Identifier *ident, Dsymbol **pscopesym) + { Dsymbol *s; + Scope *sc; +@@ -278,8 +430,7 @@ Dsymbol *Scope::search(Loc loc, Identifi + s = sc->scopesym->search(loc, ident, 0); + if (s) + { +- if (global.params.Dversion > 1 && +- ident == Id::length && ++ if (ident == Id::length && + sc->scopesym->isArrayScopeSymbol() && + sc->enclosing && + sc->enclosing->search(loc, ident, NULL)) +@@ -410,9 +561,8 @@ void *scope_search_fp(void *arg, const c + assert(id); + + Scope *sc = (Scope *)arg; +- Module::clearCache(); +- Dsymbol *s = sc->search(0, id, NULL); +- return s; ++ Dsymbol *s = sc->search(Loc(), id, NULL); ++ return (void*)s; + } + + Dsymbol *Scope::search_correct(Identifier *ident) +--- a/src/gcc/d/dfrontend/scope.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/scope.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -14,20 +14,20 @@ + #pragma once + #endif + +-struct Dsymbol; +-struct ScopeDsymbol; +-struct Identifier; +-struct Module; +-struct Statement; +-struct SwitchStatement; +-struct TryFinallyStatement; +-struct LabelStatement; +-struct ForeachStatement; +-struct ClassDeclaration; +-struct AggregateDeclaration; +-struct FuncDeclaration; ++class Dsymbol; ++class ScopeDsymbol; ++class Identifier; ++class Module; ++class Statement; ++class SwitchStatement; ++class TryFinallyStatement; ++class LabelStatement; ++class ForeachStatement; ++class ClassDeclaration; ++class AggregateDeclaration; ++class FuncDeclaration; + struct DocComment; +-struct TemplateInstance; ++class TemplateInstance; + + #if __GNUC__ + // Requires a full definition for PROT and LINK +@@ -38,11 +38,34 @@ enum LINK; + enum PROT; + #endif + ++#define CSXthis_ctor 1 // called this() ++#define CSXsuper_ctor 2 // called super() ++#define CSXthis 4 // referenced this ++#define CSXsuper 8 // referenced super ++#define CSXlabel 0x10 // seen a label ++#define CSXreturn 0x20 // seen a return statement ++#define CSXany_ctor 0x40 // either this() or super() was called ++ ++#define SCOPEctor 0x0001 // constructor type ++#define SCOPEstaticif 0x0002 // inside static if ++#define SCOPEfree 0x0004 // is on free list ++#define SCOPEstaticassert 0x0008 // inside static assert ++#define SCOPEdebug 0x0010 // inside debug conditional ++ ++#define SCOPEinvariant 0x0020 // inside invariant code ++#define SCOPErequire 0x0040 // inside in contract code ++#define SCOPEensure 0x0060 // inside out contract code ++#define SCOPEcontract 0x0060 // [mask] we're inside contract code ++ ++#define SCOPEctfe 0x0080 // inside a ctfe-only expression ++#define SCOPEnoaccesscheck 0x0100 // don't do access checks ++ + struct Scope + { + Scope *enclosing; // enclosing Scope + + Module *module; // Root module ++ Module *instantiatingModule; // top level module that started a chain of template instantiations + ScopeDsymbol *scopesym; // current symbol + ScopeDsymbol *sd; // if in static if, and declaring new symbols, + // sd gets the addMember() +@@ -55,6 +78,7 @@ struct Scope + Statement *sbreak; // enclosing statement that supports "break" + Statement *scontinue; // enclosing statement that supports "continue" + ForeachStatement *fes; // if nested function for ForeachStatement, this is it ++ Scope *callsc; // used for __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__ + unsigned offset; // next offset to use in aggregate + // This really shouldn't be a part of Scope, because it requires + // semantic() to be done in the lexical field order. It should be +@@ -65,39 +89,21 @@ struct Scope + int noctor; // set if constructor calls aren't allowed + int intypeof; // in typeof(exp) + bool speculative; // in __traits(compiles) or typeof(exp) +- int parameterSpecialization; // if in template parameter specialization +- int noaccesscheck; // don't do access checks +- int mustsemantic; // cannot defer semantic() + + unsigned callSuper; // primitive flow analysis for constructors +-#define CSXthis_ctor 1 // called this() +-#define CSXsuper_ctor 2 // called super() +-#define CSXthis 4 // referenced this +-#define CSXsuper 8 // referenced super +-#define CSXlabel 0x10 // seen a label +-#define CSXreturn 0x20 // seen a return statement +-#define CSXany_ctor 0x40 // either this() or super() was called ++ unsigned *fieldinit; ++ unsigned fieldinit_dim; + + structalign_t structalign; // alignment for struct members +- enum LINK linkage; // linkage for external functions ++ LINK linkage; // linkage for external functions + +- enum PROT protection; // protection for class members ++ PROT protection; // protection for class members + int explicitProtection; // set if in an explicit protection attribute + + StorageClass stc; // storage class + char *depmsg; // customized deprecation message + + unsigned flags; +-#define SCOPEctor 1 // constructor type +-#define SCOPEstaticif 2 // inside static if +-#define SCOPEfree 4 // is on free list +-#define SCOPEstaticassert 8 // inside static assert +-#define SCOPEdebug 0x10 // inside debug conditional +- +-#define SCOPEinvariant 0x20 // inside invariant code +-#define SCOPErequire 0x40 // inside in contract code +-#define SCOPEensure 0x60 // inside out contract code +-#define SCOPEcontract 0x60 // [mask] we're inside contract code + + Expressions *userAttributes; // user defined attributes + +@@ -110,15 +116,20 @@ struct Scope + static Scope *createGlobal(Module *module); + + Scope(); +- Scope(Module *module); + Scope(Scope *enclosing); + + Scope *push(); + Scope *push(ScopeDsymbol *ss); + Scope *pop(); + ++ Scope *startCTFE(); ++ Scope *endCTFE(); ++ + void mergeCallSuper(Loc loc, unsigned cs); + ++ unsigned *saveFieldInit(); ++ void mergeFieldInit(Loc loc, unsigned *cses); ++ + Dsymbol *search(Loc loc, Identifier *ident, Dsymbol **pscopesym); + Dsymbol *search_correct(Identifier *ident); + Dsymbol *insert(Dsymbol *s); +--- a/src/gcc/d/dfrontend/statement.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/statement.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2011 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -52,6 +52,15 @@ Identifier *fixupLabelName(Scope *sc, Id + return ident; + } + ++LabelStatement *checkLabeledLoop(Scope *sc, Statement *statement) ++{ ++ if (sc->slabel && sc->slabel->statement == statement) ++ { ++ return sc->slabel; ++ } ++ return NULL; ++} ++ + /******************************** Statement ***************************/ + + Statement::Statement(Loc loc) +@@ -69,17 +78,18 @@ Statement *Statement::syntaxCopy() + + void Statement::print() + { +- fprintf(stdmsg, "%s\n", toChars()); +- fflush(stdmsg); ++ fprintf(stderr, "%s\n", toChars()); ++ fflush(stderr); + } + + char *Statement::toChars() +-{ OutBuffer *buf; ++{ + HdrGenState hgs; + +- buf = new OutBuffer(); +- toCBuffer(buf, &hgs); +- return buf->toChars(); ++ OutBuffer buf; ++ toCBuffer(&buf, &hgs); ++ buf.writebyte(0); ++ return buf.extractData(); + } + + void Statement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -154,13 +164,78 @@ bool Statement::hasContinue() + return FALSE; + } + ++/* ============================================== */ + // TRUE if statement uses exception handling + + bool Statement::usesEH() + { +- return FALSE; ++ struct UsesEH ++ { ++ static bool lambdaUsesEH(Statement *s, void *param) ++ { ++ return s->usesEHimpl(); ++ } ++ }; ++ ++ UsesEH ueh; ++ return apply(&UsesEH::lambdaUsesEH, &ueh); ++} ++ ++bool Statement::usesEHimpl() { return false; } ++bool TryCatchStatement::usesEHimpl() { return true; } ++bool TryFinallyStatement::usesEHimpl() { return true; } ++bool OnScopeStatement::usesEHimpl() { return true; } ++bool SynchronizedStatement::usesEHimpl() { return true; } ++ ++/* ============================================== */ ++// TRUE if statement 'comes from' somewhere else, like a goto ++ ++bool Statement::comeFrom() ++{ ++ struct ComeFrom ++ { ++ static bool lambdaComeFrom(Statement *s, void *param) ++ { ++ return s->comeFromImpl(); ++ } ++ }; ++ ++ ComeFrom cf; ++ return apply(&ComeFrom::lambdaComeFrom, &cf); ++} ++ ++bool Statement::comeFromImpl() { return false; } ++bool CaseStatement::comeFromImpl() { return true; } ++bool DefaultStatement::comeFromImpl() { return true; } ++bool LabelStatement::comeFromImpl() { return true; } ++bool AsmStatement::comeFromImpl() { return true; } ++ ++/* ============================================== */ ++// Return true if statement has executable code. ++ ++bool Statement::hasCode() ++{ ++ struct HasCode ++ { ++ static bool lambdaHasCode(Statement *s, void *param) ++ { ++ return s->hasCodeImpl(); ++ } ++ }; ++ ++ HasCode hc; ++ return apply(&HasCode::lambdaHasCode, &hc); + } + ++bool Statement::hasCodeImpl() { return true; } ++bool ExpStatement::hasCodeImpl() { return exp != NULL; } ++bool CompoundStatement::hasCodeImpl() { return false; } ++bool ScopeStatement::hasCodeImpl() { return false; } ++bool ImportStatement::hasCodeImpl() { return false; } ++ ++ ++/* ============================================== */ ++ + /* Only valid after semantic analysis + * If 'mustNotThrow' is true, generate an error if it throws + */ +@@ -172,21 +247,6 @@ int Statement::blockExit(bool mustNotThr + return BEany; + } + +-// TRUE if statement 'comes from' somewhere else, like a goto +- +-int Statement::comeFrom() +-{ +- //printf("Statement::comeFrom()\n"); +- return FALSE; +-} +- +-// Return TRUE if statement has no code in it +-int Statement::isEmpty() +-{ +- //printf("Statement::isEmpty()\n"); +- return FALSE; +-} +- + Statement *Statement::last() + { + return this; +@@ -224,6 +284,28 @@ Statements *Statement::flatten(Scope *sc + } + + ++/******************************** ErrorStatement ***************************/ ++ ++ErrorStatement::ErrorStatement() ++ : Statement(Loc()) ++{ ++} ++ ++Statement *ErrorStatement::syntaxCopy() ++{ ++ return this; ++} ++ ++Statement *ErrorStatement::semantic(Scope *sc) ++{ ++ return this; ++} ++ ++int ErrorStatement::blockExit(bool mustNotThrow) ++{ ++ return BEany; ++} ++ + /******************************** PeelStatement ***************************/ + + PeelStatement::PeelStatement(Statement *s) +@@ -305,6 +387,8 @@ Statement *ExpStatement::semantic(Scope + exp = resolveProperties(sc, exp); + exp->discardValue(); + exp = exp->optimize(0); ++ if (exp->op == TOKerror) ++ return new ErrorStatement(); + } + return this; + } +@@ -328,11 +412,6 @@ int ExpStatement::blockExit(bool mustNot + return result; + } + +-int ExpStatement::isEmpty() +-{ +- return exp == NULL; +-} +- + Statement *ExpStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) + { + //printf("ExpStatement::scopeCode()\n"); +@@ -425,28 +504,38 @@ void CompileStatement::toCBuffer(OutBuff + Statements *CompileStatement::flatten(Scope *sc) + { + //printf("CompileStatement::flatten() %s\n", exp->toChars()); ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); ++ sc = sc->endCTFE(); + exp = exp->ctfeInterpret(); +- if (exp->op == TOKerror) +- return NULL; +- StringExp *se = exp->toString(); +- if (!se) +- { error("argument to mixin must be a string, not (%s)", exp->toChars()); +- return NULL; +- } +- se = se->toUTF8(sc); +- Parser p(sc->module, (unsigned char *)se->string, se->len, 0); +- p.loc = loc; +- p.nextToken(); + + Statements *a = new Statements(); +- while (p.token.value != TOKeof) ++ if (exp->op != TOKerror) + { +- Statement *s = p.parseStatement(PSsemi | PScurlyscope); +- if (s) // if no parsing errors +- a->push(s); ++ StringExp *se = exp->toString(); ++ if (!se) ++ error("argument to mixin must be a string, not (%s)", exp->toChars()); ++ else ++ { ++ se = se->toUTF8(sc); ++ Parser p(sc->module, (utf8_t *)se->string, se->len, 0); ++ p.scanloc = loc; ++ p.nextToken(); ++ ++ while (p.token.value != TOKeof) ++ { ++ unsigned errors = global.errors; ++ Statement *s = p.parseStatement(PSsemi | PScurlyscope); ++ if (!s || global.errors != errors) ++ goto Lerror; ++ a->push(s); ++ } ++ return a; ++ } + } ++Lerror: ++ a->push(new ErrorStatement()); + return a; + } + +@@ -569,26 +658,26 @@ Statement *CompoundStatement::semantic(S + { + a->push((*statements)[j]); + } +- Statement *body = new CompoundStatement(0, a); +- body = new ScopeStatement(0, body); ++ Statement *body = new CompoundStatement(Loc(), a); ++ body = new ScopeStatement(Loc(), body); + + Identifier *id = Lexer::uniqueId("__o"); + + Statement *handler = sexception; + if (sexception->blockExit(FALSE) & BEfallthru) +- { handler = new ThrowStatement(0, new IdentifierExp(0, id)); ++ { handler = new ThrowStatement(Loc(), new IdentifierExp(Loc(), id)); + ((ThrowStatement *)handler)->internalThrow = true; +- handler = new CompoundStatement(0, sexception, handler); ++ handler = new CompoundStatement(Loc(), sexception, handler); + } + + Catches *catches = new Catches(); +- Catch *ctch = new Catch(0, NULL, id, handler); ++ Catch *ctch = new Catch(Loc(), NULL, id, handler); + ctch->internalCatch = true; + catches->push(ctch); +- s = new TryCatchStatement(0, body, catches); ++ s = new TryCatchStatement(Loc(), body, catches); + + if (sfinally) +- s = new TryFinallyStatement(0, s, sfinally); ++ s = new TryFinallyStatement(Loc(), s, sfinally); + s = s->semantic(sc); + statements->setDim(i + 1); + statements->push(s); +@@ -613,8 +702,8 @@ Statement *CompoundStatement::semantic(S + { + a->push((*statements)[j]); + } +- Statement *body = new CompoundStatement(0, a); +- s = new TryFinallyStatement(0, body, sfinally); ++ Statement *body = new CompoundStatement(Loc(), a); ++ s = new TryFinallyStatement(Loc(), body, sfinally); + s = s->semantic(sc); + statements->setDim(i + 1); + statements->push(s); +@@ -622,9 +711,27 @@ Statement *CompoundStatement::semantic(S + } + } + } ++#ifdef IN_GCC ++ else ++ { ++ // Remove NULL statement from list. ++ statements->remove(i); ++ continue; ++ } ++#endif + } + i++; + } ++ for (size_t i = 0; i < statements->dim; ++i) ++ { ++ s = (*statements)[i]; ++ if (s) ++ { ++ Statement *se = s->isErrorStatement(); ++ if (se) ++ return se; ++ } ++ } + if (statements->dim == 1) + { + return (*statements)[0]; +@@ -678,16 +785,6 @@ void CompoundStatement::toCBuffer(OutBuf + } + } + +-bool CompoundStatement::usesEH() +-{ +- for (size_t i = 0; i < statements->dim; i++) +- { Statement *s = (*statements)[i]; +- if (s && s->usesEH()) +- return TRUE; +- } +- return FALSE; +-} +- + int CompoundStatement::blockExit(bool mustNotThrow) + { + //printf("CompoundStatement::blockExit(%p) %d\n", this, statements->dim); +@@ -698,7 +795,7 @@ int CompoundStatement::blockExit(bool mu + if (s) + { + //printf("result = x%x\n", result); +- //printf("%s\n", s->toChars()); ++ //printf("s: %s\n", s->toChars()); + if (global.params.warnings && result & BEfallthru && slast) + { + slast = slast->last(); +@@ -708,9 +805,9 @@ int CompoundStatement::blockExit(bool mu + // Allow if last case/default was empty + CaseStatement *sc = slast->isCaseStatement(); + DefaultStatement *sd = slast->isDefaultStatement(); +- if (sc && sc->statement->isEmpty()) ++ if (sc && (!sc->statement->hasCode() || sc->statement->isCaseStatement())) + ; +- else if (sd && sd->statement->isEmpty()) ++ else if (sd && (!sd->statement->hasCode() || sd->statement->isCaseStatement())) + ; + else + s->error("switch case fallthrough - use 'goto %s;' if intended", +@@ -720,7 +817,7 @@ int CompoundStatement::blockExit(bool mu + + if (!(result & BEfallthru) && !s->comeFrom()) + { +- if (s->blockExit(mustNotThrow) != BEhalt && !s->isEmpty()) ++ if (s->blockExit(mustNotThrow) != BEhalt && s->hasCode()) + s->warning("statement is not reachable"); + } + else +@@ -734,31 +831,6 @@ int CompoundStatement::blockExit(bool mu + return result; + } + +-int CompoundStatement::comeFrom() +-{ int comefrom = FALSE; +- +- //printf("CompoundStatement::comeFrom()\n"); +- for (size_t i = 0; i < statements->dim; i++) +- { Statement *s = (*statements)[i]; +- +- if (!s) +- continue; +- +- comefrom |= s->comeFrom(); +- } +- return comefrom; +-} +- +-int CompoundStatement::isEmpty() +-{ +- for (size_t i = 0; i < statements->dim; i++) +- { Statement *s = (*statements)[i]; +- if (s && !s->isEmpty()) +- return FALSE; +- } +- return TRUE; +-} +- + + /******************************** CompoundDeclarationStatement ***************************/ + +@@ -804,7 +876,7 @@ void CompoundDeclarationStatement::toCBu + */ + if (anywritten) + { +- buf->writeByte(','); ++ buf->writestring(", "); + buf->writestring(v->ident->toChars()); + } + else +@@ -864,11 +936,10 @@ Statement *UnrolledLoopStatement::semant + { + //printf("UnrolledLoopStatement::semantic(this = %p, sc = %p)\n", this, sc); + +- sc->noctor++; + Scope *scd = sc->push(); + scd->sbreak = this; + scd->scontinue = this; +- ++ Statement *serror = NULL; + for (size_t i = 0; i < statements->dim; i++) + { + Statement *s = (*statements)[i]; +@@ -877,12 +948,14 @@ Statement *UnrolledLoopStatement::semant + //printf("[%d]: %s\n", i, s->toChars()); + s = s->semantic(scd); + (*statements)[i] = s; ++ ++ if (s && !serror) ++ serror = s->isErrorStatement(); + } + } + + scd->pop(); +- sc->noctor--; +- return this; ++ return serror ? serror : this; + } + + void UnrolledLoopStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) +@@ -915,16 +988,6 @@ bool UnrolledLoopStatement::hasContinue( + return TRUE; + } + +-bool UnrolledLoopStatement::usesEH() +-{ +- for (size_t i = 0; i < statements->dim; i++) +- { Statement *s = (*statements)[i]; +- if (s && s->usesEH()) +- return TRUE; +- } +- return FALSE; +-} +- + int UnrolledLoopStatement::blockExit(bool mustNotThrow) + { + int result = BEfallthru; +@@ -940,22 +1003,6 @@ int UnrolledLoopStatement::blockExit(boo + } + + +-int UnrolledLoopStatement::comeFrom() +-{ int comefrom = FALSE; +- +- //printf("UnrolledLoopStatement::comeFrom()\n"); +- for (size_t i = 0; i < statements->dim; i++) +- { Statement *s = (*statements)[i]; +- +- if (!s) +- continue; +- +- comefrom |= s->comeFrom(); +- } +- return comefrom; +-} +- +- + /******************************** ScopeStatement ***************************/ + + ScopeStatement::ScopeStatement(Loc loc, Statement *s) +@@ -979,13 +1026,12 @@ Statement *ScopeStatement::semantic(Scop + + //printf("ScopeStatement::semantic(sc = %p)\n", sc); + if (statement) +- { Statements *a; +- ++ { + sym = new ScopeDsymbol(); + sym->parent = sc->scopesym; + sc = sc->push(sym); + +- a = statement->flatten(sc); ++ Statements *a = statement->flatten(sc); + if (a) + { + statement = new CompoundStatement(loc, a); +@@ -994,6 +1040,12 @@ Statement *ScopeStatement::semantic(Scop + statement = statement->semantic(sc); + if (statement) + { ++ if (statement->isErrorStatement()) ++ { ++ sc->pop(); ++ return statement; ++ } ++ + Statement *sentry; + Statement *sexception; + Statement *sfinally; +@@ -1025,11 +1077,6 @@ bool ScopeStatement::hasContinue() + return statement ? statement->hasContinue() : FALSE; + } + +-bool ScopeStatement::usesEH() +-{ +- return statement ? statement->usesEH() : FALSE; +-} +- + int ScopeStatement::blockExit(bool mustNotThrow) + { + //printf("ScopeStatement::blockExit(%p)\n", statement); +@@ -1037,18 +1084,6 @@ int ScopeStatement::blockExit(bool mustN + } + + +-int ScopeStatement::comeFrom() +-{ +- //printf("ScopeStatement::comeFrom()\n"); +- return statement ? statement->comeFrom() : FALSE; +-} +- +-int ScopeStatement::isEmpty() +-{ +- //printf("ScopeStatement::isEmpty() %d\n", statement ? statement->isEmpty() : TRUE); +- return statement ? statement->isEmpty() : TRUE; +-} +- + void ScopeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writeByte('{'); +@@ -1099,12 +1134,6 @@ bool WhileStatement::hasContinue() + return TRUE; + } + +-bool WhileStatement::usesEH() +-{ +- assert(global.errors); +- return 0; +-} +- + int WhileStatement::blockExit(bool mustNotThrow) + { + assert(global.errors); +@@ -1112,12 +1141,6 @@ int WhileStatement::blockExit(bool mustN + } + + +-int WhileStatement::comeFrom() +-{ +- assert(global.errors); +- return FALSE; +-} +- + void WhileStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring("while ("); +@@ -1156,6 +1179,12 @@ Statement *DoStatement::semantic(Scope * + + condition = condition->checkToBoolean(sc); + ++ if (condition->op == TOKerror) ++ return new ErrorStatement(); ++ ++ if (body && body->isErrorStatement()) ++ return body; ++ + return this; + } + +@@ -1169,11 +1198,6 @@ bool DoStatement::hasContinue() + return TRUE; + } + +-bool DoStatement::usesEH() +-{ +- return body ? body->usesEH() : 0; +-} +- + int DoStatement::blockExit(bool mustNotThrow) + { int result; + +@@ -1198,13 +1222,6 @@ int DoStatement::blockExit(bool mustNotT + } + + +-int DoStatement::comeFrom() +-{ +- if (body) +- return body->comeFrom(); +- return FALSE; +-} +- + void DoStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring("do"); +@@ -1226,7 +1243,6 @@ ForStatement::ForStatement(Loc loc, Stat + this->condition = condition; + this->increment = increment; + this->body = body; +- this->nest = 0; + this->relatedLabeled = NULL; + } + +@@ -1245,144 +1261,44 @@ Statement *ForStatement::syntaxCopy() + return s; + } + +-/* +- * Run semantic on init recursively. +- * Rewrite: +- * for (auto x=X(), y = Y(); ...; ...) {} +- * as: +- * try { +- * try { +- * for (auto x=X(), auto y=Y(); ...; ...) {} +- * } +- * finally { y.~this(); } +- * } +- * finally { x.~this(); } +- */ +-Statement *ForStatement::semanticInit(Scope *sc) ++Statement *ForStatement::semantic(Scope *sc) + { +- assert(init); +- ++nest; ++ //printf("ForStatement::semantic %s\n", toChars()); + +- Loc locinit = init->loc; +- Statements *ainit = init->flatten(sc); +- if (!ainit) +- (ainit = new Statements())->push(init); +- init = NULL; +- +- Statement *statement = this; +- +- for (size_t i = 0; i < ainit->dim; i++) +- { Statement *s = (*ainit)[i]; ++ if (init) ++ { ++ /* Rewrite: ++ * for (auto v1 = i1, v2 = i2; condition; increment) { ... } ++ * to: ++ * { auto v1 = i1, v2 = i2; for (; condition; increment) { ... } } ++ * then lowered to: ++ * auto v1 = i1; ++ * try { ++ * auto v2 = i2; ++ * try { ++ * for (; condition; increment) { ... } ++ * } finally { v2.~this(); } ++ * } finally { v1.~this(); } ++ */ ++ Statements *ainit = new Statements(); ++ ainit->push(init), init = NULL; ++ ainit->push(this); ++ Statement *s = new CompoundStatement(loc, ainit); ++ s = new ScopeStatement(loc, s); + s = s->semantic(sc); +- (*ainit)[i] = s; +- if (s) ++ if (!s->isErrorStatement()) + { +- Statement *sentry; +- Statement *sexception; +- Statement *sfinally; +- +- (*ainit)[i] = s->scopeCode(sc, &sentry, &sexception, &sfinally); +- +- if (sentry) +- { sentry = sentry->semantic(sc); +- if (sentry) +- ainit->insert(i++, sentry); +- } +- if (sexception) +- sexception = sexception->semantic(sc); +- if (sexception) +- { // Re-initialize this->init +- if (i + 1 < ainit->dim) +- { +- Statements *a = new Statements(); +- for (size_t j = i + 1; j < ainit->dim; j++) +- a->push((*ainit)[j]); +- init = new CompoundStatement(0, a); +- } +- +- Identifier *id = Lexer::uniqueId("__o"); +- Statement *handler = sexception; +- if (sexception->blockExit(FALSE) & BEfallthru) +- { handler = new ThrowStatement(0, new IdentifierExp(0, id)); +- ((ThrowStatement *)handler)->internalThrow = true; +- handler = new CompoundStatement(0, sexception, handler); +- } +- Catches *catches = new Catches(); +- Catch *ctch = new Catch(0, NULL, id, handler); +- catches->push(ctch); +- s = new TryCatchStatement(0, this, catches); +- +- if (sfinally) +- s = new TryFinallyStatement(0, s, sfinally); +- //printf("ex {{{\n"); +- s = s->semantic(sc); +- //printf("}}}\n"); +- this->relatedLabeled = s; +- statement = s; +- +- if (init) +- { Statements *a = init->flatten(sc); +- if (!a) +- (a = new Statements())->push(init); +- for (size_t j = 0; j < i + 1; j++) +- a->insert(j, (*ainit)[j]); +- init = new CompoundStatement(locinit, a); +- } +- break; +- } +- else if (sfinally) +- { // Re-initialize this->init +- if (i + 1 < ainit->dim) +- { +- Statements *a = new Statements(); +- for (size_t j = i + 1; j < ainit->dim; j++) +- a->push((*ainit)[j]); +- init = new CompoundStatement(0, a); +- } +- +- s = new TryFinallyStatement(0, this, sfinally); +- //printf("fi {{{\n"); +- s = s->semantic(sc); +- //printf("}}} fi\n"); +- this->relatedLabeled = s; +- statement = s; +- +- if (init) +- { Statements *a = init->flatten(sc); +- if (!a) +- (a = new Statements())->push(init); +- for (size_t j = 0; j < i + 1; j++) +- a->insert(j, (*ainit)[j]); +- init = new CompoundStatement(locinit, a); +- } +- break; +- } ++ if (LabelStatement *ls = checkLabeledLoop(sc, this)) ++ ls->gotoTarget = this; ++ relatedLabeled = s; + } ++ return s; + } +- if (!init) +- { // whole init semantic is completely done. +- init = new CompoundStatement(locinit, ainit); +- } +- +- --nest; +- return statement; +-} +- +-Statement *ForStatement::semantic(Scope *sc) +-{ +- if (!nest) +- { ScopeDsymbol *sym = new ScopeDsymbol(); +- sym->parent = sc->scopesym; +- sc = sc->push(sym); +- } +- else if (init) +- { // Process this->init recursively +- return semanticInit(sc); +- } ++ assert(init == NULL); + +- Statement *statement = this; +- if (init) +- statement = semanticInit(sc); ++ ScopeDsymbol *sym = new ScopeDsymbol(); ++ sym->parent = sc->scopesym; ++ sc = sc->push(sym); + + sc->noctor++; + if (condition) +@@ -1403,10 +1319,14 @@ Statement *ForStatement::semantic(Scope + body = body->semanticNoScope(sc); + sc->noctor--; + +- if (!nest) +- sc->pop(); +- //if (!nest) statement->print(); +- return statement; ++ sc->pop(); ++ ++ if (condition && condition->op == TOKerror || ++ increment && increment->op == TOKerror || ++ body && body->isErrorStatement()) ++ return new ErrorStatement(); ++ ++ return this; + } + + Statement *ForStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) +@@ -1427,11 +1347,6 @@ bool ForStatement::hasContinue() + return TRUE; + } + +-bool ForStatement::usesEH() +-{ +- return (init && init->usesEH()) || body->usesEH(); +-} +- + int ForStatement::blockExit(bool mustNotThrow) + { int result = BEfallthru; + +@@ -1462,17 +1377,6 @@ int ForStatement::blockExit(bool mustNot + } + + +-int ForStatement::comeFrom() +-{ +- //printf("ForStatement::comeFrom()\n"); +- if (body) +- { int result = body->comeFrom(); +- //printf("result = %d\n", result); +- return result; +- } +- return FALSE; +-} +- + void ForStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring("for ("); +@@ -1506,7 +1410,7 @@ void ForStatement::toCBuffer(OutBuffer * + + /******************************** ForeachStatement ***************************/ + +-ForeachStatement::ForeachStatement(Loc loc, enum TOK op, Parameters *arguments, ++ForeachStatement::ForeachStatement(Loc loc, TOK op, Parameters *arguments, + Expression *aggr, Statement *body) + : Statement(loc) + { +@@ -1552,7 +1456,8 @@ Statement *ForeachStatement::semantic(Sc + if (!inferAggregate(sc, sapply)) + { + error("invalid foreach aggregate %s", aggr->toChars()); +- return this; ++ Lerror: ++ return new ErrorStatement(); + } + + /* Check for inference errors +@@ -1561,7 +1466,7 @@ Statement *ForeachStatement::semantic(Sc + { + //printf("dim = %d, arguments->dim = %d\n", dim, arguments->dim); + error("cannot uniquely infer foreach argument types"); +- return this; ++ goto Lerror; + } + + Type *tab = aggr->type->toBasetype(); +@@ -1571,30 +1476,24 @@ Statement *ForeachStatement::semantic(Sc + if (dim < 1 || dim > 2) + { + error("only one (value) or two (key,value) arguments for tuple foreach"); +- return s; ++ goto Lerror; + } + + Type *argtype = (*arguments)[dim-1]->type; + if (argtype) +- argtype = argtype->semantic(loc, sc); ++ { argtype = argtype->semantic(loc, sc); ++ if (argtype->ty == Terror) ++ goto Lerror; ++ } + + TypeTuple *tuple = (TypeTuple *)tab; + Statements *statements = new Statements(); + //printf("aggr: op = %d, %s\n", aggr->op, aggr->toChars()); + size_t n; + TupleExp *te = NULL; +- Expression *prelude = NULL; + if (aggr->op == TOKtuple) // expression tuple + { te = (TupleExp *)aggr; + n = te->exps->dim; +- +- if (te->exps->dim > 0 && (*te->exps)[0]->op == TOKdotvar && +- ((DotVarExp *)(*te->exps)[0])->e1->isTemp()) +- { +- CommaExp *ce = (CommaExp *)((DotVarExp *)(*te->exps)[0])->e1; +- prelude = ce->e1; +- ((DotVarExp *)(*te->exps)[0])->e1 = ce->e2; +- } + } + else if (aggr->op == TOKtype) // type tuple + { +@@ -1616,7 +1515,9 @@ Statement *ForeachStatement::semantic(Sc + if (dim == 2) + { // Declare key + if (arg->storageClass & (STCout | STCref | STClazy)) +- error("no storage class for key %s", arg->ident->toChars()); ++ { error("no storage class for key %s", arg->ident->toChars()); ++ goto Lerror; ++ } + arg->type = arg->type->semantic(loc, sc); + TY keyty = arg->type->ty; + if (keyty != Tint32 && keyty != Tuns32) +@@ -1624,12 +1525,16 @@ Statement *ForeachStatement::semantic(Sc + if (global.params.is64bit) + { + if (keyty != Tint64 && keyty != Tuns64) +- error("foreach: key type must be int or uint, long or ulong, not %s", arg->type->toChars()); ++ { error("foreach: key type must be int or uint, long or ulong, not %s", arg->type->toChars()); ++ goto Lerror; ++ } + } + else +- error("foreach: key type must be int or uint, not %s", arg->type->toChars()); ++ { error("foreach: key type must be int or uint, not %s", arg->type->toChars()); ++ goto Lerror; ++ } + } +- Initializer *ie = new ExpInitializer(0, new IntegerExp(k)); ++ Initializer *ie = new ExpInitializer(Loc(), new IntegerExp(k)); + VarDeclaration *var = new VarDeclaration(loc, arg->type, arg->ident, ie); + var->storage_class |= STCmanifest; + DeclarationExp *de = new DeclarationExp(loc, var); +@@ -1639,7 +1544,10 @@ Statement *ForeachStatement::semantic(Sc + // Declare value + if (arg->storageClass & (STCout | STClazy) || + arg->storageClass & STCref && !te) ++ { + error("no storage class for value %s", arg->ident->toChars()); ++ goto Lerror; ++ } + Dsymbol *var; + if (te) + { Type *tb = e->type->toBasetype(); +@@ -1655,29 +1563,37 @@ Statement *ForeachStatement::semantic(Sc + { + var = new AliasDeclaration(loc, arg->ident, s); + if (arg->storageClass & STCref) +- error("symbol %s cannot be ref", s->toChars()); +- if (argtype && argtype->ty != Terror) +- error("cannot specify element type for symbol %s", s->toChars()); ++ { error("symbol %s cannot be ref", s->toChars()); ++ goto Lerror; ++ } ++ if (argtype) ++ { error("cannot specify element type for symbol %s", s->toChars()); ++ goto Lerror; ++ } + } + else if (e->op == TOKtype) + { + var = new AliasDeclaration(loc, arg->ident, e->type); +- if (argtype && argtype->ty != Terror) +- error("cannot specify element type for type %s", e->type->toChars()); ++ if (argtype) ++ { error("cannot specify element type for type %s", e->type->toChars()); ++ goto Lerror; ++ } + } + else + { + arg->type = e->type; +- if (argtype && argtype->ty != Terror) ++ if (argtype) + arg->type = argtype; +- Initializer *ie = new ExpInitializer(0, e); ++ Initializer *ie = new ExpInitializer(Loc(), e); + VarDeclaration *v = new VarDeclaration(loc, arg->type, arg->ident, ie); + if (arg->storageClass & STCref) + v->storage_class |= STCref | STCforeach; + if (e->isConst() || e->op == TOKstring || + e->op == TOKstructliteral || e->op == TOKarrayliteral) + { if (v->storage_class & STCref) +- error("constant value %s cannot be ref", ie->toChars()); ++ { error("constant value %s cannot be ref", ie->toChars()); ++ goto Lerror; ++ } + else + v->storage_class |= STCmanifest; + } +@@ -1687,8 +1603,10 @@ Statement *ForeachStatement::semantic(Sc + else + { + var = new AliasDeclaration(loc, arg->ident, t); +- if (argtype && argtype->ty != Terror) +- error("cannot specify element type for symbol %s", s->toChars()); ++ if (argtype) ++ { error("cannot specify element type for symbol %s", s->toChars()); ++ goto Lerror; ++ } + } + DeclarationExp *de = new DeclarationExp(loc, var); + st->push(new ExpStatement(loc, de)); +@@ -1700,9 +1618,11 @@ Statement *ForeachStatement::semantic(Sc + } + + s = new UnrolledLoopStatement(loc, statements); +- if (prelude) ++ if (LabelStatement *ls = checkLabeledLoop(sc, this)) ++ ls->gotoTarget = s; ++ if (te && te->e0) + s = new CompoundStatement(loc, +- new ExpStatement(prelude->loc, prelude), s); ++ new ExpStatement(te->e0->loc, te->e0), s); + s = s->semantic(sc); + return s; + } +@@ -1724,7 +1644,7 @@ Lagain: + if (dim < 1 || dim > 2) + { + error("only one or two arguments for array foreach"); +- break; ++ goto Lerror2; + } + + /* Look for special case of parsing char types out of char type +@@ -1732,10 +1652,9 @@ Lagain: + */ + tn = tab->nextOf()->toBasetype(); + if (tn->ty == Tchar || tn->ty == Twchar || tn->ty == Tdchar) +- { Parameter *arg; +- ++ { + int i = (dim == 1) ? 0 : 1; // index of value +- arg = (*arguments)[i]; ++ Parameter *arg = (*arguments)[i]; + arg->type = arg->type->semantic(loc, sc); + arg->type = arg->type->addStorageClass(arg->storageClass); + tnv = arg->type->toBasetype(); +@@ -1743,11 +1662,15 @@ Lagain: + (tnv->ty == Tchar || tnv->ty == Twchar || tnv->ty == Tdchar)) + { + if (arg->storageClass & STCref) +- error("foreach: value of UTF conversion cannot be ref"); ++ { error("foreach: value of UTF conversion cannot be ref"); ++ goto Lerror2; ++ } + if (dim == 2) + { arg = (*arguments)[0]; + if (arg->storageClass & STCref) +- error("foreach: key cannot be ref"); ++ { error("foreach: key cannot be ref"); ++ goto Lerror2; ++ } + } + goto Lapply; + } +@@ -1770,11 +1693,12 @@ Lagain: + key = var; + if (arg->storageClass & STCref) + { +- if (!var->type->invariantOf()->equals(arg->type->invariantOf()) || ++ if (!var->type->immutableOf()->equals(arg->type->immutableOf()) || + !MODimplicitConv(var->type->mod, arg->type->mod)) + { + error("key type mismatch, %s to ref %s", + var->type->toChars(), arg->type->toChars()); ++ goto Lerror2; + } + } + } +@@ -1797,11 +1721,12 @@ Lagain: + var->storage_class |= STCconst; + + Type *t = tab->nextOf(); +- if (!t->invariantOf()->equals(arg->type->invariantOf()) || ++ if (!t->immutableOf()->equals(arg->type->immutableOf()) || + !MODimplicitConv(t->mod, arg->type->mod)) + { + error("argument type mismatch, %s to ref %s", + t->toChars(), arg->type->toChars()); ++ goto Lerror2; + } + } + } +@@ -1836,7 +1761,7 @@ Lagain: + if (op == TOKforeach_reverse) + key->init = new ExpInitializer(loc, tmp_length); + else +- key->init = new ExpInitializer(loc, new IntegerExp(0)); ++ key->init = new ExpInitializer(loc, new IntegerExp(loc, 0, NULL)); + + Statements *cs = new Statements(); + cs->push(new ExpStatement(loc, tmp)); +@@ -1854,7 +1779,7 @@ Lagain: + Expression *increment = NULL; + if (op == TOKforeach) + // key += 1 +- increment = new AddAssignExp(loc, new VarExp(loc, key), new IntegerExp(1)); ++ increment = new AddAssignExp(loc, new VarExp(loc, key), new IntegerExp(loc, 1, NULL)); + + // T value = tmp[key]; + value->init = new ExpInitializer(loc, new IndexExp(loc, new VarExp(loc, tmp), new VarExp(loc, key))); +@@ -1871,17 +1796,15 @@ Lagain: + { + ExpInitializer *ie = new ExpInitializer(loc, new IdentifierExp(loc, key->ident)); + VarDeclaration *v = new VarDeclaration(loc, arg->type, arg->ident, ie); +-#if (BUG6652 == 1 || BUG6652 == 2) +- v->storage_class |= STCforeach | STCref | (arg->storageClass & STCref ? 0 : STCbug6652); +-#else + v->storage_class |= STCforeach | (arg->storageClass & STCref); +-#endif + body = new CompoundStatement(loc, new ExpStatement(loc, v), body); + } + } + body = new CompoundStatement(loc, ds, body); + + s = new ForStatement(loc, forinit, cond, increment, body); ++ if (LabelStatement *ls = checkLabeledLoop(sc, this)) ++ ls->gotoTarget = s; + s = s->semantic(sc); + break; + } +@@ -1926,7 +1849,7 @@ Lagain: + if (dim < 1 || dim > 2) + { + error("only one or two arguments for associative array foreach"); +- break; ++ goto Lerror2; + } + + /* This only works if Key or Value is a static array. +@@ -1964,7 +1887,7 @@ Lagain: + { idfront = Id::Fback; + idpopFront = Id::FpopBack; + } +- Dsymbol *sfront = ad->search(0, idfront, 0); ++ Dsymbol *sfront = ad->search(Loc(), idfront, 0); + if (!sfront) + goto Lapply; + +@@ -2057,6 +1980,8 @@ Lagain: + makeargs, this->body); + + s = new ForStatement(loc, init, condition, increment, forbody); ++ if (LabelStatement *ls = checkLabeledLoop(sc, this)) ++ ls->gotoTarget = s; + #if 0 + printf("init: %s\n", init->toChars()); + printf("condition: %s\n", condition->toChars()); +@@ -2068,7 +1993,7 @@ Lagain: + + Lrangeerr: + error("cannot infer argument types"); +- break; ++ goto Lerror2; + } + #endif + case Tdelegate: +@@ -2082,8 +2007,6 @@ Lagain: + return this; + } + +- Type *tret = func->type->nextOf(); +- + TypeFunction *tfld = NULL; + if (sapply) + { FuncDeclaration *fdapply = sapply->isFuncDeclaration(); +@@ -2127,7 +2050,9 @@ Lagain: + id = arg->ident; // argument copy is not need. + if ((arg->storageClass & STCref) != stc) + { if (!stc) +- error("foreach: cannot make %s ref", arg->ident->toChars()); ++ { error("foreach: cannot make %s ref", arg->ident->toChars()); ++ goto Lerror2; ++ } + goto LcopyArg; + } + } +@@ -2142,9 +2067,9 @@ Lagain: + LcopyArg: + id = Lexer::uniqueId("__applyArg", (int)i); + +- Initializer *ie = new ExpInitializer(0, new IdentifierExp(0, id)); +- VarDeclaration *v = new VarDeclaration(0, arg->type, arg->ident, ie); +- s = new ExpStatement(0, v); ++ Initializer *ie = new ExpInitializer(Loc(), new IdentifierExp(Loc(), id)); ++ VarDeclaration *v = new VarDeclaration(Loc(), arg->type, arg->ident, ie); ++ s = new ExpStatement(Loc(), v); + body = new CompoundStatement(loc, s, body); + } + args->push(new Parameter(stc, arg->type, id, NULL)); +@@ -2152,7 +2077,7 @@ Lagain: + tfld = new TypeFunction(args, Type::tint32, 0, LINKd); + cases = new Statements(); + gotos = new CompoundStatements(); +- FuncLiteralDeclaration *fld = new FuncLiteralDeclaration(loc, 0, tfld, TOKdelegate, this); ++ FuncLiteralDeclaration *fld = new FuncLiteralDeclaration(loc, Loc(), tfld, TOKdelegate, this); + fld->fbody = body; + Expression *flde = new FuncExp(loc, fld); + flde = flde->semantic(sc); +@@ -2166,7 +2091,7 @@ Lagain: + if (!gs->label->statement) + { // 'Promote' it to this scope, and replace with a return + cases->push(gs); +- s = new ReturnStatement(0, new IntegerExp(cases->dim + 1)); ++ s = new ReturnStatement(Loc(), new IntegerExp(cases->dim + 1)); + (*cs->statements)[0] = s; + } + } +@@ -2178,38 +2103,61 @@ Lagain: + if (dim == 2) + { + if (arg->storageClass & STCref) +- error("foreach: index cannot be ref"); ++ { error("foreach: index cannot be ref"); ++ goto Lerror2; ++ } + if (!arg->type->equals(taa->index)) +- error("foreach: index must be type %s, not %s", taa->index->toChars(), arg->type->toChars()); ++ { error("foreach: index must be type %s, not %s", taa->index->toChars(), arg->type->toChars()); ++ goto Lerror2; ++ } + arg = (*arguments)[1]; + } + if (!arg->type->equals(taa->nextOf())) +- error("foreach: value must be type %s, not %s", taa->nextOf()->toChars(), arg->type->toChars()); +- ++ { error("foreach: value must be type %s, not %s", taa->nextOf()->toChars(), arg->type->toChars()); ++ goto Lerror2; ++ } + /* Call: + * _aaApply(aggr, keysize, flde) + */ +- FuncDeclaration *fdapply; +- if (dim == 2) +- fdapply = FuncDeclaration::genCfunc(Type::tindex, "_aaApply2"); +- else +- fdapply = FuncDeclaration::genCfunc(Type::tindex, "_aaApply"); +- ec = new VarExp(0, fdapply); ++ static const char *name[2] = { "_aaApply", "_aaApply2" }; ++ static FuncDeclaration *fdapply[2] = { NULL, NULL }; ++ static TypeDelegate *fldeTy[2] = { NULL, NULL }; ++ ++ unsigned char i = dim == 2; ++ if (!fdapply[i]) { ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); ++ args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); ++ Parameters* dgargs = new Parameters; ++ dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); ++ if (dim == 2) ++ dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); ++ fldeTy[i] = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd)); ++ args->push(new Parameter(STCin, fldeTy[i], NULL, NULL)); ++ fdapply[i] = FuncDeclaration::genCfunc(args, Type::tint32, name[i]); ++ } ++ ++ ec = new VarExp(Loc(), fdapply[i]); + Expressions *exps = new Expressions(); + exps->push(aggr); + size_t keysize = taa->index->size(); + keysize = (keysize + ((size_t)Target::ptrsize-1)) & ~((size_t)Target::ptrsize-1); +- exps->push(new IntegerExp(0, keysize, Type::tsize_t)); ++ // paint delegate argument to the type runtime expects ++ if (!fldeTy[i]->equals(flde->type)) { ++ flde = new CastExp(loc, flde, flde->type); ++ flde->type = fldeTy[i]; ++ } ++ exps->push(new IntegerExp(Loc(), keysize, Type::tsize_t)); + exps->push(flde); + e = new CallExp(loc, ec, exps); +- e->type = Type::tindex; // don't run semantic() on e ++ e->type = Type::tint32; // don't run semantic() on e + } + else if (tab->ty == Tarray || tab->ty == Tsarray) + { + /* Call: + * _aApply(aggr, flde) + */ +- static char fntab[9][3] = ++ static const char fntab[9][3] = + { "cc","cw","cd", + "wc","cc","wd", + "dc","dw","dd" +@@ -2233,17 +2181,33 @@ Lagain: + } + const char *r = (op == TOKforeach_reverse) ? "R" : ""; + int j = sprintf(fdname, "_aApply%s%.*s%llu", r, 2, fntab[flag], (ulonglong)dim); +- assert(j < sizeof(fdname)); +- FuncDeclaration *fdapply = FuncDeclaration::genCfunc(Type::tindex, fdname); ++ assert(j < sizeof(fdname) / sizeof(fdname[0])); + +- ec = new VarExp(0, fdapply); ++ FuncDeclaration *fdapply; ++ TypeDelegate *dgty; ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, tn->arrayOf(), NULL, NULL)); ++ Parameters* dgargs = new Parameters; ++ dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); ++ if (dim == 2) ++ dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); ++ dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd)); ++ args->push(new Parameter(STCin, dgty, NULL, NULL)); ++ fdapply = FuncDeclaration::genCfunc(args, Type::tint32, fdname); ++ ++ ec = new VarExp(Loc(), fdapply); + Expressions *exps = new Expressions(); + if (tab->ty == Tsarray) + aggr = aggr->castTo(sc, tn->arrayOf()); + exps->push(aggr); ++ // paint delegate argument to the type runtime expects ++ if (!dgty->equals(flde->type)) { ++ flde = new CastExp(loc, flde, flde->type); ++ flde->type = dgty; ++ } + exps->push(flde); + e = new CallExp(loc, ec, exps); +- e->type = Type::tindex; // don't run semantic() on e ++ e->type = Type::tint32; // don't run semantic() on e + } + else if (tab->ty == Tdelegate) + { +@@ -2260,7 +2224,9 @@ Lagain: + e = new CallExp(loc, aggr, exps); + e = e->semantic(sc); + if (e->type != Type::tint32) +- error("opApply() function for %s must return an int", tab->toChars()); ++ { error("opApply() function for %s must return an int", tab->toChars()); ++ goto Lerror2; ++ } + } + else + { +@@ -2290,7 +2256,9 @@ Lagain: + e = new CallExp(loc, ec, exps); + e = e->semantic(sc); + if (e->type != Type::tint32) +- error("opApply() function for %s must return an int", tab->toChars()); ++ { error("opApply() function for %s must return an int", tab->toChars()); ++ goto Lerror2; ++ } + } + + if (!cases->dim) +@@ -2302,15 +2270,15 @@ Lagain: + Statements *a = new Statements(); + + // default: break; takes care of cases 0 and 1 +- s = new BreakStatement(0, NULL); +- s = new DefaultStatement(0, s); ++ s = new BreakStatement(Loc(), NULL); ++ s = new DefaultStatement(Loc(), s); + a->push(s); + + // cases 2... + for (size_t i = 0; i < cases->dim; i++) + { + s = (*cases)[i]; +- s = new CaseStatement(0, new IntegerExp(i + 2), s); ++ s = new CaseStatement(Loc(), new IntegerExp(i + 2), s); + a->push(s); + } + +@@ -2321,13 +2289,13 @@ Lagain: + break; + } + case Terror: +- s = NULL; ++ Lerror2: ++ s = new ErrorStatement(); + break; + + default: + error("foreach: %s is not an aggregate type", aggr->type->toChars()); +- s = NULL; // error recovery +- break; ++ goto Lerror2; + } + sc->noctor--; + sc->pop(); +@@ -2359,11 +2327,6 @@ bool ForeachStatement::hasContinue() + return TRUE; + } + +-bool ForeachStatement::usesEH() +-{ +- return body->usesEH(); +-} +- + int ForeachStatement::blockExit(bool mustNotThrow) + { int result = BEfallthru; + +@@ -2378,13 +2341,6 @@ int ForeachStatement::blockExit(bool mus + } + + +-int ForeachStatement::comeFrom() +-{ +- if (body) +- return body->comeFrom(); +- return FALSE; +-} +- + void ForeachStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring(Token::toChars(op)); +@@ -2395,8 +2351,7 @@ void ForeachStatement::toCBuffer(OutBuff + if (i) + buf->writestring(", "); + if (a->storageClass & STCref) +- buf->writestring((global.params.Dversion == 1) +- ? (char*)"inout " : (char*)"ref "); ++ buf->writestring((char*)"ref "); + if (a->type) + a->type->toCBuffer(buf, a->ident, hgs); + else +@@ -2420,7 +2375,7 @@ void ForeachStatement::toCBuffer(OutBuff + + #if DMDV2 + +-ForeachRangeStatement::ForeachRangeStatement(Loc loc, enum TOK op, Parameter *arg, ++ForeachRangeStatement::ForeachRangeStatement(Loc loc, TOK op, Parameter *arg, + Expression *lwr, Expression *upr, Statement *body) + : Statement(loc) + { +@@ -2446,15 +2401,14 @@ Statement *ForeachRangeStatement::syntax + Statement *ForeachRangeStatement::semantic(Scope *sc) + { + //printf("ForeachRangeStatement::semantic() %p\n", this); +- Statement *s = this; +- + lwr = lwr->semantic(sc); + lwr = resolveProperties(sc, lwr); + lwr = lwr->optimize(WANTvalue); + if (!lwr->type) + { + error("invalid range lower bound %s", lwr->toChars()); +- return this; ++ Lerror: ++ return new ErrorStatement(); + } + + upr = upr->semantic(sc); +@@ -2463,7 +2417,7 @@ Statement *ForeachRangeStatement::semant + if (!upr->type) + { + error("invalid range upper bound %s", upr->toChars()); +- return this; ++ goto Lerror; + } + + if (arg->type) +@@ -2483,19 +2437,24 @@ Statement *ForeachRangeStatement::semant + /* Just picking the first really isn't good enough. + */ + arg->type = lwr->type; +- arg->type = arg->type->addStorageClass(arg->storageClass); ++ } ++ else if (lwr->type == upr->type) ++ { ++ /* Same logic as CondExp ?lwr:upr ++ */ ++ arg->type = lwr->type; + } + else + { + AddExp ea(loc, lwr, upr); + Expression *e = ea.typeCombine(sc); + arg->type = ea.type; +- arg->type = arg->type->addStorageClass(arg->storageClass); + lwr = ea.e1; + upr = ea.e2; + } ++ arg->type = arg->type->addStorageClass(arg->storageClass); + } +-#if 1 ++ + /* Convert to a for loop: + * foreach (key; lwr .. upr) => + * for (auto key = lwr, auto tmp = upr; key < tmp; ++key) +@@ -2561,16 +2520,12 @@ Statement *ForeachRangeStatement::semant + { + ie = new ExpInitializer(loc, new IdentifierExp(loc, key->ident)); + VarDeclaration *v = new VarDeclaration(loc, arg->type, arg->ident, ie); +-#if (BUG6652 == 1 || BUG6652 == 2) +- v->storage_class |= STCforeach | STCref | (arg->storageClass & STCref ? 0 : STCbug6652); +-#else + v->storage_class |= STCforeach | (arg->storageClass & STCref); +-#endif + body = new CompoundStatement(loc, new ExpStatement(loc, v), body); + } + if (arg->storageClass & STCref) + { +- if (!key->type->invariantOf()->equals(arg->type->invariantOf()) || ++ if (!key->type->immutableOf()->equals(arg->type->immutableOf()) || + !MODimplicitConv(key->type->mod, arg->type->mod)) + { + error("argument type mismatch, %s to ref %s", +@@ -2578,34 +2533,10 @@ Statement *ForeachRangeStatement::semant + } + } + +- ForStatement *fs = new ForStatement(loc, forinit, cond, increment, body); +- s = fs->semantic(sc); +- return s; +-#else +- if (!arg->type->isscalar()) +- error("%s is not a scalar type", arg->type->toChars()); +- +- sym = new ScopeDsymbol(); +- sym->parent = sc->scopesym; +- sc = sc->push(sym); +- +- sc->noctor++; +- +- key = new VarDeclaration(loc, arg->type, arg->ident, NULL); +- DeclarationExp *de = new DeclarationExp(loc, key); +- de->semantic(sc); +- +- if (key->storage_class) +- error("foreach range: key cannot have storage class"); +- +- sc->sbreak = this; +- sc->scontinue = this; +- body = body->semantic(sc); +- +- sc->noctor--; +- sc->pop(); +- return s; +-#endif ++ ForStatement *s = new ForStatement(loc, forinit, cond, increment, body); ++ if (LabelStatement *ls = checkLabeledLoop(sc, this)) ++ ls->gotoTarget = s; ++ return s->semantic(sc); + } + + bool ForeachRangeStatement::hasBreak() +@@ -2618,12 +2549,6 @@ bool ForeachRangeStatement::hasContinue( + return TRUE; + } + +-bool ForeachRangeStatement::usesEH() +-{ +- assert(global.errors); +- return body->usesEH(); +-} +- + int ForeachRangeStatement::blockExit(bool mustNotThrow) + { + assert(global.errors); +@@ -2631,12 +2556,6 @@ int ForeachRangeStatement::blockExit(boo + } + + +-int ForeachRangeStatement::comeFrom() +-{ +- assert(global.errors); +- return FALSE; +-} +- + void ForeachRangeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring(Token::toChars(op)); +@@ -2697,21 +2616,23 @@ Statement *IfStatement::semantic(Scope * + // Evaluate at runtime + unsigned cs0 = sc->callSuper; + unsigned cs1; ++ unsigned *fi0 = fi0 = sc->saveFieldInit(); ++ unsigned *fi1 = NULL; + +- Scope *scd; ++ ScopeDsymbol *sym = new ScopeDsymbol(); ++ sym->parent = sc->scopesym; ++ Scope *scd = sc->push(sym); + if (arg) + { /* Declare arg, which we will set to be the + * result of condition. + */ +- ScopeDsymbol *sym = new ScopeDsymbol(); +- sym->parent = sc->scopesym; +- scd = sc->push(sym); + + match = new VarDeclaration(loc, arg->type, arg->ident, new ExpInitializer(loc, condition)); + match->parent = sc->func; ++ match->storage_class |= arg->storageClass; + + DeclarationExp *de = new DeclarationExp(loc, match); +- VarExp *ve = new VarExp(0, match); ++ VarExp *ve = new VarExp(Loc(), match); + condition = new CommaExp(loc, de, ve); + condition = condition->semantic(scd); + +@@ -2728,7 +2649,6 @@ Statement *IfStatement::semantic(Scope * + condition = condition->semantic(sc); + condition = condition->addDtorHook(sc); + condition = resolveProperties(sc, condition); +- scd = sc->push(); + } + + // Convert to boolean after declaring arg so this works: +@@ -2744,19 +2664,23 @@ Statement *IfStatement::semantic(Scope * + scd->pop(); + + cs1 = sc->callSuper; ++ fi1 = sc->fieldinit; + sc->callSuper = cs0; ++ sc->fieldinit = fi0; + if (elsebody) + elsebody = elsebody->semanticScope(sc, NULL, NULL); + sc->mergeCallSuper(loc, cs1); ++ sc->mergeFieldInit(loc, fi1); + ++ if (condition->op == TOKerror || ++ (ifbody && ifbody->isErrorStatement()) || ++ (elsebody && elsebody->isErrorStatement())) ++ { ++ return new ErrorStatement(); ++ } + return this; + } + +-bool IfStatement::usesEH() +-{ +- return (ifbody && ifbody->usesEH()) || (elsebody && elsebody->usesEH()); +-} +- + int IfStatement::blockExit(bool mustNotThrow) + { + //printf("IfStatement::blockExit(%p)\n", this); +@@ -2898,11 +2822,6 @@ Statements *ConditionalStatement::flatte + return a; + } + +-bool ConditionalStatement::usesEH() +-{ +- return (ifbody && ifbody->usesEH()) || (elsebody && elsebody->usesEH()); +-} +- + int ConditionalStatement::blockExit(bool mustNotThrow) + { + int result = ifbody->blockExit(mustNotThrow); +@@ -2971,10 +2890,12 @@ Statement *PragmaStatement::semantic(Sco + { + Expression *e = (*args)[i]; + ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); +- if (e->op != TOKerror && e->op != TOKtype) +- e = e->ctfeInterpret(); ++ sc = sc->endCTFE(); ++ // pragma(msg) is allowed to contain types as well as expressions ++ e = ctfeInterpretForPragmaMsg(e); + if (e->op == TOKerror) + { errorSupplemental(loc, "while evaluating pragma(msg, %s)", (*args)[i]->toChars()); + goto Lerror; +@@ -2982,12 +2903,12 @@ Statement *PragmaStatement::semantic(Sco + StringExp *se = e->toString(); + if (se) + { +- fprintf(stdmsg, "%.*s", (int)se->len, (char *)se->string); ++ fprintf(stderr, "%.*s", (int)se->len, (char *)se->string); + } + else +- fprintf(stdmsg, "%s", e->toChars()); ++ fprintf(stderr, "%s", e->toChars()); + } +- fprintf(stdmsg, "\n"); ++ fprintf(stderr, "\n"); + } + } + else if (ident == Id::lib) +@@ -3003,8 +2924,11 @@ Statement *PragmaStatement::semantic(Sco + { + Expression *e = (*args)[0]; + ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + e = e->ctfeInterpret(); + (*args)[0] = e; + StringExp *se = e->toString(); +@@ -3015,7 +2939,7 @@ Statement *PragmaStatement::semantic(Sco + char *name = (char *)mem.malloc(se->len + 1); + memcpy(name, se->string, se->len); + name[se->len] = 0; +- printf("library %s\n", name); ++ fprintf(global.stdmsg, "library %s\n", name); + mem.free(name); + } + } +@@ -3029,8 +2953,12 @@ Statement *PragmaStatement::semantic(Sco + else + { + Expression *e = (*args)[0]; ++ ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); ++ + e = e->ctfeInterpret(); + (*args)[0] = e; + Dsymbol *sa = getDsymbol(e); +@@ -3054,11 +2982,6 @@ Lerror: + return body; + } + +-bool PragmaStatement::usesEH() +-{ +- return body && body->usesEH(); +-} +- + int PragmaStatement::blockExit(bool mustNotThrow) + { + int result = BEfallthru; +@@ -3179,8 +3102,9 @@ Statement *SwitchStatement::semantic(Sco + condition->type = condition->type->constOf(); + } + else +- { condition = condition->integralPromotions(sc); +- if (!condition->type->isintegral()) ++ { ++ condition = condition->integralPromotions(sc); ++ if (condition->op != TOKerror && !condition->type->isintegral()) + error("'%s' must be of integral or string type, it is a %s", condition->toChars(), condition->type->toChars()); + } + condition = condition->optimize(WANTvalue); +@@ -3249,8 +3173,11 @@ Statement *SwitchStatement::semantic(Sco + if (em) + { + for (size_t j = 0; j < cases->dim; j++) +- { CaseStatement *cs = (*cases)[j]; +- if (cs->exp->equals(em->value) || cs->exp->toInteger() == em->value->toInteger()) ++ { ++ CaseStatement *cs = (*cases)[j]; ++ if (cs->exp->equals(em->value) || ++ (!cs->exp->type->isString() && !em->value->type->isString() && ++ cs->exp->toInteger() == em->value->toInteger())) + goto L1; + } + error("enum member %s not represented in final switch", em->toChars()); +@@ -3267,7 +3194,7 @@ Statement *SwitchStatement::semantic(Sco + if (!sc->sw->sdefault && (!isFinal || needswitcherror || global.params.useAssert)) + { hasNoDefault = 1; + +- if (!isFinal) ++ if (!isFinal && !body->isErrorStatement()) + deprecation("non-final switch statement without a default is deprecated"); + + // Generate runtime error if the default is hit +@@ -3286,7 +3213,7 @@ Statement *SwitchStatement::semantic(Sco + sc->sw->sdefault = new DefaultStatement(loc, s); + a->push(body); + if (body->blockExit(FALSE) & BEfallthru) +- a->push(new BreakStatement(0, NULL)); ++ a->push(new BreakStatement(Loc(), NULL)); + a->push(sc->sw->sdefault); + cs = new CompoundStatement(loc, a); + body = cs; +@@ -3301,11 +3228,6 @@ bool SwitchStatement::hasBreak() + return TRUE; + } + +-bool SwitchStatement::usesEH() +-{ +- return body ? body->usesEH() : 0; +-} +- + int SwitchStatement::blockExit(bool mustNotThrow) + { int result = BEnone; + if (condition->canThrow(mustNotThrow)) +@@ -3368,11 +3290,14 @@ Statement *CaseStatement::syntaxCopy() + } + + Statement *CaseStatement::semantic(Scope *sc) +-{ SwitchStatement *sw = sc->sw; ++{ ++ SwitchStatement *sw = sc->sw; + + //printf("CaseStatement::semantic() %s\n", toChars()); ++ sc = sc->startCTFE(); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); ++ sc = sc->endCTFE(); + if (sw) + { + exp = exp->implicitCastTo(sc, sw->condition->type); +@@ -3438,7 +3363,7 @@ Statement *CaseStatement::semantic(Scope + return this; + } + +-int CaseStatement::compare(Object *obj) ++int CaseStatement::compare(RootObject *obj) + { + // Sort cases so we can do an efficient lookup + CaseStatement *cs2 = (CaseStatement *)(obj); +@@ -3446,22 +3371,12 @@ int CaseStatement::compare(Object *obj) + return exp->compare(cs2->exp); + } + +-bool CaseStatement::usesEH() +-{ +- return statement->usesEH(); +-} +- + int CaseStatement::blockExit(bool mustNotThrow) + { + return statement->blockExit(mustNotThrow); + } + + +-int CaseStatement::comeFrom() +-{ +- return TRUE; +-} +- + void CaseStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring("case "); +@@ -3494,17 +3409,27 @@ Statement *CaseRangeStatement::syntaxCop + Statement *CaseRangeStatement::semantic(Scope *sc) + { SwitchStatement *sw = sc->sw; + ++ if (sw == NULL) ++ { ++ error("case range not in switch statement"); ++ return NULL; ++ } ++ + //printf("CaseRangeStatement::semantic() %s\n", toChars()); + if (sw->isFinal) + error("case ranges not allowed in final switch"); + ++ sc = sc->startCTFE(); + first = first->semantic(sc); + first = resolveProperties(sc, first); ++ sc = sc->endCTFE(); + first = first->implicitCastTo(sc, sw->condition->type); + first = first->ctfeInterpret(); + ++ sc = sc->startCTFE(); + last = last->semantic(sc); + last = resolveProperties(sc, last); ++ sc = sc->endCTFE(); + last = last->implicitCastTo(sc, sw->condition->type); + last = last->ctfeInterpret(); + +@@ -3606,22 +3531,12 @@ Statement *DefaultStatement::semantic(Sc + return this; + } + +-bool DefaultStatement::usesEH() +-{ +- return statement->usesEH(); +-} +- + int DefaultStatement::blockExit(bool mustNotThrow) + { + return statement->blockExit(mustNotThrow); + } + + +-int DefaultStatement::comeFrom() +-{ +- return TRUE; +-} +- + void DefaultStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring("default:"); +@@ -3764,7 +3679,12 @@ Statement *ReturnStatement::semantic(Sco + if (fd->fes) + fd = fd->fes->func; // fd is now function enclosing foreach + +- Type *tret = fd->type->nextOf(); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ assert(tf->ty == Tfunction); ++ bool isRefReturn = tf->isref && !(fd->storage_class & STCauto); ++ // Until 'ref' deduction finished, 'auto ref' is treated as a 'value return'. ++ ++ Type *tret = tf->next; + if (fd->tintro) + /* We'll be implicitly casting the return expression to tintro + */ +@@ -3791,7 +3711,7 @@ Statement *ReturnStatement::semantic(Sco + // return this; + if (exp && exp->op != TOKthis) + error("cannot return expression from constructor"); +- exp = new ThisExp(0); ++ exp = new ThisExp(Loc()); + exp->type = tret; + } + +@@ -3809,30 +3729,30 @@ Statement *ReturnStatement::semantic(Sco + exp = exp->inferType(fld->treq->nextOf()->nextOf()); + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); +- if (!((TypeFunction *)fd->type)->isref) ++ // Until 'ref' deduction finished, don't invoke constant folding ++ if (!tf->isref) + exp = exp->optimize(WANTvalue); + ++ if (Expression *e = exp->isTemp()) ++ exp = e; // don't need temporary + if (exp->op == TOKcall) +- valueNoDtor(exp); +- else +- { +- Expression *e = exp->isTemp(); +- if (e) +- exp = e; // don't need temporary +- } ++ exp = valueNoDtor(exp); + + if (fd->nrvo_can && exp->op == TOKvar) +- { VarExp *ve = (VarExp *)exp; ++ { ++ VarExp *ve = (VarExp *)exp; + VarDeclaration *v = ve->var->isVarDeclaration(); + +- if (((TypeFunction *)fd->type)->isref) ++ if (isRefReturn) + // Function returns a reference + fd->nrvo_can = 0; + else if (!v || v->isOut() || v->isRef()) + fd->nrvo_can = 0; + else if (fd->nrvo_var == NULL) +- { if (!v->isDataseg() && !v->isParameter() && v->toParent2() == fd) +- { //printf("Setting nrvo to %s\n", v->toChars()); ++ { ++ if (!v->isDataseg() && !v->isParameter() && v->toParent2() == fd) ++ { ++ //printf("Setting nrvo to %s\n", v->toChars()); + fd->nrvo_var = v; + } + else +@@ -3844,15 +3764,8 @@ Statement *ReturnStatement::semantic(Sco + else + fd->nrvo_can = 0; + +- if (!fd->nrvo_can && +- exp->isLvalue() && !((TypeFunction *)fd->type)->isref) +- { +- exp = callCpCtor(exp->loc, sc, exp, 1); +- } +- + if (fd->inferRetType) +- { TypeFunction *tf = (TypeFunction *)fd->type; +- assert(tf->ty == Tfunction); ++ { + Type *tfret = tf->nextOf(); + if (tfret) + { +@@ -3871,7 +3784,7 @@ Statement *ReturnStatement::semantic(Sco + tf->next = exp->type; + else if (m1 && !m2) + ; +- else ++ else if (exp->op != TOKerror) + error("mismatched function return type inference of %s and %s", + exp->type->toChars(), tfret->toChars()); + } +@@ -3898,21 +3811,26 @@ Statement *ReturnStatement::semantic(Sco + unsigned errors = global.startGagging(); + exp->checkEscapeRef(); + if (global.endGagging(errors)) +- tf->isref = FALSE; // return by value ++ tf->isref = false; // return by value + } + else +- tf->isref = FALSE; // return by value ++ tf->isref = false; // return by value + fd->storage_class &= ~STCauto; ++ ++ isRefReturn = tf->isref; // 'ref' deduction finished ++ if (!isRefReturn) ++ exp = exp->optimize(WANTvalue); + } + tf->next = exp->type; + //fd->type = tf->semantic(loc, sc); // Removed with 6902 + if (!fd->tintro) +- { tret = fd->type->nextOf(); ++ { ++ tret = tf->next; + tbret = tret->toBasetype(); + } + } + if (fd->returnLabel) +- eorg = exp; ++ eorg = exp->copy(); + + if (!fd->returns) + fd->returns = new ReturnStatements(); +@@ -3920,38 +3838,41 @@ Statement *ReturnStatement::semantic(Sco + } + else if (tbret->ty != Tvoid) + { +- assert(fd->type->ty == Tfunction); +- TypeFunction *tf = (TypeFunction *)fd->type; +- if (fd->isPureBypassingInference() != PUREimpure && +- !tf->hasMutableIndirectionParams() && +- !exp->type->implicitConvTo(tret) && +- exp->type->invariantOf()->implicitConvTo(tret)) ++ if (!exp->type->implicitConvTo(tret) && ++ fd->parametersIntersect(exp->type)) + { +- exp = exp->castTo(sc, exp->type->invariantOf()); ++ if (exp->type->immutableOf()->implicitConvTo(tret)) ++ exp = exp->castTo(sc, exp->type->immutableOf()); ++ else if (exp->type->wildOf()->implicitConvTo(tret)) ++ exp = exp->castTo(sc, exp->type->wildOf()); + } + if (fd->tintro) +- exp = exp->implicitCastTo(sc, fd->type->nextOf()); ++ exp = exp->implicitCastTo(sc, tf->next); + + // eorg isn't casted to tret (== fd->tintro->nextOf()) + if (fd->returnLabel) + eorg = exp->copy(); + exp = exp->implicitCastTo(sc, tret); + +- if (!((TypeFunction *)fd->type)->isref) ++ if (!isRefReturn) + exp = exp->optimize(WANTvalue); ++ ++ if (!fd->returns) ++ fd->returns = new ReturnStatements(); ++ fd->returns->push(this); + } + } + else if (fd->inferRetType) + { +- if (fd->type->nextOf()) ++ if (tf->next) + { +- if (fd->type->nextOf()->ty != Tvoid) ++ if (tf->next->ty != Tvoid) + error("mismatched function return type inference of void and %s", +- fd->type->nextOf()->toChars()); ++ tf->next->toChars()); + } + else + { +- ((TypeFunction *)fd->type)->next = Type::tvoid; ++ tf->next = Type::tvoid; + //fd->type = fd->type->semantic(loc, sc); // Remove with7321, same as 6902 + if (!fd->tintro) + { tret = Type::tvoid; +@@ -3977,16 +3898,16 @@ Statement *ReturnStatement::semantic(Sco + { + sc->fes->cases->push(this); + // Construct: return cases->dim+1; +- s = new ReturnStatement(0, new IntegerExp(sc->fes->cases->dim + 1)); ++ s = new ReturnStatement(Loc(), new IntegerExp(sc->fes->cases->dim + 1)); + } +- else if (fd->type->nextOf()->toBasetype() == Type::tvoid) ++ else if (tf->next->toBasetype() == Type::tvoid) + { +- s = new ReturnStatement(0, NULL); ++ s = new ReturnStatement(Loc(), NULL); + sc->fes->cases->push(s); + + // Construct: { exp; return cases->dim + 1; } + Statement *s1 = new ExpStatement(loc, exp); +- Statement *s2 = new ReturnStatement(0, new IntegerExp(sc->fes->cases->dim + 1)); ++ Statement *s2 = new ReturnStatement(Loc(), new IntegerExp(sc->fes->cases->dim + 1)); + s = new CompoundStatement(loc, s1, s2); + } + else +@@ -4000,7 +3921,7 @@ Statement *ReturnStatement::semantic(Sco + VarDeclaration *v = new VarDeclaration(loc, tret, fd->outId, NULL); + v->noscope = 1; + v->storage_class |= STCresult; +- if (((TypeFunction *)fd->type)->isref) ++ if (isRefReturn) + v->storage_class |= STCref | STCforeach; + v->semantic(sco); + if (!sco->insert(v)) +@@ -4009,14 +3930,14 @@ Statement *ReturnStatement::semantic(Sco + fd->vresult = v; + } + +- s = new ReturnStatement(0, new VarExp(0, fd->vresult)); ++ s = new ReturnStatement(Loc(), new VarExp(Loc(), fd->vresult)); + sc->fes->cases->push(s); + + // Construct: { vresult = exp; return cases->dim + 1; } +- exp = new ConstructExp(loc, new VarExp(0, fd->vresult), exp); ++ exp = new ConstructExp(loc, new VarExp(Loc(), fd->vresult), exp); + exp = exp->semantic(sc); + Statement *s1 = new ExpStatement(loc, exp); +- Statement *s2 = new ReturnStatement(0, new IntegerExp(sc->fes->cases->dim + 1)); ++ Statement *s2 = new ReturnStatement(Loc(), new IntegerExp(sc->fes->cases->dim + 1)); + s = new CompoundStatement(loc, s1, s2); + } + return s; +@@ -4024,7 +3945,7 @@ Statement *ReturnStatement::semantic(Sco + + if (exp) + { +- if (((TypeFunction *)fd->type)->isref && !fd->isCtorDeclaration()) ++ if (isRefReturn && !fd->isCtorDeclaration()) + { // Function returns a reference + exp = exp->toLvalue(sc, exp); + exp->checkEscapeRef(); +@@ -4039,7 +3960,7 @@ Statement *ReturnStatement::semantic(Sco + if (fd->returnLabel && tbret->ty != Tvoid) + { + fd->buildResultVar(); +- VarExp *v = new VarExp(0, fd->vresult); ++ VarExp *v = new VarExp(Loc(), fd->vresult); + + assert(eorg); + exp = new ConstructExp(loc, v, eorg); +@@ -4051,8 +3972,23 @@ Statement *ReturnStatement::semantic(Sco + if (sc->callSuper & CSXany_ctor && + !(sc->callSuper & (CSXthis_ctor | CSXsuper_ctor))) + error("return without calling constructor"); +- + sc->callSuper |= CSXreturn; ++ if (sc->fieldinit) ++ { ++ AggregateDeclaration *ad = fd->isAggregateMember2(); ++ assert(ad); ++ size_t dim = sc->fieldinit_dim; ++ for (size_t i = 0; i < dim; i++) ++ { ++ VarDeclaration *v = ad->fields[i]; ++ bool mustInit = (v->storage_class & STCnodefaultctor || ++ v->type->needsNested()); ++ if (mustInit && !(sc->fieldinit[i] & CSXthis_ctor)) ++ error("an earlier return statement skips field %s initialization", v->toChars()); ++ ++ sc->fieldinit[i] |= CSXreturn; ++ } ++ } + + // See if all returns are instead to be replaced with a goto returnLabel; + if (fd->returnLabel) +@@ -4064,7 +4000,7 @@ Statement *ReturnStatement::semantic(Sco + { /* Replace: return exp; + * with: exp; goto returnLabel; + */ +- Statement *s = new ExpStatement(0, exp); ++ Statement *s = new ExpStatement(Loc(), exp); + return new CompoundStatement(loc, s, gs); + } + return gs; +@@ -4072,19 +4008,20 @@ Statement *ReturnStatement::semantic(Sco + + if (exp && tbret->ty == Tvoid && !implicit0) + { ++ if (exp->type->ty != Tvoid) ++ { ++ error("cannot return non-void from void function"); ++ } ++ + /* Replace: + * return exp; + * with: +- * exp; return; ++ * cast(void)exp; return; + */ +- Statement *s = new ExpStatement(loc, exp); ++ Expression *ce = new CastExp(loc, exp, Type::tvoid); ++ Statement *s = new ExpStatement(loc, ce); + s = s->semantic(sc); + +- if (exp->type->ty != Tvoid) +- { +- error("cannot return non-void from void function"); +- } +- + exp = NULL; + return new CompoundStatement(loc, s, this); + } +@@ -4133,13 +4070,10 @@ Statement *BreakStatement::semantic(Scop + { + ident = fixupLabelName(sc, ident); + +- Scope *scx; + FuncDeclaration *thisfunc = sc->func; + +- for (scx = sc; scx; scx = scx->enclosing) ++ for (Scope *scx = sc; scx; scx = scx->enclosing) + { +- LabelStatement *ls; +- + if (scx->func != thisfunc) // if in enclosing function + { + if (sc->fes) // if this is the body of a foreach +@@ -4151,38 +4085,40 @@ Statement *BreakStatement::semantic(Scop + * Case numbers start with 2, not 0, as 0 is continue + * and 1 is break. + */ +- Statement *s; + sc->fes->cases->push(this); +- s = new ReturnStatement(0, new IntegerExp(sc->fes->cases->dim + 1)); ++ Statement *s = new ReturnStatement(Loc(), new IntegerExp(sc->fes->cases->dim + 1)); + return s; + } + break; // can't break to it + } + +- ls = scx->slabel; ++ LabelStatement *ls = scx->slabel; + if (ls && ls->ident == ident) + { + Statement *s = ls->statement; + + if (!s->hasBreak()) + error("label '%s' has no break", ident->toChars()); +- if (ls->tf != sc->tf) ++ else if (ls->tf != sc->tf) + error("cannot break out of finally block"); +- return this; ++ else ++ return this; ++ return new ErrorStatement(); + } + } + error("enclosing label '%s' for break not found", ident->toChars()); ++ return new ErrorStatement(); + } + else if (!sc->sbreak) + { + if (sc->fes) +- { Statement *s; +- ++ { + // Replace break; with return 1; +- s = new ReturnStatement(0, new IntegerExp(1)); ++ Statement *s = new ReturnStatement(Loc(), new IntegerExp(1)); + return s; + } + error("break is not inside a loop or switch"); ++ return new ErrorStatement(); + } + return this; + } +@@ -4243,7 +4179,7 @@ Statement *ContinueStatement::semantic(S + if (ls && ls->ident == ident && ls->statement == sc->fes) + { + // Replace continue ident; with return 0; +- return new ReturnStatement(0, new IntegerExp(0)); ++ return new ReturnStatement(Loc(), new IntegerExp(0)); + } + } + +@@ -4254,9 +4190,8 @@ Statement *ContinueStatement::semantic(S + * Case numbers start with 2, not 0, as 0 is continue + * and 1 is break. + */ +- Statement *s; + sc->fes->cases->push(this); +- s = new ReturnStatement(0, new IntegerExp(sc->fes->cases->dim + 1)); ++ Statement *s = new ReturnStatement(Loc(), new IntegerExp(sc->fes->cases->dim + 1)); + return s; + } + break; // can't continue to it +@@ -4269,20 +4204,22 @@ Statement *ContinueStatement::semantic(S + + if (!s->hasContinue()) + error("label '%s' has no continue", ident->toChars()); +- if (ls->tf != sc->tf) ++ else if (ls->tf != sc->tf) + error("cannot continue out of finally block"); +- return this; ++ else ++ return this; ++ return new ErrorStatement(); + } + } + error("enclosing label '%s' for continue not found", ident->toChars()); ++ return new ErrorStatement(); + } + else if (!sc->scontinue) + { + if (sc->fes) +- { Statement *s; +- ++ { + // Replace continue; with return 0; +- s = new ReturnStatement(0, new IntegerExp(0)); ++ Statement *s = new ReturnStatement(Loc(), new IntegerExp(0)); + return s; + } + error("continue is not inside a loop"); +@@ -4342,7 +4279,10 @@ Statement *SynchronizedStatement::semant + goto Lbody; + ClassDeclaration *cd = exp->type->isClassHandle(); + if (!cd) ++ { + error("can only synchronize on class objects, not '%s'", exp->type->toChars()); ++ return new ErrorStatement(); ++ } + else if (cd->isInterfaceDeclaration()) + { /* Cast the interface to an object, as the object has the monitor, + * not the interface. +@@ -4354,7 +4294,7 @@ Statement *SynchronizedStatement::semant + } + + Type *t = ClassDeclaration::object->type; +- t = t->semantic(0, sc)->toBasetype(); ++ t = t->semantic(Loc(), sc)->toBasetype(); + assert(t->ty == Tclass); + + exp = new CastExp(loc, exp, t); +@@ -4374,12 +4314,15 @@ Statement *SynchronizedStatement::semant + Statements *cs = new Statements(); + cs->push(new ExpStatement(loc, tmp)); + +- FuncDeclaration *fdenter = FuncDeclaration::genCfunc(Type::tvoid, Id::monitorenter); ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, ClassDeclaration::object->type, NULL, NULL)); ++ ++ FuncDeclaration *fdenter = FuncDeclaration::genCfunc(args, Type::tvoid, Id::monitorenter); + Expression *e = new CallExp(loc, new VarExp(loc, fdenter), new VarExp(loc, tmp)); + e->type = Type::tvoid; // do not run semantic on e + cs->push(new ExpStatement(loc, e)); + +- FuncDeclaration *fdexit = FuncDeclaration::genCfunc(Type::tvoid, Id::monitorexit); ++ FuncDeclaration *fdexit = FuncDeclaration::genCfunc(args, Type::tvoid, Id::monitorexit); + e = new CallExp(loc, new VarExp(loc, fdexit), new VarExp(loc, tmp)); + e->type = Type::tvoid; // do not run semantic on e + Statement *s = new ExpStatement(loc, e); +@@ -4405,14 +4348,17 @@ Statement *SynchronizedStatement::semant + Statements *cs = new Statements(); + cs->push(new ExpStatement(loc, tmp)); + +- FuncDeclaration *fdenter = FuncDeclaration::genCfunc(Type::tvoid, Id::criticalenter); ++ Parameters* args = new Parameters; ++ args->push(new Parameter(STCin, t->pointerTo(), NULL, NULL)); ++ ++ FuncDeclaration *fdenter = FuncDeclaration::genCfunc(args, Type::tvoid, Id::criticalenter); + Expression *e = new DotIdExp(loc, new VarExp(loc, tmp), Id::ptr); + e = e->semantic(sc); + e = new CallExp(loc, new VarExp(loc, fdenter), e); + e->type = Type::tvoid; // do not run semantic on e + cs->push(new ExpStatement(loc, e)); + +- FuncDeclaration *fdexit = FuncDeclaration::genCfunc(Type::tvoid, Id::criticalexit); ++ FuncDeclaration *fdexit = FuncDeclaration::genCfunc(args, Type::tvoid, Id::criticalexit); + e = new DotIdExp(loc, new VarExp(loc, tmp), Id::ptr); + e = e->semantic(sc); + e = new CallExp(loc, new VarExp(loc, fdexit), e); +@@ -4428,6 +4374,8 @@ Statement *SynchronizedStatement::semant + Lbody: + if (body) + body = body->semantic(sc); ++ if (body && body->isErrorStatement()) ++ return body; + return this; + } + +@@ -4441,11 +4389,6 @@ bool SynchronizedStatement::hasContinue( + return FALSE; //TRUE; + } + +-bool SynchronizedStatement::usesEH() +-{ +- return TRUE; +-} +- + int SynchronizedStatement::blockExit(bool mustNotThrow) + { + return body ? body->blockExit(mustNotThrow) : BEfallthru; +@@ -4491,7 +4434,7 @@ Statement *WithStatement::semantic(Scope + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); + if (exp->op == TOKerror) +- return NULL; ++ return new ErrorStatement(); + if (exp->op == TOKimport) + { ScopeExp *es = (ScopeExp *)exp; + +@@ -4504,13 +4447,21 @@ Statement *WithStatement::semantic(Scope + sym = s ? s->isScopeDsymbol() : NULL; + if (!sym) + { error("with type %s has no members", es->toChars()); +- if (body) +- body = body->semantic(sc); +- return this; ++ return new ErrorStatement(); + } + } + else +- { Type *t = exp->type; ++ { ++ Type *t = exp->type; ++ t = t->toBasetype(); ++ ++ Expression *olde = exp; ++ if (t->ty == Tpointer) ++ { ++ exp = new PtrExp(loc, exp); ++ exp = exp->semantic(sc); ++ t = exp->type->toBasetype(); ++ } + + assert(t); + t = t->toBasetype(); +@@ -4537,19 +4488,25 @@ Statement *WithStatement::semantic(Scope + wthis = new VarDeclaration(loc, e->type, Id::withSym, init); + wthis->semantic(sc); + sym = new WithScopeSymbol(this); ++ // Need to set the scope to make use of resolveAliasThis ++ sym->setScope(sc); + sym->parent = sc->scopesym; + } + else +- { error("with expressions must be aggregate types, not '%s'", exp->type->toChars()); +- return NULL; ++ { ++ error("with expressions must be aggregate types or pointers to them, not '%s'", olde->type->toChars()); ++ return new ErrorStatement(); + } + } +- sc = sc->push(sym); + + if (body) ++ { ++ sc = sc->push(sym); + body = body->semantic(sc); +- +- sc->pop(); ++ sc->pop(); ++ if (body && body->isErrorStatement()) ++ return body; ++ } + + return this; + } +@@ -4564,11 +4521,6 @@ void WithStatement::toCBuffer(OutBuffer + body->toCBuffer(buf, hgs); + } + +-bool WithStatement::usesEH() +-{ +- return body ? body->usesEH() : 0; +-} +- + int WithStatement::blockExit(bool mustNotThrow) + { + int result = BEnone; +@@ -4608,12 +4560,20 @@ Statement *TryCatchStatement::syntaxCopy + Statement *TryCatchStatement::semantic(Scope *sc) + { + body = body->semanticScope(sc, NULL /*this*/, NULL); ++#ifdef IN_GCC ++ assert(body); ++#endif + + /* Even if body is NULL, still do semantic analysis on catches + */ ++ bool catchErrors = false; + for (size_t i = 0; i < catches->dim; i++) + { Catch *c = (*catches)[i]; + c->semantic(sc); ++ if (c->type->ty == Terror) ++ { catchErrors = true; ++ continue; ++ } + + // Determine if current catch 'hides' any previous catches + for (size_t j = 0; j < i; j++) +@@ -4622,27 +4582,25 @@ Statement *TryCatchStatement::semantic(S + char *sj = cj->loc.toChars(); + + if (c->type->toBasetype()->implicitConvTo(cj->type->toBasetype())) +- error("catch at %s hides catch at %s", sj, si); +- } +- } +- +-#ifdef IN_GCC +- if (!body || body->isEmpty()) +- { +- for (size_t i = 0; i < catches->dim; i++) +- { +- Catch *c = (*catches)[i]; +- if (!c->handler || !c->handler->comeFrom()) + { +- catches->remove(i); +- --i; ++ error("catch at %s hides catch at %s", sj, si); ++ catchErrors = true; + } + } +- if (catches->dim == 0) +- return NULL; + } +-#else +- if (!body || body->isEmpty()) ++ if (catchErrors) ++ return new ErrorStatement(); ++ ++#ifndef IN_GCC ++ if (!body) ++ return NULL; ++#endif ++ ++ if (body->isErrorStatement()) ++ return body; ++ ++#ifndef IN_GCC ++ if (!body->hasCode()) + { + return NULL; + } +@@ -4668,8 +4626,13 @@ Statement *TryCatchStatement::semantic(S + } + } + ++#ifdef IN_GCC ++ if (catches->dim == 0) ++ return (body->hasCode()) ? body : NULL; ++#else + if (catches->dim == 0) + return body; ++#endif + + return this; + } +@@ -4679,11 +4642,6 @@ bool TryCatchStatement::hasBreak() + return FALSE; + } + +-bool TryCatchStatement::usesEH() +-{ +- return TRUE; +-} +- + int TryCatchStatement::blockExit(bool mustNotThrow) + { + assert(body); +@@ -4701,7 +4659,11 @@ int TryCatchStatement::blockExit(bool mu + /* If we're catching Object, then there is no throwing + */ + Identifier *id = c->type->toBasetype()->isClassHandle()->ident; +- if (id == Id::Object || id == Id::Throwable || id == Id::Exception) ++ if (id == Id::Object || id == Id::Throwable) ++ { ++ result &= ~(BEthrow | BEerrthrow); ++ } ++ if (id == Id::Exception) + { + result &= ~BEthrow; + } +@@ -4752,9 +4714,6 @@ Catch *Catch::syntaxCopy() + + void Catch::semantic(Scope *sc) + { +- if (type && type->deco) +- return; +- + //printf("Catch::semantic(%s)\n", ident->toChars()); + + #ifndef IN_GCC +@@ -4775,7 +4734,7 @@ void Catch::semantic(Scope *sc) + sc = sc->push(sym); + + if (!type) +- type = new TypeIdentifier(0, Id::Throwable); ++ type = new TypeIdentifier(Loc(), Id::Throwable); + type = type->semantic(loc, sc); + ClassDeclaration *cd = type->toBasetype()->isClassHandle(); + if (!cd || ((cd != ClassDeclaration::throwable) && !ClassDeclaration::throwable->isBaseOf(cd, NULL))) +@@ -4798,7 +4757,7 @@ void Catch::semantic(Scope *sc) + else if (ident) + { + var = new VarDeclaration(loc, type, ident, NULL); +- var->parent = sc->parent; ++ var->semantic(sc); + sc->insert(var); + } + handler = handler->semantic(sc); +@@ -4899,11 +4858,6 @@ bool TryFinallyStatement::hasContinue() + return FALSE; //TRUE; + } + +-bool TryFinallyStatement::usesEH() +-{ +- return TRUE; +-} +- + int TryFinallyStatement::blockExit(bool mustNotThrow) + { + int result = BEfallthru; +@@ -4955,11 +4909,6 @@ void OnScopeStatement::toCBuffer(OutBuff + statement->toCBuffer(buf, hgs); + } + +-bool OnScopeStatement::usesEH() +-{ +- return 1; +-} +- + Statement *OnScopeStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) + { + //printf("OnScopeStatement::scopeCode()\n"); +@@ -4986,17 +4935,17 @@ Statement *OnScopeStatement::scopeCode(S + */ + Identifier *id = Lexer::uniqueId("__os"); + +- ExpInitializer *ie = new ExpInitializer(loc, new IntegerExp(0, 0, Type::tbool)); ++ ExpInitializer *ie = new ExpInitializer(loc, new IntegerExp(Loc(), 0, Type::tbool)); + VarDeclaration *v = new VarDeclaration(loc, Type::tbool, id, ie); + *sentry = new ExpStatement(loc, v); + +- Expression *e = new IntegerExp(0, 1, Type::tbool); +- e = new AssignExp(0, new VarExp(0, v), e); +- *sexception = new ExpStatement(0, e); +- +- e = new VarExp(0, v); +- e = new NotExp(0, e); +- *sfinally = new IfStatement(0, NULL, e, statement, NULL); ++ Expression *e = new IntegerExp(Loc(), 1, Type::tbool); ++ e = new AssignExp(Loc(), new VarExp(Loc(), v), e); ++ *sexception = new ExpStatement(Loc(), e); ++ ++ e = new VarExp(Loc(), v); ++ e = new NotExp(Loc(), e); ++ *sfinally = new IfStatement(Loc(), NULL, e, statement, NULL); + + break; + } +@@ -5038,10 +4987,13 @@ Statement *ThrowStatement::semantic(Scop + exp = exp->semantic(sc); + exp = resolveProperties(sc, exp); + if (exp->op == TOKerror) +- return this; ++ return new ErrorStatement(); + ClassDeclaration *cd = exp->type->toBasetype()->isClassHandle(); + if (!cd || ((cd != ClassDeclaration::throwable) && !ClassDeclaration::throwable->isBaseOf(cd, NULL))) ++ { + error("can only throw class objects derived from Throwable, not type %s", exp->type->toChars()); ++ return new ErrorStatement(); ++ } + + return this; + } +@@ -5049,18 +5001,19 @@ Statement *ThrowStatement::semantic(Scop + int ThrowStatement::blockExit(bool mustNotThrow) + { + Type *t = exp->type->toBasetype(); +- if (mustNotThrow && t->ty != Terror) +- { +- ClassDeclaration *cd = t->isClassHandle(); +- assert(cd); ++ ClassDeclaration *cd = t->isClassHandle(); ++ assert(cd); + +- // Bugzilla 8675 +- // Throwing Errors is allowed even if mustNotThrow +- if (!internalThrow && +- cd != ClassDeclaration::errorException && +- !ClassDeclaration::errorException->isBaseOf(cd, NULL)) +- error("%s is thrown but not caught", exp->type->toChars()); ++ if (cd == ClassDeclaration::errorException || ++ ClassDeclaration::errorException->isBaseOf(cd, NULL)) ++ { ++ return BEerrthrow; + } ++ // Bugzilla 8675 ++ // Throwing Errors is allowed even if mustNotThrow ++ if (!internalThrow && mustNotThrow) ++ error("%s is thrown but not caught", exp->type->toChars()); ++ + return BEthrow; + } + +@@ -5165,7 +5118,10 @@ Statement *GotoStatement::semantic(Scope + return s; + } + if (label->statement && label->statement->tf != sc->tf) ++ { + error("cannot goto in or out of finally block"); ++ return new ErrorStatement(); ++ } + return this; + } + +@@ -5192,6 +5148,7 @@ LabelStatement::LabelStatement(Loc loc, + this->ident = ident; + this->statement = statement; + this->tf = NULL; ++ this->gotoTarget = NULL; + this->lblock = NULL; + this->fwdrefs = NULL; + } +@@ -5211,13 +5168,22 @@ Statement *LabelStatement::semantic(Scop + + ls = fd->searchLabel(ident); + if (ls->statement) ++ { + error("Label '%s' already defined", ls->toChars()); ++ return new ErrorStatement(); ++ } + else + ls->statement = this; + tf = sc->tf; + sc = sc->push(); + sc->scopesym = sc->enclosing->scopesym; + sc->callSuper |= CSXlabel; ++ if (sc->fieldinit) ++ { ++ size_t dim = sc->fieldinit_dim; ++ for (size_t i = 0; i < dim; i++) ++ sc->fieldinit[i] |= CSXlabel; ++ } + sc->slabel = this; + if (statement) + statement = statement->semanticNoScope(sc); +@@ -5249,11 +5215,6 @@ Statements *LabelStatement::flatten(Scop + } + + +-bool LabelStatement::usesEH() +-{ +- return statement ? statement->usesEH() : FALSE; +-} +- + int LabelStatement::blockExit(bool mustNotThrow) + { + //printf("LabelStatement::blockExit(%p)\n", this); +@@ -5261,12 +5222,6 @@ int LabelStatement::blockExit(bool mustN + } + + +-int LabelStatement::comeFrom() +-{ +- //printf("LabelStatement::comeFrom()\n"); +- return TRUE; +-} +- + void LabelStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + buf->writestring(ident->toChars()); +@@ -5310,12 +5265,6 @@ Statement *AsmStatement::syntaxCopy() + } + + +- +-int AsmStatement::comeFrom() +-{ +- return TRUE; +-} +- + int AsmStatement::blockExit(bool mustNotThrow) + { + if (mustNotThrow) +@@ -5388,6 +5337,7 @@ Statement *ImportStatement::semantic(Sco + + TypeIdentifier *tname = new TypeIdentifier(s->loc, name); + AliasDeclaration *ad = new AliasDeclaration(s->loc, alias, tname); ++ ad->import = s; + + s->aliasdecls.push(ad); + } +@@ -5409,11 +5359,6 @@ int ImportStatement::blockExit(bool must + return BEfallthru; + } + +-int ImportStatement::isEmpty() +-{ +- return TRUE; +-} +- + void ImportStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) + { + for (size_t i = 0; i < imports->dim; i++) +--- a/src/gcc/d/dfrontend/statement.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/statement.h 2014-04-01 16:32:51.000000000 +0100 +@@ -23,36 +23,40 @@ + + struct OutBuffer; + struct Scope; +-struct Expression; +-struct LabelDsymbol; +-struct Identifier; +-struct IfStatement; +-struct ExpStatement; +-struct DefaultStatement; +-struct VarDeclaration; +-struct Condition; +-struct Module; ++class Expression; ++class LabelDsymbol; ++class Identifier; ++class IfStatement; ++class ExpStatement; ++class DefaultStatement; ++class VarDeclaration; ++class Condition; ++class Module; + struct Token; + struct InlineCostState; + struct InlineDoState; + struct InlineScanState; +-struct ReturnStatement; +-struct CompoundStatement; +-struct Parameter; +-struct StaticAssert; +-struct AsmStatement; +-struct GotoStatement; +-struct ScopeStatement; +-struct TryCatchStatement; +-struct TryFinallyStatement; +-struct CaseStatement; +-struct DefaultStatement; +-struct LabelStatement; ++class ErrorStatement; ++class ReturnStatement; ++class CompoundStatement; ++class Parameter; ++class StaticAssert; ++class AsmStatement; ++class GotoStatement; ++class ScopeStatement; ++class TryCatchStatement; ++class TryFinallyStatement; ++class CaseStatement; ++class DefaultStatement; ++class LabelStatement; + struct HdrGenState; + struct InterState; ++struct CompiledCtfeFunction; + + enum TOK; + ++typedef bool (*sapply_fp_t)(Statement *, void *); ++ + // Back end + struct IRState; + struct Blockx; +@@ -77,11 +81,13 @@ enum BE + BEhalt = 0x10, + BEbreak = 0x20, + BEcontinue = 0x40, ++ BEerrthrow = 0x80, + BEany = (BEfallthru | BEthrow | BEreturn | BEgoto | BEhalt), + }; + +-struct Statement : Object ++class Statement : public RootObject + { ++public: + Loc loc; + + Statement(Loc loc); +@@ -94,20 +100,24 @@ struct Statement : Object + void warning(const char *format, ...); + void deprecation(const char *format, ...); + virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- virtual ScopeStatement *isScopeStatement() { return NULL; } + virtual Statement *semantic(Scope *sc); + Statement *semanticScope(Scope *sc, Statement *sbreak, Statement *scontinue); + Statement *semanticNoScope(Scope *sc); + virtual Statement *getRelatedLabeled() { return this; } + virtual bool hasBreak(); + virtual bool hasContinue(); +- virtual bool usesEH(); ++ bool usesEH(); ++ virtual bool usesEHimpl(); + virtual int blockExit(bool mustNotThrow); +- virtual int comeFrom(); +- virtual int isEmpty(); ++ bool comeFrom(); ++ virtual bool comeFromImpl(); ++ bool hasCode(); ++ virtual bool hasCodeImpl(); + virtual Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally); + virtual Statements *flatten(Scope *sc); + virtual Expression *interpret(InterState *istate); ++ virtual bool apply(sapply_fp_t fp, void *param); ++ virtual void ctfeCompile(CompiledCtfeFunction *ccf); + virtual Statement *last(); + + virtual int inlineCost(InlineCostState *ics); +@@ -119,6 +129,8 @@ struct Statement : Object + virtual void toIR(IRState *irs); + + // Avoid dynamic_cast ++ virtual ErrorStatement *isErrorStatement() { return NULL; } ++ virtual ScopeStatement *isScopeStatement() { return NULL; } + virtual ExpStatement *isExpStatement() { return NULL; } + virtual CompoundStatement *isCompoundStatement() { return NULL; } + virtual ReturnStatement *isReturnStatement() { return NULL; } +@@ -128,16 +140,33 @@ struct Statement : Object + virtual LabelStatement *isLabelStatement() { return NULL; } + }; + +-struct PeelStatement : Statement ++/** Any Statement that fails semantic() or has a component that is an ErrorExp or ++ * a TypeError should return an ErrorStatement from semantic(). ++ */ ++class ErrorStatement : public Statement + { ++public: ++ ErrorStatement(); ++ Statement *syntaxCopy(); ++ Statement *semantic(Scope *sc); ++ int blockExit(bool mustNotThrow); ++ ++ ErrorStatement *isErrorStatement() { return this; } ++}; ++ ++class PeelStatement : public Statement ++{ ++public: + Statement *s; + + PeelStatement(Statement *s); + Statement *semantic(Scope *sc); ++ bool apply(sapply_fp_t fp, void *param); + }; + +-struct ExpStatement : Statement ++class ExpStatement : public Statement + { ++public: + Expression *exp; + + ExpStatement(Loc loc, Expression *exp); +@@ -146,8 +175,9 @@ struct ExpStatement : Statement + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + int blockExit(bool mustNotThrow); +- int isEmpty(); ++ bool hasCodeImpl(); + Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally); + + int inlineCost(InlineCostState *ics); +@@ -160,8 +190,9 @@ struct ExpStatement : Statement + ExpStatement *isExpStatement() { return this; } + }; + +-struct DtorExpStatement : ExpStatement ++class DtorExpStatement : public ExpStatement + { ++public: + /* Wraps an expression that is the destruction of 'var' + */ + +@@ -172,8 +203,9 @@ struct DtorExpStatement : ExpStatement + void toIR(IRState *irs); + }; + +-struct CompileStatement : Statement ++class CompileStatement : public Statement + { ++public: + Expression *exp; + + CompileStatement(Loc loc, Expression *exp); +@@ -184,8 +216,9 @@ struct CompileStatement : Statement + int blockExit(bool mustNotThrow); + }; + +-struct CompoundStatement : Statement ++class CompoundStatement : public Statement + { ++public: + Statements *statements; + + CompoundStatement(Loc loc, Statements *s); +@@ -194,13 +227,13 @@ struct CompoundStatement : Statement + Statement *syntaxCopy(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Statement *semantic(Scope *sc); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); +- int isEmpty(); ++ bool hasCodeImpl(); + Statements *flatten(Scope *sc); + ReturnStatement *isReturnStatement(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + Statement *last(); + + int inlineCost(InlineCostState *ics); +@@ -213,8 +246,9 @@ struct CompoundStatement : Statement + CompoundStatement *isCompoundStatement() { return this; } + }; + +-struct CompoundDeclarationStatement : CompoundStatement ++class CompoundDeclarationStatement : public CompoundStatement + { ++public: + CompoundDeclarationStatement(Loc loc, Statements *s); + Statement *syntaxCopy(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -223,8 +257,9 @@ struct CompoundDeclarationStatement : Co + /* The purpose of this is so that continue will go to the next + * of the statements, and break will go to the end of the statements. + */ +-struct UnrolledLoopStatement : Statement ++class UnrolledLoopStatement : public Statement + { ++public: + Statements *statements; + + UnrolledLoopStatement(Loc loc, Statements *statements); +@@ -232,10 +267,10 @@ struct UnrolledLoopStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + int inlineCost(InlineCostState *ics); +@@ -246,8 +281,9 @@ struct UnrolledLoopStatement : Statement + void toIR(IRState *irs); + }; + +-struct ScopeStatement : Statement ++class ScopeStatement : public Statement + { ++public: + Statement *statement; + + ScopeStatement(Loc loc, Statement *s); +@@ -257,11 +293,11 @@ struct ScopeStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); +- int isEmpty(); ++ bool hasCodeImpl(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + int inlineCost(InlineCostState *ics); + Expression *doInline(InlineDoState *ids); +@@ -271,8 +307,9 @@ struct ScopeStatement : Statement + void toIR(IRState *irs); + }; + +-struct WhileStatement : Statement ++class WhileStatement : public Statement + { ++public: + Expression *condition; + Statement *body; + +@@ -281,10 +318,10 @@ struct WhileStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -292,8 +329,9 @@ struct WhileStatement : Statement + void toIR(IRState *irs); + }; + +-struct DoStatement : Statement ++class DoStatement : public Statement + { ++public: + Statement *body; + Expression *condition; + +@@ -302,10 +340,10 @@ struct DoStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -313,13 +351,13 @@ struct DoStatement : Statement + void toIR(IRState *irs); + }; + +-struct ForStatement : Statement ++class ForStatement : public Statement + { ++public: + Statement *init; + Expression *condition; + Expression *increment; + Statement *body; +- int nest; + + // When wrapped in try/finally clauses, this points to the outermost one, + // which may have an associated label. Internal break/continue statements +@@ -328,16 +366,15 @@ struct ForStatement : Statement + + ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body); + Statement *syntaxCopy(); +- Statement *semanticInit(Scope *sc); + Statement *semantic(Scope *sc); + Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally); + Statement *getRelatedLabeled() { return relatedLabeled ? relatedLabeled : this; } + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + int inlineCost(InlineCostState *ics); +@@ -347,9 +384,10 @@ struct ForStatement : Statement + void toIR(IRState *irs); + }; + +-struct ForeachStatement : Statement ++class ForeachStatement : public Statement + { +- enum TOK op; // TOKforeach or TOKforeach_reverse ++public: ++ TOK op; // TOKforeach or TOKforeach_reverse + Parameters *arguments; // array of Parameter*'s + Expression *aggr; + Statement *body; +@@ -362,7 +400,7 @@ struct ForeachStatement : Statement + Statements *cases; // put breaks, continues, gotos and returns here + CompoundStatements *gotos; // forward referenced goto's go here + +- ForeachStatement(Loc loc, enum TOK op, Parameters *arguments, Expression *aggr, Statement *body); ++ ForeachStatement(Loc loc, TOK op, Parameters *arguments, Expression *aggr, Statement *body); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + bool checkForArgTypes(); +@@ -370,10 +408,10 @@ struct ForeachStatement : Statement + int inferApplyArgTypes(Scope *sc, Dsymbol *&sapply); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -382,9 +420,10 @@ struct ForeachStatement : Statement + }; + + #if DMDV2 +-struct ForeachRangeStatement : Statement ++class ForeachRangeStatement : public Statement + { +- enum TOK op; // TOKforeach or TOKforeach_reverse ++public: ++ TOK op; // TOKforeach or TOKforeach_reverse + Parameter *arg; // loop index variable + Expression *lwr; + Expression *upr; +@@ -392,16 +431,16 @@ struct ForeachRangeStatement : Statement + + VarDeclaration *key; + +- ForeachRangeStatement(Loc loc, enum TOK op, Parameter *arg, ++ ForeachRangeStatement(Loc loc, TOK op, Parameter *arg, + Expression *lwr, Expression *upr, Statement *body); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -410,8 +449,9 @@ struct ForeachRangeStatement : Statement + }; + #endif + +-struct IfStatement : Statement ++class IfStatement : public Statement + { ++public: + Parameter *arg; + Expression *condition; + Statement *ifbody; +@@ -423,8 +463,9 @@ struct IfStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- bool usesEH(); + int blockExit(bool mustNotThrow); + IfStatement *isIfStatement() { return this; } + +@@ -436,8 +477,9 @@ struct IfStatement : Statement + void toIR(IRState *irs); + }; + +-struct ConditionalStatement : Statement ++class ConditionalStatement : public Statement + { ++public: + Condition *condition; + Statement *ifbody; + Statement *elsebody; +@@ -446,14 +488,15 @@ struct ConditionalStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Statements *flatten(Scope *sc); +- bool usesEH(); + int blockExit(bool mustNotThrow); ++ bool apply(sapply_fp_t fp, void *param); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct PragmaStatement : Statement ++class PragmaStatement : public Statement + { ++public: + Identifier *ident; + Expressions *args; // array of Expression's + Statement *body; +@@ -461,16 +504,17 @@ struct PragmaStatement : Statement + PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); +- bool usesEH(); + int blockExit(bool mustNotThrow); ++ bool apply(sapply_fp_t fp, void *param); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + void toIR(IRState *irs); + }; + +-struct StaticAssertStatement : Statement ++class StaticAssertStatement : public Statement + { ++public: + StaticAssert *sa; + + StaticAssertStatement(StaticAssert *sa); +@@ -481,8 +525,9 @@ struct StaticAssertStatement : Statement + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct SwitchStatement : Statement ++class SwitchStatement : public Statement + { ++public: + Expression *condition; + Statement *body; + bool isFinal; +@@ -498,9 +543,10 @@ struct SwitchStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + bool hasBreak(); +- bool usesEH(); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -508,8 +554,9 @@ struct SwitchStatement : Statement + void toIR(IRState *irs); + }; + +-struct CaseStatement : Statement ++class CaseStatement : public Statement + { ++public: + Expression *exp; + Statement *statement; + +@@ -519,11 +566,12 @@ struct CaseStatement : Statement + CaseStatement(Loc loc, Expression *exp, Statement *s); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); +- int compare(Object *obj); +- bool usesEH(); ++ int compare(RootObject *obj); + int blockExit(bool mustNotThrow); +- int comeFrom(); ++ bool comeFromImpl(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + CaseStatement *isCaseStatement() { return this; } + +@@ -534,8 +582,9 @@ struct CaseStatement : Statement + + #if DMDV2 + +-struct CaseRangeStatement : Statement ++class CaseRangeStatement : public Statement + { ++public: + Expression *first; + Expression *last; + Statement *statement; +@@ -543,13 +592,15 @@ struct CaseRangeStatement : Statement + CaseRangeStatement(Loc loc, Expression *first, Expression *last, Statement *s); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); ++ bool apply(sapply_fp_t fp, void *param); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + + #endif + +-struct DefaultStatement : Statement ++class DefaultStatement : public Statement + { ++public: + Statement *statement; + #ifdef IN_GCC + block *cblock; // back end: label for the block +@@ -558,10 +609,11 @@ struct DefaultStatement : Statement + DefaultStatement(Loc loc, Statement *s); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); ++ bool comeFromImpl(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + DefaultStatement *isDefaultStatement() { return this; } + +@@ -570,22 +622,25 @@ struct DefaultStatement : Statement + void toIR(IRState *irs); + }; + +-struct GotoDefaultStatement : Statement ++class GotoDefaultStatement : public Statement + { ++public: + SwitchStatement *sw; + + GotoDefaultStatement(Loc loc); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + void toIR(IRState *irs); + }; + +-struct GotoCaseStatement : Statement ++class GotoCaseStatement : public Statement + { ++public: + Expression *exp; // NULL, or which case to goto + CaseStatement *cs; // case statement it resolves to + +@@ -593,23 +648,27 @@ struct GotoCaseStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + void toIR(IRState *irs); + }; + +-struct SwitchErrorStatement : Statement ++class SwitchErrorStatement : public Statement + { ++public: + SwitchErrorStatement(Loc loc); + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toIR(IRState *irs); + }; + +-struct ReturnStatement : Statement ++class ReturnStatement : public Statement + { ++public: + Expression *exp; + bool implicit0; // this is an implicit "return 0;" + +@@ -619,6 +678,7 @@ struct ReturnStatement : Statement + Statement *semantic(Scope *sc); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + int inlineCost(InlineCostState *ics); + Expression *doInline(InlineDoState *ids); +@@ -630,36 +690,41 @@ struct ReturnStatement : Statement + ReturnStatement *isReturnStatement() { return this; } + }; + +-struct BreakStatement : Statement ++class BreakStatement : public Statement + { ++public: + Identifier *ident; + + BreakStatement(Loc loc, Identifier *ident); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + void toIR(IRState *irs); + }; + +-struct ContinueStatement : Statement ++class ContinueStatement : public Statement + { ++public: + Identifier *ident; + + ContinueStatement(Loc loc, Identifier *ident); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + void toIR(IRState *irs); + }; + +-struct SynchronizedStatement : Statement ++class SynchronizedStatement : public Statement + { ++public: + Expression *exp; + Statement *body; + +@@ -668,8 +733,9 @@ struct SynchronizedStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); ++ bool usesEHimpl(); + int blockExit(bool mustNotThrow); ++ bool apply(sapply_fp_t fp, void *param); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -680,8 +746,9 @@ struct SynchronizedStatement : Statement + void toIR(IRState *irs); + }; + +-struct WithStatement : Statement ++class WithStatement : public Statement + { ++public: + Expression *exp; + Statement *body; + VarDeclaration *wthis; +@@ -690,17 +757,19 @@ struct WithStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- bool usesEH(); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + Statement *inlineScan(InlineScanState *iss); + + void toIR(IRState *irs); + }; + +-struct TryCatchStatement : Statement ++class TryCatchStatement : public Statement + { ++public: + Statement *body; + Catches *catches; + +@@ -708,9 +777,11 @@ struct TryCatchStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + bool hasBreak(); +- bool usesEH(); ++ bool usesEHimpl(); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + Statement *inlineScan(InlineScanState *iss); + +@@ -718,8 +789,9 @@ struct TryCatchStatement : Statement + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct Catch : Object ++class Catch : public RootObject + { ++public: + Loc loc; + Type *type; + Identifier *ident; +@@ -735,8 +807,9 @@ struct Catch : Object + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct TryFinallyStatement : Statement ++class TryFinallyStatement : public Statement + { ++public: + Statement *body; + Statement *finalbody; + +@@ -746,17 +819,20 @@ struct TryFinallyStatement : Statement + Statement *semantic(Scope *sc); + bool hasBreak(); + bool hasContinue(); +- bool usesEH(); ++ bool usesEHimpl(); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + Statement *inlineScan(InlineScanState *iss); + + void toIR(IRState *irs); + }; + +-struct OnScopeStatement : Statement ++class OnScopeStatement : public Statement + { ++public: + TOK tok; + Statement *statement; + +@@ -765,15 +841,18 @@ struct OnScopeStatement : Statement + int blockExit(bool mustNotThrow); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + Statement *semantic(Scope *sc); +- bool usesEH(); ++ bool usesEHimpl(); + Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toIR(IRState *irs); + }; + +-struct ThrowStatement : Statement ++class ThrowStatement : public Statement + { ++public: + Expression *exp; + bool internalThrow; // was generated by the compiler, + // wasn't present in source code +@@ -784,25 +863,29 @@ struct ThrowStatement : Statement + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + Statement *inlineScan(InlineScanState *iss); + + void toIR(IRState *irs); + }; + +-struct DebugStatement : Statement ++class DebugStatement : public Statement + { ++public: + Statement *statement; + + DebugStatement(Loc loc, Statement *statement); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Statements *flatten(Scope *sc); ++ bool apply(sapply_fp_t fp, void *param); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct GotoStatement : Statement ++class GotoStatement : public Statement + { ++public: + Identifier *ident; + LabelDsymbol *label; + TryFinallyStatement *tf; +@@ -812,16 +895,19 @@ struct GotoStatement : Statement + Statement *semantic(Scope *sc); + int blockExit(bool mustNotThrow); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toIR(IRState *irs); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + }; + +-struct LabelStatement : Statement ++class LabelStatement : public Statement + { ++public: + Identifier *ident; + Statement *statement; + TryFinallyStatement *tf; ++ Statement *gotoTarget; // interpret + block *lblock; // back end + + Blocks *fwdrefs; // forward references to this LabelStatement +@@ -830,10 +916,11 @@ struct LabelStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + Statements *flatten(Scope *sc); +- bool usesEH(); + int blockExit(bool mustNotThrow); +- int comeFrom(); ++ bool comeFromImpl(); + Expression *interpret(InterState *istate); ++ bool apply(sapply_fp_t fp, void *param); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + + Statement *inlineScan(InlineScanState *iss); +@@ -842,16 +929,18 @@ struct LabelStatement : Statement + void toIR(IRState *irs); + }; + +-struct LabelDsymbol : Dsymbol ++class LabelDsymbol : public Dsymbol + { ++public: + LabelStatement *statement; + + LabelDsymbol(Identifier *ident); + LabelDsymbol *isLabel(); + }; + +-struct AsmStatement : Statement ++class AsmStatement : public Statement + { ++public: + Token *tokens; + code *asmcode; + unsigned asmalign; // alignment of this statement +@@ -863,8 +952,9 @@ struct AsmStatement : Statement + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + int blockExit(bool mustNotThrow); +- int comeFrom(); ++ bool comeFromImpl(); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +@@ -875,16 +965,18 @@ struct AsmStatement : Statement + void toIR(IRState *irs); + }; + +-struct ImportStatement : Statement ++class ImportStatement : public Statement + { ++public: + Dsymbols *imports; // Array of Import's + + ImportStatement(Loc loc, Dsymbols *imports); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + int blockExit(bool mustNotThrow); +- int isEmpty(); ++ bool hasCodeImpl(); + Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +@@ -898,22 +990,25 @@ struct ImportStatement : Statement + #ifdef IN_GCC + + // Assembler instructions with D expression operands +-struct ExtAsmStatement : Statement ++class ExtAsmStatement : public Statement + { ++public: + Expression *insn; + Expressions *args; + Identifiers *names; // of NULL or Identifier* + Expressions *constraints; // of StringExp* + unsigned outputargs; + Expressions *clobbers; // of StringExp* +- Dsymbols *labels; // of LabelDsymbol* + +- ExtAsmStatement(Loc loc, Expression *insn, Expressions *args, Identifiers *names, +- Expressions *constraints, int outputargs, Expressions *clobbers, Dsymbols *labels); ++ ExtAsmStatement(Loc loc, Expression *insn, Expressions *args, ++ Identifiers *names, Expressions *constraints, ++ int outputargs, Expressions *clobbers); + Statement *syntaxCopy(); + Statement *semantic(Scope *sc); + int blockExit(bool mustNotThrow); +- int comeFrom(); ++ bool comeFromImpl(); ++ Expression *interpret(InterState *istate); ++ void ctfeCompile(CompiledCtfeFunction *ccf); + + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + +--- a/src/gcc/d/dfrontend/staticassert.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/staticassert.c 2014-04-01 16:32:51.000000000 +0100 +@@ -55,9 +55,16 @@ void StaticAssert::semantic2(Scope *sc) + ScopeDsymbol *sd = new ScopeDsymbol(); + sc = sc->push(sd); + sc->flags |= SCOPEstaticassert; ++ ++ sc = sc->startCTFE(); + Expression *e = exp->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); + sc = sc->pop(); ++ ++ // Simplify expression, to make error messages nicer if CTFE fails ++ e = e->optimize(0); ++ + if (!e->type->checkBoolean()) + { + if (e->type->toBasetype() != Type::terror) +@@ -73,11 +80,14 @@ void StaticAssert::semantic2(Scope *sc) + else if (e->isBool(FALSE)) + { + if (msg) +- { HdrGenState hgs; ++ { ++ HdrGenState hgs; + OutBuffer buf; + ++ sc = sc->startCTFE(); + msg = msg->semantic(sc); + msg = resolveProperties(sc, msg); ++ sc = sc->endCTFE(); + msg = msg->ctfeInterpret(); + hgs.console = 1; + StringExp * s = msg->toString(); +@@ -101,11 +111,11 @@ void StaticAssert::semantic2(Scope *sc) + } + } + +-int StaticAssert::oneMember(Dsymbol **ps, Identifier *ident) ++bool StaticAssert::oneMember(Dsymbol **ps, Identifier *ident) + { + //printf("StaticAssert::oneMember())\n"); + *ps = NULL; +- return TRUE; ++ return true; + } + + void StaticAssert::inlineScan() +@@ -128,7 +138,7 @@ void StaticAssert::toCBuffer(OutBuffer * + exp->toCBuffer(buf, hgs); + if (msg) + { +- buf->writeByte(','); ++ buf->writestring(", "); + msg->toCBuffer(buf, hgs); + } + buf->writestring(");"); +--- a/src/gcc/d/dfrontend/staticassert.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/staticassert.h 2014-04-01 16:32:51.000000000 +0100 +@@ -17,11 +17,12 @@ + + #include "dsymbol.h" + +-struct Expression; ++class Expression; + struct HdrGenState; + +-struct StaticAssert : Dsymbol ++class StaticAssert : public Dsymbol + { ++public: + Expression *exp; + Expression *msg; + +@@ -32,7 +33,7 @@ struct StaticAssert : Dsymbol + void semantic(Scope *sc); + void semantic2(Scope *sc); + void inlineScan(); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + void toObjFile(int multiobj); + const char *kind(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +--- a/src/gcc/d/dfrontend/stringtable.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/stringtable.c 2014-04-01 16:32:51.000000000 +0100 +@@ -22,6 +22,13 @@ hash_t calcHash(const char *str, size_t + { + hash_t hash = 0; + ++ union ++ { ++ uint8_t scratchB[4]; ++ uint16_t scratchS[2]; ++ uint32_t scratchI; ++ }; ++ + while (1) + { + switch (len) +@@ -36,18 +43,26 @@ hash_t calcHash(const char *str, size_t + + case 2: + hash *= 37; +- hash += *(const uint16_t *)str; ++ scratchB[0] = str[0]; ++ scratchB[1] = str[1]; ++ hash += scratchS[0]; + return hash; + + case 3: + hash *= 37; +- hash += (*(const uint16_t *)str << 8) + ++ scratchB[0] = str[0]; ++ scratchB[1] = str[1]; ++ hash += (scratchS[0] << 8) + + ((const uint8_t *)str)[2]; + return hash; + + default: + hash *= 37; +- hash += *(const uint32_t *)str; ++ scratchB[0] = str[0]; ++ scratchB[1] = str[1]; ++ scratchB[2] = str[2]; ++ scratchB[3] = str[3]; ++ hash += scratchI; + str += 4; + len -= 4; + break; +@@ -62,7 +77,7 @@ void StringValue::ctor(const char *p, si + memcpy(this->lstring, p, length * sizeof(char)); + } + +-void StringTable::init(size_t size) ++void StringTable::_init(size_t size) + { + table = (void **)mem.calloc(size, sizeof(void *)); + tabledim = size; +--- a/src/gcc/d/dfrontend/stringtable.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/stringtable.h 2014-04-01 16:32:51.000000000 +0100 +@@ -24,11 +24,7 @@ struct StringEntry; + // method because the only thing which should be creating these is StringTable. + struct StringValue + { +- union +- { +- void *ptrvalue; +- char *string; +- }; ++ void *ptrvalue; + private: + size_t length; + +@@ -57,7 +53,7 @@ private: + size_t tabledim; + + public: +- void init(size_t size = 37); ++ void _init(size_t size = 37); + ~StringTable(); + + StringValue *lookup(const char *s, size_t len); +--- a/src/gcc/d/dfrontend/struct.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/struct.c 2014-04-01 16:32:51.000000000 +0100 +@@ -22,6 +22,75 @@ + #include "template.h" + + FuncDeclaration *StructDeclaration::xerreq; // object.xopEquals ++FuncDeclaration *StructDeclaration::xerrcmp; // object.xopCmp ++ ++bool inNonRoot(Dsymbol *s) ++{ ++ if (!s || !s->parent) ++ return false; ++ s = s->parent; ++ for (; s; s = s->parent) ++ { ++ if (TemplateInstance *ti = s->isTemplateInstance()) ++ { ++ if (!ti->instantiatingModule || !ti->instantiatingModule->isRoot()) ++ return true; ++ return false; ++ } ++ else if (Module *m = s->isModule()) ++ { ++ if (!m->isRoot()) ++ return true; ++ break; ++ } ++ } ++ return false; ++} ++ ++/*************************************** ++ * Search toHash member function for TypeInfo_Struct. ++ * const hash_t toHash(); ++ */ ++FuncDeclaration *search_toHash(StructDeclaration *sd) ++{ ++ Dsymbol *s = search_function(sd, Id::tohash); ++ FuncDeclaration *fd = s ? s->isFuncDeclaration() : NULL; ++ if (fd) ++ { ++ static TypeFunction *tftohash; ++ if (!tftohash) ++ { ++ tftohash = new TypeFunction(NULL, Type::thash_t, 0, LINKd); ++ tftohash->mod = MODconst; ++ tftohash = (TypeFunction *)tftohash->merge(); ++ } ++ ++ fd = fd->overloadExactMatch(tftohash); ++ } ++ return fd; ++} ++ ++/*************************************** ++ * Search toString member function for TypeInfo_Struct. ++ * string toString(); ++ */ ++FuncDeclaration *search_toString(StructDeclaration *sd) ++{ ++ Dsymbol *s = search_function(sd, Id::tostring); ++ FuncDeclaration *fd = s ? s->isFuncDeclaration() : NULL; ++ if (fd) ++ { ++ static TypeFunction *tftostring; ++ if (!tftostring) ++ { ++ tftostring = new TypeFunction(NULL, Type::tstring, 0, LINKd); ++ tftostring = (TypeFunction *)tftostring->merge(); ++ } ++ ++ fd = fd->overloadExactMatch(tftostring); ++ } ++ return fd; ++} + + /********************************* AggregateDeclaration ****************************/ + +@@ -46,7 +115,7 @@ AggregateDeclaration::AggregateDeclarati + + stag = NULL; + sinit = NULL; +- isnested = false; ++ enclosing = NULL; + vthis = NULL; + + #if DMDV2 +@@ -59,7 +128,7 @@ AggregateDeclaration::AggregateDeclarati + getRTInfo = NULL; + } + +-enum PROT AggregateDeclaration::prot() ++PROT AggregateDeclaration::prot() + { + return protection; + } +@@ -81,6 +150,7 @@ void AggregateDeclaration::semantic2(Sco + if (members) + { + sc = sc->push(this); ++ sc->parent = this; + for (size_t i = 0; i < members->dim; i++) + { + Dsymbol *s = (*members)[i]; +@@ -96,16 +166,24 @@ void AggregateDeclaration::semantic3(Sco + //printf("AggregateDeclaration::semantic3(%s)\n", toChars()); + if (members) + { ++ StructDeclaration *sd = isStructDeclaration(); ++ if (!sc) // from runDeferredSemantic3 for TypeInfo generation ++ goto Lxop; ++ + sc = sc->push(this); ++ sc->parent = this; + for (size_t i = 0; i < members->dim; i++) + { + Dsymbol *s = (*members)[i]; + s->semantic3(sc); + } +- sc->pop(); ++ sc = sc->pop(); + +- if (!getRTInfo) +- { // Evaluate: gcinfo!type ++ if (!getRTInfo && Type::rtinfo && ++ (!isDeprecated() || global.params.useDeprecated) && // don't do it for unused deprecated types ++ (type && type->ty != Terror)) // or error types ++ { ++ // Evaluate: RTinfo!type + Objects *tiargs = new Objects(); + tiargs->push(type); + TemplateInstance *ti = new TemplateInstance(loc, Type::rtinfo, tiargs); +@@ -113,11 +191,56 @@ void AggregateDeclaration::semantic3(Sco + ti->semantic2(sc); + ti->semantic3(sc); + Dsymbol *s = ti->toAlias(); +- Expression *e = new DsymbolExp(0, s, 0); +- e = e->semantic(ti->tempdecl->scope); ++ Expression *e = new DsymbolExp(Loc(), s, 0); ++ ++ Scope *sc2 = ti->tempdecl->scope->startCTFE(); ++ sc2->instantiatingModule = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ e = e->semantic(sc2); ++ sc2->endCTFE(); ++ + e = e->ctfeInterpret(); + getRTInfo = e; + } ++ ++ if (sd) ++ { ++ Lxop: ++ if (sd->xeq && ++ sd->xeq->scope && ++ sd->xeq->semanticRun < PASSsemantic3done) ++ { ++ unsigned errors = global.startGagging(); ++ sd->xeq->semantic3(sd->xeq->scope); ++ if (global.endGagging(errors)) ++ sd->xeq = sd->xerreq; ++ } ++ ++ if (sd->xcmp && ++ sd->xcmp->scope && ++ sd->xcmp->semanticRun < PASSsemantic3done) ++ { ++ unsigned errors = global.startGagging(); ++ sd->xcmp->semantic3(sd->xcmp->scope); ++ if (global.endGagging(errors)) ++ sd->xcmp = sd->xerrcmp; ++ } ++ ++ FuncDeclaration *ftostr = search_toString(sd); ++ if (ftostr && ++ ftostr->scope && ++ ftostr->semanticRun < PASSsemantic3done) ++ { ++ ftostr->semantic3(ftostr->scope); ++ } ++ ++ FuncDeclaration *ftohash = search_toHash(sd); ++ if (ftohash && ++ ftohash->scope && ++ ftohash->semanticRun < PASSsemantic3done) ++ { ++ ftohash->semantic3(ftohash->scope); ++ } ++ } + } + } + +@@ -140,8 +263,6 @@ unsigned AggregateDeclaration::size(Loc + //printf("AggregateDeclaration::size() %s, scope = %p\n", toChars(), scope); + if (loc.linnum == 0) + loc = this->loc; +- if (!members) +- error(loc, "unknown size"); + if (sizeok != SIZEOKdone && scope) + semantic(NULL); + +@@ -166,7 +287,7 @@ unsigned AggregateDeclaration::size(Loc + v->semantic(NULL); + if (v->storage_class & (STCstatic | STCextern | STCtls | STCgshared | STCmanifest | STCctfe | STCtemplateparameter)) + return 0; +- if (v->storage_class & STCfield && v->sem >= SemanticDone) ++ if (v->isField() && v->sem >= SemanticDone) + return 0; + return 1; + } +@@ -185,8 +306,13 @@ unsigned AggregateDeclaration::size(Loc + L1: ; + } + +- if (sizeok != SIZEOKdone) +- { error(loc, "no size yet for forward reference"); ++ if (!members) ++ { ++ error(loc, "unknown size"); ++ } ++ else if (sizeok != SIZEOKdone) ++ { ++ error(loc, "no size yet for forward reference"); + //*(char*)0=0; + } + return structsize; +@@ -197,12 +323,12 @@ Type *AggregateDeclaration::getType() + return type; + } + +-int AggregateDeclaration::isDeprecated() ++bool AggregateDeclaration::isDeprecated() + { + return isdeprecated; + } + +-int AggregateDeclaration::isExport() ++bool AggregateDeclaration::isExport() + { + return protection == PROTexport; + } +@@ -220,11 +346,11 @@ void AggregateDeclaration::alignmember( + //printf("alignment = %d, size = %d, offset = %d\n",alignment,size,offset); + switch (alignment) + { +- case 1: ++ case (structalign_t) 1: + // No alignment + break; + +- case STRUCTALIGN_DEFAULT: ++ case (structalign_t) STRUCTALIGN_DEFAULT: + { /* Must match what the corresponding C compiler's default + * alignment behavior is. + */ +@@ -287,14 +413,68 @@ unsigned AggregateDeclaration::placeFiel + + + /**************************************** +- * Returns !=0 if there's an extra member which is the 'this' ++ * Returns true if there's an extra member which is the 'this' + * pointer to the enclosing context (enclosing aggregate or function) + */ + +-int AggregateDeclaration::isNested() ++bool AggregateDeclaration::isNested() + { +- assert((isnested & ~1) == 0); +- return isnested; ++ return enclosing != NULL; ++} ++ ++void AggregateDeclaration::makeNested() ++{ ++ if (!enclosing && sizeok != SIZEOKdone && !isUnionDeclaration() && !isInterfaceDeclaration()) ++ { ++ // If nested struct, add in hidden 'this' pointer to outer scope ++ if (!(storage_class & STCstatic)) ++ { ++ Dsymbol *s = toParent2(); ++ if (s) ++ { ++ AggregateDeclaration *ad = s->isAggregateDeclaration(); ++ FuncDeclaration *fd = s->isFuncDeclaration(); ++ ++ if (fd) ++ { ++ enclosing = fd; ++ } ++ else if (isClassDeclaration() && ad && ad->isClassDeclaration()) ++ { ++ enclosing = ad; ++ } ++ else if (isStructDeclaration() && ad) ++ { ++ if (TemplateInstance *ti = ad->parent->isTemplateInstance()) ++ { ++ enclosing = ti->enclosing; ++ } ++ } ++ if (enclosing) ++ { ++ //printf("makeNested %s, enclosing = %s\n", toChars(), enclosing->toChars()); ++ Type *t; ++ if (ad) ++ t = ad->handle; ++ else if (fd) ++ { AggregateDeclaration *ad2 = fd->isMember2(); ++ if (ad2) ++ t = ad2->handle; ++ else ++ t = Type::tvoidptr; ++ } ++ else ++ assert(0); ++ if (t->ty == Tstruct) ++ t = Type::tvoidptr; // t should not be a ref type ++ assert(!vthis); ++ vthis = new ThisDeclaration(loc, t); ++ //vthis->storage_class |= STCref; ++ members->push(vthis); ++ } ++ } ++ } ++ } + } + + /**************************************** +@@ -349,6 +529,25 @@ int AggregateDeclaration::numFieldsInUni + return count; + } + ++/******************************************* ++ * Look for constructor declaration. ++ */ ++void AggregateDeclaration::searchCtor() ++{ ++ ctor = search(Loc(), Id::ctor, 0); ++ if (ctor) ++ { ++ if (!(ctor->isCtorDeclaration() || ++ ctor->isTemplateDeclaration() || ++ ctor->isOverloadSet())) ++ { ++ error("%s %s is not a constructor; identifiers starting with __ are reserved for the implementation", ctor->kind(), ctor->toChars()); ++ errors = true; ++ ctor = NULL; ++ } ++ } ++} ++ + /********************************* StructDeclaration ****************************/ + + StructDeclaration::StructDeclaration(Loc loc, Identifier *id) +@@ -362,6 +561,7 @@ StructDeclaration::StructDeclaration(Loc + postblit = NULL; + + xeq = NULL; ++ xcmp = NULL; + alignment = 0; + #endif + arg1type = NULL; +@@ -369,6 +569,19 @@ StructDeclaration::StructDeclaration(Loc + + // For forward references + type = new TypeStruct(this); ++ ++#if MODULEINFO_IS_STRUCT ++ #ifdef DMDV2 ++ if (id == Id::ModuleInfo && !Module::moduleinfo) ++ Module::moduleinfo = this; ++ #else ++ if (id == Id::ModuleInfo) ++ { if (Module::moduleinfo) ++ Module::moduleinfo->error("only object.d can define this reserved struct name"); ++ Module::moduleinfo = this; ++ } ++ #endif ++#endif + } + + Dsymbol *StructDeclaration::syntaxCopy(Dsymbol *s) +@@ -392,7 +605,7 @@ void StructDeclaration::semantic(Scope * + //static int count; if (++count == 20) halt(); + + assert(type); +- if (!members) // if forward reference ++ if (!members) // if opaque declaration + { + return; + } +@@ -409,14 +622,13 @@ void StructDeclaration::semantic(Scope * + + Scope *scx = NULL; + if (scope) +- { sc = scope; ++ { ++ sc = scope; + scx = scope; // save so we don't make redundant copies + scope = NULL; + } +- +- int errors = global.gaggedErrors; +- + unsigned dprogress_save = Module::dprogress; ++ int errors = global.errors; + + parent = sc->parent; + type = type->semantic(loc, sc); +@@ -456,15 +668,10 @@ void StructDeclaration::semantic(Scope * + * resolve individual members like enums. + */ + for (size_t i = 0; i < members->dim; i++) +- { Dsymbol *s = (*members)[i]; +- /* There are problems doing this in the general case because +- * Scope keeps track of things like 'offset' +- */ +- //if (s->isEnumDeclaration() || (s->isAggregateDeclaration() && s->ident)) +- { +- //printf("struct: setScope %s %s\n", s->kind(), s->toChars()); +- s->setScope(sc2); +- } ++ { ++ Dsymbol *s = (*members)[i]; ++ //printf("struct: setScope %s %s\n", s->kind(), s->toChars()); ++ s->setScope(sc2); + } + + for (size_t i = 0; i < members->dim; i++) +@@ -481,14 +688,10 @@ void StructDeclaration::semantic(Scope * + if (sizeok == SIZEOKnone && s->isAliasDeclaration()) + finalizeSize(sc2); + } ++ + // Ungag errors when not speculative +- unsigned oldgag = global.gag; +- if (global.isSpeculativeGagging() && !isSpeculative()) +- { +- global.gag = 0; +- } ++ Ungag ungag = ungagSpeculative(); + s->semantic(sc2); +- global.gag = oldgag; + } + finalizeSize(sc2); + +@@ -562,7 +765,7 @@ void StructDeclaration::semantic(Scope * + + arguments->push(arg); + tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd); +- tfeqptr = (TypeFunction *)tfeqptr->semantic(0, sc); ++ tfeqptr = (TypeFunction *)tfeqptr->semantic(Loc(), sc); + } + + TypeFunction *tfeq; +@@ -572,7 +775,7 @@ void StructDeclaration::semantic(Scope * + + arguments->push(arg); + tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd); +- tfeq = (TypeFunction *)tfeq->semantic(0, sc); ++ tfeq = (TypeFunction *)tfeq->semantic(Loc(), sc); + } + + Identifier *id = Id::eq; +@@ -611,22 +814,31 @@ void StructDeclaration::semantic(Scope * + postblit = buildPostBlit(sc2); + cpctor = buildCpCtor(sc2); + +- hasIdentityAssign = (buildOpAssign(sc2) != NULL); +- hasIdentityEquals = (buildOpEquals(sc2) != NULL); ++ buildOpAssign(sc2); ++ buildOpEquals(sc2); + + xeq = buildXopEquals(sc2); ++ xcmp = buildXopCmp(sc2); ++ ++ /* Even if the struct is merely imported and its semantic3 is not run, ++ * the TypeInfo object would be speculatively stored in each object ++ * files. To set correct function pointer, run semantic3 for xeq and xcmp. ++ */ ++ //if ((xeq && xeq != xerreq || xcmp && xcmp != xerrcmp) && isImportedSym(this)) ++ // Module::addDeferredSemantic3(this); ++ /* Defer requesting semantic3 until TypeInfo generation is actually invoked. ++ * See Type::getTypeInfo(). ++ */ + #endif ++ inv = buildInv(sc2); + + sc2->pop(); + + /* Look for special member functions. + */ +-#if DMDV2 +- ctor = search(0, Id::ctor, 0); +-#endif +- inv = (InvariantDeclaration *)search(0, Id::classInvariant, 0); +- aggNew = (NewDeclaration *)search(0, Id::classNew, 0); +- aggDelete = (DeleteDeclaration *)search(0, Id::classDelete, 0); ++ searchCtor(); ++ aggNew = (NewDeclaration *)search(Loc(), Id::classNew, 0); ++ aggDelete = (DeleteDeclaration *)search(Loc(), Id::classDelete, 0); + + TypeTuple *tup = type->toArgTypes(); + size_t dim = tup->arguments->dim; +@@ -643,9 +855,10 @@ void StructDeclaration::semantic(Scope * + semantic3(sc); + } + +- if (global.gag && global.gaggedErrors != errors) +- { // The type is no good, yet the error messages were gagged. ++ if (global.errors != errors) ++ { // The type is no good. + type = Type::terror; ++ this->errors = true; + } + + if (deferred && !global.gag) +@@ -653,6 +866,13 @@ void StructDeclaration::semantic(Scope * + deferred->semantic2(sc); + deferred->semantic3(sc); + } ++ ++ if (type->ty == Tstruct && ((TypeStruct *)type)->sym != this) ++ { ++ error("failed semantic analysis"); ++ this->errors = true; ++ type = Type::terror; ++ } + } + + Dsymbol *StructDeclaration::search(Loc loc, Identifier *ident, int flags) +@@ -662,7 +882,7 @@ Dsymbol *StructDeclaration::search(Loc l + if (scope && !symtab) + semantic(scope); + +- if (!members || !symtab) ++ if (!members || !symtab) // opaque or semantic() is not yet called + { + error("is forward referenced when looking for '%s'", ident->toChars()); + return NULL; +@@ -705,45 +925,6 @@ void StructDeclaration::finalizeSize(Sco + sizeok = SIZEOKdone; + } + +-void StructDeclaration::makeNested() +-{ +- if (!isnested && sizeok != SIZEOKdone && !isUnionDeclaration()) +- { +- // If nested struct, add in hidden 'this' pointer to outer scope +- if (!(storage_class & STCstatic)) +- { Dsymbol *s = toParent2(); +- if (s) +- { +- AggregateDeclaration *ad = s->isAggregateDeclaration(); +- FuncDeclaration *fd = s->isFuncDeclaration(); +- +- TemplateInstance *ti; +- if (ad && (ti = ad->parent->isTemplateInstance()) != NULL && ti->isnested || fd) +- { isnested = true; +- Type *t; +- if (ad) +- t = ad->handle; +- else if (fd) +- { AggregateDeclaration *ad = fd->isMember2(); +- if (ad) +- t = ad->handle; +- else +- t = Type::tvoidptr; +- } +- else +- assert(0); +- if (t->ty == Tstruct) +- t = Type::tvoidptr; // t should not be a ref type +- assert(!vthis); +- vthis = new ThisDeclaration(loc, t); +- //vthis->storage_class |= STCref; +- members->push(vthis); +- } +- } +- } +- } +-} +- + /*************************************** + * Return true if struct is POD (Plain Old Data). + * This is defined as: +@@ -758,7 +939,7 @@ void StructDeclaration::makeNested() + */ + bool StructDeclaration::isPOD() + { +- if (isnested || cpctor || postblit || ctor || dtor) ++ if (enclosing || cpctor || postblit || ctor || dtor) + return false; + + /* Recursively check any fields have a constructor. +@@ -768,16 +949,13 @@ bool StructDeclaration::isPOD() + { + Dsymbol *s = fields[i]; + VarDeclaration *v = s->isVarDeclaration(); +- assert(v && v->storage_class & STCfield); ++ assert(v && v->isField()); + if (v->storage_class & STCref) + continue; +- Type *tv = v->type->toBasetype(); +- while (tv->ty == Tsarray) +- { TypeSArray *ta = (TypeSArray *)tv; +- tv = tv->nextOf()->toBasetype(); +- } ++ Type *tv = v->type->baseElemOf(); + if (tv->ty == Tstruct) +- { TypeStruct *ts = (TypeStruct *)tv; ++ { ++ TypeStruct *ts = (TypeStruct *)tv; + StructDeclaration *sd = ts->sym; + if (!sd->isPOD()) + return false; +--- a/src/gcc/d/dfrontend/target.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/target.h 2014-04-01 16:32:51.000000000 +0100 +@@ -14,7 +14,7 @@ + // At present it is incomplete, but in future it should grow to contain + // most or all target machine and target O/S specific information. + +-struct Type; ++class Type; + + struct Target + { +@@ -22,7 +22,7 @@ struct Target + static int realsize; // size a real consumes in memory + static int realpad; // 'padding' added to the CPU real size to bring it up to realsize + static int realalignsize; // alignment for reals +- ++ + static void init(); + static unsigned alignsize(Type* type); + static unsigned fieldalign(Type* type); +--- a/src/gcc/d/dfrontend/template.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/template.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -32,28 +32,23 @@ + #include "identifier.h" + #include "hdrgen.h" + #include "id.h" +- +-#ifdef IN_GCC +-#include "d-dmd-gcc.h" +-#else +-#if WINDOWS_SEH +-#include +-long __cdecl __ehfilter(LPEXCEPTION_POINTERS ep); +-#endif +-#endif ++#include "attrib.h" + + #define LOG 0 + + #define IDX_NOTFOUND (0x12345678) // index is not found + + size_t templateParameterLookup(Type *tparam, TemplateParameters *parameters); ++int arrayObjectMatch(Objects *oa1, Objects *oa2); ++hash_t arrayObjectHash(Objects *oa1); ++int arrayCheckRecursiveExpansion(Objects *oa1, TemplateDeclaration *tempdecl, Scope *sc); + + /******************************************** + * These functions substitute for dynamic_cast. dynamic_cast does not work + * on earlier versions of gcc. + */ + +-Expression *isExpression(Object *o) ++Expression *isExpression(RootObject *o) + { + //return dynamic_cast(o); + if (!o || o->dyncast() != DYNCAST_EXPRESSION) +@@ -61,7 +56,7 @@ Expression *isExpression(Object *o) + return (Expression *)o; + } + +-Dsymbol *isDsymbol(Object *o) ++Dsymbol *isDsymbol(RootObject *o) + { + //return dynamic_cast(o); + if (!o || o->dyncast() != DYNCAST_DSYMBOL) +@@ -69,7 +64,7 @@ Dsymbol *isDsymbol(Object *o) + return (Dsymbol *)o; + } + +-Type *isType(Object *o) ++Type *isType(RootObject *o) + { + //return dynamic_cast(o); + if (!o || o->dyncast() != DYNCAST_TYPE) +@@ -77,7 +72,7 @@ Type *isType(Object *o) + return (Type *)o; + } + +-Tuple *isTuple(Object *o) ++Tuple *isTuple(RootObject *o) + { + //return dynamic_cast(o); + if (!o || o->dyncast() != DYNCAST_TUPLE) +@@ -85,7 +80,7 @@ Tuple *isTuple(Object *o) + return (Tuple *)o; + } + +-Parameter *isParameter(Object *o) ++Parameter *isParameter(RootObject *o) + { + //return dynamic_cast(o); + if (!o || o->dyncast() != DYNCAST_PARAMETER) +@@ -96,7 +91,7 @@ Parameter *isParameter(Object *o) + /************************************** + * Is this Object an error? + */ +-int isError(Object *o) ++int isError(RootObject *o) + { + Type *t = isType(o); + if (t) +@@ -107,6 +102,9 @@ int isError(Object *o) + Tuple *v = isTuple(o); + if (v) + return arrayObjectIsError(&v->objects); ++ Dsymbol *s = isDsymbol(o); ++ if (s->errors) ++ return 1; + return 0; + } + +@@ -117,7 +115,7 @@ int arrayObjectIsError(Objects *args) + { + for (size_t i = 0; i < args->dim; i++) + { +- Object *o = (*args)[i]; ++ RootObject *o = (*args)[i]; + if (isError(o)) + return 1; + } +@@ -128,7 +126,7 @@ int arrayObjectIsError(Objects *args) + * Try to get arg as a type. + */ + +-Type *getType(Object *o) ++Type *getType(RootObject *o) + { + Type *t = isType(o); + if (!t) +@@ -139,7 +137,7 @@ Type *getType(Object *o) + return t; + } + +-Dsymbol *getDsymbol(Object *oarg) ++Dsymbol *getDsymbol(RootObject *oarg) + { + //printf("getDsymbol()\n"); + //printf("e %p s %p t %p v %p\n", isExpression(oarg), isDsymbol(oarg), isType(oarg), isTuple(oarg)); +@@ -181,9 +179,8 @@ Expression *getValue(Expression *e) + { + VarDeclaration *v = ((VarExp *)e)->var->isVarDeclaration(); + if (v && v->storage_class & STCmanifest) +- { ExpInitializer *ei = v->init->isExpInitializer(); +- if (ei) +- e = ei->exp; ++ { ++ e = v->getConstInitializer(); + } + } + return e; +@@ -195,9 +192,8 @@ Expression *getValue(Dsymbol *&s) + { + VarDeclaration *v = s->isVarDeclaration(); + if (v && v->storage_class & STCmanifest) +- { ExpInitializer *ei = v->init->isExpInitializer(); +- if (ei) +- e = ei->exp, s = NULL; ++ { ++ e = v->getConstInitializer(); + } + } + return e; +@@ -208,7 +204,7 @@ Expression *getValue(Dsymbol *&s) + * Else, return 0. + */ + +-int match(Object *o1, Object *o2, TemplateDeclaration *tempdecl, Scope *sc) ++int match(RootObject *o1, RootObject *o2) + { + Type *t1 = isType(o1); + Type *t2 = isType(o2); +@@ -232,25 +228,6 @@ int match(Object *o1, Object *o2, Templa + + if (t1) + { +- /* if t1 is an instance of ti, then give error +- * about recursive expansions. +- */ +- Dsymbol *s = t1->toDsymbol(sc); +- if (s && s->parent) +- { TemplateInstance *ti1 = s->parent->isTemplateInstance(); +- if (ti1 && ti1->tempdecl == tempdecl) +- { +- for (Scope *sc1 = sc; sc1; sc1 = sc1->enclosing) +- { +- if (sc1->scopesym == ti1) +- { +- tempdecl->error("recursive template expansion for template argument %s", t1->toChars()); +- return 1; // fake a match +- } +- } +- } +- } +- + //printf("t1 = %s\n", t1->toChars()); + //printf("t2 = %s\n", t2->toChars()); + if (!t2 || !t1->equals(t2)) +@@ -273,22 +250,26 @@ int match(Object *o1, Object *o2, Templa + } + else if (s1) + { +- if (!s2 || !s1->equals(s2) || s1->parent != s2->parent) ++ if (s2) ++ { ++ if (!s1->equals(s2)) ++ goto Lnomatch; ++ if (s1->parent != s2->parent && ++ !s1->isFuncDeclaration() && ++ !s2->isFuncDeclaration()) ++ { ++ goto Lnomatch; ++ } ++ } ++ else + goto Lnomatch; + } + else if (u1) + { + if (!u2) + goto Lnomatch; +- if (u1->objects.dim != u2->objects.dim) ++ if (!arrayObjectMatch(&u1->objects, &u2->objects)) + goto Lnomatch; +- for (size_t i = 0; i < u1->objects.dim; i++) +- { +- if (!match(u1->objects[i], +- u2->objects[i], +- tempdecl, sc)) +- goto Lnomatch; +- } + } + //printf("match\n"); + return 1; // match +@@ -302,16 +283,16 @@ Lnomatch: + /************************************ + * Match an array of them. + */ +-int arrayObjectMatch(Objects *oa1, Objects *oa2, TemplateDeclaration *tempdecl, Scope *sc) ++int arrayObjectMatch(Objects *oa1, Objects *oa2) + { + if (oa1 == oa2) + return 1; + if (oa1->dim != oa2->dim) + return 0; + for (size_t j = 0; j < oa1->dim; j++) +- { Object *o1 = (*oa1)[j]; +- Object *o2 = (*oa2)[j]; +- if (!match(o1, o2, tempdecl, sc)) ++ { RootObject *o1 = (*oa1)[j]; ++ RootObject *o2 = (*oa2)[j]; ++ if (!match(o1, o2)) + { + return 0; + } +@@ -319,12 +300,105 @@ int arrayObjectMatch(Objects *oa1, Objec + return 1; + } + ++ ++/************************************ ++ * Return hash of Objects. ++ */ ++hash_t arrayObjectHash(Objects *oa1) ++{ ++ hash_t hash = 0; ++ for (size_t j = 0; j < oa1->dim; j++) ++ { /* Must follow the logic of match() ++ */ ++ RootObject *o1 = (*oa1)[j]; ++ if (Type *t1 = isType(o1)) ++ hash += (size_t)t1->deco; ++ else ++ { ++ Dsymbol *s1 = isDsymbol(o1); ++ Expression *e1 = s1 ? getValue(s1) : getValue(isExpression(o1)); ++ if (e1) ++ { ++ if (e1->op == TOKint64) ++ { ++ IntegerExp *ne = (IntegerExp *)e1; ++ hash += (size_t)ne->value; ++ } ++ } ++ else if (s1) ++ { ++ FuncAliasDeclaration *fa1 = s1->isFuncAliasDeclaration(); ++ if (fa1) ++ s1 = fa1->toAliasFunc(); ++ hash += (size_t)(void *)s1->getIdent() + (size_t)(void *)s1->parent; ++ } ++ else if (Tuple *u1 = isTuple(o1)) ++ hash += arrayObjectHash(&u1->objects); ++ } ++ } ++ return hash; ++} ++ ++ ++/****************************** ++ * Check template argument o1 to see if it is a recursive expansion of tempdecl in scope sc. ++ * If so, issue error and return 1. ++ */ ++ ++int checkRecursiveExpansion(RootObject *o1, TemplateDeclaration *tempdecl, Scope *sc) ++{ ++ if (Type *t1 = isType(o1)) ++ { ++ /* if t1 is an instance of ti, then give error ++ * about recursive expansions. ++ */ ++ Dsymbol *s = t1->toDsymbol(sc); ++ if (s && s->parent) ++ { ++ TemplateInstance *ti1 = s->parent->isTemplateInstance(); ++ if (ti1 && ti1->tempdecl == tempdecl) ++ { ++ for (Scope *sc1 = sc; sc1; sc1 = sc1->enclosing) ++ { ++ if (sc1->scopesym == ti1) ++ { ++ tempdecl->error("recursive template expansion for template argument %s", t1->toChars()); ++ return 1; ++ } ++ } ++ } ++ } ++ } ++ else if (Tuple *u1 = isTuple(o1)) ++ { ++ return arrayCheckRecursiveExpansion(&u1->objects, tempdecl, sc); ++ } ++ return 0; // no error ++} ++ ++ ++/************************************ ++ * Match an array of them. ++ */ ++int arrayCheckRecursiveExpansion(Objects *oa1, TemplateDeclaration *tempdecl, Scope *sc) ++{ ++ for (size_t j = 0; j < oa1->dim; j++) ++ { ++ RootObject *o1 = (*oa1)[j]; ++ if (checkRecursiveExpansion(o1, tempdecl, sc)) ++ return 1; ++ } ++ return 0; ++} ++ ++ ++ + /**************************************** + * This makes a 'pretty' version of the template arguments. + * It's analogous to genIdent() which makes a mangled version. + */ + +-void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg) ++void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, RootObject *oarg) + { + //printf("ObjectToCBuffer()\n"); + Type *t = isType(oarg); +@@ -357,8 +431,8 @@ void ObjectToCBuffer(OutBuffer *buf, Hdr + for (size_t i = 0; i < args->dim; i++) + { + if (i) +- buf->writeByte(','); +- Object *o = (*args)[i]; ++ buf->writestring(", "); ++ RootObject *o = (*args)[i]; + ObjectToCBuffer(buf, hgs, o); + } + } +@@ -376,7 +450,7 @@ void ObjectToCBuffer(OutBuffer *buf, Hdr + } + + #if DMDV2 +-Object *objectSyntaxCopy(Object *o) ++RootObject *objectSyntaxCopy(RootObject *o) + { + if (!o) + return NULL; +@@ -420,14 +494,17 @@ TemplateDeclaration::TemplateDeclaration + this->members = decldefs; + this->overnext = NULL; + this->overroot = NULL; +- this->semanticRun = PASSinit; ++ this->funcroot = NULL; + this->onemember = NULL; + this->literal = 0; + this->ismixin = ismixin; + this->previous = NULL; ++ this->protection = PROTundefined; ++ this->numinstances = 0; + + // Compute in advance for Ddoc's use +- if (members) ++ // Bugzilla 11153: ident could be NULL if parsing fails. ++ if (members && ident) + { + Dsymbol *s; + if (Dsymbol::oneMembers(members, &s, ident) && s) +@@ -470,7 +547,7 @@ void TemplateDeclaration::semantic(Scope + printf("sc->stc = %llx\n", sc->stc); + printf("sc->module = %s\n", sc->module->toChars()); + #endif +- if (semanticRun) ++ if (semanticRun != PASSinit) + return; // semantic() already run + semanticRun = PASSsemantic; + +@@ -525,7 +602,6 @@ void TemplateDeclaration::semantic(Scope + ScopeDsymbol *paramsym = new ScopeDsymbol(); + paramsym->parent = sc->parent; + Scope *paramscope = sc->push(paramsym); +- paramscope->parameterSpecialization = 1; + paramscope->stc = 0; + + if (!parent) +@@ -555,7 +631,7 @@ void TemplateDeclaration::semantic(Scope + { + TemplateParameter *tp = (*parameters)[i]; + +- tp->semantic(paramscope); ++ tp->semantic(paramscope, parameters); + if (i + 1 != parameters->dim && tp->isTemplateTupleParameter()) + { error("template tuple parameter must be last one"); + errors = true; +@@ -590,34 +666,42 @@ const char *TemplateDeclaration::kind() + + /********************************** + * Overload existing TemplateDeclaration 'this' with the new one 's'. +- * Return !=0 if successful; i.e. no conflict. ++ * Return true if successful; i.e. no conflict. + */ + +-int TemplateDeclaration::overloadInsert(Dsymbol *s) ++bool TemplateDeclaration::overloadInsert(Dsymbol *s) + { +- TemplateDeclaration **pf; +- TemplateDeclaration *f; +- + #if LOG + printf("TemplateDeclaration::overloadInsert('%s')\n", s->toChars()); + #endif +- f = s->isTemplateDeclaration(); +- if (!f) +- return FALSE; ++ FuncDeclaration *fd = s->isFuncDeclaration(); ++ if (fd) ++ { ++ if (funcroot) ++ return funcroot->overloadInsert(fd); ++ funcroot = fd; ++ return funcroot->overloadInsert(this); ++ } ++ ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (!td) ++ return false; ++ + TemplateDeclaration *pthis = this; +- for (pf = &pthis; *pf; pf = &(*pf)->overnext) ++ TemplateDeclaration **ptd; ++ for (ptd = &pthis; *ptd; ptd = &(*ptd)->overnext) + { + #if 0 + // Conflict if TemplateParameter's match + // Will get caught anyway later with TemplateInstance, but + // should check it now. +- TemplateDeclaration *f2 = *pf; ++ TemplateDeclaration *f2 = *ptd; + +- if (f->parameters->dim != f2->parameters->dim) ++ if (td->parameters->dim != f2->parameters->dim) + goto Lcontinue; + +- for (size_t i = 0; i < f->parameters->dim; i++) +- { TemplateParameter *p1 = (*f->parameters)[i]; ++ for (size_t i = 0; i < td->parameters->dim; i++) ++ { TemplateParameter *p1 = (*td->parameters)[i]; + TemplateParameter *p2 = (*f2->parameters)[i]; + + if (!p1->overloadMatch(p2)) +@@ -627,19 +711,19 @@ int TemplateDeclaration::overloadInsert( + #if LOG + printf("\tfalse: conflict\n"); + #endif +- return FALSE; ++ return false; + + Lcontinue: + ; + #endif + } + +- f->overroot = this; +- *pf = f; ++ td->overroot = this; ++ *ptd = td; + #if LOG + printf("\ttrue: no conflict\n"); + #endif +- return TRUE; ++ return true; + } + + /**************************** +@@ -678,9 +762,6 @@ void TemplateDeclaration::makeParamNames + { + Parameter *fparam = Parameter::getNth(fparameters, i); + // Remove addMod same as func.d L1065 of FuncDeclaration::semantic3 +- //Type *vtype = fparam->type; +- //if (fd->type && fd->isPure()) +- // vtype = vtype->addMod(MODconst); + fparam->storageClass &= (STCin | STCout | STCref | STClazy | STCfinal | STC_TYPECTOR | STCnodtor); + fparam->storageClass |= STCparameter; + if (fvarargs == 2 && i + 1 == nfparams) +@@ -714,7 +795,7 @@ void TemplateDeclaration::makeParamNames + * Return match level. + */ + +-MATCH TemplateDeclaration::matchWithInstance(TemplateInstance *ti, ++MATCH TemplateDeclaration::matchWithInstance(Scope *sc, TemplateInstance *ti, + Objects *dedtypes, Expressions *fargs, int flag) + { MATCH m; + size_t dedtypes_dim = dedtypes->dim; +@@ -752,16 +833,20 @@ MATCH TemplateDeclaration::matchWithInst + assert(dedtypes_dim >= ti->tiargs->dim || variadic); + + // Set up scope for parameters +- assert((size_t)scope > 0x10000); ++ assert(scope); + ScopeDsymbol *paramsym = new ScopeDsymbol(); + paramsym->parent = scope->parent; + Scope *paramscope = scope->push(paramsym); ++ Module *mi = ti->instantiatingModule ? ti->instantiatingModule : sc->instantiatingModule; ++ paramscope->instantiatingModule = mi; ++ paramscope->callsc = sc; + paramscope->stc = 0; + + // Attempt type deduction + m = MATCHexact; + for (size_t i = 0; i < dedtypes_dim; i++) +- { MATCH m2; ++ { ++ MATCH m2; + TemplateParameter *tp = (*parameters)[i]; + Declaration *sparam; + +@@ -773,7 +858,7 @@ MATCH TemplateDeclaration::matchWithInst + printf("\tparameter[%d] is %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : ""); + #endif + +- m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam); ++ m2 = tp->matchArg(ti->loc, paramscope, ti->tiargs, i, parameters, dedtypes, &sparam); + //printf("\tm2 = %d\n", m2); + + if (m2 == MATCHnomatch) +@@ -789,8 +874,9 @@ MATCH TemplateDeclaration::matchWithInst + + if (!flag) + sparam->semantic(paramscope); +- if (!paramscope->insert(sparam)) +- goto Lnomatch; ++ if (!paramscope->insert(sparam)) // TODO: This check can make more early ++ goto Lnomatch; // in TemplateDeclaration::semantic, and ++ // then we don't need to make sparam if flags == 0 + } + + if (!flag) +@@ -809,19 +895,48 @@ MATCH TemplateDeclaration::matchWithInst + + #if DMDV2 + if (m && constraint && !flag) +- { /* Check to see if constraint is satisfied. ++ { ++ /* Check to see if constraint is satisfied. + */ + makeParamNamesVisibleInConstraint(paramscope, fargs); + Expression *e = constraint->syntaxCopy(); +- Scope *sc = paramscope->push(); + + /* There's a chicken-and-egg problem here. We don't know yet if this template +- * instantiation will be a local one (isnested is set), and we won't know until ++ * instantiation will be a local one (enclosing is set), and we won't know until + * after selecting the correct template. Thus, function we're nesting inside + * is not on the sc scope chain, and this can cause errors in FuncDeclaration::getLevel(). + * Workaround the problem by setting a flag to relax the checking on frame errors. + */ +- sc->flags |= SCOPEstaticif; ++ ++ int nmatches = 0; ++ for (Previous *p = previous; p; p = p->prev) ++ { ++ if (arrayCheckRecursiveExpansion(p->dedargs, this, sc)) ++ goto Lnomatch; ++ ++ if (arrayObjectMatch(p->dedargs, dedtypes)) ++ { ++ //printf("recursive, no match p->sc=%p %p %s\n", p->sc, this, this->toChars()); ++ /* It must be a subscope of p->sc, other scope chains are not recursive ++ * instantiations. ++ */ ++ for (Scope *scx = sc; scx; scx = scx->enclosing) ++ { ++ if (scx == p->sc) ++ goto Lnomatch; ++ } ++ } ++ /* BUG: should also check for ref param differences ++ */ ++ } ++ ++ Previous pr; ++ pr.prev = previous; ++ pr.sc = paramscope; ++ pr.dedargs = dedtypes; ++ previous = ≺ // add this to threaded list ++ ++ int nerrors = global.errors; + + FuncDeclaration *fd = onemember && onemember->toAlias() ? + onemember->toAlias()->isFuncDeclaration() : NULL; +@@ -836,14 +951,22 @@ MATCH TemplateDeclaration::matchWithInst + fd->vthis = fd->declareThis(paramscope, ad); + } + +- e = e->semantic(sc); +- if (e->op == TOKerror) +- goto Lnomatch; ++ Scope *scx = paramscope->startCTFE(); ++ scx->flags |= SCOPEstaticif; ++ e = e->semantic(scx); ++ e = resolveProperties(scx, e); ++ scx = scx->endCTFE(); + + if (fd && fd->vthis) + fd->vthis = vthissave; + +- sc->pop(); ++ previous = pr.prev; // unlink from threaded list ++ ++ if (nerrors != global.errors) // if any errors from evaluating the constraint, no match ++ goto Lnomatch; ++ if (e->op == TOKerror) ++ goto Lnomatch; ++ + e = e->ctfeInterpret(); + if (e->isBool(TRUE)) + ; +@@ -866,7 +989,7 @@ MATCH TemplateDeclaration::matchWithInst + for (size_t i = 0; i < dedtypes_dim; i++) + { + TemplateParameter *tp = (*parameters)[i]; +- Object *oarg; ++ RootObject *oarg; + + printf(" [%d]", i); + +@@ -907,7 +1030,7 @@ Lret: + * 0 td2 is more specialized than this + */ + +-MATCH TemplateDeclaration::leastAsSpecialized(TemplateDeclaration *td2, Expressions *fargs) ++MATCH TemplateDeclaration::leastAsSpecialized(Scope *sc, TemplateDeclaration *td2, Expressions *fargs) + { + /* This works by taking the template parameters to this template + * declaration and feeding them to td2 as if it were a template +@@ -916,7 +1039,7 @@ MATCH TemplateDeclaration::leastAsSpecia + * as td2. + */ + +- TemplateInstance ti(0, ident); // create dummy template instance ++ TemplateInstance ti(Loc(), ident); // create dummy template instance + Objects dedtypes; + + #define LOG_LEASTAS 0 +@@ -933,7 +1056,7 @@ MATCH TemplateDeclaration::leastAsSpecia + { + TemplateParameter *tp = (*parameters)[i]; + +- Object *p = (Object *)tp->dummyArg(); ++ RootObject *p = (RootObject *)tp->dummyArg(); + if (p) + (*ti.tiargs)[i] = p; + else +@@ -945,7 +1068,7 @@ MATCH TemplateDeclaration::leastAsSpecia + dedtypes.setDim(td2->parameters->dim); + + // Attempt a type deduction +- MATCH m = td2->matchWithInstance(&ti, &dedtypes, fargs, 1); ++ MATCH m = td2->matchWithInstance(sc, &ti, &dedtypes, fargs, 1); + if (m) + { + /* A non-variadic template is more specialized than a +@@ -971,8 +1094,9 @@ MATCH TemplateDeclaration::leastAsSpecia + * Match function arguments against a specific template function. + * Input: + * loc instantiation location +- * targsi Expression/Type initial list of template arguments +- * ethis 'this' argument if !NULL ++ * sc instantiation scope ++ * tiargs Expression/Type initial list of template arguments ++ * tthis 'this' argument if !NULL + * fargs arguments to function + * Output: + * dedargs Expression/Type deduced template arguments +@@ -982,18 +1106,18 @@ MATCH TemplateDeclaration::leastAsSpecia + * bit 4-7 Match template parameters by initial template arguments + */ + +-MATCH TemplateDeclaration::deduceFunctionTemplateMatch(Scope *sc, Loc loc, Objects *targsi, +- Expression *ethis, Expressions *fargs, ++MATCH TemplateDeclaration::deduceFunctionTemplateMatch(FuncDeclaration *f, Loc loc, Scope *sc, Objects *tiargs, ++ Type *tthis, Expressions *fargs, + Objects *dedargs) + { + size_t nfparams; + size_t nfargs; +- size_t nargsi; // array size of targsi ++ size_t ntargs; // array size of tiargs + size_t fptupindex = IDX_NOTFOUND; + size_t tuple_dim = 0; + MATCH match = MATCHexact; +- MATCH matchTargsi = MATCHexact; +- FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration(); ++ MATCH matchTiargs = MATCHexact; ++ FuncDeclaration *fd = f; + Parameters *fparameters; // function parameter list + int fvarargs; // function varargs + Objects dedtypes; // for T:T*, the dedargs is the T*, dedtypes is the T +@@ -1004,17 +1128,17 @@ MATCH TemplateDeclaration::deduceFunctio + + #if 0 + printf("\nTemplateDeclaration::deduceFunctionTemplateMatch() %s\n", toChars()); +- for (size_t i = 0; i < fargs->dim; i++) ++ for (size_t i = 0; i < (fargs ? fargs->dim : 0); i++) + { Expression *e = (*fargs)[i]; + printf("\tfarg[%d] is %s, type is %s\n", i, e->toChars(), e->type->toChars()); + } + printf("fd = %s\n", fd->toChars()); + printf("fd->type = %s\n", fd->type->toChars()); +- if (ethis) +- printf("ethis->type = %s\n", ethis->type->toChars()); ++ if (tthis) ++ printf("tthis = %s\n", tthis->toChars()); + #endif + +- assert((size_t)scope > 0x10000); ++ assert(scope); + + dedargs->setDim(parameters->dim); + dedargs->zero(); +@@ -1029,31 +1153,38 @@ MATCH TemplateDeclaration::deduceFunctio + ScopeDsymbol *paramsym = new ScopeDsymbol(); + paramsym->parent = scope->parent; + Scope *paramscope = scope->push(paramsym); ++ ++ paramscope->instantiatingModule = sc->instantiatingModule; ++ Module *mi = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ if (!sc->instantiatingModule || sc->instantiatingModule->isRoot()) ++ paramscope->instantiatingModule = mi; ++ ++ paramscope->callsc = sc; + paramscope->stc = 0; + + TemplateTupleParameter *tp = isVariadic(); +- int tp_is_declared = 0; ++ bool tp_is_declared = false; + + #if 0 + for (size_t i = 0; i < dedargs->dim; i++) + { + printf("\tdedarg[%d] = ", i); +- Object *oarg = (*dedargs)[i]; ++ RootObject *oarg = (*dedargs)[i]; + if (oarg) printf("%s", oarg->toChars()); + printf("\n"); + } + #endif + + +- nargsi = 0; +- if (targsi) ++ ntargs = 0; ++ if (tiargs) + { // Set initial template arguments + +- nargsi = targsi->dim; ++ ntargs = tiargs->dim; + size_t n = parameters->dim; + if (tp) + n--; +- if (nargsi > n) ++ if (ntargs > n) + { if (!tp) + goto Lnomatch; + +@@ -1064,19 +1195,19 @@ MATCH TemplateDeclaration::deduceFunctio + assert(parameters->dim); + (*dedargs)[parameters->dim - 1] = t; + +- tuple_dim = nargsi - n; ++ tuple_dim = ntargs - n; + t->objects.setDim(tuple_dim); + for (size_t i = 0; i < tuple_dim; i++) + { +- t->objects[i] = (*targsi)[n + i]; ++ t->objects[i] = (*tiargs)[n + i]; + } + declareParameter(paramscope, tp, t); +- tp_is_declared = 1; ++ tp_is_declared = true; + } + else +- n = nargsi; ++ n = ntargs; + +- memcpy(dedargs->tdata(), targsi->tdata(), n * sizeof(*dedargs->tdata())); ++ memcpy(dedargs->tdata(), tiargs->tdata(), n * sizeof(*dedargs->tdata())); + + for (size_t i = 0; i < n; i++) + { assert(i < parameters->dim); +@@ -1084,18 +1215,18 @@ MATCH TemplateDeclaration::deduceFunctio + MATCH m; + Declaration *sparam = NULL; + +- m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam); ++ m = tp->matchArg(loc, paramscope, dedargs, i, parameters, &dedtypes, &sparam); + //printf("\tdeduceType m = %d\n", m); + if (m == MATCHnomatch) + goto Lnomatch; +- if (m < matchTargsi) +- matchTargsi = m; ++ if (m < matchTiargs) ++ matchTiargs = m; + + sparam->semantic(paramscope); + if (!paramscope->insert(sparam)) + goto Lnomatch; + } +- if (n < parameters->dim) ++ if (n < parameters->dim && !tp_is_declared) + { + inferparams = new TemplateParameters(); + inferparams->setDim(parameters->dim - n); +@@ -1105,12 +1236,13 @@ MATCH TemplateDeclaration::deduceFunctio + } + else + inferparams = NULL; ++ //printf("tiargs matchTiargs = %d\n", matchTiargs); + } + #if 0 + for (size_t i = 0; i < dedargs->dim; i++) + { + printf("\tdedarg[%d] = ", i); +- Object *oarg = (*dedargs)[i]; ++ RootObject *oarg = (*dedargs)[i]; + if (oarg) printf("%s", oarg->toChars()); + printf("\n"); + } +@@ -1123,23 +1255,25 @@ MATCH TemplateDeclaration::deduceFunctio + /* Check for match of function arguments with variadic template + * parameter, such as: + * +- * template Foo(T, A...) { void Foo(T t, A a); } +- * void main() { Foo(1,2,3); } ++ * void foo(T, A...)(T t, A a); ++ * void main() { foo(1,2,3); } + */ + if (tp) // if variadic + { ++ // TemplateTupleParameter always makes most lesser matching. ++ matchTiargs = MATCHconvert; ++ + if (nfparams == 0 && nfargs != 0) // if no function parameters + { +- if (tp_is_declared) +- goto L2; +- Tuple *t = new Tuple(); +- //printf("t = %p\n", t); +- (*dedargs)[parameters->dim - 1] = t; +- declareParameter(paramscope, tp, t); +- goto L2; ++ if (!tp_is_declared) ++ { ++ Tuple *t = new Tuple(); ++ //printf("t = %p\n", t); ++ (*dedargs)[parameters->dim - 1] = t; ++ declareParameter(paramscope, tp, t); ++ tp_is_declared = true; ++ } + } +- else if (nfargs < nfparams - 1) +- goto L1; + else + { + /* Figure out which of the function parameters matches +@@ -1159,22 +1293,127 @@ MATCH TemplateDeclaration::deduceFunctio + if (fvarargs) // variadic function doesn't + goto Lnomatch; // go with variadic template + +- if (tp_is_declared) +- goto L2; ++ goto L1; ++ } ++ fptupindex = IDX_NOTFOUND; ++ L1: ++ ; ++ } ++ } ++ ++#if DMDV2 ++ if (tthis) ++ { ++ bool hasttp = false; ++ ++ // Match 'tthis' to any TemplateThisParameter's ++ for (size_t i = 0; i < parameters->dim; i++) ++ { TemplateParameter *tp = (*parameters)[i]; ++ TemplateThisParameter *ttp = tp->isTemplateThisParameter(); ++ if (ttp) ++ { hasttp = true; ++ ++ Type *t = new TypeIdentifier(Loc(), ttp->ident); ++ MATCH m = tthis->deduceType(paramscope, t, parameters, &dedtypes); ++ if (!m) ++ goto Lnomatch; ++ if (m < match) ++ match = m; // pick worst match ++ } ++ } ++ ++ // Match attributes of tthis against attributes of fd ++ if (fd->type && !fd->isCtorDeclaration()) ++ { ++ unsigned mod = fd->type->mod; ++ StorageClass stc = scope->stc | fd->storage_class2; ++ // Propagate parent storage class (see bug 5504) ++ Dsymbol *p = parent; ++ while (p->isTemplateDeclaration() || p->isTemplateInstance()) ++ p = p->parent; ++ AggregateDeclaration *ad = p->isAggregateDeclaration(); ++ if (ad) ++ stc |= ad->storage_class; ++ ++ if (stc & (STCshared | STCsynchronized)) ++ mod |= MODshared; ++ if (stc & STCimmutable) ++ mod |= MODimmutable; ++ if (stc & STCconst) ++ mod |= MODconst; ++ if (stc & STCwild) ++ mod |= MODwild; ++ // Fix mod ++ if (mod & MODimmutable) ++ mod = MODimmutable; ++ if (mod & MODconst) ++ mod &= ~STCwild; ++ ++ unsigned thismod = tthis->mod; ++ if (hasttp) ++ mod = MODmerge(thismod, mod); ++ if (thismod != mod) ++ { ++ if (!MODmethodConv(thismod, mod)) ++ goto Lnomatch; ++ if (MATCHconst < match) ++ match = MATCHconst; ++ } ++ } ++ } ++#endif ++ ++ // Loop through the function parameters ++ { ++ //printf("%s nfargs=%d, nfparams=%d, tuple_dim = %d\n", toChars(), nfargs, nfparams, tuple_dim); ++ //printf("\ttp = %p, fptupindex = %d, found = %d, tp_is_declared = %d\n", tp, fptupindex, fptupindex != IDX_NOTFOUND, tp_is_declared); ++ size_t argi = 0; ++ for (size_t parami = 0; parami < nfparams; parami++) ++ { ++ Parameter *fparam = Parameter::getNth(fparameters, parami); + +- // Apply function parameter storage classes to parameter type +- tid = (TypeIdentifier *)tid->addStorageClass(fparam->storageClass); ++ // Apply function parameter storage classes to parameter types ++ Type *prmtype = fparam->type->addStorageClass(fparam->storageClass); + ++ /* See function parameters which wound up ++ * as part of a template tuple parameter. ++ */ ++ if (fptupindex != IDX_NOTFOUND && parami == fptupindex) ++ { ++ assert(prmtype->ty == Tident); ++ TypeIdentifier *tid = (TypeIdentifier *)prmtype; ++ if (!tp_is_declared) ++ { + /* The types of the function arguments + * now form the tuple argument. + */ + Tuple *t = new Tuple(); + (*dedargs)[parameters->dim - 1] = t; + +- tuple_dim = nfargs - (nfparams - 1); ++ /* Count function parameters following a tuple parameter. ++ * void foo(U, T...)(int y, T, U, int) {} // rem == 2 (U, int) ++ */ ++ size_t rem = 0; ++ for (size_t j = parami + 1; j < nfparams; j++) ++ { ++ Parameter *p = Parameter::getNth(fparameters, j); ++ if (!inferparams || !p->type->reliesOnTident(inferparams)) ++ { ++ Type *pt = p->type->syntaxCopy()->semantic(fd->loc, paramscope); ++ rem += pt->ty == Ttuple ? ((TypeTuple *)pt)->arguments->dim : 1; ++ } ++ else ++ { ++ ++rem; ++ } ++ } ++ ++ if (nfargs - argi < rem) ++ goto Lnomatch; ++ tuple_dim = nfargs - argi - rem; + t->objects.setDim(tuple_dim); + for (size_t i = 0; i < tuple_dim; i++) +- { Expression *farg = (*fargs)[fptupindex + i]; ++ { Expression *farg = (*fargs)[argi + i]; + + // Check invalid arguments to detect errors early. + if (farg->op == TOKerror || farg->type->ty == Terror) +@@ -1199,7 +1438,6 @@ MATCH TemplateDeclaration::deduceFunctio + case X(MODwild, MODimmutable): + case X(MODwild | MODshared, MODshared): + case X(MODwild | MODshared, MODconst | MODshared): +- + if (mod & MODwild) + wildmatch |= MODwild; + else if (mod == 0) +@@ -1224,14 +1462,13 @@ MATCH TemplateDeclaration::deduceFunctio + case X(0, MODconst | MODshared): + case X(0, MODwild): + case X(0, MODwild | MODshared): +- // foo(U:U) T => T +- // foo(U:U) const(T) => const(T) +- // foo(U:U) immutable(T) => immutable(T) +- // foo(U:U) shared(T) => shared(T) +- // foo(U:U) const(shared(T)) => const(shared(T)) +- // foo(U:U) wild(T) => wild(T) +- // foo(U:U) wild(shared(T)) => wild(shared(T)) +- ++ // foo(U:U) T => T ++ // foo(U:U) const(T) => const(T) ++ // foo(U:U) immutable(T) => immutable(T) ++ // foo(U:U) shared(T) => shared(T) ++ // foo(U:U) const(shared(T)) => const(shared(T)) ++ // foo(U:U) wild(T) => wild(T) ++ // foo(U:U) wild(shared(T)) => wild(shared(T)) + tt = farg->type; + m = MATCHexact; + break; +@@ -1242,13 +1479,12 @@ MATCH TemplateDeclaration::deduceFunctio + case X(MODconst | MODshared, MODconst | MODshared): + case X(MODwild, MODwild): + case X(MODwild | MODshared, MODwild | MODshared): +- // foo(U:const(U)) const(T) => T +- // foo(U:immutable(U)) immutable(T) => T +- // foo(U:shared(U)) shared(T) => T +- // foo(U:const(shared(U)) const(shared(T)) => T +- // foo(U:wild(U)) wild(T) => T +- // foo(U:wild(shared(U)) wild(shared(T)) => T +- ++ // foo(U:const(U)) const(T) => T ++ // foo(U:immutable(U)) immutable(T) => T ++ // foo(U:shared(U)) shared(T) => T ++ // foo(U:const(shared(U))) const(shared(T)) => T ++ // foo(U:wild(U)) wild(T) => T ++ // foo(U:wild(shared(U))) wild(shared(T)) => T + tt = farg->type->mutableOf()->unSharedOf(); + m = MATCHexact; + break; +@@ -1259,12 +1495,11 @@ MATCH TemplateDeclaration::deduceFunctio + case X(MODconst | MODshared, MODimmutable): + case X(MODconst, MODwild): + case X(MODconst, MODwild | MODshared): +- // foo(U:const(U)) T => T +- // foo(U:const(U)) immutable(T) => T +- // foo(U:const(U)) const(shared(T)) => shared(T) +- // foo(U:const(shared(U)) immutable(T) => T +- // foo(U:const(U)) wild(shared(T)) => shared(T) +- ++ // foo(U:const(U)) T => T ++ // foo(U:const(U)) immutable(T) => T ++ // foo(U:const(U)) const(shared(T)) => shared(T) ++ // foo(U:const(shared(U))) immutable(T) => T ++ // foo(U:const(U)) wild(shared(T)) => shared(T) + tt = farg->type->mutableOf(); + m = MATCHconst; + break; +@@ -1272,9 +1507,9 @@ MATCH TemplateDeclaration::deduceFunctio + case X(MODshared, MODconst | MODshared): + case X(MODconst | MODshared, MODshared): + case X(MODshared, MODwild | MODshared): +- // foo(U:shared(U)) const(shared(T)) => const(T) +- // foo(U:const(shared(U)) shared(T) => T +- // foo(U:shared(U)) wild(shared(T)) => wild(T) ++ // foo(U:shared(U)) const(shared(T)) => const(T) ++ // foo(U:const(shared(U))) shared(T) => T ++ // foo(U:shared(U)) wild(shared(T)) => wild(T) + tt = farg->type->unSharedOf(); + m = MATCHconst; + break; +@@ -1306,34 +1541,33 @@ MATCH TemplateDeclaration::deduceFunctio + case X(MODimmutable, MODwild | MODshared): + case X(MODconst | MODshared, MODwild | MODshared): + case X(MODwild, MODwild | MODshared): +- +- // foo(U:immutable(U)) T => nomatch +- // foo(U:immutable(U)) const(T) => nomatch +- // foo(U:immutable(U)) shared(T) => nomatch +- // foo(U:immutable(U)) const(shared(T)) => nomatch +- // foo(U:const(U)) shared(T) => nomatch +- // foo(U:shared(U)) T => nomatch +- // foo(U:shared(U)) const(T) => nomatch +- // foo(U:shared(U)) immutable(T) => nomatch +- // foo(U:const(shared(U)) T => nomatch +- // foo(U:const(shared(U)) const(T) => nomatch +- // foo(U:immutable(U)) wild(T) => nomatch +- // foo(U:shared(U)) wild(T) => nomatch +- // foo(U:const(shared(U)) wild(T) => nomatch +- // foo(U:wild(U)) T => nomatch +- // foo(U:wild(U)) const(T) => nomatch +- // foo(U:wild(U)) immutable(T) => nomatch +- // foo(U:wild(U)) shared(T) => nomatch +- // foo(U:wild(U)) const(shared(T)) => nomatch +- // foo(U:wild(shared(U)) T => nomatch +- // foo(U:wild(shared(U)) const(T) => nomatch +- // foo(U:wild(shared(U)) immutable(T) => nomatch +- // foo(U:wild(shared(U)) shared(T) => nomatch +- // foo(U:wild(shared(U)) const(shared(T)) => nomatch +- // foo(U:wild(shared(U)) wild(T) => nomatch +- // foo(U:immutable(U)) wild(shared(T)) => nomatch +- // foo(U:const(shared(U))) wild(shared(T)) => nomatch +- // foo(U:wild(U)) wild(shared(T)) => nomatch ++ // foo(U:immutable(U)) T => nomatch ++ // foo(U:immutable(U)) const(T) => nomatch ++ // foo(U:immutable(U)) shared(T) => nomatch ++ // foo(U:immutable(U)) const(shared(T)) => nomatch ++ // foo(U:const(U)) shared(T) => nomatch ++ // foo(U:shared(U)) T => nomatch ++ // foo(U:shared(U)) const(T) => nomatch ++ // foo(U:shared(U)) immutable(T) => nomatch ++ // foo(U:const(shared(U))) T => nomatch ++ // foo(U:const(shared(U))) const(T) => nomatch ++ // foo(U:immutable(U)) wild(T) => nomatch ++ // foo(U:shared(U)) wild(T) => nomatch ++ // foo(U:const(shared(U))) wild(T) => nomatch ++ // foo(U:wild(U)) T => nomatch ++ // foo(U:wild(U)) const(T) => nomatch ++ // foo(U:wild(U)) immutable(T) => nomatch ++ // foo(U:wild(U)) shared(T) => nomatch ++ // foo(U:wild(U)) const(shared(T)) => nomatch ++ // foo(U:wild(shared(U))) T => nomatch ++ // foo(U:wild(shared(U))) const(T) => nomatch ++ // foo(U:wild(shared(U))) immutable(T) => nomatch ++ // foo(U:wild(shared(U))) shared(T) => nomatch ++ // foo(U:wild(shared(U))) const(shared(T)) => nomatch ++ // foo(U:wild(shared(U))) wild(T) => nomatch ++ // foo(U:immutable(U)) wild(shared(T)) => nomatch ++ // foo(U:const(shared(U))) wild(shared(T)) => nomatch ++ // foo(U:wild(U)) wild(shared(T)) => nomatch + m = MATCHnomatch; + break; + +@@ -1360,104 +1594,45 @@ MATCH TemplateDeclaration::deduceFunctio + t->objects[i] = tt; + } + declareParameter(paramscope, tp, t); +- goto L2; + } +- fptupindex = IDX_NOTFOUND; ++ argi += tuple_dim; ++ continue; + } +- } + +-L1: +- if (nfparams == nfargs) +- ; +- else if (nfargs > nfparams) +- { +- if (fvarargs == 0) +- goto Lnomatch; // too many args, no match +- match = MATCHconvert; // match ... with a conversion +- } +- +-L2: +-#if DMDV2 +- if (ethis) +- { +- // Match 'ethis' to any TemplateThisParameter's +- for (size_t i = 0; i < parameters->dim; i++) +- { TemplateParameter *tp = (*parameters)[i]; +- TemplateThisParameter *ttp = tp->isTemplateThisParameter(); +- if (ttp) +- { MATCH m; +- +- Type *t = new TypeIdentifier(0, ttp->ident); +- m = ethis->type->deduceType(paramscope, t, parameters, &dedtypes); +- if (!m) +- goto Lnomatch; +- if (m < match) +- match = m; // pick worst match +- } +- } +- +- // Match attributes of ethis against attributes of fd +- if (fd->type && !fd->isCtorDeclaration()) +- { +- Type *tthis = ethis->type; +- unsigned mod = fd->type->mod; +- StorageClass stc = scope->stc | fd->storage_class2; +- // Propagate parent storage class (see bug 5504) +- Dsymbol *p = parent; +- while (p->isTemplateDeclaration() || p->isTemplateInstance()) +- p = p->parent; +- AggregateDeclaration *ad = p->isAggregateDeclaration(); +- if (ad) +- stc |= ad->storage_class; +- +- if (stc & (STCshared | STCsynchronized)) +- mod |= MODshared; +- if (stc & STCimmutable) +- mod |= MODimmutable; +- if (stc & STCconst) +- mod |= MODconst; +- if (stc & STCwild) +- mod |= MODwild; +- // Fix mod +- if (mod & MODimmutable) +- mod = MODimmutable; +- if (mod & MODconst) +- mod &= ~STCwild; +- if (tthis->mod != mod) +- { +- if (!MODmethodConv(tthis->mod, mod)) +- goto Lnomatch; +- if (MATCHconst < match) +- match = MATCHconst; ++ // If parameter type doesn't depend on inferred template parameters, ++ // semantic it to get actual type. ++ if (!inferparams || !prmtype->reliesOnTident(inferparams)) ++ { ++ // should copy prmtype to avoid affecting semantic result ++ prmtype = prmtype->syntaxCopy()->semantic(fd->loc, paramscope); ++ ++ if (prmtype->ty == Ttuple) ++ { ++ TypeTuple *tt = (TypeTuple *)prmtype; ++ size_t tt_dim = tt->arguments->dim; ++ for (size_t j = 0; j < tt_dim; j++, ++argi) ++ { ++ Parameter *p = (*tt->arguments)[j]; ++ if (j == tt_dim - 1 && fvarargs == 2 && parami + 1 == nfparams && argi < nfargs) ++ { ++ prmtype = p->type; ++ goto Lvarargs; ++ } ++ if (argi >= nfargs) ++ { ++ if (p->defaultArg) ++ continue; ++ goto Lnomatch; ++ } ++ Expression *farg = (*fargs)[argi]; ++ if (!farg->implicitConvTo(p->type)) ++ goto Lnomatch; ++ } ++ continue; + } + } +- } +-#endif +- +- // Loop through the function parameters +- for (size_t parami = 0; parami < nfparams; parami++) +- { +- /* Skip over function parameters which wound up +- * as part of a template tuple parameter. +- */ +- if (parami == fptupindex) +- continue; +- /* Set i = index into function arguments +- * Function parameters correspond to function arguments as follows. +- * Note that tuple_dim may be zero, and there may be default or +- * variadic arguments at the end. +- * arg [0..fptupindex] == param[0..fptupindex] +- * arg [fptupindex..fptupindex+tuple_dim] == param[fptupindex] +- * arg[fputupindex+dim.. ] == param[fptupindex+1.. ] +- */ +- size_t i = parami; +- if (fptupindex != IDX_NOTFOUND && parami > fptupindex) +- i += tuple_dim - 1; +- +- Parameter *fparam = Parameter::getNth(fparameters, parami); +- Type *prmtype = fparam->type; + +- if (i >= nfargs) // if not enough arguments ++ if (argi >= nfargs) // if not enough arguments + { + if (fparam->defaultArg) + { /* Default arguments do not participate in template argument +@@ -1468,7 +1643,7 @@ L2: + } + else + { +- Expression *farg = (*fargs)[i]; ++ Expression *farg = (*fargs)[argi]; + + // Check invalid arguments to detect errors early. + if (farg->op == TOKerror || farg->type->ty == Terror) +@@ -1481,28 +1656,31 @@ Lretry: + #endif + Type *argtype = farg->type; + +- // Apply function parameter storage classes to parameter types +- prmtype = prmtype->addStorageClass(fparam->storageClass); +- +- // If parameter type doesn't depend on inferred template parameters, +- // semantic it to get actual type. +- if (!inferparams || !prmtype->reliesOnTident(inferparams)) +- { +- // should copy prmtype to avoid affecting semantic result +- prmtype = prmtype->syntaxCopy()->semantic(fd->loc, paramscope); +- } +- + #if DMDV2 +- /* Allow string literals which are type [] to match with [dim] ++ /* Allow expressions that have CT-known boundaries and type [] to match with [dim] + */ +- if (farg->op == TOKstring) +- { StringExp *se = (StringExp *)farg; +- if (!se->committed && argtype->ty == Tarray && +- prmtype->toBasetype()->ty == Tsarray) +- { +- argtype = new TypeSArray(argtype->nextOf(), new IntegerExp(se->loc, se->len, Type::tindex)); +- argtype = argtype->semantic(se->loc, NULL); +- argtype = argtype->invariantOf(); ++ Type *taai; ++ if ( argtype->ty == Tarray && ++ (prmtype->ty == Tsarray || ++ prmtype->ty == Taarray && (taai = ((TypeAArray *)prmtype)->index)->ty == Tident && ++ ((TypeIdentifier *)taai)->idents.dim == 0)) ++ { ++ if (farg->op == TOKstring) ++ { ++ StringExp *se = (StringExp *)farg; ++ argtype = TypeSArray::makeType(se->loc, argtype->nextOf(), se->len); ++ } ++ else if (farg->op == TOKslice) ++ { ++ SliceExp *se = (SliceExp *)farg; ++ Type *tsa = se->toStaticArrayType(); ++ if (tsa) ++ argtype = tsa; ++ } ++ else if (farg->op == TOKarrayliteral) ++ { ++ ArrayLiteralExp *ae = (ArrayLiteralExp *)farg; ++ argtype = TypeSArray::makeType(ae->loc, argtype->nextOf(), ae->elements->dim); + } + } + +@@ -1511,7 +1689,7 @@ Lretry: + if (farg->op == TOKfunction) + { FuncExp *fe = (FuncExp *)farg; + Type *tp = prmtype; +- Expression *e = fe->inferType(tp, 1, parameters); ++ Expression *e = fe->inferType(tp, 1, paramscope, inferparams); + if (!e) + goto Lvarargs; + farg = e; +@@ -1532,7 +1710,7 @@ Lretry: + } + #endif + +- if (fvarargs == 2 && i + 1 == nfparams && i + 1 < nfargs) ++ if (fvarargs == 2 && parami + 1 == nfparams && argi + 1 < nfargs) + goto Lvarargs; + + unsigned wm = 0; +@@ -1590,9 +1768,17 @@ Lretry: + } + + if (m && (fparam->storageClass & (STCref | STCauto)) == STCref) +- { if (!farg->isLvalue()) ++ { ++ if (!farg->isLvalue()) + { +- goto Lnomatch; ++ if (farg->op == TOKstring && argtype->ty == Tsarray) ++ { ++ } ++ else if (farg->op == TOKslice && argtype->ty == Tsarray) ++ { // Allow conversion from T[lwr .. upr] to ref T[upr-lwr] ++ } ++ else ++ goto Lnomatch; + } + } + if (m && (fparam->storageClass & STCout)) +@@ -1606,6 +1792,7 @@ Lretry: + if (m) + { if (m < match) + match = m; // pick worst match ++ argi++; + continue; + } + } +@@ -1614,7 +1801,7 @@ Lretry: + /* The following code for variadic arguments closely + * matches TypeFunction::callMatch() + */ +- if (!(fvarargs == 2 && i + 1 == nfparams)) ++ if (!(fvarargs == 2 && parami + 1 == nfparams)) + goto Lnomatch; + + /* Check for match with function parameter T... +@@ -1629,12 +1816,12 @@ Lretry: + if (tb->ty == Tsarray) + { TypeSArray *tsa = (TypeSArray *)tb; + dinteger_t sz = tsa->dim->toInteger(); +- if (sz != nfargs - i) ++ if (sz != nfargs - argi) + goto Lnomatch; + } + else if (tb->ty == Taarray) + { TypeAArray *taa = (TypeAArray *)tb; +- Expression *dim = new IntegerExp(loc, nfargs - i, Type::tsize_t); ++ Expression *dim = new IntegerExp(loc, nfargs - argi, Type::tsize_t); + + size_t i = templateParameterLookup(taa->index, parameters); + if (i == IDX_NOTFOUND) +@@ -1644,7 +1831,7 @@ Lretry: + taa->index->resolve(loc, sc, &e, &t, &s); + if (!e) + goto Lnomatch; +- e = e->optimize(WANTvalue | WANTinterpret); ++ e = e->ctfeInterpret(); + e = e->implicitCastTo(sc, Type::tsize_t); + e = e->optimize(WANTvalue); + if (!dim->equals(e)) +@@ -1652,7 +1839,7 @@ Lretry: + } + else + { // This code matches code in TypeInstance::deduceType() +- TemplateParameter *tprm = parameters->tdata()[i]; ++ TemplateParameter *tprm = (*parameters)[i]; + TemplateValueParameter *tvp = tprm->isTemplateValueParameter(); + if (!tvp) + goto Lnomatch; +@@ -1664,7 +1851,7 @@ Lretry: + } + else + { +- Type *vt = tvp->valType->semantic(0, sc); ++ Type *vt = tvp->valType->semantic(Loc(), sc); + MATCH m = (MATCH)dim->implicitConvTo(vt); + if (!m) + goto Lnomatch; +@@ -1676,16 +1863,16 @@ Lretry: + } + case Tarray: + { TypeArray *ta = (TypeArray *)tb; +- for (; i < nfargs; i++) ++ for (; argi < nfargs; argi++) + { +- Expression *arg = (*fargs)[i]; ++ Expression *arg = (*fargs)[argi]; + assert(arg); + + if (arg->op == TOKfunction) + { FuncExp *fe = (FuncExp *)arg; + Type *tp = tb->nextOf(); + +- Expression *e = fe->inferType(tp, 1, parameters); ++ Expression *e = fe->inferType(tp, 1, paramscope, inferparams); + if (!e) + goto Lnomatch; + arg = e; +@@ -1730,19 +1917,24 @@ Lretry: + default: + goto Lnomatch; + } ++ ++argi; ++ } ++ //printf("-> argi = %d, nfargs = %d\n", argi, nfargs); ++ if (argi != nfargs && !fvarargs) ++ goto Lnomatch; + } + + Lmatch: + +- for (size_t i = nargsi; i < dedargs->dim; i++) ++ for (size_t i = ntargs; i < dedargs->dim; i++) + { + TemplateParameter *tparam = (*parameters)[i]; + //printf("tparam[%d] = %s\n", i, tparam->ident->toChars()); + /* For T:T*, the dedargs is the T*, dedtypes is the T + * But for function templates, we really need them to match + */ +- Object *oarg = (*dedargs)[i]; +- Object *oded = dedtypes[i]; ++ RootObject *oarg = (*dedargs)[i]; ++ RootObject *oded = dedtypes[i]; + //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded); + //if (oarg) printf("oarg: %s\n", oarg->toChars()); + //if (oded) printf("oded: %s\n", oded->toChars()); +@@ -1750,21 +1942,25 @@ Lmatch: + { + if (oded) + { +- if (tparam->specialization()) ++ if (tparam->specialization() || !tparam->isTemplateTypeParameter()) + { /* The specialization can work as long as afterwards + * the oded == oarg + */ +- Declaration *sparam; + (*dedargs)[i] = oded; +- MATCH m2 = tparam->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam); ++ MATCH m2 = tparam->matchArg(loc, paramscope, dedargs, i, parameters, &dedtypes, NULL); + //printf("m2 = %d\n", m2); + if (!m2) + goto Lnomatch; +- if (m2 < match) +- match = m2; // pick worst match ++ if (m2 < matchTiargs) ++ matchTiargs = m2; // pick worst match + if (dedtypes[i] != oded) + error("specialization not allowed for deduced parameter %s", tparam->ident->toChars()); + } ++ else ++ { ++ if (MATCHconvert < matchTiargs) ++ matchTiargs = MATCHconvert; ++ } + } + else + { oded = tparam->defaultArg(loc, paramscope); +@@ -1772,9 +1968,9 @@ Lmatch: + { + if (tp && // if tuple parameter and + fptupindex == IDX_NOTFOUND && // tuple parameter was not in function parameter list and +- nargsi == dedargs->dim - 1) // we're one argument short (i.e. no tuple argument) ++ ntargs == dedargs->dim - 1) // we're one argument short (i.e. no tuple argument) + { // make tuple argument an empty tuple +- oded = (Object *)new Tuple(); ++ oded = (RootObject *)new Tuple(); + } + else + goto Lnomatch; +@@ -1787,12 +1983,12 @@ Lmatch: + + #if DMDV2 + if (constraint) +- { /* Check to see if constraint is satisfied. ++ { ++ /* Check to see if constraint is satisfied. + * Most of this code appears twice; this is a good candidate for refactoring. + */ + makeParamNamesVisibleInConstraint(paramscope, fargs); + Expression *e = constraint->syntaxCopy(); +- paramscope->flags |= SCOPEstaticif; + + /* Detect recursive attempts to instantiate this template declaration, + * Bugzilla 4072 +@@ -1803,7 +1999,10 @@ Lmatch: + int nmatches = 0; + for (Previous *p = previous; p; p = p->prev) + { +- if (arrayObjectMatch(p->dedargs, dedargs, this, sc)) ++ if (arrayCheckRecursiveExpansion(p->dedargs, this, sc)) ++ goto Lnomatch; ++ ++ if (arrayObjectMatch(p->dedargs, dedargs)) + { + //printf("recursive, no match p->sc=%p %p %s\n", p->sc, this, this->toChars()); + /* It must be a subscope of p->sc, other scope chains are not recursive +@@ -1827,8 +2026,7 @@ Lmatch: + + int nerrors = global.errors; + +- FuncDeclaration *fd = onemember && onemember->toAlias() ? +- onemember->toAlias()->isFuncDeclaration() : NULL; ++ FuncDeclaration *fd = f; + Dsymbol *s = parent; + while (s->isTemplateInstance() || s->isTemplateMixin()) + s = s->parent; +@@ -1840,7 +2038,11 @@ Lmatch: + fd->vthis = fd->declareThis(paramscope, ad); + } + +- e = e->semantic(paramscope); ++ Scope *scx = paramscope->startCTFE(); ++ scx->flags |= SCOPEstaticif; ++ e = e->semantic(scx); ++ e = resolveProperties(scx, e); ++ scx->endCTFE(); + + if (fd && fd->vthis) + fd->vthis = vthissave; +@@ -1873,7 +2075,7 @@ Lmatch: + + paramscope->pop(); + //printf("\tmatch %d\n", match); +- return (MATCH)(match | (matchTargsi<<4)); ++ return (MATCH)(match | (matchTiargs<<4)); + + Lnomatch: + paramscope->pop(); +@@ -1885,7 +2087,7 @@ Lnomatch: + * Declare template parameter tp with value o, and install it in the scope sc. + */ + +-Object *TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, Object *o) ++RootObject *TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, RootObject *o) + { + //printf("TemplateDeclaration::declareParameter('%s', o = %p)\n", tp->ident->toChars(), o); + +@@ -1897,45 +2099,29 @@ Object *TemplateDeclaration::declarePara + Dsymbol *s; + VarDeclaration *v = NULL; + +- // See if tp->ident already exists with a matching definition +- Dsymbol *scopesym; +- s = sc->search(loc, tp->ident, &scopesym); +- if (s && scopesym == sc->scopesym) +- { +- TupleDeclaration *td = s->isTupleDeclaration(); +- if (va && td) +- { Tuple tup; +- tup.objects = *td->objects; +- if (match(va, &tup, this, sc)) +- { +- return o; +- } +- } +- } + if (ea && ea->op == TOKtype) + targ = ea->type; + else if (ea && ea->op == TOKimport) + sa = ((ScopeExp *)ea)->sds; + else if (ea && (ea->op == TOKthis || ea->op == TOKsuper)) + sa = ((ThisExp *)ea)->var; ++ else if (ea && ea->op == TOKfunction) ++ { ++ if (((FuncExp *)ea)->td) ++ sa = ((FuncExp *)ea)->td; ++ else ++ sa = ((FuncExp *)ea)->fd; ++ } + + if (targ) + { + //printf("type %s\n", targ->toChars()); +- s = new AliasDeclaration(0, tp->ident, targ); ++ s = new AliasDeclaration(Loc(), tp->ident, targ); + } + else if (sa) + { + //printf("Alias %s %s;\n", sa->ident->toChars(), tp->ident->toChars()); +- s = new AliasDeclaration(0, tp->ident, sa); +- } +- else if (ea && ea->op == TOKfunction) +- { +- if (((FuncExp *)ea)->td) +- sa = ((FuncExp *)ea)->td; +- else +- sa = ((FuncExp *)ea)->fd; +- s = new AliasDeclaration(0, tp->ident, sa); ++ s = new AliasDeclaration(Loc(), tp->ident, sa); + } + else if (ea) + { +@@ -1946,7 +2132,7 @@ Object *TemplateDeclaration::declarePara + Type *t = tvp ? tvp->valType : NULL; + + v = new VarDeclaration(loc, t, tp->ident, init); +- v->storage_class = STCmanifest; ++ v->storage_class = STCmanifest | STCtemplateparameter; + s = v; + } + else if (va) +@@ -1967,7 +2153,7 @@ Object *TemplateDeclaration::declarePara + /* So the caller's o gets updated with the result of semantic() being run on o + */ + if (v) +- return (Object *)v->init->toExpression(); ++ return (RootObject *)v->init->toExpression(); + return o; + } + +@@ -1993,310 +2179,468 @@ TemplateTupleParameter *TemplateDeclarat + * We can overload templates. + */ + +-int TemplateDeclaration::isOverloadable() ++bool TemplateDeclaration::isOverloadable() + { +- return 1; ++ return true; + } + + /************************************************* + * Given function arguments, figure out which template function +- * to expand, and return that function. +- * If no match, give error message and return NULL. ++ * to expand, and return matching result. + * Input: +- * sc instantiation scope ++ * m matching result ++ * dstart the root of overloaded function templates + * loc instantiation location +- * targsi initial list of template arguments +- * ethis if !NULL, the 'this' pointer argument ++ * sc instantiation scope ++ * tiargs initial list of template arguments ++ * tthis if !NULL, the 'this' pointer argument + * fargs arguments to function +- * flags 1: do not issue error message on no match, just return NULL + */ + +-FuncDeclaration *TemplateDeclaration::deduceFunctionTemplate(Scope *sc, Loc loc, +- Objects *targsi, Expression *ethis, Expressions *fargs, int flags) ++void functionResolve(Match *m, Dsymbol *dstart, Loc loc, Scope *sc, ++ Objects *tiargs, Type *tthis, Expressions *fargs) + { +- MATCH m_best = MATCHnomatch; +- MATCH m_best2 = MATCHnomatch; +- TemplateDeclaration *td_ambig = NULL; +- TemplateDeclaration *td_best = NULL; +- Objects *tdargs = new Objects(); +- TemplateInstance *ti; +- FuncDeclaration *fd_best; +- + #if 0 +- printf("TemplateDeclaration::deduceFunctionTemplate() %s\n", toChars()); +- printf(" targsi:\n"); +- if (targsi) +- { for (size_t i = 0; i < targsi->dim; i++) +- { Object *arg = (*targsi)[i]; ++ printf("functionResolve() dstart = %s\n", dstart->toChars()); ++ printf(" tiargs:\n"); ++ if (tiargs) ++ { for (size_t i = 0; i < tiargs->dim; i++) ++ { RootObject *arg = (*tiargs)[i]; + printf("\t%s\n", arg->toChars()); + } + } + printf(" fargs:\n"); +- for (size_t i = 0; i < fargs->dim; i++) ++ for (size_t i = 0; i < (fargs ? fargs->dim : 0); i++) + { Expression *arg = (*fargs)[i]; + printf("\t%s %s\n", arg->type->toChars(), arg->toChars()); + //printf("\tty = %d\n", arg->type->ty); + } +- printf("stc = %llx\n", scope->stc); ++ //printf("stc = %llx\n", dstart->scope->stc); ++ //printf("match:t/f = %d/%d\n", ta_last, m->last); + #endif + +- for (TemplateDeclaration *td = this; td; td = td->overnext) ++ struct ParamDeduce ++ { ++ // context ++ Loc loc; ++ Scope *sc; ++ Type *tthis; ++ Objects *tiargs; ++ Expressions *fargs; ++ // result ++ Match *m; ++ int property; // 0: unintialized ++ // 1: seen @property ++ // 2: not @property ++ size_t ov_index; ++ TemplateDeclaration *td_best; ++ MATCH ta_last; ++ Objects *tdargs; ++ Type *tthis_best; ++ ++ static int fp(void *param, Dsymbol *s) ++ { ++ if (FuncDeclaration *fd = s->isFuncDeclaration()) ++ return ((ParamDeduce *)param)->fp(fd); ++ if (TemplateDeclaration *td = s->isTemplateDeclaration()) ++ return ((ParamDeduce *)param)->fp(td); ++ return 0; ++ } ++ int fp(FuncDeclaration *fd) ++ { ++ // skip duplicates ++ if (fd == m->lastf) ++ return 0; ++ // explicitly specified tiargs never match to non template function ++ if (tiargs && tiargs->dim > 0) ++ return 0; ++ ++ //printf("fd = %s %s\n", fd->toChars(), fd->type->toChars()); ++ m->anyf = fd; ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ ++ int prop = (tf->isproperty) ? 1 : 2; ++ if (property == 0) ++ property = prop; ++ else if (property != prop) ++ error(fd->loc, "cannot overload both property and non-property functions"); ++ ++ /* For constructors, qualifier check will be opposite direction. ++ * Qualified constructor always makes qualified object, then will be checked ++ * that it is implicitly convertible to tthis. ++ */ ++ Type *tthis_fd = fd->needThis() ? tthis : NULL; ++ if (tthis_fd && fd->isCtorDeclaration()) ++ { ++ //printf("%s tf->mod = x%x tthis_fd->mod = x%x %d\n", tf->toChars(), ++ // tf->mod, tthis_fd->mod, fd->isolateReturn()); ++ if (MODimplicitConv(tf->mod, tthis_fd->mod) || ++ tf->isWild() && tf->isShared() == tthis_fd->isShared() || ++ fd->isolateReturn()/* && tf->isShared() == tthis_fd->isShared()*/) ++ { // Uniquely constructed object can ignore shared qualifier. ++ // TODO: Is this appropriate? ++ tthis_fd = NULL; ++ } ++ else ++ return 0; // MATCHnomatch ++ } ++ MATCH mfa = tf->callMatch(tthis_fd, fargs); ++ //printf("test1: mfa = %d\n", mfa); ++ if (mfa != MATCHnomatch) ++ { ++ if (mfa > m->last) goto LfIsBetter; ++ if (mfa < m->last) goto LlastIsBetter; ++ ++ /* See if one of the matches overrides the other. ++ */ ++ assert(m->lastf); ++ if (m->lastf->overrides(fd)) goto LlastIsBetter; ++ if (fd->overrides(m->lastf)) goto LfIsBetter; ++ ++ /* Try to disambiguate using template-style partial ordering rules. ++ * In essence, if f() and g() are ambiguous, if f() can call g(), ++ * but g() cannot call f(), then pick f(). ++ * This is because f() is "more specialized." ++ */ ++ { ++ MATCH c1 = fd->leastAsSpecialized(m->lastf); ++ MATCH c2 = m->lastf->leastAsSpecialized(fd); ++ //printf("c1 = %d, c2 = %d\n", c1, c2); ++ if (c1 > c2) goto LfIsBetter; ++ if (c1 < c2) goto LlastIsBetter; ++ } ++ ++ /* If the two functions are the same function, like: ++ * int foo(int); ++ * int foo(int x) { ... } ++ * then pick the one with the body. ++ */ ++ if (tf->equals(m->lastf->type) && ++ fd->storage_class == m->lastf->storage_class && ++ fd->parent == m->lastf->parent && ++ fd->protection == m->lastf->protection && ++ fd->linkage == m->lastf->linkage) ++ { ++ if ( fd->fbody && !m->lastf->fbody) goto LfIsBetter; ++ if (!fd->fbody && m->lastf->fbody) goto LlastIsBetter; ++ } ++ ++ Lambiguous: ++ m->nextf = fd; ++ m->count++; ++ return 0; ++ ++ LlastIsBetter: ++ return 0; ++ ++ LfIsBetter: ++ td_best = NULL; ++ ta_last = MATCHexact; ++ m->last = mfa; ++ m->lastf = fd; ++ tthis_best = tthis_fd; ++ ov_index = 0; ++ m->count = 1; ++ tdargs->setDim(0); ++ return 0; ++ } ++ return 0; ++ } ++ int fp(TemplateDeclaration *td) + { +- if (!td->semanticRun) ++ // skip duplicates ++ if (td == td_best) ++ return 0; ++ ++ if (!sc) ++ sc = td->scope; // workaround for Type::aliasthisOf ++ ++ if (td->semanticRun == PASSinit) ++ { ++ if (td->scope) ++ { ++ // Try to fix forward reference. Ungag errors while doing so. ++ Ungag ungag = td->ungagSpeculative(); ++ td->semantic(td->scope); ++ } ++ } ++ if (td->semanticRun == PASSinit) + { +- error("forward reference to template %s", td->toChars()); ++ ::error(loc, "forward reference to template %s", td->toChars()); + goto Lerror; + } +- if (!td->onemember || !td->onemember->toAlias()->isFuncDeclaration()) ++ FuncDeclaration *f; ++ f = td->onemember ? td->onemember/*->toAlias()*/->isFuncDeclaration() : NULL; ++ if (!f) + { +- if (!targsi) +- targsi = new Objects(); +- TemplateInstance *ti = new TemplateInstance(loc, td, targsi); ++ if (!tiargs) ++ tiargs = new Objects(); ++ TemplateInstance *ti = new TemplateInstance(loc, td, tiargs); + + Objects dedtypes; + dedtypes.setDim(td->parameters->dim); +- assert(td->semanticRun); +- MATCH m2 = td->matchWithInstance(ti, &dedtypes, fargs, 0); +- //printf("matchWithInstance = %d\n", m2); +- if (!m2 || m2 < m_best2) // no match or less match +- continue; ++ assert(td->semanticRun != PASSinit); ++ MATCH mta = td->matchWithInstance(sc, ti, &dedtypes, fargs, 0); ++ //printf("matchWithInstance = %d\n", mta); ++ if (!mta || mta < ta_last) // no match or less match ++ return 0; + + ti->semantic(sc, fargs); + if (!ti->inst) // if template failed to expand +- continue; ++ return 0; + + Dsymbol *s = ti->inst->toAlias(); +- FuncDeclaration *fd = s->isFuncDeclaration(); +- if (!fd) +- { +- td->error("is not a function template"); ++ if (!s->isFuncDeclaration() && !s->isTemplateDeclaration()) + goto Lerror; +- } +- fd = fd->overloadResolve(loc, ethis, fargs, flags); ++ FuncDeclaration *fd = resolveFuncCall(loc, sc, s, NULL, tthis, fargs, 1); + if (!fd) +- continue; ++ return 0; ++ ++ Type *tthis_fd = fd->needThis() && !fd->isCtorDeclaration() ? tthis : NULL; + + TypeFunction *tf = (TypeFunction *)fd->type; +- MATCH m = (MATCH) tf->callMatch(fd->needThis() && !fd->isCtorDeclaration() ? ethis : NULL, fargs); +- if (m < m_best) +- continue; ++ MATCH mfa = tf->callMatch(tthis_fd, fargs); ++ if (mfa < m->last) ++ return 0; + + // td is the new best match +- td_ambig = NULL; +- assert((size_t)td->scope > 0x10000); ++ assert(td->scope); + td_best = td; +- fd_best = fd; +- m_best = m; +- m_best2 = m2; ++ property = 0; // (backward compatibility) ++ ta_last = mta; ++ m->last = mfa; ++ m->lastf = fd; ++ tthis_best = tthis_fd; ++ ov_index = 0; ++ m->nextf = NULL; ++ m->count = 1; + tdargs->setDim(dedtypes.dim); + memcpy(tdargs->tdata(), dedtypes.tdata(), tdargs->dim * sizeof(void *)); +- continue; ++ return 0; + } + +- MATCH m, m2; +- Objects dedargs; +- FuncDeclaration *fd = NULL; +- +- m = td->deduceFunctionTemplateMatch(sc, loc, targsi, ethis, fargs, &dedargs); +- m2 = (MATCH)(m >> 4); +- m = (MATCH)(m & 0xF); +- //printf("deduceFunctionTemplateMatch = %d, m2 = %d\n", m, m2); +- if (!m) // if no match +- continue; +- +- if (m2 < m_best2) +- goto Ltd_best; +- if (m2 > m_best2) +- goto Ltd; +- +- if (m < m_best) +- goto Ltd_best; +- if (m > m_best) +- goto Ltd; +- ++ //printf("td = %s\n", td->toChars()); ++ for (size_t ovi = 0; f; f = f->overnext0, ovi++) + { +- // Disambiguate by picking the most specialized TemplateDeclaration +- MATCH c1 = td->leastAsSpecialized(td_best, fargs); +- MATCH c2 = td_best->leastAsSpecialized(td, fargs); +- //printf("1: c1 = %d, c2 = %d\n", c1, c2); ++ Objects dedtypes; ++ FuncDeclaration *fd = NULL; ++ int x = td->deduceFunctionTemplateMatch(f, loc, sc, tiargs, tthis, fargs, &dedtypes); ++ MATCH mta = (MATCH)(x >> 4); ++ MATCH mfa = (MATCH)(x & 0xF); ++ //printf("match:t/f = %d/%d\n", mta, mfa); ++ if (!mfa) // if no match ++ continue; + +- if (c1 > c2) +- goto Ltd; +- else if (c1 < c2) +- goto Ltd_best; +- } ++ Type *tthis_fd = NULL; ++ if (f->isCtorDeclaration()) ++ { ++ // Constructor call requires additional check. ++ // For that, do instantiate in early stage. ++ fd = td->doHeaderInstantiation(sc, &dedtypes, tthis, fargs); ++ if (!fd) ++ goto Lerror; ++ ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ tthis_fd = fd->needThis() ? tthis : NULL; ++ if (tthis_fd) ++ { ++ assert(tf->next); ++ if (MODimplicitConv(tf->mod, tthis_fd->mod) || ++ tf->isWild() && tf->isShared() == tthis_fd->isShared() || ++ fd->isolateReturn()) ++ { ++ tthis_fd = NULL; ++ } ++ else ++ continue; // MATCHnomatch ++ } ++ } + +- if (!fd_best) +- { +- fd_best = td_best->doHeaderInstantiation(sc, tdargs, fargs); +- if (!fd_best) +- goto Lerror; +- } +- { +- fd = td->doHeaderInstantiation(sc, &dedargs, fargs); +- if (!fd) +- goto Lerror; +- } +- assert(fd && fd_best); ++ if (mta < ta_last) goto Ltd_best; ++ if (mta > ta_last) goto Ltd; + +- { +- // Disambiguate by tf->callMatch +- TypeFunction *tf1 = (TypeFunction *)fd->type; +- TypeFunction *tf2 = (TypeFunction *)fd_best->type; +- MATCH c1 = (MATCH) tf1->callMatch(fd->needThis() && !fd->isCtorDeclaration() ? ethis : NULL, fargs); +- MATCH c2 = (MATCH) tf2->callMatch(fd_best->needThis() && !fd_best->isCtorDeclaration() ? ethis : NULL, fargs); +- //printf("2: c1 = %d, c2 = %d\n", c1, c2); ++ if (mfa < m->last) goto Ltd_best; ++ if (mfa > m->last) goto Ltd; + +- if (c1 > c2) +- goto Ltd; +- if (c1 < c2) +- goto Ltd_best; +- } ++ if (td_best) ++ { ++ // Disambiguate by picking the most specialized TemplateDeclaration ++ MATCH c1 = td->leastAsSpecialized(sc, td_best, fargs); ++ MATCH c2 = td_best->leastAsSpecialized(sc, td, fargs); ++ //printf("1: c1 = %d, c2 = %d\n", c1, c2); ++ if (c1 > c2) goto Ltd; ++ if (c1 < c2) goto Ltd_best; ++ } + +- { +- // Disambiguate by picking the most specialized FunctionDeclaration +- MATCH c1 = fd->leastAsSpecialized(fd_best); +- MATCH c2 = fd_best->leastAsSpecialized(fd); +- //printf("3: c1 = %d, c2 = %d\n", c1, c2); ++ if (!m->lastf) ++ { ++ assert(td_best); ++ m->lastf = td_best->doHeaderInstantiation(sc, tdargs, tthis, fargs); ++ if (!m->lastf) goto Lerror; ++ tthis_best = m->lastf->needThis() ? tthis : NULL; ++ } ++ if (!fd) ++ { ++ fd = td->doHeaderInstantiation(sc, &dedtypes, tthis, fargs); ++ if (!fd) goto Lerror; ++ tthis_fd = fd->needThis() ? tthis : NULL; ++ } ++ assert(fd && m->lastf); ++ ++ { ++ // Disambiguate by tf->callMatch ++ TypeFunction *tf1 = (TypeFunction *)fd->type; ++ TypeFunction *tf2 = (TypeFunction *)m->lastf->type; ++ MATCH c1 = tf1->callMatch(tthis_fd, fargs); ++ MATCH c2 = tf2->callMatch(tthis_best, fargs); ++ //printf("2: c1 = %d, c2 = %d\n", c1, c2); ++ if (c1 > c2) goto Ltd; ++ if (c1 < c2) goto Ltd_best; ++ } ++ { ++ // Disambiguate by picking the most specialized FunctionDeclaration ++ MATCH c1 = fd->leastAsSpecialized(m->lastf); ++ MATCH c2 = m->lastf->leastAsSpecialized(fd); ++ //printf("3: c1 = %d, c2 = %d\n", c1, c2); ++ if (c1 > c2) goto Ltd; ++ if (c1 < c2) goto Ltd_best; ++ } ++ ++ Lambig: // td_best and td are ambiguous ++ //printf("Lambig\n"); ++ m->nextf = fd; // Caution! m->nextf isn't complete instantiated fd, so must not call toPrettyChars() ++ m->count++; ++ continue; ++ ++ Ltd_best: // td_best is the best match so far ++ continue; + +- if (c1 > c2) +- goto Ltd; +- if (c1 < c2) +- goto Ltd_best; ++ Ltd: // td is the new best match ++ assert(td->scope); ++ td_best = td; ++ property = 0; // (backward compatibility) ++ ta_last = mta; ++ m->last = mfa; ++ m->lastf = fd; ++ tthis_best = tthis_fd; ++ ov_index = ovi; ++ m->nextf = NULL; ++ m->count = 1; ++ tdargs->setDim(dedtypes.dim); ++ memcpy(tdargs->tdata(), dedtypes.tdata(), tdargs->dim * sizeof(void *)); ++ continue; + } ++ return 0; + +- Lambig: // td_best and td are ambiguous +- td_ambig = td; +- continue; ++ Lerror: ++ m->lastf = NULL; ++ m->count = 0; ++ m->last = MATCHnomatch; ++ return 1; ++ } ++ }; ++ ParamDeduce p; ++ // context ++ p.loc = loc; ++ p.sc = sc; ++ p.tthis = tthis; ++ p.tiargs = tiargs; ++ p.fargs = fargs; ++ ++ // result ++ p.m = m; ++ p.property = 0; ++ p.ov_index = 0; ++ p.td_best = NULL; ++ p.ta_last = m->last ? MATCHexact : MATCHnomatch; ++ p.tdargs = new Objects(); ++ p.tthis_best = NULL; ++ ++ FuncDeclaration *fd = dstart->isFuncDeclaration(); ++ TemplateDeclaration *td = dstart->isTemplateDeclaration(); ++ if (td && td->funcroot) ++ dstart = td->funcroot; ++ overloadApply(dstart, &p, &ParamDeduce::fp); ++ ++ //printf("td_best = %p, m->lastf = %p, match:t/f = %d/%d\n", td_best, m->lastf, mta, mfa); ++ if (p.td_best) ++ { ++ // Matches to template function ++ if (!p.td_best->onemember || !p.td_best->onemember->toAlias()->isFuncDeclaration()) ++ return; // goto Lerror? + +- Ltd_best: // td_best is the best match so far +- td_ambig = NULL; +- continue; ++ /* The best match is td_best with arguments tdargs. ++ * Now instantiate the template. ++ */ ++ assert(p.td_best->scope); ++ if (!sc) sc = p.td_best->scope; // workaround for Type::aliasthisOf ++ TemplateInstance *ti; ++ ti = new TemplateInstance(loc, p.td_best, p.tdargs); ++ ti->semantic(sc, fargs); ++ m->lastf = ti->toAlias()->isFuncDeclaration(); ++ if (!m->lastf) ++ goto Lerror; + +- Ltd: // td is the new best match +- td_ambig = NULL; +- assert((size_t)td->scope > 0x10000); +- td_best = td; +- fd_best = fd; +- m_best = m; +- m_best2 = m2; +- tdargs->setDim(dedargs.dim); +- memcpy(tdargs->tdata(), dedargs.tdata(), tdargs->dim * sizeof(void *)); +- continue; +- } +- if (!td_best) +- { +- if (!(flags & 1)) ++ // look forward instantiated overload function ++ // Dsymbol::oneMembers is alredy called in TemplateInstance::semantic. ++ // it has filled overnext0d ++ while (p.ov_index--) + { +- ::error(loc, "%s %s.%s does not match any function template declaration. Candidates are:", +- kind(), parent->toPrettyChars(), ident->toChars()); +- +- // Display candidate template functions +- int numToDisplay = 5; // sensible number to display +- for (TemplateDeclaration *td = this; td; td = td->overnext) +- { +- ::errorSupplemental(td->loc, "%s", td->toPrettyChars()); +- if (!global.params.verbose && --numToDisplay == 0) +- { +- // Too many overloads to sensibly display. +- // Just show count of remaining overloads. +- int remaining = 0; +- for (; td; td = td->overnext) +- ++remaining; +- if (remaining > 0) +- ::errorSupplemental(loc, "... (%d more, -v to show) ...", remaining); +- break; +- } +- } ++ m->lastf = m->lastf->overnext0; ++ assert(m->lastf); + } +- goto Lerror; +- } +- if (td_ambig) +- { +- ::error(loc, "%s %s.%s matches more than one template declaration, %s(%d):%s and %s(%d):%s", +- kind(), parent->toPrettyChars(), ident->toChars(), +- td_best->loc.filename, td_best->loc.linnum, td_best->toChars(), +- td_ambig->loc.filename, td_ambig->loc.linnum, td_ambig->toChars()); +- } + +- if (!td_best->onemember || !td_best->onemember->toAlias()->isFuncDeclaration()) +- return fd_best; ++ p.tthis_best = m->lastf->needThis() && !m->lastf->isCtorDeclaration() ? tthis : NULL; + +- /* The best match is td_best with arguments tdargs. +- * Now instantiate the template. +- */ +- assert((size_t)td_best->scope > 0x10000); +- ti = new TemplateInstance(loc, td_best, tdargs); +- ti->semantic(sc, fargs); +- fd_best = ti->toAlias()->isFuncDeclaration(); +- if (!fd_best) +- goto Lerror; ++ TypeFunction *tf = (TypeFunction *)m->lastf->type; ++ assert(tf->ty == Tfunction); ++ if (!tf->callMatch(p.tthis_best, fargs)) ++ goto Lerror; + +- if (FuncLiteralDeclaration *fld = fd_best->isFuncLiteralDeclaration()) +- { +- // Inside template constraint, nested reference check doesn't work correctly. +- if (!(sc->flags & SCOPEstaticif) && fld->tok == TOKreserved) +- { // change to non-nested +- fld->tok = TOKfunction; +- fld->vthis = NULL; ++ if (FuncLiteralDeclaration *fld = m->lastf->isFuncLiteralDeclaration()) ++ { ++ if ((sc->flags & SCOPEstaticif) || sc->intypeof) ++ { ++ // Inside template constraint, or inside typeof, ++ // nested reference check doesn't work correctly. ++ } ++ else if (fld->tok == TOKreserved) ++ { ++ // change to non-nested ++ fld->tok = TOKfunction; ++ fld->vthis = NULL; ++ } + } +- } + +- /* As Bugzilla 3682 shows, a template instance can be matched while instantiating +- * that same template. Thus, the function type can be incomplete. Complete it. +- * +- * Bugzilla 9208: For auto function, completion should be deferred to the end of +- * its semantic3. Should not complete it in here. +- */ +- { TypeFunction *tf = (TypeFunction *)fd_best->type; +- assert(tf->ty == Tfunction); +- if (tf->next && !fd_best->inferRetType) ++ /* As Bugzilla 3682 shows, a template instance can be matched while instantiating ++ * that same template. Thus, the function type can be incomplete. Complete it. ++ * ++ * Bugzilla 9208: For auto function, completion should be deferred to the end of ++ * its semantic3. Should not complete it in here. ++ */ ++ if (tf->next && !m->lastf->inferRetType) + { +- fd_best->type = tf->semantic(loc, sc); ++ m->lastf->type = tf->semantic(loc, sc); + } + } +- +- fd_best->functionSemantic(); +- +- return fd_best; +- +- Lerror: +-#if DMDV2 +- if (!(flags & 1)) +-#endif ++ else if (m->lastf) + { +- HdrGenState hgs; +- +- OutBuffer bufa; +- Objects *args = targsi; +- if (args) +- { for (size_t i = 0; i < args->dim; i++) +- { +- if (i) +- bufa.writeByte(','); +- Object *oarg = (*args)[i]; +- ObjectToCBuffer(&bufa, &hgs, oarg); +- } +- } +- +- OutBuffer buf; +- argExpTypesToCBuffer(&buf, fargs, &hgs); +- if (this->overnext) +- ::error(this->loc, "%s %s.%s cannot deduce template function from argument types !(%s)(%s)", +- kind(), parent->toPrettyChars(), ident->toChars(), +- bufa.toChars(), buf.toChars()); +- else +- error(loc, "cannot deduce template function from argument types !(%s)(%s)", +- bufa.toChars(), buf.toChars()); ++ // Matches to non template function ++ } ++ else ++ { ++ Lerror: ++ m->lastf = NULL; ++ m->count = 0; ++ m->last = MATCHnomatch; + } +- return NULL; + } + + /************************************************* + * Limited function template instantiation for using fd->leastAsSpecialized() + */ + FuncDeclaration *TemplateDeclaration::doHeaderInstantiation(Scope *sc, +- Objects *tdargs, Expressions *fargs) ++ Objects *tdargs, Type *tthis, Expressions *fargs) + { + FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration(); + if (!fd) +@@ -2305,15 +2649,15 @@ FuncDeclaration *TemplateDeclaration::do + #if 0 + printf("doHeaderInstantiation this = %s\n", toChars()); + for (size_t i = 0; i < tdargs->dim; ++i) +- printf("\ttdargs[%d] = %s\n", i, ((Object *)tdargs->data[i])->toChars()); ++ printf("\ttdargs[%d] = %s\n", i, ((RootObject *)tdargs->data[i])->toChars()); + #endif + +- assert((size_t)scope > 0x10000); ++ assert(scope); + TemplateInstance *ti = new TemplateInstance(loc, this, tdargs); + ti->tinst = sc->tinst; + { +- ti->tdtypes.setDim(ti->tempdecl->parameters->dim); +- if (!ti->tempdecl->matchWithInstance(ti, &ti->tdtypes, fargs, 2)) ++ ti->tdtypes.setDim(parameters->dim); ++ if (!matchWithInstance(sc, ti, &ti->tdtypes, fargs, 2)) + return NULL; + } + +@@ -2321,20 +2665,37 @@ FuncDeclaration *TemplateDeclaration::do + + // function body and contracts are not need + //fd = fd->syntaxCopy(NULL)->isFuncDeclaration(); +- fd = new FuncDeclaration(fd->loc, fd->endloc, fd->ident, fd->storage_class, fd->type->syntaxCopy()); ++ if (fd->isCtorDeclaration()) ++ fd = new CtorDeclaration(fd->loc, fd->endloc, fd->storage_class, fd->type->syntaxCopy()); ++ else ++ fd = new FuncDeclaration(fd->loc, fd->endloc, fd->ident, fd->storage_class, fd->type->syntaxCopy()); + fd->parent = ti; + +- Scope *scope = this->scope; ++ Module *mi = sc->instantiatingModule ? sc->instantiatingModule : sc->module; + ++ Scope *scope = this->scope; + ti->argsym = new ScopeDsymbol(); + ti->argsym->parent = scope->parent; + scope = scope->push(ti->argsym); ++ scope->instantiatingModule = mi; ++ ++ bool hasttp = false; + + Scope *paramscope = scope->push(); + paramscope->stc = 0; + ti->declareParameters(paramscope); + paramscope->pop(); + ++ if (tthis) ++ { ++ // Match 'tthis' to any TemplateThisParameter's ++ for (size_t i = 0; i < parameters->dim; i++) ++ { TemplateParameter *tp = (*parameters)[i]; ++ TemplateThisParameter *ttp = tp->isTemplateThisParameter(); ++ if (ttp) ++ hasttp = true; ++ } ++ } + { + TypeFunction *tf = (TypeFunction *)fd->type; + if (tf && tf->ty == Tfunction) +@@ -2343,15 +2704,39 @@ FuncDeclaration *TemplateDeclaration::do + + Scope *sc2; + sc2 = scope->push(ti); +- sc2->parent = /*isnested ? sc->parent :*/ ti; ++ sc2->parent = /*enclosing ? sc->parent :*/ ti; + sc2->tinst = ti; + + { + Scope *sc = sc2; + sc = sc->push(); + ++ if (hasttp) ++ fd->type = fd->type->addMod(tthis->mod); ++ //printf("tthis = %s, fdtype = %s\n", tthis->toChars(), fd->type->toChars()); + if (fd->isCtorDeclaration()) ++ { + sc->flags |= SCOPEctor; ++ ++ Dsymbol *parent = toParent2(); ++ Type *tret; ++ AggregateDeclaration *ad = parent->isAggregateDeclaration(); ++ if (!ad || parent->isUnionDeclaration()) ++ { ++ tret = Type::tvoid; ++ } ++ else ++ { tret = ad->handle; ++ assert(tret); ++ tret = tret->addStorageClass(fd->storage_class | sc->stc); ++ tret = tret->addMod(fd->type->mod); ++ } ++ ((TypeFunction *)fd->type)->next = tret; ++ if (ad && ad->isStructDeclaration()) ++ ((TypeFunction *)fd->type)->isref = 1; ++ //printf("fd->type = %s\n", fd->type->toChars()); ++ } ++ fd->type = fd->type->addSTC(sc->stc); + fd->type = fd->type->semantic(fd->loc, sc); + sc = sc->pop(); + } +@@ -2460,6 +2845,117 @@ char *TemplateDeclaration::toChars() + return (char *)buf.extractData(); + } + ++PROT TemplateDeclaration::prot() ++{ ++ return protection; ++} ++ ++/**************************************************** ++ * Given a new instance tithis of this TemplateDeclaration, ++ * see if there already exists an instance. ++ * If so, return that existing instance. ++ */ ++ ++TemplateInstance *TemplateDeclaration::findExistingInstance(TemplateInstance *tithis, Expressions *fargs) ++{ ++ tithis->fargs = fargs; ++ hash_t hash = tithis->hashCode(); ++ ++ if (!buckets.dim) ++ { ++ buckets.setDim(7); ++ buckets.zero(); ++ } ++ size_t bi = hash % buckets.dim; ++ TemplateInstances *instances = buckets[bi]; ++ if (instances) ++ { ++ for (size_t i = 0; i < instances->dim; i++) ++ { ++ TemplateInstance *ti = (*instances)[i]; ++#if LOG ++ printf("\t%s: checking for match with instance %d (%p): '%s'\n", tithis->toChars(), i, ti, ti->toChars()); ++#endif ++ if (hash == ti->hash && ++ tithis->compare(ti) == 0) ++ { ++ //printf("hash = %p yes %d n = %d\n", hash, instances->dim, numinstances); ++ return ti; ++ } ++ } ++ } ++ //printf("hash = %p no\n", hash); ++ return NULL; // didn't find a match ++} ++ ++/******************************************** ++ * Add instance ti to TemplateDeclaration's table of instances. ++ * Return a handle we can use to later remove it if it fails instantiation. ++ */ ++ ++TemplateInstance *TemplateDeclaration::addInstance(TemplateInstance *ti) ++{ ++ /* See if we need to rehash ++ */ ++ if (numinstances > buckets.dim * 4) ++ { // rehash ++ //printf("rehash\n"); ++ size_t newdim = buckets.dim * 2 + 1; ++ TemplateInstances **newp = (TemplateInstances **)::calloc(newdim, sizeof(TemplateInstances *)); ++ assert(newp); ++ for (size_t bi = 0; bi < buckets.dim; ++bi) ++ { ++ TemplateInstances *instances = buckets[bi]; ++ if (instances) ++ { ++ for (size_t i = 0; i < instances->dim; i++) ++ { ++ TemplateInstance *ti1 = (*instances)[i]; ++ size_t newbi = ti1->hash % newdim; ++ TemplateInstances *newinstances = newp[newbi]; ++ if (!newinstances) ++ newp[newbi] = newinstances = new TemplateInstances(); ++ newinstances->push(ti1); ++ } ++ delete instances; ++ } ++ } ++ buckets.setDim(newdim); ++ memcpy(buckets.tdata(), newp, newdim * sizeof(TemplateInstance *)); ++ ::free(newp); ++ } ++ ++ // Insert ti into hash table ++ size_t bi = ti->hash % buckets.dim; ++ TemplateInstances *instances = buckets[bi]; ++ if (!instances) ++ buckets[bi] = instances = new TemplateInstances(); ++ instances->push(ti); ++ ++numinstances; ++ return ti; ++} ++ ++/******************************************* ++ * Remove TemplateInstance from table of instances. ++ * Input: ++ * handle returned by addInstance() ++ */ ++ ++void TemplateDeclaration::removeInstance(TemplateInstance *handle) ++{ ++ size_t bi = handle->hash % buckets.dim; ++ TemplateInstances *instances = buckets[bi]; ++ for (size_t i = 0; i < instances->dim; i++) ++ { ++ TemplateInstance *ti = (*instances)[i]; ++ if (handle == ti) ++ { instances->remove(i); ++ break; ++ } ++ } ++ --numinstances; ++} ++ + /* ======================== Type ============================================ */ + + /**** +@@ -2484,10 +2980,7 @@ size_t templateParameterLookup(Type *tpa + { + TypeIdentifier *tident = (TypeIdentifier *)tparam; + //printf("\ttident = '%s'\n", tident->toChars()); +- if (tident->idents.dim == 0) +- { +- return templateIdentifierLookup(tident->ident, parameters); +- } ++ return templateIdentifierLookup(tident->ident, parameters); + } + return IDX_NOTFOUND; + } +@@ -2549,6 +3042,63 @@ MATCH Type::deduceType(Scope *sc, Type * + + TemplateParameter *tp = (*parameters)[i]; + ++ TypeIdentifier *tident = (TypeIdentifier *)tparam; ++ if (tident->idents.dim > 0) ++ { ++ //printf("matching %s to %s\n", tparam->toChars(), toChars()); ++ Dsymbol *s = this->toDsymbol(sc); ++ for (size_t j = tident->idents.dim; j-- > 0; ) ++ { ++ RootObject *id = tident->idents[j]; ++ if (id->dyncast() == DYNCAST_IDENTIFIER) ++ { ++ if (!s || !s->parent) ++ goto Lnomatch; ++ Dsymbol *s2 = s->parent->searchX(Loc(), sc, id); ++ if (!s2) ++ goto Lnomatch; ++ s2 = s2->toAlias(); ++ //printf("[%d] s = %s %s, s2 = %s %s\n", j, s->kind(), s->toChars(), s2->kind(), s2->toChars()); ++ if (s != s2) ++ { ++ if (Type *t = s2->getType()) ++ { ++ if (s != t->toDsymbol(sc)) ++ goto Lnomatch; ++ } ++ else ++ goto Lnomatch; ++ } ++ s = s->parent; ++ } ++ else ++ goto Lnomatch; ++ } ++ //printf("[e] s = %s\n", s?s->toChars():"(null)"); ++ if (TemplateTypeParameter *ttp = tp->isTemplateTypeParameter()) ++ { ++ Type *tt = s->getType(); ++ if (!tt) ++ goto Lnomatch; ++ Type *at = (Type *)(*dedtypes)[i]; ++ if (!at || tt->equals(at)) ++ { ++ (*dedtypes)[i] = tt; ++ goto Lexact; ++ } ++ } ++ if (TemplateAliasParameter *tap = tp->isTemplateAliasParameter()) ++ { ++ Dsymbol *s2 = (Dsymbol *)(*dedtypes)[i]; ++ if (!s2 || s == s2) ++ { ++ (*dedtypes)[i] = s; ++ goto Lexact; ++ } ++ } ++ goto Lnomatch; ++ } ++ + // Found the corresponding parameter tp + if (!tp->isTemplateTypeParameter()) + goto Lnomatch; +@@ -2624,31 +3174,31 @@ MATCH Type::deduceType(Scope *sc, Type * + case X(0, MODconst | MODshared): + case X(0, MODwild): + case X(0, MODwild | MODshared): +- // foo(U:U) T => T +- // foo(U:U) const(T) => const(T) +- // foo(U:U) immutable(T) => immutable(T) +- // foo(U:U) shared(T) => shared(T) +- // foo(U:U) const(shared(T)) => const(shared(T)) +- // foo(U:U) wild(T) => wild(T) +- // foo(U:U) wild(shared(T)) => wild(shared(T)) ++ // foo(U:U) T => T ++ // foo(U:U) const(T) => const(T) ++ // foo(U:U) immutable(T) => immutable(T) ++ // foo(U:U) shared(T) => shared(T) ++ // foo(U:U) const(shared(T)) => const(shared(T)) ++ // foo(U:U) wild(T) => wild(T) ++ // foo(U:U) wild(shared(T)) => wild(shared(T)) + if (!at) + { (*dedtypes)[i] = tt; + goto Lexact; + } + break; + +- case X(MODconst, MODconst): +- case X(MODimmutable, MODimmutable): +- case X(MODshared, MODshared): ++ case X(MODconst, MODconst): ++ case X(MODimmutable, MODimmutable): ++ case X(MODshared, MODshared): + case X(MODconst | MODshared, MODconst | MODshared): +- case X(MODwild, MODwild): +- case X(MODwild | MODshared, MODwild | MODshared): +- // foo(U:const(U)) const(T) => T +- // foo(U:immutable(U)) immutable(T) => T +- // foo(U:shared(U)) shared(T) => T +- // foo(U:const(shared(U)) const(shared(T)) => T +- // foo(U:wild(U)) wild(T) => T +- // foo(U:wild(shared(U)) wild(shared(T)) => T ++ case X(MODwild, MODwild): ++ case X(MODwild | MODshared, MODwild | MODshared): ++ // foo(U:const(U)) const(T) => T ++ // foo(U:immutable(U)) immutable(T) => T ++ // foo(U:shared(U)) shared(T) => T ++ // foo(U:const(shared(U))) const(shared(T)) => T ++ // foo(U:wild(U)) wild(T) => T ++ // foo(U:wild(shared(U))) wild(shared(T)) => T + tt = mutableOf()->unSharedOf(); + if (!at) + { (*dedtypes)[i] = tt; +@@ -2656,17 +3206,17 @@ MATCH Type::deduceType(Scope *sc, Type * + } + break; + +- case X(MODconst, 0): +- case X(MODconst, MODimmutable): +- case X(MODconst, MODconst | MODshared): ++ case X(MODconst, 0): ++ case X(MODconst, MODimmutable): ++ case X(MODconst, MODconst | MODshared): + case X(MODconst | MODshared, MODimmutable): +- case X(MODconst, MODwild): +- case X(MODconst, MODwild | MODshared): +- // foo(U:const(U)) T => T +- // foo(U:const(U)) immutable(T) => T +- // foo(U:const(U)) const(shared(T)) => shared(T) +- // foo(U:const(shared(U)) immutable(T) => T +- // foo(U:const(U)) wild(shared(T)) => shared(T) ++ case X(MODconst, MODwild): ++ case X(MODconst, MODwild | MODshared): ++ // foo(U:const(U)) T => T ++ // foo(U:const(U)) immutable(T) => T ++ // foo(U:const(U)) const(shared(T)) => shared(T) ++ // foo(U:const(shared(U))) immutable(T) => T ++ // foo(U:const(U)) wild(shared(T)) => shared(T) + tt = mutableOf(); + if (!at) + { (*dedtypes)[i] = tt; +@@ -2674,12 +3224,12 @@ MATCH Type::deduceType(Scope *sc, Type * + } + break; + +- case X(MODshared, MODconst | MODshared): ++ case X(MODshared, MODconst | MODshared): + case X(MODconst | MODshared, MODshared): +- case X(MODshared, MODwild | MODshared): +- // foo(U:shared(U)) const(shared(T)) => const(T) +- // foo(U:const(shared(U)) shared(T) => T +- // foo(U:shared(U)) wild(shared(T)) => wild(T) ++ case X(MODshared, MODwild | MODshared): ++ // foo(U:shared(U)) const(shared(T)) => const(T) ++ // foo(U:const(shared(U))) shared(T) => T ++ // foo(U:shared(U)) wild(shared(T)) => wild(T) + tt = unSharedOf(); + if (!at) + { (*dedtypes)[i] = tt; +@@ -2688,7 +3238,7 @@ MATCH Type::deduceType(Scope *sc, Type * + break; + + case X(MODconst, MODshared): +- // foo(U:const(U)) shared(T) => shared(T) ++ // foo(U:const(U)) shared(T) => shared(T) + if (!at) + { (*dedtypes)[i] = tt; + goto Lconst; +@@ -2721,34 +3271,33 @@ MATCH Type::deduceType(Scope *sc, Type * + case X(MODimmutable, MODwild | MODshared): + case X(MODconst | MODshared, MODwild | MODshared): + case X(MODwild, MODwild | MODshared): +- +- // foo(U:immutable(U)) T => nomatch +- // foo(U:immutable(U)) const(T) => nomatch +- // foo(U:immutable(U)) shared(T) => nomatch +- // foo(U:immutable(U)) const(shared(T)) => nomatch +- // foo(U:const(U)) shared(T) => nomatch +- // foo(U:shared(U)) T => nomatch +- // foo(U:shared(U)) const(T) => nomatch +- // foo(U:shared(U)) immutable(T) => nomatch +- // foo(U:const(shared(U)) T => nomatch +- // foo(U:const(shared(U)) const(T) => nomatch +- // foo(U:immutable(U)) wild(T) => nomatch +- // foo(U:shared(U)) wild(T) => nomatch +- // foo(U:const(shared(U)) wild(T) => nomatch +- // foo(U:wild(U)) T => nomatch +- // foo(U:wild(U)) const(T) => nomatch +- // foo(U:wild(U)) immutable(T) => nomatch +- // foo(U:wild(U)) shared(T) => nomatch +- // foo(U:wild(U)) const(shared(T)) => nomatch +- // foo(U:wild(shared(U)) T => nomatch +- // foo(U:wild(shared(U)) const(T) => nomatch +- // foo(U:wild(shared(U)) immutable(T) => nomatch +- // foo(U:wild(shared(U)) shared(T) => nomatch +- // foo(U:wild(shared(U)) const(shared(T)) => nomatch +- // foo(U:wild(shared(U)) wild(T) => nomatch +- // foo(U:immutable(U)) wild(shared(T)) => nomatch +- // foo(U:const(shared(U))) wild(shared(T)) => nomatch +- // foo(U:wild(U)) wild(shared(T)) => nomatch ++ // foo(U:immutable(U)) T => nomatch ++ // foo(U:immutable(U)) const(T) => nomatch ++ // foo(U:immutable(U)) shared(T) => nomatch ++ // foo(U:immutable(U)) const(shared(T)) => nomatch ++ // foo(U:const(U)) shared(T) => nomatch ++ // foo(U:shared(U)) T => nomatch ++ // foo(U:shared(U)) const(T) => nomatch ++ // foo(U:shared(U)) immutable(T) => nomatch ++ // foo(U:const(shared(U))) T => nomatch ++ // foo(U:const(shared(U))) const(T) => nomatch ++ // foo(U:immutable(U)) wild(T) => nomatch ++ // foo(U:shared(U)) wild(T) => nomatch ++ // foo(U:const(shared(U))) wild(T) => nomatch ++ // foo(U:wild(U)) T => nomatch ++ // foo(U:wild(U)) const(T) => nomatch ++ // foo(U:wild(U)) immutable(T) => nomatch ++ // foo(U:wild(U)) shared(T) => nomatch ++ // foo(U:wild(U)) const(shared(T)) => nomatch ++ // foo(U:wild(shared(U))) T => nomatch ++ // foo(U:wild(shared(U))) const(T) => nomatch ++ // foo(U:wild(shared(U))) immutable(T) => nomatch ++ // foo(U:wild(shared(U))) shared(T) => nomatch ++ // foo(U:wild(shared(U))) const(shared(T)) => nomatch ++ // foo(U:wild(shared(U))) wild(T) => nomatch ++ // foo(U:immutable(U)) wild(shared(T)) => nomatch ++ // foo(U:const(shared(U))) wild(shared(T)) => nomatch ++ // foo(U:wild(U)) wild(shared(T)) => nomatch + //if (!at) + goto Lnomatch; + break; +@@ -2807,7 +3356,12 @@ MATCH Type::deduceType(Scope *sc, Type * + } + + if (nextOf()) ++ { ++ if (tparam->deco && !tparam->hasWild()) ++ return implicitConvTo(tparam); ++ + return nextOf()->deduceType(sc, tparam->nextOf(), parameters, dedtypes, wildmatch); ++ } + + Lexact: + return MATCHexact; +@@ -2899,24 +3453,9 @@ MATCH TypeSArray::deduceType(Scope *sc, + size_t i = templateIdentifierLookup(id, parameters); + if (i == IDX_NOTFOUND) + goto Lnomatch; +- TemplateParameter *tprm = (*parameters)[i]; +- TemplateValueParameter *tvp = tprm->isTemplateValueParameter(); +- if (!tvp) ++ TemplateParameter *tp = (*parameters)[i]; ++ if (!tp->matchArg(sc, dim, i, parameters, dedtypes, NULL)) + goto Lnomatch; +- Expression *e = (Expression *)(*dedtypes)[i]; +- if (e) +- { +- if (!dim->equals(e)) +- goto Lnomatch; +- } +- else +- { +- Type *vt = tvp->valType->semantic(0, sc); +- MATCH m = (MATCH)dim->implicitConvTo(vt); +- if (!m) +- goto Lnomatch; +- (*dedtypes)[i] = dim; +- } + return next->deduceType(sc, tparam->nextOf(), parameters, dedtypes, wildmatch); + } + } +@@ -3008,7 +3547,7 @@ MATCH TypeFunction::deduceType(Scope *sc + + /* See if existing tuple, and whether it matches or not + */ +- Object *o = (*dedtypes)[tupi]; ++ RootObject *o = (*dedtypes)[tupi]; + if (o) + { // Existing deduced argument must be a tuple, and must match + Tuple *t = isTuple(o); +@@ -3059,8 +3598,8 @@ MATCH TypeIdentifier::deduceType(Scope * + + for (size_t i = 0; i < idents.dim; i++) + { +- Identifier *id1 = idents[i]; +- Identifier *id2 = tp->idents[i]; ++ RootObject *id1 = idents[i]; ++ RootObject *id2 = tp->idents[i]; + + if (!id1->equals(id2)) + return MATCHnomatch; +@@ -3078,13 +3617,15 @@ MATCH TypeInstance::deduceType(Scope *sc + printf("\tthis = %d, ", ty); print(); + printf("\ttparam = %d, ", tparam->ty); tparam->print(); + #endif ++ TemplateDeclaration *tempdecl = tempinst->tempdecl->isTemplateDeclaration(); ++ assert(tempdecl); + + // Extra check + if (tparam && tparam->ty == Tinstance) + { + TypeInstance *tp = (TypeInstance *)tparam; + +- //printf("tempinst->tempdecl = %p\n", tempinst->tempdecl); ++ //printf("tempinst->tempdecl = %p\n", tempdecl); + //printf("tp->tempinst->tempdecl = %p\n", tp->tempinst->tempdecl); + if (!tp->tempinst->tempdecl) + { //printf("tp->tempinst->name = '%s'\n", tp->tempinst->name->toChars()); +@@ -3098,11 +3639,11 @@ MATCH TypeInstance::deduceType(Scope *sc + { /* Didn't find it as a parameter identifier. Try looking + * it up and seeing if is an alias. See Bugzilla 1454 + */ +- TypeIdentifier *tid = new TypeIdentifier(0, tp->tempinst->name); ++ TypeIdentifier *tid = new TypeIdentifier(Loc(), tp->tempinst->name); + Type *t; + Expression *e; + Dsymbol *s; +- tid->resolve(0, sc, &e, &t, &s); ++ tid->resolve(Loc(), sc, &e, &t, &s); + if (t) + { + s = t->toDsymbol(sc); +@@ -3115,32 +3656,17 @@ MATCH TypeInstance::deduceType(Scope *sc + { + s = s->toAlias(); + TemplateDeclaration *td = s->isTemplateDeclaration(); +- if (td && td == tempinst->tempdecl) ++ if (td && td == tempdecl) + goto L2; + } + goto Lnomatch; + } + TemplateParameter *tpx = (*parameters)[i]; +- // This logic duplicates tpx->matchArg() +- TemplateAliasParameter *ta = tpx->isTemplateAliasParameter(); +- if (!ta) +- goto Lnomatch; +- Object *sa = tempinst->tempdecl; +- if (!sa) ++ if (!tpx->matchArg(sc, tempdecl, i, parameters, dedtypes, NULL)) + goto Lnomatch; +- if (ta->specAlias && sa != ta->specAlias) +- goto Lnomatch; +- if ((*dedtypes)[i]) +- { // Must match already deduced symbol +- Object *s = (*dedtypes)[i]; +- +- if (s != sa) +- goto Lnomatch; +- } +- (*dedtypes)[i] = sa; + } + } +- else if (tempinst->tempdecl != tp->tempinst->tempdecl) ++ else if (tempdecl != tp->tempinst->tempdecl) + goto Lnomatch; + + L2: +@@ -3148,7 +3674,7 @@ MATCH TypeInstance::deduceType(Scope *sc + for (size_t i = 0; 1; i++) + { + //printf("\ttest: tempinst->tiargs[%d]\n", i); +- Object *o1 = NULL; ++ RootObject *o1 = NULL; + if (i < tempinst->tiargs->dim) + o1 = (*tempinst->tiargs)[i]; + else if (i < tempinst->tdtypes.dim && i < tp->tempinst->tiargs->dim) +@@ -3160,7 +3686,7 @@ MATCH TypeInstance::deduceType(Scope *sc + if (i >= tp->tempinst->tiargs->dim) + goto Lnomatch; + +- Object *o2 = (*tp->tempinst->tiargs)[i]; ++ RootObject *o2 = (*tp->tempinst->tiargs)[i]; + Type *t2 = isType(o2); + + size_t j; +@@ -3181,12 +3707,12 @@ MATCH TypeInstance::deduceType(Scope *sc + /* Create tuple from remaining args + */ + Tuple *vt = new Tuple(); +- size_t vtdim = (tempinst->tempdecl->isVariadic() ++ size_t vtdim = (tempdecl->isVariadic() + ? tempinst->tiargs->dim : tempinst->tdtypes.dim) - i; + vt->objects.setDim(vtdim); + for (size_t k = 0; k < vtdim; k++) + { +- Object *o; ++ RootObject *o; + if (k < tempinst->tiargs->dim) + o = (*tempinst->tiargs)[i + k]; + else // Pick up default arg +@@ -3197,7 +3723,9 @@ MATCH TypeInstance::deduceType(Scope *sc + Tuple *v = (Tuple *)(*dedtypes)[j]; + if (v) + { +- if (!match(v, vt, tempinst->tempdecl, sc)) ++ if (checkRecursiveExpansion(v, tempdecl, sc)) ++ goto Lnomatch; ++ if (!match(v, vt)) + goto Lnomatch; + } + else +@@ -3234,19 +3762,29 @@ MATCH TypeInstance::deduceType(Scope *sc + { + Le: + e1 = e1->ctfeInterpret(); ++ ++ /* If it is one of the template parameters for this template, ++ * we should not attempt to interpret it. It already has a value. ++ */ ++ if (e2->op == TOKvar && ++ (((VarExp *)e2)->var->storage_class & STCtemplateparameter)) ++ { ++ /* ++ * (T:Number!(e2), int e2) ++ */ ++ j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters); ++ if (j != IDX_NOTFOUND) ++ goto L1; ++ // The template parameter was not from this template ++ // (it may be from a parent template, for example) ++ } ++ + e2 = e2->ctfeInterpret(); + + //printf("e1 = %s, type = %s %d\n", e1->toChars(), e1->type->toChars(), e1->type->ty); + //printf("e2 = %s, type = %s %d\n", e2->toChars(), e2->type->toChars(), e2->type->ty); + if (!e1->equals(e2)) +- { if (e2->op == TOKvar) +- { +- /* +- * (T:Number!(e2), int e2) +- */ +- j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters); +- goto L1; +- } ++ { + if (!e2->implicitConvTo(e1->type)) + goto Lnomatch; + +@@ -3268,35 +3806,7 @@ MATCH TypeInstance::deduceType(Scope *sc + goto Lnomatch; + } + TemplateParameter *tp = (*parameters)[j]; +- // BUG: use tp->matchArg() instead of the following +- TemplateValueParameter *tv = tp->isTemplateValueParameter(); +- TemplateAliasParameter *ta = tp->isTemplateAliasParameter(); +- if (tv) +- { +- Expression *e = (Expression *)(*dedtypes)[j]; +- if (e) +- { +- if (!e1->equals(e)) +- goto Lnomatch; +- } +- else +- { Type *vt = tv->valType->semantic(0, sc); +- MATCH m = (MATCH)e1->implicitConvTo(vt); +- if (!m) +- goto Lnomatch; +- (*dedtypes)[j] = e1; +- } +- } +- else if (ta) +- { +- if (ta->specType) +- { +- if (!e1->type->equals(ta->specType)) +- goto Lnomatch; +- } +- (*dedtypes)[j] = e1; +- } +- else ++ if (!tp->matchArg(sc, e1, j, parameters, dedtypes, NULL)) + goto Lnomatch; + } + else if (s1 && s2) +@@ -3316,20 +3826,8 @@ MATCH TypeInstance::deduceType(Scope *sc + goto Lnomatch; + } + TemplateParameter *tp = (*parameters)[j]; +- // BUG: use tp->matchArg() instead of the following +- TemplateAliasParameter *ta = tp->isTemplateAliasParameter(); +- if (!ta) ++ if (!tp->matchArg(sc, s1, j, parameters, dedtypes, NULL)) + goto Lnomatch; +- Dsymbol *s = (Dsymbol *)(*dedtypes)[j]; +- if (s) +- { +- if (!s1->equals(s)) +- goto Lnomatch; +- } +- else +- { +- (*dedtypes)[j] = s1; +- } + } + else + goto Lnomatch; +@@ -3358,7 +3856,7 @@ MATCH TypeStruct::deduceType(Scope *sc, + { + if (ti && ti->toAlias() == sym) + { +- TypeInstance *t = new TypeInstance(0, ti); ++ TypeInstance *t = new TypeInstance(Loc(), ti); + return t->deduceType(sc, tparam, parameters, dedtypes, wildmatch); + } + +@@ -3367,8 +3865,8 @@ MATCH TypeStruct::deduceType(Scope *sc, + */ + TypeInstance *tpi = (TypeInstance *)tparam; + if (tpi->idents.dim) +- { Identifier *id = tpi->idents[tpi->idents.dim - 1]; +- if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id)) ++ { RootObject *id = tpi->idents[tpi->idents.dim - 1]; ++ if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals((Identifier *)id)) + { + Type *tparent = sym->parent->getType(); + if (tparent) +@@ -3405,6 +3903,12 @@ MATCH TypeEnum::deduceType(Scope *sc, Ty + if (sym != tp->sym) + return MATCHnomatch; + } ++ Type *tb = toBasetype(); ++ if (tb->ty == tparam->ty || ++ tb->ty == Tsarray && tparam->ty == Taarray) ++ { ++ return tb->deduceType(sc, tparam, parameters, dedtypes, wildmatch); ++ } + return Type::deduceType(sc, tparam, parameters, dedtypes, wildmatch); + } + +@@ -3451,7 +3955,7 @@ void deduceBaseClassParameters(BaseClass + tmpdedtypes->setDim(dedtypes->dim); + memcpy(tmpdedtypes->tdata(), dedtypes->tdata(), dedtypes->dim * sizeof(void *)); + +- TypeInstance *t = new TypeInstance(0, parti); ++ TypeInstance *t = new TypeInstance(Loc(), parti); + MATCH m = t->deduceType(sc, tparam, parameters, tmpdedtypes); + if (m != MATCHnomatch) + { +@@ -3492,7 +3996,7 @@ MATCH TypeClass::deduceType(Scope *sc, T + { + if (ti && ti->toAlias() == sym) + { +- TypeInstance *t = new TypeInstance(0, ti); ++ TypeInstance *t = new TypeInstance(Loc(), ti); + MATCH m = t->deduceType(sc, tparam, parameters, dedtypes, wildmatch); + // Even if the match fails, there is still a chance it could match + // a base class. +@@ -3505,8 +4009,8 @@ MATCH TypeClass::deduceType(Scope *sc, T + */ + TypeInstance *tpi = (TypeInstance *)tparam; + if (tpi->idents.dim) +- { Identifier *id = tpi->idents[tpi->idents.dim - 1]; +- if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id)) ++ { RootObject *id = tpi->idents[tpi->idents.dim - 1]; ++ if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals((Identifier *)id)) + { + Type *tparent = sym->parent->getType(); + if (tparent) +@@ -3610,6 +4114,45 @@ TemplateThisParameter *TemplateParamete + } + #endif + ++/******************************************* ++ * Match to a particular TemplateParameter. ++ * Input: ++ * i i'th argument ++ * tiargs[] actual arguments to template instance ++ * parameters[] template parameters ++ * dedtypes[] deduced arguments to template instance ++ * *psparam set to symbol declared and initialized to dedtypes[i] ++ */ ++ ++MATCH TemplateParameter::matchArg(Loc loc, Scope *sc, Objects *tiargs, ++ size_t i, TemplateParameters *parameters, Objects *dedtypes, ++ Declaration **psparam) ++{ ++ RootObject *oarg; ++ ++ if (i < tiargs->dim) ++ oarg = (*tiargs)[i]; ++ else ++ { ++ // Get default argument instead ++ oarg = defaultArg(loc, sc); ++ if (!oarg) ++ { ++ assert(i < dedtypes->dim); ++ // It might have already been deduced ++ oarg = (*dedtypes)[i]; ++ if (!oarg) ++ goto Lnomatch; ++ } ++ } ++ return matchArg(sc, oarg, i, parameters, dedtypes, psparam); ++ ++Lnomatch: ++ if (psparam) ++ *psparam = NULL; ++ return MATCHnomatch; ++} ++ + /* ======================== TemplateTypeParameter =========================== */ + + // type-parameter +@@ -3649,10 +4192,10 @@ void TemplateTypeParameter::declareParam + error(loc, "parameter '%s' multiply defined", ident->toChars()); + } + +-void TemplateTypeParameter::semantic(Scope *sc) ++void TemplateTypeParameter::semantic(Scope *sc, TemplateParameters *parameters) + { + //printf("TemplateTypeParameter::semantic('%s')\n", ident->toChars()); +- if (specType) ++ if (specType && !specType->reliesOnTident(parameters)) + { + specType = specType->semantic(loc, sc); + } +@@ -3691,42 +4234,13 @@ Lnomatch: + return 0; + } + +-/******************************************* +- * Match to a particular TemplateParameter. +- * Input: +- * i i'th argument +- * tiargs[] actual arguments to template instance +- * parameters[] template parameters +- * dedtypes[] deduced arguments to template instance +- * *psparam set to symbol declared and initialized to dedtypes[i] +- */ +- +-MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs, ++MATCH TemplateTypeParameter::matchArg(Scope *sc, RootObject *oarg, + size_t i, TemplateParameters *parameters, Objects *dedtypes, + Declaration **psparam) + { + //printf("TemplateTypeParameter::matchArg()\n"); +- Object *oarg; + MATCH m = MATCHexact; +- Type *ta; +- +- if (i < tiargs->dim) +- oarg = (*tiargs)[i]; +- else +- { // Get default argument instead +- oarg = defaultArg(loc, sc); +- if (!oarg) +- { assert(i < dedtypes->dim); +- // It might have already been deduced +- oarg = (*dedtypes)[i]; +- if (!oarg) +- { +- goto Lnomatch; +- } +- } +- } +- +- ta = isType(oarg); ++ Type *ta = isType(oarg); + if (!ta) + { + //printf("%s %p %p %p\n", oarg->toChars(), isExpression(oarg), isDsymbol(oarg), isTuple(oarg)); +@@ -3770,18 +4284,20 @@ MATCH TemplateTypeParameter::matchArg(Sc + } + (*dedtypes)[i] = ta; + +- *psparam = new AliasDeclaration(loc, ident, ta); ++ if (psparam) ++ *psparam = new AliasDeclaration(loc, ident, ta); + //printf("\tm = %d\n", m); + return m; + + Lnomatch: +- *psparam = NULL; ++ if (psparam) ++ *psparam = NULL; + //printf("\tm = %d\n", MATCHnomatch); + return MATCHnomatch; + } + + +-void TemplateTypeParameter::print(Object *oarg, Object *oded) ++void TemplateTypeParameter::print(RootObject *oarg, RootObject *oded) + { + printf(" %s\n", ident->toChars()); + +@@ -3830,13 +4346,13 @@ void *TemplateTypeParameter::dummyArg() + } + + +-Object *TemplateTypeParameter::specialization() ++RootObject *TemplateTypeParameter::specialization() + { + return specType; + } + + +-Object *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc) ++RootObject *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc) + { + Type *t; + +@@ -3890,7 +4406,7 @@ void TemplateThisParameter::toCBuffer(Ou + Dsymbol *TemplateAliasParameter::sdummy = NULL; + + TemplateAliasParameter::TemplateAliasParameter(Loc loc, Identifier *ident, +- Type *specType, Object *specAlias, Object *defaultAlias) ++ Type *specType, RootObject *specAlias, RootObject *defaultAlias) + : TemplateParameter(loc, ident) + { + this->ident = ident; +@@ -3922,13 +4438,13 @@ void TemplateAliasParameter::declarePara + error(loc, "parameter '%s' multiply defined", ident->toChars()); + } + +-Object *aliasParameterSemantic(Loc loc, Scope *sc, Object *o) ++RootObject *aliasParameterSemantic(Loc loc, Scope *sc, RootObject *o, TemplateParameters *parameters) + { + if (o) + { + Expression *ea = isExpression(o); + Type *ta = isType(o); +- if (ta) ++ if (ta && (!parameters || !ta->reliesOnTident(parameters))) + { Dsymbol *s = ta->toDsymbol(sc); + if (s) + o = s; +@@ -3937,20 +4453,22 @@ Object *aliasParameterSemantic(Loc loc, + } + else if (ea) + { ++ sc = sc->startCTFE(); + ea = ea->semantic(sc); ++ sc = sc->endCTFE(); + o = ea->ctfeInterpret(); + } + } + return o; + } + +-void TemplateAliasParameter::semantic(Scope *sc) ++void TemplateAliasParameter::semantic(Scope *sc, TemplateParameters *parameters) + { +- if (specType) ++ if (specType && !specType->reliesOnTident(parameters)) + { + specType = specType->semantic(loc, sc); + } +- specAlias = aliasParameterSemantic(loc, sc, specAlias); ++ specAlias = aliasParameterSemantic(loc, sc, specAlias, parameters); + #if 0 // Don't do semantic() until instantiation + if (defaultAlias) + defaultAlias = defaultAlias->semantic(loc, sc); +@@ -3985,7 +4503,7 @@ Lnomatch: + * } // because Sym template cannot + * void main() { S s; s.foo(); } // access to the valid 'this' symbol. + */ +-bool isPseudoDsymbol(Object *o) ++bool isPseudoDsymbol(RootObject *o) + { + Dsymbol *s = isDsymbol(o); + Expression *e = isExpression(o); +@@ -4012,33 +4530,13 @@ bool isPseudoDsymbol(Object *o) + return false; + } + +-MATCH TemplateAliasParameter::matchArg(Scope *sc, Objects *tiargs, ++MATCH TemplateAliasParameter::matchArg(Scope *sc, RootObject *oarg, + size_t i, TemplateParameters *parameters, Objects *dedtypes, + Declaration **psparam) + { +- Object *sa; +- Object *oarg; +- Expression *ea; +- Dsymbol *s; +- + //printf("TemplateAliasParameter::matchArg()\n"); +- +- if (i < tiargs->dim) +- oarg = (*tiargs)[i]; +- else +- { // Get default argument instead +- oarg = defaultArg(loc, sc); +- if (!oarg) +- { assert(i < dedtypes->dim); +- // It might have already been deduced +- oarg = (*dedtypes)[i]; +- if (!oarg) +- goto Lnomatch; +- } +- } +- +- sa = getDsymbol(oarg); +- ea = isExpression(oarg); ++ RootObject *sa = getDsymbol(oarg); ++ Expression *ea = isExpression(oarg); + if (ea && (ea->op == TOKthis || ea->op == TOKsuper)) + sa = ((ThisExp *)ea)->var; + else if (ea && ea->op == TOKimport) +@@ -4080,7 +4578,7 @@ MATCH TemplateAliasParameter::matchArg(S + Type *ta = isType(specAlias); + if (!ti || !ta) + goto Lnomatch; +- Type *t = new TypeInstance(0, ti); ++ Type *t = new TypeInstance(Loc(), ti); + MATCH m = t->deduceType(sc, ta, parameters, dedtypes); + if (m == MATCHnomatch) + goto Lnomatch; +@@ -4088,37 +4586,42 @@ MATCH TemplateAliasParameter::matchArg(S + } + else if ((*dedtypes)[i]) + { // Must match already deduced symbol +- Object *si = (*dedtypes)[i]; ++ RootObject *si = (*dedtypes)[i]; + + if (!sa || si != sa) + goto Lnomatch; + } + (*dedtypes)[i] = sa; + +- s = isDsymbol(sa); +- if (s) +- *psparam = new AliasDeclaration(loc, ident, s); +- else ++ if (psparam) + { +- assert(ea); ++ if (Dsymbol *s = isDsymbol(sa)) ++ { ++ *psparam = new AliasDeclaration(loc, ident, s); ++ } ++ else ++ { ++ assert(ea); + +- // Declare manifest constant +- Initializer *init = new ExpInitializer(loc, ea); +- VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init); +- v->storage_class = STCmanifest; +- v->semantic(sc); +- *psparam = v; ++ // Declare manifest constant ++ Initializer *init = new ExpInitializer(loc, ea); ++ VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init); ++ v->storage_class = STCmanifest; ++ v->semantic(sc); ++ *psparam = v; ++ } + } + return MATCHexact; + + Lnomatch: +- *psparam = NULL; ++ if (psparam) ++ *psparam = NULL; + //printf("\tm = %d\n", MATCHnomatch); + return MATCHnomatch; + } + + +-void TemplateAliasParameter::print(Object *oarg, Object *oded) ++void TemplateAliasParameter::print(RootObject *oarg, RootObject *oded) + { + printf(" %s\n", ident->toChars()); + +@@ -4151,7 +4654,7 @@ void TemplateAliasParameter::toCBuffer(O + + + void *TemplateAliasParameter::dummyArg() +-{ Object *s; ++{ RootObject *s; + + s = specAlias; + if (!s) +@@ -4164,15 +4667,15 @@ void *TemplateAliasParameter::dummyArg() + } + + +-Object *TemplateAliasParameter::specialization() ++RootObject *TemplateAliasParameter::specialization() + { + return specAlias; + } + + +-Object *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc) ++RootObject *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc) + { +- Object *da = defaultAlias; ++ RootObject *da = defaultAlias; + Type *ta = isType(defaultAlias); + if (ta) + { +@@ -4183,7 +4686,7 @@ Object *TemplateAliasParameter::defaultA + } + } + +- Object *o = aliasParameterSemantic(loc, sc, da); ++ RootObject *o = aliasParameterSemantic(loc, sc, da, NULL); + return o; + } + +@@ -4229,7 +4732,7 @@ void TemplateValueParameter::declarePara + sparam = v; + } + +-void TemplateValueParameter::semantic(Scope *sc) ++void TemplateValueParameter::semantic(Scope *sc, TemplateParameters *parameters) + { + bool wasSame = (sparam->type == valType); + sparam->semantic(sc); +@@ -4251,9 +4754,11 @@ void TemplateValueParameter::semantic(Sc + + #if 0 // defer semantic analysis to arg match + if (specValue) +- { Expression *e = specValue; +- ++ { ++ Expression *e = specValue; ++ sc = sc->startCTFE(); + e = e->semantic(sc); ++ sc = sc->endCTFE(); + e = e->implicitCastTo(sc, valType); + e = e->ctfeInterpret(); + if (e->op == TOKint64 || e->op == TOKfloat64 || +@@ -4263,9 +4768,11 @@ void TemplateValueParameter::semantic(Sc + } + + if (defaultValue) +- { Expression *e = defaultValue; +- ++ { ++ Expression *e = defaultValue; ++ sc = sc->startCTFE(); + e = e->semantic(sc); ++ sc = sc->endCTFE(); + e = e->implicitCastTo(sc, valType); + e = e->ctfeInterpret(); + if (e->op == TOKint64) +@@ -4297,34 +4804,15 @@ Lnomatch: + return 0; + } + +- +-MATCH TemplateValueParameter::matchArg(Scope *sc, +- Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, ++MATCH TemplateValueParameter::matchArg(Scope *sc, RootObject *oarg, ++ size_t i, TemplateParameters *parameters, Objects *dedtypes, + Declaration **psparam) + { + //printf("TemplateValueParameter::matchArg()\n"); + +- Initializer *init; +- Declaration *sparam; + MATCH m = MATCHexact; +- Expression *ei; +- Object *oarg; +- +- if (i < tiargs->dim) +- oarg = (*tiargs)[i]; +- else +- { // Get default argument instead +- oarg = defaultArg(loc, sc); +- if (!oarg) +- { assert(i < dedtypes->dim); +- // It might have already been deduced +- oarg = (*dedtypes)[i]; +- if (!oarg) +- goto Lnomatch; +- } +- } + +- ei = isExpression(oarg); ++ Expression *ei = isExpression(oarg); + Type *vt; + + if (!ei && oarg) +@@ -4337,6 +4825,11 @@ MATCH TemplateValueParameter::matchArg(S + ei = ei->semantic(sc); + if (!f->needThis()) + ei = resolveProperties(sc, ei); ++ /* If it was really a property, it will become a CallExp. ++ * If it stayed as a var, it cannot be interpreted. ++ */ ++ if (ei->op == TOKvar) ++ goto Lnomatch; + ei = ei->ctfeInterpret(); + } + else +@@ -4349,7 +4842,7 @@ MATCH TemplateValueParameter::matchArg(S + } + + //printf("\tvalType: %s, ty = %d\n", valType->toChars(), valType->ty); +- vt = valType->semantic(0, sc); ++ vt = valType->semantic(loc, sc); + //printf("ei: %s, ei->type: %s\n", ei->toChars(), ei->type->toChars()); + //printf("vt = %s\n", vt->toChars()); + +@@ -4359,6 +4852,11 @@ MATCH TemplateValueParameter::matchArg(S + //printf("m: %d\n", m); + if (!m) + goto Lnomatch; ++ if (m != MATCHexact) ++ { ++ ei = ei->implicitCastTo(sc, vt); ++ ei = ei->ctfeInterpret(); ++ } + } + + if (specValue) +@@ -4368,13 +4866,17 @@ MATCH TemplateValueParameter::matchArg(S + + Expression *e = specValue; + ++ sc = sc->startCTFE(); + e = e->semantic(sc); + e = resolveProperties(sc, e); ++ sc = sc->endCTFE(); + e = e->implicitCastTo(sc, vt); + e = e->ctfeInterpret(); + + ei = ei->syntaxCopy(); ++ sc = sc->startCTFE(); + ei = ei->semantic(sc); ++ sc = sc->endCTFE(); + ei = ei->implicitCastTo(sc, vt); + ei = ei->ctfeInterpret(); + //printf("\tei: %s, %s\n", ei->toChars(), ei->type->toChars()); +@@ -4391,28 +4893,27 @@ MATCH TemplateValueParameter::matchArg(S + if (!ei || !ei->equals(e)) + goto Lnomatch; + } +- else if (m != MATCHexact) +- { +- ei = ei->implicitCastTo(sc, vt); +- ei = ei->ctfeInterpret(); +- } + } + (*dedtypes)[i] = ei; + +- init = new ExpInitializer(loc, ei); +- sparam = new VarDeclaration(loc, vt, ident, init); +- sparam->storage_class = STCmanifest; +- *psparam = sparam; ++ if (psparam) ++ { ++ Initializer *init = new ExpInitializer(loc, ei); ++ Declaration *sparam = new VarDeclaration(loc, vt, ident, init); ++ sparam->storage_class = STCmanifest; ++ *psparam = sparam; ++ } + return m; + + Lnomatch: + //printf("\tno match\n"); +- *psparam = NULL; ++ if (psparam) ++ *psparam = NULL; + return MATCHnomatch; + } + + +-void TemplateValueParameter::print(Object *oarg, Object *oded) ++void TemplateValueParameter::print(RootObject *oarg, RootObject *oded) + { + printf(" %s\n", ident->toChars()); + +@@ -4456,13 +4957,13 @@ void *TemplateValueParameter::dummyArg() + } + + +-Object *TemplateValueParameter::specialization() ++RootObject *TemplateValueParameter::specialization() + { + return specValue; + } + + +-Object *TemplateValueParameter::defaultArg(Loc loc, Scope *sc) ++RootObject *TemplateValueParameter::defaultArg(Loc loc, Scope *sc) + { + Expression *e = defaultValue; + if (e) +@@ -4506,7 +5007,7 @@ void TemplateTupleParameter::declarePara + error(loc, "parameter '%s' multiply defined", ident->toChars()); + } + +-void TemplateTupleParameter::semantic(Scope *sc) ++void TemplateTupleParameter::semantic(Scope *sc, TemplateParameters *parameters) + { + } + +@@ -4522,12 +5023,10 @@ int TemplateTupleParameter::overloadMatc + return 0; + } + +-MATCH TemplateTupleParameter::matchArg(Scope *sc, Objects *tiargs, ++MATCH TemplateTupleParameter::matchArg(Loc loc, Scope *sc, Objects *tiargs, + size_t i, TemplateParameters *parameters, Objects *dedtypes, + Declaration **psparam) + { +- //printf("TemplateTupleParameter::matchArg()\n"); +- + /* The rest of the actual arguments (tiargs[]) form the match + * for the variadic parameter. + */ +@@ -4551,13 +5050,26 @@ MATCH TemplateTupleParameter::matchArg(S + ovar->objects[j] = (*tiargs)[i + j]; + } + } +- *psparam = new TupleDeclaration(loc, ident, &ovar->objects); ++ return matchArg(sc, ovar, i, parameters, dedtypes, psparam); ++} ++ ++MATCH TemplateTupleParameter::matchArg(Scope *sc, RootObject *oarg, ++ size_t i, TemplateParameters *parameters, Objects *dedtypes, ++ Declaration **psparam) ++{ ++ //printf("TemplateTupleParameter::matchArg()\n"); ++ Tuple *ovar = isTuple(oarg); ++ if (!ovar) ++ return MATCHnomatch; + (*dedtypes)[i] = ovar; ++ ++ if (psparam) ++ *psparam = new TupleDeclaration(loc, ident, &ovar->objects); + return MATCHexact; + } + + +-void TemplateTupleParameter::print(Object *oarg, Object *oded) ++void TemplateTupleParameter::print(RootObject *oarg, RootObject *oded) + { + printf(" %s... [", ident->toChars()); + Tuple *v = isTuple(oded); +@@ -4569,7 +5081,7 @@ void TemplateTupleParameter::print(Objec + if (i) + printf(", "); + +- Object *o = v->objects[i]; ++ RootObject *o = v->objects[i]; + + Dsymbol *sa = isDsymbol(o); + if (sa) +@@ -4602,13 +5114,13 @@ void *TemplateTupleParameter::dummyArg() + } + + +-Object *TemplateTupleParameter::specialization() ++RootObject *TemplateTupleParameter::specialization() + { + return NULL; + } + + +-Object *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc) ++RootObject *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc) + { + return NULL; + } +@@ -4625,20 +5137,19 @@ TemplateInstance::TemplateInstance(Loc l + this->name = ident; + this->tiargs = NULL; + this->tempdecl = NULL; ++ this->instantiatingModule = NULL; + this->inst = NULL; + this->tinst = NULL; + this->argsym = NULL; + this->aliasdecl = NULL; +- this->semanticRun = PASSinit; +- this->semantictiargsdone = 0; ++ this->semantictiargsdone = false; + this->withsym = NULL; + this->nest = 0; +-#ifdef IN_GCC +- this->objFileModule = NULL; +-#endif +- this->havetempdecl = 0; +- this->isnested = NULL; +- this->speculative = 0; ++ this->havetempdecl = false; ++ this->enclosing = NULL; ++ this->speculative = false; ++ this->hash = 0; ++ this->fargs = NULL; + } + + /***************** +@@ -4656,22 +5167,21 @@ TemplateInstance::TemplateInstance(Loc l + this->name = td->ident; + this->tiargs = tiargs; + this->tempdecl = td; ++ this->instantiatingModule = NULL; + this->inst = NULL; + this->tinst = NULL; + this->argsym = NULL; + this->aliasdecl = NULL; +- this->semanticRun = PASSinit; +- this->semantictiargsdone = 1; ++ this->semantictiargsdone = true; + this->withsym = NULL; + this->nest = 0; +-#ifdef IN_GCC +- this->objFileModule = NULL; +-#endif +- this->havetempdecl = 1; +- this->isnested = NULL; +- this->speculative = 0; ++ this->havetempdecl = true; ++ this->enclosing = NULL; ++ this->speculative = false; ++ this->hash = 0; ++ this->fargs = NULL; + +- assert((size_t)tempdecl->scope > 0x10000); ++ assert(tempdecl->scope); + } + + +@@ -4700,8 +5210,9 @@ Dsymbol *TemplateInstance::syntaxCopy(Ds + + ti->tiargs = arraySyntaxCopy(tiargs); + +- if (inst) +- tempdecl->ScopeDsymbol::syntaxCopy(ti); ++ TemplateDeclaration *td; ++ if (inst && tempdecl && (td = tempdecl->isTemplateDeclaration()) != NULL) ++ td->ScopeDsymbol::syntaxCopy(ti); + else + ScopeDsymbol::syntaxCopy(ti); + return ti; +@@ -4723,12 +5234,12 @@ void TemplateInstance::expandMembers(Sco + { + Dsymbol *s = (*members)[i]; + //printf("\t[%d] semantic on '%s' %p kind %s in '%s'\n", i, s->toChars(), s, s->kind(), this->toChars()); +- //printf("test: isnested = %d, sc2->parent = %s\n", isnested, sc2->parent->toChars()); +-// if (isnested) ++ //printf("test: enclosing = %d, sc2->parent = %s\n", enclosing, sc2->parent->toChars()); ++// if (enclosing) + // s->parent = sc->parent; +- //printf("test3: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars()); ++ //printf("test3: enclosing = %d, s->parent = %s\n", enclosing, s->parent->toChars()); + s->semantic(sc2); +- //printf("test4: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars()); ++ //printf("test4: enclosing = %d, s->parent = %s\n", enclosing, s->parent->toChars()); + sc2->module->runDeferredSemantic(); + } + } +@@ -4745,27 +5256,7 @@ void TemplateInstance::tryExpandMembers( + fatal(); + } + +-#ifndef IN_GCC +-#if WINDOWS_SEH +- if(nest == 1) +- { +- // do not catch at every nesting level, because generating the output error might cause more stack +- // errors in the __except block otherwise +- __try +- { +- expandMembers(sc2); +- } +- __except (__ehfilter(GetExceptionInformation())) +- { +- global.gag = 0; // ensure error message gets printed +- error("recursive expansion"); +- fatal(); +- } +- } +- else +-#endif +-#endif +- expandMembers(sc2); ++ expandMembers(sc2); + nest--; + } + +@@ -4779,27 +5270,7 @@ void TemplateInstance::trySemantic3(Scop + error("recursive expansion"); + fatal(); + } +-#ifndef IN_GCC +-#if WINDOWS_SEH +- if(nest == 1) +- { +- // do not catch at every nesting level, because generating the output error might cause more stack +- // errors in the __except block otherwise +- __try +- { +- semantic3(sc2); +- } +- __except (__ehfilter(GetExceptionInformation())) +- { +- global.gag = 0; // ensure error message gets printed +- error("recursive expansion"); +- fatal(); +- } +- } +- else +-#endif +-#endif +- semantic3(sc2); ++ semantic3(sc2); + + --nest; + } +@@ -4807,6 +5278,28 @@ void TemplateInstance::trySemantic3(Scop + void TemplateInstance::semantic(Scope *sc, Expressions *fargs) + { + //printf("TemplateInstance::semantic('%s', this=%p, gag = %d, sc = %p)\n", toChars(), this, global.gag, sc); ++#if 0 ++ for (Dsymbol *s = this; s; s = s->parent) ++ { ++ printf("\t%s\n", s->toChars()); ++ } ++ printf("Scope\n"); ++ for (Scope *scx = sc; scx; scx = scx->enclosing) ++ { ++ printf("\t%s parent %s instantiatingModule %p\n", scx->module ? scx->module->toChars() : "null", scx->parent ? scx->parent->toChars() : "null", scx->instantiatingModule); ++ } ++#endif ++ ++ Module *mi = sc->instantiatingModule ? sc->instantiatingModule : sc->module; ++ ++ /* If a TemplateInstance is ever instantiated by non-root modules, ++ * we do not have to generate code for it, ++ * because it will be generated when the non-root module is compiled. ++ */ ++ if (!instantiatingModule || instantiatingModule->isRoot()) ++ instantiatingModule = mi; ++ //printf("mi = %s\n", mi->toChars()); ++ + #if LOG + printf("\n+TemplateInstance::semantic('%s', this=%p)\n", toChars(), this); + #endif +@@ -4835,52 +5328,20 @@ void TemplateInstance::semantic(Scope *s + #if LOG + printf("\tdo semantic\n"); + #endif +- if (havetempdecl) +- { +- assert((size_t)tempdecl->scope > 0x10000); +- // Deduce tdtypes +- tdtypes.setDim(tempdecl->parameters->dim); +- if (!tempdecl->matchWithInstance(this, &tdtypes, fargs, 2)) +- { +- error("incompatible arguments for template instantiation"); +- inst = this; +- return; +- } +- } +- else +- { +- /* Find template declaration first. +- */ +- tempdecl = findTemplateDeclaration(sc); +- if (!tempdecl) +- { if (!sc->parameterSpecialization) +- inst = this; +- //printf("error return %p, %d\n", tempdecl, global.errors); +- return; // error recovery +- } +- +- /* Run semantic on each argument, place results in tiargs[] +- * (if we have tempdecl, then tiargs is already evaluated) +- */ +- semanticTiargs(sc); +- if (arrayObjectIsError(tiargs)) +- { if (!sc->parameterSpecialization) +- inst = this; +- //printf("error return %p, %d\n", tempdecl, global.errors); +- if (inst) +- inst->errors = true; +- return; // error recovery +- } +- +- unsigned errs = global.errors; +- tempdecl = findBestMatch(sc, fargs); +- if (!tempdecl || (errs != global.errors)) +- { if (!sc->parameterSpecialization) +- inst = this; +- //printf("error return %p, %d\n", tempdecl, global.errors); +- return; // error recovery +- } ++ /* Find template declaration first, ++ * then run semantic on each argument (place results in tiargs[]), ++ * last find most specialized template from overload list/set. ++ */ ++ if (!findTemplateDeclaration(sc) || ++ !semanticTiargs(sc) || ++ !findBestMatch(sc, fargs)) ++ { ++ inst = this; ++ inst->errors = true; ++ return; // error recovery + } ++ TemplateDeclaration *tempdecl = this->tempdecl->isTemplateDeclaration(); ++ assert(tempdecl); + + // If tempdecl is a mixin, disallow it + if (tempdecl->ismixin) +@@ -4888,88 +5349,47 @@ void TemplateInstance::semantic(Scope *s + + hasNestedArgs(tiargs); + ++ arrayCheckRecursiveExpansion(&tdtypes, tempdecl, sc); ++ + /* See if there is an existing TemplateInstantiation that already + * implements the typeargs. If so, just refer to that one instead. + */ +- +- for (size_t i = 0; i < tempdecl->instances.dim; i++) + { +- TemplateInstance *ti = tempdecl->instances[i]; +-#if LOG +- printf("\t%s: checking for match with instance %d (%p): '%s'\n", toChars(), i, ti, ti->toChars()); +-#endif +- assert(tdtypes.dim == ti->tdtypes.dim); +- +- // Nesting must match +- if (isnested != ti->isnested) ++ TemplateInstance *ti = tempdecl->findExistingInstance(this, fargs); ++ if (ti) + { +- //printf("test2 isnested %s ti->isnested %s\n", isnested ? isnested->toChars() : "", ti->isnested ? ti->isnested->toChars() : ""); +- continue; +- } +- //printf("parent = %s, ti->parent = %s\n", tempdecl->parent->toPrettyChars(), ti->parent->toPrettyChars()); +- +- if (!arrayObjectMatch(&tdtypes, &ti->tdtypes, tempdecl, sc)) +- goto L1; ++ // It's a match ++ inst = ti; ++ parent = ti->parent; + +- /* Template functions may have different instantiations based on +- * "auto ref" parameters. +- */ +- if (fargs) +- { +- FuncDeclaration *fd = ti->toAlias()->isFuncDeclaration(); +- if (fd) ++ // If both this and the previous instantiation were speculative, ++ // use the number of errors that happened last time. ++ if (inst->speculative && global.gag) + { +- Parameters *fparameters = fd->getParameters(NULL); +- size_t nfparams = Parameter::dim(fparameters); // Num function parameters +- for (size_t j = 0; j < nfparams && j < fargs->dim; j++) +- { Parameter *fparam = Parameter::getNth(fparameters, j); +- Expression *farg = (*fargs)[j]; +- if (fparam->storageClass & STCauto) // if "auto ref" +- { +- if (farg->isLvalue()) +- { if (!(fparam->storageClass & STCref)) +- goto L1; // auto ref's don't match +- } +- else +- { if (fparam->storageClass & STCref) +- goto L1; // auto ref's don't match +- } +- } +- } ++ global.errors += inst->errors; ++ global.gaggedErrors += inst->errors; + } +- } +- +- // It's a match +- inst = ti; +- parent = ti->parent; +- +- // If both this and the previous instantiation were speculative, +- // use the number of errors that happened last time. +- if (inst->speculative && global.gag) +- { +- global.errors += inst->errors; +- global.gaggedErrors += inst->errors; +- } + +- // If the first instantiation was speculative, but this is not: +- if (inst->speculative && !global.gag) +- { +- // If the first instantiation had failed, re-run semantic, +- // so that error messages are shown. +- if (inst->errors) +- goto L1; +- // It had succeeded, mark it is a non-speculative instantiation, +- // and reuse it. +- inst->speculative = 0; +- } ++ // If the first instantiation was speculative, but this is not: ++ if (inst->speculative && !global.gag) ++ { ++ // If the first instantiation had failed, re-run semantic, ++ // so that error messages are shown. ++ if (inst->errors) ++ goto L1; ++ // It had succeeded, mark it is a non-speculative instantiation, ++ // and reuse it. ++ inst->speculative = 0; ++ } + + #if LOG +- printf("\tit's a match with instance %p, %d\n", inst, inst->semanticRun); ++ printf("\tit's a match with instance %p, %d\n", inst, inst->semanticRun); + #endif +- return; +- +- L1: +- ; ++ if (!inst->instantiatingModule || inst->instantiatingModule->isRoot()) ++ inst->instantiatingModule = mi; ++ return; ++ } ++ L1: ; + } + + /* So, we need to implement 'this' instance. +@@ -4984,29 +5404,21 @@ void TemplateInstance::semantic(Scope *s + if (global.gag && sc->speculative) + speculative = 1; + +- size_t tempdecl_instance_idx = tempdecl->instances.dim; +- tempdecl->instances.push(this); +- parent = tempdecl->parent; +- //printf("parent = '%s'\n", parent->kind()); +- +- ident = genIdent(tiargs); // need an identifier for name mangling purposes. ++ TemplateInstance *tempdecl_instance_idx = tempdecl->addInstance(this); + +-#if 1 +- if (isnested) +- parent = isnested; +-#endif ++ parent = enclosing ? enclosing : tempdecl->parent; + //printf("parent = '%s'\n", parent->kind()); + ++ //getIdent(); ++ + // Add 'this' to the enclosing scope's members[] so the semantic routines + // will get called on the instance members. Store the place we added it to + // in target_symbol_list(_idx) so we can remove it later if we encounter + // an error. + #if 1 +- int dosemantic3 = 0; + Dsymbols *target_symbol_list = NULL; + size_t target_symbol_list_idx; + +- if (!sc->parameterSpecialization) + { Dsymbols *a; + + Scope *scx = sc; +@@ -5016,22 +5428,9 @@ void TemplateInstance::semantic(Scope *s + break; + #endif + +-#ifdef IN_GCC +- /* For -femit-templates, templates are always emitted. +- Problem: This picks up templates that aren't even +- needed in the current module. */ +- if (d_gcc_force_templates() && scx && scx->scopesym) +- { +- //fprintf(stderr, "\t0: adding to %s %s\n", sc->scopesym->kind(), sc->scopesym->toChars()); +- objFileModule = d_gcc_get_output_module(); +- a = objFileModule->members; +- } +- else +-#endif +- + //if (scx && scx->scopesym) printf("3: scx is %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars()); +- if (scx && scx->scopesym && +- scx->scopesym->members && !scx->scopesym->isTemplateMixin() ++ if (scx && scx->scopesym && scx->scopesym->members && ++ !scx->scopesym->isTemplateMixin() + #if 0 // removed because it bloated compile times + /* The problem is if A imports B, and B imports A, and both A + * and B instantiate the same template, does the compilation of A +@@ -5043,45 +5442,43 @@ void TemplateInstance::semantic(Scope *s + #endif + ) + { ++ /* A module can have explicit template instance and its alias ++ * in module scope (e,g, `alias Base64Impl!('+', '/') Base64;`). ++ * When the module is just imported, compiler can assume that ++ * its instantiated code would be contained in the separately compiled ++ * obj/lib file (e.g. phobos.lib). So we can omit their semantic3 running. ++ */ ++ //if (scx->scopesym->isModule()) ++ // printf("module level instance %s\n", toChars()); ++ + //printf("\t1: adding to %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars()); + a = scx->scopesym->members; +-#ifdef IN_GCC +- Dsymbol * p = scx->scopesym; +- while (p) +- { +- TemplateInstance *i = p->isTemplateInstance(); +- Module *m = p->isModule(); +- if (i != NULL) +- { +- if (i->objFileModule) +- { +- objFileModule = i->objFileModule; +- break; +- } +- } +- else if (m != NULL) +- { +- objFileModule = m; // %% importedFrom ? +- break; +- } +- p = p->parent; +- } +- //fprintf(stderr, "\t1: adding %s to module %s via %s %s\n", tempdecl->toChars(), +- // objFileModule ? objFileModule->toChars() : "", sc->scopesym->kind(), sc->scopesym->toChars()); +-#endif + } + else + { +- Module *m = (isnested ? sc : tempdecl->scope)->module->importedFrom; +- //printf("\t2: adding to module %s instead of module %s\n", m->toChars(), sc->module->toChars()); +- a = m->members; +- if (m->semanticRun >= 3) ++ Dsymbol *s = enclosing ? enclosing : tempdecl->parent; ++ for (; s; s = s->toParent2()) + { +- dosemantic3 = 1; ++ if (s->isModule()) ++ break; + } +-#ifdef IN_GCC +- objFileModule = m; +-#endif ++ assert(s); ++ Module *m = (Module *)s; ++ if (!m->isRoot()) ++ { ++ //if (tinst && tinst->objFileModule) ++ // m = tinst->objFileModule; ++ //else ++ m = m->importedFrom; ++ } ++ //printf("\t2: adding to module %s instead of module %s\n", m->toChars(), sc->module->toChars()); ++ a = m->members; ++ ++ /* Defer semantic3 running in order to avoid mutual forward reference. ++ * See test/runnable/test10736.d ++ */ ++ if (m->semanticRun >= PASSsemantic3done) ++ Module::addDeferredSemantic3(this); + } + for (size_t i = 0; 1; i++) + { +@@ -5099,11 +5496,45 @@ void TemplateInstance::semantic(Scope *s + #endif + + // Copy the syntax trees from the TemplateDeclaration +- members = Dsymbol::arraySyntaxCopy(tempdecl->members); ++ if (members && speculative) ++ {} // Don't copy again so they were previously created. ++ else ++ members = Dsymbol::arraySyntaxCopy(tempdecl->members); ++ ++ // todo for TemplateThisParameter ++ for (size_t i = 0; i < tempdecl->parameters->dim; i++) ++ { ++ if ((*tempdecl->parameters)[i]->isTemplateThisParameter() == NULL) ++ continue; ++ Type *t = isType((*tiargs)[i]); ++ assert(t); ++ ++ StorageClass stc = 0; ++ if (t->mod & MODimmutable) ++ stc |= STCimmutable; ++ else ++ { ++ if (t->mod & MODconst) ++ stc |= STCconst; ++ else if (t->mod & MODwild) ++ stc |= STCwild; ++ ++ if (t->mod & MODshared) ++ stc |= STCshared; ++ } ++ if (stc != 0) ++ { ++ //printf("t = %s, stc = x%llx\n", t->toChars(), stc); ++ Dsymbols *s = new Dsymbols(); ++ s->push(new StorageClassDeclaration(stc, members)); ++ members = s; ++ } ++ break; ++ } + + // Create our own scope for the template parameters + Scope *scope = tempdecl->scope; +- if (!tempdecl->semanticRun) ++ if (tempdecl->semanticRun == PASSinit) + { + error("template instantiation %s forward references template declaration %s", toChars(), tempdecl->toChars()); + return; +@@ -5115,6 +5546,7 @@ void TemplateInstance::semantic(Scope *s + argsym = new ScopeDsymbol(); + argsym->parent = scope->parent; + scope = scope->push(argsym); ++ scope->instantiatingModule = mi; + // scope->stc = 0; + + // Declare each template parameter as an alias for the argument type +@@ -5179,8 +5611,8 @@ void TemplateInstance::semantic(Scope *s + #endif + Scope *sc2; + sc2 = scope->push(this); +- //printf("isnested = %d, sc->parent = %s\n", isnested, sc->parent->toChars()); +- sc2->parent = /*isnested ? sc->parent :*/ this; ++ //printf("enclosing = %d, sc->parent = %s\n", enclosing, sc->parent->toChars()); ++ sc2->parent = /*enclosing ? sc->parent :*/ this; + sc2->tinst = this; + sc2->speculative = speculative; + +@@ -5194,8 +5626,8 @@ void TemplateInstance::semantic(Scope *s + */ + bool found_deferred_ad = false; + for (size_t i = 0; i < Module::deferred.dim; i++) +- { Dsymbol *sd = Module::deferred[i]; +- ++ { ++ Dsymbol *sd = Module::deferred[i]; + AggregateDeclaration *ad = sd->isAggregateDeclaration(); + if (ad && ad->parent && ad->parent->isTemplateInstance()) + { +@@ -5209,7 +5641,7 @@ void TemplateInstance::semantic(Scope *s + } + } + } +- if (found_deferred_ad) ++ if (found_deferred_ad || Module::deferred.dim) + goto Laftersemantic; + + /* ConditionalDeclaration may introduce eponymous declaration, +@@ -5238,14 +5670,15 @@ void TemplateInstance::semantic(Scope *s + * for initializers inside a function. + */ + // if (sc->parent->isFuncDeclaration()) +- ++ { + /* BUG 782: this has problems if the classes this depends on + * are forward referenced. Find a way to defer semantic() + * on this template. + */ + semantic2(sc2); ++ } + +- if (sc->func || dosemantic3) ++ if (sc->func) + { + trySemantic3(sc2); + } +@@ -5262,14 +5695,14 @@ void TemplateInstance::semantic(Scope *s + if (tinst) + { tinst->printInstantiationTrace(); + } +- errors = 1; ++ errors = true; + if (global.gag) + { + // Errors are gagged, so remove the template instance from the + // instance/symbol lists we added it to and reset our state to + // finish clean and so we can try to instantiate it again later + // (see bugzilla 4302 and 6602). +- tempdecl->instances.remove(tempdecl_instance_idx); ++ tempdecl->removeInstance(tempdecl_instance_idx); + if (target_symbol_list) + { + // Because we added 'this' in the last position above, we +@@ -5288,89 +5721,351 @@ void TemplateInstance::semantic(Scope *s + } + + +-void TemplateInstance::semanticTiargs(Scope *sc) +-{ +- //printf("+TemplateInstance::semanticTiargs() %s\n", toChars()); +- if (semantictiargsdone) +- return; +- semantictiargsdone = 1; +- semanticTiargs(loc, sc, tiargs, 0); +-} +- +-/********************************** +- * Input: +- * flags 1: replace const variables with their initializers +- * 2: don't devolve Parameter to Type ++/********************************************** ++ * Find template declaration corresponding to template instance. + */ + +-void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs, int flags) ++bool TemplateInstance::findTemplateDeclaration(Scope *sc) + { +- // Run semantic on each argument, place results in tiargs[] +- //printf("+TemplateInstance::semanticTiargs()\n"); +- if (!tiargs) +- return; +- for (size_t j = 0; j < tiargs->dim; j++) ++ if (havetempdecl) ++ return true; ++ ++ //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars()); ++ if (!tempdecl) + { +- Object *o = (*tiargs)[j]; +- Type *ta = isType(o); +- Expression *ea = isExpression(o); +- Dsymbol *sa = isDsymbol(o); ++ /* Given: ++ * foo!( ... ) ++ * figure out which TemplateDeclaration foo refers to. ++ */ ++ Identifier *id = name; ++ Dsymbol *scopesym; ++ Dsymbol *s = sc->search(loc, id, &scopesym); ++ if (!s) ++ { ++ s = sc->search_correct(id); ++ if (s) ++ error("template '%s' is not defined, did you mean %s?", id->toChars(), s->toChars()); ++ else ++ error("template '%s' is not defined", id->toChars()); ++ return false; ++ } + +- //printf("1: (*tiargs)[%d] = %p, s=%p, v=%p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta); +- if (ta) ++#if LOG ++ printf("It's an instance of '%s' kind '%s'\n", s->toChars(), s->kind()); ++ if (s->parent) ++ printf("s->parent = '%s'\n", s->parent->toChars()); ++#endif ++ withsym = scopesym->isWithScopeSymbol(); ++ ++ /* We might have found an alias within a template when ++ * we really want the template. ++ */ ++ TemplateInstance *ti; ++ if (s->parent && ++ (ti = s->parent->isTemplateInstance()) != NULL) + { +- //printf("type %s\n", ta->toChars()); +- // It might really be an Expression or an Alias +- ta->resolve(loc, sc, &ea, &ta, &sa); +- if (ea) goto Lexpr; +- if (sa) goto Ldsym; +- if (ta == NULL) ++ if (ti->tempdecl && ti->tempdecl->ident == id) + { +- assert(global.errors); +- ta = Type::terror; ++ /* This is so that one can refer to the enclosing ++ * template, even if it has the same name as a member ++ * of the template, if it has a !(arguments) ++ */ ++ TemplateDeclaration *td = ti->tempdecl->isTemplateDeclaration(); ++ assert(td); ++ if (td->overroot) // if not start of overloaded list of TemplateDeclaration's ++ td = td->overroot; // then get the start ++ s = td; + } ++ } + +- Ltype: +- if (ta->ty == Ttuple) +- { // Expand tuple +- TypeTuple *tt = (TypeTuple *)ta; +- size_t dim = tt->arguments->dim; +- tiargs->remove(j); +- if (dim) +- { tiargs->reserve(dim); +- for (size_t i = 0; i < dim; i++) +- { Parameter *arg = (*tt->arguments)[i]; +- if (flags & 2 && arg->ident) +- tiargs->insert(j + i, arg); +- else +- tiargs->insert(j + i, arg->type); +- } +- } +- j--; +- continue; +- } +- (*tiargs)[j] = ta; ++ if (!updateTemplateDeclaration(sc, s)) ++ { ++ return false; + } +- else if (ea) ++ } ++ assert(tempdecl); ++ ++ struct ParamFwdTi ++ { ++ static int fp(void *param, Dsymbol *s) ++ { ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (!td) ++ return 0; ++ ++ TemplateInstance *ti = (TemplateInstance *)param; ++ if (td->semanticRun == PASSinit) + { +- Lexpr: +- //printf("+[%d] ea = %s %s\n", j, Token::toChars(ea->op), ea->toChars()); +- ea = ea->semantic(sc); +- if (flags & 1) // only used by __traits, must not interpret the args +- ea = ea->optimize(WANTvalue); +- else if (ea->op == TOKvar) +- { /* This test is to skip substituting a const var with +- * its initializer. The problem is the initializer won't +- * match with an 'alias' parameter. Instead, do the +- * const substitution in TemplateValueParameter::matchArg(). +- */ ++ if (td->scope) ++ { ++ // Try to fix forward reference. Ungag errors while doing so. ++ Ungag ungag = td->ungagSpeculative(); ++ td->semantic(td->scope); + } +- else if (ea->op != TOKtuple && +- ea->op != TOKimport && ea->op != TOKtype && +- ea->op != TOKfunction && ea->op != TOKerror && +- ea->op != TOKthis && ea->op != TOKsuper) ++ if (td->semanticRun == PASSinit) + { +- int olderrs = global.errors; ++ ti->error("%s forward references template declaration %s", ti->toChars(), td->toChars()); ++ return 1; ++ } ++ } ++ return 0; ++ } ++ }; ++ // Look for forward references ++ OverloadSet *tovers = tempdecl->isOverloadSet(); ++ size_t overs_dim = tovers ? tovers->a.dim : 1; ++ for (size_t oi = 0; oi < overs_dim; oi++) ++ { ++ if (overloadApply(tovers ? tovers->a[oi] : tempdecl, (void *)this, &ParamFwdTi::fp)) ++ return false; ++ } ++ return true; ++} ++ ++/********************************************** ++ * Confirm s is a valid template, then store it. ++ */ ++ ++bool TemplateInstance::updateTemplateDeclaration(Scope *sc, Dsymbol *s) ++{ ++ if (s) ++ { ++ Identifier *id = name; ++ s = s->toAlias(); ++ ++ /* If an OverloadSet, look for a unique member that is a template declaration ++ */ ++ OverloadSet *os = s->isOverloadSet(); ++ if (os) ++ { ++ s = NULL; ++ for (size_t i = 0; i < os->a.dim; i++) ++ { ++ Dsymbol *s2 = os->a[i]; ++ if (FuncDeclaration *f = s2->isFuncDeclaration()) ++ s2 = f->findTemplateDeclRoot(); ++ else ++ s2 = s2->isTemplateDeclaration(); ++ if (s2) ++ { ++ if (s) ++ { ++ tempdecl = os; ++ return true; ++ } ++ s = s2; ++ } ++ } ++ if (!s) ++ { ++ error("template '%s' is not defined", id->toChars()); ++ return false; ++ } ++ } ++ ++ /* It should be a TemplateDeclaration, not some other symbol ++ */ ++ if (FuncDeclaration *f = s->isFuncDeclaration()) ++ tempdecl = f->findTemplateDeclRoot(); ++ else ++ tempdecl = s->isTemplateDeclaration(); ++ if (!tempdecl) ++ { ++ if (!s->parent && global.errors) ++ return false; ++ if (!s->parent && s->getType()) ++ { ++ Dsymbol *s2 = s->getType()->toDsymbol(sc); ++ if (!s2) ++ { ++ error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); ++ return false; ++ } ++ s = s2; ++ } ++#ifdef DEBUG ++ //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars()); ++#endif ++ //assert(s->parent); ++ TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL; ++ if (ti && ++ (ti->name == s->ident || ++ ti->toAlias()->ident == s->ident) ++ && ++ ti->tempdecl) ++ { ++ /* This is so that one can refer to the enclosing ++ * template, even if it has the same name as a member ++ * of the template, if it has a !(arguments) ++ */ ++ TemplateDeclaration *td = ti->tempdecl->isTemplateDeclaration(); ++ assert(td); ++ if (td->overroot) // if not start of overloaded list of TemplateDeclaration's ++ td = td->overroot; // then get the start ++ tempdecl = td; ++ } ++ else ++ { ++ error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); ++ return false; ++ } ++ } ++ } ++ return (tempdecl != NULL); ++} ++ ++bool TemplateInstance::semanticTiargs(Scope *sc) ++{ ++ //printf("+TemplateInstance::semanticTiargs() %s\n", toChars()); ++ if (semantictiargsdone) ++ return true; ++ semantictiargsdone = 1; ++ semanticTiargs(loc, sc, tiargs, 0); ++ return arrayObjectIsError(tiargs) == 0; ++} ++ ++/********************************** ++ * Return true if e could be valid only as a template value parameter. ++ * Return false if it might be an alias or tuple. ++ * (Note that even in this case, it could still turn out to be a value). ++ */ ++bool definitelyValueParameter(Expression *e) ++{ ++ // None of these can be value parameters ++ if (e->op == TOKtuple || e->op == TOKimport || ++ e->op == TOKtype || e->op == TOKdottype || ++ e->op == TOKtemplate || e->op == TOKdottd || ++ e->op == TOKfunction || e->op == TOKerror || ++ e->op == TOKthis || e->op == TOKsuper) ++ return false; ++ ++ if (e->op != TOKdotvar) ++ return true; ++ ++ /* Template instantiations involving a DotVar expression are difficult. ++ * In most cases, they should be treated as a value parameter, and interpreted. ++ * But they might also just be a fully qualified name, which should be treated ++ * as an alias. ++ */ ++ ++ // x.y.f cannot be a value ++ FuncDeclaration *f = ((DotVarExp *)e)->var->isFuncDeclaration(); ++ if (f) ++ return false; ++ ++ while (e->op == TOKdotvar) ++ { ++ e = ((DotVarExp *)e)->e1; ++ } ++ // this.x.y and super.x.y couldn't possibly be valid values. ++ if (e->op == TOKthis || e->op == TOKsuper) ++ return false; ++ ++ // e.type.x could be an alias ++ if (e->op == TOKdottype) ++ return false; ++ ++ // var.x.y is the only other possible form of alias ++ if (e->op != TOKvar) ++ return true; ++ ++ VarDeclaration *v = ((VarExp *)e)->var->isVarDeclaration(); ++ ++ // func.x.y is not an alias ++ if (!v) ++ return true; ++ ++ // TODO: Should we force CTFE if it is a global constant? ++ ++ return false; ++} ++ ++/********************************** ++ * Input: ++ * flags 1: replace const variables with their initializers ++ * 2: don't devolve Parameter to Type ++ */ ++ ++void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs, int flags) ++{ ++ // Run semantic on each argument, place results in tiargs[] ++ //printf("+TemplateInstance::semanticTiargs()\n"); ++ if (!tiargs) ++ return; ++ for (size_t j = 0; j < tiargs->dim; j++) ++ { ++ RootObject *o = (*tiargs)[j]; ++ Type *ta = isType(o); ++ Expression *ea = isExpression(o); ++ Dsymbol *sa = isDsymbol(o); ++ ++ //printf("1: (*tiargs)[%d] = %p, s=%p, v=%p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta); ++ if (ta) ++ { ++ //printf("type %s\n", ta->toChars()); ++ // It might really be an Expression or an Alias ++ ta->resolve(loc, sc, &ea, &ta, &sa); ++ if (ea) goto Lexpr; ++ if (sa) goto Ldsym; ++ if (ta == NULL) ++ { ++ assert(global.errors); ++ ta = Type::terror; ++ } ++ ++ Ltype: ++ if (ta->ty == Ttuple) ++ { // Expand tuple ++ TypeTuple *tt = (TypeTuple *)ta; ++ size_t dim = tt->arguments->dim; ++ tiargs->remove(j); ++ if (dim) ++ { tiargs->reserve(dim); ++ for (size_t i = 0; i < dim; i++) ++ { Parameter *arg = (*tt->arguments)[i]; ++ if (flags & 2 && arg->ident) ++ tiargs->insert(j + i, arg); ++ else ++ tiargs->insert(j + i, arg->type); ++ } ++ } ++ j--; ++ continue; ++ } ++ (*tiargs)[j] = ta->merge2(); ++ } ++ else if (ea) ++ { ++ Lexpr: ++ //printf("+[%d] ea = %s %s\n", j, Token::toChars(ea->op), ea->toChars()); ++ if (!(flags & 1)) sc = sc->startCTFE(); ++ ea = ea->semantic(sc); ++ if (!(flags & 1)) sc = sc->endCTFE(); ++ if (flags & 1) // only used by __traits, must not interpret the args ++ { ++ VarDeclaration *v; ++ if (ea->op == TOKvar && (v = ((VarExp *)ea)->var->isVarDeclaration()) != NULL && ++ !(v->storage_class & STCtemplateparameter)) ++ { ++ if (v->sem < SemanticDone) ++ v->semantic(sc); ++ // skip optimization for variable symbols ++ } ++ else ++ { ++ ea = ea->optimize(WANTvalue); ++ } ++ } ++ else if (ea->op == TOKvar) ++ { /* This test is to skip substituting a const var with ++ * its initializer. The problem is the initializer won't ++ * match with an 'alias' parameter. Instead, do the ++ * const substitution in TemplateValueParameter::matchArg(). ++ */ ++ } ++ else if (definitelyValueParameter(ea)) ++ { ++ int olderrs = global.errors; + ea = ea->ctfeInterpret(); + if (global.errors != olderrs) + ea = new ErrorExp(); +@@ -5417,8 +6112,8 @@ void TemplateInstance::semanticTiargs(Lo + else if (fe->td) + { /* If template argument is a template lambda, + * get template declaration itself. */ +- sa = fe->td; +- goto Ldsym; ++ //sa = fe->td; ++ //goto Ldsym; + } + } + if (ea->op == TOKdotvar) +@@ -5453,13 +6148,26 @@ void TemplateInstance::semanticTiargs(Lo + j--; + continue; + } ++ if (FuncAliasDeclaration *fa = sa->isFuncAliasDeclaration()) ++ { ++ FuncDeclaration *f = fa->toAliasFunc(); ++ if (!fa->hasOverloads && f->isUnique()) ++ { ++ // Strip FuncAlias only when the aliased function ++ // does not have any overloads. ++ sa = f; ++ } ++ } + (*tiargs)[j] = sa; + + TemplateDeclaration *td = sa->isTemplateDeclaration(); +- if (td && !td->semanticRun && td->literal) ++ if (td && td->semanticRun == PASSinit && td->literal) + { + td->semantic(sc); + } ++ FuncDeclaration *fd = sa->isFuncDeclaration(); ++ if (fd) ++ fd->functionSemantic(); + } + else if (isParameter(o)) + { +@@ -5474,7 +6182,7 @@ void TemplateInstance::semanticTiargs(Lo + printf("-TemplateInstance::semanticTiargs()\n"); + for (size_t j = 0; j < tiargs->dim; j++) + { +- Object *o = (*tiargs)[j]; ++ RootObject *o = (*tiargs)[j]; + Type *ta = isType(o); + Expression *ea = isExpression(o); + Dsymbol *sa = isDsymbol(o); +@@ -5485,288 +6193,330 @@ void TemplateInstance::semanticTiargs(Lo + #endif + } + +-/********************************************** +- * Find template declaration corresponding to template instance. +- */ +- +-TemplateDeclaration *TemplateInstance::findTemplateDeclaration(Scope *sc) ++bool TemplateInstance::findBestMatch(Scope *sc, Expressions *fargs) + { +- //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars()); +- if (!tempdecl) ++ if (havetempdecl) + { +- /* Given: +- * foo!( ... ) +- * figure out which TemplateDeclaration foo refers to. +- */ +- Dsymbol *s; +- Dsymbol *scopesym; +- Identifier *id; +- +- id = name; +- s = sc->search(loc, id, &scopesym); +- if (!s) +- { +- s = sc->search_correct(id); +- if (s) +- error("template '%s' is not defined, did you mean %s?", id->toChars(), s->toChars()); +- else +- error("template '%s' is not defined", id->toChars()); +- return NULL; +- } +- +- /* If an OverloadSet, look for a unique member that is a template declaration +- */ +- OverloadSet *os = s->isOverloadSet(); +- if (os) +- { s = NULL; +- for (size_t i = 0; i < os->a.dim; i++) +- { Dsymbol *s2 = os->a[i]; +- if (s2->isTemplateDeclaration()) +- { +- if (s) +- error("ambiguous template declaration %s and %s", s->toPrettyChars(), s2->toPrettyChars()); +- s = s2; +- } +- } +- if (!s) +- { error("template '%s' is not defined", id->toChars()); +- return NULL; +- } +- } +- +-#if LOG +- printf("It's an instance of '%s' kind '%s'\n", s->toChars(), s->kind()); +- if (s->parent) +- printf("s->parent = '%s'\n", s->parent->toChars()); +-#endif +- withsym = scopesym->isWithScopeSymbol(); +- +- /* We might have found an alias within a template when +- * we really want the template. +- */ +- TemplateInstance *ti; +- if (s->parent && +- (ti = s->parent->isTemplateInstance()) != NULL) +- { +- if (ti->tempdecl && ti->tempdecl->ident == id) +- { +- /* This is so that one can refer to the enclosing +- * template, even if it has the same name as a member +- * of the template, if it has a !(arguments) +- */ +- tempdecl = ti->tempdecl; +- if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's +- tempdecl = tempdecl->overroot; // then get the start +- s = tempdecl; +- } +- } +- +- s = s->toAlias(); +- +- /* It should be a TemplateDeclaration, not some other symbol +- */ +- tempdecl = s->isTemplateDeclaration(); +- if (!tempdecl) ++ TemplateDeclaration *tempdecl = this->tempdecl->isTemplateDeclaration(); ++ assert(tempdecl); ++ assert(tempdecl->scope); ++ // Deduce tdtypes ++ tdtypes.setDim(tempdecl->parameters->dim); ++ if (!tempdecl->matchWithInstance(sc, this, &tdtypes, fargs, 2)) + { +- if (!s->parent && global.errors) +- return NULL; +- if (!s->parent && s->getType()) +- { Dsymbol *s2 = s->getType()->toDsymbol(sc); +- if (!s2) +- { +- error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); +- return NULL; +- } +- s = s2; +- } +-#ifdef DEBUG +- //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars()); +-#endif +- //assert(s->parent); +- TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL; +- if (ti && +- (ti->name == id || +- ti->toAlias()->ident == id) +- && +- ti->tempdecl) +- { +- /* This is so that one can refer to the enclosing +- * template, even if it has the same name as a member +- * of the template, if it has a !(arguments) +- */ +- tempdecl = ti->tempdecl; +- if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's +- tempdecl = tempdecl->overroot; // then get the start +- } +- else +- { +- error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); +- return NULL; +- } ++ error("incompatible arguments for template instantiation"); ++ return false; + } ++ return true; + } +- else +- assert(tempdecl->isTemplateDeclaration()); +- return tempdecl; +-} +- +-TemplateDeclaration *TemplateInstance::findBestMatch(Scope *sc, Expressions *fargs) +-{ +- /* Since there can be multiple TemplateDeclaration's with the same +- * name, look for the best match. +- */ +- TemplateDeclaration *td_ambig = NULL; +- TemplateDeclaration *td_best = NULL; +- MATCH m_best = MATCHnomatch; +- Objects dedtypes; + + #if LOG + printf("TemplateInstance::findBestMatch()\n"); + #endif +- // First look for forward references +- for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) +- { +- if (!td->semanticRun) +- { +- if (td->scope) +- { // Try to fix forward reference. Ungag errors while doing so. +- int oldgag = global.gag; +- if (global.isSpeculativeGagging() && !td->isSpeculative()) +- global.gag = 0; ++ unsigned errs = global.errors; + +- td->semantic(td->scope); ++ struct ParamBest ++ { ++ // context ++ Scope *sc; ++ TemplateInstance *ti; ++ Objects dedtypes; ++ // result ++ TemplateDeclaration *td_best; ++ TemplateDeclaration *td_ambig; ++ MATCH m_best; + +- global.gag = oldgag; +- } +- if (!td->semanticRun) +- { +- error("%s forward references template declaration %s", toChars(), td->toChars()); +- return NULL; +- } +- } ++ static int fp(void *param, Dsymbol *s) ++ { ++ return ((ParamBest *)param)->fp(s); + } +- +- for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) ++ int fp(Dsymbol *s) + { +- MATCH m; ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (!td) ++ return 0; ++ ++ if (td == td_best) // skip duplicates ++ return 0; + +-//if (tiargs->dim) printf("2: tiargs->dim = %d, data[0] = %p\n", tiargs->dim, (*tiargs)[0]); ++ //printf("td = %s\n", td->toPrettyChars()); + + // If more arguments than parameters, + // then this is no match. +- if (td->parameters->dim < tiargs->dim) ++ if (td->parameters->dim < ti->tiargs->dim) + { + if (!td->isVariadic()) +- continue; ++ return 0; + } + + dedtypes.setDim(td->parameters->dim); + dedtypes.zero(); +- assert(td->semanticRun); +- m = td->matchWithInstance(this, &dedtypes, fargs, 0); ++ assert(td->semanticRun != PASSinit); ++ MATCH m = td->matchWithInstance(sc, ti, &dedtypes, ti->fargs, 0); + //printf("matchWithInstance = %d\n", m); + if (!m) // no match at all +- continue; ++ return 0; + +- if (m < m_best) +- goto Ltd_best; +- if (m > m_best) +- goto Ltd; ++ if (m < m_best) goto Ltd_best; ++ if (m > m_best) goto Ltd; + + { + // Disambiguate by picking the most specialized TemplateDeclaration +- MATCH c1 = td->leastAsSpecialized(td_best, fargs); +- MATCH c2 = td_best->leastAsSpecialized(td, fargs); ++ MATCH c1 = td->leastAsSpecialized(sc, td_best, ti->fargs); ++ MATCH c2 = td_best->leastAsSpecialized(sc, td, ti->fargs); + //printf("c1 = %d, c2 = %d\n", c1, c2); +- +- if (c1 > c2) +- goto Ltd; +- else if (c1 < c2) +- goto Ltd_best; +- else +- goto Lambig; ++ if (c1 > c2) goto Ltd; ++ if (c1 < c2) goto Ltd_best; + } + + Lambig: // td_best and td are ambiguous + td_ambig = td; +- continue; ++ return 0; + + Ltd_best: // td_best is the best match so far + td_ambig = NULL; +- continue; ++ return 0; + + Ltd: // td is the new best match + td_ambig = NULL; + td_best = td; + m_best = m; +- tdtypes.setDim(dedtypes.dim); +- memcpy(tdtypes.tdata(), dedtypes.tdata(), tdtypes.dim * sizeof(void *)); +- continue; ++ ti->tdtypes.setDim(dedtypes.dim); ++ memcpy(ti->tdtypes.tdata(), dedtypes.tdata(), ti->tdtypes.dim * sizeof(void *)); ++ return 0; + } ++ }; ++ ParamBest p; ++ // context ++ p.ti = this; ++ p.sc = sc; ++ ++ /* Since there can be multiple TemplateDeclaration's with the same ++ * name, look for the best match. ++ */ ++ TemplateDeclaration *td_last = NULL; + +- if (!td_best) ++ OverloadSet *tovers = tempdecl->isOverloadSet(); ++ size_t overs_dim = tovers ? tovers->a.dim : 1; ++ for (size_t oi = 0; oi < overs_dim; oi++) + { +- if (tempdecl && !tempdecl->overnext) ++ // result ++ p.td_best = NULL; ++ p.td_ambig = NULL; ++ p.m_best = MATCHnomatch; ++ overloadApply(tovers ? tovers->a[oi] : tempdecl, &p, &ParamBest::fp); ++ ++ if (p.td_ambig) ++ { ++ ::error(loc, "%s %s.%s matches more than one template declaration:\n\t%s(%d):%s\nand\n\t%s(%d):%s", ++ p.td_best->kind(), p.td_best->parent->toPrettyChars(), p.td_best->ident->toChars(), ++ p.td_best->loc.filename, p.td_best->loc.linnum, p.td_best->toChars(), ++ p.td_ambig->loc.filename, p.td_ambig->loc.linnum, p.td_ambig->toChars()); ++ return false; ++ } ++ if (p.td_best) ++ { ++ if (!td_last) ++ td_last = p.td_best; ++ else if (td_last != p.td_best) ++ { ++ ScopeDsymbol::multiplyDefined(loc, td_last, p.td_best); ++ return false; ++ } ++ } ++ } ++ ++ if (!td_last) ++ { ++ TemplateDeclaration *tdecl = tempdecl->isTemplateDeclaration(); ++ ++ if (errs != global.errors) ++ errorSupplemental(loc, "while looking for match for %s", toChars()); ++ else if (tovers) ++ error("does not match template overload set %s", tovers->toChars()); ++ else if (tdecl && !tdecl->overnext) + // Only one template, so we can give better error message +- error("%s does not match template declaration %s", toChars(), tempdecl->toChars()); ++ error("does not match template declaration %s", tdecl->toChars()); + else + ::error(loc, "%s %s.%s does not match any template declaration", +- tempdecl->kind(), tempdecl->parent->toPrettyChars(), tempdecl->ident->toChars()); +- return NULL; ++ tdecl->kind(), tdecl->parent->toPrettyChars(), tdecl->ident->toChars()); ++ return false; + } +- if (td_ambig) ++ ++ /* The best match is td_last ++ */ ++ tempdecl = td_last; ++ ++#if LOG ++ printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars()); ++#endif ++ return (errs == global.errors); ++} ++ ++/***************************************************** ++ * Determine if template instance is really a template function, ++ * and that template function needs to infer types from the function ++ * arguments. ++ * ++ * Like findBestMatch, iterate possible template candidates, ++ * but just looks only the necessity of type inference. ++ */ ++ ++bool TemplateInstance::needsTypeInference(Scope *sc, int flag) ++{ ++ //printf("TemplateInstance::needsTypeInference() %s\n", toChars()); ++ ++ struct ParamNeedsInf ++ { ++ // context ++ Scope *sc; ++ TemplateInstance *ti; ++ int flag; ++ // result ++ Objects dedtypes; ++ size_t count; ++ ++ static int fp(void *param, Dsymbol *s) + { +- ::error(loc, "%s %s.%s matches more than one template declaration, %s(%d):%s and %s(%d):%s", +- td_best->kind(), td_best->parent->toPrettyChars(), td_best->ident->toChars(), +- td_best->loc.filename, td_best->loc.linnum, td_best->toChars(), +- td_ambig->loc.filename, td_ambig->loc.linnum, td_ambig->toChars()); ++ return ((ParamNeedsInf *)param)->fp(s); + } ++ int fp(Dsymbol *s) ++ { ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (!td) ++ { ++ Lcontinue: ++ return 0; ++ } + +- /* The best match is td_best +- */ +- tempdecl = td_best; ++ /* If any of the overloaded template declarations need inference, ++ * then return true ++ */ ++ FuncDeclaration *fd; ++ if (!td->onemember) ++ return 0; ++ if (TemplateDeclaration *td2 = td->onemember->isTemplateDeclaration()) ++ { ++ if (!td2->onemember || !td2->onemember->isFuncDeclaration()) ++ return 0; ++ if (ti->tiargs->dim > td->parameters->dim && !td->isVariadic()) ++ return 0; ++ return 1; ++ } ++ if ((fd = td->onemember->isFuncDeclaration()) == NULL || ++ fd->type->ty != Tfunction) ++ { ++ return 0; ++ } + +-#if 0 +- /* Cast any value arguments to be same type as value parameter +- */ +- for (size_t i = 0; i < tiargs->dim; i++) +- { Object *o = (*tiargs)[i]; +- Expression *ea = isExpression(o); // value argument +- TemplateParameter *tp = (*tempdecl->parameters)[i]; +- assert(tp); +- TemplateValueParameter *tvp = tp->isTemplateValueParameter(); +- if (tvp) ++ for (size_t i = 0; i < td->parameters->dim; i++) + { +- assert(ea); +- ea = ea->castTo(tvp->valType); +- ea = ea->ctfeInterpret(); +- (*tiargs)[i] = (Object *)ea; ++ if ((*td->parameters)[i]->isTemplateThisParameter()) ++ return 1; + } +- } +-#endif + +-#if LOG +- printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars()); +-#endif +- return tempdecl; ++ /* Determine if the instance arguments, tiargs, are all that is necessary ++ * to instantiate the template. ++ */ ++ //printf("tp = %p, td->parameters->dim = %d, tiargs->dim = %d\n", tp, td->parameters->dim, ti->tiargs->dim); ++ TypeFunction *tf = (TypeFunction *)fd->type; ++ if (size_t dim = Parameter::dim(tf->parameters)) ++ { ++ TemplateParameter *tp = td->isVariadic(); ++ if (tp && td->parameters->dim > 1) ++ return 1; ++ ++ if (ti->tiargs->dim < td->parameters->dim) ++ { ++ // Can remain tiargs be filled by default arguments? ++ for (size_t i = ti->tiargs->dim; i < td->parameters->dim; i++) ++ { ++ tp = (*td->parameters)[i]; ++ if (TemplateTypeParameter *ttp = tp->isTemplateTypeParameter()) ++ { ++ if (!ttp->defaultType) ++ return 1; ++ } ++ else if (TemplateAliasParameter *tap = tp->isTemplateAliasParameter()) ++ { ++ if (!tap->defaultAlias) ++ return 1; ++ } ++ else if (TemplateValueParameter *tvp = tp->isTemplateValueParameter()) ++ { ++ if (!tvp->defaultValue) ++ return 1; ++ } ++ } ++ } ++ ++ for (size_t i = 0; i < dim; i++) ++ { ++ // 'auto ref' needs inference. ++ if (Parameter::getNth(tf->parameters, i)->storageClass & STCauto) ++ return 1; ++ } ++ } ++ ++ if (!flag) ++ { ++ /* Calculate the need for overload resolution. ++ * When only one template can match with tiargs, inference is not necessary. ++ */ ++ dedtypes.setDim(td->parameters->dim); ++ dedtypes.zero(); ++ assert(td->semanticRun != PASSinit); ++ MATCH m = td->matchWithInstance(sc, ti, &dedtypes, NULL, 0); ++ if (m == MATCHnomatch) ++ return 0; ++ } ++ ++ /* If there is more than one function template which matches, we may ++ * need type inference (see Bugzilla 4430) ++ */ ++ if (++count > 1) ++ return 1; ++ ++ return 0; ++ } ++ }; ++ ParamNeedsInf p; ++ // context ++ p.ti = this; ++ p.sc = sc; ++ p.flag = flag; ++ // result ++ p.count = 0; ++ ++ OverloadSet *tovers = tempdecl->isOverloadSet(); ++ size_t overs_dim = tovers ? tovers->a.dim : 1; ++ for (size_t oi = 0; oi < overs_dim; oi++) ++ { ++ if (int r = overloadApply(tovers ? tovers->a[oi] : tempdecl, &p, &ParamNeedsInf::fp)) ++ return true; ++ } ++ //printf("false\n"); ++ return false; + } + + + /***************************************** + * Determines if a TemplateInstance will need a nested + * generation of the TemplateDeclaration. +- * Sets isnested property if so, and returns != 0; ++ * Sets enclosing property if so, and returns != 0; + */ + +-int TemplateInstance::hasNestedArgs(Objects *args) +-{ int nested = 0; ++bool TemplateInstance::hasNestedArgs(Objects *args) ++{ ++ int nested = 0; + //printf("TemplateInstance::hasNestedArgs('%s')\n", tempdecl->ident->toChars()); + + /* A nested instance happens when an argument references a local + * symbol that is on the stack. + */ + for (size_t i = 0; i < args->dim; i++) +- { Object *o = (*args)[i]; ++ { ++ RootObject *o = (*args)[i]; + Expression *ea = isExpression(o); + Dsymbol *sa = isDsymbol(o); + Tuple *va = isTuple(o); +@@ -5808,14 +6558,35 @@ int TemplateInstance::hasNestedArgs(Obje + sa = ((FuncExp *)ea)->fd; + goto Lsa; + } ++ // Emulate Expression::toMangleBuffer call that had exist in TemplateInstance::genIdent. ++ if (ea->op != TOKint64 && // IntegerExp ++ ea->op != TOKfloat64 && // RealExp ++ ea->op != TOKcomplex80 && // CompexExp ++ ea->op != TOKnull && // NullExp ++ ea->op != TOKstring && // StringExp ++ ea->op != TOKarrayliteral && // ArrayLiteralExp ++ ea->op != TOKassocarrayliteral && // AssocArrayLiteralExp ++ ea->op != TOKstructliteral) // StructLiteralExp ++ { ++ ea->error("expression %s is not a valid template value argument", ea->toChars()); ++ } + } + else if (sa) + { + Lsa: ++ sa = sa->toAlias(); + TemplateDeclaration *td = sa->isTemplateDeclaration(); ++ if (td) ++ { ++ TemplateInstance *ti = sa->toParent()->isTemplateInstance(); ++ if (ti && ti->enclosing) ++ sa = ti; ++ } ++ TemplateInstance *ti = sa->isTemplateInstance(); + AggregateDeclaration *ad = sa->isAggregateDeclaration(); + Declaration *d = sa->isDeclaration(); + if ((td && td->literal) || ++ (ti && ti->enclosing) || + #if FIXBUG8863 + (ad && ad->isNested()) || + #endif +@@ -5829,31 +6600,32 @@ int TemplateInstance::hasNestedArgs(Obje + { + // if module level template + if (tempdecl->toParent()->isModule()) +- { Dsymbol *dparent = sa->toParent(); +- if (!isnested) +- isnested = dparent; +- else if (isnested != dparent) ++ { ++ Dsymbol *dparent = sa->toParent2(); ++ if (!enclosing) ++ enclosing = dparent; ++ else if (enclosing != dparent) + { + /* Select the more deeply nested of the two. + * Error if one is not nested inside the other. + */ +- for (Dsymbol *p = isnested; p; p = p->parent) ++ for (Dsymbol *p = enclosing; p; p = p->parent) + { + if (p == dparent) +- goto L1; // isnested is most nested ++ goto L1; // enclosing is most nested + } + for (Dsymbol *p = dparent; p; p = p->parent) + { +- if (p == isnested) +- { isnested = dparent; ++ if (p == enclosing) ++ { enclosing = dparent; + goto L1; // dparent is most nested + } + } + error("%s is nested in both %s and %s", +- toChars(), isnested->toChars(), dparent->toChars()); ++ toChars(), enclosing->toChars(), dparent->toChars()); + } + L1: +- //printf("\tnested inside %s\n", isnested->toChars()); ++ //printf("\tnested inside %s\n", enclosing->toChars()); + nested |= 1; + } + else +@@ -5866,7 +6638,7 @@ int TemplateInstance::hasNestedArgs(Obje + } + } + //printf("-TemplateInstance::hasNestedArgs('%s') = %d\n", tempdecl->ident->toChars(), nested); +- return nested; ++ return nested != 0; + } + + /**************************************** +@@ -5876,13 +6648,16 @@ int TemplateInstance::hasNestedArgs(Obje + */ + + Identifier *TemplateInstance::genIdent(Objects *args) +-{ OutBuffer buf; ++{ ++ assert(tempdecl); + + //printf("TemplateInstance::genIdent('%s')\n", tempdecl->ident->toChars()); ++ OutBuffer buf; + char *id = tempdecl->ident->toChars(); + buf.printf("__T%llu%s", (ulonglong)strlen(id), id); + for (size_t i = 0; i < args->dim; i++) +- { Object *o = (*args)[i]; ++ { ++ RootObject *o = (*args)[i]; + Type *ta = isType(o); + Expression *ea = isExpression(o); + Dsymbol *sa = isDsymbol(o); +@@ -5955,15 +6730,10 @@ Identifier *TemplateInstance::genIdent(O + { + Lsa: + buf.writeByte('S'); ++ sa = sa->toAlias(); + Declaration *d = sa->isDeclaration(); +- Lsa2: + if (d && (!d->type || !d->type->deco)) + { +- FuncAliasDeclaration *fad = d->isFuncAliasDeclaration(); +- if (fad) +- { d = fad->toAliasFunc(); +- goto Lsa2; +- } + error("forward reference of %s %s", d->kind(), d->toChars()); + continue; + } +@@ -6005,6 +6775,17 @@ Identifier *TemplateInstance::genIdent(O + return Lexer::idPool(id); + } + ++/************************************* ++ * Lazily generate identifier for template instance. ++ * This is because 75% of the ident's are never needed. ++ */ ++ ++Identifier *TemplateInstance::getIdent() ++{ ++ if (!ident && inst) ++ ident = genIdent(tiargs); // need an identifier for name mangling purposes. ++ return ident; ++} + + /**************************************************** + * Declare parameters of template instance, initialize them with the +@@ -6013,90 +6794,21 @@ Identifier *TemplateInstance::genIdent(O + + void TemplateInstance::declareParameters(Scope *sc) + { ++ TemplateDeclaration *tempdecl = this->tempdecl->isTemplateDeclaration(); ++ assert(tempdecl); ++ + //printf("TemplateInstance::declareParameters()\n"); + for (size_t i = 0; i < tdtypes.dim; i++) + { + TemplateParameter *tp = (*tempdecl->parameters)[i]; +- //Object *o = (*tiargs)[i]; +- Object *o = tdtypes[i]; // initializer for tp ++ //RootObject *o = (*tiargs)[i]; ++ RootObject *o = tdtypes[i]; // initializer for tp + + //printf("\ttdtypes[%d] = %p\n", i, o); + tempdecl->declareParameter(sc, tp, o); + } + } + +-/***************************************************** +- * Determine if template instance is really a template function, +- * and that template function needs to infer types from the function +- * arguments. +- */ +- +-int TemplateInstance::needsTypeInference(Scope *sc) +-{ +- //printf("TemplateInstance::needsTypeInference() %s\n", toChars()); +- if (!tempdecl) +- tempdecl = findTemplateDeclaration(sc); +- int multipleMatches = FALSE; +- for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) +- { +- /* If any of the overloaded template declarations need inference, +- * then return TRUE +- */ +- FuncDeclaration *fd; +- if (!td->onemember || +- (fd = td->onemember/*->toAlias()*/->isFuncDeclaration()) == NULL || +- fd->type->ty != Tfunction) +- { +- /* Not a template function, therefore type inference is not possible. +- */ +- //printf("false\n"); +- return FALSE; +- } +- +- for (size_t i = 0; i < td->parameters->dim; i++) +- if ((*td->parameters)[i]->isTemplateThisParameter()) +- return TRUE; +- +- /* Determine if the instance arguments, tiargs, are all that is necessary +- * to instantiate the template. +- */ +- //printf("tp = %p, td->parameters->dim = %d, tiargs->dim = %d\n", tp, td->parameters->dim, tiargs->dim); +- TypeFunction *fdtype = (TypeFunction *)fd->type; +- if (Parameter::dim(fdtype->parameters)) +- { +- TemplateParameter *tp = td->isVariadic(); +- if (tp && td->parameters->dim > 1) +- return TRUE; +- +- if (tiargs->dim < td->parameters->dim) +- { // Can remain tiargs be filled by default arguments? +- for (size_t i = tiargs->dim; i < td->parameters->dim; i++) +- { tp = (*td->parameters)[i]; +- if (TemplateTypeParameter *ttp = tp->isTemplateTypeParameter()) +- { if (!ttp->defaultType) +- return TRUE; +- } +- else if (TemplateAliasParameter *tap = tp->isTemplateAliasParameter()) +- { if (!tap->defaultAlias) +- return TRUE; +- } +- else if (TemplateValueParameter *tvp = tp->isTemplateValueParameter()) +- { if (!tvp->defaultValue) +- return TRUE; +- } +- } +- } +- } +- /* If there is more than one function template which matches, we may +- * need type inference (see Bugzilla 4430) +- */ +- if (td != tempdecl) +- multipleMatches = TRUE; +- } +- //printf("false\n"); +- return multipleMatches; +-} +- + void TemplateInstance::semantic2(Scope *sc) + { + if (semanticRun >= PASSsemantic2) +@@ -6110,6 +6822,7 @@ void TemplateInstance::semantic2(Scope * + sc = tempdecl->scope; + assert(sc); + sc = sc->push(argsym); ++ sc->instantiatingModule = instantiatingModule; + sc = sc->push(this); + sc->tinst = this; + for (size_t i = 0; i < members->dim; i++) +@@ -6141,17 +6854,19 @@ void TemplateInstance::semantic3(Scope * + { + sc = tempdecl->scope; + sc = sc->push(argsym); ++ sc->instantiatingModule = instantiatingModule; + sc = sc->push(this); + sc->tinst = this; +- int oldgag = global.gag; ++ int needGagging = (speculative && !global.gag); + int olderrors = global.errors; ++ int oldGaggedErrors; + /* If this is a speculative instantiation, gag errors. + * Future optimisation: If the results are actually needed, errors + * would already be gagged, so we don't really need to run semantic + * on the members. + */ +- if (speculative && !oldgag) +- olderrors = global.startGagging(); ++ if (needGagging) ++ oldGaggedErrors = global.startGagging(); + for (size_t i = 0; i < members->dim; i++) + { + Dsymbol *s = (*members)[i]; +@@ -6159,10 +6874,10 @@ void TemplateInstance::semantic3(Scope * + if (speculative && global.errors != olderrors) + break; + } +- if (speculative && !oldgag) ++ if (needGagging) + { // If errors occurred, this instantiation failed +- errors += global.errors - olderrors; +- global.endGagging(olderrors); ++ if (global.endGagging(oldGaggedErrors)) ++ errors = true; + } + sc = sc->pop(); + sc->pop(); +@@ -6265,23 +6980,57 @@ void TemplateInstance::toCBuffer(OutBuff + { + Identifier *id = name; + buf->writestring(id->toChars()); +- buf->writestring("!("); ++ toCBufferTiargs(buf, hgs); ++} ++ ++void TemplateInstance::toCBufferTiargs(OutBuffer *buf, HdrGenState *hgs) ++{ ++ buf->writeByte('!'); + if (nest) +- buf->writestring("..."); ++ buf->writestring("(...)"); ++ else if (!tiargs) ++ buf->writestring("()"); + else + { ++ if (tiargs->dim == 1) ++ { ++ RootObject *oarg = (*tiargs)[0]; ++ if (Type *t = isType(oarg)) ++ { ++ if (t->equals(Type::tstring) || ++ t->mod == 0 && ++ (t->isTypeBasic() || ++ t->ty == Tident && ((TypeIdentifier *)t)->idents.dim == 0)) ++ { ++ buf->writestring(t->toChars()); ++ return; ++ } ++ } ++ else if (Expression *e = isExpression(oarg)) ++ { ++ if (e->op == TOKint64 || // IntegerExp(10, true, false, 'c') ++ e->op == TOKfloat64 || // RealExp(3.14, 1.4i) ++ e->op == TOKnull || // NullExp ++ e->op == TOKstring || // StringExp ++ e->op == TOKthis) ++ { ++ buf->writestring(e->toChars()); ++ return; ++ } ++ } ++ } ++ buf->writeByte('('); + nest++; +- Objects *args = tiargs; +- for (size_t i = 0; i < args->dim; i++) ++ for (size_t i = 0; i < tiargs->dim; i++) + { + if (i) + buf->writestring(", "); +- Object *oarg = (*args)[i]; ++ RootObject *oarg = (*tiargs)[i]; + ObjectToCBuffer(buf, hgs, oarg); + } + nest--; ++ buf->writeByte(')'); + } +- buf->writeByte(')'); + } + + +@@ -6305,8 +7054,9 @@ Dsymbol *TemplateInstance::toAlias() + // inst = NULL; // trigger fwd ref error + } + if (!inst) +- { error("cannot resolve forward reference"); +- errors = 1; ++ { ++ error("cannot resolve forward reference"); ++ errors = true; + return this; + } + } +@@ -6332,10 +7082,10 @@ const char *TemplateInstance::kind() + return "template instance"; + } + +-int TemplateInstance::oneMember(Dsymbol **ps, Identifier *ident) ++bool TemplateInstance::oneMember(Dsymbol **ps, Identifier *ident) + { + *ps = NULL; +- return TRUE; ++ return true; + } + + char *TemplateInstance::toChars() +@@ -6350,42 +7100,170 @@ char *TemplateInstance::toChars() + return s; + } + ++int TemplateInstance::compare(RootObject *o) ++{ ++ TemplateInstance *ti = (TemplateInstance *)o; ++ ++ //printf("this = %p, ti = %p\n", this, ti); ++ assert(tdtypes.dim == ti->tdtypes.dim); ++ ++ // Nesting must match ++ if (enclosing != ti->enclosing) ++ { ++ //printf("test2 enclosing %s ti->enclosing %s\n", enclosing ? enclosing->toChars() : "", ti->enclosing ? ti->enclosing->toChars() : ""); ++ goto Lnotequals; ++ } ++ //printf("parent = %s, ti->parent = %s\n", parent->toPrettyChars(), ti->parent->toPrettyChars()); ++ ++ if (!arrayObjectMatch(&tdtypes, &ti->tdtypes)) ++ goto Lnotequals; ++ ++ /* Template functions may have different instantiations based on ++ * "auto ref" parameters. ++ */ ++ if (fargs) ++ { ++ FuncDeclaration *fd = ti->toAlias()->isFuncDeclaration(); ++ if (fd) ++ { ++ Parameters *fparameters = fd->getParameters(NULL); ++ size_t nfparams = Parameter::dim(fparameters); // Num function parameters ++ for (size_t j = 0; j < nfparams && j < fargs->dim; j++) ++ { ++ Parameter *fparam = Parameter::getNth(fparameters, j); ++ Expression *farg = (*fargs)[j]; ++ if (Expression *e = farg->isTemp()) ++ farg = e; ++ if (fparam->storageClass & STCauto) // if "auto ref" ++ { ++ if (farg->isLvalue()) ++ { ++ if (!(fparam->storageClass & STCref)) ++ goto Lnotequals; // auto ref's don't match ++ } ++ else ++ { ++ if (fparam->storageClass & STCref) ++ goto Lnotequals; // auto ref's don't match ++ } ++ } ++ } ++ } ++ } ++ return 0; ++ ++ Lnotequals: ++ return 1; ++} ++ ++hash_t TemplateInstance::hashCode() ++{ ++ if (!hash) ++ { ++ hash = (size_t)(void *)enclosing; ++ hash += arrayObjectHash(&tdtypes); ++ } ++ return hash; ++} ++ ++ ++ + /* ======================== TemplateMixin ================================ */ + +-TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, Type *tqual, +- Identifiers *idents, Objects *tiargs) +- : TemplateInstance(loc, (*idents)[idents->dim - 1]) ++TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, TypeQualified *tqual, Objects *tiargs) ++ : TemplateInstance(loc, tqual->idents.dim ? (Identifier *)tqual->idents[tqual->idents.dim - 1] ++ : ((TypeIdentifier *)tqual)->ident) + { + //printf("TemplateMixin(ident = '%s')\n", ident ? ident->toChars() : ""); + this->ident = ident; + this->tqual = tqual; +- this->idents = idents; + this->tiargs = tiargs ? tiargs : new Objects(); + } + + Dsymbol *TemplateMixin::syntaxCopy(Dsymbol *s) +-{ TemplateMixin *tm; ++{ ++ TemplateMixin *tm = new TemplateMixin(loc, ident, ++ (TypeQualified *)tqual->syntaxCopy(), tiargs); ++ TemplateInstance::syntaxCopy(tm); ++ return tm; ++} + +- Identifiers *ids = new Identifiers(); +- ids->setDim(idents->dim); +- for (size_t i = 0; i < idents->dim; i++) +- { // Matches TypeQualified::syntaxCopyHelper() +- Identifier *id = (*idents)[i]; +- if (id->dyncast() == DYNCAST_DSYMBOL) ++bool TemplateMixin::findTemplateDeclaration(Scope *sc) ++{ ++ // Follow qualifications to find the TemplateDeclaration ++ if (!tempdecl) ++ { ++ Expression *e; ++ Type *t; ++ Dsymbol *s; ++ tqual->resolve(loc, sc, &e, &t, &s); ++ if (!s) + { +- TemplateInstance *ti = (TemplateInstance *)id; ++ error("is not defined"); ++ return false; ++ } ++ s = s->toAlias(); ++ tempdecl = s->isTemplateDeclaration(); ++ OverloadSet *os = s->isOverloadSet(); + +- ti = (TemplateInstance *)ti->syntaxCopy(NULL); +- id = (Identifier *)ti; ++ /* If an OverloadSet, look for a unique member that is a template declaration ++ */ ++ if (os) ++ { ++ Dsymbol *s = NULL; ++ for (size_t i = 0; i < os->a.dim; i++) ++ { ++ Dsymbol *s2 = os->a[i]->isTemplateDeclaration(); ++ if (s2) ++ { ++ if (s) ++ { ++ tempdecl = os; ++ break; ++ } ++ s = s2; ++ } ++ } ++ } ++ if (!tempdecl) ++ { ++ error("%s isn't a template", s->toChars()); ++ return false; + } +- (*ids)[i] = id; + } ++ assert(tempdecl); + +- tm = new TemplateMixin(loc, ident, +- (Type *)(tqual ? tqual->syntaxCopy() : NULL), +- ids, tiargs); +- TemplateInstance::syntaxCopy(tm); +- return tm; ++ struct ParamFwdResTm ++ { ++ static int fp(void *param, Dsymbol *s) ++ { ++ TemplateDeclaration *td = s->isTemplateDeclaration(); ++ if (!td) ++ return 0; ++ ++ TemplateMixin *tm = (TemplateMixin *)param; ++ if (td->semanticRun == PASSinit) ++ { ++ if (td->scope) ++ td->semantic(td->scope); ++ else ++ { ++ tm->semanticRun = PASSinit; ++ return 1; ++ } ++ } ++ return 0; ++ } ++ }; ++ // Look for forward references ++ OverloadSet *tovers = tempdecl->isOverloadSet(); ++ size_t overs_dim = tovers ? tovers->a.dim : 1; ++ for (size_t oi = 0; oi < overs_dim; oi++) ++ { ++ if (overloadApply(tovers ? tovers->a[oi] : tempdecl, (void *)this, &ParamFwdResTm::fp)) ++ return false; ++ } ++ return true; + } + + void TemplateMixin::semantic(Scope *sc) +@@ -6394,7 +7272,7 @@ void TemplateMixin::semantic(Scope *sc) + printf("+TemplateMixin::semantic('%s', this=%p)\n", toChars(), this); + fflush(stdout); + #endif +- if (semanticRun) ++ if (semanticRun != PASSinit) + { + // This for when a class/struct contains mixin members, and + // is done over because of forward references +@@ -6412,81 +7290,29 @@ void TemplateMixin::semantic(Scope *sc) + return; + } + } +- if (!semanticRun) ++ if (semanticRun == PASSinit) + semanticRun = PASSsemantic; + #if LOG + printf("\tdo semantic\n"); + #endif +-#ifndef IN_GCC +- util_progress(); +-#endif + + Scope *scx = NULL; + if (scope) +- { sc = scope; ++ { ++ sc = scope; + scx = scope; // save so we don't make redundant copies + scope = NULL; + } + +- // Follow qualifications to find the TemplateDeclaration +- if (!tempdecl) +- { Dsymbol *s; +- size_t i; +- Identifier *id; +- +- if (tqual) +- { s = tqual->toDsymbol(sc); +- i = 0; +- } +- else +- { +- i = 1; +- id = (*idents)[0]; +- switch (id->dyncast()) +- { +- case DYNCAST_IDENTIFIER: +- s = sc->search(loc, id, NULL); +- break; +- +- case DYNCAST_DSYMBOL: +- { +- TemplateInstance *ti = (TemplateInstance *)id; +- ti->semantic(sc); +- s = ti; +- break; +- } +- default: +- assert(0); +- } +- } +- +- for (; i < idents->dim; i++) +- { +- if (!s) +- break; +- id = (*idents)[i]; +- s = s->searchX(loc, sc, id); +- } +- if (!s) +- { +- error("is not defined"); +- inst = this; +- return; +- } +- tempdecl = s->toAlias()->isTemplateDeclaration(); +- if (!tempdecl) +- { +- error("%s isn't a template", s->toChars()); +- inst = this; +- return; +- } +- } + +- // Look for forward reference +- assert(tempdecl); +- for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) ++ /* Run semantic on each argument, place results in tiargs[], ++ * then find best match template with tiargs ++ */ ++ if (!findTemplateDeclaration(sc) || ++ !semanticTiargs(sc) || ++ !findBestMatch(sc, NULL)) + { +- if (!td->semanticRun) ++ if (semanticRun == PASSinit) // forward reference had occured + { + /* Cannot handle forward references if mixin is a struct member, + * because addField must happen during struct's semantic, not +@@ -6494,7 +7320,6 @@ void TemplateMixin::semantic(Scope *sc) + * runDeferred will re-run mixin's semantic outside of the struct's + * semantic. + */ +- semanticRun = PASSinit; + AggregateDeclaration *ad = toParent()->isAggregateDeclaration(); + if (ad) + ad->sizeok = SIZEOKfwd; +@@ -6508,18 +7333,13 @@ void TemplateMixin::semantic(Scope *sc) + } + return; + } +- } +- +- // Run semantic on each argument, place results in tiargs[] +- semanticTiargs(sc); +- if (errors || arrayObjectIsError(tiargs)) +- return; + +- tempdecl = findBestMatch(sc, NULL); +- if (!tempdecl) +- { inst = this; ++ inst = this; ++ inst->errors = true; + return; // error recovery + } ++ TemplateDeclaration *tempdecl = this->tempdecl->isTemplateDeclaration(); ++ assert(tempdecl); + + if (!ident) + ident = genIdent(tiargs); +@@ -6542,11 +7362,12 @@ void TemplateMixin::semantic(Scope *sc) + continue; + + for (size_t i = 0; i < tiargs->dim; i++) +- { Object *o = (*tiargs)[i]; ++ { ++ RootObject *o = (*tiargs)[i]; + Type *ta = isType(o); + Expression *ea = isExpression(o); + Dsymbol *sa = isDsymbol(o); +- Object *tmo = (*tm->tiargs)[i]; ++ RootObject *tmo = (*tm->tiargs)[i]; + if (ta) + { + Type *tmta = isType(tmo); +@@ -6556,7 +7377,8 @@ void TemplateMixin::semantic(Scope *sc) + goto Lcontinue; + } + else if (ea) +- { Expression *tme = isExpression(tmo); ++ { ++ Expression *tme = isExpression(tmo); + if (!tme || !ea->equals(tme)) + goto Lcontinue; + } +@@ -6577,7 +7399,10 @@ void TemplateMixin::semantic(Scope *sc) + } + + // Copy the syntax trees from the TemplateDeclaration +- members = Dsymbol::arraySyntaxCopy(tempdecl->members); ++ if (scx && members) ++ {} // Don't copy again so they were previously created. ++ else ++ members = Dsymbol::arraySyntaxCopy(tempdecl->members); + if (!members) + return; + +@@ -6610,9 +7435,9 @@ void TemplateMixin::semantic(Scope *sc) + + // Add members to enclosing scope, as well as this scope + for (size_t i = 0; i < members->dim; i++) +- { Dsymbol *s = (*members)[i]; ++ { ++ Dsymbol *s = (*members)[i]; + s->addMember(argscope, this, i); +- //sc->insert(s); + //printf("sc->parent = %p, sc->scopesym = %p\n", sc->parent, sc->scopesym); + //printf("s->parent = %s\n", s->parent->toChars()); + } +@@ -6676,16 +7501,10 @@ void TemplateMixin::semantic(Scope *sc) + return; + } + +- /* The problem is when to parse the initializer for a variable. +- * Perhaps VarDeclaration::semantic() should do it like it does +- * for initializers inside a function. +- */ +-// if (sc->parent->isFuncDeclaration()) +- +- semantic2(sc2); +- +- if (sc->func) ++ AggregateDeclaration *ad = toParent()->isAggregateDeclaration(); ++ if (sc->func && !ad) + { ++ semantic2(sc2); + semantic3(sc2); + } + +@@ -6696,13 +7515,9 @@ void TemplateMixin::semantic(Scope *sc) + } + + sc2->pop(); +- + argscope->pop(); ++ scy->pop(); + +-// if (!isAnonymous()) +- { +- scy->pop(); +- } + #if LOG + printf("-TemplateMixin::semantic('%s', this=%p)\n", toChars(), this); + #endif +@@ -6748,6 +7563,7 @@ void TemplateMixin::semantic3(Scope *sc) + if (members) + { + sc = sc->push(argsym); ++ sc->instantiatingModule = instantiatingModule; + sc = sc->push(this); + for (size_t i = 0; i < members->dim; i++) + { +@@ -6769,7 +7585,7 @@ const char *TemplateMixin::kind() + return "mixin"; + } + +-int TemplateMixin::oneMember(Dsymbol **ps, Identifier *ident) ++bool TemplateMixin::oneMember(Dsymbol **ps, Identifier *ident) + { + return Dsymbol::oneMember(ps, ident); + } +@@ -6790,21 +7606,23 @@ int TemplateMixin::apply(Dsymbol_apply_f + return 0; + } + +-int TemplateMixin::hasPointers() ++bool TemplateMixin::hasPointers() + { + //printf("TemplateMixin::hasPointers() %s\n", toChars()); + + if (members) ++ { + for (size_t i = 0; i < members->dim; i++) + { + Dsymbol *s = (*members)[i]; + //printf(" s = %s %s\n", s->kind(), s->toChars()); + if (s->hasPointers()) + { +- return 1; ++ return true; + } + } +- return 0; ++ } ++ return false; + } + + void TemplateMixin::setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion) +@@ -6838,43 +7656,9 @@ void TemplateMixin::toCBuffer(OutBuffer + { + buf->writestring("mixin "); + +- for (size_t i = 0; i < idents->dim; i++) +- { Identifier *id = (*idents)[i]; ++ tqual->toCBuffer(buf, NULL, hgs); ++ toCBufferTiargs(buf, hgs); + +- if (i) +- buf->writeByte('.'); +- buf->writestring(id->toChars()); +- } +- buf->writestring("!("); +- if (tiargs) +- { +- for (size_t i = 0; i < tiargs->dim; i++) +- { if (i) +- buf->writebyte(','); +- Object *oarg = (*tiargs)[i]; +- Type *t = isType(oarg); +- Expression *e = isExpression(oarg); +- Dsymbol *s = isDsymbol(oarg); +- if (t) +- t->toCBuffer(buf, NULL, hgs); +- else if (e) +- e->toCBuffer(buf, hgs); +- else if (s) +- { +- char *p = s->ident ? s->ident->toChars() : s->toChars(); +- buf->writestring(p); +- } +- else if (!oarg) +- { +- buf->writestring("NULL"); +- } +- else +- { +- assert(0); +- } +- } +- } +- buf->writebyte(')'); + if (ident) + { + buf->writebyte(' '); +@@ -6884,3 +7668,4 @@ void TemplateMixin::toCBuffer(OutBuffer + buf->writenl(); + } + ++ +--- a/src/gcc/d/dfrontend/template.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/template.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,6 @@ + + // Compiler implementation of the D programming language +-// Copyright (c) 1999-2012 by Digital Mars ++// Copyright (c) 1999-2013 by Digital Mars + // All Rights Reserved + // written by Walter Bright + // http://www.digitalmars.com +@@ -21,51 +21,56 @@ + + + struct OutBuffer; +-struct Identifier; +-struct TemplateInstance; +-struct TemplateParameter; +-struct TemplateTypeParameter; +-struct TemplateThisParameter; +-struct TemplateValueParameter; +-struct TemplateAliasParameter; +-struct TemplateTupleParameter; +-struct Type; +-struct TypeTypeof; ++class Identifier; ++class TemplateInstance; ++class TemplateParameter; ++class TemplateTypeParameter; ++class TemplateThisParameter; ++class TemplateValueParameter; ++class TemplateAliasParameter; ++class TemplateTupleParameter; ++class Type; ++class TypeQualified; ++class TypeTypeof; + struct Scope; +-struct Expression; +-struct AliasDeclaration; +-struct FuncDeclaration; ++class Expression; ++class AliasDeclaration; ++class FuncDeclaration; + struct HdrGenState; +-struct Parameter; ++class Parameter; + enum MATCH; + enum PASS; + +-struct Tuple : Object ++class Tuple : public RootObject + { ++public: + Objects objects; + + int dyncast() { return DYNCAST_TUPLE; } // kludge for template.isType() + }; + + +-struct TemplateDeclaration : ScopeDsymbol ++class TemplateDeclaration : public ScopeDsymbol + { ++public: + TemplateParameters *parameters; // array of TemplateParameter's + + TemplateParameters *origParameters; // originals for Ddoc + Expression *constraint; +- TemplateInstances instances; // array of TemplateInstance's ++ ++ // Hash table to look up TemplateInstance's of this TemplateDeclaration ++ Array buckets; ++ size_t numinstances; // number of instances in the hash table + + TemplateDeclaration *overnext; // next overloaded TemplateDeclaration + TemplateDeclaration *overroot; // first in overnext list +- +- enum PASS semanticRun; // 1 semantic() run ++ FuncDeclaration *funcroot; // first function in unified overload list + + Dsymbol *onemember; // if !=NULL then one member of this template + + int literal; // this template declaration is a literal + int ismixin; // template declaration is only to be used as a mixin +- enum PROT protection; ++ PROT protection; + + struct Previous + { Previous *prev; +@@ -78,7 +83,7 @@ struct TemplateDeclaration : ScopeDsymbo + Expression *constraint, Dsymbols *decldefs, int ismixin); + Dsymbol *syntaxCopy(Dsymbol *); + void semantic(Scope *sc); +- int overloadInsert(Dsymbol *s); ++ bool overloadInsert(Dsymbol *s); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); + bool hasStaticCtorOrDtor(); + const char *kind(); +@@ -86,26 +91,31 @@ struct TemplateDeclaration : ScopeDsymbo + + void emitComment(Scope *sc); + void toJson(JsonOut *json); ++ virtual void jsonProperties(JsonOut *json); ++ PROT prot(); + // void toDocBuffer(OutBuffer *buf); + +- MATCH matchWithInstance(TemplateInstance *ti, Objects *atypes, Expressions *fargs, int flag); +- MATCH leastAsSpecialized(TemplateDeclaration *td2, Expressions *fargs); ++ MATCH matchWithInstance(Scope *sc, TemplateInstance *ti, Objects *atypes, Expressions *fargs, int flag); ++ MATCH leastAsSpecialized(Scope *sc, TemplateDeclaration *td2, Expressions *fargs); + +- MATCH deduceFunctionTemplateMatch(Scope *sc, Loc loc, Objects *targsi, Expression *ethis, Expressions *fargs, Objects *dedargs); +- FuncDeclaration *deduceFunctionTemplate(Scope *sc, Loc loc, Objects *targsi, Expression *ethis, Expressions *fargs, int flags = 0); +- Object *declareParameter(Scope *sc, TemplateParameter *tp, Object *o); +- FuncDeclaration *doHeaderInstantiation(Scope *sc, Objects *tdargs, Expressions *fargs); ++ MATCH deduceFunctionTemplateMatch(FuncDeclaration *f, Loc loc, Scope *sc, Objects *tiargs, Type *tthis, Expressions *fargs, Objects *dedargs); ++ RootObject *declareParameter(Scope *sc, TemplateParameter *tp, RootObject *o); ++ FuncDeclaration *doHeaderInstantiation(Scope *sc, Objects *tdargs, Type *tthis, Expressions *fargs); ++ TemplateInstance *findExistingInstance(TemplateInstance *tithis, Expressions *fargs); ++ TemplateInstance *addInstance(TemplateInstance *ti); ++ void removeInstance(TemplateInstance *handle); + + TemplateDeclaration *isTemplateDeclaration() { return this; } + + TemplateTupleParameter *isVariadic(); +- int isOverloadable(); ++ bool isOverloadable(); + + void makeParamNamesVisibleInConstraint(Scope *paramscope, Expressions *fargs); + }; + +-struct TemplateParameter ++class TemplateParameter + { ++public: + /* For type-parameter: + * template Foo(ident) // specType is set to NULL + * template Foo(ident : specType) +@@ -135,11 +145,11 @@ struct TemplateParameter + + virtual TemplateParameter *syntaxCopy() = 0; + virtual void declareParameter(Scope *sc) = 0; +- virtual void semantic(Scope *) = 0; +- virtual void print(Object *oarg, Object *oded) = 0; ++ virtual void semantic(Scope *sc, TemplateParameters *parameters) = 0; ++ virtual void print(RootObject *oarg, RootObject *oded) = 0; + virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs) = 0; +- virtual Object *specialization() = 0; +- virtual Object *defaultArg(Loc loc, Scope *sc) = 0; ++ virtual RootObject *specialization() = 0; ++ virtual RootObject *defaultArg(Loc loc, Scope *sc) = 0; + + /* If TemplateParameter's match as far as overloading goes. + */ +@@ -147,15 +157,17 @@ struct TemplateParameter + + /* Match actual argument against parameter. + */ +- virtual MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0; ++ virtual MATCH matchArg(Loc loc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ virtual MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0; + + /* Create dummy argument based on parameter. + */ + virtual void *dummyArg() = 0; + }; + +-struct TemplateTypeParameter : TemplateParameter ++class TemplateTypeParameter : public TemplateParameter + { ++public: + /* Syntax: + * ident : specType = defaultType + */ +@@ -169,19 +181,20 @@ struct TemplateTypeParameter : TemplateP + TemplateTypeParameter *isTemplateTypeParameter(); + TemplateParameter *syntaxCopy(); + void declareParameter(Scope *sc); +- void semantic(Scope *); +- void print(Object *oarg, Object *oded); ++ void semantic(Scope *sc, TemplateParameters *parameters); ++ void print(RootObject *oarg, RootObject *oded); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- Object *specialization(); +- Object *defaultArg(Loc loc, Scope *sc); ++ RootObject *specialization(); ++ RootObject *defaultArg(Loc loc, Scope *sc); + int overloadMatch(TemplateParameter *); +- MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); + void *dummyArg(); + }; + + #if DMDV2 +-struct TemplateThisParameter : TemplateTypeParameter ++class TemplateThisParameter : public TemplateTypeParameter + { ++public: + /* Syntax: + * this ident : specType = defaultType + */ +@@ -194,8 +207,9 @@ struct TemplateThisParameter : TemplateT + }; + #endif + +-struct TemplateValueParameter : TemplateParameter ++class TemplateValueParameter : public TemplateParameter + { ++public: + /* Syntax: + * valType ident : specValue = defaultValue + */ +@@ -211,45 +225,47 @@ struct TemplateValueParameter : Template + TemplateValueParameter *isTemplateValueParameter(); + TemplateParameter *syntaxCopy(); + void declareParameter(Scope *sc); +- void semantic(Scope *); +- void print(Object *oarg, Object *oded); ++ void semantic(Scope *sc, TemplateParameters *parameters); ++ void print(RootObject *oarg, RootObject *oded); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- Object *specialization(); +- Object *defaultArg(Loc loc, Scope *sc); ++ RootObject *specialization(); ++ RootObject *defaultArg(Loc loc, Scope *sc); + int overloadMatch(TemplateParameter *); +- MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); + void *dummyArg(); + }; + +-struct TemplateAliasParameter : TemplateParameter ++class TemplateAliasParameter : public TemplateParameter + { ++public: + /* Syntax: + * specType ident : specAlias = defaultAlias + */ + + Type *specType; +- Object *specAlias; +- Object *defaultAlias; ++ RootObject *specAlias; ++ RootObject *defaultAlias; + + static Dsymbol *sdummy; + +- TemplateAliasParameter(Loc loc, Identifier *ident, Type *specType, Object *specAlias, Object *defaultAlias); ++ TemplateAliasParameter(Loc loc, Identifier *ident, Type *specType, RootObject *specAlias, RootObject *defaultAlias); + + TemplateAliasParameter *isTemplateAliasParameter(); + TemplateParameter *syntaxCopy(); + void declareParameter(Scope *sc); +- void semantic(Scope *); +- void print(Object *oarg, Object *oded); ++ void semantic(Scope *sc, TemplateParameters *parameters); ++ void print(RootObject *oarg, RootObject *oded); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- Object *specialization(); +- Object *defaultArg(Loc loc, Scope *sc); ++ RootObject *specialization(); ++ RootObject *defaultArg(Loc loc, Scope *sc); + int overloadMatch(TemplateParameter *); +- MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); + void *dummyArg(); + }; + +-struct TemplateTupleParameter : TemplateParameter ++class TemplateTupleParameter : public TemplateParameter + { ++public: + /* Syntax: + * ident ... + */ +@@ -259,25 +275,26 @@ struct TemplateTupleParameter : Template + TemplateTupleParameter *isTemplateTupleParameter(); + TemplateParameter *syntaxCopy(); + void declareParameter(Scope *sc); +- void semantic(Scope *); +- void print(Object *oarg, Object *oded); ++ void semantic(Scope *sc, TemplateParameters *parameters); ++ void print(RootObject *oarg, RootObject *oded); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +- Object *specialization(); +- Object *defaultArg(Loc loc, Scope *sc); ++ RootObject *specialization(); ++ RootObject *defaultArg(Loc loc, Scope *sc); + int overloadMatch(TemplateParameter *); +- MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ MATCH matchArg(Loc loc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); ++ MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam); + void *dummyArg(); + }; + +-struct TemplateInstance : ScopeDsymbol ++class TemplateInstance : public ScopeDsymbol + { ++public: + /* Given: + * foo!(args) => + * name = foo + * tiargs = args + */ + Identifier *name; +- //Identifiers idents; + Objects *tiargs; // Array of Types/Expressions of template + // instance arguments [int*, char, 10*10] + +@@ -285,25 +302,21 @@ struct TemplateInstance : ScopeDsymbol + // to TemplateDeclaration.parameters + // [int, char, 100] + +- TemplateDeclaration *tempdecl; // referenced by foo.bar.abc ++ Dsymbol *tempdecl; // referenced by foo.bar.abc + TemplateInstance *inst; // refer to existing instance + TemplateInstance *tinst; // enclosing template instance + ScopeDsymbol *argsym; // argument symbol table + AliasDeclaration *aliasdecl; // !=NULL if instance is an alias for its + // sole member + WithScopeSymbol *withsym; // if a member of a with statement +- enum PASS semanticRun; // has semantic() been done? +- int semantictiargsdone; // has semanticTiargs() been done? +- int nest; // for recursion detection +- int havetempdecl; // 1 if used second constructor +- Dsymbol *isnested; // if referencing local symbols, this is the context +- int speculative; // 1 if only instantiated with errors gagged +-#ifdef IN_GCC +- /* On some targets, it is necessary to know whether a symbol +- will be emitted in the output or not before the symbol +- is used. This can be different from getModule(). */ +- Module * objFileModule; +-#endif ++ int nest; // for recursion detection ++ bool semantictiargsdone; // has semanticTiargs() been done? ++ bool havetempdecl; // if used second constructor ++ bool speculative; // if only instantiated with errors gagged ++ Dsymbol *enclosing; // if referencing local symbols, this is the context ++ hash_t hash; // cached result of hashCode() ++ Expressions *fargs; // for function template, these are the function arguments ++ Module *instantiatingModule; // the top module that instantiated this instance + + TemplateInstance(Loc loc, Identifier *temp_id); + TemplateInstance(Loc loc, TemplateDeclaration *tempdecl, Objects *tiargs); +@@ -315,23 +328,28 @@ struct TemplateInstance : ScopeDsymbol + void semantic3(Scope *sc); + void inlineScan(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); ++ void toCBufferTiargs(OutBuffer *buf, HdrGenState *hgs); + Dsymbol *toAlias(); // resolve real symbol + const char *kind(); +- int oneMember(Dsymbol **ps, Identifier *ident); +- int needsTypeInference(Scope *sc); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + char *toChars(); +- char *mangle(bool isv = false); ++ const char *mangle(bool isv = false); + void printInstantiationTrace(); ++ Identifier *getIdent(); ++ int compare(RootObject *o); ++ hash_t hashCode(); + + void toObjFile(int multiobj); // compile to .obj file + + // Internal ++ bool findTemplateDeclaration(Scope *sc); ++ bool updateTemplateDeclaration(Scope *sc, Dsymbol *s); + static void semanticTiargs(Loc loc, Scope *sc, Objects *tiargs, int flags); +- void semanticTiargs(Scope *sc); +- TemplateDeclaration *findTemplateDeclaration(Scope *sc); +- TemplateDeclaration *findBestMatch(Scope *sc, Expressions *fargs); ++ bool semanticTiargs(Scope *sc); ++ bool findBestMatch(Scope *sc, Expressions *fargs); ++ bool needsTypeInference(Scope *sc, int flag = 0); ++ bool hasNestedArgs(Objects *tiargs); + void declareParameters(Scope *sc); +- int hasNestedArgs(Objects *tiargs); + Identifier *genIdent(Objects *args); + void expandMembers(Scope *sc); + void tryExpandMembers(Scope *sc); +@@ -341,21 +359,21 @@ struct TemplateInstance : ScopeDsymbol + AliasDeclaration *isAliasDeclaration(); + }; + +-struct TemplateMixin : TemplateInstance ++class TemplateMixin : public TemplateInstance + { +- Identifiers *idents; +- Type *tqual; ++public: ++ TypeQualified *tqual; + +- TemplateMixin(Loc loc, Identifier *ident, Type *tqual, Identifiers *idents, Objects *tiargs); ++ TemplateMixin(Loc loc, Identifier *ident, TypeQualified *tqual, Objects *tiargs); + Dsymbol *syntaxCopy(Dsymbol *s); + void semantic(Scope *sc); + void semantic2(Scope *sc); + void semantic3(Scope *sc); + void inlineScan(); + const char *kind(); +- int oneMember(Dsymbol **ps, Identifier *ident); ++ bool oneMember(Dsymbol **ps, Identifier *ident); + int apply(Dsymbol_apply_ft_t fp, void *param); +- int hasPointers(); ++ bool hasPointers(); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); + char *toChars(); + void toCBuffer(OutBuffer *buf, HdrGenState *hgs); +@@ -363,20 +381,22 @@ struct TemplateMixin : TemplateInstance + + void toObjFile(int multiobj); // compile to .obj file + ++ bool findTemplateDeclaration(Scope *sc); ++ + TemplateMixin *isTemplateMixin() { return this; } + }; + +-Expression *isExpression(Object *o); +-Dsymbol *isDsymbol(Object *o); +-Type *isType(Object *o); +-Tuple *isTuple(Object *o); +-Parameter *isParameter(Object *o); ++Expression *isExpression(RootObject *o); ++Dsymbol *isDsymbol(RootObject *o); ++Type *isType(RootObject *o); ++Tuple *isTuple(RootObject *o); ++Parameter *isParameter(RootObject *o); + int arrayObjectIsError(Objects *args); +-int isError(Object *o); +-Type *getType(Object *o); +-Dsymbol *getDsymbol(Object *o); ++int isError(RootObject *o); ++Type *getType(RootObject *o); ++Dsymbol *getDsymbol(RootObject *o); + +-void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg); +-Object *objectSyntaxCopy(Object *o); ++void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, RootObject *oarg); ++RootObject *objectSyntaxCopy(RootObject *o); + + #endif /* DMD_TEMPLATE_H */ +--- a/src/gcc/d/dfrontend/traits.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/traits.c 2014-04-01 16:32:51.000000000 +0100 +@@ -15,6 +15,7 @@ + #include + + #include "rmem.h" ++#include "aav.h" + + //#include "port.h" + #include "mtype.h" +@@ -51,9 +52,13 @@ struct Ptrait + Identifier *ident; // which trait we're looking for + }; + +-static int fptraits(void *param, FuncDeclaration *f) +-{ Ptrait *p = (Ptrait *)param; ++static int fptraits(void *param, Dsymbol *s) ++{ ++ FuncDeclaration *f = s->isFuncDeclaration(); ++ if (!f) ++ return 0; + ++ Ptrait *p = (Ptrait *)param; + if (p->ident == Id::getVirtualFunctions && !f->isVirtual()) + return 0; + +@@ -61,14 +66,62 @@ static int fptraits(void *param, FuncDec + return 0; + + Expression *e; ++ FuncAliasDeclaration* alias = new FuncAliasDeclaration(f, 0); ++ alias->protection = f->protection; + if (p->e1) +- e = new DotVarExp(0, p->e1, new FuncAliasDeclaration(f, 0)); ++ e = new DotVarExp(Loc(), p->e1, alias); + else +- e = new DsymbolExp(0, new FuncAliasDeclaration(f, 0)); ++ e = new DsymbolExp(Loc(), alias); + p->exps->push(e); + return 0; + } + ++/** ++ * Collects all unit test functions from the given array of symbols. ++ * ++ * This is a helper function used by the implementation of __traits(getUnitTests). ++ * ++ * Input: ++ * symbols array of symbols to collect the functions from ++ * uniqueUnitTests an associative array (should actually be a set) to ++ * keep track of already collected functions. We're ++ * using an AA here to avoid doing a linear search of unitTests ++ * ++ * Output: ++ * unitTests array of DsymbolExp's of the collected unit test functions ++ * uniqueUnitTests updated with symbols from unitTests[ ] ++ */ ++static void collectUnitTests(Dsymbols *symbols, AA *uniqueUnitTests, Expressions *unitTests) ++{ ++ for (size_t i = 0; i < symbols->dim; i++) ++ { ++ Dsymbol *symbol = (*symbols)[i]; ++ UnitTestDeclaration *unitTest = symbol->isUnitTestDeclaration(); ++ if (unitTest) ++ { ++ if (!_aaGetRvalue(uniqueUnitTests, unitTest)) ++ { ++ FuncAliasDeclaration* alias = new FuncAliasDeclaration(unitTest, 0); ++ alias->protection = unitTest->protection; ++ Expression* e = new DsymbolExp(Loc(), alias); ++ unitTests->push(e); ++ bool* value = (bool*) _aaGet(&uniqueUnitTests, unitTest); ++ *value = true; ++ } ++ } ++ else ++ { ++ AttribDeclaration *attrDecl = symbol->isAttribDeclaration(); ++ ++ if (attrDecl) ++ { ++ Dsymbols *decl = attrDecl->include(NULL, NULL); ++ collectUnitTests(decl, uniqueUnitTests, unitTests); ++ } ++ } ++ } ++} ++ + /************************ TraitsExp ************************************/ + + Expression *TraitsExp::semantic(Scope *sc) +@@ -77,7 +130,7 @@ Expression *TraitsExp::semantic(Scope *s + printf("TraitsExp::semantic() %s\n", toChars()); + #endif + if (ident != Id::compiles && ident != Id::isSame && +- ident != Id::identifier) ++ ident != Id::identifier && ident != Id::getProtection) + { + TemplateInstance::semanticTiargs(loc, sc, args, 1); + } +@@ -150,7 +203,7 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Type *t = isType(o); + StructDeclaration *sd; + if (!t) +@@ -168,6 +221,34 @@ Expression *TraitsExp::semantic(Scope *s + } + goto Ltrue; + } ++ else if (ident == Id::isNested) ++ { ++ if (dim != 1) ++ goto Ldimerror; ++ RootObject *o = (*args)[0]; ++ Dsymbol *s = getDsymbol(o); ++ AggregateDeclaration *a; ++ FuncDeclaration *f; ++ ++ if (!s) { } ++ else if ((a = s->isAggregateDeclaration()) != NULL) ++ { ++ if (a->isNested()) ++ goto Ltrue; ++ else ++ goto Lfalse; ++ } ++ else if ((f = s->isFuncDeclaration()) != NULL) ++ { ++ if (f->isNested()) ++ goto Ltrue; ++ else ++ goto Lfalse; ++ } ++ ++ error("aggregate or function expected instead of '%s'", o->toChars()); ++ goto Lfalse; ++ } + else if (ident == Id::isAbstractFunction) + { + FuncDeclaration *f; +@@ -186,7 +267,7 @@ Expression *TraitsExp::semantic(Scope *s + else if (ident == Id::isFinalFunction) + { + FuncDeclaration *f; +- ISDSYMBOL((f = s->isFuncDeclaration()) != NULL && f->isFinal()) ++ ISDSYMBOL((f = s->isFuncDeclaration()) != NULL && f->isFinalFunc()) + } + #if DMDV2 + else if (ident == Id::isStaticFunction) +@@ -217,7 +298,7 @@ Expression *TraitsExp::semantic(Scope *s + + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Parameter *po = isParameter(o); + Identifier *id; + if (po) +@@ -241,7 +322,13 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ ++ Scope *sc2 = sc->push(); ++ sc2->flags = sc->flags | SCOPEnoaccesscheck; ++ TemplateInstance::semanticTiargs(loc, sc2, args, 1); ++ sc2->pop(); ++ ++ RootObject *o = (*args)[0]; + Dsymbol *s = getDsymbol(o); + if (!s) + { +@@ -249,11 +336,13 @@ Expression *TraitsExp::semantic(Scope *s + error("argument %s has no protection", o->toChars()); + goto Lfalse; + } +- ++ if (s->scope) ++ s->semantic(s->scope); + PROT protection = s->prot(); + + const char *protName = Pprotectionnames[protection]; + ++ assert(protName); + StringExp *se = new StringExp(loc, (char *) protName); + return se->semantic(sc); + } +@@ -261,7 +350,7 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Dsymbol *s = getDsymbol(o); + if (s) + { +@@ -286,7 +375,7 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 2) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Expression *e = isExpression((*args)[1]); + if (!e) + { error("expression expected as second argument of __traits %s", ident->toChars()); +@@ -305,17 +394,17 @@ Expression *TraitsExp::semantic(Scope *s + } + Identifier *id = Lexer::idPool((char *)se->string); + +- Type *t = isType(o); +- e = isExpression(o); +- Dsymbol *s = isDsymbol(o); +- if (t) +- e = typeDotIdExp(loc, t, id); +- else if (e) +- e = new DotIdExp(loc, e, id); +- else if (s) +- { e = new DsymbolExp(loc, s); ++ /* Prefer dsymbol, because it might need some runtime contexts. ++ */ ++ Dsymbol *sym = getDsymbol(o); ++ if (sym) ++ { e = new DsymbolExp(loc, sym); + e = new DotIdExp(loc, e, id); + } ++ else if (Type *t = isType(o)) ++ e = typeDotIdExp(loc, t, id); ++ else if (Expression *ex = isExpression(o)) ++ e = new DotIdExp(loc, ex, id); + else + { error("invalid first argument"); + goto Lfalse; +@@ -323,21 +412,16 @@ Expression *TraitsExp::semantic(Scope *s + + if (ident == Id::hasMember) + { +- if (t) ++ if (sym) + { +- Dsymbol *sym = t->toDsymbol(sc); +- if (sym) +- { +- Dsymbol *sm = sym->search(loc, id, 0); +- if (sm) +- goto Ltrue; +- } ++ Dsymbol *sm = sym->search(loc, id, 0); ++ if (sm) ++ goto Ltrue; + } + + /* Take any errors as meaning it wasn't found + */ + Scope *sc2 = sc->push(); +- //sc2->inHasMember++; + e = e->trySemantic(sc2); + sc2->pop(); + if (!e) +@@ -384,7 +468,7 @@ Expression *TraitsExp::semantic(Scope *s + p.exps = exps; + p.e1 = e; + p.ident = ident; +- overloadApply(f, fptraits, &p); ++ overloadApply(f, &p, &fptraits); + + TupleExp *tup = new TupleExp(loc, exps); + return tup->semantic(sc); +@@ -396,7 +480,7 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Dsymbol *s = getDsymbol(o); + ClassDeclaration *cd; + if (!s || (cd = s->isClassDeclaration()) == NULL) +@@ -410,10 +494,16 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Dsymbol *s = getDsymbol(o); + if (!s) + { ++ #if 0 ++ Expression *e = isExpression(o); ++ Type *t = isType(o); ++ if (e) printf("e = %s %s\n", Token::toChars(e->op), e->toChars()); ++ if (t) printf("t = %d %s\n", t->ty, t->toChars()); ++ #endif + error("first argument is not a symbol"); + goto Lfalse; + } +@@ -427,7 +517,7 @@ Expression *TraitsExp::semantic(Scope *s + { + if (dim != 1) + goto Ldimerror; +- Object *o = (*args)[0]; ++ RootObject *o = (*args)[0]; + Dsymbol *s = getDsymbol(o); + ScopeDsymbol *sd; + if (!s) +@@ -435,7 +525,12 @@ Expression *TraitsExp::semantic(Scope *s + error("argument has no members"); + goto Lfalse; + } +- if ((sd = s->isScopeDsymbol()) == NULL) ++ Import *import; ++ if ((import = s->isImport()) != NULL) ++ { // Bugzilla 9692 ++ sd = import->mod; ++ } ++ else if ((sd = s->isScopeDsymbol()) == NULL) + { + error("%s %s has no members", s->kind(), s->toChars()); + goto Lfalse; +@@ -451,6 +546,14 @@ Expression *TraitsExp::semantic(Scope *s + //printf("\t[%i] %s %s\n", i, sm->kind(), sm->toChars()); + if (sm->ident) + { ++ if (sm->ident != Id::ctor && // backword compatibility ++ sm->ident != Id::dtor && // backword compatibility ++ sm->ident != Id::_postblit && // backword compatibility ++ memcmp(sm->ident->string, "__", 2) == 0) ++ { ++ return 0; ++ } ++ + //printf("\t%s\n", sm->ident->toChars()); + Identifiers *idents = (Identifiers *)ctx; + +@@ -468,6 +571,14 @@ Expression *TraitsExp::semantic(Scope *s + + idents->push(sm->ident); + } ++ else ++ { ++ EnumDeclaration *ed = sm->isEnumDeclaration(); ++ if (ed) ++ { ++ ScopeDsymbol::foreach(NULL, ed->members, &PushIdentsDg::dg, (Identifiers *)ctx); ++ } ++ } + return 0; + } + }; +@@ -525,37 +636,42 @@ Expression *TraitsExp::semantic(Scope *s + goto Lfalse; + + for (size_t i = 0; i < dim; i++) +- { Object *o = (*args)[i]; +- Expression *e; +- ++ { + unsigned errors = global.startGagging(); + unsigned oldspec = global.speculativeGag; + global.speculativeGag = global.gag; +- bool scSpec = sc->speculative; ++ sc = sc->push(); + sc->speculative = true; ++ sc->flags = sc->enclosing->flags & ~SCOPEctfe; // inherit without CTFEing ++ bool err = false; + ++ RootObject *o = (*args)[i]; + Type *t = isType(o); +- if (t) +- { Dsymbol *s; ++ Expression *e = t ? t->toExpression() : isExpression(o); ++ if (!e && t) ++ { ++ Dsymbol *s; + t->resolve(loc, sc, &e, &t, &s); + if (t) ++ { + t->semantic(loc, sc); +- else if (e) +- { e = e->semantic(sc); +- e = e->optimize(WANTvalue); ++ if (t->ty == Terror) ++ err = true; + } ++ else if (s && s->errors) ++ err = true; + } +- else +- { e = isExpression(o); +- if (e) +- { e = e->semantic(sc); +- e = e->optimize(WANTvalue); +- } ++ if (e) ++ { ++ e = e->semantic(sc); ++ e = e->optimize(WANTvalue); ++ if (e->op == TOKerror) ++ err = true; + } + +- sc->speculative = scSpec; ++ sc = sc->pop(); + global.speculativeGag = oldspec; +- if (global.endGagging(errors)) ++ if (global.endGagging(errors) || err) + { + goto Lfalse; + } +@@ -568,8 +684,8 @@ Expression *TraitsExp::semantic(Scope *s + if (dim != 2) + goto Ldimerror; + TemplateInstance::semanticTiargs(loc, sc, args, 0); +- Object *o1 = (*args)[0]; +- Object *o2 = (*args)[1]; ++ RootObject *o1 = (*args)[0]; ++ RootObject *o2 = (*args)[1]; + Dsymbol *s1 = getDsymbol(o1); + Dsymbol *s2 = getDsymbol(o2); + +@@ -615,6 +731,64 @@ Expression *TraitsExp::semantic(Scope *s + else + goto Lfalse; + } ++ else if (ident == Id::getUnitTests) ++ { ++ if (dim != 1) ++ goto Ldimerror; ++ RootObject *o = (*args)[0]; ++ Dsymbol *s = getDsymbol(o); ++ if (!s) ++ { ++ error("argument %s to __traits(getUnitTests) must be a module or aggregate", o->toChars()); ++ goto Lfalse; ++ } ++ ++ Import *imp = s->isImport(); ++ if (imp) // Bugzilla 10990 ++ s = imp->mod; ++ ++ ScopeDsymbol* scope = s->isScopeDsymbol(); ++ ++ if (!scope) ++ { ++ error("argument %s to __traits(getUnitTests) must be a module or aggregate, not a %s", s->toChars(), s->kind()); ++ goto Lfalse; ++ } ++ ++ Expressions* unitTests = new Expressions(); ++ Dsymbols* symbols = scope->members; ++ ++ if (global.params.useUnitTests && symbols) ++ { ++ // Should actually be a set ++ AA* uniqueUnitTests = NULL; ++ collectUnitTests(symbols, uniqueUnitTests, unitTests); ++ } ++ ++ TupleExp *tup = new TupleExp(loc, unitTests); ++ return tup->semantic(sc); ++ } ++ else if (ident == Id::isOverrideFunction) ++ { ++ FuncDeclaration *f; ++ ISDSYMBOL((f = s->isFuncDeclaration()) != NULL && f->isOverride()) ++ } ++ else if(ident == Id::getVirtualIndex) ++ { ++ if (dim != 1) ++ goto Ldimerror; ++ RootObject *o = (*args)[0]; ++ Dsymbol *s = getDsymbol(o); ++ FuncDeclaration *fd; ++ if (!s || (fd = s->isFuncDeclaration()) == NULL) ++ { ++ error("first argument to __traits(getVirtualIndex) must be a function"); ++ goto Lfalse; ++ } ++ fd = fd->toAliasFunc(); // Neccessary to support multiple overloads. ++ ptrdiff_t result = fd->isVirtual() ? fd->vtblIndex : -1; ++ return new IntegerExp(loc, fd->vtblIndex, Type::tptrdiff_t); ++ } + else + { error("unrecognized trait %s", ident->toChars()); + goto Lfalse; +@@ -623,7 +797,7 @@ Expression *TraitsExp::semantic(Scope *s + return NULL; + + Ldimerror: +- error("wrong number of arguments %d", dim); ++ error("wrong number of arguments %d", (int)dim); + goto Lfalse; + + +@@ -634,5 +808,4 @@ Ltrue: + return new IntegerExp(loc, 1, Type::tbool); + } + +- + #endif +--- a/src/gcc/d/dfrontend/utf.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/utf.c 2014-04-01 16:32:51.000000000 +0100 +@@ -19,9 +19,6 @@ + + #include "utf.h" + +-namespace +-{ +- + /* The following encodings are valid, except for the 5 and 6 byte + * combinations: + * 0xxxxxxx +@@ -51,11 +48,6 @@ const unsigned UTF8_STRIDE[256] = + 4,4,4,4,4,4,4,4,5,5,5,5,6,6,0xFF,0xFF, + }; + +-} // namespace +- +-namespace Unicode +-{ +- + // UTF-8 decoding errors + char const UTF8_DECODE_OUTSIDE_CODE_SPACE[] = "Outside Unicode code space"; + char const UTF8_DECODE_TRUNCATED_SEQUENCE[] = "Truncated UTF-8 sequence"; +@@ -69,10 +61,6 @@ char const UTF16_DECODE_INVALID_SURROGAT + char const UTF16_DECODE_UNPAIRED_SURROGATE[]= "Unpaired surrogate"; + char const UTF16_DECODE_INVALID_CODE_POINT[]= "Invalid code point decoded"; + +-} // namespace Unicode +- +-using namespace Unicode; +- + /// The Unicode code space is the range of code points [0x000000,0x10FFFF] + /// except the UTF-16 surrogate pairs in the range [0xD800,0xDFFF] + /// and non-characters (which end in 0xFFFE or 0xFFFF). +--- a/src/gcc/d/dfrontend/utf.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/utf.h 2014-04-01 16:32:51.000000000 +0100 +@@ -20,9 +20,6 @@ typedef unsigned short utf16_t; + typedef unsigned int utf32_t; + typedef utf32_t dchar_t; + +-namespace Unicode +-{ +- + static utf16_t const ALPHA_TABLE[][2] = + { + { 0x00AA, 0x00AA }, { 0x00B5, 0x00B5 }, { 0x00B7, 0x00B7 }, { 0x00BA, 0x00BA }, +@@ -102,8 +99,6 @@ extern char const UTF16_DECODE_INVALID_S + extern char const UTF16_DECODE_UNPAIRED_SURROGATE[]; + extern char const UTF16_DECODE_INVALID_CODE_POINT[]; + +-} // namespace Unicode +- + /// \return true if \a c is a valid, non-private UTF-32 code point + bool utf_isValidDchar(dchar_t c); + +--- a/src/gcc/d/dfrontend/version.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/version.c 2014-04-01 16:32:51.000000000 +0100 +@@ -57,11 +57,17 @@ int DebugSymbol::addMember(Scope *sc, Sc + if (ident) + { + if (!m) ++ { + error("declaration must be at module level"); ++ errors = true; ++ } + else + { + if (findCondition(m->debugidsNot, ident)) ++ { + error("defined after use"); ++ errors = true; ++ } + if (!m->debugids) + m->debugids = new Strings(); + m->debugids->push(ident->toChars()); +@@ -70,7 +76,10 @@ int DebugSymbol::addMember(Scope *sc, Sc + else + { + if (!m) ++ { + error("level declaration must be at module level"); ++ errors = true; ++ } + else + m->debuglevel = level; + } +@@ -138,11 +147,17 @@ int VersionSymbol::addMember(Scope *sc, + { + VersionCondition::checkPredefined(loc, ident->toChars()); + if (!m) ++ { + error("declaration must be at module level"); ++ errors = true; ++ } + else + { + if (findCondition(m->versionidsNot, ident)) ++ { + error("defined after use"); ++ errors = true; ++ } + if (!m->versionids) + m->versionids = new Strings(); + m->versionids->push(ident->toChars()); +@@ -151,7 +166,10 @@ int VersionSymbol::addMember(Scope *sc, + else + { + if (!m) ++ { + error("level declaration must be at module level"); ++ errors = true; ++ } + else + m->versionlevel = level; + } +--- a/src/gcc/d/dfrontend/version.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/dfrontend/version.h 2014-04-01 16:32:51.000000000 +0100 +@@ -20,8 +20,9 @@ + struct OutBuffer; + struct HdrGenState; + +-struct DebugSymbol : Dsymbol ++class DebugSymbol : public Dsymbol + { ++public: + unsigned level; + + DebugSymbol(Loc loc, Identifier *ident); +@@ -34,8 +35,9 @@ struct DebugSymbol : Dsymbol + const char *kind(); + }; + +-struct VersionSymbol : Dsymbol ++class VersionSymbol : public Dsymbol + { ++public: + unsigned level; + + VersionSymbol(Loc loc, Identifier *ident); +--- a/src/gcc/d/d-glue.cc 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/gcc/d/d-glue.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,373 @@ ++// d-glue.cc -- D frontend for GCC. ++// Copyright (C) 2013 Free Software Foundation, Inc. ++ ++// GCC is free software; you can redistribute it and/or modify it under ++// the terms of the GNU General Public License as published by the Free ++// Software Foundation; either version 3, or (at your option) any later ++// version. ++ ++// GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++// WARRANTY; without even the implied warranty of MERCHANTABILITY or ++// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++// for more details. ++ ++// You should have received a copy of the GNU General Public License ++// along with GCC; see the file COPYING3. If not see ++// . ++ ++#include "d-system.h" ++#include "d-objfile.h" ++ ++#include "mars.h" ++#include "module.h" ++ ++Global global; ++ ++void ++Global::init (void) ++{ ++ this->mars_ext = "d"; ++ this->sym_ext = "d"; ++ this->hdr_ext = "di"; ++ this->doc_ext = "html"; ++ this->ddoc_ext = "ddoc"; ++ this->json_ext = "json"; ++ this->map_ext = "map"; ++ ++ this->obj_ext = "o"; ++ this->lib_ext = "a"; ++ this->dll_ext = "so"; ++ ++ this->version = "v" ++#include "verstr.h" ++ ; ++ ++ this->compiler.vendor = "GNU D"; ++ this->stdmsg = stdout; ++ this->main_d = "__main.d"; ++ ++ memset (&this->params, 0, sizeof (Param)); ++} ++ ++unsigned ++Global::startGagging (void) ++{ ++ this->gag++; ++ return this->gaggedErrors; ++} ++ ++bool ++Global::endGagging (unsigned oldGagged) ++{ ++ bool anyErrs = (this->gaggedErrors != oldGagged); ++ this->gag--; ++ ++ // Restore the original state of gagged errors; set total errors ++ // to be original errors + new ungagged errors. ++ this->errors -= (this->gaggedErrors - oldGagged); ++ this->gaggedErrors = oldGagged; ++ ++ return anyErrs; ++} ++ ++bool ++Global::isSpeculativeGagging (void) ++{ ++ if (!this->gag) ++ return false; ++ ++ if (this->gag != this->speculativeGag) ++ return false; ++ ++ return true; ++} ++ ++void ++Global::increaseErrorCount (void) ++{ ++ if (gag) ++ this->gaggedErrors++; ++ ++ this->errors++; ++} ++ ++Ungag ++Dsymbol::ungagSpeculative (void) ++{ ++ unsigned oldgag = global.gag; ++ ++ if (global.isSpeculativeGagging() && !isSpeculative()) ++ global.gag = 0; ++ ++ return Ungag (oldgag); ++} ++ ++Ungag::~Ungag (void) ++{ ++ global.gag = this->oldgag; ++} ++ ++ ++char * ++Loc::toChars (void) ++{ ++ OutBuffer buf; ++ ++ if (this->filename) ++ buf.printf ("%s", this->filename); ++ ++ if (this->linnum) ++ buf.printf (":%u", this->linnum); ++ ++ buf.writeByte (0); ++ ++ return (char *)buf.extractData(); ++} ++ ++Loc::Loc (Module *mod, unsigned linnum) ++{ ++ this->linnum = linnum; ++ this->filename = mod ? mod->srcfile->toChars() : NULL; ++} ++ ++bool ++Loc::equals (const Loc& loc) ++{ ++ if (this->linnum != loc.linnum) ++ return false; ++ ++ if (!FileName::equals (this->filename, loc.filename)) ++ return false; ++ ++ return true; ++} ++ ++ ++// Print a hard error message. ++ ++void ++error (Loc loc, const char *format, ...) ++{ ++ va_list ap; ++ va_start (ap, format); ++ verror (loc, format, ap); ++ va_end (ap); ++} ++ ++void ++error (const char *filename, unsigned linnum, const char *format, ...) ++{ ++ Loc loc; ++ va_list ap; ++ ++ loc.filename = CONST_CAST (char *, filename); ++ loc.linnum = linnum; ++ ++ va_start (ap, format); ++ verror (loc, format, ap); ++ va_end (ap); ++} ++ ++void ++verror (Loc loc, const char *format, va_list ap, ++ const char *p1, const char *p2, const char *) ++{ ++ if (!global.gag) ++ { ++ location_t location = get_linemap (loc); ++ char *msg; ++ ++ // Build string and emit. ++ if (p2) ++ format = concat (p2, " ", format, NULL); ++ ++ if (p1) ++ format = concat (p1, " ", format, NULL); ++ ++ if (vasprintf (&msg, format, ap) >= 0 && msg != NULL) ++ error_at (location, "%s", msg); ++ ++ // Moderate blizzard of cascading messages ++ if (global.errors >= 20) ++ fatal(); ++ } ++ else ++ global.gaggedErrors++; ++ ++ global.errors++; ++} ++ ++// Print supplementary message about the last error. ++// Doesn't increase error count. ++ ++void ++errorSupplemental (Loc loc, const char *format, ...) ++{ ++ va_list ap; ++ va_start (ap, format); ++ verrorSupplemental (loc, format, ap); ++ va_end (ap); ++} ++ ++void ++verrorSupplemental (Loc loc, const char *format, va_list ap) ++{ ++ if (!global.gag) ++ { ++ location_t location = get_linemap (loc); ++ char *msg; ++ ++ if (vasprintf (&msg, format, ap) >= 0 && msg != NULL) ++ inform (location, "%s", msg); ++ } ++} ++ ++// Print a warning message. ++ ++void ++warning (Loc loc, const char *format, ...) ++{ ++ va_list ap; ++ va_start (ap, format); ++ vwarning (loc, format, ap); ++ va_end (ap); ++} ++ ++void ++vwarning (Loc loc, const char *format, va_list ap) ++{ ++ if (global.params.warnings && !global.gag) ++ { ++ location_t location = get_linemap (loc); ++ char *msg; ++ ++ if (vasprintf (&msg, format, ap) >= 0 && msg != NULL) ++ warning_at (location, 0, "%s", msg); ++ ++ // Warnings don't count if gagged. ++ if (global.params.warnings == 1) ++ global.warnings++; ++ } ++} ++ ++// Print a deprecation message. ++ ++void ++deprecation (Loc loc, const char *format, ...) ++{ ++ va_list ap; ++ va_start (ap, format); ++ vdeprecation (loc, format, ap); ++ va_end (ap); ++} ++ ++void ++vdeprecation (Loc loc, const char *format, va_list ap, ++ const char *p1, const char *p2) ++{ ++ if (global.params.useDeprecated == 0) ++ verror (loc, format, ap, p1, p2); ++ else if (global.params.useDeprecated == 2 && !global.gag) ++ { ++ location_t location = get_linemap (loc); ++ char *msg; ++ ++ // Build string and emit. ++ if (p2) ++ format = concat (p2, " ", format, NULL); ++ ++ if (p1) ++ format = concat (p1, " ", format, NULL); ++ ++ if (vasprintf (&msg, format, ap) >= 0 && msg != NULL) ++ warning_at (location, OPT_Wdeprecated, "%s", msg); ++ } ++} ++ ++// Call this after printing out fatal error messages to clean up and exit ++// the compiler. ++ ++void ++fatal (void) ++{ ++ exit (FATAL_EXIT_CODE); ++} ++ ++ ++void ++escapePath (OutBuffer *buf, const char *fname) ++{ ++ while (1) ++ { ++ switch (*fname) ++ { ++ case 0: ++ return; ++ ++ case '(': ++ case ')': ++ case '\\': ++ buf->writebyte('\\'); ++ ++ default: ++ buf->writebyte(*fname); ++ break; ++ } ++ fname++; ++ } ++} ++ ++void ++readFile (Loc loc, File *f) ++{ ++ if (f->read()) ++ { ++ error (loc, "Error reading file '%s'", f->name->toChars()); ++ fatal(); ++ } ++} ++ ++void ++writeFile (Loc loc, File *f) ++{ ++ if (f->write()) ++ { ++ error (loc, "Error writing file '%s'", f->name->toChars()); ++ fatal(); ++ } ++} ++ ++void ++ensurePathToNameExists (Loc loc, const char *name) ++{ ++ const char *pt = FileName::path (name); ++ if (*pt) ++ { ++ if (FileName::ensurePathExists(pt)) ++ { ++ error (loc, "cannot create directory %s", pt); ++ fatal(); ++ } ++ } ++} ++ ++// Binary search for P in TAB between the range 0 to HIGH. ++ ++int binary(const char *p , const char **tab, int high) ++{ ++ int low = 0; ++ do ++ { ++ int pos = (low + high) / 2; ++ int cmp = strcmp(p, tab[pos]); ++ if (! cmp) ++ return pos; ++ else if (cmp < 0) ++ high = pos; ++ else ++ low = pos + 1; ++ } while (low != high); ++ ++ return -1; ++} ++ +--- a/src/gcc/d/d-gt.c 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-gt.c 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + /* d-gt.c -- D frontend for GCC. +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ Copyright (C) 2011-2013 Free Software Foundation, Inc. + + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free +--- a/src/gcc/d/d-incpath.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-incpath.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-incpath.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -145,8 +145,8 @@ add_import_path (Strings *paths) + + for (size_t i = 0; i < paths->dim; i++) + { +- String p = (*paths)[i]; +- char *target_dir = make_absolute (p.toChars()); ++ char *path = (*paths)[i]; ++ char *target_dir = make_absolute (path); + + if (!FileName::exists (target_dir)) + { +@@ -171,8 +171,8 @@ add_fileimp_path (Strings *paths) + + for (size_t i = 0; i < paths->dim; i++) + { +- String p = (*paths)[i]; +- char *target_dir = make_absolute (p.toChars()); ++ char *path = (*paths)[i]; ++ char *target_dir = make_absolute (path); + + if (!FileName::exists (target_dir)) + { +--- a/src/gcc/d/d-ir.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-ir.cc 1970-01-01 01:00:00.000000000 +0100 +@@ -1,549 +0,0 @@ +-// d-ir.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +-// GCC is free software; you can redistribute it and/or modify it under +-// the terms of the GNU General Public License as published by the Free +-// Software Foundation; either version 3, or (at your option) any later +-// version. +- +-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY +-// WARRANTY; without even the implied warranty of MERCHANTABILITY or +-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-// for more details. +- +-#include "d-system.h" +- +-#include "id.h" +-#include "enum.h" +-#include "module.h" +-#include "init.h" +-#include "d-lang.h" +-#include "d-codegen.h" +- +- +-void +-Statement::toIR (IRState *) +-{ +- ::error ("Statement::toIR: don't know what to do (%s)", toChars()); +- gcc_unreachable(); +-} +- +-void +-LabelStatement::toIR (IRState *irs) +-{ +- FuncDeclaration *func = irs->func; +- LabelDsymbol *label = irs->isReturnLabel (ident) ? func->returnLabel : func->searchLabel (ident); +- tree t_label = irs->getLabelTree (label); +- +- if (t_label != NULL_TREE) +- { +- irs->pushLabel (label); +- irs->doLabel (t_label); +- if (irs->isReturnLabel (ident) && func->fensure) +- func->fensure->toIR (irs); +- else if (statement) +- statement->toIR (irs); +- if (fwdrefs) +- { +- irs->checkPreviousGoto (fwdrefs); +- delete fwdrefs; +- fwdrefs = NULL; +- } +- } +- // else, there was an error +-} +- +-void +-GotoStatement::toIR (IRState *irs) +-{ +- tree t_label; +- +- object_file->setLoc (loc); /* This makes the 'undefined label' error show up on the correct line... +- The extra doLineNote in doJump shouldn't cause a problem. */ +- if (!label->statement) +- error ("label %s is undefined", label->toChars()); +- else if (tf != label->statement->tf) +- error ("cannot goto forward out of or into finally block"); +- else +- irs->checkGoto (this, label); +- +- t_label = irs->getLabelTree (label); +- if (t_label != NULL_TREE) +- irs->doJump (this, t_label); +- // else, there was an error +-} +- +-void +-GotoCaseStatement::toIR (IRState *irs) +-{ +- // assumes cblocks have been set in SwitchStatement::toIR +- irs->doJump (this, cs->cblock); +-} +- +-void +-GotoDefaultStatement::toIR (IRState *irs) +-{ +- // assumes cblocks have been set in SwitchStatement::toIR +- irs->doJump (this, sw->sdefault->cblock); +-} +- +-void +-SwitchErrorStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->addExp (d_assert_call (loc, LIBCALL_SWITCH_ERROR)); +-} +- +-void +-ThrowStatement::toIR (IRState *irs) +-{ +- ClassDeclaration *class_decl = exp->type->toBasetype()->isClassHandle(); +- // Front end already checks for isClassHandle +- InterfaceDeclaration *intfc_decl = class_decl->isInterfaceDeclaration(); +- tree arg = exp->toElemDtor (irs); +- +- if (!flag_exceptions) +- { +- static int warned = 0; +- if (!warned) +- { +- error ("exception handling disabled, use -fexceptions to enable"); +- warned = 1; +- } +- } +- +- if (intfc_decl) +- { +- if (!intfc_decl->isCOMclass()) +- arg = convert_expr (arg, exp->type, build_object_type()); +- else +- error ("cannot throw COM interfaces"); +- } +- irs->doLineNote (loc); +- irs->addExp (build_libcall (LIBCALL_THROW, 1, &arg)); +-} +- +-void +-TryFinallyStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->startTry (this); +- if (body) +- body->toIR (irs); +- +- irs->startFinally(); +- if (finalbody) +- finalbody->toIR (irs); +- +- irs->endFinally(); +-} +- +-void +-TryCatchStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->startTry (this); +- if (body) +- body->toIR (irs); +- +- irs->startCatches(); +- if (catches) +- { +- for (size_t i = 0; i < catches->dim; i++) +- { +- Catch *a_catch = (*catches)[i]; +- +- irs->startCatch (a_catch->type->toCtype()); +- irs->doLineNote (a_catch->loc); +- irs->startScope(); +- +- if (a_catch->var) +- { +- tree exc_obj = convert_expr (build_exception_object(), +- build_object_type(), a_catch->type); +- tree catch_var = a_catch->var->toSymbol()->Stree; +- // need to override initializer... +- // set DECL_INITIAL now and emitLocalVar will know not to change it +- DECL_INITIAL (catch_var) = exc_obj; +- irs->emitLocalVar (a_catch->var); +- } +- +- if (a_catch->handler) +- a_catch->handler->toIR (irs); +- irs->endScope(); +- irs->endCatch(); +- } +- } +- irs->endCatches(); +-} +- +-void +-OnScopeStatement::toIR (IRState *) +-{ +-} +- +-void +-WithStatement::toIR (IRState *irs) +-{ +- irs->startScope(); +- if (wthis) +- irs->emitLocalVar (wthis); +- +- if (body) +- body->toIR (irs); +- +- irs->endScope(); +-} +- +-void +-SynchronizedStatement::toIR (IRState *) +-{ +- ::error ("SynchronizedStatement::toIR: we shouldn't emit this (%s)", toChars()); +- gcc_unreachable(); +-} +- +-void +-ContinueStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->continueLoop (ident); +-} +- +-void +-BreakStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->exitLoop (ident); +-} +- +-void +-ReturnStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- +- if (exp == NULL || exp->type->toBasetype()->ty == Tvoid) +- { +- // Return has no value. +- irs->doReturn (NULL_TREE); +- return; +- } +- +- FuncDeclaration *func = irs->func; +- TypeFunction *tf = (TypeFunction *) func->type; +- Type *ret_type = func->tintro ? func->tintro->nextOf() : tf->nextOf(); +- +- if (func->isMain() && ret_type->toBasetype()->ty == Tvoid) +- ret_type = Type::tint32; +- +- tree result_decl = DECL_RESULT (irs->func->toSymbol()->Stree); +- +- if (func->nrvo_can && func->nrvo_var) +- { +- // Just refer to the RESULT_DECL; this is a nop, but differs from using +- // NULL_TREE in that it indicates that we care about the value of the RESULT_DECL. +- irs->doReturn (result_decl); +- } +- else +- { +- tree result_value = convert_expr (exp->toElemDtor (irs), exp->type, ret_type); +- // %% convert for init -- if we were returning a reference, +- // would want to take the address... +- if (tf->isref) +- result_value = build_address (result_value); +- +- tree result_assign = build2 (INIT_EXPR, TREE_TYPE (result_decl), +- result_decl, result_value); +- +- irs->doReturn (result_assign); +- } +-} +- +-void +-DefaultStatement::toIR (IRState *irs) +-{ +- irs->checkSwitchCase (this, 1); +- irs->doCase (NULL_TREE, cblock); +- if (statement) +- statement->toIR (irs); +-} +- +-void +-CaseStatement::toIR (IRState *irs) +-{ +- tree case_value; +- +- if (exp->type->isscalar()) +- case_value = exp->toElem (irs); +- else +- case_value = build_integer_cst (index, Type::tint32->toCtype()); +- +- irs->checkSwitchCase (this); +- irs->doCase (case_value, cblock); +- if (statement) +- statement->toIR (irs); +-} +- +-void +-SwitchStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- +- tree cond_tree = condition->toElemDtor (irs); +- Type *cond_type = condition->type->toBasetype(); +- +- if (condition->type->isString()) +- { +- Type *elem_type = cond_type->nextOf()->toBasetype(); +- LibCall libcall; +- switch (elem_type->ty) +- { +- case Tchar: +- libcall = LIBCALL_SWITCH_STRING; +- break; +- +- case Twchar: +- libcall = LIBCALL_SWITCH_USTRING; +- break; +- +- case Tdchar: +- libcall = LIBCALL_SWITCH_DSTRING; +- break; +- +- default: +- ::error ("switch statement value must be an array of some character type, not %s", +- elem_type->toChars()); +- gcc_unreachable(); +- } +- +- // Apparently the backend is supposed to sort and set the indexes +- // on the case array, have to change them to be useable. +- cases->sort(); +- +- tree args[2]; +- Symbol *s = new Symbol(); +- dt_t **pdt = &s->Sdt; +- +- for (size_t i = 0; i < cases->dim; i++) +- { +- CaseStatement *cs = (*cases)[i]; +- cs->index = i; +- +- if (cs->exp->op != TOKstring) +- error("case '%s' is not a string", cs->exp->toChars()); +- else +- pdt = cs->exp->toDt (pdt); +- } +- +- s->Sreadonly = true; +- d_finish_symbol (s); +- +- args[0] = d_array_value (cond_type->arrayOf()->toCtype(), +- size_int (cases->dim), +- build_address (s->Stree)); +- args[1] = cond_tree; +- +- cond_tree = build_libcall (libcall, 2, args); +- } +- else if (!cond_type->isscalar()) +- { +- ::error ("cannot handle switch condition of type %s", cond_type->toChars()); +- gcc_unreachable(); +- } +- +- if (cases) +- { +- // Build LABEL_DECLs now so they can be refered to by goto case +- for (size_t i = 0; i < cases->dim; i++) +- { +- CaseStatement *case_stmt = (*cases)[i]; +- case_stmt->cblock = d_build_label (case_stmt->loc, NULL); +- } +- if (sdefault) +- sdefault->cblock = d_build_label (sdefault->loc, NULL); +- } +- cond_tree = fold (cond_tree); +- +- if (hasVars) +- { +- // Write cases as a series of if-then-else blocks. +- for (size_t i = 0; i < cases->dim; i++) +- { +- CaseStatement *case_stmt = (*cases)[i]; +- tree case_cond = build2 (EQ_EXPR, cond_type->toCtype(), cond_tree, +- case_stmt->exp->toElemDtor (irs)); +- irs->startCond (this, case_cond); +- irs->doJump (NULL, case_stmt->cblock); +- irs->endCond(); +- } +- if (sdefault) +- irs->doJump (NULL, sdefault->cblock); +- } +- +- // Emit body. +- irs->startCase (this, cond_tree, hasVars); +- if (body) +- body->toIR (irs); +- irs->endCase(); +-} +- +- +-void +-IfStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->startScope(); +- irs->startCond (this, convert_for_condition (condition->toElemDtor (irs), +- condition->type)); +- if (ifbody) +- ifbody->toIR (irs); +- +- if (elsebody) +- { +- irs->startElse(); +- elsebody->toIR (irs); +- } +- irs->endCond(); +- irs->endScope(); +-} +- +-void +-ForeachStatement::toIR (IRState *) +-{ +- ::error ("ForeachStatement::toIR: we shouldn't emit this (%s)", toChars()); +- gcc_unreachable(); +-} +- +-void +-ForeachRangeStatement::toIR (IRState *) +-{ +- ::error ("ForeachRangeStatement::toIR: we shouldn't emit this (%s)", toChars()); +- gcc_unreachable(); +-} +- +-void +-ForStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- if (init) +- init->toIR (irs); +- irs->startLoop (this); +- if (condition) +- { +- irs->doLineNote (condition->loc); +- irs->exitIfFalse (convert_for_condition (condition->toElemDtor (irs), +- condition->type)); +- } +- if (body) +- body->toIR (irs); +- irs->continueHere(); +- if (increment) +- { +- // force side effects? +- irs->doLineNote (increment->loc); +- irs->addExp (increment->toElemDtor (irs)); +- } +- irs->endLoop(); +-} +- +-void +-DoStatement::toIR (IRState *irs) +-{ +- irs->doLineNote (loc); +- irs->startLoop (this); +- if (body) +- body->toIR (irs); +- irs->continueHere(); +- irs->doLineNote (condition->loc); +- irs->exitIfFalse (convert_for_condition (condition->toElemDtor (irs), +- condition->type)); +- irs->endLoop(); +-} +- +-void +-WhileStatement::toIR (IRState *) +-{ +- ::error ("WhileStatement::toIR: we shouldn't emit this (%s)", toChars()); +- gcc_unreachable(); +-} +- +-void +-ScopeStatement::toIR (IRState *irs) +-{ +- if (statement) +- { +- irs->startScope(); +- statement->toIR (irs); +- irs->endScope(); +- } +-} +- +-void +-CompoundStatement::toIR (IRState *irs) +-{ +- if (!statements) +- return; +- +- for (size_t i = 0; i < statements->dim; i++) +- { +- Statement *statement = (*statements)[i]; +- if (statement) +- statement->toIR (irs); +- } +-} +- +-void +-UnrolledLoopStatement::toIR (IRState *irs) +-{ +- if (!statements) +- return; +- +- irs->startLoop (this); +- irs->continueHere(); +- for (size_t i = 0; i < statements->dim; i++) +- { +- Statement *statement = (*statements)[i]; +- if (statement) +- { +- irs->setContinueLabel (d_build_label (loc, NULL)); +- statement->toIR (irs); +- irs->continueHere(); +- } +- } +- irs->exitLoop (NULL); +- irs->endLoop(); +-} +- +-void +-ExpStatement::toIR (IRState *irs) +-{ +- if (exp) +- { +- irs->doLineNote (loc); +- tree exp_tree = exp->toElemDtor (irs); +- irs->addExp (exp_tree); +- } +-} +- +-void +-DtorExpStatement::toIR (IRState *irs) +-{ +- FuncDeclaration *fd = irs->func; +- +- /* Do not call destructor if var is returned as the +- nrvo variable. */ +- bool noDtor = (fd->nrvo_can && fd->nrvo_var == var); +- +- if (!noDtor) +- ExpStatement::toIR (irs); +-} +- +-void +-PragmaStatement::toIR (IRState *) +-{ +-} +- +-void +-ImportStatement::toIR (IRState *) +-{ +-} +- +--- a/src/gcc/d/d-irstate.cc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-irstate.cc 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-irstate.cc -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -22,20 +22,33 @@ + + #include "init.h" + +-IRBase::IRBase (void) ++IRState::IRState (void) + { + this->parent = NULL; + this->func = NULL; +- this->varsInScope = NULL; + this->mod = NULL; + this->sthis = NULL_TREE; ++ this->varsInScope = vNULL; ++ this->statementList_ = vNULL; ++ this->scopes_ = vNULL; ++ this->loops_ = vNULL; ++ this->labels_ = vNULL; ++} ++ ++IRState::~IRState (void) ++{ ++ this->varsInScope.release(); ++ this->statementList_.release(); ++ this->scopes_.release(); ++ this->loops_.release(); ++ this->labels_.release(); + } + + IRState * +-IRBase::startFunction (FuncDeclaration *decl) ++IRState::startFunction (FuncDeclaration *decl) + { + IRState *new_irs = new IRState(); +- new_irs->parent = cirstate; ++ new_irs->parent = current_irstate; + new_irs->func = decl; + + for (Dsymbol *p = decl->parent; p; p = p->parent) +@@ -47,45 +60,45 @@ IRBase::startFunction (FuncDeclaration * + } + } + +- cirstate = (IRState *) new_irs; +- ModuleInfo & mi = *object_file->moduleInfo; ++ current_irstate = (IRState *) new_irs; ++ ModuleInfo *mi = current_module_info; + + if (decl->isSharedStaticCtorDeclaration()) +- mi.sharedctors.push (decl); ++ mi->sharedctors.safe_push (decl); + else if (decl->isStaticCtorDeclaration()) +- mi.ctors.push (decl); ++ mi->ctors.safe_push (decl); + else if (decl->isSharedStaticDtorDeclaration()) + { + VarDeclaration *vgate; + if ((vgate = decl->isSharedStaticDtorDeclaration()->vgate)) +- mi.sharedctorgates.push (vgate); +- mi.shareddtors.push (decl); ++ mi->sharedctorgates.safe_push (vgate); ++ mi->shareddtors.safe_push (decl); + } + else if (decl->isStaticDtorDeclaration()) + { + VarDeclaration *vgate; + if ((vgate = decl->isStaticDtorDeclaration()->vgate)) +- mi.ctorgates.push (vgate); +- mi.dtors.push (decl); ++ mi->ctorgates.safe_push (vgate); ++ mi->dtors.safe_push (decl); + } + else if (decl->isUnitTestDeclaration()) +- mi.unitTests.push (decl); ++ mi->unitTests.safe_push (decl); + + return new_irs; + } + + void +-IRBase::endFunction (void) ++IRState::endFunction (void) + { +- gcc_assert (this->scopes.dim == 0); +- cirstate = (IRState *) this->parent; ++ gcc_assert (this->scopes_.is_empty()); ++ current_irstate = (IRState *) this->parent; + } + + + // Emit statement E into function body. + + void +-IRBase::addExp (tree e) ++IRState::addExp (tree e) + { + /* Need to check that this is actually an expression; it + could be an integer constant (statement with no effect.) +@@ -104,24 +117,24 @@ IRBase::addExp (tree e) + if (EXPR_P (e) && !EXPR_HAS_LOCATION (e)) + SET_EXPR_LOCATION (e, input_location); + +- tree stmt_list = (tree) this->statementList.pop(); ++ tree stmt_list = this->statementList_.pop(); + append_to_statement_list_force (e, &stmt_list); +- this->statementList.push (stmt_list); ++ this->statementList_.safe_push (stmt_list); + } + + + void +-IRBase::pushStatementList (void) ++IRState::pushStatementList (void) + { + tree t = alloc_stmt_list(); +- this->statementList.push (t); ++ this->statementList_.safe_push (t); + d_keep (t); + } + + tree +-IRBase::popStatementList (void) ++IRState::popStatementList (void) + { +- tree t = (tree) this->statementList.pop(); ++ tree t = this->statementList_.pop(); + + /* If the statement list is completely empty, just return it. This is + just as good small as build_empty_stmt, with the advantage that +@@ -147,7 +160,7 @@ IRBase::popStatementList (void) + + + tree +-IRBase::getLabelTree (LabelDsymbol *label) ++IRState::getLabelTree (LabelDsymbol *label) + { + if (!label->statement) + return NULL_TREE; +@@ -162,13 +175,13 @@ IRBase::getLabelTree (LabelDsymbol *labe + } + + Label * +-IRBase::getLabelBlock (LabelDsymbol *label, Statement *from) ++IRState::getLabelBlock (LabelDsymbol *label, Statement *from) + { + Label *l = new Label(); + +- for (int i = this->loops.dim - 1; i >= 0; i--) ++ for (int i = this->loops_.length() - 1; i >= 0; i--) + { +- Flow *flow = this->loops[i]; ++ Flow *flow = this->loops_[i]; + + if (flow->kind != level_block + && flow->kind != level_switch) +@@ -188,167 +201,168 @@ IRBase::getLabelBlock (LabelDsymbol *lab + + + Flow * +-IRBase::getLoopForLabel (Identifier *ident, bool want_continue) ++IRState::getLoopForLabel (Identifier *ident, bool want_continue) + { + if (ident) + { +- LabelStatement *lbl_stmt = this->func->searchLabel (ident)->statement; +- gcc_assert (lbl_stmt != 0); +- Statement *stmt = lbl_stmt->statement; +- ScopeStatement *scope_stmt = stmt->isScopeStatement(); +- +- if (scope_stmt) +- stmt = scope_stmt->statement; ++ LabelStatement *lstmt = this->func->searchLabel (ident)->statement; ++ gcc_assert (lstmt != NULL); ++ // The break label for a loop may actually be some levels up; ++ // eg: on a try/finally wrapping a loop. ++ Statement *stmt = lstmt->statement->getRelatedLabeled(); + +- for (int i = this->loops.dim - 1; i >= 0; i--) ++ for (int i = this->loops_.length() - 1; i >= 0; i--) + { +- Flow *flow = this->loops[i]; ++ Flow *flow = this->loops_[i]; + +- if (flow->statement == stmt) ++ if (flow->statement->getRelatedLabeled() == stmt) + { + if (want_continue) +- gcc_assert (stmt->hasContinue()); ++ gcc_assert (flow->statement->hasContinue()); + return flow; + } + } +- gcc_unreachable(); + } + else + { +- for (int i = this->loops.dim - 1; i >= 0; i--) ++ for (int i = this->loops_.length() - 1; i >= 0; i--) + { +- Flow *flow = this->loops[i]; ++ Flow *flow = this->loops_[i]; + + if ((!want_continue && flow->statement->hasBreak()) + || flow->statement->hasContinue()) + return flow; + } +- gcc_unreachable(); + } ++ ++ return NULL; + } + + + Flow * +-IRBase::beginFlow (Statement *stmt) ++IRState::beginFlow (Statement *stmt) + { + Flow *flow = new Flow (stmt); +- this->loops.push (flow); +- pushStatementList(); ++ this->loops_.safe_push (flow); ++ this->pushStatementList(); + return flow; + } + + void +-IRBase::endFlow (void) ++IRState::endFlow (void) + { +- Flow *flow; ++ gcc_assert (!this->loops_.is_empty()); + +- gcc_assert (this->loops.dim); ++ Flow *flow = this->loops_.pop(); + +- flow = (Flow *) this->loops.pop(); + if (flow->exitLabel) +- doLabel (flow->exitLabel); +- //%% delete flow; ++ this->doLabel (flow->exitLabel); + } + + void +-IRBase::doLabel (tree t_label) ++IRState::doLabel (tree label) + { + /* Don't write out label unless it is marked as used by the frontend. + This makes auto-vectorization possible in conditional loops. + The only excemption to this is in LabelStatement::toIR, in which + all computed labels are marked regardless. */ +- if (TREE_USED (t_label)) +- addExp (build1 (LABEL_EXPR, void_type_node, t_label)); ++ if (TREE_USED (label)) ++ this->addExp (build1 (LABEL_EXPR, void_type_node, label)); + } + + + void +-IRBase::startScope (void) ++IRState::startScope (void) + { + unsigned *p_count = new unsigned; + *p_count = 0; +- this->scopes.push (p_count); +- startBindings(); ++ ++ this->scopes_.safe_push (p_count); ++ this->startBindings(); + } + + void +-IRBase::endScope (void) ++IRState::endScope (void) + { +- unsigned *p_count = currentScope(); ++ unsigned *p_count = this->currentScope(); + while (*p_count) +- endBindings(); ++ this->endBindings(); + +- this->scopes.pop(); ++ this->scopes_.pop(); + } + + + void +-IRBase::startBindings (void) ++IRState::startBindings (void) + { +- pushlevel (0); +- tree block = make_node (BLOCK); +- set_block (block); ++ tree block; + +- pushStatementList(); ++ push_binding_level(); ++ block = make_node (BLOCK); ++ current_binding_level->this_block = block; + +- ++(*currentScope()); ++ this->pushStatementList(); ++ ++ ++(*this->currentScope()); + } + + void +-IRBase::endBindings (void) ++IRState::endBindings (void) + { +- tree block = poplevel (1,0,0); ++ tree block = pop_binding_level (1, 0); ++ TREE_USED (block) = 1; + +- tree t_body = popStatementList(); +- addExp (build3 (BIND_EXPR, void_type_node, +- BLOCK_VARS (block), t_body, block)); ++ tree body = this->popStatementList(); ++ this->addExp (build3 (BIND_EXPR, void_type_node, ++ BLOCK_VARS (block), body, block)); + +- // Because we used set_block, the popped level/block is not automatically recorded +- insert_block (block); ++ // The popped level/block is not automatically recorded ++ current_binding_level->blocks = block_chainon (current_binding_level->blocks, block); + +- --(*currentScope()); +- gcc_assert (*(int *) currentScope() >= 0); ++ --(*this->currentScope()); ++ gcc_assert (*(int *) this->currentScope() >= 0); + } + + + // Routines for building statement lists around if/else conditions. +-// STMT contains the statement to be executed if T_COND is true. ++// STMT contains the statement to be executed if COND is true. + + void +-IRBase::startCond (Statement *stmt, tree t_cond) ++IRState::startCond (Statement *stmt, tree cond) + { +- Flow *f = beginFlow (stmt); +- f->condition = t_cond; ++ Flow *flow = this->beginFlow (stmt); ++ flow->condition = cond; + } + + // Start a new statement list for the false condition branch. + + void +-IRBase::startElse (void) ++IRState::startElse (void) + { +- currentFlow()->trueBranch = popStatementList(); +- pushStatementList(); ++ Flow *flow = this->currentFlow(); ++ flow->trueBranch = this->popStatementList(); ++ this->pushStatementList(); + } + + // Wrap up our constructed if condition into a COND_EXPR. + + void +-IRBase::endCond (void) ++IRState::endCond (void) + { +- Flow *f = currentFlow(); +- tree t_brnch = popStatementList(); +- tree t_false_brnch = NULL_TREE; ++ Flow *flow = this->currentFlow(); ++ tree branch = this->popStatementList(); ++ tree false_branch = NULL_TREE; + +- if (f->trueBranch == NULL_TREE) +- f->trueBranch = t_brnch; ++ if (flow->trueBranch == NULL_TREE) ++ flow->trueBranch = branch; + else +- t_false_brnch = t_brnch; ++ false_branch = branch; + +- object_file->doLineNote (f->statement->loc); +- tree t_stmt = build3 (COND_EXPR, void_type_node, +- f->condition, f->trueBranch, t_false_brnch); +- endFlow(); +- addExp (t_stmt); ++ this->doLineNote (flow->statement->loc); ++ tree stmt = build3 (COND_EXPR, void_type_node, ++ flow->condition, flow->trueBranch, false_branch); ++ this->endFlow(); ++ this->addExp (stmt); + } + + +@@ -356,240 +370,307 @@ IRBase::endCond (void) + // STMT is the body of the loop. + + void +-IRBase::startLoop (Statement *stmt) ++IRState::startLoop (Statement *stmt) + { +- Flow *f = beginFlow (stmt); ++ Flow *flow = this->beginFlow (stmt); + // should be end for 'do' loop +- f->continueLabel = d_build_label (stmt ? stmt->loc : 0, NULL); ++ flow->continueLabel = d_build_label (stmt ? stmt->loc : Loc(), NULL); + } + + // Emit continue label for loop. + + void +-IRBase::continueHere (void) ++IRState::continueHere (void) + { +- doLabel (currentFlow()->continueLabel); ++ Flow *flow = this->currentFlow(); ++ this->doLabel (flow->continueLabel); + } + + // Set LBL as the continue label for the current loop. + // Used in unrolled loop statements. + + void +-IRBase::setContinueLabel (tree lbl) ++IRState::setContinueLabel (tree label) + { +- currentFlow()->continueLabel = lbl; ++ Flow *flow = this->currentFlow(); ++ flow->continueLabel = label; + } + + // Emit exit loop condition. + + void +-IRBase::exitIfFalse (tree t_cond) ++IRState::exitIfFalse (tree cond) + { +- addExp (build1 (EXIT_EXPR, void_type_node, +- build1 (TRUTH_NOT_EXPR, TREE_TYPE (t_cond), t_cond))); ++ this->addExp (build1 (EXIT_EXPR, void_type_node, ++ build1 (TRUTH_NOT_EXPR, TREE_TYPE (cond), cond))); + } + + // Emit a goto to the continue label IDENT of a loop. + + void +-IRBase::continueLoop (Identifier *ident) ++IRState::continueLoop (Identifier *ident) + { +- doJump (NULL, getLoopForLabel (ident, true)->continueLabel); ++ Flow *flow = this->getLoopForLabel (ident, true); ++ gcc_assert (flow); ++ this->doJump (NULL, flow->continueLabel); + } + + // Emit a goto to the exit label IDENT of a loop. + + void +-IRBase::exitLoop (Identifier *ident) ++IRState::exitLoop (Identifier *ident) + { +- Flow *flow = getLoopForLabel (ident); ++ Flow *flow = this->getLoopForLabel (ident); ++ gcc_assert (flow); ++ + if (!flow->exitLabel) + flow->exitLabel = d_build_label (flow->statement->loc, NULL); +- doJump (NULL, flow->exitLabel); ++ ++ this->doJump (NULL, flow->exitLabel); + } + + // Wrap up constructed loop body in a LOOP_EXPR. + + void +-IRBase::endLoop (void) ++IRState::endLoop (void) + { + // says must contain an EXIT_EXPR -- what about while (1)..goto;? something other thand LOOP_EXPR? +- tree t_body = popStatementList(); +- tree t_loop = build1 (LOOP_EXPR, void_type_node, t_body); +- addExp (t_loop); +- endFlow(); ++ tree body = this->popStatementList(); ++ tree loop = build1 (LOOP_EXPR, void_type_node, body); ++ this->addExp (loop); ++ this->endFlow(); + } + + ++// Create a tree node to set multiple elements to a single value ++ ++tree ++IRState::doArraySet(tree ptr, tree value, tree count) ++{ ++ tree t; ++ ++ pushStatementList(); ++ startBindings(); ++ ++ // Build temporary locals for count and ptr, and maybe value. ++ t = build_local_temp (size_type_node); ++ DECL_INITIAL (t) = count; ++ count = t; ++ expand_decl (count); ++ ++ t = build_local_temp (TREE_TYPE (ptr)); ++ DECL_INITIAL (t) = ptr; ++ ptr = t; ++ expand_decl (ptr); ++ ++ if (d_has_side_effects (value)) ++ { ++ t = build_local_temp (TREE_TYPE (value)); ++ DECL_INITIAL (t) = value; ++ value = t; ++ expand_decl (value); ++ } ++ ++ // Build loop to initialise { .length=count, .ptr=ptr } with value. ++ // ++ // while (count != 0) ++ // { ++ // *ptr = value; ++ // ptr += (*ptr).sizeof; ++ // count -= 1; ++ // } ++ tree pesize = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ptr))); ++ tree count_zero = d_convert (TREE_TYPE (count), integer_zero_node); ++ tree count_one = d_convert (TREE_TYPE (count), integer_one_node); ++ ++ startLoop (NULL); ++ continueHere(); ++ exitIfFalse (build_boolop (NE_EXPR, count, count_zero)); ++ ++ addExp (vmodify_expr (build_deref (ptr), value)); ++ addExp (vmodify_expr (ptr, build_offset (ptr, pesize))); ++ addExp (build2 (POSTDECREMENT_EXPR, TREE_TYPE (count), count, count_one)); ++ ++ endLoop(); ++ endBindings(); ++ ++ return popStatementList(); ++} ++ + // Routines for building statement lists around switches. STMT is the body +-// of the switch statement, T_COND is the condition to the switch. If HAS_VARS ++// of the switch statement, COND is the condition to the switch. If HAS_VARS + // is true, then the switch statement has been converted to an if-then-else. + + void +-IRBase::startCase (Statement *stmt, tree t_cond, int has_vars) ++IRState::startCase (Statement *stmt, tree cond, int has_vars) + { +- Flow *f = beginFlow (stmt); +- f->condition = t_cond; +- f->kind = level_switch; ++ Flow *flow = this->beginFlow (stmt); ++ flow->condition = cond; ++ flow->kind = level_switch; + if (has_vars) + { + // %% dummy value so the tree is not NULL +- f->hasVars = integer_one_node; ++ flow->hasVars = integer_one_node; + } + } + +-// Emit a case statement for T_VALUE. ++// Emit a case statement for VALUE. + + void +-IRBase::doCase (tree t_value, tree t_label) ++IRState::doCase (tree value, tree label) + { +- if (currentFlow()->hasVars) +- { +- // SwitchStatement has already taken care of label jumps. +- doLabel (t_label); +- } ++ // SwitchStatement has already taken care of label jumps. ++ if (this->currentFlow()->hasVars) ++ this->doLabel (label); + else + { +- tree t_case = build_case_label (t_value, NULL_TREE, t_label); +- addExp (t_case); ++ tree case_label = build_case_label (value, NULL_TREE, label); ++ this->addExp (case_label); + } + } + + // Wrap up constructed body into a SWITCH_EXPR. + + void +-IRBase::endCase (void) ++IRState::endCase (void) + { +- Flow *f = currentFlow(); +- tree t_body = popStatementList(); +- tree t_condtype = TREE_TYPE (f->condition); +- if (f->hasVars) +- { +- // %% switch was converted to if-then-else expression +- addExp (t_body); +- } ++ Flow *flow = this->currentFlow(); ++ tree body = this->popStatementList(); ++ tree condtype = TREE_TYPE (flow->condition); ++ ++ // Switch was converted to if-then-else expression ++ if (flow->hasVars) ++ this->addExp (body); + else + { +- tree t_stmt = build3 (SWITCH_EXPR, t_condtype, f->condition, +- t_body, NULL_TREE); +- addExp (t_stmt); ++ tree stmt = build3 (SWITCH_EXPR, condtype, ++ flow->condition, body, NULL_TREE); ++ this->addExp (stmt); + } +- endFlow(); ++ ++ this->endFlow(); + } + + // Routines for building statement lists around try/catch/finally. + // Start a try statement, STMT is the body of the try expression. + + void +-IRBase::startTry (Statement *stmt) ++IRState::startTry (Statement *stmt) + { +- beginFlow (stmt); +- currentFlow()->kind = level_try; ++ Flow *flow = this->beginFlow (stmt); ++ flow->kind = level_try; + } + + // Pops the try body and starts a new statement list for all catches. + + void +-IRBase::startCatches (void) ++IRState::startCatches (void) + { +- currentFlow()->tryBody = popStatementList(); +- currentFlow()->kind = level_catch; +- pushStatementList(); ++ Flow *flow = this->currentFlow(); ++ flow->tryBody = this->popStatementList(); ++ flow->kind = level_catch; ++ this->pushStatementList(); + } + +-// Start a new catch expression for exception type T_TYPE. ++// Start a new catch expression for exception type TYPE. + + void +-IRBase::startCatch (tree t_type) ++IRState::startCatch (tree type) + { +- currentFlow()->catchType = t_type; +- pushStatementList(); ++ this->currentFlow()->catchType = type; ++ this->pushStatementList(); + } + + // Wrap up catch expression into a CATCH_EXPR. + + void +-IRBase::endCatch (void) ++IRState::endCatch (void) + { +- tree t_body = popStatementList(); ++ tree body = this->popStatementList(); + // % Wrong loc... can set pass statement to startCatch, set +- // The loc on t_type and then use it here... +- addExp (build2 (CATCH_EXPR, void_type_node, +- currentFlow()->catchType, t_body)); ++ // The loc on type and then use it here... ++ this->addExp (build2 (CATCH_EXPR, void_type_node, ++ this->currentFlow()->catchType, body)); + } + + // Wrap up try/catch into a TRY_CATCH_EXPR. + + void +-IRBase::endCatches (void) ++IRState::endCatches (void) + { +- tree t_catches = popStatementList(); +- object_file->doLineNote (currentFlow()->statement->loc); +- addExp (build2 (TRY_CATCH_EXPR, void_type_node, +- currentFlow()->tryBody, t_catches)); +- endFlow(); ++ Flow *flow = this->currentFlow(); ++ tree catches = this->popStatementList(); ++ ++ this->doLineNote (flow->statement->loc); ++ this->addExp (build2 (TRY_CATCH_EXPR, void_type_node, ++ flow->tryBody, catches)); ++ this->endFlow(); + } + + // Start a new finally expression. + + void +-IRBase::startFinally (void) ++IRState::startFinally (void) + { +- currentFlow()->tryBody = popStatementList(); +- currentFlow()->kind = level_finally; +- pushStatementList(); ++ Flow *flow = this->currentFlow(); ++ flow->tryBody = this->popStatementList(); ++ flow->kind = level_finally; ++ this->pushStatementList(); + } + + // Wrap-up try/finally into a TRY_FINALLY_EXPR. + + void +-IRBase::endFinally (void) ++IRState::endFinally (void) + { +- tree t_finally = popStatementList(); +- object_file->doLineNote (currentFlow()->statement->loc); +- addExp (build2 (TRY_FINALLY_EXPR, void_type_node, +- currentFlow()->tryBody, t_finally)); +- endFlow(); ++ Flow *flow = this->currentFlow(); ++ tree finally = this->popStatementList(); ++ ++ this->doLineNote (flow->statement->loc); ++ this->addExp (build2 (TRY_FINALLY_EXPR, void_type_node, ++ flow->tryBody, finally)); ++ this->endFlow(); + } + +-// Emit a return expression of value T_VALUE. ++// Emit a return expression of value VALUE. + + void +-IRBase::doReturn (tree t_value) ++IRState::doReturn (tree value) + { +- addExp (build1 (RETURN_EXPR, void_type_node, t_value)); ++ this->addExp (build1 (RETURN_EXPR, void_type_node, value)); + } + +-// Emit goto expression to T_LABEL. ++// Emit goto expression to LABEL. + + void +-IRBase::doJump (Statement *stmt, tree t_label) ++IRState::doJump (Statement *stmt, tree label) + { + if (stmt) +- object_file->doLineNote (stmt->loc); +- addExp (build1 (GOTO_EXPR, void_type_node, t_label)); +- TREE_USED (t_label) = 1; ++ this->doLineNote (stmt->loc); ++ ++ this->addExp (build1 (GOTO_EXPR, void_type_node, label)); ++ TREE_USED (label) = 1; + } + + // Routines for checking goto statements don't jump to invalid locations. + // In particular, it is illegal for a goto to be used to skip initializations. +-// Saves the block label L is declared in for analysis later. ++// Saves the block LABEL is declared in for analysis later. + + void +-IRBase::pushLabel (LabelDsymbol *l) ++IRState::pushLabel (LabelDsymbol *label) + { +- this->labels.push (getLabelBlock (l)); ++ Label *lblock = this->getLabelBlock (label); ++ this->labels_.safe_push (lblock); + } + + // Error if STMT is in it's own try statement separate from other + // cases in the switch statement. + + void +-IRBase::checkSwitchCase (Statement *stmt, int default_flag) ++IRState::checkSwitchCase (Statement *stmt, int default_flag) + { +- Flow *flow = currentFlow(); ++ Flow *flow = this->currentFlow(); + +- gcc_assert (flow); + if (flow->kind != level_switch && flow->kind != level_block) + { + stmt->error ("%s cannot be in different try block level from switch", +@@ -601,18 +682,18 @@ IRBase::checkSwitchCase (Statement *stmt + // catch block. STMT is required to error on the correct line. + + void +-IRBase::checkGoto (Statement *stmt, LabelDsymbol *label) ++IRState::checkGoto (Statement *stmt, LabelDsymbol *label) + { + Statement *curBlock = NULL; +- unsigned curLevel = this->loops.dim; ++ unsigned curLevel = this->loops_.length(); + int found = 0; + + if (curLevel) +- curBlock = currentFlow()->statement; ++ curBlock = this->currentFlow()->statement; + +- for (size_t i = 0; i < this->labels.dim; i++) ++ for (size_t i = 0; i < this->labels_.length(); i++) + { +- Label *linfo = this->labels[i]; ++ Label *linfo = this->labels_[i]; + gcc_assert (linfo); + + if (label == linfo->label) +@@ -635,9 +716,12 @@ IRBase::checkGoto (Statement *stmt, Labe + // Push forward referenced gotos. + if (!found) + { ++ Label *lblock = this->getLabelBlock (label, stmt); ++ + if (!label->statement->fwdrefs) + label->statement->fwdrefs = new Blocks(); +- label->statement->fwdrefs->push (getLabelBlock (label, stmt)); ++ ++ label->statement->fwdrefs->push (lblock); + } + } + +@@ -645,21 +729,21 @@ IRBase::checkGoto (Statement *stmt, Labe + // if goto is jumping into a try or catch block. + + void +-IRBase::checkPreviousGoto (Array *refs) ++IRState::checkPreviousGoto (Blocks *refs) + { + Statement *stmt; // Our forward reference. + + for (size_t i = 0; i < refs->dim; i++) + { +- Label *ref = (Label *) refs->data[i]; ++ Label *ref = (*refs)[i]; + int found = 0; + + gcc_assert (ref && ref->from); + stmt = ref->from; + +- for (size_t i = 0; i < this->labels.dim; i++) ++ for (size_t i = 0; i < this->labels_.length(); i++) + { +- Label *linfo = this->labels[i]; ++ Label *linfo = this->labels_[i]; + gcc_assert (linfo); + + if (ref->label == linfo->label) +--- a/src/gcc/d/d-irstate.h 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/gcc/d/d-irstate.h 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + // d-irstate.h -- D frontend for GCC. +-// Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// Copyright (C) 2011-2013 Free Software Foundation, Inc. + + // GCC is free software; you can redistribute it and/or modify it under + // the terms of the GNU General Public License as published by the Free +@@ -88,27 +88,25 @@ struct Flow + }; + + +-typedef ArrayBase + use source file fragments in ++ --disable-libbacktrace Do not use libbacktrace for backtraces + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -1391,7 +1370,7 @@ Some influential environment variables: + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l +- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if ++ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags +@@ -1464,9 +1443,9 @@ test -n "$ac_init_help" && exit $ac_stat + if $ac_init_version; then + cat <<\_ACEOF + libphobos configure version-unused +-generated by GNU Autoconf 2.69 ++generated by GNU Autoconf 2.64 + +-Copyright (C) 2012 Free Software Foundation, Inc. ++Copyright (C) 2009 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -1510,8 +1489,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ return $ac_retval + + } # ac_fn_c_try_compile + +@@ -1548,8 +1527,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ return $ac_retval + + } # ac_fn_cxx_try_compile + +@@ -1574,7 +1553,7 @@ $as_echo "$ac_try_echo"; } >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } > conftest.i && { ++ test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : +@@ -1585,8 +1564,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ return $ac_retval + + } # ac_fn_c_try_cpp + +@@ -1598,10 +1577,10 @@ fi + ac_fn_c_check_header_mongrel () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : ++ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + fi + eval ac_res=\$$3 +@@ -1637,7 +1616,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : + else + ac_header_preproc=no + fi +-rm -f conftest.err conftest.i conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 + $as_echo "$ac_header_preproc" >&6; } + +@@ -1664,7 +1643,7 @@ $as_echo "$as_me: WARNING: $2: proceedin + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + else + eval "$3=\$ac_header_compiler" +@@ -1673,7 +1652,7 @@ eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } + fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + + } # ac_fn_c_check_header_mongrel + +@@ -1714,8 +1693,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + ac_retval=$ac_status + fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ return $ac_retval + + } # ac_fn_c_try_run + +@@ -1728,7 +1707,7 @@ ac_fn_c_check_header_compile () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1746,7 +1725,7 @@ fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + + } # ac_fn_c_check_header_compile + +@@ -1777,7 +1756,7 @@ $as_echo "$ac_try_echo"; } >&5 + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || +- test -x conftest$ac_exeext ++ $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 + else +@@ -1791,8 +1770,8 @@ fi + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ return $ac_retval + + } # ac_fn_c_try_link + +@@ -1804,7 +1783,7 @@ ac_fn_c_check_func () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1859,69 +1838,15 @@ fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + + } # ac_fn_c_check_func +- +-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +-# ------------------------------------------- +-# Tests whether TYPE exists after having included INCLUDES, setting cache +-# variable VAR accordingly. +-ac_fn_c_check_type () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=no" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof ($2)) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof (($2))) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- eval "$3=yes" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} # ac_fn_c_check_type + cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + + It was created by libphobos $as_me version-unused, which was +-generated by GNU Autoconf 2.69. Invocation command line was ++generated by GNU Autoconf 2.64. Invocation command line was + + $ $0 $@ + +@@ -2031,9 +1956,11 @@ trap 'exit_status=$? + { + echo + +- $as_echo "## ---------------- ## ++ cat <<\_ASBOX ++## ---------------- ## + ## Cache variables. ## +-## ---------------- ##" ++## ---------------- ## ++_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, + ( +@@ -2067,9 +1994,11 @@ $as_echo "$as_me: WARNING: cache variabl + ) + echo + +- $as_echo "## ----------------- ## ++ cat <<\_ASBOX ++## ----------------- ## + ## Output variables. ## +-## ----------------- ##" ++## ----------------- ## ++_ASBOX + echo + for ac_var in $ac_subst_vars + do +@@ -2082,9 +2011,11 @@ $as_echo "$as_me: WARNING: cache variabl + echo + + if test -n "$ac_subst_files"; then +- $as_echo "## ------------------- ## ++ cat <<\_ASBOX ++## ------------------- ## + ## File substitutions. ## +-## ------------------- ##" ++## ------------------- ## ++_ASBOX + echo + for ac_var in $ac_subst_files + do +@@ -2098,9 +2029,11 @@ $as_echo "$as_me: WARNING: cache variabl + fi + + if test -s confdefs.h; then +- $as_echo "## ----------- ## ++ cat <<\_ASBOX ++## ----------- ## + ## confdefs.h. ## +-## ----------- ##" ++## ----------- ## ++_ASBOX + echo + cat confdefs.h + echo +@@ -2155,12 +2088,7 @@ _ACEOF + ac_site_file1=NONE + ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- # We do not want a PATH search for config.site. +- case $CONFIG_SITE in #(( +- -*) ac_site_file1=./$CONFIG_SITE;; +- */*) ac_site_file1=$CONFIG_SITE;; +- *) ac_site_file1=./$CONFIG_SITE;; +- esac ++ ac_site_file1=$CONFIG_SITE + elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +@@ -2171,22 +2099,18 @@ fi + for ac_site_file in "$ac_site_file1" "$ac_site_file2" + do + test "x$ac_site_file" = xNONE && continue +- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then ++ if test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + $as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" \ +- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "failed to load site script $ac_site_file +-See \`config.log' for more details" "$LINENO" 5; } ++ . "$ac_site_file" + fi + done + + if test -r "$cache_file"; then +- # Some versions of bash will fail to source /dev/null (special files +- # actually), so we avoid doing that. DJGPP emulates it as a regular file. +- if test /dev/null != "$cache_file" && test -f "$cache_file"; then ++ # Some versions of bash will fail to source /dev/null (special ++ # files actually), so we avoid doing that. ++ if test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + $as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in +@@ -2255,7 +2179,7 @@ if $ac_cache_corrupted; then + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 ++ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + fi + ## -------------------- ## + ## Main body of script. ## +@@ -2276,22 +2200,16 @@ ac_config_headers="$ac_config_headers co + + ac_aux_dir= + for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- if test -f "$ac_dir/install-sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install-sh -c" +- break +- elif test -f "$ac_dir/install.sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install.sh -c" +- break +- elif test -f "$ac_dir/shtool"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/shtool install -c" +- break +- fi ++ for ac_t in install-sh install.sh shtool; do ++ if test -f "$ac_dir/$ac_t"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/$ac_t -c" ++ break 2 ++ fi ++ done + done + if test -z "$ac_aux_dir"; then +- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 ++ as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + fi + + # These three variables are undocumented and unsupported, +@@ -2305,27 +2223,27 @@ ac_configure="$SHELL $ac_aux_dir/configu + + # Make sure we can run config.sub. + $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 ++ as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 + $as_echo_n "checking build system type... " >&6; } +-if ${ac_cv_build+:} false; then : ++if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_build_alias=$build_alias + test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + test "x$ac_build_alias" = x && +- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ++ as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 + ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 ++ as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 + $as_echo "$ac_cv_build" >&6; } + case $ac_cv_build in + *-*-*) ;; +-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; ++*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; + esac + build=$ac_cv_build + ac_save_IFS=$IFS; IFS='-' +@@ -2343,14 +2261,14 @@ case $build_os in *\ *) build_os=`echo " + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 + $as_echo_n "checking host system type... " >&6; } +-if ${ac_cv_host+:} false; then : ++if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build + else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 ++ as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + fi + + fi +@@ -2358,7 +2276,7 @@ fi + $as_echo "$ac_cv_host" >&6; } + case $ac_cv_host in + *-*-*) ;; +-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; ++*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; + esac + host=$ac_cv_host + ac_save_IFS=$IFS; IFS='-' +@@ -2376,14 +2294,14 @@ case $host_os in *\ *) host_os=`echo "$h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 + $as_echo_n "checking target system type... " >&6; } +-if ${ac_cv_target+:} false; then : ++if test "${ac_cv_target+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host + else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 ++ as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + fi + + fi +@@ -2391,7 +2309,7 @@ fi + $as_echo "$ac_cv_target" >&6; } + case $ac_cv_target in + *-*-*) ;; +-*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; ++*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; + esac + target=$ac_cv_target + ac_save_IFS=$IFS; IFS='-' +@@ -2436,7 +2354,7 @@ am__api_version='1.11' + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 + $as_echo_n "checking for a BSD-compatible install... " >&6; } + if test -z "$INSTALL"; then +-if ${ac_cv_path_install+:} false; then : ++if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -2456,7 +2374,7 @@ case $as_dir/ in #(( + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. +@@ -2523,11 +2441,11 @@ am_lf=' + ' + case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) +- as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; ++ as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; + esac + case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) +- as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; ++ as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + esac + + # Do `set' in a subshell so we don't clobber the current shell's +@@ -2549,7 +2467,7 @@ if ( + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". +- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken ++ as_fn_error "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + +@@ -2559,7 +2477,7 @@ then + # Ok. + : + else +- as_fn_error $? "newly created file is older than distributed files! ++ as_fn_error "newly created file is older than distributed files! + Check your system clock" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +@@ -2613,7 +2531,7 @@ if test "$cross_compiling" != no; then + set dummy ${ac_tool_prefix}strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_STRIP+:} false; then : ++if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$STRIP"; then +@@ -2625,7 +2543,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -2653,7 +2571,7 @@ if test -z "$ac_cv_prog_STRIP"; then + set dummy strip; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_STRIP+:} false; then : ++if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_STRIP"; then +@@ -2665,7 +2583,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -2706,7 +2624,7 @@ INSTALL_STRIP_PROGRAM="\$(install_sh) -c + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 + $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } + if test -z "$MKDIR_P"; then +- if ${ac_cv_path_mkdir+:} false; then : ++ if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -2716,7 +2634,7 @@ do + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do +- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue ++ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ +@@ -2731,7 +2649,6 @@ IFS=$as_save_IFS + + fi + +- test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else +@@ -2739,6 +2656,7 @@ fi + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. ++ test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi + fi +@@ -2757,7 +2675,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AWK+:} false; then : ++if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$AWK"; then +@@ -2769,7 +2687,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -2797,7 +2715,7 @@ done + $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } + set x ${MAKE-make} + ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : ++if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + else + cat >conftest.make <<\_ACEOF +@@ -2805,7 +2723,7 @@ SHELL = /bin/sh + all: + @echo '@@@%%%=$(MAKE)=@@@%%%' + _ACEOF +-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. + case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; +@@ -2839,7 +2757,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`" + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then +- as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 ++ as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi + fi + +@@ -2904,7 +2822,7 @@ if test "${enable_multilib+set}" = set; + enableval=$enable_multilib; case "$enableval" in + yes) multilib=yes ;; + no) multilib=no ;; +- *) as_fn_error $? "bad value $enableval for multilib option" "$LINENO" 5 ;; ++ *) as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;; + esac + else + multilib=yes +@@ -2997,7 +2915,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : ++if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -3009,7 +2927,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3037,7 +2955,7 @@ if test -z "$ac_cv_prog_CC"; then + set dummy gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -3049,7 +2967,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3090,7 +3008,7 @@ if test -z "$CC"; then + set dummy ${ac_tool_prefix}cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : ++if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -3102,7 +3020,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3130,7 +3048,7 @@ if test -z "$CC"; then + set dummy cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : ++if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -3143,7 +3061,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue +@@ -3189,7 +3107,7 @@ if test -z "$CC"; then + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : ++if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -3201,7 +3119,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3233,7 +3151,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -3245,7 +3163,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3287,8 +3205,8 @@ fi + + test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "no acceptable C compiler found in \$PATH +-See \`config.log' for more details" "$LINENO" 5; } ++as_fn_error "no acceptable C compiler found in \$PATH ++See \`config.log' for more details." "$LINENO" 5; } + + # Provide some information about the compiler. + $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +@@ -3309,30 +3227,32 @@ $as_echo "$ac_try_echo"; } >&5 + ... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 ++ rm -f conftest.er1 conftest.err + fi +- rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + done + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +- ++#include + int + main () + { ++FILE *f = fopen ("conftest.out", "w"); ++ return ferror (f) || fclose (f) != 0; + + ; + return 0; + } + _ACEOF + ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" ++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" + # Try to create an executable without -o first, disregard a.out. + # It will help us diagnose broken compilers, and finding out an intuition + # of exeext. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +-$as_echo_n "checking whether the C compiler works... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 ++$as_echo_n "checking for C compiler default output file name... " >&6; } + ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + + # The possible output files: +@@ -3394,28 +3314,62 @@ test "$ac_cv_exeext" = no && ac_cv_exeex + else + ac_file='' + fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 ++$as_echo "$ac_file" >&6; } + if test -z "$ac_file"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-$as_echo "$as_me: failed program was:" >&5 ++ $as_echo "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "C compiler cannot create executables +-See \`config.log' for more details" "$LINENO" 5; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++{ as_fn_set_status 77 ++as_fn_error "C compiler cannot create executables ++See \`config.log' for more details." "$LINENO" 5; }; } + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +-$as_echo_n "checking for C compiler default output file name... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +-$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext + +-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ++# Check that the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 ++$as_echo_n "checking whether the C compiler works... " >&6; } ++# If not cross compiling, check that we can run a simple program. ++if test "$cross_compiling" != yes; then ++ if { ac_try='./$ac_file' ++ { { case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" ++$as_echo "$ac_try_echo"; } >&5 ++ (eval "$ac_try") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; }; then ++ cross_compiling=no ++ else ++ if test "$cross_compiling" = maybe; then ++ cross_compiling=yes ++ else ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error "cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." "$LINENO" 5; } ++ fi ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out + ac_clean_files=$ac_clean_files_save ++# Check that the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 ++$as_echo_n "checking whether we are cross compiling... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 ++$as_echo "$cross_compiling" >&6; } ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 + $as_echo_n "checking for suffix of executables... " >&6; } + if { { ac_try="$ac_link" +@@ -3445,78 +3399,19 @@ done + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of executables: cannot compile and link +-See \`config.log' for more details" "$LINENO" 5; } ++as_fn_error "cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." "$LINENO" 5; } + fi +-rm -f conftest conftest$ac_cv_exeext ++rm -f conftest$ac_cv_exeext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + $as_echo "$ac_cv_exeext" >&6; } + + rm -f conftest.$ac_ext + EXEEXT=$ac_cv_exeext + ac_exeext=$EXEEXT +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-int +-main () +-{ +-FILE *f = fopen ("conftest.out", "w"); +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-ac_clean_files="$ac_clean_files conftest.out" +-# Check that the compiler produces executables we can run. If not, either +-# the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +-$as_echo_n "checking whether we are cross compiling... " >&6; } +-if test "$cross_compiling" != yes; then +- { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if { ac_try='./conftest$ac_cv_exeext' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- cross_compiling=no +- else +- if test "$cross_compiling" = maybe; then +- cross_compiling=yes +- else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run C compiled programs. +-If you meant to cross compile, use \`--host'. +-See \`config.log' for more details" "$LINENO" 5; } +- fi +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +-$as_echo "$cross_compiling" >&6; } +- +-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +-ac_clean_files=$ac_clean_files_save + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 + $as_echo_n "checking for suffix of object files... " >&6; } +-if ${ac_cv_objext+:} false; then : ++if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -3556,8 +3451,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details" "$LINENO" 5; } ++as_fn_error "cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." "$LINENO" 5; } + fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext + fi +@@ -3567,7 +3462,7 @@ OBJEXT=$ac_cv_objext + ac_objext=$OBJEXT + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 + $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if ${ac_cv_c_compiler_gnu+:} false; then : ++if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -3604,7 +3499,7 @@ ac_test_CFLAGS=${CFLAGS+set} + ac_save_CFLAGS=$CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 + $as_echo_n "checking whether $CC accepts -g... " >&6; } +-if ${ac_cv_prog_cc_g+:} false; then : ++if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_save_c_werror_flag=$ac_c_werror_flag +@@ -3682,7 +3577,7 @@ else + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 + $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : ++if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_prog_cc_c89=no +@@ -3691,7 +3586,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* end confdefs.h. */ + #include + #include +-struct stat; ++#include ++#include + /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ + struct buf { int x; }; + FILE * (*rcsopen) (struct buf *, struct stat *, int); +@@ -3792,7 +3688,7 @@ if test -z "$CXX"; then + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${glibcxx_cv_prog_CXX+:} false; then : ++if test "${glibcxx_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CXX"; then +@@ -3804,7 +3700,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + glibcxx_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3836,7 +3732,7 @@ do + set dummy $ac_prog; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CXX+:} false; then : ++if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CXX"; then +@@ -3848,7 +3744,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -3906,15 +3802,15 @@ $as_echo "$ac_try_echo"; } >&5 + ... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 ++ rm -f conftest.er1 conftest.err + fi +- rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 + $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +-if ${ac_cv_cxx_compiler_gnu+:} false; then : ++if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -3951,7 +3847,7 @@ ac_test_CXXFLAGS=${CXXFLAGS+set} + ac_save_CXXFLAGS=$CXXFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 + $as_echo_n "checking whether $CXX accepts -g... " >&6; } +-if ${ac_cv_prog_cxx_g+:} false; then : ++if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag +@@ -4049,7 +3945,7 @@ else + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_RANLIB+:} false; then : ++if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$RANLIB"; then +@@ -4061,7 +3957,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4089,7 +3985,7 @@ if test -z "$ac_cv_prog_RANLIB"; then + set dummy ranlib; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : ++if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_RANLIB"; then +@@ -4101,7 +3997,7 @@ do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 +@@ -4142,7 +4038,7 @@ fi + $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } + set x ${MAKE-make} + ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : ++if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 + else + cat >conftest.make <<\_ACEOF +@@ -4150,7 +4046,7 @@ SHELL = /bin/sh + all: + @echo '@@@%%%=$(MAKE)=@@@%%%' + _ACEOF +-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. + case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; +@@ -4206,7 +4102,7 @@ fi + # Check whether --enable-phobos-config-dir was given. + if test "${enable_phobos_config_dir+set}" = set; then : + enableval=$enable_phobos_config_dir; if test -z "${enableval}"; then +- as_fn_error $? "must specify a value for --enable-phobos-config-dir" "$LINENO" 5 ++ as_fn_error "must specify a value for --enable-phobos-config-dir" "$LINENO" 5 + fi + else + : +@@ -4221,11 +4117,6 @@ fi + + d_target_os=`echo $target_os | sed 's/^\(A-Za-z_+\)/\1/'` + +-# SkyOS uses i386-skyos-pe +-case "$target" in +-*-skyos*-pe*) d_target_os=skyos ;; +-esac +- + GDC=$CC + GDC=`echo $CC | sed s/xgcc/gdc/` + +@@ -4241,7 +4132,7 @@ $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +- as_fn_error $? "can't compile D sources!" "$LINENO" 5 ++ as_fn_error "can't compile D sources!" "$LINENO" 5 + fi + + +@@ -4279,7 +4170,7 @@ while test "$d_count" != 'xxx'; do + done + + if test ! -f "$BUILD_LIBIBERTY"; then +- as_fn_error $? "cannot find libiberty.a for build" "$LINENO" 5 ++ as_fn_error "cannot find libiberty.a for build" "$LINENO" 5 + fi + + #used in druntime, so srcdir is 'libphobos/libdruntime' +@@ -4294,7 +4185,32 @@ BUILD_LIBIBERTY="../$BUILD_LIBIBERTY" + # include dir .. need to support --enable-version-specific.. but + # will have to modify gcc/configure.ac .. + # For now, basic workaround for cross compilers .. +-if test "${host}" != "${build}"; then ++# To really mirror the check in Make-lang.in we need to access the ++# host/target of the compiler. The libphobos 'host' and 'target' variables ++# are always equal (and are the same as the compilers target) ++d_count="" ++d_pkgvars_prefix=../.. ++while test "$d_count" != 'xxx'; do ++ d_pkgvars=$d_pkgvars_prefix/gcc/d/pkgvars ++ if test -f $d_pkgvars; then ++ break ++ fi ++ ++ d_pkgvars_prefix=../$d_pkgvars_prefix ++ d_count="x$d_count" ++done ++ ++if test -f "${d_pkgvars}"; then ++ gdc_host=`grep "host=" "${d_pkgvars}" | sed -e 's|host=||'` ++ gdc_target=`grep "target=" "${d_pkgvars}" | sed -e 's|target=||'` ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find pkgvars file to determine compiler host/target" >&5 ++$as_echo "$as_me: WARNING: Cannot find pkgvars file to determine compiler host/target" >&2;} ++ gdc_host=${build} ++ gdc_target=${host} ++fi ++ ++if test "${gdc_host}" != "${gdc_target}"; then + gdc_include_dir='${libdir}/gcc/${host_alias}'/${d_gcc_ver}/include/d + else + gdc_include_dir='${prefix}'/include/d/${d_gcc_ver} +@@ -4338,7 +4254,7 @@ if test -n "$CPP" && test -d "$CPP"; the + CPP= + fi + if test -z "$CPP"; then +- if ${ac_cv_prog_CPP+:} false; then : ++ if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + # Double quotes because CPP needs to be expanded +@@ -4368,7 +4284,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.i conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -4384,11 +4300,11 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.i conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + break + fi +@@ -4427,7 +4343,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.i conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -4443,18 +4359,18 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.i conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } ++as_fn_error "C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." "$LINENO" 5; } + fi + + ac_ext=c +@@ -4466,7 +4382,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + $as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if ${ac_cv_path_GREP+:} false; then : ++if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$GREP"; then +@@ -4480,7 +4396,7 @@ do + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_GREP" || continue ++ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP + case `"$ac_path_GREP" --version 2>&1` in +@@ -4515,7 +4431,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then +- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_GREP=$GREP +@@ -4529,7 +4445,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 + $as_echo_n "checking for egrep... " >&6; } +-if ${ac_cv_path_EGREP+:} false; then : ++if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +@@ -4546,7 +4462,7 @@ do + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_EGREP" || continue ++ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP + case `"$ac_path_EGREP" --version 2>&1` in +@@ -4581,7 +4497,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then +- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_EGREP=$EGREP +@@ -4596,7 +4512,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 + $as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : ++if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4713,7 +4629,8 @@ do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default + " +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : ++eval as_val=\$$as_ac_Header ++ if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -4724,13 +4641,160 @@ done + + + ac_fn_c_check_header_mongrel "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default" +-if test "x$ac_cv_header_stdio_h" = xyes; then : ++if test "x$ac_cv_header_stdio_h" = x""yes; then : + : + else +- as_fn_error $? "cannot find stdio.h." "$LINENO" 5 ++ as_fn_error "cannot find stdio.h." "$LINENO" 5 ++fi ++ ++ ++ ++ ++HAVE_DLADDR=false ++ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr" ++if test "x$ac_cv_func_dladdr" = x""yes; then : ++ HAVE_DLADDR=true ++fi ++ ++ ++ ++BACKTRACE_SUPPORTED=false ++BACKTRACE_USES_MALLOC=false ++BACKTRACE_SUPPORTS_THREADS=false ++LIBBACKTRACE_LIB="" ++ ++CPPFLAGS+=" -I../libbacktrace " ++ ++# Check whether --enable-libbacktrace was given. ++if test "${enable_libbacktrace+set}" = set; then : ++ enableval=$enable_libbacktrace; check_libbacktrace_h="$enableval" ++else ++ check_libbacktrace_h="yes" ++fi ++ ++ ++if test $check_libbacktrace_h = yes ; then ++ ac_fn_c_check_header_mongrel "$LINENO" "backtrace-supported.h" "ac_cv_header_backtrace_supported_h" "$ac_includes_default" ++if test "x$ac_cv_header_backtrace_supported_h" = x""yes; then : ++ have_libbacktrace_h=true ++else ++ have_libbacktrace_h=false + fi + + ++else ++ have_libbacktrace_h=false ++fi ++ ++if $have_libbacktrace_h; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking libbacktrace: BACKTRACE_SUPPORTED" >&5 ++$as_echo_n "checking libbacktrace: BACKTRACE_SUPPORTED... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ #if BACKTRACE_SUPPORTED ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "FOUND_LIBBACKTRACE_RESULT_GDC" >/dev/null 2>&1; then : ++ BACKTRACE_SUPPORTED=true ++else ++ BACKTRACE_SUPPORTED=false ++fi ++rm -f conftest* ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BACKTRACE_SUPPORTED" >&5 ++$as_echo "$BACKTRACE_SUPPORTED" >&6; } ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking libbacktrace: BACKTRACE_USES_MALLOC" >&5 ++$as_echo_n "checking libbacktrace: BACKTRACE_USES_MALLOC... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ #if BACKTRACE_USES_MALLOC ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "FOUND_LIBBACKTRACE_RESULT_GDC" >/dev/null 2>&1; then : ++ BACKTRACE_USES_MALLOC=true ++else ++ BACKTRACE_USES_MALLOC=false ++fi ++rm -f conftest* ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BACKTRACE_USES_MALLOC" >&5 ++$as_echo "$BACKTRACE_USES_MALLOC" >&6; } ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking libbacktrace: BACKTRACE_SUPPORTS_THREADS" >&5 ++$as_echo_n "checking libbacktrace: BACKTRACE_SUPPORTS_THREADS... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ #if BACKTRACE_SUPPORTS_THREADS ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "FOUND_LIBBACKTRACE_RESULT_GDC" >/dev/null 2>&1; then : ++ BACKTRACE_SUPPORTS_THREADS=true ++else ++ BACKTRACE_SUPPORTS_THREADS=false ++fi ++rm -f conftest* ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BACKTRACE_SUPPORTS_THREADS" >&5 ++$as_echo "$BACKTRACE_SUPPORTS_THREADS" >&6; } ++fi ++ ++ if $BACKTRACE_SUPPORTED; then ++ BACKTRACE_SUPPORTED_TRUE= ++ BACKTRACE_SUPPORTED_FALSE='#' ++else ++ BACKTRACE_SUPPORTED_TRUE='#' ++ BACKTRACE_SUPPORTED_FALSE= ++fi ++ ++ ++if $BACKTRACE_SUPPORTED; then ++ LIBBACKTRACE_LIB="../../libbacktrace/.libs/libbacktrace.a" ++else ++ LIBBACKTRACE_LIB="" ++fi ++ ++ ++ ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread model used by GDC" >&5 ++$as_echo_n "checking for thread model used by GDC... " >&6; } ++d_thread_model=`$GDC -v 2>&1 | sed -n 's/^Thread model: //p'` ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d_thread_model" >&5 ++$as_echo "$d_thread_model" >&6; } ++ ++# Map from thread model to thread interface. ++ ++case $d_thread_model in ++ aix) DCFG_THREAD_MODEL="GNU_Thread_Posix" ;; ++ lynx) DCFG_THREAD_MODEL="GNU_Thread_Posix" ;; ++ posix) DCFG_THREAD_MODEL="GNU_Thread_Posix" ;; ++ single) DCFG_THREAD_MODEL="GNU_Thread_Single" ;; ++ win32) DCFG_THREAD_MODEL="GNU_Thread_Win32" ;; ++ # TODO: These targets need porting. ++ dce|mipssde|rtems|tpf|vxworks) ++ DCFG_THREAD_MODEL="GNU_Thread_Single" ;; ++ *) as_fn_error "Thread implementation '$d_thread_model' not recognised" "$LINENO" 5 ;; ++esac ++ ++ + + # TODO... + +@@ -4743,7 +4807,7 @@ if test "$with_newlib" = no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 + $as_echo_n "checking for cos in -lm... " >&6; } +-if ${ac_cv_lib_m_cos+:} false; then : ++if test "${ac_cv_lib_m_cos+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -4777,7 +4841,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 + $as_echo "$ac_cv_lib_m_cos" >&6; } +-if test "x$ac_cv_lib_m_cos" = xyes; then : ++if test "x$ac_cv_lib_m_cos" = x""yes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_LIBM 1 + _ACEOF +@@ -4790,7 +4854,7 @@ fi + case "$d_target_os" in + aix*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf in -lC" >&5 + $as_echo_n "checking for sqrtf in -lC... " >&6; } +-if ${ac_cv_lib_C_sqrtf+:} false; then : ++if test "${ac_cv_lib_C_sqrtf+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -4824,7 +4888,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_C_sqrtf" >&5 + $as_echo "$ac_cv_lib_C_sqrtf" >&6; } +-if test "x$ac_cv_lib_C_sqrtf" = xyes; then : ++if test "x$ac_cv_lib_C_sqrtf" = x""yes; then : + cat >>confdefs.h <<_ACEOF + #define HAVE_LIBC 1 + _ACEOF +@@ -4841,7 +4905,7 @@ case "$target_os" in + powerpc*) + # Libc without nldbl not supported... + ac_fn_c_check_func "$LINENO" "__nldbl_printf" "ac_cv_func___nldbl_printf" +-if test "x$ac_cv_func___nldbl_printf" = xyes; then : ++if test "x$ac_cv_func___nldbl_printf" = x""yes; then : + d_have_nldbl_funcs=1 + else + : +@@ -4939,13 +5003,14 @@ for ac_func in snprintf _snprintf + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-if eval test \"x\$"$as_ac_var"\" = x"yes"; then : ++eval as_val=\$$as_ac_var ++ if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 + _ACEOF + break + else +- as_fn_error $? "No variant of snprintf." "$LINENO" 5 ++ as_fn_error "No variant of snprintf." "$LINENO" 5 + fi + done + +@@ -4953,13 +5018,14 @@ for ac_func in vsnprintf _vsnprintf + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-if eval test \"x\$"$as_ac_var"\" = x"yes"; then : ++eval as_val=\$$as_ac_var ++ if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 + _ACEOF + break + else +- as_fn_error $? "No variant of vsnprintf." "$LINENO" 5 ++ as_fn_error "No variant of vsnprintf." "$LINENO" 5 + fi + done + +@@ -4988,16 +5054,25 @@ if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + DCFG_ARM_EABI_UNWINDER="" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind_generic.o" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind/generic.o" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + DCFG_ARM_EABI_UNWINDER="GNU_ARM_EABI_Unwinder" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind_arm.o" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind/arm.o" + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + ++case "$d_thread_model" in ++ posix) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/posix.o" ++ ;; ++ win32) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/win32.o" ++ ;; ++ *) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/single.o" ++ ;; ++esac ++ + case "$d_target_os" in + aix*|*bsd*|cygwin*|darwin*|gnu*|linux*|skyos*|*solaris*|sysv*) d_have_unix=1 ;; + esac +@@ -5012,8 +5087,8 @@ fi + case "$d_target_os" in + aix*) d_is_aix=1 + ;; +- darwin*) d_module_mach=1 +- d_sem_impl="mach" ++ darwin*) DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_OSX_OBJS)" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OSX_OBJS)" + ;; + freebsd*|k*bsd*-gnu) + DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +@@ -5022,7 +5097,6 @@ case "$d_target_os" in + ;; + linux*) #D_EXTRA_OBJS="$D_EXTRA_OBJS std/c/linux/linux.o" + D_EXTRA_OBJS="$D_EXTRA_OBJS \$(LINUX_OBJS)" +- d_sem_impl="posix" + ;; + cygwin*) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" + DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +@@ -5035,10 +5109,6 @@ case "$d_target_os" in + #DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" + DCFG_UNIX=Windows + ;; +- skyos*) d_sem_impl="skyos" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- ;; + *) if test "$enable_unix" != "yes"; then + DCFG_UNIX=NoSystem + fi +@@ -5047,256 +5117,22 @@ case "$d_target_os" in + ;; + esac + +-if test -n "$d_module_mach"; then +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_OSX_OBJS)" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OSX_OBJS)" +-fi +- + if test "$enable_unix" = "yes"; then + DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_STDC_OBJS)" + DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_POSIX_OBJS)" + D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OS_OBJS)" + +- +-for ac_header in pthread.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +-if test "x$ac_cv_header_pthread_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_H 1 +-_ACEOF +- : +-else +- as_fn_error $? "can't find pthread.h. Pthreads is the only supported thread library." "$LINENO" 5 +-fi +- +-done +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for recursive mutex name" >&5 +-$as_echo_n "checking for recursive mutex name... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-int +-main () +-{ +- +-pthread_mutexattr_t attr; +-pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-$as_echo "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: PTHREAD_MUTEX_RECURSIVE" >&5 +-$as_echo "PTHREAD_MUTEX_RECURSIVE" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: PTHREAD_MUTEX_RECURSIVE_NP" >&5 +-$as_echo "PTHREAD_MUTEX_RECURSIVE_NP" >&6; } +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-ac_fn_c_check_type "$LINENO" "pthread_barrier_t" "ac_cv_type_pthread_barrier_t" "#include +-" +-if test "x$ac_cv_type_pthread_barrier_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_BARRIER_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "pthread_barrierattr_t" "ac_cv_type_pthread_barrierattr_t" "#include +-" +-if test "x$ac_cv_type_pthread_barrierattr_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_BARRIERATTR_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include +-" +-if test "x$ac_cv_type_pthread_rwlock_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_RWLOCK_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "pthread_rwlockattr_t" "ac_cv_type_pthread_rwlockattr_t" "#include +-" +-if test "x$ac_cv_type_pthread_rwlockattr_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_RWLOCKATTR_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "pthread_spinlock_t" "ac_cv_type_pthread_spinlock_t" "#include +-" +-if test "x$ac_cv_type_pthread_spinlock_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_PTHREAD_SPINLOCK_T 1 +-_ACEOF +- +- +-fi +- +- +-ac_fn_c_check_type "$LINENO" "clockid_t" "ac_cv_type_clockid_t" "#include +-" +-if test "x$ac_cv_type_clockid_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-#define HAVE_CLOCKID_T 1 +-_ACEOF +- +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_init" >&5 +-$as_echo_n "checking for library containing sem_init... " >&6; } +-if ${ac_cv_search_sem_init+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_func_search_save_LIBS=$LIBS +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char sem_init (); +-int +-main () +-{ +-return sem_init (); +- ; +- return 0; +-} +-_ACEOF +-for ac_lib in '' pthread rt posix4; do +- if test -z "$ac_lib"; then +- ac_res="none required" +- else +- ac_res=-l$ac_lib +- LIBS="-l$ac_lib $ac_func_search_save_LIBS" +- fi +- if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_search_sem_init=$ac_res +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext +- if ${ac_cv_search_sem_init+:} false; then : +- break +-fi +-done +-if ${ac_cv_search_sem_init+:} false; then : +- +-else +- ac_cv_search_sem_init=no +-fi +-rm conftest.$ac_ext +-LIBS=$ac_func_search_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_init" >&5 +-$as_echo "$ac_cv_search_sem_init" >&6; } +-ac_res=$ac_cv_search_sem_init +-if test "$ac_res" != no; then : +- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +- +-fi +- +- +-for ac_header in semaphore.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "semaphore.h" "ac_cv_header_semaphore_h" "$ac_includes_default" +-if test "x$ac_cv_header_semaphore_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SEMAPHORE_H 1 +-_ACEOF +- +-fi +- +-done +- +-ac_fn_c_check_func "$LINENO" "sem_init" "ac_cv_func_sem_init" +-if test "x$ac_cv_func_sem_init" = xyes; then : +- +-fi +- +-ac_fn_c_check_func "$LINENO" "semaphore_create" "ac_cv_func_semaphore_create" +-if test "x$ac_cv_func_semaphore_create" = xyes; then : +- +-fi +- +-ac_fn_c_check_func "$LINENO" "pthread_cond_wait" "ac_cv_func_pthread_cond_wait" +-if test "x$ac_cv_func_pthread_cond_wait" = xyes; then : +- +-fi +- +- +-if test -z "$d_sem_impl"; then +- # Probably need to test what actually works. sem_init is defined +- # on AIX and Darwin but does not actually work. +- # For now, test for Mach semaphores first so it overrides Posix. AIX +- # is a special case. +- if test "$ac_cv_func_semaphore_create" = "yes"; then +- d_sem_impl="mach" +- elif test "$ac_cv_func_sem_init" = "yes" && \ +- test "$ac_cv_header_semaphore_h" = "yes" && \ +- test -z "$d_is_aix"; then +- d_sem_impl="posix" +- elif test "$ac_cv_func_pthread_cond_wait" = "yes"; then +- d_sem_impl="pthreads" +- fi +-fi +- +- +-case "$d_sem_impl" in +- posix) DCFG_SEMAPHORE_IMPL="GNU_Semaphore_POSIX" ;; +- mach) DCFG_SEMAPHORE_IMPL="GNU_Semaphore_Mach" +- d_module_mach=1 ;; +- pthreads) DCFG_SEMAPHORE_IMPL="GNU_Sempahore_Pthreads" ;; +- skyos) DCFG_SEMAPHORE_IMPL="GNU_Sempahore_Pthreads" +- D_EXTRA_OBJS="$D_EXTRA_OBJS std/c/skyos/compat.o" +- ;; +- *) as_fn_error $? "No usable semaphore implementation" "$LINENO" 5 ;; +-esac +- +- +-$as_echo "#define PHOBOS_USE_PTHREADS 1" >>confdefs.h +- +- +- + # Add "linux" module for compatibility even if not Linux + D_EXTRA_OBJS="std/c/linux/linux.o $D_EXTRA_OBJS" + DCFG_UNIX="Unix" + DCFG_POSIX="Posix" + +- + fi + + + + + +- +- +- + if test -z "$DFLAGS"; then + DFLAGS="-Wall -g -frelease -O2" + fi +@@ -5325,7 +5161,7 @@ done + D_GC_MODULES= + + if test "$enable_druntime_gc" = "yes"; then +- D_GC_MODULES="gc/gc.o gc/gcalloc.o gc/gcbits.o gc/gcstats.o gc/gcx.o" ++ D_GC_MODULES="gc/bits.o gc/gc.o gc/os.o gc/proxy.o gc/stats.o" + else + D_GC_MODULES="gcstub/gc.o" + fi +@@ -5337,7 +5173,7 @@ ZLIB_OBJS= + if test "$system_zlib" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 + $as_echo_n "checking for deflate in -lz... " >&6; } +-if ${ac_cv_lib_z_deflate+:} false; then : ++if test "${ac_cv_lib_z_deflate+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -5371,7 +5207,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 + $as_echo "$ac_cv_lib_z_deflate" >&6; } +-if test "x$ac_cv_lib_z_deflate" = xyes; then : ++if test "x$ac_cv_lib_z_deflate" = x""yes; then : + ZLIB_OBJS= + else + ZLIB_OBJS="\$(Z_OBJS)" +@@ -5395,7 +5231,7 @@ ac_config_files="$ac_config_files src/Ma + + + #TODO: Should be possible to get rid of libdruntime/phobos-ver-syms +-ac_config_files="$ac_config_files Makefile src/phobos-ver-syms libdruntime/phobos-ver-syms" ++ac_config_files="$ac_config_files Makefile src/phobos-ver-syms libdruntime/phobos-ver-syms libdruntime/gcc/libbacktrace.d" + + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure +@@ -5461,21 +5297,10 @@ $as_echo "$as_me: WARNING: cache variabl + :end' >>confcache + if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then +- if test "x$cache_file" != "x/dev/null"; then ++ test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + $as_echo "$as_me: updating cache $cache_file" >&6;} +- if test ! -f "$cache_file" || test -h "$cache_file"; then +- cat confcache >"$cache_file" +- else +- case $cache_file in #( +- */* | ?:*) +- mv -f confcache "$cache_file"$$ && +- mv -f "$cache_file"$$ "$cache_file" ;; #( +- *) +- mv -f confcache "$cache_file" ;; +- esac +- fi +- fi ++ cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} +@@ -5491,7 +5316,6 @@ DEFS=-DHAVE_CONFIG_H + + ac_libobjs= + ac_ltlibobjs= +-U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +@@ -5514,8 +5338,12 @@ else + am__EXEEXT_FALSE= + fi + ++if test -z "${BACKTRACE_SUPPORTED_TRUE}" && test -z "${BACKTRACE_SUPPORTED_FALSE}"; then ++ as_fn_error "conditional \"BACKTRACE_SUPPORTED\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + +-: "${CONFIG_STATUS=./config.status}" ++: ${CONFIG_STATUS=./config.status} + ac_write_fail=0 + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" +@@ -5616,7 +5444,6 @@ fi + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. +-as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -5662,19 +5489,19 @@ export LANGUAGE + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +-# as_fn_error STATUS ERROR [LINENO LOG_FD] +-# ---------------------------------------- ++# as_fn_error ERROR [LINENO LOG_FD] ++# --------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with STATUS, using 1 if that was 0. ++# script with status $?, using 1 if that was 0. + as_fn_error () + { +- as_status=$1; test $as_status -eq 0 && as_status=1 +- if test "$4"; then +- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 ++ as_status=$?; test $as_status -eq 0 && as_status=1 ++ if test "$3"; then ++ as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi +- $as_echo "$as_me: error: $2" >&2 ++ $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -5812,16 +5639,16 @@ if (echo >conf$$.file) 2>/dev/null; then + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -pR'. ++ # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -pR' ++ as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else +- as_ln_s='cp -pR' ++ as_ln_s='cp -p' + fi + else +- as_ln_s='cp -pR' ++ as_ln_s='cp -p' + fi + rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file + rmdir conf$$.dir 2>/dev/null +@@ -5870,7 +5697,7 @@ $as_echo X"$as_dir" | + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + + } # as_fn_mkdir_p +@@ -5881,16 +5708,28 @@ else + as_mkdir_p=false + fi + +- +-# as_fn_executable_p FILE +-# ----------------------- +-# Test if FILE is an executable regular file. +-as_fn_executable_p () +-{ +- test -f "$1" && test -x "$1" +-} # as_fn_executable_p +-as_test_x='test -x' +-as_executable_p=as_fn_executable_p ++if test -x / >/dev/null 2>&1; then ++ as_test_x='test -x' ++else ++ if ls -dL / >/dev/null 2>&1; then ++ as_ls_L_option=L ++ else ++ as_ls_L_option= ++ fi ++ as_test_x=' ++ eval sh -c '\'' ++ if test -d "$1"; then ++ test -d "$1/."; ++ else ++ case $1 in #( ++ -*)set "./$1";; ++ esac; ++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ++ ???[sx]*):;;*)false;;esac;fi ++ '\'' sh ++ ' ++fi ++as_executable_p=$as_test_x + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +@@ -5912,7 +5751,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # values after options handling. + ac_log=" + This file was extended by libphobos $as_me version-unused, which was +-generated by GNU Autoconf 2.69. Invocation command line was ++generated by GNU Autoconf 2.64. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -5952,7 +5791,6 @@ Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit +- --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files +@@ -5975,13 +5813,12 @@ Report bugs to the package provider." + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ + libphobos config.status version-unused +-configured by $0, generated by GNU Autoconf 2.69, +- with options \\"\$ac_cs_config\\" ++configured by $0, generated by GNU Autoconf 2.64, ++ with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +-Copyright (C) 2012 Free Software Foundation, Inc. ++Copyright (C) 2009 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + +@@ -5999,16 +5836,11 @@ ac_need_defaults=: + while test $# != 0 + do + case $1 in +- --*=?*) ++ --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; +- --*=) +- ac_option=`expr "X$1" : 'X\([^=]*\)='` +- ac_optarg= +- ac_shift=: +- ;; + *) + ac_option=$1 + ac_optarg=$2 +@@ -6022,15 +5854,12 @@ do + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; +- --config | --confi | --conf | --con | --co | --c ) +- $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; +- '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; +@@ -6043,7 +5872,7 @@ do + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header +- as_fn_error $? "ambiguous option: \`$1' ++ as_fn_error "ambiguous option: \`$1' + Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; +@@ -6052,7 +5881,7 @@ Try \`$0 --help' for more information."; + ac_cs_silent=: ;; + + # This is an error. +- -*) as_fn_error $? "unrecognized option: \`$1' ++ -*) as_fn_error "unrecognized option: \`$1' + Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" +@@ -6072,7 +5901,7 @@ fi + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + if \$ac_cs_recheck; then +- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' +@@ -6123,8 +5952,9 @@ do + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/phobos-ver-syms") CONFIG_FILES="$CONFIG_FILES src/phobos-ver-syms" ;; + "libdruntime/phobos-ver-syms") CONFIG_FILES="$CONFIG_FILES libdruntime/phobos-ver-syms" ;; ++ "libdruntime/gcc/libbacktrace.d") CONFIG_FILES="$CONFIG_FILES libdruntime/gcc/libbacktrace.d" ;; + +- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; ++ *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac + done + +@@ -6147,10 +5977,9 @@ fi + # after its creation but before its name has been assigned to `$tmp'. + $debug || + { +- tmp= ac_tmp= ++ tmp= + trap 'exit_status=$? +- : "${ac_tmp:=$tmp}" +- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ++ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + ' 0 + trap 'as_fn_exit 1' 1 2 13 15 + } +@@ -6158,13 +5987,12 @@ $debug || + + { + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -d "$tmp" ++ test -n "$tmp" && test -d "$tmp" + } || + { + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +-ac_tmp=$tmp ++} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + + # Set up the scripts for CONFIG_FILES section. + # No need to generate them if there are no CONFIG_FILES. +@@ -6181,12 +6009,12 @@ if test "x$ac_cr" = x; then + fi + ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` + if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\\r' ++ ac_cs_awk_cr='\r' + else + ac_cs_awk_cr=$ac_cr + fi + +-echo 'BEGIN {' >"$ac_tmp/subs1.awk" && ++echo 'BEGIN {' >"$tmp/subs1.awk" && + _ACEOF + + +@@ -6195,18 +6023,18 @@ _ACEOF + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" + } >conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + ac_delim='%!_!# ' + for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -6214,7 +6042,7 @@ done + rm -f conf$$subs.sh + + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && ++cat >>"\$tmp/subs1.awk" <<\\_ACAWK && + _ACEOF + sed -n ' + h +@@ -6228,7 +6056,7 @@ s/'"$ac_delim"'$// + t delim + :nl + h +-s/\(.\{148\}\)..*/\1/ ++s/\(.\{148\}\).*/\1/ + t more1 + s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ + p +@@ -6242,7 +6070,7 @@ s/.\{148\}// + t nl + :delim + h +-s/\(.\{148\}\)..*/\1/ ++s/\(.\{148\}\).*/\1/ + t more2 + s/["\\]/\\&/g; s/^/"/; s/$/"/ + p +@@ -6262,7 +6090,7 @@ t delim + rm -f conf$$subs.awk + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK +-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && ++cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +@@ -6294,29 +6122,21 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" + else + cat +-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ +- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 ++fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ ++ || as_fn_error "could not setup config files machinery" "$LINENO" 5 + _ACEOF + +-# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and ++# VPATH may cause trouble with some makes, so we remove $(srcdir), ++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +-h +-s/// +-s/^/:/ +-s/[ ]*$/:/ +-s/:\$(srcdir):/:/g +-s/:\${srcdir}:/:/g +-s/:@srcdir@:/:/g +-s/^:*// ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++s/:*\$(srcdir):*/:/ ++s/:*\${srcdir}:*/:/ ++s/:*@srcdir@:*/:/ ++s/^\([^=]*=[ ]*\):*/\1/ + s/:*$// +-x +-s/\(=[ ]*\).*/\1/ +-G +-s/\n// + s/^[^=]*=[ ]*$// + }' + fi +@@ -6328,7 +6148,7 @@ fi # test -n "$CONFIG_FILES" + # No need to generate them if there are no CONFIG_HEADERS. + # This happens for instance with `./config.status Makefile'. + if test -n "$CONFIG_HEADERS"; then +-cat >"$ac_tmp/defines.awk" <<\_ACAWK || ++cat >"$tmp/defines.awk" <<\_ACAWK || + BEGIN { + _ACEOF + +@@ -6340,11 +6160,11 @@ _ACEOF + # handling of long lines. + ac_delim='%!_!# ' + for ac_last_try in false false :; do +- ac_tt=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_tt"; then ++ ac_t=`sed -n "/$ac_delim/p" confdefs.h` ++ if test -z "$ac_t"; then + break + elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 ++ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -6429,7 +6249,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ + _ACAWK + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 ++ as_fn_error "could not setup config headers machinery" "$LINENO" 5 + fi # test -n "$CONFIG_HEADERS" + + +@@ -6442,7 +6262,7 @@ do + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; +- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; ++ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac +@@ -6461,7 +6281,7 @@ do + for ac_f + do + case $ac_f in +- -) ac_f="$ac_tmp/stdin";; ++ -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. +@@ -6470,7 +6290,7 @@ do + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || +- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; ++ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" +@@ -6496,8 +6316,8 @@ $as_echo "$as_me: creating $ac_file" >&6 + esac + + case $ac_tag in +- *:-:* | *:-) cat >"$ac_tmp/stdin" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; ++ *:-:* | *:-) cat >"$tmp/stdin" \ ++ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac +@@ -6633,24 +6453,23 @@ s&@INSTALL@&$ac_INSTALL&;t t + s&@MKDIR_P@&$ac_MKDIR_P&;t t + $ac_datarootdir_hack + " +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ +- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ ++ || as_fn_error "could not create $ac_file" "$LINENO" 5 + + test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ +- "$ac_tmp/out"`; test -z "$ac_out"; } && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&5 ++which seems to be undefined. Please make sure it is defined." >&5 + $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&2;} ++which seems to be undefined. Please make sure it is defined." >&2;} + +- rm -f "$ac_tmp/stdin" ++ rm -f "$tmp/stdin" + case $ac_file in +- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; +- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; ++ -) cat "$tmp/out" && rm -f "$tmp/out";; ++ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # +@@ -6659,21 +6478,21 @@ which seems to be undefined. Please mak + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" +- } >"$ac_tmp/config.h" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then ++ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" ++ } >"$tmp/config.h" \ ++ || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + $as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" +- mv "$ac_tmp/config.h" "$ac_file" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++ mv "$tmp/config.h" "$ac_file" \ ++ || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error $? "could not create -" "$LINENO" 5 ++ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ ++ || as_fn_error "could not create -" "$LINENO" 5 + fi + # Compute "$ac_file"'s index in $config_headers. + _am_arg="$ac_file" +@@ -6758,7 +6577,7 @@ _ACEOF + ac_clean_files=$ac_clean_files_save + + test $ac_write_fail = 0 || +- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + + # configure is writing to config.log, and then calls config.status. +@@ -6779,7 +6598,7 @@ if test "$no_create" != yes; then + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit 1 ++ $ac_cs_success || as_fn_exit $? + fi + if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +--- a/src/libphobos/configure.ac 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/configure.ac 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,559 @@ ++# GDC -- D front-end for GCC ++# Copyright (C) 2004 David Friedman ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ ++# Process this file with autoreconf to produce a configure script. ++ ++AC_PREREQ(2.64) ++AC_INIT(libphobos, version-unused) ++AC_CONFIG_SRCDIR(std/algorithm.d) ++AC_CONFIG_SRCDIR(libdruntime/gcc/builtins.d) ++AC_CONFIG_SRCDIR(libdruntime/gcc/attribute.d) ++AC_CONFIG_HEADERS(config.h) ++ ++AC_CANONICAL_SYSTEM ++target_alias=${target_alias-$target} ++AC_SUBST(target_alias) ++ ++AM_INIT_AUTOMAKE([1.9.3 foreign no-dependencies]) ++AH_TEMPLATE(PACKAGE, [Name of package]) ++AH_TEMPLATE(VERSION, [Version number of package]) ++ ++AM_ENABLE_MULTILIB(, ..) ++ ++# libphobos is usually a symlink to gcc/d/phobos, so libphobos/.. ++# is not the toplevel GCC directory. gcc/d may also be a symlink. ++# Find the correct top-level directory by removing "/libphobos" ++# from $srcdir. ++dnl NOTE: This assumes that AM_ENABLE_MULTILIB uses $multi_basedir ++if test ! -r "$multi_basedir/config-ml.in"; then ++ better_dir=`echo "$srcdir" | sed -e 's|/libphobos||'` ++ if test -r "$better_dir/config-ml.in"; then ++ multi_basedir=$better_dir ++ fi ++fi ++ ++if test "$build" != "$host"; then ++ # We are being configured with some form of cross compiler. ++ #GLIBCXX_IS_NATIVE=false ++ GCC_NO_EXECUTABLES ++ d_cross_comp=yes ++else ++ d_cross_comp= ++fi ++ ++dnl Copied from libstdc++-v3/acinclude.m4. Indeed, multilib will not work ++dnl correctly without this. ++# We're almost certainly being configured before anything else which uses ++# C++, so all of our AC_PROG_* discoveries will be cached. It's vital that ++# we not cache the value of CXX that we "discover" here, because it's set ++# to something unique for us and libjava. Other target libraries need to ++# find CXX for themselves. We yank the rug out from under the normal AC_* ++# process by sneakily renaming the cache variable. This also lets us debug ++# the value of "our" CXX in postmortems. ++# ++# We must also force CXX to /not/ be a precious variable, otherwise the ++# wrong (non-multilib-adjusted) value will be used in multilibs. This ++# little trick also affects CPPFLAGS, CXXFLAGS, and LDFLAGS. And as a side ++# effect, CXXFLAGS is no longer automagically subst'd, so we have to do ++# that ourselves. Un-preciousing AC_PROG_CC also affects CC and CFLAGS. ++# ++# -fno-builtin must be present here so that a non-conflicting form of ++# std::exit can be guessed by AC_PROG_CXX, and used in later tests. ++ ++m4_define([ac_cv_prog_CXX],[glibcxx_cv_prog_CXX]) ++m4_rename([_AC_ARG_VAR_PRECIOUS],[glibcxx_PRECIOUS]) ++m4_define([_AC_ARG_VAR_PRECIOUS],[]) ++save_CXXFLAGS="$CXXFLAGS" ++CXXFLAGS="$CXXFLAGS -fno-builtin" ++# --- Extra hack for Phobos --- ++# AC_PROG_CC, if not "cross-compiling", tries to run a simple C program. ++# However, a given multilib variant may not be executable on the current ++# system. Example: Building for x86_64 on IA-32. This is technically ++# cross-compiling, but we don't want cross-compiling directory layouts ++# and we still need link tests. Solution is to make autoconf think it ++# is cross compiling only when it tests the compilers. ++d_save_cross_compiling=$cross_compiling ++cross_compiling=yes ++AC_PROG_CC ++AC_PROG_CXX ++cross_compiling=$d_save_cross_compiling ++CXXFLAGS="$save_CXXFLAGS" ++#m4_rename([glibcxx_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) ++AC_SUBST(CFLAGS) ++AC_SUBST(CXXFLAGS) ++dnl -- End of copy from libstdc++-v3/acinclude.m4 ++ ++dnl These should be inherited in the recursive make, but ensure they are ++dnl defined: ++test "$AR" || AR=ar ++AC_SUBST(AR) ++if test "$RANLIB"; then : ++ AC_SUBST(RANLIB) ++else ++ AC_PROG_RANLIB ++fi ++AC_PROG_INSTALL ++AC_PROG_MAKE_SET ++dnl AC_PROG_LIBTOOL ++ ++AC_ARG_ENABLE(thread-lib, ++ AC_HELP_STRING([--enable-thread-lib=], ++ [specify linker option for the system thread library (default: autodetect)]), ++ [d_thread_lib=$enableval],[d_thread_lib=""]) ++ ++AC_ARG_ENABLE(unix, ++ AC_HELP_STRING([--enable-unix], ++ [enables Unix runtime (default: yes, for Unix targets)]), ++ :,[enable_unix=auto]) ++ ++dnl switch between gc and gcstub ++AC_ARG_ENABLE(druntime-gc, ++ AC_HELP_STRING([--enable-druntime-gc], ++ [enable D runtime garbage collector (default: yes)]), ++ :,[enable_druntime_gc=yes]) ++ ++dnl switch between system zlib and gcc's zlib ++AC_ARG_WITH(system-zlib, ++ AS_HELP_STRING([--with-system-zlib], ++ [use installed libz (default: no)]), ++ :,[system_zlib=no]) ++ ++AC_ARG_ENABLE(phobos-config-dir, ++ AC_HELP_STRING([--enable-phobos-config-dir=], ++ [use source file fragments in ]), ++[if test -z "${enableval}"; then ++ AC_MSG_ERROR([must specify a value for --enable-phobos-config-dir]) ++fi], ++:) ++ ++if test ${multilib} = yes; then ++ multilib_arg="--enable-multilib" ++else ++ multilib_arg= ++fi ++ ++d_target_os=`echo $target_os | sed 's/^\([A-Za-z_]+\)/\1/'` ++ ++GDC=$CC ++GDC=`echo $CC | sed s/xgcc/gdc/` ++ ++AC_MSG_CHECKING([If $GDC can compile D sources]) ++echo "int function(int) test;" > actest.d ++$GDC -c -x d -I "$srcdir/libdruntime" actest.d ++r=$? ++rm -f actest.[do] ++if test $r -eq 0; then ++ AC_MSG_RESULT([yes]) ++else ++ AC_MSG_RESULT([no]) ++ AC_MSG_ERROR([can't compile D sources!]) ++ dnl fix vi syntax highlight bug. ' ++fi ++ ++AC_SUBST(GDC) ++ ++AC_MSG_CHECKING([D GCC version]) ++d_gcc_ver=`$GDC -dumpversion` ++AC_MSG_RESULT($d_gcc_ver) ++ ++# Need to export this variables for multilib ++export CC_FOR_BUILD ++export CFLAGS_FOR_BUILD ++AC_SUBST(CC_FOR_BUILD) ++AC_SUBST(CFLAGS_FOR_BUILD) ++ ++# Find build libiberty which is needed by x3 ++# Should not have to go up too many directories ++ ++d_libiberty_dir=../.. ++while test "$d_count" != 'xxx'; do ++ BUILD_LIBIBERTY=$d_libiberty_dir/build-${build_alias}/libiberty/libiberty.a ++ if test -f $BUILD_LIBIBERTY; then ++ break ++ fi ++ # GCC 3.x does not use the 'build-' dir, so we have so search ++ # for plain 'libiberty' with some kind of check it is not a target dir ++ BUILD_LIBIBERTY=$d_libiberty_dir/libiberty/libiberty.a ++ if test -f $BUILD_LIBIBERTY && test -d $d_libiberty_dir/gcc; then ++ break ++ fi ++ ++ d_libiberty_dir=../$d_libiberty_dir ++ d_count="x$d_count" ++done ++ ++if test ! -f "$BUILD_LIBIBERTY"; then ++ AC_MSG_ERROR([cannot find libiberty.a for build]) ++fi ++ ++#used in druntime, so srcdir is 'libphobos/libdruntime' ++LIBIBERTY_H_PATH='$(srcdir)/../../include' ++BUILD_LIBIBERTY="../$BUILD_LIBIBERTY" ++ ++AC_SUBST(BUILD_LIBIBERTY) ++AC_SUBST(LIBIBERTY_H_PATH) ++ ++ ++dnl Eventually need to include everything from libstdc++-v3/acinclude.m4 ++dnl (# Default case for install directory for include files.) and on ++ ++# include dir .. need to support --enable-version-specific.. but ++# will have to modify gcc/configure.ac .. ++# For now, basic workaround for cross compilers .. ++# To really mirror the check in Make-lang.in we need to access the ++# host/target of the compiler. The libphobos 'host' and 'target' variables ++# are always equal (and are the same as the compilers target) ++d_count="" ++d_pkgvars_prefix=../.. ++while test "$d_count" != 'xxx'; do ++ d_pkgvars=$d_pkgvars_prefix/gcc/d/pkgvars ++ if test -f $d_pkgvars; then ++ break ++ fi ++ ++ d_pkgvars_prefix=../$d_pkgvars_prefix ++ d_count="x$d_count" ++done ++ ++if test -f "${d_pkgvars}"; then ++ gdc_host=`grep "host=" "${d_pkgvars}" | sed -e 's|host=||'` ++ gdc_target=`grep "target=" "${d_pkgvars}" | sed -e 's|target=||'` ++else ++ AC_MSG_WARN([Cannot find pkgvars file to determine compiler host/target]) ++ gdc_host=${build} ++ gdc_target=${host} ++fi ++ ++if test "${gdc_host}" != "${gdc_target}"; then ++ gdc_include_dir='${libdir}/gcc/${host_alias}'/${d_gcc_ver}/include/d ++else ++ gdc_include_dir='${prefix}'/include/d/${d_gcc_ver} ++fi ++AC_SUBST(gdc_include_dir) ++AC_ARG_WITH([cross-host], ++ AC_HELP_STRING([--with-cross-host=HOST], ++ [configuring with a cross compiler])) ++if test -n "$with_cross_host" && ++ test x"$with_cross_host" != x"no"; then ++ phobos_toolexecdir='${exec_prefix}/${host_alias}' ++ phobos_toolexeclibdir='${toolexecdir}/lib' ++else ++ phobos_toolexecdir='${libdir}/gcc/${host_alias}' ++ phobos_toolexeclibdir='${libdir}' ++fi ++# The norm would be to use $GDC -print-multi-os-directory, but ++# that would require modifying config-ml.in ++multi_os_directory=`$CC -print-multi-os-directory` ++case $multi_os_directory in ++ .) ;; # Avoid trailing /. ++ *) phobos_toolexeclibdir=$phobos_toolexeclibdir/$multi_os_directory ;; ++esac ++AC_SUBST(phobos_toolexecdir) ++AC_SUBST(phobos_toolexeclibdir) ++ ++dnl Checks for header files. ++# Sanity check for the cross-compilation case: ++AC_CHECK_HEADER(stdio.h,:, ++ [AC_MSG_ERROR([cannot find stdio.h.])]) ++ ++ ++HAVE_DLADDR=false ++AC_CHECK_FUNC(dladdr, HAVE_DLADDR=true) ++AC_SUBST(HAVE_DLADDR) ++ ++BACKTRACE_SUPPORTED=false ++BACKTRACE_USES_MALLOC=false ++BACKTRACE_SUPPORTS_THREADS=false ++LIBBACKTRACE_LIB="" ++ ++CPPFLAGS+=" -I../libbacktrace " ++ ++AC_ARG_ENABLE(libbacktrace, ++ [ --disable-libbacktrace Do not use libbacktrace for backtraces], ++ check_libbacktrace_h="$enableval", check_libbacktrace_h="yes") ++ ++if test $check_libbacktrace_h = yes ; then ++ AC_CHECK_HEADER(backtrace-supported.h, have_libbacktrace_h=true, ++ have_libbacktrace_h=false) ++else ++ have_libbacktrace_h=false ++fi ++ ++if $have_libbacktrace_h; then ++ AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTED]) ++ AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC, ++ [ ++ #include ++ #if BACKTRACE_SUPPORTED ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ], BACKTRACE_SUPPORTED=true, BACKTRACE_SUPPORTED=false) ++ AC_MSG_RESULT($BACKTRACE_SUPPORTED) ++ ++ AC_MSG_CHECKING([libbacktrace: BACKTRACE_USES_MALLOC]) ++ AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC, ++ [ ++ #include ++ #if BACKTRACE_USES_MALLOC ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ], BACKTRACE_USES_MALLOC=true, BACKTRACE_USES_MALLOC=false) ++ AC_MSG_RESULT($BACKTRACE_USES_MALLOC) ++ ++ AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTS_THREADS]) ++ AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC, ++ [ ++ #include ++ #if BACKTRACE_SUPPORTS_THREADS ++ FOUND_LIBBACKTRACE_RESULT_GDC ++ #endif ++ ], BACKTRACE_SUPPORTS_THREADS=true, BACKTRACE_SUPPORTS_THREADS=false) ++ AC_MSG_RESULT($BACKTRACE_SUPPORTS_THREADS) ++fi ++ ++AM_CONDITIONAL([BACKTRACE_SUPPORTED], [$BACKTRACE_SUPPORTED]) ++ ++if $BACKTRACE_SUPPORTED; then ++ LIBBACKTRACE_LIB="../../libbacktrace/.libs/libbacktrace.a" ++else ++ LIBBACKTRACE_LIB="" ++fi ++ ++AC_SUBST(LIBBACKTRACE_LIB) ++AC_SUBST(BACKTRACE_SUPPORTED) ++AC_SUBST(BACKTRACE_USES_MALLOC) ++AC_SUBST(BACKTRACE_SUPPORTS_THREADS) ++ ++AC_MSG_CHECKING([for thread model used by GDC]) ++d_thread_model=`$GDC -v 2>&1 | sed -n 's/^Thread model: //p'` ++AC_MSG_RESULT([$d_thread_model]) ++ ++# Map from thread model to thread interface. ++DRUNTIME_CONFIGURE_THREADS([$d_thread_model]) ++ ++dnl AC_HEADER_STDC ++# TODO... ++ ++D_EXTRA_OBJS= ++AC_SUBST(D_EXTRA_OBJS) ++DRUNTIME_OBJS= ++AC_SUBST(DRUNTIME_OBJS) ++ ++if test "$with_newlib" = no; then ++ ++AC_CHECK_LIB(m,cos) ++ ++case "$d_target_os" in ++ aix*) AC_CHECK_LIB(C,sqrtf) ;; ++esac ++ ++case "$target_os" in ++ linux*|k*bsd*-gnu) ++ case "$target_cpu" in ++ powerpc*) ++ # Libc without nldbl not supported... ++ AC_CHECK_FUNC(__nldbl_printf,d_have_nldbl_funcs=1,:) ++ if test "$d_have_nldbl_funcs" = 1; then ++ : ++ fi ++ ;; ++ esac ++esac ++ ++save_CFLAGS=$CFLAGS ++dnl Check for BSD(?) specific fields in struct tm ++dnl Maybe test fields separately ++AC_MSG_CHECKING([for tm_gmtoff]) ++AC_TRY_COMPILE([#include ],[ ++struct tm t; ++t.tm_gmtoff = t.tm_gmtoff; ++t.tm_zone = t.tm_zone;], ++ [AC_MSG_RESULT([yes]) ++ AC_DEFINE(HAVE_TM_GMTOFF_AND_ZONE,1,[Extra fields in struct tm])], ++ [AC_MSG_RESULT([no])]) ++ ++dnl The '* 42' is to ensure a type error occurs if timezone is not a ++dnl number. Simple assignment will not do this. ++AC_MSG_CHECKING([for timezone]) ++AC_TRY_COMPILE([#include ],[ ++time_t t = timezone * 42;], ++ [AC_MSG_RESULT([yes]) ++ AC_DEFINE(HAVE_TIMEZONE,1,[Global timezone variable])], ++ [AC_MSG_RESULT([no])]) ++ ++AC_MSG_CHECKING([for _timezone]) ++AC_TRY_COMPILE([#include ],[ ++time_t t = _timezone * 42;], ++ [AC_MSG_RESULT([yes]) ++ AC_DEFINE(HAVE__TIMEZONE,1,[Another global timezone variable])], ++ [AC_MSG_RESULT([no])]) ++ ++AC_CHECK_FUNCS(snprintf _snprintf,break,[AC_MSG_ERROR([No variant of snprintf.])]) ++AC_CHECK_FUNCS(vsnprintf _vsnprintf,break,[AC_MSG_ERROR([No variant of vsnprintf.])]) ++ ++# end of 'if $with_newlib...' ++fi ++ ++AC_MSG_CHECKING([for ARM unwinder]) ++AC_TRY_COMPILE([#include ],[ ++#if __ARM_EABI_UNWINDER__ ++#error Yes, it is. ++#endif ++], ++ [AC_MSG_RESULT([no]) ++ DCFG_ARM_EABI_UNWINDER="" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind/generic.o"], ++ [AC_MSG_RESULT([yes]) ++ DCFG_ARM_EABI_UNWINDER="GNU_ARM_EABI_Unwinder" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind/arm.o"]) ++AC_SUBST(DCFG_ARM_EABI_UNWINDER) ++ ++case "$d_thread_model" in ++ posix) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/posix.o" ++ ;; ++ win32) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/win32.o" ++ ;; ++ *) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/gthreads/single.o" ++ ;; ++esac ++ ++case "$d_target_os" in ++ aix*|*bsd*|cygwin*|darwin*|gnu*|linux*|skyos*|*solaris*|sysv*) d_have_unix=1 ;; ++esac ++ ++DCFG_CBRIDGE_STDIO= ++AC_SUBST(DCFG_CBRIDGE_STDIO) ++ ++if test -n "$d_have_unix" && test "$enable_unix" = auto ; then ++ enable_unix=yes ++fi ++ ++case "$d_target_os" in ++ aix*) d_is_aix=1 ++ ;; ++ darwin*) DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_OSX_OBJS)" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OSX_OBJS)" ++ ;; ++ freebsd*|k*bsd*-gnu) ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(FREEBSD_OBJS)" ++ DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" ++ ;; ++ linux*) #D_EXTRA_OBJS="$D_EXTRA_OBJS std/c/linux/linux.o" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(LINUX_OBJS)" ++ ;; ++ cygwin*) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" ++ DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" ++ ;; ++ mingw*) #DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_STDC_OBJS)" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_WINDOWS_OBJS)" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(WINDOWS_OBJS)" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OS_OBJS)" ++ #DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" ++ DCFG_UNIX=Windows ++ ;; ++ *) if test "$enable_unix" != "yes"; then ++ DCFG_UNIX=NoSystem ++ fi ++ DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" ++ DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" ++ ;; ++esac ++ ++if test "$enable_unix" = "yes"; then ++ DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_STDC_OBJS)" ++ DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_POSIX_OBJS)" ++ D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OS_OBJS)" ++ DPHOBOS_CONFIGURE_UNIX ++fi ++dnl can these be moved to acinclude.m4? ++AC_SUBST(DCFG_MMAP) ++AC_SUBST(DCFG_GETPWNAM_R) ++AC_SUBST(DCFG_UNIX) ++AC_SUBST(DCFG_POSIX) ++ ++if test -z "$DFLAGS"; then ++ DFLAGS="-Wall -g -frelease -O2" ++fi ++AC_SUBST(DFLAGS) ++ ++if test -z "$DFLAGSX"; then ++ DFLAGSX="-Wall -g -fno-release -funittest" ++fi ++AC_SUBST(DFLAGSX) ++ ++dnl TODO: change this to using pthreads? if so, define usepthreads ++dnl and configure semaphore ++ ++ ++# phobose_use_pthreads was here... ++ ++d_subdirs=`( cd $srcdir && find . -type d ) | sed -e 's/^.\///'` ++d_subdirs="$d_subdirs gcc" ++for i in $d_subdirs; do ++ mkdir -p $i; ++done ++ ++AC_SUBST(srcdir) ++ ++ ++# Garbage collection configuration ++ ++D_GC_MODULES= ++ ++if test "$enable_druntime_gc" = "yes"; then ++ D_GC_MODULES="gc/bits.o gc/gc.o gc/os.o gc/proxy.o gc/stats.o" ++else ++ D_GC_MODULES="gcstub/gc.o" ++fi ++ ++AC_SUBST(D_GC_MODULES) ++ ++ ++ZLIB_OBJS= ++if test "$system_zlib" = yes; then ++ AC_CHECK_LIB(z, deflate, ZLIB_OBJS=, ZLIB_OBJS="\$(Z_OBJS)") ++else ++ ZLIB_OBJS="\$(Z_OBJS)" ++fi ++AC_SUBST(ZLIB_OBJS) ++ ++# Copied from libstdc++-v3/configure.ac ++# Multilibs need MULTISUBDIR defined correctly in certain makefiles so ++# that multilib installs will end up installed in the correct place. ++# The testsuite needs it for multilib-aware ABI baseline files. ++# To work around this not being passed down from config-ml.in -> ++# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually ++# append it here. Only modify Makefiles that have just been created. ++# ++# Also, get rid of this simulated-VPATH thing that automake does. ++AC_CONFIG_FILES(AC_FOREACH([DIR], src libdruntime, [DIR/Makefile ]), ++ [cat > vpsed$$ << \_EOF ++s!`test -f '$<' || echo '$(srcdir)/'`!! ++_EOF ++ sed -f vpsed$$ $ac_file > tmp$$ ++ mv tmp$$ $ac_file ++ rm vpsed$$ ++ echo 'MULTISUBDIR =' >> $ac_file ++ ml_norecursion=yes ++ . ${multi_basedir}/config-ml.in ++ AS_UNSET([ml_norecursion]) ++]) ++ ++#TODO: Should be possible to get rid of libdruntime/phobos-ver-syms ++AC_OUTPUT([Makefile src/phobos-ver-syms libdruntime/phobos-ver-syms libdruntime/gcc/libbacktrace.d]) +--- a/src/libphobos/configure.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/configure.in 1970-01-01 01:00:00.000000000 +0100 +@@ -1,469 +0,0 @@ +-# GDC -- D front-end for GCC +-# Copyright (C) 2004 David Friedman +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +- +-dnl Parts taken from libobjc configure.in +- +-AC_PREREQ(2.64) +-AC_INIT(libphobos, version-unused) +-AC_CONFIG_SRCDIR(std/algorithm.d) +-AC_CONFIG_SRCDIR(libdruntime/gcc/builtins.d) +-AC_CONFIG_SRCDIR(libdruntime/gcc/attribute.d) +-AC_CONFIG_HEADERS(config.h) +- +-AC_CANONICAL_SYSTEM +-target_alias=${target_alias-$target} +-AC_SUBST(target_alias) +- +-AM_INIT_AUTOMAKE([1.9.3 foreign no-dependencies]) +-AH_TEMPLATE(PACKAGE, [Name of package]) +-AH_TEMPLATE(VERSION, [Version number of package]) +- +-AM_ENABLE_MULTILIB(, ..) +- +-# libphobos is usually a symlink to gcc/d/phobos, so libphobos/.. +-# is not the toplevel GCC directory. gcc/d may also be a symlink. +-# Find the correct top-level directory by removing "/libphobos" +-# from $srcdir. +-dnl NOTE: This assumes that AM_ENABLE_MULTILIB uses $multi_basedir +-if test ! -r "$multi_basedir/config-ml.in"; then +- better_dir=`echo "$srcdir" | sed -e 's|/libphobos||'` +- if test -r "$better_dir/config-ml.in"; then +- multi_basedir=$better_dir +- fi +-fi +- +-if test "$build" != "$host"; then +- # We are being configured with some form of cross compiler. +- #GLIBCXX_IS_NATIVE=false +- GCC_NO_EXECUTABLES +- d_cross_comp=yes +-else +- d_cross_comp= +-fi +- +-dnl Copied from libstdc++-v3/acinclude.m4. Indeed, multilib will not work +-dnl correctly without this. +-# We're almost certainly being configured before anything else which uses +-# C++, so all of our AC_PROG_* discoveries will be cached. It's vital that +-# we not cache the value of CXX that we "discover" here, because it's set +-# to something unique for us and libjava. Other target libraries need to +-# find CXX for themselves. We yank the rug out from under the normal AC_* +-# process by sneakily renaming the cache variable. This also lets us debug +-# the value of "our" CXX in postmortems. +-# +-# We must also force CXX to /not/ be a precious variable, otherwise the +-# wrong (non-multilib-adjusted) value will be used in multilibs. This +-# little trick also affects CPPFLAGS, CXXFLAGS, and LDFLAGS. And as a side +-# effect, CXXFLAGS is no longer automagically subst'd, so we have to do +-# that ourselves. Un-preciousing AC_PROG_CC also affects CC and CFLAGS. +-# +-# -fno-builtin must be present here so that a non-conflicting form of +-# std::exit can be guessed by AC_PROG_CXX, and used in later tests. +- +-m4_define([ac_cv_prog_CXX],[glibcxx_cv_prog_CXX]) +-m4_rename([_AC_ARG_VAR_PRECIOUS],[glibcxx_PRECIOUS]) +-m4_define([_AC_ARG_VAR_PRECIOUS],[]) +-save_CXXFLAGS="$CXXFLAGS" +-CXXFLAGS="$CXXFLAGS -fno-builtin" +-# --- Extra hack for Phobos --- +-# AC_PROG_CC, if not "cross-compiling", tries to run a simple C program. +-# However, a given multilib variant may not be executable on the current +-# system. Example: Building for x86_64 on IA-32. This is technically +-# cross-compiling, but we don't want cross-compiling directory layouts +-# and we still need link tests. Solution is to make autoconf think it +-# is cross compiling only when it tests the compilers. +-d_save_cross_compiling=$cross_compiling +-cross_compiling=yes +-AC_PROG_CC +-AC_PROG_CXX +-cross_compiling=$d_save_cross_compiling +-CXXFLAGS="$save_CXXFLAGS" +-#m4_rename([glibcxx_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) +-AC_SUBST(CFLAGS) +-AC_SUBST(CXXFLAGS) +-dnl -- End of copy from libstdc++-v3/acinclude.m4 +- +-dnl These should be inherited in the recursive make, but ensure they are +-dnl defined: +-test "$AR" || AR=ar +-AC_SUBST(AR) +-if test "$RANLIB"; then : +- AC_SUBST(RANLIB) +-else +- AC_PROG_RANLIB +-fi +-AC_PROG_INSTALL +-AC_PROG_MAKE_SET +-dnl AC_PROG_LIBTOOL +- +-AC_ARG_ENABLE(thread-lib, +- AC_HELP_STRING([--enable-thread-lib=], +- [specify linker option for the system thread library (default: autodetect)]), +- [d_thread_lib=$enableval],[d_thread_lib=""]) +- +-AC_ARG_ENABLE(unix, +- AC_HELP_STRING([--enable-unix], +- [enables Unix runtime (default: yes, for Unix targets)]), +- :,[enable_unix=auto]) +- +-dnl switch between gc and gcstub +-AC_ARG_ENABLE(druntime-gc, +- AC_HELP_STRING([--enable-druntime-gc], +- [enable D runtime garbage collector (default: yes)]), +- :,[enable_druntime_gc=yes]) +- +-dnl switch between system zlib and gcc's zlib +-AC_ARG_WITH(system-zlib, +- AS_HELP_STRING([--with-system-zlib], +- [use installed libz (default: no)]), +- :,[system_zlib=no]) +- +-AC_ARG_ENABLE(phobos-config-dir, +- AC_HELP_STRING([--enable-phobos-config-dir=], +- [use source file fragments in ]), +-[if test -z "${enableval}"; then +- AC_MSG_ERROR([must specify a value for --enable-phobos-config-dir]) +-fi], +-:) +- +-if test ${multilib} = yes; then +- multilib_arg="--enable-multilib" +-else +- multilib_arg= +-fi +- +-d_target_os=`echo $target_os | sed 's/^\([A-Za-z_]+\)/\1/'` +- +-# SkyOS uses i386-skyos-pe +-case "$target" in +-*-skyos*-pe*) d_target_os=skyos ;; +-esac +- +-GDC=$CC +-GDC=`echo $CC | sed s/xgcc/gdc/` +- +-AC_MSG_CHECKING([If $GDC can compile D sources]) +-echo "int function(int) test;" > actest.d +-$GDC -c -x d -I "$srcdir/libdruntime" actest.d +-r=$? +-rm -f actest.[do] +-if test $r -eq 0; then +- AC_MSG_RESULT([yes]) +-else +- AC_MSG_RESULT([no]) +- AC_MSG_ERROR([can't compile D sources!]) +- dnl fix vi syntax highlight bug. ' +-fi +- +-AC_SUBST(GDC) +- +-AC_MSG_CHECKING([D GCC version]) +-d_gcc_ver=`$GDC -dumpversion` +-AC_MSG_RESULT($d_gcc_ver) +- +-# Need to export this variables for multilib +-export CC_FOR_BUILD +-export CFLAGS_FOR_BUILD +-AC_SUBST(CC_FOR_BUILD) +-AC_SUBST(CFLAGS_FOR_BUILD) +- +-# Find build libiberty which is needed by x3 +-# Should not have to go up too many directories +- +-d_libiberty_dir=../.. +-while test "$d_count" != 'xxx'; do +- BUILD_LIBIBERTY=$d_libiberty_dir/build-${build_alias}/libiberty/libiberty.a +- if test -f $BUILD_LIBIBERTY; then +- break +- fi +- # GCC 3.x does not use the 'build-' dir, so we have so search +- # for plain 'libiberty' with some kind of check it is not a target dir +- BUILD_LIBIBERTY=$d_libiberty_dir/libiberty/libiberty.a +- if test -f $BUILD_LIBIBERTY && test -d $d_libiberty_dir/gcc; then +- break +- fi +- +- d_libiberty_dir=../$d_libiberty_dir +- d_count="x$d_count" +-done +- +-if test ! -f "$BUILD_LIBIBERTY"; then +- AC_MSG_ERROR([cannot find libiberty.a for build]) +-fi +- +-#used in druntime, so srcdir is 'libphobos/libdruntime' +-LIBIBERTY_H_PATH='$(srcdir)/../../include' +-BUILD_LIBIBERTY="../$BUILD_LIBIBERTY" +- +-AC_SUBST(BUILD_LIBIBERTY) +-AC_SUBST(LIBIBERTY_H_PATH) +- +- +-dnl Eventually need to include everything from libstdc++-v3/acinclude.m4 +-dnl (# Default case for install directory for include files.) and on +- +-# include dir .. need to support --enable-version-specific.. but +-# will have to modify gcc/configure.ac .. +-# For now, basic workaround for cross compilers .. +-if test "${host}" != "${build}"; then +- gdc_include_dir='${libdir}/gcc/${host_alias}'/${d_gcc_ver}/include/d +-else +- gdc_include_dir='${prefix}'/include/d/${d_gcc_ver} +-fi +-AC_SUBST(gdc_include_dir) +-AC_ARG_WITH([cross-host], +- AC_HELP_STRING([--with-cross-host=HOST], +- [configuring with a cross compiler])) +-if test -n "$with_cross_host" && +- test x"$with_cross_host" != x"no"; then +- phobos_toolexecdir='${exec_prefix}/${host_alias}' +- phobos_toolexeclibdir='${toolexecdir}/lib' +-else +- phobos_toolexecdir='${libdir}/gcc/${host_alias}' +- phobos_toolexeclibdir='${libdir}' +-fi +-# The norm would be to use $GDC -print-multi-os-directory, but +-# that would require modifying config-ml.in +-multi_os_directory=`$CC -print-multi-os-directory` +-case $multi_os_directory in +- .) ;; # Avoid trailing /. +- *) phobos_toolexeclibdir=$phobos_toolexeclibdir/$multi_os_directory ;; +-esac +-AC_SUBST(phobos_toolexecdir) +-AC_SUBST(phobos_toolexeclibdir) +- +-dnl Checks for header files. +-# Sanity check for the cross-compilation case: +-AC_CHECK_HEADER(stdio.h,:, +- [AC_MSG_ERROR([cannot find stdio.h.])]) +- +-dnl AC_HEADER_STDC +-# TODO... +- +-D_EXTRA_OBJS= +-AC_SUBST(D_EXTRA_OBJS) +-DRUNTIME_OBJS= +-AC_SUBST(DRUNTIME_OBJS) +- +-if test "$with_newlib" = no; then +- +-AC_CHECK_LIB(m,cos) +- +-case "$d_target_os" in +- aix*) AC_CHECK_LIB(C,sqrtf) ;; +-esac +- +-case "$target_os" in +- linux*|k*bsd*-gnu) +- case "$target_cpu" in +- powerpc*) +- # Libc without nldbl not supported... +- AC_CHECK_FUNC(__nldbl_printf,d_have_nldbl_funcs=1,:) +- if test "$d_have_nldbl_funcs" = 1; then +- : +- fi +- ;; +- esac +-esac +- +-save_CFLAGS=$CFLAGS +-dnl Check for BSD(?) specific fields in struct tm +-dnl Maybe test fields separately +-AC_MSG_CHECKING([for tm_gmtoff]) +-AC_TRY_COMPILE([#include ],[ +-struct tm t; +-t.tm_gmtoff = t.tm_gmtoff; +-t.tm_zone = t.tm_zone;], +- [AC_MSG_RESULT([yes]) +- AC_DEFINE(HAVE_TM_GMTOFF_AND_ZONE,1,[Extra fields in struct tm])], +- [AC_MSG_RESULT([no])]) +- +-dnl The '* 42' is to ensure a type error occurs if timezone is not a +-dnl number. Simple assignment will not do this. +-AC_MSG_CHECKING([for timezone]) +-AC_TRY_COMPILE([#include ],[ +-time_t t = timezone * 42;], +- [AC_MSG_RESULT([yes]) +- AC_DEFINE(HAVE_TIMEZONE,1,[Global timezone variable])], +- [AC_MSG_RESULT([no])]) +- +-AC_MSG_CHECKING([for _timezone]) +-AC_TRY_COMPILE([#include ],[ +-time_t t = _timezone * 42;], +- [AC_MSG_RESULT([yes]) +- AC_DEFINE(HAVE__TIMEZONE,1,[Another global timezone variable])], +- [AC_MSG_RESULT([no])]) +- +-AC_CHECK_FUNCS(snprintf _snprintf,break,[AC_MSG_ERROR([No variant of snprintf.])]) +-AC_CHECK_FUNCS(vsnprintf _vsnprintf,break,[AC_MSG_ERROR([No variant of vsnprintf.])]) +- +-# end of 'if $with_newlib...' +-fi +- +-AC_MSG_CHECKING([for ARM unwinder]) +-AC_TRY_COMPILE([#include ],[ +-#if __ARM_EABI_UNWINDER__ +-#error Yes, it is. +-#endif +-], +- [AC_MSG_RESULT([no]) +- DCFG_ARM_EABI_UNWINDER="" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind_generic.o"], +- [AC_MSG_RESULT([yes]) +- DCFG_ARM_EABI_UNWINDER="GNU_ARM_EABI_Unwinder" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/unwind_arm.o"]) +-AC_SUBST(DCFG_ARM_EABI_UNWINDER) +- +-case "$d_target_os" in +- aix*|*bsd*|cygwin*|darwin*|gnu*|linux*|skyos*|*solaris*|sysv*) d_have_unix=1 ;; +-esac +- +-DCFG_CBRIDGE_STDIO= +-AC_SUBST(DCFG_CBRIDGE_STDIO) +- +-if test -n "$d_have_unix" && test "$enable_unix" = auto ; then +- enable_unix=yes +-fi +- +-case "$d_target_os" in +- aix*) d_is_aix=1 +- ;; +- darwin*) d_module_mach=1 +- d_sem_impl="mach" +- ;; +- freebsd*|k*bsd*-gnu) +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(FREEBSD_OBJS)" +- DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- ;; +- linux*) #D_EXTRA_OBJS="$D_EXTRA_OBJS std/c/linux/linux.o" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(LINUX_OBJS)" +- d_sem_impl="posix" +- ;; +- cygwin*) DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- ;; +- mingw*) #DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_STDC_OBJS)" +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_WINDOWS_OBJS)" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(WINDOWS_OBJS)" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OS_OBJS)" +- #DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- DCFG_UNIX=Windows +- ;; +- skyos*) d_sem_impl="skyos" +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- ;; +- *) if test "$enable_unix" != "yes"; then +- DCFG_UNIX=NoSystem +- fi +- DRUNTIME_OBJS="$DRUNTIME_OBJS gcc/cbridge_stdio.o" +- DCFG_CBRIDGE_STDIO="GNU_CBridge_Stdio" +- ;; +-esac +- +-if test -n "$d_module_mach"; then +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_OSX_OBJS)" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OSX_OBJS)" +-fi +- +-if test "$enable_unix" = "yes"; then +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_STDC_OBJS)" +- DRUNTIME_OBJS="$DRUNTIME_OBJS \$(RT_POSIX_OBJS)" +- D_EXTRA_OBJS="$D_EXTRA_OBJS \$(OS_OBJS)" +- DPHOBOS_CONFIGURE_UNIX +-fi +-dnl can these be moved to acinclude.m4? +-AC_SUBST(DCFG_SEMAPHORE_IMPL) +-AC_SUBST(DCFG_MMAP) +-AC_SUBST(DCFG_GETPWNAM_R) +- +- +-AC_SUBST(DCFG_UNIX) +-AC_SUBST(DCFG_POSIX) +- +-if test -z "$DFLAGS"; then +- DFLAGS="-Wall -g -frelease -O2" +-fi +-AC_SUBST(DFLAGS) +- +-if test -z "$DFLAGSX"; then +- DFLAGSX="-Wall -g -fno-release -funittest" +-fi +-AC_SUBST(DFLAGSX) +- +-dnl TODO: change this to using pthreads? if so, define usepthreads +-dnl and configure semaphore +- +- +-# phobose_use_pthreads was here... +- +-d_subdirs=`( cd $srcdir && find . -type d ) | sed -e 's/^.\///'` +-d_subdirs="$d_subdirs gcc" +-for i in $d_subdirs; do +- mkdir -p $i; +-done +- +-AC_SUBST(srcdir) +- +- +-# Garbage collection configuration +- +-D_GC_MODULES= +- +-if test "$enable_druntime_gc" = "yes"; then +- D_GC_MODULES="gc/gc.o gc/gcalloc.o gc/gcbits.o gc/gcstats.o gc/gcx.o" +-else +- D_GC_MODULES="gcstub/gc.o" +-fi +- +-AC_SUBST(D_GC_MODULES) +- +- +-ZLIB_OBJS= +-if test "$system_zlib" = yes; then +- AC_CHECK_LIB(z, deflate, ZLIB_OBJS=, ZLIB_OBJS="\$(Z_OBJS)") +-else +- ZLIB_OBJS="\$(Z_OBJS)" +-fi +-AC_SUBST(ZLIB_OBJS) +- +-# Copied from libstdc++-v3/configure.ac +-# Multilibs need MULTISUBDIR defined correctly in certain makefiles so +-# that multilib installs will end up installed in the correct place. +-# The testsuite needs it for multilib-aware ABI baseline files. +-# To work around this not being passed down from config-ml.in -> +-# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually +-# append it here. Only modify Makefiles that have just been created. +-# +-# Also, get rid of this simulated-VPATH thing that automake does. +-AC_CONFIG_FILES(AC_FOREACH([DIR], src libdruntime, [DIR/Makefile ]), +- [cat > vpsed$$ << \_EOF +-s!`test -f '$<' || echo '$(srcdir)/'`!! +-_EOF +- sed -f vpsed$$ $ac_file > tmp$$ +- mv tmp$$ $ac_file +- rm vpsed$$ +- echo 'MULTISUBDIR =' >> $ac_file +- ml_norecursion=yes +- . ${multi_basedir}/config-ml.in +- AS_UNSET([ml_norecursion]) +-]) +- +-#TODO: Should be possible to get rid of libdruntime/phobos-ver-syms +-AC_OUTPUT([Makefile src/phobos-ver-syms libdruntime/phobos-ver-syms]) +--- a/src/libphobos/libdruntime/core/atomic.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/atomic.d 2014-04-01 16:32:51.000000000 +0100 +@@ -21,13 +21,13 @@ version( D_InlineAsm_X86 ) + version = AsmX86_32; + enum has64BitCAS = true; + } +-version( D_InlineAsm_X86_64 ) ++else version( D_InlineAsm_X86_64 ) + { + version = AsmX86; + version = AsmX86_64; + enum has64BitCAS = true; + } +-version( GNU ) ++else + { + enum has64BitCAS = false; + } +--- a/src/libphobos/libdruntime/core/bitop.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/bitop.d 2014-04-01 16:32:51.000000000 +0100 +@@ -76,9 +76,7 @@ unittest + * (No longer an intrisic - the compiler recognizes the patterns + * in the body.) + */ +-@system +-{ +-int bt(in size_t* p, size_t bitnum) pure ++int bt(in size_t* p, size_t bitnum) pure @system + { + static if (size_t.sizeof == 8) + return ((p[bitnum >> 6] & (1L << (bitnum & 63)))) != 0; +@@ -87,38 +85,36 @@ int bt(in size_t* p, size_t bitnum) pure + else + static assert(0); + } +- +-unittest ++/// ++@system pure unittest + { + size_t array[2]; + + array[0] = 2; + array[1] = 0x100; + +- + assert(bt(array.ptr, 1)); + assert(array[0] == 2); + assert(array[1] == 0x100); + } +-} + + /** + * Tests and complements the bit. + */ +-int btc(size_t* p, size_t bitnum) pure; ++int btc(size_t* p, size_t bitnum) pure @system; + + + /** + * Tests and resets (sets to 0) the bit. + */ +-int btr(size_t* p, size_t bitnum) pure; ++int btr(size_t* p, size_t bitnum) pure @system; + + + /** + * Tests and sets the bit. + * Params: + * p = a non-NULL pointer to an array of size_ts. +- * index = a bit number, starting with bit 0 of p[0], ++ * bitnum = a bit number, starting with bit 0 of p[0], + * and progressing. It addresses bits like the expression: + --- + p[index / (size_t.sizeof*8)] & (1 << (index & ((size_t.sizeof*8) - 1))) +@@ -126,46 +122,11 @@ p[index / (size_t.sizeof*8)] & (1 << (in + * Returns: + * A non-zero value if the bit was set, and a zero + * if it was clear. +- * +- * Example: +- * --- +-import std.stdio; +-import core.bitop; +- +-int main() +-{ +- size_t array[2]; +- +- array[0] = 2; +- array[1] = 0x100; +- +- assert(btc(array, 35) == 0); +- assert(array[0] == 2); +- assert(array[1] == 0x108); +- +- assert(btc(array, 35)); +- assert(array[0] == 2); +- assert(array[1] == 0x100); +- +- assert(bts(array, 35) == 0); +- assert(array[0] == 2); +- assert(array[1] == 0x108); +- +- assert(btr(array, 35)); +- assert(array[0] == 2); +- assert(array[1] == 0x100); +- +- assert(bt(array, 1)); +- assert(array[0] == 2); +- assert(array[1] == 0x100); +- +- return 0; +-} +- * --- + */ +-int bts(size_t* p, size_t bitnum) pure; ++int bts(size_t* p, size_t bitnum) pure @system; + +-unittest ++/// ++@system pure unittest + { + size_t array[2]; + +--- a/src/libphobos/libdruntime/core/cpuid.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/cpuid.d 2014-04-01 16:32:51.000000000 +0100 +@@ -175,6 +175,10 @@ public: + bool hle() {return (extfeatures & HLE_BIT) != 0;} + /// Is RTM (restricted transactional memory) supported + bool rtm() {return (extfeatures & RTM_BIT) != 0;} ++ /// Is rdseed supported ++ bool hasRdseed() {return (extfeatures&RDSEED_BIT)!=0;} ++ /// Is SHA supported ++ bool hasSha() {return (extfeatures&SHA_BIT)!=0;} + /// Is AMD 3DNOW supported? + bool amd3dnow() {return (amdfeatures&AMD_3DNOW_BIT)!=0;} + /// Is AMD 3DNOW Ext supported? +@@ -322,15 +326,17 @@ private: + // Feature flags for cpuid.{EAX = 7, ECX = 0}.EBX. + enum : uint + { +- FSGSBASE_BIT = 1 << 1, +- BMI1_BIT = 1 << 4, +- HLE_BIT = 1 << 5, +- AVX2_BIT = 1 << 6, +- SMEP_BIT = 1 << 8, +- BMI2_BIT = 1 << 9, +- ERMS_BIT = 1 << 10, +- INVPCID_BIT = 1 << 11, +- RTM_BIT = 1 << 12, ++ FSGSBASE_BIT = 1 << 0, ++ BMI1_BIT = 1 << 3, ++ HLE_BIT = 1 << 4, ++ AVX2_BIT = 1 << 5, ++ SMEP_BIT = 1 << 7, ++ BMI2_BIT = 1 << 8, ++ ERMS_BIT = 1 << 9, ++ INVPCID_BIT = 1 << 10, ++ RTM_BIT = 1 << 11, ++ RDSEED_BIT = 1 << 18, ++ SHA_BIT = 1 << 29, + } + // feature flags XFEATURES_ENABLED_MASK + enum : ulong +@@ -541,7 +547,7 @@ void getAMDcacheinfo() + mov d6, EDX; // L3 cache info + } + +- immutable ubyte [] assocmap = [ 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, 0xFF ]; ++ static immutable ubyte [] assocmap = [ 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, 0xFF ]; + datacache[1].size = (c6>>16) & 0xFFFF; + datacache[1].associativity = assocmap[(c6>>12)&0xF]; + datacache[1].lineSize = c6 & 0xFF; +--- a/src/libphobos/libdruntime/core/demangle.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/demangle.d 2014-04-01 16:32:51.000000000 +0100 +@@ -71,7 +71,7 @@ private struct Demangle + + static class ParseException : Exception + { +- this( string msg ) ++ @safe pure nothrow this( string msg ) + { + super( msg ); + } +@@ -80,7 +80,7 @@ private struct Demangle + + static class OverflowException : Exception + { +- this( string msg ) ++ @safe pure nothrow this( string msg ) + { + super( msg ); + } +@@ -113,7 +113,8 @@ private struct Demangle + static bool isAlpha( char val ) + { + return ('a' <= val && 'z' >= val) || +- ('A' <= val && 'Z' >= val); ++ ('A' <= val && 'Z' >= val) || ++ (0x80 & val); // treat all unicode as alphabetic + } + + +@@ -856,13 +857,8 @@ private struct Demangle + Y // variadic T t...) style + Z // not variadic + */ +- enum IsDelegate { no, yes } +- char[] parseTypeFunction( char[] name = null, IsDelegate isdg = IsDelegate.no ) ++ void parseCallConvention() + { +- debug(trace) printf( "parseTypeFunction+\n" ); +- debug(trace) scope(success) printf( "parseTypeFunction-\n" ); +- auto beg = len; +- + // CallConvention + switch( tok() ) + { +@@ -888,7 +884,10 @@ private struct Demangle + default: + error(); + } ++ } + ++ void parseFuncAttr() ++ { + // FuncAttrs + breakFuncAttrs: + while( 'N' == tok() ) +@@ -931,32 +930,10 @@ private struct Demangle + error(); + } + } ++ } + +- beg = len; +- put( "(" ); +- scope(success) +- { +- put( ")" ); +- auto t = len; +- parseType(); +- put( " " ); +- if( name.length ) +- { +- if( !contains( dst[0 .. len], name ) ) +- put( name ); +- else if( shift( name ).ptr != name.ptr ) +- { +- beg -= name.length; +- t -= name.length; +- } +- } +- else if( IsDelegate.yes == isdg ) +- put( "delegate" ); +- else +- put( "function" ); +- shift( dst[beg .. t] ); +- } +- ++ void parseFuncArguments() ++ { + // Arguments + for( size_t n = 0; true; n++ ) + { +@@ -966,14 +943,14 @@ private struct Demangle + case 'X': // ArgClose (variadic T t...) style) + next(); + put( "..." ); +- return dst[beg .. len]; ++ return; + case 'Y': // ArgClose (variadic T t,...) style) + next(); + put( ", ..." ); +- return dst[beg .. len]; ++ return; + case 'Z': // ArgClose (not variadic) + next(); +- return dst[beg .. len]; ++ return; + default: + break; + } +@@ -1009,6 +986,55 @@ private struct Demangle + } + } + ++ enum IsDelegate { no, yes } ++ // returns the argument list with the left parenthesis, but not the right ++ char[] parseTypeFunction( char[] name = null, IsDelegate isdg = IsDelegate.no ) ++ { ++ debug(trace) printf( "parseTypeFunction+\n" ); ++ debug(trace) scope(success) printf( "parseTypeFunction-\n" ); ++ auto beg = len; ++ ++ parseCallConvention(); ++ parseFuncAttr(); ++ ++ beg = len; ++ put( "(" ); ++ scope(success) ++ { ++ put( ")" ); ++ auto t = len; ++ parseType(); ++ put( " " ); ++ if( name.length ) ++ { ++ if( !contains( dst[0 .. len], name ) ) ++ put( name ); ++ else if( shift( name ).ptr != name.ptr ) ++ { ++ beg -= name.length; ++ t -= name.length; ++ } ++ } ++ else if( IsDelegate.yes == isdg ) ++ put( "delegate" ); ++ else ++ put( "function" ); ++ shift( dst[beg .. t] ); ++ } ++ parseFuncArguments(); ++ return dst[beg..len]; ++ } ++ ++ static bool isCallConvention( char ch ) ++ { ++ switch( ch ) ++ { ++ case 'F', 'U', 'V', 'W', 'R': ++ return true; ++ default: ++ return false; ++ } ++ } + + /* + Value: +@@ -1211,7 +1237,8 @@ private struct Demangle + if( num >= 0x20 && num < 0x7F ) + { + put( "'" ); +- put( __ctfe ? [cast(char)num] : (cast(char*) &num)[0 .. 1] ); ++ char[1] tmp = cast(char)num; ++ put( tmp[] ); + put( "'" ); + return; + } +@@ -1397,6 +1424,36 @@ private struct Demangle + if( n++ ) + put( "." ); + parseSymbolName(); ++ ++ if( isCallConvention( tok() ) ) ++ { ++ // try to demangle a function, in case we are pointing to some function local ++ auto prevpos = pos; ++ auto prevlen = len; ++ ++ // we don't want calling convention and attributes in the qualified name ++ parseCallConvention(); ++ parseFuncAttr(); ++ len = prevlen; ++ ++ put( "(" ); ++ parseFuncArguments(); ++ put( ")" ); ++ if( !isDigit( tok() ) ) // voldemort types don't have a return type on the function ++ { ++ auto funclen = len; ++ parseType(); ++ ++ if( !isDigit( tok() ) ) ++ { ++ // not part of a qualified name, so back up ++ pos = prevpos; ++ len = prevlen; ++ } ++ else ++ len = funclen; // remove return type from qualified name ++ } ++ } + } while( isDigit( tok() ) ); + return dst[beg .. len]; + } +@@ -1430,14 +1487,14 @@ private struct Demangle + } + + +- char[] opCall() ++ char[] doDemangle(alias FUNC)() + { + while( true ) + { + try + { + debug(info) printf( "demangle(%.*s)\n", cast(int) buf.length, buf.ptr ); +- parseMangledName(); ++ FUNC(); + return dst[0 .. len]; + } + catch( OverflowException e ) +@@ -1465,6 +1522,16 @@ private struct Demangle + } + } + } ++ ++ char[] demangleName() ++ { ++ return doDemangle!parseMangledName(); ++ } ++ ++ char[] demangleType() ++ { ++ return doDemangle!parseType(); ++ } + } + + +@@ -1484,7 +1551,214 @@ char[] demangle( const(char)[] buf, char + { + //return Demangle(buf, dst)(); + auto d = Demangle(buf, dst); +- return d(); ++ return d.demangleName(); ++} ++ ++ ++/** ++ * Demangles a D mangled type. ++ * ++ * Params: ++ * buf = The string to demangle. ++ * dst = An optional destination buffer. ++ * ++ * Returns: ++ * The demangled type name or the original string if the name is not a ++ * mangled D type. ++*/ ++char[] demangleType( const(char)[] buf, char[] dst = null ) ++{ ++ auto d = Demangle(buf, dst); ++ return d.demangleType(); ++} ++ ++ ++/** ++ * Mangles a D symbol. ++ * ++ * Params: ++ * T = The type of the symbol. ++ * fqn = The fully qualified name of the symbol. ++ * dst = An optional destination buffer. ++ * ++ * Returns: ++ * The mangled name for a symbols of type T and the given fully ++ * qualified name. ++ */ ++char[] mangle(T)(const(char)[] fqn, char[] dst = null) @safe pure nothrow ++{ ++ static size_t numToString(char[] dst, size_t val) @safe pure nothrow ++ { ++ char[20] buf = void; ++ size_t i = buf.length; ++ do ++ { ++ buf[--i] = cast(char)(val % 10 + '0'); ++ } while (val /= 10); ++ immutable len = buf.length - i; ++ if (dst.length >= len) ++ dst[0 .. len] = buf[i .. $]; ++ return len; ++ } ++ ++ static struct DotSplitter ++ { ++ @safe pure nothrow: ++ const(char)[] s; ++ ++ @property bool empty() const { return !s.length; } ++ ++ @property const(char)[] front() const ++ { ++ immutable i = indexOfDot(); ++ return i == -1 ? s[0 .. $] : s[0 .. i]; ++ } ++ ++ void popFront() ++ { ++ immutable i = indexOfDot(); ++ s = i == -1 ? s[$ .. $] : s[i+1 .. $]; ++ } ++ ++ private ptrdiff_t indexOfDot() const ++ { ++ foreach (i, c; s) if (c == '.') return i; ++ return -1; ++ } ++ } ++ ++ size_t len = "_D".length; ++ foreach (comp; DotSplitter(fqn)) ++ len += numToString(null, comp.length) + comp.length; ++ len += T.mangleof.length; ++ if (dst.length < len) dst.length = len; ++ ++ size_t i = "_D".length; ++ dst[0 .. i] = "_D"; ++ foreach (comp; DotSplitter(fqn)) ++ { ++ i += numToString(dst[i .. $], comp.length); ++ dst[i .. i + comp.length] = comp[]; ++ i += comp.length; ++ } ++ dst[i .. i + T.mangleof.length] = T.mangleof[]; ++ i += T.mangleof.length; ++ return dst[0 .. i]; ++} ++ ++ ++/// ++unittest ++{ ++ assert(mangle!int("a.b") == "_D1a1bi"); ++ assert(mangle!(char[])("test.foo") == "_D4test3fooAa"); ++ assert(mangle!(int function(int))("a.b") == "_D1a1bPFiZi"); ++} ++ ++unittest ++{ ++ static assert(mangle!int("a.b") == "_D1a1bi"); ++ ++ auto buf = new char[](10); ++ buf = mangle!int("a.b", buf); ++ assert(buf == "_D1a1bi"); ++ buf = mangle!(char[])("test.foo", buf); ++ assert(buf == "_D4test3fooAa"); ++ buf = mangle!(real delegate(int))("modµ.dg"); ++ assert(buf == "_D5modµ2dgDFiZe", buf); ++} ++ ++ ++/** ++ * Mangles a D function. ++ * ++ * Params: ++ * T = function pointer type. ++ * fqn = The fully qualified name of the symbol. ++ * dst = An optional destination buffer. ++ * ++ * Returns: ++ * The mangled name for a function with function pointer type T and ++ * the given fully qualified name. ++ */ ++char[] mangleFunc(T:FT*, FT)(const(char)[] fqn, char[] dst = null) @safe pure nothrow if (is(FT == function)) ++{ ++ static if (isExternD!FT) ++ { ++ return mangle!FT(fqn, dst); ++ } ++ else static if (hasPlainMangling!FT) ++ { ++ dst.length = fqn.length; ++ dst[] = fqn[]; ++ return dst; ++ } ++ else static if (isExternCPP!FT) ++ { ++ static assert(0, "Can't mangle extern(C++) functions."); ++ } ++ else ++ { ++ static assert(0, "Can't mangle function with unknown linkage ("~FT.stringof~")."); ++ } ++} ++ ++ ++/// ++unittest ++{ ++ assert(mangleFunc!(int function(int))("a.b") == "_D1a1bFiZi"); ++ assert(mangleFunc!(int function(Object))("object.Object.opEquals") == "_D6object6Object8opEqualsFC6ObjectZi"); ++} ++ ++unittest ++{ ++ int function(lazy int[], ...) fp; ++ assert(mangle!(typeof(fp))("demangle.test") == "_D8demangle4testPFLAiYi"); ++ assert(mangle!(typeof(*fp))("demangle.test") == "_D8demangle4testFLAiYi"); ++} ++ ++private template isExternD(FT) if (is(FT == function)) ++{ ++ enum isExternD = FT.mangleof[0] == 'F'; ++} ++ ++private template isExternCPP(FT) if (is(FT == function)) ++{ ++ enum isExternCPP = FT.mangleof[0] == 'R'; ++} ++ ++private template hasPlainMangling(FT) if (is(FT == function)) ++{ ++ enum c = FT.mangleof[0]; ++ // C || Pascal || Windows ++ enum hasPlainMangling = c == 'U' || c == 'V' || c == 'W'; ++} ++ ++unittest ++{ ++ static extern(D) void fooD(); ++ static extern(C) void fooC(); ++ static extern(Pascal) void fooP(); ++ static extern(Windows) void fooW(); ++ static extern(C++) void fooCPP(); ++ ++ bool check(FT)(bool isD, bool isCPP, bool isPlain) ++ { ++ return isExternD!FT == isD && isExternCPP!FT == isCPP && ++ hasPlainMangling!FT == isPlain; ++ } ++ static assert(check!(typeof(fooD))(true, false, false)); ++ static assert(check!(typeof(fooC))(false, false, true)); ++ static assert(check!(typeof(fooP))(false, false, true)); ++ static assert(check!(typeof(fooW))(false, false, true)); ++ static assert(check!(typeof(fooCPP))(false, true, false)); ++ ++ static assert(__traits(compiles, mangleFunc!(typeof(&fooD))(""))); ++ static assert(__traits(compiles, mangleFunc!(typeof(&fooC))(""))); ++ static assert(__traits(compiles, mangleFunc!(typeof(&fooP))(""))); ++ static assert(__traits(compiles, mangleFunc!(typeof(&fooW))(""))); ++ static assert(!__traits(compiles, mangleFunc!(typeof(&fooCPP))(""))); + } + + +@@ -1510,9 +1784,9 @@ version(unittest) + ["_D6plugin8generateFiiZAya", "immutable(char)[] plugin.generate(int, int)"], + ["_D6plugin8generateFiiZAxa", "const(char)[] plugin.generate(int, int)"], + ["_D6plugin8generateFiiZAOa", "shared(char)[] plugin.generate(int, int)"], +- ["_D8demangle3fnAFZv3fnBMFZv", "void demangle.fnA().void fnB()"], +- ["_D8demangle4mainFZv1S3fnCFZv", "void demangle.main().void S.fnC()"], +- ["_D8demangle4mainFZv1S3fnDMFZv", "void demangle.main().void S.fnD()"], ++ ["_D8demangle3fnAFZv3fnBMFZv", "void demangle.fnA().fnB()"], ++ ["_D8demangle4mainFZv1S3fnCFZv", "void demangle.main().S.fnC()"], ++ ["_D8demangle4mainFZv1S3fnDMFZv", "void demangle.main().S.fnD()"], + ["_D8demangle20__T2fnVAiA4i1i2i3i4Z2fnFZv", "void demangle.fn!([1, 2, 3, 4]).fn()"], + ["_D8demangle10__T2fnVi1Z2fnFZv", "void demangle.fn!(1).fn()"], + ["_D8demangle26__T2fnVS8demangle1SS2i1i2Z2fnFZv", "void demangle.fn!(demangle.S(1, 2)).fn()"], +@@ -1521,7 +1795,12 @@ version(unittest) + ["_D8demangle13__T2fnVeeINFZ2fnFZv", "void demangle.fn!(real.infinity).fn()"], + ["_D8demangle21__T2fnVHiiA2i1i2i3i4Z2fnFZv", "void demangle.fn!([1:2, 3:4]).fn()"], + ["_D8demangle2fnFNgiZNgi", "inout(int) demangle.fn(inout(int))"], +- ["_D8demangle29__T2fnVa97Va9Va0Vu257Vw65537Z2fnFZv", "void demangle.fn!('a', '\\t', \\x00, '\\u0101', '\\U00010001').fn()"] ++ ["_D8demangle29__T2fnVa97Va9Va0Vu257Vw65537Z2fnFZv", "void demangle.fn!('a', '\\t', \\x00, '\\u0101', '\\U00010001').fn()"], ++ ["_D2gc11gctemplates56__T8mkBitmapTS3std5range13__T4iotaTiTiZ4iotaFiiZ6ResultZ8mkBitmapFNbNfPmmZv", ++ "nothrow @safe void gc.gctemplates.mkBitmap!(std.range.iota!(int, int).iota(int, int).Result).mkBitmap(ulong*, ulong)"], ++ ["_D8serenity9persister6Sqlite70__T15SqlitePersisterTS8serenity9persister6Sqlite11__unittest6FZv4TestZ15SqlitePersister12__T7opIndexZ7opIndexMFmZS8serenity9persister6Sqlite11__unittest6FZv4Test", ++ "serenity.persister.Sqlite.__unittest6().Test serenity.persister.Sqlite.SqlitePersister!(serenity.persister.Sqlite.__unittest6().Test).SqlitePersister.opIndex!().opIndex(ulong)"], ++ ["_D8bug100274mainFZv5localMFZi","int bug10027.main().local()"], + ]; + + template staticIota(int x) +--- a/src/libphobos/libdruntime/core/exception.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/exception.d 2014-04-01 16:32:51.000000000 +0100 +@@ -2,39 +2,24 @@ + * The exception module defines all system-level exceptions and provides a + * mechanism to alter system-level error handling. + * +- * Copyright: Copyright Sean Kelly 2005 - 2011. +- * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) ++ * Copyright: Copyright Sean Kelly 2005 - 2013. ++ * License: Distributed under the ++ * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). ++ * (See accompanying file LICENSE) + * Authors: Sean Kelly and Jonathan M Davis + * Source: $(DRUNTIMESRC core/_exception.d) + */ +- +-/* Copyright Sean Kelly 2005 - 2011. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ + module core.exception; + + import core.stdc.stdio; + +-private +-{ +- alias void function( string file, size_t line, string msg ) errorHandlerType; +- +- // NOTE: One assert handler is used for all threads. Thread-local +- // behavior should occur within the handler itself. This delegate +- // is __gshared for now based on the assumption that it will only +- // set by the main thread during program initialization. +- __gshared errorHandlerType assertHandler = null; +-} +- + + /** + * Thrown on a range error. + */ + class RangeError : Error + { +- this( string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this( string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( "Range violation", file, line, next ); + } +@@ -65,17 +50,17 @@ unittest + */ + class AssertError : Error + { +- this( string file, size_t line ) ++ @safe pure nothrow this( string file, size_t line ) + { + this(cast(Throwable)null, file, line); + } + +- this( Throwable next, string file = __FILE__, size_t line = __LINE__ ) ++ @safe pure nothrow this( Throwable next, string file = __FILE__, size_t line = __LINE__ ) + { + this( "Assertion failure", file, line, next); + } + +- this( string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this( string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( msg, file, line, next ); + } +@@ -140,12 +125,12 @@ class FinalizeError : Error + { + ClassInfo info; + +- this( ClassInfo ci, Throwable next, string file = __FILE__, size_t line = __LINE__ ) ++ @safe pure nothrow this( ClassInfo ci, Throwable next, string file = __FILE__, size_t line = __LINE__ ) + { + this(ci, file, line, next); + } + +- this( ClassInfo ci, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this( ClassInfo ci, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( "Finalization error", file, line, next ); + info = ci; +@@ -205,7 +190,7 @@ unittest + */ + class HiddenFuncError : Error + { +- this( ClassInfo ci ) ++ @safe pure nothrow this( ClassInfo ci ) + { + super( "Hidden method called for " ~ ci.name ); + } +@@ -229,7 +214,7 @@ unittest + */ + class OutOfMemoryError : Error + { +- this(string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this(string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( "Memory allocation failed", file, line, next ); + } +@@ -270,7 +255,7 @@ unittest + */ + class InvalidMemoryOperationError : Error + { +- this(string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this(string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( "Invalid memory operation", file, line, next ); + } +@@ -306,7 +291,7 @@ unittest + */ + class SwitchError : Error + { +- this( string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ @safe pure nothrow this( string file = __FILE__, size_t line = __LINE__, Throwable next = null ) + { + super( "No appropriate switch clause found", file, line, next ); + } +@@ -339,7 +324,7 @@ class UnicodeException : Exception + { + size_t idx; + +- this( string msg, size_t idx, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) ++ this( string msg, size_t idx, string file = __FILE__, size_t line = __LINE__, Throwable next = null ) @safe pure nothrow + { + super( msg, file, line, next ); + this.idx = idx; +@@ -373,13 +358,39 @@ unittest + /////////////////////////////////////////////////////////////////////////////// + + ++// NOTE: One assert handler is used for all threads. Thread-local ++// behavior should occur within the handler itself. This delegate ++// is __gshared for now based on the assumption that it will only ++// set by the main thread during program initialization. ++private __gshared AssertHandler _assertHandler = null; ++ ++ ++/** ++Gets/sets assert hander. null means the default handler is used. ++*/ ++alias AssertHandler = void function(string file, size_t line, string msg) nothrow; ++ ++/// ditto ++@property AssertHandler assertHandler() @trusted nothrow ++{ ++ return _assertHandler; ++} ++ ++/// ditto ++@property void assertHandler(AssertHandler handler) @trusted nothrow ++{ ++ _assertHandler = handler; ++} ++ + /** + * Overrides the default assert hander with a user-supplied version. ++ * $(RED Deprecated. ++ * Please use $(LREF assertHandler) instead.) + * + * Params: + * h = The new assert handler. Set to null to use the default handler. + */ +-void setAssertHandler( errorHandlerType h ) ++deprecated void setAssertHandler( AssertHandler h ) @trusted nothrow + { + assertHandler = h; + } +@@ -398,11 +409,11 @@ void setAssertHandler( errorHandlerType + * file = The name of the file that signaled this error. + * line = The line number on which this error occurred. + */ +-extern (C) void onAssertError( string file = __FILE__, size_t line = __LINE__ ) ++extern (C) void onAssertError( string file = __FILE__, size_t line = __LINE__ ) nothrow + { +- if( assertHandler is null ) ++ if( _assertHandler is null ) + throw new AssertError( file, line ); +- assertHandler( file, line, null); ++ _assertHandler( file, line, null); + } + + +@@ -415,11 +426,11 @@ extern (C) void onAssertError( string fi + * line = The line number on which this error occurred. + * msg = An error message supplied by the user. + */ +-extern (C) void onAssertErrorMsg( string file, size_t line, string msg ) ++extern (C) void onAssertErrorMsg( string file, size_t line, string msg ) nothrow + { +- if( assertHandler is null ) ++ if( _assertHandler is null ) + throw new AssertError( msg, file, line ); +- assertHandler( file, line, msg ); ++ _assertHandler( file, line, msg ); + } + + +@@ -433,7 +444,7 @@ extern (C) void onAssertErrorMsg( string + * line = The line number on which this error occurred. + * msg = An error message supplied by the user. + */ +-extern (C) void onUnittestErrorMsg( string file, size_t line, string msg ) ++extern (C) void onUnittestErrorMsg( string file, size_t line, string msg ) nothrow + { + onAssertErrorMsg( file, line, msg ); + } +@@ -454,7 +465,7 @@ extern (C) void onUnittestErrorMsg( stri + * Throws: + * RangeError. + */ +-extern (C) void onRangeError( string file = __FILE__, size_t line = __LINE__ ) ++extern (C) void onRangeError( string file = __FILE__, size_t line = __LINE__ ) @safe pure nothrow + { + throw new RangeError( file, line, null ); + } +@@ -464,12 +475,15 @@ extern (C) void onRangeError( string fil + * A callback for finalize errors in D. A FinalizeError will be thrown. + * + * Params: ++ * info = The ClassInfo instance for the object that failed finalization. + * e = The exception thrown during finalization. ++ * file = The name of the file that signaled this error. ++ * line = The line number on which this error occurred. + * + * Throws: + * FinalizeError. + */ +-extern (C) void onFinalizeError( ClassInfo info, Exception e, string file = __FILE__, size_t line = __LINE__ ) ++extern (C) void onFinalizeError( ClassInfo info, Exception e, string file = __FILE__, size_t line = __LINE__ ) @safe pure nothrow + { + throw new FinalizeError( info, file, line, e ); + } +@@ -482,7 +496,7 @@ extern (C) void onFinalizeError( ClassIn + * Throws: + * HiddenFuncError. + */ +-extern (C) void onHiddenFuncError( Object o ) ++extern (C) void onHiddenFuncError( Object o ) @safe pure nothrow + { + throw new HiddenFuncError( o.classinfo ); + } +@@ -495,7 +509,7 @@ extern (C) void onHiddenFuncError( Objec + * Throws: + * OutOfMemoryError. + */ +-extern (C) void onOutOfMemoryError() ++extern (C) void onOutOfMemoryError() @trusted pure nothrow + { + // NOTE: Since an out of memory condition exists, no allocation must occur + // while generating this object. +@@ -510,7 +524,7 @@ extern (C) void onOutOfMemoryError() + * Throws: + * InvalidMemoryOperationError. + */ +-extern (C) void onInvalidMemoryOperationError() ++extern (C) void onInvalidMemoryOperationError() @trusted pure nothrow + { + // The same restriction applies as for onOutOfMemoryError. The GC is in an + // undefined state, thus no allocation must occur while generating this object. +@@ -529,7 +543,7 @@ extern (C) void onInvalidMemoryOperation + * Throws: + * SwitchError. + */ +-extern (C) void onSwitchError( string file = __FILE__, size_t line = __LINE__ ) ++extern (C) void onSwitchError( string file = __FILE__, size_t line = __LINE__ ) @safe pure nothrow + { + throw new SwitchError( file, line, null ); + } +@@ -541,11 +555,125 @@ extern (C) void onSwitchError( string fi + * Params: + * msg = Information about the error. + * idx = String index where this error was detected. ++ * file = The name of the file that signaled this error. ++ * line = The line number on which this error occurred. + * + * Throws: + * UnicodeException. + */ +-extern (C) void onUnicodeError( string msg, size_t idx, string file = __FILE__, size_t line = __LINE__ ) ++extern (C) void onUnicodeError( string msg, size_t idx, string file = __FILE__, size_t line = __LINE__ ) @safe pure + { + throw new UnicodeException( msg, idx, file, line ); + } ++ ++/*********************************** ++ * These functions must be defined for any D program linked ++ * against this library. ++ */ ++/+ ++extern (C) void onAssertError(string file, size_t line); ++extern (C) void onAssertErrorMsg(string file, size_t line, string msg); ++extern (C) void onUnittestErrorMsg(string file, size_t line, string msg); ++extern (C) void onRangeError(string file, size_t line); ++extern (C) void onHiddenFuncError(Object o); ++extern (C) void onSwitchError(string file, size_t line); +++/ ++ ++/*********************************** ++ * Function calls to these are generated by the compiler and inserted into ++ * the object code. ++ */ ++ ++extern (C) ++{ ++ // Use ModuleInfo to get file name for "m" versions ++ ++ /* One of these three is called upon an assert() fail. ++ */ ++ void _d_assertm(ModuleInfo* m, uint line) ++ { ++ onAssertError(m.name, line); ++ } ++ ++ void _d_assert_msg(string msg, string file, uint line) ++ { ++ onAssertErrorMsg(file, line, msg); ++ } ++ ++ void _d_assert(string file, uint line) ++ { ++ onAssertError(file, line); ++ } ++ ++ /* One of these three is called upon an assert() fail inside of a unittest block ++ */ ++ void _d_unittestm(ModuleInfo* m, uint line) ++ { ++ _d_unittest(m.name, line); ++ } ++ ++ void _d_unittest_msg(string msg, string file, uint line) ++ { ++ onUnittestErrorMsg(file, line, msg); ++ } ++ ++ void _d_unittest(string file, uint line) ++ { ++ _d_unittest_msg("unittest failure", file, line); ++ } ++ ++ /* Called when an array index is out of bounds ++ */ ++ void _d_array_boundsm(ModuleInfo* m, uint line) ++ { ++ onRangeError(m.name, line); ++ } ++ ++ void _d_array_bounds(string file, uint line) ++ { ++ onRangeError(file, line); ++ } ++ ++ /* Called when a switch statement has no DefaultStatement, yet none of the cases match ++ */ ++ void _d_switch_errorm(ModuleInfo* m, uint line) ++ { ++ onSwitchError(m.name, line); ++ } ++ ++ void _d_switch_error(string file, uint line) ++ { ++ onSwitchError(file, line); ++ } ++ ++ version (GNU) ++ { ++ void _d_hidden_func(Object o) ++ { ++ onHiddenFuncError(o); ++ } ++ } ++ else ++ { ++ void _d_hidden_func() ++ { ++ Object o; ++ version(D_InlineAsm_X86) ++ asm ++ { ++ mov o, EAX; ++ } ++ else version(D_InlineAsm_X86_64) ++ asm ++ { ++ mov o, RDI; ++ } ++ else ++ static assert(0, "unknown os"); ++ ++ onHiddenFuncError(o); ++ } ++ } ++} ++ ++ +--- a/src/libphobos/libdruntime/core/memory.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/memory.d 2014-04-01 16:32:51.000000000 +0100 +@@ -189,7 +189,28 @@ struct GC + FINALIZE = 0b0000_0001, /// Finalize the data in this block on collect. + NO_SCAN = 0b0000_0010, /// Do not scan through this block on collect. + NO_MOVE = 0b0000_0100, /// Do not move this memory block on collect. +- APPENDABLE = 0b0000_1000, /// This block contains the info to allow appending. ++ /** ++ This block contains the info to allow appending. ++ ++ This can be used to manually allocate arrays. Initial slice size is 0. ++ ++ Note: The slice's useable size will not match the block size. Use ++ $(LREF capacity) to retrieve actual useable capacity. ++ ++ Example: ++ ---- ++ // Allocate the underlying array. ++ int* pToArray = cast(int*)GC.malloc(10 * int.sizeof, GC.BlkAttr.NO_SCAN | GC.BlkAttr.APPENDABLE); ++ // Bind a slice. Check the slice has capacity information. ++ int[] slice = pToArray[0 .. 0]; ++ assert(capacity(slice) > 0); ++ // Appending to the slice will not relocate it. ++ slice.length = 5; ++ slice ~= 1; ++ assert(slice.ptr == p); ++ ---- ++ */ ++ APPENDABLE = 0b0000_1000, + + /** + This block is guaranteed to have a pointer to its base while it is +@@ -407,22 +428,58 @@ struct GC + /** + * Requests that the managed memory block referenced by p be extended in + * place by at least mx bytes, with a desired extension of sz bytes. If an +- * extension of the required size is not possible, if p references memory +- * not originally allocated by this garbage collector, or if p points to +- * the interior of a memory block, no action will be taken. ++ * extension of the required size is not possible or if p references memory ++ * not originally allocated by this garbage collector, no action will be ++ * taken. + * + * Params: ++ * p = A pointer to the root of a valid memory block or to null. + * mx = The minimum extension size in bytes. +- * sz = The desired extension size in bytes. ++ * sz = The desired extension size in bytes. + * + * Returns: + * The size in bytes of the extended memory block referenced by p or zero + * if no extension occurred. ++ * ++ * Note: ++ * Extend may also be used to extend slices (or memory blocks with ++ * $(LREF APPENDABLE) info). However, use the return value only ++ * as an indicator of success. $(LREF capacity) should be used to ++ * retrieve actual useable slice capacity. + */ + static size_t extend( void* p, size_t mx, size_t sz ) pure nothrow + { + return gc_extend( p, mx, sz ); + } ++ /// Standard extending ++ unittest ++ { ++ size_t size = 1000; ++ int* p = cast(int*)GC.malloc(size * int.sizeof, GC.BlkAttr.NO_SCAN); ++ ++ //Try to extend the allocated data by 1000 elements, preferred 2000. ++ size_t u = GC.extend(p, 1000 * int.sizeof, 2000 * int.sizeof); ++ if (u != 0) ++ size = u / int.sizeof; ++ } ++ /// slice extending ++ unittest ++ { ++ int[] slice = new int[](1000); ++ int* p = slice.ptr; ++ ++ //Check we have access to capacity before attempting the extend ++ if (slice.capacity) ++ { ++ //Try to extend slice by 1000 elements, preferred 2000. ++ size_t u = GC.extend(p, 1000 * int.sizeof, 2000 * int.sizeof); ++ if (u != 0) ++ { ++ slice.length = slice.capacity; ++ assert(slice.length >= 2000); ++ } ++ } ++ } + + + /** +@@ -511,6 +568,16 @@ struct GC + return gc_sizeOf( p ); + } + ++ // verify that the reallocation doesn't leave the size cache in a wrong state ++ unittest ++ { ++ auto data = cast(int*)realloc(null, 4096); ++ size_t size = GC.sizeOf(data); ++ assert(size >= 4096); ++ data = cast(int*)GC.realloc(data, 4100); ++ size = GC.sizeOf(data); ++ assert(size >= 4100); ++ } + + /** + * Returns aggregate information about the memory block containing p. If p +--- a/src/libphobos/libdruntime/core/runtime.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/runtime.d 2014-04-01 16:32:51.000000000 +0100 +@@ -14,37 +14,20 @@ + */ + module core.runtime; + +-/* +- * Configuration stuff for backtraces +- * Versions: +- * HaveDLADDR = the extern(C) dladdr function is available +- * GenericBacktrace = Use GCC unwinding for backtraces +- * +- * TODO: HaveDLADDR should be set by the configure script +- */ ++version (Windows) import core.stdc.wchar_ : wchar_t; + +-version(Android) +-{ +- version = HaveDLADDR; +- version = GenericBacktrace; +-} +-else version(Windows) +-{ +- version = WindowsBacktrace; +-} +-else version(linux) +-{ +- //assume GLIBC backtrace function exists, not always correct! +- version = GlibcBacktrace; +-} +-else version(OSX) +-{ +- version = OSXBacktrace; +-} +-else version(GNU) +-{ +- version = GenericBacktrace; +-} ++ ++/// C interface for Runtime.loadLibrary ++extern (C) void* rt_loadLibrary(const char* name); ++/// ditto ++version (Windows) extern (C) void* rt_loadLibraryW(const wchar_t* name); ++/// C interface for Runtime.unloadLibrary, returns 1/0 instead of bool ++extern (C) int rt_unloadLibrary(void* ptr); ++ ++/// C interface for Runtime.initialize, returns 1/0 instead of bool ++extern(C) int rt_init(); ++/// C interface for Runtime.terminate, returns 1/0 instead of bool ++extern(C) int rt_term(); + + private + { +@@ -59,72 +42,24 @@ private + extern (C) TraceHandler rt_getTraceHandler(); + + alias void delegate( Throwable ) ExceptionHandler; +- extern (C) bool rt_init( ExceptionHandler dg = null ); +- extern (C) bool rt_term( ExceptionHandler dg = null ); +- +- extern (C) void* rt_loadLibrary( in char[] name ); +- extern (C) bool rt_unloadLibrary( void* ptr ); + + extern (C) void* thread_stackBottom(); + + extern (C) string[] rt_args(); + extern (C) CArgs rt_cArgs(); + +- version(HaveDLADDR) +- { +- extern(C) +- { +- int dladdr(void *addr, Dl_info *info); +- struct Dl_info +- { +- const (char*) dli_fname; /* Pathname of shared object that +- contains address */ +- void* dli_fbase; /* Address at which shared object +- is loaded */ +- const (char*) dli_sname; /* Name of nearest symbol with address +- lower than addr */ +- void* dli_saddr; /* Exact address of symbol named +- in dli_sname */ +- } +- } +- } +- +- version(GenericBacktrace) +- { +- import gcc.unwind; +- import core.demangle; +- import core.stdc.stdio : snprintf, printf; +- import core.stdc.string : strlen; +- +- version(Posix) +- import core.sys.posix.signal; // segv handler +- } +- else version(GlibcBacktrace) +- { +- import core.demangle; +- import core.stdc.stdlib : free; +- import core.stdc.string : strlen, memchr; +- extern (C) int backtrace(void**, int); +- extern (C) char** backtrace_symbols(void**, int); +- extern (C) void backtrace_symbols_fd(void**, int, int); +- +- version(Posix) +- import core.sys.posix.signal; // segv handler +- } +- else version(OSXBacktrace) +- { +- import core.demangle; +- import core.stdc.stdlib : free; +- import core.stdc.string : strlen; +- extern (C) int backtrace(void**, int); +- extern (C) char** backtrace_symbols(void**, int); +- extern (C) void backtrace_symbols_fd(void**, int, int); +- import core.sys.posix.signal; // segv handler +- } +- else version(WindowsBacktrace) +- { ++ // backtrace ++ version(GNU) ++ import gcc.backtrace; ++ ++ version( linux ) ++ import core.sys.linux.execinfo; ++ else version( OSX ) ++ import core.sys.osx.execinfo; ++ else version( FreeBSD ) ++ import core.sys.freebsd.execinfo; ++ else version( Windows ) + import core.sys.windows.stacktrace; +- } + + // For runModuleUnitTests error reporting. + version( Windows ) +@@ -172,18 +107,21 @@ struct Runtime + * Initializes the runtime. This call is to be used in instances where the + * standard program initialization process is not executed. This is most + * often in shared libraries or in libraries linked to a C program. +- * +- * Params: +- * dg = A delegate which will receive any exception thrown during the +- * initialization process or null if such exceptions should be +- * discarded. ++ * If the runtime was already successfully initialized this returns true. ++ * Each call to initialize must be paired by a call to $(LREF, terminate). + * + * Returns: +- * true if initialization succeeds and false if initialization fails. ++ * true if initialization succeeded or false if initialization failed. + */ +- static bool initialize( ExceptionHandler dg = null ) ++ static bool initialize() + { +- return rt_init( dg ); ++ return !!rt_init(); ++ } ++ ++ deprecated("Please use the overload of Runtime.initialize that takes no argument.") ++ static bool initialize(ExceptionHandler dg = null) ++ { ++ return !!rt_init(); + } + + +@@ -191,18 +129,20 @@ struct Runtime + * Terminates the runtime. This call is to be used in instances where the + * standard program termination process will not be not executed. This is + * most often in shared libraries or in libraries linked to a C program. +- * +- * Params: +- * dg = A delegate which will receive any exception thrown during the +- * termination process or null if such exceptions should be +- * discarded. ++ * If the runtime was not successfully initialized the function returns false. + * + * Returns: +- * true if termination succeeds and false if termination fails. ++ * true if termination succeeded or false if termination failed. + */ +- static bool terminate( ExceptionHandler dg = null ) ++ static bool terminate() ++ { ++ return !!rt_term(); ++ } ++ ++ deprecated("Please use the overload of Runtime.terminate that takes no argument.") ++ static bool terminate(ExceptionHandler dg = null) + { +- return rt_term( dg ); ++ return !!rt_term(); + } + + +@@ -218,11 +158,25 @@ struct Runtime + } + + /** +- * Returns the unprocessed C arguments supplied when the process was +- * started. Use this when you need to supply argc and argv to C libraries. ++ * Returns the unprocessed C arguments supplied when the process was started. ++ * Use this when you need to supply argc and argv to C libraries. + * + * Returns: + * A $(LREF CArgs) struct with the arguments supplied when this process was started. ++ * ++ * Example: ++ * --- ++ * import core.runtime; ++ * ++ * // A C library function requiring char** arguments ++ * extern(C) void initLibFoo(int argc, char** argv); ++ * ++ * void main() ++ * { ++ * auto args = Runtime.cArgs; ++ * initLibFoo(args.argc, args.argv); ++ * } ++ * --- + */ + static @property CArgs cArgs() + { +@@ -240,9 +194,47 @@ struct Runtime + * Returns: + * A reference to the library or null on error. + */ +- static void* loadLibrary( in char[] name ) ++ static void* loadLibrary()(in char[] name) + { +- return rt_loadLibrary( name ); ++ import core.stdc.stdlib : free, malloc; ++ version (Windows) ++ { ++ import core.sys.windows.windows; ++ ++ if (name.length == 0) return null; ++ // Load a DLL at runtime ++ auto len = MultiByteToWideChar( ++ CP_UTF8, 0, name.ptr, cast(int)name.length, null, 0); ++ if (len == 0) ++ return null; ++ ++ auto buf = cast(wchar_t*)malloc((len+1) * wchar_t.sizeof); ++ if (buf is null) return null; ++ scope (exit) free(buf); ++ ++ len = MultiByteToWideChar( ++ CP_UTF8, 0, name.ptr, cast(int)name.length, buf, len); ++ if (len == 0) ++ return null; ++ ++ buf[len] = '\0'; ++ ++ return rt_loadLibraryW(buf); ++ } ++ else version (Posix) ++ { ++ /* Need a 0-terminated C string for the dll name ++ */ ++ immutable len = name.length; ++ auto buf = cast(char*)malloc(len + 1); ++ if (!buf) return null; ++ scope (exit) free(buf); ++ ++ buf[0 .. len] = name[]; ++ buf[len] = 0; ++ ++ return rt_loadLibrary(buf); ++ } + } + + +@@ -254,9 +246,9 @@ struct Runtime + * Params: + * p = A reference to the library to unload. + */ +- static bool unloadLibrary( void* p ) ++ static bool unloadLibrary()(void* p) + { +- return rt_unloadLibrary( p ); ++ return !!rt_unloadLibrary(p); + } + + +@@ -366,7 +358,49 @@ private: + */ + extern (C) bool runModuleUnitTests() + { +- static if( __traits( compiles, backtrace ) ) ++ static if( __traits( compiles, new LibBacktrace(0) ) ) ++ { ++ import core.sys.posix.signal; // segv handler ++ ++ static extern (C) void unittestSegvHandler( int signum, siginfo_t* info, void* ptr ) ++ { ++ import core.stdc.stdio; ++ fprintf(stderr, "Segmentation fault while running unittests:\n"); ++ fprintf(stderr, "----------------\n"); ++ ++ enum alignment = LibBacktrace.MaxAlignment; ++ enum classSize = __traits(classInstanceSize, LibBacktrace); ++ ++ byte[classSize + alignment] bt_store = void; ++ byte* alignedAddress = cast(byte*)((cast(size_t)(bt_store.ptr + alignment - 1)) ++ & ~(alignment - 1)); ++ ++ (alignedAddress[0 .. classSize]) = typeid(LibBacktrace).init[]; ++ auto bt = cast(LibBacktrace)(alignedAddress); ++ // First frame is LibBacktrace ctor. Second is signal handler, but include that for now ++ bt.__ctor(1); ++ ++ foreach(size_t i, const(char[]) msg; bt) ++ fprintf(stderr, "%s\n", msg.ptr ? msg.ptr : "???"); ++ } ++ ++ sigaction_t action = void; ++ sigaction_t oldseg = void; ++ sigaction_t oldbus = void; ++ ++ (cast(byte*) &action)[0 .. action.sizeof] = 0; ++ sigfillset( &action.sa_mask ); // block other signals ++ action.sa_flags = SA_SIGINFO | SA_RESETHAND; ++ action.sa_sigaction = &unittestSegvHandler; ++ sigaction( SIGSEGV, &action, &oldseg ); ++ sigaction( SIGBUS, &action, &oldbus ); ++ scope( exit ) ++ { ++ sigaction( SIGSEGV, &oldseg, null ); ++ sigaction( SIGBUS, &oldbus, null ); ++ } ++ } ++ else static if( __traits( compiles, backtrace ) ) + { + import core.sys.posix.signal; // segv handler + +@@ -458,7 +492,23 @@ import core.stdc.stdio; + Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) + { + //printf("runtime.defaultTraceHandler()\n"); +- static if( __traits( compiles, backtrace ) ) //GlibcBacktrace || OSXBacktrace ++ static if( __traits( compiles, new LibBacktrace(0) ) ) ++ { ++ version(Posix) ++ { ++ static enum FIRSTFRAME = 4; ++ } ++ else version (Win64) ++ { ++ static enum FIRSTFRAME = 4; ++ } ++ else ++ { ++ static enum FIRSTFRAME = 0; ++ } ++ return new LibBacktrace(FIRSTFRAME); ++ } ++ else static if( __traits( compiles, backtrace ) ) + { + import core.demangle; + import core.stdc.stdlib : free; +@@ -470,9 +520,6 @@ Throwable.TraceInfo defaultTraceHandler( + { + static enum MAXFRAMES = 128; + void*[MAXFRAMES] callstack; +- version( GNU ) +- numframes = backtrace( callstack.ptr, MAXFRAMES ); +- else + numframes = 0; //backtrace( callstack, MAXFRAMES ); + if (numframes < 2) // backtrace() failed, do it ourselves + { +@@ -662,232 +709,37 @@ Throwable.TraceInfo defaultTraceHandler( + + return new DefaultTraceInfo; + } +- else static if( __traits( compiles, new StackTrace ) ) // WindowsBacktrace ++ else static if( __traits( compiles, new StackTrace(0, null) ) ) + { + version (Win64) + { +- /* Disabled for the moment, because DbgHelp's stack walking code +- * does not work with dmd's stack frame. +- */ +- return null; ++ static enum FIRSTFRAME = 4; + } + else + { +- auto s = new StackTrace; +- return s; ++ static enum FIRSTFRAME = 0; + } ++ auto s = new StackTrace(FIRSTFRAME, cast(CONTEXT*)ptr); ++ return s; + } +- else version(GenericBacktrace) ++ else static if( __traits( compiles, new GDCBacktrace(0) ) ) + { +- class DefaultTraceInfo : Throwable.TraceInfo ++ version(Posix) + { +- this() +- { +- callstack = gdcBacktrace(); +- framelist = gdcBacktraceSymbols(callstack); +- } +- +- override int opApply( scope int delegate(ref char[]) dg ) +- { +- return opApply( (ref size_t, ref char[] buf) +- { +- return dg( buf ); +- } ); +- } +- +- override int opApply( scope int delegate(ref size_t, ref char[]) dg ) +- { +- version( Posix ) +- { +- // NOTE: The first 5 frames with the current implementation are +- // inside core.runtime and the object code, so eliminate +- // these for readability. The alternative would be to +- // exclude the first N frames that are in a list of +- // mangled function names. +- static enum FIRSTFRAME = 5; +- } +- else +- { +- // NOTE: On Windows, the number of frames to exclude is based on +- // whether the exception is user or system-generated, so +- // it may be necessary to exclude a list of function names +- // instead. +- static enum FIRSTFRAME = 0; +- } +- int ret = 0; +- +- for( int i = FIRSTFRAME; i < framelist.entries; ++i ) +- { +- auto pos = cast(size_t)(i - FIRSTFRAME); +- auto buf = formatLine(framelist.symbols[i]); +- ret = dg( pos, buf ); +- if( ret ) +- break; +- } +- return ret; +- } +- +- override string toString() +- { +- string buf; +- foreach( i, line; this ) +- buf ~= i ? "\n" ~ line : line; +- return buf; +- } +- +- private: +- btSymbolData framelist; +- gdcBacktraceData callstack; +- +- private: +- char[4096] fixbuf; +- +- /*Do not put \n at end of line!*/ +- char[] formatLine(backtraceSymbol sym) +- { +- int ret; +- +- if(sym.fileName) +- { +- if(sym.name) +- { +- ret = snprintf(fixbuf.ptr, fixbuf.sizeof, +- "%s(", sym.fileName); +- if(ret >= fixbuf.sizeof) +- return fixbuf[]; +- +- auto demangled = demangle(sym.name[0 .. strlen(sym.name)], +- fixbuf[ret .. $]); +- +- ret += demangled.length; +- if(ret >= fixbuf.sizeof) +- return fixbuf[]; +- +- ret += snprintf(fixbuf.ptr + ret, fixbuf.sizeof - ret, +- "+%#x) [%p]", sym.offset, sym.address); +- } +- else +- { +- ret = snprintf(fixbuf.ptr, fixbuf.sizeof, +- "%s() [%p]", sym.fileName, sym.address); +- } +- } +- else +- { +- if(sym.name) +- { +- fixbuf[0] = '('; +- ret = 1; +- +- auto demangled = demangle(sym.name[0 .. strlen(sym.name)], +- fixbuf[ret .. $]); +- +- ret += demangled.length; +- if(ret >= fixbuf.sizeof) +- return fixbuf[]; +- +- ret += snprintf(fixbuf.ptr + ret, fixbuf.sizeof - ret, +- "+%#x) [%p]", sym.offset, sym.address); +- } +- else +- { +- ret = snprintf(fixbuf.ptr, fixbuf.sizeof, "() [%p]", +- sym.address); +- } +- } +- +- if(ret >= fixbuf.sizeof) +- return fixbuf[]; +- else +- return fixbuf[0 .. ret]; +- } ++ static enum FIRSTFRAME = 5; + } +- +- return new DefaultTraceInfo; ++ else version (Win64) ++ { ++ static enum FIRSTFRAME = 4; ++ } ++ else ++ { ++ static enum FIRSTFRAME = 0; ++ } ++ return new GDCBacktrace(FIRSTFRAME); + } + else + { + return null; + } + } +- +-version(GenericBacktrace) +-{ +- static enum MAXFRAMES = 128; +- +- struct gdcBacktraceData +- { +- void*[MAXFRAMES] callstack; +- int numframes = 0; +- } +- +- struct backtraceSymbol +- { +- const(char)* name, fileName; +- size_t offset; +- void* address; +- } +- +- struct btSymbolData +- { +- size_t entries; +- backtraceSymbol[MAXFRAMES] symbols; +- } +- +- static extern (C) _Unwind_Reason_Code unwindCB(_Unwind_Context *ctx, void *d) +- { +- gdcBacktraceData* bt = cast(gdcBacktraceData*)d; +- if(bt.numframes >= MAXFRAMES) +- return _URC_NO_REASON; +- +- bt.callstack[bt.numframes] = cast(void*)_Unwind_GetIP(ctx); +- bt.numframes++; +- return _URC_NO_REASON; +- } +- +- gdcBacktraceData gdcBacktrace() +- { +- gdcBacktraceData stackframe; +- _Unwind_Backtrace(&unwindCB, &stackframe); +- return stackframe; +- } +- +- btSymbolData gdcBacktraceSymbols(gdcBacktraceData data) +- { +- btSymbolData symData; +- +- for(auto i = 0; i < data.numframes; i++) +- { +- version(HaveDLADDR) +- { +- Dl_info funcInfo; +- +- if(data.callstack[i] !is null && dladdr(data.callstack[i], &funcInfo) != 0) +- { +- symData.symbols[symData.entries].name = funcInfo.dli_sname; +- symData.symbols[symData.entries].fileName = funcInfo.dli_fname; +- +- if(funcInfo.dli_saddr is null) +- symData.symbols[symData.entries].offset = 0; +- else +- symData.symbols[symData.entries].offset = data.callstack[i] - funcInfo.dli_saddr; +- +- symData.symbols[symData.entries].address = data.callstack[i]; +- symData.entries++; +- } +- else +- { +- symData.symbols[symData.entries].address = data.callstack[i]; +- symData.entries++; +- } +- } +- else +- { +- symData.symbols[symData.entries].address = data.callstack[i]; +- symData.entries++; +- } +- } +- +- return symData; +- } +-} +--- a/src/libphobos/libdruntime/core/simd.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/simd.d 2014-04-01 16:32:51.000000000 +0100 +@@ -436,7 +436,7 @@ version ( D_SIMD ) + * op1 op= op2 + * Returns: + * op2 +- * These cannot be market as pure, as semantic() doesn't check them. ++ * These cannot be marked as pure, as semantic() doesn't check them. + */ + @safe void16 __simd_sto(XMM opcode, void16 op1, void16 op2); + @safe void16 __simd_sto(XMM opcode, double op1, void16 op2); /// +--- a/src/libphobos/libdruntime/core/stdc/complex.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/complex.d 2014-04-01 16:32:51.000000000 +0100 +@@ -21,90 +21,90 @@ nothrow: + alias creal complex; + alias ireal imaginary; + +-pure cdouble cacos(cdouble z); +-pure cfloat cacosf(cfloat z); +-pure creal cacosl(creal z); +- +-pure cdouble casin(cdouble z); +-pure cfloat casinf(cfloat z); +-pure creal casinl(creal z); +- +-pure cdouble catan(cdouble z); +-pure cfloat catanf(cfloat z); +-pure creal catanl(creal z); +- +-pure cdouble ccos(cdouble z); +-pure cfloat ccosf(cfloat z); +-pure creal ccosl(creal z); +- +-pure cdouble csin(cdouble z); +-pure cfloat csinf(cfloat z); +-pure creal csinl(creal z); +- +-pure cdouble ctan(cdouble z); +-pure cfloat ctanf(cfloat z); +-pure creal ctanl(creal z); +- +-pure cdouble cacosh(cdouble z); +-pure cfloat cacoshf(cfloat z); +-pure creal cacoshl(creal z); +- +-pure cdouble casinh(cdouble z); +-pure cfloat casinhf(cfloat z); +-pure creal casinhl(creal z); +- +-pure cdouble catanh(cdouble z); +-pure cfloat catanhf(cfloat z); +-pure creal catanhl(creal z); +- +-pure cdouble ccosh(cdouble z); +-pure cfloat ccoshf(cfloat z); +-pure creal ccoshl(creal z); +- +-pure cdouble csinh(cdouble z); +-pure cfloat csinhf(cfloat z); +-pure creal csinhl(creal z); +- +-pure cdouble ctanh(cdouble z); +-pure cfloat ctanhf(cfloat z); +-pure creal ctanhl(creal z); +- +-pure cdouble cexp(cdouble z); +-pure cfloat cexpf(cfloat z); +-pure creal cexpl(creal z); +- +-pure cdouble clog(cdouble z); +-pure cfloat clogf(cfloat z); +-pure creal clogl(creal z); +- +-pure double cabs(cdouble z); +-pure float cabsf(cfloat z); +-pure real cabsl(creal z); +- +-pure cdouble cpow(cdouble x, cdouble y); +-pure cfloat cpowf(cfloat x, cfloat y); +-pure creal cpowl(creal x, creal y); +- +-pure cdouble csqrt(cdouble z); +-pure cfloat csqrtf(cfloat z); +-pure creal csqrtl(creal z); +- +-pure double carg(cdouble z); +-pure float cargf(cfloat z); +-pure real cargl(creal z); +- +-pure double cimag(cdouble z); +-pure float cimagf(cfloat z); +-pure real cimagl(creal z); +- +-pure cdouble conj(cdouble z); +-pure cfloat conjf(cfloat z); +-pure creal conjl(creal z); +- +-pure cdouble cproj(cdouble z); +-pure cfloat cprojf(cfloat z); +-pure creal cprojl(creal z); +- +-//pure double creal(cdouble z); +-pure float crealf(cfloat z); +-pure real creall(creal z); ++cdouble cacos(cdouble z); ++cfloat cacosf(cfloat z); ++creal cacosl(creal z); ++ ++cdouble casin(cdouble z); ++cfloat casinf(cfloat z); ++creal casinl(creal z); ++ ++cdouble catan(cdouble z); ++cfloat catanf(cfloat z); ++creal catanl(creal z); ++ ++cdouble ccos(cdouble z); ++cfloat ccosf(cfloat z); ++creal ccosl(creal z); ++ ++cdouble csin(cdouble z); ++cfloat csinf(cfloat z); ++creal csinl(creal z); ++ ++cdouble ctan(cdouble z); ++cfloat ctanf(cfloat z); ++creal ctanl(creal z); ++ ++cdouble cacosh(cdouble z); ++cfloat cacoshf(cfloat z); ++creal cacoshl(creal z); ++ ++cdouble casinh(cdouble z); ++cfloat casinhf(cfloat z); ++creal casinhl(creal z); ++ ++cdouble catanh(cdouble z); ++cfloat catanhf(cfloat z); ++creal catanhl(creal z); ++ ++cdouble ccosh(cdouble z); ++cfloat ccoshf(cfloat z); ++creal ccoshl(creal z); ++ ++cdouble csinh(cdouble z); ++cfloat csinhf(cfloat z); ++creal csinhl(creal z); ++ ++cdouble ctanh(cdouble z); ++cfloat ctanhf(cfloat z); ++creal ctanhl(creal z); ++ ++cdouble cexp(cdouble z); ++cfloat cexpf(cfloat z); ++creal cexpl(creal z); ++ ++cdouble clog(cdouble z); ++cfloat clogf(cfloat z); ++creal clogl(creal z); ++ ++ double cabs(cdouble z); ++ float cabsf(cfloat z); ++ real cabsl(creal z); ++ ++cdouble cpow(cdouble x, cdouble y); ++cfloat cpowf(cfloat x, cfloat y); ++creal cpowl(creal x, creal y); ++ ++cdouble csqrt(cdouble z); ++cfloat csqrtf(cfloat z); ++creal csqrtl(creal z); ++ ++ double carg(cdouble z); ++ float cargf(cfloat z); ++ real cargl(creal z); ++ ++ double cimag(cdouble z); ++ float cimagf(cfloat z); ++ real cimagl(creal z); ++ ++cdouble conj(cdouble z); ++cfloat conjf(cfloat z); ++creal conjl(creal z); ++ ++cdouble cproj(cdouble z); ++cfloat cprojf(cfloat z); ++creal cprojl(creal z); ++ ++// double creal(cdouble z); ++ float crealf(cfloat z); ++ real creall(creal z); +--- a/src/libphobos/libdruntime/core/stdc/fenv.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/fenv.d 2014-04-01 16:32:51.000000000 +0100 +@@ -106,7 +106,7 @@ enum + + version( Windows ) + { +- private extern fenv_t _FE_DFL_ENV; ++ private extern __gshared fenv_t _FE_DFL_ENV; + fenv_t* FE_DFL_ENV = &_FE_DFL_ENV; + } + else version( linux ) +@@ -115,7 +115,7 @@ else version( linux ) + } + else version( OSX ) + { +- private extern fenv_t _FE_DFL_ENV; ++ private extern __gshared fenv_t _FE_DFL_ENV; + fenv_t* FE_DFL_ENV = &_FE_DFL_ENV; + } + else version( FreeBSD ) +--- a/src/libphobos/libdruntime/core/stdc/math.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/math.d 2014-04-01 16:32:51.000000000 +0100 +@@ -309,6 +309,77 @@ else version( linux ) + } + } + } ++else version( MinGW ) ++{ ++ enum ++ { ++ FP_NAN = 0x0100, ++ FP_NORMAL = 0x0400, ++ FP_INFINITE = FP_NAN | FP_NORMAL, ++ FP_ZERO = 0x0400, ++ FP_SUBNORMAL = FP_NORMAL | FP_ZERO ++ } ++ ++ int __fpclassifyf(float x); ++ int __fpclassify(double x); ++ int __fpclassifyl(real x); ++ ++ int __isnanf(float x); ++ int __isnan(double x); ++ int __isnanl(real x); ++ ++ int __signbitf(float x); ++ int __signbit(double x); ++ int __signbitl(real x); ++ ++ extern (D) ++ { ++ //int fpclassify(real-floating x); ++ int fpclassify(float x) { return __fpclassifyf(x); } ++ int fpclassify(double x) { return __fpclassify(x); } ++ int fpclassify(real x) ++ { ++ return (real.sizeof == double.sizeof) ++ ? __fpclassify(x) ++ : __fpclassifyl(x); ++ } ++ ++ //int isfinite(real-floating x); ++ int isfinite(float x) { return (fpclassify(x) & FP_NORMAL) == 0; } ++ int isfinite(double x) { return (fpclassify(x) & FP_NORMAL) == 0; } ++ int isfinite(real x) { return (fpclassify(x) & FP_NORMAL) == 0; } ++ ++ //int isinf(real-floating x); ++ int isinf(float x) { return fpclassify(x) == FP_INFINITE; } ++ int isinf(double x) { return fpclassify(x) == FP_INFINITE; } ++ int isinf(real x) { return fpclassify(x) == FP_INFINITE; } ++ ++ //int isnan(real-floating x); ++ int isnan(float x) { return __isnanf(x); } ++ int isnan(double x) { return __isnan(x); } ++ int isnan(real x) ++ { ++ return (real.sizeof == double.sizeof) ++ ? __isnan(x) ++ : __isnanl(x); ++ } ++ ++ //int isnormal(real-floating x); ++ int isnormal(float x) { return fpclassify(x) == FP_NORMAL; } ++ int isnormal(double x) { return fpclassify(x) == FP_NORMAL; } ++ int isnormal(real x) { return fpclassify(x) == FP_NORMAL; } ++ ++ //int signbit(real-floating x); ++ int signbit(float x) { return __signbitf(x); } ++ int signbit(double x) { return __signbit(x); } ++ int signbit(real x) ++ { ++ return (real.sizeof == double.sizeof) ++ ? __signbit(x) ++ : __signbitl(x); ++ } ++ } ++} + else version( OSX ) + { + enum +@@ -520,505 +591,505 @@ version( FreeBSD ) + { + version (none) // < 8-CURRENT + { +- pure real acosl(real x) { return acos(x); } +- pure real asinl(real x) { return asin(x); } +- pure real atanl(real x) { return atan(x); } +- pure real atan2l(real y, real x) { return atan2(y, x); } +- pure real cosl(real x) { return cos(x); } +- pure real sinl(real x) { return sin(x); } +- pure real tanl(real x) { return tan(x); } +- pure real exp2l(real x) { return exp2(x); } +- real frexpl(real value, int* exp) { return frexp(value, exp); } +- pure int ilogbl(real x) { return ilogb(x); } +- pure real ldexpl(real x, int exp) { return ldexp(x, exp); } +- pure real logbl(real x) { return logb(x); } +- //pure real modfl(real value, real *iptr); // nontrivial conversion +- pure real scalbnl(real x, int n) { return scalbn(x, n); } +- pure real scalblnl(real x, c_long n) { return scalbln(x, n); } +- pure real fabsl(real x) { return fabs(x); } +- pure real hypotl(real x, real y) { return hypot(x, y); } +- pure real sqrtl(real x) { return sqrt(x); } +- pure real ceill(real x) { return ceil(x); } +- pure real floorl(real x) { return floor(x); } +- pure real nearbyintl(real x) { return nearbyint(x); } +- pure real rintl(real x) { return rint(x); } +- pure c_long lrintl(real x) { return lrint(x); } +- pure real roundl(real x) { return round(x); } +- pure c_long lroundl(real x) { return lround(x); } +- pure long llroundl(real x) { return llround(x); } +- pure real truncl(real x) { return trunc(x); } +- pure real fmodl(real x, real y) { return fmod(x, y); } +- pure real remainderl(real x, real y) { return remainder(x, y); } +- real remquol(real x, real y, int* quo) { return remquo(x, y, quo); } +- pure real copysignl(real x, real y) { return copysign(x, y); } +-// pure double nan(char* tagp); +-// pure float nanf(char* tagp); +-// pure real nanl(char* tagp); +- pure real nextafterl(real x, real y) { return nextafter(x, y); } +- pure real nexttowardl(real x, real y) { return nexttoward(x, y); } +- pure real fdiml(real x, real y) { return fdim(x, y); } +- pure real fmaxl(real x, real y) { return fmax(x, y); } +- pure real fminl(real x, real y) { return fmin(x, y); } +- pure real fmal(real x, real y, real z) { return fma(x, y, z); } ++ real acosl(real x) { return acos(x); } ++ real asinl(real x) { return asin(x); } ++ real atanl(real x) { return atan(x); } ++ real atan2l(real y, real x) { return atan2(y, x); } ++ real cosl(real x) { return cos(x); } ++ real sinl(real x) { return sin(x); } ++ real tanl(real x) { return tan(x); } ++ real exp2l(real x) { return exp2(x); } ++ real frexpl(real value, int* exp) { return frexp(value, exp); } ++ int ilogbl(real x) { return ilogb(x); } ++ real ldexpl(real x, int exp) { return ldexp(x, exp); } ++ real logbl(real x) { return logb(x); } ++ //real modfl(real value, real *iptr); // nontrivial conversion ++ real scalbnl(real x, int n) { return scalbn(x, n); } ++ real scalblnl(real x, c_long n) { return scalbln(x, n); } ++ real fabsl(real x) { return fabs(x); } ++ real hypotl(real x, real y) { return hypot(x, y); } ++ real sqrtl(real x) { return sqrt(x); } ++ real ceill(real x) { return ceil(x); } ++ real floorl(real x) { return floor(x); } ++ real nearbyintl(real x) { return nearbyint(x); } ++ real rintl(real x) { return rint(x); } ++ c_long lrintl(real x) { return lrint(x); } ++ real roundl(real x) { return round(x); } ++ c_long lroundl(real x) { return lround(x); } ++ long llroundl(real x) { return llround(x); } ++ real truncl(real x) { return trunc(x); } ++ real fmodl(real x, real y) { return fmod(x, y); } ++ real remainderl(real x, real y) { return remainder(x, y); } ++ real remquol(real x, real y, int* quo) { return remquo(x, y, quo); } ++ real copysignl(real x, real y) { return copysign(x, y); } ++// double nan(char* tagp); ++// float nanf(char* tagp); ++// real nanl(char* tagp); ++ real nextafterl(real x, real y) { return nextafter(x, y); } ++ real nexttowardl(real x, real y) { return nexttoward(x, y); } ++ real fdiml(real x, real y) { return fdim(x, y); } ++ real fmaxl(real x, real y) { return fmax(x, y); } ++ real fminl(real x, real y) { return fmin(x, y); } ++ real fmal(real x, real y, real z) { return fma(x, y, z); } + } + else + { +- pure real acosl(real x); +- pure real asinl(real x); +- pure real atanl(real x); +- pure real atan2l(real y, real x); +- pure real cosl(real x); +- pure real sinl(real x); +- pure real tanl(real x); +- pure real exp2l(real x); +- real frexpl(real value, int* exp); +- pure int ilogbl(real x); +- pure real ldexpl(real x, int exp); +- pure real logbl(real x); +- pure real modfl(real value, real *iptr); +- pure real scalbnl(real x, int n); +- pure real scalblnl(real x, c_long n); +- pure real fabsl(real x); +- pure real hypotl(real x, real y); +- pure real sqrtl(real x); +- pure real ceill(real x); +- pure real floorl(real x); +- pure real nearbyintl(real x); +- pure real rintl(real x); +- pure c_long lrintl(real x); +- pure real roundl(real x); +- pure c_long lroundl(real x); +- pure long llroundl(real x); +- pure real truncl(real x); +- pure real fmodl(real x, real y); +- pure real remainderl(real x, real y); +- real remquol(real x, real y, int* quo); +- pure real copysignl(real x, real y); +- pure double nan(char* tagp); +- pure float nanf(char* tagp); +- pure real nanl(char* tagp); +- pure real nextafterl(real x, real y); +- pure real nexttowardl(real x, real y); +- pure real fdiml(real x, real y); +- pure real fmaxl(real x, real y); +- pure real fminl(real x, real y); +- pure real fmal(real x, real y, real z); ++ real acosl(real x); ++ real asinl(real x); ++ real atanl(real x); ++ real atan2l(real y, real x); ++ real cosl(real x); ++ real sinl(real x); ++ real tanl(real x); ++ real exp2l(real x); ++ real frexpl(real value, int* exp); ++ int ilogbl(real x); ++ real ldexpl(real x, int exp); ++ real logbl(real x); ++ real modfl(real value, real *iptr); ++ real scalbnl(real x, int n); ++ real scalblnl(real x, c_long n); ++ real fabsl(real x); ++ real hypotl(real x, real y); ++ real sqrtl(real x); ++ real ceill(real x); ++ real floorl(real x); ++ real nearbyintl(real x); ++ real rintl(real x); ++ c_long lrintl(real x); ++ real roundl(real x); ++ c_long lroundl(real x); ++ long llroundl(real x); ++ real truncl(real x); ++ real fmodl(real x, real y); ++ real remainderl(real x, real y); ++ real remquol(real x, real y, int* quo); ++ real copysignl(real x, real y); ++ double nan(char* tagp); ++ float nanf(char* tagp); ++ real nanl(char* tagp); ++ real nextafterl(real x, real y); ++ real nexttowardl(real x, real y); ++ real fdiml(real x, real y); ++ real fmaxl(real x, real y); ++ real fminl(real x, real y); ++ real fmal(real x, real y, real z); + } +- pure double acos(double x); +- pure float acosf(float x); ++ double acos(double x); ++ float acosf(float x); + +- pure double asin(double x); +- pure float asinf(float x); ++ double asin(double x); ++ float asinf(float x); + +- pure double atan(double x); +- pure float atanf(float x); ++ double atan(double x); ++ float atanf(float x); + +- pure double atan2(double y, double x); +- pure float atan2f(float y, float x); ++ double atan2(double y, double x); ++ float atan2f(float y, float x); + +- pure double cos(double x); +- pure float cosf(float x); ++ double cos(double x); ++ float cosf(float x); + +- pure double sin(double x); +- pure float sinf(float x); ++ double sin(double x); ++ float sinf(float x); + +- pure double tan(double x); +- pure float tanf(float x); ++ double tan(double x); ++ float tanf(float x); + +- pure double acosh(double x); +- pure float acoshf(float x); +- pure real acoshl(real x) { return acosh(x); } ++ double acosh(double x); ++ float acoshf(float x); ++ real acoshl(real x) { return acosh(x); } + +- pure double asinh(double x); +- pure float asinhf(float x); +- pure real asinhl(real x) { return asinh(x); } ++ double asinh(double x); ++ float asinhf(float x); ++ real asinhl(real x) { return asinh(x); } + +- pure double atanh(double x); +- pure float atanhf(float x); +- pure real atanhl(real x) { return atanh(x); } ++ double atanh(double x); ++ float atanhf(float x); ++ real atanhl(real x) { return atanh(x); } + +- pure double cosh(double x); +- pure float coshf(float x); +- pure real coshl(real x) { return cosh(x); } ++ double cosh(double x); ++ float coshf(float x); ++ real coshl(real x) { return cosh(x); } + +- pure double sinh(double x); +- pure float sinhf(float x); +- pure real sinhl(real x) { return sinh(x); } ++ double sinh(double x); ++ float sinhf(float x); ++ real sinhl(real x) { return sinh(x); } + +- pure double tanh(double x); +- pure float tanhf(float x); +- pure real tanhl(real x) { return tanh(x); } ++ double tanh(double x); ++ float tanhf(float x); ++ real tanhl(real x) { return tanh(x); } + +- pure double exp(double x); +- pure float expf(float x); +- pure real expl(real x) { return exp(x); } ++ double exp(double x); ++ float expf(float x); ++ real expl(real x) { return exp(x); } + +- pure double exp2(double x); +- pure float exp2f(float x); ++ double exp2(double x); ++ float exp2f(float x); + +- pure double expm1(double x); +- pure float expm1f(float x); +- pure real expm1l(real x) { return expm1(x); } ++ double expm1(double x); ++ float expm1f(float x); ++ real expm1l(real x) { return expm1(x); } + +- double frexp(double value, int* exp); +- float frexpf(float value, int* exp); ++ double frexp(double value, int* exp); ++ float frexpf(float value, int* exp); + +- pure int ilogb(double x); +- pure int ilogbf(float x); ++ int ilogb(double x); ++ int ilogbf(float x); + +- pure double ldexp(double x, int exp); +- pure float ldexpf(float x, int exp); ++ double ldexp(double x, int exp); ++ float ldexpf(float x, int exp); + +- pure double log(double x); +- pure float logf(float x); +- pure real logl(real x) { return log(x); } ++ double log(double x); ++ float logf(float x); ++ real logl(real x) { return log(x); } + +- pure double log10(double x); +- pure float log10f(float x); +- pure real log10l(real x) { return log10(x); } ++ double log10(double x); ++ float log10f(float x); ++ real log10l(real x) { return log10(x); } + +- pure double log1p(double x); +- pure float log1pf(float x); +- pure real log1pl(real x) { return log1p(x); } ++ double log1p(double x); ++ float log1pf(float x); ++ real log1pl(real x) { return log1p(x); } + + private enum real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L; +- pure double log2(double x) { return log(x) * ONE_LN2; } +- pure float log2f(float x) { return logf(x) * ONE_LN2; } +- pure real log2l(real x) { return logl(x) * ONE_LN2; } ++ double log2(double x) { return log(x) * ONE_LN2; } ++ float log2f(float x) { return logf(x) * ONE_LN2; } ++ real log2l(real x) { return logl(x) * ONE_LN2; } + +- pure double logb(double x); +- pure float logbf(float x); ++ double logb(double x); ++ float logbf(float x); + +- pure double modf(double value, double* iptr); +- pure float modff(float value, float* iptr); ++ double modf(double value, double* iptr); ++ float modff(float value, float* iptr); + +- pure double scalbn(double x, int n); +- pure float scalbnf(float x, int n); ++ double scalbn(double x, int n); ++ float scalbnf(float x, int n); + +- double scalbln(double x, c_long n); +- float scalblnf(float x, c_long n); ++ double scalbln(double x, c_long n); ++ float scalblnf(float x, c_long n); + +- pure double cbrt(double x); +- pure float cbrtf(float x); +- pure real cbrtl(real x) { return cbrt(x); } ++ double cbrt(double x); ++ float cbrtf(float x); ++ real cbrtl(real x) { return cbrt(x); } + +- pure double fabs(double x); +- pure float fabsf(float x); ++ double fabs(double x); ++ float fabsf(float x); + +- pure double hypot(double x, double y); +- pure float hypotf(float x, float y); ++ double hypot(double x, double y); ++ float hypotf(float x, float y); + +- pure double pow(double x, double y); +- pure float powf(float x, float y); +- pure real powl(real x, real y) { return pow(x, y); } ++ double pow(double x, double y); ++ float powf(float x, float y); ++ real powl(real x, real y) { return pow(x, y); } + +- pure double sqrt(double x); +- pure float sqrtf(float x); ++ double sqrt(double x); ++ float sqrtf(float x); + +- pure double erf(double x); +- pure float erff(float x); +- pure real erfl(real x) { return erf(x); } ++ double erf(double x); ++ float erff(float x); ++ real erfl(real x) { return erf(x); } + +- pure double erfc(double x); +- pure float erfcf(float x); +- pure real erfcl(real x) { return erfc(x); } ++ double erfc(double x); ++ float erfcf(float x); ++ real erfcl(real x) { return erfc(x); } + +- double lgamma(double x); +- float lgammaf(float x); +- real lgammal(real x) { return lgamma(x); } ++ double lgamma(double x); ++ float lgammaf(float x); ++ real lgammal(real x) { return lgamma(x); } + +- pure double tgamma(double x); +- pure float tgammaf(float x); +- pure real tgammal(real x) { return tgamma(x); } ++ double tgamma(double x); ++ float tgammaf(float x); ++ real tgammal(real x) { return tgamma(x); } + +- pure double ceil(double x); +- pure float ceilf(float x); ++ double ceil(double x); ++ float ceilf(float x); + +- pure double floor(double x); +- pure float floorf(float x); ++ double floor(double x); ++ float floorf(float x); + +- pure double nearbyint(double x); +- pure float nearbyintf(float x); ++ double nearbyint(double x); ++ float nearbyintf(float x); + +- pure double rint(double x); +- pure float rintf(float x); ++ double rint(double x); ++ float rintf(float x); + +- pure c_long lrint(double x); +- pure c_long lrintf(float x); ++ c_long lrint(double x); ++ c_long lrintf(float x); + +- pure long llrint(double x); +- pure long llrintf(float x); +- pure long llrintl(real x) { return llrint(x); } ++ long llrint(double x); ++ long llrintf(float x); ++ long llrintl(real x) { return llrint(x); } + +- pure double round(double x); +- pure float roundf(float x); ++ double round(double x); ++ float roundf(float x); + +- pure c_long lround(double x); +- pure c_long lroundf(float x); ++ c_long lround(double x); ++ c_long lroundf(float x); + +- pure long llround(double x); +- pure long llroundf(float x); ++ long llround(double x); ++ long llroundf(float x); + +- pure double trunc(double x); +- pure float truncf(float x); ++ double trunc(double x); ++ float truncf(float x); + +- pure double fmod(double x, double y); +- pure float fmodf(float x, float y); ++ double fmod(double x, double y); ++ float fmodf(float x, float y); + +- pure double remainder(double x, double y); +- pure float remainderf(float x, float y); ++ double remainder(double x, double y); ++ float remainderf(float x, float y); + +- double remquo(double x, double y, int* quo); +- float remquof(float x, float y, int* quo); ++ double remquo(double x, double y, int* quo); ++ float remquof(float x, float y, int* quo); + +- pure double copysign(double x, double y); +- pure float copysignf(float x, float y); ++ double copysign(double x, double y); ++ float copysignf(float x, float y); + +- pure double nextafter(double x, double y); +- pure float nextafterf(float x, float y); ++ double nextafter(double x, double y); ++ float nextafterf(float x, float y); + +- pure double nexttoward(double x, real y); +- pure float nexttowardf(float x, real y); ++ double nexttoward(double x, real y); ++ float nexttowardf(float x, real y); + +- pure double fdim(double x, double y); +- pure float fdimf(float x, float y); ++ double fdim(double x, double y); ++ float fdimf(float x, float y); + +- pure double fmax(double x, double y); +- pure float fmaxf(float x, float y); ++ double fmax(double x, double y); ++ float fmaxf(float x, float y); + +- pure double fmin(double x, double y); +- pure float fminf(float x, float y); ++ double fmin(double x, double y); ++ float fminf(float x, float y); + +- pure double fma(double x, double y, double z); +- pure float fmaf(float x, float y, float z); ++ double fma(double x, double y, double z); ++ float fmaf(float x, float y, float z); + } + else + { +- pure double acos(double x); +- pure float acosf(float x); +- pure real acosl(real x); +- +- pure double asin(double x); +- pure float asinf(float x); +- pure real asinl(real x); +- +- pure double atan(double x); +- pure float atanf(float x); +- pure real atanl(real x); +- +- pure double atan2(double y, double x); +- pure float atan2f(float y, float x); +- pure real atan2l(real y, real x); +- +- pure double cos(double x); +- pure float cosf(float x); +- pure real cosl(real x); +- +- pure double sin(double x); +- pure float sinf(float x); +- pure real sinl(real x); +- +- pure double tan(double x); +- pure float tanf(float x); +- pure real tanl(real x); +- +- pure double acosh(double x); +- pure float acoshf(float x); +- pure real acoshl(real x); +- +- pure double asinh(double x); +- pure float asinhf(float x); +- pure real asinhl(real x); +- +- pure double atanh(double x); +- pure float atanhf(float x); +- pure real atanhl(real x); +- +- pure double cosh(double x); +- pure float coshf(float x); +- pure real coshl(real x); +- +- pure double sinh(double x); +- pure float sinhf(float x); +- pure real sinhl(real x); +- +- pure double tanh(double x); +- pure float tanhf(float x); +- pure real tanhl(real x); +- +- pure double exp(double x); +- pure float expf(float x); +- pure real expl(real x); +- +- pure double exp2(double x); +- pure float exp2f(float x); +- pure real exp2l(real x); +- +- pure double expm1(double x); +- pure float expm1f(float x); +- pure real expm1l(real x); +- +- double frexp(double value, int* exp); +- float frexpf(float value, int* exp); +- real frexpl(real value, int* exp); +- +- pure int ilogb(double x); +- pure int ilogbf(float x); +- pure int ilogbl(real x); +- +- pure double ldexp(double x, int exp); +- pure float ldexpf(float x, int exp); +- pure real ldexpl(real x, int exp); +- +- pure double log(double x); +- pure float logf(float x); +- pure real logl(real x); +- +- pure double log10(double x); +- pure float log10f(float x); +- pure real log10l(real x); +- +- pure double log1p(double x); +- pure float log1pf(float x); +- pure real log1pl(real x); +- +- pure double log2(double x); +- pure float log2f(float x); +- pure real log2l(real x); +- +- pure double logb(double x); +- pure float logbf(float x); +- pure real logbl(real x); +- +- pure double modf(double value, double* iptr); +- pure float modff(float value, float* iptr); +- pure real modfl(real value, real *iptr); +- +- pure double scalbn(double x, int n); +- pure float scalbnf(float x, int n); +- pure real scalbnl(real x, int n); +- +- pure double scalbln(double x, c_long n); +- pure float scalblnf(float x, c_long n); +- pure real scalblnl(real x, c_long n); +- +- pure double cbrt(double x); +- pure float cbrtf(float x); +- pure real cbrtl(real x); +- +- pure double fabs(double x); +- pure float fabsf(float x); +- pure real fabsl(real x); +- +- pure double hypot(double x, double y); +- pure float hypotf(float x, float y); +- pure real hypotl(real x, real y); +- +- pure double pow(double x, double y); +- pure float powf(float x, float y); +- pure real powl(real x, real y); +- +- pure double sqrt(double x); +- pure float sqrtf(float x); +- pure real sqrtl(real x); +- +- pure double erf(double x); +- pure float erff(float x); +- pure real erfl(real x); +- +- pure double erfc(double x); +- pure float erfcf(float x); +- pure real erfcl(real x); +- +- double lgamma(double x); +- float lgammaf(float x); +- real lgammal(real x); +- +- pure double tgamma(double x); +- pure float tgammaf(float x); +- pure real tgammal(real x); +- +- pure double ceil(double x); +- pure float ceilf(float x); +- pure real ceill(real x); +- +- pure double floor(double x); +- pure float floorf(float x); +- pure real floorl(real x); +- +- pure double nearbyint(double x); +- pure float nearbyintf(float x); +- pure real nearbyintl(real x); +- +- pure double rint(double x); +- pure float rintf(float x); +- pure real rintl(real x); +- +- pure c_long lrint(double x); +- pure c_long lrintf(float x); +- pure c_long lrintl(real x); +- +- pure long llrint(double x); +- pure long llrintf(float x); +- pure long llrintl(real x); +- +- pure double round(double x); +- pure float roundf(float x); +- pure real roundl(real x); +- +- pure c_long lround(double x); +- pure c_long lroundf(float x); +- pure c_long lroundl(real x); +- +- pure long llround(double x); +- pure long llroundf(float x); +- pure long llroundl(real x); +- +- pure double trunc(double x); +- pure float truncf(float x); +- pure real truncl(real x); +- +- pure double fmod(double x, double y); +- pure float fmodf(float x, float y); +- pure real fmodl(real x, real y); +- +- pure double remainder(double x, double y); +- pure float remainderf(float x, float y); +- pure real remainderl(real x, real y); +- +- double remquo(double x, double y, int* quo); +- float remquof(float x, float y, int* quo); +- real remquol(real x, real y, int* quo); +- +- pure double copysign(double x, double y); +- pure float copysignf(float x, float y); +- pure real copysignl(real x, real y); +- +- pure double nan(char* tagp); +- pure float nanf(char* tagp); +- pure real nanl(char* tagp); +- +- pure double nextafter(double x, double y); +- pure float nextafterf(float x, float y); +- pure real nextafterl(real x, real y); +- +- pure double nexttoward(double x, real y); +- pure float nexttowardf(float x, real y); +- pure real nexttowardl(real x, real y); +- +- pure double fdim(double x, double y); +- pure float fdimf(float x, float y); +- pure real fdiml(real x, real y); +- +- pure double fmax(double x, double y); +- pure float fmaxf(float x, float y); +- pure real fmaxl(real x, real y); +- +- pure double fmin(double x, double y); +- pure float fminf(float x, float y); +- pure real fminl(real x, real y); +- +- pure double fma(double x, double y, double z); +- pure float fmaf(float x, float y, float z); +- pure real fmal(real x, real y, real z); ++ double acos(double x); ++ float acosf(float x); ++ real acosl(real x); ++ ++ double asin(double x); ++ float asinf(float x); ++ real asinl(real x); ++ ++ double atan(double x); ++ float atanf(float x); ++ real atanl(real x); ++ ++ double atan2(double y, double x); ++ float atan2f(float y, float x); ++ real atan2l(real y, real x); ++ ++ double cos(double x); ++ float cosf(float x); ++ real cosl(real x); ++ ++ double sin(double x); ++ float sinf(float x); ++ real sinl(real x); ++ ++ double tan(double x); ++ float tanf(float x); ++ real tanl(real x); ++ ++ double acosh(double x); ++ float acoshf(float x); ++ real acoshl(real x); ++ ++ double asinh(double x); ++ float asinhf(float x); ++ real asinhl(real x); ++ ++ double atanh(double x); ++ float atanhf(float x); ++ real atanhl(real x); ++ ++ double cosh(double x); ++ float coshf(float x); ++ real coshl(real x); ++ ++ double sinh(double x); ++ float sinhf(float x); ++ real sinhl(real x); ++ ++ double tanh(double x); ++ float tanhf(float x); ++ real tanhl(real x); ++ ++ double exp(double x); ++ float expf(float x); ++ real expl(real x); ++ ++ double exp2(double x); ++ float exp2f(float x); ++ real exp2l(real x); ++ ++ double expm1(double x); ++ float expm1f(float x); ++ real expm1l(real x); ++ ++ double frexp(double value, int* exp); ++ float frexpf(float value, int* exp); ++ real frexpl(real value, int* exp); ++ ++ int ilogb(double x); ++ int ilogbf(float x); ++ int ilogbl(real x); ++ ++ double ldexp(double x, int exp); ++ float ldexpf(float x, int exp); ++ real ldexpl(real x, int exp); ++ ++ double log(double x); ++ float logf(float x); ++ real logl(real x); ++ ++ double log10(double x); ++ float log10f(float x); ++ real log10l(real x); ++ ++ double log1p(double x); ++ float log1pf(float x); ++ real log1pl(real x); ++ ++ double log2(double x); ++ float log2f(float x); ++ real log2l(real x); ++ ++ double logb(double x); ++ float logbf(float x); ++ real logbl(real x); ++ ++ double modf(double value, double* iptr); ++ float modff(float value, float* iptr); ++ real modfl(real value, real *iptr); ++ ++ double scalbn(double x, int n); ++ float scalbnf(float x, int n); ++ real scalbnl(real x, int n); ++ ++ double scalbln(double x, c_long n); ++ float scalblnf(float x, c_long n); ++ real scalblnl(real x, c_long n); ++ ++ double cbrt(double x); ++ float cbrtf(float x); ++ real cbrtl(real x); ++ ++ double fabs(double x); ++ float fabsf(float x); ++ real fabsl(real x); ++ ++ double hypot(double x, double y); ++ float hypotf(float x, float y); ++ real hypotl(real x, real y); ++ ++ double pow(double x, double y); ++ float powf(float x, float y); ++ real powl(real x, real y); ++ ++ double sqrt(double x); ++ float sqrtf(float x); ++ real sqrtl(real x); ++ ++ double erf(double x); ++ float erff(float x); ++ real erfl(real x); ++ ++ double erfc(double x); ++ float erfcf(float x); ++ real erfcl(real x); ++ ++ double lgamma(double x); ++ float lgammaf(float x); ++ real lgammal(real x); ++ ++ double tgamma(double x); ++ float tgammaf(float x); ++ real tgammal(real x); ++ ++ double ceil(double x); ++ float ceilf(float x); ++ real ceill(real x); ++ ++ double floor(double x); ++ float floorf(float x); ++ real floorl(real x); ++ ++ double nearbyint(double x); ++ float nearbyintf(float x); ++ real nearbyintl(real x); ++ ++ double rint(double x); ++ float rintf(float x); ++ real rintl(real x); ++ ++ c_long lrint(double x); ++ c_long lrintf(float x); ++ c_long lrintl(real x); ++ ++ long llrint(double x); ++ long llrintf(float x); ++ long llrintl(real x); ++ ++ double round(double x); ++ float roundf(float x); ++ real roundl(real x); ++ ++ c_long lround(double x); ++ c_long lroundf(float x); ++ c_long lroundl(real x); ++ ++ long llround(double x); ++ long llroundf(float x); ++ long llroundl(real x); ++ ++ double trunc(double x); ++ float truncf(float x); ++ real truncl(real x); ++ ++ double fmod(double x, double y); ++ float fmodf(float x, float y); ++ real fmodl(real x, real y); ++ ++ double remainder(double x, double y); ++ float remainderf(float x, float y); ++ real remainderl(real x, real y); ++ ++ double remquo(double x, double y, int* quo); ++ float remquof(float x, float y, int* quo); ++ real remquol(real x, real y, int* quo); ++ ++ double copysign(double x, double y); ++ float copysignf(float x, float y); ++ real copysignl(real x, real y); ++ ++ double nan(char* tagp); ++ float nanf(char* tagp); ++ real nanl(char* tagp); ++ ++ double nextafter(double x, double y); ++ float nextafterf(float x, float y); ++ real nextafterl(real x, real y); ++ ++ double nexttoward(double x, real y); ++ float nexttowardf(float x, real y); ++ real nexttowardl(real x, real y); ++ ++ double fdim(double x, double y); ++ float fdimf(float x, float y); ++ real fdiml(real x, real y); ++ ++ double fmax(double x, double y); ++ float fmaxf(float x, float y); ++ real fmaxl(real x, real y); ++ ++ double fmin(double x, double y); ++ float fminf(float x, float y); ++ real fminl(real x, real y); ++ ++ double fma(double x, double y, double z); ++ float fmaf(float x, float y, float z); ++ real fmal(real x, real y, real z); + } +--- a/src/libphobos/libdruntime/core/stdc/stdint.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/stdint.d 2014-04-01 16:32:51.000000000 +0100 +@@ -25,68 +25,64 @@ private import core.stdc.stddef; // for + private import core.stdc.signal; // for sig_atomic_t + private import core.stdc.wchar_; // for wint_t + +-private +-{ +- template typify(T) +- { +- T typify( T val ) { return val; } +- } +-} ++ ++// Can't be `private` because of @@@BUG11173@@@. ++T _typify(T)(T val) @safe pure nothrow { return val; } + + extern (C): + @trusted: // Types and constants only. + nothrow: + +-alias byte int8_t; +-alias short int16_t; +-alias int int32_t; +-alias long int64_t; +-//alias cent int128_t; +- +-alias ubyte uint8_t; +-alias ushort uint16_t; +-alias uint uint32_t; +-alias ulong uint64_t; +-//alias ucent uint128_t; +- +-alias byte int_least8_t; +-alias short int_least16_t; +-alias int int_least32_t; +-alias long int_least64_t; +- +-alias ubyte uint_least8_t; +-alias ushort uint_least16_t; +-alias uint uint_least32_t; +-alias ulong uint_least64_t; +- +-alias byte int_fast8_t; +-alias int int_fast16_t; +-alias int int_fast32_t; +-alias long int_fast64_t; +- +-alias ubyte uint_fast8_t; +-alias uint uint_fast16_t; +-alias uint uint_fast32_t; +-alias ulong uint_fast64_t; ++alias int8_t = byte ; ++alias int16_t = short; ++alias int32_t = int ; ++alias int64_t = long ; ++//alias int128_t = cent; ++ ++alias uint8_t = ubyte ; ++alias uint16_t = ushort; ++alias uint32_t = uint ; ++alias uint64_t = ulong ; ++//alias uint128_t = ucent; ++ ++alias int_least8_t = byte ; ++alias int_least16_t = short; ++alias int_least32_t = int ; ++alias int_least64_t = long ; ++ ++alias uint_least8_t = ubyte ; ++alias uint_least16_t = ushort; ++alias uint_least32_t = uint ; ++alias uint_least64_t = ulong ; ++ ++alias int_fast8_t = byte; ++alias int_fast16_t = int ; ++alias int_fast32_t = int ; ++alias int_fast64_t = long; ++ ++alias uint_fast8_t = ubyte; ++alias uint_fast16_t = uint ; ++alias uint_fast32_t = uint ; ++alias uint_fast64_t = ulong; + + version( GNU ) + { +- alias __builtin_pointer_int intptr_t; +- alias __builtin_pointer_uint uintptr_t; ++ alias intptr_t = __builtin_pointer_int; ++ alias uintptr_t = __builtin_pointer_uint; + } + else version( D_LP64 ) + { +- alias long intptr_t; +- alias ulong uintptr_t; ++ alias intptr_t = long ; ++ alias uintptr_t = ulong; + } + else + { +- alias int intptr_t; +- alias uint uintptr_t; ++ alias intptr_t = int ; ++ alias uintptr_t = uint; + } + +-alias long intmax_t; +-alias ulong uintmax_t; ++alias intmax_t = long ; ++alias uintmax_t = ulong; + + enum int8_t INT8_MIN = int8_t.min; + enum int8_t INT8_MAX = int8_t.max; +@@ -155,15 +151,15 @@ enum wchar_t WCHAR_MAX = wchar_t.max; + enum wint_t WINT_MIN = wint_t.min; + enum wint_t WINT_MAX = wint_t.max; + +-alias typify!(int8_t) INT8_C; +-alias typify!(int16_t) INT16_C; +-alias typify!(int32_t) INT32_C; +-alias typify!(int64_t) INT64_C; +- +-alias typify!(uint8_t) UINT8_C; +-alias typify!(uint16_t) UINT16_C; +-alias typify!(uint32_t) UINT32_C; +-alias typify!(uint64_t) UINT64_C; ++alias INT8_C = _typify!int8_t ; ++alias INT16_C = _typify!int16_t; ++alias INT32_C = _typify!int32_t; ++alias INT64_C = _typify!int64_t; ++ ++alias UINT8_C = _typify!uint8_t ; ++alias UINT16_C = _typify!uint16_t; ++alias UINT32_C = _typify!uint32_t; ++alias UINT64_C = _typify!uint64_t; + +-alias typify!(intmax_t) INTMAX_C; +-alias typify!(uintmax_t) UINTMAX_C; ++alias INTMAX_C = _typify!intmax_t ; ++alias UINTMAX_C = _typify!uintmax_t; +--- a/src/libphobos/libdruntime/core/stdc/stdio.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/stdio.d 2014-04-01 16:32:51.000000000 +0100 +@@ -187,7 +187,9 @@ else version( Win64 ) + } + else version( linux ) + { +- align(1) struct _iobuf ++ alias _iobuf = _IO_FILE; ++ ++ align(1) struct _IO_FILE + { + int _flags; + char* _read_ptr; +@@ -337,36 +339,36 @@ version( Win32 ) + _IOAPP = 0x200, // non-standard + } + +- version( MinGW ) ++ version( MinGW ) ++ { ++ private extern + { +- private extern +- { +- __gshared export FILE[5] _iob; +- } +- +- __gshared FILE* stdin; +- __gshared FILE* stdout; +- __gshared FILE* stderr; +- +- shared static this() +- { +- stdin = &_iob[0]; +- stdout = &_iob[1]; +- stderr = &_iob[2]; +- } +- } +- else +- { +- extern shared void function() _fcloseallp; +- +- private extern shared FILE[_NFILE] _iob; +- +- shared stdin = &_iob[0]; +- shared stdout = &_iob[1]; +- shared stderr = &_iob[2]; +- shared stdaux = &_iob[3]; +- shared stdprn = &_iob[4]; ++ __gshared export FILE[5] _iob; + } ++ ++ __gshared FILE* stdin; ++ __gshared FILE* stdout; ++ __gshared FILE* stderr; ++ ++ shared static this() ++ { ++ stdin = &_iob[0]; ++ stdout = &_iob[1]; ++ stderr = &_iob[2]; ++ } ++ } ++ else ++ { ++ extern shared void function() _fcloseallp; ++ ++ private extern shared FILE[_NFILE] _iob; ++ ++ shared stdin = &_iob[0]; ++ shared stdout = &_iob[1]; ++ shared stderr = &_iob[2]; ++ shared stdaux = &_iob[3]; ++ shared stdprn = &_iob[4]; ++ } + } + else version( Win64 ) + { +@@ -508,18 +510,61 @@ FILE* freopen(in char* filename, in char + void setbuf(FILE* stream, char* buf); + int setvbuf(FILE* stream, char* buf, int mode, size_t size); + +-int fprintf(FILE* stream, in char* format, ...); +-int fscanf(FILE* stream, in char* format, ...); +-int sprintf(char* s, in char* format, ...); +-int sscanf(in char* s, in char* format, ...); +-int vfprintf(FILE* stream, in char* format, va_list arg); +-int vfscanf(FILE* stream, in char* format, va_list arg); +-int vsprintf(char* s, in char* format, va_list arg); +-int vsscanf(in char* s, in char* format, va_list arg); +-int vprintf(in char* format, va_list arg); +-int vscanf(in char* format, va_list arg); +-int printf(in char* format, ...); +-int scanf(in char* format, ...); ++version (MinGW) ++{ ++ // Prefer the MinGW versions over the MSVC ones, as the latter don't handle ++ // reals at all. ++ int __mingw_fprintf(FILE* stream, in char* format, ...); ++ alias __mingw_fprintf fprintf; ++ ++ int __mingw_fscanf(FILE* stream, in char* format, ...); ++ alias __mingw_fscanf fscanf; ++ ++ int __mingw_sprintf(char* s, in char* format, ...); ++ alias __mingw_sprintf sprintf; ++ ++ int __mingw_sscanf(in char* s, in char* format, ...); ++ alias __mingw_sscanf sscanf; ++ ++ int __mingw_vfprintf(FILE* stream, in char* format, va_list arg); ++ alias __mingw_vfprintf vfprintf; ++ ++ int __mingw_vfscanf(FILE* stream, in char* format, va_list arg); ++ alias __mingw_vfscanf vfscanf; ++ ++ int __mingw_vsprintf(char* s, in char* format, va_list arg); ++ alias __mingw_vsprintf vsprintf; ++ ++ int __mingw_vsscanf(in char* s, in char* format, va_list arg); ++ alias __mingw_vsscanf vsscanf; ++ ++ int __mingw_vprintf(in char* format, va_list arg); ++ alias __mingw_vprintf vprintf; ++ ++ int __mingw_vscanf(in char* format, va_list arg); ++ alias __mingw_vscanf vscanf; ++ ++ int __mingw_printf(in char* format, ...); ++ alias __mingw_printf printf; ++ ++ int __mingw_scanf(in char* format, ...); ++ alias __mingw_scanf scanf; ++} ++else ++{ ++ int fprintf(FILE* stream, in char* format, ...); ++ int fscanf(FILE* stream, in char* format, ...); ++ int sprintf(char* s, in char* format, ...); ++ int sscanf(in char* s, in char* format, ...); ++ int vfprintf(FILE* stream, in char* format, va_list arg); ++ int vfscanf(FILE* stream, in char* format, va_list arg); ++ int vsprintf(char* s, in char* format, va_list arg); ++ int vsscanf(in char* s, in char* format, va_list arg); ++ int vprintf(in char* format, va_list arg); ++ int vscanf(in char* format, va_list arg); ++ int printf(in char* format, ...); ++ int scanf(in char* format, ...); ++} + + // No usafe pointer manipulation. + @trusted +@@ -557,7 +602,25 @@ size_t fwrite(in void* ptr, size_t size, + c_long ftell(FILE* stream); + } + +-version( Win32 ) ++version( MinGW ) ++{ ++ // No unsafe pointer manipulation. ++ extern (D) @trusted ++ { ++ void rewind(FILE* stream) { fseek(stream,0L,SEEK_SET); stream._flag&=~_IOERR; } ++ pure void clearerr(FILE* stream) { stream._flag &= ~(_IOERR|_IOEOF); } ++ pure int feof(FILE* stream) { return stream._flag&_IOEOF; } ++ pure int ferror(FILE* stream) { return stream._flag&_IOERR; } ++ } ++ int __mingw_snprintf(char* s, size_t n, in char* fmt, ...); ++ alias __mingw_snprintf _snprintf; ++ alias __mingw_snprintf snprintf; ++ ++ int __mingw_vsnprintf(char* s, size_t n, in char* format, va_list arg); ++ alias __mingw_vsnprintf _vsnprintf; ++ alias __mingw_vsnprintf vsnprintf; ++} ++else version( Win32 ) + { + // No unsafe pointer manipulation. + extern (D) @trusted +@@ -590,6 +653,9 @@ else version( Win64 ) + int _vsnprintf(char* s, size_t n, in char* format, va_list arg); + alias _vsnprintf vsnprintf; + ++ uint _set_output_format(uint format); ++ enum _TWO_DIGIT_EXPONENT = 1; ++ + int _filbuf(FILE *fp); + int _flsbuf(int c, FILE *fp); + +--- a/src/libphobos/libdruntime/core/stdc/stdlib.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/stdlib.d 2014-04-01 16:32:51.000000000 +0100 +@@ -67,6 +67,11 @@ version (Win64) + return strtod(nptr, endptr); + } + } ++else version (MinGW) ++{ ++ real __mingw_strtold(in char* nptr, char** endptr); ++ alias __mingw_strtold strtold; ++} + else + { + real strtold(in char* nptr, char** endptr); +@@ -124,7 +129,7 @@ version( DigitalMars ) + } + else version( GNU ) + { +- void* alloca(size_t size); // compiler intrinsic. ++ void* alloca(size_t size); // compiler intrinsic + } + + version (Win64) +@@ -135,3 +140,4 @@ version (Win64) + long _strtoi64(in char *,char **,int); + long _wcstoi64(in wchar *,wchar **,int); + } ++ +--- a/src/libphobos/libdruntime/core/stdc/string.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/string.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,14 +22,14 @@ nothrow: + + pure void* memchr(in void* s, int c, size_t n); + pure int memcmp(in void* s1, in void* s2, size_t n); +-void* memcpy(void* s1, in void* s2, size_t n); +-void* memmove(void* s1, in void* s2, size_t n); +-void* memset(void* s, int c, size_t n); ++pure void* memcpy(void* s1, in void* s2, size_t n); ++pure void* memmove(void* s1, in void* s2, size_t n); ++pure void* memset(void* s, int c, size_t n); + +-char* strcpy(char* s1, in char* s2); +-char* strncpy(char* s1, in char* s2, size_t n); +-char* strcat(char* s1, in char* s2); +-char* strncat(char* s1, in char* s2, size_t n); ++pure char* strcpy(char* s1, in char* s2); ++pure char* strncpy(char* s1, in char* s2, size_t n); ++pure char* strcat(char* s1, in char* s2); ++pure char* strncat(char* s1, in char* s2, size_t n); + pure int strcmp(in char* s1, in char* s2); + int strcoll(in char* s1, in char* s2); + pure int strncmp(in char* s1, in char* s2, size_t n); +--- a/src/libphobos/libdruntime/core/stdc/tgmath.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/tgmath.d 2014-04-01 16:32:51.000000000 +0100 +@@ -168,13 +168,13 @@ version( FreeBSD ) + alias core.stdc.math.log1pf log1p; + alias core.stdc.math.log1pl log1p; + +- alias core.stdc.math.log2 log1p; +- alias core.stdc.math.log2f log1p; +- alias core.stdc.math.log2l log1p; +- +- alias core.stdc.math.logb log1p; +- alias core.stdc.math.logbf log1p; +- alias core.stdc.math.logbl log1p; ++ alias core.stdc.math.log2 log2; ++ alias core.stdc.math.log2f log2; ++ alias core.stdc.math.log2l log2; ++ ++ alias core.stdc.math.logb logb; ++ alias core.stdc.math.logbf logb; ++ alias core.stdc.math.logbl logb; + + alias core.stdc.math.modf modf; + alias core.stdc.math.modff modf; +@@ -486,13 +486,13 @@ else + alias core.stdc.math.log1pf log1p; + alias core.stdc.math.log1pl log1p; + +- alias core.stdc.math.log2 log1p; +- alias core.stdc.math.log2f log1p; +- alias core.stdc.math.log2l log1p; +- +- alias core.stdc.math.logb log1p; +- alias core.stdc.math.logbf log1p; +- alias core.stdc.math.logbl log1p; ++ alias core.stdc.math.log2 log2; ++ alias core.stdc.math.log2f log2; ++ alias core.stdc.math.log2l log2; ++ ++ alias core.stdc.math.logb logb; ++ alias core.stdc.math.logbf logb; ++ alias core.stdc.math.logbl logb; + + alias core.stdc.math.modf modf; + alias core.stdc.math.modff modf; +--- a/src/libphobos/libdruntime/core/stdc/time.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/stdc/time.d 2014-04-01 16:32:51.000000000 +0100 +@@ -55,8 +55,15 @@ else + } + } + +-alias c_long time_t; +-alias c_long clock_t; ++version ( Posix ) ++{ ++ public import core.sys.posix.sys.types : time_t, clock_t; ++} ++else ++{ ++ alias c_long time_t; ++ alias c_long clock_t; ++} + + version( Windows ) + { +--- a/src/libphobos/libdruntime/core/sync/condition.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sync/condition.d 2014-04-01 16:32:51.000000000 +0100 +@@ -211,39 +211,6 @@ class Condition + + + /** +- * $(RED Deprecated. It will be removed in December 2012. Please use the +- * version which takes a $(D Duration) instead.) +- * +- * Suspends the calling thread until a notification occurs or until the +- * supplied time period has elapsed. +- * +- * Params: +- * period = The time to wait, in 100 nanosecond intervals. This value may +- * be adjusted to equal the maximum wait period supported by the +- * target platform if it is too large. +- * +- * In: +- * period must be non-negative. +- * +- * Throws: +- * SyncException on error. +- * +- * Returns: +- * true if notified before the timeout and false if not. +- */ +- deprecated("Please use the overload of wait which takes a Duration.") +- bool wait( long period ) +- in +- { +- assert( period >= 0 ); +- } +- body +- { +- return wait( dur!"hnsecs"( period ) ); +- } +- +- +- /** + * Notifies one waiter. + * + * Throws: +@@ -597,8 +564,8 @@ version( unittest ) + waiting = true; + // we never want to miss the notification (30s) + alertedOne = condReady.wait( dur!"seconds"(30) ); +- // but we don't want to wait long for the timeout (1s) +- alertedTwo = condReady.wait( dur!"seconds"(1) ); ++ // but we don't want to wait long for the timeout (10ms) ++ alertedTwo = condReady.wait( dur!"msecs"(10) ); + } + } + +--- a/src/libphobos/libdruntime/core/sync/exception.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sync/exception.d 2014-04-01 16:32:51.000000000 +0100 +@@ -20,12 +20,12 @@ module core.sync.exception; + */ + class SyncException : Exception + { +- this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + super(msg, file, line, next); + } + +- this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) ++ @safe pure nothrow this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) + { + super(msg, file, line, next); + } +--- a/src/libphobos/libdruntime/core/sync/rwmutex.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sync/rwmutex.d 2014-04-01 16:32:51.000000000 +0100 +@@ -399,117 +399,138 @@ private: + //////////////////////////////////////////////////////////////////////////////// + + +-version( unittest ) ++unittest + { +- static if( !is( typeof( Thread ) ) ) +- private import core.thread; ++ import core.atomic, core.thread, core.sync.semaphore; + +- +- void testRead( ReadWriteMutex.Policy policy ) ++ static void runTest(ReadWriteMutex.Policy policy) + { +- auto mutex = new ReadWriteMutex( policy ); +- auto synInfo = new Object; +- int numThreads = 10; +- int numReaders = 0; +- int maxReaders = 0; ++ scope mutex = new ReadWriteMutex(policy); ++ scope rdSemA = new Semaphore, rdSemB = new Semaphore, ++ wrSemA = new Semaphore, wrSemB = new Semaphore; ++ shared size_t numReaders, numWriters; + + void readerFn() + { +- synchronized( mutex.reader ) ++ synchronized (mutex.reader) + { +- synchronized( synInfo ) +- { +- if( ++numReaders > maxReaders ) +- maxReaders = numReaders; +- } +- Thread.sleep( dur!"msecs"(1) ); +- synchronized( synInfo ) +- { +- --numReaders; +- } ++ atomicOp!"+="(numReaders, 1); ++ rdSemA.notify(); ++ rdSemB.wait(); ++ atomicOp!"-="(numReaders, 1); + } + } + +- auto group = new ThreadGroup; +- +- for( int i = 0; i < numThreads; ++i ) +- { +- group.create( &readerFn ); +- } +- group.joinAll(); +- assert( numReaders < 1 && maxReaders > 1 ); +- } +- +- +- void testReadWrite( ReadWriteMutex.Policy policy ) +- { +- auto mutex = new ReadWriteMutex( policy ); +- auto synInfo = new Object; +- int numThreads = 10; +- int numReaders = 0; +- int numWriters = 0; +- int maxReaders = 0; +- int maxWriters = 0; +- int numTries = 20; +- +- void readerFn() ++ void writerFn() + { +- for( int i = 0; i < numTries; ++i ) ++ synchronized (mutex.writer) + { +- synchronized( mutex.reader ) +- { +- synchronized( synInfo ) +- { +- if( ++numReaders > maxReaders ) +- maxReaders = numReaders; +- } +- Thread.sleep( dur!"msecs"(1) ); +- synchronized( synInfo ) +- { +- --numReaders; +- } +- } ++ atomicOp!"+="(numWriters, 1); ++ wrSemA.notify(); ++ wrSemB.wait(); ++ atomicOp!"-="(numWriters, 1); + } + } + +- void writerFn() ++ void waitQueued(size_t queuedReaders, size_t queuedWriters) + { +- for( int i = 0; i < numTries; ++i ) ++ for (;;) + { +- synchronized( mutex.writer ) ++ synchronized (mutex.m_commonMutex) + { +- synchronized( synInfo ) +- { +- if( ++numWriters > maxWriters ) +- maxWriters = numWriters; +- } +- Thread.sleep( dur!"msecs"(1) ); +- synchronized( synInfo ) +- { +- --numWriters; +- } ++ if (mutex.m_numQueuedReaders == queuedReaders && ++ mutex.m_numQueuedWriters == queuedWriters) ++ break; + } ++ Thread.yield(); + } + } + +- auto group = new ThreadGroup; ++ scope group = new ThreadGroup; + +- for( int i = 0; i < numThreads; ++i ) +- { +- group.create( &readerFn ); +- group.create( &writerFn ); +- } ++ // 2 simultaneous readers ++ group.create(&readerFn); group.create(&readerFn); ++ rdSemA.wait(); rdSemA.wait(); ++ assert(numReaders == 2); ++ rdSemB.notify(); rdSemB.notify(); + group.joinAll(); +- assert( numReaders < 1 && maxReaders > 1 && +- numWriters < 1 && maxWriters < 2 ); +- } ++ assert(numReaders == 0); ++ foreach (t; group) group.remove(t); + ++ // 1 writer at a time ++ group.create(&writerFn); group.create(&writerFn); ++ wrSemA.wait(); ++ assert(!wrSemA.tryWait()); ++ assert(numWriters == 1); ++ wrSemB.notify(); ++ wrSemA.wait(); ++ assert(numWriters == 1); ++ wrSemB.notify(); ++ group.joinAll(); ++ assert(numWriters == 0); ++ foreach (t; group) group.remove(t); + +- unittest +- { +- testRead( ReadWriteMutex.Policy.PREFER_READERS ); +- testRead( ReadWriteMutex.Policy.PREFER_WRITERS ); +- testReadWrite( ReadWriteMutex.Policy.PREFER_READERS ); +- testReadWrite( ReadWriteMutex.Policy.PREFER_WRITERS ); ++ // reader and writer are mutually exclusive ++ group.create(&readerFn); ++ rdSemA.wait(); ++ group.create(&writerFn); ++ waitQueued(0, 1); ++ assert(!wrSemA.tryWait()); ++ assert(numReaders == 1 && numWriters == 0); ++ rdSemB.notify(); ++ wrSemA.wait(); ++ assert(numReaders == 0 && numWriters == 1); ++ wrSemB.notify(); ++ group.joinAll(); ++ assert(numReaders == 0 && numWriters == 0); ++ foreach (t; group) group.remove(t); ++ ++ // writer and reader are mutually exclusive ++ group.create(&writerFn); ++ wrSemA.wait(); ++ group.create(&readerFn); ++ waitQueued(1, 0); ++ assert(!rdSemA.tryWait()); ++ assert(numReaders == 0 && numWriters == 1); ++ wrSemB.notify(); ++ rdSemA.wait(); ++ assert(numReaders == 1 && numWriters == 0); ++ rdSemB.notify(); ++ group.joinAll(); ++ assert(numReaders == 0 && numWriters == 0); ++ foreach (t; group) group.remove(t); ++ ++ // policy determines whether queued reader or writers progress first ++ group.create(&writerFn); ++ wrSemA.wait(); ++ group.create(&readerFn); ++ group.create(&writerFn); ++ waitQueued(1, 1); ++ assert(numReaders == 0 && numWriters == 1); ++ wrSemB.notify(); ++ ++ if (policy == ReadWriteMutex.Policy.PREFER_READERS) ++ { ++ rdSemA.wait(); ++ assert(numReaders == 1 && numWriters == 0); ++ rdSemB.notify(); ++ wrSemA.wait(); ++ assert(numReaders == 0 && numWriters == 1); ++ wrSemB.notify(); ++ } ++ else if (policy == ReadWriteMutex.Policy.PREFER_WRITERS) ++ { ++ wrSemA.wait(); ++ assert(numReaders == 0 && numWriters == 1); ++ wrSemB.notify(); ++ rdSemA.wait(); ++ assert(numReaders == 1 && numWriters == 0); ++ rdSemB.notify(); ++ } ++ group.joinAll(); ++ assert(numReaders == 0 && numWriters == 0); ++ foreach (t; group) group.remove(t); + } ++ runTest(ReadWriteMutex.Policy.PREFER_READERS); ++ runTest(ReadWriteMutex.Policy.PREFER_WRITERS); + } +--- a/src/libphobos/libdruntime/core/sync/semaphore.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sync/semaphore.d 2014-04-01 16:32:51.000000000 +0100 +@@ -171,7 +171,7 @@ class Semaphore + * period = The time to wait. + * + * In: +- * val must be non-negative. ++ * period must be non-negative. + * + * Throws: + * SyncException on error. +@@ -179,10 +179,10 @@ class Semaphore + * Returns: + * true if notified before the timeout and false if not. + */ +- bool wait( Duration val ) ++ bool wait( Duration period ) + in + { +- assert( !val.isNegative ); ++ assert( !period.isNegative ); + } + body + { +@@ -190,7 +190,7 @@ class Semaphore + { + auto maxWaitMillis = dur!("msecs")( uint.max - 1 ); + +- while( val > maxWaitMillis ) ++ while( period > maxWaitMillis ) + { + auto rc = WaitForSingleObject( m_hndl, cast(uint) + maxWaitMillis.total!"msecs" ); +@@ -199,13 +199,13 @@ class Semaphore + case WAIT_OBJECT_0: + return true; + case WAIT_TIMEOUT: +- val -= maxWaitMillis; ++ period -= maxWaitMillis; + continue; + default: + throw new SyncException( "Unable to wait for semaphore" ); + } + } +- switch( WaitForSingleObject( m_hndl, cast(uint) val.total!"msecs" ) ) ++ switch( WaitForSingleObject( m_hndl, cast(uint) period.total!"msecs" ) ) + { + case WAIT_OBJECT_0: + return true; +@@ -220,15 +220,15 @@ class Semaphore + mach_timespec_t t = void; + (cast(byte*) &t)[0 .. t.sizeof] = 0; + +- if( val.total!"seconds" > t.tv_sec.max ) ++ if( period.total!"seconds" > t.tv_sec.max ) + { + t.tv_sec = t.tv_sec.max; +- t.tv_nsec = cast(typeof(t.tv_nsec)) val.fracSec.nsecs; ++ t.tv_nsec = cast(typeof(t.tv_nsec)) period.fracSec.nsecs; + } + else + { +- t.tv_sec = cast(typeof(t.tv_sec)) val.total!"seconds"; +- t.tv_nsec = cast(typeof(t.tv_nsec)) val.fracSec.nsecs; ++ t.tv_sec = cast(typeof(t.tv_sec)) period.total!"seconds"; ++ t.tv_nsec = cast(typeof(t.tv_nsec)) period.fracSec.nsecs; + } + while( true ) + { +@@ -244,7 +244,7 @@ class Semaphore + else version( Posix ) + { + timespec t = void; +- mktspec( t, val ); ++ mktspec( t, period ); + + while( true ) + { +@@ -260,41 +260,6 @@ class Semaphore + + + /** +- * $(RED Deprecated. It will be removed in December 2012. Please use the +- * version which takes a $(D Duration) instead.) +- * +- * Suspends the calling thread until the current count moves above zero or +- * until the supplied time period has elapsed. If the count moves above +- * zero in this interval, then atomically decrement the count by one and +- * return true. Otherwise, return false. +- * +- * Params: +- * period = The time to wait, in 100 nanosecond intervals. This value may +- * be adjusted to equal to the maximum wait period supported by +- * the target platform if it is too large. +- * +- * In: +- * period must be non-negative. +- * +- * Throws: +- * SyncException on error. +- * +- * Returns: +- * true if notified before the timeout and false if not. +- */ +- deprecated("Please use the overload of wait which takes a Duration.") +- bool wait( long period ) +- in +- { +- assert( period >= 0 ); +- } +- body +- { +- return wait( dur!("hnsecs")( period ) ); +- } +- +- +- /** + * Atomically increment the current count by one. This will notify one + * waiter, if there are any in the queue. + * +@@ -389,158 +354,89 @@ private: + + version( unittest ) + { +- private import core.thread; +- ++ import core.thread, core.atomic; + + void testWait() + { +- auto semaphore = new Semaphore; +- int numToProduce = 10; +- bool allProduced = false; +- auto synProduced = new Object; +- int numConsumed = 0; +- auto synConsumed = new Object; +- int numConsumers = 10; +- int numComplete = 0; +- auto synComplete = new Object; ++ auto semaphore = new Semaphore; ++ shared bool stopConsumption = false; ++ immutable numToProduce = 20; ++ immutable numConsumers = 10; ++ shared size_t numConsumed; ++ shared size_t numComplete; + + void consumer() + { +- while( true ) ++ while (true) + { + semaphore.wait(); + +- synchronized( synProduced ) +- { +- if( allProduced ) +- break; +- } +- +- synchronized( synConsumed ) +- { +- ++numConsumed; +- } +- } +- +- synchronized( synComplete ) +- { +- ++numComplete; ++ if (atomicLoad(stopConsumption)) ++ break; ++ atomicOp!"+="(numConsumed, 1); + } ++ atomicOp!"+="(numComplete, 1); + } + + void producer() + { +- assert( !semaphore.tryWait() ); ++ assert(!semaphore.tryWait()); + +- for( int i = 0; i < numToProduce; ++i ) +- { ++ foreach (_; 0 .. numToProduce) + semaphore.notify(); +- Thread.yield(); +- } +- Thread.sleep( dur!"seconds"(1) ); +- synchronized( synProduced ) +- { +- allProduced = true; +- } + +- for( int i = 0; i < numConsumers; ++i ) +- { +- semaphore.notify(); ++ // wait until all items are consumed ++ while (atomicLoad(numConsumed) != numToProduce) + Thread.yield(); +- } + +- version (FreeBSD) enum factor = 500_000; +- else enum factor = 10_000; +- +- for( int i = numConsumers * factor; i > 0; --i ) +- { +- synchronized( synComplete ) +- { +- if( numComplete == numConsumers ) +- break; +- } +- Thread.yield(); +- } ++ // mark consumption as finished ++ atomicStore(stopConsumption, true); + +- { +- bool cond; +- synchronized( synComplete ) +- { +- cond = numComplete == numConsumers; +- } +- assert(cond); +- } ++ // wake all consumers ++ foreach (_; 0 .. numConsumers) ++ semaphore.notify(); + +- { +- bool cond; +- synchronized( synConsumed ) +- { +- cond = numConsumed == numToProduce; +- } +- assert(cond); +- } ++ // wait until all consumers completed ++ while (atomicLoad(numComplete) != numConsumers) ++ Thread.yield(); + +- assert( !semaphore.tryWait() ); ++ assert(!semaphore.tryWait()); + semaphore.notify(); +- assert( semaphore.tryWait() ); +- assert( !semaphore.tryWait() ); ++ assert(semaphore.tryWait()); ++ assert(!semaphore.tryWait()); + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numConsumers; ++i ) +- group.create( &consumer ); +- group.create( &producer ); ++ group.create(&consumer); ++ group.create(&producer); + group.joinAll(); + } + + + void testWaitTimeout() + { +- auto synReady = new Object; +- auto semReady = new Semaphore; +- bool alertedOne = true; +- bool alertedTwo = true; +- int numReady = 0; ++ auto sem = new Semaphore; ++ shared bool semReady; ++ bool alertedOne, alertedTwo; + + void waiter() + { +- synchronized( synReady ) +- { +- numReady++; +- } +- while( true ) +- { +- synchronized( synReady ) +- { +- if( numReady > 1 ) +- break; +- } ++ while (!atomicLoad(semReady)) + Thread.yield(); +- } +- alertedOne = semReady.wait( dur!"msecs"(100) ); +- alertedTwo = semReady.wait( dur!"msecs"(100) ); ++ alertedOne = sem.wait(dur!"msecs"(1)); ++ alertedTwo = sem.wait(dur!"msecs"(1)); ++ assert(alertedOne && !alertedTwo); + } + +- auto thread = new Thread( &waiter ); ++ auto thread = new Thread(&waiter); + thread.start(); + +- while( true ) +- { +- synchronized( synReady ) +- { +- if( numReady ) +- { +- numReady++; +- break; +- } +- } +- Thread.yield(); +- } +- Thread.yield(); +- semReady.notify(); ++ sem.notify(); ++ atomicStore(semReady, true); + thread.join(); +- assert( numReady == 2 && alertedOne && !alertedTwo ); ++ assert(alertedOne && !alertedTwo); + } + + +--- a/src/libphobos/libdruntime/core/sys/freebsd/sys/elf32.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/freebsd/sys/elf32.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,187 @@ ++/** ++ * D header file for FreeBSD. ++ * ++ * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf32.h?view=markup, sys/elf32.h) ++ */ ++module core.sys.freebsd.sys.elf32; ++ ++version (FreeBSD): ++extern (C): ++pure: ++nothrow: ++ ++import core.stdc.stdint; ++public import core.sys.freebsd.sys.elf_common; ++ ++alias uint16_t Elf32_Half; ++alias uint32_t Elf32_Word; ++alias int32_t Elf32_Sword; ++alias uint64_t Elf32_Lword; ++alias uint32_t Elf32_Addr; ++alias uint32_t Elf32_Off; ++alias Elf32_Word Elf32_Hashelt; ++alias Elf32_Word Elf32_Size; ++alias Elf32_Sword Elf32_Ssize; ++ ++struct Elf32_Ehdr ++{ ++ char e_ident[EI_NIDENT]; ++ Elf32_Half e_type; ++ Elf32_Half e_machine; ++ Elf32_Word e_version; ++ Elf32_Addr e_entry; ++ Elf32_Off e_phoff; ++ Elf32_Off e_shoff; ++ Elf32_Word e_flags; ++ Elf32_Half e_ehsize; ++ Elf32_Half e_phentsize; ++ Elf32_Half e_phnum; ++ Elf32_Half e_shentsize; ++ Elf32_Half e_shnum; ++ Elf32_Half e_shstrndx; ++} ++ ++struct Elf32_Shdr ++{ ++ Elf32_Word sh_name; ++ Elf32_Word sh_type; ++ Elf32_Word sh_flags; ++ Elf32_Addr sh_addr; ++ Elf32_Off sh_offset; ++ Elf32_Word sh_size; ++ Elf32_Word sh_link; ++ Elf32_Word sh_info; ++ Elf32_Word sh_addralign; ++ Elf32_Word sh_entsize; ++} ++ ++struct Elf32_Phdr ++{ ++ Elf32_Word p_type; ++ Elf32_Off p_offset; ++ Elf32_Addr p_vaddr; ++ Elf32_Addr p_paddr; ++ Elf32_Word p_filesz; ++ Elf32_Word p_memsz; ++ Elf32_Word p_flags; ++ Elf32_Word p_align; ++} ++ ++struct Elf32_Dyn ++{ ++ Elf32_Sword d_tag; ++ union _d_un ++ { ++ Elf32_Word d_val; ++ Elf32_Addr d_ptr; ++ } _d_un d_un; ++} ++ ++struct Elf32_Rel ++{ ++ Elf32_Addr r_offset; ++ Elf32_Word r_info; ++} ++ ++struct Elf32_Rela ++{ ++ Elf32_Addr r_offset; ++ Elf32_Word r_info; ++ Elf32_Sword r_addend; ++} ++ ++extern (D) ++{ ++ auto ELF32_R_SYM(V)(V val) { return val >> 8; } ++ auto ELF32_R_TYPE(V)(V val) { return val & 0xff; } ++ auto ELF32_R_INFO(S, T)(S sym, T type) { return (sym << 8) + (type & 0xff); } ++} ++ ++alias Elf_Note Elf32_Nhdr; ++ ++struct Elf32_Move ++{ ++ Elf32_Lword m_value; ++ Elf32_Word m_info; ++ Elf32_Word m_poffset; ++ Elf32_Half m_repeat; ++ Elf32_Half m_stride; ++} ++ ++extern (D) ++{ ++ auto ELF32_M_SYM(I)(I info) { return info >> 8; } ++ auto ELF32_M_SIZE(I)(I info) { return cast(ubyte)info; } ++ auto ELF32_M_INFO(S, SZ)(S sym, SZ size) { return (sym << 8) + cast(ubye)size; } ++} ++ ++struct Elf32_Cap ++{ ++ Elf32_Word c_tag; ++ union _c_un ++ { ++ Elf32_Word c_val; ++ Elf32_Addr c_ptr; ++ } _c_un c_un; ++} ++ ++struct Elf32_Sym ++{ ++ Elf32_Word st_name; ++ Elf32_Addr st_value; ++ Elf32_Word st_size; ++ ubyte st_info; ++ ubyte st_other; ++ Elf32_Half st_shndx; ++} ++ ++extern (D) ++{ ++ auto ELF32_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; } ++ auto ELF32_ST_TYPE(T)(T val) { return val & 0xf; } ++ auto ELF32_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); } ++ auto ELF32_ST_VISIBILITY(O)(O o) { return o & 0x03; } ++} ++ ++struct Elf32_Verdef ++{ ++ Elf32_Half vd_version; ++ Elf32_Half vd_flags; ++ Elf32_Half vd_ndx; ++ Elf32_Half vd_cnt; ++ Elf32_Word vd_hash; ++ Elf32_Word vd_aux; ++ Elf32_Word vd_next; ++} ++ ++struct Elf32_Verdaux ++{ ++ Elf32_Word vda_name; ++ Elf32_Word vda_next; ++} ++ ++struct Elf32_Verneed ++{ ++ Elf32_Half vn_version; ++ Elf32_Half vn_cnt; ++ Elf32_Word vn_file; ++ Elf32_Word vn_aux; ++ Elf32_Word vn_next; ++} ++ ++struct Elf32_Vernaux ++{ ++ Elf32_Word vna_hash; ++ Elf32_Half vna_flags; ++ Elf32_Half vna_other; ++ Elf32_Word vna_name; ++ Elf32_Word vna_next; ++} ++ ++alias Elf32_Half Elf32_Versym; ++ ++struct Elf32_Syminfo ++{ ++ Elf32_Half si_boundto; ++ Elf32_Half si_flags; ++} +--- a/src/libphobos/libdruntime/core/sys/freebsd/sys/elf64.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/freebsd/sys/elf64.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,193 @@ ++/** ++ * D header file for FreeBSD. ++ * ++ * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf64.h?view=markup, sys/elf64.h) ++ */ ++module core.sys.freebsd.sys.elf64; ++ ++version (FreeBSD): ++extern (C): ++pure: ++nothrow: ++ ++import core.stdc.stdint; ++public import core.sys.freebsd.sys.elf_common; ++ ++alias uint16_t Elf64_Half; ++alias uint32_t Elf64_Word; ++alias int32_t Elf64_Sword; ++alias uint64_t Elf64_Lword; ++alias uint64_t Elf64_Xword; ++alias int64_t Elf64_Sxword; ++alias uint64_t Elf64_Addr; ++alias uint64_t Elf64_Off; ++alias Elf64_Word Elf64_Hashelt; ++alias Elf64_Xword Elf64_Size; ++alias Elf64_Sxword Elf64_Ssize; ++ ++struct Elf64_Ehdr ++{ ++ char e_ident[EI_NIDENT]; ++ Elf64_Half e_type; ++ Elf64_Half e_machine; ++ Elf64_Word e_version; ++ Elf64_Addr e_entry; ++ Elf64_Off e_phoff; ++ Elf64_Off e_shoff; ++ Elf64_Word e_flags; ++ Elf64_Half e_ehsize; ++ Elf64_Half e_phentsize; ++ Elf64_Half e_phnum; ++ Elf64_Half e_shentsize; ++ Elf64_Half e_shnum; ++ Elf64_Half e_shstrndx; ++} ++ ++struct Elf64_Shdr ++{ ++ Elf64_Word sh_name; ++ Elf64_Word sh_type; ++ Elf64_Xword sh_flags; ++ Elf64_Addr sh_addr; ++ Elf64_Off sh_offset; ++ Elf64_Xword sh_size; ++ Elf64_Word sh_link; ++ Elf64_Word sh_info; ++ Elf64_Xword sh_addralign; ++ Elf64_Xword sh_entsize; ++} ++ ++struct Elf64_Phdr ++{ ++ Elf64_Word p_type; ++ Elf64_Word p_flags; ++ Elf64_Off p_offset; ++ Elf64_Addr p_vaddr; ++ Elf64_Addr p_paddr; ++ Elf64_Xword p_filesz; ++ Elf64_Xword p_memsz; ++ Elf64_Xword p_align; ++} ++ ++struct Elf64_Dyn ++{ ++ Elf64_Sxword d_tag; ++ union _d_un ++ { ++ Elf64_Xword d_val; ++ Elf64_Addr d_ptr; ++ } _d_un d_un; ++} ++ ++struct Elf64_Rel ++{ ++ Elf64_Addr r_offset; ++ Elf64_Xword r_info; ++} ++ ++struct Elf64_Rela ++{ ++ Elf64_Addr r_offset; ++ Elf64_Xword r_info; ++ Elf64_Sxword r_addend; ++} ++ ++extern (D) ++{ ++ auto ELF64_R_SYM(I)(I i) { return i >> 32; } ++ auto ELF64_R_TYPE(I)(I i) { return i & 0xffffffff; } ++ auto ELF64_R_INFO(S, T)(S sym, T type) { return (sym << 32) + (type & 0xffffffff); } ++ ++ auto ELF64_R_TYPE_DATA(I)(I i) { return (cast(Elf64_Xword) i << 32) >> 40; } ++ auto ELF64_R_TYPE_ID(I)(I i) { return (cast(Elf64_Xword) i << 56 ) >> 56; } ++ auto ELF64_R_TYPE_INFO(D, T)(D d, T t) { return cast(Elf64_Xword) d << 8 + cast(Elf64_Xword) t; } ++} ++ ++alias Elf_Note Elf64_Nhdr; ++ ++struct Elf64_Move ++{ ++ Elf64_Lword m_value; ++ Elf64_Xword m_info; ++ Elf64_Xword m_poffset; ++ Elf64_Half m_repeat; ++ Elf64_Half m_stride; ++} ++ ++extern (D) ++{ ++ auto ELF64_M_SYM(I)(I info) { return info >> 8; } ++ auto ELF64_M_SIZE(I)(I info) { return cast(ubyte)info; } ++ auto ELF64_M_INFO(S, SZ)(S sym, SZ size) { return (sym << 8) + cast(ubye)size; } ++} ++ ++struct Elf64_Cap ++{ ++ Elf64_Xword c_tag; ++ union _c_un ++ { ++ Elf64_Xword c_val; ++ Elf64_Addr c_ptr; ++ } _c_un c_un; ++} ++ ++struct Elf64_Sym ++{ ++ Elf64_Word st_name; ++ ubyte st_info; ++ ubyte st_other; ++ Elf64_Half st_shndx; ++ Elf64_Addr st_value; ++ Elf64_Xword st_size; ++} ++ ++extern (D) ++{ ++ auto ELF64_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; } ++ auto ELF64_ST_TYPE(T)(T val) { return val & 0xf; } ++ auto ELF64_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); } ++ auto ELF64_ST_VISIBILITY(O)(O o) { return o & 0x03; } ++} ++ ++struct Elf64_Verdef ++{ ++ Elf64_Half vd_version; ++ Elf64_Half vd_flags; ++ Elf64_Half vd_ndx; ++ Elf64_Half vd_cnt; ++ Elf64_Word vd_hash; ++ Elf64_Word vd_aux; ++ Elf64_Word vd_next; ++} ++ ++struct Elf64_Verdaux ++{ ++ Elf64_Word vda_name; ++ Elf64_Word vda_next; ++} ++ ++struct Elf64_Verneed ++{ ++ Elf64_Half vn_version; ++ Elf64_Half vn_cnt; ++ Elf64_Word vn_file; ++ Elf64_Word vn_aux; ++ Elf64_Word vn_next; ++} ++ ++struct Elf64_Vernaux ++{ ++ Elf64_Word vna_hash; ++ Elf64_Half vna_flags; ++ Elf64_Half vna_other; ++ Elf64_Word vna_name; ++ Elf64_Word vna_next; ++} ++ ++alias Elf64_Half Elf64_Versym; ++ ++struct Elf64_Syminfo ++{ ++ Elf64_Half si_boundto; ++ Elf64_Half si_flags; ++} +--- a/src/libphobos/libdruntime/core/sys/freebsd/sys/elf_common.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/freebsd/sys/elf_common.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,853 @@ ++/** ++ * D header file for FreeBSD. ++ * ++ * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf_common.h?view=markup, sys/elf_common.h) ++ */ ++module core.sys.freebsd.sys.elf_common; ++ ++version (FreeBSD): ++extern (C): ++pure: ++nothrow: ++ ++import core.stdc.stdint; ++ ++struct Elf_Note ++{ ++ uint32_t n_namesz; ++ uint32_t n_descsz; ++ uint32_t n_type; ++} ++ ++struct Elf_GNU_Hash_Header ++{ ++ uint32_t gh_nbuckets; ++ uint32_t gh_symndx; ++ uint32_t gh_maskwords; ++ uint32_t gh_shift2; ++} ++ ++enum EI_MAG0 = 0; ++enum EI_MAG1 = 1; ++enum EI_MAG2 = 2; ++enum EI_MAG3 = 3; ++enum EI_CLASS = 4; ++enum EI_DATA = 5; ++enum EI_VERSION = 6; ++enum EI_OSABI = 7; ++enum EI_ABIVERSION = 8; ++enum OLD_EI_BRAND = 8; ++enum EI_PAD = 9; ++enum EI_NIDENT = 16; ++ ++enum ELFMAG0 = 0x7f; ++enum ELFMAG1 = 'E'; ++enum ELFMAG2 = 'L'; ++enum ELFMAG3 = 'F'; ++enum ELFMAG = "\177ELF"; ++enum SELFMAG = 4; ++ ++enum EV_NONE = 0; ++enum EV_CURRENT = 1; ++ ++enum ELFCLASSNONE = 0; ++enum ELFCLASS32 = 1; ++enum ELFCLASS64 = 2; ++ ++enum ELFDATANONE = 0; ++enum ELFDATA2LSB = 1; ++enum ELFDATA2MSB = 2; ++ ++enum ELFOSABI_NONE = 0; ++enum ELFOSABI_SYSV = 0; ++enum ELFOSABI_HPUX = 1; ++enum ELFOSABI_NETBSD = 2; ++enum ELFOSABI_LINUX = 3; ++enum ELFOSABI_HURD = 4; ++enum ELFOSABI_86OPEN = 5; ++enum ELFOSABI_SOLARIS = 6; ++enum ELFOSABI_AIX = 7; ++enum ELFOSABI_MONTEREY = 7; ++enum ELFOSABI_IRIX = 8; ++enum ELFOSABI_FREEBSD = 9; ++enum ELFOSABI_TRU64 = 10; ++enum ELFOSABI_MODESTO = 11; ++enum ELFOSABI_OPENBSD = 12; ++enum ELFOSABI_OPENVMS = 13; ++enum ELFOSABI_NSK = 14; ++enum ELFOSABI_AROS = 15; ++enum ELFOSABI_ARM = 97; ++enum ELFOSABI_STANDALONE = 255; ++ ++extern (D) ++{ ++ auto IS_ELF(T)(T ehdr) { return ehdr.e_ident[EI_MAG0] == ELFMAG0 && ++ ehdr.e_ident[EI_MAG1] == ELFMAG1 && ++ ehdr.e_ident[EI_MAG2] == ELFMAG2 && ++ ehdr.e_ident[EI_MAG3] == ELFMAG3; } ++} ++ ++enum ET_NONE = 0; ++enum ET_REL = 1; ++enum ET_EXEC = 2; ++enum ET_DYN = 3; ++enum ET_CORE = 4; ++enum ET_LOOS = 0xfe00; ++enum ET_HIOS = 0xfeff; ++enum ET_LOPROC = 0xff00; ++enum ET_HIPROC = 0xffff; ++ ++enum EM_NONE = 0; ++enum EM_M32 = 1; ++enum EM_SPARC = 2; ++enum EM_386 = 3; ++enum EM_68K = 4; ++enum EM_88K = 5; ++enum EM_860 = 7; ++enum EM_MIPS = 8; ++enum EM_S370 = 9; ++enum EM_MIPS_RS3_LE = 10; ++enum EM_PARISC = 15; ++enum EM_VPP500 = 17; ++enum EM_SPARC32PLUS = 18; ++enum EM_960 = 19; ++enum EM_PPC = 20; ++enum EM_PPC64 = 21; ++enum EM_S390 = 22; ++enum EM_V800 = 36; ++enum EM_FR20 = 37; ++enum EM_RH32 = 38; ++enum EM_RCE = 39; ++enum EM_ARM = 40; ++enum EM_SH = 42; ++enum EM_SPARCV9 = 43; ++enum EM_TRICORE = 44; ++enum EM_ARC = 45; ++enum EM_H8_300 = 46; ++enum EM_H8_300H = 47; ++enum EM_H8S = 48; ++enum EM_H8_500 = 49; ++enum EM_IA_64 = 50; ++enum EM_MIPS_X = 51; ++enum EM_COLDFIRE = 52; ++enum EM_68HC12 = 53; ++enum EM_MMA = 54; ++enum EM_PCP = 55; ++enum EM_NCPU = 56; ++enum EM_NDR1 = 57; ++enum EM_STARCORE = 58; ++enum EM_ME16 = 59; ++enum EM_ST100 = 60; ++enum EM_TINYJ = 61; ++enum EM_X86_64 = 62; ++enum EM_AMD64 = 62; ++enum EM_PDSP = 63; ++enum EM_FX66 = 66; ++enum EM_ST9PLUS = 67; ++enum EM_ST7 = 68; ++enum EM_68HC16 = 69; ++enum EM_68HC11 = 70; ++enum EM_68HC08 = 71; ++enum EM_68HC05 = 72; ++enum EM_SVX = 73; ++enum EM_ST19 = 74; ++enum EM_VAX = 75; ++enum EM_CRIS = 76; ++enum EM_JAVELIN = 77; ++enum EM_FIREPATH = 78; ++enum EM_ZSP = 79; ++enum EM_MMIX = 80; ++enum EM_HUANY = 81; ++enum EM_PRISM = 82; ++enum EM_AVR = 83; ++enum EM_FR30 = 84; ++enum EM_D10V = 85; ++enum EM_D30V = 86; ++enum EM_V850 = 87; ++enum EM_M32R = 88; ++enum EM_MN10300 = 89; ++enum EM_MN10200 = 90; ++enum EM_PJ = 91; ++enum EM_OPENRISC = 92; ++enum EM_ARC_A5 = 93; ++enum EM_XTENSA = 94; ++enum EM_VIDEOCORE = 95; ++enum EM_TMM_GPP = 96; ++enum EM_NS32K = 97; ++enum EM_TPC = 98; ++enum EM_SNP1K = 99; ++enum EM_ST200 = 100; ++enum EM_IP2K = 101; ++enum EM_MAX = 102; ++enum EM_CR = 103; ++enum EM_F2MC16 = 104; ++enum EM_MSP430 = 105; ++enum EM_BLACKFIN = 106; ++enum EM_SE_C33 = 107; ++enum EM_SEP = 108; ++enum EM_ARCA = 109; ++enum EM_UNICORE = 110; ++ ++enum EM_486 = 6; ++enum EM_MIPS_RS4_BE = 10; ++enum EM_ALPHA_STD = 41; ++enum EM_ALPHA = 0x9026; ++ ++enum SHN_UNDEF = 0; ++enum SHN_LORESERVE = 0xff00; ++enum SHN_LOPROC = 0xff00; ++enum SHN_HIPROC = 0xff1f; ++enum SHN_LOOS = 0xff20; ++enum SHN_HIOS = 0xff3f; ++enum SHN_ABS = 0xfff1; ++enum SHN_COMMON = 0xfff2; ++enum SHN_XINDEX = 0xffff; ++enum SHN_HIRESERVE = 0xffff; ++ ++enum SHT_NULL = 0; ++enum SHT_PROGBITS = 1; ++enum SHT_SYMTAB = 2; ++enum SHT_STRTAB = 3; ++enum SHT_RELA = 4; ++enum SHT_HASH = 5; ++enum SHT_DYNAMIC = 6; ++enum SHT_NOTE = 7; ++enum SHT_NOBITS = 8; ++enum SHT_REL = 9; ++enum SHT_SHLIB = 10; ++enum SHT_DYNSYM = 11; ++enum SHT_INIT_ARRAY = 14; ++enum SHT_FINI_ARRAY = 15; ++enum SHT_PREINIT_ARRAY = 16; ++enum SHT_GROUP = 17; ++enum SHT_SYMTAB_SHNDX = 18; ++enum SHT_LOOS = 0x60000000; ++enum SHT_LOSUNW = 0x6ffffff4; ++enum SHT_SUNW_dof = 0x6ffffff4; ++enum SHT_SUNW_cap = 0x6ffffff5; ++enum SHT_SUNW_SIGNATURE = 0x6ffffff6; ++enum SHT_GNU_HASH = 0x6ffffff6; ++enum SHT_SUNW_ANNOTATE = 0x6ffffff7; ++enum SHT_SUNW_DEBUGSTR = 0x6ffffff8; ++enum SHT_SUNW_DEBUG = 0x6ffffff9; ++enum SHT_SUNW_move = 0x6ffffffa; ++enum SHT_SUNW_COMDAT = 0x6ffffffb; ++enum SHT_SUNW_syminfo = 0x6ffffffc; ++enum SHT_SUNW_verdef = 0x6ffffffd; ++enum SHT_GNU_verdef = 0x6ffffffd; ++enum SHT_SUNW_verneed = 0x6ffffffe; ++enum SHT_GNU_verneed = 0x6ffffffe; ++enum SHT_SUNW_versym = 0x6fffffff; ++enum SHT_GNU_versym = 0x6fffffff; ++enum SHT_HISUNW = 0x6fffffff; ++enum SHT_HIOS = 0x6fffffff; ++enum SHT_LOPROC = 0x70000000; ++enum SHT_AMD64_UNWIND = 0x70000001; ++enum SHT_ARM_EXIDX = 0x70000001; ++enum SHT_ARM_PREEMPTMAP = 0x70000002; ++enum SHT_ARM_ATTRIBUTES = 0x70000003; ++enum SHT_ARM_DEBUGOVERLAY = 0x70000004; ++enum SHT_ARM_OVERLAYSECTION = 0x70000005; ++enum SHT_MIPS_REGINFO = 0x70000006; ++enum SHT_MIPS_OPTIONS = 0x7000000d; ++enum SHT_MIPS_DWARF = 0x7000001e; ++enum SHT_HIPROC = 0x7fffffff; ++enum SHT_LOUSER = 0x80000000; ++enum SHT_HIUSER = 0x8fffffff; ++ ++enum SHF_WRITE = (1 << 0); ++enum SHF_ALLOC = (1 << 1); ++enum SHF_EXECINSTR = (1 << 2); ++enum SHF_MERGE = (1 << 4); ++enum SHF_STRINGS = (1 << 5); ++enum SHF_INFO_LINK = (1 << 6); ++enum SHF_LINK_ORDER = (1 << 7); ++enum SHF_OS_NONCONFORMING = (1 << 8); ++enum SHF_GROUP = (1 << 9); ++enum SHF_TLS = (1 << 10); ++enum SHF_MASKOS = 0x0ff00000; ++enum SHF_MASKPROC = 0xf0000000; ++ ++enum PT_NULL = 0; ++enum PT_LOAD = 1; ++enum PT_DYNAMIC = 2; ++enum PT_INTERP = 3; ++enum PT_NOTE = 4; ++enum PT_SHLIB = 5; ++enum PT_PHDR = 6; ++enum PT_TLS = 7; ++enum PT_LOOS = 0x60000000; ++enum PT_SUNW_UNWIND = 0x6464e550; ++enum PT_GNU_EH_FRAME = 0x6474e550; ++enum PT_GNU_STACK = 0x6474e551; ++enum PT_GNU_RELRO = 0x6474e552; ++enum PT_LOSUNW = 0x6ffffffa; ++enum PT_SUNWBSS = 0x6ffffffa; ++enum PT_SUNWSTACK = 0x6ffffffb; ++enum PT_SUNWDTRACE = 0x6ffffffc; ++enum PT_SUNWCAP = 0x6ffffffd; ++enum PT_HISUNW = 0x6fffffff; ++enum PT_HIOS = 0x6fffffff; ++enum PT_LOPROC = 0x70000000; ++enum PT_HIPROC = 0x7fffffff; ++ ++enum PF_X = (1 << 0); ++enum PF_W = (1 << 1); ++enum PF_R = (1 << 2); ++enum PF_MASKOS = 0x0ff00000; ++enum PF_MASKPROC = 0xf0000000; ++ ++enum PN_XNUM = 0xffff; ++ ++enum DT_NULL = 0; ++enum DT_NEEDED = 1; ++enum DT_PLTRELSZ = 2; ++enum DT_PLTGOT = 3; ++enum DT_HASH = 4; ++enum DT_STRTAB = 5; ++enum DT_SYMTAB = 6; ++enum DT_RELA = 7; ++enum DT_RELASZ = 8; ++enum DT_RELAENT = 9; ++enum DT_STRSZ = 10; ++enum DT_SYMENT = 11; ++enum DT_INIT = 12; ++enum DT_FINI = 13; ++enum DT_SONAME = 14; ++enum DT_RPATH = 15; ++enum DT_SYMBOLIC = 16; ++enum DT_REL = 17; ++enum DT_RELSZ = 18; ++enum DT_RELENT = 19; ++enum DT_PLTREL = 20; ++enum DT_DEBUG = 21; ++enum DT_TEXTREL = 22; ++enum DT_JMPREL = 23; ++enum DT_BIND_NOW = 24; ++enum DT_INIT_ARRAY = 25; ++enum DT_FINI_ARRAY = 26; ++enum DT_INIT_ARRAYSZ = 27; ++enum DT_FINI_ARRAYSZ = 28; ++enum DT_RUNPATH = 29; ++enum DT_FLAGS = 30; ++enum DT_ENCODING = 32; ++enum DT_PREINIT_ARRAY = 32; ++enum DT_PREINIT_ARRAYSZ = 33; ++enum DT_MAXPOSTAGS = 34; ++enum DT_LOOS = 0x6000000d; ++enum DT_SUNW_AUXILIARY = 0x6000000d; ++enum DT_SUNW_RTLDINF = 0x6000000e; ++enum DT_SUNW_FILTER = 0x6000000f; ++enum DT_SUNW_CAP = 0x60000010; ++enum DT_HIOS = 0x6ffff000; ++enum DT_VALRNGLO = 0x6ffffd00; ++enum DT_CHECKSUM = 0x6ffffdf8; ++enum DT_PLTPADSZ = 0x6ffffdf9; ++enum DT_MOVEENT = 0x6ffffdfa; ++enum DT_MOVESZ = 0x6ffffdfb; ++enum DT_FEATURE_1 = 0x6ffffdfc; ++enum DT_POSFLAG_1 = 0x6ffffdfd; ++enum DT_SYMINSZ = 0x6ffffdfe; ++enum DT_SYMINENT = 0x6ffffdff; ++enum DT_VALRNGHI = 0x6ffffdff; ++enum DT_ADDRRNGLO = 0x6ffffe00; ++enum DT_GNU_HASH = 0x6ffffef5; ++enum DT_CONFIG = 0x6ffffefa; ++enum DT_DEPAUDIT = 0x6ffffefb; ++enum DT_AUDIT = 0x6ffffefc; ++enum DT_PLTPAD = 0x6ffffefd; ++enum DT_MOVETAB = 0x6ffffefe; ++enum DT_SYMINFO = 0x6ffffeff; ++enum DT_ADDRRNGHI = 0x6ffffeff; ++enum DT_VERSYM = 0x6ffffff0; ++enum DT_RELACOUNT = 0x6ffffff9; ++enum DT_RELCOUNT = 0x6ffffffa; ++enum DT_FLAGS_1 = 0x6ffffffb; ++enum DT_VERDEF = 0x6ffffffc; ++enum DT_VERDEFNUM = 0x6ffffffd; ++enum DT_VERNEED = 0x6ffffffe; ++enum DT_VERNEEDNUM = 0x6fffffff; ++enum DT_LOPROC = 0x70000000; ++enum DT_DEPRECATED_SPARC_REGISTER = 0x7000001; ++enum DT_AUXILIARY = 0x7ffffffd; ++enum DT_USED = 0x7ffffffe; ++enum DT_FILTER = 0x7fffffff; ++enum DT_HIPROC = 0x7fffffff; ++ ++enum DF_ORIGIN = 0x00000001; ++enum DF_SYMBOLIC = 0x00000002; ++enum DF_TEXTREL = 0x00000004; ++enum DF_BIND_NOW = 0x00000008; ++enum DF_STATIC_TLS = 0x00000010; ++ ++enum DF_1_BIND_NOW = 0x00000001; ++enum DF_1_GLOBAL = 0x00000002; ++enum DF_1_NODELETE = 0x00000008; ++enum DF_1_LOADFLTR = 0x00000010; ++enum DF_1_NOOPEN = 0x00000040; ++enum DF_1_NODEFLIB = 0x00000800; ++ ++enum NT_PRSTATUS = 1; ++enum NT_FPREGSET = 2; ++enum NT_PRPSINFO = 3; ++enum NT_THRMISC = 7; ++enum NT_PROCSTAT_PROC = 8; ++enum NT_PROCSTAT_FILES = 9; ++enum NT_PROCSTAT_VMMAP = 10; ++enum NT_PROCSTAT_GROUPS = 11; ++enum NT_PROCSTAT_UMASK = 12; ++enum NT_PROCSTAT_RLIMIT = 13; ++enum NT_PROCSTAT_OSREL = 14; ++enum NT_PROCSTAT_PSSTRINGS = 15; ++enum NT_PROCSTAT_AUXV = 16; ++ ++enum STB_LOCAL = 0; ++enum STB_GLOBAL = 1; ++enum STB_WEAK = 2; ++enum STB_NUM = 3; ++enum STB_LOOS = 10; ++enum STB_HIOS = 12; ++enum STB_LOPROC = 13; ++enum STB_HIPROC = 15; ++ ++enum STT_NOTYPE = 0; ++enum STT_OBJECT = 1; ++enum STT_FUNC = 2; ++enum STT_SECTION = 3; ++enum STT_FILE = 4; ++enum STT_COMMON = 5; ++enum STT_TLS = 6; ++enum STT_NUM = 7; ++enum STT_LOOS = 10; ++enum STT_GNU_IFUNC = 10; ++enum STT_HIOS = 12; ++enum STT_LOPROC = 13; ++enum STT_HIPROC = 15; ++ ++enum STV_DEFAULT = 0; ++enum STV_INTERNAL = 1; ++enum STV_HIDDEN = 2; ++enum STV_PROTECTED = 3; ++enum STV_EXPORTED = 4; ++enum STV_SINGLETON = 5; ++enum STV_ELIMINATE = 6; ++ ++enum STN_UNDEF = 0; ++ ++enum VER_DEF_CURRENT = 1; ++alias VER_NDX VER_DEF_IDX; ++ ++enum VER_FLG_BASE = 0x1; ++enum VER_FLG_WEAK = 0x2; ++ ++enum VER_NEED_CURRENT = 1; ++enum VER_NEED_WEAK = 32768; ++enum VER_NEED_HIDDEN = VER_NDX_HIDDEN; ++alias VER_NDX VER_NEED_IDX; ++ ++enum VER_NDX_LOCAL = 0; ++enum VER_NDX_GLOBAL = 1; ++enum VER_NDX_GIVEN = 2; ++ ++enum VER_NDX_HIDDEN = 32768; ++extern (D) ++{ ++ auto VER_NDX(V)(V v) { return v & ~(1u << 15); } ++} ++ ++enum CA_SUNW_NULL = 0; ++enum CA_SUNW_HW_1 = 1; ++enum CA_SUNW_SF_1 = 2; ++ ++enum SYMINFO_FLG_DIRECT = 0x0001; ++enum SYMINFO_FLG_PASSTHRU = 0x0002; ++enum SYMINFO_FLG_COPY = 0x0004; ++enum SYMINFO_FLG_LAZYLOAD = 0x0008; ++enum SYMINFO_FLG_DIRECTBIND = 0x0010; ++enum SYMINFO_FLG_NOEXTDIRECT = 0x0020; ++enum SYMINFO_FLG_FILTER = 0x0002; ++enum SYMINFO_FLG_AUXILIARY = 0x0040; ++ ++enum SYMINFO_BT_SELF = 0xffff; ++enum SYMINFO_BT_PARENT = 0xfffe; ++enum SYMINFO_BT_NONE = 0xfffd; ++enum SYMINFO_BT_EXTERN = 0xfffc; ++enum SYMINFO_BT_LOWRESERVE = 0xff00; ++ ++enum SYMINFO_NONE = 0; ++enum SYMINFO_CURRENT = 1; ++enum SYMINFO_NUM = 2; ++ ++enum R_386_NONE = 0; ++enum R_386_32 = 1; ++enum R_386_PC32 = 2; ++enum R_386_GOT32 = 3; ++enum R_386_PLT32 = 4; ++enum R_386_COPY = 5; ++enum R_386_GLOB_DAT = 6; ++enum R_386_JMP_SLOT = 7; ++enum R_386_RELATIVE = 8; ++enum R_386_GOTOFF = 9; ++enum R_386_GOTPC = 10; ++enum R_386_TLS_TPOFF = 14; ++enum R_386_TLS_IE = 15; ++enum R_386_TLS_GOTIE = 16; ++enum R_386_TLS_LE = 17; ++enum R_386_TLS_GD = 18; ++enum R_386_TLS_LDM = 19; ++enum R_386_TLS_GD_32 = 24; ++enum R_386_TLS_GD_PUSH = 25; ++enum R_386_TLS_GD_CALL = 26; ++enum R_386_TLS_GD_POP = 27; ++enum R_386_TLS_LDM_32 = 28; ++enum R_386_TLS_LDM_PUSH = 29; ++enum R_386_TLS_LDM_CALL = 30; ++enum R_386_TLS_LDM_POP = 31; ++enum R_386_TLS_LDO_32 = 32; ++enum R_386_TLS_IE_32 = 33; ++enum R_386_TLS_LE_32 = 34; ++enum R_386_TLS_DTPMOD32 = 35; ++enum R_386_TLS_DTPOFF32 = 36; ++enum R_386_TLS_TPOFF32 = 37; ++enum R_386_IRELATIVE = 42; ++ ++enum R_ARM_NONE = 0; ++enum R_ARM_PC24 = 1; ++enum R_ARM_ABS32 = 2; ++enum R_ARM_REL32 = 3; ++enum R_ARM_PC13 = 4; ++enum R_ARM_ABS16 = 5; ++enum R_ARM_ABS12 = 6; ++enum R_ARM_THM_ABS5 = 7; ++enum R_ARM_ABS8 = 8; ++enum R_ARM_SBREL32 = 9; ++enum R_ARM_THM_PC22 = 10; ++enum R_ARM_THM_PC8 = 11; ++enum R_ARM_AMP_VCALL9 = 12; ++enum R_ARM_SWI24 = 13; ++enum R_ARM_THM_SWI8 = 14; ++enum R_ARM_XPC25 = 15; ++enum R_ARM_THM_XPC22 = 16; ++enum R_ARM_TLS_DTPMOD32 = 17; ++enum R_ARM_TLS_DTPOFF32 = 18; ++enum R_ARM_TLS_TPOFF32 = 19; ++enum R_ARM_COPY = 20; ++enum R_ARM_GLOB_DAT = 21; ++enum R_ARM_JUMP_SLOT = 22; ++enum R_ARM_RELATIVE = 23; ++enum R_ARM_GOTOFF = 24; ++enum R_ARM_GOTPC = 25; ++enum R_ARM_GOT32 = 26; ++enum R_ARM_PLT32 = 27; ++enum R_ARM_GNU_VTENTRY = 100; ++enum R_ARM_GNU_VTINHERIT = 101; ++enum R_ARM_RSBREL32 = 250; ++enum R_ARM_THM_RPC22 = 251; ++enum R_ARM_RREL32 = 252; ++enum R_ARM_RABS32 = 253; ++enum R_ARM_RPC24 = 254; ++enum R_ARM_RBASE = 255; ++ ++enum R_IA_64_NONE = 0; ++enum R_IA_64_IMM14 = 0x21; ++enum R_IA_64_IMM22 = 0x22; ++enum R_IA_64_IMM64 = 0x23; ++enum R_IA_64_DIR32MSB = 0x24; ++enum R_IA_64_DIR32LSB = 0x25; ++enum R_IA_64_DIR64MSB = 0x26; ++enum R_IA_64_DIR64LSB = 0x27; ++enum R_IA_64_GPREL22 = 0x2a; ++enum R_IA_64_GPREL64I = 0x2b; ++enum R_IA_64_GPREL32MSB = 0x2c; ++enum R_IA_64_GPREL32LSB = 0x2d; ++enum R_IA_64_GPREL64MSB = 0x2e; ++enum R_IA_64_GPREL64LSB = 0x2f; ++enum R_IA_64_LTOFF22 = 0x32; ++enum R_IA_64_LTOFF64I = 0x33; ++enum R_IA_64_PLTOFF22 = 0x3a; ++enum R_IA_64_PLTOFF64I = 0x3b; ++enum R_IA_64_PLTOFF64MSB = 0x3e; ++enum R_IA_64_PLTOFF64LSB = 0x3f; ++enum R_IA_64_FPTR64I = 0x43; ++enum R_IA_64_FPTR32MSB = 0x44; ++enum R_IA_64_FPTR32LSB = 0x45; ++enum R_IA_64_FPTR64MSB = 0x46; ++enum R_IA_64_FPTR64LSB = 0x47; ++enum R_IA_64_PCREL60B = 0x48; ++enum R_IA_64_PCREL21B = 0x49; ++enum R_IA_64_PCREL21M = 0x4a; ++enum R_IA_64_PCREL21F = 0x4b; ++enum R_IA_64_PCREL32MSB = 0x4c; ++enum R_IA_64_PCREL32LSB = 0x4d; ++enum R_IA_64_PCREL64MSB = 0x4e; ++enum R_IA_64_PCREL64LSB = 0x4f; ++enum R_IA_64_LTOFF_FPTR22 = 0x52; ++enum R_IA_64_LTOFF_FPTR64I = 0x53; ++enum R_IA_64_LTOFF_FPTR32MSB = 0x54; ++enum R_IA_64_LTOFF_FPTR32LSB = 0x55; ++enum R_IA_64_LTOFF_FPTR64MSB = 0x56; ++enum R_IA_64_LTOFF_FPTR64LSB = 0x57; ++enum R_IA_64_SEGREL32MSB = 0x5c; ++enum R_IA_64_SEGREL32LSB = 0x5d; ++enum R_IA_64_SEGREL64MSB = 0x5e; ++enum R_IA_64_SEGREL64LSB = 0x5f; ++enum R_IA_64_SECREL32MSB = 0x64; ++enum R_IA_64_SECREL32LSB = 0x65; ++enum R_IA_64_SECREL64MSB = 0x66; ++enum R_IA_64_SECREL64LSB = 0x67; ++enum R_IA_64_REL32MSB = 0x6c; ++enum R_IA_64_REL32LSB = 0x6d; ++enum R_IA_64_REL64MSB = 0x6e; ++enum R_IA_64_REL64LSB = 0x6f; ++enum R_IA_64_LTV32MSB = 0x74; ++enum R_IA_64_LTV32LSB = 0x75; ++enum R_IA_64_LTV64MSB = 0x76; ++enum R_IA_64_LTV64LSB = 0x77; ++enum R_IA_64_PCREL21BI = 0x79; ++enum R_IA_64_PCREL22 = 0x7a; ++enum R_IA_64_PCREL64I = 0x7b; ++enum R_IA_64_IPLTMSB = 0x80; ++enum R_IA_64_IPLTLSB = 0x81; ++enum R_IA_64_SUB = 0x85; ++enum R_IA_64_LTOFF22X = 0x86; ++enum R_IA_64_LDXMOV = 0x87; ++enum R_IA_64_TPREL14 = 0x91; ++enum R_IA_64_TPREL22 = 0x92; ++enum R_IA_64_TPREL64I = 0x93; ++enum R_IA_64_TPREL64MSB = 0x96; ++enum R_IA_64_TPREL64LSB = 0x97; ++enum R_IA_64_LTOFF_TPREL22 = 0x9a; ++enum R_IA_64_DTPMOD64MSB = 0xa6; ++enum R_IA_64_DTPMOD64LSB = 0xa7; ++enum R_IA_64_LTOFF_DTPMOD22 = 0xaa; ++enum R_IA_64_DTPREL14 = 0xb1; ++enum R_IA_64_DTPREL22 = 0xb2; ++enum R_IA_64_DTPREL64I = 0xb3; ++enum R_IA_64_DTPREL32MSB = 0xb4; ++enum R_IA_64_DTPREL32LSB = 0xb5; ++enum R_IA_64_DTPREL64MSB = 0xb6; ++enum R_IA_64_DTPREL64LSB = 0xb7; ++enum R_IA_64_LTOFF_DTPREL22 = 0xba; ++ ++enum R_MIPS_NONE = 0; ++enum R_MIPS_16 = 1; ++enum R_MIPS_32 = 2; ++enum R_MIPS_REL32 = 3; ++enum R_MIPS_26 = 4; ++enum R_MIPS_HI16 = 5; ++enum R_MIPS_LO16 = 6; ++enum R_MIPS_GPREL16 = 7; ++enum R_MIPS_LITERAL = 8; ++enum R_MIPS_GOT16 = 9; ++enum R_MIPS_PC16 = 10; ++enum R_MIPS_CALL16 = 11; ++enum R_MIPS_GPREL32 = 12; ++enum R_MIPS_GOTHI16 = 21; ++enum R_MIPS_GOTLO16 = 22; ++enum R_MIPS_CALLHI16 = 30; ++enum R_MIPS_CALLLO16 = 31; ++ ++enum R_PPC_NONE = 0; ++enum R_PPC_ADDR32 = 1; ++enum R_PPC_ADDR24 = 2; ++enum R_PPC_ADDR16 = 3; ++enum R_PPC_ADDR16_LO = 4; ++enum R_PPC_ADDR16_HI = 5; ++enum R_PPC_ADDR16_HA = 6; ++enum R_PPC_ADDR14 = 7; ++enum R_PPC_ADDR14_BRTAKEN = 8; ++enum R_PPC_ADDR14_BRNTAKEN = 9; ++enum R_PPC_REL24 = 10; ++enum R_PPC_REL14 = 11; ++enum R_PPC_REL14_BRTAKEN = 12; ++enum R_PPC_REL14_BRNTAKEN = 13; ++enum R_PPC_GOT16 = 14; ++enum R_PPC_GOT16_LO = 15; ++enum R_PPC_GOT16_HI = 16; ++enum R_PPC_GOT16_HA = 17; ++enum R_PPC_PLTREL24 = 18; ++enum R_PPC_COPY = 19; ++enum R_PPC_GLOB_DAT = 20; ++enum R_PPC_JMP_SLOT = 21; ++enum R_PPC_RELATIVE = 22; ++enum R_PPC_LOCAL24PC = 23; ++enum R_PPC_UADDR32 = 24; ++enum R_PPC_UADDR16 = 25; ++enum R_PPC_REL32 = 26; ++enum R_PPC_PLT32 = 27; ++enum R_PPC_PLTREL32 = 28; ++enum R_PPC_PLT16_LO = 29; ++enum R_PPC_PLT16_HI = 30; ++enum R_PPC_PLT16_HA = 31; ++enum R_PPC_SDAREL16 = 32; ++enum R_PPC_SECTOFF = 33; ++enum R_PPC_SECTOFF_LO = 34; ++enum R_PPC_SECTOFF_HI = 35; ++enum R_PPC_SECTOFF_HA = 36; ++ ++enum R_PPC64_ADDR64 = 38; ++enum R_PPC64_ADDR16_HIGHER = 39; ++enum R_PPC64_ADDR16_HIGHERA = 40; ++enum R_PPC64_ADDR16_HIGHEST = 41; ++enum R_PPC64_ADDR16_HIGHESTA = 42; ++enum R_PPC64_UADDR64 = 43; ++enum R_PPC64_REL64 = 44; ++enum R_PPC64_PLT64 = 45; ++enum R_PPC64_PLTREL64 = 46; ++enum R_PPC64_TOC16 = 47; ++enum R_PPC64_TOC16_LO = 48; ++enum R_PPC64_TOC16_HI = 49; ++enum R_PPC64_TOC16_HA = 50; ++enum R_PPC64_TOC = 51; ++enum R_PPC64_DTPMOD64 = 68; ++enum R_PPC64_TPREL64 = 73; ++enum R_PPC64_DTPREL64 = 78; ++ ++enum R_PPC_TLS = 67; ++enum R_PPC_DTPMOD32 = 68; ++enum R_PPC_TPREL16 = 69; ++enum R_PPC_TPREL16_LO = 70; ++enum R_PPC_TPREL16_HI = 71; ++enum R_PPC_TPREL16_HA = 72; ++enum R_PPC_TPREL32 = 73; ++enum R_PPC_DTPREL16 = 74; ++enum R_PPC_DTPREL16_LO = 75; ++enum R_PPC_DTPREL16_HI = 76; ++enum R_PPC_DTPREL16_HA = 77; ++enum R_PPC_DTPREL32 = 78; ++enum R_PPC_GOT_TLSGD16 = 79; ++enum R_PPC_GOT_TLSGD16_LO = 80; ++enum R_PPC_GOT_TLSGD16_HI = 81; ++enum R_PPC_GOT_TLSGD16_HA = 82; ++enum R_PPC_GOT_TLSLD16 = 83; ++enum R_PPC_GOT_TLSLD16_LO = 84; ++enum R_PPC_GOT_TLSLD16_HI = 85; ++enum R_PPC_GOT_TLSLD16_HA = 86; ++enum R_PPC_GOT_TPREL16 = 87; ++enum R_PPC_GOT_TPREL16_LO = 88; ++enum R_PPC_GOT_TPREL16_HI = 89; ++enum R_PPC_GOT_TPREL16_HA = 90; ++ ++enum R_PPC_EMB_NADDR32 = 101; ++enum R_PPC_EMB_NADDR16 = 102; ++enum R_PPC_EMB_NADDR16_LO = 103; ++enum R_PPC_EMB_NADDR16_HI = 104; ++enum R_PPC_EMB_NADDR16_HA = 105; ++enum R_PPC_EMB_SDAI16 = 106; ++enum R_PPC_EMB_SDA2I16 = 107; ++enum R_PPC_EMB_SDA2REL = 108; ++enum R_PPC_EMB_SDA21 = 109; ++enum R_PPC_EMB_MRKREF = 110; ++enum R_PPC_EMB_RELSEC16 = 111; ++enum R_PPC_EMB_RELST_LO = 112; ++enum R_PPC_EMB_RELST_HI = 113; ++enum R_PPC_EMB_RELST_HA = 114; ++enum R_PPC_EMB_BIT_FLD = 115; ++enum R_PPC_EMB_RELSDA = 116; ++ ++enum R_SPARC_NONE = 0; ++enum R_SPARC_8 = 1; ++enum R_SPARC_16 = 2; ++enum R_SPARC_32 = 3; ++enum R_SPARC_DISP8 = 4; ++enum R_SPARC_DISP16 = 5; ++enum R_SPARC_DISP32 = 6; ++enum R_SPARC_WDISP30 = 7; ++enum R_SPARC_WDISP22 = 8; ++enum R_SPARC_HI22 = 9; ++enum R_SPARC_22 = 10; ++enum R_SPARC_13 = 11; ++enum R_SPARC_LO10 = 12; ++enum R_SPARC_GOT10 = 13; ++enum R_SPARC_GOT13 = 14; ++enum R_SPARC_GOT22 = 15; ++enum R_SPARC_PC10 = 16; ++enum R_SPARC_PC22 = 17; ++enum R_SPARC_WPLT30 = 18; ++enum R_SPARC_COPY = 19; ++enum R_SPARC_GLOB_DAT = 20; ++enum R_SPARC_JMP_SLOT = 21; ++enum R_SPARC_RELATIVE = 22; ++enum R_SPARC_UA32 = 23; ++enum R_SPARC_PLT32 = 24; ++enum R_SPARC_HIPLT22 = 25; ++enum R_SPARC_LOPLT10 = 26; ++enum R_SPARC_PCPLT32 = 27; ++enum R_SPARC_PCPLT22 = 28; ++enum R_SPARC_PCPLT10 = 29; ++enum R_SPARC_10 = 30; ++enum R_SPARC_11 = 31; ++enum R_SPARC_64 = 32; ++enum R_SPARC_OLO10 = 33; ++enum R_SPARC_HH22 = 34; ++enum R_SPARC_HM10 = 35; ++enum R_SPARC_LM22 = 36; ++enum R_SPARC_PC_HH22 = 37; ++enum R_SPARC_PC_HM10 = 38; ++enum R_SPARC_PC_LM22 = 39; ++enum R_SPARC_WDISP16 = 40; ++enum R_SPARC_WDISP19 = 41; ++enum R_SPARC_GLOB_JMP = 42; ++enum R_SPARC_7 = 43; ++enum R_SPARC_5 = 44; ++enum R_SPARC_6 = 45; ++enum R_SPARC_DISP64 = 46; ++enum R_SPARC_PLT64 = 47; ++enum R_SPARC_HIX22 = 48; ++enum R_SPARC_LOX10 = 49; ++enum R_SPARC_H44 = 50; ++enum R_SPARC_M44 = 51; ++enum R_SPARC_L44 = 52; ++enum R_SPARC_REGISTER = 53; ++enum R_SPARC_UA64 = 54; ++enum R_SPARC_UA16 = 55; ++enum R_SPARC_TLS_GD_HI22 = 56; ++enum R_SPARC_TLS_GD_LO10 = 57; ++enum R_SPARC_TLS_GD_ADD = 58; ++enum R_SPARC_TLS_GD_CALL = 59; ++enum R_SPARC_TLS_LDM_HI22 = 60; ++enum R_SPARC_TLS_LDM_LO10 = 61; ++enum R_SPARC_TLS_LDM_ADD = 62; ++enum R_SPARC_TLS_LDM_CALL = 63; ++enum R_SPARC_TLS_LDO_HIX22 = 64; ++enum R_SPARC_TLS_LDO_LOX10 = 65; ++enum R_SPARC_TLS_LDO_ADD = 66; ++enum R_SPARC_TLS_IE_HI22 = 67; ++enum R_SPARC_TLS_IE_LO10 = 68; ++enum R_SPARC_TLS_IE_LD = 69; ++enum R_SPARC_TLS_IE_LDX = 70; ++enum R_SPARC_TLS_IE_ADD = 71; ++enum R_SPARC_TLS_LE_HIX22 = 72; ++enum R_SPARC_TLS_LE_LOX10 = 73; ++enum R_SPARC_TLS_DTPMOD32 = 74; ++enum R_SPARC_TLS_DTPMOD64 = 75; ++enum R_SPARC_TLS_DTPOFF32 = 76; ++enum R_SPARC_TLS_DTPOFF64 = 77; ++enum R_SPARC_TLS_TPOFF32 = 78; ++enum R_SPARC_TLS_TPOFF64 = 79; ++ ++enum R_X86_64_NONE = 0; ++enum R_X86_64_64 = 1; ++enum R_X86_64_PC32 = 2; ++enum R_X86_64_GOT32 = 3; ++enum R_X86_64_PLT32 = 4; ++enum R_X86_64_COPY = 5; ++enum R_X86_64_GLOB_DAT = 6; ++enum R_X86_64_JMP_SLOT = 7; ++enum R_X86_64_RELATIVE = 8; ++enum R_X86_64_GOTPCREL = 9; ++enum R_X86_64_32 = 10; ++enum R_X86_64_32S = 11; ++enum R_X86_64_16 = 12; ++enum R_X86_64_PC16 = 13; ++enum R_X86_64_8 = 14; ++enum R_X86_64_PC8 = 15; ++enum R_X86_64_DTPMOD64 = 16; ++enum R_X86_64_DTPOFF64 = 17; ++enum R_X86_64_TPOFF64 = 18; ++enum R_X86_64_TLSGD = 19; ++enum R_X86_64_TLSLD = 20; ++enum R_X86_64_DTPOFF32 = 21; ++enum R_X86_64_GOTTPOFF = 22; ++enum R_X86_64_TPOFF32 = 23; ++enum R_X86_64_IRELATIVE = 37; +--- a/src/libphobos/libdruntime/core/sys/freebsd/sys/elf.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/freebsd/sys/elf.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,11 @@ ++/** ++ * D header file for FreeBSD. ++ * ++ * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf.h?view=markup, sys/elf.h) ++ */ ++module core.sys.freebsd.sys.elf; ++ ++version (FreeBSD): ++ ++public import core.sys.freebsd.sys.elf32; ++public import core.sys.freebsd.sys.elf64; +--- a/src/libphobos/libdruntime/core/sys/freebsd/sys/link_elf.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/freebsd/sys/link_elf.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,77 @@ ++/** ++ * D header file for FreeBSD. ++ * ++ * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/link_elf.h?view=markup, sys/link_elf.h) ++ */ ++module core.sys.freebsd.sys.link_elf; ++ ++version (FreeBSD): ++extern (C): ++nothrow: ++ ++import core.stdc.stdint : uint64_t; ++import core.sys.freebsd.sys.elf; ++ ++version(D_LP64) ++ enum __ELF_NATIVE_CLASS = 64; ++else ++ enum __ELF_NATIVE_CLASS = 32; ++ ++template ElfW(string type) ++{ ++ mixin("alias Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~" ElfW;"); ++} ++ ++enum LA_SER_ORIG = 0x01; ++enum LA_SER_LIBPATH = 0x02; ++enum LA_SER_RUNPATH = 0x04; ++enum LA_SER_CONFIG = 0x08; ++enum LA_SER_DEFAULT = 0x40; ++enum LA_SER_SECURE = 0x80; ++ ++struct link_map ++{ ++ char* l_addr; ++ ++ version (MIPS32) ++ char* l_offs; ++ version (MIPS64) ++ char* l_offs; ++ ++ char* l_name; ++ void* l_ld; ++ link_map* l_next, l_prev; ++} ++alias link_map Link_map; ++ ++enum ++{ ++ RT_CONSISTENT, ++ RT_ADD, ++ RT_DELETE, ++} ++ ++struct r_debug ++{ ++ int r_version; ++ link_map* r_map; ++ void function(r_debug*, link_map*) r_brk; ++}; ++ ++struct dl_phdr_info ++{ ++ ElfW!"Addr" dlpi_addr; ++ char* dlpi_name; ++ ElfW!"Phdr"* dlpi_phdr; ++ ElfW!"Half" dlpi_phnum; ++ uint64_t dlpi_adds; ++ uint64_t dlpi_subs; ++ size_t dlpi_tls_modid; ++ void* dlpi_tls_data; ++}; ++ ++ ++private alias extern(C) int function(dl_phdr_info*, size_t, void*) __dl_iterate_hdr_callback; ++extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void*); ++extern int _rtld_addr_phdr(const void*, dl_phdr_info*); ++extern int _rtld_get_stack_prot(); +--- a/src/libphobos/libdruntime/core/sys/linux/config.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/config.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,25 @@ ++/** ++ * D header file for GNU/Linux ++ * ++ * Authors: Martin Nowak ++ */ ++module core.sys.linux.config; ++ ++version (linux): ++ ++public import core.sys.posix.config; ++ ++// man 7 feature_test_macros ++// http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html ++enum _GNU_SOURCE = true; ++// deduced ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=include/features.h ++enum _BSD_SOURCE = true; ++enum _SVID_SOURCE = true; ++enum _ATFILE_SOURCE = true; ++ ++enum __USE_MISC = _BSD_SOURCE || _SVID_SOURCE; ++enum __USE_BSD = _BSD_SOURCE; ++enum __USE_SVID = _SVID_SOURCE; ++enum __USE_ATFILE = _ATFILE_SOURCE; ++enum __USE_GNU = _GNU_SOURCE; +--- a/src/libphobos/libdruntime/core/sys/linux/dlfcn.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/dlfcn.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,258 @@ ++/** ++ * D header file for GNU/Linux ++ * ++ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=dlfcn/dlfcn.h, glibc dlfcn/dlfcn.h) ++ */ ++module core.sys.linux.dlfcn; ++ ++version (linux): ++extern (C): ++nothrow: ++ ++public import core.sys.posix.dlfcn; ++import core.sys.linux.config; ++ ++// ++version (X86) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x00001; // POSIX ++ // enum RTLD_NOW = 0x00002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (X86_64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x00001; // POSIX ++ // enum RTLD_NOW = 0x00002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (MIPS32) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/mips/bits/dlfcn.h ++ // enum RTLD_LAZY = 0x0001; // POSIX ++ // enum RTLD_NOW = 0x0002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00008; ++ enum RTLD_DEEPBIND = 0x00010; ++ ++ // enum RTLD_GLOBAL = 0x0004; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (PPC) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x0001; // POSIX ++ // enum RTLD_NOW = 0x0002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (PPC64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x0001; // POSIX ++ // enum RTLD_NOW = 0x0002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (ARM) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x0001; // POSIX ++ // enum RTLD_NOW = 0x0002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else version (AArch64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h ++ // enum RTLD_LAZY = 0x0001; // POSIX ++ // enum RTLD_NOW = 0x0002; // POSIX ++ enum RTLD_BINDING_MASK = 0x3; ++ enum RTLD_NOLOAD = 0x00004; ++ enum RTLD_DEEPBIND = 0x00008; ++ ++ // enum RTLD_GLOBAL = 0x00100; // POSIX ++ // enum RTLD_LOCAL = 0; // POSIX ++ enum RTLD_NODELETE = 0x01000; ++ ++ static if (__USE_GNU) ++ { ++ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args) ++ { ++ _dl_mcount_wrapper_check(cast(void*)fctp); ++ return fctp(args); ++ } ++ ++ void _dl_mcount_wrapper_check(void* __selfpc); ++ } ++} ++else ++ static assert(0, "unimplemented"); ++ ++// ++ ++static if (__USE_GNU) ++{ ++ enum RTLD_NEXT = cast(void *)-1L; ++ enum RTLD_DEFAULT = cast(void *)0; ++ alias c_long Lmid_t; ++ enum LM_ID_BASE = 0; ++ enum LM_ID_NEWLM = -1; ++} ++ ++// void* dlopen(in char* __file, int __mode); // POSIX ++// int dlclose(void* __handle); // POSIX ++// void* dlsym(void* __handle, in char* __name); // POSIX ++ ++static if (__USE_GNU) ++{ ++ void* dlmopen(Lmid_t __nsid, in char* __file, int __mode); ++ void* dlvsym(void* __handle, in char* __name, in char* __version); ++} ++ ++// char* dlerror(); // POSIX ++ ++static if (__USE_GNU) ++{ ++ struct Dl_info ++ { ++ const(char)* dli_fname; ++ void* dli_fbase; ++ const(char)* dli_sname; ++ void* dli_saddr; ++ } ++ ++ int dladdr(void* __address, Dl_info* __info); ++ int dladdr1(void* __address, Dl_info* __info, void** __extra_info, int __flags); ++ ++ enum ++ { ++ RTLD_DL_SYMENT = 1, ++ RTLD_DL_LINKMAP = 2, ++ } ++ ++ int dlinfo(void* __handle, int __request, void* __arg); ++ ++ enum ++ { ++ RTLD_DI_LMID = 1, ++ RTLD_DI_LINKMAP = 2, ++ RTLD_DI_CONFIGADDR = 3, ++ RTLD_DI_SERINFO = 4, ++ RTLD_DI_SERINFOSIZE = 5, ++ RTLD_DI_ORIGIN = 6, ++ RTLD_DI_PROFILENAME = 7, ++ RTLD_DI_PROFILEOUT = 8, ++ RTLD_DI_TLS_MODID = 9, ++ RTLD_DI_TLS_DATA = 10, ++ RTLD_DI_MAX = 10, ++ } ++ ++ struct Dl_serpath ++ { ++ char* dls_name; ++ uint dls_flags; ++ } ++ ++ struct Dl_serinfo ++ { ++ size_t dls_size; ++ uint dls_cnt; ++ Dl_serpath[1] dls_serpath; ++ } ++} +--- a/src/libphobos/libdruntime/core/sys/linux/epoll.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/epoll.d 2014-04-01 16:32:51.000000000 +0100 +@@ -8,7 +8,7 @@ + */ + module core.sys.linux.epoll; + +-version (Linux): ++version (linux): + + extern (C): + @system: +--- a/src/libphobos/libdruntime/core/sys/linux/errno.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/errno.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,19 @@ ++/** ++ * D header file for GNU/Linux ++ * ++ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=stdlib/errno.h, glibc stdlib/errno.h) ++ */ ++module core.sys.linux.errno; ++ ++version (linux): ++extern (C): ++nothrow: ++ ++public import core.stdc.errno; ++import core.sys.linux.config; ++ ++static if (__USE_GNU) ++{ ++ extern __gshared char* program_invocation_name, program_invocation_short_name; ++ alias error_t = int; ++} +--- a/src/libphobos/libdruntime/core/sys/linux/link.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/link.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,164 @@ ++/** ++ * D header file for GNU/Linux ++ * ++ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/link.h, glibc elf/link.h) ++ */ ++module core.sys.linux.link; ++ ++version (linux): ++extern (C): ++nothrow: ++ ++import core.stdc.stdint : uintptr_t, uint32_t; ++import core.sys.linux.config : __WORDSIZE; ++import core.sys.linux.dlfcn : Lmid_t; ++import core.sys.linux.elf; ++ ++// ++version (X86) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (X86_64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (MIPS32) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (PPC) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (PPC64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (ARM) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else version (AArch64) ++{ ++ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h ++ alias __WORDSIZE __ELF_NATIVE_CLASS; ++ alias uint32_t Elf_Symndx; ++} ++else ++ static assert(0, "unimplemented"); ++// ++ ++template ElfW(string type) ++{ ++ mixin("alias Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~" ElfW;"); ++} ++ ++enum ++{ ++ RT_CONSISTENT, ++ RT_ADD, ++ RT_DELETE, ++} ++ ++struct r_debug ++{ ++ int r_version; ++ link_map* r_map; ++ ElfW!"Addr" r_brk; ++ typeof(RT_CONSISTENT) r_state; ++ ElfW!"Addr" r_ldbase; ++} ++ ++extern r_debug _r_debug; ++extern ElfW!"Dyn"* _DYNAMIC; ++ ++struct link_map ++{ ++ ElfW!"Addr" l_addr; ++ char* l_name; ++ ElfW!"Dyn"* l_ld; ++ link_map* l_next, l_prev; ++} ++ ++enum ++{ ++ LA_ACT_CONSISTENT, ++ LA_ACT_ADD, ++ LA_ACT_DELETE, ++} ++ ++enum ++{ ++ LA_SER_ORIG = 0x01, ++ LA_SER_LIBPATH = 0x02, ++ LA_SER_RUNPATH = 0x04, ++ LA_SER_CONFIG = 0x08, ++ LA_SER_DEFAULT = 0x40, ++ LA_SER_SECURE = 0x80, ++} ++ ++ ++enum ++{ ++ LA_FLG_BINDTO = 0x01, ++ LA_FLG_BINDFROM = 0x02, ++} ++ ++ ++enum ++{ ++ LA_SYMB_NOPLTENTER = 0x01, ++ LA_SYMB_NOPLTEXIT = 0x02, ++ LA_SYMB_STRUCTCALL = 0x04, ++ LA_SYMB_DLSYM = 0x08, ++ LA_SYMB_ALTVALUE = 0x10, ++} ++ ++struct dl_phdr_info ++{ ++ ElfW!"Addr" dlpi_addr; ++ const(char)* dlpi_name; ++ const(ElfW!"Phdr")* dlpi_phdr; ++ ElfW!"Half" dlpi_phnum; ++ ++ // check the SIZE argument of the dl_iterate_phdr callback whether ++ // the following members are available ++ ulong dlpi_adds; ++ ulong dlpi_subs; ++ ++ size_t dlpi_tls_modid; ++ void *dlpi_tls_data; ++} ++ ++private alias extern(C) int function(dl_phdr_info*, size_t, void *) __Callback; ++extern int dl_iterate_phdr(__Callback __callback, void*__data); ++ ++ ++// ld.so auditing interfaces prototypes have to be defined by the auditing DSO. ++extern uint la_version(uint __version); ++extern void la_activity(uintptr_t *__cookie, uint __flag); ++extern char* la_objsearch(const(char)* __name, uintptr_t* __cookie, ++ uint __flag); ++extern uint la_objopen(link_map* __map, Lmid_t __lmid, ++ uintptr_t* __cookie); ++extern void la_preinit(uintptr_t* __cookie); ++extern uintptr_t la_symbind32(Elf32_Sym* __sym, uint __ndx, ++ uintptr_t* __refcook, uintptr_t* __defcook, ++ uint *__flags, const(char)* __symname); ++extern uintptr_t la_symbind64(Elf64_Sym* __sym, uint __ndx, ++ uintptr_t* __refcook, uintptr_t* __defcook, ++ uint* __flags, const(char)* __symname); ++extern uint la_objclose(uintptr_t *__cookie); +--- a/src/libphobos/libdruntime/core/sys/linux/sys/inotify.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/sys/inotify.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,56 @@ ++/** ++ * D header file for GNU/Linux. ++ * ++ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) ++ * Authors: Gary Willoughby ++ */ ++module core.sys.linux.sys.inotify; ++ ++version (linux): ++extern (C): ++@system: ++nothrow: ++ ++struct inotify_event ++{ ++ int wd; ++ uint mask; ++ uint cookie; ++ uint len; ++ char[0] name; ++} ++ ++enum: uint ++{ ++ IN_ACCESS = 0x00000000, ++ IN_MODIFY = 0x00000002, ++ IN_ATTRIB = 0x00000004, ++ IN_CLOSE_WRITE = 0x00000008, ++ IN_CLOSE_NOWRITE = 0x00000010, ++ IN_OPEN = 0x00000020, ++ IN_MOVED_FROM = 0x00000040, ++ IN_MOVED_TO = 0x00000080, ++ IN_CREATE = 0x00000100, ++ IN_DELETE = 0x00000200, ++ IN_DELETE_SELF = 0x00000400, ++ IN_MOVE_SELF = 0x00000800, ++ IN_UMOUNT = 0x00002000, ++ IN_Q_OVERFLOW = 0x00004000, ++ IN_IGNORED = 0x00008000, ++ IN_CLOSE = 0x00000018, ++ IN_MOVE = 0x000000C0, ++ IN_ONLYDIR = 0x01000000, ++ IN_DONT_FOLLOW = 0x02000000, ++ IN_EXCL_UNLINK = 0x04000000, ++ IN_MASK_ADD = 0x20000000, ++ IN_ISDIR = 0x40000000, ++ IN_ONESHOT = 0x80000000, ++ IN_ALL_EVENTS = 0x80000FFF, ++ IN_CLOEXEC = 0x02000000, ++ IN_NONBLOCK = 0x00004000, ++} ++ ++int inotify_init(); ++int inotify_init1(int flags); ++int inotify_add_watch(int fd, const(char)* name, uint mask); ++int inotify_rm_watch(int fd, uint wd); +--- a/src/libphobos/libdruntime/core/sys/linux/sys/mman.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/linux/sys/mman.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,736 @@ ++/** ++ * D header file for GNU/Linux ++ * ++ * Authors: Martin Nowak ++ */ ++module core.sys.linux.sys.mman; ++ ++version (linux): ++extern (C): ++nothrow: ++ ++public import core.sys.posix.sys.mman; ++import core.sys.linux.config; ++ ++// ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/mman.h ++version (PPC) ++{ ++ enum PROT_SAO = 0x10; ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x00080, ++ MAP_NORESERVE = 0x00040, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 0x2000, ++ // MCL_FUTURE = 0x4000, ++ // } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/mman.h ++else version (PPC64) ++{ ++ enum PROT_SAO = 0x10; ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x00080, ++ MAP_NORESERVE = 0x00040, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 0x2000, ++ // MCL_FUTURE = 0x4000, ++ // } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/mman.h ++else version (S390) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/mman.h ++else version (S390X) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sh/bits/mman.h ++else version (SH) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x0100, ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x2000, ++ MAP_NORESERVE = 0x4000, ++ MAP_POPULATE = 0x8000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sh/bits/mman.h ++else version (SH64) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x0100, ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x2000, ++ MAP_NORESERVE = 0x4000, ++ MAP_POPULATE = 0x8000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/mman.h ++else version (SPARC) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x0200, ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x0100, ++ MAP_NORESERVE = 0x0040, ++ _MAP_NEW = 0x80000000, ++ MAP_POPULATE = 0x8000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 0x2000, ++ // MCL_FUTURE = 0x4000, ++ // } ++ ++ static if (__USE_MISC) enum MAP_RENAME MAP_ANONYMOUS; ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/mman.h ++else version (SPARC64) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x0200, ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x0100, ++ MAP_NORESERVE = 0x0040, ++ _MAP_NEW = 0x80000000, ++ MAP_POPULATE = 0x8000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 0x2000, ++ // MCL_FUTURE = 0x4000, ++ // } ++ ++ static if (__USE_MISC) enum MAP_RENAME MAP_ANONYMOUS; ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/mman.h ++else version (X86) ++{ ++ static if (__USE_MISC) enum MAP_32BIT = 0x40; ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/mman.h ++else version (X86_64) ++{ ++ static if (__USE_MISC) enum MAP_32BIT = 0x40; ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h ++else version (AARCH64) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h ++else version (Alpha) ++{ ++ enum ++ { ++ PROT_READ = 0x1, ++ PROT_WRITE = 0x2, ++ PROT_EXEC = 0x4, ++ PROT_NONE = 0x0, ++ PROT_GROWSDOWN = 0x01000000, ++ PROT_GROWSUP = 0x02000000, ++ } ++ ++ enum MAP_SHARED = 0x01; ++ enum MAP_PRIVATE = 0x02; ++ static if (__USE_MISC) ++ enum MAP_TYPE = 0x0f; ++ ++ enum MAP_FIXED = 0x10; ++ static if (__USE_MISC) enum ++ { ++ MAP_FILE = 0, ++ MAP_ANONYMOUS = 0x10, ++ MAP_ANON = MAP_ANONYMOUS, ++ MAP_HUGE_SHIFT = 26, ++ MAP_HUGE_MASK = 0x3f, ++ } ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x01000, ++ MAP_DENYWRITE = 0x02000, ++ MAP_EXECUTABLE = 0x04000, ++ MAP_LOCKED = 0x08000, ++ MAP_NORESERVE = 0x10000, ++ MAP_POPULATE = 0x20000, ++ MAP_NONBLOCK = 0x40000, ++ MAP_STACK = 0x80000, ++ MAP_HUGETLB = 0x100000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MS_ASYNC = 1, ++ // MS_SYNC = 2, ++ // MS_INVALIDATE = 4, ++ // } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 8192, ++ // MCL_FUTURE = 16384, ++ // } ++ ++ static if (__USE_GNU) enum ++ { ++ MREMAP_MAYMOVE = 1, ++ MREMAP_FIXED = 2, ++ } ++ ++ static if (__USE_BSD) enum ++ { ++ MADV_NORMAL = 0, ++ MADV_RANDOM = 1, ++ MADV_SEQUENTIAL = 2, ++ MADV_WILLNEED = 3, ++ MADV_DONTNEED = 6, ++ MADV_REMOVE = 9, ++ MADV_DONTFORK = 10, ++ MADV_DOFORK = 11, ++ MADV_MERGEABLE = 12, ++ MADV_UNMERGEABLE = 13, ++ MADV_HUGEPAGE = 14, ++ MADV_NOHUGEPAGE = 15, ++ MADV_DONTDUMP = 16, ++ MADV_DODUMP = 17, ++ MADV_HWPOISON = 100, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // static if (__USE_XOPEN2K) enum ++ // { ++ // POSIX_MADV_NORMAL = 0, ++ // POSIX_MADV_RANDOM = 1, ++ // POSIX_MADV_SEQUENTIAL = 2, ++ // POSIX_MADV_WILLNEED = 3, ++ // POSIX_MADV_DONTNEED = 6, ++ // } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/arm/bits/mman.h ++else version (ARM) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h ++else version (HPPA) ++{ ++ enum ++ { ++ PROT_READ = 0x1, ++ PROT_WRITE = 0x2, ++ PROT_EXEC = 0x4, ++ PROT_NONE = 0x0, ++ PROT_GROWSDOWN = 0x01000000, ++ PROT_GROWSUP = 0x02000000, ++ } ++ ++ enum MAP_SHARED = 0x01; ++ enum MAP_PRIVATE = 0x02; ++ static if (__USE_MISC) ++ enum MAP_TYPE = 0x0f; ++ ++ enum MAP_FIXED = 0x04; ++ static if (__USE_MISC) enum ++ { ++ MAP_FILE = 0, ++ MAP_ANONYMOUS = 0x10, ++ MAP_ANON = MAP_ANONYMOUS, ++ MAP_VARIABLE = 0, ++ MAP_HUGE_SHIFT = 26, ++ MAP_HUGE_MASK = 0x3f, ++ } ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x2000, ++ MAP_NORESERVE = 0x4000, ++ MAP_GROWSDOWN = 0x8000, ++ MAP_POPULATE = 0x10000, ++ MAP_NONBLOCK = 0x20000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MS_ASYNC = 1, ++ // MS_SYNC = 2, ++ // MS_INVALIDATE = 4, ++ // } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 1, ++ // MCL_FUTURE = 2, ++ // } ++ ++ static if (__USE_GNU) enum ++ { ++ MREMAP_MAYMOVE = 1, ++ MREMAP_FIXED = 2, ++ } ++ ++ static if (__USE_BSD) enum ++ { ++ MADV_NORMAL = 0, ++ MADV_RANDOM = 1, ++ MADV_SEQUENTIAL = 2, ++ MADV_WILLNEED = 3, ++ MADV_DONTNEED = 4, ++ MADV_SPACEAVAIL = 5, ++ MADV_VPS_PURGE = 6, ++ MADV_VPS_INHERIT = 7, ++ MADV_REMOVE = 9, ++ MADV_DONTFORK = 10, ++ MADV_DOFORK = 11, ++ MADV_MERGEABLE = 65, ++ MADV_UNMERGEABLE = 66, ++ } ++ ++ enum ++ { ++ MADV_4K_PAGES = 12, ++ MADV_16K_PAGES = 14, ++ MADV_64K_PAGES = 16, ++ MADV_256K_PAGES = 18, ++ MADV_1M_PAGES = 20, ++ MADV_4M_PAGES = 22, ++ MADV_16M_PAGES = 24, ++ MADV_64M_PAGES = 26, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // static if (__USE_XOPEN2K) enum ++ // { ++ // POSIX_MADV_NORMAL = 0, ++ // POSIX_MADV_RANDOM = 1, ++ // POSIX_MADV_SEQUENTIAL = 2, ++ // POSIX_MADV_WILLNEED = 3, ++ // POSIX_MADV_DONTNEED = 4, ++ // } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h ++else version (HPPA64) ++{ ++ enum ++ { ++ PROT_READ = 0x1, ++ PROT_WRITE = 0x2, ++ PROT_EXEC = 0x4, ++ PROT_NONE = 0x0, ++ PROT_GROWSDOWN = 0x01000000, ++ PROT_GROWSUP = 0x02000000, ++ } ++ ++ enum MAP_SHARED = 0x01; ++ enum MAP_PRIVATE = 0x02; ++ static if (__USE_MISC) ++ enum MAP_TYPE = 0x0f; ++ ++ enum MAP_FIXED = 0x04; ++ static if (__USE_MISC) enum ++ { ++ MAP_FILE = 0, ++ MAP_ANONYMOUS = 0x10, ++ MAP_ANON = MAP_ANONYMOUS, ++ MAP_VARIABLE = 0, ++ MAP_HUGE_SHIFT = 26, ++ MAP_HUGE_MASK = 0x3f, ++ } ++ ++ static if (__USE_MISC) enum ++ { ++ MAP_DENYWRITE = 0x0800, ++ MAP_EXECUTABLE = 0x1000, ++ MAP_LOCKED = 0x2000, ++ MAP_NORESERVE = 0x4000, ++ MAP_GROWSDOWN = 0x8000, ++ MAP_POPULATE = 0x10000, ++ MAP_NONBLOCK = 0x20000, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MS_ASYNC = 1, ++ // MS_SYNC = 2, ++ // MS_INVALIDATE = 4, ++ // } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MCL_CURRENT = 1, ++ // MCL_FUTURE = 2, ++ // } ++ ++ static if (__USE_GNU) enum ++ { ++ MREMAP_MAYMOVE = 1, ++ MREMAP_FIXED = 2, ++ } ++ ++ static if (__USE_BSD) enum ++ { ++ MADV_NORMAL = 0, ++ MADV_RANDOM = 1, ++ MADV_SEQUENTIAL = 2, ++ MADV_WILLNEED = 3, ++ MADV_DONTNEED = 4, ++ MADV_SPACEAVAIL = 5, ++ MADV_VPS_PURGE = 6, ++ MADV_VPS_INHERIT = 7, ++ MADV_REMOVE = 9, ++ MADV_DONTFORK = 10, ++ MADV_DOFORK = 11, ++ MADV_MERGEABLE = 65, ++ MADV_UNMERGEABLE = 66, ++ } ++ ++ enum ++ { ++ MADV_4K_PAGES = 12, ++ MADV_16K_PAGES = 14, ++ MADV_64K_PAGES = 16, ++ MADV_256K_PAGES = 18, ++ MADV_1M_PAGES = 20, ++ MADV_4M_PAGES = 22, ++ MADV_16M_PAGES = 24, ++ MADV_64M_PAGES = 26, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // static if (__USE_XOPEN2K) enum ++ // { ++ // POSIX_MADV_NORMAL = 0, ++ // POSIX_MADV_RANDOM = 1, ++ // POSIX_MADV_SEQUENTIAL = 2, ++ // POSIX_MADV_WILLNEED = 3, ++ // POSIX_MADV_DONTNEED = 4, ++ // } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h ++else version (IA64) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_GROWSUP = 0x00200, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h ++else version (M68K) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_GROWSDOWN = 0x00100, ++ MAP_DENYWRITE = 0x00800, ++ MAP_EXECUTABLE = 0x01000, ++ MAP_LOCKED = 0x02000, ++ MAP_NORESERVE = 0x04000, ++ MAP_POPULATE = 0x08000, ++ MAP_NONBLOCK = 0x10000, ++ MAP_STACK = 0x20000, ++ MAP_HUGETLB = 0x40000, ++ } ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/mips/bits/mman.h ++else version (MIPS32) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_NORESERVE = 0x0400, ++ MAP_GROWSDOWN = 0x1000, ++ MAP_DENYWRITE = 0x2000, ++ MAP_EXECUTABLE = 0x4000, ++ MAP_LOCKED = 0x8000, ++ MAP_POPULATE = 0x10000, ++ MAP_NONBLOCK = 0x20000, ++ MAP_STACK = 0x40000, ++ MAP_HUGETLB = 0x80000, ++ } ++ ++ private enum __MAP_ANONYMOUS = 0x0800; ++ ++ static if (__USE_MISC) enum MAP_RENAME MAP_ANONYMOUS; ++} ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/unix/sysv/linux/mips/bits/mman.h ++else version (MIPS64) ++{ ++ static if (__USE_MISC) enum ++ { ++ MAP_NORESERVE = 0x0400, ++ MAP_GROWSDOWN = 0x1000, ++ MAP_DENYWRITE = 0x2000, ++ MAP_EXECUTABLE = 0x4000, ++ MAP_LOCKED = 0x8000, ++ MAP_POPULATE = 0x10000, ++ MAP_NONBLOCK = 0x20000, ++ MAP_STACK = 0x40000, ++ MAP_HUGETLB = 0x80000, ++ } ++ ++ private enum __MAP_ANONYMOUS = 0x0800; ++ ++ static if (__USE_MISC) enum MAP_RENAME MAP_ANONYMOUS; ++} ++else ++{ ++ static assert(0, "unimplemented"); ++} ++ ++ ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/mman-linux.h ++version (Alpha) ++{ ++} ++else version (HPPA) ++{ ++} ++else version (HPPA64) ++{ ++} ++else ++{ ++ // in core.sys.posix.sys.mman ++ // enum PROT_READ = 0x1; ++ // enum PROT_WRITE = 0x2; ++ // enum PROT_EXEC = 0x4; ++ // enum PROT_NONE = 0x0; ++ ++ enum PROT_GROWSDOWN = 0x01000000; ++ enum PROT_GROWSUP = 0x02000000; ++ ++ enum MAP_SHARED = 0x01; ++ enum MAP_PRIVATE = 0x02; ++ static if (__USE_MISC) ++ enum MAP_TYPE = 0x0f; ++ ++ enum MAP_FIXED = 0x10; ++ static if (!is(typeof(__MAP_ANONYMOUS))) ++ private enum __MAP_ANONYMOUS = 0x20; ++ static if (__USE_MISC) enum ++ { ++ MAP_FILE = 0, ++ //MAP_ANONYMOUS = __MAP_ANONYMOUS, ++ //MAP_ANON = MAP_ANONYMOUS, ++ MAP_HUGE_SHIFT = 26, ++ MAP_HUGE_MASK = 0x3f, ++ } ++ ++ /* This should be behind the static if (__USE_MISC), but it runs into ++ * trouble with the alias declaration for MAP_ANON in core.sys.posix.sys.mman ++ * due to forward reference problems. See Bugzilla 11301 for a fuller explanation. ++ */ ++ enum ++ { ++ MAP_ANONYMOUS = __MAP_ANONYMOUS, ++ MAP_ANON = MAP_ANONYMOUS, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // MS_ASYNC = 1, ++ // MS_SYNC = 4, ++ // MS_INVALIDATE = 2, ++ // } ++ ++ static if (__USE_GNU) enum ++ { ++ MREMAP_MAYMOVE = 1, ++ MREMAP_FIXED = 2, ++ } ++ ++ static if (__USE_BSD) enum ++ { ++ MADV_NORMAL = 0, ++ MADV_RANDOM = 1, ++ MADV_SEQUENTIAL = 2, ++ MADV_WILLNEED = 3, ++ MADV_DONTNEED = 4, ++ MADV_REMOVE = 9, ++ MADV_DONTFORK = 10, ++ MADV_DOFORK = 11, ++ MADV_MERGEABLE = 12, ++ MADV_UNMERGEABLE = 13, ++ MADV_HWPOISON = 100, ++ } ++ ++ // in core.sys.posix.sys.mman ++ // static if (__USE_XOPEN2K) enum ++ // { ++ // POSIX_MADV_NORMAL = 0, ++ // POSIX_MADV_RANDOM = 1, ++ // POSIX_MADV_SEQUENTIAL = 2, ++ // POSIX_MADV_WILLNEED = 3, ++ // POSIX_MADV_DONTNEED = 4, ++ // } ++ ++ // in core.sys.posix.sys.mman ++ // enum ++ // { ++ // ++ // MCL_CURRENT = 1, ++ // MCL_FUTURE = 2, ++ // } ++} ++ ++// http://sourceware.org/git/?p=glibc.git;a=blob;f=misc/sys/mman.h ++// in core.sys.posix.sys.mman ++// static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t); ++// static if (__USE_FILE_OFFSET64) ++// alias mmap64 mmap; ++// else ++// void* mmap(void*, size_t, int, int, int, off_t); ++// int munmap(void*, size_t); ++// int mprotect(void *__addr, size_t __len, int __prot); ++// int msync(void *__addr, size_t __len, int __flags); ++static if (__USE_BSD) int madvise(void *__addr, size_t __len, int __advice); ++// static if (__USE_XOPEN2K) int posix_madvise(void *__addr, size_t __len, int __advice); ++// int mlock(const(void) *__addr, size_t __len); ++// int munlock(const(void) *__addr, size_t __len); ++// int mlockall(int __flags); ++// int munlockall(); ++static if (__USE_MISC) int mincore(void *__start, size_t __len, ubyte *__vec); ++static if (__USE_GNU) void *mremap(void *__addr, size_t __old_len, size_t __new_len, int __flags, ...); ++static if (__USE_GNU) int remap_file_pages(void *__start, size_t __size, int __prot, size_t __pgoff, int __flags); ++// int shm_open(in char *__name, int __oflag, mode_t __mode); ++// int shm_unlink(in char *__name); +--- a/src/libphobos/libdruntime/core/sys/posix/config.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/config.d 2014-04-01 16:32:51.000000000 +0100 +@@ -21,6 +21,7 @@ version (Posix): + extern (C): + + enum _XOPEN_SOURCE = 600; ++enum _POSIX_SOURCE = true; + enum _POSIX_C_SOURCE = 200112L; + + version (linux) +@@ -30,11 +31,14 @@ version (linux) + enum _GNU_SOURCE = false; + enum _BSD_SOURCE = false; + enum _SVID_SOURCE = false; ++ enum _ATFILE_SOURCE = false; + + enum _FILE_OFFSET_BITS = 64; + // + enum __REDIRECT = false; + ++ enum _REENTRANT = true; // set by compiler when linking -pthread ++ + // deduced + enum __USE_FILE_OFFSET64 = _FILE_OFFSET_BITS == 64; + enum __USE_LARGEFILE = __USE_FILE_OFFSET64 && !__REDIRECT; +@@ -45,8 +49,12 @@ version (linux) + enum __USE_XOPEN2K8 = _XOPEN_SOURCE >= 700; + enum __USE_XOPEN2K8XSI = _XOPEN_SOURCE >= 700; + +- enum __USE_GNU = _GNU_SOURCE; + enum __USE_MISC = _BSD_SOURCE || _SVID_SOURCE; ++ enum __USE_BSD = _BSD_SOURCE; ++ enum __USE_SVID = _SVID_SOURCE; ++ enum __USE_ATFILE = _ATFILE_SOURCE; ++ enum __USE_GNU = _GNU_SOURCE; ++ enum __USE_REENTRANT = _REENTRANT; + + version(D_LP64) + enum __WORDSIZE=64; +--- a/src/libphobos/libdruntime/core/sys/posix/dlfcn.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/dlfcn.d 2014-04-01 16:32:51.000000000 +0100 +@@ -36,24 +36,75 @@ void* dlsym(void*, in char*); + + version( linux ) + { +- enum RTLD_LAZY = 0x00001; +- enum RTLD_NOW = 0x00002; +- enum RTLD_GLOBAL = 0x00100; +- enum RTLD_LOCAL = 0x00000; ++ version (X86) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0x00000; ++ } ++ else version (X86_64) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0x00000; ++ } ++ else version (MIPS32) ++ { ++ enum RTLD_LAZY = 0x0001; ++ enum RTLD_NOW = 0x0002; ++ enum RTLD_GLOBAL = 0x0004; ++ enum RTLD_LOCAL = 0; ++ } ++ else version (PPC) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0; ++ } ++ else version (PPC64) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0; ++ } ++ else version (ARM) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0; ++ } ++ else version (AArch64) ++ { ++ enum RTLD_LAZY = 0x00001; ++ enum RTLD_NOW = 0x00002; ++ enum RTLD_GLOBAL = 0x00100; ++ enum RTLD_LOCAL = 0; ++ } ++ else ++ static assert(0, "unimplemented"); + + int dlclose(void*); + char* dlerror(); + void* dlopen(in char*, int); + void* dlsym(void*, in char*); +- int dladdr(void* addr, Dl_info* info); +- void* dlvsym(void* handle, in char* symbol, in char* version_); + +- struct Dl_info ++ deprecated("Please use core.sys.linux.dlfcn for non-POSIX extensions") + { +- const(char)* dli_fname; +- void* dli_fbase; +- const(char)* dli_sname; +- void* dli_saddr; ++ int dladdr(void* addr, Dl_info* info); ++ void* dlvsym(void* handle, in char* symbol, in char* version_); ++ ++ struct Dl_info ++ { ++ const(char)* dli_fname; ++ void* dli_fbase; ++ const(char)* dli_sname; ++ void* dli_saddr; ++ } + } + } + else version( OSX ) +--- a/src/libphobos/libdruntime/core/sys/posix/fcntl.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/fcntl.d 2014-04-01 16:32:51.000000000 +0100 +@@ -101,7 +101,33 @@ version( linux ) + enum F_UNLCK = 2; + enum F_WRLCK = 1; + +- version (MIPS) ++ version (X86) ++ { ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 ++ enum O_RSYNC = O_SYNC; ++ } ++ else version (X86_64) ++ { ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 ++ enum O_RSYNC = O_SYNC; ++ } ++ else version (MIPS32) + { + enum O_CREAT = 0x0100; + enum O_EXCL = 0x0400; +@@ -114,19 +140,60 @@ version( linux ) + enum O_RSYNC = O_SYNC; + enum O_SYNC = 0x0010; + } +- else ++ else version (PPC) + { +- enum O_CREAT = 0x40; // octal 0100 +- enum O_EXCL = 0x80; // octal 0200 +- enum O_NOCTTY = 0x100; // octal 0400 +- enum O_TRUNC = 0x200; // octal 01000 +- +- enum O_APPEND = 0x400; // octal 02000 +- enum O_NONBLOCK = 0x800; // octal 04000 +- enum O_SYNC = 0x1000; // octal 010000 +- enum O_DSYNC = O_SYNC; ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 ++ enum O_RSYNC = O_SYNC; ++ } ++ else version (PPC64) ++ { ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 ++ enum O_RSYNC = O_SYNC; ++ } ++ else version (ARM) ++ { ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 ++ enum O_RSYNC = O_SYNC; ++ } ++ else version (AArch64) ++ { ++ enum O_CREAT = 0x40; // octal 0100 ++ enum O_EXCL = 0x80; // octal 0200 ++ enum O_NOCTTY = 0x100; // octal 0400 ++ enum O_TRUNC = 0x200; // octal 01000 ++ ++ enum O_APPEND = 0x400; // octal 02000 ++ enum O_NONBLOCK = 0x800; // octal 04000 ++ enum O_SYNC = 0x101000; // octal 04010000 ++ enum O_DSYNC = 0x1000; // octal 010000 + enum O_RSYNC = O_SYNC; + } ++ else ++ static assert(0, "unimplemented"); + + enum O_ACCMODE = 0x3; + enum O_RDONLY = 0x0; +--- a/src/libphobos/libdruntime/core/sys/posix/grp.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/grp.d 2014-04-01 16:32:51.000000000 +0100 +@@ -73,7 +73,7 @@ else + } + + group* getgrnam(in char*); +-group* getgruid(uid_t); ++group* getgrgid(gid_t); + + // + // Thread-Safe Functions (TSF) +--- a/src/libphobos/libdruntime/core/sys/posix/pthread.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/pthread.d 2014-04-01 16:32:51.000000000 +0100 +@@ -123,9 +123,8 @@ version( linux ) + PTHREAD_EXPLICIT_SCHED + } + +- //enum pthread_mutex_t PTHREAD_MUTEX_INITIALIZER = { 0, 0, null, PTHREAD_MUTEX_NORMAL, { 0, 0 } }; +- +- enum PTHREAD_ONCE_INIT = pthread_once_t.init; ++ enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init; ++ enum PTHREAD_ONCE_INIT = pthread_once_t.init; + + enum + { +@@ -163,9 +162,8 @@ else version( OSX ) + PTHREAD_EXPLICIT_SCHED = 2 + } + +- //enum pthread_mutex_t PTHREAD_MUTEX_INITIALIZER = { 0, 0, null, PTHREAD_MUTEX_NORMAL, { 0, 0 } }; +- +- enum PTHREAD_ONCE_INIT = pthread_once_t.init; ++ enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init; ++ enum PTHREAD_ONCE_INIT = pthread_once_t.init; + + enum + { +@@ -205,9 +203,8 @@ else version( FreeBSD ) + enum PTHREAD_NEEDS_INIT = 0; + enum PTHREAD_DONE_INIT = 1; + +- //enum pthread_once_t PTHREAD_ONCE_INIT = { PTHREAD_NEEDS_INIT, null }; +- + enum PTHREAD_MUTEX_INITIALIZER = null; ++ enum PTHREAD_ONCE_INIT = null; + enum PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP = null; + enum PTHREAD_COND_INITIALIZER = null; + enum PTHREAD_RWLOCK_INITIALIZER = null; +@@ -238,6 +235,9 @@ else version (Solaris) + } + + enum PTHREAD_CANCELED = cast(void*)-19; ++ ++ enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init; ++ enum PTHREAD_ONCE_INIT = pthread_once_t.init; + } + else + { +@@ -652,32 +652,32 @@ else + // Timeouts (TMO) + // + /* +-int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); ++int pthread_mutex_timedlock(pthread_mutex_t*, in timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, in timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, in timespec*); + */ + + version( linux ) + { +- int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); ++ int pthread_mutex_timedlock(pthread_mutex_t*, in timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, in timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, in timespec*); + } + else version( OSX ) + { +- int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); ++ int pthread_mutex_timedlock(pthread_mutex_t*, in timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, in timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, in timespec*); + } + else version( FreeBSD ) + { +- int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); ++ int pthread_mutex_timedlock(pthread_mutex_t*, in timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, in timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, in timespec*); + } + else version (Solaris) + { +- int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); ++ int pthread_mutex_timedlock(pthread_mutex_t*, in timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, in timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, in timespec*); + } +@@ -770,7 +770,7 @@ else version( OSX ) + int pthread_attr_setscope(pthread_attr_t*, int); + int pthread_getschedparam(pthread_t, int*, sched_param*); + int pthread_setschedparam(pthread_t, int, in sched_param*); +- int pthread_setschedprio(pthread_t, int); ++ // int pthread_setschedprio(pthread_t, int); // not implemented + } + else version( FreeBSD ) + { +@@ -788,7 +788,7 @@ else version( FreeBSD ) + int pthread_attr_setscope(in pthread_attr_t*, int); + int pthread_getschedparam(pthread_t, int*, sched_param*); + int pthread_setschedparam(pthread_t, int, sched_param*); +- int pthread_setschedprio(pthread_t, int); ++ // int pthread_setschedprio(pthread_t, int); // not implemented + } + else version (Solaris) + { +--- a/src/libphobos/libdruntime/core/sys/posix/signal.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/signal.d 2014-04-01 16:32:51.000000000 +0100 +@@ -113,7 +113,55 @@ version( Posix ) + + version( linux ) + { +- version (MIPS) ++ version (X86) ++ { ++ //SIGABRT (defined in core.stdc.signal) ++ enum SIGALRM = 14; ++ enum SIGBUS = 7; ++ enum SIGCHLD = 17; ++ enum SIGCONT = 18; ++ //SIGFPE (defined in core.stdc.signal) ++ enum SIGHUP = 1; ++ //SIGILL (defined in core.stdc.signal) ++ //SIGINT (defined in core.stdc.signal) ++ enum SIGKILL = 9; ++ enum SIGPIPE = 13; ++ enum SIGQUIT = 3; ++ //SIGSEGV (defined in core.stdc.signal) ++ enum SIGSTOP = 19; ++ //SIGTERM (defined in core.stdc.signal) ++ enum SIGTSTP = 20; ++ enum SIGTTIN = 21; ++ enum SIGTTOU = 22; ++ enum SIGUSR1 = 10; ++ enum SIGUSR2 = 12; ++ enum SIGURG = 23; ++ } ++ else version (X86_64) ++ { ++ //SIGABRT (defined in core.stdc.signal) ++ enum SIGALRM = 14; ++ enum SIGBUS = 7; ++ enum SIGCHLD = 17; ++ enum SIGCONT = 18; ++ //SIGFPE (defined in core.stdc.signal) ++ enum SIGHUP = 1; ++ //SIGILL (defined in core.stdc.signal) ++ //SIGINT (defined in core.stdc.signal) ++ enum SIGKILL = 9; ++ enum SIGPIPE = 13; ++ enum SIGQUIT = 3; ++ //SIGSEGV (defined in core.stdc.signal) ++ enum SIGSTOP = 19; ++ //SIGTERM (defined in core.stdc.signal) ++ enum SIGTSTP = 20; ++ enum SIGTTIN = 21; ++ enum SIGTTOU = 22; ++ enum SIGUSR1 = 10; ++ enum SIGUSR2 = 12; ++ enum SIGURG = 23; ++ } ++ else version (MIPS32) + { + //SIGABRT (defined in core.stdc.signal) + enum SIGALRM = 14; +@@ -137,7 +185,7 @@ version( linux ) + enum SIGUSR2 = 17; + enum SIGURG = 21; + } +- else ++ else version (PPC) + { + //SIGABRT (defined in core.stdc.signal) + enum SIGALRM = 14; +@@ -161,6 +209,80 @@ version( linux ) + enum SIGUSR2 = 12; + enum SIGURG = 23; + } ++ else version (PPC64) ++ { ++ //SIGABRT (defined in core.stdc.signal) ++ enum SIGALRM = 14; ++ enum SIGBUS = 7; ++ enum SIGCHLD = 17; ++ enum SIGCONT = 18; ++ //SIGFPE (defined in core.stdc.signal) ++ enum SIGHUP = 1; ++ //SIGILL (defined in core.stdc.signal) ++ //SIGINT (defined in core.stdc.signal) ++ enum SIGKILL = 9; ++ enum SIGPIPE = 13; ++ enum SIGQUIT = 3; ++ //SIGSEGV (defined in core.stdc.signal) ++ enum SIGSTOP = 19; ++ //SIGTERM (defined in core.stdc.signal) ++ enum SIGTSTP = 20; ++ enum SIGTTIN = 21; ++ enum SIGTTOU = 22; ++ enum SIGUSR1 = 10; ++ enum SIGUSR2 = 12; ++ enum SIGURG = 23; ++ } ++ else version (ARM) ++ { ++ //SIGABRT (defined in core.stdc.signal) ++ enum SIGALRM = 14; ++ enum SIGBUS = 7; ++ enum SIGCHLD = 17; ++ enum SIGCONT = 18; ++ //SIGFPE (defined in core.stdc.signal) ++ enum SIGHUP = 1; ++ //SIGILL (defined in core.stdc.signal) ++ //SIGINT (defined in core.stdc.signal) ++ enum SIGKILL = 9; ++ enum SIGPIPE = 13; ++ enum SIGQUIT = 3; ++ //SIGSEGV (defined in core.stdc.signal) ++ enum SIGSTOP = 19; ++ //SIGTERM (defined in core.stdc.signal) ++ enum SIGTSTP = 20; ++ enum SIGTTIN = 21; ++ enum SIGTTOU = 22; ++ enum SIGUSR1 = 10; ++ enum SIGUSR2 = 12; ++ enum SIGURG = 23; ++ } ++ else version (AArch64) ++ { ++ //SIGABRT (defined in core.stdc.signal) ++ enum SIGALRM = 14; ++ enum SIGBUS = 7; ++ enum SIGCHLD = 17; ++ enum SIGCONT = 18; ++ //SIGFPE (defined in core.stdc.signal) ++ enum SIGHUP = 1; ++ //SIGILL (defined in core.stdc.signal) ++ //SIGINT (defined in core.stdc.signal) ++ enum SIGKILL = 9; ++ enum SIGPIPE = 13; ++ enum SIGQUIT = 3; ++ //SIGSEGV (defined in core.stdc.signal) ++ enum SIGSTOP = 19; ++ //SIGTERM (defined in core.stdc.signal) ++ enum SIGTSTP = 20; ++ enum SIGTTIN = 21; ++ enum SIGTTOU = 22; ++ enum SIGUSR1 = 10; ++ enum SIGUSR2 = 12; ++ enum SIGURG = 23; ++ } ++ else ++ static assert(0, "unimplemented"); + } + else version( OSX ) + { +@@ -804,17 +926,17 @@ int sigrelse(int); + + version( linux ) + { +- version (MIPS) ++ version (X86) + { +- enum SIGPOLL = 22; +- enum SIGPROF = 29; +- enum SIGSYS = 12; +- enum SIGTRAP = 5; +- enum SIGVTALRM = 28; +- enum SIGXCPU = 30; +- enum SIGXFSZ = 31; ++ enum SIGPOLL = 29; ++ enum SIGPROF = 27; ++ enum SIGSYS = 31; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 26; ++ enum SIGXCPU = 24; ++ enum SIGXFSZ = 25; + } +- else ++ else version (X86_64) + { + enum SIGPOLL = 29; + enum SIGPROF = 27; +@@ -824,6 +946,59 @@ version( linux ) + enum SIGXCPU = 24; + enum SIGXFSZ = 25; + } ++ else version (MIPS32) ++ { ++ enum SIGPOLL = 22; ++ enum SIGPROF = 29; ++ enum SIGSYS = 12; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 28; ++ enum SIGXCPU = 30; ++ enum SIGXFSZ = 31; ++ } ++ else version (PPC) ++ { ++ enum SIGPOLL = 29; ++ enum SIGPROF = 27; ++ enum SIGSYS = 31; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 26; ++ enum SIGXCPU = 24; ++ enum SIGXFSZ = 25; ++ } ++ else version (PPC64) ++ { ++ enum SIGPOLL = 29; ++ enum SIGPROF = 27; ++ enum SIGSYS = 31; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 26; ++ enum SIGXCPU = 24; ++ enum SIGXFSZ = 25; ++ } ++ else version (ARM) ++ { ++ enum SIGPOLL = 29; ++ enum SIGPROF = 27; ++ enum SIGSYS = 31; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 26; ++ enum SIGXCPU = 24; ++ enum SIGXFSZ = 25; ++ } ++ else version (AArch64) ++ { ++ enum SIGPOLL = 29; ++ enum SIGPROF = 27; ++ enum SIGSYS = 31; ++ enum SIGTRAP = 5; ++ enum SIGVTALRM = 26; ++ enum SIGXCPU = 24; ++ enum SIGXFSZ = 25; ++ } ++ else ++ static assert(0, "unimplemented"); ++ + enum SA_ONSTACK = 0x08000000; + enum SA_RESETHAND = 0x80000000; + enum SA_RESTART = 0x10000000; +--- a/src/libphobos/libdruntime/core/sys/posix/sys/mman.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/mman.d 2014-04-01 16:32:51.000000000 +0100 +@@ -20,6 +20,7 @@ public import core.sys.posix.sys.types; + + version (Posix): + extern (C): ++nothrow: + + // + // Advisory Information (ADV) +@@ -41,11 +42,23 @@ POSIX_MADV_DONTNEED + + version( linux ) + { +- enum POSIX_MADV_NORMAL = 0; +- enum POSIX_MADV_RANDOM = 1; +- enum POSIX_MADV_SEQUENTIAL = 2; +- enum POSIX_MADV_WILLNEED = 3; +- enum POSIX_MADV_DONTNEED = 4; ++ version (Alpha) ++ private enum __POSIX_MADV_DONTNEED = 6; ++ else ++ private enum __POSIX_MADV_DONTNEED = 4; ++ ++ static if (__USE_XOPEN2K) ++ { ++ enum ++ { ++ POSIX_MADV_NORMAL = 0, ++ POSIX_MADV_RANDOM = 1, ++ POSIX_MADV_SEQUENTIAL = 2, ++ POSIX_MADV_WILLNEED = 3, ++ POSIX_MADV_DONTNEED = __POSIX_MADV_DONTNEED, ++ } ++ int posix_madvise(void *__addr, size_t __len, int __advice); ++ } + } + else version( OSX ) + { +@@ -54,6 +67,7 @@ else version( OSX ) + enum POSIX_MADV_SEQUENTIAL = 2; + enum POSIX_MADV_WILLNEED = 3; + enum POSIX_MADV_DONTNEED = 4; ++ int posix_madvise(void *addr, size_t len, int advice); + } + else version( FreeBSD ) + { +@@ -62,14 +76,10 @@ else version( FreeBSD ) + enum POSIX_MADV_SEQUENTIAL = 2; + enum POSIX_MADV_WILLNEED = 3; + enum POSIX_MADV_DONTNEED = 4; ++ int posix_madvise(void *addr, size_t len, int advice); + } + else version (Solaris) + { +- enum POSIX_MADV_NORMAL = 0; +- enum POSIX_MADV_RANDOM = 1; +- enum POSIX_MADV_SEQUENTIAL = 2; +- enum POSIX_MADV_WILLNEED = 3; +- enum POSIX_MADV_DONTNEED = 4; + } + else + { +@@ -129,18 +139,12 @@ int munmap(void*, size_t); + + version( linux ) + { +- //void* mmap(void*, size_t, int, int, int, off_t); +- int munmap(void*, size_t); +- +- static if( __USE_FILE_OFFSET64 ) +- { +- void* mmap64(void*, size_t, int, int, int, off_t); +- alias mmap64 mmap; +- } +- else +- { +- void* mmap(void*, size_t, int, int, int, off_t); +- } ++ static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t); ++ static if (__USE_FILE_OFFSET64) ++ alias mmap = mmap64; ++ else ++ void* mmap(void*, size_t, int, int, int, off_t); ++ int munmap(void*, size_t); + } + else version( OSX ) + { +@@ -184,18 +188,35 @@ version( linux ) + enum MAP_PRIVATE = 0x02; + enum MAP_FIXED = 0x10; + +- version (MIPS) +- enum MAP_ANON = 0x0800; // non-standard +- else +- enum MAP_ANON = 0x20; // non-standard ++ static import core.sys.linux.sys.mman; ++ deprecated("Please use core.sys.linux.sys.mman for non-POSIX extensions") ++ alias MAP_ANON = core.sys.linux.sys.mman.MAP_ANON; + + enum MAP_FAILED = cast(void*) -1; + +- enum ++ version (Alpha) enum ++ { ++ MS_ASYNC = 1, ++ MS_SYNC = 2, ++ MS_INVALIDATE = 4, ++ } ++ else version (HPPA) enum + { +- MS_ASYNC = 1, +- MS_SYNC = 4, +- MS_INVALIDATE = 2 ++ MS_ASYNC = 1, ++ MS_SYNC = 2, ++ MS_INVALIDATE = 4, ++ } ++ else version (HPPA64) enum ++ { ++ MS_ASYNC = 1, ++ MS_SYNC = 2, ++ MS_INVALIDATE = 4, ++ } ++ else enum ++ { ++ MS_ASYNC = 1, ++ MS_SYNC = 4, ++ MS_INVALIDATE = 2 + } + + int msync(void*, size_t, int); +@@ -263,8 +284,36 @@ int munlockall(); + + version( linux ) + { +- enum MCL_CURRENT = 1; +- enum MCL_FUTURE = 2; ++ version (SPARC) enum ++ { ++ MCL_CURRENT = 0x2000, ++ MCL_FUTURE = 0x4000, ++ } ++ else version (SPARC64) enum ++ { ++ MCL_CURRENT = 0x2000, ++ MCL_FUTURE = 0x4000, ++ } ++ else version (PPC) enum ++ { ++ MCL_CURRENT = 0x2000, ++ MCL_FUTURE = 0x4000, ++ } ++ else version (PPC64) enum ++ { ++ MCL_CURRENT = 0x2000, ++ MCL_FUTURE = 0x4000, ++ } ++ else version (Alpha) enum ++ { ++ MCL_CURRENT = 8192, ++ MCL_FUTURE = 16384, ++ } ++ else enum ++ { ++ MCL_CURRENT = 1, ++ MCL_FUTURE = 2, ++ } + + int mlockall(int); + int munlockall(); +--- a/src/libphobos/libdruntime/core/sys/posix/sys/resource.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/resource.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,312 @@ ++/** ++ * D header file for POSIX. ++ * ++ * Copyright: Copyright (c) 2013 Lars Tandle Kyllingstad. ++ * License: Boost License 1.0. ++ * Authors: Lars Tandle Kyllingstad ++ * Standards: The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008 ++ */ ++module core.sys.posix.sys.resource; ++version (Posix): ++ ++public import core.sys.posix.sys.time; ++public import core.sys.posix.sys.types: id_t; ++import core.sys.posix.config; ++ ++nothrow extern(C): ++ ++// ++// XOpen (XSI) ++// ++// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_resource.h.html ++/* ++enum ++{ ++ PRIO_PROCESS, ++ PRIO_PGRP, ++ PRIO_USER, ++} ++ ++alias ulong rlim_t; ++ ++enum ++{ ++ RLIM_INFINITY, ++ RLIM_SAVED_MAX, ++ RLIM_SAVED_CUR, ++} ++ ++enum ++{ ++ RUSAGE_SELF, ++ RUSAGE_CHILDREN, ++} ++ ++struct rlimit ++{ ++ rlim_t rlim_cur; ++ rlim_t rlim_max; ++} ++ ++struct rusage ++{ ++ timeval ru_utime; ++ timeval ru_stime; ++} ++ ++enum ++{ ++ RLIMIT_CORE, ++ RLIMIT_CPU, ++ RLIMIT_DATA, ++ RLIMIT_FSIZE, ++ RLIMIT_NOFILE, ++ RLIMIT_STACK, ++ RLIMIT_AS, ++} ++ ++int getpriority(int, id_t); ++int getrlimit(int, rlimit*); ++int getrusage(int, rusage*); ++int setpriority(int, id_t, int); ++int setrlimit(int, const rlimit*); ++*/ ++ ++ ++version (linux) ++{ ++ ++ enum ++ { ++ PRIO_PROCESS = 0, ++ PRIO_PGRP = 1, ++ PRIO_USER = 2, ++ } ++ ++ static if (__USE_FILE_OFFSET64) ++ alias ulong rlim_t; ++ else ++ alias c_ulong rlim_t; ++ ++ static if (__USE_FILE_OFFSET64) ++ enum RLIM_INFINITY = 0xffffffffffffffffUL; ++ else ++ enum RLIM_INFINITY = cast(c_ulong)(~0UL); ++ ++ enum RLIM_SAVED_MAX = RLIM_INFINITY; ++ enum RLIM_SAVED_CUR = RLIM_INFINITY; ++ ++ enum ++ { ++ RUSAGE_SELF = 0, ++ RUSAGE_CHILDREN = -1, ++ } ++ ++ struct rusage ++ { ++ timeval ru_utime; ++ timeval ru_stime; ++ c_long ru_maxrss; ++ c_long ru_ixrss; ++ c_long ru_idrss; ++ c_long ru_isrss; ++ c_long ru_minflt; ++ c_long ru_majflt; ++ c_long ru_nswap; ++ c_long ru_inblock; ++ c_long ru_oublock; ++ c_long ru_msgsnd; ++ c_long ru_msgrcv; ++ c_long ru_nsignals; ++ c_long ru_nvcsw; ++ c_long ru_nivcsw; ++ } ++ ++ enum ++ { ++ RLIMIT_CORE = 4, ++ RLIMIT_CPU = 0, ++ RLIMIT_DATA = 2, ++ RLIMIT_FSIZE = 1, ++ RLIMIT_NOFILE = 7, ++ RLIMIT_STACK = 3, ++ RLIMIT_AS = 9, ++ } ++} ++else version (OSX) ++{ ++ enum ++ { ++ PRIO_PROCESS = 0, ++ PRIO_PGRP = 1, ++ PRIO_USER = 2, ++ } ++ ++ alias ulong rlim_t; ++ ++ enum ++ { ++ RLIM_INFINITY = ((cast(ulong) 1 << 63) - 1), ++ RLIM_SAVED_MAX = RLIM_INFINITY, ++ RLIM_SAVED_CUR = RLIM_INFINITY, ++ } ++ ++ enum ++ { ++ RUSAGE_SELF = 0, ++ RUSAGE_CHILDREN = -1, ++ } ++ ++ struct rusage ++ { ++ timeval ru_utime; ++ timeval ru_stime; ++ c_long[14] ru_opaque; ++ } ++ ++ enum ++ { ++ RLIMIT_CORE = 4, ++ RLIMIT_CPU = 0, ++ RLIMIT_DATA = 2, ++ RLIMIT_FSIZE = 1, ++ RLIMIT_NOFILE = 8, ++ RLIMIT_STACK = 3, ++ RLIMIT_AS = 5, ++ } ++} ++else version (FreeBSD) ++{ ++ enum ++ { ++ PRIO_PROCESS = 0, ++ PRIO_PGRP = 1, ++ PRIO_USER = 2, ++ } ++ ++ alias long rlim_t; ++ ++ enum ++ { ++ RLIM_INFINITY = (cast(rlim_t)((cast(ulong) 1 << 63) - 1)), ++ // FreeBSD explicitly does not define the following: ++ //RLIM_SAVED_MAX, ++ //RLIM_SAVED_CUR, ++ } ++ ++ enum ++ { ++ RUSAGE_SELF = 0, ++ RUSAGE_CHILDREN = -1, ++ } ++ ++ struct rusage ++ { ++ timeval ru_utime; ++ timeval ru_stime; ++ c_long ru_maxrss; ++ alias ru_ixrss ru_first; ++ c_long ru_ixrss; ++ c_long ru_idrss; ++ c_long ru_isrss; ++ c_long ru_minflt; ++ c_long ru_majflt; ++ c_long ru_nswap; ++ c_long ru_inblock; ++ c_long ru_oublock; ++ c_long ru_msgsnd; ++ c_long ru_msgrcv; ++ c_long ru_nsignals; ++ c_long ru_nvcsw; ++ c_long ru_nivcsw; ++ alias ru_nivcsw ru_last; ++ } ++ ++ enum ++ { ++ RLIMIT_CORE = 4, ++ RLIMIT_CPU = 0, ++ RLIMIT_DATA = 2, ++ RLIMIT_FSIZE = 1, ++ RLIMIT_NOFILE = 8, ++ RLIMIT_STACK = 3, ++ RLIMIT_AS = 10, ++ } ++} ++else version (Solaris) ++{ ++ enum ++ { ++ PRIO_PROCESS = 0, ++ PRIO_PGRP = 1, ++ PRIO_USER = 2, ++ } ++ ++ alias c_ulong rlim_t; ++ ++ enum : c_long ++ { ++ RLIM_INFINITY = -3, ++ RLIM_SAVED_MAX = -2, ++ RLIM_SAVED_CUR = -1, ++ } ++ ++ enum ++ { ++ RUSAGE_SELF = 0, ++ RUSAGE_CHILDREN = -1, ++ } ++ ++ struct rusage ++ { ++ timeval ru_utime; ++ timeval ru_stime; ++ c_long ru_maxrss; ++ c_long ru_ixrss; ++ c_long ru_idrss; ++ c_long ru_isrss; ++ c_long ru_minflt; ++ c_long ru_majflt; ++ c_long ru_nswap; ++ c_long ru_inblock; ++ c_long ru_oublock; ++ c_long ru_msgsnd; ++ c_long ru_msgrcv; ++ c_long ru_nsignals; ++ c_long ru_nvcsw; ++ c_long ru_nivcsw; ++ } ++ ++ enum ++ { ++ RLIMIT_CORE = 4, ++ RLIMIT_CPU = 0, ++ RLIMIT_DATA = 2, ++ RLIMIT_FSIZE = 1, ++ RLIMIT_NOFILE = 5, ++ RLIMIT_STACK = 3, ++ RLIMIT_AS = 6, ++ } ++} ++else static assert (false, "Unsupported platform"); ++ ++struct rlimit ++{ ++ rlim_t rlim_cur; ++ rlim_t rlim_max; ++} ++ ++version (FreeBSD) ++{ ++ int getpriority(int, int); ++ int setpriority(int, int, int); ++} ++else ++{ ++ int getpriority(int, id_t); ++ int setpriority(int, id_t, int); ++} ++ ++int getrlimit(int, rlimit*); ++int getrusage(int, rusage*); ++int setrlimit(int, const rlimit*); +--- a/src/libphobos/libdruntime/core/sys/posix/sys/socket.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/socket.d 2014-04-01 16:32:51.000000000 +0100 +@@ -208,7 +208,75 @@ version( linux ) + int l_linger; + } + +- version (MIPS) ++ version (X86) ++ { ++ enum ++ { ++ SOCK_DGRAM = 2, ++ SOCK_SEQPACKET = 5, ++ SOCK_STREAM = 1 ++ } ++ ++ enum ++ { ++ SOL_SOCKET = 1 ++ } ++ ++ enum ++ { ++ SO_ACCEPTCONN = 30, ++ SO_BROADCAST = 6, ++ SO_DEBUG = 1, ++ SO_DONTROUTE = 5, ++ SO_ERROR = 4, ++ SO_KEEPALIVE = 9, ++ SO_LINGER = 13, ++ SO_OOBINLINE = 10, ++ SO_RCVBUF = 8, ++ SO_RCVLOWAT = 18, ++ SO_RCVTIMEO = 20, ++ SO_REUSEADDR = 2, ++ SO_SNDBUF = 7, ++ SO_SNDLOWAT = 19, ++ SO_SNDTIMEO = 21, ++ SO_TYPE = 3 ++ } ++ } ++ else version (X86_64) ++ { ++ enum ++ { ++ SOCK_DGRAM = 2, ++ SOCK_SEQPACKET = 5, ++ SOCK_STREAM = 1 ++ } ++ ++ enum ++ { ++ SOL_SOCKET = 1 ++ } ++ ++ enum ++ { ++ SO_ACCEPTCONN = 30, ++ SO_BROADCAST = 6, ++ SO_DEBUG = 1, ++ SO_DONTROUTE = 5, ++ SO_ERROR = 4, ++ SO_KEEPALIVE = 9, ++ SO_LINGER = 13, ++ SO_OOBINLINE = 10, ++ SO_RCVBUF = 8, ++ SO_RCVLOWAT = 18, ++ SO_RCVTIMEO = 20, ++ SO_REUSEADDR = 2, ++ SO_SNDBUF = 7, ++ SO_SNDLOWAT = 19, ++ SO_SNDTIMEO = 21, ++ SO_TYPE = 3 ++ } ++ } ++ else version (MIPS32) + { + enum + { +@@ -242,7 +310,75 @@ version( linux ) + SO_TYPE = 0x1008, + } + } +- else ++ else version (PPC) ++ { ++ enum ++ { ++ SOCK_DGRAM = 2, ++ SOCK_SEQPACKET = 5, ++ SOCK_STREAM = 1 ++ } ++ ++ enum ++ { ++ SOL_SOCKET = 1 ++ } ++ ++ enum ++ { ++ SO_ACCEPTCONN = 30, ++ SO_BROADCAST = 6, ++ SO_DEBUG = 1, ++ SO_DONTROUTE = 5, ++ SO_ERROR = 4, ++ SO_KEEPALIVE = 9, ++ SO_LINGER = 13, ++ SO_OOBINLINE = 10, ++ SO_RCVBUF = 8, ++ SO_RCVLOWAT = 16, ++ SO_RCVTIMEO = 18, ++ SO_REUSEADDR = 2, ++ SO_SNDBUF = 7, ++ SO_SNDLOWAT = 17, ++ SO_SNDTIMEO = 19, ++ SO_TYPE = 3 ++ } ++ } ++ else version (PPC64) ++ { ++ enum ++ { ++ SOCK_DGRAM = 2, ++ SOCK_SEQPACKET = 5, ++ SOCK_STREAM = 1 ++ } ++ ++ enum ++ { ++ SOL_SOCKET = 1 ++ } ++ ++ enum ++ { ++ SO_ACCEPTCONN = 30, ++ SO_BROADCAST = 6, ++ SO_DEBUG = 1, ++ SO_DONTROUTE = 5, ++ SO_ERROR = 4, ++ SO_KEEPALIVE = 9, ++ SO_LINGER = 13, ++ SO_OOBINLINE = 10, ++ SO_RCVBUF = 8, ++ SO_RCVLOWAT = 16, ++ SO_RCVTIMEO = 18, ++ SO_REUSEADDR = 2, ++ SO_SNDBUF = 7, ++ SO_SNDLOWAT = 17, ++ SO_SNDTIMEO = 19, ++ SO_TYPE = 3 ++ } ++ } ++ else version (ARM) + { + enum + { +@@ -276,6 +412,8 @@ version( linux ) + SO_TYPE = 3 + } + } ++ else ++ static assert(0, "unimplemented"); + + enum + { +--- a/src/libphobos/libdruntime/core/sys/posix/sys/stat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/stat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -81,161 +81,124 @@ mode_t umask(mode_t); + + version( linux ) + { +- version (X86) version = AnyX86; +- version (X86_64) version = AnyX86; +- +- version (MIPS) ++ version (X86) + { +- version (MIPS_O32) ++ struct stat_t + { +- struct stat_t ++ dev_t st_dev; ++ ushort __pad1; ++ static if (!__USE_FILE_OFFSET64) + { +- c_ulong st_dev; +- c_long[3] st_pad1; + ino_t st_ino; +- mode_t st_mode; +- nlink_t st_nlink; +- uid_t st_uid; +- gid_t st_gid; +- c_ulong st_rdev; +- static if (!__USE_FILE_OFFSET64) +- { +- c_long[2] st_pad2; +- off_t st_size; +- c_long st_pad3; +- } +- else +- { +- c_long[3] st_pad2; +- off_t st_size; +- } +- static if (__USE_MISC || __USE_XOPEN2K8) +- { +- timespec st_atim; +- timespec st_mtim; +- timespec st_ctim; +- extern(D) +- { +- @property ref time_t st_atime() { return st_atim.tv_sec; } +- @property ref time_t st_mtime() { return st_mtim.tv_sec; } +- @property ref time_t st_ctime() { return st_ctim.tv_sec; } +- } +- } +- else +- { +- time_t st_atime; +- c_ulong st_atimensec; +- time_t st_mtime; +- c_ulong st_mtimensec; +- time_t st_ctime; +- c_ulong st_ctimensec; +- } +- blksize_t st_blksize; +- static if (!__USE_FILE_OFFSET64) +- { +- blkcnt_t st_blocks; +- } +- else +- { +- c_long st_pad4; +- blkcnt_t st_blocks; +- } +- c_long[14] st_pad5; + } +- } +- else +- { +- struct stat_t ++ else + { +- dev_t st_dev; +- int[3] st_pad1; +- ino_t st_ino; +- mode_t st_mode; +- nlink_t st_nlink; +- uid_t st_uid; +- gid_t st_gid; +- dev_t st_rdev; +- static if (!__USE_FILE_OFFSET64) +- { +- uint[2] st_pad2; +- off_t st_size; +- int st_pad3; +- } +- else +- { +- uint[3] st_pad2; +- off_t st_size; +- } +- static if (__USE_MISC || __USE_XOPEN2K8) +- { +- timespec st_atim; +- timespec st_mtim; +- timespec st_ctim; +- extern(D) +- { +- @property ref time_t st_atime() { return st_atim.tv_sec; } +- @property ref time_t st_mtime() { return st_mtim.tv_sec; } +- @property ref time_t st_ctime() { return st_ctim.tv_sec; } +- } +- } +- else ++ uint __st_ino; ++ } ++ mode_t st_mode; ++ nlink_t st_nlink; ++ uid_t st_uid; ++ gid_t st_gid; ++ dev_t st_rdev; ++ ushort __pad2; ++ off_t st_size; ++ blksize_t st_blksize; ++ blkcnt_t st_blocks; ++ static if (__USE_MISC || __USE_XOPEN2K8) ++ { ++ timespec st_atim; ++ timespec st_mtim; ++ timespec st_ctim; ++ extern(D) + { +- time_t st_atime; +- c_ulong st_atimensec; +- time_t st_mtime; +- c_ulong st_mtimensec; +- time_t st_ctime; +- c_ulong st_ctimensec; ++ @property ref time_t st_atime() { return st_atim.tv_sec; } ++ @property ref time_t st_mtime() { return st_mtim.tv_sec; } ++ @property ref time_t st_ctime() { return st_ctim.tv_sec; } + } +- blksize_t st_blksize; +- uint st_pad4; +- blkcnt_t st_blocks; +- int[14] st_pad5; + } +- } +- } +- else version (AnyX86) +- { +- struct stat_t +- { +- dev_t st_dev; +- static if(__WORDSIZE==32) ++ else + { +- ushort __pad1; ++ time_t st_atime; ++ ulong_t st_atimensec; ++ time_t st_mtime; ++ ulong_t st_mtimensec; ++ time_t st_ctime; ++ ulong_t st_ctimensec; + } +- static if( !__USE_FILE_OFFSET64 || __WORDSIZE==64 ) ++ static if (__USE_FILE_OFFSET64) + { +- uint st_ino; ++ ino_t st_ino; + } + else + { +- uint __st_ino; ++ c_ulong __unused4; ++ c_ulong __unused5; + } +- static if (__WORDSIZE==32) ++ } ++ } ++ else version (X86_64) ++ { ++ struct stat_t ++ { ++ dev_t st_dev; ++ ino_t st_ino; ++ nlink_t st_nlink; ++ mode_t st_mode; ++ uid_t st_uid; ++ gid_t st_gid; ++ uint __pad0; ++ dev_t st_rdev; ++ off_t st_size; ++ blksize_t st_blksize; ++ blkcnt_t st_blocks; ++ static if (__USE_MISC || __USE_XOPEN2K8) + { +- mode_t st_mode; +- nlink_t st_nlink; ++ timespec st_atim; ++ timespec st_mtim; ++ timespec st_ctim; ++ extern(D) ++ { ++ @property ref time_t st_atime() { return st_atim.tv_sec; } ++ @property ref time_t st_mtime() { return st_mtim.tv_sec; } ++ @property ref time_t st_ctime() { return st_ctim.tv_sec; } ++ } + } + else + { +- nlink_t st_nlink; +- mode_t st_mode; ++ time_t st_atime; ++ ulong_t st_atimensec; ++ time_t st_mtime; ++ ulong_t st_mtimensec; ++ time_t st_ctime; ++ ulong_t st_ctimensec; + } ++ slong_t __unused[3]; ++ } ++ } ++ else version (MIPS_O32) ++ { ++ struct stat_t ++ { ++ c_ulong st_dev; ++ c_long[3] st_pad1; ++ ino_t st_ino; ++ mode_t st_mode; ++ nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; +- static if(__WORDSIZE==64) ++ c_ulong st_rdev; ++ static if (!__USE_FILE_OFFSET64) + { +- uint pad0; ++ c_long[2] st_pad2; ++ off_t st_size; ++ c_long st_pad3; + } +- dev_t st_rdev; +- static if(__WORDSIZE==32) ++ else + { +- ushort __pad2; ++ c_long[3] st_pad2; ++ off_t st_size; + } +- off_t st_size; +- blksize_t st_blksize; +- blkcnt_t st_blocks; +- static if( __USE_MISC || __USE_XOPEN2K8 ) ++ static if (__USE_MISC || __USE_XOPEN2K8) + { + timespec st_atim; + timespec st_mtim; +@@ -256,23 +219,248 @@ version( linux ) + time_t st_ctime; + c_ulong st_ctimensec; + } +- static if(__WORDSIZE==64) ++ blksize_t st_blksize; ++ static if (!__USE_FILE_OFFSET64) ++ { ++ blkcnt_t st_blocks; ++ } ++ else ++ { ++ c_long st_pad4; ++ blkcnt_t st_blocks; ++ } ++ c_long[14] st_pad5; ++ } ++ } ++ else version (PPC) ++ { ++ struct stat_t ++ { ++ c_ulong st_dev; ++ ino_t st_ino; ++ mode_t st_mode; ++ nlink_t st_nlink; ++ uid_t st_uid; ++ gid_t st_gid; ++ c_ulong st_rdev; ++ off_t st_size; ++ c_ulong st_blksize; ++ c_ulong st_blocks; ++ c_ulong st_atime; ++ c_ulong st_atime_nsec; ++ c_ulong st_mtime; ++ c_ulong st_mtime_nsec; ++ c_ulong st_ctime; ++ c_ulong st_ctime_nsec; ++ c_ulong __unused4; ++ c_ulong __unused5; ++ } ++ } ++ else version (PPC64) ++ { ++ struct stat_t ++ { ++ c_ulong st_dev; ++ ino_t st_ino; ++ nlink_t st_nlink; ++ mode_t st_mode; ++ uid_t st_uid; ++ gid_t st_gid; ++ c_ulong st_rdev; ++ off_t st_size; ++ c_ulong st_blksize; ++ c_ulong st_blocks; ++ c_ulong st_atime; ++ c_ulong st_atime_nsec; ++ c_ulong st_mtime; ++ c_ulong st_mtime_nsec; ++ c_ulong st_ctime; ++ c_ulong st_ctime_nsec; ++ c_ulong __unused4; ++ c_ulong __unused5; ++ c_ulong __unused6; ++ } ++ } ++ else version (ARM) ++ { ++ private ++ { ++ alias __dev_t = ulong; ++ alias __ino_t = c_ulong; ++ alias __ino64_t = ulong; ++ alias __mode_t = uint; ++ alias __nlink_t = size_t; ++ alias __uid_t = uint; ++ alias __gid_t = uint; ++ alias __off_t = c_long; ++ alias __off64_t = long; ++ alias __blksize_t = c_long; ++ alias __blkcnt_t = c_long; ++ alias __blkcnt64_t = long; ++ alias __timespec = timespec; ++ alias __time_t = time_t; ++ } ++ struct stat_t ++ { ++ __dev_t st_dev; ++ ushort __pad1; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __ino_t st_ino; ++ } ++ else + { +- c_long __unused[3]; ++ __ino_t __st_ino; ++ } ++ __mode_t st_mode; ++ __nlink_t st_nlink; ++ __uid_t st_uid; ++ __gid_t st_gid; ++ __dev_t st_rdev; ++ ushort __pad2; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __off_t st_size; + } + else + { +- static if( __USE_FILE_OFFSET64 ) ++ __off64_t st_size; ++ } ++ __blksize_t st_blksize; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __blkcnt_t st_blocks; ++ } ++ else ++ { ++ __blkcnt64_t st_blocks; ++ } ++ ++ static if( __USE_MISC || __USE_XOPEN2K8) ++ { ++ __timespec st_atim; ++ __timespec st_mtim; ++ __timespec st_ctim; ++ extern(D) + { +- ino_t st_ino; ++ @property ref time_t st_atime() { return st_atim.tv_sec; } ++ @property ref time_t st_mtime() { return st_mtim.tv_sec; } ++ @property ref time_t st_ctime() { return st_ctim.tv_sec; } + } +- else ++ } ++ else ++ { ++ __time_t st_atime; ++ c_ulong st_atimensec; ++ __time_t st_mtime; ++ c_ulong st_mtimensec; ++ __time_t st_ctime; ++ c_ulong st_ctimensec; ++ } ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ c_ulong __unused4; ++ c_ulong __unused5; ++ } ++ else ++ { ++ __ino64_t st_ino; ++ } ++ } ++ static if(__USE_FILE_OFFSET64) ++ static assert(stat_t.sizeof == 104); ++ else ++ static assert(stat_t.sizeof == 88); ++ } ++ else version (AArch64) ++ { ++ private ++ { ++ alias __dev_t = ulong; ++ alias __ino_t = c_ulong; ++ alias __ino64_t = ulong; ++ alias __mode_t = uint; ++ alias __nlink_t = uint; ++ alias __uid_t = uint; ++ alias __gid_t = uint; ++ alias __off_t = c_long; ++ alias __off64_t = long; ++ alias __blksize_t = int; ++ alias __blkcnt_t = c_long; ++ alias __blkcnt64_t = long; ++ alias __timespec = timespec; ++ alias __time_t = time_t; ++ } ++ struct stat_t ++ { ++ __dev_t st_dev; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __ino_t st_ino; ++ } ++ else ++ { ++ __ino64_t st_ino; ++ } ++ __mode_t st_mode; ++ __nlink_t st_nlink; ++ __uid_t st_uid; ++ __gid_t st_gid; ++ __dev_t st_rdev; ++ __dev_t __pad1; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __off_t st_size; ++ } ++ else ++ { ++ __off64_t st_size; ++ } ++ __blksize_t st_blksize; ++ int __pad2; ++ ++ static if(!__USE_FILE_OFFSET64) ++ { ++ __blkcnt_t st_blocks; ++ } ++ else ++ { ++ __blkcnt64_t st_blocks; ++ } ++ ++ static if(__USE_MISC) ++ { ++ __timespec st_atim; ++ __timespec st_mtim; ++ __timespec st_ctim; ++ extern(D) + { +- c_ulong __unused4; +- c_ulong __unused5; ++ @property ref time_t st_atime() { return st_atim.tv_sec; } ++ @property ref time_t st_mtime() { return st_mtim.tv_sec; } ++ @property ref time_t st_ctime() { return st_ctim.tv_sec; } + } + } ++ else ++ { ++ __time_t st_atime; ++ c_ulong st_atimensec; ++ __time_t st_mtime; ++ c_ulong st_mtimensec; ++ __time_t st_ctime; ++ c_ulong st_ctimensec; ++ } ++ int[2] __unused; + } ++ static if(__USE_FILE_OFFSET64) ++ static assert(stat_t.sizeof == 128); ++ else ++ static assert(stat_t.sizeof == 128); + } + else + static assert(0, "unimplemented"); +@@ -554,13 +742,13 @@ else version (Solaris) + enum S_ISVTX = 0x200; + + private +- { ++ { + extern (D) bool S_ISTYPE(mode_t mode, uint mask) + { + return (mode & S_IFMT) == mask; + } + } +- ++ + extern (D) bool S_ISBLK(mode_t mode) { return S_ISTYPE(mode, S_IFBLK); } + extern (D) bool S_ISCHR(mode_t mode) { return S_ISTYPE(mode, S_IFCHR); } + extern (D) bool S_ISDIR(mode_t mode) { return S_ISTYPE(mode, S_IFDIR); } +--- a/src/libphobos/libdruntime/core/sys/posix/sys/statvfs.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/statvfs.d 2014-04-01 16:32:51.000000000 +0100 +@@ -68,6 +68,21 @@ version(linux) { + ST_NOSUID = 2 + } + } ++ ++ static if( __USE_FILE_OFFSET64 ) ++ { ++ int statvfs64 (const char * file, statvfs_t* buf); ++ alias statvfs64 statvfs; ++ ++ int fstatvfs64 (int fildes, statvfs_t *buf); ++ alias fstatvfs64 fstatvfs; ++ } ++ else ++ { ++ int statvfs (const char * file, statvfs_t* buf); ++ int fstatvfs (int fildes, statvfs_t *buf); ++ } ++ + } + else + { +@@ -91,18 +106,7 @@ else + ST_RDONLY = 1, /* Mount read-only. */ + ST_NOSUID = 2 + } +-} +- +-static if( __USE_FILE_OFFSET64 ) +-{ +- int statvfs64 (const char * file, statvfs_t* buf); +- alias statvfs64 statvfs; + +- int fstatvfs64 (int fildes, statvfs_t *buf); +- alias fstatvfs64 fstatvfs; +-} +-else +-{ +- int statvfs (const char * file, statvfs_t* buf); +- int fstatvfs (int fildes, statvfs_t *buf); ++ int statvfs (const char * file, statvfs_t* buf); ++ int fstatvfs (int fildes, statvfs_t *buf); + } +--- a/src/libphobos/libdruntime/core/sys/posix/sys/types.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/sys/types.d 2014-04-01 16:32:51.000000000 +0100 +@@ -18,12 +18,46 @@ module core.sys.posix.sys.types; + private import core.sys.posix.config; + private import core.stdc.stdint; + public import core.stdc.stddef; // for size_t +-public import core.stdc.time; // for clock_t, time_t + + version (Posix): + extern (C): + + // ++// bits/typesizes.h -- underlying types for *_t. ++// ++/* ++__syscall_slong_t ++__syscall_ulong_t ++*/ ++version (linux) ++{ ++ version (X86_64) ++ { ++ version (D_X32) ++ { ++ // X32 kernel interface is 64-bit. ++ alias long slong_t; ++ alias ulong ulong_t; ++ } ++ else ++ { ++ alias c_long slong_t; ++ alias c_ulong ulong_t; ++ } ++ } ++ else ++ { ++ alias c_long slong_t; ++ alias c_ulong ulong_t; ++ } ++} ++else ++{ ++ alias c_long slong_t; ++ alias c_ulong ulong_t; ++} ++ ++// + // Required + // + /* +@@ -52,19 +86,19 @@ version( linux ) + } + else + { +- alias c_long blkcnt_t; +- alias c_ulong ino_t; +- alias c_long off_t; ++ alias slong_t blkcnt_t; ++ alias ulong_t ino_t; ++ alias slong_t off_t; + } +- alias c_long blksize_t; ++ alias slong_t blksize_t; + alias ulong dev_t; + alias uint gid_t; + alias uint mode_t; +- alias c_ulong nlink_t; ++ alias ulong_t nlink_t; + alias int pid_t; + //size_t (defined in core.stdc.stddef) + alias c_long ssize_t; +- //time_t (defined in core.stdc.time) ++ alias slong_t time_t; + alias uint uid_t; + } + else version( OSX ) +@@ -80,7 +114,7 @@ else version( OSX ) + alias int pid_t; + //size_t (defined in core.stdc.stddef) + alias c_long ssize_t; +- //time_t (defined in core.stdc.time) ++ alias c_long time_t; + alias uint uid_t; + } + else version( FreeBSD ) +@@ -96,7 +130,7 @@ else version( FreeBSD ) + alias int pid_t; + //size_t (defined in core.stdc.stddef) + alias c_long ssize_t; +- //time_t (defined in core.stdc.time) ++ alias c_long time_t; + alias uint uid_t; + alias uint fflags_t; + } +@@ -139,6 +173,7 @@ else version (Solaris) + alias uint nlink_t; + alias int pid_t; + alias c_long ssize_t; ++ alias c_long time_t; + alias uint uid_t; + } + else +@@ -168,30 +203,30 @@ version( linux ) + } + else + { +- alias c_ulong fsblkcnt_t; +- alias c_ulong fsfilcnt_t; ++ alias ulong_t fsblkcnt_t; ++ alias ulong_t fsfilcnt_t; + } +- // clock_t (defined in core.stdc.time) ++ alias slong_t clock_t; + alias uint id_t; + alias int key_t; +- alias c_long suseconds_t; ++ alias slong_t suseconds_t; + alias uint useconds_t; + } + else version( OSX ) + { +- //clock_t +- alias uint fsblkcnt_t; +- alias uint fsfilcnt_t; +- alias uint id_t; ++ alias uint fsblkcnt_t; ++ alias uint fsfilcnt_t; ++ alias c_long clock_t; ++ alias uint id_t; + // key_t +- alias int suseconds_t; +- alias uint useconds_t; ++ alias int suseconds_t; ++ alias uint useconds_t; + } + else version( FreeBSD ) + { +- // clock_t (defined in core.stdc.time) + alias ulong fsblkcnt_t; + alias ulong fsfilcnt_t; ++ alias c_long clock_t; + alias long id_t; + alias c_long key_t; + alias c_long suseconds_t; +@@ -210,6 +245,7 @@ else version (Solaris) + alias c_ulong fsfilcnt_t; + } + ++ alias c_long clock_t; + alias int id_t; + alias int key_t; + alias c_long suseconds_t; +@@ -242,9 +278,72 @@ pthread_rwlockattr_t + pthread_t + */ + +-version( linux ) ++version (linux) + { +- version(D_LP64) ++ version (X86) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 36; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 24; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 32; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 20; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (X86_64) ++ { ++ static if (__WORDSIZE == 64) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 56; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 40; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 56; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 32; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 32; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 32; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 44; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 20; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ } ++ else version (AArch64) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 64; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 48; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 8; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 8; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 56; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 32; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 8; ++ } ++ else version (ARM) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 36; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 24; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 32; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 20; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (IA64) + { + enum __SIZEOF_PTHREAD_ATTR_T = 56; + enum __SIZEOF_PTHREAD_MUTEX_T = 40; +@@ -256,7 +355,31 @@ version( linux ) + enum __SIZEOF_PTHREAD_BARRIER_T = 32; + enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; + } +- else ++ else version (MIPS32) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 36; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 24; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 32; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 20; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (MIPS64) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 56; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 40; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 56; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 32; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (PPC) + { + enum __SIZEOF_PTHREAD_ATTR_T = 36; + enum __SIZEOF_PTHREAD_MUTEX_T = 24; +@@ -268,6 +391,46 @@ version( linux ) + enum __SIZEOF_PTHREAD_BARRIER_T = 20; + enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; + } ++ else version (PPC64) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 56; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 40; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 56; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 32; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (S390) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 36; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 24; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 32; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 20; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else version (S390X) ++ { ++ enum __SIZEOF_PTHREAD_ATTR_T = 56; ++ enum __SIZEOF_PTHREAD_MUTEX_T = 40; ++ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4; ++ enum __SIZEOF_PTHREAD_COND_T = 48; ++ enum __SIZEOF_PTHREAD_CONDATTR_T = 4; ++ enum __SIZEOF_PTHREAD_RWLOCK_T = 56; ++ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; ++ enum __SIZEOF_PTHREAD_BARRIER_T = 32; ++ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4; ++ } ++ else ++ { ++ static assert (false, "Unsupported platform"); ++ } + + union pthread_attr_t + { +--- a/src/libphobos/libdruntime/core/sys/posix/syslog.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/syslog.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,266 @@ ++/** ++ * D header file for POSIX system logger API. ++ * (http://pubs.opengroup.org/onlinepubs/007904875/basedefs/syslog.h.html) ++ * ++ * Copyright: Copyright Adil Baig 2013. ++ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0). ++ * Authors: Adil Baig ++ * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition ++ */ ++ ++/* Copyright Adil Baig 2013. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module core.sys.posix.syslog; ++ ++version (Posix): ++ ++extern (C): ++@system: ++nothrow: ++ ++version(linux) ++{ ++ //PRIORITY ++ enum { ++ LOG_EMERG = 0, /* system is unusable */ ++ LOG_ALERT = 1, /* action must be taken immediately */ ++ LOG_CRIT = 2, /* critical conditions */ ++ LOG_ERR = 3, /* error conditions */ ++ LOG_WARNING = 4, /* warning conditions */ ++ LOG_NOTICE = 5, /* normal but significant condition */ ++ LOG_INFO = 6, /* informational */ ++ LOG_DEBUG = 7, /* debug-level messages */ ++ }; ++ ++ //OPTIONS ++ enum { ++ LOG_PID = 0x01, /* log the pid with each message */ ++ LOG_CONS = 0x02, /* log on the console if errors in sending */ ++ LOG_ODELAY = 0x04, /* delay open until first syslog() (default) */ ++ LOG_NDELAY = 0x08, /* don't delay open */ ++ LOG_NOWAIT = 0x10, /* don't wait for console forks: DEPRECATED */ ++ LOG_PERROR = 0x20, /* log to stderr as well */ ++ }; ++ ++ //FACILITY ++ enum { ++ LOG_KERN = (0<<3), /* kernel messages */ ++ LOG_USER = (1<<3), /* random user-level messages */ ++ LOG_MAIL = (2<<3), /* mail system */ ++ LOG_DAEMON = (3<<3), /* system daemons */ ++ LOG_AUTH = (4<<3), /* security/authorization messages */ ++ LOG_SYSLOG = (5<<3), /* messages generated internally by syslogd */ ++ LOG_LPR = (6<<3), /* line printer subsystem */ ++ LOG_NEWS = (7<<3), /* network news subsystem */ ++ LOG_UUCP = (8<<3), /* UUCP subsystem */ ++ LOG_CRON = (9<<3), /* clock daemon */ ++ LOG_AUTHPRIV = (10<<3), /* security/authorization messages (private), */ ++ LOG_FTP = (11<<3), /* ftp daemon */ ++ ++ /* other codes through 15 reserved for system use */ ++ LOG_LOCAL0 = (16<<3), /* reserved for local use */ ++ LOG_LOCAL1 = (17<<3), /* reserved for local use */ ++ LOG_LOCAL2 = (18<<3), /* reserved for local use */ ++ LOG_LOCAL3 = (19<<3), /* reserved for local use */ ++ LOG_LOCAL4 = (20<<3), /* reserved for local use */ ++ LOG_LOCAL5 = (21<<3), /* reserved for local use */ ++ LOG_LOCAL6 = (22<<3), /* reserved for local use */ ++ LOG_LOCAL7 = (23<<3), /* reserved for local use */ ++ ++ LOG_NFACILITIES = 24, /* current number of facilities */ ++ }; ++ ++ int LOG_MASK(int pri) { return 1 << pri; } /* mask for one priority */ ++ int LOG_UPTO(int pri) { return (1 << (pri+1)) - 1; } /* all priorities through pri */ ++ ++ void openlog (const char *, int __option, int __facility); ++ int setlogmask (int __mask); ++ void syslog (int __pri, const char *__fmt, ...); ++ void closelog(); ++} ++else version( OSX ) ++{ ++ //http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/osfmk/sys/syslog.h ++ ++ //PRIORITY ++ enum { ++ LOG_EMERG = 0, /* system is unusable */ ++ LOG_ALERT = 1, /* action must be taken immediately */ ++ LOG_CRIT = 2, /* critical conditions */ ++ LOG_ERR = 3, /* error conditions */ ++ LOG_WARNING = 4, /* warning conditions */ ++ LOG_NOTICE = 5, /* normal but significant condition */ ++ LOG_INFO = 6, /* informational */ ++ LOG_DEBUG = 7, /* debug-level messages */ ++ }; ++ ++ //OPTIONS ++ enum { ++ LOG_PID = 0x01, /* log the pid with each message */ ++ LOG_CONS = 0x02, /* log on the console if errors in sending */ ++ LOG_ODELAY = 0x04, /* delay open until first syslog() (default) */ ++ LOG_NDELAY = 0x08, /* don't delay open */ ++ LOG_NOWAIT = 0x10, /* don't wait for console forks: DEPRECATED */ ++ }; ++ ++ //FACILITY ++ enum { ++ LOG_KERN = (0<<3), /* kernel messages */ ++ LOG_USER = (1<<3), /* random user-level messages */ ++ LOG_MAIL = (2<<3), /* mail system */ ++ LOG_DAEMON = (3<<3), /* system daemons */ ++ LOG_AUTH = (4<<3), /* security/authorization messages */ ++ LOG_SYSLOG = (5<<3), /* messages generated internally by syslogd */ ++ LOG_LPR = (6<<3), /* line printer subsystem */ ++ LOG_NEWS = (7<<3), /* network news subsystem */ ++ LOG_UUCP = (8<<3), /* UUCP subsystem */ ++ ++ /* other codes through 15 reserved for system use */ ++ LOG_LOCAL0 = (16<<3), /* reserved for local use */ ++ LOG_LOCAL1 = (17<<3), /* reserved for local use */ ++ LOG_LOCAL2 = (18<<3), /* reserved for local use */ ++ LOG_LOCAL3 = (19<<3), /* reserved for local use */ ++ LOG_LOCAL4 = (20<<3), /* reserved for local use */ ++ LOG_LOCAL5 = (21<<3), /* reserved for local use */ ++ LOG_LOCAL6 = (22<<3), /* reserved for local use */ ++ LOG_LOCAL7 = (23<<3), /* reserved for local use */ ++ ++ LOG_NFACILITIES = 24, /* current number of facilities */ ++ }; ++ ++ int LOG_MASK(int pri) { return 1 << pri; } /* mask for one priority */ ++ int LOG_UPTO(int pri) { return (1 << (pri+1)) - 1; } /* all priorities through pri */ ++ ++ void openlog (const char *, int __option, int __facility); ++ int setlogmask (int __mask); ++ void syslog (int __pri, const char *__fmt, ...); ++ void closelog(); ++} ++else version( FreeBSD ) ++{ ++ //http://fxr.watson.org/fxr/source/sys/syslog.h ++ ++ //PRIORITY ++ enum { ++ LOG_EMERG = 0, /* system is unusable */ ++ LOG_ALERT = 1, /* action must be taken immediately */ ++ LOG_CRIT = 2, /* critical conditions */ ++ LOG_ERR = 3, /* error conditions */ ++ LOG_WARNING = 4, /* warning conditions */ ++ LOG_NOTICE = 5, /* normal but significant condition */ ++ LOG_INFO = 6, /* informational */ ++ LOG_DEBUG = 7, /* debug-level messages */ ++ }; ++ ++ //OPTIONS ++ enum { ++ LOG_PID = 0x01, /* log the pid with each message */ ++ LOG_CONS = 0x02, /* log on the console if errors in sending */ ++ LOG_ODELAY = 0x04, /* delay open until first syslog() (default) */ ++ LOG_NDELAY = 0x08, /* don't delay open */ ++ LOG_NOWAIT = 0x10, /* don't wait for console forks: DEPRECATED */ ++ LOG_PERROR = 0x20, /* log to stderr as well */ ++ }; ++ ++ //FACILITY ++ enum { ++ LOG_KERN = (0<<3), /* kernel messages */ ++ LOG_USER = (1<<3), /* random user-level messages */ ++ LOG_MAIL = (2<<3), /* mail system */ ++ LOG_DAEMON = (3<<3), /* system daemons */ ++ LOG_AUTH = (4<<3), /* security/authorization messages */ ++ LOG_SYSLOG = (5<<3), /* messages generated internally by syslogd */ ++ LOG_LPR = (6<<3), /* line printer subsystem */ ++ LOG_NEWS = (7<<3), /* network news subsystem */ ++ LOG_UUCP = (8<<3), /* UUCP subsystem */ ++ LOG_CRON = (9<<3), /* clock daemon */ ++ LOG_AUTHPRIV = (10<<3), /* security/authorization messages (private), */ ++ LOG_FTP = (11<<3), /* ftp daemon */ ++ LOG_NTP = (12<<3), /* NTP subsystem */ ++ LOG_SECURITY = (13<<3), /* security subsystems (firewalling, etc.) */ ++ LOG_CONSOLE = (14<<3), /* /dev/console output */ ++ ++ /* other codes through 15 reserved for system use */ ++ LOG_LOCAL0 = (16<<3), /* reserved for local use */ ++ LOG_LOCAL1 = (17<<3), /* reserved for local use */ ++ LOG_LOCAL2 = (18<<3), /* reserved for local use */ ++ LOG_LOCAL3 = (19<<3), /* reserved for local use */ ++ LOG_LOCAL4 = (20<<3), /* reserved for local use */ ++ LOG_LOCAL5 = (21<<3), /* reserved for local use */ ++ LOG_LOCAL6 = (22<<3), /* reserved for local use */ ++ LOG_LOCAL7 = (23<<3), /* reserved for local use */ ++ ++ LOG_NFACILITIES = 24, /* current number of facilities */ ++ }; ++ ++ int LOG_MASK(int pri) { return 1 << pri; } /* mask for one priority */ ++ int LOG_UPTO(int pri) { return (1 << (pri+1)) - 1; } /* all priorities through pri */ ++ ++ void openlog (const char *, int __option, int __facility); ++ int setlogmask (int __mask); ++ void syslog (int __pri, const char *__fmt, ...); ++ void closelog(); ++} ++else version( Solaris ) ++{ ++ //http://pubs.opengroup.org/onlinepubs/007904875/basedefs/syslog.h.html ++ ++ //PRIORITY ++ enum { ++ LOG_EMERG = 0, /* system is unusable */ ++ LOG_ALERT = 1, /* action must be taken immediately */ ++ LOG_CRIT = 2, /* critical conditions */ ++ LOG_ERR = 3, /* error conditions */ ++ LOG_WARNING = 4, /* warning conditions */ ++ LOG_NOTICE = 5, /* normal but significant condition */ ++ LOG_INFO = 6, /* informational */ ++ LOG_DEBUG = 7, /* debug-level messages */ ++ }; ++ ++ //OPTIONS ++ enum { ++ LOG_PID = 0x01, /* log the pid with each message */ ++ LOG_CONS = 0x02, /* log on the console if errors in sending */ ++ LOG_NDELAY = 0x08, /* don't delay open */ ++ LOG_NOWAIT = 0x10, /* don't wait for console forks: DEPRECATED */ ++ }; ++ ++ //FACILITY ++ enum { ++ LOG_KERN = (0<<3), /* kernel messages */ ++ LOG_USER = (1<<3), /* random user-level messages */ ++ LOG_MAIL = (2<<3), /* mail system */ ++ LOG_DAEMON = (3<<3), /* system daemons */ ++ LOG_AUTH = (4<<3), /* security/authorization messages */ ++ LOG_SYSLOG = (5<<3), /* messages generated internally by syslogd */ ++ LOG_LPR = (6<<3), /* line printer subsystem */ ++ LOG_NEWS = (7<<3), /* network news subsystem */ ++ LOG_UUCP = (8<<3), /* UUCP subsystem */ ++ LOG_CRON = (9<<3), /* clock daemon */ ++ LOG_AUTHPRIV = (10<<3), /* security/authorization messages (private), */ ++ LOG_FTP = (11<<3), /* ftp daemon */ ++ ++ /* other codes through 15 reserved for system use */ ++ LOG_LOCAL0 = (16<<3), /* reserved for local use */ ++ LOG_LOCAL1 = (17<<3), /* reserved for local use */ ++ LOG_LOCAL2 = (18<<3), /* reserved for local use */ ++ LOG_LOCAL3 = (19<<3), /* reserved for local use */ ++ LOG_LOCAL4 = (20<<3), /* reserved for local use */ ++ LOG_LOCAL5 = (21<<3), /* reserved for local use */ ++ LOG_LOCAL6 = (22<<3), /* reserved for local use */ ++ LOG_LOCAL7 = (23<<3), /* reserved for local use */ ++ ++ LOG_NFACILITIES = 24, /* current number of facilities */ ++ }; ++ ++ int LOG_MASK(int pri) { return 1 << pri; } /* mask for one priority */ ++ int LOG_UPTO(int pri) { return (1 << (pri+1)) - 1; } /* all priorities through pri */ ++ ++ void openlog (const char *, int __option, int __facility); ++ int setlogmask (int __mask); ++ void syslog (int __pri, const char *__fmt, ...); ++ void closelog(); ++} +\ No newline at end of file +--- a/src/libphobos/libdruntime/core/sys/posix/ucontext.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/posix/ucontext.d 2014-04-01 16:32:51.000000000 +0100 +@@ -270,6 +270,223 @@ version( linux ) + sigset_t uc_sigmask; + } + } ++ else version (PPC) ++ { ++ private ++ { ++ enum NGREG = 48; ++ ++ alias c_ulong greg_t; ++ alias greg_t[NGREG] gregset_t; ++ ++ struct fpregset_t ++ { ++ double[32] fpregs; ++ double fpscr; ++ uint[2] _pad; ++ } ++ ++ struct vrregset_t ++ { ++ uint[32][4] vrregs; ++ uint vrsave; ++ uint[2] __pad; ++ uint vscr; ++ } ++ ++ struct pt_regs ++ { ++ c_ulong[32] gpr; ++ c_ulong nip; ++ c_ulong msr; ++ c_ulong orig_gpr3; ++ c_ulong ctr; ++ c_ulong link; ++ c_ulong xer; ++ c_ulong ccr; ++ c_ulong mq; ++ c_ulong trap; ++ c_ulong dar; ++ c_ulong dsisr; ++ c_ulong result; ++ } ++ } ++ ++ struct mcontext_t ++ { ++ gregset_t gregs; ++ fpregset_t fpregs; ++ align(16) vrregset_t vrregs; ++ } ++ ++ struct ucontext_t ++ { ++ c_ulong uc_flags; ++ ucontext_t* uc_link; ++ stack_t uc_stack; ++ int[7] uc_pad; ++ union uc_mcontext ++ { ++ pt_regs* regs; ++ mcontext_t* uc_regs; ++ } ++ sigset_t uc_sigmask; ++ char[mcontext_t.sizeof + 12] uc_reg_space; ++ } ++ } ++ else version (PPC64) ++ { ++ private ++ { ++ enum NGREG = 48; ++ enum NFPREG = 33; ++ enum NVRREG = 34; ++ ++ alias c_ulong greg_t; ++ alias greg_t[NGREG] gregset_t; ++ alias double[NFPREG] fpregset_t; ++ ++ struct vscr_t ++ { ++ uint[3] __pad; ++ uint vscr_word; ++ } ++ ++ struct vrregset_t ++ { ++ uint[32][4] vrregs; ++ vscr_t vscr; ++ uint vrsave; ++ uint[3] __pad; ++ } ++ ++ struct pt_regs ++ { ++ c_ulong[32] gpr; ++ c_ulong nip; ++ c_ulong msr; ++ c_ulong orig_gpr3; ++ c_ulong ctr; ++ c_ulong link; ++ c_ulong xer; ++ c_ulong ccr; ++ c_ulong softe; ++ c_ulong trap; ++ c_ulong dar; ++ c_ulong dsisr; ++ c_ulong result; ++ } ++ } ++ ++ struct mcontext_t ++ { ++ c_ulong[4] __unused; ++ int signal; ++ int __pad0; ++ c_ulong handler; ++ c_ulong oldmask; ++ pt_regs* regs; ++ gregset_t gp_regs; ++ fpregset_t fp_regs; ++ vrregset_t *v_regs; ++ c_long[NVRREG+NVRREG+1] vmx_reserve; ++ } ++ ++ struct ucontext_t ++ { ++ c_ulong uc_flags; ++ ucontext_t* uc_link; ++ stack_t uc_stack; ++ sigset_t uc_sigmask; ++ mcontext_t uc_mcontext; ++ } ++ } ++ else version(ARM) ++ { ++ enum ++ { ++ R0 = 0, ++ R1 = 1, ++ R2 = 2, ++ R3 = 3, ++ R4 = 4, ++ R5 = 5, ++ R6 = 6, ++ R7 = 7, ++ R8 = 8, ++ R9 = 9, ++ R10 = 10, ++ R11 = 11, ++ R12 = 12, ++ R13 = 13, ++ R14 = 14, ++ R15 = 15 ++ } ++ ++ struct sigcontext ++ { ++ c_ulong trap_no; ++ c_ulong error_code; ++ c_ulong oldmask; ++ c_ulong arm_r0; ++ c_ulong arm_r1; ++ c_ulong arm_r2; ++ c_ulong arm_r3; ++ c_ulong arm_r4; ++ c_ulong arm_r5; ++ c_ulong arm_r6; ++ c_ulong arm_r7; ++ c_ulong arm_r8; ++ c_ulong arm_r9; ++ c_ulong arm_r10; ++ c_ulong arm_fp; ++ c_ulong arm_ip; ++ c_ulong arm_sp; ++ c_ulong arm_lr; ++ c_ulong arm_pc; ++ c_ulong arm_cpsr; ++ c_ulong fault_address; ++ } ++ ++ //alias elf_fpregset_t fpregset_t; ++ alias sigcontext mcontext_t; ++ ++ struct ucontext_t ++ { ++ c_ulong uc_flags; ++ ucontext_t* uc_link; ++ stack_t uc_stack; ++ mcontext_t uc_mcontext; ++ sigset_t uc_sigmask; ++ align(8) c_ulong[128] uc_regspace; ++ } ++ } ++ else version (AArch64) ++ { ++ alias int greg_t; ++ ++ struct sigcontext { ++ ulong fault_address; ++ /* AArch64 registers */ ++ ulong regs[31]; ++ ulong sp; ++ ulong pc; ++ ulong pstate; ++ /* 4K reserved for FP/SIMD state and future expansion */ ++ align(16) ubyte __reserved[4096]; ++ } ++ ++ alias sigcontext mcontext_t; ++ ++ struct ucontext_t ++ { ++ c_ulong uc_flags; ++ ucontext_t* uc_link; ++ stack_t uc_stack; ++ sigset_t uc_sigmask; ++ mcontext_t uc_mcontext; ++ } ++ } + else + static assert(0, "unimplemented"); + } +--- a/src/libphobos/libdruntime/core/sys/windows/dbghelp.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/windows/dbghelp.d 2014-04-01 16:32:51.000000000 +0100 +@@ -171,32 +171,41 @@ struct IMAGEHLP_CBA_READ_MEMORY + DWORD *bytesread; + }; + ++struct API_VERSION ++{ ++ USHORT MajorVersion; ++ USHORT MinorVersion; ++ USHORT Revision; ++ USHORT Reserved; ++}; ++ + + extern(System) + { +- alias BOOL function(HANDLE hProcess, DWORD64 lpBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) ReadProcessMemoryProc64; +- alias PVOID function(HANDLE hProcess, DWORD64 AddrBase) FunctionTableAccessProc64; +- alias DWORD64 function(HANDLE hProcess, DWORD64 Address) GetModuleBaseProc64; +- alias DWORD64 function(HANDLE hProcess, HANDLE hThread, ADDRESS64 *lpaddr) TranslateAddressProc64; +- +- alias BOOL function(HANDLE hProcess, PCSTR UserSearchPath, bool fInvadeProcess) SymInitializeFunc; +- alias BOOL function(HANDLE hProcess) SymCleanupFunc; +- alias DWORD function(DWORD SymOptions) SymSetOptionsFunc; +- alias DWORD function() SymGetOptionsFunc; +- alias PVOID function(HANDLE hProcess, DWORD64 AddrBase) SymFunctionTableAccess64Func; +- alias BOOL function(DWORD MachineType, HANDLE hProcess, HANDLE hThread, STACKFRAME64 *StackFrame, PVOID ContextRecord, +- ReadProcessMemoryProc64 ReadMemoryRoutine, FunctionTableAccessProc64 FunctoinTableAccess, +- GetModuleBaseProc64 GetModuleBaseRoutine, TranslateAddressProc64 TranslateAddress) StackWalk64Func; +- alias BOOL function(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, IMAGEHLP_LINE64 *line) SymGetLineFromAddr64Func; +- alias DWORD64 function(HANDLE hProcess, DWORD64 dwAddr) SymGetModuleBase64Func; +- alias BOOL function(HANDLE hProcess, DWORD64 dwAddr, IMAGEHLP_MODULE64 *ModuleInfo) SymGetModuleInfo64Func; +- alias BOOL function(HANDLE hProcess, DWORD64 Address, DWORD64 *Displacement, IMAGEHLP_SYMBOL64 *Symbol) SymGetSymFromAddr64Func; +- alias DWORD function(PCTSTR DecoratedName, PTSTR UnDecoratedName, DWORD UndecoratedLength, DWORD Flags) UnDecorateSymbolNameFunc; +- alias DWORD64 function(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll) SymLoadModule64Func; +- alias BOOL function(HANDLE HProcess, PTSTR SearchPath, DWORD SearchPathLength) SymGetSearchPathFunc; +- alias BOOL function(HANDLE hProcess, DWORD64 Address) SymUnloadModule64Func; +- alias BOOL function(HANDLE hProcess, ULONG ActionCode, ulong CallbackContext, ulong UserContext) PSYMBOL_REGISTERED_CALLBACK64; +- alias BOOL function(HANDLE hProcess, PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, ulong UserContext) SymRegisterCallback64Func; ++ alias BOOL function(HANDLE hProcess, DWORD64 lpBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) ReadProcessMemoryProc64; ++ alias PVOID function(HANDLE hProcess, DWORD64 AddrBase) FunctionTableAccessProc64; ++ alias DWORD64 function(HANDLE hProcess, DWORD64 Address) GetModuleBaseProc64; ++ alias DWORD64 function(HANDLE hProcess, HANDLE hThread, ADDRESS64 *lpaddr) TranslateAddressProc64; ++ ++ alias BOOL function(HANDLE hProcess, PCSTR UserSearchPath, bool fInvadeProcess) SymInitializeFunc; ++ alias BOOL function(HANDLE hProcess) SymCleanupFunc; ++ alias DWORD function(DWORD SymOptions) SymSetOptionsFunc; ++ alias DWORD function() SymGetOptionsFunc; ++ alias PVOID function(HANDLE hProcess, DWORD64 AddrBase) SymFunctionTableAccess64Func; ++ alias BOOL function(DWORD MachineType, HANDLE hProcess, HANDLE hThread, STACKFRAME64 *StackFrame, PVOID ContextRecord, ++ ReadProcessMemoryProc64 ReadMemoryRoutine, FunctionTableAccessProc64 FunctoinTableAccess, ++ GetModuleBaseProc64 GetModuleBaseRoutine, TranslateAddressProc64 TranslateAddress) StackWalk64Func; ++ alias BOOL function(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, IMAGEHLP_LINE64 *line) SymGetLineFromAddr64Func; ++ alias DWORD64 function(HANDLE hProcess, DWORD64 dwAddr) SymGetModuleBase64Func; ++ alias BOOL function(HANDLE hProcess, DWORD64 dwAddr, IMAGEHLP_MODULE64 *ModuleInfo) SymGetModuleInfo64Func; ++ alias BOOL function(HANDLE hProcess, DWORD64 Address, DWORD64 *Displacement, IMAGEHLP_SYMBOL64 *Symbol) SymGetSymFromAddr64Func; ++ alias DWORD function(PCTSTR DecoratedName, PTSTR UnDecoratedName, DWORD UndecoratedLength, DWORD Flags) UnDecorateSymbolNameFunc; ++ alias DWORD64 function(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll) SymLoadModule64Func; ++ alias BOOL function(HANDLE HProcess, PTSTR SearchPath, DWORD SearchPathLength) SymGetSearchPathFunc; ++ alias BOOL function(HANDLE hProcess, DWORD64 Address) SymUnloadModule64Func; ++ alias BOOL function(HANDLE hProcess, ULONG ActionCode, ulong CallbackContext, ulong UserContext) PSYMBOL_REGISTERED_CALLBACK64; ++ alias BOOL function(HANDLE hProcess, PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, ulong UserContext) SymRegisterCallback64Func; ++ alias API_VERSION* function() ImagehlpApiVersionFunc; + } + + struct DbgHelp +@@ -216,6 +225,7 @@ struct DbgHelp + SymGetSearchPathFunc SymGetSearchPath; + SymUnloadModule64Func SymUnloadModule64; + SymRegisterCallback64Func SymRegisterCallback64; ++ ImagehlpApiVersionFunc ImagehlpApiVersion; + + static DbgHelp* get() + { +@@ -237,11 +247,12 @@ struct DbgHelp + sm_inst.SymGetSearchPath = cast(SymGetSearchPathFunc) GetProcAddress(sm_hndl,"SymGetSearchPath"); + sm_inst.SymUnloadModule64 = cast(SymUnloadModule64Func) GetProcAddress(sm_hndl,"SymUnloadModule64"); + sm_inst.SymRegisterCallback64 = cast(SymRegisterCallback64Func) GetProcAddress(sm_hndl, "SymRegisterCallback64"); ++ sm_inst.ImagehlpApiVersion = cast(ImagehlpApiVersionFunc) GetProcAddress(sm_hndl, "ImagehlpApiVersion"); + assert( sm_inst.SymInitialize && sm_inst.SymCleanup && sm_inst.StackWalk64 && sm_inst.SymGetOptions && + sm_inst.SymSetOptions && sm_inst.SymFunctionTableAccess64 && sm_inst.SymGetLineFromAddr64 && + sm_inst.SymGetModuleBase64 && sm_inst.SymGetModuleInfo64 && sm_inst.SymGetSymFromAddr64 && + sm_inst.SymLoadModule64 && sm_inst.SymGetSearchPath && sm_inst.SymUnloadModule64 && +- sm_inst.SymRegisterCallback64); ++ sm_inst.SymRegisterCallback64 && sm_inst.ImagehlpApiVersion); + + return &sm_inst; + } +--- a/src/libphobos/libdruntime/core/sys/windows/stacktrace.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/windows/stacktrace.d 2014-04-01 16:32:51.000000000 +0100 +@@ -7,7 +7,7 @@ + * Source: $(DRUNTIMESRC core/sys/windows/_stacktrace.d) + */ + +-/* Copyright Benjamin Thaut 2010 - 2011. ++/* Copyright Benjamin Thaut 2010 - 2012. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE or copy at + * http://www.boost.org/LICENSE_1_0.txt) +@@ -36,13 +36,37 @@ private __gshared immutable bool initial + class StackTrace : Throwable.TraceInfo + { + public: +- this() ++ /** ++ * Constructor ++ * Params: ++ * skip = The number of stack frames to skip. ++ * context = The context to receive the stack trace from. Can be null. ++ */ ++ this(size_t skip, CONTEXT* context) + { ++ if(context is null) ++ { ++ version(Win64) ++ static enum INTERNALFRAMES = 4; ++ else ++ static enum INTERNALFRAMES = 2; ++ ++ skip += INTERNALFRAMES; //skip the stack frames within the StackTrace class ++ } ++ else ++ { ++ //When a exception context is given the first stack frame is repeated for some reason ++ version(Win64) ++ static enum INTERNALFRAMES = 1; ++ else ++ static enum INTERNALFRAMES = 1; ++ ++ skip += INTERNALFRAMES; ++ } + if( initialized ) +- m_trace = trace(); ++ m_trace = trace(skip, context); + } + +- + int opApply( scope int delegate(ref const(char[])) dg ) const + { + return opApply( (ref size_t, ref const(char[]) buf) +@@ -55,8 +79,7 @@ public: + int opApply( scope int delegate(ref size_t, ref const(char[])) dg ) const + { + int result; +- +- foreach( i, e; m_trace ) ++ foreach( i, e; resolve(m_trace) ) + { + if( (result = dg( i, e )) != 0 ) + break; +@@ -65,40 +88,71 @@ public: + } + + +- @safe override string toString() const pure nothrow ++ override string toString() const + { + string result; + +- foreach( e; m_trace ) ++ foreach( e; this ) + { + result ~= e ~ "\n"; + } + return result; + } + ++ /** ++ * Receive a stack trace in the form of an address list. ++ * Params: ++ * skip = How many stack frames should be skipped. ++ * context = The context that should be used. If null the current context is used. ++ * Returns: ++ * A list of addresses that can be passed to resolve at a later point in time. ++ */ ++ static ulong[] trace(size_t skip = 0, CONTEXT* context = null) ++ { ++ synchronized( StackTrace.classinfo ) ++ { ++ return traceNoSync(skip, context); ++ } ++ } + +-private: +- char[][] m_trace; +- +- +- static char[][] trace() ++ /** ++ * Resolve a stack trace. ++ * Params: ++ * addresses = A list of addresses to resolve. ++ * Returns: ++ * An array of strings with the results. ++ */ ++ static char[][] resolve(const(ulong)[] addresses) + { + synchronized( StackTrace.classinfo ) + { +- return traceNoSync(); ++ return resolveNoSync(addresses); + } + } + ++private: ++ ulong[] m_trace; ++ + +- static char[][] traceNoSync() ++ static ulong[] traceNoSync(size_t skip, CONTEXT* context) + { +- auto dbghelp = DbgHelp.get(); +- auto hThread = GetCurrentThread(); +- auto hProcess = GetCurrentProcess(); ++ auto dbghelp = DbgHelp.get(); ++ if(dbghelp is null) ++ return []; // dbghelp.dll not available ++ ++ HANDLE hThread = GetCurrentThread(); ++ HANDLE hProcess = GetCurrentProcess(); + CONTEXT ctxt; + +- ctxt.ContextFlags = CONTEXT_FULL; +- RtlCaptureContext(&ctxt); ++ if(context is null) ++ { ++ ctxt.ContextFlags = CONTEXT_FULL; ++ RtlCaptureContext(&ctxt); ++ } ++ else ++ { ++ ctxt = *context; ++ } + + //x86 + STACKFRAME64 stackframe; +@@ -114,7 +168,7 @@ private: + AddrStack.Offset = ctxt.Esp; + AddrStack.Mode = Flat; + } +- else version(X86_64) ++ else version(X86_64) + { + enum Flat = ADDRESS_MODE.AddrModeFlat; + AddrPC.Offset = ctxt.Rip; +@@ -126,6 +180,40 @@ private: + } + } + ++ version (X86) enum imageType = IMAGE_FILE_MACHINE_I386; ++ else version (X86_64) enum imageType = IMAGE_FILE_MACHINE_AMD64; ++ else static assert(0, "unimplemented"); ++ ++ ulong[] result; ++ size_t frameNum = 0; ++ ++ // do ... while so that we don't skip the first stackframe ++ do ++ { ++ if( stackframe.AddrPC.Offset == stackframe.AddrReturn.Offset ) ++ { ++ debug(PRINTF) printf("Endless callstack\n"); ++ break; ++ } ++ if(frameNum >= skip) ++ { ++ result ~= stackframe.AddrPC.Offset; ++ } ++ frameNum++; ++ } ++ while (dbghelp.StackWalk64(imageType, hProcess, hThread, &stackframe, ++ &ctxt, null, null, null, null)); ++ return result; ++ } ++ ++ static char[][] resolveNoSync(const(ulong)[] addresses) ++ { ++ auto dbghelp = DbgHelp.get(); ++ if(dbghelp is null) ++ return []; // dbghelp.dll not available ++ ++ HANDLE hProcess = GetCurrentProcess(); ++ + static struct BufSymbol + { + align(1): +@@ -133,27 +221,15 @@ private: + TCHAR[1024] _buf; + } + BufSymbol bufSymbol=void; +- auto symbol = &bufSymbol._base; ++ IMAGEHLP_SYMBOL64* symbol = &bufSymbol._base; + symbol.SizeOfStruct = IMAGEHLP_SYMBOL64.sizeof; + symbol.MaxNameLength = bufSymbol._buf.length; + +- version (X86) enum imageType = IMAGE_FILE_MACHINE_I386; +- else version (X86_64) enum imageType = IMAGE_FILE_MACHINE_AMD64; +- else static assert(0, "unimplemented"); +- + char[][] trace; +- debug(PRINTF) printf("Callstack:\n"); +- while (dbghelp.StackWalk64(imageType, hProcess, hThread, &stackframe, +- &ctxt, null, null, null, null)) ++ foreach(pc; addresses) + { +- if( stackframe.AddrPC.Offset == stackframe.AddrReturn.Offset ) ++ if( pc != 0 ) + { +- debug(PRINTF) printf("Endless callstack\n"); +- return trace ~ "...".dup; +- } +- else if( stackframe.AddrPC.Offset != 0 ) +- { +- immutable pc = stackframe.AddrPC.Offset; + char[] res; + if (dbghelp.SymGetSymFromAddr64(hProcess, pc, null, symbol) && + *symbol.Name.ptr) +@@ -173,7 +249,6 @@ private: + trace ~= res; + } + } +- debug(PRINTF) printf("End of Callstack\n"); + return trace; + } + +@@ -183,7 +258,7 @@ private: + char[2+2*size_t.sizeof+1] buf=void; + + immutable len = snprintf(buf.ptr, buf.length, "0x%p", pc); +- len < buf.length || assert(0); ++ cast(uint)len < buf.length || assert(0); + return buf[0 .. len].dup; + } + +@@ -193,7 +268,14 @@ private: + + auto res = formatStackFrame(pc); + res ~= " in "; +- res ~= demangle(symName[0 .. strlen(symName)], demangleBuf); ++ const(char)[] tempSymName = symName[0 .. strlen(symName)]; ++ //Deal with dmd mangling of long names ++ version(DigitalMars) version(Win32) ++ { ++ size_t decodeIndex = 0; ++ tempSymName = decodeDmdString(tempSymName, decodeIndex); ++ } ++ res ~= demangle(tempSymName, demangleBuf); + return res; + } + +@@ -208,7 +290,7 @@ private: + res ~= fileName[0 .. strlen(fileName)]; + res ~= "("; + immutable len = snprintf(buf.ptr, buf.length, "%u", lineNum); +- len < buf.length || assert(0); ++ cast(uint)len < buf.length || assert(0); + res ~= buf[0 .. len]; + res ~= ")"; + return res; +@@ -274,9 +356,15 @@ shared static this() + if( dbghelp is null ) + return; // dbghelp.dll not available + +- auto hProcess = GetCurrentProcess(); ++ debug(PRINTF) ++ { ++ API_VERSION* dbghelpVersion = dbghelp.ImagehlpApiVersion(); ++ printf("DbgHelp Version %d.%d.%d\n", dbghelpVersion.MajorVersion, dbghelpVersion.MinorVersion, dbghelpVersion.Revision); ++ } ++ ++ HANDLE hProcess = GetCurrentProcess(); + +- auto symOptions = dbghelp.SymGetOptions(); ++ DWORD symOptions = dbghelp.SymGetOptions(); + symOptions |= SYMOPT_LOAD_LINES; + symOptions |= SYMOPT_FAIL_CRITICAL_ERRORS; + symOptions |= SYMOPT_DEFERRED_LOAD; +--- a/src/libphobos/libdruntime/core/sys/windows/threadaux.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/windows/threadaux.d 2014-04-01 16:32:51.000000000 +0100 +@@ -267,9 +267,14 @@ private: + alias extern(C) void function() externCVoidFunc; + static void impersonate_thread( uint id, externCVoidFunc fn ) + { ++ impersonate_thread(id, () => fn()); ++ } ++ ++ static void impersonate_thread( uint id, scope void delegate() dg) ++ { + if( id == GetCurrentThreadId() ) + { +- fn(); ++ dg(); + return; + } + +@@ -284,7 +289,7 @@ private: + return; + + curteb[11] = tlsarray; +- fn(); ++ dg(); + curteb[11] = curtlsarray; + } + } +@@ -295,6 +300,7 @@ public: + alias thread_aux.getThreadStackBottom getThreadStackBottom; + alias thread_aux.OpenThreadHandle OpenThreadHandle; + alias thread_aux.enumProcessThreads enumProcessThreads; ++ alias thread_aux.impersonate_thread impersonate_thread; + + // get the start of the TLS memory of the thread with the given handle + void* GetTlsDataAddress( HANDLE hnd ) nothrow +--- a/src/libphobos/libdruntime/core/sys/windows/windows.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/sys/windows/windows.d 2014-04-01 16:32:51.000000000 +0100 +@@ -30,7 +30,7 @@ nothrow: + alias char CHAR; + alias short SHORT; + alias int LONG; +- ++ + alias long LONGLONG; + alias ulong ULONGLONG; + +@@ -211,6 +211,7 @@ enum + ERROR_ACCESS_DENIED = 5, + ERROR_INVALID_HANDLE = 6, + ERROR_NO_MORE_FILES = 18, ++ ERROR_INSUFFICIENT_BUFFER = 122, + ERROR_MORE_DATA = 234, + ERROR_NO_MORE_ITEMS = 259, + } +@@ -496,6 +497,7 @@ BOOL FindNextFileW(HANDLE hFindFile, W + BOOL GetExitCodeThread(HANDLE hThread, DWORD *lpExitCode); + BOOL GetExitCodeProcess(HANDLE hProcess, DWORD *lpExitCode); + DWORD GetLastError(); ++void SetLastError(DWORD dwErrCode); + DWORD GetFileAttributesA(in char *lpFileName); + DWORD GetFileAttributesW(in wchar *lpFileName); + BOOL GetFileAttributesExA(LPCSTR, GET_FILEEX_INFO_LEVELS, PVOID); +@@ -1183,14 +1185,14 @@ version (Win64) + + // Copied from Public Domain w64 mingw-runtime package's winnt.h. + +- align(16) struct M128A ++ align(16) struct M128A + { + ULONGLONG Low; + LONGLONG High; +- } ++ } + alias M128A* PM128A; + +- struct XMM_SAVE_AREA32 ++ struct XMM_SAVE_AREA32 + { + WORD ControlWord; + WORD StatusWord; +@@ -1208,9 +1210,9 @@ version (Win64) + M128A FloatRegisters[8]; + M128A XmmRegisters[16]; + BYTE Reserved4[96]; +- } ++ } + alias XMM_SAVE_AREA32 PXMM_SAVE_AREA32; +- ++ + align(16) struct CONTEXT // sizeof(1232) + { + DWORD64 P1Home; +@@ -1251,11 +1253,11 @@ version (Win64) + DWORD64 R14; + DWORD64 R15; + DWORD64 Rip; +- union ++ union + { + XMM_SAVE_AREA32 FltSave; + XMM_SAVE_AREA32 FloatSave; +- struct ++ struct + { + M128A Header[2]; + M128A Legacy[8]; +@@ -1306,8 +1308,8 @@ else // Win32 + + CONTEXT_FULL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS), + +- CONTEXT_ALL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | +- CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | ++ CONTEXT_ALL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | ++ CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | + CONTEXT_EXTENDED_REGISTERS), + + MAXIMUM_SUPPORTED_EXTENSION = 512 +@@ -1344,7 +1346,7 @@ else // Win32 + // + // The context record is never used as an OUT only parameter. + // +- ++ + DWORD ContextFlags; + + // +@@ -1359,41 +1361,41 @@ else // Win32 + DWORD Dr3; + DWORD Dr6; + DWORD Dr7; +- ++ + // + // This section is specified/returned if the + // ContextFlags word contians the flag CONTEXT_FLOATING_POINT. + // +- ++ + FLOATING_SAVE_AREA FloatSave; +- ++ + // + // This section is specified/returned if the + // ContextFlags word contians the flag CONTEXT_SEGMENTS. + // +- ++ + DWORD SegGs; + DWORD SegFs; + DWORD SegEs; + DWORD SegDs; +- ++ + // + // This section is specified/returned if the + // ContextFlags word contians the flag CONTEXT_INTEGER. + // +- ++ + DWORD Edi; + DWORD Esi; + DWORD Ebx; + DWORD Edx; + DWORD Ecx; + DWORD Eax; +- ++ + // + // This section is specified/returned if the + // ContextFlags word contians the flag CONTEXT_CONTROL. + // +- ++ + DWORD Ebp; + DWORD Eip; + DWORD SegCs; // MUST BE SANITIZED +@@ -1579,11 +1581,11 @@ export BOOL SwitchToThread(); + + export + { +-LONG InterlockedIncrement(LPLONG lpAddend); +-LONG InterlockedDecrement(LPLONG lpAddend); +-LONG InterlockedExchange(LPLONG Target, LONG Value); +-LONG InterlockedExchangeAdd(LPLONG Addend, LONG Value); +-PVOID InterlockedCompareExchange(PVOID *Destination, PVOID Exchange, PVOID Comperand); ++LONG InterlockedIncrement(LPLONG lpAddend); ++LONG InterlockedDecrement(LPLONG lpAddend); ++LONG InterlockedExchange(LPLONG Target, LONG Value); ++LONG InterlockedExchangeAdd(LPLONG Addend, LONG Value); ++LONG InterlockedCompareExchange(LONG *Destination, LONG Exchange, LONG Comperand); + + void InitializeCriticalSection(CRITICAL_SECTION * lpCriticalSection); + void EnterCriticalSection(CRITICAL_SECTION * lpCriticalSection); +@@ -2690,6 +2692,12 @@ export + int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar); + } + ++// Code pages ++enum : UINT ++{ ++ CP_UTF8 = 65001 ++} ++ + export HANDLE CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName); + export HANDLE CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName); + +@@ -3677,3 +3685,16 @@ HINSTANCE ShellExecuteW(HWND hwnd, LPCWS + + UINT_PTR SetTimer(HWND hwnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); + BOOL KillTimer(HWND hwnd, UINT_PTR nIDEvent); ++ ++BOOL GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags); ++BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags); ++BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode); ++LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs); ++ ++enum ++{ ++ HANDLE_FLAG_INHERIT = 0x1, ++ HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x2, ++} ++ ++enum CREATE_UNICODE_ENVIRONMENT = 0x400; +--- a/src/libphobos/libdruntime/core/threadasm.S 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/threadasm.S 2014-04-01 16:32:51.000000000 +0100 +@@ -3,7 +3,7 @@ + * + * Copyright: Copyright Mikola Lysenko 2005 - 2012. + * License: Boost License 1.0. +- * Authors: Mikola Lysenko, Martin Nowak ++ * Authors: Mikola Lysenko, Martin Nowak, Kai Nacke + */ + + /* +@@ -16,7 +16,125 @@ + /************************************************************************************ + * POWER PC ASM BITS + ************************************************************************************/ +-#if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ ) ++#if defined( __PPC64__ ) ++ ++ ++ .text ++ .globl _D4core6thread18callWithStackShellFMDFPvZvZv ++ .align 2 ++ .type _D4core6thread18callWithStackShellFMDFPvZvZv,@function ++ .section .opd,"aw",@progbits ++_D4core6thread18callWithStackShellFMDFPvZvZv: ++ .align 3 ++ .quad .L._D4core6thread18callWithStackShellFMDFPvZvZv ++ .quad .TOC.@tocbase ++ .quad 0 ++ .text ++/* ++ * Called with: ++ * r3: pointer context ++ * r4: pointer to function ++ */ ++.L._D4core6thread18callWithStackShellFMDFPvZvZv: ++ .cfi_startproc ++ mflr 0 ++ std 0, 16(1) // save LR ++ stdu 1, -256(1) // stack size: 18*8 + 112 = 256 ++ .cfi_def_cfa_offset 256 ++ .cfi_offset lr, 16 ++ ++ /* Save r14-r31 in general register save area */ ++ std 14, (112 + 0 * 8)(1) ++ std 15, (112 + 1 * 8)(1) ++ std 16, (112 + 2 * 8)(1) ++ std 17, (112 + 3 * 8)(1) ++ std 18, (112 + 4 * 8)(1) ++ std 19, (112 + 5 * 8)(1) ++ std 20, (112 + 6 * 8)(1) ++ std 21, (112 + 7 * 8)(1) ++ std 22, (112 + 8 * 8)(1) ++ std 23, (112 + 9 * 8)(1) ++ std 24, (112 + 10 * 8)(1) ++ std 25, (112 + 11 * 8)(1) ++ std 26, (112 + 12 * 8)(1) ++ std 27, (112 + 13 * 8)(1) ++ std 28, (112 + 14 * 8)(1) ++ std 29, (112 + 15 * 8)(1) ++ std 30, (112 + 16 * 8)(1) ++ std 31, (112 + 17 * 8)(1) ++ ++ /* Save r3-r10 in parameter save area of caller */ ++ std 3, (256 + 48 + 0 * 8)(1) ++ std 4, (256 + 48 + 1 * 8)(1) ++ std 5, (256 + 48 + 2 * 8)(1) ++ std 6, (256 + 48 + 3 * 8)(1) ++ std 7, (256 + 48 + 4 * 8)(1) ++ std 8, (256 + 48 + 5 * 8)(1) ++ std 9, (256 + 48 + 6 * 8)(1) ++ std 10, (256 + 48 + 7 * 8)(1) ++ ++ /* Save r2 in TOC save area */ ++ std 2, 40(1) ++ ++ /* Do not save r11, r12 and r13. */ ++ ++ /* Call delegate: ++ * r3: pointer to context ++ * r4: pointer to stack ++ */ ++ mr 5, 4 ++ mr 4, 1 ++ ld 6, 0(5) ++ ld 11, 16(5) ++ ld 2, 8(5) ++ mtctr 6 ++ bctrl ++ nop ++ ++ /* Restore r2 from TOC save area */ ++ ld 2, 40(1) ++ ++ /* Restore r3-r10 from local variable space */ ++ ld 3, (256 + 48 + 0 * 8)(1) ++ ld 4, (256 + 48 + 1 * 8)(1) ++ ld 5, (256 + 48 + 2 * 8)(1) ++ ld 6, (256 + 48 + 3 * 8)(1) ++ ld 7, (256 + 48 + 4 * 8)(1) ++ ld 8, (256 + 48 + 5 * 8)(1) ++ ld 9, (256 + 48 + 6 * 8)(1) ++ ld 10, (256 + 48 + 7 * 8)(1) ++ ++ /* Restore r14-r31 from general register save area */ ++ ld 14, (112 + 0 * 8)(1) ++ ld 15, (112 + 1 * 8)(1) ++ ld 16, (112 + 2 * 8)(1) ++ ld 17, (112 + 3 * 8)(1) ++ ld 18, (112 + 4 * 8)(1) ++ ld 19, (112 + 5 * 8)(1) ++ ld 20, (112 + 6 * 8)(1) ++ ld 21, (112 + 7 * 8)(1) ++ ld 22, (112 + 8 * 8)(1) ++ ld 23, (112 + 9 * 8)(1) ++ ld 24, (112 + 10 * 8)(1) ++ ld 25, (112 + 11 * 8)(1) ++ ld 26, (112 + 12 * 8)(1) ++ ld 27, (112 + 13 * 8)(1) ++ ld 28, (112 + 14 * 8)(1) ++ ld 29, (112 + 15 * 8)(1) ++ ld 30, (112 + 16 * 8)(1) ++ ld 31, (112 + 17 * 8)(1) ++ ++ addi 1, 1, 256 ++ ld 0, 16(1) ++ mtlr 0 ++ blr ++ .long 0 ++ .quad 0 ++.Lend: ++ .size _D4core6thread18callWithStackShellFMDFPvZvZv, .Lend-.L._D4core6thread18callWithStackShellFMDFPvZvZv ++ .cfi_endproc ++ ++#elif defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ ) + + + /** +@@ -214,4 +332,80 @@ fiber_switchContext: + + jr $ra // return + ++#elif defined(__arm__) && defined(__ARM_EABI__) ++/************************************************************************************ ++ * ARM ASM BITS ++ ************************************************************************************/ ++ ++/** ++ * Performs a context switch. ++ * ++ * Parameters: ++ * r0 - void** - ptr to old stack pointer ++ * r1 - void* - new stack pointer ++ * ++ * ARM EABI registers: ++ * r0-r3 : argument/scratch registers ++ * r4-r10 : callee-save registers ++ * r11 : frame pointer (or a callee save register if fp isn't needed) ++ * r12 =ip : inter procedure register. We can treat it like any other scratch register ++ * r13 =sp : stack pointer ++ * r14 =lr : link register, it contains the return address (belonging to the function which called us) ++ * r15 =pc : program counter ++ * ++ * For floating point registers: ++ * According to AAPCS (version 2.09, section 5.1.2) only the d8-d15 registers need to be preserved ++ * across method calls. This applies to all ARM FPU variants, whether they have 16 or 32 double registers ++ * NEON support or not, half-float support or not and so on does not matter. ++ * ++ * Note: If this file was compiled with -mfloat-abi=soft but the code runs on a softfp system with fpu the d8-d15 ++ * registers won't be saved (we do not know that the system has got a fpu in that case) but the registers might actually ++ * be used by other code if it was compiled with -mfloat-abi=softfp. ++ * ++ * Interworking is only supported on ARMv5+, not on ARM v4T as ARM v4t requires special stubs when changing ++ * from thumb to arm mode or the other way round. ++ */ ++ ++.text ++.align 2 ++.global fiber_switchContext ++.type fiber_switchContext, %function ++fiber_switchContext: ++ .fnstart ++ push {r4-r11} ++ // update the oldp pointer. Link register and floating point registers stored later to prevent the GC from ++ // scanning them. ++ str sp, [r0] ++ // push r0 (or any other register) as well to keep stack 8byte aligned ++ push {r0, lr} ++ ++ #if defined(__ARM_PCS_VFP) || (defined(__ARM_PCS) && !defined(__SOFTFP__)) // ARM_HardFloat || ARM_SoftFP ++ vpush {d8-d15} ++ // now switch over to the new stack. Need to subtract (8*8[d8-d15]+2*4[r0, lr]) to position stack pointer ++ // below the last saved register. Remember we saved the SP before pushing [r0, lr, d8-d15] ++ sub sp, r1, #72 ++ vpop {d8-d15} ++ #else ++ sub sp, r1, #8 ++ #endif ++ ++ // we don't really care about r0, we only used that for padding. ++ // r1 is now what used to be in the link register when saving. ++ pop {r0, r1, r4-r11} ++ /** ++ * The link register for the initial jump to fiber_entryPoint must be zero: The jump actually ++ * looks like a normal method call as we jump to the start of the fiber_entryPoint function. ++ * Although fiber_entryPoint never returns and therefore never accesses lr, it saves lr to the stack. ++ * ARM unwinding will then look at the stack, find lr and think that fiber_entryPoint was called by ++ * the function in lr! So if we have some address in lr the unwinder will try to continue stack unwinding, ++ * although it's already at the stack base and crash. ++ * In all other cases the content of lr doesn't matter. ++ * Note: If we simply loaded into lr above and then moved lr into pc, the initial method call ++ * to fiber_entryPoint would look as if it was called from fiber_entryPoint itself, as the fiber_entryPoint ++ * address is in lr on the initial context switch. ++ */ ++ mov lr, #0 ++ // return by writing lr into pc ++ mov pc, r1 ++ .fnend + #endif +--- a/src/libphobos/libdruntime/core/thread.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/thread.d 2014-04-01 16:32:51.000000000 +0100 +@@ -13,6 +13,7 @@ module core.thread; + + + public import core.time; // for Duration ++import core.exception : onOutOfMemoryError; + static import rt.tlsgc; + + // this should be true for most architectures +@@ -48,12 +49,12 @@ else version (Windows) + */ + class ThreadException : Exception + { +- this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + super(msg, file, line, next); + } + +- this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) ++ @safe pure nothrow this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) + { + super(msg, file, line, next); + } +@@ -65,12 +66,12 @@ class ThreadException : Exception + */ + class FiberException : Exception + { +- this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + super(msg, file, line, next); + } + +- this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) ++ @safe pure nothrow this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__) + { + super(msg, file, line, next); + } +@@ -125,40 +126,6 @@ version( Windows ) + extern (Windows) alias uint function(void*) btex_fptr; + extern (C) uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint*); + +- version( DigitalMars ) +- { +- version (Win32) +- { +- // NOTE: The memory between the addresses of _tlsstart and _tlsend +- // is the storage for thread-local data in D 2.0. Both of +- // these are defined in dm\src\win32\tlsseg.asm by DMC. +- extern (C) +- { +- extern int _tlsstart; +- extern int _tlsend; +- } +- } +- version (Win64) +- { +- // NOTE: The memory between the addresses of _tls_start and _tls_end +- // is the storage for thread-local data in D 2.0. Both of +- // these are defined in LIBCMT:tlssub.obj +- extern (C) +- { +- extern int _tls_start; +- extern int _tls_end; +- } +- alias _tls_start _tlsstart; +- alias _tls_end _tlsend; +- } +- } +- else +- { +- __gshared int _tlsstart; +- alias _tlsstart _tlsend; +- } +- +- + // + // Entry point for Windows threads + // +@@ -170,10 +137,7 @@ version( Windows ) + assert( obj.m_curr is &obj.m_main ); + obj.m_main.bstack = getStackBottom(); + obj.m_main.tstack = obj.m_main.bstack; +- +- void* pstart = cast(void*) &_tlsstart; +- void* pend = cast(void*) &_tlsend; +- obj.m_tls = pstart[0 .. pend - pstart]; ++ obj.m_tlsgcdata = rt.tlsgc.init(); + + Thread.setThis( obj ); + //Thread.add( obj ); +@@ -182,7 +146,6 @@ version( Windows ) + Thread.remove( obj ); + } + Thread.add( &obj.m_main ); +- obj.m_tlsgcdata = rt.tlsgc.init(); + + // NOTE: No GC allocations may occur until the stack pointers have + // been set and Thread.getThis returns a valid reference to +@@ -266,81 +229,37 @@ else version( Posix ) + version( GNU ) + { + import gcc.builtins; +- } + +- version( DigitalMars ) +- { +- version( linux ) +- { +- extern (C) +- { +- extern int _tlsstart; +- extern int _tlsend; +- } +- } +- else version( OSX ) +- { +- extern (C) +- { +- __gshared void[][2] _tls_data_array; +- } +- } +- else version( FreeBSD ) +- { +- extern (C) +- { +- extern void* _tlsstart; +- extern void* _tlsend; +- } +- } +- else +- { +- __gshared int _tlsstart; +- alias _tlsstart _tlsend; +- } +- } +- else version( GNU ) +- { + extern (C) + { +- extern int _tlsstart; +- extern int _tlsend; ++ extern size_t _tlsstart; ++ extern size_t _tlsend; + } + } +- else +- { +- __gshared int _tlsstart; +- alias _tlsstart _tlsend; +- } +- + + // + // Entry point for POSIX threads + // + extern (C) void* thread_entryPoint( void* arg ) + { +- Thread obj = cast(Thread) arg; ++ version (Shared) ++ { ++ import rt.sections; ++ Thread obj = cast(Thread)(cast(void**)arg)[0]; ++ auto loadedLibraries = (cast(void**)arg)[1]; ++ .free(arg); ++ } ++ else ++ { ++ Thread obj = cast(Thread)arg; ++ } + assert( obj ); + + assert( obj.m_curr is &obj.m_main ); + obj.m_main.bstack = getStackBottom(); + obj.m_main.tstack = obj.m_main.bstack; +- +- version (OSX) +- { +- // NOTE: OSX does not support TLS, so we do it ourselves. The TLS +- // data output by the compiler is bracketed by _tls_data_array[2], +- // so make a copy of it for each thread. +- const sz0 = (_tls_data_array[0].length + 15) & ~cast(size_t)15; +- const sz2 = sz0 + _tls_data_array[1].length; +- auto p = malloc( sz2 ); +- assert( p ); +- obj.m_tls = p[0 .. sz2]; +- memcpy( p, _tls_data_array[0].ptr, _tls_data_array[0].length ); +- memcpy( p + sz0, _tls_data_array[1].ptr, _tls_data_array[1].length ); +- scope (exit) { free( p ); obj.m_tls = null; } +- } +- else ++ obj.m_tlsgcdata = rt.tlsgc.init(); ++ version (GNU) + { + auto pstart = cast(void*) &_tlsstart; + auto pend = cast(void*) &_tlsend; +@@ -359,7 +278,6 @@ else version( Posix ) + obj.m_isRunning = false; + } + Thread.add( &obj.m_main ); +- obj.m_tlsgcdata = rt.tlsgc.init(); + + static extern (C) void thread_cleanupHandler( void* arg ) nothrow + { +@@ -419,6 +337,7 @@ else version( Posix ) + + try + { ++ version (Shared) inheritLoadedLibraries(loadedLibraries); + rt_moduleTlsCtor(); + try + { +@@ -429,6 +348,7 @@ else version( Posix ) + append( t ); + } + rt_moduleTlsDtor(); ++ version (Shared) cleanupLoadedLibraries(); + } + catch( Throwable t ) + { +@@ -741,8 +661,26 @@ class Thread + m_isRunning = true; + scope( failure ) m_isRunning = false; + +- if( pthread_create( &m_addr, &attr, &thread_entryPoint, cast(void*) this ) != 0 ) +- throw new ThreadException( "Error creating thread" ); ++ version (Shared) ++ { ++ import rt.sections; ++ auto libs = pinLoadedLibraries(); ++ auto ps = cast(void**).malloc(2 * size_t.sizeof); ++ if (ps is null) onOutOfMemoryError(); ++ ps[0] = cast(void*)this; ++ ps[1] = cast(void*)libs; ++ if( pthread_create( &m_addr, &attr, &thread_entryPoint, ps ) != 0 ) ++ { ++ unpinLoadedLibraries(libs); ++ .free(ps); ++ throw new ThreadException( "Error creating thread" ); ++ } ++ } ++ else ++ { ++ if( pthread_create( &m_addr, &attr, &thread_entryPoint, cast(void*) this ) != 0 ) ++ throw new ThreadException( "Error creating thread" ); ++ } + } + version( OSX ) + { +@@ -934,13 +872,22 @@ class Thread + /** + * The maximum scheduling priority that may be set for a thread. On + * systems where multiple scheduling policies are defined, this value +- * represents the minimum valid priority for the scheduling policy of ++ * represents the maximum valid priority for the scheduling policy of + * the process. + */ + __gshared const int PRIORITY_MAX; + + + /** ++ * The default scheduling priority that is set for a thread. On ++ * systems where multiple scheduling policies are defined, this value ++ * represents the default priority for the scheduling policy of ++ * the process. ++ */ ++ __gshared const int PRIORITY_DEFAULT; ++ ++ ++ /** + * Gets the scheduling priority for the associated thread. + * + * Returns: +@@ -971,6 +918,12 @@ class Thread + * val = The new scheduling priority of this thread. + */ + final @property void priority( int val ) ++ in ++ { ++ assert(val >= PRIORITY_MIN); ++ assert(val <= PRIORITY_MAX); ++ } ++ body + { + version( Windows ) + { +@@ -979,23 +932,42 @@ class Thread + } + else version( Posix ) + { +- // NOTE: pthread_setschedprio is not implemented on linux, so use +- // the more complicated get/set sequence below. +- //if( pthread_setschedprio( m_addr, val ) ) +- // throw new ThreadException( "Unable to set thread priority" ); +- +- int policy; +- sched_param param; +- +- if( pthread_getschedparam( m_addr, &policy, ¶m ) ) +- throw new ThreadException( "Unable to set thread priority" ); +- param.sched_priority = val; +- if( pthread_setschedparam( m_addr, policy, ¶m ) ) +- throw new ThreadException( "Unable to set thread priority" ); ++ static if( __traits( compiles, pthread_setschedprio ) ) ++ { ++ if( pthread_setschedprio( m_addr, val ) ) ++ throw new ThreadException( "Unable to set thread priority" ); ++ } ++ else ++ { ++ // NOTE: pthread_setschedprio is not implemented on OSX or FreeBSD, so use ++ // the more complicated get/set sequence below. ++ int policy; ++ sched_param param; ++ ++ if( pthread_getschedparam( m_addr, &policy, ¶m ) ) ++ throw new ThreadException( "Unable to set thread priority" ); ++ param.sched_priority = val; ++ if( pthread_setschedparam( m_addr, policy, ¶m ) ) ++ throw new ThreadException( "Unable to set thread priority" ); ++ } + } + } + + ++ unittest ++ { ++ auto thr = Thread.getThis(); ++ immutable prio = thr.priority; ++ scope (exit) thr.priority = prio; ++ ++ assert(prio == PRIORITY_DEFAULT); ++ assert(prio >= PRIORITY_MIN && prio <= PRIORITY_MAX); ++ thr.priority = PRIORITY_MIN; ++ assert(thr.priority == PRIORITY_MIN); ++ thr.priority = PRIORITY_MAX; ++ assert(thr.priority == PRIORITY_MAX); ++ } ++ + /////////////////////////////////////////////////////////////////////////// + // Actions on Calling Thread + /////////////////////////////////////////////////////////////////////////// +@@ -1031,6 +1003,10 @@ class Thread + { + auto maxSleepMillis = dur!("msecs")( uint.max - 1 ); + ++ // avoid a non-zero time to be round down to 0 ++ if( val > dur!"msecs"( 0 ) && val < dur!"msecs"( 1 ) ) ++ val = dur!"msecs"( 1 ); ++ + // NOTE: In instances where all other threads in the process have a + // lower priority than the current thread, the current thread + // will not yield with a sleep time of zero. However, unlike +@@ -1074,41 +1050,6 @@ class Thread + + + /** +- * $(RED Deprecated. It will be removed in December 2012. Please use the +- * version which takes a $(D Duration) instead.) +- * +- * Suspends the calling thread for at least the supplied period. This may +- * result in multiple OS calls if period is greater than the maximum sleep +- * duration supported by the operating system. +- * +- * Params: +- * period = The minimum duration the calling thread should be suspended, +- * in 100 nanosecond intervals. +- * +- * In: +- * period must be non-negative. +- * +- * Example: +- * ------------------------------------------------------------------------ +- * +- * Thread.sleep( 500_000 ); // sleep for 50 milliseconds +- * Thread.sleep( 50_000_000 ); // sleep for 5 seconds +- * +- * ------------------------------------------------------------------------ +- */ +- deprecated("Please use the overload of sleep which takes a Duration.") +- static void sleep( long period ) +- in +- { +- assert( period >= 0 ); +- } +- body +- { +- sleep( dur!"hnsecs"( period ) ); +- } +- +- +- /** + * Forces a context switch to occur away from the calling thread. + */ + static void yield() +@@ -1138,30 +1079,7 @@ class Thread + // NOTE: This function may not be called until thread_init has + // completed. See thread_suspendAll for more information + // on why this might occur. +- version( Windows ) +- { +- auto t = cast(Thread) TlsGetValue( sm_this ); +- +- // NOTE: If this thread was attached via thread_attachByAddr then +- // this TLS lookup won't initially be set, so when the TLS +- // lookup fails, try an exhaustive search. +- if( t is null ) +- { +- t = thread_findByAddr( GetCurrentThreadId() ); +- setThis( t ); +- } +- return t; +- } +- else version( Posix ) +- { +- auto t = cast(Thread) pthread_getspecific( sm_this ); +- +- // NOTE: See the comment near thread_findByAddr() for why the +- // secondary thread_findByAddr lookup can't be done on +- // Posix. However, because thread_attachByAddr() is for +- // Windows only, the secondary lookup is pointless anyway. +- return t; +- } ++ return sm_this; + } + + +@@ -1229,8 +1147,9 @@ class Thread + { + version( Windows ) + { +- PRIORITY_MIN = -15; +- PRIORITY_MAX = 15; ++ PRIORITY_MIN = THREAD_PRIORITY_IDLE; ++ PRIORITY_DEFAULT = THREAD_PRIORITY_NORMAL; ++ PRIORITY_MAX = THREAD_PRIORITY_TIME_CRITICAL; + } + else version( Posix ) + { +@@ -1244,6 +1163,8 @@ class Thread + PRIORITY_MIN = sched_get_priority_min( policy ); + assert( PRIORITY_MIN != -1 ); + ++ PRIORITY_DEFAULT = param.sched_priority; ++ + PRIORITY_MAX = sched_get_priority_max( policy ); + assert( PRIORITY_MAX != -1 ); + } +@@ -1265,23 +1186,7 @@ private: + m_call = Call.NO; + m_curr = &m_main; + +- version (OSX) +- { +- //printf("test2 %p %p\n", _tls_data_array[0].ptr, &_tls_data_array[1][length]); +- //printf("test2 %p %p\n", &_tls_beg, &_tls_end); +- // NOTE: OSX does not support TLS, so we do it ourselves. The TLS +- // data output by the compiler is bracketed by _tls_data_array2], +- // so make a copy of it for each thread. +- const sz0 = (_tls_data_array[0].length + 15) & ~cast(size_t)15; +- const sz2 = sz0 + _tls_data_array[1].length; +- auto p = malloc( sz2 ); +- assert( p ); +- m_tls = p[0 .. sz2]; +- memcpy( p, _tls_data_array[0].ptr, _tls_data_array[0].length ); +- memcpy( p + sz0, _tls_data_array[1].ptr, _tls_data_array[1].length ); +- // The free must happen at program end, if anywhere. +- } +- else ++ version (GNU) + { + auto pstart = cast(void*) &_tlsstart; + auto pend = cast(void*) &_tlsend; +@@ -1340,7 +1245,7 @@ private: + // + // Local storage + // +- __gshared TLSKey sm_this; ++ static Thread sm_this; + + + // +@@ -1389,14 +1294,7 @@ private: + // + static void setThis( Thread t ) + { +- version( Windows ) +- { +- TlsSetValue( sm_this, cast(void*) t ); +- } +- else version( Posix ) +- { +- pthread_setspecific( sm_this, cast(void*) t ); +- } ++ sm_this = t; + } + + +@@ -1455,7 +1353,10 @@ private: + Context m_main; + Context* m_curr; + bool m_lock; +- void[] m_tls; // spans implicit thread local storage ++ version (GNU) ++ { ++ void[] m_tls; // spans implicit thread local storage ++ } + rt.tlsgc.Data* m_tlsgcdata; + + version( Windows ) +@@ -1533,21 +1434,29 @@ private: + // + @property static Mutex slock() + { +- __gshared Mutex m; +- __gshared byte[__traits(classInstanceSize, Mutex)] ms; ++ return cast(Mutex)_locks[0].ptr; ++ } + +- if (m is null) +- { +- // Initialization doesn't need to be synchronized because +- // creating a thread will lock this mutex. +- ms[] = Mutex.classinfo.init[]; +- m = cast(Mutex)ms.ptr; +- m.__ctor(); ++ @property static Mutex criticalRegionLock() ++ { ++ return cast(Mutex)_locks[1].ptr; ++ } ++ ++ __gshared byte[__traits(classInstanceSize, Mutex)][2] _locks; + +- extern(C) void destroy() { m.__dtor(); } +- atexit(&destroy); ++ static void initLocks() ++ { ++ foreach (ref lock; _locks) ++ { ++ lock[] = Mutex.classinfo.init[]; ++ (cast(Mutex)lock.ptr).__ctor(); + } +- return m; ++ } ++ ++ static void termLocks() ++ { ++ foreach (ref lock; _locks) ++ (cast(Mutex)lock.ptr).__dtor(); + } + + __gshared Context* sm_cbeg; +@@ -1742,8 +1651,10 @@ private: + } + + // These must be kept in sync with core/thread.di +-version (D_LP64) ++version (GNU) + { ++ version (D_LP64) ++ { + version (Windows) + static assert(__traits(classInstanceSize, Thread) == 312); + else version (OSX) +@@ -1753,6 +1664,35 @@ version (D_LP64) + else version (Posix) + static assert(__traits(classInstanceSize, Thread) == 184); + else ++ static assert(0, "Platform not supported."); ++ } ++ else ++ { ++ static assert((void*).sizeof == 4); // 32-bit ++ ++ version (Windows) ++ static assert(__traits(classInstanceSize, Thread) == 128); ++ else version (OSX) ++ static assert(__traits(classInstanceSize, Thread) == 128); ++ else version (Posix) ++ static assert(__traits(classInstanceSize, Thread) == 92); ++ else ++ static assert(0, "Platform not supported."); ++ ++ } ++} ++else ++version (D_LP64) ++{ ++ version (Windows) ++ static assert(__traits(classInstanceSize, Thread) == 296); ++ else version (OSX) ++ static assert(__traits(classInstanceSize, Thread) == 304); ++ else version (Solaris) ++ static assert(__traits(classInstanceSize, Thread) == 160); ++ else version (Posix) ++ static assert(__traits(classInstanceSize, Thread) == 168); ++ else + static assert(0, "Platform not supported."); + } + else +@@ -1760,11 +1700,11 @@ else + static assert((void*).sizeof == 4); // 32-bit + + version (Windows) +- static assert(__traits(classInstanceSize, Thread) == 128); ++ static assert(__traits(classInstanceSize, Thread) == 120); + else version (OSX) +- static assert(__traits(classInstanceSize, Thread) == 128); ++ static assert(__traits(classInstanceSize, Thread) == 120); + else version (Posix) +- static assert(__traits(classInstanceSize, Thread) == 92); ++ static assert(__traits(classInstanceSize, Thread) == 84); + else + static assert(0, "Platform not supported."); + } +@@ -1822,17 +1762,10 @@ extern (C) void thread_init() + // exist to be scanned at this point, it is sufficient for these + // functions to detect the condition and return immediately. + +- version( Windows ) +- { +- Thread.sm_this = TlsAlloc(); +- assert( Thread.sm_this != TLS_OUT_OF_INDEXES ); +- } +- else version( OSX ) +- { +- int status; ++ Thread.initLocks(); + +- status = pthread_key_create( &Thread.sm_this, null ); +- assert( status == 0 ); ++ version( OSX ) ++ { + } + else version( Posix ) + { +@@ -1876,15 +1809,22 @@ extern (C) void thread_init() + + status = sem_init( &suspendCount, 0, 0 ); + assert( status == 0 ); +- +- status = pthread_key_create( &Thread.sm_this, null ); +- assert( status == 0 ); + } + Thread.sm_main = thread_attachThis(); + } + + + /** ++ * Terminates the thread module. No other thread routine may be called ++ * afterwards. ++ */ ++extern (C) void thread_term() ++{ ++ Thread.termLocks(); ++} ++ ++ ++/** + * + */ + extern (C) bool thread_isMainThread() +@@ -1924,6 +1864,7 @@ extern (C) Thread thread_attachThis() + thisThread.m_isRunning = true; + } + thisThread.m_isDaemon = true; ++ thisThread.m_tlsgcdata = rt.tlsgc.init(); + Thread.setThis( thisThread ); + + version( OSX ) +@@ -1932,23 +1873,7 @@ extern (C) Thread thread_attachThis() + assert( thisThread.m_tmach != thisThread.m_tmach.init ); + } + +- version (OSX) +- { +- //printf("test3 %p %p\n", _tls_data_array[0].ptr, &_tls_data_array[1][length]); +- //printf("test3 %p %p\n", &_tls_beg, &_tls_end); +- // NOTE: OSX does not support TLS, so we do it ourselves. The TLS +- // data output by the compiler is bracketed by _tls_data_array[2], +- // so make a copy of it for each thread. +- const sz0 = (_tls_data_array[0].length + 15) & ~cast(size_t)15; +- const sz2 = sz0 + _tls_data_array[1].length; +- auto p = gc_malloc( sz2 ); +- assert( p ); +- thisThread.m_tls = p[0 .. sz2]; +- memcpy( p, _tls_data_array[0].ptr, _tls_data_array[0].length ); +- memcpy( p + sz0, _tls_data_array[1].ptr, _tls_data_array[1].length ); +- // used gc_malloc so no need to free +- } +- else ++ version (GNU) + { + auto pstart = cast(void*) &_tlsstart; + auto pend = cast(void*) &_tlsend; +@@ -1959,7 +1884,6 @@ extern (C) Thread thread_attachThis() + Thread.add( thisContext ); + if( Thread.sm_main !is null ) + multiThreadedFlag = true; +- thisThread.m_tlsgcdata = rt.tlsgc.init(); + return thisThread; + } + +@@ -1999,44 +1923,44 @@ version( Windows ) + thisContext.bstack = bstack; + thisContext.tstack = thisContext.bstack; + +- if( addr == GetCurrentThreadId() ) +- { +- thisThread.m_hndl = GetCurrentThreadHandle(); +- } +- else +- { +- thisThread.m_hndl = OpenThreadHandle( addr ); +- } +- + thisThread.m_isDaemon = true; + + if( addr == GetCurrentThreadId() ) + { +- auto pstart = cast(void*) &_tlsstart; +- auto pend = cast(void*) &_tlsend; +- thisThread.m_tls = pstart[0 .. pend - pstart]; ++ thisThread.m_hndl = GetCurrentThreadHandle(); ++ thisThread.m_tlsgcdata = rt.tlsgc.init(); ++ version (GNU) ++ { ++ auto pstart = cast(void*) &_tlsstart; ++ auto pend = cast(void*) &_tlsend; ++ thisThread.m_tls = pstart[0 .. pend - pstart]; ++ } + Thread.setThis( thisThread ); + } + else + { +- // TODO: This seems wrong. If we're binding threads from +- // a DLL, will they always have space reserved for +- // the TLS chunk we expect? I don't know Windows +- // well enough to say. +- auto pstart = cast(void*) &_tlsstart; +- auto pend = cast(void*) &_tlsend; +- auto pos = GetTlsDataAddress( thisThread.m_hndl ); +- if( pos ) // on x64, threads without TLS happen to exist +- thisThread.m_tls = pos[0 .. pend - pstart]; +- else +- thisThread.m_tls = []; ++ thisThread.m_hndl = OpenThreadHandle( addr ); ++ impersonate_thread(addr, ++ { ++ thisThread.m_tlsgcdata = rt.tlsgc.init(); ++ version (GNU) ++ { ++ auto pstart = cast(void*) &_tlsstart; ++ auto pend = cast(void*) &_tlsend; ++ auto pos = GetTlsDataAddress( thisThread.m_hndl ); ++ if( pos ) // on x64, threads without TLS happen to exist ++ thisThread.m_tls = pos[0 .. pend - pstart]; ++ else ++ thisThread.m_tls = []; ++ } ++ Thread.setThis( thisThread ); ++ }); + } + + Thread.add( thisThread ); + Thread.add( thisContext ); + if( Thread.sm_main !is null ) + multiThreadedFlag = true; +- thisThread.m_tlsgcdata = rt.tlsgc.init(); + return thisThread; + } + } +@@ -2151,102 +2075,95 @@ shared static ~this() + // Used for needLock below. + private __gshared bool multiThreadedFlag = false; + ++version (PPC64) version = ExternStackShell; + +-// Calls the given delegate, passing the current thread's stack pointer to it. +-private void callWithStackShell(scope void delegate(void* sp) fn) +-in ++version (ExternStackShell) + { +- assert(fn); ++ extern(D) public void callWithStackShell(scope void delegate(void* sp) fn); + } +-body ++else + { +- // The purpose of the 'shell' is to ensure all the registers +- // get put on the stack so they'll be scanned +- void *sp; +- +- version (GNU) ++ // Calls the given delegate, passing the current thread's stack pointer to it. ++ private void callWithStackShell(scope void delegate(void* sp) fn) ++ in + { +- __builtin_unwind_init(); +- sp = & sp; ++ assert(fn); + } +- else version (D_InlineAsm_X86) ++ body + { +- asm ++ // The purpose of the 'shell' is to ensure all the registers get ++ // put on the stack so they'll be scanned. We only need to push ++ // the callee-save registers. ++ void *sp = void; ++ ++ version (GNU) + { +- pushad ; +- mov sp[EBP],ESP ; ++ __builtin_unwind_init(); ++ sp = &sp; + } +- } +- else version (D_InlineAsm_X86_64) +- { +- asm ++ else version (AsmX86_Posix) + { +- push RAX ; +- push RBX ; +- push RCX ; +- push RDX ; +- push RSI ; +- push RDI ; +- push RBP ; +- push R8 ; +- push R9 ; +- push R10 ; +- push R11 ; +- push R12 ; +- push R13 ; +- push R14 ; +- push R15 ; +- push RAX ; // 16 byte align the stack +- mov sp[RBP],RSP ; ++ size_t[3] regs = void; ++ asm ++ { ++ mov [regs + 0 * 4], EBX; ++ mov [regs + 1 * 4], ESI; ++ mov [regs + 2 * 4], EDI; ++ ++ mov sp[EBP], ESP; ++ } + } +- } +- else +- { +- static assert(false, "Architecture not supported."); +- } ++ else version (AsmX86_Windows) ++ { ++ size_t[3] regs = void; ++ asm ++ { ++ mov [regs + 0 * 4], EBX; ++ mov [regs + 1 * 4], ESI; ++ mov [regs + 2 * 4], EDI; + +- fn(sp); ++ mov sp[EBP], ESP; ++ } ++ } ++ else version (AsmX86_64_Posix) ++ { ++ size_t[5] regs = void; ++ asm ++ { ++ mov [regs + 0 * 8], RBX; ++ mov [regs + 1 * 8], R12; ++ mov [regs + 2 * 8], R13; ++ mov [regs + 3 * 8], R14; ++ mov [regs + 4 * 8], R15; + +- version (GNU) +- { +- // registers will be popped automatically +- } +- else version (D_InlineAsm_X86) +- { +- asm ++ mov sp[RBP], RSP; ++ } ++ } ++ else version (AsmX86_64_Windows) + { +- popad; ++ size_t[7] regs = void; ++ asm ++ { ++ mov [regs + 0 * 8], RBX; ++ mov [regs + 1 * 8], RSI; ++ mov [regs + 2 * 8], RDI; ++ mov [regs + 3 * 8], R12; ++ mov [regs + 4 * 8], R13; ++ mov [regs + 5 * 8], R14; ++ mov [regs + 6 * 8], R15; ++ ++ mov sp[RBP], RSP; ++ } + } +- } +- else version (D_InlineAsm_X86_64) +- { +- asm ++ else + { +- pop RAX ; // 16 byte align the stack +- pop R15 ; +- pop R14 ; +- pop R13 ; +- pop R12 ; +- pop R11 ; +- pop R10 ; +- pop R9 ; +- pop R8 ; +- pop RBP ; +- pop RDI ; +- pop RSI ; +- pop RDX ; +- pop RCX ; +- pop RBX ; +- pop RAX ; ++ static assert(false, "Architecture not supported."); + } +- } +- else +- { +- static assert(false, "Architecture not supported."); ++ ++ fn(sp); + } + } + +- + // Used for suspendAll/resumeAll below. + private __gshared uint suspendDepth = 0; + +@@ -2402,17 +2319,12 @@ private void suspend( Thread t ) + } + throw new ThreadException( "Unable to suspend thread" ); + } +- // NOTE: It's really not ideal to wait for each thread to +- // signal individually -- rather, it would be better to +- // suspend them all and wait once at the end. However, +- // semaphores don't really work this way, and the obvious +- // alternative (looping on an atomic suspend count) +- // requires either the atomic module (which only works on +- // x86) or other specialized functionality. It would +- // also be possible to simply loop on sem_wait at the +- // end, but I'm not convinced that this would be much +- // faster than the current approach. +- sem_wait( &suspendCount ); ++ while (sem_wait(&suspendCount) != 0) ++ { ++ if (errno != EINTR) ++ throw new ThreadException( "Unable to wait for semaphore" ); ++ errno = 0; ++ } + } + else if( !t.m_lock ) + { +@@ -2465,61 +2377,30 @@ extern (C) void thread_suspendAll() + // the same thread to be suspended twice, which would likely + // cause the second suspend to fail, the garbage collection to + // abort, and Bad Things to occur. +- for( Thread t = Thread.sm_tbeg; t; t = t.next ) +- { +- if( t.isRunning ) +- suspend( t ); +- else +- Thread.remove( t ); +- } + +- // The world is stopped. We now make sure that all threads are outside +- // critical regions by continually suspending and resuming them until all +- // of them are safe. This is extremely error-prone; if some thread enters +- // a critical region and never exits it (e.g. it waits for a mutex forever), +- // then we'll pretty much 'deadlock' here. Not much we can do about that, +- // and it indicates incorrect use of the critical region API anyway. +- for (;;) +- { +- uint unsafeCount; +- +- for (auto t = Thread.sm_tbeg; t; t = t.next) +- { +- // NOTE: We don't need to check whether the thread has died here, +- // since it's checked in the loops above and below. +- if (atomicLoad(*cast(shared)&t.m_isInCriticalRegion)) +- { +- unsafeCount += 10; +- resume(t); +- } ++ Thread.criticalRegionLock.lock(); ++ for (Thread t = Thread.sm_tbeg; t !is null; t = t.next) ++ { ++ Duration waittime = dur!"usecs"(10); ++ Lagain: ++ if (!t.isRunning) ++ { ++ Thread.remove(t); ++ } ++ else if (t.m_isInCriticalRegion) ++ { ++ Thread.criticalRegionLock.unlock(); ++ Thread.sleep(waittime); ++ if (waittime < dur!"msecs"(10)) waittime *= 2; ++ Thread.criticalRegionLock.lock(); ++ goto Lagain; + } +- +- // If all threads are safe (i.e. unsafeCount == 0), no threads were in +- // critical regions in the first place, and we can just break. Otherwise, +- // we sleep for a bit to give the threads a chance to get to safe points. +- if (unsafeCount) +- Thread.sleep(dur!"usecs"(unsafeCount)); // This heuristic could probably use some tuning. + else +- break; +- +- // Some thread was not in a safe region, so we suspend the world again to +- // re-do this loop to check whether we're safe now. +- for (auto t = Thread.sm_tbeg; t; t = t.next) +- { +- // The thread could have died in the meantime. Also see the note in +- // the topmost loop that initially suspends the world. +- if (t.isRunning) +- suspend(t); +- else +- Thread.remove(t); ++ { ++ suspend(t); + } + } +- +- version( Posix ) +- { +- // wait on semaphore -- see note in suspend for +- // why this is currently not implemented +- } ++ Thread.criticalRegionLock.unlock(); + } + } + +@@ -2699,16 +2580,17 @@ private void scanAllTypeImpl( scope Scan + + for( Thread t = Thread.sm_tbeg; t; t = t.next ) + { +- scan( ScanType.tls, t.m_tls.ptr, t.m_tls.ptr + t.m_tls.length ); +- + version( Windows ) + { + // Ideally, we'd pass ScanType.regs or something like that, but this + // would make portability annoying because it only makes sense on Windows. + scan( ScanType.stack, t.m_reg.ptr, t.m_reg.ptr + t.m_reg.length ); + } ++ version (GNU) ++ scan( ScanType.tls, t.m_tls.ptr, t.m_tls.ptr + t.m_tls.length ); + +- rt.tlsgc.scan(t.m_tlsgcdata, (p1, p2) => scan(ScanType.tls, p1, p2)); ++ if (t.m_tlsgcdata !is null) ++ rt.tlsgc.scan(t.m_tlsgcdata, (p1, p2) => scan(ScanType.tls, p1, p2)); + } + } + +@@ -2725,7 +2607,8 @@ in + } + body + { +- atomicStore(*cast(shared)&Thread.getThis().m_isInCriticalRegion, true); ++ synchronized (Thread.criticalRegionLock) ++ Thread.getThis().m_isInCriticalRegion = true; + } + + extern (C) void thread_exitCriticalRegion() +@@ -2735,7 +2618,8 @@ in + } + body + { +- atomicStore(*cast(shared)&Thread.getThis().m_isInCriticalRegion, false); ++ synchronized (Thread.criticalRegionLock) ++ Thread.getThis().m_isInCriticalRegion = false; + } + + extern (C) bool thread_inCriticalRegion() +@@ -2745,7 +2629,8 @@ in + } + body + { +- return atomicLoad(*cast(shared)&Thread.getThis().m_isInCriticalRegion); ++ synchronized (Thread.criticalRegionLock) ++ return Thread.getThis().m_isInCriticalRegion; + } + + unittest +@@ -2773,55 +2658,66 @@ unittest + // to cause a deadlock. + // NOTE: DO NOT USE LOCKS IN CRITICAL REGIONS IN NORMAL CODE. + +- import core.sync.condition; ++ import core.sync.semaphore; + +- bool critical; +- auto cond1 = new Condition(new Mutex()); ++ auto sema = new Semaphore(), ++ semb = new Semaphore(); + +- bool stop; +- auto cond2 = new Condition(new Mutex()); +- +- auto thr = new Thread(delegate void() ++ auto thr = new Thread( + { + thread_enterCriticalRegion(); +- + assert(thread_inCriticalRegion()); +- assert(atomicLoad(*cast(shared)&Thread.getThis().m_isInCriticalRegion)); +- +- synchronized (cond1.mutex) +- { +- critical = true; +- cond1.notify(); +- } +- +- synchronized (cond2.mutex) +- while (!stop) +- cond2.wait(); ++ sema.notify(); + ++ semb.wait(); + assert(thread_inCriticalRegion()); +- assert(atomicLoad(*cast(shared)&Thread.getThis().m_isInCriticalRegion)); + + thread_exitCriticalRegion(); ++ assert(!thread_inCriticalRegion()); ++ sema.notify(); + ++ semb.wait(); + assert(!thread_inCriticalRegion()); +- assert(!atomicLoad(*cast(shared)&Thread.getThis().m_isInCriticalRegion)); + }); + + thr.start(); + +- synchronized (cond1.mutex) +- while (!critical) +- cond1.wait(); ++ sema.wait(); ++ synchronized (Thread.criticalRegionLock) ++ assert(thr.m_isInCriticalRegion); ++ semb.notify(); ++ ++ sema.wait(); ++ synchronized (Thread.criticalRegionLock) ++ assert(!thr.m_isInCriticalRegion); ++ semb.notify(); ++ ++ thr.join(); ++} ++ ++unittest ++{ ++ import core.sync.semaphore; + +- assert(atomicLoad(*cast(shared)&thr.m_isInCriticalRegion)); ++ shared bool inCriticalRegion; ++ auto sem = new Semaphore(); + +- synchronized (cond2.mutex) ++ auto thr = new Thread( + { +- stop = true; +- cond2.notify(); +- } ++ thread_enterCriticalRegion(); ++ inCriticalRegion = true; ++ sem.notify(); ++ Thread.sleep(dur!"msecs"(1)); ++ inCriticalRegion = false; ++ thread_exitCriticalRegion(); ++ }); ++ thr.start(); + +- thr.join(); ++ sem.wait(); ++ assert(inCriticalRegion); ++ thread_suspendAll(); ++ assert(!inCriticalRegion); ++ thread_resumeAll(); + } + + /** +@@ -3151,6 +3047,13 @@ private + version = AsmExternal; + } + } ++ else version( PPC64 ) ++ { ++ version( Posix ) ++ { ++ version = AlignFiberStackTo16Byte; ++ } ++ } + else version( MIPS_O32 ) + { + version( Posix ) +@@ -3159,7 +3062,14 @@ private + version = AsmExternal; + } + } +- ++ else version( ARM ) ++ { ++ version( Posix ) ++ { ++ version = AsmARM_Posix; ++ version = AsmExternal; ++ } ++ } + + version( Posix ) + { +@@ -3244,7 +3154,7 @@ private + obj.switchOut(); + } + +- ++ // Look above the definition of 'class Fiber' for some information about the implementation of this routine + version( AsmExternal ) + extern (C) void fiber_switchContext( void** oldp, void* newp ); + else +@@ -3288,7 +3198,8 @@ private + pop EBP; + + // 'return' to complete switch +- ret; ++ pop ECX; ++ jmp ECX; + } + } + else version( AsmX86_64_Windows ) +@@ -3414,7 +3325,128 @@ private + /////////////////////////////////////////////////////////////////////////////// + // Fiber + /////////////////////////////////////////////////////////////////////////////// +- ++/* ++ * Documentation of Fiber internals: ++ * ++ * The main routines to implement when porting Fibers to new architectures are ++ * fiber_switchContext and initStack. Some version constants have to be defined ++ * for the new platform as well, search for "Fiber Platform Detection and Memory Allocation". ++ * These must be kept in sync with thread.di as well! You might also want to verify ++ * the Fiber size for the new platform in thread.d and thread.di. Search for ++ * "enum FiberSize" ++ * ++ * Fibers are based on a concept called 'Context'. A Context describes the execution ++ * state of a Fiber or main thread which is fully described by the stack, some ++ * registers and a return address at which the Fiber/Thread should continue executing. ++ * Please note that not only each Fiber has a Context, but each thread also has got a ++ * Context which describes the threads stack and state. If you call Fiber fib; fib.call ++ * the first time in a thread you switch from Threads Context into the Fibers Context. ++ * If you call fib.yield in that Fiber you switch out of the Fibers context and back ++ * into the Thread Context. (However, this is not always the case. You can call a Fiber ++ * from within another Fiber, then you switch Contexts between the Fibers and the Thread ++ * Context is not involved) ++ * ++ * In all current implementations the registers and the return address are actually ++ * saved on a Contexts stack. ++ * ++ * The fiber_switchContext routine has got two parameters: ++ * void** a: This is the _location_ where we have to store the current stack pointer, ++ * the stack pointer of the currently executing Context (Fiber or Thread). ++ * void* b: This is the pointer to the stack of the Context which we want to switch into. ++ * Note that we get the same pointer here as the one we stored into the void** a ++ * in a previous call to fiber_switchContext. ++ * ++ * In the simplest case, a fiber_switchContext rountine looks like this: ++ * fiber_switchContext: ++ * push {return Address} ++ * push {registers} ++ * copy {stack pointer} into {location pointed to by a} ++ * //We have now switch to the stack of a different Context! ++ * copy {b} into {stack pointer} ++ * pop {registers} ++ * pop {return Address} ++ * jump to {return Address} ++ * ++ * The GC uses the value returned in parameter a to scan the Fibers stack. It scans from ++ * the stack base to that value. As the GC dislikes false pointers we can actually optimize ++ * this a little: By storing registers which can not contain references to memory managed ++ * by the GC outside of the region marked by the stack base pointer and the stack pointer ++ * saved in fiber_switchContext we can prevent the GC from scanning them. ++ * Such registers are usually floating point registers and the return address. In order to ++ * implement this, we return a modified stack pointer from fiber_switchContext. However, ++ * we have to remember that when we restore the registers from the stack! ++ * ++ * --------------------------- <= Stack Base ++ * | Frame | <= Many other stack frames ++ * | Frame | ++ * |-------------------------| <= The last stack frame. This one is created by fiber_switchContext ++ * | registers with pointers | ++ * | | <= Stack pointer. GC stops scanning here ++ * | return address | ++ * |floating point registers | ++ * --------------------------- <= Real Stack End ++ * ++ * fiber_switchContext: ++ * push {registers with pointers} ++ * copy {stack pointer} into {location pointed to by a} ++ * push {return Address} ++ * push {Floating point registers} ++ * //We have now switch to the stack of a different Context! ++ * copy {b} into {stack pointer} ++ * //We now have to adjust the stack pointer to point to 'Real Stack End' so we can pop ++ * //the FP registers ++ * //+ or - depends on if your stack grows downwards or upwards ++ * {stack pointer} = {stack pointer} +- ({FPRegisters}.sizeof + {return address}.sizeof} ++ * pop {Floating point registers} ++ * pop {return Address} ++ * pop {registers with pointers} ++ * jump to {return Address} ++ * ++ * So the question now is which registers need to be saved? This depends on the specific ++ * architecture ABI of course, but here are some general guidelines: ++ * - If a register is callee-save (if the callee modifies the register it must saved and ++ * restored by the callee) it needs to be saved/restored in switchContext ++ * - If a register is caller-save it needn't be saved/restored. (Calling fiber_switchContext ++ * is a function call and the compiler therefore already must save these registers before ++ * calling fiber_switchContext) ++ * - Argument registers used for passing parameters to functions needn't be saved/restored ++ * - The return register needn't be saved/restored (fiber_switchContext hasn't got a return type) ++ * - All scratch registers needn't be saved/restored ++ * - The link register usually needn't be saved/restored (but sometimes it must be cleared - ++ * see below for details) ++ * - The frame pointer register - if it exists - is usually callee-save ++ * - All current implementations do not save control registers ++ * ++ * What happens on the first switch into a Fiber? We never saved a state for this fiber before, ++ * but the initial state is prepared in the initStack routine. (This routine will also be called ++ * when a Fiber is being resetted). initStack must produce exactly the same stack layout as the ++ * part of fiber_switchContext which saves the registers. Pay special attention to set the stack ++ * pointer correctly if you use the GC optimization mentioned before. the return Address saved in ++ * initStack must be the address of fiber_entrypoint. ++ * ++ * There's now a small but important difference between the first context switch into a fiber and ++ * further context switches. On the first switch, Fiber.call is used and the returnAddress in ++ * fiber_switchContext will point to fiber_entrypoint. The important thing here is that this jump ++ * is a _function call_, we call fiber_entrypoint by jumping before it's function prologue. On later ++ * calls, the user used yield() in a function, and therefore the return address points into a user ++ * function, after the yield call. So here the jump in fiber_switchContext is a _function return_, ++ * not a function call! ++ * ++ * The most important result of this is that on entering a function, i.e. fiber_entrypoint, we ++ * would have to provide a return address / set the link register once fiber_entrypoint ++ * returns. Now fiber_entrypoint does never return and therefore the actual value of the return ++ * address / link register is never read/used and therefore doesn't matter. When fiber_switchContext ++ * performs a _function return_ the value in the link register doesn't matter either. ++ * However, the link register will still be saved to the stack in fiber_entrypoint and some ++ * exception handling / stack unwinding code might read it from this stack location and crash. ++ * The exact solution depends on your architecture, but see the ARM implementation for a way ++ * to deal with this issue. ++ * ++ * The ARM implementation is meant to be used as a kind of documented example implementation. ++ * Look there for a concrete example. ++ * ++ * FIXME: fiber_entrypoint might benefit from a @noreturn attribute, but D doesn't have one. ++ */ + + /** + * This class provides a cooperative concurrency mechanism integrated with the +@@ -3428,6 +3460,18 @@ private + * executing. Like threads, a new fiber thread may be created using either + * derivation or composition, as in the following example. + * ++ * Warning: ++ * Status registers are not saved by the current implementations. This means ++ * floating point exception status bits (overflow, divide by 0), rounding mode ++ * and similar stuff is set per-thread, not per Fiber! ++ * ++ * Warning: ++ * On ARM FPU registers are not saved if druntime was compiled as ARM_SoftFloat. ++ * If such a build is used on a ARM_SoftFP system which actually has got a FPU ++ * and other libraries are using the FPU registers (other code is compiled ++ * as ARM_SoftFP) this can cause problems. Druntime must be compiled as ++ * ARM_SoftFP in this case. ++ * + * Example: + * ---------------------------------------------------------------------- + * +@@ -3611,15 +3655,12 @@ class Fiber + + + /** +- * Resets this fiber so that it may be re-used. This routine may only be +- * called for fibers that have terminated, as doing otherwise could result +- * in scope-dependent functionality that is not executed. Stack-based +- * classes, for example, may not be cleaned up properly if a fiber is reset +- * before it has terminated. +- * +- * Params: +- * fn = The fiber function. +- * dg = The fiber function. ++ * Resets this fiber so that it may be re-used, optionally with a ++ * new function/delegate. This routine may only be called for ++ * fibers that have terminated, as doing otherwise could result in ++ * scope-dependent functionality that is not executed. ++ * Stack-based classes, for example, may not be cleaned up ++ * properly if a fiber is reset before it has terminated. + * + * In: + * This fiber must be in state TERM. +@@ -3913,6 +3954,7 @@ private: + else + { + version (Posix) import core.sys.posix.sys.mman; // mmap ++ version (linux) import core.sys.linux.sys.mman : MAP_ANON; + + static if( __traits( compiles, mmap ) ) + { +@@ -4002,6 +4044,7 @@ private: + + // + // Initialize the allocated stack. ++ // Look above the definition of 'class Fiber' for some information about the implementation of this routine + // + final void initStack() + in +@@ -4223,6 +4266,38 @@ private: + pstack -= ABOVE; + *cast(size_t*)(pstack - SZ_RA) = cast(size_t)&fiber_entryPoint; + } ++ else version( AsmARM_Posix ) ++ { ++ /* We keep the FP registers and the return address below ++ * the stack pointer, so they don't get scanned by the ++ * GC. The last frame before swapping the stack pointer is ++ * organized like the following. ++ * ++ * | |-----------|<= 'frame starts here' ++ * | | fp | (the actual frame pointer, r11 isn't ++ * | | r10-r4 | updated and still points to the previous frame) ++ * | |-----------|<= stack pointer ++ * | | lr | ++ * | | 4byte pad | ++ * | | d15-d8 |(if FP supported) ++ * | |-----------| ++ * Y ++ * stack grows down: The pointer value here is smaller than some lines above ++ */ ++ // frame pointer can be zero, r10-r4 also zero initialized ++ version( StackGrowsDown ) ++ pstack -= int.sizeof * 8; ++ else ++ static assert(false, "Only full descending stacks supported on ARM"); ++ ++ // link register ++ push( cast(size_t) &fiber_entryPoint ); ++ /* ++ * We do not push padding and d15-d8 as those are zero initialized anyway ++ * Position the stack pointer above the lr register ++ */ ++ pstack += int.sizeof * 1; ++ } + else static if( __traits( compiles, ucontext_t ) ) + { + getcontext( &m_utxt ); +@@ -4354,7 +4429,12 @@ version (D_LP64) + else version (OSX) + static assert(__traits(classInstanceSize, Fiber) == 88); + else version (Posix) +- static assert(__traits(classInstanceSize, Fiber) == 88); ++ { ++ static if( __traits( compiles, ucontext_t ) ) ++ static assert(__traits(classInstanceSize, Fiber) == 88 + ucontext_t.sizeof + 8); ++ else ++ static assert(__traits(classInstanceSize, Fiber) == 88); ++ } + else + static assert(0, "Platform not supported."); + } +@@ -4367,7 +4447,20 @@ else + else version (OSX) + static assert(__traits(classInstanceSize, Fiber) == 44); + else version (Posix) +- static assert(__traits(classInstanceSize, Fiber) == 44); ++ { ++ static if( __traits( compiles, ucontext_t ) ) ++ { ++ // ucontext_t might have an alignment larger than 4. ++ static roundUp()(size_t n) ++ { ++ return (n + (ucontext_t.alignof - 1)) & ~(ucontext_t.alignof - 1); ++ } ++ static assert(__traits(classInstanceSize, Fiber) == ++ roundUp(roundUp(44) + ucontext_t.sizeof + 4)); ++ } ++ else ++ static assert(__traits(classInstanceSize, Fiber) == 44); ++ } + else + static assert(0, "Platform not supported."); + } +@@ -4581,6 +4674,86 @@ unittest + expect(fib, "delegate"); + } + ++ ++// stress testing GC stack scanning ++unittest ++{ ++ import core.memory; ++ ++ static void unreferencedThreadObject() ++ { ++ static void sleep() { Thread.sleep(dur!"msecs"(100)); } ++ auto thread = new Thread(&sleep); ++ thread.start(); ++ } ++ unreferencedThreadObject(); ++ GC.collect(); ++ ++ static class Foo ++ { ++ this(int value) ++ { ++ _value = value; ++ } ++ ++ int bar() ++ { ++ return _value; ++ } ++ ++ int _value; ++ } ++ ++ static void collect() ++ { ++ auto foo = new Foo(2); ++ assert(foo.bar() == 2); ++ GC.collect(); ++ Fiber.yield(); ++ GC.collect(); ++ assert(foo.bar() == 2); ++ } ++ ++ auto fiber = new Fiber(&collect); ++ ++ fiber.call(); ++ GC.collect(); ++ fiber.call(); ++ ++ // thread reference ++ auto foo = new Foo(2); ++ ++ void collect2() ++ { ++ assert(foo.bar() == 2); ++ GC.collect(); ++ Fiber.yield(); ++ GC.collect(); ++ assert(foo.bar() == 2); ++ } ++ ++ fiber = new Fiber(&collect2); ++ ++ fiber.call(); ++ GC.collect(); ++ fiber.call(); ++ ++ static void recurse(size_t cnt) ++ { ++ --cnt; ++ Fiber.yield(); ++ if (cnt) ++ { ++ auto fib = new Fiber(() { recurse(cnt); }); ++ fib.call(); ++ GC.collect(); ++ fib.call(); ++ } ++ } ++ fiber = new Fiber(() { recurse(20); }); ++ fiber.call(); ++} ++ + } + + version( AsmX86_64_Posix ) +@@ -4601,38 +4774,3 @@ version( AsmX86_64_Posix ) + fib.call(); + } + } +- +- +-version( OSX ) +-{ +- // NOTE: The Mach-O object file format does not allow for thread local +- // storage declarations. So instead we roll our own by putting tls +- // into the sections bracketed by _tls_beg and _tls_end. +- // +- // This function is called by the code emitted by the compiler. It +- // is expected to translate an address into the TLS static data to +- // the corresponding address in the TLS dynamic per-thread data. +- extern (D) void* ___tls_get_addr( void* p ) +- { +- // NOTE: p is an address in the TLS static data emitted by the +- // compiler. If it isn't, something is disastrously wrong. +- auto obj = Thread.getThis(); +- +- immutable off0 = cast(size_t)(p - _tls_data_array[0].ptr); +- if (off0 < _tls_data_array[0].length) +- { +- return obj.m_tls.ptr + off0; +- } +- immutable off1 = cast(size_t)(p - _tls_data_array[1].ptr); +- if (off1 < _tls_data_array[1].length) +- { +- size_t sz = (_tls_data_array[0].length + 15) & ~cast(size_t)15; +- return obj.m_tls.ptr + sz + off1; +- } +- else +- assert(0); +- +- //assert( p >= cast(void*) &_tls_beg && p < cast(void*) &_tls_end ); +- //return obj.m_tls.ptr + (p - cast(void*) &_tls_beg); +- } +-} +--- a/src/libphobos/libdruntime/core/thread.di 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/thread.di 2014-04-01 16:32:51.000000000 +0100 +@@ -53,8 +53,8 @@ else version (Windows) + */ + class ThreadException : Exception + { +- this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null); +- this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__); ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null); ++ @safe pure nothrow this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__); + } + + +@@ -63,8 +63,8 @@ class ThreadException : Exception + */ + class FiberException : Exception + { +- this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null); +- this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__); ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null); ++ @safe pure nothrow this(string msg, Throwable next, string file = __FILE__, size_t line = __LINE__); + } + + +@@ -263,13 +263,22 @@ class Thread + /** + * The maximum scheduling priority that may be set for a thread. On + * systems where multiple scheduling policies are defined, this value +- * represents the minimum valid priority for the scheduling policy of ++ * represents the maximum valid priority for the scheduling policy of + * the process. + */ + __gshared const int PRIORITY_MAX; + + + /** ++ * The default scheduling priority that is set for a thread. On ++ * systems where multiple scheduling policies are defined, this value ++ * represents the default priority for the scheduling policy of ++ * the process. ++ */ ++ __gshared const int PRIORITY_DEFAULT; ++ ++ ++ /** + * Gets the scheduling priority for the associated thread. + * + * Returns: +@@ -315,33 +324,6 @@ class Thread + + + /** +- * $(RED Deprecated. It will be removed in December 2012. Please use the +- * version which takes a $(D Duration) instead.) +- * +- * Suspends the calling thread for at least the supplied period. This may +- * result in multiple OS calls if period is greater than the maximum sleep +- * duration supported by the operating system. +- * +- * Params: +- * period = The minimum duration the calling thread should be suspended, +- * in 100 nanosecond intervals. +- * +- * In: +- * period must be non-negative. +- * +- * Example: +- * ------------------------------------------------------------------------ +- * +- * Thread.sleep( 500_000 ); // sleep for 50 milliseconds +- * Thread.sleep( 50_000_000 ); // sleep for 5 seconds +- * +- * ------------------------------------------------------------------------ +- */ +- deprecated("Please use the overload of sleep which takes a Duration.") +- static void sleep( long period ); +- +- +- /** + * Forces a context switch to occur away from the calling thread. + */ + static void yield(); +@@ -419,21 +401,42 @@ private: + } + + // These must be kept in sync with core/thread.d ++ version (GNU) ++ { ++ version (D_LP64) ++ { ++ version (Windows) enum ThreadSize = 312; ++ else version (OSX) enum ThreadSize = 320; ++ else version (Solaris) enum ThreadSize = 176; ++ else version (Posix) enum ThreadSize = 184; ++ else static assert(0, "Platform not supported."); ++ } ++ else ++ { ++ static assert((void*).sizeof == 4); // 32-bit ++ ++ version (Windows) enum ThreadSize = 128; ++ else version (OSX) enum ThreadSize = 128; ++ else version (Posix) enum ThreadSize = 92; ++ else static assert(0, "Platform not supported."); ++ } ++ } ++ else + version (D_LP64) + { +- version (Windows) enum ThreadSize = 312; +- else version (OSX) enum ThreadSize = 320; +- else version (Solaris) enum ThreadSize = 176; +- else version (Posix) enum ThreadSize = 184; ++ version (Windows) enum ThreadSize = 296; ++ else version (OSX) enum ThreadSize = 304; ++ else version (Solaris) enum ThreadSize = 160; ++ else version (Posix) enum ThreadSize = 168; + else static assert(0, "Platform not supported."); + } + else + { + static assert((void*).sizeof == 4); // 32-bit + +- version (Windows) enum ThreadSize = 128; +- else version (OSX) enum ThreadSize = 128; +- else version (Posix) enum ThreadSize = 92; ++ version (Windows) enum ThreadSize = 120; ++ else version (OSX) enum ThreadSize = 120; ++ else version (Posix) enum ThreadSize = 84; + else static assert(0, "Platform not supported."); + } + +@@ -455,6 +458,13 @@ extern (C) void thread_init(); + + + /** ++ * Terminates the thread module. No other thread routine may be called ++ * afterwards. ++ */ ++extern (C) void thread_term(); ++ ++ ++/** + * + */ + extern (C) bool thread_isMainThread(); +@@ -598,12 +608,10 @@ extern (C) void thread_scanAllType( scop + extern (C) void thread_scanAll( scope ScanAllThreadsFn scan ); + + +-/* ++/** + * Signals that the code following this call is a critical region. Any code in + * this region must finish running before the calling thread can be suspended +- * by a call to thread_suspendAll. If the world is stopped while the calling +- * thread is in a critical region, it will be continually suspended and resumed +- * until it is outside a critical region. ++ * by a call to thread_suspendAll. + * + * This function is, in particular, meant to help maintain garbage collector + * invariants when a lock is not used. +@@ -611,10 +619,9 @@ extern (C) void thread_scanAll( scope Sc + * A critical region is exited with thread_exitCriticalRegion. + * + * $(RED Warning): +- * Using critical regions is extremely error-prone. For instance, using a lock +- * inside a critical region will most likely result in an application deadlocking +- * because the stop-the-world routine will attempt to suspend and resume the thread +- * forever, to no avail. ++ * Using critical regions is extremely error-prone. For instance, using locks ++ * inside a critical region can easily result in a deadlock when another thread ++ * holding the lock already got suspended. + * + * The term and concept of a 'critical region' comes from + * $(LINK2 https://github.com/mono/mono/blob/521f4a198e442573c400835ef19bbb36b60b0ebb/mono/metadata/sgen-gc.h#L925 Mono's SGen garbage collector). +@@ -625,7 +632,7 @@ extern (C) void thread_scanAll( scope Sc + extern (C) void thread_enterCriticalRegion(); + + +-/* ++/** + * Signals that the calling thread is no longer in a critical region. Following + * a call to this function, the thread can once again be suspended. + * +@@ -635,7 +642,7 @@ extern (C) void thread_enterCriticalRegi + extern (C) void thread_exitCriticalRegion(); + + +-/* ++/** + * Returns true if the current thread is in a critical region; otherwise, false. + * + * In: +@@ -798,6 +805,55 @@ private: + // Fiber Platform Detection and Memory Allocation + /////////////////////////////////////////////////////////////////////////////// + ++private ++{ ++ // These must be kept in sync with core/thread.d ++ version( D_InlineAsm_X86 ) ++ { ++ version( Windows ) ++ version = NoUcontext; ++ else version( Posix ) ++ version = NoUcontext; ++ } ++ else version( D_InlineAsm_X86_64 ) ++ { ++ version( Windows ) ++ version = NoUcontext; ++ else version( Posix ) ++ version = NoUcontext; ++ } ++ else version( PPC ) ++ { ++ version( Posix ) ++ version = NoUcontext; ++ } ++ else version( PPC64 ) ++ { ++ version( Posix ) ++ { ++ // uses ucontext_t. ++ } ++ } ++ else version( MIPS_O32 ) ++ { ++ version( Posix ) ++ version = NoUcontext; ++ } ++ else version( ARM ) ++ { ++ version( Posix ) ++ version = NoUcontext; ++ } ++ ++ version( Posix ) ++ { ++ version( NoUcontext ) {} else ++ { ++ import core.sys.posix.ucontext; ++ } ++ } ++} ++ + private extern __gshared const size_t PAGESIZE; + + shared static this(); +@@ -807,7 +863,6 @@ shared static this(); + // Fiber + /////////////////////////////////////////////////////////////////////////////// + +- + /** + * This class provides a cooperative concurrency mechanism integrated with the + * threading and garbage collection functionality. Calling a fiber may be +@@ -928,15 +983,12 @@ class Fiber + + + /** +- * Resets this fiber so that it may be re-used. This routine may only be +- * called for fibers that have terminated, as doing otherwise could result +- * in scope-dependent functionality that is not executed. Stack-based +- * classes, for example, may not be cleaned up properly if a fiber is reset +- * before it has terminated. +- * +- * Params: +- * fn = The fiber function. +- * dg = The fiber function. ++ * Resets this fiber so that it may be re-used, optionally with a ++ * new function/delegate. This routine may only be called for ++ * fibers that have terminated, as doing otherwise could result in ++ * scope-dependent functionality that is not executed. ++ * Stack-based classes, for example, may not be cleaned up ++ * properly if a fiber is reset before it has terminated. + * + * In: + * This fiber must be in state TERM. +@@ -1029,13 +1081,18 @@ class Fiber + } + + private: +- + // These must be kept in sync with core/thread.d + version (D_LP64) + { + version (Windows) enum FiberSize = 88; + else version (OSX) enum FiberSize = 88; +- else version (Posix) enum FiberSize = 88; ++ else version (Posix) ++ { ++ static if( __traits( compiles, ucontext_t ) ) ++ enum FiberSize = 88 + ucontext_t.sizeof + 8; ++ else ++ enum FiberSize = 88; ++ } + else static assert(0, "Platform not supported."); + } + else +@@ -1044,7 +1101,20 @@ private: + + version (Windows) enum FiberSize = 44; + else version (OSX) enum FiberSize = 44; +- else version (Posix) enum FiberSize = 44; ++ else version (Posix) ++ { ++ static if( __traits( compiles, ucontext_t ) ) ++ { ++ // ucontext_t might have an alignment larger than 4. ++ static roundUp()(size_t n) ++ { ++ return (n + (ucontext_t.alignof - 1)) & ~(ucontext_t.alignof - 1); ++ } ++ enum FiberSize = roundUp(roundUp(44) + ucontext_t.sizeof + 4); ++ } ++ else ++ enum FiberSize = 44; ++ } + else static assert(0, "Platform not supported."); + } + +--- a/src/libphobos/libdruntime/core/time.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/core/time.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1390,15 +1390,15 @@ Duration dur(string units)(long length) + return Duration(convert!(units, "hnsecs")(length)); + } + +-alias dur!"weeks" weeks; /// Ditto +-alias dur!"days" days; /// Ditto +-alias dur!"hours" hours; /// Ditto +-alias dur!"minutes" minutes; /// Ditto +-alias dur!"seconds" seconds; /// Ditto +-alias dur!"msecs" msecs; /// Ditto +-alias dur!"usecs" usecs; /// Ditto +-alias dur!"hnsecs" hnsecs; /// Ditto +-alias dur!"nsecs" nsecs; /// Ditto ++alias weeks = dur!"weeks"; /// Ditto ++alias days = dur!"days"; /// Ditto ++alias hours = dur!"hours"; /// Ditto ++alias minutes = dur!"minutes"; /// Ditto ++alias seconds = dur!"seconds"; /// Ditto ++alias msecs = dur!"msecs"; /// Ditto ++alias usecs = dur!"usecs"; /// Ditto ++alias hnsecs = dur!"hnsecs"; /// Ditto ++alias nsecs = dur!"nsecs"; /// Ditto + + //Verify Examples. + unittest +@@ -1698,11 +1698,11 @@ struct TickDuration + { + foreach(T; _TypeTuple!(TickDuration, const TickDuration, immutable TickDuration)) + { +- assertApprox((cast(T)TickDuration).from!units(1000).to!(units, long)(), ++ assertApprox((cast(T)TickDuration.from!units(1000)).to!(units, long)(), + 500, 1500, units); +- assertApprox((cast(T)TickDuration).from!units(1_000_000).to!(units, long)(), ++ assertApprox((cast(T)TickDuration.from!units(1_000_000)).to!(units, long)(), + 900_000, 1_100_000, units); +- assertApprox((cast(T)TickDuration).from!units(2_000_000).to!(units, long)(), ++ assertApprox((cast(T)TickDuration.from!units(2_000_000)).to!(units, long)(), + 1_900_000, 2_100_000, units); + } + } +@@ -2179,9 +2179,9 @@ struct TickDuration + of days in a month or year). + + Params: +- tuFrom = The units of time to covert from. +- tuFrom = The units of time to covert type. +- value = The value to convert. ++ from = The units of time to convert from. ++ to = The units of time to convert to. ++ value = The value to convert. + + Examples: + -------------------- +@@ -2946,7 +2946,7 @@ class TimeException : Exception + line = The line number where the exception occurred. + next = The previous exception in the chain of exceptions, if any. + +/ +- nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) ++ @safe pure nothrow this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + super(msg, file, line, next); + } +--- a/src/libphobos/libdruntime/__entrypoint.di 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/__entrypoint.di 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,71 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* This module provides the C main() function supplied by the user's program. */ ++ ++module __entrypoint; ++ ++extern(C): ++ ++/* The memory between the addresses of _tlsstart and _tlsend is the storage for ++ thread-local data in D 2.0. Both of these rely on the default linker script ++ of: ++ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } ++ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } ++ to group the sections in that order. ++ ++ Sadly, this does not work because ld orders .tdata after .tdata.*, despite ++ what the linker script says. ++*/ ++ ++size_t _tlsstart = 3; ++size_t _tlsend = void; ++ ++ ++/* The D main() function supplied by the user's program ++ ++ It always has `_Dmain` symbol name and uses C calling convention. ++ But D frontend returns its type as `extern(D)` because of Issue 9028. ++ As we need to deal with actual calling convention we have to mark it ++ as `extern(C)` and use its symbol name. ++*/ ++ ++int _Dmain(char[][] args); ++int _d_run_main(int argc, char **argv, void* mainFunc); ++ ++/* Substitutes for the C main() function. Just calls into d_run_main with ++ the default main function. Applications are free to implement their own ++ main function and call the _d_run_main function themselves with any main ++ function. ++*/ ++ ++int main(int argc, char **argv) ++{ ++ return _d_run_main(argc, argv, &_Dmain); ++} ++ ++/* This is apparently needed on Solaris because the C tool chain seems to ++ expect the main function to be called _main. It needs both not just one! ++*/ ++ ++version (Solaris) ++int _main(int argc, char** argv) ++{ ++ return main(argc, argv); ++} ++ +--- a/src/libphobos/libdruntime/etc/linux/memoryerror.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/etc/linux/memoryerror.d 2014-04-01 16:32:51.000000000 +0100 +@@ -14,7 +14,15 @@ + + module etc.linux.memoryerror; + +-version (linux): ++version (linux) ++{ ++ version (X86) ++ version = MemoryErrorSupported; ++ version (X86_64) ++ version = MemoryErrorSupported; ++} ++ ++version (MemoryErrorSupported): + @system: + + import core.sys.posix.signal; +--- a/src/libphobos/libdruntime/gc/bits.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/bits.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,233 @@ ++/** ++ * Contains a bitfield used by the GC. ++ * ++ * Copyright: Copyright Digital Mars 2005 - 2013. ++ * License: Boost License 1.0. ++ * Authors: Walter Bright, David Friedman, Sean Kelly ++ */ ++ ++/* Copyright Digital Mars 2005 - 2013. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module gc.bits; ++ ++ ++import core.bitop; ++import core.stdc.string; ++import core.stdc.stdlib; ++ ++ ++private extern (C) void onOutOfMemoryError(); ++ ++ ++version (DigitalMars) ++{ ++ version = bitops; ++} ++else version (GNU) ++{ ++ // use the unoptimized version ++} ++else version (D_InlineAsm_X86) ++{ ++ version = Asm86; ++} ++ ++struct GCBits ++{ ++ alias size_t wordtype; ++ ++ enum BITS_PER_WORD = (wordtype.sizeof * 8); ++ enum BITS_SHIFT = (wordtype.sizeof == 8 ? 6 : 5); ++ enum BITS_MASK = (BITS_PER_WORD - 1); ++ enum BITS_1 = cast(wordtype)1; ++ ++ wordtype* data = null; ++ size_t nwords = 0; // allocated words in data[] excluding sentinals ++ size_t nbits = 0; // number of bits in data[] excluding sentinals ++ ++ void Dtor() ++ { ++ if (data) ++ { ++ free(data); ++ data = null; ++ } ++ } ++ ++ invariant() ++ { ++ if (data) ++ { ++ assert(nwords * data[0].sizeof * 8 >= nbits); ++ } ++ } ++ ++ void alloc(size_t nbits) ++ { ++ this.nbits = nbits; ++ nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; ++ data = cast(typeof(data[0])*)calloc(nwords + 2, data[0].sizeof); ++ if (!data) ++ onOutOfMemoryError(); ++ } ++ ++ wordtype test(size_t i) ++ in ++ { ++ assert(i < nbits); ++ } ++ body ++ { ++ version (none) ++ { ++ return core.bitop.bt(data + 1, i); // this is actually slower! don't use ++ } ++ else ++ { ++ //return (cast(bit *)(data + 1))[i]; ++ return data[1 + (i >> BITS_SHIFT)] & (BITS_1 << (i & BITS_MASK)); ++ } ++ } ++ ++ void set(size_t i) ++ in ++ { ++ assert(i < nbits); ++ } ++ body ++ { ++ //(cast(bit *)(data + 1))[i] = 1; ++ data[1 + (i >> BITS_SHIFT)] |= (BITS_1 << (i & BITS_MASK)); ++ } ++ ++ void clear(size_t i) ++ in ++ { ++ assert(i < nbits); ++ } ++ body ++ { ++ //(cast(bit *)(data + 1))[i] = 0; ++ data[1 + (i >> BITS_SHIFT)] &= ~(BITS_1 << (i & BITS_MASK)); ++ } ++ ++ wordtype testClear(size_t i) ++ { ++ version (bitops) ++ { ++ return core.bitop.btr(data + 1, i); // this is faster! ++ } ++ else version (Asm86) ++ { ++ asm ++ { ++ naked ; ++ mov EAX,data[EAX] ; ++ mov ECX,i-4[ESP] ; ++ btr 4[EAX],ECX ; ++ sbb EAX,EAX ; ++ ret 4 ; ++ } ++ } ++ else ++ { ++ //result = (cast(bit *)(data + 1))[i]; ++ //(cast(bit *)(data + 1))[i] = 0; ++ ++ auto p = &data[1 + (i >> BITS_SHIFT)]; ++ auto mask = (BITS_1 << (i & BITS_MASK)); ++ auto result = *p & mask; ++ *p &= ~mask; ++ return result; ++ } ++ } ++ ++ wordtype testSet(size_t i) ++ { ++ version (bitops) ++ { ++ return core.bitop.bts(data + 1, i); // this is faster! ++ } ++ else version (Asm86) ++ { ++ asm ++ { ++ naked ; ++ mov EAX,data[EAX] ; ++ mov ECX,i-4[ESP] ; ++ bts 4[EAX],ECX ; ++ sbb EAX,EAX ; ++ ret 4 ; ++ } ++ } ++ else ++ { ++ //result = (cast(bit *)(data + 1))[i]; ++ //(cast(bit *)(data + 1))[i] = 0; ++ ++ auto p = &data[1 + (i >> BITS_SHIFT)]; ++ auto mask = (BITS_1 << (i & BITS_MASK)); ++ auto result = *p & mask; ++ *p |= mask; ++ return result; ++ } ++ } ++ ++ void zero() ++ { ++ memset(data + 1, 0, nwords * wordtype.sizeof); ++ } ++ ++ void copy(GCBits *f) ++ in ++ { ++ assert(nwords == f.nwords); ++ } ++ body ++ { ++ memcpy(data + 1, f.data + 1, nwords * wordtype.sizeof); ++ } ++ ++ wordtype* base() ++ in ++ { ++ assert(data); ++ } ++ body ++ { ++ return data + 1; ++ } ++} ++ ++unittest ++{ ++ GCBits b; ++ ++ b.alloc(786); ++ assert(b.test(123) == 0); ++ assert(b.testClear(123) == 0); ++ b.set(123); ++ assert(b.test(123) != 0); ++ assert(b.testClear(123) != 0); ++ assert(b.test(123) == 0); ++ ++ b.set(785); ++ b.set(0); ++ assert(b.test(785) != 0); ++ assert(b.test(0) != 0); ++ b.zero(); ++ assert(b.test(785) == 0); ++ assert(b.test(0) == 0); ++ ++ GCBits b2; ++ b2.alloc(786); ++ b2.set(38); ++ b.copy(&b2); ++ assert(b.test(38) != 0); ++ b2.Dtor(); ++ ++ b.Dtor(); ++} +--- a/src/libphobos/libdruntime/gc/gcalloc.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/gcalloc.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,202 +0,0 @@ +-/** +- * Contains OS-level allocation routines. +- * +- * Copyright: Copyright Digital Mars 2005 - 2009. +- * License: Boost License 1.0. +- * Authors: Walter Bright, David Friedman, Sean Kelly +- */ +- +-/* Copyright Digital Mars 2005 - 2009. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module gc.gcalloc; +- +- +-version (Windows) +-{ +- private import core.sys.windows.windows; +- +- alias int pthread_t; +- +- pthread_t pthread_self() +- { +- return cast(pthread_t) GetCurrentThreadId(); +- } +- +- //version = GC_Use_Alloc_Win32; +-} +-else version (Posix) +-{ +- private import core.sys.posix.sys.mman; +- private import core.stdc.stdlib; +- +- //version = GC_Use_Alloc_MMap; +-} +-else +-{ +- private import core.stdc.stdlib; +- +- //version = GC_Use_Alloc_Malloc; +-} +- +-/+ +-static if(is(typeof(VirtualAlloc))) +- version = GC_Use_Alloc_Win32; +-else static if (is(typeof(mmap))) +- version = GC_Use_Alloc_MMap; +-else static if (is(typeof(valloc))) +- version = GC_Use_Alloc_Valloc; +-else static if (is(typeof(malloc))) +- version = GC_Use_Alloc_Malloc; +-else static assert(false, "No supported allocation methods available."); +-+/ +- +-static if (is(typeof(VirtualAlloc))) // version (GC_Use_Alloc_Win32) +-{ +- /** +- * Map memory. +- */ +- void *os_mem_map(size_t nbytes) +- { +- return VirtualAlloc(null, nbytes, MEM_RESERVE, PAGE_READWRITE); +- } +- +- +- /** +- * Commit memory. +- * Returns: +- * 0 success +- * !=0 failure +- */ +- int os_mem_commit(void *base, size_t offset, size_t nbytes) +- { void *p; +- +- p = VirtualAlloc(base + offset, nbytes, MEM_COMMIT, PAGE_READWRITE); +- return cast(int)(p is null); +- } +- +- +- /** +- * Decommit memory. +- * Returns: +- * 0 success +- * !=0 failure +- */ +- int os_mem_decommit(void *base, size_t offset, size_t nbytes) +- { +- return cast(int)(VirtualFree(base + offset, nbytes, MEM_DECOMMIT) == 0); +- } +- +- +- /** +- * Unmap memory allocated with os_mem_map(). +- * Memory must have already been decommitted. +- * Returns: +- * 0 success +- * !=0 failure +- */ +- int os_mem_unmap(void *base, size_t nbytes) +- { +- return cast(int)(VirtualFree(base, 0, MEM_RELEASE) == 0); +- } +-} +-else static if (is(typeof(mmap))) // else version (GC_Use_Alloc_MMap) +-{ +- void *os_mem_map(size_t nbytes) +- { void *p; +- +- p = mmap(null, nbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); +- return (p == MAP_FAILED) ? null : p; +- } +- +- +- int os_mem_commit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_decommit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_unmap(void *base, size_t nbytes) +- { +- return munmap(base, nbytes); +- } +-} +-else static if (is(typeof(valloc))) // else version (GC_Use_Alloc_Valloc) +-{ +- void *os_mem_map(size_t nbytes) +- { +- return valloc(nbytes); +- } +- +- +- int os_mem_commit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_decommit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_unmap(void *base, size_t nbytes) +- { +- free(base); +- return 0; +- } +-} +-else static if (is(typeof(malloc))) // else version (GC_Use_Alloc_Malloc) +-{ +- // NOTE: This assumes malloc granularity is at least (void*).sizeof. If +- // (req_size + PAGESIZE) is allocated, and the pointer is rounded up +- // to PAGESIZE alignment, there will be space for a void* at the end +- // after PAGESIZE bytes used by the GC. +- +- +- private import gc.gcx; +- +- +- const size_t PAGE_MASK = PAGESIZE - 1; +- +- +- void *os_mem_map(size_t nbytes) +- { byte *p, q; +- p = cast(byte *) malloc(nbytes + PAGESIZE); +- q = p + ((PAGESIZE - ((cast(size_t) p & PAGE_MASK))) & PAGE_MASK); +- * cast(void**)(q + nbytes) = p; +- return q; +- } +- +- +- int os_mem_commit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_decommit(void *base, size_t offset, size_t nbytes) +- { +- return 0; +- } +- +- +- int os_mem_unmap(void *base, size_t nbytes) +- { +- free( *cast(void**)( cast(byte*) base + nbytes ) ); +- return 0; +- } +-} +-else +-{ +- static assert(false, "No supported allocation methods available."); +-} +--- a/src/libphobos/libdruntime/gc/gcbits.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/gcbits.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,234 +0,0 @@ +-/** +- * Contains a bitfield used by the GC. +- * +- * Copyright: Copyright Digital Mars 2005 - 2009. +- * License: Boost License 1.0. +- * Authors: Walter Bright, David Friedman, Sean Kelly +- */ +- +-/* Copyright Digital Mars 2005 - 2009. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module gc.gcbits; +- +- +-private +-{ +- import core.bitop; +- import core.stdc.string; +- import core.stdc.stdlib; +- extern (C) void onOutOfMemoryError(); +-} +- +- +-version (DigitalMars) +-{ +- version = bitops; +-} +-else version (GNU) +-{ +- // use the unoptimized version +-} +-else version (D_InlineAsm_X86) +-{ +- version = Asm86; +-} +- +-struct GCBits +-{ +- alias size_t wordtype; +- +- enum BITS_PER_WORD = (wordtype.sizeof * 8); +- enum BITS_SHIFT = (wordtype.sizeof == 8 ? 6 : 5); +- enum BITS_MASK = (BITS_PER_WORD - 1); +- enum BITS_1 = cast(wordtype)1; +- +- wordtype* data = null; +- size_t nwords = 0; // allocated words in data[] excluding sentinals +- size_t nbits = 0; // number of bits in data[] excluding sentinals +- +- void Dtor() +- { +- if (data) +- { +- free(data); +- data = null; +- } +- } +- +- invariant() +- { +- if (data) +- { +- assert(nwords * data[0].sizeof * 8 >= nbits); +- } +- } +- +- void alloc(size_t nbits) +- { +- this.nbits = nbits; +- nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; +- data = cast(typeof(data[0])*)calloc(nwords + 2, data[0].sizeof); +- if (!data) +- onOutOfMemoryError(); +- } +- +- wordtype test(size_t i) +- in +- { +- assert(i < nbits); +- } +- body +- { +- version (none) +- { +- return core.bitop.bt(data + 1, i); // this is actually slower! don't use +- } +- else +- { +- //return (cast(bit *)(data + 1))[i]; +- return data[1 + (i >> BITS_SHIFT)] & (BITS_1 << (i & BITS_MASK)); +- } +- } +- +- void set(size_t i) +- in +- { +- assert(i < nbits); +- } +- body +- { +- //(cast(bit *)(data + 1))[i] = 1; +- data[1 + (i >> BITS_SHIFT)] |= (BITS_1 << (i & BITS_MASK)); +- } +- +- void clear(size_t i) +- in +- { +- assert(i < nbits); +- } +- body +- { +- //(cast(bit *)(data + 1))[i] = 0; +- data[1 + (i >> BITS_SHIFT)] &= ~(BITS_1 << (i & BITS_MASK)); +- } +- +- wordtype testClear(size_t i) +- { +- version (bitops) +- { +- return core.bitop.btr(data + 1, i); // this is faster! +- } +- else version (Asm86) +- { +- asm +- { +- naked ; +- mov EAX,data[EAX] ; +- mov ECX,i-4[ESP] ; +- btr 4[EAX],ECX ; +- sbb EAX,EAX ; +- ret 4 ; +- } +- } +- else +- { +- //result = (cast(bit *)(data + 1))[i]; +- //(cast(bit *)(data + 1))[i] = 0; +- +- auto p = &data[1 + (i >> BITS_SHIFT)]; +- auto mask = (BITS_1 << (i & BITS_MASK)); +- auto result = *p & mask; +- *p &= ~mask; +- return result; +- } +- } +- +- wordtype testSet(size_t i) +- { +- version (bitops) +- { +- return core.bitop.bts(data + 1, i); // this is faster! +- } +- else version (Asm86) +- { +- asm +- { +- naked ; +- mov EAX,data[EAX] ; +- mov ECX,i-4[ESP] ; +- bts 4[EAX],ECX ; +- sbb EAX,EAX ; +- ret 4 ; +- } +- } +- else +- { +- //result = (cast(bit *)(data + 1))[i]; +- //(cast(bit *)(data + 1))[i] = 0; +- +- auto p = &data[1 + (i >> BITS_SHIFT)]; +- auto mask = (BITS_1 << (i & BITS_MASK)); +- auto result = *p & mask; +- *p |= mask; +- return result; +- } +- } +- +- void zero() +- { +- memset(data + 1, 0, nwords * wordtype.sizeof); +- } +- +- void copy(GCBits *f) +- in +- { +- assert(nwords == f.nwords); +- } +- body +- { +- memcpy(data + 1, f.data + 1, nwords * wordtype.sizeof); +- } +- +- wordtype* base() +- in +- { +- assert(data); +- } +- body +- { +- return data + 1; +- } +-} +- +-unittest +-{ +- GCBits b; +- +- b.alloc(786); +- assert(b.test(123) == 0); +- assert(b.testClear(123) == 0); +- b.set(123); +- assert(b.test(123) != 0); +- assert(b.testClear(123) != 0); +- assert(b.test(123) == 0); +- +- b.set(785); +- b.set(0); +- assert(b.test(785) != 0); +- assert(b.test(0) != 0); +- b.zero(); +- assert(b.test(785) == 0); +- assert(b.test(0) == 0); +- +- GCBits b2; +- b2.alloc(786); +- b2.set(38); +- b.copy(&b2); +- assert(b.test(38) != 0); +- b2.Dtor(); +- +- b.Dtor(); +-} +--- a/src/libphobos/libdruntime/gc/gc.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/gc.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,335 +1,3338 @@ + /** +- * Contains the external GC interface. ++ * Contains the garbage collector implementation. + * +- * Copyright: Copyright Digital Mars 2005 - 2009. ++ * Copyright: Copyright Digital Mars 2001 - 2013. + * License: Boost License 1.0. +- * Authors: Walter Bright, Sean Kelly ++ * Authors: Walter Bright, David Friedman, Sean Kelly + */ + +-/* Copyright Digital Mars 2005 - 2009. ++/* Copyright Digital Mars 2005 - 2013. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ + module gc.gc; + ++// D Programming Language Garbage Collector implementation ++ ++/************** Debugging ***************************/ ++ ++//debug = PRINTF; // turn on printf's ++//debug = COLLECT_PRINTF; // turn on printf's ++//debug = LOGGING; // log allocations / frees ++//debug = MEMSTOMP; // stomp on memory ++//debug = SENTINEL; // add underrun/overrrun protection ++//debug = PTRCHECK; // more pointer checking ++//debug = PTRCHECK2; // thorough but slow pointer checking ++//debug = PROFILING; // measure performance of various steps. ++ ++/*************** Configuration *********************/ ++ ++version = STACKGROWSDOWN; // growing the stack means subtracting from the stack pointer ++ // (use for Intel X86 CPUs) ++ // else growing the stack means adding to the stack pointer ++ ++/***************************************************/ ++ ++import gc.bits; ++import gc.stats; ++import gc.os; ++ ++import cstdlib = core.stdc.stdlib : calloc, free, malloc, realloc; ++import core.stdc.string; ++import core.bitop; ++import core.sync.mutex; ++static import core.memory; ++private alias BlkAttr = core.memory.GC.BlkAttr; ++ ++version (GNU) import gcc.builtins; ++ ++debug (PRINTF) import core.stdc.stdio : printf; ++debug (COLLECT_PRINTF) import core.stdc.stdio : printf; ++debug private import core.stdc.stdio; ++ ++debug(PRINTF) void printFreeInfo(Pool* pool) ++{ ++ uint nReallyFree; ++ foreach(i; 0..pool.npages) { ++ if(pool.pagetable[i] >= B_FREE) nReallyFree++; ++ } ++ ++ printf("Pool %p: %d really free, %d supposedly free\n", pool, nReallyFree, pool.freepages); ++} ++ ++debug(PROFILING) ++{ ++ // Track total time spent preparing for GC, ++ // marking, sweeping and recovering pages. ++ import core.stdc.stdio, core.stdc.time; ++ __gshared long prepTime; ++ __gshared long markTime; ++ __gshared long sweepTime; ++ __gshared long recoverTime; ++} ++ + private + { +- import gc.gcx; +- import gc.gcstats; +- import core.stdc.stdlib; ++ enum USE_CACHE = true; + +- version = GCCLASS; ++ // The maximum number of recursions of mark() before transitioning to ++ // multiple heap traversals to avoid consuming O(D) stack space where ++ // D is the depth of the heap graph. ++ enum MAX_MARK_RECURSIONS = 64; ++} ++ struct BlkInfo ++ { ++ void* base; ++ size_t size; ++ uint attr; ++ } ++private ++{ ++ extern (C) void rt_finalize2(void* p, bool det, bool resetMemory); + +- version( GCCLASS ) +- alias GC gc_t; +- else +- alias GC* gc_t; ++ extern (C) void thread_suspendAll(); ++ extern (C) void thread_resumeAll(); + +- __gshared gc_t _gc; ++ // core.thread ++ enum IsMarked : int ++ { ++ no, ++ yes, ++ unknown, // memory is not managed by GC ++ } ++ alias IsMarked delegate(void*) IsMarkedDg; ++ extern (C) void thread_processGCMarks(scope IsMarkedDg isMarked); + +- extern (C) void thread_init(); ++ alias void delegate(void*, void*) scanFn; ++ extern (C) void thread_scanAll(scope scanFn fn); + +- struct Proxy ++ extern (C) void onOutOfMemoryError(); ++ extern (C) void onInvalidMemoryOperationError(); ++ ++ enum + { +- extern (C) void function() gc_enable; +- extern (C) void function() gc_disable; +- extern (C) void function() gc_collect; +- extern (C) void function() gc_minimize; ++ OPFAIL = ~cast(size_t)0 ++ } ++} ++ ++ ++alias GC gc_t; + +- extern (C) uint function(void*) gc_getAttr; +- extern (C) uint function(void*, uint) gc_setAttr; +- extern (C) uint function(void*, uint) gc_clrAttr; + +- extern (C) void* function(size_t, uint) gc_malloc; +- extern (C) BlkInfo function(size_t, uint) gc_qalloc; +- extern (C) void* function(size_t, uint) gc_calloc; +- extern (C) void* function(void*, size_t, uint ba) gc_realloc; +- extern (C) size_t function(void*, size_t, size_t) gc_extend; +- extern (C) size_t function(size_t) gc_reserve; +- extern (C) void function(void*) gc_free; ++/* ======================= Leak Detector =========================== */ + +- extern (C) void* function(void*) gc_addrOf; +- extern (C) size_t function(void*) gc_sizeOf; + +- extern (C) BlkInfo function(void*) gc_query; ++debug (LOGGING) ++{ ++ struct Log ++ { ++ void* p; ++ size_t size; ++ size_t line; ++ char* file; ++ void* parent; ++ ++ void print() ++ { ++ printf(" p = %p, size = %zd, parent = %p ", p, size, parent); ++ if (file) ++ { ++ printf("%s(%u)", file, line); ++ } ++ printf("\n"); ++ } ++ } + +- extern (C) void function(void*) gc_addRoot; +- extern (C) void function(void*, size_t) gc_addRange; + +- extern (C) void function(void*) gc_removeRoot; +- extern (C) void function(void*) gc_removeRange; ++ struct LogArray ++ { ++ size_t dim; ++ size_t allocdim; ++ Log *data; ++ ++ void Dtor() ++ { ++ if (data) ++ cstdlib.free(data); ++ data = null; ++ } ++ ++ void reserve(size_t nentries) ++ { ++ assert(dim <= allocdim); ++ if (allocdim - dim < nentries) ++ { ++ allocdim = (dim + nentries) * 2; ++ assert(dim + nentries <= allocdim); ++ if (!data) ++ { ++ data = cast(Log*)cstdlib.malloc(allocdim * Log.sizeof); ++ if (!data && allocdim) ++ onOutOfMemoryError(); ++ } ++ else ++ { Log *newdata; ++ ++ newdata = cast(Log*)cstdlib.malloc(allocdim * Log.sizeof); ++ if (!newdata && allocdim) ++ onOutOfMemoryError(); ++ memcpy(newdata, data, dim * Log.sizeof); ++ cstdlib.free(data); ++ data = newdata; ++ } ++ } ++ } ++ ++ ++ void push(Log log) ++ { ++ reserve(1); ++ data[dim++] = log; ++ } ++ ++ void remove(size_t i) ++ { ++ memmove(data + i, data + i + 1, (dim - i) * Log.sizeof); ++ dim--; ++ } ++ ++ ++ size_t find(void *p) ++ { ++ for (size_t i = 0; i < dim; i++) ++ { ++ if (data[i].p == p) ++ return i; ++ } ++ return OPFAIL; // not found ++ } ++ ++ ++ void copy(LogArray *from) ++ { ++ reserve(from.dim - dim); ++ assert(from.dim <= allocdim); ++ memcpy(data, from.data, from.dim * Log.sizeof); ++ dim = from.dim; ++ } + } ++} ++ ++ ++/* ============================ GC =============================== */ ++ + +- __gshared Proxy pthis; +- __gshared Proxy* proxy; ++const uint GCVERSION = 1; // increment every time we change interface ++ // to GC. + +- void initProxy() ++// This just makes Mutex final to de-virtualize member function calls. ++final class GCMutex : Mutex {} ++ ++class GC ++{ ++ // For passing to debug code (not thread safe) ++ __gshared size_t line; ++ __gshared char* file; ++ ++ uint gcversion = GCVERSION; ++ ++ Gcx *gcx; // implementation ++ ++ // We can't allocate a Mutex on the GC heap because we are the GC. ++ // Store it in the static data segment instead. ++ __gshared GCMutex gcLock; // global lock ++ __gshared byte[__traits(classInstanceSize, GCMutex)] mutexStorage; ++ ++ void initialize() + { +- pthis.gc_enable = &gc_enable; +- pthis.gc_disable = &gc_disable; +- pthis.gc_collect = &gc_collect; +- pthis.gc_minimize = &gc_minimize; ++ mutexStorage[] = GCMutex.classinfo.init[]; ++ gcLock = cast(GCMutex) mutexStorage.ptr; ++ gcLock.__ctor(); ++ gcx = cast(Gcx*)cstdlib.calloc(1, Gcx.sizeof); ++ if (!gcx) ++ onOutOfMemoryError(); ++ gcx.initialize(); ++ } + +- pthis.gc_getAttr = &gc_getAttr; +- pthis.gc_setAttr = &gc_setAttr; +- pthis.gc_clrAttr = &gc_clrAttr; + +- pthis.gc_malloc = &gc_malloc; +- pthis.gc_qalloc = &gc_qalloc; +- pthis.gc_calloc = &gc_calloc; +- pthis.gc_realloc = &gc_realloc; +- pthis.gc_extend = &gc_extend; +- pthis.gc_reserve = &gc_reserve; +- pthis.gc_free = &gc_free; ++ void Dtor() ++ { ++ version (linux) ++ { ++ //debug(PRINTF) printf("Thread %x ", pthread_self()); ++ //debug(PRINTF) printf("GC.Dtor()\n"); ++ } ++ ++ if (gcx) ++ { ++ gcx.Dtor(); ++ cstdlib.free(gcx); ++ gcx = null; ++ } ++ } + +- pthis.gc_addrOf = &gc_addrOf; +- pthis.gc_sizeOf = &gc_sizeOf; + +- pthis.gc_query = &gc_query; ++ /** ++ * ++ */ ++ void enable() ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ assert(gcx.disabled > 0); ++ gcx.disabled--; ++ } + +- pthis.gc_addRoot = &gc_addRoot; +- pthis.gc_addRange = &gc_addRange; + +- pthis.gc_removeRoot = &gc_removeRoot; +- pthis.gc_removeRange = &gc_removeRange; ++ /** ++ * ++ */ ++ void disable() ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.disabled++; + } +-} + +-extern (C) void gc_init() +-{ +- version (GCCLASS) +- { void* p; +- ClassInfo ci = GC.classinfo; + +- p = malloc(ci.init.length); +- (cast(byte*)p)[0 .. ci.init.length] = ci.init[]; +- _gc = cast(GC)p; ++ /** ++ * ++ */ ++ uint getAttr(void* p) ++ { ++ if (!p) ++ { ++ return 0; ++ } ++ ++ uint go() ++ { ++ Pool* pool = gcx.findPool(p); ++ uint oldb = 0; ++ ++ if (pool) ++ { ++ auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ oldb = gcx.getBits(pool, biti); ++ } ++ return oldb; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return go(); + } +- else ++ ++ ++ /** ++ * ++ */ ++ uint setAttr(void* p, uint mask) + { +- _gc = cast(GC*) calloc(1, GC.sizeof); ++ if (!p) ++ { ++ return 0; ++ } ++ ++ uint go() ++ { ++ Pool* pool = gcx.findPool(p); ++ uint oldb = 0; ++ ++ if (pool) ++ { ++ auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ oldb = gcx.getBits(pool, biti); ++ gcx.setBits(pool, biti, mask); ++ } ++ return oldb; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return go(); + } +- _gc.initialize(); +- // NOTE: The GC must initialize the thread library +- // before its first collection. +- thread_init(); +- initProxy(); +-} + +-extern (C) void gc_term() +-{ +- // NOTE: There may be daemons threads still running when this routine is +- // called. If so, cleaning memory out from under then is a good +- // way to make them crash horribly. This probably doesn't matter +- // much since the app is supposed to be shutting down anyway, but +- // I'm disabling cleanup for now until I can think about it some +- // more. ++ ++ /** ++ * ++ */ ++ uint clrAttr(void* p, uint mask) ++ { ++ if (!p) ++ { ++ return 0; ++ } ++ ++ uint go() ++ { ++ Pool* pool = gcx.findPool(p); ++ uint oldb = 0; ++ ++ if (pool) ++ { ++ auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ oldb = gcx.getBits(pool, biti); ++ gcx.clrBits(pool, biti, mask); ++ } ++ return oldb; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return go(); ++ } ++ ++ ++ /** ++ * ++ */ ++ void *malloc(size_t size, uint bits = 0, size_t *alloc_size = null) ++ { ++ if (!size) ++ { ++ if(alloc_size) ++ *alloc_size = 0; ++ return null; ++ } ++ ++ void* p = void; ++ size_t localAllocSize = void; ++ if(alloc_size is null) alloc_size = &localAllocSize; ++ ++ // Since a finalizer could launch a new thread, we always need to lock ++ // when collecting. The safest way to do this is to simply always lock ++ // when allocating. ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ p = mallocNoSync(size, bits, alloc_size); ++ } ++ ++ if (!(bits & BlkAttr.NO_SCAN)) ++ { ++ memset(p + size, 0, *alloc_size - size); ++ } ++ ++ return p; ++ } ++ ++ ++ // + // +- // NOTE: Due to popular demand, this has been re-enabled. It still has +- // the problems mentioned above though, so I guess we'll see. +- _gc.fullCollectNoStack(); // not really a 'collect all' -- still scans +- // static data area, roots, and ranges. +- _gc.Dtor(); ++ // ++ private void *mallocNoSync(size_t size, uint bits = 0, size_t *alloc_size = null) ++ { ++ assert(size != 0); + +- free(cast(void*)_gc); +- _gc = null; +-} ++ void *p = null; ++ Bins bin; + +-extern (C) void gc_enable() +-{ +- if( proxy is null ) +- return _gc.enable(); +- return proxy.gc_enable(); +-} ++ //debug(PRINTF) printf("GC::malloc(size = %d, gcx = %p)\n", size, gcx); ++ assert(gcx); ++ //debug(PRINTF) printf("gcx.self = %x, pthread_self() = %x\n", gcx.self, pthread_self()); ++ ++ if (gcx.running) ++ onInvalidMemoryOperationError(); ++ ++ size += SENTINEL_EXTRA; ++ bin = gcx.findBin(size); ++ Pool *pool; ++ ++ if (bin < B_PAGE) ++ { ++ if(alloc_size) ++ *alloc_size = binsize[bin]; ++ int state = gcx.disabled ? 1 : 0; ++ bool collected = false; ++ ++ while (!gcx.bucket[bin] && !gcx.allocPage(bin)) ++ { ++ switch (state) ++ { ++ case 0: ++ auto freedpages = gcx.fullcollect(); ++ collected = true; ++ if (freedpages < gcx.npools * ((POOLSIZE / PAGESIZE) / 8)) ++ { /* Didn't free much, so try allocating more anyway. ++ * Note: freedpages is not the amount of memory freed, it's the amount ++ * of full pages freed. Perhaps this should instead be the amount of ++ * memory freed. ++ */ ++ gcx.newPool(1,false); ++ state = 2; ++ } ++ else ++ state = 1; ++ continue; ++ case 1: ++ gcx.newPool(1, false); ++ state = 2; ++ continue; ++ case 2: ++ if (collected) ++ onOutOfMemoryError(); ++ state = 0; ++ continue; ++ default: ++ assert(false); ++ } ++ } ++ p = gcx.bucket[bin]; ++ ++ // Return next item from free list ++ gcx.bucket[bin] = (cast(List*)p).next; ++ pool = (cast(List*)p).pool; ++ //debug(PRINTF) printf("\tmalloc => %p\n", p); ++ debug (MEMSTOMP) memset(p, 0xF0, size); ++ } ++ else ++ { ++ p = gcx.bigAlloc(size, &pool, alloc_size); ++ if (!p) ++ onOutOfMemoryError(); ++ } ++ size -= SENTINEL_EXTRA; ++ p = sentinel_add(p); ++ sentinel_init(p, size); ++ gcx.log_malloc(p, size); ++ ++ if (bits) ++ { ++ gcx.setBits(pool, cast(size_t)(p - pool.baseAddr) >> pool.shiftBy, bits); ++ } ++ return p; ++ } + +-extern (C) void gc_disable() +-{ +- if( proxy is null ) +- return _gc.disable(); +- return proxy.gc_disable(); +-} + +-extern (C) void gc_collect() +-{ +- if( proxy is null ) ++ /** ++ * ++ */ ++ void *calloc(size_t size, uint bits = 0, size_t *alloc_size = null) + { +- _gc.fullCollect(); +- return; ++ if (!size) ++ { ++ if(alloc_size) ++ *alloc_size = 0; ++ return null; ++ } ++ ++ size_t localAllocSize = void; ++ void* p = void; ++ if(alloc_size is null) alloc_size = &localAllocSize; ++ ++ // Since a finalizer could launch a new thread, we always need to lock ++ // when collecting. The safest way to do this is to simply always lock ++ // when allocating. ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ p = mallocNoSync(size, bits, alloc_size); ++ } ++ ++ memset(p, 0, size); ++ if (!(bits & BlkAttr.NO_SCAN)) ++ { ++ memset(p + size, 0, *alloc_size - size); ++ } ++ ++ return p; + } +- return proxy.gc_collect(); +-} + +-extern (C) void gc_minimize() +-{ +- if( proxy is null ) +- return _gc.minimize(); +- return proxy.gc_minimize(); +-} ++ /** ++ * ++ */ ++ void *realloc(void *p, size_t size, uint bits = 0, size_t *alloc_size = null) ++ { ++ size_t localAllocSize = void; ++ auto oldp = p; ++ if(alloc_size is null) alloc_size = &localAllocSize; ++ ++ // Since a finalizer could launch a new thread, we always need to lock ++ // when collecting. The safest way to do this is to simply always lock ++ // when allocating. ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ p = reallocNoSync(p, size, bits, alloc_size); ++ } ++ ++ if (p !is oldp && !(bits & BlkAttr.NO_SCAN)) ++ { ++ memset(p + size, 0, *alloc_size - size); ++ } + +-extern (C) uint gc_getAttr( void* p ) +-{ +- if( proxy is null ) +- return _gc.getAttr( p ); +- return proxy.gc_getAttr( p ); +-} ++ return p; ++ } + +-extern (C) uint gc_setAttr( void* p, uint a ) +-{ +- if( proxy is null ) +- return _gc.setAttr( p, a ); +- return proxy.gc_setAttr( p, a ); +-} + +-extern (C) uint gc_clrAttr( void* p, uint a ) +-{ +- if( proxy is null ) +- return _gc.clrAttr( p, a ); +- return proxy.gc_clrAttr( p, a ); +-} ++ // ++ // ++ // ++ private void *reallocNoSync(void *p, size_t size, uint bits = 0, size_t *alloc_size = null) ++ { ++ if (gcx.running) ++ onInvalidMemoryOperationError(); + +-extern (C) void* gc_malloc( size_t sz, uint ba = 0 ) +-{ +- if( proxy is null ) +- return _gc.malloc( sz, ba ); +- return proxy.gc_malloc( sz, ba ); +-} ++ if (!size) ++ { if (p) ++ { freeNoSync(p); ++ p = null; ++ } ++ if(alloc_size) ++ *alloc_size = 0; ++ } ++ else if (!p) ++ { ++ p = mallocNoSync(size, bits, alloc_size); ++ } ++ else ++ { void *p2; ++ size_t psize; ++ ++ //debug(PRINTF) printf("GC::realloc(p = %p, size = %zu)\n", p, size); ++ version (SENTINEL) ++ { ++ sentinel_Invariant(p); ++ psize = *sentinel_size(p); ++ if (psize != size) ++ { ++ if (psize) ++ { ++ Pool *pool = gcx.findPool(p); ++ ++ if (pool) ++ { ++ auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ if (bits) ++ { ++ gcx.clrBits(pool, biti, ~BlkAttr.NONE); ++ gcx.setBits(pool, biti, bits); ++ } ++ else ++ { ++ bits = gcx.getBits(pool, biti); ++ } ++ } ++ } ++ p2 = mallocNoSync(size, bits, alloc_size); ++ if (psize < size) ++ size = psize; ++ //debug(PRINTF) printf("\tcopying %d bytes\n",size); ++ memcpy(p2, p, size); ++ p = p2; ++ } ++ } ++ else ++ { ++ psize = gcx.findSize(p); // find allocated size ++ if (psize >= PAGESIZE && size >= PAGESIZE) ++ { ++ auto psz = psize / PAGESIZE; ++ auto newsz = (size + PAGESIZE - 1) / PAGESIZE; ++ if (newsz == psz) ++ return p; ++ ++ auto pool = gcx.findPool(p); ++ auto pagenum = (p - pool.baseAddr) / PAGESIZE; ++ ++ if (newsz < psz) ++ { // Shrink in place ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ debug (MEMSTOMP) memset(p + size, 0xF2, psize - size); ++ pool.freePages(pagenum + newsz, psz - newsz); ++ pool.updateOffsets(pagenum); ++ } ++ if(alloc_size) ++ *alloc_size = newsz * PAGESIZE; ++ gcx.updateCaches(p, newsz * PAGESIZE); ++ return p; ++ } ++ else if (pagenum + newsz <= pool.npages) ++ { ++ // Attempt to expand in place ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ ++ foreach (binsz; pool.pagetable[pagenum + psz .. pagenum + newsz]) ++ if (binsz != B_FREE) goto Lno; ++ ++ debug (MEMSTOMP) memset(p + psize, 0xF0, size - psize); ++ debug(PRINTF) printFreeInfo(pool); ++ memset(&pool.pagetable[pagenum + psz], B_PAGEPLUS, newsz - psz); ++ pool.updateOffsets(pagenum); ++ if(alloc_size) ++ *alloc_size = newsz * PAGESIZE; ++ pool.freepages -= (newsz - psz); ++ debug(PRINTF) printFreeInfo(pool); ++ gcx.updateCaches(p, newsz * PAGESIZE); ++ return p; ++ ++ Lno: ++ {} ++ } ++ } ++ if (psize < size || // if new size is bigger ++ psize > size * 2) // or less than half ++ { ++ if (psize) ++ { ++ Pool *pool = gcx.findPool(p); ++ ++ if (pool) ++ { ++ auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ if (bits) ++ { ++ gcx.clrBits(pool, biti, ~BlkAttr.NONE); ++ gcx.setBits(pool, biti, bits); ++ } ++ else ++ { ++ bits = gcx.getBits(pool, biti); ++ } ++ } ++ } ++ p2 = mallocNoSync(size, bits, alloc_size); ++ if (psize < size) ++ size = psize; ++ //debug(PRINTF) printf("\tcopying %d bytes\n",size); ++ memcpy(p2, p, size); ++ p = p2; ++ } ++ else if(alloc_size) ++ *alloc_size = psize; ++ } ++ } ++ return p; ++ } + +-extern (C) BlkInfo gc_qalloc( size_t sz, uint ba = 0 ) +-{ +- if( proxy is null ) ++ ++ /** ++ * Attempt to in-place enlarge the memory block pointed to by p by at least ++ * minbytes beyond its current capacity, up to a maximum of maxsize. This ++ * does not attempt to move the memory block (like realloc() does). ++ * ++ * Returns: ++ * 0 if could not extend p, ++ * total size of entire memory block if successful. ++ */ ++ size_t extend(void* p, size_t minsize, size_t maxsize) + { +- BlkInfo retval; +- retval.base = _gc.malloc( sz, ba, &retval.size ); +- retval.attr = ba; +- return retval; ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return extendNoSync(p, minsize, maxsize); + } +- return proxy.gc_qalloc( sz, ba ); +-} + +-extern (C) void* gc_calloc( size_t sz, uint ba = 0 ) +-{ +- if( proxy is null ) +- return _gc.calloc( sz, ba ); +- return proxy.gc_calloc( sz, ba ); +-} + +-extern (C) void* gc_realloc( void* p, size_t sz, uint ba = 0 ) +-{ +- if( proxy is null ) +- return _gc.realloc( p, sz, ba ); +- return proxy.gc_realloc( p, sz, ba ); +-} ++ // ++ // ++ // ++ private size_t extendNoSync(void* p, size_t minsize, size_t maxsize) ++ in ++ { ++ assert(minsize <= maxsize); ++ } ++ body ++ { ++ if (gcx.running) ++ onInvalidMemoryOperationError(); + +-extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ) +-{ +- if( proxy is null ) +- return _gc.extend( p, mx, sz ); +- return proxy.gc_extend( p, mx, sz ); +-} ++ //debug(PRINTF) printf("GC::extend(p = %p, minsize = %zu, maxsize = %zu)\n", p, minsize, maxsize); ++ version (SENTINEL) ++ { ++ return 0; ++ } ++ auto psize = gcx.findSize(p); // find allocated size ++ if (psize < PAGESIZE) ++ return 0; // cannot extend buckets ++ ++ auto psz = psize / PAGESIZE; ++ auto minsz = (minsize + PAGESIZE - 1) / PAGESIZE; ++ auto maxsz = (maxsize + PAGESIZE - 1) / PAGESIZE; ++ ++ auto pool = gcx.findPool(p); ++ auto pagenum = (p - pool.baseAddr) / PAGESIZE; ++ ++ size_t sz; ++ for (sz = 0; sz < maxsz; sz++) ++ { ++ auto i = pagenum + psz + sz; ++ if (i == pool.npages) ++ break; ++ if (pool.pagetable[i] != B_FREE) ++ { if (sz < minsz) ++ return 0; ++ break; ++ } ++ } ++ if (sz < minsz) ++ return 0; ++ debug (MEMSTOMP) memset(p + psize, 0xF0, (psz + sz) * PAGESIZE - psize); ++ memset(pool.pagetable + pagenum + psz, B_PAGEPLUS, sz); ++ pool.updateOffsets(pagenum); ++ pool.freepages -= sz; ++ gcx.updateCaches(p, (psz + sz) * PAGESIZE); ++ return (psz + sz) * PAGESIZE; ++ } + +-extern (C) size_t gc_reserve( size_t sz ) +-{ +- if( proxy is null ) +- return _gc.reserve( sz ); +- return proxy.gc_reserve( sz ); ++ ++ /** ++ * ++ */ ++ size_t reserve(size_t size) ++ { ++ if (!size) ++ { ++ return 0; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return reserveNoSync(size); ++ } ++ ++ ++ // ++ // ++ // ++ private size_t reserveNoSync(size_t size) ++ { ++ assert(size != 0); ++ assert(gcx); ++ ++ if (gcx.running) ++ onInvalidMemoryOperationError(); ++ ++ return gcx.reserve(size); ++ } ++ ++ ++ /** ++ * ++ */ ++ void free(void *p) ++ { ++ if (!p) ++ { ++ return; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return freeNoSync(p); ++ } ++ ++ ++ // ++ // ++ // ++ private void freeNoSync(void *p) ++ { ++ debug(PRINTF) printf("Freeing %p\n", cast(size_t) p); ++ assert (p); ++ ++ if (gcx.running) ++ onInvalidMemoryOperationError(); ++ ++ Pool* pool; ++ size_t pagenum; ++ Bins bin; ++ size_t biti; ++ ++ // Find which page it is in ++ pool = gcx.findPool(p); ++ if (!pool) // if not one of ours ++ return; // ignore ++ sentinel_Invariant(p); ++ p = sentinel_sub(p); ++ pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; ++ ++ debug(PRINTF) printf("pool base = %p, PAGENUM = %d of %d, bin = %d\n", pool.baseAddr, pagenum, pool.npages, pool.pagetable[pagenum]); ++ debug(PRINTF) if(pool.isLargeObject) printf("Block size = %d\n", pool.bPageOffsets[pagenum]); ++ biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; ++ ++ gcx.clrBits(pool, biti, ~BlkAttr.NONE); ++ ++ bin = cast(Bins)pool.pagetable[pagenum]; ++ if (bin == B_PAGE) // if large alloc ++ { size_t npages; ++ ++ // Free pages ++ npages = pool.bPageOffsets[pagenum]; ++ debug (MEMSTOMP) memset(p, 0xF2, npages * PAGESIZE); ++ pool.freePages(pagenum, npages); ++ } ++ else ++ { // Add to free list ++ List *list = cast(List*)p; ++ ++ debug (MEMSTOMP) memset(p, 0xF2, binsize[bin]); ++ ++ list.next = gcx.bucket[bin]; ++ list.pool = pool; ++ gcx.bucket[bin] = list; ++ } ++ gcx.log_free(sentinel_add(p)); ++ } ++ ++ ++ /** ++ * Determine the base address of the block containing p. If p is not a gc ++ * allocated pointer, return null. ++ */ ++ void* addrOf(void *p) ++ { ++ if (!p) ++ { ++ return null; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return addrOfNoSync(p); ++ } ++ ++ ++ // ++ // ++ // ++ void* addrOfNoSync(void *p) ++ { ++ if (!p) ++ { ++ return null; ++ } ++ ++ return gcx.findBase(p); ++ } ++ ++ ++ /** ++ * Determine the allocated size of pointer p. If p is an interior pointer ++ * or not a gc allocated pointer, return 0. ++ */ ++ size_t sizeOf(void *p) ++ { ++ if (!p) ++ { ++ return 0; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return sizeOfNoSync(p); ++ } ++ ++ ++ // ++ // ++ // ++ private size_t sizeOfNoSync(void *p) ++ { ++ assert (p); ++ ++ version (SENTINEL) ++ { ++ p = sentinel_sub(p); ++ size_t size = gcx.findSize(p); ++ ++ // Check for interior pointer ++ // This depends on: ++ // 1) size is a power of 2 for less than PAGESIZE values ++ // 2) base of memory pool is aligned on PAGESIZE boundary ++ if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) ++ size = 0; ++ return size ? size - SENTINEL_EXTRA : 0; ++ } ++ else ++ { ++ size_t size = gcx.findSize(p); ++ ++ // Check for interior pointer ++ // This depends on: ++ // 1) size is a power of 2 for less than PAGESIZE values ++ // 2) base of memory pool is aligned on PAGESIZE boundary ++ if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) ++ return 0; ++ return size; ++ } ++ } ++ ++ ++ /** ++ * Determine the base address of the block containing p. If p is not a gc ++ * allocated pointer, return null. ++ */ ++ BlkInfo query(void *p) ++ { ++ if (!p) ++ { ++ BlkInfo i; ++ return i; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return queryNoSync(p); ++ } ++ ++ ++ // ++ // ++ // ++ BlkInfo queryNoSync(void *p) ++ { ++ assert(p); ++ ++ return gcx.getInfo(p); ++ } ++ ++ ++ /** ++ * Verify that pointer p: ++ * 1) belongs to this memory pool ++ * 2) points to the start of an allocated piece of memory ++ * 3) is not on a free list ++ */ ++ void check(void *p) ++ { ++ if (!p) ++ { ++ return; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ checkNoSync(p); ++ } ++ ++ ++ // ++ // ++ // ++ private void checkNoSync(void *p) ++ { ++ assert(p); ++ ++ sentinel_Invariant(p); ++ debug (PTRCHECK) ++ { ++ Pool* pool; ++ size_t pagenum; ++ Bins bin; ++ size_t size; ++ ++ p = sentinel_sub(p); ++ pool = gcx.findPool(p); ++ assert(pool); ++ pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; ++ bin = cast(Bins)pool.pagetable[pagenum]; ++ assert(bin <= B_PAGE); ++ size = binsize[bin]; ++ assert((cast(size_t)p & (size - 1)) == 0); ++ ++ debug (PTRCHECK2) ++ { ++ if (bin < B_PAGE) ++ { ++ // Check that p is not on a free list ++ List *list; ++ ++ for (list = gcx.bucket[bin]; list; list = list.next) ++ { ++ assert(cast(void*)list != p); ++ } ++ } ++ } ++ } ++ } ++ ++ ++ /** ++ * add p to list of roots ++ */ ++ void addRoot(void *p) ++ { ++ if (!p) ++ { ++ return; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.addRoot(p); ++ } ++ ++ ++ /** ++ * remove p from list of roots ++ */ ++ void removeRoot(void *p) ++ { ++ if (!p) ++ { ++ return; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.removeRoot(p); ++ } ++ ++ ++ /** ++ * ++ */ ++ @property int delegate(int delegate(ref void*)) rootIter() ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return &gcx.rootIter; ++ } ++ ++ ++ /** ++ * add range to scan for roots ++ */ ++ void addRange(void *p, size_t sz) ++ { ++ if (!p || !sz) ++ { ++ return; ++ } ++ ++ //debug(PRINTF) printf("+GC.addRange(p = %p, sz = 0x%zx), p + sz = %p\n", p, sz, p + sz); ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.addRange(p, p + sz); ++ ++ //debug(PRINTF) printf("-GC.addRange()\n"); ++ } ++ ++ ++ /** ++ * remove range ++ */ ++ void removeRange(void *p) ++ { ++ if (!p) ++ { ++ return; ++ } ++ ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.removeRange(p); ++ } ++ ++ ++ /** ++ * ++ */ ++ @property int delegate(int delegate(ref Range)) rangeIter() ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ return &gcx.rangeIter; ++ } ++ ++ ++ /** ++ * Do full garbage collection. ++ * Return number of pages free'd. ++ */ ++ size_t fullCollect() ++ { ++ debug(PRINTF) printf("GC.fullCollect()\n"); ++ size_t result; ++ ++ // Since a finalizer could launch a new thread, we always need to lock ++ // when collecting. ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ result = gcx.fullcollect(); ++ } ++ ++ version (none) ++ { ++ GCStats stats; ++ ++ getStats(stats); ++ debug(PRINTF) printf("poolsize = %zx, usedsize = %zx, freelistsize = %zx\n", ++ stats.poolsize, stats.usedsize, stats.freelistsize); ++ } ++ ++ gcx.log_collect(); ++ return result; ++ } ++ ++ ++ /** ++ * do full garbage collection ignoring roots ++ */ ++ void fullCollectNoStack() ++ { ++ // Since a finalizer could launch a new thread, we always need to lock ++ // when collecting. ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.noStack++; ++ gcx.fullcollect(); ++ gcx.noStack--; ++ } ++ } ++ ++ ++ /** ++ * minimize free space usage ++ */ ++ void minimize() ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ gcx.minimize(); ++ } ++ ++ ++ /** ++ * Retrieve statistics about garbage collection. ++ * Useful for debugging and tuning. ++ */ ++ void getStats(out GCStats stats) ++ { ++ gcLock.lock(); ++ scope(exit) gcLock.unlock(); ++ getStatsNoSync(stats); ++ } ++ ++ ++ // ++ // ++ // ++ private void getStatsNoSync(out GCStats stats) ++ { ++ size_t psize = 0; ++ size_t usize = 0; ++ size_t flsize = 0; ++ ++ size_t n; ++ size_t bsize = 0; ++ ++ //debug(PRINTF) printf("getStats()\n"); ++ memset(&stats, 0, GCStats.sizeof); ++ ++ for (n = 0; n < gcx.npools; n++) ++ { Pool *pool = gcx.pooltable[n]; ++ ++ psize += pool.npages * PAGESIZE; ++ for (size_t j = 0; j < pool.npages; j++) ++ { ++ Bins bin = cast(Bins)pool.pagetable[j]; ++ if (bin == B_FREE) ++ stats.freeblocks++; ++ else if (bin == B_PAGE) ++ stats.pageblocks++; ++ else if (bin < B_PAGE) ++ bsize += PAGESIZE; ++ } ++ } ++ ++ for (n = 0; n < B_PAGE; n++) ++ { ++ //debug(PRINTF) printf("bin %d\n", n); ++ for (List *list = gcx.bucket[n]; list; list = list.next) ++ { ++ //debug(PRINTF) printf("\tlist %p\n", list); ++ flsize += binsize[n]; ++ } ++ } ++ ++ usize = bsize - flsize; ++ ++ stats.poolsize = psize; ++ stats.usedsize = bsize - flsize; ++ stats.freelistsize = flsize; ++ } + } + +-extern (C) void gc_free( void* p ) +-{ +- if( proxy is null ) +- return _gc.free( p ); +- return proxy.gc_free( p ); ++ ++/* ============================ Gcx =============================== */ ++ ++enum ++{ PAGESIZE = 4096, ++ POOLSIZE = (4096*256), + } + +-extern (C) void* gc_addrOf( void* p ) ++ ++enum + { +- if( proxy is null ) +- return _gc.addrOf( p ); +- return proxy.gc_addrOf( p ); ++ B_16, ++ B_32, ++ B_64, ++ B_128, ++ B_256, ++ B_512, ++ B_1024, ++ B_2048, ++ B_PAGE, // start of large alloc ++ B_PAGEPLUS, // continuation of large alloc ++ B_FREE, // free page ++ B_MAX + } + +-extern (C) size_t gc_sizeOf( void* p ) ++ ++alias ubyte Bins; ++ ++ ++struct List + { +- if( proxy is null ) +- return _gc.sizeOf( p ); +- return proxy.gc_sizeOf( p ); ++ List *next; ++ Pool *pool; + } + +-extern (C) BlkInfo gc_query( void* p ) ++ ++struct Range + { +- if( proxy is null ) +- return _gc.query( p ); +- return proxy.gc_query( p ); ++ void *pbot; ++ void *ptop; + } + +-// NOTE: This routine is experimental. The stats or function name may change +-// before it is made officially available. +-extern (C) GCStats gc_stats() ++ ++immutable uint binsize[B_MAX] = [ 16,32,64,128,256,512,1024,2048,4096 ]; ++immutable size_t notbinsize[B_MAX] = [ ~(16-1),~(32-1),~(64-1),~(128-1),~(256-1), ++ ~(512-1),~(1024-1),~(2048-1),~(4096-1) ]; ++ ++/* ============================ Gcx =============================== */ ++ ++struct Gcx + { +- if( proxy is null ) ++ void *cached_size_key; ++ size_t cached_size_val; ++ ++ void *cached_info_key; ++ BlkInfo cached_info_val; ++ ++ size_t nroots; ++ size_t rootdim; ++ void **roots; ++ ++ size_t nranges; ++ size_t rangedim; ++ Range *ranges; ++ ++ uint noStack; // !=0 means don't scan stack ++ uint log; // turn on logging ++ uint anychanges; ++ uint inited; ++ uint running; ++ int disabled; // turn off collections if >0 ++ ++ byte *minAddr; // min(baseAddr) ++ byte *maxAddr; // max(topAddr) ++ ++ size_t npools; ++ Pool **pooltable; ++ ++ List *bucket[B_MAX]; // free list for each size ++ ++ ++ void initialize() ++ { int dummy; ++ ++ (cast(byte*)&this)[0 .. Gcx.sizeof] = 0; ++ log_init(); ++ //printf("gcx = %p, self = %x\n", &this, self); ++ inited = 1; ++ } ++ ++ ++ void Dtor() + { +- GCStats stats = void; +- _gc.getStats( stats ); +- return stats; ++ debug(PROFILING) ++ { ++ printf("\tTotal GC prep time: %d milliseconds\n", ++ prepTime * 1000 / CLOCKS_PER_SEC); ++ printf("\tTotal mark time: %d milliseconds\n", ++ markTime * 1000 / CLOCKS_PER_SEC); ++ printf("\tTotal sweep time: %d milliseconds\n", ++ sweepTime * 1000 / CLOCKS_PER_SEC); ++ printf("\tTotal page recovery time: %d milliseconds\n", ++ recoverTime * 1000 / CLOCKS_PER_SEC); ++ printf("\tGrand total GC time: %d milliseconds\n", ++ 1000 * (recoverTime + sweepTime + markTime + prepTime) ++ / CLOCKS_PER_SEC); ++ } ++ ++ inited = 0; ++ ++ for (size_t i = 0; i < npools; i++) ++ { Pool *pool = pooltable[i]; ++ ++ pool.Dtor(); ++ cstdlib.free(pool); ++ } ++ if (pooltable) ++ { ++ cstdlib.free(pooltable); ++ pooltable = null; ++ } ++ ++ if (roots) ++ cstdlib.free(roots); ++ ++ if (ranges) ++ cstdlib.free(ranges); + } +- // TODO: Add proxy support for this once the layout of GCStats is +- // finalized. +- //return proxy.gc_stats(); +- return GCStats.init; +-} + +-extern (C) void gc_addRoot( void* p ) +-{ +- if( proxy is null ) +- return _gc.addRoot( p ); +- return proxy.gc_addRoot( p ); +-} + +-extern (C) void gc_addRange( void* p, size_t sz ) +-{ +- if( proxy is null ) +- return _gc.addRange( p, sz ); +- return proxy.gc_addRange( p, sz ); +-} ++ void Invariant() const { } + +-extern (C) void gc_removeRoot( void* p ) +-{ +- if( proxy is null ) +- return _gc.removeRoot( p ); +- return proxy.gc_removeRoot( p ); +-} + +-extern (C) void gc_removeRange( void* p ) +-{ +- if( proxy is null ) +- return _gc.removeRange( p ); +- return proxy.gc_removeRange( p ); ++ invariant() ++ { ++ if (inited) ++ { ++ //printf("Gcx.invariant(): this = %p\n", &this); ++ ++ for (size_t i = 0; i < npools; i++) ++ { auto pool = pooltable[i]; ++ ++ pool.Invariant(); ++ if (i == 0) ++ { ++ assert(minAddr == pool.baseAddr); ++ } ++ if (i + 1 < npools) ++ { ++ assert(pool.opCmp(pooltable[i + 1]) < 0); ++ } ++ else if (i + 1 == npools) ++ { ++ assert(maxAddr == pool.topAddr); ++ } ++ } ++ ++ if (roots) ++ { ++ assert(rootdim != 0); ++ assert(nroots <= rootdim); ++ } ++ ++ if (ranges) ++ { ++ assert(rangedim != 0); ++ assert(nranges <= rangedim); ++ ++ for (size_t i = 0; i < nranges; i++) ++ { ++ assert(ranges[i].pbot); ++ assert(ranges[i].ptop); ++ assert(ranges[i].pbot <= ranges[i].ptop); ++ } ++ } ++ ++ for (size_t i = 0; i < B_PAGE; i++) ++ { ++ for (auto list = cast(List*)bucket[i]; list; list = list.next) ++ { ++ } ++ } ++ } ++ } ++ ++ ++ /** ++ * ++ */ ++ void addRoot(void *p) ++ { ++ if (nroots == rootdim) ++ { ++ size_t newdim = rootdim * 2 + 16; ++ void** newroots; ++ ++ newroots = cast(void**)cstdlib.malloc(newdim * newroots[0].sizeof); ++ if (!newroots) ++ onOutOfMemoryError(); ++ if (roots) ++ { memcpy(newroots, roots, nroots * newroots[0].sizeof); ++ cstdlib.free(roots); ++ } ++ roots = newroots; ++ rootdim = newdim; ++ } ++ roots[nroots] = p; ++ nroots++; ++ } ++ ++ ++ /** ++ * ++ */ ++ void removeRoot(void *p) ++ { ++ for (size_t i = nroots; i--;) ++ { ++ if (roots[i] == p) ++ { ++ nroots--; ++ memmove(roots + i, roots + i + 1, (nroots - i) * roots[0].sizeof); ++ return; ++ } ++ } ++ assert(0); ++ } ++ ++ ++ /** ++ * ++ */ ++ int rootIter(int delegate(ref void*) dg) ++ { ++ int result = 0; ++ for (size_t i = 0; i < nroots; ++i) ++ { ++ result = dg(roots[i]); ++ if (result) ++ break; ++ } ++ return result; ++ } ++ ++ ++ /** ++ * ++ */ ++ void addRange(void *pbot, void *ptop) ++ { ++ //debug(PRINTF) printf("Thread %x ", pthread_self()); ++ debug(PRINTF) printf("%p.Gcx::addRange(%p, %p), nranges = %d\n", &this, pbot, ptop, nranges); ++ if (nranges == rangedim) ++ { ++ size_t newdim = rangedim * 2 + 16; ++ Range *newranges; ++ ++ newranges = cast(Range*)cstdlib.malloc(newdim * newranges[0].sizeof); ++ if (!newranges) ++ onOutOfMemoryError(); ++ if (ranges) ++ { memcpy(newranges, ranges, nranges * newranges[0].sizeof); ++ cstdlib.free(ranges); ++ } ++ ranges = newranges; ++ rangedim = newdim; ++ } ++ ranges[nranges].pbot = pbot; ++ ranges[nranges].ptop = ptop; ++ nranges++; ++ } ++ ++ ++ /** ++ * ++ */ ++ void removeRange(void *pbot) ++ { ++ //debug(PRINTF) printf("Thread %x ", pthread_self()); ++ debug(PRINTF) printf("Gcx.removeRange(%p), nranges = %d\n", pbot, nranges); ++ for (size_t i = nranges; i--;) ++ { ++ if (ranges[i].pbot == pbot) ++ { ++ nranges--; ++ memmove(ranges + i, ranges + i + 1, (nranges - i) * ranges[0].sizeof); ++ return; ++ } ++ } ++ debug(PRINTF) printf("Wrong thread\n"); ++ ++ // This is a fatal error, but ignore it. ++ // The problem is that we can get a Close() call on a thread ++ // other than the one the range was allocated on. ++ //assert(zero); ++ } ++ ++ ++ /** ++ * ++ */ ++ int rangeIter(int delegate(ref Range) dg) ++ { ++ int result = 0; ++ for (size_t i = 0; i < nranges; ++i) ++ { ++ result = dg(ranges[i]); ++ if (result) ++ break; ++ } ++ return result; ++ } ++ ++ ++ /** ++ * Find Pool that pointer is in. ++ * Return null if not in a Pool. ++ * Assume pooltable[] is sorted. ++ */ ++ Pool *findPool(void *p) ++ { ++ if (p >= minAddr && p < maxAddr) ++ { ++ if (npools <= 1) ++ { ++ return npools == 0 ? null : pooltable[0]; ++ } ++ ++ /* The pooltable[] is sorted by address, so do a binary search ++ */ ++ auto pt = pooltable; ++ size_t low = 0; ++ size_t high = npools - 1; ++ while (low <= high) ++ { ++ size_t mid = (low + high) >> 1; ++ auto pool = pt[mid]; ++ if (p < pool.baseAddr) ++ high = mid - 1; ++ else if (p >= pool.topAddr) ++ low = mid + 1; ++ else ++ return pool; ++ } ++ } ++ return null; ++ } ++ ++ ++ /** ++ * Find base address of block containing pointer p. ++ * Returns null if not a gc'd pointer ++ */ ++ void* findBase(void *p) ++ { ++ Pool *pool; ++ ++ pool = findPool(p); ++ if (pool) ++ { ++ size_t offset = cast(size_t)(p - pool.baseAddr); ++ size_t pn = offset / PAGESIZE; ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ ++ // Adjust bit to be at start of allocated memory block ++ if (bin <= B_PAGE) ++ { ++ return pool.baseAddr + (offset & notbinsize[bin]); ++ } ++ else if (bin == B_PAGEPLUS) ++ { ++ auto pageOffset = pool.bPageOffsets[pn]; ++ offset -= pageOffset * PAGESIZE; ++ pn -= pageOffset; ++ ++ return pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); ++ } ++ else ++ { ++ // we are in a B_FREE page ++ return null; ++ } ++ } ++ return null; ++ } ++ ++ ++ /** ++ * Find size of pointer p. ++ * Returns 0 if not a gc'd pointer ++ */ ++ size_t findSize(void *p) ++ { ++ Pool* pool; ++ size_t size = 0; ++ ++ if (USE_CACHE && p == cached_size_key) ++ return cached_size_val; ++ ++ pool = findPool(p); ++ if (pool) ++ { ++ size_t pagenum; ++ Bins bin; ++ ++ pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; ++ bin = cast(Bins)pool.pagetable[pagenum]; ++ size = binsize[bin]; ++ if (bin == B_PAGE) ++ { ++ size = pool.bPageOffsets[pagenum] * PAGESIZE; ++ } ++ cached_size_key = p; ++ cached_size_val = size; ++ } ++ return size; ++ } ++ ++ ++ /** ++ * ++ */ ++ BlkInfo getInfo(void* p) ++ { ++ Pool* pool; ++ BlkInfo info; ++ ++ if (USE_CACHE && p == cached_info_key) ++ return cached_info_val; ++ ++ pool = findPool(p); ++ if (pool) ++ { ++ size_t offset = cast(size_t)(p - pool.baseAddr); ++ size_t pn = offset / PAGESIZE; ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ ++ //////////////////////////////////////////////////////////////////// ++ // findAddr ++ //////////////////////////////////////////////////////////////////// ++ ++ if (bin <= B_PAGE) ++ { ++ info.base = cast(void*)((cast(size_t)p) & notbinsize[bin]); ++ } ++ else if (bin == B_PAGEPLUS) ++ { ++ auto pageOffset = pool.bPageOffsets[pn]; ++ offset = pageOffset * PAGESIZE; ++ pn -= pageOffset; ++ info.base = pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); ++ ++ // fix bin for use by size calc below ++ bin = cast(Bins)pool.pagetable[pn]; ++ } ++ ++ //////////////////////////////////////////////////////////////////// ++ // findSize ++ //////////////////////////////////////////////////////////////////// ++ ++ info.size = binsize[bin]; ++ if (bin == B_PAGE) ++ { ++ info.size = pool.bPageOffsets[pn] * PAGESIZE; ++ } ++ ++ //////////////////////////////////////////////////////////////////// ++ // getBits ++ //////////////////////////////////////////////////////////////////// ++ ++ // reset the offset to the base pointer, otherwise the bits ++ // are the bits for the pointer, which may be garbage ++ offset = cast(size_t)(info.base - pool.baseAddr); ++ info.attr = getBits(pool, cast(size_t)(offset >> pool.shiftBy)); ++ ++ cached_info_key = p; ++ cached_info_val = info; ++ } ++ return info; ++ } ++ ++ void updateCaches(void*p, size_t size) ++ { ++ if (USE_CACHE && p == cached_size_key) ++ cached_size_val = size; ++ if (p == cached_info_key) ++ cached_info_val.size = size; ++ } ++ ++ /** ++ * Compute bin for size. ++ */ ++ static Bins findBin(size_t size) ++ { ++ static const byte[2049] binTable = ctfeBins(); ++ ++ return (size <= 2048) ? ++ (cast(Bins) binTable[size]) : ++ B_PAGE; ++ } ++ ++ static Bins findBinImpl(size_t size) ++ { Bins bin; ++ ++ if (size <= 256) ++ { ++ if (size <= 64) ++ { ++ if (size <= 16) ++ bin = B_16; ++ else if (size <= 32) ++ bin = B_32; ++ else ++ bin = B_64; ++ } ++ else ++ { ++ if (size <= 128) ++ bin = B_128; ++ else ++ bin = B_256; ++ } ++ } ++ else ++ { ++ if (size <= 1024) ++ { ++ if (size <= 512) ++ bin = B_512; ++ else ++ bin = B_1024; ++ } ++ else ++ { ++ if (size <= 2048) ++ bin = B_2048; ++ else ++ bin = B_PAGE; ++ } ++ } ++ return bin; ++ } ++ ++ /** ++ * Computes the bin table using CTFE. ++ */ ++ static byte[2049] ctfeBins() ++ { ++ byte[2049] ret; ++ for(size_t i = 0; i < 2049; i++) ++ { ++ ret[i] = cast(byte) findBinImpl(i); ++ } ++ ++ return ret; ++ } ++ ++ ++ /** ++ * Allocate a new pool of at least size bytes. ++ * Sort it into pooltable[]. ++ * Mark all memory in the pool as B_FREE. ++ * Return the actual number of bytes reserved or 0 on error. ++ */ ++ size_t reserve(size_t size) ++ { ++ size_t npages = (size + PAGESIZE - 1) / PAGESIZE; ++ ++ // Assume reserve() is for small objects. ++ Pool* pool = newPool(npages, false); ++ ++ if (!pool) ++ return 0; ++ return pool.npages * PAGESIZE; ++ } ++ ++ ++ /** ++ * Minimizes physical memory usage by returning free pools to the OS. ++ */ ++ void minimize() ++ { ++ debug(PRINTF) printf("Minimizing.\n"); ++ ++ static bool isUsed(Pool *pool) ++ { ++ return pool.freepages < pool.npages; ++ } ++ ++ // semi-stable partition ++ for (size_t i = 0; i < npools; ++i) ++ { ++ auto pool = pooltable[i]; ++ // find first unused pool ++ if (isUsed(pool)) continue; ++ ++ // move used pools before unused ones ++ size_t j = i + 1; ++ for (; j < npools; ++j) ++ { ++ pool = pooltable[j]; ++ if (!isUsed(pool)) continue; ++ // swap ++ pooltable[j] = pooltable[i]; ++ pooltable[i] = pool; ++ ++i; ++ } ++ // npooltable[0 .. i] => used ++ // npooltable[i .. npools] => free ++ ++ // free unused pools ++ for (j = i; j < npools; ++j) ++ { ++ pool = pooltable[j]; ++ debug(PRINTF) printFreeInfo(pool); ++ pool.Dtor(); ++ cstdlib.free(pool); ++ } ++ npools = i; ++ } ++ ++ if (npools) ++ { ++ minAddr = pooltable[0].baseAddr; ++ maxAddr = pooltable[npools - 1].topAddr; ++ } ++ else ++ { ++ minAddr = maxAddr = null; ++ } ++ ++ debug(PRINTF) printf("Done minimizing.\n"); ++ } ++ ++ unittest ++ { ++ enum NPOOLS = 6; ++ enum NPAGES = 10; ++ Gcx gcx; ++ ++ void reset() ++ { ++ foreach(i, ref pool; gcx.pooltable[0 .. gcx.npools]) ++ pool.freepages = pool.npages; ++ gcx.minimize(); ++ assert(gcx.npools == 0); ++ ++ if (gcx.pooltable is null) ++ gcx.pooltable = cast(Pool**)cstdlib.malloc(NPOOLS * (Pool*).sizeof); ++ foreach(i; 0 .. NPOOLS) ++ { ++ auto pool = cast(Pool*)cstdlib.malloc(Pool.sizeof); ++ *pool = Pool.init; ++ gcx.pooltable[i] = pool; ++ } ++ gcx.npools = NPOOLS; ++ } ++ ++ void usePools() ++ { ++ foreach(pool; gcx.pooltable[0 .. NPOOLS]) ++ { ++ pool.pagetable = cast(ubyte*)cstdlib.malloc(NPAGES); ++ memset(pool.pagetable, B_FREE, NPAGES); ++ pool.npages = NPAGES; ++ pool.freepages = NPAGES / 2; ++ } ++ } ++ ++ // all pools are free ++ reset(); ++ assert(gcx.npools == NPOOLS); ++ gcx.minimize(); ++ assert(gcx.npools == 0); ++ ++ // all pools used ++ reset(); ++ usePools(); ++ assert(gcx.npools == NPOOLS); ++ gcx.minimize(); ++ assert(gcx.npools == NPOOLS); ++ ++ // preserves order of used pools ++ reset(); ++ usePools(); ++ ++ { ++ version (Bug7068_FIXED) ++ Pool*[NPOOLS] opools = gcx.pooltable[0 .. NPOOLS]; ++ else ++ { ++ Pool*[NPOOLS] opools = void; ++ memcpy(opools.ptr, gcx.pooltable, (Pool*).sizeof * NPOOLS); ++ } ++ gcx.pooltable[2].freepages = NPAGES; ++ ++ gcx.minimize(); ++ assert(gcx.npools == NPOOLS - 1); ++ assert(gcx.pooltable[0] == opools[0]); ++ assert(gcx.pooltable[1] == opools[1]); ++ assert(gcx.pooltable[2] == opools[3]); ++ } ++ ++ // gcx reduces address span ++ reset(); ++ usePools(); ++ ++ byte* base, top; ++ ++ { ++ byte*[NPOOLS] mem = void; ++ foreach(i; 0 .. NPOOLS) ++ mem[i] = cast(byte*)os_mem_map(NPAGES * PAGESIZE); ++ ++ extern(C) static int compare(in void* p1, in void *p2) ++ { ++ return p1 < p2 ? -1 : cast(int)(p2 > p1); ++ } ++ cstdlib.qsort(mem.ptr, mem.length, (byte*).sizeof, &compare); ++ ++ foreach(i, pool; gcx.pooltable[0 .. NPOOLS]) ++ { ++ pool.baseAddr = mem[i]; ++ pool.topAddr = pool.baseAddr + NPAGES * PAGESIZE; ++ } ++ ++ base = gcx.pooltable[0].baseAddr; ++ top = gcx.pooltable[NPOOLS - 1].topAddr; ++ } ++ ++ gcx.minimize(); ++ assert(gcx.npools == NPOOLS); ++ assert(gcx.minAddr == base); ++ assert(gcx.maxAddr == top); ++ ++ gcx.pooltable[NPOOLS - 1].freepages = NPAGES; ++ gcx.pooltable[NPOOLS - 2].freepages = NPAGES; ++ ++ gcx.minimize(); ++ assert(gcx.npools == NPOOLS - 2); ++ assert(gcx.minAddr == base); ++ assert(gcx.maxAddr == gcx.pooltable[NPOOLS - 3].topAddr); ++ ++ gcx.pooltable[0].freepages = NPAGES; ++ ++ gcx.minimize(); ++ assert(gcx.npools == NPOOLS - 3); ++ assert(gcx.minAddr != base); ++ assert(gcx.minAddr == gcx.pooltable[0].baseAddr); ++ assert(gcx.maxAddr == gcx.pooltable[NPOOLS - 4].topAddr); ++ ++ // free all ++ foreach(pool; gcx.pooltable[0 .. gcx.npools]) ++ pool.freepages = NPAGES; ++ gcx.minimize(); ++ assert(gcx.npools == 0); ++ cstdlib.free(gcx.pooltable); ++ gcx.pooltable = null; ++ } ++ ++ ++ /** ++ * Allocate a chunk of memory that is larger than a page. ++ * Return null if out of memory. ++ */ ++ void *bigAlloc(size_t size, Pool **poolPtr, size_t *alloc_size = null) ++ { ++ debug(PRINTF) printf("In bigAlloc. Size: %d\n", size); ++ ++ Pool* pool; ++ size_t npages; ++ size_t n; ++ size_t pn; ++ size_t freedpages; ++ void* p; ++ int state; ++ bool collected = false; ++ ++ npages = (size + PAGESIZE - 1) / PAGESIZE; ++ ++ for (state = disabled ? 1 : 0; ; ) ++ { ++ // This code could use some refinement when repeatedly ++ // allocating very large arrays. ++ ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ if(!pool.isLargeObject || pool.freepages < npages) continue; ++ pn = pool.allocPages(npages); ++ if (pn != OPFAIL) ++ goto L1; ++ } ++ ++ // Failed ++ switch (state) ++ { ++ case 0: ++ // Try collecting ++ collected = true; ++ freedpages = fullcollect(); ++ if (freedpages >= npools * ((POOLSIZE / PAGESIZE) / 4)) ++ { state = 1; ++ continue; ++ } ++ // Release empty pools to prevent bloat ++ minimize(); ++ // Allocate new pool ++ pool = newPool(npages, true); ++ if (!pool) ++ { state = 2; ++ continue; ++ } ++ pn = pool.allocPages(npages); ++ assert(pn != OPFAIL); ++ goto L1; ++ case 1: ++ // Release empty pools to prevent bloat ++ minimize(); ++ // Allocate new pool ++ pool = newPool(npages, true); ++ if (!pool) ++ { ++ if (collected) ++ goto Lnomemory; ++ state = 0; ++ continue; ++ } ++ pn = pool.allocPages(npages); ++ assert(pn != OPFAIL); ++ goto L1; ++ case 2: ++ goto Lnomemory; ++ default: ++ assert(false); ++ } ++ } ++ ++ L1: ++ debug(PRINTF) printFreeInfo(pool); ++ pool.pagetable[pn] = B_PAGE; ++ if (npages > 1) ++ memset(&pool.pagetable[pn + 1], B_PAGEPLUS, npages - 1); ++ pool.updateOffsets(pn); ++ pool.freepages -= npages; ++ ++ debug(PRINTF) printFreeInfo(pool); ++ ++ p = pool.baseAddr + pn * PAGESIZE; ++ debug(PRINTF) printf("Got large alloc: %p, pt = %d, np = %d\n", p, pool.pagetable[pn], npages); ++ debug (MEMSTOMP) memset(p, 0xF1, size); ++ if(alloc_size) ++ *alloc_size = npages * PAGESIZE; ++ //debug(PRINTF) printf("\tp = %p\n", p); ++ ++ *poolPtr = pool; ++ return p; ++ ++ Lnomemory: ++ return null; // let caller handle the error ++ } ++ ++ ++ /** ++ * Allocate a new pool with at least npages in it. ++ * Sort it into pooltable[]. ++ * Return null if failed. ++ */ ++ Pool *newPool(size_t npages, bool isLargeObject) ++ { ++ Pool* pool; ++ Pool** newpooltable; ++ size_t newnpools; ++ size_t i; ++ ++ //debug(PRINTF) printf("************Gcx::newPool(npages = %d)****************\n", npages); ++ ++ // Minimum of POOLSIZE ++ if (npages < POOLSIZE/PAGESIZE) ++ npages = POOLSIZE/PAGESIZE; ++ else if (npages > POOLSIZE/PAGESIZE) ++ { // Give us 150% of requested size, so there's room to extend ++ auto n = npages + (npages >> 1); ++ if (n < size_t.max/PAGESIZE) ++ npages = n; ++ } ++ ++ // Allocate successively larger pools up to 8 megs ++ if (npools) ++ { size_t n; ++ ++ n = npools; ++ if (n > 32) ++ n = 32; // cap pool size at 32 megs ++ else if (n > 8) ++ n = 16; ++ n *= (POOLSIZE / PAGESIZE); ++ if (npages < n) ++ npages = n; ++ } ++ ++ //printf("npages = %d\n", npages); ++ ++ pool = cast(Pool *)cstdlib.calloc(1, Pool.sizeof); ++ if (pool) ++ { ++ pool.initialize(npages, isLargeObject); ++ if (!pool.baseAddr) ++ goto Lerr; ++ ++ newnpools = npools + 1; ++ newpooltable = cast(Pool **)cstdlib.realloc(pooltable, newnpools * (Pool *).sizeof); ++ if (!newpooltable) ++ goto Lerr; ++ ++ // Sort pool into newpooltable[] ++ for (i = 0; i < npools; i++) ++ { ++ if (pool.opCmp(newpooltable[i]) < 0) ++ break; ++ } ++ memmove(newpooltable + i + 1, newpooltable + i, (npools - i) * (Pool *).sizeof); ++ newpooltable[i] = pool; ++ ++ pooltable = newpooltable; ++ npools = newnpools; ++ ++ minAddr = pooltable[0].baseAddr; ++ maxAddr = pooltable[npools - 1].topAddr; ++ } ++ return pool; ++ ++ Lerr: ++ pool.Dtor(); ++ cstdlib.free(pool); ++ return null; ++ } ++ ++ ++ /** ++ * Allocate a page of bin's. ++ * Returns: ++ * 0 failed ++ */ ++ int allocPage(Bins bin) ++ { ++ Pool* pool; ++ size_t n; ++ size_t pn; ++ byte* p; ++ byte* ptop; ++ ++ //debug(PRINTF) printf("Gcx::allocPage(bin = %d)\n", bin); ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ if(pool.isLargeObject) continue; ++ pn = pool.allocPages(1); ++ if (pn != OPFAIL) ++ goto L1; ++ } ++ return 0; // failed ++ ++ L1: ++ pool.pagetable[pn] = cast(ubyte)bin; ++ pool.freepages--; ++ ++ // Convert page to free list ++ size_t size = binsize[bin]; ++ List **b = &bucket[bin]; ++ ++ p = pool.baseAddr + pn * PAGESIZE; ++ ptop = p + PAGESIZE; ++ for (; p < ptop; p += size) ++ { ++ (cast(List *)p).next = *b; ++ (cast(List *)p).pool = pool; ++ *b = cast(List *)p; ++ } ++ return 1; ++ } ++ ++ /** ++ * Mark overload for initial mark() call. ++ */ ++ void mark(void *pbot, void *ptop) { ++ mark(pbot, ptop, MAX_MARK_RECURSIONS); ++ } ++ ++ /** ++ * Search a range of memory values and mark any pointers into the GC pool. ++ */ ++ void mark(void *pbot, void *ptop, int nRecurse) ++ { ++ //import core.stdc.stdio;printf("nRecurse = %d\n", nRecurse); ++ void **p1 = cast(void **)pbot; ++ void **p2 = cast(void **)ptop; ++ size_t pcache = 0; ++ uint changes = 0; ++ ++ //printf("marking range: %p -> %p\n", pbot, ptop); ++ for (; p1 < p2; p1++) ++ { ++ auto p = cast(byte *)(*p1); ++ ++ //if (log) debug(PRINTF) printf("\tmark %p\n", p); ++ if (p >= minAddr && p < maxAddr) ++ { ++ if ((cast(size_t)p & ~cast(size_t)(PAGESIZE-1)) == pcache) ++ continue; ++ ++ auto pool = findPool(p); ++ if (pool) ++ { ++ size_t offset = cast(size_t)(p - pool.baseAddr); ++ size_t biti = void; ++ size_t pn = offset / PAGESIZE; ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ void* base = void; ++ ++ // For the NO_INTERIOR attribute. This tracks whether ++ // the pointer is an interior pointer or points to the ++ // base address of a block. ++ bool pointsToBase = false; ++ ++ //debug(PRINTF) printf("\t\tfound pool %p, base=%p, pn = %zd, bin = %d, biti = x%x\n", pool, pool.baseAddr, pn, bin, biti); ++ ++ // Adjust bit to be at start of allocated memory block ++ if (bin < B_PAGE) ++ { ++ // We don't care abou setting pointsToBase correctly ++ // because it's ignored for small object pools anyhow. ++ auto offsetBase = offset & notbinsize[bin]; ++ biti = offsetBase >> pool.shiftBy; ++ base = pool.baseAddr + offsetBase; ++ //debug(PRINTF) printf("\t\tbiti = x%x\n", biti); ++ } ++ else if (bin == B_PAGE) ++ { ++ auto offsetBase = offset & notbinsize[bin]; ++ base = pool.baseAddr + offsetBase; ++ pointsToBase = offsetBase == offset; ++ biti = offsetBase >> pool.shiftBy; ++ //debug(PRINTF) printf("\t\tbiti = x%x\n", biti); ++ ++ pcache = cast(size_t)p & ~cast(size_t)(PAGESIZE-1); ++ } ++ else if (bin == B_PAGEPLUS) ++ { ++ pn -= pool.bPageOffsets[pn]; ++ base = pool.baseAddr + (pn * PAGESIZE); ++ biti = pn * (PAGESIZE >> pool.shiftBy); ++ pcache = cast(size_t)p & ~cast(size_t)(PAGESIZE-1); ++ } ++ else ++ { ++ // Don't mark bits in B_FREE pages ++ continue; ++ } ++ ++ if(pool.nointerior.nbits && !pointsToBase && pool.nointerior.test(biti)) ++ { ++ continue; ++ } ++ ++ //debug(PRINTF) printf("\t\tmark(x%x) = %d\n", biti, pool.mark.test(biti)); ++ if (!pool.mark.testSet(biti)) ++ { ++ //if (log) debug(PRINTF) printf("\t\tmarking %p\n", p); ++ if (!pool.noscan.test(biti)) ++ { ++ if(nRecurse == 0) { ++ // Then we've got a really deep heap graph. ++ // Start marking stuff to be scanned when we ++ // traverse the heap again next time, to save ++ // stack space. ++ pool.scan.set(biti); ++ changes = 1; ++ pool.newChanges = true; ++ } else { ++ // Directly recurse mark() to prevent having ++ // to traverse the heap O(D) times where D ++ // is the max depth of the heap graph. ++ if (bin < B_PAGE) ++ { ++ mark(base, base + binsize[bin], nRecurse - 1); ++ } ++ else ++ { ++ auto u = pool.bPageOffsets[pn]; ++ mark(base, base + u * PAGESIZE, nRecurse - 1); ++ } ++ } ++ } ++ ++ debug (LOGGING) log_parent(sentinel_add(pool.baseAddr + (biti << pool.shiftBy)), sentinel_add(pbot)); ++ } ++ } ++ } ++ } ++ anychanges |= changes; ++ } ++ ++ ++ /** ++ * Return number of full pages free'd. ++ */ ++ size_t fullcollect() ++ { ++ size_t n; ++ Pool* pool; ++ ++ debug(PROFILING) ++ { ++ clock_t start, stop; ++ start = clock(); ++ } ++ ++ debug(COLLECT_PRINTF) printf("Gcx.fullcollect()\n"); ++ //printf("\tpool address range = %p .. %p\n", minAddr, maxAddr); ++ ++ if (running) ++ onInvalidMemoryOperationError(); ++ running = 1; ++ ++ thread_suspendAll(); ++ ++ cached_size_key = cached_size_key.init; ++ cached_size_val = cached_size_val.init; ++ cached_info_key = cached_info_key.init; ++ cached_info_val = cached_info_val.init; ++ ++ anychanges = 0; ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ pool.mark.zero(); ++ pool.scan.zero(); ++ if(!pool.isLargeObject) pool.freebits.zero(); ++ } ++ ++ debug(COLLECT_PRINTF) printf("Set bits\n"); ++ ++ // Mark each free entry, so it doesn't get scanned ++ for (n = 0; n < B_PAGE; n++) ++ { ++ for (List *list = bucket[n]; list; list = list.next) ++ { ++ pool = list.pool; ++ assert(pool); ++ pool.freebits.set(cast(size_t)(cast(byte*)list - pool.baseAddr) / 16); ++ } ++ } ++ ++ debug(COLLECT_PRINTF) printf("Marked free entries.\n"); ++ ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ pool.newChanges = false; // Some of these get set to true on stack scan. ++ if(!pool.isLargeObject) ++ { ++ pool.mark.copy(&pool.freebits); ++ } ++ } ++ ++ debug(PROFILING) ++ { ++ stop = clock(); ++ prepTime += (stop - start); ++ start = stop; ++ } ++ ++ if (!noStack) ++ { ++ debug(COLLECT_PRINTF) printf("\tscan stacks.\n"); ++ // Scan stacks and registers for each paused thread ++ thread_scanAll(&mark); ++ } ++ ++ // Scan roots[] ++ debug(COLLECT_PRINTF) printf("\tscan roots[]\n"); ++ mark(roots, roots + nroots); ++ ++ // Scan ranges[] ++ debug(COLLECT_PRINTF) printf("\tscan ranges[]\n"); ++ //log++; ++ for (n = 0; n < nranges; n++) ++ { ++ debug(COLLECT_PRINTF) printf("\t\t%p .. %p\n", ranges[n].pbot, ranges[n].ptop); ++ mark(ranges[n].pbot, ranges[n].ptop); ++ } ++ //log--; ++ ++ debug(COLLECT_PRINTF) printf("\tscan heap\n"); ++ int nTraversals; ++ while (anychanges) ++ { ++ //import core.stdc.stdio; printf("nTraversals = %d\n", ++nTraversals); ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ pool.oldChanges = pool.newChanges; ++ pool.newChanges = false; ++ } ++ ++ debug(COLLECT_PRINTF) printf("\t\tpass\n"); ++ anychanges = 0; ++ for (n = 0; n < npools; n++) ++ { ++ pool = pooltable[n]; ++ if(!pool.oldChanges) continue; ++ ++ auto shiftBy = pool.shiftBy; ++ auto bbase = pool.scan.base(); ++ auto btop = bbase + pool.scan.nwords; ++ //printf("\t\tn = %d, bbase = %p, btop = %p\n", n, bbase, btop); ++ for (auto b = bbase; b < btop;) ++ { ++ auto bitm = *b; ++ if (!bitm) ++ { b++; ++ continue; ++ } ++ *b = 0; ++ ++ auto o = pool.baseAddr + (b - bbase) * ((typeof(bitm).sizeof*8) << shiftBy); ++ ++ auto firstset = bsf(bitm); ++ bitm >>= firstset; ++ o += firstset << shiftBy; ++ ++ while(bitm) ++ { ++ auto pn = cast(size_t)(o - pool.baseAddr) / PAGESIZE; ++ auto bin = cast(Bins)pool.pagetable[pn]; ++ if (bin < B_PAGE) ++ { ++ mark(o, o + binsize[bin]); ++ } ++ else if (bin == B_PAGE) ++ { ++ auto u = pool.bPageOffsets[pn]; ++ mark(o, o + u * PAGESIZE); ++ } ++ ++ bitm >>= 1; ++ auto nbits = bsf(bitm); ++ bitm >>= nbits; ++ o += (nbits + 1) << shiftBy; ++ } ++ } ++ } ++ } ++ ++ thread_processGCMarks(&isMarked); ++ thread_resumeAll(); ++ ++ debug(PROFILING) ++ { ++ stop = clock(); ++ markTime += (stop - start); ++ start = stop; ++ } ++ ++ // Free up everything not marked ++ debug(COLLECT_PRINTF) printf("\tfree'ing\n"); ++ size_t freedpages = 0; ++ size_t freed = 0; ++ for (n = 0; n < npools; n++) ++ { size_t pn; ++ ++ pool = pooltable[n]; ++ ++ if(pool.isLargeObject) ++ { ++ for(pn = 0; pn < pool.npages; pn++) ++ { ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ if(bin > B_PAGE) continue; ++ size_t biti = pn; ++ ++ if (!pool.mark.test(biti)) ++ { byte *p = pool.baseAddr + pn * PAGESIZE; ++ ++ sentinel_Invariant(sentinel_add(p)); ++ if (pool.finals.nbits && pool.finals.testClear(biti)) ++ rt_finalize2(sentinel_add(p), false, false); ++ clrBits(pool, biti, ~BlkAttr.NONE ^ BlkAttr.FINALIZE); ++ ++ debug(COLLECT_PRINTF) printf("\tcollecting big %p\n", p); ++ log_free(sentinel_add(p)); ++ pool.pagetable[pn] = B_FREE; ++ if(pn < pool.searchStart) pool.searchStart = pn; ++ freedpages++; ++ pool.freepages++; ++ ++ debug (MEMSTOMP) memset(p, 0xF3, PAGESIZE); ++ while (pn + 1 < pool.npages && pool.pagetable[pn + 1] == B_PAGEPLUS) ++ { ++ pn++; ++ pool.pagetable[pn] = B_FREE; ++ ++ // Don't need to update searchStart here because ++ // pn is guaranteed to be greater than last time ++ // we updated it. ++ ++ pool.freepages++; ++ freedpages++; ++ ++ debug (MEMSTOMP) ++ { p += PAGESIZE; ++ memset(p, 0xF3, PAGESIZE); ++ } ++ } ++ } ++ } ++ ++ continue; ++ } ++ else ++ { ++ ++ for (pn = 0; pn < pool.npages; pn++) ++ { ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ ++ if (bin < B_PAGE) ++ { ++ auto size = binsize[bin]; ++ byte *p = pool.baseAddr + pn * PAGESIZE; ++ byte *ptop = p + PAGESIZE; ++ size_t biti = pn * (PAGESIZE/16); ++ size_t bitstride = size / 16; ++ ++ GCBits.wordtype toClear; ++ size_t clearStart = (biti >> GCBits.BITS_SHIFT) + 1; ++ size_t clearIndex; ++ ++ for (; p < ptop; p += size, biti += bitstride, clearIndex += bitstride) ++ { ++ if(clearIndex > GCBits.BITS_PER_WORD - 1) ++ { ++ if(toClear) ++ { ++ Gcx.clrBitsSmallSweep(pool, clearStart, toClear); ++ toClear = 0; ++ } ++ ++ clearStart = (biti >> GCBits.BITS_SHIFT) + 1; ++ clearIndex = biti & GCBits.BITS_MASK; ++ } ++ ++ if (!pool.mark.test(biti)) ++ { ++ sentinel_Invariant(sentinel_add(p)); ++ ++ pool.freebits.set(biti); ++ if (pool.finals.nbits && pool.finals.test(biti)) ++ rt_finalize2(sentinel_add(p), false, false); ++ toClear |= GCBits.BITS_1 << clearIndex; ++ ++ List *list = cast(List *)p; ++ debug(PRINTF) printf("\tcollecting %p\n", list); ++ log_free(sentinel_add(list)); ++ ++ debug (MEMSTOMP) memset(p, 0xF3, size); ++ ++ freed += size; ++ } ++ } ++ ++ if(toClear) ++ { ++ Gcx.clrBitsSmallSweep(pool, clearStart, toClear); ++ } ++ } ++ } ++ } ++ } ++ ++ debug(PROFILING) ++ { ++ stop = clock(); ++ sweepTime += (stop - start); ++ start = stop; ++ } ++ ++ // Zero buckets ++ bucket[] = null; ++ ++ // Free complete pages, rebuild free list ++ debug(COLLECT_PRINTF) printf("\tfree complete pages\n"); ++ size_t recoveredpages = 0; ++ for (n = 0; n < npools; n++) ++ { size_t pn; ++ ++ pool = pooltable[n]; ++ if(pool.isLargeObject) continue; ++ for (pn = 0; pn < pool.npages; pn++) ++ { ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ size_t biti; ++ size_t u; ++ ++ if (bin < B_PAGE) ++ { ++ size_t size = binsize[bin]; ++ size_t bitstride = size / 16; ++ size_t bitbase = pn * (PAGESIZE / 16); ++ size_t bittop = bitbase + (PAGESIZE / 16); ++ byte* p; ++ ++ biti = bitbase; ++ for (biti = bitbase; biti < bittop; biti += bitstride) ++ { if (!pool.freebits.test(biti)) ++ goto Lnotfree; ++ } ++ pool.pagetable[pn] = B_FREE; ++ if(pn < pool.searchStart) pool.searchStart = pn; ++ pool.freepages++; ++ recoveredpages++; ++ continue; ++ ++ Lnotfree: ++ p = pool.baseAddr + pn * PAGESIZE; ++ for (u = 0; u < PAGESIZE; u += size) ++ { biti = bitbase + u / 16; ++ if (pool.freebits.test(biti)) ++ { List *list; ++ ++ list = cast(List *)(p + u); ++ if (list.next != bucket[bin]) // avoid unnecessary writes ++ list.next = bucket[bin]; ++ list.pool = pool; ++ bucket[bin] = list; ++ } ++ } ++ } ++ } ++ } ++ ++ debug(PROFILING) ++ { ++ stop = clock(); ++ recoverTime += (stop - start); ++ } ++ ++ debug(COLLECT_PRINTF) printf("\trecovered pages = %d\n", recoveredpages); ++ debug(COLLECT_PRINTF) printf("\tfree'd %u bytes, %u pages from %u pools\n", freed, freedpages, npools); ++ ++ running = 0; // only clear on success ++ ++ return freedpages + recoveredpages; ++ } ++ ++ /** ++ * Returns true if the addr lies within a marked block. ++ * ++ * Warning! This should only be called while the world is stopped inside ++ * the fullcollect function. ++ */ ++ IsMarked isMarked(void *addr) ++ { ++ // first, we find the Pool this block is in, then check to see if the ++ // mark bit is clear. ++ auto pool = findPool(addr); ++ if(pool) ++ { ++ auto offset = cast(size_t)(addr - pool.baseAddr); ++ auto pn = offset / PAGESIZE; ++ auto bins = cast(Bins)pool.pagetable[pn]; ++ size_t biti = void; ++ if(bins <= B_PAGE) ++ { ++ biti = (offset & notbinsize[bins]) >> pool.shiftBy; ++ } ++ else ++ { ++ pn -= pool.bPageOffsets[pn]; ++ biti = pn * (PAGESIZE >> pool.shiftBy); ++ } ++ return pool.mark.test(biti) ? IsMarked.yes : IsMarked.no; ++ } ++ return IsMarked.unknown; ++ } ++ ++ ++ /** ++ * ++ */ ++ uint getBits(Pool* pool, size_t biti) ++ in ++ { ++ assert(pool); ++ } ++ body ++ { ++ uint bits; ++ ++ if (pool.finals.nbits && ++ pool.finals.test(biti)) ++ bits |= BlkAttr.FINALIZE; ++ if (pool.noscan.test(biti)) ++ bits |= BlkAttr.NO_SCAN; ++ if (pool.nointerior.nbits && pool.nointerior.test(biti)) ++ bits |= BlkAttr.NO_INTERIOR; ++// if (pool.nomove.nbits && ++// pool.nomove.test(biti)) ++// bits |= BlkAttr.NO_MOVE; ++ if (pool.appendable.test(biti)) ++ bits |= BlkAttr.APPENDABLE; ++ return bits; ++ } ++ ++ ++ /** ++ * ++ */ ++ void setBits(Pool* pool, size_t biti, uint mask) ++ in ++ { ++ assert(pool); ++ } ++ body ++ { ++ // Calculate the mask and bit offset once and then use it to ++ // set all of the bits we need to set. ++ immutable dataIndex = 1 + (biti >> GCBits.BITS_SHIFT); ++ immutable bitOffset = biti & GCBits.BITS_MASK; ++ immutable orWith = GCBits.BITS_1 << bitOffset; ++ ++ if (mask & BlkAttr.FINALIZE) ++ { ++ if (!pool.finals.nbits) ++ pool.finals.alloc(pool.mark.nbits); ++ pool.finals.data[dataIndex] |= orWith; ++ } ++ if (mask & BlkAttr.NO_SCAN) ++ { ++ pool.noscan.data[dataIndex] |= orWith; ++ } ++// if (mask & BlkAttr.NO_MOVE) ++// { ++// if (!pool.nomove.nbits) ++// pool.nomove.alloc(pool.mark.nbits); ++// pool.nomove.data[dataIndex] |= orWith; ++// } ++ if (mask & BlkAttr.APPENDABLE) ++ { ++ pool.appendable.data[dataIndex] |= orWith; ++ } ++ ++ if (pool.isLargeObject && (mask & BlkAttr.NO_INTERIOR)) ++ { ++ if(!pool.nointerior.nbits) ++ pool.nointerior.alloc(pool.mark.nbits); ++ pool.nointerior.data[dataIndex] |= orWith; ++ } ++ } ++ ++ ++ /** ++ * ++ */ ++ void clrBits(Pool* pool, size_t biti, uint mask) ++ in ++ { ++ assert(pool); ++ } ++ body ++ { ++ immutable dataIndex = 1 + (biti >> GCBits.BITS_SHIFT); ++ immutable bitOffset = biti & GCBits.BITS_MASK; ++ immutable keep = ~(GCBits.BITS_1 << bitOffset); ++ ++ if (mask & BlkAttr.FINALIZE && pool.finals.nbits) ++ pool.finals.data[dataIndex] &= keep; ++ if (mask & BlkAttr.NO_SCAN) ++ pool.noscan.data[dataIndex] &= keep; ++// if (mask & BlkAttr.NO_MOVE && pool.nomove.nbits) ++// pool.nomove.data[dataIndex] &= keep; ++ if (mask & BlkAttr.APPENDABLE) ++ pool.appendable.data[dataIndex] &= keep; ++ if (pool.nointerior.nbits && (mask & BlkAttr.NO_INTERIOR)) ++ pool.nointerior.data[dataIndex] &= keep; ++ } ++ ++ void clrBitsSmallSweep(Pool* pool, size_t dataIndex, GCBits.wordtype toClear) ++ in ++ { ++ assert(pool); ++ } ++ body ++ { ++ immutable toKeep = ~toClear; ++ if (pool.finals.nbits) ++ pool.finals.data[dataIndex] &= toKeep; ++ ++ pool.noscan.data[dataIndex] &= toKeep; ++ ++// if (pool.nomove.nbits) ++// pool.nomove.data[dataIndex] &= toKeep; ++ ++ pool.appendable.data[dataIndex] &= toKeep; ++ ++ if (pool.nointerior.nbits) ++ pool.nointerior.data[dataIndex] &= toKeep; ++ } ++ ++ /***** Leak Detector ******/ ++ ++ ++ debug (LOGGING) ++ { ++ LogArray current; ++ LogArray prev; ++ ++ ++ void log_init() ++ { ++ //debug(PRINTF) printf("+log_init()\n"); ++ current.reserve(1000); ++ prev.reserve(1000); ++ //debug(PRINTF) printf("-log_init()\n"); ++ } ++ ++ ++ void log_malloc(void *p, size_t size) ++ { ++ //debug(PRINTF) printf("+log_malloc(p = %p, size = %zd)\n", p, size); ++ Log log; ++ ++ log.p = p; ++ log.size = size; ++ log.line = GC.line; ++ log.file = GC.file; ++ log.parent = null; ++ ++ GC.line = 0; ++ GC.file = null; ++ ++ current.push(log); ++ //debug(PRINTF) printf("-log_malloc()\n"); ++ } ++ ++ ++ void log_free(void *p) ++ { ++ //debug(PRINTF) printf("+log_free(%p)\n", p); ++ auto i = current.find(p); ++ if (i == OPFAIL) ++ { ++ debug(PRINTF) printf("free'ing unallocated memory %p\n", p); ++ } ++ else ++ current.remove(i); ++ //debug(PRINTF) printf("-log_free()\n"); ++ } ++ ++ ++ void log_collect() ++ { ++ //debug(PRINTF) printf("+log_collect()\n"); ++ // Print everything in current that is not in prev ++ ++ debug(PRINTF) printf("New pointers this cycle: --------------------------------\n"); ++ size_t used = 0; ++ for (size_t i = 0; i < current.dim; i++) ++ { ++ auto j = prev.find(current.data[i].p); ++ if (j == OPFAIL) ++ current.data[i].print(); ++ else ++ used++; ++ } ++ ++ debug(PRINTF) printf("All roots this cycle: --------------------------------\n"); ++ for (size_t i = 0; i < current.dim; i++) ++ { ++ void* p = current.data[i].p; ++ if (!findPool(current.data[i].parent)) ++ { ++ auto j = prev.find(current.data[i].p); ++ debug(PRINTF) printf(j == OPFAIL ? "N" : " "); ++ current.data[i].print(); ++ } ++ } ++ ++ debug(PRINTF) printf("Used = %d-------------------------------------------------\n", used); ++ prev.copy(¤t); ++ ++ debug(PRINTF) printf("-log_collect()\n"); ++ } ++ ++ ++ void log_parent(void *p, void *parent) ++ { ++ //debug(PRINTF) printf("+log_parent()\n"); ++ auto i = current.find(p); ++ if (i == OPFAIL) ++ { ++ debug(PRINTF) printf("parent'ing unallocated memory %p, parent = %p\n", p, parent); ++ Pool *pool; ++ pool = findPool(p); ++ assert(pool); ++ size_t offset = cast(size_t)(p - pool.baseAddr); ++ size_t biti; ++ size_t pn = offset / PAGESIZE; ++ Bins bin = cast(Bins)pool.pagetable[pn]; ++ biti = (offset & notbinsize[bin]); ++ debug(PRINTF) printf("\tbin = %d, offset = x%x, biti = x%x\n", bin, offset, biti); ++ } ++ else ++ { ++ current.data[i].parent = parent; ++ } ++ //debug(PRINTF) printf("-log_parent()\n"); ++ } ++ ++ } ++ else ++ { ++ void log_init() { } ++ void log_malloc(void *p, size_t size) { } ++ void log_free(void *p) { } ++ void log_collect() { } ++ void log_parent(void *p, void *parent) { } ++ } + } + +-extern (C) Proxy* gc_getProxy() ++ ++/* ============================ Pool =============================== */ ++ ++ ++struct Pool + { +- return &pthis; ++ byte* baseAddr; ++ byte* topAddr; ++ GCBits mark; // entries already scanned, or should not be scanned ++ GCBits scan; // entries that need to be scanned ++ GCBits freebits; // entries that are on the free list ++ GCBits finals; // entries that need finalizer run on them ++ GCBits noscan; // entries that should not be scanned ++ GCBits appendable; // entries that are appendable ++ GCBits nointerior; // interior pointers should be ignored. ++ // Only implemented for large object pools. ++ ++ size_t npages; ++ size_t freepages; // The number of pages not in use. ++ ubyte* pagetable; ++ ++ bool isLargeObject; ++ bool oldChanges; // Whether there were changes on the last mark. ++ bool newChanges; // Whether there were changes on the current mark. ++ ++ // This tracks how far back we have to go to find the nearest B_PAGE at ++ // a smaller address than a B_PAGEPLUS. To save space, we use a uint. ++ // This limits individual allocations to 16 terabytes, assuming a 4k ++ // pagesize. ++ uint* bPageOffsets; ++ ++ // This variable tracks a conservative estimate of where the first free ++ // page in this pool is, so that if a lot of pages towards the beginning ++ // are occupied, we can bypass them in O(1). ++ size_t searchStart; ++ ++ void initialize(size_t npages, bool isLargeObject) ++ { ++ this.isLargeObject = isLargeObject; ++ size_t poolsize; ++ ++ //debug(PRINTF) printf("Pool::Pool(%u)\n", npages); ++ poolsize = npages * PAGESIZE; ++ assert(poolsize >= POOLSIZE); ++ baseAddr = cast(byte *)os_mem_map(poolsize); ++ ++ // Some of the code depends on page alignment of memory pools ++ assert((cast(size_t)baseAddr & (PAGESIZE - 1)) == 0); ++ ++ if (!baseAddr) ++ { ++ //debug(PRINTF) printf("GC fail: poolsize = x%zx, errno = %d\n", poolsize, errno); ++ //debug(PRINTF) printf("message = '%s'\n", sys_errlist[errno]); ++ ++ npages = 0; ++ poolsize = 0; ++ } ++ //assert(baseAddr); ++ topAddr = baseAddr + poolsize; ++ auto div = this.divisor; ++ auto nbits = cast(size_t)poolsize / div; ++ ++ mark.alloc(nbits); ++ scan.alloc(nbits); ++ ++ // pagetable already keeps track of what's free for the large object ++ // pool. ++ if(!isLargeObject) ++ { ++ freebits.alloc(nbits); ++ } ++ ++ noscan.alloc(nbits); ++ appendable.alloc(nbits); ++ ++ pagetable = cast(ubyte*)cstdlib.malloc(npages); ++ if (!pagetable) ++ onOutOfMemoryError(); ++ ++ if(isLargeObject) ++ { ++ bPageOffsets = cast(uint*)cstdlib.malloc(npages * uint.sizeof); ++ if (!bPageOffsets) ++ onOutOfMemoryError(); ++ } ++ ++ memset(pagetable, B_FREE, npages); ++ ++ this.npages = npages; ++ this.freepages = npages; ++ } ++ ++ ++ void Dtor() ++ { ++ if (baseAddr) ++ { ++ int result; ++ ++ if (npages) ++ { ++ result = os_mem_unmap(baseAddr, npages * PAGESIZE); ++ assert(result == 0); ++ npages = 0; ++ } ++ ++ baseAddr = null; ++ topAddr = null; ++ } ++ if (pagetable) ++ { ++ cstdlib.free(pagetable); ++ pagetable = null; ++ } ++ ++ if(bPageOffsets) ++ cstdlib.free(bPageOffsets); ++ ++ mark.Dtor(); ++ scan.Dtor(); ++ if(isLargeObject) ++ { ++ nointerior.Dtor(); ++ } ++ else ++ { ++ freebits.Dtor(); ++ } ++ finals.Dtor(); ++ noscan.Dtor(); ++ appendable.Dtor(); ++ } ++ ++ ++ void Invariant() const {} ++ ++ ++ invariant() ++ { ++ //mark.Invariant(); ++ //scan.Invariant(); ++ //freebits.Invariant(); ++ //finals.Invariant(); ++ //noscan.Invariant(); ++ //appendable.Invariant(); ++ //nointerior.Invariant(); ++ ++ if (baseAddr) ++ { ++ //if (baseAddr + npages * PAGESIZE != topAddr) ++ //printf("baseAddr = %p, npages = %d, topAddr = %p\n", baseAddr, npages, topAddr); ++ assert(baseAddr + npages * PAGESIZE == topAddr); ++ } ++ ++ if(pagetable !is null) ++ { ++ for (size_t i = 0; i < npages; i++) ++ { ++ Bins bin = cast(Bins)pagetable[i]; ++ assert(bin < B_MAX); ++ } ++ } ++ } ++ ++ // The divisor used for determining bit indices. ++ @property private size_t divisor() ++ { ++ // NOTE: Since this is called by initialize it must be private or ++ // invariant() will be called and fail. ++ return isLargeObject ? PAGESIZE : 16; ++ } ++ ++ // Bit shift for fast division by divisor. ++ @property uint shiftBy() ++ { ++ return isLargeObject ? 12 : 4; ++ } ++ ++ void updateOffsets(size_t fromWhere) ++ { ++ assert(pagetable[fromWhere] == B_PAGE); ++ size_t pn = fromWhere + 1; ++ for(uint offset = 1; pn < npages; pn++, offset++) ++ { ++ if(pagetable[pn] != B_PAGEPLUS) break; ++ bPageOffsets[pn] = offset; ++ } ++ ++ // Store the size of the block in bPageOffsets[fromWhere]. ++ bPageOffsets[fromWhere] = cast(uint) (pn - fromWhere); ++ } ++ ++ /** ++ * Allocate n pages from Pool. ++ * Returns OPFAIL on failure. ++ */ ++ size_t allocPages(size_t n) ++ { ++ if(freepages < n) return OPFAIL; ++ size_t i; ++ size_t n2; ++ ++ //debug(PRINTF) printf("Pool::allocPages(n = %d)\n", n); ++ n2 = n; ++ for (i = searchStart; i < npages; i++) ++ { ++ if (pagetable[i] == B_FREE) ++ { ++ if(pagetable[searchStart] < B_FREE) ++ { ++ searchStart = i + (!isLargeObject); ++ } ++ ++ if (--n2 == 0) ++ { //debug(PRINTF) printf("\texisting pn = %d\n", i - n + 1); ++ return i - n + 1; ++ } ++ } ++ else ++ { ++ n2 = n; ++ if(pagetable[i] == B_PAGE) ++ { ++ // Then we have the offset information. We can skip a ++ // whole bunch of stuff. ++ i += bPageOffsets[i] - 1; ++ } ++ } ++ } ++ ++ if(pagetable[searchStart] < B_FREE) ++ { ++ searchStart = npages; ++ } ++ ++ return OPFAIL; ++ } ++ ++ /** ++ * Free npages pages starting with pagenum. ++ */ ++ void freePages(size_t pagenum, size_t npages) ++ { ++ //memset(&pagetable[pagenum], B_FREE, npages); ++ if(pagenum < searchStart) searchStart = pagenum; ++ ++ for(size_t i = pagenum; i < npages + pagenum; i++) ++ { ++ if(pagetable[i] < B_FREE) ++ { ++ freepages++; ++ } ++ ++ pagetable[i] = B_FREE; ++ } ++ } ++ ++ ++ /** ++ * Used for sorting pooltable[] ++ */ ++ int opCmp(const Pool *p2) const ++ { ++ if (baseAddr < p2.baseAddr) ++ return -1; ++ else ++ return cast(int)(baseAddr > p2.baseAddr); ++ } + } + +-export extern (C) void gc_setProxy( Proxy* p ) ++ ++/* ============================ SENTINEL =============================== */ ++ ++ ++version (SENTINEL) + { +- if( proxy !is null ) ++ const size_t SENTINEL_PRE = cast(size_t) 0xF4F4F4F4F4F4F4F4UL; // 32 or 64 bits ++ const ubyte SENTINEL_POST = 0xF5; // 8 bits ++ const uint SENTINEL_EXTRA = 2 * size_t.sizeof + 1; ++ ++ ++ size_t* sentinel_size(void *p) { return &(cast(size_t *)p)[-2]; } ++ size_t* sentinel_pre(void *p) { return &(cast(size_t *)p)[-1]; } ++ ubyte* sentinel_post(void *p) { return &(cast(ubyte *)p)[*sentinel_size(p)]; } ++ ++ ++ void sentinel_init(void *p, size_t size) + { +- // TODO: Decide if this is an error condition. ++ *sentinel_size(p) = size; ++ *sentinel_pre(p) = SENTINEL_PRE; ++ *sentinel_post(p) = SENTINEL_POST; + } +- proxy = p; +- foreach( r; _gc.rootIter ) +- proxy.gc_addRoot( r ); +- foreach( r; _gc.rangeIter ) +- proxy.gc_addRange( r.pbot, r.ptop - r.pbot ); +-} + +-export extern (C) void gc_clrProxy() ++ ++ void sentinel_Invariant(const void *p) ++ { ++ assert(*sentinel_pre(p) == SENTINEL_PRE); ++ assert(*sentinel_post(p) == SENTINEL_POST); ++ } ++ ++ ++ void *sentinel_add(void *p) ++ { ++ return p + 2 * size_t.sizeof; ++ } ++ ++ ++ void *sentinel_sub(void *p) ++ { ++ return p - 2 * size_t.sizeof; ++ } ++} ++else + { +- foreach( r; _gc.rangeIter ) +- proxy.gc_removeRange( r.pbot ); +- foreach( r; _gc.rootIter ) +- proxy.gc_removeRoot( r ); +- proxy = null; ++ const uint SENTINEL_EXTRA = 0; ++ ++ ++ void sentinel_init(void *p, size_t size) ++ { ++ } ++ ++ ++ void sentinel_Invariant(const void *p) ++ { ++ } ++ ++ ++ void *sentinel_add(void *p) ++ { ++ return p; ++ } ++ ++ ++ void *sentinel_sub(void *p) ++ { ++ return p; ++ } + } +--- a/src/libphobos/libdruntime/gc/gcstats.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/gcstats.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,27 +0,0 @@ +-/** +- * Contains a struct for storing GC statistics. +- * +- * Copyright: Copyright Digital Mars 2005 - 2009. +- * License: Boost License 1.0. +- * Authors: Walter Bright, Sean Kelly +- */ +- +-/* Copyright Digital Mars 2005 - 2009. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module gc.gcstats; +- +- +-/** +- * +- */ +-struct GCStats +-{ +- size_t poolsize; // total size of pool +- size_t usedsize; // bytes allocated +- size_t freeblocks; // number of blocks marked FREE +- size_t freelistsize; // total of memory on free lists +- size_t pageblocks; // number of blocks marked PAGE +-} +--- a/src/libphobos/libdruntime/gc/gcx.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/gcx.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3441 +0,0 @@ +-/** +- * Contains the garbage collector implementation. +- * +- * Copyright: Copyright Digital Mars 2001 - 2009. +- * License: Boost License 1.0. +- * Authors: Walter Bright, David Friedman, Sean Kelly +- */ +- +-/* Copyright Digital Mars 2001 - 2009. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module gc.gcx; +- +-// D Programming Language Garbage Collector implementation +- +-/************** Debugging ***************************/ +- +-//debug = PRINTF; // turn on printf's +-//debug = COLLECT_PRINTF; // turn on printf's +-//debug = LOGGING; // log allocations / frees +-//debug = MEMSTOMP; // stomp on memory +-//debug = SENTINEL; // add underrun/overrrun protection +-//debug = PTRCHECK; // more pointer checking +-//debug = PTRCHECK2; // thorough but slow pointer checking +-//debug = PROFILING; // measure performance of various steps. +- +-/*************** Configuration *********************/ +- +-version = STACKGROWSDOWN; // growing the stack means subtracting from the stack pointer +- // (use for Intel X86 CPUs) +- // else growing the stack means adding to the stack pointer +- +-/***************************************************/ +- +-private import gc.gcbits; +-private import gc.gcstats; +-private import gc.gcalloc; +- +-private import cstdlib = core.stdc.stdlib : calloc, free, malloc, realloc; +-private import core.stdc.string; +-private import core.bitop; +-private import core.sync.mutex; +- +-version (GNU) import gcc.builtins; +- +-debug (PRINTF) import core.stdc.stdio : printf; +-debug (COLLECT_PRINTF) import core.stdc.stdio : printf; +-debug private import core.stdc.stdio; +- +-debug(PRINTF) void printFreeInfo(Pool* pool) +-{ +- uint nReallyFree; +- foreach(i; 0..pool.npages) { +- if(pool.pagetable[i] >= B_FREE) nReallyFree++; +- } +- +- printf("Pool %p: %d really free, %d supposedly free\n", pool, nReallyFree, pool.freepages); +-} +- +-debug(PROFILING) +-{ +- // Track total time spent preparing for GC, +- // marking, sweeping and recovering pages. +- import core.stdc.stdio, core.stdc.time; +- __gshared long prepTime; +- __gshared long markTime; +- __gshared long sweepTime; +- __gshared long recoverTime; +-} +- +-private +-{ +- enum USE_CACHE = true; +- +- // The maximum number of recursions of mark() before transitioning to +- // multiple heap traversals to avoid consuming O(D) stack space where +- // D is the depth of the heap graph. +- enum MAX_MARK_RECURSIONS = 64; +- +- enum BlkAttr : uint +- { +- FINALIZE = 0b0000_0001, +- NO_SCAN = 0b0000_0010, +- NO_MOVE = 0b0000_0100, +- APPENDABLE = 0b0000_1000, +- NO_INTERIOR = 0b0001_0000, +- ALL_BITS = 0b1111_1111 +- } +-} +- struct BlkInfo +- { +- void* base; +- size_t size; +- uint attr; +- } +-private +-{ +- extern (C) void rt_finalize2(void* p, bool det, bool resetMemory); +- +- extern (C) void thread_suspendAll(); +- extern (C) void thread_resumeAll(); +- +- // core.thread +- enum IsMarked : int +- { +- no, +- yes, +- unknown, // memory is not managed by GC +- } +- alias IsMarked delegate(void*) IsMarkedDg; +- extern (C) void thread_processGCMarks(scope IsMarkedDg isMarked); +- +- alias void delegate(void*, void*) scanFn; +- extern (C) void thread_scanAll(scope scanFn fn); +- +- extern (C) void onOutOfMemoryError(); +- extern (C) void onInvalidMemoryOperationError(); +- +- enum +- { +- OPFAIL = ~cast(size_t)0 +- } +-} +- +- +-alias GC gc_t; +- +- +-/* ======================= Leak Detector =========================== */ +- +- +-debug (LOGGING) +-{ +- struct Log +- { +- void* p; +- size_t size; +- size_t line; +- char* file; +- void* parent; +- +- void print() +- { +- printf(" p = %p, size = %zd, parent = %p ", p, size, parent); +- if (file) +- { +- printf("%s(%u)", file, line); +- } +- printf("\n"); +- } +- } +- +- +- struct LogArray +- { +- size_t dim; +- size_t allocdim; +- Log *data; +- +- void Dtor() +- { +- if (data) +- cstdlib.free(data); +- data = null; +- } +- +- void reserve(size_t nentries) +- { +- assert(dim <= allocdim); +- if (allocdim - dim < nentries) +- { +- allocdim = (dim + nentries) * 2; +- assert(dim + nentries <= allocdim); +- if (!data) +- { +- data = cast(Log*)cstdlib.malloc(allocdim * Log.sizeof); +- if (!data && allocdim) +- onOutOfMemoryError(); +- } +- else +- { Log *newdata; +- +- newdata = cast(Log*)cstdlib.malloc(allocdim * Log.sizeof); +- if (!newdata && allocdim) +- onOutOfMemoryError(); +- memcpy(newdata, data, dim * Log.sizeof); +- cstdlib.free(data); +- data = newdata; +- } +- } +- } +- +- +- void push(Log log) +- { +- reserve(1); +- data[dim++] = log; +- } +- +- void remove(size_t i) +- { +- memmove(data + i, data + i + 1, (dim - i) * Log.sizeof); +- dim--; +- } +- +- +- size_t find(void *p) +- { +- for (size_t i = 0; i < dim; i++) +- { +- if (data[i].p == p) +- return i; +- } +- return OPFAIL; // not found +- } +- +- +- void copy(LogArray *from) +- { +- reserve(from.dim - dim); +- assert(from.dim <= allocdim); +- memcpy(data, from.data, from.dim * Log.sizeof); +- dim = from.dim; +- } +- } +-} +- +- +-/* ============================ GC =============================== */ +- +- +-const uint GCVERSION = 1; // increment every time we change interface +- // to GC. +- +-// This just makes Mutex final to de-virtualize member function calls. +-final class GCMutex : Mutex {} +- +-class GC +-{ +- // For passing to debug code (not thread safe) +- __gshared size_t line; +- __gshared char* file; +- +- uint gcversion = GCVERSION; +- +- Gcx *gcx; // implementation +- +- // We can't allocate a Mutex on the GC heap because we are the GC. +- // Store it in the static data segment instead. +- __gshared GCMutex gcLock; // global lock +- __gshared byte[__traits(classInstanceSize, GCMutex)] mutexStorage; +- +- void initialize() +- { +- mutexStorage[] = GCMutex.classinfo.init[]; +- gcLock = cast(GCMutex) mutexStorage.ptr; +- gcLock.__ctor(); +- gcx = cast(Gcx*)cstdlib.calloc(1, Gcx.sizeof); +- if (!gcx) +- onOutOfMemoryError(); +- gcx.initialize(); +- } +- +- +- void Dtor() +- { +- version (linux) +- { +- //debug(PRINTF) printf("Thread %x ", pthread_self()); +- //debug(PRINTF) printf("GC.Dtor()\n"); +- } +- +- if (gcx) +- { +- gcx.Dtor(); +- cstdlib.free(gcx); +- gcx = null; +- } +- } +- +- +- /** +- * +- */ +- void enable() +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- assert(gcx.disabled > 0); +- gcx.disabled--; +- } +- +- +- /** +- * +- */ +- void disable() +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.disabled++; +- } +- +- +- /** +- * +- */ +- uint getAttr(void* p) +- { +- if (!p) +- { +- return 0; +- } +- +- uint go() +- { +- Pool* pool = gcx.findPool(p); +- uint oldb = 0; +- +- if (pool) +- { +- auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- oldb = gcx.getBits(pool, biti); +- } +- return oldb; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return go(); +- } +- +- +- /** +- * +- */ +- uint setAttr(void* p, uint mask) +- { +- if (!p) +- { +- return 0; +- } +- +- uint go() +- { +- Pool* pool = gcx.findPool(p); +- uint oldb = 0; +- +- if (pool) +- { +- auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- oldb = gcx.getBits(pool, biti); +- gcx.setBits(pool, biti, mask); +- } +- return oldb; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return go(); +- } +- +- +- /** +- * +- */ +- uint clrAttr(void* p, uint mask) +- { +- if (!p) +- { +- return 0; +- } +- +- uint go() +- { +- Pool* pool = gcx.findPool(p); +- uint oldb = 0; +- +- if (pool) +- { +- auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- oldb = gcx.getBits(pool, biti); +- gcx.clrBits(pool, biti, mask); +- } +- return oldb; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return go(); +- } +- +- +- /** +- * +- */ +- void *malloc(size_t size, uint bits = 0, size_t *alloc_size = null) +- { +- if (!size) +- { +- if(alloc_size) +- *alloc_size = 0; +- return null; +- } +- +- void* p = void; +- size_t localAllocSize = void; +- if(alloc_size is null) alloc_size = &localAllocSize; +- +- // Since a finalizer could launch a new thread, we always need to lock +- // when collecting. The safest way to do this is to simply always lock +- // when allocating. +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- p = mallocNoSync(size, bits, alloc_size); +- } +- +- if (!(bits & BlkAttr.NO_SCAN)) +- { +- memset(p + size, 0, *alloc_size - size); +- } +- +- return p; +- } +- +- +- // +- // +- // +- private void *mallocNoSync(size_t size, uint bits = 0, size_t *alloc_size = null) +- { +- assert(size != 0); +- +- void *p = null; +- Bins bin; +- +- //debug(PRINTF) printf("GC::malloc(size = %d, gcx = %p)\n", size, gcx); +- assert(gcx); +- //debug(PRINTF) printf("gcx.self = %x, pthread_self() = %x\n", gcx.self, pthread_self()); +- +- if (gcx.running) +- onInvalidMemoryOperationError(); +- +- size += SENTINEL_EXTRA; +- bin = gcx.findBin(size); +- Pool *pool; +- +- if (bin < B_PAGE) +- { +- if(alloc_size) +- *alloc_size = binsize[bin]; +- int state = gcx.disabled ? 1 : 0; +- bool collected = false; +- +- while (!gcx.bucket[bin] && !gcx.allocPage(bin)) +- { +- switch (state) +- { +- case 0: +- auto freedpages = gcx.fullcollect(); +- collected = true; +- if (freedpages < gcx.npools * ((POOLSIZE / PAGESIZE) / 8)) +- { /* Didn't free much, so try allocating more anyway. +- * Note: freedpages is not the amount of memory freed, it's the amount +- * of full pages freed. Perhaps this should instead be the amount of +- * memory freed. +- */ +- gcx.newPool(1,false); +- state = 2; +- } +- else +- state = 1; +- continue; +- case 1: +- gcx.newPool(1, false); +- state = 2; +- continue; +- case 2: +- if (collected) +- onOutOfMemoryError(); +- state = 0; +- continue; +- default: +- assert(false); +- } +- } +- p = gcx.bucket[bin]; +- +- // Return next item from free list +- gcx.bucket[bin] = (cast(List*)p).next; +- pool = (cast(List*)p).pool; +- //debug(PRINTF) printf("\tmalloc => %p\n", p); +- debug (MEMSTOMP) memset(p, 0xF0, size); +- } +- else +- { +- p = gcx.bigAlloc(size, &pool, alloc_size); +- if (!p) +- onOutOfMemoryError(); +- } +- size -= SENTINEL_EXTRA; +- p = sentinel_add(p); +- sentinel_init(p, size); +- gcx.log_malloc(p, size); +- +- if (bits) +- { +- gcx.setBits(pool, cast(size_t)(p - pool.baseAddr) >> pool.shiftBy, bits); +- } +- return p; +- } +- +- +- /** +- * +- */ +- void *calloc(size_t size, uint bits = 0, size_t *alloc_size = null) +- { +- if (!size) +- { +- if(alloc_size) +- *alloc_size = 0; +- return null; +- } +- +- size_t localAllocSize = void; +- void* p = void; +- if(alloc_size is null) alloc_size = &localAllocSize; +- +- // Since a finalizer could launch a new thread, we always need to lock +- // when collecting. The safest way to do this is to simply always lock +- // when allocating. +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- p = mallocNoSync(size, bits, alloc_size); +- } +- +- memset(p, 0, size); +- if (!(bits & BlkAttr.NO_SCAN)) +- { +- memset(p + size, 0, *alloc_size - size); +- } +- +- return p; +- } +- +- /** +- * +- */ +- void *realloc(void *p, size_t size, uint bits = 0, size_t *alloc_size = null) +- { +- size_t localAllocSize = void; +- auto oldp = p; +- if(alloc_size is null) alloc_size = &localAllocSize; +- +- // Since a finalizer could launch a new thread, we always need to lock +- // when collecting. The safest way to do this is to simply always lock +- // when allocating. +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- p = reallocNoSync(p, size, bits, alloc_size); +- } +- +- if (p !is oldp && !(bits & BlkAttr.NO_SCAN)) +- { +- memset(p + size, 0, *alloc_size - size); +- } +- +- return p; +- } +- +- +- // +- // +- // +- private void *reallocNoSync(void *p, size_t size, uint bits = 0, size_t *alloc_size = null) +- { +- if (gcx.running) +- onInvalidMemoryOperationError(); +- +- if (!size) +- { if (p) +- { freeNoSync(p); +- p = null; +- } +- if(alloc_size) +- *alloc_size = 0; +- } +- else if (!p) +- { +- p = mallocNoSync(size, bits, alloc_size); +- } +- else +- { void *p2; +- size_t psize; +- +- //debug(PRINTF) printf("GC::realloc(p = %p, size = %zu)\n", p, size); +- version (SENTINEL) +- { +- sentinel_Invariant(p); +- psize = *sentinel_size(p); +- if (psize != size) +- { +- if (psize) +- { +- Pool *pool = gcx.findPool(p); +- +- if (pool) +- { +- auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- if (bits) +- { +- gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); +- gcx.setBits(pool, biti, bits); +- } +- else +- { +- bits = gcx.getBits(pool, biti); +- } +- } +- } +- p2 = mallocNoSync(size, bits, alloc_size); +- if (psize < size) +- size = psize; +- //debug(PRINTF) printf("\tcopying %d bytes\n",size); +- memcpy(p2, p, size); +- p = p2; +- } +- } +- else +- { +- psize = gcx.findSize(p); // find allocated size +- if (psize >= PAGESIZE && size >= PAGESIZE) +- { +- auto psz = psize / PAGESIZE; +- auto newsz = (size + PAGESIZE - 1) / PAGESIZE; +- if (newsz == psz) +- return p; +- +- auto pool = gcx.findPool(p); +- auto pagenum = (p - pool.baseAddr) / PAGESIZE; +- +- if (newsz < psz) +- { // Shrink in place +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- debug (MEMSTOMP) memset(p + size, 0xF2, psize - size); +- pool.freePages(pagenum + newsz, psz - newsz); +- pool.updateOffsets(pagenum); +- } +- if(alloc_size) +- *alloc_size = newsz * PAGESIZE; +- return p; +- } +- else if (pagenum + newsz <= pool.npages) +- { +- // Attempt to expand in place +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- for (size_t i = pagenum + psz; 1;) +- { +- if (i == pagenum + newsz) +- { +- debug (MEMSTOMP) memset(p + psize, 0xF0, size - psize); +- debug(PRINTF) printFreeInfo(pool); +- memset(&pool.pagetable[pagenum + psz], B_PAGEPLUS, newsz - psz); +- pool.updateOffsets(pagenum); +- if(alloc_size) +- *alloc_size = newsz * PAGESIZE; +- pool.freepages -= (newsz - psz); +- debug(PRINTF) printFreeInfo(pool); +- return p; +- } +- if (i == pool.ncommitted) +- { +- auto u = pool.extendPages(pagenum + newsz - pool.ncommitted); +- if (u == OPFAIL) +- break; +- i = pagenum + newsz; +- continue; +- } +- if (pool.pagetable[i] != B_FREE) +- break; +- i++; +- } +- } +- } +- } +- if (psize < size || // if new size is bigger +- psize > size * 2) // or less than half +- { +- if (psize) +- { +- Pool *pool = gcx.findPool(p); +- +- if (pool) +- { +- auto biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- if (bits) +- { +- gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); +- gcx.setBits(pool, biti, bits); +- } +- else +- { +- bits = gcx.getBits(pool, biti); +- } +- } +- } +- p2 = mallocNoSync(size, bits, alloc_size); +- if (psize < size) +- size = psize; +- //debug(PRINTF) printf("\tcopying %d bytes\n",size); +- memcpy(p2, p, size); +- p = p2; +- } +- else if(alloc_size) +- *alloc_size = psize; +- } +- } +- return p; +- } +- +- +- /** +- * Attempt to in-place enlarge the memory block pointed to by p by at least +- * minbytes beyond its current capacity, up to a maximum of maxsize. This +- * does not attempt to move the memory block (like realloc() does). +- * +- * Returns: +- * 0 if could not extend p, +- * total size of entire memory block if successful. +- */ +- size_t extend(void* p, size_t minsize, size_t maxsize) +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return extendNoSync(p, minsize, maxsize); +- } +- +- +- // +- // +- // +- private size_t extendNoSync(void* p, size_t minsize, size_t maxsize) +- in +- { +- assert(minsize <= maxsize); +- } +- body +- { +- if (gcx.running) +- onInvalidMemoryOperationError(); +- +- //debug(PRINTF) printf("GC::extend(p = %p, minsize = %zu, maxsize = %zu)\n", p, minsize, maxsize); +- version (SENTINEL) +- { +- return 0; +- } +- auto psize = gcx.findSize(p); // find allocated size +- if (psize < PAGESIZE) +- return 0; // cannot extend buckets +- +- auto psz = psize / PAGESIZE; +- auto minsz = (minsize + PAGESIZE - 1) / PAGESIZE; +- auto maxsz = (maxsize + PAGESIZE - 1) / PAGESIZE; +- +- auto pool = gcx.findPool(p); +- auto pagenum = (p - pool.baseAddr) / PAGESIZE; +- +- size_t sz; +- for (sz = 0; sz < maxsz; sz++) +- { +- auto i = pagenum + psz + sz; +- if (i == pool.ncommitted) +- break; +- if (pool.pagetable[i] != B_FREE) +- { if (sz < minsz) +- return 0; +- break; +- } +- } +- if (sz >= minsz) +- { +- } +- else if (pagenum + psz + sz == pool.ncommitted) +- { +- /* This used to only allocate as little as possible, +- now we try to allocate up to maxsz pages*/ +- /*auto u = pool.extendPages(minsz - sz); +- if (u == OPFAIL) +- return 0; +- sz = minsz;*/ +- auto u = pool.extendPagesUpTo(maxsz - sz); +- if (u == OPFAIL || (u + sz < minsz)) +- return 0; +- sz += u; +- if(sz > maxsz) sz = maxsz; +- } +- else +- return 0; +- debug (MEMSTOMP) memset(p + psize, 0xF0, (psz + sz) * PAGESIZE - psize); +- memset(pool.pagetable + pagenum + psz, B_PAGEPLUS, sz); +- pool.updateOffsets(pagenum); +- pool.freepages -= sz; +- if (p == gcx.cached_size_key) +- gcx.cached_size_val = (psz + sz) * PAGESIZE; +- if (p == gcx.cached_info_key) +- gcx.cached_info_val.size = (psz + sz) * PAGESIZE; +- return (psz + sz) * PAGESIZE; +- } +- +- +- /** +- * +- */ +- size_t reserve(size_t size) +- { +- if (!size) +- { +- return 0; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return reserveNoSync(size); +- } +- +- +- // +- // +- // +- private size_t reserveNoSync(size_t size) +- { +- assert(size != 0); +- assert(gcx); +- +- if (gcx.running) +- onInvalidMemoryOperationError(); +- +- return gcx.reserve(size); +- } +- +- +- /** +- * +- */ +- void free(void *p) +- { +- if (!p) +- { +- return; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return freeNoSync(p); +- } +- +- +- // +- // +- // +- private void freeNoSync(void *p) +- { +- debug(PRINTF) printf("Freeing %p\n", cast(size_t) p); +- assert (p); +- +- if (gcx.running) +- onInvalidMemoryOperationError(); +- +- Pool* pool; +- size_t pagenum; +- Bins bin; +- size_t biti; +- +- // Find which page it is in +- pool = gcx.findPool(p); +- if (!pool) // if not one of ours +- return; // ignore +- sentinel_Invariant(p); +- p = sentinel_sub(p); +- pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; +- +- debug(PRINTF) printf("pool base = %p, PAGENUM = %d of %d / %d, bin = %d\n", pool.baseAddr, pagenum, pool.ncommitted, pool.npages, pool.pagetable[pagenum]); +- debug(PRINTF) if(pool.isLargeObject) printf("Block size = %d\n", pool.bPageOffsets[pagenum]); +- biti = cast(size_t)(p - pool.baseAddr) >> pool.shiftBy; +- +- gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); +- +- bin = cast(Bins)pool.pagetable[pagenum]; +- if (bin == B_PAGE) // if large alloc +- { size_t npages; +- +- // Free pages +- npages = pool.bPageOffsets[pagenum]; +- debug (MEMSTOMP) memset(p, 0xF2, npages * PAGESIZE); +- pool.freePages(pagenum, npages); +- } +- else +- { // Add to free list +- List *list = cast(List*)p; +- +- debug (MEMSTOMP) memset(p, 0xF2, binsize[bin]); +- +- list.next = gcx.bucket[bin]; +- list.pool = pool; +- gcx.bucket[bin] = list; +- } +- gcx.log_free(sentinel_add(p)); +- } +- +- +- /** +- * Determine the base address of the block containing p. If p is not a gc +- * allocated pointer, return null. +- */ +- void* addrOf(void *p) +- { +- if (!p) +- { +- return null; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return addrOfNoSync(p); +- } +- +- +- // +- // +- // +- void* addrOfNoSync(void *p) +- { +- if (!p) +- { +- return null; +- } +- +- return gcx.findBase(p); +- } +- +- +- /** +- * Determine the allocated size of pointer p. If p is an interior pointer +- * or not a gc allocated pointer, return 0. +- */ +- size_t sizeOf(void *p) +- { +- if (!p) +- { +- return 0; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return sizeOfNoSync(p); +- } +- +- +- // +- // +- // +- private size_t sizeOfNoSync(void *p) +- { +- assert (p); +- +- version (SENTINEL) +- { +- p = sentinel_sub(p); +- size_t size = gcx.findSize(p); +- +- // Check for interior pointer +- // This depends on: +- // 1) size is a power of 2 for less than PAGESIZE values +- // 2) base of memory pool is aligned on PAGESIZE boundary +- if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) +- size = 0; +- return size ? size - SENTINEL_EXTRA : 0; +- } +- else +- { +- size_t size = gcx.findSize(p); +- +- // Check for interior pointer +- // This depends on: +- // 1) size is a power of 2 for less than PAGESIZE values +- // 2) base of memory pool is aligned on PAGESIZE boundary +- if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) +- return 0; +- return size; +- } +- } +- +- +- /** +- * Determine the base address of the block containing p. If p is not a gc +- * allocated pointer, return null. +- */ +- BlkInfo query(void *p) +- { +- if (!p) +- { +- BlkInfo i; +- return i; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return queryNoSync(p); +- } +- +- +- // +- // +- // +- BlkInfo queryNoSync(void *p) +- { +- assert(p); +- +- return gcx.getInfo(p); +- } +- +- +- /** +- * Verify that pointer p: +- * 1) belongs to this memory pool +- * 2) points to the start of an allocated piece of memory +- * 3) is not on a free list +- */ +- void check(void *p) +- { +- if (!p) +- { +- return; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- checkNoSync(p); +- } +- +- +- // +- // +- // +- private void checkNoSync(void *p) +- { +- assert(p); +- +- sentinel_Invariant(p); +- debug (PTRCHECK) +- { +- Pool* pool; +- size_t pagenum; +- Bins bin; +- size_t size; +- +- p = sentinel_sub(p); +- pool = gcx.findPool(p); +- assert(pool); +- pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; +- bin = cast(Bins)pool.pagetable[pagenum]; +- assert(bin <= B_PAGE); +- size = binsize[bin]; +- assert((cast(size_t)p & (size - 1)) == 0); +- +- debug (PTRCHECK2) +- { +- if (bin < B_PAGE) +- { +- // Check that p is not on a free list +- List *list; +- +- for (list = gcx.bucket[bin]; list; list = list.next) +- { +- assert(cast(void*)list != p); +- } +- } +- } +- } +- } +- +- +- /** +- * add p to list of roots +- */ +- void addRoot(void *p) +- { +- if (!p) +- { +- return; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.addRoot(p); +- } +- +- +- /** +- * remove p from list of roots +- */ +- void removeRoot(void *p) +- { +- if (!p) +- { +- return; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.removeRoot(p); +- } +- +- +- /** +- * +- */ +- @property int delegate(int delegate(ref void*)) rootIter() +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return &gcx.rootIter; +- } +- +- +- /** +- * add range to scan for roots +- */ +- void addRange(void *p, size_t sz) +- { +- if (!p || !sz) +- { +- return; +- } +- +- //debug(PRINTF) printf("+GC.addRange(p = %p, sz = 0x%zx), p + sz = %p\n", p, sz, p + sz); +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.addRange(p, p + sz); +- +- //debug(PRINTF) printf("-GC.addRange()\n"); +- } +- +- +- /** +- * remove range +- */ +- void removeRange(void *p) +- { +- if (!p) +- { +- return; +- } +- +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.removeRange(p); +- } +- +- +- /** +- * +- */ +- @property int delegate(int delegate(ref Range)) rangeIter() +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- return &gcx.rangeIter; +- } +- +- +- /** +- * Do full garbage collection. +- * Return number of pages free'd. +- */ +- size_t fullCollect() +- { +- debug(PRINTF) printf("GC.fullCollect()\n"); +- size_t result; +- +- // Since a finalizer could launch a new thread, we always need to lock +- // when collecting. +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- result = gcx.fullcollect(); +- } +- +- version (none) +- { +- GCStats stats; +- +- getStats(stats); +- debug(PRINTF) printf("poolsize = %zx, usedsize = %zx, freelistsize = %zx\n", +- stats.poolsize, stats.usedsize, stats.freelistsize); +- } +- +- gcx.log_collect(); +- return result; +- } +- +- +- /** +- * do full garbage collection ignoring roots +- */ +- void fullCollectNoStack() +- { +- // Since a finalizer could launch a new thread, we always need to lock +- // when collecting. +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.noStack++; +- gcx.fullcollect(); +- gcx.noStack--; +- } +- } +- +- +- /** +- * minimize free space usage +- */ +- void minimize() +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- gcx.minimize(); +- } +- +- +- /** +- * Retrieve statistics about garbage collection. +- * Useful for debugging and tuning. +- */ +- void getStats(out GCStats stats) +- { +- gcLock.lock(); +- scope(exit) gcLock.unlock(); +- getStatsNoSync(stats); +- } +- +- +- // +- // +- // +- private void getStatsNoSync(out GCStats stats) +- { +- size_t psize = 0; +- size_t usize = 0; +- size_t flsize = 0; +- +- size_t n; +- size_t bsize = 0; +- +- //debug(PRINTF) printf("getStats()\n"); +- memset(&stats, 0, GCStats.sizeof); +- +- for (n = 0; n < gcx.npools; n++) +- { Pool *pool = gcx.pooltable[n]; +- +- psize += pool.ncommitted * PAGESIZE; +- for (size_t j = 0; j < pool.ncommitted; j++) +- { +- Bins bin = cast(Bins)pool.pagetable[j]; +- if (bin == B_FREE) +- stats.freeblocks++; +- else if (bin == B_PAGE) +- stats.pageblocks++; +- else if (bin < B_PAGE) +- bsize += PAGESIZE; +- } +- } +- +- for (n = 0; n < B_PAGE; n++) +- { +- //debug(PRINTF) printf("bin %d\n", n); +- for (List *list = gcx.bucket[n]; list; list = list.next) +- { +- //debug(PRINTF) printf("\tlist %p\n", list); +- flsize += binsize[n]; +- } +- } +- +- usize = bsize - flsize; +- +- stats.poolsize = psize; +- stats.usedsize = bsize - flsize; +- stats.freelistsize = flsize; +- } +-} +- +- +-/* ============================ Gcx =============================== */ +- +-enum +-{ PAGESIZE = 4096, +- COMMITSIZE = (4096*16), +- POOLSIZE = (4096*256), +-} +- +- +-enum +-{ +- B_16, +- B_32, +- B_64, +- B_128, +- B_256, +- B_512, +- B_1024, +- B_2048, +- B_PAGE, // start of large alloc +- B_PAGEPLUS, // continuation of large alloc +- B_FREE, // free page +- B_UNCOMMITTED, // memory not committed for this page +- B_MAX +-} +- +- +-alias ubyte Bins; +- +- +-struct List +-{ +- List *next; +- Pool *pool; +-} +- +- +-struct Range +-{ +- void *pbot; +- void *ptop; +-} +- +- +-immutable uint binsize[B_MAX] = [ 16,32,64,128,256,512,1024,2048,4096 ]; +-immutable size_t notbinsize[B_MAX] = [ ~(16-1),~(32-1),~(64-1),~(128-1),~(256-1), +- ~(512-1),~(1024-1),~(2048-1),~(4096-1) ]; +- +-/* ============================ Gcx =============================== */ +- +-struct Gcx +-{ +- void *cached_size_key; +- size_t cached_size_val; +- +- void *cached_info_key; +- BlkInfo cached_info_val; +- +- size_t nroots; +- size_t rootdim; +- void **roots; +- +- size_t nranges; +- size_t rangedim; +- Range *ranges; +- +- uint noStack; // !=0 means don't scan stack +- uint log; // turn on logging +- uint anychanges; +- uint inited; +- uint running; +- int disabled; // turn off collections if >0 +- +- byte *minAddr; // min(baseAddr) +- byte *maxAddr; // max(topAddr) +- +- size_t npools; +- Pool **pooltable; +- +- List *bucket[B_MAX]; // free list for each size +- +- +- void initialize() +- { int dummy; +- +- (cast(byte*)&this)[0 .. Gcx.sizeof] = 0; +- log_init(); +- //printf("gcx = %p, self = %x\n", &this, self); +- inited = 1; +- } +- +- +- void Dtor() +- { +- debug(PROFILING) +- { +- printf("\tTotal GC prep time: %d milliseconds\n", +- prepTime * 1000 / CLOCKS_PER_SEC); +- printf("\tTotal mark time: %d milliseconds\n", +- markTime * 1000 / CLOCKS_PER_SEC); +- printf("\tTotal sweep time: %d milliseconds\n", +- sweepTime * 1000 / CLOCKS_PER_SEC); +- printf("\tTotal page recovery time: %d milliseconds\n", +- recoverTime * 1000 / CLOCKS_PER_SEC); +- printf("\tGrand total GC time: %d milliseconds\n", +- 1000 * (recoverTime + sweepTime + markTime + prepTime) +- / CLOCKS_PER_SEC); +- } +- +- inited = 0; +- +- for (size_t i = 0; i < npools; i++) +- { Pool *pool = pooltable[i]; +- +- pool.Dtor(); +- cstdlib.free(pool); +- } +- if (pooltable) +- cstdlib.free(pooltable); +- +- if (roots) +- cstdlib.free(roots); +- +- if (ranges) +- cstdlib.free(ranges); +- } +- +- +- void Invariant() const { } +- +- +- invariant() +- { +- if (inited) +- { +- //printf("Gcx.invariant(): this = %p\n", &this); +- +- for (size_t i = 0; i < npools; i++) +- { auto pool = pooltable[i]; +- +- pool.Invariant(); +- if (i == 0) +- { +- assert(minAddr == pool.baseAddr); +- } +- if (i + 1 < npools) +- { +- assert(pool.opCmp(pooltable[i + 1]) < 0); +- } +- else if (i + 1 == npools) +- { +- assert(maxAddr == pool.topAddr); +- } +- } +- +- if (roots) +- { +- assert(rootdim != 0); +- assert(nroots <= rootdim); +- } +- +- if (ranges) +- { +- assert(rangedim != 0); +- assert(nranges <= rangedim); +- +- for (size_t i = 0; i < nranges; i++) +- { +- assert(ranges[i].pbot); +- assert(ranges[i].ptop); +- assert(ranges[i].pbot <= ranges[i].ptop); +- } +- } +- +- for (size_t i = 0; i < B_PAGE; i++) +- { +- for (auto list = cast(List*)bucket[i]; list; list = list.next) +- { +- } +- } +- } +- } +- +- +- /** +- * +- */ +- void addRoot(void *p) +- { +- if (nroots == rootdim) +- { +- size_t newdim = rootdim * 2 + 16; +- void** newroots; +- +- newroots = cast(void**)cstdlib.malloc(newdim * newroots[0].sizeof); +- if (!newroots) +- onOutOfMemoryError(); +- if (roots) +- { memcpy(newroots, roots, nroots * newroots[0].sizeof); +- cstdlib.free(roots); +- } +- roots = newroots; +- rootdim = newdim; +- } +- roots[nroots] = p; +- nroots++; +- } +- +- +- /** +- * +- */ +- void removeRoot(void *p) +- { +- for (size_t i = nroots; i--;) +- { +- if (roots[i] == p) +- { +- nroots--; +- memmove(roots + i, roots + i + 1, (nroots - i) * roots[0].sizeof); +- return; +- } +- } +- assert(0); +- } +- +- +- /** +- * +- */ +- int rootIter(int delegate(ref void*) dg) +- { +- int result = 0; +- for (size_t i = 0; i < nroots; ++i) +- { +- result = dg(roots[i]); +- if (result) +- break; +- } +- return result; +- } +- +- +- /** +- * +- */ +- void addRange(void *pbot, void *ptop) +- { +- //debug(PRINTF) printf("Thread %x ", pthread_self()); +- debug(PRINTF) printf("%p.Gcx::addRange(%p, %p), nranges = %d\n", &this, pbot, ptop, nranges); +- if (nranges == rangedim) +- { +- size_t newdim = rangedim * 2 + 16; +- Range *newranges; +- +- newranges = cast(Range*)cstdlib.malloc(newdim * newranges[0].sizeof); +- if (!newranges) +- onOutOfMemoryError(); +- if (ranges) +- { memcpy(newranges, ranges, nranges * newranges[0].sizeof); +- cstdlib.free(ranges); +- } +- ranges = newranges; +- rangedim = newdim; +- } +- ranges[nranges].pbot = pbot; +- ranges[nranges].ptop = ptop; +- nranges++; +- } +- +- +- /** +- * +- */ +- void removeRange(void *pbot) +- { +- //debug(PRINTF) printf("Thread %x ", pthread_self()); +- debug(PRINTF) printf("Gcx.removeRange(%p), nranges = %d\n", pbot, nranges); +- for (size_t i = nranges; i--;) +- { +- if (ranges[i].pbot == pbot) +- { +- nranges--; +- memmove(ranges + i, ranges + i + 1, (nranges - i) * ranges[0].sizeof); +- return; +- } +- } +- debug(PRINTF) printf("Wrong thread\n"); +- +- // This is a fatal error, but ignore it. +- // The problem is that we can get a Close() call on a thread +- // other than the one the range was allocated on. +- //assert(zero); +- } +- +- +- /** +- * +- */ +- int rangeIter(int delegate(ref Range) dg) +- { +- int result = 0; +- for (size_t i = 0; i < nranges; ++i) +- { +- result = dg(ranges[i]); +- if (result) +- break; +- } +- return result; +- } +- +- +- /** +- * Find Pool that pointer is in. +- * Return null if not in a Pool. +- * Assume pooltable[] is sorted. +- */ +- Pool *findPool(void *p) +- { +- if (p >= minAddr && p < maxAddr) +- { +- if (npools <= 1) +- { +- return npools == 0 ? null : pooltable[0]; +- } +- +- /* The pooltable[] is sorted by address, so do a binary search +- */ +- auto pt = pooltable; +- size_t low = 0; +- size_t high = npools - 1; +- while (low <= high) +- { +- size_t mid = (low + high) >> 1; +- auto pool = pt[mid]; +- if (p < pool.baseAddr) +- high = mid - 1; +- else if (p >= pool.topAddr) +- low = mid + 1; +- else +- return pool; +- } +- } +- return null; +- } +- +- +- /** +- * Find base address of block containing pointer p. +- * Returns null if not a gc'd pointer +- */ +- void* findBase(void *p) +- { +- Pool *pool; +- +- pool = findPool(p); +- if (pool) +- { +- size_t offset = cast(size_t)(p - pool.baseAddr); +- size_t pn = offset / PAGESIZE; +- Bins bin = cast(Bins)pool.pagetable[pn]; +- +- // Adjust bit to be at start of allocated memory block +- if (bin <= B_PAGE) +- { +- return pool.baseAddr + (offset & notbinsize[bin]); +- } +- else if (bin == B_PAGEPLUS) +- { +- auto pageOffset = pool.bPageOffsets[pn]; +- offset -= pageOffset * PAGESIZE; +- pn -= pageOffset; +- +- return pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); +- } +- else +- { +- // we are in a B_FREE or B_UNCOMMITTED page +- return null; +- } +- } +- return null; +- } +- +- +- /** +- * Find size of pointer p. +- * Returns 0 if not a gc'd pointer +- */ +- size_t findSize(void *p) +- { +- Pool* pool; +- size_t size = 0; +- +- if (USE_CACHE && p == cached_size_key) +- return cached_size_val; +- +- pool = findPool(p); +- if (pool) +- { +- size_t pagenum; +- Bins bin; +- +- pagenum = cast(size_t)(p - pool.baseAddr) / PAGESIZE; +- bin = cast(Bins)pool.pagetable[pagenum]; +- size = binsize[bin]; +- if (bin == B_PAGE) +- { +- size = pool.bPageOffsets[pagenum] * PAGESIZE; +- } +- cached_size_key = p; +- cached_size_val = size; +- } +- return size; +- } +- +- +- /** +- * +- */ +- BlkInfo getInfo(void* p) +- { +- Pool* pool; +- BlkInfo info; +- +- if (USE_CACHE && p == cached_info_key) +- return cached_info_val; +- +- pool = findPool(p); +- if (pool) +- { +- size_t offset = cast(size_t)(p - pool.baseAddr); +- size_t pn = offset / PAGESIZE; +- Bins bin = cast(Bins)pool.pagetable[pn]; +- +- //////////////////////////////////////////////////////////////////// +- // findAddr +- //////////////////////////////////////////////////////////////////// +- +- if (bin <= B_PAGE) +- { +- info.base = cast(void*)((cast(size_t)p) & notbinsize[bin]); +- } +- else if (bin == B_PAGEPLUS) +- { +- auto pageOffset = pool.bPageOffsets[pn]; +- offset = pageOffset * PAGESIZE; +- pn -= pageOffset; +- info.base = pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); +- +- // fix bin for use by size calc below +- bin = cast(Bins)pool.pagetable[pn]; +- } +- +- //////////////////////////////////////////////////////////////////// +- // findSize +- //////////////////////////////////////////////////////////////////// +- +- info.size = binsize[bin]; +- if (bin == B_PAGE) +- { +- info.size = pool.bPageOffsets[pn] * PAGESIZE; +- } +- +- //////////////////////////////////////////////////////////////////// +- // getBits +- //////////////////////////////////////////////////////////////////// +- +- // reset the offset to the base pointer, otherwise the bits +- // are the bits for the pointer, which may be garbage +- offset = cast(size_t)(info.base - pool.baseAddr); +- info.attr = getBits(pool, cast(size_t)(offset >> pool.shiftBy)); +- +- cached_info_key = p; +- cached_info_val = info; +- } +- return info; +- } +- +- +- /** +- * Compute bin for size. +- */ +- static Bins findBin(size_t size) +- { +- static const byte[2049] binTable = ctfeBins(); +- +- return (size <= 2048) ? +- (cast(Bins) binTable[size]) : +- B_PAGE; +- } +- +- static Bins findBinImpl(size_t size) +- { Bins bin; +- +- if (size <= 256) +- { +- if (size <= 64) +- { +- if (size <= 16) +- bin = B_16; +- else if (size <= 32) +- bin = B_32; +- else +- bin = B_64; +- } +- else +- { +- if (size <= 128) +- bin = B_128; +- else +- bin = B_256; +- } +- } +- else +- { +- if (size <= 1024) +- { +- if (size <= 512) +- bin = B_512; +- else +- bin = B_1024; +- } +- else +- { +- if (size <= 2048) +- bin = B_2048; +- else +- bin = B_PAGE; +- } +- } +- return bin; +- } +- +- /** +- * Computes the bin table using CTFE. +- */ +- static byte[2049] ctfeBins() +- { +- byte[2049] ret; +- for(size_t i = 0; i < 2049; i++) +- { +- ret[i] = cast(byte) findBinImpl(i); +- } +- +- return ret; +- } +- +- +- /** +- * Allocate a new pool of at least size bytes. +- * Sort it into pooltable[]. +- * Mark all memory in the pool as B_FREE. +- * Return the actual number of bytes reserved or 0 on error. +- */ +- size_t reserve(size_t size) +- { +- size_t npages = (size + PAGESIZE - 1) / PAGESIZE; +- +- // Assume reserve() is for small objects. +- Pool* pool = newPool(npages, false); +- +- if (!pool || pool.extendPages(npages) == OPFAIL) +- return 0; +- return pool.ncommitted * PAGESIZE; +- } +- +- +- /** +- * Minimizes physical memory usage by returning free pools to the OS. +- */ +- void minimize() +- { +- debug(PRINTF) printf("Minimizing.\n"); +- +- static bool isUsed(Pool *pool) +- { +- return pool.freepages < pool.npages; +- } +- +- // semi-stable partition +- for (size_t i = 0; i < npools; ++i) +- { +- auto pool = pooltable[i]; +- // find first unused pool +- if (isUsed(pool)) continue; +- +- // move used pools before unused ones +- size_t j = i + 1; +- for (; j < npools; ++j) +- { +- pool = pooltable[j]; +- if (!isUsed(pool)) continue; +- // swap +- pooltable[j] = pooltable[i]; +- pooltable[i] = pool; +- ++i; +- } +- // npooltable[0 .. i] => used +- // npooltable[i .. npools] => free +- +- // free unused pools +- for (j = i; j < npools; ++j) +- { +- pool = pooltable[j]; +- debug(PRINTF) printFreeInfo(pool); +- pool.Dtor(); +- cstdlib.free(pool); +- } +- npools = i; +- } +- +- if (npools) +- { +- minAddr = pooltable[0].baseAddr; +- maxAddr = pooltable[npools - 1].topAddr; +- } +- else +- { +- minAddr = maxAddr = null; +- } +- +- debug(PRINTF) printf("Done minimizing.\n"); +- } +- +- unittest +- { +- enum NPOOLS = 6; +- enum NPAGES = 10; +- Gcx gcx; +- +- void reset() +- { +- foreach(i, ref pool; gcx.pooltable[0 .. gcx.npools]) +- pool.freepages = pool.npages; +- gcx.minimize(); +- assert(gcx.npools == 0); +- +- if (gcx.pooltable is null) +- gcx.pooltable = cast(Pool**)cstdlib.malloc(NPOOLS * (Pool*).sizeof); +- foreach(i; 0 .. NPOOLS) +- { +- auto pool = cast(Pool*)cstdlib.malloc(Pool.sizeof); +- *pool = Pool.init; +- gcx.pooltable[i] = pool; +- } +- gcx.npools = NPOOLS; +- } +- +- void usePools() +- { +- foreach(pool; gcx.pooltable[0 .. NPOOLS]) +- { +- pool.pagetable = cast(ubyte*)cstdlib.malloc(NPAGES); +- memset(pool.pagetable, B_UNCOMMITTED, NPAGES); +- pool.npages = NPAGES; +- pool.freepages = NPAGES / 2; +- } +- } +- +- // all pools are free +- reset(); +- assert(gcx.npools == NPOOLS); +- gcx.minimize(); +- assert(gcx.npools == 0); +- +- // all pools used +- reset(); +- usePools(); +- assert(gcx.npools == NPOOLS); +- gcx.minimize(); +- assert(gcx.npools == NPOOLS); +- +- // preserves order of used pools +- reset(); +- usePools(); +- +- { +- version (Bug7068_FIXED) +- Pool*[NPOOLS] opools = gcx.pooltable[0 .. NPOOLS]; +- else +- { +- Pool*[NPOOLS] opools = void; +- memcpy(opools.ptr, gcx.pooltable, (Pool*).sizeof * NPOOLS); +- } +- gcx.pooltable[2].freepages = NPAGES; +- +- gcx.minimize(); +- assert(gcx.npools == NPOOLS - 1); +- assert(gcx.pooltable[0] == opools[0]); +- assert(gcx.pooltable[1] == opools[1]); +- assert(gcx.pooltable[2] == opools[3]); +- } +- +- // gcx reduces address span +- reset(); +- usePools(); +- +- byte* base, top; +- +- { +- byte*[NPOOLS] mem = void; +- foreach(i; 0 .. NPOOLS) +- mem[i] = cast(byte*)os_mem_map(NPAGES * PAGESIZE); +- +- extern(C) static int compare(in void* p1, in void *p2) +- { +- return p1 < p2 ? -1 : cast(int)(p2 > p1); +- } +- cstdlib.qsort(mem.ptr, mem.length, (byte*).sizeof, &compare); +- +- foreach(i, pool; gcx.pooltable[0 .. NPOOLS]) +- { +- pool.baseAddr = mem[i]; +- pool.topAddr = pool.baseAddr + NPAGES * PAGESIZE; +- } +- +- base = gcx.pooltable[0].baseAddr; +- top = gcx.pooltable[NPOOLS - 1].topAddr; +- } +- +- gcx.minimize(); +- assert(gcx.npools == NPOOLS); +- assert(gcx.minAddr == base); +- assert(gcx.maxAddr == top); +- +- gcx.pooltable[NPOOLS - 1].freepages = NPAGES; +- gcx.pooltable[NPOOLS - 2].freepages = NPAGES; +- +- gcx.minimize(); +- assert(gcx.npools == NPOOLS - 2); +- assert(gcx.minAddr == base); +- assert(gcx.maxAddr == gcx.pooltable[NPOOLS - 3].topAddr); +- +- gcx.pooltable[0].freepages = NPAGES; +- +- gcx.minimize(); +- assert(gcx.npools == NPOOLS - 3); +- assert(gcx.minAddr != base); +- assert(gcx.minAddr == gcx.pooltable[0].baseAddr); +- assert(gcx.maxAddr == gcx.pooltable[NPOOLS - 4].topAddr); +- +- // free all +- foreach(pool; gcx.pooltable[0 .. NPOOLS - 2]) +- pool.freepages = NPAGES; +- gcx.minimize(); +- assert(gcx.npools == 0); +- cstdlib.free(gcx.pooltable); +- } +- +- +- /** +- * Allocate a chunk of memory that is larger than a page. +- * Return null if out of memory. +- */ +- void *bigAlloc(size_t size, Pool **poolPtr, size_t *alloc_size = null) +- { +- debug(PRINTF) printf("In bigAlloc. Size: %d\n", size); +- +- Pool* pool; +- size_t npages; +- size_t n; +- size_t pn; +- size_t freedpages; +- void* p; +- int state; +- bool collected = false; +- +- npages = (size + PAGESIZE - 1) / PAGESIZE; +- +- for (state = disabled ? 1 : 0; ; ) +- { +- // This code could use some refinement when repeatedly +- // allocating very large arrays. +- +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- if(!pool.isLargeObject || pool.freepages < npages) continue; +- pn = pool.allocPages(npages); +- if (pn != OPFAIL) +- goto L1; +- } +- +- // Failed +- switch (state) +- { +- case 0: +- // Try collecting +- collected = true; +- freedpages = fullcollect(); +- if (freedpages >= npools * ((POOLSIZE / PAGESIZE) / 4)) +- { state = 1; +- continue; +- } +- // Release empty pools to prevent bloat +- minimize(); +- // Allocate new pool +- pool = newPool(npages, true); +- if (!pool) +- { state = 2; +- continue; +- } +- pn = pool.allocPages(npages); +- assert(pn != OPFAIL); +- goto L1; +- case 1: +- // Release empty pools to prevent bloat +- minimize(); +- // Allocate new pool +- pool = newPool(npages, true); +- if (!pool) +- { +- if (collected) +- goto Lnomemory; +- state = 0; +- continue; +- } +- pn = pool.allocPages(npages); +- assert(pn != OPFAIL); +- goto L1; +- case 2: +- goto Lnomemory; +- default: +- assert(false); +- } +- } +- +- L1: +- debug(PRINTF) printFreeInfo(pool); +- pool.pagetable[pn] = B_PAGE; +- if (npages > 1) +- memset(&pool.pagetable[pn + 1], B_PAGEPLUS, npages - 1); +- pool.updateOffsets(pn); +- pool.freepages -= npages; +- +- debug(PRINTF) printFreeInfo(pool); +- +- p = pool.baseAddr + pn * PAGESIZE; +- debug(PRINTF) printf("Got large alloc: %p, pt = %d, np = %d\n", p, pool.pagetable[pn], npages); +- debug (MEMSTOMP) memset(p, 0xF1, size); +- if(alloc_size) +- *alloc_size = npages * PAGESIZE; +- //debug(PRINTF) printf("\tp = %p\n", p); +- +- *poolPtr = pool; +- return p; +- +- Lnomemory: +- return null; // let caller handle the error +- } +- +- +- /** +- * Allocate a new pool with at least npages in it. +- * Sort it into pooltable[]. +- * Return null if failed. +- */ +- Pool *newPool(size_t npages, bool isLargeObject) +- { +- Pool* pool; +- Pool** newpooltable; +- size_t newnpools; +- size_t i; +- +- //debug(PRINTF) printf("************Gcx::newPool(npages = %d)****************\n", npages); +- +- // Round up to COMMITSIZE pages +- npages = (npages + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1); +- +- // Minimum of POOLSIZE +- if (npages < POOLSIZE/PAGESIZE) +- npages = POOLSIZE/PAGESIZE; +- else if (npages > POOLSIZE/PAGESIZE) +- { // Give us 150% of requested size, so there's room to extend +- auto n = npages + (npages >> 1); +- if (n < size_t.max/PAGESIZE) +- npages = n; +- } +- +- // Allocate successively larger pools up to 8 megs +- if (npools) +- { size_t n; +- +- n = npools; +- if (n > 32) +- n = 32; // cap pool size at 32 megs +- else if (n > 8) +- n = 16; +- n *= (POOLSIZE / PAGESIZE); +- if (npages < n) +- npages = n; +- } +- +- //printf("npages = %d\n", npages); +- +- pool = cast(Pool *)cstdlib.calloc(1, Pool.sizeof); +- if (pool) +- { +- pool.initialize(npages, isLargeObject); +- if (!pool.baseAddr) +- goto Lerr; +- +- newnpools = npools + 1; +- newpooltable = cast(Pool **)cstdlib.realloc(pooltable, newnpools * (Pool *).sizeof); +- if (!newpooltable) +- goto Lerr; +- +- // Sort pool into newpooltable[] +- for (i = 0; i < npools; i++) +- { +- if (pool.opCmp(newpooltable[i]) < 0) +- break; +- } +- memmove(newpooltable + i + 1, newpooltable + i, (npools - i) * (Pool *).sizeof); +- newpooltable[i] = pool; +- +- pooltable = newpooltable; +- npools = newnpools; +- +- minAddr = pooltable[0].baseAddr; +- maxAddr = pooltable[npools - 1].topAddr; +- } +- return pool; +- +- Lerr: +- pool.Dtor(); +- cstdlib.free(pool); +- return null; +- } +- +- +- /** +- * Allocate a page of bin's. +- * Returns: +- * 0 failed +- */ +- int allocPage(Bins bin) +- { +- Pool* pool; +- size_t n; +- size_t pn; +- byte* p; +- byte* ptop; +- +- //debug(PRINTF) printf("Gcx::allocPage(bin = %d)\n", bin); +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- if(pool.isLargeObject) continue; +- pn = pool.allocPages(1); +- if (pn != OPFAIL) +- goto L1; +- } +- return 0; // failed +- +- L1: +- pool.pagetable[pn] = cast(ubyte)bin; +- pool.freepages--; +- +- // Convert page to free list +- size_t size = binsize[bin]; +- List **b = &bucket[bin]; +- +- p = pool.baseAddr + pn * PAGESIZE; +- ptop = p + PAGESIZE; +- for (; p < ptop; p += size) +- { +- (cast(List *)p).next = *b; +- (cast(List *)p).pool = pool; +- *b = cast(List *)p; +- } +- return 1; +- } +- +- /** +- * Mark overload for initial mark() call. +- */ +- void mark(void *pbot, void *ptop) { +- mark(pbot, ptop, MAX_MARK_RECURSIONS); +- } +- +- /** +- * Search a range of memory values and mark any pointers into the GC pool. +- */ +- void mark(void *pbot, void *ptop, int nRecurse) +- { +- //import core.stdc.stdio;printf("nRecurse = %d\n", nRecurse); +- void **p1 = cast(void **)pbot; +- void **p2 = cast(void **)ptop; +- size_t pcache = 0; +- uint changes = 0; +- +- //printf("marking range: %p -> %p\n", pbot, ptop); +- for (; p1 < p2; p1++) +- { +- auto p = cast(byte *)(*p1); +- +- //if (log) debug(PRINTF) printf("\tmark %p\n", p); +- if (p >= minAddr && p < maxAddr) +- { +- if ((cast(size_t)p & ~cast(size_t)(PAGESIZE-1)) == pcache) +- continue; +- +- auto pool = findPool(p); +- if (pool) +- { +- size_t offset = cast(size_t)(p - pool.baseAddr); +- size_t biti = void; +- size_t pn = offset / PAGESIZE; +- Bins bin = cast(Bins)pool.pagetable[pn]; +- void* base = void; +- +- // For the NO_INTERIOR attribute. This tracks whether +- // the pointer is an interior pointer or points to the +- // base address of a block. +- bool pointsToBase = false; +- +- //debug(PRINTF) printf("\t\tfound pool %p, base=%p, pn = %zd, bin = %d, biti = x%x\n", pool, pool.baseAddr, pn, bin, biti); +- +- // Adjust bit to be at start of allocated memory block +- if (bin < B_PAGE) +- { +- // We don't care abou setting pointsToBase correctly +- // because it's ignored for small object pools anyhow. +- auto offsetBase = offset & notbinsize[bin]; +- biti = offsetBase >> pool.shiftBy; +- base = pool.baseAddr + offsetBase; +- //debug(PRINTF) printf("\t\tbiti = x%x\n", biti); +- } +- else if (bin == B_PAGE) +- { +- auto offsetBase = offset & notbinsize[bin]; +- base = pool.baseAddr + offsetBase; +- pointsToBase = offsetBase == offset; +- biti = offsetBase >> pool.shiftBy; +- //debug(PRINTF) printf("\t\tbiti = x%x\n", biti); +- +- pcache = cast(size_t)p & ~cast(size_t)(PAGESIZE-1); +- } +- else if (bin == B_PAGEPLUS) +- { +- pn -= pool.bPageOffsets[pn]; +- base = pool.baseAddr + (pn * PAGESIZE); +- biti = pn * (PAGESIZE >> pool.shiftBy); +- pcache = cast(size_t)p & ~cast(size_t)(PAGESIZE-1); +- } +- else +- { +- // Don't mark bits in B_FREE or B_UNCOMMITTED pages +- continue; +- } +- +- if(pool.nointerior.nbits && !pointsToBase && pool.nointerior.test(biti)) +- { +- continue; +- } +- +- //debug(PRINTF) printf("\t\tmark(x%x) = %d\n", biti, pool.mark.test(biti)); +- if (!pool.mark.testSet(biti)) +- { +- //if (log) debug(PRINTF) printf("\t\tmarking %p\n", p); +- if (!pool.noscan.test(biti)) +- { +- if(nRecurse == 0) { +- // Then we've got a really deep heap graph. +- // Start marking stuff to be scanned when we +- // traverse the heap again next time, to save +- // stack space. +- pool.scan.set(biti); +- changes = 1; +- pool.newChanges = true; +- } else { +- // Directly recurse mark() to prevent having +- // to traverse the heap O(D) times where D +- // is the max depth of the heap graph. +- if (bin < B_PAGE) +- { +- mark(base, base + binsize[bin], nRecurse - 1); +- } +- else +- { +- auto u = pool.bPageOffsets[pn]; +- mark(base, base + u * PAGESIZE, nRecurse - 1); +- } +- } +- } +- +- debug (LOGGING) log_parent(sentinel_add(pool.baseAddr + (biti << pool.shiftBy)), sentinel_add(pbot)); +- } +- } +- } +- } +- anychanges |= changes; +- } +- +- +- /** +- * Return number of full pages free'd. +- */ +- size_t fullcollect() +- { +- size_t n; +- Pool* pool; +- +- debug(PROFILING) +- { +- clock_t start, stop; +- start = clock(); +- } +- +- debug(COLLECT_PRINTF) printf("Gcx.fullcollect()\n"); +- //printf("\tpool address range = %p .. %p\n", minAddr, maxAddr); +- +- if (running) +- onInvalidMemoryOperationError(); +- running = 1; +- +- thread_suspendAll(); +- +- cached_size_key = cached_size_key.init; +- cached_size_val = cached_size_val.init; +- cached_info_key = cached_info_key.init; +- cached_info_val = cached_info_val.init; +- +- anychanges = 0; +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- pool.mark.zero(); +- pool.scan.zero(); +- if(!pool.isLargeObject) pool.freebits.zero(); +- } +- +- debug(COLLECT_PRINTF) printf("Set bits\n"); +- +- // Mark each free entry, so it doesn't get scanned +- for (n = 0; n < B_PAGE; n++) +- { +- for (List *list = bucket[n]; list; list = list.next) +- { +- pool = list.pool; +- assert(pool); +- pool.freebits.set(cast(size_t)(cast(byte*)list - pool.baseAddr) / 16); +- } +- } +- +- debug(COLLECT_PRINTF) printf("Marked free entries.\n"); +- +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- pool.newChanges = false; // Some of these get set to true on stack scan. +- if(!pool.isLargeObject) +- { +- pool.mark.copy(&pool.freebits); +- } +- } +- +- debug(PROFILING) +- { +- stop = clock(); +- prepTime += (stop - start); +- start = stop; +- } +- +- if (!noStack) +- { +- debug(COLLECT_PRINTF) printf("\tscan stacks.\n"); +- // Scan stacks and registers for each paused thread +- thread_scanAll(&mark); +- } +- +- // Scan roots[] +- debug(COLLECT_PRINTF) printf("\tscan roots[]\n"); +- mark(roots, roots + nroots); +- +- // Scan ranges[] +- debug(COLLECT_PRINTF) printf("\tscan ranges[]\n"); +- //log++; +- for (n = 0; n < nranges; n++) +- { +- debug(COLLECT_PRINTF) printf("\t\t%p .. %p\n", ranges[n].pbot, ranges[n].ptop); +- mark(ranges[n].pbot, ranges[n].ptop); +- } +- //log--; +- +- debug(COLLECT_PRINTF) printf("\tscan heap\n"); +- int nTraversals; +- while (anychanges) +- { +- //import core.stdc.stdio; printf("nTraversals = %d\n", ++nTraversals); +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- pool.oldChanges = pool.newChanges; +- pool.newChanges = false; +- } +- +- debug(COLLECT_PRINTF) printf("\t\tpass\n"); +- anychanges = 0; +- for (n = 0; n < npools; n++) +- { +- pool = pooltable[n]; +- if(!pool.oldChanges) continue; +- +- auto shiftBy = pool.shiftBy; +- auto bbase = pool.scan.base(); +- auto btop = bbase + pool.scan.nwords; +- //printf("\t\tn = %d, bbase = %p, btop = %p\n", n, bbase, btop); +- for (auto b = bbase; b < btop;) +- { +- auto bitm = *b; +- if (!bitm) +- { b++; +- continue; +- } +- *b = 0; +- +- auto o = pool.baseAddr + (b - bbase) * ((typeof(bitm).sizeof*8) << shiftBy); +- +- auto firstset = bsf(bitm); +- bitm >>= firstset; +- o += firstset << shiftBy; +- +- while(bitm) +- { +- auto pn = cast(size_t)(o - pool.baseAddr) / PAGESIZE; +- auto bin = cast(Bins)pool.pagetable[pn]; +- if (bin < B_PAGE) +- { +- mark(o, o + binsize[bin]); +- } +- else if (bin == B_PAGE) +- { +- auto u = pool.bPageOffsets[pn]; +- mark(o, o + u * PAGESIZE); +- } +- +- bitm >>= 1; +- auto nbits = bsf(bitm); +- bitm >>= nbits; +- o += (nbits + 1) << shiftBy; +- } +- } +- } +- } +- +- thread_processGCMarks(&isMarked); +- thread_resumeAll(); +- +- debug(PROFILING) +- { +- stop = clock(); +- markTime += (stop - start); +- start = stop; +- } +- +- // Free up everything not marked +- debug(COLLECT_PRINTF) printf("\tfree'ing\n"); +- size_t freedpages = 0; +- size_t freed = 0; +- for (n = 0; n < npools; n++) +- { size_t pn; +- +- pool = pooltable[n]; +- auto ncommitted = pool.ncommitted; +- +- if(pool.isLargeObject) +- { +- for(pn = 0; pn < ncommitted; pn++) +- { +- Bins bin = cast(Bins)pool.pagetable[pn]; +- if(bin > B_PAGE) continue; +- size_t biti = pn; +- +- if (!pool.mark.test(biti)) +- { byte *p = pool.baseAddr + pn * PAGESIZE; +- +- sentinel_Invariant(sentinel_add(p)); +- if (pool.finals.nbits && pool.finals.testClear(biti)) +- rt_finalize2(sentinel_add(p), false, false); +- clrBits(pool, biti, BlkAttr.ALL_BITS ^ BlkAttr.FINALIZE); +- +- debug(COLLECT_PRINTF) printf("\tcollecting big %p\n", p); +- log_free(sentinel_add(p)); +- pool.pagetable[pn] = B_FREE; +- if(pn < pool.searchStart) pool.searchStart = pn; +- freedpages++; +- pool.freepages++; +- +- debug (MEMSTOMP) memset(p, 0xF3, PAGESIZE); +- while (pn + 1 < ncommitted && pool.pagetable[pn + 1] == B_PAGEPLUS) +- { +- pn++; +- pool.pagetable[pn] = B_FREE; +- +- // Don't need to update searchStart here because +- // pn is guaranteed to be greater than last time +- // we updated it. +- +- pool.freepages++; +- freedpages++; +- +- debug (MEMSTOMP) +- { p += PAGESIZE; +- memset(p, 0xF3, PAGESIZE); +- } +- } +- } +- } +- +- continue; +- } +- else +- { +- +- for (pn = 0; pn < ncommitted; pn++) +- { +- Bins bin = cast(Bins)pool.pagetable[pn]; +- +- if (bin < B_PAGE) +- { +- auto size = binsize[bin]; +- byte *p = pool.baseAddr + pn * PAGESIZE; +- byte *ptop = p + PAGESIZE; +- size_t biti = pn * (PAGESIZE/16); +- size_t bitstride = size / 16; +- +- GCBits.wordtype toClear; +- size_t clearStart = (biti >> GCBits.BITS_SHIFT) + 1; +- size_t clearIndex; +- +- for (; p < ptop; p += size, biti += bitstride, clearIndex += bitstride) +- { +- if(clearIndex > GCBits.BITS_PER_WORD - 1) +- { +- if(toClear) +- { +- Gcx.clrBitsSmallSweep(pool, clearStart, toClear); +- toClear = 0; +- } +- +- clearStart = (biti >> GCBits.BITS_SHIFT) + 1; +- clearIndex = biti & GCBits.BITS_MASK; +- } +- +- if (!pool.mark.test(biti)) +- { +- sentinel_Invariant(sentinel_add(p)); +- +- pool.freebits.set(biti); +- if (pool.finals.nbits && pool.finals.test(biti)) +- rt_finalize2(sentinel_add(p), false, false); +- toClear |= GCBits.BITS_1 << clearIndex; +- +- List *list = cast(List *)p; +- debug(PRINTF) printf("\tcollecting %p\n", list); +- log_free(sentinel_add(list)); +- +- debug (MEMSTOMP) memset(p, 0xF3, size); +- +- freed += size; +- } +- } +- +- if(toClear) +- { +- Gcx.clrBitsSmallSweep(pool, clearStart, toClear); +- } +- } +- } +- } +- } +- +- debug(PROFILING) +- { +- stop = clock(); +- sweepTime += (stop - start); +- start = stop; +- } +- +- // Zero buckets +- bucket[] = null; +- +- // Free complete pages, rebuild free list +- debug(COLLECT_PRINTF) printf("\tfree complete pages\n"); +- size_t recoveredpages = 0; +- for (n = 0; n < npools; n++) +- { size_t pn; +- size_t ncommitted; +- +- pool = pooltable[n]; +- if(pool.isLargeObject) continue; +- ncommitted = pool.ncommitted; +- for (pn = 0; pn < ncommitted; pn++) +- { +- Bins bin = cast(Bins)pool.pagetable[pn]; +- size_t biti; +- size_t u; +- +- if (bin < B_PAGE) +- { +- size_t size = binsize[bin]; +- size_t bitstride = size / 16; +- size_t bitbase = pn * (PAGESIZE / 16); +- size_t bittop = bitbase + (PAGESIZE / 16); +- byte* p; +- +- biti = bitbase; +- for (biti = bitbase; biti < bittop; biti += bitstride) +- { if (!pool.freebits.test(biti)) +- goto Lnotfree; +- } +- pool.pagetable[pn] = B_FREE; +- if(pn < pool.searchStart) pool.searchStart = pn; +- pool.freepages++; +- recoveredpages++; +- continue; +- +- Lnotfree: +- p = pool.baseAddr + pn * PAGESIZE; +- for (u = 0; u < PAGESIZE; u += size) +- { biti = bitbase + u / 16; +- if (pool.freebits.test(biti)) +- { List *list; +- +- list = cast(List *)(p + u); +- if (list.next != bucket[bin]) // avoid unnecessary writes +- list.next = bucket[bin]; +- list.pool = pool; +- bucket[bin] = list; +- } +- } +- } +- } +- } +- +- debug(PROFILING) +- { +- stop = clock(); +- recoverTime += (stop - start); +- } +- +- debug(COLLECT_PRINTF) printf("\trecovered pages = %d\n", recoveredpages); +- debug(COLLECT_PRINTF) printf("\tfree'd %u bytes, %u pages from %u pools\n", freed, freedpages, npools); +- +- running = 0; // only clear on success +- +- return freedpages + recoveredpages; +- } +- +- /** +- * Returns true if the addr lies within a marked block. +- * +- * Warning! This should only be called while the world is stopped inside +- * the fullcollect function. +- */ +- IsMarked isMarked(void *addr) +- { +- // first, we find the Pool this block is in, then check to see if the +- // mark bit is clear. +- auto pool = findPool(addr); +- if(pool) +- { +- auto offset = cast(size_t)(addr - pool.baseAddr); +- auto pn = offset / PAGESIZE; +- auto bins = cast(Bins)pool.pagetable[pn]; +- size_t biti = void; +- if(bins <= B_PAGE) +- { +- biti = (offset & notbinsize[bins]) >> pool.shiftBy; +- } +- else +- { +- pn -= pool.bPageOffsets[pn]; +- biti = pn * (PAGESIZE >> pool.shiftBy); +- } +- return pool.mark.test(biti) ? IsMarked.yes : IsMarked.no; +- } +- return IsMarked.unknown; +- } +- +- +- /** +- * +- */ +- uint getBits(Pool* pool, size_t biti) +- in +- { +- assert(pool); +- } +- body +- { +- uint bits; +- +- if (pool.finals.nbits && +- pool.finals.test(biti)) +- bits |= BlkAttr.FINALIZE; +- if (pool.noscan.test(biti)) +- bits |= BlkAttr.NO_SCAN; +- if (pool.nointerior.nbits && pool.nointerior.test(biti)) +- bits |= BlkAttr.NO_INTERIOR; +-// if (pool.nomove.nbits && +-// pool.nomove.test(biti)) +-// bits |= BlkAttr.NO_MOVE; +- if (pool.appendable.test(biti)) +- bits |= BlkAttr.APPENDABLE; +- return bits; +- } +- +- +- /** +- * +- */ +- void setBits(Pool* pool, size_t biti, uint mask) +- in +- { +- assert(pool); +- } +- body +- { +- // Calculate the mask and bit offset once and then use it to +- // set all of the bits we need to set. +- immutable dataIndex = 1 + (biti >> GCBits.BITS_SHIFT); +- immutable bitOffset = biti & GCBits.BITS_MASK; +- immutable orWith = GCBits.BITS_1 << bitOffset; +- +- if (mask & BlkAttr.FINALIZE) +- { +- if (!pool.finals.nbits) +- pool.finals.alloc(pool.mark.nbits); +- pool.finals.data[dataIndex] |= orWith; +- } +- if (mask & BlkAttr.NO_SCAN) +- { +- pool.noscan.data[dataIndex] |= orWith; +- } +-// if (mask & BlkAttr.NO_MOVE) +-// { +-// if (!pool.nomove.nbits) +-// pool.nomove.alloc(pool.mark.nbits); +-// pool.nomove.data[dataIndex] |= orWith; +-// } +- if (mask & BlkAttr.APPENDABLE) +- { +- pool.appendable.data[dataIndex] |= orWith; +- } +- +- if (pool.isLargeObject && (mask & BlkAttr.NO_INTERIOR)) +- { +- if(!pool.nointerior.nbits) +- pool.nointerior.alloc(pool.mark.nbits); +- pool.nointerior.data[dataIndex] |= orWith; +- } +- } +- +- +- /** +- * +- */ +- void clrBits(Pool* pool, size_t biti, uint mask) +- in +- { +- assert(pool); +- } +- body +- { +- immutable dataIndex = 1 + (biti >> GCBits.BITS_SHIFT); +- immutable bitOffset = biti & GCBits.BITS_MASK; +- immutable keep = ~(GCBits.BITS_1 << bitOffset); +- +- if (mask & BlkAttr.FINALIZE && pool.finals.nbits) +- pool.finals.data[dataIndex] &= keep; +- if (mask & BlkAttr.NO_SCAN) +- pool.noscan.data[dataIndex] &= keep; +-// if (mask & BlkAttr.NO_MOVE && pool.nomove.nbits) +-// pool.nomove.data[dataIndex] &= keep; +- if (mask & BlkAttr.APPENDABLE) +- pool.appendable.data[dataIndex] &= keep; +- if (pool.nointerior.nbits && (mask & BlkAttr.NO_INTERIOR)) +- pool.nointerior.data[dataIndex] &= keep; +- } +- +- void clrBitsSmallSweep(Pool* pool, size_t dataIndex, GCBits.wordtype toClear) +- in +- { +- assert(pool); +- } +- body +- { +- immutable toKeep = ~toClear; +- if (pool.finals.nbits) +- pool.finals.data[dataIndex] &= toKeep; +- +- pool.noscan.data[dataIndex] &= toKeep; +- +-// if (pool.nomove.nbits) +-// pool.nomove.data[dataIndex] &= toKeep; +- +- pool.appendable.data[dataIndex] &= toKeep; +- +- if (pool.nointerior.nbits) +- pool.nointerior.data[dataIndex] &= toKeep; +- } +- +- /***** Leak Detector ******/ +- +- +- debug (LOGGING) +- { +- LogArray current; +- LogArray prev; +- +- +- void log_init() +- { +- //debug(PRINTF) printf("+log_init()\n"); +- current.reserve(1000); +- prev.reserve(1000); +- //debug(PRINTF) printf("-log_init()\n"); +- } +- +- +- void log_malloc(void *p, size_t size) +- { +- //debug(PRINTF) printf("+log_malloc(p = %p, size = %zd)\n", p, size); +- Log log; +- +- log.p = p; +- log.size = size; +- log.line = GC.line; +- log.file = GC.file; +- log.parent = null; +- +- GC.line = 0; +- GC.file = null; +- +- current.push(log); +- //debug(PRINTF) printf("-log_malloc()\n"); +- } +- +- +- void log_free(void *p) +- { +- //debug(PRINTF) printf("+log_free(%p)\n", p); +- auto i = current.find(p); +- if (i == OPFAIL) +- { +- debug(PRINTF) printf("free'ing unallocated memory %p\n", p); +- } +- else +- current.remove(i); +- //debug(PRINTF) printf("-log_free()\n"); +- } +- +- +- void log_collect() +- { +- //debug(PRINTF) printf("+log_collect()\n"); +- // Print everything in current that is not in prev +- +- debug(PRINTF) printf("New pointers this cycle: --------------------------------\n"); +- size_t used = 0; +- for (size_t i = 0; i < current.dim; i++) +- { +- auto j = prev.find(current.data[i].p); +- if (j == OPFAIL) +- current.data[i].print(); +- else +- used++; +- } +- +- debug(PRINTF) printf("All roots this cycle: --------------------------------\n"); +- for (size_t i = 0; i < current.dim; i++) +- { +- void* p = current.data[i].p; +- if (!findPool(current.data[i].parent)) +- { +- auto j = prev.find(current.data[i].p); +- debug(PRINTF) printf(j == OPFAIL ? "N" : " "); +- current.data[i].print(); +- } +- } +- +- debug(PRINTF) printf("Used = %d-------------------------------------------------\n", used); +- prev.copy(¤t); +- +- debug(PRINTF) printf("-log_collect()\n"); +- } +- +- +- void log_parent(void *p, void *parent) +- { +- //debug(PRINTF) printf("+log_parent()\n"); +- auto i = current.find(p); +- if (i == OPFAIL) +- { +- debug(PRINTF) printf("parent'ing unallocated memory %p, parent = %p\n", p, parent); +- Pool *pool; +- pool = findPool(p); +- assert(pool); +- size_t offset = cast(size_t)(p - pool.baseAddr); +- size_t biti; +- size_t pn = offset / PAGESIZE; +- Bins bin = cast(Bins)pool.pagetable[pn]; +- biti = (offset & notbinsize[bin]); +- debug(PRINTF) printf("\tbin = %d, offset = x%x, biti = x%x\n", bin, offset, biti); +- } +- else +- { +- current.data[i].parent = parent; +- } +- //debug(PRINTF) printf("-log_parent()\n"); +- } +- +- } +- else +- { +- void log_init() { } +- void log_malloc(void *p, size_t size) { } +- void log_free(void *p) { } +- void log_collect() { } +- void log_parent(void *p, void *parent) { } +- } +-} +- +- +-/* ============================ Pool =============================== */ +- +- +-struct Pool +-{ +- byte* baseAddr; +- byte* topAddr; +- GCBits mark; // entries already scanned, or should not be scanned +- GCBits scan; // entries that need to be scanned +- GCBits freebits; // entries that are on the free list +- GCBits finals; // entries that need finalizer run on them +- GCBits noscan; // entries that should not be scanned +- GCBits appendable; // entries that are appendable +- GCBits nointerior; // interior pointers should be ignored. +- // Only implemented for large object pools. +- +- size_t npages; +- size_t freepages; // The number of pages not in use. +- size_t ncommitted; // ncommitted <= npages +- ubyte* pagetable; +- +- bool isLargeObject; +- bool oldChanges; // Whether there were changes on the last mark. +- bool newChanges; // Whether there were changes on the current mark. +- +- // This tracks how far back we have to go to find the nearest B_PAGE at +- // a smaller address than a B_PAGEPLUS. To save space, we use a uint. +- // This limits individual allocations to 16 terabytes, assuming a 4k +- // pagesize. +- uint* bPageOffsets; +- +- // This variable tracks a conservative estimate of where the first free +- // page in this pool is, so that if a lot of pages towards the beginning +- // are occupied, we can bypass them in O(1). +- size_t searchStart; +- +- void initialize(size_t npages, bool isLargeObject) +- { +- this.isLargeObject = isLargeObject; +- size_t poolsize; +- +- //debug(PRINTF) printf("Pool::Pool(%u)\n", npages); +- poolsize = npages * PAGESIZE; +- assert(poolsize >= POOLSIZE); +- baseAddr = cast(byte *)os_mem_map(poolsize); +- +- // Some of the code depends on page alignment of memory pools +- assert((cast(size_t)baseAddr & (PAGESIZE - 1)) == 0); +- +- if (!baseAddr) +- { +- //debug(PRINTF) printf("GC fail: poolsize = x%zx, errno = %d\n", poolsize, errno); +- //debug(PRINTF) printf("message = '%s'\n", sys_errlist[errno]); +- +- npages = 0; +- poolsize = 0; +- } +- //assert(baseAddr); +- topAddr = baseAddr + poolsize; +- auto div = this.divisor; +- auto nbits = cast(size_t)poolsize / div; +- +- mark.alloc(nbits); +- scan.alloc(nbits); +- +- // pagetable already keeps track of what's free for the large object +- // pool. +- if(!isLargeObject) +- { +- freebits.alloc(nbits); +- } +- +- noscan.alloc(nbits); +- appendable.alloc(nbits); +- +- pagetable = cast(ubyte*)cstdlib.malloc(npages); +- if (!pagetable) +- onOutOfMemoryError(); +- +- if(isLargeObject) +- { +- bPageOffsets = cast(uint*)cstdlib.malloc(npages * uint.sizeof); +- if (!bPageOffsets) +- onOutOfMemoryError(); +- } +- +- memset(pagetable, B_UNCOMMITTED, npages); +- +- this.npages = npages; +- this.freepages = npages; +- ncommitted = 0; +- } +- +- +- void Dtor() +- { +- if (baseAddr) +- { +- int result; +- +- if (ncommitted) +- { +- result = os_mem_decommit(baseAddr, 0, ncommitted * PAGESIZE); +- assert(result == 0); +- ncommitted = 0; +- } +- +- if (npages) +- { +- result = os_mem_unmap(baseAddr, npages * PAGESIZE); +- assert(result == 0); +- npages = 0; +- } +- +- baseAddr = null; +- topAddr = null; +- } +- if (pagetable) +- cstdlib.free(pagetable); +- +- if(bPageOffsets) +- cstdlib.free(bPageOffsets); +- +- mark.Dtor(); +- scan.Dtor(); +- if(isLargeObject) +- { +- nointerior.Dtor(); +- } +- else +- { +- freebits.Dtor(); +- } +- finals.Dtor(); +- noscan.Dtor(); +- appendable.Dtor(); +- } +- +- +- void Invariant() const {} +- +- +- invariant() +- { +- //mark.Invariant(); +- //scan.Invariant(); +- //freebits.Invariant(); +- //finals.Invariant(); +- //noscan.Invariant(); +- //appendable.Invariant(); +- //nointerior.Invariant(); +- +- if (baseAddr) +- { +- //if (baseAddr + npages * PAGESIZE != topAddr) +- //printf("baseAddr = %p, npages = %d, topAddr = %p\n", baseAddr, npages, topAddr); +- assert(baseAddr + npages * PAGESIZE == topAddr); +- assert(ncommitted <= npages); +- } +- +- for (size_t i = 0; i < npages; i++) +- { +- Bins bin = cast(Bins)pagetable[i]; +- assert(bin < B_MAX); +- } +- } +- +- // The divisor used for determining bit indices. +- @property private size_t divisor() +- { +- // NOTE: Since this is called by initialize it must be private or +- // invariant() will be called and fail. +- return isLargeObject ? PAGESIZE : 16; +- } +- +- // Bit shift for fast division by divisor. +- @property uint shiftBy() +- { +- return isLargeObject ? 12 : 4; +- } +- +- void updateOffsets(size_t fromWhere) +- { +- assert(pagetable[fromWhere] == B_PAGE); +- size_t pn = fromWhere + 1; +- for(uint offset = 1; pn < ncommitted; pn++, offset++) +- { +- if(pagetable[pn] != B_PAGEPLUS) break; +- bPageOffsets[pn] = offset; +- } +- +- // Store the size of the block in bPageOffsets[fromWhere]. +- bPageOffsets[fromWhere] = cast(uint) (pn - fromWhere); +- } +- +- /** +- * Allocate n pages from Pool. +- * Returns OPFAIL on failure. +- */ +- size_t allocPages(size_t n) +- { +- if(freepages < n) return OPFAIL; +- size_t i; +- size_t n2; +- +- //debug(PRINTF) printf("Pool::allocPages(n = %d)\n", n); +- n2 = n; +- for (i = searchStart; i < ncommitted; i++) +- { +- if (pagetable[i] == B_FREE) +- { +- if(pagetable[searchStart] < B_FREE) +- { +- searchStart = i + (!isLargeObject); +- } +- +- if (--n2 == 0) +- { //debug(PRINTF) printf("\texisting pn = %d\n", i - n + 1); +- return i - n + 1; +- } +- } +- else +- { +- n2 = n; +- if(pagetable[i] == B_PAGE) +- { +- // Then we have the offset information. We can skip a +- // whole bunch of stuff. +- i += bPageOffsets[i] - 1; +- } +- } +- } +- +- if(pagetable[searchStart] < B_FREE) +- { +- searchStart = ncommitted; +- } +- +- return extendPages(n); +- } +- +- /** +- * Extend Pool by n pages. +- * Returns OPFAIL on failure. +- */ +- size_t extendPages(size_t n) +- { +- //debug(PRINTF) printf("Pool::extendPages(n = %d)\n", n); +- if (ncommitted + n <= npages) +- { +- size_t tocommit; +- +- tocommit = (n + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1); +- if (ncommitted + tocommit > npages) +- tocommit = npages - ncommitted; +- //debug(PRINTF) printf("\tlooking to commit %d more pages\n", tocommit); +- //fflush(stdout); +- if (os_mem_commit(baseAddr, ncommitted * PAGESIZE, tocommit * PAGESIZE) == 0) +- { +- memset(pagetable + ncommitted, B_FREE, tocommit); +- auto i = ncommitted; +- ncommitted += tocommit; +- +- while (i && pagetable[i - 1] == B_FREE) +- i--; +- +- return i; +- } +- //debug(PRINTF) printf("\tfailed to commit %d pages\n", tocommit); +- } +- +- return OPFAIL; +- } +- +- /** +- * extends pages up to at least n pages. Returns the number of pages +- * added. +- */ +- size_t extendPagesUpTo(size_t n) +- { +- //debug(PRINTF) printf("Pool::extendPagesUpTo(n = %d)\n", n); +- if (ncommitted + n > npages) +- n = npages - ncommitted; +- size_t tocommit; +- +- tocommit = (n + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1); +- if (ncommitted + tocommit > npages) +- tocommit = npages - ncommitted; +- if(tocommit == 0) +- return 0; +- //debug(PRINTF) printf("\tlooking to commit %d more pages\n", tocommit); +- //fflush(stdout); +- if (os_mem_commit(baseAddr, ncommitted * PAGESIZE, tocommit * PAGESIZE) == 0) +- { +- memset(pagetable + ncommitted, B_FREE, tocommit); +- ncommitted += tocommit; +- +- return tocommit > n; +- } +- //debug(PRINTF) printf("\tfailed to commit %d pages\n", tocommit); +- +- return OPFAIL; +- } +- +- +- /** +- * Free npages pages starting with pagenum. +- */ +- void freePages(size_t pagenum, size_t npages) +- { +- //memset(&pagetable[pagenum], B_FREE, npages); +- if(pagenum < searchStart) searchStart = pagenum; +- +- for(size_t i = pagenum; i < npages + pagenum; i++) +- { +- if(pagetable[i] < B_FREE) +- { +- freepages++; +- } +- +- pagetable[i] = B_FREE; +- } +- } +- +- +- /** +- * Used for sorting pooltable[] +- */ +- int opCmp(const Pool *p2) const +- { +- if (baseAddr < p2.baseAddr) +- return -1; +- else +- return cast(int)(baseAddr > p2.baseAddr); +- } +-} +- +- +-/* ============================ SENTINEL =============================== */ +- +- +-version (SENTINEL) +-{ +- const size_t SENTINEL_PRE = cast(size_t) 0xF4F4F4F4F4F4F4F4UL; // 32 or 64 bits +- const ubyte SENTINEL_POST = 0xF5; // 8 bits +- const uint SENTINEL_EXTRA = 2 * size_t.sizeof + 1; +- +- +- size_t* sentinel_size(void *p) { return &(cast(size_t *)p)[-2]; } +- size_t* sentinel_pre(void *p) { return &(cast(size_t *)p)[-1]; } +- ubyte* sentinel_post(void *p) { return &(cast(ubyte *)p)[*sentinel_size(p)]; } +- +- +- void sentinel_init(void *p, size_t size) +- { +- *sentinel_size(p) = size; +- *sentinel_pre(p) = SENTINEL_PRE; +- *sentinel_post(p) = SENTINEL_POST; +- } +- +- +- void sentinel_Invariant(const void *p) +- { +- assert(*sentinel_pre(p) == SENTINEL_PRE); +- assert(*sentinel_post(p) == SENTINEL_POST); +- } +- +- +- void *sentinel_add(void *p) +- { +- return p + 2 * size_t.sizeof; +- } +- +- +- void *sentinel_sub(void *p) +- { +- return p - 2 * size_t.sizeof; +- } +-} +-else +-{ +- const uint SENTINEL_EXTRA = 0; +- +- +- void sentinel_init(void *p, size_t size) +- { +- } +- +- +- void sentinel_Invariant(const void *p) +- { +- } +- +- +- void *sentinel_add(void *p) +- { +- return p; +- } +- +- +- void *sentinel_sub(void *p) +- { +- return p; +- } +-} +--- a/src/libphobos/libdruntime/gc/os.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/os.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,141 @@ ++/** ++ * Contains OS-level routines needed by the garbage collector. ++ * ++ * Copyright: Copyright Digital Mars 2005 - 2013. ++ * License: Boost License 1.0. ++ * Authors: Walter Bright, David Friedman, Sean Kelly, Leandro Lucarella ++ */ ++ ++/* Copyright Digital Mars 2005 - 2013. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module gc.os; ++ ++ ++version (Windows) ++{ ++ import core.sys.windows.windows; ++ ++ alias int pthread_t; ++ ++ pthread_t pthread_self() ++ { ++ return cast(pthread_t) GetCurrentThreadId(); ++ } ++ ++ //version = GC_Use_Alloc_Win32; ++} ++else version (Posix) ++{ ++ import core.sys.posix.sys.mman; ++ version (linux) import core.sys.linux.sys.mman : MAP_ANON; ++ import core.stdc.stdlib; ++ ++ //version = GC_Use_Alloc_MMap; ++} ++else ++{ ++ import core.stdc.stdlib; ++ ++ //version = GC_Use_Alloc_Malloc; ++} ++ ++/+ ++static if(is(typeof(VirtualAlloc))) ++ version = GC_Use_Alloc_Win32; ++else static if (is(typeof(mmap))) ++ version = GC_Use_Alloc_MMap; ++else static if (is(typeof(valloc))) ++ version = GC_Use_Alloc_Valloc; ++else static if (is(typeof(malloc))) ++ version = GC_Use_Alloc_Malloc; ++else static assert(false, "No supported allocation methods available."); +++/ ++ ++static if (is(typeof(VirtualAlloc))) // version (GC_Use_Alloc_Win32) ++{ ++ /** ++ * Map memory. ++ */ ++ void *os_mem_map(size_t nbytes) ++ { ++ return VirtualAlloc(null, nbytes, MEM_RESERVE | MEM_COMMIT, ++ PAGE_READWRITE); ++ } ++ ++ ++ /** ++ * Unmap memory allocated with os_mem_map(). ++ * Returns: ++ * 0 success ++ * !=0 failure ++ */ ++ int os_mem_unmap(void *base, size_t nbytes) ++ { ++ return cast(int)(VirtualFree(base, 0, MEM_RELEASE) == 0); ++ } ++} ++else static if (is(typeof(mmap))) // else version (GC_Use_Alloc_MMap) ++{ ++ void *os_mem_map(size_t nbytes) ++ { void *p; ++ ++ p = mmap(null, nbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); ++ return (p == MAP_FAILED) ? null : p; ++ } ++ ++ ++ int os_mem_unmap(void *base, size_t nbytes) ++ { ++ return munmap(base, nbytes); ++ } ++} ++else static if (is(typeof(valloc))) // else version (GC_Use_Alloc_Valloc) ++{ ++ void *os_mem_map(size_t nbytes) ++ { ++ return valloc(nbytes); ++ } ++ ++ ++ int os_mem_unmap(void *base, size_t nbytes) ++ { ++ free(base); ++ return 0; ++ } ++} ++else static if (is(typeof(malloc))) // else version (GC_Use_Alloc_Malloc) ++{ ++ // NOTE: This assumes malloc granularity is at least (void*).sizeof. If ++ // (req_size + PAGESIZE) is allocated, and the pointer is rounded up ++ // to PAGESIZE alignment, there will be space for a void* at the end ++ // after PAGESIZE bytes used by the GC. ++ ++ ++ import gc.gc; ++ ++ ++ const size_t PAGE_MASK = PAGESIZE - 1; ++ ++ ++ void *os_mem_map(size_t nbytes) ++ { byte *p, q; ++ p = cast(byte *) malloc(nbytes + PAGESIZE); ++ q = p + ((PAGESIZE - ((cast(size_t) p & PAGE_MASK))) & PAGE_MASK); ++ * cast(void**)(q + nbytes) = p; ++ return q; ++ } ++ ++ ++ int os_mem_unmap(void *base, size_t nbytes) ++ { ++ free( *cast(void**)( cast(byte*) base + nbytes ) ); ++ return 0; ++ } ++} ++else ++{ ++ static assert(false, "No supported allocation methods available."); ++} +--- a/src/libphobos/libdruntime/gc/proxy.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/proxy.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,348 @@ ++/** ++ * Contains the external GC interface. ++ * ++ * Copyright: Copyright Digital Mars 2005 - 2013. ++ * License: Boost License 1.0. ++ * Authors: Walter Bright, Sean Kelly ++ */ ++ ++/* Copyright Digital Mars 2005 - 2013. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module gc.proxy; ++ ++import gc.gc; ++import gc.stats; ++import core.stdc.stdlib; ++ ++private ++{ ++ version = GCCLASS; ++ ++ version( GCCLASS ) ++ alias GC gc_t; ++ else ++ alias GC* gc_t; ++ ++ __gshared gc_t _gc; ++ ++ extern (C) void thread_init(); ++ extern (C) void thread_term(); ++ ++ struct Proxy ++ { ++ extern (C) ++ { ++ void function() gc_enable; ++ void function() gc_disable; ++ void function() gc_collect; ++ void function() gc_minimize; ++ ++ uint function(void*) gc_getAttr; ++ uint function(void*, uint) gc_setAttr; ++ uint function(void*, uint) gc_clrAttr; ++ ++ void* function(size_t, uint) gc_malloc; ++ BlkInfo function(size_t, uint) gc_qalloc; ++ void* function(size_t, uint) gc_calloc; ++ void* function(void*, size_t, uint ba) gc_realloc; ++ size_t function(void*, size_t, size_t) gc_extend; ++ size_t function(size_t) gc_reserve; ++ void function(void*) gc_free; ++ ++ void* function(void*) gc_addrOf; ++ size_t function(void*) gc_sizeOf; ++ ++ BlkInfo function(void*) gc_query; ++ ++ void function(void*) gc_addRoot; ++ void function(void*, size_t) gc_addRange; ++ ++ void function(void*) gc_removeRoot; ++ void function(void*) gc_removeRange; ++ } ++ } ++ ++ __gshared Proxy pthis; ++ __gshared Proxy* proxy; ++ ++ void initProxy() ++ { ++ pthis.gc_enable = &gc_enable; ++ pthis.gc_disable = &gc_disable; ++ pthis.gc_collect = &gc_collect; ++ pthis.gc_minimize = &gc_minimize; ++ ++ pthis.gc_getAttr = &gc_getAttr; ++ pthis.gc_setAttr = &gc_setAttr; ++ pthis.gc_clrAttr = &gc_clrAttr; ++ ++ pthis.gc_malloc = &gc_malloc; ++ pthis.gc_qalloc = &gc_qalloc; ++ pthis.gc_calloc = &gc_calloc; ++ pthis.gc_realloc = &gc_realloc; ++ pthis.gc_extend = &gc_extend; ++ pthis.gc_reserve = &gc_reserve; ++ pthis.gc_free = &gc_free; ++ ++ pthis.gc_addrOf = &gc_addrOf; ++ pthis.gc_sizeOf = &gc_sizeOf; ++ ++ pthis.gc_query = &gc_query; ++ ++ pthis.gc_addRoot = &gc_addRoot; ++ pthis.gc_addRange = &gc_addRange; ++ ++ pthis.gc_removeRoot = &gc_removeRoot; ++ pthis.gc_removeRange = &gc_removeRange; ++ } ++} ++ ++extern (C) ++{ ++ ++ void gc_init() ++ { ++ version (GCCLASS) ++ { void* p; ++ ClassInfo ci = GC.classinfo; ++ ++ p = malloc(ci.init.length); ++ (cast(byte*)p)[0 .. ci.init.length] = ci.init[]; ++ _gc = cast(GC)p; ++ } ++ else ++ { ++ _gc = cast(GC*) calloc(1, GC.sizeof); ++ } ++ _gc.initialize(); ++ // NOTE: The GC must initialize the thread library ++ // before its first collection. ++ thread_init(); ++ initProxy(); ++ } ++ ++ void gc_term() ++ { ++ // NOTE: There may be daemons threads still running when this routine is ++ // called. If so, cleaning memory out from under then is a good ++ // way to make them crash horribly. This probably doesn't matter ++ // much since the app is supposed to be shutting down anyway, but ++ // I'm disabling cleanup for now until I can think about it some ++ // more. ++ // ++ // NOTE: Due to popular demand, this has been re-enabled. It still has ++ // the problems mentioned above though, so I guess we'll see. ++ _gc.fullCollectNoStack(); // not really a 'collect all' -- still scans ++ // static data area, roots, and ranges. ++ thread_term(); ++ ++ _gc.Dtor(); ++ free(cast(void*)_gc); ++ _gc = null; ++ } ++ ++ void gc_enable() ++ { ++ if( proxy is null ) ++ return _gc.enable(); ++ return proxy.gc_enable(); ++ } ++ ++ void gc_disable() ++ { ++ if( proxy is null ) ++ return _gc.disable(); ++ return proxy.gc_disable(); ++ } ++ ++ void gc_collect() ++ { ++ if( proxy is null ) ++ { ++ _gc.fullCollect(); ++ return; ++ } ++ return proxy.gc_collect(); ++ } ++ ++ void gc_minimize() ++ { ++ if( proxy is null ) ++ return _gc.minimize(); ++ return proxy.gc_minimize(); ++ } ++ ++ uint gc_getAttr( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.getAttr( p ); ++ return proxy.gc_getAttr( p ); ++ } ++ ++ uint gc_setAttr( void* p, uint a ) ++ { ++ if( proxy is null ) ++ return _gc.setAttr( p, a ); ++ return proxy.gc_setAttr( p, a ); ++ } ++ ++ uint gc_clrAttr( void* p, uint a ) ++ { ++ if( proxy is null ) ++ return _gc.clrAttr( p, a ); ++ return proxy.gc_clrAttr( p, a ); ++ } ++ ++ void* gc_malloc( size_t sz, uint ba = 0 ) ++ { ++ if( proxy is null ) ++ return _gc.malloc( sz, ba ); ++ return proxy.gc_malloc( sz, ba ); ++ } ++ ++ BlkInfo gc_qalloc( size_t sz, uint ba = 0 ) ++ { ++ if( proxy is null ) ++ { ++ BlkInfo retval; ++ retval.base = _gc.malloc( sz, ba, &retval.size ); ++ retval.attr = ba; ++ return retval; ++ } ++ return proxy.gc_qalloc( sz, ba ); ++ } ++ ++ void* gc_calloc( size_t sz, uint ba = 0 ) ++ { ++ if( proxy is null ) ++ return _gc.calloc( sz, ba ); ++ return proxy.gc_calloc( sz, ba ); ++ } ++ ++ void* gc_realloc( void* p, size_t sz, uint ba = 0 ) ++ { ++ if( proxy is null ) ++ return _gc.realloc( p, sz, ba ); ++ return proxy.gc_realloc( p, sz, ba ); ++ } ++ ++ size_t gc_extend( void* p, size_t mx, size_t sz ) ++ { ++ if( proxy is null ) ++ return _gc.extend( p, mx, sz ); ++ return proxy.gc_extend( p, mx, sz ); ++ } ++ ++ size_t gc_reserve( size_t sz ) ++ { ++ if( proxy is null ) ++ return _gc.reserve( sz ); ++ return proxy.gc_reserve( sz ); ++ } ++ ++ void gc_free( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.free( p ); ++ return proxy.gc_free( p ); ++ } ++ ++ void* gc_addrOf( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.addrOf( p ); ++ return proxy.gc_addrOf( p ); ++ } ++ ++ size_t gc_sizeOf( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.sizeOf( p ); ++ return proxy.gc_sizeOf( p ); ++ } ++ ++ BlkInfo gc_query( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.query( p ); ++ return proxy.gc_query( p ); ++ } ++ ++ // NOTE: This routine is experimental. The stats or function name may change ++ // before it is made officially available. ++ GCStats gc_stats() ++ { ++ if( proxy is null ) ++ { ++ GCStats stats = void; ++ _gc.getStats( stats ); ++ return stats; ++ } ++ // TODO: Add proxy support for this once the layout of GCStats is ++ // finalized. ++ //return proxy.gc_stats(); ++ return GCStats.init; ++ } ++ ++ void gc_addRoot( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.addRoot( p ); ++ return proxy.gc_addRoot( p ); ++ } ++ ++ void gc_addRange( void* p, size_t sz ) ++ { ++ if( proxy is null ) ++ return _gc.addRange( p, sz ); ++ return proxy.gc_addRange( p, sz ); ++ } ++ ++ void gc_removeRoot( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.removeRoot( p ); ++ return proxy.gc_removeRoot( p ); ++ } ++ ++ void gc_removeRange( void* p ) ++ { ++ if( proxy is null ) ++ return _gc.removeRange( p ); ++ return proxy.gc_removeRange( p ); ++ } ++ ++ Proxy* gc_getProxy() ++ { ++ return &pthis; ++ } ++ ++ export ++ { ++ void gc_setProxy( Proxy* p ) ++ { ++ if( proxy !is null ) ++ { ++ // TODO: Decide if this is an error condition. ++ } ++ proxy = p; ++ foreach( r; _gc.rootIter ) ++ proxy.gc_addRoot( r ); ++ foreach( r; _gc.rangeIter ) ++ proxy.gc_addRange( r.pbot, r.ptop - r.pbot ); ++ } ++ ++ void gc_clrProxy() ++ { ++ foreach( r; _gc.rangeIter ) ++ proxy.gc_removeRange( r.pbot ); ++ foreach( r; _gc.rootIter ) ++ proxy.gc_removeRoot( r ); ++ proxy = null; ++ } ++ } ++ ++} +--- a/src/libphobos/libdruntime/gc/stats.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gc/stats.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,27 @@ ++/** ++ * Contains a struct for storing GC statistics. ++ * ++ * Copyright: Copyright Digital Mars 2005 - 2013. ++ * License: Boost License 1.0. ++ * Authors: Walter Bright, Sean Kelly ++ */ ++ ++/* Copyright Digital Mars 2005 - 2013. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module gc.stats; ++ ++ ++/** ++ * ++ */ ++struct GCStats ++{ ++ size_t poolsize; // total size of pool ++ size_t usedsize; // bytes allocated ++ size_t freeblocks; // number of blocks marked FREE ++ size_t freelistsize; // total of memory on free lists ++ size_t pageblocks; // number of blocks marked PAGE ++} +--- a/src/libphobos/libdruntime/gcc/backtrace.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/backtrace.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,572 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* This module provides a backtrace implementation for gdc */ ++module gcc.backtrace; ++ ++import gcc.libbacktrace; ++ ++ ++version( Posix ) ++{ ++ // NOTE: The first 5 frames with the current implementation are ++ // inside core.runtime and the object code, so eliminate ++ // these for readability. The alternative would be to ++ // exclude the first N frames that are in a list of ++ // mangled function names. ++ static enum FIRSTFRAME = 5; ++} ++else ++{ ++ // NOTE: On Windows, the number of frames to exclude is based on ++ // whether the exception is user or system-generated, so ++ // it may be necessary to exclude a list of function names ++ // instead. ++ static enum FIRSTFRAME = 0; ++} ++ ++static if(BACKTRACE_SUPPORTED && !BACKTRACE_USES_MALLOC) ++{ ++ import core.stdc.stdint, core.stdc.string, core.stdc.stdio; ++ enum MAXFRAMES = 128; ++ ++ extern(C) int simpleCallback(void* data, uintptr_t pc) ++ { ++ auto context = cast(LibBacktrace)data; ++ ++ if(context.numPCs == MAXFRAMES) ++ return 1; ++ ++ context.pcs[context.numPCs++] = pc; ++ return 0; ++ } ++ ++ /* ++ * Used for backtrace_create_state and backtrace_simple ++ */ ++ extern(C) void simpleErrorCallback(void* data, const(char)* msg, int errnum) ++ { ++ if(data) //context is not available in backtrace_create_state ++ { ++ auto context = cast(LibBacktrace)data; ++ strncpy(context.errorBuf.ptr, msg, context.errorBuf.length - 1); ++ context.error = errnum; ++ } ++ } ++ ++ /* ++ * Used for backtrace_pcinfo ++ */ ++ extern(C) int pcinfoCallback(void* data, uintptr_t pc, const(char)* filename, ++ int lineno, const(char)* func) ++ { ++ auto context = cast(SymbolCallbackInfo*)data; ++ ++ //Try to get the function name via backtrace_syminfo ++ if(func is null) ++ { ++ SymbolCallbackInfo2 info; ++ info.base = context; ++ info.filename = filename; ++ info.lineno = lineno; ++ if(backtrace_syminfo(context.state, pc, &syminfoCallback2, null, &info) != 0) ++ { ++ return context.retval; ++ } ++ } ++ ++ auto sym = SymbolOrError(0, SymbolInfo(func, filename, lineno, cast(void*)pc)); ++ context.retval = context.applyCB(context.num, sym); ++ context.num++; ++ ++ return context.retval; ++ } ++ ++ /* ++ * Used for backtrace_pcinfo and backtrace_syminfo ++ */ ++ extern(C) void pcinfoErrorCallback(void* data, const(char)* msg, int errnum) ++ { ++ auto context = cast(SymbolCallbackInfo*)data; ++ ++ if(errnum == -1) ++ { ++ context.noInfo = true; ++ return; ++ } ++ ++ SymbolOrError symError; ++ symError.errnum = errnum; ++ symError.msg = msg; ++ ++ size_t i = 0; ++ context.retval = context.applyCB(i, symError); ++ } ++ ++ /* ++ * Used for backtrace_syminfo (in opApply) ++ */ ++ extern(C) void syminfoCallback(void* data, uintptr_t pc, ++ const(char)* symname, uintptr_t symval) ++ { ++ auto context = cast(SymbolCallbackInfo*)data; ++ ++ auto sym = SymbolOrError(0, SymbolInfo(symname, null, 0, cast(void*)pc)); ++ context.retval = context.applyCB(context.num, sym); ++ ++ context.num++; ++ } ++ ++ /* ++ * This callback is used if backtrace_syminfo is called from the pcinfoCallback ++ * callback. It merges it's information with the information from pcinfoCallback. ++ */ ++ extern(C) void syminfoCallback2(void* data, uintptr_t pc, ++ const(char)* symname, uintptr_t symval) ++ { ++ auto context = cast(SymbolCallbackInfo2*)data; ++ ++ auto sym = SymbolOrError(0, SymbolInfo(symname, context.filename, context.lineno, ++ cast(void*)pc)); ++ context.base.retval = context.base.applyCB(context.base.num, sym); ++ ++ context.base.num++; ++ } ++ ++ /* ++ * The callback type used with the opApply overload which returns a SymbolOrError ++ */ ++ private alias scope int delegate(ref size_t, ref SymbolOrError) ApplyCallback; ++ ++ /* ++ * Passed to syminfoCallback, pcinfoCallback and pcinfoErrorCallback ++ */ ++ struct SymbolCallbackInfo ++ { ++ bool noInfo = false; //True if debug info / symbol table is not available ++ size_t num = 0; //Counter for opApply ++ int retval; //Value returned by applyCB ++ backtrace_state* state; ++ ++ //info.fileName / funcName / errmsg may become invalid after this delegate returned ++ ApplyCallback applyCB; ++ ++ void reset() ++ { ++ noInfo = false; ++ num = 0; ++ } ++ } ++ ++ /* ++ * Passed to the syminfoCallback2 callback. That function merges it's ++ * funcName with this information and updates base as all other callbacks do. ++ */ ++ struct SymbolCallbackInfo2 ++ { ++ SymbolCallbackInfo* base; ++ const(char)* filename; ++ int lineno; ++ } ++ ++ /* ++ * Contains a valid symbol or an error message if errnum is != 0. ++ */ ++ struct SymbolOrError ++ { ++ int errnum; // == 0: No error ++ union ++ { ++ SymbolInfo symbol; ++ const(char)* msg; ++ } ++ } ++ ++ //FIXME: state is never freed as libbacktrace doesn't provide a free function... ++ public class LibBacktrace : Throwable.TraceInfo ++ { ++ enum MaxAlignment = (void*).alignof; ++ ++ static void initLibBacktrace() ++ { ++ if(!initialized) ++ { ++ state = backtrace_create_state(null, false, &simpleErrorCallback, null); ++ initialized = true; ++ } ++ } ++ ++ this(int firstFrame = FIRSTFRAME) ++ { ++ _firstFrame = firstFrame; ++ ++ initLibBacktrace(); ++ ++ if(state) ++ { ++ backtrace_simple(state, _firstFrame, &simpleCallback, ++ &simpleErrorCallback, cast(void*)this); ++ } ++ } ++ ++ override int opApply( scope int delegate(ref const(char[])) dg ) const ++ { ++ return opApply( (ref size_t, ref const(char[]) buf) ++ { ++ return dg( buf ); ++ } ); ++ } ++ ++ override int opApply( scope int delegate(ref size_t, ref const(char[])) dg ) const ++ { ++ return opApply( (ref size_t i, ref SymbolOrError sym) ++ { ++ char[512] buffer = '\0'; ++ char[] msg; ++ if(sym.errnum != 0) ++ { ++ auto retval = snprintf(buffer.ptr, buffer.length, ++ "libbacktrace error: '%s' errno: %d", sym.msg, sym.errnum); ++ ++ if(retval >= buffer.length) ++ msg = buffer[0 .. $-1]; //Ignore zero terminator ++ else if(retval > 0) ++ msg = buffer[0 .. retval]; ++ } ++ else ++ { ++ msg = formatLine(sym.symbol, buffer); ++ } ++ ++ return dg(i, msg); ++ } ); ++ } ++ ++ int opApply(ApplyCallback dg) const ++ { ++ //If backtrace_simple produced an error report it and exit ++ if(!state || error != 0) ++ { ++ size_t pos = 0; ++ SymbolOrError symError; ++ symError.errnum = error; ++ symError.msg = errorBuf.ptr; ++ ++ return dg(pos, symError); ++ } ++ ++ SymbolCallbackInfo cinfo; ++ cinfo.applyCB = dg; ++ cinfo.state = cast(backtrace_state*)state; ++ ++ //Try using debug info first ++ foreach(i, pc; pcs[0 .. numPCs]) ++ { ++ //FIXME: We may violate const guarantees here... ++ if(backtrace_pcinfo(cast(backtrace_state*)state, pc, &pcinfoCallback, ++ &pcinfoErrorCallback, &cinfo) != 0) ++ { ++ break; //User delegate requested abort or no debug info at all ++ } ++ } ++ ++ //If no error or other error which has already been reported via callback ++ if(!cinfo.noInfo) ++ return cinfo.retval; ++ ++ //Try using symbol table ++ cinfo.reset(); ++ foreach(pc; pcs[0 .. numPCs]) ++ { ++ if(backtrace_syminfo(cast(backtrace_state*)state, pc, &syminfoCallback, ++ &pcinfoErrorCallback, &cinfo) == 0) ++ { ++ break; ++ } ++ } ++ ++ if(!cinfo.noInfo) ++ return cinfo.retval; ++ ++ //No symbol table ++ foreach(i, pc; pcs[0 .. numPCs]) ++ { ++ auto sym = SymbolOrError(0, SymbolInfo(null, null, 0, cast(void*)pc)); ++ if(auto ret = dg(i, sym) != 0) ++ return ret; ++ } ++ ++ return 0; ++ } ++ ++ override string toString() const ++ { ++ string buf; ++ foreach(i, const(char[]) line; this ) ++ buf ~= i ? "\n" ~ line : line; ++ return buf; ++ } ++ ++ private: ++ static backtrace_state* state = null; ++ static bool initialized = false; ++ size_t numPCs = 0; ++ uintptr_t[MAXFRAMES] pcs; ++ ++ int error = 0; ++ int _firstFrame = 0; ++ char[128] errorBuf; ++ } ++} ++else ++{ ++ /* ++ * Our fallback backtrace implementation using libgcc's unwind ++ * and backtrace support. In theory libbacktrace should be available ++ * everywhere where this code works. We keep it anyway till libbacktrace ++ * is well-tested. ++ */ ++ public class GDCBacktrace : Throwable.TraceInfo ++ { ++ this(int firstFrame = FIRSTFRAME) ++ { ++ _firstFrame = firstFrame; ++ _callstack = gdcBacktrace(); ++ _framelist = gdcBacktraceSymbols(_callstack); ++ } ++ ++ override int opApply( scope int delegate(ref const(char[])) dg ) const ++ { ++ return opApply( (ref size_t, ref const(char[]) buf) ++ { ++ return dg( buf ); ++ } ); ++ } ++ ++ override int opApply( scope int delegate(ref size_t, ref const(char[])) dg ) const ++ { ++ int ret = 0; ++ char[512] fixbuf = '\0'; ++ ++ for( int i = _firstFrame; i < _framelist.entries; ++i ) ++ { ++ auto pos = cast(size_t)(i - _firstFrame); ++ auto buf = formatLine(_framelist.symbols[i], fixbuf); ++ ret = dg( pos, buf ); ++ if( ret ) ++ break; ++ } ++ return ret; ++ } ++ ++ override string toString() const ++ { ++ string buf; ++ foreach( i, line; this ) ++ buf ~= i ? "\n" ~ line : line; ++ return buf; ++ } ++ ++ private: ++ BTSymbolData _framelist; ++ GDCBacktraceData _callstack; ++ int _firstFrame = 0; ++ } ++ ++ // Implementation details ++ private: ++ import gcc.unwind; ++ ++ static enum MAXFRAMES = 128; ++ ++ struct GDCBacktraceData ++ { ++ void*[MAXFRAMES] callstack; ++ int numframes = 0; ++ } ++ ++ struct BTSymbolData ++ { ++ size_t entries; ++ SymbolInfo[MAXFRAMES] symbols; ++ } ++ ++ static extern (C) _Unwind_Reason_Code unwindCB(_Unwind_Context *ctx, void *d) ++ { ++ GDCBacktraceData* bt = cast(GDCBacktraceData*)d; ++ if(bt.numframes >= MAXFRAMES) ++ return _URC_NO_REASON; ++ ++ bt.callstack[bt.numframes] = cast(void*)_Unwind_GetIP(ctx); ++ bt.numframes++; ++ return _URC_NO_REASON; ++ } ++ ++ GDCBacktraceData gdcBacktrace() ++ { ++ GDCBacktraceData stackframe; ++ _Unwind_Backtrace(&unwindCB, &stackframe); ++ return stackframe; ++ } ++ ++ BTSymbolData gdcBacktraceSymbols(GDCBacktraceData data) ++ { ++ BTSymbolData symData; ++ ++ for(auto i = 0; i < data.numframes; i++) ++ { ++ static if(HAVE_DLADDR) ++ { ++ Dl_info funcInfo; ++ ++ if(data.callstack[i] !is null && dladdr(data.callstack[i], &funcInfo) != 0) ++ { ++ symData.symbols[symData.entries].funcName = funcInfo.dli_sname; ++ ++ symData.symbols[symData.entries].address = data.callstack[i]; ++ symData.entries++; ++ } ++ else ++ { ++ symData.symbols[symData.entries].address = data.callstack[i]; ++ symData.entries++; ++ } ++ } ++ else ++ { ++ symData.symbols[symData.entries].address = data.callstack[i]; ++ symData.entries++; ++ } ++ } ++ ++ return symData; ++ } ++} ++ ++/* ++ * Struct representing a symbol (function) in the backtrace ++ */ ++struct SymbolInfo ++{ ++ const(char)* funcName, fileName; ++ size_t line; ++ const(void)* address; ++} ++ ++/* ++ * Format one output line for symbol sym. ++ * Returns a slice of fixbuf. ++ */ ++char[] formatLine(const SymbolInfo sym, ref char[512] fixbuf) ++{ ++ import core.demangle, core.stdc.config; ++ import core.stdc.stdio : snprintf, printf; ++ import core.stdc.string : strlen; ++ ++ int ret; ++ ++ ret = snprintf(fixbuf.ptr, fixbuf.sizeof, "0x%lx ", cast(c_ulong)sym.address); ++ if(ret >= fixbuf.sizeof) ++ return fixbuf[0 .. $-1]; //Ignore zero terminator ++ ++ if(sym.funcName is null) ++ { ++ if(!(fixbuf.sizeof - ret > 3)) ++ return fixbuf[0 .. ret]; ++ ++ fixbuf[ret] = fixbuf[ret+1] = fixbuf[ret+2] = '?'; ++ ret += 3; ++ } ++ else ++ { ++ auto demangled = demangle(sym.funcName[0 .. strlen(sym.funcName)], ++ fixbuf[ret .. $-1]); ++ ++ ret += demangled.length; ++ if(ret + 1 >= fixbuf.sizeof) ++ return fixbuf[0 .. $-1]; //Ignore zero terminator ++ } ++ ++ ret += snprintf(fixbuf.ptr + ret, fixbuf.sizeof - ret, "\n\t%s:%d", ++ sym.fileName is null ? "???" : sym.fileName, ++ sym.line); ++ ++ if(ret >= fixbuf.sizeof) ++ return fixbuf[0 .. $-1]; //Ignore zero terminator ++ else ++ return fixbuf[0 .. ret]; ++} ++ ++ ++unittest ++{ ++ char[512] sbuf = '\0'; ++ char[] result; ++ string longString; ++ for(size_t i = 0; i < 60; i++) ++ longString ~= "abcdefghij"; ++ longString ~= '\0'; ++ ++ auto symbol = SymbolInfo(null, null, 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(longString.ptr, null, 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo("func", "test.d", 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo("func", longString.ptr, 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(longString.ptr, "test.d", 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(longString.ptr, longString.ptr, 0, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo("func", "test.d", 1000, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(null, (longString[0..500] ~ '\0').ptr, 100000000, null); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo("func", "test.d", 0, cast(void*)0x100000); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo("func", null, 0, cast(void*)0x100000); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(null, "test.d", 0, cast(void*)0x100000); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++ ++ symbol = SymbolInfo(longString.ptr, "test.d", 0, cast(void*)0x100000); ++ result = formatLine(symbol, sbuf); ++ assert(result.length < 512 && result.ptr[result.length] == '\0' && sbuf[$-1] == '\0'); ++} +--- a/src/libphobos/libdruntime/gcc/deh.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/deh.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,146 +1,113 @@ +-/* GDC -- D front-end for GCC +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++// GDC -- D front-end for GCC ++// Copyright (C) 2011, 2012, 2014 Free Software Foundation, Inc. + +- GCC is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 3, or (at your option) any later +- version. +- +- GCC is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License +- along with GCC; see the file COPYING3. If not see +- . +-*/ ++// GCC is free software; you can redistribute it and/or modify it under ++// the terms of the GNU General Public License as published by the Free ++// Software Foundation; either version 3, or (at your option) any later ++// version. ++ ++// GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++// WARRANTY; without even the implied warranty of MERCHANTABILITY or ++// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++// for more details. ++ ++// You should have received a copy of the GNU General Public License ++// along with GCC; see the file COPYING3. If not see ++// . + + // This code is based on the libstdc++ exception handling routines. + + module gcc.deh; + + import gcc.unwind; +-import gcc.unwind_pe; ++import gcc.unwind.pe; + import gcc.builtins; + + import core.memory; + import core.stdc.stdlib; + +-extern (C) ++extern(C) + { + int _d_isbaseof(ClassInfo, ClassInfo); + void _d_createTrace(Object *); +- + } + ++// This is the primary exception class we report -- "GNUCD__\0". + version (GNU_ARM_EABI_Unwinder) + { +- const _Unwind_Exception_Class GDC_Exception_Class = +- ['G','N','U','C','D','_','_','\0']; ++ const _Unwind_Exception_Class __gdc_exception_class ++ = ['G', 'N', 'U', 'C', 'D', '_', '_', '\0']; + } + else + { +- // "GNUCD__\0" +- const _Unwind_Exception_Class GDC_Exception_Class = 0x005f5f4443554e47L; ++ const _Unwind_Exception_Class __gdc_exception_class ++ = (((((((cast(_Unwind_Exception_Class) 'G' ++ << 8 | cast(_Unwind_Exception_Class) 'N') ++ << 8 | cast(_Unwind_Exception_Class) 'U') ++ << 8 | cast(_Unwind_Exception_Class) 'C') ++ << 8 | cast(_Unwind_Exception_Class) 'D') ++ << 8 | cast(_Unwind_Exception_Class) '_') ++ << 8 | cast(_Unwind_Exception_Class) '_') ++ << 8 | cast(_Unwind_Exception_Class) '\0'); + } + +-struct Phase1Info +-{ +- _Unwind_Word handlerSwitchValue; +- ubyte *languageSpecificData; +- _Unwind_Ptr landingPad; +-} + +-struct OurUnwindException +-{ +- version (GNU_ARM_EABI_Unwinder) +- { +- // Cached parsed handler data is stored elsewhere +- // DNotes: There is no ARM exception handling ABI for the D +- // programming language that mandates the use of +- // barrier_cache.bitpattern, but might as well use the space. +- void save(_Unwind_Context* context, ref Phase1Info info) +- { +- unwindHeader.barrier_cache.sp = _Unwind_GetGR (context, UNWIND_STACK_REG); +- with (unwindHeader.barrier_cache) +- { +- //bitpattern[0] = cast(_uw) info.obj; // No need for this yet +- bitpattern[1] = cast(_uw) info.handlerSwitchValue; +- bitpattern[2] = cast(_uw) info.languageSpecificData; +- bitpattern[3] = cast(_uw) info.landingPad; +- } +- } ++// A D exception object consists of a header, which is a wrapper ++// around an unwind object header with additional D specific ++// information, followed by the exception object itself. + +- void restore(ref Phase1Info info) +- { +- with (unwindHeader.barrier_cache) +- { +- info.handlerSwitchValue = cast(typeof(info.handlerSwitchValue)) +- bitpattern[1]; +- info.languageSpecificData = cast(typeof(info.languageSpecificData)) +- bitpattern[2]; +- info.landingPad = cast(typeof(info.landingPad)) +- bitpattern[3]; +- } +- } +- } +- else +- { +- // Cache parsed handler data from the personality routine Phase 1 +- // for Phase 2. +- Phase1Info cache; +- +- void save(_Unwind_Context* context, ref Phase1Info info) +- { +- cache = info; +- } +- +- void restore(ref Phase1Info info) +- { +- info = cache; +- } +- } +- +- version (GNU_ARM_EABI_Unwinder) +- int _pad; // to place 'obj' behind unwindHeader ++struct d_exception_header ++{ ++ // The object being thrown. Like GCJ, the compiled code expects this to ++ // be immediately before the generic exception header. ++ // (See build_exception_object) ++ enum UNWIND_PAD = (Object.alignof < _Unwind_Exception.alignof) ++ ? _Unwind_Exception.alignof - Object.alignof : 0; + +- Object obj; ++ // Because of a lack of __aligned__ style attribute, our object ++ // and the unwind object are the first two fields. ++ ubyte[UNWIND_PAD] pad; + +- // The exception object must be directly behind unwindHeader. +- // (See IRState::exceptionObject.) +- static assert(unwindHeader.offsetof - obj.offsetof == obj.sizeof); ++ Object object; + +- // The generic exception header ++ // The generic exception header. + _Unwind_Exception unwindHeader; + +- static OurUnwindException * fromHeader(_Unwind_Exception * p_ue) ++ static assert(unwindHeader.offsetof - object.offsetof == object.sizeof); ++ ++ version (GNU_ARM_EABI_Unwinder) + { +- return cast(OurUnwindException *) +- (cast(void*) p_ue - OurUnwindException.unwindHeader.offsetof); ++ // Nothing here yet. ++ } ++ else ++ { ++ // Cache handler details between Phase 1 and Phase 2. ++ int handlerSwitchValue; ++ ubyte *actionRecord; ++ ubyte *languageSpecificData; ++ _Unwind_Ptr catchTemp; + } + } + +-// D doesn't define these, so they are private for now. +-private void __gdc_terminate() ++private d_exception_header * ++get_exception_header_from_ue(_Unwind_Exception *exc) + { +- // replaces std::terminate and terminating with a specific handler +- abort(); ++ return cast(d_exception_header *) ++ (cast(void *) exc - d_exception_header.unwindHeader.offsetof); + } + +-private void __gdc_unexpected() +-{ +-} ++// D doesn't define these, so they are private for now. + +-private void __gdc_beginCatch(_Unwind_Exception *exc) ++private void ++__gdc_terminate() + { +- // nothing ++ // Replaces std::terminate and terminating with a specific handler ++ abort(); + } + + // This is called by the unwinder. +- +-private extern (C) void +-_gdc_cleanupException(_Unwind_Reason_Code code, _Unwind_Exception *exc) ++extern(C) private void ++__gdc_exception_cleanup(_Unwind_Reason_Code code, _Unwind_Exception *exc) + { + // If we haven't been caught by a foreign handler, then this is + // some sort of unwind error. In that case just die immediately. +@@ -150,63 +117,187 @@ _gdc_cleanupException(_Unwind_Reason_Cod + if (code != _URC_FOREIGN_EXCEPTION_CAUGHT && code != _URC_NO_REASON) + __gdc_terminate(); + +- OurUnwindException * p = OurUnwindException.fromHeader (exc); +- delete p; ++ d_exception_header *p = get_exception_header_from_ue (exc); ++ destroy (p); + } + +-// This is called by compiler-generated code for throw statements. +-extern (C) public void +-_d_throw(Object obj) ++ ++// Perform a throw, D style. Throw will unwind through this call, ++// so there better not be any handlers or exception thrown here. ++ ++extern(C) void ++_d_throw(Object object) + { +- OurUnwindException * exc = new OurUnwindException; ++ // FIXME: OOM errors will throw recursively. ++ d_exception_header *xh = new d_exception_header(); ++ ++ xh.object = object; + +- static if ( is(typeof(exc.unwindHeader.exception_class = GDC_Exception_Class)) ) +- exc.unwindHeader.exception_class = GDC_Exception_Class; ++ static if ( is(typeof(xh.unwindHeader.exception_class = __gdc_exception_class)) ) ++ xh.unwindHeader.exception_class = __gdc_exception_class; + else +- exc.unwindHeader.exception_class[] = GDC_Exception_Class[]; ++ xh.unwindHeader.exception_class[] = __gdc_exception_class[]; + +- exc.unwindHeader.exception_cleanup = & _gdc_cleanupException; +- exc.obj = obj; ++ xh.unwindHeader.exception_cleanup = & __gdc_exception_cleanup; + + // Runtime now expects us to do this first before unwinding. +- _d_createTrace (cast(Object*)exc.obj); ++ _d_createTrace (cast(Object *) xh.object); + ++ // We're happy with setjmp/longjmp exceptions or region-based ++ // exception handlers: entry points are provided here for both. + version (GNU_SjLj_Exceptions) +- _Unwind_SjLj_RaiseException (&exc.unwindHeader); ++ _Unwind_SjLj_RaiseException (&xh.unwindHeader); + else +- _Unwind_RaiseException (&exc.unwindHeader); ++ _Unwind_RaiseException (&xh.unwindHeader); + +- // Some sort of unwinding error. Note that terminate is a handler. +- __gdc_beginCatch (&exc.unwindHeader); ++ // If code == _URC_END_OF_STACK, then we reached top of stack without ++ // finding a handler for the exception. Since each thread is run in ++ // a try/catch, this oughtn't happen. If code is something else, we ++ // encountered some sort of heinous lossage from which we could not ++ // recover. As is the way of such things, almost certainly we will have ++ // crashed before now, rather than actually being able to diagnose the ++ // problem. + __gdc_terminate(); + } + +-// rethrow? + +-// extern(C) alias personalityImpl ...; would be nice ++struct lsda_header_info ++{ ++ _Unwind_Ptr Start; ++ _Unwind_Ptr LPStart; ++ _Unwind_Ptr ttype_base; ++ ubyte *TType; ++ ubyte *action_table; ++ ubyte ttype_encoding; ++ ubyte call_site_encoding; ++} ++ ++private ubyte * ++parse_lsda_header (_Unwind_Context *context, ubyte *p, ++ lsda_header_info *info) ++{ ++ _uleb128_t tmp; ++ ubyte lpstart_encoding; ++ ++ info.Start = (context ? _Unwind_GetRegionStart (context) : 0); ++ ++ // Find @LPStart, the base to which landing pad offsets are relative. ++ lpstart_encoding = *p++; ++ if (lpstart_encoding != DW_EH_PE_omit) ++ p = read_encoded_value (context, lpstart_encoding, p, &info.LPStart); ++ else ++ info.LPStart = info.Start; ++ ++ // Find @TType, the base of the handler and exception spec type data. ++ info.ttype_encoding = *p++; ++ if (info.ttype_encoding != DW_EH_PE_omit) ++ { ++ version (GNU_ARM_EABI_Unwinder) ++ { ++ // Older ARM EABI toolchains set this value incorrectly, so use a ++ // hardcoded OS-specific format. ++ info.ttype_encoding = _TTYPE_ENCODING; ++ } ++ p = read_uleb128 (p, &tmp); ++ info.TType = p + tmp; ++ } ++ else ++ info.TType = null; ++ ++ // The encoding and length of the call-site table; the action table ++ // immediately follows. ++ info.call_site_encoding = *p++; ++ p = read_uleb128 (p, &tmp); ++ info.action_table = p + tmp; ++ ++ return p; ++} ++ ++private ClassInfo ++get_classinfo_entry(lsda_header_info *info, _uleb128_t i) ++{ ++ _Unwind_Ptr ptr; ++ ++ i *= size_of_encoded_value (info.ttype_encoding); ++ read_encoded_value_with_base (info.ttype_encoding, info.ttype_base, ++ info.TType - i, &ptr); ++ ++ return cast(ClassInfo)cast(void *)(ptr); ++} ++ ++private void ++save_caught_exception(_Unwind_Exception *ue_header, ++ _Unwind_Context *context, ++ int handler_switch_value, ++ ubyte *language_specific_data, ++ _Unwind_Ptr landing_pad, ++ ubyte *action_record) ++{ ++ version (GNU_ARM_EABI_Unwinder) ++ { ++ ue_header.barrier_cache.sp = _Unwind_GetGR(context, UNWIND_STACK_REG); ++ ue_header.barrier_cache.bitpattern[1] = cast(_uw) handler_switch_value; ++ ue_header.barrier_cache.bitpattern[2] = cast(_uw) language_specific_data; ++ ue_header.barrier_cache.bitpattern[3] = cast(_uw) landing_pad; ++ } ++ else ++ { ++ d_exception_header *xh = get_exception_header_from_ue (ue_header); ++ ++ xh.handlerSwitchValue = handler_switch_value; ++ xh.actionRecord = action_record; ++ xh.languageSpecificData = language_specific_data; ++ xh.catchTemp = landing_pad; ++ } ++} ++ ++private void ++restore_caught_exception(_Unwind_Exception *ue_header, ++ ref int handler_switch_value, ++ ref ubyte *language_specific_data, ++ ref _Unwind_Ptr landing_pad) ++{ ++ version (GNU_ARM_EABI_Unwinder) ++ { ++ handler_switch_value = cast(int) ue_header.barrier_cache.bitpattern[1]; ++ language_specific_data = cast(ubyte *) ue_header.barrier_cache.bitpattern[2]; ++ landing_pad = cast(_Unwind_Ptr) ue_header.barrier_cache.bitpattern[3]; ++ } ++ else ++ { ++ d_exception_header *xh = get_exception_header_from_ue (ue_header); ++ ++ handler_switch_value = xh.handlerSwitchValue; ++ language_specific_data = xh.languageSpecificData; ++ landing_pad = cast(_Unwind_Ptr) xh.catchTemp; ++ } ++} ++ ++// Using a different personality function name causes link failures ++// when trying to mix code using different exception handling models. ++// extern(C) alias __gdc_personality_impl ...; would be nice + version (GNU_SjLj_Exceptions) + { +- extern (C) +- _Unwind_Reason_Code __gdc_personality_sj0(int iversion, +- _Unwind_Action actions, +- _Unwind_Exception_Class exception_class, +- _Unwind_Exception *ue_header, +- _Unwind_Context *context) +- { +- return personalityImpl (iversion, actions, +- exception_class != GDC_Exception_Class, +- ue_header, context); ++ extern(C) _Unwind_Reason_Code ++ __gdc_personality_sj0(int iversion, ++ _Unwind_Action actions, ++ _Unwind_Exception_Class exception_class, ++ _Unwind_Exception *ue_header, ++ _Unwind_Context *context) ++ { ++ return __gdc_personality_impl (iversion, actions, ++ exception_class != __gdc_exception_class, ++ ue_header, context); + } + + private int __builtin_eh_return_data_regno(int x) { return x; } +- + } + else version (GNU_ARM_EABI_Unwinder) + { +- extern (C) +- _Unwind_Reason_Code __gdc_personality_v0(_Unwind_State state, +- _Unwind_Exception* ue_header, +- _Unwind_Context* context) ++ extern(C) _Unwind_Reason_Code ++ __gdc_personality_v0(_Unwind_State state, ++ _Unwind_Exception* ue_header, ++ _Unwind_Context* context) + { + _Unwind_Action actions; + +@@ -237,29 +328,30 @@ else version (GNU_ARM_EABI_Unwinder) + // However the ABI routines hide this from us, and we don't actually need to knowa + bool foreign_exception = false; + +- return personalityImpl (1, actions, foreign_exception, ue_header, context); ++ return __gdc_personality_impl (1, actions, foreign_exception, ue_header, context); + } + } + else + { +- extern (C) +- _Unwind_Reason_Code __gdc_personality_v0(int iversion, +- _Unwind_Action actions, +- _Unwind_Exception_Class exception_class, +- _Unwind_Exception *ue_header, +- _Unwind_Context *context) +- { +- return personalityImpl (iversion, actions, +- exception_class != GDC_Exception_Class, +- ue_header, context); ++ extern(C) _Unwind_Reason_Code ++ __gdc_personality_v0(int iversion, ++ _Unwind_Action actions, ++ _Unwind_Exception_Class exception_class, ++ _Unwind_Exception *ue_header, ++ _Unwind_Context *context) ++ { ++ return __gdc_personality_impl (iversion, actions, ++ exception_class != __gdc_exception_class, ++ ue_header, context); + } + } + +-private _Unwind_Reason_Code personalityImpl(int iversion, +- _Unwind_Action actions, +- bool foreign_exception, +- _Unwind_Exception *ue_header, +- _Unwind_Context *context) ++private _Unwind_Reason_Code ++__gdc_personality_impl(int iversion, ++ _Unwind_Action actions, ++ bool foreign_exception, ++ _Unwind_Exception *ue_header, ++ _Unwind_Context *context) + { + enum Found + { +@@ -271,11 +363,11 @@ private _Unwind_Reason_Code personalityI + + Found found_type; + lsda_header_info info; +- OurUnwindException * xh = OurUnwindException.fromHeader (ue_header); +- ubyte *p; ++ ubyte *language_specific_data; + ubyte *action_record; +- _Unwind_Ptr ip; +- Phase1Info phase1; ++ ubyte *p; ++ _Unwind_Ptr landing_pad, ip; ++ int handler_switch_value; + int ip_before_insn = 0; + + version (GNU_ARM_EABI_Unwinder) +@@ -289,22 +381,31 @@ private _Unwind_Reason_Code personalityI + } + else + { ++ // Interface version check. + if (iversion != 1) + return _URC_FATAL_PHASE1_ERROR; + } + ++ d_exception_header *xh = get_exception_header_from_ue (ue_header); ++ + // Shortcut for phase 2 found handler for domestic exception. +- if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) && ! foreign_exception) ++ if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) ++ && ! foreign_exception) + { +- xh.restore (phase1); +- found_type = (phase1.landingPad == 0 ? Found.terminate : Found.handler); ++ restore_caught_exception(ue_header, handler_switch_value, ++ language_specific_data, landing_pad); ++ found_type = (landing_pad == 0 ? Found.terminate : Found.handler); + goto install_context; + } + +- phase1.languageSpecificData = cast(ubyte *) _Unwind_GetLanguageSpecificData (context); ++ // NOTE: In Phase 1, record _Unwind_GetIPInfo in xh.object as a part of ++ // the stack trace for this exception. This will only collect D frames, ++ // but perhaps that is acceptable. ++ language_specific_data = cast(ubyte *) ++ _Unwind_GetLanguageSpecificData (context); + + // If no LSDA, then there are no handlers or cleanups. +- if (! phase1.languageSpecificData) ++ if (! language_specific_data) + { + version (GNU_ARM_EABI_Unwinder) + if (__gnu_unwind_frame (ue_header, context) != _URC_OK) +@@ -313,14 +414,15 @@ private _Unwind_Reason_Code personalityI + } + + // Parse the LSDA header +- p = parse_lsda_header (context, phase1.languageSpecificData, &info); ++ p = parse_lsda_header (context, language_specific_data, &info); + info.ttype_base = base_of_encoded_value (info.ttype_encoding, context); + ip = _Unwind_GetIPInfo (context, &ip_before_insn); ++ + if (! ip_before_insn) + --ip; +- phase1.landingPad = 0; ++ landing_pad = 0; + action_record = null; +- phase1.handlerSwitchValue = 0; ++ handler_switch_value = 0; + + version (GNU_SjLj_Exceptions) + { +@@ -332,11 +434,11 @@ private _Unwind_Reason_Code personalityI + return _URC_CONTINUE_UNWIND; + else if (ip == 0) + { +- // Fall through to set found_terminate. ++ // Fall through to set Found.terminate. + } + else + { +- _Unwind_Word cs_lp, cs_action; ++ _uleb128_t cs_lp, cs_action; + do + { + p = read_uleb128 (p, &cs_lp); +@@ -346,7 +448,7 @@ private _Unwind_Reason_Code personalityI + + // Can never have null landing pad for sjlj -- that would have + // been indicated by a -1 call site index. +- phase1.landingPad = cs_lp + 1; ++ landing_pad = cs_lp + 1; + if (cs_action) + action_record = info.action_table + cs_action - 1; + goto found_something; +@@ -358,7 +460,7 @@ private _Unwind_Reason_Code personalityI + while (p < info.action_table) + { + _Unwind_Ptr cs_start, cs_len, cs_lp; +- _Unwind_Word cs_action; ++ _uleb128_t cs_action; + + // Note that all call-site encodings are "absolute" displacements. + p = read_encoded_value (null, info.call_site_encoding, p, &cs_start); +@@ -372,7 +474,7 @@ private _Unwind_Reason_Code personalityI + else if (ip < info.Start + cs_start + cs_len) + { + if (cs_lp) +- phase1.landingPad = info.LPStart + cs_lp; ++ landing_pad = info.LPStart + cs_lp; + if (cs_action) + action_record = info.action_table + cs_action - 1; + goto found_something; +@@ -380,14 +482,14 @@ private _Unwind_Reason_Code personalityI + } + } + +- // If ip is not present in the table, call terminate. This is for +- // a destructor inside a cleanup, or a library routine the compiler +- // was not expecting to throw. ++ // If ip is not present in the table, C++ would call terminate. ++ // This is for a destructor inside a cleanup, or a library routine ++ // the compiler was not expecting to throw. + found_type = Found.terminate; + goto do_something; + + found_something: +- if (phase1.landingPad == 0) ++ if (landing_pad == 0) + { + // If ip is present, and has a null landing pad, there are + // no cleanups or handlers to be run. +@@ -403,21 +505,10 @@ private _Unwind_Reason_Code personalityI + else + { + // Otherwise we have a catch handler or exception specification. +- + _sleb128_t ar_filter, ar_disp; +- ClassInfo throw_type, catch_type; + bool saw_cleanup = false; + bool saw_handler = false; + +- // During forced unwinding, we only run cleanups. With a foreign +- // exception class, there's no exception type. +- // ??? What to do about GNU Java and GNU Ada exceptions. +- +- if ((actions & _UA_FORCE_UNWIND) || foreign_exception) +- throw_type = null; +- else +- throw_type = xh.obj.classinfo; +- + while (1) + { + p = action_record; +@@ -429,19 +520,23 @@ private _Unwind_Reason_Code personalityI + // Zero filter values are cleanups. + saw_cleanup = true; + } ++ else if ((actions & _UA_FORCE_UNWIND) || foreign_exception) ++ { ++ // During forced unwinding, we only run cleanups. With a ++ // foreign exception class, we have no class info to match. ++ // ??? What to do about GNU Java and GNU Ada exceptions. ++ } + else if (ar_filter > 0) + { + // Positive filter values are handlers. +- catch_type = get_classinfo_entry (&info, ar_filter); ++ ClassInfo catch_type = get_classinfo_entry (&info, ar_filter); + + // Null catch type is a catch-all handler; we can catch foreign + // exceptions with this. Otherwise we must match types. + // D Note: will be performing dynamic cast twice, potentially + // Once here and once at the landing pad .. unless we cached + // here and had a begin_catch call. +- if (! catch_type +- || (throw_type +- && _d_isbaseof (throw_type, catch_type))) ++ if (catch_type is null || _d_isbaseof (xh.object.classinfo, catch_type)) + { + saw_handler = true; + break; +@@ -460,7 +555,7 @@ private _Unwind_Reason_Code personalityI + + if (saw_handler) + { +- phase1.handlerSwitchValue = ar_filter; ++ handler_switch_value = cast(int) ar_filter; + found_type = Found.handler; + } + else +@@ -488,114 +583,50 @@ private _Unwind_Reason_Code personalityI + + // For domestic exceptions, we cache data from phase 1 for phase 2. + if (! foreign_exception) +- xh.save (context, phase1); ++ { ++ save_caught_exception (ue_header, context, handler_switch_value, ++ language_specific_data, landing_pad, ++ action_record); ++ } + return _URC_HANDLER_FOUND; + } + + install_context: +- + // We can't use any of the deh routines with foreign exceptions, +- // because they all expect ue_header to be an OurUnwindException. ++ // because they all expect ue_header to be an d_exception_header. + // So in that case, call terminate or unexpected directly. + if ((actions & _UA_FORCE_UNWIND) || foreign_exception) + { +- if (found_type == Found.terminate) ++ if (found_type == Found.terminate || handler_switch_value < 0) + __gdc_terminate(); +- else if (phase1.handlerSwitchValue < 0) +- __gdc_unexpected(); + } + else + { + if (found_type == Found.terminate) +- { +- __gdc_beginCatch (&xh.unwindHeader); +- __gdc_terminate(); +- } ++ __gdc_terminate(); + +- if (phase1.handlerSwitchValue < 0) ++ // Cache the TType base value for unexpected calls, as we won't ++ // have an _Unwind_Context then. ++ if (handler_switch_value < 0) + { +- parse_lsda_header (context, phase1.languageSpecificData, &info); ++ parse_lsda_header (context, language_specific_data, &info); + info.ttype_base = base_of_encoded_value (info.ttype_encoding, context); ++ ++ version (GNU_ARM_EABI_Unwinder) ++ ue_header.barrier_cache.bitpattern[1] = info.ttype_base; ++ else ++ xh.catchTemp = info.ttype_base; + } + } + +- static if (is(typeof(__builtin_extend_pointer))) +- // For targets with pointers smaller than the word size, we must extend the +- // pointer, and this extension is target dependent. +- _Unwind_SetGR (context, __builtin_eh_return_data_regno (0), +- __builtin_extend_pointer (&xh.unwindHeader)); +- else +- _Unwind_SetGR (context, __builtin_eh_return_data_regno (0), +- cast(_Unwind_Ptr) &xh.unwindHeader); +- ++ // For targets with pointers smaller than the word size, we must extend the ++ // pointer, and this extension is target dependent. ++ _Unwind_SetGR (context, __builtin_eh_return_data_regno (0), ++ cast(_Unwind_Ptr) ue_header); + _Unwind_SetGR (context, __builtin_eh_return_data_regno (1), +- phase1.handlerSwitchValue); +- _Unwind_SetIP (context, phase1.landingPad); ++ handler_switch_value); ++ _Unwind_SetIP (context, landing_pad); + + return _URC_INSTALL_CONTEXT; + } + +-struct lsda_header_info +-{ +- _Unwind_Ptr Start; +- _Unwind_Ptr LPStart; +- _Unwind_Ptr ttype_base; +- ubyte *TType; +- ubyte *action_table; +- ubyte ttype_encoding; +- ubyte call_site_encoding; +-} +- +-private ubyte * +-parse_lsda_header (_Unwind_Context *context, ubyte *p, +- lsda_header_info *info) +-{ +- _uleb128_t tmp; +- ubyte lpstart_encoding; +- +- info.Start = (context ? _Unwind_GetRegionStart (context) : 0); +- +- // Find @LPStart, the base to which landing pad offsets are relative. +- lpstart_encoding = *p++; +- if (lpstart_encoding != DW_EH_PE_omit) +- p = read_encoded_value (context, lpstart_encoding, p, &info.LPStart); +- else +- info.LPStart = info.Start; +- +- // Find @TType, the base of the handler and exception spec type data. +- info.ttype_encoding = *p++; +- if (info.ttype_encoding != DW_EH_PE_omit) +- { +- version (GNU_ARM_EABI_Unwinder) +- { +- // Older ARM EABI toolchains set this value incorrectly, so use a +- // hardcoded OS-specific format. +- info.ttype_encoding = _TTYPE_ENCODING; +- } +- p = read_uleb128 (p, &tmp); +- info.TType = p + tmp; +- } +- else +- info.TType = null; +- +- // The encoding and length of the call-site table; the action table +- // immediately follows. +- info.call_site_encoding = *p++; +- p = read_uleb128 (p, &tmp); +- info.action_table = p + tmp; +- +- return p; +-} +- +-private ClassInfo +-get_classinfo_entry (lsda_header_info *info, _Unwind_Word i) +-{ +- _Unwind_Ptr ptr; +- +- i *= size_of_encoded_value (info.ttype_encoding); +- read_encoded_value_with_base (info.ttype_encoding, info.ttype_base, +- info.TType - i, &ptr); +- +- return cast(ClassInfo)cast(void *)(ptr); +-} +- +--- a/src/libphobos/libdruntime/gcc/emutls.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/emutls.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,195 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++// This code is based on the libgcc TLS emulation routines. ++ ++ ++module gcc.emutls; ++ ++import core.stdc.stdlib; ++import core.stdc.string; ++import gcc.gthreads; ++import gcc.builtins; ++private alias gcc.builtins.__builtin_machine_uint word_t; ++private alias gcc.builtins.__builtin_pointer_uint pointer_t; ++ ++struct emutls_object_t ++{ ++ word_t size; ++ word_t palign; ++ loc_t loc; ++ void* templ; ++ ++ union loc_t { ++ pointer_t offset; ++ void* ptr; ++ } ++} ++ ++struct emutls_array_t ++{ ++ pointer_t length; ++ void*** ptr; ++} ++ ++private ++{ ++ static __gshared gthread_key_t emutls_key; ++ static __gshared pointer_t emutls_size; ++ static __gshared gthread_mutex_t emutls_mutex; ++} ++ ++extern(C): ++ ++private void ++emutls_destroy(void* ptr) ++{ ++ emutls_array_t* arr = cast(emutls_array_t*) ptr; ++ ++ for (pointer_t i = 0; i < arr.length; i++) ++ { ++ if (arr.ptr[i]) ++ free(arr.ptr[i][-1]); ++ } ++ ++ free(ptr); ++} ++ ++private void ++emutls_init() ++{ ++ gthread_mutex_init(&emutls_mutex); ++ ++ if (gthread_key_create(&emutls_key, &emutls_destroy) != 0) ++ abort(); ++} ++ ++private void* ++emutls_alloc(emutls_object_t* obj) ++{ ++ void* ret; ++ ++ if (obj.palign <= (void*).sizeof) ++ { ++ void* ptr = malloc(cast(pointer_t)(obj.size) + (void*).sizeof); ++ assert(ptr != null); ++ ++ (cast(void**) ptr)[0] = ptr; ++ ret = ptr + (void*).sizeof; ++ } ++ else ++ { ++ pointer_t alignsize = cast(pointer_t)(obj.palign - 1) + (void*).sizeof; ++ void* ptr = malloc(cast(pointer_t)(obj.size) + alignsize); ++ assert(ptr != null); ++ ++ ret = cast(void*)((cast(pointer_t)(ptr + alignsize)) & ~cast(pointer_t)(obj.palign - 1)); ++ (cast(void**) ret)[-1] = ptr; ++ } ++ ++ if (obj.templ) ++ memcpy(ret, obj.templ, cast(pointer_t)(obj.size)); ++ else ++ memset(ret, 0, cast(pointer_t)(obj.size)); ++ ++ return ret; ++} ++ ++void* ++__emutls_get_address(emutls_object_t* obj) ++{ ++ if (! gthread_active_p()) ++ { ++ if (obj.loc.ptr == null) ++ obj.loc.ptr = emutls_alloc(obj); ++ ++ return obj.loc.ptr; ++ } ++ ++ pointer_t offset = obj.loc.offset; ++ ++ if (offset == 0) ++ { ++ static __gshared gthread_once_t once = GTHREAD_ONCE_INIT; ++ gthread_once(&once, &emutls_init); ++ gthread_mutex_lock(&emutls_mutex); ++ offset = obj.loc.offset; ++ ++ if (offset == 0) ++ { ++ offset = ++emutls_size; ++ obj.loc.offset = offset; ++ } ++ ++ gthread_mutex_unlock(&emutls_mutex); ++ } ++ ++ emutls_array_t* arr = cast(emutls_array_t*) gthread_getspecific(emutls_key); ++ if (arr == null) ++ { ++ pointer_t size = offset + 32; ++ arr = cast(emutls_array_t*) malloc(emutls_array_t.sizeof); ++ assert(arr != null); ++ ++ arr.ptr = cast(void***) calloc(size + 1, (void*).sizeof); ++ arr.length = size; ++ gthread_setspecific(emutls_key, cast(void*) arr); ++ } ++ else if (offset > arr.length) ++ { ++ pointer_t orig_size = arr.length; ++ pointer_t size = orig_size * 2; ++ ++ if (offset > size) ++ size = offset + 32; ++ ++ arr.ptr = cast(void***) realloc(arr.ptr, (size + 1) * (void*).sizeof); ++ assert(arr.ptr != null); ++ ++ arr.length = size; ++ memset(arr.ptr + orig_size, 0, (size - orig_size) * (void*).sizeof); ++ gthread_setspecific(emutls_key, cast(void*) arr); ++ } ++ ++ void* ret = arr.ptr[offset - 1]; ++ if (ret == null) ++ { ++ ret = emutls_alloc(obj); ++ arr.ptr[offset - 1] = cast(void**) ret; ++ } ++ ++ return ret; ++} ++ ++void ++__emutls_register_common(emutls_object_t* obj, word_t size, ++ word_t palign, void* templ) ++{ ++ if (obj.size < size) ++ { ++ obj.size = size; ++ obj.templ = null; ++ } ++ ++ if (obj.palign < palign) ++ obj.palign = palign; ++ ++ if (templ && size == obj.size) ++ obj.templ = templ; ++} ++ +--- a/src/libphobos/libdruntime/gcc/gthreads/package.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/gthreads/package.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,26 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++module gcc.gthreads; ++ ++version (GNU_Thread_Posix) ++ public import gcc.gthreads.posix; ++else version (GNU_Thread_Single) ++ public import gcc.gthreads.single; ++else version (GNU_Thread_Win32) ++ public import gcc.gthreads.win32; +--- a/src/libphobos/libdruntime/gcc/gthreads/posix.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/gthreads/posix.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,154 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++// GNU/GCC threads interface routines for D. ++// This must match gthr-posix.h ++ ++module gcc.gthreads.posix; ++ ++// POSIX threads specific definitions. ++// Easy, since the interface is just one-to-one mapping. ++ ++import core.sys.posix.pthread; ++ ++alias gthread_key_t = pthread_key_t; ++alias gthread_once_t = pthread_once_t; ++alias gthread_mutex_t = pthread_mutex_t; ++alias gthread_recursive_mutex_t = pthread_mutex_t; ++ ++enum GTHREAD_MUTEX_INIT = PTHREAD_MUTEX_INITIALIZER; ++enum GTHREAD_ONCE_INIT = PTHREAD_ONCE_INIT; ++enum GTHREAD_RECURSIVE_MUTEX_INIT = PTHREAD_MUTEX_INITIALIZER; ++ ++// Backend thread functions ++extern(C): ++ ++// TODO: FreeBSD and Solaris exposes a dummy POSIX threads ++// interface that will need to be handled here. ++int gthread_active_p() ++{ ++ return 1; ++} ++ ++int gthread_once(gthread_once_t* once, void function() func) ++{ ++ if (gthread_active_p()) ++ return pthread_once(once, func); ++ else ++ return -1; ++} ++ ++int gthread_key_create(gthread_key_t* key, void function(void*) dtor) ++{ ++ return pthread_key_create(key, dtor); ++} ++ ++int gthread_key_delete(gthread_key_t key) ++{ ++ return pthread_key_delete(key); ++} ++ ++void* gthread_getspecific(gthread_key_t key) ++{ ++ return pthread_getspecific(key); ++} ++ ++int gthread_setspecific(gthread_key_t key, in void* ptr) ++{ ++ return pthread_setspecific(key, ptr); ++} ++ ++void gthread_mutex_init(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ pthread_mutex_init(mutex, null); ++} ++ ++int gthread_mutex_destroy(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ return pthread_mutex_destroy(mutex); ++ else ++ return 0; ++} ++ ++int gthread_mutex_lock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ return pthread_mutex_lock(mutex); ++ else ++ return 0; ++} ++ ++int gthread_mutex_trylock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ return pthread_mutex_trylock(mutex); ++ else ++ return 0; ++} ++ ++int gthread_mutex_unlock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ return pthread_mutex_unlock(mutex); ++ else ++ return 0; ++} ++ ++int gthread_recursive_mutex_init(gthread_recursive_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ { ++ pthread_mutexattr_t attr; ++ int status = pthread_mutexattr_init(&attr); ++ ++ if (!status) ++ status = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); ++ ++ if (!status) ++ status = pthread_mutex_init(mutex, &attr); ++ ++ if (!status) ++ status = pthread_mutexattr_destroy(&attr); ++ ++ return status; ++ } ++ return 0; ++} ++ ++int gthread_recursive_mutex_lock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_lock(mutex); ++} ++ ++int gthread_recursive_mutex_trylock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_trylock(mutex); ++} ++ ++int gthread_recursive_mutex_unlock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_unlock(mutex); ++} ++ ++int gthread_recursive_mutex_destroy(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_destroy(mutex); ++} ++ +--- a/src/libphobos/libdruntime/gcc/gthreads/single.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/gthreads/single.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,118 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++// GNU/GCC threads interface routines for D. ++// This must match gthr-single.h ++ ++module gcc.gthreads.single; ++ ++// Just provide compatibility for mutex handling. ++ ++alias gthread_key_t = int; ++alias gthread_once_t = int; ++alias gthread_mutex_t = int; ++alias gthread_recursive_mutex_t = int; ++ ++enum GTHREAD_MUTEX_INIT = 0; ++enum GTHREAD_ONCE_INIT = 0; ++enum GTHREAD_RECURSIVE_MUTEX_INIT = 0; ++ ++// Backend thread functions ++extern(C): ++ ++int gthread_active_p() ++{ ++ return 0; ++} ++ ++int gthread_once(gthread_once_t*, void function()) ++{ ++ return 0; ++} ++ ++int gthread_key_create(gthread_key_t*, void* function(void*)) ++{ ++ return 0; ++} ++ ++int gthread_key_delete(gthread_key_t) ++{ ++ return 0; ++} ++ ++void* gthread_getspecific(gthread_key_t) ++{ ++ return null; ++} ++ ++int gthread_setspecific(gthread_key_t, in void*) ++{ ++ return 0; ++} ++ ++void gthread_mutex_init(gthread_mutex_t* mutex) ++{ ++ *(mutex) = GTHREAD_MUTEX_INIT; ++} ++ ++int gthread_mutex_destroy(gthread_mutex_t*) ++{ ++ return 0; ++} ++ ++int gthread_mutex_lock(gthread_mutex_t*) ++{ ++ return 0; ++} ++ ++int gthread_mutex_trylock(gthread_mutex_t*) ++{ ++ return 0; ++} ++ ++int gthread_mutex_unlock(gthread_mutex_t*) ++{ ++ return 0; ++} ++ ++int gthread_recursive_mutex_init(gthread_mutex_t* mutex) ++{ ++ gthread_mutex_init(mutex); ++ return 0; ++} ++ ++int gthread_recursive_mutex_lock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_lock(mutex); ++} ++ ++int gthread_recursive_mutex_trylock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_trylock(mutex); ++} ++ ++int gthread_recursive_mutex_unlock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_unlock(mutex); ++} ++ ++int gthread_recursive_mutex_destroy(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_destroy(mutex); ++} ++ +--- a/src/libphobos/libdruntime/gcc/gthreads/win32.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/gthreads/win32.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,219 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++// GNU/GCC threads interface routines for D. ++// This must match gthr-win32.h ++ ++module gcc.gthreads.win32; ++ ++/* Windows32 threads specific definitions. The windows32 threading model ++ does not map well into pthread-inspired gcc's threading model, and so ++ there are caveats one needs to be aware of. ++ ++ 1. The destructor supplied to gthread_key_create is ignored for ++ generic x86-win32 ports. ++ ++ However, Mingw runtime (version 0.3 or newer) provides a mechanism ++ to emulate pthreads key dtors; the runtime provides a special DLL, ++ linked in if -mthreads option is specified, that runs the dtors in ++ the reverse order of registration when each thread exits. If ++ -mthreads option is not given, a stub is linked in instead of the ++ DLL, which results in memory leak. Other x86-win32 ports can use ++ the same technique of course to avoid the leak. ++ ++ 2. The error codes returned are non-POSIX like, and cast into ints. ++ This may cause incorrect error return due to truncation values on ++ hw where DWORD.sizeof > int.sizeof. ++ ++ The basic framework should work well enough. In the long term, GCC ++ needs to use Structured Exception Handling on Windows32. */ ++ ++import core.sys.windows.windows; ++import core.stdc.errno; ++ ++alias gthread_key_t = ULONG; ++ ++struct gthread_once_t ++{ ++ INT done; ++ LONG started; ++} ++ ++alias gthread_mutex_t = CRITICAL_SECTION; ++alias gthread_recursive_mutex_t = CRITICAL_SECTION; ++ ++enum GTHREAD_MUTEX_INIT = CRITICAL_SECTION.init; ++enum GTHREAD_ONCE_INIT = gthread_once_t(0, -1); ++enum GTHREAD_RECURSIVE_MUTEX_INIT = CRITICAL_SECTION.init; ++ ++extern(C): ++ ++version (MinGW) ++{ ++ // Mingw runtime >= v0.3 provides a magic variable that is set to nonzero ++ // if -mthreads option was specified, or 0 otherwise. ++ extern int _CRT_MT; ++ extern int __mingwthr_key_dtor(ULONG, void function(void*)); ++} ++ ++// Backend thread functions ++ ++int gthread_active_p() ++{ ++ version (MinGW) ++ return _CRT_MT; ++ else ++ return 1; ++} ++ ++int gthread_once(gthread_once_t* once, void function() func) ++{ ++ if (! gthread_active_p()) ++ return -1; ++ else if (once == null || func == null) ++ return EINVAL; ++ ++ if (! once.done) ++ { ++ if (InterlockedIncrement(&(once.started)) == 0) ++ { ++ func(); ++ once.done = TRUE; ++ } ++ else ++ { ++ /* Another thread is currently executing the code, so wait for it ++ to finish; yield the CPU in the meantime. If performance ++ does become an issue, the solution is to use an Event that ++ we wait on here (and set above), but that implies a place to ++ create the event before this routine is called. */ ++ while (! once.done) ++ Sleep(0); ++ } ++ } ++ return 0; ++} ++ ++/* Windows32 thread local keys don't support destructors; this leads to ++ leaks, especially in threaded applications making extensive use of ++ C++ EH. Mingw uses a thread-support DLL to work-around this problem. */ ++int gthread_key_create(gthread_key_t* key, void function(void*) dtor) ++{ ++ DWORD tlsindex = TlsAlloc(); ++ ++ if (tlsindex != 0xFFFFFFFF) ++ { ++ *key = tlsindex; ++ /* Mingw runtime will run the dtors in reverse order for each thread ++ when the thread exits. */ ++ version (MinGW) ++ return __mingwthr_key_dtor(*key, dtor); ++ } ++ else ++ return GetLastError(); ++ ++ return 0; ++} ++ ++int gthread_key_delete(gthread_key_t key) ++{ ++ if (TlsFree(key) != 0) ++ return 0; ++ else ++ return GetLastError(); ++} ++ ++void* gthread_getspecific(gthread_key_t key) ++{ ++ DWORD lasterror = GetLastError(); ++ void* ptr = TlsGetValue(key); ++ ++ SetLastError(lasterror); ++ ++ return ptr; ++} ++ ++int gthread_setspecific(gthread_key_t key, in void* ptr) ++{ ++ if (TlsSetValue(key, cast(void*) ptr) != 0) ++ return 0; ++ else ++ return GetLastError(); ++} ++ ++void gthread_mutex_init(gthread_mutex_t* mutex) ++{ ++ InitializeCriticalSection(mutex); ++} ++ ++int gthread_mutex_destroy(gthread_mutex_t* mutex) ++{ ++ DeleteCriticalSection(mutex); ++ return 0; ++} ++ ++int gthread_mutex_lock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ EnterCriticalSection(mutex); ++ ++ return 0; ++} ++ ++int gthread_mutex_trylock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ return TryEnterCriticalSection(mutex); ++ else ++ return 0; ++} ++ ++int gthread_mutex_unlock(gthread_mutex_t* mutex) ++{ ++ if (gthread_active_p()) ++ LeaveCriticalSection(mutex); ++ ++ return 0; ++} ++ ++int gthread_recursive_mutex_init(gthread_mutex_t* mutex) ++{ ++ gthread_mutex_init(mutex); ++ return 0; ++} ++ ++int gthread_recursive_mutex_lock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_lock(mutex); ++} ++ ++int gthread_recursive_mutex_trylock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_trylock(mutex); ++} ++ ++int gthread_recursive_mutex_unlock(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_unlock(mutex); ++} ++ ++int gthread_recursive_mutex_destroy(gthread_recursive_mutex_t* mutex) ++{ ++ return gthread_mutex_destroy(mutex); ++} ++ +--- a/src/libphobos/libdruntime/gcc/libbacktrace.d.in 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/libbacktrace.d.in 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,88 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* This module provides access to GCC libbacktrace functions */ ++module gcc.libbacktrace; ++ ++/* ++ * This is not part of libbacktrace, it's used for the temporary gdc fallback ++ * implementation. To avoid adding another autoconf module it's defined here ++ */ ++ ++enum HAVE_DLADDR = @HAVE_DLADDR@; ++static if (HAVE_DLADDR) ++{ ++ extern(C): ++ int dladdr(void *addr, Dl_info *info); ++ struct Dl_info ++ { ++ const (char*) dli_fname; ++ void* dli_fbase; ++ const (char*) dli_sname; ++ void* dli_saddr; ++ } ++} ++ ++/* ++ * Part of backtrace-supported.h: These are platform specific variables. ++ * They are obtained via the configure script ++ */ ++ ++enum BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@; ++enum BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@; ++enum BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@; ++ ++/* ++ * libbacktrace.h ++ */ ++ ++static if(BACKTRACE_SUPPORTED) ++{ ++ import core.stdc.stddef, core.stdc.stdio, core.stdc.stdint; ++ ++ extern(C): ++ struct backtrace_state {} ++ ++ alias extern(C) void function(void* data, ++ const(char)* msg, int errnum) backtrace_error_callback; ++ ++ backtrace_state* backtrace_create_state( const(char)* filename, int threaded, ++ backtrace_error_callback error_callback, void* data); ++ ++ alias extern(C) int function(void* data, uintptr_t pc, ++ const(char)* filename, int lineno, const(char)* func) backtrace_full_callback; ++ ++ int backtrace_full(backtrace_state* state, int skip, backtrace_full_callback callback, ++ backtrace_error_callback error_callback, void* data); ++ ++ alias extern(C) int function(void* data, uintptr_t pc) backtrace_simple_callback; ++ ++ int backtrace_simple(backtrace_state* state, int skip, backtrace_simple_callback callback, ++ backtrace_error_callback error_callback, void* data); ++ ++ void backtrace_print(backtrace_state* state, int skip, FILE* file); ++ ++ int backtrace_pcinfo(backtrace_state* state, uintptr_t pc, backtrace_full_callback callback, ++ backtrace_error_callback error_callback, void* data); ++ ++ alias extern(C) void function(void* data, uintptr_t pc, ++ const(char)* symname, uintptr_t symval) backtrace_syminfo_callback; ++ ++ int backtrace_syminfo(backtrace_state *state, uintptr_t pc, backtrace_syminfo_callback callback, ++ backtrace_error_callback error_callback, void* data); ++} +--- a/src/libphobos/libdruntime/gcc/unwind/arm.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind/arm.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,312 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* ARM unwind interface declarations for D. This must match unwind-arm.h. */ ++ ++module gcc.unwind.arm; ++ ++import gcc.builtins; ++import gcc.unwind.pe; ++ ++extern (C): ++ ++alias _Unwind_Word = __builtin_machine_uint; ++alias _Unwind_Sword = __builtin_machine_int; ++alias _Unwind_Ptr = __builtin_pointer_uint; ++alias _Unwind_Internal_Ptr =__builtin_pointer_uint; ++alias _uw = _Unwind_Word; ++alias _uw64 = ulong; ++alias _uw16 = ushort; ++alias _uw8 = ubyte; ++ ++alias _Unwind_Reason_Code = uint; ++enum : _Unwind_Reason_Code ++{ ++ _URC_OK = 0, /* operation completed successfully */ ++ _URC_FOREIGN_EXCEPTION_CAUGHT = 1, ++ _URC_END_OF_STACK = 5, ++ _URC_HANDLER_FOUND = 6, ++ _URC_INSTALL_CONTEXT = 7, ++ _URC_CONTINUE_UNWIND = 8, ++ _URC_FAILURE = 9 /* unspecified failure of some kind */ ++} ++ ++alias _Unwind_State = int; ++enum : _Unwind_State ++{ ++ _US_VIRTUAL_UNWIND_FRAME = 0, ++ _US_UNWIND_FRAME_STARTING = 1, ++ _US_UNWIND_FRAME_RESUME = 2, ++ _US_ACTION_MASK = 3, ++ _US_FORCE_UNWIND = 8, ++ _US_END_OF_STACK = 16 ++} ++ ++/* Provided only for for compatibility with existing code. */ ++alias _Unwind_Action = int; ++enum : _Unwind_Action ++{ ++ _UA_SEARCH_PHASE = 1, ++ _UA_CLEANUP_PHASE = 2, ++ _UA_HANDLER_FRAME = 4, ++ _UA_FORCE_UNWIND = 8, ++ _UA_END_OF_STACK = 16, ++ _URC_NO_REASON = _URC_OK ++} ++ ++struct _Unwind_Context; ++alias _Unwind_EHT_Header = _uw; ++ ++extern(C) alias _Unwind_Exception_Cleanup_Fn ++ = void function(_Unwind_Reason_Code, _Unwind_Exception *); ++ ++/* UCB: */ ++ ++struct _Unwind_Control_Block ++{ ++ _Unwind_Exception_Class exception_class = '\0'; ++ _Unwind_Exception_Cleanup_Fn exception_cleanup; ++ /* Unwinder cache, private fields for the unwinder's use */ ++ struct _unwinder_cache ++ { ++ _uw reserved1; /* Forced unwind stop fn, 0 if not forced */ ++ _uw reserved2; /* Personality routine address */ ++ _uw reserved3; /* Saved callsite address */ ++ _uw reserved4; /* Forced unwind stop arg */ ++ _uw reserved5; ++ } ++ _unwinder_cache unwinder_cache; ++ /* Propagation barrier cache (valid after phase 1): */ ++ struct _barrier_cache ++ { ++ _uw sp; ++ _uw[5] bitpattern; ++ } ++ _barrier_cache barrier_cache; ++ /* Cleanup cache (preserved over cleanup): */ ++ struct _cleanup_cache ++ { ++ _uw[4] bitpattern; ++ } ++ _cleanup_cache cleanup_cache; ++ /* Pr cache (for pr's benefit): */ ++ struct _pr_cache ++ { ++ _uw fnstart; /* function start address */ ++ _Unwind_EHT_Header *ehtp; /* pointer to EHT entry header word */ ++ _uw additional; /* additional data */ ++ _uw reserved1; ++ } ++ _pr_cache pr_cache; ++ long[0] _force_alignment; /* Force alignment to 8-byte boundary */ ++} ++ ++/* Virtual Register Set*/ ++alias _Unwind_VRS_RegClass = int; ++enum : _Unwind_VRS_RegClass ++{ ++ _UVRSC_CORE = 0, /* integer register */ ++ _UVRSC_VFP = 1, /* vfp */ ++ _UVRSC_FPA = 2, /* fpa */ ++ _UVRSC_WMMXD = 3, /* Intel WMMX data register */ ++ _UVRSC_WMMXC = 4 /* Intel WMMX control register */ ++} ++ ++alias _Unwind_VRS_DataRepresentation = int; ++enum : _Unwind_VRS_DataRepresentation ++{ ++ _UVRSD_UINT32 = 0, ++ _UVRSD_VFPX = 1, ++ _UVRSD_FPAX = 2, ++ _UVRSD_UINT64 = 3, ++ _UVRSD_FLOAT = 4, ++ _UVRSD_DOUBLE = 5 ++} ++ ++alias _Unwind_VRS_Result = int; ++enum : _Unwind_VRS_Result ++{ ++ _UVRSR_OK = 0, ++ _UVRSR_NOT_IMPLEMENTED = 1, ++ _UVRSR_FAILED = 2 ++} ++ ++/* Frame unwinding state. */ ++struct __gnu_unwind_state ++{ ++ /* The current word (bytes packed msb first). */ ++ _uw data; ++ /* Pointer to the next word of data. */ ++ _uw *next; ++ /* The number of bytes left in this word. */ ++ _uw8 bytes_left; ++ /* The number of words pointed to by ptr. */ ++ _uw8 words_left; ++} ++ ++extern(C) alias personality_routine ++ = _Unwind_Reason_Code function(_Unwind_State, ++ _Unwind_Control_Block *, ++ _Unwind_Context *); ++ ++_Unwind_VRS_Result _Unwind_VRS_Set(_Unwind_Context *, _Unwind_VRS_RegClass, ++ _uw, _Unwind_VRS_DataRepresentation, ++ void *); ++ ++_Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context *, _Unwind_VRS_RegClass, ++ _uw, _Unwind_VRS_DataRepresentation, ++ void *); ++ ++_Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *, _Unwind_VRS_RegClass, ++ _uw, _Unwind_VRS_DataRepresentation); ++ ++ ++/* Support functions for the PR. */ ++alias _Unwind_Exception = _Unwind_Control_Block; ++alias _Unwind_Exception_Class = char[8]; ++ ++void * _Unwind_GetLanguageSpecificData (_Unwind_Context *); ++_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); ++ ++_Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *); ++/* This should never be used. */ ++_Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *); ++ ++/* Interface functions: */ ++_Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Control_Block *ucbp); ++/*pragma (noreturn)*/ void _Unwind_Resume(_Unwind_Control_Block *ucbp); ++_Unwind_Reason_Code _Unwind_Resume_or_Rethrow (_Unwind_Control_Block *ucbp); ++ ++extern(C) alias _Unwind_Stop_Fn ++ =_Unwind_Reason_Code function(int, _Unwind_Action, ++ _Unwind_Exception_Class, ++ _Unwind_Control_Block *, ++ _Unwind_Context *, void *); ++ ++_Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *, ++ _Unwind_Stop_Fn, void *); ++ ++/* @@@ Use unwind data to perform a stack backtrace. The trace callback ++ is called for every stack frame in the call chain, but no cleanup ++ actions are performed. */ ++extern(C) alias _Unwind_Trace_Fn ++ = _Unwind_Reason_Code function(_Unwind_Context *, void *); ++ ++_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void *); ++ ++_Unwind_Word _Unwind_GetCFA (_Unwind_Context *); ++void _Unwind_Complete(_Unwind_Control_Block *ucbp); ++void _Unwind_DeleteException (_Unwind_Exception *); ++ ++_Unwind_Reason_Code __gnu_unwind_frame (_Unwind_Control_Block *, ++ _Unwind_Context *); ++_Unwind_Reason_Code __gnu_unwind_execute (_Unwind_Context *, ++ __gnu_unwind_state *); ++ ++_Unwind_Word ++_Unwind_GetIPInfo (_Unwind_Context *context, int *ip_before_insn) ++{ ++ *ip_before_insn = 0; ++ return _Unwind_GetIP (context); ++} ++ ++_Unwind_Word ++_Unwind_GetGR (_Unwind_Context *context, int regno) ++{ ++ _uw val; ++ _Unwind_VRS_Get (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val); ++ return val; ++} ++ ++void ++_Unwind_SetGR (_Unwind_Context *context, int regno, _Unwind_Word val) ++{ ++ _Unwind_VRS_Set (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val); ++} ++ ++/* leb128 type numbers have a potentially unlimited size. ++ The target of the following definitions of _sleb128_t and _uleb128_t ++ is to have efficient data types large enough to hold the leb128 type ++ numbers used in the unwind code. */ ++alias _sleb128_t = __builtin_clong; ++alias _uleb128_t = __builtin_culong; ++ ++enum int UNWIND_STACK_REG = 13; ++/* Use IP as a scratch register within the personality routine. */ ++enum int UNWIND_POINTER_REG = 12; ++ ++version (linux) ++ const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel | DW_EH_PE_indirect); ++else version (NetBSD) ++ const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel | DW_EH_PE_indirect); ++else version (symbian) // TODO: name ++ const ubyte _TTYPE_ENCODING = (DW_EH_PE_absptr); ++else version (uclinux) // TODO: name ++ const ubyte _TTYPE_ENCODING = (DW_EH_PE_absptr); ++else ++ const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel); ++ ++/* Decode an R_ARM_TARGET2 relocation. */ ++_Unwind_Word ++_Unwind_decode_typeinfo_ptr (_Unwind_Word base, _Unwind_Word ptr) ++{ ++ _Unwind_Word tmp; ++ tmp = *cast(_Unwind_Word *) ptr; ++ /* Zero values are always NULL. */ ++ if (!tmp) ++ return 0; ++ ++ if (_TTYPE_ENCODING == (DW_EH_PE_pcrel | DW_EH_PE_indirect)) ++ { ++ /* Pc-relative indirect. */ ++ tmp += ptr; ++ tmp = *cast(_Unwind_Word *) tmp; ++ } ++ else if (_TTYPE_ENCODING == DW_EH_PE_absptr) ++ { ++ /* Absolute pointer. Nothing more to do. */ ++ } ++ else ++ { ++ /* Pc-relative pointer. */ ++ tmp += ptr; ++ } ++ return tmp; ++} ++ ++_Unwind_Reason_Code ++__gnu_unwind_24bit (_Unwind_Context * context, _uw data, int compact) ++{ ++ return _URC_FAILURE; ++} ++ ++/* Return the address of the instruction, not the actual IP value. */ ++_Unwind_Word ++_Unwind_GetIP(_Unwind_Context *context) ++{ ++ return _Unwind_GetGR (context, 15) & ~ cast(_Unwind_Word) 1; ++} ++ ++/* The dwarf unwinder doesn't understand arm/thumb state. We assume the ++ landing pad uses the same instruction set as the call site. */ ++void ++_Unwind_SetIP(_Unwind_Context *context, _Unwind_Word val) ++{ ++ return _Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1)); ++} ++ +--- a/src/libphobos/libdruntime/gcc/unwind/generic.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind/generic.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,252 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* GNU/GCC unwind interface declarations for D. This must match ++ unwind-generic.h */ ++ ++module gcc.unwind.generic; ++ ++private import gcc.builtins; ++private import core.stdc.stdlib; // for abort ++ ++/* This is derived from the C++ ABI for IA-64. Where we diverge ++ for cross-architecture compatibility are noted with "@@@". */ ++ ++extern (C): ++ ++/* Level 1: Base ABI */ ++ ++/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is ++ inefficient for 32-bit and smaller machines. */ ++alias _Unwind_Word = __builtin_unwind_uint; ++alias _Unwind_Sword = __builtin_unwind_int; ++version (IA64) ++{ ++ version (HPUX) ++ alias _Unwind_Ptr = __builtin_machine_uint; ++ else ++ alias _Unwind_Ptr = __builtin_pointer_uint; ++} ++else ++{ ++ alias _Unwind_Ptr = __builtin_pointer_uint; ++} ++alias _Unwind_Internal_Ptr = __builtin_pointer_uint; ++ ++/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and ++ consumer of an exception. We'll go along with this for now even on ++ 32-bit machines. We'll need to provide some other option for ++ 16-bit machines and for machines with > 8 bits per byte. */ ++alias _Unwind_Exception_Class = ulong; ++ ++/* The unwind interface uses reason codes in several contexts to ++ identify the reasons for failures or other actions. */ ++alias _Unwind_Reason_Code = uint; ++enum : _Unwind_Reason_Code ++{ ++ _URC_NO_REASON = 0, ++ _URC_FOREIGN_EXCEPTION_CAUGHT = 1, ++ _URC_FATAL_PHASE2_ERROR = 2, ++ _URC_FATAL_PHASE1_ERROR = 3, ++ _URC_NORMAL_STOP = 4, ++ _URC_END_OF_STACK = 5, ++ _URC_HANDLER_FOUND = 6, ++ _URC_INSTALL_CONTEXT = 7, ++ _URC_CONTINUE_UNWIND = 8 ++} ++ ++/* The unwind interface uses a pointer to an exception header object ++ as its representation of an exception being thrown. In general, the ++ full representation of an exception object is language- and ++ implementation-specific, but it will be prefixed by a header ++ understood by the unwind interface. */ ++ ++extern(C) alias _Unwind_Exception_Cleanup_Fn ++ = void function(_Unwind_Reason_Code, _Unwind_Exception *); ++ ++/* @@@ The IA-64 ABI says that this structure must be double-word aligned. ++ Taking that literally does not make much sense generically. Instead we ++ provide the maximum alignment required by any type for the machine. */ ++struct _Unwind_Exception ++{ ++ _Unwind_Exception_Class exception_class; ++ _Unwind_Exception_Cleanup_Fn exception_cleanup; ++ _Unwind_Word private_1; ++ _Unwind_Word private_2; ++} ++ ++/* The ACTIONS argument to the personality routine is a bitwise OR of one ++ or more of the following constants. */ ++alias _Unwind_Action = int; ++ ++enum ++{ ++ _UA_SEARCH_PHASE = 1, ++ _UA_CLEANUP_PHASE = 2, ++ _UA_HANDLER_FRAME = 4, ++ _UA_FORCE_UNWIND = 8, ++ _UA_END_OF_STACK = 16 ++} ++ ++/* This is an opaque type used to refer to a system-specific data ++ structure used by the system unwinder. This context is created and ++ destroyed by the system, and passed to the personality routine ++ during unwinding. */ ++struct _Unwind_Context; ++ ++/* Raise an exception, passing along the given exception object. */ ++_Unwind_Reason_Code _Unwind_RaiseException (_Unwind_Exception *); ++ ++/* Raise an exception for forced unwinding. */ ++ ++extern(C) alias _Unwind_Stop_Fn ++ = _Unwind_Reason_Code function (int, _Unwind_Action, ++ _Unwind_Exception_Class, ++ _Unwind_Exception *, ++ _Unwind_Context *, void *); ++ ++_Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Exception *, _Unwind_Stop_Fn, void *); ++ ++/* Helper to invoke the exception_cleanup routine. */ ++void _Unwind_DeleteException (_Unwind_Exception *); ++ ++/* Resume propagation of an existing exception. This is used after ++ e.g. executing cleanup code, and not to implement rethrowing. */ ++void _Unwind_Resume (_Unwind_Exception *); ++ ++/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow ++ a normal exception that was handled. */ ++_Unwind_Reason_Code _Unwind_Resume_or_Rethrow (_Unwind_Exception *); ++ ++/* @@@ Use unwind data to perform a stack backtrace. The trace callback ++ is called for every stack frame in the call chain, but no cleanup ++ actions are performed. */ ++extern(C) alias _Unwind_Trace_Fn ++ = _Unwind_Reason_Code function (_Unwind_Context *, void *); ++ ++_Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); ++ ++/* These functions are used for communicating information about the unwind ++ context (i.e. the unwind descriptors and the user register state) between ++ the unwind library and the personality routine and landing pad. Only ++ selected registers may be manipulated. */ ++ ++_Unwind_Word _Unwind_GetGR (_Unwind_Context *, int); ++void _Unwind_SetGR (_Unwind_Context *, int, _Unwind_Word); ++ ++_Unwind_Ptr _Unwind_GetIP (_Unwind_Context *); ++_Unwind_Ptr _Unwind_GetIPInfo (_Unwind_Context *, int *); ++void _Unwind_SetIP (_Unwind_Context *, _Unwind_Ptr); ++ ++/* @@@ Retrieve the CFA of the given context. */ ++_Unwind_Word _Unwind_GetCFA (_Unwind_Context *); ++ ++void *_Unwind_GetLanguageSpecificData (_Unwind_Context *); ++ ++_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); ++ ++ ++/* The personality routine is the function in the C++ (or other language) ++ runtime library which serves as an interface between the system unwind ++ library and language-specific exception handling semantics. It is ++ specific to the code fragment described by an unwind info block, and ++ it is always referenced via the pointer in the unwind info block, and ++ hence it has no ABI-specified name. ++ ++ Note that this implies that two different C++ implementations can ++ use different names, and have different contents in the language ++ specific data area. Moreover, that the language specific data ++ area contains no version info because name of the function invoked ++ provides more effective versioning by detecting at link time the ++ lack of code to handle the different data format. */ ++ ++extern(C) alias _Unwind_Personality_Fn ++ = _Unwind_Reason_Code function (int, _Unwind_Action, ++ _Unwind_Exception_Class, ++ _Unwind_Exception *, ++ _Unwind_Context *); ++ ++/* @@@ The following alternate entry points are for setjmp/longjmp ++ based unwinding. */ ++ ++struct SjLj_Function_Context; ++extern void _Unwind_SjLj_Register (SjLj_Function_Context *); ++extern void _Unwind_SjLj_Unregister (SjLj_Function_Context *); ++ ++_Unwind_Reason_Code _Unwind_SjLj_RaiseException (_Unwind_Exception *); ++_Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind (_Unwind_Exception *, _Unwind_Stop_Fn, void *); ++void _Unwind_SjLj_Resume (_Unwind_Exception *); ++_Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (_Unwind_Exception *); ++ ++/* @@@ The following provide access to the base addresses for text ++ and data-relative addressing in the LDSA. In order to stay link ++ compatible with the standard ABI for IA-64, we inline these. */ ++ ++version (IA64) ++{ ++ _Unwind_Ptr ++ _Unwind_GetDataRelBase (_Unwind_Context *_C) ++ { ++ /* The GP is stored in R1. */ ++ return _Unwind_GetGR (_C, 1); ++ } ++ ++ _Unwind_Ptr ++ _Unwind_GetTextRelBase (_Unwind_Context *) ++ { ++ abort (); ++ return 0; ++ } ++ ++ /* @@@ Retrieve the Backing Store Pointer of the given context. */ ++ _Unwind_Word _Unwind_GetBSP (_Unwind_Context *); ++} ++else ++{ ++ _Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *); ++ _Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *); ++} ++ ++/* @@@ Given an address, return the entry point of the function that ++ contains it. */ ++extern void * _Unwind_FindEnclosingFunction (void *pc); ++ ++ ++/* leb128 type numbers have a potentially unlimited size. ++ The target of the following definitions of _sleb128_t and _uleb128_t ++ is to have efficient data types large enough to hold the leb128 type ++ numbers used in the unwind code. ++ Mostly these types will simply be defined to long and unsigned long ++ except when a unsigned long data type on the target machine is not ++ capable of storing a pointer. */ ++ ++static if (__builtin_clong.sizeof >= (void*).sizeof) ++{ ++ alias _sleb128_t = __builtin_clong; ++ alias _uleb128_t = __builtin_culong; ++} ++else static if (long.sizeof >= (void*).sizeof) ++{ ++ alias _sleb128_t = long; ++ alias _uleb128_t = ulong; ++} ++else ++{ ++ static assert (0, "What type shall we use for _sleb128_t?"); ++} ++ +--- a/src/libphobos/libdruntime/gcc/unwind/package.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind/package.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,24 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++module gcc.unwind; ++ ++version (GNU_ARM_EABI_Unwinder) ++ public import gcc.unwind.arm; ++else ++ public import gcc.unwind.generic; +--- a/src/libphobos/libdruntime/gcc/unwind/pe.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind/pe.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,273 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2011, 2012 Free Software Foundation, Inc. ++ ++ GCC is free software; you can redistribute it and/or modify it under ++ the terms of the GNU General Public License as published by the Free ++ Software Foundation; either version 3, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING3. If not see ++ . ++*/ ++ ++/* GNU/GCC unwind interface declarations for D. This must match unwind-pe.h */ ++ ++module gcc.unwind.pe; ++ ++import gcc.unwind; ++private import core.stdc.stdlib : abort; ++ ++/* Pointer encodings, from dwarf2.h. */ ++enum ++{ ++ DW_EH_PE_absptr = 0x00, ++ DW_EH_PE_omit = 0xff, ++ ++ DW_EH_PE_uleb128 = 0x01, ++ DW_EH_PE_udata2 = 0x02, ++ DW_EH_PE_udata4 = 0x03, ++ DW_EH_PE_udata8 = 0x04, ++ DW_EH_PE_sleb128 = 0x09, ++ DW_EH_PE_sdata2 = 0x0A, ++ DW_EH_PE_sdata4 = 0x0B, ++ DW_EH_PE_sdata8 = 0x0C, ++ DW_EH_PE_signed = 0x08, ++ ++ DW_EH_PE_pcrel = 0x10, ++ DW_EH_PE_textrel = 0x20, ++ DW_EH_PE_datarel = 0x30, ++ DW_EH_PE_funcrel = 0x40, ++ DW_EH_PE_aligned = 0x50, ++ ++ DW_EH_PE_indirect = 0x80 ++} ++ ++version (NO_SIZE_OF_ENCODED_VALUE) {} ++else ++{ ++ /* Given an encoding, return the number of bytes the format occupies. ++ This is only defined for fixed-size encodings, and so does not ++ include leb128. */ ++ uint size_of_encoded_value (ubyte encoding) ++ { ++ if (encoding == DW_EH_PE_omit) ++ return 0; ++ ++ final switch (encoding & 0x07) ++ { ++ case DW_EH_PE_absptr: ++ return (void *).sizeof; ++ case DW_EH_PE_udata2: ++ return 2; ++ case DW_EH_PE_udata4: ++ return 4; ++ case DW_EH_PE_udata8: ++ return 8; ++ } ++ assert(0); ++ } ++} ++ ++version (NO_BASE_OF_ENCODED_VALUE) {} ++else ++{ ++ /* Given an encoding and an _Unwind_Context, return the base to which ++ the encoding is relative. This base may then be passed to ++ read_encoded_value_with_base for use when the _Unwind_Context is ++ not available. */ ++ ++ _Unwind_Ptr ++ base_of_encoded_value (ubyte encoding, _Unwind_Context *context) ++ { ++ if (encoding == DW_EH_PE_omit) ++ return cast(_Unwind_Ptr) 0; ++ ++ final switch (encoding & 0x70) ++ { ++ case DW_EH_PE_absptr: ++ case DW_EH_PE_pcrel: ++ case DW_EH_PE_aligned: ++ return cast(_Unwind_Ptr) 0; ++ ++ case DW_EH_PE_textrel: ++ return _Unwind_GetTextRelBase (context); ++ case DW_EH_PE_datarel: ++ return _Unwind_GetDataRelBase (context); ++ case DW_EH_PE_funcrel: ++ return _Unwind_GetRegionStart (context); ++ } ++ assert (0); ++ } ++} ++ ++/* Read an unsigned leb128 value from P, store the value in VAL, return ++ P incremented past the value. We assume that a word is large enough to ++ hold any value so encoded; if it is smaller than a pointer on some target, ++ pointers should not be leb128 encoded on that target. */ ++ ++ubyte * ++read_uleb128 (ubyte *p, _uleb128_t *val) ++{ ++ uint shift = 0; ++ ubyte a_byte; ++ _uleb128_t result; ++ ++ result = cast(_uleb128_t) 0; ++ do ++ { ++ a_byte = *p++; ++ result |= (cast(_uleb128_t)a_byte & 0x7f) << shift; ++ shift += 7; ++ } ++ while (a_byte & 0x80); ++ ++ *val = result; ++ return p; ++} ++ ++/* Similar, but read a signed leb128 value. */ ++ ++ubyte * ++read_sleb128 (ubyte *p, _sleb128_t *val) ++{ ++ uint shift = 0; ++ ubyte a_byte; ++ _uleb128_t result; ++ ++ result = cast(_uleb128_t) 0; ++ do ++ { ++ a_byte = *p++; ++ result |= (cast(_uleb128_t)a_byte & 0x7f) << shift; ++ shift += 7; ++ } ++ while (a_byte & 0x80); ++ ++ /* Sign-extend a negative value. */ ++ if (shift < 8 * result.sizeof && (a_byte & 0x40) != 0) ++ result |= -((cast(_uleb128_t)1L) << shift); ++ ++ *val = cast(_sleb128_t) result; ++ return p; ++} ++ ++/* Load an encoded value from memory at P. The value is returned in VAL; ++ The function returns P incremented past the value. BASE is as given ++ by base_of_encoded_value for this encoding in the appropriate context. */ ++ ++ubyte * ++read_encoded_value_with_base (ubyte encoding, _Unwind_Ptr base, ++ ubyte *p, _Unwind_Ptr *val) ++{ ++ union unaligned ++ { ++ align(1): ++ void *ptr; ++ ushort u2; ++ uint u4; ++ ulong u8; ++ short s2; ++ int s4; ++ long s8; ++ } ++ ++ unaligned *u = cast(unaligned *) p; ++ _Unwind_Internal_Ptr result; ++ ++ if (encoding == DW_EH_PE_aligned) ++ { ++ _Unwind_Internal_Ptr a = cast(_Unwind_Internal_Ptr) p; ++ a = cast(_Unwind_Internal_Ptr)( (a + (void *).sizeof - 1) & - (void *).sizeof ); ++ result = *cast(_Unwind_Internal_Ptr *) a; ++ p = cast(ubyte *) cast(_Unwind_Internal_Ptr) (a + (void *).sizeof); ++ } ++ else ++ { ++ switch (encoding & 0x0f) ++ { ++ case DW_EH_PE_absptr: ++ result = cast(_Unwind_Internal_Ptr) u.ptr; ++ p += (void *).sizeof; ++ break; ++ ++ case DW_EH_PE_uleb128: ++ { ++ _uleb128_t tmp; ++ p = read_uleb128 (p, &tmp); ++ result = cast(_Unwind_Internal_Ptr) tmp; ++ } ++ break; ++ ++ case DW_EH_PE_sleb128: ++ { ++ _sleb128_t tmp; ++ p = read_sleb128 (p, &tmp); ++ result = cast(_Unwind_Internal_Ptr) tmp; ++ } ++ break; ++ ++ case DW_EH_PE_udata2: ++ result = cast(_Unwind_Internal_Ptr) u.u2; ++ p += 2; ++ break; ++ case DW_EH_PE_udata4: ++ result = cast(_Unwind_Internal_Ptr) u.u4; ++ p += 4; ++ break; ++ case DW_EH_PE_udata8: ++ result = cast(_Unwind_Internal_Ptr) u.u8; ++ p += 8; ++ break; ++ ++ case DW_EH_PE_sdata2: ++ result = cast(_Unwind_Internal_Ptr) u.s2; ++ p += 2; ++ break; ++ case DW_EH_PE_sdata4: ++ result = cast(_Unwind_Internal_Ptr) u.s4; ++ p += 4; ++ break; ++ case DW_EH_PE_sdata8: ++ result = cast(_Unwind_Internal_Ptr) u.s8; ++ p += 8; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ if (result != 0) ++ { ++ result += ((encoding & 0x70) == DW_EH_PE_pcrel ++ ? cast(_Unwind_Internal_Ptr) u : base); ++ if (encoding & DW_EH_PE_indirect) ++ result = *cast(_Unwind_Internal_Ptr *) result; ++ } ++ } ++ ++ *val = result; ++ return p; ++} ++ ++version (NO_BASE_OF_ENCODED_VALUE) {} ++else ++{ ++ /* Like read_encoded_value_with_base, but get the base from the context ++ rather than providing it directly. */ ++ ++ ubyte * ++ read_encoded_value (_Unwind_Context *context, ubyte encoding, ++ ubyte *p, _Unwind_Ptr *val) ++ { ++ return read_encoded_value_with_base (encoding, ++ base_of_encoded_value (encoding, context), ++ p, val); ++ } ++} ++ +--- a/src/libphobos/libdruntime/gcc/unwind_arm.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind_arm.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,295 +0,0 @@ +-/* GDC -- D front-end for GCC +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +- GCC is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 3, or (at your option) any later +- version. +- +- GCC is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License +- along with GCC; see the file COPYING3. If not see +- . +-*/ +- +-/* ARM unwind interface declarations for D. This must match unwind-arm.h. */ +- +-module gcc.unwind_arm; +- +-import gcc.builtins; +-import gcc.unwind_pe; +- +-extern (C): +- +-alias __builtin_machine_uint _Unwind_Word; +-alias __builtin_machine_int _Unwind_Sword; +-alias __builtin_pointer_uint _Unwind_Ptr; +-alias __builtin_pointer_uint _Unwind_Internal_Ptr; +-alias _Unwind_Word _uw; +-alias ulong _uw64; +-alias ushort _uw16; +-alias ubyte _uw8; +- +-alias uint _Unwind_Reason_Code; +-enum : _Unwind_Reason_Code +-{ +- _URC_OK = 0, /* operation completed successfully */ +- _URC_FOREIGN_EXCEPTION_CAUGHT = 1, +- _URC_END_OF_STACK = 5, +- _URC_HANDLER_FOUND = 6, +- _URC_INSTALL_CONTEXT = 7, +- _URC_CONTINUE_UNWIND = 8, +- _URC_FAILURE = 9 /* unspecified failure of some kind */ +-} +- +-alias int _Unwind_State; +-enum : _Unwind_State +-{ +- _US_VIRTUAL_UNWIND_FRAME = 0, +- _US_UNWIND_FRAME_STARTING = 1, +- _US_UNWIND_FRAME_RESUME = 2, +- _US_ACTION_MASK = 3, +- _US_FORCE_UNWIND = 8, +- _US_END_OF_STACK = 16 +-} +- +-/* Provided only for for compatibility with existing code. */ +-alias int _Unwind_Action; +-enum : _Unwind_Action +-{ +- _UA_SEARCH_PHASE = 1, +- _UA_CLEANUP_PHASE = 2, +- _UA_HANDLER_FRAME = 4, +- _UA_FORCE_UNWIND = 8, +- _UA_END_OF_STACK = 16, +- _URC_NO_REASON = _URC_OK +-} +- +-struct _Unwind_Context; +-alias _uw _Unwind_EHT_Header; +- +- +-/* UCB: */ +- +-struct _Unwind_Control_Block +-{ +- char exception_class[8] = '\0'; +- extern(C) void function(_Unwind_Reason_Code, _Unwind_Control_Block *) exception_cleanup; +- /* Unwinder cache, private fields for the unwinder's use */ +- struct _unwinder_cache +- { +- _uw reserved1; /* Forced unwind stop fn, 0 if not forced */ +- _uw reserved2; /* Personality routine address */ +- _uw reserved3; /* Saved callsite address */ +- _uw reserved4; /* Forced unwind stop arg */ +- _uw reserved5; +- } +- _unwinder_cache unwinder_cache; +- /* Propagation barrier cache (valid after phase 1): */ +- struct _barrier_cache +- { +- _uw sp; +- _uw bitpattern[5]; +- } +- _barrier_cache barrier_cache; +- /* Cleanup cache (preserved over cleanup): */ +- struct _cleanup_cache +- { +- _uw bitpattern[4]; +- } +- _cleanup_cache cleanup_cache; +- /* Pr cache (for pr's benefit): */ +- struct _pr_cache +- { +- _uw fnstart; /* function start address */ +- _Unwind_EHT_Header *ehtp; /* pointer to EHT entry header word */ +- _uw additional; /* additional data */ +- _uw reserved1; +- } +- _pr_cache pr_cache; +- long[0] _force_alignment; /* Force alignment to 8-byte boundary */ +-} +- +-/* Virtual Register Set*/ +-alias int _Unwind_VRS_RegClass; +-enum : _Unwind_VRS_RegClass +-{ +- _UVRSC_CORE = 0, /* integer register */ +- _UVRSC_VFP = 1, /* vfp */ +- _UVRSC_FPA = 2, /* fpa */ +- _UVRSC_WMMXD = 3, /* Intel WMMX data register */ +- _UVRSC_WMMXC = 4 /* Intel WMMX control register */ +-} +- +-alias int _Unwind_VRS_DataRepresentation; +-enum : _Unwind_VRS_DataRepresentation +-{ +- _UVRSD_UINT32 = 0, +- _UVRSD_VFPX = 1, +- _UVRSD_FPAX = 2, +- _UVRSD_UINT64 = 3, +- _UVRSD_FLOAT = 4, +- _UVRSD_DOUBLE = 5 +-} +- +-alias int _Unwind_VRS_Result; +-enum : _Unwind_VRS_Result +-{ +- _UVRSR_OK = 0, +- _UVRSR_NOT_IMPLEMENTED = 1, +- _UVRSR_FAILED = 2 +-} +- +-/* Frame unwinding state. */ +-struct __gnu_unwind_state +-{ +- /* The current word (bytes packed msb first). */ +- _uw data; +- /* Pointer to the next word of data. */ +- _uw *next; +- /* The number of bytes left in this word. */ +- _uw8 bytes_left; +- /* The number of words pointed to by ptr. */ +- _uw8 words_left; +-} +- +-alias extern(C) _Unwind_Reason_Code function(_Unwind_State, +- _Unwind_Control_Block *, _Unwind_Context *) personality_routine; +- +-_Unwind_VRS_Result _Unwind_VRS_Set(_Unwind_Context *, _Unwind_VRS_RegClass, +- _uw, _Unwind_VRS_DataRepresentation, +- void *); +- +-_Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context *, _Unwind_VRS_RegClass, +- _uw, _Unwind_VRS_DataRepresentation, +- void *); +- +-_Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *, _Unwind_VRS_RegClass, +- _uw, _Unwind_VRS_DataRepresentation); +- +- +-/* Support functions for the PR. */ +-alias _Unwind_Control_Block _Unwind_Exception ; +-alias char[8] _Unwind_Exception_Class; // = '\0' +- +-void * _Unwind_GetLanguageSpecificData (_Unwind_Context *); +-_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); +- +-_Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *); +-/* This should never be used. */ +-_Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *); +- +-/* Interface functions: */ +-_Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Control_Block *ucbp); +-/*pragma (noreturn)*/ void _Unwind_Resume(_Unwind_Control_Block *ucbp); +-_Unwind_Reason_Code _Unwind_Resume_or_Rethrow (_Unwind_Control_Block *ucbp); +- +-alias extern(C) _Unwind_Reason_Code function(int, _Unwind_Action, _Unwind_Exception_Class, +- _Unwind_Control_Block *, _Unwind_Context *, void *) _Unwind_Stop_Fn; +- +-_Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *, +- _Unwind_Stop_Fn, void *); +-/* @@@ Use unwind data to perform a stack backtrace. The trace callback +- is called for every stack frame in the call chain, but no cleanup +- actions are performed. */ +-alias extern(C) _Unwind_Reason_Code function(_Unwind_Context *, void *) _Unwind_Trace_Fn; +-_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void *); +- +-_Unwind_Word _Unwind_GetCFA (_Unwind_Context *); +-void _Unwind_Complete(_Unwind_Control_Block *ucbp); +-void _Unwind_DeleteException (_Unwind_Exception *); +- +-_Unwind_Reason_Code __gnu_unwind_frame (_Unwind_Control_Block *, +- _Unwind_Context *); +-_Unwind_Reason_Code __gnu_unwind_execute (_Unwind_Context *, +- __gnu_unwind_state *); +- +-_Unwind_Word _Unwind_GetIPInfo (_Unwind_Context *context, int *ip_before_insn) +-{ +- *ip_before_insn = 0; +- return _Unwind_GetIP (context); +-} +- +-_Unwind_Word _Unwind_GetGR (_Unwind_Context *context, int regno) +-{ +- _uw val; +- _Unwind_VRS_Get (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val); +- return val; +-} +- +-void _Unwind_SetGR (_Unwind_Context *context, int regno, _Unwind_Word val) +-{ +- _Unwind_VRS_Set (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val); +-} +- +-/* leb128 type numbers have a potentially unlimited size. +- The target of the following definitions of _sleb128_t and _uleb128_t +- is to have efficient data types large enough to hold the leb128 type +- numbers used in the unwind code. */ +-alias __builtin_clong _sleb128_t; +-alias __builtin_culong _uleb128_t; +- +-enum int UNWIND_STACK_REG = 13; +-/* Use IP as a scratch register within the personality routine. */ +-enum int UNWIND_POINTER_REG = 12; +- +-version (linux) +- const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel | DW_EH_PE_indirect); +-else version (NetBSD) +- const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel | DW_EH_PE_indirect); +-else version (symbian) // TODO: name +- const ubyte _TTYPE_ENCODING = (DW_EH_PE_absptr); +-else version (uclinux) // TODO: name +- const ubyte _TTYPE_ENCODING = (DW_EH_PE_absptr); +-else +- const ubyte _TTYPE_ENCODING = (DW_EH_PE_pcrel); +- +-/* Decode an R_ARM_TARGET2 relocation. */ +-_Unwind_Word _Unwind_decode_typeinfo_ptr (_Unwind_Word base, _Unwind_Word ptr) +-{ +- _Unwind_Word tmp; +- tmp = *cast(_Unwind_Word *) ptr; +- /* Zero values are always NULL. */ +- if (!tmp) +- return 0; +- +- if (_TTYPE_ENCODING == (DW_EH_PE_pcrel | DW_EH_PE_indirect)) +- { +- /* Pc-relative indirect. */ +- tmp += ptr; +- tmp = *cast(_Unwind_Word *) tmp; +- } +- else if (_TTYPE_ENCODING == DW_EH_PE_absptr) +- { +- /* Absolute pointer. Nothing more to do. */ +- } +- else +- { +- /* Pc-relative pointer. */ +- tmp += ptr; +- } +- return tmp; +-} +- +-_Unwind_Reason_Code __gnu_unwind_24bit (_Unwind_Context * context, _uw data, int compact) +-{ +- return _URC_FAILURE; +-} +- +-/* Return the address of the instruction, not the actual IP value. */ +-_Unwind_Word _Unwind_GetIP(_Unwind_Context *context) +-{ +- return _Unwind_GetGR (context, 15) & ~ cast(_Unwind_Word) 1; +-} +- +-/* The dwarf unwinder doesn't understand arm/thumb state. We assume the +- landing pad uses the same instruction set as the call site. */ +-void _Unwind_SetIP(_Unwind_Context *context, _Unwind_Word val) +-{ +- return _Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1)); +-} +- +--- a/src/libphobos/libdruntime/gcc/unwind.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,24 +0,0 @@ +-/* GDC -- D front-end for GCC +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +- GCC is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 3, or (at your option) any later +- version. +- +- GCC is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License +- along with GCC; see the file COPYING3. If not see +- . +-*/ +- +-module gcc.unwind; +- +-version (GNU_ARM_EABI_Unwinder) +- public import gcc.unwind_arm; +-else +- public import gcc.unwind_generic; +--- a/src/libphobos/libdruntime/gcc/unwind_generic.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind_generic.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,244 +0,0 @@ +-/* GDC -- D front-end for GCC +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +- GCC is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 3, or (at your option) any later +- version. +- +- GCC is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License +- along with GCC; see the file COPYING3. If not see +- . +-*/ +- +-/* GNU/GCC unwind interface declarations for D. This must match +- unwind-generic.h */ +- +-module gcc.unwind_generic; +- +-private import gcc.builtins; +-private import core.stdc.stdlib; // for abort +- +-/* This is derived from the C++ ABI for IA-64. Where we diverge +- for cross-architecture compatibility are noted with "@@@". */ +- +-extern (C): +- +-/* Level 1: Base ABI */ +- +-/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is +- inefficient for 32-bit and smaller machines. */ +-alias __builtin_unwind_uint _Unwind_Word; +-alias __builtin_unwind_int _Unwind_Sword; +-version (IA64) +-{ +- version (HPUX) +- alias __builtin_machine_uint _Unwind_Ptr; +- else +- alias __builtin_pointer_uint _Unwind_Ptr; +-} +-else +-{ +- alias __builtin_pointer_uint _Unwind_Ptr; +-} +-alias __builtin_pointer_uint _Unwind_Internal_Ptr; +- +-/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and +- consumer of an exception. We'll go along with this for now even on +- 32-bit machines. We'll need to provide some other option for +- 16-bit machines and for machines with > 8 bits per byte. */ +-alias ulong _Unwind_Exception_Class; +- +-/* The unwind interface uses reason codes in several contexts to +- identify the reasons for failures or other actions. */ +-alias uint _Unwind_Reason_Code; +-enum : _Unwind_Reason_Code +-{ +- _URC_NO_REASON = 0, +- _URC_FOREIGN_EXCEPTION_CAUGHT = 1, +- _URC_FATAL_PHASE2_ERROR = 2, +- _URC_FATAL_PHASE1_ERROR = 3, +- _URC_NORMAL_STOP = 4, +- _URC_END_OF_STACK = 5, +- _URC_HANDLER_FOUND = 6, +- _URC_INSTALL_CONTEXT = 7, +- _URC_CONTINUE_UNWIND = 8 +-} +- +- +-/* The unwind interface uses a pointer to an exception header object +- as its representation of an exception being thrown. In general, the +- full representation of an exception object is language- and +- implementation-specific, but it will be prefixed by a header +- understood by the unwind interface. */ +- +-alias extern(C) void function(_Unwind_Reason_Code, _Unwind_Exception *) _Unwind_Exception_Cleanup_Fn; +- +-/* @@@ The IA-64 ABI says that this structure must be double-word aligned. +- Taking that literally does not make much sense generically. Instead we +- provide the maximum alignment required by any type for the machine. */ +-align struct _Unwind_Exception +-{ +- _Unwind_Exception_Class exception_class; +- _Unwind_Exception_Cleanup_Fn exception_cleanup; +- _Unwind_Word private_1; +- _Unwind_Word private_2; +-} +- +- +-/* The ACTIONS argument to the personality routine is a bitwise OR of one +- or more of the following constants. */ +-alias int _Unwind_Action; +- +-enum +-{ +- _UA_SEARCH_PHASE = 1, +- _UA_CLEANUP_PHASE = 2, +- _UA_HANDLER_FRAME = 4, +- _UA_FORCE_UNWIND = 8, +- _UA_END_OF_STACK = 16 +-} +- +-/* This is an opaque type used to refer to a system-specific data +- structure used by the system unwinder. This context is created and +- destroyed by the system, and passed to the personality routine +- during unwinding. */ +-struct _Unwind_Context; +- +-/* Raise an exception, passing along the given exception object. */ +-_Unwind_Reason_Code _Unwind_RaiseException (_Unwind_Exception *); +- +-/* Raise an exception for forced unwinding. */ +- +-alias extern(C) _Unwind_Reason_Code function (int, _Unwind_Action, _Unwind_Exception_Class, +- _Unwind_Exception *, _Unwind_Context *, void *) _Unwind_Stop_Fn; +- +-_Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Exception *, _Unwind_Stop_Fn, void *); +- +-/* Helper to invoke the exception_cleanup routine. */ +-void _Unwind_DeleteException (_Unwind_Exception *); +- +-/* Resume propagation of an existing exception. This is used after +- e.g. executing cleanup code, and not to implement rethrowing. */ +-void _Unwind_Resume (_Unwind_Exception *); +- +-/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow +- a normal exception that was handled. */ +-_Unwind_Reason_Code _Unwind_Resume_or_Rethrow (_Unwind_Exception *); +- +-/* @@@ Use unwind data to perform a stack backtrace. The trace callback +- is called for every stack frame in the call chain, but no cleanup +- actions are performed. */ +-alias extern(C) _Unwind_Reason_Code function (_Unwind_Context *, void *) _Unwind_Trace_Fn; +- +-_Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); +- +-/* These functions are used for communicating information about the unwind +- context (i.e. the unwind descriptors and the user register state) between +- the unwind library and the personality routine and landing pad. Only +- selected registers may be manipulated. */ +- +-_Unwind_Word _Unwind_GetGR (_Unwind_Context *, int); +-void _Unwind_SetGR (_Unwind_Context *, int, _Unwind_Word); +- +-_Unwind_Ptr _Unwind_GetIP (_Unwind_Context *); +-_Unwind_Ptr _Unwind_GetIPInfo (_Unwind_Context *, int *); +-void _Unwind_SetIP (_Unwind_Context *, _Unwind_Ptr); +- +-/* @@@ Retrieve the CFA of the given context. */ +-_Unwind_Word _Unwind_GetCFA (_Unwind_Context *); +- +-void *_Unwind_GetLanguageSpecificData (_Unwind_Context *); +- +-_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); +- +- +-/* The personality routine is the function in the C++ (or other language) +- runtime library which serves as an interface between the system unwind +- library and language-specific exception handling semantics. It is +- specific to the code fragment described by an unwind info block, and +- it is always referenced via the pointer in the unwind info block, and +- hence it has no ABI-specified name. +- +- Note that this implies that two different C++ implementations can +- use different names, and have different contents in the language +- specific data area. Moreover, that the language specific data +- area contains no version info because name of the function invoked +- provides more effective versioning by detecting at link time the +- lack of code to handle the different data format. */ +- +-alias extern(C) _Unwind_Reason_Code function (int, _Unwind_Action, _Unwind_Exception_Class, +- _Unwind_Exception *, _Unwind_Context *) _Unwind_Personality_Fn; +- +-/* @@@ The following alternate entry points are for setjmp/longjmp +- based unwinding. */ +- +-struct SjLj_Function_Context; +-extern void _Unwind_SjLj_Register (SjLj_Function_Context *); +-extern void _Unwind_SjLj_Unregister (SjLj_Function_Context *); +- +-_Unwind_Reason_Code _Unwind_SjLj_RaiseException (_Unwind_Exception *); +-_Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind (_Unwind_Exception *, _Unwind_Stop_Fn, void *); +-void _Unwind_SjLj_Resume (_Unwind_Exception *); +-_Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (_Unwind_Exception *); +- +-/* @@@ The following provide access to the base addresses for text +- and data-relative addressing in the LDSA. In order to stay link +- compatible with the standard ABI for IA-64, we inline these. */ +- +-version (IA64) +-{ +- _Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *_C) +- { +- /* The GP is stored in R1. */ +- return _Unwind_GetGR (_C, 1); +- } +- +- _Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *) +- { +- abort (); +- return 0; +- } +- +- /* @@@ Retrieve the Backing Store Pointer of the given context. */ +- _Unwind_Word _Unwind_GetBSP (_Unwind_Context *); +-} +-else +-{ +- _Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *); +- _Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *); +-} +- +-/* @@@ Given an address, return the entry point of the function that +- contains it. */ +-extern void * _Unwind_FindEnclosingFunction (void *pc); +- +- +-/* leb128 type numbers have a potentially unlimited size. +- The target of the following definitions of _sleb128_t and _uleb128_t +- is to have efficient data types large enough to hold the leb128 type +- numbers used in the unwind code. +- Mostly these types will simply be defined to long and unsigned long +- except when a unsigned long data type on the target machine is not +- capable of storing a pointer. */ +- +-static if (__builtin_clong.sizeof >= (void*).sizeof) +-{ +- alias __builtin_clong _sleb128_t; +- alias __builtin_culong _uleb128_t; +-} +-else static if (long.sizeof >= (void*).sizeof) +-{ +- alias long _sleb128_t; +- alias ulong _uleb128_t; +-} +-else +-{ +- static assert (0, "What type shall we use for _sleb128_t?"); +-} +- +--- a/src/libphobos/libdruntime/gcc/unwind_pe.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/gcc/unwind_pe.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,271 +0,0 @@ +-/* GDC -- D front-end for GCC +- Copyright (C) 2011, 2012 Free Software Foundation, Inc. +- +- GCC is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 3, or (at your option) any later +- version. +- +- GCC is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License +- along with GCC; see the file COPYING3. If not see +- . +-*/ +- +-/* GNU/GCC unwind interface declarations for D. This must match unwind-pe.h */ +- +-module gcc.unwind_pe; +- +-import gcc.unwind; +-private import core.stdc.stdlib : abort; +- +-/* Pointer encodings, from dwarf2.h. */ +-enum +-{ +- DW_EH_PE_absptr = 0x00, +- DW_EH_PE_omit = 0xff, +- +- DW_EH_PE_uleb128 = 0x01, +- DW_EH_PE_udata2 = 0x02, +- DW_EH_PE_udata4 = 0x03, +- DW_EH_PE_udata8 = 0x04, +- DW_EH_PE_sleb128 = 0x09, +- DW_EH_PE_sdata2 = 0x0A, +- DW_EH_PE_sdata4 = 0x0B, +- DW_EH_PE_sdata8 = 0x0C, +- DW_EH_PE_signed = 0x08, +- +- DW_EH_PE_pcrel = 0x10, +- DW_EH_PE_textrel = 0x20, +- DW_EH_PE_datarel = 0x30, +- DW_EH_PE_funcrel = 0x40, +- DW_EH_PE_aligned = 0x50, +- +- DW_EH_PE_indirect = 0x80 +-} +- +-version (NO_SIZE_OF_ENCODED_VALUE) {} +-else +-{ +- /* Given an encoding, return the number of bytes the format occupies. +- This is only defined for fixed-size encodings, and so does not +- include leb128. */ +- uint size_of_encoded_value (ubyte encoding) +- { +- if (encoding == DW_EH_PE_omit) +- return 0; +- +- final switch (encoding & 0x07) +- { +- case DW_EH_PE_absptr: +- return (void *).sizeof; +- case DW_EH_PE_udata2: +- return 2; +- case DW_EH_PE_udata4: +- return 4; +- case DW_EH_PE_udata8: +- return 8; +- } +- assert(0); +- } +-} +- +-version (NO_BASE_OF_ENCODED_VALUE) {} +-else +-{ +- /* Given an encoding and an _Unwind_Context, return the base to which +- the encoding is relative. This base may then be passed to +- read_encoded_value_with_base for use when the _Unwind_Context is +- not available. */ +- +- _Unwind_Ptr base_of_encoded_value (ubyte encoding, _Unwind_Context *context) +- { +- if (encoding == DW_EH_PE_omit) +- return cast(_Unwind_Ptr) 0; +- +- final switch (encoding & 0x70) +- { +- case DW_EH_PE_absptr: +- case DW_EH_PE_pcrel: +- case DW_EH_PE_aligned: +- return cast(_Unwind_Ptr) 0; +- +- case DW_EH_PE_textrel: +- return _Unwind_GetTextRelBase (context); +- case DW_EH_PE_datarel: +- return _Unwind_GetDataRelBase (context); +- case DW_EH_PE_funcrel: +- return _Unwind_GetRegionStart (context); +- } +- assert (0); +- } +-} +- +-/* Read an unsigned leb128 value from P, store the value in VAL, return +- P incremented past the value. We assume that a word is large enough to +- hold any value so encoded; if it is smaller than a pointer on some target, +- pointers should not be leb128 encoded on that target. */ +- +-ubyte * +-read_uleb128 (ubyte *p, _uleb128_t *val) +-{ +- uint shift = 0; +- ubyte a_byte; +- _uleb128_t result; +- +- result = cast(_uleb128_t) 0; +- do +- { +- a_byte = *p++; +- result |= (cast(_uleb128_t)a_byte & 0x7f) << shift; +- shift += 7; +- } +- while (a_byte & 0x80); +- +- *val = result; +- return p; +-} +- +-/* Similar, but read a signed leb128 value. */ +- +-ubyte * +-read_sleb128 (ubyte *p, _sleb128_t *val) +-{ +- uint shift = 0; +- ubyte a_byte; +- _uleb128_t result; +- +- result = cast(_uleb128_t) 0; +- do +- { +- a_byte = *p++; +- result |= (cast(_uleb128_t)a_byte & 0x7f) << shift; +- shift += 7; +- } +- while (a_byte & 0x80); +- +- /* Sign-extend a negative value. */ +- if (shift < 8 * result.sizeof && (a_byte & 0x40) != 0) +- result |= -((cast(_uleb128_t)1L) << shift); +- +- *val = cast(_sleb128_t) result; +- return p; +-} +- +-/* Load an encoded value from memory at P. The value is returned in VAL; +- The function returns P incremented past the value. BASE is as given +- by base_of_encoded_value for this encoding in the appropriate context. */ +- +-ubyte * +-read_encoded_value_with_base (ubyte encoding, _Unwind_Ptr base, +- ubyte *p, _Unwind_Ptr *val) +-{ +- union unaligned +- { +- align(1): +- void *ptr; +- ushort u2; +- uint u4; +- ulong u8; +- short s2; +- int s4; +- long s8; +- } +- +- unaligned *u = cast(unaligned *) p; +- _Unwind_Internal_Ptr result; +- +- if (encoding == DW_EH_PE_aligned) +- { +- _Unwind_Internal_Ptr a = cast(_Unwind_Internal_Ptr) p; +- a = cast(_Unwind_Internal_Ptr)( (a + (void *).sizeof - 1) & - (void *).sizeof ); +- result = *cast(_Unwind_Internal_Ptr *) a; +- p = cast(ubyte *) cast(_Unwind_Internal_Ptr) (a + (void *).sizeof); +- } +- else +- { +- switch (encoding & 0x0f) +- { +- case DW_EH_PE_absptr: +- result = cast(_Unwind_Internal_Ptr) u.ptr; +- p += (void *).sizeof; +- break; +- +- case DW_EH_PE_uleb128: +- { +- _uleb128_t tmp; +- p = read_uleb128 (p, &tmp); +- result = cast(_Unwind_Internal_Ptr) tmp; +- } +- break; +- +- case DW_EH_PE_sleb128: +- { +- _sleb128_t tmp; +- p = read_sleb128 (p, &tmp); +- result = cast(_Unwind_Internal_Ptr) tmp; +- } +- break; +- +- case DW_EH_PE_udata2: +- result = cast(_Unwind_Internal_Ptr) u.u2; +- p += 2; +- break; +- case DW_EH_PE_udata4: +- result = cast(_Unwind_Internal_Ptr) u.u4; +- p += 4; +- break; +- case DW_EH_PE_udata8: +- result = cast(_Unwind_Internal_Ptr) u.u8; +- p += 8; +- break; +- +- case DW_EH_PE_sdata2: +- result = cast(_Unwind_Internal_Ptr) u.s2; +- p += 2; +- break; +- case DW_EH_PE_sdata4: +- result = cast(_Unwind_Internal_Ptr) u.s4; +- p += 4; +- break; +- case DW_EH_PE_sdata8: +- result = cast(_Unwind_Internal_Ptr) u.s8; +- p += 8; +- break; +- +- default: +- abort (); +- } +- +- if (result != 0) +- { +- result += ((encoding & 0x70) == DW_EH_PE_pcrel +- ? cast(_Unwind_Internal_Ptr) u : base); +- if (encoding & DW_EH_PE_indirect) +- result = *cast(_Unwind_Internal_Ptr *) result; +- } +- } +- +- *val = result; +- return p; +-} +- +-version (NO_BASE_OF_ENCODED_VALUE) {} +-else +-{ +- /* Like read_encoded_value_with_base, but get the base from the context +- rather than providing it directly. */ +- +- ubyte *read_encoded_value (_Unwind_Context *context, ubyte encoding, +- ubyte *p, _Unwind_Ptr *val) +- { +- return read_encoded_value_with_base (encoding, +- base_of_encoded_value (encoding, context), +- p, val); +- } +-} +- +--- a/src/libphobos/libdruntime/Makefile.am 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/Makefile.am 2014-04-01 16:32:51.000000000 +0100 +@@ -22,6 +22,7 @@ ACLOCAL_AMFLAGS = -I . -I .. + OUR_CFLAGS=@DEFS@ -I ../ -I $(srcdir)/gcc -I $(srcdir)/../zlib + D_EXTRA_DFLAGS=-nostdinc -pipe -Wno-deprecated -I $(srcdir) -I ./$(host_alias) -I . + ALL_DFLAGS = $(DFLAGS) $(D_EXTRA_DFLAGS) $(MULTIFLAGS) ++IMPDIR = import + + toolexecdir = $(phobos_toolexecdir) + toolexeclibdir = $(phobos_toolexeclibdir) +@@ -33,12 +34,23 @@ SUFFIXES = .d + %.o : %.d + $(GDC) -o $@ $(ALL_DFLAGS) -c $< + +-IMPORT = import +-$(IMPORT): +- mkdir -p $(IMPORT) +-# For core objects, generate .di headers +-$(IMPORT)/%.di: %.d $(IMPORT) +- $(GDC) $(ALL_DFLAGS) -fintfc-file=$@ -fsyntax-only $< ++# Used to generate .di headers, now just copy from source.d to import/source.di ++$(IMPDIR): ++ mkdir -p $(IMPDIR) ++ mkdir -p $(IMPDIR)/core/stdc ++ mkdir -p $(IMPDIR)/core/sync ++ mkdir -p $(IMPDIR)/core/sys/freebsd/sys ++ mkdir -p $(IMPDIR)/core/sys/linux/sys ++ mkdir -p $(IMPDIR)/core/sys/osx/mach ++ mkdir -p $(IMPDIR)/core/sys/posix/arpa ++ mkdir -p $(IMPDIR)/core/sys/posix/net ++ mkdir -p $(IMPDIR)/core/sys/posix/netinet ++ mkdir -p $(IMPDIR)/core/sys/posix/sys ++ mkdir -p $(IMPDIR)/core/sys/windows ++ mkdir -p $(IMPDIR)/gcc ++ ++$(IMPDIR)/%.di: %.d $(IMPDIR) ++ cp $< $@ + + # %.o : %.c + # Use .c.o to override Automake +@@ -66,18 +78,19 @@ BASE_OBJS=object_.o + RUNTIME_OBJS=rt/aaA.o rt/aApply.o rt/aApplyR.o rt/adi.o rt/arrayassign.o \ + rt/arraybyte.o rt/arraycast.o rt/arraycat.o rt/arraydouble.o \ + rt/arrayfloat.o rt/arrayint.o rt/arrayreal.o rt/arrayshort.o \ +- rt/cast_.o rt/critical_.o rt/dmain2.o rt/minfo.o \ +- rt/memory.o rt/invariant.o rt/invariant_.o rt/lifetime.o \ ++ rt/cast_.o rt/critical_.o rt/deh.o rt/dmain2.o rt/minfo.o \ ++ rt/memory.o rt/invariant.o rt/lifetime.o \ + rt/monitor_.o rt/obj.o rt/qsort.o rt/switch_.o rt/tlsgc.o + + CORE_OBJS=core/atomic.o core/bitop.o core/cpuid.o core/demangle.o \ + core/exception.o core/math.o core/memory.o core/runtime.o \ +- core/simd.o core/thread.o core/time.o core/vararg.o \ ++ core/simd.o core/thread.o core/threadasm.o core/time.o core/vararg.o \ + core/sync/barrier.o core/sync/condition.o core/sync/config.o \ + core/sync/exception.o core/sync/mutex.o core/sync/rwmutex.o \ + core/sync/semaphore.o + +-GCC_OBJS=gcc/atomics.o gcc/builtins.o gcc/deh.o gcc/unwind_pe.o ++GCC_OBJS=gcc/atomics.o gcc/backtrace.o gcc/builtins.o gcc/deh.o gcc/emutls.o \ ++ gcc/libbacktrace.o gcc/unwind/pe.o + + UTIL_OBJS=rt/util/console.o rt/util/container.o rt/util/hash.o \ + rt/util/string.o rt/util/utf.o +@@ -118,9 +131,6 @@ RT_WINDOWS_OBJS=core/sys/windows/dbghelp + core/sys/windows/stacktrace.o core/sys/windows/threadaux.o \ + core/sys/windows/windows.o + +-# This should not be linked into a shared library. +-CMAIN_OBJS= #rt/cmain.o +- + D_GC_MODULES=@D_GC_MODULES@ + + # Regardless of OS, all import headers are generated. +@@ -141,10 +151,15 @@ CORE_IMPORTS=core/atomic.di core/bitop.d + core/sync/semaphore.di \ + \ + core/sys/freebsd/dlfcn.di core/sys/freebsd/execinfo.di \ +- core/sys/freebsd/sys/event.di \ ++ core/sys/freebsd/sys/elf32.di core/sys/freebsd/sys/elf64.di \ ++ core/sys/freebsd/sys/elf_common.di core/sys/freebsd/sys/elf.di \ ++ core/sys/freebsd/sys/event.di core/sys/freebsd/sys/link_elf.di \ + \ ++ core/sys/linux/config.di core/sys/linux/dlfcn.di \ + core/sys/linux/elf.di core/sys/linux/epoll.di \ +- core/sys/linux/execinfo.di core/sys/linux/sys/signalfd.di \ ++ core/sys/linux/errno.di core/sys/linux/execinfo.di \ ++ core/sys/linux/link.di core/sys/linux/sys/inotify.di \ ++ core/sys/linux/sys/mman.di core/sys/linux/sys/signalfd.di \ + core/sys/linux/sys/xattr.di \ + \ + core/sys/osx/execinfo.di core/sys/osx/mach/dyld.di \ +@@ -161,31 +176,47 @@ CORE_IMPORTS=core/atomic.di core/bitop.d + core/sys/posix/pwd.di core/sys/posix/sched.di \ + core/sys/posix/semaphore.di core/sys/posix/setjmp.di \ + core/sys/posix/signal.di core/sys/posix/stdio.di \ +- core/sys/posix/stdlib.di core/sys/posix/termios.di \ +- core/sys/posix/time.di core/sys/posix/ucontext.di \ +- core/sys/posix/unistd.di core/sys/posix/utime.di \ +- core/sys/posix/net/if_.di core/sys/posix/netinet/in_.di \ +- core/sys/posix/netinet/tcp.di \ ++ core/sys/posix/stdlib.di core/sys/posix/syslog.di \ ++ core/sys/posix/termios.di core/sys/posix/time.di \ ++ core/sys/posix/ucontext.di core/sys/posix/unistd.di \ ++ core/sys/posix/utime.di core/sys/posix/net/if_.di \ ++ core/sys/posix/netinet/in_.di core/sys/posix/netinet/tcp.di \ + core/sys/posix/sys/ioctl.di core/sys/posix/sys/ipc.di \ +- core/sys/posix/sys/mman.di core/sys/posix/sys/select.di \ +- core/sys/posix/sys/shm.di core/sys/posix/sys/socket.di \ +- core/sys/posix/sys/stat.di core/sys/posix/sys/statvfs.di \ +- core/sys/posix/sys/time.di core/sys/posix/sys/types.di \ +- core/sys/posix/sys/uio.di core/sys/posix/sys/un.di \ +- core/sys/posix/sys/utsname.di core/sys/posix/sys/wait.di \ ++ core/sys/posix/sys/mman.di core/sys/posix/sys/resource.di \ ++ core/sys/posix/sys/select.di core/sys/posix/sys/shm.di \ ++ core/sys/posix/sys/socket.di core/sys/posix/sys/stat.di \ ++ core/sys/posix/sys/statvfs.di core/sys/posix/sys/time.di \ ++ core/sys/posix/sys/types.di core/sys/posix/sys/uio.di \ ++ core/sys/posix/sys/un.di core/sys/posix/sys/utsname.di \ ++ core/sys/posix/sys/wait.di \ + \ + core/sys/windows/dbghelp.di core/sys/windows/dll.di \ + core/sys/windows/stacktrace.di core/sys/windows/threadaux.di \ + core/sys/windows/windows.di + ++GCC_IMPORTS=gcc/atomics.di gcc/attribute.di gcc/backtrace.di \ ++ gcc/builtins.di gcc/libbacktrace.di ++ + ALL_DRUNTIME_OBJS = $(DRUNTIME_OBJS) $(CORE_OBJS) $(D_GC_MODULES) $(GCC_OBJS) + +-libgdruntime.a : $(ALL_DRUNTIME_OBJS) $(CMAIN_OBJS) $(subst core/,$(IMPORT)/core/,$(CORE_IMPORTS)) +- $(AR) -r $@ $(ALL_DRUNTIME_OBJS) $(CMAIN_OBJS) ++libgdruntime.a : $(ALL_DRUNTIME_OBJS) \ ++ $(subst core/,$(IMPDIR)/core/,$(CORE_IMPORTS)) \ ++ $(subst gcc/,$(IMPDIR)/gcc/,$(GCC_IMPORTS)) ++if BACKTRACE_SUPPORTED ++ cp -f $(LIBBACKTRACE_LIB) $@ ++ $(AR) -q $@ $(ALL_DRUNTIME_OBJS) ++else ++ $(AR) -r $@ $(ALL_DRUNTIME_OBJS) ++endif + $(RANLIB) $@ + +-libgdruntime_t.a : $(ALL_DRUNTIME_OBJS:.o=.t.o) $(CMAIN_OBJS:.o=.t.o) +- $(AR) -r $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) $(CMAIN_OBJS:.o=.t.o) ++libgdruntime_t.a : $(ALL_DRUNTIME_OBJS:.o=.t.o) ++if BACKTRACE_SUPPORTED ++ cp -f $(LIBBACKTRACE_LIB) $@ ++ $(AR) -q $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) ++else ++ $(AR) -r $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) ++endif + $(RANLIB) $@ + + unittest: libgdruntime.a libgdruntime_t.a unittest.o +@@ -200,37 +231,44 @@ install-exec-local: libgdruntime.a + $(RANLIB) $(DESTDIR)$(toolexeclibdir)/libgdruntime.a + + install-data-local: libgdruntime.a ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir) ++ for i in __entrypoint.di object.di; do \ ++ $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ done + for i in core; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.di; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ +- done; \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(srcdir)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in gcc; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.d; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ +- done; \ ++ for i in core core/stdc core/sync core/sys/freebsd \ ++ core/sys/freebsd/sys core/sys/linux core/sys/linux/sys \ ++ core/sys/osx core/sys/osx/mach core/sys/posix \ ++ core/sys/posix/arpa core/sys/posix/net \ ++ core/sys/posix/netinet core/sys/posix/sys \ ++ core/sys/windows; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(IMPDIR)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in core core/stdc core/sync core/sys/osx/mach core/sys/posix \ +- core/sys/posix/arpa core/sys/posix/net core/sys/posix/netinet \ +- core/sys/posix/sys core/sys/windows; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR)/$$i; \ +- for f in $(IMPORT)/$$i/*.di; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR)/$$i; \ +- done; \ ++ for i in gcc; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(IMPDIR)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in object.di; do \ +- $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ for i in phobos-ver-syms; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR); \ ++ $(INSTALL_HEADER) $$i $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR); \ + done +- $(INSTALL) phobos-ver-syms $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR) + + clean-local: +- rm -f $(CMAIN_OBJS) + rm -f $(ALL_DRUNTIME_OBJS) + rm -f $(ALL_DRUNTIME_OBJS:.o=.t.o) + rm -f $(CORE_IMPORTS) +- rm -rf $(IMPORT) ++ rm -f $(GCC_IMPORTS) ++ rm -rf $(IMPDIR) + rm -f libgdruntime.a + + check-local: unittest +--- a/src/libphobos/libdruntime/Makefile.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/Makefile.in 2014-04-01 16:32:51.000000000 +0100 +@@ -73,7 +73,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(sr + $(srcdir)/phobos-ver-syms.in + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ +- $(top_srcdir)/configure.in ++ $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +@@ -97,6 +97,9 @@ AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@ ++BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@ ++BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@ + BUILD_LIBIBERTY = @BUILD_LIBIBERTY@ + CC = @CC@ + CC_FOR_BUILD = @CC_FOR_BUILD@ +@@ -112,7 +115,7 @@ DCFG_CBRIDGE_STDIO = @DCFG_CBRIDGE_STDIO + DCFG_GETPWNAM_R = @DCFG_GETPWNAM_R@ + DCFG_MMAP = @DCFG_MMAP@ + DCFG_POSIX = @DCFG_POSIX@ +-DCFG_SEMAPHORE_IMPL = @DCFG_SEMAPHORE_IMPL@ ++DCFG_THREAD_MODEL = @DCFG_THREAD_MODEL@ + DCFG_UNIX = @DCFG_UNIX@ + DEFS = @DEFS@ + DFLAGS = @DFLAGS@ +@@ -128,12 +131,14 @@ EGREP = @EGREP@ + EXEEXT = @EXEEXT@ + GDC = @GDC@ + GREP = @GREP@ ++HAVE_DLADDR = @HAVE_DLADDR@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LIBBACKTRACE_LIB = @LIBBACKTRACE_LIB@ + LIBIBERTY_H_PATH = @LIBIBERTY_H_PATH@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ +@@ -217,26 +222,28 @@ ACLOCAL_AMFLAGS = -I . -I .. + OUR_CFLAGS = @DEFS@ -I ../ -I $(srcdir)/gcc -I $(srcdir)/../zlib + D_EXTRA_DFLAGS = -nostdinc -pipe -Wno-deprecated -I $(srcdir) -I ./$(host_alias) -I . + ALL_DFLAGS = $(DFLAGS) $(D_EXTRA_DFLAGS) $(MULTIFLAGS) ++IMPDIR = import + toolexecdir = $(phobos_toolexecdir) + toolexeclibdir = $(phobos_toolexeclibdir) + SUFFIXES = .d +-IMPORT = import + BASE_OBJS = object_.o + RUNTIME_OBJS = rt/aaA.o rt/aApply.o rt/aApplyR.o rt/adi.o rt/arrayassign.o \ + rt/arraybyte.o rt/arraycast.o rt/arraycat.o rt/arraydouble.o \ + rt/arrayfloat.o rt/arrayint.o rt/arrayreal.o rt/arrayshort.o \ +- rt/cast_.o rt/critical_.o rt/dmain2.o rt/minfo.o \ +- rt/memory.o rt/invariant.o rt/invariant_.o rt/lifetime.o \ ++ rt/cast_.o rt/critical_.o rt/deh.o rt/dmain2.o rt/minfo.o \ ++ rt/memory.o rt/invariant.o rt/lifetime.o \ + rt/monitor_.o rt/obj.o rt/qsort.o rt/switch_.o rt/tlsgc.o + + CORE_OBJS = core/atomic.o core/bitop.o core/cpuid.o core/demangle.o \ + core/exception.o core/math.o core/memory.o core/runtime.o \ +- core/simd.o core/thread.o core/time.o core/vararg.o \ ++ core/simd.o core/thread.o core/threadasm.o core/time.o core/vararg.o \ + core/sync/barrier.o core/sync/condition.o core/sync/config.o \ + core/sync/exception.o core/sync/mutex.o core/sync/rwmutex.o \ + core/sync/semaphore.o + +-GCC_OBJS = gcc/atomics.o gcc/builtins.o gcc/deh.o gcc/unwind_pe.o ++GCC_OBJS = gcc/atomics.o gcc/backtrace.o gcc/builtins.o gcc/deh.o gcc/emutls.o \ ++ gcc/libbacktrace.o gcc/unwind/pe.o ++ + UTIL_OBJS = rt/util/console.o rt/util/container.o rt/util/hash.o \ + rt/util/string.o rt/util/utf.o + +@@ -272,9 +279,6 @@ RT_WINDOWS_OBJS = core/sys/windows/dbghe + core/sys/windows/windows.o + + +-# This should not be linked into a shared library. +-CMAIN_OBJS = #rt/cmain.o +- + # Regardless of OS, all import headers are generated. + CORE_IMPORTS = core/atomic.di core/bitop.di core/cpuid.di core/demangle.di \ + core/exception.di core/math.di core/memory.di core/runtime.di \ +@@ -293,10 +297,15 @@ CORE_IMPORTS = core/atomic.di core/bitop + core/sync/semaphore.di \ + \ + core/sys/freebsd/dlfcn.di core/sys/freebsd/execinfo.di \ +- core/sys/freebsd/sys/event.di \ ++ core/sys/freebsd/sys/elf32.di core/sys/freebsd/sys/elf64.di \ ++ core/sys/freebsd/sys/elf_common.di core/sys/freebsd/sys/elf.di \ ++ core/sys/freebsd/sys/event.di core/sys/freebsd/sys/link_elf.di \ + \ ++ core/sys/linux/config.di core/sys/linux/dlfcn.di \ + core/sys/linux/elf.di core/sys/linux/epoll.di \ +- core/sys/linux/execinfo.di core/sys/linux/sys/signalfd.di \ ++ core/sys/linux/errno.di core/sys/linux/execinfo.di \ ++ core/sys/linux/link.di core/sys/linux/sys/inotify.di \ ++ core/sys/linux/sys/mman.di core/sys/linux/sys/signalfd.di \ + core/sys/linux/sys/xattr.di \ + \ + core/sys/osx/execinfo.di core/sys/osx/mach/dyld.di \ +@@ -313,23 +322,27 @@ CORE_IMPORTS = core/atomic.di core/bitop + core/sys/posix/pwd.di core/sys/posix/sched.di \ + core/sys/posix/semaphore.di core/sys/posix/setjmp.di \ + core/sys/posix/signal.di core/sys/posix/stdio.di \ +- core/sys/posix/stdlib.di core/sys/posix/termios.di \ +- core/sys/posix/time.di core/sys/posix/ucontext.di \ +- core/sys/posix/unistd.di core/sys/posix/utime.di \ +- core/sys/posix/net/if_.di core/sys/posix/netinet/in_.di \ +- core/sys/posix/netinet/tcp.di \ ++ core/sys/posix/stdlib.di core/sys/posix/syslog.di \ ++ core/sys/posix/termios.di core/sys/posix/time.di \ ++ core/sys/posix/ucontext.di core/sys/posix/unistd.di \ ++ core/sys/posix/utime.di core/sys/posix/net/if_.di \ ++ core/sys/posix/netinet/in_.di core/sys/posix/netinet/tcp.di \ + core/sys/posix/sys/ioctl.di core/sys/posix/sys/ipc.di \ +- core/sys/posix/sys/mman.di core/sys/posix/sys/select.di \ +- core/sys/posix/sys/shm.di core/sys/posix/sys/socket.di \ +- core/sys/posix/sys/stat.di core/sys/posix/sys/statvfs.di \ +- core/sys/posix/sys/time.di core/sys/posix/sys/types.di \ +- core/sys/posix/sys/uio.di core/sys/posix/sys/un.di \ +- core/sys/posix/sys/utsname.di core/sys/posix/sys/wait.di \ ++ core/sys/posix/sys/mman.di core/sys/posix/sys/resource.di \ ++ core/sys/posix/sys/select.di core/sys/posix/sys/shm.di \ ++ core/sys/posix/sys/socket.di core/sys/posix/sys/stat.di \ ++ core/sys/posix/sys/statvfs.di core/sys/posix/sys/time.di \ ++ core/sys/posix/sys/types.di core/sys/posix/sys/uio.di \ ++ core/sys/posix/sys/un.di core/sys/posix/sys/utsname.di \ ++ core/sys/posix/sys/wait.di \ + \ + core/sys/windows/dbghelp.di core/sys/windows/dll.di \ + core/sys/windows/stacktrace.di core/sys/windows/threadaux.di \ + core/sys/windows/windows.di + ++GCC_IMPORTS = gcc/atomics.di gcc/attribute.di gcc/backtrace.di \ ++ gcc/builtins.di gcc/libbacktrace.di ++ + ALL_DRUNTIME_OBJS = $(DRUNTIME_OBJS) $(CORE_OBJS) $(D_GC_MODULES) $(GCC_OBJS) + + # Work around what appears to be a GNU make bug handling MAKEFLAGS +@@ -569,11 +582,24 @@ all-local: libgdruntime.a + + %.o : %.d + $(GDC) -o $@ $(ALL_DFLAGS) -c $< +-$(IMPORT): +- mkdir -p $(IMPORT) +-# For core objects, generate .di headers +-$(IMPORT)/%.di: %.d $(IMPORT) +- $(GDC) $(ALL_DFLAGS) -fintfc-file=$@ -fsyntax-only $< ++ ++# Used to generate .di headers, now just copy from source.d to import/source.di ++$(IMPDIR): ++ mkdir -p $(IMPDIR) ++ mkdir -p $(IMPDIR)/core/stdc ++ mkdir -p $(IMPDIR)/core/sync ++ mkdir -p $(IMPDIR)/core/sys/freebsd/sys ++ mkdir -p $(IMPDIR)/core/sys/linux/sys ++ mkdir -p $(IMPDIR)/core/sys/osx/mach ++ mkdir -p $(IMPDIR)/core/sys/posix/arpa ++ mkdir -p $(IMPDIR)/core/sys/posix/net ++ mkdir -p $(IMPDIR)/core/sys/posix/netinet ++ mkdir -p $(IMPDIR)/core/sys/posix/sys ++ mkdir -p $(IMPDIR)/core/sys/windows ++ mkdir -p $(IMPDIR)/gcc ++ ++$(IMPDIR)/%.di: %.d $(IMPDIR) ++ cp $< $@ + + # %.o : %.c + # Use .c.o to override Automake +@@ -595,12 +621,18 @@ $(IMPORT)/%.di: %.d $(IMPORT) + gcc/cbridge_math.o: gcc/cbridge_math.c + $(CC) -o $@ $(OUR_CFLAGS) $(CFLAGS) -fno-strict-aliasing -c $< + +-libgdruntime.a : $(ALL_DRUNTIME_OBJS) $(CMAIN_OBJS) $(subst core/,$(IMPORT)/core/,$(CORE_IMPORTS)) +- $(AR) -r $@ $(ALL_DRUNTIME_OBJS) $(CMAIN_OBJS) ++libgdruntime.a : $(ALL_DRUNTIME_OBJS) \ ++ $(subst core/,$(IMPDIR)/core/,$(CORE_IMPORTS)) \ ++ $(subst gcc/,$(IMPDIR)/gcc/,$(GCC_IMPORTS)) ++@BACKTRACE_SUPPORTED_TRUE@ cp -f $(LIBBACKTRACE_LIB) $@ ++@BACKTRACE_SUPPORTED_TRUE@ $(AR) -q $@ $(ALL_DRUNTIME_OBJS) ++@BACKTRACE_SUPPORTED_FALSE@ $(AR) -r $@ $(ALL_DRUNTIME_OBJS) + $(RANLIB) $@ + +-libgdruntime_t.a : $(ALL_DRUNTIME_OBJS:.o=.t.o) $(CMAIN_OBJS:.o=.t.o) +- $(AR) -r $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) $(CMAIN_OBJS:.o=.t.o) ++libgdruntime_t.a : $(ALL_DRUNTIME_OBJS:.o=.t.o) ++@BACKTRACE_SUPPORTED_TRUE@ cp -f $(LIBBACKTRACE_LIB) $@ ++@BACKTRACE_SUPPORTED_TRUE@ $(AR) -q $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) ++@BACKTRACE_SUPPORTED_FALSE@ $(AR) -r $@ $(ALL_DRUNTIME_OBJS:.o=.t.o) + $(RANLIB) $@ + + unittest: libgdruntime.a libgdruntime_t.a unittest.o +@@ -615,37 +647,44 @@ install-exec-local: libgdruntime.a + $(RANLIB) $(DESTDIR)$(toolexeclibdir)/libgdruntime.a + + install-data-local: libgdruntime.a ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir) ++ for i in __entrypoint.di object.di; do \ ++ $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ done + for i in core; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.di; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ +- done; \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(srcdir)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in gcc; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.d; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ +- done; \ ++ for i in core core/stdc core/sync core/sys/freebsd \ ++ core/sys/freebsd/sys core/sys/linux core/sys/linux/sys \ ++ core/sys/osx core/sys/osx/mach core/sys/posix \ ++ core/sys/posix/arpa core/sys/posix/net \ ++ core/sys/posix/netinet core/sys/posix/sys \ ++ core/sys/windows; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(IMPDIR)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in core core/stdc core/sync core/sys/osx/mach core/sys/posix \ +- core/sys/posix/arpa core/sys/posix/net core/sys/posix/netinet \ +- core/sys/posix/sys core/sys/windows; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR)/$$i; \ +- for f in $(IMPORT)/$$i/*.di; do \ +- $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR)/$$i; \ +- done; \ ++ for i in gcc; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(IMPDIR)/$$i/*.di; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done +- for i in object.di; do \ +- $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ for i in phobos-ver-syms; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR); \ ++ $(INSTALL_HEADER) $$i $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR); \ + done +- $(INSTALL) phobos-ver-syms $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR) + + clean-local: +- rm -f $(CMAIN_OBJS) + rm -f $(ALL_DRUNTIME_OBJS) + rm -f $(ALL_DRUNTIME_OBJS:.o=.t.o) + rm -f $(CORE_IMPORTS) +- rm -rf $(IMPORT) ++ rm -f $(GCC_IMPORTS) ++ rm -rf $(IMPDIR) + rm -f libgdruntime.a + + check-local: unittest +--- a/src/libphobos/libdruntime/object_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/object_.d 2014-04-01 16:32:51.000000000 +0100 +@@ -117,18 +117,6 @@ class Object + return this is o; + } + +- bool opEquals(Object lhs, Object rhs) +- { +- if (lhs is rhs) +- return true; +- if (lhs is null || rhs is null) +- return false; +- if (typeid(lhs) == typeid(rhs)) +- return lhs.opEquals(rhs); +- return lhs.opEquals(rhs) && +- rhs.opEquals(lhs); +- } +- + interface Monitor + { + void lock(); +@@ -178,32 +166,6 @@ bool opEquals(Object lhs, Object rhs) + return lhs.opEquals(rhs) && rhs.opEquals(lhs); + } + +-bool opEquals(TypeInfo lhs, TypeInfo rhs) +-{ +- // If aliased to the same object or both null => equal +- if (lhs is rhs) return true; +- +- // If either is null => non-equal +- if (lhs is null || rhs is null) return false; +- +- // If same exact type => one call to method opEquals +- if (typeid(lhs) == typeid(rhs)) return lhs.opEquals(rhs); +- +- //printf("%.*s and %.*s, %d %d\n", lhs.toString(), rhs.toString(), lhs.opEquals(rhs), rhs.opEquals(lhs)); +- +- // Factor out top level const +- // (This still isn't right, should follow same rules as compiler does for type equality.) +- TypeInfo_Const c = cast(TypeInfo_Const) lhs; +- if (c) +- lhs = c.base; +- c = cast(TypeInfo_Const) rhs; +- if (c) +- rhs = c.base; +- +- // General case => symmetric calls to method opEquals +- return lhs.opEquals(rhs) && rhs.opEquals(lhs); +-} +- + /** + * Information about an interface. + * When an object is accessed via an interface, an Interface* appears as the +@@ -213,7 +175,7 @@ struct Interface + { + TypeInfo_Class classinfo; /// .classinfo for this interface (not for containing class) + void*[] vtbl; +- ptrdiff_t offset; /// offset to Interface 'this' from Object 'this' ++ size_t offset; /// offset to Interface 'this' from Object 'this' + } + + /** +@@ -310,7 +272,7 @@ class TypeInfo + + /// Get TypeInfo for 'next' type, as defined by what kind of type this is, + /// null if none. +- @property const(TypeInfo) next() nothrow pure const { return null; } ++ @property inout(TypeInfo) next() nothrow pure inout { return null; } + + /// Return default initializer. If the type should be initialized to all zeros, + /// an array with a null ptr and a length equal to the type size will be returned. +@@ -345,38 +307,6 @@ class TypeInfo + @property immutable(void)* rtInfo() nothrow pure const @safe { return null; } + } + +-class TypeInfo_Vector : TypeInfo +-{ +- override string toString() const { return "__vector(" ~ base.toString() ~ ")"; } +- +- override bool opEquals(Object o) +- { +- if (this is o) +- return true; +- auto c = cast(const TypeInfo_Vector)o; +- return c && this.base == c.base; +- } +- +- override size_t getHash(in void* p) const { return base.getHash(p); } +- override bool equals(in void* p1, in void* p2) const { return base.equals(p1, p2); } +- override int compare(in void* p1, in void* p2) const { return base.compare(p1, p2); } +- override @property size_t tsize() nothrow pure const { return base.tsize; } +- override void swap(void* p1, void* p2) const { return base.swap(p1, p2); } +- +- override @property const(TypeInfo) next() nothrow pure const { return base.next; } +- override @property uint flags() nothrow pure const { return base.flags; } +- override const(void)[] init() nothrow pure const { return base.init(); } +- +- override @property size_t talign() nothrow pure const { return 16; } +- +- version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2) +- { +- return base.argTypes(arg1, arg2); +- } +- +- TypeInfo base; +-} +- + class TypeInfo_Typedef : TypeInfo + { + override string toString() const { return name; } +@@ -396,7 +326,7 @@ class TypeInfo_Typedef : TypeInfo + override @property size_t tsize() nothrow pure const { return base.tsize; } + override void swap(void* p1, void* p2) const { return base.swap(p1, p2); } + +- override @property const(TypeInfo) next() nothrow pure const { return base.next; } ++ override @property inout(TypeInfo) next() nothrow pure inout { return base.next; } + override @property uint flags() nothrow pure const { return base.flags; } + override const(void)[] init() nothrow pure const @safe { return m_init.length ? m_init : base.init(); } + +@@ -463,7 +393,7 @@ class TypeInfo_Pointer : TypeInfo + *cast(void**)p2 = tmp; + } + +- override @property const(TypeInfo) next() nothrow pure const { return m_next; } ++ override @property inout(TypeInfo) next() nothrow pure inout { return m_next; } + override @property uint flags() nothrow pure const { return 1; } + + TypeInfo m_next; +@@ -534,7 +464,7 @@ class TypeInfo_Array : TypeInfo + + TypeInfo value; + +- override @property const(TypeInfo) next() nothrow pure const ++ override @property inout(TypeInfo) next() nothrow pure inout + { + return value; + } +@@ -634,7 +564,7 @@ class TypeInfo_StaticArray : TypeInfo + } + + override const(void)[] init() nothrow pure const { return value.init(); } +- override @property const(TypeInfo) next() nothrow pure const { return value; } ++ override @property inout(TypeInfo) next() nothrow pure inout { return value; } + override @property uint flags() nothrow pure const { return value.flags; } + + override void destroy(void* p) const +@@ -689,6 +619,11 @@ class TypeInfo_AssociativeArray : TypeIn + this.value == c.value; + } + ++ override bool equals(in void* p1, in void* p2) @trusted const ++ { ++ return !!_aaEqual(this, *cast(const void**) p1, *cast(const void**) p2); ++ } ++ + override hash_t getHash(in void* p) nothrow @trusted const + { + return _aaGetHash(cast(void*)p, this); +@@ -701,7 +636,7 @@ class TypeInfo_AssociativeArray : TypeIn + return (char[int]).sizeof; + } + +- override @property const(TypeInfo) next() nothrow pure const { return value; } ++ override @property inout(TypeInfo) next() nothrow pure inout { return value; } + override @property uint flags() nothrow pure const { return 1; } + + TypeInfo value; +@@ -721,6 +656,38 @@ class TypeInfo_AssociativeArray : TypeIn + } + } + ++class TypeInfo_Vector : TypeInfo ++{ ++ override string toString() const { return "__vector(" ~ base.toString() ~ ")"; } ++ ++ override bool opEquals(Object o) ++ { ++ if (this is o) ++ return true; ++ auto c = cast(const TypeInfo_Vector)o; ++ return c && this.base == c.base; ++ } ++ ++ override size_t getHash(in void* p) const { return base.getHash(p); } ++ override bool equals(in void* p1, in void* p2) const { return base.equals(p1, p2); } ++ override int compare(in void* p1, in void* p2) const { return base.compare(p1, p2); } ++ override @property size_t tsize() nothrow pure const { return base.tsize; } ++ override void swap(void* p1, void* p2) const { return base.swap(p1, p2); } ++ ++ override @property inout(TypeInfo) next() nothrow pure inout { return base.next; } ++ override @property uint flags() nothrow pure const { return base.flags; } ++ override const(void)[] init() nothrow pure const { return base.init(); } ++ ++ override @property size_t talign() nothrow pure const { return 16; } ++ ++ version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2) ++ { ++ return base.argTypes(arg1, arg2); ++ } ++ ++ TypeInfo base; ++} ++ + class TypeInfo_Function : TypeInfo + { + override string toString() const +@@ -866,14 +833,18 @@ class TypeInfo_Class : TypeInfo + TypeInfo_Class base; /// base class + void* destructor; + void function(Object) classInvariant; +- uint m_flags; +- // 1: // is IUnknown or is derived from IUnknown +- // 2: // has no possible pointers into GC memory +- // 4: // has offTi[] member +- // 8: // has constructors +- // 16: // has xgetMembers member +- // 32: // has typeinfo member +- // 64: // is not constructable ++ enum ClassFlags : uint ++ { ++ isCOMclass = 0x1, ++ noPointers = 0x2, ++ hasOffTi = 0x4, ++ hasCtor = 0x8, ++ hasGetMembers = 0x10, ++ hasTypeInfo = 0x20, ++ isAbstract = 0x40, ++ isCPPclass = 0x80, ++ } ++ ClassFlags m_flags; + void* deallocator; + OffsetTypeInfo[] m_offTi; + void function(Object) defaultConstructor; // default Constructor +@@ -1092,7 +1063,11 @@ class TypeInfo_Struct : TypeInfo + int function(in void*, in void*) xopCmp; + char[] function(in void*) xtoString; + +- uint m_flags; ++ enum StructFlags : uint ++ { ++ hasPointers = 0x1, ++ } ++ StructFlags m_flags; + } + void function(void*) xdtor; + void function(void*) xpostblit; +@@ -1235,7 +1210,7 @@ class TypeInfo_Const : TypeInfo + override @property size_t tsize() nothrow pure const { return base.tsize; } + override void swap(void *p1, void *p2) const { return base.swap(p1, p2); } + +- override @property const(TypeInfo) next() nothrow pure const { return base.next; } ++ override @property inout(TypeInfo) next() nothrow pure inout { return base.next; } + override @property uint flags() nothrow pure const { return base.flags; } + override const(void)[] init() nothrow pure const { return base.init(); } + +@@ -1575,9 +1550,9 @@ unittest + + enum + { +- MIctorstart = 1, // we've started constructing it +- MIctordone = 2, // finished construction +- MIstandalone = 4, // module ctor does not depend on other module ++ MIctorstart = 0x1, // we've started constructing it ++ MIctordone = 0x2, // finished construction ++ MIstandalone = 0x4, // module ctor does not depend on other module + // ctors being done first + MItlsctor = 8, + MItlsdtor = 0x10, +@@ -1588,307 +1563,147 @@ enum + MIunitTest = 0x200, + MIimportedModules = 0x400, + MIlocalClasses = 0x800, +- MInew = 0x80000000 // it's the "new" layout ++ MIname = 0x1000, + } + + + struct ModuleInfo + { +- struct New +- { +- uint flags; +- uint index; // index into _moduleinfo_array[] ++ uint _flags; ++ uint _index; // index into _moduleinfo_array[] + +- /* Order of appearance, depending on flags +- * tlsctor +- * tlsdtor +- * xgetMembers +- * ctor +- * dtor +- * ictor +- * importedModules +- * localClasses +- * name +- */ +- } +- struct Old ++ private void* addrOf(int flag) nothrow pure ++ in + { +- string name; +- ModuleInfo*[] importedModules; +- TypeInfo_Class[] localClasses; +- uint flags; +- +- void function() ctor; // module shared static constructor (order dependent) +- void function() dtor; // module shared static destructor +- void function() unitTest; // module unit tests +- +- void* xgetMembers; // module getMembers() function +- +- void function() ictor; // module shared static constructor (order independent) +- +- void function() tlsctor; // module thread local static constructor (order dependent) +- void function() tlsdtor; // module thread local static destructor +- +- uint index; // index into _moduleinfo_array[] +- +- void*[1] reserved; // for future expansion ++ assert(flag >= MItlsctor && flag <= MIname); ++ assert(!(flag & (flag - 1)) && !(flag & ~(flag - 1) << 1)); + } +- +- union ++ body + { +- New n; +- Old o; +- } ++ void* p = cast(void*)&this + ModuleInfo.sizeof; + +- @property bool isNew() nothrow pure { return (n.flags & MInew) != 0; } ++ if (flags & MItlsctor) ++ { ++ if (flag == MItlsctor) return p; ++ p += typeof(tlsctor).sizeof; ++ } ++ if (flags & MItlsdtor) ++ { ++ if (flag == MItlsdtor) return p; ++ p += typeof(tlsdtor).sizeof; ++ } ++ if (flags & MIctor) ++ { ++ if (flag == MIctor) return p; ++ p += typeof(ctor).sizeof; ++ } ++ if (flags & MIdtor) ++ { ++ if (flag == MIdtor) return p; ++ p += typeof(dtor).sizeof; ++ } ++ if (flags & MIxgetMembers) ++ { ++ if (flag == MIxgetMembers) return p; ++ p += typeof(xgetMembers).sizeof; ++ } ++ if (flags & MIictor) ++ { ++ if (flag == MIictor) return p; ++ p += typeof(ictor).sizeof; ++ } ++ if (flags & MIunitTest) ++ { ++ if (flag == MIunitTest) return p; ++ p += typeof(unitTest).sizeof; ++ } ++ if (flags & MIimportedModules) ++ { ++ if (flag == MIimportedModules) return p; ++ p += size_t.sizeof + *cast(size_t*)p * typeof(importedModules[0]).sizeof; ++ } ++ if (flags & MIlocalClasses) ++ { ++ if (flag == MIlocalClasses) return p; ++ p += size_t.sizeof + *cast(size_t*)p * typeof(localClasses[0]).sizeof; ++ } ++ if (true || flags & MIname) // always available for now ++ { ++ if (flag == MIname) return p; ++ p += .strlen(cast(immutable char*)p); ++ } ++ assert(0); ++ } + +- @property uint index() nothrow pure { return isNew ? n.index : o.index; } +- @property void index(uint i) nothrow pure { if (isNew) n.index = i; else o.index = i; } ++ @property uint index() nothrow pure { return _index; } ++ @property void index(uint i) nothrow pure { _index = i; } + +- @property uint flags() nothrow pure { return isNew ? n.flags : o.flags; } +- @property void flags(uint f) nothrow pure { if (isNew) n.flags = f; else o.flags = f; } ++ @property uint flags() nothrow pure { return _flags; } ++ @property void flags(uint f) nothrow pure { _flags = f; } + + @property void function() tlsctor() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MItlsctor) +- { +- size_t off = New.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- else +- return o.tlsctor; ++ return flags & MItlsctor ? *cast(typeof(return)*)addrOf(MItlsctor) : null; + } + + @property void function() tlsdtor() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MItlsdtor) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- else +- return o.tlsdtor; ++ return flags & MItlsdtor ? *cast(typeof(return)*)addrOf(MItlsdtor) : null; + } + + @property void* xgetMembers() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MIxgetMembers) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- return o.xgetMembers; ++ return flags & MIxgetMembers ? *cast(typeof(return)*)addrOf(MIxgetMembers) : null; + } + + @property void function() ctor() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MIctor) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- return o.ctor; ++ return flags & MIctor ? *cast(typeof(return)*)addrOf(MIctor) : null; + } + + @property void function() dtor() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MIdtor) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- return o.ctor; ++ return flags & MIdtor ? *cast(typeof(return)*)addrOf(MIdtor) : null; + } + + @property void function() ictor() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MIictor) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- if (n.flags & MIdtor) +- off += o.ctor.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- return o.ictor; ++ return flags & MIictor ? *cast(typeof(return)*)addrOf(MIictor) : null; + } + + @property void function() unitTest() nothrow pure + { +- if (isNew) +- { +- if (n.flags & MIunitTest) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- if (n.flags & MIdtor) +- off += o.ctor.sizeof; +- if (n.flags & MIictor) +- off += o.ictor.sizeof; +- return *cast(typeof(return)*)(cast(void*)(&this) + off); +- } +- return null; +- } +- return o.unitTest; ++ return flags & MIunitTest ? *cast(typeof(return)*)addrOf(MIunitTest) : null; + } + + @property ModuleInfo*[] importedModules() nothrow pure + { +- if (isNew) ++ if (flags & MIimportedModules) + { +- if (n.flags & MIimportedModules) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- if (n.flags & MIdtor) +- off += o.ctor.sizeof; +- if (n.flags & MIictor) +- off += o.ictor.sizeof; +- if (n.flags & MIunitTest) +- off += o.unitTest.sizeof; +- auto plength = cast(size_t*)(cast(void*)(&this) + off); +- ModuleInfo** pm = cast(ModuleInfo**)(plength + 1); +- return pm[0 .. *plength]; +- } +- return null; ++ auto p = cast(size_t*)addrOf(MIimportedModules); ++ return (cast(ModuleInfo**)(p + 1))[0 .. *p]; + } +- return o.importedModules; ++ return null; + } + + @property TypeInfo_Class[] localClasses() nothrow pure + { +- if (isNew) ++ if (flags & MIlocalClasses) + { +- if (n.flags & MIlocalClasses) +- { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- if (n.flags & MIdtor) +- off += o.ctor.sizeof; +- if (n.flags & MIictor) +- off += o.ictor.sizeof; +- if (n.flags & MIunitTest) +- off += o.unitTest.sizeof; +- if (n.flags & MIimportedModules) +- { +- auto plength = cast(size_t*)(cast(void*)(&this) + off); +- off += size_t.sizeof + *plength * plength.sizeof; +- } +- auto plength = cast(size_t*)(cast(void*)(&this) + off); +- TypeInfo_Class* pt = cast(TypeInfo_Class*)(plength + 1); +- return pt[0 .. *plength]; +- } +- return null; ++ auto p = cast(size_t*)addrOf(MIlocalClasses); ++ return (cast(TypeInfo_Class*)(p + 1))[0 .. *p]; + } +- return o.localClasses; ++ return null; + } + + @property string name() nothrow pure + { +- if (isNew) ++ if (true || flags & MIname) // always available for now + { +- size_t off = New.sizeof; +- if (n.flags & MItlsctor) +- off += o.tlsctor.sizeof; +- if (n.flags & MItlsdtor) +- off += o.tlsdtor.sizeof; +- if (n.flags & MIxgetMembers) +- off += o.xgetMembers.sizeof; +- if (n.flags & MIctor) +- off += o.ctor.sizeof; +- if (n.flags & MIdtor) +- off += o.ctor.sizeof; +- if (n.flags & MIictor) +- off += o.ictor.sizeof; +- if (n.flags & MIunitTest) +- off += o.unitTest.sizeof; +- if (n.flags & MIimportedModules) +- { +- auto plength = cast(size_t*)(cast(void*)(&this) + off); +- off += size_t.sizeof + *plength * plength.sizeof; +- } +- if (n.flags & MIlocalClasses) +- { +- auto plength = cast(size_t*)(cast(void*)(&this) + off); +- off += size_t.sizeof + *plength * plength.sizeof; +- } +- auto p = cast(immutable(char)*)(cast(void*)(&this) + off); +- auto len = strlen(p); +- return p[0 .. len]; ++ auto p = cast(immutable char*)addrOf(MIname); ++ return p[0 .. .strlen(p)]; + } +- return o.name; ++ // return null; + } + + alias int delegate(ref ModuleInfo*) ApplyDg; +@@ -2101,16 +1916,14 @@ extern (C) void rt_detachDisposeEvent(Ob + + extern (C) + { +- // from druntime/compiler/gdc/rt/aaA.d ++ // from druntime/rt/aaA.d + +- size_t _aaLen(void* p); +- void* _aaGetX(void** pp, TypeInfo keyti, size_t valuesize, void* pkey); +- void* _aaGetRvalueX(void* p, TypeInfo keyti, size_t valuesize, void* pkey); +- void* _aaInX(void* p, TypeInfo keyti, void* pkey); +- bool _aaDelX(void* p, TypeInfo keyti, void* pkey); +- void[] _aaValues(void* p, size_t keysize, size_t valuesize); +- void[] _aaKeys(void* p, size_t keysize); +- void* _aaRehash(void** pp, TypeInfo keyti); ++ size_t _aaLen(in void* p) pure nothrow; ++ void* _aaGetX(void** pp, const TypeInfo keyti, in size_t valuesize, in void* pkey); ++ inout(void)* _aaGetRvalueX(inout void* p, in TypeInfo keyti, in size_t valuesize, in void* pkey); ++ inout(void)[] _aaValues(inout void* p, in size_t keysize, in size_t valuesize) pure nothrow; ++ inout(void)[] _aaKeys(inout void* p, in size_t keysize) pure nothrow; ++ void* _aaRehash(void** pp, in TypeInfo keyti) pure nothrow; + + extern (D) alias scope int delegate(void *) _dg_t; + int _aaApply(void* aa, size_t keysize, _dg_t dg); +@@ -2118,106 +1931,68 @@ extern (C) + extern (D) alias scope int delegate(void *, void *) _dg2_t; + int _aaApply2(void* aa, size_t keysize, _dg2_t dg); + +- void* _d_assocarrayliteralTX(TypeInfo_AssociativeArray ti, void[] keys, void[] values); +- hash_t _aaGetHash(void* aa, const(TypeInfo) tiRaw) nothrow; ++ private struct AARange { void* impl, current; } ++ AARange _aaRange(void* aa); ++ bool _aaRangeEmpty(AARange r); ++ void* _aaRangeFrontKey(AARange r); ++ void* _aaRangeFrontValue(AARange r); ++ void _aaRangePopFront(ref AARange r); ++ ++ int _aaEqual(in TypeInfo tiRaw, in void* e1, in void* e2); ++ hash_t _aaGetHash(in void* aa, in TypeInfo tiRaw) nothrow; ++} ++ ++private template _Unqual(T) ++{ ++ static if (is(T U == shared(const U))) alias U _Unqual; ++ else static if (is(T U == const U )) alias U _Unqual; ++ else static if (is(T U == immutable U )) alias U _Unqual; ++ else static if (is(T U == inout U )) alias U _Unqual; ++ else static if (is(T U == shared U )) alias U _Unqual; ++ else alias T _Unqual; + } + + struct AssociativeArray(Key, Value) + { + private: +- // Duplicates of the stuff found in druntime/src/rt/aaA.d +- struct Slot +- { +- Slot *next; +- size_t hash; +- Key key; +- version(D_LP64) align(16) Value value; // c.f. rt/aaA.d, aligntsize() +- else align(4) Value value; ++ void* p; + +- // Stop creating built-in opAssign +- @disable void opAssign(Slot); +- } ++public: ++ @property size_t length() const { return _aaLen(p); } + +- struct Hashtable ++ Value[Key] rehash() + { +- Slot*[] b; +- size_t nodes; +- TypeInfo keyti; +- Slot*[4] binit; ++ auto p = _aaRehash(cast(void**) &p, typeid(Value[Key])); ++ return *cast(Value[Key]*)(&p); + } + +- void* p; // really Hashtable* ++ // Note: can't make `values` and `keys` inout as it is used ++ // e.g. in Phobos like `ReturnType!(aa.keys)` instead of `typeof(aa.keys)` ++ // which will result in `inout` propagation. + +- struct Range ++ inout(Value)[] inout_values() inout @property + { +- // State +- Slot*[] slots; +- Slot* current; +- +- this(void * aa) +- { +- if (!aa) return; +- auto pImpl = cast(Hashtable*) aa; +- slots = pImpl.b; +- nextSlot(); +- } +- +- void nextSlot() +- { +- foreach (i, slot; slots) +- { +- if (!slot) continue; +- current = slot; +- slots = slots.ptr[i .. slots.length]; +- break; +- } +- } +- +- public: +- @property bool empty() const +- { +- return current is null; +- } +- +- @property ref inout(Slot) front() inout +- { +- assert(current); +- return *current; +- } +- +- void popFront() +- { +- assert(current); +- current = current.next; +- if (!current) +- { +- slots = slots[1 .. $]; +- nextSlot(); +- } +- } ++ auto a = _aaValues(p, Key.sizeof, Value.sizeof); ++ return *cast(inout Value[]*) &a; + } + +-public: +- +- @property size_t length() { return _aaLen(p); } +- +- Value[Key] rehash() @property ++ inout(Key)[] inout_keys() inout @property + { +- auto p = _aaRehash(&p, typeid(Value[Key])); +- return *cast(Value[Key]*)(&p); ++ auto a = _aaKeys(p, Key.sizeof); ++ return *cast(inout Key[]*) &a; + } + + Value[] values() @property +- { +- auto a = _aaValues(p, Key.sizeof, Value.sizeof); +- return *cast(Value[]*) &a; +- } ++ { return inout_values; } + + Key[] keys() @property +- { +- auto a = _aaKeys(p, Key.sizeof); +- return *cast(Key[]*) &a; +- } ++ { return inout_keys; } ++ ++ const(Value)[] values() const @property ++ { return inout_values; } ++ ++ const(Key)[] keys() const @property ++ { return inout_keys; } + + int opApply(scope int delegate(ref Key, ref Value) dg) + { +@@ -2235,8 +2010,13 @@ public: + return p ? *p : defaultValue; + } + +- static if (is(typeof({ Value[Key] r; r[Key.init] = Value.init; }()))) +- @property Value[Key] dup() ++ static if (is(typeof({ ++ ref Value get(); // pseudo lvalue of Value ++ Value[Key] r; r[Key.init] = get(); ++ // bug 10720 - check whether Value is copyable ++ }))) ++ { ++ Value[Key] dup() + { + Value[Key] result; + foreach (k, v; this) +@@ -2245,49 +2025,38 @@ public: + } + return result; + } ++ } ++ else ++ @disable Value[Key] dup(); // for better error message + +- @property auto byKey() ++ auto byKey() + { + static struct Result + { +- Range state; ++ AARange r; + +- this(void* p) +- { +- state = Range(p); +- } +- +- @property ref Key front() +- { +- return state.front.key; +- } +- +- alias state this; ++ @property bool empty() { return _aaRangeEmpty(r); } ++ @property ref Key front() { return *cast(Key*)_aaRangeFrontKey(r); } ++ void popFront() { _aaRangePopFront(r); } ++ Result save() { return this; } + } + +- return Result(p); ++ return Result(_aaRange(p)); + } + +- @property auto byValue() ++ auto byValue() + { + static struct Result + { +- Range state; ++ AARange r; + +- this(void* p) +- { +- state = Range(p); +- } +- +- @property ref Value front() +- { +- return state.front.value; +- } +- +- alias state this; ++ @property bool empty() { return _aaRangeEmpty(r); } ++ @property ref Value front() { return *cast(Value*)_aaRangeFrontValue(r); } ++ void popFront() { _aaRangePopFront(r); } ++ Result save() { return this; } + } + +- return Result(p); ++ return Result(_aaRange(p)); + } + } + +@@ -2360,8 +2129,123 @@ unittest + assert(aa4.byValue.front == "onetwothreefourfive"); + } + +-// Scheduled for deprecation in December 2012. +-// Please use destroy instead of clear. ++unittest ++{ ++ // test for bug 10720 ++ static struct NC ++ { ++ @disable this(this) { } ++ } ++ ++ NC[string] aa; ++ static assert(!is(aa.nonExistingField)); ++} ++ ++unittest ++{ ++ // bug 5842 ++ string[string] test = null; ++ test["test1"] = "test1"; ++ test.remove("test1"); ++ test.rehash; ++ test["test3"] = "test3"; // causes divide by zero if rehash broke the AA ++} ++ ++unittest ++{ ++ string[] keys = ["a", "b", "c", "d", "e", "f"]; ++ ++ // Test forward range capabilities of byKey ++ { ++ int[string] aa; ++ foreach (key; keys) ++ aa[key] = 0; ++ ++ auto keyRange = aa.byKey(); ++ auto savedKeyRange = keyRange.save; ++ ++ // Consume key range once ++ size_t keyCount = 0; ++ while (!keyRange.empty) ++ { ++ aa[keyRange.front]++; ++ keyCount++; ++ keyRange.popFront(); ++ } ++ ++ foreach (key; keys) ++ { ++ assert(aa[key] == 1); ++ } ++ assert(keyCount == keys.length); ++ ++ // Verify it's possible to iterate the range the second time ++ keyCount = 0; ++ while (!savedKeyRange.empty) ++ { ++ aa[savedKeyRange.front]++; ++ keyCount++; ++ savedKeyRange.popFront(); ++ } ++ ++ foreach (key; keys) ++ { ++ assert(aa[key] == 2); ++ } ++ assert(keyCount == keys.length); ++ } ++ ++ // Test forward range capabilities of byValue ++ { ++ size_t[string] aa; ++ foreach (i; 0 .. keys.length) ++ { ++ aa[keys[i]] = i; ++ } ++ ++ auto valRange = aa.byValue(); ++ auto savedValRange = valRange.save; ++ ++ // Consume value range once ++ int[] hasSeen; ++ hasSeen.length = keys.length; ++ while (!valRange.empty) ++ { ++ assert(hasSeen[valRange.front] == 0); ++ hasSeen[valRange.front]++; ++ valRange.popFront(); ++ } ++ ++ foreach (sawValue; hasSeen) { assert(sawValue == 1); } ++ ++ // Verify it's possible to iterate the range the second time ++ hasSeen = null; ++ hasSeen.length = keys.length; ++ while (!savedValRange.empty) ++ { ++ assert(!hasSeen[savedValRange.front]); ++ hasSeen[savedValRange.front] = true; ++ savedValRange.popFront(); ++ } ++ ++ foreach (sawValue; hasSeen) { assert(sawValue); } ++ } ++} ++ ++unittest ++{ ++ // expanded test for 5842: increase AA size past the point where the AA ++ // stops using binit, in order to test another code path in rehash. ++ int[int] aa; ++ foreach (int i; 0 .. 32) ++ aa[i] = i; ++ foreach (int i; 0 .. 32) ++ aa.remove(i); ++ aa.rehash; ++ aa[1] = 1; ++} ++ ++deprecated("Please use destroy instead of clear.") + alias destroy clear; + + /++ +@@ -2485,9 +2369,9 @@ version(unittest) unittest + } + } + +-void destroy(T : U[n], U, size_t n)(ref T obj) ++void destroy(T : U[n], U, size_t n)(ref T obj) if (!is(T == struct)) + { +- obj = T.init; ++ obj[] = U.init; + } + + version(unittest) unittest +@@ -2499,6 +2383,18 @@ version(unittest) unittest + assert(a == [ 0, 0 ]); + } + ++unittest ++{ ++ static struct vec2f { ++ float[2] values; ++ alias values this; ++ } ++ ++ vec2f v; ++ destroy!vec2f(v); ++} ++ ++ + void destroy(T)(ref T obj) + if (!is(T == struct) && !is(T == interface) && !is(T == class) && !_isStaticArray!T) + { +@@ -2538,63 +2434,159 @@ version (unittest) + } + + /** +- * (Property) Get the current capacity of an array. The capacity is the number +- * of elements that the array can grow to before the array must be +- * extended/reallocated. ++ * (Property) Get the current capacity of a slice. The capacity is the size ++ * that the slice can grow to before the underlying array must be ++ * reallocated or extended. ++ * ++ * If an append must reallocate a slice with no possibility of extension, then ++ * 0 is returned. This happens when the slice references a static array, or ++ * if another slice references elements past the end of the current slice. ++ * ++ * Note: The capacity of a slice may be impacted by operations on other slices. + */ + @property size_t capacity(T)(T[] arr) pure nothrow + { + return _d_arraysetcapacity(typeid(T[]), 0, cast(void *)&arr); + } ++/// ++unittest ++{ ++ //Static array slice: no capacity ++ int[4] sarray = [1, 2, 3, 4]; ++ int[] slice = sarray[]; ++ assert(sarray.capacity == 0); ++ //Appending to slice will reallocate to a new array ++ slice ~= 5; ++ assert(slice.capacity >= 5); ++ ++ //Dynamic array slices ++ int[] a = [1, 2, 3, 4]; ++ int[] b = a[1 .. $]; ++ int[] c = a[1 .. $ - 1]; ++ assert(a.capacity != 0); ++ assert(a.capacity == b.capacity + 1); //both a and b share the same tail ++ assert(c.capacity == 0); //an append to c must relocate c. ++} + + /** +- * Try to reserve capacity for an array. The capacity is the number of +- * elements that the array can grow to before the array must be +- * extended/reallocated. ++ * Reserves capacity for a slice. The capacity is the size ++ * that the slice can grow to before the underlying array must be ++ * reallocated or extended. + * + * The return value is the new capacity of the array (which may be larger than + * the requested capacity). + */ +-size_t reserve(T)(ref T[] arr, size_t newcapacity) pure nothrow ++size_t reserve(T)(ref T[] arr, size_t newcapacity) pure nothrow @trusted + { + return _d_arraysetcapacity(typeid(T[]), newcapacity, cast(void *)&arr); + } ++/// ++unittest ++{ ++ //Static array slice: no capacity. Reserve relocates. ++ int[4] sarray = [1, 2, 3, 4]; ++ int[] slice = sarray[]; ++ auto u = slice.reserve(8); ++ assert(u >= 8); ++ assert(sarray.ptr !is slice.ptr); ++ assert(slice.capacity == u); ++ ++ //Dynamic array slices ++ int[] a = [1, 2, 3, 4]; ++ a.reserve(8); //prepare a for appending 4 more items ++ auto p = a.ptr; ++ u = a.capacity; ++ a ~= [5, 6, 7, 8]; ++ assert(p == a.ptr); //a should not have been reallocated ++ assert(u == a.capacity); //a should not have been extended ++} ++ ++// Issue 6646: should be possible to use array.reserve from SafeD. ++@safe unittest ++{ ++ int[] a; ++ a.reserve(10); ++} + + /** +- * Assume that it is safe to append to this array. Appends made to this array ++ * Assume that it is safe to append to this array. Appends made to this array + * after calling this function may append in place, even if the array was a + * slice of a larger array to begin with. + * +- * Use this only when you are sure no elements are in use beyond the array in +- * the memory block. If there are, those elements could be overwritten by +- * appending to this array. ++ * Use this only when it is certain there are no elements in use beyond the ++ * array in the memory block. If there are, those elements will be ++ * overwritten by appending to this array. + * + * Calling this function, and then using references to data located after the + * given array results in undefined behavior. ++ * ++ * Returns: ++ * The input is returned. + */ +-void assumeSafeAppend(T)(T[] arr) ++auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) + { + _d_arrayshrinkfit(typeid(T[]), *(cast(void[]*)&arr)); ++ return arr; ++} ++/// ++unittest ++{ ++ int[] a = [1, 2, 3, 4]; ++ ++ // Without assumeSafeAppend. Appending relocates. ++ int[] b = a [0 .. 3]; ++ b ~= 5; ++ assert(a.ptr != b.ptr); ++ ++ // With assumeSafeAppend. Appending overwrites. ++ int[] c = a [0 .. 3]; ++ c.assumeSafeAppend() ~= 5; ++ assert(a.ptr == c.ptr); + } + +-version (unittest) unittest ++unittest + { ++ int[] arr; ++ auto newcap = arr.reserve(2000); ++ assert(newcap >= 2000); ++ assert(newcap == arr.capacity); ++ auto ptr = arr.ptr; ++ foreach(i; 0..2000) ++ arr ~= i; ++ assert(ptr == arr.ptr); ++ arr = arr[0..1]; ++ arr.assumeSafeAppend(); ++ arr ~= 5; ++ assert(ptr == arr.ptr); ++} ++ ++unittest ++{ ++ int[] arr = [1, 2, 3]; ++ void foo(ref int[] i) + { +- int[] arr; +- auto newcap = arr.reserve(2000); +- assert(newcap >= 2000); +- assert(newcap == arr.capacity); +- auto ptr = arr.ptr; +- foreach(i; 0..2000) +- arr ~= i; +- assert(ptr == arr.ptr); +- arr = arr[0..1]; +- arr.assumeSafeAppend(); +- arr ~= 5; +- assert(ptr == arr.ptr); ++ i ~= 5; + } ++ arr = arr[0 .. 2]; ++ foo(assumeSafeAppend(arr)); //pass by ref ++ assert(arr[]==[1, 2, 5]); ++ arr = arr[0 .. 1].assumeSafeAppend(); //pass by value + } + ++//@@@10574@@@ ++unittest ++{ ++ int[] a; ++ immutable(int[]) b; ++ auto a2 = &assumeSafeAppend(a); ++ auto b2 = &assumeSafeAppend(b); ++ auto a3 = assumeSafeAppend(a[]); ++ auto b3 = assumeSafeAppend(b[]); ++ assert(is(typeof(*a2) == int[])); ++ assert(is(typeof(*b2) == immutable(int[]))); ++ assert(is(typeof(a3) == int[])); ++ assert(is(typeof(b3) == immutable(int[]))); ++} + + version (none) + { +@@ -2653,6 +2645,11 @@ bool _xopEquals(in void*, in void*) + throw new Error("TypeInfo.equals is not implemented"); + } + ++bool _xopCmp(in void*, in void*) ++{ ++ throw new Error("TypeInfo.compare is not implemented"); ++} ++ + /****************************************** + * Create RTInfo for type T + */ +--- a/src/libphobos/libdruntime/object.di 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/object.di 2014-04-01 16:32:51.000000000 +0100 +@@ -35,7 +35,6 @@ class Object + size_t toHash() @trusted nothrow; + int opCmp(Object o); + bool opEquals(Object o); +- bool opEquals(Object lhs, Object rhs); + + interface Monitor + { +@@ -48,7 +47,6 @@ class Object + + bool opEquals(const Object lhs, const Object rhs); + bool opEquals(Object lhs, Object rhs); +-//bool opEquals(TypeInfo lhs, TypeInfo rhs); + + void setSameMutex(shared Object ownee, shared Object owner); + +@@ -56,7 +54,7 @@ struct Interface + { + TypeInfo_Class classinfo; + void*[] vtbl; +- ptrdiff_t offset; // offset to Interface 'this' from Object 'this' ++ size_t offset; // offset to Interface 'this' from Object 'this' + } + + struct OffsetTypeInfo +@@ -76,7 +74,7 @@ class TypeInfo + int compare(in void* p1, in void* p2) const; + @property size_t tsize() nothrow pure const @safe; + void swap(void* p1, void* p2) const; +- @property const(TypeInfo) next() nothrow pure const; ++ @property inout(TypeInfo) next() nothrow pure inout; + const(void)[] init() nothrow pure const @safe; // TODO: make this a property, but may need to be renamed to diambiguate with T.init... + @property uint flags() nothrow pure const @safe; + // 1: // has possible pointers into GC memory +@@ -114,7 +112,7 @@ class TypeInfo_Array : TypeInfo + override int compare(in void* p1, in void* p2) const; + override @property size_t tsize() nothrow pure const; + override void swap(void* p1, void* p2) const; +- override @property const(TypeInfo) next() nothrow pure const; ++ override @property inout(TypeInfo) next() nothrow pure inout; + override @property uint flags() nothrow pure const; + override @property size_t talign() nothrow pure const; + version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2); +@@ -122,11 +120,6 @@ class TypeInfo_Array : TypeInfo + TypeInfo value; + } + +-class TypeInfo_Vector : TypeInfo +-{ +- TypeInfo base; +-} +- + class TypeInfo_StaticArray : TypeInfo + { + TypeInfo value; +@@ -140,6 +133,11 @@ class TypeInfo_AssociativeArray : TypeIn + TypeInfo impl; + } + ++class TypeInfo_Vector : TypeInfo ++{ ++ TypeInfo base; ++} ++ + class TypeInfo_Function : TypeInfo + { + TypeInfo next; +@@ -164,13 +162,18 @@ class TypeInfo_Class : TypeInfo + TypeInfo_Class base; + void* destructor; + void function(Object) classInvariant; +- uint m_flags; +- // 1: // is IUnknown or is derived from IUnknown +- // 2: // has no possible pointers into GC memory +- // 4: // has offTi[] member +- // 8: // has constructors +- // 16: // has xgetMembers member +- // 32: // has typeinfo member ++ enum ClassFlags : uint ++ { ++ isCOMclass = 0x1, ++ noPointers = 0x2, ++ hasOffTi = 0x4, ++ hasCtor = 0x8, ++ hasGetMembers = 0x10, ++ hasTypeInfo = 0x20, ++ isAbstract = 0x40, ++ isCPPclass = 0x80, ++ } ++ ClassFlags m_flags; + void* deallocator; + OffsetTypeInfo[] m_offTi; + void* defaultConstructor; +@@ -199,7 +202,11 @@ class TypeInfo_Struct : TypeInfo + int function(in void*, in void*) xopCmp; + string function(in void*) xtoString; + +- uint m_flags; ++ enum StructFlags : uint ++ { ++ hasPointers = 0x1, ++ } ++ StructFlags m_flags; + } + void function(void*) xdtor; + void function(void*) xpostblit; +@@ -270,37 +277,9 @@ class MemberInfo_function : MemberInfo + + struct ModuleInfo + { +- struct New +- { +- uint flags; +- uint index; +- } +- +- struct Old +- { +- string name; +- ModuleInfo*[] importedModules; +- TypeInfo_Class[] localClasses; +- uint flags; +- +- void function() ctor; +- void function() dtor; +- void function() unitTest; +- void* xgetMembers; +- void function() ictor; +- void function() tlsctor; +- void function() tlsdtor; +- uint index; +- void*[1] reserved; +- } ++ uint _flags; ++ uint _index; + +- union +- { +- New n; +- Old o; +- } +- +- @property bool isNew() nothrow pure; + @property uint index() nothrow pure; + @property void index(uint i) nothrow pure; + @property uint flags() nothrow pure; +@@ -374,14 +353,12 @@ extern (C) + { + // from druntime/src/compiler/dmd/aaA.d + +- size_t _aaLen(void* p); +- void* _aaGetX(void** pp, TypeInfo keyti, size_t valuesize, void* pkey); +- void* _aaGetRvalueX(void* p, TypeInfo keyti, size_t valuesize, void* pkey); +- void* _aaInX(void* p, TypeInfo keyti, void* pkey); +- bool _aaDelX(void* p, TypeInfo keyti, void* pkey); +- void[] _aaValues(void* p, size_t keysize, size_t valuesize); +- void[] _aaKeys(void* p, size_t keysize); +- void* _aaRehash(void** pp, TypeInfo keyti); ++ size_t _aaLen(in void* p) pure nothrow; ++ void* _aaGetX(void** pp, const TypeInfo keyti, in size_t valuesize, in void* pkey); ++ inout(void)* _aaGetRvalueX(inout void* p, in TypeInfo keyti, in size_t valuesize, in void* pkey); ++ inout(void)[] _aaValues(inout void* p, in size_t keysize, in size_t valuesize) pure nothrow; ++ inout(void)[] _aaKeys(inout void* p, in size_t keysize) pure nothrow; ++ void* _aaRehash(void** pp, in TypeInfo keyti) pure nothrow; + + extern (D) alias scope int delegate(void *) _dg_t; + int _aaApply(void* aa, size_t keysize, _dg_t dg); +@@ -389,106 +366,65 @@ extern (C) + extern (D) alias scope int delegate(void *, void *) _dg2_t; + int _aaApply2(void* aa, size_t keysize, _dg2_t dg); + +- void* _d_assocarrayliteralTX(TypeInfo_AssociativeArray ti, void[] keys, void[] values); +- hash_t _aaGetHash(void* aa, const(TypeInfo) tiRaw) nothrow; ++ private struct AARange { void* impl, current; } ++ AARange _aaRange(void* aa); ++ bool _aaRangeEmpty(AARange r); ++ void* _aaRangeFrontKey(AARange r); ++ void* _aaRangeFrontValue(AARange r); ++ void _aaRangePopFront(ref AARange r); ++} ++ ++private template _Unqual(T) ++{ ++ static if (is(T U == shared(const U))) alias U _Unqual; ++ else static if (is(T U == const U )) alias U _Unqual; ++ else static if (is(T U == immutable U )) alias U _Unqual; ++ else static if (is(T U == inout U )) alias U _Unqual; ++ else static if (is(T U == shared U )) alias U _Unqual; ++ else alias T _Unqual; + } + + struct AssociativeArray(Key, Value) + { + private: +- // Duplicates of the stuff found in druntime/src/rt/aaA.d +- struct Slot +- { +- Slot *next; +- size_t hash; +- Key key; +- version(D_LP64) align(16) Value value; // c.f. rt/aaA.d, aligntsize() +- else align(4) Value value; ++ void* p; + +- // Stop creating built-in opAssign +- @disable void opAssign(Slot); +- } ++public: ++ @property size_t length() const { return _aaLen(p); } + +- struct Hashtable ++ Value[Key] rehash() + { +- Slot*[] b; +- size_t nodes; +- TypeInfo keyti; +- Slot*[4] binit; ++ auto p = _aaRehash(cast(void**) &p, typeid(Value[Key])); ++ return *cast(Value[Key]*)(&p); + } + +- void* p; // really Hashtable* ++ // Note: can't make `values` and `keys` inout as it is used ++ // e.g. in Phobos like `ReturnType!(aa.keys)` instead of `typeof(aa.keys)` ++ // which will result in `inout` propagation. + +- struct Range ++ inout(Value)[] inout_values() inout @property + { +- // State +- Slot*[] slots; +- Slot* current; +- +- this(void * aa) +- { +- if (!aa) return; +- auto pImpl = cast(Hashtable*) aa; +- slots = pImpl.b; +- nextSlot(); +- } +- +- void nextSlot() +- { +- foreach (i, slot; slots) +- { +- if (!slot) continue; +- current = slot; +- slots = slots.ptr[i .. slots.length]; +- break; +- } +- } +- +- public: +- @property bool empty() const +- { +- return current is null; +- } +- +- @property ref inout(Slot) front() inout +- { +- assert(current); +- return *current; +- } +- +- void popFront() +- { +- assert(current); +- current = current.next; +- if (!current) +- { +- slots = slots[1 .. $]; +- nextSlot(); +- } +- } ++ auto a = _aaValues(p, Key.sizeof, Value.sizeof); ++ return *cast(inout Value[]*) &a; + } + +-public: +- +- @property size_t length() { return _aaLen(p); } +- +- Value[Key] rehash() @property ++ inout(Key)[] inout_keys() inout @property + { +- auto p = _aaRehash(&p, typeid(Value[Key])); +- return *cast(Value[Key]*)(&p); ++ auto a = _aaKeys(p, Key.sizeof); ++ return *cast(inout Key[]*) &a; + } + + Value[] values() @property +- { +- auto a = _aaValues(p, Key.sizeof, Value.sizeof); +- return *cast(Value[]*) &a; +- } ++ { return inout_values; } + + Key[] keys() @property +- { +- auto a = _aaKeys(p, Key.sizeof); +- return *cast(Key[]*) &a; +- } ++ { return inout_keys; } ++ ++ const(Value)[] values() const @property ++ { return inout_values; } ++ ++ const(Key)[] keys() const @property ++ { return inout_keys; } + + int opApply(scope int delegate(ref Key, ref Value) dg) + { +@@ -506,8 +442,13 @@ public: + return p ? *p : defaultValue; + } + +- static if (is(typeof({ Value[Key] r; r[Key.init] = Value.init; }()))) +- @property Value[Key] dup() ++ static if (is(typeof({ ++ ref Value get(); // pseudo lvalue of Value ++ Value[Key] r; r[Key.init] = get(); ++ // bug 10720 - check whether Value is copyable ++ }))) ++ { ++ Value[Key] dup() + { + Value[Key] result; + foreach (k, v; this) +@@ -516,49 +457,38 @@ public: + } + return result; + } ++ } ++ else ++ @disable Value[Key] dup(); // for better error message + +- @property auto byKey() ++ auto byKey() + { + static struct Result + { +- Range state; ++ AARange r; + +- this(void* p) +- { +- state = Range(p); +- } +- +- @property ref Key front() +- { +- return state.front.key; +- } +- +- alias state this; ++ @property bool empty() { return _aaRangeEmpty(r); } ++ @property ref Key front() { return *cast(Key*)_aaRangeFrontKey(r); } ++ void popFront() { _aaRangePopFront(r); } ++ Result save() { return this; } + } + +- return Result(p); ++ return Result(_aaRange(p)); + } + +- @property auto byValue() ++ auto byValue() + { + static struct Result + { +- Range state; +- +- this(void* p) +- { +- state = Range(p); +- } ++ AARange r; + +- @property ref Value front() +- { +- return state.front.value; +- } +- +- alias state this; ++ @property bool empty() { return _aaRangeEmpty(r); } ++ @property ref Value front() { return *cast(Value*)_aaRangeFrontValue(r); } ++ void popFront() { _aaRangePopFront(r); } ++ Result save() { return this; } + } + +- return Result(p); ++ return Result(_aaRange(p)); + } + } + +@@ -587,9 +517,9 @@ void destroy(T)(ref T obj) if (is(T == s + buf[] = init[]; + } + +-void destroy(T : U[n], U, size_t n)(ref T obj) ++void destroy(T : U[n], U, size_t n)(ref T obj) if (!is(T == struct)) + { +- obj = T.init; ++ obj[] = U.init; + } + + void destroy(T)(ref T obj) +@@ -619,14 +549,15 @@ private + return _d_arraysetcapacity(typeid(T[]), 0, cast(void *)&arr); + } + +-size_t reserve(T)(ref T[] arr, size_t newcapacity) pure nothrow ++size_t reserve(T)(ref T[] arr, size_t newcapacity) pure nothrow @trusted + { + return _d_arraysetcapacity(typeid(T[]), newcapacity, cast(void *)&arr); + } + +-void assumeSafeAppend(T)(T[] arr) ++auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) + { + _d_arrayshrinkfit(typeid(T[]), *(cast(void[]*)&arr)); ++ return arr; + } + + bool _ArrayEq(T1, T2)(T1[] a1, T2[] a2) +@@ -641,6 +572,7 @@ bool _ArrayEq(T1, T2)(T1[] a1, T2[] a2) + } + + bool _xopEquals(in void* ptr, in void* ptr); ++bool _xopCmp(in void* ptr, in void* ptr); + + void __ctfeWrite(T...)(auto ref T) {} + void __ctfeWriteln(T...)(auto ref T values) { __ctfeWrite(values, "\n"); } +--- a/src/libphobos/libdruntime/phobos-ver-syms.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/phobos-ver-syms.in 2014-04-01 16:32:51.000000000 +0100 +@@ -1,8 +1,6 @@ + @DCFG_UNIX@ + @DCFG_POSIX@ +-@DCFG_SEMAPHORE_IMPL@ +-@DCFG_EXECVPE@ +-@DCFG_SPAWNVP@ + @DCFG_CBRIDGE_STDIO@ + @DCFG_MMAP@ + @DCFG_ARM_EABI_UNWINDER@ ++@DCFG_THREAD_MODEL@ +--- a/src/libphobos/libdruntime/rt/aaA.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/aaA.d 2014-04-01 16:32:51.000000000 +0100 +@@ -20,28 +20,13 @@ private + import core.stdc.stdio; + import core.memory; + +- enum BlkAttr : uint +- { +- FINALIZE = 0b0000_0001, +- NO_SCAN = 0b0000_0010, +- NO_MOVE = 0b0000_0100, +- APPENDABLE = 0b0000_1000, +- NO_INTERIOR = 0b0001_0000, +- ALL_BITS = 0b1111_1111 +- } +- +- extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); +- extern (C) void gc_free( void* p ); +- + // Convenience function to make sure the NO_INTERIOR gets set on the +- // aaA arrays. +- aaA*[] newaaA(size_t len) ++ // bucket array. ++ Entry*[] newBuckets(in size_t len) @trusted pure nothrow + { +- auto ptr = cast(aaA**) gc_malloc( +- len * (aaA*).sizeof, BlkAttr.NO_INTERIOR); +- auto ret = ptr[0..len]; +- ret[] = null; +- return ret; ++ auto ptr = cast(Entry**) GC.calloc( ++ len * (Entry*).sizeof, GC.BlkAttr.NO_INTERIOR); ++ return ptr[0..len]; + } + } + +@@ -72,29 +57,31 @@ struct Array + void* ptr; + } + +-struct aaA ++struct Entry + { +- aaA *next; ++ Entry *next; + size_t hash; + /* key */ + /* value */ + } + +-struct BB ++struct Impl + { +- aaA*[] b; +- size_t nodes; // total number of aaA nodes +- TypeInfo keyti; // TODO: replace this with TypeInfo_AssociativeArray when available in _aaGet() +- aaA*[4] binit; // initial value of b[] ++ Entry*[] buckets; ++ size_t nodes; // total number of entries ++ TypeInfo _keyti; ++ Entry*[4] binit; // initial value of buckets[] ++ ++ @property const(TypeInfo) keyti() const @safe pure nothrow ++ { return _keyti; } + } + + /* This is the type actually seen by the programmer, although + * it is completely opaque. + */ +- + struct AA + { +- BB* a; ++ Impl* impl; + } + + /********************************** +@@ -102,8 +89,7 @@ struct AA + * GC won't be faced with misaligned pointers + * in value. + */ +- +-size_t aligntsize(size_t tsize) nothrow ++size_t aligntsize(in size_t tsize) @safe pure nothrow + { + version (D_LP64) { + // align to 16 bytes on 64-bit +@@ -116,79 +102,10 @@ size_t aligntsize(size_t tsize) nothrow + + extern (C): + +-/************************************************* +- * Invariant for aa. +- */ +- +-/+ +-void _aaInvAh(aaA*[] aa) +-{ +- for (size_t i = 0; i < aa.length; i++) +- { +- if (aa[i]) +- _aaInvAh_x(aa[i]); +- } +-} +- +-private int _aaCmpAh_x(aaA *e1, aaA *e2) +-{ int c; +- +- c = e1.hash - e2.hash; +- if (c == 0) +- { +- c = e1.key.length - e2.key.length; +- if (c == 0) +- c = memcmp((char *)e1.key, (char *)e2.key, e1.key.length); +- } +- return c; +-} +- +-private void _aaInvAh_x(aaA *e) +-{ +- size_t key_hash; +- aaA *e1; +- aaA *e2; +- +- key_hash = getHash(e.key); +- assert(key_hash == e.hash); +- +- while (1) +- { int c; +- +- e1 = e.left; +- if (e1) +- { +- _aaInvAh_x(e1); // ordinary recursion +- do +- { +- c = _aaCmpAh_x(e1, e); +- assert(c < 0); +- e1 = e1.right; +- } while (e1 != null); +- } +- +- e2 = e.right; +- if (e2) +- { +- do +- { +- c = _aaCmpAh_x(e, e2); +- assert(c < 0); +- e2 = e2.left; +- } while (e2 != null); +- e = e.right; // tail recursion +- } +- else +- break; +- } +-} +-+/ +- + /**************************************************** + * Determine number of entries in associative array. + */ +- +-size_t _aaLen(AA aa) ++size_t _aaLen(in AA aa) pure nothrow + in + { + //printf("_aaLen()+\n"); +@@ -198,9 +115,9 @@ out (result) + { + size_t len = 0; + +- if (aa.a) ++ if (aa.impl) + { +- foreach (e; aa.a.b) ++ foreach (const(Entry)* e; aa.impl.buckets) + { + while (e) + { len++; +@@ -214,7 +131,7 @@ out (result) + } + body + { +- return aa.a ? aa.a.nodes : 0; ++ return aa.impl ? aa.impl.nodes : 0; + } + + +@@ -222,14 +139,7 @@ body + * Get pointer to value in associative array indexed by key. + * Add entry for key if it is not already there. + */ +- +-// retained for backwards compatibility +-void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, ...) +-{ +- return _aaGetX(aa, keyti, valuesize, cast(void*)(&valuesize + 1)); +-} +- +-void* _aaGetX(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey) ++void* _aaGetX(AA* aa, const TypeInfo keyti, in size_t valuesize, in void* pkey) + in + { + assert(aa); +@@ -237,30 +147,30 @@ in + out (result) + { + assert(result); +- assert(aa.a); +- assert(aa.a.b.length); ++ assert(aa.impl !is null); ++ assert(aa.impl.buckets.length); + //assert(_aaInAh(*aa.a, key)); + } + body + { + size_t i; +- aaA *e; ++ Entry *e; + //printf("keyti = %p\n", keyti); + //printf("aa = %p\n", aa); + immutable keytitsize = keyti.tsize; + +- if (!aa.a) +- { aa.a = new BB(); +- aa.a.b = aa.a.binit[]; ++ if (aa.impl is null) ++ { aa.impl = new Impl(); ++ aa.impl.buckets = aa.impl.binit[]; + } + //printf("aa = %p\n", aa); + //printf("aa.a = %p\n", aa.a); +- aa.a.keyti = keyti; ++ aa.impl._keyti = cast() keyti; + + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); +- i = key_hash % aa.a.b.length; +- auto pe = &aa.a.b[i]; ++ i = key_hash % aa.impl.buckets.length; ++ auto pe = &aa.impl.buckets[i]; + while ((e = *pe) !is null) + { + if (key_hash == e.hash) +@@ -274,8 +184,8 @@ body + + // Not found, create new elem + //printf("create new one\n"); +- size_t size = aaA.sizeof + aligntsize(keytitsize) + valuesize; +- e = cast(aaA *) gc_malloc(size); ++ size_t size = Entry.sizeof + aligntsize(keytitsize) + valuesize; ++ e = cast(Entry *) GC.malloc(size); + e.next = null; + e.hash = key_hash; + ubyte* ptail = cast(ubyte*)(e + 1); +@@ -283,9 +193,9 @@ body + memset(ptail + aligntsize(keytitsize), 0, valuesize); // zero value + *pe = e; + +- auto nodes = ++aa.a.nodes; +- //printf("length = %d, nodes = %d\n", aa.a.b.length, nodes); +- if (nodes > aa.a.b.length * 4) ++ auto nodes = ++aa.impl.nodes; ++ //printf("length = %d, nodes = %d\n", aa.a.buckets.length, nodes); ++ if (nodes > aa.impl.buckets.length * 4) + { + //printf("rehash\n"); + _aaRehash(aa,keyti); +@@ -300,34 +210,28 @@ Lret: + * Get pointer to value in associative array indexed by key. + * Returns null if it is not already there. + */ +- +-void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...) +-{ +- return _aaGetRvalueX(aa, keyti, valuesize, cast(void*)(&valuesize + 1)); +-} +- +-void* _aaGetRvalueX(AA aa, TypeInfo keyti, size_t valuesize, void* pkey) ++inout(void)* _aaGetRvalueX(inout AA aa, in TypeInfo keyti, in size_t valuesize, in void* pkey) + { + //printf("_aaGetRvalue(valuesize = %u)\n", valuesize); +- if (!aa.a) ++ if (aa.impl is null) + return null; + + auto keysize = aligntsize(keyti.tsize); +- auto len = aa.a.b.length; ++ auto len = aa.impl.buckets.length; + + if (len) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + size_t i = key_hash % len; +- auto e = aa.a.b[i]; ++ inout(Entry)* e = aa.impl.buckets[i]; + while (e !is null) + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) +- return cast(void *)(e + 1) + keysize; ++ return cast(inout void *)(e + 1) + keysize; + } + e = e.next; + } +@@ -342,13 +246,7 @@ void* _aaGetRvalueX(AA aa, TypeInfo keyt + * null not in aa + * !=null in aa, return pointer to value + */ +- +-void* _aaIn(AA aa, TypeInfo keyti, ...) +-{ +- return _aaInX(aa, keyti, cast(void*)(&keyti + 1)); +-} +- +-void* _aaInX(AA aa, TypeInfo keyti, void* pkey) ++inout(void)* _aaInX(inout AA aa, in TypeInfo keyti, in void* pkey) + in + { + } +@@ -358,24 +256,24 @@ out (result) + } + body + { +- if (aa.a) ++ if (aa.impl) + { + //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr); +- auto len = aa.a.b.length; ++ auto len = aa.impl.buckets.length; + + if (len) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + const i = key_hash % len; +- auto e = aa.a.b[i]; ++ inout(Entry)* e = aa.impl.buckets[i]; + while (e !is null) + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) +- return cast(void *)(e + 1) + aligntsize(keyti.tsize); ++ return cast(inout void *)(e + 1) + aligntsize(keyti.tsize); + } + e = e.next; + } +@@ -390,22 +288,16 @@ body + * Delete key entry in aa[]. + * If key is not in aa[], do nothing. + */ +- +-bool _aaDel(AA aa, TypeInfo keyti, ...) +-{ +- return _aaDelX(aa, keyti, cast(void*)(&keyti + 1)); +-} +- +-bool _aaDelX(AA aa, TypeInfo keyti, void* pkey) ++bool _aaDelX(AA aa, in TypeInfo keyti, in void* pkey) + { +- aaA *e; ++ Entry *e; + +- if (aa.a && aa.a.b.length) ++ if (aa.impl && aa.impl.buckets.length) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); +- size_t i = key_hash % aa.a.b.length; +- auto pe = &aa.a.b[i]; ++ size_t i = key_hash % aa.impl.buckets.length; ++ auto pe = &aa.impl.buckets[i]; + while ((e = *pe) !is null) // null means not found + { + if (key_hash == e.hash) +@@ -414,8 +306,8 @@ bool _aaDelX(AA aa, TypeInfo keyti, void + if (c == 0) + { + *pe = e.next; +- aa.a.nodes--; +- gc_free(e); ++ aa.impl.nodes--; ++ GC.free(e); + return true; + } + } +@@ -429,26 +321,25 @@ bool _aaDelX(AA aa, TypeInfo keyti, void + /******************************************** + * Produce array of values from aa. + */ +- +-ArrayRet_t _aaValues(AA aa, size_t keysize, size_t valuesize) ++inout(ArrayRet_t) _aaValues(inout AA aa, in size_t keysize, in size_t valuesize) pure nothrow + { + size_t resi; + Array a; + + auto alignsize = aligntsize(keysize); + +- if (aa.a) ++ if (aa.impl !is null) + { + a.length = _aaLen(aa); +- a.ptr = cast(byte*) gc_malloc(a.length * valuesize, +- valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0); ++ a.ptr = cast(byte*) GC.malloc(a.length * valuesize, ++ valuesize < (void*).sizeof ? GC.BlkAttr.NO_SCAN : 0); + resi = 0; +- foreach (e; aa.a.b) ++ foreach (inout(Entry)* e; aa.impl.buckets) + { + while (e) + { + memcpy(a.ptr + resi * valuesize, +- cast(byte*)e + aaA.sizeof + alignsize, ++ cast(byte*)e + Entry.sizeof + alignsize, + valuesize); + resi++; + e = e.next; +@@ -456,15 +347,14 @@ ArrayRet_t _aaValues(AA aa, size_t keysi + } + assert(resi == a.length); + } +- return *cast(ArrayRet_t*)(&a); ++ return *cast(inout ArrayRet_t*)(&a); + } + + + /******************************************** + * Rehash an array. + */ +- +-void* _aaRehash(AA* paa, TypeInfo keyti) ++void* _aaRehash(AA* paa, in TypeInfo keyti) pure nothrow + in + { + //_aaInvAh(paa); +@@ -476,59 +366,67 @@ out (result) + body + { + //printf("Rehash\n"); +- if (paa.a) ++ if (paa.impl !is null) + { +- BB newb; +- auto aa = paa.a; + auto len = _aaLen(*paa); + if (len) +- { size_t i; ++ { ++ Impl newImpl; ++ Impl* oldImpl = paa.impl; + ++ size_t i; + for (i = 0; i < prime_list.length - 1; i++) + { + if (len <= prime_list[i]) + break; + } + len = prime_list[i]; +- newb.b = newaaA(len); ++ newImpl.buckets = newBuckets(len); + +- foreach (e; aa.b) ++ foreach (e; oldImpl.buckets) + { + while (e) + { auto enext = e.next; + const j = e.hash % len; +- e.next = newb.b[j]; +- newb.b[j] = e; ++ e.next = newImpl.buckets[j]; ++ newImpl.buckets[j] = e; + e = enext; + } + } +- if (aa.b.ptr == aa.binit.ptr) +- aa.binit[] = null; ++ if (oldImpl.buckets.ptr == oldImpl.binit.ptr) ++ oldImpl.binit[] = null; + else +- GC.free(aa.b.ptr); ++ GC.free(oldImpl.buckets.ptr); + +- newb.nodes = aa.nodes; +- newb.keyti = aa.keyti; +- } ++ newImpl.nodes = oldImpl.nodes; ++ newImpl._keyti = oldImpl._keyti; + +- *paa.a = newb; ++ *paa.impl = newImpl; ++ } ++ else ++ { ++ if (paa.impl.buckets.ptr != paa.impl.binit.ptr) ++ GC.free(paa.impl.buckets.ptr); ++ paa.impl.buckets = paa.impl.binit[]; ++ } + } +- return (*paa).a; ++ return (*paa).impl; + } + + /******************************************** + * Produce array of N byte keys from aa. + */ +- +-ArrayRet_t _aaKeys(AA aa, size_t keysize) ++inout(ArrayRet_t) _aaKeys(inout AA aa, in size_t keysize) pure nothrow + { + auto len = _aaLen(aa); + if (!len) + return null; +- auto res = (cast(byte*) gc_malloc(len * keysize, +- !(aa.a.keyti.flags & 1) ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; ++ ++ immutable blkAttr = !(aa.impl.keyti.flags & 1) ? GC.BlkAttr.NO_SCAN : 0; ++ auto res = (cast(byte*) GC.malloc(len * keysize, blkAttr))[0 .. len * keysize]; ++ + size_t resi = 0; +- foreach (e; aa.a.b) ++ foreach (inout(Entry)* e; aa.impl.buckets) + { + while (e) + { +@@ -542,7 +440,7 @@ ArrayRet_t _aaKeys(AA aa, size_t keysize + Array a; + a.length = len; + a.ptr = res.ptr; +- return *cast(ArrayRet_t*)(&a); ++ return *cast(inout ArrayRet_t*)(&a); + } + + unittest +@@ -589,25 +487,35 @@ unittest + } + } + ++unittest // Test for Issue 10381 ++{ ++ alias II = int[int]; ++ II aa1 = [0: 1]; ++ II aa2 = [0: 1]; ++ II aa3 = [0: 2]; ++ assert(aa1 == aa2); // Passes ++ assert( typeid(II).equals(&aa1, &aa2)); ++ assert(!typeid(II).equals(&aa1, &aa3)); ++} ++ + + /********************************************** + * 'apply' for associative arrays - to support foreach + */ +- + // dg is D, but _aaApply() is C + extern (D) alias int delegate(void *) dg_t; + +-int _aaApply(AA aa, size_t keysize, dg_t dg) ++int _aaApply(AA aa, in size_t keysize, dg_t dg) + { +- if (!aa.a) ++ if (aa.impl is null) + { + return 0; + } + + immutable alignsize = aligntsize(keysize); +- //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg); ++ //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.impl, keysize, dg); + +- foreach (e; aa.a.b) ++ foreach (e; aa.impl.buckets) + { + while (e) + { +@@ -623,18 +531,18 @@ int _aaApply(AA aa, size_t keysize, dg_t + // dg is D, but _aaApply2() is C + extern (D) alias int delegate(void *, void *) dg2_t; + +-int _aaApply2(AA aa, size_t keysize, dg2_t dg) ++int _aaApply2(AA aa, in size_t keysize, dg2_t dg) + { +- if (!aa.a) ++ if (aa.impl is null) + { + return 0; + } + +- //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg); ++ //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.impl, keysize, dg); + + immutable alignsize = aligntsize(keysize); + +- foreach (e; aa.a.b) ++ foreach (e; aa.impl.buckets) + { + while (e) + { +@@ -653,99 +561,15 @@ int _aaApply2(AA aa, size_t keysize, dg2 + * Construct an associative array of type ti from + * length pairs of key/value pairs. + */ +- +-version (GNU) {} else +-extern (C) +-BB* _d_assocarrayliteralT(TypeInfo_AssociativeArray ti, size_t length, ...) +-{ +- auto valuesize = ti.next.tsize; // value size +- auto keyti = ti.key; +- auto keysize = keyti.tsize; // key size +- BB* result; +- +- //printf("_d_assocarrayliteralT(keysize = %d, valuesize = %d, length = %d)\n", keysize, valuesize, length); +- //printf("tivalue = %.*s\n", ti.next.classinfo.name); +- if (length == 0 || valuesize == 0 || keysize == 0) +- { +- } +- else +- { +- va_list q; +- version (Win64) +- va_start(q, length); +- else version(X86_64) +- va_start(q, __va_argsave); +- else +- va_start(q, length); +- +- result = new BB(); +- result.keyti = keyti; +- size_t i; +- +- for (i = 0; i < prime_list.length - 1; i++) +- { +- if (length <= prime_list[i]) +- break; +- } +- auto len = prime_list[i]; +- result.b = newaaA(len); +- +- size_t keystacksize = (keysize + int.sizeof - 1) & ~(int.sizeof - 1); +- size_t valuestacksize = (valuesize + int.sizeof - 1) & ~(int.sizeof - 1); +- +- size_t keytsize = aligntsize(keysize); +- +- for (size_t j = 0; j < length; j++) +- { void* pkey = q; +- q += keystacksize; +- void* pvalue = q; +- q += valuestacksize; +- aaA* e; +- +- auto key_hash = keyti.getHash(pkey); +- //printf("hash = %d\n", key_hash); +- i = key_hash % len; +- auto pe = &result.b[i]; +- while (1) +- { +- e = *pe; +- if (!e) +- { +- // Not found, create new elem +- //printf("create new one\n"); +- e = cast(aaA *) cast(void*) new void[aaA.sizeof + keytsize + valuesize]; +- memcpy(e + 1, pkey, keysize); +- e.hash = key_hash; +- *pe = e; +- result.nodes++; +- break; +- } +- if (key_hash == e.hash) +- { +- auto c = keyti.compare(pkey, e + 1); +- if (c == 0) +- break; +- } +- pe = &e.next; +- } +- memcpy(cast(void *)(e + 1) + keytsize, pvalue, valuesize); +- } +- +- va_end(q); +- } +- return result; +-} +- +-extern (C) +-BB* _d_assocarrayliteralTX(TypeInfo_AssociativeArray ti, void[] keys, void[] values) ++Impl* _d_assocarrayliteralTX(const TypeInfo_AssociativeArray ti, void[] keys, void[] values) + { +- auto valuesize = ti.next.tsize; // value size +- auto keyti = ti.key; +- auto keysize = keyti.tsize; // key size +- auto length = keys.length; +- BB* result; ++ const valuesize = ti.next.tsize; // value size ++ const keyti = ti.key; ++ const keysize = keyti.tsize; // key size ++ const length = keys.length; ++ Impl* result; + +- //printf("_d_assocarrayliteralTX(keysize = %d, valuesize = %d, length = %d)\n", keysize, valuesize, length); ++ //printf("_d_assocarrayliteralT(keysize = %d, valuesize = %d, length = %d)\n", keysize, valuesize, length); + //printf("tivalue = %.*s\n", ti.next.classinfo.name); + assert(length == values.length); + if (length == 0 || valuesize == 0 || keysize == 0) +@@ -753,8 +577,8 @@ BB* _d_assocarrayliteralTX(TypeInfo_Asso + } + else + { +- result = new BB(); +- result.keyti = keyti; ++ result = new Impl(); ++ result._keyti = cast() keyti; + + size_t i; + for (i = 0; i < prime_list.length - 1; i++) +@@ -763,19 +587,19 @@ BB* _d_assocarrayliteralTX(TypeInfo_Asso + break; + } + auto len = prime_list[i]; +- result.b = newaaA(len); ++ result.buckets = newBuckets(len); + + size_t keytsize = aligntsize(keysize); + + for (size_t j = 0; j < length; j++) + { auto pkey = keys.ptr + j * keysize; + auto pvalue = values.ptr + j * valuesize; +- aaA* e; ++ Entry* e; + + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + i = key_hash % len; +- auto pe = &result.b[i]; ++ auto pe = &result.buckets[i]; + while (1) + { + e = *pe; +@@ -783,7 +607,7 @@ BB* _d_assocarrayliteralTX(TypeInfo_Asso + { + // Not found, create new elem + //printf("create new one\n"); +- e = cast(aaA *) cast(void*) new void[aaA.sizeof + keytsize + valuesize]; ++ e = cast(Entry *) cast(void*) new void[Entry.sizeof + keytsize + valuesize]; + memcpy(e + 1, pkey, keysize); + e.hash = key_hash; + *pe = e; +@@ -805,7 +629,7 @@ BB* _d_assocarrayliteralTX(TypeInfo_Asso + } + + +-static TypeInfo_AssociativeArray _aaUnwrapTypeInfo(const(TypeInfo) tiRaw) nothrow ++const(TypeInfo_AssociativeArray) _aaUnwrapTypeInfo(const(TypeInfo) tiRaw) pure nothrow + { + const(TypeInfo)* p = &tiRaw; + TypeInfo_AssociativeArray ti; +@@ -839,22 +663,28 @@ static TypeInfo_AssociativeArray _aaUnwr + * 1 equal + * 0 not equal + */ +-int _aaEqual(TypeInfo tiRaw, AA e1, AA e2) ++int _aaEqual(in TypeInfo tiRaw, in AA e1, in AA e2) + { + //printf("_aaEqual()\n"); + //printf("keyti = %.*s\n", ti.key.classinfo.name); + //printf("valueti = %.*s\n", ti.next.classinfo.name); + +- if (e1.a is e2.a) ++ if (e1.impl is e2.impl) + return 1; + + size_t len = _aaLen(e1); + if (len != _aaLen(e2)) + return 0; + ++ // Bug 9852: at this point, e1 and e2 have the same length, so if one is ++ // null, the other must either also be null or have zero entries, so they ++ // must be equal. We check this here to avoid dereferencing null later on. ++ if (e1.impl is null || e2.impl is null) ++ return 1; ++ + // Check for Bug 5925. ti_raw could be a TypeInfo_Const, we need to unwrap + // it until reaching a real TypeInfo_AssociativeArray. +- TypeInfo_AssociativeArray ti = _aaUnwrapTypeInfo(tiRaw); ++ const TypeInfo_AssociativeArray ti = _aaUnwrapTypeInfo(tiRaw); + + /* Algorithm: Visit each key/value pair in e1. If that key doesn't exist + * in e2, or if the value in e1 doesn't match the one in e2, the arrays +@@ -862,12 +692,14 @@ int _aaEqual(TypeInfo tiRaw, AA e1, AA e + * After all pairs are checked, the arrays must be equal. + */ + +- auto keyti = ti.key; +- auto valueti = ti.next; ++ const keyti = ti.key; ++ const valueti = ti.next; + const keysize = aligntsize(keyti.tsize); +- const len2 = e2.a.b.length; + +- int _aaKeys_x(aaA* e) ++ assert(e2.impl !is null); ++ const len2 = e2.impl.buckets.length; ++ ++ int _aaKeys_x(const(Entry)* e) + { + do + { +@@ -880,7 +712,7 @@ int _aaEqual(TypeInfo tiRaw, AA e1, AA e + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + const i = key_hash % len2; +- auto f = e2.a.b[i]; ++ const(Entry)* f = e2.impl.buckets[i]; + while (1) + { + //printf("f is %p\n", f); +@@ -912,7 +744,7 @@ int _aaEqual(TypeInfo tiRaw, AA e1, AA e + return 1; // this subtree matches + } + +- foreach (e; e1.a.b) ++ foreach (e; e1.impl.buckets) + { + if (e) + { if (_aaKeys_x(e) == 0) +@@ -929,21 +761,20 @@ int _aaEqual(TypeInfo tiRaw, AA e1, AA e + * Returns: + * Hash value + */ +-extern (C) +-hash_t _aaGetHash(AA* aa, const(TypeInfo) tiRaw) nothrow ++hash_t _aaGetHash(in AA* aa, in TypeInfo tiRaw) nothrow + { + import rt.util.hash; + +- if (!aa.a) ++ if (aa.impl is null) + return 0; + + hash_t h = 0; +- TypeInfo_AssociativeArray ti = _aaUnwrapTypeInfo(tiRaw); +- auto keyti = ti.key; +- auto valueti = ti.next; ++ const TypeInfo_AssociativeArray ti = _aaUnwrapTypeInfo(tiRaw); ++ const keyti = ti.key; ++ const valueti = ti.next; + const keysize = aligntsize(keyti.tsize); + +- foreach (e; aa.a.b) ++ foreach (const(Entry)* e; aa.impl.buckets) + { + while (e) + { +@@ -996,3 +827,105 @@ unittest + + assert(aa1[key2a] == 200); + } ++ ++// Issue 9852 ++unittest ++{ ++ // Original test case (revised, original assert was wrong) ++ int[string] a; ++ a["foo"] = 0; ++ a.remove("foo"); ++ assert(a == null); // should not crash ++ ++ int[string] b; ++ assert(b is null); ++ assert(a == b); // should not deref null ++ assert(b == a); // ditto ++ ++ int[string] c; ++ c["a"] = 1; ++ assert(a != c); // comparison with empty non-null AA ++ assert(c != a); ++ assert(b != c); // comparison with null AA ++ assert(c != b); ++} ++ ++ ++/** ++ * _aaRange implements a ForwardRange ++ */ ++struct Range ++{ ++ Impl* impl; ++ Entry* current; ++} ++ ++ ++Range _aaRange(AA aa) ++{ ++ typeof(return) res; ++ if (aa.impl is null) ++ return res; ++ ++ res.impl = aa.impl; ++ foreach (entry; aa.impl.buckets) ++ { ++ if (entry !is null) ++ { ++ res.current = entry; ++ break; ++ } ++ } ++ return res; ++} ++ ++ ++bool _aaRangeEmpty(Range r) ++{ ++ return r.current is null; ++} ++ ++ ++void* _aaRangeFrontKey(Range r) ++in ++{ ++ assert(r.current !is null); ++} ++body ++{ ++ return cast(void*)r.current + Entry.sizeof; ++} ++ ++ ++void* _aaRangeFrontValue(Range r) ++in ++{ ++ assert(r.current !is null); ++ assert(r.impl.keyti !is null); // set on first insert ++} ++body ++{ ++ return cast(void*)r.current + Entry.sizeof + aligntsize(r.impl.keyti.tsize); ++} ++ ++ ++void _aaRangePopFront(ref Range r) ++{ ++ if (r.current.next !is null) ++ { ++ r.current = r.current.next; ++ } ++ else ++ { ++ immutable idx = r.current.hash % r.impl.buckets.length; ++ r.current = null; ++ foreach (entry; r.impl.buckets[idx + 1 .. $]) ++ { ++ if (entry !is null) ++ { ++ r.current = entry; ++ break; ++ } ++ } ++ } ++} +--- a/src/libphobos/libdruntime/rt/adi.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/adi.d 2014-04-01 16:32:51.000000000 +0100 +@@ -175,13 +175,13 @@ extern (C) wchar[] _adReverseWchar(wchar + break; + + if (stridelo == stridehi) +- { int stmp; ++ { ++ wchar[2] stmp; + + assert(stridelo == 2); +- assert(stmp.sizeof == 2 * (*lo).sizeof); +- stmp = *cast(int*)lo; +- *cast(int*)lo = *cast(int*)hi; +- *cast(int*)hi = stmp; ++ stmp = lo[0 .. 2]; ++ lo[0 .. 2] = hi[0 .. 2]; ++ hi[0 .. 2] = stmp; + lo += stridelo; + hi--; + continue; +@@ -462,6 +462,7 @@ unittest + assert(a == "hello"); + assert(a <= "hello"); + assert(a >= "hello"); ++ assert(a < "я"); + } + + /*************************************** +--- a/src/libphobos/libdruntime/rt/arrayassign.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arrayassign.d 2014-04-01 16:32:51.000000000 +0100 +@@ -33,8 +33,9 @@ extern (C) void[] _d_arrayassign(TypeInf + + if (to.length != from.length) + { +- char[10] tmp1 = void; +- char[10] tmp2 = void; ++ enum len = is(size_t == uint) ? 10 : 20; ++ char[len] tmp1 = void; ++ char[len] tmp2 = void; + string msg = "lengths don't match for array copy, "c; + msg ~= tmp1.uintToString(to.length) ~ " = " ~ tmp2.uintToString(from.length); + throw new Error(msg); +@@ -90,7 +91,8 @@ extern (C) void[] _d_arrayctor(TypeInfo + + if (to.length != from.length) + { +- char[10] tmp = void; ++ enum len = is(size_t == uint) ? 10 : 20; ++ char[len] tmp = void; + string msg = "lengths don't match for array initialization,"c; + msg ~= tmp.uintToString(to.length) ~ " = " ~ tmp.uintToString(from.length); + throw new Error(msg); +--- a/src/libphobos/libdruntime/rt/arraybyte.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arraybyte.d 2014-04-01 16:32:51.000000000 +0100 +@@ -303,7 +303,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -1323,7 +1322,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +--- a/src/libphobos/libdruntime/rt/arraycat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arraycat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -17,14 +17,14 @@ private + { + import core.stdc.string; + import rt.util.string; +- debug import core.stdc.stdio; ++ debug(PRINTF) import core.stdc.stdio; + } + + extern (C) @trusted nothrow: + + byte[] _d_arraycopy(size_t size, byte[] from, byte[] to) + { +- debug printf("f = %p,%d, t = %p,%d, size = %d\n", ++ debug(PRINTF) printf("f = %p,%d, t = %p,%d, size = %d\n", + from.ptr, from.length, to.ptr, to.length, size); + + if (to.length != from.length) +--- a/src/libphobos/libdruntime/rt/arraydouble.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arraydouble.d 2014-04-01 16:32:51.000000000 +0100 +@@ -65,7 +65,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -178,7 +177,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -1118,7 +1116,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +--- a/src/libphobos/libdruntime/rt/arrayfloat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arrayfloat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -169,7 +169,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -227,7 +226,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -285,7 +283,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +--- a/src/libphobos/libdruntime/rt/arrayint.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arrayint.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,5 +1,5 @@ + /** +- * Contains MMX versions of certain operations for dchar, int, and uint ('w', ++ * Contains SSE/MMX versions of certain operations for dchar, int, and uint ('w', + * 'i' and 'k' suffixes). + * + * Copyright: Copyright Digital Mars 2008 - 2010. +@@ -23,19 +23,46 @@ version (unittest) + private import core.stdc.stdio : printf; + /* This is so unit tests will test every CPU variant + */ +- int cpuid; +- const int CPUID_MAX = 4; +- @property bool mmx() { return cpuid == 1 && core.cpuid.mmx; } +- @property bool sse() { return cpuid == 2 && core.cpuid.sse; } +- @property bool sse2() { return cpuid == 3 && core.cpuid.sse2; } +- @property bool amd3dnow() { return cpuid == 4 && core.cpuid.amd3dnow; } ++ uint cpuid; ++ enum CPUID_MAX = 14; ++ @property bool mmx() { return cpuid == 1 && core.cpuid.mmx; } ++ @property bool sse() { return cpuid == 2 && core.cpuid.sse; } ++ @property bool sse2() { return cpuid == 3 && core.cpuid.sse2; } ++ @property bool sse3() { return cpuid == 4 && core.cpuid.sse3; } ++ @property bool sse41() { return cpuid == 5 && core.cpuid.sse41; } ++ @property bool sse42() { return cpuid == 6 && core.cpuid.sse42; } ++ @property bool sse4a() { return cpuid == 7 && core.cpuid.sse4a; } ++ @property bool avx() { return cpuid == 8 && core.cpuid.avx; } ++ @property bool avx2() { return cpuid == 9 && core.cpuid.avx2; } ++ @property bool amd3dnow() { return cpuid == 10 && core.cpuid.amd3dnow; } ++ @property bool and3dnowExt() { return cpuid == 11 && core.cpuid.amd3dnowExt; } ++ @property bool amdMmx() { return cpuid == 12 && core.cpuid.amdMmx; } ++ @property bool has3dnowPrefetch() { return cpuid == 13 && core.cpuid.has3dnowPrefetch; } + } + else + { +- alias core.cpuid.mmx mmx; +- alias core.cpuid.sse sse; +- alias core.cpuid.sse2 sse2; ++ version(X86_64) //guaranteed on x86_64 ++ { ++ enum mmx = true; ++ enum sse = true; ++ enum sse2 = true; ++ } ++ else ++ { ++ alias core.cpuid.mmx mmx; ++ alias core.cpuid.sse sse; ++ alias core.cpuid.sse2 sse2; ++ } ++ alias core.cpuid.sse3 sse3; ++ alias core.cpuid.sse41 sse41; ++ alias core.cpuid.sse42 sse42; ++ alias core.cpuid.sse4a sse4a; ++ alias core.cpuid.avx avx; ++ alias core.cpuid.avx2 avx2; + alias core.cpuid.amd3dnow amd3dnow; ++ alias core.cpuid.amd3dnowExt and3dnowExt; ++ alias core.cpuid.amdMmx amdMmx; ++ alias core.cpuid.has3dnowPrefetch has3dnowPrefetch; + } + + //version = log; +@@ -87,20 +114,18 @@ body + { + auto n = aptr + (a.length & ~7); + +- uint l = value; +- +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) + { + asm // unaligned case + { + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM2, l; ++ movd XMM2,value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2u: ++ startaddsse2u: + add ESI, 32; + movdqu XMM0, [EAX]; + movdqu XMM1, [EAX+16]; +@@ -123,11 +148,11 @@ body + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2a: ++ startaddsse2a: + add ESI, 32; + movdqa XMM0, [EAX]; + movdqa XMM1, [EAX+16]; +@@ -144,13 +169,12 @@ body + } + } + } +- else + // MMX version is 298% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +- ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); ++ ulong l = cast(uint) value | ((cast(ulong)cast(uint) value) << 32); + + asm + { +@@ -160,7 +184,7 @@ body + movq MM2, l; + + align 4; +- startmmx: ++ startmmx: + add ESI, 16; + movq MM0, [EAX]; + movq MM1, [EAX+8]; +@@ -177,33 +201,97 @@ body + mov bptr, EAX; + } + } +- else +- if (a.length >= 2) ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2u: ++ add RSI, 32; ++ movdqu XMM0, [RAX]; ++ movdqu XMM1, [RAX+16]; ++ add RAX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM2,value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2a: ++ add RSI, 32; ++ movdqa XMM0, [RAX]; ++ movdqa XMM1, [RAX+16]; ++ add RAX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) + { +- auto n = aptr + (a.length & ~1); ++ auto n = aptr + (a.length & ~3); ++ ++ ulong l = cast(uint) value | ((cast(ulong)cast(uint) value) << 32); + + asm + { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- mov EDX, value; ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movq MM2, l; + + align 4; +- start386: +- add ESI, 8; +- mov EBX, [EAX]; +- mov ECX, [EAX+4]; +- add EAX, 8; +- add EBX, EDX; +- add ECX, EDX; +- mov [ESI -8], EBX; +- mov [ESI+4-8], ECX; +- cmp ESI, EDI; +- jb start386; ++ startmmx: ++ add RSI, 16; ++ movq MM0, [RAX]; ++ movq MM1, [RAX+8]; ++ add RAX, 16; ++ paddd MM0, MM2; ++ paddd MM1, MM2; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; + +- mov aptr, ESI; +- mov bptr, EAX; ++ emms; ++ mov aptr, RSI; ++ mov bptr, RAX; + } + } + } +@@ -227,15 +315,13 @@ unittest + const int dim = 67; + T[] a = new T[dim + j]; // aligned on 16 byte boundary + a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; + T[] c = new T[dim + j]; + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ c[i] = cast(T)((i-10) * 2); + } + + c[] = a[] + 6; +@@ -273,10 +359,9 @@ T[] _arraySliceSliceAddSliceAssign_k(T[] + T[] _arraySliceSliceAddSliceAssign_i(T[] a, T[] c, T[] b) + in + { +- assert(a.length == b.length && b.length == c.length); +- assert(disjoint(a, b)); +- assert(disjoint(a, c)); +- assert(disjoint(b, c)); ++ assert(a.length == b.length && b.length == c.length); ++ assert(disjoint(a, b)); ++ assert(disjoint(a, c)); + } + body + { +@@ -293,7 +378,7 @@ body + { + auto n = aptr + (a.length & ~7); + +- if (((cast(uint) aptr | cast(uint) bptr | cast(uint) cptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) != 0) + { + asm // unaligned case + { +@@ -303,7 +388,7 @@ body + mov ECX, cptr; + + align 4; +- startsse2u: ++ startsse2u: + add ESI, 32; + movdqu XMM0, [EAX]; + movdqu XMM2, [ECX]; +@@ -333,7 +418,7 @@ body + mov ECX, cptr; + + align 4; +- startsse2a: ++ startsse2a: + add ESI, 32; + movdqa XMM0, [EAX]; + movdqa XMM2, [ECX]; +@@ -354,9 +439,8 @@ body + } + } + } +- else + // MMX version is 995% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -368,7 +452,7 @@ body + mov ECX, cptr; + + align 4; +- startmmx: ++ startmmx: + add ESI, 16; + movq MM0, [EAX]; + movq MM2, [ECX]; +@@ -390,8 +474,108 @@ body + } + } + } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse2u: ++ add RSI, 32; ++ movdqu XMM0, [RAX]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RAX+16]; ++ movdqu XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse2a: ++ add RSI, 32; ++ movdqa XMM0, [RAX]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RAX+16]; ++ movdqa XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) ++ { ++ auto n = aptr + (a.length & ~3); ++ ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startmmx: ++ add RSI, 16; ++ movq MM0, [RAX]; ++ movq MM2, [RCX]; ++ movq MM1, [RAX+8]; ++ movq MM3, [RCX+8]; ++ add RAX, 16; ++ add RCX, 16; ++ paddd MM0, MM2; ++ paddd MM1, MM3; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; ++ ++ emms; ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ } + +-normal: + while (aptr < aend) + *aptr++ = *bptr++ + *cptr++; + +@@ -417,9 +601,10 @@ unittest + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); + } + + c[] = a[] + b[]; +@@ -467,19 +652,17 @@ T[] _arrayExpSliceAddass_i(T[] a, T valu + { + auto n = aptr + (a.length & ~7); + +- uint l = value; +- +- if (((cast(uint) aptr) & 15) != 0) ++ if (((cast(size_t) aptr) & 15) != 0) + { + asm // unaligned case + { + mov ESI, aptr; + mov EDI, n; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2u: ++ startaddsse2u: + movdqu XMM0, [ESI]; + movdqu XMM1, [ESI+16]; + add ESI, 32; +@@ -499,11 +682,11 @@ T[] _arrayExpSliceAddass_i(T[] a, T valu + { + mov ESI, aptr; + mov EDI, n; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2a: ++ startaddsse2a: + movdqa XMM0, [ESI]; + movdqa XMM1, [ESI+16]; + add ESI, 32; +@@ -518,9 +701,8 @@ T[] _arrayExpSliceAddass_i(T[] a, T valu + } + } + } +- else + // MMX version is 81% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -533,7 +715,7 @@ T[] _arrayExpSliceAddass_i(T[] a, T valu + movq MM2, l; + + align 4; +- startmmx: ++ startmmx: + movq MM0, [ESI]; + movq MM1, [ESI+8]; + add ESI, 16; +@@ -548,30 +730,88 @@ T[] _arrayExpSliceAddass_i(T[] a, T valu + mov aptr, ESI; + } + } +- else +- if (a.length >= 2) ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM1, [RSI+16]; ++ add RSI, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2u; ++ ++ mov aptr, RSI; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM1, [RSI+16]; ++ add RSI, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2a; ++ ++ mov aptr, RSI; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) + { +- auto n = aptr + (a.length & ~1); ++ auto n = aptr + (a.length & ~3); ++ ++ ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); + + asm + { +- mov ESI, aptr; +- mov EDI, n; +- mov EDX, value; ++ mov RSI, aptr; ++ mov RDI, n; ++ movq MM2, l; + + align 4; +- start386: +- mov EBX, [ESI]; +- mov ECX, [ESI+4]; +- add ESI, 8; +- add EBX, EDX; +- add ECX, EDX; +- mov [ESI -8], EBX; +- mov [ESI+4-8], ECX; +- cmp ESI, EDI; +- jb start386; ++ startmmx: ++ movq MM0, [RSI]; ++ movq MM1, [RSI+8]; ++ add RSI, 16; ++ paddd MM0, MM2; ++ paddd MM1, MM2; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; + +- mov aptr, ESI; ++ emms; ++ mov aptr, RSI; + } + } + } +@@ -595,15 +835,13 @@ unittest + const int dim = 67; + T[] a = new T[dim + j]; // aligned on 16 byte boundary + a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; + T[] c = new T[dim + j]; + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ c[i] = cast(T)((i-10) * 2); + } + + a[] = c[]; +@@ -659,7 +897,7 @@ body + { + auto n = aptr + (a.length & ~7); + +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) + { + asm // unaligned case + { +@@ -668,7 +906,7 @@ body + mov ECX, bptr; + + align 4; +- startsse2u: ++ startsse2u: + movdqu XMM0, [ESI]; + movdqu XMM2, [ECX]; + movdqu XMM1, [ESI+16]; +@@ -695,7 +933,7 @@ body + mov ECX, bptr; + + align 4; +- startsse2a: ++ startsse2a: + movdqa XMM0, [ESI]; + movdqa XMM2, [ECX]; + movdqa XMM1, [ESI+16]; +@@ -714,9 +952,8 @@ body + } + } + } +- else + // MMX version is 471% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -727,7 +964,7 @@ body + mov ECX, bptr; + + align 4; +- startmmx: ++ startmmx: + movq MM0, [ESI]; + movq MM2, [ECX]; + movq MM1, [ESI+8]; +@@ -747,8 +984,100 @@ body + } + } + } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse2u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RSI+16]; ++ movdqu XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse2a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RSI+16]; ++ movdqa XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ paddd XMM0, XMM2; ++ paddd XMM1, XMM3; ++ movdqa [RSI-32], XMM0; ++ movdqa [RSI-16], XMM1; ++ ++ cmp RSI, RDI; ++ jb startsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) ++ { ++ auto n = aptr + (a.length & ~3); ++ ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startmmx: ++ movq MM0, [RSI]; ++ movq MM2, [RCX]; ++ movq MM1, [RSI+8]; ++ movq MM3, [RCX+8]; ++ add RSI, 16; ++ add RCX, 16; ++ paddd MM0, MM2; ++ paddd MM1, MM3; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; ++ ++ emms; ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ } + +-normal: + while (aptr < aend) + *aptr++ += *bptr++; + +@@ -774,9 +1103,10 @@ unittest + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); + } + + b[] = c[]; +@@ -832,20 +1162,18 @@ body + { + auto n = aptr + (a.length & ~7); + +- uint l = value; +- +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) + { + asm // unaligned case + { + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2u: ++ startaddsse2u: + add ESI, 32; + movdqu XMM0, [EAX]; + movdqu XMM1, [EAX+16]; +@@ -868,11 +1196,11 @@ body + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2a: ++ startaddsse2a: + add ESI, 32; + movdqa XMM0, [EAX]; + movdqa XMM1, [EAX+16]; +@@ -889,9 +1217,8 @@ body + } + } + } +- else + // MMX version is 315% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -905,7 +1232,7 @@ body + movq MM2, l; + + align 4; +- startmmx: ++ startmmx: + add ESI, 16; + movq MM0, [EAX]; + movq MM1, [EAX+8]; +@@ -922,33 +1249,97 @@ body + mov bptr, EAX; + } + } +- else +- if (a.length >= 2) ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2u: ++ add RSI, 32; ++ movdqu XMM0, [EAX]; ++ movdqu XMM1, [EAX+16]; ++ add RAX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2a: ++ add RSI, 32; ++ movdqa XMM0, [EAX]; ++ movdqa XMM1, [EAX+16]; ++ add RAX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) + { +- auto n = aptr + (a.length & ~1); ++ auto n = aptr + (a.length & ~3); ++ ++ ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); + + asm + { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- mov EDX, value; ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movq MM2, l; + + align 4; +- start386: +- add ESI, 8; +- mov EBX, [EAX]; +- mov ECX, [EAX+4]; +- add EAX, 8; +- sub EBX, EDX; +- sub ECX, EDX; +- mov [ESI -8], EBX; +- mov [ESI+4-8], ECX; +- cmp ESI, EDI; +- jb start386; ++ startmmx: ++ add RSI, 16; ++ movq MM0, [EAX]; ++ movq MM1, [EAX+8]; ++ add RAX, 16; ++ psubd MM0, MM2; ++ psubd MM1, MM2; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; + +- mov aptr, ESI; +- mov bptr, EAX; ++ emms; ++ mov aptr, RSI; ++ mov bptr, RAX; + } + } + } +@@ -972,15 +1363,13 @@ unittest + const int dim = 67; + T[] a = new T[dim + j]; // aligned on 16 byte boundary + a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; + T[] c = new T[dim + j]; + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ c[i] = cast(T)((i-10) * 2); + } + + c[] = a[] - 6; +@@ -1035,20 +1424,18 @@ body + { + auto n = aptr + (a.length & ~7); + +- uint l = value; +- +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) + { + asm // unaligned case + { + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM4, l; ++ movd XMM4, value; + pshufd XMM4, XMM4, 0; + + align 4; +- startaddsse2u: ++ startaddsse2u: + add ESI, 32; + movdqu XMM2, [EAX]; + movdqu XMM3, [EAX+16]; +@@ -1073,11 +1460,11 @@ body + mov ESI, aptr; + mov EDI, n; + mov EAX, bptr; +- movd XMM4, l; ++ movd XMM4, value; + pshufd XMM4, XMM4, 0; + + align 4; +- startaddsse2a: ++ startaddsse2a: + add ESI, 32; + movdqa XMM2, [EAX]; + movdqa XMM3, [EAX+16]; +@@ -1096,9 +1483,8 @@ body + } + } + } +- else + // MMX version is 1077% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -1112,7 +1498,7 @@ body + movq MM4, l; + + align 4; +- startmmx: ++ startmmx: + add ESI, 16; + movq MM2, [EAX]; + movq MM3, [EAX+8]; +@@ -1132,11 +1518,110 @@ body + } + } + } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); + +- while (aptr < aend) +- *aptr++ = value - *bptr++; +- +- return a; ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM4, value; ++ pshufd XMM4, XMM4, 0; ++ ++ align 4; ++ startaddsse2u: ++ add RSI, 32; ++ movdqu XMM2, [RAX]; ++ movdqu XMM3, [RAX+16]; ++ movdqa XMM0, XMM4; ++ movdqa XMM1, XMM4; ++ add RAX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM4, value; ++ pshufd XMM4, XMM4, 0; ++ ++ align 4; ++ startaddsse2a: ++ add RSI, 32; ++ movdqa XMM2, [EAX]; ++ movdqa XMM3, [EAX+16]; ++ movdqa XMM0, XMM4; ++ movdqa XMM1, XMM4; ++ add RAX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) ++ { ++ auto n = aptr + (a.length & ~3); ++ ++ ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); ++ ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movq MM4, l; ++ ++ align 4; ++ startmmx: ++ add RSI, 16; ++ movq MM2, [EAX]; ++ movq MM3, [EAX+8]; ++ movq MM0, MM4; ++ movq MM1, MM4; ++ add RAX, 16; ++ psubd MM0, MM2; ++ psubd MM1, MM3; ++ movq [ESI -16], MM0; ++ movq [ESI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; ++ ++ emms; ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ } ++ ++ while (aptr < aend) ++ *aptr++ = value - *bptr++; ++ ++ return a; + } + + unittest +@@ -1152,15 +1637,13 @@ unittest + const int dim = 67; + T[] a = new T[dim + j]; // aligned on 16 byte boundary + a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; + T[] c = new T[dim + j]; + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ c[i] = cast(T)((i-10) * 2); + } + + c[] = 6 - a[]; +@@ -1198,10 +1681,9 @@ T[] _arraySliceSliceMinSliceAssign_k(T[] + T[] _arraySliceSliceMinSliceAssign_i(T[] a, T[] c, T[] b) + in + { +- assert(a.length == b.length && b.length == c.length); +- assert(disjoint(a, b)); +- assert(disjoint(a, c)); +- assert(disjoint(b, c)); ++ assert(a.length == b.length && b.length == c.length); ++ assert(disjoint(a, b)); ++ assert(disjoint(a, c)); + } + body + { +@@ -1217,7 +1699,7 @@ body + { + auto n = aptr + (a.length & ~7); + +- if (((cast(uint) aptr | cast(uint) bptr | cast(uint) cptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) != 0) + { + asm // unaligned case + { +@@ -1227,7 +1709,7 @@ body + mov ECX, cptr; + + align 4; +- startsse2u: ++ startsse2u: + add ESI, 32; + movdqu XMM0, [EAX]; + movdqu XMM2, [ECX]; +@@ -1257,7 +1739,7 @@ body + mov ECX, cptr; + + align 4; +- startsse2a: ++ startsse2a: + add ESI, 32; + movdqa XMM0, [EAX]; + movdqa XMM2, [ECX]; +@@ -1278,9 +1760,8 @@ body + } + } + } +- else + // MMX version is 1002% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -1292,7 +1773,7 @@ body + mov ECX, cptr; + + align 4; +- startmmx: ++ startmmx: + add ESI, 16; + movq MM0, [EAX]; + movq MM2, [ECX]; +@@ -1314,6 +1795,107 @@ body + } + } + } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse2u: ++ add RSI, 32; ++ movdqu XMM0, [RAX]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RAX+16]; ++ movdqu XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse2a: ++ add RSI, 32; ++ movdqa XMM0, [RAX]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RAX+16]; ++ movdqa XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) ++ { ++ auto n = aptr + (a.length & ~3); ++ ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startmmx: ++ add RSI, 16; ++ movq MM0, [RAX]; ++ movq MM2, [RCX]; ++ movq MM1, [RAX+8]; ++ movq MM3, [RCX+8]; ++ add RAX, 16; ++ add RCX, 16; ++ psubd MM0, MM2; ++ psubd MM1, MM3; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; ++ ++ emms; ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ } + + while (aptr < aend) + *aptr++ = *bptr++ - *cptr++; +@@ -1340,9 +1922,10 @@ unittest + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); + } + + c[] = a[] - b[]; +@@ -1390,19 +1973,17 @@ T[] _arrayExpSliceMinass_i(T[] a, T valu + { + auto n = aptr + (a.length & ~7); + +- uint l = value; +- +- if (((cast(uint) aptr) & 15) != 0) ++ if (((cast(size_t) aptr) & 15) != 0) + { + asm // unaligned case + { + mov ESI, aptr; + mov EDI, n; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2u: ++ startaddsse2u: + movdqu XMM0, [ESI]; + movdqu XMM1, [ESI+16]; + add ESI, 32; +@@ -1422,11 +2003,11 @@ T[] _arrayExpSliceMinass_i(T[] a, T valu + { + mov ESI, aptr; + mov EDI, n; +- movd XMM2, l; ++ movd XMM2, value; + pshufd XMM2, XMM2, 0; + + align 4; +- startaddsse2a: ++ startaddsse2a: + movdqa XMM0, [ESI]; + movdqa XMM1, [ESI+16]; + add ESI, 32; +@@ -1441,9 +2022,8 @@ T[] _arrayExpSliceMinass_i(T[] a, T valu + } + } + } +- else + // MMX version is 81% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -1456,7 +2036,7 @@ T[] _arrayExpSliceMinass_i(T[] a, T valu + movq MM2, l; + + align 4; +- startmmx: ++ startmmx: + movq MM0, [ESI]; + movq MM1, [ESI+8]; + add ESI, 16; +@@ -1471,30 +2051,88 @@ T[] _arrayExpSliceMinass_i(T[] a, T valu + mov aptr, ESI; + } + } +- else +- if (a.length >= 2) ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM1, [RSI+16]; ++ add RSI, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2u; ++ ++ mov aptr, RSI; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startaddsse2a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM1, [RSI+16]; ++ add RSI, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startaddsse2a; ++ ++ mov aptr, RSI; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) + { +- auto n = aptr + (a.length & ~1); ++ auto n = aptr + (a.length & ~3); ++ ++ ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); + + asm + { +- mov ESI, aptr; +- mov EDI, n; +- mov EDX, value; ++ mov RSI, aptr; ++ mov RDI, n; ++ movq MM2, l; + + align 4; +- start386: +- mov EBX, [ESI]; +- mov ECX, [ESI+4]; +- add ESI, 8; +- sub EBX, EDX; +- sub ECX, EDX; +- mov [ESI -8], EBX; +- mov [ESI+4-8], ECX; +- cmp ESI, EDI; +- jb start386; ++ startmmx: ++ movq MM0, [RSI]; ++ movq MM1, [RSI+8]; ++ add RSI, 16; ++ psubd MM0, MM2; ++ psubd MM1, MM2; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; + +- mov aptr, ESI; ++ emms; ++ mov aptr, RSI; + } + } + } +@@ -1518,15 +2156,13 @@ unittest + const int dim = 67; + T[] a = new T[dim + j]; // aligned on 16 byte boundary + a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; + T[] c = new T[dim + j]; + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ c[i] = cast(T)((i-10) * 2); + } + + a[] = c[]; +@@ -1582,7 +2218,7 @@ body + { + auto n = aptr + (a.length & ~7); + +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) + { + asm // unaligned case + { +@@ -1591,7 +2227,7 @@ body + mov ECX, bptr; + + align 4; +- startsse2u: ++ startsse2u: + movdqu XMM0, [ESI]; + movdqu XMM2, [ECX]; + movdqu XMM1, [ESI+16]; +@@ -1618,7 +2254,7 @@ body + mov ECX, bptr; + + align 4; +- startsse2a: ++ startsse2a: + movdqa XMM0, [ESI]; + movdqa XMM2, [ECX]; + movdqa XMM1, [ESI+16]; +@@ -1637,9 +2273,8 @@ body + } + } + } +- else + // MMX version is 441% faster +- if (mmx && a.length >= 4) ++ else if (mmx && a.length >= 4) + { + auto n = aptr + (a.length & ~3); + +@@ -1650,7 +2285,7 @@ body + mov ECX, bptr; + + align 4; +- startmmx: ++ startmmx: + movq MM0, [ESI]; + movq MM2, [ECX]; + movq MM1, [ESI+8]; +@@ -1670,6 +2305,98 @@ body + } + } + } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse2 && a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (((cast(size_t) aptr | cast(size_t) bptr) & 15) != 0) ++ { ++ asm // unaligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse2u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RSI+16]; ++ movdqu XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2u; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ else ++ { ++ asm // aligned case ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse2a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RSI+16]; ++ movdqa XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ psubd XMM0, XMM2; ++ psubd XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse2a; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ } ++ else if (mmx && a.length >= 4) ++ { ++ auto n = aptr + (a.length & ~3); ++ ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startmmx: ++ movq MM0, [RSI]; ++ movq MM2, [RCX]; ++ movq MM1, [RSI+8]; ++ movq MM3, [RCX+8]; ++ add RSI, 16; ++ add RCX, 16; ++ psubd MM0, MM2; ++ psubd MM1, MM3; ++ movq [RSI -16], MM0; ++ movq [RSI+8-16], MM1; ++ cmp RSI, RDI; ++ jb startmmx; ++ ++ emms; ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ } + + while (aptr < aend) + *aptr++ -= *bptr++; +@@ -1696,9 +2423,10 @@ unittest + c = c[j .. dim + j]; + + for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); + } + + b[] = c[]; +@@ -1747,112 +2475,229 @@ body + auto aend = aptr + a.length; + auto bptr = b.ptr; + +- version (none) // multiplying a pair is not supported by MMX +- { + version (D_InlineAsm_X86) + { +- // SSE2 aligned version is 1380% faster +- if (sse2 && a.length >= 8) ++ if (sse41) + { +- auto n = aptr + (a.length & ~7); +- +- uint l = value; +- +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) +- { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- movd XMM2, l; +- pshufd XMM2, XMM2, 0; +- +- align 4; +- startsse2u: +- add ESI, 32; +- movdqu XMM0, [EAX]; +- movdqu XMM1, [EAX+16]; +- add EAX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM2; +- movdqu [ESI -32], XMM0; +- movdqu [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2u; ++ auto aligned = ((cast(size_t) aptr | cast(size_t) bptr) & 15) == 0; + +- mov aptr, ESI; +- mov bptr, EAX; +- } +- } +- else ++ if (a.length >= 8) + { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- movd XMM2, l; +- pshufd XMM2, XMM2, 0; +- +- align 4; +- startsse2a: +- add ESI, 32; +- movdqa XMM0, [EAX]; +- movdqa XMM1, [EAX+16]; +- add EAX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM2; +- movdqa [ESI -32], XMM0; +- movdqa [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2a; ++ auto n = aptr + (a.length & ~7); + +- mov aptr, ESI; +- mov bptr, EAX; ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov EAX, bptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41u: ++ add ESI, 32; ++ movdqu XMM0, [EAX]; ++ movdqu XMM1, [EAX+16]; ++ add EAX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqu [ESI -32], XMM0; ++ movdqu [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41u; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov EAX, bptr; ++ movd XMM1, value; ++ pshufd XMM2, XMM1, 0; ++ ++ align 4; ++ startsse41a: ++ add ESI, 32; ++ movdqa XMM0, [EAX]; ++ movdqa XMM1, [EAX+16]; ++ add EAX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqa [ESI -32], XMM0; ++ movdqa [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41a; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EAX, bptr; ++ movd XMM1,value; ++ pshufd XMM1, XMM1, 0; ++ ++ movdqu XMM0, [EAX]; ++ pmulld XMM0, XMM1; ++ movdqu [ESI], XMM0; ++ ++ add EAX, 16; ++ add ESI, 16; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EAX, bptr; ++ movd XMM1,value; ++ pshufd XMM1, XMM1, 0; ++ ++ movdqa XMM0, [EAX]; ++ pmulld XMM0, XMM1; ++ movdqa [ESI], XMM0; ++ ++ add EAX, 16; ++ add ESI, 16; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ } ++ } ++ } ++ } ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse41) ++ { ++ auto aligned = ((cast(size_t) aptr | cast(size_t) bptr) & 15) == 0; ++ ++ if (a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (!aligned) ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41u: ++ add RSI, 32; ++ movdqu XMM0, [RAX]; ++ movdqu XMM1, [RAX+16]; ++ add RAX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ movd XMM1, value; ++ pshufd XMM2, XMM1, 0; ++ ++ align 4; ++ startsse41a: ++ add RSI, 32; ++ movdqa XMM0, [RAX]; ++ movdqa XMM1, [RAX+16]; ++ add RAX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ {//possibly slow, needs measuring ++ asm ++ { ++ mov RSI, aptr; ++ mov RAX, bptr; ++ movd XMM1, value; ++ pshufd XMM1, XMM1, 0; ++ ++ movdqu XMM0, [RAX]; ++ pmulld XMM0, XMM1; ++ movdqu [RSI], XMM0; ++ ++ add RAX, 16; ++ add RSI, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RAX, bptr; ++ movd XMM1, value; ++ pshufd XMM1, XMM1, 0; ++ ++ movdqa XMM0, [RAX]; ++ pmulld XMM0, XMM1; ++ movdqa [RSI], XMM0; ++ ++ add RAX, 16; ++ add RSI, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ } + } + } + } +- else +- { +- // MMX version is 1380% faster +- if (mmx && a.length >= 4) +- { +- auto n = aptr + (a.length & ~3); ++ } + +- ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); +- +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- movq MM2, l; +- +- align 4; +- startmmx: +- add ESI, 16; +- movq MM0, [EAX]; +- movq MM1, [EAX+8]; +- add EAX, 16; +- pmuludq MM0, MM2; // only multiplies low 32 bits +- pmuludq MM1, MM2; +- movq [ESI -16], MM0; +- movq [ESI+8-16], MM1; +- cmp ESI, EDI; +- jb startmmx; +- +- emms; +- mov aptr, ESI; +- mov bptr, EAX; +- } +- } +- } +- } +- } +- +- while (aptr < aend) +- *aptr++ = *bptr++ * value; ++ while (aptr < aend) ++ *aptr++ = *bptr++ * value; + + return a; + } +@@ -1864,35 +2709,31 @@ unittest + for (cpuid = 0; cpuid < CPUID_MAX; cpuid++) + { + version (log) printf(" cpuid %d\n", cpuid); ++ for (size_t dim = 7; dim < 68; dim += 60) ++ for (int j = 0; j < 2; j++) ++ { ++ T[] b = new T[dim + j]; // aligned on 16 byte boundary ++ b = b[j .. dim + j]; // misalign for second iteration ++ T[] c = new T[dim + j]; ++ c = c[j .. dim + j]; + +- for (int j = 0; j < 2; j++) +- { +- const int dim = 67; +- T[] a = new T[dim + j]; // aligned on 16 byte boundary +- a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; +- T[] c = new T[dim + j]; +- c = c[j .. dim + j]; +- +- for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); +- } +- +- c[] = a[] * 6; ++ for (int i = 0; i < dim; i++) ++ { ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); ++ } + +- for (int i = 0; i < dim; i++) +- { +- //printf("[%d]: %d ?= %d * 6\n", i, c[i], a[i]); +- if (c[i] != cast(T)(a[i] * 6)) ++ c[] = b[] * 6; ++ for (int i = 0; i < dim; i++) + { +- printf("[%d]: %d != %d * 6\n", i, c[i], a[i]); +- assert(0); ++ //printf("[%d]: %d ?= %d * 6\n", i, c[i], b[i]); ++ if (c[i] != cast(T)(b[i] * 6)) ++ { ++ printf("[%d]: %d != %d * 6\n", i, c[i], b[i]); ++ assert(0); ++ } + } + } +- } + } + } + +@@ -1917,10 +2758,9 @@ T[] _arraySliceSliceMulSliceAssign_k(T[] + T[] _arraySliceSliceMulSliceAssign_i(T[] a, T[] c, T[] b) + in + { +- assert(a.length == b.length && b.length == c.length); +- assert(disjoint(a, b)); +- assert(disjoint(a, c)); +- assert(disjoint(b, c)); ++ assert(a.length == b.length && b.length == c.length); ++ assert(disjoint(a, b)); ++ assert(disjoint(a, c)); + } + body + { +@@ -1930,113 +2770,247 @@ body + auto bptr = b.ptr; + auto cptr = c.ptr; + +- version (none) +- { + version (D_InlineAsm_X86) + { +- // SSE2 aligned version is 1407% faster +- if (sse2 && a.length >= 8) ++ if (sse41) + { +- auto n = aptr + (a.length & ~7); ++ auto aligned = ((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) == 0; + +- if (((cast(uint) aptr | cast(uint) bptr | cast(uint) cptr) & 15) != 0) ++ if (a.length >= 8) + { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- mov ECX, cptr; +- +- align 4; +- startsse2u: +- add ESI, 32; +- movdqu XMM0, [EAX]; +- movdqu XMM2, [ECX]; +- movdqu XMM1, [EAX+16]; +- movdqu XMM3, [ECX+16]; +- add EAX, 32; +- add ECX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM3; +- movdqu [ESI -32], XMM0; +- movdqu [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2u; ++ auto n = aptr + (a.length & ~7); + +- mov aptr, ESI; +- mov bptr, EAX; +- mov cptr, ECX; ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov EAX, bptr; ++ mov ECX, cptr; ++ ++ align 4; ++ startsse41u: ++ add ESI, 32; ++ movdqu XMM0, [EAX]; ++ movdqu XMM2, [ECX]; ++ movdqu XMM1, [EAX+16]; ++ movdqu XMM3, [ECX+16]; ++ add EAX, 32; ++ add ECX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqu [ESI -32], XMM0; ++ movdqu [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41u; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ mov cptr, ECX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov EAX, bptr; ++ mov ECX, cptr; ++ ++ align 4; ++ startsse41a: ++ add ESI, 32; ++ movdqa XMM0, [EAX]; ++ movdqa XMM2, [ECX]; ++ movdqa XMM1, [EAX+16]; ++ movdqa XMM3, [ECX+16]; ++ add EAX, 32; ++ add ECX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqa [ESI -32], XMM0; ++ movdqa [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41a; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ mov cptr, ECX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ {//possibly not a good idea. Performance? ++ asm ++ { ++ mov ESI, aptr; ++ mov EAX, bptr; ++ mov ECX, cptr; ++ ++ movdqu XMM0, [EAX]; ++ movdqu XMM1, [ECX]; ++ pmulld XMM0, XMM1; ++ movdqu [ESI], XMM0; ++ ++ add ESI, 16; ++ add EAX, 16; ++ add ECX, 16; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ mov cptr, ECX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EAX, bptr; ++ mov ECX, cptr; ++ ++ movdqa XMM0, [EAX]; ++ movdqa XMM1, [ECX]; ++ pmulld XMM0, XMM1; ++ movdqu [ESI], XMM0; ++ ++ add ESI, 16; ++ add EAX, 16; ++ add ECX, 16; ++ ++ mov aptr, ESI; ++ mov bptr, EAX; ++ mov cptr, ECX; ++ } ++ } ++ } ++ } ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse41) ++ { ++ auto aligned = ((cast(size_t) aptr | cast(size_t) bptr | cast(size_t) cptr) & 15) == 0; ++ ++ if (a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (!aligned) ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse41u: ++ add RSI, 32; ++ movdqu XMM0, [RAX]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RAX+16]; ++ movdqu XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41u; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ align 4; ++ startsse41a: ++ add RSI, 32; ++ movdqa XMM0, [RAX]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RAX+16]; ++ movdqa XMM3, [RCX+16]; ++ add RAX, 32; ++ add RCX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41a; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ {//possibly not a good idea. Performance? ++ asm ++ { ++ mov RSI, aptr; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ movdqu XMM0, [RAX]; ++ movdqu XMM1, [RCX]; ++ pmulld XMM0, XMM1; ++ movdqu [RSI], XMM0; ++ ++ add RSI, 16; ++ add RAX, 16; ++ add RCX, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RAX, bptr; ++ mov RCX, cptr; ++ ++ movdqa XMM0, [RAX]; ++ movdqa XMM1, [RCX]; ++ pmulld XMM0, XMM1; ++ movdqu [RSI], XMM0; ++ ++ add RSI, 16; ++ add RAX, 16; ++ add RCX, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RAX; ++ mov cptr, RCX; ++ } + } + } +- else +- { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- mov ECX, cptr; +- +- align 4; +- startsse2a: +- add ESI, 32; +- movdqa XMM0, [EAX]; +- movdqa XMM2, [ECX]; +- movdqa XMM1, [EAX+16]; +- movdqa XMM3, [ECX+16]; +- add EAX, 32; +- add ECX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM3; +- movdqa [ESI -32], XMM0; +- movdqa [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2a; +- +- mov aptr, ESI; +- mov bptr, EAX; +- mov cptr, ECX; +- } +- } +- } +- else +- // MMX version is 1029% faster +- if (mmx && a.length >= 4) +- { +- auto n = aptr + (a.length & ~3); +- +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov EAX, bptr; +- mov ECX, cptr; +- +- align 4; +- startmmx: +- add ESI, 16; +- movq MM0, [EAX]; +- movq MM2, [ECX]; +- movq MM1, [EAX+8]; +- movq MM3, [ECX+8]; +- add EAX, 16; +- add ECX, 16; +- pmuludq MM0, MM2; +- pmuludq MM1, MM3; +- movq [ESI -16], MM0; +- movq [ESI+8-16], MM1; +- cmp ESI, EDI; +- jb startmmx; +- +- emms; +- mov aptr, ESI; +- mov bptr, EAX; +- mov cptr, ECX; +- } + } + } +- } ++ + + while (aptr < aend) + *aptr++ = *bptr++ * *cptr++; +@@ -2051,31 +3025,33 @@ unittest + for (cpuid = 0; cpuid < CPUID_MAX; cpuid++) + { + version (log) printf(" cpuid %d\n", cpuid); +- +- for (int j = 0; j < 2; j++) ++ for (size_t dim = 7; dim < 68; dim += 60) + { +- const int dim = 67; +- T[] a = new T[dim + j]; // aligned on 16 byte boundary +- a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; +- T[] c = new T[dim + j]; +- c = c[j .. dim + j]; ++ for (int j = 0; j < 2; j++) ++ { ++ T[] a = new T[dim + j]; // aligned on 16 byte boundary ++ a = a[j .. dim + j]; // misalign for second iteration ++ T[] b = new T[dim + j]; ++ b = b[j .. dim + j]; ++ T[] c = new T[dim + j]; ++ c = c[j .. dim + j]; + +- for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); +- } ++ for (int i = 0; i < dim; i++) ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); ++ } + +- c[] = a[] * b[]; ++ c[] = a[] * b[]; + +- for (int i = 0; i < dim; i++) +- { +- if (c[i] != cast(T)(a[i] * b[i])) ++ for (int i = 0; i < dim; i++) + { +- printf("[%d]: %d != %d * %d\n", i, c[i], a[i], b[i]); +- assert(0); ++ if (c[i] != cast(T)(a[i] * b[i])) ++ { ++ printf("[%d]: %d != %d * %d\n", i, c[i], a[i], b[i]); ++ assert(0); ++ } + } + } + } +@@ -2106,98 +3082,198 @@ T[] _arrayExpSliceMulass_i(T[] a, T valu + auto aptr = a.ptr; + auto aend = aptr + a.length; + +- version (none) +- { + version (D_InlineAsm_X86) + { +- // SSE2 aligned version is 400% faster +- if (sse2 && a.length >= 8) ++ if (sse41) + { +- auto n = aptr + (a.length & ~7); +- +- uint l = value; ++ auto aligned = ((cast(size_t) aptr) & 15) == 0; + +- if (((cast(uint) aptr) & 15) != 0) ++ if (a.length >= 8) + { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- movd XMM2, l; +- pshufd XMM2, XMM2, 0; ++ auto n = aptr + (a.length & ~7); + +- align 4; +- startsse2u: +- movdqu XMM0, [ESI]; +- movdqu XMM1, [ESI+16]; +- add ESI, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM2; +- movdqu [ESI -32], XMM0; +- movdqu [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2u; +- +- mov aptr, ESI; +- } +- } +- else +- { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- movd XMM2, l; +- pshufd XMM2, XMM2, 0; +- +- align 4; +- startsse2a: +- movdqa XMM0, [ESI]; +- movdqa XMM1, [ESI+16]; +- add ESI, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM2; +- movdqa [ESI -32], XMM0; +- movdqa [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2a; +- +- mov aptr, ESI; ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ movd XMM2,value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41u: ++ movdqu XMM0, [ESI]; ++ movdqu XMM1, [ESI+16]; ++ add ESI, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqu [ESI -32], XMM0; ++ movdqu [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41u; ++ ++ mov aptr, ESI; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ movd XMM2,value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41a: ++ movdqa XMM0, [ESI]; ++ movdqa XMM1, [ESI+16]; ++ add ESI, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqa [ESI -32], XMM0; ++ movdqa [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41a; ++ ++ mov aptr, ESI; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ movd XMM2,value; ++ pshufd XMM2, XMM2, 0; ++ ++ movdqu XMM0, [ESI]; ++ pmulld XMM0, XMM2; ++ movdqu [ESI], XMM0; ++ ++ add ESI, 16; ++ mov aptr, ESI; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ movd XMM2,value; ++ pshufd XMM2, XMM2, 0; ++ ++ movdqa XMM0, [ESI]; ++ pmulld XMM0, XMM2; ++ movdqa [ESI], XMM0; ++ ++ add ESI, 16; ++ mov aptr, ESI; ++ } ++ } ++ } ++ } ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse41) ++ { ++ auto aligned = ((cast(size_t) aptr) & 15) == 0; ++ ++ if (a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (!aligned) ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM1, [RSI+16]; ++ add RSI, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41u; ++ ++ mov aptr, RSI; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ align 4; ++ startsse41a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM1, [RSI+16]; ++ add RSI, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM2; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41a; ++ ++ mov aptr, RSI; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ { //is the overhead worth it? ++ asm ++ { ++ mov RSI, aptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ movdqu XMM0, [RSI]; ++ pmulld XMM0, XMM2; ++ movdqu [RSI], XMM0; ++ ++ add RSI, 16; ++ mov aptr, RSI; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ movd XMM2, value; ++ pshufd XMM2, XMM2, 0; ++ ++ movdqa XMM0, [RSI]; ++ pmulld XMM0, XMM2; ++ movdqa [RSI], XMM0; ++ ++ add RSI, 16; ++ mov aptr, RSI; ++ } + } + } + } +- else +- // MMX version is 402% faster +- if (mmx && a.length >= 4) +- { +- auto n = aptr + (a.length & ~3); +- +- ulong l = cast(uint) value | (cast(ulong)cast(uint) value << 32); +- +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- movq MM2, l; +- +- align 4; +- startmmx: +- movq MM0, [ESI]; +- movq MM1, [ESI+8]; +- add ESI, 16; +- pmuludq MM0, MM2; +- pmuludq MM1, MM2; +- movq [ESI -16], MM0; +- movq [ESI+8-16], MM1; +- cmp ESI, EDI; +- jb startmmx; +- +- emms; +- mov aptr, ESI; +- } +- } + } +- } + + while (aptr < aend) + *aptr++ *= value; +@@ -2213,31 +3289,31 @@ unittest + { + version (log) printf(" cpuid %d\n", cpuid); + +- for (int j = 0; j < 2; j++) ++ for (size_t dim = 7; dim < 68; dim += 60) + { +- const int dim = 67; +- T[] a = new T[dim + j]; // aligned on 16 byte boundary +- a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; +- T[] c = new T[dim + j]; +- c = c[j .. dim + j]; ++ for (int j = 0; j < 2; j++) ++ { ++ T[] a = new T[dim + j]; // aligned on 16 byte boundary ++ a = a[j .. dim + j]; // misalign for second iteration ++ T[] b = new T[dim + j]; ++ b = b[j .. dim + j]; + +- for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); +- } ++ for (int i = 0; i < dim; i++) ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ } + +- b[] = a[]; +- a[] *= 6; ++ b[] = a[]; ++ a[] *= 6; + +- for (int i = 0; i < dim; i++) +- { +- if (a[i] != cast(T)(b[i] * 6)) ++ for (int i = 0; i < dim; i++) + { +- printf("[%d]: %d != %d * 6\n", i, a[i], b[i]); +- assert(0); ++ if (a[i] != cast(T)(b[i] * 6)) ++ { ++ printf("[%d]: %d != %d * 6\n", i, a[i], b[i]); ++ assert(0); ++ } + } + } + } +@@ -2275,119 +3351,226 @@ body + auto aend = aptr + a.length; + auto bptr = b.ptr; + +- version (none) +- { + version (D_InlineAsm_X86) + { +- // SSE2 aligned version is 873% faster +- if (sse2 && a.length >= 8) ++ if (sse41) + { +- auto n = aptr + (a.length & ~7); ++ auto aligned = ((cast(size_t) aptr) & 15) == 0; + +- if (((cast(uint) aptr | cast(uint) bptr) & 15) != 0) ++ if (a.length >= 8) + { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov ECX, bptr; +- +- align 4; +- startsse2u: +- movdqu XMM0, [ESI]; +- movdqu XMM2, [ECX]; +- movdqu XMM1, [ESI+16]; +- movdqu XMM3, [ECX+16]; +- add ESI, 32; +- add ECX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM3; +- movdqu [ESI -32], XMM0; +- movdqu [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2u; ++ auto n = aptr + (a.length & ~7); + +- mov aptr, ESI; +- mov bptr, ECX; ++ if (!aligned) ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov ECX, bptr; ++ ++ align 4; ++ startsse41u: ++ movdqu XMM0, [ESI]; ++ movdqu XMM2, [ECX]; ++ movdqu XMM1, [ESI+16]; ++ movdqu XMM3, [ECX+16]; ++ add ESI, 32; ++ add ECX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqu [ESI -32], XMM0; ++ movdqu [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41u; ++ ++ mov aptr, ESI; ++ mov bptr, ECX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov EDI, n; ++ mov ECX, bptr; ++ ++ align 4; ++ startsse41a: ++ movdqa XMM0, [ESI]; ++ movdqa XMM2, [ECX]; ++ movdqa XMM1, [ESI+16]; ++ movdqa XMM3, [ECX+16]; ++ add ESI, 32; ++ add ECX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqa [ESI -32], XMM0; ++ movdqa [ESI+16-32], XMM1; ++ cmp ESI, EDI; ++ jb startsse41a; ++ ++ mov aptr, ESI; ++ mov bptr, ECX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ {//is the unaligned overhead worth it ++ asm ++ { ++ mov ESI, aptr; ++ mov ECX, bptr; ++ ++ movdqu XMM0, [ESI]; ++ movdqu XMM2, [ECX]; ++ ++ pmulld XMM0, XMM2; ++ movdqu [ESI], XMM0; ++ ++ add ESI, 16; ++ add ECX, 16; ++ ++ mov aptr, ESI; ++ mov bptr, ECX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov ESI, aptr; ++ mov ECX, bptr; ++ ++ movdqa XMM0, [ESI]; ++ movdqa XMM2, [ECX]; ++ ++ pmulld XMM0, XMM2; ++ movdqa [ESI], XMM0; ++ ++ add ESI, 16; ++ add ECX, 16; ++ ++ mov aptr, ESI; ++ mov bptr, ECX; ++ } ++ } ++ } ++ } ++ } ++ version (D_InlineAsm_X86_64) ++ { ++ if (sse41) ++ { ++ auto aligned = ((cast(size_t) aptr) & 15) == 0; ++ ++ if (a.length >= 8) ++ { ++ auto n = aptr + (a.length & ~7); ++ ++ if (!aligned) ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse41u: ++ movdqu XMM0, [RSI]; ++ movdqu XMM2, [RCX]; ++ movdqu XMM1, [RSI+16]; ++ movdqu XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqu [RSI -32], XMM0; ++ movdqu [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41u; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RDI, n; ++ mov RCX, bptr; ++ ++ align 4; ++ startsse41a: ++ movdqa XMM0, [RSI]; ++ movdqa XMM2, [RCX]; ++ movdqa XMM1, [RSI+16]; ++ movdqa XMM3, [RCX+16]; ++ add RSI, 32; ++ add RCX, 32; ++ pmulld XMM0, XMM2; ++ pmulld XMM1, XMM3; ++ movdqa [RSI -32], XMM0; ++ movdqa [RSI+16-32], XMM1; ++ cmp RSI, RDI; ++ jb startsse41a; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ } ++ else if (a.length >= 4) ++ { ++ if (!aligned) ++ {//is the unaligned overhead worth it ++ asm ++ { ++ mov RSI, aptr; ++ mov RCX, bptr; ++ ++ movdqu XMM0, [RSI]; ++ movdqu XMM2, [RCX]; ++ ++ pmulld XMM0, XMM2; ++ movdqu [RSI], XMM0; ++ ++ add RSI, 16; ++ add RCX, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } ++ } ++ else ++ { ++ asm ++ { ++ mov RSI, aptr; ++ mov RCX, bptr; ++ ++ movdqa XMM0, [RSI]; ++ movdqa XMM2, [RCX]; ++ ++ pmulld XMM0, XMM2; ++ movdqa [RSI], XMM0; ++ ++ add RSI, 16; ++ add RCX, 16; ++ ++ mov aptr, RSI; ++ mov bptr, RCX; ++ } + } + } +- else +- { +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov ECX, bptr; +- +- align 4; +- startsse2a: +- movdqa XMM0, [ESI]; +- movdqa XMM2, [ECX]; +- movdqa XMM1, [ESI+16]; +- movdqa XMM3, [ECX+16]; +- add ESI, 32; +- add ECX, 32; +- pmuludq XMM0, XMM2; +- pmuludq XMM1, XMM3; +- movdqa [ESI -32], XMM0; +- movdqa [ESI+16-32], XMM1; +- cmp ESI, EDI; +- jb startsse2a; +- +- mov aptr, ESI; +- mov bptr, ECX; +- } +- } + } +-/+ BUG: comment out this section until we figure out what is going +- wrong with the invalid pshufd instructions. +- +- else +- // MMX version is 573% faster +- if (mmx && a.length >= 4) +- { +- auto n = aptr + (a.length & ~3); +- +- asm +- { +- mov ESI, aptr; +- mov EDI, n; +- mov ECX, bptr; +- +- align 4; +- startmmx: +- movq MM0, [ESI]; +- movq MM2, [ECX]; +- movq MM1, [ESI+8]; +- movq MM3, [ECX+8]; +- pxor MM4, MM4; +- pxor MM5, MM5; +- punpckldq MM4, MM0; +- punpckldq MM5, MM2; +- add ESI, 16; +- add ECX, 16; +- pmuludq MM4, MM5; +- pshufd MM4, MM4, 8; // ? +- movq [ESI -16], MM4; +- pxor MM4, MM4; +- pxor MM5, MM5; +- punpckldq MM4, MM1; +- punpckldq MM5, MM3; +- pmuludq MM4, MM5; +- pshufd MM4, MM4, 8; // ? +- movq [ESI+8-16], MM4; +- cmp ESI, EDI; +- jb startmmx; +- +- emms; +- mov aptr, ESI; +- mov bptr, ECX; +- } +- } +-+/ + } +- } +- + while (aptr < aend) + *aptr++ *= *bptr++; + +@@ -2402,31 +3585,34 @@ unittest + { + version (log) printf(" cpuid %d\n", cpuid); + +- for (int j = 0; j < 2; j++) ++ for (size_t dim = 7; dim < 68; dim += 60) + { +- const int dim = 67; +- T[] a = new T[dim + j]; // aligned on 16 byte boundary +- a = a[j .. dim + j]; // misalign for second iteration +- T[] b = new T[dim + j]; +- b = b[j .. dim + j]; +- T[] c = new T[dim + j]; +- c = c[j .. dim + j]; ++ for (int j = 0; j < 2; j++) ++ { ++ T[] a = new T[dim + j]; // aligned on 16 byte boundary ++ a = a[j .. dim + j]; // misalign for second iteration ++ T[] b = new T[dim + j]; ++ b = b[j .. dim + j]; ++ T[] c = new T[dim + j]; ++ c = c[j .. dim + j]; + +- for (int i = 0; i < dim; i++) +- { a[i] = cast(T)i; +- b[i] = cast(T)(i + 7); +- c[i] = cast(T)(i * 2); +- } ++ for (int i = 0; i < dim; i++) ++ { ++ a[i] = cast(T)(i-10); ++ b[i] = cast(T)(i-3); ++ c[i] = cast(T)((i-10) * 2); ++ } + +- b[] = a[]; +- a[] *= c[]; ++ b[] = a[]; ++ a[] *= c[]; + +- for (int i = 0; i < dim; i++) +- { +- if (a[i] != cast(T)(b[i] * c[i])) ++ for (int i = 0; i < dim; i++) + { +- printf("[%d]: %d != %d * %d\n", i, a[i], b[i], c[i]); +- assert(0); ++ if (a[i] != cast(T)(b[i] * c[i])) ++ { ++ printf("[%d]: %d != %d * %d\n", i, a[i], b[i], c[i]); ++ assert(0); ++ } + } + } + } +--- a/src/libphobos/libdruntime/rt/arrayreal.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arrayreal.d 2014-04-01 16:32:51.000000000 +0100 +@@ -62,7 +62,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -121,7 +120,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +--- a/src/libphobos/libdruntime/rt/arrayshort.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/arrayshort.d 2014-04-01 16:32:51.000000000 +0100 +@@ -249,7 +249,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -1123,7 +1122,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +@@ -1814,7 +1812,6 @@ in + assert(a.length == b.length && b.length == c.length); + assert(disjoint(a, b)); + assert(disjoint(a, c)); +- assert(disjoint(b, c)); + } + body + { +--- a/src/libphobos/libdruntime/rt/cast_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/cast_.d 2014-04-01 16:32:51.000000000 +0100 +@@ -24,23 +24,22 @@ extern (C): + */ + + Object _d_toObject(void* p) +-{ Object o; ++{ ++ if(!p) ++ return null; + +- if (p) ++ Object o = cast(Object) p; ++ ClassInfo oc = o.classinfo; ++ Interface* pi = **cast(Interface***) p; ++ ++ /* Interface.offset lines up with ClassInfo.name.ptr, ++ * so we rely on pointers never being less than 64K, ++ * and Objects never being greater. ++ */ ++ if(pi.offset < 0x10000) + { +- o = cast(Object)p; +- ClassInfo oc = o.classinfo; +- Interface *pi = **cast(Interface ***)p; +- +- /* Interface.offset lines up with ClassInfo.name.ptr, +- * so we rely on pointers never being less than 64K, +- * and Objects never being greater. +- */ +- if (pi.offset < 0x10000) +- { +- //printf("\tpi.offset = %d\n", pi.offset); +- o = cast(Object)(p - pi.offset); +- } ++ debug(cast_) printf("\tpi.offset = %d\n", pi.offset); ++ return cast(Object)(p - pi.offset); + } + return o; + } +@@ -51,108 +50,102 @@ Object _d_toObject(void* p) + * Returns o if successful, null if not. + */ + +-Object _d_interface_cast(void* p, ClassInfo c) +-{ Object o; ++void* _d_interface_cast(void* p, ClassInfo c) ++{ ++ debug(cast_) printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, c.name); ++ if(!p) ++ return null; + +- //printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, c.name); +- if (p) +- { +- Interface *pi = **cast(Interface ***)p; ++ Interface* pi = **cast(Interface***) p; + +- //printf("\tpi.offset = %d\n", pi.offset); +- o = cast(Object)(p - pi.offset); +- return _d_dynamic_cast(o, c); +- } +- return o; ++ debug(cast_) printf("\tpi.offset = %d\n", pi.offset); ++ return _d_dynamic_cast(cast(Object)(p - pi.offset), c); + } + +-Object _d_dynamic_cast(Object o, ClassInfo c) +-{ ClassInfo oc; +- size_t offset = 0; +- +- //printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name); ++void* _d_dynamic_cast(Object o, ClassInfo c) ++{ ++ debug(cast_) printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name); + +- if (o) ++ void* res = null; ++ size_t offset = 0; ++ if(o && _d_isbaseof2(o.classinfo, c, offset)) + { +- oc = o.classinfo; +- if (_d_isbaseof2(oc, c, offset)) +- { +- //printf("\toffset = %d\n", offset); +- o = cast(Object)(cast(void*)o + offset); +- } +- else +- o = null; ++ debug(cast_) printf("\toffset = %d\n", offset); ++ res = cast(void*) o + offset; + } +- //printf("\tresult = %p\n", o); +- return o; ++ debug(cast_) printf("\tresult = %p\n", res); ++ return res; + } + + int _d_isbaseof2(ClassInfo oc, ClassInfo c, ref size_t offset) + { +- if (oc is c) +- return 1; ++ if(oc is c) ++ return true; ++ + do + { +- if (oc.base is c) +- return 1; +- foreach (i; 0..oc.interfaces.length) ++ if(oc.base is c) ++ return true; ++ ++ foreach(iface; oc.interfaces) + { +- auto ic = oc.interfaces[i].classinfo; +- if (ic is c) +- { offset = oc.interfaces[i].offset; +- return 1; ++ if(iface.classinfo is c) ++ { ++ offset = iface.offset; ++ return true; + } + } +- foreach (i; 0..oc.interfaces.length) ++ ++ foreach(iface; oc.interfaces) + { +- auto ic = oc.interfaces[i].classinfo; +- if (_d_isbaseof2(ic, c, offset)) +- { offset = oc.interfaces[i].offset; +- return 1; ++ if(_d_isbaseof2(iface.classinfo, c, offset)) ++ { ++ offset = iface.offset; ++ return true; + } + } ++ + oc = oc.base; +- } while (oc); +- return 0; ++ } ++ while(oc); ++ ++ return false; + } + + int _d_isbaseof(ClassInfo oc, ClassInfo c) + { +- if (oc is c) +- return 1; ++ if(oc is c) ++ return true; ++ + do + { +- if (oc.base is c) +- return 1; +- foreach (i; 0..oc.interfaces.length) +- { +- auto ic = oc.interfaces[i].classinfo; +- if (ic is c || _d_isbaseof(ic, c)) +- return 1; +- } ++ if(oc.base is c) ++ return true; ++ ++ foreach(iface; oc.interfaces) ++ if(iface.classinfo is c || _d_isbaseof(iface.classinfo, c)) ++ return true; ++ + oc = oc.base; +- } while (oc); +- return 0; ++ } ++ while(oc); ++ ++ return false; + } + + /********************************* + * Find the vtbl[] associated with Interface ic. + */ + +-void *_d_interface_vtbl(ClassInfo ic, Object o) ++void* _d_interface_vtbl(ClassInfo ic, Object o) + { +- //printf("__d_interface_vtbl(o = %p, ic = %p)\n", o, ic); ++ debug(cast_) printf("__d_interface_vtbl(o = %p, ic = %p)\n", o, ic); + + assert(o); + +- auto oc = o.classinfo; +- foreach (i; 0..oc.interfaces.length) +- { +- auto oic = oc.interfaces[i].classinfo; +- if (oic is ic) +- { +- return cast(void *)oc.interfaces[i].vtbl; +- } +- } ++ foreach(iface; o.classinfo.interfaces) ++ if(iface.classinfo is ic) ++ return cast(void*) iface.vtbl; ++ + assert(0); + } +--- a/src/libphobos/libdruntime/rt/critical_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/critical_.d 2014-04-01 16:32:51.000000000 +0100 +@@ -11,234 +11,87 @@ + * (See accompanying file LICENSE or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ ++ ++/* NOTE: This file has been patched from the original DMD distribution to ++ work with the GDC compiler. ++ Modified by Iain Buclaw, December 2013 ++*/ + module rt.critical_; + + private + { + debug(PRINTF) import core.stdc.stdio; + import core.stdc.stdlib; ++ import gcc.gthreads; + +- version( linux ) +- { +- version = USE_PTHREADS; +- } +- else version( FreeBSD ) +- { +- version = USE_PTHREADS; +- } +- else version( OSX ) +- { +- version = USE_PTHREADS; +- } +- else version( Solaris ) +- { +- version = USE_PTHREADS; +- } +- +- version( Windows ) +- { +- import core.sys.windows.windows; +- +- /* We don't initialize critical sections unless we actually need them. +- * So keep a linked list of the ones we do use, and in the static destructor +- * code, walk the list and release them. +- */ +- struct D_CRITICAL_SECTION +- { +- D_CRITICAL_SECTION *next; +- CRITICAL_SECTION cs; +- } +- } +- else version( USE_PTHREADS ) +- { +- import core.sys.posix.pthread; +- +- /* We don't initialize critical sections unless we actually need them. +- * So keep a linked list of the ones we do use, and in the static destructor +- * code, walk the list and release them. +- */ +- struct D_CRITICAL_SECTION +- { +- D_CRITICAL_SECTION *next; +- pthread_mutex_t cs; +- } +- } +- else version( NoSystem ) +- { +- /* Stub declaration. */ +- struct D_CRITICAL_SECTION +- { +- } +- } +- else ++ /* We don't initialize critical sections unless we actually need them. ++ * So keep a linked list of the ones we do use, and in the static destructor ++ * code, walk the list and release them. ++ */ ++ struct critsec_t + { +- static assert(0, "Unsupported platform"); ++ critsec_t *next; ++ gthread_recursive_mutex_t cs; + } + } + ++/****************************************** ++ * Enter/exit critical section. ++ */ + +-/* ================================= Win32 ============================ */ ++static __gshared critsec_t *dcs_list; ++static __gshared critsec_t critical_section; + +-version( Windows ) ++extern (C) void _d_criticalenter(critsec_t *dcs) + { +- /****************************************** +- * Enter/exit critical section. +- */ +- +- static __gshared D_CRITICAL_SECTION *dcs_list; +- static __gshared D_CRITICAL_SECTION critical_section; +- static __gshared int inited; +- +- extern (C) void _d_criticalenter(D_CRITICAL_SECTION *dcs) +- { +- if (!dcs_list) +- { +- _STI_critical_init(); +- atexit(&_STD_critical_term); +- } +- debug(PRINTF) printf("_d_criticalenter(dcs = x%x)\n", dcs); +- if (!dcs.next) +- { +- EnterCriticalSection(&critical_section.cs); +- if (!dcs.next) // if, in the meantime, another thread didn't set it +- { +- dcs.next = dcs_list; +- dcs_list = dcs; +- InitializeCriticalSection(&dcs.cs); +- } +- LeaveCriticalSection(&critical_section.cs); +- } +- EnterCriticalSection(&dcs.cs); +- } +- +- extern (C) void _d_criticalexit(D_CRITICAL_SECTION *dcs) +- { +- debug(PRINTF) printf("_d_criticalexit(dcs = x%x)\n", dcs); +- LeaveCriticalSection(&dcs.cs); +- } +- +- extern (C) void _STI_critical_init() ++ if (!dcs_list) + { +- if (!inited) +- { +- debug(PRINTF) printf("_STI_critical_init()\n"); +- InitializeCriticalSection(&critical_section.cs); +- dcs_list = &critical_section; +- inited = 1; +- } ++ _STI_critical_init(); ++ atexit(&_STD_critical_term); + } +- +- extern (C) void _STD_critical_term() ++ debug(PRINTF) printf("_d_criticalenter(dcs = x%x)\n", dcs); ++ if (!dcs.next) + { +- if (inited) +- { +- debug(PRINTF) printf("_STI_critical_term()\n"); +- while (dcs_list) +- { +- debug(PRINTF) printf("\tlooping... %x\n", dcs_list); +- DeleteCriticalSection(&dcs_list.cs); +- dcs_list = dcs_list.next; +- } +- inited = 0; +- } ++ gthread_recursive_mutex_lock(&critical_section.cs); ++ if (!dcs.next) // if, in the meantime, another thread didn't set it ++ { ++ dcs.next = dcs_list; ++ dcs_list = dcs; ++ gthread_recursive_mutex_init(&dcs.cs); ++ } ++ gthread_recursive_mutex_unlock(&critical_section.cs); + } ++ gthread_recursive_mutex_lock(&dcs.cs); + } + +-/* ================================= linux ============================ */ +- +-version( USE_PTHREADS ) ++extern (C) void _d_criticalexit(critsec_t *dcs) + { +- /****************************************** +- * Enter/exit critical section. +- */ +- +- static __gshared D_CRITICAL_SECTION *dcs_list; +- static __gshared D_CRITICAL_SECTION critical_section; +- static __gshared pthread_mutexattr_t _criticals_attr; +- +- extern (C) void _d_criticalenter(D_CRITICAL_SECTION *dcs) +- { +- if (!dcs_list) +- { +- _STI_critical_init(); +- atexit(&_STD_critical_term); +- } +- debug(PRINTF) printf("_d_criticalenter(dcs = x%x)\n", dcs); +- if (!dcs.next) +- { +- pthread_mutex_lock(&critical_section.cs); +- if (!dcs.next) // if, in the meantime, another thread didn't set it +- { +- dcs.next = dcs_list; +- dcs_list = dcs; +- pthread_mutex_init(&dcs.cs, &_criticals_attr); +- } +- pthread_mutex_unlock(&critical_section.cs); +- } +- pthread_mutex_lock(&dcs.cs); +- } +- +- extern (C) void _d_criticalexit(D_CRITICAL_SECTION *dcs) +- { +- debug(PRINTF) printf("_d_criticalexit(dcs = x%x)\n", dcs); +- pthread_mutex_unlock(&dcs.cs); +- } +- +- extern (C) void _STI_critical_init() +- { +- if (!dcs_list) +- { +- debug(PRINTF) printf("_STI_critical_init()\n"); +- pthread_mutexattr_init(&_criticals_attr); +- pthread_mutexattr_settype(&_criticals_attr, PTHREAD_MUTEX_RECURSIVE); +- +- // The global critical section doesn't need to be recursive +- pthread_mutex_init(&critical_section.cs, null); +- dcs_list = &critical_section; +- } +- } +- +- extern (C) void _STD_critical_term() +- { +- if (dcs_list) +- { +- debug(PRINTF) printf("_STI_critical_term()\n"); +- while (dcs_list) +- { +- debug(PRINTF) printf("\tlooping... %x\n", dcs_list); +- pthread_mutex_destroy(&dcs_list.cs); +- dcs_list = dcs_list.next; +- } +- } +- } ++ debug(PRINTF) printf("_d_criticalexit(dcs = x%x)\n", dcs); ++ gthread_recursive_mutex_unlock(&dcs.cs); + } + +-/* ================================= No System ============================ */ +- +-version( NoSystem ) ++extern (C) void _STI_critical_init() + { +- /****************************************** +- * Enter/exit critical section. +- */ +- +- extern (C) void _d_criticalenter(D_CRITICAL_SECTION *dcs) +- { +- debug(PRINTF) printf("_d_criticalenter(dcs = x%x)\n", dcs); +- } +- +- extern (C) void _d_criticalexit(D_CRITICAL_SECTION *dcs) ++ if (!dcs_list) + { +- debug(PRINTF) printf("_d_criticalexit(dcs = x%x)\n", dcs); +- } +- +- extern (C) void _STI_critical_init() +- { +- debug(PRINTF) printf("_STI_critical_init()\n"); ++ debug(PRINTF) printf("_STI_critical_init()\n"); ++ // The global critical section doesn't need to be recursive ++ gthread_recursive_mutex_init(&critical_section.cs); ++ dcs_list = &critical_section; + } ++} + +- extern (C) void _STD_critical_term() ++extern (C) void _STD_critical_term() ++{ ++ if (dcs_list) + { +- debug(PRINTF) printf("_STI_critical_term()\n"); ++ debug(PRINTF) printf("_STI_critical_term()\n"); ++ while (dcs_list) ++ { ++ debug(PRINTF) printf("\tlooping... %x\n", dcs_list); ++ gthread_recursive_mutex_destroy(&dcs_list.cs); ++ dcs_list = dcs_list.next; ++ } + } +- + } ++ +--- a/src/libphobos/libdruntime/rt/deh.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/deh.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,39 @@ ++/** ++ * Implementation of exception handling support routines. ++ * ++ * Copyright: Copyright Digital Mars 1999 - 2013. ++ * License: Distributed under the ++ * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). ++ * (See accompanying file LICENSE) ++ * Authors: Walter Bright ++ * Source: $(DRUNTIMESRC src/rt/deh.d) ++ */ ++ ++module rt.deh; ++ ++extern (C) ++{ ++ Throwable.TraceInfo _d_traceContext(void* ptr = null); ++ void _d_createTrace(Object o, void* context) ++ { ++ auto t = cast(Throwable) o; ++ ++ if (t !is null && t.info is null && ++ cast(byte*) t !is t.classinfo.init.ptr) ++ { ++ t.info = _d_traceContext(context); ++ } ++ } ++} ++ ++version (GNU) ++ public import gcc.deh; ++else version (Win32) ++ public import rt.deh_win32; ++else version (Win64) ++ public import rt.deh_win64_posix; ++else version (Posix) ++ public import rt.deh_win64_posix; ++else ++ static assert (0, "Unsupported architecture"); ++ +--- a/src/libphobos/libdruntime/rt/dmain2.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/dmain2.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,7 +1,7 @@ + /** +- * Contains main program entry point and support routines. ++ * Contains druntime startup and shutdown routines. + * +- * Copyright: Copyright Digital Mars 2000 - 2012. ++ * Copyright: Copyright Digital Mars 2000 - 2013. + * License: Distributed under the + * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). + * (See accompanying file LICENSE) +@@ -25,6 +25,7 @@ private + import core.stdc.stdlib; + import core.stdc.string; + import core.stdc.stdio; // for printf() ++ import core.stdc.errno : errno; + } + + version (Windows) +@@ -35,6 +36,7 @@ version (Windows) + { + alias int function() FARPROC; + FARPROC GetProcAddress(void*, in char*); ++ void* LoadLibraryA(in char*); + void* LoadLibraryW(in wchar_t*); + int FreeLibrary(void*); + void* LocalFree(void*); +@@ -47,22 +49,6 @@ version (Windows) + pragma(lib, "shell32.lib"); // needed for CommandLineToArgvW + } + +-version (all) +-{ +- extern (C) Throwable.TraceInfo _d_traceContext(void* ptr = null); +- +- extern (C) void _d_createTrace(Object *o) +- { +- auto t = cast(Throwable) o; +- +- if (t !is null && t.info is null && +- cast(byte*) t !is t.classinfo.init.ptr) +- { +- t.info = _d_traceContext(); +- } +- } +-} +- + version (FreeBSD) + { + import core.stdc.fenv; +@@ -79,34 +65,12 @@ extern (C) void rt_moduleTlsCtor(); + extern (C) void rt_moduleDtor(); + extern (C) void rt_moduleTlsDtor(); + extern (C) void thread_joinAll(); +- +-// NOTE: This is to preserve compatibility with old Windows DLLs. +-extern (C) void _moduleCtor() +-{ +- rt_moduleCtor(); +-} +- +-extern (C) void _moduleDtor() +-{ +- rt_moduleDtor(); +-} +- +-extern (C) void _moduleTlsCtor() +-{ +- rt_moduleTlsCtor(); +-} +- +-extern (C) void _moduleTlsDtor() +-{ +- rt_moduleTlsDtor(); +-} ++extern (C) bool runModuleUnitTests(); + + version (OSX) + { + // The bottom of the stack + extern (C) __gshared void* __osx_stack_end = cast(void*)0xC0000000; +- +- extern (C) extern (C) void _d_osx_image_init2(); + } + + /*********************************** +@@ -124,33 +88,28 @@ extern (C) + alias void function() gcClrFn; + } + +-extern (C) void* rt_loadLibrary(in char[] name) ++version (Windows) + { +- version (Windows) ++ /******************************************* ++ * Loads a DLL written in D with the name 'name'. ++ * Returns: ++ * opaque handle to the DLL if successfully loaded ++ * null if failure ++ */ ++ extern (C) void* rt_loadLibrary(const char* name) + { +- if (name.length == 0) return null; +- // Load a DLL at runtime +- enum CP_UTF8 = 65001; +- auto len = MultiByteToWideChar( +- CP_UTF8, 0, name.ptr, cast(int)name.length, null, 0); +- if (len == 0) +- return null; +- +- auto buf = cast(wchar_t*)malloc((len+1) * wchar_t.sizeof); +- if (buf is null) +- return null; +- scope (exit) +- free(buf); +- +- len = MultiByteToWideChar( +- CP_UTF8, 0, name.ptr, cast(int)name.length, buf, len); +- if (len == 0) +- return null; ++ return initLibrary(.LoadLibraryA(name)); ++ } + +- buf[len] = '\0'; ++ extern (C) void* rt_loadLibraryW(const wchar_t* name) ++ { ++ return initLibrary(.LoadLibraryW(name)); ++ } + +- // BUG: LoadLibraryW() call calls rt_init(), which fails if proxy is not set! +- auto mod = LoadLibraryW(buf); ++ void* initLibrary(void* mod) ++ { ++ // BUG: LoadLibrary() call calls rt_init(), which fails if proxy is not set! ++ // (What? LoadLibrary() is a Windows API call, it shouldn't call rt_init().) + if (mod is null) + return mod; + gcSetFn gcSet = cast(gcSetFn) GetProcAddress(mod, "gc_setProxy"); +@@ -159,132 +118,28 @@ extern (C) void* rt_loadLibrary(in char[ + gcSet(gc_getProxy()); + } + return mod; +- + } +- else version (Posix) +- { +- throw new Exception("rt_loadLibrary not yet implemented on Posix."); +- } +-} + +-extern (C) bool rt_unloadLibrary(void* ptr) +-{ +- version (Windows) ++ /************************************* ++ * Unloads DLL that was previously loaded by rt_loadLibrary(). ++ * Input: ++ * ptr the handle returned by rt_loadLibrary() ++ * Returns: ++ * 1 succeeded ++ * 0 some failure happened ++ */ ++ extern (C) int rt_unloadLibrary(void* ptr) + { + gcClrFn gcClr = cast(gcClrFn) GetProcAddress(ptr, "gc_clrProxy"); + if (gcClr !is null) + gcClr(); + return FreeLibrary(ptr) != 0; + } +- else version (Posix) +- { +- throw new Exception("rt_unloadLibrary not yet implemented on Posix."); +- } + } + +-/*********************************** +- * These functions must be defined for any D program linked +- * against this library. +- */ +-extern (C) void onAssertError(string file, size_t line); +-extern (C) void onAssertErrorMsg(string file, size_t line, string msg); +-extern (C) void onUnittestErrorMsg(string file, size_t line, string msg); +-extern (C) void onRangeError(string file, size_t line); +-extern (C) void onHiddenFuncError(Object o); +-extern (C) void onSwitchError(string file, size_t line); +-extern (C) bool runModuleUnitTests(); +- +-// this function is called from the utf module +-//extern (C) void onUnicodeError(string msg, size_t idx); +- +-/*********************************** +- * These are internal callbacks for various language errors. ++/* To get out-of-band access to the args[] passed to main(). + */ + +-extern (C) +-{ +- // Use ModuleInfo to get file name for "m" versions +- +- void _d_assertm(ModuleInfo* m, uint line) +- { +- onAssertError(m.name, line); +- } +- +- void _d_assert_msg(string msg, string file, uint line) +- { +- onAssertErrorMsg(file, line, msg); +- } +- +- void _d_assert(string file, uint line) +- { +- onAssertError(file, line); +- } +- +- void _d_unittestm(ModuleInfo* m, uint line) +- { +- _d_unittest(m.name, line); +- } +- +- void _d_unittest_msg(string msg, string file, uint line) +- { +- onUnittestErrorMsg(file, line, msg); +- } +- +- void _d_unittest(string file, uint line) +- { +- _d_unittest_msg("unittest failure", file, line); +- } +- +- void _d_array_boundsm(ModuleInfo* m, uint line) +- { +- onRangeError(m.name, line); +- } +- +- void _d_array_bounds(string file, uint line) +- { +- onRangeError(file, line); +- } +- +- void _d_switch_errorm(ModuleInfo* m, uint line) +- { +- onSwitchError(m.name, line); +- } +- +- void _d_switch_error(string file, uint line) +- { +- onSwitchError(file, line); +- } +-} +- +-version(GNU) +-{ +- extern (C) void _d_hidden_func(Object o) +- { +- onHiddenFuncError(o); +- } +-} +-else +-{ +- extern (C) void _d_hidden_func() +- { +- Object o; +- version(X86) +- asm +- { +- mov o, EAX; +- } +- else version(X86_64) +- asm +- { +- mov o, RDI; +- } +- else +- static assert(0, "unknown os"); +- +- onHiddenFuncError(o); +- } +-} +- + __gshared string[] _d_args = null; + + extern (C) string[] rt_args() +@@ -296,19 +151,29 @@ extern (C) string[] rt_args() + // be fine to leave it as __gshared. + extern (C) __gshared bool rt_trapExceptions = true; + +-void _d_criticalInit() +-{ +- _STI_monitor_staticctor(); +- _STI_critical_init(); +-} +- + alias void delegate(Throwable) ExceptionHandler; + +-extern (C) bool rt_init(ExceptionHandler dg = null) ++/** ++ * Keep track of how often rt_init/rt_term were called. ++ */ ++shared size_t _initCount; ++ ++/********************************************** ++ * Initialize druntime. ++ * If a C program wishes to call D code, and there's no D main(), then it ++ * must call rt_init() and rt_term(). ++ */ ++extern (C) int rt_init() + { +- version (OSX) +- _d_osx_image_init2(); +- _d_criticalInit(); ++ /* @@BUG 11380 @@ Need to synchronize rt_init/rt_term calls for ++ version (Shared) druntime, because multiple C threads might ++ initialize different D libraries without knowing about the ++ shared druntime. Also we need to attach any thread that calls ++ rt_init. */ ++ if (_initCount++) return 1; ++ ++ _STI_monitor_staticctor(); ++ _STI_critical_init(); + + try + { +@@ -316,48 +181,51 @@ extern (C) bool rt_init(ExceptionHandler + initStaticDataGC(); + rt_moduleCtor(); + rt_moduleTlsCtor(); +- runModuleUnitTests(); +- return true; ++ return 1; + } +- catch (Throwable e) ++ catch (Throwable t) + { +- if (dg) +- dg(e); +- else +- throw e; // rethrow, don't silently ignore error ++ _initCount = 0; ++ printThrowable(t); + } +- _d_criticalTerm(); +- return false; ++ _STD_critical_term(); ++ _STD_monitor_staticdtor(); ++ return 0; + } + +-void _d_criticalTerm() ++/********************************************** ++ * Terminate use of druntime. ++ */ ++extern (C) int rt_term() + { +- _STD_critical_term(); +- _STD_monitor_staticdtor(); +-} ++ if (!_initCount) return 0; // was never initialized ++ if (--_initCount) return 1; + +-extern (C) bool rt_term(ExceptionHandler dg = null) +-{ + try + { + rt_moduleTlsDtor(); + thread_joinAll(); + rt_moduleDtor(); + gc_term(); +- return true; ++ return 1; + } +- catch (Throwable e) ++ catch (Throwable t) + { +- if (dg) +- dg(e); ++ printThrowable(t); + } + finally + { +- _d_criticalTerm(); ++ _STD_critical_term(); ++ _STD_monitor_staticdtor(); + } +- return false; ++ return 0; + } + ++/*********************************** ++ * Provide out-of-band access to the original C argc/argv ++ * passed to this program via main(argc,argv). ++ */ ++ + struct CArgs + { + int argc; +@@ -372,45 +240,18 @@ extern (C) CArgs rt_cArgs() + } + + /*********************************** +- * The D main() function supplied by the user's program +- * +- * It always has `_Dmain` symbol name and uses C calling convention. +- * But DMD frontend returns its type as `extern(D)` because of Issue @@@9028@@@. +- * As we need to deal with actual calling convention we have to mark it +- * as `extern(C)` and use its symbol name. +- */ +-extern(C) int _Dmain(char[][] args); +-alias extern(C) int function(char[][] args) MainFunc; +- +-/*********************************** +- * Substitutes for the C main() function. +- * Just calls into d_run_main with the default main function. +- * Applications are free to implement their own +- * main function and call the _d_run_main function +- * themselves with any main function. +- */ +-extern (C) int main(int argc, char **argv) +-{ +- return _d_run_main(argc, argv, &_Dmain); +-} +- +-version (Solaris) extern (C) int _main(int argc, char** argv) +-{ +- // This is apparently needed on Solaris because the +- // C tool chain seems to expect the main function +- // to be called _main. It needs both not just one! +- return main(argc, argv); +-} +- +-/*********************************** + * Run the given main function. + * Its purpose is to wrap the D main() + * function and catch any unhandled exceptions. + */ ++private alias extern(C) int function(char[][] args) MainFunc; ++ + extern (C) int _d_run_main(int argc, char **argv, MainFunc mainFunc) + { ++ // Remember the original C argc/argv + _cArgs.argc = argc; + _cArgs.argv = argv; ++ + int result; + + version (OSX) +@@ -420,8 +261,6 @@ extern (C) int _d_run_main(int argc, cha + * of the main thread's stack, so save the address of that. + */ + __osx_stack_end = cast(void*)&argv; +- +- _d_osx_image_init2(); + } + + version (FreeBSD) version (D_InlineAsm_X86) +@@ -446,14 +285,32 @@ extern (C) int _d_run_main(int argc, cha + stdin = &fp[0]; + stdout = &fp[1]; + stderr = &fp[2]; +- } + +- _STI_monitor_staticctor(); +- _STI_critical_init(); ++ // ensure that sprintf generates only 2 digit exponent when writing floating point values ++ _set_output_format(_TWO_DIGIT_EXPONENT); ++ ++ // enable full precision for reals ++ asm ++ { ++ push RAX; ++ fstcw word ptr [RSP]; ++ or [RSP], 0b11_00_111111; // 11: use 64 bit extended-precision ++ // 111111: mask all FP exceptions ++ fldcw word ptr [RSP]; ++ pop RAX; ++ } ++ } + ++ // Allocate args[] on the stack + char[][] args = (cast(char[]*) alloca(argc * (char[]).sizeof))[0 .. argc]; ++ + version (Windows) + { ++ /* Because we want args[] to be UTF-8, and Windows doesn't guarantee that, ++ * we ignore argc/argv and go get the Windows command line again as UTF-16. ++ * Then, reparse into wargc/wargs, and then use Windows API to convert ++ * to UTF-8. ++ */ + const wchar_t* wCommandLine = GetCommandLineW(); + immutable size_t wCommandLineLength = wcslen(wCommandLine); + int wargc; +@@ -466,7 +323,7 @@ extern (C) int _d_run_main(int argc, cha + immutable size_t totalArgsLength = WideCharToMultiByte(65001, 0, wCommandLine, cast(int)wCommandLineLength, null, 0, null, null); + { + char* totalArgsBuff = cast(char*) alloca(totalArgsLength); +- int j = 0; ++ size_t j = 0; + foreach (i; 0 .. wargc) + { + immutable size_t wlen = wcslen(wargs[i]); +@@ -496,6 +353,10 @@ extern (C) int _d_run_main(int argc, cha + else + static assert(0); + ++ /* Create a copy of args[] on the stack, and set the global _d_args to refer to it. ++ * Why a copy instead of just using args[] is unclear. ++ * This also means that when this function returns, _d_args will refer to garbage. ++ */ + { + auto buff = cast(char[]*) alloca(argc * (char[]).sizeof + totalArgsLength); + +@@ -519,75 +380,6 @@ extern (C) int _d_run_main(int argc, cha + + void tryExec(scope void delegate() dg) + { +- void printLocLine(Throwable t) +- { +- if (t.file) +- { +- console(t.classinfo.name)("@")(t.file)("(")(t.line)(")"); +- } +- else +- { +- console(t.classinfo.name); +- } +- console("\n"); +- } +- +- void printMsgLine(Throwable t) +- { +- if (t.file) +- { +- console(t.classinfo.name)("@")(t.file)("(")(t.line)(")"); +- } +- else +- { +- console(t.classinfo.name); +- } +- if (t.msg) +- { +- console(": ")(t.msg); +- } +- console("\n"); +- } +- +- void printInfoBlock(Throwable t) +- { +- if (t.info) +- { +- console("----------------\n"); +- foreach (i; t.info) +- console(i)("\n"); +- console("----------------\n"); +- } +- } +- +- void print(Throwable t) +- { +- Throwable firstWithBypass = null; +- +- for (; t; t = t.next) +- { +- printMsgLine(t); +- printInfoBlock(t); +- auto e = cast(Error) t; +- if (e && e.bypassedException) +- { +- console("Bypasses "); +- printLocLine(e.bypassedException); +- if (firstWithBypass is null) +- firstWithBypass = t; +- } +- } +- if (firstWithBypass is null) +- return; +- console("=== Bypassed ===\n"); +- for (t = firstWithBypass; t; t = t.next) +- { +- auto e = cast(Error) t; +- if (e && e.bypassedException) +- print(e.bypassedException); +- } +- } +- + if (trapExceptions) + { + try +@@ -596,7 +388,7 @@ extern (C) int _d_run_main(int argc, cha + } + catch (Throwable t) + { +- print(t); ++ printThrowable(t); + result = EXIT_FAILURE; + } + } +@@ -614,32 +406,97 @@ extern (C) int _d_run_main(int argc, cha + // the user's main function. If main terminates with an exception, + // the exception is handled and then cleanup begins. An exception + // thrown during cleanup, however, will abort the cleanup process. +- +- void runMain() +- { +- result = mainFunc(args); +- } +- + void runAll() + { +- gc_init(); +- initStaticDataGC(); +- rt_moduleCtor(); +- rt_moduleTlsCtor(); +- if (runModuleUnitTests()) +- tryExec(&runMain); ++ if (rt_init() && runModuleUnitTests()) ++ tryExec({ result = mainFunc(args); }); + else + result = EXIT_FAILURE; +- rt_moduleTlsDtor(); +- thread_joinAll(); +- rt_moduleDtor(); +- gc_term(); ++ ++ if (!rt_term()) ++ result = (result == EXIT_SUCCESS) ? EXIT_FAILURE : result; + } + + tryExec(&runAll); + +- _STD_critical_term(); +- _STD_monitor_staticdtor(); ++ // Issue 10344: flush stdout and return nonzero on failure ++ if (.fflush(.stdout) != 0) ++ { ++ .fprintf(.stderr, "Failed to flush stdout: %s\n", .strerror(.errno)); ++ if (result == 0) ++ { ++ result = EXIT_FAILURE; ++ } ++ } + + return result; + } ++ ++private void printThrowable(Throwable t) ++{ ++ static void printLocLine(Throwable t) ++ { ++ if (t.file) ++ { ++ console(t.classinfo.name)("@")(t.file)("(")(t.line)(")"); ++ } ++ else ++ { ++ console(t.classinfo.name); ++ } ++ console("\n"); ++ } ++ ++ static void printMsgLine(Throwable t) ++ { ++ if (t.file) ++ { ++ console(t.classinfo.name)("@")(t.file)("(")(t.line)(")"); ++ } ++ else ++ { ++ console(t.classinfo.name); ++ } ++ if (t.msg) ++ { ++ console(": ")(t.msg); ++ } ++ console("\n"); ++ } ++ ++ static void printInfoBlock(Throwable t) ++ { ++ if (t.info) ++ { ++ console("----------------\n"); ++ foreach (i; t.info) ++ console(i)("\n"); ++ console("----------------\n"); ++ } ++ } ++ ++ Throwable firstWithBypass = null; ++ ++ for (; t; t = t.next) ++ { ++ printMsgLine(t); ++ printInfoBlock(t); ++ auto e = cast(Error) t; ++ if (e && e.bypassedException) ++ { ++ console("Bypasses "); ++ printLocLine(e.bypassedException); ++ if (firstWithBypass is null) ++ firstWithBypass = t; ++ } ++ } ++ if (firstWithBypass is null) ++ return; ++ console("=== Bypassed ===\n"); ++ for (t = firstWithBypass; t; t = t.next) ++ { ++ auto e = cast(Error) t; ++ if (e && e.bypassedException) ++ printThrowable(e.bypassedException); ++ } ++} +--- a/src/libphobos/libdruntime/rt/invariant_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/invariant_.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,36 +0,0 @@ +-/** +- * Implementation of invariant support routines. +- * +- * Copyright: Copyright Digital Mars 2007 - 2010. +- * License: Boost License 1.0. +- * Authors: Walter Bright +- */ +- +-/* Copyright Digital Mars 2007 - 2010. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module rt.invariant_; +- +-/** +- * +- */ +-extern (C) void _d_invariant(Object o) +-{ ClassInfo c; +- +- //printf("__d_invariant(%p)\n", o); +- +- // BUG: needs to be filename/line of caller, not library routine +- assert(o !is null); // just do null check, not invariant check +- +- c = o.classinfo; +- do +- { +- if (c.classInvariant) +- { +- (*c.classInvariant)(o); +- } +- c = c.base; +- } while (c); +-} +--- a/src/libphobos/libdruntime/rt/lifetime.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/lifetime.d 2014-04-01 16:32:51.000000000 +0100 +@@ -17,28 +17,18 @@ + + module rt.lifetime; + +-private +-{ +- import core.stdc.stdlib; +- import core.stdc.string; +- import core.stdc.stdarg; +- import core.bitop; +- debug(PRINTF) import core.stdc.stdio; +- static import rt.tlsgc; +-} ++import core.stdc.stdlib; ++import core.stdc.string; ++import core.stdc.stdarg; ++import core.bitop; ++static import core.memory; ++private alias BlkAttr = core.memory.GC.BlkAttr; ++debug(PRINTF) import core.stdc.stdio; ++static import rt.tlsgc; + + private + { +- enum BlkAttr : uint +- { +- FINALIZE = 0b0000_0001, +- NO_SCAN = 0b0000_0010, +- NO_MOVE = 0b0000_0100, +- APPENDABLE = 0b0000_1000, +- ALL_BITS = 0b1111_1111 +- } +- +- struct BlkInfo ++ package struct BlkInfo + { + void* base; + size_t size; +@@ -103,7 +93,7 @@ extern (C) Object _d_newclass(const Clas + void* p; + + debug(PRINTF) printf("_d_newclass(ci = %p, %s)\n", ci, cast(char *)ci.name); +- if (ci.m_flags & 1) // if COM object ++ if (ci.m_flags & TypeInfo_Class.ClassFlags.isCOMclass) + { /* COM objects are not garbage collected, they are reference counted + * using AddRef() and Release(). They get free'd by C's free() + * function called by Release() when Release()'s reference count goes +@@ -116,15 +106,20 @@ extern (C) Object _d_newclass(const Clas + else + { + // TODO: should this be + 1 to avoid having pointers to the next block? +- p = gc_malloc(ci.init.length, +- BlkAttr.FINALIZE | (ci.m_flags & 2 ? BlkAttr.NO_SCAN : 0)); ++ BlkAttr attr = BlkAttr.FINALIZE; ++ // extern(C++) classes don't have a classinfo pointer in their vtable so the GC can't finalize them ++ if (ci.m_flags & TypeInfo_Class.ClassFlags.isCPPclass) ++ attr &= ~BlkAttr.FINALIZE; ++ if (ci.m_flags & TypeInfo_Class.ClassFlags.noPointers) ++ attr |= BlkAttr.NO_SCAN; ++ p = gc_malloc(ci.init.length, attr); + debug(PRINTF) printf(" p = %p\n", p); + } + + debug(PRINTF) + { + printf("p = %p\n", p); +- printf("ci = %p, ci.init = %p, len = %d\n", ci, ci.init, ci.init.length); ++ printf("ci = %p, ci.init.ptr = %p, len = %llu\n", ci, ci.init.ptr, cast(ulong)ci.init.length); + printf("vptr = %p\n", *cast(void**) ci.init); + printf("vtbl[0] = %p\n", (*cast(void***) ci.init)[0]); + printf("vtbl[1] = %p\n", (*cast(void***) ci.init)[1]); +@@ -340,7 +335,7 @@ bool __setArrayAllocLength(ref BlkInfo i + /** + get the start of the array for the given block + */ +-void *__arrayStart(BlkInfo info) ++void *__arrayStart(BlkInfo info) nothrow pure + { + return info.base + ((info.size & BIGLENGTHMASK) ? LARGEPREFIX : 0); + } +@@ -350,7 +345,7 @@ void *__arrayStart(BlkInfo info) + NOT included in the passed in size. Therefore, do NOT call this function + with the size of an allocated block. + */ +-size_t __arrayPad(size_t size) ++size_t __arrayPad(size_t size) nothrow pure @safe + { + return size > MAXMEDSIZE ? LARGEPAD : (size > MAXSMALLSIZE ? MEDPAD : SMALLPAD); + } +@@ -382,7 +377,7 @@ else + int __nextBlkIdx; + } + +-@property BlkInfo *__blkcache() ++@property BlkInfo *__blkcache() nothrow + { + if(!__blkcache_storage) + { +@@ -444,7 +439,7 @@ void processGCMarks(BlkInfo* cache, scop + the base ptr as an indication of whether the struct is valid, or set + the BlkInfo as a side-effect and return a bool to indicate success. + */ +-BlkInfo *__getBlkInfo(void *interior) ++BlkInfo *__getBlkInfo(void *interior) nothrow + { + BlkInfo *ptr = __blkcache; + version(single_cache) +@@ -468,20 +463,20 @@ BlkInfo *__getBlkInfo(void *interior) + auto curi = ptr + __nextBlkIdx; + for(auto i = curi; i >= ptr; --i) + { +- if(i.base && i.base <= interior && (interior - i.base) < i.size) ++ if(i.base && i.base <= interior && cast(size_t)(interior - i.base) < i.size) + return i; + } + + for(auto i = ptr + N_CACHE_BLOCKS - 1; i > curi; --i) + { +- if(i.base && i.base <= interior && (interior - i.base) < i.size) ++ if(i.base && i.base <= interior && cast(size_t)(interior - i.base) < i.size) + return i; + } + } + return null; // not in cache. + } + +-void __insertBlkInfoCache(BlkInfo bi, BlkInfo *curpos) ++void __insertBlkInfoCache(BlkInfo bi, BlkInfo *curpos) nothrow + { + version(single_cache) + { +@@ -634,6 +629,18 @@ body + jc Loverflow; + } + } ++ else version (D_InlineAsm_X86_64) ++ { ++ size_t reqsize = void; ++ ++ asm ++ { ++ mov RAX, newcapacity; ++ mul RAX, size; ++ mov reqsize, RAX; ++ jc Loverflow; ++ } ++ } + else + { + size_t reqsize = size * newcapacity; +@@ -701,6 +708,8 @@ body + if(u) + { + // extend worked, save the new current allocated size ++ if(bic) ++ bic.size = u; // update cache + curcapacity = u - offset - LARGEPAD; + return curcapacity / size; + } +@@ -2031,7 +2040,7 @@ void* _d_arrayliteralTX(const TypeInfo t + auto sizeelem = ti.next.tsize; // array element size + void* result; + +- //printf("_d_arrayliteralTX(sizeelem = %d, length = %d)\n", sizeelem, length); ++ debug(PRINTF) printf("_d_arrayliteralTX(sizeelem = %d, length = %d)\n", sizeelem, length); + if (length == 0 || sizeelem == 0) + result = null; + else +--- a/src/libphobos/libdruntime/rt/memory.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/memory.d 2014-04-01 16:32:51.000000000 +0100 +@@ -13,11 +13,9 @@ + module rt.memory; + + ++import core.memory; + private + { +- extern (C) void gc_addRange( void* p, size_t sz ); +- extern (C) void gc_removeRange( void* p ); +- + version( MinGW ) + { + extern (C) +@@ -110,19 +108,19 @@ void initStaticDataGC() + { + version( MinGW ) + { +- gc_addRange( &_data_start__, cast(size_t) &_bss_end__ - cast(size_t) &_data_start__ ); ++ GC.addRange( &_data_start__, cast(size_t) &_bss_end__ - cast(size_t) &_data_start__ ); + } + else version( Win32 ) + { +- gc_addRange( &_xi_a, cast(size_t) &_end - cast(size_t) &_xi_a ); ++ GC.addRange( &_xi_a, cast(size_t) &_end - cast(size_t) &_xi_a ); + } + else version( Win64 ) + { +- gc_addRange( &__xc_a, cast(size_t) &_deh_beg - cast(size_t) &__xc_a ); ++ GC.addRange( &__xc_a, cast(size_t) &_deh_beg - cast(size_t) &__xc_a ); + } + else version( linux ) + { +- gc_addRange( &__data_start, cast(size_t) &end - cast(size_t) &__data_start ); ++ GC.addRange( &__data_start, cast(size_t) &end - cast(size_t) &__data_start ); + } + else version( OSX ) + { +@@ -132,17 +130,17 @@ void initStaticDataGC() + { + version (X86_64) + { +- gc_addRange( &etext, cast(size_t) &_deh_end - cast(size_t) &etext ); +- gc_addRange( &__progname, cast(size_t) &_end - cast(size_t) &__progname ); ++ GC.addRange( &etext, cast(size_t) &_deh_end - cast(size_t) &etext ); ++ GC.addRange( &__progname, cast(size_t) &_end - cast(size_t) &__progname ); + } + else + { +- gc_addRange( &etext, cast(size_t) &_end - cast(size_t) &etext ); ++ GC.addRange( &etext, cast(size_t) &_end - cast(size_t) &etext ); + } + } + else version( Solaris ) + { +- gc_addRange(&__dso_handle, cast(size_t)&_end - cast(size_t)&__dso_handle); ++ GC.addRange(&__dso_handle, cast(size_t)&_end - cast(size_t)&__dso_handle); + } + else + { +--- a/src/libphobos/libdruntime/rt/minfo.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/minfo.d 2014-04-01 16:32:51.000000000 +0100 +@@ -2,7 +2,7 @@ + * Written in the D programming language. + * Module initialization routines. + * +- * Copyright: Copyright Digital Mars 2000 - 2012. ++ * Copyright: Copyright Digital Mars 2000 - 2013. + * License: Distributed under the + * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). + * (See accompanying file LICENSE) +@@ -17,9 +17,9 @@ import core.stdc.string; // memcpy + + enum + { +- MIctorstart = 1, // we've started constructing it +- MIctordone = 2, // finished construction +- MIstandalone = 4, // module ctor does not depend on other module ++ MIctorstart = 0x1, // we've started constructing it ++ MIctordone = 0x2, // finished construction ++ MIstandalone = 0x4, // module ctor does not depend on other module + // ctors being done first + MItlsctor = 8, + MItlsdtor = 0x10, +@@ -30,9 +30,16 @@ enum + MIunitTest = 0x200, + MIimportedModules = 0x400, + MIlocalClasses = 0x800, +- MInew = 0x80000000 // it's the "new" layout ++ MIname = 0x1000, + } + ++/***** ++ * A ModuleGroup is an unordered collection of modules. ++ * There is exactly one for: ++ * 1. all statically linked in D modules, either directely or as shared libraries ++ * 2. each call to rt_loadLibrary() ++ */ ++ + struct ModuleGroup + { + this(ModuleInfo*[] modules) +@@ -45,13 +52,152 @@ struct ModuleGroup + return _modules; + } + ++ /****************************** ++ * Allocate and fill in _ctors[] and _tlsctors[]. ++ * Modules are inserted into the arrays in the order in which the constructors ++ * need to be run. ++ * Throws: ++ * Exception if it fails. ++ */ + void sortCtors() + { +- // don't bother to initialize, as they are getting overwritten anyhow +- immutable n = _modules.length; +- _ctors = (cast(ModuleInfo**).malloc(n * size_t.sizeof))[0 .. n]; +- _tlsctors = (cast(ModuleInfo**).malloc(n * size_t.sizeof))[0 .. n]; +- .sortCtors(this); ++ immutable len = _modules.length; ++ if (!len) ++ return; ++ ++ static struct StackRec ++ { ++ @property ModuleInfo* mod() ++ { ++ return _mods[_idx]; ++ } ++ ++ ModuleInfo*[] _mods; ++ size_t _idx; ++ } ++ ++ auto stack = (cast(StackRec*).calloc(len, StackRec.sizeof))[0 .. len]; ++ if (!stack.ptr) ++ assert(0); ++ scope (exit) .free(stack.ptr); ++ ++ void sort(ref ModuleInfo*[] ctors, uint mask) ++ { ++ ctors = (cast(ModuleInfo**).malloc(len * size_t.sizeof))[0 .. len]; ++ if (!ctors.ptr) ++ assert(0); ++ ++ size_t stackidx = 0; ++ size_t cidx; ++ ++ ModuleInfo*[] mods = _modules; ++ size_t idx; ++ while (true) ++ { ++ while (idx < mods.length) ++ { ++ auto m = mods[idx]; ++ auto fl = m.flags; ++ if (fl & MIctorstart) ++ { ++ // trace back to cycle start ++ fl &= ~MIctorstart; ++ size_t start = stackidx; ++ while (start--) ++ { ++ auto sm = stack[start].mod; ++ if (sm == m) ++ break; ++ fl |= sm.flags & MIctorstart; ++ } ++ assert(stack[start].mod == m); ++ if (fl & MIctorstart) ++ { ++ /* This is an illegal cycle, no partial order can be established ++ * because the import chain have contradicting ctor/dtor ++ * constraints. ++ */ ++ string msg = "Aborting: Cycle detected between modules with ctors/dtors:\n"; ++ foreach (e; stack[start .. stackidx]) ++ { ++ msg ~= e.mod.name; ++ msg ~= " -> "; ++ } ++ msg ~= stack[start].mod.name; ++ free(); ++ throw new Exception(msg); ++ } ++ else ++ { ++ /* This is also a cycle, but the import chain does not constrain ++ * the order of initialization, either because the imported ++ * modules have no ctors or the ctors are standalone. ++ */ ++ ++idx; ++ } ++ } ++ else if (fl & MIctordone) ++ { // already visited => skip ++ ++idx; ++ } ++ else ++ { ++ if (fl & mask) ++ { ++ if (fl & MIstandalone || !m.importedModules.length) ++ { // trivial ctor => sort in ++ ctors[cidx++] = m; ++ m.flags = fl | MIctordone; ++ } ++ else ++ { // non-trivial ctor => defer ++ m.flags = fl | MIctorstart; ++ } ++ } ++ else // no ctor => mark as visited ++ m.flags = fl | MIctordone; ++ ++ if (m.importedModules.length) ++ { ++ /* Internal runtime error, dependency on an uninitialized ++ * module outside of the current module group. ++ */ ++ (stackidx < _modules.length) || assert(0); ++ ++ // recurse ++ stack[stackidx++] = StackRec(mods, idx); ++ idx = 0; ++ mods = m.importedModules; ++ } ++ } ++ } ++ ++ if (stackidx) ++ { // pop old value from stack ++ --stackidx; ++ mods = stack[stackidx]._mods; ++ idx = stack[stackidx]._idx; ++ auto m = mods[idx++]; ++ auto fl = m.flags; ++ if (fl & mask && !(fl & MIctordone)) ++ ctors[cidx++] = m; ++ m.flags = (fl & ~MIctorstart) | MIctordone; ++ } ++ else // done ++ break; ++ } ++ // store final number ++ ctors = ctors[0 .. cidx]; ++ ++ // clean flags ++ foreach(m; _modules) ++ m.flags = m.flags & ~(MIctorstart | MIctordone); ++ } ++ ++ /* Do two passes: ctor/dtor, tlsctor/tlsdtor ++ */ ++ sort(_ctors, MIctor | MIdtor); ++ sort(_tlsctors, MItlsctor | MItlsdtor); + } + + void runCtors() +@@ -85,11 +231,13 @@ struct ModuleGroup + + void free() + { +- .free(_ctors.ptr); ++ if (_ctors.ptr) ++ .free(_ctors.ptr); + _ctors = null; +- .free(_tlsctors.ptr); ++ if (_tlsctors.ptr) ++ .free(_tlsctors.ptr); + _tlsctors = null; +- _modules = null; ++ // _modules = null; // let the owner free it + } + + private: +@@ -125,24 +273,26 @@ int moduleinfos_apply(scope int delegate + * Module constructor and destructor routines. + */ + +-extern (C) void rt_moduleCtor() ++extern (C) ++{ ++void rt_moduleCtor() + { + _moduleGroup = ModuleGroup(getModuleInfos()); + _moduleGroup.sortCtors(); + _moduleGroup.runCtors(); + } + +-extern (C) void rt_moduleTlsCtor() ++void rt_moduleTlsCtor() + { + _moduleGroup.runTlsCtors(); + } + +-extern (C) void rt_moduleTlsDtor() ++void rt_moduleTlsDtor() + { + _moduleGroup.runTlsDtors(); + } + +-extern (C) void rt_moduleDtor() ++void rt_moduleDtor() + { + _moduleGroup.runDtors(); + version (Win32) {} else +@@ -150,6 +300,30 @@ extern (C) void rt_moduleDtor() + _moduleGroup.free(); + } + ++version (Win32) ++{ ++ // Alternate names for backwards compatibility with older DLL code ++ void _moduleCtor() ++ { ++ rt_moduleCtor(); ++ } ++ ++ void _moduleDtor() ++ { ++ rt_moduleDtor(); ++ } ++ ++ void _moduleTlsCtor() ++ { ++ rt_moduleTlsCtor(); ++ } ++ ++ void _moduleTlsDtor() ++ { ++ rt_moduleTlsDtor(); ++ } ++} ++ + /******************************************** + * Access compiler generated list of modules. + */ +@@ -298,7 +472,7 @@ body + } + return result; + } +- ++} + + /******************************************** + */ +@@ -321,182 +495,6 @@ void runModuleFuncsRev(alias getfp)(Modu + } + } + +-/******************************************** +- * Check for cycles on module constructors, and establish an order for module +- * constructors. +- */ +- +-void sortCtors(ref ModuleGroup mgroup) +-in +-{ +- assert(mgroup._modules.length == mgroup._ctors.length); +- assert(mgroup._modules.length == mgroup._tlsctors.length); +-} +-body +-{ +- enum AllocaLimit = 100 * 1024; // 100KB +- +- immutable len = mgroup._modules.length; +- immutable size = len * StackRec.sizeof; +- +- if (!len) +- { +- return; +- } +- else if (size <= AllocaLimit) +- { +- auto p = cast(ubyte*).alloca(size); +- p[0 .. size] = 0; +- sortCtorsImpl(mgroup, (cast(StackRec*)p)[0 .. len]); +- } +- else +- { +- auto p = cast(ubyte*).malloc(size); +- p[0 .. size] = 0; +- sortCtorsImpl(mgroup, (cast(StackRec*)p)[0 .. len]); +- .free(p); +- } +-} +- +-private: +- +-struct StackRec +-{ +- @property ModuleInfo* mod() +- { +- return _mods[_idx]; +- } +- +- ModuleInfo*[] _mods; +- size_t _idx; +-} +- +-void onCycleError(StackRec[] stack) +-{ +- string msg = "Aborting: Cycle detected between modules with ctors/dtors:\n"; +- foreach (e; stack) +- { +- msg ~= e.mod.name; +- msg ~= " -> "; +- } +- msg ~= stack[0].mod.name; +- throw new Exception(msg); +-} +- +-private void sortCtorsImpl(ref ModuleGroup mgroup, StackRec[] stack) +-{ +- size_t stackidx; +- bool tlsPass; +- +- Lagain: +- +- const mask = tlsPass ? (MItlsctor | MItlsdtor) : (MIctor | MIdtor); +- auto ctors = tlsPass ? mgroup._tlsctors : mgroup._ctors; +- size_t cidx; +- +- ModuleInfo*[] mods = mgroup._modules; +- size_t idx; +- while (true) +- { +- while (idx < mods.length) +- { +- auto m = mods[idx]; +- auto fl = m.flags; +- if (fl & MIctorstart) +- { +- // trace back to cycle start +- fl &= ~MIctorstart; +- size_t start = stackidx; +- while (start--) +- { +- auto sm = stack[start].mod; +- if (sm == m) +- break; +- fl |= sm.flags & MIctorstart; +- } +- assert(stack[start].mod == m); +- if (fl & MIctorstart) +- { +- /* This is an illegal cycle, no partial order can be established +- * because the import chain have contradicting ctor/dtor +- * constraints. +- */ +- onCycleError(stack[start .. stackidx]); +- } +- else +- { +- /* This is also a cycle, but the import chain does not constrain +- * the order of initialization, either because the imported +- * modules have no ctors or the ctors are standalone. +- */ +- ++idx; +- } +- } +- else if (fl & MIctordone) +- { // already visited => skip +- ++idx; +- } +- else +- { +- if (fl & mask) +- { +- if (fl & MIstandalone || !m.importedModules.length) +- { // trivial ctor => sort in +- ctors[cidx++] = m; +- m.flags = fl | MIctordone; +- } +- else +- { // non-trivial ctor => defer +- m.flags = fl | MIctorstart; +- } +- } +- else // no ctor => mark as visited +- m.flags = fl | MIctordone; +- +- if (m.importedModules.length) +- { +- /* Internal runtime error, dependency on an uninitialized +- * module outside of the current module group. +- */ +- (stackidx < mgroup._modules.length) || assert(0); +- +- // recurse +- stack[stackidx++] = StackRec(mods, idx); +- idx = 0; +- mods = m.importedModules; +- } +- } +- } +- +- if (stackidx) +- { // pop old value from stack +- --stackidx; +- mods = stack[stackidx]._mods; +- idx = stack[stackidx]._idx; +- auto m = mods[idx++]; +- auto fl = m.flags; +- if (fl & mask && !(fl & MIctordone)) +- ctors[cidx++] = m; +- m.flags = (fl & ~MIctorstart) | MIctordone; +- } +- else // done +- break; +- } +- // store final number +- tlsPass ? mgroup._tlsctors : mgroup._ctors = ctors[0 .. cidx]; +- +- // clean flags +- foreach(m; mgroup._modules) +- m.flags = m.flags & ~(MIctorstart | MIctordone); +- +- // rerun for TLS constructors +- if (!tlsPass) +- { +- tlsPass = true; +- goto Lagain; +- } +-} +- + unittest + { + static void assertThrown(T : Throwable, E)(lazy E expr) +@@ -512,38 +510,46 @@ unittest + { + } + +- static ModuleInfo mockMI(uint flags, ModuleInfo*[] imports...) ++ struct UTModuleInfo + { + ModuleInfo mi; +- mi.n.flags |= flags | MInew; +- size_t fcnt; +- auto p = cast(ubyte*)&mi + ModuleInfo.New.sizeof; +- foreach (fl; [MItlsctor, MItlsdtor, MIctor, MIdtor, MIictor]) +- { +- if (flags & fl) +- { +- *cast(void function()*)p = &stub; +- p += (&stub).sizeof; +- } +- } ++ size_t pad[8]; ++ alias mi this; ++ } ++ ++ static UTModuleInfo mockMI(uint flags, ModuleInfo*[] imports...) ++ { ++ import core.bitop; ++ size_t size = ModuleInfo.sizeof; ++ size += popcnt(flags & (MItlsctor|MItlsdtor|MIctor|MIdtor|MIictor)) * (void function()).sizeof; ++ if (imports.length) ++ size += size_t.sizeof + imports.length * (ModuleInfo*).sizeof; ++ assert(size <= UTModuleInfo.sizeof); ++ ++ UTModuleInfo mi; ++ mi._flags = flags; ++ auto p = cast(void function()*)&mi.pad; ++ if (flags & MItlsctor) *p++ = &stub; ++ if (flags & MItlsdtor) *p++ = &stub; ++ if (flags & MIctor) *p++ = &stub; ++ if (flags & MIdtor) *p++ = &stub; ++ if (flags & MIictor) *p++ = &stub; + if (imports.length) + { +- mi.n.flags |= MIimportedModules; +- *cast(size_t*)p = imports.length; +- p += size_t.sizeof; +- immutable nb = imports.length * (ModuleInfo*).sizeof; +- .memcpy(p, imports.ptr, nb); +- p += nb; ++ mi._flags |= MIimportedModules; ++ *cast(size_t*)p++ = imports.length; ++ .memcpy(p, imports.ptr, imports.length * (ModuleInfo*).sizeof); ++ p += imports.length; + } +- assert(p - cast(ubyte*)&mi <= ModuleInfo.sizeof); ++ assert(cast(void*)p <= &mi + 1); + return mi; + } + +- ModuleInfo m0, m1, m2; ++ UTModuleInfo m0, m1, m2; + + void checkExp(ModuleInfo*[] dtors=null, ModuleInfo*[] tlsdtors=null) + { +- auto mgroup = ModuleGroup([&m0, &m1, &m2]); ++ auto mgroup = ModuleGroup([&m0.mi, &m1.mi, &m2.mi]); + mgroup.sortCtors(); + foreach (m; mgroup._modules) + assert(!(m.flags & (MIctorstart | MIctordone))); +@@ -567,68 +573,75 @@ unittest + m0 = mockMI(MIstandalone | MIctor); + m1 = mockMI(0); + m2 = mockMI(0); +- checkExp([&m0]); ++ checkExp([&m0.mi]); + + // imported standalone => no dependency + m0 = mockMI(MIstandalone | MIctor); +- m1 = mockMI(MIstandalone | MIctor, &m0); ++ m1 = mockMI(MIstandalone | MIctor, &m0.mi); + m2 = mockMI(0); +- checkExp([&m0, &m1]); ++ checkExp([&m0.mi, &m1.mi]); + +- m0 = mockMI(MIstandalone | MIctor, &m1); ++ m0 = mockMI(MIstandalone | MIctor, &m1.mi); + m1 = mockMI(MIstandalone | MIctor); + m2 = mockMI(0); +- checkExp([&m0, &m1]); ++ checkExp([&m0.mi, &m1.mi]); + + // standalone may have cycle +- m0 = mockMI(MIstandalone | MIctor, &m1); +- m1 = mockMI(MIstandalone | MIctor, &m0); ++ m0 = mockMI(MIstandalone | MIctor, &m1.mi); ++ m1 = mockMI(MIstandalone | MIctor, &m0.mi); + m2 = mockMI(0); +- checkExp([&m0, &m1]); ++ checkExp([&m0.mi, &m1.mi]); + + // imported ctor => ordered ctors + m0 = mockMI(MIctor); +- m1 = mockMI(MIctor, &m0); ++ m1 = mockMI(MIctor, &m0.mi); + m2 = mockMI(0); +- checkExp([&m0, &m1], []); ++ checkExp([&m0.mi, &m1.mi], []); + +- m0 = mockMI(MIctor, &m1); ++ m0 = mockMI(MIctor, &m1.mi); + m1 = mockMI(MIctor); + m2 = mockMI(0); +- checkExp([&m1, &m0], []); ++ assert(m0.importedModules == [&m1.mi]); ++ checkExp([&m1.mi, &m0.mi], []); + + // detects ctors cycles +- m0 = mockMI(MIctor, &m1); +- m1 = mockMI(MIctor, &m0); ++ m0 = mockMI(MIctor, &m1.mi); ++ m1 = mockMI(MIctor, &m0.mi); + m2 = mockMI(0); + assertThrown!Throwable(checkExp()); + + // imported ctor/tlsctor => ordered ctors/tlsctors +- m0 = mockMI(MIctor, &m1, &m2); ++ m0 = mockMI(MIctor, &m1.mi, &m2.mi); + m1 = mockMI(MIctor); + m2 = mockMI(MItlsctor); +- checkExp([&m1, &m0], [&m2]); ++ checkExp([&m1.mi, &m0.mi], [&m2.mi]); + +- m0 = mockMI(MIctor | MItlsctor, &m1, &m2); ++ m0 = mockMI(MIctor | MItlsctor, &m1.mi, &m2.mi); + m1 = mockMI(MIctor); + m2 = mockMI(MItlsctor); +- checkExp([&m1, &m0], [&m2, &m0]); ++ checkExp([&m1.mi, &m0.mi], [&m2.mi, &m0.mi]); + + // no cycle between ctors/tlsctors +- m0 = mockMI(MIctor, &m1, &m2); ++ m0 = mockMI(MIctor, &m1.mi, &m2.mi); + m1 = mockMI(MIctor); +- m2 = mockMI(MItlsctor, &m0); +- checkExp([&m1, &m0], [&m2]); ++ m2 = mockMI(MItlsctor, &m0.mi); ++ checkExp([&m1.mi, &m0.mi], [&m2.mi]); + + // detects tlsctors cycle +- m0 = mockMI(MItlsctor, &m2); ++ m0 = mockMI(MItlsctor, &m2.mi); + m1 = mockMI(MIctor); +- m2 = mockMI(MItlsctor, &m0); ++ m2 = mockMI(MItlsctor, &m0.mi); + assertThrown!Throwable(checkExp()); + + // closed ctors cycle +- m0 = mockMI(MIctor, &m1); +- m1 = mockMI(MIstandalone | MIctor, &m2); +- m2 = mockMI(MIstandalone | MIctor, &m0); +- checkExp([&m1, &m2, &m0], []); ++ m0 = mockMI(MIctor, &m1.mi); ++ m1 = mockMI(MIstandalone | MIctor, &m2.mi); ++ m2 = mockMI(MIstandalone | MIctor, &m0.mi); ++ checkExp([&m1.mi, &m2.mi, &m0.mi], []); ++} ++ ++version (Win64) ++{ ++ // Dummy so Win32 code can still call it ++ extern(C) void _minit() { } + } +--- a/src/libphobos/libdruntime/rt/monitor_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/monitor_.d 2014-04-01 16:32:51.000000000 +0100 +@@ -11,6 +11,11 @@ + * (See accompanying file LICENSE or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ ++ ++/* NOTE: This file has been patched from the original DMD distribution to ++ work with the GDC compiler. ++ Modified by Iain Buclaw, December 2013 ++*/ + module rt.monitor_; + + //debug=PRINTF; +@@ -19,64 +24,18 @@ private + { + debug(PRINTF) import core.stdc.stdio; + import core.stdc.stdlib; +- +- version( linux ) +- { +- version = USE_PTHREADS; +- } +- else version( FreeBSD ) +- { +- version = USE_PTHREADS; +- } +- else version( OSX ) +- { +- version = USE_PTHREADS; +- } +- else version( Solaris ) +- { +- version = USE_PTHREADS; +- } ++ import gcc.gthreads; + + // This is what the monitor reference in Object points to + alias Object.Monitor IMonitor; + alias void delegate(Object) DEvent; + +- version( Windows ) ++ struct Monitor + { +- import core.sys.windows.windows; +- +- struct Monitor +- { +- IMonitor impl; // for user-level monitors +- DEvent[] devt; // for internal monitors +- size_t refs; // reference count +- CRITICAL_SECTION mon; +- } +- } +- else version( USE_PTHREADS ) +- { +- import core.sys.posix.pthread; +- +- struct Monitor +- { +- IMonitor impl; // for user-level monitors +- DEvent[] devt; // for internal monitors +- size_t refs; // reference count +- pthread_mutex_t mon; +- } +- } +- else version( NoSystem ) +- { +- struct Monitor +- { +- IMonitor impl; // for user-level monitors +- DEvent[] devt; // for internal monitors +- size_t refs; // reference count +- } +- } +- else +- { +- static assert(0, "Unsupported platform"); ++ IMonitor impl; // for user-level monitors ++ DEvent[] devt; // for internal monitors ++ size_t refs; // reference count ++ gthread_recursive_mutex_t mon; + } + + Monitor* getMonitor(Object h) +@@ -93,223 +52,81 @@ private + } + + +-/* =============================== Win32 ============================ */ ++static __gshared gthread_recursive_mutex_t _monitor_critsec; + +-version( Windows ) ++extern (C) void _STI_monitor_staticctor() + { +- static __gshared CRITICAL_SECTION _monitor_critsec; +- +- extern (C) void _STI_monitor_staticctor() ++ debug(PRINTF) printf("+_STI_monitor_staticctor()\n"); ++ if (!inited) + { +- debug(PRINTF) printf("+_STI_monitor_staticctor()\n"); +- if (!inited) +- { +- InitializeCriticalSection(&_monitor_critsec); +- inited = 1; +- } +- debug(PRINTF) printf("-_STI_monitor_staticctor()\n"); +- } +- +- extern (C) void _STD_monitor_staticdtor() +- { +- debug(PRINTF) printf("+_STI_monitor_staticdtor() - d\n"); +- if (inited) +- { +- inited = 0; +- DeleteCriticalSection(&_monitor_critsec); +- } +- debug(PRINTF) printf("-_STI_monitor_staticdtor() - d\n"); +- } +- +- extern (C) void _d_monitor_create(Object h) +- { +- /* +- * NOTE: Assume this is only called when h.__monitor is null prior to the +- * call. However, please note that another thread may call this function +- * at the same time, so we can not assert this here. Instead, try and +- * create a lock, and if one already exists then forget about it. +- */ +- +- debug(PRINTF) printf("+_d_monitor_create(%p)\n", h); +- assert(h); +- Monitor *cs; +- EnterCriticalSection(&_monitor_critsec); +- if (!h.__monitor) +- { +- cs = cast(Monitor *)calloc(Monitor.sizeof, 1); +- assert(cs); +- InitializeCriticalSection(&cs.mon); +- setMonitor(h, cs); +- cs.refs = 1; +- cs = null; +- } +- LeaveCriticalSection(&_monitor_critsec); +- if (cs) +- free(cs); +- debug(PRINTF) printf("-_d_monitor_create(%p)\n", h); +- } +- +- extern (C) void _d_monitor_destroy(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_destroy(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- DeleteCriticalSection(&getMonitor(h).mon); +- free(h.__monitor); +- setMonitor(h, null); +- debug(PRINTF) printf("-_d_monitor_destroy(%p)\n", h); +- } +- +- extern (C) void _d_monitor_lock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_acquire(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- EnterCriticalSection(&getMonitor(h).mon); +- debug(PRINTF) printf("-_d_monitor_acquire(%p)\n", h); +- } +- +- extern (C) void _d_monitor_unlock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_release(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- LeaveCriticalSection(&getMonitor(h).mon); +- debug(PRINTF) printf("-_d_monitor_release(%p)\n", h); ++ gthread_recursive_mutex_init(&_monitor_critsec); ++ inited = 1; + } ++ debug(PRINTF) printf("-_STI_monitor_staticctor()\n"); + } + +-/* =============================== linux ============================ */ +- +-version( USE_PTHREADS ) ++extern (C) void _STD_monitor_staticdtor() + { +- // Includes attribute fixes from David Friedman's GDC port +- static __gshared pthread_mutex_t _monitor_critsec; +- static __gshared pthread_mutexattr_t _monitors_attr; +- +- extern (C) void _STI_monitor_staticctor() ++ debug(PRINTF) printf("+_STI_monitor_staticdtor() - d\n"); ++ if (inited) + { +- if (!inited) +- { +- pthread_mutexattr_init(&_monitors_attr); +- pthread_mutexattr_settype(&_monitors_attr, PTHREAD_MUTEX_RECURSIVE); +- pthread_mutex_init(&_monitor_critsec, &_monitors_attr); +- inited = 1; +- } +- } +- +- extern (C) void _STD_monitor_staticdtor() +- { +- if (inited) +- { +- inited = 0; +- pthread_mutex_destroy(&_monitor_critsec); +- pthread_mutexattr_destroy(&_monitors_attr); +- } +- } +- +- extern (C) void _d_monitor_create(Object h) +- { +- /* +- * NOTE: Assume this is only called when h.__monitor is null prior to the +- * call. However, please note that another thread may call this function +- * at the same time, so we can not assert this here. Instead, try and +- * create a lock, and if one already exists then forget about it. +- */ +- +- debug(PRINTF) printf("+_d_monitor_create(%p)\n", h); +- assert(h); +- Monitor *cs; +- pthread_mutex_lock(&_monitor_critsec); +- if (!h.__monitor) +- { +- cs = cast(Monitor *)calloc(Monitor.sizeof, 1); +- assert(cs); +- pthread_mutex_init(&cs.mon, &_monitors_attr); +- setMonitor(h, cs); +- cs.refs = 1; +- cs = null; +- } +- pthread_mutex_unlock(&_monitor_critsec); +- if (cs) +- free(cs); +- debug(PRINTF) printf("-_d_monitor_create(%p)\n", h); +- } +- +- extern (C) void _d_monitor_destroy(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_destroy(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- pthread_mutex_destroy(&getMonitor(h).mon); +- free(h.__monitor); +- setMonitor(h, null); +- debug(PRINTF) printf("-_d_monitor_destroy(%p)\n", h); +- } +- +- extern (C) void _d_monitor_lock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_acquire(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- pthread_mutex_lock(&getMonitor(h).mon); +- debug(PRINTF) printf("-_d_monitor_acquire(%p)\n", h); +- } +- +- extern (C) void _d_monitor_unlock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_release(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- pthread_mutex_unlock(&getMonitor(h).mon); +- debug(PRINTF) printf("-_d_monitor_release(%p)\n", h); ++ inited = 0; ++ gthread_recursive_mutex_destroy(&_monitor_critsec); + } ++ debug(PRINTF) printf("-_STI_monitor_staticdtor() - d\n"); + } + +-/* ================================= No System ============================ */ +- +-version( NoSystem ) ++extern (C) void _d_monitor_create(Object h) + { +- extern (C) void _STI_monitor_staticctor() +- { +- } +- +- extern (C) void _STD_monitor_staticdtor() +- { +- } +- +- extern (C) void _d_monitor_create(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_create(%p)\n", h); +- assert(h); +- Monitor *cs; +- if (!h.__monitor) +- { +- cs = cast(Monitor *)calloc(Monitor.sizeof, 1); +- assert(cs); +- setMonitor(h, cs); +- cs.refs = 1; +- cs = null; +- } +- if (cs) +- free(cs); +- debug(PRINTF) printf("-_d_monitor_create(%p)\n", h); +- } ++ /* ++ * NOTE: Assume this is only called when h.__monitor is null prior to the ++ * call. However, please note that another thread may call this function ++ * at the same time, so we can not assert this here. Instead, try and ++ * create a lock, and if one already exists then forget about it. ++ */ ++ ++ debug(PRINTF) printf("+_d_monitor_create(%p)\n", h); ++ assert(h); ++ Monitor *cs; ++ gthread_recursive_mutex_lock(&_monitor_critsec); ++ if (!h.__monitor) ++ { ++ cs = cast(Monitor *)calloc(Monitor.sizeof, 1); ++ assert(cs); ++ gthread_recursive_mutex_init(&cs.mon); ++ setMonitor(h, cs); ++ cs.refs = 1; ++ cs = null; ++ } ++ gthread_recursive_mutex_unlock(&_monitor_critsec); ++ if (cs) ++ free(cs); ++ debug(PRINTF) printf("-_d_monitor_create(%p)\n", h); ++} + +- extern (C) void _d_monitor_destroy(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_destroy(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- free(h.__monitor); +- setMonitor(h, null); +- debug(PRINTF) printf("-_d_monitor_destroy(%p)\n", h); +- } ++extern (C) void _d_monitor_destroy(Object h) ++{ ++ debug(PRINTF) printf("+_d_monitor_destroy(%p)\n", h); ++ assert(h && h.__monitor && !getMonitor(h).impl); ++ gthread_recursive_mutex_destroy(&getMonitor(h).mon); ++ free(h.__monitor); ++ setMonitor(h, null); ++ debug(PRINTF) printf("-_d_monitor_destroy(%p)\n", h); ++} + +- extern (C) void _d_monitor_lock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_acquire(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- debug(PRINTF) printf("-_d_monitor_acquire(%p)\n", h); +- } ++extern (C) void _d_monitor_lock(Object h) ++{ ++ debug(PRINTF) printf("+_d_monitor_acquire(%p)\n", h); ++ assert(h && h.__monitor && !getMonitor(h).impl); ++ gthread_recursive_mutex_lock(&getMonitor(h).mon); ++ debug(PRINTF) printf("-_d_monitor_acquire(%p)\n", h); ++} + +- extern (C) void _d_monitor_unlock(Object h) +- { +- debug(PRINTF) printf("+_d_monitor_release(%p)\n", h); +- assert(h && h.__monitor && !getMonitor(h).impl); +- debug(PRINTF) printf("-_d_monitor_release(%p)\n", h); +- } ++extern (C) void _d_monitor_unlock(Object h) ++{ ++ debug(PRINTF) printf("+_d_monitor_release(%p)\n", h); ++ assert(h && h.__monitor && !getMonitor(h).impl); ++ gthread_recursive_mutex_unlock(&getMonitor(h).mon); ++ debug(PRINTF) printf("-_d_monitor_release(%p)\n", h); + } ++ +--- a/src/libphobos/libdruntime/rt/qsort.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/qsort.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,135 +1,86 @@ +-/* +- Portions of this file are: +- Copyright Prototronics, 1987 +- Totem Lake P.O. 8117 +- Kirkland, Washington 98034 +- (206) 820-1972 +- Licensed to Digital Mars. +- +- June 11, 1987 from Ray Gardner's +- Denver, Colorado) public domain version +- +- Use qsort2.d instead of this file if a redistributable version of +- _adSort() is required. +-*/ +- ++/** ++ * This is a public domain version of qsort.d. All it does is call C's ++ * qsort(). ++ * ++ * Copyright: Copyright Digital Mars 2000 - 2010. ++ * License: Boost License 1.0. ++ * Authors: Walter Bright, Martin Nowak ++ */ ++ ++/* Copyright Digital Mars 2000 - 2010. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ + module rt.qsort; + +-/* +-** Sorts an array starting at base, of length nbr_elements, each +-** element of size width_bytes, ordered via compare_function; which +-** is called as (*comp_fp)(ptr_to_element1, ptr_to_element2) +-** and returns < 0 if element1 < element2, 0 if element1 = element2, +-** > 0 if element1 > element2. Most of the refinements are due to +-** R. Sedgewick. See "Implementing Quicksort Programs", Comm. ACM, +-** Oct. 1978, and Corrigendum, Comm. ACM, June 1979. +-*/ +- +-//debug=qsort; // uncomment to turn on debugging printf's +- +-import core.stdc.stdlib; +- +- ++//debug=qsort; + +-private const int _maxspan = 7; // subarrays of _maxspan or fewer elements +- // will be sorted by a simple insertion sort +- +-/* Adjust _maxspan according to relative cost of a swap and a compare. Reduce +-_maxspan (not less than 1) if a swap is very expensive such as when you have +-an array of large structures to be sorted, rather than an array of pointers to +-structures. The default value is optimized for a high cost for compares. */ ++private import core.stdc.stdlib; + ++version (linux) ++{ ++ alias extern (C) int function(const void *, const void *, void *) Cmp; ++ extern (C) void qsort_r(void *base, size_t nmemb, size_t size, Cmp cmp, void *arg); + +-extern (C) void[] _adSort(void[] a, TypeInfo ti) ++ extern (C) void[] _adSort(void[] a, TypeInfo ti) ++ { ++ extern (C) int cmp(in void* p1, in void* p2, void* ti) ++ { ++ return (cast(TypeInfo)ti).compare(p1, p2); ++ } ++ qsort_r(a.ptr, a.length, ti.tsize, &cmp, cast(void*)ti); ++ return a; ++ } ++} ++else version (FreeBSD) + { +- byte*[40] stackbuf = void; // initial stack buffer +- auto stack = stackbuf[0..$]; // stack +- auto sp = stack.ptr; // stack pointer +- +- auto width = ti.tsize; +- auto base = cast(byte *)a.ptr; +- auto thresh = _maxspan * width; // size of _maxspan elements in bytes +- auto limit = base + a.length * width; // pointer past end of array +- while (1) // repeat until done then return +- { +- while (limit - base > thresh) // if more than _maxspan elements ++ alias extern (C) int function(void *, const void *, const void *) Cmp; ++ extern (C) void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, Cmp cmp); ++ ++ extern (C) void[] _adSort(void[] a, TypeInfo ti) + { +- //swap middle, base +- ti.swap((cast(uint)(limit - base) >> 1) - +- (((cast(uint)(limit - base) >> 1)) % width) + base, base); +- +- auto i = base + width; // i scans from left to right +- auto j = limit - width; // j scans from right to left +- +- if (ti.compare(i, j) > 0) // Sedgewick's +- ti.swap(i, j); // three-element sort +- if (ti.compare(base, j) > 0) // sets things up +- ti.swap(base, j); // so that +- if (ti.compare(i, base) > 0) // *i <= *base <= *j +- ti.swap(i, base); // *base is the pivot element +- +- while (1) +- { +- do // move i right until *i >= pivot +- i += width; +- while (ti.compare(i, base) < 0); +- do // move j left until *j <= pivot +- j -= width; +- while (ti.compare(j, base) > 0); +- if (i > j) // break loop if pointers crossed +- break; +- ti.swap(i, j); // else swap elements, keep scanning +- } +- ti.swap(base, j); // move pivot into correct place +- if (j - base > limit - i) // if left subarray is larger... +- { +- sp[0] = base; // stack left subarray base +- sp[1] = j; // and limit +- base = i; // sort the right subarray +- } +- else // else right subarray is larger +- { +- sp[0] = i; // stack right subarray base +- sp[1] = limit; // and limit +- limit = j; // sort the left subarray +- } +- sp += 2; // increment stack pointer +- if (sp == stack.ptr + stack.length) +- { +- // Double the size of stack[] +- auto newstack = cast(byte**)alloca(stack.length * 2 * (*sp).sizeof); +- newstack[0..stack.length] = stack[]; +- sp = &newstack[stack.length]; +- stack = newstack[0..stack.length * 2]; +- } ++ extern (C) int cmp(void* ti, in void* p1, in void* p2) ++ { ++ return (cast(TypeInfo)ti).compare(p1, p2); ++ } ++ qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp); ++ return a; + } ++} ++else version (OSX) ++{ ++ alias extern (C) int function(void *, const void *, const void *) Cmp; ++ extern (C) void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, Cmp cmp); + +- // Insertion sort on remaining subarray +- auto i = base + width; +- while (i < limit) ++ extern (C) void[] _adSort(void[] a, TypeInfo ti) + { +- auto j = i; +- while (j > base && ti.compare(j - width, j) > 0) +- { +- ti.swap(j - width, j); +- j -= width; +- } +- i += width; ++ extern (C) int cmp(void* ti, in void* p1, in void* p2) ++ { ++ return (cast(TypeInfo)ti).compare(p1, p2); ++ } ++ qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp); ++ return a; + } ++} ++else ++{ ++ private TypeInfo tiglobal; + +- if (sp > stack.ptr) // if any entries on stack... ++ extern (C) void[] _adSort(void[] a, TypeInfo ti) + { +- sp -= 2; // pop the base and limit +- base = sp[0]; +- limit = sp[1]; ++ extern (C) int cmp(in void* p1, in void* p2) ++ { ++ return tiglobal.compare(p1, p2); ++ } ++ tiglobal = ti; ++ qsort(a.ptr, a.length, ti.tsize, &cmp); ++ return a; + } +- else // else stack empty, all done +- return *cast(void[]*)(&a); +- } +- assert(0); + } + + ++ + unittest + { + debug(qsort) printf("array.sort.unittest()\n"); +@@ -155,8 +106,4 @@ unittest + //printf(" %d %d\n", a[i], a[i + 1]); + assert(a[i] <= a[i + 1]); + } +- +- auto b = new uint[0xFF_FFFF]; +- b.sort; + } +- +--- a/src/libphobos/libdruntime/rt/switch_.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/switch_.d 2014-04-01 16:32:51.000000000 +0100 +@@ -35,9 +35,7 @@ in + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly +- int j; +- +- for (j = 1; j < table.length; j++) ++ for (size_t j = 1u; j < table.length; j++) + { + auto len1 = table[j - 1].length; + auto len2 = table[j].length; +@@ -54,14 +52,13 @@ in + } + out (result) + { +- int i; + int cj; + + //printf("out _d_switch_string()\n"); + if (result == -1) + { + // Not found +- for (i = 0; i < table.length; i++) ++ for (auto i = 0u; i < table.length; i++) + { + if (table[i].length == ca.length) + { cj = memcmp(table[i].ptr, ca.ptr, ca.length); +@@ -71,8 +68,8 @@ out (result) + } + else + { +- assert(0 <= result && result < table.length); +- for (i = 0; 1; i++) ++ assert(0 <= result && cast(size_t)result < table.length); ++ for (auto i = 0u; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) +@@ -182,9 +179,7 @@ in + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly +- int j; +- +- for (j = 1; j < table.length; j++) ++ for (size_t j = 1u; j < table.length; j++) + { + auto len1 = table[j - 1].length; + auto len2 = table[j].length; +@@ -201,14 +196,13 @@ in + } + out (result) + { +- int i; + int c; + + //printf("out _d_switch_ustring()\n"); + if (result == -1) + { + // Not found +- for (i = 0; i < table.length; i++) ++ for (auto i = 0u; i < table.length; i++) + { + if (table[i].length == ca.length) + { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof); +@@ -218,8 +212,8 @@ out (result) + } + else + { +- assert(0 <= result && result < table.length); +- for (i = 0; 1; i++) ++ assert(0 <= result && cast(size_t)result < table.length); ++ for (auto i = 0u; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) +@@ -315,7 +309,7 @@ in + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly +- for (auto j = 1; j < table.length; j++) ++ for (auto j = 1u; j < table.length; j++) + { + auto len1 = table[j - 1].length; + auto len2 = table[j].length; +@@ -334,7 +328,7 @@ out (result) + if (result == -1) + { + // Not found +- for (auto i = 0; i < table.length; i++) ++ for (auto i = 0u; i < table.length; i++) + { + if (table[i].length == ca.length) + { auto c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); +@@ -344,8 +338,8 @@ out (result) + } + else + { +- assert(0 <= result && result < table.length); +- for (auto i = 0; 1; i++) ++ assert(0 <= result && cast(size_t)result < table.length); ++ for (auto i = 0u; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) +--- a/src/libphobos/libdruntime/rt/tlsgc.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/tlsgc.d 2014-04-01 16:32:51.000000000 +0100 +@@ -30,13 +30,13 @@ struct Data + */ + Data* init() + { +- auto p = cast(Data*).malloc(Data.sizeof); +- *p = Data.init; ++ auto data = cast(Data*).malloc(Data.sizeof); ++ *data = Data.init; + + // do module specific initialization +- p.blockInfoCache = &rt.lifetime.__blkcache_storage; ++ data.blockInfoCache = &rt.lifetime.__blkcache_storage; + +- return p; ++ return data; + } + + /** +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_AC.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_AC.d 2014-04-01 16:32:51.000000000 +0100 +@@ -21,12 +21,7 @@ class TypeInfo_AC : TypeInfo_Array + + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- //pure: +- //nothrow: +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + Object[] s = *cast(Object[]*)p; + size_t hash = 0; +@@ -39,7 +34,7 @@ class TypeInfo_AC : TypeInfo_Array + return hash; + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + Object[] s1 = *cast(Object[]*)p1; + Object[] s2 = *cast(Object[]*)p2; +@@ -62,7 +57,7 @@ class TypeInfo_AC : TypeInfo_Array + return false; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + Object[] s1 = *cast(Object[]*)p1; + Object[] s2 = *cast(Object[]*)p2; +@@ -96,8 +91,8 @@ class TypeInfo_AC : TypeInfo_Array + return c < 0 ? -1 : c > 0 ? 1 : 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(Object); ++ return cast(inout)typeid(Object); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Acdouble.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Acdouble.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Ar : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "cdouble[]"; } + +- override string toString() const pure nothrow @safe { return "cdouble[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + cdouble[] s = *cast(cdouble[]*)p; + return hashOf(s.ptr, s.length * cdouble.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + cdouble[] s1 = *cast(cdouble[]*)p1; + cdouble[] s2 = *cast(cdouble[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Ar : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + cdouble[] s1 = *cast(cdouble[]*)p1; + cdouble[] s2 = *cast(cdouble[]*)p2; +@@ -72,8 +67,8 @@ class TypeInfo_Ar : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(cdouble); ++ return cast(inout)typeid(cdouble); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Acfloat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Acfloat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Aq : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "cfloat[]"; } + +- override string toString() const pure nothrow @safe { return "cfloat[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + cfloat[] s = *cast(cfloat[]*)p; + return hashOf(s.ptr, s.length * cfloat.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + cfloat[] s1 = *cast(cfloat[]*)p1; + cfloat[] s2 = *cast(cfloat[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Aq : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + cfloat[] s1 = *cast(cfloat[]*)p1; + cfloat[] s2 = *cast(cfloat[]*)p2; +@@ -72,8 +67,8 @@ class TypeInfo_Aq : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(cfloat); ++ return cast(inout)typeid(cfloat); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Acreal.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Acreal.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Ac : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "creal[]"; } + +- override string toString() const pure nothrow @safe { return "creal[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + creal[] s = *cast(creal[]*)p; + return hashOf(s.ptr, s.length * creal.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + creal[] s1 = *cast(creal[]*)p1; + creal[] s2 = *cast(creal[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Ac : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + creal[] s1 = *cast(creal[]*)p1; + creal[] s2 = *cast(creal[]*)p2; +@@ -72,8 +67,8 @@ class TypeInfo_Ac : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(creal); ++ return cast(inout)typeid(creal); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Adouble.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Adouble.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Ad : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "double[]"; } + +- override string toString() const pure nothrow @safe { return "double[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + double[] s = *cast(double[]*)p; + return hashOf(s.ptr, s.length * double.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + double[] s1 = *cast(double[]*)p1; + double[] s2 = *cast(double[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Ad : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + double[] s1 = *cast(double[]*)p1; + double[] s2 = *cast(double[]*)p2; +@@ -72,9 +67,9 @@ class TypeInfo_Ad : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(double); ++ return cast(inout)typeid(double); + } + } + +@@ -82,15 +77,10 @@ class TypeInfo_Ad : TypeInfo_Array + + class TypeInfo_Ap : TypeInfo_Ad + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "idouble[]"; } ++ override string toString() const { return "idouble[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(idouble); ++ return cast(inout)typeid(idouble); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Afloat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Afloat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Af : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "float[]"; } + +- override string toString() const pure nothrow @safe { return "float[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + float[] s = *cast(float[]*)p; + return hashOf(s.ptr, s.length * float.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + float[] s1 = *cast(float[]*)p1; + float[] s2 = *cast(float[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Af : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + float[] s1 = *cast(float[]*)p1; + float[] s2 = *cast(float[]*)p2; +@@ -72,9 +67,9 @@ class TypeInfo_Af : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(float); ++ return cast(inout)typeid(float); + } + } + +@@ -82,15 +77,10 @@ class TypeInfo_Af : TypeInfo_Array + + class TypeInfo_Ao : TypeInfo_Af + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "ifloat[]"; } ++ override string toString() const { return "ifloat[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(ifloat); ++ return cast(inout)typeid(ifloat); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Ag.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Ag.d 2014-04-01 16:32:51.000000000 +0100 +@@ -23,20 +23,15 @@ class TypeInfo_Ag : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "byte[]"; } + +- override string toString() const pure nothrow @safe { return "byte[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + byte[] s = *cast(byte[]*)p; + return hashOf(s.ptr, s.length * byte.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + byte[] s1 = *cast(byte[]*)p1; + byte[] s2 = *cast(byte[]*)p2; +@@ -45,7 +40,7 @@ class TypeInfo_Ag : TypeInfo_Array + memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + byte[] s1 = *cast(byte[]*)p1; + byte[] s2 = *cast(byte[]*)p2; +@@ -66,9 +61,9 @@ class TypeInfo_Ag : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(byte); ++ return cast(inout)typeid(byte); + } + } + +@@ -77,14 +72,9 @@ class TypeInfo_Ag : TypeInfo_Array + + class TypeInfo_Ah : TypeInfo_Ag + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "ubyte[]"; } ++ override string toString() const { return "ubyte[]"; } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + char[] s1 = *cast(char[]*)p1; + char[] s2 = *cast(char[]*)p2; +@@ -92,9 +82,9 @@ class TypeInfo_Ah : TypeInfo_Ag + return dstrcmp(s1, s2); + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(ubyte); ++ return cast(inout)typeid(ubyte); + } + } + +@@ -102,16 +92,11 @@ class TypeInfo_Ah : TypeInfo_Ag + + class TypeInfo_Av : TypeInfo_Ah + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "void[]"; } ++ override string toString() const { return "void[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(void); ++ return cast(inout)typeid(void); + } + } + +@@ -119,31 +104,21 @@ class TypeInfo_Av : TypeInfo_Ah + + class TypeInfo_Ab : TypeInfo_Ah + { +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "bool[]"; } + +- override string toString() const pure nothrow @safe { return "bool[]"; } +- +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(bool); ++ return cast(inout)typeid(bool); + } + } + + // char[] + +-class TypeInfo_Aa : TypeInfo_Ag ++class TypeInfo_Aa : TypeInfo_Ah + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "char[]"; } ++ override string toString() const { return "char[]"; } + +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + char[] s = *cast(char[]*)p; + size_t hash = 0; +@@ -193,9 +168,9 @@ else + return hash; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(char); ++ return cast(inout)typeid(char); + } + } + +@@ -203,16 +178,22 @@ else + + class TypeInfo_Aya : TypeInfo_Aa + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "immutable(char)[]"; } ++ override string toString() const { return "immutable(char)[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(immutable(char)); ++ return cast(inout)typeid(immutable(char)); + } + } + ++// const(char)[] ++ ++class TypeInfo_Axa : TypeInfo_Aa ++{ ++ override string toString() const { return "const(char)[]"; } ++ ++ override @property inout(TypeInfo) next() inout ++ { ++ return cast(inout)typeid(const(char)); ++ } ++} +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Aint.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Aint.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Ai : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "int[]"; } + +- override string toString() const pure nothrow @safe { return "int[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + int[] s = *cast(int[]*)p; + return hashOf(s.ptr, s.length * int.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + int[] s1 = *cast(int[]*)p1; + int[] s2 = *cast(int[]*)p2; +@@ -44,7 +39,7 @@ class TypeInfo_Ai : TypeInfo_Array + memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + int[] s1 = *cast(int[]*)p1; + int[] s2 = *cast(int[]*)p2; +@@ -65,9 +60,9 @@ class TypeInfo_Ai : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(int); ++ return cast(inout)typeid(int); + } + } + +@@ -86,14 +81,9 @@ unittest + + class TypeInfo_Ak : TypeInfo_Ai + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "uint[]"; } ++ override string toString() const { return "uint[]"; } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + uint[] s1 = *cast(uint[]*)p1; + uint[] s2 = *cast(uint[]*)p2; +@@ -114,9 +104,9 @@ class TypeInfo_Ak : TypeInfo_Ai + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(uint); ++ return cast(inout)typeid(uint); + } + } + +@@ -124,15 +114,10 @@ class TypeInfo_Ak : TypeInfo_Ai + + class TypeInfo_Aw : TypeInfo_Ak + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "dchar[]"; } ++ override string toString() const { return "dchar[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(dchar); ++ return cast(inout)typeid(dchar); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Along.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Along.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Al : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "long[]"; } + +- override string toString() const pure nothrow @safe { return "long[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + long[] s = *cast(long[]*)p; + return hashOf(s.ptr, s.length * long.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + long[] s1 = *cast(long[]*)p1; + long[] s2 = *cast(long[]*)p2; +@@ -44,7 +39,7 @@ class TypeInfo_Al : TypeInfo_Array + memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + long[] s1 = *cast(long[]*)p1; + long[] s2 = *cast(long[]*)p2; +@@ -66,9 +61,9 @@ class TypeInfo_Al : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(long); ++ return cast(inout)typeid(long); + } + } + +@@ -77,14 +72,9 @@ class TypeInfo_Al : TypeInfo_Array + + class TypeInfo_Am : TypeInfo_Al + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "ulong[]"; } ++ override string toString() const { return "ulong[]"; } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + ulong[] s1 = *cast(ulong[]*)p1; + ulong[] s2 = *cast(ulong[]*)p2; +@@ -106,8 +96,8 @@ class TypeInfo_Am : TypeInfo_Al + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(ulong); ++ return cast(inout)typeid(ulong); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Areal.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Areal.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_Ae : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "real[]"; } + +- override string toString() const pure nothrow @safe { return "real[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + real[] s = *cast(real[]*)p; + return hashOf(s.ptr, s.length * real.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + real[] s1 = *cast(real[]*)p1; + real[] s2 = *cast(real[]*)p2; +@@ -51,7 +46,7 @@ class TypeInfo_Ae : TypeInfo_Array + return true; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + real[] s1 = *cast(real[]*)p1; + real[] s2 = *cast(real[]*)p2; +@@ -72,9 +67,9 @@ class TypeInfo_Ae : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(real); ++ return cast(inout)typeid(real); + } + } + +@@ -82,15 +77,10 @@ class TypeInfo_Ae : TypeInfo_Array + + class TypeInfo_Aj : TypeInfo_Ae + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "ireal[]"; } ++ override string toString() const { return "ireal[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(ireal); ++ return cast(inout)typeid(ireal); + } + } +--- a/src/libphobos/libdruntime/rt/typeinfo/ti_Ashort.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/typeinfo/ti_Ashort.d 2014-04-01 16:32:51.000000000 +0100 +@@ -22,20 +22,15 @@ class TypeInfo_As : TypeInfo_Array + { + override bool opEquals(Object o) { return TypeInfo.opEquals(o); } + +- @trusted: +- const: +- pure: +- nothrow: ++ override string toString() const { return "short[]"; } + +- override string toString() const pure nothrow @safe { return "short[]"; } +- +- override size_t getHash(in void* p) ++ override size_t getHash(in void* p) @trusted const + { + short[] s = *cast(short[]*)p; + return hashOf(s.ptr, s.length * short.sizeof); + } + +- override bool equals(in void* p1, in void* p2) ++ override bool equals(in void* p1, in void* p2) const + { + short[] s1 = *cast(short[]*)p1; + short[] s2 = *cast(short[]*)p2; +@@ -44,7 +39,7 @@ class TypeInfo_As : TypeInfo_Array + memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0; + } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + short[] s1 = *cast(short[]*)p1; + short[] s2 = *cast(short[]*)p2; +@@ -65,9 +60,9 @@ class TypeInfo_As : TypeInfo_Array + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(short); ++ return cast(inout)typeid(short); + } + } + +@@ -76,14 +71,9 @@ class TypeInfo_As : TypeInfo_Array + + class TypeInfo_At : TypeInfo_As + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "ushort[]"; } ++ override string toString() const { return "ushort[]"; } + +- override int compare(in void* p1, in void* p2) ++ override int compare(in void* p1, in void* p2) const + { + ushort[] s1 = *cast(ushort[]*)p1; + ushort[] s2 = *cast(ushort[]*)p2; +@@ -104,9 +94,9 @@ class TypeInfo_At : TypeInfo_As + return 0; + } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(ushort); ++ return cast(inout)typeid(ushort); + } + } + +@@ -114,15 +104,10 @@ class TypeInfo_At : TypeInfo_As + + class TypeInfo_Au : TypeInfo_At + { +- @trusted: +- const: +- pure: +- nothrow: +- +- override string toString() const pure nothrow @safe { return "wchar[]"; } ++ override string toString() const { return "wchar[]"; } + +- override @property const(TypeInfo) next() nothrow pure ++ override @property inout(TypeInfo) next() inout + { +- return typeid(wchar); ++ return cast(inout)typeid(wchar); + } + } +--- a/src/libphobos/libdruntime/rt/util/console.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/util/console.d 2014-04-01 16:32:51.000000000 +0100 +@@ -36,7 +36,7 @@ struct Console + { + DWORD count = void; + assert(val.length <= uint.max, "val length cannot exceed uint.max"); +- WriteFile( GetStdHandle( 0xfffffff5 ), val.ptr, cast(uint)val.length, &count, null ); ++ WriteFile( GetStdHandle( 0xfffffff4 ), val.ptr, cast(uint)val.length, &count, null ); + } + else version( Posix ) + { +--- a/src/libphobos/libdruntime/rt/util/container.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/rt/util/container.d 2014-04-01 16:32:51.000000000 +0100 +@@ -8,16 +8,42 @@ + */ + module rt.util.container; + ++import core.stdc.stdlib : free, malloc, realloc; ++ + private void* xrealloc(void* ptr, size_t sz) + { +- import core.stdc.stdlib, core.exception; ++ import core.exception; + +- if (!sz) return free(ptr), null; +- if (auto nptr = realloc(ptr, sz)) return nptr; +- free(ptr), onOutOfMemoryError(); ++ if (!sz) return .free(ptr), null; ++ if (auto nptr = .realloc(ptr, sz)) return nptr; ++ .free(ptr), onOutOfMemoryError(); + assert(0); + } + ++private void destroy(T)(ref T t) if (is(T == struct)) ++{ ++ object.destroy(t); ++} ++ ++private void destroy(T)(ref T t) if (!is(T == struct)) ++{ ++ t = T.init; ++} ++ ++private void initialize(T)(ref T t) if (is(T == struct)) ++{ ++ import core.stdc.string; ++ if(auto p = typeid(T).init().ptr) ++ memcpy(&t, p, T.sizeof); ++ else ++ memset(&t, 0, T.sizeof); ++} ++ ++private void initialize(T)(ref T t) if (!is(T == struct)) ++{ ++ t = T.init; ++} ++ + struct Array(T) + { + @disable this(this); +@@ -39,13 +65,11 @@ struct Array(T) + + @property void length(size_t nlength) + { +- static if (is(T == struct)) +- if (nlength < length) +- foreach (ref val; _ptr[nlength .. length]) destroy(val); ++ if (nlength < length) ++ foreach (ref val; _ptr[nlength .. length]) destroy(val); + _ptr = cast(T*)xrealloc(_ptr, nlength * T.sizeof); +- static if (is(T == struct)) +- if (nlength > length) +- foreach (ref val; _ptr[length .. nlength]) initialize(val); ++ if (nlength > length) ++ foreach (ref val; _ptr[length .. nlength]) initialize(val); + _length = nlength; + } + +@@ -68,19 +92,19 @@ struct Array(T) + return _ptr[_length - 1]; + } + +- @property ref inout(T) opIndex(size_t idx) inout ++ ref inout(T) opIndex(size_t idx) inout + in { assert(idx < length); } + body + { + return _ptr[idx]; + } + +- @property inout(T)[] opSlice() inout ++ inout(T)[] opSlice() inout + { + return _ptr[0 .. _length]; + } + +- @property inout(T)[] opSlice(size_t a, size_t b) inout ++ inout(T)[] opSlice(size_t a, size_t b) inout + in { assert(a < b && b <= length); } + body + { +@@ -100,19 +124,26 @@ struct Array(T) + length = length - 1; + } + +-private: +- static if (is(T == struct)) ++ void remove(size_t idx) ++ in { assert(idx < length); } ++ body + { +- void initialize(ref T t) +- { +- import core.stdc.string; +- if(auto p = typeid(T).init().ptr) +- memcpy(&t, p, T.sizeof); +- else +- memset(&t, 0, T.sizeof); +- } ++ foreach (i; idx .. length - 1) ++ _ptr[i] = _ptr[i+1]; ++ popBack(); ++ } ++ ++ void swap(ref Array other) ++ { ++ auto ptr = _ptr; ++ _ptr = other._ptr; ++ other._ptr = ptr; ++ immutable len = _length; ++ _length = other._length; ++ other._length = len; + } + ++private: + T* _ptr; + size_t _length; + } +@@ -139,6 +170,10 @@ unittest + foreach (i, val; ary) assert(i == val); + foreach_reverse (i, val; ary) assert(i == val); + ++ ary.insertBack(2); ++ ary.remove(1); ++ assert(ary[] == [0, 2]); ++ + assert(!ary.empty); + ary.reset(); + assert(ary.empty); +@@ -153,18 +188,26 @@ unittest + static assert(!__traits(compiles, ary = ary2)); + static void foo(Array!size_t copy) {} + static assert(!__traits(compiles, foo(ary))); ++ ++ ary2.insertBack(0); ++ assert(ary.empty); ++ assert(ary2[] == [0]); ++ ary.swap(ary2); ++ assert(ary[] == [0]); ++ assert(ary2.empty); + } + +-unittest ++ ++version (unittest) struct RC + { +- static struct RC +- { +- this(size_t* cnt) { ++*(_cnt = cnt); } +- ~this() { if (_cnt) --*_cnt; } +- this(this) { if (_cnt) ++*_cnt; } +- size_t* _cnt; +- } ++ this(size_t* cnt) { ++*(_cnt = cnt); } ++ ~this() { if (_cnt) --*_cnt; } ++ this(this) { if (_cnt) ++*_cnt; } ++ size_t* _cnt; ++} + ++unittest ++{ + Array!RC ary; + + size_t cnt; +@@ -178,3 +221,321 @@ unittest + ary.popBack(); + assert(cnt == 0); + } ++ ++struct HashTab(Key, Value) ++{ ++ static struct Node ++ { ++ Key _key; ++ Value _value; ++ Node* _next; ++ } ++ ++ @disable this(this); ++ ++ ~this() ++ { ++ reset(); ++ } ++ ++ void reset() ++ { ++ foreach (p; _buckets) ++ { ++ while (p !is null) ++ { ++ auto pn = p._next; ++ destroy(*p); ++ .free(p); ++ p = pn; ++ } ++ } ++ _buckets.reset(); ++ _length = 0; ++ } ++ ++ @property size_t length() const ++ { ++ return _length; ++ } ++ ++ @property bool empty() const ++ { ++ return !_length; ++ } ++ ++ void remove(in Key key) ++ in { assert(key in this); } ++ body ++ { ++ ensureNotInOpApply(); ++ ++ immutable hash = hashOf(key) & mask; ++ auto pp = &_buckets[hash]; ++ while (*pp) ++ { ++ auto p = *pp; ++ if (p._key == key) ++ { ++ *pp = p._next; ++ destroy(*p); ++ .free(p); ++ if (--_length < _buckets.length && _length >= 4) ++ shrink(); ++ return; ++ } ++ else ++ { ++ pp = &p._next; ++ } ++ } ++ assert(0); ++ } ++ ++ ref inout(Value) opIndex(Key key) inout ++ { ++ return *opIn_r(key); ++ } ++ ++ void opIndexAssign(Value value, Key key) ++ { ++ *get(key) = value; ++ } ++ ++ inout(Value)* opIn_r(in Key key) inout ++ { ++ if (_buckets.length) ++ { ++ immutable hash = hashOf(key) & mask; ++ for (inout(Node)* p = _buckets[hash]; p !is null; p = p._next) ++ { ++ if (p._key == key) ++ return &p._value; ++ } ++ } ++ return null; ++ } ++ ++ int opApply(scope int delegate(ref Key, ref Value) dg) ++ { ++ immutable save = _inOpApply; ++ _inOpApply = true; ++ scope (exit) _inOpApply = save; ++ foreach (p; _buckets) ++ { ++ while (p !is null) ++ { ++ if (auto res = dg(p._key, p._value)) ++ return res; ++ p = p._next; ++ } ++ } ++ return 0; ++ } ++ ++private: ++ ++ Value* get(Key key) ++ { ++ if (auto p = opIn_r(key)) ++ return p; ++ ++ ensureNotInOpApply(); ++ ++ if (!_buckets.length) ++ _buckets.length = 4; ++ ++ immutable hash = hashOf(key) & mask; ++ auto p = cast(Node*).malloc(Node.sizeof); ++ initialize(*p); ++ p._key = key; ++ p._next = _buckets[hash]; ++ _buckets[hash] = p; ++ if (++_length >= 2 * _buckets.length) ++ grow(); ++ return &p._value; ++ } ++ ++ static hash_t hashOf(in ref Key key) ++ { ++ import rt.util.hash : hashOf; ++ static if (is(Key U : U[])) ++ return hashOf(cast(const ubyte*)key.ptr, key.length * key[0].sizeof); ++ else ++ return hashOf(cast(const ubyte*)&key, Key.sizeof); ++ } ++ ++ @property hash_t mask() const ++ { ++ return _buckets.length - 1; ++ } ++ ++ void grow() ++ in ++ { ++ assert(_buckets.length); ++ } ++ body ++ { ++ immutable ocnt = _buckets.length; ++ immutable nmask = 2 * ocnt - 1; ++ _buckets.length = 2 * ocnt; ++ for (size_t i = 0; i < ocnt; ++i) ++ { ++ auto pp = &_buckets[i]; ++ while (*pp) ++ { ++ auto p = *pp; ++ ++ immutable nidx = hashOf(p._key) & nmask; ++ if (nidx != i) ++ { ++ *pp = p._next; ++ p._next = _buckets[nidx]; ++ _buckets[nidx] = p; ++ } ++ else ++ { ++ pp = &p._next; ++ } ++ } ++ } ++ } ++ ++ void shrink() ++ in ++ { ++ assert(_buckets.length >= 2); ++ } ++ body ++ { ++ immutable ocnt = _buckets.length; ++ immutable ncnt = ocnt >> 1; ++ immutable nmask = ncnt - 1; ++ ++ for (size_t i = ncnt; i < ocnt; ++i) ++ { ++ if (auto tail = _buckets[i]) ++ { ++ immutable nidx = i & nmask; ++ auto pp = &_buckets[nidx]; ++ while (*pp) ++ pp = &(*pp)._next; ++ *pp = tail; ++ _buckets[i] = null; ++ } ++ } ++ _buckets.length = ncnt; ++ } ++ ++ void ensureNotInOpApply() ++ { ++ if (_inOpApply) ++ assert(0, "Invalid HashTab manipulation during opApply iteration."); ++ } ++ ++ Array!(Node*) _buckets; ++ size_t _length; ++ bool _inOpApply; ++} ++ ++unittest ++{ ++ HashTab!(int, int) tab; ++ ++ foreach(i; 0 .. 100) ++ tab[i] = 100 - i; ++ ++ foreach(i; 0 .. 100) ++ assert(tab[i] == 100 - i); ++ ++ foreach (k, v; tab) ++ assert(v == 100 - k); ++ ++ foreach(i; 0 .. 50) ++ tab.remove(2 * i); ++ ++ assert(tab.length == 50); ++ ++ foreach(i; 0 .. 50) ++ assert(tab[2 * i + 1] == 100 - 2 * i - 1); ++ ++ assert(tab.length == 50); ++ ++ tab.reset(); ++ assert(tab.empty); ++ tab[0] = 0; ++ assert(!tab.empty); ++ destroy(tab); ++ assert(tab.empty); ++ ++ // not copyable ++ static assert(!__traits(compiles, { HashTab!(int, int) tab2 = tab; })); ++ HashTab!(int, int) tab2; ++ static assert(!__traits(compiles, tab = tab2)); ++ static void foo(HashTab!(int, int) copy) {} ++ static assert(!__traits(compiles, foo(tab))); ++} ++ ++unittest ++{ ++ HashTab!(string, size_t) tab; ++ ++ tab["foo"] = 0; ++ assert(tab["foo"] == 0); ++ ++tab["foo"]; ++ assert(tab["foo"] == 1); ++ tab["foo"]++; ++ assert(tab["foo"] == 2); ++ ++ auto s = "fo"; ++ s ~= "o"; ++ assert(tab[s] == 2); ++ assert(tab.length == 1); ++ tab[s] -= 2; ++ assert(tab[s] == 0); ++ tab["foo"] = 12; ++ assert(tab[s] == 12); ++ ++ tab.remove("foo"); ++ assert(tab.empty); ++} ++ ++unittest ++{ ++ HashTab!(size_t, RC) tab; ++ ++ size_t cnt; ++ assert(cnt == 0); ++ tab[0] = RC(&cnt); ++ assert(cnt == 1); ++ tab[1] = tab[0]; ++ assert(cnt == 2); ++ tab.remove(0); ++ assert(cnt == 1); ++ tab.remove(1); ++ assert(cnt == 0); ++} ++ ++unittest ++{ ++ import core.exception; ++ ++ HashTab!(uint, uint) tab; ++ foreach (i; 0 .. 5) ++ tab[i] = i; ++ bool thrown; ++ foreach (k, v; tab) ++ { ++ try ++ { ++ if (k == 3) tab.remove(k); ++ } ++ catch (AssertError e) ++ { ++ thrown = true; ++ } ++ } ++ assert(thrown); ++ assert(tab[3] == 3); ++} +--- a/src/libphobos/libdruntime/unittest.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/libdruntime/unittest.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,38 +1,52 @@ +-// Written in the D programming language. +- + /** +- * This test program pulls in all the library modules in order to run the unit +- * tests on them. ++ * Unit tests for the D runtime. ++ * ++ * Copyright: Copyright Sean Kelly 2005 - 2010. ++ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) ++ * Authors: Sean Kelly + */ + +-public import core.sys.posix.sys.select; +-public import core.demangle; +-public import core.time; ++/* Copyright Sean Kelly 2005 - 2010. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++public import core.atomic; + public import core.bitop; +-public import core.thread; ++public import core.cpuid; ++public import core.demangle; + public import core.exception; +-public import core.math; +-public import etc.linux.memoryerror; +-public import gc.gcbits; +-public import rt.adi; +-public import rt.arrayshort; +-public import rt.arrayfloat; +-public import rt.arrayint; +-public import rt.typeinfo.ti_Aint; +-public import rt.switch_; +-public import rt.arrayreal; +-public import rt.arraybyte; +-public import rt.aaA; +-public import rt.qsort; +-public import rt.lifetime; +-public import rt.minfo; +-public import rt.arraydouble; +-public import rt.util.hash; +-public import rt.util.container; +-public import rt.util.utf; +-public import rt.aApplyR; +-public import rt.arraycast; ++public import core.memory; ++public import core.runtime; ++public import core.thread; ++public import core.vararg; ++ ++public import core.sync.condition; ++public import core.sync.mutex; ++public import core.sync.rwmutex; ++public import core.sync.semaphore; ++ ++version(Posix) ++ public import core.sys.posix.sys.select; + + void main() + { ++ // Bring in unit test for module by referencing a function in it ++ shared(int) i; ++ cas( &i, 0, 1 ); // atomic ++ auto b = bsf( 0 ); // bitop ++ mmx; // cpuid ++ demangle( "" ); // demangle ++ setAssertHandler( null ); // exception ++ // SES - disabled because you cannot enable the GC without disabling it. ++ //GC.enable(); // memory ++ Runtime.collectHandler = null; // runtime ++ static void fn() {} ++ new Thread( &fn ); // thread ++ //va_end( null ); // vararg ++ ++ auto m = new Mutex; // mutex ++ auto c = new Condition( m ); // condition ++ auto r = new ReadWriteMutex; // rwmutex ++ auto s = new Semaphore; // semaphore + } +--- a/src/libphobos/Makefile.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/Makefile.in 2014-04-01 16:32:51.000000000 +0100 +@@ -56,17 +56,18 @@ DIST_COMMON = $(am__configure_deps) $(sr + $(srcdir)/../config.sub $(srcdir)/../install-sh \ + $(srcdir)/../missing $(srcdir)/../mkinstalldirs \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ +- $(srcdir)/config.h.in $(top_srcdir)/configure ++ $(srcdir)/config.h.in $(top_srcdir)/configure \ ++ $(top_srcdir)/libdruntime/gcc/libbacktrace.d.in + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ +- $(top_srcdir)/configure.in ++ $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno + mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs + CONFIG_HEADER = config.h +-CONFIG_CLEAN_FILES = ++CONFIG_CLEAN_FILES = libdruntime/gcc/libbacktrace.d + CONFIG_CLEAN_VPATH_FILES = + depcomp = + am__depfiles_maybe = +@@ -145,6 +146,9 @@ AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@ ++BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@ ++BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@ + BUILD_LIBIBERTY = @BUILD_LIBIBERTY@ + CC = @CC@ + CC_FOR_BUILD = @CC_FOR_BUILD@ +@@ -160,7 +164,7 @@ DCFG_CBRIDGE_STDIO = @DCFG_CBRIDGE_STDIO + DCFG_GETPWNAM_R = @DCFG_GETPWNAM_R@ + DCFG_MMAP = @DCFG_MMAP@ + DCFG_POSIX = @DCFG_POSIX@ +-DCFG_SEMAPHORE_IMPL = @DCFG_SEMAPHORE_IMPL@ ++DCFG_THREAD_MODEL = @DCFG_THREAD_MODEL@ + DCFG_UNIX = @DCFG_UNIX@ + DEFS = @DEFS@ + DFLAGS = @DFLAGS@ +@@ -175,12 +179,14 @@ EGREP = @EGREP@ + EXEEXT = @EXEEXT@ + GDC = @GDC@ + GREP = @GREP@ ++HAVE_DLADDR = @HAVE_DLADDR@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LIBBACKTRACE_LIB = @LIBBACKTRACE_LIB@ + LIBIBERTY_H_PATH = @LIBIBERTY_H_PATH@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ +@@ -361,6 +367,8 @@ $(srcdir)/config.h.in: $(am__configure_ + + distclean-hdr: + -rm -f config.h stamp-h1 ++libdruntime/gcc/libbacktrace.d: $(top_builddir)/config.status $(top_srcdir)/libdruntime/gcc/libbacktrace.d.in ++ cd $(top_builddir) && $(SHELL) ./config.status $@ + + # GNU Make needs to see an explicit $(MAKE) variable in the command it + # runs to enable its job server during parallel builds. Hence the +--- a/src/libphobos/src/index.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/index.d 2014-04-01 16:32:51.000000000 +0100 +@@ -121,32 +121,32 @@ D language compiler. Also, check out the + +
+ ++
std.ascii ++
Functions that operate on ASCII characters. ++ +
std.base64 +
Encode/decode base64 format. + +
std.bigint +
Arbitrary-precision ('bignum') arithmetic + +-
std.bind +-
Bind function arguments. +- ++$(V1 +
std.bitarray +
Arrays of bits. + +
std.boxer +
Box/unbox types. +- ++) +
std.compiler +
Information about the D compiler implementation. + +
std.conv +
Conversion of strings to integers. + +-
std.ctype +-
Simple character classification +- ++$(V1 +
std.date +
Date and time functions. Support locales. ++) + +
std.datetime +
Date and time-related types and functions. +@@ -157,9 +157,10 @@ D language compiler. Also, check out the +
std.format +
Formatted conversions of values to strings. + ++$(V1 +
std.gc +
Control the garbage collector. +- ++) +
std.math +
Include all the usual math functions like sin, cos, atan, etc. + +@@ -184,11 +185,12 @@ D language compiler. Also, check out the +
std.random +
Random number generation. + ++$(V1 +
std.recls +
Recursively search file system and (currently Windows + only) FTP sites. +- +-
std.regexp ++) ++
std.regex +
The usual regular expression functions. + +
std.socket +@@ -218,6 +220,9 @@ D language compiler. Also, check out the + + ++
std.base64 ++
Functions that operate on Unicode characters. ++ +
std.uri +
Encode and decode Uniform Resource Identifiers (URIs). + +--- a/src/libphobos/src/Makefile.am 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/Makefile.am 2014-04-01 16:32:51.000000000 +0100 +@@ -20,7 +20,7 @@ AUTOMAKE_OPTIONS = 1.9.4 foreign no-depe + ACLOCAL_AMFLAGS = -I. -I.. + + OUR_CFLAGS=@DEFS@ -I. -I$(srcdir)/../libdruntime/gcc -I$(top_srcdir)/../zlib +-D_EXTRA_DFLAGS=-nostdinc -pipe -Wno-deprecated -fproperty -I$(srcdir) -I$(srcdir)/../libdruntime -I./libdruntime/$(host_alias) ++D_EXTRA_DFLAGS=-nostdinc -pipe -Wno-deprecated -I$(srcdir) -I$(srcdir)/../libdruntime -I./libdruntime/$(host_alias) + ALL_DFLAGS=$(DFLAGS) $(D_EXTRA_DFLAGS) $(MULTIFLAGS) + + toolexecdir = $(phobos_toolexecdir) +@@ -55,14 +55,10 @@ zlib/%.o: $(top_srcdir)/../zlib/%.c + #--------------------------------------# + # GDC LibPhobos + +-# Special-case for std.xml, need to emit templates. +-std/xml.o : std/xml.d +- $(GDC) -o $@ $(ALL_DFLAGS) -femit-templates -c $< +- + MAIN_OBJS=std/algorithm.o std/array.o std/ascii.o std/base64.o std/bigint.o \ + std/bitmanip.o std/compiler.o \ + std/container.o std/complex.o std/concurrency.o \ +- std/conv.o std/cpuid.o std/cstream.o std/ctype.o std/csv.o \ ++ std/conv.o std/cstream.o std/csv.o \ + std/datetime.o std/demangle.o std/encoding.o \ + std/exception.o std/format.o \ + std/functional.o std/getopt.o std/json.o \ +@@ -71,7 +67,7 @@ MAIN_OBJS=std/algorithm.o std/array.o st + std/outbuffer.o std/parallelism.o std/signals.o \ + std/stdio.o std/stdiobase.o std/stdint.o std/stream.o \ + std/string.o std/syserror.o std/system.o std/random.o std/range.o \ +- std/regex.o std/regexp.o std/traits.o std/typecons.o \ ++ std/regex.o std/traits.o std/typecons.o \ + std/typetuple.o std/uni.o std/uri.o std/utf.o \ + std/uuid.o std/variant.o std/xml.o std/zip.o std/zlib.o \ + std/c/fenv.o std/c/locale.o std/c/math.o std/c/process.o \ +@@ -84,7 +80,10 @@ MAIN_OBJS=std/algorithm.o std/array.o st + std/internal/math/biguintx86.o std/internal/math/gammafunction.o \ + std/internal/math/errorfunction.o std/internal/processinit.o \ + std/internal/uni.o std/internal/uni_tab.o \ +- std/net/isemail.o \ ++ std/internal/unicode_comp.o std/internal/unicode_decomp.o \ ++ std/internal/unicode_grapheme.o std/internal/unicode_norm.o \ ++ std/internal/unicode_tables.o \ ++ std/net/curl.o std/net/isemail.o \ + crc32.o etc/c/curl.o etc/c/zlib.o + + Z_OBJS=zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o \ +@@ -96,7 +95,7 @@ ZLIB_OBJS=@ZLIB_OBJS@ + + + # modules which require some kind of operating system +-OS_OBJS=std/file.o std/mmfile.o std/path.o std/perf.o std/process.o \ ++OS_OBJS=std/file.o std/mmfile.o std/path.o std/process.o \ + std/socket.o std/socketstream.o + + LINUX_OBJS=std/c/linux/linux.o std/c/linux/socket.o +@@ -138,18 +137,19 @@ install-exec-local: libgphobos2.a + + install-data-local: libgphobos2.a + for i in etc/c \ +- std std/c std/c/freebsd \ +- std/c/linux std/c/osx std/c/windows \ +- std/internal std/internal/math std/internal/windows \ +- std/digest std/internal/digest \ +- std/net std/windows; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.d; do $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; done; \ ++ std std/c std/c/freebsd \ ++ std/c/linux std/c/osx std/c/windows \ ++ std/internal std/internal/math std/internal/windows \ ++ std/digest std/internal/digest \ ++ std/net std/windows; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(srcdir)/$$i/*.d; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done + for i in crc32.d; do \ +- $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); done +-#disabled, already installed by druntime +-#$(INSTALL) phobos-ver-syms $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR) ++ $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ done + + clean-local: + rm -f $(ALL_PHOBOS_OBJS) +--- a/src/libphobos/src/Makefile.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/Makefile.in 2014-04-01 16:32:51.000000000 +0100 +@@ -73,7 +73,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(sr + $(srcdir)/phobos-ver-syms.in + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ +- $(top_srcdir)/configure.in ++ $(top_srcdir)/configure.ac + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) + mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +@@ -97,6 +97,9 @@ AUTOCONF = @AUTOCONF@ + AUTOHEADER = @AUTOHEADER@ + AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@ ++BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@ ++BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@ + BUILD_LIBIBERTY = @BUILD_LIBIBERTY@ + CC = @CC@ + CC_FOR_BUILD = @CC_FOR_BUILD@ +@@ -112,7 +115,7 @@ DCFG_CBRIDGE_STDIO = @DCFG_CBRIDGE_STDIO + DCFG_GETPWNAM_R = @DCFG_GETPWNAM_R@ + DCFG_MMAP = @DCFG_MMAP@ + DCFG_POSIX = @DCFG_POSIX@ +-DCFG_SEMAPHORE_IMPL = @DCFG_SEMAPHORE_IMPL@ ++DCFG_THREAD_MODEL = @DCFG_THREAD_MODEL@ + DCFG_UNIX = @DCFG_UNIX@ + DEFS = @DEFS@ + DFLAGS = @DFLAGS@ +@@ -127,12 +130,14 @@ EGREP = @EGREP@ + EXEEXT = @EXEEXT@ + GDC = @GDC@ + GREP = @GREP@ ++HAVE_DLADDR = @HAVE_DLADDR@ + INSTALL = @INSTALL@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LIBBACKTRACE_LIB = @LIBBACKTRACE_LIB@ + LIBIBERTY_H_PATH = @LIBIBERTY_H_PATH@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ +@@ -214,15 +219,18 @@ top_srcdir = @top_srcdir@ + AUTOMAKE_OPTIONS = 1.9.4 foreign no-dependencies + ACLOCAL_AMFLAGS = -I. -I.. + OUR_CFLAGS = @DEFS@ -I. -I$(srcdir)/../libdruntime/gcc -I$(top_srcdir)/../zlib +-D_EXTRA_DFLAGS = -nostdinc -pipe -Wno-deprecated -fproperty -I$(srcdir) -I$(srcdir)/../libdruntime -I./libdruntime/$(host_alias) ++D_EXTRA_DFLAGS = -nostdinc -pipe -Wno-deprecated -I$(srcdir) -I$(srcdir)/../libdruntime -I./libdruntime/$(host_alias) + ALL_DFLAGS = $(DFLAGS) $(D_EXTRA_DFLAGS) $(MULTIFLAGS) + toolexecdir = $(phobos_toolexecdir) + toolexeclibdir = $(phobos_toolexeclibdir) + SUFFIXES = .d ++ ++#--------------------------------------# ++# GDC LibPhobos + MAIN_OBJS = std/algorithm.o std/array.o std/ascii.o std/base64.o std/bigint.o \ + std/bitmanip.o std/compiler.o \ + std/container.o std/complex.o std/concurrency.o \ +- std/conv.o std/cpuid.o std/cstream.o std/ctype.o std/csv.o \ ++ std/conv.o std/cstream.o std/csv.o \ + std/datetime.o std/demangle.o std/encoding.o \ + std/exception.o std/format.o \ + std/functional.o std/getopt.o std/json.o \ +@@ -231,7 +239,7 @@ MAIN_OBJS = std/algorithm.o std/array.o + std/outbuffer.o std/parallelism.o std/signals.o \ + std/stdio.o std/stdiobase.o std/stdint.o std/stream.o \ + std/string.o std/syserror.o std/system.o std/random.o std/range.o \ +- std/regex.o std/regexp.o std/traits.o std/typecons.o \ ++ std/regex.o std/traits.o std/typecons.o \ + std/typetuple.o std/uni.o std/uri.o std/utf.o \ + std/uuid.o std/variant.o std/xml.o std/zip.o std/zlib.o \ + std/c/fenv.o std/c/locale.o std/c/math.o std/c/process.o \ +@@ -244,7 +252,10 @@ MAIN_OBJS = std/algorithm.o std/array.o + std/internal/math/biguintx86.o std/internal/math/gammafunction.o \ + std/internal/math/errorfunction.o std/internal/processinit.o \ + std/internal/uni.o std/internal/uni_tab.o \ +- std/net/isemail.o \ ++ std/internal/unicode_comp.o std/internal/unicode_decomp.o \ ++ std/internal/unicode_grapheme.o std/internal/unicode_norm.o \ ++ std/internal/unicode_tables.o \ ++ std/net/curl.o std/net/isemail.o \ + crc32.o etc/c/curl.o etc/c/zlib.o + + Z_OBJS = zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o \ +@@ -254,7 +265,7 @@ Z_OBJS = zlib/adler32.o zlib/compress.o + + + # modules which require some kind of operating system +-OS_OBJS = std/file.o std/mmfile.o std/path.o std/perf.o std/process.o \ ++OS_OBJS = std/file.o std/mmfile.o std/path.o std/process.o \ + std/socket.o std/socketstream.o + + LINUX_OBJS = std/c/linux/linux.o std/c/linux/socket.o +@@ -525,13 +536,6 @@ zlib/%.o: $(top_srcdir)/../zlib/%.c + %.t.o : %.o + cp $< $@ + +-#--------------------------------------# +-# GDC LibPhobos +- +-# Special-case for std.xml, need to emit templates. +-std/xml.o : std/xml.d +- $(GDC) -o $@ $(ALL_DFLAGS) -femit-templates -c $< +- + libgphobos2.a : $(ALL_PHOBOS_OBJS) ../libdruntime/libgdruntime.a + cp ../libdruntime/libgdruntime.a libgphobos2.a + $(AR) -q $@ $(ALL_PHOBOS_OBJS) +@@ -554,18 +558,19 @@ install-exec-local: libgphobos2.a + + install-data-local: libgphobos2.a + for i in etc/c \ +- std std/c std/c/freebsd \ +- std/c/linux std/c/osx std/c/windows \ +- std/internal std/internal/math std/internal/windows \ +- std/digest std/internal/digest \ +- std/net std/windows; do \ +- $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ +- for f in $(srcdir)/$$i/*.d; do $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; done; \ ++ std std/c std/c/freebsd \ ++ std/c/linux std/c/osx std/c/windows \ ++ std/internal std/internal/math std/internal/windows \ ++ std/digest std/internal/digest \ ++ std/net std/windows; do \ ++ $(mkinstalldirs) $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ for f in $(srcdir)/$$i/*.d; do \ ++ $(INSTALL_HEADER) $$f $(DESTDIR)$(gdc_include_dir)/$$i; \ ++ done; \ + done + for i in crc32.d; do \ +- $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); done +-#disabled, already installed by druntime +-#$(INSTALL) phobos-ver-syms $(DESTDIR)$(gdc_include_dir)/$(host_alias)/$(MULTISUBDIR) ++ $(INSTALL_HEADER) $(srcdir)/$$i $(DESTDIR)$(gdc_include_dir); \ ++ done + + clean-local: + rm -f $(ALL_PHOBOS_OBJS) +--- a/src/libphobos/src/phobos-ver-syms.in 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/phobos-ver-syms.in 2014-04-01 16:32:51.000000000 +0100 +@@ -1,12 +1,10 @@ + @DCFG_UNIX@ + @DCFG_POSIX@ +-@DCFG_SEMAPHORE_IMPL@ + @DCFG_NEARBYINT@ + @DCFG_ROUND@ + @DCFG_TGAMMA@ + @DCFG_NAN@ +-@DCFG_EXECVPE@ +-@DCFG_SPAWNVP@ + @DCFG_CBRIDGE_STDIO@ + @DCFG_MMAP@ + @DCFG_ARM_EABI_UNWINDER@ ++@DCFG_THREAD_MODEL@ +--- a/src/libphobos/src/std/algorithm.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/algorithm.d 2014-04-01 16:32:51.000000000 +0100 +@@ -6,13 +6,13 @@ + $(BOOKTABLE , + $(TR $(TH Category) $(TH Functions) + ) +-$(TR $(TDNW Searching) $(TD $(MYREF balancedParens) $(MYREF ++$(TR $(TDNW Searching) $(TD $(MYREF all) $(MYREF any) $(MYREF balancedParens) $(MYREF + boyerMooreFinder) $(MYREF canFind) $(MYREF count) $(MYREF countUntil) +-$(MYREF endsWith) $(MYREF commonPrefix) $(MYREF find) $(MYREF ++$(MYREF commonPrefix) $(MYREF endsWith) $(MYREF find) $(MYREF + findAdjacent) $(MYREF findAmong) $(MYREF findSkip) $(MYREF findSplit) +-$(MYREF findSplitAfter) $(MYREF findSplitBefore) $(MYREF indexOf) +-$(MYREF minCount) $(MYREF minPos) $(MYREF mismatch) $(MYREF skipOver) +-$(MYREF startsWith) $(MYREF until) ) ++$(MYREF findSplitAfter) $(MYREF findSplitBefore) $(MYREF minCount) ++$(MYREF minPos) $(MYREF mismatch) $(MYREF skipOver) $(MYREF startsWith) ++$(MYREF until) ) + ) + $(TR $(TDNW Comparison) $(TD $(MYREF cmp) $(MYREF equal) $(MYREF + levenshteinDistance) $(MYREF levenshteinDistanceAndPath) $(MYREF max) +@@ -23,10 +23,10 @@ $(MYREF group) $(MYREF joiner) $(MYREF m + splitter) $(MYREF uniq) ) + ) + $(TR $(TDNW Sorting) $(TD $(MYREF completeSort) $(MYREF isPartitioned) +-$(MYREF isSorted) $(MYREF makeIndex) $(MYREF partialSort) $(MYREF ++$(MYREF isSorted) $(MYREF makeIndex) $(MYREF nextPermutation) ++$(MYREF nextEvenPermutation) $(MYREF partialSort) $(MYREF + partition) $(MYREF partition3) $(MYREF schwartzSort) $(MYREF sort) +-$(MYREF topN) $(MYREF topNCopy) $(MYREF nextPermutation) +-$(MYREF nextEvenPermutation) ) ++$(MYREF topN) $(MYREF topNCopy) ) + ) + $(TR $(TDNW Set operations) $(TD $(MYREF cartesianProduct) $(MYREF + largestPartialIntersection) $(MYREF largestPartialIntersectionWeighted) +@@ -35,8 +35,8 @@ setSymmetricDifference) $(MYREF setUnion + ) + $(TR $(TDNW Mutation) $(TD $(MYREF bringToFront) $(MYREF copy) $(MYREF + fill) $(MYREF initializeAll) $(MYREF move) $(MYREF moveAll) $(MYREF +-moveSome) $(MYREF remove) $(MYREF reverse) $(MYREF swap) $(MYREF +-swapRanges) $(MYREF uninitializedFill) )) ++moveSome) $(MYREF remove) $(MYREF reverse) $(MYREF strip) $(MYREF stripLeft) ++$(MYREF stripRight) $(MYREF swap) $(MYREF swapRanges) $(MYREF uninitializedFill) )) + ) + + Implements algorithms oriented mainly towards processing of +@@ -75,6 +75,10 @@ $(TR $(TH Function Name) $(TH Descriptio + ) + $(LEADINGROW Searching + ) ++$(TR $(TDNW $(LREF all)) $(TD $(D all!"a > 0"([1, 2, 3, 4])) returns $(D true) because all elements are positive) ++) ++$(TR $(TDNW $(LREF any)) $(TD $(D any!"a > 0"([1, 2, -3, -4])) returns $(D true) because at least one element is positive) ++) + $(TR $(TDNW $(LREF balancedParens)) $(TD $(D + balancedParens("((1 + 1) / 2)")) returns $(D true) because the string + has balanced parentheses.) +@@ -146,7 +150,7 @@ until a specific value is found.) + $(LEADINGROW Comparison + ) + $(TR $(TDNW $(LREF cmp)) $(TD $(D cmp("abc", "abcd")) is $(D +--1), $(D cmp("abc", aba")) is $(D 1), and $(D cmp("abc", "abc")) is ++-1), $(D cmp("abc", "aba")) is $(D 1), and $(D cmp("abc", "abc")) is + $(D 0).) + ) + $(TR $(TDNW $(LREF equal)) $(TD Compares ranges for +@@ -173,7 +177,7 @@ $(TR $(TDNW $(LREF mismatch)) $(TD $(D m + $(LEADINGROW Iteration + ) + $(TR $(TDNW $(LREF filter)) $(TD $(D filter!"a > 0"([1, -1, 2, +-0, -3])) iterates over elements $(D 1), $(D 2), and $(D 0).) ++0, -3])) iterates over elements $(D 1) and $(D 2).) + ) + $(TR $(TDNW $(LREF filterBidirectional)) $(TD Similar to $(D + filter), but also provides $(D back) and $(D popBack) at a small +@@ -218,6 +222,12 @@ returns $(D true).) + $(TR $(TDNW $(LREF makeIndex)) $(TD Creates a separate index + for a range.) + ) ++$(TR $(TDNW $(LREF nextPermutation)) $(TD Computes the next lexicographically ++greater permutation of a range in-place.) ++) ++$(TR $(TDNW $(LREF nextEvenPermutation)) $(TD Computes the next ++lexicographically greater even permutation of a range in-place.) ++) + $(TR $(TDNW $(LREF partialSort)) $(TD If $(D a = [5, 4, 3, 2, + 1]), then $(D partialSort(a, 3)) leaves $(D a[0 .. 3] = [1, 2, + 3]). The other elements of $(D a) are left in an unspecified order.) +@@ -236,12 +246,6 @@ range.) + $(TR $(TDNW $(LREF topNCopy)) $(TD Copies out the top elements + of a range.) + ) +-$(TR $(TDNW $(LREF nextPermutation)) $(TD Computes the next lexicographically +-greater permutation of a range in-place.) +-) +-$(TR $(TDNW $(LREF nextEvenPermutation)) $(TD Computes the next +-lexicographically greater even permutation of a range in-place.) +-) + $(LEADINGROW Set operations + ) + $(TR $(TDNW $(LREF cartesianProduct)) $(TD Computes Cartesian product of two +@@ -261,7 +265,7 @@ $(TR $(TDNW $(LREF setDifference)) $(TD + difference of two or more sorted ranges.) + ) + $(TR $(TDNW $(LREF setIntersection)) $(TD Lazily computes the +-set difference of two or more sorted ranges.) ++intersection of two or more sorted ranges.) + ) + $(TR $(TDNW $(LREF setSymmetricDifference)) $(TD Lazily + computes the symmetric set difference of two or more sorted ranges.) +@@ -299,6 +303,21 @@ possible from one range to another.) + $(TR $(TDNW $(LREF reverse)) $(TD If $(D a = [1, 2, 3]), $(D + reverse(a)) changes it to $(D [3, 2, 1]).) + ) ++$(TR $(TDNW $(LREF strip)) $(TD Strips all leading and trailing ++elements equal to a value, or that satisfy a predicate. ++If $(D a = [1, 1, 0, 1, 1]), then $(D strip(a, 1)) and $(D strip!(e => e == 1)(a)) ++returns $(D [0]).) ++) ++$(TR $(TDNW $(LREF stripLeft)) $(TD Strips all leading elements equal to a value, ++or that satisfy a predicate. ++If $(D a = [1, 1, 0, 1, 1]), then $(D stripLeft(a, 1)) and $(D stripLeft!(e => e == 1)(a)) ++returns $(D [0, 1, 1]).) ++) ++$(TR $(TDNW $(LREF stripRight)) $(TD Strips all trailing elements equal to a value, ++or that satisfy a predicate. ++If $(D a = [1, 1, 0, 1, 1]), then $(D stripRight(a, 1)) and $(D stripRight!(e => e == 1)(a)) ++returns $(D [1, 1, 0]).) ++) + $(TR $(TDNW $(LREF swap)) $(TD Swaps two values.) + ) + $(TR $(TDNW $(LREF swapRanges)) $(TD Swaps all elements of two +@@ -326,15 +345,17 @@ module std.algorithm; + + import std.c.string, core.bitop; + import std.array, std.ascii, std.container, std.conv, std.exception, +- std.functional, std.math, std.metastrings, std.range, std.string, ++ std.functional, std.math, std.random, std.range, std.string, + std.traits, std.typecons, std.typetuple, std.uni, std.utf; + + version(unittest) + { +- import std.random, std.stdio, std.string; ++ import std.stdio; + mixin(dummyRanges); + } + ++private T* addressOf(T)(ref T val) { return &val; } ++ + /** + $(D auto map(Range)(Range r) if (isInputRange!(Unqual!Range));) + +@@ -348,7 +369,7 @@ Example: + ---- + int[] arr1 = [ 1, 2, 3, 4 ]; + int[] arr2 = [ 5, 6 ]; +-auto squares = map!("a * a")(chain(arr1, arr2)); ++auto squares = map!(a => a * a)(chain(arr1, arr2)); + assert(equal(squares, [ 1, 4, 9, 16, 25, 36 ])); + ---- + +@@ -451,7 +472,7 @@ private struct MapResult(alias fun, Rang + } + } + +- static if (hasLength!R || isSomeString!R) ++ static if (hasLength!R) + { + @property auto length() + { +@@ -461,16 +482,33 @@ private struct MapResult(alias fun, Rang + alias length opDollar; + } + +- static if (!isInfinite!R && hasSlicing!R) ++ static if (hasSlicing!R) + { + static if (is(typeof(_input[ulong.max .. ulong.max]))) +- private alias ulong opSlice_t; ++ private alias opSlice_t = ulong; + else +- private alias uint opSlice_t; ++ private alias opSlice_t = uint; + +- auto opSlice(opSlice_t lowerBound, opSlice_t upperBound) ++ static if (hasLength!R) + { +- return typeof(this)(_input[lowerBound..upperBound]); ++ auto opSlice(opSlice_t low, opSlice_t high) ++ { ++ return typeof(this)(_input[low .. high]); ++ } ++ } ++ else static if (is(typeof(_input[opSlice_t.max .. $]))) ++ { ++ struct DollarToken{} ++ enum opDollar = DollarToken.init; ++ auto opSlice(opSlice_t low, DollarToken) ++ { ++ return typeof(this)(_input[low .. $]); ++ } ++ ++ auto opSlice(opSlice_t low, opSlice_t high) ++ { ++ return this[low .. $].take(high - low); ++ } + } + } + +@@ -595,6 +633,29 @@ unittest + assert(equal(m, [1L, 4L, 9L])); + } + ++unittest ++{ ++ // Issue #10130 - map of iota with const step. ++ const step = 2; ++ static assert(__traits(compiles, map!(i => i)(iota(0, 10, step)))); ++ ++ // Need these to all by const to repro the float case, due to the ++ // CommonType template used in the float specialization of iota. ++ const floatBegin = 0.0; ++ const floatEnd = 1.0; ++ const floatStep = 0.02; ++ static assert(__traits(compiles, map!(i => i)(iota(floatBegin, floatEnd, floatStep)))); ++} ++unittest ++{ ++ //slicing infinites ++ auto rr = iota(0, 5).cycle().map!"a * a"(); ++ alias RR = typeof(rr); ++ static assert(hasSlicing!RR); ++ rr = rr[6 .. $]; //Advances 1 cycle and 1 unit ++ assert(equal(rr[0 .. 5], [1, 4, 9, 16, 0])); ++} ++ + /** + $(D auto reduce(Args...)(Args args) + if (Args.length > 0 && Args.length <= 2 && isIterable!(Args[$ - 1]));) +@@ -617,19 +678,27 @@ Example: + ---- + int[] arr = [ 1, 2, 3, 4, 5 ]; + // Sum all elements +-auto sum = reduce!("a + b")(0, arr); ++auto sum = reduce!((a,b) => a + b)(0, arr); ++assert(sum == 15); ++ ++// Sum again, using a string predicate with "a" and "b" ++sum = reduce!"a + b"(0, arr); + assert(sum == 15); + + // Compute the maximum of all elements + auto largest = reduce!(max)(arr); + assert(largest == 5); + ++// Max again, but with Uniform Function Call Syntax (UFCS) ++largest = arr.reduce!(max); ++assert(largest == 5); ++ + // Compute the number of odd elements +-auto odds = reduce!("a + (b & 1)")(0, arr); ++auto odds = reduce!((a,b) => a + (b & 1))(0, arr); + assert(odds == 3); + + // Compute the sum of squares +-auto ssquares = reduce!("a + b * b")(0, arr); ++auto ssquares = reduce!((a,b) => a + b * b)(0, arr); + assert(ssquares == 55); + + // Chain multiple ranges into seed +@@ -641,7 +710,11 @@ assert(r == 107); + // Mixing convertible types is fair game, too + double[] c = [ 2.5, 3.0 ]; + auto r1 = reduce!("a + b")(chain(a, b, c)); +-assert(r1 == 112.5); ++assert(approxEqual(r1, 112.5)); ++ ++// To minimize nesting of parentheses, Uniform Function Call Syntax can be used ++auto r2 = chain(a, b, c).reduce!("a + b"); ++assert(approxEqual(r2, 112.5)); + ---- + + $(DDOC_SECTION_H Multiple functions:) Sometimes it is very useful to +@@ -657,14 +730,14 @@ Example: + double[] a = [ 3.0, 4, 7, 11, 3, 2, 5 ]; + // Compute minimum and maximum in one pass + auto r = reduce!(min, max)(a); +-// The type of r is Tuple!(double, double) +-assert(r[0] == 2); // minimum +-assert(r[1] == 11); // maximum ++// The type of r is Tuple!(int, int) ++assert(approxEqual(r[0], 2)); // minimum ++assert(approxEqual(r[1], 11)); // maximum + + // Compute sum and sum of squares in one pass + r = reduce!("a + b", "a + b * b")(tuple(0.0, 0.0), a); +-assert(r[0] == 35); // sum +-assert(r[1] == 233); // sum of squares ++assert(approxEqual(r[0], 35)); // sum ++assert(approxEqual(r[1], 233)); // sum of squares + // Compute average and standard deviation from the above + auto avg = r[0] / a.length; + auto stdev = sqrt(r[1] / a.length - avg * avg); +@@ -713,11 +786,12 @@ template reduce(fun...) if (fun.length > + else + { + static assert(fun.length > 1); +- typeof(adjoin!(staticMap!(binaryFun, fun))(r.front, r.front)) ++ Unqual!(typeof(r.front)) seed = r.front; ++ typeof(adjoin!(staticMap!(binaryFun, fun))(seed, seed)) + result = void; + foreach (i, T; result.Types) + { +- emplace(&result[i], r.front); ++ emplace(&result[i], seed); + } + r.popFront(); + return reduce(result, r); +@@ -875,6 +949,16 @@ unittest + r = reduce!"a + b"(a, c); + } + ++unittest ++{ ++ // Issue #10408 - Two-function reduce of a const array. ++ const numbers = [10, 30, 20]; ++ immutable m = reduce!(min)(numbers); ++ assert(m == 10); ++ immutable minmax = reduce!(min, max)(numbers); ++ assert(minmax == tuple(10, 30)); ++} ++ + /** + Fills $(D range) with a $(D filler). + +@@ -1096,9 +1180,11 @@ void uninitializedFill(Range, Value)(Ran + { + alias ElementType!Range T; + static if (hasElaborateAssign!T) ++ { + // Must construct stuff by the book + for (; !range.empty; range.popFront()) +- emplace(&range.front(), filler); ++ emplace(addressOf(range.front), filler); ++ } + else + // Doesn't matter whether fill is initialized or not + return fill(range, filler); +@@ -1141,13 +1227,13 @@ void initializeAll(Range)(Range range) + auto p = typeid(T).init().ptr; + if (p) + for ( ; !range.empty ; range.popFront() ) +- memcpy(&range.front(), p, T.sizeof); ++ memcpy(addressOf(range.front), p, T.sizeof); + else + static if (isDynamicArray!Range) + memset(range.ptr, 0, range.length * T.sizeof); + else + for ( ; !range.empty ; range.popFront() ) +- memset(&range.front(), 0, T.sizeof); ++ memset(addressOf(range.front), 0, T.sizeof); + } + else + fill(range, T.init); +@@ -1196,12 +1282,12 @@ unittest + static struct S3 + { + int i; +- this(this){}; ++ this(this){} + } + static struct S4 + { + int i = 1; +- this(this){}; ++ this(this){} + } + static assert (!hasElaborateAssign!S1); + static assert (!hasElaborateAssign!S2); +@@ -1255,18 +1341,25 @@ which $(D predicate(x)) is $(D true). + Example: + ---- + int[] arr = [ 1, 2, 3, 4, 5 ]; ++ + // Sum all elements +-auto small = filter!("a < 3")(arr); ++auto small = filter!(a => a < 3)(arr); + assert(equal(small, [ 1, 2 ])); ++ ++// Sum again, but with Uniform Function Call Syntax (UFCS) ++auto sum = arr.filter!(a => a < 3); ++assert(equal(sum, [ 1, 2 ])); ++ + // In combination with chain() to span multiple ranges + int[] a = [ 3, -2, 400 ]; + int[] b = [ 100, -101, 102 ]; +-auto r = filter!("a > 0")(chain(a, b)); ++auto r = chain(a, b).filter!(a => a > 0); + assert(equal(r, [ 3, 400, 100, 102 ])); ++ + // Mixing convertible types is fair game, too + double[] c = [ 2.5, 3.0 ]; +-auto r1 = filter!("cast(int) a != a")(chain(c, a, b)); +-assert(equal(r1, [ 2.5 ])); ++auto r1 = chain(c, a, b).filter!(a => cast(int) a != a); ++assert(approxEqual(r1, [ 2.5 ])); + ---- + */ + template filter(alias pred) if (is(typeof(unaryFun!pred))) +@@ -1319,7 +1412,7 @@ private struct FilterResult(alias pred, + { + @property auto save() + { +- return typeof(this)(_input); ++ return typeof(this)(_input.save); + } + } + } +@@ -2128,6 +2221,15 @@ if (is(typeof(ElementType!Range.init == + IndexType _frontLength = _unComputed; + IndexType _backLength = _unComputed; + ++ static if (isNarrowString!Range) ++ { ++ size_t _separatorLength; ++ } ++ else ++ { ++ enum _separatorLength = 1; ++ } ++ + static if (isBidirectionalRange!Range) + { + static IndexType lastIndexOf(Range haystack, Separator needle) +@@ -2142,6 +2244,11 @@ if (is(typeof(ElementType!Range.init == + { + _input = input; + _separator = separator; ++ ++ static if (isNarrowString!Range) ++ { ++ _separatorLength = codeLength!(ElementEncodingType!Range)(separator); ++ } + } + + static if (isInfinite!Range) +@@ -2185,8 +2292,7 @@ if (is(typeof(ElementType!Range.init == + } + else + { +- _input = _input[_frontLength .. _input.length]; +- skipOver(_input, _separator) || assert(false); ++ _input = _input[_frontLength + _separatorLength .. _input.length]; + _frontLength = _unComputed; + } + } +@@ -2238,15 +2344,7 @@ if (is(typeof(ElementType!Range.init == + } + else + { +- _input = _input[0 .. _input.length - _backLength]; +- if (!_input.empty && _input.back == _separator) +- { +- _input.popBack(); +- } +- else +- { +- assert(false); +- } ++ _input = _input[0 .. _input.length - _backLength - _separatorLength]; + _backLength = _unComputed; + } + } +@@ -2261,6 +2359,7 @@ unittest + debug(std_algorithm) scope(success) + writeln("unittest @", __FILE__, ":", __LINE__, " done."); + assert(equal(splitter("hello world", ' '), [ "hello", "", "world" ])); ++ assert(equal(splitter("žlutoučkýřkůň", 'ř'), [ "žlutoučký", "kůň" ])); + int[] a = [ 1, 2, 0, 0, 3, 0, 4, 5, 0 ]; + int[][] w = [ [1, 2], [], [3], [4, 5], [] ]; + static assert(isForwardRange!(typeof(splitter(a, 0)))); +@@ -2334,7 +2433,9 @@ with string types. + */ + auto splitter(Range, Separator)(Range r, Separator s) + if (is(typeof(Range.init.front == Separator.init.front) : bool) +- && (hasSlicing!Range || isNarrowString!Range)) ++ && (hasSlicing!Range || isNarrowString!Range) ++ && isForwardRange!Separator ++ && (hasLength!Separator || isNarrowString!Separator)) + { + static struct Result + { +@@ -2354,7 +2455,8 @@ if (is(typeof(Range.init.front == Separa + if (_frontLength != _frontLength.max) return; + assert(!_input.empty); + // compute front length +- _frontLength = _input.length - find(_input, _separator).length; ++ _frontLength = (_separator.empty) ? 1 : ++ _input.length - find(_input, _separator).length; + static if (isBidirectionalRange!Range) + if (_frontLength == _input.length) _backLength = _frontLength; + } +@@ -2365,7 +2467,7 @@ if (is(typeof(Range.init.front == Separa + if (_backLength != _backLength.max) return; + assert(!_input.empty); + // compute back length +- static if (isBidirectionalRange!Range) ++ static if (isBidirectionalRange!Range && isBidirectionalRange!Separator) + { + _backLength = _input.length - + find(retro(_input), retro(_separator)).source.length; +@@ -2439,7 +2541,7 @@ if (is(typeof(Range.init.front == Separa + } + + // Bidirectional functionality as suggested by Brad Roberts. +- static if (isBidirectionalRange!Range) ++ static if (isBidirectionalRange!Range && isBidirectionalRange!Separator) + { + @property Range back() + { +@@ -2529,6 +2631,31 @@ unittest + assert(equal(sp6, ["", ""][])); + } + ++unittest ++{ ++ // Issue 10773 ++ auto s = splitter("abc", ""); ++ assert(s.equal(["a", "b", "c"])); ++} ++ ++unittest ++{ ++ // Test by-reference separator ++ class RefSep { ++ string _impl; ++ this(string s) { _impl = s; } ++ @property empty() { return _impl.empty; } ++ @property auto front() { return _impl.front; } ++ void popFront() { _impl = _impl[1..$]; } ++ @property RefSep save() { return new RefSep(_impl); } ++ @property auto length() { return _impl.length; } ++ } ++ auto sep = new RefSep("->"); ++ auto data = "i->am->pointing"; ++ auto words = splitter(data, sep); ++ assert(words.equal([ "i", "am", "pointing" ])); ++} ++ + auto splitter(alias isTerminator, Range)(Range input) + if (is(typeof(unaryFun!(isTerminator)(ElementType!(Range).init)))) + { +@@ -2684,7 +2811,7 @@ unittest + lines[1] = "line \ttwo".dup; + lines[2] = "yah last line\ryah".dup; + foreach (line; lines) { +- foreach (word; splitter(strip(line))) { ++ foreach (word; splitter(std.string.strip(line))) { + if (word in dictionary) continue; // Nothing to do + auto newID = dictionary.length; + dictionary[to!string(word)] = cast(uint)newID; +@@ -2801,7 +2928,27 @@ if (isInputRange!RoR && isInputRange!(El + { + _items = items; + _sep = sep; +- mixin(useItem); // _current should be initialized in place ++ ++ //mixin(useItem); // _current should be initialized in place ++ if (_items.empty) ++ _current = _current.init; // set invalid state ++ else ++ { ++ // If we're exporting .save, we must not consume any of the ++ // subranges, since RoR.save does not guarantee that the states ++ // of the subranges are also saved. ++ static if (isForwardRange!RoR && ++ isForwardRange!(ElementType!RoR)) ++ _current = _items.front.save; ++ else ++ _current = _items.front; ++ ++ if (_current.empty) ++ { ++ // No data in the current item - toggle to use the separator ++ useSeparator(); ++ } ++ } + } + + @property auto empty() +@@ -2988,7 +3135,24 @@ if (isInputRange!RoR && isInputRange!(El + this(RoR r) + { + _items = r; +- mixin(prepare); // _current should be initialized in place ++ //mixin(prepare); // _current should be initialized in place ++ ++ // Skip over empty subranges. ++ while (!_items.empty && _items.front.empty) ++ _items.popFront(); ++ ++ if (_items.empty) ++ _current = _current.init; // set invalid state ++ else ++ { ++ // We cannot export .save method unless we ensure subranges are not ++ // consumed when a .save'd copy of ourselves is iterated over. So ++ // we need to .save each subrange we traverse. ++ static if (isForwardRange!RoR && isForwardRange!(ElementType!RoR)) ++ _current = _items.front.save; ++ else ++ _current = _items.front; ++ } + } + static if (isInfinite!RoR) + { +@@ -3482,15 +3646,27 @@ string[] s = [ "Hello", "world", "!" ]; + assert(!find!("toLower(a) == b")(s, "hello").empty); + ---- + */ ++ + R find(alias pred = "a == b", R, E)(R haystack, E needle) + if (isInputRange!R && + is(typeof(binaryFun!pred(haystack.front, needle)) : bool)) + { +- for (; !haystack.empty; haystack.popFront()) ++ static if (isNarrowString!R && isSomeChar!E && is(typeof(pred == "a == b")) && pred == "a == b") + { +- if (binaryFun!pred(haystack.front, needle)) break; ++ alias Unqual!(ElementEncodingType!R) EEType; ++ EEType[EEType.sizeof == 1 ? 4 : 2] buf; ++ ++ size_t len = encode(buf, needle); ++ return () @trusted {return std.algorithm.find!pred(haystack, cast(R)buf[0 .. len]);}(); ++ } ++ else ++ { ++ for (; !haystack.empty; haystack.popFront()) ++ { ++ if (binaryFun!pred(haystack.front, needle)) break; ++ } ++ return haystack; + } +- return haystack; + } + + unittest +@@ -3502,6 +3678,7 @@ unittest + auto r = find(lst[], 5); + assert(equal(r, SList!int(5, 7, 3)[])); + assert(find([1, 2, 3, 5], 4).empty); ++ assert(equal(find!"a>b"("hello", 'k'), "llo")); + } + + /** +@@ -3964,7 +4141,7 @@ unittest + struct BoyerMooreFinder(alias pred, Range) + { + private: +- size_t skip[]; ++ size_t[] skip; + ptrdiff_t[ElementType!(Range)] occ; + Range needle; + +@@ -4399,11 +4576,11 @@ unittest + /++ + Returns the number of elements which must be popped from the front of + $(D haystack) before reaching an element for which +- $(D startsWith!pred(haystack, needle)) is $(D true). If +- $(D startsWith!pred(haystack, needle)) is not $(D true) for any element in +- $(D haystack), then -1 is returned. ++ $(D startsWith!pred(haystack, needles)) is $(D true). If ++ $(D startsWith!pred(haystack, needles)) is not $(D true) for any element in ++ $(D haystack), then $(D -1) is returned. + +- $(D needle) may be either an element or a range. ++ $(D needles) may be either an element or a range. + + Examples: + -------------------- +@@ -4419,47 +4596,88 @@ assert(countUntil([0, 7, 12, 22, 9], 9) + assert(countUntil!"a > b"([0, 7, 12, 22, 9], 20) == 3); + -------------------- + +/ +-ptrdiff_t countUntil(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle) +- if (isForwardRange!R1 && isForwardRange!R2 && +- is(typeof(binaryFun!pred(haystack.front, needle.front)) : bool)) ++ptrdiff_t countUntil(alias pred = "a == b", R, Rs...)(R haystack, Rs needles) ++ if (isForwardRange!R ++ && Rs.length > 0 ++ && isForwardRange!(Rs[0]) == isInputRange!(Rs[0]) ++ && is(typeof(startsWith!pred(haystack, needles[0]))) ++ && (Rs.length == 1 ++ || is(typeof(countUntil!pred(haystack, needles[1 .. $]))))) + { + typeof(return) result; +- static if (hasLength!R1) //Note: Narrow strings don't have length. ++ ++ static if (needles.length == 1) + { +- //We delegate to find because find is very efficient. +- //We store the length of the haystack so we don't have to save it. +- auto len = haystack.length; +- auto r2 = find!pred(haystack, needle); +- if (!r2.empty) +- return cast(typeof(return)) (len - r2.length); ++ static if (hasLength!R) //Note: Narrow strings don't have length. ++ { ++ //We delegate to find because find is very efficient. ++ //We store the length of the haystack so we don't have to save it. ++ auto len = haystack.length; ++ auto r2 = find!pred(haystack, needles[0]); ++ if (!r2.empty) ++ return cast(typeof(return)) (len - r2.length); ++ } ++ else ++ { ++ if (needles[0].empty) ++ return 0; ++ ++ //Default case, slower route doing startsWith iteration ++ for ( ; !haystack.empty ; ++result ) ++ { ++ //We compare the first elements of the ranges here before ++ //forwarding to startsWith. This avoids making useless saves to ++ //haystack/needle if they aren't even going to be mutated anyways. ++ //It also cuts down on the amount of pops on haystack. ++ if (binaryFun!pred(haystack.front, needles[0].front)) ++ { ++ //Here, we need to save the needle before popping it. ++ //haystack we pop in all paths, so we do that, and then save. ++ haystack.popFront(); ++ if (startsWith!pred(haystack.save, needles[0].save.dropOne())) ++ return result; ++ } ++ else ++ haystack.popFront(); ++ } ++ } + } + else + { +- if (needle.empty) +- return 0; +- +- //Default case, slower route doing startsWith iteration +- for ( ; !haystack.empty ; ++result ) ++ foreach (i, Ri; Rs) + { +- //We compare the first elements of the ranges here before +- //forwarding to startsWith. This avoids making useless saves to +- //haystack/needle if they aren't even going to be mutated anyways. +- //It also cuts down on the amount of pops on haystack. +- if (binaryFun!pred(haystack.front, needle.front)) ++ static if (isForwardRange!Ri) + { +- //Here, we need to save the needle before popping it. +- //haystack we pop in all paths, so we do that, and then save. +- haystack.popFront(); +- if (startsWith!pred(haystack.save, needle.save.dropOne())) +- return result; ++ if (needles[i].empty) ++ return 0; ++ } ++ } ++ Tuple!Rs t; ++ foreach (i, Ri; Rs) ++ { ++ static if (!isForwardRange!Ri) ++ { ++ t[i] = needles[i]; ++ } ++ } ++ for (; !haystack.empty ; ++result, haystack.popFront()) ++ { ++ foreach (i, Ri; Rs) ++ { ++ static if (isForwardRange!Ri) ++ { ++ t[i] = needles[i].save; ++ } ++ } ++ if (startsWith!pred(haystack.save, t.expand)) ++ { ++ return result; + } +- else +- haystack.popFront(); + } + } + + //Because of @@@8804@@@: Avoids both "unreachable code" or "no return statement" +- static if (isInfinite!R1) assert(0); ++ static if (isInfinite!R) assert(0); + else return -1; + } + /// ditto +@@ -4509,6 +4727,14 @@ unittest + assert(r.save.countUntil(r3) == -1); + } + ++unittest ++{ ++ assert(countUntil("hello world", "world", "asd") == 6); ++ assert(countUntil("hello world", "world", "ello") == 1); ++ assert(countUntil("hello world", "world", "") == 0); ++ assert(countUntil("hello world", "world", 'l') == 2); ++} ++ + /++ + Returns the number of elements which must be popped from $(D haystack) + before $(D pred(haystack.front)) is $(D true). +@@ -4597,25 +4823,7 @@ unittest + } + } + +-/** +- * $(RED Deprecated. It will be removed in January 2013. +- * Currently defaults to $(LREF countUntil) instead.) +- * +- * Not to be confused with its homonym function +- * in $(D std.string). +- * +- * Please use $(D std.string.indexOf) if you wish to find +- * the index of a character in a string. +- * +- * Otherwise, please use $(D std.string.countUntil) to find +- * an element's logical position in a range. +- * +- * Example: +- * -------- +- * assert(std.string.indexOf("日本語", '本') == 3); +- * assert(std.algorithm.countUntil("日本語", '本') == 1); +- * -------- +- */ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.algorithm.countUntil instead.") + ptrdiff_t indexOf(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle) + if (is(typeof(startsWith!pred(haystack, needle)))) +@@ -5668,7 +5876,7 @@ unittest + assert(count("abcadfabf", "ab") == 2); + assert(count("ababab", "abab") == 1); + assert(count("ababab", "abx") == 0); +- assert(count!"std.uni.toLower(a) == std.uni.toLower(b)"("AbcAdFaBf", "ab") == 2); ++ assert(count!((a, b) => std.uni.toLower(a) == std.uni.toLower(b))("AbcAdFaBf", "ab") == 2); + } + + /// Ditto +@@ -5948,7 +6156,16 @@ int cmp(alias pred = "a < b", R1, R2)(R1 + static if (typeof(r1[0]).sizeof == 1) + { + immutable len = min(r1.length, r2.length); +- immutable result = std.c.string.memcmp(r1.ptr, r2.ptr, len); ++ immutable result = __ctfe ? ++ { ++ foreach (i; 0 .. len) ++ { ++ if (r1[i] != r2[i]) ++ return threeWayInt(r1[i], r2[i]); ++ } ++ return 0; ++ }() ++ : std.c.string.memcmp(r1.ptr, r2.ptr, len); + if (result) return result; + } + else +@@ -6561,7 +6778,7 @@ unittest + assert(levenshteinDistance("cat", "rat") == 1); + assert(levenshteinDistance("parks", "spark") == 2); + assert(levenshteinDistance("kitten", "sitting") == 3); +- assert(levenshteinDistance!("std.uni.toUpper(a) == std.uni.toUpper(b)") ++ assert(levenshteinDistance!((a, b) => std.uni.toUpper(a) == std.uni.toUpper(b)) + ("parks", "SPARK") == 2); + } + +@@ -6885,6 +7102,134 @@ unittest + test("hello\U00010143\u0100\U00010143", "\U00010143\u0100\U00010143olleh"); + } + ++/** ++ The strip group of functions allow stripping of either leading, trailing, ++ or both leading and trailing elements. ++ ++ The $(D stripLeft) function will strip the $(D front) of the range, ++ the $(D stripRight) function will strip the $(D back) of the range, ++ while the $(D strip) function will strip both the $(D front) and $(D back) ++ of the range. ++ ++ Note that the $(D strip) and $(D stripRight) functions require the range to ++ be a $(LREF BidirectionalRange) range. ++ ++ All of these functions come in two varieties: one takes a target element, ++ where the range will be stripped as long as this element can be found. ++ The other takes a lambda predicate, where the range will be stripped as ++ long as the predicate returns true. ++*/ ++Range strip(Range, E)(Range range, E element) ++ if (isBidirectionalRange!Range && is(typeof(range.front == element) : bool)) ++{ ++ return range.stripLeft(element).stripRight(element); ++} ++ ++/// ditto ++Range strip(alias pred, Range)(Range range) ++ if (isBidirectionalRange!Range && is(typeof(pred(range.back)) : bool)) ++{ ++ return range.stripLeft!pred().stripRight!pred(); ++} ++ ++/// ditto ++Range stripLeft(Range, E)(Range range, E element) ++ if (isInputRange!Range && is(typeof(range.front == element) : bool)) ++{ ++ return find!((auto ref a) => a != element)(range); ++} ++ ++/// ditto ++Range stripLeft(alias pred, Range)(Range range) ++ if (isInputRange!Range && is(typeof(pred(range.front)) : bool)) ++{ ++ return find!(not!pred)(range); ++} ++ ++/// ditto ++Range stripRight(Range, E)(Range range, E element) ++ if (isBidirectionalRange!Range && is(typeof(range.back == element) : bool)) ++{ ++ for (; !range.empty; range.popBack()) ++ { ++ if (range.back != element) ++ break; ++ } ++ return range; ++} ++ ++/// ditto ++Range stripRight(alias pred, Range)(Range range) ++ if (isBidirectionalRange!Range && is(typeof(pred(range.back)) : bool)) ++{ ++ for (; !range.empty; range.popBack()) ++ { ++ if (!pred(range.back)) ++ break; ++ } ++ return range; ++} ++ ++/// Strip leading and trailing elements equal to the target element. ++@safe pure unittest ++{ ++ assert(" foobar ".strip(' ') == "foobar"); ++ assert("00223.444500".strip('0') == "223.4445"); ++ assert("ëëêéüŗōpéêëë".strip('ë') == "êéüŗōpéê"); ++ assert([1, 1, 0, 1, 1].strip(1) == [0]); ++ assert([0.0, 0.01, 0.01, 0.0].strip(0).length == 2); ++} ++ ++/// Strip leading and trailing elements while the predicate returns true. ++@safe pure unittest ++{ ++ assert(" foobar ".strip!(a => a == ' ')() == "foobar"); ++ assert("00223.444500".strip!(a => a == '0')() == "223.4445"); ++ assert("ëëêéüŗōpéêëë".strip!(a => a == 'ë')() == "êéüŗōpéê"); ++ assert([1, 1, 0, 1, 1].strip!(a => a == 1)() == [0]); ++ assert([0.0, 0.01, 0.5, 0.6, 0.01, 0.0].strip!(a => a < 0.4)().length == 2); ++} ++ ++/// Strip leading elements equal to the target element. ++@safe pure unittest ++{ ++ assert(" foobar ".stripLeft(' ') == "foobar "); ++ assert("00223.444500".stripLeft('0') == "223.444500"); ++ assert("ůůűniçodêéé".stripLeft('ů') == "űniçodêéé"); ++ assert([1, 1, 0, 1, 1].stripLeft(1) == [0, 1, 1]); ++ assert([0.0, 0.01, 0.01, 0.0].stripLeft(0).length == 3); ++} ++ ++/// Strip leading elements while the predicate returns true. ++@safe pure unittest ++{ ++ assert(" foobar ".stripLeft!(a => a == ' ')() == "foobar "); ++ assert("00223.444500".stripLeft!(a => a == '0')() == "223.444500"); ++ assert("ůůűniçodêéé".stripLeft!(a => a == 'ů')() == "űniçodêéé"); ++ assert([1, 1, 0, 1, 1].stripLeft!(a => a == 1)() == [0, 1, 1]); ++ assert([0.0, 0.01, 0.10, 0.5, 0.6].stripLeft!(a => a < 0.4)().length == 2); ++} ++ ++/// Strip trailing elements equal to the target element. ++@safe pure unittest ++{ ++ assert(" foobar ".stripRight(' ') == " foobar"); ++ assert("00223.444500".stripRight('0') == "00223.4445"); ++ assert("ùniçodêéé".stripRight('é') == "ùniçodê"); ++ assert([1, 1, 0, 1, 1].stripRight(1) == [1, 1, 0]); ++ assert([0.0, 0.01, 0.01, 0.0].stripRight(0).length == 3); ++} ++ ++/// Strip trailing elements while the predicate returns true. ++@safe pure unittest ++{ ++ assert(" foobar ".stripRight!(a => a == ' ')() == " foobar"); ++ assert("00223.444500".stripRight!(a => a == '0')() == "00223.4445"); ++ assert("ùniçodêéé".stripRight!(a => a == 'é')() == "ùniçodê"); ++ assert([1, 1, 0, 1, 1].stripRight!(a => a == 1)() == [1, 1, 0]); ++ assert([0.0, 0.01, 0.10, 0.5, 0.6].stripRight!(a => a > 0.4)().length == 3); ++} ++ + // bringToFront + /** + The $(D bringToFront) function has considerable flexibility and +@@ -7217,120 +7562,80 @@ cases.)) + Range remove + (SwapStrategy s = SwapStrategy.stable, Range, Offset...) + (Range range, Offset offset) +-if (isBidirectionalRange!Range && hasLength!Range && s != SwapStrategy.stable ++if (s != SwapStrategy.stable ++ && isBidirectionalRange!Range && hasLength!Range + && Offset.length >= 1) + { +- enum bool tupleLeft = is(typeof(offset[0][0])) +- && is(typeof(offset[0][1])); +- enum bool tupleRight = is(typeof(offset[$ - 1][0])) +- && is(typeof(offset[$ - 1][1])); +- static if (!tupleLeft) +- { +- alias offset[0] lStart; +- auto lEnd = lStart + 1; +- } +- else +- { +- auto lStart = offset[0][0]; +- auto lEnd = offset[0][1]; +- } +- static if (!tupleRight) ++ Tuple!(size_t, "pos", size_t, "len")[offset.length] blackouts; ++ foreach (i, v; offset) + { +- alias offset[$ - 1] rStart; +- auto rEnd = rStart + 1; +- } +- else +- { +- auto rStart = offset[$ - 1][0]; +- auto rEnd = offset[$ - 1][1]; +- } +- // Begin. Test first to see if we need to remove the rightmost +- // element(s) in the range. In that case, life is simple - chop +- // and recurse. +- if (rEnd == range.length) +- { +- // must remove the last elements of the range +- range.popBackN(rEnd - rStart); +- static if (Offset.length > 1) ++ static if (is(typeof(v[0]) : size_t) && is(typeof(v[1]) : size_t)) + { +- return .remove!(s, Range, Offset[0 .. $ - 1]) +- (range, offset[0 .. $ - 1]); ++ blackouts[i].pos = v[0]; ++ blackouts[i].len = v[1] - v[0]; + } + else + { +- return range; +- } +- } +- +- // Ok, there are "live" elements at the end of the range +- auto t = range; +- auto lDelta = lEnd - lStart, rDelta = rEnd - rStart; +- auto rid = min(lDelta, rDelta); +- foreach (i; 0 .. rid) +- { +- move(range.back, t.front); +- range.popBack(); +- t.popFront(); +- } +- if (rEnd - rStart == lEnd - lStart) +- { +- // We got rid of both left and right +- static if (Offset.length > 2) +- { +- return .remove!(s, Range, Offset[1 .. $ - 1]) +- (range, offset[1 .. $ - 1]); ++ static assert(is(typeof(v) : size_t), typeof(v).stringof); ++ blackouts[i].pos = v; ++ blackouts[i].len = 1; + } +- else ++ static if (i > 0) + { +- return range; ++ enforce(blackouts[i - 1].pos + blackouts[i - 1].len ++ <= blackouts[i].pos, ++ "remove(): incorrect ordering of elements to remove"); + } + } +- else if (rEnd - rStart < lEnd - lStart) ++ ++ size_t left = 0, right = offset.length - 1; ++ auto tgt = range.save; ++ size_t steps = 0; ++ ++ while (left <= right) + { +- // We got rid of the entire right subrange +- static if (Offset.length > 2) ++ // Look for a blackout on the right ++ if (blackouts[right].pos + blackouts[right].len >= range.length) + { +- return .remove!(s, Range) +- (range, tuple(lStart + rid, lEnd), +- offset[1 .. $ - 1]); ++ range.popBackN(blackouts[right].len); ++ --right; ++ continue; + } +- else ++ // Advance to next blackout on the left ++ assert(blackouts[left].pos >= steps); ++ tgt.popFrontN(blackouts[left].pos - steps); ++ steps = blackouts[left].pos; ++ auto toMove = min( ++ blackouts[left].len, ++ range.length - (blackouts[right].pos + blackouts[right].len)); ++ foreach (i; 0 .. toMove) + { +- auto tmp = tuple(lStart + rid, lEnd); +- return .remove!(s, Range, typeof(tmp)) +- (range, tmp); +- } +- } +- else +- { +- // We got rid of the entire left subrange +- static if (Offset.length > 2) +- { +- return .remove!(s, Range) +- (range, offset[1 .. $ - 1], +- tuple(rStart, lEnd - rid)); ++ move(range.back, tgt.front); ++ range.popBack(); ++ tgt.popFront(); + } +- else ++ steps += toMove; ++ if (toMove == blackouts[left].len) + { +- auto tmp = tuple(rStart, lEnd - rid); +- return .remove!(s, Range, typeof(tmp)) +- (range, tmp); ++ // Filled the entire left hole ++ ++left; ++ continue; + } + } ++ ++ return range; + } + + // Ditto + Range remove + (SwapStrategy s = SwapStrategy.stable, Range, Offset...) + (Range range, Offset offset) +-if ((isForwardRange!Range && !isBidirectionalRange!Range +- || !hasLength!Range || s == SwapStrategy.stable) +- && Offset.length >= 1) ++if (s == SwapStrategy.stable && isForwardRange!Range && Offset.length >= 1) + { + auto result = range; + auto src = range, tgt = range; + size_t pos; +- foreach (i; offset) ++ foreach (pass, i; offset) + { + static if (is(typeof(i[0])) && is(typeof(i[1]))) + { +@@ -7341,10 +7646,20 @@ if ((isForwardRange!Range && !isBidirect + auto from = i; + enum delta = 1; + } +- assert(pos <= from); +- for (; pos < from; ++pos, src.popFront(), tgt.popFront()) ++ enforce(pos <= from, ++ "remove(): incorrect ordering of elements to remove"); ++ if (pass > 0) + { +- move(src.front, tgt.front); ++ for (; pos < from; ++pos, src.popFront(), tgt.popFront()) ++ { ++ move(src.front, tgt.front); ++ } ++ } ++ else ++ { ++ src.popFrontN(from); ++ tgt.popFrontN(from); ++ pos = from; + } + // now skip source to the "to" position + src.popFrontN(delta); +@@ -7358,6 +7673,16 @@ if ((isForwardRange!Range && !isBidirect + + unittest + { ++ // http://d.puremagic.com/issues/show_bug.cgi?id=10173 ++ int[] test = iota(0, 10).array(); ++ assertThrown(remove!(SwapStrategy.stable)(test, tuple(2, 4), tuple(1, 3))); ++ assertThrown(remove!(SwapStrategy.unstable)(test, tuple(2, 4), tuple(1, 3))); ++ assertThrown(remove!(SwapStrategy.stable)(test, 2, 4, 1, 3)); ++ assertThrown(remove!(SwapStrategy.unstable)(test, 2, 4, 1, 3)); ++} ++ ++unittest ++{ + debug(std_algorithm) scope(success) + writeln("unittest @", __FILE__, ":", __LINE__, " done."); + int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; +@@ -7368,11 +7693,15 @@ unittest + + a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; + assert(remove!(SwapStrategy.unstable)(a, 0, 10) == +- [ 9, 1, 2, 3, 4, 5, 6, 7, 8 ]); ++ [ 9, 1, 2, 3, 4, 5, 6, 7, 8 ]); + + a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; + assert(remove!(SwapStrategy.unstable)(a, 0, tuple(9, 11)) == + [ 8, 1, 2, 3, 4, 5, 6, 7 ]); ++ // http://d.puremagic.com/issues/show_bug.cgi?id=5224 ++ a = [ 1, 2, 3, 4 ]; ++ assert(remove!(SwapStrategy.unstable)(a, 2) == ++ [ 1, 2, 4 ]); + + a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; + //writeln(remove!(SwapStrategy.stable)(a, 1, 5)); +@@ -7390,6 +7719,10 @@ unittest + a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; + assert(remove!(SwapStrategy.stable)(a, 1, tuple(3, 5)) + == [ 0, 2, 5, 6, 7, 8, 9, 10]); ++ ++ a = iota(0, 10).array(); ++ assert(remove!(SwapStrategy.unstable)(a, tuple(1, 4), tuple(6, 7)) ++ == [0, 9, 8, 7, 4, 5]); + } + + /** +@@ -7415,7 +7748,7 @@ if (isBidirectionalRange!Range) + { + for (;!range.empty;) + { +- if (!unaryFun!(pred)(range.front)) ++ if (!unaryFun!pred(range.front)) + { + range.popFront(); + continue; +@@ -7857,13 +8190,14 @@ sorted. In addition, it also partitions + $(D e1) from $(D r[0]) to $(D r[nth]) satisfy $(D !less(r[nth], e1)), + and all elements $(D e2) from $(D r[nth]) to $(D r[r.length]) satisfy + $(D !less(e2, r[nth])). Effectively, it finds the nth smallest +-(according to $(D less)) elements in $(D r). Performs $(BIGOH +-r.length) (if unstable) or $(BIGOH r.length * log(r.length)) (if +-stable) evaluations of $(D less) and $(D swap). See also $(WEB ++(according to $(D less)) elements in $(D r). Performs an expected ++$(BIGOH r.length) (if unstable) or $(BIGOH r.length * log(r.length)) ++(if stable) evaluations of $(D less) and $(D swap). See also $(WEB + sgi.com/tech/stl/nth_element.html, STL's nth_element). + +-Example: ++If $(D n >= r.length), the algorithm has no effect. + ++Examples: + ---- + int[] v = [ 25, 7, 9, 2, 0, 5, 21 ]; + auto n = 4; +@@ -7887,14 +8221,10 @@ void topN(alias less = "a < b", + "Stable topN not yet implemented"); + while (r.length > nth) + { +- auto pivot = r.length / 2; ++ auto pivot = uniform(0, r.length); + swap(r[pivot], r.back); + assert(!binaryFun!(less)(r.back, r.back)); +- bool pred(ElementType!(Range) a) +- { +- return binaryFun!(less)(a, r.back); +- } +- auto right = partition!(pred, ss)(r); ++ auto right = partition!((a) => binaryFun!less(a, r.back), ss)(r); + assert(right.length >= 1); + swap(right.front, r.back); + pivot = r.length - right.length; +@@ -8002,15 +8332,13 @@ void topN(alias less = "a < b", + } + } + ++/// Ditto + unittest + { +- debug(std_algorithm) scope(success) +- writeln("unittest @", __FILE__, ":", __LINE__, " done."); + int[] a = [ 5, 7, 2, 6, 7 ]; + int[] b = [ 2, 1, 5, 6, 7, 3, 0 ]; + topN(a, b); + sort(a); +- sort(b); + assert(a == [0, 1, 2, 2, 3]); + } + +@@ -8078,17 +8406,12 @@ sort(alias less = "a < b", SwapStrategy + quickSortImpl!(lessFun)(r); + else //use Tim Sort for semistable & stable + TimSortImpl!(lessFun, Range).sort(r, null); +- static if (is(typeof(text(r)))) +- { +- enum maxLen = 8; +- assert(isSorted!lessFun(r), text("Failed to sort range of type ", +- Range.stringof, ". Actual result is: ", +- r[0 .. r.length > maxLen ? maxLen : r.length ], +- r.length > maxLen ? "..." : "")); +- } +- else +- assert(isSorted!lessFun(r), text("Unable to sort range of type ", +- Range.stringof, ": ")); ++ ++ enum maxLen = 8; ++ assert(isSorted!lessFun(r), text("Failed to sort range of type ", ++ Range.stringof, ". Actual result is: ", ++ r[0 .. r.length > maxLen ? maxLen : r.length ], ++ r.length > maxLen ? "..." : "")); + } + else + { +@@ -8141,6 +8464,13 @@ unittest + auto b = rndstuff!(string)(); + sort!("toLower(a) < toLower(b)")(b); + assert(isSorted!("toUpper(a) < toUpper(b)")(b)); ++ ++ { ++ // Issue 10317 ++ enum E_10317 { a, b } ++ auto a_10317 = new E_10317[10]; ++ sort(a_10317); ++ } + } + + private template validPredicates(E, less...) { +@@ -9012,8 +9342,7 @@ corresponding $(D sort), but $(D schwart + transform) only $(D r.length) times (less than half when compared to + regular sorting). The usage can be best illustrated with an example. + +-Example: +- ++Examples: + ---- + uint hashFun(string) { ... expensive computation ... } + string[] array = ...; +@@ -9033,24 +9362,59 @@ To check whether an array was sorted and + Schwartz sorting, a function $(D schwartzIsSorted) is not provided + because the effect can be achieved by calling $(D + isSorted!less(map!transform(r))). ++ ++Returns: The initial range wrapped as a $(D SortedRange) with the ++predicate $(D (a, b) => binaryFun!less(transform(a), ++transform(b))). + */ +-void schwartzSort(alias transform, alias less = "a < b", +- SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) +- if (isRandomAccessRange!(Range) && hasLength!(Range)) ++SortedRange!(R, ((a, b) => binaryFun!less(unaryFun!transform(a), ++ unaryFun!transform(b)))) ++schwartzSort(alias transform, alias less = "a < b", ++ SwapStrategy ss = SwapStrategy.unstable, R)(R r) ++ if (isRandomAccessRange!R && hasLength!R) + { +- alias typeof(transform(r.front)) XformType; +- auto xform = new XformType[r.length]; +- foreach (i, e; r) ++ import core.stdc.stdlib; ++ alias T = typeof(unaryFun!transform(r.front)); ++ auto xform1 = (cast(T*) malloc(r.length * T.sizeof))[0 .. r.length]; ++ size_t length; ++ scope(exit) + { +- xform[i] = transform(e); ++ static if (hasElaborateDestructor!T) ++ { ++ foreach (i; 0 .. length) collectException(destroy(xform1[i])); ++ } ++ free(xform1.ptr); ++ } ++ for (; length != r.length; ++length) ++ { ++ emplace(xform1.ptr + length, unaryFun!transform(r[length])); + } +- auto z = zip(xform, r); +- alias typeof(z.front) ProxyType; +- bool myLess(ProxyType a, ProxyType b) ++ // Make sure we use ubyte[] and ushort[], not char[] and wchar[] ++ // for the intermediate array, lest zip gets confused. ++ static if (isNarrowString!(typeof(xform1))) + { +- return binaryFun!less(a[0], b[0]); ++ auto xform = xform1.representation(); + } +- sort!(myLess, ss)(z); ++ else ++ { ++ alias xform = xform1; ++ } ++ zip(xform, r).sort!((a, b) => binaryFun!less(a[0], b[0]), ss)(); ++ return typeof(return)(r); ++} ++ ++unittest ++{ ++ // issue 4909 ++ Tuple!(char)[] chars; ++ schwartzSort!"a[0]"(chars); ++} ++ ++unittest ++{ ++ // issue 5924 ++ Tuple!(char)[] chars; ++ schwartzSort!((Tuple!(char) c){ return c[0]; })(chars); + } + + unittest +@@ -9234,7 +9598,7 @@ bool isSorted(alias less = "a < b", Rang + ahead.popFront(); + size_t i; + +- for (; !ahead.empty; ahead.popFront(), ++i) ++ for (; !ahead.empty; ahead.popFront(), r.popFront(), ++i) + { + if (!binaryFun!less(ahead.front, r.front)) continue; + // Check for antisymmetric predicate +@@ -9250,6 +9614,26 @@ bool isSorted(alias less = "a < b", Rang + return true; + } + ++unittest ++{ ++ // Issue 9457 ++ auto x = "abcd"; ++ assert(isSorted(x)); ++ auto y = "acbd"; ++ assert(!isSorted(y)); ++ ++ int[] a = [1, 2, 3]; ++ assert(isSorted(a)); ++ int[] b = [1, 3, 2]; ++ assert(!isSorted(b)); ++ ++ dchar[] ds = "コーヒーが好きです"d.dup; ++ sort(ds); ++ string s = to!string(ds); ++ assert(isSorted(ds)); // random-access ++ assert(isSorted(s)); // bidirectional ++} ++ + // makeIndex + /** + Computes an index for $(D r) based on the comparison $(D less). The +@@ -9264,15 +9648,23 @@ extra indirection, and is always larger + because it needs space for the index in addition to the original + collection. The complexity is the same as $(D sort)'s. + +-$(D makeIndex) overwrites its second argument with the result, but +-never reallocates it. If the second argument's length is less than +-that of the range indexed, an exception is thrown. +- + The first overload of $(D makeIndex) writes to a range containing + pointers, and the second writes to a range containing offsets. The + first overload requires $(D Range) to be a forward range, and the + latter requires it to be a random-access range. + ++$(D makeIndex) overwrites its second argument with the result, but ++never reallocates it. ++ ++Returns: The pointer-based version returns a $(D SortedRange) wrapper ++over index, of type $(D SortedRange!(RangeIndex, (a, b) => ++binaryFun!less(*a, *b))) thus reflecting the ordering of the ++index. The index-based version returns $(D void) because the ordering ++relation involves not only $(D index) but also $(D r). ++ ++Throws: If the second argument's length is less than that of the range ++indexed, an exception is thrown. ++ + Example: + ---- + immutable(int[]) arr = [ 2, 3, 1, 5, 0 ]; +@@ -9288,7 +9680,8 @@ assert(isSorted! + (index2)); + ---- + */ +-void makeIndex( ++SortedRange!(RangeIndex, (a, b) => binaryFun!less(*a, *b)) ++makeIndex( + alias less = "a < b", + SwapStrategy ss = SwapStrategy.unstable, + Range, +@@ -9300,15 +9693,11 @@ void makeIndex( + // assume collection already ordered + size_t i; + for (; !r.empty; r.popFront(), ++i) +- index[i] = &(r.front); ++ index[i] = addressOf(r.front); + enforce(index.length == i); + // sort the index +- static bool indirectLess(ElementType!(RangeIndex) a, +- ElementType!(RangeIndex) b) +- { +- return binaryFun!(less)(*a, *b); +- } +- sort!(indirectLess, ss)(index); ++ sort!((a, b) => binaryFun!less(*a, *b), ss)(index); ++ return typeof(return)(index); + } + + /// Ditto +@@ -9318,32 +9707,28 @@ void makeIndex( + Range, + RangeIndex) + (Range r, RangeIndex index) +- if (isRandomAccessRange!(Range) && !isInfinite!(Range) && +- isRandomAccessRange!(RangeIndex) && !isInfinite!(RangeIndex) && +- isIntegral!(ElementType!(RangeIndex))) ++if (isRandomAccessRange!Range && !isInfinite!Range && ++ isRandomAccessRange!RangeIndex && !isInfinite!RangeIndex && ++ isIntegral!(ElementType!RangeIndex)) + { +- alias Unqual!(ElementType!RangeIndex) I; ++ alias Unqual!(ElementType!RangeIndex) IndexType; + enforce(r.length == index.length, + "r and index must be same length for makeIndex."); +- static if (I.sizeof < size_t.sizeof) ++ static if (IndexType.sizeof < size_t.sizeof) + { +- enforce(r.length <= I.max, "Cannot create an index with " ~ +- "element type " ~ I.stringof ~ " with length " ~ +- to!string(r.length) ~ "." +- ); ++ enforce(r.length <= IndexType.max, "Cannot create an index with " ~ ++ "element type " ~ IndexType.stringof ~ " with length " ~ ++ to!string(r.length) ~ "."); + } + +- for (I i = 0; i < r.length; ++i) ++ for (IndexType i = 0; i < r.length; ++i) + { + index[cast(size_t) i] = i; + } + + // sort the index +- bool indirectLess(ElementType!(RangeIndex) a, ElementType!(RangeIndex) b) +- { +- return binaryFun!(less)(r[cast(size_t) a], r[cast(size_t) b]); +- } +- sort!(indirectLess, ss)(index); ++ sort!((a, b) => binaryFun!less(r[cast(size_t) a], r[cast(size_t) b]), ss) ++ (index); + } + + unittest +@@ -9643,8 +10028,8 @@ unittest + // random data + auto b = rndstuff!(string)(); + auto index = new string*[b.length]; +- partialIndex!("std.uni.toUpper(a) < std.uni.toUpper(b)")(b, index); +- assert(isSorted!("std.uni.toUpper(*a) < std.uni.toUpper(*b)")(index)); ++ partialIndex!((a, b) => std.uni.toUpper(a) < std.uni.toUpper(b))(b, index); ++ assert(isSorted!((a, b) => std.uni.toUpper(*a) < std.uni.toUpper(*b))(index)); + + // random data with indexes + auto index1 = new size_t[b.length]; +@@ -9825,30 +10210,8 @@ unittest + { + assert(all!"a & 1"([1, 3, 5, 7, 9])); + assert(!all!"a & 1"([1, 2, 3, 5, 7, 9])); +-} +- +-// Deprecated. It will be removed in January 2013. Use std.range.SortedRange.canFind. +-deprecated("Please use std.range.SortedRange.canFind instead.") +-bool canFindSorted(alias pred = "a < b", Range, V)(Range range, V value) { +- return assumeSorted!pred(range).canFind!V(value); +-} +- +-// Deprecated. It will be removed in January 2013. Use std.range.SortedRange.lowerBound. +-deprecated("Please use std.range.SortedRange.lowerBound instead.") +-Range lowerBound(alias pred = "a < b", Range, V)(Range range, V value) { +- return assumeSorted!pred(range).lowerBound!V(value).release; +-} +- +-// Deprecated. It will be removed in January 2013. Use std.range.SortedRange.upperBound. +-deprecated("Please use std.range.SortedRange.upperBound instead.") +-Range upperBound(alias pred = "a < b", Range, V)(Range range, V value) { +- return assumeSorted!pred(range).upperBound!V(value).release; +-} +- +-// Deprecated. It will be removed in January 2013. Use std.range.SortedRange.equalRange. +-deprecated("Please use std.range.SortedRange.equalRange instead.") +-Range equalRange(alias pred = "a < b", Range, V)(Range range, V value) { +- return assumeSorted!pred(range).equalRange!V(value).release; ++ int x = 1; ++ assert(all!(a => a > x)([2, 3])); + } + + /** +@@ -11399,8 +11762,6 @@ unittest + // And therefore, by set comprehension, XY == Expected + } + +-// FIXME: this unittest has been disabled because of issue 8542. +-version(none) + unittest + { + auto N = sequence!"n"(0); +--- a/src/libphobos/src/std/array.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/array.d 2014-04-01 16:32:51.000000000 +0100 +@@ -23,35 +23,29 @@ Returns a newly-allocated dynamic array + input range, static array, dynamic array, or class or struct with an + $(D opApply) function $(D r). Note that narrow strings are handled as + a special case in an overload. +- +-Example: +- +-$(D_RUN_CODE +-$(ARGS +----- +-auto a = array([1, 2, 3, 4, 5][]); +-assert(a == [ 1, 2, 3, 4, 5 ]); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + ForeachType!Range[] array(Range)(Range r) +-if (isIterable!Range && !isNarrowString!Range) ++if (isIterable!Range && !isNarrowString!Range && !isInfinite!Range) + { + alias ForeachType!Range E; + static if (hasLength!Range) + { + if(r.length == 0) return null; +- +- auto result = uninitializedArray!(Unqual!(E)[])(r.length); +- ++ //@@@BUG@@@ 10928 should be lambda ++ static @trusted nothrow auto trustedAllocateArray(size_t n) ++ { ++ return uninitializedArray!(Unqual!E[])(n); ++ } ++ auto result = trustedAllocateArray(r.length); + size_t i = 0; + foreach (e; r) + { + // hacky +- static if (is(typeof(e.opAssign(e)))) ++ static if (is(typeof(result[i].opAssign(e))) || ++ !is(typeof(result[i] = e))) + { + // this should be in-place construction +- emplace!E(result.ptr + i, e); ++ emplace(result.ptr + i, e); + } + else + { +@@ -72,6 +66,41 @@ if (isIterable!Range && !isNarrowString! + } + } + ++/// ++@safe pure nothrow unittest ++{ ++ auto a = array([1, 2, 3, 4, 5][]); ++ assert(a == [ 1, 2, 3, 4, 5 ]); ++} ++ ++@safe pure nothrow unittest ++{ ++ struct Foo ++ { ++ int a; ++ } ++ auto a = array([Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)][]); ++ assert(equal(a, [Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)])); ++} ++ ++@system unittest ++{ ++ struct Foo ++ { ++ int a; ++ auto opAssign(Foo foo) ++ { ++ assert(0); ++ } ++ auto opEquals(Foo foo) ++ { ++ return a == foo.a; ++ } ++ } ++ auto a = array([Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)][]); ++ assert(equal(a, [Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)])); ++} ++ + /** + Convert a narrow string to an array type that fully supports random access. + This is handled as a special case and always returns a $(D dchar[]), +@@ -151,12 +180,12 @@ unittest + assert(array(b) == a); + + //To verify that the opAssign branch doesn't get screwed up by using Unqual. ++ //EDIT: array no longer calls opAssign. + struct S + { + ref S opAssign(S)(const ref S rhs) + { +- i = rhs.i; +- return this; ++ assert(0); + } + + int i; +@@ -169,26 +198,54 @@ unittest + } + } + ++unittest ++{ ++ //9824 ++ static struct S ++ { ++ @disable void opAssign(S); ++ int i; ++ } ++ auto arr = [S(0), S(1), S(2)]; ++ arr.array(); ++} ++ ++// Bugzilla 10220 ++unittest ++{ ++ import std.algorithm : equal; ++ import std.range : repeat; ++ ++ static struct S ++ { ++ int val; ++ ++ @disable this(); ++ this(int v) { val = v; } ++ } ++ assertCTFEable!( ++ { ++ auto r = S(1).repeat(2).array(); ++ assert(equal(r, [S(1), S(1)])); ++ }); ++} ++ ++unittest ++{ ++ //Turn down infinity: ++ static assert(!is(typeof( ++ repeat(1).array() ++ ))); ++} ++ + /** + Returns a newly allocated associative array out of elements of the input range, + which must be a range of tuples (Key, Value). +- +-Example: +- +-$(D_RUN_CODE +-$(ARGS +----- +-auto a = assocArray(zip([0, 1, 2], ["a", "b", "c"])); +-assert(a == [0:"a", 1:"b", 2:"c"]); +-auto b = assocArray([ tuple("foo", "bar"), tuple("baz", "quux") ]); +-assert(b == ["foo":"bar", "baz":"quux"]); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + + auto assocArray(Range)(Range r) +- if (isInputRange!Range && isTuple!(ElementType!Range) +- && ElementType!Range.length == 2) ++ if (isInputRange!Range && isTuple!(ElementType!Range) && ++ ElementType!Range.length == 2) + { + alias ElementType!Range.Types[0] KeyType; + alias ElementType!Range.Types[1] ValueType; +@@ -198,19 +255,24 @@ auto assocArray(Range)(Range r) + return aa; + } + ++/// ++/*@safe*/ pure /*nothrow*/ unittest ++{ ++ auto a = assocArray(zip([0, 1, 2], ["a", "b", "c"])); ++ assert(is(typeof(a) == string[int])); ++ assert(a == [0:"a", 1:"b", 2:"c"]); ++ ++ auto b = assocArray([ tuple("foo", "bar"), tuple("baz", "quux") ]); ++ assert(is(typeof(b) == string[string])); ++ assert(b == ["foo":"bar", "baz":"quux"]); ++} ++ ++/// @@@11053@@@ - Cannot be version(unittest) - recursive instantiation error + unittest + { + static assert(!__traits(compiles, [ tuple("foo", "bar", "baz") ].assocArray())); + static assert(!__traits(compiles, [ tuple("foo") ].assocArray())); +- static assert(__traits(compiles, [ tuple("foo", "bar") ].assocArray())); +- +- auto aa1 = [ tuple("foo", "bar"), tuple("baz", "quux") ].assocArray(); +- assert(is(typeof(aa1) == string[string])); +- assert(aa1 == ["foo":"bar", "baz":"quux"]); +- +- auto aa2 = zip([0, 1, 2], ["a", "b", "c"]).assocArray(); +- assert(is(typeof(aa2) == string[int])); +- assert(aa2 == [0:"a", 1:"b", 2:"c"]); ++ static assert( __traits(compiles, [ tuple("foo", "bar") ].assocArray())); + } + + private template blockAttribute(T) +@@ -224,7 +286,8 @@ private template blockAttribute(T) + enum blockAttribute = GC.BlkAttr.NO_SCAN; + } + } +-unittest { ++version(unittest) ++{ + static assert(!(blockAttribute!void & GC.BlkAttr.NO_SCAN)); + } + +@@ -241,7 +304,8 @@ private template nDimensions(T) + } + } + +-unittest { ++version(unittest) ++{ + static assert(nDimensions!(uint[]) == 1); + static assert(nDimensions!(float[][]) == 2); + } +@@ -252,19 +316,6 @@ without initializing its elements. This + element will be immediately initialized. $(D T) may be a multidimensional + array. In this case sizes may be specified for any number of dimensions from 1 + to the number in $(D T). +- +-Examples: +-$(D_RUN_CODE +-$(ARGS +---- +-double[] arr = uninitializedArray!(double[])(100); +-assert(arr.length == 100); +- +-double[][] matrix = uninitializedArray!(double[][])(42, 31); +-assert(matrix.length == 42); +-assert(matrix[0].length == 31); +---- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + auto uninitializedArray(T, I...)(I sizes) + if(allSatisfy!(isIntegral, I)) +@@ -272,6 +323,7 @@ if(allSatisfy!(isIntegral, I)) + return arrayAllocImpl!(false, T, I)(sizes); + } + ++/// + unittest + { + double[] arr = uninitializedArray!(double[])(100); +@@ -293,7 +345,7 @@ if(allSatisfy!(isIntegral, I)) + return arrayAllocImpl!(true, T, I)(sizes); + } + +-unittest ++@safe unittest + { + double[] arr = minimallyInitializedArray!(double[])(100); + assert(arr.length == 100); +@@ -318,7 +370,21 @@ if(allSatisfy!(isIntegral, I)) + + alias typeof(T.init[0]) E; + +- auto ptr = cast(E*) GC.malloc(sizes[0] * E.sizeof, blockAttribute!(E)); ++ auto ptr = (__ctfe) ? ++ { ++ static if(__traits(compiles, new E[1])) ++ { ++ return (new E[sizes[0]]).ptr; ++ } ++ else ++ { ++ E[] arr; ++ foreach (i; 0 .. sizes[0]) ++ arr ~= E.init; ++ return arr.ptr; ++ } ++ }() : ++ cast(E*) GC.malloc(sizes[0] * E.sizeof, blockAttribute!(E)); + auto ret = ptr[0..sizes[0]]; + + static if(sizes.length > 1) +@@ -341,16 +407,6 @@ Implements the range interface primitive + arrays. Due to the fact that nonmember functions can be called with + the first argument using the dot notation, $(D array.empty) is + equivalent to $(D empty(array)). +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-auto a = [ 1, 2, 3 ]; +-assert(!a.empty); +-assert(a[3 .. $].empty); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + + @property bool empty(T)(in T[] a) @safe pure nothrow +@@ -358,7 +414,8 @@ assert(a[3 .. $].empty); + return !a.length; + } + +-unittest ++/// ++@safe pure nothrow unittest + { + auto a = [ 1, 2, 3 ]; + assert(!a.empty); +@@ -371,16 +428,6 @@ arrays. Due to the fact that nonmember f + the first argument using the dot notation, $(D array.save) is + equivalent to $(D save(array)). The function does not duplicate the + content of the array, it simply returns its argument. +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-auto a = [ 1, 2, 3 ]; +-auto b = a.save; +-assert(b is a); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + + @property T[] save(T)(T[] a) @safe pure nothrow +@@ -388,6 +435,13 @@ assert(b is a); + return a; + } + ++/// ++@safe pure nothrow unittest ++{ ++ auto a = [ 1, 2, 3 ]; ++ auto b = a.save; ++ assert(b is a); ++} + /** + Implements the range interface primitive $(D popFront) for built-in + arrays. Due to the fact that nonmember functions can be called with +@@ -395,41 +449,34 @@ the first argument using the dot notatio + equivalent to $(D popFront(array)). For $(GLOSSARY narrow strings), + $(D popFront) automaticaly advances to the next $(GLOSSARY code + point). +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-int[] a = [ 1, 2, 3 ]; +-a.popFront(); +-assert(a == [ 2, 3 ]); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + +-void popFront(A)(ref A a) +-if (!isNarrowString!A && isDynamicArray!A && isMutable!A && !is(A == void[])) ++void popFront(T)(ref T[] a) @safe pure nothrow ++if (!isNarrowString!(T[]) && !is(T[] == void[])) + { +- assert(a.length, "Attempting to popFront() past the end of an array of " +- ~ typeof(a[0]).stringof); ++ assert(a.length, "Attempting to popFront() past the end of an array of " ~ T.stringof); + a = a[1 .. $]; + } + +-unittest ++/// ++@safe pure nothrow unittest + { + auto a = [ 1, 2, 3 ]; + a.popFront(); + assert(a == [ 2, 3 ]); +- static assert(!__traits(compiles, popFront!(immutable int[])())); +- static assert(!__traits(compiles, popFront!(void[])())); ++} ++ ++version(unittest) ++{ ++ static assert(!is(typeof({ int[4] a; popFront(a); }))); ++ static assert(!is(typeof({ immutable int[] a; popFront(a); }))); ++ static assert(!is(typeof({ void[] a; popFront(a); }))); + } + + // Specialization for narrow strings. The necessity of +-// !isStaticArray!A suggests a compiler @@@BUG@@@. +-void popFront(S)(ref S str) @trusted pure nothrow +-if (isNarrowString!S && isMutable!S && !isStaticArray!S) ++void popFront(C)(ref C[] str) @trusted pure nothrow ++if (isNarrowString!(C[])) + { +- alias ElementEncodingType!S C; + assert(str.length, "Attempting to popFront() past the end of an array of " ~ C.stringof); + + static if(is(Unqual!C == char)) +@@ -460,26 +507,14 @@ if (isNarrowString!S && isMutable!S && ! + else static assert(0, "Bad template constraint."); + } + +-version(unittest) C[] _eatString(C)(C[] str) +-{ +- while(!str.empty) +- str.popFront(); +- +- return str; +-} +- +-unittest ++@safe pure unittest + { +- string s1 = "\xC2\xA9hello"; +- s1.popFront(); +- assert(s1 == "hello"); +- wstring s2 = "\xC2\xA9hello"; +- s2.popFront(); +- assert(s2 == "hello"); +- string s3 = "\u20AC100"; +- + foreach(S; TypeTuple!(string, wstring, dstring)) + { ++ S s = "\xC2\xA9hello"; ++ s.popFront(); ++ assert(s == "hello"); ++ + S str = "hello\U00010143\u0100\U00010143"; + foreach(dchar c; ['h', 'e', 'l', 'l', 'o', '\U00010143', '\u0100', '\U00010143']) + { +@@ -487,11 +522,18 @@ unittest + str.popFront(); + } + assert(str.empty); ++ ++ static assert(!is(typeof({ immutable S a; popFront(a); }))); ++ static assert(!is(typeof({ typeof(S.init[0])[4] a; popFront(a); }))); + } + +- static assert(!is(typeof(popFront!(immutable string)))); +- static assert(!is(typeof(popFront!(char[4])))); ++ C[] _eatString(C)(C[] str) ++ { ++ while(!str.empty) ++ str.popFront(); + ++ return str; ++ } + enum checkCTFE = _eatString("ウェブサイト@La_Verité.com"); + static assert(checkCTFE.empty); + enum checkCTFEW = _eatString("ウェブサイト@La_Verité.com"w); +@@ -504,45 +546,39 @@ arrays. Due to the fact that nonmember f + the first argument using the dot notation, $(D array.popBack) is + equivalent to $(D popBack(array)). For $(GLOSSARY narrow strings), $(D + popFront) automaticaly eliminates the last $(GLOSSARY code point). +- +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-int[] a = [ 1, 2, 3 ]; +-a.popBack(); +-assert(a == [ 1, 2 ]); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + +-void popBack(A)(ref A a) +-if (isDynamicArray!A && !isNarrowString!A && isMutable!A && !is(A == void[])) ++void popBack(T)(ref T[] a) @safe pure nothrow ++if (!isNarrowString!(T[]) && !is(T[] == void[])) + { + assert(a.length); + a = a[0 .. $ - 1]; + } + +-unittest ++/// ++@safe pure nothrow unittest + { + auto a = [ 1, 2, 3 ]; + a.popBack(); + assert(a == [ 1, 2 ]); +- static assert(!__traits(compiles, popBack!(immutable int[]))); +- static assert(!__traits(compiles, popBack!(void[]))); ++} ++ ++version(unittest) ++{ ++ static assert(!is(typeof({ immutable int[] a; popBack(a); }))); ++ static assert(!is(typeof({ int[4] a; popBack(a); }))); ++ static assert(!is(typeof({ void[] a; popBack(a); }))); + } + + // Specialization for arrays of char +-@trusted void popBack(A)(ref A a) +- if(isNarrowString!A && isMutable!A) ++void popBack(T)(ref T[] a) @safe pure ++if (isNarrowString!(T[])) + { +- assert(a.length, "Attempting to popBack() past the front of an array of " ~ +- typeof(a[0]).stringof); +- a = a[0 .. $ - std.utf.strideBack(a, a.length)]; ++ assert(a.length, "Attempting to popBack() past the front of an array of " ~ T.stringof); ++ a = a[0 .. $ - std.utf.strideBack(a, $)]; + } + +-unittest ++@safe pure unittest + { + foreach(S; TypeTuple!(string, wstring, dstring)) + { +@@ -563,7 +599,8 @@ unittest + } + assert(str.empty); + +- static assert(!__traits(compiles, popBack!(immutable S))); ++ static assert(!is(typeof({ immutable S a; popBack(a); }))); ++ static assert(!is(typeof({ typeof(S.init[0])[4] a; popBack(a); }))); + } + } + +@@ -574,34 +611,22 @@ the first argument using the dot notatio + equivalent to $(D front(array)). For $(GLOSSARY narrow strings), $(D + front) automaticaly returns the first $(GLOSSARY code point) as a $(D + dchar). +- +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-int[] a = [ 1, 2, 3 ]; +-assert(a.front == 1); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ +-@property ref T front(T)(T[] a) ++@property ref T front(T)(T[] a) @safe pure nothrow + if (!isNarrowString!(T[]) && !is(T[] == void[])) + { +- assert(a.length, "Attempting to fetch the front of an empty array of " ~ +- typeof(a[0]).stringof); ++ assert(a.length, "Attempting to fetch the front of an empty array of " ~ T.stringof); + return a[0]; + } + +-@property dchar front(A)(A a) if (isNarrowString!A) ++/// ++@safe pure nothrow unittest + { +- assert(a.length, "Attempting to fetch the front of an empty array of " ~ +- typeof(a[0]).stringof); +- size_t i = 0; +- return decode(a, i); ++ int[] a = [ 1, 2, 3 ]; ++ assert(a.front == 1); + } + +-unittest ++@safe pure nothrow unittest + { + auto a = [ 1, 2 ]; + a.front = 4; +@@ -610,6 +635,16 @@ unittest + + immutable b = [ 1, 2 ]; + assert(b.front == 1); ++ ++ int[2] c = [ 1, 2 ]; ++ assert(c.front == 1); ++} ++ ++@property dchar front(T)(T[] a) @safe pure if (isNarrowString!(T[])) ++{ ++ assert(a.length, "Attempting to fetch the front of an empty array of " ~ T.stringof); ++ size_t i = 0; ++ return decode(a, i); + } + + /** +@@ -619,40 +654,35 @@ the first argument using the dot notatio + equivalent to $(D back(array)). For $(GLOSSARY narrow strings), $(D + back) automaticaly returns the last $(GLOSSARY code point) as a $(D + dchar). +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-int[] a = [ 1, 2, 3 ]; +-assert(a.back == 3); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ +-@property ref T back(T)(T[] a) if (!isNarrowString!(T[])) ++@property ref T back(T)(T[] a) @safe pure nothrow if (!isNarrowString!(T[])) + { +- assert(a.length, "Attempting to fetch the back of an empty array of " ~ +- typeof(a[0]).stringof); ++ assert(a.length, "Attempting to fetch the back of an empty array of " ~ T.stringof); + return a[$ - 1]; + } + +-unittest ++/// ++@safe pure nothrow unittest + { + int[] a = [ 1, 2, 3 ]; + assert(a.back == 3); + a.back += 4; + assert(a.back == 7); ++} + ++@safe pure nothrow unittest ++{ + immutable b = [ 1, 2, 3 ]; + assert(b.back == 3); ++ ++ int[3] c = [ 1, 2, 3 ]; ++ assert(c.back == 3); + } + + // Specialization for strings +-@property dchar back(A)(A a) +- if(isDynamicArray!A && isNarrowString!A) ++@property dchar back(T)(T[] a) @safe pure if (isNarrowString!(T[])) + { +- assert(a.length, "Attempting to fetch the back of an empty array of " ~ +- typeof(a[0]).stringof); ++ assert(a.length, "Attempting to fetch the back of an empty array of " ~ T.stringof); + size_t i = a.length - std.utf.strideBack(a, a.length); + return decode(a, i); + } +@@ -664,19 +694,6 @@ Returns the overlapping portion, if any, + equal), $(D overlap) only compares the pointers in the ranges, not the + values referred by them. If $(D r1) and $(D r2) have an overlapping + slice, returns that slice. Otherwise, returns the null slice. +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-int[] a = [ 10, 11, 12, 13, 14 ]; +-int[] b = a[1 .. 3]; +-assert(overlap(a, b) == [ 11, 12 ]); +-b = b.dup; +-// overlap disappears even though the content is the same +-assert(overlap(a, b).empty); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) @trusted pure nothrow + { +@@ -689,7 +706,18 @@ inout(T)[] overlap(T)(inout(T)[] r1, ino + return b < e ? b[0 .. e - b] : null; + } + +-unittest ++/// ++@safe pure /*nothrow*/ unittest ++{ ++ int[] a = [ 10, 11, 12, 13, 14 ]; ++ int[] b = a[1 .. 3]; ++ assert(overlap(a, b) == [ 11, 12 ]); ++ b = b.dup; ++ // overlap disappears even though the content is the same ++ assert(overlap(a, b).empty); ++} ++ ++/*@safe nothrow*/ unittest + { + static void test(L, R)(L l, R r) + { +@@ -716,6 +744,25 @@ unittest + assert(overlap(c, d.idup).empty); + } + ++@safe pure nothrow unittest // bugzilla 9836 ++{ ++ // range primitives for array should work with alias this types ++ struct Wrapper ++ { ++ int[] data; ++ alias data this; ++ ++ @property Wrapper save() { return this; } ++ } ++ auto w = Wrapper([1,2,3,4]); ++ std.array.popFront(w); // should work ++ ++ static assert(isInputRange!Wrapper); ++ static assert(isForwardRange!Wrapper); ++ static assert(isBidirectionalRange!Wrapper); ++ static assert(isRandomAccessRange!Wrapper); ++} ++ + /+ + Commented out until the insert which has been deprecated has been removed. + I'd love to just remove it in favor of insertInPlace, but then code would then +@@ -728,15 +775,12 @@ it's commented out. + must be an input range or a single item) inserted at position $(D pos). + + Examples: +-$(D_RUN_CODE +-$(ARGS +--------------------- +-int[] a = [ 1, 2, 3, 4 ]; +-auto b = a.insert(2, [ 1, 2 ]); +-assert(a == [ 1, 2, 3, 4 ]); +-assert(b == [ 1, 2, 1, 2, 3, 4 ]); +--------------------- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) ++ -------------------- ++ int[] a = [ 1, 2, 3, 4 ]; ++ auto b = a.insert(2, [ 1, 2 ]); ++ assert(a == [ 1, 2, 3, 4 ]); ++ assert(b == [ 1, 2, 1, 2, 3, 4 ]); ++ -------------------- + +/ + T[] insert(T, Range)(T[] array, size_t pos, Range stuff) + if(isInputRange!Range && +@@ -848,17 +892,14 @@ private void copyBackwards(T)(T[] src, T + Inserts $(D stuff) (which must be an input range or any number of + implicitly convertible items) in $(D array) at position $(D pos). + +-Example: +-$(D_RUN_CODE +-$(ARGS +---- +-int[] a = [ 1, 2, 3, 4 ]; +-a.insertInPlace(2, [ 1, 2 ]); +-assert(a == [ 1, 2, 1, 2, 3, 4 ]); +-a.insertInPlace(3, 10u, 11); +-assert(a == [ 1, 2, 1, 10, 11, 2, 3, 4]); +---- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) ++ Example: ++ --- ++ int[] a = [ 1, 2, 3, 4 ]; ++ a.insertInPlace(2, [ 1, 2 ]); ++ assert(a == [ 1, 2, 1, 2, 3, 4 ]); ++ a.insertInPlace(3, 10u, 11); ++ assert(a == [ 1, 2, 1, 10, 11, 2, 3, 4]); ++ --- + +/ + void insertInPlace(T, U...)(ref T[] array, size_t pos, U stuff) + if(!isSomeString!(T[]) +@@ -1142,14 +1183,13 @@ unittest + + unittest + { +- static int[] testCTFE() ++ assertCTFEable!( + { + int[] a = [1, 2]; + a.insertInPlace(2, 3); + a.insertInPlace(0, -1, 0); +- return a; +- } +- static assert(testCTFE() == [-1, 0, 1, 2, 3]); ++ return a == [-1, 0, 1, 2, 3]; ++ }); + } + + unittest // bugzilla 6874 +@@ -1175,7 +1215,8 @@ unittest // bugzilla 6874 + same place in memory, making one of the arrays a slice of the other which + starts at index $(D 0). + +/ +-pure bool sameHead(T)(T[] lhs, T[] rhs) ++@safe ++pure nothrow bool sameHead(T)(in T[] lhs, in T[] rhs) + { + return lhs.ptr == rhs.ptr; + } +@@ -1186,12 +1227,13 @@ pure bool sameHead(T)(T[] lhs, T[] rhs) + same place in memory, making one of the arrays a slice of the other which + end at index $(D $). + +/ +-pure bool sameTail(T)(T[] lhs, T[] rhs) ++@trusted ++pure nothrow bool sameTail(T)(in T[] lhs, in T[] rhs) + { + return lhs.ptr + lhs.length == rhs.ptr + rhs.length; + } + +-unittest ++@safe pure nothrow unittest + { + foreach(T; TypeTuple!(int[], const(int)[], immutable(int)[], const int[], immutable int[])) + { +@@ -1276,7 +1318,7 @@ unittest + Split the string $(D s) into an array of words, using whitespace as + delimiter. Runs of whitespace are merged together (no empty words are produced). + */ +-S[] split(S)(S s) if (isSomeString!S) ++S[] split(S)(S s) @safe pure if (isSomeString!S) + { + size_t istart; + bool inword = false; +@@ -1325,23 +1367,21 @@ unittest + + /** + Splits a string by whitespace. +- +-Example: +-$(D_RUN_CODE +-$(ARGS +----- +-auto a = " a bcd ef gh "; +-assert(equal(splitter(a), ["", "a", "bcd", "ef", "gh"][])); +----- +-), $(ARGS), $(ARGS), $(ARGS import std.array, std.algorithm: equal;)) + */ +-auto splitter(C)(C[] s) ++auto splitter(C)(C[] s) @safe pure + if(isSomeString!(C[])) + { + return std.algorithm.splitter!(std.uni.isWhite)(s); + } + +-unittest ++/// ++@safe pure unittest ++{ ++ auto a = " a bcd ef gh "; ++ assert(equal(splitter(a), ["", "a", "bcd", "ef", "gh"][])); ++} ++ ++/*@safe*/ pure unittest + { + foreach(S; TypeTuple!(string, wstring, dstring)) + { +@@ -1350,9 +1390,6 @@ unittest + a = ""; + assert(splitter(a).empty); + } +- +- immutable string s = " a bcd ef gh "; +- assert(equal(splitter(s), ["", "a", "bcd", "ef", "gh"][])); + } + + /************************************** +@@ -1425,18 +1462,6 @@ unittest + /++ + Concatenates all of the ranges in $(D ror) together into one array using + $(D sep) as the separator if present. +- +-Examples: +-$(D_RUN_CODE +-$(ARGS +--------------------- +-assert(join(["hello", "silly", "world"], " ") == "hello silly world"); +-assert(join(["hello", "silly", "world"]) == "hellosillyworld"); +- +-assert(join([[1, 2, 3], [4, 5]], [72, 73]) == [1, 2, 3, 72, 73, 4, 5]); +-assert(join([[1, 2, 3], [4, 5]]) == [1, 2, 3, 4, 5]); +--------------------- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + +/ + ElementEncodingType!(ElementType!RoR)[] join(RoR, R)(RoR ror, R sep) + if(isInputRange!RoR && +@@ -1508,8 +1533,8 @@ ElementEncodingType!(ElementType!RoR)[] + return result.data; + } + +-//Verify Examples. +-unittest ++/// ++@safe pure nothrow unittest + { + assert(join(["hello", "silly", "world"], " ") == "hello silly world"); + assert(join(["hello", "silly", "world"]) == "hellosillyworld"); +@@ -1728,16 +1753,13 @@ until then, it's commented out. + (inclusive) to $(D to) (exclusive) with the range $(D stuff). Returns a new + array without changing the contents of $(D subject). + +-Examples: +-$(D_RUN_CODE +-$(ARGS +--------------------- +-auto a = [ 1, 2, 3, 4 ]; +-auto b = a.replace(1, 3, [ 9, 9, 9 ]); +-assert(a == [ 1, 2, 3, 4 ]); +-assert(b == [ 1, 9, 9, 9, 4 ]); +--------------------- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) ++ Examples: ++ -------------------- ++ auto a = [ 1, 2, 3, 4 ]; ++ auto b = a.replace(1, 3, [ 9, 9, 9 ]); ++ assert(a == [ 1, 2, 3, 4 ]); ++ assert(b == [ 1, 9, 9, 9, 4 ]); ++ -------------------- + +/ + T[] replace(T, Range)(T[] subject, size_t from, size_t to, Range stuff) + if(isInputRange!Range && +@@ -1827,15 +1849,12 @@ unittest + (inclusive) to $(D to) (exclusive) with the range $(D stuff). Expands or + shrinks the array as needed. + +-Example: +-$(D_RUN_CODE +-$(ARGS +---- +-int[] a = [ 1, 2, 3, 4 ]; +-a.replaceInPlace(1, 3, [ 9, 9, 9 ]); +-assert(a == [ 1, 9, 9, 9, 4 ]); +---- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) ++ Example: ++ --- ++ int[] a = [ 1, 2, 3, 4 ]; ++ a.replaceInPlace(1, 3, [ 9, 9, 9 ]); ++ assert(a == [ 1, 9, 9, 9, 4 ]); ++ --- + +/ + void replaceInPlace(T, Range)(ref T[] array, size_t from, size_t to, Range stuff) + if(isDynamicArray!Range && +@@ -2057,8 +2076,6 @@ recommended over $(D a ~= data) when app + efficient. + + Example: +-$(D_RUN_CODE +-$(ARGS + ---- + auto app = appender!string(); + string b = "abcdefg"; +@@ -2071,29 +2088,28 @@ app2.put(3); + app2.put([ 4, 5, 6 ]); + assert(app2.data == [ 1, 2, 3, 4, 5, 6 ]); + ---- +-), $(ARGS), $(ARGS), $(ARGS import std.array;)) + */ + struct Appender(A : T[], T) + { + private struct Data + { + size_t capacity; +- Unqual!(T)[] arr; ++ Unqual!T[] arr; + } + + private Data* _data; + +-/** +-Construct an appender with a given array. Note that this does not copy the +-data. If the array has a larger capacity as determined by arr.capacity, +-it will be used by the appender. After initializing an appender on an array, +-appending to the original array will reallocate. +-*/ +- this(T[] arr) ++ /** ++ * Construct an appender with a given array. Note that this does not copy the ++ * data. If the array has a larger capacity as determined by arr.capacity, ++ * it will be used by the appender. After initializing an appender on an array, ++ * appending to the original array will reallocate. ++ */ ++ this(Unqual!T[] arr) @safe pure nothrow + { + // initialize to a given array. + _data = new Data; +- _data.arr = cast(Unqual!(T)[])arr; ++ _data.arr = arr; + + if (__ctfe) + return; +@@ -2101,96 +2117,96 @@ appending to the original array will rea + // We want to use up as much of the block the array is in as possible. + // if we consume all the block that we can, then array appending is + // safe WRT built-in append, and we can use the entire block. +- auto cap = arr.capacity; +- if(cap > arr.length) +- arr.length = cap; ++ auto cap = ()@trusted{ return arr.capacity; }(); ++ if (cap > arr.length) ++ arr = ()@trusted{ return arr.ptr[0 .. cap]; }(); + // we assume no reallocation occurred + assert(arr.ptr is _data.arr.ptr); + _data.capacity = arr.length; + } + +-/** +-Reserve at least newCapacity elements for appending. Note that more elements +-may be reserved than requested. If newCapacity < capacity, then nothing is +-done. +-*/ +- void reserve(size_t newCapacity) +- { +- if(!_data) +- _data = new Data; +- if(_data.capacity < newCapacity) +- { +- // need to increase capacity +- immutable len = _data.arr.length; +- if (__ctfe) +- { +- _data.arr.length = newCapacity; +- _data.arr = _data.arr[0..len]; +- _data.capacity = newCapacity; +- return; +- } +- immutable growsize = (newCapacity - len) * T.sizeof; +- auto u = GC.extend(_data.arr.ptr, growsize, growsize); +- if(u) +- { +- // extend worked, update the capacity +- _data.capacity = u / T.sizeof; +- } +- else +- { +- // didn't work, must reallocate +- auto bi = GC.qalloc(newCapacity * T.sizeof, +- (typeid(T[]).next.flags & 1) ? 0 : GC.BlkAttr.NO_SCAN); +- _data.capacity = bi.size / T.sizeof; +- if(len) +- memcpy(bi.base, _data.arr.ptr, len * T.sizeof); +- _data.arr = (cast(Unqual!(T)*)bi.base)[0..len]; +- // leave the old data, for safety reasons +- } +- } +- } +- +-/** +-Returns the capacity of the array (the maximum number of elements the +-managed array can accommodate before triggering a reallocation). If any +-appending will reallocate, $(D capacity) returns $(D 0). +- */ +- @property size_t capacity() const ++ /** ++ * Reserve at least newCapacity elements for appending. Note that more elements ++ * may be reserved than requested. If newCapacity <= capacity, then nothing is ++ * done. ++ */ ++ void reserve(size_t newCapacity) @safe pure nothrow ++ { ++ immutable cap = _data ? _data.capacity : 0; ++ if (newCapacity > cap) ++ ensureAddable(newCapacity - cap); ++ } ++ ++ /** ++ * Returns the capacity of the array (the maximum number of elements the ++ * managed array can accommodate before triggering a reallocation). If any ++ * appending will reallocate, $(D capacity) returns $(D 0). ++ */ ++ @property size_t capacity() const @safe pure nothrow + { + return _data ? _data.capacity : 0; + } + +-/** +-Returns the managed array. +- */ +- @property inout(T)[] data() inout +- { ++ /** ++ * Returns the managed array. ++ */ ++ @property inout(T)[] data() inout @trusted pure nothrow ++ { ++ /* @trusted operation: ++ * casting Unqual!T[] to inout(T)[] ++ */ + return cast(typeof(return))(_data ? _data.arr : null); + } + + // ensure we can add nelems elements, resizing as necessary +- private void ensureAddable(size_t nelems) ++ private void ensureAddable(size_t nelems) @safe pure nothrow + { +- if(!_data) ++ static size_t newCapacity(size_t newlength) @safe pure nothrow ++ { ++ long mult = 100 + (1000L) / (bsr(newlength * T.sizeof) + 1); ++ // limit to doubling the length, we don't want to grow too much ++ if(mult > 200) ++ mult = 200; ++ auto newext = cast(size_t)((newlength * mult + 99) / 100); ++ return newext > newlength ? newext : newlength; ++ } ++ ++ if (!_data) + _data = new Data; + immutable len = _data.arr.length; + immutable reqlen = len + nelems; +- if (reqlen > _data.capacity) ++ ++ if (()@trusted{ return _data.capacity; }() >= reqlen) ++ return; ++ ++ // need to increase capacity ++ if (__ctfe) + { +- if (__ctfe) ++ static if (__traits(compiles, new Unqual!T[1])) + { + _data.arr.length = reqlen; +- _data.arr = _data.arr[0..len]; +- _data.capacity = reqlen; +- return; + } ++ else ++ { ++ // avoid restriction of @disable this() ++ ()@trusted{ _data.arr = _data.arr[0 .. _data.capacity]; }(); ++ foreach (i; _data.capacity .. reqlen) ++ _data.arr ~= Unqual!T.init; ++ } ++ _data.arr = _data.arr[0 .. len]; ++ _data.capacity = reqlen; ++ } ++ else ++ { + // Time to reallocate. + // We need to almost duplicate what's in druntime, except we + // have better access to the capacity field. + auto newlen = newCapacity(reqlen); + // first, try extending the current block +- auto u = GC.extend(_data.arr.ptr, nelems * T.sizeof, (newlen - len) * T.sizeof); +- if(u) ++ auto u = ()@trusted{ return ++ GC.extend(_data.arr.ptr, nelems * T.sizeof, (newlen - len) * T.sizeof); ++ }(); ++ if (u) + { + // extend worked, update the capacity + _data.capacity = u / T.sizeof; +@@ -2198,52 +2214,47 @@ Returns the managed array. + else + { + // didn't work, must reallocate +- auto bi = GC.qalloc(newlen * T.sizeof, +- (typeid(T[]).next.flags & 1) ? 0 : GC.BlkAttr.NO_SCAN); ++ auto bi = ()@trusted{ return ++ GC.qalloc(newlen * T.sizeof, (typeid(T[]).next.flags & 1) ? 0 : GC.BlkAttr.NO_SCAN); ++ }(); + _data.capacity = bi.size / T.sizeof; +- if(len) +- memcpy(bi.base, _data.arr.ptr, len * T.sizeof); +- _data.arr = (cast(Unqual!(T)*)bi.base)[0..len]; ++ if (len) ++ ()@trusted{ memcpy(bi.base, _data.arr.ptr, len * T.sizeof); }(); ++ _data.arr = ()@trusted{ return (cast(Unqual!T*)bi.base)[0 .. len]; }(); + // leave the old data, for safety reasons + } + } + } + +- private static size_t newCapacity(size_t newlength) +- { +- long mult = 100 + (1000L) / (bsr(newlength * T.sizeof) + 1); +- // limit to doubling the length, we don't want to grow too much +- if(mult > 200) +- mult = 200; +- auto newext = cast(size_t)((newlength * mult + 99) / 100); +- return newext > newlength ? newext : newlength; +- } +- + private template canPutItem(U) + { +- enum bool canPutItem = isImplicitlyConvertible!(U, T) || ++ enum bool canPutItem = ++ isImplicitlyConvertible!(U, T) || + isSomeChar!T && isSomeChar!U; + } +- + private template canPutConstRange(Range) + { +- enum bool canPutConstRange = isInputRange!(Unqual!Range) && ++ enum bool canPutConstRange = ++ isInputRange!(Unqual!Range) && + !isInputRange!Range; + } +- + private template canPutRange(Range) + { +- enum bool canPutRange = isInputRange!Range && ++ enum bool canPutRange = ++ isInputRange!Range && + is(typeof(Appender.init.put(Range.init.front))); + } + +-/** +-Appends one item to the managed array. +- */ ++ /** ++ * Appends one item to the managed array. ++ */ + void put(U)(U item) if (canPutItem!U) + { + static if (isSomeChar!T && isSomeChar!U && T.sizeof < U.sizeof) + { ++ /* may throwable operation: ++ * - std.utf.encode ++ */ + // must do some transcoding around here + Unqual!T[T.sizeof == 1 ? 4 : 2] encoded; + auto len = std.utf.encode(encoded, item); +@@ -2253,8 +2264,14 @@ Appends one item to the managed array. + { + ensureAddable(1); + immutable len = _data.arr.length; +- _data.arr.ptr[len] = cast(Unqual!T)item; +- _data.arr = _data.arr.ptr[0 .. len + 1]; ++ //_data.arr.ptr[len] = cast(Unqual!T)item; // assign? emplace? ++ //_data.arr = _data.arr.ptr[0 .. len + 1]; ++ ++ // Cannot return ref because it doesn't work in CTFE ++ ()@trusted{ return _data.arr.ptr[len .. len + 1]; }()[0] ++ = // assign? emplace? ++ ()@trusted{ return cast(Unqual!T)item; } (); ++ ()@trusted{ _data.arr = _data.arr.ptr[0 .. len + 1]; }(); + } + } + +@@ -2265,25 +2282,23 @@ Appends one item to the managed array. + p(items); + } + +-/** +-Appends an entire range to the managed array. +- */ ++ /** ++ * Appends an entire range to the managed array. ++ */ + void put(Range)(Range items) if (canPutRange!Range) + { + // note, we disable this branch for appending one type of char to + // another because we can't trust the length portion. + static if (!(isSomeChar!T && isSomeChar!(ElementType!Range) && +- !is(Range == Unqual!T[]) && +- !is(Range == const(T)[]) && +- !is(Range == immutable(T)[])) && ++ !is(immutable Range == immutable T[])) && + is(typeof(items.length) == size_t)) + { + // optimization -- if this type is something other than a string, + // and we are adding exactly one element, call the version for one + // element. +- static if(!isSomeChar!T) ++ static if (!isSomeChar!T) + { +- if(items.length == 1) ++ if (items.length == 1) + { + put(items.front); + return; +@@ -2294,15 +2309,22 @@ Appends an entire range to the managed a + ensureAddable(items.length); + immutable len = _data.arr.length; + immutable newlen = len + items.length; +- _data.arr = _data.arr.ptr[0..newlen]; +- static if(is(typeof(_data.arr[] = items[]))) ++ _data.arr = ()@trusted{ return _data.arr.ptr[0 .. newlen]; }(); ++ static if (is(typeof(_data.arr[] = items[]))) + { +- _data.arr.ptr[len..newlen] = items[]; ++ ()@trusted{ return _data.arr.ptr[len .. newlen]; }()[] = items[]; + } + else + { +- for(size_t i = len; !items.empty; items.popFront(), ++i) +- _data.arr.ptr[i] = cast(Unqual!T)items.front; ++ for (size_t i = len; !items.empty; items.popFront(), ++i) ++ { ++ //_data.arr.ptr[i] = cast(Unqual!T)items.front; ++ ++ // Cannot return ref because it doesn't work in CTFE ++ ()@trusted{ return _data.arr.ptr[i .. i + 1]; }()[0] ++ = // assign? emplace? ++ ()@trusted{ return cast(Unqual!T)items.front; }(); ++ } + } + } + else +@@ -2316,9 +2338,9 @@ Appends an entire range to the managed a + } + } + +-/** +-Appends one item to the managed array. +- */ ++ /** ++ * Appends one item to the managed array. ++ */ + void opOpAssign(string op : "~", U)(U item) if (canPutItem!U) + { + put(item); +@@ -2330,42 +2352,43 @@ Appends one item to the managed array. + put(items); + } + +-/** +-Appends an entire range to the managed array. +- */ ++ /** ++ * Appends an entire range to the managed array. ++ */ + void opOpAssign(string op : "~", Range)(Range items) if (canPutRange!Range) + { + put(items); + } + + // only allow overwriting data on non-immutable and non-const data +- static if(!is(T == immutable) && !is(T == const)) ++ static if (isMutable!T) + { +-/** +-Clears the managed array. This allows the elements of the array to be reused +-for appending. +- +-Note that clear is disabled for immutable or const element types, due to the +-possibility that $(D Appender) might overwrite immutable data. +-*/ +- void clear() ++ /** ++ * Clears the managed array. This allows the elements of the array to be reused ++ * for appending. ++ * ++ * Note that clear is disabled for immutable or const element types, due to the ++ * possibility that $(D Appender) might overwrite immutable data. ++ */ ++ void clear() @safe pure nothrow + { + if (_data) + { +- _data.arr = _data.arr.ptr[0..0]; ++ _data.arr = ()@trusted{ return _data.arr.ptr[0 .. 0]; }(); + } + } + +-/** +-Shrinks the managed array to the given length. Passing in a length that's +-greater than the current array length throws an enforce exception. +-*/ +- void shrinkTo(size_t newlength) ++ /** ++ * Shrinks the managed array to the given length. ++ * ++ * Throws: $(D Exception) if newlength is greater than the current array length. ++ */ ++ void shrinkTo(size_t newlength) @safe pure + { +- if(_data) ++ if (_data) + { + enforce(newlength <= _data.arr.length); +- _data.arr = _data.arr.ptr[0..newlength]; ++ _data.arr = ()@trusted{ return _data.arr.ptr[0 .. newlength]; }(); + } + else + enforce(newlength == 0); +@@ -2374,10 +2397,10 @@ greater than the current array length th + } + + /** +-An appender that can update an array in-place. It forwards all calls to an +-underlying appender implementation. Any calls made to the appender also update +-the pointer to the original array passed in. +-*/ ++ * An appender that can update an array in-place. It forwards all calls to an ++ * underlying appender implementation. Any calls made to the appender also update ++ * the pointer to the original array passed in. ++ */ + struct RefAppender(A : T[], T) + { + private +@@ -2386,16 +2409,16 @@ struct RefAppender(A : T[], T) + T[] *arr; + } + +-/** +-Construct a ref appender with a given array reference. This does not copy the +-data. If the array has a larger capacity as determined by arr.capacity, it +-will be used by the appender. $(D RefAppender) assumes that arr is a non-null +-value. +- +-Note, do not use builtin appending (i.e. ~=) on the original array passed in +-until you are done with the appender, because calls to the appender override +-those appends. +-*/ ++ /** ++ * Construct a ref appender with a given array reference. This does not copy the ++ * data. If the array has a larger capacity as determined by arr.capacity, it ++ * will be used by the appender. $(D RefAppender) assumes that arr is a non-null ++ * value. ++ * ++ * Note, do not use builtin appending (i.e. ~=) on the original array passed in ++ * until you are done with the appender, because calls to the appender override ++ * those appends. ++ */ + this(T[] *arr) + { + impl = Appender!(A, T)(*arr); +@@ -2411,9 +2434,9 @@ those appends. + + private alias Appender!(A, T) AppenderType; + +-/** +-Appends one item to the managed array. +- */ ++ /** ++ * Appends one item to the managed array. ++ */ + void opOpAssign(string op : "~", U)(U item) if (AppenderType.canPutItem!U) + { + scope(exit) *this.arr = impl.data; +@@ -2427,28 +2450,28 @@ Appends one item to the managed array. + impl.put(items); + } + +-/** +-Appends an entire range to the managed array. +- */ ++ /** ++ * Appends an entire range to the managed array. ++ */ + void opOpAssign(string op : "~", Range)(Range items) if (AppenderType.canPutRange!Range) + { + scope(exit) *this.arr = impl.data; + impl.put(items); + } + +-/** +-Returns the capacity of the array (the maximum number of elements the +-managed array can accommodate before triggering a reallocation). If any +-appending will reallocate, $(D capacity) returns $(D 0). +- */ ++ /** ++ * Returns the capacity of the array (the maximum number of elements the ++ * managed array can accommodate before triggering a reallocation). If any ++ * appending will reallocate, $(D capacity) returns $(D 0). ++ */ + @property size_t capacity() const + { + return impl.capacity; + } + +-/** +-Returns the managed array. +- */ ++ /** ++ * Returns the managed array. ++ */ + @property inout(T)[] data() inout + { + return impl.data; +@@ -2456,15 +2479,30 @@ Returns the managed array. + } + + /++ +- Convenience function that returns an $(D Appender!(A)) object initialized ++ Convenience function that returns an $(D Appender!A) object initialized + with $(D array). + +/ +-Appender!(E[]) appender(A : E[], E)(A array = null) ++Appender!(E[]) appender(A : E[], E)() ++{ ++ return Appender!(E[])(null); ++} ++/// ditto ++Appender!(E[]) appender(A : E[], E)(A array) + { +- return Appender!(E[])(array); ++ static if (isMutable!E) ++ { ++ return Appender!(E[])(array); ++ } ++ else ++ { ++ /* @system operation: ++ * - casting array to Unqual!E[] (remove qualifiers) ++ */ ++ return Appender!(E[])(cast(Unqual!E[])array); ++ } + } + +-unittest ++@safe pure nothrow unittest + { + { + auto app = appender!(char[])(); +@@ -2501,7 +2539,11 @@ unittest + app2.reserve(5); + assert(app2.capacity >= 5); + +- app2.shrinkTo(3); ++ try // shrinkTo may throw ++ { ++ app2.shrinkTo(3); ++ } ++ catch (Exception) assert(0); + assert(app2.data == [ 1, 2, 3 ]); + assertThrown(app2.shrinkTo(5)); + +@@ -2510,40 +2552,110 @@ unittest + assert(app3.data == [1, 2, 3]); + + auto app4 = appender([]); +- app4.shrinkTo(0); ++ try // shrinkTo may throw ++ { ++ app4.shrinkTo(0); ++ } ++ catch (Exception) assert(0); + +- // Issue 5663 tests ++ // Issue 5663 & 9725 tests ++ foreach (S; TypeTuple!(char[], const(char)[], string)) + { +- Appender!(char[]) app5663i; +- assertNotThrown(app5663i.put("\xE3")); +- assert(app5663i.data == "\xE3"); ++ { ++ Appender!S app5663i; ++ assertNotThrown(app5663i.put("\xE3")); ++ assert(app5663i.data == "\xE3"); ++ ++ Appender!S app5663c; ++ assertNotThrown(app5663c.put(cast(const(char)[])"\xE3")); ++ assert(app5663c.data == "\xE3"); + +- Appender!(char[]) app5663c; +- assertNotThrown(app5663c.put(cast(const(char)[])"\xE3")); +- assert(app5663c.data == "\xE3"); ++ Appender!S app5663m; ++ assertNotThrown(app5663m.put("\xE3".dup)); ++ assert(app5663m.data == "\xE3"); ++ } ++ // ditto for ~= ++ { ++ Appender!S app5663i; ++ assertNotThrown(app5663i ~= "\xE3"); ++ assert(app5663i.data == "\xE3"); + +- Appender!(char[]) app5663m; +- assertNotThrown(app5663m.put(cast(char[])"\xE3")); +- assert(app5663m.data == "\xE3"); ++ Appender!S app5663c; ++ assertNotThrown(app5663c ~= cast(const(char)[])"\xE3"); ++ assert(app5663c.data == "\xE3"); ++ ++ Appender!S app5663m; ++ assertNotThrown(app5663m ~= "\xE3".dup); ++ assert(app5663m.data == "\xE3"); ++ } + } +- // ditto for ~= ++ ++ static struct S10122 + { +- Appender!(char[]) app5663i; +- assertNotThrown(app5663i ~= "\xE3"); +- assert(app5663i.data == "\xE3"); ++ int val; + +- Appender!(char[]) app5663c; +- assertNotThrown(app5663c ~= cast(const(char)[])"\xE3"); +- assert(app5663c.data == "\xE3"); ++ @disable this(); ++ this(int v) @safe pure nothrow { val = v; } ++ } ++ assertCTFEable!( ++ { ++ auto w = appender!(S10122[])(); ++ w.put(S10122(1)); ++ assert(w.data.length == 1 && w.data[0].val == 1); ++ }); ++} ++ ++@safe pure nothrow unittest ++{ ++ { ++ auto w = appender!string(); ++ w.reserve(4); ++ w.capacity; ++ w.data; ++ try ++ { ++ wchar wc = 'a'; ++ dchar dc = 'a'; ++ w.put(wc); // decoding may throw ++ w.put(dc); // decoding may throw ++ } ++ catch (Exception) assert(0); ++ } ++ { ++ auto w = appender!(int[])(); ++ w.reserve(4); ++ w.capacity; ++ w.data; ++ w.put(10); ++ w.put([10]); ++ w.clear(); ++ try ++ { ++ w.shrinkTo(0); ++ } ++ catch (Exception) assert(0); ++ ++ struct N ++ { ++ int payload; ++ alias payload this; ++ } ++ w.put(N(1)); ++ w.put([N(2)]); + +- Appender!(char[]) app5663m; +- assertNotThrown(app5663m ~= cast(char[])"\xE3"); +- assert(app5663m.data == "\xE3"); ++ struct S(T) ++ { ++ @property bool empty() { return true; } ++ @property T front() { return T.init; } ++ void popFront() {} ++ } ++ S!int r; ++ w.put(r); + } + } + + /++ +- Convenience function that returns a $(D RefAppender!(A)) object initialized ++ Convenience function that returns a $(D RefAppender!A) object initialized + with $(D array). Don't use null for the $(D array) pointer, use the other + version of $(D appender) instead. + +/ +@@ -2593,7 +2705,11 @@ unittest + app2.reserve(5); + assert(app2.capacity >= 5); + +- app2.shrinkTo(3); ++ try // shrinkTo may throw ++ { ++ app2.shrinkTo(3); ++ } ++ catch (Exception) assert(0); + assert(app2.data == [ 1, 2, 3 ]); + assertThrown(app2.shrinkTo(5)); + +--- a/src/libphobos/src/std/ascii.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/ascii.d 2014-04-01 16:32:51.000000000 +0100 +@@ -3,11 +3,12 @@ + /++ + Functions which operate on ASCII characters. + +- All of the functions in std.ascii accept unicode characters but effectively +- ignore them. All $(D isX) functions return $(D false) for unicode +- characters, and all $(D toX) functions do nothing to unicode characters. ++ All of the functions in std.ascii accept Unicode characters but effectively ++ ignore them if they're not ASCII. All $(D isX) functions return $(D false) ++ for non-ASCII characters, and all $(D toX) functions do nothing to non-ASCII ++ characters. + +- For functions which operate on unicode characters, see ++ For functions which operate on Unicode characters, see + $(LINK2 std_uni.html, std.uni). + + References: +@@ -17,26 +18,40 @@ + Macros: + WIKI=Phobos/StdASCII + +- Copyright: Copyright 2000 - ++ Copyright: Copyright 2000 - 2013 + License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). + Authors: $(WEB digitalmars.com, Walter Bright) and Jonathan M Davis + Source: $(PHOBOSSRC std/_ascii.d) + +/ + module std.ascii; + +-version(unittest) import std.range; ++version (unittest) ++{ ++ // FIXME: When dmd bug #314 is fixed, make these selective. ++ import std.range; // : chain; ++ import std.traits; // : functionAttributes, FunctionAttribute, isSafe; ++ import std.typetuple; // : TypeTuple; ++} + + + immutable hexDigits = "0123456789ABCDEF"; /// 0..9A..F ++immutable lowerHexDigits = "0123456789abcdef"; /// 0..9a..f + immutable fullHexDigits = "0123456789ABCDEFabcdef"; /// 0..9A..Fa..f + immutable digits = "0123456789"; /// 0..9 + immutable octalDigits = "01234567"; /// 0..7 + immutable lowercase = "abcdefghijklmnopqrstuvwxyz"; /// a..z +-immutable letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ~ +- "abcdefghijklmnopqrstuvwxyz"; /// A..Za..z + immutable uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// A..Z ++immutable letters = uppercase ~ lowercase; /// A..Za..z + immutable whitespace = " \t\v\r\n\f"; /// ASCII whitespace + ++/** ++Letter case specifier. ++ */ ++enum LetterCase : bool ++{ ++ upper, /// Upper case letters ++ lower /// Lower case letters ++} + + version(Windows) + { +@@ -207,7 +222,7 @@ bool isControl(dchar c) @safe pure nothr + + unittest + { +- foreach(dchar c; iota(0, 32)) ++ foreach(dchar c; 0 .. 32) + assert(isControl(c)); + assert(isControl(127)); + +@@ -227,7 +242,7 @@ bool isPunctuation(dchar c) @safe pure n + + unittest + { +- foreach(dchar c; iota(0, 128)) ++ foreach(dchar c; 0 .. 128) + { + if(isControl(c) || isAlphaNum(c) || c == ' ') + assert(!isPunctuation(c)); +@@ -248,7 +263,7 @@ bool isGraphical(dchar c) @safe pure not + + unittest + { +- foreach(dchar c; iota(0, 128)) ++ foreach(dchar c; 0 .. 128) + { + if(isControl(c) || c == ' ') + assert(!isGraphical(c)); +@@ -257,6 +272,7 @@ unittest + } + } + ++ + /++ + Whether or not $(D c) is a printable character - including the space + character. +@@ -268,7 +284,7 @@ bool isPrintable(dchar c) @safe pure not + + unittest + { +- foreach(dchar c; iota(0, 128)) ++ foreach(dchar c; 0 .. 128) + { + if(isControl(c)) + assert(!isPrintable(c)); +@@ -289,7 +305,7 @@ bool isASCII(dchar c) @safe pure nothrow + + unittest + { +- foreach(dchar c; iota(0, 128)) ++ foreach(dchar c; 0 .. 128) + assert(isASCII(c)); + + assert(!isASCII(128)); +@@ -299,26 +315,48 @@ unittest + /++ + If $(D c) is an uppercase ASCII character, then its corresponding lowercase + letter is returned. Otherwise, $(D c) is returned. ++ ++ $(D C) can be any type which implicitly converts to $(D dchar). In the case ++ where it's a built-in type, or an enum of a built-in type, ++ $(D Unqual!(OriginalType!C)) is returned, whereas if it's a user-defined ++ type, $(D dchar) is returned. + +/ +-dchar toLower(dchar c) @safe pure nothrow +-out(result) +-{ +- assert(!isUpper(result)); +-} +-body ++auto toLower(C)(C c) ++ if(is(C : dchar)) + { +- return isUpper(c) ? c + cast(dchar)('a' - 'A') : c; ++ import std.traits : isAggregateType, OriginalType, Unqual; ++ ++ alias OC = OriginalType!C; ++ static if (isAggregateType!OC) ++ alias R = dchar; ++ else ++ alias R = Unqual!OC; ++ ++ return isUpper(c) ? cast(R)(cast(R)c + 'a' - 'A') : cast(R)c; + } + +-unittest ++@safe pure nothrow unittest + { +- foreach(i, c; uppercase) +- assert(toLower(c) == lowercase[i]); + +- foreach(dchar c; iota(0, 128)) ++ foreach(C; TypeTuple!(char, wchar, dchar, immutable char, ubyte)) + { +- if(c < 'A' || c > 'Z') ++ foreach(i, c; uppercase) ++ assert(toLower(cast(C)c) == lowercase[i]); ++ ++ foreach(C c; 0 .. 128) ++ { ++ if(c < 'A' || c > 'Z') ++ assert(toLower(c) == c); ++ else ++ assert(toLower(c) != c); ++ } ++ ++ foreach(C c; 128 .. C.max) + assert(toLower(c) == c); ++ ++ //CTFE ++ static assert(toLower(cast(C)'a') == 'a'); ++ static assert(toLower(cast(C)'A') == 'a'); + } + } + +@@ -326,29 +364,105 @@ unittest + /++ + If $(D c) is a lowercase ASCII character, then its corresponding uppercase + letter is returned. Otherwise, $(D c) is returned. ++ ++ $(D C) can be any type which implicitly converts to $(D dchar). In the case ++ where it's a built-in type, or an enum of a built-in type, ++ $(D Unqual!(OriginalType!C)) is returned, whereas if it's a user-defined ++ type, $(D dchar) is returned. + +/ +-dchar toUpper(dchar c) @safe pure nothrow +-out(result) ++auto toUpper(C)(C c) ++ if(is(C : dchar)) + { +- assert(!isLower(result)); ++ import std.traits : isAggregateType, OriginalType, Unqual; ++ ++ alias OC = OriginalType!C; ++ static if (isAggregateType!OC) ++ alias R = dchar; ++ else ++ alias R = Unqual!OC; ++ ++ return isLower(c) ? cast(R)(cast(R)c - ('a' - 'A')) : cast(R)c; + } +-body ++ ++@safe pure nothrow unittest + { +- return isLower(c) ? c - cast(dchar)('a' - 'A') : c; ++ foreach(C; TypeTuple!(char, wchar, dchar, immutable char, ubyte)) ++ { ++ foreach(i, c; lowercase) ++ assert(toUpper(cast(C)c) == uppercase[i]); ++ ++ foreach(C c; 0 .. 128) ++ { ++ if(c < 'a' || c > 'z') ++ assert(toUpper(c) == c); ++ else ++ assert(toUpper(c) != c); ++ } ++ ++ foreach(C c; 128 .. C.max) ++ assert(toUpper(c) == c); ++ ++ //CTFE ++ static assert(toUpper(cast(C)'a') == 'A'); ++ static assert(toUpper(cast(C)'A') == 'A'); ++ } + } + +-unittest ++ ++unittest //Test both toUpper and toLower with non-builtin + { +- foreach(i, c; lowercase) +- assert(toUpper(c) == uppercase[i]); ++ //User Defined [Char|Wchar|Dchar] ++ static struct UDC { char c; alias c this; } ++ static struct UDW { wchar c; alias c this; } ++ static struct UDD { dchar c; alias c this; } ++ //[Char|Wchar|Dchar] Enum ++ enum CE : char {a = 'a', A = 'A'} ++ enum WE : wchar {a = 'a', A = 'A'} ++ enum DE : dchar {a = 'a', A = 'A'} ++ //User Defined [Char|Wchar|Dchar] Enum ++ enum UDCE : UDC {a = UDC('a'), A = UDC('A')} ++ enum UDWE : UDW {a = UDW('a'), A = UDW('A')} ++ enum UDDE : UDD {a = UDD('a'), A = UDD('A')} + +- foreach(dchar c; iota(0, 128)) ++ //User defined types with implicit cast to dchar test. ++ foreach (Char; TypeTuple!(UDC, UDW, UDD)) + { +- if(c < 'a' || c > 'z') +- assert(toUpper(c) == c); ++ assert(toLower(Char('a')) == 'a'); ++ assert(toLower(Char('A')) == 'a'); ++ static assert(toLower(Char('a')) == 'a'); ++ static assert(toLower(Char('A')) == 'a'); ++ static assert(toUpper(Char('a')) == 'A'); ++ static assert(toUpper(Char('A')) == 'A'); ++ } ++ ++ //Various enum tests. ++ foreach (Enum; TypeTuple!(CE, WE, DE, UDCE, UDWE, UDDE)) ++ { ++ assert(toLower(Enum.a) == 'a'); ++ assert(toLower(Enum.A) == 'a'); ++ assert(toUpper(Enum.a) == 'A'); ++ assert(toUpper(Enum.A) == 'A'); ++ static assert(toLower(Enum.a) == 'a'); ++ static assert(toLower(Enum.A) == 'a'); ++ static assert(toUpper(Enum.a) == 'A'); ++ static assert(toUpper(Enum.A) == 'A'); + } +-} + ++ //Return value type tests for enum of non-UDT. These should be the original type. ++ foreach (T; TypeTuple!(CE, WE, DE)) ++ { ++ alias C = OriginalType!T; ++ static assert(is(typeof(toLower(T.init)) == C)); ++ static assert(is(typeof(toUpper(T.init)) == C)); ++ } ++ ++ //Return value tests for UDT and enum of UDT. These should be dchar ++ foreach (T; TypeTuple!(UDC, UDW, UDD, UDCE, UDWE, UDDE)) ++ { ++ static assert(is(typeof(toLower(T.init)) == dchar)); ++ static assert(is(typeof(toUpper(T.init)) == dchar)); ++ } ++} + + //============================================================================== + // Private Section. +@@ -357,35 +471,34 @@ private: + + enum + { +- _SPC = 8, +- _CTL = 0x20, +- _BLK = 0x40, +- _HEX = 0x80, +- _UC = 1, +- _LC = 2, +- _PNC = 0x10, +- _DIG = 4, +- _ALP = _UC|_LC, ++ _UC = 0x01, ++ _LC = 0x02, ++ _DIG = 0x04, ++ _SPC = 0x08, ++ _PNC = 0x10, ++ _CTL = 0x20, ++ _BLK = 0x40, ++ _HEX = 0x80, ++ _ALP = _UC | _LC, + } + +-immutable ubyte _ctype[128] = ++immutable ubyte[128] _ctype = + [ +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL, +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, +- _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, +- _PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC, +- _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, +- _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, +- _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC, +- _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, +- _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, +- _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL ++ _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, ++ _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL, ++ _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, ++ _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, ++ _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, ++ _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, ++ _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, ++ _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, ++ _PNC,_PNC,_PNC,_PNC,_PNC,_PNC, ++ _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC, ++ _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, ++ _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, ++ _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC, ++ _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC, ++ _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, ++ _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, ++ _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL + ]; +- +--- a/src/libphobos/src/std/base64.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/base64.d 2014-04-01 16:32:51.000000000 +0100 +@@ -6,40 +6,35 @@ + * Implemented according to $(WEB tools.ietf.org/html/rfc4648, + * RFC 4648 - The Base16, Base32, and Base64 Data Encodings). + * +-* Example: +- * $(D_RUN_CODE +- * $(ARGS ++ * Example: + * ----- +- *ubyte[] data = [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e]; ++ * ubyte[] data = [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e]; + * +- *const(char)[] encoded = Base64.encode(data); +- *assert(encoded == "FPucA9l+"); ++ * const(char)[] encoded = Base64.encode(data); ++ * assert(encoded == "FPucA9l+"); + * +- *ubyte[] decoded = Base64.decode("FPucA9l+"); +- *assert(decoded == [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e]); ++ * ubyte[] decoded = Base64.decode("FPucA9l+"); ++ * assert(decoded == [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e]); + * ----- +- * ), $(ARGS), $(ARGS), $(ARGS import std.base64;)) ++ * + * Support Range interface using Encoder / Decoder. + * + * Example: +- * $(D_RUN_CODE +- * $(ARGS + * ----- + * // Create MIME Base64 with CRLF, per line 76. +- *File f = File("./text.txt", "r"); +- *scope(exit) f.close(); ++ * File f = File("./text.txt", "r"); ++ * scope(exit) f.close(); + * +- *Appender!string mime64 = appender!string; ++ * Appender!string mime64 = appender!string; + * +- *foreach (encoded; Base64.encoder(f.byChunk(57))) +- *{ +- * mime64.put(encoded); +- * mime64.put("\r\n"); +- *} ++ * foreach (encoded; Base64.encoder(f.byChunk(57))) ++ * { ++ * mime64.put(encoded); ++ * mime64.put("\r\n"); ++ * } + * +- *writeln(mime64.data); ++ * writeln(mime64.data); + * ----- +- *), $(ARGS), $(ARGS), $(ARGS import std.base64, std.array, std.stdio: File, writeln;)) + * + * Copyright: Masahiro Nakagawa 2010-. + * License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). +@@ -134,7 +129,7 @@ template Base64Impl(char Map62th, char M + * + * Params: + * source = an $(D InputRange) to encode. +- * range = a buffer to store encoded result. ++ * buffer = a buffer to store encoded result. + * + * Returns: + * the encoded string that slices buffer. +@@ -459,7 +454,7 @@ template Base64Impl(char Map62th, char M + * true if there are no more elements to be iterated. + */ + @property @trusted +- bool empty() const ++ bool empty() + { + return range_.empty; + } +@@ -486,7 +481,7 @@ template Base64Impl(char Map62th, char M + */ + void popFront() + { +- enforce(!empty, "Cannot call popFront on Encoder with no data remaining"); ++ enforce(!empty, new Base64Exception("Cannot call popFront on Encoder with no data remaining")); + + range_.popFront(); + +@@ -597,7 +592,7 @@ template Base64Impl(char Map62th, char M + */ + void popFront() + { +- enforce(!empty, "Cannot call popFront on Encoder with no data remaining"); ++ enforce(!empty, new Base64Exception("Cannot call popFront on Encoder with no data remaining")); + + static if (Padding != NoPadding) + if (padding) { +@@ -672,36 +667,30 @@ template Base64Impl(char Map62th, char M + * Default $(D Encoder) encodes chunk data. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * ----- +- *File f = File("text.txt", "r"); +- *scope(exit) f.close(); ++ * File f = File("text.txt", "r"); ++ * scope(exit) f.close(); + * +- *uint line = 0; +- *foreach (encoded; Base64.encoder(f.byLine())) +- *{ +- * writeln(++line, ". ", encoded); +- *} ++ * uint line = 0; ++ * foreach (encoded; Base64.encoder(f.byLine())) ++ * { ++ * writeln(++line, ". ", encoded); ++ * } + * ----- +- *), $(ARGS), $(ARGS), $(ARGS import std.base64, std.stdio: File, writeln;)) + * + * In addition, You can use $(D Encoder) that returns encoded single character. + * This $(D Encoder) performs Range-based and lazy encoding. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * ----- +- *ubyte[] data = cast(ubyte[]) "0123456789"; ++ * ubyte[] data = cast(ubyte[]) "0123456789"; + * + * // The ElementType of data is not aggregation type +- *foreach (encoded; Base64.encoder(data)) +- *{ +- * writeln(encoded); +- *} ++ * foreach (encoded; Base64.encoder(data)) ++ * { ++ * writeln(encoded); ++ * } + * ----- +- *), $(ARGS), $(ARGS), $(ARGS import std.base64, std.stdio: writeln;)) + * + * Params: + * range = an $(D InputRange) to iterate. +@@ -806,6 +795,8 @@ template Base64Impl(char Map62th, char M + immutable srcLen = source.length; + if (srcLen == 0) + return []; ++ static if (Padding != NoPadding) ++ enforce(srcLen % 4 == 0, new Base64Exception("Invalid length of encoded data")); + + immutable blocks = srcLen / 4; + auto srcptr = source.ptr; +@@ -872,6 +863,8 @@ template Base64Impl(char Map62th, char M + immutable srcLen = source.length; + if (srcLen == 0) + return []; ++ static if (Padding != NoPadding) ++ enforce(srcLen % 4 == 0, new Base64Exception("Invalid length of encoded data")); + + immutable blocks = srcLen / 4; + auto bufptr = buffer.ptr; +@@ -948,6 +941,8 @@ template Base64Impl(char Map62th, char M + immutable srcLen = source.length; + if (srcLen == 0) + return 0; ++ static if (Padding != NoPadding) ++ enforce(srcLen % 4 == 0, new Base64Exception("Invalid length of encoded data")); + + immutable blocks = srcLen / 4; + auto srcptr = source.ptr; +@@ -1016,6 +1011,8 @@ template Base64Impl(char Map62th, char M + immutable srcLen = source.length; + if (srcLen == 0) + return 0; ++ static if (Padding != NoPadding) ++ enforce(srcLen % 4 == 0, new Base64Exception("Invalid length of encoded data")); + + immutable blocks = srcLen / 4; + size_t pcount; +@@ -1117,7 +1114,7 @@ template Base64Impl(char Map62th, char M + * true if there are no more elements to be iterated. + */ + @property @trusted +- bool empty() const ++ bool empty() + { + return range_.empty; + } +@@ -1144,7 +1141,7 @@ template Base64Impl(char Map62th, char M + */ + void popFront() + { +- enforce(!empty, "Cannot call popFront on Decoder with no data remaining."); ++ enforce(!empty, new Base64Exception("Cannot call popFront on Decoder with no data remaining.")); + + range_.popFront(); + +@@ -1222,7 +1219,7 @@ template Base64Impl(char Map62th, char M + range_ = range_.save; + + static if (Padding != NoPadding && hasLength!Range) +- enforce(range_.length % 4 == 0); ++ enforce(range_.length % 4 == 0, new Base64Exception("Invalid length of encoded data")); + + if (range_.empty) + pos = -1; +@@ -1265,7 +1262,7 @@ template Base64Impl(char Map62th, char M + */ + void popFront() + { +- enforce(!empty, "Cannot call popFront on Decoder with no data remaining"); ++ enforce(!empty, new Base64Exception("Cannot call popFront on Decoder with no data remaining")); + + static if (Padding == NoPadding) { + bool endCondition() +@@ -1275,7 +1272,7 @@ template Base64Impl(char Map62th, char M + } else { + bool endCondition() + { +- enforce(!range_.empty, "Missing padding"); ++ enforce(!range_.empty, new Base64Exception("Missing padding")); + return range_.front == Padding; + } + } +@@ -1287,12 +1284,12 @@ template Base64Impl(char Map62th, char M + + final switch (pos) { + case 0: +- enforce(!endCondition(), "Premature end of data found"); ++ enforce(!endCondition(), new Base64Exception("Premature end of data found")); + + immutable t = DecodeMap[range_.front] << 2; + range_.popFront(); + +- enforce(!endCondition(), "Premature end of data found"); ++ enforce(!endCondition(), new Base64Exception("Premature end of data found")); + first = cast(ubyte)(t | (DecodeMap[range_.front] >> 4)); + break; + case 1: +@@ -1349,31 +1346,24 @@ template Base64Impl(char Map62th, char M + * Default $(D Decoder) decodes chunk data. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * ----- +- *foreach (decoded; Base64.decoder(stdin.byLine())) +- *{ +- * writeln(decoded); +- *} ++ * foreach (decoded; Base64.decoder(stdin.byLine())) ++ * { ++ * writeln(decoded); ++ * } + * ----- +- *), $(ARGS FPucA9l+), $(ARGS), $(ARGS import std.base64, std.stdio;)) + * + * In addition, You can use $(D Decoder) that returns decoded single character. + * This $(D Decoder) performs Range-based and lazy decoding. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * ----- +- *auto encoded = Base64.encoder(cast(ubyte[])"0123456789"); +- *foreach (n; map!q{a - '0'}(Base64.decoder(encoded))) +- *{ +- * writeln(n); +- *} ++ * auto encoded = Base64.encoder(cast(ubyte[])"0123456789"); ++ * foreach (n; map!q{a - '0'}(Base64.decoder(encoded))) ++ * { ++ * writeln(n); ++ * } + * ----- +- *), $(ARGS), $(ARGS), $(ARGS import std.base64, std.stdio: writeln; +- *import std.algorithm: map;)) + * + * NOTE: + * If you use $(D ByChunk), chunk-size should be the multiple of 4. +@@ -1399,7 +1389,7 @@ template Base64Impl(char Map62th, char M + + // enforce can't be a pure function, so I use trivial check. + if (val == 0 && chr != 'A') +- throw new Exception("Invalid character: " ~ chr); ++ throw new Base64Exception("Invalid character: " ~ chr); + + return val; + } +@@ -1410,13 +1400,26 @@ template Base64Impl(char Map62th, char M + { + // See above comment. + if (chr > 0x7f) +- throw new Exception("Base64-encoded character must be a single byte"); ++ throw new Base64Exception("Base64-encoded character must be a single byte"); + + return decodeChar(cast(char)chr); + } + } + + ++/** ++ * Exception thrown on Base64 errors. ++ */ ++class Base64Exception : Exception ++{ ++ @safe pure nothrow ++ this(string s, string fn = __FILE__, size_t ln = __LINE__) ++ { ++ super(s, fn, ln); ++ } ++} ++ ++ + unittest + { + alias Base64Impl!('!', '=', Base64.NoPadding) Base64Re; +@@ -1467,7 +1470,7 @@ unittest + assert(Base64.decode(Base64.encode(tv["fooba"])) == tv["fooba"]); + assert(Base64.decode(Base64.encode(tv["foobar"])) == tv["foobar"]); + +- assertThrown(Base64.decode("ab|c")); ++ assertThrown!Base64Exception(Base64.decode("ab|c")); + + // Test decoding incomplete strings. RFC does not specify the correct + // behavior, but the code should never throw Errors on invalid input. +@@ -1478,9 +1481,10 @@ unittest + assert(Base64.decodeLength(3) <= 2); + + // may throw Exceptions, may not throw Errors +- collectException(Base64.decode("Zg")); +- collectException(Base64.decode("Zg=")); +- collectException(Base64.decode("Zm8")); ++ assertThrown!Base64Exception(Base64.decode("Zg")); ++ assertThrown!Base64Exception(Base64.decode("Zg=")); ++ assertThrown!Base64Exception(Base64.decode("Zm8")); ++ assertThrown!Base64Exception(Base64.decode("Zg==;")); + } + + { // No padding +@@ -1555,6 +1559,9 @@ unittest + assert(tv["foobar"] == b.data); a.clear(); b.clear(); + } + ++ // @@@9543@@@ These tests were disabled because they actually relied on the input range having length. ++ // The implementation (currently) doesn't support encoding/decoding from a length-less source. ++ version(none) + { // with InputRange + // InputRange to ubyte[] or char[] + auto encoded = Base64.encode(map!(to!(ubyte))(["20", "251", "156", "3", "217", "126"])); +--- a/src/libphobos/src/std/bigint.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/bigint.d 2014-04-01 16:32:51.000000000 +0100 +@@ -80,7 +80,7 @@ public: + /// It may have a leading + or - sign; followed by "0x" if hexadecimal. + /// Underscores are permitted. + /// BUG: Should throw a IllegalArgumentException/ConvError if invalid character found +- this(T : const(char)[] )(T s) ++ this(T : const(char)[] )(T s) pure + { + bool neg = false; + if (s[0] == '-') { +@@ -106,22 +106,22 @@ public: + } + + /// +- this(T)(T x) if (isIntegral!T) ++ this(T)(T x) pure if (isIntegral!T) + { + data = data.init; // @@@: Workaround for compiler bug + opAssign(x); + } + + /// +- BigInt opAssign(T)(T x) if (isIntegral!T) ++ BigInt opAssign(T)(T x) pure if (isIntegral!T) + { +- data = cast(ulong)((x < 0) ? -x : x); ++ data = cast(ulong)absUnsign(x); + sign = (x < 0); + return this; + } + + /// +- BigInt opAssign(T:BigInt)(T x) ++ BigInt opAssign(T:BigInt)(T x) pure + { + data = x.data; + sign = x.sign; +@@ -129,11 +129,11 @@ public: + } + + // BigInt op= integer +- BigInt opOpAssign(string op, T)(T y) ++ BigInt opOpAssign(string op, T)(T y) pure + if ((op=="+" || op=="-" || op=="*" || op=="/" || op=="%" + || op==">>" || op=="<<" || op=="^^") && isIntegral!T) + { +- ulong u = cast(ulong)(y < 0 ? -y : y); ++ ulong u = absUnsign(y); + + static if (op=="+") + { +@@ -201,7 +201,7 @@ public: + } + + // BigInt op= BigInt +- BigInt opOpAssign(string op, T)(T y) ++ BigInt opOpAssign(string op, T)(T y) pure + if ((op=="+" || op== "-" || op=="*" || op=="/" || op=="%") + && is (T: BigInt)) + { +@@ -243,15 +243,16 @@ public: + } + + // BigInt op BigInt +- BigInt opBinary(string op, T)(T y) +- if ((op=="+" || op == "*" || op=="-" || op=="/" || op=="%") && is (T: BigInt)) ++ BigInt opBinary(string op, T)(T y) pure ++ if ((op=="+" || op == "*" || op=="-" || op=="/" || op=="%") ++ && is (T: BigInt)) + { + BigInt r = this; + return r.opOpAssign!(op)(y); + } + + // BigInt op integer +- BigInt opBinary(string op, T)(T y) ++ BigInt opBinary(string op, T)(T y) pure + if ((op=="+" || op == "*" || op=="-" || op=="/" + || op==">>" || op=="<<" || op=="^^") && isIntegral!T) + { +@@ -260,11 +261,11 @@ public: + } + + // +- int opBinary(string op, T : int)(T y) ++ int opBinary(string op, T : int)(T y) pure + if (op == "%" && isIntegral!T) + { + assert(y!=0); +- uint u = y < 0 ? -y : y; ++ uint u = absUnsign(y); + int rem = BigUint.modInt(data, u); + // x%y always has the same sign as x. + // This is not the same as mathematical mod. +@@ -272,17 +273,17 @@ public: + } + + // Commutative operators +- BigInt opBinaryRight(string op, T)(T y) ++ BigInt opBinaryRight(string op, T)(T y) pure + if ((op=="+" || op=="*") && isIntegral!T) + { + return opBinary!(op)(y); + } + + // BigInt = integer op BigInt +- BigInt opBinaryRight(string op, T)(T y) ++ BigInt opBinaryRight(string op, T)(T y) pure + if (op == "-" && isIntegral!T) + { +- ulong u = cast(ulong)(y < 0 ? -y : y); ++ ulong u = absUnsign(y); + BigInt r; + static if (op == "-") + { +@@ -294,7 +295,7 @@ public: + } + + // integer = integer op BigInt +- T opBinaryRight(string op, T)(T x) ++ T opBinaryRight(string op, T)(T x) pure + if ((op=="%" || op=="/") && isIntegral!T) + { + static if (op == "%") +@@ -303,7 +304,7 @@ public: + // x%y always has the same sign as x. + if (data.ulongLength() > 1) + return x; +- ulong u = x < 0 ? -x : x; ++ ulong u = absUnsign(x); + ulong rem = u % data.peekUlong(0); + // x%y always has the same sign as x. + return cast(T)((x<0) ? -rem : rem); +@@ -317,7 +318,7 @@ public: + } + } + // const unary operations +- BigInt opUnary(string op)() /*const*/ if (op=="+" || op=="-") ++ BigInt opUnary(string op)() pure /*const*/ if (op=="+" || op=="-") + { + static if (op=="-") + { +@@ -330,7 +331,7 @@ public: + } + + // non-const unary operations +- BigInt opUnary(string op)() if (op=="++" || op=="--") ++ BigInt opUnary(string op)() pure if (op=="++" || op=="--") + { + static if (op=="++") + { +@@ -345,29 +346,44 @@ public: + } + + /// +- bool opEquals()(auto ref const BigInt y) const ++ bool opEquals()(auto ref const BigInt y) const pure + { + return sign == y.sign && y.data == data; + } + + /// +- bool opEquals(T)(T y) const if (isIntegral!T) ++ bool opEquals(T)(T y) const pure if (isIntegral!T) + { + if (sign != (y<0)) + return 0; +- return data.opEquals(cast(ulong)( y>=0 ? y : -y)); ++ return data.opEquals(cast(ulong)absUnsign(y)); + } + + /// +- int opCmp(T)(T y) if (isIntegral!T) ++ T opCast(T:bool)() pure ++ { ++ return !isZero(); ++ } ++ ++ // Hack to make BigInt's typeinfo.compare work properly. ++ // Note that this must appear before the other opCmp overloads, otherwise ++ // DMD won't find it. ++ int opCmp(ref const BigInt y) const ++ { ++ // Simply redirect to the "real" opCmp implementation. ++ return this.opCmp!BigInt(y); ++ } ++ ++ /// ++ int opCmp(T)(T y) pure if (isIntegral!T) + { + if (sign != (y<0) ) + return sign ? -1 : 1; +- int cmp = data.opCmp(cast(ulong)(y >= 0 ? y : -y)); ++ int cmp = data.opCmp(cast(ulong)absUnsign(y)); + return sign? -cmp: cmp; + } + /// +- int opCmp(T:BigInt)(T y) ++ int opCmp(T:BigInt)(const T y) pure const + { + if (sign!=y.sign) + return sign ? -1 : 1; +@@ -379,7 +395,7 @@ public: + long toLong() pure const + { + return (sign ? -1 : 1) * +- (data.ulongLength() == 1 && (data.peekUlong(0) <= cast(ulong)(long.max)) ++ (data.ulongLength() == 1 && (data.peekUlong(0) <= sign+cast(ulong)(long.max)) // 1+long.max = |long.min| + ? cast(long)(data.peekUlong(0)) + : long.max); + } +@@ -388,7 +404,7 @@ public: + int toInt() pure const + { + return (sign ? -1 : 1) * +- (data.uintLength() == 1 && (data.peekUint(0) <= cast(uint)(int.max)) ++ (data.uintLength() == 1 && (data.peekUint(0) <= sign+cast(uint)(int.max)) // 1+int.max = |int.min| + ? cast(int)(data.peekUint(0)) + : int.max); + } +@@ -478,28 +494,34 @@ private: + } + +/ + private: +- void negate() ++ void negate() pure nothrow @safe + { + if (!data.isZero()) + sign = !sign; + } +- bool isZero() pure const ++ bool isZero() pure const nothrow @safe + { + return data.isZero(); + } +- bool isNegative() pure const ++ bool isNegative() pure const nothrow @safe + { + return sign; + } + // Generate a runtime error if division by zero occurs +- void checkDivByZero() pure const ++ void checkDivByZero() pure const @safe + { + if (isZero()) + throw new Error("BigInt division by zero"); + } ++ ++ // Implement toHash so that BigInt works properly as an AA key. ++ size_t toHash() const @trusted nothrow ++ { ++ return data.toHash() + sign; ++ } + } + +-string toDecimalString(BigInt x) ++string toDecimalString(BigInt x) + { + string outbuff=""; + void sink(const(char)[] s) { outbuff ~= s; } +@@ -507,7 +529,7 @@ string toDecimalString(BigInt x) + return outbuff; + } + +-string toHex(BigInt x) ++string toHex(BigInt x) + { + string outbuff=""; + void sink(const(char)[] s) { outbuff ~= s; } +@@ -515,6 +537,24 @@ string toHex(BigInt x) + return outbuff; + } + ++// Returns the absolute value of x converted to the corresponding unsigned type ++Unsigned!T absUnsign(T)(T x) if (isIntegral!T) ++{ ++ static if (isSigned!T) ++ { ++ import std.conv; ++ /* This returns the correct result even when x = T.min ++ * on two's complement machines because unsigned(T.min) = |T.min| ++ * even though -T.min = T.min. ++ */ ++ return unsigned((x < 0) ? -x : x); ++ } ++ else ++ { ++ return x; ++ } ++} ++ + unittest { + // Radix conversion + assert( toDecimalString(BigInt("-1_234_567_890_123_456_789")) +@@ -546,6 +586,28 @@ unittest { + assert((-4) % BigInt(5) == -4); // bug 5928 + assert(BigInt(-4) % BigInt(5) == -4); + assert(BigInt(2)/BigInt(-3) == BigInt(0)); // bug 8022 ++ assert(BigInt("-1") > long.min); // bug 9548 ++} ++ ++unittest // Minimum signed value bug tests. ++{ ++ assert(BigInt("-0x8000000000000000") == BigInt(long.min)); ++ assert(BigInt("-0x8000000000000000")+1 > BigInt(long.min)); ++ assert(BigInt("-0x80000000") == BigInt(int.min)); ++ assert(BigInt("-0x80000000")+1 > BigInt(int.min)); ++ assert(BigInt(long.min).toLong() == long.min); // lossy toLong bug for long.min ++ assert(BigInt(int.min).toInt() == int.min); // lossy toInt bug for int.min ++ assert(BigInt(long.min).ulongLength == 1); ++ assert(BigInt(int.min).uintLength == 1); // cast/sign extend bug in opAssign ++ BigInt a; ++ a += int.min; ++ assert(a == BigInt(int.min)); ++ a = int.min - BigInt(int.min); ++ assert(a == 0); ++ a = int.min; ++ assert(a == BigInt(int.min)); ++ assert(int.min % (BigInt(int.min)-1) == int.min); ++ assert((BigInt(int.min)-1)%int.min == -1); + } + + unittest // Recursive division, bug 5568 +@@ -722,3 +784,50 @@ unittest + --y; + assert(y.toLong() == -2); + } ++ ++unittest ++{ ++ import std.math:abs; ++ auto r = abs(BigInt(-1000)); // 6486 ++ assert(r == 1000); ++ ++ // opCast!bool ++ BigInt one = 1, zero; ++ assert(one && !zero); ++} ++ ++unittest // 6850 ++{ ++ pure long pureTest() { ++ BigInt a = 1; ++ BigInt b = 1336; ++ a += b; ++ return a.toLong(); ++ } ++ ++ assert(pureTest() == 1337); ++} ++ ++unittest // 8435 & 10118 ++{ ++ auto i = BigInt(100); ++ auto j = BigInt(100); ++ ++ // Two separate BigInt instances representing same value should have same ++ // hash. ++ assert(typeid(i).getHash(&i) == typeid(j).getHash(&j)); ++ assert(typeid(i).compare(&i, &j) == 0); ++ ++ // BigInt AA keys should behave consistently. ++ int[BigInt] aa; ++ aa[BigInt(123)] = 123; ++ assert(BigInt(123) in aa); ++ ++ aa[BigInt(123)] = 321; ++ assert(aa[BigInt(123)] == 321); ++ ++ auto keys = aa.byKey; ++ assert(keys.front == BigInt(123)); ++ keys.popFront(); ++ assert(keys.empty); ++} +--- a/src/libphobos/src/std/bitmanip.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/bitmanip.d 2014-04-01 16:32:51.000000000 +0100 +@@ -27,7 +27,9 @@ module std.bitmanip; + //debug = bitarray; // uncomment to turn on debugging printf's + + import core.bitop; ++import std.format; + import std.range; ++import std.string; + import std.system; + import std.traits; + +@@ -67,23 +69,22 @@ private template createAccessors( + } + else + { +- static if (len + offset <= uint.sizeof * 8) +- alias uint MasksType; +- else +- alias ulong MasksType; +- enum MasksType +- maskAllElse = ((1uL << len) - 1u) << offset, +- signBitCheck = 1uL << (len - 1), +- extendSign = ~((cast(MasksType)1u << len) - 1); ++ enum ulong ++ maskAllElse = ((~0uL) >> (64 - len)) << offset, ++ signBitCheck = 1uL << (len - 1); ++ + static if (T.min < 0) + { + enum long minVal = -(1uL << (len - 1)); + enum ulong maxVal = (1uL << (len - 1)) - 1; ++ alias Unsigned!(T) UT; ++ enum UT extendSign = cast(UT)~((~0uL) >> (64 - len)); + } + else + { + enum ulong minVal = 0; +- enum ulong maxVal = (1uL << len) - 1; ++ enum ulong maxVal = (~0uL) >> (64 - len); ++ enum extendSign = 0; + } + + static if (is(T == bool)) +@@ -216,6 +217,106 @@ template bitfields(T...) + + unittest + { ++ // Degenerate bitfields (#8474 / #11160) tests mixed with range tests ++ struct Test1 ++ { ++ mixin(bitfields!(uint, "a", 32, ++ uint, "b", 4, ++ uint, "c", 4, ++ uint, "d", 8, ++ uint, "e", 16,)); ++ ++ static assert(Test1.b_min == 0); ++ static assert(Test1.b_max == 15); ++ } ++ ++ struct Test2 ++ { ++ mixin(bitfields!(bool, "a", 0, ++ ulong, "b", 64)); ++ ++ static assert(Test2.b_min == ulong.min); ++ static assert(Test2.b_max == ulong.max); ++ } ++ ++ struct Test1b ++ { ++ mixin(bitfields!(bool, "a", 0, ++ int, "b", 8)); ++ } ++ ++ struct Test2b ++ { ++ mixin(bitfields!(int, "a", 32, ++ int, "b", 4, ++ int, "c", 4, ++ int, "d", 8, ++ int, "e", 16,)); ++ ++ static assert(Test2b.b_min == -8); ++ static assert(Test2b.b_max == 7); ++ } ++ ++ struct Test3b ++ { ++ mixin(bitfields!(bool, "a", 0, ++ long, "b", 64)); ++ ++ static assert(Test3b.b_min == long.min); ++ static assert(Test3b.b_max == long.max); ++ } ++ ++ struct Test4b ++ { ++ mixin(bitfields!(long, "a", 32, ++ int, "b", 32)); ++ } ++ ++ // Sign extension tests ++ Test2b t2b; ++ Test4b t4b; ++ t2b.b = -5; assert(t2b.b == -5); ++ t2b.d = -5; assert(t2b.d == -5); ++ t2b.e = -5; assert(t2b.e == -5); ++ t4b.a = -5; assert(t4b.a == -5L); ++} ++ ++unittest ++{ ++ // Bug #6686 ++ union S { ++ ulong bits = ulong.max; ++ mixin (bitfields!( ++ ulong, "back", 31, ++ ulong, "front", 33) ++ ); ++ } ++ S num; ++ ++ num.bits = ulong.max; ++ num.back = 1; ++ assert(num.bits == 0xFFFF_FFFF_8000_0001uL); ++} ++ ++unittest ++{ ++ // Bug #5942 ++ struct S ++ { ++ mixin(bitfields!( ++ int, "a" , 32, ++ int, "b" , 32 ++ )); ++ } ++ ++ S data; ++ data.b = 42; ++ data.a = 1; ++ assert(data.b == 42); ++} ++ ++unittest ++{ + struct Test + { + mixin(bitfields!(bool, "a", 1, +@@ -266,7 +367,7 @@ unittest + { + struct MoreIntegrals { + bool checkExpectations(uint eu, ushort es, uint ei) { return u == eu && s == es && i == ei; } +- ++ + mixin(bitfields!( + uint, "u", 24, + short, "s", 16, +@@ -585,7 +686,7 @@ struct BitArray + } + return result; + } +- ++ + /** ditto */ + int opApply(scope int delegate(size_t, bool) dg) const + { +@@ -721,9 +822,8 @@ struct BitArray + lo++; + hi--; + } +- Ldone: +- ; + } ++ Ldone: + return this; + } + +@@ -750,19 +850,17 @@ struct BitArray + + if (this.length != a2.length) + return 0; // not equal +- byte *p1 = cast(byte*)this.ptr; +- byte *p2 = cast(byte*)a2.ptr; +- auto n = this.length / 8; ++ auto p1 = this.ptr; ++ auto p2 = a2.ptr; ++ auto n = this.length / bitsPerSizeT; + for (i = 0; i < n; i++) + { + if (p1[i] != p2[i]) + return 0; // not equal + } + +- ubyte mask; +- +- n = this.length & 7; +- mask = cast(ubyte)((1 << n) - 1); ++ n = this.length & (bitsPerSizeT-1); ++ size_t mask = (1 << n) - 1; + //printf("i = %d, n = %d, mask = %x, %x, %x\n", i, n, mask, p1[i], p2[i]); + return (mask == 0) || (p1[i] & mask) == (p2[i] & mask); + } +@@ -799,22 +897,20 @@ struct BitArray + auto len = this.length; + if (a2.length < len) + len = a2.length; +- ubyte* p1 = cast(ubyte*)this.ptr; +- ubyte* p2 = cast(ubyte*)a2.ptr; +- auto n = len / 8; ++ auto p1 = this.ptr; ++ auto p2 = a2.ptr; ++ auto n = len / bitsPerSizeT; + for (i = 0; i < n; i++) + { + if (p1[i] != p2[i]) + break; // not equal + } +- for (uint j = i * 8; j < len; j++) ++ for (size_t j = 0; j < len-i * bitsPerSizeT; j++) + { +- ubyte mask = cast(ubyte)(1 << j); +- int c; +- +- c = cast(int)(p1[i] & mask) - cast(int)(p2[i] & mask); ++ size_t mask = cast(size_t)(1 << j); ++ auto c = (cast(long)(p1[i] & mask) - cast(long)(p2[i] & mask)); + if (c) +- return c; ++ return c > 0 ? 1 : -1; + } + return cast(int)this.len - cast(int)a2.length; + } +@@ -844,6 +940,18 @@ struct BitArray + assert(a == e); + assert(a <= e); + assert(a >= e); ++ ++ bool[] v; ++ for (int i = 1; i < 256; i++) ++ { ++ v.length = i; ++ v[] = false; ++ BitArray x; x.init(v); ++ v[i-1] = true; ++ BitArray y; y.init(v); ++ assert(x < y); ++ assert(x <= y); ++ } + } + + /*************************************** +@@ -1421,6 +1529,112 @@ struct BitArray + assert(c[1] == 1); + assert(c[2] == 0); + } ++ ++ /*************************************** ++ * Return a string representation of this BitArray. ++ * ++ * Two format specifiers are supported: ++ * $(LI $(B %s) which prints the bits as an array, and) ++ * $(LI $(B %b) which prints the bits as 8-bit byte packets) ++ * separated with an underscore. ++ */ ++ void toString(scope void delegate(const(char)[]) sink, ++ FormatSpec!char fmt) const ++ { ++ switch(fmt.spec) ++ { ++ case 'b': ++ return formatBitString(sink); ++ case 's': ++ return formatBitArray(sink); ++ default: ++ throw new Exception("Unknown format specifier: %" ~ fmt.spec); ++ } ++ } ++ ++ /// ++ unittest ++ { ++ BitArray b; ++ b.init([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); ++ ++ auto s1 = format("%s", b); ++ assert(s1 == "[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]"); ++ ++ auto s2 = format("%b", b); ++ assert(s2 == "00001111_00001111"); ++ } ++ ++ private void formatBitString(scope void delegate(const(char)[]) sink) const ++ { ++ if (!length) ++ return; ++ ++ auto leftover = len % 8; ++ foreach (idx; 0 .. leftover) ++ { ++ char[1] res = cast(char)(bt(ptr, idx) + '0'); ++ sink.put(res[]); ++ } ++ ++ if (leftover && len > 8) ++ sink.put("_"); ++ ++ size_t count; ++ foreach (idx; leftover .. len) ++ { ++ char[1] res = cast(char)(bt(ptr, idx) + '0'); ++ sink.put(res[]); ++ if (++count == 8 && idx != len - 1) ++ { ++ sink.put("_"); ++ count = 0; ++ } ++ } ++ } ++ ++ private void formatBitArray(scope void delegate(const(char)[]) sink) const ++ { ++ sink("["); ++ foreach (idx; 0 .. len) ++ { ++ char[1] res = cast(char)(bt(ptr, idx) + '0'); ++ sink(res[]); ++ if (idx+1 < len) ++ sink(", "); ++ } ++ sink("]"); ++ } ++} ++ ++unittest ++{ ++ BitArray b; ++ ++ b.init([]); ++ assert(format("%s", b) == "[]"); ++ assert(format("%b", b) is null); ++ ++ b.init([1]); ++ assert(format("%s", b) == "[1]"); ++ assert(format("%b", b) == "1"); ++ ++ b.init([0, 0, 0, 0]); ++ assert(format("%b", b) == "0000"); ++ ++ b.init([0, 0, 0, 0, 1, 1, 1, 1]); ++ assert(format("%s", b) == "[0, 0, 0, 0, 1, 1, 1, 1]"); ++ assert(format("%b", b) == "00001111"); ++ ++ b.init([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); ++ assert(format("%s", b) == "[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]"); ++ assert(format("%b", b) == "00001111_00001111"); ++ ++ b.init([1, 0, 0, 0, 0, 1, 1, 1, 1]); ++ assert(format("%b", b) == "1_00001111"); ++ ++ b.init([1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); ++ assert(format("%b", b) == "1_00001111_00001111"); + } + + /++ +@@ -1952,7 +2166,7 @@ private template canSwapEndianness(T) + unittest + { + foreach(T; TypeTuple!(bool, ubyte, byte, ushort, short, uint, int, ulong, +- long, char, wchar, dchar, float, double)) ++ long, char, wchar, dchar, float, double)) + { + static assert(canSwapEndianness!(T)); + static assert(canSwapEndianness!(const T)); +@@ -2161,7 +2375,7 @@ unittest + ubyte[] buffer = [66, 0, 0, 0, 65, 200, 0, 0]; + assert(buffer.peek!float()== 32.0); + assert(buffer.peek!float(4) == 25.0f); +- ++ + size_t index = 0; + assert(buffer.peek!float(&index) == 32.0f); + assert(index == 4); +@@ -2175,7 +2389,7 @@ unittest + ubyte[] buffer = [64, 64, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]; + assert(buffer.peek!double() == 32.0); + assert(buffer.peek!double(8) == 25.0); +- ++ + size_t index = 0; + assert(buffer.peek!double(&index) == 32.0); + assert(index == 8); +@@ -2187,7 +2401,7 @@ unittest + { + //enum + ubyte[] buffer = [0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 30]; +- ++ + enum Foo + { + one = 10, +@@ -2719,7 +2933,7 @@ unittest + { + //char (8bit) + ubyte[] buffer = [0, 0, 0]; +- ++ + buffer.write!char('a', 0); + assert(buffer == [97, 0, 0]); + +@@ -2743,7 +2957,7 @@ unittest + { + //wchar (16bit - 2x ubyte) + ubyte[] buffer = [0, 0, 0, 0]; +- ++ + buffer.write!wchar('ą', 0); + assert(buffer == [1, 5, 0, 0]); + +@@ -2763,7 +2977,7 @@ unittest + { + //dchar (32bit - 4x ubyte) + ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; +- ++ + buffer.write!dchar('ą', 0); + assert(buffer == [0, 0, 1, 5, 0, 0, 0, 0]); + +@@ -2778,7 +2992,7 @@ unittest + buffer.write!dchar('ą', &index); + assert(buffer == [0, 0, 1, 7, 0, 0, 1, 5]); + assert(index == 8); +- } ++ } + + { + //float (32bit - 4x ubyte) +@@ -2809,7 +3023,7 @@ unittest + + buffer.write!double(25.0, 8); + assert(buffer == [64, 64, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); +- ++ + size_t index = 0; + buffer.write!double(25.0, &index); + assert(buffer == [64, 57, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); +@@ -2823,7 +3037,7 @@ unittest + { + //enum + ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +- ++ + enum Foo + { + one = 10, +@@ -3012,19 +3226,19 @@ unittest + { + //char wchar dchar + auto buffer = appender!(const ubyte[])(); +- ++ + buffer.append!char('a'); + assert(buffer.data == [97]); + + buffer.append!char('b'); + assert(buffer.data == [97, 98]); +- ++ + buffer.append!wchar('ą'); + assert(buffer.data == [97, 98, 1, 5]); + + buffer.append!dchar('ą'); + assert(buffer.data == [97, 98, 1, 5, 0, 0, 1, 5]); +- } ++ } + + { + //float double +@@ -3040,7 +3254,7 @@ unittest + { + //enum + auto buffer = appender!(const ubyte[])(); +- ++ + enum Foo + { + one = 10, +@@ -3141,7 +3355,7 @@ unittest + size_t length = 0; + foreach(T; Types) + { +- toWrite.append!T(cast(T)values[index++]); ++ toWrite.append!(T, endianness)(cast(T)values[index++]); + length += T.sizeof; + } + +@@ -3151,11 +3365,11 @@ unittest + index = 0; + foreach(T; Types) + { +- assert(toRead.peek!T() == values[index], format("Failed Index: %s", index)); +- assert(toRead.peek!T(0) == values[index], format("Failed Index: %s", index)); ++ assert(toRead.peek!(T, endianness)() == values[index], format("Failed Index: %s", index)); ++ assert(toRead.peek!(T, endianness)(0) == values[index], format("Failed Index: %s", index)); + assert(toRead.length == length, + format("Failed Index [%s], Actual Length: %s", index, toRead.length)); +- assert(toRead.read!T() == values[index], format("Failed Index: %s", index)); ++ assert(toRead.read!(T, endianness)() == values[index], format("Failed Index: %s", index)); + length -= T.sizeof; + assert(toRead.length == length, + format("Failed Index [%s], Actual Length: %s", index, toRead.length)); +--- a/src/libphobos/src/std/c/linux/linuxextern.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/src/std/c/linux/linuxextern.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,15 @@ ++ ++/* Written by Walter Bright. ++ * www.digitalmars.com ++ * Placed into public domain. ++ * Linux(R) is the registered trademark of Linus Torvalds in the U.S. and other ++ * countries. ++ */ ++ ++/* These are all the globals defined by the linux C runtime library. ++ * Put them separate so they'll be externed - do not link in linuxextern.o ++ */ ++ ++module std.c.linux.linuxextern; ++ ++// No longer needed since "extern" storage class +--- a/src/libphobos/src/std/c/linux/tipc.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/linux/tipc.d 2014-04-01 16:32:51.000000000 +0100 +@@ -36,7 +36,7 @@ struct tipc_subscr + tipc_name_seq seq; + uint timeout; + uint filter; +- ubyte usr_handle[8]; ++ ubyte[8] usr_handle; + } + + struct tipc_event +--- a/src/libphobos/src/std/c/stdio.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/stdio.d 2014-04-01 16:32:51.000000000 +0100 +@@ -18,13 +18,4 @@ extern (C): + version (Windows) + { + extern shared ubyte[_NFILE] __fhnd_info; +- +- enum +- { +- FHND_APPEND = 0x04, +- FHND_DEVICE = 0x08, +- FHND_TEXT = 0x10, +- FHND_BYTE = 0x20, +- FHND_WCHAR = 0x40, +- } + } +--- a/src/libphobos/src/std/c/windows/com.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/windows/com.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,9 +1,11 @@ + module std.c.windows.com; ++version (Windows): + + pragma(lib,"uuid"); + +-private import std.c.windows.windows; +-private import std.string; ++import core.atomic; ++import std.c.windows.windows; ++import std.string; + + alias WCHAR OLECHAR; + alias OLECHAR *LPOLESTR; +@@ -37,7 +39,7 @@ struct GUID { // size is 16 + DWORD Data1; + WORD Data2; + WORD Data3; +- BYTE Data4[8]; ++ BYTE[8] Data4; + } + + enum +@@ -57,11 +59,11 @@ enum + } + + enum +-{ ++{ + COINIT_APARTMENTTHREADED = 0x2, + COINIT_MULTITHREADED = 0x0, + COINIT_DISABLE_OLE1DDE = 0x4, +- COINIT_SPEED_OVER_MEMORY = 0x8 ++ COINIT_SPEED_OVER_MEMORY = 0x8 + } + alias DWORD COINIT; + enum RPC_E_CHANGED_MODE = 0x80010106; +@@ -232,12 +234,12 @@ extern (System): + + ULONG AddRef() + { +- return InterlockedIncrement(&count); ++ return atomicOp!"+="(*cast(shared)&count, 1); + } + + ULONG Release() + { +- LONG lRef = InterlockedDecrement(&count); ++ LONG lRef = atomicOp!"-="(*cast(shared)&count, 1); + if (lRef == 0) + { + // free object +--- a/src/libphobos/src/std/c/windows/stat.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/windows/stat.d 2014-04-01 16:32:51.000000000 +0100 +@@ -3,13 +3,12 @@ + /// Author: Walter Bright + + module std.c.windows.stat; ++version (Windows): + + extern (C): + + // linux version is in std.c.linux.linux + +-version (Windows) +-{ + const S_IFMT = 0xF000; + const S_IFDIR = 0x4000; + const S_IFCHR = 0x2000; +@@ -46,4 +45,3 @@ struct struct_stat + int stat(char *, struct_stat *); + int fstat(int, struct_stat *); + int _wstat(wchar *, struct_stat *); +-} +--- a/src/libphobos/src/std/c/windows/windows.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/windows/windows.d 2014-04-01 16:32:51.000000000 +0100 +@@ -3,13 +3,6 @@ + States and other countries. */ + + module std.c.windows.windows; ++version (Windows): + + public import core.sys.windows.windows; +- +-version (Windows) +-{ +-} +-else +-{ +- static assert(0); // Windows only +-} +--- a/src/libphobos/src/std/c/windows/winsock.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/c/windows/winsock.d 2014-04-01 16:32:51.000000000 +0100 +@@ -5,6 +5,7 @@ + + + module std.c.windows.winsock; ++version (Windows): + + private import std.stdint; + private import std.c.windows.windows; +@@ -12,8 +13,8 @@ private import std.c.windows.windows; + + extern(Windows): + +-alias int SOCKET; +-alias uint socklen_t; ++alias size_t SOCKET; ++alias int socklen_t; + + const SOCKET INVALID_SOCKET = cast(SOCKET)~0; + const int SOCKET_ERROR = -1; +@@ -25,8 +26,8 @@ struct WSADATA + { + WORD wVersion; + WORD wHighVersion; +- char szDescription[WSADESCRIPTION_LEN + 1]; +- char szSystemStatus[WSASYS_STATUS_LEN + 1]; ++ char[WSADESCRIPTION_LEN + 1] szDescription; ++ char[WSASYS_STATUS_LEN + 1] szSystemStatus; + USHORT iMaxSockets; + USHORT iMaxUdpDg; + char* lpVendorInfo; +@@ -312,8 +313,17 @@ struct servent + { + char* s_name; + char** s_aliases; +- SHORT s_port; +- char* s_proto; ++ ++ version (Win64) ++ { ++ char* s_proto; ++ SHORT s_port; ++ } ++ else ++ { ++ SHORT s_port; ++ char* s_proto; ++ } + } + + +--- a/src/libphobos/src/std/complex.d 2013-06-02 11:37:56.000000000 +0100 ++++ b/src/libphobos/src/std/complex.d 2014-04-01 16:32:51.000000000 +0100 +@@ -115,6 +115,55 @@ struct Complex(T) if (isFloatingPoint!T + + /** Converts the complex number to a string representation. + ++ The second form of this function is usually not called directly; ++ instead, it is used via $(XREF format,format), as shown in the examples ++ below. Supported format characters are 'e', 'f', 'g', 'a', and 's'. ++ ++ See the $(LINK2 std_format.html, std.format documentation) for more ++ information. ++ */ ++ string toString() const /* TODO: pure @safe nothrow */ ++ { ++ import std.exception : assumeUnique; ++ char[] buf; ++ buf.reserve(100); ++ auto fmt = FormatSpec!char("%s"); ++ toString((const(char)[] s) { buf ~= s; }, fmt); ++ return assumeUnique(buf); ++ } ++ ++ static if (is(T == double)) ++ /// ++ unittest ++ { ++ auto c = complex(1.2, 3.4); ++ ++ // Vanilla toString formatting: ++ assert(c.toString() == "1.2+3.4i"); ++ ++ // Formatting with std.format specs: the precision and width specifiers ++ // apply to both the real and imaginary parts of the complex number. ++ import std.string; ++ assert(format("%.2f", c) == "1.20+3.40i"); ++ assert(format("%4.1f", c) == " 1.2+ 3.4i"); ++ } ++ ++ /// ditto ++ void toString(Char)(scope void delegate(const(Char)[]) sink, ++ FormatSpec!Char formatSpec) const ++ { ++ formatValue(sink, re, formatSpec); ++ if (signbit(im) == 0) sink("+"); ++ formatValue(sink, im, formatSpec); ++ sink("i"); ++ } ++ ++ /** ++ $(RED Deprecated. This function will be removed in March 2014. ++ Please use $(XREF format,format) instead.) ++ ++ Converts the complex number to a string representation. ++ + If a $(D sink) delegate is specified, the string is passed to it + and this function returns $(D null). Otherwise, this function + returns the string representation directly. +@@ -128,23 +177,22 @@ struct Complex(T) if (isFloatingPoint!T + + See the $(LINK2 std_format.html, std.format documentation) for + more information. +- */ +- string toString(scope void delegate(const(char)[]) sink = null, ++ */ ++ deprecated("Please use std.format.format() instead.") ++ string toString(scope void delegate(const(char)[]) sink, + string formatSpec = "%s") + const + { + if (sink == null) + { ++ import std.exception : assumeUnique; + char[] buf; + buf.reserve(100); +- toString((const(char)[] s) { buf ~= s; }, formatSpec); +- return cast(string) buf; ++ formattedWrite((const(char)[] s) { buf ~= s; }, formatSpec, this); ++ return assumeUnique(buf); + } + +- formattedWrite(sink, formatSpec, re); +- if (signbit(im) == 0) sink("+"); +- formattedWrite(sink, formatSpec, im); +- sink("i"); ++ formattedWrite(sink, formatSpec, this); + return null; + } + +@@ -663,7 +711,8 @@ Complex!T cos(T)(Complex!T z) @safe pur + unittest{ + assert(cos(complex(0.0)) == 1.0); + assert(cos(complex(1.3L)) == std.math.cos(1.3L)); +- assert(cos(complex(0, 5.2L)) == cosh(5.2L)); ++ assert(feqrel(cos(complex(0, 5.2L)).re, cosh(5.2L)) >= real.mant_dig - 1); ++ assert(cos(complex(0, 5.2L)).im == 0); + } + + +@@ -682,8 +731,7 @@ Complex!real expi(real y) @trusted pure + + unittest + { +- real value = 1.3e5L; //Avoid constant folding +- assert(expi(value) == complex(std.math.cos(value), std.math.sin(value))); ++ assert(expi(1.125L) == complex(std.math.cos(1.125L), std.math.sin(1.125L))); + assert(expi(0.0L) == 1.0L); + auto z1 = expi(1.234); + auto z2 = std.math.expi(1.234); +@@ -741,3 +789,36 @@ unittest + assert (sqrt(complex(1.0L, 0)) == std.math.sqrt(1.0L)); + assert (sqrt(complex(-1.0L, 0)) == complex(0, 1.0L)); + } ++ ++// Issue 10881: support %f formatting of complex numbers ++unittest ++{ ++ import std.string : format; ++ ++ auto x = complex(1.2, 3.4); ++ assert(format("%.2f", x) == "1.20+3.40i"); ++ ++ auto y = complex(1.2, -3.4); ++ assert(format("%.2f", y) == "1.20-3.40i"); ++} ++ ++unittest ++{ ++ // Test wide string formatting ++ wstring wformat(T)(string format, Complex!T c) ++ { ++ import std.array : appender; ++ auto w = appender!wstring(); ++ auto n = formattedWrite(w, format, c); ++ return w.data; ++ } ++ ++ auto x = complex(1.2, 3.4); ++ assert(wformat("%.2f", x) == "1.20+3.40i"w); ++} ++ ++unittest ++{ ++ // Test ease of use (vanilla toString() should be supported) ++ assert(complex(1.2, 3.4).toString() == "1.2+3.4i"); ++} +--- a/src/libphobos/src/std/concurrency.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/concurrency.d 2014-04-01 16:32:51.000000000 +0100 +@@ -13,8 +13,6 @@ + * additional features specific to in-process messaging. + * + * Synposis: +- *$(D_RUN_CODE +- *$(ARGS + * --- + * import std.stdio; + * import std.concurrency; +@@ -45,7 +43,6 @@ + * writeln("Successfully printed number."); + * } + * --- +- *), $(ARGS), $(ARGS), $(ARGS)) + * + * Copyright: Copyright Sean Kelly 2009 - 2010. + * License: Boost License 1.0. +@@ -70,6 +67,7 @@ private + import core.sync.mutex; + import core.sync.condition; + import std.algorithm; ++ import std.datetime; + import std.exception; + import std.range; + import std.string; +@@ -193,17 +191,6 @@ private + } + + +-shared static this() +-{ +- // NOTE: Normally, mbox is initialized by spawn() or thisTid(). This +- // doesn't support the simple case of calling only receive() in main +- // however. To ensure that this works, initialize the main thread's +- // mbox field here (as shared static ctors are run once on startup +- // by the main thread). +- mbox = new MessageBox; +-} +- +- + static ~this() + { + if( mbox !is null ) +@@ -303,6 +290,19 @@ class MailboxFull : Exception + } + + ++/** ++ * Thrown when a Tid is missing, e.g. when $(D ownerTid) doesn't ++ * find an owner thread. ++ */ ++class TidMissingException : Exception ++{ ++ this(string msg, string file = __FILE__, size_t line = __LINE__) ++ { ++ super(msg, file, line); ++ } ++} ++ ++ + ////////////////////////////////////////////////////////////////////////////// + // Thread ID + ////////////////////////////////////////////////////////////////////////////// +@@ -313,14 +313,6 @@ class MailboxFull : Exception + */ + struct Tid + { +- void send(T...)( T vals ) +- { +- static assert( !hasLocalAliasing!(T), +- "Aliases to mutable thread-local data not allowed." ); +- _send( this, vals ); +- } +- +- + private: + this( MessageBox m ) + { +@@ -343,6 +335,34 @@ private: + return Tid( mbox ); + } + ++/** ++ * Return the Tid of the thread which ++ * spawned the caller's thread. ++ * ++ * Throws: A $(D TidMissingException) exception if ++ * there is no owner thread. ++ */ ++@property Tid ownerTid() ++{ ++ enforceEx!TidMissingException(owner.mbox !is null, "Error: Thread has no owner thread."); ++ return owner; ++} ++ ++unittest ++{ ++ static void fun() ++ { ++ string res = receiveOnly!string(); ++ assert(res == "Main calling"); ++ ownerTid.send("Child responding"); ++ } ++ ++ assertThrown!TidMissingException(ownerTid); ++ auto child = spawn(&fun); ++ child.send("Main calling"); ++ string res = receiveOnly!string(); ++ assert(res == "Child responding"); ++} + + ////////////////////////////////////////////////////////////////////////////// + // Thread Creation +@@ -391,8 +411,6 @@ private template isSpawnable(F, T...) + * threads. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * --- + * import std.stdio, std.concurrency; + * +@@ -417,7 +435,6 @@ private template isSpawnable(F, T...) + * auto tid2 = spawn(&f2, str.dup); + * } + * --- +- *), $(ARGS), $(ARGS), $(ARGS)) + */ + Tid spawn(F, T...)( F fn, T args ) + if ( isSpawnable!(F, T) ) +@@ -585,8 +602,6 @@ private void _send(T...)( MsgType type, + * sent. + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * --- + * import std.stdio; + * import std.variant; +@@ -607,9 +622,14 @@ private void _send(T...)( MsgType type, + * send(tid, 42); + * } + * --- +- *), $(ARGS), $(ARGS), $(ARGS)) + */ + void receive(T...)( T ops ) ++in ++{ ++ assert(mbox !is null, "Cannot receive a message until a thread was spawned " ++ "or thisTid was passed to a running thread."); ++} ++body + { + checkops( ops ); + mbox.get( ops ); +@@ -668,11 +688,9 @@ private template receiveOnlyRet(T...) + * the message will be packed into a $(XREF typecons, Tuple). + * + * Example: +- *$(D_RUN_CODE +- *$(ARGS + * --- + * import std.concurrency; +- ++ * + * void spawnedFunc() + * { + * auto msg = receiveOnly!(int, string)(); +@@ -686,9 +704,14 @@ private template receiveOnlyRet(T...) + * send(tid, 42, "42"); + * } + * --- +- *), $(ARGS), $(ARGS), $(ARGS)) + */ + receiveOnlyRet!(T) receiveOnly(T...)() ++in ++{ ++ assert(mbox !is null, "Cannot receive a message until a thread was spawned " ++ "or thisTid was passed to a running thread."); ++} ++body + { + Tuple!(T) ret; + +@@ -743,13 +766,6 @@ unittest + assert(result == "Unexpected message type: expected 'string', got 'int'"); + } + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use the overload of receiveTimeout which takes a Duration.") +-bool receiveTimeout(T...)( long ms, T ops ) +-{ +- return receiveTimeout( dur!"msecs"( ms ), ops ); +-} +- + /++ + Same as $(D receive) except that rather than wait forever for a message, + it waits until either it receives a message or the given +@@ -757,6 +773,12 @@ bool receiveTimeout(T...)( long ms, T op + message and $(D false) if it timed out waiting for one. + +/ + bool receiveTimeout(T...)( Duration duration, T ops ) ++in ++{ ++ assert(mbox !is null, "Cannot receive a message until a thread was spawned " ++ "or thisTid was passed to a running thread."); ++} ++body + { + checkops( ops ); + return mbox.get( duration, ops ); +@@ -1246,6 +1268,11 @@ private + return false; + } + ++ static if( timedWait ) ++ { ++ auto limit = Clock.currTime( UTC() ) + period; ++ } ++ + while( true ) + { + ListT arrived; +@@ -1270,7 +1297,7 @@ private + m_notFull.notifyAll(); + static if( timedWait ) + { +- if( !m_putMsg.wait( period ) ) ++ if( period.isNegative || !m_putMsg.wait( period ) ) + return false; + } + else +@@ -1286,7 +1313,14 @@ private + scope(exit) m_localBox.put( arrived ); + if( scan( arrived ) ) + return true; +- else continue; ++ else ++ { ++ static if( timedWait ) ++ { ++ period = limit - Clock.currTime( UTC() ); ++ } ++ continue; ++ } + } + m_localBox.put( arrived ); + pty( m_localPty ); +--- a/src/libphobos/src/std/container.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/container.d 2014-04-01 16:32:51.000000000 +0100 +@@ -849,18 +849,11 @@ template make(T) + if (is(T == struct) || is(T == class)) + { + T make(Args...)(Args arguments) +- if (is(T == struct) && __traits(compiles, T(arguments)) && Args.length > 0) ++ if (is(T == struct) && __traits(compiles, T(arguments))) + { + return T(arguments); + } + +- //@@@BUG@@@ 8763 makes this extra function necessary. +- T make()() +- if (is(T == struct)) +- { +- return T(); +- } +- + T make(Args...)(Args arguments) + if (is(T == class) && __traits(compiles, new T(arguments))) + { +@@ -2240,7 +2233,7 @@ Complexity: $(BIGOH 1) + /// ditto + template linearRemove(R) if (is(R == Range)) + { +- Range linearRemove(R r) { return remove(r); }; ++ Range linearRemove(R r) { return remove(r); } + } + + /// ditto +@@ -2590,7 +2583,7 @@ struct Array(T) if (!is(T : const(bool)) + auto newPayload = + enforce((cast(T*) malloc(sz))[0 .. oldLength]); + // copy old data over to new array +- newPayload[] = _payload[]; ++ memcpy(newPayload.ptr, _payload.ptr, T.sizeof * oldLength); + // Zero out unused capacity to prevent gc from seeing + // false pointers + memset(newPayload.ptr + oldLength, +@@ -3622,14 +3615,14 @@ unittest + // make sure that Array instances refuse ranges that don't belong to them + unittest + { +- Array!int a = [1, 2, 3]; +- auto r = a.dup[]; +- assertThrown(a.insertBefore(r, 42)); +- assertThrown(a.insertBefore(r, [42])); +- assertThrown(a.insertAfter(r, 42)); +- assertThrown(a.replace(r, 42)); +- assertThrown(a.replace(r, [42])); +- assertThrown(a.linearRemove(r)); ++ Array!int a = [1, 2, 3]; ++ auto r = a.dup[]; ++ assertThrown(a.insertBefore(r, 42)); ++ assertThrown(a.insertBefore(r, [42])); ++ assertThrown(a.insertAfter(r, 42)); ++ assertThrown(a.replace(r, 42)); ++ assertThrown(a.replace(r, [42])); ++ assertThrown(a.linearRemove(r)); + } + unittest + { +@@ -3686,6 +3679,20 @@ unittest + assert(r.equal([0, 0, 40])); + } + ++// Test issue 11194 ++unittest { ++ static struct S { ++ int i = 1337; ++ void* p; ++ this(this) { assert(i == 1337); } ++ ~this() { assert(i == 1337); } ++ } ++ Array!S arr; ++ S s; ++ arr ~= s; ++ arr ~= s; ++} ++ + // BinaryHeap + /** + Implements a $(WEB en.wikipedia.org/wiki/Binary_heap, binary heap) +--- a/src/libphobos/src/std/conv.d 2013-06-02 11:37:56.000000000 +0100 ++++ b/src/libphobos/src/std/conv.d 2014-04-01 16:32:51.000000000 +0100 +@@ -14,6 +14,10 @@ Authors: $(WEB digitalmars.com, Walter + Kenji Hara + + Source: $(PHOBOSSRC std/_conv.d) ++ ++Macros: ++WIKI = Phobos/StdConv ++ + */ + module std.conv; + +@@ -23,7 +27,6 @@ import std.algorithm, std.array, std.asc + std.string, std.traits, std.typecons, std.typetuple, std.uni, + std.utf; + import std.format; +-import std.metastrings; + + //debug=conv; // uncomment to turn on debugging printf's + +@@ -34,43 +37,47 @@ import std.metastrings; + */ + class ConvException : Exception + { ++ @safe pure nothrow + this(string s, string fn = __FILE__, size_t ln = __LINE__) + { + super(s, fn, ln); + } + } + +-private string convError_unexpected(S)(S source) { ++private string convError_unexpected(S)(S source) ++{ + return source.empty ? "end of input" : text("'", source.front, "'"); + } + +-private void convError(S, T)(S source, string fn = __FILE__, size_t ln = __LINE__) ++private auto convError(S, T)(S source, string fn = __FILE__, size_t ln = __LINE__) + { +- throw new ConvException( ++ return new ConvException( + text("Unexpected ", convError_unexpected(source), + " when converting from type "~S.stringof~" to type "~T.stringof), + fn, ln); + } + +-private void convError(S, T)(S source, int radix, string fn = __FILE__, size_t ln = __LINE__) ++private auto convError(S, T)(S source, int radix, string fn = __FILE__, size_t ln = __LINE__) + { +- throw new ConvException( ++ return new ConvException( + text("Unexpected ", convError_unexpected(source), + " when converting from type "~S.stringof~" base ", radix, + " to type "~T.stringof), + fn, ln); + } + +-private void parseError(lazy string msg, string fn = __FILE__, size_t ln = __LINE__) ++@safe pure/* nothrow*/ // lazy parameter bug ++private auto parseError(lazy string msg, string fn = __FILE__, size_t ln = __LINE__) + { +- throw new ConvException(text("Can't parse string: ", msg), fn, ln); ++ return new ConvException(text("Can't parse string: ", msg), fn, ln); + } + + private void parseCheck(alias source)(dchar c, string fn = __FILE__, size_t ln = __LINE__) + { +- if (source.empty) parseError(text("unexpected end of input when expecting", "\"", c, "\"")); ++ if (source.empty) ++ throw parseError(text("unexpected end of input when expecting", "\"", c, "\"")); + if (source.front != c) +- parseError(text("\"", c, "\" is missing"), fn, ln); ++ throw parseError(text("\"", c, "\" is missing"), fn, ln); + source.popFront(); + } + +@@ -78,17 +85,17 @@ private + { + template isImaginary(T) + { +- enum bool isImaginary = staticIndexOf!(Unqual!(T), ++ enum bool isImaginary = staticIndexOf!(Unqual!T, + ifloat, idouble, ireal) >= 0; + } + template isComplex(T) + { +- enum bool isComplex = staticIndexOf!(Unqual!(T), ++ enum bool isComplex = staticIndexOf!(Unqual!T, + cfloat, cdouble, creal) >= 0; + } + template isNarrowInteger(T) + { +- enum bool isNarrowInteger = staticIndexOf!(Unqual!(T), ++ enum bool isNarrowInteger = staticIndexOf!(Unqual!T, + byte, ubyte, short, ushort) >= 0; + } + +@@ -134,6 +141,7 @@ private + */ + class ConvOverflowException : ConvException + { ++ @safe pure nothrow + this(string s, string fn = __FILE__, size_t ln = __LINE__) + { + super(s, fn, ln); +@@ -258,7 +266,6 @@ $(D_PARAM to!(double[])) applies to an $ + conversion might throw an exception because $(D_PARAM to!short) + might fail the range check. + +-Macros: WIKI=Phobos/StdConv + */ + + /** +@@ -283,7 +290,7 @@ template to(T) + } + + // Tests for issue 6175 +-unittest ++@safe pure unittest + { + char[9] sarr = "blablabla"; + auto darr = to!(char[])(sarr); +@@ -292,34 +299,34 @@ unittest + } + + // Tests for issue 7348 +-unittest ++@safe pure unittest + { + assert(to!string(null) == "null"); + assert(text(null) == "null"); + } + + // Tests for issue 8729: do NOT skip leading WS +-unittest ++@safe pure unittest + { +- foreach(T;TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong)) ++ foreach (T; TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong)) + { + assertThrown!ConvException(to!T(" 0")); + assertThrown!ConvException(to!T(" 0", 8)); + } +- foreach(T;TypeTuple!(float, double, real)) ++ foreach (T; TypeTuple!(float, double, real)) + { + assertThrown!ConvException(to!T(" 0")); + } + +- assertThrown!ConvException(to!bool (" true")); ++ assertThrown!ConvException(to!bool(" true")); + +- alias typeof(null) NullType; ++ alias NullType = typeof(null); + assertThrown!ConvException(to!NullType(" null")); + +- alias int[] ARR; ++ alias ARR = int[]; + assertThrown!ConvException(to!ARR(" [1]")); + +- alias int[int] AA; ++ alias AA = int[int]; + assertThrown!ConvException(to!AA(" [1:1]")); + } + +@@ -331,7 +338,11 @@ T toImpl(T, S)(S value) + if (isImplicitlyConvertible!(S, T) && + !isEnumStrToStr!(S, T) && !isNullToStr!(S, T)) + { +- alias isUnsigned isUnsignedInt; ++ template isSignedInt(T) ++ { ++ enum isSignedInt = isIntegral!T && isSigned!T; ++ } ++ alias isUnsignedInt = isUnsigned; + + // Conversion from integer to integer, and changing its sign + static if (isUnsignedInt!S && isSignedInt!T && S.sizeof == T.sizeof) +@@ -348,19 +359,14 @@ T toImpl(T, S)(S value) + return value; + } + +-unittest ++@safe pure unittest + { + enum E { a } // Issue 9523 - Allow identity enum conversion + auto e = to!E(E.a); + assert(e == E.a); + } + +-private template isSignedInt(T) +-{ +- enum isSignedInt = isIntegral!T && isSigned!T; +-} +- +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + int a = 42; +@@ -369,25 +375,25 @@ unittest + } + + // Tests for issue 6377 +-unittest ++@safe pure unittest + { + // Conversion between same size + foreach (S; TypeTuple!(byte, short, int, long)) + { + alias Unsigned!S U; + +- foreach (Sint; TypeTuple!(S, const(S), immutable(S))) +- foreach (Uint; TypeTuple!(U, const(U), immutable(U))) ++ foreach (Sint; TypeTuple!(S, const S, immutable S)) ++ foreach (Uint; TypeTuple!(U, const U, immutable U)) + { + // positive overflow + Uint un = Uint.max; +- assertThrown!ConvOverflowException(to!Sint(un), text( +- Sint.stringof, ' ', Uint.stringof, ' ', un)); ++ assertThrown!ConvOverflowException(to!Sint(un), ++ text(Sint.stringof, ' ', Uint.stringof, ' ', un)); + + // negative overflow + Sint sn = -1; +- assertThrown!ConvOverflowException(to!Uint(sn), text( +- Sint.stringof, ' ', Uint.stringof, ' ', un)); ++ assertThrown!ConvOverflowException(to!Uint(sn), ++ text(Sint.stringof, ' ', Uint.stringof, ' ', un)); + } + } + +@@ -401,8 +407,8 @@ unittest + static assert(U1.sizeof < S2.sizeof); + + // small unsigned to big signed +- foreach (Uint; TypeTuple!(U1, const(U1), immutable(U1))) +- foreach (Sint; TypeTuple!(S2, const(S2), immutable(S2))) ++ foreach (Uint; TypeTuple!(U1, const U1, immutable U1)) ++ foreach (Sint; TypeTuple!(S2, const S2, immutable S2)) + { + Uint un = Uint.max; + assertNotThrown(to!Sint(un)); +@@ -410,8 +416,8 @@ unittest + } + + // big unsigned to small signed +- foreach (Uint; TypeTuple!(U2, const(U2), immutable(U2))) +- foreach (Sint; TypeTuple!(S1, const(S1), immutable(S1))) ++ foreach (Uint; TypeTuple!(U2, const U2, immutable U2)) ++ foreach (Sint; TypeTuple!(S1, const S1, immutable S1)) + { + Uint un = Uint.max; + assertThrown(to!Sint(un)); +@@ -420,16 +426,16 @@ unittest + static assert(S1.sizeof < U2.sizeof); + + // small signed to big unsigned +- foreach (Sint; TypeTuple!(S1, const(S1), immutable(S1))) +- foreach (Uint; TypeTuple!(U2, const(U2), immutable(U2))) ++ foreach (Sint; TypeTuple!(S1, const S1, immutable S1)) ++ foreach (Uint; TypeTuple!(U2, const U2, immutable U2)) + { + Sint sn = -1; + assertThrown!ConvOverflowException(to!Uint(sn)); + } + + // big signed to small unsigned +- foreach (Sint; TypeTuple!(S2, const(S2), immutable(S2))) +- foreach (Uint; TypeTuple!(U1, const(U1), immutable(U1))) ++ foreach (Sint; TypeTuple!(S2, const S2, immutable S2)) ++ foreach (Uint; TypeTuple!(U1, const U1, immutable U1)) + { + Sint sn = -1; + assertThrown!ConvOverflowException(to!Uint(sn)); +@@ -446,32 +452,13 @@ T toImpl(T, S)(ref S s) + return toImpl!(T, typeof(s[0])[])(s); + } + +-unittest ++@safe pure unittest + { + char[4] test = ['a', 'b', 'c', 'd']; + static assert(!isInputRange!(Unqual!(char[4]))); + assert(to!string(test) == test); + } + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated T toImpl(T, S)(S value) +- if (is(S : Object) && !is(T : Object) && !isSomeString!T && +- hasMember!(S, "to") && is(typeof(S.init.to!T()) : T)) +-{ +- return value.to!T(); +-} +- +-unittest +-{ +- debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +- class B +- { +- T to(T)() { return 43; } +- } +- auto b = new B; +- assert(to!int(b) == 43); +-} +- + /** + When source type supports member template function opCast, is is used. + */ +@@ -482,7 +469,7 @@ T toImpl(T, S)(S value) + return value.opCast!T(); + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + class B +@@ -514,7 +501,7 @@ T toImpl(T, S)(S value) + } + + // Bugzilla 3961 +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + struct Int +@@ -526,14 +513,14 @@ unittest + static struct Int2 + { + int x; +- this(int x) { this.x = x; } ++ this(int x) @safe pure { this.x = x; } + } + Int2 i2 = to!Int2(1); + + static struct Int3 + { + int x; +- static Int3 opCall(int x) ++ static Int3 opCall(int x) @safe pure + { + Int3 i; + i.x = x; +@@ -544,11 +531,11 @@ unittest + } + + // Bugzilla 6808 +-unittest ++@safe pure unittest + { + static struct FakeBigInt + { +- this(string s){} ++ this(string s) @safe pure {} + } + + string s = "101"; +@@ -563,7 +550,7 @@ T toImpl(T, S)(S value) + return new T(value); + } + +-unittest ++@safe pure unittest + { + static struct S + { +@@ -572,14 +559,14 @@ unittest + static class C + { + int x; +- this(int x) { this.x = x; } ++ this(int x) @safe pure { this.x = x; } + } + + static class B + { + int value; +- this(S src) { value = src.x; } +- this(C src) { value = src.x; } ++ this(S src) @safe pure { value = src.x; } ++ this(C src) @safe pure { value = src.x; } + } + + S s = S(1); +@@ -594,34 +581,35 @@ unittest + assert(c2.x == 3); + } + +-version (unittest) ++@safe pure unittest + { +- class A +- { +- this(B b) {} +- } +- class B : A ++ struct S + { +- this() { super(this); } ++ class A ++ { ++ this(B b) @safe pure {} ++ } ++ class B : A ++ { ++ this() @safe pure { super(this); } ++ } + } +-} +-unittest +-{ +- B b = new B(); +- A a = to!A(b); // == cast(A)b +- // (do not run construction conversion like new A(b)) ++ ++ S.B b = new S.B(); ++ S.A a = to!(S.A)(b); // == cast(S.A)b ++ // (do not run construction conversion like new S.A(b)) + assert(b is a); + + static class C : Object + { +- this() {} +- this(Object o) {} ++ this() @safe pure {} ++ this(Object o) @safe pure {} + } + + Object oc = new C(); + C a2 = to!C(oc); // == new C(a) + // Construction conversion overrides down-casting conversion +- assert(a2 != a); // ++ assert(a2 !is a); // + } + + /** +@@ -669,7 +657,7 @@ T toImpl(T, S)(S value) + } + static assert(isModConvertible, "Bad modifier conversion: "~S.stringof~" to "~T.stringof); + +- auto result = cast(T) value; ++ auto result = ()@trusted{ return cast(T) value; }(); + if (!result && value) + { + throw new ConvException("Cannot convert object of static type " +@@ -679,7 +667,7 @@ T toImpl(T, S)(S value) + return result; + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + // Testing object conversions +@@ -693,14 +681,14 @@ unittest + } + + // Unittest for 6288 +-version (unittest) ++@safe pure unittest + { +- private template Identity(T) { alias T Identity; } +- private template toConst(T) { alias const(T) toConst; } +- private template toShared(T) { alias shared(T) toShared; } +- private template toSharedConst(T) { alias shared(const(T)) toSharedConst; } +- private template toImmutable(T) { alias immutable(T) toImmutable; } +- private template AddModifier(int n) if (0 <= n && n < 5) ++ template Identity(T) { alias T Identity; } ++ template toConst(T) { alias const(T) toConst; } ++ template toShared(T) { alias shared(T) toShared; } ++ template toSharedConst(T) { alias shared(const(T)) toSharedConst; } ++ template toImmutable(T) { alias immutable(T) toImmutable; } ++ template AddModifier(int n) if (0 <= n && n < 5) + { + static if (n == 0) alias Identity AddModifier; + else static if (n == 1) alias toConst AddModifier; +@@ -708,9 +696,7 @@ version (unittest) + else static if (n == 3) alias toSharedConst AddModifier; + else static if (n == 4) alias toImmutable AddModifier; + } +-} +-unittest +-{ ++ + interface I {} + interface J {} + +@@ -784,10 +770,12 @@ $(UL + $(DD Convert integral value to string in $(D_PARAM radix) radix. + radix must be a value from 2 to 36. + value is treated as a signed value only if radix is 10. +- The characters A through Z are used to represent values 10 through 36.))) ++ The characters A through Z are used to represent values 10 through 36 ++ and their case is determined by the $(D_PARAM letterCase) parameter.))) + $(LI All floating point types to all string types.) + $(LI Pointer to string conversions prints the pointer as a $(D size_t) value. +- If pointer is $(D char*), treat it as C-style strings.)) ++ If pointer is $(D char*), treat it as C-style strings. ++ In that case, this function is $(D @system).)) + */ + T toImpl(T, S)(S value) + if (!(isImplicitlyConvertible!(S, T) && +@@ -810,8 +798,16 @@ T toImpl(T, S)(S value) + } + else static if (isExactSomeString!S) + { +- // other string-to-string conversions always run decode/encode +- return toStr!T(value); ++ // other string-to-string ++ //Use Appender directly instead of toStr, which also uses a formatedWrite ++ auto w = appender!T(); ++ w.put(value); ++ return w.data; ++ } ++ else static if (isIntegral!S && !is(S == enum)) ++ { ++ // other integral-to-string conversions with default radix ++ return toImpl!(T, S)(value, 10); + } + else static if (is(S == void[]) || is(S == const(void)[]) || is(S == immutable(void)[])) + { +@@ -823,13 +819,47 @@ T toImpl(T, S)(S value) + ~ S.stringof ~ " to a " + ~ T.stringof)); + auto result = new Char[raw.length / Char.sizeof]; +- memcpy(result.ptr, value.ptr, value.length); ++ ()@trusted{ memcpy(result.ptr, value.ptr, value.length); }(); + return cast(T) result; + } + else static if (isPointer!S && is(S : const(char)*)) + { ++ // It is unsafe because we cannot guarantee that the pointer is null terminated. + return value ? cast(T) value[0 .. strlen(value)].dup : cast(string)null; + } ++ else static if (isSomeString!T && is(S == enum)) ++ { ++ static if (isSwitchable!(OriginalType!S) && EnumMembers!S.length <= 50) ++ { ++ switch(value) ++ { ++ foreach (I, member; NoDuplicates!(EnumMembers!S)) ++ { ++ case member: ++ return to!T(enumRep!(immutable(T), S, I)); ++ } ++ default: ++ } ++ } ++ else ++ { ++ foreach (I, member; EnumMembers!S) ++ { ++ if (value == member) ++ return to!T(enumRep!(immutable(T), S, I)); ++ } ++ } ++ ++ //Default case, delegate to format ++ //Note: we don't call toStr directly, to avoid duplicate work. ++ auto app = appender!T(); ++ app.put("cast("); ++ app.put(S.stringof); ++ app.put(')'); ++ FormatSpec!char f; ++ formatValue(app, cast(OriginalType!S)value, f); ++ return app.data; ++ } + else + { + // other non-string values runs formatting +@@ -837,48 +867,81 @@ T toImpl(T, S)(S value) + } + } + ++/* ++ Check whether type $(D T) can be used in a switch statement. ++ This is useful for compile-time generation of switch case statements. ++*/ ++private template isSwitchable(E) ++{ ++ enum bool isSwitchable = is(typeof({ ++ switch (E.init) { default: } ++ })); ++} ++ ++// + unittest + { +- // string to string conversion +- debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); ++ static assert(isSwitchable!int); ++ static assert(!isSwitchable!double); ++ static assert(!isSwitchable!real); ++} ++ ++//Static representation of the index I of the enum S, ++//In representation T. ++//T must be an immutable string (avoids un-necessary initializations). ++private template enumRep(T, S, size_t I) ++if (is (T == immutable) && isExactSomeString!T && is(S == enum)) ++{ ++ static T enumRep = to!T(__traits(allMembers, S)[I]); ++} + +- alias TypeTuple!(char, wchar, dchar) Chars; +- foreach (LhsC; Chars) ++@safe pure unittest ++{ ++ void dg() + { +- alias TypeTuple!(LhsC[], const(LhsC)[], immutable(LhsC)[]) LhStrings; +- foreach (Lhs; LhStrings) ++ // string to string conversion ++ debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); ++ ++ alias TypeTuple!(char, wchar, dchar) Chars; ++ foreach (LhsC; Chars) + { +- foreach (RhsC; Chars) ++ alias TypeTuple!(LhsC[], const(LhsC)[], immutable(LhsC)[]) LhStrings; ++ foreach (Lhs; LhStrings) + { +- alias TypeTuple!(RhsC[], const(RhsC)[], immutable(RhsC)[]) +- RhStrings; +- foreach (Rhs; RhStrings) ++ foreach (RhsC; Chars) + { +- Lhs s1 = to!Lhs("wyda"); +- Rhs s2 = to!Rhs(s1); +- //writeln(Lhs.stringof, " -> ", Rhs.stringof); +- assert(s1 == to!Lhs(s2)); ++ alias TypeTuple!(RhsC[], const(RhsC)[], immutable(RhsC)[]) ++ RhStrings; ++ foreach (Rhs; RhStrings) ++ { ++ Lhs s1 = to!Lhs("wyda"); ++ Rhs s2 = to!Rhs(s1); ++ //writeln(Lhs.stringof, " -> ", Rhs.stringof); ++ assert(s1 == to!Lhs(s2)); ++ } + } + } + } +- } + +- foreach (T; Chars) +- { +- foreach (U; Chars) ++ foreach (T; Chars) + { +- T[] s1 = to!(T[])("Hello, world!"); +- auto s2 = to!(U[])(s1); +- assert(s1 == to!(T[])(s2)); +- auto s3 = to!(const(U)[])(s1); +- assert(s1 == to!(T[])(s3)); +- auto s4 = to!(immutable(U)[])(s1); +- assert(s1 == to!(T[])(s4)); ++ foreach (U; Chars) ++ { ++ T[] s1 = to!(T[])("Hello, world!"); ++ auto s2 = to!(U[])(s1); ++ assert(s1 == to!(T[])(s2)); ++ auto s3 = to!(const(U)[])(s1); ++ assert(s1 == to!(T[])(s3)); ++ auto s4 = to!(immutable(U)[])(s1); ++ assert(s1 == to!(T[])(s4)); ++ } + } + } ++ dg(); ++ assertCTFEable!dg; + } + +-unittest ++@safe pure unittest + { + // Conversion reinterpreting void array to string + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -891,7 +954,7 @@ unittest + assert(c == "abcx"); + } + +-unittest ++@system pure unittest + { + // char* to string conversion + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -901,7 +964,7 @@ unittest + assert(to!string("foo\0".ptr) == "foo"); + } + +-unittest ++@safe pure unittest + { + // Conversion representing bool value with string + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -912,15 +975,15 @@ unittest + assert(to!string(b) == "true"); + } + +-unittest ++@safe pure unittest + { + // Conversion representing character value with string + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + + alias TypeTuple!( +- char, wchar, dchar, +- const(char), const(wchar), const(dchar), +- immutable(char), immutable(wchar), immutable(dchar)) AllChars; ++ char, const( char), immutable( char), ++ wchar, const(wchar), immutable(wchar), ++ dchar, const(dchar), immutable(dchar)) AllChars; + foreach (Char1; AllChars) + { + foreach (Char2; AllChars) +@@ -942,7 +1005,7 @@ unittest + assert(s2 == "foo"); + } + +-unittest ++@safe pure unittest + { + // Conversion representing integer values with string + +@@ -974,9 +1037,16 @@ unittest + assert(wtext(int.max) == "2147483647"w); + assert(wtext(int.min) == "-2147483648"w); + assert(to!string(0L) == "0"); ++ ++ assertCTFEable!( ++ { ++ assert(to!string(1uL << 62) == "4611686018427387904"); ++ assert(to!string(0x100000000) == "4294967296"); ++ assert(to!string(-138L) == "-138"); ++ }); + } + +-unittest ++@safe pure unittest + { + // Conversion representing dynamic/static array with string + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -984,12 +1054,14 @@ unittest + long[] b = [ 1, 3, 5 ]; + auto s = to!string(b); + assert(to!string(b) == "[1, 3, 5]", s); +- ++} ++/*@safe pure */unittest // sprintf issue ++{ + double[2] a = [ 1.5, 2.5 ]; + assert(to!string(a) == "[1.5, 2.5]"); + } + +-unittest ++/*@safe pure */unittest + { + // Conversion representing associative array with string + int[string] a = ["0":1, "1":2]; +@@ -1073,8 +1145,36 @@ unittest + assert(to!dstring(o) == "cast(EU)5"d); + } + ++unittest ++{ ++ enum E ++ { ++ foo, ++ bar, ++ doo = foo, // check duplicate switch statements ++ } ++ ++ foreach (S; TypeTuple!(string, wstring, dstring, const(char[]), const(wchar[]), const(dchar[]))) ++ { ++ auto s1 = to!S(E.foo); ++ auto s2 = to!S(E.foo); ++ assert(s1 == s2); ++ // ensure we don't allocate when it's unnecessary ++ assert(s1 is s2); ++ } ++ ++ foreach (S; TypeTuple!(char[], wchar[], dchar[])) ++ { ++ auto s1 = to!S(E.foo); ++ auto s2 = to!S(E.foo); ++ assert(s1 == s2); ++ // ensure each mutable array is unique ++ assert(s1 !is s2); ++ } ++} ++ + /// ditto +-T toImpl(T, S)(S value, uint radix) ++@trusted pure T toImpl(T, S)(S value, uint radix, LetterCase letterCase = LetterCase.upper) + if (isIntegral!S && + isExactSomeString!T) + in +@@ -1083,34 +1183,71 @@ in + } + body + { +- static if (!is(IntegralTypeOf!S == ulong)) +- { +- enforce(radix >= 2 && radix <= 36, new ConvException("Radix error")); +- if (radix == 10) +- return to!string(value); // handle signed cases only for radix 10 +- return to!string(cast(ulong) value, radix); +- } +- else ++ alias EEType = Unqual!(ElementEncodingType!T); ++ ++ T toStringRadixConvert(size_t bufLen, uint radix = 0, bool neg = false)(uint runtimeRadix = 0) + { +- char[value.sizeof * 8] buffer; +- uint i = buffer.length; ++ static if (neg) ++ ulong div = void, mValue = unsigned(-value); ++ else ++ Unsigned!(Unqual!S) div = void, mValue = unsigned(value); + +- if (value < radix && value < hexDigits.length) +- return hexDigits[cast(size_t)value .. cast(size_t)value + 1]; ++ size_t index = bufLen; ++ EEType[bufLen] buffer = void; ++ char baseChar = letterCase == LetterCase.lower ? 'a' : 'A'; ++ char mod = void; + + do + { +- ubyte c; +- c = cast(ubyte)(value % radix); +- value = value / radix; +- i--; +- buffer[i] = cast(char)((c < 10) ? c + '0' : c + 'A' - 10); +- } while (value); +- return to!T(buffer[i .. $].dup); ++ static if (radix == 0) ++ { ++ div = cast(S)(mValue / runtimeRadix ); ++ mod = cast(ubyte)(mValue % runtimeRadix); ++ mod += mod < 10 ? '0' : baseChar - 10; ++ } ++ else static if (radix > 10) ++ { ++ div = cast(S)(mValue / radix ); ++ mod = cast(ubyte)(mValue % radix); ++ mod += mod < 10 ? '0' : baseChar - 10; ++ } ++ else ++ { ++ div = cast(S)(mValue / radix); ++ mod = mValue % radix + '0'; ++ } ++ buffer[--index] = cast(char)mod; ++ mValue = div; ++ } while (mValue); ++ ++ static if (neg) ++ { ++ buffer[--index] = '-'; ++ } ++ return cast(T)buffer[index .. $].dup; ++ } ++ ++ enforce(radix >= 2 && radix <= 36, new ConvException("Radix error")); ++ ++ switch(radix) ++ { ++ case 10: ++ if (value < 0) ++ return toStringRadixConvert!(S.sizeof * 3 + 1, 10, true)(); ++ else ++ return toStringRadixConvert!(S.sizeof * 3, 10)(); ++ case 16: ++ return toStringRadixConvert!(S.sizeof * 2, 16)(); ++ case 2: ++ return toStringRadixConvert!(S.sizeof * 8, 2)(); ++ case 8: ++ return toStringRadixConvert!(S.sizeof * 3, 8)(); ++ default: ++ return toStringRadixConvert!(S.sizeof * 6)(radix); + } + } + +-unittest ++@safe pure unittest + { + foreach (Int; TypeTuple!(uint, ulong)) + { +@@ -1121,6 +1258,8 @@ unittest + assert(to!string(to!Int(15), 2u) == "1111"); + assert(to!string(to!Int(1), 2u) == "1"); + assert(to!string(to!Int(0x1234AF), 16u) == "1234AF"); ++ assert(to!string(to!Int(0x1234BCD), 16u, LetterCase.upper) == "1234BCD"); ++ assert(to!string(to!Int(0x1234AF), 16u, LetterCase.lower) == "1234af"); + } + + foreach (Int; TypeTuple!(int, long)) +@@ -1130,14 +1269,13 @@ unittest + + assert(to!string(to!Int(-10), 10u) == "-10"); + } +-} + +-/** +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(XREF format, formattedWrite) instead.) ++ assert(to!string(cast(byte)-10, 16) == "F6"); ++ assert(to!string(long.min) == "-9223372036854775808"); ++ assert(to!string(long.max) == "9223372036854775807"); ++} + +- Conversions to string with optional configures. +-*/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.format.formattedWrite instead.") + T toImpl(T, S)(S s, in T leftBracket, in T separator = ", ", in T rightBracket = "]") + if (!isSomeChar!(ElementType!S) && (isInputRange!S || isInputRange!(Unqual!S)) && +@@ -1172,7 +1310,7 @@ T toImpl(T, S)(S s, in T leftBracket, in + } + } + +-/// ditto ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.format.formattedWrite instead.") + T toImpl(T, S)(ref S s, in T leftBracket, in T separator = " ", in T rightBracket = "]") + if ((is(S == void[]) || is(S == const(void)[]) || is(S == immutable(void)[])) && +@@ -1181,7 +1319,7 @@ T toImpl(T, S)(ref S s, in T leftBracket + return toImpl(s); + } + +-/// ditto ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.format.formattedWrite instead.") + T toImpl(T, S)(S s, in T leftBracket, in T keyval = ":", in T separator = ", ", in T rightBracket = "]") + if (isAssociativeArray!S && !is(S == enum) && +@@ -1205,7 +1343,7 @@ T toImpl(T, S)(S s, in T leftBracket, in + return cast(T) result.data; + } + +-/// ditto ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.format.formattedWrite instead.") + T toImpl(T, S)(S s, in T nullstr) + if (is(S : Object) && +@@ -1216,7 +1354,7 @@ T toImpl(T, S)(S s, in T nullstr) + return to!T(s.toString()); + } + +-/// ditto ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.format.formattedWrite instead.") + T toImpl(T, S)(S s, in T left, in T separator = ", ", in T right = ")") + if (is(S == struct) && !is(typeof(&S.init.toString)) && !isInputRange!S && +@@ -1267,8 +1405,8 @@ fit in the narrower type. + */ + T toImpl(T, S)(S value) + if (!isImplicitlyConvertible!(S, T) && +- (isNumeric!S || isSomeChar!S) && !is(S == enum) && +- (isNumeric!T || isSomeChar!T) && !is(T == enum)) ++ (isNumeric!S || isSomeChar!S || isBoolean!S) && ++ (isNumeric!T || isSomeChar!T || isBoolean!T) && !is(T == enum)) + { + enum sSmallest = mostNegative!S; + enum tSmallest = mostNegative!T; +@@ -1293,10 +1431,10 @@ T toImpl(T, S)(S value) + if (value > T.max) + throw new ConvOverflowException("Conversion positive overflow"); + } +- return cast(T) value; ++ return (ref value)@trusted{ return cast(T) value; }(value); + } + +-unittest ++@safe pure unittest + { + dchar a = ' '; + assert(to!char(a) == ' '); +@@ -1319,6 +1457,37 @@ unittest + dchar to4 = to!dchar(from4); + } + ++unittest ++{ ++ // Narrowing conversions from enum -> integral should be allowed, but they ++ // should throw at runtime if the enum value doesn't fit in the target ++ // type. ++ enum E1 : ulong { A = 1, B = 1UL<<48, C = 0 } ++ assert(to!int(E1.A) == 1); ++ assert(to!bool(E1.A) == true); ++ assertThrown!ConvOverflowException(to!int(E1.B)); // E1.B overflows int ++ assertThrown!ConvOverflowException(to!bool(E1.B)); // E1.B overflows bool ++ assert(to!bool(E1.C) == false); ++ ++ enum E2 : long { A = -1L<<48, B = -1<<31, C = 1<<31 } ++ assertThrown!ConvOverflowException(to!int(E2.A)); // E2.A overflows int ++ assertThrown!ConvOverflowException(to!uint(E2.B)); // E2.B overflows uint ++ assert(to!int(E2.B) == -1<<31); // but does not overflow int ++ assert(to!int(E2.C) == 1<<31); // E2.C does not overflow int ++ ++ enum E3 : int { A = -1, B = 1, C = 255, D = 0 } ++ assertThrown!ConvOverflowException(to!ubyte(E3.A)); ++ assertThrown!ConvOverflowException(to!bool(E3.A)); ++ assert(to!byte(E3.A) == -1); ++ assert(to!byte(E3.B) == 1); ++ assert(to!ubyte(E3.C) == 255); ++ assert(to!bool(E3.B) == true); ++ assertThrown!ConvOverflowException(to!byte(E3.C)); ++ assertThrown!ConvOverflowException(to!bool(E3.C)); ++ assert(to!bool(E3.D) == false); ++ ++} ++ + /** + Array-to-array conversion (except when target is a string type) + converts each element in turn by using $(D to). +@@ -1328,19 +1497,18 @@ T toImpl(T, S)(S value) + !isSomeString!S && isDynamicArray!S && + !isExactSomeString!T && isArray!T) + { +- alias typeof(T.init[0]) E; +- auto result = new E[value.length]; +- foreach (i, e; value) +- { +- /* Temporarily cast to mutable type, so we can get it initialized, +- * this is ok because there are no other references to result[] +- */ +- cast()(result[i]) = to!E(e); ++ alias E = typeof(T.init[0]); ++ ++ auto w = appender!(E[])(); ++ w.reserve(value.length); ++ foreach (i, ref e; value) ++ { ++ w.put(to!E(e)); + } +- return result; ++ return w.data; + } + +-unittest ++@safe pure unittest + { + // array to array conversions + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -1349,8 +1517,8 @@ unittest + auto b = to!(float[])(a); + assert(b == [ 1.0f, 2, 3 ]); + +- auto c = to!(string[])(b); +- assert(c[0] == "1" && c[1] == "2" && c[2] == "3"); ++ //auto c = to!(string[])(b); ++ //assert(c[0] == "1" && c[1] == "2" && c[2] == "3"); + + immutable(int)[3] d = [ 1, 2, 3 ]; + b = to!(float[])(d); +@@ -1368,6 +1536,13 @@ unittest + } + Wrap[] warr = to!(Wrap[])(["foo", "bar"]); // should work + } ++/*@safe pure */unittest ++{ ++ auto b = [ 1.0f, 2, 3 ]; ++ ++ auto c = to!(string[])(b); ++ assert(c[0] == "1" && c[1] == "2" && c[2] == "3"); ++} + + /** + Associative array to associative array conversion converts each key +@@ -1377,6 +1552,8 @@ T toImpl(T, S)(S value) + if (isAssociativeArray!S && + isAssociativeArray!T && !is(T == enum)) + { ++ /* This code is potentially unsafe. ++ */ + alias KeyType!T K2; + alias ValueType!T V2; + +@@ -1392,7 +1569,7 @@ T toImpl(T, S)(S value) + return cast(T)result; + } + +-unittest ++@safe /*pure */unittest + { + // hash to hash conversions + int[string] a; +@@ -1401,7 +1578,7 @@ unittest + auto b = to!(double[dstring])(a); + assert(b["0"d] == 1 && b["1"d] == 2); + } +-unittest // Bugzilla 8705, from doc ++@safe /*pure */unittest // Bugzilla 8705, from doc + { + int[string][double[int[]]] a; + auto b = to!(short[wstring][string[double[]]])(a); +@@ -1487,14 +1664,13 @@ private void testFloatingToIntegral(Floa + } + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + +- alias TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong) +- AllInts; +- alias TypeTuple!(float, double, real) AllFloats; +- alias TypeTuple!(AllInts, AllFloats) AllNumerics; ++ alias AllInts = TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong); ++ alias AllFloats = TypeTuple!(float, double, real); ++ alias AllNumerics = TypeTuple!(AllInts, AllFloats); + // test with same type + { + foreach (T; AllNumerics) +@@ -1565,6 +1741,12 @@ unittest + assert(a == 42); + } + } ++} ++/*@safe pure */unittest ++{ ++ alias AllInts = TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong); ++ alias AllFloats = TypeTuple!(float, double, real); ++ alias AllNumerics = TypeTuple!(AllInts, AllFloats); + // test conversions to string + { + foreach (T; AllNumerics) +@@ -1609,7 +1791,7 @@ T toImpl(T, S)(S value) + { + if (value.length) + { +- convError!(S, T)(value); ++ throw convError!(S, T)(value); + } + } + return parse!T(value); +@@ -1624,25 +1806,25 @@ T toImpl(T, S)(S value, uint radix) + { + if (value.length) + { +- convError!(S, T)(value); ++ throw convError!(S, T)(value); + } + } + return parse!T(value, radix); + } + +-unittest ++@safe pure unittest + { + // Issue 6668 - ensure no collaterals thrown + try { to!uint("-1"); } + catch (ConvException e) { assert(e.next is null); } + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +- foreach (Char; TypeTuple!(char, wchar, dchar)) ++ foreach (Str; TypeTuple!(string, wstring, dstring)) + { +- auto a = to!(Char[])("123"); ++ Str a = "123"; + assert(to!int(a) == 123); + assert(to!double(a) == 123); + } +@@ -1659,7 +1841,8 @@ a ConvException is thrown. + Enums with floating-point or string base types are not supported. + */ + T toImpl(T, S)(S value) +- if (is(T == enum) && !is(S == enum) && is(S : OriginalType!T) ++ if (is(T == enum) && !is(S == enum) ++ && is(typeof(value == OriginalType!T.init)) + && !isFloatingPoint!(OriginalType!T) && !isSomeString!(OriginalType!T)) + { + foreach (Member; EnumMembers!T) +@@ -1671,7 +1854,7 @@ T toImpl(T, S)(S value) + throw new ConvException(format("Value (%s) does not match any member value of enum '%s'", value, T.stringof)); + } + +-unittest ++@safe pure unittest + { + enum En8143 : int { A = 10, B = 20, C = 30, D = 20 } + enum En8143[][] m3 = to!(En8143[][])([[10, 30], [30, 10]]); +@@ -1744,17 +1927,17 @@ unittest + * was meaningfully converted. + * + * Example: +--------------- +-string test = "123 \t 76.14"; +-auto a = parse!uint(test); +-assert(a == 123); +-assert(test == " \t 76.14"); // parse bumps string +-munch(test, " \t\n\r"); // skip ws +-assert(test == "76.14"); +-auto b = parse!double(test); +-assert(b == 76.14); +-assert(test == ""); +--------------- ++ * -------------- ++ * string test = "123 \t 76.14"; ++ * auto a = parse!uint(test); ++ * assert(a == 123); ++ * assert(test == " \t 76.14"); // parse bumps string ++ * munch(test, " \t\n\r"); // skip ws ++ * assert(test == "76.14"); ++ * auto b = parse!double(test); ++ * assert(b == 76.14); ++ * assert(test == ""); ++ * -------------- + */ + + Target parse(Target, Source)(ref Source s) +@@ -1765,7 +1948,7 @@ Target parse(Target, Source)(ref Source + { + // smaller types are handled like integers + auto v = .parse!(Select!(Target.min < 0, int, uint))(s); +- auto result = cast(Target) v; ++ auto result = ()@trusted{ return cast(Target) v; }(); + if (result != v) + goto Loverflow; + return result; +@@ -1787,7 +1970,7 @@ Target parse(Target, Source)(ref Source + if (c >= '0' && c <= '9') + { + if (v >= Target.max/10 && +- (v != Target.max/10|| c + sign > maxLastDigit)) ++ (v != Target.max/10 || c + sign > maxLastDigit)) + goto Loverflow; + v = cast(Target) (v * 10 + (c - '0')); + s.popFront(); +@@ -1823,18 +2006,17 @@ Target parse(Target, Source)(ref Source + Loverflow: + throw new ConvOverflowException("Overflow in integral conversion"); + Lerr: +- convError!(Source, Target)(s); +- assert(0); ++ throw convError!(Source, Target)(s); + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + string s = "123"; + auto a = parse!int(s); + } + +-unittest ++@safe pure unittest + { + foreach (Int; TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong)) + { +@@ -1931,7 +2113,7 @@ unittest + } + } + +-unittest ++@safe pure unittest + { + // parsing error check + foreach (Int; TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong)) +@@ -2010,6 +2192,13 @@ unittest + } + } + ++@safe pure unittest ++{ ++ assertCTFEable!({ string s = "1234abc"; assert(parse! int(s) == 1234 && s == "abc"); }); ++ assertCTFEable!({ string s = "-1234abc"; assert(parse! int(s) == -1234 && s == "abc"); }); ++ assertCTFEable!({ string s = "1234abc"; assert(parse!uint(s) == 1234 && s == "abc"); }); ++} ++ + /// ditto + Target parse(Target, Source)(ref Source s, uint radix) + if (isSomeChar!(ElementType!Source) && +@@ -2061,11 +2250,10 @@ body + Loverflow: + throw new ConvOverflowException("Overflow in integral conversion"); + Lerr: +- convError!(Source, Target)(s, radix); +- assert(0); ++ throw convError!(Source, Target)(s, radix); + } + +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + // @@@BUG@@@ the size of China +@@ -2100,7 +2288,7 @@ unittest + assert(parse!int(s, 10) == -42); + } + +-unittest // bugzilla 7302 ++@safe pure unittest // bugzilla 7302 + { + auto r = cycle("2A!"); + auto u = parse!uint(r, 16); +@@ -2125,9 +2313,9 @@ Target parse(Target, Source)(ref Source + } + } + +- if( longest_match > 0 ) ++ if (longest_match > 0) + { +- s = s[longest_match..$]; ++ s = s[longest_match .. $]; + return result ; + } + +@@ -2157,7 +2345,7 @@ unittest + } + } + +-unittest // bugzilla 4744 ++@safe pure unittest // bugzilla 4744 + { + enum A { member1, member11, member111 } + assert(to!A("member1" ) == A.member1 ); +@@ -2171,16 +2359,18 @@ Target parse(Target, Source)(ref Source + if (isInputRange!Source && isSomeChar!(ElementType!Source) && !is(Source == enum) && + isFloatingPoint!Target && !is(Target == enum)) + { +- static immutable real negtab[14] = ++ static import core.stdc.math/* : HUGE_VAL*/; ++ ++ static immutable real[14] negtab = + [ 1e-4096L,1e-2048L,1e-1024L,1e-512L,1e-256L,1e-128L,1e-64L,1e-32L, + 1e-16L,1e-8L,1e-4L,1e-2L,1e-1L,1.0L ]; +- static immutable real postab[13] = ++ static immutable real[13] postab = + [ 1e+4096L,1e+2048L,1e+1024L,1e+512L,1e+256L,1e+128L,1e+64L,1e+32L, + 1e+16L,1e+8L,1e+4L,1e+2L,1e+1L ]; + // static immutable string infinity = "infinity"; + // static immutable string nans = "nans"; + +- ConvException bailOut(string msg = null, string fn = __FILE__, size_t ln = __LINE__) ++ ConvException bailOut()(string msg = null, string fn = __FILE__, size_t ln = __LINE__) + { + if (!msg) + msg = "Floating point conversion error"; +@@ -2342,23 +2532,88 @@ Target parse(Target, Source)(ref Source + enforce(ndigits, new ConvException("Error converting input" + " to floating point")); + +- if (msdec) ++ static if (real.mant_dig == 64) + { +- int e2 = 0x3FFF + 63; ++ if (msdec) ++ { ++ int e2 = 0x3FFF + 63; ++ ++ // left justify mantissa ++ while (msdec >= 0) ++ { msdec <<= 1; ++ e2--; ++ } ++ ++ // Stuff mantissa directly into real ++ ()@trusted{ *cast(long*)&ldval = msdec; }(); ++ ()@trusted{ (cast(ushort*)&ldval)[4] = cast(ushort) e2; }(); + +- // left justify mantissa +- while (msdec >= 0) +- { msdec <<= 1; +- e2--; ++ // Exponent is power of 2, not power of 10 ++ ldval = ldexp(ldval,exp); + } ++ } ++ else static if (real.mant_dig == 53) ++ { ++ if (msdec) ++ { ++ //Exponent bias + 52: ++ //After shifting 52 times left, exp must be 1 ++ int e2 = 0x3FF + 52; ++ ++ // right justify mantissa ++ // first 11 bits must be zero, rest is implied bit + mantissa ++ // shift one time less, do rounding, shift again ++ while ((msdec & 0xFFC0_0000_0000_0000) != 0) ++ { ++ msdec = ((cast(ulong)msdec) >> 1); ++ e2++; ++ } ++ ++ //Have to shift one more time ++ //and do rounding ++ if((msdec & 0xFFE0_0000_0000_0000) != 0) ++ { ++ auto roundUp = (msdec & 0x1); ++ ++ msdec = ((cast(ulong)msdec) >> 1); ++ e2++; ++ if(roundUp) ++ { ++ msdec += 1; ++ //If mantissa was 0b1111... and we added +1 ++ //the mantissa should be 0b10000 (think of implicit bit) ++ //and the exponent increased ++ if((msdec & 0x0020_0000_0000_0000) != 0) ++ { ++ msdec = 0x0010_0000_0000_0000; ++ e2++; ++ } ++ } ++ } ++ + +- // Stuff mantissa directly into real +- *cast(long *)&ldval = msdec; +- (cast(ushort *)&ldval)[4] = cast(ushort) e2; ++ // left justify mantissa ++ // bit 11 must be 1 ++ while ((msdec & 0x0010_0000_0000_0000) == 0) ++ { ++ msdec <<= 1; ++ e2--; ++ } + +- // Exponent is power of 2, not power of 10 +- ldval = ldexp(ldval,exp); ++ // Stuff mantissa directly into double ++ // (first including implicit bit) ++ ()@trusted{ *cast(long *)&ldval = msdec; }(); ++ //Store exponent, now overwriting implicit bit ++ ()@trusted{ *cast(long *)&ldval &= 0x000F_FFFF_FFFF_FFFF; }(); ++ ()@trusted{ *cast(long *)&ldval |= ((e2 & 0xFFFUL) << 52); }(); ++ ++ // Exponent is power of 2, not power of 10 ++ ldval = ldexp(ldval,exp); ++ } + } ++ else ++ static assert(false, "Floating point format of real type not supported"); ++ + goto L6; + } + else // not hex +@@ -2555,6 +2810,78 @@ unittest + assert(to!string(r) == to!string(real.max)); + } + ++//Tests for the double implementation ++unittest ++{ ++ import core.stdc.stdlib; ++ static if(real.mant_dig == 53) ++ { ++ //Should be parsed exactly: 53 bit mantissa ++ string s = "0x1A_BCDE_F012_3456p10"; ++ auto x = parse!real(s); ++ assert(x == 0x1A_BCDE_F012_3456p10L); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0xA_BCDE_F012_3456); ++ assert(strtod("0x1ABCDEF0123456p10", null) == x); ++ ++ //Should be parsed exactly: 10 bit mantissa ++ s = "0x3FFp10"; ++ x = parse!real(s); ++ assert(x == 0x03FFp10); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0x000F_F800_0000_0000); ++ assert(strtod("0x3FFp10", null) == x); ++ ++ //60 bit mantissa, round up ++ s = "0xFFF_FFFF_FFFF_FFFFp10"; ++ x = parse!real(s); ++ assert(approxEqual(x, 0xFFF_FFFF_FFFF_FFFFp10)); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0x0000_0000_0000_0000); ++ assert(strtod("0xFFFFFFFFFFFFFFFp10", null) == x); ++ ++ //60 bit mantissa, round down ++ s = "0xFFF_FFFF_FFFF_FF90p10"; ++ x = parse!real(s); ++ assert(approxEqual(x, 0xFFF_FFFF_FFFF_FF90p10)); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0x000F_FFFF_FFFF_FFFF); ++ assert(strtod("0xFFFFFFFFFFFFF90p10", null) == x); ++ ++ //61 bit mantissa, round up 2 ++ s = "0x1F0F_FFFF_FFFF_FFFFp10"; ++ x = parse!real(s); ++ assert(approxEqual(x, 0x1F0F_FFFF_FFFF_FFFFp10)); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0x000F_1000_0000_0000); ++ assert(strtod("0x1F0FFFFFFFFFFFFFp10", null) == x); ++ ++ //61 bit mantissa, round down 2 ++ s = "0x1F0F_FFFF_FFFF_FF10p10"; ++ x = parse!real(s); ++ assert(approxEqual(x, 0x1F0F_FFFF_FFFF_FF10p10)); ++ //1 bit is implicit ++ assert(((*cast(ulong*)&x) & 0x000F_FFFF_FFFF_FFFF) == 0x000F_0FFF_FFFF_FFFF); ++ assert(strtod("0x1F0FFFFFFFFFFF10p10", null) == x); ++ ++ //Huge exponent ++ s = "0x1F_FFFF_FFFF_FFFFp900"; ++ x = parse!real(s); ++ assert(strtod("0x1FFFFFFFFFFFFFp900", null) == x); ++ ++ //exponent too big -> converror ++ s = ""; ++ assertThrown!ConvException(x = parse!real(s)); ++ assert(strtod("0x1FFFFFFFFFFFFFp1024", null) == real.infinity); ++ ++ //-exponent too big -> 0 ++ s = "0x1FFFFFFFFFFFFFp-2000"; ++ x = parse!real(s); ++ assert(x == 0); ++ assert(strtod("0x1FFFFFFFFFFFFFp-2000", null) == x); ++ } ++} ++ + unittest + { + import core.stdc.errno; +@@ -2564,7 +2891,16 @@ unittest + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + struct longdouble + { +- ushort value[5]; ++ static if(real.mant_dig == 64) ++ { ++ ushort value[5]; ++ } ++ else static if(real.mant_dig == 53) ++ { ++ ushort value[4]; ++ } ++ else ++ static assert(false, "Not implemented"); + } + + real ld; +@@ -2573,11 +2909,18 @@ unittest + longdouble x1; + int i; + +- string s = "0x1.FFFFFFFFFFFFFFFEp-16382"; +- ld = parse!real(s); +- assert(s.empty); ++ static if(real.mant_dig == 64) ++ enum s = "0x1.FFFFFFFFFFFFFFFEp-16382"; ++ else static if(real.mant_dig == 53) ++ enum s = "0x1.FFFFFFFFFFFFFFFEp-1000"; ++ else ++ static assert(false, "Floating point format for real not supported"); ++ ++ auto s2 = s.idup; ++ ld = parse!real(s2); ++ assert(s2.empty); + x = *cast(longdouble *)&ld; +- ld1 = strtold("0x1.FFFFFFFFFFFFFFFEp-16382", null); ++ ld1 = strtold(s.ptr, null); + x1 = *cast(longdouble *)&ld1; + assert(x1 == x && ld1 == ld); + +@@ -2588,9 +2931,9 @@ unittest + // printf("\n"); + assert(!errno); + +- s = "1.0e5"; +- ld = parse!real(s); +- assert(s.empty); ++ s2 = "1.0e5"; ++ ld = parse!real(s2); ++ assert(s2.empty); + x = *cast(longdouble *)&ld; + ld1 = strtold("1.0e5", null); + x1 = *cast(longdouble *)&ld1; +@@ -2602,50 +2945,38 @@ unittest + // printf("\n"); + } + +-// Unittest for bug 4959 +-unittest ++@safe pure unittest + { +- auto s = "0 "; +- auto x = parse!double(s); +- assert(s == " "); +- assert(x == 0.0); +-} ++ // Bugzilla 4959 ++ { ++ auto s = "0 "; ++ auto x = parse!double(s); ++ assert(s == " "); ++ assert(x == 0.0); ++ } + +-// Unittest for bug 3369 +-unittest +-{ ++ // Bugzilla 3369 + assert(to!float("inf") == float.infinity); + assert(to!float("-inf") == -float.infinity); +-} + +-// Unittest for bug 6160 +-unittest +-{ ++ // Bugzilla 6160 + assert(6_5.536e3L == to!real("6_5.536e3")); // 2^16 + assert(0x1000_000_000_p10 == to!real("0x1000_000_000_p10")); // 7.03687e+13 +-} + +-// Unittest for bug 6258 +-unittest +-{ ++ // Bugzilla 6258 + assertThrown!ConvException(to!real("-")); + assertThrown!ConvException(to!real("in")); +-} + +-// Unittest for bug 7055 +-unittest +-{ ++ // Bugzilla 7055 + assertThrown!ConvException(to!float("INF2")); +-} +-unittest +-{ ++ + //extra stress testing + auto ssOK = ["1.", "1.1.1", "1.e5", "2e1e", "2a", "2e1_1", + "inf", "-inf", "infa", "-infa", "inf2e2", "-inf2e2"]; + auto ssKO = ["", " ", "2e", "2e+", "2e-", "2ee", "2e++1", "2e--1", "2e_1", "+inf"]; +- foreach(s; ssOK) ++ foreach (s; ssOK) + parse!double(s); +- foreach(s; ssKO) ++ foreach (s; ssKO) + assertThrown!ConvException(parse!double(s)); + } + +@@ -2657,7 +2988,8 @@ Target parse(Target, Source)(ref Source + if (isExactSomeString!Source && + staticIndexOf!(Unqual!Target, dchar, Unqual!(ElementEncodingType!Source)) >= 0) + { +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + static if (is(Unqual!Target == dchar)) + { + Target result = s.front; +@@ -2673,7 +3005,7 @@ Target parse(Target, Source)(ref Source + } + } + +-unittest ++@safe pure unittest + { + foreach (Str; TypeTuple!(string, wstring, dstring)) + { +@@ -2694,7 +3026,8 @@ Target parse(Target, Source)(ref Source + if (!isSomeString!Source && isInputRange!Source && isSomeChar!(ElementType!Source) && + isSomeChar!Target && Target.sizeof >= ElementType!Source.sizeof && !is(Target == enum)) + { +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + Target result = s.front; + s.popFront(); + return result; +@@ -2705,24 +3038,23 @@ Target parse(Target, Source)(ref Source + if (isExactSomeString!Source && + is(Unqual!Target == bool)) + { +- if (s.length >= 4 && icmp(s[0 .. 4], "true")==0) ++ if (s.length >= 4 && icmp(s[0 .. 4], "true") == 0) + { + s = s[4 .. $]; + return true; + } +- if (s.length >= 5 && icmp(s[0 .. 5], "false")==0) ++ if (s.length >= 5 && icmp(s[0 .. 5], "false") == 0) + { + s = s[5 .. $]; + return false; + } +- parseError("bool should be case-insensitive 'true' or 'false'"); +- assert(0); ++ throw parseError("bool should be case-insensitive 'true' or 'false'"); + } + + /* + Tests for to!bool and parse!bool + */ +-unittest ++@safe pure unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); + debug(conv) printf("conv.to!bool.unittest\n"); +@@ -2753,16 +3085,15 @@ Target parse(Target, Source)(ref Source + if (isExactSomeString!Source && + is(Unqual!Target == typeof(null))) + { +- if (s.length >= 4 && icmp(s[0 .. 4], "null")==0) ++ if (s.length >= 4 && icmp(s[0 .. 4], "null") == 0) + { + s = s[4 .. $]; + return null; + } +- parseError("null should be case-insensitive 'null'"); +- assert(0); ++ throw parseError("null should be case-insensitive 'null'"); + } + +-unittest ++@safe pure unittest + { + alias typeof(null) NullType; + auto s1 = "null"; +@@ -2778,7 +3109,7 @@ unittest + assert(m == "maybe"); // m shouldn't change on failure + + auto s = "NULL"; +- assert(parse!(const(NullType))(s) is null); ++ assert(parse!(const NullType)(s) is null); + } + + //Used internally by parse Array/AA, to remove ascii whites +@@ -2787,7 +3118,7 @@ package void skipWS(R)(ref R r) + static if (isSomeString!R) + { + //Implementation inspired from stripLeft. +- foreach(i, dchar c; r) ++ foreach (i, dchar c; r) + { + if (!std.ascii.isWhite(c)) + { +@@ -2800,8 +3131,8 @@ package void skipWS(R)(ref R r) + } + else + { +- for ( ; !r.empty && std.ascii.isWhite(r.front) ; r.popFront()) +- { } ++ for (; !r.empty && std.ascii.isWhite(r.front); r.popFront()) ++ {} + } + } + +@@ -2818,7 +3149,8 @@ Target parse(Target, Source)(ref Source + + parseCheck!s(lbracket); + skipWS(s); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front == rbracket) + { + s.popFront(); +@@ -2828,7 +3160,8 @@ Target parse(Target, Source)(ref Source + { + result ~= parseElement!(ElementType!Target)(s); + skipWS(s); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front != comma) + break; + } +@@ -2862,7 +3195,7 @@ unittest + assert( ia == ia2); + } + +-unittest ++@safe pure unittest + { + auto s1 = `[['h', 'e', 'l', 'l', 'o'], "world"]`; + auto a1 = parse!(string[])(s1); +@@ -2873,11 +3206,11 @@ unittest + assert(a2 == ["aaa", "bbb", "ccc"]); + } + +-unittest ++@safe pure unittest + { + //Check proper failure + auto s = "[ 1 , 2 , 3 ]"; +- foreach(i ; 0..s.length-1) ++ foreach (i ; 0..s.length-1) + { + auto ss = s[0 .. i]; + assertThrown!ConvException(parse!(int[])(ss)); +@@ -2885,16 +3218,48 @@ unittest + int[] arr = parse!(int[])(s); + } + ++@safe pure unittest ++{ ++ //Checks parsing of strings with escaped characters ++ string s1 = `[ ++ "Contains a\0null!", ++ "tab\there", ++ "line\nbreak", ++ "backslash \\ slash / question \?", ++ "number \x35 five", ++ "unicode \u65E5 sun", ++ "very long \U000065E5 sun" ++ ]`; ++ ++ //Note: escaped characters purposefully replaced and isolated to guarantee ++ //there are no typos in the escape syntax ++ string[] s2 = [ ++ "Contains a" ~ '\0' ~ "null!", ++ "tab" ~ '\t' ~ "here", ++ "line" ~ '\n' ~ "break", ++ "backslash " ~ '\\' ~ " slash / question ?", ++ "number 5 five", ++ "unicode 日 sun", ++ "very long 日 sun" ++ ]; ++ assert(s2 == parse!(string[])(s1)); ++ assert(s1.empty); ++} ++ + /// ditto + Target parse(Target, Source)(ref Source s, dchar lbracket = '[', dchar rbracket = ']', dchar comma = ',') + if (isExactSomeString!Source && + isStaticArray!Target && !is(Target == enum)) + { +- Target result = void; ++ static if (hasIndirections!Target) ++ Target result = Target.init[0].init; ++ else ++ Target result = void; + + parseCheck!s(lbracket); + skipWS(s); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front == rbracket) + { + static if (result.length != 0) +@@ -2911,7 +3276,8 @@ Target parse(Target, Source)(ref Source + goto Lmanyerr; + result[i++] = parseElement!(ElementType!Target)(s); + skipWS(s); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front != comma) + { + if (i != result.length) +@@ -2924,15 +3290,13 @@ Target parse(Target, Source)(ref Source + return result; + + Lmanyerr: +- parseError(text("Too many elements in input, ", result.length, " elements expected.")); +- assert(0); ++ throw parseError(text("Too many elements in input, ", result.length, " elements expected.")); + + Lfewerr: +- parseError(text("Too few elements in input, ", result.length, " elements expected.")); +- assert(0); ++ throw parseError(text("Too few elements in input, ", result.length, " elements expected.")); + } + +-unittest ++@safe pure unittest + { + auto s1 = "[1,2,3,4]"; + auto sa1 = parse!(int[4])(s1); +@@ -2958,14 +3322,15 @@ Target parse(Target, Source)(ref Source + if (isExactSomeString!Source && + isAssociativeArray!Target && !is(Target == enum)) + { +- alias typeof(Target.keys[0]) KeyType; +- alias typeof(Target.values[0]) ValueType; ++ alias KeyType = typeof(Target.keys[0]); ++ alias ValType = typeof(Target.values[0]); + + Target result; + + parseCheck!s(lbracket); + skipWS(s); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front == rbracket) + { + s.popFront(); +@@ -2977,18 +3342,20 @@ Target parse(Target, Source)(ref Source + skipWS(s); + parseCheck!s(keyval); + skipWS(s); +- auto val = parseElement!ValueType(s); ++ auto val = parseElement!ValType(s); + skipWS(s); + result[key] = val; +- if (s.empty) convError!(Source, Target)(s); +- if (s.front != comma) break; ++ if (s.empty) ++ throw convError!(Source, Target)(s); ++ if (s.front != comma) ++ break; + } + parseCheck!s(rbracket); + + return result; + } + +-unittest ++@safe pure unittest + { + auto s1 = "[1:10, 2:20, 3:30]"; + auto aa1 = parse!(int[int])(s1); +@@ -3003,11 +3370,11 @@ unittest + assert(aa3 == ["aaa":[1], "bbb":[2,3], "ccc":[4,5,6]]); + } + +-unittest ++@safe pure unittest + { + //Check proper failure + auto s = "[1:10, 2:20, 3:30]"; +- foreach(i ; 0..s.length-1) ++ foreach (i ; 0 .. s.length-1) + { + auto ss = s[0 .. i]; + assertThrown!ConvException(parse!(int[int])(ss)); +@@ -3019,16 +3386,19 @@ private dchar parseEscape(Source)(ref So + if (isInputRange!Source && isSomeChar!(ElementType!Source)) + { + parseCheck!s('\\'); +- if (s.empty) parseError("Unterminated escape sequence"); ++ if (s.empty) ++ throw parseError("Unterminated escape sequence"); + +- dchar getHexDigit() ++ dchar getHexDigit()(ref Source s_ = s) // workaround + { +- if (s.empty) parseError("Unterminated escape sequence"); +- s.popFront(); +- if (s.empty) parseError("Unterminated escape sequence"); +- dchar c = s.front; ++ if (s_.empty) ++ throw parseError("Unterminated escape sequence"); ++ s_.popFront(); ++ if (s_.empty) ++ throw parseError("Unterminated escape sequence"); ++ dchar c = s_.front; + if (!isHexDigit(c)) +- parseError("Hex digit is missing"); ++ throw parseError("Hex digit is missing"); + return std.ascii.isAlpha(c) ? ((c & ~0x20) - ('A' - 10)) : c - '0'; + } + +@@ -3036,6 +3406,11 @@ private dchar parseEscape(Source)(ref So + + switch (s.front) + { ++ case '"': result = '\"'; break; ++ case '\'': result = '\''; break; ++ case '0': result = '\0'; break; ++ case '?': result = '\?'; break; ++ case '\\': result = '\\'; break; + case 'a': result = '\a'; break; + case 'b': result = '\b'; break; + case 'f': result = '\f'; break; +@@ -3046,14 +3421,12 @@ private dchar parseEscape(Source)(ref So + case 'x': + result = getHexDigit() << 4; + result |= getHexDigit(); +- if (s.empty) parseError("Unterminated escape sequence"); + break; + case 'u': + result = getHexDigit() << 12; + result |= getHexDigit() << 8; + result |= getHexDigit() << 4; + result |= getHexDigit(); +- if (s.empty) parseError("Unterminated escape sequence"); + break; + case 'U': + result = getHexDigit() << 28; +@@ -3064,18 +3437,62 @@ private dchar parseEscape(Source)(ref So + result |= getHexDigit() << 8; + result |= getHexDigit() << 4; + result |= getHexDigit(); +- if (s.empty) parseError("Unterminated escape sequence"); + break; + default: +- parseError("Unknown escape character " ~ to!string(s.front)); +- break; ++ throw parseError("Unknown escape character " ~ to!string(s.front)); + } ++ if (s.empty) ++ throw parseError("Unterminated escape sequence"); + + s.popFront(); + + return result; + } + ++@safe pure unittest ++{ ++ string[] s1 = [ ++ `\"`, `\'`, `\?`, `\\`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v`, //Normal escapes ++ //`\141`, //@@@9621@@@ Octal escapes. ++ `\x61`, ++ `\u65E5`, `\U00012456` ++ //`\&`, `\"`, //@@@9621@@@ Named Character Entities. ++ ]; ++ ++ const(dchar)[] s2 = [ ++ '\"', '\'', '\?', '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v', //Normal escapes ++ //'\141', //@@@9621@@@ Octal escapes. ++ '\x61', ++ '\u65E5', '\U00012456' ++ //'\&', '\"', //@@@9621@@@ Named Character Entities. ++ ]; ++ ++ foreach (i ; 0 .. s1.length) ++ { ++ assert(s2[i] == parseEscape(s1[i])); ++ assert(s1[i].empty); ++ } ++} ++ ++@safe pure unittest ++{ ++ string[] ss = [ ++ `hello!`, //Not an escape ++ `\`, //Premature termination ++ `\/`, //Not an escape ++ `\gggg`, //Not an escape ++ `\xzz`, //Not an hex ++ `\x0`, //Premature hex end ++ `\XB9`, //Not legal hex syntax ++ `\u!!`, //Not a unicode hex ++ `\777`, //Octal is larger than a byte //Note: Throws, but simply because octals are unsupported ++ `\u123`, //Premature hex end ++ `\U123123` //Premature hex end ++ ]; ++ foreach (s ; ss) ++ assertThrown!ConvException(parseEscape(s)); ++} ++ + // Undocumented + Target parseElement(Target, Source)(ref Source s) + if (isInputRange!Source && isSomeChar!(ElementType!Source) && !is(Source == enum) && +@@ -3084,12 +3501,14 @@ Target parseElement(Target, Source)(ref + auto result = appender!Target(); + + // parse array of chars +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front == '[') + return parse!Target(s); + + parseCheck!s('\"'); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front == '\"') + { + s.popFront(); +@@ -3098,7 +3517,7 @@ Target parseElement(Target, Source)(ref + while (true) + { + if (s.empty) +- parseError("Unterminated quoted string"); ++ throw parseError("Unterminated quoted string"); + switch (s.front) + { + case '\"': +@@ -3124,7 +3543,8 @@ Target parseElement(Target, Source)(ref + Target c; + + parseCheck!s('\''); +- if (s.empty) convError!(Source, Target)(s); ++ if (s.empty) ++ throw convError!(Source, Target)(s); + if (s.front != '\\') + { + c = s.front; +@@ -3147,54 +3567,44 @@ Target parseElement(Target, Source)(ref + + + /*************************************************************** +- Convenience functions for converting any number and types of +- arguments into _text (the three character widths). +- +- Example: +----- +-assert(text(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"); +-assert(wtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"w); +-assert(dtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"d); +----- +-*/ +-string text(T...)(T args) +-{ +- return textImpl!string(args); +-} ++ * Convenience functions for converting any number and types of ++ * arguments into _text (the three character widths). ++ */ ++string text(T...)(T args) { return textImpl!string(args); } + ///ditto +-wstring wtext(T...)(T args) +-{ +- return textImpl!wstring(args); +-} ++wstring wtext(T...)(T args) { return textImpl!wstring(args); } + ///ditto +-dstring dtext(T...)(T args) +-{ +- return textImpl!dstring(args); +-} +- +-private S textImpl(S, U...)(U args) if (U.length == 0) +-{ +- return null; +-} ++dstring dtext(T...)(T args) { return textImpl!dstring(args); } + +-private S textImpl(S, U...)(U args) if (U.length > 0) ++private S textImpl(S, U...)(U args) + { +- auto result = to!S(args[0]); +- foreach (arg; args[1 .. $]) result ~= to!S(arg); +- return result; ++ static if (U.length == 0) ++ { ++ return null; ++ } ++ else ++ { ++ auto result = to!S(args[0]); ++ foreach (arg; args[1 .. $]) ++ result ~= to!S(arg); ++ return result; ++ } + } +- ++/// + unittest + { +- debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +- assert(text(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"); ++ assert( text(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"c); + assert(wtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"w); + assert(dtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"d); ++} ++unittest ++{ + assert(text() is null); + assert(wtext() is null); + assert(dtext() is null); + } + ++ + /*************************************************************** + The $(D octal) facility is intended as an experimental facility to + replace _octal literals starting with $(D '0'), which many find +@@ -3251,7 +3661,7 @@ auto z = octal!"1_000_000u"; + template octal(alias s) + if (isIntegral!(typeof(s))) + { +- enum auto octal = octal!(typeof(s), toStringNow!(s)); ++ enum auto octal = octal!(typeof(s), to!string(s)); + } + + /* +@@ -3444,25 +3854,18 @@ Given a pointer $(D chunk) to uninitiali + as $(D T)), constructs an object of non-$(D class) type $(D T) at that + address. + +-This function can be $(D @trusted) if the corresponding constructor of +-$(D T) is $(D @safe). +- + Returns: A pointer to the newly constructed object (which is the same + as $(D chunk)). + */ +-T* emplace(T)(T* chunk) +- if (!is(T == class)) ++T* emplace(T)(T* chunk) @safe nothrow pure + { +- static T i; // Can't use `= T.init` here because of @@@BUG8902@@@. +- memcpy(chunk, &i, T.sizeof); +- return chunk; +-} +-///ditto +-T* emplace(T)(T* chunk) +- if (is(T == class)) +-{ +- *chunk = null; +- return chunk; ++ static assert (is(T* : void*), ++ format("Cannot emplace a %s because it is qualified.", T.stringof)); ++ ++ static assert (is(typeof({static T i;})), ++ format("Cannot emplace a %1$s because %1$s.this() is annotated with @disable.", T.stringof)); ++ ++ return emplaceInitializer(chunk); + } + + version(unittest) private struct __conv_EmplaceTest +@@ -3507,6 +3910,7 @@ unittest + struct S { @disable this(); } + S s = void; + static assert(!__traits(compiles, emplace(&s))); ++ static assert( __traits(compiles, emplace(&s, S.init))); + } + + unittest +@@ -3523,6 +3927,67 @@ unittest + assert(i is null); + } + ++unittest ++{ ++ static struct S {int i = 5;} ++ S[2] s2 = void; ++ emplace(&s2); ++ assert(s2[0].i == 5 && s2[1].i == 5); ++} ++ ++unittest ++{ ++ struct S1 ++ {} ++ ++ struct S2 ++ { ++ void opAssign(S2); ++ } ++ ++ S1 s1 = void; ++ S2 s2 = void; ++ S1[2] as1 = void; ++ S2[2] as2 = void; ++ emplace(&s1); ++ emplace(&s2); ++ emplace(&as1); ++ emplace(&as2); ++} ++ ++unittest ++{ ++ static struct S1 ++ { ++ this(this) @disable; ++ } ++ static struct S2 ++ { ++ this() @disable; ++ } ++ S1[2] ss1 = void; ++ S2[2] ss2 = void; ++ static assert( __traits(compiles, emplace(&ss1))); ++ static assert(!__traits(compiles, emplace(&ss2))); ++ S1 s1 = S1.init; ++ S2 s2 = S2.init; ++ static assert(!__traits(compiles, emplace(&ss1, s1))); ++ static assert( __traits(compiles, emplace(&ss2, s2))); ++} ++ ++unittest ++{ ++ struct S ++ { ++ immutable int i; ++ } ++ S s = void; ++ S[2] ss1 = void; ++ S[2] ss2 = void; ++ emplace(&s, 5); ++ emplace(&ss1, s); ++ emplace(&ss2, ss1); ++} + + /** + Given a pointer $(D chunk) to uninitialized memory (but already typed +@@ -3535,11 +4000,92 @@ $(D T) is $(D @safe). + Returns: A pointer to the newly constructed object (which is the same + as $(D chunk)). + */ +-T* emplace(T, Args...)(T* chunk, Args args) ++T* emplace(T, Args...)(T* chunk, auto ref Args args) + if (!is(T == struct) && Args.length == 1) + { +- *chunk = args[0]; +- return chunk; ++ alias Arg = Args[0]; ++ alias arg = args[0]; ++ ++ static assert (is(T* : void*), ++ format("Cannot emplace a %s because it is qualified.", T.stringof)); ++ ++ static assert(is(typeof({T t = args[0];})), ++ format("%s cannot be emplaced from a %s.", T.stringof, Arg.stringof)); ++ ++ static if (isStaticArray!T) ++ { ++ alias UArg = Unqual!Arg; ++ alias E = typeof(chunk.ptr[0]); ++ enum N = T.length; ++ ++ static if (is(Arg : T)) ++ { ++ //Matching static array ++ static if (isAssignable!(T, Arg) && !hasElaborateAssign!T) ++ *chunk = arg; ++ else static if (is(UArg == T)) ++ { ++ memcpy(chunk, &arg, T.sizeof); ++ static if (hasElaborateCopyConstructor!T) ++ typeid(T).postblit(cast(void*)&chunk); ++ } ++ else ++ emplace(chunk, cast(T)arg); ++ } ++ else static if (is(Arg : E[])) ++ { ++ //Matching dynamic array ++ static if (is(typeof((*chunk)[] = arg[])) && !hasElaborateAssign!T) ++ (*chunk)[] = arg[]; ++ else static if (is(UArg == E[])) ++ { ++ assert(N == chunk.length, "Array length missmatch in emplace"); ++ memcpy(cast(void*)chunk, arg.ptr, T.sizeof); ++ static if (hasElaborateCopyConstructor!T) ++ typeid(T).postblit(cast(void*)&chunk); ++ } ++ else ++ emplace(chunk, cast(E[])arg); ++ } ++ else static if (is(Arg : E)) ++ { ++ //Case matching single element to array. ++ static if (is(typeof((*chunk)[] = arg)) && !hasElaborateAssign!T) ++ (*chunk)[] = arg; ++ else static if (is(UArg == E)) ++ { ++ //Note: We copy everything, and then postblit just once. ++ //This is as exception safe as what druntime can provide us. ++ foreach(i; 0 .. N) ++ memcpy(cast(void*)(chunk.ptr + i), &arg, E.sizeof); ++ static if (hasElaborateCopyConstructor!T) ++ typeid(T).postblit(chunk); ++ } ++ else ++ //Alias this. Coerce. ++ emplace(chunk, cast(E)arg); ++ } ++ else static if (is(typeof(emplace(chunk.ptr, arg)))) ++ { ++ //Final case for everything else: ++ //Types that don't match (int to uint[2]) ++ //Recursion for multidimensions ++ static if (is(typeof((*chunk)[] = arg)) && !hasElaborateAssign!T) ++ (*chunk)[] = arg; ++ ++ foreach(i; 0 .. N) ++ emplace(chunk.ptr + i, arg); ++ } ++ else ++ static assert(0, format("Sorry, this implementation doesn't know how to emplace a %s with a %s", T.stringof, Arg.stringof)); ++ ++ return chunk; ++ } ++ else ++ { ++ *chunk = arg; ++ return chunk; ++ } + } + + unittest +@@ -3566,43 +4112,115 @@ unittest + assert(i is k); + } + +-// Specialization for struct ++unittest ++{ ++ static struct S ++ { ++ int i = 5; ++ void opAssign(S){assert(0);} ++ } ++ S[2] sa = void; ++ S[2] sb; ++ emplace(&sa, sb); ++ assert(sa[0].i == 5 && sa[1].i == 5); ++} ++ ++/// ditto + T* emplace(T, Args...)(T* chunk, auto ref Args args) + if (is(T == struct)) + { +- void initialize() +- { +- if(auto p = typeid(T).init().ptr) +- memcpy(chunk, p, T.sizeof); ++ static assert (is(T* : void*), ++ format("Cannot emplace a %s because it is qualified.", T.stringof)); ++ ++ static if (Args.length == 1 && is(Args[0] : T) && ++ is (typeof({T t = args[0];})) //Check for legal postblit ++ ) ++ { ++ static if (is(T == Unqual!(Args[0]))) ++ { ++ //Types match exactly: we postblit ++ static if (isAssignable!T && !hasElaborateAssign!T) ++ *chunk = args[0]; ++ else ++ { ++ memcpy(chunk, &args[0], T.sizeof); ++ static if (hasElaborateCopyConstructor!T) ++ typeid(T).postblit(chunk); ++ } ++ } + else +- memset(chunk, 0, T.sizeof); ++ //Alias this. Coerce to type T. ++ emplace(chunk, cast(T)args[0]); + } +- +- static if (is(typeof(chunk.__ctor(args)))) ++ else static if (is(typeof(chunk.__ctor(args)))) + { + // T defines a genuine constructor accepting args + // Go the classic route: write .init first, then call ctor +- initialize(); ++ emplaceInitializer(chunk); + chunk.__ctor(args); + } ++ else static if (is(typeof(T.opCall(args)))) ++ { ++ //Can be built calling opCall ++ emplaceOpCaller(chunk, args); //emplaceOpCaller is deprecated ++ } + else static if (is(typeof(T(args)))) + { + // Struct without constructor that has one matching field for +- // each argument +- *chunk = T(args); ++ // each argument. Individually emplace each field ++ emplaceInitializer(chunk); ++ foreach (i, ref field; chunk.tupleof[0 .. Args.length]) ++ emplace(emplaceGetAddr(field), args[i]); + } +- else //static if (Args.length == 1 && is(Args[0] : T)) ++ else + { +- static assert(Args.length == 1); +- //static assert(0, T.stringof ~ " " ~ Args.stringof); +- // initialize(); +- *chunk = args[0]; ++ //We can't emplace. Try to diagnose a disabled postblit. ++ static assert(!(Args.length == 1 && is(Args[0] : T)), ++ format("Cannot emplace a %1$s because %1$s.this(this) is annotated with @disable.", T.stringof)); ++ ++ //We can't emplace. ++ static assert(false, ++ format("%s cannot be emplaced from %s.", T.stringof, Args[].stringof)); + } ++ + return chunk; + } + +-// Test constructor branch ++//emplace helper functions ++private T* emplaceInitializer(T)(T* chunk) @trusted pure nothrow ++{ ++ static if (isAssignable!T && !hasElaborateAssign!T) ++ *chunk = T.init; ++ else ++ { ++ static immutable T init = T.init; ++ memcpy(chunk, &init, T.sizeof); ++ } ++ return chunk; ++} ++private deprecated("Using static opCall for emplace is deprecated. Plase use emplace(chunk, T(args)) instead.") ++T* emplaceOpCaller(T, Args...)(T* chunk, auto ref Args args) ++{ ++ static assert (is(typeof({T t = T.opCall(args);})), ++ format("%s.opCall does not return adequate data for construction.", T.stringof)); ++ return emplace(chunk, chunk.opCall(args)); ++} ++private ++{ ++ //Helper to keep simple aggregate emplace safe. ++ auto emplaceGetAddr(T)(ref T t) @trusted ++ if (is(T == Unqual!T)) ++ { ++ return &t; ++ } ++ auto emplaceGetAddr(T)(ref T t) ++ if (!is(T == Unqual!T)) ++ { ++ return cast(Unqual!T*)&t; ++ } ++} + ++// Test constructor branch + unittest + { + debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); +@@ -3640,7 +4258,6 @@ unittest + } + + // Test matching fields branch +- + unittest + { + struct S { uint n; } +@@ -3668,17 +4285,571 @@ unittest + assert(s2.a == 2 && s2.b == 3); + } + +-// Test assignment branch ++//opAssign ++unittest ++{ ++ static struct S ++ { ++ int i = 5; ++ void opAssign(int){assert(0);} ++ void opAssign(S){assert(0);} ++ } ++ S sa1 = void; ++ S sa2 = void; ++ S sb1 = S(1); ++ emplace(&sa1, sb1); ++ emplace(&sa2, 2); ++ assert(sa1.i == 1); ++ assert(sa2.i == 2); ++} + +-// FIXME: no tests ++//postblit precedence ++unittest ++{ ++ //Works, but breaks in "-w -O" because of @@@9332@@@. ++ //Uncomment test when 9332 is fixed. ++ static struct S ++ { ++ int i; ++ ++ this(S other){assert(false);} ++ this(int i){this.i = i;} ++ this(this){} ++ } ++ S a = void; ++ assert(is(typeof({S b = a;}))); //Postblit ++ assert(is(typeof({S b = S(a);}))); //Constructor ++ auto b = S(5); ++ emplace(&a, b); ++ assert(a.i == 5); ++ ++ static struct S2 ++ { ++ int* p; ++ this(const S2){}; ++ } ++ static assert(!is(immutable S2 : S2)); ++ S2 s2 = void; ++ immutable is2 = (immutable S2).init; ++ emplace(&s2, is2); ++} ++ ++//nested structs and postblit ++unittest ++{ ++ static struct S ++ { ++ int* p; ++ this(int i){p = [i].ptr;} ++ this(this) ++ { ++ if (p) ++ p = [*p].ptr; ++ } ++ } ++ static struct SS ++ { ++ S s; ++ void opAssign(const SS) ++ { ++ assert(0); ++ } ++ } ++ SS ssa = void; ++ SS ssb = SS(S(5)); ++ emplace(&ssa, ssb); ++ assert(*ssa.s.p == 5); ++ assert(ssa.s.p != ssb.s.p); ++} ++ ++//disabled postblit ++unittest ++{ ++ static struct S1 ++ { ++ int i; ++ @disable this(this); ++ } ++ S1 s1 = void; ++ static assert( __traits(compiles, emplace(&s1, 1))); ++ static assert(!__traits(compiles, emplace(&s1, S1.init))); ++ ++ static struct S2 ++ { ++ int i; ++ @disable this(this); ++ this(ref S2){} ++ } ++ S2 s2 = void; ++ static assert(!__traits(compiles, emplace(&s2, 1))); ++ static assert( __traits(compiles, emplace(&s2, S2.init))); ++ ++ static struct SS1 ++ { ++ S1 s; ++ } ++ SS1 ss1 = void; ++ static assert( __traits(compiles, emplace(&ss1))); ++ static assert(!__traits(compiles, emplace(&ss1, SS1.init))); ++ ++ static struct SS2 ++ { ++ S2 s; ++ } ++ SS2 ss2 = void; ++ static assert( __traits(compiles, emplace(&ss2))); ++ static assert(!__traits(compiles, emplace(&ss2, SS2.init))); ++ ++ ++ // SS1 sss1 = s1; //This doesn't compile ++ // SS1 sss1 = SS1(s1); //This doesn't compile ++ // So emplace shouldn't compile either ++ static assert(!__traits(compiles, emplace(&sss1, s1))); ++ static assert(!__traits(compiles, emplace(&sss2, s2))); ++} ++ ++//Imutability ++unittest ++{ ++ //Castable immutability ++ { ++ static struct S1 ++ { ++ int i; ++ } ++ static assert(is( immutable(S1) : S1)); ++ S1 sa = void; ++ auto sb = immutable(S1)(5); ++ emplace(&sa, sb); ++ assert(sa.i == 5); ++ } ++ //Un-castable immutability ++ { ++ static struct S2 ++ { ++ int* p; ++ } ++ static assert(!is(immutable(S2) : S2)); ++ S2 sa = void; ++ auto sb = immutable(S2)(null); ++ assert(!__traits(compiles, emplace(&sa, sb))); ++ } ++} ++ ++unittest ++{ ++ static struct S ++ { ++ immutable int i; ++ immutable(int)* j; ++ } ++ S s = void; ++ emplace(&s, 1, null); ++ emplace(&s, 2, &s.i); ++ assert(s is S(2, &s.i)); ++} ++ ++//Context pointer ++unittest ++{ ++ int i = 0; ++ { ++ struct S1 ++ { ++ void foo(){++i;} ++ } ++ S1 sa = void; ++ S1 sb; ++ emplace(&sa, sb); ++ sa.foo(); ++ assert(i == 1); ++ } ++ { ++ struct S2 ++ { ++ void foo(){++i;} ++ this(this){} ++ } ++ S2 sa = void; ++ S2 sb; ++ emplace(&sa, sb); ++ sa.foo(); ++ assert(i == 2); ++ } ++ ++ ////NOTE: THESE WILL COMPILE ++ ////But will not correctly emplace the context pointer ++ ////The problem lies with voldemort, and not emplace. ++ //{ ++ // struct S3 ++ // { ++ // int k; ++ // void foo(){++i;} ++ // } ++ //} ++ //S3 s3 = void; ++ //emplace(&s3); //S3.init has no context pointer information ++ //emplace(&s3, 1); //No way to obtain context pointer once inside emplace ++} ++ ++//Alias this ++unittest ++{ ++ static struct S ++ { ++ int i; ++ } ++ //By Ref ++ { ++ static struct SS1 ++ { ++ int j; ++ S s; ++ alias s this; ++ } ++ S s = void; ++ SS1 ss = SS1(1, S(2)); ++ emplace(&s, ss); ++ assert(s.i == 2); ++ } ++ //By Value ++ { ++ static struct SS2 ++ { ++ int j; ++ S s; ++ S foo() @property{return s;} ++ alias foo this; ++ } ++ S s = void; ++ SS2 ss = SS2(1, S(2)); ++ emplace(&s, ss); ++ assert(s.i == 2); ++ } ++} ++version(unittest) ++{ ++ //Ambiguity ++ struct __std_conv_S ++ { ++ int i; ++ this(__std_conv_SS ss) {assert(0);} ++ static opCall(__std_conv_SS ss) ++ { ++ __std_conv_S s; s.i = ss.j; ++ return s; ++ } ++ } ++ struct __std_conv_SS ++ { ++ int j; ++ __std_conv_S s; ++ ref __std_conv_S foo() @property {s.i = j; return s;} ++ alias foo this; ++ } ++ static assert(is(__std_conv_SS : __std_conv_S)); ++ unittest ++ { ++ __std_conv_S s = void; ++ __std_conv_SS ss = __std_conv_SS(1); ++ ++ __std_conv_S sTest1 = ss; //this calls "SS alias this" (and not "S.this(SS)") ++ emplace(&s, ss); //"alias this" should take precedence in emplace over "opCall" ++ assert(s.i == 1); ++ } ++} ++ ++//Nested classes ++unittest ++{ ++ class A{} ++ static struct S ++ { ++ A a; ++ } ++ S s1 = void; ++ S s2 = S(new A); ++ emplace(&s1, s2); ++ assert(s1.a is s2.a); ++} ++ ++//safety & nothrow & CTFE ++unittest ++{ ++ //emplace should be safe for anything with no elaborate opassign ++ static struct S1 ++ { ++ int i; ++ } ++ static struct S2 ++ { ++ int i; ++ this(int j)@safe nothrow{i = j;} ++ } ++ ++ int i; ++ S1 s1 = void; ++ S2 s2 = void; ++ ++ auto pi = &i; ++ auto ps1 = &s1; ++ auto ps2 = &s2; ++ ++ void foo() @safe nothrow ++ { ++ emplace(pi); ++ emplace(pi, 5); ++ emplace(ps1); ++ emplace(ps1, 5); ++ emplace(ps1, S1.init); ++ emplace(ps2); ++ emplace(ps2, 5); ++ emplace(ps2, S2.init); ++ } ++ ++ T bar(T)() @property ++ { ++ T t/+ = void+/; //CTFE void illegal ++ emplace(&t, 5); ++ return t; ++ } ++ enum a = bar!int; ++ enum b = bar!S1; ++ enum c = bar!S2; ++} ++ ++ ++unittest ++{ ++ struct S ++ { ++ int[2] get(){return [1, 2];} ++ alias get this; ++ } ++ struct SS ++ { ++ int[2] ii; ++ } ++ struct ISS ++ { ++ int[2] ii; ++ } ++ S s; ++ SS ss = void; ++ ISS iss = void; ++ emplace(&ss, s); ++ emplace(&iss, s); ++ assert(ss.ii == [1, 2]); ++ assert(iss.ii == [1, 2]); ++} ++ ++//disable opAssign ++unittest ++{ ++ static struct S ++ { ++ @disable void opAssign(S); ++ } ++ S s; ++ emplace(&s, S.init); ++} ++ ++//opCall ++unittest ++{ ++ int i; ++ //Without constructor ++ { ++ static struct S1 ++ { ++ int i; ++ static S1 opCall(int*){assert(0);} ++ } ++ S1 s = void; ++ static assert(!__traits(compiles, emplace(&s, 1))); ++ static assert( __traits(compiles, emplace(&s, &i))); //(works, but deprected) ++ } ++ //With constructor ++ { ++ static struct S2 ++ { ++ int i = 0; ++ static S2 opCall(int*){assert(0);} ++ static S2 opCall(int){assert(0);} ++ this(int i){this.i = i;} ++ } ++ S2 s = void; ++ static assert( __traits(compiles, emplace(&s, 1))); //(works, but deprected) ++ static assert( __traits(compiles, emplace(&s, &i))); //(works, but deprected) ++ emplace(&s, 1); ++ assert(s.i == 1); ++ } ++ //With postblit ambiguity ++ { ++ static struct S3 ++ { ++ int i = 0; ++ static S3 opCall(ref S3){assert(0);} ++ } ++ S3 s = void; ++ static assert( __traits(compiles, emplace(&s, S3.init))); ++ } ++} ++ ++unittest //@@@9559@@@ ++{ ++ alias Nullable!int I; ++ auto ints = [0, 1, 2].map!(i => i & 1 ? I.init : I(i))(); ++ auto asArray = std.array.array(ints); ++} ++ ++unittest //http://forum.dlang.org/thread/nxbdgtdlmwscocbiypjs@forum.dlang.org ++{ ++ import std.datetime; ++ static struct A ++ { ++ double i; ++ } ++ ++ static struct B ++ { ++ invariant() ++ { ++ if(j == 0) ++ assert(a.i.isNaN, "why is 'j' zero?? and i is not NaN?"); ++ else ++ assert(!a.i.isNaN); ++ } ++ SysTime when; // comment this line avoid the breakage ++ int j; ++ A a; ++ } ++ ++ B b1 = B.init; ++ assert(&b1); // verify that default eyes invariants are ok; ++ ++ auto b2 = B(SysTime(0, UTC()), 1, A(1)); ++ assert(&b2); ++ auto b3 = B(SysTime(0, UTC()), 1, A(1)); ++ assert(&b3); ++ ++ import std.array; ++ auto arr = [b2, b3]; ++ ++ assert(arr[0].j == 1); ++ assert(arr[1].j == 1); ++ auto a2 = arr.array(); // << bang, invariant is raised, also if b2 and b3 are good ++} ++ ++//static arrays ++unittest ++{ ++ static struct S ++ { ++ int[2] ii; ++ } ++ static struct IS ++ { ++ immutable int[2] ii; ++ } ++ int[2] ii; ++ S s = void; ++ IS ims = void; ++ ubyte ub = 2; ++ emplace(&s, ub); ++ emplace(&s, ii); ++ emplace(&ims, ub); ++ emplace(&ims, ii); ++ uint[2] uu; ++ static assert(!__traits(compiles, {S ss = S(uu);})); ++ static assert(!__traits(compiles, emplace(&s, uu))); ++} ++ ++unittest ++{ ++ int[2] sii; ++ int[2] sii2; ++ uint[2] uii; ++ uint[2] uii2; ++ emplace(&sii, 1); ++ emplace(&sii, 1U); ++ emplace(&uii, 1); ++ emplace(&uii, 1U); ++ emplace(&sii, sii2); ++ //emplace(&sii, uii2); //Sorry, this implementation doesn't know how to... ++ //emplace(&uii, sii2); //Sorry, this implementation doesn't know how to... ++ emplace(&uii, uii2); ++ emplace(&sii, sii2[]); ++ //emplace(&sii, uii2[]); //Sorry, this implementation doesn't know how to... ++ //emplace(&uii, sii2[]); //Sorry, this implementation doesn't know how to... ++ emplace(&uii, uii2[]); ++} ++ ++unittest ++{ ++ bool allowDestruction = false; ++ struct S ++ { ++ int i; ++ this(this){} ++ ~this(){assert(allowDestruction);} ++ } ++ S s = S(1); ++ S[2] ss1 = void; ++ S[2] ss2 = void; ++ S[2] ss3 = void; ++ emplace(&ss1, s); ++ emplace(&ss2, ss1); ++ emplace(&ss3, ss2[]); ++ assert(ss1[1] == s); ++ assert(ss2[1] == s); ++ assert(ss3[1] == s); ++ allowDestruction = true; ++} ++ ++unittest ++{ ++ //Checks postblit, construction, and context pointer ++ int count = 0; ++ struct S ++ { ++ this(this) ++ { ++ ++count; ++ } ++ ~this() ++ { ++ --count; ++ } ++ } ++ ++ S s; ++ { ++ S[4] ss = void; ++ emplace(&ss, s); ++ assert(count == 4); ++ } ++ assert(count == 0); ++} ++ ++unittest ++{ ++ struct S ++ { ++ int i; ++ } ++ S s; ++ S[2][2][2] sss = void; ++ emplace(&sss, s); ++} + + private void testEmplaceChunk(void[] chunk, size_t typeSize, size_t typeAlignment, string typeName) + { + enforceEx!ConvException(chunk.length >= typeSize, +- xformat("emplace: Chunk size too small: %s < %s size = %s", ++ format("emplace: Chunk size too small: %s < %s size = %s", + chunk.length, typeName, typeSize)); + enforceEx!ConvException((cast(size_t) chunk.ptr) % typeAlignment == 0, +- xformat("emplace: Misaligned memory block (0x%X): it must be %s-byte aligned for type %s", ++ format("emplace: Misaligned memory block (0x%X): it must be %s-byte aligned for type %s", + chunk.ptr, typeAlignment, typeName)); + } + +@@ -3695,7 +4866,8 @@ $(D T) is $(D @safe). + + Returns: A pointer to the newly constructed object. + */ +-T emplace(T, Args...)(void[] chunk, auto ref Args args) if (is(T == class)) ++T emplace(T, Args...)(void[] chunk, auto ref Args args) ++ if (is(T == class)) + { + enum classSize = __traits(classInstanceSize, T); + testEmplaceChunk(chunk, classSize, classInstanceAlignment!T, T.stringof); +@@ -3834,3 +5006,138 @@ unittest + toTextRange(-1, result); + assert(result.data == "-1"); + } ++ ++ ++/** ++ Returns the corresponding unsigned value for $(D x) (e.g. if $(D x) has type ++ $(D int), it returns $(D cast(uint) x)). The advantage compared to the cast ++ is that you do not need to rewrite the cast if $(D x) later changes type ++ (e.g from $(D int) to $(D long)). ++ ++ Note that the result is always mutable even if the original type was const ++ or immutable. In order to retain the constness, use $(XREF traits, Unsigned). ++ */ ++auto unsigned(T)(T x) if (isIntegral!T) ++{ ++ return cast(Unqual!(Unsigned!T))x; ++} ++ ++/// ++unittest ++{ ++ uint s = 42; ++ auto u1 = unsigned(s); //not qualified ++ Unsigned!(typeof(s)) u2 = unsigned(s); //same qualification ++ immutable u3 = unsigned(s); //totally qualified ++} ++ ++unittest ++{ ++ foreach(T; TypeTuple!(byte, ubyte)) ++ { ++ static assert(is(typeof(unsigned(cast(T)1)) == ubyte)); ++ static assert(is(typeof(unsigned(cast(const T)1)) == ubyte)); ++ static assert(is(typeof(unsigned(cast(immutable T)1)) == ubyte)); ++ } ++ ++ foreach(T; TypeTuple!(short, ushort)) ++ { ++ static assert(is(typeof(unsigned(cast(T)1)) == ushort)); ++ static assert(is(typeof(unsigned(cast(const T)1)) == ushort)); ++ static assert(is(typeof(unsigned(cast(immutable T)1)) == ushort)); ++ } ++ ++ foreach(T; TypeTuple!(int, uint)) ++ { ++ static assert(is(typeof(unsigned(cast(T)1)) == uint)); ++ static assert(is(typeof(unsigned(cast(const T)1)) == uint)); ++ static assert(is(typeof(unsigned(cast(immutable T)1)) == uint)); ++ } ++ ++ foreach(T; TypeTuple!(long, ulong)) ++ { ++ static assert(is(typeof(unsigned(cast(T)1)) == ulong)); ++ static assert(is(typeof(unsigned(cast(const T)1)) == ulong)); ++ static assert(is(typeof(unsigned(cast(immutable T)1)) == ulong)); ++ } ++} ++ ++auto unsigned(T)(T x) if (isSomeChar!T) ++{ ++ // All characters are unsigned ++ static assert(T.min == 0); ++ return cast(Unqual!T) x; ++} ++ ++unittest ++{ ++ foreach(T; TypeTuple!(char, wchar, dchar)) ++ { ++ static assert(is(typeof(unsigned(cast(T)'A')) == T)); ++ static assert(is(typeof(unsigned(cast(const T)'A')) == T)); ++ static assert(is(typeof(unsigned(cast(immutable T)'A')) == T)); ++ } ++} ++ ++ ++/** ++ Returns the corresponding signed value for $(D x) (e.g. if $(D x) has type ++ $(D uint), it returns $(D cast(int) x)). The advantage compared to the cast ++ is that you do not need to rewrite the cast if $(D x) later changes type ++ (e.g from $(D uint) to $(D ulong)). ++ ++ Note that the result is always mutable even if the original type was const ++ or immutable. In order to retain the constness, use $(XREF traits, Signed). ++ */ ++auto signed(T)(T x) if (isIntegral!T) ++{ ++ return cast(Unqual!(Signed!T))x; ++} ++ ++/// ++unittest ++{ ++ uint u = 42; ++ auto s1 = unsigned(u); //not qualified ++ Unsigned!(typeof(u)) s2 = unsigned(u); //same qualification ++ immutable s3 = unsigned(u); //totally qualified ++} ++ ++unittest ++{ ++ foreach(T; TypeTuple!(byte, ubyte)) ++ { ++ static assert(is(typeof(signed(cast(T)1)) == byte)); ++ static assert(is(typeof(signed(cast(const T)1)) == byte)); ++ static assert(is(typeof(signed(cast(immutable T)1)) == byte)); ++ } ++ ++ foreach(T; TypeTuple!(short, ushort)) ++ { ++ static assert(is(typeof(signed(cast(T)1)) == short)); ++ static assert(is(typeof(signed(cast(const T)1)) == short)); ++ static assert(is(typeof(signed(cast(immutable T)1)) == short)); ++ } ++ ++ foreach(T; TypeTuple!(int, uint)) ++ { ++ static assert(is(typeof(signed(cast(T)1)) == int)); ++ static assert(is(typeof(signed(cast(const T)1)) == int)); ++ static assert(is(typeof(signed(cast(immutable T)1)) == int)); ++ } ++ ++ foreach(T; TypeTuple!(long, ulong)) ++ { ++ static assert(is(typeof(signed(cast(T)1)) == long)); ++ static assert(is(typeof(signed(cast(const T)1)) == long)); ++ static assert(is(typeof(signed(cast(immutable T)1)) == long)); ++ } ++} ++ ++unittest ++{ ++ // issue 10874 ++ enum Test { a = 0 } ++ ulong l = 0; ++ auto t = l.to!Test; ++} +--- a/src/libphobos/src/std/cpuid.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/cpuid.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,207 +0,0 @@ +-// Written in the D programming language. +- +-/** +- * $(RED Deprecated. It will be removed in January 2013. Please use core.cpuid instead.) +- * +- * Identify the characteristics of the host CPU. +- * +- * Implemented according to: +- +-- AP-485 Intel(C) Processor Identification and the CPUID Instruction +- $(LINK http://www.intel.com/design/xeon/applnots/241618.htm) +- +-- Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 2A: Instruction Set Reference, A-M +- $(LINK http://developer.intel.com/design/pentium4/manuals/index_new.htm) +- +-- AMD CPUID Specification Publication # 25481 +- $(LINK http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf) +- +-Example: +---- +-import std.cpuid; +-import std.stdio; +- +-void main() +-{ +- writefln(std.cpuid.toString()); +-} +---- +- +-BUGS: Only works on x86 CPUs +- +-Macros: +- WIKI = Phobos/StdCpuid +- +-Copyright: Copyright Tomas Lindquist Olsen 2007 - 2009. +-License: Boost License 1.0. +-Authors: Tomas Lindquist Olsen <tomas@famolsen.dk> +-Source: $(PHOBOSSRC std/_cpuid.d) +-*/ +-/* +- * Copyright Tomas Lindquist Olsen 2007 - 2009. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE_1_0.txt or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +-module std.cpuid; +- +-pragma(msg, "std.cpuid has been deprecated. It will be removed in January 2013. " ~ +- "Please use core.cpuid instead."); +- +-import std.string; +-import std.conv; +-private import core.cpuid; +- +-deprecated: +- +-version(D_InlineAsm_X86) +-{ +- /// Returns everything as a printable string +- string toString() +- { +- string feats; +- if (mmx) feats ~= "MMX "; +- if (fxsr) feats ~= "FXSR "; +- if (sse) feats ~= "SSE "; +- if (sse2) feats ~= "SSE2 "; +- if (sse3) feats ~= "SSE3 "; +- if (ssse3) feats ~= "SSSE3 "; +- if (amd3dnow) feats ~= "3DNow! "; +- if (amd3dnowExt) feats ~= "3DNow!+ "; +- if (amdMmx) feats ~= "MMX+ "; +- if (ia64) feats ~= "IA-64 "; +- if (amd64) feats ~= "AMD64 "; +- if (hyperThreading) feats ~= "HTT"; +- +- return format( +- "Vendor string: %s\n"~ +- "Processor string: %s\n"~ +- "Signature: Family=%d Model=%d Stepping=%d\n"~ +- "Features: %s\n"~ +- "Multithreading: %d threads / %d cores\n", +- vendor, +- processor, +- family, model, stepping, +- feats, +- threadsPerCPU, coresPerCPU); +- +- } +- +- /// Returns vendor string +- alias core.cpuid.vendor vendor; +- /// Returns processor string +- alias core.cpuid.processor processor; +- +- /// Is MMX supported? +- alias core.cpuid.mmx mmx; +- /// Is FXSR supported? +- alias core.cpuid.hasFxsr fxsr; +- /// Is SSE supported? +- alias core.cpuid.sse sse; +- /// Is SSE2 supported? +- alias core.cpuid.sse2 sse2; +- /// Is SSE3 supported? +- alias core.cpuid.sse3 sse3; +- /// Is SSSE3 supported? +- alias core.cpuid.ssse3 ssse3; +- +- /// Is AMD 3DNOW supported? +- alias core.cpuid.amd3dnow amd3dnow; +- /// Is AMD 3DNOW Ext supported? +- alias core.cpuid.amd3dnowExt amd3dnowExt; +- /// Is AMD MMX supported? +- alias core.cpuid.amdMmx amdMmx; +- +- /// Is this an Intel Architecture IA64? +- alias core.cpuid.isItanium ia64; +- /// Is this an AMD 64? +- alias core.cpuid.isX86_64 amd64; +- +- /// Is hyperthreading supported? +- alias core.cpuid.hyperThreading hyperThreading; +- /// Returns number of threads per CPU +- alias core.cpuid.threadsPerCPU threadsPerCPU; +- /// Returns number of cores in CPU +- alias core.cpuid.coresPerCPU coresPerCPU; +- +- @property +- { +- /// Is this an Intel processor? +- bool intel() {return manufac==INTEL;} +- /// Is this an AMD processor? +- bool amd() {return manufac==AMD;} +- +- /// Returns stepping +- uint stepping() {return core.cpuid.stepping;} +- /// Returns model +- uint model() {return core.cpuid.model;} +- /// Returns family +- uint family() {return core.cpuid.family;} +- } +- +- shared static this() +- { +- switch (vendor) +- { +- case "GenuineIntel": +- manufac = INTEL; +- break; +- +- case "AuthenticAMD": +- manufac = AMD; +- break; +- +- default: +- manufac = OTHER; +- } +- } +- +- private: +- // manufacturer +- enum +- { +- OTHER, +- INTEL, +- AMD +- } +- +- __gshared +- { +- uint manufac=OTHER; +- } +-} +-else +-{ +- auto toString() { return "unknown CPU\n"; } +- +- auto vendor() {return "unknown vendor"; } +- auto processor() {return "unknown processor"; } +- +- @property +- { +- bool mmx() {return false; } +- bool fxsr() {return false; } +- bool sse() {return false; } +- bool sse2() {return false; } +- bool sse3() {return false; } +- bool ssse3() {return false; } +- +- bool amd3dnow() {return false; } +- bool amd3dnowExt() {return false; } +- bool amdMmx() {return false; } +- +- bool ia64() {return false; } +- bool amd64() {return false; } +- +- bool hyperThreading() {return false; } +- uint threadsPerCPU() {return 0; } +- uint coresPerCPU() {return 0; } +- +- bool intel() {return false; } +- bool amd() {return false; } +- +- uint stepping() {return 0; } +- uint model() {return 0; } +- uint family() {return 0; } +- } +-} +--- a/src/libphobos/src/std/cstream.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/cstream.d 2014-04-01 16:32:51.000000000 +0100 +@@ -38,6 +38,7 @@ class CFile : Stream { + /** + * Create the stream wrapper for the given C file. + * Params: ++ * cfile = a valid C $(B FILE) pointer to wrap. + * mode = a bitwise combination of $(B FileMode.In) for a readable file + * and $(B FileMode.Out) for a writeable file. + * seekable = indicates if the stream should be _seekable. +@@ -102,7 +103,7 @@ class CFile : Stream { + * Ditto + */ + override char ungetc(char c) { +- return cast(char).std.c.stdio.ungetc(c,cfile); ++ return cast(char)std.c.stdio.ungetc(c,cfile); + } + + /** +--- a/src/libphobos/src/std/csv.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/csv.d 2014-04-01 16:32:51.000000000 +0100 +@@ -430,7 +430,7 @@ unittest + int value; + } + +- Layout ans[3]; ++ Layout[3] ans; + ans[0].name = "one"; + ans[0].value = 1; + ans[1].name = "two"; +@@ -481,7 +481,7 @@ unittest + double other; + } + +- Layout ans[2]; ++ Layout[2] ans; + ans[0].name = "\U00010143Hello"; + ans[0].value = 65; + ans[0].other = 63.63; +@@ -528,7 +528,7 @@ unittest + + auto records = csvReader!Layout(str, ["b","c","a"]); + +- Layout ans[2]; ++ Layout[2] ans; + ans[0].name = "Hello"; + ans[0].value = 65; + ans[0].other = 63.63; +--- a/src/libphobos/src/std/ctype.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/ctype.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,200 +0,0 @@ +-// Written in the D programming language. +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(LINK2 std_ascii.html, std.ascii) instead.) +- * +- * Simple ASCII character classification functions. +- * For Unicode classification, see $(LINK2 std_uni.html, std.uni). +- * References: +- * $(LINK2 http://www.digitalmars.com/d/ascii-table.html, ASCII Table), +- * $(LINK2 http://en.wikipedia.org/wiki/Ascii, Wikipedia) +- * Macros: +- * WIKI=Phobos/StdCtype +- * +- * Copyright: Copyright Digital Mars 2000 - 2011. +- * License: Boost License 1.0. +- * Authors: $(WEB digitalmars.com, Walter Bright) and Jonathan M Davis +- * Source: $(PHOBOSSRC std/_ctype.d) +- */ +-module std.ctype; +- +-import std.ascii; +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isAlphaNum) instead.) +- * +- * Returns !=0 if c is a letter in the range (0..9, a..z, A..Z). +- */ +-deprecated("Please use std.ascii.isAlphaNum instead.") +-pure int isalnum(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isAlpha) instead.) +- * +- * Returns !=0 if c is an ascii upper or lower case letter. +- */ +-deprecated("Please use std.ascii.isAlpha instead.") +-pure int isalpha(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ctype.ascii.isControl) instead.) +- * +- * Returns !=0 if c is a control character. +- */ +-deprecated("Please use std.ascii.isControl instead.") +-pure int iscntrl(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_CTL) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isDigit) instead.) +- * +- * Returns !=0 if c is a digit. +- */ +-deprecated("Please use std.ascii.isDigit instead.") +-pure int isdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_DIG) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isLower) instead.) +- * +- * Returns !=0 if c is lower case ascii letter. +- */ +-deprecated("Please use std.ascii.isLower instead.") +-pure int islower(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_LC) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isPunctuation) instead.) +- * +- * Returns !=0 if c is a punctuation character. +- */ +-deprecated("Please use std.ascii.isPunctuation instead.") +-pure int ispunct(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_PNC) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isWhite) instead.) +- * +- * Returns !=0 if c is a space, tab, vertical tab, form feed, +- * carriage return, or linefeed. +- */ +-deprecated("Please use std.ascii.isWhite instead.") +-pure int isspace(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_SPC) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isUpper) instead.) +- * +- * Returns !=0 if c is an upper case ascii character. +- */ +-deprecated("Please use std.ascii.isUpper instead.") +-pure int isupper(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_UC) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isHexDigit) instead.) +- * +- * Returns !=0 if c is a hex digit (0..9, a..f, A..F). +- */ +-deprecated("Please use std.ascii.isHexDigit instead.") +-pure int isxdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_HEX) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isGraphical) instead.) +- * +- * Returns !=0 if c is a printing character except for the space character. +- */ +-deprecated("Please use std.ascii.isGraphical instead.") +-pure int isgraph(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isPrintable) instead.) +- * +- * Returns !=0 if c is a printing character including the space character. +- */ +-deprecated("Please use std.ascii.isPrintable instead.") +-pure int isprint(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC|_BLK) : 0; } +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.isASCII) instead.) +- * +- * Returns !=0 if c is in the ascii character set, i.e. in the range 0..0x7F. +- */ +-deprecated("Please use std.ascii.isASCII instead.") +-pure int isascii(dchar c) { return c <= 0x7F; } +- +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.toLower) instead.) +- * +- * If c is an upper case ascii character, +- * return the lower case equivalent, otherwise return c. +- */ +-deprecated("Please use std.ascii.toLower instead.") +-pure dchar tolower(dchar c) +-{ +- return std.ascii.toLower(c); +-} +- +- +-/** +- * $(RED Deprecated. It will be removed in March 2013. Please use +- * $(D std.ascii.toUpper) instead.) +- * +- * If c is a lower case ascii character, +- * return the upper case equivalent, otherwise return c. +- */ +-deprecated("Please use std.ascii.toUpper instead.") +-pure dchar toupper(dchar c) +-{ +- return std.ascii.toUpper(c); +-} +- +- +-//============================================================================== +-// Private Section. +-//============================================================================== +-private: +- +-enum +-{ +- _SPC = 8, +- _CTL = 0x20, +- _BLK = 0x40, +- _HEX = 0x80, +- _UC = 1, +- _LC = 2, +- _PNC = 0x10, +- _DIG = 4, +- _ALP = _UC|_LC, +-} +- +-immutable ubyte _ctype[128] = +-[ +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL, +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, +- _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, +- _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, +- _PNC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC, +- _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, +- _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, +- _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC, +- _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC, +- _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, +- _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, +- _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL +-]; +- +--- a/src/libphobos/src/std/datetime.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/datetime.d 2014-04-01 16:32:51.000000000 +0100 +@@ -115,7 +115,6 @@ import std.exception; + import std.file; + import std.functional; + import std.math; +-import std.metastrings; + import std.path; + import std.range; + import std.stdio; +@@ -612,9 +611,9 @@ public: + test(DateTime(1, 1, 1, 0, 0, 1), UTC(), 10_000_000L); + test(DateTime(0, 12, 31, 23, 59, 59), UTC(), -10_000_000L); + +- test(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(dur!"minutes"(-60)), 36_000_000_000L); +- test(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(Duration.zero), 0); +- test(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(dur!"minutes"(60)), -36_000_000_000L); ++ test(DateTime(1, 1, 1, 0, 0, 0), new immutable SimpleTimeZone(dur!"minutes"(-60)), 36_000_000_000L); ++ test(DateTime(1, 1, 1, 0, 0, 0), new immutable SimpleTimeZone(Duration.zero), 0); ++ test(DateTime(1, 1, 1, 0, 0, 0), new immutable SimpleTimeZone(dur!"minutes"(60)), -36_000_000_000L); + } + + /++ +@@ -2161,7 +2160,7 @@ assert(SysTime(DateTime(-7, 4, 5, 7, 45, + } + + { +- immutable stz = new SimpleTimeZone(dur!"minutes"(-3 * 60)); ++ auto stz = new immutable SimpleTimeZone(dur!"minutes"(-3 * 60)); + auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27), stz); + _assertPred!"=="(sysTime, sysTime.toLocalTime()); + _assertPred!"=="(sysTime._stdTime, sysTime.toLocalTime()._stdTime); +@@ -2212,7 +2211,7 @@ assert(SysTime(DateTime(-7, 4, 5, 7, 45, + { + version(testStdDateTime) + { +- immutable stz = new SimpleTimeZone(dur!"minutes"(11 * 60)); ++ auto stz = new immutable SimpleTimeZone(dur!"minutes"(11 * 60)); + auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); + _assertPred!"=="(sysTime, sysTime.toOtherTZ(stz)); + _assertPred!"=="(sysTime._stdTime, sysTime.toOtherTZ(stz)._stdTime); +@@ -7390,12 +7389,6 @@ assert(SysTime(DateTime(2000, 6, 4, 12, + return Date(dayOfGregorianCal).daysInMonth; + } + +- //Explicitly undocumented. Do not use. To be removed in March 2013. +- deprecated("Please use daysInMonth instead.") @property ubyte endOfMonthDay() const nothrow +- { +- return Date(dayOfGregorianCal).daysInMonth; +- } +- + unittest + { + version(testStdDateTime) +@@ -7819,11 +7812,11 @@ assert(SysTime(DateTime(-4, 1, 5, 0, 0, + _assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOString(), "+100001020T010101.050789"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(-360))).toISOString(), ++ new immutable SimpleTimeZone(dur!"minutes"(-360))).toISOString(), + "20121221T121212-06:00"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(420))).toISOString(), ++ new immutable SimpleTimeZone(dur!"minutes"(420))).toISOString(), + "20121221T121212+07:00"); + + //Test B.C. +@@ -7964,11 +7957,11 @@ assert(SysTime(DateTime(-4, 1, 5, 0, 0, + _assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOExtString(), "+10000-10-20T01:01:01.050789"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(-360))).toISOExtString(), ++ new immutable SimpleTimeZone(dur!"minutes"(-360))).toISOExtString(), + "2012-12-21T12:12:12-06:00"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(420))).toISOExtString(), ++ new immutable SimpleTimeZone(dur!"minutes"(420))).toISOExtString(), + "2012-12-21T12:12:12+07:00"); + + //Test B.C. +@@ -8107,11 +8100,11 @@ assert(SysTime(DateTime(-4, 1, 5, 0, 0, + _assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toSimpleString(), "+10000-Oct-20 01:01:01.050789"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(-360))).toSimpleString(), ++ new immutable SimpleTimeZone(dur!"minutes"(-360))).toSimpleString(), + "2012-Dec-21 12:12:12-06:00"); + + _assertPred!"=="(SysTime(DateTime(2012, 12, 21, 12, 12, 12), +- new SimpleTimeZone(dur!"minutes"(420))).toSimpleString(), ++ new immutable SimpleTimeZone(dur!"minutes"(420))).toSimpleString(), + "2012-Dec-21 12:12:12+07:00"); + + //Test B.C. +@@ -8356,21 +8349,21 @@ assert(SysTime.fromISOString("20100704T0 + _assertPred!"=="(SysTime.fromISOString("20101222T172201Z"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); + _assertPred!"=="(SysTime.fromISOString("20101222T172201-1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201-1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201-1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201-8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201+1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201+1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201+1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201+8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(480)))); + + _assertPred!"=="(SysTime.fromISOString("20101103T065106.57159Z"), + SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); +@@ -8379,28 +8372,28 @@ assert(SysTime.fromISOString("20100704T0 + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.23112-1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.45-1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.1-1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), +- new SimpleTimeZone(dur!"minutes"(-90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.55-8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), +- new SimpleTimeZone(dur!"minutes"(-480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.1234567+1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.0+1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.0000000+1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromISOString("20101222T172201.45+8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(480)))); + + //Verify Examples. + assert(SysTime.fromISOString("20100704T070612") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); +@@ -8411,9 +8404,9 @@ assert(SysTime.fromISOString("20100704T0 + + assert(SysTime.fromISOString("20100704T070612Z") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); + assert(SysTime.fromISOString("20100704T070612-8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(-8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(-8)))); + assert(SysTime.fromISOString("20100704T070612+8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(8)))); + } + } + +@@ -8586,21 +8579,21 @@ assert(SysTime.fromISOExtString("2010-07 + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01Z"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01-1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01-1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01-1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01-8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01+1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01+1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01+1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01+8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(480)))); + + _assertPred!"=="(SysTime.fromISOExtString("2010-11-03T06:51:06.57159Z"), + SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); +@@ -8609,28 +8602,28 @@ assert(SysTime.fromISOExtString("2010-07 + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.23112-1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.45-1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.1-1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), +- new SimpleTimeZone(dur!"minutes"(-90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.55-8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), +- new SimpleTimeZone(dur!"minutes"(-480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.1234567+1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.0+1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.0000000+1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromISOExtString("2010-12-22T17:22:01.45+8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(480)))); + + //Verify Examples. + assert(SysTime.fromISOExtString("2010-07-04T07:06:12") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); +@@ -8643,9 +8636,9 @@ assert(SysTime.fromISOExtString("2010-07 + + assert(SysTime.fromISOExtString("2010-07-04T07:06:12Z") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); + assert(SysTime.fromISOExtString("2010-07-04T07:06:12-8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(-8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(-8)))); + assert(SysTime.fromISOExtString("2010-07-04T07:06:12+8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(8)))); + } + } + +@@ -8819,21 +8812,21 @@ assert(SysTime.fromSimpleString("2010-Ju + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01Z"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(-480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(60)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1:30"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(90)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+8:00"), +- SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(dur!"minutes"(480)))); ++ SysTime(DateTime(2010, 12, 22, 17, 22, 01), new immutable SimpleTimeZone(dur!"minutes"(480)))); + + _assertPred!"=="(SysTime.fromSimpleString("2010-Nov-03 06:51:06.57159Z"), + SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); +@@ -8842,28 +8835,28 @@ assert(SysTime.fromSimpleString("2010-Ju + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.23112-1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.45-1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(-60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.1-1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), +- new SimpleTimeZone(dur!"minutes"(-90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-90)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.55-8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), +- new SimpleTimeZone(dur!"minutes"(-480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(-480)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.1234567+1:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.0+1"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(60)))); ++ new immutable SimpleTimeZone(dur!"minutes"(60)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.0000000+1:30"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), +- new SimpleTimeZone(dur!"minutes"(90)))); ++ new immutable SimpleTimeZone(dur!"minutes"(90)))); + _assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.45+8:00"), + SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), +- new SimpleTimeZone(dur!"minutes"(480)))); ++ new immutable SimpleTimeZone(dur!"minutes"(480)))); + + //Verify Examples. + assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); +@@ -8875,9 +8868,9 @@ assert(SysTime.fromSimpleString("2010-Ju + assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12Z") == + SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); + assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12-8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(-8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(-8)))); + assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12+8:00") == +- SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(dur!"hours"(8)))); ++ SysTime(DateTime(2010, 7, 4, 7, 6, 12), new immutable SimpleTimeZone(dur!"hours"(8)))); + } + } + +@@ -12505,12 +12498,6 @@ assert(Date(2000, 6, 4).daysInMonth == 3 + return maxDay(_year, _month); + } + +- //Explicitly undocumented. Do not use. To be removed in March 2013. +- deprecated("Please use daysInMonth instead.") @property ubyte endOfMonthDay() const nothrow +- { +- return maxDay(_year, _month); +- } +- + unittest + { + version(testStdDateTime) +@@ -15339,7 +15326,7 @@ public: + { + auto dt = DateTime.init; + dt.timeOfDay = TimeOfDay(12, 30, 33); +- _assertPred!"=="(dt._date, date.init); ++ _assertPred!"=="(dt._date, Date.init); + _assertPred!"=="(dt._tod, TimeOfDay(12, 30, 33)); + + const cdt = DateTime(1999, 7, 6, 12, 30, 33); +@@ -17395,12 +17382,6 @@ assert(DateTime(Date(2000, 6, 4), TimeOf + return _date.daysInMonth; + } + +- //Explicitly undocumented. Do not use. To be removed in March 2013. +- deprecated("Please use daysInMonth instead.") @property ubyte endOfMonthDay() const nothrow +- { +- return _date.daysInMonth; +- } +- + unittest + { + version(testStdDateTime) +@@ -25843,9 +25824,7 @@ static TP delegate(in TP) everyDayOfWeek + (dir == Direction.fwd || dir == Direction.bwd) && + __traits(hasMember, TP, "dayOfWeek") && + !__traits(isStaticFunction, TP.dayOfWeek) && +- is(ReturnType!(TP.dayOfWeek) == DayOfWeek) && +- (functionAttributes!(TP.dayOfWeek) & FunctionAttribute.property) && +- (functionAttributes!(TP.dayOfWeek) & FunctionAttribute.nothrow_)) ++ is(typeof(TP.dayOfWeek) == DayOfWeek)) + { + TP func(in TP tp) + { +@@ -25977,9 +25956,7 @@ static TP delegate(in TP) everyMonth(TP, + (dir == Direction.fwd || dir == Direction.bwd) && + __traits(hasMember, TP, "month") && + !__traits(isStaticFunction, TP.month) && +- is(ReturnType!(TP.month) == Month) && +- (functionAttributes!(TP.month) & FunctionAttribute.property) && +- (functionAttributes!(TP.month) & FunctionAttribute.nothrow_)) ++ is(typeof(TP.month) == Month)) + { + enforceValid!"months"(month); + +@@ -28545,30 +28522,34 @@ private: + this() immutable + { + super("", "", ""); +- tzset(); + } + + +- static shared LocalTime _localTime; +- static bool _initialized; ++ static immutable LocalTime _localTime = new immutable(LocalTime)(); ++ // Use low-lock singleton pattern with _tzsetWasCalled (see http://dconf.org/talks/simcha.html) ++ static bool _lowLock; ++ static shared bool _tzsetWasCalled; + + ++ // This is done so that we can maintain purity in spite of doing an impure ++ // operation the first time that LocalTime() is called. + static immutable(LocalTime) singleton() + { +- //TODO Make this use double-checked locking once shared has been fixed +- //to use memory fences properly. +- if(!_initialized) ++ if(!_lowLock) + { + synchronized + { +- if(!_localTime) +- _localTime = cast(shared LocalTime)new immutable(LocalTime)(); ++ if(!_tzsetWasCalled) ++ { ++ tzset(); ++ _tzsetWasCalled = true; ++ } + } + +- _initialized = true; ++ _lowLock = true; + } + +- return cast(immutable LocalTime)_localTime; ++ return _localTime; + } + } + +@@ -28585,8 +28566,7 @@ public: + +/ + static immutable(UTC) opCall() pure nothrow + { +- alias pure nothrow immutable(UTC) function() FuncType; +- return (cast(FuncType)&singleton)(); ++ return _utc; + } + + +@@ -28699,27 +28679,7 @@ private: + } + + +- static shared UTC _utc; +- static bool _initialized; +- +- +- static immutable(UTC) singleton() +- { +- //TODO Make this use double-checked locking once shared has been fixed +- //to use memory fences properly. +- if(!_initialized) +- { +- synchronized +- { +- if(!_utc) +- _utc = cast(shared UTC)new immutable(UTC)(); +- } +- +- _initialized = true; +- } +- +- return cast(immutable UTC)_utc; +- } ++ static immutable UTC _utc = new immutable(UTC)(); + } + + +@@ -28772,8 +28732,8 @@ public: + + version(testStdDateTime) unittest + { +- auto west = new SimpleTimeZone(dur!"hours"(-8)); +- auto east = new SimpleTimeZone(dur!"hours"(8)); ++ auto west = new immutable SimpleTimeZone(dur!"hours"(-8)); ++ auto east = new immutable SimpleTimeZone(dur!"hours"(8)); + + assert(west.utcToTZ(0) == -288_000_000_000L); + assert(east.utcToTZ(0) == 288_000_000_000L); +@@ -28800,8 +28760,8 @@ public: + + version(testStdDateTime) unittest + { +- auto west = new SimpleTimeZone(dur!"hours"(-8)); +- auto east = new SimpleTimeZone(dur!"hours"(8)); ++ auto west = new immutable SimpleTimeZone(dur!"hours"(-8)); ++ auto east = new immutable SimpleTimeZone(dur!"hours"(8)); + + assert(west.tzToUTC(-288_000_000_000L) == 0); + assert(east.tzToUTC(288_000_000_000L) == 0); +@@ -28851,8 +28811,8 @@ public: + + version(testStdDateTime) unittest + { +- foreach(stz; [new SimpleTimeZone(dur!"hours"(-8), "PST"), +- new SimpleTimeZone(-8 * 60, "PST")]) ++ foreach(stz; [new immutable SimpleTimeZone(dur!"hours"(-8), "PST"), ++ new immutable SimpleTimeZone(-8 * 60, "PST")]) + + { + assert(stz.name == ""); +@@ -28969,7 +28929,7 @@ private: + immutable hours = to!int(hoursStr); + immutable minutes = minutesStr.empty ? 0 : to!int(minutesStr); + +- return new SimpleTimeZone(sign * (dur!"hours"(hours) + dur!"minutes"(minutes))); ++ return new immutable SimpleTimeZone(sign * (dur!"hours"(hours) + dur!"minutes"(minutes))); + } + + version(testStdDateTime) unittest +@@ -28988,77 +28948,77 @@ private: + assertThrown!DateTimeException(SimpleTimeZone.fromISOString("+1:0")); + + assert(SimpleTimeZone.fromISOString("+00:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(0))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(0))).utcOffset); + assert(SimpleTimeZone.fromISOString("+00:01").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(1))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(1))).utcOffset); + assert(SimpleTimeZone.fromISOString("+00:10").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(10))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(10))).utcOffset); + assert(SimpleTimeZone.fromISOString("+00:59").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(59))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(59))).utcOffset); + assert(SimpleTimeZone.fromISOString("+01:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(60))).utcOffset); + assert(SimpleTimeZone.fromISOString("+01:30").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(90))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(90))).utcOffset); + assert(SimpleTimeZone.fromISOString("+02:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(120))).utcOffset); + assert(SimpleTimeZone.fromISOString("+08:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(480))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(480))).utcOffset); + assert(SimpleTimeZone.fromISOString("+23:59").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(1439))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(1439))).utcOffset); + + assert(SimpleTimeZone.fromISOString("-00:01").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-1))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-1))).utcOffset); + assert(SimpleTimeZone.fromISOString("-00:10").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-10))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-10))).utcOffset); + assert(SimpleTimeZone.fromISOString("-00:59").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-59))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-59))).utcOffset); + assert(SimpleTimeZone.fromISOString("-01:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-60))).utcOffset); + assert(SimpleTimeZone.fromISOString("-01:30").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-90))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-90))).utcOffset); + assert(SimpleTimeZone.fromISOString("-02:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-120))).utcOffset); + assert(SimpleTimeZone.fromISOString("-08:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-480))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-480))).utcOffset); + assert(SimpleTimeZone.fromISOString("-23:59").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-1439))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-1439))).utcOffset); + + assert(SimpleTimeZone.fromISOString("+0").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(0))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(0))).utcOffset); + assert(SimpleTimeZone.fromISOString("+1").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(60))).utcOffset); + assert(SimpleTimeZone.fromISOString("+2").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(120))).utcOffset); + assert(SimpleTimeZone.fromISOString("+23").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(1380))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(1380))).utcOffset); + assert(SimpleTimeZone.fromISOString("+2").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(120))).utcOffset); + + assert(SimpleTimeZone.fromISOString("+0").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(0))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(0))).utcOffset); + assert(SimpleTimeZone.fromISOString("+1").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(60))).utcOffset); + assert(SimpleTimeZone.fromISOString("+2").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(120))).utcOffset); + assert(SimpleTimeZone.fromISOString("+23").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(1380))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(1380))).utcOffset); + assert(SimpleTimeZone.fromISOString("+1:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(60))).utcOffset); + assert(SimpleTimeZone.fromISOString("+1:01").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(61))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(61))).utcOffset); + + assert(SimpleTimeZone.fromISOString("-0").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(0))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(0))).utcOffset); + assert(SimpleTimeZone.fromISOString("-1").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-60))).utcOffset); + assert(SimpleTimeZone.fromISOString("-2").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-120))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-120))).utcOffset); + assert(SimpleTimeZone.fromISOString("-23").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-1380))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-1380))).utcOffset); + assert(SimpleTimeZone.fromISOString("-1:00").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-60))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-60))).utcOffset); + assert(SimpleTimeZone.fromISOString("-1:01").utcOffset == +- (new SimpleTimeZone(dur!"minutes"(-61))).utcOffset); ++ (new immutable SimpleTimeZone(dur!"minutes"(-61))).utcOffset); + } + + //Test that converting from an ISO string to a SimpleTimeZone to an ISO String works properly. +@@ -29600,7 +29560,7 @@ assert(tz.dstName == "PDT"); + break; + } + +- return new PosixTimeZone(transitions.idup, leapSeconds.idup, name, stdName, dstName, hasDST); ++ return new immutable PosixTimeZone(transitions.idup, leapSeconds.idup, name, stdName, dstName, hasDST); + } + catch(DateTimeException dte) + throw dte; +@@ -30130,7 +30090,7 @@ else version(Windows) + tzInfo.DaylightDate = tziFmt.DaylightDate; + tzInfo.DaylightBias = tziFmt.DaylightBias; + +- return new WindowsTimeZone(name, tzInfo); ++ return new immutable WindowsTimeZone(name, tzInfo); + } + throw new DateTimeException(format("Failed to find time zone: %s", name)); + } +@@ -30481,6 +30441,7 @@ string tzDatabaseNameToWindowsTZName(str + case "Africa/Johannesburg": return "South Africa Standard Time"; + case "Africa/Lagos": return "W. Central Africa Standard Time"; + case "Africa/Nairobi": return "E. Africa Standard Time"; ++ case "Africa/Tripoli": return "Libya Standard Time"; + case "Africa/Windhoek": return "Namibia Standard Time"; + case "America/Anchorage": return "Alaskan Standard Time"; + case "America/Asuncion": return "Paraguay Standard Time"; +@@ -30675,6 +30636,7 @@ string windowsTZNameToTZDatabaseName(str + case "Kaliningrad Standard Time": return "Europe/Kaliningrad"; + case "Kamchatka Standard Time": return "Asia/Kamchatka"; + case "Korea Standard Time": return "Asia/Seoul"; ++ case "Libya Standard Time": return "Africa/Tripoli"; + case "Magadan Standard Time": return "Asia/Magadan"; + case "Mauritius Standard Time": return "Indian/Mauritius"; + case "Mexico Standard Time": return "America/Mexico_City"; +@@ -33064,10 +33026,7 @@ template hasMin(T) + { + enum hasMin = __traits(hasMember, T, "min") && + __traits(isStaticFunction, T.min) && +- is(ReturnType!(T.min) == Unqual!T) && +- (functionAttributes!(T.min) & FunctionAttribute.property) && +- (functionAttributes!(T.min) & FunctionAttribute.nothrow_); +- //(functionAttributes!(T.min) & FunctionAttribute.pure_); //Ideally this would be the case, but SysTime's min() can't currently be pure. ++ is(typeof(T.min) == Unqual!T); + } + + unittest +@@ -33097,10 +33056,7 @@ template hasMax(T) + { + enum hasMax = __traits(hasMember, T, "max") && + __traits(isStaticFunction, T.max) && +- is(ReturnType!(T.max) == Unqual!T) && +- (functionAttributes!(T.max) & FunctionAttribute.property) && +- (functionAttributes!(T.max) & FunctionAttribute.nothrow_); +- //(functionAttributes!(T.max) & FunctionAttribute.pure_); //Ideally this would be the case, but SysTime's max() can't currently be pure. ++ is(typeof(T.max) == Unqual!T); + } + + unittest +--- a/src/libphobos/src/std/digest/digest.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/digest/digest.d 2014-04-01 16:32:51.000000000 +0100 +@@ -178,6 +178,7 @@ module std.digest.digest; + import std.exception, std.range, std.traits; + import std.algorithm : copy; + import std.typetuple : allSatisfy; ++import std.ascii : LetterCase; + + //verify example + unittest +@@ -649,7 +650,7 @@ unittest + * function. + * + * Params: +- * Order= the order in which the bytes are processed (see $(LREF toHexString)) ++ * order= the order in which the bytes are processed (see $(LREF toHexString)) + * range= an $(D InputRange) with $(D ElementType) $(D ubyte), $(D ubyte[]) or $(D ubyte[num]) + * + * +@@ -678,7 +679,7 @@ unittest + * This overload of the hexDigest function handles arrays. + * + * Params: +- * Order= the order in which the bytes are processed (see $(LREF toHexString)) ++ * order= the order in which the bytes are processed (see $(LREF toHexString)) + * data= one or more arrays of any type + * + * Examples: +@@ -901,6 +902,7 @@ enum Order : bool + decreasing /// + } + ++ + /** + * Used to convert a hash value (a static or dynamic array of ubytes) to a string. + * Can be used with the OOP and with the template API. +@@ -908,6 +910,10 @@ enum Order : bool + * The additional order parameter can be used to specify the order of the input data. + * By default the data is processed in increasing order, starting at index 0. To process it in the + * opposite order, pass Order.decreasing as a parameter. ++ * ++ * The additional letterCase parameter can be used to specify the case of the output data. ++ * By default the output is in upper case. To change it to the lower case ++ * pass LetterCase.lower as a parameter. + * + * Examples: + * -------- +@@ -915,7 +921,13 @@ enum Order : bool + * auto crc32 = digest!CRC32("The quick ", "brown ", "fox jumps over the lazy dog"); + * assert(toHexString(crc32) == "39A34F41"); + * -------- +- * ++ * ++ * -------- ++ * //Lower case variant: ++ * auto crc32 = digest!CRC32("The quick ", "brown ", "fox jumps over the lazy dog"); ++ * assert(toHexString!(LetterCase.lower)(crc32) == "39a34f41"); ++ * -------- ++ * + * -------- + * //Usually CRCs are printed in this order, though: + * auto crc32 = digest!CRC32("The quick ", "brown ", "fox jumps over the lazy dog"); +@@ -934,8 +946,19 @@ enum Order : bool + * assert(toHexString!(Order.decreasing)(crc32) == "414FA339"); + * -------- + */ +-char[num*2] toHexString(Order order = Order.increasing, size_t num)(in ubyte[num] digest) ++char[num*2] toHexString(Order order = Order.increasing, size_t num, LetterCase letterCase = LetterCase.upper) ++(in ubyte[num] digest) + { ++ static if (letterCase == LetterCase.upper) ++ { ++ import std.ascii : hexDigits = hexDigits; ++ } ++ else ++ { ++ import std.ascii : hexDigits = lowerHexDigits; ++ } ++ ++ + char[num*2] result; + size_t i; + +@@ -943,8 +966,8 @@ char[num*2] toHexString(Order order = Or + { + foreach(u; digest) + { +- result[i++] = std.ascii.hexDigits[u >> 4]; +- result[i++] = std.ascii.hexDigits[u & 15]; ++ result[i++] = hexDigits[u >> 4]; ++ result[i++] = hexDigits[u & 15]; + } + } + else +@@ -952,8 +975,8 @@ char[num*2] toHexString(Order order = Or + size_t j = num - 1; + while(i < num*2) + { +- result[i++] = std.ascii.hexDigits[digest[j] >> 4]; +- result[i++] = std.ascii.hexDigits[digest[j] & 15]; ++ result[i++] = hexDigits[digest[j] >> 4]; ++ result[i++] = hexDigits[digest[j] & 15]; + j--; + } + } +@@ -961,8 +984,24 @@ char[num*2] toHexString(Order order = Or + } + + ///ditto +-string toHexString(Order order = Order.increasing)(in ubyte[] digest) ++auto toHexString(LetterCase letterCase, Order order = Order.increasing, size_t num)(in ubyte[num] digest) ++{ ++ return toHexString!(order, num, letterCase)(digest); ++} ++ ++///ditto ++string toHexString(Order order = Order.increasing, LetterCase letterCase = LetterCase.upper) ++(in ubyte[] digest) + { ++ static if (letterCase == LetterCase.upper) ++ { ++ import std.ascii : hexDigits = hexDigits; ++ } ++ else ++ { ++ import std.ascii : hexDigits = lowerHexDigits; ++ } ++ + auto result = new char[digest.length*2]; + size_t i; + +@@ -970,21 +1009,27 @@ string toHexString(Order order = Order.i + { + foreach(u; digest) + { +- result[i++] = std.ascii.hexDigits[u >> 4]; +- result[i++] = std.ascii.hexDigits[u & 15]; ++ result[i++] = hexDigits[u >> 4]; ++ result[i++] = hexDigits[u & 15]; + } + } + else + { + foreach(u; retro(digest)) + { +- result[i++] = std.ascii.hexDigits[u >> 4]; +- result[i++] = std.ascii.hexDigits[u & 15]; ++ result[i++] = hexDigits[u >> 4]; ++ result[i++] = hexDigits[u & 15]; + } + } + return assumeUnique(result); + } + ++///ditto ++auto toHexString(LetterCase letterCase, Order order = Order.increasing)(in ubyte[] digest) ++{ ++ return toHexString!(order, letterCase)(digest); ++} ++ + //For more example unittests, see Digest.digest, digest + + //verify example +@@ -994,6 +1039,8 @@ unittest + //Usually CRCs are printed in this order, though: + auto crc32 = digest!CRC32("The quick ", "brown ", "fox jumps over the lazy dog"); + assert(toHexString!(Order.decreasing)(crc32) == "414FA339"); ++ assert(toHexString!(LetterCase.lower, Order.decreasing)(crc32) == "414fa339"); ++ assert(toHexString!(LetterCase.lower)(crc32) == "39a34f41"); + } + + //verify example +@@ -1013,6 +1060,7 @@ unittest + assert(toHexString(cast(ubyte[4])[42, 43, 44, 45]) == "2A2B2C2D"); + assert(toHexString(cast(ubyte[])[42, 43, 44, 45]) == "2A2B2C2D"); + assert(toHexString!(Order.decreasing)(cast(ubyte[4])[42, 43, 44, 45]) == "2D2C2B2A"); ++ assert(toHexString!(Order.decreasing, LetterCase.lower)(cast(ubyte[4])[42, 43, 44, 45]) == "2d2c2b2a"); + assert(toHexString!(Order.decreasing)(cast(ubyte[])[42, 43, 44, 45]) == "2D2C2B2A"); + } + +--- a/src/libphobos/src/std/digest/md.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/digest/md.d 2014-04-01 16:32:51.000000000 +0100 +@@ -168,11 +168,11 @@ struct MD5 + { + private: + // magic initialization constants +- uint _state[4] = [0x67452301,0xefcdab89,0x98badcfe,0x10325476]; // state (ABCD) ++ uint[4] _state = [0x67452301,0xefcdab89,0x98badcfe,0x10325476]; // state (ABCD) + ulong _count; //number of bits, modulo 2^64 + ubyte[64] _buffer; // input buffer + +- enum ubyte[64] _padding = ++ static immutable ubyte[64] _padding = + [ + 0x80, 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, +@@ -195,28 +195,28 @@ struct MD5 + */ + static nothrow pure void FF(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { +- a += F (b, c, d) + x + cast(uint)(ac); ++ a += F (b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + static nothrow pure void GG(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { +- a += G (b, c, d) + x + cast(uint)(ac); ++ a += G (b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + static nothrow pure void HH(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { +- a += H (b, c, d) + x + cast(uint)(ac); ++ a += H (b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + static nothrow pure void II(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { +- a += I (b, c, d) + x + cast(uint)(ac); ++ a += I (b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } +@@ -259,7 +259,7 @@ struct MD5 + { + for(size_t i = 0; i < 16; i++) + { +- x[i] = littleEndianToNative!uint(cast(ubyte[4])block[i*4..i+4]); ++ x[i] = littleEndianToNative!uint(*cast(ubyte[4]*)&(*block)[i*4]); + } + } + else +@@ -435,13 +435,12 @@ struct MD5 + */ + @trusted nothrow pure ubyte[16] finish() + { +- ubyte[16] data; ++ ubyte[16] data = void; + ubyte[8] bits = void; + uint index, padLen; + + //Save number of bits +- bits[0 .. 4] = nativeToLittleEndian((cast(uint*)&_count)[0])[]; +- bits[4 .. 8] = nativeToLittleEndian((cast(uint*)&_count)[1])[]; ++ bits[0 .. 8] = nativeToLittleEndian(_count)[]; + + //Pad out to 56 mod 64 + index = (cast(uint)_count >> 3) & (64 - 1); +--- a/src/libphobos/src/std/digest/ripemd.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/digest/ripemd.d 2014-04-01 16:32:51.000000000 +0100 +@@ -33,13 +33,15 @@ $(TR $(TDNW Helpers) $(TD $(MYREF ripemd + * The D implementation is a direct translation of the ANSI C implementation by Antoon Bosselaers. + * + * References: +- * $(LINK2 http://homes.esat.kuleuven.be/~bosselae/ripemd160.html, The hash function RIPEMD-160) +- * $(LINK2 http://en.wikipedia.org/wiki/RIPEMD-160, Wikipedia on RIPEMD-160) ++ * $(UL ++ * $(LI $(LINK2 http://homes.esat.kuleuven.be/~bosselae/ripemd160.html, The hash function RIPEMD-160)) ++ * $(LI $(LINK2 http://en.wikipedia.org/wiki/RIPEMD-160, Wikipedia on RIPEMD-160)) ++ * ) + * +- * Source: $(PHOBOSSRC std/digest/_md.d) ++ * Source: $(PHOBOSSRC std/digest/_ripemd.d) + * + * Macros: +- * WIKI = Phobos/StdMd5 ++ * WIKI = Phobos/StdRipemd + * MYREF = $1  + * + * Examples: +@@ -167,7 +169,7 @@ struct RIPEMD160 + { + private: + // magic initialization constants +- uint _state[5] = [0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0]; // state (ABCDE) ++ uint[5] _state = [0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0]; // state (ABCDE) + ulong _count; //number of bits, modulo 2^64 + ubyte[64] _buffer; // input buffer + +@@ -292,7 +294,7 @@ struct RIPEMD160 + { + for(size_t i = 0; i < 16; i++) + { +- x[i] = littleEndianToNative!uint(cast(ubyte[4])block[i*4..i+4]); ++ x[i] = littleEndianToNative!uint(*cast(ubyte[4]*)&(*block)[i*4]); + } + } + else +@@ -580,13 +582,12 @@ struct RIPEMD160 + */ + @trusted nothrow pure ubyte[20] finish() + { +- ubyte[20] data; ++ ubyte[20] data = void; + ubyte[8] bits = void; + uint index, padLen; + + //Save number of bits +- bits[0 .. 4] = nativeToLittleEndian((cast(uint*)&_count)[0])[]; +- bits[4 .. 8] = nativeToLittleEndian((cast(uint*)&_count)[1])[]; ++ bits[0 .. 8] = nativeToLittleEndian(_count)[]; + + //Pad out to 56 mod 64 + index = (cast(uint)_count >> 3) & (64 - 1); +--- a/src/libphobos/src/std/digest/sha.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/digest/sha.d 2014-04-01 16:32:51.000000000 +0100 +@@ -234,7 +234,7 @@ struct SHA1 + + shared static this() + { +- transform = hasSSSE3Support() ? &transformSSSE3 : &transformX86; ++ transform = hasSSSE3Support ? &transformSSSE3 : &transformX86; + } + } + else +@@ -243,7 +243,7 @@ struct SHA1 + } + + private: +- uint state[5] = /* state (ABCDE) */ ++ uint[5] state = /* state (ABCDE) */ + /* magic initialization constants */ + [0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0]; + +@@ -494,7 +494,7 @@ struct SHA1 + */ + @trusted nothrow pure ubyte[20] finish() + { +- ubyte[20] data; ++ ubyte[20] data = void; + uint index, padLen; + + /* Save number of bits */ +@@ -657,7 +657,10 @@ unittest + string a = "Mary has ", b = "a little lamb"; + int[] c = [ 1, 2, 3, 4, 5 ]; + string d = toHexString(sha1Of(a, b, c)); +- assert(d == "CDBB611D00AC2387B642D3D7BDF4C3B342237110", d); ++ version(LittleEndian) ++ assert(d == "CDBB611D00AC2387B642D3D7BDF4C3B342237110", d); ++ else ++ assert(d == "A0F1196C7A379C09390476D9CA4AA11B71FD11C8", d); + } + + /** +--- a/src/libphobos/src/std/encoding.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/encoding.d 2014-04-01 16:32:51.000000000 +0100 +@@ -645,7 +645,7 @@ template EncoderInstance(E) + //============================================================================= + + /** Defines various character sets. */ +-enum AsciiChar : ubyte { init }; ++enum AsciiChar : ubyte { init } + /// Ditto + alias immutable(AsciiChar)[] AsciiString; + +@@ -725,7 +725,7 @@ template EncoderInstance(CharType : Asci + //============================================================================= + + /** Defines an Latin1-encoded character. */ +-enum Latin1Char : ubyte { init }; ++enum Latin1Char : ubyte { init } + /** + Defines an Latin1-encoded string (as an array of $(D + immutable(Latin1Char))). +@@ -801,7 +801,7 @@ template EncoderInstance(CharType : Lati + //============================================================================= + + /** Defines a Windows1252-encoded character. */ +-enum Windows1252Char : ubyte { init }; ++enum Windows1252Char : ubyte { init } + /** + Defines an Windows1252-encoded string (as an array of $(D + immutable(Windows1252Char))). +@@ -1514,6 +1514,7 @@ unittest + + Params: + s = the string to be counted ++ n = the current code point index + */ + ptrdiff_t index(E)(const(E)[] s,int n) + in +@@ -1688,7 +1689,8 @@ body + Standards: Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252 + + Params: +- c = the code point to be encoded ++ c = the code point to be encoded ++ array = the destination array + + Returns: + the number of code units written to the array +@@ -1780,23 +1782,30 @@ size_t encode(E, R)(dchar c, R range) + { + if (c <= 0xFFFF) + { +- r.put(cast(wchar) c); ++ range.put(cast(wchar) c); + return 1; + } +- r.put(cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800)); +- r.put(cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00)); ++ range.put(cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800)); ++ range.put(cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00)); + return 2; + } + else static if (is(Unqual!E == dchar)) + { +- r.put(c); ++ range.put(c); + return 1; + } + else + { +- assert(0); ++ static assert(0); + } + } ++unittest ++{ ++ Appender!(char[]) r; ++ assert(encode!(char)('T', r) == 1); ++ assert(encode!(wchar)('T', r) == 1); ++ assert(encode!(dchar)('T', r) == 1); ++} + + /** + Encodes a single code point to a delegate. +@@ -1817,7 +1826,8 @@ size_t encode(E, R)(dchar c, R range) + Standards: Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252 + + Params: +- c = the code point to be encoded ++ c = the code point to be encoded ++ dg = the delegate to invoke for each code unit + */ + void encode(E)(dchar c, void delegate(E) dg) + in +@@ -1898,7 +1908,7 @@ unittest + Standards: Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252 + + Params: +- d = the code point to be encoded ++ c = the code point to be encoded + + Examples: + -------------------------------------------------------- +@@ -2145,7 +2155,8 @@ abstract class EncodingScheme + * The input to this function MUST be a valid code point. + * + * Params: +- * c = the code point to be encoded ++ * c = the code point to be encoded ++ * buffer = the destination array + * + * Returns: + * the number of ubytes written. +@@ -2333,6 +2344,7 @@ abstract class EncodingScheme + * + * Params: + * s = the string to be counted ++ * n = the current code point index + */ + ptrdiff_t index(const(ubyte)[] s, size_t n) + in +--- a/src/libphobos/src/std/exception.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/exception.d 2014-04-01 16:32:51.000000000 +0100 +@@ -5,33 +5,33 @@ + handling. It also defines functions intended to aid in unit testing. + + Synopsis of some of std.exception's functions: +--------------------- +-string synopsis() +-{ +- FILE* f = enforce(fopen("some/file")); +- // f is not null from here on +- FILE* g = enforceEx!WriteException(fopen("some/other/file", "w")); +- // g is not null from here on +- +- Exception e = collectException(write(g, readln(f))); +- if (e) +- { +- ... an exception occurred... +- ... We have the exception to play around with... +- } +- +- string msg = collectExceptionMsg(write(g, readln(f))); +- if (msg) +- { +- ... an exception occurred... +- ... We have the message from the exception but not the exception... +- } +- +- char[] line; +- enforce(readln(f, line)); +- return assumeUnique(line); +-} +--------------------- ++ -------------------- ++ string synopsis() ++ { ++ FILE* f = enforce(fopen("some/file")); ++ // f is not null from here on ++ FILE* g = enforceEx!WriteException(fopen("some/other/file", "w")); ++ // g is not null from here on ++ ++ Exception e = collectException(write(g, readln(f))); ++ if (e) ++ { ++ ... an exception occurred... ++ ... We have the exception to play around with... ++ } ++ ++ string msg = collectExceptionMsg(write(g, readln(f))); ++ if (msg) ++ { ++ ... an exception occurred... ++ ... We have the message from the exception but not the exception... ++ } ++ ++ char[] line; ++ enforce(readln(f, line)); ++ return assumeUnique(line); ++ } ++ -------------------- + + Macros: + WIKI = Phobos/StdException +@@ -57,22 +57,17 @@ import core.exception, core.stdc.errno; + T = The $(D Throwable) to test for. + expression = The expression to test. + msg = Optional message to output on test failure. ++ If msg is empty, and the thrown exception has a ++ non-empty msg field, the exception's msg field ++ will be output on test failure. ++ file = The file where the error occurred. ++ Defaults to $(D __FILE__). ++ line = The line where the error occurred. ++ Defaults to $(D __LINE__). + + Throws: + $(D AssertError) if the given $(D Throwable) is thrown. +- +- Examples: +--------------------- +-assertNotThrown!StringException(enforceEx!StringException(true, "Error!")); +- +-//Exception is the default. +-assertNotThrown(enforceEx!StringException(true, "Error!")); +- +-assert(collectExceptionMsg!AssertError(assertNotThrown!StringException( +- enforceEx!StringException(false, "Error!"))) == +- `assertNotThrown failed: StringException was thrown.`); +--------------------- +- +/ ++ +/ + void assertNotThrown(T : Throwable = Exception, E) + (lazy E expression, + string msg = null, +@@ -80,21 +75,19 @@ void assertNotThrown(T : Throwable = Exc + size_t line = __LINE__) + { + try ++ { + expression(); +- catch(T t) ++ } ++ catch (T t) + { +- immutable tail = msg.empty ? "." : ": " ~ msg; +- ++ immutable message = msg.empty ? t.msg : msg; ++ immutable tail = message.empty ? "." : ": " ~ message; + throw new AssertError(format("assertNotThrown failed: %s was thrown%s", +- T.stringof, +- tail), +- file, +- line, +- t); ++ T.stringof, tail), ++ file, line, t); + } + } +- +-//Verify Examples ++/// + unittest + { + assertNotThrown!StringException(enforceEx!StringException(true, "Error!")); +@@ -104,6 +97,20 @@ unittest + + assert(collectExceptionMsg!AssertError(assertNotThrown!StringException( + enforceEx!StringException(false, "Error!"))) == ++ `assertNotThrown failed: StringException was thrown: Error!`); ++} ++unittest ++{ ++ assert(collectExceptionMsg!AssertError(assertNotThrown!StringException( ++ enforceEx!StringException(false, ""), "Error!")) == ++ `assertNotThrown failed: StringException was thrown: Error!`); ++ ++ assert(collectExceptionMsg!AssertError(assertNotThrown!StringException( ++ enforceEx!StringException(false, ""))) == ++ `assertNotThrown failed: StringException was thrown.`); ++ ++ assert(collectExceptionMsg!AssertError(assertNotThrown!StringException( ++ enforceEx!StringException(false, ""), "")) == + `assertNotThrown failed: StringException was thrown.`); + } + +@@ -113,24 +120,28 @@ unittest + void nothrowEx() { } + + try ++ { + assertNotThrown!Exception(nothrowEx()); +- catch(AssertError) +- assert(0); ++ } ++ catch (AssertError) assert(0); + + try ++ { + assertNotThrown!Exception(nothrowEx(), "It's a message"); +- catch(AssertError) +- assert(0); ++ } ++ catch (AssertError) assert(0); + + try ++ { + assertNotThrown!AssertError(nothrowEx()); +- catch(AssertError) +- assert(0); ++ } ++ catch (AssertError) assert(0); + + try ++ { + assertNotThrown!AssertError(nothrowEx(), "It's a message"); +- catch(AssertError) +- assert(0); ++ } ++ catch (AssertError) assert(0); + + { + bool thrown = false; +@@ -139,9 +150,7 @@ unittest + assertNotThrown!Exception( + throwEx(new Exception("It's an Exception"))); + } +- catch(AssertError) +- thrown = true; +- ++ catch (AssertError) thrown = true; + assert(thrown); + } + +@@ -152,9 +161,7 @@ unittest + assertNotThrown!Exception( + throwEx(new Exception("It's an Exception")), "It's a message"); + } +- catch(AssertError) +- thrown = true; +- ++ catch (AssertError) thrown = true; + assert(thrown); + } + +@@ -163,13 +170,9 @@ unittest + try + { + assertNotThrown!AssertError( +- throwEx(new AssertError("It's an AssertError", +- __FILE__, +- __LINE__))); ++ throwEx(new AssertError("It's an AssertError", __FILE__, __LINE__))); + } +- catch(AssertError) +- thrown = true; +- ++ catch (AssertError) thrown = true; + assert(thrown); + } + +@@ -178,14 +181,10 @@ unittest + try + { + assertNotThrown!AssertError( +- throwEx(new AssertError("It's an AssertError", +- __FILE__, +- __LINE__)), ++ throwEx(new AssertError("It's an AssertError", __FILE__, __LINE__)), + "It's a message"); + } +- catch(AssertError) +- thrown = true; +- ++ catch (AssertError) thrown = true; + assert(thrown); + } + } +@@ -200,21 +199,13 @@ unittest + T = The $(D Throwable) to test for. + expression = The expression to test. + msg = Optional message to output on test failure. ++ file = The file where the error occurred. ++ Defaults to $(D __FILE__). ++ line = The line where the error occurred. ++ Defaults to $(D __LINE__). + + Throws: + $(D AssertError) if the given $(D Throwable) is not thrown. +- +- Examples: +--------------------- +-assertThrown!StringException(enforceEx!StringException(false, "Error!")); +- +-//Exception is the default. +-assertThrown(enforceEx!StringException(false, "Error!")); +- +-assert(collectExceptionMsg!AssertError(assertThrown!StringException( +- enforceEx!StringException(true, "Error!"))) == +- `assertThrown failed: No StringException was thrown.`); +--------------------- + +/ + void assertThrown(T : Throwable = Exception, E) + (lazy E expression, +@@ -222,26 +213,16 @@ void assertThrown(T : Throwable = Except + string file = __FILE__, + size_t line = __LINE__) + { +- bool thrown = false; +- + try + expression(); +- catch(T t) +- thrown = true; +- +- if(!thrown) +- { +- immutable tail = msg.empty ? "." : ": " ~ msg; ++ catch (T) ++ return; + +- throw new AssertError(format("assertThrown failed: No %s was thrown%s", +- T.stringof, +- tail), +- file, +- line); +- } ++ throw new AssertError(format("assertThrown failed: No %s was thrown%s%s", ++ T.stringof, msg.empty ? "." : ": ", msg), ++ file, line); + } +- +-//Verify Examples ++/// + unittest + { + assertThrown!StringException(enforceEx!StringException(false, "Error!")); +@@ -260,36 +241,32 @@ unittest + void nothrowEx() { } + + try ++ { + assertThrown!Exception(throwEx(new Exception("It's an Exception"))); +- catch(AssertError) +- assert(0); ++ } ++ catch (AssertError) assert(0); + + try + { + assertThrown!Exception(throwEx(new Exception("It's an Exception")), + "It's a message"); + } +- catch(AssertError) +- assert(0); ++ catch(AssertError) assert(0); + + try + { + assertThrown!AssertError(throwEx(new AssertError("It's an AssertError", +- __FILE__, +- __LINE__))); ++ __FILE__, __LINE__))); + } +- catch(AssertError) +- assert(0); ++ catch (AssertError) assert(0); + + try + { + assertThrown!AssertError(throwEx(new AssertError("It's an AssertError", +- __FILE__, +- __LINE__)), ++ __FILE__, __LINE__)), + "It's a message"); + } +- catch(AssertError) +- assert(0); ++ catch (AssertError) assert(0); + + + { +@@ -346,12 +323,12 @@ unittest + blocks and $(D invariant)s), because they will be compiled out when + compiling with $(I -release). Use $(D assert) in contracts. + +- Example: +--------------------- +-auto f = enforce(fopen("data.txt")); +-auto line = readln(f); +-enforce(line.length, "Expected a non-empty line."); +--------------------- ++ Example: ++ -------------------- ++ auto f = enforce(fopen("data.txt")); ++ auto line = readln(f); ++ enforce(line.length, "Expected a non-empty line."); ++ -------------------- + +/ + T enforce(T)(T value, lazy const(char)[] msg = null, string file = __FILE__, size_t line = __LINE__) + { +@@ -380,7 +357,7 @@ T enforce(T, string file, size_t line = + +/ + T enforce(T, Dg, string file = __FILE__, size_t line = __LINE__) + (T value, scope Dg dg) +- if (is(Dg : void delegate()) || is(Dg : void function())) ++ if (isSomeFunction!Dg && is(typeof( dg() ))) + { + if (!value) dg(); + return value; +@@ -408,6 +385,13 @@ unittest + } + } + ++unittest ++{ ++ // Issue 10510 ++ extern(C) void cFoo() { } ++ enforce(false, &cFoo); ++} ++ + // purity and safety inference test + unittest + { +@@ -482,12 +466,12 @@ unittest + /++ + If $(D !!value) is true, $(D value) is returned. Otherwise, $(D ex) is thrown. + +- Example: +--------------------- +-auto f = enforce(fopen("data.txt")); +-auto line = readln(f); +-enforce(line.length, new IOException); // expect a non-empty line +--------------------- ++ Example: ++ -------------------- ++ auto f = enforce(fopen("data.txt")); ++ auto line = readln(f); ++ enforce(line.length, new IOException); // expect a non-empty line ++ -------------------- + +/ + T enforce(T)(T value, lazy Throwable ex) + { +@@ -506,12 +490,12 @@ unittest + $(D new ErrnoException(msg)) is thrown. $(D ErrnoException) assumes that the + last operation set $(D errno) to an error code. + +- Example: +--------------------- +-auto f = errnoEnforce(fopen("data.txt")); +-auto line = readln(f); +-enforce(line.length); // expect a non-empty line +--------------------- ++ Example: ++ -------------------- ++ auto f = errnoEnforce(fopen("data.txt")); ++ auto line = readln(f); ++ enforce(line.length); // expect a non-empty line ++ -------------------- + +/ + T errnoEnforce(T, string file = __FILE__, size_t line = __LINE__) + (T value, lazy string msg = null) +@@ -527,12 +511,12 @@ T errnoEnforce(T, string file = __FILE__ + and can be constructed with $(D new E(file, line)), then + $(D new E(file, line)) will be thrown. + +- Example: +--------------------- +- auto f = enforceEx!FileMissingException(fopen("data.txt")); +- auto line = readln(f); +- enforceEx!DataCorruptionException(line.length); +--------------------- ++ Example: ++ -------------------- ++ auto f = enforceEx!FileMissingException(fopen("data.txt")); ++ auto line = readln(f); ++ enforceEx!DataCorruptionException(line.length); ++ -------------------- + +/ + template enforceEx(E) + if (is(typeof(new E("", __FILE__, __LINE__)))) +@@ -554,14 +538,7 @@ template enforceEx(E) + } + } + +-/++ +- $(RED Deprecated. It will be removed in October 2012. Please use the version +- of $(D enforceEx) which takes an exception that constructs with +- $(D new E(msg, file, line)).) +- +- If $(D !!value) is $(D true), $(D value) is returned. Otherwise, +- $(D new E(msg)) is thrown. +- +/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use the version of enforceEx which takes an exception that constructs with new E(msg, file, line).") + template enforceEx(E) + if (is(typeof(new E(""))) && !is(typeof(new E("", __FILE__, __LINE__))) && !is(typeof(new E(__FILE__, __LINE__)))) +@@ -620,13 +597,6 @@ unittest + T = The type of exception to catch. + expression = The expression which may throw an exception. + result = The result of the expression if no exception is thrown. +- +- Example: +--------------------- +-int[] a = new int[3]; +-int b; +-assert(collectException(a[4], b)); +--------------------- + +/ + T collectException(T = Exception, E)(lazy E expression, ref E result) + { +@@ -640,13 +610,16 @@ T collectException(T = Exception, E)(laz + } + return null; + } +- ++/// + unittest + { +- int[] a = new int[3]; + int b; + int foo() { throw new Exception("blah"); } + assert(collectException(foo(), b)); ++ ++ int[] a = new int[3]; ++ import core.exception : RangeError; ++ assert(collectException!RangeError(a[4], b)); + } + + /++ +@@ -702,18 +675,6 @@ unittest + Params: + T = The type of exception to catch. + expression = The expression which may throw an exception. +- +- Examples: +--------------------- +-void throwFunc() {throw new Exception("My Message.");} +-assert(collectExceptionMsg(throwFunc()) == "My Message."); +- +-void nothrowFunc() {} +-assert(collectExceptionMsg(nothrowFunc()) is null); +- +-void throwEmptyFunc() {throw new Exception("");} +-assert(collectExceptionMsg(throwEmptyFunc()) == emptyExceptionMsg); +--------------------- + +/ + string collectExceptionMsg(T = Exception, E)(lazy E expression) + { +@@ -726,17 +687,16 @@ string collectExceptionMsg(T = Exception + catch(T e) + return e.msg.empty ? emptyExceptionMsg : e.msg; + } +- +-//Verify Examples. ++/// + unittest + { +- void throwFunc() {throw new Exception("My Message.");} ++ void throwFunc() { throw new Exception("My Message."); } + assert(collectExceptionMsg(throwFunc()) == "My Message."); + + void nothrowFunc() {} + assert(collectExceptionMsg(nothrowFunc()) is null); + +- void throwEmptyFunc() {throw new Exception("");} ++ void throwEmptyFunc() { throw new Exception(""); } + assert(collectExceptionMsg(throwEmptyFunc()) == emptyExceptionMsg); + } + +@@ -857,22 +817,34 @@ Returns $(D true) if $(D source)'s repre + that points to $(D target)'s representation or somewhere inside + it. + +-Note that evaluating $(D pointsTo(x, x)) checks whether $(D x) has ++If $(D source) is or contains a dynamic array, then, then pointsTo will check ++if there is overlap between the dynamic array and $(D target)'s representation. ++ ++If $(D source) is or contains a union, then every member of the union is ++checked for embedded pointers. This may lead to false positives, depending on ++which should be considered the "active" member of the union. ++ ++If $(D source) is a class, then pointsTo will handle it as a pointer. ++ ++If $(D target) is a pointer, a dynamic array or a class, then pointsTo will only ++check if $(D source) points to $(D target), $(I not) what $(D target) references. ++ ++Note: Evaluating $(D pointsTo(x, x)) checks whether $(D x) has + internal pointers. This should only be done as an assertive test, + as the language is free to assume objects don't have internal pointers + (TDPL 7.1.3.5). + */ +-bool pointsTo(S, T, Tdummy=void)(auto ref const S source, auto ref const T target) @trusted pure nothrow +- if ((__traits(isRef, source) || isDynamicArray!S) && // lvalue or slice rvalue +- (__traits(isRef, target) || isDynamicArray!T)) // lvalue or slice rvalue ++bool pointsTo(S, T, Tdummy=void)(auto ref const S source, ref const T target) @trusted pure nothrow ++ if (__traits(isRef, source) || isDynamicArray!S || ++ isPointer!S || is(S == class)) + { +- static if (is(S P : U*, U)) ++ static if (isPointer!S || is(S == class)) + { + const m = cast(void*) source, + b = cast(void*) &target, e = b + target.sizeof; + return b <= m && m < e; + } +- else static if (is(S == struct)) ++ else static if (is(S == struct) || is(S == union)) + { + foreach (i, Subobj; typeof(source.tupleof)) + if (pointsTo(source.tupleof[i], target)) return true; +@@ -894,10 +866,101 @@ bool pointsTo(S, T, Tdummy=void)(auto re + } + } + // for shared objects +-bool pointsTo(S, T)(ref const shared S source, ref const shared T target) @trusted pure nothrow ++bool pointsTo(S, T)(auto ref const shared S source, ref const shared T target) @trusted pure nothrow + { + return pointsTo!(shared S, shared T, void)(source, target); + } ++ ++/// Pointers ++unittest ++{ ++ int i = 0; ++ int* p = null; ++ assert(!p.pointsTo(i)); ++ p = &i; ++ assert( p.pointsTo(i)); ++} ++ ++/// Structs and Unions ++unittest ++{ ++ struct S ++ { ++ int v; ++ int* p; ++ } ++ int i; ++ auto s = S(0, &i); ++ ++ //structs and unions "own" their members ++ //pointsTo will answer true if one of the members pointsTo. ++ assert(!s.pointsTo(s.v)); //s.v is just v member of s, so not pointed. ++ assert( s.p.pointsTo(i)); //i is pointed by s.p. ++ assert( s .pointsTo(i)); //which means i is pointed by s itself. ++ ++ //Unions will behave exactly the same. Points to will check each "member" ++ //individually, even if they share the same memory ++} ++ ++/// Arrays (dynamic and static) ++unittest ++{ ++ int i; ++ int[] slice = [0, 1, 2, 3, 4]; ++ int[5] arr = [0, 1, 2, 3, 4]; ++ int*[] slicep = [&i]; ++ int*[1] arrp = [&i]; ++ ++ //A slice points to all of its members: ++ assert( slice.pointsTo(slice[3])); ++ assert(!slice[0 .. 2].pointsTo(slice[3])); //Object 3 is outside of the slice [0 .. 2] ++ ++ //Note that a slice will not take into account what its members point to. ++ assert( slicep[0].pointsTo(i)); ++ assert(!slicep .pointsTo(i)); ++ ++ //static arrays are objects that own their members, just like structs: ++ assert(!arr.pointsTo(arr[0])); //arr[0] is just a member of arr, so not pointed. ++ assert( arrp[0].pointsTo(i)); //i is pointed by arrp[0]. ++ assert( arrp .pointsTo(i)); //which means i is pointed by arrp itslef. ++ ++ //Notice the difference between static and dynamic arrays: ++ assert(!arr .pointsTo(arr[0])); ++ assert( arr[].pointsTo(arr[0])); ++ assert( arrp .pointsTo(i)); ++ assert(!arrp[].pointsTo(i)); ++} ++ ++/// Classes ++unittest ++{ ++ class C ++ { ++ this(int* p){this.p = p;} ++ int* p; ++ } ++ int i; ++ C a = new C(&i); ++ C b = a; ++ //Classes are a bit particular, as they are treated like simple pointers ++ //to a class payload. ++ assert( a.p.pointsTo(i)); //a.p points to i. ++ assert(!a .pointsTo(i)); //Yet a itself does not point i. ++ ++ //To check the class payload itself, iterate on its members: ++ () ++ { ++ foreach (index, _; FieldTypeTuple!C) ++ if (pointsTo(a.tupleof[index], i)) ++ return; ++ assert(0); ++ }(); ++ ++ //To check if a class points a specific payload, a direct memmory check can be done: ++ auto aLoc = cast(ubyte[__traits(classInstanceSize, C)]*) a; ++ assert(b.pointsTo(*aLoc)); //b points to where a is pointing ++} ++ + unittest + { + struct S1 { int a; S1 * b; } +@@ -939,7 +1002,6 @@ unittest + + //dynamic arrays don't point to each other, or slices of themselves + assert(!pointsTo(darr, darr)); +- assert(!pointsTo(darr, darr[0 .. 1])); + assert(!pointsTo(darr[0 .. 1], darr)); + + //But they do point their elements +@@ -997,6 +1059,70 @@ unittest + assert(!pointsTo(ss, ss)); //The array doesn't point itself. + } + ++ ++unittest //Unions ++{ ++ int i; ++ union U //Named union ++ { ++ size_t asInt = 0; ++ int* asPointer; ++ } ++ struct S ++ { ++ union //Anonymous union ++ { ++ size_t asInt = 0; ++ int* asPointer; ++ } ++ } ++ ++ U u; ++ S s; ++ assert(!pointsTo(u, i)); ++ assert(!pointsTo(s, i)); ++ ++ u.asPointer = &i; ++ s.asPointer = &i; ++ assert( pointsTo(u, i)); ++ assert( pointsTo(s, i)); ++ ++ u.asInt = cast(size_t)&i; ++ s.asInt = cast(size_t)&i; ++ assert( pointsTo(u, i)); //logical false positive ++ assert( pointsTo(s, i)); //logical false positive ++} ++ ++unittest //Classes ++{ ++ int i; ++ static class A ++ { ++ int* p; ++ } ++ A a = new A, b = a; ++ assert(!pointsTo(a, b)); //a does not point to b ++ a.p = &i; ++ assert(!pointsTo(a, i)); //a does not point to i ++} ++unittest //alias this test ++{ ++ static int i; ++ static int j; ++ struct S ++ { ++ int* p; ++ @property int* foo(){return &i;} ++ alias foo this; ++ } ++ assert(is(S : int*)); ++ S s = S(&j); ++ assert(!pointsTo(s, i)); ++ assert( pointsTo(s, j)); ++ assert( pointsTo(cast(int*)s, i)); ++ assert(!pointsTo(cast(int*)s, j)); ++} ++ + /********************* + * Thrown if errors that set $(D errno) occur. + */ +@@ -1019,184 +1145,181 @@ class ErrnoException : Exception + } + } + +-// structuralCast +-// class-to-class structural cast +-Target structuralCast(Target, Source)(Source obj) +- if (is(Source == class) || is(Target == class)) +-{ +- // For the structural cast to work, the source and the target must +- // have the same base class, and the target must add no data or +- // methods +- static assert(0, "Not implemented"); +-} +- +-// interface-to-interface structural cast +-Target structuralCast(Target, Source)(Source obj) +- if (is(Source == interface) || is(Target == interface)) ++/++ ++ ML-style functional exception handling. Runs the supplied expression and ++ returns its result. If the expression throws a $(D Throwable), runs the ++ supplied error handler instead and return its result. The error handler's ++ type must be the same as the expression's type. ++ ++ Params: ++ E = The type of $(D Throwable)s to catch. Defaults to ${D Exception} ++ T1 = The type of the expression. ++ T2 = The return type of the error handler. ++ expression = The expression to run and return its result. ++ errorHandler = The handler to run if the expression throwed. ++ ++ Examples: ++ -------------------- ++ //Revert to a default value upon an error: ++ assert("x".to!int().ifThrown(0) == 0); ++ -------------------- ++ ++ You can also chain multiple calls to ifThrown, each capturing errors from the ++ entire preceding expression. ++ ++ Example: ++ -------------------- ++ //Chaining multiple calls to ifThrown to attempt multiple things in a row: ++ string s="true"; ++ assert(s.to!int(). ++ ifThrown(cast(int)s.to!double()). ++ ifThrown(cast(int)s.to!bool()) ++ == 1); ++ ++ //Respond differently to different types of errors ++ assert(enforce("x".to!int() < 1).to!string() ++ .ifThrown!ConvException("not a number") ++ .ifThrown!Exception("number too small") ++ == "not a number"); ++ -------------------- ++ ++ The expression and the errorHandler must have a common type they can both ++ be implicitly casted to, and that type will be the type of the compound ++ expression. ++ ++ Examples: ++ -------------------- ++ //null and new Object have a common type(Object). ++ static assert(is(typeof(null.ifThrown(new Object())) == Object)); ++ static assert(is(typeof((new Object()).ifThrown(null)) == Object)); ++ ++ //1 and new Object do not have a common type. ++ static assert(!__traits(compiles, 1.ifThrown(new Object()))); ++ static assert(!__traits(compiles, (new Object()).ifThrown(1))); ++ -------------------- ++ ++ If you need to use the actual thrown expection, you can use a delegate. ++ Example: ++ -------------------- ++ //Use a lambda to get the thrown object. ++ assert("%s".format().ifThrown!Exception(e => e.classinfo.name) == "std.format.FormatException"); ++ -------------------- ++ +/ ++//lazy version ++CommonType!(T1, T2) ifThrown(E : Throwable = Exception, T1, T2)(lazy scope T1 expression, lazy scope T2 errorHandler) + { ++ static assert(!is(typeof(return) == void), ++ "The error handler's return value("~T2.stringof~") does not have a common type with the expression("~T1.stringof~")."); ++ try ++ { ++ return expression(); ++ } ++ catch(E) ++ { ++ return errorHandler(); ++ } + } + +-unittest ++///ditto ++//delegate version ++CommonType!(T1, T2) ifThrown(E : Throwable, T1, T2)(lazy scope T1 expression, scope T2 delegate(E) errorHandler) + { +- interface I1 { void f1(); } +- interface I2 { void f2(); } +- interface I12 : I1, I2 { } +- //pragma(msg, TransitiveBaseTypeTuple!I12.stringof); +- //static assert(is(TransitiveBaseTypeTuple!I12 == TypeTuple!(I2, I1))); +-} +- +-// Target structuralCast(Target, Source)(Source obj) +-// if (is(Source == interface) || is(Target == interface)) +-// { +-// static assert(is(BaseTypeTuple!(Source)[0] == +-// BaseTypeTuple!(Target)[0])); +-// alias BaseTypeTuple!(Source)[1 .. $] SBases; +-// alias BaseTypeTuple!(Target)[1 .. $] TBases; +-// else +-// { +-// // interface-to-class +-// static assert(0); +-// } +-// } +-// else +-// { +-// static if (is(Source == class)) +-// { +-// // class-to-interface structural cast +-// alias BaseTypeTuple!(Source)[1 .. $] SBases; +-// alias BaseTypeTuple!(Target) TBases; +-// } +-// else +-// { +-// // interface-to-interface structural cast +-// alias BaseTypeTuple!(Source) SBases; +-// alias BaseTypeTuple!(Target) TBases; +-// } +-// } +-// static assert(SBases.length >= TBases.length, +-// "Cannot structurally cast to a target with" +-// " more interfaces implemented"); +-// static assert( +-// is(typeof(Target.tupleof) == typeof(Source.tupleof)), +-// "Cannot structurally cast to a target with more fields"); +-// // Target bases must be a prefix of the source bases +-// foreach (i, B; TBases) +-// { +-// static assert(is(SBases[i] == B) +-// || is(SBases[i] == interface) && is(SBases[i] : B), +-// SBases[i].stringof ~ " does not inherit " +-// ~ B.stringof); +-// } +-// union Result +-// { +-// Source src; +-// Target tgt; +-// } +-// Result result = { obj }; +-// return result.tgt; +-// } +- +-template structurallyCompatible(S, T) if (!isArray!S || !isArray!T) +-{ +- enum structurallyCompatible = +- FieldTypeTuple!S.length >= FieldTypeTuple!T.length +- && is(FieldTypeTuple!S[0 .. FieldTypeTuple!T.length] +- == FieldTypeTuple!T); +-} +- +-template structurallyCompatible(S, T) if (isArray!S && isArray!T) +-{ +- enum structurallyCompatible = +- .structurallyCompatible!(ElementType!S, ElementType!T) && +- .structurallyCompatible!(ElementType!T, ElementType!S); +-} +- +-unittest +-{ +- // struct X { uint a; } +- // static assert(structurallyCompatible!(uint[], X[])); +- // struct Y { uint a, b; } +- // static assert(!structurallyCompatible!(uint[], Y[])); +- // static assert(!structurallyCompatible!(Y[], uint[])); +- // static assert(!structurallyCompatible!(Y[], X[])); +-} +- +-/* +-Structural cast. Allows casting among class types that logically have +-a common base, but that base is not made explicit. +- +-Example: +----- +-interface Document { ... } +-interface Storable { ... } +-interface StorableDocument : Storable, Document { ... } +-class Doc : Storable, Document { ... } +-void process(StorableDocument d); +-... +- +-auto c = new Doc; +-process(c); // does not work +-process(structuralCast!StorableDocument(c)); // works +- */ ++ static assert(!is(typeof(return) == void), ++ "The error handler's return value("~T2.stringof~") does not have a common type with the expression("~T1.stringof~")."); ++ try ++ { ++ return expression(); ++ } ++ catch(E e) ++ { ++ return errorHandler(e); ++ } ++} + +-// template structuralCast(Target) +-// { +-// Target structuralCast(Source)(Source obj) +-// { +-// static if (is(Source : Object) || is(Source == interface)) +-// { +-// return .structuralCastImpl!(Target)(obj); +-// } +-// else +-// { +-// static if (structurallyCompatible!(Source, Target)) +-// return *(cast(Target*) &obj); +-// else +-// static assert(false); +-// } +-// } +-// } ++///ditto ++//delegate version, general overload to catch any Exception ++CommonType!(T1, T2) ifThrown(T1, T2)(lazy scope T1 expression, scope T2 delegate(Exception) errorHandler) ++{ ++ static assert(!is(typeof(return) == void), ++ "The error handler's return value("~T2.stringof~") does not have a common type with the expression("~T1.stringof~")."); ++ try ++ { ++ return expression(); ++ } ++ catch(Exception e) ++ { ++ return errorHandler(e); ++ } ++} + ++//Verify Examples + unittest + { +- // interface I1 {} +- // interface I2 {} +- // class Base : I1 { int x; } +- // class A : I1 {} +- // class B : I1, I2 {} +- +- // auto b = new B; +- // auto a = structuralCast!(A)(b); +- // assert(a); +- +- // struct X { int a; } +- // int[] arr = [ 1 ]; +- // auto x = structuralCast!(X[])(arr); +- // assert(x[0].a == 1); ++ //Revert to a default value upon an error: ++ assert("x".to!int().ifThrown(0) == 0); ++ ++ //Chaining multiple calls to ifThrown to attempt multiple things in a row: ++ string s="true"; ++ assert(s.to!int(). ++ ifThrown(cast(int)s.to!double()). ++ ifThrown(cast(int)s.to!bool()) ++ == 1); ++ ++ //Respond differently to different types of errors ++ assert(enforce("x".to!int() < 1).to!string() ++ .ifThrown!ConvException("not a number") ++ .ifThrown!Exception("number too small") ++ == "not a number"); ++ ++ //null and new Object have a common type(Object). ++ static assert(is(typeof(null.ifThrown(new Object())) == Object)); ++ static assert(is(typeof((new Object()).ifThrown(null)) == Object)); ++ ++ //1 and new Object do not have a common type. ++ static assert(!__traits(compiles, 1.ifThrown(new Object()))); ++ static assert(!__traits(compiles, (new Object()).ifThrown(1))); ++ ++ //Use a lambda to get the thrown object. ++ assert("%s".format().ifThrown(e => e.classinfo.name) == "std.format.FormatException"); + } + + unittest + { +- // interface Document { int fun(); } +- // interface Storable { int gun(); } +- // interface StorableDocument : Storable, Document { } +- // class Doc : Storable, Document { +- // int fun() { return 42; } +- // int gun() { return 43; } +- // } +- // void process(StorableDocument d) { +- // assert(d.fun + d.gun == 85, text(d.fun + d.gun)); +- // } +- +- // auto c = new Doc; +- // Document d = c; +- // //process(c); // does not work +- // union A +- // { +- // Storable s; +- // StorableDocument sd; +- // } +- // A a = { c }; +- //process(a.sd); // works +- //process(structuralCast!StorableDocument(d)); // works ++ //Basic behaviour - all versions. ++ assert("1".to!int().ifThrown(0) == 1); ++ assert("x".to!int().ifThrown(0) == 0); ++ assert("1".to!int().ifThrown!ConvException(0) == 1); ++ assert("x".to!int().ifThrown!ConvException(0) == 0); ++ assert("1".to!int().ifThrown(e=>0) == 1); ++ assert("x".to!int().ifThrown(e=>0) == 0); ++ static if (__traits(compiles, 0.ifThrown!Exception(e => 0))) //This will only work with a fix that was not yet pulled ++ { ++ assert("1".to!int().ifThrown!ConvException(e=>0) == 1); ++ assert("x".to!int().ifThrown!ConvException(e=>0) == 0); ++ } ++ ++ //Exceptions other than stated not caught. ++ assert("x".to!int().ifThrown!StringException(0).collectException!ConvException() !is null); ++ static if (__traits(compiles, 0.ifThrown!Exception(e => 0))) //This will only work with a fix that was not yet pulled ++ { ++ assert("x".to!int().ifThrown!StringException(e=>0).collectException!ConvException() !is null); ++ } ++ ++ //Default does not include errors. ++ int throwRangeError() { throw new RangeError; } ++ assert(throwRangeError().ifThrown(0).collectException!RangeError() !is null); ++ assert(throwRangeError().ifThrown(e=>0).collectException!RangeError() !is null); ++ ++ //Incompatible types are not accepted. ++ static assert(!__traits(compiles, 1.ifThrown(new Object()))); ++ static assert(!__traits(compiles, (new Object()).ifThrown(1))); ++ static assert(!__traits(compiles, 1.ifThrown(e=>new Object()))); ++ static assert(!__traits(compiles, (new Object()).ifThrown(e=>1))); ++} ++ ++version(unittest) package ++@property void assertCTFEable(alias dg)() ++{ ++ static assert({ dg(); return true; }()); ++ dg(); + } +--- a/src/libphobos/src/std/file.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/file.d 2014-04-01 16:32:51.000000000 +0100 +@@ -4,7 +4,7 @@ + Utilities for manipulating files and scanning directories. Functions + in this module handle files as a unit, e.g., read or write one _file + at a time. For opening files and manipulating them via handles refer +-to module $(D $(LINK2 std_stdio.html,std.stdio)). ++to module $(LINK2 std_stdio.html,$(D std.stdio)). + + Macros: + WIKI = Phobos/StdFile +@@ -42,18 +42,17 @@ version (unittest) + { + import core.thread; + +- private @property string deleteme() ++ private @property string deleteme() @safe + { + static _deleteme = "deleteme.dmd.unittest.pid"; + static _first = true; + + if(_first) + { +- _deleteme = buildPath(tempDir(), _deleteme) ~ to!string(getpid()); ++ _deleteme = buildPath(tempDir(), _deleteme) ~ to!string(thisProcessID); + _first = false; + } + +- + return _deleteme; + } + } +@@ -68,6 +67,11 @@ version (Windows) + // Required by tempPath(): + private extern(Windows) DWORD GetTempPathW(DWORD nBufferLength, + LPWSTR lpBuffer); ++ // Required by rename(): ++ enum MOVEFILE_REPLACE_EXISTING = 1; ++ private extern(Windows) DWORD MoveFileExW(LPCWSTR lpExistingFileName, ++ LPCWSTR lpNewFileName, ++ DWORD dwFlags); + } + else version (Posix) + { +@@ -95,7 +99,7 @@ class FileException : Exception + file = The file where the error occurred. + line = The line where the error occurred. + +/ +- this(in char[] name, in char[] msg, string file = __FILE__, size_t line = __LINE__) ++ this(in char[] name, in char[] msg, string file = __FILE__, size_t line = __LINE__) @safe pure + { + if(msg.empty) + super(name.idup, file, line); +@@ -110,15 +114,17 @@ class FileException : Exception + in Windows, $(D_PARAM errno) in Posix). + + Params: +- name = Name of file for which the error occurred. +- msg = Message describing the error. +- file = The file where the error occurred. +- line = The line where the error occurred. ++ name = Name of file for which the error occurred. ++ errno = The error number. ++ file = The file where the error occurred. ++ Defaults to $(D __FILE__). ++ line = The line where the error occurred. ++ Defaults to $(D __LINE__). + +/ + version(Windows) this(in char[] name, + uint errno = .GetLastError(), + string file = __FILE__, +- size_t line = __LINE__) ++ size_t line = __LINE__) @safe + { + this(name, sysErrorString(errno), file, line); + this.errno = errno; +@@ -126,7 +132,7 @@ class FileException : Exception + else version(Posix) this(in char[] name, + uint errno = .errno, + string file = __FILE__, +- size_t line = __LINE__) ++ size_t line = __LINE__) @trusted + { + auto s = strerror(errno); + this(name, to!string(s), file, line); +@@ -391,13 +397,14 @@ version(Posix) private void writeImpl(in + + /*************************************************** + * Rename file $(D from) to $(D to). ++ * If the target file exists, it is overwritten. + * Throws: $(D FileException) on error. + */ + void rename(in char[] from, in char[] to) + { + version(Windows) + { +- enforce(MoveFileW(std.utf.toUTF16z(from), std.utf.toUTF16z(to)), ++ enforce(MoveFileExW(std.utf.toUTF16z(from), std.utf.toUTF16z(to), MOVEFILE_REPLACE_EXISTING), + new FileException( + text("Attempting to rename file ", from, " to ", + to))); +@@ -406,6 +413,19 @@ void rename(in char[] from, in char[] to + cenforce(core.stdc.stdio.rename(toStringz(from), toStringz(to)) == 0, to); + } + ++unittest ++{ ++ auto t1 = deleteme, t2 = deleteme~"2"; ++ scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove(); ++ write(t1, "1"); ++ rename(t1, t2); ++ assert(readText(t2) == "1"); ++ write(t1, "2"); ++ rename(t1, t2); ++ assert(readText(t2) == "2"); ++} ++ ++ + /*************************************************** + Delete file $(D name). + Throws: $(D FileException) on error. +@@ -469,26 +489,26 @@ unittest + + + /++ +- Get the access and modified times of file $(D name). ++ Get the access and modified times of file or folder $(D name). + + Params: +- name = File name to get times for. +- fileAccessTime = Time the file was last accessed. +- fileModificationTime = Time the file was last modified. ++ name = File/Folder name to get times for. ++ accessTime = Time the file/folder was last accessed. ++ modificationTime = Time the file/folder was last modified. + + Throws: + $(D FileException) on error. + +/ + void getTimes(in char[] name, +- out SysTime fileAccessTime, +- out SysTime fileModificationTime) ++ out SysTime accessTime, ++ out SysTime modificationTime) + { + version(Windows) + { + with (getFileAttributesWin(name)) + { +- fileAccessTime = std.datetime.FILETIMEToSysTime(&ftLastAccessTime); +- fileModificationTime = std.datetime.FILETIMEToSysTime(&ftLastWriteTime); ++ accessTime = std.datetime.FILETIMEToSysTime(&ftLastAccessTime); ++ modificationTime = std.datetime.FILETIMEToSysTime(&ftLastWriteTime); + } + } + else version(Posix) +@@ -497,8 +517,8 @@ void getTimes(in char[] name, + + cenforce(stat(toStringz(name), &statbuf) == 0, name); + +- fileAccessTime = SysTime(unixTimeToStdTime(statbuf.st_atime)); +- fileModificationTime = SysTime(unixTimeToStdTime(statbuf.st_mtime)); ++ accessTime = SysTime(unixTimeToStdTime(statbuf.st_atime)); ++ modificationTime = SysTime(unixTimeToStdTime(statbuf.st_mtime)); + } + } + +@@ -653,6 +673,78 @@ version(Windows) unittest + + + /++ ++ Set access/modified times of file or folder $(D name). ++ ++ Params: ++ name = File/Folder name to get times for. ++ accessTime = Time the file/folder was last accessed. ++ modificationTime = Time the file/folder was last modified. ++ ++ Throws: ++ $(D FileException) on error. ++ +/ ++void setTimes(in char[] name, ++ SysTime accessTime, ++ SysTime modificationTime) ++{ ++ version(Windows) ++ { ++ const ta = SysTimeToFILETIME(accessTime); ++ const tm = SysTimeToFILETIME(modificationTime); ++ alias TypeTuple!(GENERIC_WRITE, ++ 0, ++ null, ++ OPEN_EXISTING, ++ FILE_ATTRIBUTE_NORMAL | ++ FILE_ATTRIBUTE_DIRECTORY | ++ FILE_FLAG_BACKUP_SEMANTICS, ++ HANDLE.init) ++ defaults; ++ auto h = CreateFileW(std.utf.toUTF16z(name), defaults); ++ ++ cenforce(h != INVALID_HANDLE_VALUE, name); ++ ++ scope(exit) ++ cenforce(CloseHandle(h), name); ++ ++ cenforce(SetFileTime(h, null, &ta, &tm), name); ++ } ++ else version(Posix) ++ { ++ timeval[2] t = void; ++ ++ t[0] = accessTime.toTimeVal(); ++ t[1] = modificationTime.toTimeVal(); ++ ++ cenforce(utimes(toStringz(name), t) == 0, name); ++ } ++} ++ ++unittest ++{ ++ string dir = deleteme ~ r".dir/a/b/c"; ++ string file = dir ~ "/file"; ++ ++ if (!exists(dir)) mkdirRecurse(dir); ++ { auto f = File(file, "w"); } ++ ++ foreach (path; [file, dir]) // test file and dir ++ { ++ SysTime atime = SysTime(DateTime(2010, 10, 4, 0, 0, 30)); ++ SysTime mtime = SysTime(DateTime(2011, 10, 4, 0, 0, 30)); ++ setTimes(path, atime, mtime); ++ ++ SysTime atime_res; ++ SysTime mtime_res; ++ getTimes(path, atime_res, mtime_res); ++ assert(atime == atime_res); ++ assert(mtime == mtime_res); ++ } ++ ++ rmdirRecurse(dir); ++} ++ ++/++ + Returns the time that the given file was last modified. + + Throws: +@@ -757,7 +849,7 @@ unittest + /++ + Returns whether the given file (or directory) exists. + +/ +-@property bool exists(in char[] name) ++bool exists(in char[] name) @trusted + { + version(Windows) + { +@@ -819,6 +911,8 @@ unittest + + Params: + name = The file to get the attributes of. ++ ++ Throws: $(D FileException) on error. + +/ + uint getAttributes(in char[] name) + { +@@ -988,7 +1082,7 @@ unittest + possible for both $(D isFile) and $(D isDir) to be $(D false) for a + particular file (in which case, it's a special file). You can use + $(D getAttributes) to get the attributes to figure out what type of special +- it is, or you can use $(D dirEntry) to get at its $(D statBuf), which is the ++ it is, or you can use $(D DirEntry) to get at its $(D statBuf), which is the + result from $(D stat). In either case, see the man page for $(D stat) for + more information. + +@@ -1258,6 +1352,8 @@ void mkdir(in char[] pathname) + + /**************************************************** + * Make directory and all parent directories as needed. ++ * ++ * Throws: $(D FileException) on error. + */ + + void mkdirRecurse(in char[] pathname) +@@ -1433,7 +1529,7 @@ else version(Posix) string readLink(C)(c + dynamicBuffer.length = dynamicBuffer.length * 3 / 2; + } + +- throw new FileException(format("Path for %s is too long to read.", link)); ++ throw new FileException(to!string(link), "Path is too long to read."); + } + + version(Posix) unittest +@@ -1498,30 +1594,130 @@ unittest + assert(s.length); + } + ++version (OSX) ++ private extern (C) int _NSGetExecutablePath(char* buf, uint* bufsize); ++else version (FreeBSD) ++ private extern (C) int sysctl (const int* name, uint namelen, void* oldp, ++ size_t* oldlenp, const void* newp, size_t newlen); ++ ++/** ++ * Returns the full path of the current executable. ++ * ++ * Throws: ++ * $(XREF object, Exception) ++ */ ++@trusted string thisExePath () ++{ ++ version (OSX) ++ { ++ import core.sys.posix.stdlib : realpath; ++ ++ uint size; ++ ++ _NSGetExecutablePath(null, &size); // get the length of the path ++ auto buffer = new char[size]; ++ _NSGetExecutablePath(buffer.ptr, &size); ++ ++ auto absolutePath = realpath(buffer.ptr, null); // let the function allocate ++ ++ scope (exit) ++ { ++ if (absolutePath) ++ free(absolutePath); ++ } ++ ++ errnoEnforce(absolutePath); ++ return to!(string)(absolutePath); ++ } ++ else version (linux) ++ { ++ return readLink("/proc/self/exe"); ++ } ++ else version (Windows) ++ { ++ wchar[MAX_PATH] buf; ++ wchar[] buffer = buf[]; ++ ++ while (true) ++ { ++ auto len = GetModuleFileNameW(null, buffer.ptr, cast(DWORD) buffer.length); ++ enforce(len, sysErrorString(GetLastError())); ++ if (len != buffer.length) ++ return to!(string)(buffer[0 .. len]); ++ buffer.length *= 2; ++ } ++ } ++ else version (FreeBSD) ++ { ++ enum ++ { ++ CTL_KERN = 1, ++ KERN_PROC = 14, ++ KERN_PROC_PATHNAME = 12 ++ } ++ ++ int[4] mib = [CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1]; ++ size_t len; ++ ++ auto result = sysctl(mib.ptr, mib.length, null, &len, null, 0); // get the length of the path ++ errnoEnforce(result == 0); ++ ++ auto buffer = new char[len - 1]; ++ result = sysctl(mib.ptr, mib.length, buffer.ptr, &len, null, 0); ++ errnoEnforce(result == 0); ++ ++ return buffer.assumeUnique; ++ } ++ else ++ static assert(0, "thisExePath is not supported on this platform"); ++} ++ ++unittest ++{ ++ auto path = thisExePath(); ++ ++ assert(path.exists); ++ assert(path.isAbsolute); ++ assert(path.isFile); ++} + + version(StdDdoc) + { + /++ + Info on a file, similar to what you'd get from stat on a Posix system. +- +- A $(D DirEntry) is obtained by using the functions $(D dirEntry) (to get +- the $(D DirEntry) for a specific file) or $(D dirEntries) (to get a +- $(D DirEntry) for each file/directory in a particular directory). + +/ + struct DirEntry + { +- void _init(T...)(T); +- public: ++ /++ ++ Constructs a DirEntry for the given file (or directory). ++ ++ Params: ++ path = The file (or directory) to get a DirEntry for. ++ ++ Throws: ++ $(D FileException) if the file does not exist. ++ +/ ++ this(string path); ++ ++ version (Windows) ++ { ++ private this(string path, in WIN32_FIND_DATA* fd); ++ private this(string path, in WIN32_FIND_DATAW *fd); ++ } ++ else version (Posix) ++ { ++ private this(string path, core.sys.posix.dirent.dirent* fd); ++ } + + /++ + Returns the path to the file represented by this $(D DirEntry). + + Examples: + -------------------- +-auto de1 = dirEntry("/etc/fonts/fonts.conf"); ++auto de1 = DirEntry("/etc/fonts/fonts.conf"); + assert(de1.name == "/etc/fonts/fonts.conf"); + +-auto de2 = dirEntry("/usr/share/include"); ++auto de2 = DirEntry("/usr/share/include"); + assert(de2.name == "/usr/share/include"); + -------------------- + +/ +@@ -1534,10 +1730,10 @@ assert(de2.name == "/usr/share/include") + + Examples: + -------------------- +-auto de1 = dirEntry("/etc/fonts/fonts.conf"); ++auto de1 = DirEntry("/etc/fonts/fonts.conf"); + assert(!de1.isDir); + +-auto de2 = dirEntry("/usr/share/include"); ++auto de2 = DirEntry("/usr/share/include"); + assert(de2.isDir); + -------------------- + +/ +@@ -1560,10 +1756,10 @@ assert(de2.isDir); + + Examples: + -------------------- +-auto de1 = dirEntry("/etc/fonts/fonts.conf"); ++auto de1 = DirEntry("/etc/fonts/fonts.conf"); + assert(de1.isFile); + +-auto de2 = dirEntry("/usr/share/include"); ++auto de2 = DirEntry("/usr/share/include"); + assert(!de2.isFile); + -------------------- + +/ +@@ -1655,6 +1851,52 @@ else version(Windows) + public: + alias name this; + ++ this(string path) ++ { ++ if(!path.exists) ++ throw new FileException(path, "File does not exist"); ++ ++ _name = path; ++ ++ with (getFileAttributesWin(path)) ++ { ++ _size = makeUlong(nFileSizeLow, nFileSizeHigh); ++ _timeCreated = std.datetime.FILETIMEToSysTime(&ftCreationTime); ++ _timeLastAccessed = std.datetime.FILETIMEToSysTime(&ftLastAccessTime); ++ _timeLastModified = std.datetime.FILETIMEToSysTime(&ftLastWriteTime); ++ _attributes = dwFileAttributes; ++ } ++ } ++ ++ private this(string path, in WIN32_FIND_DATA* fd) ++ { ++ auto clength = to!int(core.stdc.string.strlen(fd.cFileName.ptr)); ++ ++ // Convert cFileName[] to unicode ++ const wlength = MultiByteToWideChar(0, 0, fd.cFileName.ptr, clength, null, 0); ++ auto wbuf = new wchar[wlength]; ++ const n = MultiByteToWideChar(0, 0, fd.cFileName.ptr, clength, wbuf.ptr, wlength); ++ assert(n == wlength); ++ // toUTF8() returns a new buffer ++ _name = buildPath(path, std.utf.toUTF8(wbuf[0 .. wlength])); ++ _size = (cast(ulong)fd.nFileSizeHigh << 32) | fd.nFileSizeLow; ++ _timeCreated = std.datetime.FILETIMEToSysTime(&fd.ftCreationTime); ++ _timeLastAccessed = std.datetime.FILETIMEToSysTime(&fd.ftLastAccessTime); ++ _timeLastModified = std.datetime.FILETIMEToSysTime(&fd.ftLastWriteTime); ++ _attributes = fd.dwFileAttributes; ++ } ++ private this(string path, in WIN32_FIND_DATAW *fd) ++ { ++ size_t clength = std.string.wcslen(fd.cFileName.ptr); ++ _name = std.utf.toUTF8(fd.cFileName[0 .. clength]); ++ _name = buildPath(path, std.utf.toUTF8(fd.cFileName[0 .. clength])); ++ _size = (cast(ulong)fd.nFileSizeHigh << 32) | fd.nFileSizeLow; ++ _timeCreated = std.datetime.FILETIMEToSysTime(&fd.ftCreationTime); ++ _timeLastAccessed = std.datetime.FILETIMEToSysTime(&fd.ftLastAccessTime); ++ _timeLastModified = std.datetime.FILETIMEToSysTime(&fd.ftLastWriteTime); ++ _attributes = fd.dwFileAttributes; ++ } ++ + @property string name() const pure nothrow + { + return _name; +@@ -1709,55 +1951,8 @@ else version(Windows) + } + + private: +- +- void _init(in char[] path) +- { +- _name = path.idup; +- +- with (getFileAttributesWin(path)) +- { +- _size = makeUlong(nFileSizeLow, nFileSizeHigh); +- _timeCreated = std.datetime.FILETIMEToSysTime(&ftCreationTime); +- _timeLastAccessed = std.datetime.FILETIMEToSysTime(&ftLastAccessTime); +- _timeLastModified = std.datetime.FILETIMEToSysTime(&ftLastWriteTime); +- _attributes = dwFileAttributes; +- } +- } +- +- void _init(in char[] path, in WIN32_FIND_DATA* fd) +- { +- auto clength = to!int(std.c.string.strlen(fd.cFileName.ptr)); +- +- // Convert cFileName[] to unicode +- const wlength = MultiByteToWideChar(0, 0, fd.cFileName.ptr, clength, null, 0); +- auto wbuf = new wchar[wlength]; +- const n = MultiByteToWideChar(0, 0, fd.cFileName.ptr, clength, wbuf.ptr, wlength); +- assert(n == wlength); +- // toUTF8() returns a new buffer +- _name = buildPath(path, std.utf.toUTF8(wbuf[0 .. wlength])); +- _size = (cast(ulong)fd.nFileSizeHigh << 32) | fd.nFileSizeLow; +- _timeCreated = std.datetime.FILETIMEToSysTime(&fd.ftCreationTime); +- _timeLastAccessed = std.datetime.FILETIMEToSysTime(&fd.ftLastAccessTime); +- _timeLastModified = std.datetime.FILETIMEToSysTime(&fd.ftLastWriteTime); +- _attributes = fd.dwFileAttributes; +- } +- +- void _init(in char[] path, in WIN32_FIND_DATAW *fd) +- { +- size_t clength = std.string.wcslen(fd.cFileName.ptr); +- _name = std.utf.toUTF8(fd.cFileName[0 .. clength]); +- _name = buildPath(path, std.utf.toUTF8(fd.cFileName[0 .. clength])); +- _size = (cast(ulong)fd.nFileSizeHigh << 32) | fd.nFileSizeLow; +- _timeCreated = std.datetime.FILETIMEToSysTime(&fd.ftCreationTime); +- _timeLastAccessed = std.datetime.FILETIMEToSysTime(&fd.ftLastAccessTime); +- _timeLastModified = std.datetime.FILETIMEToSysTime(&fd.ftLastWriteTime); +- _attributes = fd.dwFileAttributes; +- } +- +- + string _name; /// The file or directory represented by this DirEntry. + +- + SysTime _timeCreated; /// The time when the file was created. + SysTime _timeLastAccessed; /// The time when the file was last accessed. + SysTime _timeLastModified; /// The time when the file was last modified. +@@ -1773,6 +1968,43 @@ else version(Posix) + public: + alias name this; + ++ this(string path) ++ { ++ if(!path.exists) ++ throw new FileException(path, "File does not exist"); ++ ++ _name = path; ++ ++ _didLStat = false; ++ _didStat = false; ++ _dTypeSet = false; ++ } ++ ++ private this(string path, core.sys.posix.dirent.dirent* fd) ++ { ++ immutable len = core.stdc.string.strlen(fd.d_name.ptr); ++ _name = buildPath(path, fd.d_name[0 .. len]); ++ ++ _didLStat = false; ++ _didStat = false; ++ ++ //fd_d_type doesn't work for all file systems, ++ //in which case the result is DT_UNKOWN. But we ++ //can determine the correct type from lstat, so ++ //we'll only set the dtype here if we could ++ //correctly determine it (not lstat in the case ++ //of DT_UNKNOWN in case we don't ever actually ++ //need the dtype, thus potentially avoiding the ++ //cost of calling lstat). ++ if(fd.d_type != DT_UNKNOWN) ++ { ++ _dType = fd.d_type; ++ _dTypeSet = true; ++ } ++ else ++ _dTypeSet = false; ++ } ++ + @property string name() const pure nothrow + { + return _name; +@@ -1848,41 +2080,6 @@ else version(Posix) + } + + private: +- +- void _init(in char[] path) +- { +- _name = path.idup; +- +- _didLStat = false; +- _didStat = false; +- _dTypeSet = false; +- } +- +- void _init(in char[] path, core.sys.posix.dirent.dirent* fd) +- { +- immutable len = std.c.string.strlen(fd.d_name.ptr); +- _name = buildPath(path, fd.d_name[0 .. len]); +- +- _didLStat = false; +- _didStat = false; +- +- //fd_d_type doesn't work for all file systems, +- //in which case the result is DT_UNKOWN. But we +- //can determine the correct type from lstat, so +- //we'll only set the dtype here if we could +- //correctly determine it (not lstat in the case +- //of DT_UNKNOWN in case we don't ever actually +- //need the dtype, thus potentially avoiding the +- //cost of calling lstat). +- if(fd.d_type != DT_UNKNOWN) +- { +- _dType = fd.d_type; +- _dTypeSet = true; +- } +- else +- _dTypeSet = false; +- } +- + /++ + This is to support lazy evaluation, because doing stat's is + expensive and not always needed. +@@ -1918,7 +2115,6 @@ else version(Posix) + _didLStat = true; + } + +- + string _name; /// The file or directory represented by this DirEntry. + + stat_t _statBuf = void; /// The result of stat(). +@@ -1937,7 +2133,7 @@ unittest + { + if("C:\\Program Files\\".exists) + { +- auto de = dirEntry("C:\\Program Files\\"); ++ auto de = DirEntry("C:\\Program Files\\"); + assert(!de.isFile); + assert(de.isDir); + assert(!de.isSymlink); +@@ -1945,13 +2141,13 @@ unittest + + if("C:\\Users\\".exists && "C:\\Documents and Settings\\".exists) + { +- auto de = dirEntry("C:\\Documents and Settings\\"); ++ auto de = DirEntry("C:\\Documents and Settings\\"); + assert(de.isSymlink); + } + + if("C:\\Windows\\system.ini".exists) + { +- auto de = dirEntry("C:\\Windows\\system.ini"); ++ auto de = DirEntry("C:\\Windows\\system.ini"); + assert(de.isFile); + assert(!de.isDir); + assert(!de.isSymlink); +@@ -1962,7 +2158,7 @@ unittest + if("/usr/include".exists) + { + { +- auto de = dirEntry("/usr/include"); ++ auto de = DirEntry("/usr/include"); + assert(!de.isFile); + assert(de.isDir); + assert(!de.isSymlink); +@@ -1974,7 +2170,7 @@ unittest + core.sys.posix.unistd.symlink("/usr/include", symfile.ptr); + + { +- auto de = dirEntry(symfile); ++ auto de = DirEntry(symfile); + assert(!de.isFile); + assert(de.isDir); + assert(de.isSymlink); +@@ -1983,7 +2179,7 @@ unittest + + if("/usr/include/assert.h".exists) + { +- auto de = dirEntry("/usr/include/assert.h"); ++ auto de = DirEntry("/usr/include/assert.h"); + assert(de.isFile); + assert(!de.isDir); + assert(!de.isSymlink); +@@ -1993,6 +2189,9 @@ unittest + + /*************************************************** + Copy file $(D from) to file $(D to). File timestamps are preserved. ++If the target file exists, it is overwritten. ++ ++Throws: $(D FileException) on error. + */ + void copy(in char[] from, in char[] to) + { +@@ -2051,66 +2250,17 @@ void copy(in char[] from, in char[] to) + } + } + +- +-/++ +- Set access/modified times of file $(D name). +- +- Params: +- fileAccessTime = Time the file was last accessed. +- fileModificationTime = Time the file was last modified. +- +- Throws: +- $(D FileException) on error. +- +/ +-void setTimes(in char[] name, +- SysTime fileAccessTime, +- SysTime fileModificationTime) +-{ +- version(Windows) +- { +- const ta = SysTimeToFILETIME(fileAccessTime); +- const tm = SysTimeToFILETIME(fileModificationTime); +- alias TypeTuple!(GENERIC_WRITE, +- 0, +- null, +- OPEN_EXISTING, +- FILE_ATTRIBUTE_NORMAL, HANDLE.init) +- defaults; +- auto h = CreateFileW(std.utf.toUTF16z(name), defaults); +- +- cenforce(h != INVALID_HANDLE_VALUE, name); +- +- scope(exit) +- cenforce(CloseHandle(h), name); +- +- cenforce(SetFileTime(h, null, &ta, &tm), name); +- } +- else version(Posix) +- { +- timeval[2] t = void; +- +- t[0] = fileAccessTime.toTimeVal(); +- t[1] = fileModificationTime.toTimeVal(); +- +- enforce(utimes(toStringz(name), t) == 0); +- } +-} +- +-/+ + unittest + { +- write(deleteme, "a\n"); +- scope(exit) { assert(exists(deleteme)); remove(deleteme); } +- SysTime ftc1, fta1, ftm1; +- getTimes(deleteme, ftc1, fta1, ftm1); +- enforce(collectException(setTimes("nonexistent", fta1, ftm1))); +- setTimes(deleteme, fta1 + dur!"seconds"(50), ftm1 + dur!"seconds"(50)); +- SysTime ftc2, fta2, ftm2; +- getTimes(deleteme, ftc2, fta2, ftm2); +- assert(fta1 + dur!"seconds(50) == fta2, text(fta1 + dur!"seconds(50), "!=", fta2)); +- assert(ftm1 + dur!"seconds(50) == ftm2); ++ auto t1 = deleteme, t2 = deleteme~"2"; ++ scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove(); ++ write(t1, "1"); ++ copy(t1, t2); ++ assert(readText(t2) == "1"); ++ write(t1, "2"); ++ copy(t1, t2); ++ assert(readText(t2) == "2"); + } +-+/ + + + /++ +@@ -2123,12 +2273,11 @@ unittest + +/ + void rmdirRecurse(in char[] pathname) + { +- DirEntry de = dirEntry(pathname); +- +- rmdirRecurse(de); ++ //No references to pathname will be kept after rmdirRecurse, ++ //so the cast is safe ++ rmdirRecurse(DirEntry(cast(string)pathname)); + } + +- + /++ + Remove directory and all of its content and subdirectories, + recursively. +@@ -2140,7 +2289,7 @@ void rmdirRecurse(in char[] pathname) + void rmdirRecurse(ref DirEntry de) + { + if(!de.isDir) +- throw new FileException(text("File ", de.name, " is not a directory")); ++ throw new FileException(de.name, "Not a directory"); + + if(de.isSymlink) + remove(de.name); +@@ -2156,6 +2305,16 @@ void rmdirRecurse(ref DirEntry de) + rmdir(de.name); + } + } ++///ditto ++//Note, without this overload, passing an RValue DirEntry still works, but ++//actually fully reconstructs a DirEntry inside the ++//"rmdirRecurse(in char[] pathname)" implementation. That is needlessly ++//expensive. ++//A DirEntry is a bit big (72B), so keeping the "by ref" signature is desirable. ++void rmdirRecurse(DirEntry de) ++{ ++ rmdirRecurse(de); ++} + + version(Windows) unittest + { +@@ -2289,7 +2448,7 @@ private struct DirIteratorImpl + popDirStack(); + return false; + } +- _cur._init(_stack.data[$-1].dirpath, findinfo); ++ _cur = DirEntry(_stack.data[$-1].dirpath, findinfo); + return true; + } + +@@ -2310,7 +2469,7 @@ private struct DirIteratorImpl + popDirStack(); + return false; + } +- _cur._init(_stack.data[$-1].dirpath, findinfo); ++ _cur = DirEntry(_stack.data[$-1].dirpath, findinfo); + return true; + } + +@@ -2329,15 +2488,7 @@ private struct DirIteratorImpl + + bool mayStepIn() + { +- try +- { +- return _followSymlink ? _cur.isDir : _cur.isDir && !_cur.isSymlink; +- } +- catch (Exception) +- { +- // Entry may have disappeared +- } +- return false; ++ return _followSymlink ? _cur.isDir : _cur.isDir && !_cur.isSymlink; + } + } + else version(Posix) +@@ -2365,7 +2516,7 @@ private struct DirIteratorImpl + if(core.stdc.string.strcmp(fdata.d_name.ptr, ".") && + core.stdc.string.strcmp(fdata.d_name.ptr, "..") ) + { +- _cur._init(_stack.data[$-1].dirpath, fdata); ++ _cur = DirEntry(_stack.data[$-1].dirpath, fdata); + return true; + } + } +@@ -2540,8 +2691,8 @@ unittest + auto len = enforce(walkLength(dirEntries(absolutePath(relpath), mode))); + assert(walkLength(dirEntries(relpath, mode)) == len); + assert(equal( +- map!(q{std.path.absolutePath(a.name)})(dirEntries(relpath, mode)), +- map!(q{a.name})(dirEntries(absolutePath(relpath), mode)))); ++ map!(a => std.path.absolutePath(a.name))(dirEntries(relpath, mode)), ++ map!(a => a.name)(dirEntries(absolutePath(relpath), mode)))); + return len; + } + +@@ -2575,6 +2726,10 @@ unittest + } + //issue 7138 + auto a = array(dirEntries(".", SpanMode.shallow)); ++ ++ // issue 11392 ++ auto dFiles = dirEntries(".", SpanMode.shallow); ++ foreach(d; dFiles){} + } + + /++ +@@ -2612,6 +2767,9 @@ auto dirEntries(string path, string patt + } + + /++ ++ $(RED Deprecated. It will be removed in July 2014. ++ Please use $(LREF DirEntry) constructor directly instead.) ++ + Returns a DirEntry for the given file (or directory). + + Params: +@@ -2620,16 +2778,10 @@ auto dirEntries(string path, string patt + Throws: + $(D FileException) if the file does not exist. + +/ ++deprecated("Please use DirEntry constructor directly instead.") + DirEntry dirEntry(in char[] name) + { +- if(!name.exists) +- throw new FileException(text("File ", name, " does not exist")); +- +- DirEntry dirEntry; +- +- dirEntry._init(name); +- +- return dirEntry; ++ return DirEntry(name.idup); + } + + //Test dirEntry with a directory. +@@ -2869,7 +3021,7 @@ unittest + Returns the path to a directory for temporary files. + + On Windows, this function returns the result of calling the Windows API function +-$(D $(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/aa364992.aspx, GetTempPath)). ++$(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/aa364992.aspx, $(D GetTempPath)). + + On POSIX platforms, it searches through the following list of directories + and returns the first one which is found to exist: +@@ -2892,9 +3044,9 @@ environment variables and directory stru + meantime. + + The POSIX $(D tempDir) algorithm is inspired by Python's +-$(D $(LINK2 http://docs.python.org/library/tempfile.html#tempfile.tempdir, tempfile.tempdir)). ++$(LINK2 http://docs.python.org/library/tempfile.html#tempfile.tempdir, $(D tempfile.tempdir)). + */ +-string tempDir() ++string tempDir() @trusted + { + static string cache; + if (cache is null) +--- a/src/libphobos/src/std/format.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/format.d 2014-04-01 16:32:51.000000000 +0100 +@@ -27,11 +27,12 @@ module std.format; + import core.stdc.stdio, core.stdc.stdlib, core.stdc.string, core.vararg; + import std.algorithm, std.array, std.ascii, std.bitmanip, std.conv, + std.exception, std.functional, std.math, std.range, +- std.string, std.system, std.traits, std.typecons, std.typetuple, ++ std.system, std.traits, std.typecons, std.typetuple, + std.utf; + version(unittest) { + import std.stdio; + import core.exception; ++ import std.string; + } + + version (Win32) version (DigitalMars) +@@ -55,24 +56,26 @@ version (DigitalMarsC) + */ + class FormatException : Exception + { ++ @safe pure nothrow + this() + { + super("format error"); + } + ++ @safe pure nothrow + this(string msg, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null) + { + super(msg, fn, ln, next); + } + } + +-/++ +- $(RED Deprecated. It will be removed In January 2013. +- Please use $(D FormatException) instead.) +- +/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use FormatException instead.") + alias FormatException FormatError; + ++private alias enforceFmt = enforceEx!FormatException; ++ ++ + /********************************************************************** + Interprets variadic argument list $(D args), formats them according + to $(D fmt), and sends the resulting characters to $(D w). The +@@ -156,7 +159,7 @@ $(I Integer): + $(I Digit): + $(B '0')|$(B '1')|$(B '2')|$(B '3')|$(B '4')|$(B '5')|$(B '6')|$(B '7')|$(B '8')|$(B '9') + $(I FormatChar): +- $(B 's')|$(B 'b')|$(B 'd')|$(B 'o')|$(B 'x')|$(B 'X')|$(B 'e')|$(B 'E')|$(B 'f')|$(B 'F')|$(B 'g')|$(B 'G')|$(B 'a')|$(B 'A') ++ $(B 's')|$(B 'c')|$(B 'b')|$(B 'd')|$(B 'o')|$(B 'x')|$(B 'X')|$(B 'e')|$(B 'E')|$(B 'f')|$(B 'F')|$(B 'g')|$(B 'G')|$(B 'a')|$(B 'A') + ) + + $(BOOKTABLE Flags affect formatting depending on the specifier as +@@ -180,13 +183,13 @@ $(I FormatChar): + $(TR $(TD $(B '#')) $(TD floating) $(TD Always insert the decimal + point and print trailing zeros.)) + +- $(TR $(TD $(B '#')) $(TD numeric ($(B '0'))) $(TD Use leading ++ $(TR $(TD $(B '0')) $(TD numeric) $(TD Use leading + zeros to pad rather than spaces (except for the floating point + values $(D nan) and $(D infinity)). Ignore if there's a $(I + Precision).)) + +- $(TR $(TD $(B ' ')) $(TD numeric)) $(TD Prefix positive +- numbers in a signed conversion with a space.)) ++ $(TR $(TD $(B ' ')) $(TD numeric) $(TD Prefix positive ++ numbers in a signed conversion with a space.))) + +
$(I Width) +
+@@ -297,83 +300,82 @@ $(I FormatChar): + $(I FormatChar) is lower case, or $(B INF) or $(B INFINITY) if upper. +
+ +-Examples: ++ Examples: ++ ------------------------- ++ import std.c.stdio; ++ import std.format; ++ ++ void main() ++ { ++ auto writer = appender!string(); ++ formattedWrite(writer, "%s is the ultimate %s.", 42, "answer"); ++ assert(writer.data == "42 is the ultimate answer."); ++ // Clear the writer ++ writer = appender!string(); ++ formattedWrite(writer, "Date: %2$s %1$s", "October", 5); ++ assert(writer.data == "Date: 5 October"); ++ } ++ ------------------------ ++ ++ The positional and non-positional styles can be mixed in the same ++ format string. (POSIX leaves this behavior undefined.) The internal ++ counter for non-positional parameters tracks the next parameter after ++ the largest positional parameter already used. + +-------------------------- +-import std.c.stdio; +-import std.format; +- +-void main() +-{ +- auto writer = appender!string(); +- formattedWrite(writer, "%s is the ultimate %s.", 42, "answer"); +- assert(writer.data == "42 is the ultimate answer."); +- // Clear the writer +- writer = appender!string(); +- formattedWrite(writer, "Date: %2$s %1$s", "October", 5); +- assert(writer.data == "Date: 5 October"); +-} +------------------------- +- +-The positional and non-positional styles can be mixed in the same +-format string. (POSIX leaves this behavior undefined.) The internal +-counter for non-positional parameters tracks the next parameter after +-the largest positional parameter already used. +- +-Example using array and nested array formatting: +-------------------------- +-import std.stdio; ++ Example using array and nested array formatting: ++ ------------------------- ++ import std.stdio; + +-void main() +-{ +- writefln("My items are %(%s %).", [1,2,3]); +- writefln("My items are %(%s, %).", [1,2,3]); +-} +-------------------------- +- The output is: ++ void main() ++ { ++ writefln("My items are %(%s %).", [1,2,3]); ++ writefln("My items are %(%s, %).", [1,2,3]); ++ } ++ ------------------------- ++ The output is: +
+ My items are 1 2 3.
+ My items are 1, 2, 3.
+ 
+ +- The trailing end of the sub-format string following the specifier for each +- item is interpreted as the array delimiter, and is therefore omitted +- following the last array item. The $(B %|) delimiter specifier may be used +- to indicate where the delimiter begins, so that the portion of the format +- string prior to it will be retained in the last array element: +-------------------------- +-import std.stdio; ++ The trailing end of the sub-format string following the specifier for each ++ item is interpreted as the array delimiter, and is therefore omitted ++ following the last array item. The $(B %|) delimiter specifier may be used ++ to indicate where the delimiter begins, so that the portion of the format ++ string prior to it will be retained in the last array element: ++ ------------------------- ++ import std.stdio; + +-void main() +-{ +- writefln("My items are %(-%s-%|, %).", [1,2,3]); +-} +-------------------------- +- which gives the output: ++ void main() ++ { ++ writefln("My items are %(-%s-%|, %).", [1,2,3]); ++ } ++ ------------------------- ++ which gives the output: +
+ My items are -1-, -2-, -3-.
+ 
+ +- These compound format specifiers may be nested in the case of a nested +- array argument: +-------------------------- +-import std.stdio; +-void main() { +- auto mat = [[1, 2, 3], +- [4, 5, 6], +- [7, 8, 9]]; +- +- writefln("%(%(%d %)\n%)", mat); +- writeln(); ++ These compound format specifiers may be nested in the case of a nested ++ array argument: ++ ------------------------- ++ import std.stdio; ++ void main() { ++ auto mat = [[1, 2, 3], ++ [4, 5, 6], ++ [7, 8, 9]]; ++ ++ writefln("%(%(%d %)\n%)", mat); ++ writeln(); + +- writefln("[%(%(%d %)\n %)]", mat); +- writeln(); ++ writefln("[%(%(%d %)\n %)]", mat); ++ writeln(); + +- writefln("[%([%(%d %)]%|\n %)]", mat); +- writeln(); +-} +-------------------------- +- The output is: ++ writefln("[%([%(%d %)]%|\n %)]", mat); ++ writeln(); ++ } ++ ------------------------- ++ The output is: +
+ 1 2 3
+ 4 5 6
+@@ -388,19 +390,19 @@ void main() {
+  [7 8 9]]
+ 
+ +- Inside a compound format specifier, strings and characters are escaped +- automatically. To avoid this behavior, add $(B '-') flag to +- $(D "%$(LPAREN)"). +-------------------------- +-import std.stdio; ++ Inside a compound format specifier, strings and characters are escaped ++ automatically. To avoid this behavior, add $(B '-') flag to ++ $(D "%$(LPAREN)"). ++ ------------------------- ++ import std.stdio; + +-void main() +-{ +- writefln("My friends are %s.", ["John", "Nancy"]); +- writefln("My friends are %(%s, %).", ["John", "Nancy"]); +- writefln("My friends are %-(%s, %).", ["John", "Nancy"]); +-} +-------------------------- ++ void main() ++ { ++ writefln("My friends are %s.", ["John", "Nancy"]); ++ writefln("My friends are %(%s, %).", ["John", "Nancy"]); ++ writefln("My friends are %-(%s, %).", ["John", "Nancy"]); ++ } ++ ------------------------- + which gives the output: +
+ My friends are ["John", "Nancy"].
+@@ -410,30 +412,35 @@ My friends are John, Nancy.
+  */
+ uint formattedWrite(Writer, Char, A...)(Writer w, in Char[] fmt, A args)
+ {
+-    enum len = args.length;
+-    void function(Writer, const(void)*, ref FormatSpec!Char) funs[len] = void;
+-    const(void)* argsAddresses[len] = void;
++    alias FPfmt = void function(Writer, const(void)*, ref FormatSpec!Char) @safe pure nothrow;
++
++    auto spec = FormatSpec!Char(fmt);
++
++    FPfmt[A.length] funs;
++    const(void)*[A.length] argsAddresses;
+     if (!__ctfe)
+     {
+-        foreach (i, arg; args)
++        foreach (i, Arg; A)
+         {
+-            funs[i] = &formatGeneric!(Writer, typeof(arg), Char);
++            funs[i] = ()@trusted{ return cast(FPfmt)&formatGeneric!(Writer, Arg, Char); }();
+             // We can safely cast away shared because all data is either
+             // immutable or completely owned by this function.
+-            argsAddresses[i] = cast(const(void*)) &args[ i ];
++            argsAddresses[i] = (ref arg)@trusted{ return cast(const void*) &arg; }(args[i]);
++
++            // Reflect formatting @safe/pure ability of each arguments to this function
++            if (0) formatValue(w, args[i], spec);
+         }
+     }
++
+     // Are we already done with formats? Then just dump each parameter in turn
+     uint currentArg = 0;
+-    auto spec = FormatSpec!Char(fmt);
+     while (spec.writeUpToNextSpec(w))
+     {
+         if (currentArg == funs.length && !spec.indexStart)
+         {
+             // leftover spec?
+-            enforceEx!FormatException(
+-                    fmt.length == 0,
+-                    text("Orphan format specifier: %", fmt));
++            enforceFmt(fmt.length == 0,
++                text("Orphan format specifier: %", fmt));
+             break;
+         }
+         if (spec.width == spec.DYNAMIC)
+@@ -508,6 +515,13 @@ uint formattedWrite(Writer, Char, A...)(
+     return currentArg;
+ }
+ 
++@safe pure unittest
++{
++    auto w = appender!string();
++    formattedWrite(w, "%s %d", "@safe/pure", 42);
++    assert(w.data == "@safe/pure 42");
++}
++
+ /**
+    Reads characters from input range $(D r), converts them according
+    to $(D fmt), and writes them to $(D args).
+@@ -577,12 +591,13 @@ uint formattedRead(R, Char, S...)(ref R
+ 
+ unittest
+ {
++    import std.math;
+     string s = " 1.2 3.4 ";
+     double x, y, z;
+     assert(formattedRead(s, " %s %s %s ", &x, &y, &z) == 2);
+     assert(s.empty);
+-    assert(x == 1.2);
+-    assert(y == 3.4);
++    assert(approxEqual(x, 1.2));
++    assert(approxEqual(y, 3.4));
+     assert(isnan(z));
+ }
+ 
+@@ -593,29 +608,29 @@ template FormatSpec(Char)
+ }
+ 
+ /**
+-   A General handler for $(D printf) style format specifiers. Used for building more
+-   specific formatting functions.
+-
+-   Example:
+-----
+-auto a = appender!(string)();
+-auto fmt = "Number: %2.4e\nString: %s";
+-auto f = FormatSpec!char(fmt);
+-
+-f.writeUpToNextSpec(a);
+-
+-assert(a.data == "Number: ");
+-assert(f.trailing == "\nString: %s");
+-assert(f.spec == 'e');
+-assert(f.width == 2);
+-assert(f.precision == 4);
+-
+-f.writeUpToNextSpec(a);
+-
+-assert(a.data == "Number: \nString: ");
+-assert(f.trailing == "");
+-assert(f.spec == 's');
+-----
++ * A General handler for $(D printf) style format specifiers. Used for building more
++ * specific formatting functions.
++ *
++ * Example:
++ * ----
++ * auto a = appender!(string)();
++ * auto fmt = "Number: %2.4e\nString: %s";
++ * auto f = FormatSpec!char(fmt);
++ *
++ * f.writeUpToNextSpec(a);
++ *
++ * assert(a.data == "Number: ");
++ * assert(f.trailing == "\nString: %s");
++ * assert(f.spec == 'e');
++ * assert(f.width == 2);
++ * assert(f.precision == 4);
++ *
++ * f.writeUpToNextSpec(a);
++ *
++ * assert(a.data == "Number: \nString: ");
++ * assert(f.trailing == "");
++ * assert(f.spec == 's');
++ * ----
+  */
+ struct FormatSpec(Char)
+     if (is(Unqual!Char == Char))
+@@ -624,63 +639,76 @@ struct FormatSpec(Char)
+        Minimum _width, default $(D 0).
+      */
+     int width = 0;
++
+     /**
+        Precision. Its semantics depends on the argument type. For
+        floating point numbers, _precision dictates the number of
+        decimals printed.
+      */
+     int precision = UNSPECIFIED;
++
+     /**
+        Special value for width and precision. $(D DYNAMIC) width or
+        precision means that they were specified with $(D '*') in the
+        format string and are passed at runtime through the varargs.
+      */
+     enum int DYNAMIC = int.max;
++
+     /**
+        Special value for precision, meaning the format specifier
+        contained no explicit precision.
+      */
+     enum int UNSPECIFIED = DYNAMIC - 1;
++
+     /**
+        The actual format specifier, $(D 's') by default.
+     */
+     char spec = 's';
++
+     /**
+        Index of the argument for positional parameters, from $(D 1) to
+        $(D ubyte.max). ($(D 0) means not used).
+     */
+     ubyte indexStart;
++
+     /**
+        Index of the last argument for positional parameter range, from
+        $(D 1) to $(D ubyte.max). ($(D 0) means not used).
+     */
+     ubyte indexEnd;
+-    version(StdDdoc) {
++
++    version(StdDdoc)
++    {
+         /**
+          The format specifier contained a $(D '-') ($(D printf)
+          compatibility).
+          */
+         bool flDash;
++
+         /**
+          The format specifier contained a $(D '0') ($(D printf)
+          compatibility).
+          */
+         bool flZero;
++
+         /**
+          The format specifier contained a $(D ' ') ($(D printf)
+          compatibility).
+          */
+         bool flSpace;
++
+         /**
+          The format specifier contained a $(D '+') ($(D printf)
+          compatibility).
+          */
+         bool flPlus;
++
+         /**
+          The format specifier contained a $(D '#') ($(D printf)
+          compatibility).
+          */
+         bool flHash;
++
+         // Fake field to allow compilation
+         ubyte allFlags;
+     }
+@@ -752,7 +780,8 @@ struct FormatSpec(Char)
+ 
+     bool writeUpToNextSpec(OutputRange)(OutputRange writer)
+     {
+-        if (trailing.empty) return false;
++        if (trailing.empty)
++            return false;
+         for (size_t i = 0; i < trailing.length; ++i)
+         {
+             if (trailing[i] != '%') continue;
+@@ -831,16 +860,11 @@ struct FormatSpec(Char)
+             case '(':
+                 // Embedded format specifier.
+                 auto j = i + 1;
+-                void check(bool condition)
+-                {
+-                    enforce(
+-                        condition,
+-                        text("Incorrect format specifier: %", trailing[i .. $]));
+-                }
+                 // Get the matching balanced paren
+                 for (uint innerParens;;)
+                 {
+-                    check(j < trailing.length);
++                    enforce(j < trailing.length,
++                        text("Incorrect format specifier: %", trailing[i .. $]));
+                     if (trailing[j++] != '%')
+                     {
+                         // skip, we're waiting for %( and %)
+@@ -903,9 +927,8 @@ struct FormatSpec(Char)
+                     trailing = trailing[1 .. $];
+                     width = -.parse!(typeof(width))(trailing);
+                     i = 0;
+-                    enforceEx!FormatException(
+-                            trailing[i++] == '$',
+-                            "$ expected");
++                    enforceFmt(trailing[i++] == '$',
++                        "$ expected");
+                 }
+                 else
+                 {
+@@ -915,10 +938,9 @@ struct FormatSpec(Char)
+                 break;
+             case '1': .. case '9':
+                 auto tmp = trailing[i .. $];
+-                const widthOrArgIndex = .parse!(uint)(tmp);
+-                enforceEx!FormatException(
+-                        tmp.length,
+-                        text("Incorrect format specifier %", trailing[i .. $]));
++                const widthOrArgIndex = .parse!uint(tmp);
++                enforceFmt(tmp.length,
++                    text("Incorrect format specifier %", trailing[i .. $]));
+                 i = tmp.ptr - trailing.ptr;
+                 if (tmp.startsWith('$'))
+                 {
+@@ -940,9 +962,8 @@ struct FormatSpec(Char)
+                         indexEnd = .parse!(typeof(indexEnd))(tmp);
+                     }
+                     i = tmp.ptr - trailing.ptr;
+-                    enforceEx!FormatException(
+-                            trailing[i++] == '$',
+-                            "$ expected");
++                    enforceFmt(trailing[i++] == '$',
++                        "$ expected");
+                 }
+                 else
+                 {
+@@ -961,9 +982,8 @@ struct FormatSpec(Char)
+                         trailing = trailing[i .. $];
+                         i = 0;
+                         precision = -.parse!int(trailing);
+-                        enforceEx!FormatException(
+-                                trailing[i++] == '$',
+-                                "$ expected");
++                        enforceFmt(trailing[i++] == '$',
++                            "$ expected");
+                     }
+                     else
+                     {
+@@ -976,7 +996,7 @@ struct FormatSpec(Char)
+                     // negative precision, as good as 0
+                     precision = 0;
+                     auto tmp = trailing[i .. $];
+-                    .parse!(int)(tmp); // skip digits
++                    .parse!int(tmp); // skip digits
+                     i = tmp.ptr - trailing.ptr;
+                 }
+                 else if (isDigit(trailing[i]))
+@@ -1140,7 +1160,7 @@ struct FormatSpec(Char)
+                 "\ntrailing = ", trailing, "\n");
+     }
+ }
+-unittest
++@safe pure unittest
+ {
+     //Test the example
+     auto a = appender!(string)();
+@@ -1233,11 +1253,16 @@ if (is(BooleanTypeOf!T) && !is(T == enum
+         formatValue(w, cast(int) val, f);
+ }
+ 
++@safe pure unittest
++{
++    assertCTFEable!(
++    {
++        formatTest( false, "false" );
++        formatTest( true,  "true"  );
++    });
++}
+ unittest
+ {
+-    formatTest( false, "false" );
+-    formatTest( true,  "true"  );
+-
+     class C1 { bool val; alias val this; this(bool v){ val = v; } }
+     class C2 { bool val; alias val this; this(bool v){ val = v; }
+                override string toString() const { return "C"; } }
+@@ -1270,14 +1295,18 @@ unittest
+ void formatValue(Writer, T, Char)(Writer w, T obj, ref FormatSpec!Char f)
+ if (is(T == typeof(null)) && !is(T == enum) && !hasToString!(T, Char))
+ {
+-    enforceEx!FormatException(f.spec == 's', "null");
++    enforceFmt(f.spec == 's',
++        "null");
+ 
+     put(w, "null");
+ }
+ 
+-unittest
++@safe pure unittest
+ {
+-    formatTest( null, "null" );
++    assertCTFEable!(
++    {
++        formatTest( null, "null" );
++    });
+ }
+ 
+ /**
+@@ -1287,51 +1316,51 @@ void formatValue(Writer, T, Char)(Writer
+ if (is(IntegralTypeOf!T) && !is(T == enum) && !hasToString!(T, Char))
+ {
+     alias U = IntegralTypeOf!T;
+-    U val = obj;
++    U val = obj;    // Extracting alias this may be impure/system/may-throw
+ 
+     if (f.spec == 'r')
+     {
+         // raw write, skip all else and write the thing
+-        auto begin = cast(const char*) &val;
++        auto raw = (ref val)@trusted{
++            return (cast(const char*) &val)[0 .. val.sizeof];
++        }(val);
+         if (std.system.endian == Endian.littleEndian && f.flPlus
+             || std.system.endian == Endian.bigEndian && f.flDash)
+         {
+             // must swap bytes
+-            foreach_reverse (i; 0 .. val.sizeof)
+-                put(w, begin[i]);
++            foreach_reverse (c; raw)
++                put(w, c);
+         }
+         else
+         {
+-            foreach (i; 0 .. val.sizeof)
+-                put(w, begin[i]);
++            foreach (c; raw)
++                put(w, c);
+         }
+         return;
+     }
+ 
++    uint base =
++        f.spec == 'x' || f.spec == 'X' ? 16 :
++        f.spec == 'o' ? 8 :
++        f.spec == 'b' ? 2 :
++        f.spec == 's' || f.spec == 'd' || f.spec == 'u' ? 10 :
++        0;
++    enforceFmt(base > 0,
++        "integral");
++
+     // Forward on to formatIntegral to handle both U and const(U)
+     // Saves duplication of code for both versions.
+     static if (isSigned!U)
+-        formatIntegral(w, cast(long) val, f, Unsigned!U.max);
++        formatIntegral(w, cast( long) val, f, base, Unsigned!U.max);
+     else
+-        formatIntegral(w, cast(ulong) val, f, U.max);
++        formatIntegral(w, cast(ulong) val, f, base, U.max);
+ }
+ 
+-private void formatIntegral(Writer, T, Char)(Writer w, const(T) val, ref FormatSpec!Char f, ulong mask)
++private void formatIntegral(Writer, T, Char)(Writer w, const(T) val, ref FormatSpec!Char f, uint base, ulong mask)
+ {
+     FormatSpec!Char fs = f; // fs is copy for change its values.
+-
+     T arg = val;
+ 
+-    uint base =
+-        fs.spec == 'x' || fs.spec == 'X' ? 16 :
+-        fs.spec == 'o' ? 8 :
+-        fs.spec == 'b' ? 2 :
+-        fs.spec == 's' || fs.spec == 'd' || fs.spec == 'u' ? 10 :
+-        0;
+-    enforceEx!FormatException(
+-            base > 0,
+-            "integral");
+-
+     bool negative = (base == 10 && arg < 0);
+     if (negative)
+     {
+@@ -1379,9 +1408,9 @@ private void formatUnsigned(Writer, Char
+         forcedPrefix = '-';
+     }
+     // fill the digits
+-    char[] digits = void;
++    char[64] buffer; // 64 bits in base 2 at most
++    char[] digits;
+     {
+-        char buffer[64]; // 64 bits in base 2 at most
+         uint i = buffer.length;
+         auto n = arg;
+         do
+@@ -1443,10 +1472,15 @@ private void formatUnsigned(Writer, Char
+     if (!leftPad) foreach (i ; 0 .. spacesToPrint) put(w, ' ');
+ }
+ 
++@safe pure unittest
++{
++    assertCTFEable!(
++    {
++        formatTest( 10, "10" );
++    });
++}
+ unittest
+ {
+-    formatTest( 10, "10" );
+-
+     class C1 { long val; alias val this; this(long v){ val = v; } }
+     class C2 { long val; alias val this; this(long v){ val = v; }
+                override string toString() const { return "C"; } }
+@@ -1515,24 +1549,25 @@ if (is(FloatingPointTypeOf!T) && !is(T =
+     if (fs.spec == 'r')
+     {
+         // raw write, skip all else and write the thing
+-        auto begin = cast(const char*) &val;
++        auto raw = (ref val)@trusted{
++            return (cast(const char*) &val)[0 .. val.sizeof];
++        }(val);
+         if (std.system.endian == Endian.littleEndian && f.flPlus
+             || std.system.endian == Endian.bigEndian && f.flDash)
+         {
+             // must swap bytes
+-            foreach_reverse (i; 0 .. val.sizeof)
+-                put(w, begin[i]);
++            foreach_reverse (c; raw)
++                put(w, c);
+         }
+         else
+         {
+-            foreach (i; 0 .. val.sizeof)
+-                put(w, begin[i]);
++            foreach (c; raw)
++                put(w, c);
+         }
+         return;
+     }
+-    enforceEx!FormatException(
+-            std.algorithm.find("fgFGaAeEs", fs.spec).length,
+-            "floating");
++    enforceFmt(std.algorithm.find("fgFGaAeEs", fs.spec).length,
++        "floating");
+     version (Win64)
+     {
+         if (isnan(val)) // snprintf writes 1.#QNAN
+@@ -1563,8 +1598,8 @@ if (is(FloatingPointTypeOf!T) && !is(T =
+         }
+     }
+     if (fs.spec == 's') fs.spec = 'g';
+-    char sprintfSpec[1 /*%*/ + 5 /*flags*/ + 3 /*width.prec*/ + 2 /*format*/
+-                     + 1 /*\0*/] = void;
++    char[1 /*%*/ + 5 /*flags*/ + 3 /*width.prec*/ + 2 /*format*/
++                     + 1 /*\0*/] sprintfSpec = void;
+     sprintfSpec[0] = '%';
+     uint i = 1;
+     if (fs.flDash) sprintfSpec[i++] = '-';
+@@ -1585,19 +1620,20 @@ if (is(FloatingPointTypeOf!T) && !is(T =
+             // negative precision is same as no precision specified
+             fs.precision == fs.UNSPECIFIED ? -1 : fs.precision,
+             val);
+-    enforceEx!FormatException(
+-            n >= 0,
+-            "floating point formatting failure");
++    enforceFmt(n >= 0,
++        "floating point formatting failure");
+     put(w, buf[0 .. strlen(buf.ptr)]);
+ }
+ 
+-unittest
++/*@safe pure */unittest
+ {
+     foreach (T; TypeTuple!(float, double, real))
+     {
+         formatTest( to!(          T)(5.5), "5.5" );
+         formatTest( to!(    const T)(5.5), "5.5" );
+         formatTest( to!(immutable T)(5.5), "5.5" );
++
++        formatTest( T.nan, "nan" );
+     }
+ }
+ 
+@@ -1618,14 +1654,6 @@ unittest
+     formatTest( S2(2.25), "S" );
+ }
+ 
+-unittest
+-{
+-    foreach (T; TypeTuple!(float, double, real))
+-    {
+-        formatTest( T.nan, "nan" );
+-    }
+-}
+-
+ /*
+    Formatting a $(D creal) is deprecated but still kept around for a while.
+  */
+@@ -1635,12 +1663,15 @@ if (is(Unqual!T : creal) && !is(T == enu
+     creal val = obj;
+ 
+     formatValue(w, val.re, f);
+-    put(w, '+');
++    if (val.im >= 0)
++    {
++        put(w, '+');
++    }
+     formatValue(w, val.im, f);
+     put(w, 'i');
+ }
+ 
+-unittest
++/*@safe pure */unittest
+ {
+     foreach (T; TypeTuple!(cfloat, cdouble, creal))
+     {
+@@ -1648,6 +1679,12 @@ unittest
+         formatTest( to!(    const T)(1 + 1i), "1+1i" );
+         formatTest( to!(immutable T)(1 + 1i), "1+1i" );
+     }
++    foreach (T; TypeTuple!(cfloat, cdouble, creal))
++    {
++        formatTest( to!(          T)(0 - 3i), "0-3i" );
++        formatTest( to!(    const T)(0 - 3i), "0-3i" );
++        formatTest( to!(immutable T)(0 - 3i), "0-3i" );
++    }
+ }
+ 
+ unittest
+@@ -1679,7 +1716,7 @@ if (is(Unqual!T : ireal) && !is(T == enu
+     put(w, 'i');
+ }
+ 
+-unittest
++/*@safe pure */unittest
+ {
+     foreach (T; TypeTuple!(ifloat, idouble, ireal))
+     {
+@@ -1722,14 +1759,21 @@ if (is(CharTypeOf!T) && !is(T == enum) &
+     }
+     else
+     {
+-        formatValue(w, cast(uint) val, f);
++        alias U = TypeTuple!(ubyte, ushort, uint)[CharTypeOf!T.sizeof/2];
++        formatValue(w, cast(U) val, f);
+     }
+ }
+ 
+-unittest
++@safe pure unittest
+ {
+-    formatTest( 'c', "c" );
++    assertCTFEable!(
++    {
++        formatTest( 'c', "c" );
++    });
++}
+ 
++unittest
++{
+     class C1 { char val; alias val this; this(char v){ val = v; } }
+     class C2 { char val; alias val this; this(char v){ val = v; }
+                override string toString() const { return "C"; } }
+@@ -1743,6 +1787,21 @@ unittest
+     formatTest( S2('c'), "S" );
+ }
+ 
++@safe pure unittest
++{
++    //Little Endian
++    formatTest( "%-r", cast( char)'c', ['c'         ] );
++    formatTest( "%-r", cast(wchar)'c', ['c', 0      ] );
++    formatTest( "%-r", cast(dchar)'c', ['c', 0, 0, 0] );
++    formatTest( "%-r", '本', ['\x2c', '\x67'] );
++
++    //Big Endian
++    formatTest( "%+r", cast( char)'c', [         'c'] );
++    formatTest( "%+r", cast(wchar)'c', [0,       'c'] );
++    formatTest( "%+r", cast(dchar)'c', [0, 0, 0, 'c'] );
++    formatTest( "%+r", '本', ['\x67', '\x2c'] );
++}
++
+ /**
+    Strings are formatted like $(D printf) does.
+  */
+@@ -1784,6 +1843,25 @@ unittest
+     formatTest( S3("s3"), "S" );
+ }
+ 
++@safe pure unittest
++{
++    //Little Endian
++    formatTest( "%-r", "ab"c, ['a'         , 'b'         ] );
++    formatTest( "%-r", "ab"w, ['a', 0      , 'b', 0      ] );
++    formatTest( "%-r", "ab"d, ['a', 0, 0, 0, 'b', 0, 0, 0] );
++    formatTest( "%-r", "日本語"c, ['\xe6', '\x97', '\xa5', '\xe6', '\x9c', '\xac', '\xe8', '\xaa', '\x9e'] );
++    formatTest( "%-r", "日本語"w, ['\xe5', '\x65',                 '\x2c', '\x67',                 '\x9e', '\x8a'                ] );
++    formatTest( "%-r", "日本語"d, ['\xe5', '\x65', '\x00', '\x00', '\x2c', '\x67', '\x00', '\x00', '\x9e', '\x8a', '\x00', '\x00'] );
++
++    //Big Endian
++    formatTest( "%+r", "ab"c, [         'a',          'b'] );
++    formatTest( "%+r", "ab"w, [      0, 'a',       0, 'b'] );
++    formatTest( "%+r", "ab"d, [0, 0, 0, 'a', 0, 0, 0, 'b'] );
++    formatTest( "%+r", "日本語"c, ['\xe6', '\x97', '\xa5', '\xe6', '\x9c', '\xac', '\xe8', '\xaa', '\x9e'] );
++    formatTest( "%+r", "日本語"w, [                '\x65', '\xe5',                 '\x67', '\x2c',                 '\x8a', '\x9e'] );
++    formatTest( "%+r", "日本語"d, ['\x00', '\x00', '\x65', '\xe5', '\x00', '\x00', '\x67', '\x2c', '\x00', '\x00', '\x8a', '\x9e'] );
++}
++
+ /**
+    Static-size arrays are formatted as dynamic arrays.
+  */
+@@ -1851,7 +1929,7 @@ unittest
+       static if (flags & 4)
+         string toString() const { return "S"; }
+     }
+-    formatTest(S!0b000([0, 1, 2]), "S!(0)([0, 1, 2])");
++    formatTest(S!0b000([0, 1, 2]), "S!0([0, 1, 2])");
+     formatTest(S!0b001([0, 1, 2]), "[0, 1, 2]");        // Test for bug 7628
+     formatTest(S!0b010([0, 1, 2]), "[0, 2, 4]");
+     formatTest(S!0b011([0, 1, 2]), "[0, 2, 4]");
+@@ -1952,12 +2030,16 @@ unittest
+                     `["hello"]` );
+ 
+         // 1 character escape sequences (' is not escaped in strings)
+-        formatTest( [cast(StrType)"\"'\\\a\b\f\n\r\t\v"],
+-                    `["\"'\\\a\b\f\n\r\t\v"]` );
++        formatTest( [cast(StrType)"\"'\0\\\a\b\f\n\r\t\v"],
++                    `["\"'\0\\\a\b\f\n\r\t\v"]` );
++
++        // 1 character optional escape sequences
++        formatTest( [cast(StrType)"\'\?"],
++                    `["'?"]` );
+ 
+         // Valid and non-printable code point (<= U+FF)
+-        formatTest( [cast(StrType)"\x00\x10\x1F\x20test"],
+-                    `["\x00\x10\x1F test"]` );
++        formatTest( [cast(StrType)"\x10\x1F\x20test"],
++                    `["\x10\x1F test"]` );
+ 
+         // Valid and non-printable code point (<= U+FFFF)
+         formatTest( [cast(StrType)"\u200B..\u200F"],
+@@ -1999,13 +2081,13 @@ unittest
+     formatTest( "%-(%s, %)", arr, `hello, world` );
+ 
+     auto aa1 = [1:"hello", 2:"world"];
+-    formatTest( "%(%s:%s, %)",  aa1, `1:"hello", 2:"world"` );
+-    formatTest( "%-(%s:%s, %)", aa1, `1:hello, 2:world` );
++    formatTest( "%(%s:%s, %)",  aa1, [`1:"hello", 2:"world"`, `2:"world", 1:"hello"`] );
++    formatTest( "%-(%s:%s, %)", aa1, [`1:hello, 2:world`, `2:world, 1:hello`] );
+ 
+     auto aa2 = [1:["ab", "cd"], 2:["ef", "gh"]];
+-    formatTest( "%-(%s:%s, %)",        aa2, `1:["ab", "cd"], 2:["ef", "gh"]` );
+-    formatTest( "%-(%s:%(%s%), %)",    aa2, `1:"ab""cd", 2:"ef""gh"` );
+-    formatTest( "%-(%s:%-(%s%)%|, %)", aa2, `1:abcd, 2:efgh` );
++    formatTest( "%-(%s:%s, %)",        aa2, [`1:["ab", "cd"], 2:["ef", "gh"]`, `2:["ef", "gh"], 1:["ab", "cd"]`] );
++    formatTest( "%-(%s:%(%s%), %)",    aa2, [`1:"ab""cd", 2:"ef""gh"`, `2:"ef""gh", 1:"ab""cd"`] );
++    formatTest( "%-(%s:%-(%s%)%|, %)", aa2, [`1:abcd, 2:efgh`, `2:efgh, 1:abcd`] );
+ }
+ 
+ // input range formatting
+@@ -2013,116 +2095,126 @@ private void formatRange(Writer, T, Char
+ if (isInputRange!T)
+ {
+     // Formatting character ranges like string
+-    static if (is(CharTypeOf!(ElementType!T)))
+     if (f.spec == 's')
+     {
+-        static if (is(StringTypeOf!T))
++        static if (is(CharTypeOf!(ElementType!T)))
+         {
+-            auto s = val[0 .. f.precision < $ ? f.precision : $];
+-            if (!f.flDash)
++            static if (is(StringTypeOf!T))
+             {
+-                // right align
+-                if (f.width > s.length)
+-                    foreach (i ; 0 .. f.width - s.length) put(w, ' ');
+-                put(w, s);
+-            }
+-            else
+-            {
+-                // left align
+-                put(w, s);
+-                if (f.width > s.length)
+-                    foreach (i ; 0 .. f.width - s.length) put(w, ' ');
+-            }
+-        }
+-        else
+-        {
+-            if (!f.flDash)
+-            {
+-                static if (hasLength!T)
++                auto s = val[0 .. f.precision < $ ? f.precision : $];
++                if (!f.flDash)
+                 {
+                     // right align
+-                    auto len = val.length;
+-                }
+-                else static if (isForwardRange!T && !isInfinite!T)
+-                {
+-                    auto len = walkLength(val.save);
+-                }
+-                else
+-                {
+-                    enforce(f.width == 0, "Cannot right-align a range without length");
+-                    size_t len = 0;
++                    if (f.width > s.length)
++                        foreach (i ; 0 .. f.width - s.length) put(w, ' ');
++                    put(w, s);
+                 }
+-                if (f.precision != f.UNSPECIFIED && len > f.precision)
+-                    len = f.precision;
+-
+-                if (f.width > len)
+-                    foreach (i ; 0 .. f.width - len)
+-                        put(w, ' ');
+-                if (f.precision == f.UNSPECIFIED)
+-                    put(w, val);
+                 else
+                 {
+-                    size_t printed = 0;
+-                    for (; !val.empty && printed < f.precision; val.popFront(), ++printed)
+-                        put(w, val.front);
++                    // left align
++                    put(w, s);
++                    if (f.width > s.length)
++                        foreach (i ; 0 .. f.width - s.length) put(w, ' ');
+                 }
+             }
+             else
+             {
+-                size_t printed = void;
+-
+-                // left align
+-                if (f.precision == f.UNSPECIFIED)
++                if (!f.flDash)
+                 {
+                     static if (hasLength!T)
+                     {
+-                        printed = val.length;
++                        // right align
++                        auto len = val.length;
++                    }
++                    else static if (isForwardRange!T && !isInfinite!T)
++                    {
++                        auto len = walkLength(val.save);
++                    }
++                    else
++                    {
++                        enforce(f.width == 0, "Cannot right-align a range without length");
++                        size_t len = 0;
++                    }
++                    if (f.precision != f.UNSPECIFIED && len > f.precision)
++                        len = f.precision;
++
++                    if (f.width > len)
++                        foreach (i ; 0 .. f.width - len)
++                            put(w, ' ');
++                    if (f.precision == f.UNSPECIFIED)
+                         put(w, val);
++                    else
++                    {
++                        size_t printed = 0;
++                        for (; !val.empty && printed < f.precision; val.popFront(), ++printed)
++                            put(w, val.front);
++                    }
++                }
++                else
++                {
++                    size_t printed = void;
++
++                    // left align
++                    if (f.precision == f.UNSPECIFIED)
++                    {
++                        static if (hasLength!T)
++                        {
++                            printed = val.length;
++                            put(w, val);
++                        }
++                        else
++                        {
++                            printed = 0;
++                            for (; !val.empty; val.popFront(), ++printed)
++                                put(w, val.front);
++                        }
+                     }
+                     else
+                     {
+                         printed = 0;
+-                        for (; !val.empty; val.popFront(), ++printed)
++                        for (; !val.empty && printed < f.precision; val.popFront(), ++printed)
+                             put(w, val.front);
+                     }
++
++                    if (f.width > printed)
++                        foreach (i ; 0 .. f.width - printed)
++                            put(w, ' ');
+                 }
+-                else
++            }
++        }
++        else
++        {
++            put(w, f.seqBefore);
++            if (!val.empty)
++            {
++                formatElement(w, val.front, f);
++                val.popFront();
++                for (size_t i; !val.empty; val.popFront(), ++i)
+                 {
+-                    printed = 0;
+-                    for (; !val.empty && printed < f.precision; val.popFront(), ++printed)
+-                        put(w, val.front);
++                    put(w, f.seqSeparator);
++                    formatElement(w, val.front, f);
+                 }
+-
+-                if (f.width > printed)
+-                    foreach (i ; 0 .. f.width - printed)
+-                        put(w, ' ');
+             }
++            static if (!isInfinite!T) put(w, f.seqAfter);
+         }
+-        return;
+     }
+-
+-    if (f.spec == 'r')
++    else if (f.spec == 'r')
+     {
+-        // raw writes
+-        for (size_t i; !val.empty; val.popFront(), ++i)
++        static if (is(DynamicArrayTypeOf!T))
+         {
+-            formatValue(w, val.front, f);
++            alias ARR = DynamicArrayTypeOf!T;
++            foreach (e ; cast(ARR)val)
++            {
++                formatValue(w, e, f);
++            }
+         }
+-    }
+-    else if (f.spec == 's')
+-    {
+-        put(w, f.seqBefore);
+-        if (!val.empty)
++        else
+         {
+-            formatElement(w, val.front, f);
+-            val.popFront();
+             for (size_t i; !val.empty; val.popFront(), ++i)
+             {
+-                put(w, f.seqSeparator);
+-                formatElement(w, val.front, f);
++                formatValue(w, val.front, f);
+             }
+         }
+-        static if (!isInfinite!T) put(w, f.seqAfter);
+     }
+     else if (f.spec == '(')
+     {
+@@ -2161,6 +2253,8 @@ if (isInputRange!T)
+ // character formatting with ecaping
+ private void formatChar(Writer)(Writer w, in dchar c, in char quote)
+ {
++    import std.uni : isGraphical;
++
+     if (std.uni.isGraphical(c))
+     {
+         if (c == quote || c == '\\')
+@@ -2173,6 +2267,7 @@ private void formatChar(Writer)(Writer w
+         put(w, '\\');
+         switch (c)
+         {
++        case '\0':  put(w, '0');  break;
+         case '\a':  put(w, 'a');  break;
+         case '\b':  put(w, 'b');  break;
+         case '\f':  put(w, 'f');  break;
+@@ -2284,7 +2379,7 @@ if (!is(StringTypeOf!T) && !is(CharTypeO
+ }
+ 
+ /**
+-   Associative arrays are formatted by using $(D ':') and $(D ', ') as
++   Associative arrays are formatted by using $(D ':') and $(D ", ") as
+    separators, and enclosed by $(D '[') and $(D ']').
+  */
+ void formatValue(Writer, T, Char)(Writer w, T obj, ref FormatSpec!Char f)
+@@ -2292,9 +2387,8 @@ if (is(AssocArrayTypeOf!T) && !is(T == e
+ {
+     AssocArrayTypeOf!T val = obj;
+ 
+-    enforceEx!FormatException(
+-            f.spec == 's' || f.spec == '(',
+-            "associative");
++    enforceFmt(f.spec == 's' || f.spec == '(',
++        "associative");
+ 
+     enum const(Char)[] defSpec = "%s" ~ f.keySeparator ~ "%s" ~ f.seqSeparator;
+     auto fmtSpec = f.spec == '(' ? f.nested : defSpec;
+@@ -2341,21 +2435,21 @@ unittest
+     formatTest( aa0, `[]` );
+ 
+     // elements escaping
+-    formatTest(  ["aaa":1, "bbb":2, "ccc":3],
+-                `["aaa":1, "bbb":2, "ccc":3]` );
++    formatTest(  ["aaa":1, "bbb":2],
++               [`["aaa":1, "bbb":2]`, `["bbb":2, "aaa":1]`] );
+     formatTest(  ['c':"str"],
+                 `['c':"str"]` );
+     formatTest(  ['"':"\"", '\'':"'"],
+-                `['"':"\"", '\'':"'"]` );
++               [`['"':"\"", '\'':"'"]`, `['\'':"'", '"':"\""]`] );
+ 
+     // range formatting for AA
+     auto aa3 = [1:"hello", 2:"world"];
+     // escape
+     formatTest( "{%(%s:%s $ %)}", aa3,
+-                `{1:"hello" $ 2:"world"}`);
++               [`{1:"hello" $ 2:"world"}`, `{2:"world" $ 1:"hello"}`]);
+     // use range formatting for key and value, and use %|
+     formatTest( "{%([%04d->%(%c.%)]%| $ %)}", aa3,
+-                `{[0001->h.e.l.l.o] $ [0002->w.o.r.l.d]}` );
++               [`{[0001->h.e.l.l.o] $ [0002->w.o.r.l.d]}`, `{[0002->w.o.r.l.d] $ [0001->h.e.l.l.o]}`] );
+ }
+ 
+ unittest
+@@ -2363,13 +2457,13 @@ unittest
+     class C1 { int[char] val; alias val this; this(int[char] v){ val = v; } }
+     class C2 { int[char] val; alias val this; this(int[char] v){ val = v; }
+                override string toString() const { return "C"; } }
+-    formatTest( new C1(['c':1, 'd':2]), `['c':1, 'd':2]` );
++    formatTest( new C1(['c':1, 'd':2]), [`['c':1, 'd':2]`, `['d':2, 'c':1]`] );
+     formatTest( new C2(['c':1, 'd':2]), "C" );
+ 
+     struct S1 { int[char] val; alias val this; }
+     struct S2 { int[char] val; alias val this;
+                 string toString() const { return "S"; } }
+-    formatTest( S1(['c':1, 'd':2]), `['c':1, 'd':2]` );
++    formatTest( S1(['c':1, 'd':2]), [`['c':1, 'd':2]`, `['d':2, 'c':1]`] );
+     formatTest( S2(['c':1, 'd':2]), "S" );
+ }
+ 
+@@ -2431,8 +2525,8 @@ void enforceValidFormatSpec(T, Char)(ref
+ {
+     static if (!isInputRange!T && hasToString!(T, Char) != 4)
+     {
+-        enforceEx!FormatException(f.spec == 's',
+-            format("Expected '%%s' format specifier for type '%s'", T.stringof));
++        enforceFmt(f.spec == 's',
++            "Expected '%s' format specifier for type '" ~ T.stringof ~ "'");
+     }
+ }
+ 
+@@ -2847,33 +2941,34 @@ if (isPointer!T && !is(T == enum) && !ha
+         else
+         {
+             const p = val;
++            const pnum = ()@trusted{ return cast(ulong) p; }();
+             if (f.spec == 's')
+             {
+                 FormatSpec!Char fs = f; // fs is copy for change its values.
+                 fs.spec = 'X';
+-                formatValue(w, cast(ulong) p, fs);
++                formatValue(w, pnum, fs);
+             }
+             else
+             {
+-                enforceEx!FormatException(f.spec == 'X' || f.spec == 'x',
++                enforceFmt(f.spec == 'X' || f.spec == 'x',
+                    "Expected one of %s, %x or %X for pointer type.");
+-                formatValue(w, cast(ulong) p, f);
++                formatValue(w, pnum, f);
+             }
+         }
+     }
+ }
+ 
+-unittest
++@safe pure unittest
+ {
+     // pointer
+     auto r = retro([1,2,3,4]);
+-    auto p = &r;
++    auto p = ()@trusted{ auto p = &r; return p; }();
+     formatTest( p, "[4, 3, 2, 1]" );
+     assert(p.empty);
+     p = null;
+     formatTest( p, "null" );
+ 
+-    auto q = cast(void*)0xFFEECCAA;
++    auto q = ()@trusted{ return cast(void*)0xFFEECCAA; }();
+     formatTest( q, "FFEECCAA" );
+ }
+ 
+@@ -2916,16 +3011,16 @@ unittest
+ void formatValue(Writer, T, Char)(Writer w, T val, ref FormatSpec!Char f)
+ if (is(T == delegate) && !is(T == enum) && !hasToString!(T, Char))
+ {
+-    alias FunctionAttribute FA;
++    alias FA = FunctionAttribute;
+     if (functionAttributes!T & FA.pure_)    formatValue(w, "pure ", f);
+     if (functionAttributes!T & FA.nothrow_) formatValue(w, "nothrow ", f);
+     if (functionAttributes!T & FA.ref_)     formatValue(w, "ref ", f);
+     if (functionAttributes!T & FA.property) formatValue(w, "@property ", f);
+     if (functionAttributes!T & FA.trusted)  formatValue(w, "@trusted ", f);
+     if (functionAttributes!T & FA.safe)     formatValue(w, "@safe ", f);
+-    formatValue(w, ReturnType!(T).stringof,f);
+-    formatValue(w, " delegate",f);
+-    formatValue(w, ParameterTypeTuple!(T).stringof,f);
++    formatValue(w, ReturnType!T.stringof, f);
++    formatValue(w, " delegate", f);
++    formatValue(w, ParameterTypeTuple!T.stringof, f);
+ }
+ 
+ unittest
+@@ -3043,6 +3138,35 @@ void formatTest(T)(string fmt, T val, st
+             text("expected = `", expected, "`, result = `", w.data, "`"), fn, ln);
+ }
+ 
++version(unittest)
++void formatTest(T)(T val, string[] expected, size_t ln = __LINE__, string fn = __FILE__)
++{
++    FormatSpec!char f;
++    auto w = appender!string();
++    formatValue(w, val, f);
++    foreach(cur; expected)
++    {
++        if(w.data == cur) return;
++    }
++    enforceEx!AssertError(
++            false,
++            text("expected one of `", expected, "`, result = `", w.data, "`"), fn, ln);
++}
++
++version(unittest)
++void formatTest(T)(string fmt, T val, string[] expected, size_t ln = __LINE__, string fn = __FILE__)
++{
++    auto w = appender!string();
++    formattedWrite(w, fmt, val);
++    foreach(cur; expected)
++    {
++        if(w.data == cur) return;
++    }
++    enforceEx!AssertError(
++            false,
++            text("expected one of `", expected, "`, result = `", w.data, "`"), fn, ln);
++}
++
+ unittest
+ {
+     auto stream = appender!string();
+@@ -3128,6 +3252,11 @@ unittest
+         assert(stream.data == "1.67 -0X1.47AE147AE147BP+0 nan",
+                 stream.data);
+     }
++    else version (MinGW)
++    {
++        assert(stream.data == "1.67 -0XA.3D70A3D70A3D8P-3 nan",
++                stream.data);
++    }
+     else
+     {
+         assert(stream.data == "1.67 -0X1.47AE147AE147BP+0 nan",
+@@ -3635,10 +3764,50 @@ void formatReflectTest(T)(ref T val, str
+ }
+ 
+ version(unittest)
+-@property void checkCTFEable(alias dg)()
++void formatReflectTest(T)(ref T val, string fmt, string[] formatted, string fn = __FILE__, size_t ln = __LINE__)
+ {
+-    static assert({ dg(); return true; }());
+-    dg();
++    auto w = appender!string();
++    formattedWrite(w, fmt, val);
++
++    auto input = w.data;
++
++    foreach(cur; formatted)
++    {
++        if(input == cur) return;
++    }
++    enforceEx!AssertError(
++            false,
++            input,
++            fn,
++            ln);
++
++    T val2;
++    formattedRead(input, fmt, &val2);
++    static if (isAssociativeArray!T)
++    if (__ctfe)
++    {
++        alias val aa1;
++        alias val2 aa2;
++        //assert(aa1 == aa2);
++
++        assert(aa1.length == aa2.length);
++
++        assert(aa1.keys == aa2.keys);
++
++        //assert(aa1.values == aa2.values);
++        assert(aa1.values.length == aa2.values.length);
++        foreach (i; 0 .. aa1.values.length)
++            assert(aa1.values[i] == aa2.values[i]);
++
++        //foreach (i, key; aa1.keys)
++        //    assert(aa1.values[i] == aa1[key]);
++        //foreach (i, key; aa2.keys)
++        //    assert(aa2.values[i] == aa2[key]);
++        return;
++    }
++    enforceEx!AssertError(
++            val == val2,
++            input, fn, ln);
+ }
+ 
+ unittest
+@@ -3669,7 +3838,10 @@ unittest
+     {
+         auto f = 3.14;
+         formatReflectTest(f, "%s",  `3.14`);
+-        formatReflectTest(f, "%e",  `3.140000e+00`);
++        version (MinGW)
++            formatReflectTest(f, "%e",  `3.140000e+000`);
++        else
++            formatReflectTest(f, "%e",  `3.140000e+00`);
+         formatReflectTest(f, "%f",  `3.140000`);
+         formatReflectTest(f, "%g",  `3.14`);
+     }
+@@ -3714,12 +3886,14 @@ unittest
+     void aaTest()
+     {
+         auto aa = [1:"hello", 2:"world"];
+-        formatReflectTest(aa, "%s",                     `[1:"hello", 2:"world"]`);
+-        formatReflectTest(aa, "[%(%s->%s, %)]",         `[1->"hello", 2->"world"]`);
+-        formatReflectTest(aa, "{%([%s=%(%c%)]%|; %)}",  `{[1=hello]; [2=world]}`);
++        formatReflectTest(aa, "%s",                     [`[1:"hello", 2:"world"]`, `[2:"world", 1:"hello"]`]);
++        formatReflectTest(aa, "[%(%s->%s, %)]",         [`[1->"hello", 2->"world"]`, `[2->"world", 1->"hello"]`]);
++        formatReflectTest(aa, "{%([%s=%(%c%)]%|; %)}",  [`{[1=hello]; [2=world]}`, `{[2=world]; [1=hello]}`]);
+     }
+ 
+-    checkCTFEable!({
++    import std.exception;
++    assertCTFEable!(
++    {
+         booleanTest();
+         integerTest();
+         if (!__ctfe) floatingTest();    // snprintf
+@@ -4841,7 +5015,6 @@ void doFormat(void delegate(dchar) putc,
+             //doFormat(putc, (&valti)[0 .. 1], p);
+             version (Win64)
+             {
+-                static assert (false, "needs checking");
+                 void* q = void;
+ 
+                 if (tsize > 8 && m != Mangle.Tsarray)
+@@ -4862,7 +5035,7 @@ void doFormat(void delegate(dchar) putc,
+                     va.stack_args = p;
+                     argptr = *cast(va_list*) &va;
+                 }
+-                else version(ARM)
++                else version (ARM)
+                     *cast(void**) &argptr = p;
+                 else
+                     static assert(false, "unsupported platform");
+@@ -4911,7 +5084,6 @@ void doFormat(void delegate(dchar) putc,
+                     argptr = cast(va_list) pkey;
+                 else version (Win64)
+                 {
+-                    static assert (false, "needs checking");
+                     void* q = void;
+                     if (keysize > 8 && m != Mangle.Tsarray)
+                     {   q = pkey;
+@@ -4926,9 +5098,7 @@ void doFormat(void delegate(dchar) putc,
+                     argptr = *cast(va_list*) &va;
+                 }
+                 else version (ARM)
+-                {
+                     *cast(void**) &argptr = pkey;
+-                }
+                 else static assert(false, "unsupported platform");
+ 
+                 ti = keyti;
+@@ -4941,7 +5111,6 @@ void doFormat(void delegate(dchar) putc,
+                     argptr = cast(va_list) pvalue;
+                 else version (Win64)
+                 {
+-                    static assert (false, "needs checking");
+                     void* q2 = void;
+                     auto valuesize = valti.tsize;
+                     if (valuesize > 8 && m != Mangle.Tsarray)
+@@ -5104,13 +5273,13 @@ void doFormat(void delegate(dchar) putc,
+ 
+             case Mangle.Tsarray:
+                 version (X86)
+-                    putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
++                    putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, (cast(TypeInfo_StaticArray)ti).next);
+                 else version (Win64)
+-                    putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
++                    putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, (cast(TypeInfo_StaticArray)ti).next);
+                 else version (X86_64)
+-                    putArray((cast(__va_list*)argptr).stack_args, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
++                    putArray((cast(__va_list*)argptr).stack_args, (cast(TypeInfo_StaticArray)ti).len, (cast(TypeInfo_StaticArray)ti).next);
+                 else version (ARM)
+-                    putArray(*cast(void**) &argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
++                    putArray(*cast(void**) &argptr, (cast(TypeInfo_StaticArray)ti).len, (cast(TypeInfo_StaticArray)ti).next);
+                 else static assert(false, "unsupported platform");
+                 return;
+ 
+@@ -5119,7 +5288,7 @@ void doFormat(void delegate(dchar) putc,
+                 if (ti.classinfo.name.length == 14 &&
+                     ti.classinfo.name[9..14] == "Array")
+                 { // array of non-primitive types
+-                  TypeInfo tn = cast()(cast(TypeInfo_Array)ti).next;
++                  TypeInfo tn = (cast(TypeInfo_Array)ti).next;
+                   tn = skipCI(tn);
+                   switch (cast(Mangle)tn.classinfo.name[9])
+                   {
+@@ -5138,7 +5307,7 @@ void doFormat(void delegate(dchar) putc,
+                 { // associative array
+                   ubyte[long] vaa = va_arg!(ubyte[long])(argptr);
+                   putAArray(vaa,
+-                        cast()(cast(TypeInfo_AssociativeArray)ti).next,
++                        (cast(TypeInfo_AssociativeArray)ti).next,
+                         (cast(TypeInfo_AssociativeArray)ti).key);
+                   return;
+                 }
+@@ -5211,7 +5380,6 @@ void doFormat(void delegate(dchar) putc,
+                 }
+                 else version(Win64)
+                 {
+-                    static assert (false, "needs checking");
+                     void* p = argptr;
+                     if (tis.tsize > 8)
+                         p = *cast(void**)p;
+@@ -5378,7 +5546,10 @@ void doFormat(void delegate(dchar) putc,
+ 
+     Lcomplex:
+         putreal(vcreal.re);
+-        putc('+');
++        if (vcreal.im >= 0)
++        {
++            putc('+');
++        }
+         putreal(vcreal.im);
+         putc('i');
+         return;
+@@ -5411,7 +5582,7 @@ void doFormat(void delegate(dchar) putc,
+             if (ti.classinfo.name.length == 14 &&
+                     ti.classinfo.name[9..14] == "Array")
+             {
+-                TypeInfo tn = cast()(cast(TypeInfo_Array)ti).next;
++                TypeInfo tn = (cast(TypeInfo_Array)ti).next;
+                 tn = skipCI(tn);
+                 switch (cast(Mangle)tn.classinfo.name[9])
+                 {
+@@ -5624,6 +5795,9 @@ unittest
+     //else version (OSX)
+     //    assert(s == "1.67 -0XA.3D70A3D70A3D8P-3 nan", s);
+     //else
++    version (MinGW)
++        assert(s == "1.67 -0XA.3D70A3D70A3D8P-3 nan", s);
++    else
+         assert(s == "1.67 -0X1.47AE147AE147BP+0 nan", s);
+ 
+     s = std.string.format("%x %X", 0x1234AF, 0xAFAFAFAF);
+@@ -5879,9 +6053,9 @@ unittest
+ 
+     immutable(char[5])[int] aa = ([3:"hello", 4:"betty"]);
+     r = std.string.format("%s", aa.values);
+-    assert(r == `["hello", "betty"]`);
++    assert(r == `["hello", "betty"]` || r == `["betty", "hello"]`);
+     r = std.string.format("%s", aa);
+-    assert(r == `[3:"hello", 4:"betty"]`);
++    assert(r == `[3:"hello", 4:"betty"]` || r == `[4:"betty", 3:"hello"]`);
+ 
+     static const dchar[] ds = ['a','b'];
+     for (int j = 0; j < ds.length; ++j)
+@@ -5907,3 +6081,12 @@ unittest
+     formattedWrite(stream, "%2$.*1$d", 12, 10);
+     assert(stream.data == "000000000010", stream.data);
+ }
++
++unittest
++{
++    // bug 6893
++    enum E : ulong { A, B, C }
++    auto stream = appender!(char[])();
++    formattedWrite(stream, "%s", E.C);
++    assert(stream.data == "C");
++}
+--- a/src/libphobos/src/std/functional.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/functional.d	2014-04-01 16:32:51.000000000 +0100
+@@ -20,7 +20,7 @@ Distributed under the Boost Software Lic
+ */
+ module std.functional;
+ 
+-import std.metastrings, std.traits, std.typecons, std.typetuple;
++import std.traits, std.typecons, std.typetuple;
+ // for making various functions visible in *naryFun
+ import std.algorithm, std.conv, std.exception, std.math, std.range, std.string;
+ 
+--- a/src/libphobos/src/std/getopt.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/getopt.d	2014-04-01 16:32:51.000000000 +0100
+@@ -84,14 +84,20 @@ void main(string[] args)
+  Depending on the type of the pointer being bound, $(D getopt)
+  recognizes the following kinds of options:
+ 
+- $(OL $(LI $(I Boolean options). These are the simplest options; all
+- they do is set a Boolean to $(D true):
++ $(OL $(LI $(I Boolean options). A lone argument sets the option to $(D true).
++ Additionally $(B true) or $(B false) can be set within the option separated with
++ an "=" sign:
+ 
+ ---------
+-  bool verbose, debugging;
++  bool verbose = false, debugging = true;
+   getopt(args, "verbose", &verbose, "debug", &debugging);
+ ---------
+ 
++ To set $(D verbose) to $(D true), invoke the program with either $(D
++ --verbose) or $(D --verbose=true).
++
++ To set $(D debugging) to $(D false), invoke the program with $(D --debugging=false).
++
+  )$(LI $(I Numeric options.) If an option is bound to a numeric type, a
+  number is expected as the next option, or right within the option
+  separated with an "=" sign:
+@@ -172,15 +178,15 @@ Invoking the program with e.g. "--tune=a
+ set $(D tuningParms) to [ "alpha" : 0.5, "beta" : 0.6 ]. In general,
+ keys and values can be of any parsable types.)
+ 
+-$(LI $(I Delegate options.) An option can be bound to a delegate with
+-the signature $(D void delegate()), $(D void delegate(string option))
+-or $(D void delegate(string option, string value)).
+-
+-$(UL $(LI In the $(D void delegate()) case, the delegate is invoked
+-whenever the option is seen.) $(LI In the $(D void delegate(string
+-option)) case, the option string (without the leading dash(es)) is
+-passed to the delegate. After that, the option string is considered
+-handled and removed from the options array.
++$(LI $(I Callback options.) An option can be bound to a function or
++delegate with the signature $(D void function()), $(D void function(string option)),
++$(D void function(string option, string value)), or their delegate equivalents.
++
++$(UL $(LI If the callback doesn't take any arguments, the callback is invoked
++whenever the option is seen.) $(LI If the callback takes one string argument,
++the option string (without the leading dash(es)) is passed to the callback.
++After that, the option string is considered handled and removed from the
++options array.
+ 
+ ---------
+ void main(string[] args)
+@@ -202,10 +208,10 @@ void main(string[] args)
+ }
+ ---------
+ 
+-)$(LI In the $(D void delegate(string option, string value)) case, the
++)$(LI If the callback takes two string arguments, the
+ option string is handled as an option with one argument, and parsed
+ accordingly. The option and its value are passed to the
+-delegate. After that, whatever was passed to the delegate is
++callback. After that, whatever was passed to the callback is
+ considered handled and removed from the list.
+ 
+ ---------
+@@ -366,7 +372,7 @@ enum config {
+     noPassThrough,
+     /// Stop at first argument that does not look like an option
+     stopOnFirstNonOption,
+-};
++}
+ 
+ private void getoptImpl(T...)(ref string[] args,
+     ref configuration cfg, T opts)
+@@ -398,14 +404,19 @@ private void getoptImpl(T...)(ref string
+     else
+     {
+         // no more options to look for, potentially some arguments left
+-        foreach (a ; args[1 .. $]) {
++        foreach (i, a ; args[1 .. $]) {
+             if (!a.length || a[0] != optionChar)
+             {
+                 // not an option
+                 if (cfg.stopOnFirstNonOption) break;
+                 continue;
+             }
+-            if (endOfOptions.length && a == endOfOptions) break;
++            if (endOfOptions.length && a == endOfOptions)
++            {
++                // Consume the "--"
++                args = args.remove(i + 1);
++                break;
++            }
+             if (!cfg.passThrough)
+             {
+                 throw new Exception("Unrecognized option "~a);
+@@ -451,17 +462,25 @@ void handleOption(R)(string option, R re
+ 
+         static if (is(typeof(*receiver) == bool))
+         {
++            // parse '--b=true/false'
++            if (val.length)
++            {
++                *receiver = parse!(typeof(*receiver))(val);
++                break;
++            }
++
++            // no argument means set it to true
+             *receiver = true;
+             break;
+         }
+         else
+         {
+             // non-boolean option, which might include an argument
+-            //enum isDelegateWithOneParameter = is(typeof(receiver("")) : void);
+-            enum isDelegateWithLessThanTwoParameters =
+-                is(typeof(receiver) == delegate) &&
++            //enum isCallbackWithOneParameter = is(typeof(receiver("")) : void);
++            enum isCallbackWithLessThanTwoParameters =
++                (is(typeof(receiver) == delegate) || is(typeof(*receiver) == function)) &&
+                 !is(typeof(receiver("", "")));
+-            if (!isDelegateWithLessThanTwoParameters && !(val.length) && !incremental) {
++            if (!isCallbackWithLessThanTwoParameters && !(val.length) && !incremental) {
+                 // Eat the next argument too.  Check to make sure there's one
+                 // to be eaten first, though.
+                 enforce(i < args.length,
+@@ -485,7 +504,8 @@ void handleOption(R)(string option, R re
+                 // string receiver
+                 *receiver = to!(typeof(*receiver))(val);
+             }
+-            else static if (is(typeof(receiver) == delegate))
++            else static if (is(typeof(receiver) == delegate) ||
++                            is(typeof(*receiver) == function))
+             {
+                 static if (is(typeof(receiver("", "")) : void))
+                 {
+@@ -629,6 +649,7 @@ private void setConfig(ref configuration
+ 
+ unittest
+ {
++    import std.math;
+     uint paranoid = 2;
+     string[] args = (["program.name",
+                       "--paranoid", "--paranoid", "--paranoid"]).dup;
+@@ -675,8 +696,8 @@ unittest
+     getopt(args, "tune", &tuningParms);
+     assert(args.length == 1);
+     assert(tuningParms.length == 2);
+-    assert(tuningParms["alpha"] == 0.5);
+-    assert(tuningParms["beta"] == 0.6);
++    assert(approxEqual(tuningParms["alpha"], 0.5));
++    assert(approxEqual(tuningParms["beta"], 0.6));
+ 
+     uint verbosityLevel = 1;
+     void myHandler(string option)
+@@ -743,6 +764,39 @@ unittest
+         "foo", &foo,
+         "bar", &bar);
+     assert(foo && !bar && args[1] == "nonoption" && args[2] == "--zab");
++
++    args = (["program.name", "--fb1", "--fb2=true", "--tb1=false"]).dup;
++    bool fb1, fb2;
++    bool tb1 = true;
++    getopt(args, "fb1", &fb1, "fb2", &fb2, "tb1", &tb1);
++    assert(fb1 && fb2 && !tb1);
++
++    // test function callbacks
++
++    static class MyEx : Exception
++    {
++        this() { super(""); }
++        this(string option) { this(); this.option = option; }
++        this(string option, string value) { this(option); this.value = value; }
++
++        string option;
++        string value;
++    }
++
++    static void myStaticHandler1() { throw new MyEx(); }
++    args = (["program.name", "--verbose"]).dup;
++    try { getopt(args, "verbose", &myStaticHandler1); assert(0); }
++    catch (MyEx ex) { assert(ex.option is null && ex.value is null); }
++
++    static void myStaticHandler2(string option) { throw new MyEx(option); }
++    args = (["program.name", "--verbose"]).dup;
++    try { getopt(args, "verbose", &myStaticHandler2); assert(0); }
++    catch (MyEx ex) { assert(ex.option == "verbose" && ex.value is null); }
++
++    static void myStaticHandler3(string option, string value) { throw new MyEx(option, value); }
++    args = (["program.name", "--verbose", "2"]).dup;
++    try { getopt(args, "verbose", &myStaticHandler3); assert(0); }
++    catch (MyEx ex) { assert(ex.option == "verbose" && ex.value == "2"); }
+ }
+ 
+ unittest
+@@ -780,3 +834,12 @@ unittest
+     getopt(args, "t", &foo);
+     assert(foo == ["a":1]);
+ }
++
++unittest
++{
++    // From bugzilla 9583
++    int opt;
++    auto args = ["prog", "--opt=123", "--", "--a", "--b", "--c"];
++    getopt(args, "opt", &opt);
++    assert(args == ["prog", "--a", "--b", "--c"]);
++}
+--- a/src/libphobos/src/std/internal/digest/sha_SSSE3.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/internal/digest/sha_SSSE3.d	2014-04-01 16:32:51.000000000 +0100
+@@ -214,6 +214,8 @@ version(USE_SSSE3)
+      */
+     private nothrow pure string[] weave(string[] seq1, string[] seq2, uint dist = 1)
+     {
++        import std.algorithm : min;
++
+         string[] res = [];
+         auto i1 = 0, i2 = 0;
+         while (i1 < seq1.length || i2 < seq2.length)
+--- a/src/libphobos/src/std/internal/math/biguintcore.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/internal/math/biguintcore.d	2014-04-01 16:32:51.000000000 +0100
+@@ -73,6 +73,13 @@ else static if (BigDigit.sizeof == long.
+ }
+ else static assert(0, "Unsupported BigDigit size");
+ 
++private import std.traits:isIntegral;
++enum BigDigitBits = BigDigit.sizeof*8;
++template maxBigDigits(T) if (isIntegral!T)
++{
++    enum maxBigDigits = (T.sizeof+BigDigit.sizeof-1)/BigDigit.sizeof;
++}
++
+ enum BigDigit [] ZERO = [0];
+ enum BigDigit [] ONE = [1];
+ enum BigDigit [] TWO = [2];
+@@ -85,15 +92,19 @@ public:
+ struct BigUint
+ {
+ private:
+-    invariant()
++    pure invariant() 
+     {
+         assert( data.length == 1 || data[$-1] != 0 );
+     }
+     BigDigit [] data = ZERO;
+-    this(BigDigit [] x)
++    this(BigDigit [] x) pure
+     {
+        data = x;
+     }
++    this(T)(T x) pure if (isIntegral!T)
++    {
++        opAssign(x);
++    }
+ public:
+     // Length in uints
+     size_t uintLength() pure const
+@@ -126,14 +137,7 @@ public:
+         static if (BigDigit.sizeof == int.sizeof)
+         {
+             if (data.length == n*2 + 1) return data[n*2];
+-            version(LittleEndian)
+-            {
+-                return data[n*2] + ((cast(ulong)data[n*2 + 1]) << 32 );
+-            }
+-            else
+-            {
+-                return data[n*2 + 1] + ((cast(ulong)data[n*2]) << 32 );
+-            }
++            return data[n*2] + ((cast(ulong)data[n*2 + 1]) << 32 );
+         }
+         else static if (BigDigit.sizeof == long.sizeof)
+         {
+@@ -154,7 +158,7 @@ public:
+     }
+ public:
+     ///
+-    void opAssign(Tulong)(Tulong u)  if (is (Tulong == ulong))
++    void opAssign(Tulong)(Tulong u) pure if (is (Tulong == ulong))
+     {
+         if (u == 0) data = ZERO;
+         else if (u == 1) data = ONE;
+@@ -185,13 +189,13 @@ public:
+             }
+         }
+     }
+-    void opAssign(Tdummy = void)(BigUint y)
++    void opAssign(Tdummy = void)(BigUint y) pure
+     {
+         this.data = y.data;
+     }
+ 
+     ///
+-    int opCmp(Tdummy = void)(BigUint y)
++    int opCmp(Tdummy = void)(const BigUint y) pure const
+     {
+         if (data.length != y.data.length)
+             return (data.length > y.data.length) ?  1 : -1;
+@@ -202,17 +206,26 @@ public:
+     }
+ 
+     ///
+-    int opCmp(Tulong)(Tulong y) if (is (Tulong == ulong))
++    int opCmp(Tulong)(Tulong y) pure if(is (Tulong == ulong))
+     {
+-        if (data.length > 2)
++        if (data.length > maxBigDigits!Tulong)
+             return 1;
+-        uint ylo = cast(uint)(y & 0xFFFF_FFFF);
+-        uint yhi = cast(uint)(y >> 32);
+-        if (data.length == 2 && data[1] != yhi)
+-            return data[1] > yhi ? 1: -1;
+-        if (data[0] == ylo)
+-            return 0;
+-        return data[0] > ylo ? 1: -1;
++
++        foreach_reverse (i; 0 .. maxBigDigits!Tulong)
++        {
++            BigDigit tmp = cast(BigDigit)(y>>(i*BigDigitBits));
++            if (tmp == 0)
++                if (data.length >= i+1)
++                    return 1;
++                else
++                    continue;
++            else
++                if (i+1 > data.length)
++                    return -1;
++                else if (tmp != data[i])
++                    return data[i] > tmp ? 1 : -1;
++        }
++        return 0;
+     }
+ 
+     bool opEquals(Tdummy = void)(ref const BigUint y) pure const
+@@ -233,7 +246,7 @@ public:
+         return (data[0] == ylo);
+     }
+ 
+-    bool isZero() pure const
++    bool isZero() pure const nothrow @safe
+     {
+         return data.length == 1 && data[0] == 0;
+     }
+@@ -244,7 +257,7 @@ public:
+     }
+ 
+     // the extra bytes are added to the start of the string
+-    char [] toDecimalString(int frontExtraBytes) const
++    char [] toDecimalString(int frontExtraBytes) const pure
+     {
+         auto predictlength = 20+20*(data.length/2); // just over 19
+         char [] buff = new char[frontExtraBytes + predictlength];
+@@ -259,7 +272,8 @@ public:
+      *  between every 8 digits.
+      *  Separator characters do not contribute to the minPadding.
+      */
+-    char [] toHexString(int frontExtraBytes, char separator = 0, int minPadding=0, char padChar = '0') const
++    char [] toHexString(int frontExtraBytes, char separator = 0, 
++			int minPadding=0, char padChar = '0') const pure
+     {
+         // Calculate number of extra padding bytes
+         size_t extraPad = (minPadding > data.length * 2 * BigDigit.sizeof)
+@@ -321,7 +335,7 @@ public:
+     }
+ 
+     // return false if invalid character found
+-    bool fromHexString(const(char)[] s)
++    bool fromHexString(const(char)[] s) pure
+     {
+         //Strip leading zeros
+         int firstNonZero = 0;
+@@ -369,7 +383,7 @@ public:
+     }
+ 
+     // return true if OK; false if erroneous characters found
+-    bool fromDecimalString(const(char)[] s)
++    bool fromDecimalString(const(char)[] s) pure
+     {
+         //Strip leading zeros
+         int firstNonZero = 0;
+@@ -395,7 +409,7 @@ public:
+     // All of these member functions create a new BigUint.
+ 
+     // return x >> y
+-    BigUint opShr(Tulong)(Tulong y) if (is (Tulong == ulong))
++    BigUint opShr(Tulong)(Tulong y) pure if (is (Tulong == ulong))
+     {
+         assert(y>0);
+         uint bits = cast(uint)y & BIGDIGITSHIFTMASK;
+@@ -415,7 +429,7 @@ public:
+     }
+ 
+     // return x << y
+-    BigUint opShl(Tulong)(Tulong y) if (is (Tulong == ulong))
++    BigUint opShl(Tulong)(Tulong y) pure if (is (Tulong == ulong))
+     {
+         assert(y>0);
+         if (isZero()) return this;
+@@ -440,8 +454,8 @@ public:
+ 
+     // If wantSub is false, return x + y, leaving sign unchanged
+     // If wantSub is true, return abs(x - y), negating sign if x < y
+-    static BigUint addOrSubInt(Tulong)(const BigUint x, Tulong y, bool wantSub, ref bool sign)
+-        if (is(Tulong == ulong))
++    static BigUint addOrSubInt(Tulong)(const BigUint x, Tulong y, 
++			bool wantSub, ref bool sign) pure if (is(Tulong == ulong))
+     {
+         BigUint r;
+         if (wantSub)
+@@ -487,6 +501,7 @@ public:
+     // If wantSub is false, return x + y, leaving sign unchanged.
+     // If wantSub is true, return abs(x - y), negating sign if x>> 32);
+@@ -526,7 +541,7 @@ public:
+ 
+     /*  return x * y.
+      */
+-    static BigUint mul(BigUint x, BigUint y)
++    static BigUint mul(BigUint x, BigUint y) pure
+     {
+         if (y==0 || x == 0)
+             return BigUint(ZERO);
+@@ -547,7 +562,7 @@ public:
+     }
+ 
+     // return x / y
+-    static BigUint divInt(T)(BigUint x, T y) if ( is(T == uint) )
++    static BigUint divInt(T)(BigUint x, T y) pure if ( is(T == uint) )
+     {
+         if (y == 1)
+             return x;
+@@ -572,7 +587,7 @@ public:
+     }
+ 
+     // return x % y
+-    static uint modInt(T)(BigUint x, T y) if ( is(T == uint) )
++    static uint modInt(T)(BigUint x, T y) pure if ( is(T == uint) )
+     {
+         assert(y!=0);
+         if ((y&(-y)) == y)
+@@ -591,7 +606,7 @@ public:
+     }
+ 
+     // return x / y
+-    static BigUint div(BigUint x, BigUint y)
++    static BigUint div(BigUint x, BigUint y) pure
+     {
+         if (y.data.length > x.data.length)
+             return BigUint(ZERO);
+@@ -603,7 +618,7 @@ public:
+     }
+ 
+     // return x % y
+-    static BigUint mod(BigUint x, BigUint y)
++    static BigUint mod(BigUint x, BigUint y) pure
+     {
+         if (y.data.length > x.data.length) return x;
+         if (y.data.length == 1)
+@@ -624,7 +639,7 @@ public:
+      * exponentiation is used.
+      * Memory allocation is minimized: at most one temporary BigUint is used.
+      */
+-    static BigUint pow(BigUint x, ulong y)
++    static BigUint pow(BigUint x, ulong y) pure
+     {
+         // Deal with the degenerate cases first.
+         if (y==0) return BigUint(ONE);
+@@ -833,11 +848,24 @@ public:
+         return result;
+     }
+ 
++    // Implement toHash so that BigUint works properly as an AA key.
++    size_t toHash() const @trusted nothrow
++    {
++        return typeid(data).getHash(&data);
++    }
++
+ } // end BigUint
+ 
++unittest
++{
++    // ulong comparison test
++    BigUint a = [1];
++    assert(a == 1);
++    assert(a < 0x8000_0000_0000_0000UL); // bug 9548
++}
+ 
+ // Remove leading zeros from x, to restore the BigUint invariant
+-BigDigit[] removeLeadingZeros(BigDigit [] x)
++BigDigit[] removeLeadingZeros(BigDigit [] x) pure
+ {
+     size_t k = x.length;
+     while(k>1 && x[k - 1]==0) --k;
+@@ -853,6 +881,18 @@ unittest
+ }
+ 
+ 
++unittest
++{
++    BigUint r;
++    r = 5UL;
++    assert(r.peekUlong(0) == 5UL);
++    assert(r.peekUint(0) == 5U);
++    r = 0x1234_5678_9ABC_DEF0UL;
++    assert(r.peekUlong(0) == 0x1234_5678_9ABC_DEF0UL);
++    assert(r.peekUint(0) == 0x9ABC_DEF0U);
++}
++
++
+ // Pow tests
+ unittest
+ {
+@@ -903,7 +943,7 @@ unittest
+ private:
+ 
+ // works for any type
+-T intpow(T)(T x, ulong n)
++T intpow(T)(T x, ulong n) pure
+ {
+     T p;
+ 
+@@ -938,7 +978,7 @@ T intpow(T)(T x, ulong n)
+ 
+ 
+ //  returns the maximum power of x that will fit in a uint.
+-int highestPowerBelowUintMax(uint x)
++int highestPowerBelowUintMax(uint x) pure
+ {
+      assert(x>1);
+      static immutable ubyte [22] maxpwr = [ 31, 20, 15, 13, 12, 11, 10, 10, 9, 9,
+@@ -953,7 +993,7 @@ int highestPowerBelowUintMax(uint x)
+ }
+ 
+ //  returns the maximum power of x that will fit in a ulong.
+-int highestPowerBelowUlongMax(uint x)
++int highestPowerBelowUlongMax(uint x) pure
+ {
+      assert(x>1);
+      static immutable ubyte [39] maxpwr = [ 63, 40, 31, 27, 24, 22, 21, 20, 19, 18,
+@@ -975,7 +1015,7 @@ int highestPowerBelowUlongMax(uint x)
+ 
+ version(unittest) {
+ 
+-int slowHighestPowerBelowUintMax(uint x)
++int slowHighestPowerBelowUintMax(uint x) pure
+ {
+      int pwr = 1;
+      for (ulong q = x;x*q < cast(ulong)uint.max; ) {
+@@ -996,7 +1036,7 @@ unittest
+ /*  General unsigned subtraction routine for bigints.
+  *  Sets result = x - y. If the result is negative, negative will be true.
+  */
+-BigDigit [] sub(BigDigit[] x, BigDigit[] y, bool *negative)
++BigDigit [] sub(BigDigit[] x, BigDigit[] y, bool *negative) pure
+ {
+     if (x.length == y.length)
+     {
+@@ -1051,7 +1091,7 @@ BigDigit [] sub(BigDigit[] x, BigDigit[]
+ 
+ 
+ // return a + b
+-BigDigit [] add(BigDigit[] a, BigDigit [] b)
++BigDigit [] add(BigDigit[] a, BigDigit [] b) pure
+ {
+     BigDigit [] x, y;
+     if (a.length < b.length)
+@@ -1083,7 +1123,7 @@ BigDigit [] add(BigDigit[] a, BigDigit [
+ 
+ /**  return x + y
+  */
+-BigDigit [] addInt(const BigDigit[] x, ulong y)
++BigDigit [] addInt(const BigDigit[] x, ulong y) pure
+ {
+     uint hi = cast(uint)(y >>> 32);
+     uint lo = cast(uint)(y& 0xFFFF_FFFF);
+@@ -1106,7 +1146,7 @@ BigDigit [] addInt(const BigDigit[] x, u
+ /** Return x - y.
+  *  x must be greater than y.
+  */
+-BigDigit [] subInt(const BigDigit[] x, ulong y)
++BigDigit [] subInt(const BigDigit[] x, ulong y) pure
+ {
+     uint hi = cast(uint)(y >>> 32);
+     uint lo = cast(uint)(y & 0xFFFF_FFFF);
+@@ -1131,6 +1171,7 @@ BigDigit [] subInt(const BigDigit[] x, u
+  *
+  */
+ void mulInternal(BigDigit[] result, const(BigDigit)[] x, const(BigDigit)[] y)
++	pure
+ {
+     assert( result.length == x.length + y.length );
+     assert( y.length > 0 );
+@@ -1260,7 +1301,7 @@ void mulInternal(BigDigit[] result, cons
+  *   NOTE: If the highest half-digit of x is zero, the highest digit of result will
+  *   also be zero.
+  */
+-void squareInternal(BigDigit[] result, BigDigit[] x)
++void squareInternal(BigDigit[] result, BigDigit[] x) pure
+ {
+   // Squaring is potentially half a multiply, plus add the squares of
+   // the diagonal elements.
+@@ -1283,7 +1324,8 @@ void squareInternal(BigDigit[] result, B
+ import core.bitop : bsr;
+ 
+ /// if remainder is null, only calculate quotient.
+-void divModInternal(BigDigit [] quotient, BigDigit[] remainder, BigDigit [] u, BigDigit [] v)
++void divModInternal(BigDigit [] quotient, BigDigit[] remainder, BigDigit [] u,
++		BigDigit [] v) pure
+ {
+     assert(quotient.length == u.length - v.length + 1);
+     assert(remainder == null || remainder.length == v.length);
+@@ -1351,6 +1393,7 @@ private:
+ // buff.length must be data.length*8 if separator is zero,
+ // or data.length*9 if separator is non-zero. It will be completely filled.
+ char [] biguintToHex(char [] buff, const BigDigit [] data, char separator=0)
++	pure
+ {
+     int x=0;
+     for (ptrdiff_t i=data.length - 1; i>=0; --i)
+@@ -1378,7 +1421,7 @@ char [] biguintToHex(char [] buff, const
+  * Returns:
+  *    the lowest index of buff which was used.
+  */
+-size_t biguintToDecimal(char [] buff, BigDigit [] data)
++size_t biguintToDecimal(char [] buff, BigDigit [] data) pure
+ {
+     ptrdiff_t sofar = buff.length;
+     // Might be better to divide by (10^38/2^32) since that gives 38 digits for
+@@ -1415,7 +1458,7 @@ size_t biguintToDecimal(char [] buff, Bi
+  * Returns:
+  *    the highest index of data which was used.
+  */
+-int biguintFromDecimal(BigDigit [] data, const(char)[] s)
++int biguintFromDecimal(BigDigit [] data, const(char)[] s) pure
+ in
+ {
+     assert((data.length >= 2) || (data.length == 1 && s.length == 1));
+@@ -1465,9 +1508,9 @@ body
+             // Multiply existing number by 10^19, then add y1.
+             if (hi>0)
+             {
+-                data[hi] = multibyteMul(data[0..hi], data[0..hi], 1220703125*2, 0); // 5^13*2 = 0x9184_E72A
++                data[hi] = multibyteMul(data[0..hi], data[0..hi], 1220703125*2u, 0); // 5^13*2 = 0x9184_E72A
+                 ++hi;
+-                data[hi] = multibyteMul(data[0..hi], data[0..hi], 15625*262144, 0); // 5^6*2^18 = 0xF424_0000
++                data[hi] = multibyteMul(data[0..hi], data[0..hi], 15625*262144u, 0); // 5^6*2^18 = 0xF424_0000
+                 ++hi;
+             }
+             else
+@@ -1501,14 +1544,14 @@ body
+     {
+         if (hi == 0)
+         {
++            data[0] = cast(uint)y;
+             if (data.length == 1)
+             {
+-                data[0] = cast(uint)(y & 0xFFFF_FFFF);
+                 hi = 1;
+             }
+             else
+             {
+-                *cast(ulong *)(&data[hi]) = y;
++                data[1] = cast(uint)(y >>> 32);
+                 hi=2;
+             }
+         }
+@@ -1548,7 +1591,8 @@ private:
+ // with COW.
+ 
+ // Classic 'schoolbook' multiplication.
+-void mulSimple(BigDigit[] result, const(BigDigit) [] left, const(BigDigit)[] right)
++void mulSimple(BigDigit[] result, const(BigDigit) [] left, 
++		const(BigDigit)[] right) pure
+ in
+ {
+     assert(result.length == left.length + right.length);
+@@ -1561,7 +1605,7 @@ body
+ }
+ 
+ // Classic 'schoolbook' squaring
+-void squareSimple(BigDigit[] result, const(BigDigit) [] x)
++void squareSimple(BigDigit[] result, const(BigDigit) [] x) pure
+ in
+ {
+     assert(result.length == 2*x.length);
+@@ -1576,7 +1620,7 @@ body
+ // add two uints of possibly different lengths. Result must be as long
+ // as the larger length.
+ // Returns carry (0 or 1).
+-uint addSimple(BigDigit [] result, BigDigit [] left, BigDigit [] right)
++uint addSimple(BigDigit [] result, BigDigit [] left, BigDigit [] right) pure
+ in
+ {
+     assert(result.length == left.length);
+@@ -1597,7 +1641,8 @@ body
+ 
+ //  result = left - right
+ // returns carry (0 or 1)
+-BigDigit subSimple(BigDigit [] result,const(BigDigit) [] left, const(BigDigit) [] right)
++BigDigit subSimple(BigDigit [] result,const(BigDigit) [] left, 
++		const(BigDigit) [] right) pure
+ in
+ {
+     assert(result.length == left.length);
+@@ -1620,7 +1665,7 @@ body
+ /* result = result - right
+  * Returns carry = 1 if result was less than right.
+ */
+-BigDigit subAssignSimple(BigDigit [] result, const(BigDigit) [] right)
++BigDigit subAssignSimple(BigDigit [] result, const(BigDigit) [] right) pure
+ {
+     assert(result.length >= right.length);
+     uint c = multibyteSub(result[0..right.length], result[0..right.length], right, 0);
+@@ -1631,7 +1676,7 @@ BigDigit subAssignSimple(BigDigit [] res
+ 
+ /* result = result + right
+ */
+-BigDigit addAssignSimple(BigDigit [] result, const(BigDigit) [] right)
++BigDigit addAssignSimple(BigDigit [] result, const(BigDigit) [] right) pure
+ {
+     assert(result.length >= right.length);
+     uint c = multibyteAdd(result[0..right.length], result[0..right.length], right, 0);
+@@ -1642,7 +1687,8 @@ BigDigit addAssignSimple(BigDigit [] res
+ 
+ /* performs result += wantSub? - right : right;
+ */
+-BigDigit addOrSubAssignSimple(BigDigit [] result, const(BigDigit) [] right, bool wantSub)
++BigDigit addOrSubAssignSimple(BigDigit [] result, const(BigDigit) [] right,
++		bool wantSub) pure
+ {
+     if (wantSub)
+         return subAssignSimple(result, right);
+@@ -1652,7 +1698,7 @@ BigDigit addOrSubAssignSimple(BigDigit [
+ 
+ 
+ // return true if x= y.length);
+     auto k = x.length-1;
+@@ -1667,6 +1713,7 @@ bool less(const(BigDigit)[] x, const(Big
+ 
+ // Set result = abs(x-y), return true if result is negative(x= y.length) ? x.length : y.length);
+ 
+@@ -1706,7 +1753,7 @@ bool inplaceSub(BigDigit[] result, const
+ /* Determine how much space is required for the temporaries
+  * when performing a Karatsuba multiplication.
+  */
+-size_t karatsubaRequiredBuffSize(size_t xlen)
++size_t karatsubaRequiredBuffSize(size_t xlen) pure
+ {
+     return xlen <= KARATSUBALIMIT ? 0 : 2*xlen; // - KARATSUBALIMIT+2;
+ }
+@@ -1722,7 +1769,8 @@ size_t karatsubaRequiredBuffSize(size_t
+ * Params:
+ * scratchbuff      An array long enough to store all the temporaries. Will be destroyed.
+ */
+-void mulKaratsuba(BigDigit [] result, const(BigDigit) [] x, const(BigDigit)[] y, BigDigit [] scratchbuff)
++void mulKaratsuba(BigDigit [] result, const(BigDigit) [] x, 
++		const(BigDigit)[] y, BigDigit [] scratchbuff) pure
+ {
+     assert(x.length >= y.length);
+           assert(result.length < uint.max, "Operands too large");
+@@ -1826,7 +1874,8 @@ void mulKaratsuba(BigDigit [] result, co
+     addOrSubAssignSimple(result[half..$], mid, !midNegative);
+ }
+ 
+-void squareKaratsuba(BigDigit [] result, BigDigit [] x, BigDigit [] scratchbuff)
++void squareKaratsuba(BigDigit [] result, BigDigit [] x, 
++		BigDigit [] scratchbuff) pure
+ {
+     // See mulKaratsuba for implementation comments.
+     // Squaring is simpler, since it never gets asymmetric.
+@@ -1883,6 +1932,7 @@ void squareKaratsuba(BigDigit [] result,
+  * u[0..v.length] holds the remainder.
+  */
+ void schoolbookDivMod(BigDigit [] quotient, BigDigit [] u, in BigDigit [] v)
++	pure
+ {
+     assert(quotient.length == u.length - v.length);
+     assert(v.length > 1);
+@@ -1964,7 +2014,7 @@ again:
+ private:
+ 
+ // TODO: Replace with a library call
+-void itoaZeroPadded(char[] output, uint value, int radix = 10)
++void itoaZeroPadded(char[] output, uint value, int radix = 10) pure
+ {
+     ptrdiff_t x = output.length - 1;
+     for( ; x >= 0; --x)
+@@ -1974,7 +2024,7 @@ void itoaZeroPadded(char[] output, uint
+     }
+ }
+ 
+-void toHexZeroPadded(char[] output, uint value)
++void toHexZeroPadded(char[] output, uint value) pure
+ {
+     ptrdiff_t x = output.length - 1;
+     static immutable string hexDigits = "0123456789ABCDEF";
+@@ -1989,7 +2039,7 @@ private:
+ 
+ // Returns the highest value of i for which left[i]!=right[i],
+ // or 0 if left[] == right[]
+-size_t highestDifferentDigit(BigDigit [] left, BigDigit [] right)
++size_t highestDifferentDigit(const BigDigit [] left, const BigDigit [] right) pure
+ {
+     assert(left.length == right.length);
+     for (ptrdiff_t i = left.length - 1; i>0; --i)
+@@ -2001,7 +2051,7 @@ size_t highestDifferentDigit(BigDigit []
+ }
+ 
+ // Returns the lowest value of i for which x[i]!=0.
+-int firstNonZeroDigit(BigDigit[] x)
++int firstNonZeroDigit(BigDigit[] x) pure
+ {
+     int k = 0;
+     while (x[k]==0)
+@@ -2037,7 +2087,7 @@ Returns:
+       Max-Planck Institute fuer Informatik, (Oct 1998).
+ */
+ void recursiveDivMod(BigDigit[] quotient, BigDigit[] u, const(BigDigit)[] v,
+-                     BigDigit[] scratch, bool mayOverflow = false)
++                     BigDigit[] scratch, bool mayOverflow = false) pure
+ in
+ {
+     // v must be normalized
+@@ -2127,7 +2177,7 @@ body
+ // Needs (quot.length * k) scratch space to store the result of the multiply.
+ void adjustRemainder(BigDigit[] quot, BigDigit[] rem, const(BigDigit)[] v,
+         ptrdiff_t k,
+-        BigDigit[] scratch, bool mayOverflow = false)
++        BigDigit[] scratch, bool mayOverflow = false) pure
+ {
+     assert(rem.length == v.length);
+     mulInternal(scratch, quot, v[0 .. k]);
+@@ -2144,7 +2194,7 @@ void adjustRemainder(BigDigit[] quot, Bi
+ }
+ 
+ // Cope with unbalanced division by performing block schoolbook division.
+-void blockDivMod(BigDigit [] quotient, BigDigit [] u, in BigDigit [] v)
++void blockDivMod(BigDigit [] quotient, BigDigit [] u, in BigDigit [] v) pure
+ {
+     assert(quotient.length == u.length - v.length);
+     assert(v.length > 1);
+--- a/src/libphobos/src/std/internal/math/biguintnoasm.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/internal/math/biguintnoasm.d	2014-04-01 16:32:51.000000000 +0100
+@@ -32,7 +32,7 @@ enum : int { KARATSUBASQUARELIMIT=12 };
+  * Set op == '+' for addition, '-' for subtraction.
+  */
+ uint multibyteAddSub(char op)(uint[] dest, const(uint) [] src1,
+-    const (uint) [] src2, uint carry)
++    const (uint) [] src2, uint carry) pure
+ {
+     ulong c = carry;
+     for (size_t i = 0; i < src2.length; ++i)
+@@ -96,7 +96,7 @@ unittest
+  *  op must be '+' or '-'
+  *  Returns final carry or borrow (0 or 1)
+  */
+-uint multibyteIncrementAssign(char op)(uint[] dest, uint carry)
++uint multibyteIncrementAssign(char op)(uint[] dest, uint carry) pure
+ {
+     static if (op=='+')
+     {
+@@ -134,7 +134,7 @@ uint multibyteIncrementAssign(char op)(u
+ /** dest[] = src[] << numbits
+  *  numbits must be in the range 1..31
+  */
+-uint multibyteShl(uint [] dest, const(uint) [] src, uint numbits)
++uint multibyteShl(uint [] dest, const(uint) [] src, uint numbits) pure
+ {
+     ulong c = 0;
+     for (size_t i = 0; i < dest.length; ++i)
+@@ -150,7 +150,7 @@ uint multibyteShl(uint [] dest, const(ui
+ /** dest[] = src[] >> numbits
+  *  numbits must be in the range 1..31
+  */
+-void multibyteShr(uint [] dest, const(uint) [] src, uint numbits)
++void multibyteShr(uint [] dest, const(uint) [] src, uint numbits) pure
+ {
+     ulong c = 0;
+     for(ptrdiff_t i = dest.length; i!=0; --i)
+@@ -185,6 +185,7 @@ unittest
+  * Returns carry.
+  */
+ uint multibyteMul(uint[] dest, const(uint)[] src, uint multiplier, uint carry)
++	pure
+ {
+     assert(dest.length == src.length);
+     ulong c = carry;
+@@ -211,7 +212,7 @@ unittest
+  * Returns carry out of MSB (0..FFFF_FFFF).
+  */
+ uint multibyteMulAdd(char op)(uint [] dest, const(uint)[] src,
+-    uint multiplier, uint carry)
++    uint multiplier, uint carry) pure
+ {
+     assert(dest.length == src.length);
+     ulong c = carry;
+@@ -261,7 +262,8 @@ unittest
+     }
+     ----
+  */
+-void multibyteMultiplyAccumulate(uint [] dest, const(uint)[] left, const(uint) [] right)
++void multibyteMultiplyAccumulate(uint [] dest, const(uint)[] left, const(uint)
++		[] right) pure
+ {
+     for (size_t i = 0; i < right.length; ++i)
+     {
+@@ -273,7 +275,7 @@ void multibyteMultiplyAccumulate(uint []
+ /**  dest[] /= divisor.
+  * overflow is the initial remainder, and must be in the range 0..divisor-1.
+  */
+-uint multibyteDivAssign(uint [] dest, uint divisor, uint overflow)
++uint multibyteDivAssign(uint [] dest, uint divisor, uint overflow) pure
+ {
+     ulong c = cast(ulong)overflow;
+     for(ptrdiff_t i = dest.length-1; i>= 0; --i)
+@@ -301,7 +303,7 @@ unittest
+ 
+ }
+ // Set dest[2*i..2*i+1]+=src[i]*src[i]
+-void multibyteAddDiagonalSquares(uint[] dest, const(uint)[] src)
++void multibyteAddDiagonalSquares(uint[] dest, const(uint)[] src) pure
+ {
+     ulong c = 0;
+     for(size_t i = 0; i < src.length; ++i)
+@@ -316,7 +318,7 @@ void multibyteAddDiagonalSquares(uint[]
+ }
+ 
+ // Does half a square multiply. (square = diagonal + 2*triangle)
+-void multibyteTriangleAccumulate(uint[] dest, const(uint)[] x)
++void multibyteTriangleAccumulate(uint[] dest, const(uint)[] x) pure
+ {
+     // x[0]*x[1...$] + x[1]*x[2..$] + ... + x[$-2]x[$-1..$]
+     dest[x.length] = multibyteMul(dest[1 .. x.length], x[1..$], x[0], 0);
+@@ -349,7 +351,7 @@ void multibyteTriangleAccumulate(uint[]
+     dest[2*x.length-2] = cast(uint)c;
+ }
+ 
+-void multibyteSquare(BigDigit[] result, const(BigDigit) [] x)
++void multibyteSquare(BigDigit[] result, const(BigDigit) [] x) pure
+ {
+     multibyteTriangleAccumulate(result, x);
+     result[$-1] = multibyteShl(result[1..$-1], result[1..$-1], 1); // mul by 2
+--- a/src/libphobos/src/std/internal/math/biguintx86.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/internal/math/biguintx86.d	2014-04-01 16:32:51.000000000 +0100
+@@ -103,7 +103,8 @@ enum : int { KARATSUBASQUARELIMIT=26 };
+  * Returns carry or borrow (0 or 1).
+  * Set op == '+' for addition, '-' for subtraction.
+  */
+-uint multibyteAddSub(char op)(uint[] dest, const uint [] src1, const uint [] src2, uint carry)
++uint multibyteAddSub(char op)(uint[] dest, const uint [] src1, const uint []
++		src2, uint carry) pure
+ {
+     // Timing:
+     // Pentium M: 2.25/int
+@@ -215,7 +216,7 @@ unittest
+  *  op must be '+' or '-'
+  *  Returns final carry or borrow (0 or 1)
+  */
+-uint multibyteIncrementAssign(char op)(uint[] dest, uint carry)
++uint multibyteIncrementAssign(char op)(uint[] dest, uint carry) pure
+ {
+     enum { LASTPARAM = 1*4 } // 0* pushes + return address.
+     asm {
+@@ -245,7 +246,7 @@ L2:     dec EAX;
+  *  numbits must be in the range 1..31
+  *  Returns the overflow
+  */
+-uint multibyteShlNoMMX(uint [] dest, const uint [] src, uint numbits)
++uint multibyteShlNoMMX(uint [] dest, const uint [] src, uint numbits) pure
+ {
+     // Timing: Optimal for P6 family.
+     // 2.0 cycles/int on PPro..PM (limited by execution port p0)
+@@ -296,7 +297,7 @@ L_last:
+  *  numbits must be in the range 1..31
+  * This version uses MMX.
+  */
+-uint multibyteShl(uint [] dest, const uint [] src, uint numbits)
++uint multibyteShl(uint [] dest, const uint [] src, uint numbits) pure
+ {
+     // Timing:
+     // K7 1.2/int. PM 1.7/int P4 5.3/int
+@@ -380,7 +381,7 @@ L_length1:
+    }
+ }
+ 
+-void multibyteShr(uint [] dest, const uint [] src, uint numbits)
++void multibyteShr(uint [] dest, const uint [] src, uint numbits) pure
+ {
+     enum { LASTPARAM = 4*4 } // 3* pushes + return address.
+     asm {
+@@ -467,7 +468,7 @@ L_length1:
+ /** dest[#] = src[#] >> numbits
+  *  numbits must be in the range 1..31
+  */
+-void multibyteShrNoMMX(uint [] dest, const uint [] src, uint numbits)
++void multibyteShrNoMMX(uint [] dest, const uint [] src, uint numbits) pure
+ {
+     // Timing: Optimal for P6 family.
+     // 2.0 cycles/int on PPro..PM (limited by execution port p0)
+@@ -556,6 +557,7 @@ unittest
+  * Returns carry.
+  */
+ uint multibyteMul(uint[] dest, const uint[] src, uint multiplier, uint carry)
++	pure
+ {
+     // Timing: definitely not optimal.
+     // Pentium M: 5.0 cycles/operation, has 3 resource stalls/iteration
+@@ -626,7 +628,7 @@ unittest
+ // Multiples by M_ADDRESS which should be "ESP+LASTPARAM" or "ESP". OP must be "add" or "sub"
+ // This is the most time-critical code in the BigInt library.
+ // It is used by both MulAdd, multiplyAccumulate, and triangleAccumulate
+-string asmMulAdd_innerloop(string OP, string M_ADDRESS) {
++string asmMulAdd_innerloop(string OP, string M_ADDRESS) pure {
+     // The bottlenecks in this code are extremely complicated. The MUL, ADD, and ADC
+     // need 4 cycles on each of the ALUs units p0 and p1. So we use memory load
+     // (unit p2) for initializing registers to zero.
+@@ -697,7 +699,7 @@ L_done: " ~ OP ~ " [-8+EDI+4*EBX], ECX;
+                 // final carry is now in EBP
+ }
+ 
+-string asmMulAdd_enter_odd(string OP, string M_ADDRESS) {
++string asmMulAdd_enter_odd(string OP, string M_ADDRESS) pure {
+ return "asm {
+         mul int ptr [" ~M_ADDRESS ~"];
+         mov EBP, zero;
+@@ -718,8 +720,8 @@ return "asm {
+  * where op == '+' or '-'
+  * Returns carry out of MSB (0..FFFF_FFFF).
+  */
+-uint multibyteMulAdd(char op)(uint [] dest, const uint [] src, uint multiplier, uint carry)
+-{
++uint multibyteMulAdd(char op)(uint [] dest, const uint [] src, uint
++		multiplier, uint carry) pure {
+     // Timing: This is the most time-critical bignum function.
+     // Pentium M: 5.4 cycles/operation, still has 2 resource stalls + 1load block/iteration
+ 
+@@ -804,8 +806,8 @@ unittest
+     }
+     ----
+  */
+-void multibyteMultiplyAccumulate(uint [] dest, const uint[] left, const uint [] right)
+-{
++void multibyteMultiplyAccumulate(uint [] dest, const uint[] left, 
++		const uint [] right) pure {
+     // Register usage
+     // EDX:EAX = used in multiply
+     // EBX = index
+@@ -890,7 +892,7 @@ L_enter_odd:
+  * Based on public domain code by Eric Bainville.
+  * (http://www.bealto.com/) Used with permission.
+  */
+-uint multibyteDivAssign(uint [] dest, uint divisor, uint overflow)
++uint multibyteDivAssign(uint [] dest, uint divisor, uint overflow) pure
+ {
+     // Timing: limited by a horrible dependency chain.
+     // Pentium M: 18 cycles/op, 8 resource stalls/op.
+@@ -1008,7 +1010,7 @@ unittest
+ }
+ 
+ // Set dest[2*i..2*i+1]+=src[i]*src[i]
+-void multibyteAddDiagonalSquares(uint [] dest, const uint [] src)
++void multibyteAddDiagonalSquares(uint [] dest, const uint [] src) pure
+ {
+     /* Unlike mulAdd, the carry is only 1 bit,
+            since FFFF*FFFF+FFFF_FFFF = 1_0000_0000.
+@@ -1062,7 +1064,7 @@ unittest
+         for (int i=0; i= 3);
+-void multibyteTriangleAccumulateAsm(uint[] dest, const uint[] src)
++void multibyteTriangleAccumulateAsm(uint[] dest, const uint[] src) pure
+ {
+     // Register usage
+     // EDX:EAX = used in multiply
+@@ -1234,7 +1236,7 @@ unittest
+ }
+ 
+ 
+-void multibyteSquare(BigDigit[] result, const BigDigit [] x)
++void multibyteSquare(BigDigit[] result, const BigDigit [] x) pure
+ {
+     if (x.length < 4) {
+         // Special cases, not worth doing triangular.
+@@ -1261,7 +1263,7 @@ __gshared uint [2200] X1;
+ __gshared uint [2200] Y1;
+ __gshared uint [4000] Z1;
+ 
+-void testPerformance()
++void testPerformance() pure
+ {
+     // The performance results at the top of this file were obtained using
+     // a Windows device driver to access the CPU performance counters.
+--- a/src/libphobos/src/std/internal/math/errorfunction.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/internal/math/errorfunction.d	2014-04-01 16:32:51.000000000 +0100
+@@ -215,15 +215,15 @@ unittest {
+ 
+     assert(feqrel(erfc(0.250L), erfc0_250 )>=real.mant_dig-1);
+     assert(feqrel(erfc(0.375L), erfc0_375 )>=real.mant_dig-0);
+-    assert(feqrel(erfc(0.500L), erfc0_500 )>=real.mant_dig-1);
++    assert(feqrel(erfc(0.500L), erfc0_500 )>=real.mant_dig-2);
+     assert(feqrel(erfc(0.625L), erfc0_625 )>=real.mant_dig-1);
+     assert(feqrel(erfc(0.750L), erfc0_750 )>=real.mant_dig-1);
+     assert(feqrel(erfc(0.875L), erfc0_875 )>=real.mant_dig-4);
+-    assert(feqrel(erfc(1.000L), erfc1_000 )>=real.mant_dig-0);
++    assert(feqrel(erfc(1.000L), erfc1_000 )>=real.mant_dig-2);
+     assert(feqrel(erfc(1.125L), erfc1_125 )>=real.mant_dig-2);
+     assert(feqrel(erf(0.875L), erf0_875 )>=real.mant_dig-1);
+     // The DMC implementation of erfc() fails this next test (just)
+-    assert(feqrel(erfc(4.1L),0.67000276540848983727e-8L)>=real.mant_dig-4);
++    assert(feqrel(erfc(4.1L),0.67000276540848983727e-8L)>=real.mant_dig-5);
+ 
+     assert(isIdentical(erf(0.0),0.0));
+     assert(isIdentical(erf(-0.0),-0.0));
+--- a/src/libphobos/src/std/internal/math/gammafunction.d	2013-06-02 11:37:56.000000000 +0100
++++ b/src/libphobos/src/std/internal/math/gammafunction.d	2014-04-01 16:32:51.000000000 +0100
+@@ -345,7 +345,7 @@ unittest {
+     for (int i=1; fact real.mant_dig-16);
++        assert(feqrel(gamma(i*1.0L), fact) >= real.mant_dig-15);
+         fact *= (i*1.0L);
+     }
+     assert(gamma(0.0) == real.infinity);
+@@ -364,7 +364,7 @@ unittest {
+     real SQRT_PI = 1.77245385090551602729816748334114518279754945612238L;
+ 
+ 
+-    assert(feqrel(gamma(0.5L), SQRT_PI) >= real.mant_dig - 1);
++    assert(feqrel(gamma(0.5L), SQRT_PI) >= real.mant_dig-1);
+     assert(feqrel(gamma(17.25L), 4.224986665692703551570937158682064589938e13L) >= real.mant_dig-4);
+ 
+     assert(feqrel(gamma(1.0 / 3.0L),  2.67893853470774763365569294097467764412868937795730L) >= real.mant_dig-2);
+@@ -894,12 +894,12 @@ unittest { // also tested by the normal
+     // These arbitrary points are chosen to give good code coverage.
+     assert(feqrel(betaIncomplete(8, 10, 0.2), 0.010_934_315_234_099_2L) >=  real.mant_dig - 5);
+     assert(feqrel(betaIncomplete(2, 2.5, 0.9),0.989_722_597_604_452_767_171_003_59L) >= real.mant_dig - 1 );
+-    assert(feqrel(betaIncomplete(1000, 800, 0.5), 1.179140859734704555102808541457164E-06L) >= real.mant_dig - 12 );
++    assert(feqrel(betaIncomplete(1000, 800, 0.5), 1.179140859734704555102808541457164E-06L) >= real.mant_dig - 13 );
+     assert(feqrel(betaIncomplete(0.0001, 10000, 0.0001),0.999978059362107134278786L) >= real.mant_dig - 18 );
+     assert(betaIncomplete(0.01, 327726.7, 0.545113) == 1.0);
+     assert(feqrel(betaIncompleteInv(8, 10, 0.010_934_315_234_099_2L), 0.2L) >= real.mant_dig - 2);
+     assert(feqrel(betaIncomplete(0.01, 498.437, 0.0121433),0.99999664562033077636065L) >= real.mant_dig - 1);
+-    assert(feqrel(betaIncompleteInv(5, 10, 0.2000002972865658842), 0.229121208190918L) >= real.mant_dig - 4);
++    assert(feqrel(betaIncompleteInv(5, 10, 0.2000002972865658842), 0.229121208190918L) >= real.mant_dig - 3);
+     assert(feqrel(betaIncompleteInv(4, 7, 0.8000002209179505L), 0.483657360076904L) >= real.mant_dig - 3);
+ 
+     // Coverage tests. I don't have correct values for these tests, but
+--- a/src/libphobos/src/std/internal/unicode_comp.d	1970-01-01 01:00:00.000000000 +0100
++++ b/src/libphobos/src/std/internal/unicode_comp.d	2014-04-01 16:32:51.000000000 +0100
+@@ -0,0 +1,32 @@
++module std.internal.unicode_comp;
++import std.internal.unicode_tables;
++
++static if(size_t.sizeof == 8) {
++//6976 bytes
++enum combiningClassTrieEntries = TrieEntry!(ubyte, 8, 7, 6)([ 0x0,  0x20,  0x120], [ 0x100,  0x400,  0x1240], [ 0x402030202020100,  0x206020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x20001,  0x300000000,  0x5000400000000,  0x8000000070006,  0xb0000000a0009,  0xe0000000d000c,  0x11000f0010000f,  0x11000f0011000f,  0x1100000011000f,  0x11000f00120000,  0x13000000110000,  0x17001600150014,  0x1b001a00190018,  0x1d0000001c,  0x0,  0x0,  0x1e0000,  0x0,  0x0,  0x0,  0x2000000000001f,  0x2100000000,  0x22,  0x240023,  0x28002700260025,  0x2a000000000029,  0x2b000000000000,  0x0,  0x0,  0x2c000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2d000000000000,  0x2f0000002e0000,  0x0,  0x0,  0x3100000030,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x34003300320000,  0x0,  0x36000000000035,  0x3a003900380037,  0x3c003b00000000,  0x3d000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3e,  0x0,  0x0,  0x3f,  0x0,  0x0,  0x40000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x41,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4200350000,  0x3a000000000043,  0x0,  0x0,  0x0,  0x0,  0x4400000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4600450000,  0x470000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6e6,  0xdcdce8e6e6e6e6e6,  0xdcdcdcdcd8e8dcdc,  0xcadcdcdcdccacadc,  0xdcdcdcdcdcdcdcca,  0x1010101dcdcdcdc,  0xe6e6e6dcdcdcdc01,  0xdce6f0e6e6e6e6e6,  0xdcdce6e6e6dcdc,  0xe6dcdcdcdce6e6e6,  0xe9eaeae9e6dcdce8,  0xe6e6e6e6e6e9eaea,  0xe6e6e6e6e6e6e6e6,  0x0,  0x0,  0xe6e6e6e6e6000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6dce6e6e6e6dc00,  0xe6e6e6e6dcdee6e6,  0xdcdcdcdcdcdce6e6,  0xe6e4dee6e6dce6e6,  0x11100f0e0d0c0b0a,  0x1700161514131312,  0x1200dce600191800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6e6e6e6e6,  0x201f1e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1f1e1d1c1b000000,  0xe6dcdce6e6222120,  0xdce6e6dce6e6e6e6,  0x0,  0x0,  0x23,  0x0,  0x0,  0x0,  0xe6e6000000000000,  0xe60000e6e6e6e6e6,  0xe60000e6dce6e6e6,  0xdce6e6dc00e6,  0x0,  0x0,  0x0,  0x0,  0x2400,  0x0,  0x0,  0x0,  0xdce6e6dce6e6dce6,  0xe6dce6dcdce6dcdc,  0xe6dce6dce6dce6e6,  0xe6e6dc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6e6000000,  0xe6dce6e6,  0x0,  0x0,  0x0,  0xe6e6000000000000,  0xe6e6e6e6e600e6e6,  0xe6e6e600e6e6e6e6,  0xe6e6e6e6e600,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdcdcdc00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6dce6e600000000,  0xdcdcdce6e6e6dce6,  0xe6dce6e6e61d1c1b,  0xe6e6e6e6dcdce6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x700000000,  0x0,  0x90000000000,  0xe6e6dce600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000000000,  0x5b540000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x96767,  0x0,  0x6b6b6b6b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7676,  0x0,  0x7a7a7a7a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdcdc,  0x0,  0x0,  0xdc00dc0000000000,  0xd800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8400828100,  0x828282820000,  0xe6e60009e6e60082,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x700000000000000,  0x90900,  0x0,  0xdc0000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e60000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900000000,  0x0,  0x0,  0x0,  0x900000000,  0x0,  0x0,  0x0,  0x90000,  0xe60000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdce6de00,  0x0,  0x0,  0xe600000000000000,  0xdc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,  0x0,  0xe6e6e60000000000,  0xdc0000e6e6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x700000000,  0x0,  0x900000000,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6dce6000000,  0xe6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9090000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7000000000000,  0x0,  0x9090000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x700000000000000,  0x0,  0x0,  0x0,  0xdcdcdc0100e6e6e6,  0xdcdcdcdce6e6dcdc,  0x1010101010100e6,  0xdc0000000001,  0xe600000000,  0x0,  0xe6e6e6e6e6dce6e6,  0xdcd6eae6e6dce6e6,  0xe6e6e6e6e6e6e6ca,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6,  0x0,  0x0,  0xdce6dce900000000,  0x0,  0x0,  0xe6e6e6e60101e6e6,  0xe6e6010101,  0xe60101000000e600,  0xdcdcdcdc0101e6dc,  0xe6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe600000000000000,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900000000000000,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe0e0dee8e4da0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe600000000000000,  0xe6e6e6e600000000,  0xe6e6e6e6e6e6,  0x0,  0x0,  0x0,  0xe600000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6,  0x0,  0x9000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900000000,  0x0,  0x0,  0x0,  0xe6e6e6e6e6e6e6e6,  0xe6e6e6e6e6e6e6e6,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdcdcdc000000,  0x0,  0x0,  0x0,  0x0,  0x9000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7000000,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe60000dce6e600e6,  0xe6e60000000000e6,  0xe600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc0000000000,  0x0,  0xe600dc0000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900000000dc01e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x70900,  0xe6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x909000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x709000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1d8d80000000000,  0xd8d8e20000000101,  0xd8d8d8,  0xdcdcdcdcdc000000,  0xe6e6e60000dcdcdc,  0xdcdce6e6,  0x0,  0x0,  0x0,  0xe6e6e6e60000,  0x0,  0x0,  0xe6e6e60000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++enum composeIdxMask = (1<<11)-1, composeCntShift = 11;
++enum compositionJumpTrieEntries = TrieEntry!(ushort, 12, 9)([ 0x0,  0x400], [ 0x1000,  0x2000], [ 0x3000200010000,  0x7000600050004,  0x7000700070008,  0xa000700090007,  0x70007000c000b,  0x7000700070007,  0x700070007000d,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x700070007000e,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff080208010800,  0x281618138003ffff,  0x383308328821301b,  0x285108507841383a,  0x8068485f185c3056,  0x3882407affff1078,  0x30a510a398903889,  0xffff30b648ad10ab,  0xffffffffffffffff,  0x28cf18cc80bcffff,  0x38ec08eb88da30d4,  0x290b110970fb40f3,  0x8122491919163110,  0x393c4134ffff1132,  0x3960115e994b4143,  0xffff317351691167,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff1979,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff217cffffffff,  0x984118209810980,  0xffff2185ffffffff,  0x989ffffffffffff,  0xffffffffffffffff,  0xffff0991198e218a,  0xffffffffffff0992,  0xffffffffffff2193,  0xffff2197ffffffff,  0x99f119d099c099b,  0xffff21a0ffffffff,  0x9a4ffffffffffff,  0xffffffffffffffff,  0xffff09ac19a921a5,  0xffffffffffff09ad,  0xffffffffffff21ae,  0x21b621b2ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x11bc11baffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff11c011be,  0xffffffffffffffff,  0xffffffffffffffff,  0x9c309c2ffffffff,  0xffffffffffffffff,  0xffffffff09c509c4,  0xffffffffffffffff,  0x9c909c809c709c6,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x9caffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff29d029cb,  0xffffffffffffffff,  0xffffffffffffffff,  0x29d5ffffffffffff,  0xffffffffffff29da,  0x9dfffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x9e109e0ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x9e309e2ffffffff,  0xffffffff09e509e4,  0x9e709e6ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff09e8ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff39e9ffff,  0x29f4ffff21f0ffff,  0xffffffff39f9ffff,  0x2200ffffffffffff,  0xffffffff0a04ffff,  0xffffffff3205ffff,  0xffffffff2a0bffff,  0xffff0a11ffff0a10,  0xffffffff4212ffff,  0x321effff221affff,  0xffffffff4224ffff,  0x222cffffffffffff,  0xffffffff1230ffff,  0xffffffff4232ffff,  0x1a431a40323affff,  0xffff0a46ffffffff,  0xffff1247ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0a49ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa4cffffffff124a,  0xa5212501a4dffff,  0xffff0a57ffff2253,  0xffff0a58ffffffff,  0x2259ffffffffffff,  0xa5dffffffffffff,  0xa5effffffffffff,  0xffffffff0a5fffff,  0xa62ffffffff1260,  0xa6812661a63ffff,  0xffff0a6dffff2269,  0xffff0a6effffffff,  0x226fffffffffffff,  0xa73ffffffffffff,  0xa74ffffffffffff,  0xffffffff0a75ffff,  0xffffffffffffffff,  0xffff0a76ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0a780a77,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0a7a0a79,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0a7c0a7b,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1a7dffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0a81ffff0a80,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0a82ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0a83ffffffff,  0xffffffff0a84ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff0a85,  0xffffffffffffffff,  0xa87ffffffff0a86,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1288ffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1a8affffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0a8dffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa90128effffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0a91ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa92ffffffffffff,  0xffffffffffffffff,  0xffff1a93ffffffff,  0xffff0a96ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa991297ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff1a9affff,  0xffffffffffff0a9d,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0a9effff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xaa0ffff0a9fffff,  0xaa2ffff0aa1ffff,  0xffffffff0aa3ffff,  0xffffffff0aa4ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0aa5ffffffff,  0xaa80aa7ffff0aa6,  0xffff0aa9ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xaab0aaaffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xaad0aacffffffff,  0xffffffffffffffff,  0xaaf0aaeffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff12b212b0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0ab50ab4,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0ab70ab6,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xac10ac022bc22b8,  0xac50ac40ac30ac2,  0xacf0ace22ca22c6,  0xad30ad20ad10ad0,  0xffffffff12d612d4,  0xffffffffffffffff,  0xffffffff12da12d8,  0xffffffffffffffff,  0xae50ae422e022dc,  0xae90ae80ae70ae6,  0xaf30af222ee22ea,  0xaf70af60af50af4,  0xffffffff1afb1af8,  0xffffffffffffffff,  0xffffffff1b011afe,  0xffffffffffffffff,  0xffffffff13061304,  0xffffffffffffffff,  0xffffffff130a1308,  0xffffffffffffffff,  0xffffffff1b0f1b0c,  0xffffffffffffffff,  0xffffffff1b12ffff,  0xffffffffffffffff,  0xb1e0b1d23192315,  0xb220b210b200b1f,  0xb2c0b2b23272323,  0xb300b2f0b2e0b2d,  0xffffffffffff0b31,  0xffffffffffff0b32,  0xffffffffffffffff,  0xffffffffffff0b33,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b34ffffffff,  0xffffffffffffffff,  0x1b35ffffffffffff,  0xffffffffffffffff,  0xffff0b38ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b39ffffffff,  0xffffffffffffffff,  0xffff1b3affffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b3effff0b3d,  0xffffffffffff0b3f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b41ffff0b40,  0xffffffffffff0b42,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xb43ffffffffffff,  0xffffffffffffffff,  0xb45ffffffff0b44,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xb46ffffffffffff,  0xffffffff0b47ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff0b48,  0xb49ffffffffffff,  0xffffffff0b4affff,  0xffffffffffff0b4b,  0xffffffff0b4cffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0b4dffff,  0xffffffff0b4f0b4e,  0xffffffffffffffff,  0xffffffffffffffff,  0xb510b50ffffffff,  0xb530b52ffffffff,  0xb550b54ffffffff,  0xffffffff0b570b56,  0xb590b58ffffffff,  0xb5b0b5affffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b5d0b5cffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b5effffffff,  0xffffffffffffffff,  0xb61ffff0b600b5f,  0xffffffffffffffff,  0xb630b62ffffffff,  0xffffffff0b650b64,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0b66ffffffff,  0xb67ffffffffffff,  0xb69ffff0b68ffff,  0xb6bffff0b6affff,  0xb6dffff0b6cffff,  0xb6fffff0b6effff,  0xb71ffff0b70ffff,  0xffffffff0b72ffff,  0xffff0b74ffff0b73,  0xffffffffffff0b75,  0x1376ffffffffffff,  0xffff1378ffffffff,  0xffffffff137affff,  0x137effffffff137c,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0b80ffff,  0xffffffffffffffff,  0xffff0b81ffffffff,  0xb82ffffffffffff,  0xb84ffff0b83ffff,  0xb86ffff0b85ffff,  0xb88ffff0b87ffff,  0xb8affff0b89ffff,  0xb8cffff0b8bffff,  0xffffffff0b8dffff,  0xffff0b8fffff0b8e,  0xffffffffffff0b90,  0x1391ffffffffffff,  0xffff1393ffffffff,  0xffffffff1395ffff,  0x1399ffffffff1397,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xb9bffffffffffff,  0xffff0b9e0b9d0b9c,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0b9fffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xba1ffff0ba0ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0ba2ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0ba40ba3ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++@property immutable(CompEntry[]) compositionTable()
++{
++alias CE = CompEntry;
++static immutable CE[] t = [CE(0x00338, 0x0226e),CE(0x00338, 0x02260),CE(0x00338, 0x0226f),CE(0x00300, 0x000c0),CE(0x00301, 0x000c1),CE(0x00302, 0x000c2),CE(0x00303, 0x000c3),CE(0x00304, 0x00100),CE(0x00306, 0x00102),CE(0x00307, 0x00226),CE(0x00308, 0x000c4),CE(0x00309, 0x01ea2),CE(0x0030a, 0x000c5),CE(0x0030c, 0x001cd),CE(0x0030f, 0x00200),CE(0x00311, 0x00202),CE(0x00323, 0x01ea0),CE(0x00325, 0x01e00),CE(0x00328, 0x00104),CE(0x00307, 0x01e02),CE(0x00323, 0x01e04),CE(0x00331, 0x01e06),CE(0x00301, 0x00106),CE(0x00302, 0x00108),CE(0x00307, 0x0010a),CE(0x0030c, 0x0010c),CE(0x00327, 0x000c7),CE(0x00307, 0x01e0a),CE(0x0030c, 0x0010e),CE(0x00323, 0x01e0c),CE(0x00327, 0x01e10),CE(0x0032d, 0x01e12),CE(0x00331, 0x01e0e),CE(0x00300, 0x000c8),CE(0x00301, 0x000c9),CE(0x00302, 0x000ca),CE(0x00303, 0x01ebc),CE(0x00304, 0x00112),CE(0x00306, 0x00114),CE(0x00307, 0x00116),CE(0x00308, 0x000cb),CE(0x00309, 0x01eba),CE(0x0030c, 0x0011a),CE(0x0030f, 0x00204),CE(0x00311, 0x00206),CE(0x00323, 0x01eb8),CE(0x00327, 0x00228),CE(0x00328, 0x00118),CE(0x0032d, 0x01e18),CE(0x00330, 0x01e1a),CE(0x00307, 0x01e1e),CE(0x00301, 0x001f4),CE(0x00302, 0x0011c),CE(0x00304, 0x01e20),CE(0x00306, 0x0011e),CE(0x00307, 0x00120),CE(0x0030c, 0x001e6),CE(0x00327, 0x00122),CE(0x00302, 0x00124),CE(0x00307, 0x01e22),CE(0x00308, 0x01e26),CE(0x0030c, 0x0021e),CE(0x00323, 0x01e24),CE(0x00327, 0x01e28),CE(0x0032e, 0x01e2a),CE(0x00300, 0x000cc),CE(0x00301, 0x000cd),CE(0x00302, 0x000ce),CE(0x00303, 0x00128),CE(0x00304, 0x0012a),CE(0x00306, 0x0012c),CE(0x00307, 0x00130),CE(0x00308, 0x000cf),CE(0x00309, 0x01ec8),CE(0x0030c, 0x001cf),CE(0x0030f, 0x00208),CE(0x00311, 0x0020a),CE(0x00323, 0x01eca),CE(0x00328, 0x0012e),CE(0x00330, 0x01e2c),CE(0x00302, 0x00134),CE(0x00301, 0x01e30),CE(0x0030c, 0x001e8),CE(0x00323, 0x01e32),CE(0x00327, 0x00136),CE(0x00331, 0x01e34),CE(0x00301, 0x00139),CE(0x0030c, 0x0013d),CE(0x00323, 0x01e36),CE(0x00327, 0x0013b),CE(0x0032d, 0x01e3c),CE(0x00331, 0x01e3a),CE(0x00301, 0x01e3e),CE(0x00307, 0x01e40),CE(0x00323, 0x01e42),CE(0x00300, 0x001f8),CE(0x00301, 0x00143),CE(0x00303, 0x000d1),CE(0x00307, 0x01e44),CE(0x0030c, 0x00147),CE(0x00323, 0x01e46),CE(0x00327, 0x00145),CE(0x0032d, 0x01e4a),CE(0x00331, 0x01e48),CE(0x00300, 0x000d2),CE(0x00301, 0x000d3),CE(0x00302, 0x000d4),CE(0x00303, 0x000d5),CE(0x00304, 0x0014c),CE(0x00306, 0x0014e),CE(0x00307, 0x0022e),CE(0x00308, 0x000d6),CE(0x00309, 0x01ece),CE(0x0030b, 0x00150),CE(0x0030c, 0x001d1),CE(0x0030f, 0x0020c),CE(0x00311, 0x0020e),CE(0x0031b, 0x001a0),CE(0x00323, 0x01ecc),CE(0x00328, 0x001ea),CE(0x00301, 0x01e54),CE(0x00307, 0x01e56),CE(0x00301, 0x00154),CE(0x00307, 0x01e58),CE(0x0030c, 0x00158),CE(0x0030f, 0x00210),CE(0x00311, 0x00212),CE(0x00323, 0x01e5a),CE(0x00327, 0x00156),CE(0x00331, 0x01e5e),CE(0x00301, 0x0015a),CE(0x00302, 0x0015c),CE(0x00307, 0x01e60),CE(0x0030c, 0x00160),CE(0x00323, 0x01e62),CE(0x00326, 0x00218),CE(0x00327, 0x0015e),CE(0x00307, 0x01e6a),CE(0x0030c, 0x00164),CE(0x00323, 0x01e6c),CE(0x00326, 0x0021a),CE(0x00327, 0x00162),CE(0x0032d, 0x01e70),CE(0x00331, 0x01e6e),CE(0x00300, 0x000d9),CE(0x00301, 0x000da),CE(0x00302, 0x000db),CE(0x00303, 0x00168),CE(0x00304, 0x0016a),CE(0x00306, 0x0016c),CE(0x00308, 0x000dc),CE(0x00309, 0x01ee6),CE(0x0030a, 0x0016e),CE(0x0030b, 0x00170),CE(0x0030c, 0x001d3),CE(0x0030f, 0x00214),CE(0x00311, 0x00216),CE(0x0031b, 0x001af),CE(0x00323, 0x01ee4),CE(0x00324, 0x01e72),CE(0x00328, 0x00172),CE(0x0032d, 0x01e76),CE(0x00330, 0x01e74),CE(0x00303, 0x01e7c),CE(0x00323, 0x01e7e),CE(0x00300, 0x01e80),CE(0x00301, 0x01e82),CE(0x00302, 0x00174),CE(0x00307, 0x01e86),CE(0x00308, 0x01e84),CE(0x00323, 0x01e88),CE(0x00307, 0x01e8a),CE(0x00308, 0x01e8c),CE(0x00300, 0x01ef2),CE(0x00301, 0x000dd),CE(0x00302, 0x00176),CE(0x00303, 0x01ef8),CE(0x00304, 0x00232),CE(0x00307, 0x01e8e),CE(0x00308, 0x00178),CE(0x00309, 0x01ef6),CE(0x00323, 0x01ef4),CE(0x00301, 0x00179),CE(0x00302, 0x01e90),CE(0x00307, 0x0017b),CE(0x0030c, 0x0017d),CE(0x00323, 0x01e92),CE(0x00331, 0x01e94),CE(0x00300, 0x000e0),CE(0x00301, 0x000e1),CE(0x00302, 0x000e2),CE(0x00303, 0x000e3),CE(0x00304, 0x00101),CE(0x00306, 0x00103),CE(0x00307, 0x00227),CE(0x00308, 0x000e4),CE(0x00309, 0x01ea3),CE(0x0030a, 0x000e5),CE(0x0030c, 0x001ce),CE(0x0030f, 0x00201),CE(0x00311, 0x00203),CE(0x00323, 0x01ea1),CE(0x00325, 0x01e01),CE(0x00328, 0x00105),CE(0x00307, 0x01e03),CE(0x00323, 0x01e05),CE(0x00331, 0x01e07),CE(0x00301, 0x00107),CE(0x00302, 0x00109),CE(0x00307, 0x0010b),CE(0x0030c, 0x0010d),CE(0x00327, 0x000e7),CE(0x00307, 0x01e0b),CE(0x0030c, 0x0010f),CE(0x00323, 0x01e0d),CE(0x00327, 0x01e11),CE(0x0032d, 0x01e13),CE(0x00331, 0x01e0f),CE(0x00300, 0x000e8),CE(0x00301, 0x000e9),CE(0x00302, 0x000ea),CE(0x00303, 0x01ebd),CE(0x00304, 0x00113),CE(0x00306, 0x00115),CE(0x00307, 0x00117),CE(0x00308, 0x000eb),CE(0x00309, 0x01ebb),CE(0x0030c, 0x0011b),CE(0x0030f, 0x00205),CE(0x00311, 0x00207),CE(0x00323, 0x01eb9),CE(0x00327, 0x00229),CE(0x00328, 0x00119),CE(0x0032d, 0x01e19),CE(0x00330, 0x01e1b),CE(0x00307, 0x01e1f),CE(0x00301, 0x001f5),CE(0x00302, 0x0011d),CE(0x00304, 0x01e21),CE(0x00306, 0x0011f),CE(0x00307, 0x00121),CE(0x0030c, 0x001e7),CE(0x00327, 0x00123),CE(0x00302, 0x00125),CE(0x00307, 0x01e23),CE(0x00308, 0x01e27),CE(0x0030c, 0x0021f),CE(0x00323, 0x01e25),CE(0x00327, 0x01e29),CE(0x0032e, 0x01e2b),CE(0x00331, 0x01e96),CE(0x00300, 0x000ec),CE(0x00301, 0x000ed),CE(0x00302, 0x000ee),CE(0x00303, 0x00129),CE(0x00304, 0x0012b),CE(0x00306, 0x0012d),CE(0x00308, 0x000ef),CE(0x00309, 0x01ec9),CE(0x0030c, 0x001d0),CE(0x0030f, 0x00209),CE(0x00311, 0x0020b),CE(0x00323, 0x01ecb),CE(0x00328, 0x0012f),CE(0x00330, 0x01e2d),CE(0x00302, 0x00135),CE(0x0030c, 0x001f0),CE(0x00301, 0x01e31),CE(0x0030c, 0x001e9),CE(0x00323, 0x01e33),CE(0x00327, 0x00137),CE(0x00331, 0x01e35),CE(0x00301, 0x0013a),CE(0x0030c, 0x0013e),CE(0x00323, 0x01e37),CE(0x00327, 0x0013c),CE(0x0032d, 0x01e3d),CE(0x00331, 0x01e3b),CE(0x00301, 0x01e3f),CE(0x00307, 0x01e41),CE(0x00323, 0x01e43),CE(0x00300, 0x001f9),CE(0x00301, 0x00144),CE(0x00303, 0x000f1),CE(0x00307, 0x01e45),CE(0x0030c, 0x00148),CE(0x00323, 0x01e47),CE(0x00327, 0x00146),CE(0x0032d, 0x01e4b),CE(0x00331, 0x01e49),CE(0x00300, 0x000f2),CE(0x00301, 0x000f3),CE(0x00302, 0x000f4),CE(0x00303, 0x000f5),CE(0x00304, 0x0014d),CE(0x00306, 0x0014f),CE(0x00307, 0x0022f),CE(0x00308, 0x000f6),CE(0x00309, 0x01ecf),CE(0x0030b, 0x00151),CE(0x0030c, 0x001d2),CE(0x0030f, 0x0020d),CE(0x00311, 0x0020f),CE(0x0031b, 0x001a1),CE(0x00323, 0x01ecd),CE(0x00328, 0x001eb),CE(0x00301, 0x01e55),CE(0x00307, 0x01e57),CE(0x00301, 0x00155),CE(0x00307, 0x01e59),CE(0x0030c, 0x00159),CE(0x0030f, 0x00211),CE(0x00311, 0x00213),CE(0x00323, 0x01e5b),CE(0x00327, 0x00157),CE(0x00331, 0x01e5f),CE(0x00301, 0x0015b),CE(0x00302, 0x0015d),CE(0x00307, 0x01e61),CE(0x0030c, 0x00161),CE(0x00323, 0x01e63),CE(0x00326, 0x00219),CE(0x00327, 0x0015f),CE(0x00307, 0x01e6b),CE(0x00308, 0x01e97),CE(0x0030c, 0x00165),CE(0x00323, 0x01e6d),CE(0x00326, 0x0021b),CE(0x00327, 0x00163),CE(0x0032d, 0x01e71),CE(0x00331, 0x01e6f),CE(0x00300, 0x000f9),CE(0x00301, 0x000fa),CE(0x00302, 0x000fb),CE(0x00303, 0x00169),CE(0x00304, 0x0016b),CE(0x00306, 0x0016d),CE(0x00308, 0x000fc),CE(0x00309, 0x01ee7),CE(0x0030a, 0x0016f),CE(0x0030b, 0x00171),CE(0x0030c, 0x001d4),CE(0x0030f, 0x00215),CE(0x00311, 0x00217),CE(0x0031b, 0x001b0),CE(0x00323, 0x01ee5),CE(0x00324, 0x01e73),CE(0x00328, 0x00173),CE(0x0032d, 0x01e77),CE(0x00330, 0x01e75),CE(0x00303, 0x01e7d),CE(0x00323, 0x01e7f),CE(0x00300, 0x01e81),CE(0x00301, 0x01e83),CE(0x00302, 0x00175),CE(0x00307, 0x01e87),CE(0x00308, 0x01e85),CE(0x0030a, 0x01e98),CE(0x00323, 0x01e89),CE(0x00307, 0x01e8b),CE(0x00308, 0x01e8d),CE(0x00300, 0x01ef3),CE(0x00301, 0x000fd),CE(0x00302, 0x00177),CE(0x00303, 0x01ef9),CE(0x00304, 0x00233),CE(0x00307, 0x01e8f),CE(0x00308, 0x000ff),CE(0x00309, 0x01ef7),CE(0x0030a, 0x01e99),CE(0x00323, 0x01ef5),CE(0x00301, 0x0017a),CE(0x00302, 0x01e91),CE(0x00307, 0x0017c),CE(0x0030c, 0x0017e),CE(0x00323, 0x01e93),CE(0x00331, 0x01e95),CE(0x00300, 0x01fed),CE(0x00301, 0x00385),CE(0x00342, 0x01fc1),CE(0x00300, 0x01ea6),CE(0x00301, 0x01ea4),CE(0x00303, 0x01eaa),CE(0x00309, 0x01ea8),CE(0x00304, 0x001de),CE(0x00301, 0x001fa),CE(0x00301, 0x001fc),CE(0x00304, 0x001e2),CE(0x00301, 0x01e08),CE(0x00300, 0x01ec0),CE(0x00301, 0x01ebe),CE(0x00303, 0x01ec4),CE(0x00309, 0x01ec2),CE(0x00301, 0x01e2e),CE(0x00300, 0x01ed2),CE(0x00301, 0x01ed0),CE(0x00303, 0x01ed6),CE(0x00309, 0x01ed4),CE(0x00301, 0x01e4c),CE(0x00304, 0x0022c),CE(0x00308, 0x01e4e),CE(0x00304, 0x0022a),CE(0x00301, 0x001fe),CE(0x00300, 0x001db),CE(0x00301, 0x001d7),CE(0x00304, 0x001d5),CE(0x0030c, 0x001d9),CE(0x00300, 0x01ea7),CE(0x00301, 0x01ea5),CE(0x00303, 0x01eab),CE(0x00309, 0x01ea9),CE(0x00304, 0x001df),CE(0x00301, 0x001fb),CE(0x00301, 0x001fd),CE(0x00304, 0x001e3),CE(0x00301, 0x01e09),CE(0x00300, 0x01ec1),CE(0x00301, 0x01ebf),CE(0x00303, 0x01ec5),CE(0x00309, 0x01ec3),CE(0x00301, 0x01e2f),CE(0x00300, 0x01ed3),CE(0x00301, 0x01ed1),CE(0x00303, 0x01ed7),CE(0x00309, 0x01ed5),CE(0x00301, 0x01e4d),CE(0x00304, 0x0022d),CE(0x00308, 0x01e4f),CE(0x00304, 0x0022b),CE(0x00301, 0x001ff),CE(0x00300, 0x001dc),CE(0x00301, 0x001d8),CE(0x00304, 0x001d6),CE(0x0030c, 0x001da),CE(0x00300, 0x01eb0),CE(0x00301, 0x01eae),CE(0x00303, 0x01eb4),CE(0x00309, 0x01eb2),CE(0x00300, 0x01eb1),CE(0x00301, 0x01eaf),CE(0x00303, 0x01eb5),CE(0x00309, 0x01eb3),CE(0x00300, 0x01e14),CE(0x00301, 0x01e16),CE(0x00300, 0x01e15),CE(0x00301, 0x01e17),CE(0x00300, 0x01e50),CE(0x00301, 0x01e52),CE(0x00300, 0x01e51),CE(0x00301, 0x01e53),CE(0x00307, 0x01e64),CE(0x00307, 0x01e65),CE(0x00307, 0x01e66),CE(0x00307, 0x01e67),CE(0x00301, 0x01e78),CE(0x00301, 0x01e79),CE(0x00308, 0x01e7a),CE(0x00308, 0x01e7b),CE(0x00307, 0x01e9b),CE(0x00300, 0x01edc),CE(0x00301, 0x01eda),CE(0x00303, 0x01ee0),CE(0x00309, 0x01ede),CE(0x00323, 0x01ee2),CE(0x00300, 0x01edd),CE(0x00301, 0x01edb),CE(0x00303, 0x01ee1),CE(0x00309, 0x01edf),CE(0x00323, 0x01ee3),CE(0x00300, 0x01eea),CE(0x00301, 0x01ee8),CE(0x00303, 0x01eee),CE(0x00309, 0x01eec),CE(0x00323, 0x01ef0),CE(0x00300, 0x01eeb),CE(0x00301, 0x01ee9),CE(0x00303, 0x01eef),CE(0x00309, 0x01eed),CE(0x00323, 0x01ef1),CE(0x0030c, 0x001ee),CE(0x00304, 0x001ec),CE(0x00304, 0x001ed),CE(0x00304, 0x001e0),CE(0x00304, 0x001e1),CE(0x00306, 0x01e1c),CE(0x00306, 0x01e1d),CE(0x00304, 0x00230),CE(0x00304, 0x00231),CE(0x0030c, 0x001ef),CE(0x00300, 0x01fba),CE(0x00301, 0x00386),CE(0x00304, 0x01fb9),CE(0x00306, 0x01fb8),CE(0x00313, 0x01f08),CE(0x00314, 0x01f09),CE(0x00345, 0x01fbc),CE(0x00300, 0x01fc8),CE(0x00301, 0x00388),CE(0x00313, 0x01f18),CE(0x00314, 0x01f19),CE(0x00300, 0x01fca),CE(0x00301, 0x00389),CE(0x00313, 0x01f28),CE(0x00314, 0x01f29),CE(0x00345, 0x01fcc),CE(0x00300, 0x01fda),CE(0x00301, 0x0038a),CE(0x00304, 0x01fd9),CE(0x00306, 0x01fd8),CE(0x00308, 0x003aa),CE(0x00313, 0x01f38),CE(0x00314, 0x01f39),CE(0x00300, 0x01ff8),CE(0x00301, 0x0038c),CE(0x00313, 0x01f48),CE(0x00314, 0x01f49),CE(0x00314, 0x01fec),CE(0x00300, 0x01fea),CE(0x00301, 0x0038e),CE(0x00304, 0x01fe9),CE(0x00306, 0x01fe8),CE(0x00308, 0x003ab),CE(0x00314, 0x01f59),CE(0x00300, 0x01ffa),CE(0x00301, 0x0038f),CE(0x00313, 0x01f68),CE(0x00314, 0x01f69),CE(0x00345, 0x01ffc),CE(0x00345, 0x01fb4),CE(0x00345, 0x01fc4),CE(0x00300, 0x01f70),CE(0x00301, 0x003ac),CE(0x00304, 0x01fb1),CE(0x00306, 0x01fb0),CE(0x00313, 0x01f00),CE(0x00314, 0x01f01),CE(0x00342, 0x01fb6),CE(0x00345, 0x01fb3),CE(0x00300, 0x01f72),CE(0x00301, 0x003ad),CE(0x00313, 0x01f10),CE(0x00314, 0x01f11),CE(0x00300, 0x01f74),CE(0x00301, 0x003ae),CE(0x00313, 0x01f20),CE(0x00314, 0x01f21),CE(0x00342, 0x01fc6),CE(0x00345, 0x01fc3),CE(0x00300, 0x01f76),CE(0x00301, 0x003af),CE(0x00304, 0x01fd1),CE(0x00306, 0x01fd0),CE(0x00308, 0x003ca),CE(0x00313, 0x01f30),CE(0x00314, 0x01f31),CE(0x00342, 0x01fd6),CE(0x00300, 0x01f78),CE(0x00301, 0x003cc),CE(0x00313, 0x01f40),CE(0x00314, 0x01f41),CE(0x00313, 0x01fe4),CE(0x00314, 0x01fe5),CE(0x00300, 0x01f7a),CE(0x00301, 0x003cd),CE(0x00304, 0x01fe1),CE(0x00306, 0x01fe0),CE(0x00308, 0x003cb),CE(0x00313, 0x01f50),CE(0x00314, 0x01f51),CE(0x00342, 0x01fe6),CE(0x00300, 0x01f7c),CE(0x00301, 0x003ce),CE(0x00313, 0x01f60),CE(0x00314, 0x01f61),CE(0x00342, 0x01ff6),CE(0x00345, 0x01ff3),CE(0x00300, 0x01fd2),CE(0x00301, 0x00390),CE(0x00342, 0x01fd7),CE(0x00300, 0x01fe2),CE(0x00301, 0x003b0),CE(0x00342, 0x01fe7),CE(0x00345, 0x01ff4),CE(0x00301, 0x003d3),CE(0x00308, 0x003d4),CE(0x00308, 0x00407),CE(0x00306, 0x004d0),CE(0x00308, 0x004d2),CE(0x00301, 0x00403),CE(0x00300, 0x00400),CE(0x00306, 0x004d6),CE(0x00308, 0x00401),CE(0x00306, 0x004c1),CE(0x00308, 0x004dc),CE(0x00308, 0x004de),CE(0x00300, 0x0040d),CE(0x00304, 0x004e2),CE(0x00306, 0x00419),CE(0x00308, 0x004e4),CE(0x00301, 0x0040c),CE(0x00308, 0x004e6),CE(0x00304, 0x004ee),CE(0x00306, 0x0040e),CE(0x00308, 0x004f0),CE(0x0030b, 0x004f2),CE(0x00308, 0x004f4),CE(0x00308, 0x004f8),CE(0x00308, 0x004ec),CE(0x00306, 0x004d1),CE(0x00308, 0x004d3),CE(0x00301, 0x00453),CE(0x00300, 0x00450),CE(0x00306, 0x004d7),CE(0x00308, 0x00451),CE(0x00306, 0x004c2),CE(0x00308, 0x004dd),CE(0x00308, 0x004df),CE(0x00300, 0x0045d),CE(0x00304, 0x004e3),CE(0x00306, 0x00439),CE(0x00308, 0x004e5),CE(0x00301, 0x0045c),CE(0x00308, 0x004e7),CE(0x00304, 0x004ef),CE(0x00306, 0x0045e),CE(0x00308, 0x004f1),CE(0x0030b, 0x004f3),CE(0x00308, 0x004f5),CE(0x00308, 0x004f9),CE(0x00308, 0x004ed),CE(0x00308, 0x00457),CE(0x0030f, 0x00476),CE(0x0030f, 0x00477),CE(0x00308, 0x004da),CE(0x00308, 0x004db),CE(0x00308, 0x004ea),CE(0x00308, 0x004eb),CE(0x00653, 0x00622),CE(0x00654, 0x00623),CE(0x00655, 0x00625),CE(0x00654, 0x00624),CE(0x00654, 0x00626),CE(0x00654, 0x006c2),CE(0x00654, 0x006d3),CE(0x00654, 0x006c0),CE(0x0093c, 0x00929),CE(0x0093c, 0x00931),CE(0x0093c, 0x00934),CE(0x009be, 0x009cb),CE(0x009d7, 0x009cc),CE(0x00b3e, 0x00b4b),CE(0x00b56, 0x00b48),CE(0x00b57, 0x00b4c),CE(0x00bd7, 0x00b94),CE(0x00bbe, 0x00bca),CE(0x00bd7, 0x00bcc),CE(0x00bbe, 0x00bcb),CE(0x00c56, 0x00c48),CE(0x00cd5, 0x00cc0),CE(0x00cc2, 0x00cca),CE(0x00cd5, 0x00cc7),CE(0x00cd6, 0x00cc8),CE(0x00cd5, 0x00ccb),CE(0x00d3e, 0x00d4a),CE(0x00d57, 0x00d4c),CE(0x00d3e, 0x00d4b),CE(0x00dca, 0x00dda),CE(0x00dcf, 0x00ddc),CE(0x00ddf, 0x00dde),CE(0x00dca, 0x00ddd),CE(0x0102e, 0x01026),CE(0x01b35, 0x01b06),CE(0x01b35, 0x01b08),CE(0x01b35, 0x01b0a),CE(0x01b35, 0x01b0c),CE(0x01b35, 0x01b0e),CE(0x01b35, 0x01b12),CE(0x01b35, 0x01b3b),CE(0x01b35, 0x01b3d),CE(0x01b35, 0x01b40),CE(0x01b35, 0x01b41),CE(0x01b35, 0x01b43),CE(0x00304, 0x01e38),CE(0x00304, 0x01e39),CE(0x00304, 0x01e5c),CE(0x00304, 0x01e5d),CE(0x00307, 0x01e68),CE(0x00307, 0x01e69),CE(0x00302, 0x01eac),CE(0x00306, 0x01eb6),CE(0x00302, 0x01ead),CE(0x00306, 0x01eb7),CE(0x00302, 0x01ec6),CE(0x00302, 0x01ec7),CE(0x00302, 0x01ed8),CE(0x00302, 0x01ed9),CE(0x00300, 0x01f02),CE(0x00301, 0x01f04),CE(0x00342, 0x01f06),CE(0x00345, 0x01f80),CE(0x00300, 0x01f03),CE(0x00301, 0x01f05),CE(0x00342, 0x01f07),CE(0x00345, 0x01f81),CE(0x00345, 0x01f82),CE(0x00345, 0x01f83),CE(0x00345, 0x01f84),CE(0x00345, 0x01f85),CE(0x00345, 0x01f86),CE(0x00345, 0x01f87),CE(0x00300, 0x01f0a),CE(0x00301, 0x01f0c),CE(0x00342, 0x01f0e),CE(0x00345, 0x01f88),CE(0x00300, 0x01f0b),CE(0x00301, 0x01f0d),CE(0x00342, 0x01f0f),CE(0x00345, 0x01f89),CE(0x00345, 0x01f8a),CE(0x00345, 0x01f8b),CE(0x00345, 0x01f8c),CE(0x00345, 0x01f8d),CE(0x00345, 0x01f8e),CE(0x00345, 0x01f8f),CE(0x00300, 0x01f12),CE(0x00301, 0x01f14),CE(0x00300, 0x01f13),CE(0x00301, 0x01f15),CE(0x00300, 0x01f1a),CE(0x00301, 0x01f1c),CE(0x00300, 0x01f1b),CE(0x00301, 0x01f1d),CE(0x00300, 0x01f22),CE(0x00301, 0x01f24),CE(0x00342, 0x01f26),CE(0x00345, 0x01f90),CE(0x00300, 0x01f23),CE(0x00301, 0x01f25),CE(0x00342, 0x01f27),CE(0x00345, 0x01f91),CE(0x00345, 0x01f92),CE(0x00345, 0x01f93),CE(0x00345, 0x01f94),CE(0x00345, 0x01f95),CE(0x00345, 0x01f96),CE(0x00345, 0x01f97),CE(0x00300, 0x01f2a),CE(0x00301, 0x01f2c),CE(0x00342, 0x01f2e),CE(0x00345, 0x01f98),CE(0x00300, 0x01f2b),CE(0x00301, 0x01f2d),CE(0x00342, 0x01f2f),CE(0x00345, 0x01f99),CE(0x00345, 0x01f9a),CE(0x00345, 0x01f9b),CE(0x00345, 0x01f9c),CE(0x00345, 0x01f9d),CE(0x00345, 0x01f9e),CE(0x00345, 0x01f9f),CE(0x00300, 0x01f32),CE(0x00301, 0x01f34),CE(0x00342, 0x01f36),CE(0x00300, 0x01f33),CE(0x00301, 0x01f35),CE(0x00342, 0x01f37),CE(0x00300, 0x01f3a),CE(0x00301, 0x01f3c),CE(0x00342, 0x01f3e),CE(0x00300, 0x01f3b),CE(0x00301, 0x01f3d),CE(0x00342, 0x01f3f),CE(0x00300, 0x01f42),CE(0x00301, 0x01f44),CE(0x00300, 0x01f43),CE(0x00301, 0x01f45),CE(0x00300, 0x01f4a),CE(0x00301, 0x01f4c),CE(0x00300, 0x01f4b),CE(0x00301, 0x01f4d),CE(0x00300, 0x01f52),CE(0x00301, 0x01f54),CE(0x00342, 0x01f56),CE(0x00300, 0x01f53),CE(0x00301, 0x01f55),CE(0x00342, 0x01f57),CE(0x00300, 0x01f5b),CE(0x00301, 0x01f5d),CE(0x00342, 0x01f5f),CE(0x00300, 0x01f62),CE(0x00301, 0x01f64),CE(0x00342, 0x01f66),CE(0x00345, 0x01fa0),CE(0x00300, 0x01f63),CE(0x00301, 0x01f65),CE(0x00342, 0x01f67),CE(0x00345, 0x01fa1),CE(0x00345, 0x01fa2),CE(0x00345, 0x01fa3),CE(0x00345, 0x01fa4),CE(0x00345, 0x01fa5),CE(0x00345, 0x01fa6),CE(0x00345, 0x01fa7),CE(0x00300, 0x01f6a),CE(0x00301, 0x01f6c),CE(0x00342, 0x01f6e),CE(0x00345, 0x01fa8),CE(0x00300, 0x01f6b),CE(0x00301, 0x01f6d),CE(0x00342, 0x01f6f),CE(0x00345, 0x01fa9),CE(0x00345, 0x01faa),CE(0x00345, 0x01fab),CE(0x00345, 0x01fac),CE(0x00345, 0x01fad),CE(0x00345, 0x01fae),CE(0x00345, 0x01faf),CE(0x00345, 0x01fb2),CE(0x00345, 0x01fc2),CE(0x00345, 0x01ff2),CE(0x00345, 0x01fb7),CE(0x00300, 0x01fcd),CE(0x00301, 0x01fce),CE(0x00342, 0x01fcf),CE(0x00345, 0x01fc7),CE(0x00345, 0x01ff7),CE(0x00300, 0x01fdd),CE(0x00301, 0x01fde),CE(0x00342, 0x01fdf),CE(0x00338, 0x0219a),CE(0x00338, 0x0219b),CE(0x00338, 0x021ae),CE(0x00338, 0x021cd),CE(0x00338, 0x021cf),CE(0x00338, 0x021ce),CE(0x00338, 0x02204),CE(0x00338, 0x02209),CE(0x00338, 0x0220c),CE(0x00338, 0x02224),CE(0x00338, 0x02226),CE(0x00338, 0x02241),CE(0x00338, 0x02244),CE(0x00338, 0x02247),CE(0x00338, 0x02249),CE(0x00338, 0x0226d),CE(0x00338, 0x02262),CE(0x00338, 0x02270),CE(0x00338, 0x02271),CE(0x00338, 0x02274),CE(0x00338, 0x02275),CE(0x00338, 0x02278),CE(0x00338, 0x02279),CE(0x00338, 0x02280),CE(0x00338, 0x02281),CE(0x00338, 0x022e0),CE(0x00338, 0x022e1),CE(0x00338, 0x02284),CE(0x00338, 0x02285),CE(0x00338, 0x02288),CE(0x00338, 0x02289),CE(0x00338, 0x022e2),CE(0x00338, 0x022e3),CE(0x00338, 0x022ac),CE(0x00338, 0x022ad),CE(0x00338, 0x022ae),CE(0x00338, 0x022af),CE(0x00338, 0x022ea),CE(0x00338, 0x022eb),CE(0x00338, 0x022ec),CE(0x00338, 0x022ed),CE(0x03099, 0x03094),CE(0x03099, 0x0304c),CE(0x03099, 0x0304e),CE(0x03099, 0x03050),CE(0x03099, 0x03052),CE(0x03099, 0x03054),CE(0x03099, 0x03056),CE(0x03099, 0x03058),CE(0x03099, 0x0305a),CE(0x03099, 0x0305c),CE(0x03099, 0x0305e),CE(0x03099, 0x03060),CE(0x03099, 0x03062),CE(0x03099, 0x03065),CE(0x03099, 0x03067),CE(0x03099, 0x03069),CE(0x03099, 0x03070),CE(0x0309a, 0x03071),CE(0x03099, 0x03073),CE(0x0309a, 0x03074),CE(0x03099, 0x03076),CE(0x0309a, 0x03077),CE(0x03099, 0x03079),CE(0x0309a, 0x0307a),CE(0x03099, 0x0307c),CE(0x0309a, 0x0307d),CE(0x03099, 0x0309e),CE(0x03099, 0x030f4),CE(0x03099, 0x030ac),CE(0x03099, 0x030ae),CE(0x03099, 0x030b0),CE(0x03099, 0x030b2),CE(0x03099, 0x030b4),CE(0x03099, 0x030b6),CE(0x03099, 0x030b8),CE(0x03099, 0x030ba),CE(0x03099, 0x030bc),CE(0x03099, 0x030be),CE(0x03099, 0x030c0),CE(0x03099, 0x030c2),CE(0x03099, 0x030c5),CE(0x03099, 0x030c7),CE(0x03099, 0x030c9),CE(0x03099, 0x030d0),CE(0x0309a, 0x030d1),CE(0x03099, 0x030d3),CE(0x0309a, 0x030d4),CE(0x03099, 0x030d6),CE(0x0309a, 0x030d7),CE(0x03099, 0x030d9),CE(0x0309a, 0x030da),CE(0x03099, 0x030dc),CE(0x0309a, 0x030dd),CE(0x03099, 0x030f7),CE(0x03099, 0x030f8),CE(0x03099, 0x030f9),CE(0x03099, 0x030fa),CE(0x03099, 0x030fe),CE(0x110ba, 0x1109a),CE(0x110ba, 0x1109c),CE(0x110ba, 0x110ab),CE(0x11127, 0x1112e),CE(0x11127, 0x1112f),];
++return t;
++}
++
++}
++
++
++static if(size_t.sizeof == 4) {
++//6976 bytes
++enum combiningClassTrieEntries = TrieEntry!(ubyte, 8, 7, 6)([ 0x0,  0x40,  0x240], [ 0x100,  0x400,  0x1240], [ 0x2020100,  0x4020302,  0x2020205,  0x2060202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20001,  0x0,  0x0,  0x3,  0x0,  0x50004,  0x70006,  0x80000,  0xa0009,  0xb0000,  0xd000c,  0xe0000,  0x10000f,  0x11000f,  0x11000f,  0x11000f,  0x11000f,  0x110000,  0x120000,  0x11000f,  0x110000,  0x130000,  0x150014,  0x170016,  0x190018,  0x1b001a,  0x1c,  0x1d,  0x0,  0x0,  0x0,  0x0,  0x1e0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1f,  0x200000,  0x0,  0x21,  0x22,  0x0,  0x240023,  0x0,  0x260025,  0x280027,  0x29,  0x2a0000,  0x0,  0x2b0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2d0000,  0x2e0000,  0x2f0000,  0x0,  0x0,  0x0,  0x0,  0x30,  0x31,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x320000,  0x340033,  0x0,  0x0,  0x35,  0x360000,  0x380037,  0x3a0039,  0x0,  0x3c003b,  0x0,  0x3d0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x400000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x41,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x350000,  0x42,  0x43,  0x3a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x44,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x450000,  0x46,  0x470000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xdcdce8e6,  0xd8e8dcdc,  0xdcdcdcdc,  0xdccacadc,  0xcadcdcdc,  0xdcdcdcca,  0xdcdcdcdc,  0xdcdcdcdc,  0x1010101,  0xdcdcdc01,  0xe6e6e6dc,  0xe6e6e6e6,  0xdce6f0e6,  0xe6e6dcdc,  0xdcdce6,  0xdce6e6e6,  0xe6dcdcdc,  0xe6dcdce8,  0xe9eaeae9,  0xe6e9eaea,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0xe6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6dc00,  0xe6dce6e6,  0xdcdee6e6,  0xe6e6e6e6,  0xdcdce6e6,  0xdcdcdcdc,  0xe6dce6e6,  0xe6e4dee6,  0xd0c0b0a,  0x11100f0e,  0x14131312,  0x17001615,  0x191800,  0x1200dce6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6,  0xe6e6e6e6,  0x201f1e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b000000,  0x1f1e1d1c,  0xe6222120,  0xe6dcdce6,  0xe6e6e6e6,  0xdce6e6dc,  0x0,  0x0,  0x0,  0x0,  0x23,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e60000,  0xe6e6e6e6,  0xe60000e6,  0xdce6e6e6,  0xe60000e6,  0xe6dc00e6,  0xdce6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6dce6,  0xdce6e6dc,  0xdce6dcdc,  0xe6dce6dc,  0xe6dce6e6,  0xe6dce6dc,  0xe6e6dc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0xe6e6e6e6,  0xe6dce6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e60000,  0xe600e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e600,  0xe6e6e600,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdcdcdc00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6dce6e6,  0xe6e6dce6,  0xdcdcdce6,  0xe61d1c1b,  0xe6dce6e6,  0xe6dcdce6,  0xe6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0x0,  0x0,  0x0,  0x900,  0xe6dce600,  0xe6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900,  0x0,  0x5b5400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x96767,  0x0,  0x0,  0x0,  0x6b6b6b6b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7676,  0x0,  0x0,  0x0,  0x7a7a7a7a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdcdc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc00dc00,  0xd800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x828100,  0x84,  0x82820000,  0x8282,  0xe6e60082,  0xe6e60009,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7000000,  0x90900,  0x0,  0x0,  0x0,  0x0,  0xdc00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000,  0x0,  0x0,  0xe600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdce6de00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0xdc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0xe6e6e600,  0xe6e6e6e6,  0xdc0000e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0xe6e6e6dc,  0xe6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9090000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x70000,  0x0,  0x0,  0x9090000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6,  0xdcdcdc01,  0xe6e6dcdc,  0xdcdcdcdc,  0x10100e6,  0x1010101,  0x1,  0xdc00,  0x0,  0xe6,  0x0,  0x0,  0xe6dce6e6,  0xe6e6e6e6,  0xe6dce6e6,  0xdcd6eae6,  0xe6e6e6ca,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdce6dce9,  0x0,  0x0,  0x0,  0x0,  0x101e6e6,  0xe6e6e6e6,  0xe6010101,  0xe6,  0xe600,  0xe6010100,  0x101e6dc,  0xdcdcdcdc,  0xe6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe4da0000,  0xe0e0dee8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0x0,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x90000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6e6e6,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc000000,  0xdcdc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7000000,  0x0,  0x0,  0x0,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e600e6,  0xe60000dc,  0xe6,  0xe6e60000,  0xe600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x90000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x900,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e6e6e6,  0xe6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc00,  0x0,  0x0,  0x0,  0xe600dc00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xdc01e6,  0x9000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x70900,  0x0,  0xe6e6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9000000,  0x9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7090000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1d8d800,  0x101,  0xd8d8e200,  0xd8d8d8,  0x0,  0xdc000000,  0xdcdcdcdc,  0xdcdcdc,  0xe6e6e600,  0xdcdce6e6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe6e60000,  0xe6e6,  0x0,  0x0,  0x0,  0x0,  0xe6e60000,  0xe6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++enum composeIdxMask = (1<<11)-1, composeCntShift = 11;
++enum compositionJumpTrieEntries = TrieEntry!(ushort, 12, 9)([ 0x0,  0x800], [ 0x1000,  0x2000], [ 0x10000,  0x30002,  0x50004,  0x70006,  0x70008,  0x70007,  0x90007,  0xa0007,  0xc000b,  0x70007,  0x70007,  0x70007,  0x7000d,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x7000e,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x8010800,  0xffff0802,  0x8003ffff,  0x28161813,  0x8821301b,  0x38330832,  0x7841383a,  0x28510850,  0x185c3056,  0x8068485f,  0xffff1078,  0x3882407a,  0x98903889,  0x30a510a3,  0x48ad10ab,  0xffff30b6,  0xffffffff,  0xffffffff,  0x80bcffff,  0x28cf18cc,  0x88da30d4,  0x38ec08eb,  0x70fb40f3,  0x290b1109,  0x19163110,  0x81224919,  0xffff1132,  0x393c4134,  0x994b4143,  0x3960115e,  0x51691167,  0xffff3173,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff1979,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff217c,  0x9810980,  0x9841182,  0xffffffff,  0xffff2185,  0xffffffff,  0x989ffff,  0xffffffff,  0xffffffff,  0x198e218a,  0xffff0991,  0xffff0992,  0xffffffff,  0xffff2193,  0xffffffff,  0xffffffff,  0xffff2197,  0x99c099b,  0x99f119d,  0xffffffff,  0xffff21a0,  0xffffffff,  0x9a4ffff,  0xffffffff,  0xffffffff,  0x19a921a5,  0xffff09ac,  0xffff09ad,  0xffffffff,  0xffff21ae,  0xffffffff,  0xffffffff,  0x21b621b2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x11bc11ba,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x11c011be,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x9c309c2,  0xffffffff,  0xffffffff,  0x9c509c4,  0xffffffff,  0xffffffff,  0xffffffff,  0x9c709c6,  0x9c909c8,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x9caffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x29d029cb,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x29d5ffff,  0xffff29da,  0xffffffff,  0xffffffff,  0x9dfffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x9e109e0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x9e309e2,  0x9e509e4,  0xffffffff,  0xffffffff,  0x9e709e6,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff09e8,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x39e9ffff,  0xffffffff,  0x21f0ffff,  0x29f4ffff,  0x39f9ffff,  0xffffffff,  0xffffffff,  0x2200ffff,  0xa04ffff,  0xffffffff,  0x3205ffff,  0xffffffff,  0x2a0bffff,  0xffffffff,  0xffff0a10,  0xffff0a11,  0x4212ffff,  0xffffffff,  0x221affff,  0x321effff,  0x4224ffff,  0xffffffff,  0xffffffff,  0x222cffff,  0x1230ffff,  0xffffffff,  0x4232ffff,  0xffffffff,  0x323affff,  0x1a431a40,  0xffffffff,  0xffff0a46,  0xffffffff,  0xffff1247,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a49,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff124a,  0xa4cffff,  0x1a4dffff,  0xa521250,  0xffff2253,  0xffff0a57,  0xffffffff,  0xffff0a58,  0xffffffff,  0x2259ffff,  0xffffffff,  0xa5dffff,  0xffffffff,  0xa5effff,  0xa5fffff,  0xffffffff,  0xffff1260,  0xa62ffff,  0x1a63ffff,  0xa681266,  0xffff2269,  0xffff0a6d,  0xffffffff,  0xffff0a6e,  0xffffffff,  0x226fffff,  0xffffffff,  0xa73ffff,  0xffffffff,  0xa74ffff,  0xa75ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a76,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa780a77,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa7a0a79,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa7c0a7b,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1a7dffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a80,  0xffff0a81,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa82ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a83,  0xa84ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a85,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a86,  0xa87ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1288ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1a8affff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a8d,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa90128e,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0a91,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa92ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff1a93,  0xffffffff,  0xffff0a96,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa991297,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1a9affff,  0xffffffff,  0xffff0a9d,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa9effff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xa9fffff,  0xaa0ffff,  0xaa1ffff,  0xaa2ffff,  0xaa3ffff,  0xffffffff,  0xaa4ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0aa5,  0xffff0aa6,  0xaa80aa7,  0xffffffff,  0xffff0aa9,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xaab0aaa,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xaad0aac,  0xffffffff,  0xffffffff,  0xffffffff,  0xaaf0aae,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x12b212b0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xab50ab4,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xab70ab6,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x22bc22b8,  0xac10ac0,  0xac30ac2,  0xac50ac4,  0x22ca22c6,  0xacf0ace,  0xad10ad0,  0xad30ad2,  0x12d612d4,  0xffffffff,  0xffffffff,  0xffffffff,  0x12da12d8,  0xffffffff,  0xffffffff,  0xffffffff,  0x22e022dc,  0xae50ae4,  0xae70ae6,  0xae90ae8,  0x22ee22ea,  0xaf30af2,  0xaf50af4,  0xaf70af6,  0x1afb1af8,  0xffffffff,  0xffffffff,  0xffffffff,  0x1b011afe,  0xffffffff,  0xffffffff,  0xffffffff,  0x13061304,  0xffffffff,  0xffffffff,  0xffffffff,  0x130a1308,  0xffffffff,  0xffffffff,  0xffffffff,  0x1b0f1b0c,  0xffffffff,  0xffffffff,  0xffffffff,  0x1b12ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x23192315,  0xb1e0b1d,  0xb200b1f,  0xb220b21,  0x23272323,  0xb2c0b2b,  0xb2e0b2d,  0xb300b2f,  0xffff0b31,  0xffffffff,  0xffff0b32,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b33,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b34,  0xffffffff,  0xffffffff,  0xffffffff,  0x1b35ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b38,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b39,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff1b3a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b3d,  0xffff0b3e,  0xffff0b3f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b40,  0xffff0b41,  0xffff0b42,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb43ffff,  0xffffffff,  0xffffffff,  0xffff0b44,  0xb45ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb46ffff,  0xb47ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b48,  0xffffffff,  0xffffffff,  0xb49ffff,  0xb4affff,  0xffffffff,  0xffff0b4b,  0xffffffff,  0xb4cffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb4dffff,  0xffffffff,  0xb4f0b4e,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb510b50,  0xffffffff,  0xb530b52,  0xffffffff,  0xb550b54,  0xb570b56,  0xffffffff,  0xffffffff,  0xb590b58,  0xffffffff,  0xb5b0b5a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb5cffff,  0xffff0b5d,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b5e,  0xffffffff,  0xffffffff,  0xb600b5f,  0xb61ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb630b62,  0xb650b64,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b66,  0xffffffff,  0xb67ffff,  0xb68ffff,  0xb69ffff,  0xb6affff,  0xb6bffff,  0xb6cffff,  0xb6dffff,  0xb6effff,  0xb6fffff,  0xb70ffff,  0xb71ffff,  0xb72ffff,  0xffffffff,  0xffff0b73,  0xffff0b74,  0xffff0b75,  0xffffffff,  0xffffffff,  0x1376ffff,  0xffffffff,  0xffff1378,  0x137affff,  0xffffffff,  0xffff137c,  0x137effff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb80ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0b81,  0xffffffff,  0xb82ffff,  0xb83ffff,  0xb84ffff,  0xb85ffff,  0xb86ffff,  0xb87ffff,  0xb88ffff,  0xb89ffff,  0xb8affff,  0xb8bffff,  0xb8cffff,  0xb8dffff,  0xffffffff,  0xffff0b8e,  0xffff0b8f,  0xffff0b90,  0xffffffff,  0xffffffff,  0x1391ffff,  0xffffffff,  0xffff1393,  0x1395ffff,  0xffffffff,  0xffff1397,  0x1399ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb9bffff,  0xb9d0b9c,  0xffff0b9e,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xb9fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xba0ffff,  0xba1ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xba2ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xba3ffff,  0xffff0ba4,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++@property immutable(CompEntry[]) compositionTable()
++{
++alias CE = CompEntry;
++static immutable CE[] t = [CE(0x00338, 0x0226e),CE(0x00338, 0x02260),CE(0x00338, 0x0226f),CE(0x00300, 0x000c0),CE(0x00301, 0x000c1),CE(0x00302, 0x000c2),CE(0x00303, 0x000c3),CE(0x00304, 0x00100),CE(0x00306, 0x00102),CE(0x00307, 0x00226),CE(0x00308, 0x000c4),CE(0x00309, 0x01ea2),CE(0x0030a, 0x000c5),CE(0x0030c, 0x001cd),CE(0x0030f, 0x00200),CE(0x00311, 0x00202),CE(0x00323, 0x01ea0),CE(0x00325, 0x01e00),CE(0x00328, 0x00104),CE(0x00307, 0x01e02),CE(0x00323, 0x01e04),CE(0x00331, 0x01e06),CE(0x00301, 0x00106),CE(0x00302, 0x00108),CE(0x00307, 0x0010a),CE(0x0030c, 0x0010c),CE(0x00327, 0x000c7),CE(0x00307, 0x01e0a),CE(0x0030c, 0x0010e),CE(0x00323, 0x01e0c),CE(0x00327, 0x01e10),CE(0x0032d, 0x01e12),CE(0x00331, 0x01e0e),CE(0x00300, 0x000c8),CE(0x00301, 0x000c9),CE(0x00302, 0x000ca),CE(0x00303, 0x01ebc),CE(0x00304, 0x00112),CE(0x00306, 0x00114),CE(0x00307, 0x00116),CE(0x00308, 0x000cb),CE(0x00309, 0x01eba),CE(0x0030c, 0x0011a),CE(0x0030f, 0x00204),CE(0x00311, 0x00206),CE(0x00323, 0x01eb8),CE(0x00327, 0x00228),CE(0x00328, 0x00118),CE(0x0032d, 0x01e18),CE(0x00330, 0x01e1a),CE(0x00307, 0x01e1e),CE(0x00301, 0x001f4),CE(0x00302, 0x0011c),CE(0x00304, 0x01e20),CE(0x00306, 0x0011e),CE(0x00307, 0x00120),CE(0x0030c, 0x001e6),CE(0x00327, 0x00122),CE(0x00302, 0x00124),CE(0x00307, 0x01e22),CE(0x00308, 0x01e26),CE(0x0030c, 0x0021e),CE(0x00323, 0x01e24),CE(0x00327, 0x01e28),CE(0x0032e, 0x01e2a),CE(0x00300, 0x000cc),CE(0x00301, 0x000cd),CE(0x00302, 0x000ce),CE(0x00303, 0x00128),CE(0x00304, 0x0012a),CE(0x00306, 0x0012c),CE(0x00307, 0x00130),CE(0x00308, 0x000cf),CE(0x00309, 0x01ec8),CE(0x0030c, 0x001cf),CE(0x0030f, 0x00208),CE(0x00311, 0x0020a),CE(0x00323, 0x01eca),CE(0x00328, 0x0012e),CE(0x00330, 0x01e2c),CE(0x00302, 0x00134),CE(0x00301, 0x01e30),CE(0x0030c, 0x001e8),CE(0x00323, 0x01e32),CE(0x00327, 0x00136),CE(0x00331, 0x01e34),CE(0x00301, 0x00139),CE(0x0030c, 0x0013d),CE(0x00323, 0x01e36),CE(0x00327, 0x0013b),CE(0x0032d, 0x01e3c),CE(0x00331, 0x01e3a),CE(0x00301, 0x01e3e),CE(0x00307, 0x01e40),CE(0x00323, 0x01e42),CE(0x00300, 0x001f8),CE(0x00301, 0x00143),CE(0x00303, 0x000d1),CE(0x00307, 0x01e44),CE(0x0030c, 0x00147),CE(0x00323, 0x01e46),CE(0x00327, 0x00145),CE(0x0032d, 0x01e4a),CE(0x00331, 0x01e48),CE(0x00300, 0x000d2),CE(0x00301, 0x000d3),CE(0x00302, 0x000d4),CE(0x00303, 0x000d5),CE(0x00304, 0x0014c),CE(0x00306, 0x0014e),CE(0x00307, 0x0022e),CE(0x00308, 0x000d6),CE(0x00309, 0x01ece),CE(0x0030b, 0x00150),CE(0x0030c, 0x001d1),CE(0x0030f, 0x0020c),CE(0x00311, 0x0020e),CE(0x0031b, 0x001a0),CE(0x00323, 0x01ecc),CE(0x00328, 0x001ea),CE(0x00301, 0x01e54),CE(0x00307, 0x01e56),CE(0x00301, 0x00154),CE(0x00307, 0x01e58),CE(0x0030c, 0x00158),CE(0x0030f, 0x00210),CE(0x00311, 0x00212),CE(0x00323, 0x01e5a),CE(0x00327, 0x00156),CE(0x00331, 0x01e5e),CE(0x00301, 0x0015a),CE(0x00302, 0x0015c),CE(0x00307, 0x01e60),CE(0x0030c, 0x00160),CE(0x00323, 0x01e62),CE(0x00326, 0x00218),CE(0x00327, 0x0015e),CE(0x00307, 0x01e6a),CE(0x0030c, 0x00164),CE(0x00323, 0x01e6c),CE(0x00326, 0x0021a),CE(0x00327, 0x00162),CE(0x0032d, 0x01e70),CE(0x00331, 0x01e6e),CE(0x00300, 0x000d9),CE(0x00301, 0x000da),CE(0x00302, 0x000db),CE(0x00303, 0x00168),CE(0x00304, 0x0016a),CE(0x00306, 0x0016c),CE(0x00308, 0x000dc),CE(0x00309, 0x01ee6),CE(0x0030a, 0x0016e),CE(0x0030b, 0x00170),CE(0x0030c, 0x001d3),CE(0x0030f, 0x00214),CE(0x00311, 0x00216),CE(0x0031b, 0x001af),CE(0x00323, 0x01ee4),CE(0x00324, 0x01e72),CE(0x00328, 0x00172),CE(0x0032d, 0x01e76),CE(0x00330, 0x01e74),CE(0x00303, 0x01e7c),CE(0x00323, 0x01e7e),CE(0x00300, 0x01e80),CE(0x00301, 0x01e82),CE(0x00302, 0x00174),CE(0x00307, 0x01e86),CE(0x00308, 0x01e84),CE(0x00323, 0x01e88),CE(0x00307, 0x01e8a),CE(0x00308, 0x01e8c),CE(0x00300, 0x01ef2),CE(0x00301, 0x000dd),CE(0x00302, 0x00176),CE(0x00303, 0x01ef8),CE(0x00304, 0x00232),CE(0x00307, 0x01e8e),CE(0x00308, 0x00178),CE(0x00309, 0x01ef6),CE(0x00323, 0x01ef4),CE(0x00301, 0x00179),CE(0x00302, 0x01e90),CE(0x00307, 0x0017b),CE(0x0030c, 0x0017d),CE(0x00323, 0x01e92),CE(0x00331, 0x01e94),CE(0x00300, 0x000e0),CE(0x00301, 0x000e1),CE(0x00302, 0x000e2),CE(0x00303, 0x000e3),CE(0x00304, 0x00101),CE(0x00306, 0x00103),CE(0x00307, 0x00227),CE(0x00308, 0x000e4),CE(0x00309, 0x01ea3),CE(0x0030a, 0x000e5),CE(0x0030c, 0x001ce),CE(0x0030f, 0x00201),CE(0x00311, 0x00203),CE(0x00323, 0x01ea1),CE(0x00325, 0x01e01),CE(0x00328, 0x00105),CE(0x00307, 0x01e03),CE(0x00323, 0x01e05),CE(0x00331, 0x01e07),CE(0x00301, 0x00107),CE(0x00302, 0x00109),CE(0x00307, 0x0010b),CE(0x0030c, 0x0010d),CE(0x00327, 0x000e7),CE(0x00307, 0x01e0b),CE(0x0030c, 0x0010f),CE(0x00323, 0x01e0d),CE(0x00327, 0x01e11),CE(0x0032d, 0x01e13),CE(0x00331, 0x01e0f),CE(0x00300, 0x000e8),CE(0x00301, 0x000e9),CE(0x00302, 0x000ea),CE(0x00303, 0x01ebd),CE(0x00304, 0x00113),CE(0x00306, 0x00115),CE(0x00307, 0x00117),CE(0x00308, 0x000eb),CE(0x00309, 0x01ebb),CE(0x0030c, 0x0011b),CE(0x0030f, 0x00205),CE(0x00311, 0x00207),CE(0x00323, 0x01eb9),CE(0x00327, 0x00229),CE(0x00328, 0x00119),CE(0x0032d, 0x01e19),CE(0x00330, 0x01e1b),CE(0x00307, 0x01e1f),CE(0x00301, 0x001f5),CE(0x00302, 0x0011d),CE(0x00304, 0x01e21),CE(0x00306, 0x0011f),CE(0x00307, 0x00121),CE(0x0030c, 0x001e7),CE(0x00327, 0x00123),CE(0x00302, 0x00125),CE(0x00307, 0x01e23),CE(0x00308, 0x01e27),CE(0x0030c, 0x0021f),CE(0x00323, 0x01e25),CE(0x00327, 0x01e29),CE(0x0032e, 0x01e2b),CE(0x00331, 0x01e96),CE(0x00300, 0x000ec),CE(0x00301, 0x000ed),CE(0x00302, 0x000ee),CE(0x00303, 0x00129),CE(0x00304, 0x0012b),CE(0x00306, 0x0012d),CE(0x00308, 0x000ef),CE(0x00309, 0x01ec9),CE(0x0030c, 0x001d0),CE(0x0030f, 0x00209),CE(0x00311, 0x0020b),CE(0x00323, 0x01ecb),CE(0x00328, 0x0012f),CE(0x00330, 0x01e2d),CE(0x00302, 0x00135),CE(0x0030c, 0x001f0),CE(0x00301, 0x01e31),CE(0x0030c, 0x001e9),CE(0x00323, 0x01e33),CE(0x00327, 0x00137),CE(0x00331, 0x01e35),CE(0x00301, 0x0013a),CE(0x0030c, 0x0013e),CE(0x00323, 0x01e37),CE(0x00327, 0x0013c),CE(0x0032d, 0x01e3d),CE(0x00331, 0x01e3b),CE(0x00301, 0x01e3f),CE(0x00307, 0x01e41),CE(0x00323, 0x01e43),CE(0x00300, 0x001f9),CE(0x00301, 0x00144),CE(0x00303, 0x000f1),CE(0x00307, 0x01e45),CE(0x0030c, 0x00148),CE(0x00323, 0x01e47),CE(0x00327, 0x00146),CE(0x0032d, 0x01e4b),CE(0x00331, 0x01e49),CE(0x00300, 0x000f2),CE(0x00301, 0x000f3),CE(0x00302, 0x000f4),CE(0x00303, 0x000f5),CE(0x00304, 0x0014d),CE(0x00306, 0x0014f),CE(0x00307, 0x0022f),CE(0x00308, 0x000f6),CE(0x00309, 0x01ecf),CE(0x0030b, 0x00151),CE(0x0030c, 0x001d2),CE(0x0030f, 0x0020d),CE(0x00311, 0x0020f),CE(0x0031b, 0x001a1),CE(0x00323, 0x01ecd),CE(0x00328, 0x001eb),CE(0x00301, 0x01e55),CE(0x00307, 0x01e57),CE(0x00301, 0x00155),CE(0x00307, 0x01e59),CE(0x0030c, 0x00159),CE(0x0030f, 0x00211),CE(0x00311, 0x00213),CE(0x00323, 0x01e5b),CE(0x00327, 0x00157),CE(0x00331, 0x01e5f),CE(0x00301, 0x0015b),CE(0x00302, 0x0015d),CE(0x00307, 0x01e61),CE(0x0030c, 0x00161),CE(0x00323, 0x01e63),CE(0x00326, 0x00219),CE(0x00327, 0x0015f),CE(0x00307, 0x01e6b),CE(0x00308, 0x01e97),CE(0x0030c, 0x00165),CE(0x00323, 0x01e6d),CE(0x00326, 0x0021b),CE(0x00327, 0x00163),CE(0x0032d, 0x01e71),CE(0x00331, 0x01e6f),CE(0x00300, 0x000f9),CE(0x00301, 0x000fa),CE(0x00302, 0x000fb),CE(0x00303, 0x00169),CE(0x00304, 0x0016b),CE(0x00306, 0x0016d),CE(0x00308, 0x000fc),CE(0x00309, 0x01ee7),CE(0x0030a, 0x0016f),CE(0x0030b, 0x00171),CE(0x0030c, 0x001d4),CE(0x0030f, 0x00215),CE(0x00311, 0x00217),CE(0x0031b, 0x001b0),CE(0x00323, 0x01ee5),CE(0x00324, 0x01e73),CE(0x00328, 0x00173),CE(0x0032d, 0x01e77),CE(0x00330, 0x01e75),CE(0x00303, 0x01e7d),CE(0x00323, 0x01e7f),CE(0x00300, 0x01e81),CE(0x00301, 0x01e83),CE(0x00302, 0x00175),CE(0x00307, 0x01e87),CE(0x00308, 0x01e85),CE(0x0030a, 0x01e98),CE(0x00323, 0x01e89),CE(0x00307, 0x01e8b),CE(0x00308, 0x01e8d),CE(0x00300, 0x01ef3),CE(0x00301, 0x000fd),CE(0x00302, 0x00177),CE(0x00303, 0x01ef9),CE(0x00304, 0x00233),CE(0x00307, 0x01e8f),CE(0x00308, 0x000ff),CE(0x00309, 0x01ef7),CE(0x0030a, 0x01e99),CE(0x00323, 0x01ef5),CE(0x00301, 0x0017a),CE(0x00302, 0x01e91),CE(0x00307, 0x0017c),CE(0x0030c, 0x0017e),CE(0x00323, 0x01e93),CE(0x00331, 0x01e95),CE(0x00300, 0x01fed),CE(0x00301, 0x00385),CE(0x00342, 0x01fc1),CE(0x00300, 0x01ea6),CE(0x00301, 0x01ea4),CE(0x00303, 0x01eaa),CE(0x00309, 0x01ea8),CE(0x00304, 0x001de),CE(0x00301, 0x001fa),CE(0x00301, 0x001fc),CE(0x00304, 0x001e2),CE(0x00301, 0x01e08),CE(0x00300, 0x01ec0),CE(0x00301, 0x01ebe),CE(0x00303, 0x01ec4),CE(0x00309, 0x01ec2),CE(0x00301, 0x01e2e),CE(0x00300, 0x01ed2),CE(0x00301, 0x01ed0),CE(0x00303, 0x01ed6),CE(0x00309, 0x01ed4),CE(0x00301, 0x01e4c),CE(0x00304, 0x0022c),CE(0x00308, 0x01e4e),CE(0x00304, 0x0022a),CE(0x00301, 0x001fe),CE(0x00300, 0x001db),CE(0x00301, 0x001d7),CE(0x00304, 0x001d5),CE(0x0030c, 0x001d9),CE(0x00300, 0x01ea7),CE(0x00301, 0x01ea5),CE(0x00303, 0x01eab),CE(0x00309, 0x01ea9),CE(0x00304, 0x001df),CE(0x00301, 0x001fb),CE(0x00301, 0x001fd),CE(0x00304, 0x001e3),CE(0x00301, 0x01e09),CE(0x00300, 0x01ec1),CE(0x00301, 0x01ebf),CE(0x00303, 0x01ec5),CE(0x00309, 0x01ec3),CE(0x00301, 0x01e2f),CE(0x00300, 0x01ed3),CE(0x00301, 0x01ed1),CE(0x00303, 0x01ed7),CE(0x00309, 0x01ed5),CE(0x00301, 0x01e4d),CE(0x00304, 0x0022d),CE(0x00308, 0x01e4f),CE(0x00304, 0x0022b),CE(0x00301, 0x001ff),CE(0x00300, 0x001dc),CE(0x00301, 0x001d8),CE(0x00304, 0x001d6),CE(0x0030c, 0x001da),CE(0x00300, 0x01eb0),CE(0x00301, 0x01eae),CE(0x00303, 0x01eb4),CE(0x00309, 0x01eb2),CE(0x00300, 0x01eb1),CE(0x00301, 0x01eaf),CE(0x00303, 0x01eb5),CE(0x00309, 0x01eb3),CE(0x00300, 0x01e14),CE(0x00301, 0x01e16),CE(0x00300, 0x01e15),CE(0x00301, 0x01e17),CE(0x00300, 0x01e50),CE(0x00301, 0x01e52),CE(0x00300, 0x01e51),CE(0x00301, 0x01e53),CE(0x00307, 0x01e64),CE(0x00307, 0x01e65),CE(0x00307, 0x01e66),CE(0x00307, 0x01e67),CE(0x00301, 0x01e78),CE(0x00301, 0x01e79),CE(0x00308, 0x01e7a),CE(0x00308, 0x01e7b),CE(0x00307, 0x01e9b),CE(0x00300, 0x01edc),CE(0x00301, 0x01eda),CE(0x00303, 0x01ee0),CE(0x00309, 0x01ede),CE(0x00323, 0x01ee2),CE(0x00300, 0x01edd),CE(0x00301, 0x01edb),CE(0x00303, 0x01ee1),CE(0x00309, 0x01edf),CE(0x00323, 0x01ee3),CE(0x00300, 0x01eea),CE(0x00301, 0x01ee8),CE(0x00303, 0x01eee),CE(0x00309, 0x01eec),CE(0x00323, 0x01ef0),CE(0x00300, 0x01eeb),CE(0x00301, 0x01ee9),CE(0x00303, 0x01eef),CE(0x00309, 0x01eed),CE(0x00323, 0x01ef1),CE(0x0030c, 0x001ee),CE(0x00304, 0x001ec),CE(0x00304, 0x001ed),CE(0x00304, 0x001e0),CE(0x00304, 0x001e1),CE(0x00306, 0x01e1c),CE(0x00306, 0x01e1d),CE(0x00304, 0x00230),CE(0x00304, 0x00231),CE(0x0030c, 0x001ef),CE(0x00300, 0x01fba),CE(0x00301, 0x00386),CE(0x00304, 0x01fb9),CE(0x00306, 0x01fb8),CE(0x00313, 0x01f08),CE(0x00314, 0x01f09),CE(0x00345, 0x01fbc),CE(0x00300, 0x01fc8),CE(0x00301, 0x00388),CE(0x00313, 0x01f18),CE(0x00314, 0x01f19),CE(0x00300, 0x01fca),CE(0x00301, 0x00389),CE(0x00313, 0x01f28),CE(0x00314, 0x01f29),CE(0x00345, 0x01fcc),CE(0x00300, 0x01fda),CE(0x00301, 0x0038a),CE(0x00304, 0x01fd9),CE(0x00306, 0x01fd8),CE(0x00308, 0x003aa),CE(0x00313, 0x01f38),CE(0x00314, 0x01f39),CE(0x00300, 0x01ff8),CE(0x00301, 0x0038c),CE(0x00313, 0x01f48),CE(0x00314, 0x01f49),CE(0x00314, 0x01fec),CE(0x00300, 0x01fea),CE(0x00301, 0x0038e),CE(0x00304, 0x01fe9),CE(0x00306, 0x01fe8),CE(0x00308, 0x003ab),CE(0x00314, 0x01f59),CE(0x00300, 0x01ffa),CE(0x00301, 0x0038f),CE(0x00313, 0x01f68),CE(0x00314, 0x01f69),CE(0x00345, 0x01ffc),CE(0x00345, 0x01fb4),CE(0x00345, 0x01fc4),CE(0x00300, 0x01f70),CE(0x00301, 0x003ac),CE(0x00304, 0x01fb1),CE(0x00306, 0x01fb0),CE(0x00313, 0x01f00),CE(0x00314, 0x01f01),CE(0x00342, 0x01fb6),CE(0x00345, 0x01fb3),CE(0x00300, 0x01f72),CE(0x00301, 0x003ad),CE(0x00313, 0x01f10),CE(0x00314, 0x01f11),CE(0x00300, 0x01f74),CE(0x00301, 0x003ae),CE(0x00313, 0x01f20),CE(0x00314, 0x01f21),CE(0x00342, 0x01fc6),CE(0x00345, 0x01fc3),CE(0x00300, 0x01f76),CE(0x00301, 0x003af),CE(0x00304, 0x01fd1),CE(0x00306, 0x01fd0),CE(0x00308, 0x003ca),CE(0x00313, 0x01f30),CE(0x00314, 0x01f31),CE(0x00342, 0x01fd6),CE(0x00300, 0x01f78),CE(0x00301, 0x003cc),CE(0x00313, 0x01f40),CE(0x00314, 0x01f41),CE(0x00313, 0x01fe4),CE(0x00314, 0x01fe5),CE(0x00300, 0x01f7a),CE(0x00301, 0x003cd),CE(0x00304, 0x01fe1),CE(0x00306, 0x01fe0),CE(0x00308, 0x003cb),CE(0x00313, 0x01f50),CE(0x00314, 0x01f51),CE(0x00342, 0x01fe6),CE(0x00300, 0x01f7c),CE(0x00301, 0x003ce),CE(0x00313, 0x01f60),CE(0x00314, 0x01f61),CE(0x00342, 0x01ff6),CE(0x00345, 0x01ff3),CE(0x00300, 0x01fd2),CE(0x00301, 0x00390),CE(0x00342, 0x01fd7),CE(0x00300, 0x01fe2),CE(0x00301, 0x003b0),CE(0x00342, 0x01fe7),CE(0x00345, 0x01ff4),CE(0x00301, 0x003d3),CE(0x00308, 0x003d4),CE(0x00308, 0x00407),CE(0x00306, 0x004d0),CE(0x00308, 0x004d2),CE(0x00301, 0x00403),CE(0x00300, 0x00400),CE(0x00306, 0x004d6),CE(0x00308, 0x00401),CE(0x00306, 0x004c1),CE(0x00308, 0x004dc),CE(0x00308, 0x004de),CE(0x00300, 0x0040d),CE(0x00304, 0x004e2),CE(0x00306, 0x00419),CE(0x00308, 0x004e4),CE(0x00301, 0x0040c),CE(0x00308, 0x004e6),CE(0x00304, 0x004ee),CE(0x00306, 0x0040e),CE(0x00308, 0x004f0),CE(0x0030b, 0x004f2),CE(0x00308, 0x004f4),CE(0x00308, 0x004f8),CE(0x00308, 0x004ec),CE(0x00306, 0x004d1),CE(0x00308, 0x004d3),CE(0x00301, 0x00453),CE(0x00300, 0x00450),CE(0x00306, 0x004d7),CE(0x00308, 0x00451),CE(0x00306, 0x004c2),CE(0x00308, 0x004dd),CE(0x00308, 0x004df),CE(0x00300, 0x0045d),CE(0x00304, 0x004e3),CE(0x00306, 0x00439),CE(0x00308, 0x004e5),CE(0x00301, 0x0045c),CE(0x00308, 0x004e7),CE(0x00304, 0x004ef),CE(0x00306, 0x0045e),CE(0x00308, 0x004f1),CE(0x0030b, 0x004f3),CE(0x00308, 0x004f5),CE(0x00308, 0x004f9),CE(0x00308, 0x004ed),CE(0x00308, 0x00457),CE(0x0030f, 0x00476),CE(0x0030f, 0x00477),CE(0x00308, 0x004da),CE(0x00308, 0x004db),CE(0x00308, 0x004ea),CE(0x00308, 0x004eb),CE(0x00653, 0x00622),CE(0x00654, 0x00623),CE(0x00655, 0x00625),CE(0x00654, 0x00624),CE(0x00654, 0x00626),CE(0x00654, 0x006c2),CE(0x00654, 0x006d3),CE(0x00654, 0x006c0),CE(0x0093c, 0x00929),CE(0x0093c, 0x00931),CE(0x0093c, 0x00934),CE(0x009be, 0x009cb),CE(0x009d7, 0x009cc),CE(0x00b3e, 0x00b4b),CE(0x00b56, 0x00b48),CE(0x00b57, 0x00b4c),CE(0x00bd7, 0x00b94),CE(0x00bbe, 0x00bca),CE(0x00bd7, 0x00bcc),CE(0x00bbe, 0x00bcb),CE(0x00c56, 0x00c48),CE(0x00cd5, 0x00cc0),CE(0x00cc2, 0x00cca),CE(0x00cd5, 0x00cc7),CE(0x00cd6, 0x00cc8),CE(0x00cd5, 0x00ccb),CE(0x00d3e, 0x00d4a),CE(0x00d57, 0x00d4c),CE(0x00d3e, 0x00d4b),CE(0x00dca, 0x00dda),CE(0x00dcf, 0x00ddc),CE(0x00ddf, 0x00dde),CE(0x00dca, 0x00ddd),CE(0x0102e, 0x01026),CE(0x01b35, 0x01b06),CE(0x01b35, 0x01b08),CE(0x01b35, 0x01b0a),CE(0x01b35, 0x01b0c),CE(0x01b35, 0x01b0e),CE(0x01b35, 0x01b12),CE(0x01b35, 0x01b3b),CE(0x01b35, 0x01b3d),CE(0x01b35, 0x01b40),CE(0x01b35, 0x01b41),CE(0x01b35, 0x01b43),CE(0x00304, 0x01e38),CE(0x00304, 0x01e39),CE(0x00304, 0x01e5c),CE(0x00304, 0x01e5d),CE(0x00307, 0x01e68),CE(0x00307, 0x01e69),CE(0x00302, 0x01eac),CE(0x00306, 0x01eb6),CE(0x00302, 0x01ead),CE(0x00306, 0x01eb7),CE(0x00302, 0x01ec6),CE(0x00302, 0x01ec7),CE(0x00302, 0x01ed8),CE(0x00302, 0x01ed9),CE(0x00300, 0x01f02),CE(0x00301, 0x01f04),CE(0x00342, 0x01f06),CE(0x00345, 0x01f80),CE(0x00300, 0x01f03),CE(0x00301, 0x01f05),CE(0x00342, 0x01f07),CE(0x00345, 0x01f81),CE(0x00345, 0x01f82),CE(0x00345, 0x01f83),CE(0x00345, 0x01f84),CE(0x00345, 0x01f85),CE(0x00345, 0x01f86),CE(0x00345, 0x01f87),CE(0x00300, 0x01f0a),CE(0x00301, 0x01f0c),CE(0x00342, 0x01f0e),CE(0x00345, 0x01f88),CE(0x00300, 0x01f0b),CE(0x00301, 0x01f0d),CE(0x00342, 0x01f0f),CE(0x00345, 0x01f89),CE(0x00345, 0x01f8a),CE(0x00345, 0x01f8b),CE(0x00345, 0x01f8c),CE(0x00345, 0x01f8d),CE(0x00345, 0x01f8e),CE(0x00345, 0x01f8f),CE(0x00300, 0x01f12),CE(0x00301, 0x01f14),CE(0x00300, 0x01f13),CE(0x00301, 0x01f15),CE(0x00300, 0x01f1a),CE(0x00301, 0x01f1c),CE(0x00300, 0x01f1b),CE(0x00301, 0x01f1d),CE(0x00300, 0x01f22),CE(0x00301, 0x01f24),CE(0x00342, 0x01f26),CE(0x00345, 0x01f90),CE(0x00300, 0x01f23),CE(0x00301, 0x01f25),CE(0x00342, 0x01f27),CE(0x00345, 0x01f91),CE(0x00345, 0x01f92),CE(0x00345, 0x01f93),CE(0x00345, 0x01f94),CE(0x00345, 0x01f95),CE(0x00345, 0x01f96),CE(0x00345, 0x01f97),CE(0x00300, 0x01f2a),CE(0x00301, 0x01f2c),CE(0x00342, 0x01f2e),CE(0x00345, 0x01f98),CE(0x00300, 0x01f2b),CE(0x00301, 0x01f2d),CE(0x00342, 0x01f2f),CE(0x00345, 0x01f99),CE(0x00345, 0x01f9a),CE(0x00345, 0x01f9b),CE(0x00345, 0x01f9c),CE(0x00345, 0x01f9d),CE(0x00345, 0x01f9e),CE(0x00345, 0x01f9f),CE(0x00300, 0x01f32),CE(0x00301, 0x01f34),CE(0x00342, 0x01f36),CE(0x00300, 0x01f33),CE(0x00301, 0x01f35),CE(0x00342, 0x01f37),CE(0x00300, 0x01f3a),CE(0x00301, 0x01f3c),CE(0x00342, 0x01f3e),CE(0x00300, 0x01f3b),CE(0x00301, 0x01f3d),CE(0x00342, 0x01f3f),CE(0x00300, 0x01f42),CE(0x00301, 0x01f44),CE(0x00300, 0x01f43),CE(0x00301, 0x01f45),CE(0x00300, 0x01f4a),CE(0x00301, 0x01f4c),CE(0x00300, 0x01f4b),CE(0x00301, 0x01f4d),CE(0x00300, 0x01f52),CE(0x00301, 0x01f54),CE(0x00342, 0x01f56),CE(0x00300, 0x01f53),CE(0x00301, 0x01f55),CE(0x00342, 0x01f57),CE(0x00300, 0x01f5b),CE(0x00301, 0x01f5d),CE(0x00342, 0x01f5f),CE(0x00300, 0x01f62),CE(0x00301, 0x01f64),CE(0x00342, 0x01f66),CE(0x00345, 0x01fa0),CE(0x00300, 0x01f63),CE(0x00301, 0x01f65),CE(0x00342, 0x01f67),CE(0x00345, 0x01fa1),CE(0x00345, 0x01fa2),CE(0x00345, 0x01fa3),CE(0x00345, 0x01fa4),CE(0x00345, 0x01fa5),CE(0x00345, 0x01fa6),CE(0x00345, 0x01fa7),CE(0x00300, 0x01f6a),CE(0x00301, 0x01f6c),CE(0x00342, 0x01f6e),CE(0x00345, 0x01fa8),CE(0x00300, 0x01f6b),CE(0x00301, 0x01f6d),CE(0x00342, 0x01f6f),CE(0x00345, 0x01fa9),CE(0x00345, 0x01faa),CE(0x00345, 0x01fab),CE(0x00345, 0x01fac),CE(0x00345, 0x01fad),CE(0x00345, 0x01fae),CE(0x00345, 0x01faf),CE(0x00345, 0x01fb2),CE(0x00345, 0x01fc2),CE(0x00345, 0x01ff2),CE(0x00345, 0x01fb7),CE(0x00300, 0x01fcd),CE(0x00301, 0x01fce),CE(0x00342, 0x01fcf),CE(0x00345, 0x01fc7),CE(0x00345, 0x01ff7),CE(0x00300, 0x01fdd),CE(0x00301, 0x01fde),CE(0x00342, 0x01fdf),CE(0x00338, 0x0219a),CE(0x00338, 0x0219b),CE(0x00338, 0x021ae),CE(0x00338, 0x021cd),CE(0x00338, 0x021cf),CE(0x00338, 0x021ce),CE(0x00338, 0x02204),CE(0x00338, 0x02209),CE(0x00338, 0x0220c),CE(0x00338, 0x02224),CE(0x00338, 0x02226),CE(0x00338, 0x02241),CE(0x00338, 0x02244),CE(0x00338, 0x02247),CE(0x00338, 0x02249),CE(0x00338, 0x0226d),CE(0x00338, 0x02262),CE(0x00338, 0x02270),CE(0x00338, 0x02271),CE(0x00338, 0x02274),CE(0x00338, 0x02275),CE(0x00338, 0x02278),CE(0x00338, 0x02279),CE(0x00338, 0x02280),CE(0x00338, 0x02281),CE(0x00338, 0x022e0),CE(0x00338, 0x022e1),CE(0x00338, 0x02284),CE(0x00338, 0x02285),CE(0x00338, 0x02288),CE(0x00338, 0x02289),CE(0x00338, 0x022e2),CE(0x00338, 0x022e3),CE(0x00338, 0x022ac),CE(0x00338, 0x022ad),CE(0x00338, 0x022ae),CE(0x00338, 0x022af),CE(0x00338, 0x022ea),CE(0x00338, 0x022eb),CE(0x00338, 0x022ec),CE(0x00338, 0x022ed),CE(0x03099, 0x03094),CE(0x03099, 0x0304c),CE(0x03099, 0x0304e),CE(0x03099, 0x03050),CE(0x03099, 0x03052),CE(0x03099, 0x03054),CE(0x03099, 0x03056),CE(0x03099, 0x03058),CE(0x03099, 0x0305a),CE(0x03099, 0x0305c),CE(0x03099, 0x0305e),CE(0x03099, 0x03060),CE(0x03099, 0x03062),CE(0x03099, 0x03065),CE(0x03099, 0x03067),CE(0x03099, 0x03069),CE(0x03099, 0x03070),CE(0x0309a, 0x03071),CE(0x03099, 0x03073),CE(0x0309a, 0x03074),CE(0x03099, 0x03076),CE(0x0309a, 0x03077),CE(0x03099, 0x03079),CE(0x0309a, 0x0307a),CE(0x03099, 0x0307c),CE(0x0309a, 0x0307d),CE(0x03099, 0x0309e),CE(0x03099, 0x030f4),CE(0x03099, 0x030ac),CE(0x03099, 0x030ae),CE(0x03099, 0x030b0),CE(0x03099, 0x030b2),CE(0x03099, 0x030b4),CE(0x03099, 0x030b6),CE(0x03099, 0x030b8),CE(0x03099, 0x030ba),CE(0x03099, 0x030bc),CE(0x03099, 0x030be),CE(0x03099, 0x030c0),CE(0x03099, 0x030c2),CE(0x03099, 0x030c5),CE(0x03099, 0x030c7),CE(0x03099, 0x030c9),CE(0x03099, 0x030d0),CE(0x0309a, 0x030d1),CE(0x03099, 0x030d3),CE(0x0309a, 0x030d4),CE(0x03099, 0x030d6),CE(0x0309a, 0x030d7),CE(0x03099, 0x030d9),CE(0x0309a, 0x030da),CE(0x03099, 0x030dc),CE(0x0309a, 0x030dd),CE(0x03099, 0x030f7),CE(0x03099, 0x030f8),CE(0x03099, 0x030f9),CE(0x03099, 0x030fa),CE(0x03099, 0x030fe),CE(0x110ba, 0x1109a),CE(0x110ba, 0x1109c),CE(0x110ba, 0x110ab),CE(0x11127, 0x1112e),CE(0x11127, 0x1112f),];
++return t;
++}
++
++}
++
+--- a/src/libphobos/src/std/internal/unicode_decomp.d	1970-01-01 01:00:00.000000000 +0100
++++ b/src/libphobos/src/std/internal/unicode_decomp.d	2014-04-01 16:32:51.000000000 +0100
+@@ -0,0 +1,32 @@
++module std.internal.unicode_decomp;
++import std.internal.unicode_tables;
++
++static if(size_t.sizeof == 8) {
++//22656 bytes
++enum compatMappingTrieEntries = TrieEntry!(ushort, 8, 8, 5)([ 0x0,  0x20,  0x2a0], [ 0x100,  0xa00,  0x21c0], [ 0x402030202020100,  0x706020202020205,  0x802020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x3000200010000,  0x7000600050004,  0xa000900080000,  0xc000b,  0xf000e000d0000,  0x11001000000000,  0x15001400130012,  0x19001800170016,  0x1b001a00000000,  0x0,  0x1c,  0x1e0000001d0000,  0x1f00000000,  0x0,  0x0,  0x0,  0x0,  0x2100200000,  0x2200000000,  0x2400230000,  0x0,  0x2500000000,  0x2700000026,  0x2800000000,  0x2900000000,  0x2a00000000,  0x2b00000000,  0x2c0000,  0x2e002d0000,  0x3100300000002f,  0x330032,  0x340000,  0x35000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3800370036,  0x0,  0x0,  0x0,  0x3b003a00390000,  0x3d003c,  0x410040003f003e,  0x45004400430042,  0x49004800470046,  0x4d004c004b004a,  0x510050004f004e,  0x530052,  0x57005600550054,  0x5a00590058,  0x5e005d005c005b,  0x6100000060005f,  0x620000,  0x0,  0x63000000000000,  0x67006600650064,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x69000000000068,  0x6a00000000,  0x0,  0x0,  0x6b000000000000,  0x0,  0x6c000000000000,  0x0,  0x0,  0x6e00000000006d,  0x7200710070006f,  0x7500740073,  0x79007800770076,  0x7d007c007b007a,  0x80007f007e0000,  0x81,  0x85008400830082,  0x89008800870086,  0x8d008c008b008a,  0x910090008f008e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x92000000000000,  0x93000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x97009600950094,  0x9b009a00990098,  0x9f009e009d009c,  0xa200a100a0,  0xa600a500a400a3,  0xaa00a900a800a7,  0xae00ad00ac00ab,  0xb200b100b000af,  0xb600b500b400b3,  0xba00b900b800b7,  0xbe00bd00bc00bb,  0xc200c100c000bf,  0xc600c500c400c3,  0xca00c900c800c7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xcc00cb,  0xcd0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xcf00ce00000000,  0xd100d00000,  0x0,  0x0,  0x0,  0x0,  0xd500d400d300d2,  0xd900d800d700d6,  0xdd00dc00db00da,  0xdf00d300d200de,  0xe200e100e000d5,  0xe500e400e300d9,  0xe900e800e700e6,  0xed00ec00eb00ea,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf100f000ef00ee,  0xf300f2,  0x0,  0x0,  0x0,  0x0,  0xf700f600f500f4,  0xf8,  0xfb00fa00f9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xff00fe00fd00fc,  0x103010201010100,  0x107010601050104,  0x10b010a01090108,  0x10c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1,  0x0,  0x69200000015,  0x9000000000000,  0x30f034300000000,  0x11b20003,  0x78703140048,  0x49403c603ce,  0x58605730570056d,  0x5f8000005b005a6,  0x6580631062e062b,  0x6f906ea06e706e4,  0x7a907a6078f0000,  0x7e307bf07ac,  0x8b708b408b10000,  0x95f08cb,  0x9c209af09ac09a9,  0xa47000009ec09e2,  0xab30a8c0a890a86,  0xb550b490b460b43,  0xc5e0c5b0c410000,  0xc980c740c61,  0xd6e0d6b0d680000,  0xe1b00000e0c0d82,  0x9c8058c09c50589,  0xa3b05ec0a0a05ce,  0xa4105f20a3e05ef,  0xa6e061a0a4405f5,  0xaa2064700000000,  0xab006550aad0652,  0xab9065e0ad00675,  0xb0106a00afb069a,  0xb0a06a90b0406a3,  0xb1606ba,  0xb4f06f00b4c06ed,  0xb6b070f0b5206f3,  0xb3706d8000006f6,  0xbae072e0b730717,  0x7500bcc07430000,  0x7400bcf07460bd9,  0x78c000000000bc9,  0x7950c4d079b0c3e,  0xed70c47,  0xc8e07d90c8307ce,  0xca207ed,  0xd1d08580d070842,  0xd2b086c0d0d0848,  0xd49088a0d320873,  0xd5d08a60d380879,  0xd54089d,  0xd7808c10d7108ba,  0xd9808e10d7f08c8,  0xdc4090d0d9b08e4,  0xe0f09620de9093f,  0x97f0e290979096e,  0x8400614060d0e2f,  0xcae07f9,  0x0,  0x0,  0x8f0000000000000,  0xda7,  0x0,  0x0,  0x0,  0x0,  0x7360a670613060c,  0x78307800bb9073d,  0x70309f305b70c32,  0x8e70ca507f00b5f,  0x8d20d8d08d60d9e,  0x8ce0d9108da0d89,  0x9e505a900000d85,  0xe630e5a09de05a2,  0xb0706a600000000,  0xccc08170ba80728,  0xecc0e7b0ccf081a,  0xa64061006090b76,  0xaf80697,  0x9ef05b30c3b0789,  0xe680e5d0e600e57,  0x9f905bd09f605ba,  0xabf06640abc0661,  0xb6507090b620706,  0xcab07f60ca807f3,  0xd13084e0d10084b,  0xda408ed0da108ea,  0xd5a08a30d460887,  0xb1f06c300000000,  0x0,  0x9db059f00000000,  0xc9b07e60ac9066e,  0xc9107dc0c7b07c6,  0xe1509680c9407df,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa11073e0e9a0b0d,  0xde10eb80eb60eb4,  0x695,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4b00240012000f,  0x270006,  0xb4108400a280e96,  0xecf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b00000004001a,  0x1d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xed5,  0x5400000000,  0x54600000000,  0x0,  0x7410ee8001c0003,  0xfb40f630f43,  0x103c101600000fed,  0x1185,  0x0,  0x0,  0x0,  0x0,  0x0,  0x101f0fbd00000000,  0x1175111910f5108f,  0x1213,  0x0,  0x0,  0x0,  0x0,  0x0,  0x120c117e00000000,  0x124b120311d5,  0x10161011116e10ea,  0x11ee123c101f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x11f811f011ae,  0x10f00fad,  0x100d0000,  0x0,  0x12ad000012b612b0,  0x12a4000000000000,  0x0,  0x12d712c212ce,  0x0,  0x0,  0x12c80000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x130a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x12ef000012f812f2,  0x132d000000000000,  0x0,  0x131b13041310,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1333133000000000,  0x0,  0x0,  0x12fb12b90000,  0x0,  0x0,  0x0,  0x12ec12aa12e912a7,  0x12f512b300000000,  0x1339133600000000,  0x130112bf12fe12bc,  0x130712c500000000,  0x131512d1130d12cb,  0x133f133c00000000,  0x131812d4132a12e6,  0x132112dd131e12da,  0x132412e0,  0x132712e3,  0x0,  0x0,  0x1342000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13e913e600000000,  0x17ca13ec178f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x185b179213ef0000,  0x1811,  0x0,  0x18520000186d,  0x0,  0x0,  0x0,  0x186a000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18820000,  0x0,  0x188b0000,  0x188e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1879187618731870,  0x18881885187f187c,  0x0,  0x0,  0x189a000000000000,  0x189d,  0x0,  0x0,  0x0,  0x1897000018941891,  0x0,  0x0,  0x0,  0x0,  0x18ac000000000000,  0x18af00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18a618a318a00000,  0x18a900000000,  0x0,  0x0,  0x18b80000000018bb,  0x18be,  0x0,  0x0,  0x0,  0x18b518b2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18c1,  0x0,  0x0,  0x0,  0x0,  0x18ca18c400000000,  0x18c7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18cd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18d0,  0x18da000000000000,  0x18d618d3000018dd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18e618e000000000,  0x18e3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18e900000000,  0x18f318ef18ec,  0x0,  0x0,  0x0,  0x0,  0x18f6000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18ff000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18fc18f9,  0x0,  0x0,  0x0,  0x1902,  0x0,  0x0,  0x0,  0x0,  0x1907000000000000,  0x0,  0x0,  0x190a0000,  0x190d00000000,  0x1910000000000000,  0x0,  0x1913,  0x0,  0x0,  0x19040000,  0x0,  0x1916000000000000,  0x1931193519190000,  0x1938193c,  0x0,  0x191c0000,  0x0,  0x0,  0x0,  0x1922000000000000,  0x0,  0x0,  0x19250000,  0x192800000000,  0x192b000000000000,  0x0,  0x192e,  0x0,  0x0,  0x191f0000,  0x0,  0x0,  0x193f00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1942,  0x0,  0x1a3800000000,  0x1a3e00001a3b,  0x1a4400001a41,  0x1a4700000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a4a000000000000,  0x1a4d0000,  0x1a5600001a531a50,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x5d50e550568,  0x6870e75062905e6,  0x71a060706cf06ac,  0x77e07230734,  0x82c06af0e7e07a4,  0x6920770056b088d,  0x9371a590e840e82,  0xe8e0e8c0a7d0a2e,  0xb79000006020e90,  0xe8807870e7105d3,  0xba30cd31a5d1a5b,  0x86a0ea41a610a24,  0x10ee10ec10ea1a63,  0xa110ae0123e123c,  0x10ec10ea086a0a24,  0x123e123c11f0,  0x0,  0x0,  0x0,  0x1313,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe86000000000000,  0xe900e660e8a09a0,  0xe980e940e920ad9,  0x1a650ea00e9e0e9c,  0xed31a670ea20ed1,  0xeac0eaa0ea60ea8,  0xeba0eb20eb00eae,  0xec00ebe0e790ebc,  0x6110ec40ec21a5f,  0x116e0eca0ec80ec6,  0xa1305da0a0705cb,  0xa1905e00a1605dd,  0xa6b06170a4a05fb,  0xa7a06260a71061d,  0xa7706230a740620,  0xaa9064e0aa5064a,  0xad6067b0ad30678,  0xaef06840acc0671,  0xb1906bd0afe069d,  0xb1c06c00b2206c6,  0xb2806cc0b2506c9,  0xb5806fc0b6e0712,  0xbab072b0ba50725,  0xbd207490bb10731,  0xbdf07560bd5074c,  0xc1207720bdc0753,  0xc1807780c150775,  0xc4a07980c440792,  0xc50079e0c5307a1,  0xc7f07ca0c7707c2,  0xc8a07d50c8607d1,  0xcef08380cec0835,  0xd1608510d0a0845,  0xd20085b0d190854,  0xd3f08800d350876,  0xd3b087c0d2e086f,  0xd4e089a0d420883,  0xd6308ac0d5708a0,  0xdc1090a0d6008a9,  0xdc709100dca0913,  0xd7b08c40d7408bd,  0xdde09270ddb0924,  0xde6093c0de30939,  0xdec09420def0945,  0xe0109540df50948,  0xe18096b0e040957,  0xe3509850e2c097c,  0xd510b2b0e380988,  0xd3509a60e210df2,  0x0,  0x9e905ad09fc05c0,  0x9b2057609b6057a,  0x9ba057e09be0582,  0x9cf059309ff05c3,  0x9d7059b09cb058f,  0xa0305c709d30597,  0xab6065b0ac20667,  0xa9306380a9f0644,  0xa9b06400a8f0634,  0xac5066a0a97063c,  0xb68070c0b5c0700,  0xc9f07ea0cc50810,  0xc6407af0c6807b3,  0xc6c07b70c7007bb,  0xcb508000cc80813,  0xcbd08080cb107fc,  0xcc1080c0cb90804,  0xd9508de0dbe0907,  0xdaa08f30dae08f7,  0xdb208fb0db608ff,  0xe09095c0dba0903,  0xe1e09710e240974,  0xe120965,  0x0,  0x10c1109f10be109c,  0x10d310b110ca10a8,  0xf160ef40f130ef1,  0xf280f060f1f0efd,  0x110610fb110310f8,  0x110a10ff,  0xf540f490f510f46,  0xf580f4d,  0x1145112311421120,  0x11571135114e112c,  0xf8b0f690f880f66,  0xf9d0f7b0f940f72,  0x119f1190119c118d,  0x11a7119811a31194,  0xfd20fc30fcf0fc0,  0xfda0fcb0fd60fc7,  0x11e611db11e311d8,  0x11ea11df,  0xffe0ff30ffb0ff0,  0x10020ff7,  0x122d121e122a121b,  0x1235122612311222,  0x1025000010220000,  0x102d000010290000,  0x1277125512741252,  0x128912671280125e,  0x106410421061103f,  0x10761054106d104b,  0x10f510f2108f1088,  0x1175117211191112,  0x1203120011d511d2,  0x124b1244,  0x10c510a310dc10ba,  0x10d710b510ce10ac,  0xf1a0ef80f310f0f,  0xf2c0f0a0f230f01,  0x114911271160113e,  0x115b113911521130,  0xf8f0f6d0fa60f84,  0xfa10f7f0f980f76,  0x127b125912921270,  0x128d126b12841262,  0x10681046107f105d,  0x107a10581071104f,  0x10e7108b10961099,  0x10e310e000001092,  0xee80ee50eeb0eee,  0x2a1170002a0f35,  0x116b111500200051,  0x116711640000111c,  0xf630f600f430f40,  0x350031002d0faa,  0x118511811178117b,  0x118911ab00000000,  0xfb40fb10fb70fba,  0x440040003c0000,  0x1213120f12061209,  0x1217123911f511f2,  0x101610131019101c,  0x995001c0018100a,  0x129d124700000000,  0x129912960000124e,  0x103c10390fed0fea,  0x3900031083,  0x1000100010001,  0x1000100010001,  0x100010001,  0x0,  0x1a690000,  0x4e000000000000,  0x0,  0x0,  0x0,  0x2ff02fc02fa,  0x0,  0x1000000000000,  0x1a6f000000000000,  0x1a7e1a7b00001a72,  0x0,  0xc0000008f,  0x0,  0x563000000000000,  0x920560,  0x0,  0x0,  0x1a76000000000000,  0x0,  0x1000000000000,  0x0,  0x0,  0x0,  0x0,  0xae00305,  0x392038303740365,  0x1aad02f403b003a1,  0xb3b00a500a10544,  0x30f034303140305,  0x392038303740365,  0x1aad02f403b003a1,  0xa500a10544,  0xb4107870a7d0692,  0xa280b790b0d0e8c,  0x8400cd30b3b05d3,  0xba3,  0x0,  0x0,  0x83f,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe4d05e309a2099e,  0xe770a220a1e0000,  0x6ac06020e500000,  0xe6d0b0d06ac06ac,  0xa28073406cf06cf,  0x786077e0000,  0x82c083b06af0000,  0x82c082c,  0x897088f0863,  0x77c0000060a,  0x5b0071a0000060a,  0xa7d000005e305d5,  0x7230000067e0629,  0x136a136213540787,  0x68000000ae0136f,  0x10060f3a10ec11ee,  0x1aab,  0xa7d0a2e05e60000,  0x73e0ae0,  0x0,  0x3ca03c103e203da,  0x498045903d20455,  0x3de04e703d604cf,  0x3be051104eb049c,  0x6de06d406d106cf,  0x91f091b091806b2,  0x950094d068206e1,  0x72305e605e30734,  0xb3d0b330b300ae0,  0xdd60dd20dcf086a,  0xdfd0dfa0b410b40,  0x5d30a2e09a00a28,  0x0,  0x0,  0x30d0000,  0x0,  0x0,  0x0,  0x1a8d1a8600000000,  0x0,  0x0,  0x0,  0x0,  0x1a9200000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a981a9b1a950000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1aa0,  0x1aa50000,  0x1aa8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ab200001aaf,  0x0,  0x1ac100001ab81ab5,  0x1ac4,  0x0,  0x0,  0x0,  0x1ac80000,  0x1ace000000001acb,  0x1ad10000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ad700000556,  0x0,  0x0,  0x55b054a1ad40000,  0x1add1ada,  0x1ae31ae0,  0x1ae91ae6,  0x0,  0x1aef1aec,  0x1afb1af8,  0x1b011afe,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b131b101b0d1b0a,  0x0,  0x0,  0x0,  0x0,  0x1b071b041af51af2,  0x0,  0x1b191b1600000000,  0x1b1f1b1c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b371b350000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x365030f03430314,  0x3a1039203830374,  0x342032f031c03b0,  0x382037303640355,  0x3f703af03a00391,  0xe600e200d900a3,  0xf600f200ee00ea,  0xb100ac00a700fa,  0xc500c000bb00b6,  0xdd00d400cf00ca,  0x368035903460319,  0x3a4039503860377,  0x3450332031f03b3,  0x385037603670358,  0x3fa03b203a30394,  0x172016e016a0166,  0x182017e017a0176,  0x192018e018a0186,  0x1a2019e019a0196,  0x1b201ae01aa01a6,  0x1c201be01ba01b6,  0x5d5056801ca01c6,  0x67e062905e605e3,  0x60706cf06ac0687,  0x77e07230734071a,  0x82c083b06af07a4,  0x6b2056b088d085e,  0x60a095a06820770,  0xa2e09a009370692,  0xb0d06020ad90a7d,  0xa280b79073e0ae0,  0xcd307870b3b05d3,  0xba308400a1105d8,  0xb410de1086a0a24,  0x30506110695,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1abc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x552054f0542,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b2c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6b2073e,  0x0,  0x0,  0x0,  0x1b2f000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x227c000000000000,  0x0,  0x0,  0x0,  0x0,  0x26b0000000000000,  0x0,  0x0,  0x0,  0x1f091f011efb1ee9,  0x1f1b1f171f131f0d,  0x1f5f1f571f4b1f21,  0x1f871f771f6f1f67,  0x1fb91fa51f8b1f89,  0x1fcd1fc71fc51fc1,  0x1feb1fe91fdd1fdb,  0x204f20451ff71fef,  0x207f207d2079206f,  0x20b420ae20982087,  0x20ce20cc20ca20c4,  0x20f820f220dc20da,  0x210f2108210020fc,  0x212f212b21292113,  0x2141213921352131,  0x21972195218b214f,  0x21e521e321d921d7,  0x32521f121ed21e9,  0x2260222303292211,  0x227a2274226e2266,  0x228422822280227e,  0x230c230622e22286,  0x231623122310230e,  0x2334233023222318,  0x235c235a23562354,  0x2376237423622360,  0x238a238823862384,  0x23aa23a823a62394,  0x23ee23de23dc23bc,  0x241c240a23fa23f6,  0x2452244c2442243e,  0x245e245c245a2456,  0x247e247a246c246a,  0x248e248a24842482,  0x2498249624922490,  0x250e250c24f224e8,  0x2530252c25282512,  0x2558255425522534,  0x25742572255c255a,  0x2592258425822578,  0x25ba25aa25982596,  0x25de25c825c425c2,  0x260025fa25e825e0,  0x261a261826142608,  0x26262624261e261c,  0x263c263a2638262a,  0x2658264e264a2648,  0x26622660265c265a,  0x2670266826662664,  0x26862684267e267c,  0x2690268e268a2688,  0x26a0269c26982692,  0x26aa26a826a626a2,  0x26b226ae,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b4900000000,  0x1fd11fcf1fcd,  0x0,  0x0,  0x0,  0x0,  0x1b8100001b7e,  0x1b8700001b84,  0x1b8d00001b8a,  0x1b9300001b90,  0x1b9900001b96,  0x1b9f00001b9c,  0x1ba500001ba20000,  0x1ba80000,  0x0,  0x1bb100001bae1bab,  0x1bba1bb700001bb4,  0x1bc01bbd0000,  0x1bc91bc6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b7b,  0x87000000000000,  0x1bcc1bd30000008a,  0x0,  0x0,  0x0,  0x1c4300001c26,  0x1c9200001bf6,  0x1caf00001c9b,  0x1cca00001cbf,  0x1cdc00001ccf,  0x1ceb00001ce1,  0x1cf700001cf20000,  0x1c100000,  0x0,  0x1d3b00001d261d1d,  0x1d611d5700001d42,  0x1d7e1d760000,  0x1caa1da1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1e44000000001c01,  0x1e571e521e4d,  0x1ca11e6000000000,  0x0,  0x0,  0x0,  0x0,  0x1a10194919440000,  0x19501a141a12194b,  0x1a181a1619571955,  0x1a201a1e1a1c1a1a,  0x19661961195c19a6,  0x196f196d196819b0,  0x198e198319811977,  0x1947199d19981993,  0x19de19dc19da19d8,  0x198c19e419e219e0,  0x19ee19ec19ea19e8,  0x19f619f419f21975,  0x19fe197f19fa19f8,  0x1a2219a419a219d4,  0x1a2a1a281a261a24,  0x1a3019a81a2e1a2c,  0x19ae19ac19aa1a32,  0x19b819b619b419b2,  0x19c019be19bc19ba,  0x19c819c619c419c2,  0x1a361a3419cc19ca,  0x1a0019d219d019ce,  0x1a081a061a041a02,  0x1a0e1a0c1a0a,  0x1f171ee900000000,  0x1efd1ef120471eef,  0x1ef71f0d23641ef3,  0x1f212051208c1eeb,  0x1e901e001d701ce,  0x20d020401fb01f2,  0x245023c02330225,  0x1db01d20257024e,  0x1ff01f601ed01e4,  0x237022902110208,  0x25b025202490240,  0x21e0216022e,  0x2a0026802700260,  0x284026402880274,  0x2c402b00290026c,  0x2a402ec02b802c0,  0x2d002b402bc02ac,  0x2d402e402c80298,  0x2a8029c0278028c,  0x29402e8027c02cc,  0x2e002dc028002d8,  0x23fe21e321112021,  0x0,  0x0,  0x41c04110406082e,  0x440043904320427,  0x475046e044e0447,  0x4850482047f047c,  0x19571950194b1944,  0x196f19681961195c,  0x1993198e19831977,  0x194d1946199d1998,  0x1963195e19591952,  0x198519791971196a,  0x199f199a19951990,  0x1974197c1988,  0x20471eef1f171ee9,  0x1f5f1eed1f611f19,  0x22e203291fcd1f0f,  0x204f25c822232286,  0x2240221b223b0325,  0x23ca255e231c2007,  0x2098236823e21fab,  0x22961fdf1f4925a2,  0x208a1f731f2b262c,  0x20fa1ef31efd1ef1,  0x20b220b81fc92001,  0x1fd725681f292390,  0x48e048b04882083,  0x4b704b404b10491,  0x4c304c004bd04ba,  0x4e404cc04c904c6,  0x4d604a3034e033b,  0x5290518050304f2,  0x34d033a0327053a,  0x7390a7f0a8206b4,  0x1c0a1bff1bf11bd8,  0x1c731c411c241c1a,  0x1cbd1cad1c991c90,  0x1cdf1cda1ccd1c1e,  0x1bde1cf51cf01bfb,  0x1c8e1d111d0f1ca6,  0x1d551d391d1b1d0d,  0x1ddc1c311d9f1d74,  0x1e041e001def1c22,  0x1c351e1b1e191e11,  0x1e421c5d1e341bed,  0x1e551e501e4b,  0x1beb1be51be01bda,  0x1c0c1c041bf91bf3,  0x1c331c201c1c1c13,  0x1c2e1c291c3c1c37,  0x1c501c571c4b1c46,  0x1c6d1c661c5f1c5c,  0x1c8b1c841c7d1c61,  0x1cb21ca81ca41c95,  0x1cd61cd21cc21cb7,  0x1c811d031cfa1ce4,  0x1d291d351d171d0c,  0x1d4c1d451d201d30,  0x1d6b1d641d3e1d51,  0x1d811d951d701d5a,  0x1d8f1d8a1d9b1d85,  0x1db81da41dac1d79,  0x1dc51dbf1dbb1db2,  0x1dd61dd21dce1dca,  0x1df11de61de31dde,  0x1e0b1e061c681df5,  0x1e291e241e1f1e13,  0x1c6f1e391e361e2e,  0x3610352033f0311,  0x39d038e037f0370,  0x33e032b03bb03ac,  0x37e036f03600351,  0x3ba03ab039c038d,  0x4230418040d0402,  0x56a0a530b0f042e,  0xa590ce60c580a0f,  0x210a06db0a600a5c,  0x223d21f920892200,  0xbea11b40c260cda,  0x689075b071c0b7b,  0xc290cdd0b8c0a26,  0x6010bf611c011b7,  0x68c07640b7e068d,  0xa560bfd11c30893,  0x11c60c350aec0b94,  0xc030b970a300c00,  0xc070b9a0a340a33,  0xc1b0b9e0a380a37,  0x7680b8206910c1f,  0xd000cfa0cf60690,  0xc0f11c90c380ce9,  0xbed11ba0c2c0ce0,  0xc2f0ce3076c0b86,  0x76f0b890bf011bd,  0x5d70999077b0bb4,  0x5e805ff0a2d0a2a,  0x6ae0b1306940a50,  0xba20722071f0b3a,  0xbc60bc20bbf0bbc,  0x8200c0b0bf90bf3,  0xd25082b08230cd5,  0x5d1092a09360869,  0x36c035d034a0337,  0x3a80399038a037b,  0x3490336032303b7,  0x389037a036b035c,  0x3fe03b603a70398,  0x42a041f04140409,  0x44a0443043c0435,  0xaf4047804710451,  0x0,  0x0,  0x0,  0x0,  0x26b4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe730e6b,  0x0,  0x256a258422132556,  0x26ae1ff91eff22c6,  0x202b25c8209226ae,  0x244a238221872090,  0x25a8251e250424e6,  0x233c22f0229a2254,  0x1f11265225bc24ca,  0x24e42302225e1fe3,  0x24dc22d620e6267a,  0x250a247821a12526,  0x232822a6221d211f,  0x1fb31f7d1f3125ae,  0x23922300225a21d5,  0x257e24ec24e02456,  0x23b02678266a2610,  0x25d624bc242c23d0,  0x212d206d2540267e,  0x23b4231a24682408,  0x20d4206b260c2566,  0x242422ca22b02256,  0x246e1fb125ec2438,  0x242e23e61f811f83,  0x21a3254e25f024c8,  0x20be1f0525462254,  0x1fc3237223322159,  0x1ef5214b1f3923b8,  0x1fed242221e12290,  0x253824cc23982063,  0x21ab228c25962276,  0x1f1f237021bb24a8,  0x241822441f7f1f5d,  0x1fb725c6253e2494,  0x21ef212720982011,  0x265625e423ba22d8,  0x220f1fa5268c2680,  0x217b210d2590226c,  0x22f622d021d12189,  0x2464243223e0234e,  0x25d8259c24d02588,  0x22ee201b1fa71f91,  0x2155211d25382514,  0x232c2406227221b7,  0x20f020be20491f27,  0x24502348233a215b,  0x2612260a25ca2460,  0x25c023da1f332630,  0x1f451f15216725fe,  0x225421e720d020c0,  0x25a624d6238022fc,  0x1fa325ea220726aa,  0x22be22a22233222d,  0x242023ae236e2340,  0x25f221911f612636,  0x258a22b220e21f3d,  0x23322237216b2143,  0x20d820091f9525f6,  0x2294224a222521fc,  0x251624462378233e,  0x1fcb260425c4251c,  0x235022fe200b22c0,  0x2682266e25f824de,  0x23f6247c22ae2231,  0x22ea2326240e23fc,  0x1f9724b01f23254c,  0x241421a521151f8f,  0x258e220d229c20b6,  0x2123252c25ee250e,  0x20371f4d,  0x220500002061,  0x238c232a1f850000,  0x23d823ce23cc23be,  0x245224102616,  0x2544000024e2,  0x25b4259e0000,  0x2642264000000000,  0x25fc25b026762644,  0x1faf1f511f471f35,  0x203d202f1fd51fb5,  0x20d62065205f2041,  0x21792175216120da,  0x220921f321db2185,  0x22ce22b622a82246,  0x23b22342230822f8,  0x23c623c223c42240,  0x23d623d423ca23c8,  0x2432240023f223e8,  0x24582444243a2436,  0x24ce249a249a2480,  0x254a2548252e2522,  0x259e259a256e256c,  0x215d263426282606,  0x248c274b,  0x1f2f1f5b1f7b1ef9,  0x1fbb1fad1f651f4f,  0x203b202d2025202f,  0x2094208e20692061,  0x2125212120aa20a2,  0x21712165214d213d,  0x2185217321792169,  0x21c921c521bf2193,  0x221f221d220521dd,  0x22a22276226e2229,  0x22dc22ce22c422c8,  0x2324230a23a422f8,  0x236a2358234a232a,  0x238e238c237e237c,  0x23b6239e23a02396,  0x2428240c240023f4,  0x24b2245824402432,  0x252a2524250024c6,  0x253c2544253a252e,  0x254a254225462548,  0x25a4258c256e2550,  0x260625f425ce25be,  0x262e262826202616,  0x272126ae265e2634,  0x1ea11e8d2733271f,  0x27a9277927671ea3,  0x26ac26a4,  0x0,  0xade0ae30adf0adb,  0xd280d280ae2,  0x0,  0x0,  0x134e000000000000,  0x134b135113481345,  0x0,  0x13d2000013850000,  0x1374136f135413a6,  0x13b7139b1360138e,  0x13ca13c702f413cd,  0x1359135613c313bf,  0x1371136c1364135c,  0x137f137c1376,  0x1390138b13881382,  0x139d00001398,  0x13a8000013a313a0,  0x13b413b1000013ab,  0x137913cf13bc13b9,  0x135f13ae13931367,  0x181e181e18181818,  0x18201820181e181e,  0x1824182418201820,  0x181c181c18241824,  0x18221822181c181c,  0x181a181a18221822,  0x183c183c181a181a,  0x183e183e183c183c,  0x18281828183e183e,  0x1826182618281828,  0x182a182a18261826,  0x182c182c182a182a,  0x18321832182c182c,  0x1834183418301830,  0x18381838182e182e,  0x1840184018361836,  0x1844184418401840,  0x1848184818441844,  0x1846184618481848,  0x184a184a18461846,  0x184c184c184c184c,  0x18501850186d186d,  0x184e184e18501850,  0x15911591184e184e,  0x186a186a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1842000000000000,  0x1803184218421842,  0x180717ff17ff1803,  0x18621862185b1807,  0x1860186018551855,  0x180b180b180b180b,  0x17cd17cd14151415,  0x17f117f1180d180d,  0x17fd17fd18011801,  0x1809180918051805,  0x17f517f517f51809,  0x1864186418641864,  0x17f517e517d517d1,  0x13fe13f713f417f9,  0x141e14171414140b,  0x146a144d1438142d,  0x1484147b1472146d,  0x14311422148c1487,  0x143c14d414d11435,  0x151a150c150514fa,  0x15a515a215931562,  0x15c815c515ba15b0,  0x1607157515e415df,  0x16451642163f160a,  0x165b16561653164c,  0x1679167416711662,  0x16851682167f167c,  0x16aa169616931688,  0x1579158c16c816b9,  0x14591455145116e0,  0x172d1461145d1526,  0x17691758174f1740,  0x177f17741771176c,  0x17aa17a3179c1782,  0x14e417c717c417b3,  0x64005d179714ee,  0x8000790072006b,  0x17e917e517e117dd,  0x140813db17f917f5,  0x14171414140e140b,  0x1464144d144a1447,  0x14781475146d146a,  0x14871484147e147b,  0x1674167116561653,  0x1693168816851679,  0x16e01579158c1696,  0x17551752152616e5,  0x176c176917631758,  0x17b317b017ad1797,  0x17d117c717c417be,  0x17ed17e517d917d5,  0x140b13fe13f713f4,  0x1438142d141e1411,  0x148c147b1467144d,  0x14d1143514311422,  0x150c150514fa143c,  0x1593156d1562151a,  0x15ba15b015a515a2,  0x157515e415df15c5,  0x1642163f160a1607,  0x1662165b164c1645,  0x16851682167f167c,  0x16c816b916aa1688,  0x1455145113e0158c,  0x1740172d15261459,  0x177117661758174f,  0x17a3179c17851774,  0x17e515ed17b317aa,  0x144d1411140b17ed,  0x151a1481147b1467,  0x16851557154c1529,  0x17661758158c1688,  0x162c162515ed17b3,  0x15ff15da15d71633,  0x152c161c16191602,  0x1490155d155a152f,  0x1440142a142613fb,  0x15bd159d159a1402,  0x1546153b153415c0,  0x157015171549154c,  0x15ff15da15d715b7,  0x152c161c16191602,  0x1490155d155a152f,  0x1440142a142613fb,  0x15bd159d159a1402,  0x1546153b153415c0,  0x157015171549154c,  0x1546153b153415b7,  0x15c815571529154c,  0x1534150c150514fa,  0x15df15c81546153b,  0x13e313e3,  0x0,  0x0,  0x0,  0x0,  0x1434143014301421,  0x145814541450143b,  0x14c114c514a314a3,  0x1521150114fd1508,  0x15251525151d1521,  0x153e159615651565,  0x154f154f1537153e,  0x15b315a815531553,  0x15cf15cb15cb15b3,  0x15f315f315e715d3,  0x16111615160d15f7,  0x1669166516481648,  0x16ad16c016c416bc,  0x16d216cb16cb16ad,  0x170b170216fe16d2,  0x1716171216f316eb,  0x177716ef00000000,  0x173417471743177b,  0x175b175f17381734,  0x1429140117b617b6,  0x1460143f14431425,  0x14a7148f14ab145c,  0x15ac15421569150f,  0x179f17a616d616b5,  0x174b166d172117ba,  0x168f15fb16bc1665,  0x168b16b1171a1730,  0x14ba1493173016b1,  0x168b13fa164f16f7,  0x173c1513159615e7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13d913de165e158f,  0x15eb14e915731706,  0x1497157c1578158a,  0x14f1,  0x0,  0x0,  0x0,  0x0,  0x5401b331b3102f6,  0x1b770093008d0546,  0x2ff1b79,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9931a6b1a6d02fc,  0xe3b00a500a10993,  0x1b451b4f1b4b0e3f,  0x1b351b3b1b391b47,  0x1b411b3f1b3d1b37,  0x98b000000001b43,  0xc000c000c098f,  0x99309930993000c,  0x2fa1b3102f6,  0x8d009305400546,  0xe3b00a500a11a6d,  0x971b4f1b4b0e3f,  0x2f802f402f2009d,  0x54405590548,  0x566009b0099098d,  0x0,  0x5a161f0057,  0x1622006800000061,  0x163000761629006f,  0x163a00841637007d,  0x13e913e613e613d5,  0x13ec178f178f13e9,  0x17ca17ca17ca13ec,  0x13f213d713d717ca,  0x141a13f213f213f2,  0x141c141c141c141a,  0x147014701470141c,  0x13f513f513f51470,  0x13f813f813f813f5,  0x13ff13ff13ff13f8,  0x14e214e014e013ff,  0x140913dc13dc14e2,  0x14f814f814f81409,  0x15321532153214f8,  0x1560156015601532,  0x15a015a015a01560,  0x15c315c315c315a0,  0x15dd15dd15dd15c3,  0x15e215e215e215dd,  0x16051605160515e2,  0x163d163d163d1605,  0x165916591659163d,  0x1677167716771659,  0x14ec14ec14ec1677,  0x140c140c140c14ec,  0x140f140f140f140c,  0x13e113e113e1140f,  0x14151788178813e1,  0x13fc13fc13fc1415,  0x16a2169e169e13fc,  0x169b16a616a616a2,  0x169b,  0x970095008d0000,  0x9f009d009b0099,  0x2f402f200a500a1,  0x30302fa02f802f6,  0x30f034303140305,  0x392038303740365,  0x546054003b003a1,  0x93055905440548,  0x5e305d505680566,  0x687067e062905e6,  0x71a060706cf06ac,  0x7a4077e07230734,  0x85e082c083b06af,  0x77006b2056b088d,  0x98b060a095a0682,  0x9930991098f098d,  0x9a0093706920995,  0x6020ad90a7d0a2e,  0xb79073e0ae00b0d,  0x7870b3b05d30a28,  0x8400a1105d80cd3,  0xde1086a0a240ba3,  0xe3b061106950b41,  0x1b280e410e3f0e3d,  0x1b3f1b3d1b331b2a,  0x1bd61e551e5c1b31,  0x1c181c081bfd1bef,  0x1cee1e171e0f1e02,  0x1bff1bf11bd81c16,  0x1c411c241c1a1c0a,  0x1cad1c991c901c73,  0x1cda1ccd1c1e1cbd,  0x1cf51cf01bfb1cdf,  0x1d111d0f1ca61bde,  0x1d391d1b1d0d1c8e,  0x1c311d9f1d741d55,  0x1e001def1c221ddc,  0x1e1b1e191e111e04,  0x1c5d1e341bed1c35,  0x8b00881c061e42,  0x1a101949194419d4,  0x19501a141a12194b,  0x1a181a1619571955,  0x1a201a1e1a1c1a1a,  0x19661961195c19a6,  0x196f196d196819b0,  0x198e198319811977,  0x199d19981993,  0x19d8194700000000,  0x19e019de19dc19da,  0x19e419e200000000,  0x19ec19ea19e8198c,  0x197519ee00000000,  0x19f819f619f419f2,  0x197f19fa00000000,  0x19fe,  0x90e4b0e450e43,  0x1a820e470e49,  0x1a8b1a891a841b22,  0x1b261b241a90,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26b600000000,  0x26b9,  0x0,  0x0,  0x26bc000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26c226bf00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26c826c500000000,  0x26d726d326cf26cb,  0x26db,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26df000000000000,  0x26e626ed26e226ea,  0x26f1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae000000602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e300000568,  0x68700000000,  0x71a06070000,  0x6af07a4077e0000,  0x88d085e0000083b,  0x682077006b2056b,  0x9370692060a095a,  0xad900000a2e09a0,  0x73e0ae00b0d0000,  0xb3b05d30a280b79,  0xa1105d80cd30000,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e6000005d50568,  0x687067e0629,  0x734071a06070000,  0x6af07a4077e0723,  0x88d085e0000083b,  0x682077006b2056b,  0x93706920000095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e6000005d50568,  0x687067e0629,  0x734071a060706cf,  0x7a400000723,  0x88d085e00000000,  0x682077006b2056b,  0x93706920000095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x9370692060a095a,  0xad90a7d0a2e09a0,  0x73e0ae00b0d0602,  0xb3b05d30a280b79,  0xa1105d80cd30787,  0x86a0a240ba30840,  0x61106950b410de1,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x61106950b410de1,  0xe800e6f,  0xf3c0f3a0f380ee3,  0xfad0f5e0f5c0f3e,  0xfe20fe00fde0faf,  0x10060fe80fe60fe4,  0x100f100d0fad1008,  0x1035103310311011,  0x10ea10861aa3077c,  0x110e10f010ee10ec,  0x11ae1170116e1110,  0x11ce11cc11b211b0,  0x11f811f011ee11d0,  0x123c11fe11fc11fa,  0x1a9e12421240123e,  0x123c11ae116e10f0,  0xf380ee311ee11f0,  0xf5c0f3e0f3c0f3a,  0xfde0faf0fad0f5e,  0xfe60fe40fe20fe0,  0xfad100810060fe8,  0x10311011100f100d,  0x1aa3077c10351033,  0x10ee10ec10ea1086,  0x116e1110110e10f0,  0x11b211b011ae1170,  0x11ee11d011ce11cc,  0x11fc11fa11f811f0,  0x1240123e123c11fe,  0x116e10f01a9e1242,  0x11ee11f0123c11ae,  0xf3c0f3a0f380ee3,  0xfad0f5e0f5c0f3e,  0xfe20fe00fde0faf,  0x10060fe80fe60fe4,  0x100f100d0fad1008,  0x1035103310311011,  0x10ea10861aa3077c,  0x110e10f010ee10ec,  0x11ae1170116e1110,  0x11ce11cc11b211b0,  0x11f811f011ee11d0,  0x123c11fe11fc11fa,  0x1a9e12421240123e,  0x123c11ae116e10f0,  0xf380ee311ee11f0,  0xf5c0f3e0f3c0f3a,  0xfde0faf0fad0f5e,  0xfe60fe40fe20fe0,  0xfad100810060fe8,  0x10311011100f100d,  0x1aa3077c10351033,  0x10ee10ec10ea1086,  0x116e1110110e10f0,  0x11b211b011ae1170,  0x11ee11d011ce11cc,  0x11fc11fa11f811f0,  0x1240123e123c11fe,  0x116e10f01a9e1242,  0x11ee11f0123c11ae,  0xf3c0f3a0f380ee3,  0xfad0f5e0f5c0f3e,  0xfe20fe00fde0faf,  0x10060fe80fe60fe4,  0x100f100d0fad1008,  0x1035103310311011,  0x10ea10861aa3077c,  0x110e10f010ee10ec,  0x11ae1170116e1110,  0x11ce11cc11b211b0,  0x11f811f011ee11d0,  0x123c11fe11fc11fa,  0x1a9e12421240123e,  0x123c11ae116e10f0,  0x12a212a011ee11f0,  0x314030500000000,  0x3740365030f0343,  0x3b003a103920383,  0x30f034303140305,  0x392038303740365,  0x314030503b003a1,  0x3740365030f0343,  0x3b003a103920383,  0x30f034303140305,  0x392038303740365,  0x314030503b003a1,  0x3740365030f0343,  0x3b003a103920383,  0x14e013f513f213d7,  0x13f8140917880000,  0x14ec167713fc15c3,  0x15e214f8140f140c,  0x13dc16591560163d,  0x13ff1470141c1532,  0x160515dd15a014e2,  0x1816183a184a1814,  0x13f513f20000,  0x13f80000000013e1,  0x14ec167713fc0000,  0x15e214f8140f140c,  0x16591560163d,  0x13ff1470141c1532,  0x1605000015a00000,  0x0,  0x13f500000000,  0x13f8000000000000,  0x14ec000013fc0000,  0x15e214f8140f0000,  0x165915600000,  0x13ff000000001532,  0x1605000015a00000,  0x18160000184a0000,  0x13f513f20000,  0x13f80000000013e1,  0x167713fc15c3,  0x15e214f8140f140c,  0x16591560163d,  0x13ff1470141c1532,  0x160515dd15a00000,  0x183a00001814,  0x14e013f513f213d7,  0x13f81409178813e1,  0x14ec000013fc15c3,  0x15e214f8140f140c,  0x13dc16591560163d,  0x13ff1470141c1532,  0x160515dd15a014e2,  0x0,  0x14e013f513f20000,  0x13f8140917880000,  0x14ec000013fc15c3,  0x15e214f8140f140c,  0x13dc16591560163d,  0x13ff1470141c1532,  0x160515dd15a014e2,  0x0,  0x3f103160307030a,  0x4fa04de04ab0468,  0x5310520050b,  0x0,  0x10a0106010200fe,  0x11a01160112010e,  0x12a01260122011e,  0x13a01360132012e,  0x14a01460142013e,  0x15a01560152014e,  0x5e31b4d0162015e,  0x93305e5082c,  0x5e605e305d50568,  0x6ac0687067e0629,  0x734071a060706cf,  0x6af07a4077e0723,  0x88d085e082c083b,  0x682077006b2056b,  0x76c06b1060a095a,  0x930082708660860,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x761075e00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x606,  0x0,  0x0,  0x0,  0x1cad1c9e1bc3,  0x0,  0x0,  0x0,  0x1cf71ff320b02197,  0x208c253220811f17,  0x21e722f221fe1f1d,  0x21eb1f6921451f9d,  0x2560235c24261f93,  0x219d22cc200f2073,  0x25a01eef1ee921b3,  0x21ad20011efd20fa,  0x23f023d221992574,  0x329221b22bc2005,  0x20351f9f2366,  0x0,  0x1b5d1b551b511b69,  0x1b591b711b611b6d,  0x1b65,  0x0,  0x1ffd2147,  0x0,  0x0,  0x0,  0x26f51f0b1f031f07,  0x1f3b1f371f351f2d,  0x1f431f471f411f3f,  0x1f531f5126fd1e63,  0x1e6526f71f631f55,  0x1f7126fb1f691f59,  0x1f7b1f791f251f75,  0x1e691f8d1f8927b9,  0x1fa11f9f1f9b1f99,  0x1fb51faf1fad1e6b,  0x1fc31fbf1fbd1fbb,  0x1fe11fd91fd51fd3,  0x1fe71fe71fe71fe5,  0x1ff51ff122e42703,  0x20031fff1ffb2705,  0x20152013200d2017,  0x2023201f201d2019,  0x202d202920292027,  0x204b203920332031,  0x2043203f204d203d,  0x2057205520711f8f,  0x205b205d20532059,  0x2077207527072067,  0x209620852081207b,  0x209e209c270b2709,  0x1e6d20a4209a20a0,  0x20ac20ac20a81e6f,  0x20be20bc20ba270d,  0x20c820c6270f20c2,  0x20d21e7120cc2137,  0x271320de20e020da,  0x20e820ea271520e4,  0x1e7320f620f420ec,  0x21062104210220fe,  0x21171e7727171e75,  0x27cd211f211b2119,  0x2486271b271b212b,  0x27291e7921332133,  0x1e7b213f213b277d,  0x2157215321512149,  0x21611e7d1e7f215f,  0x216f216d2163271d,  0x21792177216f2171,  0x2183217f217d2181,  0x218f210b21872185,  0x21b121a7219f219b,  0x21b521a921af2723,  0x21c7272521c321b9,  0x21cb1e8121bd21c1,  0x1e8321cd21d321cf,  0x21f5272721df21db,  0x22091e8922032215,  0x1f6d1f6b1e851e87,  0x1ebb2470220b2217,  0x222b2221221f221d,  0x22351e8b27312227,  0x273522462242222f,  0x1e8d224c22392248,  0x225822522250224e,  0x22621e8f225c2737,  0x226a1e9122642739,  0x273b227822762270,  0x273f2288273d2711,  0x2298228a2292228e,  0x22a422a222a822a0,  0x229e274122ac22aa,  0x22c41e9322ba22b8,  0x22d222b4274322c2,  0x22de22d427472745,  0x22e01e9522da22dc,  0x26f922ec22e622e8,  0x274d22fa274922f4,  0x274f2314230a2304,  0x275327512320231e,  0x23381e972336232e,  0x234623441e991e99,  0x1e9b2352234c234a,  0x2757236c2755235e,  0x2759237a27192372,  0x1e9f1e9d275d275b,  0x2763275f27612396,  0x239c239c239a2765,  0x1ea523a21ea323a0,  0x23b023ac27691ea7,  0x23c8276b1ea923b6,  0x23e423d8276f276d,  0x23ec23ea23e81eab,  0x23f8277327732771,  0x2404240227751ead,  0x1eb1241227771eaf,  0x277b241e2416241a,  0x243424301eb3242a,  0x2781277f1eb5243c,  0x2785244827831eb7,  0x278724582454244e,  0x2466278b24622789,  0x247424721eb9272b,  0x278d20a624761ebd,  0x2486272f272d278f,  0x249e1ebf25942488,  0x24a21fa924a0249c,  0x279124aa24a624a4,  0x24b824b624ac24a8,  0x24ce24c424ba24ae,  0x24c224c024be24b4,  0x1ec1279527972793,  0x279f24d824d424d2,  0x1ec51ec3279924da,  0x24ea1ec7279d279b,  0x24f624f024ee24ec,  0x250024f824fa24f4,  0x1ec9250224fe24fc,  0x25101ecb25082506,  0x251a251827a12512,  0x27a31e6725201ecd,  0x25361ed11ecf27a5,  0x27a7255825502542,  0x2576257025642562,  0x257a257c26ff27ab,  0x258c258627012580,  0x25b225ac27af27ad,  0x25cc25b827b125b6,  0x25da25d025d425d2,  0x1ed325e227b325dc,  0x26021ed527b525e6,  0x27bb27b7260e20ee,  0x27bd26221ed91ed7,  0x262e262e27bf1edb,  0x1edd263e27c12632,  0x26542650264c2646,  0x266c265e27c31edf,  0x26741ee31ee12672,  0x27c927c71ee527c5,  0x26901ee7268627cb,  0x269e269a26962694,  0x27cf26a2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//12288 bytes
++enum canonMappingTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x120], [ 0x100,  0x400,  0x1380], [ 0x302020202020100,  0x205020202020204,  0x602020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x1000000000000,  0x5000400030002,  0x6,  0x9000800070000,  0xc0000000b000a,  0x0,  0xe00000000000d,  0x0,  0x0,  0x1100000010000f,  0x130012,  0x16001500140000,  0x18000000170000,  0x1a000000190000,  0x0,  0x1c001b0000,  0x1d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1f001e,  0x0,  0x0,  0x23002200210020,  0x27002600250024,  0x28,  0x2b002a00000029,  0x2f002e002d002c,  0x30,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x31000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x34003300320000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x38003700360035,  0x3c003b003a0039,  0x3e003d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f00000000,  0x40,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x43004200410000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x47004600450044,  0x4b004a00490048,  0x4c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x250012000f000c,  0x850000004f0045,  0xcb00a400a1009e,  0x13301240121011e,  0x1a0019d01880000,  0x1da01b601a3,  0x2730270026d0000,  0x2f30287,  0x33803250322031f,  0x398000003620358,  0x3de03b703b403b1,  0x446043a04370434,  0x4b404b1049c0000,  0x4ee04ca04b7,  0x58a058705840000,  0x61c0000060d059e,  0x33e002b033b0028,  0x38c00790380006d,  0x392007f038f007c,  0x3a2008f03950082,  0x3cd00ba00000000,  0x3db00c803d800c5,  0x3e400d103fb00e8,  0x41000fd040a00f7,  0x419010604130100,  0x41c0109,  0x440012a043d0127,  0x45c01490443012d,  0x130,  0x471015d0462014f,  0x170047701630000,  0x47a01660484,  0x185000000000000,  0x18e04a801940499,  0x4a2,  0x4e401d004d901c5,  0x4f801e4,  0x5450231052f021b,  0x54b023705350221,  0x56902550552023e,  0x57b026405580244,  0x572025b,  0x594027d058d0276,  0x5b4029d059b0284,  0x5e002c905b702a0,  0x61002f605f502de,  0x3110628030b0302,  0x6310314062e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x50401f0,  0x0,  0x0,  0x2ac000000000000,  0x5c3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13d036900560000,  0x2a304fb01e70450,  0x28e05a9029205ba,  0x28a05ad029605a5,  0x35b0048000005a1,  0x653064a03540041,  0x416010300000000,  0x522020e046b0157,  0x65f065c05250211,  0x465,  0x40700f4,  0x365005204960182,  0x656064d06500647,  0x36f005c036c0059,  0x3ea00d703e700d4,  0x456014304530140,  0x50101ed04fe01ea,  0x53b022705380224,  0x5c002a905bd02a6,  0x578026105660252,  0x425011200000000,  0x0,  0x351003e00000000,  0x4f101dd03f400e1,  0x4e701d304d101bd,  0x61602fc04ea01d6,  0x0,  0x0,  0x0,  0x66b00000010000d,  0x137,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x662,  0x0,  0x100000000,  0x0,  0x6450670063d0000,  0x72c06df06c3,  0x798077800000759,  0x8d1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x781073500000000,  0x8c10867084707e9,  0x92f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x92808ca00000000,  0x95f091f08fd,  0x9b4000000000000,  0x9b7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9c3000009cc09c6,  0x9ba000000000000,  0x0,  0x9ed09d809e4,  0x0,  0x0,  0x9de0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa0500000a0e0a08,  0xa41000000000000,  0x0,  0xa2f0a1a0a26,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa470a4400000000,  0x0,  0x0,  0xa1109cf0000,  0x0,  0x0,  0x0,  0xa0209c009ff09bd,  0xa0b09c900000000,  0xa4d0a4a00000000,  0xa1709d50a1409d2,  0xa1d09db00000000,  0xa2909e70a2309e1,  0xa530a5000000000,  0xa2c09ea0a3e09fc,  0xa3509f30a3209f0,  0xa3809f6,  0xa3b09f9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xac10abe00000000,  0xaca0ac40ac7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xacd00000ad3,  0x0,  0x0,  0x0,  0xad0000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xae80000,  0x0,  0xaf10000,  0xaf4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xadf0adc0ad90ad6,  0xaee0aeb0ae50ae2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb00000000000000,  0xb03,  0x0,  0x0,  0x0,  0xafd00000afa0af7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb12000000000000,  0xb1500000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb0c0b090b060000,  0xb0f00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb1e000000000b21,  0xb24,  0x0,  0x0,  0x0,  0xb1b0b18,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb27,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb300b2a00000000,  0xb2d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb33,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb36,  0xb40000000000000,  0xb3c0b3900000b43,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb4c0b4600000000,  0xb49,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb4f00000000,  0xb590b550b52,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb5f000000000000,  0x0,  0x0,  0xb620000,  0xb6500000000,  0xb68000000000000,  0x0,  0xb6b,  0x0,  0x0,  0xb5c0000,  0x0,  0xb6e000000000000,  0xb890b710000,  0xb8c,  0x0,  0xb740000,  0x0,  0x0,  0x0,  0xb7a000000000000,  0x0,  0x0,  0xb7d0000,  0xb8000000000,  0xb83000000000000,  0x0,  0xb86,  0x0,  0x0,  0xb770000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb8f00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb9200000000,  0xb9800000b95,  0xb9e00000b9b,  0xba100000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xba4000000000000,  0xba70000,  0xbb000000bad0baa,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3830070037d006a,  0x389007603860073,  0x39f008c039b0088,  0x3ae009b03a50092,  0x3ab009803a80095,  0x3d400c103d000bd,  0x40100ee03fe00eb,  0x40400f103f700e4,  0x41f010c040d00fa,  0x422010f04280115,  0x42e011b042b0118,  0x4490136045f014c,  0x46e015a04680154,  0x47d016904740160,  0x48a01760480016c,  0x48d017904870173,  0x493017f0490017c,  0x4a50191049f018b,  0x4ab019704ae019a,  0x4d501c104cd01b9,  0x4e001cc04dc01c8,  0x52c021805290215,  0x53e022a0532021e,  0x54802340541022d,  0x55f024b05550241,  0x55b0247054e023a,  0x56c02580562024e,  0x581026a0575025e,  0x5dd02c6057e0267,  0x5e302cc05e602cf,  0x597028005900279,  0x5ec02d505e902d2,  0x5f202db05ef02d8,  0x5f802e105fb02e4,  0x60402ea060102e7,  0x61902ff060702ed,  0x6340317062b030e,  0x56f04310637031a,  0x6590000062205fe,  0x0,  0x35f004c0372005f,  0x3280015032c0019,  0x330001d03340021,  0x345003203750062,  0x34d003a0341002e,  0x379006603490036,  0x3e100ce03ed00da,  0x3be00ab03ca00b7,  0x3c600b303ba00a7,  0x3f000dd03c200af,  0x4590146044d013a,  0x4f501e1051b0207,  0x4ba01a604be01aa,  0x4c201ae04c601b2,  0x50b01f7051e020a,  0x51301ff050701f3,  0x5170203050f01fb,  0x5b1029a05da02c3,  0x5c602af05ca02b3,  0x5ce02b705d202bb,  0x60a02f005d602bf,  0x61f030506250308,  0x61302f9,  0x0,  0x81b07f9081807f6,  0x82d080b08240802,  0x69e067c069b0679,  0x6b0068e06a70685,  0x858084d0855084a,  0x85c0851,  0x6d406c906d106c6,  0x6d806cd,  0x89308710890086e,  0x8a50883089c087a,  0x70706e5070406e2,  0x71906f7071006ee,  0x8eb08dc08e808d9,  0x8f308e408ef08e0,  0x74a073b07470738,  0x7520743074e073f,  0x90e0903090b0900,  0x9120907,  0x76a075f0767075c,  0x76e0763,  0x949093a09460937,  0x9510942094d093e,  0x787000007840000,  0x78f0000078b0000,  0x98b096909880966,  0x99d097b09940972,  0x7c0079e07bd079b,  0x7d207b007c907a7,  0x847084407e907e2,  0x8c108be08670860,  0x91f091c08fd08fa,  0x95f0958,  0x81f07fd08360814,  0x831080f08280806,  0x6a2068006b90697,  0x6b4069206ab0689,  0x897087508ae088c,  0x8a9088708a0087e,  0x70b06e907220700,  0x71d06fb071406f2,  0x98f096d09a60984,  0x9a1097f09980976,  0x7c407a207db07b9,  0x7d607b407cd07ab,  0x84107e507f007f3,  0x83d083a000007ec,  0x670066d06730676,  0x8bc000006bd,  0x8b9086306400000,  0x8b508b20000086a,  0x6df06dc06c306c0,  0xbb90bb60bb30726,  0x8d108cd08c408c7,  0x8d508f700000000,  0x72c0729072f0732,  0xbc20bbf0bbc0000,  0x92f092b09220925,  0x933095509190916,  0x7780775077b077e,  0x31d063d063a0772,  0x9b1095b00000000,  0x9ad09aa00000962,  0x798079507590756,  0x64307df,  0xbc70bc5,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x79300000000,  0x4f015200000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbcc0bc900000000,  0x0,  0x0,  0x0,  0x0,  0xbcf00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbd50bd80bd20000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbdb,  0xbde0000,  0xbe1,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbe700000be4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbea0000,  0xbf0000000000bed,  0xbf30000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbf900000006,  0x0,  0x0,  0x900030bf60000,  0xbff0bfc,  0xc050c02,  0xc0b0c08,  0x0,  0xc110c0e,  0xc1d0c1a,  0xc230c20,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc350c320c2f0c2c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc290c260c170c14,  0x0,  0xc3b0c3800000000,  0xc410c3e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc490c470000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc44,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc5100000c4e,  0xc5700000c54,  0xc5d00000c5a,  0xc6300000c60,  0xc6900000c66,  0xc6f00000c6c,  0xc7500000c720000,  0xc780000,  0x0,  0xc8100000c7e0c7b,  0xc8a0c8700000c84,  0xc900c8d0000,  0xc960c93,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc4b,  0x0,  0xc9900000000,  0x0,  0x0,  0x0,  0xca200000c9f,  0xca800000ca5,  0xcae00000cab,  0xcb400000cb1,  0xcba00000cb7,  0xcc000000cbd,  0xcc600000cc30000,  0xcc90000,  0x0,  0xcd200000ccf0ccc,  0xcdb0cd800000cd5,  0xce10cde0000,  0xce70ce4,  0x0,  0x0,  0x0,  0x0,  0x0,  0xcea000000000c9c,  0xcf30cf00ced,  0xcf600000000,  0x124b125d0fb71241,  0x13270e290d831043,  0xe4f12930e991327,  0x116710cd0f550e97,  0x1279121511fd11e3,  0x109d106910190feb,  0xd8d12f3128911c7,  0x11e110790ff50e1d,  0x11d910510edb1309,  0x120311890f65121d,  0x108d10250fbd0eff,  0xe050dd90d9d127d,  0x10d310770ff10f95,  0x125911e711dd1171,  0x10e9130712fb12cf,  0x12a111b9114d1107,  0xf0b0e87122f130b,  0x10ed1083117d112f,  0xecb0e8512cb1249,  0x11471047102f0fed,  0x117f0e0312b11159,  0x114f11150ddd0ddf,  0xf67123d12b511c5,  0xebb0d8712350feb,  0xe1110c110950f27,  0xd7f0f1b0da510f1,  0xe2311450f9d1011,  0x122711c910d70e7d,  0xf6f100d126d1005,  0xd9110bf0f7b11a5,  0x113d0fdb0ddb0dc3,  0xe091291122d1195,  0xfa10f070e9f0e37,  0x12f712ab10f31053,  0xfb50df91313130d,  0xf490ef312690ffd,  0x106d104b0f910f57,  0x11791153111110af,  0x12a3127111cd1261,  0x10670e410dfb0de9,  0xf230efd1227120b,  0x1091112d10030f77,  0xee50ebb0e670d97,  0x116b10a9109b0f29,  0x12d112c912951175,  0x128d110f0d9f12dd,  0xdb10d8f0f3512c1,  0xfeb0f9f0ec70ebd,  0x127711d310cb1073,  0xdf712af0fad1323,  0x103b10210fd10fcb,  0x114310e710bd10a1,  0x12b70f5d0dc512e3,  0x126310310ed70da9,  0x10950fd50f390f17,  0xecf0e310deb12bb,  0x10150fe10fc30fa7,  0x120d116310c3109f,  0xe1312c5128f1213,  0x10b110750e33103d,  0x130f12ff12bd11db,  0x1121118b102d0fcf,  0x1063108b11331125,  0xded11ad0d93123b,  0x11390f690ef50de7,  0x12670fb3101b0eb5,  0xf03122112b31205,  0xe590db5,  0xfab00000e7b,  0x10cf108f0de10000,  0x110d1105110310f5,  0x116d113512d3,  0x1233000011df,  0x128312730000,  0x12e912e700000000,  0x12bf127f130512eb,  0xe010db90db30da1,  0xe5f0e530e170e07,  0xecd0e7f0e790e63,  0xf470f430f2f0ed1,  0xfaf0fa30f970f53,  0x1049103510270fdd,  0x10eb10a3107d106f,  0x10fd10f910fb10f7,  0x110b1109110110ff,  0x11531127111d1117,  0x11731161115b1157,  0x11cb11971197118d,  0x1239123712231219,  0x1273126f124f124d,  0xf2b12e112d912c7,  0x119313be,  0xd9b0dc10dd70d81,  0xe0b0dff0dc90db7,  0xe5d0e510e490e53,  0xe9b0e950e830e7b,  0xf050f010eb10ea9,  0xf3f0f330f1d0f13,  0xf530f410f470f37,  0xf890f850f7f0f5f,  0xfbf0fbd0fab0f99,  0x102110050fff0fc7,  0x1057104910411045,  0x1089107f10e3106f,  0x10b910b510ab108f,  0x10d110cf10c910c7,  0x10ef10dd10df10d5,  0x114911311127111f,  0x11af1173115f1153,  0x121f121b11f911c3,  0x122b123312291223,  0x1239123112351237,  0x12751265124f123f,  0x12c712b91299128b,  0x12db12d912d512d3,  0x1394132712f912e1,  0xd370d2313a61392,  0x141c13ec13da0d39,  0x13251321,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xabb00000a7a0000,  0x0,  0x0,  0xab50ab200000000,  0xa590a560aae0aaa,  0xa680a650a5f0a5c,  0xa740a710a6b,  0xa830a800a7d0a77,  0xa8c00000a89,  0xa9500000a920a8f,  0xaa10a9e00000a98,  0xa6e0ab80aa70aa4,  0xa9b0a860a62,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x132900000000,  0x132c,  0x0,  0x0,  0x132f000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1335133200000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x133b133800000000,  0x134a13461342133e,  0x134e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1352000000000000,  0x135913601355135d,  0x1364,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13680d8b0d850d89,  0xda70da30da10d99,  0xdaf0db30dad0dab,  0xdbb0db913700cf9,  0xcfb136a0dc70dbd,  0xdd1136e0dcb0dbf,  0xdd70dd50d950dd3,  0xcff0de50de3142c,  0xdf50df30df10def,  0xe070e010dff0d01,  0xe110e0f0e0d0e0b,  0xe1b0e190e170e15,  0xe210e210e210e1f,  0xe270e25105d1376,  0xe2f0e2d0e2b1378,  0xe3b0e390e350e3d,  0xe470e450e430e3f,  0xe510e4d0e4d0e4b,  0xe690e5b0e570e55,  0xe650e610e6b0e5f,  0xe710e6f0e890de7,  0xe750e770e6d0e73,  0xe8d0e8b137a0e81,  0xe9d0e930e910e8f,  0xea50ea3137e137c,  0xd030eab0ea10ea7,  0xeb30eb30eaf0d05,  0xebb0eb90eb71380,  0xec30ec113820ebf,  0xec90d070ec50f0f,  0x13860ed30ed50ed1,  0xedd0edf13880ed9,  0xd090ee90ee70ee1,  0xef10eef0eed0eeb,  0xef70d0d138a0d0b,  0x14400eff0efb0ef9,  0x118f138e138e0f09,  0x139c0d0f0f0d0f0d,  0xd110f150f1113f0,  0xf250f210f1f0f19,  0xf2f0d130d150f2d,  0xf3d0f3b0f311390,  0xf470f450f3d0f3f,  0xf510f4d0f4b0f4f,  0xf5b0f590f550f53,  0xf730f6b0f630f61,  0xf750f6d0f711396,  0xf8713980f830f79,  0xf8b0d170f7d0f81,  0xd190f8d0f930f8f,  0xfa5139a0f9b0f97,  0xfaf0d1f0fa90fb9,  0xdcf0dcd0d1b0d1d,  0xd5111810fb10fbb,  0xfc90fc10fbf0fbd,  0xfd30d2113a40fc5,  0x13a80fdd0fd90fcd,  0xd230fe30fd70fdf,  0xfef0fe90fe70fe5,  0xff70d250ff313aa,  0xffb0d270ff913ac,  0x13ae100710051001,  0x13b2100913b01384,  0x1017100b1013100f,  0x102310211027101f,  0x101d13b4102b1029,  0x10410d2910391037,  0x104d103313b6103f,  0x1059104f13ba13b8,  0x105b0d2b10551057,  0x136c1065105f1061,  0x13c0107113bc106b,  0x13c21081107f107b,  0x13c613c410871085,  0x10990d2d10971093,  0x10a710a50d2f0d2f,  0xd3110b310ad10ab,  0x13ca10bb13c810b7,  0x13cc10c5138c10c1,  0xd350d3313d013ce,  0x13d613d213d410d5,  0x10db10db10d913d8,  0xd3b10e10d3910df,  0x10e910e513dc0d3d,  0x10ff13de0d3f10ef,  0x1113110d13e213e0,  0x111b111911170d41,  0x112313e613e613e4,  0x112b112913e80d43,  0xd47113713ea0d45,  0x13ee1141113b113f,  0x115511510d49114b,  0x13f413f20d4b115d,  0x13f8116513f60d4d,  0x13fa1173116f1169,  0x117b13fe117713fc,  0x118511830d4f139e,  0x14000ead11870d53,  0x118f13a213a01402,  0x119b0d55126b1191,  0x119f0dfd119d1199,  0x140411a711a311a1,  0x11b511b311a911a5,  0x11cb11c111b711ab,  0x11bf11bd11bb11b1,  0xd571408140a1406,  0x141211d511d111cf,  0xd5b0d59140c11d7,  0x11e50d5d1410140e,  0x11ef11eb11e911e7,  0x11f911f111f311ed,  0xd5f11fb11f711f5,  0x12070d61120111ff,  0x1211120f14141209,  0x14160cfd12170d63,  0x12250d670d651418,  0x141a1243123f1231,  0x1253125112471245,  0x125512571372141e,  0x1265125f1374125b,  0x1281127b14221420,  0x1297128714241285,  0x12a5129b129f129d,  0xd6912a9142612a7,  0x12c30d6b142812ad,  0x142e142a12cd0ee3,  0x143012d70d6f0d6d,  0x12db12db14320d71,  0xd7312e5143412df,  0x12f512f112ef12ed,  0x12fd12f914360d75,  0x13030d790d771301,  0x143c143a0d7b1438,  0x13150d7d1311143e,  0x131d131b13191317,  0x1442131f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++@property
++{
++private alias _IDCA = immutable(dchar[]);
++_IDCA decompCanonTable() { static _IDCA t = [ 0x0,  0x3b,  0x0,  0x3c,  0x338,  0x0,  0x3d,  0x338,  0x0,  0x3e,  0x338,  0x0,  0x41,  0x300,  0x0,  0x41,  0x301,  0x0,  0x41,  0x302,  0x0,  0x41,  0x302,  0x300,  0x0,  0x41,  0x302,  0x301,  0x0,  0x41,  0x302,  0x303,  0x0,  0x41,  0x302,  0x309,  0x0,  0x41,  0x303,  0x0,  0x41,  0x304,  0x0,  0x41,  0x306,  0x0,  0x41,  0x306,  0x300,  0x0,  0x41,  0x306,  0x301,  0x0,  0x41,  0x306,  0x303,  0x0,  0x41,  0x306,  0x309,  0x0,  0x41,  0x307,  0x0,  0x41,  0x307,  0x304,  0x0,  0x41,  0x308,  0x0,  0x41,  0x308,  0x304,  0x0,  0x41,  0x309,  0x0,  0x41,  0x30a,  0x0,  0x41,  0x30a,  0x301,  0x0,  0x41,  0x30c,  0x0,  0x41,  0x30f,  0x0,  0x41,  0x311,  0x0,  0x41,  0x323,  0x0,  0x41,  0x323,  0x302,  0x0,  0x41,  0x323,  0x306,  0x0,  0x41,  0x325,  0x0,  0x41,  0x328,  0x0,  0x42,  0x307,  0x0,  0x42,  0x323,  0x0,  0x42,  0x331,  0x0,  0x43,  0x301,  0x0,  0x43,  0x302,  0x0,  0x43,  0x307,  0x0,  0x43,  0x30c,  0x0,  0x43,  0x327,  0x0,  0x43,  0x327,  0x301,  0x0,  0x44,  0x307,  0x0,  0x44,  0x30c,  0x0,  0x44,  0x323,  0x0,  0x44,  0x327,  0x0,  0x44,  0x32d,  0x0,  0x44,  0x331,  0x0,  0x45,  0x300,  0x0,  0x45,  0x301,  0x0,  0x45,  0x302,  0x0,  0x45,  0x302,  0x300,  0x0,  0x45,  0x302,  0x301,  0x0,  0x45,  0x302,  0x303,  0x0,  0x45,  0x302,  0x309,  0x0,  0x45,  0x303,  0x0,  0x45,  0x304,  0x0,  0x45,  0x304,  0x300,  0x0,  0x45,  0x304,  0x301,  0x0,  0x45,  0x306,  0x0,  0x45,  0x307,  0x0,  0x45,  0x308,  0x0,  0x45,  0x309,  0x0,  0x45,  0x30c,  0x0,  0x45,  0x30f,  0x0,  0x45,  0x311,  0x0,  0x45,  0x323,  0x0,  0x45,  0x323,  0x302,  0x0,  0x45,  0x327,  0x0,  0x45,  0x327,  0x306,  0x0,  0x45,  0x328,  0x0,  0x45,  0x32d,  0x0,  0x45,  0x330,  0x0,  0x46,  0x307,  0x0,  0x47,  0x301,  0x0,  0x47,  0x302,  0x0,  0x47,  0x304,  0x0,  0x47,  0x306,  0x0,  0x47,  0x307,  0x0,  0x47,  0x30c,  0x0,  0x47,  0x327,  0x0,  0x48,  0x302,  0x0,  0x48,  0x307,  0x0,  0x48,  0x308,  0x0,  0x48,  0x30c,  0x0,  0x48,  0x323,  0x0,  0x48,  0x327,  0x0,  0x48,  0x32e,  0x0,  0x49,  0x300,  0x0,  0x49,  0x301,  0x0,  0x49,  0x302,  0x0,  0x49,  0x303,  0x0,  0x49,  0x304,  0x0,  0x49,  0x306,  0x0,  0x49,  0x307,  0x0,  0x49,  0x308,  0x0,  0x49,  0x308,  0x301,  0x0,  0x49,  0x309,  0x0,  0x49,  0x30c,  0x0,  0x49,  0x30f,  0x0,  0x49,  0x311,  0x0,  0x49,  0x323,  0x0,  0x49,  0x328,  0x0,  0x49,  0x330,  0x0,  0x4a,  0x302,  0x0,  0x4b,  0x0,  0x4b,  0x301,  0x0,  0x4b,  0x30c,  0x0,  0x4b,  0x323,  0x0,  0x4b,  0x327,  0x0,  0x4b,  0x331,  0x0,  0x4c,  0x301,  0x0,  0x4c,  0x30c,  0x0,  0x4c,  0x323,  0x0,  0x4c,  0x323,  0x304,  0x0,  0x4c,  0x327,  0x0,  0x4c,  0x32d,  0x0,  0x4c,  0x331,  0x0,  0x4d,  0x301,  0x0,  0x4d,  0x307,  0x0,  0x4d,  0x323,  0x0,  0x4e,  0x300,  0x0,  0x4e,  0x301,  0x0,  0x4e,  0x303,  0x0,  0x4e,  0x307,  0x0,  0x4e,  0x30c,  0x0,  0x4e,  0x323,  0x0,  0x4e,  0x327,  0x0,  0x4e,  0x32d,  0x0,  0x4e,  0x331,  0x0,  0x4f,  0x300,  0x0,  0x4f,  0x301,  0x0,  0x4f,  0x302,  0x0,  0x4f,  0x302,  0x300,  0x0,  0x4f,  0x302,  0x301,  0x0,  0x4f,  0x302,  0x303,  0x0,  0x4f,  0x302,  0x309,  0x0,  0x4f,  0x303,  0x0,  0x4f,  0x303,  0x301,  0x0,  0x4f,  0x303,  0x304,  0x0,  0x4f,  0x303,  0x308,  0x0,  0x4f,  0x304,  0x0,  0x4f,  0x304,  0x300,  0x0,  0x4f,  0x304,  0x301,  0x0,  0x4f,  0x306,  0x0,  0x4f,  0x307,  0x0,  0x4f,  0x307,  0x304,  0x0,  0x4f,  0x308,  0x0,  0x4f,  0x308,  0x304,  0x0,  0x4f,  0x309,  0x0,  0x4f,  0x30b,  0x0,  0x4f,  0x30c,  0x0,  0x4f,  0x30f,  0x0,  0x4f,  0x311,  0x0,  0x4f,  0x31b,  0x0,  0x4f,  0x31b,  0x300,  0x0,  0x4f,  0x31b,  0x301,  0x0,  0x4f,  0x31b,  0x303,  0x0,  0x4f,  0x31b,  0x309,  0x0,  0x4f,  0x31b,  0x323,  0x0,  0x4f,  0x323,  0x0,  0x4f,  0x323,  0x302,  0x0,  0x4f,  0x328,  0x0,  0x4f,  0x328,  0x304,  0x0,  0x50,  0x301,  0x0,  0x50,  0x307,  0x0,  0x52,  0x301,  0x0,  0x52,  0x307,  0x0,  0x52,  0x30c,  0x0,  0x52,  0x30f,  0x0,  0x52,  0x311,  0x0,  0x52,  0x323,  0x0,  0x52,  0x323,  0x304,  0x0,  0x52,  0x327,  0x0,  0x52,  0x331,  0x0,  0x53,  0x301,  0x0,  0x53,  0x301,  0x307,  0x0,  0x53,  0x302,  0x0,  0x53,  0x307,  0x0,  0x53,  0x30c,  0x0,  0x53,  0x30c,  0x307,  0x0,  0x53,  0x323,  0x0,  0x53,  0x323,  0x307,  0x0,  0x53,  0x326,  0x0,  0x53,  0x327,  0x0,  0x54,  0x307,  0x0,  0x54,  0x30c,  0x0,  0x54,  0x323,  0x0,  0x54,  0x326,  0x0,  0x54,  0x327,  0x0,  0x54,  0x32d,  0x0,  0x54,  0x331,  0x0,  0x55,  0x300,  0x0,  0x55,  0x301,  0x0,  0x55,  0x302,  0x0,  0x55,  0x303,  0x0,  0x55,  0x303,  0x301,  0x0,  0x55,  0x304,  0x0,  0x55,  0x304,  0x308,  0x0,  0x55,  0x306,  0x0,  0x55,  0x308,  0x0,  0x55,  0x308,  0x300,  0x0,  0x55,  0x308,  0x301,  0x0,  0x55,  0x308,  0x304,  0x0,  0x55,  0x308,  0x30c,  0x0,  0x55,  0x309,  0x0,  0x55,  0x30a,  0x0,  0x55,  0x30b,  0x0,  0x55,  0x30c,  0x0,  0x55,  0x30f,  0x0,  0x55,  0x311,  0x0,  0x55,  0x31b,  0x0,  0x55,  0x31b,  0x300,  0x0,  0x55,  0x31b,  0x301,  0x0,  0x55,  0x31b,  0x303,  0x0,  0x55,  0x31b,  0x309,  0x0,  0x55,  0x31b,  0x323,  0x0,  0x55,  0x323,  0x0,  0x55,  0x324,  0x0,  0x55,  0x328,  0x0,  0x55,  0x32d,  0x0,  0x55,  0x330,  0x0,  0x56,  0x303,  0x0,  0x56,  0x323,  0x0,  0x57,  0x300,  0x0,  0x57,  0x301,  0x0,  0x57,  0x302,  0x0,  0x57,  0x307,  0x0,  0x57,  0x308,  0x0,  0x57,  0x323,  0x0,  0x58,  0x307,  0x0,  0x58,  0x308,  0x0,  0x59,  0x300,  0x0,  0x59,  0x301,  0x0,  0x59,  0x302,  0x0,  0x59,  0x303,  0x0,  0x59,  0x304,  0x0,  0x59,  0x307,  0x0,  0x59,  0x308,  0x0,  0x59,  0x309,  0x0,  0x59,  0x323,  0x0,  0x5a,  0x301,  0x0,  0x5a,  0x302,  0x0,  0x5a,  0x307,  0x0,  0x5a,  0x30c,  0x0,  0x5a,  0x323,  0x0,  0x5a,  0x331,  0x0,  0x60,  0x0,  0x61,  0x300,  0x0,  0x61,  0x301,  0x0,  0x61,  0x302,  0x0,  0x61,  0x302,  0x300,  0x0,  0x61,  0x302,  0x301,  0x0,  0x61,  0x302,  0x303,  0x0,  0x61,  0x302,  0x309,  0x0,  0x61,  0x303,  0x0,  0x61,  0x304,  0x0,  0x61,  0x306,  0x0,  0x61,  0x306,  0x300,  0x0,  0x61,  0x306,  0x301,  0x0,  0x61,  0x306,  0x303,  0x0,  0x61,  0x306,  0x309,  0x0,  0x61,  0x307,  0x0,  0x61,  0x307,  0x304,  0x0,  0x61,  0x308,  0x0,  0x61,  0x308,  0x304,  0x0,  0x61,  0x309,  0x0,  0x61,  0x30a,  0x0,  0x61,  0x30a,  0x301,  0x0,  0x61,  0x30c,  0x0,  0x61,  0x30f,  0x0,  0x61,  0x311,  0x0,  0x61,  0x323,  0x0,  0x61,  0x323,  0x302,  0x0,  0x61,  0x323,  0x306,  0x0,  0x61,  0x325,  0x0,  0x61,  0x328,  0x0,  0x62,  0x307,  0x0,  0x62,  0x323,  0x0,  0x62,  0x331,  0x0,  0x63,  0x301,  0x0,  0x63,  0x302,  0x0,  0x63,  0x307,  0x0,  0x63,  0x30c,  0x0,  0x63,  0x327,  0x0,  0x63,  0x327,  0x301,  0x0,  0x64,  0x307,  0x0,  0x64,  0x30c,  0x0,  0x64,  0x323,  0x0,  0x64,  0x327,  0x0,  0x64,  0x32d,  0x0,  0x64,  0x331,  0x0,  0x65,  0x300,  0x0,  0x65,  0x301,  0x0,  0x65,  0x302,  0x0,  0x65,  0x302,  0x300,  0x0,  0x65,  0x302,  0x301,  0x0,  0x65,  0x302,  0x303,  0x0,  0x65,  0x302,  0x309,  0x0,  0x65,  0x303,  0x0,  0x65,  0x304,  0x0,  0x65,  0x304,  0x300,  0x0,  0x65,  0x304,  0x301,  0x0,  0x65,  0x306,  0x0,  0x65,  0x307,  0x0,  0x65,  0x308,  0x0,  0x65,  0x309,  0x0,  0x65,  0x30c,  0x0,  0x65,  0x30f,  0x0,  0x65,  0x311,  0x0,  0x65,  0x323,  0x0,  0x65,  0x323,  0x302,  0x0,  0x65,  0x327,  0x0,  0x65,  0x327,  0x306,  0x0,  0x65,  0x328,  0x0,  0x65,  0x32d,  0x0,  0x65,  0x330,  0x0,  0x66,  0x307,  0x0,  0x67,  0x301,  0x0,  0x67,  0x302,  0x0,  0x67,  0x304,  0x0,  0x67,  0x306,  0x0,  0x67,  0x307,  0x0,  0x67,  0x30c,  0x0,  0x67,  0x327,  0x0,  0x68,  0x302,  0x0,  0x68,  0x307,  0x0,  0x68,  0x308,  0x0,  0x68,  0x30c,  0x0,  0x68,  0x323,  0x0,  0x68,  0x327,  0x0,  0x68,  0x32e,  0x0,  0x68,  0x331,  0x0,  0x69,  0x300,  0x0,  0x69,  0x301,  0x0,  0x69,  0x302,  0x0,  0x69,  0x303,  0x0,  0x69,  0x304,  0x0,  0x69,  0x306,  0x0,  0x69,  0x308,  0x0,  0x69,  0x308,  0x301,  0x0,  0x69,  0x309,  0x0,  0x69,  0x30c,  0x0,  0x69,  0x30f,  0x0,  0x69,  0x311,  0x0,  0x69,  0x323,  0x0,  0x69,  0x328,  0x0,  0x69,  0x330,  0x0,  0x6a,  0x302,  0x0,  0x6a,  0x30c,  0x0,  0x6b,  0x301,  0x0,  0x6b,  0x30c,  0x0,  0x6b,  0x323,  0x0,  0x6b,  0x327,  0x0,  0x6b,  0x331,  0x0,  0x6c,  0x301,  0x0,  0x6c,  0x30c,  0x0,  0x6c,  0x323,  0x0,  0x6c,  0x323,  0x304,  0x0,  0x6c,  0x327,  0x0,  0x6c,  0x32d,  0x0,  0x6c,  0x331,  0x0,  0x6d,  0x301,  0x0,  0x6d,  0x307,  0x0,  0x6d,  0x323,  0x0,  0x6e,  0x300,  0x0,  0x6e,  0x301,  0x0,  0x6e,  0x303,  0x0,  0x6e,  0x307,  0x0,  0x6e,  0x30c,  0x0,  0x6e,  0x323,  0x0,  0x6e,  0x327,  0x0,  0x6e,  0x32d,  0x0,  0x6e,  0x331,  0x0,  0x6f,  0x300,  0x0,  0x6f,  0x301,  0x0,  0x6f,  0x302,  0x0,  0x6f,  0x302,  0x300,  0x0,  0x6f,  0x302,  0x301,  0x0,  0x6f,  0x302,  0x303,  0x0,  0x6f,  0x302,  0x309,  0x0,  0x6f,  0x303,  0x0,  0x6f,  0x303,  0x301,  0x0,  0x6f,  0x303,  0x304,  0x0,  0x6f,  0x303,  0x308,  0x0,  0x6f,  0x304,  0x0,  0x6f,  0x304,  0x300,  0x0,  0x6f,  0x304,  0x301,  0x0,  0x6f,  0x306,  0x0,  0x6f,  0x307,  0x0,  0x6f,  0x307,  0x304,  0x0,  0x6f,  0x308,  0x0,  0x6f,  0x308,  0x304,  0x0,  0x6f,  0x309,  0x0,  0x6f,  0x30b,  0x0,  0x6f,  0x30c,  0x0,  0x6f,  0x30f,  0x0,  0x6f,  0x311,  0x0,  0x6f,  0x31b,  0x0,  0x6f,  0x31b,  0x300,  0x0,  0x6f,  0x31b,  0x301,  0x0,  0x6f,  0x31b,  0x303,  0x0,  0x6f,  0x31b,  0x309,  0x0,  0x6f,  0x31b,  0x323,  0x0,  0x6f,  0x323,  0x0,  0x6f,  0x323,  0x302,  0x0,  0x6f,  0x328,  0x0,  0x6f,  0x328,  0x304,  0x0,  0x70,  0x301,  0x0,  0x70,  0x307,  0x0,  0x72,  0x301,  0x0,  0x72,  0x307,  0x0,  0x72,  0x30c,  0x0,  0x72,  0x30f,  0x0,  0x72,  0x311,  0x0,  0x72,  0x323,  0x0,  0x72,  0x323,  0x304,  0x0,  0x72,  0x327,  0x0,  0x72,  0x331,  0x0,  0x73,  0x301,  0x0,  0x73,  0x301,  0x307,  0x0,  0x73,  0x302,  0x0,  0x73,  0x307,  0x0,  0x73,  0x30c,  0x0,  0x73,  0x30c,  0x307,  0x0,  0x73,  0x323,  0x0,  0x73,  0x323,  0x307,  0x0,  0x73,  0x326,  0x0,  0x73,  0x327,  0x0,  0x74,  0x307,  0x0,  0x74,  0x308,  0x0,  0x74,  0x30c,  0x0,  0x74,  0x323,  0x0,  0x74,  0x326,  0x0,  0x74,  0x327,  0x0,  0x74,  0x32d,  0x0,  0x74,  0x331,  0x0,  0x75,  0x300,  0x0,  0x75,  0x301,  0x0,  0x75,  0x302,  0x0,  0x75,  0x303,  0x0,  0x75,  0x303,  0x301,  0x0,  0x75,  0x304,  0x0,  0x75,  0x304,  0x308,  0x0,  0x75,  0x306,  0x0,  0x75,  0x308,  0x0,  0x75,  0x308,  0x300,  0x0,  0x75,  0x308,  0x301,  0x0,  0x75,  0x308,  0x304,  0x0,  0x75,  0x308,  0x30c,  0x0,  0x75,  0x309,  0x0,  0x75,  0x30a,  0x0,  0x75,  0x30b,  0x0,  0x75,  0x30c,  0x0,  0x75,  0x30f,  0x0,  0x75,  0x311,  0x0,  0x75,  0x31b,  0x0,  0x75,  0x31b,  0x300,  0x0,  0x75,  0x31b,  0x301,  0x0,  0x75,  0x31b,  0x303,  0x0,  0x75,  0x31b,  0x309,  0x0,  0x75,  0x31b,  0x323,  0x0,  0x75,  0x323,  0x0,  0x75,  0x324,  0x0,  0x75,  0x328,  0x0,  0x75,  0x32d,  0x0,  0x75,  0x330,  0x0,  0x76,  0x303,  0x0,  0x76,  0x323,  0x0,  0x77,  0x300,  0x0,  0x77,  0x301,  0x0,  0x77,  0x302,  0x0,  0x77,  0x307,  0x0,  0x77,  0x308,  0x0,  0x77,  0x30a,  0x0,  0x77,  0x323,  0x0,  0x78,  0x307,  0x0,  0x78,  0x308,  0x0,  0x79,  0x300,  0x0,  0x79,  0x301,  0x0,  0x79,  0x302,  0x0,  0x79,  0x303,  0x0,  0x79,  0x304,  0x0,  0x79,  0x307,  0x0,  0x79,  0x308,  0x0,  0x79,  0x309,  0x0,  0x79,  0x30a,  0x0,  0x79,  0x323,  0x0,  0x7a,  0x301,  0x0,  0x7a,  0x302,  0x0,  0x7a,  0x307,  0x0,  0x7a,  0x30c,  0x0,  0x7a,  0x323,  0x0,  0x7a,  0x331,  0x0,  0xa8,  0x300,  0x0,  0xa8,  0x301,  0x0,  0xa8,  0x342,  0x0,  0xb4,  0x0,  0xb7,  0x0,  0xc6,  0x301,  0x0,  0xc6,  0x304,  0x0,  0xd8,  0x301,  0x0,  0xe6,  0x301,  0x0,  0xe6,  0x304,  0x0,  0xf8,  0x301,  0x0,  0x17f,  0x307,  0x0,  0x1b7,  0x30c,  0x0,  0x292,  0x30c,  0x0,  0x2b9,  0x0,  0x300,  0x0,  0x301,  0x0,  0x308,  0x301,  0x0,  0x313,  0x0,  0x391,  0x300,  0x0,  0x391,  0x301,  0x0,  0x391,  0x304,  0x0,  0x391,  0x306,  0x0,  0x391,  0x313,  0x0,  0x391,  0x313,  0x300,  0x0,  0x391,  0x313,  0x300,  0x345,  0x0,  0x391,  0x313,  0x301,  0x0,  0x391,  0x313,  0x301,  0x345,  0x0,  0x391,  0x313,  0x342,  0x0,  0x391,  0x313,  0x342,  0x345,  0x0,  0x391,  0x313,  0x345,  0x0,  0x391,  0x314,  0x0,  0x391,  0x314,  0x300,  0x0,  0x391,  0x314,  0x300,  0x345,  0x0,  0x391,  0x314,  0x301,  0x0,  0x391,  0x314,  0x301,  0x345,  0x0,  0x391,  0x314,  0x342,  0x0,  0x391,  0x314,  0x342,  0x345,  0x0,  0x391,  0x314,  0x345,  0x0,  0x391,  0x345,  0x0,  0x395,  0x300,  0x0,  0x395,  0x301,  0x0,  0x395,  0x313,  0x0,  0x395,  0x313,  0x300,  0x0,  0x395,  0x313,  0x301,  0x0,  0x395,  0x314,  0x0,  0x395,  0x314,  0x300,  0x0,  0x395,  0x314,  0x301,  0x0,  0x397,  0x300,  0x0,  0x397,  0x301,  0x0,  0x397,  0x313,  0x0,  0x397,  0x313,  0x300,  0x0,  0x397,  0x313,  0x300,  0x345,  0x0,  0x397,  0x313,  0x301,  0x0,  0x397,  0x313,  0x301,  0x345,  0x0,  0x397,  0x313,  0x342,  0x0,  0x397,  0x313,  0x342,  0x345,  0x0,  0x397,  0x313,  0x345,  0x0,  0x397,  0x314,  0x0,  0x397,  0x314,  0x300,  0x0,  0x397,  0x314,  0x300,  0x345,  0x0,  0x397,  0x314,  0x301,  0x0,  0x397,  0x314,  0x301,  0x345,  0x0,  0x397,  0x314,  0x342,  0x0,  0x397,  0x314,  0x342,  0x345,  0x0,  0x397,  0x314,  0x345,  0x0,  0x397,  0x345,  0x0,  0x399,  0x300,  0x0,  0x399,  0x301,  0x0,  0x399,  0x304,  0x0,  0x399,  0x306,  0x0,  0x399,  0x308,  0x0,  0x399,  0x313,  0x0,  0x399,  0x313,  0x300,  0x0,  0x399,  0x313,  0x301,  0x0,  0x399,  0x313,  0x342,  0x0,  0x399,  0x314,  0x0,  0x399,  0x314,  0x300,  0x0,  0x399,  0x314,  0x301,  0x0,  0x399,  0x314,  0x342,  0x0,  0x39f,  0x300,  0x0,  0x39f,  0x301,  0x0,  0x39f,  0x313,  0x0,  0x39f,  0x313,  0x300,  0x0,  0x39f,  0x313,  0x301,  0x0,  0x39f,  0x314,  0x0,  0x39f,  0x314,  0x300,  0x0,  0x39f,  0x314,  0x301,  0x0,  0x3a1,  0x314,  0x0,  0x3a5,  0x300,  0x0,  0x3a5,  0x301,  0x0,  0x3a5,  0x304,  0x0,  0x3a5,  0x306,  0x0,  0x3a5,  0x308,  0x0,  0x3a5,  0x314,  0x0,  0x3a5,  0x314,  0x300,  0x0,  0x3a5,  0x314,  0x301,  0x0,  0x3a5,  0x314,  0x342,  0x0,  0x3a9,  0x0,  0x3a9,  0x300,  0x0,  0x3a9,  0x301,  0x0,  0x3a9,  0x313,  0x0,  0x3a9,  0x313,  0x300,  0x0,  0x3a9,  0x313,  0x300,  0x345,  0x0,  0x3a9,  0x313,  0x301,  0x0,  0x3a9,  0x313,  0x301,  0x345,  0x0,  0x3a9,  0x313,  0x342,  0x0,  0x3a9,  0x313,  0x342,  0x345,  0x0,  0x3a9,  0x313,  0x345,  0x0,  0x3a9,  0x314,  0x0,  0x3a9,  0x314,  0x300,  0x0,  0x3a9,  0x314,  0x300,  0x345,  0x0,  0x3a9,  0x314,  0x301,  0x0,  0x3a9,  0x314,  0x301,  0x345,  0x0,  0x3a9,  0x314,  0x342,  0x0,  0x3a9,  0x314,  0x342,  0x345,  0x0,  0x3a9,  0x314,  0x345,  0x0,  0x3a9,  0x345,  0x0,  0x3b1,  0x300,  0x0,  0x3b1,  0x300,  0x345,  0x0,  0x3b1,  0x301,  0x0,  0x3b1,  0x301,  0x345,  0x0,  0x3b1,  0x304,  0x0,  0x3b1,  0x306,  0x0,  0x3b1,  0x313,  0x0,  0x3b1,  0x313,  0x300,  0x0,  0x3b1,  0x313,  0x300,  0x345,  0x0,  0x3b1,  0x313,  0x301,  0x0,  0x3b1,  0x313,  0x301,  0x345,  0x0,  0x3b1,  0x313,  0x342,  0x0,  0x3b1,  0x313,  0x342,  0x345,  0x0,  0x3b1,  0x313,  0x345,  0x0,  0x3b1,  0x314,  0x0,  0x3b1,  0x314,  0x300,  0x0,  0x3b1,  0x314,  0x300,  0x345,  0x0,  0x3b1,  0x314,  0x301,  0x0,  0x3b1,  0x314,  0x301,  0x345,  0x0,  0x3b1,  0x314,  0x342,  0x0,  0x3b1,  0x314,  0x342,  0x345,  0x0,  0x3b1,  0x314,  0x345,  0x0,  0x3b1,  0x342,  0x0,  0x3b1,  0x342,  0x345,  0x0,  0x3b1,  0x345,  0x0,  0x3b5,  0x300,  0x0,  0x3b5,  0x301,  0x0,  0x3b5,  0x313,  0x0,  0x3b5,  0x313,  0x300,  0x0,  0x3b5,  0x313,  0x301,  0x0,  0x3b5,  0x314,  0x0,  0x3b5,  0x314,  0x300,  0x0,  0x3b5,  0x314,  0x301,  0x0,  0x3b7,  0x300,  0x0,  0x3b7,  0x300,  0x345,  0x0,  0x3b7,  0x301,  0x0,  0x3b7,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x0,  0x3b7,  0x313,  0x300,  0x0,  0x3b7,  0x313,  0x300,  0x345,  0x0,  0x3b7,  0x313,  0x301,  0x0,  0x3b7,  0x313,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x342,  0x0,  0x3b7,  0x313,  0x342,  0x345,  0x0,  0x3b7,  0x313,  0x345,  0x0,  0x3b7,  0x314,  0x0,  0x3b7,  0x314,  0x300,  0x0,  0x3b7,  0x314,  0x300,  0x345,  0x0,  0x3b7,  0x314,  0x301,  0x0,  0x3b7,  0x314,  0x301,  0x345,  0x0,  0x3b7,  0x314,  0x342,  0x0,  0x3b7,  0x314,  0x342,  0x345,  0x0,  0x3b7,  0x314,  0x345,  0x0,  0x3b7,  0x342,  0x0,  0x3b7,  0x342,  0x345,  0x0,  0x3b7,  0x345,  0x0,  0x3b9,  0x0,  0x3b9,  0x300,  0x0,  0x3b9,  0x301,  0x0,  0x3b9,  0x304,  0x0,  0x3b9,  0x306,  0x0,  0x3b9,  0x308,  0x0,  0x3b9,  0x308,  0x300,  0x0,  0x3b9,  0x308,  0x301,  0x0,  0x3b9,  0x308,  0x342,  0x0,  0x3b9,  0x313,  0x0,  0x3b9,  0x313,  0x300,  0x0,  0x3b9,  0x313,  0x301,  0x0,  0x3b9,  0x313,  0x342,  0x0,  0x3b9,  0x314,  0x0,  0x3b9,  0x314,  0x300,  0x0,  0x3b9,  0x314,  0x301,  0x0,  0x3b9,  0x314,  0x342,  0x0,  0x3b9,  0x342,  0x0,  0x3bf,  0x300,  0x0,  0x3bf,  0x301,  0x0,  0x3bf,  0x313,  0x0,  0x3bf,  0x313,  0x300,  0x0,  0x3bf,  0x313,  0x301,  0x0,  0x3bf,  0x314,  0x0,  0x3bf,  0x314,  0x300,  0x0,  0x3bf,  0x314,  0x301,  0x0,  0x3c1,  0x313,  0x0,  0x3c1,  0x314,  0x0,  0x3c5,  0x300,  0x0,  0x3c5,  0x301,  0x0,  0x3c5,  0x304,  0x0,  0x3c5,  0x306,  0x0,  0x3c5,  0x308,  0x0,  0x3c5,  0x308,  0x300,  0x0,  0x3c5,  0x308,  0x301,  0x0,  0x3c5,  0x308,  0x342,  0x0,  0x3c5,  0x313,  0x0,  0x3c5,  0x313,  0x300,  0x0,  0x3c5,  0x313,  0x301,  0x0,  0x3c5,  0x313,  0x342,  0x0,  0x3c5,  0x314,  0x0,  0x3c5,  0x314,  0x300,  0x0,  0x3c5,  0x314,  0x301,  0x0,  0x3c5,  0x314,  0x342,  0x0,  0x3c5,  0x342,  0x0,  0x3c9,  0x300,  0x0,  0x3c9,  0x300,  0x345,  0x0,  0x3c9,  0x301,  0x0,  0x3c9,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x0,  0x3c9,  0x313,  0x300,  0x0,  0x3c9,  0x313,  0x300,  0x345,  0x0,  0x3c9,  0x313,  0x301,  0x0,  0x3c9,  0x313,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x342,  0x0,  0x3c9,  0x313,  0x342,  0x345,  0x0,  0x3c9,  0x313,  0x345,  0x0,  0x3c9,  0x314,  0x0,  0x3c9,  0x314,  0x300,  0x0,  0x3c9,  0x314,  0x300,  0x345,  0x0,  0x3c9,  0x314,  0x301,  0x0,  0x3c9,  0x314,  0x301,  0x345,  0x0,  0x3c9,  0x314,  0x342,  0x0,  0x3c9,  0x314,  0x342,  0x345,  0x0,  0x3c9,  0x314,  0x345,  0x0,  0x3c9,  0x342,  0x0,  0x3c9,  0x342,  0x345,  0x0,  0x3c9,  0x345,  0x0,  0x3d2,  0x301,  0x0,  0x3d2,  0x308,  0x0,  0x406,  0x308,  0x0,  0x410,  0x306,  0x0,  0x410,  0x308,  0x0,  0x413,  0x301,  0x0,  0x415,  0x300,  0x0,  0x415,  0x306,  0x0,  0x415,  0x308,  0x0,  0x416,  0x306,  0x0,  0x416,  0x308,  0x0,  0x417,  0x308,  0x0,  0x418,  0x300,  0x0,  0x418,  0x304,  0x0,  0x418,  0x306,  0x0,  0x418,  0x308,  0x0,  0x41a,  0x301,  0x0,  0x41e,  0x308,  0x0,  0x423,  0x304,  0x0,  0x423,  0x306,  0x0,  0x423,  0x308,  0x0,  0x423,  0x30b,  0x0,  0x427,  0x308,  0x0,  0x42b,  0x308,  0x0,  0x42d,  0x308,  0x0,  0x430,  0x306,  0x0,  0x430,  0x308,  0x0,  0x433,  0x301,  0x0,  0x435,  0x300,  0x0,  0x435,  0x306,  0x0,  0x435,  0x308,  0x0,  0x436,  0x306,  0x0,  0x436,  0x308,  0x0,  0x437,  0x308,  0x0,  0x438,  0x300,  0x0,  0x438,  0x304,  0x0,  0x438,  0x306,  0x0,  0x438,  0x308,  0x0,  0x43a,  0x301,  0x0,  0x43e,  0x308,  0x0,  0x443,  0x304,  0x0,  0x443,  0x306,  0x0,  0x443,  0x308,  0x0,  0x443,  0x30b,  0x0,  0x447,  0x308,  0x0,  0x44b,  0x308,  0x0,  0x44d,  0x308,  0x0,  0x456,  0x308,  0x0,  0x474,  0x30f,  0x0,  0x475,  0x30f,  0x0,  0x4d8,  0x308,  0x0,  0x4d9,  0x308,  0x0,  0x4e8,  0x308,  0x0,  0x4e9,  0x308,  0x0,  0x5d0,  0x5b7,  0x0,  0x5d0,  0x5b8,  0x0,  0x5d0,  0x5bc,  0x0,  0x5d1,  0x5bc,  0x0,  0x5d1,  0x5bf,  0x0,  0x5d2,  0x5bc,  0x0,  0x5d3,  0x5bc,  0x0,  0x5d4,  0x5bc,  0x0,  0x5d5,  0x5b9,  0x0,  0x5d5,  0x5bc,  0x0,  0x5d6,  0x5bc,  0x0,  0x5d8,  0x5bc,  0x0,  0x5d9,  0x5b4,  0x0,  0x5d9,  0x5bc,  0x0,  0x5da,  0x5bc,  0x0,  0x5db,  0x5bc,  0x0,  0x5db,  0x5bf,  0x0,  0x5dc,  0x5bc,  0x0,  0x5de,  0x5bc,  0x0,  0x5e0,  0x5bc,  0x0,  0x5e1,  0x5bc,  0x0,  0x5e3,  0x5bc,  0x0,  0x5e4,  0x5bc,  0x0,  0x5e4,  0x5bf,  0x0,  0x5e6,  0x5bc,  0x0,  0x5e7,  0x5bc,  0x0,  0x5e8,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x5c1,  0x0,  0x5e9,  0x5bc,  0x5c2,  0x0,  0x5e9,  0x5c1,  0x0,  0x5e9,  0x5c2,  0x0,  0x5ea,  0x5bc,  0x0,  0x5f2,  0x5b7,  0x0,  0x627,  0x653,  0x0,  0x627,  0x654,  0x0,  0x627,  0x655,  0x0,  0x648,  0x654,  0x0,  0x64a,  0x654,  0x0,  0x6c1,  0x654,  0x0,  0x6d2,  0x654,  0x0,  0x6d5,  0x654,  0x0,  0x915,  0x93c,  0x0,  0x916,  0x93c,  0x0,  0x917,  0x93c,  0x0,  0x91c,  0x93c,  0x0,  0x921,  0x93c,  0x0,  0x922,  0x93c,  0x0,  0x928,  0x93c,  0x0,  0x92b,  0x93c,  0x0,  0x92f,  0x93c,  0x0,  0x930,  0x93c,  0x0,  0x933,  0x93c,  0x0,  0x9a1,  0x9bc,  0x0,  0x9a2,  0x9bc,  0x0,  0x9af,  0x9bc,  0x0,  0x9c7,  0x9be,  0x0,  0x9c7,  0x9d7,  0x0,  0xa16,  0xa3c,  0x0,  0xa17,  0xa3c,  0x0,  0xa1c,  0xa3c,  0x0,  0xa2b,  0xa3c,  0x0,  0xa32,  0xa3c,  0x0,  0xa38,  0xa3c,  0x0,  0xb21,  0xb3c,  0x0,  0xb22,  0xb3c,  0x0,  0xb47,  0xb3e,  0x0,  0xb47,  0xb56,  0x0,  0xb47,  0xb57,  0x0,  0xb92,  0xbd7,  0x0,  0xbc6,  0xbbe,  0x0,  0xbc6,  0xbd7,  0x0,  0xbc7,  0xbbe,  0x0,  0xc46,  0xc56,  0x0,  0xcbf,  0xcd5,  0x0,  0xcc6,  0xcc2,  0x0,  0xcc6,  0xcc2,  0xcd5,  0x0,  0xcc6,  0xcd5,  0x0,  0xcc6,  0xcd6,  0x0,  0xd46,  0xd3e,  0x0,  0xd46,  0xd57,  0x0,  0xd47,  0xd3e,  0x0,  0xdd9,  0xdca,  0x0,  0xdd9,  0xdcf,  0x0,  0xdd9,  0xdcf,  0xdca,  0x0,  0xdd9,  0xddf,  0x0,  0xf40,  0xfb5,  0x0,  0xf42,  0xfb7,  0x0,  0xf4c,  0xfb7,  0x0,  0xf51,  0xfb7,  0x0,  0xf56,  0xfb7,  0x0,  0xf5b,  0xfb7,  0x0,  0xf71,  0xf72,  0x0,  0xf71,  0xf74,  0x0,  0xf71,  0xf80,  0x0,  0xf90,  0xfb5,  0x0,  0xf92,  0xfb7,  0x0,  0xf9c,  0xfb7,  0x0,  0xfa1,  0xfb7,  0x0,  0xfa6,  0xfb7,  0x0,  0xfab,  0xfb7,  0x0,  0xfb2,  0xf80,  0x0,  0xfb3,  0xf80,  0x0,  0x1025,  0x102e,  0x0,  0x1b05,  0x1b35,  0x0,  0x1b07,  0x1b35,  0x0,  0x1b09,  0x1b35,  0x0,  0x1b0b,  0x1b35,  0x0,  0x1b0d,  0x1b35,  0x0,  0x1b11,  0x1b35,  0x0,  0x1b3a,  0x1b35,  0x0,  0x1b3c,  0x1b35,  0x0,  0x1b3e,  0x1b35,  0x0,  0x1b3f,  0x1b35,  0x0,  0x1b42,  0x1b35,  0x0,  0x1fbf,  0x300,  0x0,  0x1fbf,  0x301,  0x0,  0x1fbf,  0x342,  0x0,  0x1ffe,  0x300,  0x0,  0x1ffe,  0x301,  0x0,  0x1ffe,  0x342,  0x0,  0x2002,  0x0,  0x2003,  0x0,  0x2190,  0x338,  0x0,  0x2192,  0x338,  0x0,  0x2194,  0x338,  0x0,  0x21d0,  0x338,  0x0,  0x21d2,  0x338,  0x0,  0x21d4,  0x338,  0x0,  0x2203,  0x338,  0x0,  0x2208,  0x338,  0x0,  0x220b,  0x338,  0x0,  0x2223,  0x338,  0x0,  0x2225,  0x338,  0x0,  0x223c,  0x338,  0x0,  0x2243,  0x338,  0x0,  0x2245,  0x338,  0x0,  0x2248,  0x338,  0x0,  0x224d,  0x338,  0x0,  0x2261,  0x338,  0x0,  0x2264,  0x338,  0x0,  0x2265,  0x338,  0x0,  0x2272,  0x338,  0x0,  0x2273,  0x338,  0x0,  0x2276,  0x338,  0x0,  0x2277,  0x338,  0x0,  0x227a,  0x338,  0x0,  0x227b,  0x338,  0x0,  0x227c,  0x338,  0x0,  0x227d,  0x338,  0x0,  0x2282,  0x338,  0x0,  0x2283,  0x338,  0x0,  0x2286,  0x338,  0x0,  0x2287,  0x338,  0x0,  0x2291,  0x338,  0x0,  0x2292,  0x338,  0x0,  0x22a2,  0x338,  0x0,  0x22a8,  0x338,  0x0,  0x22a9,  0x338,  0x0,  0x22ab,  0x338,  0x0,  0x22b2,  0x338,  0x0,  0x22b3,  0x338,  0x0,  0x22b4,  0x338,  0x0,  0x22b5,  0x338,  0x0,  0x2add,  0x338,  0x0,  0x3008,  0x0,  0x3009,  0x0,  0x3046,  0x3099,  0x0,  0x304b,  0x3099,  0x0,  0x304d,  0x3099,  0x0,  0x304f,  0x3099,  0x0,  0x3051,  0x3099,  0x0,  0x3053,  0x3099,  0x0,  0x3055,  0x3099,  0x0,  0x3057,  0x3099,  0x0,  0x3059,  0x3099,  0x0,  0x305b,  0x3099,  0x0,  0x305d,  0x3099,  0x0,  0x305f,  0x3099,  0x0,  0x3061,  0x3099,  0x0,  0x3064,  0x3099,  0x0,  0x3066,  0x3099,  0x0,  0x3068,  0x3099,  0x0,  0x306f,  0x3099,  0x0,  0x306f,  0x309a,  0x0,  0x3072,  0x3099,  0x0,  0x3072,  0x309a,  0x0,  0x3075,  0x3099,  0x0,  0x3075,  0x309a,  0x0,  0x3078,  0x3099,  0x0,  0x3078,  0x309a,  0x0,  0x307b,  0x3099,  0x0,  0x307b,  0x309a,  0x0,  0x309d,  0x3099,  0x0,  0x30a6,  0x3099,  0x0,  0x30ab,  0x3099,  0x0,  0x30ad,  0x3099,  0x0,  0x30af,  0x3099,  0x0,  0x30b1,  0x3099,  0x0,  0x30b3,  0x3099,  0x0,  0x30b5,  0x3099,  0x0,  0x30b7,  0x3099,  0x0,  0x30b9,  0x3099,  0x0,  0x30bb,  0x3099,  0x0,  0x30bd,  0x3099,  0x0,  0x30bf,  0x3099,  0x0,  0x30c1,  0x3099,  0x0,  0x30c4,  0x3099,  0x0,  0x30c6,  0x3099,  0x0,  0x30c8,  0x3099,  0x0,  0x30cf,  0x3099,  0x0,  0x30cf,  0x309a,  0x0,  0x30d2,  0x3099,  0x0,  0x30d2,  0x309a,  0x0,  0x30d5,  0x3099,  0x0,  0x30d5,  0x309a,  0x0,  0x30d8,  0x3099,  0x0,  0x30d8,  0x309a,  0x0,  0x30db,  0x3099,  0x0,  0x30db,  0x309a,  0x0,  0x30ef,  0x3099,  0x0,  0x30f0,  0x3099,  0x0,  0x30f1,  0x3099,  0x0,  0x30f2,  0x3099,  0x0,  0x30fd,  0x3099,  0x0,  0x349e,  0x0,  0x34b9,  0x0,  0x34bb,  0x0,  0x34df,  0x0,  0x3515,  0x0,  0x36ee,  0x0,  0x36fc,  0x0,  0x3781,  0x0,  0x382f,  0x0,  0x3862,  0x0,  0x387c,  0x0,  0x38c7,  0x0,  0x38e3,  0x0,  0x391c,  0x0,  0x393a,  0x0,  0x3a2e,  0x0,  0x3a6c,  0x0,  0x3ae4,  0x0,  0x3b08,  0x0,  0x3b19,  0x0,  0x3b49,  0x0,  0x3b9d,  0x0,  0x3c18,  0x0,  0x3c4e,  0x0,  0x3d33,  0x0,  0x3d96,  0x0,  0x3eac,  0x0,  0x3eb8,  0x0,  0x3f1b,  0x0,  0x3ffc,  0x0,  0x4008,  0x0,  0x4018,  0x0,  0x4039,  0x0,  0x4046,  0x0,  0x4096,  0x0,  0x40e3,  0x0,  0x412f,  0x0,  0x4202,  0x0,  0x4227,  0x0,  0x42a0,  0x0,  0x4301,  0x0,  0x4334,  0x0,  0x4359,  0x0,  0x43d5,  0x0,  0x43d9,  0x0,  0x440b,  0x0,  0x446b,  0x0,  0x452b,  0x0,  0x455d,  0x0,  0x4561,  0x0,  0x456b,  0x0,  0x45d7,  0x0,  0x45f9,  0x0,  0x4635,  0x0,  0x46be,  0x0,  0x46c7,  0x0,  0x4995,  0x0,  0x49e6,  0x0,  0x4a6e,  0x0,  0x4a76,  0x0,  0x4ab2,  0x0,  0x4b33,  0x0,  0x4bce,  0x0,  0x4cce,  0x0,  0x4ced,  0x0,  0x4cf8,  0x0,  0x4d56,  0x0,  0x4e0d,  0x0,  0x4e26,  0x0,  0x4e32,  0x0,  0x4e38,  0x0,  0x4e39,  0x0,  0x4e3d,  0x0,  0x4e41,  0x0,  0x4e82,  0x0,  0x4e86,  0x0,  0x4eae,  0x0,  0x4ec0,  0x0,  0x4ecc,  0x0,  0x4ee4,  0x0,  0x4f60,  0x0,  0x4f80,  0x0,  0x4f86,  0x0,  0x4f8b,  0x0,  0x4fae,  0x0,  0x4fbb,  0x0,  0x4fbf,  0x0,  0x5002,  0x0,  0x502b,  0x0,  0x507a,  0x0,  0x5099,  0x0,  0x50cf,  0x0,  0x50da,  0x0,  0x50e7,  0x0,  0x5140,  0x0,  0x5145,  0x0,  0x514d,  0x0,  0x5154,  0x0,  0x5164,  0x0,  0x5167,  0x0,  0x5168,  0x0,  0x5169,  0x0,  0x516d,  0x0,  0x5177,  0x0,  0x5180,  0x0,  0x518d,  0x0,  0x5192,  0x0,  0x5195,  0x0,  0x5197,  0x0,  0x51a4,  0x0,  0x51ac,  0x0,  0x51b5,  0x0,  0x51b7,  0x0,  0x51c9,  0x0,  0x51cc,  0x0,  0x51dc,  0x0,  0x51de,  0x0,  0x51f5,  0x0,  0x5203,  0x0,  0x5207,  0x0,  0x5217,  0x0,  0x5229,  0x0,  0x523a,  0x0,  0x523b,  0x0,  0x5246,  0x0,  0x5272,  0x0,  0x5277,  0x0,  0x5289,  0x0,  0x529b,  0x0,  0x52a3,  0x0,  0x52b3,  0x0,  0x52c7,  0x0,  0x52c9,  0x0,  0x52d2,  0x0,  0x52de,  0x0,  0x52e4,  0x0,  0x52f5,  0x0,  0x52fa,  0x0,  0x5305,  0x0,  0x5306,  0x0,  0x5317,  0x0,  0x533f,  0x0,  0x5349,  0x0,  0x5351,  0x0,  0x535a,  0x0,  0x5373,  0x0,  0x5375,  0x0,  0x537d,  0x0,  0x537f,  0x0,  0x53c3,  0x0,  0x53ca,  0x0,  0x53df,  0x0,  0x53e5,  0x0,  0x53eb,  0x0,  0x53f1,  0x0,  0x5406,  0x0,  0x540f,  0x0,  0x541d,  0x0,  0x5438,  0x0,  0x5442,  0x0,  0x5448,  0x0,  0x5468,  0x0,  0x549e,  0x0,  0x54a2,  0x0,  0x54bd,  0x0,  0x54f6,  0x0,  0x5510,  0x0,  0x5553,  0x0,  0x5555,  0x0,  0x5563,  0x0,  0x5584,  0x0,  0x5587,  0x0,  0x5599,  0x0,  0x559d,  0x0,  0x55ab,  0x0,  0x55b3,  0x0,  0x55c0,  0x0,  0x55c2,  0x0,  0x55e2,  0x0,  0x5606,  0x0,  0x5651,  0x0,  0x5668,  0x0,  0x5674,  0x0,  0x56f9,  0x0,  0x5716,  0x0,  0x5717,  0x0,  0x578b,  0x0,  0x57ce,  0x0,  0x57f4,  0x0,  0x580d,  0x0,  0x5831,  0x0,  0x5832,  0x0,  0x5840,  0x0,  0x585a,  0x0,  0x585e,  0x0,  0x58a8,  0x0,  0x58ac,  0x0,  0x58b3,  0x0,  0x58d8,  0x0,  0x58df,  0x0,  0x58ee,  0x0,  0x58f2,  0x0,  0x58f7,  0x0,  0x5906,  0x0,  0x591a,  0x0,  0x5922,  0x0,  0x5944,  0x0,  0x5948,  0x0,  0x5951,  0x0,  0x5954,  0x0,  0x5962,  0x0,  0x5973,  0x0,  0x59d8,  0x0,  0x59ec,  0x0,  0x5a1b,  0x0,  0x5a27,  0x0,  0x5a62,  0x0,  0x5a66,  0x0,  0x5ab5,  0x0,  0x5b08,  0x0,  0x5b28,  0x0,  0x5b3e,  0x0,  0x5b85,  0x0,  0x5bc3,  0x0,  0x5bd8,  0x0,  0x5be7,  0x0,  0x5bee,  0x0,  0x5bf3,  0x0,  0x5bff,  0x0,  0x5c06,  0x0,  0x5c22,  0x0,  0x5c3f,  0x0,  0x5c60,  0x0,  0x5c62,  0x0,  0x5c64,  0x0,  0x5c65,  0x0,  0x5c6e,  0x0,  0x5c8d,  0x0,  0x5cc0,  0x0,  0x5d19,  0x0,  0x5d43,  0x0,  0x5d50,  0x0,  0x5d6b,  0x0,  0x5d6e,  0x0,  0x5d7c,  0x0,  0x5db2,  0x0,  0x5dba,  0x0,  0x5de1,  0x0,  0x5de2,  0x0,  0x5dfd,  0x0,  0x5e28,  0x0,  0x5e3d,  0x0,  0x5e69,  0x0,  0x5e74,  0x0,  0x5ea6,  0x0,  0x5eb0,  0x0,  0x5eb3,  0x0,  0x5eb6,  0x0,  0x5ec9,  0x0,  0x5eca,  0x0,  0x5ed2,  0x0,  0x5ed3,  0x0,  0x5ed9,  0x0,  0x5eec,  0x0,  0x5efe,  0x0,  0x5f04,  0x0,  0x5f22,  0x0,  0x5f53,  0x0,  0x5f62,  0x0,  0x5f69,  0x0,  0x5f6b,  0x0,  0x5f8b,  0x0,  0x5f9a,  0x0,  0x5fa9,  0x0,  0x5fad,  0x0,  0x5fcd,  0x0,  0x5fd7,  0x0,  0x5ff5,  0x0,  0x5ff9,  0x0,  0x6012,  0x0,  0x601c,  0x0,  0x6075,  0x0,  0x6081,  0x0,  0x6094,  0x0,  0x60c7,  0x0,  0x60d8,  0x0,  0x60e1,  0x0,  0x6108,  0x0,  0x6144,  0x0,  0x6148,  0x0,  0x614c,  0x0,  0x614e,  0x0,  0x6160,  0x0,  0x6168,  0x0,  0x617a,  0x0,  0x618e,  0x0,  0x6190,  0x0,  0x61a4,  0x0,  0x61af,  0x0,  0x61b2,  0x0,  0x61de,  0x0,  0x61f2,  0x0,  0x61f6,  0x0,  0x6200,  0x0,  0x6210,  0x0,  0x621b,  0x0,  0x622e,  0x0,  0x6234,  0x0,  0x625d,  0x0,  0x62b1,  0x0,  0x62c9,  0x0,  0x62cf,  0x0,  0x62d3,  0x0,  0x62d4,  0x0,  0x62fc,  0x0,  0x62fe,  0x0,  0x633d,  0x0,  0x6350,  0x0,  0x6368,  0x0,  0x637b,  0x0,  0x6383,  0x0,  0x63a0,  0x0,  0x63a9,  0x0,  0x63c4,  0x0,  0x63c5,  0x0,  0x63e4,  0x0,  0x641c,  0x0,  0x6422,  0x0,  0x6452,  0x0,  0x6469,  0x0,  0x6477,  0x0,  0x647e,  0x0,  0x649a,  0x0,  0x649d,  0x0,  0x64c4,  0x0,  0x654f,  0x0,  0x6556,  0x0,  0x656c,  0x0,  0x6578,  0x0,  0x6599,  0x0,  0x65c5,  0x0,  0x65e2,  0x0,  0x65e3,  0x0,  0x6613,  0x0,  0x6649,  0x0,  0x6674,  0x0,  0x6688,  0x0,  0x6691,  0x0,  0x669c,  0x0,  0x66b4,  0x0,  0x66c6,  0x0,  0x66f4,  0x0,  0x66f8,  0x0,  0x6700,  0x0,  0x6717,  0x0,  0x671b,  0x0,  0x6721,  0x0,  0x674e,  0x0,  0x6753,  0x0,  0x6756,  0x0,  0x675e,  0x0,  0x677b,  0x0,  0x6785,  0x0,  0x6797,  0x0,  0x67f3,  0x0,  0x67fa,  0x0,  0x6817,  0x0,  0x681f,  0x0,  0x6852,  0x0,  0x6881,  0x0,  0x6885,  0x0,  0x688e,  0x0,  0x68a8,  0x0,  0x6914,  0x0,  0x6942,  0x0,  0x69a3,  0x0,  0x69ea,  0x0,  0x6a02,  0x0,  0x6a13,  0x0,  0x6aa8,  0x0,  0x6ad3,  0x0,  0x6adb,  0x0,  0x6b04,  0x0,  0x6b21,  0x0,  0x6b54,  0x0,  0x6b72,  0x0,  0x6b77,  0x0,  0x6b79,  0x0,  0x6b9f,  0x0,  0x6bae,  0x0,  0x6bba,  0x0,  0x6bbb,  0x0,  0x6c4e,  0x0,  0x6c67,  0x0,  0x6c88,  0x0,  0x6cbf,  0x0,  0x6ccc,  0x0,  0x6ccd,  0x0,  0x6ce5,  0x0,  0x6d16,  0x0,  0x6d1b,  0x0,  0x6d1e,  0x0,  0x6d34,  0x0,  0x6d3e,  0x0,  0x6d41,  0x0,  0x6d69,  0x0,  0x6d6a,  0x0,  0x6d77,  0x0,  0x6d78,  0x0,  0x6d85,  0x0,  0x6dcb,  0x0,  0x6dda,  0x0,  0x6dea,  0x0,  0x6df9,  0x0,  0x6e1a,  0x0,  0x6e2f,  0x0,  0x6e6e,  0x0,  0x6e9c,  0x0,  0x6eba,  0x0,  0x6ec7,  0x0,  0x6ecb,  0x0,  0x6ed1,  0x0,  0x6edb,  0x0,  0x6f0f,  0x0,  0x6f22,  0x0,  0x6f23,  0x0,  0x6f6e,  0x0,  0x6fc6,  0x0,  0x6feb,  0x0,  0x6ffe,  0x0,  0x701b,  0x0,  0x701e,  0x0,  0x7039,  0x0,  0x704a,  0x0,  0x7070,  0x0,  0x7077,  0x0,  0x707d,  0x0,  0x7099,  0x0,  0x70ad,  0x0,  0x70c8,  0x0,  0x70d9,  0x0,  0x7145,  0x0,  0x7149,  0x0,  0x716e,  0x0,  0x719c,  0x0,  0x71ce,  0x0,  0x71d0,  0x0,  0x7210,  0x0,  0x721b,  0x0,  0x7228,  0x0,  0x722b,  0x0,  0x7235,  0x0,  0x7250,  0x0,  0x7262,  0x0,  0x7280,  0x0,  0x7295,  0x0,  0x72af,  0x0,  0x72c0,  0x0,  0x72fc,  0x0,  0x732a,  0x0,  0x7375,  0x0,  0x737a,  0x0,  0x7387,  0x0,  0x738b,  0x0,  0x73a5,  0x0,  0x73b2,  0x0,  0x73de,  0x0,  0x7406,  0x0,  0x7409,  0x0,  0x7422,  0x0,  0x7447,  0x0,  0x745c,  0x0,  0x7469,  0x0,  0x7471,  0x0,  0x7485,  0x0,  0x7489,  0x0,  0x7498,  0x0,  0x74ca,  0x0,  0x7506,  0x0,  0x7524,  0x0,  0x753b,  0x0,  0x753e,  0x0,  0x7559,  0x0,  0x7565,  0x0,  0x7570,  0x0,  0x75e2,  0x0,  0x7610,  0x0,  0x761d,  0x0,  0x761f,  0x0,  0x7642,  0x0,  0x7669,  0x0,  0x76ca,  0x0,  0x76db,  0x0,  0x76e7,  0x0,  0x76f4,  0x0,  0x7701,  0x0,  0x771e,  0x0,  0x771f,  0x0,  0x7740,  0x0,  0x774a,  0x0,  0x778b,  0x0,  0x77a7,  0x0,  0x784e,  0x0,  0x786b,  0x0,  0x788c,  0x0,  0x7891,  0x0,  0x78ca,  0x0,  0x78cc,  0x0,  0x78fb,  0x0,  0x792a,  0x0,  0x793c,  0x0,  0x793e,  0x0,  0x7948,  0x0,  0x7949,  0x0,  0x7950,  0x0,  0x7956,  0x0,  0x795d,  0x0,  0x795e,  0x0,  0x7965,  0x0,  0x797f,  0x0,  0x798d,  0x0,  0x798e,  0x0,  0x798f,  0x0,  0x79ae,  0x0,  0x79ca,  0x0,  0x79eb,  0x0,  0x7a1c,  0x0,  0x7a40,  0x0,  0x7a4a,  0x0,  0x7a4f,  0x0,  0x7a81,  0x0,  0x7ab1,  0x0,  0x7acb,  0x0,  0x7aee,  0x0,  0x7b20,  0x0,  0x7bc0,  0x0,  0x7bc6,  0x0,  0x7bc9,  0x0,  0x7c3e,  0x0,  0x7c60,  0x0,  0x7c7b,  0x0,  0x7c92,  0x0,  0x7cbe,  0x0,  0x7cd2,  0x0,  0x7cd6,  0x0,  0x7ce3,  0x0,  0x7ce7,  0x0,  0x7ce8,  0x0,  0x7d00,  0x0,  0x7d10,  0x0,  0x7d22,  0x0,  0x7d2f,  0x0,  0x7d5b,  0x0,  0x7d63,  0x0,  0x7da0,  0x0,  0x7dbe,  0x0,  0x7dc7,  0x0,  0x7df4,  0x0,  0x7e02,  0x0,  0x7e09,  0x0,  0x7e37,  0x0,  0x7e41,  0x0,  0x7e45,  0x0,  0x7f3e,  0x0,  0x7f72,  0x0,  0x7f79,  0x0,  0x7f7a,  0x0,  0x7f85,  0x0,  0x7f95,  0x0,  0x7f9a,  0x0,  0x7fbd,  0x0,  0x7ffa,  0x0,  0x8001,  0x0,  0x8005,  0x0,  0x8046,  0x0,  0x8060,  0x0,  0x806f,  0x0,  0x8070,  0x0,  0x807e,  0x0,  0x808b,  0x0,  0x80ad,  0x0,  0x80b2,  0x0,  0x8103,  0x0,  0x813e,  0x0,  0x81d8,  0x0,  0x81e8,  0x0,  0x81ed,  0x0,  0x8201,  0x0,  0x8204,  0x0,  0x8218,  0x0,  0x826f,  0x0,  0x8279,  0x0,  0x828b,  0x0,  0x8291,  0x0,  0x829d,  0x0,  0x82b1,  0x0,  0x82b3,  0x0,  0x82bd,  0x0,  0x82e5,  0x0,  0x82e6,  0x0,  0x831d,  0x0,  0x8323,  0x0,  0x8336,  0x0,  0x8352,  0x0,  0x8353,  0x0,  0x8363,  0x0,  0x83ad,  0x0,  0x83bd,  0x0,  0x83c9,  0x0,  0x83ca,  0x0,  0x83cc,  0x0,  0x83dc,  0x0,  0x83e7,  0x0,  0x83ef,  0x0,  0x83f1,  0x0,  0x843d,  0x0,  0x8449,  0x0,  0x8457,  0x0,  0x84ee,  0x0,  0x84f1,  0x0,  0x84f3,  0x0,  0x84fc,  0x0,  0x8516,  0x0,  0x8564,  0x0,  0x85cd,  0x0,  0x85fa,  0x0,  0x8606,  0x0,  0x8612,  0x0,  0x862d,  0x0,  0x863f,  0x0,  0x8650,  0x0,  0x865c,  0x0,  0x8667,  0x0,  0x8669,  0x0,  0x8688,  0x0,  0x86a9,  0x0,  0x86e2,  0x0,  0x870e,  0x0,  0x8728,  0x0,  0x876b,  0x0,  0x8779,  0x0,  0x8786,  0x0,  0x87ba,  0x0,  0x87e1,  0x0,  0x8801,  0x0,  0x881f,  0x0,  0x884c,  0x0,  0x8860,  0x0,  0x8863,  0x0,  0x88c2,  0x0,  0x88cf,  0x0,  0x88d7,  0x0,  0x88de,  0x0,  0x88e1,  0x0,  0x88f8,  0x0,  0x88fa,  0x0,  0x8910,  0x0,  0x8941,  0x0,  0x8964,  0x0,  0x8986,  0x0,  0x898b,  0x0,  0x8996,  0x0,  0x8aa0,  0x0,  0x8aaa,  0x0,  0x8abf,  0x0,  0x8acb,  0x0,  0x8ad2,  0x0,  0x8ad6,  0x0,  0x8aed,  0x0,  0x8af8,  0x0,  0x8afe,  0x0,  0x8b01,  0x0,  0x8b39,  0x0,  0x8b58,  0x0,  0x8b80,  0x0,  0x8b8a,  0x0,  0x8c48,  0x0,  0x8c55,  0x0,  0x8cab,  0x0,  0x8cc1,  0x0,  0x8cc2,  0x0,  0x8cc8,  0x0,  0x8cd3,  0x0,  0x8d08,  0x0,  0x8d1b,  0x0,  0x8d77,  0x0,  0x8dbc,  0x0,  0x8dcb,  0x0,  0x8def,  0x0,  0x8df0,  0x0,  0x8eca,  0x0,  0x8ed4,  0x0,  0x8f26,  0x0,  0x8f2a,  0x0,  0x8f38,  0x0,  0x8f3b,  0x0,  0x8f62,  0x0,  0x8f9e,  0x0,  0x8fb0,  0x0,  0x8fb6,  0x0,  0x9023,  0x0,  0x9038,  0x0,  0x9072,  0x0,  0x907c,  0x0,  0x908f,  0x0,  0x9094,  0x0,  0x90ce,  0x0,  0x90de,  0x0,  0x90f1,  0x0,  0x90fd,  0x0,  0x9111,  0x0,  0x911b,  0x0,  0x916a,  0x0,  0x9199,  0x0,  0x91b4,  0x0,  0x91cc,  0x0,  0x91cf,  0x0,  0x91d1,  0x0,  0x9234,  0x0,  0x9238,  0x0,  0x9276,  0x0,  0x927c,  0x0,  0x92d7,  0x0,  0x92d8,  0x0,  0x9304,  0x0,  0x934a,  0x0,  0x93f9,  0x0,  0x9415,  0x0,  0x958b,  0x0,  0x95ad,  0x0,  0x95b7,  0x0,  0x962e,  0x0,  0x964b,  0x0,  0x964d,  0x0,  0x9675,  0x0,  0x9678,  0x0,  0x967c,  0x0,  0x9686,  0x0,  0x96a3,  0x0,  0x96b7,  0x0,  0x96b8,  0x0,  0x96c3,  0x0,  0x96e2,  0x0,  0x96e3,  0x0,  0x96f6,  0x0,  0x96f7,  0x0,  0x9723,  0x0,  0x9732,  0x0,  0x9748,  0x0,  0x9756,  0x0,  0x97db,  0x0,  0x97e0,  0x0,  0x97ff,  0x0,  0x980b,  0x0,  0x9818,  0x0,  0x9829,  0x0,  0x983b,  0x0,  0x985e,  0x0,  0x98e2,  0x0,  0x98ef,  0x0,  0x98fc,  0x0,  0x9928,  0x0,  0x9929,  0x0,  0x99a7,  0x0,  0x99c2,  0x0,  0x99f1,  0x0,  0x99fe,  0x0,  0x9a6a,  0x0,  0x9b12,  0x0,  0x9b6f,  0x0,  0x9c40,  0x0,  0x9c57,  0x0,  0x9cfd,  0x0,  0x9d67,  0x0,  0x9db4,  0x0,  0x9dfa,  0x0,  0x9e1e,  0x0,  0x9e7f,  0x0,  0x9e97,  0x0,  0x9e9f,  0x0,  0x9ebb,  0x0,  0x9ece,  0x0,  0x9ef9,  0x0,  0x9efe,  0x0,  0x9f05,  0x0,  0x9f0f,  0x0,  0x9f16,  0x0,  0x9f3b,  0x0,  0x9f43,  0x0,  0x9f8d,  0x0,  0x9f8e,  0x0,  0x9f9c,  0x0,  0x11099,  0x110ba,  0x0,  0x1109b,  0x110ba,  0x0,  0x110a5,  0x110ba,  0x0,  0x11131,  0x11127,  0x0,  0x11132,  0x11127,  0x0,  0x1d157,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x1d16e,  0x0,  0x1d158,  0x1d165,  0x1d16f,  0x0,  0x1d158,  0x1d165,  0x1d170,  0x0,  0x1d158,  0x1d165,  0x1d171,  0x0,  0x1d158,  0x1d165,  0x1d172,  0x0,  0x1d1b9,  0x1d165,  0x0,  0x1d1b9,  0x1d165,  0x1d16e,  0x0,  0x1d1b9,  0x1d165,  0x1d16f,  0x0,  0x1d1ba,  0x1d165,  0x0,  0x1d1ba,  0x1d165,  0x1d16e,  0x0,  0x1d1ba,  0x1d165,  0x1d16f,  0x0,  0x20122,  0x0,  0x2051c,  0x0,  0x20525,  0x0,  0x2054b,  0x0,  0x2063a,  0x0,  0x20804,  0x0,  0x208de,  0x0,  0x20a2c,  0x0,  0x20b63,  0x0,  0x214e4,  0x0,  0x216a8,  0x0,  0x216ea,  0x0,  0x219c8,  0x0,  0x21b18,  0x0,  0x21d0b,  0x0,  0x21de4,  0x0,  0x21de6,  0x0,  0x22183,  0x0,  0x2219f,  0x0,  0x22331,  0x0,  0x226d4,  0x0,  0x22844,  0x0,  0x2284a,  0x0,  0x22b0c,  0x0,  0x22bf1,  0x0,  0x2300a,  0x0,  0x232b8,  0x0,  0x2335f,  0x0,  0x23393,  0x0,  0x2339c,  0x0,  0x233c3,  0x0,  0x233d5,  0x0,  0x2346d,  0x0,  0x236a3,  0x0,  0x238a7,  0x0,  0x23a8d,  0x0,  0x23afa,  0x0,  0x23cbc,  0x0,  0x23d1e,  0x0,  0x23ed1,  0x0,  0x23f5e,  0x0,  0x23f8e,  0x0,  0x24263,  0x0,  0x242ee,  0x0,  0x243ab,  0x0,  0x24608,  0x0,  0x24735,  0x0,  0x24814,  0x0,  0x24c36,  0x0,  0x24c92,  0x0,  0x24fa1,  0x0,  0x24fb8,  0x0,  0x25044,  0x0,  0x250f2,  0x0,  0x250f3,  0x0,  0x25119,  0x0,  0x25133,  0x0,  0x25249,  0x0,  0x2541d,  0x0,  0x25626,  0x0,  0x2569a,  0x0,  0x256c5,  0x0,  0x2597c,  0x0,  0x25aa7,  0x0,  0x25bab,  0x0,  0x25c80,  0x0,  0x25cd0,  0x0,  0x25f86,  0x0,  0x261da,  0x0,  0x26228,  0x0,  0x26247,  0x0,  0x262d9,  0x0,  0x2633e,  0x0,  0x264da,  0x0,  0x26523,  0x0,  0x265a8,  0x0,  0x267a7,  0x0,  0x267b5,  0x0,  0x26b3c,  0x0,  0x26c36,  0x0,  0x26cd5,  0x0,  0x26d6b,  0x0,  0x26f2c,  0x0,  0x26fb1,  0x0,  0x270d2,  0x0,  0x273ca,  0x0,  0x27667,  0x0,  0x278ae,  0x0,  0x27966,  0x0,  0x27ca8,  0x0,  0x27ed3,  0x0,  0x27f2f,  0x0,  0x285d2,  0x0,  0x285ed,  0x0,  0x2872e,  0x0,  0x28bfa,  0x0,  0x28d77,  0x0,  0x29145,  0x0,  0x291df,  0x0,  0x2921a,  0x0,  0x2940a,  0x0,  0x29496,  0x0,  0x295b6,  0x0,  0x29b30,  0x0,  0x2a0ce,  0x0,  0x2a105,  0x0,  0x2a20e,  0x0,  0x2a291,  0x0,  0x2a392,  0x0,  0x2a600,  0x0]; return t; }
++_IDCA decompCompatTable() { static _IDCA t = [ 0x0,  0x20,  0x0,  0x20,  0x301,  0x0,  0x20,  0x303,  0x0,  0x20,  0x304,  0x0,  0x20,  0x305,  0x0,  0x20,  0x306,  0x0,  0x20,  0x307,  0x0,  0x20,  0x308,  0x0,  0x20,  0x308,  0x300,  0x0,  0x20,  0x308,  0x301,  0x0,  0x20,  0x308,  0x342,  0x0,  0x20,  0x30a,  0x0,  0x20,  0x30b,  0x0,  0x20,  0x313,  0x0,  0x20,  0x313,  0x300,  0x0,  0x20,  0x313,  0x301,  0x0,  0x20,  0x313,  0x342,  0x0,  0x20,  0x314,  0x0,  0x20,  0x314,  0x300,  0x0,  0x20,  0x314,  0x301,  0x0,  0x20,  0x314,  0x342,  0x0,  0x20,  0x327,  0x0,  0x20,  0x328,  0x0,  0x20,  0x333,  0x0,  0x20,  0x342,  0x0,  0x20,  0x345,  0x0,  0x20,  0x64b,  0x0,  0x20,  0x64c,  0x0,  0x20,  0x64c,  0x651,  0x0,  0x20,  0x64d,  0x0,  0x20,  0x64d,  0x651,  0x0,  0x20,  0x64e,  0x0,  0x20,  0x64e,  0x651,  0x0,  0x20,  0x64f,  0x0,  0x20,  0x64f,  0x651,  0x0,  0x20,  0x650,  0x0,  0x20,  0x650,  0x651,  0x0,  0x20,  0x651,  0x0,  0x20,  0x651,  0x670,  0x0,  0x20,  0x652,  0x0,  0x20,  0x3099,  0x0,  0x20,  0x309a,  0x0,  0x21,  0x0,  0x21,  0x21,  0x0,  0x21,  0x3f,  0x0,  0x22,  0x0,  0x23,  0x0,  0x24,  0x0,  0x25,  0x0,  0x26,  0x0,  0x27,  0x0,  0x28,  0x0,  0x28,  0x31,  0x29,  0x0,  0x28,  0x31,  0x30,  0x29,  0x0,  0x28,  0x31,  0x31,  0x29,  0x0,  0x28,  0x31,  0x32,  0x29,  0x0,  0x28,  0x31,  0x33,  0x29,  0x0,  0x28,  0x31,  0x34,  0x29,  0x0,  0x28,  0x31,  0x35,  0x29,  0x0,  0x28,  0x31,  0x36,  0x29,  0x0,  0x28,  0x31,  0x37,  0x29,  0x0,  0x28,  0x31,  0x38,  0x29,  0x0,  0x28,  0x31,  0x39,  0x29,  0x0,  0x28,  0x32,  0x29,  0x0,  0x28,  0x32,  0x30,  0x29,  0x0,  0x28,  0x33,  0x29,  0x0,  0x28,  0x34,  0x29,  0x0,  0x28,  0x35,  0x29,  0x0,  0x28,  0x36,  0x29,  0x0,  0x28,  0x37,  0x29,  0x0,  0x28,  0x38,  0x29,  0x0,  0x28,  0x39,  0x29,  0x0,  0x28,  0x41,  0x29,  0x0,  0x28,  0x42,  0x29,  0x0,  0x28,  0x43,  0x29,  0x0,  0x28,  0x44,  0x29,  0x0,  0x28,  0x45,  0x29,  0x0,  0x28,  0x46,  0x29,  0x0,  0x28,  0x47,  0x29,  0x0,  0x28,  0x48,  0x29,  0x0,  0x28,  0x49,  0x29,  0x0,  0x28,  0x4a,  0x29,  0x0,  0x28,  0x4b,  0x29,  0x0,  0x28,  0x4c,  0x29,  0x0,  0x28,  0x4d,  0x29,  0x0,  0x28,  0x4e,  0x29,  0x0,  0x28,  0x4f,  0x29,  0x0,  0x28,  0x50,  0x29,  0x0,  0x28,  0x51,  0x29,  0x0,  0x28,  0x52,  0x29,  0x0,  0x28,  0x53,  0x29,  0x0,  0x28,  0x54,  0x29,  0x0,  0x28,  0x55,  0x29,  0x0,  0x28,  0x56,  0x29,  0x0,  0x28,  0x57,  0x29,  0x0,  0x28,  0x58,  0x29,  0x0,  0x28,  0x59,  0x29,  0x0,  0x28,  0x5a,  0x29,  0x0,  0x28,  0x61,  0x29,  0x0,  0x28,  0x62,  0x29,  0x0,  0x28,  0x63,  0x29,  0x0,  0x28,  0x64,  0x29,  0x0,  0x28,  0x65,  0x29,  0x0,  0x28,  0x66,  0x29,  0x0,  0x28,  0x67,  0x29,  0x0,  0x28,  0x68,  0x29,  0x0,  0x28,  0x69,  0x29,  0x0,  0x28,  0x6a,  0x29,  0x0,  0x28,  0x6b,  0x29,  0x0,  0x28,  0x6c,  0x29,  0x0,  0x28,  0x6d,  0x29,  0x0,  0x28,  0x6e,  0x29,  0x0,  0x28,  0x6f,  0x29,  0x0,  0x28,  0x70,  0x29,  0x0,  0x28,  0x71,  0x29,  0x0,  0x28,  0x72,  0x29,  0x0,  0x28,  0x73,  0x29,  0x0,  0x28,  0x74,  0x29,  0x0,  0x28,  0x75,  0x29,  0x0,  0x28,  0x76,  0x29,  0x0,  0x28,  0x77,  0x29,  0x0,  0x28,  0x78,  0x29,  0x0,  0x28,  0x79,  0x29,  0x0,  0x28,  0x7a,  0x29,  0x0,  0x28,  0x1100,  0x29,  0x0,  0x28,  0x1100,  0x1161,  0x29,  0x0,  0x28,  0x1102,  0x29,  0x0,  0x28,  0x1102,  0x1161,  0x29,  0x0,  0x28,  0x1103,  0x29,  0x0,  0x28,  0x1103,  0x1161,  0x29,  0x0,  0x28,  0x1105,  0x29,  0x0,  0x28,  0x1105,  0x1161,  0x29,  0x0,  0x28,  0x1106,  0x29,  0x0,  0x28,  0x1106,  0x1161,  0x29,  0x0,  0x28,  0x1107,  0x29,  0x0,  0x28,  0x1107,  0x1161,  0x29,  0x0,  0x28,  0x1109,  0x29,  0x0,  0x28,  0x1109,  0x1161,  0x29,  0x0,  0x28,  0x110b,  0x29,  0x0,  0x28,  0x110b,  0x1161,  0x29,  0x0,  0x28,  0x110b,  0x1169,  0x110c,  0x1165,  0x11ab,  0x29,  0x0,  0x28,  0x110b,  0x1169,  0x1112,  0x116e,  0x29,  0x0,  0x28,  0x110c,  0x29,  0x0,  0x28,  0x110c,  0x1161,  0x29,  0x0,  0x28,  0x110c,  0x116e,  0x29,  0x0,  0x28,  0x110e,  0x29,  0x0,  0x28,  0x110e,  0x1161,  0x29,  0x0,  0x28,  0x110f,  0x29,  0x0,  0x28,  0x110f,  0x1161,  0x29,  0x0,  0x28,  0x1110,  0x29,  0x0,  0x28,  0x1110,  0x1161,  0x29,  0x0,  0x28,  0x1111,  0x29,  0x0,  0x28,  0x1111,  0x1161,  0x29,  0x0,  0x28,  0x1112,  0x29,  0x0,  0x28,  0x1112,  0x1161,  0x29,  0x0,  0x28,  0x4e00,  0x29,  0x0,  0x28,  0x4e03,  0x29,  0x0,  0x28,  0x4e09,  0x29,  0x0,  0x28,  0x4e5d,  0x29,  0x0,  0x28,  0x4e8c,  0x29,  0x0,  0x28,  0x4e94,  0x29,  0x0,  0x28,  0x4ee3,  0x29,  0x0,  0x28,  0x4f01,  0x29,  0x0,  0x28,  0x4f11,  0x29,  0x0,  0x28,  0x516b,  0x29,  0x0,  0x28,  0x516d,  0x29,  0x0,  0x28,  0x52b4,  0x29,  0x0,  0x28,  0x5341,  0x29,  0x0,  0x28,  0x5354,  0x29,  0x0,  0x28,  0x540d,  0x29,  0x0,  0x28,  0x547c,  0x29,  0x0,  0x28,  0x56db,  0x29,  0x0,  0x28,  0x571f,  0x29,  0x0,  0x28,  0x5b66,  0x29,  0x0,  0x28,  0x65e5,  0x29,  0x0,  0x28,  0x6708,  0x29,  0x0,  0x28,  0x6709,  0x29,  0x0,  0x28,  0x6728,  0x29,  0x0,  0x28,  0x682a,  0x29,  0x0,  0x28,  0x6c34,  0x29,  0x0,  0x28,  0x706b,  0x29,  0x0,  0x28,  0x7279,  0x29,  0x0,  0x28,  0x76e3,  0x29,  0x0,  0x28,  0x793e,  0x29,  0x0,  0x28,  0x795d,  0x29,  0x0,  0x28,  0x796d,  0x29,  0x0,  0x28,  0x81ea,  0x29,  0x0,  0x28,  0x81f3,  0x29,  0x0,  0x28,  0x8ca1,  0x29,  0x0,  0x28,  0x8cc7,  0x29,  0x0,  0x28,  0x91d1,  0x29,  0x0,  0x29,  0x0,  0x2a,  0x0,  0x2b,  0x0,  0x2c,  0x0,  0x2d,  0x0,  0x2e,  0x0,  0x2e,  0x2e,  0x0,  0x2e,  0x2e,  0x2e,  0x0,  0x2f,  0x0,  0x30,  0x0,  0x30,  0x2c,  0x0,  0x30,  0x2e,  0x0,  0x30,  0x2044,  0x33,  0x0,  0x30,  0x70b9,  0x0,  0x31,  0x0,  0x31,  0x2c,  0x0,  0x31,  0x2e,  0x0,  0x31,  0x30,  0x0,  0x31,  0x30,  0x2e,  0x0,  0x31,  0x30,  0x65e5,  0x0,  0x31,  0x30,  0x6708,  0x0,  0x31,  0x30,  0x70b9,  0x0,  0x31,  0x31,  0x0,  0x31,  0x31,  0x2e,  0x0,  0x31,  0x31,  0x65e5,  0x0,  0x31,  0x31,  0x6708,  0x0,  0x31,  0x31,  0x70b9,  0x0,  0x31,  0x32,  0x0,  0x31,  0x32,  0x2e,  0x0,  0x31,  0x32,  0x65e5,  0x0,  0x31,  0x32,  0x6708,  0x0,  0x31,  0x32,  0x70b9,  0x0,  0x31,  0x33,  0x0,  0x31,  0x33,  0x2e,  0x0,  0x31,  0x33,  0x65e5,  0x0,  0x31,  0x33,  0x70b9,  0x0,  0x31,  0x34,  0x0,  0x31,  0x34,  0x2e,  0x0,  0x31,  0x34,  0x65e5,  0x0,  0x31,  0x34,  0x70b9,  0x0,  0x31,  0x35,  0x0,  0x31,  0x35,  0x2e,  0x0,  0x31,  0x35,  0x65e5,  0x0,  0x31,  0x35,  0x70b9,  0x0,  0x31,  0x36,  0x0,  0x31,  0x36,  0x2e,  0x0,  0x31,  0x36,  0x65e5,  0x0,  0x31,  0x36,  0x70b9,  0x0,  0x31,  0x37,  0x0,  0x31,  0x37,  0x2e,  0x0,  0x31,  0x37,  0x65e5,  0x0,  0x31,  0x37,  0x70b9,  0x0,  0x31,  0x38,  0x0,  0x31,  0x38,  0x2e,  0x0,  0x31,  0x38,  0x65e5,  0x0,  0x31,  0x38,  0x70b9,  0x0,  0x31,  0x39,  0x0,  0x31,  0x39,  0x2e,  0x0,  0x31,  0x39,  0x65e5,  0x0,  0x31,  0x39,  0x70b9,  0x0,  0x31,  0x2044,  0x0,  0x31,  0x2044,  0x31,  0x30,  0x0,  0x31,  0x2044,  0x32,  0x0,  0x31,  0x2044,  0x33,  0x0,  0x31,  0x2044,  0x34,  0x0,  0x31,  0x2044,  0x35,  0x0,  0x31,  0x2044,  0x36,  0x0,  0x31,  0x2044,  0x37,  0x0,  0x31,  0x2044,  0x38,  0x0,  0x31,  0x2044,  0x39,  0x0,  0x31,  0x65e5,  0x0,  0x31,  0x6708,  0x0,  0x31,  0x70b9,  0x0,  0x32,  0x0,  0x32,  0x2c,  0x0,  0x32,  0x2e,  0x0,  0x32,  0x30,  0x0,  0x32,  0x30,  0x2e,  0x0,  0x32,  0x30,  0x65e5,  0x0,  0x32,  0x30,  0x70b9,  0x0,  0x32,  0x31,  0x0,  0x32,  0x31,  0x65e5,  0x0,  0x32,  0x31,  0x70b9,  0x0,  0x32,  0x32,  0x0,  0x32,  0x32,  0x65e5,  0x0,  0x32,  0x32,  0x70b9,  0x0,  0x32,  0x33,  0x0,  0x32,  0x33,  0x65e5,  0x0,  0x32,  0x33,  0x70b9,  0x0,  0x32,  0x34,  0x0,  0x32,  0x34,  0x65e5,  0x0,  0x32,  0x34,  0x70b9,  0x0,  0x32,  0x35,  0x0,  0x32,  0x35,  0x65e5,  0x0,  0x32,  0x36,  0x0,  0x32,  0x36,  0x65e5,  0x0,  0x32,  0x37,  0x0,  0x32,  0x37,  0x65e5,  0x0,  0x32,  0x38,  0x0,  0x32,  0x38,  0x65e5,  0x0,  0x32,  0x39,  0x0,  0x32,  0x39,  0x65e5,  0x0,  0x32,  0x2044,  0x33,  0x0,  0x32,  0x2044,  0x35,  0x0,  0x32,  0x65e5,  0x0,  0x32,  0x6708,  0x0,  0x32,  0x70b9,  0x0,  0x33,  0x0,  0x33,  0x2c,  0x0,  0x33,  0x2e,  0x0,  0x33,  0x30,  0x0,  0x33,  0x30,  0x65e5,  0x0,  0x33,  0x31,  0x0,  0x33,  0x31,  0x65e5,  0x0,  0x33,  0x32,  0x0,  0x33,  0x33,  0x0,  0x33,  0x34,  0x0,  0x33,  0x35,  0x0,  0x33,  0x36,  0x0,  0x33,  0x37,  0x0,  0x33,  0x38,  0x0,  0x33,  0x39,  0x0,  0x33,  0x2044,  0x34,  0x0,  0x33,  0x2044,  0x35,  0x0,  0x33,  0x2044,  0x38,  0x0,  0x33,  0x65e5,  0x0,  0x33,  0x6708,  0x0,  0x33,  0x70b9,  0x0,  0x34,  0x0,  0x34,  0x2c,  0x0,  0x34,  0x2e,  0x0,  0x34,  0x30,  0x0,  0x34,  0x31,  0x0,  0x34,  0x32,  0x0,  0x34,  0x33,  0x0,  0x34,  0x34,  0x0,  0x34,  0x35,  0x0,  0x34,  0x36,  0x0,  0x34,  0x37,  0x0,  0x34,  0x38,  0x0,  0x34,  0x39,  0x0,  0x34,  0x2044,  0x35,  0x0,  0x34,  0x65e5,  0x0,  0x34,  0x6708,  0x0,  0x34,  0x70b9,  0x0,  0x35,  0x0,  0x35,  0x2c,  0x0,  0x35,  0x2e,  0x0,  0x35,  0x30,  0x0,  0x35,  0x2044,  0x36,  0x0,  0x35,  0x2044,  0x38,  0x0,  0x35,  0x65e5,  0x0,  0x35,  0x6708,  0x0,  0x35,  0x70b9,  0x0,  0x36,  0x0,  0x36,  0x2c,  0x0,  0x36,  0x2e,  0x0,  0x36,  0x65e5,  0x0,  0x36,  0x6708,  0x0,  0x36,  0x70b9,  0x0,  0x37,  0x0,  0x37,  0x2c,  0x0,  0x37,  0x2e,  0x0,  0x37,  0x2044,  0x38,  0x0,  0x37,  0x65e5,  0x0,  0x37,  0x6708,  0x0,  0x37,  0x70b9,  0x0,  0x38,  0x0,  0x38,  0x2c,  0x0,  0x38,  0x2e,  0x0,  0x38,  0x65e5,  0x0,  0x38,  0x6708,  0x0,  0x38,  0x70b9,  0x0,  0x39,  0x0,  0x39,  0x2c,  0x0,  0x39,  0x2e,  0x0,  0x39,  0x65e5,  0x0,  0x39,  0x6708,  0x0,  0x39,  0x70b9,  0x0,  0x3a,  0x0,  0x3a,  0x3a,  0x3d,  0x0,  0x3b,  0x0,  0x3c,  0x0,  0x3c,  0x338,  0x0,  0x3d,  0x0,  0x3d,  0x3d,  0x0,  0x3d,  0x3d,  0x3d,  0x0,  0x3d,  0x338,  0x0,  0x3e,  0x0,  0x3e,  0x338,  0x0,  0x3f,  0x0,  0x3f,  0x21,  0x0,  0x3f,  0x3f,  0x0,  0x40,  0x0,  0x41,  0x0,  0x41,  0x55,  0x0,  0x41,  0x300,  0x0,  0x41,  0x301,  0x0,  0x41,  0x302,  0x0,  0x41,  0x302,  0x300,  0x0,  0x41,  0x302,  0x301,  0x0,  0x41,  0x302,  0x303,  0x0,  0x41,  0x302,  0x309,  0x0,  0x41,  0x303,  0x0,  0x41,  0x304,  0x0,  0x41,  0x306,  0x0,  0x41,  0x306,  0x300,  0x0,  0x41,  0x306,  0x301,  0x0,  0x41,  0x306,  0x303,  0x0,  0x41,  0x306,  0x309,  0x0,  0x41,  0x307,  0x0,  0x41,  0x307,  0x304,  0x0,  0x41,  0x308,  0x0,  0x41,  0x308,  0x304,  0x0,  0x41,  0x309,  0x0,  0x41,  0x30a,  0x0,  0x41,  0x30a,  0x301,  0x0,  0x41,  0x30c,  0x0,  0x41,  0x30f,  0x0,  0x41,  0x311,  0x0,  0x41,  0x323,  0x0,  0x41,  0x323,  0x302,  0x0,  0x41,  0x323,  0x306,  0x0,  0x41,  0x325,  0x0,  0x41,  0x328,  0x0,  0x41,  0x2215,  0x6d,  0x0,  0x42,  0x0,  0x42,  0x71,  0x0,  0x42,  0x307,  0x0,  0x42,  0x323,  0x0,  0x42,  0x331,  0x0,  0x43,  0x0,  0x43,  0x44,  0x0,  0x43,  0x6f,  0x2e,  0x0,  0x43,  0x301,  0x0,  0x43,  0x302,  0x0,  0x43,  0x307,  0x0,  0x43,  0x30c,  0x0,  0x43,  0x327,  0x0,  0x43,  0x327,  0x301,  0x0,  0x43,  0x2215,  0x6b,  0x67,  0x0,  0x44,  0x0,  0x44,  0x4a,  0x0,  0x44,  0x5a,  0x0,  0x44,  0x5a,  0x30c,  0x0,  0x44,  0x7a,  0x0,  0x44,  0x7a,  0x30c,  0x0,  0x44,  0x307,  0x0,  0x44,  0x30c,  0x0,  0x44,  0x323,  0x0,  0x44,  0x327,  0x0,  0x44,  0x32d,  0x0,  0x44,  0x331,  0x0,  0x45,  0x0,  0x45,  0x300,  0x0,  0x45,  0x301,  0x0,  0x45,  0x302,  0x0,  0x45,  0x302,  0x300,  0x0,  0x45,  0x302,  0x301,  0x0,  0x45,  0x302,  0x303,  0x0,  0x45,  0x302,  0x309,  0x0,  0x45,  0x303,  0x0,  0x45,  0x304,  0x0,  0x45,  0x304,  0x300,  0x0,  0x45,  0x304,  0x301,  0x0,  0x45,  0x306,  0x0,  0x45,  0x307,  0x0,  0x45,  0x308,  0x0,  0x45,  0x309,  0x0,  0x45,  0x30c,  0x0,  0x45,  0x30f,  0x0,  0x45,  0x311,  0x0,  0x45,  0x323,  0x0,  0x45,  0x323,  0x302,  0x0,  0x45,  0x327,  0x0,  0x45,  0x327,  0x306,  0x0,  0x45,  0x328,  0x0,  0x45,  0x32d,  0x0,  0x45,  0x330,  0x0,  0x46,  0x0,  0x46,  0x41,  0x58,  0x0,  0x46,  0x307,  0x0,  0x47,  0x0,  0x47,  0x42,  0x0,  0x47,  0x48,  0x7a,  0x0,  0x47,  0x50,  0x61,  0x0,  0x47,  0x79,  0x0,  0x47,  0x301,  0x0,  0x47,  0x302,  0x0,  0x47,  0x304,  0x0,  0x47,  0x306,  0x0,  0x47,  0x307,  0x0,  0x47,  0x30c,  0x0,  0x47,  0x327,  0x0,  0x48,  0x0,  0x48,  0x50,  0x0,  0x48,  0x56,  0x0,  0x48,  0x67,  0x0,  0x48,  0x7a,  0x0,  0x48,  0x302,  0x0,  0x48,  0x307,  0x0,  0x48,  0x308,  0x0,  0x48,  0x30c,  0x0,  0x48,  0x323,  0x0,  0x48,  0x327,  0x0,  0x48,  0x32e,  0x0,  0x49,  0x0,  0x49,  0x49,  0x0,  0x49,  0x49,  0x49,  0x0,  0x49,  0x4a,  0x0,  0x49,  0x55,  0x0,  0x49,  0x56,  0x0,  0x49,  0x58,  0x0,  0x49,  0x300,  0x0,  0x49,  0x301,  0x0,  0x49,  0x302,  0x0,  0x49,  0x303,  0x0,  0x49,  0x304,  0x0,  0x49,  0x306,  0x0,  0x49,  0x307,  0x0,  0x49,  0x308,  0x0,  0x49,  0x308,  0x301,  0x0,  0x49,  0x309,  0x0,  0x49,  0x30c,  0x0,  0x49,  0x30f,  0x0,  0x49,  0x311,  0x0,  0x49,  0x323,  0x0,  0x49,  0x328,  0x0,  0x49,  0x330,  0x0,  0x4a,  0x0,  0x4a,  0x302,  0x0,  0x4b,  0x0,  0x4b,  0x42,  0x0,  0x4b,  0x4b,  0x0,  0x4b,  0x4d,  0x0,  0x4b,  0x301,  0x0,  0x4b,  0x30c,  0x0,  0x4b,  0x323,  0x0,  0x4b,  0x327,  0x0,  0x4b,  0x331,  0x0,  0x4c,  0x0,  0x4c,  0x4a,  0x0,  0x4c,  0x54,  0x44,  0x0,  0x4c,  0x6a,  0x0,  0x4c,  0xb7,  0x0,  0x4c,  0x301,  0x0,  0x4c,  0x30c,  0x0,  0x4c,  0x323,  0x0,  0x4c,  0x323,  0x304,  0x0,  0x4c,  0x327,  0x0,  0x4c,  0x32d,  0x0,  0x4c,  0x331,  0x0,  0x4d,  0x0,  0x4d,  0x42,  0x0,  0x4d,  0x43,  0x0,  0x4d,  0x44,  0x0,  0x4d,  0x48,  0x7a,  0x0,  0x4d,  0x50,  0x61,  0x0,  0x4d,  0x56,  0x0,  0x4d,  0x57,  0x0,  0x4d,  0x301,  0x0,  0x4d,  0x307,  0x0,  0x4d,  0x323,  0x0,  0x4d,  0x3a9,  0x0,  0x4e,  0x0,  0x4e,  0x4a,  0x0,  0x4e,  0x6a,  0x0,  0x4e,  0x6f,  0x0,  0x4e,  0x300,  0x0,  0x4e,  0x301,  0x0,  0x4e,  0x303,  0x0,  0x4e,  0x307,  0x0,  0x4e,  0x30c,  0x0,  0x4e,  0x323,  0x0,  0x4e,  0x327,  0x0,  0x4e,  0x32d,  0x0,  0x4e,  0x331,  0x0,  0x4f,  0x0,  0x4f,  0x300,  0x0,  0x4f,  0x301,  0x0,  0x4f,  0x302,  0x0,  0x4f,  0x302,  0x300,  0x0,  0x4f,  0x302,  0x301,  0x0,  0x4f,  0x302,  0x303,  0x0,  0x4f,  0x302,  0x309,  0x0,  0x4f,  0x303,  0x0,  0x4f,  0x303,  0x301,  0x0,  0x4f,  0x303,  0x304,  0x0,  0x4f,  0x303,  0x308,  0x0,  0x4f,  0x304,  0x0,  0x4f,  0x304,  0x300,  0x0,  0x4f,  0x304,  0x301,  0x0,  0x4f,  0x306,  0x0,  0x4f,  0x307,  0x0,  0x4f,  0x307,  0x304,  0x0,  0x4f,  0x308,  0x0,  0x4f,  0x308,  0x304,  0x0,  0x4f,  0x309,  0x0,  0x4f,  0x30b,  0x0,  0x4f,  0x30c,  0x0,  0x4f,  0x30f,  0x0,  0x4f,  0x311,  0x0,  0x4f,  0x31b,  0x0,  0x4f,  0x31b,  0x300,  0x0,  0x4f,  0x31b,  0x301,  0x0,  0x4f,  0x31b,  0x303,  0x0,  0x4f,  0x31b,  0x309,  0x0,  0x4f,  0x31b,  0x323,  0x0,  0x4f,  0x323,  0x0,  0x4f,  0x323,  0x302,  0x0,  0x4f,  0x328,  0x0,  0x4f,  0x328,  0x304,  0x0,  0x50,  0x0,  0x50,  0x48,  0x0,  0x50,  0x50,  0x4d,  0x0,  0x50,  0x50,  0x56,  0x0,  0x50,  0x52,  0x0,  0x50,  0x54,  0x45,  0x0,  0x50,  0x61,  0x0,  0x50,  0x301,  0x0,  0x50,  0x307,  0x0,  0x51,  0x0,  0x52,  0x0,  0x52,  0x73,  0x0,  0x52,  0x301,  0x0,  0x52,  0x307,  0x0,  0x52,  0x30c,  0x0,  0x52,  0x30f,  0x0,  0x52,  0x311,  0x0,  0x52,  0x323,  0x0,  0x52,  0x323,  0x304,  0x0,  0x52,  0x327,  0x0,  0x52,  0x331,  0x0,  0x53,  0x0,  0x53,  0x44,  0x0,  0x53,  0x4d,  0x0,  0x53,  0x53,  0x0,  0x53,  0x76,  0x0,  0x53,  0x301,  0x0,  0x53,  0x301,  0x307,  0x0,  0x53,  0x302,  0x0,  0x53,  0x307,  0x0,  0x53,  0x30c,  0x0,  0x53,  0x30c,  0x307,  0x0,  0x53,  0x323,  0x0,  0x53,  0x323,  0x307,  0x0,  0x53,  0x326,  0x0,  0x53,  0x327,  0x0,  0x54,  0x0,  0x54,  0x45,  0x4c,  0x0,  0x54,  0x48,  0x7a,  0x0,  0x54,  0x4d,  0x0,  0x54,  0x307,  0x0,  0x54,  0x30c,  0x0,  0x54,  0x323,  0x0,  0x54,  0x326,  0x0,  0x54,  0x327,  0x0,  0x54,  0x32d,  0x0,  0x54,  0x331,  0x0,  0x55,  0x0,  0x55,  0x300,  0x0,  0x55,  0x301,  0x0,  0x55,  0x302,  0x0,  0x55,  0x303,  0x0,  0x55,  0x303,  0x301,  0x0,  0x55,  0x304,  0x0,  0x55,  0x304,  0x308,  0x0,  0x55,  0x306,  0x0,  0x55,  0x308,  0x0,  0x55,  0x308,  0x300,  0x0,  0x55,  0x308,  0x301,  0x0,  0x55,  0x308,  0x304,  0x0,  0x55,  0x308,  0x30c,  0x0,  0x55,  0x309,  0x0,  0x55,  0x30a,  0x0,  0x55,  0x30b,  0x0,  0x55,  0x30c,  0x0,  0x55,  0x30f,  0x0,  0x55,  0x311,  0x0,  0x55,  0x31b,  0x0,  0x55,  0x31b,  0x300,  0x0,  0x55,  0x31b,  0x301,  0x0,  0x55,  0x31b,  0x303,  0x0,  0x55,  0x31b,  0x309,  0x0,  0x55,  0x31b,  0x323,  0x0,  0x55,  0x323,  0x0,  0x55,  0x324,  0x0,  0x55,  0x328,  0x0,  0x55,  0x32d,  0x0,  0x55,  0x330,  0x0,  0x56,  0x0,  0x56,  0x49,  0x0,  0x56,  0x49,  0x49,  0x0,  0x56,  0x49,  0x49,  0x49,  0x0,  0x56,  0x303,  0x0,  0x56,  0x323,  0x0,  0x56,  0x2215,  0x6d,  0x0,  0x57,  0x0,  0x57,  0x43,  0x0,  0x57,  0x5a,  0x0,  0x57,  0x62,  0x0,  0x57,  0x300,  0x0,  0x57,  0x301,  0x0,  0x57,  0x302,  0x0,  0x57,  0x307,  0x0,  0x57,  0x308,  0x0,  0x57,  0x323,  0x0,  0x58,  0x0,  0x58,  0x49,  0x0,  0x58,  0x49,  0x49,  0x0,  0x58,  0x307,  0x0,  0x58,  0x308,  0x0,  0x59,  0x0,  0x59,  0x300,  0x0,  0x59,  0x301,  0x0,  0x59,  0x302,  0x0,  0x59,  0x303,  0x0,  0x59,  0x304,  0x0,  0x59,  0x307,  0x0,  0x59,  0x308,  0x0,  0x59,  0x309,  0x0,  0x59,  0x323,  0x0,  0x5a,  0x0,  0x5a,  0x301,  0x0,  0x5a,  0x302,  0x0,  0x5a,  0x307,  0x0,  0x5a,  0x30c,  0x0,  0x5a,  0x323,  0x0,  0x5a,  0x331,  0x0,  0x5b,  0x0,  0x5c,  0x0,  0x5d,  0x0,  0x5e,  0x0,  0x5f,  0x0,  0x60,  0x0,  0x61,  0x0,  0x61,  0x2e,  0x6d,  0x2e,  0x0,  0x61,  0x2f,  0x63,  0x0,  0x61,  0x2f,  0x73,  0x0,  0x61,  0x2be,  0x0,  0x61,  0x300,  0x0,  0x61,  0x301,  0x0,  0x61,  0x302,  0x0,  0x61,  0x302,  0x300,  0x0,  0x61,  0x302,  0x301,  0x0,  0x61,  0x302,  0x303,  0x0,  0x61,  0x302,  0x309,  0x0,  0x61,  0x303,  0x0,  0x61,  0x304,  0x0,  0x61,  0x306,  0x0,  0x61,  0x306,  0x300,  0x0,  0x61,  0x306,  0x301,  0x0,  0x61,  0x306,  0x303,  0x0,  0x61,  0x306,  0x309,  0x0,  0x61,  0x307,  0x0,  0x61,  0x307,  0x304,  0x0,  0x61,  0x308,  0x0,  0x61,  0x308,  0x304,  0x0,  0x61,  0x309,  0x0,  0x61,  0x30a,  0x0,  0x61,  0x30a,  0x301,  0x0,  0x61,  0x30c,  0x0,  0x61,  0x30f,  0x0,  0x61,  0x311,  0x0,  0x61,  0x323,  0x0,  0x61,  0x323,  0x302,  0x0,  0x61,  0x323,  0x306,  0x0,  0x61,  0x325,  0x0,  0x61,  0x328,  0x0,  0x62,  0x0,  0x62,  0x61,  0x72,  0x0,  0x62,  0x307,  0x0,  0x62,  0x323,  0x0,  0x62,  0x331,  0x0,  0x63,  0x0,  0x63,  0x2f,  0x6f,  0x0,  0x63,  0x2f,  0x75,  0x0,  0x63,  0x61,  0x6c,  0x0,  0x63,  0x63,  0x0,  0x63,  0x64,  0x0,  0x63,  0x6d,  0x0,  0x63,  0x6d,  0x32,  0x0,  0x63,  0x6d,  0x33,  0x0,  0x63,  0x301,  0x0,  0x63,  0x302,  0x0,  0x63,  0x307,  0x0,  0x63,  0x30c,  0x0,  0x63,  0x327,  0x0,  0x63,  0x327,  0x301,  0x0,  0x64,  0x0,  0x64,  0x42,  0x0,  0x64,  0x61,  0x0,  0x64,  0x6c,  0x0,  0x64,  0x6d,  0x0,  0x64,  0x6d,  0x32,  0x0,  0x64,  0x6d,  0x33,  0x0,  0x64,  0x7a,  0x0,  0x64,  0x7a,  0x30c,  0x0,  0x64,  0x307,  0x0,  0x64,  0x30c,  0x0,  0x64,  0x323,  0x0,  0x64,  0x327,  0x0,  0x64,  0x32d,  0x0,  0x64,  0x331,  0x0,  0x65,  0x0,  0x65,  0x56,  0x0,  0x65,  0x72,  0x67,  0x0,  0x65,  0x300,  0x0,  0x65,  0x301,  0x0,  0x65,  0x302,  0x0,  0x65,  0x302,  0x300,  0x0,  0x65,  0x302,  0x301,  0x0,  0x65,  0x302,  0x303,  0x0,  0x65,  0x302,  0x309,  0x0,  0x65,  0x303,  0x0,  0x65,  0x304,  0x0,  0x65,  0x304,  0x300,  0x0,  0x65,  0x304,  0x301,  0x0,  0x65,  0x306,  0x0,  0x65,  0x307,  0x0,  0x65,  0x308,  0x0,  0x65,  0x309,  0x0,  0x65,  0x30c,  0x0,  0x65,  0x30f,  0x0,  0x65,  0x311,  0x0,  0x65,  0x323,  0x0,  0x65,  0x323,  0x302,  0x0,  0x65,  0x327,  0x0,  0x65,  0x327,  0x306,  0x0,  0x65,  0x328,  0x0,  0x65,  0x32d,  0x0,  0x65,  0x330,  0x0,  0x66,  0x0,  0x66,  0x66,  0x0,  0x66,  0x66,  0x69,  0x0,  0x66,  0x66,  0x6c,  0x0,  0x66,  0x69,  0x0,  0x66,  0x6c,  0x0,  0x66,  0x6d,  0x0,  0x66,  0x307,  0x0,  0x67,  0x0,  0x67,  0x61,  0x6c,  0x0,  0x67,  0x301,  0x0,  0x67,  0x302,  0x0,  0x67,  0x304,  0x0,  0x67,  0x306,  0x0,  0x67,  0x307,  0x0,  0x67,  0x30c,  0x0,  0x67,  0x327,  0x0,  0x68,  0x0,  0x68,  0x50,  0x61,  0x0,  0x68,  0x61,  0x0,  0x68,  0x302,  0x0,  0x68,  0x307,  0x0,  0x68,  0x308,  0x0,  0x68,  0x30c,  0x0,  0x68,  0x323,  0x0,  0x68,  0x327,  0x0,  0x68,  0x32e,  0x0,  0x68,  0x331,  0x0,  0x69,  0x0,  0x69,  0x69,  0x0,  0x69,  0x69,  0x69,  0x0,  0x69,  0x6a,  0x0,  0x69,  0x6e,  0x0,  0x69,  0x76,  0x0,  0x69,  0x78,  0x0,  0x69,  0x300,  0x0,  0x69,  0x301,  0x0,  0x69,  0x302,  0x0,  0x69,  0x303,  0x0,  0x69,  0x304,  0x0,  0x69,  0x306,  0x0,  0x69,  0x308,  0x0,  0x69,  0x308,  0x301,  0x0,  0x69,  0x309,  0x0,  0x69,  0x30c,  0x0,  0x69,  0x30f,  0x0,  0x69,  0x311,  0x0,  0x69,  0x323,  0x0,  0x69,  0x328,  0x0,  0x69,  0x330,  0x0,  0x6a,  0x0,  0x6a,  0x302,  0x0,  0x6a,  0x30c,  0x0,  0x6b,  0x0,  0x6b,  0x41,  0x0,  0x6b,  0x48,  0x7a,  0x0,  0x6b,  0x50,  0x61,  0x0,  0x6b,  0x56,  0x0,  0x6b,  0x57,  0x0,  0x6b,  0x63,  0x61,  0x6c,  0x0,  0x6b,  0x67,  0x0,  0x6b,  0x6c,  0x0,  0x6b,  0x6d,  0x0,  0x6b,  0x6d,  0x32,  0x0,  0x6b,  0x6d,  0x33,  0x0,  0x6b,  0x74,  0x0,  0x6b,  0x301,  0x0,  0x6b,  0x30c,  0x0,  0x6b,  0x323,  0x0,  0x6b,  0x327,  0x0,  0x6b,  0x331,  0x0,  0x6b,  0x3a9,  0x0,  0x6c,  0x0,  0x6c,  0x6a,  0x0,  0x6c,  0x6d,  0x0,  0x6c,  0x6e,  0x0,  0x6c,  0x6f,  0x67,  0x0,  0x6c,  0x78,  0x0,  0x6c,  0xb7,  0x0,  0x6c,  0x301,  0x0,  0x6c,  0x30c,  0x0,  0x6c,  0x323,  0x0,  0x6c,  0x323,  0x304,  0x0,  0x6c,  0x327,  0x0,  0x6c,  0x32d,  0x0,  0x6c,  0x331,  0x0,  0x6d,  0x0,  0x6d,  0x32,  0x0,  0x6d,  0x33,  0x0,  0x6d,  0x41,  0x0,  0x6d,  0x56,  0x0,  0x6d,  0x57,  0x0,  0x6d,  0x62,  0x0,  0x6d,  0x67,  0x0,  0x6d,  0x69,  0x6c,  0x0,  0x6d,  0x6c,  0x0,  0x6d,  0x6d,  0x0,  0x6d,  0x6d,  0x32,  0x0,  0x6d,  0x6d,  0x33,  0x0,  0x6d,  0x6f,  0x6c,  0x0,  0x6d,  0x73,  0x0,  0x6d,  0x301,  0x0,  0x6d,  0x307,  0x0,  0x6d,  0x323,  0x0,  0x6d,  0x2215,  0x73,  0x0,  0x6d,  0x2215,  0x73,  0x32,  0x0,  0x6e,  0x0,  0x6e,  0x41,  0x0,  0x6e,  0x46,  0x0,  0x6e,  0x56,  0x0,  0x6e,  0x57,  0x0,  0x6e,  0x6a,  0x0,  0x6e,  0x6d,  0x0,  0x6e,  0x73,  0x0,  0x6e,  0x300,  0x0,  0x6e,  0x301,  0x0,  0x6e,  0x303,  0x0,  0x6e,  0x307,  0x0,  0x6e,  0x30c,  0x0,  0x6e,  0x323,  0x0,  0x6e,  0x327,  0x0,  0x6e,  0x32d,  0x0,  0x6e,  0x331,  0x0,  0x6f,  0x0,  0x6f,  0x56,  0x0,  0x6f,  0x300,  0x0,  0x6f,  0x301,  0x0,  0x6f,  0x302,  0x0,  0x6f,  0x302,  0x300,  0x0,  0x6f,  0x302,  0x301,  0x0,  0x6f,  0x302,  0x303,  0x0,  0x6f,  0x302,  0x309,  0x0,  0x6f,  0x303,  0x0,  0x6f,  0x303,  0x301,  0x0,  0x6f,  0x303,  0x304,  0x0,  0x6f,  0x303,  0x308,  0x0,  0x6f,  0x304,  0x0,  0x6f,  0x304,  0x300,  0x0,  0x6f,  0x304,  0x301,  0x0,  0x6f,  0x306,  0x0,  0x6f,  0x307,  0x0,  0x6f,  0x307,  0x304,  0x0,  0x6f,  0x308,  0x0,  0x6f,  0x308,  0x304,  0x0,  0x6f,  0x309,  0x0,  0x6f,  0x30b,  0x0,  0x6f,  0x30c,  0x0,  0x6f,  0x30f,  0x0,  0x6f,  0x311,  0x0,  0x6f,  0x31b,  0x0,  0x6f,  0x31b,  0x300,  0x0,  0x6f,  0x31b,  0x301,  0x0,  0x6f,  0x31b,  0x303,  0x0,  0x6f,  0x31b,  0x309,  0x0,  0x6f,  0x31b,  0x323,  0x0,  0x6f,  0x323,  0x0,  0x6f,  0x323,  0x302,  0x0,  0x6f,  0x328,  0x0,  0x6f,  0x328,  0x304,  0x0,  0x70,  0x0,  0x70,  0x2e,  0x6d,  0x2e,  0x0,  0x70,  0x41,  0x0,  0x70,  0x46,  0x0,  0x70,  0x56,  0x0,  0x70,  0x57,  0x0,  0x70,  0x63,  0x0,  0x70,  0x73,  0x0,  0x70,  0x301,  0x0,  0x70,  0x307,  0x0,  0x71,  0x0,  0x72,  0x0,  0x72,  0x61,  0x64,  0x0,  0x72,  0x61,  0x64,  0x2215,  0x73,  0x0,  0x72,  0x61,  0x64,  0x2215,  0x73,  0x32,  0x0,  0x72,  0x301,  0x0,  0x72,  0x307,  0x0,  0x72,  0x30c,  0x0,  0x72,  0x30f,  0x0,  0x72,  0x311,  0x0,  0x72,  0x323,  0x0,  0x72,  0x323,  0x304,  0x0,  0x72,  0x327,  0x0,  0x72,  0x331,  0x0,  0x73,  0x0,  0x73,  0x72,  0x0,  0x73,  0x74,  0x0,  0x73,  0x301,  0x0,  0x73,  0x301,  0x307,  0x0,  0x73,  0x302,  0x0,  0x73,  0x307,  0x0,  0x73,  0x30c,  0x0,  0x73,  0x30c,  0x307,  0x0,  0x73,  0x323,  0x0,  0x73,  0x323,  0x307,  0x0,  0x73,  0x326,  0x0,  0x73,  0x327,  0x0,  0x74,  0x0,  0x74,  0x307,  0x0,  0x74,  0x308,  0x0,  0x74,  0x30c,  0x0,  0x74,  0x323,  0x0,  0x74,  0x326,  0x0,  0x74,  0x327,  0x0,  0x74,  0x32d,  0x0,  0x74,  0x331,  0x0,  0x75,  0x0,  0x75,  0x300,  0x0,  0x75,  0x301,  0x0,  0x75,  0x302,  0x0,  0x75,  0x303,  0x0,  0x75,  0x303,  0x301,  0x0,  0x75,  0x304,  0x0,  0x75,  0x304,  0x308,  0x0,  0x75,  0x306,  0x0,  0x75,  0x308,  0x0,  0x75,  0x308,  0x300,  0x0,  0x75,  0x308,  0x301,  0x0,  0x75,  0x308,  0x304,  0x0,  0x75,  0x308,  0x30c,  0x0,  0x75,  0x309,  0x0,  0x75,  0x30a,  0x0,  0x75,  0x30b,  0x0,  0x75,  0x30c,  0x0,  0x75,  0x30f,  0x0,  0x75,  0x311,  0x0,  0x75,  0x31b,  0x0,  0x75,  0x31b,  0x300,  0x0,  0x75,  0x31b,  0x301,  0x0,  0x75,  0x31b,  0x303,  0x0,  0x75,  0x31b,  0x309,  0x0,  0x75,  0x31b,  0x323,  0x0,  0x75,  0x323,  0x0,  0x75,  0x324,  0x0,  0x75,  0x328,  0x0,  0x75,  0x32d,  0x0,  0x75,  0x330,  0x0,  0x76,  0x0,  0x76,  0x69,  0x0,  0x76,  0x69,  0x69,  0x0,  0x76,  0x69,  0x69,  0x69,  0x0,  0x76,  0x303,  0x0,  0x76,  0x323,  0x0,  0x77,  0x0,  0x77,  0x300,  0x0,  0x77,  0x301,  0x0,  0x77,  0x302,  0x0,  0x77,  0x307,  0x0,  0x77,  0x308,  0x0,  0x77,  0x30a,  0x0,  0x77,  0x323,  0x0,  0x78,  0x0,  0x78,  0x69,  0x0,  0x78,  0x69,  0x69,  0x0,  0x78,  0x307,  0x0,  0x78,  0x308,  0x0,  0x79,  0x0,  0x79,  0x300,  0x0,  0x79,  0x301,  0x0,  0x79,  0x302,  0x0,  0x79,  0x303,  0x0,  0x79,  0x304,  0x0,  0x79,  0x307,  0x0,  0x79,  0x308,  0x0,  0x79,  0x309,  0x0,  0x79,  0x30a,  0x0,  0x79,  0x323,  0x0,  0x7a,  0x0,  0x7a,  0x301,  0x0,  0x7a,  0x302,  0x0,  0x7a,  0x307,  0x0,  0x7a,  0x30c,  0x0,  0x7a,  0x323,  0x0,  0x7a,  0x331,  0x0,  0x7b,  0x0,  0x7c,  0x0,  0x7d,  0x0,  0x7e,  0x0,  0xa2,  0x0,  0xa3,  0x0,  0xa5,  0x0,  0xa6,  0x0,  0xac,  0x0,  0xb0,  0x43,  0x0,  0xb0,  0x46,  0x0,  0xb7,  0x0,  0xc6,  0x0,  0xc6,  0x301,  0x0,  0xc6,  0x304,  0x0,  0xd8,  0x301,  0x0,  0xe6,  0x301,  0x0,  0xe6,  0x304,  0x0,  0xf0,  0x0,  0xf8,  0x301,  0x0,  0x126,  0x0,  0x127,  0x0,  0x131,  0x0,  0x14b,  0x0,  0x153,  0x0,  0x18e,  0x0,  0x190,  0x0,  0x1ab,  0x0,  0x1b7,  0x30c,  0x0,  0x222,  0x0,  0x237,  0x0,  0x250,  0x0,  0x251,  0x0,  0x252,  0x0,  0x254,  0x0,  0x255,  0x0,  0x259,  0x0,  0x25b,  0x0,  0x25c,  0x0,  0x25f,  0x0,  0x261,  0x0,  0x263,  0x0,  0x265,  0x0,  0x266,  0x0,  0x268,  0x0,  0x269,  0x0,  0x26a,  0x0,  0x26d,  0x0,  0x26f,  0x0,  0x270,  0x0,  0x271,  0x0,  0x272,  0x0,  0x273,  0x0,  0x274,  0x0,  0x275,  0x0,  0x278,  0x0,  0x279,  0x0,  0x27b,  0x0,  0x281,  0x0,  0x282,  0x0,  0x283,  0x0,  0x289,  0x0,  0x28a,  0x0,  0x28b,  0x0,  0x28c,  0x0,  0x290,  0x0,  0x291,  0x0,  0x292,  0x0,  0x292,  0x30c,  0x0,  0x295,  0x0,  0x29d,  0x0,  0x29f,  0x0,  0x2b9,  0x0,  0x2bc,  0x6e,  0x0,  0x300,  0x0,  0x301,  0x0,  0x308,  0x301,  0x0,  0x313,  0x0,  0x391,  0x0,  0x391,  0x300,  0x0,  0x391,  0x301,  0x0,  0x391,  0x304,  0x0,  0x391,  0x306,  0x0,  0x391,  0x313,  0x0,  0x391,  0x313,  0x300,  0x0,  0x391,  0x313,  0x300,  0x345,  0x0,  0x391,  0x313,  0x301,  0x0,  0x391,  0x313,  0x301,  0x345,  0x0,  0x391,  0x313,  0x342,  0x0,  0x391,  0x313,  0x342,  0x345,  0x0,  0x391,  0x313,  0x345,  0x0,  0x391,  0x314,  0x0,  0x391,  0x314,  0x300,  0x0,  0x391,  0x314,  0x300,  0x345,  0x0,  0x391,  0x314,  0x301,  0x0,  0x391,  0x314,  0x301,  0x345,  0x0,  0x391,  0x314,  0x342,  0x0,  0x391,  0x314,  0x342,  0x345,  0x0,  0x391,  0x314,  0x345,  0x0,  0x391,  0x345,  0x0,  0x392,  0x0,  0x393,  0x0,  0x394,  0x0,  0x395,  0x0,  0x395,  0x300,  0x0,  0x395,  0x301,  0x0,  0x395,  0x313,  0x0,  0x395,  0x313,  0x300,  0x0,  0x395,  0x313,  0x301,  0x0,  0x395,  0x314,  0x0,  0x395,  0x314,  0x300,  0x0,  0x395,  0x314,  0x301,  0x0,  0x396,  0x0,  0x397,  0x0,  0x397,  0x300,  0x0,  0x397,  0x301,  0x0,  0x397,  0x313,  0x0,  0x397,  0x313,  0x300,  0x0,  0x397,  0x313,  0x300,  0x345,  0x0,  0x397,  0x313,  0x301,  0x0,  0x397,  0x313,  0x301,  0x345,  0x0,  0x397,  0x313,  0x342,  0x0,  0x397,  0x313,  0x342,  0x345,  0x0,  0x397,  0x313,  0x345,  0x0,  0x397,  0x314,  0x0,  0x397,  0x314,  0x300,  0x0,  0x397,  0x314,  0x300,  0x345,  0x0,  0x397,  0x314,  0x301,  0x0,  0x397,  0x314,  0x301,  0x345,  0x0,  0x397,  0x314,  0x342,  0x0,  0x397,  0x314,  0x342,  0x345,  0x0,  0x397,  0x314,  0x345,  0x0,  0x397,  0x345,  0x0,  0x398,  0x0,  0x399,  0x0,  0x399,  0x300,  0x0,  0x399,  0x301,  0x0,  0x399,  0x304,  0x0,  0x399,  0x306,  0x0,  0x399,  0x308,  0x0,  0x399,  0x313,  0x0,  0x399,  0x313,  0x300,  0x0,  0x399,  0x313,  0x301,  0x0,  0x399,  0x313,  0x342,  0x0,  0x399,  0x314,  0x0,  0x399,  0x314,  0x300,  0x0,  0x399,  0x314,  0x301,  0x0,  0x399,  0x314,  0x342,  0x0,  0x39a,  0x0,  0x39b,  0x0,  0x39c,  0x0,  0x39d,  0x0,  0x39e,  0x0,  0x39f,  0x0,  0x39f,  0x300,  0x0,  0x39f,  0x301,  0x0,  0x39f,  0x313,  0x0,  0x39f,  0x313,  0x300,  0x0,  0x39f,  0x313,  0x301,  0x0,  0x39f,  0x314,  0x0,  0x39f,  0x314,  0x300,  0x0,  0x39f,  0x314,  0x301,  0x0,  0x3a0,  0x0,  0x3a1,  0x0,  0x3a1,  0x314,  0x0,  0x3a3,  0x0,  0x3a4,  0x0,  0x3a5,  0x0,  0x3a5,  0x300,  0x0,  0x3a5,  0x301,  0x0,  0x3a5,  0x304,  0x0,  0x3a5,  0x306,  0x0,  0x3a5,  0x308,  0x0,  0x3a5,  0x314,  0x0,  0x3a5,  0x314,  0x300,  0x0,  0x3a5,  0x314,  0x301,  0x0,  0x3a5,  0x314,  0x342,  0x0,  0x3a6,  0x0,  0x3a7,  0x0,  0x3a8,  0x0,  0x3a9,  0x0,  0x3a9,  0x300,  0x0,  0x3a9,  0x301,  0x0,  0x3a9,  0x313,  0x0,  0x3a9,  0x313,  0x300,  0x0,  0x3a9,  0x313,  0x300,  0x345,  0x0,  0x3a9,  0x313,  0x301,  0x0,  0x3a9,  0x313,  0x301,  0x345,  0x0,  0x3a9,  0x313,  0x342,  0x0,  0x3a9,  0x313,  0x342,  0x345,  0x0,  0x3a9,  0x313,  0x345,  0x0,  0x3a9,  0x314,  0x0,  0x3a9,  0x314,  0x300,  0x0,  0x3a9,  0x314,  0x300,  0x345,  0x0,  0x3a9,  0x314,  0x301,  0x0,  0x3a9,  0x314,  0x301,  0x345,  0x0,  0x3a9,  0x314,  0x342,  0x0,  0x3a9,  0x314,  0x342,  0x345,  0x0,  0x3a9,  0x314,  0x345,  0x0,  0x3a9,  0x345,  0x0,  0x3b1,  0x0,  0x3b1,  0x300,  0x0,  0x3b1,  0x300,  0x345,  0x0,  0x3b1,  0x301,  0x0,  0x3b1,  0x301,  0x345,  0x0,  0x3b1,  0x304,  0x0,  0x3b1,  0x306,  0x0,  0x3b1,  0x313,  0x0,  0x3b1,  0x313,  0x300,  0x0,  0x3b1,  0x313,  0x300,  0x345,  0x0,  0x3b1,  0x313,  0x301,  0x0,  0x3b1,  0x313,  0x301,  0x345,  0x0,  0x3b1,  0x313,  0x342,  0x0,  0x3b1,  0x313,  0x342,  0x345,  0x0,  0x3b1,  0x313,  0x345,  0x0,  0x3b1,  0x314,  0x0,  0x3b1,  0x314,  0x300,  0x0,  0x3b1,  0x314,  0x300,  0x345,  0x0,  0x3b1,  0x314,  0x301,  0x0,  0x3b1,  0x314,  0x301,  0x345,  0x0,  0x3b1,  0x314,  0x342,  0x0,  0x3b1,  0x314,  0x342,  0x345,  0x0,  0x3b1,  0x314,  0x345,  0x0,  0x3b1,  0x342,  0x0,  0x3b1,  0x342,  0x345,  0x0,  0x3b1,  0x345,  0x0,  0x3b2,  0x0,  0x3b3,  0x0,  0x3b4,  0x0,  0x3b5,  0x0,  0x3b5,  0x300,  0x0,  0x3b5,  0x301,  0x0,  0x3b5,  0x313,  0x0,  0x3b5,  0x313,  0x300,  0x0,  0x3b5,  0x313,  0x301,  0x0,  0x3b5,  0x314,  0x0,  0x3b5,  0x314,  0x300,  0x0,  0x3b5,  0x314,  0x301,  0x0,  0x3b6,  0x0,  0x3b7,  0x0,  0x3b7,  0x300,  0x0,  0x3b7,  0x300,  0x345,  0x0,  0x3b7,  0x301,  0x0,  0x3b7,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x0,  0x3b7,  0x313,  0x300,  0x0,  0x3b7,  0x313,  0x300,  0x345,  0x0,  0x3b7,  0x313,  0x301,  0x0,  0x3b7,  0x313,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x342,  0x0,  0x3b7,  0x313,  0x342,  0x345,  0x0,  0x3b7,  0x313,  0x345,  0x0,  0x3b7,  0x314,  0x0,  0x3b7,  0x314,  0x300,  0x0,  0x3b7,  0x314,  0x300,  0x345,  0x0,  0x3b7,  0x314,  0x301,  0x0,  0x3b7,  0x314,  0x301,  0x345,  0x0,  0x3b7,  0x314,  0x342,  0x0,  0x3b7,  0x314,  0x342,  0x345,  0x0,  0x3b7,  0x314,  0x345,  0x0,  0x3b7,  0x342,  0x0,  0x3b7,  0x342,  0x345,  0x0,  0x3b7,  0x345,  0x0,  0x3b8,  0x0,  0x3b9,  0x0,  0x3b9,  0x300,  0x0,  0x3b9,  0x301,  0x0,  0x3b9,  0x304,  0x0,  0x3b9,  0x306,  0x0,  0x3b9,  0x308,  0x0,  0x3b9,  0x308,  0x300,  0x0,  0x3b9,  0x308,  0x301,  0x0,  0x3b9,  0x308,  0x342,  0x0,  0x3b9,  0x313,  0x0,  0x3b9,  0x313,  0x300,  0x0,  0x3b9,  0x313,  0x301,  0x0,  0x3b9,  0x313,  0x342,  0x0,  0x3b9,  0x314,  0x0,  0x3b9,  0x314,  0x300,  0x0,  0x3b9,  0x314,  0x301,  0x0,  0x3b9,  0x314,  0x342,  0x0,  0x3b9,  0x342,  0x0,  0x3ba,  0x0,  0x3bb,  0x0,  0x3bc,  0x0,  0x3bc,  0x41,  0x0,  0x3bc,  0x46,  0x0,  0x3bc,  0x56,  0x0,  0x3bc,  0x57,  0x0,  0x3bc,  0x67,  0x0,  0x3bc,  0x6c,  0x0,  0x3bc,  0x6d,  0x0,  0x3bc,  0x73,  0x0,  0x3bd,  0x0,  0x3be,  0x0,  0x3bf,  0x0,  0x3bf,  0x300,  0x0,  0x3bf,  0x301,  0x0,  0x3bf,  0x313,  0x0,  0x3bf,  0x313,  0x300,  0x0,  0x3bf,  0x313,  0x301,  0x0,  0x3bf,  0x314,  0x0,  0x3bf,  0x314,  0x300,  0x0,  0x3bf,  0x314,  0x301,  0x0,  0x3c0,  0x0,  0x3c1,  0x0,  0x3c1,  0x313,  0x0,  0x3c1,  0x314,  0x0,  0x3c2,  0x0,  0x3c3,  0x0,  0x3c4,  0x0,  0x3c5,  0x0,  0x3c5,  0x300,  0x0,  0x3c5,  0x301,  0x0,  0x3c5,  0x304,  0x0,  0x3c5,  0x306,  0x0,  0x3c5,  0x308,  0x0,  0x3c5,  0x308,  0x300,  0x0,  0x3c5,  0x308,  0x301,  0x0,  0x3c5,  0x308,  0x342,  0x0,  0x3c5,  0x313,  0x0,  0x3c5,  0x313,  0x300,  0x0,  0x3c5,  0x313,  0x301,  0x0,  0x3c5,  0x313,  0x342,  0x0,  0x3c5,  0x314,  0x0,  0x3c5,  0x314,  0x300,  0x0,  0x3c5,  0x314,  0x301,  0x0,  0x3c5,  0x314,  0x342,  0x0,  0x3c5,  0x342,  0x0,  0x3c6,  0x0,  0x3c7,  0x0,  0x3c8,  0x0,  0x3c9,  0x0,  0x3c9,  0x300,  0x0,  0x3c9,  0x300,  0x345,  0x0,  0x3c9,  0x301,  0x0,  0x3c9,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x0,  0x3c9,  0x313,  0x300,  0x0,  0x3c9,  0x313,  0x300,  0x345,  0x0,  0x3c9,  0x313,  0x301,  0x0,  0x3c9,  0x313,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x342,  0x0,  0x3c9,  0x313,  0x342,  0x345,  0x0,  0x3c9,  0x313,  0x345,  0x0,  0x3c9,  0x314,  0x0,  0x3c9,  0x314,  0x300,  0x0,  0x3c9,  0x314,  0x300,  0x345,  0x0,  0x3c9,  0x314,  0x301,  0x0,  0x3c9,  0x314,  0x301,  0x345,  0x0,  0x3c9,  0x314,  0x342,  0x0,  0x3c9,  0x314,  0x342,  0x345,  0x0,  0x3c9,  0x314,  0x345,  0x0,  0x3c9,  0x342,  0x0,  0x3c9,  0x342,  0x345,  0x0,  0x3c9,  0x345,  0x0,  0x3dc,  0x0,  0x3dd,  0x0,  0x406,  0x308,  0x0,  0x410,  0x306,  0x0,  0x410,  0x308,  0x0,  0x413,  0x301,  0x0,  0x415,  0x300,  0x0,  0x415,  0x306,  0x0,  0x415,  0x308,  0x0,  0x416,  0x306,  0x0,  0x416,  0x308,  0x0,  0x417,  0x308,  0x0,  0x418,  0x300,  0x0,  0x418,  0x304,  0x0,  0x418,  0x306,  0x0,  0x418,  0x308,  0x0,  0x41a,  0x301,  0x0,  0x41e,  0x308,  0x0,  0x423,  0x304,  0x0,  0x423,  0x306,  0x0,  0x423,  0x308,  0x0,  0x423,  0x30b,  0x0,  0x427,  0x308,  0x0,  0x42b,  0x308,  0x0,  0x42d,  0x308,  0x0,  0x430,  0x306,  0x0,  0x430,  0x308,  0x0,  0x433,  0x301,  0x0,  0x435,  0x300,  0x0,  0x435,  0x306,  0x0,  0x435,  0x308,  0x0,  0x436,  0x306,  0x0,  0x436,  0x308,  0x0,  0x437,  0x308,  0x0,  0x438,  0x300,  0x0,  0x438,  0x304,  0x0,  0x438,  0x306,  0x0,  0x438,  0x308,  0x0,  0x43a,  0x301,  0x0,  0x43d,  0x0,  0x43e,  0x308,  0x0,  0x443,  0x304,  0x0,  0x443,  0x306,  0x0,  0x443,  0x308,  0x0,  0x443,  0x30b,  0x0,  0x447,  0x308,  0x0,  0x44b,  0x308,  0x0,  0x44d,  0x308,  0x0,  0x456,  0x308,  0x0,  0x474,  0x30f,  0x0,  0x475,  0x30f,  0x0,  0x4d8,  0x308,  0x0,  0x4d9,  0x308,  0x0,  0x4e8,  0x308,  0x0,  0x4e9,  0x308,  0x0,  0x565,  0x582,  0x0,  0x574,  0x565,  0x0,  0x574,  0x56b,  0x0,  0x574,  0x56d,  0x0,  0x574,  0x576,  0x0,  0x57e,  0x576,  0x0,  0x5d0,  0x0,  0x5d0,  0x5b7,  0x0,  0x5d0,  0x5b8,  0x0,  0x5d0,  0x5bc,  0x0,  0x5d0,  0x5dc,  0x0,  0x5d1,  0x0,  0x5d1,  0x5bc,  0x0,  0x5d1,  0x5bf,  0x0,  0x5d2,  0x0,  0x5d2,  0x5bc,  0x0,  0x5d3,  0x0,  0x5d3,  0x5bc,  0x0,  0x5d4,  0x0,  0x5d4,  0x5bc,  0x0,  0x5d5,  0x5b9,  0x0,  0x5d5,  0x5bc,  0x0,  0x5d6,  0x5bc,  0x0,  0x5d8,  0x5bc,  0x0,  0x5d9,  0x5b4,  0x0,  0x5d9,  0x5bc,  0x0,  0x5da,  0x5bc,  0x0,  0x5db,  0x0,  0x5db,  0x5bc,  0x0,  0x5db,  0x5bf,  0x0,  0x5dc,  0x0,  0x5dc,  0x5bc,  0x0,  0x5dd,  0x0,  0x5de,  0x5bc,  0x0,  0x5e0,  0x5bc,  0x0,  0x5e1,  0x5bc,  0x0,  0x5e2,  0x0,  0x5e3,  0x5bc,  0x0,  0x5e4,  0x5bc,  0x0,  0x5e4,  0x5bf,  0x0,  0x5e6,  0x5bc,  0x0,  0x5e7,  0x5bc,  0x0,  0x5e8,  0x0,  0x5e8,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x5c1,  0x0,  0x5e9,  0x5bc,  0x5c2,  0x0,  0x5e9,  0x5c1,  0x0,  0x5e9,  0x5c2,  0x0,  0x5ea,  0x0,  0x5ea,  0x5bc,  0x0,  0x5f2,  0x5b7,  0x0,  0x621,  0x0,  0x627,  0x0,  0x627,  0x643,  0x628,  0x631,  0x0,  0x627,  0x644,  0x644,  0x647,  0x0,  0x627,  0x64b,  0x0,  0x627,  0x653,  0x0,  0x627,  0x654,  0x0,  0x627,  0x655,  0x0,  0x627,  0x674,  0x0,  0x628,  0x0,  0x628,  0x62c,  0x0,  0x628,  0x62d,  0x0,  0x628,  0x62d,  0x64a,  0x0,  0x628,  0x62e,  0x0,  0x628,  0x62e,  0x64a,  0x0,  0x628,  0x631,  0x0,  0x628,  0x632,  0x0,  0x628,  0x645,  0x0,  0x628,  0x646,  0x0,  0x628,  0x647,  0x0,  0x628,  0x649,  0x0,  0x628,  0x64a,  0x0,  0x629,  0x0,  0x62a,  0x0,  0x62a,  0x62c,  0x0,  0x62a,  0x62c,  0x645,  0x0,  0x62a,  0x62c,  0x649,  0x0,  0x62a,  0x62c,  0x64a,  0x0,  0x62a,  0x62d,  0x0,  0x62a,  0x62d,  0x62c,  0x0,  0x62a,  0x62d,  0x645,  0x0,  0x62a,  0x62e,  0x0,  0x62a,  0x62e,  0x645,  0x0,  0x62a,  0x62e,  0x649,  0x0,  0x62a,  0x62e,  0x64a,  0x0,  0x62a,  0x631,  0x0,  0x62a,  0x632,  0x0,  0x62a,  0x645,  0x0,  0x62a,  0x645,  0x62c,  0x0,  0x62a,  0x645,  0x62d,  0x0,  0x62a,  0x645,  0x62e,  0x0,  0x62a,  0x645,  0x649,  0x0,  0x62a,  0x645,  0x64a,  0x0,  0x62a,  0x646,  0x0,  0x62a,  0x647,  0x0,  0x62a,  0x649,  0x0,  0x62a,  0x64a,  0x0,  0x62b,  0x0,  0x62b,  0x62c,  0x0,  0x62b,  0x631,  0x0,  0x62b,  0x632,  0x0,  0x62b,  0x645,  0x0,  0x62b,  0x646,  0x0,  0x62b,  0x647,  0x0,  0x62b,  0x649,  0x0,  0x62b,  0x64a,  0x0,  0x62c,  0x0,  0x62c,  0x62d,  0x0,  0x62c,  0x62d,  0x649,  0x0,  0x62c,  0x62d,  0x64a,  0x0,  0x62c,  0x644,  0x20,  0x62c,  0x644,  0x627,  0x644,  0x647,  0x0,  0x62c,  0x645,  0x0,  0x62c,  0x645,  0x62d,  0x0,  0x62c,  0x645,  0x649,  0x0,  0x62c,  0x645,  0x64a,  0x0,  0x62c,  0x649,  0x0,  0x62c,  0x64a,  0x0,  0x62d,  0x0,  0x62d,  0x62c,  0x0,  0x62d,  0x62c,  0x64a,  0x0,  0x62d,  0x645,  0x0,  0x62d,  0x645,  0x649,  0x0,  0x62d,  0x645,  0x64a,  0x0,  0x62d,  0x649,  0x0,  0x62d,  0x64a,  0x0,  0x62e,  0x0,  0x62e,  0x62c,  0x0,  0x62e,  0x62d,  0x0,  0x62e,  0x645,  0x0,  0x62e,  0x649,  0x0,  0x62e,  0x64a,  0x0,  0x62f,  0x0,  0x630,  0x0,  0x630,  0x670,  0x0,  0x631,  0x0,  0x631,  0x633,  0x648,  0x644,  0x0,  0x631,  0x670,  0x0,  0x631,  0x6cc,  0x627,  0x644,  0x0,  0x632,  0x0,  0x633,  0x0,  0x633,  0x62c,  0x0,  0x633,  0x62c,  0x62d,  0x0,  0x633,  0x62c,  0x649,  0x0,  0x633,  0x62d,  0x0,  0x633,  0x62d,  0x62c,  0x0,  0x633,  0x62e,  0x0,  0x633,  0x62e,  0x649,  0x0,  0x633,  0x62e,  0x64a,  0x0,  0x633,  0x631,  0x0,  0x633,  0x645,  0x0,  0x633,  0x645,  0x62c,  0x0,  0x633,  0x645,  0x62d,  0x0,  0x633,  0x645,  0x645,  0x0,  0x633,  0x647,  0x0,  0x633,  0x649,  0x0,  0x633,  0x64a,  0x0,  0x634,  0x0,  0x634,  0x62c,  0x0,  0x634,  0x62c,  0x64a,  0x0,  0x634,  0x62d,  0x0,  0x634,  0x62d,  0x645,  0x0,  0x634,  0x62d,  0x64a,  0x0,  0x634,  0x62e,  0x0,  0x634,  0x631,  0x0,  0x634,  0x645,  0x0,  0x634,  0x645,  0x62e,  0x0,  0x634,  0x645,  0x645,  0x0,  0x634,  0x647,  0x0,  0x634,  0x649,  0x0,  0x634,  0x64a,  0x0,  0x635,  0x0,  0x635,  0x62d,  0x0,  0x635,  0x62d,  0x62d,  0x0,  0x635,  0x62d,  0x64a,  0x0,  0x635,  0x62e,  0x0,  0x635,  0x631,  0x0,  0x635,  0x644,  0x639,  0x645,  0x0,  0x635,  0x644,  0x649,  0x0,  0x635,  0x644,  0x649,  0x20,  0x627,  0x644,  0x644,  0x647,  0x20,  0x639,  0x644,  0x64a,  0x647,  0x20,  0x648,  0x633,  0x644,  0x645,  0x0,  0x635,  0x644,  0x6d2,  0x0,  0x635,  0x645,  0x0,  0x635,  0x645,  0x645,  0x0,  0x635,  0x649,  0x0,  0x635,  0x64a,  0x0,  0x636,  0x0,  0x636,  0x62c,  0x0,  0x636,  0x62d,  0x0,  0x636,  0x62d,  0x649,  0x0,  0x636,  0x62d,  0x64a,  0x0,  0x636,  0x62e,  0x0,  0x636,  0x62e,  0x645,  0x0,  0x636,  0x631,  0x0,  0x636,  0x645,  0x0,  0x636,  0x649,  0x0,  0x636,  0x64a,  0x0,  0x637,  0x0,  0x637,  0x62d,  0x0,  0x637,  0x645,  0x0,  0x637,  0x645,  0x62d,  0x0,  0x637,  0x645,  0x645,  0x0,  0x637,  0x645,  0x64a,  0x0,  0x637,  0x649,  0x0,  0x637,  0x64a,  0x0,  0x638,  0x0,  0x638,  0x645,  0x0,  0x639,  0x0,  0x639,  0x62c,  0x0,  0x639,  0x62c,  0x645,  0x0,  0x639,  0x644,  0x64a,  0x647,  0x0,  0x639,  0x645,  0x0,  0x639,  0x645,  0x645,  0x0,  0x639,  0x645,  0x649,  0x0,  0x639,  0x645,  0x64a,  0x0,  0x639,  0x649,  0x0,  0x639,  0x64a,  0x0,  0x63a,  0x0,  0x63a,  0x62c,  0x0,  0x63a,  0x645,  0x0,  0x63a,  0x645,  0x645,  0x0,  0x63a,  0x645,  0x649,  0x0,  0x63a,  0x645,  0x64a,  0x0,  0x63a,  0x649,  0x0,  0x63a,  0x64a,  0x0,  0x640,  0x64b,  0x0,  0x640,  0x64e,  0x0,  0x640,  0x64e,  0x651,  0x0,  0x640,  0x64f,  0x0,  0x640,  0x64f,  0x651,  0x0,  0x640,  0x650,  0x0,  0x640,  0x650,  0x651,  0x0,  0x640,  0x651,  0x0,  0x640,  0x652,  0x0,  0x641,  0x0,  0x641,  0x62c,  0x0,  0x641,  0x62d,  0x0,  0x641,  0x62e,  0x0,  0x641,  0x62e,  0x645,  0x0,  0x641,  0x645,  0x0,  0x641,  0x645,  0x64a,  0x0,  0x641,  0x649,  0x0,  0x641,  0x64a,  0x0,  0x642,  0x0,  0x642,  0x62d,  0x0,  0x642,  0x644,  0x6d2,  0x0,  0x642,  0x645,  0x0,  0x642,  0x645,  0x62d,  0x0,  0x642,  0x645,  0x645,  0x0,  0x642,  0x645,  0x64a,  0x0,  0x642,  0x649,  0x0,  0x642,  0x64a,  0x0,  0x643,  0x0,  0x643,  0x627,  0x0,  0x643,  0x62c,  0x0,  0x643,  0x62d,  0x0,  0x643,  0x62e,  0x0,  0x643,  0x644,  0x0,  0x643,  0x645,  0x0,  0x643,  0x645,  0x645,  0x0,  0x643,  0x645,  0x64a,  0x0,  0x643,  0x649,  0x0,  0x643,  0x64a,  0x0,  0x644,  0x0,  0x644,  0x627,  0x0,  0x644,  0x627,  0x653,  0x0,  0x644,  0x627,  0x654,  0x0,  0x644,  0x627,  0x655,  0x0,  0x644,  0x62c,  0x0,  0x644,  0x62c,  0x62c,  0x0,  0x644,  0x62c,  0x645,  0x0,  0x644,  0x62c,  0x64a,  0x0,  0x644,  0x62d,  0x0,  0x644,  0x62d,  0x645,  0x0,  0x644,  0x62d,  0x649,  0x0,  0x644,  0x62d,  0x64a,  0x0,  0x644,  0x62e,  0x0,  0x644,  0x62e,  0x645,  0x0,  0x644,  0x645,  0x0,  0x644,  0x645,  0x62d,  0x0,  0x644,  0x645,  0x64a,  0x0,  0x644,  0x647,  0x0,  0x644,  0x649,  0x0,  0x644,  0x64a,  0x0,  0x645,  0x0,  0x645,  0x627,  0x0,  0x645,  0x62c,  0x0,  0x645,  0x62c,  0x62d,  0x0,  0x645,  0x62c,  0x62e,  0x0,  0x645,  0x62c,  0x645,  0x0,  0x645,  0x62c,  0x64a,  0x0,  0x645,  0x62d,  0x0,  0x645,  0x62d,  0x62c,  0x0,  0x645,  0x62d,  0x645,  0x0,  0x645,  0x62d,  0x645,  0x62f,  0x0,  0x645,  0x62d,  0x64a,  0x0,  0x645,  0x62e,  0x0,  0x645,  0x62e,  0x62c,  0x0,  0x645,  0x62e,  0x645,  0x0,  0x645,  0x62e,  0x64a,  0x0,  0x645,  0x645,  0x0,  0x645,  0x645,  0x64a,  0x0,  0x645,  0x649,  0x0,  0x645,  0x64a,  0x0,  0x646,  0x0,  0x646,  0x62c,  0x0,  0x646,  0x62c,  0x62d,  0x0,  0x646,  0x62c,  0x645,  0x0,  0x646,  0x62c,  0x649,  0x0,  0x646,  0x62c,  0x64a,  0x0,  0x646,  0x62d,  0x0,  0x646,  0x62d,  0x645,  0x0,  0x646,  0x62d,  0x649,  0x0,  0x646,  0x62d,  0x64a,  0x0,  0x646,  0x62e,  0x0,  0x646,  0x631,  0x0,  0x646,  0x632,  0x0,  0x646,  0x645,  0x0,  0x646,  0x645,  0x649,  0x0,  0x646,  0x645,  0x64a,  0x0,  0x646,  0x646,  0x0,  0x646,  0x647,  0x0,  0x646,  0x649,  0x0,  0x646,  0x64a,  0x0,  0x647,  0x0,  0x647,  0x62c,  0x0,  0x647,  0x645,  0x0,  0x647,  0x645,  0x62c,  0x0,  0x647,  0x645,  0x645,  0x0,  0x647,  0x649,  0x0,  0x647,  0x64a,  0x0,  0x647,  0x670,  0x0,  0x648,  0x0,  0x648,  0x633,  0x644,  0x645,  0x0,  0x648,  0x654,  0x0,  0x648,  0x674,  0x0,  0x649,  0x0,  0x649,  0x670,  0x0,  0x64a,  0x0,  0x64a,  0x62c,  0x0,  0x64a,  0x62c,  0x64a,  0x0,  0x64a,  0x62d,  0x0,  0x64a,  0x62d,  0x64a,  0x0,  0x64a,  0x62e,  0x0,  0x64a,  0x631,  0x0,  0x64a,  0x632,  0x0,  0x64a,  0x645,  0x0,  0x64a,  0x645,  0x645,  0x0,  0x64a,  0x645,  0x64a,  0x0,  0x64a,  0x646,  0x0,  0x64a,  0x647,  0x0,  0x64a,  0x649,  0x0,  0x64a,  0x64a,  0x0,  0x64a,  0x654,  0x0,  0x64a,  0x654,  0x627,  0x0,  0x64a,  0x654,  0x62c,  0x0,  0x64a,  0x654,  0x62d,  0x0,  0x64a,  0x654,  0x62e,  0x0,  0x64a,  0x654,  0x631,  0x0,  0x64a,  0x654,  0x632,  0x0,  0x64a,  0x654,  0x645,  0x0,  0x64a,  0x654,  0x646,  0x0,  0x64a,  0x654,  0x647,  0x0,  0x64a,  0x654,  0x648,  0x0,  0x64a,  0x654,  0x649,  0x0,  0x64a,  0x654,  0x64a,  0x0,  0x64a,  0x654,  0x6c6,  0x0,  0x64a,  0x654,  0x6c7,  0x0,  0x64a,  0x654,  0x6c8,  0x0,  0x64a,  0x654,  0x6d0,  0x0,  0x64a,  0x654,  0x6d5,  0x0,  0x64a,  0x674,  0x0,  0x66e,  0x0,  0x66f,  0x0,  0x671,  0x0,  0x679,  0x0,  0x67a,  0x0,  0x67b,  0x0,  0x67e,  0x0,  0x67f,  0x0,  0x680,  0x0,  0x683,  0x0,  0x684,  0x0,  0x686,  0x0,  0x687,  0x0,  0x688,  0x0,  0x68c,  0x0,  0x68d,  0x0,  0x68e,  0x0,  0x691,  0x0,  0x698,  0x0,  0x6a1,  0x0,  0x6a4,  0x0,  0x6a6,  0x0,  0x6a9,  0x0,  0x6ad,  0x0,  0x6af,  0x0,  0x6b1,  0x0,  0x6b3,  0x0,  0x6ba,  0x0,  0x6bb,  0x0,  0x6be,  0x0,  0x6c1,  0x0,  0x6c1,  0x654,  0x0,  0x6c5,  0x0,  0x6c6,  0x0,  0x6c7,  0x0,  0x6c7,  0x674,  0x0,  0x6c8,  0x0,  0x6c9,  0x0,  0x6cb,  0x0,  0x6cc,  0x0,  0x6d0,  0x0,  0x6d2,  0x0,  0x6d2,  0x654,  0x0,  0x6d5,  0x654,  0x0,  0x915,  0x93c,  0x0,  0x916,  0x93c,  0x0,  0x917,  0x93c,  0x0,  0x91c,  0x93c,  0x0,  0x921,  0x93c,  0x0,  0x922,  0x93c,  0x0,  0x928,  0x93c,  0x0,  0x92b,  0x93c,  0x0,  0x92f,  0x93c,  0x0,  0x930,  0x93c,  0x0,  0x933,  0x93c,  0x0,  0x9a1,  0x9bc,  0x0,  0x9a2,  0x9bc,  0x0,  0x9af,  0x9bc,  0x0,  0x9c7,  0x9be,  0x0,  0x9c7,  0x9d7,  0x0,  0xa16,  0xa3c,  0x0,  0xa17,  0xa3c,  0x0,  0xa1c,  0xa3c,  0x0,  0xa2b,  0xa3c,  0x0,  0xa32,  0xa3c,  0x0,  0xa38,  0xa3c,  0x0,  0xb21,  0xb3c,  0x0,  0xb22,  0xb3c,  0x0,  0xb47,  0xb3e,  0x0,  0xb47,  0xb56,  0x0,  0xb47,  0xb57,  0x0,  0xb92,  0xbd7,  0x0,  0xbc6,  0xbbe,  0x0,  0xbc6,  0xbd7,  0x0,  0xbc7,  0xbbe,  0x0,  0xc46,  0xc56,  0x0,  0xcbf,  0xcd5,  0x0,  0xcc6,  0xcc2,  0x0,  0xcc6,  0xcc2,  0xcd5,  0x0,  0xcc6,  0xcd5,  0x0,  0xcc6,  0xcd6,  0x0,  0xd46,  0xd3e,  0x0,  0xd46,  0xd57,  0x0,  0xd47,  0xd3e,  0x0,  0xdd9,  0xdca,  0x0,  0xdd9,  0xdcf,  0x0,  0xdd9,  0xdcf,  0xdca,  0x0,  0xdd9,  0xddf,  0x0,  0xe4d,  0xe32,  0x0,  0xeab,  0xe99,  0x0,  0xeab,  0xea1,  0x0,  0xecd,  0xeb2,  0x0,  0xf0b,  0x0,  0xf40,  0xfb5,  0x0,  0xf42,  0xfb7,  0x0,  0xf4c,  0xfb7,  0x0,  0xf51,  0xfb7,  0x0,  0xf56,  0xfb7,  0x0,  0xf5b,  0xfb7,  0x0,  0xf71,  0xf72,  0x0,  0xf71,  0xf74,  0x0,  0xf71,  0xf80,  0x0,  0xf90,  0xfb5,  0x0,  0xf92,  0xfb7,  0x0,  0xf9c,  0xfb7,  0x0,  0xfa1,  0xfb7,  0x0,  0xfa6,  0xfb7,  0x0,  0xfab,  0xfb7,  0x0,  0xfb2,  0xf71,  0xf80,  0x0,  0xfb2,  0xf80,  0x0,  0xfb3,  0xf71,  0xf80,  0x0,  0xfb3,  0xf80,  0x0,  0x1025,  0x102e,  0x0,  0x10dc,  0x0,  0x1100,  0x0,  0x1100,  0x1161,  0x0,  0x1101,  0x0,  0x1102,  0x0,  0x1102,  0x1161,  0x0,  0x1103,  0x0,  0x1103,  0x1161,  0x0,  0x1104,  0x0,  0x1105,  0x0,  0x1105,  0x1161,  0x0,  0x1106,  0x0,  0x1106,  0x1161,  0x0,  0x1107,  0x0,  0x1107,  0x1161,  0x0,  0x1108,  0x0,  0x1109,  0x0,  0x1109,  0x1161,  0x0,  0x110a,  0x0,  0x110b,  0x0,  0x110b,  0x1161,  0x0,  0x110b,  0x116e,  0x0,  0x110c,  0x0,  0x110c,  0x1161,  0x0,  0x110c,  0x116e,  0x110b,  0x1174,  0x0,  0x110d,  0x0,  0x110e,  0x0,  0x110e,  0x1161,  0x0,  0x110e,  0x1161,  0x11b7,  0x1100,  0x1169,  0x0,  0x110f,  0x0,  0x110f,  0x1161,  0x0,  0x1110,  0x0,  0x1110,  0x1161,  0x0,  0x1111,  0x0,  0x1111,  0x1161,  0x0,  0x1112,  0x0,  0x1112,  0x1161,  0x0,  0x1114,  0x0,  0x1115,  0x0,  0x111a,  0x0,  0x111c,  0x0,  0x111d,  0x0,  0x111e,  0x0,  0x1120,  0x0,  0x1121,  0x0,  0x1122,  0x0,  0x1123,  0x0,  0x1127,  0x0,  0x1129,  0x0,  0x112b,  0x0,  0x112c,  0x0,  0x112d,  0x0,  0x112e,  0x0,  0x112f,  0x0,  0x1132,  0x0,  0x1136,  0x0,  0x1140,  0x0,  0x1147,  0x0,  0x114c,  0x0,  0x1157,  0x0,  0x1158,  0x0,  0x1159,  0x0,  0x1160,  0x0,  0x1161,  0x0,  0x1162,  0x0,  0x1163,  0x0,  0x1164,  0x0,  0x1165,  0x0,  0x1166,  0x0,  0x1167,  0x0,  0x1168,  0x0,  0x1169,  0x0,  0x116a,  0x0,  0x116b,  0x0,  0x116c,  0x0,  0x116d,  0x0,  0x116e,  0x0,  0x116f,  0x0,  0x1170,  0x0,  0x1171,  0x0,  0x1172,  0x0,  0x1173,  0x0,  0x1174,  0x0,  0x1175,  0x0,  0x1184,  0x0,  0x1185,  0x0,  0x1188,  0x0,  0x1191,  0x0,  0x1192,  0x0,  0x1194,  0x0,  0x119e,  0x0,  0x11a1,  0x0,  0x11aa,  0x0,  0x11ac,  0x0,  0x11ad,  0x0,  0x11b0,  0x0,  0x11b1,  0x0,  0x11b2,  0x0,  0x11b3,  0x0,  0x11b4,  0x0,  0x11b5,  0x0,  0x11c7,  0x0,  0x11c8,  0x0,  0x11cc,  0x0,  0x11ce,  0x0,  0x11d3,  0x0,  0x11d7,  0x0,  0x11d9,  0x0,  0x11dd,  0x0,  0x11df,  0x0,  0x11f1,  0x0,  0x11f2,  0x0,  0x1b05,  0x1b35,  0x0,  0x1b07,  0x1b35,  0x0,  0x1b09,  0x1b35,  0x0,  0x1b0b,  0x1b35,  0x0,  0x1b0d,  0x1b35,  0x0,  0x1b11,  0x1b35,  0x0,  0x1b3a,  0x1b35,  0x0,  0x1b3c,  0x1b35,  0x0,  0x1b3e,  0x1b35,  0x0,  0x1b3f,  0x1b35,  0x0,  0x1b42,  0x1b35,  0x0,  0x1d02,  0x0,  0x1d16,  0x0,  0x1d17,  0x0,  0x1d1c,  0x0,  0x1d1d,  0x0,  0x1d25,  0x0,  0x1d7b,  0x0,  0x1d85,  0x0,  0x2010,  0x0,  0x2013,  0x0,  0x2014,  0x0,  0x2032,  0x2032,  0x0,  0x2032,  0x2032,  0x2032,  0x0,  0x2032,  0x2032,  0x2032,  0x2032,  0x0,  0x2035,  0x2035,  0x0,  0x2035,  0x2035,  0x2035,  0x0,  0x20a9,  0x0,  0x2190,  0x0,  0x2190,  0x338,  0x0,  0x2191,  0x0,  0x2192,  0x0,  0x2192,  0x338,  0x0,  0x2193,  0x0,  0x2194,  0x338,  0x0,  0x21d0,  0x338,  0x0,  0x21d2,  0x338,  0x0,  0x21d4,  0x338,  0x0,  0x2202,  0x0,  0x2203,  0x338,  0x0,  0x2207,  0x0,  0x2208,  0x338,  0x0,  0x220b,  0x338,  0x0,  0x2211,  0x0,  0x2212,  0x0,  0x2223,  0x338,  0x0,  0x2225,  0x338,  0x0,  0x222b,  0x222b,  0x0,  0x222b,  0x222b,  0x222b,  0x0,  0x222b,  0x222b,  0x222b,  0x222b,  0x0,  0x222e,  0x222e,  0x0,  0x222e,  0x222e,  0x222e,  0x0,  0x223c,  0x338,  0x0,  0x2243,  0x338,  0x0,  0x2245,  0x338,  0x0,  0x2248,  0x338,  0x0,  0x224d,  0x338,  0x0,  0x2261,  0x338,  0x0,  0x2264,  0x338,  0x0,  0x2265,  0x338,  0x0,  0x2272,  0x338,  0x0,  0x2273,  0x338,  0x0,  0x2276,  0x338,  0x0,  0x2277,  0x338,  0x0,  0x227a,  0x338,  0x0,  0x227b,  0x338,  0x0,  0x227c,  0x338,  0x0,  0x227d,  0x338,  0x0,  0x2282,  0x338,  0x0,  0x2283,  0x338,  0x0,  0x2286,  0x338,  0x0,  0x2287,  0x338,  0x0,  0x2291,  0x338,  0x0,  0x2292,  0x338,  0x0,  0x22a2,  0x338,  0x0,  0x22a8,  0x338,  0x0,  0x22a9,  0x338,  0x0,  0x22ab,  0x338,  0x0,  0x22b2,  0x338,  0x0,  0x22b3,  0x338,  0x0,  0x22b4,  0x338,  0x0,  0x22b5,  0x338,  0x0,  0x2502,  0x0,  0x25a0,  0x0,  0x25cb,  0x0,  0x2985,  0x0,  0x2986,  0x0,  0x2add,  0x338,  0x0,  0x2d61,  0x0,  0x3001,  0x0,  0x3002,  0x0,  0x3008,  0x0,  0x3009,  0x0,  0x300a,  0x0,  0x300b,  0x0,  0x300c,  0x0,  0x300d,  0x0,  0x300e,  0x0,  0x300f,  0x0,  0x3010,  0x0,  0x3011,  0x0,  0x3012,  0x0,  0x3014,  0x0,  0x3014,  0x53,  0x3015,  0x0,  0x3014,  0x4e09,  0x3015,  0x0,  0x3014,  0x4e8c,  0x3015,  0x0,  0x3014,  0x52dd,  0x3015,  0x0,  0x3014,  0x5b89,  0x3015,  0x0,  0x3014,  0x6253,  0x3015,  0x0,  0x3014,  0x6557,  0x3015,  0x0,  0x3014,  0x672c,  0x3015,  0x0,  0x3014,  0x70b9,  0x3015,  0x0,  0x3014,  0x76d7,  0x3015,  0x0,  0x3015,  0x0,  0x3016,  0x0,  0x3017,  0x0,  0x3046,  0x3099,  0x0,  0x304b,  0x3099,  0x0,  0x304d,  0x3099,  0x0,  0x304f,  0x3099,  0x0,  0x3051,  0x3099,  0x0,  0x3053,  0x3099,  0x0,  0x3055,  0x3099,  0x0,  0x3057,  0x3099,  0x0,  0x3059,  0x3099,  0x0,  0x305b,  0x3099,  0x0,  0x305d,  0x3099,  0x0,  0x305f,  0x3099,  0x0,  0x3061,  0x3099,  0x0,  0x3064,  0x3099,  0x0,  0x3066,  0x3099,  0x0,  0x3068,  0x3099,  0x0,  0x306f,  0x3099,  0x0,  0x306f,  0x309a,  0x0,  0x3072,  0x3099,  0x0,  0x3072,  0x309a,  0x0,  0x3075,  0x3099,  0x0,  0x3075,  0x309a,  0x0,  0x3078,  0x3099,  0x0,  0x3078,  0x309a,  0x0,  0x307b,  0x304b,  0x0,  0x307b,  0x3099,  0x0,  0x307b,  0x309a,  0x0,  0x3088,  0x308a,  0x0,  0x3099,  0x0,  0x309a,  0x0,  0x309d,  0x3099,  0x0,  0x30a1,  0x0,  0x30a2,  0x0,  0x30a2,  0x30cf,  0x309a,  0x30fc,  0x30c8,  0x0,  0x30a2,  0x30eb,  0x30d5,  0x30a1,  0x0,  0x30a2,  0x30f3,  0x30d8,  0x309a,  0x30a2,  0x0,  0x30a2,  0x30fc,  0x30eb,  0x0,  0x30a3,  0x0,  0x30a4,  0x0,  0x30a4,  0x30cb,  0x30f3,  0x30af,  0x3099,  0x0,  0x30a4,  0x30f3,  0x30c1,  0x0,  0x30a5,  0x0,  0x30a6,  0x0,  0x30a6,  0x3099,  0x0,  0x30a6,  0x30a9,  0x30f3,  0x0,  0x30a7,  0x0,  0x30a8,  0x0,  0x30a8,  0x30b9,  0x30af,  0x30fc,  0x30c8,  0x3099,  0x0,  0x30a8,  0x30fc,  0x30ab,  0x30fc,  0x0,  0x30a9,  0x0,  0x30aa,  0x0,  0x30aa,  0x30f3,  0x30b9,  0x0,  0x30aa,  0x30fc,  0x30e0,  0x0,  0x30ab,  0x0,  0x30ab,  0x3099,  0x0,  0x30ab,  0x3099,  0x30ed,  0x30f3,  0x0,  0x30ab,  0x3099,  0x30f3,  0x30de,  0x0,  0x30ab,  0x30a4,  0x30ea,  0x0,  0x30ab,  0x30e9,  0x30c3,  0x30c8,  0x0,  0x30ab,  0x30ed,  0x30ea,  0x30fc,  0x0,  0x30ad,  0x0,  0x30ad,  0x3099,  0x0,  0x30ad,  0x3099,  0x30ab,  0x3099,  0x0,  0x30ad,  0x3099,  0x30cb,  0x30fc,  0x0,  0x30ad,  0x3099,  0x30eb,  0x30bf,  0x3099,  0x30fc,  0x0,  0x30ad,  0x30e5,  0x30ea,  0x30fc,  0x0,  0x30ad,  0x30ed,  0x0,  0x30ad,  0x30ed,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x0,  0x30ad,  0x30ed,  0x30e1,  0x30fc,  0x30c8,  0x30eb,  0x0,  0x30ad,  0x30ed,  0x30ef,  0x30c3,  0x30c8,  0x0,  0x30af,  0x0,  0x30af,  0x3099,  0x0,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x0,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x30c8,  0x30f3,  0x0,  0x30af,  0x30eb,  0x30bb,  0x3099,  0x30a4,  0x30ed,  0x0,  0x30af,  0x30ed,  0x30fc,  0x30cd,  0x0,  0x30b1,  0x0,  0x30b1,  0x3099,  0x0,  0x30b1,  0x30fc,  0x30b9,  0x0,  0x30b3,  0x0,  0x30b3,  0x3099,  0x0,  0x30b3,  0x30b3,  0x0,  0x30b3,  0x30c8,  0x0,  0x30b3,  0x30eb,  0x30ca,  0x0,  0x30b3,  0x30fc,  0x30db,  0x309a,  0x0,  0x30b5,  0x0,  0x30b5,  0x3099,  0x0,  0x30b5,  0x30a4,  0x30af,  0x30eb,  0x0,  0x30b5,  0x30f3,  0x30c1,  0x30fc,  0x30e0,  0x0,  0x30b7,  0x0,  0x30b7,  0x3099,  0x0,  0x30b7,  0x30ea,  0x30f3,  0x30af,  0x3099,  0x0,  0x30b9,  0x0,  0x30b9,  0x3099,  0x0,  0x30bb,  0x0,  0x30bb,  0x3099,  0x0,  0x30bb,  0x30f3,  0x30c1,  0x0,  0x30bb,  0x30f3,  0x30c8,  0x0,  0x30bd,  0x0,  0x30bd,  0x3099,  0x0,  0x30bf,  0x0,  0x30bf,  0x3099,  0x0,  0x30bf,  0x3099,  0x30fc,  0x30b9,  0x0,  0x30c1,  0x0,  0x30c1,  0x3099,  0x0,  0x30c3,  0x0,  0x30c4,  0x0,  0x30c4,  0x3099,  0x0,  0x30c6,  0x0,  0x30c6,  0x3099,  0x0,  0x30c6,  0x3099,  0x30b7,  0x0,  0x30c8,  0x0,  0x30c8,  0x3099,  0x0,  0x30c8,  0x3099,  0x30eb,  0x0,  0x30c8,  0x30f3,  0x0,  0x30ca,  0x0,  0x30ca,  0x30ce,  0x0,  0x30cb,  0x0,  0x30cc,  0x0,  0x30cd,  0x0,  0x30ce,  0x0,  0x30ce,  0x30c3,  0x30c8,  0x0,  0x30cf,  0x0,  0x30cf,  0x3099,  0x0,  0x30cf,  0x3099,  0x30fc,  0x30ec,  0x30eb,  0x0,  0x30cf,  0x309a,  0x0,  0x30cf,  0x309a,  0x30fc,  0x30bb,  0x30f3,  0x30c8,  0x0,  0x30cf,  0x309a,  0x30fc,  0x30c4,  0x0,  0x30cf,  0x30a4,  0x30c4,  0x0,  0x30d2,  0x0,  0x30d2,  0x3099,  0x0,  0x30d2,  0x3099,  0x30eb,  0x0,  0x30d2,  0x309a,  0x0,  0x30d2,  0x309a,  0x30a2,  0x30b9,  0x30c8,  0x30eb,  0x0,  0x30d2,  0x309a,  0x30af,  0x30eb,  0x0,  0x30d2,  0x309a,  0x30b3,  0x0,  0x30d5,  0x0,  0x30d5,  0x3099,  0x0,  0x30d5,  0x3099,  0x30c3,  0x30b7,  0x30a7,  0x30eb,  0x0,  0x30d5,  0x309a,  0x0,  0x30d5,  0x30a1,  0x30e9,  0x30c3,  0x30c8,  0x3099,  0x0,  0x30d5,  0x30a3,  0x30fc,  0x30c8,  0x0,  0x30d5,  0x30e9,  0x30f3,  0x0,  0x30d8,  0x0,  0x30d8,  0x3099,  0x0,  0x30d8,  0x3099,  0x30fc,  0x30bf,  0x0,  0x30d8,  0x309a,  0x0,  0x30d8,  0x309a,  0x30bd,  0x0,  0x30d8,  0x309a,  0x30cb,  0x30d2,  0x0,  0x30d8,  0x309a,  0x30f3,  0x30b9,  0x0,  0x30d8,  0x309a,  0x30fc,  0x30b7,  0x3099,  0x0,  0x30d8,  0x30af,  0x30bf,  0x30fc,  0x30eb,  0x0,  0x30d8,  0x30eb,  0x30c4,  0x0,  0x30db,  0x0,  0x30db,  0x3099,  0x0,  0x30db,  0x3099,  0x30eb,  0x30c8,  0x0,  0x30db,  0x309a,  0x0,  0x30db,  0x309a,  0x30a4,  0x30f3,  0x30c8,  0x0,  0x30db,  0x309a,  0x30f3,  0x30c8,  0x3099,  0x0,  0x30db,  0x30f3,  0x0,  0x30db,  0x30fc,  0x30eb,  0x0,  0x30db,  0x30fc,  0x30f3,  0x0,  0x30de,  0x0,  0x30de,  0x30a4,  0x30af,  0x30ed,  0x0,  0x30de,  0x30a4,  0x30eb,  0x0,  0x30de,  0x30c3,  0x30cf,  0x0,  0x30de,  0x30eb,  0x30af,  0x0,  0x30de,  0x30f3,  0x30b7,  0x30e7,  0x30f3,  0x0,  0x30df,  0x0,  0x30df,  0x30af,  0x30ed,  0x30f3,  0x0,  0x30df,  0x30ea,  0x0,  0x30df,  0x30ea,  0x30cf,  0x3099,  0x30fc,  0x30eb,  0x0,  0x30e0,  0x0,  0x30e1,  0x0,  0x30e1,  0x30ab,  0x3099,  0x0,  0x30e1,  0x30ab,  0x3099,  0x30c8,  0x30f3,  0x0,  0x30e1,  0x30fc,  0x30c8,  0x30eb,  0x0,  0x30e2,  0x0,  0x30e3,  0x0,  0x30e4,  0x0,  0x30e4,  0x30fc,  0x30c8,  0x3099,  0x0,  0x30e4,  0x30fc,  0x30eb,  0x0,  0x30e5,  0x0,  0x30e6,  0x0,  0x30e6,  0x30a2,  0x30f3,  0x0,  0x30e7,  0x0,  0x30e8,  0x0,  0x30e9,  0x0,  0x30ea,  0x0,  0x30ea,  0x30c3,  0x30c8,  0x30eb,  0x0,  0x30ea,  0x30e9,  0x0,  0x30eb,  0x0,  0x30eb,  0x30d2,  0x309a,  0x30fc,  0x0,  0x30eb,  0x30fc,  0x30d5,  0x3099,  0x30eb,  0x0,  0x30ec,  0x0,  0x30ec,  0x30e0,  0x0,  0x30ec,  0x30f3,  0x30c8,  0x30b1,  0x3099,  0x30f3,  0x0,  0x30ed,  0x0,  0x30ef,  0x0,  0x30ef,  0x3099,  0x0,  0x30ef,  0x30c3,  0x30c8,  0x0,  0x30f0,  0x0,  0x30f0,  0x3099,  0x0,  0x30f1,  0x0,  0x30f1,  0x3099,  0x0,  0x30f2,  0x0,  0x30f2,  0x3099,  0x0,  0x30f3,  0x0,  0x30fb,  0x0,  0x30fc,  0x0,  0x30fd,  0x3099,  0x0,  0x349e,  0x0,  0x34b9,  0x0,  0x34bb,  0x0,  0x34df,  0x0,  0x3515,  0x0,  0x36ee,  0x0,  0x36fc,  0x0,  0x3781,  0x0,  0x382f,  0x0,  0x3862,  0x0,  0x387c,  0x0,  0x38c7,  0x0,  0x38e3,  0x0,  0x391c,  0x0,  0x393a,  0x0,  0x3a2e,  0x0,  0x3a6c,  0x0,  0x3ae4,  0x0,  0x3b08,  0x0,  0x3b19,  0x0,  0x3b49,  0x0,  0x3b9d,  0x0,  0x3c18,  0x0,  0x3c4e,  0x0,  0x3d33,  0x0,  0x3d96,  0x0,  0x3eac,  0x0,  0x3eb8,  0x0,  0x3f1b,  0x0,  0x3ffc,  0x0,  0x4008,  0x0,  0x4018,  0x0,  0x4039,  0x0,  0x4046,  0x0,  0x4096,  0x0,  0x40e3,  0x0,  0x412f,  0x0,  0x4202,  0x0,  0x4227,  0x0,  0x42a0,  0x0,  0x4301,  0x0,  0x4334,  0x0,  0x4359,  0x0,  0x43d5,  0x0,  0x43d9,  0x0,  0x440b,  0x0,  0x446b,  0x0,  0x452b,  0x0,  0x455d,  0x0,  0x4561,  0x0,  0x456b,  0x0,  0x45d7,  0x0,  0x45f9,  0x0,  0x4635,  0x0,  0x46be,  0x0,  0x46c7,  0x0,  0x4995,  0x0,  0x49e6,  0x0,  0x4a6e,  0x0,  0x4a76,  0x0,  0x4ab2,  0x0,  0x4b33,  0x0,  0x4bce,  0x0,  0x4cce,  0x0,  0x4ced,  0x0,  0x4cf8,  0x0,  0x4d56,  0x0,  0x4e00,  0x0,  0x4e01,  0x0,  0x4e03,  0x0,  0x4e09,  0x0,  0x4e0a,  0x0,  0x4e0b,  0x0,  0x4e0d,  0x0,  0x4e19,  0x0,  0x4e26,  0x0,  0x4e28,  0x0,  0x4e2d,  0x0,  0x4e32,  0x0,  0x4e36,  0x0,  0x4e38,  0x0,  0x4e39,  0x0,  0x4e3d,  0x0,  0x4e3f,  0x0,  0x4e41,  0x0,  0x4e59,  0x0,  0x4e5d,  0x0,  0x4e82,  0x0,  0x4e85,  0x0,  0x4e86,  0x0,  0x4e8c,  0x0,  0x4e94,  0x0,  0x4ea0,  0x0,  0x4ea4,  0x0,  0x4eae,  0x0,  0x4eba,  0x0,  0x4ec0,  0x0,  0x4ecc,  0x0,  0x4ee4,  0x0,  0x4f01,  0x0,  0x4f11,  0x0,  0x4f60,  0x0,  0x4f80,  0x0,  0x4f86,  0x0,  0x4f8b,  0x0,  0x4fae,  0x0,  0x4fbb,  0x0,  0x4fbf,  0x0,  0x5002,  0x0,  0x502b,  0x0,  0x507a,  0x0,  0x5099,  0x0,  0x50cf,  0x0,  0x50da,  0x0,  0x50e7,  0x0,  0x512a,  0x0,  0x513f,  0x0,  0x5140,  0x0,  0x5145,  0x0,  0x514d,  0x0,  0x5154,  0x0,  0x5164,  0x0,  0x5165,  0x0,  0x5167,  0x0,  0x5168,  0x0,  0x5169,  0x0,  0x516b,  0x0,  0x516d,  0x0,  0x5177,  0x0,  0x5180,  0x0,  0x5182,  0x0,  0x518d,  0x0,  0x5192,  0x0,  0x5195,  0x0,  0x5196,  0x0,  0x5197,  0x0,  0x5199,  0x0,  0x51a4,  0x0,  0x51ab,  0x0,  0x51ac,  0x0,  0x51b5,  0x0,  0x51b7,  0x0,  0x51c9,  0x0,  0x51cc,  0x0,  0x51dc,  0x0,  0x51de,  0x0,  0x51e0,  0x0,  0x51f5,  0x0,  0x5200,  0x0,  0x5203,  0x0,  0x5207,  0x0,  0x5217,  0x0,  0x521d,  0x0,  0x5229,  0x0,  0x523a,  0x0,  0x523b,  0x0,  0x5246,  0x0,  0x524d,  0x0,  0x5272,  0x0,  0x5277,  0x0,  0x5289,  0x0,  0x529b,  0x0,  0x52a3,  0x0,  0x52b3,  0x0,  0x52b4,  0x0,  0x52c7,  0x0,  0x52c9,  0x0,  0x52d2,  0x0,  0x52de,  0x0,  0x52e4,  0x0,  0x52f5,  0x0,  0x52f9,  0x0,  0x52fa,  0x0,  0x5305,  0x0,  0x5306,  0x0,  0x5315,  0x0,  0x5317,  0x0,  0x531a,  0x0,  0x5338,  0x0,  0x533b,  0x0,  0x533f,  0x0,  0x5341,  0x0,  0x5344,  0x0,  0x5345,  0x0,  0x5349,  0x0,  0x5351,  0x0,  0x5354,  0x0,  0x535a,  0x0,  0x535c,  0x0,  0x5369,  0x0,  0x5370,  0x0,  0x5373,  0x0,  0x5375,  0x0,  0x537d,  0x0,  0x537f,  0x0,  0x5382,  0x0,  0x53b6,  0x0,  0x53c3,  0x0,  0x53c8,  0x0,  0x53ca,  0x0,  0x53cc,  0x0,  0x53df,  0x0,  0x53e3,  0x0,  0x53e5,  0x0,  0x53eb,  0x0,  0x53ef,  0x0,  0x53f1,  0x0,  0x53f3,  0x0,  0x5406,  0x0,  0x5408,  0x0,  0x540d,  0x0,  0x540f,  0x0,  0x541d,  0x0,  0x5438,  0x0,  0x5439,  0x0,  0x5442,  0x0,  0x5448,  0x0,  0x5468,  0x0,  0x549e,  0x0,  0x54a2,  0x0,  0x54bd,  0x0,  0x54f6,  0x0,  0x5510,  0x0,  0x554f,  0x0,  0x5553,  0x0,  0x5555,  0x0,  0x5563,  0x0,  0x5584,  0x0,  0x5587,  0x0,  0x5599,  0x0,  0x559d,  0x0,  0x55ab,  0x0,  0x55b3,  0x0,  0x55b6,  0x0,  0x55c0,  0x0,  0x55c2,  0x0,  0x55e2,  0x0,  0x5606,  0x0,  0x5651,  0x0,  0x5668,  0x0,  0x5674,  0x0,  0x56d7,  0x0,  0x56db,  0x0,  0x56f9,  0x0,  0x5716,  0x0,  0x5717,  0x0,  0x571f,  0x0,  0x5730,  0x0,  0x578b,  0x0,  0x57ce,  0x0,  0x57f4,  0x0,  0x580d,  0x0,  0x5831,  0x0,  0x5832,  0x0,  0x5840,  0x0,  0x585a,  0x0,  0x585e,  0x0,  0x58a8,  0x0,  0x58ac,  0x0,  0x58b3,  0x0,  0x58d8,  0x0,  0x58df,  0x0,  0x58eb,  0x0,  0x58ee,  0x0,  0x58f0,  0x0,  0x58f2,  0x0,  0x58f7,  0x0,  0x5902,  0x0,  0x5906,  0x0,  0x590a,  0x0,  0x5915,  0x0,  0x591a,  0x0,  0x591c,  0x0,  0x5922,  0x0,  0x5927,  0x0,  0x5927,  0x6b63,  0x0,  0x5929,  0x0,  0x5944,  0x0,  0x5948,  0x0,  0x5951,  0x0,  0x5954,  0x0,  0x5962,  0x0,  0x5973,  0x0,  0x59d8,  0x0,  0x59ec,  0x0,  0x5a1b,  0x0,  0x5a27,  0x0,  0x5a62,  0x0,  0x5a66,  0x0,  0x5ab5,  0x0,  0x5b08,  0x0,  0x5b28,  0x0,  0x5b3e,  0x0,  0x5b50,  0x0,  0x5b57,  0x0,  0x5b66,  0x0,  0x5b80,  0x0,  0x5b85,  0x0,  0x5b97,  0x0,  0x5bc3,  0x0,  0x5bd8,  0x0,  0x5be7,  0x0,  0x5bee,  0x0,  0x5bf3,  0x0,  0x5bf8,  0x0,  0x5bff,  0x0,  0x5c06,  0x0,  0x5c0f,  0x0,  0x5c22,  0x0,  0x5c38,  0x0,  0x5c3f,  0x0,  0x5c60,  0x0,  0x5c62,  0x0,  0x5c64,  0x0,  0x5c65,  0x0,  0x5c6e,  0x0,  0x5c71,  0x0,  0x5c8d,  0x0,  0x5cc0,  0x0,  0x5d19,  0x0,  0x5d43,  0x0,  0x5d50,  0x0,  0x5d6b,  0x0,  0x5d6e,  0x0,  0x5d7c,  0x0,  0x5db2,  0x0,  0x5dba,  0x0,  0x5ddb,  0x0,  0x5de1,  0x0,  0x5de2,  0x0,  0x5de5,  0x0,  0x5de6,  0x0,  0x5df1,  0x0,  0x5dfd,  0x0,  0x5dfe,  0x0,  0x5e28,  0x0,  0x5e3d,  0x0,  0x5e69,  0x0,  0x5e72,  0x0,  0x5e73,  0x6210,  0x0,  0x5e74,  0x0,  0x5e7a,  0x0,  0x5e7c,  0x0,  0x5e7f,  0x0,  0x5ea6,  0x0,  0x5eb0,  0x0,  0x5eb3,  0x0,  0x5eb6,  0x0,  0x5ec9,  0x0,  0x5eca,  0x0,  0x5ed2,  0x0,  0x5ed3,  0x0,  0x5ed9,  0x0,  0x5eec,  0x0,  0x5ef4,  0x0,  0x5efe,  0x0,  0x5f04,  0x0,  0x5f0b,  0x0,  0x5f13,  0x0,  0x5f22,  0x0,  0x5f50,  0x0,  0x5f53,  0x0,  0x5f61,  0x0,  0x5f62,  0x0,  0x5f69,  0x0,  0x5f6b,  0x0,  0x5f73,  0x0,  0x5f8b,  0x0,  0x5f8c,  0x0,  0x5f97,  0x0,  0x5f9a,  0x0,  0x5fa9,  0x0,  0x5fad,  0x0,  0x5fc3,  0x0,  0x5fcd,  0x0,  0x5fd7,  0x0,  0x5ff5,  0x0,  0x5ff9,  0x0,  0x6012,  0x0,  0x601c,  0x0,  0x6075,  0x0,  0x6081,  0x0,  0x6094,  0x0,  0x60c7,  0x0,  0x60d8,  0x0,  0x60e1,  0x0,  0x6108,  0x0,  0x6144,  0x0,  0x6148,  0x0,  0x614c,  0x0,  0x614e,  0x0,  0x6160,  0x0,  0x6168,  0x0,  0x617a,  0x0,  0x618e,  0x0,  0x6190,  0x0,  0x61a4,  0x0,  0x61af,  0x0,  0x61b2,  0x0,  0x61de,  0x0,  0x61f2,  0x0,  0x61f6,  0x0,  0x6200,  0x0,  0x6208,  0x0,  0x6210,  0x0,  0x621b,  0x0,  0x622e,  0x0,  0x6234,  0x0,  0x6236,  0x0,  0x624b,  0x0,  0x6253,  0x0,  0x625d,  0x0,  0x6295,  0x0,  0x62b1,  0x0,  0x62c9,  0x0,  0x62cf,  0x0,  0x62d3,  0x0,  0x62d4,  0x0,  0x62fc,  0x0,  0x62fe,  0x0,  0x6307,  0x0,  0x633d,  0x0,  0x6350,  0x0,  0x6355,  0x0,  0x6368,  0x0,  0x637b,  0x0,  0x6383,  0x0,  0x63a0,  0x0,  0x63a9,  0x0,  0x63c4,  0x0,  0x63c5,  0x0,  0x63e4,  0x0,  0x641c,  0x0,  0x6422,  0x0,  0x6452,  0x0,  0x6469,  0x0,  0x6477,  0x0,  0x647e,  0x0,  0x649a,  0x0,  0x649d,  0x0,  0x64c4,  0x0,  0x652f,  0x0,  0x6534,  0x0,  0x654f,  0x0,  0x6556,  0x0,  0x656c,  0x0,  0x6578,  0x0,  0x6587,  0x0,  0x6597,  0x0,  0x6599,  0x0,  0x65a4,  0x0,  0x65b0,  0x0,  0x65b9,  0x0,  0x65c5,  0x0,  0x65e0,  0x0,  0x65e2,  0x0,  0x65e3,  0x0,  0x65e5,  0x0,  0x660e,  0x6cbb,  0x0,  0x6613,  0x0,  0x6620,  0x0,  0x662d,  0x548c,  0x0,  0x6649,  0x0,  0x6674,  0x0,  0x6688,  0x0,  0x6691,  0x0,  0x669c,  0x0,  0x66b4,  0x0,  0x66c6,  0x0,  0x66f0,  0x0,  0x66f4,  0x0,  0x66f8,  0x0,  0x6700,  0x0,  0x6708,  0x0,  0x6709,  0x0,  0x6717,  0x0,  0x671b,  0x0,  0x6721,  0x0,  0x6728,  0x0,  0x674e,  0x0,  0x6753,  0x0,  0x6756,  0x0,  0x675e,  0x0,  0x677b,  0x0,  0x6785,  0x0,  0x6797,  0x0,  0x67f3,  0x0,  0x67fa,  0x0,  0x6817,  0x0,  0x681f,  0x0,  0x682a,  0x0,  0x682a,  0x5f0f,  0x4f1a,  0x793e,  0x0,  0x6852,  0x0,  0x6881,  0x0,  0x6885,  0x0,  0x688e,  0x0,  0x68a8,  0x0,  0x6914,  0x0,  0x6942,  0x0,  0x69a3,  0x0,  0x69ea,  0x0,  0x6a02,  0x0,  0x6a13,  0x0,  0x6aa8,  0x0,  0x6ad3,  0x0,  0x6adb,  0x0,  0x6b04,  0x0,  0x6b20,  0x0,  0x6b21,  0x0,  0x6b54,  0x0,  0x6b62,  0x0,  0x6b63,  0x0,  0x6b72,  0x0,  0x6b77,  0x0,  0x6b79,  0x0,  0x6b9f,  0x0,  0x6bae,  0x0,  0x6bb3,  0x0,  0x6bba,  0x0,  0x6bbb,  0x0,  0x6bcb,  0x0,  0x6bcd,  0x0,  0x6bd4,  0x0,  0x6bdb,  0x0,  0x6c0f,  0x0,  0x6c14,  0x0,  0x6c34,  0x0,  0x6c4e,  0x0,  0x6c67,  0x0,  0x6c88,  0x0,  0x6cbf,  0x0,  0x6ccc,  0x0,  0x6ccd,  0x0,  0x6ce5,  0x0,  0x6ce8,  0x0,  0x6d16,  0x0,  0x6d1b,  0x0,  0x6d1e,  0x0,  0x6d34,  0x0,  0x6d3e,  0x0,  0x6d41,  0x0,  0x6d69,  0x0,  0x6d6a,  0x0,  0x6d77,  0x0,  0x6d78,  0x0,  0x6d85,  0x0,  0x6dcb,  0x0,  0x6dda,  0x0,  0x6dea,  0x0,  0x6df9,  0x0,  0x6e1a,  0x0,  0x6e2f,  0x0,  0x6e6e,  0x0,  0x6e80,  0x0,  0x6e9c,  0x0,  0x6eba,  0x0,  0x6ec7,  0x0,  0x6ecb,  0x0,  0x6ed1,  0x0,  0x6edb,  0x0,  0x6f0f,  0x0,  0x6f14,  0x0,  0x6f22,  0x0,  0x6f23,  0x0,  0x6f6e,  0x0,  0x6fc6,  0x0,  0x6feb,  0x0,  0x6ffe,  0x0,  0x701b,  0x0,  0x701e,  0x0,  0x7039,  0x0,  0x704a,  0x0,  0x706b,  0x0,  0x7070,  0x0,  0x7077,  0x0,  0x707d,  0x0,  0x7099,  0x0,  0x70ad,  0x0,  0x70c8,  0x0,  0x70d9,  0x0,  0x7121,  0x0,  0x7145,  0x0,  0x7149,  0x0,  0x716e,  0x0,  0x719c,  0x0,  0x71ce,  0x0,  0x71d0,  0x0,  0x7210,  0x0,  0x721b,  0x0,  0x7228,  0x0,  0x722a,  0x0,  0x722b,  0x0,  0x7235,  0x0,  0x7236,  0x0,  0x723b,  0x0,  0x723f,  0x0,  0x7247,  0x0,  0x7250,  0x0,  0x7259,  0x0,  0x725b,  0x0,  0x7262,  0x0,  0x7279,  0x0,  0x7280,  0x0,  0x7295,  0x0,  0x72ac,  0x0,  0x72af,  0x0,  0x72c0,  0x0,  0x72fc,  0x0,  0x732a,  0x0,  0x7375,  0x0,  0x737a,  0x0,  0x7384,  0x0,  0x7387,  0x0,  0x7389,  0x0,  0x738b,  0x0,  0x73a5,  0x0,  0x73b2,  0x0,  0x73de,  0x0,  0x7406,  0x0,  0x7409,  0x0,  0x7422,  0x0,  0x7447,  0x0,  0x745c,  0x0,  0x7469,  0x0,  0x7471,  0x0,  0x7485,  0x0,  0x7489,  0x0,  0x7498,  0x0,  0x74ca,  0x0,  0x74dc,  0x0,  0x74e6,  0x0,  0x7506,  0x0,  0x7518,  0x0,  0x751f,  0x0,  0x7524,  0x0,  0x7528,  0x0,  0x7530,  0x0,  0x7532,  0x0,  0x7533,  0x0,  0x7537,  0x0,  0x753b,  0x0,  0x753e,  0x0,  0x7559,  0x0,  0x7565,  0x0,  0x7570,  0x0,  0x758b,  0x0,  0x7592,  0x0,  0x75e2,  0x0,  0x7610,  0x0,  0x761d,  0x0,  0x761f,  0x0,  0x7642,  0x0,  0x7669,  0x0,  0x7676,  0x0,  0x767d,  0x0,  0x76ae,  0x0,  0x76bf,  0x0,  0x76ca,  0x0,  0x76db,  0x0,  0x76e3,  0x0,  0x76e7,  0x0,  0x76ee,  0x0,  0x76f4,  0x0,  0x7701,  0x0,  0x771e,  0x0,  0x771f,  0x0,  0x7740,  0x0,  0x774a,  0x0,  0x778b,  0x0,  0x77a7,  0x0,  0x77db,  0x0,  0x77e2,  0x0,  0x77f3,  0x0,  0x784e,  0x0,  0x786b,  0x0,  0x788c,  0x0,  0x7891,  0x0,  0x78ca,  0x0,  0x78cc,  0x0,  0x78fb,  0x0,  0x792a,  0x0,  0x793a,  0x0,  0x793c,  0x0,  0x793e,  0x0,  0x7948,  0x0,  0x7949,  0x0,  0x7950,  0x0,  0x7956,  0x0,  0x795d,  0x0,  0x795e,  0x0,  0x7965,  0x0,  0x797f,  0x0,  0x7981,  0x0,  0x798d,  0x0,  0x798e,  0x0,  0x798f,  0x0,  0x79ae,  0x0,  0x79b8,  0x0,  0x79be,  0x0,  0x79ca,  0x0,  0x79d8,  0x0,  0x79eb,  0x0,  0x7a1c,  0x0,  0x7a40,  0x0,  0x7a4a,  0x0,  0x7a4f,  0x0,  0x7a74,  0x0,  0x7a7a,  0x0,  0x7a81,  0x0,  0x7ab1,  0x0,  0x7acb,  0x0,  0x7aee,  0x0,  0x7af9,  0x0,  0x7b20,  0x0,  0x7b8f,  0x0,  0x7bc0,  0x0,  0x7bc6,  0x0,  0x7bc9,  0x0,  0x7c3e,  0x0,  0x7c60,  0x0,  0x7c73,  0x0,  0x7c7b,  0x0,  0x7c92,  0x0,  0x7cbe,  0x0,  0x7cd2,  0x0,  0x7cd6,  0x0,  0x7ce3,  0x0,  0x7ce7,  0x0,  0x7ce8,  0x0,  0x7cf8,  0x0,  0x7d00,  0x0,  0x7d10,  0x0,  0x7d22,  0x0,  0x7d2f,  0x0,  0x7d42,  0x0,  0x7d5b,  0x0,  0x7d63,  0x0,  0x7da0,  0x0,  0x7dbe,  0x0,  0x7dc7,  0x0,  0x7df4,  0x0,  0x7e02,  0x0,  0x7e09,  0x0,  0x7e37,  0x0,  0x7e41,  0x0,  0x7e45,  0x0,  0x7f36,  0x0,  0x7f3e,  0x0,  0x7f51,  0x0,  0x7f72,  0x0,  0x7f79,  0x0,  0x7f7a,  0x0,  0x7f85,  0x0,  0x7f8a,  0x0,  0x7f95,  0x0,  0x7f9a,  0x0,  0x7fbd,  0x0,  0x7ffa,  0x0,  0x8001,  0x0,  0x8005,  0x0,  0x800c,  0x0,  0x8012,  0x0,  0x8033,  0x0,  0x8046,  0x0,  0x8060,  0x0,  0x806f,  0x0,  0x8070,  0x0,  0x807e,  0x0,  0x807f,  0x0,  0x8089,  0x0,  0x808b,  0x0,  0x80ad,  0x0,  0x80b2,  0x0,  0x8103,  0x0,  0x813e,  0x0,  0x81d8,  0x0,  0x81e3,  0x0,  0x81e8,  0x0,  0x81ea,  0x0,  0x81ed,  0x0,  0x81f3,  0x0,  0x81fc,  0x0,  0x8201,  0x0,  0x8204,  0x0,  0x820c,  0x0,  0x8218,  0x0,  0x821b,  0x0,  0x821f,  0x0,  0x826e,  0x0,  0x826f,  0x0,  0x8272,  0x0,  0x8278,  0x0,  0x8279,  0x0,  0x828b,  0x0,  0x8291,  0x0,  0x829d,  0x0,  0x82b1,  0x0,  0x82b3,  0x0,  0x82bd,  0x0,  0x82e5,  0x0,  0x82e6,  0x0,  0x831d,  0x0,  0x8323,  0x0,  0x8336,  0x0,  0x8352,  0x0,  0x8353,  0x0,  0x8363,  0x0,  0x83ad,  0x0,  0x83bd,  0x0,  0x83c9,  0x0,  0x83ca,  0x0,  0x83cc,  0x0,  0x83dc,  0x0,  0x83e7,  0x0,  0x83ef,  0x0,  0x83f1,  0x0,  0x843d,  0x0,  0x8449,  0x0,  0x8457,  0x0,  0x84ee,  0x0,  0x84f1,  0x0,  0x84f3,  0x0,  0x84fc,  0x0,  0x8516,  0x0,  0x8564,  0x0,  0x85cd,  0x0,  0x85fa,  0x0,  0x8606,  0x0,  0x8612,  0x0,  0x862d,  0x0,  0x863f,  0x0,  0x864d,  0x0,  0x8650,  0x0,  0x865c,  0x0,  0x8667,  0x0,  0x8669,  0x0,  0x866b,  0x0,  0x8688,  0x0,  0x86a9,  0x0,  0x86e2,  0x0,  0x870e,  0x0,  0x8728,  0x0,  0x876b,  0x0,  0x8779,  0x0,  0x8786,  0x0,  0x87ba,  0x0,  0x87e1,  0x0,  0x8801,  0x0,  0x881f,  0x0,  0x8840,  0x0,  0x884c,  0x0,  0x8860,  0x0,  0x8863,  0x0,  0x88c2,  0x0,  0x88cf,  0x0,  0x88d7,  0x0,  0x88de,  0x0,  0x88e1,  0x0,  0x88f8,  0x0,  0x88fa,  0x0,  0x8910,  0x0,  0x8941,  0x0,  0x8964,  0x0,  0x897e,  0x0,  0x8986,  0x0,  0x898b,  0x0,  0x8996,  0x0,  0x89d2,  0x0,  0x89e3,  0x0,  0x8a00,  0x0,  0x8aa0,  0x0,  0x8aaa,  0x0,  0x8abf,  0x0,  0x8acb,  0x0,  0x8ad2,  0x0,  0x8ad6,  0x0,  0x8aed,  0x0,  0x8af8,  0x0,  0x8afe,  0x0,  0x8b01,  0x0,  0x8b39,  0x0,  0x8b58,  0x0,  0x8b80,  0x0,  0x8b8a,  0x0,  0x8c37,  0x0,  0x8c46,  0x0,  0x8c48,  0x0,  0x8c55,  0x0,  0x8c78,  0x0,  0x8c9d,  0x0,  0x8ca1,  0x0,  0x8ca9,  0x0,  0x8cab,  0x0,  0x8cc1,  0x0,  0x8cc2,  0x0,  0x8cc7,  0x0,  0x8cc8,  0x0,  0x8cd3,  0x0,  0x8d08,  0x0,  0x8d1b,  0x0,  0x8d64,  0x0,  0x8d70,  0x0,  0x8d77,  0x0,  0x8db3,  0x0,  0x8dbc,  0x0,  0x8dcb,  0x0,  0x8def,  0x0,  0x8df0,  0x0,  0x8eab,  0x0,  0x8eca,  0x0,  0x8ed4,  0x0,  0x8f26,  0x0,  0x8f2a,  0x0,  0x8f38,  0x0,  0x8f3b,  0x0,  0x8f62,  0x0,  0x8f9b,  0x0,  0x8f9e,  0x0,  0x8fb0,  0x0,  0x8fb5,  0x0,  0x8fb6,  0x0,  0x9023,  0x0,  0x9038,  0x0,  0x904a,  0x0,  0x9069,  0x0,  0x9072,  0x0,  0x907c,  0x0,  0x908f,  0x0,  0x9091,  0x0,  0x9094,  0x0,  0x90ce,  0x0,  0x90de,  0x0,  0x90f1,  0x0,  0x90fd,  0x0,  0x9111,  0x0,  0x911b,  0x0,  0x9149,  0x0,  0x916a,  0x0,  0x9199,  0x0,  0x91b4,  0x0,  0x91c6,  0x0,  0x91cc,  0x0,  0x91cf,  0x0,  0x91d1,  0x0,  0x9234,  0x0,  0x9238,  0x0,  0x9276,  0x0,  0x927c,  0x0,  0x92d7,  0x0,  0x92d8,  0x0,  0x9304,  0x0,  0x934a,  0x0,  0x93f9,  0x0,  0x9415,  0x0,  0x9577,  0x0,  0x9580,  0x0,  0x958b,  0x0,  0x95ad,  0x0,  0x95b7,  0x0,  0x961c,  0x0,  0x962e,  0x0,  0x964b,  0x0,  0x964d,  0x0,  0x9675,  0x0,  0x9678,  0x0,  0x967c,  0x0,  0x9686,  0x0,  0x96a3,  0x0,  0x96b6,  0x0,  0x96b7,  0x0,  0x96b8,  0x0,  0x96b9,  0x0,  0x96c3,  0x0,  0x96e2,  0x0,  0x96e3,  0x0,  0x96e8,  0x0,  0x96f6,  0x0,  0x96f7,  0x0,  0x9723,  0x0,  0x9732,  0x0,  0x9748,  0x0,  0x9751,  0x0,  0x9756,  0x0,  0x975e,  0x0,  0x9762,  0x0,  0x9769,  0x0,  0x97cb,  0x0,  0x97db,  0x0,  0x97e0,  0x0,  0x97ed,  0x0,  0x97f3,  0x0,  0x97ff,  0x0,  0x9801,  0x0,  0x9805,  0x0,  0x980b,  0x0,  0x9818,  0x0,  0x9829,  0x0,  0x983b,  0x0,  0x985e,  0x0,  0x98a8,  0x0,  0x98db,  0x0,  0x98df,  0x0,  0x98e2,  0x0,  0x98ef,  0x0,  0x98fc,  0x0,  0x9928,  0x0,  0x9929,  0x0,  0x9996,  0x0,  0x9999,  0x0,  0x99a7,  0x0,  0x99ac,  0x0,  0x99c2,  0x0,  0x99f1,  0x0,  0x99fe,  0x0,  0x9a6a,  0x0,  0x9aa8,  0x0,  0x9ad8,  0x0,  0x9adf,  0x0,  0x9b12,  0x0,  0x9b25,  0x0,  0x9b2f,  0x0,  0x9b32,  0x0,  0x9b3c,  0x0,  0x9b5a,  0x0,  0x9b6f,  0x0,  0x9c40,  0x0,  0x9c57,  0x0,  0x9ce5,  0x0,  0x9cfd,  0x0,  0x9d67,  0x0,  0x9db4,  0x0,  0x9dfa,  0x0,  0x9e1e,  0x0,  0x9e75,  0x0,  0x9e7f,  0x0,  0x9e97,  0x0,  0x9e9f,  0x0,  0x9ea5,  0x0,  0x9ebb,  0x0,  0x9ec3,  0x0,  0x9ecd,  0x0,  0x9ece,  0x0,  0x9ed1,  0x0,  0x9ef9,  0x0,  0x9efd,  0x0,  0x9efe,  0x0,  0x9f05,  0x0,  0x9f0e,  0x0,  0x9f0f,  0x0,  0x9f13,  0x0,  0x9f16,  0x0,  0x9f20,  0x0,  0x9f3b,  0x0,  0x9f43,  0x0,  0x9f4a,  0x0,  0x9f52,  0x0,  0x9f8d,  0x0,  0x9f8e,  0x0,  0x9f9c,  0x0,  0x9f9f,  0x0,  0x9fa0,  0x0,  0xa76f,  0x0,  0x11099,  0x110ba,  0x0,  0x1109b,  0x110ba,  0x0,  0x110a5,  0x110ba,  0x0,  0x11131,  0x11127,  0x0,  0x11132,  0x11127,  0x0,  0x1d157,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x1d16e,  0x0,  0x1d158,  0x1d165,  0x1d16f,  0x0,  0x1d158,  0x1d165,  0x1d170,  0x0,  0x1d158,  0x1d165,  0x1d171,  0x0,  0x1d158,  0x1d165,  0x1d172,  0x0,  0x1d1b9,  0x1d165,  0x0,  0x1d1b9,  0x1d165,  0x1d16e,  0x0,  0x1d1b9,  0x1d165,  0x1d16f,  0x0,  0x1d1ba,  0x1d165,  0x0,  0x1d1ba,  0x1d165,  0x1d16e,  0x0,  0x1d1ba,  0x1d165,  0x1d16f,  0x0,  0x20122,  0x0,  0x2051c,  0x0,  0x20525,  0x0,  0x2054b,  0x0,  0x2063a,  0x0,  0x20804,  0x0,  0x208de,  0x0,  0x20a2c,  0x0,  0x20b63,  0x0,  0x214e4,  0x0,  0x216a8,  0x0,  0x216ea,  0x0,  0x219c8,  0x0,  0x21b18,  0x0,  0x21d0b,  0x0,  0x21de4,  0x0,  0x21de6,  0x0,  0x22183,  0x0,  0x2219f,  0x0,  0x22331,  0x0,  0x226d4,  0x0,  0x22844,  0x0,  0x2284a,  0x0,  0x22b0c,  0x0,  0x22bf1,  0x0,  0x2300a,  0x0,  0x232b8,  0x0,  0x2335f,  0x0,  0x23393,  0x0,  0x2339c,  0x0,  0x233c3,  0x0,  0x233d5,  0x0,  0x2346d,  0x0,  0x236a3,  0x0,  0x238a7,  0x0,  0x23a8d,  0x0,  0x23afa,  0x0,  0x23cbc,  0x0,  0x23d1e,  0x0,  0x23ed1,  0x0,  0x23f5e,  0x0,  0x23f8e,  0x0,  0x24263,  0x0,  0x242ee,  0x0,  0x243ab,  0x0,  0x24608,  0x0,  0x24735,  0x0,  0x24814,  0x0,  0x24c36,  0x0,  0x24c92,  0x0,  0x24fa1,  0x0,  0x24fb8,  0x0,  0x25044,  0x0,  0x250f2,  0x0,  0x250f3,  0x0,  0x25119,  0x0,  0x25133,  0x0,  0x25249,  0x0,  0x2541d,  0x0,  0x25626,  0x0,  0x2569a,  0x0,  0x256c5,  0x0,  0x2597c,  0x0,  0x25aa7,  0x0,  0x25bab,  0x0,  0x25c80,  0x0,  0x25cd0,  0x0,  0x25f86,  0x0,  0x261da,  0x0,  0x26228,  0x0,  0x26247,  0x0,  0x262d9,  0x0,  0x2633e,  0x0,  0x264da,  0x0,  0x26523,  0x0,  0x265a8,  0x0,  0x267a7,  0x0,  0x267b5,  0x0,  0x26b3c,  0x0,  0x26c36,  0x0,  0x26cd5,  0x0,  0x26d6b,  0x0,  0x26f2c,  0x0,  0x26fb1,  0x0,  0x270d2,  0x0,  0x273ca,  0x0,  0x27667,  0x0,  0x278ae,  0x0,  0x27966,  0x0,  0x27ca8,  0x0,  0x27ed3,  0x0,  0x27f2f,  0x0,  0x285d2,  0x0,  0x285ed,  0x0,  0x2872e,  0x0,  0x28bfa,  0x0,  0x28d77,  0x0,  0x29145,  0x0,  0x291df,  0x0,  0x2921a,  0x0,  0x2940a,  0x0,  0x29496,  0x0,  0x295b6,  0x0,  0x29b30,  0x0,  0x2a0ce,  0x0,  0x2a105,  0x0,  0x2a20e,  0x0,  0x2a291,  0x0,  0x2a392,  0x0,  0x2a600,  0x0]; return t; }
++}
++
++}
++
++
++static if(size_t.sizeof == 4) {
++//22656 bytes
++enum compatMappingTrieEntries = TrieEntry!(ushort, 8, 8, 5)([ 0x0,  0x40,  0x540], [ 0x100,  0xa00,  0x21c0], [ 0x2020100,  0x4020302,  0x2020205,  0x7060202,  0x2020202,  0x8020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x80000,  0xa0009,  0xc000b,  0x0,  0xd0000,  0xf000e,  0x0,  0x110010,  0x130012,  0x150014,  0x170016,  0x190018,  0x0,  0x1b001a,  0x0,  0x0,  0x1c,  0x0,  0x1d0000,  0x1e0000,  0x0,  0x1f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200000,  0x21,  0x0,  0x22,  0x230000,  0x24,  0x0,  0x0,  0x0,  0x25,  0x26,  0x27,  0x0,  0x28,  0x0,  0x29,  0x0,  0x2a,  0x0,  0x2b,  0x2c0000,  0x0,  0x2d0000,  0x2e,  0x2f,  0x310030,  0x330032,  0x0,  0x340000,  0x0,  0x0,  0x350000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x370036,  0x38,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x390000,  0x3b003a,  0x3d003c,  0x0,  0x3f003e,  0x410040,  0x430042,  0x450044,  0x470046,  0x490048,  0x4b004a,  0x4d004c,  0x4f004e,  0x510050,  0x530052,  0x0,  0x550054,  0x570056,  0x590058,  0x5a,  0x5c005b,  0x5e005d,  0x60005f,  0x610000,  0x620000,  0x0,  0x0,  0x0,  0x0,  0x630000,  0x650064,  0x670066,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x68,  0x690000,  0x0,  0x6a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6b0000,  0x0,  0x0,  0x0,  0x6c0000,  0x0,  0x0,  0x0,  0x0,  0x6d,  0x6e0000,  0x70006f,  0x720071,  0x740073,  0x75,  0x770076,  0x790078,  0x7b007a,  0x7d007c,  0x7e0000,  0x80007f,  0x81,  0x0,  0x830082,  0x850084,  0x870086,  0x890088,  0x8b008a,  0x8d008c,  0x8f008e,  0x910090,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x920000,  0x0,  0x930000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x950094,  0x970096,  0x990098,  0x9b009a,  0x9d009c,  0x9f009e,  0xa100a0,  0xa2,  0xa400a3,  0xa600a5,  0xa800a7,  0xaa00a9,  0xac00ab,  0xae00ad,  0xb000af,  0xb200b1,  0xb400b3,  0xb600b5,  0xb800b7,  0xba00b9,  0xbc00bb,  0xbe00bd,  0xc000bf,  0xc200c1,  0xc400c3,  0xc600c5,  0xc800c7,  0xca00c9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xcc00cb,  0x0,  0xcd0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xcf00ce,  0xd00000,  0xd1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xd300d2,  0xd500d4,  0xd700d6,  0xd900d8,  0xdb00da,  0xdd00dc,  0xd200de,  0xdf00d3,  0xe000d5,  0xe200e1,  0xe300d9,  0xe500e4,  0xe700e6,  0xe900e8,  0xeb00ea,  0xed00ec,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xef00ee,  0xf100f0,  0xf300f2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf500f4,  0xf700f6,  0xf8,  0x0,  0xfa00f9,  0xfb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfd00fc,  0xff00fe,  0x1010100,  0x1030102,  0x1050104,  0x1070106,  0x1090108,  0x10b010a,  0x10c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0x15,  0x692,  0x0,  0x90000,  0x0,  0x30f0343,  0x11b20003,  0x0,  0x3140048,  0x787,  0x3c603ce,  0x494,  0x570056d,  0x5860573,  0x5b005a6,  0x5f80000,  0x62e062b,  0x6580631,  0x6e706e4,  0x6f906ea,  0x78f0000,  0x7a907a6,  0x7bf07ac,  0x7e3,  0x8b10000,  0x8b708b4,  0x95f08cb,  0x0,  0x9ac09a9,  0x9c209af,  0x9ec09e2,  0xa470000,  0xa890a86,  0xab30a8c,  0xb460b43,  0xb550b49,  0xc410000,  0xc5e0c5b,  0xc740c61,  0xc98,  0xd680000,  0xd6e0d6b,  0xe0c0d82,  0xe1b0000,  0x9c50589,  0x9c8058c,  0xa0a05ce,  0xa3b05ec,  0xa3e05ef,  0xa4105f2,  0xa4405f5,  0xa6e061a,  0x0,  0xaa20647,  0xaad0652,  0xab00655,  0xad00675,  0xab9065e,  0xafb069a,  0xb0106a0,  0xb0406a3,  0xb0a06a9,  0xb1606ba,  0x0,  0xb4c06ed,  0xb4f06f0,  0xb5206f3,  0xb6b070f,  0x6f6,  0xb3706d8,  0xb730717,  0xbae072e,  0x7430000,  0x7500bcc,  0x7460bd9,  0x7400bcf,  0xbc9,  0x78c0000,  0x79b0c3e,  0x7950c4d,  0xed70c47,  0x0,  0xc8307ce,  0xc8e07d9,  0xca207ed,  0x0,  0xd070842,  0xd1d0858,  0xd0d0848,  0xd2b086c,  0xd320873,  0xd49088a,  0xd380879,  0xd5d08a6,  0xd54089d,  0x0,  0xd7108ba,  0xd7808c1,  0xd7f08c8,  0xd9808e1,  0xd9b08e4,  0xdc4090d,  0xde9093f,  0xe0f0962,  0x979096e,  0x97f0e29,  0x60d0e2f,  0x8400614,  0xcae07f9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8f00000,  0xda7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x613060c,  0x7360a67,  0xbb9073d,  0x7830780,  0x5b70c32,  0x70309f3,  0x7f00b5f,  0x8e70ca5,  0x8d60d9e,  0x8d20d8d,  0x8da0d89,  0x8ce0d91,  0xd85,  0x9e505a9,  0x9de05a2,  0xe630e5a,  0x0,  0xb0706a6,  0xba80728,  0xccc0817,  0xccf081a,  0xecc0e7b,  0x6090b76,  0xa640610,  0xaf80697,  0x0,  0xc3b0789,  0x9ef05b3,  0xe600e57,  0xe680e5d,  0x9f605ba,  0x9f905bd,  0xabc0661,  0xabf0664,  0xb620706,  0xb650709,  0xca807f3,  0xcab07f6,  0xd10084b,  0xd13084e,  0xda108ea,  0xda408ed,  0xd460887,  0xd5a08a3,  0x0,  0xb1f06c3,  0x0,  0x0,  0x0,  0x9db059f,  0xac9066e,  0xc9b07e6,  0xc7b07c6,  0xc9107dc,  0xc9407df,  0xe150968,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe9a0b0d,  0xa11073e,  0xeb60eb4,  0xde10eb8,  0x695,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x12000f,  0x4b0024,  0x270006,  0x0,  0xa280e96,  0xb410840,  0xecf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4001a,  0x2b0000,  0x1d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xed5,  0x0,  0x0,  0x54,  0x0,  0x546,  0x0,  0x0,  0x1c0003,  0x7410ee8,  0xf630f43,  0xfb4,  0xfed,  0x103c1016,  0x1185,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x101f0fbd,  0x10f5108f,  0x11751119,  0x1213,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x120c117e,  0x120311d5,  0x124b,  0x116e10ea,  0x10161011,  0x123c101f,  0x11ee,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x11f011ae,  0x11f8,  0x10f00fad,  0x0,  0x100d0000,  0x0,  0x0,  0x0,  0x12b612b0,  0x12ad0000,  0x0,  0x12a40000,  0x0,  0x0,  0x12c212ce,  0x12d7,  0x0,  0x0,  0x0,  0x0,  0x12c80000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x130a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x12f812f2,  0x12ef0000,  0x0,  0x132d0000,  0x0,  0x0,  0x13041310,  0x131b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13331330,  0x0,  0x0,  0x0,  0x0,  0x12b90000,  0x12fb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x12e912a7,  0x12ec12aa,  0x0,  0x12f512b3,  0x0,  0x13391336,  0x12fe12bc,  0x130112bf,  0x0,  0x130712c5,  0x130d12cb,  0x131512d1,  0x0,  0x133f133c,  0x132a12e6,  0x131812d4,  0x131e12da,  0x132112dd,  0x132412e0,  0x0,  0x132712e3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13420000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13e913e6,  0x13ec178f,  0x17ca,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13ef0000,  0x185b1792,  0x1811,  0x0,  0x0,  0x0,  0x186d,  0x1852,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x186a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18820000,  0x0,  0x0,  0x0,  0x188b0000,  0x0,  0x188e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18731870,  0x18791876,  0x187f187c,  0x18881885,  0x0,  0x0,  0x0,  0x0,  0x0,  0x189a0000,  0x189d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18941891,  0x18970000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18ac0000,  0x0,  0x18af,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18a00000,  0x18a618a3,  0x0,  0x18a9,  0x0,  0x0,  0x0,  0x0,  0x18bb,  0x18b80000,  0x18be,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18b518b2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18c1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18ca18c4,  0x18c7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18cd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18d0,  0x0,  0x0,  0x18da0000,  0x18dd,  0x18d618d3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18e618e0,  0x18e3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18e9,  0x18ef18ec,  0x18f3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18f60000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18ff0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18fc18f9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1902,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x19070000,  0x0,  0x0,  0x0,  0x0,  0x190a0000,  0x0,  0x0,  0x190d,  0x0,  0x19100000,  0x0,  0x0,  0x1913,  0x0,  0x0,  0x0,  0x0,  0x0,  0x19040000,  0x0,  0x0,  0x0,  0x0,  0x19160000,  0x19190000,  0x19311935,  0x1938193c,  0x0,  0x0,  0x0,  0x191c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x19220000,  0x0,  0x0,  0x0,  0x0,  0x19250000,  0x0,  0x0,  0x1928,  0x0,  0x192b0000,  0x0,  0x0,  0x192e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x191f0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x193f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1942,  0x0,  0x0,  0x0,  0x0,  0x1a38,  0x1a3b,  0x1a3e,  0x1a41,  0x1a44,  0x0,  0x1a47,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a4a0000,  0x1a4d0000,  0x0,  0x1a531a50,  0x1a560000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe550568,  0x5d5,  0x62905e6,  0x6870e75,  0x6cf06ac,  0x71a0607,  0x7230734,  0x77e,  0xe7e07a4,  0x82c06af,  0x56b088d,  0x6920770,  0xe840e82,  0x9371a59,  0xa7d0a2e,  0xe8e0e8c,  0x6020e90,  0xb790000,  0xe7105d3,  0xe880787,  0x1a5d1a5b,  0xba30cd3,  0x1a610a24,  0x86a0ea4,  0x10ea1a63,  0x10ee10ec,  0x123e123c,  0xa110ae0,  0x86a0a24,  0x10ec10ea,  0x123c11f0,  0x123e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1313,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe860000,  0xe8a09a0,  0xe900e66,  0xe920ad9,  0xe980e94,  0xe9e0e9c,  0x1a650ea0,  0xea20ed1,  0xed31a67,  0xea60ea8,  0xeac0eaa,  0xeb00eae,  0xeba0eb2,  0xe790ebc,  0xec00ebe,  0xec21a5f,  0x6110ec4,  0xec80ec6,  0x116e0eca,  0xa0705cb,  0xa1305da,  0xa1605dd,  0xa1905e0,  0xa4a05fb,  0xa6b0617,  0xa71061d,  0xa7a0626,  0xa740620,  0xa770623,  0xaa5064a,  0xaa9064e,  0xad30678,  0xad6067b,  0xacc0671,  0xaef0684,  0xafe069d,  0xb1906bd,  0xb2206c6,  0xb1c06c0,  0xb2506c9,  0xb2806cc,  0xb6e0712,  0xb5806fc,  0xba50725,  0xbab072b,  0xbb10731,  0xbd20749,  0xbd5074c,  0xbdf0756,  0xbdc0753,  0xc120772,  0xc150775,  0xc180778,  0xc440792,  0xc4a0798,  0xc5307a1,  0xc50079e,  0xc7707c2,  0xc7f07ca,  0xc8607d1,  0xc8a07d5,  0xcec0835,  0xcef0838,  0xd0a0845,  0xd160851,  0xd190854,  0xd20085b,  0xd350876,  0xd3f0880,  0xd2e086f,  0xd3b087c,  0xd420883,  0xd4e089a,  0xd5708a0,  0xd6308ac,  0xd6008a9,  0xdc1090a,  0xdca0913,  0xdc70910,  0xd7408bd,  0xd7b08c4,  0xddb0924,  0xdde0927,  0xde30939,  0xde6093c,  0xdef0945,  0xdec0942,  0xdf50948,  0xe010954,  0xe040957,  0xe18096b,  0xe2c097c,  0xe350985,  0xe380988,  0xd510b2b,  0xe210df2,  0xd3509a6,  0x0,  0x0,  0x9fc05c0,  0x9e905ad,  0x9b6057a,  0x9b20576,  0x9be0582,  0x9ba057e,  0x9ff05c3,  0x9cf0593,  0x9cb058f,  0x9d7059b,  0x9d30597,  0xa0305c7,  0xac20667,  0xab6065b,  0xa9f0644,  0xa930638,  0xa8f0634,  0xa9b0640,  0xa97063c,  0xac5066a,  0xb5c0700,  0xb68070c,  0xcc50810,  0xc9f07ea,  0xc6807b3,  0xc6407af,  0xc7007bb,  0xc6c07b7,  0xcc80813,  0xcb50800,  0xcb107fc,  0xcbd0808,  0xcb90804,  0xcc1080c,  0xdbe0907,  0xd9508de,  0xdae08f7,  0xdaa08f3,  0xdb608ff,  0xdb208fb,  0xdba0903,  0xe09095c,  0xe240974,  0xe1e0971,  0xe120965,  0x0,  0x0,  0x0,  0x10be109c,  0x10c1109f,  0x10ca10a8,  0x10d310b1,  0xf130ef1,  0xf160ef4,  0xf1f0efd,  0xf280f06,  0x110310f8,  0x110610fb,  0x110a10ff,  0x0,  0xf510f46,  0xf540f49,  0xf580f4d,  0x0,  0x11421120,  0x11451123,  0x114e112c,  0x11571135,  0xf880f66,  0xf8b0f69,  0xf940f72,  0xf9d0f7b,  0x119c118d,  0x119f1190,  0x11a31194,  0x11a71198,  0xfcf0fc0,  0xfd20fc3,  0xfd60fc7,  0xfda0fcb,  0x11e311d8,  0x11e611db,  0x11ea11df,  0x0,  0xffb0ff0,  0xffe0ff3,  0x10020ff7,  0x0,  0x122a121b,  0x122d121e,  0x12311222,  0x12351226,  0x10220000,  0x10250000,  0x10290000,  0x102d0000,  0x12741252,  0x12771255,  0x1280125e,  0x12891267,  0x1061103f,  0x10641042,  0x106d104b,  0x10761054,  0x108f1088,  0x10f510f2,  0x11191112,  0x11751172,  0x11d511d2,  0x12031200,  0x124b1244,  0x0,  0x10dc10ba,  0x10c510a3,  0x10ce10ac,  0x10d710b5,  0xf310f0f,  0xf1a0ef8,  0xf230f01,  0xf2c0f0a,  0x1160113e,  0x11491127,  0x11521130,  0x115b1139,  0xfa60f84,  0xf8f0f6d,  0xf980f76,  0xfa10f7f,  0x12921270,  0x127b1259,  0x12841262,  0x128d126b,  0x107f105d,  0x10681046,  0x1071104f,  0x107a1058,  0x10961099,  0x10e7108b,  0x1092,  0x10e310e0,  0xeeb0eee,  0xee80ee5,  0x2a0f35,  0x2a1170,  0x200051,  0x116b1115,  0x111c,  0x11671164,  0xf430f40,  0xf630f60,  0x2d0faa,  0x350031,  0x1178117b,  0x11851181,  0x0,  0x118911ab,  0xfb70fba,  0xfb40fb1,  0x3c0000,  0x440040,  0x12061209,  0x1213120f,  0x11f511f2,  0x12171239,  0x1019101c,  0x10161013,  0x18100a,  0x995001c,  0x0,  0x129d1247,  0x124e,  0x12991296,  0xfed0fea,  0x103c1039,  0x31083,  0x39,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x1,  0x0,  0x0,  0x1a690000,  0x0,  0x0,  0x4e0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2fc02fa,  0x2ff,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x1a6f0000,  0x1a72,  0x1a7e1a7b,  0x0,  0x0,  0x8f,  0xc,  0x0,  0x0,  0x0,  0x5630000,  0x920560,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a760000,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xae00305,  0x0,  0x3740365,  0x3920383,  0x3b003a1,  0x1aad02f4,  0xa10544,  0xb3b00a5,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x1aad02f4,  0xa10544,  0xa5,  0xa7d0692,  0xb410787,  0xb0d0e8c,  0xa280b79,  0xb3b05d3,  0x8400cd3,  0xba3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x83f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9a2099e,  0xe4d05e3,  0xa1e0000,  0xe770a22,  0xe500000,  0x6ac0602,  0x6ac06ac,  0xe6d0b0d,  0x6cf06cf,  0xa280734,  0x77e0000,  0x786,  0x6af0000,  0x82c083b,  0x82c082c,  0x0,  0x88f0863,  0x897,  0x60a,  0x77c,  0x60a,  0x5b0071a,  0x5e305d5,  0xa7d0000,  0x67e0629,  0x7230000,  0x13540787,  0x136a1362,  0xae0136f,  0x6800000,  0x10ec11ee,  0x10060f3a,  0x1aab,  0x0,  0x5e60000,  0xa7d0a2e,  0x73e0ae0,  0x0,  0x0,  0x0,  0x3e203da,  0x3ca03c1,  0x3d20455,  0x4980459,  0x3d604cf,  0x3de04e7,  0x4eb049c,  0x3be0511,  0x6d106cf,  0x6de06d4,  0x91806b2,  0x91f091b,  0x68206e1,  0x950094d,  0x5e30734,  0x72305e6,  0xb300ae0,  0xb3d0b33,  0xdcf086a,  0xdd60dd2,  0xb410b40,  0xdfd0dfa,  0x9a00a28,  0x5d30a2e,  0x0,  0x0,  0x0,  0x0,  0x30d0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a8d1a86,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a92,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a950000,  0x1a981a9b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1aa0,  0x0,  0x1aa50000,  0x0,  0x1aa8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1aaf,  0x1ab2,  0x0,  0x0,  0x1ab81ab5,  0x1ac10000,  0x1ac4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ac80000,  0x0,  0x1acb,  0x1ace0000,  0x1ad10000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x556,  0x1ad7,  0x0,  0x0,  0x0,  0x0,  0x1ad40000,  0x55b054a,  0x1add1ada,  0x0,  0x1ae31ae0,  0x0,  0x1ae91ae6,  0x0,  0x0,  0x0,  0x1aef1aec,  0x0,  0x1afb1af8,  0x0,  0x1b011afe,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b0d1b0a,  0x1b131b10,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1af51af2,  0x1b071b04,  0x0,  0x0,  0x0,  0x1b191b16,  0x1b1f1b1c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b350000,  0x1b37,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3430314,  0x365030f,  0x3830374,  0x3a10392,  0x31c03b0,  0x342032f,  0x3640355,  0x3820373,  0x3a00391,  0x3f703af,  0xd900a3,  0xe600e2,  0xee00ea,  0xf600f2,  0xa700fa,  0xb100ac,  0xbb00b6,  0xc500c0,  0xcf00ca,  0xdd00d4,  0x3460319,  0x3680359,  0x3860377,  0x3a40395,  0x31f03b3,  0x3450332,  0x3670358,  0x3850376,  0x3a30394,  0x3fa03b2,  0x16a0166,  0x172016e,  0x17a0176,  0x182017e,  0x18a0186,  0x192018e,  0x19a0196,  0x1a2019e,  0x1aa01a6,  0x1b201ae,  0x1ba01b6,  0x1c201be,  0x1ca01c6,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x305,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1abc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x54f0542,  0x552,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b2c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6b2073e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b2f0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x227c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26b00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1efb1ee9,  0x1f091f01,  0x1f131f0d,  0x1f1b1f17,  0x1f4b1f21,  0x1f5f1f57,  0x1f6f1f67,  0x1f871f77,  0x1f8b1f89,  0x1fb91fa5,  0x1fc51fc1,  0x1fcd1fc7,  0x1fdd1fdb,  0x1feb1fe9,  0x1ff71fef,  0x204f2045,  0x2079206f,  0x207f207d,  0x20982087,  0x20b420ae,  0x20ca20c4,  0x20ce20cc,  0x20dc20da,  0x20f820f2,  0x210020fc,  0x210f2108,  0x21292113,  0x212f212b,  0x21352131,  0x21412139,  0x218b214f,  0x21972195,  0x21d921d7,  0x21e521e3,  0x21ed21e9,  0x32521f1,  0x3292211,  0x22602223,  0x226e2266,  0x227a2274,  0x2280227e,  0x22842282,  0x22e22286,  0x230c2306,  0x2310230e,  0x23162312,  0x23222318,  0x23342330,  0x23562354,  0x235c235a,  0x23622360,  0x23762374,  0x23862384,  0x238a2388,  0x23a62394,  0x23aa23a8,  0x23dc23bc,  0x23ee23de,  0x23fa23f6,  0x241c240a,  0x2442243e,  0x2452244c,  0x245a2456,  0x245e245c,  0x246c246a,  0x247e247a,  0x24842482,  0x248e248a,  0x24922490,  0x24982496,  0x24f224e8,  0x250e250c,  0x25282512,  0x2530252c,  0x25522534,  0x25582554,  0x255c255a,  0x25742572,  0x25822578,  0x25922584,  0x25982596,  0x25ba25aa,  0x25c425c2,  0x25de25c8,  0x25e825e0,  0x260025fa,  0x26142608,  0x261a2618,  0x261e261c,  0x26262624,  0x2638262a,  0x263c263a,  0x264a2648,  0x2658264e,  0x265c265a,  0x26622660,  0x26662664,  0x26702668,  0x267e267c,  0x26862684,  0x268a2688,  0x2690268e,  0x26982692,  0x26a0269c,  0x26a626a2,  0x26aa26a8,  0x26b226ae,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b49,  0x1fcf1fcd,  0x1fd1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b7e,  0x1b81,  0x1b84,  0x1b87,  0x1b8a,  0x1b8d,  0x1b90,  0x1b93,  0x1b96,  0x1b99,  0x1b9c,  0x1b9f,  0x1ba20000,  0x1ba50000,  0x1ba80000,  0x0,  0x0,  0x0,  0x1bae1bab,  0x1bb10000,  0x1bb4,  0x1bba1bb7,  0x1bbd0000,  0x1bc0,  0x1bc91bc6,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b7b,  0x0,  0x0,  0x870000,  0x8a,  0x1bcc1bd3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1c26,  0x1c43,  0x1bf6,  0x1c92,  0x1c9b,  0x1caf,  0x1cbf,  0x1cca,  0x1ccf,  0x1cdc,  0x1ce1,  0x1ceb,  0x1cf20000,  0x1cf70000,  0x1c100000,  0x0,  0x0,  0x0,  0x1d261d1d,  0x1d3b0000,  0x1d42,  0x1d611d57,  0x1d760000,  0x1d7e,  0x1caa1da1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1c01,  0x1e440000,  0x1e521e4d,  0x1e57,  0x0,  0x1ca11e60,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x19440000,  0x1a101949,  0x1a12194b,  0x19501a14,  0x19571955,  0x1a181a16,  0x1a1c1a1a,  0x1a201a1e,  0x195c19a6,  0x19661961,  0x196819b0,  0x196f196d,  0x19811977,  0x198e1983,  0x19981993,  0x1947199d,  0x19da19d8,  0x19de19dc,  0x19e219e0,  0x198c19e4,  0x19ea19e8,  0x19ee19ec,  0x19f21975,  0x19f619f4,  0x19fa19f8,  0x19fe197f,  0x19a219d4,  0x1a2219a4,  0x1a261a24,  0x1a2a1a28,  0x1a2e1a2c,  0x1a3019a8,  0x19aa1a32,  0x19ae19ac,  0x19b419b2,  0x19b819b6,  0x19bc19ba,  0x19c019be,  0x19c419c2,  0x19c819c6,  0x19cc19ca,  0x1a361a34,  0x19d019ce,  0x1a0019d2,  0x1a041a02,  0x1a081a06,  0x1a0c1a0a,  0x1a0e,  0x0,  0x1f171ee9,  0x20471eef,  0x1efd1ef1,  0x23641ef3,  0x1ef71f0d,  0x208c1eeb,  0x1f212051,  0x1d701ce,  0x1e901e0,  0x1fb01f2,  0x20d0204,  0x2330225,  0x245023c,  0x257024e,  0x1db01d2,  0x1ed01e4,  0x1ff01f6,  0x2110208,  0x2370229,  0x2490240,  0x25b0252,  0x216022e,  0x21e,  0x2700260,  0x2a00268,  0x2880274,  0x2840264,  0x290026c,  0x2c402b0,  0x2b802c0,  0x2a402ec,  0x2bc02ac,  0x2d002b4,  0x2c80298,  0x2d402e4,  0x278028c,  0x2a8029c,  0x27c02cc,  0x29402e8,  0x28002d8,  0x2e002dc,  0x21112021,  0x23fe21e3,  0x0,  0x0,  0x0,  0x0,  0x406082e,  0x41c0411,  0x4320427,  0x4400439,  0x44e0447,  0x475046e,  0x47f047c,  0x4850482,  0x194b1944,  0x19571950,  0x1961195c,  0x196f1968,  0x19831977,  0x1993198e,  0x199d1998,  0x194d1946,  0x19591952,  0x1963195e,  0x1971196a,  0x19851979,  0x19951990,  0x199f199a,  0x197c1988,  0x1974,  0x1f171ee9,  0x20471eef,  0x1f611f19,  0x1f5f1eed,  0x1fcd1f0f,  0x22e20329,  0x22232286,  0x204f25c8,  0x223b0325,  0x2240221b,  0x231c2007,  0x23ca255e,  0x23e21fab,  0x20982368,  0x1f4925a2,  0x22961fdf,  0x1f2b262c,  0x208a1f73,  0x1efd1ef1,  0x20fa1ef3,  0x1fc92001,  0x20b220b8,  0x1f292390,  0x1fd72568,  0x4882083,  0x48e048b,  0x4b10491,  0x4b704b4,  0x4bd04ba,  0x4c304c0,  0x4c904c6,  0x4e404cc,  0x34e033b,  0x4d604a3,  0x50304f2,  0x5290518,  0x327053a,  0x34d033a,  0xa8206b4,  0x7390a7f,  0x1bf11bd8,  0x1c0a1bff,  0x1c241c1a,  0x1c731c41,  0x1c991c90,  0x1cbd1cad,  0x1ccd1c1e,  0x1cdf1cda,  0x1cf01bfb,  0x1bde1cf5,  0x1d0f1ca6,  0x1c8e1d11,  0x1d1b1d0d,  0x1d551d39,  0x1d9f1d74,  0x1ddc1c31,  0x1def1c22,  0x1e041e00,  0x1e191e11,  0x1c351e1b,  0x1e341bed,  0x1e421c5d,  0x1e501e4b,  0x1e55,  0x1be01bda,  0x1beb1be5,  0x1bf91bf3,  0x1c0c1c04,  0x1c1c1c13,  0x1c331c20,  0x1c3c1c37,  0x1c2e1c29,  0x1c4b1c46,  0x1c501c57,  0x1c5f1c5c,  0x1c6d1c66,  0x1c7d1c61,  0x1c8b1c84,  0x1ca41c95,  0x1cb21ca8,  0x1cc21cb7,  0x1cd61cd2,  0x1cfa1ce4,  0x1c811d03,  0x1d171d0c,  0x1d291d35,  0x1d201d30,  0x1d4c1d45,  0x1d3e1d51,  0x1d6b1d64,  0x1d701d5a,  0x1d811d95,  0x1d9b1d85,  0x1d8f1d8a,  0x1dac1d79,  0x1db81da4,  0x1dbb1db2,  0x1dc51dbf,  0x1dce1dca,  0x1dd61dd2,  0x1de31dde,  0x1df11de6,  0x1c681df5,  0x1e0b1e06,  0x1e1f1e13,  0x1e291e24,  0x1e361e2e,  0x1c6f1e39,  0x33f0311,  0x3610352,  0x37f0370,  0x39d038e,  0x3bb03ac,  0x33e032b,  0x3600351,  0x37e036f,  0x39c038d,  0x3ba03ab,  0x40d0402,  0x4230418,  0xb0f042e,  0x56a0a53,  0xc580a0f,  0xa590ce6,  0xa600a5c,  0x210a06db,  0x20892200,  0x223d21f9,  0xc260cda,  0xbea11b4,  0x71c0b7b,  0x689075b,  0xb8c0a26,  0xc290cdd,  0x11c011b7,  0x6010bf6,  0xb7e068d,  0x68c0764,  0x11c30893,  0xa560bfd,  0xaec0b94,  0x11c60c35,  0xa300c00,  0xc030b97,  0xa340a33,  0xc070b9a,  0xa380a37,  0xc1b0b9e,  0x6910c1f,  0x7680b82,  0xcf60690,  0xd000cfa,  0xc380ce9,  0xc0f11c9,  0xc2c0ce0,  0xbed11ba,  0x76c0b86,  0xc2f0ce3,  0xbf011bd,  0x76f0b89,  0x77b0bb4,  0x5d70999,  0xa2d0a2a,  0x5e805ff,  0x6940a50,  0x6ae0b13,  0x71f0b3a,  0xba20722,  0xbbf0bbc,  0xbc60bc2,  0xbf90bf3,  0x8200c0b,  0x8230cd5,  0xd25082b,  0x9360869,  0x5d1092a,  0x34a0337,  0x36c035d,  0x38a037b,  0x3a80399,  0x32303b7,  0x3490336,  0x36b035c,  0x389037a,  0x3a70398,  0x3fe03b6,  0x4140409,  0x42a041f,  0x43c0435,  0x44a0443,  0x4710451,  0xaf40478,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26b4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe730e6b,  0x0,  0x0,  0x0,  0x22132556,  0x256a2584,  0x1eff22c6,  0x26ae1ff9,  0x209226ae,  0x202b25c8,  0x21872090,  0x244a2382,  0x250424e6,  0x25a8251e,  0x229a2254,  0x233c22f0,  0x25bc24ca,  0x1f112652,  0x225e1fe3,  0x24e42302,  0x20e6267a,  0x24dc22d6,  0x21a12526,  0x250a2478,  0x221d211f,  0x232822a6,  0x1f3125ae,  0x1fb31f7d,  0x225a21d5,  0x23922300,  0x24e02456,  0x257e24ec,  0x266a2610,  0x23b02678,  0x242c23d0,  0x25d624bc,  0x2540267e,  0x212d206d,  0x24682408,  0x23b4231a,  0x260c2566,  0x20d4206b,  0x22b02256,  0x242422ca,  0x25ec2438,  0x246e1fb1,  0x1f811f83,  0x242e23e6,  0x25f024c8,  0x21a3254e,  0x25462254,  0x20be1f05,  0x23322159,  0x1fc32372,  0x1f3923b8,  0x1ef5214b,  0x21e12290,  0x1fed2422,  0x23982063,  0x253824cc,  0x25962276,  0x21ab228c,  0x21bb24a8,  0x1f1f2370,  0x1f7f1f5d,  0x24182244,  0x253e2494,  0x1fb725c6,  0x20982011,  0x21ef2127,  0x23ba22d8,  0x265625e4,  0x268c2680,  0x220f1fa5,  0x2590226c,  0x217b210d,  0x21d12189,  0x22f622d0,  0x23e0234e,  0x24642432,  0x24d02588,  0x25d8259c,  0x1fa71f91,  0x22ee201b,  0x25382514,  0x2155211d,  0x227221b7,  0x232c2406,  0x20491f27,  0x20f020be,  0x233a215b,  0x24502348,  0x25ca2460,  0x2612260a,  0x1f332630,  0x25c023da,  0x216725fe,  0x1f451f15,  0x20d020c0,  0x225421e7,  0x238022fc,  0x25a624d6,  0x220726aa,  0x1fa325ea,  0x2233222d,  0x22be22a2,  0x236e2340,  0x242023ae,  0x1f612636,  0x25f22191,  0x20e21f3d,  0x258a22b2,  0x216b2143,  0x23322237,  0x1f9525f6,  0x20d82009,  0x222521fc,  0x2294224a,  0x2378233e,  0x25162446,  0x25c4251c,  0x1fcb2604,  0x200b22c0,  0x235022fe,  0x25f824de,  0x2682266e,  0x22ae2231,  0x23f6247c,  0x240e23fc,  0x22ea2326,  0x1f23254c,  0x1f9724b0,  0x21151f8f,  0x241421a5,  0x229c20b6,  0x258e220d,  0x25ee250e,  0x2123252c,  0x20371f4d,  0x0,  0x2061,  0x2205,  0x1f850000,  0x238c232a,  0x23cc23be,  0x23d823ce,  0x24102616,  0x2452,  0x24e2,  0x2544,  0x259e0000,  0x25b4,  0x0,  0x26422640,  0x26762644,  0x25fc25b0,  0x1f471f35,  0x1faf1f51,  0x1fd51fb5,  0x203d202f,  0x205f2041,  0x20d62065,  0x216120da,  0x21792175,  0x21db2185,  0x220921f3,  0x22a82246,  0x22ce22b6,  0x230822f8,  0x23b22342,  0x23c42240,  0x23c623c2,  0x23ca23c8,  0x23d623d4,  0x23f223e8,  0x24322400,  0x243a2436,  0x24582444,  0x249a2480,  0x24ce249a,  0x252e2522,  0x254a2548,  0x256e256c,  0x259e259a,  0x26282606,  0x215d2634,  0x248c274b,  0x0,  0x1f7b1ef9,  0x1f2f1f5b,  0x1f651f4f,  0x1fbb1fad,  0x2025202f,  0x203b202d,  0x20692061,  0x2094208e,  0x20aa20a2,  0x21252121,  0x214d213d,  0x21712165,  0x21792169,  0x21852173,  0x21bf2193,  0x21c921c5,  0x220521dd,  0x221f221d,  0x226e2229,  0x22a22276,  0x22c422c8,  0x22dc22ce,  0x23a422f8,  0x2324230a,  0x234a232a,  0x236a2358,  0x237e237c,  0x238e238c,  0x23a02396,  0x23b6239e,  0x240023f4,  0x2428240c,  0x24402432,  0x24b22458,  0x250024c6,  0x252a2524,  0x253a252e,  0x253c2544,  0x25462548,  0x254a2542,  0x256e2550,  0x25a4258c,  0x25ce25be,  0x260625f4,  0x26202616,  0x262e2628,  0x265e2634,  0x272126ae,  0x2733271f,  0x1ea11e8d,  0x27671ea3,  0x27a92779,  0x26ac26a4,  0x0,  0x0,  0x0,  0xadf0adb,  0xade0ae3,  0xd280ae2,  0xd28,  0x0,  0x0,  0x0,  0x0,  0x0,  0x134e0000,  0x13481345,  0x134b1351,  0x0,  0x0,  0x13850000,  0x13d20000,  0x135413a6,  0x1374136f,  0x1360138e,  0x13b7139b,  0x2f413cd,  0x13ca13c7,  0x13c313bf,  0x13591356,  0x1364135c,  0x1371136c,  0x137c1376,  0x137f,  0x13881382,  0x1390138b,  0x1398,  0x139d,  0x13a313a0,  0x13a80000,  0x13ab,  0x13b413b1,  0x13bc13b9,  0x137913cf,  0x13931367,  0x135f13ae,  0x18181818,  0x181e181e,  0x181e181e,  0x18201820,  0x18201820,  0x18241824,  0x18241824,  0x181c181c,  0x181c181c,  0x18221822,  0x18221822,  0x181a181a,  0x181a181a,  0x183c183c,  0x183c183c,  0x183e183e,  0x183e183e,  0x18281828,  0x18281828,  0x18261826,  0x18261826,  0x182a182a,  0x182a182a,  0x182c182c,  0x182c182c,  0x18321832,  0x18301830,  0x18341834,  0x182e182e,  0x18381838,  0x18361836,  0x18401840,  0x18401840,  0x18441844,  0x18441844,  0x18481848,  0x18481848,  0x18461846,  0x18461846,  0x184a184a,  0x184c184c,  0x184c184c,  0x186d186d,  0x18501850,  0x18501850,  0x184e184e,  0x184e184e,  0x15911591,  0x186a186a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18420000,  0x18421842,  0x18031842,  0x17ff1803,  0x180717ff,  0x185b1807,  0x18621862,  0x18551855,  0x18601860,  0x180b180b,  0x180b180b,  0x14151415,  0x17cd17cd,  0x180d180d,  0x17f117f1,  0x18011801,  0x17fd17fd,  0x18051805,  0x18091809,  0x17f51809,  0x17f517f5,  0x18641864,  0x18641864,  0x17d517d1,  0x17f517e5,  0x13f417f9,  0x13fe13f7,  0x1414140b,  0x141e1417,  0x1438142d,  0x146a144d,  0x1472146d,  0x1484147b,  0x148c1487,  0x14311422,  0x14d11435,  0x143c14d4,  0x150514fa,  0x151a150c,  0x15931562,  0x15a515a2,  0x15ba15b0,  0x15c815c5,  0x15e415df,  0x16071575,  0x163f160a,  0x16451642,  0x1653164c,  0x165b1656,  0x16711662,  0x16791674,  0x167f167c,  0x16851682,  0x16931688,  0x16aa1696,  0x16c816b9,  0x1579158c,  0x145116e0,  0x14591455,  0x145d1526,  0x172d1461,  0x174f1740,  0x17691758,  0x1771176c,  0x177f1774,  0x179c1782,  0x17aa17a3,  0x17c417b3,  0x14e417c7,  0x179714ee,  0x64005d,  0x72006b,  0x800079,  0x17e117dd,  0x17e917e5,  0x17f917f5,  0x140813db,  0x140e140b,  0x14171414,  0x144a1447,  0x1464144d,  0x146d146a,  0x14781475,  0x147e147b,  0x14871484,  0x16561653,  0x16741671,  0x16851679,  0x16931688,  0x158c1696,  0x16e01579,  0x152616e5,  0x17551752,  0x17631758,  0x176c1769,  0x17ad1797,  0x17b317b0,  0x17c417be,  0x17d117c7,  0x17d917d5,  0x17ed17e5,  0x13f713f4,  0x140b13fe,  0x141e1411,  0x1438142d,  0x1467144d,  0x148c147b,  0x14311422,  0x14d11435,  0x14fa143c,  0x150c1505,  0x1562151a,  0x1593156d,  0x15a515a2,  0x15ba15b0,  0x15df15c5,  0x157515e4,  0x160a1607,  0x1642163f,  0x164c1645,  0x1662165b,  0x167f167c,  0x16851682,  0x16aa1688,  0x16c816b9,  0x13e0158c,  0x14551451,  0x15261459,  0x1740172d,  0x1758174f,  0x17711766,  0x17851774,  0x17a3179c,  0x17b317aa,  0x17e515ed,  0x140b17ed,  0x144d1411,  0x147b1467,  0x151a1481,  0x154c1529,  0x16851557,  0x158c1688,  0x17661758,  0x15ed17b3,  0x162c1625,  0x15d71633,  0x15ff15da,  0x16191602,  0x152c161c,  0x155a152f,  0x1490155d,  0x142613fb,  0x1440142a,  0x159a1402,  0x15bd159d,  0x153415c0,  0x1546153b,  0x1549154c,  0x15701517,  0x15d715b7,  0x15ff15da,  0x16191602,  0x152c161c,  0x155a152f,  0x1490155d,  0x142613fb,  0x1440142a,  0x159a1402,  0x15bd159d,  0x153415c0,  0x1546153b,  0x1549154c,  0x15701517,  0x153415b7,  0x1546153b,  0x1529154c,  0x15c81557,  0x150514fa,  0x1534150c,  0x1546153b,  0x15df15c8,  0x13e313e3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x14301421,  0x14341430,  0x1450143b,  0x14581454,  0x14a314a3,  0x14c114c5,  0x14fd1508,  0x15211501,  0x151d1521,  0x15251525,  0x15651565,  0x153e1596,  0x1537153e,  0x154f154f,  0x15531553,  0x15b315a8,  0x15cb15b3,  0x15cf15cb,  0x15e715d3,  0x15f315f3,  0x160d15f7,  0x16111615,  0x16481648,  0x16691665,  0x16c416bc,  0x16ad16c0,  0x16cb16ad,  0x16d216cb,  0x16fe16d2,  0x170b1702,  0x16f316eb,  0x17161712,  0x0,  0x177716ef,  0x1743177b,  0x17341747,  0x17381734,  0x175b175f,  0x17b617b6,  0x14291401,  0x14431425,  0x1460143f,  0x14ab145c,  0x14a7148f,  0x1569150f,  0x15ac1542,  0x16d616b5,  0x179f17a6,  0x172117ba,  0x174b166d,  0x16bc1665,  0x168f15fb,  0x171a1730,  0x168b16b1,  0x173016b1,  0x14ba1493,  0x164f16f7,  0x168b13fa,  0x159615e7,  0x173c1513,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x165e158f,  0x13d913de,  0x15731706,  0x15eb14e9,  0x1578158a,  0x1497157c,  0x14f1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b3102f6,  0x5401b33,  0x8d0546,  0x1b770093,  0x2ff1b79,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1a6d02fc,  0x9931a6b,  0xa10993,  0xe3b00a5,  0x1b4b0e3f,  0x1b451b4f,  0x1b391b47,  0x1b351b3b,  0x1b3d1b37,  0x1b411b3f,  0x1b43,  0x98b0000,  0xc098f,  0xc000c,  0x993000c,  0x9930993,  0x1b3102f6,  0x2fa,  0x5400546,  0x8d0093,  0xa11a6d,  0xe3b00a5,  0x1b4b0e3f,  0x971b4f,  0x2f2009d,  0x2f802f4,  0x5590548,  0x544,  0x99098d,  0x566009b,  0x0,  0x0,  0x161f0057,  0x5a,  0x61,  0x16220068,  0x1629006f,  0x16300076,  0x1637007d,  0x163a0084,  0x13e613d5,  0x13e913e6,  0x178f13e9,  0x13ec178f,  0x17ca13ec,  0x17ca17ca,  0x13d717ca,  0x13f213d7,  0x13f213f2,  0x141a13f2,  0x141c141a,  0x141c141c,  0x1470141c,  0x14701470,  0x13f51470,  0x13f513f5,  0x13f813f5,  0x13f813f8,  0x13ff13f8,  0x13ff13ff,  0x14e013ff,  0x14e214e0,  0x13dc14e2,  0x140913dc,  0x14f81409,  0x14f814f8,  0x153214f8,  0x15321532,  0x15601532,  0x15601560,  0x15a01560,  0x15a015a0,  0x15c315a0,  0x15c315c3,  0x15dd15c3,  0x15dd15dd,  0x15e215dd,  0x15e215e2,  0x160515e2,  0x16051605,  0x163d1605,  0x163d163d,  0x1659163d,  0x16591659,  0x16771659,  0x16771677,  0x14ec1677,  0x14ec14ec,  0x140c14ec,  0x140c140c,  0x140f140c,  0x140f140f,  0x13e1140f,  0x13e113e1,  0x178813e1,  0x14151788,  0x13fc1415,  0x13fc13fc,  0x169e13fc,  0x16a2169e,  0x16a616a2,  0x169b16a6,  0x169b,  0x0,  0x8d0000,  0x970095,  0x9b0099,  0x9f009d,  0xa500a1,  0x2f402f2,  0x2f802f6,  0x30302fa,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x5460540,  0x5440548,  0x930559,  0x5680566,  0x5e305d5,  0x62905e6,  0x687067e,  0x6cf06ac,  0x71a0607,  0x7230734,  0x7a4077e,  0x83b06af,  0x85e082c,  0x56b088d,  0x77006b2,  0x95a0682,  0x98b060a,  0x98f098d,  0x9930991,  0x6920995,  0x9a00937,  0xa7d0a2e,  0x6020ad9,  0xae00b0d,  0xb79073e,  0x5d30a28,  0x7870b3b,  0x5d80cd3,  0x8400a11,  0xa240ba3,  0xde1086a,  0x6950b41,  0xe3b0611,  0xe3f0e3d,  0x1b280e41,  0x1b331b2a,  0x1b3f1b3d,  0x1e5c1b31,  0x1bd61e55,  0x1bfd1bef,  0x1c181c08,  0x1e0f1e02,  0x1cee1e17,  0x1bd81c16,  0x1bff1bf1,  0x1c1a1c0a,  0x1c411c24,  0x1c901c73,  0x1cad1c99,  0x1c1e1cbd,  0x1cda1ccd,  0x1bfb1cdf,  0x1cf51cf0,  0x1ca61bde,  0x1d111d0f,  0x1d0d1c8e,  0x1d391d1b,  0x1d741d55,  0x1c311d9f,  0x1c221ddc,  0x1e001def,  0x1e111e04,  0x1e1b1e19,  0x1bed1c35,  0x1c5d1e34,  0x1c061e42,  0x8b0088,  0x194419d4,  0x1a101949,  0x1a12194b,  0x19501a14,  0x19571955,  0x1a181a16,  0x1a1c1a1a,  0x1a201a1e,  0x195c19a6,  0x19661961,  0x196819b0,  0x196f196d,  0x19811977,  0x198e1983,  0x19981993,  0x199d,  0x0,  0x19d81947,  0x19dc19da,  0x19e019de,  0x0,  0x19e419e2,  0x19e8198c,  0x19ec19ea,  0x0,  0x197519ee,  0x19f419f2,  0x19f819f6,  0x0,  0x197f19fa,  0x19fe,  0x0,  0xe450e43,  0x90e4b,  0xe470e49,  0x1a82,  0x1a841b22,  0x1a8b1a89,  0x1b241a90,  0x1b26,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26b6,  0x26b9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26bc0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26c226bf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26c826c5,  0x26cf26cb,  0x26d726d3,  0x26db,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x26df0000,  0x26e226ea,  0x26e626ed,  0x26f1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0x602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x568,  0x5e605e3,  0x0,  0x687,  0x6070000,  0x71a,  0x77e0000,  0x6af07a4,  0x83b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90000,  0xb0d0000,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30000,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e60000,  0x67e0629,  0x687,  0x6070000,  0x734071a,  0x77e0723,  0x6af07a4,  0x83b,  0x88d085e,  0x6b2056b,  0x6820770,  0x95a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e60000,  0x67e0629,  0x687,  0x60706cf,  0x734071a,  0x723,  0x7a4,  0x0,  0x88d085e,  0x6b2056b,  0x6820770,  0x95a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x9370692,  0xa2e09a0,  0xad90a7d,  0xb0d0602,  0x73e0ae0,  0xa280b79,  0xb3b05d3,  0xcd30787,  0xa1105d8,  0xba30840,  0x86a0a24,  0xb410de1,  0x6110695,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0xb410de1,  0x6110695,  0xe800e6f,  0x0,  0xf380ee3,  0xf3c0f3a,  0xf5c0f3e,  0xfad0f5e,  0xfde0faf,  0xfe20fe0,  0xfe60fe4,  0x10060fe8,  0xfad1008,  0x100f100d,  0x10311011,  0x10351033,  0x1aa3077c,  0x10ea1086,  0x10ee10ec,  0x110e10f0,  0x116e1110,  0x11ae1170,  0x11b211b0,  0x11ce11cc,  0x11ee11d0,  0x11f811f0,  0x11fc11fa,  0x123c11fe,  0x1240123e,  0x1a9e1242,  0x116e10f0,  0x123c11ae,  0x11ee11f0,  0xf380ee3,  0xf3c0f3a,  0xf5c0f3e,  0xfad0f5e,  0xfde0faf,  0xfe20fe0,  0xfe60fe4,  0x10060fe8,  0xfad1008,  0x100f100d,  0x10311011,  0x10351033,  0x1aa3077c,  0x10ea1086,  0x10ee10ec,  0x110e10f0,  0x116e1110,  0x11ae1170,  0x11b211b0,  0x11ce11cc,  0x11ee11d0,  0x11f811f0,  0x11fc11fa,  0x123c11fe,  0x1240123e,  0x1a9e1242,  0x116e10f0,  0x123c11ae,  0x11ee11f0,  0xf380ee3,  0xf3c0f3a,  0xf5c0f3e,  0xfad0f5e,  0xfde0faf,  0xfe20fe0,  0xfe60fe4,  0x10060fe8,  0xfad1008,  0x100f100d,  0x10311011,  0x10351033,  0x1aa3077c,  0x10ea1086,  0x10ee10ec,  0x110e10f0,  0x116e1110,  0x11ae1170,  0x11b211b0,  0x11ce11cc,  0x11ee11d0,  0x11f811f0,  0x11fc11fa,  0x123c11fe,  0x1240123e,  0x1a9e1242,  0x116e10f0,  0x123c11ae,  0x11ee11f0,  0xf380ee3,  0xf3c0f3a,  0xf5c0f3e,  0xfad0f5e,  0xfde0faf,  0xfe20fe0,  0xfe60fe4,  0x10060fe8,  0xfad1008,  0x100f100d,  0x10311011,  0x10351033,  0x1aa3077c,  0x10ea1086,  0x10ee10ec,  0x110e10f0,  0x116e1110,  0x11ae1170,  0x11b211b0,  0x11ce11cc,  0x11ee11d0,  0x11f811f0,  0x11fc11fa,  0x123c11fe,  0x1240123e,  0x1a9e1242,  0x116e10f0,  0x123c11ae,  0x11ee11f0,  0xf380ee3,  0xf3c0f3a,  0xf5c0f3e,  0xfad0f5e,  0xfde0faf,  0xfe20fe0,  0xfe60fe4,  0x10060fe8,  0xfad1008,  0x100f100d,  0x10311011,  0x10351033,  0x1aa3077c,  0x10ea1086,  0x10ee10ec,  0x110e10f0,  0x116e1110,  0x11ae1170,  0x11b211b0,  0x11ce11cc,  0x11ee11d0,  0x11f811f0,  0x11fc11fa,  0x123c11fe,  0x1240123e,  0x1a9e1242,  0x116e10f0,  0x123c11ae,  0x11ee11f0,  0x12a212a0,  0x0,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x3140305,  0x30f0343,  0x3740365,  0x3920383,  0x3b003a1,  0x13f213d7,  0x14e013f5,  0x17880000,  0x13f81409,  0x13fc15c3,  0x14ec1677,  0x140f140c,  0x15e214f8,  0x1560163d,  0x13dc1659,  0x141c1532,  0x13ff1470,  0x15a014e2,  0x160515dd,  0x184a1814,  0x1816183a,  0x13f20000,  0x13f5,  0x13e1,  0x13f80000,  0x13fc0000,  0x14ec1677,  0x140f140c,  0x15e214f8,  0x1560163d,  0x1659,  0x141c1532,  0x13ff1470,  0x15a00000,  0x16050000,  0x0,  0x0,  0x0,  0x13f5,  0x0,  0x13f80000,  0x13fc0000,  0x14ec0000,  0x140f0000,  0x15e214f8,  0x15600000,  0x1659,  0x1532,  0x13ff0000,  0x15a00000,  0x16050000,  0x184a0000,  0x18160000,  0x13f20000,  0x13f5,  0x13e1,  0x13f80000,  0x13fc15c3,  0x1677,  0x140f140c,  0x15e214f8,  0x1560163d,  0x1659,  0x141c1532,  0x13ff1470,  0x15a00000,  0x160515dd,  0x1814,  0x183a,  0x13f213d7,  0x14e013f5,  0x178813e1,  0x13f81409,  0x13fc15c3,  0x14ec0000,  0x140f140c,  0x15e214f8,  0x1560163d,  0x13dc1659,  0x141c1532,  0x13ff1470,  0x15a014e2,  0x160515dd,  0x0,  0x0,  0x13f20000,  0x14e013f5,  0x17880000,  0x13f81409,  0x13fc15c3,  0x14ec0000,  0x140f140c,  0x15e214f8,  0x1560163d,  0x13dc1659,  0x141c1532,  0x13ff1470,  0x15a014e2,  0x160515dd,  0x0,  0x0,  0x307030a,  0x3f10316,  0x4ab0468,  0x4fa04de,  0x520050b,  0x531,  0x0,  0x0,  0x10200fe,  0x10a0106,  0x112010e,  0x11a0116,  0x122011e,  0x12a0126,  0x132012e,  0x13a0136,  0x142013e,  0x14a0146,  0x152014e,  0x15a0156,  0x162015e,  0x5e31b4d,  0x5e5082c,  0x933,  0x5d50568,  0x5e605e3,  0x67e0629,  0x6ac0687,  0x60706cf,  0x734071a,  0x77e0723,  0x6af07a4,  0x82c083b,  0x88d085e,  0x6b2056b,  0x6820770,  0x60a095a,  0x76c06b1,  0x8660860,  0x9300827,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x761075e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x606,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1c9e1bc3,  0x1cad,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20b02197,  0x1cf71ff3,  0x20811f17,  0x208c2532,  0x21fe1f1d,  0x21e722f2,  0x21451f9d,  0x21eb1f69,  0x24261f93,  0x2560235c,  0x200f2073,  0x219d22cc,  0x1ee921b3,  0x25a01eef,  0x1efd20fa,  0x21ad2001,  0x21992574,  0x23f023d2,  0x22bc2005,  0x329221b,  0x1f9f2366,  0x2035,  0x0,  0x0,  0x1b511b69,  0x1b5d1b55,  0x1b611b6d,  0x1b591b71,  0x1b65,  0x0,  0x0,  0x0,  0x1ffd2147,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1f031f07,  0x26f51f0b,  0x1f351f2d,  0x1f3b1f37,  0x1f411f3f,  0x1f431f47,  0x26fd1e63,  0x1f531f51,  0x1f631f55,  0x1e6526f7,  0x1f691f59,  0x1f7126fb,  0x1f251f75,  0x1f7b1f79,  0x1f8927b9,  0x1e691f8d,  0x1f9b1f99,  0x1fa11f9f,  0x1fad1e6b,  0x1fb51faf,  0x1fbd1fbb,  0x1fc31fbf,  0x1fd51fd3,  0x1fe11fd9,  0x1fe71fe5,  0x1fe71fe7,  0x22e42703,  0x1ff51ff1,  0x1ffb2705,  0x20031fff,  0x200d2017,  0x20152013,  0x201d2019,  0x2023201f,  0x20292027,  0x202d2029,  0x20332031,  0x204b2039,  0x204d203d,  0x2043203f,  0x20711f8f,  0x20572055,  0x20532059,  0x205b205d,  0x27072067,  0x20772075,  0x2081207b,  0x20962085,  0x270b2709,  0x209e209c,  0x209a20a0,  0x1e6d20a4,  0x20a81e6f,  0x20ac20ac,  0x20ba270d,  0x20be20bc,  0x270f20c2,  0x20c820c6,  0x20cc2137,  0x20d21e71,  0x20e020da,  0x271320de,  0x271520e4,  0x20e820ea,  0x20f420ec,  0x1e7320f6,  0x210220fe,  0x21062104,  0x27171e75,  0x21171e77,  0x211b2119,  0x27cd211f,  0x271b212b,  0x2486271b,  0x21332133,  0x27291e79,  0x213b277d,  0x1e7b213f,  0x21512149,  0x21572153,  0x1e7f215f,  0x21611e7d,  0x2163271d,  0x216f216d,  0x216f2171,  0x21792177,  0x217d2181,  0x2183217f,  0x21872185,  0x218f210b,  0x219f219b,  0x21b121a7,  0x21af2723,  0x21b521a9,  0x21c321b9,  0x21c72725,  0x21bd21c1,  0x21cb1e81,  0x21d321cf,  0x1e8321cd,  0x21df21db,  0x21f52727,  0x22032215,  0x22091e89,  0x1e851e87,  0x1f6d1f6b,  0x220b2217,  0x1ebb2470,  0x221f221d,  0x222b2221,  0x27312227,  0x22351e8b,  0x2242222f,  0x27352246,  0x22392248,  0x1e8d224c,  0x2250224e,  0x22582252,  0x225c2737,  0x22621e8f,  0x22642739,  0x226a1e91,  0x22762270,  0x273b2278,  0x273d2711,  0x273f2288,  0x2292228e,  0x2298228a,  0x22a822a0,  0x22a422a2,  0x22ac22aa,  0x229e2741,  0x22ba22b8,  0x22c41e93,  0x274322c2,  0x22d222b4,  0x27472745,  0x22de22d4,  0x22da22dc,  0x22e01e95,  0x22e622e8,  0x26f922ec,  0x274922f4,  0x274d22fa,  0x230a2304,  0x274f2314,  0x2320231e,  0x27532751,  0x2336232e,  0x23381e97,  0x1e991e99,  0x23462344,  0x234c234a,  0x1e9b2352,  0x2755235e,  0x2757236c,  0x27192372,  0x2759237a,  0x275d275b,  0x1e9f1e9d,  0x27612396,  0x2763275f,  0x239a2765,  0x239c239c,  0x1ea323a0,  0x1ea523a2,  0x27691ea7,  0x23b023ac,  0x1ea923b6,  0x23c8276b,  0x276f276d,  0x23e423d8,  0x23e81eab,  0x23ec23ea,  0x27732771,  0x23f82773,  0x27751ead,  0x24042402,  0x27771eaf,  0x1eb12412,  0x2416241a,  0x277b241e,  0x1eb3242a,  0x24342430,  0x1eb5243c,  0x2781277f,  0x27831eb7,  0x27852448,  0x2454244e,  0x27872458,  0x24622789,  0x2466278b,  0x1eb9272b,  0x24742472,  0x24761ebd,  0x278d20a6,  0x272d278f,  0x2486272f,  0x25942488,  0x249e1ebf,  0x24a0249c,  0x24a21fa9,  0x24a624a4,  0x279124aa,  0x24ac24a8,  0x24b824b6,  0x24ba24ae,  0x24ce24c4,  0x24be24b4,  0x24c224c0,  0x27972793,  0x1ec12795,  0x24d424d2,  0x279f24d8,  0x279924da,  0x1ec51ec3,  0x279d279b,  0x24ea1ec7,  0x24ee24ec,  0x24f624f0,  0x24fa24f4,  0x250024f8,  0x24fe24fc,  0x1ec92502,  0x25082506,  0x25101ecb,  0x27a12512,  0x251a2518,  0x25201ecd,  0x27a31e67,  0x1ecf27a5,  0x25361ed1,  0x25502542,  0x27a72558,  0x25642562,  0x25762570,  0x26ff27ab,  0x257a257c,  0x27012580,  0x258c2586,  0x27af27ad,  0x25b225ac,  0x27b125b6,  0x25cc25b8,  0x25d425d2,  0x25da25d0,  0x27b325dc,  0x1ed325e2,  0x27b525e6,  0x26021ed5,  0x260e20ee,  0x27bb27b7,  0x1ed91ed7,  0x27bd2622,  0x27bf1edb,  0x262e262e,  0x27c12632,  0x1edd263e,  0x264c2646,  0x26542650,  0x27c31edf,  0x266c265e,  0x1ee12672,  0x26741ee3,  0x1ee527c5,  0x27c927c7,  0x268627cb,  0x26901ee7,  0x26962694,  0x269e269a,  0x27cf26a2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//12288 bytes
++enum canonMappingTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x240], [ 0x100,  0x400,  0x1380], [ 0x2020100,  0x3020202,  0x2020204,  0x2050202,  0x2020202,  0x6020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x10000,  0x30002,  0x50004,  0x6,  0x0,  0x70000,  0x90008,  0xb000a,  0xc0000,  0x0,  0x0,  0xd,  0xe0000,  0x0,  0x0,  0x0,  0x0,  0x10000f,  0x110000,  0x130012,  0x0,  0x140000,  0x160015,  0x170000,  0x180000,  0x190000,  0x1a0000,  0x0,  0x0,  0x1b0000,  0x1c,  0x1d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1f001e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x210020,  0x230022,  0x250024,  0x270026,  0x28,  0x0,  0x29,  0x2b002a,  0x2d002c,  0x2f002e,  0x30,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x310000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x320000,  0x340033,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x360035,  0x380037,  0x3a0039,  0x3c003b,  0x3e003d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f,  0x40,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x410000,  0x430042,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x450044,  0x470046,  0x490048,  0x4b004a,  0x4c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf000c,  0x250012,  0x4f0045,  0x850000,  0xa1009e,  0xcb00a4,  0x121011e,  0x1330124,  0x1880000,  0x1a0019d,  0x1b601a3,  0x1da,  0x26d0000,  0x2730270,  0x2f30287,  0x0,  0x322031f,  0x3380325,  0x3620358,  0x3980000,  0x3b403b1,  0x3de03b7,  0x4370434,  0x446043a,  0x49c0000,  0x4b404b1,  0x4ca04b7,  0x4ee,  0x5840000,  0x58a0587,  0x60d059e,  0x61c0000,  0x33b0028,  0x33e002b,  0x380006d,  0x38c0079,  0x38f007c,  0x392007f,  0x3950082,  0x3a2008f,  0x0,  0x3cd00ba,  0x3d800c5,  0x3db00c8,  0x3fb00e8,  0x3e400d1,  0x40a00f7,  0x41000fd,  0x4130100,  0x4190106,  0x41c0109,  0x0,  0x43d0127,  0x440012a,  0x443012d,  0x45c0149,  0x130,  0x0,  0x462014f,  0x471015d,  0x1630000,  0x1700477,  0x1660484,  0x47a,  0x0,  0x1850000,  0x1940499,  0x18e04a8,  0x4a2,  0x0,  0x4d901c5,  0x4e401d0,  0x4f801e4,  0x0,  0x52f021b,  0x5450231,  0x5350221,  0x54b0237,  0x552023e,  0x5690255,  0x5580244,  0x57b0264,  0x572025b,  0x0,  0x58d0276,  0x594027d,  0x59b0284,  0x5b4029d,  0x5b702a0,  0x5e002c9,  0x5f502de,  0x61002f6,  0x30b0302,  0x3110628,  0x314062e,  0x631,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x50401f0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2ac0000,  0x5c3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x560000,  0x13d0369,  0x1e70450,  0x2a304fb,  0x29205ba,  0x28e05a9,  0x29605a5,  0x28a05ad,  0x5a1,  0x35b0048,  0x3540041,  0x653064a,  0x0,  0x4160103,  0x46b0157,  0x522020e,  0x5250211,  0x65f065c,  0x465,  0x0,  0x40700f4,  0x0,  0x4960182,  0x3650052,  0x6500647,  0x656064d,  0x36c0059,  0x36f005c,  0x3e700d4,  0x3ea00d7,  0x4530140,  0x4560143,  0x4fe01ea,  0x50101ed,  0x5380224,  0x53b0227,  0x5bd02a6,  0x5c002a9,  0x5660252,  0x5780261,  0x0,  0x4250112,  0x0,  0x0,  0x0,  0x351003e,  0x3f400e1,  0x4f101dd,  0x4d101bd,  0x4e701d3,  0x4ea01d6,  0x61602fc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000d,  0x66b0000,  0x137,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x662,  0x0,  0x0,  0x0,  0x0,  0x1,  0x0,  0x0,  0x63d0000,  0x6450670,  0x6df06c3,  0x72c,  0x759,  0x7980778,  0x8d1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7810735,  0x84707e9,  0x8c10867,  0x92f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x92808ca,  0x91f08fd,  0x95f,  0x0,  0x9b40000,  0x9b7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9cc09c6,  0x9c30000,  0x0,  0x9ba0000,  0x0,  0x0,  0x9d809e4,  0x9ed,  0x0,  0x0,  0x0,  0x0,  0x9de0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa0e0a08,  0xa050000,  0x0,  0xa410000,  0x0,  0x0,  0xa1a0a26,  0xa2f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa470a44,  0x0,  0x0,  0x0,  0x0,  0x9cf0000,  0xa11,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9ff09bd,  0xa0209c0,  0x0,  0xa0b09c9,  0x0,  0xa4d0a4a,  0xa1409d2,  0xa1709d5,  0x0,  0xa1d09db,  0xa2309e1,  0xa2909e7,  0x0,  0xa530a50,  0xa3e09fc,  0xa2c09ea,  0xa3209f0,  0xa3509f3,  0xa3809f6,  0x0,  0xa3b09f9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xac10abe,  0xac40ac7,  0xaca,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xad3,  0xacd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xad00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xae80000,  0x0,  0x0,  0x0,  0xaf10000,  0x0,  0xaf4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xad90ad6,  0xadf0adc,  0xae50ae2,  0xaee0aeb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb000000,  0xb03,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xafa0af7,  0xafd0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb120000,  0x0,  0xb15,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb060000,  0xb0c0b09,  0x0,  0xb0f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb21,  0xb1e0000,  0xb24,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb1b0b18,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb27,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb300b2a,  0xb2d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb33,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb36,  0x0,  0x0,  0xb400000,  0xb43,  0xb3c0b39,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb4c0b46,  0xb49,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb4f,  0xb550b52,  0xb59,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb5f0000,  0x0,  0x0,  0x0,  0x0,  0xb620000,  0x0,  0x0,  0xb65,  0x0,  0xb680000,  0x0,  0x0,  0xb6b,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb5c0000,  0x0,  0x0,  0x0,  0x0,  0xb6e0000,  0xb710000,  0xb89,  0xb8c,  0x0,  0x0,  0x0,  0xb740000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb7a0000,  0x0,  0x0,  0x0,  0x0,  0xb7d0000,  0x0,  0x0,  0xb80,  0x0,  0xb830000,  0x0,  0x0,  0xb86,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb770000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb8f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xb92,  0xb95,  0xb98,  0xb9b,  0xb9e,  0x0,  0xba1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xba40000,  0xba70000,  0x0,  0xbad0baa,  0xbb00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x37d006a,  0x3830070,  0x3860073,  0x3890076,  0x39b0088,  0x39f008c,  0x3a50092,  0x3ae009b,  0x3a80095,  0x3ab0098,  0x3d000bd,  0x3d400c1,  0x3fe00eb,  0x40100ee,  0x3f700e4,  0x40400f1,  0x40d00fa,  0x41f010c,  0x4280115,  0x422010f,  0x42b0118,  0x42e011b,  0x45f014c,  0x4490136,  0x4680154,  0x46e015a,  0x4740160,  0x47d0169,  0x480016c,  0x48a0176,  0x4870173,  0x48d0179,  0x490017c,  0x493017f,  0x49f018b,  0x4a50191,  0x4ae019a,  0x4ab0197,  0x4cd01b9,  0x4d501c1,  0x4dc01c8,  0x4e001cc,  0x5290215,  0x52c0218,  0x532021e,  0x53e022a,  0x541022d,  0x5480234,  0x5550241,  0x55f024b,  0x54e023a,  0x55b0247,  0x562024e,  0x56c0258,  0x575025e,  0x581026a,  0x57e0267,  0x5dd02c6,  0x5e602cf,  0x5e302cc,  0x5900279,  0x5970280,  0x5e902d2,  0x5ec02d5,  0x5ef02d8,  0x5f202db,  0x5fb02e4,  0x5f802e1,  0x60102e7,  0x60402ea,  0x60702ed,  0x61902ff,  0x62b030e,  0x6340317,  0x637031a,  0x56f0431,  0x62205fe,  0x6590000,  0x0,  0x0,  0x372005f,  0x35f004c,  0x32c0019,  0x3280015,  0x3340021,  0x330001d,  0x3750062,  0x3450032,  0x341002e,  0x34d003a,  0x3490036,  0x3790066,  0x3ed00da,  0x3e100ce,  0x3ca00b7,  0x3be00ab,  0x3ba00a7,  0x3c600b3,  0x3c200af,  0x3f000dd,  0x44d013a,  0x4590146,  0x51b0207,  0x4f501e1,  0x4be01aa,  0x4ba01a6,  0x4c601b2,  0x4c201ae,  0x51e020a,  0x50b01f7,  0x50701f3,  0x51301ff,  0x50f01fb,  0x5170203,  0x5da02c3,  0x5b1029a,  0x5ca02b3,  0x5c602af,  0x5d202bb,  0x5ce02b7,  0x5d602bf,  0x60a02f0,  0x6250308,  0x61f0305,  0x61302f9,  0x0,  0x0,  0x0,  0x81807f6,  0x81b07f9,  0x8240802,  0x82d080b,  0x69b0679,  0x69e067c,  0x6a70685,  0x6b0068e,  0x855084a,  0x858084d,  0x85c0851,  0x0,  0x6d106c6,  0x6d406c9,  0x6d806cd,  0x0,  0x890086e,  0x8930871,  0x89c087a,  0x8a50883,  0x70406e2,  0x70706e5,  0x71006ee,  0x71906f7,  0x8e808d9,  0x8eb08dc,  0x8ef08e0,  0x8f308e4,  0x7470738,  0x74a073b,  0x74e073f,  0x7520743,  0x90b0900,  0x90e0903,  0x9120907,  0x0,  0x767075c,  0x76a075f,  0x76e0763,  0x0,  0x9460937,  0x949093a,  0x94d093e,  0x9510942,  0x7840000,  0x7870000,  0x78b0000,  0x78f0000,  0x9880966,  0x98b0969,  0x9940972,  0x99d097b,  0x7bd079b,  0x7c0079e,  0x7c907a7,  0x7d207b0,  0x7e907e2,  0x8470844,  0x8670860,  0x8c108be,  0x8fd08fa,  0x91f091c,  0x95f0958,  0x0,  0x8360814,  0x81f07fd,  0x8280806,  0x831080f,  0x6b90697,  0x6a20680,  0x6ab0689,  0x6b40692,  0x8ae088c,  0x8970875,  0x8a0087e,  0x8a90887,  0x7220700,  0x70b06e9,  0x71406f2,  0x71d06fb,  0x9a60984,  0x98f096d,  0x9980976,  0x9a1097f,  0x7db07b9,  0x7c407a2,  0x7cd07ab,  0x7d607b4,  0x7f007f3,  0x84107e5,  0x7ec,  0x83d083a,  0x6730676,  0x670066d,  0x6bd,  0x8bc,  0x6400000,  0x8b90863,  0x86a,  0x8b508b2,  0x6c306c0,  0x6df06dc,  0xbb30726,  0xbb90bb6,  0x8c408c7,  0x8d108cd,  0x0,  0x8d508f7,  0x72f0732,  0x72c0729,  0xbbc0000,  0xbc20bbf,  0x9220925,  0x92f092b,  0x9190916,  0x9330955,  0x77b077e,  0x7780775,  0x63a0772,  0x31d063d,  0x0,  0x9b1095b,  0x962,  0x9ad09aa,  0x7590756,  0x7980795,  0x64307df,  0x0,  0xbc70bc5,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x793,  0x0,  0x4f0152,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbcc0bc9,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbcf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbd20000,  0xbd50bd8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbdb,  0x0,  0xbde0000,  0x0,  0xbe1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbe4,  0xbe7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbea0000,  0x0,  0xbed,  0xbf00000,  0xbf30000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6,  0xbf9,  0x0,  0x0,  0x0,  0x0,  0xbf60000,  0x90003,  0xbff0bfc,  0x0,  0xc050c02,  0x0,  0xc0b0c08,  0x0,  0x0,  0x0,  0xc110c0e,  0x0,  0xc1d0c1a,  0x0,  0xc230c20,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc2f0c2c,  0xc350c32,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc170c14,  0xc290c26,  0x0,  0x0,  0x0,  0xc3b0c38,  0xc410c3e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc470000,  0xc49,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc44,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc4e,  0xc51,  0xc54,  0xc57,  0xc5a,  0xc5d,  0xc60,  0xc63,  0xc66,  0xc69,  0xc6c,  0xc6f,  0xc720000,  0xc750000,  0xc780000,  0x0,  0x0,  0x0,  0xc7e0c7b,  0xc810000,  0xc84,  0xc8a0c87,  0xc8d0000,  0xc90,  0xc960c93,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc4b,  0x0,  0x0,  0x0,  0x0,  0xc99,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc9f,  0xca2,  0xca5,  0xca8,  0xcab,  0xcae,  0xcb1,  0xcb4,  0xcb7,  0xcba,  0xcbd,  0xcc0,  0xcc30000,  0xcc60000,  0xcc90000,  0x0,  0x0,  0x0,  0xccf0ccc,  0xcd20000,  0xcd5,  0xcdb0cd8,  0xcde0000,  0xce1,  0xce70ce4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc9c,  0xcea0000,  0xcf00ced,  0xcf3,  0x0,  0xcf6,  0xfb71241,  0x124b125d,  0xd831043,  0x13270e29,  0xe991327,  0xe4f1293,  0xf550e97,  0x116710cd,  0x11fd11e3,  0x12791215,  0x10190feb,  0x109d1069,  0x128911c7,  0xd8d12f3,  0xff50e1d,  0x11e11079,  0xedb1309,  0x11d91051,  0xf65121d,  0x12031189,  0xfbd0eff,  0x108d1025,  0xd9d127d,  0xe050dd9,  0xff10f95,  0x10d31077,  0x11dd1171,  0x125911e7,  0x12fb12cf,  0x10e91307,  0x114d1107,  0x12a111b9,  0x122f130b,  0xf0b0e87,  0x117d112f,  0x10ed1083,  0x12cb1249,  0xecb0e85,  0x102f0fed,  0x11471047,  0x12b11159,  0x117f0e03,  0xddd0ddf,  0x114f1115,  0x12b511c5,  0xf67123d,  0x12350feb,  0xebb0d87,  0x10950f27,  0xe1110c1,  0xda510f1,  0xd7f0f1b,  0xf9d1011,  0xe231145,  0x10d70e7d,  0x122711c9,  0x126d1005,  0xf6f100d,  0xf7b11a5,  0xd9110bf,  0xddb0dc3,  0x113d0fdb,  0x122d1195,  0xe091291,  0xe9f0e37,  0xfa10f07,  0x10f31053,  0x12f712ab,  0x1313130d,  0xfb50df9,  0x12690ffd,  0xf490ef3,  0xf910f57,  0x106d104b,  0x111110af,  0x11791153,  0x11cd1261,  0x12a31271,  0xdfb0de9,  0x10670e41,  0x1227120b,  0xf230efd,  0x10030f77,  0x1091112d,  0xe670d97,  0xee50ebb,  0x109b0f29,  0x116b10a9,  0x12951175,  0x12d112c9,  0xd9f12dd,  0x128d110f,  0xf3512c1,  0xdb10d8f,  0xec70ebd,  0xfeb0f9f,  0x10cb1073,  0x127711d3,  0xfad1323,  0xdf712af,  0xfd10fcb,  0x103b1021,  0x10bd10a1,  0x114310e7,  0xdc512e3,  0x12b70f5d,  0xed70da9,  0x12631031,  0xf390f17,  0x10950fd5,  0xdeb12bb,  0xecf0e31,  0xfc30fa7,  0x10150fe1,  0x10c3109f,  0x120d1163,  0x128f1213,  0xe1312c5,  0xe33103d,  0x10b11075,  0x12bd11db,  0x130f12ff,  0x102d0fcf,  0x1121118b,  0x11331125,  0x1063108b,  0xd93123b,  0xded11ad,  0xef50de7,  0x11390f69,  0x101b0eb5,  0x12670fb3,  0x12b31205,  0xf031221,  0xe590db5,  0x0,  0xe7b,  0xfab,  0xde10000,  0x10cf108f,  0x110310f5,  0x110d1105,  0x113512d3,  0x116d,  0x11df,  0x1233,  0x12730000,  0x1283,  0x0,  0x12e912e7,  0x130512eb,  0x12bf127f,  0xdb30da1,  0xe010db9,  0xe170e07,  0xe5f0e53,  0xe790e63,  0xecd0e7f,  0xf2f0ed1,  0xf470f43,  0xf970f53,  0xfaf0fa3,  0x10270fdd,  0x10491035,  0x107d106f,  0x10eb10a3,  0x10fb10f7,  0x10fd10f9,  0x110110ff,  0x110b1109,  0x111d1117,  0x11531127,  0x115b1157,  0x11731161,  0x1197118d,  0x11cb1197,  0x12231219,  0x12391237,  0x124f124d,  0x1273126f,  0x12d912c7,  0xf2b12e1,  0x119313be,  0x0,  0xdd70d81,  0xd9b0dc1,  0xdc90db7,  0xe0b0dff,  0xe490e53,  0xe5d0e51,  0xe830e7b,  0xe9b0e95,  0xeb10ea9,  0xf050f01,  0xf1d0f13,  0xf3f0f33,  0xf470f37,  0xf530f41,  0xf7f0f5f,  0xf890f85,  0xfab0f99,  0xfbf0fbd,  0xfff0fc7,  0x10211005,  0x10411045,  0x10571049,  0x10e3106f,  0x1089107f,  0x10ab108f,  0x10b910b5,  0x10c910c7,  0x10d110cf,  0x10df10d5,  0x10ef10dd,  0x1127111f,  0x11491131,  0x115f1153,  0x11af1173,  0x11f911c3,  0x121f121b,  0x12291223,  0x122b1233,  0x12351237,  0x12391231,  0x124f123f,  0x12751265,  0x1299128b,  0x12c712b9,  0x12d512d3,  0x12db12d9,  0x12f912e1,  0x13941327,  0x13a61392,  0xd370d23,  0x13da0d39,  0x141c13ec,  0x13251321,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa7a0000,  0xabb0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xab50ab2,  0xaae0aaa,  0xa590a56,  0xa5f0a5c,  0xa680a65,  0xa710a6b,  0xa74,  0xa7d0a77,  0xa830a80,  0xa89,  0xa8c,  0xa920a8f,  0xa950000,  0xa98,  0xaa10a9e,  0xaa70aa4,  0xa6e0ab8,  0xa860a62,  0xa9b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1329,  0x132c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x132f0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13351332,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x133b1338,  0x1342133e,  0x134a1346,  0x134e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13520000,  0x1355135d,  0x13591360,  0x1364,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xd850d89,  0x13680d8b,  0xda10d99,  0xda70da3,  0xdad0dab,  0xdaf0db3,  0x13700cf9,  0xdbb0db9,  0xdc70dbd,  0xcfb136a,  0xdcb0dbf,  0xdd1136e,  0xd950dd3,  0xdd70dd5,  0xde3142c,  0xcff0de5,  0xdf10def,  0xdf50df3,  0xdff0d01,  0xe070e01,  0xe0d0e0b,  0xe110e0f,  0xe170e15,  0xe1b0e19,  0xe210e1f,  0xe210e21,  0x105d1376,  0xe270e25,  0xe2b1378,  0xe2f0e2d,  0xe350e3d,  0xe3b0e39,  0xe430e3f,  0xe470e45,  0xe4d0e4b,  0xe510e4d,  0xe570e55,  0xe690e5b,  0xe6b0e5f,  0xe650e61,  0xe890de7,  0xe710e6f,  0xe6d0e73,  0xe750e77,  0x137a0e81,  0xe8d0e8b,  0xe910e8f,  0xe9d0e93,  0x137e137c,  0xea50ea3,  0xea10ea7,  0xd030eab,  0xeaf0d05,  0xeb30eb3,  0xeb71380,  0xebb0eb9,  0x13820ebf,  0xec30ec1,  0xec50f0f,  0xec90d07,  0xed50ed1,  0x13860ed3,  0x13880ed9,  0xedd0edf,  0xee70ee1,  0xd090ee9,  0xeed0eeb,  0xef10eef,  0x138a0d0b,  0xef70d0d,  0xefb0ef9,  0x14400eff,  0x138e0f09,  0x118f138e,  0xf0d0f0d,  0x139c0d0f,  0xf1113f0,  0xd110f15,  0xf1f0f19,  0xf250f21,  0xd150f2d,  0xf2f0d13,  0xf311390,  0xf3d0f3b,  0xf3d0f3f,  0xf470f45,  0xf4b0f4f,  0xf510f4d,  0xf550f53,  0xf5b0f59,  0xf630f61,  0xf730f6b,  0xf711396,  0xf750f6d,  0xf830f79,  0xf871398,  0xf7d0f81,  0xf8b0d17,  0xf930f8f,  0xd190f8d,  0xf9b0f97,  0xfa5139a,  0xfa90fb9,  0xfaf0d1f,  0xd1b0d1d,  0xdcf0dcd,  0xfb10fbb,  0xd511181,  0xfbf0fbd,  0xfc90fc1,  0x13a40fc5,  0xfd30d21,  0xfd90fcd,  0x13a80fdd,  0xfd70fdf,  0xd230fe3,  0xfe70fe5,  0xfef0fe9,  0xff313aa,  0xff70d25,  0xff913ac,  0xffb0d27,  0x10051001,  0x13ae1007,  0x13b01384,  0x13b21009,  0x1013100f,  0x1017100b,  0x1027101f,  0x10231021,  0x102b1029,  0x101d13b4,  0x10391037,  0x10410d29,  0x13b6103f,  0x104d1033,  0x13ba13b8,  0x1059104f,  0x10551057,  0x105b0d2b,  0x105f1061,  0x136c1065,  0x13bc106b,  0x13c01071,  0x107f107b,  0x13c21081,  0x10871085,  0x13c613c4,  0x10971093,  0x10990d2d,  0xd2f0d2f,  0x10a710a5,  0x10ad10ab,  0xd3110b3,  0x13c810b7,  0x13ca10bb,  0x138c10c1,  0x13cc10c5,  0x13d013ce,  0xd350d33,  0x13d410d5,  0x13d613d2,  0x10d913d8,  0x10db10db,  0xd3910df,  0xd3b10e1,  0x13dc0d3d,  0x10e910e5,  0xd3f10ef,  0x10ff13de,  0x13e213e0,  0x1113110d,  0x11170d41,  0x111b1119,  0x13e613e4,  0x112313e6,  0x13e80d43,  0x112b1129,  0x13ea0d45,  0xd471137,  0x113b113f,  0x13ee1141,  0xd49114b,  0x11551151,  0xd4b115d,  0x13f413f2,  0x13f60d4d,  0x13f81165,  0x116f1169,  0x13fa1173,  0x117713fc,  0x117b13fe,  0xd4f139e,  0x11851183,  0x11870d53,  0x14000ead,  0x13a01402,  0x118f13a2,  0x126b1191,  0x119b0d55,  0x119d1199,  0x119f0dfd,  0x11a311a1,  0x140411a7,  0x11a911a5,  0x11b511b3,  0x11b711ab,  0x11cb11c1,  0x11bb11b1,  0x11bf11bd,  0x140a1406,  0xd571408,  0x11d111cf,  0x141211d5,  0x140c11d7,  0xd5b0d59,  0x1410140e,  0x11e50d5d,  0x11e911e7,  0x11ef11eb,  0x11f311ed,  0x11f911f1,  0x11f711f5,  0xd5f11fb,  0x120111ff,  0x12070d61,  0x14141209,  0x1211120f,  0x12170d63,  0x14160cfd,  0xd651418,  0x12250d67,  0x123f1231,  0x141a1243,  0x12471245,  0x12531251,  0x1372141e,  0x12551257,  0x1374125b,  0x1265125f,  0x14221420,  0x1281127b,  0x14241285,  0x12971287,  0x129f129d,  0x12a5129b,  0x142612a7,  0xd6912a9,  0x142812ad,  0x12c30d6b,  0x12cd0ee3,  0x142e142a,  0xd6f0d6d,  0x143012d7,  0x14320d71,  0x12db12db,  0x143412df,  0xd7312e5,  0x12ef12ed,  0x12f512f1,  0x14360d75,  0x12fd12f9,  0xd771301,  0x13030d79,  0xd7b1438,  0x143c143a,  0x1311143e,  0x13150d7d,  0x13191317,  0x131d131b,  0x1442131f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++@property
++{
++private alias _IDCA = immutable(dchar[]);
++_IDCA decompCanonTable() { static _IDCA t = [ 0x0,  0x3b,  0x0,  0x3c,  0x338,  0x0,  0x3d,  0x338,  0x0,  0x3e,  0x338,  0x0,  0x41,  0x300,  0x0,  0x41,  0x301,  0x0,  0x41,  0x302,  0x0,  0x41,  0x302,  0x300,  0x0,  0x41,  0x302,  0x301,  0x0,  0x41,  0x302,  0x303,  0x0,  0x41,  0x302,  0x309,  0x0,  0x41,  0x303,  0x0,  0x41,  0x304,  0x0,  0x41,  0x306,  0x0,  0x41,  0x306,  0x300,  0x0,  0x41,  0x306,  0x301,  0x0,  0x41,  0x306,  0x303,  0x0,  0x41,  0x306,  0x309,  0x0,  0x41,  0x307,  0x0,  0x41,  0x307,  0x304,  0x0,  0x41,  0x308,  0x0,  0x41,  0x308,  0x304,  0x0,  0x41,  0x309,  0x0,  0x41,  0x30a,  0x0,  0x41,  0x30a,  0x301,  0x0,  0x41,  0x30c,  0x0,  0x41,  0x30f,  0x0,  0x41,  0x311,  0x0,  0x41,  0x323,  0x0,  0x41,  0x323,  0x302,  0x0,  0x41,  0x323,  0x306,  0x0,  0x41,  0x325,  0x0,  0x41,  0x328,  0x0,  0x42,  0x307,  0x0,  0x42,  0x323,  0x0,  0x42,  0x331,  0x0,  0x43,  0x301,  0x0,  0x43,  0x302,  0x0,  0x43,  0x307,  0x0,  0x43,  0x30c,  0x0,  0x43,  0x327,  0x0,  0x43,  0x327,  0x301,  0x0,  0x44,  0x307,  0x0,  0x44,  0x30c,  0x0,  0x44,  0x323,  0x0,  0x44,  0x327,  0x0,  0x44,  0x32d,  0x0,  0x44,  0x331,  0x0,  0x45,  0x300,  0x0,  0x45,  0x301,  0x0,  0x45,  0x302,  0x0,  0x45,  0x302,  0x300,  0x0,  0x45,  0x302,  0x301,  0x0,  0x45,  0x302,  0x303,  0x0,  0x45,  0x302,  0x309,  0x0,  0x45,  0x303,  0x0,  0x45,  0x304,  0x0,  0x45,  0x304,  0x300,  0x0,  0x45,  0x304,  0x301,  0x0,  0x45,  0x306,  0x0,  0x45,  0x307,  0x0,  0x45,  0x308,  0x0,  0x45,  0x309,  0x0,  0x45,  0x30c,  0x0,  0x45,  0x30f,  0x0,  0x45,  0x311,  0x0,  0x45,  0x323,  0x0,  0x45,  0x323,  0x302,  0x0,  0x45,  0x327,  0x0,  0x45,  0x327,  0x306,  0x0,  0x45,  0x328,  0x0,  0x45,  0x32d,  0x0,  0x45,  0x330,  0x0,  0x46,  0x307,  0x0,  0x47,  0x301,  0x0,  0x47,  0x302,  0x0,  0x47,  0x304,  0x0,  0x47,  0x306,  0x0,  0x47,  0x307,  0x0,  0x47,  0x30c,  0x0,  0x47,  0x327,  0x0,  0x48,  0x302,  0x0,  0x48,  0x307,  0x0,  0x48,  0x308,  0x0,  0x48,  0x30c,  0x0,  0x48,  0x323,  0x0,  0x48,  0x327,  0x0,  0x48,  0x32e,  0x0,  0x49,  0x300,  0x0,  0x49,  0x301,  0x0,  0x49,  0x302,  0x0,  0x49,  0x303,  0x0,  0x49,  0x304,  0x0,  0x49,  0x306,  0x0,  0x49,  0x307,  0x0,  0x49,  0x308,  0x0,  0x49,  0x308,  0x301,  0x0,  0x49,  0x309,  0x0,  0x49,  0x30c,  0x0,  0x49,  0x30f,  0x0,  0x49,  0x311,  0x0,  0x49,  0x323,  0x0,  0x49,  0x328,  0x0,  0x49,  0x330,  0x0,  0x4a,  0x302,  0x0,  0x4b,  0x0,  0x4b,  0x301,  0x0,  0x4b,  0x30c,  0x0,  0x4b,  0x323,  0x0,  0x4b,  0x327,  0x0,  0x4b,  0x331,  0x0,  0x4c,  0x301,  0x0,  0x4c,  0x30c,  0x0,  0x4c,  0x323,  0x0,  0x4c,  0x323,  0x304,  0x0,  0x4c,  0x327,  0x0,  0x4c,  0x32d,  0x0,  0x4c,  0x331,  0x0,  0x4d,  0x301,  0x0,  0x4d,  0x307,  0x0,  0x4d,  0x323,  0x0,  0x4e,  0x300,  0x0,  0x4e,  0x301,  0x0,  0x4e,  0x303,  0x0,  0x4e,  0x307,  0x0,  0x4e,  0x30c,  0x0,  0x4e,  0x323,  0x0,  0x4e,  0x327,  0x0,  0x4e,  0x32d,  0x0,  0x4e,  0x331,  0x0,  0x4f,  0x300,  0x0,  0x4f,  0x301,  0x0,  0x4f,  0x302,  0x0,  0x4f,  0x302,  0x300,  0x0,  0x4f,  0x302,  0x301,  0x0,  0x4f,  0x302,  0x303,  0x0,  0x4f,  0x302,  0x309,  0x0,  0x4f,  0x303,  0x0,  0x4f,  0x303,  0x301,  0x0,  0x4f,  0x303,  0x304,  0x0,  0x4f,  0x303,  0x308,  0x0,  0x4f,  0x304,  0x0,  0x4f,  0x304,  0x300,  0x0,  0x4f,  0x304,  0x301,  0x0,  0x4f,  0x306,  0x0,  0x4f,  0x307,  0x0,  0x4f,  0x307,  0x304,  0x0,  0x4f,  0x308,  0x0,  0x4f,  0x308,  0x304,  0x0,  0x4f,  0x309,  0x0,  0x4f,  0x30b,  0x0,  0x4f,  0x30c,  0x0,  0x4f,  0x30f,  0x0,  0x4f,  0x311,  0x0,  0x4f,  0x31b,  0x0,  0x4f,  0x31b,  0x300,  0x0,  0x4f,  0x31b,  0x301,  0x0,  0x4f,  0x31b,  0x303,  0x0,  0x4f,  0x31b,  0x309,  0x0,  0x4f,  0x31b,  0x323,  0x0,  0x4f,  0x323,  0x0,  0x4f,  0x323,  0x302,  0x0,  0x4f,  0x328,  0x0,  0x4f,  0x328,  0x304,  0x0,  0x50,  0x301,  0x0,  0x50,  0x307,  0x0,  0x52,  0x301,  0x0,  0x52,  0x307,  0x0,  0x52,  0x30c,  0x0,  0x52,  0x30f,  0x0,  0x52,  0x311,  0x0,  0x52,  0x323,  0x0,  0x52,  0x323,  0x304,  0x0,  0x52,  0x327,  0x0,  0x52,  0x331,  0x0,  0x53,  0x301,  0x0,  0x53,  0x301,  0x307,  0x0,  0x53,  0x302,  0x0,  0x53,  0x307,  0x0,  0x53,  0x30c,  0x0,  0x53,  0x30c,  0x307,  0x0,  0x53,  0x323,  0x0,  0x53,  0x323,  0x307,  0x0,  0x53,  0x326,  0x0,  0x53,  0x327,  0x0,  0x54,  0x307,  0x0,  0x54,  0x30c,  0x0,  0x54,  0x323,  0x0,  0x54,  0x326,  0x0,  0x54,  0x327,  0x0,  0x54,  0x32d,  0x0,  0x54,  0x331,  0x0,  0x55,  0x300,  0x0,  0x55,  0x301,  0x0,  0x55,  0x302,  0x0,  0x55,  0x303,  0x0,  0x55,  0x303,  0x301,  0x0,  0x55,  0x304,  0x0,  0x55,  0x304,  0x308,  0x0,  0x55,  0x306,  0x0,  0x55,  0x308,  0x0,  0x55,  0x308,  0x300,  0x0,  0x55,  0x308,  0x301,  0x0,  0x55,  0x308,  0x304,  0x0,  0x55,  0x308,  0x30c,  0x0,  0x55,  0x309,  0x0,  0x55,  0x30a,  0x0,  0x55,  0x30b,  0x0,  0x55,  0x30c,  0x0,  0x55,  0x30f,  0x0,  0x55,  0x311,  0x0,  0x55,  0x31b,  0x0,  0x55,  0x31b,  0x300,  0x0,  0x55,  0x31b,  0x301,  0x0,  0x55,  0x31b,  0x303,  0x0,  0x55,  0x31b,  0x309,  0x0,  0x55,  0x31b,  0x323,  0x0,  0x55,  0x323,  0x0,  0x55,  0x324,  0x0,  0x55,  0x328,  0x0,  0x55,  0x32d,  0x0,  0x55,  0x330,  0x0,  0x56,  0x303,  0x0,  0x56,  0x323,  0x0,  0x57,  0x300,  0x0,  0x57,  0x301,  0x0,  0x57,  0x302,  0x0,  0x57,  0x307,  0x0,  0x57,  0x308,  0x0,  0x57,  0x323,  0x0,  0x58,  0x307,  0x0,  0x58,  0x308,  0x0,  0x59,  0x300,  0x0,  0x59,  0x301,  0x0,  0x59,  0x302,  0x0,  0x59,  0x303,  0x0,  0x59,  0x304,  0x0,  0x59,  0x307,  0x0,  0x59,  0x308,  0x0,  0x59,  0x309,  0x0,  0x59,  0x323,  0x0,  0x5a,  0x301,  0x0,  0x5a,  0x302,  0x0,  0x5a,  0x307,  0x0,  0x5a,  0x30c,  0x0,  0x5a,  0x323,  0x0,  0x5a,  0x331,  0x0,  0x60,  0x0,  0x61,  0x300,  0x0,  0x61,  0x301,  0x0,  0x61,  0x302,  0x0,  0x61,  0x302,  0x300,  0x0,  0x61,  0x302,  0x301,  0x0,  0x61,  0x302,  0x303,  0x0,  0x61,  0x302,  0x309,  0x0,  0x61,  0x303,  0x0,  0x61,  0x304,  0x0,  0x61,  0x306,  0x0,  0x61,  0x306,  0x300,  0x0,  0x61,  0x306,  0x301,  0x0,  0x61,  0x306,  0x303,  0x0,  0x61,  0x306,  0x309,  0x0,  0x61,  0x307,  0x0,  0x61,  0x307,  0x304,  0x0,  0x61,  0x308,  0x0,  0x61,  0x308,  0x304,  0x0,  0x61,  0x309,  0x0,  0x61,  0x30a,  0x0,  0x61,  0x30a,  0x301,  0x0,  0x61,  0x30c,  0x0,  0x61,  0x30f,  0x0,  0x61,  0x311,  0x0,  0x61,  0x323,  0x0,  0x61,  0x323,  0x302,  0x0,  0x61,  0x323,  0x306,  0x0,  0x61,  0x325,  0x0,  0x61,  0x328,  0x0,  0x62,  0x307,  0x0,  0x62,  0x323,  0x0,  0x62,  0x331,  0x0,  0x63,  0x301,  0x0,  0x63,  0x302,  0x0,  0x63,  0x307,  0x0,  0x63,  0x30c,  0x0,  0x63,  0x327,  0x0,  0x63,  0x327,  0x301,  0x0,  0x64,  0x307,  0x0,  0x64,  0x30c,  0x0,  0x64,  0x323,  0x0,  0x64,  0x327,  0x0,  0x64,  0x32d,  0x0,  0x64,  0x331,  0x0,  0x65,  0x300,  0x0,  0x65,  0x301,  0x0,  0x65,  0x302,  0x0,  0x65,  0x302,  0x300,  0x0,  0x65,  0x302,  0x301,  0x0,  0x65,  0x302,  0x303,  0x0,  0x65,  0x302,  0x309,  0x0,  0x65,  0x303,  0x0,  0x65,  0x304,  0x0,  0x65,  0x304,  0x300,  0x0,  0x65,  0x304,  0x301,  0x0,  0x65,  0x306,  0x0,  0x65,  0x307,  0x0,  0x65,  0x308,  0x0,  0x65,  0x309,  0x0,  0x65,  0x30c,  0x0,  0x65,  0x30f,  0x0,  0x65,  0x311,  0x0,  0x65,  0x323,  0x0,  0x65,  0x323,  0x302,  0x0,  0x65,  0x327,  0x0,  0x65,  0x327,  0x306,  0x0,  0x65,  0x328,  0x0,  0x65,  0x32d,  0x0,  0x65,  0x330,  0x0,  0x66,  0x307,  0x0,  0x67,  0x301,  0x0,  0x67,  0x302,  0x0,  0x67,  0x304,  0x0,  0x67,  0x306,  0x0,  0x67,  0x307,  0x0,  0x67,  0x30c,  0x0,  0x67,  0x327,  0x0,  0x68,  0x302,  0x0,  0x68,  0x307,  0x0,  0x68,  0x308,  0x0,  0x68,  0x30c,  0x0,  0x68,  0x323,  0x0,  0x68,  0x327,  0x0,  0x68,  0x32e,  0x0,  0x68,  0x331,  0x0,  0x69,  0x300,  0x0,  0x69,  0x301,  0x0,  0x69,  0x302,  0x0,  0x69,  0x303,  0x0,  0x69,  0x304,  0x0,  0x69,  0x306,  0x0,  0x69,  0x308,  0x0,  0x69,  0x308,  0x301,  0x0,  0x69,  0x309,  0x0,  0x69,  0x30c,  0x0,  0x69,  0x30f,  0x0,  0x69,  0x311,  0x0,  0x69,  0x323,  0x0,  0x69,  0x328,  0x0,  0x69,  0x330,  0x0,  0x6a,  0x302,  0x0,  0x6a,  0x30c,  0x0,  0x6b,  0x301,  0x0,  0x6b,  0x30c,  0x0,  0x6b,  0x323,  0x0,  0x6b,  0x327,  0x0,  0x6b,  0x331,  0x0,  0x6c,  0x301,  0x0,  0x6c,  0x30c,  0x0,  0x6c,  0x323,  0x0,  0x6c,  0x323,  0x304,  0x0,  0x6c,  0x327,  0x0,  0x6c,  0x32d,  0x0,  0x6c,  0x331,  0x0,  0x6d,  0x301,  0x0,  0x6d,  0x307,  0x0,  0x6d,  0x323,  0x0,  0x6e,  0x300,  0x0,  0x6e,  0x301,  0x0,  0x6e,  0x303,  0x0,  0x6e,  0x307,  0x0,  0x6e,  0x30c,  0x0,  0x6e,  0x323,  0x0,  0x6e,  0x327,  0x0,  0x6e,  0x32d,  0x0,  0x6e,  0x331,  0x0,  0x6f,  0x300,  0x0,  0x6f,  0x301,  0x0,  0x6f,  0x302,  0x0,  0x6f,  0x302,  0x300,  0x0,  0x6f,  0x302,  0x301,  0x0,  0x6f,  0x302,  0x303,  0x0,  0x6f,  0x302,  0x309,  0x0,  0x6f,  0x303,  0x0,  0x6f,  0x303,  0x301,  0x0,  0x6f,  0x303,  0x304,  0x0,  0x6f,  0x303,  0x308,  0x0,  0x6f,  0x304,  0x0,  0x6f,  0x304,  0x300,  0x0,  0x6f,  0x304,  0x301,  0x0,  0x6f,  0x306,  0x0,  0x6f,  0x307,  0x0,  0x6f,  0x307,  0x304,  0x0,  0x6f,  0x308,  0x0,  0x6f,  0x308,  0x304,  0x0,  0x6f,  0x309,  0x0,  0x6f,  0x30b,  0x0,  0x6f,  0x30c,  0x0,  0x6f,  0x30f,  0x0,  0x6f,  0x311,  0x0,  0x6f,  0x31b,  0x0,  0x6f,  0x31b,  0x300,  0x0,  0x6f,  0x31b,  0x301,  0x0,  0x6f,  0x31b,  0x303,  0x0,  0x6f,  0x31b,  0x309,  0x0,  0x6f,  0x31b,  0x323,  0x0,  0x6f,  0x323,  0x0,  0x6f,  0x323,  0x302,  0x0,  0x6f,  0x328,  0x0,  0x6f,  0x328,  0x304,  0x0,  0x70,  0x301,  0x0,  0x70,  0x307,  0x0,  0x72,  0x301,  0x0,  0x72,  0x307,  0x0,  0x72,  0x30c,  0x0,  0x72,  0x30f,  0x0,  0x72,  0x311,  0x0,  0x72,  0x323,  0x0,  0x72,  0x323,  0x304,  0x0,  0x72,  0x327,  0x0,  0x72,  0x331,  0x0,  0x73,  0x301,  0x0,  0x73,  0x301,  0x307,  0x0,  0x73,  0x302,  0x0,  0x73,  0x307,  0x0,  0x73,  0x30c,  0x0,  0x73,  0x30c,  0x307,  0x0,  0x73,  0x323,  0x0,  0x73,  0x323,  0x307,  0x0,  0x73,  0x326,  0x0,  0x73,  0x327,  0x0,  0x74,  0x307,  0x0,  0x74,  0x308,  0x0,  0x74,  0x30c,  0x0,  0x74,  0x323,  0x0,  0x74,  0x326,  0x0,  0x74,  0x327,  0x0,  0x74,  0x32d,  0x0,  0x74,  0x331,  0x0,  0x75,  0x300,  0x0,  0x75,  0x301,  0x0,  0x75,  0x302,  0x0,  0x75,  0x303,  0x0,  0x75,  0x303,  0x301,  0x0,  0x75,  0x304,  0x0,  0x75,  0x304,  0x308,  0x0,  0x75,  0x306,  0x0,  0x75,  0x308,  0x0,  0x75,  0x308,  0x300,  0x0,  0x75,  0x308,  0x301,  0x0,  0x75,  0x308,  0x304,  0x0,  0x75,  0x308,  0x30c,  0x0,  0x75,  0x309,  0x0,  0x75,  0x30a,  0x0,  0x75,  0x30b,  0x0,  0x75,  0x30c,  0x0,  0x75,  0x30f,  0x0,  0x75,  0x311,  0x0,  0x75,  0x31b,  0x0,  0x75,  0x31b,  0x300,  0x0,  0x75,  0x31b,  0x301,  0x0,  0x75,  0x31b,  0x303,  0x0,  0x75,  0x31b,  0x309,  0x0,  0x75,  0x31b,  0x323,  0x0,  0x75,  0x323,  0x0,  0x75,  0x324,  0x0,  0x75,  0x328,  0x0,  0x75,  0x32d,  0x0,  0x75,  0x330,  0x0,  0x76,  0x303,  0x0,  0x76,  0x323,  0x0,  0x77,  0x300,  0x0,  0x77,  0x301,  0x0,  0x77,  0x302,  0x0,  0x77,  0x307,  0x0,  0x77,  0x308,  0x0,  0x77,  0x30a,  0x0,  0x77,  0x323,  0x0,  0x78,  0x307,  0x0,  0x78,  0x308,  0x0,  0x79,  0x300,  0x0,  0x79,  0x301,  0x0,  0x79,  0x302,  0x0,  0x79,  0x303,  0x0,  0x79,  0x304,  0x0,  0x79,  0x307,  0x0,  0x79,  0x308,  0x0,  0x79,  0x309,  0x0,  0x79,  0x30a,  0x0,  0x79,  0x323,  0x0,  0x7a,  0x301,  0x0,  0x7a,  0x302,  0x0,  0x7a,  0x307,  0x0,  0x7a,  0x30c,  0x0,  0x7a,  0x323,  0x0,  0x7a,  0x331,  0x0,  0xa8,  0x300,  0x0,  0xa8,  0x301,  0x0,  0xa8,  0x342,  0x0,  0xb4,  0x0,  0xb7,  0x0,  0xc6,  0x301,  0x0,  0xc6,  0x304,  0x0,  0xd8,  0x301,  0x0,  0xe6,  0x301,  0x0,  0xe6,  0x304,  0x0,  0xf8,  0x301,  0x0,  0x17f,  0x307,  0x0,  0x1b7,  0x30c,  0x0,  0x292,  0x30c,  0x0,  0x2b9,  0x0,  0x300,  0x0,  0x301,  0x0,  0x308,  0x301,  0x0,  0x313,  0x0,  0x391,  0x300,  0x0,  0x391,  0x301,  0x0,  0x391,  0x304,  0x0,  0x391,  0x306,  0x0,  0x391,  0x313,  0x0,  0x391,  0x313,  0x300,  0x0,  0x391,  0x313,  0x300,  0x345,  0x0,  0x391,  0x313,  0x301,  0x0,  0x391,  0x313,  0x301,  0x345,  0x0,  0x391,  0x313,  0x342,  0x0,  0x391,  0x313,  0x342,  0x345,  0x0,  0x391,  0x313,  0x345,  0x0,  0x391,  0x314,  0x0,  0x391,  0x314,  0x300,  0x0,  0x391,  0x314,  0x300,  0x345,  0x0,  0x391,  0x314,  0x301,  0x0,  0x391,  0x314,  0x301,  0x345,  0x0,  0x391,  0x314,  0x342,  0x0,  0x391,  0x314,  0x342,  0x345,  0x0,  0x391,  0x314,  0x345,  0x0,  0x391,  0x345,  0x0,  0x395,  0x300,  0x0,  0x395,  0x301,  0x0,  0x395,  0x313,  0x0,  0x395,  0x313,  0x300,  0x0,  0x395,  0x313,  0x301,  0x0,  0x395,  0x314,  0x0,  0x395,  0x314,  0x300,  0x0,  0x395,  0x314,  0x301,  0x0,  0x397,  0x300,  0x0,  0x397,  0x301,  0x0,  0x397,  0x313,  0x0,  0x397,  0x313,  0x300,  0x0,  0x397,  0x313,  0x300,  0x345,  0x0,  0x397,  0x313,  0x301,  0x0,  0x397,  0x313,  0x301,  0x345,  0x0,  0x397,  0x313,  0x342,  0x0,  0x397,  0x313,  0x342,  0x345,  0x0,  0x397,  0x313,  0x345,  0x0,  0x397,  0x314,  0x0,  0x397,  0x314,  0x300,  0x0,  0x397,  0x314,  0x300,  0x345,  0x0,  0x397,  0x314,  0x301,  0x0,  0x397,  0x314,  0x301,  0x345,  0x0,  0x397,  0x314,  0x342,  0x0,  0x397,  0x314,  0x342,  0x345,  0x0,  0x397,  0x314,  0x345,  0x0,  0x397,  0x345,  0x0,  0x399,  0x300,  0x0,  0x399,  0x301,  0x0,  0x399,  0x304,  0x0,  0x399,  0x306,  0x0,  0x399,  0x308,  0x0,  0x399,  0x313,  0x0,  0x399,  0x313,  0x300,  0x0,  0x399,  0x313,  0x301,  0x0,  0x399,  0x313,  0x342,  0x0,  0x399,  0x314,  0x0,  0x399,  0x314,  0x300,  0x0,  0x399,  0x314,  0x301,  0x0,  0x399,  0x314,  0x342,  0x0,  0x39f,  0x300,  0x0,  0x39f,  0x301,  0x0,  0x39f,  0x313,  0x0,  0x39f,  0x313,  0x300,  0x0,  0x39f,  0x313,  0x301,  0x0,  0x39f,  0x314,  0x0,  0x39f,  0x314,  0x300,  0x0,  0x39f,  0x314,  0x301,  0x0,  0x3a1,  0x314,  0x0,  0x3a5,  0x300,  0x0,  0x3a5,  0x301,  0x0,  0x3a5,  0x304,  0x0,  0x3a5,  0x306,  0x0,  0x3a5,  0x308,  0x0,  0x3a5,  0x314,  0x0,  0x3a5,  0x314,  0x300,  0x0,  0x3a5,  0x314,  0x301,  0x0,  0x3a5,  0x314,  0x342,  0x0,  0x3a9,  0x0,  0x3a9,  0x300,  0x0,  0x3a9,  0x301,  0x0,  0x3a9,  0x313,  0x0,  0x3a9,  0x313,  0x300,  0x0,  0x3a9,  0x313,  0x300,  0x345,  0x0,  0x3a9,  0x313,  0x301,  0x0,  0x3a9,  0x313,  0x301,  0x345,  0x0,  0x3a9,  0x313,  0x342,  0x0,  0x3a9,  0x313,  0x342,  0x345,  0x0,  0x3a9,  0x313,  0x345,  0x0,  0x3a9,  0x314,  0x0,  0x3a9,  0x314,  0x300,  0x0,  0x3a9,  0x314,  0x300,  0x345,  0x0,  0x3a9,  0x314,  0x301,  0x0,  0x3a9,  0x314,  0x301,  0x345,  0x0,  0x3a9,  0x314,  0x342,  0x0,  0x3a9,  0x314,  0x342,  0x345,  0x0,  0x3a9,  0x314,  0x345,  0x0,  0x3a9,  0x345,  0x0,  0x3b1,  0x300,  0x0,  0x3b1,  0x300,  0x345,  0x0,  0x3b1,  0x301,  0x0,  0x3b1,  0x301,  0x345,  0x0,  0x3b1,  0x304,  0x0,  0x3b1,  0x306,  0x0,  0x3b1,  0x313,  0x0,  0x3b1,  0x313,  0x300,  0x0,  0x3b1,  0x313,  0x300,  0x345,  0x0,  0x3b1,  0x313,  0x301,  0x0,  0x3b1,  0x313,  0x301,  0x345,  0x0,  0x3b1,  0x313,  0x342,  0x0,  0x3b1,  0x313,  0x342,  0x345,  0x0,  0x3b1,  0x313,  0x345,  0x0,  0x3b1,  0x314,  0x0,  0x3b1,  0x314,  0x300,  0x0,  0x3b1,  0x314,  0x300,  0x345,  0x0,  0x3b1,  0x314,  0x301,  0x0,  0x3b1,  0x314,  0x301,  0x345,  0x0,  0x3b1,  0x314,  0x342,  0x0,  0x3b1,  0x314,  0x342,  0x345,  0x0,  0x3b1,  0x314,  0x345,  0x0,  0x3b1,  0x342,  0x0,  0x3b1,  0x342,  0x345,  0x0,  0x3b1,  0x345,  0x0,  0x3b5,  0x300,  0x0,  0x3b5,  0x301,  0x0,  0x3b5,  0x313,  0x0,  0x3b5,  0x313,  0x300,  0x0,  0x3b5,  0x313,  0x301,  0x0,  0x3b5,  0x314,  0x0,  0x3b5,  0x314,  0x300,  0x0,  0x3b5,  0x314,  0x301,  0x0,  0x3b7,  0x300,  0x0,  0x3b7,  0x300,  0x345,  0x0,  0x3b7,  0x301,  0x0,  0x3b7,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x0,  0x3b7,  0x313,  0x300,  0x0,  0x3b7,  0x313,  0x300,  0x345,  0x0,  0x3b7,  0x313,  0x301,  0x0,  0x3b7,  0x313,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x342,  0x0,  0x3b7,  0x313,  0x342,  0x345,  0x0,  0x3b7,  0x313,  0x345,  0x0,  0x3b7,  0x314,  0x0,  0x3b7,  0x314,  0x300,  0x0,  0x3b7,  0x314,  0x300,  0x345,  0x0,  0x3b7,  0x314,  0x301,  0x0,  0x3b7,  0x314,  0x301,  0x345,  0x0,  0x3b7,  0x314,  0x342,  0x0,  0x3b7,  0x314,  0x342,  0x345,  0x0,  0x3b7,  0x314,  0x345,  0x0,  0x3b7,  0x342,  0x0,  0x3b7,  0x342,  0x345,  0x0,  0x3b7,  0x345,  0x0,  0x3b9,  0x0,  0x3b9,  0x300,  0x0,  0x3b9,  0x301,  0x0,  0x3b9,  0x304,  0x0,  0x3b9,  0x306,  0x0,  0x3b9,  0x308,  0x0,  0x3b9,  0x308,  0x300,  0x0,  0x3b9,  0x308,  0x301,  0x0,  0x3b9,  0x308,  0x342,  0x0,  0x3b9,  0x313,  0x0,  0x3b9,  0x313,  0x300,  0x0,  0x3b9,  0x313,  0x301,  0x0,  0x3b9,  0x313,  0x342,  0x0,  0x3b9,  0x314,  0x0,  0x3b9,  0x314,  0x300,  0x0,  0x3b9,  0x314,  0x301,  0x0,  0x3b9,  0x314,  0x342,  0x0,  0x3b9,  0x342,  0x0,  0x3bf,  0x300,  0x0,  0x3bf,  0x301,  0x0,  0x3bf,  0x313,  0x0,  0x3bf,  0x313,  0x300,  0x0,  0x3bf,  0x313,  0x301,  0x0,  0x3bf,  0x314,  0x0,  0x3bf,  0x314,  0x300,  0x0,  0x3bf,  0x314,  0x301,  0x0,  0x3c1,  0x313,  0x0,  0x3c1,  0x314,  0x0,  0x3c5,  0x300,  0x0,  0x3c5,  0x301,  0x0,  0x3c5,  0x304,  0x0,  0x3c5,  0x306,  0x0,  0x3c5,  0x308,  0x0,  0x3c5,  0x308,  0x300,  0x0,  0x3c5,  0x308,  0x301,  0x0,  0x3c5,  0x308,  0x342,  0x0,  0x3c5,  0x313,  0x0,  0x3c5,  0x313,  0x300,  0x0,  0x3c5,  0x313,  0x301,  0x0,  0x3c5,  0x313,  0x342,  0x0,  0x3c5,  0x314,  0x0,  0x3c5,  0x314,  0x300,  0x0,  0x3c5,  0x314,  0x301,  0x0,  0x3c5,  0x314,  0x342,  0x0,  0x3c5,  0x342,  0x0,  0x3c9,  0x300,  0x0,  0x3c9,  0x300,  0x345,  0x0,  0x3c9,  0x301,  0x0,  0x3c9,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x0,  0x3c9,  0x313,  0x300,  0x0,  0x3c9,  0x313,  0x300,  0x345,  0x0,  0x3c9,  0x313,  0x301,  0x0,  0x3c9,  0x313,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x342,  0x0,  0x3c9,  0x313,  0x342,  0x345,  0x0,  0x3c9,  0x313,  0x345,  0x0,  0x3c9,  0x314,  0x0,  0x3c9,  0x314,  0x300,  0x0,  0x3c9,  0x314,  0x300,  0x345,  0x0,  0x3c9,  0x314,  0x301,  0x0,  0x3c9,  0x314,  0x301,  0x345,  0x0,  0x3c9,  0x314,  0x342,  0x0,  0x3c9,  0x314,  0x342,  0x345,  0x0,  0x3c9,  0x314,  0x345,  0x0,  0x3c9,  0x342,  0x0,  0x3c9,  0x342,  0x345,  0x0,  0x3c9,  0x345,  0x0,  0x3d2,  0x301,  0x0,  0x3d2,  0x308,  0x0,  0x406,  0x308,  0x0,  0x410,  0x306,  0x0,  0x410,  0x308,  0x0,  0x413,  0x301,  0x0,  0x415,  0x300,  0x0,  0x415,  0x306,  0x0,  0x415,  0x308,  0x0,  0x416,  0x306,  0x0,  0x416,  0x308,  0x0,  0x417,  0x308,  0x0,  0x418,  0x300,  0x0,  0x418,  0x304,  0x0,  0x418,  0x306,  0x0,  0x418,  0x308,  0x0,  0x41a,  0x301,  0x0,  0x41e,  0x308,  0x0,  0x423,  0x304,  0x0,  0x423,  0x306,  0x0,  0x423,  0x308,  0x0,  0x423,  0x30b,  0x0,  0x427,  0x308,  0x0,  0x42b,  0x308,  0x0,  0x42d,  0x308,  0x0,  0x430,  0x306,  0x0,  0x430,  0x308,  0x0,  0x433,  0x301,  0x0,  0x435,  0x300,  0x0,  0x435,  0x306,  0x0,  0x435,  0x308,  0x0,  0x436,  0x306,  0x0,  0x436,  0x308,  0x0,  0x437,  0x308,  0x0,  0x438,  0x300,  0x0,  0x438,  0x304,  0x0,  0x438,  0x306,  0x0,  0x438,  0x308,  0x0,  0x43a,  0x301,  0x0,  0x43e,  0x308,  0x0,  0x443,  0x304,  0x0,  0x443,  0x306,  0x0,  0x443,  0x308,  0x0,  0x443,  0x30b,  0x0,  0x447,  0x308,  0x0,  0x44b,  0x308,  0x0,  0x44d,  0x308,  0x0,  0x456,  0x308,  0x0,  0x474,  0x30f,  0x0,  0x475,  0x30f,  0x0,  0x4d8,  0x308,  0x0,  0x4d9,  0x308,  0x0,  0x4e8,  0x308,  0x0,  0x4e9,  0x308,  0x0,  0x5d0,  0x5b7,  0x0,  0x5d0,  0x5b8,  0x0,  0x5d0,  0x5bc,  0x0,  0x5d1,  0x5bc,  0x0,  0x5d1,  0x5bf,  0x0,  0x5d2,  0x5bc,  0x0,  0x5d3,  0x5bc,  0x0,  0x5d4,  0x5bc,  0x0,  0x5d5,  0x5b9,  0x0,  0x5d5,  0x5bc,  0x0,  0x5d6,  0x5bc,  0x0,  0x5d8,  0x5bc,  0x0,  0x5d9,  0x5b4,  0x0,  0x5d9,  0x5bc,  0x0,  0x5da,  0x5bc,  0x0,  0x5db,  0x5bc,  0x0,  0x5db,  0x5bf,  0x0,  0x5dc,  0x5bc,  0x0,  0x5de,  0x5bc,  0x0,  0x5e0,  0x5bc,  0x0,  0x5e1,  0x5bc,  0x0,  0x5e3,  0x5bc,  0x0,  0x5e4,  0x5bc,  0x0,  0x5e4,  0x5bf,  0x0,  0x5e6,  0x5bc,  0x0,  0x5e7,  0x5bc,  0x0,  0x5e8,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x5c1,  0x0,  0x5e9,  0x5bc,  0x5c2,  0x0,  0x5e9,  0x5c1,  0x0,  0x5e9,  0x5c2,  0x0,  0x5ea,  0x5bc,  0x0,  0x5f2,  0x5b7,  0x0,  0x627,  0x653,  0x0,  0x627,  0x654,  0x0,  0x627,  0x655,  0x0,  0x648,  0x654,  0x0,  0x64a,  0x654,  0x0,  0x6c1,  0x654,  0x0,  0x6d2,  0x654,  0x0,  0x6d5,  0x654,  0x0,  0x915,  0x93c,  0x0,  0x916,  0x93c,  0x0,  0x917,  0x93c,  0x0,  0x91c,  0x93c,  0x0,  0x921,  0x93c,  0x0,  0x922,  0x93c,  0x0,  0x928,  0x93c,  0x0,  0x92b,  0x93c,  0x0,  0x92f,  0x93c,  0x0,  0x930,  0x93c,  0x0,  0x933,  0x93c,  0x0,  0x9a1,  0x9bc,  0x0,  0x9a2,  0x9bc,  0x0,  0x9af,  0x9bc,  0x0,  0x9c7,  0x9be,  0x0,  0x9c7,  0x9d7,  0x0,  0xa16,  0xa3c,  0x0,  0xa17,  0xa3c,  0x0,  0xa1c,  0xa3c,  0x0,  0xa2b,  0xa3c,  0x0,  0xa32,  0xa3c,  0x0,  0xa38,  0xa3c,  0x0,  0xb21,  0xb3c,  0x0,  0xb22,  0xb3c,  0x0,  0xb47,  0xb3e,  0x0,  0xb47,  0xb56,  0x0,  0xb47,  0xb57,  0x0,  0xb92,  0xbd7,  0x0,  0xbc6,  0xbbe,  0x0,  0xbc6,  0xbd7,  0x0,  0xbc7,  0xbbe,  0x0,  0xc46,  0xc56,  0x0,  0xcbf,  0xcd5,  0x0,  0xcc6,  0xcc2,  0x0,  0xcc6,  0xcc2,  0xcd5,  0x0,  0xcc6,  0xcd5,  0x0,  0xcc6,  0xcd6,  0x0,  0xd46,  0xd3e,  0x0,  0xd46,  0xd57,  0x0,  0xd47,  0xd3e,  0x0,  0xdd9,  0xdca,  0x0,  0xdd9,  0xdcf,  0x0,  0xdd9,  0xdcf,  0xdca,  0x0,  0xdd9,  0xddf,  0x0,  0xf40,  0xfb5,  0x0,  0xf42,  0xfb7,  0x0,  0xf4c,  0xfb7,  0x0,  0xf51,  0xfb7,  0x0,  0xf56,  0xfb7,  0x0,  0xf5b,  0xfb7,  0x0,  0xf71,  0xf72,  0x0,  0xf71,  0xf74,  0x0,  0xf71,  0xf80,  0x0,  0xf90,  0xfb5,  0x0,  0xf92,  0xfb7,  0x0,  0xf9c,  0xfb7,  0x0,  0xfa1,  0xfb7,  0x0,  0xfa6,  0xfb7,  0x0,  0xfab,  0xfb7,  0x0,  0xfb2,  0xf80,  0x0,  0xfb3,  0xf80,  0x0,  0x1025,  0x102e,  0x0,  0x1b05,  0x1b35,  0x0,  0x1b07,  0x1b35,  0x0,  0x1b09,  0x1b35,  0x0,  0x1b0b,  0x1b35,  0x0,  0x1b0d,  0x1b35,  0x0,  0x1b11,  0x1b35,  0x0,  0x1b3a,  0x1b35,  0x0,  0x1b3c,  0x1b35,  0x0,  0x1b3e,  0x1b35,  0x0,  0x1b3f,  0x1b35,  0x0,  0x1b42,  0x1b35,  0x0,  0x1fbf,  0x300,  0x0,  0x1fbf,  0x301,  0x0,  0x1fbf,  0x342,  0x0,  0x1ffe,  0x300,  0x0,  0x1ffe,  0x301,  0x0,  0x1ffe,  0x342,  0x0,  0x2002,  0x0,  0x2003,  0x0,  0x2190,  0x338,  0x0,  0x2192,  0x338,  0x0,  0x2194,  0x338,  0x0,  0x21d0,  0x338,  0x0,  0x21d2,  0x338,  0x0,  0x21d4,  0x338,  0x0,  0x2203,  0x338,  0x0,  0x2208,  0x338,  0x0,  0x220b,  0x338,  0x0,  0x2223,  0x338,  0x0,  0x2225,  0x338,  0x0,  0x223c,  0x338,  0x0,  0x2243,  0x338,  0x0,  0x2245,  0x338,  0x0,  0x2248,  0x338,  0x0,  0x224d,  0x338,  0x0,  0x2261,  0x338,  0x0,  0x2264,  0x338,  0x0,  0x2265,  0x338,  0x0,  0x2272,  0x338,  0x0,  0x2273,  0x338,  0x0,  0x2276,  0x338,  0x0,  0x2277,  0x338,  0x0,  0x227a,  0x338,  0x0,  0x227b,  0x338,  0x0,  0x227c,  0x338,  0x0,  0x227d,  0x338,  0x0,  0x2282,  0x338,  0x0,  0x2283,  0x338,  0x0,  0x2286,  0x338,  0x0,  0x2287,  0x338,  0x0,  0x2291,  0x338,  0x0,  0x2292,  0x338,  0x0,  0x22a2,  0x338,  0x0,  0x22a8,  0x338,  0x0,  0x22a9,  0x338,  0x0,  0x22ab,  0x338,  0x0,  0x22b2,  0x338,  0x0,  0x22b3,  0x338,  0x0,  0x22b4,  0x338,  0x0,  0x22b5,  0x338,  0x0,  0x2add,  0x338,  0x0,  0x3008,  0x0,  0x3009,  0x0,  0x3046,  0x3099,  0x0,  0x304b,  0x3099,  0x0,  0x304d,  0x3099,  0x0,  0x304f,  0x3099,  0x0,  0x3051,  0x3099,  0x0,  0x3053,  0x3099,  0x0,  0x3055,  0x3099,  0x0,  0x3057,  0x3099,  0x0,  0x3059,  0x3099,  0x0,  0x305b,  0x3099,  0x0,  0x305d,  0x3099,  0x0,  0x305f,  0x3099,  0x0,  0x3061,  0x3099,  0x0,  0x3064,  0x3099,  0x0,  0x3066,  0x3099,  0x0,  0x3068,  0x3099,  0x0,  0x306f,  0x3099,  0x0,  0x306f,  0x309a,  0x0,  0x3072,  0x3099,  0x0,  0x3072,  0x309a,  0x0,  0x3075,  0x3099,  0x0,  0x3075,  0x309a,  0x0,  0x3078,  0x3099,  0x0,  0x3078,  0x309a,  0x0,  0x307b,  0x3099,  0x0,  0x307b,  0x309a,  0x0,  0x309d,  0x3099,  0x0,  0x30a6,  0x3099,  0x0,  0x30ab,  0x3099,  0x0,  0x30ad,  0x3099,  0x0,  0x30af,  0x3099,  0x0,  0x30b1,  0x3099,  0x0,  0x30b3,  0x3099,  0x0,  0x30b5,  0x3099,  0x0,  0x30b7,  0x3099,  0x0,  0x30b9,  0x3099,  0x0,  0x30bb,  0x3099,  0x0,  0x30bd,  0x3099,  0x0,  0x30bf,  0x3099,  0x0,  0x30c1,  0x3099,  0x0,  0x30c4,  0x3099,  0x0,  0x30c6,  0x3099,  0x0,  0x30c8,  0x3099,  0x0,  0x30cf,  0x3099,  0x0,  0x30cf,  0x309a,  0x0,  0x30d2,  0x3099,  0x0,  0x30d2,  0x309a,  0x0,  0x30d5,  0x3099,  0x0,  0x30d5,  0x309a,  0x0,  0x30d8,  0x3099,  0x0,  0x30d8,  0x309a,  0x0,  0x30db,  0x3099,  0x0,  0x30db,  0x309a,  0x0,  0x30ef,  0x3099,  0x0,  0x30f0,  0x3099,  0x0,  0x30f1,  0x3099,  0x0,  0x30f2,  0x3099,  0x0,  0x30fd,  0x3099,  0x0,  0x349e,  0x0,  0x34b9,  0x0,  0x34bb,  0x0,  0x34df,  0x0,  0x3515,  0x0,  0x36ee,  0x0,  0x36fc,  0x0,  0x3781,  0x0,  0x382f,  0x0,  0x3862,  0x0,  0x387c,  0x0,  0x38c7,  0x0,  0x38e3,  0x0,  0x391c,  0x0,  0x393a,  0x0,  0x3a2e,  0x0,  0x3a6c,  0x0,  0x3ae4,  0x0,  0x3b08,  0x0,  0x3b19,  0x0,  0x3b49,  0x0,  0x3b9d,  0x0,  0x3c18,  0x0,  0x3c4e,  0x0,  0x3d33,  0x0,  0x3d96,  0x0,  0x3eac,  0x0,  0x3eb8,  0x0,  0x3f1b,  0x0,  0x3ffc,  0x0,  0x4008,  0x0,  0x4018,  0x0,  0x4039,  0x0,  0x4046,  0x0,  0x4096,  0x0,  0x40e3,  0x0,  0x412f,  0x0,  0x4202,  0x0,  0x4227,  0x0,  0x42a0,  0x0,  0x4301,  0x0,  0x4334,  0x0,  0x4359,  0x0,  0x43d5,  0x0,  0x43d9,  0x0,  0x440b,  0x0,  0x446b,  0x0,  0x452b,  0x0,  0x455d,  0x0,  0x4561,  0x0,  0x456b,  0x0,  0x45d7,  0x0,  0x45f9,  0x0,  0x4635,  0x0,  0x46be,  0x0,  0x46c7,  0x0,  0x4995,  0x0,  0x49e6,  0x0,  0x4a6e,  0x0,  0x4a76,  0x0,  0x4ab2,  0x0,  0x4b33,  0x0,  0x4bce,  0x0,  0x4cce,  0x0,  0x4ced,  0x0,  0x4cf8,  0x0,  0x4d56,  0x0,  0x4e0d,  0x0,  0x4e26,  0x0,  0x4e32,  0x0,  0x4e38,  0x0,  0x4e39,  0x0,  0x4e3d,  0x0,  0x4e41,  0x0,  0x4e82,  0x0,  0x4e86,  0x0,  0x4eae,  0x0,  0x4ec0,  0x0,  0x4ecc,  0x0,  0x4ee4,  0x0,  0x4f60,  0x0,  0x4f80,  0x0,  0x4f86,  0x0,  0x4f8b,  0x0,  0x4fae,  0x0,  0x4fbb,  0x0,  0x4fbf,  0x0,  0x5002,  0x0,  0x502b,  0x0,  0x507a,  0x0,  0x5099,  0x0,  0x50cf,  0x0,  0x50da,  0x0,  0x50e7,  0x0,  0x5140,  0x0,  0x5145,  0x0,  0x514d,  0x0,  0x5154,  0x0,  0x5164,  0x0,  0x5167,  0x0,  0x5168,  0x0,  0x5169,  0x0,  0x516d,  0x0,  0x5177,  0x0,  0x5180,  0x0,  0x518d,  0x0,  0x5192,  0x0,  0x5195,  0x0,  0x5197,  0x0,  0x51a4,  0x0,  0x51ac,  0x0,  0x51b5,  0x0,  0x51b7,  0x0,  0x51c9,  0x0,  0x51cc,  0x0,  0x51dc,  0x0,  0x51de,  0x0,  0x51f5,  0x0,  0x5203,  0x0,  0x5207,  0x0,  0x5217,  0x0,  0x5229,  0x0,  0x523a,  0x0,  0x523b,  0x0,  0x5246,  0x0,  0x5272,  0x0,  0x5277,  0x0,  0x5289,  0x0,  0x529b,  0x0,  0x52a3,  0x0,  0x52b3,  0x0,  0x52c7,  0x0,  0x52c9,  0x0,  0x52d2,  0x0,  0x52de,  0x0,  0x52e4,  0x0,  0x52f5,  0x0,  0x52fa,  0x0,  0x5305,  0x0,  0x5306,  0x0,  0x5317,  0x0,  0x533f,  0x0,  0x5349,  0x0,  0x5351,  0x0,  0x535a,  0x0,  0x5373,  0x0,  0x5375,  0x0,  0x537d,  0x0,  0x537f,  0x0,  0x53c3,  0x0,  0x53ca,  0x0,  0x53df,  0x0,  0x53e5,  0x0,  0x53eb,  0x0,  0x53f1,  0x0,  0x5406,  0x0,  0x540f,  0x0,  0x541d,  0x0,  0x5438,  0x0,  0x5442,  0x0,  0x5448,  0x0,  0x5468,  0x0,  0x549e,  0x0,  0x54a2,  0x0,  0x54bd,  0x0,  0x54f6,  0x0,  0x5510,  0x0,  0x5553,  0x0,  0x5555,  0x0,  0x5563,  0x0,  0x5584,  0x0,  0x5587,  0x0,  0x5599,  0x0,  0x559d,  0x0,  0x55ab,  0x0,  0x55b3,  0x0,  0x55c0,  0x0,  0x55c2,  0x0,  0x55e2,  0x0,  0x5606,  0x0,  0x5651,  0x0,  0x5668,  0x0,  0x5674,  0x0,  0x56f9,  0x0,  0x5716,  0x0,  0x5717,  0x0,  0x578b,  0x0,  0x57ce,  0x0,  0x57f4,  0x0,  0x580d,  0x0,  0x5831,  0x0,  0x5832,  0x0,  0x5840,  0x0,  0x585a,  0x0,  0x585e,  0x0,  0x58a8,  0x0,  0x58ac,  0x0,  0x58b3,  0x0,  0x58d8,  0x0,  0x58df,  0x0,  0x58ee,  0x0,  0x58f2,  0x0,  0x58f7,  0x0,  0x5906,  0x0,  0x591a,  0x0,  0x5922,  0x0,  0x5944,  0x0,  0x5948,  0x0,  0x5951,  0x0,  0x5954,  0x0,  0x5962,  0x0,  0x5973,  0x0,  0x59d8,  0x0,  0x59ec,  0x0,  0x5a1b,  0x0,  0x5a27,  0x0,  0x5a62,  0x0,  0x5a66,  0x0,  0x5ab5,  0x0,  0x5b08,  0x0,  0x5b28,  0x0,  0x5b3e,  0x0,  0x5b85,  0x0,  0x5bc3,  0x0,  0x5bd8,  0x0,  0x5be7,  0x0,  0x5bee,  0x0,  0x5bf3,  0x0,  0x5bff,  0x0,  0x5c06,  0x0,  0x5c22,  0x0,  0x5c3f,  0x0,  0x5c60,  0x0,  0x5c62,  0x0,  0x5c64,  0x0,  0x5c65,  0x0,  0x5c6e,  0x0,  0x5c8d,  0x0,  0x5cc0,  0x0,  0x5d19,  0x0,  0x5d43,  0x0,  0x5d50,  0x0,  0x5d6b,  0x0,  0x5d6e,  0x0,  0x5d7c,  0x0,  0x5db2,  0x0,  0x5dba,  0x0,  0x5de1,  0x0,  0x5de2,  0x0,  0x5dfd,  0x0,  0x5e28,  0x0,  0x5e3d,  0x0,  0x5e69,  0x0,  0x5e74,  0x0,  0x5ea6,  0x0,  0x5eb0,  0x0,  0x5eb3,  0x0,  0x5eb6,  0x0,  0x5ec9,  0x0,  0x5eca,  0x0,  0x5ed2,  0x0,  0x5ed3,  0x0,  0x5ed9,  0x0,  0x5eec,  0x0,  0x5efe,  0x0,  0x5f04,  0x0,  0x5f22,  0x0,  0x5f53,  0x0,  0x5f62,  0x0,  0x5f69,  0x0,  0x5f6b,  0x0,  0x5f8b,  0x0,  0x5f9a,  0x0,  0x5fa9,  0x0,  0x5fad,  0x0,  0x5fcd,  0x0,  0x5fd7,  0x0,  0x5ff5,  0x0,  0x5ff9,  0x0,  0x6012,  0x0,  0x601c,  0x0,  0x6075,  0x0,  0x6081,  0x0,  0x6094,  0x0,  0x60c7,  0x0,  0x60d8,  0x0,  0x60e1,  0x0,  0x6108,  0x0,  0x6144,  0x0,  0x6148,  0x0,  0x614c,  0x0,  0x614e,  0x0,  0x6160,  0x0,  0x6168,  0x0,  0x617a,  0x0,  0x618e,  0x0,  0x6190,  0x0,  0x61a4,  0x0,  0x61af,  0x0,  0x61b2,  0x0,  0x61de,  0x0,  0x61f2,  0x0,  0x61f6,  0x0,  0x6200,  0x0,  0x6210,  0x0,  0x621b,  0x0,  0x622e,  0x0,  0x6234,  0x0,  0x625d,  0x0,  0x62b1,  0x0,  0x62c9,  0x0,  0x62cf,  0x0,  0x62d3,  0x0,  0x62d4,  0x0,  0x62fc,  0x0,  0x62fe,  0x0,  0x633d,  0x0,  0x6350,  0x0,  0x6368,  0x0,  0x637b,  0x0,  0x6383,  0x0,  0x63a0,  0x0,  0x63a9,  0x0,  0x63c4,  0x0,  0x63c5,  0x0,  0x63e4,  0x0,  0x641c,  0x0,  0x6422,  0x0,  0x6452,  0x0,  0x6469,  0x0,  0x6477,  0x0,  0x647e,  0x0,  0x649a,  0x0,  0x649d,  0x0,  0x64c4,  0x0,  0x654f,  0x0,  0x6556,  0x0,  0x656c,  0x0,  0x6578,  0x0,  0x6599,  0x0,  0x65c5,  0x0,  0x65e2,  0x0,  0x65e3,  0x0,  0x6613,  0x0,  0x6649,  0x0,  0x6674,  0x0,  0x6688,  0x0,  0x6691,  0x0,  0x669c,  0x0,  0x66b4,  0x0,  0x66c6,  0x0,  0x66f4,  0x0,  0x66f8,  0x0,  0x6700,  0x0,  0x6717,  0x0,  0x671b,  0x0,  0x6721,  0x0,  0x674e,  0x0,  0x6753,  0x0,  0x6756,  0x0,  0x675e,  0x0,  0x677b,  0x0,  0x6785,  0x0,  0x6797,  0x0,  0x67f3,  0x0,  0x67fa,  0x0,  0x6817,  0x0,  0x681f,  0x0,  0x6852,  0x0,  0x6881,  0x0,  0x6885,  0x0,  0x688e,  0x0,  0x68a8,  0x0,  0x6914,  0x0,  0x6942,  0x0,  0x69a3,  0x0,  0x69ea,  0x0,  0x6a02,  0x0,  0x6a13,  0x0,  0x6aa8,  0x0,  0x6ad3,  0x0,  0x6adb,  0x0,  0x6b04,  0x0,  0x6b21,  0x0,  0x6b54,  0x0,  0x6b72,  0x0,  0x6b77,  0x0,  0x6b79,  0x0,  0x6b9f,  0x0,  0x6bae,  0x0,  0x6bba,  0x0,  0x6bbb,  0x0,  0x6c4e,  0x0,  0x6c67,  0x0,  0x6c88,  0x0,  0x6cbf,  0x0,  0x6ccc,  0x0,  0x6ccd,  0x0,  0x6ce5,  0x0,  0x6d16,  0x0,  0x6d1b,  0x0,  0x6d1e,  0x0,  0x6d34,  0x0,  0x6d3e,  0x0,  0x6d41,  0x0,  0x6d69,  0x0,  0x6d6a,  0x0,  0x6d77,  0x0,  0x6d78,  0x0,  0x6d85,  0x0,  0x6dcb,  0x0,  0x6dda,  0x0,  0x6dea,  0x0,  0x6df9,  0x0,  0x6e1a,  0x0,  0x6e2f,  0x0,  0x6e6e,  0x0,  0x6e9c,  0x0,  0x6eba,  0x0,  0x6ec7,  0x0,  0x6ecb,  0x0,  0x6ed1,  0x0,  0x6edb,  0x0,  0x6f0f,  0x0,  0x6f22,  0x0,  0x6f23,  0x0,  0x6f6e,  0x0,  0x6fc6,  0x0,  0x6feb,  0x0,  0x6ffe,  0x0,  0x701b,  0x0,  0x701e,  0x0,  0x7039,  0x0,  0x704a,  0x0,  0x7070,  0x0,  0x7077,  0x0,  0x707d,  0x0,  0x7099,  0x0,  0x70ad,  0x0,  0x70c8,  0x0,  0x70d9,  0x0,  0x7145,  0x0,  0x7149,  0x0,  0x716e,  0x0,  0x719c,  0x0,  0x71ce,  0x0,  0x71d0,  0x0,  0x7210,  0x0,  0x721b,  0x0,  0x7228,  0x0,  0x722b,  0x0,  0x7235,  0x0,  0x7250,  0x0,  0x7262,  0x0,  0x7280,  0x0,  0x7295,  0x0,  0x72af,  0x0,  0x72c0,  0x0,  0x72fc,  0x0,  0x732a,  0x0,  0x7375,  0x0,  0x737a,  0x0,  0x7387,  0x0,  0x738b,  0x0,  0x73a5,  0x0,  0x73b2,  0x0,  0x73de,  0x0,  0x7406,  0x0,  0x7409,  0x0,  0x7422,  0x0,  0x7447,  0x0,  0x745c,  0x0,  0x7469,  0x0,  0x7471,  0x0,  0x7485,  0x0,  0x7489,  0x0,  0x7498,  0x0,  0x74ca,  0x0,  0x7506,  0x0,  0x7524,  0x0,  0x753b,  0x0,  0x753e,  0x0,  0x7559,  0x0,  0x7565,  0x0,  0x7570,  0x0,  0x75e2,  0x0,  0x7610,  0x0,  0x761d,  0x0,  0x761f,  0x0,  0x7642,  0x0,  0x7669,  0x0,  0x76ca,  0x0,  0x76db,  0x0,  0x76e7,  0x0,  0x76f4,  0x0,  0x7701,  0x0,  0x771e,  0x0,  0x771f,  0x0,  0x7740,  0x0,  0x774a,  0x0,  0x778b,  0x0,  0x77a7,  0x0,  0x784e,  0x0,  0x786b,  0x0,  0x788c,  0x0,  0x7891,  0x0,  0x78ca,  0x0,  0x78cc,  0x0,  0x78fb,  0x0,  0x792a,  0x0,  0x793c,  0x0,  0x793e,  0x0,  0x7948,  0x0,  0x7949,  0x0,  0x7950,  0x0,  0x7956,  0x0,  0x795d,  0x0,  0x795e,  0x0,  0x7965,  0x0,  0x797f,  0x0,  0x798d,  0x0,  0x798e,  0x0,  0x798f,  0x0,  0x79ae,  0x0,  0x79ca,  0x0,  0x79eb,  0x0,  0x7a1c,  0x0,  0x7a40,  0x0,  0x7a4a,  0x0,  0x7a4f,  0x0,  0x7a81,  0x0,  0x7ab1,  0x0,  0x7acb,  0x0,  0x7aee,  0x0,  0x7b20,  0x0,  0x7bc0,  0x0,  0x7bc6,  0x0,  0x7bc9,  0x0,  0x7c3e,  0x0,  0x7c60,  0x0,  0x7c7b,  0x0,  0x7c92,  0x0,  0x7cbe,  0x0,  0x7cd2,  0x0,  0x7cd6,  0x0,  0x7ce3,  0x0,  0x7ce7,  0x0,  0x7ce8,  0x0,  0x7d00,  0x0,  0x7d10,  0x0,  0x7d22,  0x0,  0x7d2f,  0x0,  0x7d5b,  0x0,  0x7d63,  0x0,  0x7da0,  0x0,  0x7dbe,  0x0,  0x7dc7,  0x0,  0x7df4,  0x0,  0x7e02,  0x0,  0x7e09,  0x0,  0x7e37,  0x0,  0x7e41,  0x0,  0x7e45,  0x0,  0x7f3e,  0x0,  0x7f72,  0x0,  0x7f79,  0x0,  0x7f7a,  0x0,  0x7f85,  0x0,  0x7f95,  0x0,  0x7f9a,  0x0,  0x7fbd,  0x0,  0x7ffa,  0x0,  0x8001,  0x0,  0x8005,  0x0,  0x8046,  0x0,  0x8060,  0x0,  0x806f,  0x0,  0x8070,  0x0,  0x807e,  0x0,  0x808b,  0x0,  0x80ad,  0x0,  0x80b2,  0x0,  0x8103,  0x0,  0x813e,  0x0,  0x81d8,  0x0,  0x81e8,  0x0,  0x81ed,  0x0,  0x8201,  0x0,  0x8204,  0x0,  0x8218,  0x0,  0x826f,  0x0,  0x8279,  0x0,  0x828b,  0x0,  0x8291,  0x0,  0x829d,  0x0,  0x82b1,  0x0,  0x82b3,  0x0,  0x82bd,  0x0,  0x82e5,  0x0,  0x82e6,  0x0,  0x831d,  0x0,  0x8323,  0x0,  0x8336,  0x0,  0x8352,  0x0,  0x8353,  0x0,  0x8363,  0x0,  0x83ad,  0x0,  0x83bd,  0x0,  0x83c9,  0x0,  0x83ca,  0x0,  0x83cc,  0x0,  0x83dc,  0x0,  0x83e7,  0x0,  0x83ef,  0x0,  0x83f1,  0x0,  0x843d,  0x0,  0x8449,  0x0,  0x8457,  0x0,  0x84ee,  0x0,  0x84f1,  0x0,  0x84f3,  0x0,  0x84fc,  0x0,  0x8516,  0x0,  0x8564,  0x0,  0x85cd,  0x0,  0x85fa,  0x0,  0x8606,  0x0,  0x8612,  0x0,  0x862d,  0x0,  0x863f,  0x0,  0x8650,  0x0,  0x865c,  0x0,  0x8667,  0x0,  0x8669,  0x0,  0x8688,  0x0,  0x86a9,  0x0,  0x86e2,  0x0,  0x870e,  0x0,  0x8728,  0x0,  0x876b,  0x0,  0x8779,  0x0,  0x8786,  0x0,  0x87ba,  0x0,  0x87e1,  0x0,  0x8801,  0x0,  0x881f,  0x0,  0x884c,  0x0,  0x8860,  0x0,  0x8863,  0x0,  0x88c2,  0x0,  0x88cf,  0x0,  0x88d7,  0x0,  0x88de,  0x0,  0x88e1,  0x0,  0x88f8,  0x0,  0x88fa,  0x0,  0x8910,  0x0,  0x8941,  0x0,  0x8964,  0x0,  0x8986,  0x0,  0x898b,  0x0,  0x8996,  0x0,  0x8aa0,  0x0,  0x8aaa,  0x0,  0x8abf,  0x0,  0x8acb,  0x0,  0x8ad2,  0x0,  0x8ad6,  0x0,  0x8aed,  0x0,  0x8af8,  0x0,  0x8afe,  0x0,  0x8b01,  0x0,  0x8b39,  0x0,  0x8b58,  0x0,  0x8b80,  0x0,  0x8b8a,  0x0,  0x8c48,  0x0,  0x8c55,  0x0,  0x8cab,  0x0,  0x8cc1,  0x0,  0x8cc2,  0x0,  0x8cc8,  0x0,  0x8cd3,  0x0,  0x8d08,  0x0,  0x8d1b,  0x0,  0x8d77,  0x0,  0x8dbc,  0x0,  0x8dcb,  0x0,  0x8def,  0x0,  0x8df0,  0x0,  0x8eca,  0x0,  0x8ed4,  0x0,  0x8f26,  0x0,  0x8f2a,  0x0,  0x8f38,  0x0,  0x8f3b,  0x0,  0x8f62,  0x0,  0x8f9e,  0x0,  0x8fb0,  0x0,  0x8fb6,  0x0,  0x9023,  0x0,  0x9038,  0x0,  0x9072,  0x0,  0x907c,  0x0,  0x908f,  0x0,  0x9094,  0x0,  0x90ce,  0x0,  0x90de,  0x0,  0x90f1,  0x0,  0x90fd,  0x0,  0x9111,  0x0,  0x911b,  0x0,  0x916a,  0x0,  0x9199,  0x0,  0x91b4,  0x0,  0x91cc,  0x0,  0x91cf,  0x0,  0x91d1,  0x0,  0x9234,  0x0,  0x9238,  0x0,  0x9276,  0x0,  0x927c,  0x0,  0x92d7,  0x0,  0x92d8,  0x0,  0x9304,  0x0,  0x934a,  0x0,  0x93f9,  0x0,  0x9415,  0x0,  0x958b,  0x0,  0x95ad,  0x0,  0x95b7,  0x0,  0x962e,  0x0,  0x964b,  0x0,  0x964d,  0x0,  0x9675,  0x0,  0x9678,  0x0,  0x967c,  0x0,  0x9686,  0x0,  0x96a3,  0x0,  0x96b7,  0x0,  0x96b8,  0x0,  0x96c3,  0x0,  0x96e2,  0x0,  0x96e3,  0x0,  0x96f6,  0x0,  0x96f7,  0x0,  0x9723,  0x0,  0x9732,  0x0,  0x9748,  0x0,  0x9756,  0x0,  0x97db,  0x0,  0x97e0,  0x0,  0x97ff,  0x0,  0x980b,  0x0,  0x9818,  0x0,  0x9829,  0x0,  0x983b,  0x0,  0x985e,  0x0,  0x98e2,  0x0,  0x98ef,  0x0,  0x98fc,  0x0,  0x9928,  0x0,  0x9929,  0x0,  0x99a7,  0x0,  0x99c2,  0x0,  0x99f1,  0x0,  0x99fe,  0x0,  0x9a6a,  0x0,  0x9b12,  0x0,  0x9b6f,  0x0,  0x9c40,  0x0,  0x9c57,  0x0,  0x9cfd,  0x0,  0x9d67,  0x0,  0x9db4,  0x0,  0x9dfa,  0x0,  0x9e1e,  0x0,  0x9e7f,  0x0,  0x9e97,  0x0,  0x9e9f,  0x0,  0x9ebb,  0x0,  0x9ece,  0x0,  0x9ef9,  0x0,  0x9efe,  0x0,  0x9f05,  0x0,  0x9f0f,  0x0,  0x9f16,  0x0,  0x9f3b,  0x0,  0x9f43,  0x0,  0x9f8d,  0x0,  0x9f8e,  0x0,  0x9f9c,  0x0,  0x11099,  0x110ba,  0x0,  0x1109b,  0x110ba,  0x0,  0x110a5,  0x110ba,  0x0,  0x11131,  0x11127,  0x0,  0x11132,  0x11127,  0x0,  0x1d157,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x1d16e,  0x0,  0x1d158,  0x1d165,  0x1d16f,  0x0,  0x1d158,  0x1d165,  0x1d170,  0x0,  0x1d158,  0x1d165,  0x1d171,  0x0,  0x1d158,  0x1d165,  0x1d172,  0x0,  0x1d1b9,  0x1d165,  0x0,  0x1d1b9,  0x1d165,  0x1d16e,  0x0,  0x1d1b9,  0x1d165,  0x1d16f,  0x0,  0x1d1ba,  0x1d165,  0x0,  0x1d1ba,  0x1d165,  0x1d16e,  0x0,  0x1d1ba,  0x1d165,  0x1d16f,  0x0,  0x20122,  0x0,  0x2051c,  0x0,  0x20525,  0x0,  0x2054b,  0x0,  0x2063a,  0x0,  0x20804,  0x0,  0x208de,  0x0,  0x20a2c,  0x0,  0x20b63,  0x0,  0x214e4,  0x0,  0x216a8,  0x0,  0x216ea,  0x0,  0x219c8,  0x0,  0x21b18,  0x0,  0x21d0b,  0x0,  0x21de4,  0x0,  0x21de6,  0x0,  0x22183,  0x0,  0x2219f,  0x0,  0x22331,  0x0,  0x226d4,  0x0,  0x22844,  0x0,  0x2284a,  0x0,  0x22b0c,  0x0,  0x22bf1,  0x0,  0x2300a,  0x0,  0x232b8,  0x0,  0x2335f,  0x0,  0x23393,  0x0,  0x2339c,  0x0,  0x233c3,  0x0,  0x233d5,  0x0,  0x2346d,  0x0,  0x236a3,  0x0,  0x238a7,  0x0,  0x23a8d,  0x0,  0x23afa,  0x0,  0x23cbc,  0x0,  0x23d1e,  0x0,  0x23ed1,  0x0,  0x23f5e,  0x0,  0x23f8e,  0x0,  0x24263,  0x0,  0x242ee,  0x0,  0x243ab,  0x0,  0x24608,  0x0,  0x24735,  0x0,  0x24814,  0x0,  0x24c36,  0x0,  0x24c92,  0x0,  0x24fa1,  0x0,  0x24fb8,  0x0,  0x25044,  0x0,  0x250f2,  0x0,  0x250f3,  0x0,  0x25119,  0x0,  0x25133,  0x0,  0x25249,  0x0,  0x2541d,  0x0,  0x25626,  0x0,  0x2569a,  0x0,  0x256c5,  0x0,  0x2597c,  0x0,  0x25aa7,  0x0,  0x25bab,  0x0,  0x25c80,  0x0,  0x25cd0,  0x0,  0x25f86,  0x0,  0x261da,  0x0,  0x26228,  0x0,  0x26247,  0x0,  0x262d9,  0x0,  0x2633e,  0x0,  0x264da,  0x0,  0x26523,  0x0,  0x265a8,  0x0,  0x267a7,  0x0,  0x267b5,  0x0,  0x26b3c,  0x0,  0x26c36,  0x0,  0x26cd5,  0x0,  0x26d6b,  0x0,  0x26f2c,  0x0,  0x26fb1,  0x0,  0x270d2,  0x0,  0x273ca,  0x0,  0x27667,  0x0,  0x278ae,  0x0,  0x27966,  0x0,  0x27ca8,  0x0,  0x27ed3,  0x0,  0x27f2f,  0x0,  0x285d2,  0x0,  0x285ed,  0x0,  0x2872e,  0x0,  0x28bfa,  0x0,  0x28d77,  0x0,  0x29145,  0x0,  0x291df,  0x0,  0x2921a,  0x0,  0x2940a,  0x0,  0x29496,  0x0,  0x295b6,  0x0,  0x29b30,  0x0,  0x2a0ce,  0x0,  0x2a105,  0x0,  0x2a20e,  0x0,  0x2a291,  0x0,  0x2a392,  0x0,  0x2a600,  0x0]; return t; }
++_IDCA decompCompatTable() { static _IDCA t = [ 0x0,  0x20,  0x0,  0x20,  0x301,  0x0,  0x20,  0x303,  0x0,  0x20,  0x304,  0x0,  0x20,  0x305,  0x0,  0x20,  0x306,  0x0,  0x20,  0x307,  0x0,  0x20,  0x308,  0x0,  0x20,  0x308,  0x300,  0x0,  0x20,  0x308,  0x301,  0x0,  0x20,  0x308,  0x342,  0x0,  0x20,  0x30a,  0x0,  0x20,  0x30b,  0x0,  0x20,  0x313,  0x0,  0x20,  0x313,  0x300,  0x0,  0x20,  0x313,  0x301,  0x0,  0x20,  0x313,  0x342,  0x0,  0x20,  0x314,  0x0,  0x20,  0x314,  0x300,  0x0,  0x20,  0x314,  0x301,  0x0,  0x20,  0x314,  0x342,  0x0,  0x20,  0x327,  0x0,  0x20,  0x328,  0x0,  0x20,  0x333,  0x0,  0x20,  0x342,  0x0,  0x20,  0x345,  0x0,  0x20,  0x64b,  0x0,  0x20,  0x64c,  0x0,  0x20,  0x64c,  0x651,  0x0,  0x20,  0x64d,  0x0,  0x20,  0x64d,  0x651,  0x0,  0x20,  0x64e,  0x0,  0x20,  0x64e,  0x651,  0x0,  0x20,  0x64f,  0x0,  0x20,  0x64f,  0x651,  0x0,  0x20,  0x650,  0x0,  0x20,  0x650,  0x651,  0x0,  0x20,  0x651,  0x0,  0x20,  0x651,  0x670,  0x0,  0x20,  0x652,  0x0,  0x20,  0x3099,  0x0,  0x20,  0x309a,  0x0,  0x21,  0x0,  0x21,  0x21,  0x0,  0x21,  0x3f,  0x0,  0x22,  0x0,  0x23,  0x0,  0x24,  0x0,  0x25,  0x0,  0x26,  0x0,  0x27,  0x0,  0x28,  0x0,  0x28,  0x31,  0x29,  0x0,  0x28,  0x31,  0x30,  0x29,  0x0,  0x28,  0x31,  0x31,  0x29,  0x0,  0x28,  0x31,  0x32,  0x29,  0x0,  0x28,  0x31,  0x33,  0x29,  0x0,  0x28,  0x31,  0x34,  0x29,  0x0,  0x28,  0x31,  0x35,  0x29,  0x0,  0x28,  0x31,  0x36,  0x29,  0x0,  0x28,  0x31,  0x37,  0x29,  0x0,  0x28,  0x31,  0x38,  0x29,  0x0,  0x28,  0x31,  0x39,  0x29,  0x0,  0x28,  0x32,  0x29,  0x0,  0x28,  0x32,  0x30,  0x29,  0x0,  0x28,  0x33,  0x29,  0x0,  0x28,  0x34,  0x29,  0x0,  0x28,  0x35,  0x29,  0x0,  0x28,  0x36,  0x29,  0x0,  0x28,  0x37,  0x29,  0x0,  0x28,  0x38,  0x29,  0x0,  0x28,  0x39,  0x29,  0x0,  0x28,  0x41,  0x29,  0x0,  0x28,  0x42,  0x29,  0x0,  0x28,  0x43,  0x29,  0x0,  0x28,  0x44,  0x29,  0x0,  0x28,  0x45,  0x29,  0x0,  0x28,  0x46,  0x29,  0x0,  0x28,  0x47,  0x29,  0x0,  0x28,  0x48,  0x29,  0x0,  0x28,  0x49,  0x29,  0x0,  0x28,  0x4a,  0x29,  0x0,  0x28,  0x4b,  0x29,  0x0,  0x28,  0x4c,  0x29,  0x0,  0x28,  0x4d,  0x29,  0x0,  0x28,  0x4e,  0x29,  0x0,  0x28,  0x4f,  0x29,  0x0,  0x28,  0x50,  0x29,  0x0,  0x28,  0x51,  0x29,  0x0,  0x28,  0x52,  0x29,  0x0,  0x28,  0x53,  0x29,  0x0,  0x28,  0x54,  0x29,  0x0,  0x28,  0x55,  0x29,  0x0,  0x28,  0x56,  0x29,  0x0,  0x28,  0x57,  0x29,  0x0,  0x28,  0x58,  0x29,  0x0,  0x28,  0x59,  0x29,  0x0,  0x28,  0x5a,  0x29,  0x0,  0x28,  0x61,  0x29,  0x0,  0x28,  0x62,  0x29,  0x0,  0x28,  0x63,  0x29,  0x0,  0x28,  0x64,  0x29,  0x0,  0x28,  0x65,  0x29,  0x0,  0x28,  0x66,  0x29,  0x0,  0x28,  0x67,  0x29,  0x0,  0x28,  0x68,  0x29,  0x0,  0x28,  0x69,  0x29,  0x0,  0x28,  0x6a,  0x29,  0x0,  0x28,  0x6b,  0x29,  0x0,  0x28,  0x6c,  0x29,  0x0,  0x28,  0x6d,  0x29,  0x0,  0x28,  0x6e,  0x29,  0x0,  0x28,  0x6f,  0x29,  0x0,  0x28,  0x70,  0x29,  0x0,  0x28,  0x71,  0x29,  0x0,  0x28,  0x72,  0x29,  0x0,  0x28,  0x73,  0x29,  0x0,  0x28,  0x74,  0x29,  0x0,  0x28,  0x75,  0x29,  0x0,  0x28,  0x76,  0x29,  0x0,  0x28,  0x77,  0x29,  0x0,  0x28,  0x78,  0x29,  0x0,  0x28,  0x79,  0x29,  0x0,  0x28,  0x7a,  0x29,  0x0,  0x28,  0x1100,  0x29,  0x0,  0x28,  0x1100,  0x1161,  0x29,  0x0,  0x28,  0x1102,  0x29,  0x0,  0x28,  0x1102,  0x1161,  0x29,  0x0,  0x28,  0x1103,  0x29,  0x0,  0x28,  0x1103,  0x1161,  0x29,  0x0,  0x28,  0x1105,  0x29,  0x0,  0x28,  0x1105,  0x1161,  0x29,  0x0,  0x28,  0x1106,  0x29,  0x0,  0x28,  0x1106,  0x1161,  0x29,  0x0,  0x28,  0x1107,  0x29,  0x0,  0x28,  0x1107,  0x1161,  0x29,  0x0,  0x28,  0x1109,  0x29,  0x0,  0x28,  0x1109,  0x1161,  0x29,  0x0,  0x28,  0x110b,  0x29,  0x0,  0x28,  0x110b,  0x1161,  0x29,  0x0,  0x28,  0x110b,  0x1169,  0x110c,  0x1165,  0x11ab,  0x29,  0x0,  0x28,  0x110b,  0x1169,  0x1112,  0x116e,  0x29,  0x0,  0x28,  0x110c,  0x29,  0x0,  0x28,  0x110c,  0x1161,  0x29,  0x0,  0x28,  0x110c,  0x116e,  0x29,  0x0,  0x28,  0x110e,  0x29,  0x0,  0x28,  0x110e,  0x1161,  0x29,  0x0,  0x28,  0x110f,  0x29,  0x0,  0x28,  0x110f,  0x1161,  0x29,  0x0,  0x28,  0x1110,  0x29,  0x0,  0x28,  0x1110,  0x1161,  0x29,  0x0,  0x28,  0x1111,  0x29,  0x0,  0x28,  0x1111,  0x1161,  0x29,  0x0,  0x28,  0x1112,  0x29,  0x0,  0x28,  0x1112,  0x1161,  0x29,  0x0,  0x28,  0x4e00,  0x29,  0x0,  0x28,  0x4e03,  0x29,  0x0,  0x28,  0x4e09,  0x29,  0x0,  0x28,  0x4e5d,  0x29,  0x0,  0x28,  0x4e8c,  0x29,  0x0,  0x28,  0x4e94,  0x29,  0x0,  0x28,  0x4ee3,  0x29,  0x0,  0x28,  0x4f01,  0x29,  0x0,  0x28,  0x4f11,  0x29,  0x0,  0x28,  0x516b,  0x29,  0x0,  0x28,  0x516d,  0x29,  0x0,  0x28,  0x52b4,  0x29,  0x0,  0x28,  0x5341,  0x29,  0x0,  0x28,  0x5354,  0x29,  0x0,  0x28,  0x540d,  0x29,  0x0,  0x28,  0x547c,  0x29,  0x0,  0x28,  0x56db,  0x29,  0x0,  0x28,  0x571f,  0x29,  0x0,  0x28,  0x5b66,  0x29,  0x0,  0x28,  0x65e5,  0x29,  0x0,  0x28,  0x6708,  0x29,  0x0,  0x28,  0x6709,  0x29,  0x0,  0x28,  0x6728,  0x29,  0x0,  0x28,  0x682a,  0x29,  0x0,  0x28,  0x6c34,  0x29,  0x0,  0x28,  0x706b,  0x29,  0x0,  0x28,  0x7279,  0x29,  0x0,  0x28,  0x76e3,  0x29,  0x0,  0x28,  0x793e,  0x29,  0x0,  0x28,  0x795d,  0x29,  0x0,  0x28,  0x796d,  0x29,  0x0,  0x28,  0x81ea,  0x29,  0x0,  0x28,  0x81f3,  0x29,  0x0,  0x28,  0x8ca1,  0x29,  0x0,  0x28,  0x8cc7,  0x29,  0x0,  0x28,  0x91d1,  0x29,  0x0,  0x29,  0x0,  0x2a,  0x0,  0x2b,  0x0,  0x2c,  0x0,  0x2d,  0x0,  0x2e,  0x0,  0x2e,  0x2e,  0x0,  0x2e,  0x2e,  0x2e,  0x0,  0x2f,  0x0,  0x30,  0x0,  0x30,  0x2c,  0x0,  0x30,  0x2e,  0x0,  0x30,  0x2044,  0x33,  0x0,  0x30,  0x70b9,  0x0,  0x31,  0x0,  0x31,  0x2c,  0x0,  0x31,  0x2e,  0x0,  0x31,  0x30,  0x0,  0x31,  0x30,  0x2e,  0x0,  0x31,  0x30,  0x65e5,  0x0,  0x31,  0x30,  0x6708,  0x0,  0x31,  0x30,  0x70b9,  0x0,  0x31,  0x31,  0x0,  0x31,  0x31,  0x2e,  0x0,  0x31,  0x31,  0x65e5,  0x0,  0x31,  0x31,  0x6708,  0x0,  0x31,  0x31,  0x70b9,  0x0,  0x31,  0x32,  0x0,  0x31,  0x32,  0x2e,  0x0,  0x31,  0x32,  0x65e5,  0x0,  0x31,  0x32,  0x6708,  0x0,  0x31,  0x32,  0x70b9,  0x0,  0x31,  0x33,  0x0,  0x31,  0x33,  0x2e,  0x0,  0x31,  0x33,  0x65e5,  0x0,  0x31,  0x33,  0x70b9,  0x0,  0x31,  0x34,  0x0,  0x31,  0x34,  0x2e,  0x0,  0x31,  0x34,  0x65e5,  0x0,  0x31,  0x34,  0x70b9,  0x0,  0x31,  0x35,  0x0,  0x31,  0x35,  0x2e,  0x0,  0x31,  0x35,  0x65e5,  0x0,  0x31,  0x35,  0x70b9,  0x0,  0x31,  0x36,  0x0,  0x31,  0x36,  0x2e,  0x0,  0x31,  0x36,  0x65e5,  0x0,  0x31,  0x36,  0x70b9,  0x0,  0x31,  0x37,  0x0,  0x31,  0x37,  0x2e,  0x0,  0x31,  0x37,  0x65e5,  0x0,  0x31,  0x37,  0x70b9,  0x0,  0x31,  0x38,  0x0,  0x31,  0x38,  0x2e,  0x0,  0x31,  0x38,  0x65e5,  0x0,  0x31,  0x38,  0x70b9,  0x0,  0x31,  0x39,  0x0,  0x31,  0x39,  0x2e,  0x0,  0x31,  0x39,  0x65e5,  0x0,  0x31,  0x39,  0x70b9,  0x0,  0x31,  0x2044,  0x0,  0x31,  0x2044,  0x31,  0x30,  0x0,  0x31,  0x2044,  0x32,  0x0,  0x31,  0x2044,  0x33,  0x0,  0x31,  0x2044,  0x34,  0x0,  0x31,  0x2044,  0x35,  0x0,  0x31,  0x2044,  0x36,  0x0,  0x31,  0x2044,  0x37,  0x0,  0x31,  0x2044,  0x38,  0x0,  0x31,  0x2044,  0x39,  0x0,  0x31,  0x65e5,  0x0,  0x31,  0x6708,  0x0,  0x31,  0x70b9,  0x0,  0x32,  0x0,  0x32,  0x2c,  0x0,  0x32,  0x2e,  0x0,  0x32,  0x30,  0x0,  0x32,  0x30,  0x2e,  0x0,  0x32,  0x30,  0x65e5,  0x0,  0x32,  0x30,  0x70b9,  0x0,  0x32,  0x31,  0x0,  0x32,  0x31,  0x65e5,  0x0,  0x32,  0x31,  0x70b9,  0x0,  0x32,  0x32,  0x0,  0x32,  0x32,  0x65e5,  0x0,  0x32,  0x32,  0x70b9,  0x0,  0x32,  0x33,  0x0,  0x32,  0x33,  0x65e5,  0x0,  0x32,  0x33,  0x70b9,  0x0,  0x32,  0x34,  0x0,  0x32,  0x34,  0x65e5,  0x0,  0x32,  0x34,  0x70b9,  0x0,  0x32,  0x35,  0x0,  0x32,  0x35,  0x65e5,  0x0,  0x32,  0x36,  0x0,  0x32,  0x36,  0x65e5,  0x0,  0x32,  0x37,  0x0,  0x32,  0x37,  0x65e5,  0x0,  0x32,  0x38,  0x0,  0x32,  0x38,  0x65e5,  0x0,  0x32,  0x39,  0x0,  0x32,  0x39,  0x65e5,  0x0,  0x32,  0x2044,  0x33,  0x0,  0x32,  0x2044,  0x35,  0x0,  0x32,  0x65e5,  0x0,  0x32,  0x6708,  0x0,  0x32,  0x70b9,  0x0,  0x33,  0x0,  0x33,  0x2c,  0x0,  0x33,  0x2e,  0x0,  0x33,  0x30,  0x0,  0x33,  0x30,  0x65e5,  0x0,  0x33,  0x31,  0x0,  0x33,  0x31,  0x65e5,  0x0,  0x33,  0x32,  0x0,  0x33,  0x33,  0x0,  0x33,  0x34,  0x0,  0x33,  0x35,  0x0,  0x33,  0x36,  0x0,  0x33,  0x37,  0x0,  0x33,  0x38,  0x0,  0x33,  0x39,  0x0,  0x33,  0x2044,  0x34,  0x0,  0x33,  0x2044,  0x35,  0x0,  0x33,  0x2044,  0x38,  0x0,  0x33,  0x65e5,  0x0,  0x33,  0x6708,  0x0,  0x33,  0x70b9,  0x0,  0x34,  0x0,  0x34,  0x2c,  0x0,  0x34,  0x2e,  0x0,  0x34,  0x30,  0x0,  0x34,  0x31,  0x0,  0x34,  0x32,  0x0,  0x34,  0x33,  0x0,  0x34,  0x34,  0x0,  0x34,  0x35,  0x0,  0x34,  0x36,  0x0,  0x34,  0x37,  0x0,  0x34,  0x38,  0x0,  0x34,  0x39,  0x0,  0x34,  0x2044,  0x35,  0x0,  0x34,  0x65e5,  0x0,  0x34,  0x6708,  0x0,  0x34,  0x70b9,  0x0,  0x35,  0x0,  0x35,  0x2c,  0x0,  0x35,  0x2e,  0x0,  0x35,  0x30,  0x0,  0x35,  0x2044,  0x36,  0x0,  0x35,  0x2044,  0x38,  0x0,  0x35,  0x65e5,  0x0,  0x35,  0x6708,  0x0,  0x35,  0x70b9,  0x0,  0x36,  0x0,  0x36,  0x2c,  0x0,  0x36,  0x2e,  0x0,  0x36,  0x65e5,  0x0,  0x36,  0x6708,  0x0,  0x36,  0x70b9,  0x0,  0x37,  0x0,  0x37,  0x2c,  0x0,  0x37,  0x2e,  0x0,  0x37,  0x2044,  0x38,  0x0,  0x37,  0x65e5,  0x0,  0x37,  0x6708,  0x0,  0x37,  0x70b9,  0x0,  0x38,  0x0,  0x38,  0x2c,  0x0,  0x38,  0x2e,  0x0,  0x38,  0x65e5,  0x0,  0x38,  0x6708,  0x0,  0x38,  0x70b9,  0x0,  0x39,  0x0,  0x39,  0x2c,  0x0,  0x39,  0x2e,  0x0,  0x39,  0x65e5,  0x0,  0x39,  0x6708,  0x0,  0x39,  0x70b9,  0x0,  0x3a,  0x0,  0x3a,  0x3a,  0x3d,  0x0,  0x3b,  0x0,  0x3c,  0x0,  0x3c,  0x338,  0x0,  0x3d,  0x0,  0x3d,  0x3d,  0x0,  0x3d,  0x3d,  0x3d,  0x0,  0x3d,  0x338,  0x0,  0x3e,  0x0,  0x3e,  0x338,  0x0,  0x3f,  0x0,  0x3f,  0x21,  0x0,  0x3f,  0x3f,  0x0,  0x40,  0x0,  0x41,  0x0,  0x41,  0x55,  0x0,  0x41,  0x300,  0x0,  0x41,  0x301,  0x0,  0x41,  0x302,  0x0,  0x41,  0x302,  0x300,  0x0,  0x41,  0x302,  0x301,  0x0,  0x41,  0x302,  0x303,  0x0,  0x41,  0x302,  0x309,  0x0,  0x41,  0x303,  0x0,  0x41,  0x304,  0x0,  0x41,  0x306,  0x0,  0x41,  0x306,  0x300,  0x0,  0x41,  0x306,  0x301,  0x0,  0x41,  0x306,  0x303,  0x0,  0x41,  0x306,  0x309,  0x0,  0x41,  0x307,  0x0,  0x41,  0x307,  0x304,  0x0,  0x41,  0x308,  0x0,  0x41,  0x308,  0x304,  0x0,  0x41,  0x309,  0x0,  0x41,  0x30a,  0x0,  0x41,  0x30a,  0x301,  0x0,  0x41,  0x30c,  0x0,  0x41,  0x30f,  0x0,  0x41,  0x311,  0x0,  0x41,  0x323,  0x0,  0x41,  0x323,  0x302,  0x0,  0x41,  0x323,  0x306,  0x0,  0x41,  0x325,  0x0,  0x41,  0x328,  0x0,  0x41,  0x2215,  0x6d,  0x0,  0x42,  0x0,  0x42,  0x71,  0x0,  0x42,  0x307,  0x0,  0x42,  0x323,  0x0,  0x42,  0x331,  0x0,  0x43,  0x0,  0x43,  0x44,  0x0,  0x43,  0x6f,  0x2e,  0x0,  0x43,  0x301,  0x0,  0x43,  0x302,  0x0,  0x43,  0x307,  0x0,  0x43,  0x30c,  0x0,  0x43,  0x327,  0x0,  0x43,  0x327,  0x301,  0x0,  0x43,  0x2215,  0x6b,  0x67,  0x0,  0x44,  0x0,  0x44,  0x4a,  0x0,  0x44,  0x5a,  0x0,  0x44,  0x5a,  0x30c,  0x0,  0x44,  0x7a,  0x0,  0x44,  0x7a,  0x30c,  0x0,  0x44,  0x307,  0x0,  0x44,  0x30c,  0x0,  0x44,  0x323,  0x0,  0x44,  0x327,  0x0,  0x44,  0x32d,  0x0,  0x44,  0x331,  0x0,  0x45,  0x0,  0x45,  0x300,  0x0,  0x45,  0x301,  0x0,  0x45,  0x302,  0x0,  0x45,  0x302,  0x300,  0x0,  0x45,  0x302,  0x301,  0x0,  0x45,  0x302,  0x303,  0x0,  0x45,  0x302,  0x309,  0x0,  0x45,  0x303,  0x0,  0x45,  0x304,  0x0,  0x45,  0x304,  0x300,  0x0,  0x45,  0x304,  0x301,  0x0,  0x45,  0x306,  0x0,  0x45,  0x307,  0x0,  0x45,  0x308,  0x0,  0x45,  0x309,  0x0,  0x45,  0x30c,  0x0,  0x45,  0x30f,  0x0,  0x45,  0x311,  0x0,  0x45,  0x323,  0x0,  0x45,  0x323,  0x302,  0x0,  0x45,  0x327,  0x0,  0x45,  0x327,  0x306,  0x0,  0x45,  0x328,  0x0,  0x45,  0x32d,  0x0,  0x45,  0x330,  0x0,  0x46,  0x0,  0x46,  0x41,  0x58,  0x0,  0x46,  0x307,  0x0,  0x47,  0x0,  0x47,  0x42,  0x0,  0x47,  0x48,  0x7a,  0x0,  0x47,  0x50,  0x61,  0x0,  0x47,  0x79,  0x0,  0x47,  0x301,  0x0,  0x47,  0x302,  0x0,  0x47,  0x304,  0x0,  0x47,  0x306,  0x0,  0x47,  0x307,  0x0,  0x47,  0x30c,  0x0,  0x47,  0x327,  0x0,  0x48,  0x0,  0x48,  0x50,  0x0,  0x48,  0x56,  0x0,  0x48,  0x67,  0x0,  0x48,  0x7a,  0x0,  0x48,  0x302,  0x0,  0x48,  0x307,  0x0,  0x48,  0x308,  0x0,  0x48,  0x30c,  0x0,  0x48,  0x323,  0x0,  0x48,  0x327,  0x0,  0x48,  0x32e,  0x0,  0x49,  0x0,  0x49,  0x49,  0x0,  0x49,  0x49,  0x49,  0x0,  0x49,  0x4a,  0x0,  0x49,  0x55,  0x0,  0x49,  0x56,  0x0,  0x49,  0x58,  0x0,  0x49,  0x300,  0x0,  0x49,  0x301,  0x0,  0x49,  0x302,  0x0,  0x49,  0x303,  0x0,  0x49,  0x304,  0x0,  0x49,  0x306,  0x0,  0x49,  0x307,  0x0,  0x49,  0x308,  0x0,  0x49,  0x308,  0x301,  0x0,  0x49,  0x309,  0x0,  0x49,  0x30c,  0x0,  0x49,  0x30f,  0x0,  0x49,  0x311,  0x0,  0x49,  0x323,  0x0,  0x49,  0x328,  0x0,  0x49,  0x330,  0x0,  0x4a,  0x0,  0x4a,  0x302,  0x0,  0x4b,  0x0,  0x4b,  0x42,  0x0,  0x4b,  0x4b,  0x0,  0x4b,  0x4d,  0x0,  0x4b,  0x301,  0x0,  0x4b,  0x30c,  0x0,  0x4b,  0x323,  0x0,  0x4b,  0x327,  0x0,  0x4b,  0x331,  0x0,  0x4c,  0x0,  0x4c,  0x4a,  0x0,  0x4c,  0x54,  0x44,  0x0,  0x4c,  0x6a,  0x0,  0x4c,  0xb7,  0x0,  0x4c,  0x301,  0x0,  0x4c,  0x30c,  0x0,  0x4c,  0x323,  0x0,  0x4c,  0x323,  0x304,  0x0,  0x4c,  0x327,  0x0,  0x4c,  0x32d,  0x0,  0x4c,  0x331,  0x0,  0x4d,  0x0,  0x4d,  0x42,  0x0,  0x4d,  0x43,  0x0,  0x4d,  0x44,  0x0,  0x4d,  0x48,  0x7a,  0x0,  0x4d,  0x50,  0x61,  0x0,  0x4d,  0x56,  0x0,  0x4d,  0x57,  0x0,  0x4d,  0x301,  0x0,  0x4d,  0x307,  0x0,  0x4d,  0x323,  0x0,  0x4d,  0x3a9,  0x0,  0x4e,  0x0,  0x4e,  0x4a,  0x0,  0x4e,  0x6a,  0x0,  0x4e,  0x6f,  0x0,  0x4e,  0x300,  0x0,  0x4e,  0x301,  0x0,  0x4e,  0x303,  0x0,  0x4e,  0x307,  0x0,  0x4e,  0x30c,  0x0,  0x4e,  0x323,  0x0,  0x4e,  0x327,  0x0,  0x4e,  0x32d,  0x0,  0x4e,  0x331,  0x0,  0x4f,  0x0,  0x4f,  0x300,  0x0,  0x4f,  0x301,  0x0,  0x4f,  0x302,  0x0,  0x4f,  0x302,  0x300,  0x0,  0x4f,  0x302,  0x301,  0x0,  0x4f,  0x302,  0x303,  0x0,  0x4f,  0x302,  0x309,  0x0,  0x4f,  0x303,  0x0,  0x4f,  0x303,  0x301,  0x0,  0x4f,  0x303,  0x304,  0x0,  0x4f,  0x303,  0x308,  0x0,  0x4f,  0x304,  0x0,  0x4f,  0x304,  0x300,  0x0,  0x4f,  0x304,  0x301,  0x0,  0x4f,  0x306,  0x0,  0x4f,  0x307,  0x0,  0x4f,  0x307,  0x304,  0x0,  0x4f,  0x308,  0x0,  0x4f,  0x308,  0x304,  0x0,  0x4f,  0x309,  0x0,  0x4f,  0x30b,  0x0,  0x4f,  0x30c,  0x0,  0x4f,  0x30f,  0x0,  0x4f,  0x311,  0x0,  0x4f,  0x31b,  0x0,  0x4f,  0x31b,  0x300,  0x0,  0x4f,  0x31b,  0x301,  0x0,  0x4f,  0x31b,  0x303,  0x0,  0x4f,  0x31b,  0x309,  0x0,  0x4f,  0x31b,  0x323,  0x0,  0x4f,  0x323,  0x0,  0x4f,  0x323,  0x302,  0x0,  0x4f,  0x328,  0x0,  0x4f,  0x328,  0x304,  0x0,  0x50,  0x0,  0x50,  0x48,  0x0,  0x50,  0x50,  0x4d,  0x0,  0x50,  0x50,  0x56,  0x0,  0x50,  0x52,  0x0,  0x50,  0x54,  0x45,  0x0,  0x50,  0x61,  0x0,  0x50,  0x301,  0x0,  0x50,  0x307,  0x0,  0x51,  0x0,  0x52,  0x0,  0x52,  0x73,  0x0,  0x52,  0x301,  0x0,  0x52,  0x307,  0x0,  0x52,  0x30c,  0x0,  0x52,  0x30f,  0x0,  0x52,  0x311,  0x0,  0x52,  0x323,  0x0,  0x52,  0x323,  0x304,  0x0,  0x52,  0x327,  0x0,  0x52,  0x331,  0x0,  0x53,  0x0,  0x53,  0x44,  0x0,  0x53,  0x4d,  0x0,  0x53,  0x53,  0x0,  0x53,  0x76,  0x0,  0x53,  0x301,  0x0,  0x53,  0x301,  0x307,  0x0,  0x53,  0x302,  0x0,  0x53,  0x307,  0x0,  0x53,  0x30c,  0x0,  0x53,  0x30c,  0x307,  0x0,  0x53,  0x323,  0x0,  0x53,  0x323,  0x307,  0x0,  0x53,  0x326,  0x0,  0x53,  0x327,  0x0,  0x54,  0x0,  0x54,  0x45,  0x4c,  0x0,  0x54,  0x48,  0x7a,  0x0,  0x54,  0x4d,  0x0,  0x54,  0x307,  0x0,  0x54,  0x30c,  0x0,  0x54,  0x323,  0x0,  0x54,  0x326,  0x0,  0x54,  0x327,  0x0,  0x54,  0x32d,  0x0,  0x54,  0x331,  0x0,  0x55,  0x0,  0x55,  0x300,  0x0,  0x55,  0x301,  0x0,  0x55,  0x302,  0x0,  0x55,  0x303,  0x0,  0x55,  0x303,  0x301,  0x0,  0x55,  0x304,  0x0,  0x55,  0x304,  0x308,  0x0,  0x55,  0x306,  0x0,  0x55,  0x308,  0x0,  0x55,  0x308,  0x300,  0x0,  0x55,  0x308,  0x301,  0x0,  0x55,  0x308,  0x304,  0x0,  0x55,  0x308,  0x30c,  0x0,  0x55,  0x309,  0x0,  0x55,  0x30a,  0x0,  0x55,  0x30b,  0x0,  0x55,  0x30c,  0x0,  0x55,  0x30f,  0x0,  0x55,  0x311,  0x0,  0x55,  0x31b,  0x0,  0x55,  0x31b,  0x300,  0x0,  0x55,  0x31b,  0x301,  0x0,  0x55,  0x31b,  0x303,  0x0,  0x55,  0x31b,  0x309,  0x0,  0x55,  0x31b,  0x323,  0x0,  0x55,  0x323,  0x0,  0x55,  0x324,  0x0,  0x55,  0x328,  0x0,  0x55,  0x32d,  0x0,  0x55,  0x330,  0x0,  0x56,  0x0,  0x56,  0x49,  0x0,  0x56,  0x49,  0x49,  0x0,  0x56,  0x49,  0x49,  0x49,  0x0,  0x56,  0x303,  0x0,  0x56,  0x323,  0x0,  0x56,  0x2215,  0x6d,  0x0,  0x57,  0x0,  0x57,  0x43,  0x0,  0x57,  0x5a,  0x0,  0x57,  0x62,  0x0,  0x57,  0x300,  0x0,  0x57,  0x301,  0x0,  0x57,  0x302,  0x0,  0x57,  0x307,  0x0,  0x57,  0x308,  0x0,  0x57,  0x323,  0x0,  0x58,  0x0,  0x58,  0x49,  0x0,  0x58,  0x49,  0x49,  0x0,  0x58,  0x307,  0x0,  0x58,  0x308,  0x0,  0x59,  0x0,  0x59,  0x300,  0x0,  0x59,  0x301,  0x0,  0x59,  0x302,  0x0,  0x59,  0x303,  0x0,  0x59,  0x304,  0x0,  0x59,  0x307,  0x0,  0x59,  0x308,  0x0,  0x59,  0x309,  0x0,  0x59,  0x323,  0x0,  0x5a,  0x0,  0x5a,  0x301,  0x0,  0x5a,  0x302,  0x0,  0x5a,  0x307,  0x0,  0x5a,  0x30c,  0x0,  0x5a,  0x323,  0x0,  0x5a,  0x331,  0x0,  0x5b,  0x0,  0x5c,  0x0,  0x5d,  0x0,  0x5e,  0x0,  0x5f,  0x0,  0x60,  0x0,  0x61,  0x0,  0x61,  0x2e,  0x6d,  0x2e,  0x0,  0x61,  0x2f,  0x63,  0x0,  0x61,  0x2f,  0x73,  0x0,  0x61,  0x2be,  0x0,  0x61,  0x300,  0x0,  0x61,  0x301,  0x0,  0x61,  0x302,  0x0,  0x61,  0x302,  0x300,  0x0,  0x61,  0x302,  0x301,  0x0,  0x61,  0x302,  0x303,  0x0,  0x61,  0x302,  0x309,  0x0,  0x61,  0x303,  0x0,  0x61,  0x304,  0x0,  0x61,  0x306,  0x0,  0x61,  0x306,  0x300,  0x0,  0x61,  0x306,  0x301,  0x0,  0x61,  0x306,  0x303,  0x0,  0x61,  0x306,  0x309,  0x0,  0x61,  0x307,  0x0,  0x61,  0x307,  0x304,  0x0,  0x61,  0x308,  0x0,  0x61,  0x308,  0x304,  0x0,  0x61,  0x309,  0x0,  0x61,  0x30a,  0x0,  0x61,  0x30a,  0x301,  0x0,  0x61,  0x30c,  0x0,  0x61,  0x30f,  0x0,  0x61,  0x311,  0x0,  0x61,  0x323,  0x0,  0x61,  0x323,  0x302,  0x0,  0x61,  0x323,  0x306,  0x0,  0x61,  0x325,  0x0,  0x61,  0x328,  0x0,  0x62,  0x0,  0x62,  0x61,  0x72,  0x0,  0x62,  0x307,  0x0,  0x62,  0x323,  0x0,  0x62,  0x331,  0x0,  0x63,  0x0,  0x63,  0x2f,  0x6f,  0x0,  0x63,  0x2f,  0x75,  0x0,  0x63,  0x61,  0x6c,  0x0,  0x63,  0x63,  0x0,  0x63,  0x64,  0x0,  0x63,  0x6d,  0x0,  0x63,  0x6d,  0x32,  0x0,  0x63,  0x6d,  0x33,  0x0,  0x63,  0x301,  0x0,  0x63,  0x302,  0x0,  0x63,  0x307,  0x0,  0x63,  0x30c,  0x0,  0x63,  0x327,  0x0,  0x63,  0x327,  0x301,  0x0,  0x64,  0x0,  0x64,  0x42,  0x0,  0x64,  0x61,  0x0,  0x64,  0x6c,  0x0,  0x64,  0x6d,  0x0,  0x64,  0x6d,  0x32,  0x0,  0x64,  0x6d,  0x33,  0x0,  0x64,  0x7a,  0x0,  0x64,  0x7a,  0x30c,  0x0,  0x64,  0x307,  0x0,  0x64,  0x30c,  0x0,  0x64,  0x323,  0x0,  0x64,  0x327,  0x0,  0x64,  0x32d,  0x0,  0x64,  0x331,  0x0,  0x65,  0x0,  0x65,  0x56,  0x0,  0x65,  0x72,  0x67,  0x0,  0x65,  0x300,  0x0,  0x65,  0x301,  0x0,  0x65,  0x302,  0x0,  0x65,  0x302,  0x300,  0x0,  0x65,  0x302,  0x301,  0x0,  0x65,  0x302,  0x303,  0x0,  0x65,  0x302,  0x309,  0x0,  0x65,  0x303,  0x0,  0x65,  0x304,  0x0,  0x65,  0x304,  0x300,  0x0,  0x65,  0x304,  0x301,  0x0,  0x65,  0x306,  0x0,  0x65,  0x307,  0x0,  0x65,  0x308,  0x0,  0x65,  0x309,  0x0,  0x65,  0x30c,  0x0,  0x65,  0x30f,  0x0,  0x65,  0x311,  0x0,  0x65,  0x323,  0x0,  0x65,  0x323,  0x302,  0x0,  0x65,  0x327,  0x0,  0x65,  0x327,  0x306,  0x0,  0x65,  0x328,  0x0,  0x65,  0x32d,  0x0,  0x65,  0x330,  0x0,  0x66,  0x0,  0x66,  0x66,  0x0,  0x66,  0x66,  0x69,  0x0,  0x66,  0x66,  0x6c,  0x0,  0x66,  0x69,  0x0,  0x66,  0x6c,  0x0,  0x66,  0x6d,  0x0,  0x66,  0x307,  0x0,  0x67,  0x0,  0x67,  0x61,  0x6c,  0x0,  0x67,  0x301,  0x0,  0x67,  0x302,  0x0,  0x67,  0x304,  0x0,  0x67,  0x306,  0x0,  0x67,  0x307,  0x0,  0x67,  0x30c,  0x0,  0x67,  0x327,  0x0,  0x68,  0x0,  0x68,  0x50,  0x61,  0x0,  0x68,  0x61,  0x0,  0x68,  0x302,  0x0,  0x68,  0x307,  0x0,  0x68,  0x308,  0x0,  0x68,  0x30c,  0x0,  0x68,  0x323,  0x0,  0x68,  0x327,  0x0,  0x68,  0x32e,  0x0,  0x68,  0x331,  0x0,  0x69,  0x0,  0x69,  0x69,  0x0,  0x69,  0x69,  0x69,  0x0,  0x69,  0x6a,  0x0,  0x69,  0x6e,  0x0,  0x69,  0x76,  0x0,  0x69,  0x78,  0x0,  0x69,  0x300,  0x0,  0x69,  0x301,  0x0,  0x69,  0x302,  0x0,  0x69,  0x303,  0x0,  0x69,  0x304,  0x0,  0x69,  0x306,  0x0,  0x69,  0x308,  0x0,  0x69,  0x308,  0x301,  0x0,  0x69,  0x309,  0x0,  0x69,  0x30c,  0x0,  0x69,  0x30f,  0x0,  0x69,  0x311,  0x0,  0x69,  0x323,  0x0,  0x69,  0x328,  0x0,  0x69,  0x330,  0x0,  0x6a,  0x0,  0x6a,  0x302,  0x0,  0x6a,  0x30c,  0x0,  0x6b,  0x0,  0x6b,  0x41,  0x0,  0x6b,  0x48,  0x7a,  0x0,  0x6b,  0x50,  0x61,  0x0,  0x6b,  0x56,  0x0,  0x6b,  0x57,  0x0,  0x6b,  0x63,  0x61,  0x6c,  0x0,  0x6b,  0x67,  0x0,  0x6b,  0x6c,  0x0,  0x6b,  0x6d,  0x0,  0x6b,  0x6d,  0x32,  0x0,  0x6b,  0x6d,  0x33,  0x0,  0x6b,  0x74,  0x0,  0x6b,  0x301,  0x0,  0x6b,  0x30c,  0x0,  0x6b,  0x323,  0x0,  0x6b,  0x327,  0x0,  0x6b,  0x331,  0x0,  0x6b,  0x3a9,  0x0,  0x6c,  0x0,  0x6c,  0x6a,  0x0,  0x6c,  0x6d,  0x0,  0x6c,  0x6e,  0x0,  0x6c,  0x6f,  0x67,  0x0,  0x6c,  0x78,  0x0,  0x6c,  0xb7,  0x0,  0x6c,  0x301,  0x0,  0x6c,  0x30c,  0x0,  0x6c,  0x323,  0x0,  0x6c,  0x323,  0x304,  0x0,  0x6c,  0x327,  0x0,  0x6c,  0x32d,  0x0,  0x6c,  0x331,  0x0,  0x6d,  0x0,  0x6d,  0x32,  0x0,  0x6d,  0x33,  0x0,  0x6d,  0x41,  0x0,  0x6d,  0x56,  0x0,  0x6d,  0x57,  0x0,  0x6d,  0x62,  0x0,  0x6d,  0x67,  0x0,  0x6d,  0x69,  0x6c,  0x0,  0x6d,  0x6c,  0x0,  0x6d,  0x6d,  0x0,  0x6d,  0x6d,  0x32,  0x0,  0x6d,  0x6d,  0x33,  0x0,  0x6d,  0x6f,  0x6c,  0x0,  0x6d,  0x73,  0x0,  0x6d,  0x301,  0x0,  0x6d,  0x307,  0x0,  0x6d,  0x323,  0x0,  0x6d,  0x2215,  0x73,  0x0,  0x6d,  0x2215,  0x73,  0x32,  0x0,  0x6e,  0x0,  0x6e,  0x41,  0x0,  0x6e,  0x46,  0x0,  0x6e,  0x56,  0x0,  0x6e,  0x57,  0x0,  0x6e,  0x6a,  0x0,  0x6e,  0x6d,  0x0,  0x6e,  0x73,  0x0,  0x6e,  0x300,  0x0,  0x6e,  0x301,  0x0,  0x6e,  0x303,  0x0,  0x6e,  0x307,  0x0,  0x6e,  0x30c,  0x0,  0x6e,  0x323,  0x0,  0x6e,  0x327,  0x0,  0x6e,  0x32d,  0x0,  0x6e,  0x331,  0x0,  0x6f,  0x0,  0x6f,  0x56,  0x0,  0x6f,  0x300,  0x0,  0x6f,  0x301,  0x0,  0x6f,  0x302,  0x0,  0x6f,  0x302,  0x300,  0x0,  0x6f,  0x302,  0x301,  0x0,  0x6f,  0x302,  0x303,  0x0,  0x6f,  0x302,  0x309,  0x0,  0x6f,  0x303,  0x0,  0x6f,  0x303,  0x301,  0x0,  0x6f,  0x303,  0x304,  0x0,  0x6f,  0x303,  0x308,  0x0,  0x6f,  0x304,  0x0,  0x6f,  0x304,  0x300,  0x0,  0x6f,  0x304,  0x301,  0x0,  0x6f,  0x306,  0x0,  0x6f,  0x307,  0x0,  0x6f,  0x307,  0x304,  0x0,  0x6f,  0x308,  0x0,  0x6f,  0x308,  0x304,  0x0,  0x6f,  0x309,  0x0,  0x6f,  0x30b,  0x0,  0x6f,  0x30c,  0x0,  0x6f,  0x30f,  0x0,  0x6f,  0x311,  0x0,  0x6f,  0x31b,  0x0,  0x6f,  0x31b,  0x300,  0x0,  0x6f,  0x31b,  0x301,  0x0,  0x6f,  0x31b,  0x303,  0x0,  0x6f,  0x31b,  0x309,  0x0,  0x6f,  0x31b,  0x323,  0x0,  0x6f,  0x323,  0x0,  0x6f,  0x323,  0x302,  0x0,  0x6f,  0x328,  0x0,  0x6f,  0x328,  0x304,  0x0,  0x70,  0x0,  0x70,  0x2e,  0x6d,  0x2e,  0x0,  0x70,  0x41,  0x0,  0x70,  0x46,  0x0,  0x70,  0x56,  0x0,  0x70,  0x57,  0x0,  0x70,  0x63,  0x0,  0x70,  0x73,  0x0,  0x70,  0x301,  0x0,  0x70,  0x307,  0x0,  0x71,  0x0,  0x72,  0x0,  0x72,  0x61,  0x64,  0x0,  0x72,  0x61,  0x64,  0x2215,  0x73,  0x0,  0x72,  0x61,  0x64,  0x2215,  0x73,  0x32,  0x0,  0x72,  0x301,  0x0,  0x72,  0x307,  0x0,  0x72,  0x30c,  0x0,  0x72,  0x30f,  0x0,  0x72,  0x311,  0x0,  0x72,  0x323,  0x0,  0x72,  0x323,  0x304,  0x0,  0x72,  0x327,  0x0,  0x72,  0x331,  0x0,  0x73,  0x0,  0x73,  0x72,  0x0,  0x73,  0x74,  0x0,  0x73,  0x301,  0x0,  0x73,  0x301,  0x307,  0x0,  0x73,  0x302,  0x0,  0x73,  0x307,  0x0,  0x73,  0x30c,  0x0,  0x73,  0x30c,  0x307,  0x0,  0x73,  0x323,  0x0,  0x73,  0x323,  0x307,  0x0,  0x73,  0x326,  0x0,  0x73,  0x327,  0x0,  0x74,  0x0,  0x74,  0x307,  0x0,  0x74,  0x308,  0x0,  0x74,  0x30c,  0x0,  0x74,  0x323,  0x0,  0x74,  0x326,  0x0,  0x74,  0x327,  0x0,  0x74,  0x32d,  0x0,  0x74,  0x331,  0x0,  0x75,  0x0,  0x75,  0x300,  0x0,  0x75,  0x301,  0x0,  0x75,  0x302,  0x0,  0x75,  0x303,  0x0,  0x75,  0x303,  0x301,  0x0,  0x75,  0x304,  0x0,  0x75,  0x304,  0x308,  0x0,  0x75,  0x306,  0x0,  0x75,  0x308,  0x0,  0x75,  0x308,  0x300,  0x0,  0x75,  0x308,  0x301,  0x0,  0x75,  0x308,  0x304,  0x0,  0x75,  0x308,  0x30c,  0x0,  0x75,  0x309,  0x0,  0x75,  0x30a,  0x0,  0x75,  0x30b,  0x0,  0x75,  0x30c,  0x0,  0x75,  0x30f,  0x0,  0x75,  0x311,  0x0,  0x75,  0x31b,  0x0,  0x75,  0x31b,  0x300,  0x0,  0x75,  0x31b,  0x301,  0x0,  0x75,  0x31b,  0x303,  0x0,  0x75,  0x31b,  0x309,  0x0,  0x75,  0x31b,  0x323,  0x0,  0x75,  0x323,  0x0,  0x75,  0x324,  0x0,  0x75,  0x328,  0x0,  0x75,  0x32d,  0x0,  0x75,  0x330,  0x0,  0x76,  0x0,  0x76,  0x69,  0x0,  0x76,  0x69,  0x69,  0x0,  0x76,  0x69,  0x69,  0x69,  0x0,  0x76,  0x303,  0x0,  0x76,  0x323,  0x0,  0x77,  0x0,  0x77,  0x300,  0x0,  0x77,  0x301,  0x0,  0x77,  0x302,  0x0,  0x77,  0x307,  0x0,  0x77,  0x308,  0x0,  0x77,  0x30a,  0x0,  0x77,  0x323,  0x0,  0x78,  0x0,  0x78,  0x69,  0x0,  0x78,  0x69,  0x69,  0x0,  0x78,  0x307,  0x0,  0x78,  0x308,  0x0,  0x79,  0x0,  0x79,  0x300,  0x0,  0x79,  0x301,  0x0,  0x79,  0x302,  0x0,  0x79,  0x303,  0x0,  0x79,  0x304,  0x0,  0x79,  0x307,  0x0,  0x79,  0x308,  0x0,  0x79,  0x309,  0x0,  0x79,  0x30a,  0x0,  0x79,  0x323,  0x0,  0x7a,  0x0,  0x7a,  0x301,  0x0,  0x7a,  0x302,  0x0,  0x7a,  0x307,  0x0,  0x7a,  0x30c,  0x0,  0x7a,  0x323,  0x0,  0x7a,  0x331,  0x0,  0x7b,  0x0,  0x7c,  0x0,  0x7d,  0x0,  0x7e,  0x0,  0xa2,  0x0,  0xa3,  0x0,  0xa5,  0x0,  0xa6,  0x0,  0xac,  0x0,  0xb0,  0x43,  0x0,  0xb0,  0x46,  0x0,  0xb7,  0x0,  0xc6,  0x0,  0xc6,  0x301,  0x0,  0xc6,  0x304,  0x0,  0xd8,  0x301,  0x0,  0xe6,  0x301,  0x0,  0xe6,  0x304,  0x0,  0xf0,  0x0,  0xf8,  0x301,  0x0,  0x126,  0x0,  0x127,  0x0,  0x131,  0x0,  0x14b,  0x0,  0x153,  0x0,  0x18e,  0x0,  0x190,  0x0,  0x1ab,  0x0,  0x1b7,  0x30c,  0x0,  0x222,  0x0,  0x237,  0x0,  0x250,  0x0,  0x251,  0x0,  0x252,  0x0,  0x254,  0x0,  0x255,  0x0,  0x259,  0x0,  0x25b,  0x0,  0x25c,  0x0,  0x25f,  0x0,  0x261,  0x0,  0x263,  0x0,  0x265,  0x0,  0x266,  0x0,  0x268,  0x0,  0x269,  0x0,  0x26a,  0x0,  0x26d,  0x0,  0x26f,  0x0,  0x270,  0x0,  0x271,  0x0,  0x272,  0x0,  0x273,  0x0,  0x274,  0x0,  0x275,  0x0,  0x278,  0x0,  0x279,  0x0,  0x27b,  0x0,  0x281,  0x0,  0x282,  0x0,  0x283,  0x0,  0x289,  0x0,  0x28a,  0x0,  0x28b,  0x0,  0x28c,  0x0,  0x290,  0x0,  0x291,  0x0,  0x292,  0x0,  0x292,  0x30c,  0x0,  0x295,  0x0,  0x29d,  0x0,  0x29f,  0x0,  0x2b9,  0x0,  0x2bc,  0x6e,  0x0,  0x300,  0x0,  0x301,  0x0,  0x308,  0x301,  0x0,  0x313,  0x0,  0x391,  0x0,  0x391,  0x300,  0x0,  0x391,  0x301,  0x0,  0x391,  0x304,  0x0,  0x391,  0x306,  0x0,  0x391,  0x313,  0x0,  0x391,  0x313,  0x300,  0x0,  0x391,  0x313,  0x300,  0x345,  0x0,  0x391,  0x313,  0x301,  0x0,  0x391,  0x313,  0x301,  0x345,  0x0,  0x391,  0x313,  0x342,  0x0,  0x391,  0x313,  0x342,  0x345,  0x0,  0x391,  0x313,  0x345,  0x0,  0x391,  0x314,  0x0,  0x391,  0x314,  0x300,  0x0,  0x391,  0x314,  0x300,  0x345,  0x0,  0x391,  0x314,  0x301,  0x0,  0x391,  0x314,  0x301,  0x345,  0x0,  0x391,  0x314,  0x342,  0x0,  0x391,  0x314,  0x342,  0x345,  0x0,  0x391,  0x314,  0x345,  0x0,  0x391,  0x345,  0x0,  0x392,  0x0,  0x393,  0x0,  0x394,  0x0,  0x395,  0x0,  0x395,  0x300,  0x0,  0x395,  0x301,  0x0,  0x395,  0x313,  0x0,  0x395,  0x313,  0x300,  0x0,  0x395,  0x313,  0x301,  0x0,  0x395,  0x314,  0x0,  0x395,  0x314,  0x300,  0x0,  0x395,  0x314,  0x301,  0x0,  0x396,  0x0,  0x397,  0x0,  0x397,  0x300,  0x0,  0x397,  0x301,  0x0,  0x397,  0x313,  0x0,  0x397,  0x313,  0x300,  0x0,  0x397,  0x313,  0x300,  0x345,  0x0,  0x397,  0x313,  0x301,  0x0,  0x397,  0x313,  0x301,  0x345,  0x0,  0x397,  0x313,  0x342,  0x0,  0x397,  0x313,  0x342,  0x345,  0x0,  0x397,  0x313,  0x345,  0x0,  0x397,  0x314,  0x0,  0x397,  0x314,  0x300,  0x0,  0x397,  0x314,  0x300,  0x345,  0x0,  0x397,  0x314,  0x301,  0x0,  0x397,  0x314,  0x301,  0x345,  0x0,  0x397,  0x314,  0x342,  0x0,  0x397,  0x314,  0x342,  0x345,  0x0,  0x397,  0x314,  0x345,  0x0,  0x397,  0x345,  0x0,  0x398,  0x0,  0x399,  0x0,  0x399,  0x300,  0x0,  0x399,  0x301,  0x0,  0x399,  0x304,  0x0,  0x399,  0x306,  0x0,  0x399,  0x308,  0x0,  0x399,  0x313,  0x0,  0x399,  0x313,  0x300,  0x0,  0x399,  0x313,  0x301,  0x0,  0x399,  0x313,  0x342,  0x0,  0x399,  0x314,  0x0,  0x399,  0x314,  0x300,  0x0,  0x399,  0x314,  0x301,  0x0,  0x399,  0x314,  0x342,  0x0,  0x39a,  0x0,  0x39b,  0x0,  0x39c,  0x0,  0x39d,  0x0,  0x39e,  0x0,  0x39f,  0x0,  0x39f,  0x300,  0x0,  0x39f,  0x301,  0x0,  0x39f,  0x313,  0x0,  0x39f,  0x313,  0x300,  0x0,  0x39f,  0x313,  0x301,  0x0,  0x39f,  0x314,  0x0,  0x39f,  0x314,  0x300,  0x0,  0x39f,  0x314,  0x301,  0x0,  0x3a0,  0x0,  0x3a1,  0x0,  0x3a1,  0x314,  0x0,  0x3a3,  0x0,  0x3a4,  0x0,  0x3a5,  0x0,  0x3a5,  0x300,  0x0,  0x3a5,  0x301,  0x0,  0x3a5,  0x304,  0x0,  0x3a5,  0x306,  0x0,  0x3a5,  0x308,  0x0,  0x3a5,  0x314,  0x0,  0x3a5,  0x314,  0x300,  0x0,  0x3a5,  0x314,  0x301,  0x0,  0x3a5,  0x314,  0x342,  0x0,  0x3a6,  0x0,  0x3a7,  0x0,  0x3a8,  0x0,  0x3a9,  0x0,  0x3a9,  0x300,  0x0,  0x3a9,  0x301,  0x0,  0x3a9,  0x313,  0x0,  0x3a9,  0x313,  0x300,  0x0,  0x3a9,  0x313,  0x300,  0x345,  0x0,  0x3a9,  0x313,  0x301,  0x0,  0x3a9,  0x313,  0x301,  0x345,  0x0,  0x3a9,  0x313,  0x342,  0x0,  0x3a9,  0x313,  0x342,  0x345,  0x0,  0x3a9,  0x313,  0x345,  0x0,  0x3a9,  0x314,  0x0,  0x3a9,  0x314,  0x300,  0x0,  0x3a9,  0x314,  0x300,  0x345,  0x0,  0x3a9,  0x314,  0x301,  0x0,  0x3a9,  0x314,  0x301,  0x345,  0x0,  0x3a9,  0x314,  0x342,  0x0,  0x3a9,  0x314,  0x342,  0x345,  0x0,  0x3a9,  0x314,  0x345,  0x0,  0x3a9,  0x345,  0x0,  0x3b1,  0x0,  0x3b1,  0x300,  0x0,  0x3b1,  0x300,  0x345,  0x0,  0x3b1,  0x301,  0x0,  0x3b1,  0x301,  0x345,  0x0,  0x3b1,  0x304,  0x0,  0x3b1,  0x306,  0x0,  0x3b1,  0x313,  0x0,  0x3b1,  0x313,  0x300,  0x0,  0x3b1,  0x313,  0x300,  0x345,  0x0,  0x3b1,  0x313,  0x301,  0x0,  0x3b1,  0x313,  0x301,  0x345,  0x0,  0x3b1,  0x313,  0x342,  0x0,  0x3b1,  0x313,  0x342,  0x345,  0x0,  0x3b1,  0x313,  0x345,  0x0,  0x3b1,  0x314,  0x0,  0x3b1,  0x314,  0x300,  0x0,  0x3b1,  0x314,  0x300,  0x345,  0x0,  0x3b1,  0x314,  0x301,  0x0,  0x3b1,  0x314,  0x301,  0x345,  0x0,  0x3b1,  0x314,  0x342,  0x0,  0x3b1,  0x314,  0x342,  0x345,  0x0,  0x3b1,  0x314,  0x345,  0x0,  0x3b1,  0x342,  0x0,  0x3b1,  0x342,  0x345,  0x0,  0x3b1,  0x345,  0x0,  0x3b2,  0x0,  0x3b3,  0x0,  0x3b4,  0x0,  0x3b5,  0x0,  0x3b5,  0x300,  0x0,  0x3b5,  0x301,  0x0,  0x3b5,  0x313,  0x0,  0x3b5,  0x313,  0x300,  0x0,  0x3b5,  0x313,  0x301,  0x0,  0x3b5,  0x314,  0x0,  0x3b5,  0x314,  0x300,  0x0,  0x3b5,  0x314,  0x301,  0x0,  0x3b6,  0x0,  0x3b7,  0x0,  0x3b7,  0x300,  0x0,  0x3b7,  0x300,  0x345,  0x0,  0x3b7,  0x301,  0x0,  0x3b7,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x0,  0x3b7,  0x313,  0x300,  0x0,  0x3b7,  0x313,  0x300,  0x345,  0x0,  0x3b7,  0x313,  0x301,  0x0,  0x3b7,  0x313,  0x301,  0x345,  0x0,  0x3b7,  0x313,  0x342,  0x0,  0x3b7,  0x313,  0x342,  0x345,  0x0,  0x3b7,  0x313,  0x345,  0x0,  0x3b7,  0x314,  0x0,  0x3b7,  0x314,  0x300,  0x0,  0x3b7,  0x314,  0x300,  0x345,  0x0,  0x3b7,  0x314,  0x301,  0x0,  0x3b7,  0x314,  0x301,  0x345,  0x0,  0x3b7,  0x314,  0x342,  0x0,  0x3b7,  0x314,  0x342,  0x345,  0x0,  0x3b7,  0x314,  0x345,  0x0,  0x3b7,  0x342,  0x0,  0x3b7,  0x342,  0x345,  0x0,  0x3b7,  0x345,  0x0,  0x3b8,  0x0,  0x3b9,  0x0,  0x3b9,  0x300,  0x0,  0x3b9,  0x301,  0x0,  0x3b9,  0x304,  0x0,  0x3b9,  0x306,  0x0,  0x3b9,  0x308,  0x0,  0x3b9,  0x308,  0x300,  0x0,  0x3b9,  0x308,  0x301,  0x0,  0x3b9,  0x308,  0x342,  0x0,  0x3b9,  0x313,  0x0,  0x3b9,  0x313,  0x300,  0x0,  0x3b9,  0x313,  0x301,  0x0,  0x3b9,  0x313,  0x342,  0x0,  0x3b9,  0x314,  0x0,  0x3b9,  0x314,  0x300,  0x0,  0x3b9,  0x314,  0x301,  0x0,  0x3b9,  0x314,  0x342,  0x0,  0x3b9,  0x342,  0x0,  0x3ba,  0x0,  0x3bb,  0x0,  0x3bc,  0x0,  0x3bc,  0x41,  0x0,  0x3bc,  0x46,  0x0,  0x3bc,  0x56,  0x0,  0x3bc,  0x57,  0x0,  0x3bc,  0x67,  0x0,  0x3bc,  0x6c,  0x0,  0x3bc,  0x6d,  0x0,  0x3bc,  0x73,  0x0,  0x3bd,  0x0,  0x3be,  0x0,  0x3bf,  0x0,  0x3bf,  0x300,  0x0,  0x3bf,  0x301,  0x0,  0x3bf,  0x313,  0x0,  0x3bf,  0x313,  0x300,  0x0,  0x3bf,  0x313,  0x301,  0x0,  0x3bf,  0x314,  0x0,  0x3bf,  0x314,  0x300,  0x0,  0x3bf,  0x314,  0x301,  0x0,  0x3c0,  0x0,  0x3c1,  0x0,  0x3c1,  0x313,  0x0,  0x3c1,  0x314,  0x0,  0x3c2,  0x0,  0x3c3,  0x0,  0x3c4,  0x0,  0x3c5,  0x0,  0x3c5,  0x300,  0x0,  0x3c5,  0x301,  0x0,  0x3c5,  0x304,  0x0,  0x3c5,  0x306,  0x0,  0x3c5,  0x308,  0x0,  0x3c5,  0x308,  0x300,  0x0,  0x3c5,  0x308,  0x301,  0x0,  0x3c5,  0x308,  0x342,  0x0,  0x3c5,  0x313,  0x0,  0x3c5,  0x313,  0x300,  0x0,  0x3c5,  0x313,  0x301,  0x0,  0x3c5,  0x313,  0x342,  0x0,  0x3c5,  0x314,  0x0,  0x3c5,  0x314,  0x300,  0x0,  0x3c5,  0x314,  0x301,  0x0,  0x3c5,  0x314,  0x342,  0x0,  0x3c5,  0x342,  0x0,  0x3c6,  0x0,  0x3c7,  0x0,  0x3c8,  0x0,  0x3c9,  0x0,  0x3c9,  0x300,  0x0,  0x3c9,  0x300,  0x345,  0x0,  0x3c9,  0x301,  0x0,  0x3c9,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x0,  0x3c9,  0x313,  0x300,  0x0,  0x3c9,  0x313,  0x300,  0x345,  0x0,  0x3c9,  0x313,  0x301,  0x0,  0x3c9,  0x313,  0x301,  0x345,  0x0,  0x3c9,  0x313,  0x342,  0x0,  0x3c9,  0x313,  0x342,  0x345,  0x0,  0x3c9,  0x313,  0x345,  0x0,  0x3c9,  0x314,  0x0,  0x3c9,  0x314,  0x300,  0x0,  0x3c9,  0x314,  0x300,  0x345,  0x0,  0x3c9,  0x314,  0x301,  0x0,  0x3c9,  0x314,  0x301,  0x345,  0x0,  0x3c9,  0x314,  0x342,  0x0,  0x3c9,  0x314,  0x342,  0x345,  0x0,  0x3c9,  0x314,  0x345,  0x0,  0x3c9,  0x342,  0x0,  0x3c9,  0x342,  0x345,  0x0,  0x3c9,  0x345,  0x0,  0x3dc,  0x0,  0x3dd,  0x0,  0x406,  0x308,  0x0,  0x410,  0x306,  0x0,  0x410,  0x308,  0x0,  0x413,  0x301,  0x0,  0x415,  0x300,  0x0,  0x415,  0x306,  0x0,  0x415,  0x308,  0x0,  0x416,  0x306,  0x0,  0x416,  0x308,  0x0,  0x417,  0x308,  0x0,  0x418,  0x300,  0x0,  0x418,  0x304,  0x0,  0x418,  0x306,  0x0,  0x418,  0x308,  0x0,  0x41a,  0x301,  0x0,  0x41e,  0x308,  0x0,  0x423,  0x304,  0x0,  0x423,  0x306,  0x0,  0x423,  0x308,  0x0,  0x423,  0x30b,  0x0,  0x427,  0x308,  0x0,  0x42b,  0x308,  0x0,  0x42d,  0x308,  0x0,  0x430,  0x306,  0x0,  0x430,  0x308,  0x0,  0x433,  0x301,  0x0,  0x435,  0x300,  0x0,  0x435,  0x306,  0x0,  0x435,  0x308,  0x0,  0x436,  0x306,  0x0,  0x436,  0x308,  0x0,  0x437,  0x308,  0x0,  0x438,  0x300,  0x0,  0x438,  0x304,  0x0,  0x438,  0x306,  0x0,  0x438,  0x308,  0x0,  0x43a,  0x301,  0x0,  0x43d,  0x0,  0x43e,  0x308,  0x0,  0x443,  0x304,  0x0,  0x443,  0x306,  0x0,  0x443,  0x308,  0x0,  0x443,  0x30b,  0x0,  0x447,  0x308,  0x0,  0x44b,  0x308,  0x0,  0x44d,  0x308,  0x0,  0x456,  0x308,  0x0,  0x474,  0x30f,  0x0,  0x475,  0x30f,  0x0,  0x4d8,  0x308,  0x0,  0x4d9,  0x308,  0x0,  0x4e8,  0x308,  0x0,  0x4e9,  0x308,  0x0,  0x565,  0x582,  0x0,  0x574,  0x565,  0x0,  0x574,  0x56b,  0x0,  0x574,  0x56d,  0x0,  0x574,  0x576,  0x0,  0x57e,  0x576,  0x0,  0x5d0,  0x0,  0x5d0,  0x5b7,  0x0,  0x5d0,  0x5b8,  0x0,  0x5d0,  0x5bc,  0x0,  0x5d0,  0x5dc,  0x0,  0x5d1,  0x0,  0x5d1,  0x5bc,  0x0,  0x5d1,  0x5bf,  0x0,  0x5d2,  0x0,  0x5d2,  0x5bc,  0x0,  0x5d3,  0x0,  0x5d3,  0x5bc,  0x0,  0x5d4,  0x0,  0x5d4,  0x5bc,  0x0,  0x5d5,  0x5b9,  0x0,  0x5d5,  0x5bc,  0x0,  0x5d6,  0x5bc,  0x0,  0x5d8,  0x5bc,  0x0,  0x5d9,  0x5b4,  0x0,  0x5d9,  0x5bc,  0x0,  0x5da,  0x5bc,  0x0,  0x5db,  0x0,  0x5db,  0x5bc,  0x0,  0x5db,  0x5bf,  0x0,  0x5dc,  0x0,  0x5dc,  0x5bc,  0x0,  0x5dd,  0x0,  0x5de,  0x5bc,  0x0,  0x5e0,  0x5bc,  0x0,  0x5e1,  0x5bc,  0x0,  0x5e2,  0x0,  0x5e3,  0x5bc,  0x0,  0x5e4,  0x5bc,  0x0,  0x5e4,  0x5bf,  0x0,  0x5e6,  0x5bc,  0x0,  0x5e7,  0x5bc,  0x0,  0x5e8,  0x0,  0x5e8,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x0,  0x5e9,  0x5bc,  0x5c1,  0x0,  0x5e9,  0x5bc,  0x5c2,  0x0,  0x5e9,  0x5c1,  0x0,  0x5e9,  0x5c2,  0x0,  0x5ea,  0x0,  0x5ea,  0x5bc,  0x0,  0x5f2,  0x5b7,  0x0,  0x621,  0x0,  0x627,  0x0,  0x627,  0x643,  0x628,  0x631,  0x0,  0x627,  0x644,  0x644,  0x647,  0x0,  0x627,  0x64b,  0x0,  0x627,  0x653,  0x0,  0x627,  0x654,  0x0,  0x627,  0x655,  0x0,  0x627,  0x674,  0x0,  0x628,  0x0,  0x628,  0x62c,  0x0,  0x628,  0x62d,  0x0,  0x628,  0x62d,  0x64a,  0x0,  0x628,  0x62e,  0x0,  0x628,  0x62e,  0x64a,  0x0,  0x628,  0x631,  0x0,  0x628,  0x632,  0x0,  0x628,  0x645,  0x0,  0x628,  0x646,  0x0,  0x628,  0x647,  0x0,  0x628,  0x649,  0x0,  0x628,  0x64a,  0x0,  0x629,  0x0,  0x62a,  0x0,  0x62a,  0x62c,  0x0,  0x62a,  0x62c,  0x645,  0x0,  0x62a,  0x62c,  0x649,  0x0,  0x62a,  0x62c,  0x64a,  0x0,  0x62a,  0x62d,  0x0,  0x62a,  0x62d,  0x62c,  0x0,  0x62a,  0x62d,  0x645,  0x0,  0x62a,  0x62e,  0x0,  0x62a,  0x62e,  0x645,  0x0,  0x62a,  0x62e,  0x649,  0x0,  0x62a,  0x62e,  0x64a,  0x0,  0x62a,  0x631,  0x0,  0x62a,  0x632,  0x0,  0x62a,  0x645,  0x0,  0x62a,  0x645,  0x62c,  0x0,  0x62a,  0x645,  0x62d,  0x0,  0x62a,  0x645,  0x62e,  0x0,  0x62a,  0x645,  0x649,  0x0,  0x62a,  0x645,  0x64a,  0x0,  0x62a,  0x646,  0x0,  0x62a,  0x647,  0x0,  0x62a,  0x649,  0x0,  0x62a,  0x64a,  0x0,  0x62b,  0x0,  0x62b,  0x62c,  0x0,  0x62b,  0x631,  0x0,  0x62b,  0x632,  0x0,  0x62b,  0x645,  0x0,  0x62b,  0x646,  0x0,  0x62b,  0x647,  0x0,  0x62b,  0x649,  0x0,  0x62b,  0x64a,  0x0,  0x62c,  0x0,  0x62c,  0x62d,  0x0,  0x62c,  0x62d,  0x649,  0x0,  0x62c,  0x62d,  0x64a,  0x0,  0x62c,  0x644,  0x20,  0x62c,  0x644,  0x627,  0x644,  0x647,  0x0,  0x62c,  0x645,  0x0,  0x62c,  0x645,  0x62d,  0x0,  0x62c,  0x645,  0x649,  0x0,  0x62c,  0x645,  0x64a,  0x0,  0x62c,  0x649,  0x0,  0x62c,  0x64a,  0x0,  0x62d,  0x0,  0x62d,  0x62c,  0x0,  0x62d,  0x62c,  0x64a,  0x0,  0x62d,  0x645,  0x0,  0x62d,  0x645,  0x649,  0x0,  0x62d,  0x645,  0x64a,  0x0,  0x62d,  0x649,  0x0,  0x62d,  0x64a,  0x0,  0x62e,  0x0,  0x62e,  0x62c,  0x0,  0x62e,  0x62d,  0x0,  0x62e,  0x645,  0x0,  0x62e,  0x649,  0x0,  0x62e,  0x64a,  0x0,  0x62f,  0x0,  0x630,  0x0,  0x630,  0x670,  0x0,  0x631,  0x0,  0x631,  0x633,  0x648,  0x644,  0x0,  0x631,  0x670,  0x0,  0x631,  0x6cc,  0x627,  0x644,  0x0,  0x632,  0x0,  0x633,  0x0,  0x633,  0x62c,  0x0,  0x633,  0x62c,  0x62d,  0x0,  0x633,  0x62c,  0x649,  0x0,  0x633,  0x62d,  0x0,  0x633,  0x62d,  0x62c,  0x0,  0x633,  0x62e,  0x0,  0x633,  0x62e,  0x649,  0x0,  0x633,  0x62e,  0x64a,  0x0,  0x633,  0x631,  0x0,  0x633,  0x645,  0x0,  0x633,  0x645,  0x62c,  0x0,  0x633,  0x645,  0x62d,  0x0,  0x633,  0x645,  0x645,  0x0,  0x633,  0x647,  0x0,  0x633,  0x649,  0x0,  0x633,  0x64a,  0x0,  0x634,  0x0,  0x634,  0x62c,  0x0,  0x634,  0x62c,  0x64a,  0x0,  0x634,  0x62d,  0x0,  0x634,  0x62d,  0x645,  0x0,  0x634,  0x62d,  0x64a,  0x0,  0x634,  0x62e,  0x0,  0x634,  0x631,  0x0,  0x634,  0x645,  0x0,  0x634,  0x645,  0x62e,  0x0,  0x634,  0x645,  0x645,  0x0,  0x634,  0x647,  0x0,  0x634,  0x649,  0x0,  0x634,  0x64a,  0x0,  0x635,  0x0,  0x635,  0x62d,  0x0,  0x635,  0x62d,  0x62d,  0x0,  0x635,  0x62d,  0x64a,  0x0,  0x635,  0x62e,  0x0,  0x635,  0x631,  0x0,  0x635,  0x644,  0x639,  0x645,  0x0,  0x635,  0x644,  0x649,  0x0,  0x635,  0x644,  0x649,  0x20,  0x627,  0x644,  0x644,  0x647,  0x20,  0x639,  0x644,  0x64a,  0x647,  0x20,  0x648,  0x633,  0x644,  0x645,  0x0,  0x635,  0x644,  0x6d2,  0x0,  0x635,  0x645,  0x0,  0x635,  0x645,  0x645,  0x0,  0x635,  0x649,  0x0,  0x635,  0x64a,  0x0,  0x636,  0x0,  0x636,  0x62c,  0x0,  0x636,  0x62d,  0x0,  0x636,  0x62d,  0x649,  0x0,  0x636,  0x62d,  0x64a,  0x0,  0x636,  0x62e,  0x0,  0x636,  0x62e,  0x645,  0x0,  0x636,  0x631,  0x0,  0x636,  0x645,  0x0,  0x636,  0x649,  0x0,  0x636,  0x64a,  0x0,  0x637,  0x0,  0x637,  0x62d,  0x0,  0x637,  0x645,  0x0,  0x637,  0x645,  0x62d,  0x0,  0x637,  0x645,  0x645,  0x0,  0x637,  0x645,  0x64a,  0x0,  0x637,  0x649,  0x0,  0x637,  0x64a,  0x0,  0x638,  0x0,  0x638,  0x645,  0x0,  0x639,  0x0,  0x639,  0x62c,  0x0,  0x639,  0x62c,  0x645,  0x0,  0x639,  0x644,  0x64a,  0x647,  0x0,  0x639,  0x645,  0x0,  0x639,  0x645,  0x645,  0x0,  0x639,  0x645,  0x649,  0x0,  0x639,  0x645,  0x64a,  0x0,  0x639,  0x649,  0x0,  0x639,  0x64a,  0x0,  0x63a,  0x0,  0x63a,  0x62c,  0x0,  0x63a,  0x645,  0x0,  0x63a,  0x645,  0x645,  0x0,  0x63a,  0x645,  0x649,  0x0,  0x63a,  0x645,  0x64a,  0x0,  0x63a,  0x649,  0x0,  0x63a,  0x64a,  0x0,  0x640,  0x64b,  0x0,  0x640,  0x64e,  0x0,  0x640,  0x64e,  0x651,  0x0,  0x640,  0x64f,  0x0,  0x640,  0x64f,  0x651,  0x0,  0x640,  0x650,  0x0,  0x640,  0x650,  0x651,  0x0,  0x640,  0x651,  0x0,  0x640,  0x652,  0x0,  0x641,  0x0,  0x641,  0x62c,  0x0,  0x641,  0x62d,  0x0,  0x641,  0x62e,  0x0,  0x641,  0x62e,  0x645,  0x0,  0x641,  0x645,  0x0,  0x641,  0x645,  0x64a,  0x0,  0x641,  0x649,  0x0,  0x641,  0x64a,  0x0,  0x642,  0x0,  0x642,  0x62d,  0x0,  0x642,  0x644,  0x6d2,  0x0,  0x642,  0x645,  0x0,  0x642,  0x645,  0x62d,  0x0,  0x642,  0x645,  0x645,  0x0,  0x642,  0x645,  0x64a,  0x0,  0x642,  0x649,  0x0,  0x642,  0x64a,  0x0,  0x643,  0x0,  0x643,  0x627,  0x0,  0x643,  0x62c,  0x0,  0x643,  0x62d,  0x0,  0x643,  0x62e,  0x0,  0x643,  0x644,  0x0,  0x643,  0x645,  0x0,  0x643,  0x645,  0x645,  0x0,  0x643,  0x645,  0x64a,  0x0,  0x643,  0x649,  0x0,  0x643,  0x64a,  0x0,  0x644,  0x0,  0x644,  0x627,  0x0,  0x644,  0x627,  0x653,  0x0,  0x644,  0x627,  0x654,  0x0,  0x644,  0x627,  0x655,  0x0,  0x644,  0x62c,  0x0,  0x644,  0x62c,  0x62c,  0x0,  0x644,  0x62c,  0x645,  0x0,  0x644,  0x62c,  0x64a,  0x0,  0x644,  0x62d,  0x0,  0x644,  0x62d,  0x645,  0x0,  0x644,  0x62d,  0x649,  0x0,  0x644,  0x62d,  0x64a,  0x0,  0x644,  0x62e,  0x0,  0x644,  0x62e,  0x645,  0x0,  0x644,  0x645,  0x0,  0x644,  0x645,  0x62d,  0x0,  0x644,  0x645,  0x64a,  0x0,  0x644,  0x647,  0x0,  0x644,  0x649,  0x0,  0x644,  0x64a,  0x0,  0x645,  0x0,  0x645,  0x627,  0x0,  0x645,  0x62c,  0x0,  0x645,  0x62c,  0x62d,  0x0,  0x645,  0x62c,  0x62e,  0x0,  0x645,  0x62c,  0x645,  0x0,  0x645,  0x62c,  0x64a,  0x0,  0x645,  0x62d,  0x0,  0x645,  0x62d,  0x62c,  0x0,  0x645,  0x62d,  0x645,  0x0,  0x645,  0x62d,  0x645,  0x62f,  0x0,  0x645,  0x62d,  0x64a,  0x0,  0x645,  0x62e,  0x0,  0x645,  0x62e,  0x62c,  0x0,  0x645,  0x62e,  0x645,  0x0,  0x645,  0x62e,  0x64a,  0x0,  0x645,  0x645,  0x0,  0x645,  0x645,  0x64a,  0x0,  0x645,  0x649,  0x0,  0x645,  0x64a,  0x0,  0x646,  0x0,  0x646,  0x62c,  0x0,  0x646,  0x62c,  0x62d,  0x0,  0x646,  0x62c,  0x645,  0x0,  0x646,  0x62c,  0x649,  0x0,  0x646,  0x62c,  0x64a,  0x0,  0x646,  0x62d,  0x0,  0x646,  0x62d,  0x645,  0x0,  0x646,  0x62d,  0x649,  0x0,  0x646,  0x62d,  0x64a,  0x0,  0x646,  0x62e,  0x0,  0x646,  0x631,  0x0,  0x646,  0x632,  0x0,  0x646,  0x645,  0x0,  0x646,  0x645,  0x649,  0x0,  0x646,  0x645,  0x64a,  0x0,  0x646,  0x646,  0x0,  0x646,  0x647,  0x0,  0x646,  0x649,  0x0,  0x646,  0x64a,  0x0,  0x647,  0x0,  0x647,  0x62c,  0x0,  0x647,  0x645,  0x0,  0x647,  0x645,  0x62c,  0x0,  0x647,  0x645,  0x645,  0x0,  0x647,  0x649,  0x0,  0x647,  0x64a,  0x0,  0x647,  0x670,  0x0,  0x648,  0x0,  0x648,  0x633,  0x644,  0x645,  0x0,  0x648,  0x654,  0x0,  0x648,  0x674,  0x0,  0x649,  0x0,  0x649,  0x670,  0x0,  0x64a,  0x0,  0x64a,  0x62c,  0x0,  0x64a,  0x62c,  0x64a,  0x0,  0x64a,  0x62d,  0x0,  0x64a,  0x62d,  0x64a,  0x0,  0x64a,  0x62e,  0x0,  0x64a,  0x631,  0x0,  0x64a,  0x632,  0x0,  0x64a,  0x645,  0x0,  0x64a,  0x645,  0x645,  0x0,  0x64a,  0x645,  0x64a,  0x0,  0x64a,  0x646,  0x0,  0x64a,  0x647,  0x0,  0x64a,  0x649,  0x0,  0x64a,  0x64a,  0x0,  0x64a,  0x654,  0x0,  0x64a,  0x654,  0x627,  0x0,  0x64a,  0x654,  0x62c,  0x0,  0x64a,  0x654,  0x62d,  0x0,  0x64a,  0x654,  0x62e,  0x0,  0x64a,  0x654,  0x631,  0x0,  0x64a,  0x654,  0x632,  0x0,  0x64a,  0x654,  0x645,  0x0,  0x64a,  0x654,  0x646,  0x0,  0x64a,  0x654,  0x647,  0x0,  0x64a,  0x654,  0x648,  0x0,  0x64a,  0x654,  0x649,  0x0,  0x64a,  0x654,  0x64a,  0x0,  0x64a,  0x654,  0x6c6,  0x0,  0x64a,  0x654,  0x6c7,  0x0,  0x64a,  0x654,  0x6c8,  0x0,  0x64a,  0x654,  0x6d0,  0x0,  0x64a,  0x654,  0x6d5,  0x0,  0x64a,  0x674,  0x0,  0x66e,  0x0,  0x66f,  0x0,  0x671,  0x0,  0x679,  0x0,  0x67a,  0x0,  0x67b,  0x0,  0x67e,  0x0,  0x67f,  0x0,  0x680,  0x0,  0x683,  0x0,  0x684,  0x0,  0x686,  0x0,  0x687,  0x0,  0x688,  0x0,  0x68c,  0x0,  0x68d,  0x0,  0x68e,  0x0,  0x691,  0x0,  0x698,  0x0,  0x6a1,  0x0,  0x6a4,  0x0,  0x6a6,  0x0,  0x6a9,  0x0,  0x6ad,  0x0,  0x6af,  0x0,  0x6b1,  0x0,  0x6b3,  0x0,  0x6ba,  0x0,  0x6bb,  0x0,  0x6be,  0x0,  0x6c1,  0x0,  0x6c1,  0x654,  0x0,  0x6c5,  0x0,  0x6c6,  0x0,  0x6c7,  0x0,  0x6c7,  0x674,  0x0,  0x6c8,  0x0,  0x6c9,  0x0,  0x6cb,  0x0,  0x6cc,  0x0,  0x6d0,  0x0,  0x6d2,  0x0,  0x6d2,  0x654,  0x0,  0x6d5,  0x654,  0x0,  0x915,  0x93c,  0x0,  0x916,  0x93c,  0x0,  0x917,  0x93c,  0x0,  0x91c,  0x93c,  0x0,  0x921,  0x93c,  0x0,  0x922,  0x93c,  0x0,  0x928,  0x93c,  0x0,  0x92b,  0x93c,  0x0,  0x92f,  0x93c,  0x0,  0x930,  0x93c,  0x0,  0x933,  0x93c,  0x0,  0x9a1,  0x9bc,  0x0,  0x9a2,  0x9bc,  0x0,  0x9af,  0x9bc,  0x0,  0x9c7,  0x9be,  0x0,  0x9c7,  0x9d7,  0x0,  0xa16,  0xa3c,  0x0,  0xa17,  0xa3c,  0x0,  0xa1c,  0xa3c,  0x0,  0xa2b,  0xa3c,  0x0,  0xa32,  0xa3c,  0x0,  0xa38,  0xa3c,  0x0,  0xb21,  0xb3c,  0x0,  0xb22,  0xb3c,  0x0,  0xb47,  0xb3e,  0x0,  0xb47,  0xb56,  0x0,  0xb47,  0xb57,  0x0,  0xb92,  0xbd7,  0x0,  0xbc6,  0xbbe,  0x0,  0xbc6,  0xbd7,  0x0,  0xbc7,  0xbbe,  0x0,  0xc46,  0xc56,  0x0,  0xcbf,  0xcd5,  0x0,  0xcc6,  0xcc2,  0x0,  0xcc6,  0xcc2,  0xcd5,  0x0,  0xcc6,  0xcd5,  0x0,  0xcc6,  0xcd6,  0x0,  0xd46,  0xd3e,  0x0,  0xd46,  0xd57,  0x0,  0xd47,  0xd3e,  0x0,  0xdd9,  0xdca,  0x0,  0xdd9,  0xdcf,  0x0,  0xdd9,  0xdcf,  0xdca,  0x0,  0xdd9,  0xddf,  0x0,  0xe4d,  0xe32,  0x0,  0xeab,  0xe99,  0x0,  0xeab,  0xea1,  0x0,  0xecd,  0xeb2,  0x0,  0xf0b,  0x0,  0xf40,  0xfb5,  0x0,  0xf42,  0xfb7,  0x0,  0xf4c,  0xfb7,  0x0,  0xf51,  0xfb7,  0x0,  0xf56,  0xfb7,  0x0,  0xf5b,  0xfb7,  0x0,  0xf71,  0xf72,  0x0,  0xf71,  0xf74,  0x0,  0xf71,  0xf80,  0x0,  0xf90,  0xfb5,  0x0,  0xf92,  0xfb7,  0x0,  0xf9c,  0xfb7,  0x0,  0xfa1,  0xfb7,  0x0,  0xfa6,  0xfb7,  0x0,  0xfab,  0xfb7,  0x0,  0xfb2,  0xf71,  0xf80,  0x0,  0xfb2,  0xf80,  0x0,  0xfb3,  0xf71,  0xf80,  0x0,  0xfb3,  0xf80,  0x0,  0x1025,  0x102e,  0x0,  0x10dc,  0x0,  0x1100,  0x0,  0x1100,  0x1161,  0x0,  0x1101,  0x0,  0x1102,  0x0,  0x1102,  0x1161,  0x0,  0x1103,  0x0,  0x1103,  0x1161,  0x0,  0x1104,  0x0,  0x1105,  0x0,  0x1105,  0x1161,  0x0,  0x1106,  0x0,  0x1106,  0x1161,  0x0,  0x1107,  0x0,  0x1107,  0x1161,  0x0,  0x1108,  0x0,  0x1109,  0x0,  0x1109,  0x1161,  0x0,  0x110a,  0x0,  0x110b,  0x0,  0x110b,  0x1161,  0x0,  0x110b,  0x116e,  0x0,  0x110c,  0x0,  0x110c,  0x1161,  0x0,  0x110c,  0x116e,  0x110b,  0x1174,  0x0,  0x110d,  0x0,  0x110e,  0x0,  0x110e,  0x1161,  0x0,  0x110e,  0x1161,  0x11b7,  0x1100,  0x1169,  0x0,  0x110f,  0x0,  0x110f,  0x1161,  0x0,  0x1110,  0x0,  0x1110,  0x1161,  0x0,  0x1111,  0x0,  0x1111,  0x1161,  0x0,  0x1112,  0x0,  0x1112,  0x1161,  0x0,  0x1114,  0x0,  0x1115,  0x0,  0x111a,  0x0,  0x111c,  0x0,  0x111d,  0x0,  0x111e,  0x0,  0x1120,  0x0,  0x1121,  0x0,  0x1122,  0x0,  0x1123,  0x0,  0x1127,  0x0,  0x1129,  0x0,  0x112b,  0x0,  0x112c,  0x0,  0x112d,  0x0,  0x112e,  0x0,  0x112f,  0x0,  0x1132,  0x0,  0x1136,  0x0,  0x1140,  0x0,  0x1147,  0x0,  0x114c,  0x0,  0x1157,  0x0,  0x1158,  0x0,  0x1159,  0x0,  0x1160,  0x0,  0x1161,  0x0,  0x1162,  0x0,  0x1163,  0x0,  0x1164,  0x0,  0x1165,  0x0,  0x1166,  0x0,  0x1167,  0x0,  0x1168,  0x0,  0x1169,  0x0,  0x116a,  0x0,  0x116b,  0x0,  0x116c,  0x0,  0x116d,  0x0,  0x116e,  0x0,  0x116f,  0x0,  0x1170,  0x0,  0x1171,  0x0,  0x1172,  0x0,  0x1173,  0x0,  0x1174,  0x0,  0x1175,  0x0,  0x1184,  0x0,  0x1185,  0x0,  0x1188,  0x0,  0x1191,  0x0,  0x1192,  0x0,  0x1194,  0x0,  0x119e,  0x0,  0x11a1,  0x0,  0x11aa,  0x0,  0x11ac,  0x0,  0x11ad,  0x0,  0x11b0,  0x0,  0x11b1,  0x0,  0x11b2,  0x0,  0x11b3,  0x0,  0x11b4,  0x0,  0x11b5,  0x0,  0x11c7,  0x0,  0x11c8,  0x0,  0x11cc,  0x0,  0x11ce,  0x0,  0x11d3,  0x0,  0x11d7,  0x0,  0x11d9,  0x0,  0x11dd,  0x0,  0x11df,  0x0,  0x11f1,  0x0,  0x11f2,  0x0,  0x1b05,  0x1b35,  0x0,  0x1b07,  0x1b35,  0x0,  0x1b09,  0x1b35,  0x0,  0x1b0b,  0x1b35,  0x0,  0x1b0d,  0x1b35,  0x0,  0x1b11,  0x1b35,  0x0,  0x1b3a,  0x1b35,  0x0,  0x1b3c,  0x1b35,  0x0,  0x1b3e,  0x1b35,  0x0,  0x1b3f,  0x1b35,  0x0,  0x1b42,  0x1b35,  0x0,  0x1d02,  0x0,  0x1d16,  0x0,  0x1d17,  0x0,  0x1d1c,  0x0,  0x1d1d,  0x0,  0x1d25,  0x0,  0x1d7b,  0x0,  0x1d85,  0x0,  0x2010,  0x0,  0x2013,  0x0,  0x2014,  0x0,  0x2032,  0x2032,  0x0,  0x2032,  0x2032,  0x2032,  0x0,  0x2032,  0x2032,  0x2032,  0x2032,  0x0,  0x2035,  0x2035,  0x0,  0x2035,  0x2035,  0x2035,  0x0,  0x20a9,  0x0,  0x2190,  0x0,  0x2190,  0x338,  0x0,  0x2191,  0x0,  0x2192,  0x0,  0x2192,  0x338,  0x0,  0x2193,  0x0,  0x2194,  0x338,  0x0,  0x21d0,  0x338,  0x0,  0x21d2,  0x338,  0x0,  0x21d4,  0x338,  0x0,  0x2202,  0x0,  0x2203,  0x338,  0x0,  0x2207,  0x0,  0x2208,  0x338,  0x0,  0x220b,  0x338,  0x0,  0x2211,  0x0,  0x2212,  0x0,  0x2223,  0x338,  0x0,  0x2225,  0x338,  0x0,  0x222b,  0x222b,  0x0,  0x222b,  0x222b,  0x222b,  0x0,  0x222b,  0x222b,  0x222b,  0x222b,  0x0,  0x222e,  0x222e,  0x0,  0x222e,  0x222e,  0x222e,  0x0,  0x223c,  0x338,  0x0,  0x2243,  0x338,  0x0,  0x2245,  0x338,  0x0,  0x2248,  0x338,  0x0,  0x224d,  0x338,  0x0,  0x2261,  0x338,  0x0,  0x2264,  0x338,  0x0,  0x2265,  0x338,  0x0,  0x2272,  0x338,  0x0,  0x2273,  0x338,  0x0,  0x2276,  0x338,  0x0,  0x2277,  0x338,  0x0,  0x227a,  0x338,  0x0,  0x227b,  0x338,  0x0,  0x227c,  0x338,  0x0,  0x227d,  0x338,  0x0,  0x2282,  0x338,  0x0,  0x2283,  0x338,  0x0,  0x2286,  0x338,  0x0,  0x2287,  0x338,  0x0,  0x2291,  0x338,  0x0,  0x2292,  0x338,  0x0,  0x22a2,  0x338,  0x0,  0x22a8,  0x338,  0x0,  0x22a9,  0x338,  0x0,  0x22ab,  0x338,  0x0,  0x22b2,  0x338,  0x0,  0x22b3,  0x338,  0x0,  0x22b4,  0x338,  0x0,  0x22b5,  0x338,  0x0,  0x2502,  0x0,  0x25a0,  0x0,  0x25cb,  0x0,  0x2985,  0x0,  0x2986,  0x0,  0x2add,  0x338,  0x0,  0x2d61,  0x0,  0x3001,  0x0,  0x3002,  0x0,  0x3008,  0x0,  0x3009,  0x0,  0x300a,  0x0,  0x300b,  0x0,  0x300c,  0x0,  0x300d,  0x0,  0x300e,  0x0,  0x300f,  0x0,  0x3010,  0x0,  0x3011,  0x0,  0x3012,  0x0,  0x3014,  0x0,  0x3014,  0x53,  0x3015,  0x0,  0x3014,  0x4e09,  0x3015,  0x0,  0x3014,  0x4e8c,  0x3015,  0x0,  0x3014,  0x52dd,  0x3015,  0x0,  0x3014,  0x5b89,  0x3015,  0x0,  0x3014,  0x6253,  0x3015,  0x0,  0x3014,  0x6557,  0x3015,  0x0,  0x3014,  0x672c,  0x3015,  0x0,  0x3014,  0x70b9,  0x3015,  0x0,  0x3014,  0x76d7,  0x3015,  0x0,  0x3015,  0x0,  0x3016,  0x0,  0x3017,  0x0,  0x3046,  0x3099,  0x0,  0x304b,  0x3099,  0x0,  0x304d,  0x3099,  0x0,  0x304f,  0x3099,  0x0,  0x3051,  0x3099,  0x0,  0x3053,  0x3099,  0x0,  0x3055,  0x3099,  0x0,  0x3057,  0x3099,  0x0,  0x3059,  0x3099,  0x0,  0x305b,  0x3099,  0x0,  0x305d,  0x3099,  0x0,  0x305f,  0x3099,  0x0,  0x3061,  0x3099,  0x0,  0x3064,  0x3099,  0x0,  0x3066,  0x3099,  0x0,  0x3068,  0x3099,  0x0,  0x306f,  0x3099,  0x0,  0x306f,  0x309a,  0x0,  0x3072,  0x3099,  0x0,  0x3072,  0x309a,  0x0,  0x3075,  0x3099,  0x0,  0x3075,  0x309a,  0x0,  0x3078,  0x3099,  0x0,  0x3078,  0x309a,  0x0,  0x307b,  0x304b,  0x0,  0x307b,  0x3099,  0x0,  0x307b,  0x309a,  0x0,  0x3088,  0x308a,  0x0,  0x3099,  0x0,  0x309a,  0x0,  0x309d,  0x3099,  0x0,  0x30a1,  0x0,  0x30a2,  0x0,  0x30a2,  0x30cf,  0x309a,  0x30fc,  0x30c8,  0x0,  0x30a2,  0x30eb,  0x30d5,  0x30a1,  0x0,  0x30a2,  0x30f3,  0x30d8,  0x309a,  0x30a2,  0x0,  0x30a2,  0x30fc,  0x30eb,  0x0,  0x30a3,  0x0,  0x30a4,  0x0,  0x30a4,  0x30cb,  0x30f3,  0x30af,  0x3099,  0x0,  0x30a4,  0x30f3,  0x30c1,  0x0,  0x30a5,  0x0,  0x30a6,  0x0,  0x30a6,  0x3099,  0x0,  0x30a6,  0x30a9,  0x30f3,  0x0,  0x30a7,  0x0,  0x30a8,  0x0,  0x30a8,  0x30b9,  0x30af,  0x30fc,  0x30c8,  0x3099,  0x0,  0x30a8,  0x30fc,  0x30ab,  0x30fc,  0x0,  0x30a9,  0x0,  0x30aa,  0x0,  0x30aa,  0x30f3,  0x30b9,  0x0,  0x30aa,  0x30fc,  0x30e0,  0x0,  0x30ab,  0x0,  0x30ab,  0x3099,  0x0,  0x30ab,  0x3099,  0x30ed,  0x30f3,  0x0,  0x30ab,  0x3099,  0x30f3,  0x30de,  0x0,  0x30ab,  0x30a4,  0x30ea,  0x0,  0x30ab,  0x30e9,  0x30c3,  0x30c8,  0x0,  0x30ab,  0x30ed,  0x30ea,  0x30fc,  0x0,  0x30ad,  0x0,  0x30ad,  0x3099,  0x0,  0x30ad,  0x3099,  0x30ab,  0x3099,  0x0,  0x30ad,  0x3099,  0x30cb,  0x30fc,  0x0,  0x30ad,  0x3099,  0x30eb,  0x30bf,  0x3099,  0x30fc,  0x0,  0x30ad,  0x30e5,  0x30ea,  0x30fc,  0x0,  0x30ad,  0x30ed,  0x0,  0x30ad,  0x30ed,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x0,  0x30ad,  0x30ed,  0x30e1,  0x30fc,  0x30c8,  0x30eb,  0x0,  0x30ad,  0x30ed,  0x30ef,  0x30c3,  0x30c8,  0x0,  0x30af,  0x0,  0x30af,  0x3099,  0x0,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x0,  0x30af,  0x3099,  0x30e9,  0x30e0,  0x30c8,  0x30f3,  0x0,  0x30af,  0x30eb,  0x30bb,  0x3099,  0x30a4,  0x30ed,  0x0,  0x30af,  0x30ed,  0x30fc,  0x30cd,  0x0,  0x30b1,  0x0,  0x30b1,  0x3099,  0x0,  0x30b1,  0x30fc,  0x30b9,  0x0,  0x30b3,  0x0,  0x30b3,  0x3099,  0x0,  0x30b3,  0x30b3,  0x0,  0x30b3,  0x30c8,  0x0,  0x30b3,  0x30eb,  0x30ca,  0x0,  0x30b3,  0x30fc,  0x30db,  0x309a,  0x0,  0x30b5,  0x0,  0x30b5,  0x3099,  0x0,  0x30b5,  0x30a4,  0x30af,  0x30eb,  0x0,  0x30b5,  0x30f3,  0x30c1,  0x30fc,  0x30e0,  0x0,  0x30b7,  0x0,  0x30b7,  0x3099,  0x0,  0x30b7,  0x30ea,  0x30f3,  0x30af,  0x3099,  0x0,  0x30b9,  0x0,  0x30b9,  0x3099,  0x0,  0x30bb,  0x0,  0x30bb,  0x3099,  0x0,  0x30bb,  0x30f3,  0x30c1,  0x0,  0x30bb,  0x30f3,  0x30c8,  0x0,  0x30bd,  0x0,  0x30bd,  0x3099,  0x0,  0x30bf,  0x0,  0x30bf,  0x3099,  0x0,  0x30bf,  0x3099,  0x30fc,  0x30b9,  0x0,  0x30c1,  0x0,  0x30c1,  0x3099,  0x0,  0x30c3,  0x0,  0x30c4,  0x0,  0x30c4,  0x3099,  0x0,  0x30c6,  0x0,  0x30c6,  0x3099,  0x0,  0x30c6,  0x3099,  0x30b7,  0x0,  0x30c8,  0x0,  0x30c8,  0x3099,  0x0,  0x30c8,  0x3099,  0x30eb,  0x0,  0x30c8,  0x30f3,  0x0,  0x30ca,  0x0,  0x30ca,  0x30ce,  0x0,  0x30cb,  0x0,  0x30cc,  0x0,  0x30cd,  0x0,  0x30ce,  0x0,  0x30ce,  0x30c3,  0x30c8,  0x0,  0x30cf,  0x0,  0x30cf,  0x3099,  0x0,  0x30cf,  0x3099,  0x30fc,  0x30ec,  0x30eb,  0x0,  0x30cf,  0x309a,  0x0,  0x30cf,  0x309a,  0x30fc,  0x30bb,  0x30f3,  0x30c8,  0x0,  0x30cf,  0x309a,  0x30fc,  0x30c4,  0x0,  0x30cf,  0x30a4,  0x30c4,  0x0,  0x30d2,  0x0,  0x30d2,  0x3099,  0x0,  0x30d2,  0x3099,  0x30eb,  0x0,  0x30d2,  0x309a,  0x0,  0x30d2,  0x309a,  0x30a2,  0x30b9,  0x30c8,  0x30eb,  0x0,  0x30d2,  0x309a,  0x30af,  0x30eb,  0x0,  0x30d2,  0x309a,  0x30b3,  0x0,  0x30d5,  0x0,  0x30d5,  0x3099,  0x0,  0x30d5,  0x3099,  0x30c3,  0x30b7,  0x30a7,  0x30eb,  0x0,  0x30d5,  0x309a,  0x0,  0x30d5,  0x30a1,  0x30e9,  0x30c3,  0x30c8,  0x3099,  0x0,  0x30d5,  0x30a3,  0x30fc,  0x30c8,  0x0,  0x30d5,  0x30e9,  0x30f3,  0x0,  0x30d8,  0x0,  0x30d8,  0x3099,  0x0,  0x30d8,  0x3099,  0x30fc,  0x30bf,  0x0,  0x30d8,  0x309a,  0x0,  0x30d8,  0x309a,  0x30bd,  0x0,  0x30d8,  0x309a,  0x30cb,  0x30d2,  0x0,  0x30d8,  0x309a,  0x30f3,  0x30b9,  0x0,  0x30d8,  0x309a,  0x30fc,  0x30b7,  0x3099,  0x0,  0x30d8,  0x30af,  0x30bf,  0x30fc,  0x30eb,  0x0,  0x30d8,  0x30eb,  0x30c4,  0x0,  0x30db,  0x0,  0x30db,  0x3099,  0x0,  0x30db,  0x3099,  0x30eb,  0x30c8,  0x0,  0x30db,  0x309a,  0x0,  0x30db,  0x309a,  0x30a4,  0x30f3,  0x30c8,  0x0,  0x30db,  0x309a,  0x30f3,  0x30c8,  0x3099,  0x0,  0x30db,  0x30f3,  0x0,  0x30db,  0x30fc,  0x30eb,  0x0,  0x30db,  0x30fc,  0x30f3,  0x0,  0x30de,  0x0,  0x30de,  0x30a4,  0x30af,  0x30ed,  0x0,  0x30de,  0x30a4,  0x30eb,  0x0,  0x30de,  0x30c3,  0x30cf,  0x0,  0x30de,  0x30eb,  0x30af,  0x0,  0x30de,  0x30f3,  0x30b7,  0x30e7,  0x30f3,  0x0,  0x30df,  0x0,  0x30df,  0x30af,  0x30ed,  0x30f3,  0x0,  0x30df,  0x30ea,  0x0,  0x30df,  0x30ea,  0x30cf,  0x3099,  0x30fc,  0x30eb,  0x0,  0x30e0,  0x0,  0x30e1,  0x0,  0x30e1,  0x30ab,  0x3099,  0x0,  0x30e1,  0x30ab,  0x3099,  0x30c8,  0x30f3,  0x0,  0x30e1,  0x30fc,  0x30c8,  0x30eb,  0x0,  0x30e2,  0x0,  0x30e3,  0x0,  0x30e4,  0x0,  0x30e4,  0x30fc,  0x30c8,  0x3099,  0x0,  0x30e4,  0x30fc,  0x30eb,  0x0,  0x30e5,  0x0,  0x30e6,  0x0,  0x30e6,  0x30a2,  0x30f3,  0x0,  0x30e7,  0x0,  0x30e8,  0x0,  0x30e9,  0x0,  0x30ea,  0x0,  0x30ea,  0x30c3,  0x30c8,  0x30eb,  0x0,  0x30ea,  0x30e9,  0x0,  0x30eb,  0x0,  0x30eb,  0x30d2,  0x309a,  0x30fc,  0x0,  0x30eb,  0x30fc,  0x30d5,  0x3099,  0x30eb,  0x0,  0x30ec,  0x0,  0x30ec,  0x30e0,  0x0,  0x30ec,  0x30f3,  0x30c8,  0x30b1,  0x3099,  0x30f3,  0x0,  0x30ed,  0x0,  0x30ef,  0x0,  0x30ef,  0x3099,  0x0,  0x30ef,  0x30c3,  0x30c8,  0x0,  0x30f0,  0x0,  0x30f0,  0x3099,  0x0,  0x30f1,  0x0,  0x30f1,  0x3099,  0x0,  0x30f2,  0x0,  0x30f2,  0x3099,  0x0,  0x30f3,  0x0,  0x30fb,  0x0,  0x30fc,  0x0,  0x30fd,  0x3099,  0x0,  0x349e,  0x0,  0x34b9,  0x0,  0x34bb,  0x0,  0x34df,  0x0,  0x3515,  0x0,  0x36ee,  0x0,  0x36fc,  0x0,  0x3781,  0x0,  0x382f,  0x0,  0x3862,  0x0,  0x387c,  0x0,  0x38c7,  0x0,  0x38e3,  0x0,  0x391c,  0x0,  0x393a,  0x0,  0x3a2e,  0x0,  0x3a6c,  0x0,  0x3ae4,  0x0,  0x3b08,  0x0,  0x3b19,  0x0,  0x3b49,  0x0,  0x3b9d,  0x0,  0x3c18,  0x0,  0x3c4e,  0x0,  0x3d33,  0x0,  0x3d96,  0x0,  0x3eac,  0x0,  0x3eb8,  0x0,  0x3f1b,  0x0,  0x3ffc,  0x0,  0x4008,  0x0,  0x4018,  0x0,  0x4039,  0x0,  0x4046,  0x0,  0x4096,  0x0,  0x40e3,  0x0,  0x412f,  0x0,  0x4202,  0x0,  0x4227,  0x0,  0x42a0,  0x0,  0x4301,  0x0,  0x4334,  0x0,  0x4359,  0x0,  0x43d5,  0x0,  0x43d9,  0x0,  0x440b,  0x0,  0x446b,  0x0,  0x452b,  0x0,  0x455d,  0x0,  0x4561,  0x0,  0x456b,  0x0,  0x45d7,  0x0,  0x45f9,  0x0,  0x4635,  0x0,  0x46be,  0x0,  0x46c7,  0x0,  0x4995,  0x0,  0x49e6,  0x0,  0x4a6e,  0x0,  0x4a76,  0x0,  0x4ab2,  0x0,  0x4b33,  0x0,  0x4bce,  0x0,  0x4cce,  0x0,  0x4ced,  0x0,  0x4cf8,  0x0,  0x4d56,  0x0,  0x4e00,  0x0,  0x4e01,  0x0,  0x4e03,  0x0,  0x4e09,  0x0,  0x4e0a,  0x0,  0x4e0b,  0x0,  0x4e0d,  0x0,  0x4e19,  0x0,  0x4e26,  0x0,  0x4e28,  0x0,  0x4e2d,  0x0,  0x4e32,  0x0,  0x4e36,  0x0,  0x4e38,  0x0,  0x4e39,  0x0,  0x4e3d,  0x0,  0x4e3f,  0x0,  0x4e41,  0x0,  0x4e59,  0x0,  0x4e5d,  0x0,  0x4e82,  0x0,  0x4e85,  0x0,  0x4e86,  0x0,  0x4e8c,  0x0,  0x4e94,  0x0,  0x4ea0,  0x0,  0x4ea4,  0x0,  0x4eae,  0x0,  0x4eba,  0x0,  0x4ec0,  0x0,  0x4ecc,  0x0,  0x4ee4,  0x0,  0x4f01,  0x0,  0x4f11,  0x0,  0x4f60,  0x0,  0x4f80,  0x0,  0x4f86,  0x0,  0x4f8b,  0x0,  0x4fae,  0x0,  0x4fbb,  0x0,  0x4fbf,  0x0,  0x5002,  0x0,  0x502b,  0x0,  0x507a,  0x0,  0x5099,  0x0,  0x50cf,  0x0,  0x50da,  0x0,  0x50e7,  0x0,  0x512a,  0x0,  0x513f,  0x0,  0x5140,  0x0,  0x5145,  0x0,  0x514d,  0x0,  0x5154,  0x0,  0x5164,  0x0,  0x5165,  0x0,  0x5167,  0x0,  0x5168,  0x0,  0x5169,  0x0,  0x516b,  0x0,  0x516d,  0x0,  0x5177,  0x0,  0x5180,  0x0,  0x5182,  0x0,  0x518d,  0x0,  0x5192,  0x0,  0x5195,  0x0,  0x5196,  0x0,  0x5197,  0x0,  0x5199,  0x0,  0x51a4,  0x0,  0x51ab,  0x0,  0x51ac,  0x0,  0x51b5,  0x0,  0x51b7,  0x0,  0x51c9,  0x0,  0x51cc,  0x0,  0x51dc,  0x0,  0x51de,  0x0,  0x51e0,  0x0,  0x51f5,  0x0,  0x5200,  0x0,  0x5203,  0x0,  0x5207,  0x0,  0x5217,  0x0,  0x521d,  0x0,  0x5229,  0x0,  0x523a,  0x0,  0x523b,  0x0,  0x5246,  0x0,  0x524d,  0x0,  0x5272,  0x0,  0x5277,  0x0,  0x5289,  0x0,  0x529b,  0x0,  0x52a3,  0x0,  0x52b3,  0x0,  0x52b4,  0x0,  0x52c7,  0x0,  0x52c9,  0x0,  0x52d2,  0x0,  0x52de,  0x0,  0x52e4,  0x0,  0x52f5,  0x0,  0x52f9,  0x0,  0x52fa,  0x0,  0x5305,  0x0,  0x5306,  0x0,  0x5315,  0x0,  0x5317,  0x0,  0x531a,  0x0,  0x5338,  0x0,  0x533b,  0x0,  0x533f,  0x0,  0x5341,  0x0,  0x5344,  0x0,  0x5345,  0x0,  0x5349,  0x0,  0x5351,  0x0,  0x5354,  0x0,  0x535a,  0x0,  0x535c,  0x0,  0x5369,  0x0,  0x5370,  0x0,  0x5373,  0x0,  0x5375,  0x0,  0x537d,  0x0,  0x537f,  0x0,  0x5382,  0x0,  0x53b6,  0x0,  0x53c3,  0x0,  0x53c8,  0x0,  0x53ca,  0x0,  0x53cc,  0x0,  0x53df,  0x0,  0x53e3,  0x0,  0x53e5,  0x0,  0x53eb,  0x0,  0x53ef,  0x0,  0x53f1,  0x0,  0x53f3,  0x0,  0x5406,  0x0,  0x5408,  0x0,  0x540d,  0x0,  0x540f,  0x0,  0x541d,  0x0,  0x5438,  0x0,  0x5439,  0x0,  0x5442,  0x0,  0x5448,  0x0,  0x5468,  0x0,  0x549e,  0x0,  0x54a2,  0x0,  0x54bd,  0x0,  0x54f6,  0x0,  0x5510,  0x0,  0x554f,  0x0,  0x5553,  0x0,  0x5555,  0x0,  0x5563,  0x0,  0x5584,  0x0,  0x5587,  0x0,  0x5599,  0x0,  0x559d,  0x0,  0x55ab,  0x0,  0x55b3,  0x0,  0x55b6,  0x0,  0x55c0,  0x0,  0x55c2,  0x0,  0x55e2,  0x0,  0x5606,  0x0,  0x5651,  0x0,  0x5668,  0x0,  0x5674,  0x0,  0x56d7,  0x0,  0x56db,  0x0,  0x56f9,  0x0,  0x5716,  0x0,  0x5717,  0x0,  0x571f,  0x0,  0x5730,  0x0,  0x578b,  0x0,  0x57ce,  0x0,  0x57f4,  0x0,  0x580d,  0x0,  0x5831,  0x0,  0x5832,  0x0,  0x5840,  0x0,  0x585a,  0x0,  0x585e,  0x0,  0x58a8,  0x0,  0x58ac,  0x0,  0x58b3,  0x0,  0x58d8,  0x0,  0x58df,  0x0,  0x58eb,  0x0,  0x58ee,  0x0,  0x58f0,  0x0,  0x58f2,  0x0,  0x58f7,  0x0,  0x5902,  0x0,  0x5906,  0x0,  0x590a,  0x0,  0x5915,  0x0,  0x591a,  0x0,  0x591c,  0x0,  0x5922,  0x0,  0x5927,  0x0,  0x5927,  0x6b63,  0x0,  0x5929,  0x0,  0x5944,  0x0,  0x5948,  0x0,  0x5951,  0x0,  0x5954,  0x0,  0x5962,  0x0,  0x5973,  0x0,  0x59d8,  0x0,  0x59ec,  0x0,  0x5a1b,  0x0,  0x5a27,  0x0,  0x5a62,  0x0,  0x5a66,  0x0,  0x5ab5,  0x0,  0x5b08,  0x0,  0x5b28,  0x0,  0x5b3e,  0x0,  0x5b50,  0x0,  0x5b57,  0x0,  0x5b66,  0x0,  0x5b80,  0x0,  0x5b85,  0x0,  0x5b97,  0x0,  0x5bc3,  0x0,  0x5bd8,  0x0,  0x5be7,  0x0,  0x5bee,  0x0,  0x5bf3,  0x0,  0x5bf8,  0x0,  0x5bff,  0x0,  0x5c06,  0x0,  0x5c0f,  0x0,  0x5c22,  0x0,  0x5c38,  0x0,  0x5c3f,  0x0,  0x5c60,  0x0,  0x5c62,  0x0,  0x5c64,  0x0,  0x5c65,  0x0,  0x5c6e,  0x0,  0x5c71,  0x0,  0x5c8d,  0x0,  0x5cc0,  0x0,  0x5d19,  0x0,  0x5d43,  0x0,  0x5d50,  0x0,  0x5d6b,  0x0,  0x5d6e,  0x0,  0x5d7c,  0x0,  0x5db2,  0x0,  0x5dba,  0x0,  0x5ddb,  0x0,  0x5de1,  0x0,  0x5de2,  0x0,  0x5de5,  0x0,  0x5de6,  0x0,  0x5df1,  0x0,  0x5dfd,  0x0,  0x5dfe,  0x0,  0x5e28,  0x0,  0x5e3d,  0x0,  0x5e69,  0x0,  0x5e72,  0x0,  0x5e73,  0x6210,  0x0,  0x5e74,  0x0,  0x5e7a,  0x0,  0x5e7c,  0x0,  0x5e7f,  0x0,  0x5ea6,  0x0,  0x5eb0,  0x0,  0x5eb3,  0x0,  0x5eb6,  0x0,  0x5ec9,  0x0,  0x5eca,  0x0,  0x5ed2,  0x0,  0x5ed3,  0x0,  0x5ed9,  0x0,  0x5eec,  0x0,  0x5ef4,  0x0,  0x5efe,  0x0,  0x5f04,  0x0,  0x5f0b,  0x0,  0x5f13,  0x0,  0x5f22,  0x0,  0x5f50,  0x0,  0x5f53,  0x0,  0x5f61,  0x0,  0x5f62,  0x0,  0x5f69,  0x0,  0x5f6b,  0x0,  0x5f73,  0x0,  0x5f8b,  0x0,  0x5f8c,  0x0,  0x5f97,  0x0,  0x5f9a,  0x0,  0x5fa9,  0x0,  0x5fad,  0x0,  0x5fc3,  0x0,  0x5fcd,  0x0,  0x5fd7,  0x0,  0x5ff5,  0x0,  0x5ff9,  0x0,  0x6012,  0x0,  0x601c,  0x0,  0x6075,  0x0,  0x6081,  0x0,  0x6094,  0x0,  0x60c7,  0x0,  0x60d8,  0x0,  0x60e1,  0x0,  0x6108,  0x0,  0x6144,  0x0,  0x6148,  0x0,  0x614c,  0x0,  0x614e,  0x0,  0x6160,  0x0,  0x6168,  0x0,  0x617a,  0x0,  0x618e,  0x0,  0x6190,  0x0,  0x61a4,  0x0,  0x61af,  0x0,  0x61b2,  0x0,  0x61de,  0x0,  0x61f2,  0x0,  0x61f6,  0x0,  0x6200,  0x0,  0x6208,  0x0,  0x6210,  0x0,  0x621b,  0x0,  0x622e,  0x0,  0x6234,  0x0,  0x6236,  0x0,  0x624b,  0x0,  0x6253,  0x0,  0x625d,  0x0,  0x6295,  0x0,  0x62b1,  0x0,  0x62c9,  0x0,  0x62cf,  0x0,  0x62d3,  0x0,  0x62d4,  0x0,  0x62fc,  0x0,  0x62fe,  0x0,  0x6307,  0x0,  0x633d,  0x0,  0x6350,  0x0,  0x6355,  0x0,  0x6368,  0x0,  0x637b,  0x0,  0x6383,  0x0,  0x63a0,  0x0,  0x63a9,  0x0,  0x63c4,  0x0,  0x63c5,  0x0,  0x63e4,  0x0,  0x641c,  0x0,  0x6422,  0x0,  0x6452,  0x0,  0x6469,  0x0,  0x6477,  0x0,  0x647e,  0x0,  0x649a,  0x0,  0x649d,  0x0,  0x64c4,  0x0,  0x652f,  0x0,  0x6534,  0x0,  0x654f,  0x0,  0x6556,  0x0,  0x656c,  0x0,  0x6578,  0x0,  0x6587,  0x0,  0x6597,  0x0,  0x6599,  0x0,  0x65a4,  0x0,  0x65b0,  0x0,  0x65b9,  0x0,  0x65c5,  0x0,  0x65e0,  0x0,  0x65e2,  0x0,  0x65e3,  0x0,  0x65e5,  0x0,  0x660e,  0x6cbb,  0x0,  0x6613,  0x0,  0x6620,  0x0,  0x662d,  0x548c,  0x0,  0x6649,  0x0,  0x6674,  0x0,  0x6688,  0x0,  0x6691,  0x0,  0x669c,  0x0,  0x66b4,  0x0,  0x66c6,  0x0,  0x66f0,  0x0,  0x66f4,  0x0,  0x66f8,  0x0,  0x6700,  0x0,  0x6708,  0x0,  0x6709,  0x0,  0x6717,  0x0,  0x671b,  0x0,  0x6721,  0x0,  0x6728,  0x0,  0x674e,  0x0,  0x6753,  0x0,  0x6756,  0x0,  0x675e,  0x0,  0x677b,  0x0,  0x6785,  0x0,  0x6797,  0x0,  0x67f3,  0x0,  0x67fa,  0x0,  0x6817,  0x0,  0x681f,  0x0,  0x682a,  0x0,  0x682a,  0x5f0f,  0x4f1a,  0x793e,  0x0,  0x6852,  0x0,  0x6881,  0x0,  0x6885,  0x0,  0x688e,  0x0,  0x68a8,  0x0,  0x6914,  0x0,  0x6942,  0x0,  0x69a3,  0x0,  0x69ea,  0x0,  0x6a02,  0x0,  0x6a13,  0x0,  0x6aa8,  0x0,  0x6ad3,  0x0,  0x6adb,  0x0,  0x6b04,  0x0,  0x6b20,  0x0,  0x6b21,  0x0,  0x6b54,  0x0,  0x6b62,  0x0,  0x6b63,  0x0,  0x6b72,  0x0,  0x6b77,  0x0,  0x6b79,  0x0,  0x6b9f,  0x0,  0x6bae,  0x0,  0x6bb3,  0x0,  0x6bba,  0x0,  0x6bbb,  0x0,  0x6bcb,  0x0,  0x6bcd,  0x0,  0x6bd4,  0x0,  0x6bdb,  0x0,  0x6c0f,  0x0,  0x6c14,  0x0,  0x6c34,  0x0,  0x6c4e,  0x0,  0x6c67,  0x0,  0x6c88,  0x0,  0x6cbf,  0x0,  0x6ccc,  0x0,  0x6ccd,  0x0,  0x6ce5,  0x0,  0x6ce8,  0x0,  0x6d16,  0x0,  0x6d1b,  0x0,  0x6d1e,  0x0,  0x6d34,  0x0,  0x6d3e,  0x0,  0x6d41,  0x0,  0x6d69,  0x0,  0x6d6a,  0x0,  0x6d77,  0x0,  0x6d78,  0x0,  0x6d85,  0x0,  0x6dcb,  0x0,  0x6dda,  0x0,  0x6dea,  0x0,  0x6df9,  0x0,  0x6e1a,  0x0,  0x6e2f,  0x0,  0x6e6e,  0x0,  0x6e80,  0x0,  0x6e9c,  0x0,  0x6eba,  0x0,  0x6ec7,  0x0,  0x6ecb,  0x0,  0x6ed1,  0x0,  0x6edb,  0x0,  0x6f0f,  0x0,  0x6f14,  0x0,  0x6f22,  0x0,  0x6f23,  0x0,  0x6f6e,  0x0,  0x6fc6,  0x0,  0x6feb,  0x0,  0x6ffe,  0x0,  0x701b,  0x0,  0x701e,  0x0,  0x7039,  0x0,  0x704a,  0x0,  0x706b,  0x0,  0x7070,  0x0,  0x7077,  0x0,  0x707d,  0x0,  0x7099,  0x0,  0x70ad,  0x0,  0x70c8,  0x0,  0x70d9,  0x0,  0x7121,  0x0,  0x7145,  0x0,  0x7149,  0x0,  0x716e,  0x0,  0x719c,  0x0,  0x71ce,  0x0,  0x71d0,  0x0,  0x7210,  0x0,  0x721b,  0x0,  0x7228,  0x0,  0x722a,  0x0,  0x722b,  0x0,  0x7235,  0x0,  0x7236,  0x0,  0x723b,  0x0,  0x723f,  0x0,  0x7247,  0x0,  0x7250,  0x0,  0x7259,  0x0,  0x725b,  0x0,  0x7262,  0x0,  0x7279,  0x0,  0x7280,  0x0,  0x7295,  0x0,  0x72ac,  0x0,  0x72af,  0x0,  0x72c0,  0x0,  0x72fc,  0x0,  0x732a,  0x0,  0x7375,  0x0,  0x737a,  0x0,  0x7384,  0x0,  0x7387,  0x0,  0x7389,  0x0,  0x738b,  0x0,  0x73a5,  0x0,  0x73b2,  0x0,  0x73de,  0x0,  0x7406,  0x0,  0x7409,  0x0,  0x7422,  0x0,  0x7447,  0x0,  0x745c,  0x0,  0x7469,  0x0,  0x7471,  0x0,  0x7485,  0x0,  0x7489,  0x0,  0x7498,  0x0,  0x74ca,  0x0,  0x74dc,  0x0,  0x74e6,  0x0,  0x7506,  0x0,  0x7518,  0x0,  0x751f,  0x0,  0x7524,  0x0,  0x7528,  0x0,  0x7530,  0x0,  0x7532,  0x0,  0x7533,  0x0,  0x7537,  0x0,  0x753b,  0x0,  0x753e,  0x0,  0x7559,  0x0,  0x7565,  0x0,  0x7570,  0x0,  0x758b,  0x0,  0x7592,  0x0,  0x75e2,  0x0,  0x7610,  0x0,  0x761d,  0x0,  0x761f,  0x0,  0x7642,  0x0,  0x7669,  0x0,  0x7676,  0x0,  0x767d,  0x0,  0x76ae,  0x0,  0x76bf,  0x0,  0x76ca,  0x0,  0x76db,  0x0,  0x76e3,  0x0,  0x76e7,  0x0,  0x76ee,  0x0,  0x76f4,  0x0,  0x7701,  0x0,  0x771e,  0x0,  0x771f,  0x0,  0x7740,  0x0,  0x774a,  0x0,  0x778b,  0x0,  0x77a7,  0x0,  0x77db,  0x0,  0x77e2,  0x0,  0x77f3,  0x0,  0x784e,  0x0,  0x786b,  0x0,  0x788c,  0x0,  0x7891,  0x0,  0x78ca,  0x0,  0x78cc,  0x0,  0x78fb,  0x0,  0x792a,  0x0,  0x793a,  0x0,  0x793c,  0x0,  0x793e,  0x0,  0x7948,  0x0,  0x7949,  0x0,  0x7950,  0x0,  0x7956,  0x0,  0x795d,  0x0,  0x795e,  0x0,  0x7965,  0x0,  0x797f,  0x0,  0x7981,  0x0,  0x798d,  0x0,  0x798e,  0x0,  0x798f,  0x0,  0x79ae,  0x0,  0x79b8,  0x0,  0x79be,  0x0,  0x79ca,  0x0,  0x79d8,  0x0,  0x79eb,  0x0,  0x7a1c,  0x0,  0x7a40,  0x0,  0x7a4a,  0x0,  0x7a4f,  0x0,  0x7a74,  0x0,  0x7a7a,  0x0,  0x7a81,  0x0,  0x7ab1,  0x0,  0x7acb,  0x0,  0x7aee,  0x0,  0x7af9,  0x0,  0x7b20,  0x0,  0x7b8f,  0x0,  0x7bc0,  0x0,  0x7bc6,  0x0,  0x7bc9,  0x0,  0x7c3e,  0x0,  0x7c60,  0x0,  0x7c73,  0x0,  0x7c7b,  0x0,  0x7c92,  0x0,  0x7cbe,  0x0,  0x7cd2,  0x0,  0x7cd6,  0x0,  0x7ce3,  0x0,  0x7ce7,  0x0,  0x7ce8,  0x0,  0x7cf8,  0x0,  0x7d00,  0x0,  0x7d10,  0x0,  0x7d22,  0x0,  0x7d2f,  0x0,  0x7d42,  0x0,  0x7d5b,  0x0,  0x7d63,  0x0,  0x7da0,  0x0,  0x7dbe,  0x0,  0x7dc7,  0x0,  0x7df4,  0x0,  0x7e02,  0x0,  0x7e09,  0x0,  0x7e37,  0x0,  0x7e41,  0x0,  0x7e45,  0x0,  0x7f36,  0x0,  0x7f3e,  0x0,  0x7f51,  0x0,  0x7f72,  0x0,  0x7f79,  0x0,  0x7f7a,  0x0,  0x7f85,  0x0,  0x7f8a,  0x0,  0x7f95,  0x0,  0x7f9a,  0x0,  0x7fbd,  0x0,  0x7ffa,  0x0,  0x8001,  0x0,  0x8005,  0x0,  0x800c,  0x0,  0x8012,  0x0,  0x8033,  0x0,  0x8046,  0x0,  0x8060,  0x0,  0x806f,  0x0,  0x8070,  0x0,  0x807e,  0x0,  0x807f,  0x0,  0x8089,  0x0,  0x808b,  0x0,  0x80ad,  0x0,  0x80b2,  0x0,  0x8103,  0x0,  0x813e,  0x0,  0x81d8,  0x0,  0x81e3,  0x0,  0x81e8,  0x0,  0x81ea,  0x0,  0x81ed,  0x0,  0x81f3,  0x0,  0x81fc,  0x0,  0x8201,  0x0,  0x8204,  0x0,  0x820c,  0x0,  0x8218,  0x0,  0x821b,  0x0,  0x821f,  0x0,  0x826e,  0x0,  0x826f,  0x0,  0x8272,  0x0,  0x8278,  0x0,  0x8279,  0x0,  0x828b,  0x0,  0x8291,  0x0,  0x829d,  0x0,  0x82b1,  0x0,  0x82b3,  0x0,  0x82bd,  0x0,  0x82e5,  0x0,  0x82e6,  0x0,  0x831d,  0x0,  0x8323,  0x0,  0x8336,  0x0,  0x8352,  0x0,  0x8353,  0x0,  0x8363,  0x0,  0x83ad,  0x0,  0x83bd,  0x0,  0x83c9,  0x0,  0x83ca,  0x0,  0x83cc,  0x0,  0x83dc,  0x0,  0x83e7,  0x0,  0x83ef,  0x0,  0x83f1,  0x0,  0x843d,  0x0,  0x8449,  0x0,  0x8457,  0x0,  0x84ee,  0x0,  0x84f1,  0x0,  0x84f3,  0x0,  0x84fc,  0x0,  0x8516,  0x0,  0x8564,  0x0,  0x85cd,  0x0,  0x85fa,  0x0,  0x8606,  0x0,  0x8612,  0x0,  0x862d,  0x0,  0x863f,  0x0,  0x864d,  0x0,  0x8650,  0x0,  0x865c,  0x0,  0x8667,  0x0,  0x8669,  0x0,  0x866b,  0x0,  0x8688,  0x0,  0x86a9,  0x0,  0x86e2,  0x0,  0x870e,  0x0,  0x8728,  0x0,  0x876b,  0x0,  0x8779,  0x0,  0x8786,  0x0,  0x87ba,  0x0,  0x87e1,  0x0,  0x8801,  0x0,  0x881f,  0x0,  0x8840,  0x0,  0x884c,  0x0,  0x8860,  0x0,  0x8863,  0x0,  0x88c2,  0x0,  0x88cf,  0x0,  0x88d7,  0x0,  0x88de,  0x0,  0x88e1,  0x0,  0x88f8,  0x0,  0x88fa,  0x0,  0x8910,  0x0,  0x8941,  0x0,  0x8964,  0x0,  0x897e,  0x0,  0x8986,  0x0,  0x898b,  0x0,  0x8996,  0x0,  0x89d2,  0x0,  0x89e3,  0x0,  0x8a00,  0x0,  0x8aa0,  0x0,  0x8aaa,  0x0,  0x8abf,  0x0,  0x8acb,  0x0,  0x8ad2,  0x0,  0x8ad6,  0x0,  0x8aed,  0x0,  0x8af8,  0x0,  0x8afe,  0x0,  0x8b01,  0x0,  0x8b39,  0x0,  0x8b58,  0x0,  0x8b80,  0x0,  0x8b8a,  0x0,  0x8c37,  0x0,  0x8c46,  0x0,  0x8c48,  0x0,  0x8c55,  0x0,  0x8c78,  0x0,  0x8c9d,  0x0,  0x8ca1,  0x0,  0x8ca9,  0x0,  0x8cab,  0x0,  0x8cc1,  0x0,  0x8cc2,  0x0,  0x8cc7,  0x0,  0x8cc8,  0x0,  0x8cd3,  0x0,  0x8d08,  0x0,  0x8d1b,  0x0,  0x8d64,  0x0,  0x8d70,  0x0,  0x8d77,  0x0,  0x8db3,  0x0,  0x8dbc,  0x0,  0x8dcb,  0x0,  0x8def,  0x0,  0x8df0,  0x0,  0x8eab,  0x0,  0x8eca,  0x0,  0x8ed4,  0x0,  0x8f26,  0x0,  0x8f2a,  0x0,  0x8f38,  0x0,  0x8f3b,  0x0,  0x8f62,  0x0,  0x8f9b,  0x0,  0x8f9e,  0x0,  0x8fb0,  0x0,  0x8fb5,  0x0,  0x8fb6,  0x0,  0x9023,  0x0,  0x9038,  0x0,  0x904a,  0x0,  0x9069,  0x0,  0x9072,  0x0,  0x907c,  0x0,  0x908f,  0x0,  0x9091,  0x0,  0x9094,  0x0,  0x90ce,  0x0,  0x90de,  0x0,  0x90f1,  0x0,  0x90fd,  0x0,  0x9111,  0x0,  0x911b,  0x0,  0x9149,  0x0,  0x916a,  0x0,  0x9199,  0x0,  0x91b4,  0x0,  0x91c6,  0x0,  0x91cc,  0x0,  0x91cf,  0x0,  0x91d1,  0x0,  0x9234,  0x0,  0x9238,  0x0,  0x9276,  0x0,  0x927c,  0x0,  0x92d7,  0x0,  0x92d8,  0x0,  0x9304,  0x0,  0x934a,  0x0,  0x93f9,  0x0,  0x9415,  0x0,  0x9577,  0x0,  0x9580,  0x0,  0x958b,  0x0,  0x95ad,  0x0,  0x95b7,  0x0,  0x961c,  0x0,  0x962e,  0x0,  0x964b,  0x0,  0x964d,  0x0,  0x9675,  0x0,  0x9678,  0x0,  0x967c,  0x0,  0x9686,  0x0,  0x96a3,  0x0,  0x96b6,  0x0,  0x96b7,  0x0,  0x96b8,  0x0,  0x96b9,  0x0,  0x96c3,  0x0,  0x96e2,  0x0,  0x96e3,  0x0,  0x96e8,  0x0,  0x96f6,  0x0,  0x96f7,  0x0,  0x9723,  0x0,  0x9732,  0x0,  0x9748,  0x0,  0x9751,  0x0,  0x9756,  0x0,  0x975e,  0x0,  0x9762,  0x0,  0x9769,  0x0,  0x97cb,  0x0,  0x97db,  0x0,  0x97e0,  0x0,  0x97ed,  0x0,  0x97f3,  0x0,  0x97ff,  0x0,  0x9801,  0x0,  0x9805,  0x0,  0x980b,  0x0,  0x9818,  0x0,  0x9829,  0x0,  0x983b,  0x0,  0x985e,  0x0,  0x98a8,  0x0,  0x98db,  0x0,  0x98df,  0x0,  0x98e2,  0x0,  0x98ef,  0x0,  0x98fc,  0x0,  0x9928,  0x0,  0x9929,  0x0,  0x9996,  0x0,  0x9999,  0x0,  0x99a7,  0x0,  0x99ac,  0x0,  0x99c2,  0x0,  0x99f1,  0x0,  0x99fe,  0x0,  0x9a6a,  0x0,  0x9aa8,  0x0,  0x9ad8,  0x0,  0x9adf,  0x0,  0x9b12,  0x0,  0x9b25,  0x0,  0x9b2f,  0x0,  0x9b32,  0x0,  0x9b3c,  0x0,  0x9b5a,  0x0,  0x9b6f,  0x0,  0x9c40,  0x0,  0x9c57,  0x0,  0x9ce5,  0x0,  0x9cfd,  0x0,  0x9d67,  0x0,  0x9db4,  0x0,  0x9dfa,  0x0,  0x9e1e,  0x0,  0x9e75,  0x0,  0x9e7f,  0x0,  0x9e97,  0x0,  0x9e9f,  0x0,  0x9ea5,  0x0,  0x9ebb,  0x0,  0x9ec3,  0x0,  0x9ecd,  0x0,  0x9ece,  0x0,  0x9ed1,  0x0,  0x9ef9,  0x0,  0x9efd,  0x0,  0x9efe,  0x0,  0x9f05,  0x0,  0x9f0e,  0x0,  0x9f0f,  0x0,  0x9f13,  0x0,  0x9f16,  0x0,  0x9f20,  0x0,  0x9f3b,  0x0,  0x9f43,  0x0,  0x9f4a,  0x0,  0x9f52,  0x0,  0x9f8d,  0x0,  0x9f8e,  0x0,  0x9f9c,  0x0,  0x9f9f,  0x0,  0x9fa0,  0x0,  0xa76f,  0x0,  0x11099,  0x110ba,  0x0,  0x1109b,  0x110ba,  0x0,  0x110a5,  0x110ba,  0x0,  0x11131,  0x11127,  0x0,  0x11132,  0x11127,  0x0,  0x1d157,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x0,  0x1d158,  0x1d165,  0x1d16e,  0x0,  0x1d158,  0x1d165,  0x1d16f,  0x0,  0x1d158,  0x1d165,  0x1d170,  0x0,  0x1d158,  0x1d165,  0x1d171,  0x0,  0x1d158,  0x1d165,  0x1d172,  0x0,  0x1d1b9,  0x1d165,  0x0,  0x1d1b9,  0x1d165,  0x1d16e,  0x0,  0x1d1b9,  0x1d165,  0x1d16f,  0x0,  0x1d1ba,  0x1d165,  0x0,  0x1d1ba,  0x1d165,  0x1d16e,  0x0,  0x1d1ba,  0x1d165,  0x1d16f,  0x0,  0x20122,  0x0,  0x2051c,  0x0,  0x20525,  0x0,  0x2054b,  0x0,  0x2063a,  0x0,  0x20804,  0x0,  0x208de,  0x0,  0x20a2c,  0x0,  0x20b63,  0x0,  0x214e4,  0x0,  0x216a8,  0x0,  0x216ea,  0x0,  0x219c8,  0x0,  0x21b18,  0x0,  0x21d0b,  0x0,  0x21de4,  0x0,  0x21de6,  0x0,  0x22183,  0x0,  0x2219f,  0x0,  0x22331,  0x0,  0x226d4,  0x0,  0x22844,  0x0,  0x2284a,  0x0,  0x22b0c,  0x0,  0x22bf1,  0x0,  0x2300a,  0x0,  0x232b8,  0x0,  0x2335f,  0x0,  0x23393,  0x0,  0x2339c,  0x0,  0x233c3,  0x0,  0x233d5,  0x0,  0x2346d,  0x0,  0x236a3,  0x0,  0x238a7,  0x0,  0x23a8d,  0x0,  0x23afa,  0x0,  0x23cbc,  0x0,  0x23d1e,  0x0,  0x23ed1,  0x0,  0x23f5e,  0x0,  0x23f8e,  0x0,  0x24263,  0x0,  0x242ee,  0x0,  0x243ab,  0x0,  0x24608,  0x0,  0x24735,  0x0,  0x24814,  0x0,  0x24c36,  0x0,  0x24c92,  0x0,  0x24fa1,  0x0,  0x24fb8,  0x0,  0x25044,  0x0,  0x250f2,  0x0,  0x250f3,  0x0,  0x25119,  0x0,  0x25133,  0x0,  0x25249,  0x0,  0x2541d,  0x0,  0x25626,  0x0,  0x2569a,  0x0,  0x256c5,  0x0,  0x2597c,  0x0,  0x25aa7,  0x0,  0x25bab,  0x0,  0x25c80,  0x0,  0x25cd0,  0x0,  0x25f86,  0x0,  0x261da,  0x0,  0x26228,  0x0,  0x26247,  0x0,  0x262d9,  0x0,  0x2633e,  0x0,  0x264da,  0x0,  0x26523,  0x0,  0x265a8,  0x0,  0x267a7,  0x0,  0x267b5,  0x0,  0x26b3c,  0x0,  0x26c36,  0x0,  0x26cd5,  0x0,  0x26d6b,  0x0,  0x26f2c,  0x0,  0x26fb1,  0x0,  0x270d2,  0x0,  0x273ca,  0x0,  0x27667,  0x0,  0x278ae,  0x0,  0x27966,  0x0,  0x27ca8,  0x0,  0x27ed3,  0x0,  0x27f2f,  0x0,  0x285d2,  0x0,  0x285ed,  0x0,  0x2872e,  0x0,  0x28bfa,  0x0,  0x28d77,  0x0,  0x29145,  0x0,  0x291df,  0x0,  0x2921a,  0x0,  0x2940a,  0x0,  0x29496,  0x0,  0x295b6,  0x0,  0x29b30,  0x0,  0x2a0ce,  0x0,  0x2a105,  0x0,  0x2a20e,  0x0,  0x2a291,  0x0,  0x2a392,  0x0,  0x2a600,  0x0]; return t; }
++}
++
++}
++
+--- a/src/libphobos/src/std/internal/unicode_grapheme.d	1970-01-01 01:00:00.000000000 +0100
++++ b/src/libphobos/src/std/internal/unicode_grapheme.d	2014-04-01 16:32:51.000000000 +0100
+@@ -0,0 +1,28 @@
++module std.internal.unicode_grapheme;
++import std.internal.unicode_tables;
++
++static if(size_t.sizeof == 8) {
++//832 bytes
++enum hangulLVTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x40], [ 0x100,  0x80,  0xa00], [ 0x2010000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4000300020001,  0x1000700060005,  0x5000400030002,  0x2000100070006,  0x6000500040003,  0x3000200010007,  0x7000600050004,  0x4000300020001,  0x1000700060005,  0x5000400030002,  0x8000100070006,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x100000010000001,  0x1000000100000,  0x10000001000,  0x1000000100000010,  0x10000001000000,  0x100000010000,  0x1000000100,  0x100000010000001,  0x1000000100000,  0x10000001000,  0x1000000100000010,  0x10000001000000,  0x100000010000,  0x1000000100,  0x100000010000001,  0x1000000100000,  0x10000001000,  0x1000000100000010,  0x10000001000000,  0x100000010000,  0x1000000100,  0x100000010000001,  0x1000000100000,  0x10000001000,  0x1000000100000010,  0x10000001000000,  0x100000010000,  0x1000000100,  0x10000001000000,  0x100000010000,  0x100,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//832 bytes
++enum hangulLVTTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x40], [ 0x100,  0x80,  0xa00], [ 0x2010000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4000300020001,  0x1000700060005,  0x5000400030002,  0x2000100070006,  0x6000500040003,  0x3000200010007,  0x7000600050004,  0x4000300020001,  0x1000700060005,  0x5000400030002,  0x8000100070006,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfeffffffeffffffe,  0xfffeffffffefffff,  0xfffffeffffffefff,  0xeffffffeffffffef,  0xffeffffffeffffff,  0xffffeffffffeffff,  0xffffffeffffffeff,  0xfeffffffeffffffe,  0xfffeffffffefffff,  0xfffffeffffffefff,  0xeffffffeffffffef,  0xffeffffffeffffff,  0xffffeffffffeffff,  0xffffffeffffffeff,  0xfeffffffeffffffe,  0xfffeffffffefffff,  0xfffffeffffffefff,  0xeffffffeffffffef,  0xffeffffffeffffff,  0xffffeffffffeffff,  0xffffffeffffffeff,  0xfeffffffeffffffe,  0xfffeffffffefffff,  0xfffffeffffffefff,  0xeffffffeffffffef,  0xffeffffffeffffff,  0xffffeffffffeffff,  0xffffffeffffffeff,  0xffeffffffeffffff,  0xffffeffffffeffff,  0xffffffeff,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1536 bytes
++enum mcTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x60], [ 0x100,  0x100,  0x1800], [ 0x202030202020100,  0x206020205020204,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x6000000050004,  0x7,  0x8000000000000,  0xb000a00090000,  0xc,  0x0,  0x0,  0x0,  0x0,  0xd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x110010000f000e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x130012,  0x1400000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x15000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc800000000000008,  0xde01,  0xc00000000000000c,  0x801981,  0xc000000000000008,  0x1,  0xc000000000000008,  0x1a01,  0x400000000000000c,  0x801981,  0xc000000000000000,  0x801dc6,  0xe,  0x1e,  0x400000000000000c,  0x600d9f,  0xc00000000000000c,  0x801dc1,  0xc,  0xc0000ff038000,  0xc000000000000000,  0x8000000000000000,  0x0,  0x0,  0x1902180000000000,  0x3f9c00c00000,  0x1c009f98,  0x0,  0x0,  0x0,  0xc040000000000000,  0x1bf,  0x1fb0e7800000000,  0x0,  0xffff000000000000,  0x301,  0x6000000,  0x7e01a00a00000,  0x0,  0x0,  0xe820000000000010,  0x1b,  0x34c200000004,  0xc5c8000000000,  0x300ff000000000,  0x0,  0x0,  0xc000200000000,  0xc00000000000,  0x0,  0x0,  0x0,  0x9800000000,  0x0,  0xfff0000000000003,  0xf,  0x0,  0xc0000,  0xec30000000000008,  0x1,  0x19800000000000,  0x800000000002000,  0x0,  0x20c80000000000,  0x0,  0x0,  0x0,  0x16d800000000,  0x5,  0x0,  0x187000000000004,  0x0,  0x100000000000,  0x0,  0x8038000000000004,  0x1,  0x0,  0x0,  0x40d00000000000,  0x0,  0x0,  0x7ffffffffffe0000,  0x0,  0x0,  0x0,  0x7e06000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2336 bytes
++enum graphemeExtendTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x70], [ 0x100,  0x140,  0x2d00], [ 0x402030202020100,  0x207020206020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020208,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1000000000000,  0x5000400030002,  0x9000800070006,  0xd000c000b000a,  0xf00000000000e,  0x10000000000000,  0x14001300120011,  0x160015,  0x17,  0x0,  0x0,  0x190018,  0x1a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b00000000,  0x1f001e001d001c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000000000000,  0x22002100000000,  0x230000,  0x0,  0x2400000000,  0x0,  0x260025,  0x2700000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x28000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2a00290000,  0x0,  0x0,  0x0,  0x2b0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffff,  0x0,  0x0,  0x0,  0x0,  0x3f8,  0x0,  0x0,  0x0,  0xbffffffffffe0000,  0xb6,  0x7ff0000,  0x10000fffff800,  0x0,  0x3d9f9fc00000,  0xffff000000020000,  0x7ff,  0x1ffc000000000,  0xff80000000000,  0x3eeffbc00000,  0xe000000,  0x0,  0x7ffffff000000000,  0x1400000000000007,  0xc00fe21fe,  0x5000000000000002,  0xc0080201e,  0x1000000000000006,  0x23000000023986,  0x1000000000000006,  0xc000021be,  0xd000000000000002,  0xc00c0201e,  0x4000000000000004,  0x802001,  0xc000000000000000,  0xc00603dc1,  0x9000000000000000,  0xc00603044,  0x4000000000000000,  0xc0080201e,  0x0,  0x805c8400,  0x7f2000000000000,  0x7f80,  0x1bf2000000000000,  0x3f00,  0x2a0000003000000,  0x7ffe000000000000,  0x1ffffffffeffe0df,  0x40,  0x66fde00000000000,  0x1e0001c3000000,  0x20002064,  0x0,  0x0,  0xe0000000,  0x0,  0x0,  0x1c0000001c0000,  0xc0000000c0000,  0x3fb0000000000000,  0x200ffe40,  0x3800,  0x0,  0x20000000000,  0x0,  0xe04018700000000,  0x0,  0x0,  0x0,  0x9800000,  0x9ff81fe57f400000,  0x0,  0x0,  0x17d000000000000f,  0xff80000000004,  0xb3c00000003,  0x3a34000000000,  0xcff00000000000,  0x0,  0x0,  0x1021fdfff70000,  0x0,  0x0,  0x0,  0xf000007fffffffff,  0x3000,  0x0,  0x0,  0x1ffffffff0000,  0x0,  0x0,  0x0,  0x3800000000000,  0x0,  0x8000000000000000,  0x0,  0xffffffff00000000,  0xfc0000000000,  0x0,  0x6000000,  0x0,  0x0,  0x3ff7800000000000,  0x80000000,  0x3000000000000,  0x6000000844,  0x0,  0x0,  0x3ffff00000010,  0x3fc000000000,  0x3ff80,  0x13c8000000000007,  0x0,  0x667e0000000000,  0x1008,  0xc19d000000000000,  0x40300000000002,  0x0,  0x0,  0x0,  0x212000000000,  0x40000000,  0x0,  0x0,  0x0,  0x7f0000ffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x0,  0x2000000000000000,  0x870000000000f06e,  0x0,  0x0,  0x0,  0xff00000000000002,  0x7f,  0x678000000000003,  0x0,  0x1fef8000000007,  0x0,  0x7fc0000000000003,  0x0,  0x0,  0x0,  0xbf280000000000,  0x0,  0x0,  0x0,  0x78000,  0x0,  0x0,  0xf807c3a000000000,  0x3c0000000fe7,  0x0,  0x0,  0x1c,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff,  0x0,  0x0,  0x0,  0x0]);
++
++}
++
++
++static if(size_t.sizeof == 4) {
++//832 bytes
++enum hangulLVTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0x80], [ 0x100,  0x80,  0xa00], [ 0x0,  0x20100,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x80001,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x10000001,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x10,  0x1000000,  0x100000,  0x10000,  0x1000,  0x100,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//832 bytes
++enum hangulLVTTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0x80], [ 0x100,  0x80,  0xa00], [ 0x0,  0x20100,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x20001,  0x40003,  0x60005,  0x10007,  0x30002,  0x50004,  0x70006,  0x80001,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xeffffffe,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xffffffef,  0xfeffffff,  0xffefffff,  0xfffeffff,  0xffffefff,  0xfffffeff,  0xf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1536 bytes
++enum mcTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xc0], [ 0x100,  0x100,  0x1800], [ 0x2020100,  0x2020302,  0x5020204,  0x2060202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x60000,  0x7,  0x0,  0x0,  0x80000,  0x90000,  0xb000a,  0xc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf000e,  0x110010,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x130012,  0x0,  0x0,  0x14,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x150000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8,  0xc8000000,  0xde01,  0x0,  0xc,  0xc0000000,  0x801981,  0x0,  0x8,  0xc0000000,  0x1,  0x0,  0x8,  0xc0000000,  0x1a01,  0x0,  0xc,  0x40000000,  0x801981,  0x0,  0x0,  0xc0000000,  0x801dc6,  0x0,  0xe,  0x0,  0x1e,  0x0,  0xc,  0x40000000,  0x600d9f,  0x0,  0xc,  0xc0000000,  0x801dc1,  0x0,  0xc,  0x0,  0xff038000,  0xc0000,  0x0,  0xc0000000,  0x0,  0x80000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x19021800,  0xc00000,  0x3f9c,  0x1c009f98,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0400000,  0x1bf,  0x0,  0x0,  0x1fb0e78,  0x0,  0x0,  0x0,  0xffff0000,  0x301,  0x0,  0x6000000,  0x0,  0xa00000,  0x7e01a,  0x0,  0x0,  0x0,  0x0,  0x10,  0xe8200000,  0x1b,  0x0,  0x4,  0x34c2,  0x0,  0xc5c80,  0x0,  0x300ff0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0002,  0x0,  0xc000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x98,  0x0,  0x0,  0x3,  0xfff00000,  0xf,  0x0,  0x0,  0x0,  0xc0000,  0x0,  0x8,  0xec300000,  0x1,  0x0,  0x0,  0x198000,  0x2000,  0x8000000,  0x0,  0x0,  0x0,  0x20c800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16d8,  0x5,  0x0,  0x0,  0x0,  0x4,  0x1870000,  0x0,  0x0,  0x0,  0x1000,  0x0,  0x0,  0x4,  0x80380000,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x40d000,  0x0,  0x0,  0x0,  0x0,  0xfffe0000,  0x7fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7e060,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2336 bytes
++enum graphemeExtendTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xe0], [ 0x100,  0x140,  0x2d00], [ 0x2020100,  0x4020302,  0x6020205,  0x2070202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020208,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xb000a,  0xd000c,  0xe,  0xf0000,  0x0,  0x100000,  0x120011,  0x140013,  0x160015,  0x0,  0x17,  0x0,  0x0,  0x0,  0x0,  0x0,  0x190018,  0x0,  0x1a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b,  0x1d001c,  0x1f001e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200000,  0x0,  0x220021,  0x230000,  0x0,  0x0,  0x0,  0x0,  0x24,  0x0,  0x0,  0x260025,  0x0,  0x0,  0x27,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x280000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x290000,  0x2a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfffe0000,  0xbfffffff,  0xb6,  0x0,  0x7ff0000,  0x0,  0xfffff800,  0x10000,  0x0,  0x0,  0x9fc00000,  0x3d9f,  0x20000,  0xffff0000,  0x7ff,  0x0,  0x0,  0x1ffc0,  0x0,  0xff800,  0xfbc00000,  0x3eef,  0xe000000,  0x0,  0x0,  0x0,  0x0,  0x7ffffff0,  0x7,  0x14000000,  0xfe21fe,  0xc,  0x2,  0x50000000,  0x80201e,  0xc,  0x6,  0x10000000,  0x23986,  0x230000,  0x6,  0x10000000,  0x21be,  0xc,  0x2,  0xd0000000,  0xc0201e,  0xc,  0x4,  0x40000000,  0x802001,  0x0,  0x0,  0xc0000000,  0x603dc1,  0xc,  0x0,  0x90000000,  0x603044,  0xc,  0x0,  0x40000000,  0x80201e,  0xc,  0x0,  0x0,  0x805c8400,  0x0,  0x0,  0x7f20000,  0x7f80,  0x0,  0x0,  0x1bf20000,  0x3f00,  0x0,  0x3000000,  0x2a00000,  0x0,  0x7ffe0000,  0xfeffe0df,  0x1fffffff,  0x40,  0x0,  0x0,  0x66fde000,  0xc3000000,  0x1e0001,  0x20002064,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe0000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1c0000,  0x1c0000,  0xc0000,  0xc0000,  0x0,  0x3fb00000,  0x200ffe40,  0x0,  0x3800,  0x0,  0x0,  0x0,  0x0,  0x200,  0x0,  0x0,  0x0,  0xe040187,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9800000,  0x0,  0x7f400000,  0x9ff81fe5,  0x0,  0x0,  0x0,  0x0,  0xf,  0x17d00000,  0x4,  0xff800,  0x3,  0xb3c,  0x0,  0x3a340,  0x0,  0xcff000,  0x0,  0x0,  0x0,  0x0,  0xfff70000,  0x1021fd,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xf000007f,  0x3000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0x1ffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x38000,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x0,  0xffffffff,  0x0,  0xfc00,  0x0,  0x0,  0x6000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff78000,  0x80000000,  0x0,  0x0,  0x30000,  0x844,  0x60,  0x0,  0x0,  0x0,  0x0,  0x10,  0x3ffff,  0x0,  0x3fc0,  0x3ff80,  0x0,  0x7,  0x13c80000,  0x0,  0x0,  0x0,  0x667e00,  0x1008,  0x0,  0x0,  0xc19d0000,  0x2,  0x403000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2120,  0x40000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff,  0x7f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000000,  0xf06e,  0x87000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2,  0xff000000,  0x7f,  0x0,  0x3,  0x6780000,  0x0,  0x0,  0x7,  0x1fef80,  0x0,  0x0,  0x3,  0x7fc00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbf2800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x78000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf807c3a0,  0xfe7,  0x3c00,  0x0,  0x0,  0x0,  0x0,  0x1c,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++
++}
++
+--- a/src/libphobos/src/std/internal/unicode_norm.d	1970-01-01 01:00:00.000000000 +0100
++++ b/src/libphobos/src/std/internal/unicode_norm.d	2014-04-01 16:32:51.000000000 +0100
+@@ -0,0 +1,28 @@
++module std.internal.unicode_norm;
++import std.internal.unicode_tables;
++
++static if(size_t.sizeof == 8) {
++//1600 bytes
++enum nfcQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x60], [ 0x100,  0x100,  0x1a00], [ 0x302020202020100,  0x205020202020204,  0x602020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1000000000000,  0x200000000,  0x5000400030000,  0x8000000070006,  0xa0009,  0x0,  0xb000000000000,  0xc000000000000,  0xf0000000e000d,  0x0,  0x1000000000,  0x0,  0x11,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x14001300120000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160015,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1800120012,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10361f8081a9fdf,  0x401000000000003f,  0x80,  0x0,  0x0,  0x380000,  0x0,  0x0,  0x1000000000000000,  0xff000000,  0x4000000000000000,  0xb0800000,  0x48000000000000,  0x4e000000,  0x0,  0x0,  0x4000000000000000,  0x30c00000,  0x4000000000000000,  0x800000,  0x0,  0x400000,  0x0,  0x600004,  0x4000000000000000,  0x800000,  0x0,  0x80008400,  0x0,  0x168020010842008,  0x200108420080002,  0x0,  0x400000000000,  0x0,  0x0,  0x0,  0x0,  0x3ffffe00000000,  0xffffff0000000000,  0x7,  0x20000000000000,  0x0,  0x0,  0x0,  0x0,  0x2aaa000000000000,  0x4800000000000000,  0x2a00c80808080a00,  0x3,  0x0,  0x0,  0x0,  0xc4000000000,  0x0,  0x0,  0x0,  0x60000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x6000000,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffc657fe53fff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7ffc00a0000000,  0x7fdb,  0x0,  0x0,  0x0,  0x0,  0x400000000000000,  0x0,  0x8000000000,  0x0,  0x0,  0x0,  0x0,  0x1fc0000000,  0xf800000000000000,  0x1,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1920 bytes
++enum nfdQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x70], [ 0x100,  0x140,  0x2000], [ 0x504030202020100,  0x207020202020206,  0x802020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x5000600050004,  0x9000800070005,  0xc0005000b000a,  0x500050005000d,  0x5000500050005,  0xe000500050005,  0x10000f00050005,  0x14001300120011,  0x5000500050005,  0x5001500050005,  0x5000500050005,  0x5000500050016,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x17001700170017,  0x18001700170017,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x1a001900170005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x50005001c001b,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x50005001d0005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5001e00170017,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x5000500050005,  0x0,  0x0,  0x0,  0xbe7effbf3e7effbf,  0x7ef1ff3ffffcffff,  0x7fffff3ffff3f1f8,  0x1800300000000,  0xff31ffcfdfffe000,  0xfffc0cfffffff,  0x0,  0x0,  0x0,  0x0,  0x401000000000001b,  0x1fc000001d7e0,  0x187c00,  0x20000000200708b,  0xc00000708b0000,  0x0,  0x33ffcfcfccf0006,  0x0,  0x0,  0x0,  0x0,  0x7c00000000,  0x0,  0x0,  0x80005,  0x12020000000000,  0xff000000,  0x0,  0xb0001800,  0x48000000000000,  0x4e000000,  0x0,  0x0,  0x0,  0x30001900,  0x100000,  0x1c00,  0x0,  0x100,  0x0,  0xd81,  0x0,  0x1c00,  0x0,  0x74000000,  0x0,  0x168020010842008,  0x200108420080002,  0x0,  0x4000000000,  0x0,  0x0,  0x0,  0x2800000000045540,  0xb,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0bffffff,  0x3ffffffffffffff,  0xffffffff3f3fffff,  0x3fffffffaaff3f3f,  0x5fdfffffffffffff,  0x3fdcffffefcfffde,  0x3,  0x0,  0x0,  0x0,  0xc4000000000,  0x0,  0x40000c000000,  0xe000,  0x5000001210,  0x333e00500000292,  0xf00000000333,  0x3c0f00000000,  0x60000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x0,  0x36db02a555555000,  0x5555500040100000,  0x4790000036db02a5,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffff,  0x0,  0xfffffc657fe53fff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7ffc00a0000000,  0x7fdb,  0x0,  0x0,  0x0,  0x0,  0x80014000000,  0x0,  0xc00000000000,  0x0,  0x0,  0x0,  0x0,  0x1fc0000000,  0xf800000000000000,  0x1,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2560 bytes
++enum nfkcQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x70], [ 0x100,  0x140,  0x3400], [ 0x402030202020100,  0x706020202020205,  0x802020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x4000600050004,  0x9000800070004,  0xd000c000b000a,  0x40004000f000e,  0x4000400040004,  0x10000400040004,  0x13001200110004,  0x17001600150014,  0x4000400040018,  0x4001900040004,  0x1d001c001b001a,  0x210020001f001e,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x22000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x24002300210004,  0x27002600250021,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400290028,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x40004002a0004,  0x2e002d002c002b,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4002f00040004,  0x4003100300004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4003200210021,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x4000400040004,  0x0,  0x0,  0x773c850100000000,  0x0,  0x800c000000000000,  0x8000000000000201,  0x0,  0xe000000001ff0,  0x0,  0x0,  0x1ff000000000000,  0x1f3f000000,  0x10361f8081a9fdf,  0x441000000000003f,  0xb0,  0x2370000007f0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80,  0x0,  0x0,  0x1e0000000380000,  0x0,  0x0,  0x1000000000000000,  0xff000000,  0x4000000000000000,  0xb0800000,  0x48000000000000,  0x4e000000,  0x0,  0x0,  0x4000000000000000,  0x30c00000,  0x4000000000000000,  0x800000,  0x0,  0x400000,  0x0,  0x600004,  0x4000000000000000,  0x800000,  0x0,  0x80008400,  0x8000000000000,  0x0,  0x8000000000000,  0x30000000,  0x1000,  0x3e8020010842008,  0x200108420080002,  0x0,  0x400000000000,  0x0,  0x0,  0x1000000000000000,  0x0,  0x3ffffe00000000,  0xffffff0000000000,  0x7,  0x20000000000000,  0x0,  0x0,  0x0,  0xf7ff700000000000,  0x10007ffffffbfff,  0xfffffffff8000000,  0x0,  0x0,  0x0,  0xc000000,  0x0,  0x0,  0x2aaa000000000000,  0xe800000000000000,  0x6a00e808e808ea03,  0x50d88070008207ff,  0xfff3000080800380,  0x1001fff7fff,  0x0,  0xfbfbbd573e6ffeef,  0xffffffffffff03e1,  0x200,  0x0,  0x1b00000000000,  0x0,  0x0,  0x0,  0x60000000000,  0x0,  0x0,  0x0,  0x0,  0xffffffff00000000,  0xffffffffffffffff,  0x7ffffffffff,  0x1000,  0x70000000000000,  0x0,  0x10000000,  0x0,  0x3000000000000000,  0x0,  0x0,  0x0,  0x800000000000,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x8000000000000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffff,  0x740000000000001,  0x0,  0x9e000000,  0x8000000000000000,  0xfffe000000000000,  0xffffffffffffffff,  0xfffc7fff,  0x0,  0xffffffff7fffffff,  0x7fffffffffff00ff,  0xffffffffffffffff,  0x7fffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x0,  0x1000000000000,  0x0,  0x300000000000000,  0xfffffc657fe53fff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7fffffa0f8007f,  0xffffffffffffffdb,  0x3ffffffffffff,  0xfffffffffff80000,  0x3fffffffffffffff,  0xffffffffffff0000,  0xfffffffffffcffff,  0x1fff0000000000ff,  0xffff000003ff0000,  0xffd70f7ffff7ff9f,  0xffffffffffffffff,  0x1fffffffffffffff,  0xfffffffffffffffe,  0xffffffffffffffff,  0x7fffffffffffffff,  0x7f7f1cfcfcfc,  0x0,  0x0,  0x400000000000000,  0x0,  0x8000000000,  0x0,  0x0,  0x0,  0x0,  0x1fc0000000,  0xf800000000000000,  0x1,  0xffffffffffffffff,  0xffffffffffdfffff,  0xebffde64dfffffff,  0xffffffffffffffef,  0x7bffffffdfdfe7bf,  0xfffffffffffdfc5f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffff3fffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffcfff,  0xaf7fe96ffffffef,  0x5ef7f796aa96ea84,  0xffffbee0ffffbff,  0x0,  0xffff7fffffff07ff,  0xc000000ffff,  0x10000,  0x0,  0x7ffffffffff0007,  0x301ff,  0x0,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2656 bytes
++enum nfkdQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x78], [ 0x100,  0x160,  0x3500], [ 0x504030202020100,  0x807020202020206,  0x902020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x7000600050004,  0xa000900080007,  0xe000d000c000b,  0x700070007000f,  0x7000700070007,  0x10000700070007,  0x13001200110007,  0x17001600150014,  0x7000700070018,  0x7001900070007,  0x1d001c001b001a,  0x210020001f001e,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x22000700070007,  0x7000700070007,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x21002100210021,  0x23002100210021,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x25002400210007,  0x28002700260021,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x70007002a0029,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x70007002b0007,  0x2f002e002d002c,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7003000070007,  0x7003200310007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7003300210021,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x7000700070007,  0x0,  0x0,  0x773c850100000000,  0xbe7effbf3e7effbf,  0xfefdff3ffffcffff,  0xffffff3ffff3f3f9,  0x1800300000000,  0xff3fffcfdffffff0,  0xfffc0cfffffff,  0x0,  0x1ff000000000000,  0x1f3f000000,  0x0,  0x441000000000001b,  0x1fc000001d7f0,  0x2370000007f7c00,  0x20000000200708b,  0xc00000708b0000,  0x0,  0x33ffcfcfccf0006,  0x0,  0x0,  0x80,  0x0,  0x7c00000000,  0x1e0000000000000,  0x0,  0x80005,  0x0,  0x0,  0x0,  0x0,  0x12020000000000,  0xff000000,  0x0,  0xb0001800,  0x48000000000000,  0x4e000000,  0x0,  0x0,  0x0,  0x30001900,  0x100000,  0x1c00,  0x0,  0x100,  0x0,  0xd81,  0x0,  0x1c00,  0x0,  0x74000000,  0x8000000000000,  0x0,  0x8000000000000,  0x30000000,  0x1000,  0x3e8020010842008,  0x200108420080002,  0x0,  0x4000000000,  0x0,  0x0,  0x1000000000000000,  0x2800000000045540,  0xb,  0x0,  0x0,  0xf7ff700000000000,  0x10007ffffffbfff,  0xfffffffff8000000,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0fffffff,  0x3ffffffffffffff,  0xffffffff3f3fffff,  0x3fffffffaaff3f3f,  0xffdfffffffffffff,  0x7fdcffffefcfffdf,  0x50d88070008207ff,  0xfff3000080800380,  0x1001fff7fff,  0x0,  0xfbfbbd573e6ffeef,  0xffffffffffff03e1,  0x40000c000200,  0xe000,  0x1b05000001210,  0x333e00500000292,  0xf00000000333,  0x3c0f00000000,  0x60000000000,  0x0,  0x0,  0x0,  0x0,  0xffffffff00000000,  0xffffffffffffffff,  0x7ffffffffff,  0x1000,  0x70000000000000,  0x0,  0x10000000,  0x0,  0x3000000000000000,  0x0,  0x0,  0x0,  0x800000000000,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x8000000000000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffff,  0x740000000000001,  0x36db02a555555000,  0x55555000d8100000,  0xc790000036db02a5,  0xfffe000000000000,  0xffffffffffffffff,  0xfffc7fff,  0x0,  0xffffffff7fffffff,  0x7fffffffffff00ff,  0xffffffffffffffff,  0x7fffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x0,  0x1000000000000,  0x0,  0x300000000000000,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffff,  0x0,  0xfffffc657fe53fff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7fffffa0f8007f,  0xffffffffffffffdb,  0x3ffffffffffff,  0xfffffffffff80000,  0x3fffffffffffffff,  0xffffffffffff0000,  0xfffffffffffcffff,  0x1fff0000000000ff,  0xffff000003ff0000,  0xffd70f7ffff7ff9f,  0xffffffffffffffff,  0x1fffffffffffffff,  0xfffffffffffffffe,  0xffffffffffffffff,  0x7fffffffffffffff,  0x7f7f1cfcfcfc,  0x0,  0x0,  0x80014000000,  0x0,  0xc00000000000,  0x0,  0x0,  0x0,  0x0,  0x1fc0000000,  0xf800000000000000,  0x1,  0xffffffffffffffff,  0xffffffffffdfffff,  0xebffde64dfffffff,  0xffffffffffffffef,  0x7bffffffdfdfe7bf,  0xfffffffffffdfc5f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffff3fffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffcfff,  0xaf7fe96ffffffef,  0x5ef7f796aa96ea84,  0xffffbee0ffffbff,  0x0,  0xffff7fffffff07ff,  0xc000000ffff,  0x10000,  0x0,  0x7ffffffffff0007,  0x301ff,  0x0,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++
++}
++
++
++static if(size_t.sizeof == 4) {
++//1600 bytes
++enum nfcQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xc0], [ 0x100,  0x100,  0x1a00], [ 0x2020100,  0x3020202,  0x2020204,  0x2050202,  0x2020202,  0x6020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x2,  0x30000,  0x50004,  0x70006,  0x80000,  0xa0009,  0x0,  0x0,  0x0,  0x0,  0xb0000,  0x0,  0xc0000,  0xe000d,  0xf0000,  0x0,  0x0,  0x0,  0x10,  0x0,  0x0,  0x11,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x120000,  0x140013,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160015,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x120012,  0x18,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x81a9fdf,  0x10361f8,  0x3f,  0x40100000,  0x80,  0x0,  0x0,  0x0,  0x0,  0x0,  0x380000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0xff000000,  0x0,  0x0,  0x40000000,  0xb0800000,  0x0,  0x0,  0x480000,  0x4e000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x40000000,  0x30c00000,  0x0,  0x0,  0x40000000,  0x800000,  0x0,  0x0,  0x0,  0x400000,  0x0,  0x0,  0x0,  0x600004,  0x0,  0x0,  0x40000000,  0x800000,  0x0,  0x0,  0x0,  0x80008400,  0x0,  0x0,  0x0,  0x10842008,  0x1680200,  0x20080002,  0x2001084,  0x0,  0x0,  0x0,  0x4000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ffffe,  0x0,  0xffffff00,  0x7,  0x0,  0x0,  0x200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2aaa0000,  0x0,  0x48000000,  0x8080a00,  0x2a00c808,  0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc40,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6000000,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fe53fff,  0xfffffc65,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xa0000000,  0x5f7ffc00,  0x7fdb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4000000,  0x0,  0x0,  0x0,  0x80,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x1f,  0x0,  0xf8000000,  0x1,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1920 bytes
++enum nfdQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xe0], [ 0x100,  0x140,  0x2000], [ 0x2020100,  0x5040302,  0x2020206,  0x2070202,  0x2020202,  0x8020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x50006,  0x70005,  0x90008,  0xb000a,  0xc0005,  0x5000d,  0x50005,  0x50005,  0x50005,  0x50005,  0xe0005,  0x50005,  0x10000f,  0x120011,  0x140013,  0x50005,  0x50005,  0x50005,  0x50015,  0x50005,  0x50005,  0x50016,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x170017,  0x180017,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x170005,  0x1a0019,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x1c001b,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x1d0005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x170017,  0x5001e,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x50005,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3e7effbf,  0xbe7effbf,  0xfffcffff,  0x7ef1ff3f,  0xfff3f1f8,  0x7fffff3f,  0x0,  0x18003,  0xdfffe000,  0xff31ffcf,  0xcfffffff,  0xfffc0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b,  0x40100000,  0x1d7e0,  0x1fc00,  0x187c00,  0x0,  0x200708b,  0x2000000,  0x708b0000,  0xc00000,  0x0,  0x0,  0xfccf0006,  0x33ffcfc,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7c,  0x0,  0x0,  0x0,  0x0,  0x80005,  0x0,  0x0,  0x120200,  0xff000000,  0x0,  0x0,  0x0,  0xb0001800,  0x0,  0x0,  0x480000,  0x4e000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30001900,  0x0,  0x100000,  0x0,  0x1c00,  0x0,  0x0,  0x0,  0x100,  0x0,  0x0,  0x0,  0xd81,  0x0,  0x0,  0x0,  0x1c00,  0x0,  0x0,  0x0,  0x74000000,  0x0,  0x0,  0x0,  0x10842008,  0x1680200,  0x20080002,  0x2001084,  0x0,  0x0,  0x0,  0x40,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x45540,  0x28000000,  0xb,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xbffffff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x3f3fffff,  0xffffffff,  0xaaff3f3f,  0x3fffffff,  0xffffffff,  0x5fdfffff,  0xefcfffde,  0x3fdcffff,  0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc40,  0x0,  0x0,  0xc000000,  0x4000,  0xe000,  0x0,  0x1210,  0x50,  0x292,  0x333e005,  0x333,  0xf000,  0x0,  0x3c0f,  0x0,  0x600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x0,  0x55555000,  0x36db02a5,  0x40100000,  0x55555000,  0x36db02a5,  0x47900000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf,  0x0,  0x0,  0x7fe53fff,  0xfffffc65,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xa0000000,  0x5f7ffc00,  0x7fdb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x14000000,  0x800,  0x0,  0x0,  0x0,  0xc000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x1f,  0x0,  0xf8000000,  0x1,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2560 bytes
++enum nfkcQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xe0], [ 0x100,  0x140,  0x3400], [ 0x2020100,  0x4020302,  0x2020205,  0x7060202,  0x2020202,  0x8020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x40006,  0x70004,  0x90008,  0xb000a,  0xd000c,  0xf000e,  0x40004,  0x40004,  0x40004,  0x40004,  0x100004,  0x110004,  0x130012,  0x150014,  0x170016,  0x40018,  0x40004,  0x40004,  0x40019,  0x1b001a,  0x1d001c,  0x1f001e,  0x210020,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x220004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x210004,  0x240023,  0x250021,  0x270026,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x290028,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x2a0004,  0x40004,  0x2c002b,  0x2e002d,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x4002f,  0x300004,  0x40031,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x210021,  0x40032,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x40004,  0x0,  0x0,  0x0,  0x0,  0x0,  0x773c8501,  0x0,  0x0,  0x0,  0x800c0000,  0x201,  0x80000000,  0x0,  0x0,  0x1ff0,  0xe0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ff0000,  0x3f000000,  0x1f,  0x81a9fdf,  0x10361f8,  0x3f,  0x44100000,  0xb0,  0x0,  0x7f0000,  0x2370000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80,  0x0,  0x0,  0x0,  0x0,  0x0,  0x380000,  0x1e00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0xff000000,  0x0,  0x0,  0x40000000,  0xb0800000,  0x0,  0x0,  0x480000,  0x4e000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x40000000,  0x30c00000,  0x0,  0x0,  0x40000000,  0x800000,  0x0,  0x0,  0x0,  0x400000,  0x0,  0x0,  0x0,  0x600004,  0x0,  0x0,  0x40000000,  0x800000,  0x0,  0x0,  0x0,  0x80008400,  0x0,  0x0,  0x80000,  0x0,  0x0,  0x0,  0x80000,  0x30000000,  0x0,  0x1000,  0x0,  0x10842008,  0x3e80200,  0x20080002,  0x2001084,  0x0,  0x0,  0x0,  0x4000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x0,  0x3ffffe,  0x0,  0xffffff00,  0x7,  0x0,  0x0,  0x200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf7ff7000,  0xffffbfff,  0x10007ff,  0xf8000000,  0xffffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2aaa0000,  0x0,  0xe8000000,  0xe808ea03,  0x6a00e808,  0x8207ff,  0x50d88070,  0x80800380,  0xfff30000,  0x1fff7fff,  0x100,  0x0,  0x0,  0x3e6ffeef,  0xfbfbbd57,  0xffff03e1,  0xffffffff,  0x200,  0x0,  0x0,  0x0,  0x0,  0x1b000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7ff,  0x1000,  0x0,  0x0,  0x700000,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x0,  0x0,  0x30000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x80000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0x0,  0x1,  0x7400000,  0x0,  0x0,  0x9e000000,  0x0,  0x0,  0x80000000,  0x0,  0xfffe0000,  0xffffffff,  0xffffffff,  0xfffc7fff,  0x0,  0x0,  0x0,  0x7fffffff,  0xffffffff,  0xffff00ff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x3000000,  0x7fe53fff,  0xfffffc65,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xa0f8007f,  0x5f7fffff,  0xffffffdb,  0xffffffff,  0xffffffff,  0x3ffff,  0xfff80000,  0xffffffff,  0xffffffff,  0x3fffffff,  0xffff0000,  0xffffffff,  0xfffcffff,  0xffffffff,  0xff,  0x1fff0000,  0x3ff0000,  0xffff0000,  0xfff7ff9f,  0xffd70f7f,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fffffff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0x1cfcfcfc,  0x7f7f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4000000,  0x0,  0x0,  0x0,  0x80,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x1f,  0x0,  0xf8000000,  0x1,  0x0,  0xffffffff,  0xffffffff,  0xffdfffff,  0xffffffff,  0xdfffffff,  0xebffde64,  0xffffffef,  0xffffffff,  0xdfdfe7bf,  0x7bffffff,  0xfffdfc5f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffff3f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffcfff,  0xffffffff,  0xffffffef,  0xaf7fe96,  0xaa96ea84,  0x5ef7f796,  0xffffbff,  0xffffbee,  0x0,  0x0,  0xffff07ff,  0xffff7fff,  0xffff,  0xc00,  0x10000,  0x0,  0x0,  0x0,  0xffff0007,  0x7ffffff,  0x301ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2656 bytes
++enum nfkdQCTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xf0], [ 0x100,  0x160,  0x3500], [ 0x2020100,  0x5040302,  0x2020206,  0x8070202,  0x2020202,  0x9020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x80007,  0xa0009,  0xc000b,  0xe000d,  0x7000f,  0x70007,  0x70007,  0x70007,  0x70007,  0x100007,  0x110007,  0x130012,  0x150014,  0x170016,  0x70018,  0x70007,  0x70007,  0x70019,  0x1b001a,  0x1d001c,  0x1f001e,  0x210020,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x220007,  0x70007,  0x70007,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x210021,  0x230021,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x210007,  0x250024,  0x260021,  0x280027,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x2a0029,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x2b0007,  0x70007,  0x2d002c,  0x2f002e,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70030,  0x310007,  0x70032,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x210021,  0x70033,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x70007,  0x0,  0x0,  0x0,  0x0,  0x0,  0x773c8501,  0x3e7effbf,  0xbe7effbf,  0xfffcffff,  0xfefdff3f,  0xfff3f3f9,  0xffffff3f,  0x0,  0x18003,  0xdffffff0,  0xff3fffcf,  0xcfffffff,  0xfffc0,  0x0,  0x0,  0x0,  0x1ff0000,  0x3f000000,  0x1f,  0x0,  0x0,  0x1b,  0x44100000,  0x1d7f0,  0x1fc00,  0x7f7c00,  0x2370000,  0x200708b,  0x2000000,  0x708b0000,  0xc00000,  0x0,  0x0,  0xfccf0006,  0x33ffcfc,  0x0,  0x0,  0x0,  0x0,  0x80,  0x0,  0x0,  0x0,  0x0,  0x7c,  0x0,  0x1e00000,  0x0,  0x0,  0x80005,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x120200,  0xff000000,  0x0,  0x0,  0x0,  0xb0001800,  0x0,  0x0,  0x480000,  0x4e000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30001900,  0x0,  0x100000,  0x0,  0x1c00,  0x0,  0x0,  0x0,  0x100,  0x0,  0x0,  0x0,  0xd81,  0x0,  0x0,  0x0,  0x1c00,  0x0,  0x0,  0x0,  0x74000000,  0x0,  0x0,  0x80000,  0x0,  0x0,  0x0,  0x80000,  0x30000000,  0x0,  0x1000,  0x0,  0x10842008,  0x3e80200,  0x20080002,  0x2001084,  0x0,  0x0,  0x0,  0x40,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000000,  0x45540,  0x28000000,  0xb,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf7ff7000,  0xffffbfff,  0x10007ff,  0xf8000000,  0xffffffff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffffff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x3f3fffff,  0xffffffff,  0xaaff3f3f,  0x3fffffff,  0xffffffff,  0xffdfffff,  0xefcfffdf,  0x7fdcffff,  0x8207ff,  0x50d88070,  0x80800380,  0xfff30000,  0x1fff7fff,  0x100,  0x0,  0x0,  0x3e6ffeef,  0xfbfbbd57,  0xffff03e1,  0xffffffff,  0xc000200,  0x4000,  0xe000,  0x0,  0x1210,  0x1b050,  0x292,  0x333e005,  0x333,  0xf000,  0x0,  0x3c0f,  0x0,  0x600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7ff,  0x1000,  0x0,  0x0,  0x700000,  0x0,  0x0,  0x10000000,  0x0,  0x0,  0x0,  0x0,  0x30000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x80000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0x0,  0x1,  0x7400000,  0x55555000,  0x36db02a5,  0xd8100000,  0x55555000,  0x36db02a5,  0xc7900000,  0x0,  0xfffe0000,  0xffffffff,  0xffffffff,  0xfffc7fff,  0x0,  0x0,  0x0,  0x7fffffff,  0xffffffff,  0xffff00ff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x3000000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf,  0x0,  0x0,  0x7fe53fff,  0xfffffc65,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xa0f8007f,  0x5f7fffff,  0xffffffdb,  0xffffffff,  0xffffffff,  0x3ffff,  0xfff80000,  0xffffffff,  0xffffffff,  0x3fffffff,  0xffff0000,  0xffffffff,  0xfffcffff,  0xffffffff,  0xff,  0x1fff0000,  0x3ff0000,  0xffff0000,  0xfff7ff9f,  0xffd70f7f,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fffffff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0x1cfcfcfc,  0x7f7f,  0x0,  0x0,  0x0,  0x0,  0x14000000,  0x800,  0x0,  0x0,  0x0,  0xc000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x1f,  0x0,  0xf8000000,  0x1,  0x0,  0xffffffff,  0xffffffff,  0xffdfffff,  0xffffffff,  0xdfffffff,  0xebffde64,  0xffffffef,  0xffffffff,  0xdfdfe7bf,  0x7bffffff,  0xfffdfc5f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffff3f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffcfff,  0xffffffff,  0xffffffef,  0xaf7fe96,  0xaa96ea84,  0x5ef7f796,  0xffffbff,  0xffffbee,  0x0,  0x0,  0xffff07ff,  0xffff7fff,  0xffff,  0xc00,  0x10000,  0x0,  0x0,  0x0,  0xffff0007,  0x7ffffff,  0x301ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++
++}
++
+--- a/src/libphobos/src/std/internal/unicode_tables.d	1970-01-01 01:00:00.000000000 +0100
++++ b/src/libphobos/src/std/internal/unicode_tables.d	2014-04-01 16:32:51.000000000 +0100
+@@ -0,0 +1,2357 @@
++//Written in the D programming language
++/**
++ * License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
++ *
++ * Authors: Dmitry Olshansky
++ *
++ */
++//Automatically generated from Unicode Character Database files
++
++module std.internal.unicode_tables;
++@safe pure nothrow:
++
++
++struct SimpleCaseEntry
++{
++    uint ch;
++    ubyte n, bucket;// n - number in bucket
++    @property ubyte size() const
++    {
++        return bucket & 0x3F;
++    }
++    @property auto isLower() const
++    {
++        return bucket & 0x40;
++    }
++    @property auto isUpper() const
++    {
++        return bucket & 0x80;
++    }
++}
++
++struct FullCaseEntry
++{
++    dchar[3] seq;
++    ubyte n, size;// n number in batch, size - size of batch
++    ubyte entry_len;
++
++    @property auto value() const @trusted
++    {
++        return seq[0..entry_len];
++    }
++}
++
++struct CompEntry
++{
++    dchar rhs, composed;
++}
++
++struct UnicodeProperty
++{
++    string name;
++    ubyte[] compressed;
++}
++
++struct TrieEntry(T...)
++{
++    size_t[] offsets;
++    size_t[] sizes;
++    size_t[] data;
++}
++
++@property immutable(SimpleCaseEntry[]) simpleCaseTable()
++{
++alias SCE = SimpleCaseEntry;
++static immutable SCE[] t = [
++SCE(0x2c00, 0, 0x82),
++SCE(0x2c30, 1, 0x42),SCE(0x24c3, 0, 0x82),SCE(0x24dd, 1, 0x42),SCE(0x2c01, 0, 0x82),
++SCE(0x2c31, 1, 0x42),SCE(0x2c1d, 0, 0x82),SCE(0x2c4d, 1, 0x42),SCE(0x2c02, 0, 0x82),
++SCE(0x2c32, 1, 0x42),SCE(0x2c03, 0, 0x82),SCE(0x2c33, 1, 0x42),SCE(0x2c04, 0, 0x82),
++SCE(0x2c34, 1, 0x42),SCE(0x2c05, 0, 0x82),SCE(0x2c35, 1, 0x42),SCE(0x2c06, 0, 0x82),
++SCE(0x2c36, 1, 0x42),SCE(0x10400, 0, 0x82),SCE(0x10428, 1, 0x42),SCE(0x2cc2, 0, 0x82),
++SCE(0x2cc3, 1, 0x42),SCE(0x2c07, 0, 0x82),SCE(0x2c37, 1, 0x42),SCE(0x2c08, 0, 0x82),
++SCE(0x2c38, 1, 0x42),SCE(0x2c09, 0, 0x82),SCE(0x2c39, 1, 0x42),SCE(0x2c0a, 0, 0x82),
++SCE(0x2c3a, 1, 0x42),SCE(0xa68c, 0, 0x82),SCE(0xa68d, 1, 0x42),SCE(0x0041, 0, 0x82),
++SCE(0x0061, 1, 0x42),SCE(0x0042, 0, 0x82),SCE(0x0062, 1, 0x42),SCE(0x0043, 0, 0x82),
++SCE(0x0063, 1, 0x42),SCE(0x0044, 0, 0x82),SCE(0x0064, 1, 0x42),SCE(0x0045, 0, 0x82),
++SCE(0x0065, 1, 0x42),SCE(0x0046, 0, 0x82),SCE(0x0066, 1, 0x42),SCE(0x0047, 0, 0x82),
++SCE(0x0067, 1, 0x42),SCE(0x0048, 0, 0x82),SCE(0x0068, 1, 0x42),SCE(0x0049, 0, 0x82),
++SCE(0x0069, 1, 0x42),SCE(0x004a, 0, 0x82),SCE(0x006a, 1, 0x42),SCE(0x004b, 0, 0x83),
++SCE(0x006b, 1, 0x43),SCE(0x212a, 2, 0x83),SCE(0x004c, 0, 0x82),SCE(0x006c, 1, 0x42),
++SCE(0x004d, 0, 0x82),SCE(0x006d, 1, 0x42),SCE(0x004e, 0, 0x82),SCE(0x006e, 1, 0x42),
++SCE(0x004f, 0, 0x82),SCE(0x006f, 1, 0x42),SCE(0x0050, 0, 0x82),SCE(0x0070, 1, 0x42),
++SCE(0x0051, 0, 0x82),SCE(0x0071, 1, 0x42),SCE(0x0052, 0, 0x82),SCE(0x0072, 1, 0x42),
++SCE(0x0053, 0, 0x83),SCE(0x0073, 1, 0x43),SCE(0x017f, 2, 0x43),SCE(0x0054, 0, 0x82),
++SCE(0x0074, 1, 0x42),SCE(0x0055, 0, 0x82),SCE(0x0075, 1, 0x42),SCE(0x0056, 0, 0x82),
++SCE(0x0076, 1, 0x42),SCE(0x0057, 0, 0x82),SCE(0x0077, 1, 0x42),SCE(0x0058, 0, 0x82),
++SCE(0x0078, 1, 0x42),SCE(0x0059, 0, 0x82),SCE(0x0079, 1, 0x42),SCE(0x005a, 0, 0x82),
++SCE(0x007a, 1, 0x42),SCE(0x2c0f, 0, 0x82),SCE(0x2c3f, 1, 0x42),SCE(0x2c10, 0, 0x82),
++SCE(0x2c40, 1, 0x42),SCE(0x10402, 0, 0x82),SCE(0x1042a, 1, 0x42),SCE(0x2cc4, 0, 0x82),
++SCE(0x2cc5, 1, 0x42),SCE(0x2166, 0, 0x82),SCE(0x2176, 1, 0x42),SCE(0x2c11, 0, 0x82),
++SCE(0x2c41, 1, 0x42),SCE(0x2c12, 0, 0x82),SCE(0x2c42, 1, 0x42),SCE(0x2168, 0, 0x82),
++SCE(0x2178, 1, 0x42),SCE(0x2c13, 0, 0x82),SCE(0x2c43, 1, 0x42),SCE(0xa682, 0, 0x82),
++SCE(0xa683, 1, 0x42),SCE(0x2c14, 0, 0x82),SCE(0x2c44, 1, 0x42),SCE(0x216a, 0, 0x82),
++SCE(0x217a, 1, 0x42),SCE(0x24c7, 0, 0x82),SCE(0x24e1, 1, 0x42),SCE(0x2c15, 0, 0x82),
++SCE(0x2c45, 1, 0x42),SCE(0x10403, 0, 0x82),SCE(0x1042b, 1, 0x42),SCE(0x2c16, 0, 0x82),
++SCE(0x2c46, 1, 0x42),SCE(0x216c, 0, 0x82),SCE(0x217c, 1, 0x42),SCE(0x2c17, 0, 0x82),
++SCE(0x2c47, 1, 0x42),SCE(0xff38, 0, 0x82),SCE(0xff58, 1, 0x42),SCE(0x2c18, 0, 0x82),
++SCE(0x2c48, 1, 0x42),SCE(0x216e, 0, 0x82),SCE(0x217e, 1, 0x42),SCE(0x2c19, 0, 0x82),
++SCE(0x2c49, 1, 0x42),SCE(0x2c1a, 0, 0x82),SCE(0x2c4a, 1, 0x42),SCE(0x2c1e, 0, 0x82),
++SCE(0x2c4e, 1, 0x42),SCE(0x10a0, 0, 0x82),SCE(0x2d00, 1, 0x42),SCE(0x10a1, 0, 0x82),
++SCE(0x2d01, 1, 0x42),SCE(0x10a2, 0, 0x82),SCE(0x2d02, 1, 0x42),SCE(0x10a3, 0, 0x82),
++SCE(0x2d03, 1, 0x42),SCE(0x10a4, 0, 0x82),SCE(0x2d04, 1, 0x42),SCE(0x10a5, 0, 0x82),
++SCE(0x2d05, 1, 0x42),SCE(0x10a6, 0, 0x82),SCE(0x2d06, 1, 0x42),SCE(0x10a7, 0, 0x82),
++SCE(0x2d07, 1, 0x42),SCE(0x10a8, 0, 0x82),SCE(0x2d08, 1, 0x42),SCE(0x10a9, 0, 0x82),
++SCE(0x2d09, 1, 0x42),SCE(0x10aa, 0, 0x82),SCE(0x2d0a, 1, 0x42),SCE(0x10ab, 0, 0x82),
++SCE(0x2d0b, 1, 0x42),SCE(0x10ac, 0, 0x82),SCE(0x2d0c, 1, 0x42),SCE(0x10ad, 0, 0x82),
++SCE(0x2d0d, 1, 0x42),SCE(0x10ae, 0, 0x82),SCE(0x2d0e, 1, 0x42),SCE(0x10af, 0, 0x82),
++SCE(0x2d0f, 1, 0x42),SCE(0x10b0, 0, 0x82),SCE(0x2d10, 1, 0x42),SCE(0x10b1, 0, 0x82),
++SCE(0x2d11, 1, 0x42),SCE(0x10b2, 0, 0x82),SCE(0x2d12, 1, 0x42),SCE(0x10b3, 0, 0x82),
++SCE(0x2d13, 1, 0x42),SCE(0x10b4, 0, 0x82),SCE(0x2d14, 1, 0x42),SCE(0x10b5, 0, 0x82),
++SCE(0x2d15, 1, 0x42),SCE(0x10b6, 0, 0x82),SCE(0x2d16, 1, 0x42),SCE(0x10b7, 0, 0x82),
++SCE(0x2d17, 1, 0x42),SCE(0x10b8, 0, 0x82),SCE(0x2d18, 1, 0x42),SCE(0x10b9, 0, 0x82),
++SCE(0x2d19, 1, 0x42),SCE(0x10ba, 0, 0x82),SCE(0x2d1a, 1, 0x42),SCE(0x10bb, 0, 0x82),
++SCE(0x2d1b, 1, 0x42),SCE(0x10bc, 0, 0x82),SCE(0x2d1c, 1, 0x42),SCE(0x10bd, 0, 0x82),
++SCE(0x2d1d, 1, 0x42),SCE(0x10be, 0, 0x82),SCE(0x2d1e, 1, 0x42),SCE(0x10bf, 0, 0x82),
++SCE(0x2d1f, 1, 0x42),SCE(0x00c0, 0, 0x82),SCE(0x00e0, 1, 0x42),SCE(0x00c1, 0, 0x82),
++SCE(0x00e1, 1, 0x42),SCE(0x10c2, 0, 0x82),SCE(0x2d22, 1, 0x42),SCE(0x00c3, 0, 0x82),
++SCE(0x00e3, 1, 0x42),SCE(0x10c4, 0, 0x82),SCE(0x2d24, 1, 0x42),SCE(0x00c5, 0, 0x83),
++SCE(0x00e5, 1, 0x43),SCE(0x212b, 2, 0x83),SCE(0x00c6, 0, 0x82),SCE(0x00e6, 1, 0x42),
++SCE(0x00c7, 0, 0x82),SCE(0x00e7, 1, 0x42),SCE(0x00c8, 0, 0x82),SCE(0x00e8, 1, 0x42),
++SCE(0x00c9, 0, 0x82),SCE(0x00e9, 1, 0x42),SCE(0x00ca, 0, 0x82),SCE(0x00ea, 1, 0x42),
++SCE(0x00cb, 0, 0x82),SCE(0x00eb, 1, 0x42),SCE(0x00cc, 0, 0x82),SCE(0x00ec, 1, 0x42),
++SCE(0x00cd, 0, 0x82),SCE(0x00ed, 1, 0x42),SCE(0x00ce, 0, 0x82),SCE(0x00ee, 1, 0x42),
++SCE(0x00cf, 0, 0x82),SCE(0x00ef, 1, 0x42),SCE(0x00d0, 0, 0x82),SCE(0x00f0, 1, 0x42),
++SCE(0x00d1, 0, 0x82),SCE(0x00f1, 1, 0x42),SCE(0x00d2, 0, 0x82),SCE(0x00f2, 1, 0x42),
++SCE(0x00d3, 0, 0x82),SCE(0x00f3, 1, 0x42),SCE(0x00d4, 0, 0x82),SCE(0x00f4, 1, 0x42),
++SCE(0x00d5, 0, 0x82),SCE(0x00f5, 1, 0x42),SCE(0x00d6, 0, 0x82),SCE(0x00f6, 1, 0x42),
++SCE(0x00d8, 0, 0x82),SCE(0x00f8, 1, 0x42),SCE(0x00d9, 0, 0x82),SCE(0x00f9, 1, 0x42),
++SCE(0x00da, 0, 0x82),SCE(0x00fa, 1, 0x42),SCE(0x00db, 0, 0x82),SCE(0x00fb, 1, 0x42),
++SCE(0x00dc, 0, 0x82),SCE(0x00fc, 1, 0x42),SCE(0x00dd, 0, 0x82),SCE(0x00fd, 1, 0x42),
++SCE(0x00de, 0, 0x82),SCE(0x00fe, 1, 0x42),SCE(0x2c25, 0, 0x82),SCE(0x2c55, 1, 0x42),
++SCE(0x2c26, 0, 0x82),SCE(0x2c56, 1, 0x42),SCE(0x2c27, 0, 0x82),SCE(0x2c57, 1, 0x42),
++SCE(0x2c28, 0, 0x82),SCE(0x2c58, 1, 0x42),SCE(0x1040f, 0, 0x82),SCE(0x10437, 1, 0x42),
++SCE(0x24cb, 0, 0x82),SCE(0x24e5, 1, 0x42),SCE(0x2c29, 0, 0x82),SCE(0x2c59, 1, 0x42),
++SCE(0x10407, 0, 0x82),SCE(0x1042f, 1, 0x42),SCE(0x2c2a, 0, 0x82),SCE(0x2c5a, 1, 0x42),
++SCE(0x0100, 0, 0x82),SCE(0x0101, 1, 0x42),SCE(0x0102, 0, 0x82),SCE(0x0103, 1, 0x42),
++SCE(0x2c2b, 0, 0x82),SCE(0x2c5b, 1, 0x42),SCE(0x0104, 0, 0x82),SCE(0x0105, 1, 0x42),
++SCE(0x0106, 0, 0x82),SCE(0x0107, 1, 0x42),SCE(0x0108, 0, 0x82),SCE(0x0109, 1, 0x42),
++SCE(0x2c2c, 0, 0x82),SCE(0x2c5c, 1, 0x42),SCE(0x010a, 0, 0x82),SCE(0x010b, 1, 0x42),
++SCE(0x010c, 0, 0x82),SCE(0x010d, 1, 0x42),SCE(0x010e, 0, 0x82),SCE(0x010f, 1, 0x42),
++SCE(0x2c2d, 0, 0x82),SCE(0x2c5d, 1, 0x42),SCE(0x0110, 0, 0x82),SCE(0x0111, 1, 0x42),
++SCE(0x0112, 0, 0x82),SCE(0x0113, 1, 0x42),SCE(0x0114, 0, 0x82),SCE(0x0115, 1, 0x42),
++SCE(0x2c2e, 0, 0x82),SCE(0x2c5e, 1, 0x42),SCE(0x0116, 0, 0x82),SCE(0x0117, 1, 0x42),
++SCE(0x0118, 0, 0x82),SCE(0x0119, 1, 0x42),SCE(0x011a, 0, 0x82),SCE(0x011b, 1, 0x42),
++SCE(0x011c, 0, 0x82),SCE(0x011d, 1, 0x42),SCE(0x011e, 0, 0x82),SCE(0x011f, 1, 0x42),
++SCE(0x0120, 0, 0x82),SCE(0x0121, 1, 0x42),SCE(0x0122, 0, 0x82),SCE(0x0123, 1, 0x42),
++SCE(0x0124, 0, 0x82),SCE(0x0125, 1, 0x42),SCE(0x0126, 0, 0x82),SCE(0x0127, 1, 0x42),
++SCE(0x0128, 0, 0x82),SCE(0x0129, 1, 0x42),SCE(0x012a, 0, 0x82),SCE(0x012b, 1, 0x42),
++SCE(0x00c5, 0, 0x83),SCE(0x00e5, 1, 0x43),SCE(0x212b, 2, 0x83),SCE(0x012c, 0, 0x82),
++SCE(0x012d, 1, 0x42),SCE(0x012e, 0, 0x82),SCE(0x012f, 1, 0x42),SCE(0x0132, 0, 0x82),
++SCE(0x0133, 1, 0x42),SCE(0x0134, 0, 0x82),SCE(0x0135, 1, 0x42),SCE(0x0136, 0, 0x82),
++SCE(0x0137, 1, 0x42),SCE(0x0139, 0, 0x82),SCE(0x013a, 1, 0x42),SCE(0x013b, 0, 0x82),
++SCE(0x013c, 1, 0x42),SCE(0x2cde, 0, 0x82),SCE(0x2cdf, 1, 0x42),SCE(0x013d, 0, 0x82),
++SCE(0x013e, 1, 0x42),SCE(0x013f, 0, 0x82),SCE(0x0140, 1, 0x42),SCE(0x0141, 0, 0x82),
++SCE(0x0142, 1, 0x42),SCE(0x0143, 0, 0x82),SCE(0x0144, 1, 0x42),SCE(0x0145, 0, 0x82),
++SCE(0x0146, 1, 0x42),SCE(0x0147, 0, 0x82),SCE(0x0148, 1, 0x42),SCE(0x014a, 0, 0x82),
++SCE(0x014b, 1, 0x42),SCE(0x014c, 0, 0x82),SCE(0x014d, 1, 0x42),SCE(0x014e, 0, 0x82),
++SCE(0x014f, 1, 0x42),SCE(0x0150, 0, 0x82),SCE(0x0151, 1, 0x42),SCE(0x0152, 0, 0x82),
++SCE(0x0153, 1, 0x42),SCE(0x0154, 0, 0x82),SCE(0x0155, 1, 0x42),SCE(0x0156, 0, 0x82),
++SCE(0x0157, 1, 0x42),SCE(0x0158, 0, 0x82),SCE(0x0159, 1, 0x42),SCE(0x015a, 0, 0x82),
++SCE(0x015b, 1, 0x42),SCE(0x015c, 0, 0x82),SCE(0x015d, 1, 0x42),SCE(0x015e, 0, 0x82),
++SCE(0x015f, 1, 0x42),SCE(0x0160, 0, 0x82),SCE(0x0161, 1, 0x42),SCE(0x2161, 0, 0x82),
++SCE(0x2171, 1, 0x42),SCE(0x0162, 0, 0x82),SCE(0x0163, 1, 0x42),SCE(0x2163, 0, 0x82),
++SCE(0x2173, 1, 0x42),SCE(0x0164, 0, 0x82),SCE(0x0165, 1, 0x42),SCE(0x2165, 0, 0x82),
++SCE(0x2175, 1, 0x42),SCE(0x0166, 0, 0x82),SCE(0x0167, 1, 0x42),SCE(0x2167, 0, 0x82),
++SCE(0x2177, 1, 0x42),SCE(0x0168, 0, 0x82),SCE(0x0169, 1, 0x42),SCE(0x2169, 0, 0x82),
++SCE(0x2179, 1, 0x42),SCE(0x016a, 0, 0x82),SCE(0x016b, 1, 0x42),SCE(0x216b, 0, 0x82),
++SCE(0x217b, 1, 0x42),SCE(0x016c, 0, 0x82),SCE(0x016d, 1, 0x42),SCE(0x216d, 0, 0x82),
++SCE(0x217d, 1, 0x42),SCE(0x016e, 0, 0x82),SCE(0x016f, 1, 0x42),SCE(0x216f, 0, 0x82),
++SCE(0x217f, 1, 0x42),SCE(0x0170, 0, 0x82),SCE(0x0171, 1, 0x42),SCE(0x2ccc, 0, 0x82),
++SCE(0x2ccd, 1, 0x42),SCE(0x0172, 0, 0x82),SCE(0x0173, 1, 0x42),SCE(0x0174, 0, 0x82),
++SCE(0x0175, 1, 0x42),SCE(0x0176, 0, 0x82),SCE(0x0177, 1, 0x42),SCE(0x00ff, 0, 0x42),
++SCE(0x0178, 1, 0x82),SCE(0x0179, 0, 0x82),SCE(0x017a, 1, 0x42),SCE(0x017b, 0, 0x82),
++SCE(0x017c, 1, 0x42),SCE(0x017d, 0, 0x82),SCE(0x017e, 1, 0x42),SCE(0x0053, 0, 0x83),
++SCE(0x0073, 1, 0x43),SCE(0x017f, 2, 0x43),SCE(0x0181, 0, 0x82),SCE(0x0253, 1, 0x42),
++SCE(0x0182, 0, 0x82),SCE(0x0183, 1, 0x42),SCE(0x2183, 0, 0x82),SCE(0x2184, 1, 0x42),
++SCE(0x0184, 0, 0x82),SCE(0x0185, 1, 0x42),SCE(0x0186, 0, 0x82),SCE(0x0254, 1, 0x42),
++SCE(0x0187, 0, 0x82),SCE(0x0188, 1, 0x42),SCE(0x0189, 0, 0x82),SCE(0x0256, 1, 0x42),
++SCE(0x018a, 0, 0x82),SCE(0x0257, 1, 0x42),SCE(0x018b, 0, 0x82),SCE(0x018c, 1, 0x42),
++SCE(0x018e, 0, 0x82),SCE(0x01dd, 1, 0x42),SCE(0x018f, 0, 0x82),SCE(0x0259, 1, 0x42),
++SCE(0x0190, 0, 0x82),SCE(0x025b, 1, 0x42),SCE(0x0191, 0, 0x82),SCE(0x0192, 1, 0x42),
++SCE(0x0193, 0, 0x82),SCE(0x0260, 1, 0x42),SCE(0x0194, 0, 0x82),SCE(0x0263, 1, 0x42),
++SCE(0x0196, 0, 0x82),SCE(0x0269, 1, 0x42),SCE(0x0197, 0, 0x82),SCE(0x0268, 1, 0x42),
++SCE(0x0198, 0, 0x82),SCE(0x0199, 1, 0x42),SCE(0x019c, 0, 0x82),SCE(0x026f, 1, 0x42),
++SCE(0x019d, 0, 0x82),SCE(0x0272, 1, 0x42),SCE(0x019f, 0, 0x82),SCE(0x0275, 1, 0x42),
++SCE(0x01a0, 0, 0x82),SCE(0x01a1, 1, 0x42),SCE(0x01a2, 0, 0x82),SCE(0x01a3, 1, 0x42),
++SCE(0x01a4, 0, 0x82),SCE(0x01a5, 1, 0x42),SCE(0x01a6, 0, 0x82),SCE(0x0280, 1, 0x42),
++SCE(0x01a7, 0, 0x82),SCE(0x01a8, 1, 0x42),SCE(0x01a9, 0, 0x82),SCE(0x0283, 1, 0x42),
++SCE(0x01ac, 0, 0x82),SCE(0x01ad, 1, 0x42),SCE(0x01ae, 0, 0x82),SCE(0x0288, 1, 0x42),
++SCE(0x01af, 0, 0x82),SCE(0x01b0, 1, 0x42),SCE(0x01b1, 0, 0x82),SCE(0x028a, 1, 0x42),
++SCE(0x01b2, 0, 0x82),SCE(0x028b, 1, 0x42),SCE(0x01b3, 0, 0x82),SCE(0x01b4, 1, 0x42),
++SCE(0x01b5, 0, 0x82),SCE(0x01b6, 1, 0x42),SCE(0x01b7, 0, 0x82),SCE(0x0292, 1, 0x42),
++SCE(0x01b8, 0, 0x82),SCE(0x01b9, 1, 0x42),SCE(0x01bc, 0, 0x82),SCE(0x01bd, 1, 0x42),
++SCE(0x01c4, 0, 0x83),SCE(0x01c5, 1, 0x3),SCE(0x01c6, 2, 0x43),SCE(0x01c4, 0, 0x83),
++SCE(0x01c5, 1, 0x3),SCE(0x01c6, 2, 0x43),SCE(0x01c7, 0, 0x83),SCE(0x01c8, 1, 0x3),
++SCE(0x01c9, 2, 0x43),SCE(0x01c7, 0, 0x83),SCE(0x01c8, 1, 0x3),SCE(0x01c9, 2, 0x43),
++SCE(0x01ca, 0, 0x83),SCE(0x01cb, 1, 0x3),SCE(0x01cc, 2, 0x43),SCE(0x01ca, 0, 0x83),
++SCE(0x01cb, 1, 0x3),SCE(0x01cc, 2, 0x43),SCE(0x01cd, 0, 0x82),SCE(0x01ce, 1, 0x42),
++SCE(0x01cf, 0, 0x82),SCE(0x01d0, 1, 0x42),SCE(0x01d1, 0, 0x82),SCE(0x01d2, 1, 0x42),
++SCE(0x01d3, 0, 0x82),SCE(0x01d4, 1, 0x42),SCE(0x01d5, 0, 0x82),SCE(0x01d6, 1, 0x42),
++SCE(0x01d7, 0, 0x82),SCE(0x01d8, 1, 0x42),SCE(0x01d9, 0, 0x82),SCE(0x01da, 1, 0x42),
++SCE(0x01db, 0, 0x82),SCE(0x01dc, 1, 0x42),SCE(0x01de, 0, 0x82),SCE(0x01df, 1, 0x42),
++SCE(0xff36, 0, 0x82),SCE(0xff56, 1, 0x42),SCE(0x01e0, 0, 0x82),SCE(0x01e1, 1, 0x42),
++SCE(0x01e2, 0, 0x82),SCE(0x01e3, 1, 0x42),SCE(0x01e4, 0, 0x82),SCE(0x01e5, 1, 0x42),
++SCE(0x01e6, 0, 0x82),SCE(0x01e7, 1, 0x42),SCE(0x01e8, 0, 0x82),SCE(0x01e9, 1, 0x42),
++SCE(0x01ea, 0, 0x82),SCE(0x01eb, 1, 0x42),SCE(0x01ec, 0, 0x82),SCE(0x01ed, 1, 0x42),
++SCE(0x01ee, 0, 0x82),SCE(0x01ef, 1, 0x42),SCE(0x01f1, 0, 0x83),SCE(0x01f2, 1, 0x3),
++SCE(0x01f3, 2, 0x43),SCE(0x01f1, 0, 0x83),SCE(0x01f2, 1, 0x3),SCE(0x01f3, 2, 0x43),
++SCE(0x01f4, 0, 0x82),SCE(0x01f5, 1, 0x42),SCE(0x0195, 0, 0x42),SCE(0x01f6, 1, 0x82),
++SCE(0x01bf, 0, 0x42),SCE(0x01f7, 1, 0x82),SCE(0x01f8, 0, 0x82),SCE(0x01f9, 1, 0x42),
++SCE(0x1041d, 0, 0x82),SCE(0x10445, 1, 0x42),SCE(0x01fa, 0, 0x82),SCE(0x01fb, 1, 0x42),
++SCE(0x01fc, 0, 0x82),SCE(0x01fd, 1, 0x42),SCE(0x01fe, 0, 0x82),SCE(0x01ff, 1, 0x42),
++SCE(0x0200, 0, 0x82),SCE(0x0201, 1, 0x42),SCE(0x0202, 0, 0x82),SCE(0x0203, 1, 0x42),
++SCE(0x0204, 0, 0x82),SCE(0x0205, 1, 0x42),SCE(0x0206, 0, 0x82),SCE(0x0207, 1, 0x42),
++SCE(0x0208, 0, 0x82),SCE(0x0209, 1, 0x42),SCE(0x020a, 0, 0x82),SCE(0x020b, 1, 0x42),
++SCE(0x020c, 0, 0x82),SCE(0x020d, 1, 0x42),SCE(0x020e, 0, 0x82),SCE(0x020f, 1, 0x42),
++SCE(0x0210, 0, 0x82),SCE(0x0211, 1, 0x42),SCE(0x0212, 0, 0x82),SCE(0x0213, 1, 0x42),
++SCE(0x0214, 0, 0x82),SCE(0x0215, 1, 0x42),SCE(0x0216, 0, 0x82),SCE(0x0217, 1, 0x42),
++SCE(0x0218, 0, 0x82),SCE(0x0219, 1, 0x42),SCE(0x021a, 0, 0x82),SCE(0x021b, 1, 0x42),
++SCE(0x021c, 0, 0x82),SCE(0x021d, 1, 0x42),SCE(0x021e, 0, 0x82),SCE(0x021f, 1, 0x42),
++SCE(0x019e, 0, 0x42),SCE(0x0220, 1, 0x82),SCE(0x0222, 0, 0x82),SCE(0x0223, 1, 0x42),
++SCE(0x0224, 0, 0x82),SCE(0x0225, 1, 0x42),SCE(0x0226, 0, 0x82),SCE(0x0227, 1, 0x42),
++SCE(0x0228, 0, 0x82),SCE(0x0229, 1, 0x42),SCE(0x022a, 0, 0x82),SCE(0x022b, 1, 0x42),
++SCE(0x022c, 0, 0x82),SCE(0x022d, 1, 0x42),SCE(0x022e, 0, 0x82),SCE(0x022f, 1, 0x42),
++SCE(0x0230, 0, 0x82),SCE(0x0231, 1, 0x42),SCE(0x0232, 0, 0x82),SCE(0x0233, 1, 0x42),
++SCE(0xa684, 0, 0x82),SCE(0xa685, 1, 0x42),SCE(0x023a, 0, 0x82),SCE(0x2c65, 1, 0x42),
++SCE(0x023b, 0, 0x82),SCE(0x023c, 1, 0x42),SCE(0x019a, 0, 0x42),SCE(0x023d, 1, 0x82),
++SCE(0x023e, 0, 0x82),SCE(0x2c66, 1, 0x42),SCE(0x0241, 0, 0x82),SCE(0x0242, 1, 0x42),
++SCE(0x10412, 0, 0x82),SCE(0x1043a, 1, 0x42),SCE(0x0180, 0, 0x42),SCE(0x0243, 1, 0x82),
++SCE(0x0244, 0, 0x82),SCE(0x0289, 1, 0x42),SCE(0x0245, 0, 0x82),SCE(0x028c, 1, 0x42),
++SCE(0x0246, 0, 0x82),SCE(0x0247, 1, 0x42),SCE(0x0248, 0, 0x82),SCE(0x0249, 1, 0x42),
++SCE(0x024a, 0, 0x82),SCE(0x024b, 1, 0x42),SCE(0x024c, 0, 0x82),SCE(0x024d, 1, 0x42),
++SCE(0x2c1b, 0, 0x82),SCE(0x2c4b, 1, 0x42),SCE(0x024e, 0, 0x82),SCE(0x024f, 1, 0x42),
++SCE(0x1040a, 0, 0x82),SCE(0x10432, 1, 0x42),SCE(0x2160, 0, 0x82),SCE(0x2170, 1, 0x42),
++SCE(0xa692, 0, 0x82),SCE(0xa693, 1, 0x42),SCE(0x027d, 0, 0x42),SCE(0x2c64, 1, 0x82),
++SCE(0x10410, 0, 0x82),SCE(0x10438, 1, 0x42),SCE(0x2c21, 0, 0x82),SCE(0x2c51, 1, 0x42),
++SCE(0x2c69, 0, 0x82),SCE(0x2c6a, 1, 0x42),SCE(0x10409, 0, 0x82),SCE(0x10431, 1, 0x42),
++SCE(0x10414, 0, 0x82),SCE(0x1043c, 1, 0x42),SCE(0x2162, 0, 0x82),SCE(0x2172, 1, 0x42),
++SCE(0x1041e, 0, 0x82),SCE(0x10446, 1, 0x42),SCE(0x0271, 0, 0x42),SCE(0x2c6e, 1, 0x82),
++SCE(0x10415, 0, 0x82),SCE(0x1043d, 1, 0x42),SCE(0x0252, 0, 0x42),SCE(0x2c70, 1, 0x82),
++SCE(0x2c72, 0, 0x82),SCE(0x2c73, 1, 0x42),SCE(0x2c0b, 0, 0x82),SCE(0x2c3b, 1, 0x42),
++SCE(0x10416, 0, 0x82),SCE(0x1043e, 1, 0x42),SCE(0x2c75, 0, 0x82),SCE(0x2c76, 1, 0x42),
++SCE(0x2164, 0, 0x82),SCE(0x2174, 1, 0x42),SCE(0xa640, 0, 0x82),SCE(0xa641, 1, 0x42),
++SCE(0xff22, 0, 0x82),SCE(0xff42, 1, 0x42),SCE(0x2c0c, 0, 0x82),SCE(0x2c3c, 1, 0x42),
++SCE(0x10417, 0, 0x82),SCE(0x1043f, 1, 0x42),SCE(0xff24, 0, 0x82),SCE(0xff44, 1, 0x42),
++SCE(0xff25, 0, 0x82),SCE(0xff45, 1, 0x42),SCE(0xff26, 0, 0x82),SCE(0xff46, 1, 0x42),
++SCE(0x2c0d, 0, 0x82),SCE(0x2c3d, 1, 0x42),SCE(0x24c1, 0, 0x82),SCE(0x24db, 1, 0x42),
++SCE(0xa728, 0, 0x82),SCE(0xa729, 1, 0x42),SCE(0x023f, 0, 0x42),SCE(0x2c7e, 1, 0x82),
++SCE(0x10411, 0, 0x82),SCE(0x10439, 1, 0x42),SCE(0xff29, 0, 0x82),SCE(0xff49, 1, 0x42),
++SCE(0x1040b, 0, 0x82),SCE(0x10433, 1, 0x42),SCE(0xa72a, 0, 0x82),SCE(0xa72b, 1, 0x42),
++SCE(0x2c80, 0, 0x82),SCE(0x2c81, 1, 0x42),SCE(0xff2b, 0, 0x82),SCE(0xff4b, 1, 0x42),
++SCE(0xa72c, 0, 0x82),SCE(0xa72d, 1, 0x42),SCE(0x2c0e, 0, 0x82),SCE(0x2c3e, 1, 0x42),
++SCE(0xff2d, 0, 0x82),SCE(0xff4d, 1, 0x42),SCE(0x10419, 0, 0x82),SCE(0x10441, 1, 0x42),
++SCE(0xa72e, 0, 0x82),SCE(0xa72f, 1, 0x42),SCE(0x1040d, 0, 0x82),SCE(0x10435, 1, 0x42),
++SCE(0xff2f, 0, 0x82),SCE(0xff4f, 1, 0x42),SCE(0xff31, 0, 0x82),SCE(0xff51, 1, 0x42),
++SCE(0xff32, 0, 0x82),SCE(0xff52, 1, 0x42),SCE(0x1041a, 0, 0x82),SCE(0x10442, 1, 0x42),
++SCE(0xff34, 0, 0x82),SCE(0xff54, 1, 0x42),SCE(0x2c98, 0, 0x82),SCE(0x2c99, 1, 0x42),
++SCE(0x2c8a, 0, 0x82),SCE(0x2c8b, 1, 0x42),SCE(0x0345, 0, 0x44),SCE(0x0399, 1, 0x84),
++SCE(0x03b9, 2, 0x44),SCE(0x1fbe, 3, 0x44),SCE(0x2c8c, 0, 0x82),SCE(0x2c8d, 1, 0x42),
++SCE(0xff37, 0, 0x82),SCE(0xff57, 1, 0x42),SCE(0xa656, 0, 0x82),SCE(0xa657, 1, 0x42),
++SCE(0x1041b, 0, 0x82),SCE(0x10443, 1, 0x42),SCE(0xa738, 0, 0x82),SCE(0xa739, 1, 0x42),
++SCE(0x2c8e, 0, 0x82),SCE(0x2c8f, 1, 0x42),SCE(0xff39, 0, 0x82),SCE(0xff59, 1, 0x42),
++SCE(0x10404, 0, 0x82),SCE(0x1042c, 1, 0x42),SCE(0xa73a, 0, 0x82),SCE(0xa73b, 1, 0x42),
++SCE(0x2c90, 0, 0x82),SCE(0x2c91, 1, 0x42),SCE(0xa73c, 0, 0x82),SCE(0xa73d, 1, 0x42),
++SCE(0x2c92, 0, 0x82),SCE(0x2c93, 1, 0x42),SCE(0x1041c, 0, 0x82),SCE(0x10444, 1, 0x42),
++SCE(0x0370, 0, 0x82),SCE(0x0371, 1, 0x42),SCE(0x0372, 0, 0x82),SCE(0x0373, 1, 0x42),
++SCE(0xa73e, 0, 0x82),SCE(0xa73f, 1, 0x42),SCE(0x0376, 0, 0x82),SCE(0x0377, 1, 0x42),
++SCE(0x2c94, 0, 0x82),SCE(0x2c95, 1, 0x42),SCE(0x2c96, 0, 0x82),SCE(0x2c97, 1, 0x42),
++SCE(0x0386, 0, 0x82),SCE(0x03ac, 1, 0x42),SCE(0x10405, 0, 0x82),SCE(0x1042d, 1, 0x42),
++SCE(0x0388, 0, 0x82),SCE(0x03ad, 1, 0x42),SCE(0x0389, 0, 0x82),SCE(0x03ae, 1, 0x42),
++SCE(0x038a, 0, 0x82),SCE(0x03af, 1, 0x42),SCE(0x038c, 0, 0x82),SCE(0x03cc, 1, 0x42),
++SCE(0x038e, 0, 0x82),SCE(0x03cd, 1, 0x42),SCE(0x038f, 0, 0x82),SCE(0x03ce, 1, 0x42),
++SCE(0x0391, 0, 0x82),SCE(0x03b1, 1, 0x42),SCE(0x0392, 0, 0x83),SCE(0x03b2, 1, 0x43),
++SCE(0x03d0, 2, 0x43),SCE(0x0393, 0, 0x82),SCE(0x03b3, 1, 0x42),SCE(0x0394, 0, 0x82),
++SCE(0x03b4, 1, 0x42),SCE(0x0395, 0, 0x83),SCE(0x03b5, 1, 0x43),SCE(0x03f5, 2, 0x43),
++SCE(0x0396, 0, 0x82),SCE(0x03b6, 1, 0x42),SCE(0x0397, 0, 0x82),SCE(0x03b7, 1, 0x42),
++SCE(0x0398, 0, 0x84),SCE(0x03b8, 1, 0x44),SCE(0x03d1, 2, 0x44),SCE(0x03f4, 3, 0x84),
++SCE(0x0345, 0, 0x44),SCE(0x0399, 1, 0x84),SCE(0x03b9, 2, 0x44),SCE(0x1fbe, 3, 0x44),
++SCE(0x039a, 0, 0x83),SCE(0x03ba, 1, 0x43),SCE(0x03f0, 2, 0x43),SCE(0x039b, 0, 0x82),
++SCE(0x03bb, 1, 0x42),SCE(0x00b5, 0, 0x43),SCE(0x039c, 1, 0x83),SCE(0x03bc, 2, 0x43),
++SCE(0x039d, 0, 0x82),SCE(0x03bd, 1, 0x42),SCE(0x039e, 0, 0x82),SCE(0x03be, 1, 0x42),
++SCE(0x039f, 0, 0x82),SCE(0x03bf, 1, 0x42),SCE(0x03a0, 0, 0x83),SCE(0x03c0, 1, 0x43),
++SCE(0x03d6, 2, 0x43),SCE(0x03a1, 0, 0x83),SCE(0x03c1, 1, 0x43),SCE(0x03f1, 2, 0x43),
++SCE(0x03a3, 0, 0x83),SCE(0x03c2, 1, 0x43),SCE(0x03c3, 2, 0x43),SCE(0x03a4, 0, 0x82),
++SCE(0x03c4, 1, 0x42),SCE(0x03a5, 0, 0x82),SCE(0x03c5, 1, 0x42),SCE(0x03a6, 0, 0x83),
++SCE(0x03c6, 1, 0x43),SCE(0x03d5, 2, 0x43),SCE(0x03a7, 0, 0x82),SCE(0x03c7, 1, 0x42),
++SCE(0x03a8, 0, 0x82),SCE(0x03c8, 1, 0x42),SCE(0x03a9, 0, 0x83),SCE(0x03c9, 1, 0x43),
++SCE(0x2126, 2, 0x83),SCE(0x03aa, 0, 0x82),SCE(0x03ca, 1, 0x42),SCE(0x03ab, 0, 0x82),
++SCE(0x03cb, 1, 0x42),SCE(0x24c9, 0, 0x82),SCE(0x24e3, 1, 0x42),SCE(0x2ce0, 0, 0x82),
++SCE(0x2ce1, 1, 0x42),SCE(0xa748, 0, 0x82),SCE(0xa749, 1, 0x42),SCE(0x2c9c, 0, 0x82),
++SCE(0x2c9d, 1, 0x42),SCE(0x2c9e, 0, 0x82),SCE(0x2c9f, 1, 0x42),SCE(0xa74a, 0, 0x82),
++SCE(0xa74b, 1, 0x42),SCE(0x2ca0, 0, 0x82),SCE(0x2ca1, 1, 0x42),SCE(0x03a3, 0, 0x83),
++SCE(0x03c2, 1, 0x43),SCE(0x03c3, 2, 0x43),SCE(0x1041f, 0, 0x82),SCE(0x10447, 1, 0x42),
++SCE(0xa74c, 0, 0x82),SCE(0xa74d, 1, 0x42),SCE(0xa68a, 0, 0x82),SCE(0xa68b, 1, 0x42),
++SCE(0x2ca2, 0, 0x82),SCE(0x2ca3, 1, 0x42),SCE(0x03cf, 0, 0x82),SCE(0x03d7, 1, 0x42),
++SCE(0x0392, 0, 0x83),SCE(0x03b2, 1, 0x43),SCE(0x03d0, 2, 0x43),SCE(0x0398, 0, 0x84),
++SCE(0x03b8, 1, 0x44),SCE(0x03d1, 2, 0x44),SCE(0x03f4, 3, 0x84),SCE(0x03a6, 0, 0x83),
++SCE(0x03c6, 1, 0x43),SCE(0x03d5, 2, 0x43),SCE(0x03a0, 0, 0x83),SCE(0x03c0, 1, 0x43),
++SCE(0x03d6, 2, 0x43),SCE(0x03d8, 0, 0x82),SCE(0x03d9, 1, 0x42),SCE(0x2ca4, 0, 0x82),
++SCE(0x2ca5, 1, 0x42),SCE(0x03da, 0, 0x82),SCE(0x03db, 1, 0x42),SCE(0x03dc, 0, 0x82),
++SCE(0x03dd, 1, 0x42),SCE(0x03de, 0, 0x82),SCE(0x03df, 1, 0x42),SCE(0x03e0, 0, 0x82),
++SCE(0x03e1, 1, 0x42),SCE(0x03e2, 0, 0x82),SCE(0x03e3, 1, 0x42),SCE(0x03e4, 0, 0x82),
++SCE(0x03e5, 1, 0x42),SCE(0x2ca6, 0, 0x82),SCE(0x2ca7, 1, 0x42),SCE(0x03e6, 0, 0x82),
++SCE(0x03e7, 1, 0x42),SCE(0x10420, 0, 0x82),SCE(0x10448, 1, 0x42),SCE(0x03e8, 0, 0x82),
++SCE(0x03e9, 1, 0x42),SCE(0x2ce2, 0, 0x82),SCE(0x2ce3, 1, 0x42),SCE(0x03ea, 0, 0x82),
++SCE(0x03eb, 1, 0x42),SCE(0x03ec, 0, 0x82),SCE(0x03ed, 1, 0x42),SCE(0x03ee, 0, 0x82),
++SCE(0x03ef, 1, 0x42),SCE(0x039a, 0, 0x83),SCE(0x03ba, 1, 0x43),SCE(0x03f0, 2, 0x43),
++SCE(0x03a1, 0, 0x83),SCE(0x03c1, 1, 0x43),SCE(0x03f1, 2, 0x43),SCE(0x0398, 0, 0x84),
++SCE(0x03b8, 1, 0x44),SCE(0x03d1, 2, 0x44),SCE(0x03f4, 3, 0x84),SCE(0x0395, 0, 0x83),
++SCE(0x03b5, 1, 0x43),SCE(0x03f5, 2, 0x43),SCE(0x03f7, 0, 0x82),SCE(0x03f8, 1, 0x42),
++SCE(0x03f2, 0, 0x42),SCE(0x03f9, 1, 0x82),SCE(0x03fa, 0, 0x82),SCE(0x03fb, 1, 0x42),
++SCE(0x037b, 0, 0x42),SCE(0x03fd, 1, 0x82),SCE(0x037c, 0, 0x42),SCE(0x03fe, 1, 0x82),
++SCE(0x037d, 0, 0x42),SCE(0x03ff, 1, 0x82),SCE(0x0400, 0, 0x82),SCE(0x0450, 1, 0x42),
++SCE(0x0401, 0, 0x82),SCE(0x0451, 1, 0x42),SCE(0x0402, 0, 0x82),SCE(0x0452, 1, 0x42),
++SCE(0x0403, 0, 0x82),SCE(0x0453, 1, 0x42),SCE(0x0404, 0, 0x82),SCE(0x0454, 1, 0x42),
++SCE(0x0405, 0, 0x82),SCE(0x0455, 1, 0x42),SCE(0x0406, 0, 0x82),SCE(0x0456, 1, 0x42),
++SCE(0x0407, 0, 0x82),SCE(0x0457, 1, 0x42),SCE(0x0408, 0, 0x82),SCE(0x0458, 1, 0x42),
++SCE(0x0409, 0, 0x82),SCE(0x0459, 1, 0x42),SCE(0x040a, 0, 0x82),SCE(0x045a, 1, 0x42),
++SCE(0x040b, 0, 0x82),SCE(0x045b, 1, 0x42),SCE(0x040c, 0, 0x82),SCE(0x045c, 1, 0x42),
++SCE(0x040d, 0, 0x82),SCE(0x045d, 1, 0x42),SCE(0x040e, 0, 0x82),SCE(0x045e, 1, 0x42),
++SCE(0x040f, 0, 0x82),SCE(0x045f, 1, 0x42),SCE(0x0410, 0, 0x82),SCE(0x0430, 1, 0x42),
++SCE(0x0411, 0, 0x82),SCE(0x0431, 1, 0x42),SCE(0x0412, 0, 0x82),SCE(0x0432, 1, 0x42),
++SCE(0x0413, 0, 0x82),SCE(0x0433, 1, 0x42),SCE(0x0414, 0, 0x82),SCE(0x0434, 1, 0x42),
++SCE(0x0415, 0, 0x82),SCE(0x0435, 1, 0x42),SCE(0x0416, 0, 0x82),SCE(0x0436, 1, 0x42),
++SCE(0x0417, 0, 0x82),SCE(0x0437, 1, 0x42),SCE(0x0418, 0, 0x82),SCE(0x0438, 1, 0x42),
++SCE(0x0419, 0, 0x82),SCE(0x0439, 1, 0x42),SCE(0x041a, 0, 0x82),SCE(0x043a, 1, 0x42),
++SCE(0x041b, 0, 0x82),SCE(0x043b, 1, 0x42),SCE(0x041c, 0, 0x82),SCE(0x043c, 1, 0x42),
++SCE(0x041d, 0, 0x82),SCE(0x043d, 1, 0x42),SCE(0x041e, 0, 0x82),SCE(0x043e, 1, 0x42),
++SCE(0x041f, 0, 0x82),SCE(0x043f, 1, 0x42),SCE(0x0420, 0, 0x82),SCE(0x0440, 1, 0x42),
++SCE(0x0421, 0, 0x82),SCE(0x0441, 1, 0x42),SCE(0x0422, 0, 0x82),SCE(0x0442, 1, 0x42),
++SCE(0x0423, 0, 0x82),SCE(0x0443, 1, 0x42),SCE(0x0424, 0, 0x82),SCE(0x0444, 1, 0x42),
++SCE(0x0425, 0, 0x82),SCE(0x0445, 1, 0x42),SCE(0x0426, 0, 0x82),SCE(0x0446, 1, 0x42),
++SCE(0x0427, 0, 0x82),SCE(0x0447, 1, 0x42),SCE(0x0428, 0, 0x82),SCE(0x0448, 1, 0x42),
++SCE(0x0429, 0, 0x82),SCE(0x0449, 1, 0x42),SCE(0x042a, 0, 0x82),SCE(0x044a, 1, 0x42),
++SCE(0x042b, 0, 0x82),SCE(0x044b, 1, 0x42),SCE(0x042c, 0, 0x82),SCE(0x044c, 1, 0x42),
++SCE(0x042d, 0, 0x82),SCE(0x044d, 1, 0x42),SCE(0x042e, 0, 0x82),SCE(0x044e, 1, 0x42),
++SCE(0x042f, 0, 0x82),SCE(0x044f, 1, 0x42),SCE(0xff3a, 0, 0x82),SCE(0xff5a, 1, 0x42),
++SCE(0x2cb4, 0, 0x82),SCE(0x2cb5, 1, 0x42),SCE(0x00b5, 0, 0x43),SCE(0x039c, 1, 0x83),
++SCE(0x03bc, 2, 0x43),SCE(0x10423, 0, 0x82),SCE(0x1044b, 1, 0x42),SCE(0x24b6, 0, 0x82),
++SCE(0x24d0, 1, 0x42),SCE(0x24b8, 0, 0x82),SCE(0x24d2, 1, 0x42),SCE(0xff2c, 0, 0x82),
++SCE(0xff4c, 1, 0x42),SCE(0x10421, 0, 0x82),SCE(0x10449, 1, 0x42),SCE(0x24ba, 0, 0x82),
++SCE(0x24d4, 1, 0x42),SCE(0x10424, 0, 0x82),SCE(0x1044c, 1, 0x42),SCE(0x0460, 0, 0x82),
++SCE(0x0461, 1, 0x42),SCE(0x0462, 0, 0x82),SCE(0x0463, 1, 0x42),SCE(0x1d7d, 0, 0x42),
++SCE(0x2c63, 1, 0x82),SCE(0x0464, 0, 0x82),SCE(0x0465, 1, 0x42),SCE(0x0466, 0, 0x82),
++SCE(0x0467, 1, 0x42),SCE(0x2c67, 0, 0x82),SCE(0x2c68, 1, 0x42),SCE(0x0468, 0, 0x82),
++SCE(0x0469, 1, 0x42),SCE(0x24bc, 0, 0x82),SCE(0x24d6, 1, 0x42),SCE(0x046a, 0, 0x82),
++SCE(0x046b, 1, 0x42),SCE(0x2c6b, 0, 0x82),SCE(0x2c6c, 1, 0x42),SCE(0x046c, 0, 0x82),
++SCE(0x046d, 1, 0x42),SCE(0x0251, 0, 0x42),SCE(0x2c6d, 1, 0x82),SCE(0x046e, 0, 0x82),
++SCE(0x046f, 1, 0x42),SCE(0x0250, 0, 0x42),SCE(0x2c6f, 1, 0x82),SCE(0x0470, 0, 0x82),
++SCE(0x0471, 1, 0x42),SCE(0xa768, 0, 0x82),SCE(0xa769, 1, 0x42),SCE(0x0472, 0, 0x82),
++SCE(0x0473, 1, 0x42),SCE(0x0474, 0, 0x82),SCE(0x0475, 1, 0x42),SCE(0x24be, 0, 0x82),
++SCE(0x24d8, 1, 0x42),SCE(0x0476, 0, 0x82),SCE(0x0477, 1, 0x42),SCE(0x0478, 0, 0x82),
++SCE(0x0479, 1, 0x42),SCE(0x047a, 0, 0x82),SCE(0x047b, 1, 0x42),SCE(0x047c, 0, 0x82),
++SCE(0x047d, 1, 0x42),SCE(0xa76a, 0, 0x82),SCE(0xa76b, 1, 0x42),SCE(0x047e, 0, 0x82),
++SCE(0x047f, 1, 0x42),SCE(0x0240, 0, 0x42),SCE(0x2c7f, 1, 0x82),SCE(0x0480, 0, 0x82),
++SCE(0x0481, 1, 0x42),SCE(0x10c0, 0, 0x82),SCE(0x2d20, 1, 0x42),SCE(0x2c82, 0, 0x82),
++SCE(0x2c83, 1, 0x42),SCE(0x2c84, 0, 0x82),SCE(0x2c85, 1, 0x42),SCE(0x2c86, 0, 0x82),
++SCE(0x2c87, 1, 0x42),SCE(0x10c1, 0, 0x82),SCE(0x2d21, 1, 0x42),SCE(0x2c88, 0, 0x82),
++SCE(0x2c89, 1, 0x42),SCE(0xa76c, 0, 0x82),SCE(0xa76d, 1, 0x42),SCE(0x048a, 0, 0x82),
++SCE(0x048b, 1, 0x42),SCE(0x048c, 0, 0x82),SCE(0x048d, 1, 0x42),SCE(0x00c2, 0, 0x82),
++SCE(0x00e2, 1, 0x42),SCE(0x048e, 0, 0x82),SCE(0x048f, 1, 0x42),SCE(0x0490, 0, 0x82),
++SCE(0x0491, 1, 0x42),SCE(0x0492, 0, 0x82),SCE(0x0493, 1, 0x42),SCE(0x10c3, 0, 0x82),
++SCE(0x2d23, 1, 0x42),SCE(0x0494, 0, 0x82),SCE(0x0495, 1, 0x42),SCE(0xa76e, 0, 0x82),
++SCE(0xa76f, 1, 0x42),SCE(0x0496, 0, 0x82),SCE(0x0497, 1, 0x42),SCE(0x0498, 0, 0x82),
++SCE(0x0499, 1, 0x42),SCE(0x00c4, 0, 0x82),SCE(0x00e4, 1, 0x42),SCE(0x049a, 0, 0x82),
++SCE(0x049b, 1, 0x42),SCE(0x10426, 0, 0x82),SCE(0x1044e, 1, 0x42),SCE(0x049c, 0, 0x82),
++SCE(0x049d, 1, 0x42),SCE(0x049e, 0, 0x82),SCE(0x049f, 1, 0x42),SCE(0x10c5, 0, 0x82),
++SCE(0x2d25, 1, 0x42),SCE(0x04a0, 0, 0x82),SCE(0x04a1, 1, 0x42),SCE(0x04a2, 0, 0x82),
++SCE(0x04a3, 1, 0x42),SCE(0x04a4, 0, 0x82),SCE(0x04a5, 1, 0x42),SCE(0x2cc6, 0, 0x82),
++SCE(0x2cc7, 1, 0x42),SCE(0x04a6, 0, 0x82),SCE(0x04a7, 1, 0x42),SCE(0x04a8, 0, 0x82),
++SCE(0x04a9, 1, 0x42),SCE(0x2c60, 0, 0x82),SCE(0x2c61, 1, 0x42),SCE(0x04aa, 0, 0x82),
++SCE(0x04ab, 1, 0x42),SCE(0x10c7, 0, 0x82),SCE(0x2d27, 1, 0x42),SCE(0x04ac, 0, 0x82),
++SCE(0x04ad, 1, 0x42),SCE(0x10413, 0, 0x82),SCE(0x1043b, 1, 0x42),SCE(0x04ae, 0, 0x82),
++SCE(0x04af, 1, 0x42),SCE(0x04b0, 0, 0x82),SCE(0x04b1, 1, 0x42),SCE(0x2cc8, 0, 0x82),
++SCE(0x2cc9, 1, 0x42),SCE(0x04b2, 0, 0x82),SCE(0x04b3, 1, 0x42),SCE(0x04b4, 0, 0x82),
++SCE(0x04b5, 1, 0x42),SCE(0x04b6, 0, 0x82),SCE(0x04b7, 1, 0x42),SCE(0x24b7, 0, 0x82),
++SCE(0x24d1, 1, 0x42),SCE(0x04b8, 0, 0x82),SCE(0x04b9, 1, 0x42),SCE(0x24b9, 0, 0x82),
++SCE(0x24d3, 1, 0x42),SCE(0x04ba, 0, 0x82),SCE(0x04bb, 1, 0x42),SCE(0x24bb, 0, 0x82),
++SCE(0x24d5, 1, 0x42),SCE(0x04bc, 0, 0x82),SCE(0x04bd, 1, 0x42),SCE(0x24bd, 0, 0x82),
++SCE(0x24d7, 1, 0x42),SCE(0x04be, 0, 0x82),SCE(0x04bf, 1, 0x42),SCE(0x24bf, 0, 0x82),
++SCE(0x24d9, 1, 0x42),SCE(0x04c0, 0, 0x82),SCE(0x04cf, 1, 0x42),SCE(0x04c1, 0, 0x82),
++SCE(0x04c2, 1, 0x42),SCE(0x24c2, 0, 0x82),SCE(0x24dc, 1, 0x42),SCE(0x04c3, 0, 0x82),
++SCE(0x04c4, 1, 0x42),SCE(0x24c4, 0, 0x82),SCE(0x24de, 1, 0x42),SCE(0x04c5, 0, 0x82),
++SCE(0x04c6, 1, 0x42),SCE(0x24c6, 0, 0x82),SCE(0x24e0, 1, 0x42),SCE(0x04c7, 0, 0x82),
++SCE(0x04c8, 1, 0x42),SCE(0x24c8, 0, 0x82),SCE(0x24e2, 1, 0x42),SCE(0x04c9, 0, 0x82),
++SCE(0x04ca, 1, 0x42),SCE(0x24ca, 0, 0x82),SCE(0x24e4, 1, 0x42),SCE(0x04cb, 0, 0x82),
++SCE(0x04cc, 1, 0x42),SCE(0x24cc, 0, 0x82),SCE(0x24e6, 1, 0x42),SCE(0x04cd, 0, 0x82),
++SCE(0x04ce, 1, 0x42),SCE(0x24ce, 0, 0x82),SCE(0x24e8, 1, 0x42),SCE(0x10cd, 0, 0x82),
++SCE(0x2d2d, 1, 0x42),SCE(0x04d0, 0, 0x82),SCE(0x04d1, 1, 0x42),SCE(0x04d2, 0, 0x82),
++SCE(0x04d3, 1, 0x42),SCE(0x04d4, 0, 0x82),SCE(0x04d5, 1, 0x42),SCE(0x2cce, 0, 0x82),
++SCE(0x2ccf, 1, 0x42),SCE(0x04d6, 0, 0x82),SCE(0x04d7, 1, 0x42),SCE(0xa779, 0, 0x82),
++SCE(0xa77a, 1, 0x42),SCE(0x04d8, 0, 0x82),SCE(0x04d9, 1, 0x42),SCE(0x04da, 0, 0x82),
++SCE(0x04db, 1, 0x42),SCE(0x24cf, 0, 0x82),SCE(0x24e9, 1, 0x42),SCE(0x04dc, 0, 0x82),
++SCE(0x04dd, 1, 0x42),SCE(0x04de, 0, 0x82),SCE(0x04df, 1, 0x42),SCE(0x04e0, 0, 0x82),
++SCE(0x04e1, 1, 0x42),SCE(0x2cd0, 0, 0x82),SCE(0x2cd1, 1, 0x42),SCE(0x04e2, 0, 0x82),
++SCE(0x04e3, 1, 0x42),SCE(0x04e4, 0, 0x82),SCE(0x04e5, 1, 0x42),SCE(0x026b, 0, 0x42),
++SCE(0x2c62, 1, 0x82),SCE(0x04e6, 0, 0x82),SCE(0x04e7, 1, 0x42),SCE(0x04e8, 0, 0x82),
++SCE(0x04e9, 1, 0x42),SCE(0x04ea, 0, 0x82),SCE(0x04eb, 1, 0x42),SCE(0x2132, 0, 0x82),
++SCE(0x214e, 1, 0x42),SCE(0x04ec, 0, 0x82),SCE(0x04ed, 1, 0x42),SCE(0x2cd2, 0, 0x82),
++SCE(0x2cd3, 1, 0x42),SCE(0x04ee, 0, 0x82),SCE(0x04ef, 1, 0x42),SCE(0x04f0, 0, 0x82),
++SCE(0x04f1, 1, 0x42),SCE(0x10422, 0, 0x82),SCE(0x1044a, 1, 0x42),SCE(0x04f2, 0, 0x82),
++SCE(0x04f3, 1, 0x42),SCE(0x04f4, 0, 0x82),SCE(0x04f5, 1, 0x42),SCE(0x04f6, 0, 0x82),
++SCE(0x04f7, 1, 0x42),SCE(0x04f8, 0, 0x82),SCE(0x04f9, 1, 0x42),SCE(0x2cd4, 0, 0x82),
++SCE(0x2cd5, 1, 0x42),SCE(0x04fa, 0, 0x82),SCE(0x04fb, 1, 0x42),SCE(0x04fc, 0, 0x82),
++SCE(0x04fd, 1, 0x42),SCE(0x04fe, 0, 0x82),SCE(0x04ff, 1, 0x42),SCE(0x0500, 0, 0x82),
++SCE(0x0501, 1, 0x42),SCE(0x0502, 0, 0x82),SCE(0x0503, 1, 0x42),SCE(0x0504, 0, 0x82),
++SCE(0x0505, 1, 0x42),SCE(0x2cd6, 0, 0x82),SCE(0x2cd7, 1, 0x42),SCE(0x0506, 0, 0x82),
++SCE(0x0507, 1, 0x42),SCE(0x0508, 0, 0x82),SCE(0x0509, 1, 0x42),SCE(0x050a, 0, 0x82),
++SCE(0x050b, 1, 0x42),SCE(0x050c, 0, 0x82),SCE(0x050d, 1, 0x42),SCE(0x050e, 0, 0x82),
++SCE(0x050f, 1, 0x42),SCE(0x0510, 0, 0x82),SCE(0x0511, 1, 0x42),SCE(0x2cd8, 0, 0x82),
++SCE(0x2cd9, 1, 0x42),SCE(0x0512, 0, 0x82),SCE(0x0513, 1, 0x42),SCE(0x0514, 0, 0x82),
++SCE(0x0515, 1, 0x42),SCE(0x0516, 0, 0x82),SCE(0x0517, 1, 0x42),SCE(0x0518, 0, 0x82),
++SCE(0x0519, 1, 0x42),SCE(0x051a, 0, 0x82),SCE(0x051b, 1, 0x42),SCE(0x2ca8, 0, 0x82),
++SCE(0x2ca9, 1, 0x42),SCE(0x051c, 0, 0x82),SCE(0x051d, 1, 0x42),SCE(0x2cda, 0, 0x82),
++SCE(0x2cdb, 1, 0x42),SCE(0x051e, 0, 0x82),SCE(0x051f, 1, 0x42),SCE(0x0520, 0, 0x82),
++SCE(0x0521, 1, 0x42),SCE(0x0522, 0, 0x82),SCE(0x0523, 1, 0x42),SCE(0x0524, 0, 0x82),
++SCE(0x0525, 1, 0x42),SCE(0x0526, 0, 0x82),SCE(0x0527, 1, 0x42),SCE(0x2c20, 0, 0x82),
++SCE(0x2c50, 1, 0x42),SCE(0x2cdc, 0, 0x82),SCE(0x2cdd, 1, 0x42),SCE(0x0531, 0, 0x82),
++SCE(0x0561, 1, 0x42),SCE(0x0532, 0, 0x82),SCE(0x0562, 1, 0x42),SCE(0x0533, 0, 0x82),
++SCE(0x0563, 1, 0x42),SCE(0x0534, 0, 0x82),SCE(0x0564, 1, 0x42),SCE(0x0535, 0, 0x82),
++SCE(0x0565, 1, 0x42),SCE(0x0536, 0, 0x82),SCE(0x0566, 1, 0x42),SCE(0x0537, 0, 0x82),
++SCE(0x0567, 1, 0x42),SCE(0x0538, 0, 0x82),SCE(0x0568, 1, 0x42),SCE(0x0539, 0, 0x82),
++SCE(0x0569, 1, 0x42),SCE(0x053a, 0, 0x82),SCE(0x056a, 1, 0x42),SCE(0x053b, 0, 0x82),
++SCE(0x056b, 1, 0x42),SCE(0x053c, 0, 0x82),SCE(0x056c, 1, 0x42),SCE(0x053d, 0, 0x82),
++SCE(0x056d, 1, 0x42),SCE(0x053e, 0, 0x82),SCE(0x056e, 1, 0x42),SCE(0x053f, 0, 0x82),
++SCE(0x056f, 1, 0x42),SCE(0x0540, 0, 0x82),SCE(0x0570, 1, 0x42),SCE(0x0541, 0, 0x82),
++SCE(0x0571, 1, 0x42),SCE(0x0542, 0, 0x82),SCE(0x0572, 1, 0x42),SCE(0x0543, 0, 0x82),
++SCE(0x0573, 1, 0x42),SCE(0x0544, 0, 0x82),SCE(0x0574, 1, 0x42),SCE(0x0545, 0, 0x82),
++SCE(0x0575, 1, 0x42),SCE(0x0546, 0, 0x82),SCE(0x0576, 1, 0x42),SCE(0x0547, 0, 0x82),
++SCE(0x0577, 1, 0x42),SCE(0x0548, 0, 0x82),SCE(0x0578, 1, 0x42),SCE(0x0549, 0, 0x82),
++SCE(0x0579, 1, 0x42),SCE(0x054a, 0, 0x82),SCE(0x057a, 1, 0x42),SCE(0x054b, 0, 0x82),
++SCE(0x057b, 1, 0x42),SCE(0x054c, 0, 0x82),SCE(0x057c, 1, 0x42),SCE(0x054d, 0, 0x82),
++SCE(0x057d, 1, 0x42),SCE(0x054e, 0, 0x82),SCE(0x057e, 1, 0x42),SCE(0x054f, 0, 0x82),
++SCE(0x057f, 1, 0x42),SCE(0x0550, 0, 0x82),SCE(0x0580, 1, 0x42),SCE(0x0551, 0, 0x82),
++SCE(0x0581, 1, 0x42),SCE(0x0552, 0, 0x82),SCE(0x0582, 1, 0x42),SCE(0x0553, 0, 0x82),
++SCE(0x0583, 1, 0x42),SCE(0x0554, 0, 0x82),SCE(0x0584, 1, 0x42),SCE(0x0555, 0, 0x82),
++SCE(0x0585, 1, 0x42),SCE(0x0556, 0, 0x82),SCE(0x0586, 1, 0x42),SCE(0x2caa, 0, 0x82),
++SCE(0x2cab, 1, 0x42),SCE(0x2c22, 0, 0x82),SCE(0x2c52, 1, 0x42),SCE(0x2c23, 0, 0x82),
++SCE(0x2c53, 1, 0x42),SCE(0x2ceb, 0, 0x82),SCE(0x2cec, 1, 0x42),SCE(0x2cca, 0, 0x82),
++SCE(0x2ccb, 1, 0x42),SCE(0xa642, 0, 0x82),SCE(0xa643, 1, 0x42),SCE(0x2ced, 0, 0x82),
++SCE(0x2cee, 1, 0x42),SCE(0x2cac, 0, 0x82),SCE(0x2cad, 1, 0x42),SCE(0xa644, 0, 0x82),
++SCE(0xa645, 1, 0x42),SCE(0x2c24, 0, 0x82),SCE(0x2c54, 1, 0x42),SCE(0xa646, 0, 0x82),
++SCE(0xa647, 1, 0x42),SCE(0x2cf2, 0, 0x82),SCE(0x2cf3, 1, 0x42),SCE(0x10408, 0, 0x82),
++SCE(0x10430, 1, 0x42),SCE(0xa648, 0, 0x82),SCE(0xa649, 1, 0x42),SCE(0xa64a, 0, 0x82),
++SCE(0xa64b, 1, 0x42),SCE(0xa64c, 0, 0x82),SCE(0xa64d, 1, 0x42),SCE(0x2cae, 0, 0x82),
++SCE(0x2caf, 1, 0x42),SCE(0xa64e, 0, 0x82),SCE(0xa64f, 1, 0x42),SCE(0xa650, 0, 0x82),
++SCE(0xa651, 1, 0x42),SCE(0xa78b, 0, 0x82),SCE(0xa78c, 1, 0x42),SCE(0xa652, 0, 0x82),
++SCE(0xa653, 1, 0x42),SCE(0xa7a8, 0, 0x82),SCE(0xa7a9, 1, 0x42),SCE(0xa654, 0, 0x82),
++SCE(0xa655, 1, 0x42),SCE(0x0266, 0, 0x42),SCE(0xa7aa, 1, 0x82),SCE(0x1e00, 0, 0x82),
++SCE(0x1e01, 1, 0x42),SCE(0x1e02, 0, 0x82),SCE(0x1e03, 1, 0x42),SCE(0x1e04, 0, 0x82),
++SCE(0x1e05, 1, 0x42),SCE(0x2c1f, 0, 0x82),SCE(0x2c4f, 1, 0x42),SCE(0x1e06, 0, 0x82),
++SCE(0x1e07, 1, 0x42),SCE(0x1040e, 0, 0x82),SCE(0x10436, 1, 0x42),SCE(0x1e08, 0, 0x82),
++SCE(0x1e09, 1, 0x42),SCE(0x1e0a, 0, 0x82),SCE(0x1e0b, 1, 0x42),SCE(0x2cb0, 0, 0x82),
++SCE(0x2cb1, 1, 0x42),SCE(0x1e0c, 0, 0x82),SCE(0x1e0d, 1, 0x42),SCE(0x1e0e, 0, 0x82),
++SCE(0x1e0f, 1, 0x42),SCE(0x1e10, 0, 0x82),SCE(0x1e11, 1, 0x42),SCE(0xa658, 0, 0x82),
++SCE(0xa659, 1, 0x42),SCE(0x1e12, 0, 0x82),SCE(0x1e13, 1, 0x42),SCE(0x1e14, 0, 0x82),
++SCE(0x1e15, 1, 0x42),SCE(0x24cd, 0, 0x82),SCE(0x24e7, 1, 0x42),SCE(0x1e16, 0, 0x82),
++SCE(0x1e17, 1, 0x42),SCE(0x1e18, 0, 0x82),SCE(0x1e19, 1, 0x42),SCE(0x1e1a, 0, 0x82),
++SCE(0x1e1b, 1, 0x42),SCE(0x1e1c, 0, 0x82),SCE(0x1e1d, 1, 0x42),SCE(0xa65a, 0, 0x82),
++SCE(0xa65b, 1, 0x42),SCE(0x1e1e, 0, 0x82),SCE(0x1e1f, 1, 0x42),SCE(0x1e20, 0, 0x82),
++SCE(0x1e21, 1, 0x42),SCE(0x1e22, 0, 0x82),SCE(0x1e23, 1, 0x42),SCE(0x1e24, 0, 0x82),
++SCE(0x1e25, 1, 0x42),SCE(0x1e26, 0, 0x82),SCE(0x1e27, 1, 0x42),SCE(0x1e28, 0, 0x82),
++SCE(0x1e29, 1, 0x42),SCE(0xa65c, 0, 0x82),SCE(0xa65d, 1, 0x42),SCE(0x1e2a, 0, 0x82),
++SCE(0x1e2b, 1, 0x42),SCE(0x1e2c, 0, 0x82),SCE(0x1e2d, 1, 0x42),SCE(0x1e2e, 0, 0x82),
++SCE(0x1e2f, 1, 0x42),SCE(0x1e30, 0, 0x82),SCE(0x1e31, 1, 0x42),SCE(0x1e32, 0, 0x82),
++SCE(0x1e33, 1, 0x42),SCE(0x1e34, 0, 0x82),SCE(0x1e35, 1, 0x42),SCE(0xa65e, 0, 0x82),
++SCE(0xa65f, 1, 0x42),SCE(0x1e36, 0, 0x82),SCE(0x1e37, 1, 0x42),SCE(0x1e38, 0, 0x82),
++SCE(0x1e39, 1, 0x42),SCE(0x1e3a, 0, 0x82),SCE(0x1e3b, 1, 0x42),SCE(0x1e3c, 0, 0x82),
++SCE(0x1e3d, 1, 0x42),SCE(0x1e3e, 0, 0x82),SCE(0x1e3f, 1, 0x42),SCE(0x1e40, 0, 0x82),
++SCE(0x1e41, 1, 0x42),SCE(0xa660, 0, 0x82),SCE(0xa661, 1, 0x42),SCE(0x1e42, 0, 0x82),
++SCE(0x1e43, 1, 0x42),SCE(0x1e44, 0, 0x82),SCE(0x1e45, 1, 0x42),SCE(0x1e46, 0, 0x82),
++SCE(0x1e47, 1, 0x42),SCE(0x2cb2, 0, 0x82),SCE(0x2cb3, 1, 0x42),SCE(0x1e48, 0, 0x82),
++SCE(0x1e49, 1, 0x42),SCE(0x2cc0, 0, 0x82),SCE(0x2cc1, 1, 0x42),SCE(0x1e4a, 0, 0x82),
++SCE(0x1e4b, 1, 0x42),SCE(0x1e4c, 0, 0x82),SCE(0x1e4d, 1, 0x42),SCE(0xa662, 0, 0x82),
++SCE(0xa663, 1, 0x42),SCE(0x1e4e, 0, 0x82),SCE(0x1e4f, 1, 0x42),SCE(0x1e50, 0, 0x82),
++SCE(0x1e51, 1, 0x42),SCE(0x1e52, 0, 0x82),SCE(0x1e53, 1, 0x42),SCE(0x1e54, 0, 0x82),
++SCE(0x1e55, 1, 0x42),SCE(0x1e56, 0, 0x82),SCE(0x1e57, 1, 0x42),SCE(0x1e58, 0, 0x82),
++SCE(0x1e59, 1, 0x42),SCE(0xa664, 0, 0x82),SCE(0xa665, 1, 0x42),SCE(0x1e5a, 0, 0x82),
++SCE(0x1e5b, 1, 0x42),SCE(0x1e5c, 0, 0x82),SCE(0x1e5d, 1, 0x42),SCE(0x1e5e, 0, 0x82),
++SCE(0x1e5f, 1, 0x42),SCE(0x1e60, 0, 0x83),SCE(0x1e61, 1, 0x43),SCE(0x1e9b, 2, 0x43),
++SCE(0x1e62, 0, 0x82),SCE(0x1e63, 1, 0x42),SCE(0x1e64, 0, 0x82),SCE(0x1e65, 1, 0x42),
++SCE(0xa666, 0, 0x82),SCE(0xa667, 1, 0x42),SCE(0x1e66, 0, 0x82),SCE(0x1e67, 1, 0x42),
++SCE(0x1e68, 0, 0x82),SCE(0x1e69, 1, 0x42),SCE(0x1e6a, 0, 0x82),SCE(0x1e6b, 1, 0x42),
++SCE(0x1e6c, 0, 0x82),SCE(0x1e6d, 1, 0x42),SCE(0x1e6e, 0, 0x82),SCE(0x1e6f, 1, 0x42),
++SCE(0x1e70, 0, 0x82),SCE(0x1e71, 1, 0x42),SCE(0xa668, 0, 0x82),SCE(0xa669, 1, 0x42),
++SCE(0x1e72, 0, 0x82),SCE(0x1e73, 1, 0x42),SCE(0x1e74, 0, 0x82),SCE(0x1e75, 1, 0x42),
++SCE(0x1e76, 0, 0x82),SCE(0x1e77, 1, 0x42),SCE(0x2cbe, 0, 0x82),SCE(0x2cbf, 1, 0x42),
++SCE(0x1e78, 0, 0x82),SCE(0x1e79, 1, 0x42),SCE(0x1e7a, 0, 0x82),SCE(0x1e7b, 1, 0x42),
++SCE(0x1e7c, 0, 0x82),SCE(0x1e7d, 1, 0x42),SCE(0xa66a, 0, 0x82),SCE(0xa66b, 1, 0x42),
++SCE(0x1e7e, 0, 0x82),SCE(0x1e7f, 1, 0x42),SCE(0x1e80, 0, 0x82),SCE(0x1e81, 1, 0x42),
++SCE(0x1e82, 0, 0x82),SCE(0x1e83, 1, 0x42),SCE(0x1e84, 0, 0x82),SCE(0x1e85, 1, 0x42),
++SCE(0x1e86, 0, 0x82),SCE(0x1e87, 1, 0x42),SCE(0x1e88, 0, 0x82),SCE(0x1e89, 1, 0x42),
++SCE(0xa66c, 0, 0x82),SCE(0xa66d, 1, 0x42),SCE(0x1e8a, 0, 0x82),SCE(0x1e8b, 1, 0x42),
++SCE(0x1e8c, 0, 0x82),SCE(0x1e8d, 1, 0x42),SCE(0x1e8e, 0, 0x82),SCE(0x1e8f, 1, 0x42),
++SCE(0x1e90, 0, 0x82),SCE(0x1e91, 1, 0x42),SCE(0x1e92, 0, 0x82),SCE(0x1e93, 1, 0x42),
++SCE(0x1e94, 0, 0x82),SCE(0x1e95, 1, 0x42),SCE(0xa696, 0, 0x82),SCE(0xa697, 1, 0x42),
++SCE(0x10406, 0, 0x82),SCE(0x1042e, 1, 0x42),SCE(0x1e60, 0, 0x83),SCE(0x1e61, 1, 0x43),
++SCE(0x1e9b, 2, 0x43),SCE(0x00df, 0, 0x42),SCE(0x1e9e, 1, 0x82),SCE(0x1ea0, 0, 0x82),
++SCE(0x1ea1, 1, 0x42),SCE(0x1ea2, 0, 0x82),SCE(0x1ea3, 1, 0x42),SCE(0x1ea4, 0, 0x82),
++SCE(0x1ea5, 1, 0x42),SCE(0x24c5, 0, 0x82),SCE(0x24df, 1, 0x42),SCE(0x1ea6, 0, 0x82),
++SCE(0x1ea7, 1, 0x42),SCE(0x1ea8, 0, 0x82),SCE(0x1ea9, 1, 0x42),SCE(0x1eaa, 0, 0x82),
++SCE(0x1eab, 1, 0x42),SCE(0x1eac, 0, 0x82),SCE(0x1ead, 1, 0x42),SCE(0x1eae, 0, 0x82),
++SCE(0x1eaf, 1, 0x42),SCE(0xff28, 0, 0x82),SCE(0xff48, 1, 0x42),SCE(0x1eb0, 0, 0x82),
++SCE(0x1eb1, 1, 0x42),SCE(0x1eb2, 0, 0x82),SCE(0x1eb3, 1, 0x42),SCE(0x10425, 0, 0x82),
++SCE(0x1044d, 1, 0x42),SCE(0x1eb4, 0, 0x82),SCE(0x1eb5, 1, 0x42),SCE(0x1eb6, 0, 0x82),
++SCE(0x1eb7, 1, 0x42),SCE(0x1eb8, 0, 0x82),SCE(0x1eb9, 1, 0x42),SCE(0x1eba, 0, 0x82),
++SCE(0x1ebb, 1, 0x42),SCE(0x1ebc, 0, 0x82),SCE(0x1ebd, 1, 0x42),SCE(0x1ebe, 0, 0x82),
++SCE(0x1ebf, 1, 0x42),SCE(0x2cb6, 0, 0x82),SCE(0x2cb7, 1, 0x42),SCE(0x1ec0, 0, 0x82),
++SCE(0x1ec1, 1, 0x42),SCE(0x1ec2, 0, 0x82),SCE(0x1ec3, 1, 0x42),SCE(0x2c9a, 0, 0x82),
++SCE(0x2c9b, 1, 0x42),SCE(0x1ec4, 0, 0x82),SCE(0x1ec5, 1, 0x42),SCE(0x1ec6, 0, 0x82),
++SCE(0x1ec7, 1, 0x42),SCE(0x1ec8, 0, 0x82),SCE(0x1ec9, 1, 0x42),SCE(0x1eca, 0, 0x82),
++SCE(0x1ecb, 1, 0x42),SCE(0x1ecc, 0, 0x82),SCE(0x1ecd, 1, 0x42),SCE(0x1ece, 0, 0x82),
++SCE(0x1ecf, 1, 0x42),SCE(0x1ed0, 0, 0x82),SCE(0x1ed1, 1, 0x42),SCE(0x1ed2, 0, 0x82),
++SCE(0x1ed3, 1, 0x42),SCE(0x1ed4, 0, 0x82),SCE(0x1ed5, 1, 0x42),SCE(0x1ed6, 0, 0x82),
++SCE(0x1ed7, 1, 0x42),SCE(0x1ed8, 0, 0x82),SCE(0x1ed9, 1, 0x42),SCE(0x1eda, 0, 0x82),
++SCE(0x1edb, 1, 0x42),SCE(0x1edc, 0, 0x82),SCE(0x1edd, 1, 0x42),SCE(0x1ede, 0, 0x82),
++SCE(0x1edf, 1, 0x42),SCE(0x1ee0, 0, 0x82),SCE(0x1ee1, 1, 0x42),SCE(0x1ee2, 0, 0x82),
++SCE(0x1ee3, 1, 0x42),SCE(0x1ee4, 0, 0x82),SCE(0x1ee5, 1, 0x42),SCE(0x03a9, 0, 0x83),
++SCE(0x03c9, 1, 0x43),SCE(0x2126, 2, 0x83),SCE(0x1ee6, 0, 0x82),SCE(0x1ee7, 1, 0x42),
++SCE(0x1ee8, 0, 0x82),SCE(0x1ee9, 1, 0x42),SCE(0x1eea, 0, 0x82),SCE(0x1eeb, 1, 0x42),
++SCE(0xff2a, 0, 0x82),SCE(0xff4a, 1, 0x42),SCE(0x1eec, 0, 0x82),SCE(0x1eed, 1, 0x42),
++SCE(0x1eee, 0, 0x82),SCE(0x1eef, 1, 0x42),SCE(0x1ef0, 0, 0x82),SCE(0x1ef1, 1, 0x42),
++SCE(0x1ef2, 0, 0x82),SCE(0x1ef3, 1, 0x42),SCE(0x1ef4, 0, 0x82),SCE(0x1ef5, 1, 0x42),
++SCE(0x1ef6, 0, 0x82),SCE(0x1ef7, 1, 0x42),SCE(0x1ef8, 0, 0x82),SCE(0x1ef9, 1, 0x42),
++SCE(0x1efa, 0, 0x82),SCE(0x1efb, 1, 0x42),SCE(0x2cb8, 0, 0x82),SCE(0x2cb9, 1, 0x42),
++SCE(0x1efc, 0, 0x82),SCE(0x1efd, 1, 0x42),SCE(0x004b, 0, 0x83),SCE(0x006b, 1, 0x43),
++SCE(0x212a, 2, 0x83),SCE(0x1efe, 0, 0x82),SCE(0x1eff, 1, 0x42),SCE(0xa680, 0, 0x82),
++SCE(0xa681, 1, 0x42),SCE(0x1f00, 0, 0x42),SCE(0x1f08, 1, 0x82),SCE(0x1f01, 0, 0x42),
++SCE(0x1f09, 1, 0x82),SCE(0x1f02, 0, 0x42),SCE(0x1f0a, 1, 0x82),SCE(0x1f03, 0, 0x42),
++SCE(0x1f0b, 1, 0x82),SCE(0x1f04, 0, 0x42),SCE(0x1f0c, 1, 0x82),SCE(0x1f05, 0, 0x42),
++SCE(0x1f0d, 1, 0x82),SCE(0x1f06, 0, 0x42),SCE(0x1f0e, 1, 0x82),SCE(0x1f07, 0, 0x42),
++SCE(0x1f0f, 1, 0x82),SCE(0x10418, 0, 0x82),SCE(0x10440, 1, 0x42),SCE(0x0265, 0, 0x42),
++SCE(0xa78d, 1, 0x82),SCE(0x1f10, 0, 0x42),SCE(0x1f18, 1, 0x82),SCE(0x1f11, 0, 0x42),
++SCE(0x1f19, 1, 0x82),SCE(0x1f12, 0, 0x42),SCE(0x1f1a, 1, 0x82),SCE(0x1f13, 0, 0x42),
++SCE(0x1f1b, 1, 0x82),SCE(0x1f14, 0, 0x42),SCE(0x1f1c, 1, 0x82),SCE(0x1f15, 0, 0x42),
++SCE(0x1f1d, 1, 0x82),SCE(0xff21, 0, 0x82),SCE(0xff41, 1, 0x42),SCE(0xa722, 0, 0x82),
++SCE(0xa723, 1, 0x42),SCE(0xff23, 0, 0x82),SCE(0xff43, 1, 0x42),SCE(0xa724, 0, 0x82),
++SCE(0xa725, 1, 0x42),SCE(0xa686, 0, 0x82),SCE(0xa687, 1, 0x42),SCE(0xa726, 0, 0x82),
++SCE(0xa727, 1, 0x42),SCE(0xff27, 0, 0x82),SCE(0xff47, 1, 0x42),SCE(0x1f20, 0, 0x42),
++SCE(0x1f28, 1, 0x82),SCE(0x1f21, 0, 0x42),SCE(0x1f29, 1, 0x82),SCE(0x1f22, 0, 0x42),
++SCE(0x1f2a, 1, 0x82),SCE(0x1f23, 0, 0x42),SCE(0x1f2b, 1, 0x82),SCE(0x1f24, 0, 0x42),
++SCE(0x1f2c, 1, 0x82),SCE(0x1f25, 0, 0x42),SCE(0x1f2d, 1, 0x82),SCE(0x1f26, 0, 0x42),
++SCE(0x1f2e, 1, 0x82),SCE(0x1f27, 0, 0x42),SCE(0x1f2f, 1, 0x82),SCE(0xff30, 0, 0x82),
++SCE(0xff50, 1, 0x42),SCE(0xa688, 0, 0x82),SCE(0xa689, 1, 0x42),SCE(0xa732, 0, 0x82),
++SCE(0xa733, 1, 0x42),SCE(0xff33, 0, 0x82),SCE(0xff53, 1, 0x42),SCE(0xa734, 0, 0x82),
++SCE(0xa735, 1, 0x42),SCE(0xff35, 0, 0x82),SCE(0xff55, 1, 0x42),SCE(0xa736, 0, 0x82),
++SCE(0xa737, 1, 0x42),SCE(0x2cba, 0, 0x82),SCE(0x2cbb, 1, 0x42),SCE(0x1f30, 0, 0x42),
++SCE(0x1f38, 1, 0x82),SCE(0x1f31, 0, 0x42),SCE(0x1f39, 1, 0x82),SCE(0x1f32, 0, 0x42),
++SCE(0x1f3a, 1, 0x82),SCE(0x1f33, 0, 0x42),SCE(0x1f3b, 1, 0x82),SCE(0x1f34, 0, 0x42),
++SCE(0x1f3c, 1, 0x82),SCE(0x1f35, 0, 0x42),SCE(0x1f3d, 1, 0x82),SCE(0x1f36, 0, 0x42),
++SCE(0x1f3e, 1, 0x82),SCE(0x1f37, 0, 0x42),SCE(0x1f3f, 1, 0x82),SCE(0xa740, 0, 0x82),
++SCE(0xa741, 1, 0x42),SCE(0xa742, 0, 0x82),SCE(0xa743, 1, 0x42),SCE(0xa744, 0, 0x82),
++SCE(0xa745, 1, 0x42),SCE(0xa746, 0, 0x82),SCE(0xa747, 1, 0x42),SCE(0x1f40, 0, 0x42),
++SCE(0x1f48, 1, 0x82),SCE(0x1f41, 0, 0x42),SCE(0x1f49, 1, 0x82),SCE(0x1f42, 0, 0x42),
++SCE(0x1f4a, 1, 0x82),SCE(0x1f43, 0, 0x42),SCE(0x1f4b, 1, 0x82),SCE(0x1f44, 0, 0x42),
++SCE(0x1f4c, 1, 0x82),SCE(0x1f45, 0, 0x42),SCE(0x1f4d, 1, 0x82),SCE(0xa74e, 0, 0x82),
++SCE(0xa74f, 1, 0x42),SCE(0xa750, 0, 0x82),SCE(0xa751, 1, 0x42),SCE(0xa752, 0, 0x82),
++SCE(0xa753, 1, 0x42),SCE(0xa754, 0, 0x82),SCE(0xa755, 1, 0x42),SCE(0xa68e, 0, 0x82),
++SCE(0xa68f, 1, 0x42),SCE(0xa756, 0, 0x82),SCE(0xa757, 1, 0x42),SCE(0xa758, 0, 0x82),
++SCE(0xa759, 1, 0x42),SCE(0x1f51, 0, 0x42),SCE(0x1f59, 1, 0x82),SCE(0xa75a, 0, 0x82),
++SCE(0xa75b, 1, 0x42),SCE(0x1f53, 0, 0x42),SCE(0x1f5b, 1, 0x82),SCE(0xa75c, 0, 0x82),
++SCE(0xa75d, 1, 0x42),SCE(0x1f55, 0, 0x42),SCE(0x1f5d, 1, 0x82),SCE(0xa75e, 0, 0x82),
++SCE(0xa75f, 1, 0x42),SCE(0x1f57, 0, 0x42),SCE(0x1f5f, 1, 0x82),SCE(0xa760, 0, 0x82),
++SCE(0xa761, 1, 0x42),SCE(0xa690, 0, 0x82),SCE(0xa691, 1, 0x42),SCE(0xa762, 0, 0x82),
++SCE(0xa763, 1, 0x42),SCE(0xff2e, 0, 0x82),SCE(0xff4e, 1, 0x42),SCE(0xa764, 0, 0x82),
++SCE(0xa765, 1, 0x42),SCE(0xa766, 0, 0x82),SCE(0xa767, 1, 0x42),SCE(0x1f60, 0, 0x42),
++SCE(0x1f68, 1, 0x82),SCE(0x1f61, 0, 0x42),SCE(0x1f69, 1, 0x82),SCE(0x1f62, 0, 0x42),
++SCE(0x1f6a, 1, 0x82),SCE(0x1f63, 0, 0x42),SCE(0x1f6b, 1, 0x82),SCE(0x1f64, 0, 0x42),
++SCE(0x1f6c, 1, 0x82),SCE(0x1f65, 0, 0x42),SCE(0x1f6d, 1, 0x82),SCE(0x1f66, 0, 0x42),
++SCE(0x1f6e, 1, 0x82),SCE(0x1f67, 0, 0x42),SCE(0x1f6f, 1, 0x82),SCE(0x2c1c, 0, 0x82),
++SCE(0x2c4c, 1, 0x42),SCE(0x2cbc, 0, 0x82),SCE(0x2cbd, 1, 0x42),SCE(0xa694, 0, 0x82),
++SCE(0xa695, 1, 0x42),SCE(0xa77b, 0, 0x82),SCE(0xa77c, 1, 0x42),SCE(0x1d79, 0, 0x42),
++SCE(0xa77d, 1, 0x82),SCE(0xa77e, 0, 0x82),SCE(0xa77f, 1, 0x42),SCE(0xa780, 0, 0x82),
++SCE(0xa781, 1, 0x42),SCE(0xa782, 0, 0x82),SCE(0xa783, 1, 0x42),SCE(0xa784, 0, 0x82),
++SCE(0xa785, 1, 0x42),SCE(0xa786, 0, 0x82),SCE(0xa787, 1, 0x42),SCE(0x1f80, 0, 0x42),
++SCE(0x1f88, 1, 0x2),SCE(0x1f81, 0, 0x42),SCE(0x1f89, 1, 0x2),SCE(0x1f82, 0, 0x42),
++SCE(0x1f8a, 1, 0x2),SCE(0x1f83, 0, 0x42),SCE(0x1f8b, 1, 0x2),SCE(0x1f84, 0, 0x42),
++SCE(0x1f8c, 1, 0x2),SCE(0x1f85, 0, 0x42),SCE(0x1f8d, 1, 0x2),SCE(0x1f86, 0, 0x42),
++SCE(0x1f8e, 1, 0x2),SCE(0x1f87, 0, 0x42),SCE(0x1f8f, 1, 0x2),SCE(0xa790, 0, 0x82),
++SCE(0xa791, 1, 0x42),SCE(0xa792, 0, 0x82),SCE(0xa793, 1, 0x42),SCE(0x1f90, 0, 0x42),
++SCE(0x1f98, 1, 0x2),SCE(0x1f91, 0, 0x42),SCE(0x1f99, 1, 0x2),SCE(0x1f92, 0, 0x42),
++SCE(0x1f9a, 1, 0x2),SCE(0x1f93, 0, 0x42),SCE(0x1f9b, 1, 0x2),SCE(0x1f94, 0, 0x42),
++SCE(0x1f9c, 1, 0x2),SCE(0x1f95, 0, 0x42),SCE(0x1f9d, 1, 0x2),SCE(0x1f96, 0, 0x42),
++SCE(0x1f9e, 1, 0x2),SCE(0x1f97, 0, 0x42),SCE(0x1f9f, 1, 0x2),SCE(0xa7a0, 0, 0x82),
++SCE(0xa7a1, 1, 0x42),SCE(0xa7a2, 0, 0x82),SCE(0xa7a3, 1, 0x42),SCE(0xa7a4, 0, 0x82),
++SCE(0xa7a5, 1, 0x42),SCE(0xa7a6, 0, 0x82),SCE(0xa7a7, 1, 0x42),SCE(0x1fa0, 0, 0x42),
++SCE(0x1fa8, 1, 0x2),SCE(0x1fa1, 0, 0x42),SCE(0x1fa9, 1, 0x2),SCE(0x1fa2, 0, 0x42),
++SCE(0x1faa, 1, 0x2),SCE(0x1fa3, 0, 0x42),SCE(0x1fab, 1, 0x2),SCE(0x1fa4, 0, 0x42),
++SCE(0x1fac, 1, 0x2),SCE(0x1fa5, 0, 0x42),SCE(0x1fad, 1, 0x2),SCE(0x1fa6, 0, 0x42),
++SCE(0x1fae, 1, 0x2),SCE(0x1fa7, 0, 0x42),SCE(0x1faf, 1, 0x2),SCE(0x1fb0, 0, 0x42),
++SCE(0x1fb8, 1, 0x82),SCE(0x1fb1, 0, 0x42),SCE(0x1fb9, 1, 0x82),SCE(0x1f70, 0, 0x42),
++SCE(0x1fba, 1, 0x82),SCE(0x1f71, 0, 0x42),SCE(0x1fbb, 1, 0x82),SCE(0x1fb3, 0, 0x42),
++SCE(0x1fbc, 1, 0x2),SCE(0x0345, 0, 0x44),SCE(0x0399, 1, 0x84),SCE(0x03b9, 2, 0x44),
++SCE(0x1fbe, 3, 0x44),SCE(0x1f72, 0, 0x42),SCE(0x1fc8, 1, 0x82),SCE(0x1f73, 0, 0x42),
++SCE(0x1fc9, 1, 0x82),SCE(0x1f74, 0, 0x42),SCE(0x1fca, 1, 0x82),SCE(0x1f75, 0, 0x42),
++SCE(0x1fcb, 1, 0x82),SCE(0x1fc3, 0, 0x42),SCE(0x1fcc, 1, 0x2),SCE(0x1fd0, 0, 0x42),
++SCE(0x1fd8, 1, 0x82),SCE(0x1fd1, 0, 0x42),SCE(0x1fd9, 1, 0x82),SCE(0x1f76, 0, 0x42),
++SCE(0x1fda, 1, 0x82),SCE(0x1f77, 0, 0x42),SCE(0x1fdb, 1, 0x82),SCE(0x10427, 0, 0x82),
++SCE(0x1044f, 1, 0x42),SCE(0x1fe0, 0, 0x42),SCE(0x1fe8, 1, 0x82),SCE(0x1fe1, 0, 0x42),
++SCE(0x1fe9, 1, 0x82),SCE(0x1f7a, 0, 0x42),SCE(0x1fea, 1, 0x82),SCE(0x1f7b, 0, 0x42),
++SCE(0x1feb, 1, 0x82),SCE(0x1fe5, 0, 0x42),SCE(0x1fec, 1, 0x82),SCE(0x10401, 0, 0x82),
++SCE(0x10429, 1, 0x42),SCE(0x1040c, 0, 0x82),SCE(0x10434, 1, 0x42),SCE(0x1f78, 0, 0x42),
++SCE(0x1ff8, 1, 0x82),SCE(0x1f79, 0, 0x42),SCE(0x1ff9, 1, 0x82),SCE(0x1f7c, 0, 0x42),
++SCE(0x1ffa, 1, 0x82),SCE(0x1f7d, 0, 0x42),SCE(0x1ffb, 1, 0x82),SCE(0x1ff3, 0, 0x42),
++SCE(0x1ffc, 1, 0x2),SCE(0x24c0, 0, 0x82),SCE(0x24da, 1, 0x42),];
++return t;
++}
++@property immutable(FullCaseEntry[]) fullCaseTable()
++{
++alias FCE = FullCaseEntry;
++static immutable FCE[] t = [
++FCE("Ⰰ", 0, 2, 1),
++FCE("ⰰ", 1, 2, 1),FCE("Ⓝ", 0, 2, 1),FCE("ⓝ", 1, 2, 1),FCE("Ⰱ", 0, 2, 1),
++FCE("ⰱ", 1, 2, 1),FCE("Ⱍ", 0, 2, 1),FCE("ⱍ", 1, 2, 1),FCE("Ⰲ", 0, 2, 1),
++FCE("ⰲ", 1, 2, 1),FCE("Ⰳ", 0, 2, 1),FCE("ⰳ", 1, 2, 1),FCE("Ⰴ", 0, 2, 1),
++FCE("ⰴ", 1, 2, 1),FCE("Ⰵ", 0, 2, 1),FCE("ⰵ", 1, 2, 1),FCE("Ⰶ", 0, 2, 1),
++FCE("ⰶ", 1, 2, 1),FCE("𐐀", 0, 2, 1),FCE("𐐨", 1, 2, 1),FCE("Ⳃ", 0, 2, 1),
++FCE("ⳃ", 1, 2, 1),FCE("Ⰷ", 0, 2, 1),FCE("ⰷ", 1, 2, 1),FCE("Ⰸ", 0, 2, 1),
++FCE("ⰸ", 1, 2, 1),FCE("Ⰹ", 0, 2, 1),FCE("ⰹ", 1, 2, 1),FCE("Ⰺ", 0, 2, 1),
++FCE("ⰺ", 1, 2, 1),FCE("Ꚍ", 0, 2, 1),FCE("ꚍ", 1, 2, 1),FCE("A", 0, 2, 1),
++FCE("a", 1, 2, 1),FCE("B", 0, 2, 1),FCE("b", 1, 2, 1),FCE("C", 0, 2, 1),
++FCE("c", 1, 2, 1),FCE("D", 0, 2, 1),FCE("d", 1, 2, 1),FCE("E", 0, 2, 1),
++FCE("e", 1, 2, 1),FCE("F", 0, 2, 1),FCE("f", 1, 2, 1),FCE("G", 0, 2, 1),
++FCE("g", 1, 2, 1),FCE("H", 0, 2, 1),FCE("h", 1, 2, 1),FCE("I", 0, 2, 1),
++FCE("i", 1, 2, 1),FCE("J", 0, 2, 1),FCE("j", 1, 2, 1),FCE("K", 0, 3, 1),
++FCE("k", 1, 3, 1),FCE("K", 2, 3, 1),FCE("L", 0, 2, 1),FCE("l", 1, 2, 1),
++FCE("M", 0, 2, 1),FCE("m", 1, 2, 1),FCE("N", 0, 2, 1),FCE("n", 1, 2, 1),
++FCE("O", 0, 2, 1),FCE("o", 1, 2, 1),FCE("P", 0, 2, 1),FCE("p", 1, 2, 1),
++FCE("Q", 0, 2, 1),FCE("q", 1, 2, 1),FCE("R", 0, 2, 1),FCE("r", 1, 2, 1),
++FCE("S", 0, 3, 1),FCE("s", 1, 3, 1),FCE("ſ", 2, 3, 1),FCE("T", 0, 2, 1),
++FCE("t", 1, 2, 1),FCE("U", 0, 2, 1),FCE("u", 1, 2, 1),FCE("V", 0, 2, 1),
++FCE("v", 1, 2, 1),FCE("W", 0, 2, 1),FCE("w", 1, 2, 1),FCE("X", 0, 2, 1),
++FCE("x", 1, 2, 1),FCE("Y", 0, 2, 1),FCE("y", 1, 2, 1),FCE("Z", 0, 2, 1),
++FCE("z", 1, 2, 1),FCE("Ⰿ", 0, 2, 1),FCE("ⰿ", 1, 2, 1),FCE("Ⱀ", 0, 2, 1),
++FCE("ⱀ", 1, 2, 1),FCE("𐐂", 0, 2, 1),FCE("𐐪", 1, 2, 1),FCE("Ⳅ", 0, 2, 1),
++FCE("ⳅ", 1, 2, 1),FCE("Ⅶ", 0, 2, 1),FCE("ⅶ", 1, 2, 1),FCE("Ⱁ", 0, 2, 1),
++FCE("ⱁ", 1, 2, 1),FCE("Ⱂ", 0, 2, 1),FCE("ⱂ", 1, 2, 1),FCE("Ⅸ", 0, 2, 1),
++FCE("ⅸ", 1, 2, 1),FCE("Ⱃ", 0, 2, 1),FCE("ⱃ", 1, 2, 1),FCE("Ꚃ", 0, 2, 1),
++FCE("ꚃ", 1, 2, 1),FCE("Ⱄ", 0, 2, 1),FCE("ⱄ", 1, 2, 1),FCE("Ⅺ", 0, 2, 1),
++FCE("ⅺ", 1, 2, 1),FCE("Ⓡ", 0, 2, 1),FCE("ⓡ", 1, 2, 1),FCE("Ⱅ", 0, 2, 1),
++FCE("ⱅ", 1, 2, 1),FCE("𐐃", 0, 2, 1),FCE("𐐫", 1, 2, 1),FCE("Ⱆ", 0, 2, 1),
++FCE("ⱆ", 1, 2, 1),FCE("Ⅼ", 0, 2, 1),FCE("ⅼ", 1, 2, 1),FCE("Ⱇ", 0, 2, 1),
++FCE("ⱇ", 1, 2, 1),FCE("X", 0, 2, 1),FCE("x", 1, 2, 1),FCE("Ⱈ", 0, 2, 1),
++FCE("ⱈ", 1, 2, 1),FCE("Ⅾ", 0, 2, 1),FCE("ⅾ", 1, 2, 1),FCE("Ⱉ", 0, 2, 1),
++FCE("ⱉ", 1, 2, 1),FCE("Ⱊ", 0, 2, 1),FCE("ⱊ", 1, 2, 1),FCE("Ⱎ", 0, 2, 1),
++FCE("ⱎ", 1, 2, 1),FCE("Ⴀ", 0, 2, 1),FCE("ⴀ", 1, 2, 1),FCE("Ⴁ", 0, 2, 1),
++FCE("ⴁ", 1, 2, 1),FCE("Ⴂ", 0, 2, 1),FCE("ⴂ", 1, 2, 1),FCE("Ⴃ", 0, 2, 1),
++FCE("ⴃ", 1, 2, 1),FCE("Ⴄ", 0, 2, 1),FCE("ⴄ", 1, 2, 1),FCE("Ⴅ", 0, 2, 1),
++FCE("ⴅ", 1, 2, 1),FCE("Ⴆ", 0, 2, 1),FCE("ⴆ", 1, 2, 1),FCE("Ⴇ", 0, 2, 1),
++FCE("ⴇ", 1, 2, 1),FCE("Ⴈ", 0, 2, 1),FCE("ⴈ", 1, 2, 1),FCE("Ⴉ", 0, 2, 1),
++FCE("ⴉ", 1, 2, 1),FCE("Ⴊ", 0, 2, 1),FCE("ⴊ", 1, 2, 1),FCE("Ⴋ", 0, 2, 1),
++FCE("ⴋ", 1, 2, 1),FCE("Ⴌ", 0, 2, 1),FCE("ⴌ", 1, 2, 1),FCE("Ⴍ", 0, 2, 1),
++FCE("ⴍ", 1, 2, 1),FCE("Ⴎ", 0, 2, 1),FCE("ⴎ", 1, 2, 1),FCE("Ⴏ", 0, 2, 1),
++FCE("ⴏ", 1, 2, 1),FCE("Ⴐ", 0, 2, 1),FCE("ⴐ", 1, 2, 1),FCE("Ⴑ", 0, 2, 1),
++FCE("ⴑ", 1, 2, 1),FCE("Ⴒ", 0, 2, 1),FCE("ⴒ", 1, 2, 1),FCE("Ⴓ", 0, 2, 1),
++FCE("ⴓ", 1, 2, 1),FCE("Ⴔ", 0, 2, 1),FCE("ⴔ", 1, 2, 1),FCE("Ⴕ", 0, 2, 1),
++FCE("ⴕ", 1, 2, 1),FCE("Ⴖ", 0, 2, 1),FCE("ⴖ", 1, 2, 1),FCE("Ⴗ", 0, 2, 1),
++FCE("ⴗ", 1, 2, 1),FCE("Ⴘ", 0, 2, 1),FCE("ⴘ", 1, 2, 1),FCE("Ⴙ", 0, 2, 1),
++FCE("ⴙ", 1, 2, 1),FCE("Ⴚ", 0, 2, 1),FCE("ⴚ", 1, 2, 1),FCE("Ⴛ", 0, 2, 1),
++FCE("ⴛ", 1, 2, 1),FCE("Ⴜ", 0, 2, 1),FCE("ⴜ", 1, 2, 1),FCE("Ⴝ", 0, 2, 1),
++FCE("ⴝ", 1, 2, 1),FCE("Ⴞ", 0, 2, 1),FCE("ⴞ", 1, 2, 1),FCE("Ⴟ", 0, 2, 1),
++FCE("ⴟ", 1, 2, 1),FCE("À", 0, 2, 1),FCE("à", 1, 2, 1),FCE("Á", 0, 2, 1),
++FCE("á", 1, 2, 1),FCE("Ⴢ", 0, 2, 1),FCE("ⴢ", 1, 2, 1),FCE("Ã", 0, 2, 1),
++FCE("ã", 1, 2, 1),FCE("Ⴤ", 0, 2, 1),FCE("ⴤ", 1, 2, 1),FCE("Å", 0, 3, 1),
++FCE("å", 1, 3, 1),FCE("Å", 2, 3, 1),FCE("Æ", 0, 2, 1),FCE("æ", 1, 2, 1),
++FCE("Ç", 0, 2, 1),FCE("ç", 1, 2, 1),FCE("È", 0, 2, 1),FCE("è", 1, 2, 1),
++FCE("É", 0, 2, 1),FCE("é", 1, 2, 1),FCE("Ê", 0, 2, 1),FCE("ê", 1, 2, 1),
++FCE("Ë", 0, 2, 1),FCE("ë", 1, 2, 1),FCE("Ì", 0, 2, 1),FCE("ì", 1, 2, 1),
++FCE("Í", 0, 2, 1),FCE("í", 1, 2, 1),FCE("Î", 0, 2, 1),FCE("î", 1, 2, 1),
++FCE("Ï", 0, 2, 1),FCE("ï", 1, 2, 1),FCE("Ð", 0, 2, 1),FCE("ð", 1, 2, 1),
++FCE("Ñ", 0, 2, 1),FCE("ñ", 1, 2, 1),FCE("Ò", 0, 2, 1),FCE("ò", 1, 2, 1),
++FCE("Ó", 0, 2, 1),FCE("ó", 1, 2, 1),FCE("Ô", 0, 2, 1),FCE("ô", 1, 2, 1),
++FCE("Õ", 0, 2, 1),FCE("õ", 1, 2, 1),FCE("Ö", 0, 2, 1),FCE("ö", 1, 2, 1),
++FCE("Ø", 0, 2, 1),FCE("ø", 1, 2, 1),FCE("Ù", 0, 2, 1),FCE("ù", 1, 2, 1),
++FCE("Ú", 0, 2, 1),FCE("ú", 1, 2, 1),FCE("Û", 0, 2, 1),FCE("û", 1, 2, 1),
++FCE("Ü", 0, 2, 1),FCE("ü", 1, 2, 1),FCE("Ý", 0, 2, 1),FCE("ý", 1, 2, 1),
++FCE("Þ", 0, 2, 1),FCE("þ", 1, 2, 1),FCE("ß", 0, 3, 1),FCE("ẞ", 1, 3, 1),
++FCE("ss", 2, 3, 2),FCE("Ⱖ", 0, 2, 1),FCE("ⱖ", 1, 2, 1),FCE("Ⱗ", 0, 2, 1),
++FCE("ⱗ", 1, 2, 1),FCE("Ⱘ", 0, 2, 1),FCE("ⱘ", 1, 2, 1),FCE("𐐆", 0, 2, 1),
++FCE("𐐮", 1, 2, 1),FCE("𐐏", 0, 2, 1),FCE("𐐷", 1, 2, 1),FCE("Ⓥ", 0, 2, 1),
++FCE("ⓥ", 1, 2, 1),FCE("Ⱙ", 0, 2, 1),FCE("ⱙ", 1, 2, 1),FCE("𐐇", 0, 2, 1),
++FCE("𐐯", 1, 2, 1),FCE("Ⱚ", 0, 2, 1),FCE("ⱚ", 1, 2, 1),FCE("Ā", 0, 2, 1),
++FCE("ā", 1, 2, 1),FCE("Ă", 0, 2, 1),FCE("ă", 1, 2, 1),FCE("Ⱛ", 0, 2, 1),
++FCE("ⱛ", 1, 2, 1),FCE("Ą", 0, 2, 1),FCE("ą", 1, 2, 1),FCE("Ć", 0, 2, 1),
++FCE("ć", 1, 2, 1),FCE("Ĉ", 0, 2, 1),FCE("ĉ", 1, 2, 1),FCE("Ⱜ", 0, 2, 1),
++FCE("ⱜ", 1, 2, 1),FCE("Ċ", 0, 2, 1),FCE("ċ", 1, 2, 1),FCE("Č", 0, 2, 1),
++FCE("č", 1, 2, 1),FCE("Ď", 0, 2, 1),FCE("ď", 1, 2, 1),FCE("Ⱝ", 0, 2, 1),
++FCE("ⱝ", 1, 2, 1),FCE("Đ", 0, 2, 1),FCE("đ", 1, 2, 1),FCE("Ē", 0, 2, 1),
++FCE("ē", 1, 2, 1),FCE("Ĕ", 0, 2, 1),FCE("ĕ", 1, 2, 1),FCE("Ⱞ", 0, 2, 1),
++FCE("ⱞ", 1, 2, 1),FCE("Ė", 0, 2, 1),FCE("ė", 1, 2, 1),FCE("Ę", 0, 2, 1),
++FCE("ę", 1, 2, 1),FCE("Ě", 0, 2, 1),FCE("ě", 1, 2, 1),FCE("Ĝ", 0, 2, 1),
++FCE("ĝ", 1, 2, 1),FCE("Ğ", 0, 2, 1),FCE("ğ", 1, 2, 1),FCE("Ġ", 0, 2, 1),
++FCE("ġ", 1, 2, 1),FCE("Ģ", 0, 2, 1),FCE("ģ", 1, 2, 1),FCE("K", 0, 2, 1),
++FCE("k", 1, 2, 1),FCE("Ĥ", 0, 2, 1),FCE("ĥ", 1, 2, 1),FCE("Ħ", 0, 2, 1),
++FCE("ħ", 1, 2, 1),FCE("Ĩ", 0, 2, 1),FCE("ĩ", 1, 2, 1),FCE("Ī", 0, 2, 1),
++FCE("ī", 1, 2, 1),FCE("Å", 0, 3, 1),FCE("å", 1, 3, 1),FCE("Å", 2, 3, 1),
++FCE("Ĭ", 0, 2, 1),FCE("ĭ", 1, 2, 1),FCE("Į", 0, 2, 1),FCE("į", 1, 2, 1),
++FCE("İ", 0, 2, 1),FCE("i̇", 1, 2, 2),FCE("IJ", 0, 2, 1),FCE("ij", 1, 2, 1),
++FCE("Ĵ", 0, 2, 1),FCE("ĵ", 1, 2, 1),FCE("Ķ", 0, 2, 1),FCE("ķ", 1, 2, 1),
++FCE("Ĺ", 0, 2, 1),FCE("ĺ", 1, 2, 1),FCE("Ļ", 0, 2, 1),FCE("ļ", 1, 2, 1),
++FCE("Ⳟ", 0, 2, 1),FCE("ⳟ", 1, 2, 1),FCE("Ľ", 0, 2, 1),FCE("ľ", 1, 2, 1),
++FCE("Ŀ", 0, 2, 1),FCE("ŀ", 1, 2, 1),FCE("Ł", 0, 2, 1),FCE("ł", 1, 2, 1),
++FCE("Ń", 0, 2, 1),FCE("ń", 1, 2, 1),FCE("Ņ", 0, 2, 1),FCE("ņ", 1, 2, 1),
++FCE("Ň", 0, 2, 1),FCE("ň", 1, 2, 1),FCE("ʼn", 0, 2, 1),FCE("ʼn", 1, 2, 2),
++FCE("Ŋ", 0, 2, 1),FCE("ŋ", 1, 2, 1),FCE("Ō", 0, 2, 1),FCE("ō", 1, 2, 1),
++FCE("Ŏ", 0, 2, 1),FCE("ŏ", 1, 2, 1),FCE("Ő", 0, 2, 1),FCE("ő", 1, 2, 1),
++FCE("Œ", 0, 2, 1),FCE("œ", 1, 2, 1),FCE("Ŕ", 0, 2, 1),FCE("ŕ", 1, 2, 1),
++FCE("Ŗ", 0, 2, 1),FCE("ŗ", 1, 2, 1),FCE("Ř", 0, 2, 1),FCE("ř", 1, 2, 1),
++FCE("Ś", 0, 2, 1),FCE("ś", 1, 2, 1),FCE("Ŝ", 0, 2, 1),FCE("ŝ", 1, 2, 1),
++FCE("Ş", 0, 2, 1),FCE("ş", 1, 2, 1),FCE("Š", 0, 2, 1),FCE("š", 1, 2, 1),
++FCE("Ⅱ", 0, 2, 1),FCE("ⅱ", 1, 2, 1),FCE("Ţ", 0, 2, 1),FCE("ţ", 1, 2, 1),
++FCE("Ⅳ", 0, 2, 1),FCE("ⅳ", 1, 2, 1),FCE("Ť", 0, 2, 1),FCE("ť", 1, 2, 1),
++FCE("Ⅵ", 0, 2, 1),FCE("ⅵ", 1, 2, 1),FCE("Ŧ", 0, 2, 1),FCE("ŧ", 1, 2, 1),
++FCE("Ⅷ", 0, 2, 1),FCE("ⅷ", 1, 2, 1),FCE("Ũ", 0, 2, 1),FCE("ũ", 1, 2, 1),
++FCE("Ⅹ", 0, 2, 1),FCE("ⅹ", 1, 2, 1),FCE("Ū", 0, 2, 1),FCE("ū", 1, 2, 1),
++FCE("Ⅻ", 0, 2, 1),FCE("ⅻ", 1, 2, 1),FCE("Ŭ", 0, 2, 1),FCE("ŭ", 1, 2, 1),
++FCE("Ⅽ", 0, 2, 1),FCE("ⅽ", 1, 2, 1),FCE("Ů", 0, 2, 1),FCE("ů", 1, 2, 1),
++FCE("Ⅿ", 0, 2, 1),FCE("ⅿ", 1, 2, 1),FCE("Ű", 0, 2, 1),FCE("ű", 1, 2, 1),
++FCE("Ⳍ", 0, 2, 1),FCE("ⳍ", 1, 2, 1),FCE("Ų", 0, 2, 1),FCE("ų", 1, 2, 1),
++FCE("Ŵ", 0, 2, 1),FCE("ŵ", 1, 2, 1),FCE("Ŷ", 0, 2, 1),FCE("ŷ", 1, 2, 1),
++FCE("ÿ", 0, 2, 1),FCE("Ÿ", 1, 2, 1),FCE("Ź", 0, 2, 1),FCE("ź", 1, 2, 1),
++FCE("Ż", 0, 2, 1),FCE("ż", 1, 2, 1),FCE("Ž", 0, 2, 1),FCE("ž", 1, 2, 1),
++FCE("S", 0, 3, 1),FCE("s", 1, 3, 1),FCE("ſ", 2, 3, 1),FCE("Ɓ", 0, 2, 1),
++FCE("ɓ", 1, 2, 1),FCE("Ƃ", 0, 2, 1),FCE("ƃ", 1, 2, 1),FCE("Ↄ", 0, 2, 1),
++FCE("ↄ", 1, 2, 1),FCE("Ƅ", 0, 2, 1),FCE("ƅ", 1, 2, 1),FCE("Ɔ", 0, 2, 1),
++FCE("ɔ", 1, 2, 1),FCE("Ƈ", 0, 2, 1),FCE("ƈ", 1, 2, 1),FCE("Ɖ", 0, 2, 1),
++FCE("ɖ", 1, 2, 1),FCE("Ɗ", 0, 2, 1),FCE("ɗ", 1, 2, 1),FCE("Ƌ", 0, 2, 1),
++FCE("ƌ", 1, 2, 1),FCE("Ǝ", 0, 2, 1),FCE("ǝ", 1, 2, 1),FCE("Ə", 0, 2, 1),
++FCE("ə", 1, 2, 1),FCE("Ɛ", 0, 2, 1),FCE("ɛ", 1, 2, 1),FCE("Ƒ", 0, 2, 1),
++FCE("ƒ", 1, 2, 1),FCE("Ɠ", 0, 2, 1),FCE("ɠ", 1, 2, 1),FCE("Ɣ", 0, 2, 1),
++FCE("ɣ", 1, 2, 1),FCE("Ɩ", 0, 2, 1),FCE("ɩ", 1, 2, 1),FCE("Ɨ", 0, 2, 1),
++FCE("ɨ", 1, 2, 1),FCE("Ƙ", 0, 2, 1),FCE("ƙ", 1, 2, 1),FCE("Ɯ", 0, 2, 1),
++FCE("ɯ", 1, 2, 1),FCE("Ɲ", 0, 2, 1),FCE("ɲ", 1, 2, 1),FCE("Ꙋ", 0, 2, 1),
++FCE("ꙋ", 1, 2, 1),FCE("Ɵ", 0, 2, 1),FCE("ɵ", 1, 2, 1),FCE("Ơ", 0, 2, 1),
++FCE("ơ", 1, 2, 1),FCE("Ƣ", 0, 2, 1),FCE("ƣ", 1, 2, 1),FCE("Ƥ", 0, 2, 1),
++FCE("ƥ", 1, 2, 1),FCE("Ʀ", 0, 2, 1),FCE("ʀ", 1, 2, 1),FCE("Ƨ", 0, 2, 1),
++FCE("ƨ", 1, 2, 1),FCE("Ʃ", 0, 2, 1),FCE("ʃ", 1, 2, 1),FCE("Ƭ", 0, 2, 1),
++FCE("ƭ", 1, 2, 1),FCE("Ʈ", 0, 2, 1),FCE("ʈ", 1, 2, 1),FCE("Ư", 0, 2, 1),
++FCE("ư", 1, 2, 1),FCE("Ʊ", 0, 2, 1),FCE("ʊ", 1, 2, 1),FCE("Ʋ", 0, 2, 1),
++FCE("ʋ", 1, 2, 1),FCE("Ƴ", 0, 2, 1),FCE("ƴ", 1, 2, 1),FCE("Ƶ", 0, 2, 1),
++FCE("ƶ", 1, 2, 1),FCE("Ʒ", 0, 2, 1),FCE("ʒ", 1, 2, 1),FCE("Ƹ", 0, 2, 1),
++FCE("ƹ", 1, 2, 1),FCE("Ƽ", 0, 2, 1),FCE("ƽ", 1, 2, 1),FCE("DŽ", 0, 3, 1),
++FCE("Dž", 1, 3, 1),FCE("dž", 2, 3, 1),FCE("DŽ", 0, 3, 1),FCE("Dž", 1, 3, 1),
++FCE("dž", 2, 3, 1),FCE("LJ", 0, 3, 1),FCE("Lj", 1, 3, 1),FCE("lj", 2, 3, 1),
++FCE("LJ", 0, 3, 1),FCE("Lj", 1, 3, 1),FCE("lj", 2, 3, 1),FCE("NJ", 0, 3, 1),
++FCE("Nj", 1, 3, 1),FCE("nj", 2, 3, 1),FCE("NJ", 0, 3, 1),FCE("Nj", 1, 3, 1),
++FCE("nj", 2, 3, 1),FCE("Ǎ", 0, 2, 1),FCE("ǎ", 1, 2, 1),FCE("Ǐ", 0, 2, 1),
++FCE("ǐ", 1, 2, 1),FCE("Ǒ", 0, 2, 1),FCE("ǒ", 1, 2, 1),FCE("Ǔ", 0, 2, 1),
++FCE("ǔ", 1, 2, 1),FCE("Ǖ", 0, 2, 1),FCE("ǖ", 1, 2, 1),FCE("Ǘ", 0, 2, 1),
++FCE("ǘ", 1, 2, 1),FCE("Ǚ", 0, 2, 1),FCE("ǚ", 1, 2, 1),FCE("Ǜ", 0, 2, 1),
++FCE("ǜ", 1, 2, 1),FCE("Ǟ", 0, 2, 1),FCE("ǟ", 1, 2, 1),FCE("V", 0, 2, 1),
++FCE("v", 1, 2, 1),FCE("Ǡ", 0, 2, 1),FCE("ǡ", 1, 2, 1),FCE("Ǣ", 0, 2, 1),
++FCE("ǣ", 1, 2, 1),FCE("Ǥ", 0, 2, 1),FCE("ǥ", 1, 2, 1),FCE("Ǧ", 0, 2, 1),
++FCE("ǧ", 1, 2, 1),FCE("Ǩ", 0, 2, 1),FCE("ǩ", 1, 2, 1),FCE("Ǫ", 0, 2, 1),
++FCE("ǫ", 1, 2, 1),FCE("Ǭ", 0, 2, 1),FCE("ǭ", 1, 2, 1),FCE("Ǯ", 0, 2, 1),
++FCE("ǯ", 1, 2, 1),FCE("ǰ", 0, 2, 1),FCE("ǰ", 1, 2, 2),FCE("DZ", 0, 3, 1),
++FCE("Dz", 1, 3, 1),FCE("dz", 2, 3, 1),FCE("DZ", 0, 3, 1),FCE("Dz", 1, 3, 1),
++FCE("dz", 2, 3, 1),FCE("Ǵ", 0, 2, 1),FCE("ǵ", 1, 2, 1),FCE("ƕ", 0, 2, 1),
++FCE("Ƕ", 1, 2, 1),FCE("ƿ", 0, 2, 1),FCE("Ƿ", 1, 2, 1),FCE("Ǹ", 0, 2, 1),
++FCE("ǹ", 1, 2, 1),FCE("𐐝", 0, 2, 1),FCE("𐑅", 1, 2, 1),FCE("Ǻ", 0, 2, 1),
++FCE("ǻ", 1, 2, 1),FCE("Ǽ", 0, 2, 1),FCE("ǽ", 1, 2, 1),FCE("Ǿ", 0, 2, 1),
++FCE("ǿ", 1, 2, 1),FCE("Ȁ", 0, 2, 1),FCE("ȁ", 1, 2, 1),FCE("Ȃ", 0, 2, 1),
++FCE("ȃ", 1, 2, 1),FCE("Ȅ", 0, 2, 1),FCE("ȅ", 1, 2, 1),FCE("Ȇ", 0, 2, 1),
++FCE("ȇ", 1, 2, 1),FCE("fi", 0, 2, 1),FCE("fi", 1, 2, 2),FCE("Ȉ", 0, 2, 1),
++FCE("ȉ", 1, 2, 1),FCE("Ȋ", 0, 2, 1),FCE("ȋ", 1, 2, 1),FCE("Ȍ", 0, 2, 1),
++FCE("ȍ", 1, 2, 1),FCE("Ȏ", 0, 2, 1),FCE("ȏ", 1, 2, 1),FCE("Ȑ", 0, 2, 1),
++FCE("ȑ", 1, 2, 1),FCE("Ȓ", 0, 2, 1),FCE("ȓ", 1, 2, 1),FCE("Ȕ", 0, 2, 1),
++FCE("ȕ", 1, 2, 1),FCE("Ȗ", 0, 2, 1),FCE("ȗ", 1, 2, 1),FCE("Ș", 0, 2, 1),
++FCE("ș", 1, 2, 1),FCE("Ț", 0, 2, 1),FCE("ț", 1, 2, 1),FCE("Ȝ", 0, 2, 1),
++FCE("ȝ", 1, 2, 1),FCE("Ȟ", 0, 2, 1),FCE("ȟ", 1, 2, 1),FCE("ƞ", 0, 2, 1),
++FCE("Ƞ", 1, 2, 1),FCE("Ȣ", 0, 2, 1),FCE("ȣ", 1, 2, 1),FCE("Ȥ", 0, 2, 1),
++FCE("ȥ", 1, 2, 1),FCE("Ȧ", 0, 2, 1),FCE("ȧ", 1, 2, 1),FCE("Ȩ", 0, 2, 1),
++FCE("ȩ", 1, 2, 1),FCE("Ꝗ", 0, 2, 1),FCE("ꝗ", 1, 2, 1),FCE("Ȫ", 0, 2, 1),
++FCE("ȫ", 1, 2, 1),FCE("Ȭ", 0, 2, 1),FCE("ȭ", 1, 2, 1),FCE("Ȯ", 0, 2, 1),
++FCE("ȯ", 1, 2, 1),FCE("Ȱ", 0, 2, 1),FCE("ȱ", 1, 2, 1),FCE("Ȳ", 0, 2, 1),
++FCE("ȳ", 1, 2, 1),FCE("Ꚅ", 0, 2, 1),FCE("ꚅ", 1, 2, 1),FCE("Ⱥ", 0, 2, 1),
++FCE("ⱥ", 1, 2, 1),FCE("Ȼ", 0, 2, 1),FCE("ȼ", 1, 2, 1),FCE("ƚ", 0, 2, 1),
++FCE("Ƚ", 1, 2, 1),FCE("Ⱦ", 0, 2, 1),FCE("ⱦ", 1, 2, 1),FCE("Ɂ", 0, 2, 1),
++FCE("ɂ", 1, 2, 1),FCE("𐐒", 0, 2, 1),FCE("𐐺", 1, 2, 1),FCE("ƀ", 0, 2, 1),
++FCE("Ƀ", 1, 2, 1),FCE("Ʉ", 0, 2, 1),FCE("ʉ", 1, 2, 1),FCE("Ʌ", 0, 2, 1),
++FCE("ʌ", 1, 2, 1),FCE("Ɇ", 0, 2, 1),FCE("ɇ", 1, 2, 1),FCE("Ɉ", 0, 2, 1),
++FCE("ɉ", 1, 2, 1),FCE("Ɋ", 0, 2, 1),FCE("ɋ", 1, 2, 1),FCE("Ɍ", 0, 2, 1),
++FCE("ɍ", 1, 2, 1),FCE("Ⱋ", 0, 2, 1),FCE("ⱋ", 1, 2, 1),FCE("Ɏ", 0, 2, 1),
++FCE("ɏ", 1, 2, 1),FCE("𐐊", 0, 2, 1),FCE("𐐲", 1, 2, 1),FCE("Ⅰ", 0, 2, 1),
++FCE("ⅰ", 1, 2, 1),FCE("Ꚓ", 0, 2, 1),FCE("ꚓ", 1, 2, 1),FCE("ɽ", 0, 2, 1),
++FCE("Ɽ", 1, 2, 1),FCE("𐐐", 0, 2, 1),FCE("𐐸", 1, 2, 1),FCE("Ⱑ", 0, 2, 1),
++FCE("ⱑ", 1, 2, 1),FCE("Ⱪ", 0, 2, 1),FCE("ⱪ", 1, 2, 1),FCE("𐐉", 0, 2, 1),
++FCE("𐐱", 1, 2, 1),FCE("𐐔", 0, 2, 1),FCE("𐐼", 1, 2, 1),FCE("ﬕ", 0, 2, 1),
++FCE("մի", 1, 2, 2),FCE("Ⅲ", 0, 2, 1),FCE("ⅲ", 1, 2, 1),FCE("𐐞", 0, 2, 1),
++FCE("𐑆", 1, 2, 1),FCE("ɱ", 0, 2, 1),FCE("Ɱ", 1, 2, 1),FCE("𐐕", 0, 2, 1),
++FCE("𐐽", 1, 2, 1),FCE("ɒ", 0, 2, 1),FCE("Ɒ", 1, 2, 1),FCE("Ⱳ", 0, 2, 1),
++FCE("ⱳ", 1, 2, 1),FCE("Ⰻ", 0, 2, 1),FCE("ⰻ", 1, 2, 1),FCE("𐐖", 0, 2, 1),
++FCE("𐐾", 1, 2, 1),FCE("Ꚗ", 0, 2, 1),FCE("ꚗ", 1, 2, 1),FCE("Ⱶ", 0, 2, 1),
++FCE("ⱶ", 1, 2, 1),FCE("Ⅴ", 0, 2, 1),FCE("ⅴ", 1, 2, 1),FCE("Ꙁ", 0, 2, 1),
++FCE("ꙁ", 1, 2, 1),FCE("B", 0, 2, 1),FCE("b", 1, 2, 1),FCE("Ⰼ", 0, 2, 1),
++FCE("ⰼ", 1, 2, 1),FCE("𐐗", 0, 2, 1),FCE("𐐿", 1, 2, 1),FCE("D", 0, 2, 1),
++FCE("d", 1, 2, 1),FCE("E", 0, 2, 1),FCE("e", 1, 2, 1),FCE("F", 0, 2, 1),
++FCE("f", 1, 2, 1),FCE("Ⰽ", 0, 2, 1),FCE("ⰽ", 1, 2, 1),FCE("Ⓛ", 0, 2, 1),
++FCE("ⓛ", 1, 2, 1),FCE("Ꜩ", 0, 2, 1),FCE("ꜩ", 1, 2, 1),FCE("ȿ", 0, 2, 1),
++FCE("Ȿ", 1, 2, 1),FCE("𐐑", 0, 2, 1),FCE("𐐹", 1, 2, 1),FCE("I", 0, 2, 1),
++FCE("i", 1, 2, 1),FCE("𐐋", 0, 2, 1),FCE("𐐳", 1, 2, 1),FCE("Ꜫ", 0, 2, 1),
++FCE("ꜫ", 1, 2, 1),FCE("ff", 0, 2, 1),FCE("ff", 1, 2, 2),FCE("Ⲁ", 0, 2, 1),
++FCE("ⲁ", 1, 2, 1),FCE("fl", 0, 2, 1),FCE("fl", 1, 2, 2),FCE("ffi", 0, 2, 1),
++FCE("ffi", 1, 2, 3),FCE("ffl", 0, 2, 1),FCE("ffl", 1, 2, 3),FCE("ſt", 0, 3, 1),
++FCE("st", 1, 3, 1),FCE("st", 2, 3, 2),FCE("ſt", 0, 3, 1),FCE("st", 1, 3, 1),
++FCE("st", 2, 3, 2),FCE("Ꜭ", 0, 2, 1),FCE("ꜭ", 1, 2, 1),FCE("Ⰾ", 0, 2, 1),
++FCE("ⰾ", 1, 2, 1),FCE("M", 0, 2, 1),FCE("m", 1, 2, 1),FCE("ﬓ", 0, 2, 1),
++FCE("մն", 1, 2, 2),FCE("ﬔ", 0, 2, 1),FCE("մե", 1, 2, 2),FCE("Ꜯ", 0, 2, 1),
++FCE("ꜯ", 1, 2, 1),FCE("ﬖ", 0, 2, 1),FCE("վն", 1, 2, 2),FCE("ﬗ", 0, 2, 1),
++FCE("մխ", 1, 2, 2),FCE("𐐍", 0, 2, 1),FCE("𐐵", 1, 2, 1),FCE("O", 0, 2, 1),
++FCE("o", 1, 2, 1),FCE("Q", 0, 2, 1),FCE("q", 1, 2, 1),FCE("R", 0, 2, 1),
++FCE("r", 1, 2, 1),FCE("𐐚", 0, 2, 1),FCE("𐑂", 1, 2, 1),FCE("T", 0, 2, 1),
++FCE("t", 1, 2, 1),FCE("Ⲙ", 0, 2, 1),FCE("ⲙ", 1, 2, 1),FCE("Ⲋ", 0, 2, 1),
++FCE("ⲋ", 1, 2, 1),FCE("ͅ", 0, 4, 1),FCE("Ι", 1, 4, 1),FCE("ι", 2, 4, 1),
++FCE("ι", 3, 4, 1),FCE("Ⲍ", 0, 2, 1),FCE("ⲍ", 1, 2, 1),FCE("W", 0, 2, 1),
++FCE("w", 1, 2, 1),FCE("Ꙗ", 0, 2, 1),FCE("ꙗ", 1, 2, 1),FCE("𐐛", 0, 2, 1),
++FCE("𐑃", 1, 2, 1),FCE("Ꜹ", 0, 2, 1),FCE("ꜹ", 1, 2, 1),FCE("Ⲏ", 0, 2, 1),
++FCE("ⲏ", 1, 2, 1),FCE("Y", 0, 2, 1),FCE("y", 1, 2, 1),FCE("𐐄", 0, 2, 1),
++FCE("𐐬", 1, 2, 1),FCE("Ꜻ", 0, 2, 1),FCE("ꜻ", 1, 2, 1),FCE("Ⲑ", 0, 2, 1),
++FCE("ⲑ", 1, 2, 1),FCE("Ꜽ", 0, 2, 1),FCE("ꜽ", 1, 2, 1),FCE("Ⲓ", 0, 2, 1),
++FCE("ⲓ", 1, 2, 1),FCE("𐐜", 0, 2, 1),FCE("𐑄", 1, 2, 1),FCE("Ͱ", 0, 2, 1),
++FCE("ͱ", 1, 2, 1),FCE("Ͳ", 0, 2, 1),FCE("ͳ", 1, 2, 1),FCE("Ꜿ", 0, 2, 1),
++FCE("ꜿ", 1, 2, 1),FCE("Ͷ", 0, 2, 1),FCE("ͷ", 1, 2, 1),FCE("Ⲕ", 0, 2, 1),
++FCE("ⲕ", 1, 2, 1),FCE("Ⲗ", 0, 2, 1),FCE("ⲗ", 1, 2, 1),FCE("Ά", 0, 2, 1),
++FCE("ά", 1, 2, 1),FCE("𐐅", 0, 2, 1),FCE("𐐭", 1, 2, 1),FCE("Έ", 0, 2, 1),
++FCE("έ", 1, 2, 1),FCE("Ή", 0, 2, 1),FCE("ή", 1, 2, 1),FCE("Ί", 0, 2, 1),
++FCE("ί", 1, 2, 1),FCE("Ό", 0, 2, 1),FCE("ό", 1, 2, 1),FCE("Ύ", 0, 2, 1),
++FCE("ύ", 1, 2, 1),FCE("Ώ", 0, 2, 1),FCE("ώ", 1, 2, 1),FCE("ΐ", 0, 3, 1),
++FCE("ΐ", 1, 3, 1),FCE("ΐ", 2, 3, 3),FCE("Α", 0, 2, 1),FCE("α", 1, 2, 1),
++FCE("Β", 0, 3, 1),FCE("β", 1, 3, 1),FCE("ϐ", 2, 3, 1),FCE("Γ", 0, 2, 1),
++FCE("γ", 1, 2, 1),FCE("Δ", 0, 2, 1),FCE("δ", 1, 2, 1),FCE("Ε", 0, 3, 1),
++FCE("ε", 1, 3, 1),FCE("ϵ", 2, 3, 1),FCE("Ζ", 0, 2, 1),FCE("ζ", 1, 2, 1),
++FCE("Η", 0, 2, 1),FCE("η", 1, 2, 1),FCE("Θ", 0, 4, 1),FCE("θ", 1, 4, 1),
++FCE("ϑ", 2, 4, 1),FCE("ϴ", 3, 4, 1),FCE("ͅ", 0, 4, 1),FCE("Ι", 1, 4, 1),
++FCE("ι", 2, 4, 1),FCE("ι", 3, 4, 1),FCE("Κ", 0, 3, 1),FCE("κ", 1, 3, 1),
++FCE("ϰ", 2, 3, 1),FCE("Λ", 0, 2, 1),FCE("λ", 1, 2, 1),FCE("µ", 0, 3, 1),
++FCE("Μ", 1, 3, 1),FCE("μ", 2, 3, 1),FCE("Ν", 0, 2, 1),FCE("ν", 1, 2, 1),
++FCE("Ξ", 0, 2, 1),FCE("ξ", 1, 2, 1),FCE("Ο", 0, 2, 1),FCE("ο", 1, 2, 1),
++FCE("Π", 0, 3, 1),FCE("π", 1, 3, 1),FCE("ϖ", 2, 3, 1),FCE("Ρ", 0, 3, 1),
++FCE("ρ", 1, 3, 1),FCE("ϱ", 2, 3, 1),FCE("Σ", 0, 3, 1),FCE("ς", 1, 3, 1),
++FCE("σ", 2, 3, 1),FCE("Τ", 0, 2, 1),FCE("τ", 1, 2, 1),FCE("Υ", 0, 2, 1),
++FCE("υ", 1, 2, 1),FCE("Φ", 0, 3, 1),FCE("φ", 1, 3, 1),FCE("ϕ", 2, 3, 1),
++FCE("Χ", 0, 2, 1),FCE("χ", 1, 2, 1),FCE("Ψ", 0, 2, 1),FCE("ψ", 1, 2, 1),
++FCE("Ω", 0, 3, 1),FCE("ω", 1, 3, 1),FCE("Ω", 2, 3, 1),FCE("Ϊ", 0, 2, 1),
++FCE("ϊ", 1, 2, 1),FCE("Ϋ", 0, 2, 1),FCE("ϋ", 1, 2, 1),FCE("Ⓣ", 0, 2, 1),
++FCE("ⓣ", 1, 2, 1),FCE("Ⳡ", 0, 2, 1),FCE("ⳡ", 1, 2, 1),FCE("ΰ", 0, 3, 1),
++FCE("ΰ", 1, 3, 1),FCE("ΰ", 2, 3, 3),FCE("Ꝉ", 0, 2, 1),FCE("ꝉ", 1, 2, 1),
++FCE("Ⲝ", 0, 2, 1),FCE("ⲝ", 1, 2, 1),FCE("Ⲟ", 0, 2, 1),FCE("ⲟ", 1, 2, 1),
++FCE("Ꝋ", 0, 2, 1),FCE("ꝋ", 1, 2, 1),FCE("Ⲡ", 0, 2, 1),FCE("ⲡ", 1, 2, 1),
++FCE("Σ", 0, 3, 1),FCE("ς", 1, 3, 1),FCE("σ", 2, 3, 1),FCE("𐐟", 0, 2, 1),
++FCE("𐑇", 1, 2, 1),FCE("Ꝍ", 0, 2, 1),FCE("ꝍ", 1, 2, 1),FCE("Ꚋ", 0, 2, 1),
++FCE("ꚋ", 1, 2, 1),FCE("Ⲣ", 0, 2, 1),FCE("ⲣ", 1, 2, 1),FCE("Ϗ", 0, 2, 1),
++FCE("ϗ", 1, 2, 1),FCE("Β", 0, 3, 1),FCE("β", 1, 3, 1),FCE("ϐ", 2, 3, 1),
++FCE("Θ", 0, 4, 1),FCE("θ", 1, 4, 1),FCE("ϑ", 2, 4, 1),FCE("ϴ", 3, 4, 1),
++FCE("Φ", 0, 3, 1),FCE("φ", 1, 3, 1),FCE("ϕ", 2, 3, 1),FCE("Π", 0, 3, 1),
++FCE("π", 1, 3, 1),FCE("ϖ", 2, 3, 1),FCE("Ϙ", 0, 2, 1),FCE("ϙ", 1, 2, 1),
++FCE("Ⲥ", 0, 2, 1),FCE("ⲥ", 1, 2, 1),FCE("Ϛ", 0, 2, 1),FCE("ϛ", 1, 2, 1),
++FCE("Ϝ", 0, 2, 1),FCE("ϝ", 1, 2, 1),FCE("Ϟ", 0, 2, 1),FCE("ϟ", 1, 2, 1),
++FCE("Ϡ", 0, 2, 1),FCE("ϡ", 1, 2, 1),FCE("Ꝑ", 0, 2, 1),FCE("ꝑ", 1, 2, 1),
++FCE("Ϣ", 0, 2, 1),FCE("ϣ", 1, 2, 1),FCE("Ϥ", 0, 2, 1),FCE("ϥ", 1, 2, 1),
++FCE("Ⲧ", 0, 2, 1),FCE("ⲧ", 1, 2, 1),FCE("Ϧ", 0, 2, 1),FCE("ϧ", 1, 2, 1),
++FCE("𐐠", 0, 2, 1),FCE("𐑈", 1, 2, 1),FCE("Ϩ", 0, 2, 1),FCE("ϩ", 1, 2, 1),
++FCE("Ⳣ", 0, 2, 1),FCE("ⳣ", 1, 2, 1),FCE("Ϫ", 0, 2, 1),FCE("ϫ", 1, 2, 1),
++FCE("Ϭ", 0, 2, 1),FCE("ϭ", 1, 2, 1),FCE("Ꝓ", 0, 2, 1),FCE("ꝓ", 1, 2, 1),
++FCE("Ϯ", 0, 2, 1),FCE("ϯ", 1, 2, 1),FCE("Κ", 0, 3, 1),FCE("κ", 1, 3, 1),
++FCE("ϰ", 2, 3, 1),FCE("Ρ", 0, 3, 1),FCE("ρ", 1, 3, 1),FCE("ϱ", 2, 3, 1),
++FCE("Θ", 0, 4, 1),FCE("θ", 1, 4, 1),FCE("ϑ", 2, 4, 1),FCE("ϴ", 3, 4, 1),
++FCE("Ε", 0, 3, 1),FCE("ε", 1, 3, 1),FCE("ϵ", 2, 3, 1),FCE("Ϸ", 0, 2, 1),
++FCE("ϸ", 1, 2, 1),FCE("ϲ", 0, 2, 1),FCE("Ϲ", 1, 2, 1),FCE("Ϻ", 0, 2, 1),
++FCE("ϻ", 1, 2, 1),FCE("ͻ", 0, 2, 1),FCE("Ͻ", 1, 2, 1),FCE("ͼ", 0, 2, 1),
++FCE("Ͼ", 1, 2, 1),FCE("ͽ", 0, 2, 1),FCE("Ͽ", 1, 2, 1),FCE("Ѐ", 0, 2, 1),
++FCE("ѐ", 1, 2, 1),FCE("Ё", 0, 2, 1),FCE("ё", 1, 2, 1),FCE("Ђ", 0, 2, 1),
++FCE("ђ", 1, 2, 1),FCE("Ѓ", 0, 2, 1),FCE("ѓ", 1, 2, 1),FCE("Є", 0, 2, 1),
++FCE("є", 1, 2, 1),FCE("Ѕ", 0, 2, 1),FCE("ѕ", 1, 2, 1),FCE("І", 0, 2, 1),
++FCE("і", 1, 2, 1),FCE("Ї", 0, 2, 1),FCE("ї", 1, 2, 1),FCE("Ј", 0, 2, 1),
++FCE("ј", 1, 2, 1),FCE("Љ", 0, 2, 1),FCE("љ", 1, 2, 1),FCE("Њ", 0, 2, 1),
++FCE("њ", 1, 2, 1),FCE("Ћ", 0, 2, 1),FCE("ћ", 1, 2, 1),FCE("Ќ", 0, 2, 1),
++FCE("ќ", 1, 2, 1),FCE("Ѝ", 0, 2, 1),FCE("ѝ", 1, 2, 1),FCE("Ў", 0, 2, 1),
++FCE("ў", 1, 2, 1),FCE("Џ", 0, 2, 1),FCE("џ", 1, 2, 1),FCE("А", 0, 2, 1),
++FCE("а", 1, 2, 1),FCE("Б", 0, 2, 1),FCE("б", 1, 2, 1),FCE("В", 0, 2, 1),
++FCE("в", 1, 2, 1),FCE("Г", 0, 2, 1),FCE("г", 1, 2, 1),FCE("Д", 0, 2, 1),
++FCE("д", 1, 2, 1),FCE("Е", 0, 2, 1),FCE("е", 1, 2, 1),FCE("Ж", 0, 2, 1),
++FCE("ж", 1, 2, 1),FCE("З", 0, 2, 1),FCE("з", 1, 2, 1),FCE("И", 0, 2, 1),
++FCE("и", 1, 2, 1),FCE("Й", 0, 2, 1),FCE("й", 1, 2, 1),FCE("К", 0, 2, 1),
++FCE("к", 1, 2, 1),FCE("Л", 0, 2, 1),FCE("л", 1, 2, 1),FCE("М", 0, 2, 1),
++FCE("м", 1, 2, 1),FCE("Н", 0, 2, 1),FCE("н", 1, 2, 1),FCE("О", 0, 2, 1),
++FCE("о", 1, 2, 1),FCE("П", 0, 2, 1),FCE("п", 1, 2, 1),FCE("Р", 0, 2, 1),
++FCE("р", 1, 2, 1),FCE("С", 0, 2, 1),FCE("с", 1, 2, 1),FCE("Т", 0, 2, 1),
++FCE("т", 1, 2, 1),FCE("У", 0, 2, 1),FCE("у", 1, 2, 1),FCE("Ф", 0, 2, 1),
++FCE("ф", 1, 2, 1),FCE("Х", 0, 2, 1),FCE("х", 1, 2, 1),FCE("Ц", 0, 2, 1),
++FCE("ц", 1, 2, 1),FCE("Ч", 0, 2, 1),FCE("ч", 1, 2, 1),FCE("Ш", 0, 2, 1),
++FCE("ш", 1, 2, 1),FCE("Щ", 0, 2, 1),FCE("щ", 1, 2, 1),FCE("Ъ", 0, 2, 1),
++FCE("ъ", 1, 2, 1),FCE("Ы", 0, 2, 1),FCE("ы", 1, 2, 1),FCE("Ь", 0, 2, 1),
++FCE("ь", 1, 2, 1),FCE("Э", 0, 2, 1),FCE("э", 1, 2, 1),FCE("Ю", 0, 2, 1),
++FCE("ю", 1, 2, 1),FCE("Я", 0, 2, 1),FCE("я", 1, 2, 1),FCE("Z", 0, 2, 1),
++FCE("z", 1, 2, 1),FCE("Ⲵ", 0, 2, 1),FCE("ⲵ", 1, 2, 1),FCE("µ", 0, 3, 1),
++FCE("Μ", 1, 3, 1),FCE("μ", 2, 3, 1),FCE("𐐣", 0, 2, 1),FCE("𐑋", 1, 2, 1),
++FCE("Ⓐ", 0, 2, 1),FCE("ⓐ", 1, 2, 1),FCE("Ⓒ", 0, 2, 1),FCE("ⓒ", 1, 2, 1),
++FCE("L", 0, 2, 1),FCE("l", 1, 2, 1),FCE("𐐡", 0, 2, 1),FCE("𐑉", 1, 2, 1),
++FCE("Ⓔ", 0, 2, 1),FCE("ⓔ", 1, 2, 1),FCE("𐐙", 0, 2, 1),FCE("𐑁", 1, 2, 1),
++FCE("Ѡ", 0, 2, 1),FCE("ѡ", 1, 2, 1),FCE("Ѣ", 0, 2, 1),FCE("ѣ", 1, 2, 1),
++FCE("ᵽ", 0, 2, 1),FCE("Ᵽ", 1, 2, 1),FCE("Ѥ", 0, 2, 1),FCE("ѥ", 1, 2, 1),
++FCE("Ѧ", 0, 2, 1),FCE("ѧ", 1, 2, 1),FCE("Ⱨ", 0, 2, 1),FCE("ⱨ", 1, 2, 1),
++FCE("Ѩ", 0, 2, 1),FCE("ѩ", 1, 2, 1),FCE("Ⓖ", 0, 2, 1),FCE("ⓖ", 1, 2, 1),
++FCE("Ѫ", 0, 2, 1),FCE("ѫ", 1, 2, 1),FCE("Ⱬ", 0, 2, 1),FCE("ⱬ", 1, 2, 1),
++FCE("Ѭ", 0, 2, 1),FCE("ѭ", 1, 2, 1),FCE("ɑ", 0, 2, 1),FCE("Ɑ", 1, 2, 1),
++FCE("Ѯ", 0, 2, 1),FCE("ѯ", 1, 2, 1),FCE("ɐ", 0, 2, 1),FCE("Ɐ", 1, 2, 1),
++FCE("Ѱ", 0, 2, 1),FCE("ѱ", 1, 2, 1),FCE("Ꝩ", 0, 2, 1),FCE("ꝩ", 1, 2, 1),
++FCE("Ѳ", 0, 2, 1),FCE("ѳ", 1, 2, 1),FCE("Ѵ", 0, 2, 1),FCE("ѵ", 1, 2, 1),
++FCE("Ⓘ", 0, 2, 1),FCE("ⓘ", 1, 2, 1),FCE("Ѷ", 0, 2, 1),FCE("ѷ", 1, 2, 1),
++FCE("Ѹ", 0, 2, 1),FCE("ѹ", 1, 2, 1),FCE("Ѻ", 0, 2, 1),FCE("ѻ", 1, 2, 1),
++FCE("Ѽ", 0, 2, 1),FCE("ѽ", 1, 2, 1),FCE("Ꝫ", 0, 2, 1),FCE("ꝫ", 1, 2, 1),
++FCE("Ѿ", 0, 2, 1),FCE("ѿ", 1, 2, 1),FCE("ɀ", 0, 2, 1),FCE("Ɀ", 1, 2, 1),
++FCE("Ҁ", 0, 2, 1),FCE("ҁ", 1, 2, 1),FCE("Ⴠ", 0, 2, 1),FCE("ⴠ", 1, 2, 1),
++FCE("Ⲃ", 0, 2, 1),FCE("ⲃ", 1, 2, 1),FCE("Ⲅ", 0, 2, 1),FCE("ⲅ", 1, 2, 1),
++FCE("Ⲇ", 0, 2, 1),FCE("ⲇ", 1, 2, 1),FCE("Ⴡ", 0, 2, 1),FCE("ⴡ", 1, 2, 1),
++FCE("Ⲉ", 0, 2, 1),FCE("ⲉ", 1, 2, 1),FCE("Ꝭ", 0, 2, 1),FCE("ꝭ", 1, 2, 1),
++FCE("Ҋ", 0, 2, 1),FCE("ҋ", 1, 2, 1),FCE("Ҍ", 0, 2, 1),FCE("ҍ", 1, 2, 1),
++FCE("Â", 0, 2, 1),FCE("â", 1, 2, 1),FCE("Ҏ", 0, 2, 1),FCE("ҏ", 1, 2, 1),
++FCE("Ґ", 0, 2, 1),FCE("ґ", 1, 2, 1),FCE("Ғ", 0, 2, 1),FCE("ғ", 1, 2, 1),
++FCE("Ⴣ", 0, 2, 1),FCE("ⴣ", 1, 2, 1),FCE("Ҕ", 0, 2, 1),FCE("ҕ", 1, 2, 1),
++FCE("Ꝯ", 0, 2, 1),FCE("ꝯ", 1, 2, 1),FCE("Җ", 0, 2, 1),FCE("җ", 1, 2, 1),
++FCE("Ҙ", 0, 2, 1),FCE("ҙ", 1, 2, 1),FCE("Ä", 0, 2, 1),FCE("ä", 1, 2, 1),
++FCE("Қ", 0, 2, 1),FCE("қ", 1, 2, 1),FCE("𐐦", 0, 2, 1),FCE("𐑎", 1, 2, 1),
++FCE("Ҝ", 0, 2, 1),FCE("ҝ", 1, 2, 1),FCE("Ҟ", 0, 2, 1),FCE("ҟ", 1, 2, 1),
++FCE("Ⴥ", 0, 2, 1),FCE("ⴥ", 1, 2, 1),FCE("Ҡ", 0, 2, 1),FCE("ҡ", 1, 2, 1),
++FCE("Ң", 0, 2, 1),FCE("ң", 1, 2, 1),FCE("Ҥ", 0, 2, 1),FCE("ҥ", 1, 2, 1),
++FCE("Ⳇ", 0, 2, 1),FCE("ⳇ", 1, 2, 1),FCE("Ҧ", 0, 2, 1),FCE("ҧ", 1, 2, 1),
++FCE("Ҩ", 0, 2, 1),FCE("ҩ", 1, 2, 1),FCE("Ⱡ", 0, 2, 1),FCE("ⱡ", 1, 2, 1),
++FCE("Ҫ", 0, 2, 1),FCE("ҫ", 1, 2, 1),FCE("Ⴧ", 0, 2, 1),FCE("ⴧ", 1, 2, 1),
++FCE("Ҭ", 0, 2, 1),FCE("ҭ", 1, 2, 1),FCE("𐐓", 0, 2, 1),FCE("𐐻", 1, 2, 1),
++FCE("Ү", 0, 2, 1),FCE("ү", 1, 2, 1),FCE("Ұ", 0, 2, 1),FCE("ұ", 1, 2, 1),
++FCE("Ⳉ", 0, 2, 1),FCE("ⳉ", 1, 2, 1),FCE("Ҳ", 0, 2, 1),FCE("ҳ", 1, 2, 1),
++FCE("Ҵ", 0, 2, 1),FCE("ҵ", 1, 2, 1),FCE("Ҷ", 0, 2, 1),FCE("ҷ", 1, 2, 1),
++FCE("Ⓑ", 0, 2, 1),FCE("ⓑ", 1, 2, 1),FCE("Ҹ", 0, 2, 1),FCE("ҹ", 1, 2, 1),
++FCE("Ⓓ", 0, 2, 1),FCE("ⓓ", 1, 2, 1),FCE("Һ", 0, 2, 1),FCE("һ", 1, 2, 1),
++FCE("Ⓕ", 0, 2, 1),FCE("ⓕ", 1, 2, 1),FCE("Ҽ", 0, 2, 1),FCE("ҽ", 1, 2, 1),
++FCE("Ⓗ", 0, 2, 1),FCE("ⓗ", 1, 2, 1),FCE("Ҿ", 0, 2, 1),FCE("ҿ", 1, 2, 1),
++FCE("Ⓙ", 0, 2, 1),FCE("ⓙ", 1, 2, 1),FCE("Ӏ", 0, 2, 1),FCE("ӏ", 1, 2, 1),
++FCE("Ӂ", 0, 2, 1),FCE("ӂ", 1, 2, 1),FCE("Ⓜ", 0, 2, 1),FCE("ⓜ", 1, 2, 1),
++FCE("Ӄ", 0, 2, 1),FCE("ӄ", 1, 2, 1),FCE("Ⓞ", 0, 2, 1),FCE("ⓞ", 1, 2, 1),
++FCE("Ӆ", 0, 2, 1),FCE("ӆ", 1, 2, 1),FCE("Ⓠ", 0, 2, 1),FCE("ⓠ", 1, 2, 1),
++FCE("Ӈ", 0, 2, 1),FCE("ӈ", 1, 2, 1),FCE("Ⓢ", 0, 2, 1),FCE("ⓢ", 1, 2, 1),
++FCE("Ӊ", 0, 2, 1),FCE("ӊ", 1, 2, 1),FCE("Ⓤ", 0, 2, 1),FCE("ⓤ", 1, 2, 1),
++FCE("Ӌ", 0, 2, 1),FCE("ӌ", 1, 2, 1),FCE("Ⓦ", 0, 2, 1),FCE("ⓦ", 1, 2, 1),
++FCE("Ӎ", 0, 2, 1),FCE("ӎ", 1, 2, 1),FCE("Ⓨ", 0, 2, 1),FCE("ⓨ", 1, 2, 1),
++FCE("Ⴭ", 0, 2, 1),FCE("ⴭ", 1, 2, 1),FCE("Ӑ", 0, 2, 1),FCE("ӑ", 1, 2, 1),
++FCE("Ӓ", 0, 2, 1),FCE("ӓ", 1, 2, 1),FCE("Ӕ", 0, 2, 1),FCE("ӕ", 1, 2, 1),
++FCE("Ⳏ", 0, 2, 1),FCE("ⳏ", 1, 2, 1),FCE("Ӗ", 0, 2, 1),FCE("ӗ", 1, 2, 1),
++FCE("Ꝺ", 0, 2, 1),FCE("ꝺ", 1, 2, 1),FCE("Ә", 0, 2, 1),FCE("ә", 1, 2, 1),
++FCE("Ӛ", 0, 2, 1),FCE("ӛ", 1, 2, 1),FCE("Ⓩ", 0, 2, 1),FCE("ⓩ", 1, 2, 1),
++FCE("Ӝ", 0, 2, 1),FCE("ӝ", 1, 2, 1),FCE("Ӟ", 0, 2, 1),FCE("ӟ", 1, 2, 1),
++FCE("Ӡ", 0, 2, 1),FCE("ӡ", 1, 2, 1),FCE("Ⳑ", 0, 2, 1),FCE("ⳑ", 1, 2, 1),
++FCE("Ӣ", 0, 2, 1),FCE("ӣ", 1, 2, 1),FCE("Ӥ", 0, 2, 1),FCE("ӥ", 1, 2, 1),
++FCE("ɫ", 0, 2, 1),FCE("Ɫ", 1, 2, 1),FCE("Ӧ", 0, 2, 1),FCE("ӧ", 1, 2, 1),
++FCE("Ө", 0, 2, 1),FCE("ө", 1, 2, 1),FCE("Ӫ", 0, 2, 1),FCE("ӫ", 1, 2, 1),
++FCE("Ⅎ", 0, 2, 1),FCE("ⅎ", 1, 2, 1),FCE("Ӭ", 0, 2, 1),FCE("ӭ", 1, 2, 1),
++FCE("Ⳓ", 0, 2, 1),FCE("ⳓ", 1, 2, 1),FCE("Ӯ", 0, 2, 1),FCE("ӯ", 1, 2, 1),
++FCE("Ӱ", 0, 2, 1),FCE("ӱ", 1, 2, 1),FCE("𐐢", 0, 2, 1),FCE("𐑊", 1, 2, 1),
++FCE("Ӳ", 0, 2, 1),FCE("ӳ", 1, 2, 1),FCE("Ӵ", 0, 2, 1),FCE("ӵ", 1, 2, 1),
++FCE("Ӷ", 0, 2, 1),FCE("ӷ", 1, 2, 1),FCE("Ӹ", 0, 2, 1),FCE("ӹ", 1, 2, 1),
++FCE("Ⳕ", 0, 2, 1),FCE("ⳕ", 1, 2, 1),FCE("Ӻ", 0, 2, 1),FCE("ӻ", 1, 2, 1),
++FCE("Ӽ", 0, 2, 1),FCE("ӽ", 1, 2, 1),FCE("Ӿ", 0, 2, 1),FCE("ӿ", 1, 2, 1),
++FCE("Ԁ", 0, 2, 1),FCE("ԁ", 1, 2, 1),FCE("Ꞁ", 0, 2, 1),FCE("ꞁ", 1, 2, 1),
++FCE("Ԃ", 0, 2, 1),FCE("ԃ", 1, 2, 1),FCE("Ԅ", 0, 2, 1),FCE("ԅ", 1, 2, 1),
++FCE("Ⳗ", 0, 2, 1),FCE("ⳗ", 1, 2, 1),FCE("Ԇ", 0, 2, 1),FCE("ԇ", 1, 2, 1),
++FCE("Ԉ", 0, 2, 1),FCE("ԉ", 1, 2, 1),FCE("Ԋ", 0, 2, 1),FCE("ԋ", 1, 2, 1),
++FCE("Ԍ", 0, 2, 1),FCE("ԍ", 1, 2, 1),FCE("Ꞃ", 0, 2, 1),FCE("ꞃ", 1, 2, 1),
++FCE("Ԏ", 0, 2, 1),FCE("ԏ", 1, 2, 1),FCE("Ԑ", 0, 2, 1),FCE("ԑ", 1, 2, 1),
++FCE("Ⳙ", 0, 2, 1),FCE("ⳙ", 1, 2, 1),FCE("Ԓ", 0, 2, 1),FCE("ԓ", 1, 2, 1),
++FCE("Ԕ", 0, 2, 1),FCE("ԕ", 1, 2, 1),FCE("Ԗ", 0, 2, 1),FCE("ԗ", 1, 2, 1),
++FCE("Ԙ", 0, 2, 1),FCE("ԙ", 1, 2, 1),FCE("Ꞅ", 0, 2, 1),FCE("ꞅ", 1, 2, 1),
++FCE("Ԛ", 0, 2, 1),FCE("ԛ", 1, 2, 1),FCE("Ⲩ", 0, 2, 1),FCE("ⲩ", 1, 2, 1),
++FCE("Ԝ", 0, 2, 1),FCE("ԝ", 1, 2, 1),FCE("Ⳛ", 0, 2, 1),FCE("ⳛ", 1, 2, 1),
++FCE("Ԟ", 0, 2, 1),FCE("ԟ", 1, 2, 1),FCE("Ԡ", 0, 2, 1),FCE("ԡ", 1, 2, 1),
++FCE("Ԣ", 0, 2, 1),FCE("ԣ", 1, 2, 1),FCE("Ԥ", 0, 2, 1),FCE("ԥ", 1, 2, 1),
++FCE("Ꞇ", 0, 2, 1),FCE("ꞇ", 1, 2, 1),FCE("Ԧ", 0, 2, 1),FCE("ԧ", 1, 2, 1),
++FCE("Ⱐ", 0, 2, 1),FCE("ⱐ", 1, 2, 1),FCE("Ⳝ", 0, 2, 1),FCE("ⳝ", 1, 2, 1),
++FCE("Ա", 0, 2, 1),FCE("ա", 1, 2, 1),FCE("Բ", 0, 2, 1),FCE("բ", 1, 2, 1),
++FCE("Գ", 0, 2, 1),FCE("գ", 1, 2, 1),FCE("Դ", 0, 2, 1),FCE("դ", 1, 2, 1),
++FCE("Ե", 0, 2, 1),FCE("ե", 1, 2, 1),FCE("Զ", 0, 2, 1),FCE("զ", 1, 2, 1),
++FCE("Է", 0, 2, 1),FCE("է", 1, 2, 1),FCE("Ը", 0, 2, 1),FCE("ը", 1, 2, 1),
++FCE("Թ", 0, 2, 1),FCE("թ", 1, 2, 1),FCE("Ժ", 0, 2, 1),FCE("ժ", 1, 2, 1),
++FCE("Ի", 0, 2, 1),FCE("ի", 1, 2, 1),FCE("Լ", 0, 2, 1),FCE("լ", 1, 2, 1),
++FCE("Խ", 0, 2, 1),FCE("խ", 1, 2, 1),FCE("Ծ", 0, 2, 1),FCE("ծ", 1, 2, 1),
++FCE("Կ", 0, 2, 1),FCE("կ", 1, 2, 1),FCE("Հ", 0, 2, 1),FCE("հ", 1, 2, 1),
++FCE("Ձ", 0, 2, 1),FCE("ձ", 1, 2, 1),FCE("Ղ", 0, 2, 1),FCE("ղ", 1, 2, 1),
++FCE("Ճ", 0, 2, 1),FCE("ճ", 1, 2, 1),FCE("Մ", 0, 2, 1),FCE("մ", 1, 2, 1),
++FCE("Յ", 0, 2, 1),FCE("յ", 1, 2, 1),FCE("Ն", 0, 2, 1),FCE("ն", 1, 2, 1),
++FCE("Շ", 0, 2, 1),FCE("շ", 1, 2, 1),FCE("Ո", 0, 2, 1),FCE("ո", 1, 2, 1),
++FCE("Չ", 0, 2, 1),FCE("չ", 1, 2, 1),FCE("Պ", 0, 2, 1),FCE("պ", 1, 2, 1),
++FCE("Ջ", 0, 2, 1),FCE("ջ", 1, 2, 1),FCE("Ռ", 0, 2, 1),FCE("ռ", 1, 2, 1),
++FCE("Ս", 0, 2, 1),FCE("ս", 1, 2, 1),FCE("Վ", 0, 2, 1),FCE("վ", 1, 2, 1),
++FCE("Տ", 0, 2, 1),FCE("տ", 1, 2, 1),FCE("Ր", 0, 2, 1),FCE("ր", 1, 2, 1),
++FCE("Ց", 0, 2, 1),FCE("ց", 1, 2, 1),FCE("Ւ", 0, 2, 1),FCE("ւ", 1, 2, 1),
++FCE("Փ", 0, 2, 1),FCE("փ", 1, 2, 1),FCE("Ք", 0, 2, 1),FCE("ք", 1, 2, 1),
++FCE("Օ", 0, 2, 1),FCE("օ", 1, 2, 1),FCE("Ֆ", 0, 2, 1),FCE("ֆ", 1, 2, 1),
++FCE("Ⲫ", 0, 2, 1),FCE("ⲫ", 1, 2, 1),FCE("Ꞑ", 0, 2, 1),FCE("ꞑ", 1, 2, 1),
++FCE("Ⱒ", 0, 2, 1),FCE("ⱒ", 1, 2, 1),FCE("Ꞓ", 0, 2, 1),FCE("ꞓ", 1, 2, 1),
++FCE("Ⱓ", 0, 2, 1),FCE("ⱓ", 1, 2, 1),FCE("Ⳬ", 0, 2, 1),FCE("ⳬ", 1, 2, 1),
++FCE("Ⳋ", 0, 2, 1),FCE("ⳋ", 1, 2, 1),FCE("և", 0, 2, 1),FCE("եւ", 1, 2, 2),
++FCE("Ꙃ", 0, 2, 1),FCE("ꙃ", 1, 2, 1),FCE("Ⳮ", 0, 2, 1),FCE("ⳮ", 1, 2, 1),
++FCE("Ⲭ", 0, 2, 1),FCE("ⲭ", 1, 2, 1),FCE("Ꙅ", 0, 2, 1),FCE("ꙅ", 1, 2, 1),
++FCE("Ⱔ", 0, 2, 1),FCE("ⱔ", 1, 2, 1),FCE("Ꝕ", 0, 2, 1),FCE("ꝕ", 1, 2, 1),
++FCE("Ꙇ", 0, 2, 1),FCE("ꙇ", 1, 2, 1),FCE("Ⳳ", 0, 2, 1),FCE("ⳳ", 1, 2, 1),
++FCE("𐐈", 0, 2, 1),FCE("𐐰", 1, 2, 1),FCE("Ꙉ", 0, 2, 1),FCE("ꙉ", 1, 2, 1),
++FCE("Ⱕ", 0, 2, 1),FCE("ⱕ", 1, 2, 1),FCE("Ꞡ", 0, 2, 1),FCE("ꞡ", 1, 2, 1),
++FCE("Ꙍ", 0, 2, 1),FCE("ꙍ", 1, 2, 1),FCE("Ꞣ", 0, 2, 1),FCE("ꞣ", 1, 2, 1),
++FCE("Ⲯ", 0, 2, 1),FCE("ⲯ", 1, 2, 1),FCE("Ꙏ", 0, 2, 1),FCE("ꙏ", 1, 2, 1),
++FCE("Ꞥ", 0, 2, 1),FCE("ꞥ", 1, 2, 1),FCE("Ꙑ", 0, 2, 1),FCE("ꙑ", 1, 2, 1),
++FCE("Ꞧ", 0, 2, 1),FCE("ꞧ", 1, 2, 1),FCE("Ꞌ", 0, 2, 1),FCE("ꞌ", 1, 2, 1),
++FCE("Ꙓ", 0, 2, 1),FCE("ꙓ", 1, 2, 1),FCE("Ꞩ", 0, 2, 1),FCE("ꞩ", 1, 2, 1),
++FCE("Ꙕ", 0, 2, 1),FCE("ꙕ", 1, 2, 1),FCE("ɦ", 0, 2, 1),FCE("Ɦ", 1, 2, 1),
++FCE("Ḁ", 0, 2, 1),FCE("ḁ", 1, 2, 1),FCE("Ḃ", 0, 2, 1),FCE("ḃ", 1, 2, 1),
++FCE("Ḅ", 0, 2, 1),FCE("ḅ", 1, 2, 1),FCE("Ⱏ", 0, 2, 1),FCE("ⱏ", 1, 2, 1),
++FCE("Ḇ", 0, 2, 1),FCE("ḇ", 1, 2, 1),FCE("𐐎", 0, 2, 1),FCE("𐐶", 1, 2, 1),
++FCE("Ḉ", 0, 2, 1),FCE("ḉ", 1, 2, 1),FCE("Ḋ", 0, 2, 1),FCE("ḋ", 1, 2, 1),
++FCE("Ⲱ", 0, 2, 1),FCE("ⲱ", 1, 2, 1),FCE("Ḍ", 0, 2, 1),FCE("ḍ", 1, 2, 1),
++FCE("Ḏ", 0, 2, 1),FCE("ḏ", 1, 2, 1),FCE("Ḑ", 0, 2, 1),FCE("ḑ", 1, 2, 1),
++FCE("Ꙙ", 0, 2, 1),FCE("ꙙ", 1, 2, 1),FCE("Ḓ", 0, 2, 1),FCE("ḓ", 1, 2, 1),
++FCE("Ḕ", 0, 2, 1),FCE("ḕ", 1, 2, 1),FCE("Ⓧ", 0, 2, 1),FCE("ⓧ", 1, 2, 1),
++FCE("Ḗ", 0, 2, 1),FCE("ḗ", 1, 2, 1),FCE("Ḙ", 0, 2, 1),FCE("ḙ", 1, 2, 1),
++FCE("Ḛ", 0, 2, 1),FCE("ḛ", 1, 2, 1),FCE("Ḝ", 0, 2, 1),FCE("ḝ", 1, 2, 1),
++FCE("Ꙛ", 0, 2, 1),FCE("ꙛ", 1, 2, 1),FCE("Ḟ", 0, 2, 1),FCE("ḟ", 1, 2, 1),
++FCE("Ḡ", 0, 2, 1),FCE("ḡ", 1, 2, 1),FCE("Ḣ", 0, 2, 1),FCE("ḣ", 1, 2, 1),
++FCE("Ḥ", 0, 2, 1),FCE("ḥ", 1, 2, 1),FCE("Ḧ", 0, 2, 1),FCE("ḧ", 1, 2, 1),
++FCE("Ḩ", 0, 2, 1),FCE("ḩ", 1, 2, 1),FCE("Ꙝ", 0, 2, 1),FCE("ꙝ", 1, 2, 1),
++FCE("Ḫ", 0, 2, 1),FCE("ḫ", 1, 2, 1),FCE("Ḭ", 0, 2, 1),FCE("ḭ", 1, 2, 1),
++FCE("Ḯ", 0, 2, 1),FCE("ḯ", 1, 2, 1),FCE("Ḱ", 0, 2, 1),FCE("ḱ", 1, 2, 1),
++FCE("Ḳ", 0, 2, 1),FCE("ḳ", 1, 2, 1),FCE("Ḵ", 0, 2, 1),FCE("ḵ", 1, 2, 1),
++FCE("Ꙟ", 0, 2, 1),FCE("ꙟ", 1, 2, 1),FCE("Ḷ", 0, 2, 1),FCE("ḷ", 1, 2, 1),
++FCE("Ḹ", 0, 2, 1),FCE("ḹ", 1, 2, 1),FCE("Ḻ", 0, 2, 1),FCE("ḻ", 1, 2, 1),
++FCE("Ḽ", 0, 2, 1),FCE("ḽ", 1, 2, 1),FCE("Ḿ", 0, 2, 1),FCE("ḿ", 1, 2, 1),
++FCE("Ṁ", 0, 2, 1),FCE("ṁ", 1, 2, 1),FCE("Ꙡ", 0, 2, 1),FCE("ꙡ", 1, 2, 1),
++FCE("Ṃ", 0, 2, 1),FCE("ṃ", 1, 2, 1),FCE("Ṅ", 0, 2, 1),FCE("ṅ", 1, 2, 1),
++FCE("Ṇ", 0, 2, 1),FCE("ṇ", 1, 2, 1),FCE("Ⲳ", 0, 2, 1),FCE("ⲳ", 1, 2, 1),
++FCE("Ṉ", 0, 2, 1),FCE("ṉ", 1, 2, 1),FCE("Ⳁ", 0, 2, 1),FCE("ⳁ", 1, 2, 1),
++FCE("Ṋ", 0, 2, 1),FCE("ṋ", 1, 2, 1),FCE("Ṍ", 0, 2, 1),FCE("ṍ", 1, 2, 1),
++FCE("Ꙣ", 0, 2, 1),FCE("ꙣ", 1, 2, 1),FCE("Ṏ", 0, 2, 1),FCE("ṏ", 1, 2, 1),
++FCE("Ṑ", 0, 2, 1),FCE("ṑ", 1, 2, 1),FCE("Ṓ", 0, 2, 1),FCE("ṓ", 1, 2, 1),
++FCE("Ṕ", 0, 2, 1),FCE("ṕ", 1, 2, 1),FCE("Ṗ", 0, 2, 1),FCE("ṗ", 1, 2, 1),
++FCE("Ṙ", 0, 2, 1),FCE("ṙ", 1, 2, 1),FCE("Ꙥ", 0, 2, 1),FCE("ꙥ", 1, 2, 1),
++FCE("Ṛ", 0, 2, 1),FCE("ṛ", 1, 2, 1),FCE("Ṝ", 0, 2, 1),FCE("ṝ", 1, 2, 1),
++FCE("Ṟ", 0, 2, 1),FCE("ṟ", 1, 2, 1),FCE("Ṡ", 0, 3, 1),FCE("ṡ", 1, 3, 1),
++FCE("ẛ", 2, 3, 1),FCE("Ṣ", 0, 2, 1),FCE("ṣ", 1, 2, 1),FCE("𐐤", 0, 2, 1),
++FCE("𐑌", 1, 2, 1),FCE("Ṥ", 0, 2, 1),FCE("ṥ", 1, 2, 1),FCE("Ꙧ", 0, 2, 1),
++FCE("ꙧ", 1, 2, 1),FCE("Ṧ", 0, 2, 1),FCE("ṧ", 1, 2, 1),FCE("Ṩ", 0, 2, 1),
++FCE("ṩ", 1, 2, 1),FCE("Ṫ", 0, 2, 1),FCE("ṫ", 1, 2, 1),FCE("Ṭ", 0, 2, 1),
++FCE("ṭ", 1, 2, 1),FCE("Ṯ", 0, 2, 1),FCE("ṯ", 1, 2, 1),FCE("Ṱ", 0, 2, 1),
++FCE("ṱ", 1, 2, 1),FCE("Ꙩ", 0, 2, 1),FCE("ꙩ", 1, 2, 1),FCE("Ṳ", 0, 2, 1),
++FCE("ṳ", 1, 2, 1),FCE("Ṵ", 0, 2, 1),FCE("ṵ", 1, 2, 1),FCE("Ṷ", 0, 2, 1),
++FCE("ṷ", 1, 2, 1),FCE("Ⲿ", 0, 2, 1),FCE("ⲿ", 1, 2, 1),FCE("Ṹ", 0, 2, 1),
++FCE("ṹ", 1, 2, 1),FCE("Ṻ", 0, 2, 1),FCE("ṻ", 1, 2, 1),FCE("Ṽ", 0, 2, 1),
++FCE("ṽ", 1, 2, 1),FCE("Ꙫ", 0, 2, 1),FCE("ꙫ", 1, 2, 1),FCE("Ṿ", 0, 2, 1),
++FCE("ṿ", 1, 2, 1),FCE("Ẁ", 0, 2, 1),FCE("ẁ", 1, 2, 1),FCE("Ẃ", 0, 2, 1),
++FCE("ẃ", 1, 2, 1),FCE("Ẅ", 0, 2, 1),FCE("ẅ", 1, 2, 1),FCE("Ẇ", 0, 2, 1),
++FCE("ẇ", 1, 2, 1),FCE("Ẉ", 0, 2, 1),FCE("ẉ", 1, 2, 1),FCE("Ꙭ", 0, 2, 1),
++FCE("ꙭ", 1, 2, 1),FCE("Ẋ", 0, 2, 1),FCE("ẋ", 1, 2, 1),FCE("Ẍ", 0, 2, 1),
++FCE("ẍ", 1, 2, 1),FCE("Ẏ", 0, 2, 1),FCE("ẏ", 1, 2, 1),FCE("Ẑ", 0, 2, 1),
++FCE("ẑ", 1, 2, 1),FCE("Ẓ", 0, 2, 1),FCE("ẓ", 1, 2, 1),FCE("Ẕ", 0, 2, 1),
++FCE("ẕ", 1, 2, 1),FCE("ẖ", 0, 2, 1),FCE("ẖ", 1, 2, 2),FCE("ẗ", 0, 2, 1),
++FCE("ẗ", 1, 2, 2),FCE("ẘ", 0, 2, 1),FCE("ẘ", 1, 2, 2),FCE("ẙ", 0, 2, 1),
++FCE("ẙ", 1, 2, 2),FCE("ẚ", 0, 2, 1),FCE("aʾ", 1, 2, 2),FCE("Ṡ", 0, 3, 1),
++FCE("ṡ", 1, 3, 1),FCE("ẛ", 2, 3, 1),FCE("ß", 0, 3, 1),FCE("ẞ", 1, 3, 1),
++FCE("ss", 2, 3, 2),FCE("Ạ", 0, 2, 1),FCE("ạ", 1, 2, 1),FCE("Ả", 0, 2, 1),
++FCE("ả", 1, 2, 1),FCE("Ấ", 0, 2, 1),FCE("ấ", 1, 2, 1),FCE("Ⓟ", 0, 2, 1),
++FCE("ⓟ", 1, 2, 1),FCE("Ầ", 0, 2, 1),FCE("ầ", 1, 2, 1),FCE("Ẩ", 0, 2, 1),
++FCE("ẩ", 1, 2, 1),FCE("Ẫ", 0, 2, 1),FCE("ẫ", 1, 2, 1),FCE("Ậ", 0, 2, 1),
++FCE("ậ", 1, 2, 1),FCE("Ắ", 0, 2, 1),FCE("ắ", 1, 2, 1),FCE("H", 0, 2, 1),
++FCE("h", 1, 2, 1),FCE("Ằ", 0, 2, 1),FCE("ằ", 1, 2, 1),FCE("Ẳ", 0, 2, 1),
++FCE("ẳ", 1, 2, 1),FCE("𐐥", 0, 2, 1),FCE("𐑍", 1, 2, 1),FCE("Ẵ", 0, 2, 1),
++FCE("ẵ", 1, 2, 1),FCE("Ặ", 0, 2, 1),FCE("ặ", 1, 2, 1),FCE("Ẹ", 0, 2, 1),
++FCE("ẹ", 1, 2, 1),FCE("Ẻ", 0, 2, 1),FCE("ẻ", 1, 2, 1),FCE("Ẽ", 0, 2, 1),
++FCE("ẽ", 1, 2, 1),FCE("Ế", 0, 2, 1),FCE("ế", 1, 2, 1),FCE("Ⲷ", 0, 2, 1),
++FCE("ⲷ", 1, 2, 1),FCE("Ề", 0, 2, 1),FCE("ề", 1, 2, 1),FCE("Ể", 0, 2, 1),
++FCE("ể", 1, 2, 1),FCE("Ⲛ", 0, 2, 1),FCE("ⲛ", 1, 2, 1),FCE("Ễ", 0, 2, 1),
++FCE("ễ", 1, 2, 1),FCE("Ệ", 0, 2, 1),FCE("ệ", 1, 2, 1),FCE("Ỉ", 0, 2, 1),
++FCE("ỉ", 1, 2, 1),FCE("Ị", 0, 2, 1),FCE("ị", 1, 2, 1),FCE("Ọ", 0, 2, 1),
++FCE("ọ", 1, 2, 1),FCE("Ỏ", 0, 2, 1),FCE("ỏ", 1, 2, 1),FCE("Ố", 0, 2, 1),
++FCE("ố", 1, 2, 1),FCE("Ồ", 0, 2, 1),FCE("ồ", 1, 2, 1),FCE("Ổ", 0, 2, 1),
++FCE("ổ", 1, 2, 1),FCE("Ỗ", 0, 2, 1),FCE("ỗ", 1, 2, 1),FCE("Ộ", 0, 2, 1),
++FCE("ộ", 1, 2, 1),FCE("Ớ", 0, 2, 1),FCE("ớ", 1, 2, 1),FCE("Ờ", 0, 2, 1),
++FCE("ờ", 1, 2, 1),FCE("Ở", 0, 2, 1),FCE("ở", 1, 2, 1),FCE("Ỡ", 0, 2, 1),
++FCE("ỡ", 1, 2, 1),FCE("Ợ", 0, 2, 1),FCE("ợ", 1, 2, 1),FCE("Ụ", 0, 2, 1),
++FCE("ụ", 1, 2, 1),FCE("Ω", 0, 3, 1),FCE("ω", 1, 3, 1),FCE("Ω", 2, 3, 1),
++FCE("Ủ", 0, 2, 1),FCE("ủ", 1, 2, 1),FCE("Ứ", 0, 2, 1),FCE("ứ", 1, 2, 1),
++FCE("Ừ", 0, 2, 1),FCE("ừ", 1, 2, 1),FCE("J", 0, 2, 1),FCE("j", 1, 2, 1),
++FCE("Ử", 0, 2, 1),FCE("ử", 1, 2, 1),FCE("Ữ", 0, 2, 1),FCE("ữ", 1, 2, 1),
++FCE("Ự", 0, 2, 1),FCE("ự", 1, 2, 1),FCE("Ỳ", 0, 2, 1),FCE("ỳ", 1, 2, 1),
++FCE("Ỵ", 0, 2, 1),FCE("ỵ", 1, 2, 1),FCE("Ỷ", 0, 2, 1),FCE("ỷ", 1, 2, 1),
++FCE("Ỹ", 0, 2, 1),FCE("ỹ", 1, 2, 1),FCE("Ỻ", 0, 2, 1),FCE("ỻ", 1, 2, 1),
++FCE("Ⲹ", 0, 2, 1),FCE("ⲹ", 1, 2, 1),FCE("Ỽ", 0, 2, 1),FCE("ỽ", 1, 2, 1),
++FCE("K", 0, 3, 1),FCE("k", 1, 3, 1),FCE("K", 2, 3, 1),FCE("Ỿ", 0, 2, 1),
++FCE("ỿ", 1, 2, 1),FCE("Ꚁ", 0, 2, 1),FCE("ꚁ", 1, 2, 1),FCE("ἀ", 0, 2, 1),
++FCE("Ἀ", 1, 2, 1),FCE("ἁ", 0, 2, 1),FCE("Ἁ", 1, 2, 1),FCE("ἂ", 0, 2, 1),
++FCE("Ἂ", 1, 2, 1),FCE("ἃ", 0, 2, 1),FCE("Ἃ", 1, 2, 1),FCE("ἄ", 0, 2, 1),
++FCE("Ἄ", 1, 2, 1),FCE("ἅ", 0, 2, 1),FCE("Ἅ", 1, 2, 1),FCE("ἆ", 0, 2, 1),
++FCE("Ἆ", 1, 2, 1),FCE("ἇ", 0, 2, 1),FCE("Ἇ", 1, 2, 1),FCE("𐐘", 0, 2, 1),
++FCE("𐑀", 1, 2, 1),FCE("ɥ", 0, 2, 1),FCE("Ɥ", 1, 2, 1),FCE("ἐ", 0, 2, 1),
++FCE("Ἐ", 1, 2, 1),FCE("ἑ", 0, 2, 1),FCE("Ἑ", 1, 2, 1),FCE("ἒ", 0, 2, 1),
++FCE("Ἒ", 1, 2, 1),FCE("ἓ", 0, 2, 1),FCE("Ἓ", 1, 2, 1),FCE("ἔ", 0, 2, 1),
++FCE("Ἔ", 1, 2, 1),FCE("ἕ", 0, 2, 1),FCE("Ἕ", 1, 2, 1),FCE("A", 0, 2, 1),
++FCE("a", 1, 2, 1),FCE("Ꜣ", 0, 2, 1),FCE("ꜣ", 1, 2, 1),FCE("C", 0, 2, 1),
++FCE("c", 1, 2, 1),FCE("Ꜥ", 0, 2, 1),FCE("ꜥ", 1, 2, 1),FCE("Ꚇ", 0, 2, 1),
++FCE("ꚇ", 1, 2, 1),FCE("Ꜧ", 0, 2, 1),FCE("ꜧ", 1, 2, 1),FCE("G", 0, 2, 1),
++FCE("g", 1, 2, 1),FCE("ἠ", 0, 2, 1),FCE("Ἠ", 1, 2, 1),FCE("ἡ", 0, 2, 1),
++FCE("Ἡ", 1, 2, 1),FCE("ἢ", 0, 2, 1),FCE("Ἢ", 1, 2, 1),FCE("ἣ", 0, 2, 1),
++FCE("Ἣ", 1, 2, 1),FCE("ἤ", 0, 2, 1),FCE("Ἤ", 1, 2, 1),FCE("ἥ", 0, 2, 1),
++FCE("Ἥ", 1, 2, 1),FCE("ἦ", 0, 2, 1),FCE("Ἦ", 1, 2, 1),FCE("ἧ", 0, 2, 1),
++FCE("Ἧ", 1, 2, 1),FCE("P", 0, 2, 1),FCE("p", 1, 2, 1),FCE("Ꚉ", 0, 2, 1),
++FCE("ꚉ", 1, 2, 1),FCE("Ꜳ", 0, 2, 1),FCE("ꜳ", 1, 2, 1),FCE("S", 0, 2, 1),
++FCE("s", 1, 2, 1),FCE("Ꜵ", 0, 2, 1),FCE("ꜵ", 1, 2, 1),FCE("U", 0, 2, 1),
++FCE("u", 1, 2, 1),FCE("Ꜷ", 0, 2, 1),FCE("ꜷ", 1, 2, 1),FCE("Ⲻ", 0, 2, 1),
++FCE("ⲻ", 1, 2, 1),FCE("ἰ", 0, 2, 1),FCE("Ἰ", 1, 2, 1),FCE("ἱ", 0, 2, 1),
++FCE("Ἱ", 1, 2, 1),FCE("ἲ", 0, 2, 1),FCE("Ἲ", 1, 2, 1),FCE("ἳ", 0, 2, 1),
++FCE("Ἳ", 1, 2, 1),FCE("ἴ", 0, 2, 1),FCE("Ἴ", 1, 2, 1),FCE("ἵ", 0, 2, 1),
++FCE("Ἵ", 1, 2, 1),FCE("ἶ", 0, 2, 1),FCE("Ἶ", 1, 2, 1),FCE("ἷ", 0, 2, 1),
++FCE("Ἷ", 1, 2, 1),FCE("Ꝁ", 0, 2, 1),FCE("ꝁ", 1, 2, 1),FCE("Ꝃ", 0, 2, 1),
++FCE("ꝃ", 1, 2, 1),FCE("Ꝅ", 0, 2, 1),FCE("ꝅ", 1, 2, 1),FCE("Ꝇ", 0, 2, 1),
++FCE("ꝇ", 1, 2, 1),FCE("ὀ", 0, 2, 1),FCE("Ὀ", 1, 2, 1),FCE("ὁ", 0, 2, 1),
++FCE("Ὁ", 1, 2, 1),FCE("ὂ", 0, 2, 1),FCE("Ὂ", 1, 2, 1),FCE("ὃ", 0, 2, 1),
++FCE("Ὃ", 1, 2, 1),FCE("ὄ", 0, 2, 1),FCE("Ὄ", 1, 2, 1),FCE("ὅ", 0, 2, 1),
++FCE("Ὅ", 1, 2, 1),FCE("Ꝏ", 0, 2, 1),FCE("ꝏ", 1, 2, 1),FCE("ὐ", 0, 2, 1),
++FCE("ὐ", 1, 2, 2),FCE("ὒ", 0, 2, 1),FCE("ὒ", 1, 2, 3),FCE("ὔ", 0, 2, 1),
++FCE("ὔ", 1, 2, 3),FCE("Ꚏ", 0, 2, 1),FCE("ꚏ", 1, 2, 1),FCE("ὖ", 0, 2, 1),
++FCE("ὖ", 1, 2, 3),FCE("Ꝙ", 0, 2, 1),FCE("ꝙ", 1, 2, 1),FCE("ὑ", 0, 2, 1),
++FCE("Ὑ", 1, 2, 1),FCE("Ꝛ", 0, 2, 1),FCE("ꝛ", 1, 2, 1),FCE("ὓ", 0, 2, 1),
++FCE("Ὓ", 1, 2, 1),FCE("Ꝝ", 0, 2, 1),FCE("ꝝ", 1, 2, 1),FCE("ὕ", 0, 2, 1),
++FCE("Ὕ", 1, 2, 1),FCE("Ꝟ", 0, 2, 1),FCE("ꝟ", 1, 2, 1),FCE("ὗ", 0, 2, 1),
++FCE("Ὗ", 1, 2, 1),FCE("Ꝡ", 0, 2, 1),FCE("ꝡ", 1, 2, 1),FCE("Ꚑ", 0, 2, 1),
++FCE("ꚑ", 1, 2, 1),FCE("Ꝣ", 0, 2, 1),FCE("ꝣ", 1, 2, 1),FCE("N", 0, 2, 1),
++FCE("n", 1, 2, 1),FCE("Ꝥ", 0, 2, 1),FCE("ꝥ", 1, 2, 1),FCE("Ꝧ", 0, 2, 1),
++FCE("ꝧ", 1, 2, 1),FCE("ὠ", 0, 2, 1),FCE("Ὠ", 1, 2, 1),FCE("ὡ", 0, 2, 1),
++FCE("Ὡ", 1, 2, 1),FCE("ὢ", 0, 2, 1),FCE("Ὢ", 1, 2, 1),FCE("ὣ", 0, 2, 1),
++FCE("Ὣ", 1, 2, 1),FCE("ὤ", 0, 2, 1),FCE("Ὤ", 1, 2, 1),FCE("ὥ", 0, 2, 1),
++FCE("Ὥ", 1, 2, 1),FCE("ὦ", 0, 2, 1),FCE("Ὦ", 1, 2, 1),FCE("ὧ", 0, 2, 1),
++FCE("Ὧ", 1, 2, 1),FCE("Ⱌ", 0, 2, 1),FCE("ⱌ", 1, 2, 1),FCE("Ⲽ", 0, 2, 1),
++FCE("ⲽ", 1, 2, 1),FCE("Ꚕ", 0, 2, 1),FCE("ꚕ", 1, 2, 1),FCE("Ꝼ", 0, 2, 1),
++FCE("ꝼ", 1, 2, 1),FCE("ᵹ", 0, 2, 1),FCE("Ᵹ", 1, 2, 1),FCE("Ꝿ", 0, 2, 1),
++FCE("ꝿ", 1, 2, 1),FCE("ᾀ", 0, 3, 1),FCE("ᾈ", 1, 3, 1),FCE("ἀι", 2, 3, 2),
++FCE("ᾁ", 0, 3, 1),FCE("ᾉ", 1, 3, 1),FCE("ἁι", 2, 3, 2),FCE("ᾂ", 0, 3, 1),
++FCE("ᾊ", 1, 3, 1),FCE("ἂι", 2, 3, 2),FCE("ᾃ", 0, 3, 1),FCE("ᾋ", 1, 3, 1),
++FCE("ἃι", 2, 3, 2),FCE("ᾄ", 0, 3, 1),FCE("ᾌ", 1, 3, 1),FCE("ἄι", 2, 3, 2),
++FCE("ᾅ", 0, 3, 1),FCE("ᾍ", 1, 3, 1),FCE("ἅι", 2, 3, 2),FCE("ᾆ", 0, 3, 1),
++FCE("ᾎ", 1, 3, 1),FCE("ἆι", 2, 3, 2),FCE("ᾇ", 0, 3, 1),FCE("ᾏ", 1, 3, 1),
++FCE("ἇι", 2, 3, 2),FCE("ᾀ", 0, 3, 1),FCE("ᾈ", 1, 3, 1),FCE("ἀι", 2, 3, 2),
++FCE("ᾁ", 0, 3, 1),FCE("ᾉ", 1, 3, 1),FCE("ἁι", 2, 3, 2),FCE("ᾂ", 0, 3, 1),
++FCE("ᾊ", 1, 3, 1),FCE("ἂι", 2, 3, 2),FCE("ᾃ", 0, 3, 1),FCE("ᾋ", 1, 3, 1),
++FCE("ἃι", 2, 3, 2),FCE("ᾄ", 0, 3, 1),FCE("ᾌ", 1, 3, 1),FCE("ἄι", 2, 3, 2),
++FCE("ᾅ", 0, 3, 1),FCE("ᾍ", 1, 3, 1),FCE("ἅι", 2, 3, 2),FCE("ᾆ", 0, 3, 1),
++FCE("ᾎ", 1, 3, 1),FCE("ἆι", 2, 3, 2),FCE("ᾇ", 0, 3, 1),FCE("ᾏ", 1, 3, 1),
++FCE("ἇι", 2, 3, 2),FCE("ᾐ", 0, 3, 1),FCE("ᾘ", 1, 3, 1),FCE("ἠι", 2, 3, 2),
++FCE("ᾑ", 0, 3, 1),FCE("ᾙ", 1, 3, 1),FCE("ἡι", 2, 3, 2),FCE("ᾒ", 0, 3, 1),
++FCE("ᾚ", 1, 3, 1),FCE("ἢι", 2, 3, 2),FCE("ᾓ", 0, 3, 1),FCE("ᾛ", 1, 3, 1),
++FCE("ἣι", 2, 3, 2),FCE("ᾔ", 0, 3, 1),FCE("ᾜ", 1, 3, 1),FCE("ἤι", 2, 3, 2),
++FCE("ᾕ", 0, 3, 1),FCE("ᾝ", 1, 3, 1),FCE("ἥι", 2, 3, 2),FCE("ᾖ", 0, 3, 1),
++FCE("ᾞ", 1, 3, 1),FCE("ἦι", 2, 3, 2),FCE("ᾗ", 0, 3, 1),FCE("ᾟ", 1, 3, 1),
++FCE("ἧι", 2, 3, 2),FCE("ᾐ", 0, 3, 1),FCE("ᾘ", 1, 3, 1),FCE("ἠι", 2, 3, 2),
++FCE("ᾑ", 0, 3, 1),FCE("ᾙ", 1, 3, 1),FCE("ἡι", 2, 3, 2),FCE("ᾒ", 0, 3, 1),
++FCE("ᾚ", 1, 3, 1),FCE("ἢι", 2, 3, 2),FCE("ᾓ", 0, 3, 1),FCE("ᾛ", 1, 3, 1),
++FCE("ἣι", 2, 3, 2),FCE("ᾔ", 0, 3, 1),FCE("ᾜ", 1, 3, 1),FCE("ἤι", 2, 3, 2),
++FCE("ᾕ", 0, 3, 1),FCE("ᾝ", 1, 3, 1),FCE("ἥι", 2, 3, 2),FCE("ᾖ", 0, 3, 1),
++FCE("ᾞ", 1, 3, 1),FCE("ἦι", 2, 3, 2),FCE("ᾗ", 0, 3, 1),FCE("ᾟ", 1, 3, 1),
++FCE("ἧι", 2, 3, 2),FCE("ᾠ", 0, 3, 1),FCE("ᾨ", 1, 3, 1),FCE("ὠι", 2, 3, 2),
++FCE("ᾡ", 0, 3, 1),FCE("ᾩ", 1, 3, 1),FCE("ὡι", 2, 3, 2),FCE("ᾢ", 0, 3, 1),
++FCE("ᾪ", 1, 3, 1),FCE("ὢι", 2, 3, 2),FCE("ᾣ", 0, 3, 1),FCE("ᾫ", 1, 3, 1),
++FCE("ὣι", 2, 3, 2),FCE("ᾤ", 0, 3, 1),FCE("ᾬ", 1, 3, 1),FCE("ὤι", 2, 3, 2),
++FCE("ᾥ", 0, 3, 1),FCE("ᾭ", 1, 3, 1),FCE("ὥι", 2, 3, 2),FCE("ᾦ", 0, 3, 1),
++FCE("ᾮ", 1, 3, 1),FCE("ὦι", 2, 3, 2),FCE("ᾧ", 0, 3, 1),FCE("ᾯ", 1, 3, 1),
++FCE("ὧι", 2, 3, 2),FCE("ᾠ", 0, 3, 1),FCE("ᾨ", 1, 3, 1),FCE("ὠι", 2, 3, 2),
++FCE("ᾡ", 0, 3, 1),FCE("ᾩ", 1, 3, 1),FCE("ὡι", 2, 3, 2),FCE("ᾢ", 0, 3, 1),
++FCE("ᾪ", 1, 3, 1),FCE("ὢι", 2, 3, 2),FCE("ᾣ", 0, 3, 1),FCE("ᾫ", 1, 3, 1),
++FCE("ὣι", 2, 3, 2),FCE("ᾤ", 0, 3, 1),FCE("ᾬ", 1, 3, 1),FCE("ὤι", 2, 3, 2),
++FCE("ᾥ", 0, 3, 1),FCE("ᾭ", 1, 3, 1),FCE("ὥι", 2, 3, 2),FCE("ᾦ", 0, 3, 1),
++FCE("ᾮ", 1, 3, 1),FCE("ὦι", 2, 3, 2),FCE("ᾧ", 0, 3, 1),FCE("ᾯ", 1, 3, 1),
++FCE("ὧι", 2, 3, 2),FCE("ᾲ", 0, 2, 1),FCE("ὰι", 1, 2, 2),FCE("ᾳ", 0, 3, 1),
++FCE("ᾼ", 1, 3, 1),FCE("αι", 2, 3, 2),FCE("ᾴ", 0, 2, 1),FCE("άι", 1, 2, 2),
++FCE("ᾶ", 0, 2, 1),FCE("ᾶ", 1, 2, 2),FCE("ᾷ", 0, 2, 1),FCE("ᾶι", 1, 2, 3),
++FCE("ᾰ", 0, 2, 1),FCE("Ᾰ", 1, 2, 1),FCE("ᾱ", 0, 2, 1),FCE("Ᾱ", 1, 2, 1),
++FCE("ὰ", 0, 2, 1),FCE("Ὰ", 1, 2, 1),FCE("ά", 0, 2, 1),FCE("Ά", 1, 2, 1),
++FCE("ᾳ", 0, 3, 1),FCE("ᾼ", 1, 3, 1),FCE("αι", 2, 3, 2),FCE("ͅ", 0, 4, 1),
++FCE("Ι", 1, 4, 1),FCE("ι", 2, 4, 1),FCE("ι", 3, 4, 1),FCE("ῂ", 0, 2, 1),
++FCE("ὴι", 1, 2, 2),FCE("ῃ", 0, 3, 1),FCE("ῌ", 1, 3, 1),FCE("ηι", 2, 3, 2),
++FCE("ῄ", 0, 2, 1),FCE("ήι", 1, 2, 2),FCE("𐐌", 0, 2, 1),FCE("𐐴", 1, 2, 1),
++FCE("ῆ", 0, 2, 1),FCE("ῆ", 1, 2, 2),FCE("ῇ", 0, 2, 1),FCE("ῆι", 1, 2, 3),
++FCE("ὲ", 0, 2, 1),FCE("Ὲ", 1, 2, 1),FCE("έ", 0, 2, 1),FCE("Έ", 1, 2, 1),
++FCE("ὴ", 0, 2, 1),FCE("Ὴ", 1, 2, 1),FCE("ή", 0, 2, 1),FCE("Ή", 1, 2, 1),
++FCE("ῃ", 0, 3, 1),FCE("ῌ", 1, 3, 1),FCE("ηι", 2, 3, 2),FCE("ῒ", 0, 2, 1),
++FCE("ῒ", 1, 2, 3),FCE("ΐ", 0, 3, 1),FCE("ΐ", 1, 3, 1),FCE("ΐ", 2, 3, 3),
++FCE("ῖ", 0, 2, 1),FCE("ῖ", 1, 2, 2),FCE("ῗ", 0, 2, 1),FCE("ῗ", 1, 2, 3),
++FCE("ῐ", 0, 2, 1),FCE("Ῐ", 1, 2, 1),FCE("ῑ", 0, 2, 1),FCE("Ῑ", 1, 2, 1),
++FCE("ὶ", 0, 2, 1),FCE("Ὶ", 1, 2, 1),FCE("ί", 0, 2, 1),FCE("Ί", 1, 2, 1),
++FCE("𐐧", 0, 2, 1),FCE("𐑏", 1, 2, 1),FCE("ῢ", 0, 2, 1),FCE("ῢ", 1, 2, 3),
++FCE("ΰ", 0, 3, 1),FCE("ΰ", 1, 3, 1),FCE("ΰ", 2, 3, 3),FCE("ῤ", 0, 2, 1),
++FCE("ῤ", 1, 2, 2),FCE("ῦ", 0, 2, 1),FCE("ῦ", 1, 2, 2),FCE("ῧ", 0, 2, 1),
++FCE("ῧ", 1, 2, 3),FCE("ῠ", 0, 2, 1),FCE("Ῠ", 1, 2, 1),FCE("ῡ", 0, 2, 1),
++FCE("Ῡ", 1, 2, 1),FCE("ὺ", 0, 2, 1),FCE("Ὺ", 1, 2, 1),FCE("ύ", 0, 2, 1),
++FCE("Ύ", 1, 2, 1),FCE("ῥ", 0, 2, 1),FCE("Ῥ", 1, 2, 1),FCE("𐐁", 0, 2, 1),
++FCE("𐐩", 1, 2, 1),FCE("ῲ", 0, 2, 1),FCE("ὼι", 1, 2, 2),FCE("ῳ", 0, 3, 1),
++FCE("ῼ", 1, 3, 1),FCE("ωι", 2, 3, 2),FCE("ῴ", 0, 2, 1),FCE("ώι", 1, 2, 2),
++FCE("ῶ", 0, 2, 1),FCE("ῶ", 1, 2, 2),FCE("ῷ", 0, 2, 1),FCE("ῶι", 1, 2, 3),
++FCE("ὸ", 0, 2, 1),FCE("Ὸ", 1, 2, 1),FCE("ό", 0, 2, 1),FCE("Ό", 1, 2, 1),
++FCE("ὼ", 0, 2, 1),FCE("Ὼ", 1, 2, 1),FCE("ώ", 0, 2, 1),FCE("Ώ", 1, 2, 1),
++FCE("ῳ", 0, 3, 1),FCE("ῼ", 1, 3, 1),FCE("ωι", 2, 3, 2),FCE("Ⓚ", 0, 2, 1),
++FCE("ⓚ", 1, 2, 1),];
++return t;
++}
++
++struct uniProps
++{
++private alias _U = immutable(UnicodeProperty);
++@property static _U[] tab() { return _tab; }
++static immutable:
++private alias _T = ubyte[];
++_T So = [0x80, 0xa6, 0x1, 0x2, 0x1, 0x4, 0x1, 0x1, 0x1, 0x83, 0xd1, 0x1, 0x81, 0x8b, 0x2, 0x80, 0xce, 0x1, 0xa, 0x1, 0x13, 0x2, 0x80, 0xf7, 0x1, 0x82, 0x3, 0x1, 0x81, 0x75, 0x1, 0x80, 0x82, 0x6, 0x1, 0x1, 0x80, 0x84, 0x1, 0x80, 0xf9, 0x1, 0x81, 0x87, 0x3, 0xf, 0x1, 0x1, 0x3, 0x2, 0x6, 0x14, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0x85, 0x8, 0x1, 0x6, 0x1, 0x2, 0x5, 0x4, 0x80, 0xc5, 0x2, 0x82, 0xf0, 0xa, 0x85, 0xa6, 0x1, 0x80, 0x9d, 0x22, 0x81, 0x61, 0xa, 0x9, 0x9, 0x85, 0x83, 0x2, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0xb, 0x2, 0xe, 0x1, 0x1, 0x2, 0x1, 0x1, 0x45, 0x5, 0x2, 0x4, 0x1, 0x2, 0x1, 0x2, 0x1, 0x7, 0x1, 0x1f, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1f, 0x81, 0xc, 0x8, 0x4, 0x14, 0x2, 0x7, 0x2, 0x51, 0x1, 0x1e, 0x19, 0x28, 0x6, 0x12, 0xc, 0x27, 0x19, 0xb, 0x51, 0x4e, 0x16, 0x80, 0xb7, 0x1, 0x9, 0x1, 0x36, 0x8, 0x6f, 0x1, 0x80, 0x90, 0x1, 0x67, 0x2c, 0x2c, 0x40, 0x81, 0x0, 0x82, 0x0, 0x30, 0x15, 0x2, 0x9, 0xa, 0x81, 0x8b, 0x6, 0x81, 0x95, 0x1a, 0x1, 0x59, 0xc, 0x80, 0xd6, 0x1a, 0xc, 0x8, 0x1, 0xd, 0x2, 0xc, 0x1, 0x15, 0x2, 0x6, 0x2, 0x81, 0x50, 0x2, 0x4, 0xa, 0x20, 0x24, 0x1c, 0x1f, 0xb, 0x1e, 0x8, 0x1, 0xf, 0x20, 0xa, 0x27, 0xf, 0x3f, 0x1, 0x81, 0x0, 0x99, 0xc0, 0x40, 0xa0, 0x56, 0x90, 0x37, 0x83, 0x61, 0x4, 0xa, 0x2, 0x1, 0x1, 0x82, 0x3d, 0x3, 0xa0, 0x53, 0x83, 0x1, 0x81, 0xe6, 0x1, 0x3, 0x1, 0x4, 0x2, 0xd, 0x2, 0x81, 0x39, 0x9, 0x39, 0x11, 0x6, 0xc, 0x34, 0x2d, 0xa0, 0xce, 0x3, 0x80, 0xf6, 0xa, 0x27, 0x2, 0x3c, 0x5, 0x3, 0x16, 0x2, 0x7, 0x1e, 0x4, 0x30, 0x22, 0x42, 0x3, 0x1, 0x80, 0xba, 0x57, 0x9c, 0xa9, 0x2c, 0x4, 0x64, 0xc, 0xf, 0x2, 0xe, 0x2, 0xf, 0x1, 0xf, 0x30, 0x1f, 0x1, 0x3c, 0x4, 0x2b, 0x4b, 0x1d, 0xd, 0x2b, 0x5, 0x9, 0x7, 0x2, 0x80, 0xae, 0x21, 0xf, 0x6, 0x1, 0x46, 0x3, 0x14, 0xc, 0x25, 0x1, 0x5, 0x15, 0x11, 0xf, 0x3f, 0x1, 0x1, 0x1, 0x80, 0xb6, 0x1, 0x4, 0x3, 0x3e, 0x2, 0x4, 0xc, 0x18, 0x80, 0x93, 0x46, 0x4, 0xb, 0x30, 0x46, 0x3a, 0x74];
++_T Pf = [0x80, 0xbb, 0x1, 0x9f, 0x5d, 0x1, 0x3, 0x1, 0x1c, 0x1, 0x8d, 0xc8, 0x1, 0x1, 0x1, 0x4, 0x1, 0x2, 0x1, 0xf, 0x1, 0x3, 0x1];
++_T Bidi_Control = [0x86, 0x1c, 0x1, 0x99, 0xf1, 0x2, 0x1a, 0x5, 0x37, 0x4];
++_T Hex_Digit = [0x30, 0xa, 0x7, 0x6, 0x1a, 0x6, 0xa0, 0xfe, 0xa9, 0xa, 0x7, 0x6, 0x1a, 0x6];
++_T Other_Lowercase = [0x80, 0xaa, 0x1, 0xf, 0x1, 0x81, 0xf5, 0x9, 0x7, 0x2, 0x1e, 0x5, 0x60, 0x1, 0x34, 0x1, 0x99, 0xb1, 0x3f, 0xd, 0x1, 0x22, 0x25, 0x82, 0xb1, 0x1, 0xd, 0x1, 0x10, 0xd, 0x80, 0xd3, 0x10, 0x83, 0x50, 0x1a, 0x87, 0x92, 0x2, 0xa0, 0x7a, 0xf2, 0x1, 0x80, 0x87, 0x2];
++_T Quotation_Mark = [0x22, 0x1, 0x4, 0x1, 0x80, 0x83, 0x1, 0xf, 0x1, 0x9f, 0x5c, 0x8, 0x19, 0x2, 0x8f, 0xd1, 0x4, 0xd, 0x3, 0xa0, 0xce, 0x21, 0x4, 0x80, 0xbd, 0x1, 0x4, 0x1, 0x5a, 0x2];
++_T XID_Start = [0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x4, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xca, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x80, 0x81, 0x5, 0x1, 0x2, 0x3, 0x3, 0x8, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x8, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x1, 0x7, 0x27, 0x48, 0x1b, 0x5, 0x3, 0x2d, 0x2b, 0x23, 0x2, 0x1, 0x63, 0x1, 0x1, 0xf, 0x2, 0x7, 0x2, 0xa, 0x3, 0x2, 0x1, 0x10, 0x1, 0x1, 0x1e, 0x1d, 0x59, 0xb, 0x1, 0x18, 0x21, 0x9, 0x2, 0x4, 0x1, 0x5, 0x16, 0x4, 0x1, 0x9, 0x1, 0x3, 0x1, 0x17, 0x19, 0x47, 0x1, 0x1, 0xb, 0x57, 0x36, 0x3, 0x1, 0x12, 0x1, 0x7, 0xa, 0xf, 0x7, 0x1, 0x7, 0x5, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x3, 0x1, 0x10, 0x1, 0xd, 0x2, 0x1, 0x3, 0xe, 0x2, 0x13, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1f, 0x4, 0x1, 0x1, 0x13, 0x3, 0x10, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x12, 0x1, 0xf, 0x2, 0x23, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x1e, 0x2, 0x1, 0x3, 0xf, 0x1, 0x11, 0x1, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x16, 0x1, 0x34, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x1a, 0x2, 0x6, 0x2, 0x23, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x20, 0x1, 0x1, 0x2, 0xf, 0x2, 0x12, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x1, 0x10, 0x1, 0x11, 0x2, 0x18, 0x6, 0x5, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3a, 0x30, 0x1, 0x1, 0xd, 0x7, 0x3a, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x4, 0x1, 0x1, 0xa, 0x1, 0x2, 0x5, 0x1, 0x1, 0x15, 0x4, 0x20, 0x1, 0x3f, 0x8, 0x1, 0x24, 0x1b, 0x5, 0x73, 0x2b, 0x14, 0x1, 0x10, 0x6, 0x4, 0x4, 0x3, 0x1, 0x3, 0x2, 0x7, 0x3, 0x4, 0xd, 0xc, 0x1, 0x11, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x81, 0x4d, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x25, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x3, 0x3, 0xf, 0xd, 0x1, 0x4, 0xe, 0x12, 0xe, 0x12, 0xe, 0xd, 0x1, 0x3, 0xf, 0x34, 0x23, 0x1, 0x4, 0x1, 0x43, 0x58, 0x8, 0x29, 0x1, 0x1, 0x5, 0x46, 0xa, 0x1d, 0x33, 0x1e, 0x2, 0x5, 0xb, 0x2c, 0x15, 0x7, 0x38, 0x17, 0x9, 0x35, 0x52, 0x1, 0x5d, 0x2f, 0x11, 0x7, 0x37, 0x1e, 0xd, 0x2, 0xa, 0x2c, 0x1a, 0x24, 0x29, 0x3, 0xa, 0x24, 0x6b, 0x4, 0x1, 0x4, 0x3, 0x2, 0x9, 0x80, 0xc0, 0x40, 0x81, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x74, 0x1, 0xd, 0x1, 0x10, 0xd, 0x65, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x10, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x29, 0x8a, 0x77, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x4, 0x3, 0x2, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x1, 0x10, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x82, 0x26, 0x3, 0x19, 0x9, 0x7, 0x5, 0x2, 0x5, 0x4, 0x56, 0x6, 0x3, 0x1, 0x5a, 0x1, 0x4, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x84, 0x8d, 0x43, 0x2e, 0x2, 0x81, 0xd, 0x3, 0x10, 0xa, 0x2, 0x14, 0x2f, 0x10, 0x19, 0x8, 0x50, 0x27, 0x9, 0x2, 0x67, 0x2, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0xa, 0x1, 0x3, 0x1, 0x4, 0x1, 0x17, 0x1d, 0x34, 0xe, 0x32, 0x3e, 0x6, 0x3, 0x1, 0xe, 0x1c, 0xa, 0x17, 0x19, 0x1d, 0x7, 0x2f, 0x1c, 0x1, 0x30, 0x29, 0x17, 0x3, 0x1, 0x8, 0x14, 0x17, 0x3, 0x1, 0x5, 0x30, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x1, 0x18, 0x3, 0x2, 0xb, 0x7, 0x3, 0xc, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x23, 0x1d, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0x1, 0x1, 0xa, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x80, 0x8b, 0x6, 0x80, 0xda, 0x12, 0x40, 0x2, 0x36, 0x28, 0xa, 0x77, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7e, 0x24, 0x1a, 0x6, 0x1a, 0xb, 0x38, 0x2, 0x1f, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x45, 0x35, 0x81, 0xb, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x1b, 0x35, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x1, 0x5, 0x2a, 0x80, 0x9e, 0x83, 0x62, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x1, 0xf, 0x4, 0x1, 0x3, 0x1, 0x1b, 0x2c, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xba, 0x35, 0x4b, 0x2d, 0x20, 0x19, 0x1a, 0x24, 0x5c, 0x30, 0xe, 0x4, 0x84, 0xbb, 0x2b, 0x89, 0x55, 0x83, 0x6f, 0x80, 0x91, 0x63, 0x8b, 0x9d, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x1, 0x42, 0xd, 0xa0, 0x40, 0x60, 0x2, 0xa0, 0x23, 0xfe, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x96, 0x34, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Terminal_Punctuation = [0x21, 0x1, 0xa, 0x1, 0x1, 0x1, 0xb, 0x2, 0x3, 0x1, 0x83, 0x3e, 0x1, 0x8, 0x1, 0x82, 0x1, 0x1, 0x39, 0x1, 0x48, 0x1, 0xe, 0x1, 0x3, 0x1, 0x80, 0xb4, 0x1, 0x2b, 0xb, 0x1, 0x1, 0x80, 0xeb, 0x2, 0x36, 0xf, 0x1f, 0x1, 0x81, 0x5, 0x2, 0x84, 0xf4, 0x2, 0x80, 0xac, 0x1, 0x4, 0x6, 0x81, 0x37, 0x2, 0x83, 0x15, 0x8, 0x83, 0x4, 0x2, 0x7c, 0x3, 0x80, 0xe6, 0x3, 0x3, 0x1, 0x27, 0x4, 0x2, 0x2, 0x81, 0x3a, 0x2, 0x81, 0x62, 0x4, 0x80, 0xae, 0x2, 0x1, 0x3, 0x80, 0xdb, 0x5, 0x3e, 0x2, 0x83, 0xbc, 0x2, 0x9, 0x3, 0x8d, 0xe4, 0x1, 0x81, 0xd2, 0x2, 0xa0, 0x74, 0xfb, 0x2, 0x81, 0xd, 0x3, 0x80, 0xe3, 0x5, 0x81, 0x7e, 0x2, 0x56, 0x2, 0x5f, 0x1, 0x80, 0x97, 0x3, 0x80, 0x93, 0x3, 0x7f, 0x1, 0x10, 0x2, 0x80, 0xf9, 0x1, 0xa0, 0x52, 0x64, 0x3, 0x1, 0x4, 0x80, 0xa9, 0x1, 0xa, 0x1, 0x1, 0x1, 0xb, 0x2, 0x3, 0x1, 0x41, 0x1, 0x2, 0x1, 0x84, 0x3a, 0x1, 0x30, 0x1, 0x84, 0x86, 0x1, 0x80, 0xc7, 0x1, 0x82, 0x1a, 0x6, 0x85, 0x7, 0x7, 0x70, 0x4, 0x7f, 0x3, 0x80, 0x81, 0x2, 0x92, 0xa9, 0x4];
++_T Math = [0x2b, 0x1, 0x10, 0x3, 0x1f, 0x1, 0x1d, 0x1, 0x1, 0x1, 0x2d, 0x1, 0x4, 0x1, 0x25, 0x1, 0x1f, 0x1, 0x82, 0xd8, 0x3, 0x2, 0x1, 0x1a, 0x2, 0x2, 0x3, 0x82, 0xf, 0x3, 0x9a, 0xd, 0x1, 0x1b, 0x3, 0xb, 0x1, 0x3, 0x1, 0xd, 0x1, 0xe, 0x4, 0x15, 0x5, 0xb, 0x5, 0x41, 0xd, 0x4, 0x1, 0x3, 0x2, 0x4, 0x5, 0x12, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x3, 0x2, 0x2, 0x2, 0x1, 0x3, 0x1, 0x6, 0x3, 0xe, 0x1, 0x1, 0x44, 0x18, 0x1, 0x6, 0x1, 0x2, 0x4, 0x2, 0x4, 0x20, 0x1, 0x1, 0x6, 0x2, 0xe, 0x81, 0xc, 0x8, 0x4, 0x14, 0x2, 0x5a, 0x1, 0x1e, 0x1b, 0x1, 0x1, 0x18, 0x1, 0xb, 0x7, 0x81, 0xbd, 0x2, 0xc, 0xa, 0x4, 0x6, 0x4, 0x2, 0x2, 0x2, 0x3, 0x5, 0xe, 0x1, 0x1, 0x1, 0x2, 0x6, 0xb, 0x8, 0x5, 0x2, 0x39, 0x1, 0x1, 0x1, 0x1d, 0x4, 0x9, 0x3, 0x81, 0x50, 0x40, 0x81, 0x0, 0x82, 0x0, 0x30, 0x15, 0x2, 0x6, 0xa0, 0xcf, 0xdc, 0x1, 0x83, 0x37, 0x6, 0x1, 0x1, 0x80, 0xa2, 0x1, 0x10, 0x3, 0x1d, 0x1, 0x1, 0x1, 0x1d, 0x1, 0x1, 0x1, 0x80, 0x83, 0x1, 0x6, 0x4, 0xa0, 0xd4, 0x13, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x81, 0x24, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x34, 0x2];
++_T Lu = [0x41, 0x1a, 0x65, 0x17, 0x1, 0x7, 0x21, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x2, 0x4, 0x1, 0x2, 0x1, 0x3, 0x3, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x3, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0x21, 0x1, 0x1, 0x1, 0x3, 0x1, 0xf, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x1, 0x11, 0x1, 0x9, 0x23, 0x1, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x1, 0x2, 0x1, 0x1, 0x2, 0x2, 0x33, 0x30, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa, 0x26, 0x8b, 0x49, 0x26, 0x1, 0x1, 0x5, 0x1, 0x8d, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x8, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0x6, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x8, 0x48, 0x4, 0xc, 0x4, 0xc, 0x4, 0xc, 0x5, 0xb, 0x4, 0x81, 0x6, 0x1, 0x4, 0x1, 0x3, 0x3, 0x2, 0x3, 0x2, 0x1, 0x3, 0x5, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x2, 0x4, 0xa, 0x2, 0x5, 0x1, 0x3d, 0x1, 0x8a, 0x7c, 0x2f, 0x31, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x8, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x1, 0x1, 0x1, 0x4, 0x1, 0xa0, 0x79, 0x4d, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0x8b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0xd, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa0, 0x57, 0x76, 0x1a, 0x84, 0xc5, 0x28, 0xa0, 0xcf, 0xd8, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0x8, 0x1a, 0x1a, 0x1a, 0x2, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1b, 0x2, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1e, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x1];
++_T Other_Uppercase = [0xa0, 0x21, 0x60, 0x10, 0x83, 0x46, 0x1a];
++_T Sk = [0x5e, 0x1, 0x1, 0x1, 0x47, 0x1, 0x6, 0x1, 0x4, 0x1, 0x3, 0x1, 0x82, 0x9, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x11, 0x75, 0x1, 0xe, 0x2, 0x9c, 0x37, 0x1, 0x1, 0x3, 0xb, 0x3, 0xd, 0x3, 0xd, 0x3, 0xd, 0x2, 0x90, 0x9c, 0x2, 0xa0, 0x76, 0x63, 0x17, 0x9, 0x2, 0x67, 0x2, 0xa0, 0x54, 0x27, 0x10, 0x83, 0x7c, 0x1, 0x1, 0x1, 0x80, 0xa2, 0x1];
++_T Other_ID_Start = [0xa0, 0x21, 0x18, 0x1, 0x15, 0x1, 0x8f, 0x6c, 0x2];
++_T Nl = [0x96, 0xee, 0x3, 0x8a, 0x6f, 0x23, 0x2, 0x4, 0x8e, 0x7e, 0x1, 0x19, 0x9, 0xe, 0x3, 0xa0, 0x76, 0xab, 0xa, 0xa0, 0x5a, 0x50, 0x35, 0x81, 0xcc, 0x1, 0x8, 0x1, 0x80, 0x86, 0x5, 0xa0, 0x20, 0x2a, 0x63];
++_T Other_Alphabetic = [0x83, 0x45, 0x1, 0x82, 0x6a, 0xe, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x48, 0xb, 0x30, 0xd, 0x1, 0x7, 0x10, 0x1, 0x65, 0x7, 0x4, 0x4, 0x2, 0x2, 0x4, 0x1, 0x23, 0x1, 0x1e, 0x10, 0x66, 0xb, 0x65, 0x2, 0x3, 0x9, 0x1, 0x3, 0x1, 0x4, 0x80, 0xb7, 0x6, 0x6, 0xf, 0x1, 0x4, 0x36, 0x2, 0x2, 0xf, 0x1, 0x2, 0x5, 0x3, 0xa, 0x2, 0x1d, 0x3, 0x3a, 0x7, 0x2, 0x2, 0x2, 0x2, 0xa, 0x1, 0xa, 0x2, 0x1d, 0x3, 0x3a, 0x5, 0x4, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1e, 0x2, 0x3, 0x1, 0xb, 0x3, 0x3a, 0x8, 0x1, 0x3, 0x1, 0x2, 0x15, 0x2, 0x1d, 0x3, 0x3a, 0x7, 0x2, 0x2, 0x2, 0x2, 0x9, 0x2, 0xa, 0x2, 0x1e, 0x1, 0x3b, 0x5, 0x3, 0x3, 0x1, 0x3, 0xa, 0x1, 0x29, 0x3, 0x3a, 0x7, 0x1, 0x3, 0x1, 0x3, 0x8, 0x2, 0xb, 0x2, 0x1e, 0x2, 0x3a, 0x7, 0x1, 0x3, 0x1, 0x3, 0x8, 0x2, 0xb, 0x2, 0x1e, 0x2, 0x3a, 0x7, 0x1, 0x3, 0x1, 0x3, 0xa, 0x1, 0xa, 0x2, 0x1e, 0x2, 0x4b, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x2, 0x3d, 0x1, 0x2, 0x7, 0x12, 0x1, 0x63, 0x1, 0x2, 0x6, 0x1, 0x2, 0x10, 0x1, 0x80, 0xa3, 0x11, 0xb, 0xb, 0x1, 0x24, 0x6e, 0xc, 0x1, 0x1, 0x2, 0x4, 0x17, 0x4, 0x4, 0x3, 0x1, 0x1, 0x4, 0x2, 0x8, 0x4, 0xd, 0x5, 0x15, 0x2, 0x82, 0xc1, 0x1, 0x83, 0xb2, 0x2, 0x1e, 0x2, 0x1e, 0x2, 0x1e, 0x2, 0x42, 0x13, 0x80, 0xe0, 0x1, 0x76, 0xc, 0x4, 0x9, 0x77, 0x11, 0x7, 0x2, 0x4d, 0x5, 0x39, 0xa, 0x2, 0x14, 0x80, 0x8b, 0x5, 0x30, 0xf, 0x3c, 0x3, 0x1e, 0x9, 0x2, 0x2, 0x39, 0xb, 0x32, 0x12, 0x80, 0xbc, 0x2, 0x87, 0xc2, 0x34, 0x88, 0xf6, 0x20, 0xa0, 0x78, 0x74, 0x8, 0x23, 0x1, 0x81, 0x83, 0x5, 0x58, 0x2, 0x32, 0x10, 0x62, 0x5, 0x1c, 0xc, 0x2d, 0x4, 0x30, 0xc, 0x69, 0xe, 0xc, 0x1, 0x8, 0x2, 0x62, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x1, 0x2c, 0x5, 0x5, 0x1, 0x80, 0xed, 0x8, 0xa0, 0x4f, 0x33, 0x1, 0x8e, 0xe2, 0x3, 0x1, 0x2, 0x5, 0x4, 0x85, 0xf0, 0x3, 0x35, 0xe, 0x3c, 0x1, 0x2d, 0x9, 0x47, 0x3, 0x24, 0xc, 0x4d, 0x3, 0x30, 0xd, 0x84, 0xeb, 0xb, 0xa0, 0x58, 0x9b, 0x2e];
++_T Alphabetic = [0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x4, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xca, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x56, 0x1, 0x2a, 0x5, 0x1, 0x2, 0x2, 0x4, 0x8, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x8, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x1, 0x7, 0x27, 0x28, 0xe, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x8, 0x1b, 0x5, 0x3, 0x1d, 0xb, 0x5, 0x38, 0x1, 0x7, 0xe, 0x66, 0x1, 0x8, 0x4, 0x8, 0x4, 0x3, 0xa, 0x3, 0x2, 0x1, 0x10, 0x30, 0xd, 0x65, 0x18, 0x21, 0x9, 0x2, 0x4, 0x1, 0x5, 0x18, 0x2, 0x13, 0x13, 0x19, 0x47, 0x1, 0x1, 0xb, 0x37, 0x6, 0x6, 0xf, 0x1, 0x3c, 0x1, 0x10, 0x1, 0x3, 0x4, 0xf, 0xd, 0x7, 0x1, 0x7, 0x1, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x3, 0x8, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x8, 0x1, 0x4, 0x2, 0x1, 0x5, 0xc, 0x2, 0xf, 0x3, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x4, 0x5, 0x4, 0x2, 0x2, 0x2, 0x4, 0x1, 0x7, 0x4, 0x1, 0x1, 0x11, 0x6, 0xb, 0x3, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x9, 0x1, 0x3, 0x1, 0x2, 0x3, 0x1, 0xf, 0x4, 0x1d, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x8, 0x2, 0x2, 0x2, 0x2, 0x9, 0x2, 0x4, 0x2, 0x1, 0x5, 0xd, 0x1, 0x10, 0x2, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x4, 0x5, 0x3, 0x3, 0x1, 0x3, 0x3, 0x1, 0x6, 0x1, 0x29, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x3, 0x8, 0x2, 0x1, 0x2, 0x6, 0x4, 0x1e, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x3, 0x8, 0x2, 0x7, 0x1, 0x1, 0x4, 0xd, 0x2, 0xf, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x8, 0x1, 0x3, 0x1, 0x3, 0x1, 0x1, 0x8, 0x1, 0x8, 0x4, 0x16, 0x6, 0x2, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x8, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x2, 0xd, 0x3a, 0x5, 0x7, 0x6, 0x1, 0x33, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0xd, 0x1, 0x3, 0x2, 0x5, 0x1, 0x1, 0x6, 0x1, 0xe, 0x4, 0x20, 0x1, 0x3f, 0x8, 0x1, 0x24, 0x4, 0x11, 0x6, 0x10, 0x1, 0x24, 0x43, 0x37, 0x1, 0x1, 0x2, 0x5, 0x10, 0x13, 0x2, 0x4, 0x5, 0x19, 0x7, 0x1, 0xd, 0x2, 0x2, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x81, 0x4d, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x4, 0x1, 0x20, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x3, 0x3, 0xf, 0xd, 0x1, 0x6, 0xc, 0x14, 0xc, 0x14, 0xc, 0xd, 0x1, 0x3, 0x1, 0x2, 0xc, 0x34, 0x2, 0x13, 0xe, 0x1, 0x4, 0x1, 0x43, 0x58, 0x8, 0x2b, 0x5, 0x46, 0xa, 0x1d, 0x3, 0xc, 0x4, 0x9, 0x17, 0x1e, 0x2, 0x5, 0xb, 0x2c, 0x4, 0x1a, 0x36, 0x1c, 0x4, 0x3f, 0x2, 0x14, 0x32, 0x1, 0x58, 0x34, 0x1, 0xf, 0x1, 0x7, 0x34, 0x2a, 0x2, 0x4, 0xa, 0x2c, 0x1, 0xb, 0xe, 0x36, 0x17, 0x3, 0xa, 0x24, 0x6b, 0x4, 0x1, 0x6, 0x1, 0x2, 0x9, 0x80, 0xc0, 0x40, 0x81, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x74, 0x1, 0xd, 0x1, 0x10, 0xd, 0x65, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x3, 0x5, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0xb, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x29, 0x83, 0x2d, 0x34, 0x87, 0x16, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x4, 0x3, 0x2, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x1, 0x10, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x20, 0x2f, 0x1, 0x81, 0xd5, 0x3, 0x19, 0x9, 0x7, 0x5, 0x2, 0x5, 0x4, 0x56, 0x6, 0x3, 0x1, 0x5a, 0x1, 0x4, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x84, 0x8d, 0x43, 0x2e, 0x2, 0x81, 0xd, 0x3, 0x10, 0xa, 0x2, 0x14, 0x2f, 0x5, 0x8, 0x3, 0x19, 0x7, 0x51, 0x27, 0x9, 0x2, 0x67, 0x2, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0xa, 0x1, 0x3, 0x1, 0x4, 0x1, 0x1c, 0x18, 0x34, 0xc, 0x44, 0x2e, 0x6, 0x3, 0x1, 0xe, 0x21, 0x5, 0x23, 0xd, 0x1d, 0x3, 0x33, 0x1, 0xc, 0xf, 0x1, 0x30, 0x37, 0x9, 0xe, 0x12, 0x17, 0x3, 0x1, 0x5, 0x3f, 0x1, 0x1, 0x1, 0x1, 0x18, 0x3, 0x2, 0x10, 0x2, 0x4, 0xb, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x2b, 0x15, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0xc, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x81, 0x6b, 0x12, 0x40, 0x2, 0x36, 0x28, 0xc, 0x74, 0x5, 0x1, 0x80, 0x87, 0x24, 0x1a, 0x6, 0x1a, 0xb, 0x59, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x45, 0x35, 0x81, 0xb, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x1b, 0x35, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x1, 0x5, 0x2a, 0x80, 0x9e, 0x83, 0x62, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x4, 0x1, 0x2, 0x5, 0x8, 0x1, 0x3, 0x1, 0x1b, 0x2c, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xb7, 0x46, 0x3c, 0x37, 0x17, 0x19, 0x17, 0x33, 0x4d, 0x40, 0x1, 0x4, 0x84, 0xbb, 0x36, 0x89, 0x4a, 0x83, 0x6f, 0x80, 0x91, 0x63, 0x8b, 0x9d, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x2f, 0x14, 0xd, 0xa0, 0x40, 0x60, 0x2, 0xa0, 0x23, 0xfe, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x96, 0x34, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Zs = [0x20, 0x1, 0x7f, 0x1, 0x95, 0xdf, 0x1, 0x89, 0x7f, 0xb, 0x24, 0x1, 0x2f, 0x1, 0x8f, 0xa0, 0x1];
++_T Variation_Selector = [0x98, 0xb, 0x3, 0xa0, 0xe5, 0xf2, 0x10, 0xad, 0x2, 0xf0, 0x80, 0xf0];
++_T Other_Default_Ignorable_Code_Point = [0x83, 0x4f, 0x1, 0x8e, 0xf, 0x2, 0x86, 0x53, 0x2, 0x88, 0xaf, 0x1, 0x90, 0xfe, 0x1, 0xa0, 0xce, 0x3b, 0x1, 0x4f, 0x9, 0xad, 0x0, 0x7, 0x1, 0x1, 0x1e, 0x60, 0x80, 0x80, 0x80, 0xf0, 0x8e, 0x10];
++_T IDS_Binary_Operator = [0xa0, 0x2f, 0xf0, 0x2, 0x2, 0x8];
++_T Grapheme_Base = [0x20, 0x5f, 0x21, 0xd, 0x1, 0x82, 0x52, 0x70, 0x8, 0x2, 0x5, 0x5, 0x7, 0x1, 0x1, 0x1, 0x14, 0x1, 0x80, 0xe0, 0x7, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x7, 0x1, 0x27, 0x1, 0x2, 0x4, 0x1, 0x2e, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x9, 0x1b, 0x5, 0x5, 0x11, 0xa, 0xb, 0x1, 0x2, 0x2d, 0x15, 0x10, 0x1, 0x65, 0x8, 0x1, 0x6, 0x2, 0x2, 0x1, 0x4, 0x20, 0x2, 0x1, 0x1, 0x1e, 0x1d, 0x59, 0xb, 0x1, 0xe, 0x2b, 0x9, 0x7, 0x5, 0x16, 0x4, 0x1, 0x9, 0x1, 0x3, 0x1, 0x7, 0xf, 0x1, 0x19, 0x5, 0x1, 0x41, 0x1, 0x1, 0xb, 0x56, 0x37, 0x1, 0x1, 0x1, 0x4, 0x8, 0x4, 0x1, 0x3, 0x7, 0xa, 0x2, 0x14, 0x1, 0x7, 0x2, 0x2, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x3, 0x1, 0x1, 0x2, 0x6, 0x2, 0x2, 0x2, 0x1, 0x1, 0xd, 0x2, 0x1, 0x3, 0x4, 0x16, 0x7, 0x1, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x4, 0x3, 0x18, 0x4, 0x1, 0x1, 0x7, 0xa, 0x2, 0x3, 0xe, 0x1, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x4, 0x8, 0x1, 0x1, 0x2, 0x3, 0x1, 0xf, 0x2, 0x4, 0xc, 0x10, 0x2, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x2, 0x1, 0x6, 0x2, 0x2, 0x2, 0xf, 0x2, 0x1, 0x3, 0x4, 0x12, 0xb, 0x1, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x5, 0x1, 0x1, 0x2, 0x3, 0x3, 0x1, 0x3, 0x3, 0x1, 0x15, 0x15, 0x6, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x3, 0x4, 0x13, 0x2, 0x6, 0x2, 0x4, 0xa, 0x8, 0x8, 0x2, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x2, 0x1, 0x2, 0x12, 0x1, 0x1, 0x2, 0x4, 0xa, 0x1, 0x2, 0xf, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x1, 0x1, 0x2, 0x5, 0x3, 0x1, 0x3, 0x1, 0x1, 0x11, 0x2, 0x4, 0x10, 0x3, 0x7, 0x2, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x9, 0x2, 0x6, 0x7, 0x13, 0x3, 0xc, 0x30, 0x1, 0x2, 0xb, 0x8, 0x8, 0xd, 0x25, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x4, 0x1, 0x2, 0x9, 0x1, 0x2, 0x5, 0x1, 0x1, 0x9, 0xa, 0x2, 0x4, 0x20, 0x18, 0x2, 0x1b, 0x1, 0x1, 0x1, 0x1, 0x1, 0xe, 0x1, 0x24, 0x12, 0x1, 0x5, 0x1, 0x2, 0x5, 0x31, 0x8, 0x1, 0x6, 0x1, 0xd, 0x25, 0x2d, 0x4, 0x1, 0x6, 0x1, 0x2, 0x2, 0x2, 0x19, 0x2, 0x4, 0x3, 0x10, 0x4, 0xd, 0x1, 0x2, 0x2, 0x6, 0x1, 0xf, 0x1, 0x28, 0x1, 0x1, 0x5, 0x1, 0x2, 0x81, 0x79, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x5, 0x1d, 0x3, 0x1a, 0x6, 0x55, 0xb, 0x82, 0x9d, 0x3, 0x51, 0xf, 0xd, 0x1, 0x4, 0xe, 0x12, 0x3, 0x2, 0x9, 0x12, 0xe, 0xd, 0x1, 0x3, 0xf, 0x34, 0x2, 0x1, 0x7, 0x8, 0x1, 0x2, 0xb, 0x9, 0x3, 0xa, 0x6, 0xa, 0x6, 0xb, 0x5, 0xa, 0x6, 0x58, 0x8, 0x29, 0x1, 0x1, 0x5, 0x46, 0xa, 0x1d, 0x6, 0x4, 0x2, 0x3, 0x4, 0x2, 0x1, 0x6, 0x7, 0x1, 0x3, 0x2a, 0x2, 0x5, 0xb, 0x2c, 0x4, 0x1a, 0x6, 0xb, 0x3, 0x39, 0x2, 0x2, 0x3, 0x38, 0x1, 0x1, 0x9, 0x1, 0x1, 0x2, 0x8, 0x6, 0xd, 0xa, 0x6, 0xa, 0x6, 0xe, 0x56, 0x30, 0x1, 0x1, 0x5, 0x1, 0x1, 0x5, 0x1, 0x9, 0x4, 0x1b, 0x9, 0x9, 0x5, 0x20, 0x4, 0x2, 0x2, 0x1, 0x1, 0x3a, 0x1, 0x1, 0x2, 0x3, 0x1, 0x1, 0x3, 0x2, 0x8, 0x30, 0x8, 0x2, 0x5, 0xf, 0x3, 0x33, 0x40, 0x8, 0xb, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x2, 0x9, 0x80, 0xc0, 0x40, 0x81, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0xf, 0x1, 0xe, 0x2, 0x6, 0x1, 0x13, 0x2, 0x3, 0x1, 0x9, 0x1, 0xb, 0x5, 0x18, 0x7, 0x31, 0x10, 0x2, 0x2, 0x1b, 0x1, 0xd, 0x3, 0x1b, 0x45, 0x80, 0x8a, 0x6, 0x82, 0x64, 0xc, 0x27, 0x19, 0xb, 0x15, 0x82, 0xa0, 0x1, 0x84, 0x4c, 0x3, 0xa, 0x80, 0xa6, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x8f, 0x3, 0x2, 0x5, 0x2d, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x2, 0xf, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x21, 0x3c, 0x44, 0x1a, 0x1, 0x59, 0xc, 0x80, 0xd6, 0x1a, 0xc, 0x4, 0x2a, 0x6, 0x10, 0x1, 0x56, 0x4, 0x65, 0x5, 0x29, 0x3, 0x5e, 0x1, 0x2b, 0x5, 0x24, 0xc, 0x2f, 0x1, 0x80, 0xdf, 0x1, 0x9a, 0xb6, 0xa, 0xa0, 0x52, 0xd, 0x33, 0x84, 0x8d, 0x3, 0x37, 0x9, 0x81, 0x5c, 0x14, 0x2f, 0x4, 0x1, 0xa, 0x1a, 0x8, 0x50, 0x2, 0x6, 0x8, 0x80, 0x8f, 0x1, 0x4, 0xc, 0xb, 0x4d, 0xa, 0x1, 0x3, 0x1, 0x4, 0x1, 0x19, 0x2, 0x5, 0x4, 0xa, 0x6, 0x38, 0x8, 0x44, 0xa, 0xc, 0x18, 0xa, 0x4, 0x26, 0x8, 0x19, 0xb, 0x2, 0xb, 0x1e, 0x6, 0x30, 0x1, 0x2, 0x4, 0x2, 0x1, 0x11, 0x1, 0xb, 0x4, 0x2, 0x20, 0x29, 0x6, 0x2, 0x2, 0x2, 0xb, 0x3, 0x1, 0x8, 0x1, 0x1, 0x2, 0xa, 0x2, 0x20, 0x4, 0x30, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x1, 0x18, 0x11, 0x2, 0x8, 0xb, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x25, 0x1, 0x2, 0x1, 0x4, 0x3, 0xa, 0x6, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0x1, 0x1, 0x18, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x7c, 0x11, 0x81, 0x6d, 0x10, 0x40, 0x2, 0x36, 0x28, 0xe, 0x12, 0xa, 0x16, 0x23, 0x1, 0x13, 0x1, 0x4, 0x4, 0x5, 0x1, 0x80, 0x87, 0x4, 0x80, 0x9d, 0x2, 0x1f, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x3, 0x7, 0x1, 0x7, 0xd, 0x2, 0x2, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x5, 0x3, 0x4, 0x2d, 0x3, 0x54, 0x5, 0xc, 0x34, 0x2d, 0x80, 0x83, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x1, 0x4, 0xc, 0x1b, 0x35, 0x1e, 0x1, 0x25, 0x4, 0xe, 0x2a, 0x80, 0x9e, 0x2, 0xa, 0x83, 0x56, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x1, 0x9, 0x80, 0xa0, 0x1c, 0x3, 0x1b, 0x5, 0x1, 0x40, 0x38, 0x6, 0x2, 0x40, 0x1, 0xf, 0x4, 0x1, 0x3, 0x1, 0x1b, 0xc, 0x8, 0x8, 0x9, 0x7, 0x20, 0x80, 0x80, 0x36, 0x3, 0x1d, 0x2, 0x1b, 0x5, 0x8, 0x80, 0x80, 0x49, 0x82, 0x17, 0x1f, 0x81, 0x81, 0x1, 0x1, 0x36, 0xf, 0x7, 0x4, 0x1e, 0x12, 0x31, 0x4, 0x2, 0x2, 0x2, 0x1, 0x4, 0xe, 0x19, 0x7, 0xa, 0x9, 0x24, 0x5, 0x1, 0x9, 0xe, 0x3e, 0x34, 0x9, 0xa, 0x7, 0xa, 0x84, 0xa6, 0x2b, 0x1, 0x1, 0x1, 0x2, 0x6, 0x1, 0x9, 0xa, 0x89, 0x36, 0x83, 0x6f, 0x80, 0x91, 0x63, 0xd, 0x4, 0x8b, 0x8c, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x2f, 0x14, 0xd, 0xa0, 0x40, 0x60, 0x2, 0x9f, 0xfe, 0x80, 0xf6, 0xa, 0x27, 0x2, 0x3c, 0x1, 0x1, 0x3, 0x4, 0x15, 0x2, 0x7, 0x1e, 0x4, 0x30, 0x22, 0x42, 0x3, 0x1, 0x80, 0xba, 0x57, 0x9, 0x12, 0x80, 0x8e, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x81, 0x24, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x34, 0x2, 0x81, 0xe, 0x2c, 0x4, 0x64, 0xc, 0xf, 0x2, 0xe, 0x2, 0xf, 0x1, 0xf, 0x20, 0xb, 0x5, 0x1f, 0x1, 0x3c, 0x4, 0x2b, 0x4b, 0x1d, 0xd, 0x2b, 0x5, 0x9, 0x7, 0x2, 0x80, 0xae, 0x21, 0xf, 0x6, 0x1, 0x46, 0x3, 0x14, 0xc, 0x25, 0x1, 0x5, 0x15, 0x11, 0xf, 0x3f, 0x1, 0x1, 0x1, 0x80, 0xb6, 0x1, 0x4, 0x3, 0x3e, 0x2, 0x4, 0xc, 0x18, 0x80, 0x93, 0x46, 0x4, 0xb, 0x30, 0x46, 0x3a, 0x74, 0x88, 0x8c, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Case_Ignorable = [0x27, 0x1, 0x6, 0x1, 0xb, 0x1, 0x23, 0x1, 0x1, 0x1, 0x47, 0x1, 0x4, 0x1, 0x1, 0x1, 0x4, 0x1, 0x2, 0x2, 0x81, 0xf7, 0x80, 0xc0, 0x4, 0x2, 0x4, 0x1, 0x9, 0x2, 0x1, 0x1, 0x80, 0xfb, 0x7, 0x80, 0xcf, 0x1, 0x37, 0x2d, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2c, 0x1, 0xb, 0x5, 0xb, 0xb, 0x1, 0x1, 0x23, 0x1, 0xa, 0x15, 0x10, 0x1, 0x65, 0x8, 0x1, 0xa, 0x1, 0x4, 0x21, 0x1, 0x1, 0x1, 0x1e, 0x1b, 0x5b, 0xb, 0x3a, 0xb, 0x4, 0x1, 0x1b, 0x18, 0x2b, 0x3, 0x80, 0x88, 0x1b, 0x1, 0x3, 0x37, 0x1, 0x1, 0x1, 0x4, 0x8, 0x4, 0x1, 0x3, 0x7, 0xa, 0x2, 0xd, 0x1, 0xf, 0x1, 0x3a, 0x1, 0x4, 0x4, 0x8, 0x1, 0x14, 0x2, 0x1d, 0x2, 0x39, 0x1, 0x4, 0x2, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x1e, 0x2, 0x3, 0x1, 0xb, 0x2, 0x39, 0x1, 0x4, 0x5, 0x1, 0x2, 0x4, 0x1, 0x14, 0x2, 0x1d, 0x1, 0x3a, 0x1, 0x2, 0x1, 0x1, 0x4, 0x8, 0x1, 0x8, 0x1, 0xb, 0x2, 0x1e, 0x1, 0x3d, 0x1, 0xc, 0x1, 0x70, 0x3, 0x5, 0x3, 0x1, 0x4, 0x7, 0x2, 0xb, 0x2, 0x58, 0x1, 0x2, 0x1, 0x6, 0x1, 0x5, 0x2, 0x14, 0x2, 0x5d, 0x4, 0x8, 0x1, 0x14, 0x2, 0x66, 0x1, 0x7, 0x3, 0x1, 0x1, 0x5a, 0x1, 0x2, 0x7, 0xb, 0x9, 0x62, 0x1, 0x2, 0x6, 0x1, 0x2, 0x9, 0x1, 0x1, 0x6, 0x4a, 0x2, 0x1b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x37, 0xe, 0x1, 0x5, 0x1, 0x2, 0x5, 0xb, 0x1, 0x24, 0x9, 0x1, 0x66, 0x4, 0x1, 0x6, 0x1, 0x2, 0x2, 0x2, 0x19, 0x2, 0x4, 0x3, 0x10, 0x4, 0xd, 0x1, 0x2, 0x2, 0x6, 0x1, 0xf, 0x1, 0x5e, 0x1, 0x82, 0x60, 0x3, 0x83, 0xb2, 0x3, 0x1d, 0x3, 0x1d, 0x2, 0x1e, 0x2, 0x40, 0x2, 0x1, 0x7, 0x8, 0x1, 0x2, 0xb, 0x3, 0x1, 0x5, 0x1, 0x2d, 0x4, 0x34, 0x1, 0x65, 0x1, 0x76, 0x3, 0x4, 0x2, 0x9, 0x1, 0x6, 0x3, 0x80, 0xdb, 0x2, 0x2, 0x1, 0x3a, 0x1, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x2, 0x8, 0x6, 0xa, 0x2, 0x1, 0x27, 0x1, 0x58, 0x4, 0x30, 0x1, 0x1, 0x5, 0x1, 0x1, 0x5, 0x1, 0x28, 0x9, 0xc, 0x2, 0x20, 0x4, 0x2, 0x2, 0x1, 0x1, 0x3a, 0x1, 0x1, 0x2, 0x3, 0x1, 0x1, 0x3, 0x3a, 0x8, 0x2, 0x2, 0x40, 0x6, 0x52, 0x3, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x37, 0x3f, 0xd, 0x1, 0x22, 0x4c, 0x15, 0x4, 0x81, 0xbd, 0x1, 0x1, 0x3, 0xb, 0x3, 0xd, 0x3, 0xd, 0x3, 0xd, 0x2, 0xc, 0x5, 0x8, 0x2, 0xa, 0x1, 0x2, 0x1, 0x2, 0x5, 0x31, 0x5, 0x1, 0xa, 0x1, 0x1, 0xd, 0x1, 0x10, 0xd, 0x33, 0x21, 0x8b, 0x8b, 0x2, 0x71, 0x3, 0x7d, 0x1, 0xf, 0x1, 0x60, 0x20, 0x2f, 0x1, 0x81, 0xd5, 0x1, 0x24, 0x4, 0x3, 0x5, 0x5, 0x1, 0x5d, 0x6, 0x5d, 0x3, 0xa0, 0x6f, 0x16, 0x1, 0x84, 0xe2, 0x6, 0x81, 0xe, 0x1, 0x62, 0x4, 0x1, 0xa, 0x1, 0x1, 0x1f, 0x1, 0x50, 0x2, 0xe, 0x22, 0x4e, 0x1, 0x17, 0x3, 0x6d, 0x2, 0x8, 0x1, 0x3, 0x1, 0x4, 0x1, 0x19, 0x2, 0x80, 0x9d, 0x1, 0x1b, 0x12, 0x34, 0x8, 0x19, 0xb, 0x2e, 0x3, 0x30, 0x1, 0x2, 0x4, 0x2, 0x1, 0x12, 0x1, 0x59, 0x6, 0x2, 0x2, 0x2, 0x2, 0xc, 0x1, 0x8, 0x1, 0x23, 0x1, 0x3f, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x1b, 0x1, 0xe, 0x2, 0x5, 0x2, 0x1, 0x1, 0x80, 0xee, 0x1, 0x2, 0x1, 0x4, 0x1, 0xa0, 0x4f, 0x30, 0x1, 0x80, 0x93, 0x10, 0x82, 0x3e, 0x10, 0x3, 0x1, 0xc, 0x7, 0x2b, 0x1, 0x2, 0x1, 0x80, 0xa9, 0x1, 0x7, 0x1, 0x6, 0x1, 0xb, 0x1, 0x23, 0x1, 0x1, 0x1, 0x2f, 0x1, 0x2d, 0x2, 0x43, 0x1, 0x15, 0x3, 0x82, 0x1, 0x1, 0x88, 0x3, 0x3, 0x1, 0x2, 0x5, 0x4, 0x28, 0x3, 0x4, 0x1, 0x85, 0xc1, 0x1, 0x36, 0xf, 0x39, 0x2, 0x31, 0x4, 0x2, 0x2, 0x2, 0x1, 0x42, 0x3, 0x24, 0x5, 0x1, 0x8, 0x4b, 0x2, 0x34, 0x9, 0x84, 0xec, 0x1, 0x1, 0x1, 0x2, 0x6, 0x1, 0x1, 0xa0, 0x58, 0xd7, 0x11, 0xa0, 0x61, 0xc7, 0x3, 0x9, 0x10, 0x2, 0x7, 0x1e, 0x4, 0x80, 0x94, 0x3, 0xac, 0x2d, 0xbc, 0x1, 0x1e, 0x60, 0x80, 0x80, 0x80, 0xf0];
++_T STerm = [0x21, 0x1, 0xc, 0x1, 0x10, 0x1, 0x85, 0x1c, 0x1, 0x1, 0x1, 0x2a, 0x1, 0x80, 0x95, 0x1, 0x80, 0xb4, 0x1, 0x2b, 0x3, 0x80, 0xf6, 0x1, 0x81, 0x6a, 0x2, 0x86, 0xe4, 0x2, 0x83, 0x16, 0x1, 0x4, 0x2, 0x83, 0x5, 0x1, 0x80, 0xc6, 0x2, 0x80, 0xcc, 0x1, 0x5, 0x1, 0x81, 0x3a, 0x2, 0x81, 0x62, 0x4, 0x80, 0xae, 0x2, 0x2, 0x2, 0x80, 0xdb, 0x2, 0x41, 0x2, 0x83, 0xbc, 0x2, 0x9, 0x3, 0x8d, 0xe4, 0x1, 0x81, 0xd3, 0x1, 0xa0, 0x74, 0xfc, 0x1, 0x81, 0xe, 0x2, 0x80, 0xe3, 0x1, 0x3, 0x1, 0x81, 0x7e, 0x2, 0x56, 0x2, 0x5f, 0x1, 0x80, 0x98, 0x2, 0x80, 0x93, 0x3, 0x80, 0x90, 0x2, 0x80, 0xf9, 0x1, 0xa0, 0x52, 0x66, 0x1, 0x3, 0x2, 0x80, 0xa9, 0x1, 0xc, 0x1, 0x10, 0x1, 0x41, 0x1, 0x8a, 0xf4, 0x2, 0x85, 0xef, 0x2, 0x75, 0x4, 0x7f, 0x3, 0x80, 0x81, 0x2];
++_T Diacritic = [0x5e, 0x1, 0x1, 0x1, 0x47, 0x1, 0x6, 0x1, 0x4, 0x1, 0x2, 0x2, 0x81, 0xf7, 0x80, 0x9f, 0x1, 0x8, 0x5, 0x6, 0x11, 0x2, 0x4, 0x1, 0x9, 0x2, 0x80, 0xfd, 0x5, 0x80, 0xd1, 0x1, 0x37, 0x11, 0x1, 0x1b, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x80, 0x86, 0x8, 0x4, 0x2, 0x80, 0x86, 0x2, 0x4, 0x2, 0x3, 0x3, 0x43, 0x1b, 0x5b, 0xb, 0x3a, 0xb, 0x22, 0x2, 0x80, 0xca, 0x1b, 0x3d, 0x1, 0x10, 0x1, 0x3, 0x4, 0x1c, 0x1, 0x4a, 0x1, 0x10, 0x1, 0x6e, 0x1, 0x10, 0x1, 0x6e, 0x1, 0x10, 0x1, 0x6e, 0x1, 0x10, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x6e, 0x1, 0x10, 0x1, 0x7f, 0x1, 0x7c, 0x1, 0x7c, 0x6, 0x1, 0x1, 0x79, 0x5, 0x4b, 0x2, 0x1b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x2, 0x42, 0x3, 0x1, 0x2, 0x3e, 0x1, 0x70, 0x1, 0x1, 0x2, 0x4c, 0x7, 0x1, 0x1, 0xa, 0x2, 0x87, 0x2d, 0xb, 0x9, 0x1, 0x81, 0x5b, 0x3, 0x81, 0x39, 0x8, 0x2, 0x1, 0x80, 0xb4, 0x1, 0xf, 0x1, 0x26, 0x9, 0x36, 0x2, 0x80, 0x8a, 0x2, 0x40, 0x6, 0x52, 0x19, 0x4, 0x1, 0x6, 0x1, 0x37, 0x3f, 0x59, 0xc, 0x2d, 0x3, 0x81, 0xbd, 0x1, 0x1, 0x3, 0xb, 0x3, 0xd, 0x3, 0xd, 0x3, 0xd, 0x2, 0x8c, 0xf0, 0x3, 0x81, 0x3d, 0x1, 0x81, 0xfa, 0x6, 0x69, 0x4, 0x5f, 0x1, 0xa0, 0x75, 0x72, 0x1, 0xc, 0x2, 0x1, 0x1, 0x70, 0x2, 0x25, 0xb, 0x66, 0x1, 0x6f, 0x2, 0x80, 0xca, 0x1, 0x1b, 0x12, 0x39, 0x4, 0x24, 0x1, 0x5f, 0x1, 0xc, 0x1, 0x80, 0xba, 0x1, 0x43, 0x4, 0x33, 0x1, 0x80, 0xf5, 0x2, 0xa0, 0x4f, 0x30, 0x1, 0x83, 0x1, 0x7, 0x81, 0x17, 0x1, 0x1, 0x1, 0x2f, 0x1, 0x2d, 0x2, 0x43, 0x1, 0x90, 0xd5, 0x2, 0x78, 0x2, 0x80, 0x8b, 0x1, 0x84, 0xf5, 0x2, 0xa0, 0x58, 0xd7, 0x11, 0xa0, 0x61, 0xc7, 0x3, 0x3, 0x6, 0x8, 0x8, 0x2, 0x7, 0x1e, 0x4];
++_T Lm = [0x82, 0xb0, 0x12, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x80, 0x85, 0x1, 0x5, 0x1, 0x81, 0xde, 0x1, 0x80, 0xe6, 0x1, 0x80, 0xa4, 0x2, 0x81, 0xd, 0x2, 0x4, 0x1, 0x1f, 0x1, 0x9, 0x1, 0x3, 0x1, 0x81, 0x48, 0x1, 0x84, 0xd4, 0x1, 0x7f, 0x1, 0x82, 0x35, 0x1, 0x86, 0xda, 0x1, 0x6b, 0x1, 0x82, 0x63, 0x1, 0x81, 0xd0, 0x6, 0x80, 0xae, 0x3f, 0xd, 0x1, 0x22, 0x25, 0x82, 0xb1, 0x1, 0xd, 0x1, 0x10, 0xd, 0x8b, 0xdf, 0x2, 0x80, 0xf1, 0x1, 0x80, 0xbf, 0x1, 0x81, 0xd5, 0x1, 0x2b, 0x5, 0x5, 0x1, 0x61, 0x2, 0x5d, 0x3, 0xa0, 0x6f, 0x16, 0x1, 0x84, 0xe2, 0x6, 0x81, 0xe, 0x1, 0x72, 0x1, 0x80, 0x97, 0x9, 0x50, 0x1, 0x17, 0x1, 0x6f, 0x2, 0x81, 0xd5, 0x1, 0x80, 0xa0, 0x1, 0x6c, 0x1, 0x15, 0x2, 0xa0, 0x54, 0x7b, 0x1, 0x2d, 0x2, 0xa0, 0x6f, 0xf3, 0xd];
++_T Mc = [0x89, 0x3, 0x1, 0x37, 0x1, 0x2, 0x3, 0x8, 0x4, 0x1, 0x2, 0x32, 0x2, 0x3a, 0x3, 0x6, 0x2, 0x2, 0x2, 0xa, 0x1, 0x2b, 0x1, 0x3a, 0x3, 0x42, 0x1, 0x3a, 0x3, 0x8, 0x1, 0x1, 0x2, 0x35, 0x2, 0x3a, 0x1, 0x1, 0x1, 0x6, 0x2, 0x2, 0x2, 0xa, 0x1, 0x66, 0x2, 0x1, 0x2, 0x3, 0x3, 0x1, 0x3, 0xa, 0x1, 0x29, 0x3, 0x3d, 0x4, 0x3d, 0x2, 0x3a, 0x1, 0x1, 0x5, 0x2, 0x2, 0x1, 0x2, 0x9, 0x2, 0x2b, 0x2, 0x3a, 0x3, 0x5, 0x3, 0x1, 0x3, 0xa, 0x1, 0x2a, 0x2, 0x4b, 0x3, 0x6, 0x8, 0x12, 0x2, 0x81, 0x4a, 0x2, 0x3f, 0x1, 0x80, 0xab, 0x2, 0x4, 0x1, 0x6, 0x1, 0x2, 0x2, 0x19, 0x2, 0xa, 0x3, 0x2, 0x7, 0x15, 0x2, 0x2, 0x6, 0x2, 0x1, 0xa, 0x3, 0x87, 0x19, 0x1, 0x7, 0x8, 0x1, 0x2, 0x81, 0x5a, 0x4, 0x2, 0x3, 0x4, 0x2, 0x1, 0x6, 0x77, 0x11, 0x7, 0x2, 0x4f, 0x2, 0x3a, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x2, 0x8, 0x6, 0x80, 0x91, 0x1, 0x30, 0x1, 0x5, 0x1, 0x1, 0x5, 0x1, 0x2, 0x3d, 0x1, 0x1e, 0x1, 0x4, 0x2, 0x2, 0x1, 0x1, 0x2, 0x39, 0x1, 0x2, 0x3, 0x1, 0x1, 0x3, 0x2, 0x30, 0x8, 0x8, 0x2, 0x80, 0xab, 0x1, 0x10, 0x2, 0x93, 0x3a, 0x2, 0xa0, 0x77, 0xf3, 0x2, 0x2, 0x1, 0x58, 0x2, 0x32, 0x10, 0x80, 0x8e, 0x2, 0x2f, 0x1, 0x30, 0x2, 0x4, 0x2, 0x1, 0x4, 0x6e, 0x2, 0x2, 0x2, 0x18, 0x1, 0x2d, 0x1, 0x6f, 0x1, 0x2, 0x2, 0x5, 0x1, 0x80, 0xed, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0xa0, 0x64, 0x13, 0x1, 0x1, 0x1, 0x7f, 0x1, 0x2d, 0x3, 0x4, 0x2, 0x73, 0x1, 0x55, 0x1, 0x30, 0x3, 0x9, 0x2, 0x84, 0xeb, 0x1, 0x1, 0x2, 0x6, 0x1, 0xa0, 0x58, 0x9a, 0x2e, 0xa0, 0x61, 0xe6, 0x2, 0x6, 0x6];
++_T Lo = [0x80, 0xaa, 0x1, 0xf, 0x1, 0x81, 0x0, 0x1, 0x4, 0x4, 0x80, 0xd0, 0x1, 0x83, 0x3b, 0x1b, 0x5, 0x3, 0x2d, 0x20, 0x1, 0xa, 0x23, 0x2, 0x1, 0x63, 0x1, 0x1, 0x18, 0x2, 0xa, 0x3, 0x2, 0x1, 0x10, 0x1, 0x1, 0x1e, 0x1d, 0x59, 0xb, 0x1, 0x18, 0x21, 0x15, 0x16, 0x2a, 0x19, 0x47, 0x1, 0x1, 0xb, 0x57, 0x36, 0x3, 0x1, 0x12, 0x1, 0x7, 0xa, 0x10, 0x6, 0x1, 0x7, 0x5, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x3, 0x1, 0x10, 0x1, 0xd, 0x2, 0x1, 0x3, 0xe, 0x2, 0x13, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1f, 0x4, 0x1, 0x1, 0x13, 0x3, 0x10, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x12, 0x1, 0xf, 0x2, 0x23, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x1e, 0x2, 0x1, 0x3, 0xf, 0x1, 0x11, 0x1, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x16, 0x1, 0x34, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x1a, 0x2, 0x6, 0x2, 0x23, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x20, 0x1, 0x1, 0x2, 0xf, 0x2, 0x12, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x1, 0x10, 0x1, 0x11, 0x2, 0x18, 0x6, 0x5, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3a, 0x30, 0x1, 0x2, 0xc, 0x6, 0x3b, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x4, 0x1, 0x2, 0x9, 0x1, 0x2, 0x5, 0x17, 0x4, 0x20, 0x1, 0x3f, 0x8, 0x1, 0x24, 0x1b, 0x5, 0x73, 0x2b, 0x14, 0x1, 0x10, 0x6, 0x4, 0x4, 0x3, 0x1, 0x3, 0x2, 0x7, 0x3, 0x4, 0xd, 0xc, 0x1, 0x41, 0x2b, 0x2, 0x81, 0x4c, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x25, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x15, 0xd, 0x1, 0x4, 0xe, 0x12, 0xe, 0x12, 0xe, 0xd, 0x1, 0x3, 0xf, 0x34, 0x28, 0x1, 0x43, 0x23, 0x1, 0x34, 0x8, 0x29, 0x1, 0x1, 0x5, 0x46, 0xa, 0x1d, 0x33, 0x1e, 0x2, 0x5, 0xb, 0x2c, 0x15, 0x7, 0x38, 0x17, 0x9, 0x35, 0x80, 0xb0, 0x2f, 0x11, 0x7, 0x37, 0x1e, 0xd, 0x2, 0xa, 0x2c, 0x1a, 0x24, 0x29, 0x3, 0xa, 0x1e, 0x71, 0x4, 0x1, 0x4, 0x3, 0x2, 0x84, 0x3e, 0x4, 0x8b, 0xf7, 0x38, 0x18, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x82, 0x27, 0x1, 0x35, 0x1, 0x4, 0x56, 0x8, 0x1, 0x1, 0x5a, 0x4, 0x1, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x15, 0x1, 0x84, 0x77, 0x43, 0x28, 0x8, 0x81, 0xc, 0x4, 0x10, 0xa, 0x2, 0x42, 0x1, 0x31, 0x46, 0x81, 0x15, 0x7, 0x1, 0x3, 0x1, 0x4, 0x1, 0x17, 0x1d, 0x34, 0xe, 0x32, 0x3e, 0x6, 0x3, 0x1, 0xe, 0x1c, 0xa, 0x17, 0x19, 0x1d, 0x7, 0x2f, 0x4d, 0x29, 0x17, 0x3, 0x1, 0x8, 0x14, 0x10, 0x1, 0x6, 0x3, 0x1, 0x5, 0x30, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x1, 0x18, 0x2, 0x3, 0xb, 0x7, 0x1, 0xe, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x23, 0x1d, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x43, 0x1, 0x1, 0xa, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x81, 0x6b, 0x12, 0x40, 0x2, 0x36, 0x28, 0xc, 0x74, 0x5, 0x1, 0x80, 0x87, 0x69, 0xa, 0x1, 0x2d, 0x2, 0x1f, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x81, 0x85, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x11, 0x1, 0x8, 0x36, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x80, 0x80, 0x4e, 0x83, 0x62, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x1, 0xf, 0x4, 0x1, 0x3, 0x1, 0x1b, 0x2c, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xba, 0x35, 0x4b, 0x2d, 0x20, 0x19, 0x1a, 0x24, 0x5c, 0x30, 0xe, 0x4, 0x84, 0xbb, 0x2b, 0x89, 0x55, 0x83, 0x6f, 0x8c, 0x91, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x1, 0xa0, 0x40, 0xaf, 0x2, 0xa0, 0x3d, 0xfe, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Me = [0x84, 0x88, 0x2, 0x9c, 0x53, 0x4, 0x1, 0x3, 0xa0, 0x85, 0x8b, 0x3];
++_T ID_Start = [0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x4, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xca, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x80, 0x81, 0x5, 0x1, 0x2, 0x2, 0x4, 0x8, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x8, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x1, 0x7, 0x27, 0x48, 0x1b, 0x5, 0x3, 0x2d, 0x2b, 0x23, 0x2, 0x1, 0x63, 0x1, 0x1, 0xf, 0x2, 0x7, 0x2, 0xa, 0x3, 0x2, 0x1, 0x10, 0x1, 0x1, 0x1e, 0x1d, 0x59, 0xb, 0x1, 0x18, 0x21, 0x9, 0x2, 0x4, 0x1, 0x5, 0x16, 0x4, 0x1, 0x9, 0x1, 0x3, 0x1, 0x17, 0x19, 0x47, 0x1, 0x1, 0xb, 0x57, 0x36, 0x3, 0x1, 0x12, 0x1, 0x7, 0xa, 0xf, 0x7, 0x1, 0x7, 0x5, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x3, 0x1, 0x10, 0x1, 0xd, 0x2, 0x1, 0x3, 0xe, 0x2, 0x13, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1f, 0x4, 0x1, 0x1, 0x13, 0x3, 0x10, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x12, 0x1, 0xf, 0x2, 0x23, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x3, 0x1, 0x1e, 0x2, 0x1, 0x3, 0xf, 0x1, 0x11, 0x1, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x16, 0x1, 0x34, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x1a, 0x2, 0x6, 0x2, 0x23, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x1, 0x20, 0x1, 0x1, 0x2, 0xf, 0x2, 0x12, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x1, 0x10, 0x1, 0x11, 0x2, 0x18, 0x6, 0x5, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3a, 0x30, 0x1, 0x2, 0xc, 0x7, 0x3a, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x4, 0x1, 0x2, 0x9, 0x1, 0x2, 0x5, 0x1, 0x1, 0x15, 0x4, 0x20, 0x1, 0x3f, 0x8, 0x1, 0x24, 0x1b, 0x5, 0x73, 0x2b, 0x14, 0x1, 0x10, 0x6, 0x4, 0x4, 0x3, 0x1, 0x3, 0x2, 0x7, 0x3, 0x4, 0xd, 0xc, 0x1, 0x11, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x81, 0x4d, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x25, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x3, 0x3, 0xf, 0xd, 0x1, 0x4, 0xe, 0x12, 0xe, 0x12, 0xe, 0xd, 0x1, 0x3, 0xf, 0x34, 0x23, 0x1, 0x4, 0x1, 0x43, 0x58, 0x8, 0x29, 0x1, 0x1, 0x5, 0x46, 0xa, 0x1d, 0x33, 0x1e, 0x2, 0x5, 0xb, 0x2c, 0x15, 0x7, 0x38, 0x17, 0x9, 0x35, 0x52, 0x1, 0x5d, 0x2f, 0x11, 0x7, 0x37, 0x1e, 0xd, 0x2, 0xa, 0x2c, 0x1a, 0x24, 0x29, 0x3, 0xa, 0x24, 0x6b, 0x4, 0x1, 0x4, 0x3, 0x2, 0x9, 0x80, 0xc0, 0x40, 0x81, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x74, 0x1, 0xd, 0x1, 0x10, 0xd, 0x65, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x10, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x29, 0x8a, 0x77, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x4, 0x3, 0x2, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x1, 0x10, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x82, 0x26, 0x3, 0x19, 0x9, 0x7, 0x5, 0x2, 0x5, 0x4, 0x56, 0x4, 0x5, 0x1, 0x5a, 0x1, 0x4, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x84, 0x8d, 0x43, 0x2e, 0x2, 0x81, 0xd, 0x3, 0x10, 0xa, 0x2, 0x14, 0x2f, 0x10, 0x19, 0x8, 0x50, 0x27, 0x9, 0x2, 0x67, 0x2, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0xa, 0x1, 0x3, 0x1, 0x4, 0x1, 0x17, 0x1d, 0x34, 0xe, 0x32, 0x3e, 0x6, 0x3, 0x1, 0xe, 0x1c, 0xa, 0x17, 0x19, 0x1d, 0x7, 0x2f, 0x1c, 0x1, 0x30, 0x29, 0x17, 0x3, 0x1, 0x8, 0x14, 0x17, 0x3, 0x1, 0x5, 0x30, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x1, 0x18, 0x3, 0x2, 0xb, 0x7, 0x3, 0xc, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x23, 0x1d, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0x1, 0x1, 0xa, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x81, 0x6b, 0x12, 0x40, 0x2, 0x36, 0x28, 0xc, 0x74, 0x5, 0x1, 0x80, 0x87, 0x24, 0x1a, 0x6, 0x1a, 0xb, 0x59, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x45, 0x35, 0x81, 0xb, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x1b, 0x35, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x1, 0x5, 0x2a, 0x80, 0x9e, 0x83, 0x62, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x1, 0xf, 0x4, 0x1, 0x3, 0x1, 0x1b, 0x2c, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xba, 0x35, 0x4b, 0x2d, 0x20, 0x19, 0x1a, 0x24, 0x5c, 0x30, 0xe, 0x4, 0x84, 0xbb, 0x2b, 0x89, 0x55, 0x83, 0x6f, 0x80, 0x91, 0x63, 0x8b, 0x9d, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x1, 0x42, 0xd, 0xa0, 0x40, 0x60, 0x2, 0xa0, 0x23, 0xfe, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x96, 0x34, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Other_Grapheme_Extend = [0x89, 0xbe, 0x1, 0x18, 0x1, 0x81, 0x66, 0x1, 0x18, 0x1, 0x66, 0x1, 0x18, 0x1, 0x80, 0xea, 0x1, 0x12, 0x2, 0x67, 0x1, 0x18, 0x1, 0x77, 0x1, 0xf, 0x1, 0x92, 0x2c, 0x2, 0x90, 0x20, 0x2, 0xa0, 0xcf, 0x6e, 0x2, 0xa0, 0xd1, 0xc5, 0x1, 0x8, 0x5];
++_T Lt = [0x81, 0xc5, 0x1, 0x2, 0x1, 0x2, 0x1, 0x26, 0x1, 0x9d, 0x95, 0x8, 0x8, 0x8, 0x8, 0x8, 0xc, 0x1, 0xf, 0x1, 0x2f, 0x1];
++_T Pattern_White_Space = [0x9, 0x5, 0x12, 0x1, 0x64, 0x1, 0x9f, 0x88, 0x2, 0x18, 0x2];
++_T Cased = [0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x4, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x80, 0xc3, 0x1, 0x4, 0x4, 0x80, 0xd0, 0x1, 0x24, 0x7, 0x2, 0x1e, 0x5, 0x60, 0x1, 0x2a, 0x4, 0x2, 0x2, 0x2, 0x4, 0x8, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x8, 0x80, 0x9e, 0x9, 0x26, 0xa, 0x27, 0x8b, 0x18, 0x26, 0x1, 0x1, 0x5, 0x1, 0x8c, 0x32, 0x80, 0xc0, 0x40, 0x81, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x74, 0x1, 0xd, 0x1, 0x10, 0xd, 0x65, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x3, 0x5, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x6, 0x4, 0x1, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x20, 0x3, 0x2, 0x83, 0x31, 0x34, 0x87, 0x16, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x4, 0x3, 0x2, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0xa0, 0x79, 0x12, 0x2e, 0x12, 0x18, 0x80, 0x8a, 0x66, 0x3, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0x3, 0xa0, 0x53, 0x5, 0x7, 0xc, 0x5, 0x84, 0x9, 0x1a, 0x6, 0x1a, 0x84, 0xa5, 0x50, 0xa0, 0xcf, 0xb0, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8];
++_T Mn = [0x83, 0x0, 0x70, 0x81, 0x13, 0x5, 0x81, 0x9, 0x2d, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x48, 0xb, 0x30, 0x15, 0x10, 0x1, 0x65, 0x7, 0x2, 0x6, 0x2, 0x2, 0x1, 0x4, 0x23, 0x1, 0x1e, 0x1b, 0x5b, 0xb, 0x3a, 0x9, 0x22, 0x4, 0x1, 0x9, 0x1, 0x3, 0x1, 0x5, 0x2b, 0x3, 0x80, 0x88, 0x1b, 0x1, 0x3, 0x37, 0x1, 0x1, 0x1, 0x4, 0x8, 0x4, 0x1, 0x3, 0x7, 0xa, 0x2, 0x1d, 0x1, 0x3a, 0x1, 0x4, 0x4, 0x8, 0x1, 0x14, 0x2, 0x1d, 0x2, 0x39, 0x1, 0x4, 0x2, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x1e, 0x2, 0x3, 0x1, 0xb, 0x2, 0x39, 0x1, 0x4, 0x5, 0x1, 0x2, 0x4, 0x1, 0x14, 0x2, 0x1d, 0x1, 0x3a, 0x1, 0x2, 0x1, 0x1, 0x4, 0x8, 0x1, 0x8, 0x1, 0xb, 0x2, 0x1e, 0x1, 0x3d, 0x1, 0xc, 0x1, 0x70, 0x3, 0x5, 0x3, 0x1, 0x4, 0x7, 0x2, 0xb, 0x2, 0x58, 0x1, 0x2, 0x1, 0x6, 0x1, 0x5, 0x2, 0x14, 0x2, 0x5d, 0x4, 0x8, 0x1, 0x14, 0x2, 0x66, 0x1, 0x7, 0x3, 0x1, 0x1, 0x5a, 0x1, 0x2, 0x7, 0xc, 0x8, 0x62, 0x1, 0x2, 0x6, 0x1, 0x2, 0xb, 0x6, 0x4a, 0x2, 0x1b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x37, 0xe, 0x1, 0x5, 0x1, 0x2, 0x5, 0xb, 0x1, 0x24, 0x9, 0x1, 0x66, 0x4, 0x1, 0x6, 0x1, 0x2, 0x2, 0x2, 0x19, 0x2, 0x4, 0x3, 0x10, 0x4, 0xd, 0x1, 0x2, 0x2, 0x6, 0x1, 0xf, 0x1, 0x82, 0xbf, 0x3, 0x83, 0xb2, 0x3, 0x1d, 0x3, 0x1d, 0x2, 0x1e, 0x2, 0x40, 0x2, 0x1, 0x7, 0x8, 0x1, 0x2, 0xb, 0x9, 0x1, 0x2d, 0x3, 0x80, 0x9b, 0x1, 0x76, 0x3, 0x4, 0x2, 0x9, 0x1, 0x6, 0x3, 0x80, 0xdb, 0x2, 0x2, 0x1, 0x3a, 0x1, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x2, 0x8, 0x6, 0xa, 0x2, 0x1, 0x80, 0x80, 0x4, 0x30, 0x1, 0x1, 0x5, 0x1, 0x1, 0x5, 0x1, 0x28, 0x9, 0xc, 0x2, 0x20, 0x4, 0x2, 0x2, 0x1, 0x1, 0x3a, 0x1, 0x1, 0x2, 0x3, 0x1, 0x1, 0x3, 0x3a, 0x8, 0x2, 0x2, 0x80, 0x98, 0x3, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x80, 0xcb, 0x27, 0x15, 0x4, 0x82, 0xd0, 0xd, 0x4, 0x1, 0x3, 0xc, 0x8b, 0xfe, 0x3, 0x80, 0x8d, 0x1, 0x60, 0x20, 0x82, 0x2a, 0x4, 0x6b, 0x2, 0xa0, 0x75, 0xd4, 0x1, 0x4, 0xa, 0x21, 0x1, 0x50, 0x2, 0x81, 0x10, 0x1, 0x3, 0x1, 0x4, 0x1, 0x19, 0x2, 0x80, 0x9d, 0x1, 0x1b, 0x12, 0x34, 0x8, 0x19, 0xb, 0x2e, 0x3, 0x30, 0x1, 0x2, 0x4, 0x2, 0x1, 0x6c, 0x6, 0x2, 0x2, 0x2, 0x2, 0xc, 0x1, 0x8, 0x1, 0x63, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x2a, 0x2, 0x8, 0x1, 0x80, 0xee, 0x1, 0x2, 0x1, 0x4, 0x1, 0xa0, 0x4f, 0x30, 0x1, 0x82, 0xe1, 0x10, 0x10, 0x7, 0x83, 0xd6, 0x1, 0x88, 0x3, 0x3, 0x1, 0x2, 0x5, 0x4, 0x28, 0x3, 0x4, 0x1, 0x85, 0xc1, 0x1, 0x36, 0xf, 0x39, 0x2, 0x31, 0x4, 0x2, 0x2, 0x45, 0x3, 0x24, 0x5, 0x1, 0x8, 0x4b, 0x2, 0x34, 0x9, 0x84, 0xec, 0x1, 0x1, 0x1, 0x2, 0x6, 0x1, 0x1, 0xa0, 0x58, 0xd7, 0x4, 0xa0, 0x61, 0xd4, 0x3, 0x11, 0x8, 0x2, 0x7, 0x1e, 0x4, 0x80, 0x94, 0x3, 0xac, 0x2e, 0xbb, 0x80, 0xf0];
++_T Dash = [0x2d, 0x1, 0x85, 0x5c, 0x1, 0x33, 0x1, 0x8e, 0x41, 0x1, 0x84, 0x5, 0x1, 0x88, 0x9, 0x6, 0x3d, 0x1, 0x27, 0x1, 0xf, 0x1, 0x81, 0x86, 0x1, 0x8c, 0x4, 0x1, 0x2, 0x1, 0x1f, 0x2, 0x81, 0xe0, 0x1, 0x13, 0x1, 0x6f, 0x1, 0xa0, 0xcd, 0x90, 0x2, 0x25, 0x1, 0xa, 0x1, 0x80, 0xa9, 0x1];
++_T ID_Continue = [0x30, 0xa, 0x7, 0x1a, 0x4, 0x1, 0x1, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x1, 0x1, 0x2, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xca, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x11, 0x75, 0x1, 0x2, 0x2, 0x4, 0x8, 0x5, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x1, 0x5, 0x2, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x1, 0x7, 0x27, 0x9, 0x2d, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x8, 0x1b, 0x5, 0x3, 0x1d, 0xb, 0x5, 0x4a, 0x4, 0x66, 0x1, 0x8, 0x2, 0xa, 0x1, 0x13, 0x2, 0x1, 0x10, 0x3b, 0x2, 0x65, 0xe, 0x36, 0x4, 0x1, 0x5, 0x2e, 0x12, 0x1c, 0x44, 0x1, 0x1, 0xb, 0x37, 0x1b, 0x1, 0x64, 0x2, 0xa, 0x1, 0x7, 0x1, 0x7, 0x1, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x2, 0x9, 0x2, 0x2, 0x2, 0x4, 0x8, 0x1, 0x4, 0x2, 0x1, 0x5, 0x2, 0xc, 0xf, 0x3, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x5, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x7, 0x4, 0x1, 0x1, 0x7, 0x10, 0xb, 0x3, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x3, 0x1, 0x3, 0x2, 0x1, 0xf, 0x4, 0x2, 0xa, 0x11, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0x9, 0x2, 0x2, 0x2, 0x3, 0x8, 0x2, 0x4, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x1, 0x10, 0x2, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x4, 0x5, 0x3, 0x3, 0x1, 0x4, 0x2, 0x1, 0x6, 0x1, 0xe, 0xa, 0x11, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x1, 0x2, 0x6, 0x4, 0x2, 0xa, 0x12, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x2, 0x9, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x7, 0x1, 0x1, 0x4, 0x2, 0xa, 0x1, 0x2, 0xf, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x8, 0x1, 0x3, 0x1, 0x5, 0x8, 0x1, 0x8, 0x4, 0x2, 0xa, 0xa, 0x6, 0x2, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x2, 0xd, 0x3a, 0x5, 0xf, 0x1, 0xa, 0x27, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0xd, 0x1, 0x3, 0x2, 0x5, 0x1, 0x1, 0x1, 0x6, 0x2, 0xa, 0x2, 0x4, 0x20, 0x1, 0x17, 0x2, 0x6, 0xa, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0xa, 0x1, 0x24, 0x4, 0x14, 0x1, 0x12, 0x1, 0x24, 0x9, 0x1, 0x39, 0x4a, 0x6, 0x4e, 0x2, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x81, 0x4d, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x2, 0x3, 0x9, 0x9, 0xe, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x3, 0x3, 0xf, 0xd, 0x1, 0x7, 0xb, 0x15, 0xb, 0x14, 0xc, 0xd, 0x1, 0x3, 0x1, 0x2, 0xc, 0x54, 0x3, 0x1, 0x4, 0x2, 0x2, 0xa, 0x21, 0x3, 0x2, 0xa, 0x6, 0x58, 0x8, 0x2b, 0x5, 0x46, 0xa, 0x1d, 0x3, 0xc, 0x4, 0xc, 0xa, 0x28, 0x2, 0x5, 0xb, 0x2c, 0x4, 0x1a, 0x6, 0xb, 0x25, 0x1c, 0x4, 0x3f, 0x1, 0x1d, 0x2, 0xb, 0x6, 0xa, 0xd, 0x1, 0x58, 0x4c, 0x4, 0xa, 0x11, 0x9, 0xc, 0x74, 0xc, 0x38, 0x8, 0xa, 0x3, 0x31, 0x52, 0x3, 0x1, 0x23, 0x9, 0x80, 0xe7, 0x15, 0x81, 0x1a, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x42, 0x2, 0x13, 0x1, 0x1c, 0x1, 0xd, 0x1, 0x10, 0xd, 0x33, 0xd, 0x4, 0x1, 0x3, 0xc, 0x11, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x10, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x29, 0x8a, 0x77, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x9, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x1, 0xf, 0x18, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x20, 0x82, 0x5, 0x3, 0x19, 0xf, 0x1, 0x5, 0x2, 0x5, 0x4, 0x56, 0x2, 0x7, 0x1, 0x5a, 0x1, 0x4, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x84, 0x8d, 0x43, 0x2e, 0x2, 0x81, 0xd, 0x3, 0x1c, 0x14, 0x30, 0x4, 0xa, 0x1, 0x19, 0x7, 0x53, 0x25, 0x9, 0x2, 0x67, 0x2, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0x30, 0x18, 0x34, 0xc, 0x45, 0xb, 0xa, 0x6, 0x18, 0x3, 0x1, 0x4, 0x2e, 0x2, 0x24, 0xc, 0x1d, 0x3, 0x41, 0xe, 0xb, 0x26, 0x37, 0x9, 0xe, 0x2, 0xa, 0x6, 0x17, 0x3, 0x2, 0x4, 0x43, 0x18, 0x3, 0x2, 0x10, 0x2, 0x5, 0xa, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x2b, 0x1, 0x2, 0x2, 0xa, 0x6, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0xc, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x81, 0x6b, 0x12, 0x40, 0x2, 0x36, 0x28, 0xc, 0x4, 0x10, 0x10, 0x7, 0xc, 0x2, 0x18, 0x3, 0x20, 0x5, 0x1, 0x80, 0x87, 0x13, 0xa, 0x7, 0x1a, 0x4, 0x1, 0x1, 0x1a, 0xb, 0x59, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x45, 0x35, 0x80, 0x88, 0x1, 0x80, 0x82, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x1b, 0x35, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x1, 0x5, 0x2a, 0x80, 0x9e, 0x2, 0xa, 0x83, 0x56, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x4, 0x1, 0x2, 0x5, 0x8, 0x1, 0x3, 0x1, 0x1b, 0x4, 0x3, 0x4, 0x1, 0x20, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xb7, 0x47, 0x1f, 0xa, 0x10, 0x3b, 0x15, 0x19, 0x7, 0xa, 0x6, 0x35, 0x1, 0xa, 0x40, 0x45, 0xb, 0xa, 0x84, 0xa6, 0x38, 0x8, 0xa, 0x89, 0x36, 0x83, 0x6f, 0x80, 0x91, 0x63, 0x8b, 0x9d, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x2f, 0x10, 0x11, 0xa0, 0x40, 0x60, 0x2, 0xa0, 0x21, 0x63, 0x5, 0x3, 0x6, 0x8, 0x8, 0x2, 0x7, 0x1e, 0x4, 0x80, 0x94, 0x3, 0x81, 0xbb, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e, 0xab, 0x6, 0xe2, 0x80, 0xf0];
++_T White_Space = [0x9, 0x5, 0x12, 0x1, 0x64, 0x1, 0x1a, 0x1, 0x95, 0xdf, 0x1, 0x89, 0x7f, 0xb, 0x1d, 0x2, 0x5, 0x1, 0x2f, 0x1, 0x8f, 0xa0, 0x1];
++_T Grapheme_Link = [0x89, 0x4d, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7f, 0x1, 0x7c, 0x1, 0x6f, 0x1, 0x81, 0x49, 0x1, 0x80, 0xb4, 0x2, 0x86, 0xd9, 0x1, 0x1f, 0x1, 0x80, 0x9d, 0x1, 0x82, 0x8d, 0x1, 0x80, 0xe3, 0x1, 0x65, 0x2, 0x46, 0x2, 0x91, 0x8b, 0x1, 0xa0, 0x7a, 0x86, 0x1, 0x80, 0xbd, 0x1, 0x80, 0x8e, 0x1, 0x6c, 0x1, 0x81, 0x35, 0x1, 0x80, 0xf6, 0x1, 0xa0, 0x5e, 0x51, 0x1, 0x86, 0x6, 0x1, 0x72, 0x1, 0x79, 0x2, 0x80, 0x8b, 0x1, 0x84, 0xf5, 0x1];
++_T Ll = [0x61, 0x1a, 0x3a, 0x1, 0x29, 0x18, 0x1, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x2, 0x4, 0x1, 0x2, 0x1, 0x3, 0x3, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x3, 0x6, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x45, 0x1, 0x1b, 0x80, 0xc1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x3, 0x3, 0x12, 0x1, 0x1b, 0x23, 0x1, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x1, 0x1, 0x2, 0x1, 0x2, 0x2, 0x33, 0x30, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x39, 0x27, 0x97, 0x78, 0x2c, 0x3f, 0xd, 0x1, 0x22, 0x66, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0xe, 0x2, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x5, 0x1, 0x2, 0x6, 0x1, 0x3, 0x3, 0x1, 0x2, 0x8, 0x4, 0x2, 0x2, 0x8, 0x8, 0xa, 0x3, 0x1, 0x2, 0x81, 0x12, 0x1, 0x3, 0x2, 0x3, 0x1, 0x1b, 0x1, 0x4, 0x1, 0x4, 0x1, 0x2, 0x2, 0x8, 0x4, 0x4, 0x1, 0x35, 0x1, 0x8a, 0xab, 0x2f, 0x2, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x6, 0x5, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x1, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0xa0, 0x79, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0x8b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0xd, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x50, 0x1, 0xa0, 0x53, 0x5, 0x7, 0xc, 0x5, 0x84, 0x29, 0x1a, 0x84, 0xcd, 0x28, 0xa0, 0xcf, 0xca, 0x1a, 0x1a, 0x7, 0x1, 0x12, 0x1a, 0x1a, 0x1a, 0x4, 0x1, 0x1, 0x1, 0x7, 0x1, 0xb, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1c, 0x1c, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1, 0x1];
++_T Cc = [0x0, 0x20, 0x5f, 0x21];
++_T Pattern_Syntax = [0x21, 0xf, 0xa, 0x7, 0x1a, 0x4, 0x1, 0x1, 0x1a, 0x4, 0x22, 0x7, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x4, 0x1, 0x4, 0x1, 0x3, 0x1, 0x17, 0x1, 0x1f, 0x1, 0x9f, 0x18, 0x18, 0x8, 0xf, 0x2, 0x13, 0x1, 0xa, 0x81, 0x31, 0x82, 0xd0, 0x80, 0xa0, 0x82, 0x76, 0x1e, 0x84, 0x6c, 0x82, 0x0, 0x80, 0x80, 0x81, 0x81, 0x3, 0x4, 0x19, 0xf, 0x1, 0xa0, 0xcd, 0xd, 0x2, 0x81, 0x5, 0x2];
++_T XID_Continue = [0x30, 0xa, 0x7, 0x1a, 0x4, 0x1, 0x1, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x1, 0x1, 0x2, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xca, 0x4, 0xc, 0xe, 0x5, 0x7, 0x1, 0x1, 0x1, 0x11, 0x75, 0x1, 0x2, 0x3, 0x3, 0x8, 0x5, 0x1, 0x1, 0x1, 0x14, 0x1, 0x53, 0x1, 0x80, 0x8b, 0x1, 0x5, 0x2, 0x80, 0x9e, 0x9, 0x26, 0x2, 0x1, 0x7, 0x27, 0x9, 0x2d, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x8, 0x1b, 0x5, 0x3, 0x1d, 0xb, 0x5, 0x4a, 0x4, 0x66, 0x1, 0x8, 0x2, 0xa, 0x1, 0x13, 0x2, 0x1, 0x10, 0x3b, 0x2, 0x65, 0xe, 0x36, 0x4, 0x1, 0x5, 0x2e, 0x12, 0x1c, 0x44, 0x1, 0x1, 0xb, 0x37, 0x1b, 0x1, 0x64, 0x2, 0xa, 0x1, 0x7, 0x1, 0x7, 0x1, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x2, 0x9, 0x2, 0x2, 0x2, 0x4, 0x8, 0x1, 0x4, 0x2, 0x1, 0x5, 0x2, 0xc, 0xf, 0x3, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x5, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x7, 0x4, 0x1, 0x1, 0x7, 0x10, 0xb, 0x3, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x3, 0x1, 0x3, 0x2, 0x1, 0xf, 0x4, 0x2, 0xa, 0x11, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0x9, 0x2, 0x2, 0x2, 0x3, 0x8, 0x2, 0x4, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x1, 0x10, 0x2, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x4, 0x5, 0x3, 0x3, 0x1, 0x4, 0x2, 0x1, 0x6, 0x1, 0xe, 0xa, 0x11, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x1, 0x2, 0x6, 0x4, 0x2, 0xa, 0x12, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x2, 0x9, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x7, 0x1, 0x1, 0x4, 0x2, 0xa, 0x1, 0x2, 0xf, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x8, 0x1, 0x3, 0x1, 0x5, 0x8, 0x1, 0x8, 0x4, 0x2, 0xa, 0xa, 0x6, 0x2, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x2, 0xd, 0x3a, 0x5, 0xf, 0x1, 0xa, 0x27, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0xd, 0x1, 0x3, 0x2, 0x5, 0x1, 0x1, 0x1, 0x6, 0x2, 0xa, 0x2, 0x4, 0x20, 0x1, 0x17, 0x2, 0x6, 0xa, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0xa, 0x1, 0x24, 0x4, 0x14, 0x1, 0x12, 0x1, 0x24, 0x9, 0x1, 0x39, 0x4a, 0x6, 0x4e, 0x2, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x81, 0x4d, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x2, 0x3, 0x9, 0x9, 0xe, 0x10, 0x10, 0x55, 0xc, 0x82, 0x6c, 0x2, 0x11, 0x1, 0x1a, 0x5, 0x4b, 0x3, 0x3, 0xf, 0xd, 0x1, 0x7, 0xb, 0x15, 0xb, 0x14, 0xc, 0xd, 0x1, 0x3, 0x1, 0x2, 0xc, 0x54, 0x3, 0x1, 0x4, 0x2, 0x2, 0xa, 0x21, 0x3, 0x2, 0xa, 0x6, 0x58, 0x8, 0x2b, 0x5, 0x46, 0xa, 0x1d, 0x3, 0xc, 0x4, 0xc, 0xa, 0x28, 0x2, 0x5, 0xb, 0x2c, 0x4, 0x1a, 0x6, 0xb, 0x25, 0x1c, 0x4, 0x3f, 0x1, 0x1d, 0x2, 0xb, 0x6, 0xa, 0xd, 0x1, 0x58, 0x4c, 0x4, 0xa, 0x11, 0x9, 0xc, 0x74, 0xc, 0x38, 0x8, 0xa, 0x3, 0x31, 0x52, 0x3, 0x1, 0x23, 0x9, 0x80, 0xe7, 0x15, 0x81, 0x1a, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0x7, 0x1, 0x1, 0x3, 0x3, 0x1, 0x7, 0x3, 0x4, 0x2, 0x6, 0x4, 0xd, 0x5, 0x3, 0x1, 0x7, 0x42, 0x2, 0x13, 0x1, 0x1c, 0x1, 0xd, 0x1, 0x10, 0xd, 0x33, 0xd, 0x4, 0x1, 0x3, 0xc, 0x11, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x2, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x10, 0x2, 0x4, 0x5, 0x5, 0x4, 0x1, 0x11, 0x29, 0x8a, 0x77, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x85, 0x6, 0x9, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x1, 0xf, 0x18, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x20, 0x82, 0x5, 0x3, 0x19, 0xf, 0x1, 0x5, 0x2, 0x5, 0x4, 0x56, 0x2, 0x2, 0x2, 0x3, 0x1, 0x5a, 0x1, 0x4, 0x5, 0x29, 0x3, 0x5e, 0x11, 0x1b, 0x35, 0x10, 0x82, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0x33, 0x84, 0x8d, 0x43, 0x2e, 0x2, 0x81, 0xd, 0x3, 0x1c, 0x14, 0x30, 0x4, 0xa, 0x1, 0x19, 0x7, 0x53, 0x25, 0x9, 0x2, 0x67, 0x2, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0x30, 0x18, 0x34, 0xc, 0x45, 0xb, 0xa, 0x6, 0x18, 0x3, 0x1, 0x4, 0x2e, 0x2, 0x24, 0xc, 0x1d, 0x3, 0x41, 0xe, 0xb, 0x26, 0x37, 0x9, 0xe, 0x2, 0xa, 0x6, 0x17, 0x3, 0x2, 0x4, 0x43, 0x18, 0x3, 0x2, 0x10, 0x2, 0x5, 0xa, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x2b, 0x1, 0x2, 0x2, 0xa, 0x6, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x21, 0x4, 0x81, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0xc, 0x1, 0xd, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x6c, 0x21, 0x80, 0x8b, 0x6, 0x80, 0xda, 0x12, 0x40, 0x2, 0x36, 0x28, 0xa, 0x6, 0x10, 0x10, 0x7, 0xc, 0x2, 0x18, 0x3, 0x21, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7e, 0x13, 0xa, 0x7, 0x1a, 0x4, 0x1, 0x1, 0x1a, 0xb, 0x59, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x23, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x45, 0x35, 0x80, 0x88, 0x1, 0x80, 0x82, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x11, 0x1b, 0x35, 0x1e, 0x2, 0x24, 0x4, 0x8, 0x1, 0x5, 0x2a, 0x80, 0x9e, 0x2, 0xa, 0x83, 0x56, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x80, 0xaa, 0x16, 0xa, 0x1a, 0x46, 0x38, 0x6, 0x2, 0x40, 0x4, 0x1, 0x2, 0x5, 0x8, 0x1, 0x3, 0x1, 0x1b, 0x4, 0x3, 0x4, 0x1, 0x20, 0x1d, 0x80, 0x83, 0x36, 0xa, 0x16, 0xa, 0x13, 0x80, 0x8d, 0x49, 0x83, 0xb7, 0x47, 0x1f, 0xa, 0x10, 0x3b, 0x15, 0x19, 0x7, 0xa, 0x6, 0x35, 0x1, 0xa, 0x40, 0x45, 0xb, 0xa, 0x84, 0xa6, 0x38, 0x8, 0xa, 0x89, 0x36, 0x83, 0x6f, 0x80, 0x91, 0x63, 0x8b, 0x9d, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x2f, 0x10, 0x11, 0xa0, 0x40, 0x60, 0x2, 0xa0, 0x21, 0x63, 0x5, 0x3, 0x6, 0x8, 0x8, 0x2, 0x7, 0x1e, 0x4, 0x80, 0x94, 0x3, 0x81, 0xbb, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x91, 0x44, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e, 0xab, 0x6, 0xe2, 0x80, 0xf0];
++_T Lowercase = [0x61, 0x1a, 0x2f, 0x1, 0xa, 0x1, 0x4, 0x1, 0x24, 0x18, 0x1, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x2, 0x4, 0x1, 0x2, 0x1, 0x3, 0x3, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x3, 0x6, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x45, 0x1, 0x24, 0x7, 0x2, 0x1e, 0x5, 0x60, 0x1, 0x2b, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x4, 0x12, 0x1, 0x1b, 0x23, 0x1, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x1, 0x1, 0x2, 0x1, 0x2, 0x2, 0x33, 0x30, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x39, 0x27, 0x97, 0x78, 0x80, 0xc0, 0x41, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0xe, 0x2, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x5, 0x1, 0x2, 0x6, 0x1, 0x3, 0x3, 0x1, 0x2, 0x8, 0x4, 0x2, 0x2, 0x8, 0x8, 0xa, 0x3, 0x1, 0x2, 0x79, 0x1, 0xd, 0x1, 0x10, 0xd, 0x6d, 0x1, 0x3, 0x2, 0x3, 0x1, 0x1b, 0x1, 0x4, 0x1, 0x4, 0x1, 0x2, 0x2, 0x8, 0x4, 0x4, 0x1, 0x21, 0x10, 0x4, 0x1, 0x83, 0x4b, 0x1a, 0x87, 0x46, 0x2f, 0x2, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x8, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x1, 0xc, 0x26, 0x1, 0x1, 0x5, 0x1, 0xa0, 0x79, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0x8b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0xd, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4e, 0x3, 0xa0, 0x53, 0x5, 0x7, 0xc, 0x5, 0x84, 0x29, 0x1a, 0x84, 0xcd, 0x28, 0xa0, 0xcf, 0xca, 0x1a, 0x1a, 0x7, 0x1, 0x12, 0x1a, 0x1a, 0x1a, 0x4, 0x1, 0x1, 0x1, 0x7, 0x1, 0xb, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1c, 0x1c, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1a, 0x19, 0x1, 0x6, 0x1, 0x1];
++_T Zl = [0xa0, 0x20, 0x28, 0x1];
++_T Zp = [0xa0, 0x20, 0x29, 0x1];
++_T Radical = [0xa0, 0x2e, 0x80, 0x1a, 0x1, 0x59, 0xc, 0x80, 0xd6];
++_T Extender = [0x80, 0xb7, 0x1, 0x82, 0x18, 0x2, 0x83, 0x6e, 0x1, 0x81, 0xb9, 0x1, 0x86, 0x4b, 0x1, 0x7f, 0x1, 0x89, 0x43, 0x1, 0x38, 0x1, 0x82, 0x63, 0x1, 0x81, 0x8e, 0x1, 0x44, 0x1, 0x93, 0x89, 0x1, 0x2b, 0x5, 0x67, 0x2, 0x5d, 0x3, 0xa0, 0x6f, 0x16, 0x1, 0x85, 0xf6, 0x1, 0x83, 0xc2, 0x1, 0x80, 0xa0, 0x1, 0x6c, 0x1, 0x15, 0x2, 0xa0, 0x54, 0x7b, 0x1];
++_T Co = [0xa0, 0xe0, 0x0, 0x99, 0x0, 0xae, 0x7, 0x0, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe];
++_T Unified_Ideograph = [0xa0, 0x34, 0x0, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0xa0, 0x5a, 0x41, 0x2, 0x1, 0x1, 0x1, 0x2, 0xa, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x3, 0xa1, 0x5, 0xd6, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde];
++_T Pc = [0x5f, 0x1, 0x9f, 0xdf, 0x2, 0x13, 0x1, 0xa0, 0xdd, 0xde, 0x2, 0x18, 0x3, 0x80, 0xef, 0x1];
++_T Cs = [0xa0, 0xd8, 0x0, 0x88, 0x0];
++_T Noncharacter_Code_Point = [0xa0, 0xfd, 0xd0, 0x20, 0x82, 0xe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe];
++_T Uppercase = [0x41, 0x1a, 0x65, 0x17, 0x1, 0x7, 0x21, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x2, 0x4, 0x1, 0x2, 0x1, 0x3, 0x3, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x3, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x7, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0x21, 0x1, 0x1, 0x1, 0x3, 0x1, 0xf, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x2, 0x1, 0x11, 0x1, 0x9, 0x23, 0x1, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x1, 0x2, 0x1, 0x1, 0x2, 0x2, 0x33, 0x30, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa, 0x26, 0x8b, 0x49, 0x26, 0x1, 0x1, 0x5, 0x1, 0x8d, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x8, 0x8, 0x6, 0xa, 0x8, 0x8, 0x8, 0x8, 0x6, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x8, 0x48, 0x4, 0xc, 0x4, 0xc, 0x4, 0xc, 0x5, 0xb, 0x4, 0x81, 0x6, 0x1, 0x4, 0x1, 0x3, 0x3, 0x2, 0x3, 0x2, 0x1, 0x3, 0x5, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x2, 0x4, 0xa, 0x2, 0x5, 0x1, 0x1a, 0x10, 0x13, 0x1, 0x83, 0x32, 0x1a, 0x87, 0x30, 0x2f, 0x31, 0x1, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x8, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x1, 0x1, 0x1, 0x4, 0x1, 0xa0, 0x79, 0x4d, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x13, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0x8b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0xd, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xa0, 0x57, 0x76, 0x1a, 0x84, 0xc5, 0x28, 0xa0, 0xcf, 0xd8, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0x8, 0x1a, 0x1a, 0x1a, 0x2, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1b, 0x2, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1e, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x19, 0x21, 0x1];
++_T IDS_Trinary_Operator = [0xa0, 0x2f, 0xf2, 0x2];
++_T Logical_Order_Exception = [0x8e, 0x40, 0x5, 0x7b, 0x5, 0xa0, 0x9b, 0xf0, 0x2, 0x2, 0x1, 0x1, 0x2];
++_T Pi = [0x80, 0xab, 0x1, 0x9f, 0x6c, 0x1, 0x2, 0x2, 0x2, 0x1, 0x19, 0x1, 0x8d, 0xc8, 0x1, 0x1, 0x1, 0x4, 0x1, 0x2, 0x1, 0xf, 0x1, 0x3, 0x1];
++_T Soft_Dotted = [0x69, 0x2, 0x80, 0xc4, 0x1, 0x81, 0x19, 0x1, 0x1e, 0x1, 0x34, 0x1, 0x14, 0x1, 0x81, 0x40, 0x1, 0x62, 0x1, 0x1, 0x1, 0x99, 0x9, 0x1, 0x33, 0x1, 0xd, 0x1, 0x3, 0x1, 0x80, 0x84, 0x1, 0x80, 0x9d, 0x1, 0x81, 0xa5, 0x1, 0x80, 0xd6, 0x2, 0x8b, 0x32, 0x1, 0xa1, 0xa7, 0xa5, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2, 0x32, 0x2];
++_T Po = [0x21, 0x3, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0xa, 0x2, 0x3, 0x2, 0x1b, 0x1, 0x44, 0x1, 0x5, 0x1, 0xe, 0x2, 0x7, 0x1, 0x82, 0xbe, 0x1, 0x8, 0x1, 0x81, 0xd2, 0x6, 0x29, 0x1, 0x36, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2c, 0x2, 0x14, 0x2, 0x1, 0x2, 0xd, 0x1, 0x2, 0x2, 0x4a, 0x4, 0x66, 0x1, 0x2b, 0xe, 0x80, 0xe9, 0x3, 0x36, 0xf, 0x1f, 0x1, 0x81, 0x5, 0x2, 0xa, 0x1, 0x81, 0x7f, 0x1, 0x83, 0x3, 0x1, 0x5a, 0x1, 0xa, 0x2, 0x80, 0xa8, 0xf, 0x1, 0x1, 0x70, 0x1, 0x4a, 0x5, 0x4, 0x2, 0x6f, 0x6, 0x80, 0xab, 0x1, 0x82, 0x64, 0x9, 0x83, 0x4, 0x2, 0x7c, 0x3, 0x47, 0x2, 0x80, 0x9d, 0x3, 0x1, 0x3, 0x25, 0x6, 0x1, 0x4, 0x81, 0x39, 0x2, 0x80, 0xd8, 0x2, 0x80, 0x80, 0x7, 0x1, 0x6, 0x80, 0xac, 0x7, 0x80, 0x9b, 0x4, 0x3b, 0x5, 0x3e, 0x2, 0x40, 0x8, 0xb, 0x1, 0x83, 0x42, 0x2, 0x8, 0x8, 0x8, 0x9, 0x2, 0x4, 0x2, 0x3, 0x3, 0xb, 0x1, 0x1, 0x1, 0xa, 0x8c, 0x9a, 0x4, 0x1, 0x2, 0x70, 0x1, 0x80, 0x8f, 0x2, 0x4, 0x3, 0x2, 0x1, 0x2, 0x9, 0x1, 0x2, 0x1, 0x1, 0x2, 0x2, 0xa, 0x5, 0x1, 0xa, 0x81, 0xc7, 0x3, 0x39, 0x1, 0x80, 0xbd, 0x1, 0xa0, 0x74, 0x2, 0x2, 0x81, 0xd, 0x3, 0x63, 0x1, 0xa, 0x1, 0x73, 0x6, 0x81, 0x7c, 0x4, 0x56, 0x2, 0x28, 0x3, 0x33, 0x2, 0x2f, 0x1, 0x61, 0xd, 0x10, 0x2, 0x7c, 0x4, 0x7e, 0x2, 0x10, 0x2, 0x80, 0xf9, 0x1, 0xa0, 0x52, 0x24, 0x7, 0x2, 0x1, 0x16, 0x1, 0x14, 0x2, 0x2, 0x4, 0x3, 0x3, 0x1, 0x4, 0x7, 0x3, 0x6, 0x1, 0x1, 0x2, 0x80, 0x95, 0x3, 0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0xa, 0x2, 0x3, 0x2, 0x1b, 0x1, 0x24, 0x1, 0x2, 0x2, 0x81, 0x9a, 0x3, 0x82, 0x9c, 0x1, 0x30, 0x1, 0x84, 0x86, 0x1, 0x80, 0xc7, 0x1, 0x1f, 0x1, 0x81, 0x10, 0x9, 0x26, 0x1, 0x80, 0xb9, 0x7, 0x85, 0x7, 0x7, 0x6d, 0x2, 0x1, 0x4, 0x7e, 0x4, 0x80, 0x81, 0x4, 0x92, 0xa7, 0x4];
++_T Cn = [0x83, 0x78, 0x2, 0x5, 0x5, 0x7, 0x1, 0x1, 0x1, 0x14, 0x1, 0x81, 0x85, 0x9, 0x26, 0x2, 0x7, 0x1, 0x27, 0x1, 0x2, 0x4, 0x1, 0x1, 0x37, 0x8, 0x1b, 0x5, 0x5, 0xb, 0x5, 0x1, 0x17, 0x1, 0x80, 0xf0, 0x1, 0x3c, 0x2, 0x65, 0xe, 0x3b, 0x5, 0x2e, 0x2, 0xf, 0x1, 0x1c, 0x2, 0x1, 0x41, 0x1, 0x1, 0xb, 0x37, 0x1b, 0x1, 0x78, 0x1, 0x7, 0x1, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x2, 0x9, 0x2, 0x2, 0x2, 0x4, 0x8, 0x1, 0x4, 0x2, 0x1, 0x5, 0x2, 0x16, 0x5, 0x3, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x5, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x7, 0x4, 0x1, 0x1, 0x7, 0x10, 0xb, 0x3, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x3, 0x1, 0x3, 0x2, 0x1, 0xf, 0x4, 0x2, 0xc, 0xf, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0x9, 0x2, 0x2, 0x2, 0x3, 0x8, 0x2, 0x4, 0x2, 0x1, 0x5, 0x2, 0x12, 0xa, 0x2, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x4, 0x5, 0x3, 0x3, 0x1, 0x4, 0x2, 0x1, 0x6, 0x1, 0xe, 0x15, 0x6, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x1, 0x2, 0x6, 0x4, 0x2, 0xa, 0x8, 0x8, 0x2, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x2, 0x9, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x7, 0x1, 0x1, 0x4, 0x2, 0xa, 0x1, 0x2, 0xf, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x8, 0x1, 0x3, 0x1, 0x5, 0x8, 0x1, 0x8, 0x4, 0x2, 0x10, 0x3, 0x7, 0x2, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x3, 0xc, 0x3a, 0x4, 0x1d, 0x25, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0xd, 0x1, 0x3, 0x2, 0x5, 0x1, 0x1, 0x1, 0x6, 0x2, 0xa, 0x2, 0x4, 0x20, 0x48, 0x1, 0x24, 0x4, 0x27, 0x1, 0x24, 0x1, 0xf, 0x1, 0xd, 0x25, 0x80, 0xc6, 0x1, 0x1, 0x5, 0x1, 0x2, 0x81, 0x79, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x2, 0x20, 0x3, 0x1a, 0x6, 0x55, 0xb, 0x82, 0x9d, 0x3, 0x51, 0xf, 0xd, 0x1, 0x7, 0xb, 0x17, 0x9, 0x14, 0xc, 0xd, 0x1, 0x3, 0x1, 0x2, 0xc, 0x5e, 0x2, 0xa, 0x6, 0xa, 0x6, 0xf, 0x1, 0xa, 0x6, 0x58, 0x8, 0x2b, 0x5, 0x46, 0xa, 0x1d, 0x3, 0xc, 0x4, 0xc, 0x4, 0x1, 0x3, 0x2a, 0x2, 0x5, 0xb, 0x2c, 0x4, 0x1a, 0x6, 0xb, 0x3, 0x3e, 0x2, 0x41, 0x1, 0x1d, 0x2, 0xb, 0x6, 0xa, 0x6, 0xe, 0x52, 0x4c, 0x4, 0x2d, 0x3, 0x74, 0x8, 0x3c, 0x3, 0xf, 0x3, 0x33, 0x40, 0x8, 0x8, 0x27, 0x9, 0x80, 0xe7, 0x15, 0x81, 0x1a, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0xf, 0x1, 0xe, 0x2, 0x6, 0x1, 0x13, 0x2, 0x3, 0x1, 0x9, 0x1, 0x65, 0x1, 0xc, 0x2, 0x1b, 0x1, 0xd, 0x3, 0x1b, 0x15, 0x21, 0xf, 0x80, 0x8a, 0x6, 0x82, 0x64, 0xc, 0x27, 0x19, 0xb, 0x15, 0x82, 0xa0, 0x1, 0x84, 0x4c, 0x3, 0xa, 0x80, 0xa6, 0x2f, 0x1, 0x2f, 0x1, 0x80, 0x94, 0x5, 0x2d, 0x1, 0x1, 0x5, 0x1, 0x2, 0x38, 0x7, 0x2, 0xe, 0x18, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x5c, 0x44, 0x1a, 0x1, 0x59, 0xc, 0x80, 0xd6, 0x1a, 0xc, 0x4, 0x40, 0x1, 0x56, 0x2, 0x67, 0x5, 0x29, 0x3, 0x5e, 0x1, 0x2b, 0x5, 0x24, 0xc, 0x2f, 0x1, 0x80, 0xdf, 0x1, 0x9a, 0xb6, 0xa, 0xa0, 0x52, 0xd, 0x33, 0x84, 0x8d, 0x3, 0x37, 0x9, 0x81, 0x5c, 0x14, 0x58, 0x7, 0x59, 0x8, 0x80, 0x8f, 0x1, 0x4, 0xc, 0xb, 0x4d, 0x34, 0x4, 0xa, 0x6, 0x38, 0x8, 0x45, 0x9, 0xc, 0x6, 0x1c, 0x4, 0x54, 0xb, 0x1e, 0x3, 0x4e, 0x1, 0xb, 0x4, 0x2, 0x20, 0x37, 0x9, 0xe, 0x2, 0xa, 0x2, 0x20, 0x4, 0x43, 0x18, 0x1c, 0xa, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7, 0x80, 0x91, 0x2e, 0x2, 0xa, 0x6, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0x4, 0xa0, 0x22, 0x6e, 0x2, 0x6a, 0x26, 0x7, 0xc, 0x5, 0x5, 0x1a, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x7c, 0x11, 0x81, 0x6d, 0x10, 0x40, 0x2, 0x36, 0x28, 0xe, 0x2, 0x1a, 0x6, 0x7, 0x9, 0x23, 0x1, 0x13, 0x1, 0x4, 0x4, 0x5, 0x1, 0x80, 0x87, 0x2, 0x1, 0x1, 0x80, 0xbe, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3, 0x3, 0x7, 0x1, 0x7, 0xa, 0x5, 0x2, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b, 0x5, 0x3, 0x4, 0x2d, 0x3, 0x54, 0x5, 0xc, 0x34, 0x2e, 0x80, 0x82, 0x1d, 0x3, 0x31, 0x2f, 0x1f, 0x1, 0x4, 0xc, 0x1b, 0x35, 0x1e, 0x1, 0x25, 0x4, 0xe, 0x2a, 0x80, 0x9e, 0x2, 0xa, 0x83, 0x56, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x17, 0x1, 0x9, 0x80, 0xa0, 0x1c, 0x3, 0x1b, 0x5, 0x1, 0x40, 0x38, 0x6, 0x2, 0x40, 0x4, 0x1, 0x2, 0x5, 0x8, 0x1, 0x3, 0x1, 0x1b, 0x4, 0x3, 0x4, 0x9, 0x8, 0x9, 0x7, 0x20, 0x80, 0x80, 0x36, 0x3, 0x1d, 0x2, 0x1b, 0x5, 0x8, 0x80, 0x80, 0x49, 0x82, 0x17, 0x1f, 0x81, 0x81, 0x4e, 0x4, 0x1e, 0x10, 0x42, 0xe, 0x19, 0x7, 0xa, 0x6, 0x35, 0x1, 0xe, 0x3c, 0x49, 0x7, 0xa, 0x84, 0xa6, 0x38, 0x8, 0xa, 0x89, 0x36, 0x83, 0x6f, 0x80, 0x91, 0x63, 0xd, 0x4, 0x8b, 0x8c, 0x84, 0x2f, 0xa0, 0x33, 0xd1, 0x82, 0x39, 0x84, 0xc7, 0x45, 0xb, 0x2f, 0x10, 0x11, 0xa0, 0x40, 0x60, 0x2, 0x9f, 0xfe, 0x80, 0xf6, 0xa, 0x27, 0x2, 0x80, 0xb5, 0x22, 0x46, 0x80, 0xba, 0x57, 0x9, 0x12, 0x80, 0x8e, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x81, 0x24, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x34, 0x2, 0x81, 0xe, 0x2c, 0x4, 0x64, 0xc, 0xf, 0x2, 0xe, 0x2, 0xf, 0x1, 0xf, 0x20, 0xb, 0x5, 0x1f, 0x1, 0x3c, 0x4, 0x2b, 0x4b, 0x1d, 0xd, 0x2b, 0x5, 0x9, 0x7, 0x2, 0x80, 0xae, 0x21, 0xf, 0x6, 0x1, 0x46, 0x3, 0x14, 0xc, 0x25, 0x1, 0x5, 0x15, 0x11, 0xf, 0x3f, 0x1, 0x1, 0x1, 0x80, 0xb6, 0x1, 0x4, 0x3, 0x3e, 0x2, 0x4, 0xc, 0x18, 0x80, 0x93, 0x46, 0x4, 0xb, 0x30, 0x46, 0x3a, 0x74, 0x88, 0x8c, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e, 0xab, 0x5, 0xe3, 0x1, 0x1e, 0x60, 0x80, 0x80, 0x80, 0xf0, 0xa0, 0xfe, 0x10, 0xa0, 0xff, 0xfe, 0x2, 0xa0, 0xff, 0xfe];
++_T Ps = [0x28, 0x1, 0x32, 0x1, 0x1f, 0x1, 0x8e, 0xbe, 0x1, 0x1, 0x1, 0x87, 0x5e, 0x1, 0x89, 0x7e, 0x1, 0x3, 0x1, 0x26, 0x1, 0x37, 0x1, 0xf, 0x1, 0x82, 0x7a, 0x1, 0x1, 0x1, 0x1e, 0x1, 0x84, 0x3e, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x50, 0x1, 0x20, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0x94, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x40, 0x1, 0x1, 0x1, 0x21, 0x1, 0x84, 0x25, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0xdf, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0xa0, 0xcd, 0x20, 0x1, 0x80, 0xd8, 0x1, 0x1d, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x11, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0xaa, 0x1, 0x32, 0x1, 0x1f, 0x1, 0x3, 0x1, 0x2, 0x1];
++_T ASCII_Hex_Digit = [0x30, 0xa, 0x7, 0x6, 0x1a, 0x6];
++_T No = [0x80, 0xb2, 0x2, 0x5, 0x1, 0x2, 0x3, 0x89, 0x35, 0x6, 0x81, 0x78, 0x6, 0x78, 0x3, 0x80, 0x85, 0x7, 0x80, 0xf1, 0x6, 0x81, 0xb4, 0xa, 0x84, 0x35, 0x14, 0x84, 0x73, 0xa, 0x81, 0xe0, 0x1, 0x86, 0x95, 0x1, 0x3, 0x6, 0x6, 0xa, 0x80, 0xc6, 0x10, 0x29, 0x1, 0x82, 0xd6, 0x3c, 0x4e, 0x16, 0x82, 0x76, 0x1e, 0x85, 0x69, 0x1, 0x84, 0x94, 0x4, 0x80, 0x8a, 0xa, 0x1e, 0x8, 0x1, 0xf, 0x20, 0xa, 0x27, 0xf, 0xa0, 0x75, 0x70, 0x6, 0xa0, 0x58, 0xd1, 0x2d, 0x41, 0x4, 0x11, 0x1, 0x81, 0x95, 0x4, 0x85, 0x34, 0x8, 0x80, 0xb6, 0x6, 0x81, 0x24, 0x8, 0x35, 0x2, 0x80, 0xd9, 0x8, 0x18, 0x8, 0x82, 0xe0, 0x1f, 0x81, 0xd3, 0x14, 0xa0, 0xc2, 0xfa, 0x12, 0x9d, 0x8e, 0xb];
++_T Sm = [0x2b, 0x1, 0x10, 0x3, 0x3d, 0x1, 0x1, 0x1, 0x2d, 0x1, 0x4, 0x1, 0x25, 0x1, 0x1f, 0x1, 0x82, 0xfe, 0x1, 0x82, 0xf, 0x3, 0x9a, 0x3b, 0x1, 0xd, 0x1, 0x27, 0x3, 0xd, 0x3, 0x80, 0x8b, 0x1, 0x27, 0x5, 0x6, 0x1, 0x44, 0x5, 0x5, 0x2, 0x4, 0x1, 0x2, 0x1, 0x2, 0x1, 0x7, 0x1, 0x1f, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1f, 0x81, 0xc, 0x20, 0x2, 0x5a, 0x1, 0x1e, 0x19, 0x28, 0x6, 0x81, 0xd5, 0x1, 0x9, 0x1, 0x36, 0x8, 0x6f, 0x1, 0x81, 0x50, 0x5, 0x2, 0x1f, 0xa, 0x10, 0x81, 0x0, 0x80, 0x83, 0x16, 0x3f, 0x4, 0x20, 0x2, 0x81, 0x2, 0x30, 0x15, 0x2, 0x6, 0xa0, 0xcf, 0xdc, 0x1, 0x83, 0x38, 0x1, 0x1, 0x3, 0x80, 0xa4, 0x1, 0x10, 0x3, 0x3d, 0x1, 0x1, 0x1, 0x80, 0x83, 0x1, 0x6, 0x4, 0xa0, 0xd6, 0xd4, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x97, 0x2c, 0x2];
++_T Other_Math = [0x5e, 0x1, 0x83, 0x71, 0x3, 0x2, 0x1, 0x1a, 0x2, 0x2, 0x2, 0x9c, 0x20, 0x1, 0x1b, 0x3, 0xb, 0x1, 0x20, 0x4, 0x18, 0x2, 0xe, 0x2, 0x41, 0xd, 0x4, 0x1, 0x3, 0x2, 0x4, 0x5, 0x12, 0x1, 0x4, 0x1, 0x2, 0xa, 0x1, 0x1, 0x3, 0x5, 0x6, 0x1, 0x3, 0x2, 0x2, 0x2, 0x1, 0x3, 0x1, 0x6, 0x3, 0x4, 0x5, 0x5, 0x4b, 0x5, 0x2, 0x4, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x5, 0x2, 0x2, 0x4, 0x2, 0x4, 0x12, 0x2, 0x2, 0x1, 0x1, 0x1, 0x7, 0x1, 0x1, 0x6, 0x2, 0x81, 0x22, 0x4, 0x80, 0xa8, 0x2, 0x1, 0x1, 0x18, 0x1, 0x11, 0x1, 0x81, 0xbd, 0x2, 0xc, 0x9, 0x5, 0x5, 0x5, 0x2, 0x2, 0x2, 0x3, 0x5, 0xe, 0x1, 0x1, 0x1, 0x2, 0x6, 0x18, 0x2, 0x39, 0x1, 0x1, 0x1, 0x1d, 0x4, 0x9, 0x2, 0x81, 0x56, 0x2, 0x1f, 0xa, 0x81, 0x93, 0x16, 0x3f, 0x4, 0x20, 0x2, 0xa0, 0xd4, 0x63, 0x1, 0x1, 0x1, 0x4, 0x1, 0x80, 0xd3, 0x1, 0x1, 0x1, 0xa0, 0xd4, 0xc1, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x19, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x1f, 0x1, 0x19, 0x1, 0x8, 0x2, 0x32, 0x96, 0x0, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11];
++_T Join_Control = [0xa0, 0x20, 0xc, 0x2];
++_T Cf = [0x80, 0xad, 0x1, 0x85, 0x52, 0x5, 0x17, 0x1, 0x80, 0xc0, 0x1, 0x31, 0x1, 0x90, 0xfe, 0x1, 0x87, 0xfc, 0x5, 0x1a, 0x5, 0x31, 0x5, 0x1, 0xa, 0xa0, 0xde, 0x8f, 0x1, 0x80, 0xf9, 0x3, 0x90, 0xc1, 0x1, 0xa0, 0xc0, 0xb5, 0x8, 0xac, 0x2e, 0x86, 0x1, 0x1e, 0x60];
++_T Ideographic = [0xa0, 0x30, 0x6, 0x2, 0x19, 0x9, 0xe, 0x3, 0x83, 0xc5, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0xa0, 0x59, 0x33, 0x81, 0x6e, 0x2, 0x6a, 0xa1, 0x5, 0x26, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Sc = [0x24, 0x1, 0x7d, 0x4, 0x84, 0xe9, 0x1, 0x7b, 0x1, 0x83, 0xe6, 0x2, 0x7, 0x1, 0x80, 0xf5, 0x1, 0x81, 0x7, 0x1, 0x82, 0x45, 0x1, 0x89, 0x9b, 0x1, 0x88, 0xc4, 0x1b, 0xa0, 0x87, 0x7d, 0x1, 0xa0, 0x55, 0xc3, 0x1, 0x6c, 0x1, 0x80, 0x9a, 0x1, 0x80, 0xdb, 0x2, 0x3, 0x2];
++_T Nd = [0x30, 0xa, 0x86, 0x26, 0xa, 0x80, 0x86, 0xa, 0x80, 0xc6, 0xa, 0x81, 0x9c, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x76, 0xa, 0x80, 0xe0, 0xa, 0x76, 0xa, 0x46, 0xa, 0x81, 0x16, 0xa, 0x46, 0xa, 0x87, 0x46, 0xa, 0x26, 0xa, 0x81, 0x2c, 0xa, 0x80, 0x80, 0xa, 0x80, 0xa6, 0xa, 0x6, 0xa, 0x80, 0xb6, 0xa, 0x56, 0xa, 0x80, 0x86, 0xa, 0x6, 0xa, 0xa0, 0x89, 0xc6, 0xa, 0x82, 0xa6, 0xa, 0x26, 0xa, 0x80, 0xc6, 0xa, 0x76, 0xa, 0x81, 0x96, 0xa, 0xa0, 0x53, 0x16, 0xa, 0x85, 0x86, 0xa, 0x8b, 0xbc, 0xa, 0x80, 0x80, 0xa, 0x3c, 0xa, 0x80, 0x90, 0xa, 0x84, 0xe6, 0xa, 0xa0, 0xc1, 0x4, 0x32];
++_T Default_Ignorable_Code_Point = [0x80, 0xad, 0x1, 0x82, 0xa1, 0x1, 0x82, 0xcc, 0x1, 0x8b, 0x42, 0x2, 0x86, 0x53, 0x2, 0x55, 0x4, 0x87, 0xfc, 0x5, 0x1a, 0x5, 0x31, 0x10, 0x90, 0xf4, 0x1, 0xa0, 0xcc, 0x9b, 0x10, 0x80, 0xef, 0x1, 0x80, 0xa0, 0x1, 0x4f, 0x9, 0xa0, 0xd1, 0x7a, 0x8, 0xac, 0x2e, 0x85, 0x90, 0x0];
++_T Other_ID_Continue = [0x80, 0xb7, 0x1, 0x82, 0xcf, 0x1, 0x8f, 0xe1, 0x9, 0x86, 0x68, 0x1];
++_T Pd = [0x2d, 0x1, 0x85, 0x5c, 0x1, 0x33, 0x1, 0x8e, 0x41, 0x1, 0x84, 0x5, 0x1, 0x88, 0x9, 0x6, 0x8e, 0x1, 0x1, 0x2, 0x1, 0x1f, 0x2, 0x81, 0xe0, 0x1, 0x13, 0x1, 0x6f, 0x1, 0xa0, 0xcd, 0x90, 0x2, 0x25, 0x1, 0xa, 0x1, 0x80, 0xa9, 0x1];
++_T Deprecated = [0x81, 0x49, 0x1, 0x85, 0x29, 0x1, 0x89, 0x3, 0x1, 0x1, 0x1, 0x88, 0x29, 0x2, 0x88, 0xc5, 0x6, 0x82, 0xb9, 0x2, 0xad, 0xdc, 0xd6, 0x1, 0x1e, 0x60];
++_T Grapheme_Extend = [0x83, 0x0, 0x70, 0x81, 0x13, 0x7, 0x81, 0x7, 0x2d, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x48, 0xb, 0x30, 0x15, 0x10, 0x1, 0x65, 0x7, 0x2, 0x6, 0x2, 0x2, 0x1, 0x4, 0x23, 0x1, 0x1e, 0x1b, 0x5b, 0xb, 0x3a, 0x9, 0x22, 0x4, 0x1, 0x9, 0x1, 0x3, 0x1, 0x5, 0x2b, 0x3, 0x80, 0x88, 0x1b, 0x1, 0x3, 0x37, 0x1, 0x1, 0x1, 0x4, 0x8, 0x4, 0x1, 0x3, 0x7, 0xa, 0x2, 0x1d, 0x1, 0x3a, 0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x1, 0x9, 0x1, 0xa, 0x2, 0x1d, 0x2, 0x39, 0x1, 0x4, 0x2, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x1e, 0x2, 0x3, 0x1, 0xb, 0x2, 0x39, 0x1, 0x4, 0x5, 0x1, 0x2, 0x4, 0x1, 0x14, 0x2, 0x1d, 0x1, 0x3a, 0x1, 0x1, 0x2, 0x1, 0x4, 0x8, 0x1, 0x8, 0x2, 0xa, 0x2, 0x1e, 0x1, 0x3b, 0x1, 0x1, 0x1, 0xc, 0x1, 0x9, 0x1, 0x66, 0x3, 0x5, 0x3, 0x1, 0x4, 0x7, 0x2, 0xb, 0x2, 0x58, 0x1, 0x2, 0x1, 0x2, 0x1, 0x3, 0x1, 0x5, 0x2, 0x7, 0x2, 0xb, 0x2, 0x5a, 0x1, 0x2, 0x4, 0x8, 0x1, 0x9, 0x1, 0xa, 0x2, 0x66, 0x1, 0x4, 0x1, 0x2, 0x3, 0x1, 0x1, 0x8, 0x1, 0x51, 0x1, 0x2, 0x7, 0xc, 0x8, 0x62, 0x1, 0x2, 0x6, 0x1, 0x2, 0xb, 0x6, 0x4a, 0x2, 0x1b, 0x1, 0x1, 0x1, 0x1, 0x1, 0x37, 0xe, 0x1, 0x5, 0x1, 0x2, 0x5, 0xb, 0x1, 0x24, 0x9, 0x1, 0x66, 0x4, 0x1, 0x6, 0x1, 0x2, 0x2, 0x2, 0x19, 0x2, 0x4, 0x3, 0x10, 0x4, 0xd, 0x1, 0x2, 0x2, 0x6, 0x1, 0xf, 0x1, 0x82, 0xbf, 0x3, 0x83, 0xb2, 0x3, 0x1d, 0x3, 0x1d, 0x2, 0x1e, 0x2, 0x40, 0x2, 0x1, 0x7, 0x8, 0x1, 0x2, 0xb, 0x9, 0x1, 0x2d, 0x3, 0x80, 0x9b, 0x1, 0x76, 0x3, 0x4, 0x2, 0x9, 0x1, 0x6, 0x3, 0x80, 0xdb, 0x2, 0x2, 0x1, 0x3a, 0x1, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x2, 0x8, 0x6, 0xa, 0x2, 0x1, 0x80, 0x80, 0x4, 0x30, 0x1, 0x1, 0x5, 0x1, 0x1, 0x5, 0x1, 0x28, 0x9, 0xc, 0x2, 0x20, 0x4, 0x2, 0x2, 0x1, 0x1, 0x3a, 0x1, 0x1, 0x2, 0x3, 0x1, 0x1, 0x3, 0x3a, 0x8, 0x2, 0x2, 0x80, 0x98, 0x3, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x80, 0xcb, 0x27, 0x15, 0x4, 0x82, 0xc, 0x2, 0x80, 0xc2, 0x21, 0x8b, 0xfe, 0x3, 0x80, 0x8d, 0x1, 0x60, 0x20, 0x82, 0x2a, 0x6, 0x69, 0x2, 0xa0, 0x75, 0xd4, 0x4, 0x1, 0xa, 0x21, 0x1, 0x50, 0x2, 0x81, 0x10, 0x1, 0x3, 0x1, 0x4, 0x1, 0x19, 0x2, 0x80, 0x9d, 0x1, 0x1b, 0x12, 0x34, 0x8, 0x19, 0xb, 0x2e, 0x3, 0x30, 0x1, 0x2, 0x4, 0x2, 0x1, 0x6c, 0x6, 0x2, 0x2, 0x2, 0x2, 0xc, 0x1, 0x8, 0x1, 0x63, 0x1, 0x1, 0x3, 0x2, 0x2, 0x5, 0x2, 0x1, 0x1, 0x2a, 0x2, 0x8, 0x1, 0x80, 0xee, 0x1, 0x2, 0x1, 0x4, 0x1, 0xa0, 0x4f, 0x30, 0x1, 0x82, 0xe1, 0x10, 0x10, 0x7, 0x81, 0x77, 0x2, 0x82, 0x5d, 0x1, 0x88, 0x3, 0x3, 0x1, 0x2, 0x5, 0x4, 0x28, 0x3, 0x4, 0x1, 0x85, 0xc1, 0x1, 0x36, 0xf, 0x39, 0x2, 0x31, 0x4, 0x2, 0x2, 0x45, 0x3, 0x24, 0x5, 0x1, 0x8, 0x4b, 0x2, 0x34, 0x9, 0x84, 0xec, 0x1, 0x1, 0x1, 0x2, 0x6, 0x1, 0x1, 0xa0, 0x58, 0xd7, 0x4, 0xa0, 0x61, 0xd2, 0x1, 0x1, 0x3, 0x4, 0x5, 0x8, 0x8, 0x2, 0x7, 0x1e, 0x4, 0x80, 0x94, 0x3, 0xac, 0x2e, 0xbb, 0x80, 0xf0];
++_T Hyphen = [0x2d, 0x1, 0x7f, 0x1, 0x84, 0xdc, 0x1, 0x92, 0x7b, 0x1, 0x88, 0x9, 0x2, 0x8e, 0x5, 0x1, 0x82, 0xe3, 0x1, 0xa0, 0xcd, 0x67, 0x1, 0x80, 0xa9, 0x1, 0x57, 0x1];
++_T Pe = [0x29, 0x1, 0x33, 0x1, 0x1f, 0x1, 0x8e, 0xbd, 0x1, 0x1, 0x1, 0x87, 0x5e, 0x1, 0x89, 0xa9, 0x1, 0x37, 0x1, 0xf, 0x1, 0x82, 0x7a, 0x1, 0x1, 0x1, 0x1e, 0x1, 0x84, 0x3e, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x50, 0x1, 0x20, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0x94, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x40, 0x1, 0x1, 0x1, 0x21, 0x1, 0x84, 0x25, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x81, 0xdf, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0xa0, 0xcd, 0x1f, 0x1, 0x80, 0xd8, 0x1, 0x1d, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x11, 0x1, 0x1, 0x1, 0x1, 0x1, 0x80, 0xaa, 0x1, 0x33, 0x1, 0x1f, 0x1, 0x2, 0x1, 0x2, 0x1];
++_U[] _tab = [
++_U("Alphabetic", Alphabetic),
++_U("ASCII_Hex_Digit", ASCII_Hex_Digit),
++_U("Bidi_Control", Bidi_Control),
++_U("Cased", Cased),
++_U("Case_Ignorable", Case_Ignorable),
++_U("Cc", Cc),
++_U("Cf", Cf),
++_U("Close_Punctuation", Pe),
++_U("Cn", Cn),
++_U("Co", Co),
++_U("Connector_Punctuation", Pc),
++_U("Control", Cc),
++_U("Cs", Cs),
++_U("Currency_Symbol", Sc),
++_U("Dash", Dash),
++_U("Dash_Punctuation", Pd),
++_U("Decimal_Number", Nd),
++_U("Default_Ignorable_Code_Point", Default_Ignorable_Code_Point),
++_U("Deprecated", Deprecated),
++_U("Diacritic", Diacritic),
++_U("Enclosing_Mark", Me),
++_U("Extender", Extender),
++_U("Final_Punctuation", Pf),
++_U("Format", Cf),
++_U("Grapheme_Base", Grapheme_Base),
++_U("Grapheme_Extend", Grapheme_Extend),
++_U("Grapheme_Link", Grapheme_Link),
++_U("Hex_Digit", Hex_Digit),
++_U("Hyphen", Hyphen),
++_U("ID_Continue", ID_Continue),
++_U("Ideographic", Ideographic),
++_U("IDS_Binary_Operator", IDS_Binary_Operator),
++_U("ID_Start", ID_Start),
++_U("IDS_Trinary_Operator", IDS_Trinary_Operator),
++_U("Initial_Punctuation", Pi),
++_U("Join_Control", Join_Control),
++_U("Letter_Number", Nl),
++_U("Line_Separator", Zl),
++_U("Ll", Ll),
++_U("Lm", Lm),
++_U("Lo", Lo),
++_U("Logical_Order_Exception", Logical_Order_Exception),
++_U("Lowercase", Lowercase),
++_U("Lowercase_Letter", Ll),
++_U("Lt", Lt),
++_U("Lu", Lu),
++_U("Math", Math),
++_U("Math_Symbol", Sm),
++_U("Mc", Mc),
++_U("Me", Me),
++_U("Mn", Mn),
++_U("Modifier_Letter", Lm),
++_U("Modifier_Symbol", Sk),
++_U("Nd", Nd),
++_U("Nl", Nl),
++_U("No", No),
++_U("Noncharacter_Code_Point", Noncharacter_Code_Point),
++_U("Nonspacing_Mark", Mn),
++_U("Open_Punctuation", Ps),
++_U("Other_Alphabetic", Other_Alphabetic),
++_U("Other_Default_Ignorable_Code_Point", Other_Default_Ignorable_Code_Point),
++_U("Other_Grapheme_Extend", Other_Grapheme_Extend),
++_U("Other_ID_Continue", Other_ID_Continue),
++_U("Other_ID_Start", Other_ID_Start),
++_U("Other_Letter", Lo),
++_U("Other_Lowercase", Other_Lowercase),
++_U("Other_Math", Other_Math),
++_U("Other_Number", No),
++_U("Other_Punctuation", Po),
++_U("Other_Symbol", So),
++_U("Other_Uppercase", Other_Uppercase),
++_U("Paragraph_Separator", Zp),
++_U("Pattern_Syntax", Pattern_Syntax),
++_U("Pattern_White_Space", Pattern_White_Space),
++_U("Pc", Pc),
++_U("Pd", Pd),
++_U("Pe", Pe),
++_U("Pf", Pf),
++_U("Pi", Pi),
++_U("Po", Po),
++_U("Private_Use", Co),
++_U("Ps", Ps),
++_U("Quotation_Mark", Quotation_Mark),
++_U("Radical", Radical),
++_U("Sc", Sc),
++_U("Sk", Sk),
++_U("Sm", Sm),
++_U("So", So),
++_U("Soft_Dotted", Soft_Dotted),
++_U("Space_Separator", Zs),
++_U("Spacing_Mark", Mc),
++_U("STerm", STerm),
++_U("Surrogate", Cs),
++_U("Terminal_Punctuation", Terminal_Punctuation),
++_U("Titlecase_Letter", Lt),
++_U("Unassigned", Cn),
++_U("Unified_Ideograph", Unified_Ideograph),
++_U("Uppercase", Uppercase),
++_U("Uppercase_Letter", Lu),
++_U("Variation_Selector", Variation_Selector),
++_U("White_Space", White_Space),
++_U("XID_Continue", XID_Continue),
++_U("XID_Start", XID_Start),
++_U("Zl", Zl),
++_U("Zp", Zp),
++_U("Zs", Zs),
++];
++}
++
++struct blocks
++{
++private alias _U = immutable(UnicodeProperty);
++@property static _U[] tab() { return _tab; }
++static immutable:
++private alias _T = ubyte[];
++_T Number_Forms = [0xa0, 0x21, 0x50, 0x40];
++_T Sinhala = [0x8d, 0x80, 0x80, 0x80];
++_T Domino_Tiles = [0xa1, 0xf0, 0x30, 0x70];
++_T Oriya = [0x8b, 0x0, 0x80, 0x80];
++_T Thaana = [0x87, 0x80, 0x40];
++_T New_Tai_Lue = [0x99, 0x80, 0x60];
++_T Byzantine_Musical_Symbols = [0xa1, 0xd0, 0x0, 0x81, 0x0];
++_T Cham = [0xa0, 0xaa, 0x0, 0x60];
++_T IPA_Extensions = [0x82, 0x50, 0x60];
++_T Bopomofo = [0xa0, 0x31, 0x0, 0x30];
++_T Katakana_Phonetic_Extensions = [0xa0, 0x31, 0xf0, 0x10];
++_T Khmer_Symbols = [0x99, 0xe0, 0x20];
++_T Hebrew = [0x85, 0x90, 0x70];
++_T Saurashtra = [0xa0, 0xa8, 0x80, 0x60];
++_T Inscriptional_Parthian = [0xa1, 0xb, 0x40, 0x20];
++_T Lisu = [0xa0, 0xa4, 0xd0, 0x30];
++_T Latin_1_Supplement = [0x80, 0x80, 0x80, 0x80];
++_T Arabic_Extended_A = [0x88, 0xa0, 0x60];
++_T Tai_Tham = [0x9a, 0x20, 0x80, 0x90];
++_T Latin_Extended_A = [0x81, 0x0, 0x80, 0x80];
++_T Latin_Extended_B = [0x81, 0x80, 0x80, 0xd0];
++_T Latin_Extended_C = [0xa0, 0x2c, 0x60, 0x20];
++_T Latin_Extended_D = [0xa0, 0xa7, 0x20, 0x80, 0xe0];
++_T CJK_Radicals_Supplement = [0xa0, 0x2e, 0x80, 0x80, 0x80];
++_T Meroitic_Hieroglyphs = [0xa1, 0x9, 0x80, 0x20];
++_T Linear_B_Syllabary = [0xa1, 0x0, 0x0, 0x80, 0x80];
++_T Phonetic_Extensions_Supplement = [0x9d, 0x80, 0x40];
++_T Meroitic_Cursive = [0xa1, 0x9, 0xa0, 0x60];
++_T Enclosed_Ideographic_Supplement = [0xa1, 0xf2, 0x0, 0x81, 0x0];
++_T Halfwidth_and_Fullwidth_Forms = [0xa0, 0xff, 0x0, 0x80, 0xf0];
++_T Takri = [0xa1, 0x16, 0x80, 0x50];
++_T Supplemental_Punctuation = [0xa0, 0x2e, 0x0, 0x80, 0x80];
++_T Malayalam = [0x8d, 0x0, 0x80, 0x80];
++_T Lepcha = [0x9c, 0x0, 0x50];
++_T Miscellaneous_Symbols_And_Pictographs = [0xa1, 0xf3, 0x0, 0x83, 0x0];
++_T Arabic_Presentation_Forms_A = [0xa0, 0xfb, 0x50, 0x82, 0xb0];
++_T Sora_Sompeng = [0xa1, 0x10, 0xd0, 0x30];
++_T Lydian = [0xa1, 0x9, 0x20, 0x20];
++_T Hangul_Jamo_Extended_B = [0xa0, 0xd7, 0xb0, 0x50];
++_T Private_Use_Area = [0xa0, 0xe0, 0x0, 0x99, 0x0];
++_T Coptic = [0xa0, 0x2c, 0x80, 0x80, 0x80];
++_T Phaistos_Disc = [0xa1, 0x1, 0xd0, 0x30];
++_T Batak = [0x9b, 0xc0, 0x40];
++_T Khmer = [0x97, 0x80, 0x80, 0x80];
++_T Counting_Rod_Numerals = [0xa1, 0xd3, 0x60, 0x20];
++_T Old_South_Arabian = [0xa1, 0xa, 0x60, 0x20];
++_T Kannada = [0x8c, 0x80, 0x80, 0x80];
++_T Arrows = [0xa0, 0x21, 0x90, 0x70];
++_T CJK_Compatibility_Ideographs_Supplement = [0xa2, 0xf8, 0x0, 0x82, 0x20];
++_T Combining_Half_Marks = [0xa0, 0xfe, 0x20, 0x10];
++_T Miscellaneous_Technical = [0xa0, 0x23, 0x0, 0x81, 0x0];
++_T Thai = [0x8e, 0x0, 0x80, 0x80];
++_T Alphabetic_Presentation_Forms = [0xa0, 0xfb, 0x0, 0x50];
++_T CJK_Unified_Ideographs = [0xa0, 0x4e, 0x0, 0xa0, 0x52, 0x0];
++_T Phonetic_Extensions = [0x9d, 0x0, 0x80, 0x80];
++_T Kayah_Li = [0xa0, 0xa9, 0x0, 0x30];
++_T Supplementary_Private_Use_Area_B = [0xb0, 0x0, 0x0];
++_T Gujarati = [0x8a, 0x80, 0x80, 0x80];
++_T Unified_Canadian_Aboriginal_Syllabics_Extended = [0x98, 0xb0, 0x50];
++_T Hangul_Syllables = [0xa0, 0xac, 0x0, 0xa0, 0x2b, 0xb0];
++_T Vertical_Forms = [0xa0, 0xfe, 0x10, 0x10];
++_T Inscriptional_Pahlavi = [0xa1, 0xb, 0x60, 0x20];
++_T Control_Pictures = [0xa0, 0x24, 0x0, 0x40];
++_T Carian = [0xa1, 0x2, 0xa0, 0x40];
++_T Mahjong_Tiles = [0xa1, 0xf0, 0x0, 0x30];
++_T Geometric_Shapes = [0xa0, 0x25, 0xa0, 0x60];
++_T Cherokee = [0x93, 0xa0, 0x60];
++_T Imperial_Aramaic = [0xa1, 0x8, 0x40, 0x20];
++_T Rumi_Numeral_Symbols = [0xa1, 0xe, 0x60, 0x20];
++_T Combining_Diacritical_Marks = [0x83, 0x0, 0x70];
++_T Specials = [0xa0, 0xff, 0xf0, 0x10];
++_T Greek_Extended = [0x9f, 0x0, 0x81, 0x0];
++_T Ethiopic_Supplement = [0x93, 0x80, 0x20];
++_T Limbu = [0x99, 0x0, 0x50];
++_T Basic_Latin = [0x0, 0x80, 0x80];
++_T Enclosed_Alphanumeric_Supplement = [0xa1, 0xf1, 0x0, 0x81, 0x0];
++_T Cyrillic_Supplement = [0x85, 0x0, 0x30];
++_T Hangul_Compatibility_Jamo = [0xa0, 0x31, 0x30, 0x60];
++_T Supplemental_Arrows_A = [0xa0, 0x27, 0xf0, 0x10];
++_T Supplemental_Arrows_B = [0xa0, 0x29, 0x0, 0x80, 0x80];
++_T Katakana = [0xa0, 0x30, 0xa0, 0x60];
++_T Ancient_Greek_Musical_Notation = [0xa1, 0xd2, 0x0, 0x50];
++_T CJK_Compatibility = [0xa0, 0x33, 0x0, 0x81, 0x0];
++_T Old_Persian = [0xa1, 0x3, 0xa0, 0x40];
++_T Small_Form_Variants = [0xa0, 0xfe, 0x50, 0x20];
++_T General_Punctuation = [0xa0, 0x20, 0x0, 0x70];
++_T Miscellaneous_Mathematical_Symbols_A = [0xa0, 0x27, 0xc0, 0x30];
++_T Latin_Extended_Additional = [0x9e, 0x0, 0x81, 0x0];
++_T Playing_Cards = [0xa1, 0xf0, 0xa0, 0x60];
++_T Syriac = [0x87, 0x0, 0x50];
++_T Alchemical_Symbols = [0xa1, 0xf7, 0x0, 0x80, 0x80];
++_T Tibetan = [0x8f, 0x0, 0x81, 0x0];
++_T CJK_Strokes = [0xa0, 0x31, 0xc0, 0x30];
++_T Tamil = [0x8b, 0x80, 0x80, 0x80];
++_T Balinese = [0x9b, 0x0, 0x80, 0x80];
++_T Shavian = [0xa1, 0x4, 0x50, 0x30];
++_T Greek_and_Coptic = [0x83, 0x70, 0x80, 0x90];
++_T Telugu = [0x8c, 0x0, 0x80, 0x80];
++_T Runic = [0x96, 0xa0, 0x60];
++_T Javanese = [0xa0, 0xa9, 0x80, 0x60];
++_T Bopomofo_Extended = [0xa0, 0x31, 0xa0, 0x20];
++_T Ideographic_Description_Characters = [0xa0, 0x2f, 0xf0, 0x10];
++_T Old_Turkic = [0xa1, 0xc, 0x0, 0x50];
++_T Unified_Canadian_Aboriginal_Syllabics = [0x94, 0x0, 0x82, 0x80];
++_T Ugaritic = [0xa1, 0x3, 0x80, 0x20];
++_T Egyptian_Hieroglyphs = [0xa1, 0x30, 0x0, 0x84, 0x30];
++_T Buginese = [0x9a, 0x0, 0x20];
++_T Kangxi_Radicals = [0xa0, 0x2f, 0x0, 0x80, 0xe0];
++_T Cuneiform = [0xa1, 0x20, 0x0, 0x84, 0x0];
++_T NKo = [0x87, 0xc0, 0x40];
++_T Sundanese_Supplement = [0x9c, 0xc0, 0x10];
++_T Buhid = [0x97, 0x40, 0x20];
++_T Modifier_Tone_Letters = [0xa0, 0xa7, 0x0, 0x20];
++_T Kanbun = [0xa0, 0x31, 0x90, 0x10];
++_T Superscripts_and_Subscripts = [0xa0, 0x20, 0x70, 0x30];
++_T Lao = [0x8e, 0x80, 0x80, 0x80];
++_T Ol_Chiki = [0x9c, 0x50, 0x30];
++_T Common_Indic_Number_Forms = [0xa0, 0xa8, 0x30, 0x10];
++_T Hangul_Jamo_Extended_A = [0xa0, 0xa9, 0x60, 0x20];
++_T Arabic_Presentation_Forms_B = [0xa0, 0xfe, 0x70, 0x80, 0x90];
++_T Sharada = [0xa1, 0x11, 0x80, 0x60];
++_T Miscellaneous_Symbols = [0xa0, 0x26, 0x0, 0x81, 0x0];
++_T Variation_Selectors_Supplement = [0xae, 0x1, 0x0, 0x80, 0xf0];
++_T Rejang = [0xa0, 0xa9, 0x30, 0x30];
++_T Georgian_Supplement = [0xa0, 0x2d, 0x0, 0x30];
++_T Braille_Patterns = [0xa0, 0x28, 0x0, 0x81, 0x0];
++_T Lycian = [0xa1, 0x2, 0x80, 0x20];
++_T Tai_Le = [0x99, 0x50, 0x30];
++_T Miscellaneous_Mathematical_Symbols_B = [0xa0, 0x29, 0x80, 0x80, 0x80];
++_T Musical_Symbols = [0xa1, 0xd1, 0x0, 0x81, 0x0];
++_T Avestan = [0xa1, 0xb, 0x0, 0x40];
++_T Ethiopic = [0x92, 0x0, 0x81, 0x80];
++_T Arabic_Supplement = [0x87, 0x50, 0x30];
++_T Samaritan = [0x88, 0x0, 0x40];
++_T Cuneiform_Numbers_and_Punctuation = [0xa1, 0x24, 0x0, 0x80, 0x80];
++_T Mongolian = [0x98, 0x0, 0x80, 0xb0];
++_T Arabic = [0x86, 0x0, 0x81, 0x0];
++_T Vai = [0xa0, 0xa5, 0x0, 0x81, 0x40];
++_T Tifinagh = [0xa0, 0x2d, 0x30, 0x50];
++_T Bamum_Supplement = [0xa1, 0x68, 0x0, 0x82, 0x40];
++_T Tai_Viet = [0xa0, 0xaa, 0x80, 0x60];
++_T Mandaic = [0x88, 0x40, 0x20];
++_T Sundanese = [0x9b, 0x80, 0x40];
++_T Block_Elements = [0xa0, 0x25, 0x80, 0x20];
++_T Phoenician = [0xa1, 0x9, 0x0, 0x20];
++_T Hanunoo = [0x97, 0x20, 0x20];
++_T Supplemental_Mathematical_Operators = [0xa0, 0x2a, 0x0, 0x81, 0x0];
++_T Deseret = [0xa1, 0x4, 0x0, 0x50];
++_T Brahmi = [0xa1, 0x10, 0x0, 0x80, 0x80];
++_T Devanagari_Extended = [0xa0, 0xa8, 0xe0, 0x20];
++_T Supplementary_Private_Use_Area_A = [0xaf, 0x0, 0x0, 0xa1, 0x0, 0x0];
++_T Box_Drawing = [0xa0, 0x25, 0x0, 0x80, 0x80];
++_T Mathematical_Operators = [0xa0, 0x22, 0x0, 0x81, 0x0];
++_T Ogham = [0x96, 0x80, 0x20];
++_T Meetei_Mayek_Extensions = [0xa0, 0xaa, 0xe0, 0x20];
++_T Hangul_Jamo = [0x91, 0x0, 0x81, 0x0];
++_T Miao = [0xa1, 0x6f, 0x0, 0x80, 0xa0];
++_T Emoticons = [0xa1, 0xf6, 0x0, 0x50];
++_T Tags = [0xae, 0x0, 0x0, 0x80, 0x80];
++_T Yi_Syllables = [0xa0, 0xa0, 0x0, 0x84, 0x90];
++_T Gurmukhi = [0x8a, 0x0, 0x80, 0x80];
++_T Syloti_Nagri = [0xa0, 0xa8, 0x0, 0x30];
++_T Spacing_Modifier_Letters = [0x82, 0xb0, 0x50];
++_T Yi_Radicals = [0xa0, 0xa4, 0x90, 0x40];
++_T Ancient_Greek_Numbers = [0xa1, 0x1, 0x40, 0x50];
++_T Glagolitic = [0xa0, 0x2c, 0x0, 0x60];
++_T Georgian = [0x90, 0xa0, 0x60];
++_T Osmanya = [0xa1, 0x4, 0x80, 0x30];
++_T Variation_Selectors = [0xa0, 0xfe, 0x0, 0x10];
++_T Mathematical_Alphanumeric_Symbols = [0xa1, 0xd4, 0x0, 0x84, 0x0];
++_T Yijing_Hexagram_Symbols = [0xa0, 0x4d, 0xc0, 0x40];
++_T Ethiopic_Extended = [0xa0, 0x2d, 0x80, 0x60];
++_T Transport_And_Map_Symbols = [0xa1, 0xf6, 0x80, 0x80, 0x80];
++_T High_Private_Use_Surrogates = [0xa0, 0xdb, 0x80, 0x80, 0x80];
++_T Meetei_Mayek = [0xa0, 0xab, 0xc0, 0x40];
++_T CJK_Compatibility_Forms = [0xa0, 0xfe, 0x30, 0x20];
++_T Enclosed_Alphanumerics = [0xa0, 0x24, 0x60, 0x80, 0xa0];
++_T Ancient_Symbols = [0xa1, 0x1, 0x90, 0x40];
++_T Ethiopic_Extended_A = [0xa0, 0xab, 0x0, 0x30];
++_T Bengali = [0x89, 0x80, 0x80, 0x80];
++_T Currency_Symbols = [0xa0, 0x20, 0xa0, 0x30];
++_T Myanmar = [0x90, 0x0, 0x80, 0xa0];
++_T Cyrillic_Extended_A = [0xa0, 0x2d, 0xe0, 0x20];
++_T Cyrillic_Extended_B = [0xa0, 0xa6, 0x40, 0x60];
++_T Myanmar_Extended_A = [0xa0, 0xaa, 0x60, 0x20];
++_T Hiragana = [0xa0, 0x30, 0x40, 0x60];
++_T Dingbats = [0xa0, 0x27, 0x0, 0x80, 0xc0];
++_T Armenian = [0x85, 0x30, 0x60];
++_T Tai_Xuan_Jing_Symbols = [0xa1, 0xd3, 0x0, 0x60];
++_T Linear_B_Ideograms = [0xa1, 0x0, 0x80, 0x80, 0x80];
++_T Kharoshthi = [0xa1, 0xa, 0x0, 0x60];
++_T Optical_Character_Recognition = [0xa0, 0x24, 0x40, 0x20];
++_T Enclosed_CJK_Letters_and_Months = [0xa0, 0x32, 0x0, 0x81, 0x0];
++_T Cypriot_Syllabary = [0xa1, 0x8, 0x0, 0x40];
++_T Vedic_Extensions = [0x9c, 0xd0, 0x30];
++_T Kaithi = [0xa1, 0x10, 0x80, 0x50];
++_T Low_Surrogates = [0xa0, 0xdc, 0x0, 0x84, 0x0];
++_T Letterlike_Symbols = [0xa0, 0x21, 0x0, 0x50];
++_T Combining_Diacritical_Marks_for_Symbols = [0xa0, 0x20, 0xd0, 0x30];
++_T Aegean_Numbers = [0xa1, 0x1, 0x0, 0x40];
++_T High_Surrogates = [0xa0, 0xd8, 0x0, 0x83, 0x80];
++_T CJK_Compatibility_Ideographs = [0xa0, 0xf9, 0x0, 0x82, 0x0];
++_T CJK_Symbols_and_Punctuation = [0xa0, 0x30, 0x0, 0x40];
++_T Gothic = [0xa1, 0x3, 0x30, 0x20];
++_T Combining_Diacritical_Marks_Supplement = [0x9d, 0xc0, 0x40];
++_T Phags_pa = [0xa0, 0xa8, 0x40, 0x40];
++_T Miscellaneous_Symbols_and_Arrows = [0xa0, 0x2b, 0x0, 0x81, 0x0];
++_T Bamum = [0xa0, 0xa6, 0xa0, 0x60];
++_T Chakma = [0xa1, 0x11, 0x0, 0x50];
++_T Kana_Supplement = [0xa1, 0xb0, 0x0, 0x81, 0x0];
++_T Tagalog = [0x97, 0x0, 0x20];
++_T Tagbanwa = [0x97, 0x60, 0x20];
++_T Devanagari = [0x89, 0x0, 0x80, 0x80];
++_T Old_Italic = [0xa1, 0x3, 0x0, 0x30];
++_T Arabic_Mathematical_Alphabetic_Symbols = [0xa1, 0xee, 0x0, 0x81, 0x0];
++_T CJK_Unified_Ideographs_Extension_D = [0xa2, 0xb7, 0x40, 0x80, 0xe0];
++_T CJK_Unified_Ideographs_Extension_A = [0xa0, 0x34, 0x0, 0x99, 0xc0];
++_T CJK_Unified_Ideographs_Extension_B = [0xa2, 0x0, 0x0, 0xa0, 0xa6, 0xe0];
++_T CJK_Unified_Ideographs_Extension_C = [0xa2, 0xa7, 0x0, 0x90, 0x40];
++_T Cyrillic = [0x84, 0x0, 0x81, 0x0];
++_U[] _tab = [
++_U("Aegean Numbers", Aegean_Numbers),
++_U("Alchemical Symbols", Alchemical_Symbols),
++_U("Alphabetic Presentation Forms", Alphabetic_Presentation_Forms),
++_U("Ancient Greek Musical Notation", Ancient_Greek_Musical_Notation),
++_U("Ancient Greek Numbers", Ancient_Greek_Numbers),
++_U("Ancient Symbols", Ancient_Symbols),
++_U("Arabic", Arabic),
++_U("Arabic Extended-A", Arabic_Extended_A),
++_U("Arabic Mathematical Alphabetic Symbols", Arabic_Mathematical_Alphabetic_Symbols),
++_U("Arabic Presentation Forms-A", Arabic_Presentation_Forms_A),
++_U("Arabic Presentation Forms-B", Arabic_Presentation_Forms_B),
++_U("Arabic Supplement", Arabic_Supplement),
++_U("Armenian", Armenian),
++_U("Arrows", Arrows),
++_U("Avestan", Avestan),
++_U("Balinese", Balinese),
++_U("Bamum", Bamum),
++_U("Bamum Supplement", Bamum_Supplement),
++_U("Basic Latin", Basic_Latin),
++_U("Batak", Batak),
++_U("Bengali", Bengali),
++_U("Block Elements", Block_Elements),
++_U("Bopomofo", Bopomofo),
++_U("Bopomofo Extended", Bopomofo_Extended),
++_U("Box Drawing", Box_Drawing),
++_U("Brahmi", Brahmi),
++_U("Braille Patterns", Braille_Patterns),
++_U("Buginese", Buginese),
++_U("Buhid", Buhid),
++_U("Byzantine Musical Symbols", Byzantine_Musical_Symbols),
++_U("Carian", Carian),
++_U("Chakma", Chakma),
++_U("Cham", Cham),
++_U("Cherokee", Cherokee),
++_U("CJK Compatibility", CJK_Compatibility),
++_U("CJK Compatibility Forms", CJK_Compatibility_Forms),
++_U("CJK Compatibility Ideographs", CJK_Compatibility_Ideographs),
++_U("CJK Compatibility Ideographs Supplement", CJK_Compatibility_Ideographs_Supplement),
++_U("CJK Radicals Supplement", CJK_Radicals_Supplement),
++_U("CJK Strokes", CJK_Strokes),
++_U("CJK Symbols and Punctuation", CJK_Symbols_and_Punctuation),
++_U("CJK Unified Ideographs", CJK_Unified_Ideographs),
++_U("CJK Unified Ideographs Extension A", CJK_Unified_Ideographs_Extension_A),
++_U("CJK Unified Ideographs Extension B", CJK_Unified_Ideographs_Extension_B),
++_U("CJK Unified Ideographs Extension C", CJK_Unified_Ideographs_Extension_C),
++_U("CJK Unified Ideographs Extension D", CJK_Unified_Ideographs_Extension_D),
++_U("Combining Diacritical Marks", Combining_Diacritical_Marks),
++_U("Combining Diacritical Marks for Symbols", Combining_Diacritical_Marks_for_Symbols),
++_U("Combining Diacritical Marks Supplement", Combining_Diacritical_Marks_Supplement),
++_U("Combining Half Marks", Combining_Half_Marks),
++_U("Common Indic Number Forms", Common_Indic_Number_Forms),
++_U("Control Pictures", Control_Pictures),
++_U("Coptic", Coptic),
++_U("Counting Rod Numerals", Counting_Rod_Numerals),
++_U("Cuneiform", Cuneiform),
++_U("Cuneiform Numbers and Punctuation", Cuneiform_Numbers_and_Punctuation),
++_U("Currency Symbols", Currency_Symbols),
++_U("Cypriot Syllabary", Cypriot_Syllabary),
++_U("Cyrillic", Cyrillic),
++_U("Cyrillic Extended-A", Cyrillic_Extended_A),
++_U("Cyrillic Extended-B", Cyrillic_Extended_B),
++_U("Cyrillic Supplement", Cyrillic_Supplement),
++_U("Deseret", Deseret),
++_U("Devanagari", Devanagari),
++_U("Devanagari Extended", Devanagari_Extended),
++_U("Dingbats", Dingbats),
++_U("Domino Tiles", Domino_Tiles),
++_U("Egyptian Hieroglyphs", Egyptian_Hieroglyphs),
++_U("Emoticons", Emoticons),
++_U("Enclosed Alphanumerics", Enclosed_Alphanumerics),
++_U("Enclosed Alphanumeric Supplement", Enclosed_Alphanumeric_Supplement),
++_U("Enclosed CJK Letters and Months", Enclosed_CJK_Letters_and_Months),
++_U("Enclosed Ideographic Supplement", Enclosed_Ideographic_Supplement),
++_U("Ethiopic", Ethiopic),
++_U("Ethiopic Extended", Ethiopic_Extended),
++_U("Ethiopic Extended-A", Ethiopic_Extended_A),
++_U("Ethiopic Supplement", Ethiopic_Supplement),
++_U("General Punctuation", General_Punctuation),
++_U("Geometric Shapes", Geometric_Shapes),
++_U("Georgian", Georgian),
++_U("Georgian Supplement", Georgian_Supplement),
++_U("Glagolitic", Glagolitic),
++_U("Gothic", Gothic),
++_U("Greek and Coptic", Greek_and_Coptic),
++_U("Greek Extended", Greek_Extended),
++_U("Gujarati", Gujarati),
++_U("Gurmukhi", Gurmukhi),
++_U("Halfwidth and Fullwidth Forms", Halfwidth_and_Fullwidth_Forms),
++_U("Hangul Compatibility Jamo", Hangul_Compatibility_Jamo),
++_U("Hangul Jamo", Hangul_Jamo),
++_U("Hangul Jamo Extended-A", Hangul_Jamo_Extended_A),
++_U("Hangul Jamo Extended-B", Hangul_Jamo_Extended_B),
++_U("Hangul Syllables", Hangul_Syllables),
++_U("Hanunoo", Hanunoo),
++_U("Hebrew", Hebrew),
++_U("High Private Use Surrogates", High_Private_Use_Surrogates),
++_U("High Surrogates", High_Surrogates),
++_U("Hiragana", Hiragana),
++_U("Ideographic Description Characters", Ideographic_Description_Characters),
++_U("Imperial Aramaic", Imperial_Aramaic),
++_U("Inscriptional Pahlavi", Inscriptional_Pahlavi),
++_U("Inscriptional Parthian", Inscriptional_Parthian),
++_U("IPA Extensions", IPA_Extensions),
++_U("Javanese", Javanese),
++_U("Kaithi", Kaithi),
++_U("Kana Supplement", Kana_Supplement),
++_U("Kanbun", Kanbun),
++_U("Kangxi Radicals", Kangxi_Radicals),
++_U("Kannada", Kannada),
++_U("Katakana", Katakana),
++_U("Katakana Phonetic Extensions", Katakana_Phonetic_Extensions),
++_U("Kayah Li", Kayah_Li),
++_U("Kharoshthi", Kharoshthi),
++_U("Khmer", Khmer),
++_U("Khmer Symbols", Khmer_Symbols),
++_U("Lao", Lao),
++_U("Latin-1 Supplement", Latin_1_Supplement),
++_U("Latin Extended-A", Latin_Extended_A),
++_U("Latin Extended Additional", Latin_Extended_Additional),
++_U("Latin Extended-B", Latin_Extended_B),
++_U("Latin Extended-C", Latin_Extended_C),
++_U("Latin Extended-D", Latin_Extended_D),
++_U("Lepcha", Lepcha),
++_U("Letterlike Symbols", Letterlike_Symbols),
++_U("Limbu", Limbu),
++_U("Linear B Ideograms", Linear_B_Ideograms),
++_U("Linear B Syllabary", Linear_B_Syllabary),
++_U("Lisu", Lisu),
++_U("Low Surrogates", Low_Surrogates),
++_U("Lycian", Lycian),
++_U("Lydian", Lydian),
++_U("Mahjong Tiles", Mahjong_Tiles),
++_U("Malayalam", Malayalam),
++_U("Mandaic", Mandaic),
++_U("Mathematical Alphanumeric Symbols", Mathematical_Alphanumeric_Symbols),
++_U("Mathematical Operators", Mathematical_Operators),
++_U("Meetei Mayek", Meetei_Mayek),
++_U("Meetei Mayek Extensions", Meetei_Mayek_Extensions),
++_U("Meroitic Cursive", Meroitic_Cursive),
++_U("Meroitic Hieroglyphs", Meroitic_Hieroglyphs),
++_U("Miao", Miao),
++_U("Miscellaneous Mathematical Symbols-A", Miscellaneous_Mathematical_Symbols_A),
++_U("Miscellaneous Mathematical Symbols-B", Miscellaneous_Mathematical_Symbols_B),
++_U("Miscellaneous Symbols", Miscellaneous_Symbols),
++_U("Miscellaneous Symbols and Arrows", Miscellaneous_Symbols_and_Arrows),
++_U("Miscellaneous Symbols And Pictographs", Miscellaneous_Symbols_And_Pictographs),
++_U("Miscellaneous Technical", Miscellaneous_Technical),
++_U("Modifier Tone Letters", Modifier_Tone_Letters),
++_U("Mongolian", Mongolian),
++_U("Musical Symbols", Musical_Symbols),
++_U("Myanmar", Myanmar),
++_U("Myanmar Extended-A", Myanmar_Extended_A),
++_U("New Tai Lue", New_Tai_Lue),
++_U("NKo", NKo),
++_U("Number Forms", Number_Forms),
++_U("Ogham", Ogham),
++_U("Ol Chiki", Ol_Chiki),
++_U("Old Italic", Old_Italic),
++_U("Old Persian", Old_Persian),
++_U("Old South Arabian", Old_South_Arabian),
++_U("Old Turkic", Old_Turkic),
++_U("Optical Character Recognition", Optical_Character_Recognition),
++_U("Oriya", Oriya),
++_U("Osmanya", Osmanya),
++_U("Phags-pa", Phags_pa),
++_U("Phaistos Disc", Phaistos_Disc),
++_U("Phoenician", Phoenician),
++_U("Phonetic Extensions", Phonetic_Extensions),
++_U("Phonetic Extensions Supplement", Phonetic_Extensions_Supplement),
++_U("Playing Cards", Playing_Cards),
++_U("Private Use Area", Private_Use_Area),
++_U("Rejang", Rejang),
++_U("Rumi Numeral Symbols", Rumi_Numeral_Symbols),
++_U("Runic", Runic),
++_U("Samaritan", Samaritan),
++_U("Saurashtra", Saurashtra),
++_U("Sharada", Sharada),
++_U("Shavian", Shavian),
++_U("Sinhala", Sinhala),
++_U("Small Form Variants", Small_Form_Variants),
++_U("Sora Sompeng", Sora_Sompeng),
++_U("Spacing Modifier Letters", Spacing_Modifier_Letters),
++_U("Specials", Specials),
++_U("Sundanese", Sundanese),
++_U("Sundanese Supplement", Sundanese_Supplement),
++_U("Superscripts and Subscripts", Superscripts_and_Subscripts),
++_U("Supplemental Arrows-A", Supplemental_Arrows_A),
++_U("Supplemental Arrows-B", Supplemental_Arrows_B),
++_U("Supplemental Mathematical Operators", Supplemental_Mathematical_Operators),
++_U("Supplemental Punctuation", Supplemental_Punctuation),
++_U("Supplementary Private Use Area-A", Supplementary_Private_Use_Area_A),
++_U("Supplementary Private Use Area-B", Supplementary_Private_Use_Area_B),
++_U("Syloti Nagri", Syloti_Nagri),
++_U("Syriac", Syriac),
++_U("Tagalog", Tagalog),
++_U("Tagbanwa", Tagbanwa),
++_U("Tags", Tags),
++_U("Tai Le", Tai_Le),
++_U("Tai Tham", Tai_Tham),
++_U("Tai Viet", Tai_Viet),
++_U("Tai Xuan Jing Symbols", Tai_Xuan_Jing_Symbols),
++_U("Takri", Takri),
++_U("Tamil", Tamil),
++_U("Telugu", Telugu),
++_U("Thaana", Thaana),
++_U("Thai", Thai),
++_U("Tibetan", Tibetan),
++_U("Tifinagh", Tifinagh),
++_U("Transport And Map Symbols", Transport_And_Map_Symbols),
++_U("Ugaritic", Ugaritic),
++_U("Unified Canadian Aboriginal Syllabics", Unified_Canadian_Aboriginal_Syllabics),
++_U("Unified Canadian Aboriginal Syllabics Extended", Unified_Canadian_Aboriginal_Syllabics_Extended),
++_U("Vai", Vai),
++_U("Variation Selectors", Variation_Selectors),
++_U("Variation Selectors Supplement", Variation_Selectors_Supplement),
++_U("Vedic Extensions", Vedic_Extensions),
++_U("Vertical Forms", Vertical_Forms),
++_U("Yijing Hexagram Symbols", Yijing_Hexagram_Symbols),
++_U("Yi Radicals", Yi_Radicals),
++_U("Yi Syllables", Yi_Syllables),
++];
++}
++
++struct scripts
++{
++private alias _U = immutable(UnicodeProperty);
++@property static _U[] tab() { return _tab; }
++static immutable:
++private alias _T = ubyte[];
++_T Buhid = [0x97, 0x40, 0x14];
++_T Sinhala = [0x8d, 0x82, 0x2, 0x1, 0x12, 0x3, 0x18, 0x1, 0x9, 0x1, 0x1, 0x2, 0x7, 0x3, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x8, 0x12, 0x3];
++_T Phags_Pa = [0xa0, 0xa8, 0x40, 0x38];
++_T Old_Turkic = [0xa1, 0xc, 0x0, 0x49];
++_T Oriya = [0x8b, 0x1, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0x9, 0x2, 0x2, 0x2, 0x3, 0x8, 0x2, 0x4, 0x2, 0x1, 0x5, 0x2, 0x12];
++_T Thaana = [0x87, 0x80, 0x32];
++_T Inherited = [0x83, 0x0, 0x70, 0x81, 0x15, 0x2, 0x81, 0xc4, 0xb, 0x1a, 0x1, 0x82, 0xe0, 0x2, 0x93, 0x7d, 0x3, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x80, 0xcb, 0x27, 0x15, 0x4, 0x82, 0xc, 0x2, 0x80, 0xc2, 0x21, 0x8f, 0x39, 0x4, 0x6b, 0x2, 0xa0, 0xcd, 0x65, 0x10, 0x10, 0x7, 0x83, 0xd6, 0x1, 0xa0, 0xcf, 0x69, 0x3, 0x11, 0x8, 0x2, 0x7, 0x1e, 0x4, 0xac, 0x2f, 0x52, 0x80, 0xf0];
++_T Sharada = [0xa1, 0x11, 0x80, 0x49, 0x7, 0xa];
++_T Rejang = [0xa0, 0xa9, 0x30, 0x24, 0xb, 0x1];
++_T Imperial_Aramaic = [0xa1, 0x8, 0x40, 0x16, 0x1, 0x9];
++_T Cham = [0xa0, 0xaa, 0x0, 0x37, 0x9, 0xe, 0x2, 0xa, 0x2, 0x4];
++_T Kaithi = [0xa1, 0x10, 0x80, 0x42];
++_T Bopomofo = [0x82, 0xea, 0x2, 0xa0, 0x2e, 0x19, 0x29, 0x72, 0x1b];
++_T Deseret = [0xa1, 0x4, 0x0, 0x50];
++_T Syloti_Nagri = [0xa0, 0xa8, 0x0, 0x2c];
++_T Lycian = [0xa1, 0x2, 0x80, 0x1d];
++_T Linear_B = [0xa1, 0x0, 0x0, 0xc, 0x1, 0x1a, 0x1, 0x13, 0x1, 0x2, 0x1, 0xf, 0x2, 0xe, 0x22, 0x7b];
++_T Hebrew = [0x85, 0x91, 0x37, 0x8, 0x1b, 0x5, 0x5, 0xa0, 0xf5, 0x28, 0x1a, 0x1, 0x5, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0xa];
++_T Saurashtra = [0xa0, 0xa8, 0x80, 0x45, 0x9, 0xc];
++_T Avestan = [0xa1, 0xb, 0x0, 0x36, 0x3, 0x7];
++_T Ethiopic = [0x92, 0x0, 0x49, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0x29, 0x1, 0x4, 0x2, 0x21, 0x1, 0x4, 0x2, 0x7, 0x1, 0x1, 0x1, 0x4, 0x2, 0xf, 0x1, 0x39, 0x1, 0x4, 0x2, 0x43, 0x2, 0x20, 0x3, 0x1a, 0x99, 0xe6, 0x17, 0x9, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0x1, 0x7, 0xa0, 0x7d, 0x22, 0x6, 0x2, 0x6, 0x2, 0x6, 0x9, 0x7, 0x1, 0x7];
++_T Braille = [0xa0, 0x28, 0x0, 0x81, 0x0];
++_T Lisu = [0xa0, 0xa4, 0xd0, 0x30];
++_T Samaritan = [0x88, 0x0, 0x2e, 0x2, 0xf];
++_T Mongolian = [0x98, 0x0, 0x2, 0x2, 0x1, 0x1, 0x9, 0x1, 0xa, 0x6, 0x58, 0x8, 0x2b];
++_T Hangul = [0x91, 0x0, 0x81, 0x0, 0x9e, 0x2e, 0x2, 0x81, 0x1, 0x5e, 0x71, 0x1f, 0x41, 0x1f, 0xa0, 0x76, 0xe1, 0x1d, 0x82, 0x83, 0xa0, 0x2b, 0xa4, 0xc, 0x17, 0x4, 0x31, 0xa0, 0x27, 0xa4, 0x1f, 0x3, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x3];
++_T Takri = [0xa1, 0x16, 0x80, 0x38, 0x8, 0xa];
++_T Phoenician = [0xa1, 0x9, 0x0, 0x1c, 0x3, 0x1];
++_T Vai = [0xa0, 0xa5, 0x0, 0x81, 0x2c];
++_T Batak = [0x9b, 0xc0, 0x34, 0x8, 0x4];
++_T Yi = [0xa0, 0xa0, 0x0, 0x84, 0x8d, 0x3, 0x37];
++_T Tifinagh = [0xa0, 0x2d, 0x30, 0x38, 0x7, 0x2, 0xe, 0x1];
++_T Glagolitic = [0xa0, 0x2c, 0x0, 0x2f, 0x1, 0x2f];
++_T Tai_Tham = [0x9a, 0x20, 0x3f, 0x1, 0x1d, 0x2, 0xb, 0x6, 0xa, 0x6, 0xe];
++_T Canadian_Aboriginal = [0x94, 0x0, 0x82, 0x80, 0x82, 0x30, 0x46];
++_T Meetei_Mayek = [0xa0, 0xaa, 0xe0, 0x17, 0x80, 0xc9, 0x2e, 0x2, 0xa];
++_T Balinese = [0x9b, 0x0, 0x4c, 0x4, 0x2d];
++_T Kayah_Li = [0xa0, 0xa9, 0x0, 0x30];
++_T Kharoshthi = [0xa1, 0xa, 0x0, 0x4, 0x1, 0x2, 0x5, 0x8, 0x1, 0x3, 0x1, 0x1b, 0x4, 0x3, 0x4, 0x9, 0x8, 0x9];
++_T Lepcha = [0x9c, 0x0, 0x38, 0x3, 0xf, 0x3, 0x3];
++_T New_Tai_Lue = [0x99, 0x80, 0x2c, 0x4, 0x1a, 0x6, 0xb, 0x3, 0x2];
++_T Sora_Sompeng = [0xa1, 0x10, 0xd0, 0x19, 0x7, 0xa];
++_T Arabic = [0x86, 0x0, 0x5, 0x1, 0x6, 0x1, 0xe, 0x1, 0x1, 0x1, 0x1, 0x1, 0x20, 0x1, 0xa, 0xb, 0xa, 0xa, 0x6, 0x1, 0x6c, 0x1, 0x22, 0x50, 0x30, 0x81, 0x20, 0x1, 0x1, 0xb, 0x37, 0x1b, 0xa0, 0xf2, 0x51, 0x72, 0x11, 0x81, 0x6b, 0x12, 0x40, 0x2, 0x36, 0x28, 0xd, 0x73, 0x5, 0x1, 0x80, 0x87, 0x8f, 0x63, 0x1f, 0xa0, 0xdf, 0x81, 0x4, 0x1, 0x1b, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0xa, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x4, 0x1, 0x7, 0x1, 0x4, 0x1, 0x4, 0x1, 0x1, 0x1, 0xa, 0x1, 0x11, 0x5, 0x3, 0x1, 0x5, 0x1, 0x11, 0x34, 0x2];
++_T Hanunoo = [0x97, 0x20, 0x15];
++_T Lydian = [0xa1, 0x9, 0x20, 0x1a, 0x5, 0x1];
++_T Tai_Viet = [0xa0, 0xaa, 0x80, 0x43, 0x18, 0x5];
++_T Coptic = [0x83, 0xe2, 0xe, 0xa0, 0x28, 0x90, 0x74, 0x5, 0x7];
++_T Brahmi = [0xa1, 0x10, 0x0, 0x4e, 0x4, 0x1e];
++_T Runic = [0x96, 0xa0, 0x4b, 0x3, 0x3];
++_T Egyptian_Hieroglyphs = [0xa1, 0x30, 0x0, 0x84, 0x2f];
++_T Khmer = [0x97, 0x80, 0x5e, 0x2, 0xa, 0x6, 0xa, 0x81, 0xe6, 0x20];
++_T Ogham = [0x96, 0x80, 0x1d];
++_T Gothic = [0xa1, 0x3, 0x30, 0x1b];
++_T Katakana = [0xa0, 0x30, 0xa1, 0x5a, 0x2, 0x3, 0x80, 0xf0, 0x10, 0x80, 0xd0, 0x2f, 0x1, 0x58, 0xa0, 0xcc, 0xe, 0xa, 0x1, 0x2d, 0xa0, 0xb0, 0x62, 0x1];
++_T Miao = [0xa1, 0x6f, 0x0, 0x45, 0xb, 0x2f, 0x10, 0x11];
++_T Meroitic_Hieroglyphs = [0xa1, 0x9, 0x80, 0x20];
++_T Thai = [0x8e, 0x1, 0x3a, 0x5, 0x1c];
++_T Cypriot = [0xa1, 0x8, 0x0, 0x6, 0x2, 0x1, 0x1, 0x2c, 0x1, 0x2, 0x3, 0x1, 0x2, 0x1];
++_T Meroitic_Cursive = [0xa1, 0x9, 0xa0, 0x18, 0x6, 0x2];
++_T Gujarati = [0x8a, 0x81, 0x3, 0x1, 0x9, 0x1, 0x3, 0x1, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x5, 0x2, 0xa, 0x1, 0x3, 0x1, 0x3, 0x2, 0x1, 0xf, 0x4, 0x2, 0xc];
++_T Lao = [0x8e, 0x81, 0x2, 0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x6, 0x4, 0x1, 0x7, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0xd, 0x1, 0x3, 0x2, 0x5, 0x1, 0x1, 0x1, 0x6, 0x2, 0xa, 0x2, 0x4];
++_T Georgian = [0x90, 0xa0, 0x26, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2b, 0x1, 0x4, 0x9c, 0x0, 0x26, 0x1, 0x1, 0x5, 0x1];
++_T Osmanya = [0xa1, 0x4, 0x80, 0x1e, 0x2, 0xa];
++_T Inscriptional_Pahlavi = [0xa1, 0xb, 0x60, 0x13, 0x5, 0x8];
++_T Shavian = [0xa1, 0x4, 0x50, 0x30];
++_T Carian = [0xa1, 0x2, 0xa0, 0x31];
++_T Cherokee = [0x93, 0xa0, 0x55];
++_T Mandaic = [0x88, 0x40, 0x1c, 0x2, 0x1];
++_T Han = [0xa0, 0x2e, 0x80, 0x1a, 0x1, 0x59, 0xc, 0x80, 0xd6, 0x2f, 0x1, 0x1, 0x1, 0x19, 0x9, 0xe, 0x4, 0x83, 0xc4, 0x99, 0xb6, 0x4a, 0xa0, 0x51, 0xcd, 0xa0, 0x59, 0x33, 0x81, 0x6e, 0x2, 0x6a, 0xa1, 0x5, 0x26, 0xa0, 0xa6, 0xd7, 0x29, 0x90, 0x35, 0xb, 0x80, 0xde, 0xa0, 0x3f, 0xe2, 0x82, 0x1e];
++_T Latin = [0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xf, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xc1, 0x27, 0x5, 0x9a, 0x1b, 0x26, 0x6, 0x31, 0x5, 0x4, 0x5, 0xd, 0x1, 0x46, 0x41, 0x81, 0x0, 0x81, 0x71, 0x1, 0xd, 0x1, 0x10, 0xd, 0x80, 0x8d, 0x2, 0x6, 0x1, 0x1b, 0x1, 0x11, 0x29, 0x8a, 0xd7, 0x20, 0xa0, 0x7a, 0xa2, 0x66, 0x3, 0x4, 0x1, 0x4, 0xc, 0xb, 0x4d, 0x8, 0xa0, 0x53, 0x0, 0x7, 0x84, 0x1a, 0x1a, 0x6, 0x1a];
++_T Limbu = [0x99, 0x0, 0x1d, 0x3, 0xc, 0x4, 0xc, 0x4, 0x1, 0x3, 0xc];
++_T Ol_Chiki = [0x9c, 0x50, 0x30];
++_T Bengali = [0x89, 0x81, 0x3, 0x1, 0x8, 0x2, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x1, 0x3, 0x4, 0x2, 0x9, 0x2, 0x2, 0x2, 0x4, 0x8, 0x1, 0x4, 0x2, 0x1, 0x5, 0x2, 0x16];
++_T Myanmar = [0x90, 0x0, 0x80, 0xa0, 0xa0, 0x99, 0xc0, 0x1c];
++_T Malayalam = [0x8d, 0x2, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x29, 0x2, 0x8, 0x1, 0x3, 0x1, 0x5, 0x8, 0x1, 0x8, 0x4, 0x2, 0x10, 0x3, 0x7];
++_T Hiragana = [0xa0, 0x30, 0x41, 0x56, 0x6, 0x3, 0xa1, 0x7f, 0x61, 0x1, 0xa0, 0x41, 0xfe, 0x1];
++_T Kannada = [0x8c, 0x82, 0x2, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x2, 0x9, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x7, 0x1, 0x1, 0x4, 0x2, 0xa, 0x1, 0x2];
++_T Armenian = [0x85, 0x31, 0x26, 0x2, 0x7, 0x1, 0x27, 0x2, 0x1, 0x4, 0x1, 0xa0, 0xf5, 0x83, 0x5];
++_T Common = [0x0, 0x41, 0x1a, 0x6, 0x1a, 0x2f, 0x1, 0xf, 0x1, 0x5, 0x17, 0x1, 0x1f, 0x1, 0x81, 0xc1, 0x27, 0x5, 0x5, 0x2, 0x14, 0x74, 0x1, 0x9, 0x1, 0x6, 0x1, 0x1, 0x1, 0x82, 0x1, 0x1, 0x80, 0x82, 0x1, 0xe, 0x1, 0x3, 0x1, 0x20, 0x1, 0x1f, 0xa, 0x73, 0x1, 0x82, 0x86, 0x2, 0x84, 0xd9, 0x1, 0x81, 0x95, 0x4, 0x81, 0x22, 0x1, 0x85, 0xef, 0x3, 0x47, 0x2, 0x80, 0xcb, 0x2, 0x1, 0x1, 0x84, 0xcd, 0x1, 0xd, 0x1, 0x7, 0x4, 0x1, 0x6, 0x1, 0x2, 0x83, 0x9, 0xc, 0x2, 0x57, 0x1, 0xb, 0x3, 0xb, 0x1, 0xf, 0x11, 0x1b, 0x45, 0x26, 0x1, 0x3, 0x2, 0x6, 0x1, 0x1b, 0x1, 0x11, 0x29, 0x1, 0x6, 0x82, 0x64, 0xc, 0x27, 0x19, 0xb, 0x15, 0x82, 0xa0, 0x1, 0x80, 0xff, 0x81, 0x0, 0x82, 0x4d, 0x3, 0xa, 0x82, 0xa6, 0x3c, 0x81, 0xb4, 0xc, 0x4, 0x5, 0x1, 0x1, 0x1, 0x19, 0xf, 0x8, 0x4, 0x4, 0x5b, 0x2, 0x3, 0x1, 0x5a, 0x2, 0x80, 0x93, 0x10, 0x20, 0x24, 0x3c, 0x40, 0x1f, 0x51, 0x80, 0x88, 0x80, 0xa8, 0x99, 0xc0, 0x40, 0xa0, 0x59, 0x0, 0x22, 0x66, 0x3, 0x80, 0xa5, 0xa, 0x81, 0x95, 0x1, 0xa0, 0x53, 0x6e, 0x2, 0x80, 0xbd, 0x1, 0x12, 0xa, 0x16, 0x23, 0x1, 0x13, 0x1, 0x4, 0x80, 0x93, 0x1, 0x1, 0x20, 0x1a, 0x6, 0x1a, 0xb, 0xa, 0x1, 0x2d, 0x2, 0x40, 0x7, 0x1, 0x7, 0xa, 0x5, 0x81, 0x2, 0x3, 0x4, 0x2d, 0x3, 0x9, 0x50, 0xc, 0x34, 0x2d, 0xa0, 0xce, 0x3, 0x80, 0xf6, 0xa, 0x27, 0x2, 0x3e, 0x3, 0x11, 0x8, 0x2, 0x7, 0x1e, 0x4, 0x30, 0x81, 0x22, 0x57, 0x9, 0x12, 0x80, 0x8e, 0x55, 0x1, 0x47, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x4, 0x1, 0xc, 0x1, 0x1, 0x1, 0x7, 0x1, 0x41, 0x1, 0x4, 0x2, 0x8, 0x1, 0x7, 0x1, 0x1c, 0x1, 0x4, 0x1, 0x5, 0x1, 0x1, 0x3, 0x7, 0x1, 0x81, 0x54, 0x2, 0x81, 0x24, 0x2, 0x32, 0x98, 0x0, 0x2c, 0x4, 0x64, 0xc, 0xf, 0x2, 0xe, 0x2, 0xf, 0x1, 0xf, 0x20, 0xb, 0x5, 0x1f, 0x1, 0x3c, 0x4, 0x2b, 0x4b, 0x1a, 0x1, 0x2, 0xd, 0x2b, 0x5, 0x9, 0x7, 0x2, 0x80, 0xae, 0x21, 0xf, 0x6, 0x1, 0x46, 0x3, 0x14, 0xc, 0x25, 0x1, 0x5, 0x15, 0x11, 0xf, 0x3f, 0x1, 0x1, 0x1, 0x80, 0xb6, 0x1, 0x4, 0x3, 0x3e, 0x2, 0x4, 0xc, 0x18, 0x80, 0x93, 0x46, 0x4, 0xb, 0x30, 0x46, 0x3a, 0x74, 0xac, 0x8, 0x8d, 0x1, 0x1e, 0x60];
++_T Old_Italic = [0xa1, 0x3, 0x0, 0x1f, 0x1, 0x4];
++_T Old_Persian = [0xa1, 0x3, 0xa0, 0x24, 0x4, 0xe];
++_T Greek = [0x83, 0x70, 0x4, 0x1, 0x3, 0x2, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x14, 0x1, 0x3f, 0xe, 0x10, 0x99, 0x26, 0x5, 0x32, 0x5, 0x4, 0x5, 0x54, 0x1, 0x81, 0x40, 0x16, 0x2, 0x6, 0x2, 0x26, 0x2, 0x6, 0x2, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1f, 0x2, 0x35, 0x1, 0xf, 0x1, 0xe, 0x2, 0x6, 0x1, 0x13, 0x2, 0x3, 0x1, 0x9, 0x81, 0x27, 0x1, 0xa0, 0xe0, 0x19, 0x4b, 0xa0, 0xd0, 0x75, 0x46];
++_T Sundanese = [0x9b, 0x80, 0x40, 0x81, 0x0, 0x8];
++_T Syriac = [0x87, 0x0, 0xe, 0x1, 0x3c, 0x2, 0x3];
++_T Gurmukhi = [0x8a, 0x1, 0x3, 0x1, 0x6, 0x4, 0x2, 0x2, 0x16, 0x1, 0x7, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x5, 0x4, 0x2, 0x2, 0x3, 0x3, 0x1, 0x7, 0x4, 0x1, 0x1, 0x7, 0x10];
++_T Tibetan = [0x8f, 0x0, 0x48, 0x1, 0x24, 0x4, 0x27, 0x1, 0x24, 0x1, 0xf, 0x1, 0x7, 0x4, 0x2];
++_T Tamil = [0x8b, 0x82, 0x2, 0x1, 0x6, 0x3, 0x3, 0x1, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0xc, 0x4, 0x5, 0x3, 0x3, 0x1, 0x4, 0x2, 0x1, 0x6, 0x1, 0xe, 0x15];
++_T Telugu = [0x8c, 0x1, 0x3, 0x1, 0x8, 0x1, 0x3, 0x1, 0x17, 0x1, 0xa, 0x1, 0x5, 0x3, 0x8, 0x1, 0x3, 0x1, 0x4, 0x7, 0x2, 0x1, 0x2, 0x6, 0x4, 0x2, 0xa, 0x8, 0x8];
++_T Inscriptional_Parthian = [0xa1, 0xb, 0x40, 0x16, 0x2, 0x8];
++_T Nko = [0x87, 0xc0, 0x3b];
++_T Javanese = [0xa0, 0xa9, 0x80, 0x4e, 0x2, 0xa, 0x4, 0x2];
++_T Tai_Le = [0x99, 0x50, 0x1e, 0x2, 0x5];
++_T Old_South_Arabian = [0xa1, 0xa, 0x60, 0x20];
++_T Bamum = [0xa0, 0xa6, 0xa0, 0x58, 0xa0, 0xc1, 0x8, 0x82, 0x39];
++_T Chakma = [0xa1, 0x11, 0x0, 0x35, 0x1, 0xe];
++_T Ugaritic = [0xa1, 0x3, 0x80, 0x1e, 0x1, 0x1];
++_T Tagalog = [0x97, 0x0, 0xd, 0x1, 0x7];
++_T Tagbanwa = [0x97, 0x60, 0xd, 0x1, 0x3, 0x1, 0x2];
++_T Devanagari = [0x89, 0x0, 0x51, 0x2, 0x11, 0x2, 0x12, 0x1, 0x7, 0xa0, 0x9f, 0x60, 0x1c];
++_T Buginese = [0x9a, 0x0, 0x1c, 0x2, 0x2];
++_T Cuneiform = [0xa1, 0x20, 0x0, 0x83, 0x6f, 0x80, 0x91, 0x63, 0xd, 0x4];
++_T Cyrillic = [0x84, 0x0, 0x80, 0x85, 0x2, 0x80, 0xa1, 0x98, 0x3, 0x1, 0x4c, 0x1, 0x90, 0x67, 0x20, 0xa0, 0x78, 0x40, 0x58, 0x7, 0x1];
++_U[] _tab = [
++_U("Arabic", Arabic),
++_U("Armenian", Armenian),
++_U("Avestan", Avestan),
++_U("Balinese", Balinese),
++_U("Bamum", Bamum),
++_U("Batak", Batak),
++_U("Bengali", Bengali),
++_U("Bopomofo", Bopomofo),
++_U("Brahmi", Brahmi),
++_U("Braille", Braille),
++_U("Buginese", Buginese),
++_U("Buhid", Buhid),
++_U("Canadian_Aboriginal", Canadian_Aboriginal),
++_U("Carian", Carian),
++_U("Chakma", Chakma),
++_U("Cham", Cham),
++_U("Cherokee", Cherokee),
++_U("Common", Common),
++_U("Coptic", Coptic),
++_U("Cuneiform", Cuneiform),
++_U("Cypriot", Cypriot),
++_U("Cyrillic", Cyrillic),
++_U("Deseret", Deseret),
++_U("Devanagari", Devanagari),
++_U("Egyptian_Hieroglyphs", Egyptian_Hieroglyphs),
++_U("Ethiopic", Ethiopic),
++_U("Georgian", Georgian),
++_U("Glagolitic", Glagolitic),
++_U("Gothic", Gothic),
++_U("Greek", Greek),
++_U("Gujarati", Gujarati),
++_U("Gurmukhi", Gurmukhi),
++_U("Han", Han),
++_U("Hangul", Hangul),
++_U("Hanunoo", Hanunoo),
++_U("Hebrew", Hebrew),
++_U("Hiragana", Hiragana),
++_U("Imperial_Aramaic", Imperial_Aramaic),
++_U("Inherited", Inherited),
++_U("Inscriptional_Pahlavi", Inscriptional_Pahlavi),
++_U("Inscriptional_Parthian", Inscriptional_Parthian),
++_U("Javanese", Javanese),
++_U("Kaithi", Kaithi),
++_U("Kannada", Kannada),
++_U("Katakana", Katakana),
++_U("Kayah_Li", Kayah_Li),
++_U("Kharoshthi", Kharoshthi),
++_U("Khmer", Khmer),
++_U("Lao", Lao),
++_U("Latin", Latin),
++_U("Lepcha", Lepcha),
++_U("Limbu", Limbu),
++_U("Linear_B", Linear_B),
++_U("Lisu", Lisu),
++_U("Lycian", Lycian),
++_U("Lydian", Lydian),
++_U("Malayalam", Malayalam),
++_U("Mandaic", Mandaic),
++_U("Meetei_Mayek", Meetei_Mayek),
++_U("Meroitic_Cursive", Meroitic_Cursive),
++_U("Meroitic_Hieroglyphs", Meroitic_Hieroglyphs),
++_U("Miao", Miao),
++_U("Mongolian", Mongolian),
++_U("Myanmar", Myanmar),
++_U("New_Tai_Lue", New_Tai_Lue),
++_U("Nko", Nko),
++_U("Ogham", Ogham),
++_U("Ol_Chiki", Ol_Chiki),
++_U("Old_Italic", Old_Italic),
++_U("Old_Persian", Old_Persian),
++_U("Old_South_Arabian", Old_South_Arabian),
++_U("Old_Turkic", Old_Turkic),
++_U("Oriya", Oriya),
++_U("Osmanya", Osmanya),
++_U("Phags_Pa", Phags_Pa),
++_U("Phoenician", Phoenician),
++_U("Rejang", Rejang),
++_U("Runic", Runic),
++_U("Samaritan", Samaritan),
++_U("Saurashtra", Saurashtra),
++_U("Sharada", Sharada),
++_U("Shavian", Shavian),
++_U("Sinhala", Sinhala),
++_U("Sora_Sompeng", Sora_Sompeng),
++_U("Sundanese", Sundanese),
++_U("Syloti_Nagri", Syloti_Nagri),
++_U("Syriac", Syriac),
++_U("Tagalog", Tagalog),
++_U("Tagbanwa", Tagbanwa),
++_U("Tai_Le", Tai_Le),
++_U("Tai_Tham", Tai_Tham),
++_U("Tai_Viet", Tai_Viet),
++_U("Takri", Takri),
++_U("Tamil", Tamil),
++_U("Telugu", Telugu),
++_U("Thaana", Thaana),
++_U("Thai", Thai),
++_U("Tibetan", Tibetan),
++_U("Tifinagh", Tifinagh),
++_U("Ugaritic", Ugaritic),
++_U("Vai", Vai),
++_U("Yi", Yi),
++];
++}
++
++struct hangul
++{
++private alias _U = immutable(UnicodeProperty);
++@property static _U[] tab() { return _tab; }
++static immutable:
++private alias _T = ubyte[];
++_T LVT = [0xa0, 0xac, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b];
++_T T = [0x91, 0xa8, 0x58, 0xa0, 0xc5, 0xcb, 0x31];
++_T V = [0x91, 0x60, 0x48, 0xa0, 0xc6, 0x8, 0x17];
++_T LV = [0xa0, 0xac, 0x0, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1, 0x1b, 0x1];
++_T L = [0x91, 0x0, 0x60, 0xa0, 0x98, 0x0, 0x1d];
++_U[] _tab = [
++_U("L", L),
++_U("Leading_Jamo", L),
++_U("LV", LV),
++_U("LV_Syllable", LV),
++_U("LVT", LVT),
++_U("LVT_Syllable", LVT),
++_U("T", T),
++_U("Trailing_Jamo", T),
++_U("V", V),
++_U("Vowel_Jamo", V),
++];
++}
++bool isFormatGen(dchar ch) @safe pure nothrow
++{
++    if(ch < 8288)
++    {
++        if(ch < 1807)
++        {
++            if(ch < 1564)
++            {
++                if(ch == 173) return true;
++                if(ch < 1536) return false;
++                if(ch < 1541) return true;
++                return false;
++            }
++            else if (ch < 1565) return true;
++            else
++            {
++                if(ch == 1757) return true;
++                return false;
++            }
++        }
++        else if (ch < 1808) return true;
++        else
++        {
++            if(ch < 8203)
++            {
++                if(ch == 6158) return true;
++                return false;
++            }
++            else if (ch < 8208) return true;
++            else
++            {
++                if(ch < 8234) return false;
++                if(ch < 8239) return true;
++                return false;
++            }
++        }
++    }
++    else if (ch < 8293) return true;
++    else
++    {
++        if(ch < 69821)
++        {
++            if(ch < 65279)
++            {
++                if(ch < 8294) return false;
++                if(ch < 8304) return true;
++                return false;
++            }
++            else if (ch < 65280) return true;
++            else
++            {
++                if(ch < 65529) return false;
++                if(ch < 65532) return true;
++                return false;
++            }
++        }
++        else if (ch < 69822) return true;
++        else
++        {
++            if(ch < 917505)
++            {
++                if(ch < 119155) return false;
++                if(ch < 119163) return true;
++                return false;
++            }
++            else if (ch < 917506) return true;
++            else
++            {
++                if(ch < 917536) return false;
++                if(ch < 917632) return true;
++                return false;
++            }
++        }
++    }
++}
++
++bool isControlGen(dchar ch) @safe pure nothrow
++{
++    if(ch < 32) return true;
++    if(ch < 127) return false;
++    if(ch < 160) return true;
++    return false;
++}
++
++bool isSpaceGen(dchar ch) @safe pure nothrow
++{
++    if(ch < 160)
++    {
++        if(ch == 32) return true;
++        return false;
++    }
++    else if (ch < 161) return true;
++    else
++    {
++        if(ch < 8239)
++        {
++            if(ch == 5760) return true;
++            if(ch < 8192) return false;
++            if(ch < 8203) return true;
++            return false;
++        }
++        else if (ch < 8240) return true;
++        else
++        {
++            if(ch == 8287) return true;
++            if(ch == 12288) return true;
++            return false;
++        }
++    }
++}
++
++bool isWhiteGen(dchar ch) @safe pure nothrow
++{
++    if(ch < 133)
++    {
++        if(ch < 9) return false;
++        if(ch < 14) return true;
++        if(ch == 32) return true;
++        return false;
++    }
++    else if (ch < 134) return true;
++    else
++    {
++        if(ch < 8232)
++        {
++            if(ch < 5760)
++            {
++                if(ch == 160) return true;
++                return false;
++            }
++            else if (ch < 5761) return true;
++            else
++            {
++                if(ch < 8192) return false;
++                if(ch < 8203) return true;
++                return false;
++            }
++        }
++        else if (ch < 8234) return true;
++        else
++        {
++            if(ch < 8287)
++            {
++                if(ch == 8239) return true;
++                return false;
++            }
++            else if (ch < 8288) return true;
++            else
++            {
++                if(ch == 12288) return true;
++                return false;
++            }
++        }
++    }
++}
++
++bool isHangL(dchar ch) @safe pure nothrow
++{
++    if(ch < 4352) return false;
++    if(ch < 4448) return true;
++    if(ch < 43360) return false;
++    if(ch < 43389) return true;
++    return false;
++}
++
++bool isHangV(dchar ch) @safe pure nothrow
++{
++    if(ch < 4448) return false;
++    if(ch < 4520) return true;
++    if(ch < 55216) return false;
++    if(ch < 55239) return true;
++    return false;
++}
++
++bool isHangT(dchar ch) @safe pure nothrow
++{
++    if(ch < 4520) return false;
++    if(ch < 4608) return true;
++    if(ch < 55243) return false;
++    if(ch < 55292) return true;
++    return false;
++}
++
++
++static if(size_t.sizeof == 8) {
++//1536 bytes
++enum lowerCaseTrieEntries = TrieEntry!(bool, 8, 4, 9)([ 0x0,  0x20,  0x40], [ 0x100,  0x80,  0x2000], [ 0x402030202020100,  0x206020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x3000300030003,  0x3000300030003,  0x5000400030003,  0x3000700030006,  0x3000800030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x9000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0xb0003000a0003,  0x3000c00030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0xe000d00030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x0,  0x7fffffe00000000,  0x420040000000000,  0xff7fffff80000000,  0x55aaaaaaaaaaaaaa,  0xd4aaaaaaaaaaab55,  0xe6512d2a4e243129,  0xaa29aaaab5555240,  0x93faaaaaaaaaaaaa,  0xffffffffffffaa85,  0x1ffffffffefffff,  0x1f00000003,  0x0,  0x3c8a000000000020,  0xfffff00000010000,  0x192faaaaaae37fff,  0xffff000000000000,  0xaaaaaaaaffffffff,  0xaaaaaaaaaaaaa802,  0xaaaaaaaaaaaad554,  0xaaaaaaaaaa,  0xfffffffe00000000,  0xff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x0,  0xaaaaaaaaaaaaaaaa,  0xaaaaaaaaaaaaaaaa,  0xaaaaaaaabfeaaaaa,  0xaaaaaaaaaaaaaaaa,  0xff00ff003f00ff,  0x3fff00ff00ff003f,  0x40df00ff00ff00ff,  0xdc00ff00cf00dc,  0x0,  0x8002000000000000,  0x1fff0000,  0x0,  0x321080000008c400,  0xffff0000000043c0,  0x10,  0x0,  0x0,  0x0,  0x0,  0x3ffffff0000,  0x0,  0x0,  0x0,  0x0,  0xffff000000000000,  0x3fda15627fffffff,  0xaaaaaaaaaaaaaaaa,  0x8501aaaaaaaaa,  0x20bfffffffff,  0x0,  0x0,  0x0,  0x0,  0x2aaaaaaaaaaa,  0xaaaaaa,  0x0,  0xaaabaaa800000000,  0x95ffaaaaaaaaaaaa,  0x2aa000a50aa,  0x700000000000000,  0x0,  0x0,  0x0,  0x0,  0xf8007f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7fffffe,  0x0,  0x0,  0xffffff0000000000,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffc000000,  0xffffdfc000,  0xebc000000ffffffc,  0xfffffc000000ffef,  0xffffffc000000f,  0xffffffc0000,  0xfc000000ffffffc0,  0xffffc000000fffff,  0xffffffc000000ff,  0xffffffc00000,  0x3ffffffc00,  0xf0000003f7fffffc,  0xffc000000fdfffff,  0xffff0000003f7fff,  0xfffffc000000fdff,  0xbf7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1472 bytes
++enum upperCaseTrieEntries = TrieEntry!(bool, 8, 4, 9)([ 0x0,  0x20,  0x40], [ 0x100,  0x80,  0x1e00], [ 0x402030202020100,  0x206020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x3000300030003,  0x3000300030004,  0x5000300030003,  0x3000700030006,  0x3000800030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x9000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0xa000300030003,  0x3000b00030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0xd000c00030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x3000300030003,  0x0,  0x7fffffe,  0x0,  0x7f7fffff,  0xaa55555555555555,  0x2b555555555554aa,  0x11aed2d5b1dbced6,  0x55d255554aaaa490,  0x6c05555555555555,  0x557a,  0x0,  0x0,  0x0,  0x45000000000000,  0xffbfffed740,  0xe6905555551c8000,  0xffffffffffff,  0x5555555500000000,  0x5555555555555401,  0x5555555555552aab,  0xfffe005555555555,  0x7fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff00000000,  0x20bf,  0x0,  0x0,  0x0,  0x0,  0x5555555555555555,  0x5555555555555555,  0x5555555540155555,  0x5555555555555555,  0xff00ff003f00ff00,  0xff00aa003f00,  0xf00000000000000,  0xf001f000f000f00,  0x0,  0x0,  0x0,  0x0,  0xc00f3d503e273884,  0xffff00000020,  0x8,  0x0,  0x0,  0x0,  0xffc0000000000000,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x7fffffffffff,  0xc025ea9d00000000,  0x5555555555555555,  0x4280555555555,  0x0,  0x0,  0x0,  0x0,  0x0,  0x155555555555,  0x555555,  0x0,  0x5554555400000000,  0x6a00555555555555,  0x55500052855,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7fffffe00000000,  0x0,  0x0,  0x0,  0xffffffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfff0000003ffffff,  0xffffff0000003fff,  0x3fde64d0000003,  0x3ffffff0000,  0x7b0000001fdfe7b0,  0xfffff0000001fc5f,  0x3ffffff0000003f,  0x3ffffff00000,  0xf0000003ffffff00,  0xffff0000003fffff,  0xffffff00000003ff,  0x7fffffc00000001,  0x1ffffff0000000,  0x7fffffc00000,  0x1ffffff0000,  0x400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//8704 bytes
++enum simpleCaseTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x100], [ 0x100,  0x380,  0xd00], [ 0x402030202020100,  0x202020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x3000200010000,  0x7000600050004,  0xa00090008,  0xd000c000b0000,  0x110010000f000e,  0x1400130012,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16001500000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x1b001a00190018,  0x1f001e001d001c,  0x0,  0x2200210020,  0x0,  0x0,  0x24002300000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x28002700260025,  0x29,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b002a0000,  0x2e002d002c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30002f,  0x0,  0x0,  0x0,  0x0,  0x320031,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2400220020ffff,  0x2c002a00280026,  0x72f00320030002e,  0x3d003b00390037,  0x1b000430041003f,  0x4e004c004a0048,  0xffff005400520050,  0xffffffffffffffff,  0x2500230021ffff,  0x2d002b00290027,  0x73000330031002f,  0x3e003c003a0038,  0x1b1004400420040,  0x4f004d004b0049,  0xffff005500530051,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff043fffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xcc049800c800c6,  0xd500d3014904aa,  0xdd00db00d900d7,  0xe500e300e100df,  0xed00eb00e900e7,  0xffff00f300f100ef,  0xfb00f900f700f5,  0x6be010100ff00fd,  0xcd049900c900c7,  0xd600d4014a04ab,  0xde00dc00da00d8,  0xe600e400e200e0,  0xee00ec00ea00e8,  0xffff00f400f200f0,  0xfc00fa00f800f6,  0x1a80102010000fe,  0x118011701160115,  0x11e011d011c011b,  0x12401230120011f,  0x128012701260125,  0x12e012d012c012b,  0x13401330130012f,  0x138013701360135,  0x13c013b013a0139,  0x140013f013e013d,  0x144014301420141,  0x148014701460145,  0x14f014e014d014c,  0x1510150ffffffff,  0x155015401530152,  0x15801570156ffff,  0x15e015d015c0159,  0x16201610160015f,  0x166016501640163,  0x1690168ffff0167,  0x16d016c016b016a,  0x1710170016f016e,  0x175017401730172,  0x179017801770176,  0x17d017c017b017a,  0x1830182017f017e,  0x18b018a01870186,  0x1930192018f018e,  0x19b019a01970196,  0x1a301a2019f019e,  0x1a701a601a501a4,  0x1ac01ab01aa01a9,  0x1b201af01ae01ad,  0x1b601b501b3028b,  0x1bd01bb01ba01b9,  0x1c301c101bf01be,  0x1c701c5ffff01c4,  0x1cd01cc01cb01c9,  0x1d301d1023b01cf,  0xffff028301d601d5,  0x1db026901d901d7,  0x1e001df01de01dd,  0x1e501e301e201e1,  0xffffffff01e701e6,  0x1ed01eb01ea01e9,  0x1f301f101ef01ee,  0x1f701f601f501f4,  0xffffffff01fa01f9,  0x23dffff01fc01fb,  0xffffffffffffffff,  0x206020202010200,  0x20d020c02080207,  0x2110210020f020e,  0x215021402130212,  0x219021802170216,  0x21d021c021b021a,  0x220021f01c6021e,  0x226022502240223,  0x22a022902280227,  0x22e022d022c022b,  0x23202310230022f,  0x23802370236ffff,  0x23e023c023a0239,  0x24402430240023f,  0x248024702460245,  0x24c024b024a0249,  0x250024f024e024d,  0x254025302520251,  0x258025702560255,  0x25c025b025a0259,  0x260025f025e025d,  0x264026302620261,  0x268026702660265,  0x26c026bffff026a,  0x270026f026e026d,  0x274027302720271,  0x278027702760275,  0x27c027b027a0279,  0xffffffffffffffff,  0x281027fffffffff,  0x2d7028502840282,  0x28c028802870482,  0x2920291028f028d,  0x296029502940293,  0x29c029b02980297,  0x1b402b70466046a,  0x1c201c0ffff01bc,  0x1caffff01c8ffff,  0xffffffffffffffff,  0x1d0ffffffff01ce,  0xffff05fa0748ffff,  0x528ffff01d201d4,  0x1d8ffffffffffff,  0xffff01da02b3ffff,  0xffffffff01dcffff,  0xffffffffffffffff,  0xffffffff02a3ffff,  0x1e8ffffffff01e4,  0xffffffffffffffff,  0x1f201f0028e01ec,  0xffffffffffff0290,  0xffff01f8ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff083affff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x320031f031e031d,  0x3240323ffffffff,  0x3d5ffffffffffff,  0xffffffff03d903d7,  0xffffffffffffffff,  0xffff0329ffffffff,  0xffff0331032f032d,  0x3370335ffff0333,  0x33e03950339ffff,  0x347034503cc0340,  0x35403c2083b03c8,  0x35d035b03590440,  0x388ffff03c5039f,  0x36f039c036a0368,  0x378037607100371,  0x3320330032e032a,  0x33f0396033affff,  0x348034603cd0341,  0x35503c3083c03c9,  0x35e035c035a0441,  0x38a038903c603a0,  0x370039d036b0369,  0x379037707110372,  0x393033803360334,  0xffffffff03ca0397,  0x39403a1039effff,  0x3a703a603a303a2,  0x3ab03aa03a903a8,  0x3af03ae03ad03ac,  0x3b503b403b103b0,  0x3bd03bc03b903b8,  0x3c103c003bf03be,  0xffff03d103c703c4,  0x3cfffff03ce03cb,  0x3d403d303d203d0,  0x3da03d803d6ffff,  0x3e103df03dd03db,  0x3e903e703e503e3,  0x3f103ef03ed03eb,  0x3f903f703f503f3,  0x40103ff03fd03fb,  0x409040704050403,  0x411040f040d040b,  0x419041704150413,  0x421041f041d041b,  0x429042704250423,  0x431042f042d042b,  0x439043704350433,  0x402040003fe03fc,  0x40a040804060404,  0x4120410040e040c,  0x41a041804160414,  0x4220420041e041c,  0x42a042804260424,  0x4320430042e042c,  0x43a043804360434,  0x3e203e003de03dc,  0x3ea03e803e603e4,  0x3f203f003ee03ec,  0x3fa03f803f603f4,  0x453045204510450,  0x459045804570456,  0x4610460045d045c,  0x469046804650464,  0x4710470046d046c,  0x477047604730472,  0x47b047a04790478,  0x4810480047d047c,  0xffffffff04850484,  0xffffffffffffffff,  0x4950494ffffffff,  0x49b049a04970496,  0x49f049e049d049c,  0x4a704a604a304a2,  0x4ad04ac04a904a8,  0x4b304b204b104b0,  0x4b904b804b704b6,  0x4bf04be04bb04ba,  0x4c504c404c104c0,  0x4cd04cc04c904c8,  0x4d304d204cf04ce,  0x4d704d604d504d4,  0x4df04de04db04da,  0x4e704e604e304e2,  0x4f004ed04ec04ea,  0x4f804f504f404f1,  0x50004fd04fc04f9,  0x4eb050505040501,  0x50d050c050b050a,  0x5130512050f050e,  0x519051805170516,  0x51f051e051d051c,  0x525052405210520,  0x52b052a05270526,  0x52f052e052d052c,  0x537053605330532,  0x53d053c05390538,  0x5410540053f053e,  0x547054605430542,  0x54b054a05490548,  0x54f054e054d054c,  0x555055405510550,  0x559055805570556,  0x55d055c055b055a,  0x5630562055f055e,  0x567056605650564,  0x56b056a05690568,  0x5730572056f056e,  0x577057605750574,  0x57b057a05790578,  0xffffffffffffffff,  0xffffffffffffffff,  0x58405820580ffff,  0x58c058a05880586,  0x59405920590058e,  0x59c059a05980596,  0x5a405a205a0059e,  0x5ac05aa05a805a6,  0x5b405b205b005ae,  0x5bc05ba05b805b6,  0x5c405c205c005be,  0xffff05ca05c805c6,  0xffffffffffffffff,  0xffffffffffffffff,  0x58505830581ffff,  0x58d058b05890587,  0x59505930591058f,  0x59d059b05990597,  0x5a505a305a1059f,  0x5ad05ab05a905a7,  0x5b505b305b105af,  0x5bd05bb05b905b7,  0x5c505c305c105bf,  0xffff05cb05c905c7,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x8c008a00880086,  0x9400920090008e,  0x9c009a00980096,  0xa400a200a0009e,  0xac00aa00a800a6,  0xb400b200b000ae,  0xbc00ba00b800b6,  0xc400c200c000be,  0x4a000ca048e0486,  0x4c6ffff04b400ce,  0xffffffffffffffff,  0xffffffff0508ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff07e8ffff,  0xffffffff0454ffff,  0x5ff05fe05fd05fc,  0x605060406010600,  0x60b060a06090608,  0x6110610060f060e,  0x617061606130612,  0x61d061c06190618,  0x6210620061f061e,  0x627062606230622,  0x62b062a06290628,  0x62f062e062d062c,  0x635063406310630,  0x639063806370636,  0x63d063c063b063a,  0x6430642063f063e,  0x647064606450644,  0x64b064a06490648,  0x6510650064d064c,  0x655065406530652,  0x65d065c06590658,  0x6630662065f065e,  0x667066606650664,  0x66b066a06690668,  0x6710670066d066c,  0x675067406730672,  0x67a067906bc06bb,  0x680067f067c067b,  0x684068306820681,  0x688068706860685,  0x68e068d068a0689,  0x69206910690068f,  0x698069706960695,  0x69e069d069a0699,  0x6a206a106a0069f,  0x6a606a506a406a3,  0x6ac06ab06a806a7,  0x6b006af06ae06ad,  0x6b406b306b206b1,  0xffffffff06b606b5,  0x6bdffffffffffff,  0xffff06bfffffffff,  0x6c306c206c106c0,  0x6c906c806c506c4,  0x6cd06cc06cb06ca,  0x6d106d006cf06ce,  0x6d706d606d506d4,  0x6dd06dc06db06da,  0x6e106e006df06de,  0x6e506e406e306e2,  0x6eb06ea06e906e8,  0x6f106f006ef06ee,  0x6f506f406f306f2,  0x6f906f806f706f6,  0x6fd06fc06fb06fa,  0x701070006ff06fe,  0x705070407030702,  0x709070807070706,  0x70d070c070b070a,  0x7140713070f070e,  0x718071707160715,  0x71e071d071c071b,  0x72207210720071f,  0x726072507240723,  0x72a072907280727,  0x7330732072e072d,  0x73c073a07380736,  0x74407420740073e,  0x73d073b07390737,  0x74507430741073f,  0x750074e074c074a,  0xffffffff07540752,  0x751074f074d074b,  0xffffffff07550753,  0x76a076807660764,  0x7720770076e076c,  0x76b076907670765,  0x7730771076f076d,  0x78a078807860784,  0x7920790078e078c,  0x78b078907870785,  0x7930791078f078d,  0x7a207a0079e079c,  0xffffffff07a607a4,  0x7a307a1079f079d,  0xffffffff07a707a5,  0x7baffff07b6ffff,  0x7c2ffff07beffff,  0x7bbffff07b7ffff,  0x7c3ffff07bfffff,  0x7d607d407d207d0,  0x7de07dc07da07d8,  0x7d707d507d307d1,  0x7df07dd07db07d9,  0x840083e08360834,  0x84e084c08440842,  0x858085608620860,  0xffffffff08660864,  0x7fa07f807f607f4,  0x802080007fe07fc,  0x7fb07f907f707f5,  0x803080107ff07fd,  0x80e080c080a0808,  0x816081408120810,  0x80f080d080b0809,  0x817081508130811,  0x826082408220820,  0x82e082c082a0828,  0x827082508230821,  0x82f082d082b0829,  0x838ffff08320830,  0xffffffffffffffff,  0x837083508330831,  0xffff083dffff0839,  0x846ffffffffffff,  0xffffffffffffffff,  0x84508430841083f,  0xffffffffffff0847,  0xffffffff084a0848,  0xffffffffffffffff,  0x84f084d084b0849,  0xffffffffffffffff,  0xffffffff08540852,  0xffffffff085affff,  0x859085708550853,  0xffffffffffff085b,  0x868ffffffffffff,  0xffffffffffffffff,  0x867086508630861,  0xffffffffffff0869,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0712ffffffff,  0x14b0731ffffffff,  0xffffffffffffffff,  0xffff0530ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0531ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x18402af0180029f,  0x18c005e018802c1,  0x194006c01900064,  0x19c007e01980076,  0x18502b0018102a0,  0x18d005f018902c2,  0x195006d01910065,  0x19d007f01990077,  0x1b7ffffffffffff,  0xffffffffffff01b8,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x4d80444ffffffff,  0x4e0044c04dc0446,  0x4e8047404e4045e,  0x204ee02d3086a,  0x6e04f606c604f2,  0x10d04fe037a04fa,  0x51a0506061a0502,  0x4dd044704d90445,  0x4e5045f04e1044d,  0x2d4086b04e90475,  0x6c704f3000304ef,  0x37b04fb006f04f7,  0x61b0503010e04ff,  0xffffffff051b0507,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa000800040000,  0x160010000e000c,  0x2bb001c001a0018,  0x5602e702d102c7,  0x66006200600058,  0x7800740070006a,  0x29900820080007c,  0x6020084000607e0,  0x5d005ce02a7057c,  0x1070105010305de,  0x1190113010f0109,  0xffff013101290121,  0xb000900050001,  0x170011000f000d,  0x2bc001d001b0019,  0x5702e802d202c8,  0x67006300610059,  0x7900750071006b,  0x29a00830081007d,  0x6030085000707e1,  0x5d105cf02a8057d,  0x1080106010405df,  0x11a01140110010a,  0xffff0132012a0122,  0x455052904c304c2,  0x45a0286028002a4,  0x46202aa02a9045b,  0x46b02b404670463,  0x2ba02b9ffff02b8,  0xffff02c002bfffff,  0xffffffffffffffff,  0x48302d8ffffffff,  0x489048802e202e1,  0x48d048c048b048a,  0x2fe02fd04910490,  0x30e030d03040303,  0x31a031903160315,  0x328032703260325,  0x6ed06ec02fc02fb,  0x383038203810380,  0x392039103870386,  0x3b303b203a503a4,  0x5cd05cc056d056c,  0x5ed05ec05db05da,  0x6570656060d060c,  0x6e706e6043e043d,  0x7830782072c072b,  0x694069307e307e2,  0x150014065b065a,  0x4bd04bc005d005c,  0x5d505d404d104d0,  0x511051001a101a0,  0x535053405230522,  0x553055205450544,  0x571057005610560,  0x15b015a057f057e,  0x3bb03ba037d037c,  0xffffffffffffffff,  0x5d2ffffffffffff,  0xffff05d905d805d3,  0x5e305e2ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x8d008b00890087,  0x9500930091008f,  0x9d009b00990097,  0xa500a300a1009f,  0xad00ab00a900a7,  0xb500b300b100af,  0xbd00bb00b900b7,  0xc500c300c100bf,  0x4a100cb048f0487,  0x4c7ffff04b500cf,  0xffffffffffffffff,  0xffffffff0509ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x5d705d602c402c3,  0x5e105e005dd05dc,  0x5e905e805e705e6,  0x5ef05ee05eb05ea,  0x5f505f405f105f0,  0x308030705f905f8,  0x625062406150614,  0x641064006330632,  0x6610660064f064e,  0x67e067d066f066e,  0x69c069b068c068b,  0xffffffff06aa06a9,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x69006807350734,  0x75f075e027e027d,  0x390038f07770776,  0x7b107b0001f001e,  0x2a202a107c707c6,  0x6b806b707e507e4,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7590758ffffffff,  0x7610760075d075c,  0x2e002df02d602d5,  0x2ee02ed02e602e5,  0x7790778ffffffff,  0x7810780077d077c,  0x3140313030c030b,  0x322032103180317,  0x797079607950794,  0x79b079a07990798,  0x3850384037f037e,  0x7a907a8038e038d,  0x7ad07ac07ab07aa,  0x7b307b207af07ae,  0x7b907b807b507b4,  0x7c107c007bd07bc,  0x7c907c807c507c4,  0x7cf07ce07cd07cc,  0x47f047e046f046e,  0x4a504a404930492,  0xffffffffffffffff,  0xffffffffffffffff,  0x7e605150514ffff,  0x7eb07ea07e907e7,  0x7ef07ee07ed07ec,  0x7f307f207f107f0,  0x5f2ffffffffffff,  0xffffffff074905f3,  0x807080608050804,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x81b081a08190818,  0x81f081e081d081c,  0xffff05fb05f705f6,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x75a02c50756ffff,  0x76202cf02cd02cb,  0x2e3071902db06d2,  0x2f107ca02e90448,  0x77a02f502f30774,  0x3050221077e02f9,  0xffff043b030f007a,  0xffffffffffffffff,  0x75b02c60757ffff,  0x76302d002ce02cc,  0x2e4071a02dc06d3,  0x2f207cb02ea0449,  0x77b02f602f40775,  0x3060222077f02fa,  0xffff043c0310007b,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x72005a085c0012,  0x11106b9032b0311,  0x2dd029d02ab05e4,  0x10b060602ef085e,  0x4ca028902d902a5,  0x2c902bd02b502ad,  0x30902f702eb0746,  0x38b02b10241031b,  0x442053a044a03b6,  0x85004ae06d8044e,  0x73005b085d0013,  0x11206ba032c0312,  0x2de029e02ac05e5,  0x10c060702f0085f,  0x4cb028a02da02a6,  0x2ca02be02b602ae,  0x30a02f802ec0747,  0x38c02b20242031c,  0x443053b044b03b7,  0x85104af06d9044f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++//8832 bytes
++enum fullCaseTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x100], [ 0x100,  0x380,  0xd40], [ 0x402030202020100,  0x202020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x3000200010000,  0x7000600050004,  0xa00090008,  0xd000c000b0000,  0x110010000f000e,  0x1400130012,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16001500000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x1b001a00190018,  0x1f001e001d001c,  0x0,  0x2200210020,  0x0,  0x0,  0x24002300000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x28002700260025,  0x29,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b002a0000,  0x2e002d002c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2f,  0x0,  0x0,  0x0,  0x310030,  0x0,  0x0,  0x0,  0x0,  0x330032,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2400220020ffff,  0x2c002a00280026,  0x78100320030002e,  0x3d003b00390037,  0x1b900430041003f,  0x4e004c004a0048,  0xffff005400520050,  0xffffffffffffffff,  0x2500230021ffff,  0x2d002b00290027,  0x78200330031002f,  0x3e003c003a0038,  0x1ba004400420040,  0x4f004d004b0049,  0xffff005500530051,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff0470ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xcc04c900c800c6,  0xd500d3014e04db,  0xdd00db00d900d7,  0xe500e300e100df,  0xed00eb00e900e7,  0xffff00f300f100ef,  0xfb00f900f700f5,  0x70f010100ff00fd,  0xcd04ca00c900c7,  0xd600d4014f04dc,  0xde00dc00da00d8,  0xe600e400e200e0,  0xee00ec00ea00e8,  0xffff00f400f200f0,  0xfc00fa00f800f6,  0x1b10102010000fe,  0x11b011a01190118,  0x1210120011f011e,  0x127012601230122,  0x12b012a01290128,  0x1310130012f012e,  0x137013601330132,  0x13b013a01390138,  0x13f013e013d013c,  0x143014201410140,  0x149014801470146,  0x14d014c014b014a,  0x154015301520151,  0x1580157ffff0155,  0x15c015b015a0159,  0x15f015e015dffff,  0x165016401630160,  0x169016801670166,  0x16d016c016b016a,  0x1720171016f016e,  0x176017501740173,  0x17a017901780177,  0x17e017d017c017b,  0x18201810180017f,  0x186018501840183,  0x18c018b01880187,  0x19401930190018f,  0x19c019b01980197,  0x1a401a301a0019f,  0x1ac01ab01a801a7,  0x1b001af01ae01ad,  0x1b501b401b301b2,  0x1bb01b801b701b6,  0x1bf01be01bc029c,  0x1c601c401c301c2,  0x1cc01ca01c801c7,  0x1d001ceffff01cd,  0x1d601d501d401d2,  0x1dc01da024801d8,  0xffff029401df01de,  0x1e6027801e201e0,  0x1eb01ea01e901e8,  0x1f001ee01ed01ec,  0xffffffff01f201f1,  0x1f801f601f501f4,  0x1fe01fc01fa01f9,  0x2020201020001ff,  0xffffffff02050204,  0x24affff02070206,  0xffffffffffffffff,  0x211020d020c020b,  0x218021702130212,  0x21c021b021a0219,  0x220021f021e021d,  0x224022302220221,  0x228022702260225,  0x22b022a01cf0229,  0x2310230022f022e,  0x235023402330232,  0x239023802370236,  0x23d023c023b023a,  0x24502440243023e,  0x24b024902470246,  0x2510250024d024c,  0x255025402530252,  0x259025802570256,  0x25d025c025b025a,  0x263026202610260,  0x267026602650264,  0x26b026a02690268,  0x26f026e026d026c,  0x273027202710270,  0x277027602750274,  0x27b027affff0279,  0x27f027e027d027c,  0x285028402810280,  0x289028802870286,  0x28d028c028b028a,  0xffffffffffffffff,  0x2920290ffffffff,  0x2ec029602950293,  0x29d0299029804b3,  0x2a302a202a0029e,  0x2a702a602a502a4,  0x2ad02ac02a902a8,  0x1bd02ca0497049b,  0x1cb01c9ffff01c5,  0x1d3ffff01d1ffff,  0xffffffffffffffff,  0x1d9ffffffff01d7,  0xffff0643079affff,  0x559ffff01db01dd,  0x1e1ffffffffffff,  0xffff01e302c6ffff,  0xffffffff01e7ffff,  0xffffffffffffffff,  0xffffffff02b4ffff,  0x1f3ffffffff01ef,  0xffffffffffffffff,  0x1fd01fb029f01f7,  0xffffffffffff02a1,  0xffff0203ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff08e4ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x347034603450344,  0x34b034affffffff,  0x406ffffffffffff,  0xffffffff040a0408,  0xffffffffffffffff,  0xffff0350ffffffff,  0xffff035803560354,  0x35e035cffff035a,  0x36803c203630902,  0x371036f03fd036a,  0x37e03f308e503f9,  0x387038503830471,  0x3b5ffff03f603cc,  0x39903c903940392,  0x3a203a00762039b,  0x359035703550351,  0x36903c303640915,  0x372037003fe036b,  0x37f03f408e603fa,  0x388038603840472,  0x3b703b603f703cd,  0x39a03ca03950393,  0x3a303a10763039c,  0x3c0035f035d035b,  0xffffffff03fb03c4,  0x3c103ce03cbffff,  0x3d403d303d003cf,  0x3d803d703d603d5,  0x3de03dd03da03d9,  0x3e403e303e003df,  0x3ec03eb03e803e7,  0x3f203f103ee03ed,  0xffff040203f803f5,  0x400ffff03ff03fc,  0x405040404030401,  0x40b04090407ffff,  0x4120410040e040c,  0x41a041804160414,  0x4220420041e041c,  0x42a042804260424,  0x4320430042e042c,  0x43a043804360434,  0x4420440043e043c,  0x44a044804460444,  0x4520450044e044c,  0x45a045804560454,  0x4620460045e045c,  0x46a046804660464,  0x4330431042f042d,  0x43b043904370435,  0x4430441043f043d,  0x44b044904470445,  0x4530451044f044d,  0x45b045904570455,  0x4630461045f045d,  0x46b046904670465,  0x4130411040f040d,  0x41b041904170415,  0x4230421041f041d,  0x42b042904270425,  0x484048304820481,  0x48a048904880487,  0x4920491048e048d,  0x49a049904960495,  0x4a204a1049e049d,  0x4a804a704a404a3,  0x4ac04ab04aa04a9,  0x4b204b104ae04ad,  0xffffffff04b604b5,  0xffffffffffffffff,  0x4c604c5ffffffff,  0x4cc04cb04c804c7,  0x4d004cf04ce04cd,  0x4d804d704d404d3,  0x4de04dd04da04d9,  0x4e404e304e204e1,  0x4ea04e904e804e7,  0x4f004ef04ec04eb,  0x4f604f504f204f1,  0x4fe04fd04fa04f9,  0x5040503050004ff,  0x508050705060505,  0x510050f050c050b,  0x518051705140513,  0x521051e051d051b,  0x529052605250522,  0x531052e052d052a,  0x51c053605350532,  0x53e053d053c053b,  0x54405430540053f,  0x54a054905480547,  0x550054f054e054d,  0x556055505520551,  0x55c055b05580557,  0x560055f055e055d,  0x568056705640563,  0x56e056d056a0569,  0x57205710570056f,  0x578057705740573,  0x57c057b057a0579,  0x5820581057e057d,  0x588058705840583,  0x58c058b058a0589,  0x5920591058e058d,  0x598059705940593,  0x59c059b059a0599,  0x5a205a1059e059d,  0x5aa05a905a605a5,  0x5ae05ad05ac05ab,  0x5b405b305b005af,  0xffffffffffffffff,  0xffffffffffffffff,  0x5bd05bb05b9ffff,  0x5c505c305c105bf,  0x5cd05cb05c905c7,  0x5d505d305d105cf,  0x5dd05db05d905d7,  0x5e505e305e105df,  0x5ed05eb05e905e7,  0x5f505f305f105ef,  0x5fd05fb05f905f7,  0xffff0603060105ff,  0xffffffffffffffff,  0xffffffffffffffff,  0x5be05bc05baffff,  0x5c605c405c205c0,  0x5ce05cc05ca05c8,  0x5d605d405d205d0,  0x5de05dc05da05d8,  0x5e605e405e205e0,  0x5ee05ec05ea05e8,  0x5f605f405f205f0,  0x5fe05fc05fa05f8,  0x613060406020600,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x8c008a00880086,  0x9400920090008e,  0x9c009a00980096,  0xa400a200a0009e,  0xac00aa00a800a6,  0xb400b200b000ae,  0xbc00ba00b800b6,  0xc400c200c000be,  0x4d100ca04bf04b7,  0x4f7ffff04e500ce,  0xffffffffffffffff,  0xffffffff0539ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff083affff,  0xffffffff0485ffff,  0x648064706460645,  0x64e064d064a0649,  0x654065306520651,  0x65a065906580657,  0x660065f065c065b,  0x666066506620661,  0x66a066906680667,  0x670066f066c066b,  0x674067306720671,  0x678067706760675,  0x67e067d067a0679,  0x68206810680067f,  0x686068506840683,  0x68c068b06880687,  0x690068f068e068d,  0x694069306920691,  0x69a069906960695,  0x69e069d069c069b,  0x6a606a506a206a1,  0x6ac06ab06a806a7,  0x6b006af06ae06ad,  0x6b406b306b206b1,  0x6ba06b906b606b5,  0x6be06bd06bc06bb,  0x6c306c2070d070c,  0x6cb06ca06c706c6,  0x6cf06ce06cd06cc,  0x6d306d206d106d0,  0x6d906d806d506d4,  0x6dd06dc06db06da,  0x6e306e206e106e0,  0x6e906e806e506e4,  0x6ed06ec06eb06ea,  0x6f106f006ef06ee,  0x6f706f606f306f2,  0x6fb06fa06f906f8,  0x6ff06fe06fd06fc,  0x704070207010700,  0x70e070a07080706,  0xffff0710ffffffff,  0x715071407130712,  0x71b071a07170716,  0x71f071e071d071c,  0x723072207210720,  0x729072807270726,  0x72f072e072d072c,  0x733073207310730,  0x737073607350734,  0x73d073c073b073a,  0x743074207410740,  0x747074607450744,  0x74b074a07490748,  0x74f074e074d074c,  0x753075207510750,  0x757075607550754,  0x75b075a07590758,  0x75f075e075d075c,  0x766076507610760,  0x76a076907680767,  0x770076f076e076d,  0x774077307720771,  0x778077707760775,  0x77c077b077a0779,  0x78507840780077f,  0x78e078c078a0788,  0x796079407920790,  0x78f078d078b0789,  0x797079507930791,  0x7a207a0079e079c,  0xffffffff07a607a4,  0x7a307a1079f079d,  0xffffffff07a707a5,  0x7bc07ba07b807b6,  0x7c407c207c007be,  0x7bd07bb07b907b7,  0x7c507c307c107bf,  0x7dc07da07d807d6,  0x7e407e207e007de,  0x7dd07db07d907d7,  0x7e507e307e107df,  0x7f407f207f007ee,  0xffffffff07f807f6,  0x7f507f307f107ef,  0xffffffff07f907f7,  0x80c07fe080807fc,  0x814080408100800,  0x80dffff0809ffff,  0x815ffff0811ffff,  0x828082608240822,  0x830082e082c082a,  0x829082708250823,  0x831082f082d082b,  0x8f708f508df08dd,  0x90f090d08fb08f9,  0x924092209370935,  0xffffffff093b0939,  0x85f085c08590856,  0x86b086808650862,  0x860085d085a0857,  0x86c086908660863,  0x88f088c08890886,  0x89b089808950892,  0x890088d088a0887,  0x89c089908960893,  0x8bf08bc08b908b6,  0x8cb08c808c508c2,  0x8c008bd08ba08b7,  0x8cc08c908c608c3,  0x8e108ce08db08d9,  0x8d708d5ffff08d3,  0x8e008de08dc08da,  0xffff08e7ffff08e2,  0x8fd08e8ffffffff,  0x8f308f1ffff08ed,  0x8fc08fa08f808f6,  0xffffffffffff08fe,  0x9030900090b0909,  0x9070905ffffffff,  0x910090e090c090a,  0xffffffffffffffff,  0x91609130920091e,  0x91c091a09260918,  0x92509230921091f,  0xffffffffffff0927,  0x93d092affffffff,  0x9330931ffff092f,  0x93c093a09380936,  0xffffffffffff093e,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0764ffffffff,  0x1500783ffffffff,  0xffffffffffffffff,  0xffff0561ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0562ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x18d02c2018902b0,  0x195005e019102d6,  0x19d006c01990064,  0x1a5007e01a10076,  0x18e02c3018a02b1,  0x196005f019202d7,  0x19e006d019a0065,  0x1a6007f01a20077,  0x1c0ffffffffffff,  0xffffffffffff01c1,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x5090475ffffffff,  0x511047d050d0477,  0x51904a50515048f,  0x2051f02e80940,  0x6e052707180523,  0x110052f03a4052b,  0x54b053706630533,  0x50e0478050a0476,  0x51604900512047e,  0x2e90941051a04a6,  0x719052400030520,  0x3a5052c006f0528,  0x664053401110530,  0xffffffff054c0538,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xa000800040000,  0x160010000e000c,  0x2ce001c001a0018,  0x56030802e602dc,  0x66006200600058,  0x7800740070006a,  0x2aa00820080007c,  0x64b008400060832,  0x60d060902b805b5,  0x10801060629061d,  0x11c01160112010a,  0xffff0134012c0124,  0xb000900050001,  0x170011000f000d,  0x2cf001d001b0019,  0x57030902e702dd,  0x67006300610059,  0x7900750071006b,  0x2ab00830081007d,  0x64c008500070833,  0x60e060a02b905b6,  0x1090107062a061e,  0x11d01170113010b,  0xffff0135012d0125,  0x486055a04f404f3,  0x48b0297029102b5,  0x49302bb02ba048c,  0x49c02c704980494,  0x2cd02ccffff02cb,  0xffff02d502d4ffff,  0xffffffffffffffff,  0x4b402edffffffff,  0x4ba04b902f902f8,  0x4be04bd04bc04bb,  0x325032404c204c1,  0x3350334032b032a,  0x3410340033d033c,  0x34f034e034d034c,  0x73f073e03230322,  0x3b003af03ae03ad,  0x3bf03be03b403b3,  0x3e203e103d203d1,  0x606060505a405a3,  0x6320631061a0619,  0x6a0069f06560655,  0x7390738046f046e,  0x7d507d4077e077d,  0x6df06de08350834,  0x15001406a406a3,  0x4ee04ed005d005c,  0x612061105020501,  0x542054101aa01a9,  0x566056505540553,  0x586058505760575,  0x5a805a705960595,  0x162016105b805b7,  0x3ea03e903a703a6,  0xffffffffffffffff,  0x60fffffffffffff,  0xffff061806170610,  0x6240623ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x8d008b00890087,  0x9500930091008f,  0x9d009b00990097,  0xa500a300a1009f,  0xad00ab00a900a7,  0xb500b300b100af,  0xbd00bb00b900b7,  0xc500c300c100bf,  0x4d200cb04c004b8,  0x4f8ffff04e600cf,  0xffffffffffffffff,  0xffffffff053affff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x616061502d902d8,  0x6220621061c061b,  0x1e501e406280627,  0x6340633062e062d,  0x63e063d06380637,  0x32f032e06420641,  0x66e066d065e065d,  0x68a0689067c067b,  0x6aa06a906980697,  0x6c906c806b806b7,  0x6e706e606d706d6,  0xffffffff06f506f4,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x69006807870786,  0x7b107b0028f028e,  0x3bd03bc07c907c8,  0x8030802001f001e,  0x2b302b208190818,  0x2d302d208370836,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7ab07aaffffffff,  0x7b307b207af07ae,  0x2f502f402eb02ea,  0x311031003070306,  0x7cb07caffffffff,  0x7d307d207cf07ce,  0x33b033a03330332,  0x3490348033f033e,  0x7e907e807e707e6,  0x7ed07ec07eb07ea,  0x3b203b103ac03ab,  0x7fb07fa03bb03ba,  0x3f003ef03dc03db,  0x28302820620061f,  0x80b080a08070806,  0x8130812080f080e,  0x81b081a08170816,  0x8210820081f081e,  0x4b004af04a0049f,  0x4d604d504c404c3,  0xffffffffffffffff,  0xffffffffffffffff,  0x83805460545ffff,  0x83d083c083b0839,  0x590058f0580057f,  0x5b205b105a0059f,  0x63bffffffffffff,  0xffffffff079b063c,  0x60c060b06080607,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x630062f062c062b,  0x63a063906360635,  0xffff06440640063f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2fc02fa025e02f6,  0xffff0304030302fe,  0xffffffffffffffff,  0xffffffffffffffff,  0x30cffffffffffff,  0x314031202c0030e,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7ac02da07a8ffff,  0x7b402e402e202e0,  0x144076b02f00724,  0x318081c030a0479,  0x7cc031c031a07c6,  0x32c022c07d00320,  0xffff046c0336007a,  0xffffffffffffffff,  0x7ad02db07a9ffff,  0x7b502e502e302e1,  0x145076c02f10725,  0x319081d030b047a,  0x7cd031d031b07c7,  0x32d022d07d10321,  0xffff046d0337007b,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x72005a09280012,  0x114010c03520338,  0x2f202ae02bc0625,  0x10e064f031608ef,  0x4fb029a02ee02b6,  0x2de02d002c802be,  0x330031e047f0798,  0x3b802c4024e0342,  0x473056b047b03e5,  0x91104df072a06c4,  0x73005b09290013,  0x115010d03530339,  0x2f302af02bd0626,  0x10f0650031708f0,  0x4fc029b02ef02b7,  0x2df02d102c902bf,  0x331031f04800799,  0x3b902c5024f0343,  0x474056c047c03e6,  0x91204e0072b06c5,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++//4000 bytes
++enum alphaTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0xb0], [ 0x100,  0x240,  0x5100], [ 0x706050403020100,  0xe0d0c0a0b0a0908,  0x100a0f0303030303,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x7000600050004,  0xb000a00090008,  0xf000e000d000c,  0x12001100010010,  0x15001400010013,  0x19001800170016,  0x1c0001001b001a,  0x1f001f001e001d,  0x1f001f001f0020,  0x1f001f001f001f,  0x1f002300220021,  0x1f001f00250024,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100260001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x27000100010001,  0x1000100010001,  0x2a002900010028,  0x2e002d002c002b,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x2f000100010001,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x3100300001001f,  0x34003300320001,  0x38003700360035,  0x1f001f001f0039,  0x3d003c003b003a,  0x1f001f001f003e,  0x1f001f0040003f,  0x1f0041001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x42000100010001,  0x1f001f001f0043,  0x1f001f001f001f,  0x1f001f001f001f,  0x1000100010001,  0x1f001f001f0044,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f004500010001,  0x46001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f0047,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x4b004a00490048,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f004c001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1000100010001,  0x1004d00010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x4e000100010001,  0x1f001f001f004f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f004f00010001,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x1f001f001f001f,  0x0,  0x7fffffe07fffffe,  0x420040000000000,  0xff7fffffff7fffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x501f0003ffc3,  0x0,  0x3cdf000000000020,  0xfffffffbffffd740,  0xffbfffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffffffffc03,  0xffffffffffffffff,  0xfffe00ffffffffff,  0xfffffffe027fffff,  0xbfff0000000000ff,  0x707ffffff00b6,  0xffffffff07ff0000,  0xffffc000feffffff,  0xffffffffffffffff,  0x9c00e1fe1fefffff,  0xffffffffffff0000,  0xffffffffffffe000,  0x3ffffffffffff,  0x43007fffffffc00,  0x1ffffcffffff,  0x1ffffff,  0x1ffd00000000,  0x7fff03f000000000,  0xefffffffffffffff,  0xfefe000fffe1dfff,  0xe3c5fdfffff99fee,  0x3000fb080599f,  0xc36dfdfffff987ee,  0x3f00005e021987,  0xe3edfdfffffbbfee,  0xf00011bbf,  0xe3edfdfffff99fee,  0x2000fb0c0199f,  0xc3ffc718d63dc7ec,  0x811dc7,  0xe3effdfffffddfee,  0xf03601ddf,  0xe3effdfffffddfec,  0x6000f40601ddf,  0xe7fffffffffddfec,  0xfc00000f00805ddf,  0x2ffbfffffc7fffec,  0xc0000ff5f807f,  0x7fffffffffffffe,  0x207f,  0x3bffecaefef02596,  0xf000205f,  0x1,  0xfffe1ffffffffeff,  0x1ffffffffeffff03,  0x0,  0xf97fffffffffffff,  0xffffc1e7ffff0000,  0xffffffff3000407f,  0xf7ffffffffff20bf,  0xffffffffffffffff,  0xffffffff3d7f3dff,  0x7f3dffffffff3dff,  0xffffffffff7fff3d,  0xffffffffff3dffff,  0x87ffffff,  0xffffffff0000ffff,  0x1fffffffffffff,  0xfffffffffffffffe,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff9fffffffffff,  0xffffffff07fffffe,  0x1c7ffffffffff,  0xfffff000fdfff,  0xddfff000fffff,  0xffcfffffffffffff,  0x108001ff,  0xffffffff00000000,  0xffffffffffffff,  0xffff07ffffffffff,  0x3fffffffffffff,  0x1ff0fff1fffffff,  0x1f3fffffff0000,  0xffff0fffffffffff,  0x3ff,  0xffffffff0fffffff,  0x1ffffe7fffffff,  0x8000000000,  0x0,  0xffefffffffffffff,  0xfef,  0xfc00f3ffffffffff,  0x3ffbfffffffff,  0x3fffffffffffff,  0x3ffffffffc00e000,  0x0,  0x6fde0000000000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x0,  0xffffffff3f3fffff,  0x3fffffffaaff3f3f,  0x5fdfffffffffffff,  0x1fdc1fff0fcf1fdc,  0x0,  0x8002000000000000,  0x1fff0000,  0x0,  0xf3ffbd503e2ffc84,  0xffffffff000043e0,  0x1ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffc0000000000000,  0x3ffffffffff,  0xffff7fffffffffff,  0xffffffff7fffffff,  0xffffffffffffffff,  0xc781fffffffff,  0xffff20bfffffffff,  0x80ffffffffff,  0x7f7f7f7f007fffff,  0xffffffff7f7f7f7f,  0x800000000000,  0x0,  0x0,  0x0,  0x1f3e03fe000000e0,  0xfffffffffffffffe,  0xfffffffee07fffff,  0xf7ffffffffffffff,  0xfffe3fffffffffe0,  0xffffffffffffffff,  0x7ffffff00007fff,  0xffff000000000000,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffffffffff,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1fff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1fff,  0x3fffffffffff0000,  0xc00ffff1fff,  0x8ff07fffffffffff,  0xffffffff80ffffff,  0xffffffffffff,  0xfffffffcff800000,  0xffffffffffffffff,  0x7ff000f79ff,  0xff00000000000000,  0xfffffff7bb,  0xfffffffffffff,  0xffffffffffffffff,  0x8fc00000000000f,  0xffff07fffffffc00,  0x1fffffff0007ffff,  0xfff7ffffffffffff,  0x8000,  0x7fffffffffffff,  0x47fffff00003fff,  0x7fffffffffffffff,  0x3cffff38000005,  0x7f7f007e7e7e,  0x0,  0x0,  0x7ffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff000fffffffff,  0xffffffffffff87f,  0xffffffffffffffff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7ffdffe0f8007f,  0xffffffffffffffdb,  0x3ffffffffffff,  0xfffffffffff80000,  0x3fffffffffffffff,  0xffffffffffff0000,  0xfffffffffffcffff,  0xfff0000000000ff,  0x0,  0xffdf000000000000,  0xffffffffffffffff,  0x1fffffffffffffff,  0x7fffffe00000000,  0xffffffc007fffffe,  0x7fffffffffffffff,  0x1cfcfcfc,  0xb7ffff7fffffefff,  0x3fff3fff,  0xffffffffffffffff,  0x7ffffffffffffff,  0x0,  0x1fffffffffffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff1fffffff,  0x1ffff,  0xffff00007fffffff,  0x7ff,  0xffffffff3fffffff,  0x3eff0f,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffff,  0x0,  0x91bffffffffffd3f,  0x3fffff,  0x0,  0x0,  0x3ffffff003fffff,  0x0,  0xc0ffffffffffffff,  0x0,  0xffffffeeff06f,  0x1fffffff00000000,  0x0,  0x0,  0x3fffffffffffff,  0x7ffff003fffff,  0x0,  0x0,  0xffffffffffffffff,  0x1ff,  0x0,  0x0,  0xffffffffffffffff,  0x3f,  0x1fffffffffffffc,  0x1ffffff0000,  0x7ffffffffffff,  0x0,  0xffffffffffffffff,  0x1e,  0x0,  0x0,  0x3fffffffffffff,  0x0,  0xffffffffffffffff,  0x7fffffffffff,  0x0,  0x0,  0xffffffffffffffff,  0x7ffffffff,  0x0,  0x0,  0x7fffffffffff,  0x0,  0x0,  0x0,  0x1ffffffffffffff,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0x7fffffffffff001f,  0xfff80000,  0x0,  0x3,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffdfffff,  0xebffde64dfffffff,  0xffffffffffffffef,  0x7bffffffdfdfe7bf,  0xfffffffffffdfc5f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffff3fffffffff,  0xf7fffffff7fffffd,  0xffdfffffffdfffff,  0xffff7fffffff7fff,  0xfffffdfffffffdff,  0xff7,  0xaf7fe96ffffffef,  0x5ef7f796aa96ea84,  0xffffbee0ffffbff,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7fffff,  0x1fffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2304 bytes
++enum markTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x70], [ 0x100,  0x140,  0x2c00], [ 0x402030202020100,  0x207020206020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020208,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1000000000000,  0x5000400030002,  0x9000800070006,  0xd000c000b000a,  0xf00000000000e,  0x10000000000000,  0x14001300120011,  0x160015,  0x17,  0x0,  0x0,  0x190018,  0x1a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b00000000,  0x1f001e001d001c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000000000000,  0x2100000000,  0x220000,  0x0,  0x2300000000,  0x0,  0x250024,  0x2600000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x27000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2900280000,  0x0,  0x0,  0x0,  0x2a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffff,  0x0,  0x0,  0x0,  0x0,  0x3f8,  0x0,  0x0,  0x0,  0xbffffffffffe0000,  0xb6,  0x7ff0000,  0x10000fffff800,  0x0,  0x3d9f9fc00000,  0xffff000000020000,  0x7ff,  0x1ffc000000000,  0xff80000000000,  0x3eeffbc00000,  0xe000000,  0x0,  0x7ffffff000000000,  0xdc0000000000000f,  0xc00feffff,  0xd00000000000000e,  0xc0080399f,  0xd00000000000000e,  0x23000000023987,  0xd00000000000000e,  0xc00003bbf,  0xd00000000000000e,  0xc00c0399f,  0xc000000000000004,  0x803dc7,  0xc00000000000000e,  0xc00603ddf,  0xd00000000000000c,  0xc00603ddf,  0xc00000000000000c,  0xc00803ddf,  0xc,  0xc0000ff5f8400,  0x7f2000000000000,  0x7f80,  0x1bf2000000000000,  0x3f00,  0xc2a0000003000000,  0xfffe000000000000,  0x1ffffffffeffe0df,  0x40,  0x7ffff80000000000,  0x1e3f9dc3c00000,  0x3c00bffc,  0x0,  0x0,  0xe0000000,  0x0,  0x0,  0x1c0000001c0000,  0xc0000000c0000,  0xfff0000000000000,  0x200fffff,  0x3800,  0x0,  0x20000000000,  0x0,  0xfff0fff00000000,  0x0,  0xffff000000000000,  0x301,  0xf800000,  0x9fffffff7fe00000,  0x0,  0x0,  0xfff000000000001f,  0xff8000000001f,  0x3ffe00000007,  0xfffc000000000,  0xfffff000000000,  0x0,  0x0,  0x1c21fffff70000,  0x0,  0x0,  0x0,  0xf000007fffffffff,  0x0,  0x0,  0x0,  0x1ffffffff0000,  0x0,  0x0,  0x0,  0x3800000000000,  0x0,  0x8000000000000000,  0x0,  0xffffffff00000000,  0xfc0000000000,  0x0,  0x6000000,  0x0,  0x0,  0x3ff7800000000000,  0x80000000,  0x3000000000000,  0xf800000844,  0x0,  0xfff0000000000003,  0x3ffff0000001f,  0x3fc000000000,  0xfff80,  0xfff800000000000f,  0x1,  0x7ffe0000000000,  0x800000000003008,  0xc19d000000000000,  0x60f80000000002,  0x0,  0x0,  0x0,  0x37f800000000,  0x40000000,  0x0,  0x0,  0x0,  0x7f0000ffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2000000000000000,  0x870000000000f06e,  0x0,  0x0,  0x0,  0xff00000000000007,  0x7f,  0x7ff000000000007,  0x0,  0x1fff8000000007,  0x0,  0xfff8000000000007,  0x1,  0x0,  0x0,  0xfff80000000000,  0x0,  0x0,  0x7ffffffffffe0000,  0x78000,  0x0,  0x0,  0xf807e3e000000000,  0x3c0000000fe7,  0x0,  0x0,  0x1c,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff,  0x0,  0x0,  0x0,  0x0]);
++//2384 bytes
++enum numberTrieEntries = TrieEntry!(bool, 8, 6, 7)([ 0x0,  0x20,  0xc0], [ 0x100,  0x280,  0x1a80], [ 0x402030202020100,  0x807020202020605,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2000200010000,  0x2000200020002,  0x2000200020002,  0x5000200040003,  0x7000600020002,  0x9000800060006,  0x2000b0006000a,  0x2000d000c000c,  0x20002000e0005,  0x2000f00020002,  0x2000200020002,  0x11000200100002,  0x1300120002000e,  0xc00140002,  0x2000200020015,  0x2000200020002,  0x19001800170016,  0x2000200020002,  0x20002001b001a,  0x1d001c00020002,  0x2000200020002,  0x2000200020002,  0x20002001e0002,  0x2000200020002,  0x2000020002001f,  0x2000200220021,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200060023,  0xc0017000c0024,  0x400020002000c,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000e00020002,  0x26002500020002,  0x28002700020002,  0x2000200230002,  0x2000200020002,  0x2002a00020029,  0x2002c0002002b,  0x2000200020002,  0x200020002002d,  0xc002f0004002e,  0x2000200020002,  0x2000200020002,  0x2000200050002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020030,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2003100020002,  0x2000200020002,  0x32000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2003300020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x2000200020002,  0x3ff000000000000,  0x0,  0x720c000000000000,  0x0,  0x0,  0x0,  0x0,  0x3ff00000000,  0x0,  0x3ff000000000000,  0x0,  0x3ff,  0x0,  0xffc000000000,  0x0,  0x3f0ffc000000000,  0x0,  0xfcffc000000000,  0x0,  0x7ffc000000000,  0x0,  0x7f00ffc000000000,  0x0,  0x3fffc000000000,  0x0,  0x3ff0000,  0xfffff00000000,  0x0,  0x3ff0000,  0x0,  0x0,  0x1ffffe0000000000,  0x0,  0x1c00000000000,  0x0,  0x3ff03ff00000000,  0x0,  0xffc0,  0x0,  0x7ff0000,  0x3ff03ff,  0x0,  0x0,  0x3ff03ff,  0x0,  0x3f1000000000000,  0x3ff,  0x0,  0x0,  0xffffffffffff0000,  0x3e7,  0x0,  0x0,  0xffffffff00000000,  0xfffffff,  0xfffffc0000000000,  0x0,  0xffc0000000000000,  0xfffff,  0x0,  0x0,  0x2000000000000000,  0x70003fe00000080,  0x0,  0x3c0000,  0x0,  0x3ff00000000,  0xfffeff00,  0xfffe0000000003ff,  0x0,  0x3ff00000000,  0x0,  0x3f000000000000,  0x0,  0xfffffffffff80,  0x1ffffffffffffff,  0x400,  0x0,  0xf00000000,  0x402,  0x0,  0x3e0000,  0x0,  0xff000000,  0xfc00000,  0x0,  0x0,  0x60000000000000ff,  0x0,  0xff000000ff000000,  0x0,  0x7fffffff00000000,  0x0,  0xfffffffc0000,  0xffc0000000000000,  0x0,  0xffffffffffffffff,  0x7ffffffff,  0x0,  0x3ffff00000000,  0x0,  0xffffffffffffc000,  0x7ff,  0x0,  0x0,  0x0]);
++//2336 bytes
++enum punctuationTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x60], [ 0x100,  0x100,  0x3100], [ 0x402030202020100,  0x202020202020605,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2000100010000,  0x5000400030001,  0x1000800070006,  0xb000a00090001,  0xd00010001000c,  0x10000f0001000e,  0x14001300120011,  0x1000100010015,  0x17000100010016,  0x18000100010001,  0x1000100190001,  0x1001c001b001a,  0x100010001001d,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1001f0001001e,  0x23002200210020,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x26002500240001,  0x28000100270001,  0x1000100010001,  0x2c002b002a0029,  0x1000100010001,  0x10001002e002d,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x100010001002f,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x8c00f7ee00000000,  0x28000000b8000001,  0x88c0088200000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x4000000000000000,  0x80,  0x0,  0x0,  0xfc000000,  0x4000000000000600,  0x18000000000049,  0xc8003600,  0x3c0000000000,  0x0,  0x100000,  0x3fff,  0x0,  0x0,  0x380000000000000,  0x7fff000000000000,  0x40000000,  0x0,  0x0,  0x0,  0x1003000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1000000000000,  0x0,  0x0,  0x0,  0x10000000000000,  0x0,  0xc008000,  0x0,  0x0,  0x3c0000000017fff0,  0x0,  0x20,  0x61f0000,  0x0,  0xfc00,  0x0,  0x800000000000000,  0x0,  0x1ff00000000,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0x0,  0x600000000000,  0x18000000,  0x380000000000,  0x60000000000000,  0x0,  0x0,  0x7700000,  0x7ff,  0x0,  0x0,  0x0,  0x0,  0x30,  0x0,  0x0,  0xc0000000,  0x0,  0x3f7f00000000,  0x0,  0x0,  0x1fc000000,  0x0,  0xf000000000000000,  0xf800000000000000,  0xc000000000000000,  0x0,  0x800ff,  0xffff00ffffff0000,  0x600000007ffbffef,  0x6000,  0x0,  0x60000000f00,  0x0,  0x0,  0x0,  0x0,  0x3fff0000000000,  0x0,  0xffc000000060,  0x0,  0x0,  0x1fffff8,  0x300000000f000000,  0x0,  0x0,  0x0,  0xde00000000000000,  0x0,  0x1000000000000,  0x0,  0x0,  0xfff7fffffffffff,  0x0,  0x0,  0x0,  0x20010000fff3ff0e,  0x0,  0x100000000,  0x800000000000000,  0x0,  0x0,  0x0,  0xc000000000000000,  0xe000,  0x4008000000000000,  0x0,  0xfc000000000000,  0x0,  0xf0000000000000,  0x0,  0x70000000000c000,  0xc00000000000,  0x80000000,  0x0,  0xc0003ffe,  0x0,  0xf0000000,  0x0,  0x30000c0000000,  0x0,  0x0,  0x0,  0x80000000000,  0xc000000000000000,  0x0,  0x0,  0x0,  0xffff000003ff0000,  0xd0bfff7ffff,  0x0,  0x0,  0xb80000018c00f7ee,  0x3fa8000000,  0x0,  0x0,  0x7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x10000,  0x0,  0x800000,  0x0,  0x0,  0x8000000080000000,  0x0,  0x0,  0x0,  0x0,  0x8000000001ff0000,  0x0,  0x0,  0xfe00000000000000,  0x0,  0x0,  0x0,  0x0,  0x3f80,  0xd800000000000000,  0x3,  0x0,  0xf,  0x0,  0x1e0,  0x0,  0xf000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2848 bytes
++enum symbolTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0x70], [ 0x100,  0x140,  0x3d00], [ 0x503040303020100,  0x807030303030306,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x303030303030303,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x7000600050004,  0xa000900080001,  0xe000d000c000b,  0x1000010001000f,  0x11000100010001,  0x13000100120001,  0x14000100010001,  0x18001700160015,  0x1a001700170019,  0x1c0017001b0017,  0x1f001e0001001d,  0x17002200210020,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100230001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x25000100010024,  0x1002700010026,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x28000100010001,  0x2b002a00290001,  0x10001002c0001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x30002f002e002d,  0x32003100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1003300010001,  0x37003600350034,  0x3b003a00390038,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x7000081000000000,  0x5000000140000000,  0x113d37c00000000,  0x80000000800000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffafe0fffc003c,  0x0,  0x20000000000000,  0x30,  0x40000000000000,  0x0,  0x0,  0x4,  0x0,  0x0,  0x0,  0x8000,  0x0,  0xc9c0,  0x0,  0x0,  0x6000020040000000,  0x0,  0x0,  0x0,  0x40000000000000,  0x0,  0x0,  0x0,  0xc0c000000000000,  0x0,  0x0,  0x0,  0x2000000000000,  0x0,  0x1000000000000,  0x0,  0x7f8000000000000,  0x0,  0x8000000000000000,  0x0,  0x0,  0x0,  0x200000000000000,  0x0,  0x0,  0x8000000000000000,  0x0,  0x0,  0x0,  0x1500000fce8000e,  0x0,  0xc000000000000000,  0x1e0dfbf,  0x0,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x3ff0000,  0x0,  0x0,  0x0,  0x0,  0x8000000,  0x0,  0x1,  0x0,  0xffffffffc0000000,  0x0,  0x1ff007fe00000000,  0x0,  0x0,  0x0,  0x0,  0xa000000000000000,  0x6000e000e000e003,  0x0,  0x1c00000000040010,  0x7ffffff00001c00,  0x0,  0xc0042afc1d0037b,  0xbc1f,  0xffffffffffff0000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffff9fffffff0ff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffffffff,  0x7fffffffff,  0x7ff,  0xfffffffff0000000,  0x3ffffffffff,  0xfffffffffffffffe,  0xffffffffff,  0xfffffffffff00000,  0xffff003fffffff9f,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffffe000007,  0xcffffffff0ffffff,  0xffffffffffffffff,  0x3ff1fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7e000000000,  0x0,  0x0,  0xfffffffffbffffff,  0xfffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfff0000003fffff,  0xc0c00001000c0010,  0x0,  0x18000000,  0x0,  0x0,  0x0,  0xffc30000,  0xfffffffff,  0xfffffc007fffffff,  0xffffffff000100ff,  0x1fffffffffc00,  0x7fffffffffffffff,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0x0,  0x0,  0xffffffffffff0000,  0x7f,  0x3007fffff,  0x0,  0x600,  0x0,  0x3c00f0000000000,  0x0,  0x0,  0x0,  0x0,  0x380000000000000,  0x0,  0x0,  0x20000000000,  0x0,  0xfffc000000000000,  0x3,  0x0,  0x0,  0x0,  0x3000000000000000,  0x0,  0x27400000000,  0x0,  0x0,  0x4000000070000810,  0x50000001,  0x0,  0x30007f7f00000000,  0xff80000000000000,  0xfe00000000000000,  0xfff03ff,  0x1fffffffffff0000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffffffffff,  0xfffffe7fffffffff,  0x1c1fffffffff,  0xffffc3fffffff018,  0x3fffffff,  0xffffffffffffffff,  0x23,  0x0,  0x0,  0xffffffffffffffff,  0x7fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x800000008000002,  0x20000000200000,  0x800000008000,  0x20000000200,  0x8,  0x0,  0x0,  0x0,  0x3000000000000,  0xffff0fffffffffff,  0xffffffffffffffff,  0x7ffe7fff000fffff,  0xfffefffe,  0xffff7fffffff0000,  0xffff0fffffffffff,  0x7ffffff,  0xffffffc000000000,  0x7ffffffffff0007,  0x301ff,  0x0,  0x0,  0xffbf0001ffffffff,  0x1fffffffffffffff,  0xffffffff000fffff,  0x1ffff000007df,  0x7fffffffffffffff,  0xfffffffffffffffd,  0xffffffffffffffff,  0x1effffffffffffff,  0x3fffffffffffffff,  0xffffff000f,  0x0,  0xf800000000000000,  0xffffffffffffffff,  0xffe1,  0xffffffffffffffff,  0x3f,  0xffffffffffffffff,  0xfffffffffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//4576 bytes
++enum graphicalTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x20,  0xb8], [ 0x100,  0x260,  0x6100], [ 0x706050403020100,  0xe0d0c0a0b0a0908,  0x100a0f0303030303,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a11,  0xa0a0a0a0a0a0a0a,  0xa0a0a0a0a0a0a0a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2000100010000,  0x5000400030001,  0x9000800070006,  0xd000c000b000a,  0x10000f0001000e,  0x12001100010001,  0x16001500140013,  0x19000100180017,  0x1c0001001b001a,  0x1e00010001001d,  0x1f000100010001,  0x23002200210020,  0x1002600250024,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100270001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x28000100010001,  0x1000100010001,  0x2b002a00010029,  0x2f002e002d002c,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x30000100010001,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x33003200010031,  0x36003500340001,  0x3a003900380037,  0x3100310031003b,  0x3f003e003d003c,  0x31004100310040,  0x31003100430042,  0x31004400310031,  0x31003100310031,  0x31003100310031,  0x45000100010001,  0x31003100310046,  0x31003100310031,  0x31003100310031,  0x1000100010001,  0x31003100310047,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31004800010001,  0x49003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x3100310031004a,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x4e004d004c004b,  0x5200510050004f,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31005300310031,  0x57005600550054,  0x5b005a00590058,  0x31003100310031,  0x31003100310031,  0x1000100010001,  0x1005c00010001,  0x1000100010001,  0x1000100010001,  0x1000100010001,  0x5d000100010001,  0x3100310031005e,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31005e00010001,  0x31003100310031,  0x310031005f0031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0x31003100310031,  0xffffffff00000000,  0x7fffffffffffffff,  0xffffdfff00000000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7cffffffffffffff,  0xfffffffbffffd7f0,  0xffffffffffffffff,  0xfffe00ffffffffff,  0xfffffffefe7fffff,  0xfffffffffffe86ff,  0x1f07ffffff00ff,  0xffffffffcfffffc0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffdfffffff,  0xffffffffffff3fff,  0xffffffffffffe7ff,  0x3ffffffffffff,  0x7ffffffffffffff,  0x7fff3fffffffffff,  0x4fffffff,  0x1ffd00000000,  0x7ffffff000000000,  0xffffffffffffffff,  0xfeffffffffffffff,  0xf3c5fdfffff99fee,  0xfffffcfb080799f,  0xd36dfdfffff987ee,  0x3fffc05e023987,  0xf3edfdfffffbbfee,  0x3ffcf00013bbf,  0xf3edfdfffff99fee,  0xffffcfb0c0399f,  0xc3ffc718d63dc7ec,  0x7ffffc000813dc7,  0xe3effdfffffddfee,  0xff00ffcf03603ddf,  0xf3effdfffffddfec,  0x6ffcf40603ddf,  0xe7fffffffffddfec,  0xfe3fffcf00807ddf,  0x2ffbfffffc7fffec,  0x1c0000ff5f847f,  0x87fffffffffffffe,  0xfffffff,  0x3bffecaefef02596,  0xf3ff3f5f,  0xffffffffffffffff,  0xfffe1ffffffffeff,  0xdffffffffeffffff,  0x7ffdfff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff20bf,  0xffffffffffffffff,  0xffffffff3d7f3dff,  0x7f3dffffffff3dff,  0xffffffffff7fff3d,  0xffffffffff3dffff,  0x1fffffffe7ffffff,  0xffffffff03ffffff,  0x1fffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff1fffffff,  0x1ffffffffffff,  0x7fffff001fdfff,  0xddfff000fffff,  0xffffffffffffffff,  0x3ff03ff3fffffff,  0xffffffff03ff3fff,  0xffffffffffffff,  0xffff07ffffffffff,  0x3fffffffffffff,  0xfff0fff1fffffff,  0x1f3ffffffffff1,  0xffff0fffffffffff,  0xffffffffc7ff03ff,  0xffffffffcfffffff,  0x9fffffff7fffffff,  0x3fff03ff03ff,  0x0,  0xffffffffffffffff,  0x1fffffffffff0fff,  0xffffffffffffffff,  0xf00fffffffffffff,  0xf8ffffffffffffff,  0xffffffffffffe3ff,  0x0,  0x7fffffffff00ff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xf000007fffffffff,  0xffffffff3f3fffff,  0x3fffffffaaff3f3f,  0xffdfffffffffffff,  0x7fdcffffefcfffdf,  0xffff80ffffff07ff,  0xfff30000ffffffff,  0x7ffffff1fff7fff,  0x1ffffffff0000,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff03ff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffffffff,  0x7fffffffff,  0xffffffff000007ff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfffffffffffffffe,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3ff1fff,  0x0,  0x0,  0xffff7fffffffffff,  0xffffffff7fffffff,  0xffffffffffffffff,  0xfe0fffffffffffff,  0xffff20bfffffffff,  0x800180ffffffffff,  0x7f7f7f7f007fffff,  0xffffffff7f7f7f7f,  0xfffffffffffffff,  0x0,  0xfffffffffbffffff,  0xfffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfff0000003fffff,  0xffffffffffffffff,  0xfffffffffffffffe,  0xfffffffffe7fffff,  0xffffffffffffffff,  0xfffe3fffffffffe0,  0xffffffffffffffff,  0x7ffffffffff7fff,  0xffff000fffffffff,  0xffffffff7fffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7fffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1fff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff1fff,  0xffffffffffff007f,  0xfffffffffff,  0xffffffffffffffff,  0xffffffff80ffffff,  0xffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7ff000f7fff,  0xff00000000000000,  0x3ff0fffffffffff,  0xffffffffffffff,  0xffffffffffffffff,  0xfffffff03ffc01f,  0xffffffffffffffff,  0x1fffffff800fffff,  0xffffffffffffffff,  0xc3ffbfff,  0x7fffffffffffff,  0xffffffff3ff3fff,  0xffffffffffffffff,  0x7ffffff8000007,  0x7f7f007e7e7e,  0x0,  0x0,  0x3ff3fffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff000fffffffff,  0xffffffffffff87f,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffff3fffffffffff,  0xffffffffffffffff,  0x3ffffff,  0x5f7fffffe0f8007f,  0xffffffffffffffdb,  0xffffffffffffffff,  0xfffffffffff80003,  0xffffffffffffffff,  0xffffffffffff0000,  0xfffffffffffcffff,  0x3fff0000000000ff,  0xffff007f03ffffff,  0xffdf0f7ffff7ffff,  0xffffffffffffffff,  0x1fffffffffffffff,  0xfffffffffffffffe,  0xffffffffffffffff,  0x7fffffffffffffff,  0x30007f7f1cfcfcfc,  0xb7ffff7fffffefff,  0x3fff3fff,  0xffffffffffffffff,  0x7ffffffffffffff,  0xff8fffffffffff87,  0xffffffffffffffff,  0xfff07ff,  0x3fffffffffff0000,  0x0,  0x0,  0xffffffff1fffffff,  0x1ffff,  0xffff000f7fffffff,  0x7ff,  0xffffffffbfffffff,  0x3fff0f,  0xffffffffffffffff,  0xffffffffffffffff,  0x3ff3fffffff,  0x0,  0x91bffffffffffd3f,  0xffbfffff,  0x0,  0x0,  0x83ffffff8fffffff,  0x0,  0xc0ffffffffffffff,  0x0,  0x870ffffffeeff06f,  0xffffffff01ff00ff,  0x0,  0x0,  0xfe3fffffffffffff,  0xff07ffffff3fffff,  0x0,  0x0,  0xffffffffffffffff,  0x1ff,  0x0,  0x0,  0x0,  0x7fffffff00000000,  0x0,  0x0,  0xffffffffffffffff,  0xfffffffc3fff,  0xdfffffffffffffff,  0x3ff01ffffff0003,  0xffdfffffffffffff,  0xf,  0xffffffffffffffff,  0x3ff01ff,  0x0,  0x0,  0xffffffffffffff,  0x3ff,  0xffffffffffffffff,  0x7fffffffffff,  0x0,  0x0,  0xffffffffffffffff,  0xf0007ffffffff,  0x0,  0x0,  0x7fffffffffff,  0x0,  0x0,  0x0,  0x1ffffffffffffff,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0x7fffffffffff001f,  0xffff8000,  0x0,  0x3,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffffffffff,  0xfffffe7fffffffff,  0xf807ffffffffffff,  0xffffffffffffffff,  0x3fffffff,  0xffffffffffffffff,  0x3f,  0x0,  0x0,  0xffffffffffffffff,  0x3ffff007fffff,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffdfffff,  0xebffde64dfffffff,  0xffffffffffffffef,  0x7bffffffdfdfe7bf,  0xfffffffffffdfc5f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffff3fffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffcfff,  0xaf7fe96ffffffef,  0x5ef7f796aa96ea84,  0xffffbee0ffffbff,  0x3000000000000,  0xffff0fffffffffff,  0xffffffffffffffff,  0x7ffe7fff000fffff,  0xfffefffe,  0xffff7fffffff07ff,  0xffff0fffffffffff,  0x7ffffff,  0xffffffc000000000,  0x7ffffffffff0007,  0x301ff,  0x0,  0x0,  0xffbf0001ffffffff,  0x1fffffffffffffff,  0xffffffff000fffff,  0x1ffff000007df,  0x7fffffffffffffff,  0xfffffffffffffffd,  0xffffffffffffffff,  0x1effffffffffffff,  0x3fffffffffffffff,  0xffffff000f,  0x0,  0xf800000000000000,  0xffffffffffffffff,  0xffe1,  0xffffffffffffffff,  0x3f,  0xffffffffffffffff,  0xfffffffffffff,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x7fffff,  0x1fffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fffffff,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff,  0x0,  0x0,  0x0,  0x0]);
++//3664 bytes
++enum nonCharacterTrieEntries = TrieEntry!(bool, 7, 4, 4, 6)([ 0x0,  0x10,  0x4c,  0x104], [ 0x80,  0xf0,  0x2e0,  0x3180], [ 0x706050403020100,  0xb0b0b0b0a090808,  0xb0b0b0b0b0b0b0b,  0xb0b0b0b0b0b0b0b,  0xb0b0b0b0b0b0b0b,  0xb0b0b0b0b0b0b0b,  0xb0b0b0b0b0b0b0b,  0xd0808080b0b0b0c,  0xd080808,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3000200010000,  0x7000600050004,  0xb000a00090008,  0xd000d000d000c,  0xe000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xf000d000d000d,  0xd00110010000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d0012000d,  0xd000d000d000d,  0x140013000d000d,  0x18001700160015,  0x1b001b001a0019,  0x1b001b001d001c,  0x1b001b001e000d,  0x1b001b001b001b,  0x1b001b001b001b,  0x20001f001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b0021,  0x1b001b001b001b,  0x1b001b00230022,  0x24001b001b001b,  0x1b001b00260025,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d0027000d,  0x1b00290028000d,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b002a001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b002b,  0x1b001b001b001b,  0x1b001b001b001b,  0x1b001b001b001b,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0x2c000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0xd000d000d000d,  0x2c000d000d000d,  0x0,  0x0,  0x0,  0x200010000,  0x0,  0x6000500040003,  0x7,  0xb000a00090008,  0xf000e000d000c,  0x12001100100000,  0x16001500140013,  0x1a001900180017,  0x1e001d001c001b,  0x2200210020001f,  0x26002500240023,  0x29002800270000,  0x2a000000000000,  0x0,  0x2d002c002b0000,  0x310030002f002e,  0x0,  0x0,  0x33003200000000,  0x36000000350034,  0x3a003900380037,  0x3e003d003c003b,  0x4200410040003f,  0x44000000430000,  0x47004200460045,  0x48000000000000,  0x0,  0x4c004b004a0049,  0x4f004e004d0000,  0x5000000000,  0x0,  0x51000000000000,  0x530052,  0x0,  0x0,  0x54,  0x0,  0x0,  0x0,  0x42004200550000,  0x58000000570056,  0x5c005b005a0059,  0x51005e0042005d,  0x5f000000000000,  0x6000540000,  0x63006200000061,  0x64000000000057,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3a00000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x65000000000000,  0x67006600000000,  0x0,  0x38006900000068,  0x6b006a00000000,  0x6d00000038006c,  0x6f0000006e0000,  0x72000000710070,  0x74004200420073,  0x0,  0x0,  0x0,  0x75006300000000,  0x0,  0x0,  0x77000000760000,  0x7a000000790078,  0x0,  0x7d007c007b0000,  0x800000007f007e,  0x81006400000054,  0xb000000830082,  0x86008500000084,  0x87003200420042,  0x8b008a00890088,  0x42008c00000000,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x420042008e008d,  0x4200900042008f,  0x42004200920091,  0x42004200940093,  0x42004200950000,  0x42004200420042,  0x42004200960042,  0x42004200420042,  0x98000000970000,  0x9a00000099004b,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x9b003800420042,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x0,  0x0,  0x0,  0x420042009c0000,  0x420042009d0000,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x4200420042009c,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x0,  0x0,  0x4200420042009e,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x4200a0009f0000,  0x420042004200a1,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x3a000000000000,  0xa30000000000a2,  0x42004200a40000,  0x42004200a50000,  0xa800a700a60000,  0xaa00a9,  0xab00000000,  0xac000000000000,  0x42004200420042,  0x42004200420042,  0xb000af00ae00ad,  0x42004200420042,  0xb200b10000003d,  0xb500b4003d00b3,  0x42004200b700b6,  0xbb00ba00b900b8,  0xbd000000bc0064,  0xc0004200bf00be,  0xa4000000c10000,  0x42004200510000,  0x0,  0x0,  0xc2000000000000,  0x0,  0x0,  0x0,  0x0,  0x31,  0x420042004200a3,  0x42004200420042,  0x42004200420042,  0x42004200420042,  0x0,  0x0,  0x420042004200a3,  0x42004200420042,  0x420042000000c3,  0xc4000000000000,  0x42004200420042,  0x42004200420042,  0x0,  0x0,  0x0,  0xbe000000000000,  0x0,  0x0,  0x0,  0xbe000000000000,  0x0,  0x8300000000000000,  0x40000280f,  0x1ff0000000000,  0x101800000,  0x17900,  0xffe0f8000000ff00,  0x20000020,  0x4000,  0x1800,  0xfffc000000000000,  0xf800000000000000,  0x8000c00000000000,  0xffffffffb0000000,  0xffffe002ffffffff,  0x8000000fffffffff,  0x100000000000000,  0xc3a020000066011,  0xf00000304f7f8660,  0x2c92020000067811,  0xffc0003fa1fdc678,  0xc12020000044011,  0xfffc0030fffec440,  0xc12020000066011,  0xff0000304f3fc660,  0x3c0038e729c23813,  0xf800003fff7ec238,  0x1c10020000022011,  0xff0030fc9fc220,  0xc10020000022013,  0xfff90030bf9fc220,  0x1800000000022013,  0x1c00030ff7f8220,  0xd004000003800013,  0xffe3ffff00a07b80,  0x7800000000000001,  0xfffffffff0000000,  0xc4001351010fda69,  0xffffffff0c00c0a0,  0x1e00000000100,  0x2000000001000000,  0xfffffffff8002000,  0xdf40,  0xc280c200,  0x80c200000000c200,  0x8000c2,  0xc20000,  0xe000000018000000,  0xfc000000,  0xffe0000000000000,  0xe0000000,  0xfffe000000000000,  0xff800000ffe02000,  0xfff22000fff00000,  0xfc00fc00c0000000,  0xfc008000,  0xff00000000000000,  0xf80000000000,  0xffc0000000000000,  0xf000f000e0000000,  0xffe0c0000000000e,  0xf00000000000,  0x3800fc00,  0x30000000,  0x6000000080000000,  0xffffc000fc00fc00,  0xffffffffffffffff,  0xe00000000000f000,  0xff0000000000000,  0x700000000000000,  0x1c00,  0xff8000000000ff00,  0xfffff8000000000,  0xc0c00000,  0xc00000005500c0c0,  0x20000000000000,  0x8023000010300020,  0xc002000000000,  0xf8000000e0008000,  0xfffe00000000ffff,  0xfc00,  0xfff0000000000000,  0xffffff8000000000,  0xfffff800,  0x1,  0xfffffffffc00e000,  0x800000000000,  0x80000000,  0x1f0000000000000,  0xdf4000000000,  0x7ffe7f0000000000,  0x80808080ff800000,  0x80808080,  0xf000000000000000,  0x4000000,  0xf000ffffffc00000,  0x1800000,  0x1c0000000001f,  0xf800000000008000,  0xfff000000000,  0x8000000000000000,  0xffffffffffffe000,  0xe000,  0xff80,  0xfffff00000000000,  0x7f000000,  0xfffff800fff08000,  0xffffffffffffff,  0xfc00f00000000000,  0xf0000000fc003fe0,  0xe00000007ff00000,  0xffffffff3c004000,  0xff80000000000000,  0xf00000000c00c000,  0xff80000007fffff8,  0xffff8080ff818181,  0xfc00c00000000000,  0xf000000000000780,  0xc00000000000,  0xfffffffffc000000,  0xa08000001f07ff80,  0x24,  0x7fffc,  0xffff,  0x30000,  0xc000ffffffffff00,  0xff80fc000000,  0x20f08000080000,  0x6000000000000000,  0xc1ff8080e3030303,  0x4800008000001000,  0xffffffffc000c000,  0x70000000000078,  0xfffffffff000f800,  0xc00000000000ffff,  0xfffffffffffe0000,  0xfff080000000,  0xfffffffffffff800,  0x40000000,  0xffffffffffc000f0,  0xfffffc00c0000000,  0x6e400000000002c0,  0xffffffff00400000,  0x7c00000070000000,  0x3f00000000000000,  0x78f0000001100f90,  0xfe00ff00,  0x1c0000000000000,  0xf8000000c00000,  0xfffffffffffffe00,  0x80000000ffffffff,  0xffff00000003c000,  0xfc00fe000000fffc,  0xfffffffffffffff0,  0xfffffffffc00fe00,  0xfffffffffffffc00,  0xffff800000000000,  0xfff0fff800000000,  0xfe00000000000000,  0x800000000000ffe0,  0xffffffff00007fff,  0xfffffffffffffffc,  0x18000000000,  0xffffffffc0000000,  0xffffffffffffffc0,  0xfffc0000ff800000,  0x200000,  0x1400219b20000000,  0x10,  0x8400000020201840,  0x203a0,  0xc000000000,  0x3000,  0xf508016900000010,  0xa10808695569157b,  0xf0000411f0000400,  0xfffcffffffffffff,  0x80018000fff00000,  0xffffffff00010001,  0x80000000f800,  0xfffffffff8000000,  0x3fffffffff,  0xf80000000000fff8,  0xfffffffffffcfe00,  0x40fffe00000000,  0xe000000000000000,  0xfff00000,  0xfffe0000fffff820,  0x2,  0xe100000000000000,  0xc000000000000000,  0xffffff000000fff0,  0x7ffffffffffffff,  0xffffffffffff001e,  0xffffffffff800000,  0xfffffffd,  0xffff000000000000,  0xc000000000000000]);
++enum MAX_SIMPLE_LOWER = 1043;
++enum MAX_SIMPLE_UPPER = 1051;
++enum MAX_SIMPLE_TITLE = 1055;
++//8192 bytes
++enum toUpperIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x100], [ 0x100,  0x380,  0xc00], [ 0x402030202020100,  0x202020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x3000200010000,  0x7000600050004,  0xa00090008,  0xd000c000b0000,  0x110010000f000e,  0x1400130012,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x150000,  0x19001800170016,  0x1d001c001b001a,  0x0,  0x1f001e0000,  0x0,  0x0,  0x20000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x24002300220021,  0x25,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2700260000,  0x2a00290028,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x2c0000,  0x0,  0x0,  0x0,  0x0,  0x2e002d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x200010000ffff,  0x6000500040003,  0xa000900080007,  0xe000d000c000b,  0x1200110010000f,  0x16001500140013,  0xffff001900180017,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff001affff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x41bffffffffffff,  0x1e001d001c001b,  0x2200210020001f,  0x26002500240023,  0x2a002900280027,  0x2e002d002c002b,  0xffff00310030002f,  0x35003400330032,  0x39003800370036,  0x3bffff003affff,  0x3dffff003cffff,  0x3fffff003effff,  0x41ffff0040ffff,  0x43ffff0042ffff,  0x45ffff0044ffff,  0x47ffff0046ffff,  0x49ffff0048ffff,  0x4bffff004affff,  0x4dffff004cffff,  0x4fffff004effff,  0x51ffff0050ffff,  0x53ffff0052041d,  0x55ffff0054ffff,  0xffff0056ffffffff,  0xffff0058ffff0057,  0xffff005affff0059,  0xffff005cffff005b,  0x5effff043a005d,  0x60ffff005fffff,  0x62ffff0061ffff,  0x64ffff0063ffff,  0x66ffff0065ffff,  0x68ffff0067ffff,  0x6affff0069ffff,  0x6cffff006bffff,  0x6effff006dffff,  0x70ffff006fffff,  0x72ffff0071ffff,  0x74ffff0073ffff,  0xffff0075ffffffff,  0x780077ffff0076,  0x7affffffff0079,  0xffffffff007bffff,  0xffffffffffff007c,  0xffffffffffff007d,  0xffff007effffffff,  0xffffffff007fffff,  0xffff00810080ffff,  0xffff0082ffffffff,  0x84ffff0083ffff,  0xffffffff0085ffff,  0xffffffffffff0086,  0xffffffff0087ffff,  0xffffffffffff0088,  0xffff008affff0089,  0xffffffff008bffff,  0x8dffff008cffff,  0xffffffffffffffff,  0xffff008f008effff,  0x92ffff00910090,  0xffff0094ffff0093,  0xffff0096ffff0095,  0xffff0098ffff0097,  0xffff009affff0099,  0x9dffff009c009b,  0x9fffff009effff,  0xa1ffff00a0ffff,  0xa3ffff00a2ffff,  0xa5ffff00a4ffff,  0xa700a6ffff0442,  0xffffffff00a8ffff,  0xaaffff00a9ffff,  0xacffff00abffff,  0xaeffff00adffff,  0xb0ffff00afffff,  0xb2ffff00b1ffff,  0xb4ffff00b3ffff,  0xb6ffff00b5ffff,  0xb8ffff00b7ffff,  0xbaffff00b9ffff,  0xbcffff00bbffff,  0xbdffffffffffff,  0xbfffff00beffff,  0xc1ffff00c0ffff,  0xc3ffff00c2ffff,  0xc5ffff00c4ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xc7ffffffff00c6,  0xffff00c9ffff00c8,  0xcaffffffffffff,  0xccffff00cbffff,  0xceffff00cdffff,  0xd200d100d000cf,  0xd500d4ffff00d3,  0xd7ffff00d6ffff,  0xffffffffffffffff,  0xd9ffffffff00d8,  0xffff00db00daffff,  0xdeffff00dd00dc,  0xdfffffffffffff,  0xffff00e100e0ffff,  0xffffffff00e2ffff,  0xffffffffffffffff,  0xffffffff00e3ffff,  0xe5ffffffff00e4,  0xffffffffffffffff,  0xe900e800e700e6,  0xffffffffffff00ea,  0xffff00ebffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff00ecffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xeeffff00edffff,  0xefffffffffffff,  0xf0ffffffffffff,  0xffffffff00f200f1,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff043c,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xf600f500f400f3,  0xf900f800f7043f,  0xfd00fc00fb00fa,  0x101010000ff00fe,  0x105010401030102,  0x109010801070106,  0x10d010c010b010a,  0x1110110010f010e,  0xffff011401130112,  0xffffffff01160115,  0x11901180117ffff,  0x11bffff011affff,  0x11dffff011cffff,  0x11fffff011effff,  0x121ffff0120ffff,  0x123ffff0122ffff,  0x125ffff0124ffff,  0xffff012801270126,  0xffffffff0129ffff,  0x12bffffffff012a,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x12f012e012d012c,  0x133013201310130,  0x137013601350134,  0x13b013a01390138,  0x13f013e013d013c,  0x143014201410140,  0x147014601450144,  0x14b014a01490148,  0x14f014e014d014c,  0x153015201510150,  0x157015601550154,  0x15b015a01590158,  0x15dffff015cffff,  0x15fffff015effff,  0x161ffff0160ffff,  0x163ffff0162ffff,  0x165ffff0164ffff,  0x167ffff0166ffff,  0x169ffff0168ffff,  0x16bffff016affff,  0xffffffff016cffff,  0xffffffffffffffff,  0x16dffffffffffff,  0x16fffff016effff,  0x171ffff0170ffff,  0x173ffff0172ffff,  0x175ffff0174ffff,  0x177ffff0176ffff,  0x179ffff0178ffff,  0x17bffff017affff,  0x17dffff017cffff,  0x17fffff017effff,  0x181ffff0180ffff,  0x183ffff0182ffff,  0x185ffff0184ffff,  0x187ffff0186ffff,  0xffff0188ffffffff,  0xffff018affff0189,  0xffff018cffff018b,  0x18f018effff018d,  0x191ffff0190ffff,  0x193ffff0192ffff,  0x195ffff0194ffff,  0x197ffff0196ffff,  0x199ffff0198ffff,  0x19bffff019affff,  0x19dffff019cffff,  0x19fffff019effff,  0x1a1ffff01a0ffff,  0x1a3ffff01a2ffff,  0x1a5ffff01a4ffff,  0x1a7ffff01a6ffff,  0x1a9ffff01a8ffff,  0x1abffff01aaffff,  0x1adffff01acffff,  0x1afffff01aeffff,  0x1b1ffff01b0ffff,  0x1b3ffff01b2ffff,  0x1b5ffff01b4ffff,  0x1b7ffff01b6ffff,  0x1b9ffff01b8ffff,  0x1bbffff01baffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1be01bd01bcffff,  0x1c201c101c001bf,  0x1c601c501c401c3,  0x1ca01c901c801c7,  0x1ce01cd01cc01cb,  0x1d201d101d001cf,  0x1d601d501d401d3,  0x1da01d901d801d7,  0x1de01dd01dc01db,  0x42e01e101e001df,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff01e2ffff,  0xffffffff01e3ffff,  0x1e5ffff01e4ffff,  0x1e7ffff01e6ffff,  0x1e9ffff01e8ffff,  0x1ebffff01eaffff,  0x1edffff01ecffff,  0x1efffff01eeffff,  0x1f1ffff01f0ffff,  0x1f3ffff01f2ffff,  0x1f5ffff01f4ffff,  0x1f7ffff01f6ffff,  0x1f9ffff01f8ffff,  0x1fbffff01faffff,  0x1fdffff01fcffff,  0x1ffffff01feffff,  0x201ffff0200ffff,  0x203ffff0202ffff,  0x205ffff0204ffff,  0x207ffff0206ffff,  0x209ffff0208ffff,  0x20bffff020affff,  0x20dffff020cffff,  0x20fffff020effff,  0x211ffff0210ffff,  0x213ffff0212ffff,  0x215ffff0214ffff,  0x217ffff0216ffff,  0x219ffff0218ffff,  0x21bffff021affff,  0x21dffff021cffff,  0x21fffff021effff,  0x221ffff0220ffff,  0x223ffff0222ffff,  0x225ffff0224ffff,  0x227ffff0226ffff,  0x229ffff0228ffff,  0x22bffff022affff,  0x22dffff022cffff,  0x4460444022effff,  0x22f044c044a0448,  0xffffffffffffffff,  0x231ffff0230ffff,  0x233ffff0232ffff,  0x235ffff0234ffff,  0x237ffff0236ffff,  0x239ffff0238ffff,  0x23bffff023affff,  0x23dffff023cffff,  0x23fffff023effff,  0x241ffff0240ffff,  0x243ffff0242ffff,  0x245ffff0244ffff,  0x247ffff0246ffff,  0x249ffff0248ffff,  0x24bffff024affff,  0x24dffff024cffff,  0x24fffff024effff,  0x251ffff0250ffff,  0x253ffff0252ffff,  0x255ffff0254ffff,  0x257ffff0256ffff,  0x259ffff0258ffff,  0x25bffff025affff,  0x25dffff025cffff,  0x25fffff025effff,  0x263026202610260,  0x267026602650264,  0xffffffffffffffff,  0xffffffffffffffff,  0x26b026a02690268,  0xffffffff026d026c,  0xffffffffffffffff,  0xffffffffffffffff,  0x2710270026f026e,  0x275027402730272,  0xffffffffffffffff,  0xffffffffffffffff,  0x279027802770276,  0x27d027c027b027a,  0xffffffffffffffff,  0xffffffffffffffff,  0x2810280027f027e,  0xffffffff02830282,  0xffffffffffffffff,  0xffffffffffffffff,  0x28504500284044e,  0x287045602860453,  0xffffffffffffffff,  0xffffffffffffffff,  0x28b028a02890288,  0x28f028e028d028c,  0xffffffffffffffff,  0xffffffffffffffff,  0x293029202910290,  0x297029602950294,  0x29b029a02990298,  0xffffffff029d029c,  0x47d047b04790477,  0x48504830481047f,  0x48d048b04890487,  0x49504930491048f,  0x49d049b04990497,  0x4a504a304a1049f,  0x4ad04ab04a904a7,  0x4b504b304b104af,  0x4bd04bb04b904b7,  0x4c504c304c104bf,  0x4cd04cb04c904c7,  0x4d504d304d104cf,  0x4d704e302b702b6,  0x4ef0459ffff04e5,  0xffffffffffffffff,  0xffff02b9ffff04d9,  0x4db04e7ffffffff,  0x4f2045bffff04e9,  0xffffffffffffffff,  0xffffffffffff04dd,  0x460045d02bc02bb,  0x4650463ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x46b046802be02bd,  0x472047002bf046e,  0xffffffffffffffff,  0xffffffffffffffff,  0x4df04ebffffffff,  0x4f50475ffff04ed,  0xffffffffffffffff,  0xffffffffffff04e1,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff02c1ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2c502c402c302c2,  0x2c902c802c702c6,  0x2cd02cc02cb02ca,  0x2d102d002cf02ce,  0xffffffffffffffff,  0xffffffffffff02d2,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2d602d502d402d3,  0x2da02d902d802d7,  0x2de02dd02dc02db,  0x2e202e102e002df,  0x2e602e502e402e3,  0x2ea02e902e802e7,  0xffffffff02ec02eb,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2f002ef02ee02ed,  0x2f402f302f202f1,  0x2f802f702f602f5,  0x2fc02fb02fa02f9,  0x30002ff02fe02fd,  0x304030303020301,  0x308030703060305,  0x30c030b030a0309,  0x310030f030e030d,  0x314031303120311,  0x318031703160315,  0xffff031b031a0319,  0xffffffff031cffff,  0xffff031e031dffff,  0xffff0320ffff031f,  0xffffffffffff0321,  0x322ffffffffffff,  0xffff0323ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x325ffff0324ffff,  0x327ffff0326ffff,  0x329ffff0328ffff,  0x32bffff032affff,  0x32dffff032cffff,  0x32fffff032effff,  0x331ffff0330ffff,  0x333ffff0332ffff,  0x335ffff0334ffff,  0x337ffff0336ffff,  0x339ffff0338ffff,  0x33bffff033affff,  0x33dffff033cffff,  0x33fffff033effff,  0x341ffff0340ffff,  0x343ffff0342ffff,  0x345ffff0344ffff,  0x347ffff0346ffff,  0x349ffff0348ffff,  0x34bffff034affff,  0x34dffff034cffff,  0x34fffff034effff,  0x351ffff0350ffff,  0x353ffff0352ffff,  0x355ffff0354ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0357ffff0356,  0x358ffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x35c035b035a0359,  0x360035f035e035d,  0x364036303620361,  0x368036703660365,  0x36c036b036a0369,  0x370036f036e036d,  0x374037303720371,  0x378037703760375,  0x37c037b037a0379,  0x37fffff037e037d,  0xffffffffffffffff,  0xffffffff0380ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x382ffff0381ffff,  0x384ffff0383ffff,  0x386ffff0385ffff,  0x388ffff0387ffff,  0x38affff0389ffff,  0x38cffff038bffff,  0x38effff038dffff,  0x390ffff038fffff,  0x392ffff0391ffff,  0x394ffff0393ffff,  0x396ffff0395ffff,  0xffffffff0397ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x399ffff0398ffff,  0x39bffff039affff,  0x39dffff039cffff,  0x39fffff039effff,  0x3a1ffff03a0ffff,  0x3a3ffff03a2ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3a4ffffffffffff,  0x3a6ffff03a5ffff,  0x3a8ffff03a7ffff,  0x3aaffff03a9ffff,  0x3abffffffffffff,  0x3adffff03acffff,  0x3afffff03aeffff,  0x3b1ffff03b0ffff,  0x3b3ffff03b2ffff,  0x3b5ffff03b4ffff,  0x3b7ffff03b6ffff,  0x3b9ffff03b8ffff,  0x3bbffff03baffff,  0x3bdffff03bcffff,  0x3bfffff03beffff,  0x3c1ffff03c0ffff,  0x3c3ffff03c2ffff,  0x3c5ffff03c4ffff,  0x3c7ffff03c6ffff,  0x3c9ffff03c8ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff03caffffffff,  0x3ccffffffff03cb,  0x3ceffff03cdffff,  0x3d0ffff03cfffff,  0xffffffffffffffff,  0xffffffffffff03d1,  0x3d3ffff03d2ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3d5ffff03d4ffff,  0x3d7ffff03d6ffff,  0xffffffff03d8ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x42404220420041e,  0xffff042c042a0427,  0xffffffffffffffff,  0xffffffffffffffff,  0x430ffffffffffff,  0x438043604340432,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3db03da03d9ffff,  0x3df03de03dd03dc,  0x3e303e203e103e0,  0x3e703e603e503e4,  0x3eb03ea03e903e8,  0x3ef03ee03ed03ec,  0xffff03f203f103f0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3f603f503f403f3,  0x3fa03f903f803f7,  0x3fe03fd03fc03fb,  0x4020401040003ff,  0x406040504040403,  0x40a040904080407,  0x40e040d040c040b,  0x41204110410040f,  0x416041504140413,  0x41a041904180417,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++//8064 bytes
++enum toLowerIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x100], [ 0x100,  0x380,  0xbc0], [ 0x402030202020100,  0x202020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x2000000010000,  0x6000500040003,  0x80007,  0xb000a00090000,  0xf000e000d000c,  0x1200110010,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x14001300000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x18001700160015,  0x1c001b001a0019,  0x0,  0x1f001e001d,  0x0,  0x0,  0x21002000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x25002400230022,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2700260000,  0x2a00290028,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x2c,  0x0,  0x0,  0x0,  0x0,  0x2d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x200010000ffff,  0x6000500040003,  0xa000900080007,  0xe000d000c000b,  0x1200110010000f,  0x16001500140013,  0xffff001900180017,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1d001c001b001a,  0x210020001f001e,  0x25002400230022,  0x29002800270026,  0x2d002c002b002a,  0xffff0030002f002e,  0x34003300320031,  0x413003700360035,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0039ffff0038,  0xffff003bffff003a,  0xffff003dffff003c,  0xffff003fffff003e,  0xffff0041ffff0040,  0xffff0043ffff0042,  0xffff0045ffff0044,  0xffff0047ffff0046,  0xffff0049ffff0048,  0xffff004bffff004a,  0xffff004dffff004c,  0xffff004fffff004e,  0xffff0051ffff0414,  0xffff0053ffff0052,  0x55ffff0054ffff,  0x57ffff0056ffff,  0x59ffff0058ffff,  0x5bffff005affff,  0xffff005c0423ffff,  0xffff005effff005d,  0xffff0060ffff005f,  0xffff0062ffff0061,  0xffff0064ffff0063,  0xffff0066ffff0065,  0xffff0068ffff0067,  0xffff006affff0069,  0xffff006cffff006b,  0xffff006effff006d,  0xffff0070ffff006f,  0xffff0072ffff0071,  0x75ffff00740073,  0xffffffff0076ffff,  0xffff00780077ffff,  0x7b007affff0079,  0x7e007d007cffff,  0x80007fffffffff,  0x83ffff00820081,  0x860085ffff0084,  0xffffffffffff0087,  0x8affff00890088,  0xffff008cffff008b,  0x8f008effff008d,  0xffffffff0090ffff,  0x930092ffff0091,  0x9600950094ffff,  0x98ffff0097ffff,  0xffffffffffff0099,  0xffffffffffff009a,  0xffffffffffffffff,  0x9dffff009c009b,  0xa0009fffff009e,  0xa2ffff00a1ffff,  0xa4ffff00a3ffff,  0xa6ffff00a5ffff,  0xa8ffff00a7ffff,  0xffff00a9ffffffff,  0xffff00abffff00aa,  0xffff00adffff00ac,  0xffff00afffff00ae,  0xffff00b1ffff00b0,  0xffff00b300b20426,  0xb600b5ffff00b4,  0xffff00b8ffff00b7,  0xffff00baffff00b9,  0xffff00bcffff00bb,  0xffff00beffff00bd,  0xffff00c0ffff00bf,  0xffff00c2ffff00c1,  0xffff00c4ffff00c3,  0xffff00c6ffff00c5,  0xffff00c8ffff00c7,  0xffff00caffff00c9,  0xffff00ccffff00cb,  0xffff00ceffff00cd,  0xffff00d0ffff00cf,  0xffff00d2ffff00d1,  0xffff00d4ffff00d3,  0xffffffffffffffff,  0xd600d5ffffffff,  0xffff00d800d7ffff,  0xdaffff00d9ffff,  0xffff00dd00dc00db,  0xffff00dfffff00de,  0xffff00e1ffff00e0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff00e3ffff00e2,  0xffff00e4ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff00e5ffffffff,  0xffff00e800e700e6,  0xeb00eaffff00e9,  0xee00ed00ec0424,  0xf200f100f000ef,  0xf600f500f400f3,  0xfa00f900f800f7,  0xfdffff00fc00fb,  0x101010000ff00fe,  0x105010401030102,  0xffffffffffffffff,  0xffffffffffff0425,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x106ffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0108ffff0107,  0xffff010affff0109,  0xffff010cffff010b,  0xffff010effff010d,  0xffff0110ffff010f,  0xffff0112ffff0111,  0xffffffffffffffff,  0x114ffffffff0113,  0xffff01160115ffff,  0x11901180117ffff,  0x11d011c011b011a,  0x1210120011f011e,  0x125012401230122,  0x129012801270126,  0x12d012c012b012a,  0x1310130012f012e,  0x135013401330132,  0x139013801370136,  0x13d013c013b013a,  0x1410140013f013e,  0x145014401430142,  0x149014801470146,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff014bffff014a,  0xffff014dffff014c,  0xffff014fffff014e,  0xffff0151ffff0150,  0xffff0153ffff0152,  0xffff0155ffff0154,  0xffff0157ffff0156,  0xffff0159ffff0158,  0xffffffffffff015a,  0xffffffffffffffff,  0xffff015bffffffff,  0xffff015dffff015c,  0xffff015fffff015e,  0xffff0161ffff0160,  0xffff0163ffff0162,  0xffff0165ffff0164,  0xffff0167ffff0166,  0xffff0169ffff0168,  0xffff016bffff016a,  0xffff016dffff016c,  0xffff016fffff016e,  0xffff0171ffff0170,  0xffff0173ffff0172,  0xffff0175ffff0174,  0x178ffff01770176,  0x17affff0179ffff,  0x17cffff017bffff,  0xffffffff017dffff,  0xffff017fffff017e,  0xffff0181ffff0180,  0xffff0183ffff0182,  0xffff0185ffff0184,  0xffff0187ffff0186,  0xffff0189ffff0188,  0xffff018bffff018a,  0xffff018dffff018c,  0xffff018fffff018e,  0xffff0191ffff0190,  0xffff0193ffff0192,  0xffff0195ffff0194,  0xffff0197ffff0196,  0xffff0199ffff0198,  0xffff019bffff019a,  0xffff019dffff019c,  0xffff019fffff019e,  0xffff01a1ffff01a0,  0xffff01a3ffff01a2,  0xffff01a5ffff01a4,  0xffff01a7ffff01a6,  0xffff01a9ffff01a8,  0xffffffffffffffff,  0xffffffffffffffff,  0x1ac01ab01aaffff,  0x1b001af01ae01ad,  0x1b401b301b201b1,  0x1b801b701b601b5,  0x1bc01bb01ba01b9,  0x1c001bf01be01bd,  0x1c401c301c201c1,  0x1c801c701c601c5,  0x1cc01cb01ca01c9,  0xffff01cf01ce01cd,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x41dffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1d301d201d101d0,  0x1d701d601d501d4,  0x1db01da01d901d8,  0x1df01de01dd01dc,  0x1e301e201e101e0,  0x1e701e601e501e4,  0x1eb01ea01e901e8,  0x1ef01ee01ed01ec,  0x1f301f201f101f0,  0x1f6ffff01f501f4,  0xffffffffffffffff,  0xffffffff01f7ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff01f9ffff01f8,  0xffff01fbffff01fa,  0xffff01fdffff01fc,  0xffff01ffffff01fe,  0xffff0201ffff0200,  0xffff0203ffff0202,  0xffff0205ffff0204,  0xffff0207ffff0206,  0xffff0209ffff0208,  0xffff020bffff020a,  0xffff020dffff020c,  0xffff020fffff020e,  0xffff0211ffff0210,  0xffff0213ffff0212,  0xffff0215ffff0214,  0xffff0217ffff0216,  0xffff0219ffff0218,  0xffff021bffff021a,  0xffff021dffff021c,  0xffff021fffff021e,  0xffff0221ffff0220,  0xffff0223ffff0222,  0xffff0225ffff0224,  0xffff0227ffff0226,  0xffff0229ffff0228,  0xffff022bffff022a,  0xffff022dffff022c,  0xffff022fffff022e,  0xffff0231ffff0230,  0xffff0233ffff0232,  0xffff0235ffff0234,  0xffff0237ffff0236,  0xffff0239ffff0238,  0xffff023bffff023a,  0xffff023dffff023c,  0xffff023fffff023e,  0xffff0241ffff0240,  0x4280427ffff0242,  0xffff042b042a0429,  0xffff0243ffffffff,  0xffff0245ffff0244,  0xffff0247ffff0246,  0xffff0249ffff0248,  0xffff024bffff024a,  0xffff024dffff024c,  0xffff024fffff024e,  0xffff0251ffff0250,  0xffff0253ffff0252,  0xffff0255ffff0254,  0xffff0257ffff0256,  0xffff0259ffff0258,  0xffff025bffff025a,  0xffff025dffff025c,  0xffff025fffff025e,  0xffff0261ffff0260,  0xffff0263ffff0262,  0xffff0265ffff0264,  0xffff0267ffff0266,  0xffff0269ffff0268,  0xffff026bffff026a,  0xffff026dffff026c,  0xffff026fffff026e,  0xffff0271ffff0270,  0xffff0273ffff0272,  0xffffffffffffffff,  0xffffffffffffffff,  0x277027602750274,  0x27b027a02790278,  0xffffffffffffffff,  0xffffffffffffffff,  0x27f027e027d027c,  0xffffffff02810280,  0xffffffffffffffff,  0xffffffffffffffff,  0x285028402830282,  0x289028802870286,  0xffffffffffffffff,  0xffffffffffffffff,  0x28d028c028b028a,  0x2910290028f028e,  0xffffffffffffffff,  0xffffffffffffffff,  0x295029402930292,  0xffffffff02970296,  0xffff042dffff042c,  0xffff042fffff042e,  0x299ffff0298ffff,  0x29bffff029affff,  0xffffffffffffffff,  0xffffffffffffffff,  0x29f029e029d029c,  0x2a302a202a102a0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x43f043e043d043c,  0x443044204410440,  0x447044604450444,  0x44b044a04490448,  0x44f044e044d044c,  0x453045204510450,  0x457045604550454,  0x45b045a04590458,  0x45f045e045d045c,  0x463046204610460,  0x467046604650464,  0x46b046a04690468,  0x46c0472ffffffff,  0x4780430ffff0473,  0x2bf02be02bd02bc,  0xffffffffffff046d,  0x46e0474ffffffff,  0x4790431ffff0475,  0x2c402c302c202c1,  0xffffffffffff046f,  0x4330432ffffffff,  0x4350434ffffffff,  0x2c902c802c702c6,  0xffffffffffffffff,  0x4370436ffffffff,  0x43a0439ffff0438,  0x2cd02cc02cb02ca,  0xffffffffffff02ce,  0x4700476ffffffff,  0x47a043bffff0477,  0x2d202d102d002cf,  0xffffffffffff0471,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff02d4ffffffff,  0x2d602d5ffffffff,  0xffffffffffffffff,  0xffff02d7ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2db02da02d902d8,  0x2df02de02dd02dc,  0x2e302e202e102e0,  0x2e702e602e502e4,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2e8ffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2ea02e9ffffffff,  0x2ee02ed02ec02eb,  0x2f202f102f002ef,  0x2f602f502f402f3,  0x2fa02f902f802f7,  0x2fe02fd02fc02fb,  0x3020301030002ff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x306030503040303,  0x30a030903080307,  0x30e030d030c030b,  0x31203110310030f,  0x316031503140313,  0x31a031903180317,  0x31e031d031c031b,  0x32203210320031f,  0x326032503240323,  0x32a032903280327,  0x32e032d032c032b,  0xffff03310330032f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3340333ffff0332,  0x336ffffffff0335,  0x338ffff0337ffff,  0x33b033a0339ffff,  0xffff033dffff033c,  0xffffffff033effff,  0xffffffffffffffff,  0x340033fffffffff,  0xffff0342ffff0341,  0xffff0344ffff0343,  0xffff0346ffff0345,  0xffff0348ffff0347,  0xffff034affff0349,  0xffff034cffff034b,  0xffff034effff034d,  0xffff0350ffff034f,  0xffff0352ffff0351,  0xffff0354ffff0353,  0xffff0356ffff0355,  0xffff0358ffff0357,  0xffff035affff0359,  0xffff035cffff035b,  0xffff035effff035d,  0xffff0360ffff035f,  0xffff0362ffff0361,  0xffff0364ffff0363,  0xffff0366ffff0365,  0xffff0368ffff0367,  0xffff036affff0369,  0xffff036cffff036b,  0xffff036effff036d,  0xffff0370ffff036f,  0xffff0372ffff0371,  0xffffffffffffffff,  0x373ffffffffffff,  0xffffffff0374ffff,  0xffff0375ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0377ffff0376,  0xffff0379ffff0378,  0xffff037bffff037a,  0xffff037dffff037c,  0xffff037fffff037e,  0xffff0381ffff0380,  0xffff0383ffff0382,  0xffff0385ffff0384,  0xffff0387ffff0386,  0xffff0389ffff0388,  0xffff038bffff038a,  0xffffffffffff038c,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff038effff038d,  0xffff0390ffff038f,  0xffff0392ffff0391,  0xffff0394ffff0393,  0xffff0396ffff0395,  0xffff0398ffff0397,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff0399ffffffff,  0xffff039bffff039a,  0xffff039dffff039c,  0xffff039fffff039e,  0xffff03a0ffffffff,  0xffff03a2ffff03a1,  0xffff03a4ffff03a3,  0xffff03a6ffff03a5,  0xffff03a8ffff03a7,  0xffff03aaffff03a9,  0xffff03acffff03ab,  0xffff03aeffff03ad,  0xffff03b0ffff03af,  0xffff03b2ffff03b1,  0xffff03b4ffff03b3,  0xffff03b6ffff03b5,  0xffff03b8ffff03b7,  0xffff03baffff03b9,  0xffff03bcffff03bb,  0xffff03beffff03bd,  0xffffffffffffffff,  0xffffffffffffffff,  0x3c0ffff03bfffff,  0xffff03c203c1ffff,  0xffff03c4ffff03c3,  0xffff03c6ffff03c5,  0x3c7ffffffffffff,  0xffffffff03c8ffff,  0xffff03caffff03c9,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff03ccffff03cb,  0xffff03ceffff03cd,  0xffff03d0ffff03cf,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x419041804170416,  0xffff041c041b041a,  0xffffffffffffffff,  0xffffffffffffffff,  0x41effffffffffff,  0x42204210420041f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3d303d203d1ffff,  0x3d703d603d503d4,  0x3db03da03d903d8,  0x3df03de03dd03dc,  0x3e303e203e103e0,  0x3e703e603e503e4,  0xffff03ea03e903e8,  0xffffffffffffffff,  0x3ee03ed03ec03eb,  0x3f203f103f003ef,  0x3f603f503f403f3,  0x3fa03f903f803f7,  0x3fe03fd03fc03fb,  0x4020401040003ff,  0x406040504040403,  0x40a040904080407,  0x40e040d040c040b,  0x41204110410040f,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++//8192 bytes
++enum toTitleIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x20,  0x100], [ 0x100,  0x380,  0xc00], [ 0x402030202020100,  0x202020202020205,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x202020202020202,  0x3000200010000,  0x7000600050004,  0xa00090008,  0xd000c000b0000,  0x110010000f000e,  0x1400130012,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x150000,  0x19001800170016,  0x1d001c001b001a,  0x0,  0x1f001e0000,  0x0,  0x0,  0x20000000000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x24002300220021,  0x25,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2700260000,  0x2a00290028,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x2c0000,  0x0,  0x0,  0x0,  0x0,  0x2e002d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x200010000ffff,  0x6000500040003,  0xa000900080007,  0xe000d000c000b,  0x1200110010000f,  0x16001500140013,  0xffff001900180017,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff001affff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x41fffffffffffff,  0x1e001d001c001b,  0x2200210020001f,  0x26002500240023,  0x2a002900280027,  0x2e002d002c002b,  0xffff00310030002f,  0x35003400330032,  0x39003800370036,  0x3bffff003affff,  0x3dffff003cffff,  0x3fffff003effff,  0x41ffff0040ffff,  0x43ffff0042ffff,  0x45ffff0044ffff,  0x47ffff0046ffff,  0x49ffff0048ffff,  0x4bffff004affff,  0x4dffff004cffff,  0x4fffff004effff,  0x51ffff0050ffff,  0x53ffff00520421,  0x55ffff0054ffff,  0xffff0056ffffffff,  0xffff0058ffff0057,  0xffff005affff0059,  0xffff005cffff005b,  0x5effff043e005d,  0x60ffff005fffff,  0x62ffff0061ffff,  0x64ffff0063ffff,  0x66ffff0065ffff,  0x68ffff0067ffff,  0x6affff0069ffff,  0x6cffff006bffff,  0x6effff006dffff,  0x70ffff006fffff,  0x72ffff0071ffff,  0x74ffff0073ffff,  0xffff0075ffffffff,  0x780077ffff0076,  0x7affffffff0079,  0xffffffff007bffff,  0xffffffffffff007c,  0xffffffffffff007d,  0xffff007effffffff,  0xffffffff007fffff,  0xffff00810080ffff,  0xffff0082ffffffff,  0x84ffff0083ffff,  0xffffffff0085ffff,  0xffffffffffff0086,  0xffffffff0087ffff,  0xffffffffffff0088,  0xffff008affff0089,  0xffffffff008bffff,  0x8dffff008cffff,  0xffffffffffffffff,  0x910090008f008e,  0x95009400930092,  0xffff0097ffff0096,  0xffff0099ffff0098,  0xffff009bffff009a,  0xffff009dffff009c,  0xa0ffff009f009e,  0xa2ffff00a1ffff,  0xa4ffff00a3ffff,  0xa6ffff00a5ffff,  0xa8ffff00a7ffff,  0xab00aa00a90446,  0xffffffff00acffff,  0xaeffff00adffff,  0xb0ffff00afffff,  0xb2ffff00b1ffff,  0xb4ffff00b3ffff,  0xb6ffff00b5ffff,  0xb8ffff00b7ffff,  0xbaffff00b9ffff,  0xbcffff00bbffff,  0xbeffff00bdffff,  0xc0ffff00bfffff,  0xc1ffffffffffff,  0xc3ffff00c2ffff,  0xc5ffff00c4ffff,  0xc7ffff00c6ffff,  0xc9ffff00c8ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xcbffffffff00ca,  0xffff00cdffff00cc,  0xceffffffffffff,  0xd0ffff00cfffff,  0xd2ffff00d1ffff,  0xd600d500d400d3,  0xd900d8ffff00d7,  0xdbffff00daffff,  0xffffffffffffffff,  0xddffffffff00dc,  0xffff00df00deffff,  0xe2ffff00e100e0,  0xe3ffffffffffff,  0xffff00e500e4ffff,  0xffffffff00e6ffff,  0xffffffffffffffff,  0xffffffff00e7ffff,  0xe9ffffffff00e8,  0xffffffffffffffff,  0xed00ec00eb00ea,  0xffffffffffff00ee,  0xffff00efffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff00f0ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xf2ffff00f1ffff,  0xf3ffffffffffff,  0xf4ffffffffffff,  0xffffffff00f600f5,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffff0440,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xfa00f900f800f7,  0xfd00fc00fb0443,  0x101010000ff00fe,  0x105010401030102,  0x109010801070106,  0x10d010c010b010a,  0x1110110010f010e,  0x115011401130112,  0xffff011801170116,  0xffffffff011a0119,  0x11d011c011bffff,  0x11fffff011effff,  0x121ffff0120ffff,  0x123ffff0122ffff,  0x125ffff0124ffff,  0x127ffff0126ffff,  0x129ffff0128ffff,  0xffff012c012b012a,  0xffffffff012dffff,  0x12fffffffff012e,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x133013201310130,  0x137013601350134,  0x13b013a01390138,  0x13f013e013d013c,  0x143014201410140,  0x147014601450144,  0x14b014a01490148,  0x14f014e014d014c,  0x153015201510150,  0x157015601550154,  0x15b015a01590158,  0x15f015e015d015c,  0x161ffff0160ffff,  0x163ffff0162ffff,  0x165ffff0164ffff,  0x167ffff0166ffff,  0x169ffff0168ffff,  0x16bffff016affff,  0x16dffff016cffff,  0x16fffff016effff,  0xffffffff0170ffff,  0xffffffffffffffff,  0x171ffffffffffff,  0x173ffff0172ffff,  0x175ffff0174ffff,  0x177ffff0176ffff,  0x179ffff0178ffff,  0x17bffff017affff,  0x17dffff017cffff,  0x17fffff017effff,  0x181ffff0180ffff,  0x183ffff0182ffff,  0x185ffff0184ffff,  0x187ffff0186ffff,  0x189ffff0188ffff,  0x18bffff018affff,  0xffff018cffffffff,  0xffff018effff018d,  0xffff0190ffff018f,  0x1930192ffff0191,  0x195ffff0194ffff,  0x197ffff0196ffff,  0x199ffff0198ffff,  0x19bffff019affff,  0x19dffff019cffff,  0x19fffff019effff,  0x1a1ffff01a0ffff,  0x1a3ffff01a2ffff,  0x1a5ffff01a4ffff,  0x1a7ffff01a6ffff,  0x1a9ffff01a8ffff,  0x1abffff01aaffff,  0x1adffff01acffff,  0x1afffff01aeffff,  0x1b1ffff01b0ffff,  0x1b3ffff01b2ffff,  0x1b5ffff01b4ffff,  0x1b7ffff01b6ffff,  0x1b9ffff01b8ffff,  0x1bbffff01baffff,  0x1bdffff01bcffff,  0x1bfffff01beffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x1c201c101c0ffff,  0x1c601c501c401c3,  0x1ca01c901c801c7,  0x1ce01cd01cc01cb,  0x1d201d101d001cf,  0x1d601d501d401d3,  0x1da01d901d801d7,  0x1de01dd01dc01db,  0x1e201e101e001df,  0x43201e501e401e3,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffff01e6ffff,  0xffffffff01e7ffff,  0x1e9ffff01e8ffff,  0x1ebffff01eaffff,  0x1edffff01ecffff,  0x1efffff01eeffff,  0x1f1ffff01f0ffff,  0x1f3ffff01f2ffff,  0x1f5ffff01f4ffff,  0x1f7ffff01f6ffff,  0x1f9ffff01f8ffff,  0x1fbffff01faffff,  0x1fdffff01fcffff,  0x1ffffff01feffff,  0x201ffff0200ffff,  0x203ffff0202ffff,  0x205ffff0204ffff,  0x207ffff0206ffff,  0x209ffff0208ffff,  0x20bffff020affff,  0x20dffff020cffff,  0x20fffff020effff,  0x211ffff0210ffff,  0x213ffff0212ffff,  0x215ffff0214ffff,  0x217ffff0216ffff,  0x219ffff0218ffff,  0x21bffff021affff,  0x21dffff021cffff,  0x21fffff021effff,  0x221ffff0220ffff,  0x223ffff0222ffff,  0x225ffff0224ffff,  0x227ffff0226ffff,  0x229ffff0228ffff,  0x22bffff022affff,  0x22dffff022cffff,  0x22fffff022effff,  0x231ffff0230ffff,  0x44a04480232ffff,  0x2330450044e044c,  0xffffffffffffffff,  0x235ffff0234ffff,  0x237ffff0236ffff,  0x239ffff0238ffff,  0x23bffff023affff,  0x23dffff023cffff,  0x23fffff023effff,  0x241ffff0240ffff,  0x243ffff0242ffff,  0x245ffff0244ffff,  0x247ffff0246ffff,  0x249ffff0248ffff,  0x24bffff024affff,  0x24dffff024cffff,  0x24fffff024effff,  0x251ffff0250ffff,  0x253ffff0252ffff,  0x255ffff0254ffff,  0x257ffff0256ffff,  0x259ffff0258ffff,  0x25bffff025affff,  0x25dffff025cffff,  0x25fffff025effff,  0x261ffff0260ffff,  0x263ffff0262ffff,  0x267026602650264,  0x26b026a02690268,  0xffffffffffffffff,  0xffffffffffffffff,  0x26f026e026d026c,  0xffffffff02710270,  0xffffffffffffffff,  0xffffffffffffffff,  0x275027402730272,  0x279027802770276,  0xffffffffffffffff,  0xffffffffffffffff,  0x27d027c027b027a,  0x2810280027f027e,  0xffffffffffffffff,  0xffffffffffffffff,  0x285028402830282,  0xffffffff02870286,  0xffffffffffffffff,  0xffffffffffffffff,  0x289045402880452,  0x28b045a028a0457,  0xffffffffffffffff,  0xffffffffffffffff,  0x28f028e028d028c,  0x293029202910290,  0xffffffffffffffff,  0xffffffffffffffff,  0x297029602950294,  0x29b029a02990298,  0x29f029e029d029c,  0xffffffff02a102a0,  0x47e047d047c047b,  0x48204810480047f,  0x486048504840483,  0x48a048904880487,  0x48e048d048c048b,  0x49204910490048f,  0x496049504940493,  0x49a049904980497,  0x49e049d049c049b,  0x4a204a104a0049f,  0x4a604a504a404a3,  0x4aa04a904a804a7,  0x4ab04b102bb02ba,  0x4bd045dffff04b3,  0xffffffffffffffff,  0xffff02bdffff04ac,  0x4ad04b5ffffffff,  0x4c0045fffff04b7,  0xffffffffffffffff,  0xffffffffffff04ae,  0x464046102c002bf,  0x4690467ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x46f046c02c202c1,  0x476047402c30472,  0xffffffffffffffff,  0xffffffffffffffff,  0x4af04b9ffffffff,  0x4c30479ffff04bb,  0xffffffffffffffff,  0xffffffffffff04b0,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff02c5ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2c902c802c702c6,  0x2cd02cc02cb02ca,  0x2d102d002cf02ce,  0x2d502d402d302d2,  0xffffffffffffffff,  0xffffffffffff02d6,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2da02d902d802d7,  0x2de02dd02dc02db,  0x2e202e102e002df,  0x2e602e502e402e3,  0x2ea02e902e802e7,  0x2ee02ed02ec02eb,  0xffffffff02f002ef,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x2f402f302f202f1,  0x2f802f702f602f5,  0x2fc02fb02fa02f9,  0x30002ff02fe02fd,  0x304030303020301,  0x308030703060305,  0x30c030b030a0309,  0x310030f030e030d,  0x314031303120311,  0x318031703160315,  0x31c031b031a0319,  0xffff031f031e031d,  0xffffffff0320ffff,  0xffff03220321ffff,  0xffff0324ffff0323,  0xffffffffffff0325,  0x326ffffffffffff,  0xffff0327ffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x329ffff0328ffff,  0x32bffff032affff,  0x32dffff032cffff,  0x32fffff032effff,  0x331ffff0330ffff,  0x333ffff0332ffff,  0x335ffff0334ffff,  0x337ffff0336ffff,  0x339ffff0338ffff,  0x33bffff033affff,  0x33dffff033cffff,  0x33fffff033effff,  0x341ffff0340ffff,  0x343ffff0342ffff,  0x345ffff0344ffff,  0x347ffff0346ffff,  0x349ffff0348ffff,  0x34bffff034affff,  0x34dffff034cffff,  0x34fffff034effff,  0x351ffff0350ffff,  0x353ffff0352ffff,  0x355ffff0354ffff,  0x357ffff0356ffff,  0x359ffff0358ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff035bffff035a,  0x35cffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x360035f035e035d,  0x364036303620361,  0x368036703660365,  0x36c036b036a0369,  0x370036f036e036d,  0x374037303720371,  0x378037703760375,  0x37c037b037a0379,  0x380037f037e037d,  0x383ffff03820381,  0xffffffffffffffff,  0xffffffff0384ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x386ffff0385ffff,  0x388ffff0387ffff,  0x38affff0389ffff,  0x38cffff038bffff,  0x38effff038dffff,  0x390ffff038fffff,  0x392ffff0391ffff,  0x394ffff0393ffff,  0x396ffff0395ffff,  0x398ffff0397ffff,  0x39affff0399ffff,  0xffffffff039bffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x39dffff039cffff,  0x39fffff039effff,  0x3a1ffff03a0ffff,  0x3a3ffff03a2ffff,  0x3a5ffff03a4ffff,  0x3a7ffff03a6ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3a8ffffffffffff,  0x3aaffff03a9ffff,  0x3acffff03abffff,  0x3aeffff03adffff,  0x3afffffffffffff,  0x3b1ffff03b0ffff,  0x3b3ffff03b2ffff,  0x3b5ffff03b4ffff,  0x3b7ffff03b6ffff,  0x3b9ffff03b8ffff,  0x3bbffff03baffff,  0x3bdffff03bcffff,  0x3bfffff03beffff,  0x3c1ffff03c0ffff,  0x3c3ffff03c2ffff,  0x3c5ffff03c4ffff,  0x3c7ffff03c6ffff,  0x3c9ffff03c8ffff,  0x3cbffff03caffff,  0x3cdffff03ccffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffff03ceffffffff,  0x3d0ffffffff03cf,  0x3d2ffff03d1ffff,  0x3d4ffff03d3ffff,  0xffffffffffffffff,  0xffffffffffff03d5,  0x3d7ffff03d6ffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3d9ffff03d8ffff,  0x3dbffff03daffff,  0xffffffff03dcffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x428042604240422,  0xffff0430042e042b,  0xffffffffffffffff,  0xffffffffffffffff,  0x434ffffffffffff,  0x43c043a04380436,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3df03de03ddffff,  0x3e303e203e103e0,  0x3e703e603e503e4,  0x3eb03ea03e903e8,  0x3ef03ee03ed03ec,  0x3f303f203f103f0,  0xffff03f603f503f4,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0x3fa03f903f803f7,  0x3fe03fd03fc03fb,  0x4020401040003ff,  0x406040504040403,  0x40a040904080407,  0x40e040d040c040b,  0x41204110410040f,  0x416041504140413,  0x41a041904180417,  0x41e041d041c041b,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff,  0xffffffffffffffff]);
++@property
++{
++private alias _IUA = immutable(uint[]);
++_IUA toUpperTable() { static _IUA t = [ 0x41,  0x42,  0x43,  0x44,  0x45,  0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d,  0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0x55,  0x56,  0x57,  0x58,  0x59,  0x5a,  0x39c,  0xc0,  0xc1,  0xc2,  0xc3,  0xc4,  0xc5,  0xc6,  0xc7,  0xc8,  0xc9,  0xca,  0xcb,  0xcc,  0xcd,  0xce,  0xcf,  0xd0,  0xd1,  0xd2,  0xd3,  0xd4,  0xd5,  0xd6,  0xd8,  0xd9,  0xda,  0xdb,  0xdc,  0xdd,  0xde,  0x178,  0x100,  0x102,  0x104,  0x106,  0x108,  0x10a,  0x10c,  0x10e,  0x110,  0x112,  0x114,  0x116,  0x118,  0x11a,  0x11c,  0x11e,  0x120,  0x122,  0x124,  0x126,  0x128,  0x12a,  0x12c,  0x12e,  0x49,  0x132,  0x134,  0x136,  0x139,  0x13b,  0x13d,  0x13f,  0x141,  0x143,  0x145,  0x147,  0x14a,  0x14c,  0x14e,  0x150,  0x152,  0x154,  0x156,  0x158,  0x15a,  0x15c,  0x15e,  0x160,  0x162,  0x164,  0x166,  0x168,  0x16a,  0x16c,  0x16e,  0x170,  0x172,  0x174,  0x176,  0x179,  0x17b,  0x17d,  0x53,  0x243,  0x182,  0x184,  0x187,  0x18b,  0x191,  0x1f6,  0x198,  0x23d,  0x220,  0x1a0,  0x1a2,  0x1a4,  0x1a7,  0x1ac,  0x1af,  0x1b3,  0x1b5,  0x1b8,  0x1bc,  0x1f7,  0x1c4,  0x1c4,  0x1c7,  0x1c7,  0x1ca,  0x1ca,  0x1cd,  0x1cf,  0x1d1,  0x1d3,  0x1d5,  0x1d7,  0x1d9,  0x1db,  0x18e,  0x1de,  0x1e0,  0x1e2,  0x1e4,  0x1e6,  0x1e8,  0x1ea,  0x1ec,  0x1ee,  0x1f1,  0x1f1,  0x1f4,  0x1f8,  0x1fa,  0x1fc,  0x1fe,  0x200,  0x202,  0x204,  0x206,  0x208,  0x20a,  0x20c,  0x20e,  0x210,  0x212,  0x214,  0x216,  0x218,  0x21a,  0x21c,  0x21e,  0x222,  0x224,  0x226,  0x228,  0x22a,  0x22c,  0x22e,  0x230,  0x232,  0x23b,  0x2c7e,  0x2c7f,  0x241,  0x246,  0x248,  0x24a,  0x24c,  0x24e,  0x2c6f,  0x2c6d,  0x2c70,  0x181,  0x186,  0x189,  0x18a,  0x18f,  0x190,  0x193,  0x194,  0xa78d,  0xa7aa,  0x197,  0x196,  0x2c62,  0x19c,  0x2c6e,  0x19d,  0x19f,  0x2c64,  0x1a6,  0x1a9,  0x1ae,  0x244,  0x1b1,  0x1b2,  0x245,  0x1b7,  0x399,  0x370,  0x372,  0x376,  0x3fd,  0x3fe,  0x3ff,  0x386,  0x388,  0x389,  0x38a,  0x391,  0x392,  0x393,  0x394,  0x395,  0x396,  0x397,  0x398,  0x399,  0x39a,  0x39b,  0x39c,  0x39d,  0x39e,  0x39f,  0x3a0,  0x3a1,  0x3a3,  0x3a3,  0x3a4,  0x3a5,  0x3a6,  0x3a7,  0x3a8,  0x3a9,  0x3aa,  0x3ab,  0x38c,  0x38e,  0x38f,  0x392,  0x398,  0x3a6,  0x3a0,  0x3cf,  0x3d8,  0x3da,  0x3dc,  0x3de,  0x3e0,  0x3e2,  0x3e4,  0x3e6,  0x3e8,  0x3ea,  0x3ec,  0x3ee,  0x39a,  0x3a1,  0x3f9,  0x395,  0x3f7,  0x3fa,  0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,  0x418,  0x419,  0x41a,  0x41b,  0x41c,  0x41d,  0x41e,  0x41f,  0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,  0x428,  0x429,  0x42a,  0x42b,  0x42c,  0x42d,  0x42e,  0x42f,  0x400,  0x401,  0x402,  0x403,  0x404,  0x405,  0x406,  0x407,  0x408,  0x409,  0x40a,  0x40b,  0x40c,  0x40d,  0x40e,  0x40f,  0x460,  0x462,  0x464,  0x466,  0x468,  0x46a,  0x46c,  0x46e,  0x470,  0x472,  0x474,  0x476,  0x478,  0x47a,  0x47c,  0x47e,  0x480,  0x48a,  0x48c,  0x48e,  0x490,  0x492,  0x494,  0x496,  0x498,  0x49a,  0x49c,  0x49e,  0x4a0,  0x4a2,  0x4a4,  0x4a6,  0x4a8,  0x4aa,  0x4ac,  0x4ae,  0x4b0,  0x4b2,  0x4b4,  0x4b6,  0x4b8,  0x4ba,  0x4bc,  0x4be,  0x4c1,  0x4c3,  0x4c5,  0x4c7,  0x4c9,  0x4cb,  0x4cd,  0x4c0,  0x4d0,  0x4d2,  0x4d4,  0x4d6,  0x4d8,  0x4da,  0x4dc,  0x4de,  0x4e0,  0x4e2,  0x4e4,  0x4e6,  0x4e8,  0x4ea,  0x4ec,  0x4ee,  0x4f0,  0x4f2,  0x4f4,  0x4f6,  0x4f8,  0x4fa,  0x4fc,  0x4fe,  0x500,  0x502,  0x504,  0x506,  0x508,  0x50a,  0x50c,  0x50e,  0x510,  0x512,  0x514,  0x516,  0x518,  0x51a,  0x51c,  0x51e,  0x520,  0x522,  0x524,  0x526,  0x531,  0x532,  0x533,  0x534,  0x535,  0x536,  0x537,  0x538,  0x539,  0x53a,  0x53b,  0x53c,  0x53d,  0x53e,  0x53f,  0x540,  0x541,  0x542,  0x543,  0x544,  0x545,  0x546,  0x547,  0x548,  0x549,  0x54a,  0x54b,  0x54c,  0x54d,  0x54e,  0x54f,  0x550,  0x551,  0x552,  0x553,  0x554,  0x555,  0x556,  0xa77d,  0x2c63,  0x1e00,  0x1e02,  0x1e04,  0x1e06,  0x1e08,  0x1e0a,  0x1e0c,  0x1e0e,  0x1e10,  0x1e12,  0x1e14,  0x1e16,  0x1e18,  0x1e1a,  0x1e1c,  0x1e1e,  0x1e20,  0x1e22,  0x1e24,  0x1e26,  0x1e28,  0x1e2a,  0x1e2c,  0x1e2e,  0x1e30,  0x1e32,  0x1e34,  0x1e36,  0x1e38,  0x1e3a,  0x1e3c,  0x1e3e,  0x1e40,  0x1e42,  0x1e44,  0x1e46,  0x1e48,  0x1e4a,  0x1e4c,  0x1e4e,  0x1e50,  0x1e52,  0x1e54,  0x1e56,  0x1e58,  0x1e5a,  0x1e5c,  0x1e5e,  0x1e60,  0x1e62,  0x1e64,  0x1e66,  0x1e68,  0x1e6a,  0x1e6c,  0x1e6e,  0x1e70,  0x1e72,  0x1e74,  0x1e76,  0x1e78,  0x1e7a,  0x1e7c,  0x1e7e,  0x1e80,  0x1e82,  0x1e84,  0x1e86,  0x1e88,  0x1e8a,  0x1e8c,  0x1e8e,  0x1e90,  0x1e92,  0x1e94,  0x1e60,  0x1ea0,  0x1ea2,  0x1ea4,  0x1ea6,  0x1ea8,  0x1eaa,  0x1eac,  0x1eae,  0x1eb0,  0x1eb2,  0x1eb4,  0x1eb6,  0x1eb8,  0x1eba,  0x1ebc,  0x1ebe,  0x1ec0,  0x1ec2,  0x1ec4,  0x1ec6,  0x1ec8,  0x1eca,  0x1ecc,  0x1ece,  0x1ed0,  0x1ed2,  0x1ed4,  0x1ed6,  0x1ed8,  0x1eda,  0x1edc,  0x1ede,  0x1ee0,  0x1ee2,  0x1ee4,  0x1ee6,  0x1ee8,  0x1eea,  0x1eec,  0x1eee,  0x1ef0,  0x1ef2,  0x1ef4,  0x1ef6,  0x1ef8,  0x1efa,  0x1efc,  0x1efe,  0x1f08,  0x1f09,  0x1f0a,  0x1f0b,  0x1f0c,  0x1f0d,  0x1f0e,  0x1f0f,  0x1f18,  0x1f19,  0x1f1a,  0x1f1b,  0x1f1c,  0x1f1d,  0x1f28,  0x1f29,  0x1f2a,  0x1f2b,  0x1f2c,  0x1f2d,  0x1f2e,  0x1f2f,  0x1f38,  0x1f39,  0x1f3a,  0x1f3b,  0x1f3c,  0x1f3d,  0x1f3e,  0x1f3f,  0x1f48,  0x1f49,  0x1f4a,  0x1f4b,  0x1f4c,  0x1f4d,  0x1f59,  0x1f5b,  0x1f5d,  0x1f5f,  0x1f68,  0x1f69,  0x1f6a,  0x1f6b,  0x1f6c,  0x1f6d,  0x1f6e,  0x1f6f,  0x1fba,  0x1fbb,  0x1fc8,  0x1fc9,  0x1fca,  0x1fcb,  0x1fda,  0x1fdb,  0x1ff8,  0x1ff9,  0x1fea,  0x1feb,  0x1ffa,  0x1ffb,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fb8,  0x1fb9,  0x1fbc,  0x399,  0x1fcc,  0x1fd8,  0x1fd9,  0x1fe8,  0x1fe9,  0x1fec,  0x1ffc,  0x2132,  0x2160,  0x2161,  0x2162,  0x2163,  0x2164,  0x2165,  0x2166,  0x2167,  0x2168,  0x2169,  0x216a,  0x216b,  0x216c,  0x216d,  0x216e,  0x216f,  0x2183,  0x24b6,  0x24b7,  0x24b8,  0x24b9,  0x24ba,  0x24bb,  0x24bc,  0x24bd,  0x24be,  0x24bf,  0x24c0,  0x24c1,  0x24c2,  0x24c3,  0x24c4,  0x24c5,  0x24c6,  0x24c7,  0x24c8,  0x24c9,  0x24ca,  0x24cb,  0x24cc,  0x24cd,  0x24ce,  0x24cf,  0x2c00,  0x2c01,  0x2c02,  0x2c03,  0x2c04,  0x2c05,  0x2c06,  0x2c07,  0x2c08,  0x2c09,  0x2c0a,  0x2c0b,  0x2c0c,  0x2c0d,  0x2c0e,  0x2c0f,  0x2c10,  0x2c11,  0x2c12,  0x2c13,  0x2c14,  0x2c15,  0x2c16,  0x2c17,  0x2c18,  0x2c19,  0x2c1a,  0x2c1b,  0x2c1c,  0x2c1d,  0x2c1e,  0x2c1f,  0x2c20,  0x2c21,  0x2c22,  0x2c23,  0x2c24,  0x2c25,  0x2c26,  0x2c27,  0x2c28,  0x2c29,  0x2c2a,  0x2c2b,  0x2c2c,  0x2c2d,  0x2c2e,  0x2c60,  0x23a,  0x23e,  0x2c67,  0x2c69,  0x2c6b,  0x2c72,  0x2c75,  0x2c80,  0x2c82,  0x2c84,  0x2c86,  0x2c88,  0x2c8a,  0x2c8c,  0x2c8e,  0x2c90,  0x2c92,  0x2c94,  0x2c96,  0x2c98,  0x2c9a,  0x2c9c,  0x2c9e,  0x2ca0,  0x2ca2,  0x2ca4,  0x2ca6,  0x2ca8,  0x2caa,  0x2cac,  0x2cae,  0x2cb0,  0x2cb2,  0x2cb4,  0x2cb6,  0x2cb8,  0x2cba,  0x2cbc,  0x2cbe,  0x2cc0,  0x2cc2,  0x2cc4,  0x2cc6,  0x2cc8,  0x2cca,  0x2ccc,  0x2cce,  0x2cd0,  0x2cd2,  0x2cd4,  0x2cd6,  0x2cd8,  0x2cda,  0x2cdc,  0x2cde,  0x2ce0,  0x2ce2,  0x2ceb,  0x2ced,  0x2cf2,  0x10a0,  0x10a1,  0x10a2,  0x10a3,  0x10a4,  0x10a5,  0x10a6,  0x10a7,  0x10a8,  0x10a9,  0x10aa,  0x10ab,  0x10ac,  0x10ad,  0x10ae,  0x10af,  0x10b0,  0x10b1,  0x10b2,  0x10b3,  0x10b4,  0x10b5,  0x10b6,  0x10b7,  0x10b8,  0x10b9,  0x10ba,  0x10bb,  0x10bc,  0x10bd,  0x10be,  0x10bf,  0x10c0,  0x10c1,  0x10c2,  0x10c3,  0x10c4,  0x10c5,  0x10c7,  0x10cd,  0xa640,  0xa642,  0xa644,  0xa646,  0xa648,  0xa64a,  0xa64c,  0xa64e,  0xa650,  0xa652,  0xa654,  0xa656,  0xa658,  0xa65a,  0xa65c,  0xa65e,  0xa660,  0xa662,  0xa664,  0xa666,  0xa668,  0xa66a,  0xa66c,  0xa680,  0xa682,  0xa684,  0xa686,  0xa688,  0xa68a,  0xa68c,  0xa68e,  0xa690,  0xa692,  0xa694,  0xa696,  0xa722,  0xa724,  0xa726,  0xa728,  0xa72a,  0xa72c,  0xa72e,  0xa732,  0xa734,  0xa736,  0xa738,  0xa73a,  0xa73c,  0xa73e,  0xa740,  0xa742,  0xa744,  0xa746,  0xa748,  0xa74a,  0xa74c,  0xa74e,  0xa750,  0xa752,  0xa754,  0xa756,  0xa758,  0xa75a,  0xa75c,  0xa75e,  0xa760,  0xa762,  0xa764,  0xa766,  0xa768,  0xa76a,  0xa76c,  0xa76e,  0xa779,  0xa77b,  0xa77e,  0xa780,  0xa782,  0xa784,  0xa786,  0xa78b,  0xa790,  0xa792,  0xa7a0,  0xa7a2,  0xa7a4,  0xa7a6,  0xa7a8,  0xff21,  0xff22,  0xff23,  0xff24,  0xff25,  0xff26,  0xff27,  0xff28,  0xff29,  0xff2a,  0xff2b,  0xff2c,  0xff2d,  0xff2e,  0xff2f,  0xff30,  0xff31,  0xff32,  0xff33,  0xff34,  0xff35,  0xff36,  0xff37,  0xff38,  0xff39,  0xff3a,  0x10400,  0x10401,  0x10402,  0x10403,  0x10404,  0x10405,  0x10406,  0x10407,  0x10408,  0x10409,  0x1040a,  0x1040b,  0x1040c,  0x1040d,  0x1040e,  0x1040f,  0x10410,  0x10411,  0x10412,  0x10413,  0x10414,  0x10415,  0x10416,  0x10417,  0x10418,  0x10419,  0x1041a,  0x1041b,  0x1041c,  0x1041d,  0x1041e,  0x1041f,  0x10420,  0x10421,  0x10422,  0x10423,  0x10424,  0x10425,  0x10426,  0x10427,  0x2000053,  0x53,  0x130,  0x2000046,  0x46,  0x2000046,  0x49,  0x2000046,  0x4c,  0x3000046,  0x46,  0x49,  0x3000046,  0x46,  0x4c,  0x2000053,  0x54,  0x2000053,  0x54,  0x2000535,  0x552,  0x2000544,  0x546,  0x2000544,  0x535,  0x2000544,  0x53b,  0x200054e,  0x546,  0x2000544,  0x53d,  0x20002bc,  0x4e,  0x3000399,  0x308,  0x301,  0x30003a5,  0x308,  0x301,  0x200004a,  0x30c,  0x2000048,  0x331,  0x2000054,  0x308,  0x2000057,  0x30a,  0x2000059,  0x30a,  0x2000041,  0x2be,  0x20003a5,  0x313,  0x30003a5,  0x313,  0x300,  0x30003a5,  0x313,  0x301,  0x30003a5,  0x313,  0x342,  0x2000391,  0x342,  0x2000397,  0x342,  0x3000399,  0x308,  0x300,  0x3000399,  0x308,  0x301,  0x2000399,  0x342,  0x3000399,  0x308,  0x342,  0x30003a5,  0x308,  0x300,  0x30003a5,  0x308,  0x301,  0x20003a1,  0x313,  0x20003a5,  0x342,  0x30003a5,  0x308,  0x342,  0x20003a9,  0x342,  0x2001f08,  0x399,  0x2001f09,  0x399,  0x2001f0a,  0x399,  0x2001f0b,  0x399,  0x2001f0c,  0x399,  0x2001f0d,  0x399,  0x2001f0e,  0x399,  0x2001f0f,  0x399,  0x2001f08,  0x399,  0x2001f09,  0x399,  0x2001f0a,  0x399,  0x2001f0b,  0x399,  0x2001f0c,  0x399,  0x2001f0d,  0x399,  0x2001f0e,  0x399,  0x2001f0f,  0x399,  0x2001f28,  0x399,  0x2001f29,  0x399,  0x2001f2a,  0x399,  0x2001f2b,  0x399,  0x2001f2c,  0x399,  0x2001f2d,  0x399,  0x2001f2e,  0x399,  0x2001f2f,  0x399,  0x2001f28,  0x399,  0x2001f29,  0x399,  0x2001f2a,  0x399,  0x2001f2b,  0x399,  0x2001f2c,  0x399,  0x2001f2d,  0x399,  0x2001f2e,  0x399,  0x2001f2f,  0x399,  0x2001f68,  0x399,  0x2001f69,  0x399,  0x2001f6a,  0x399,  0x2001f6b,  0x399,  0x2001f6c,  0x399,  0x2001f6d,  0x399,  0x2001f6e,  0x399,  0x2001f6f,  0x399,  0x2001f68,  0x399,  0x2001f69,  0x399,  0x2001f6a,  0x399,  0x2001f6b,  0x399,  0x2001f6c,  0x399,  0x2001f6d,  0x399,  0x2001f6e,  0x399,  0x2001f6f,  0x399,  0x2000391,  0x399,  0x2000391,  0x399,  0x2000397,  0x399,  0x2000397,  0x399,  0x20003a9,  0x399,  0x20003a9,  0x399,  0x2001fba,  0x399,  0x2000386,  0x399,  0x2001fca,  0x399,  0x2000389,  0x399,  0x2001ffa,  0x399,  0x200038f,  0x399,  0x3000391,  0x342,  0x399,  0x3000397,  0x342,  0x399,  0x30003a9,  0x342,  0x399]; return t; }
++_IUA toLowerTable() { static _IUA t = [ 0x61,  0x62,  0x63,  0x64,  0x65,  0x66,  0x67,  0x68,  0x69,  0x6a,  0x6b,  0x6c,  0x6d,  0x6e,  0x6f,  0x70,  0x71,  0x72,  0x73,  0x74,  0x75,  0x76,  0x77,  0x78,  0x79,  0x7a,  0xe0,  0xe1,  0xe2,  0xe3,  0xe4,  0xe5,  0xe6,  0xe7,  0xe8,  0xe9,  0xea,  0xeb,  0xec,  0xed,  0xee,  0xef,  0xf0,  0xf1,  0xf2,  0xf3,  0xf4,  0xf5,  0xf6,  0xf8,  0xf9,  0xfa,  0xfb,  0xfc,  0xfd,  0xfe,  0x101,  0x103,  0x105,  0x107,  0x109,  0x10b,  0x10d,  0x10f,  0x111,  0x113,  0x115,  0x117,  0x119,  0x11b,  0x11d,  0x11f,  0x121,  0x123,  0x125,  0x127,  0x129,  0x12b,  0x12d,  0x12f,  0x69,  0x133,  0x135,  0x137,  0x13a,  0x13c,  0x13e,  0x140,  0x142,  0x144,  0x146,  0x148,  0x14b,  0x14d,  0x14f,  0x151,  0x153,  0x155,  0x157,  0x159,  0x15b,  0x15d,  0x15f,  0x161,  0x163,  0x165,  0x167,  0x169,  0x16b,  0x16d,  0x16f,  0x171,  0x173,  0x175,  0x177,  0xff,  0x17a,  0x17c,  0x17e,  0x253,  0x183,  0x185,  0x254,  0x188,  0x256,  0x257,  0x18c,  0x1dd,  0x259,  0x25b,  0x192,  0x260,  0x263,  0x269,  0x268,  0x199,  0x26f,  0x272,  0x275,  0x1a1,  0x1a3,  0x1a5,  0x280,  0x1a8,  0x283,  0x1ad,  0x288,  0x1b0,  0x28a,  0x28b,  0x1b4,  0x1b6,  0x292,  0x1b9,  0x1bd,  0x1c6,  0x1c6,  0x1c9,  0x1c9,  0x1cc,  0x1cc,  0x1ce,  0x1d0,  0x1d2,  0x1d4,  0x1d6,  0x1d8,  0x1da,  0x1dc,  0x1df,  0x1e1,  0x1e3,  0x1e5,  0x1e7,  0x1e9,  0x1eb,  0x1ed,  0x1ef,  0x1f3,  0x1f3,  0x1f5,  0x195,  0x1bf,  0x1f9,  0x1fb,  0x1fd,  0x1ff,  0x201,  0x203,  0x205,  0x207,  0x209,  0x20b,  0x20d,  0x20f,  0x211,  0x213,  0x215,  0x217,  0x219,  0x21b,  0x21d,  0x21f,  0x19e,  0x223,  0x225,  0x227,  0x229,  0x22b,  0x22d,  0x22f,  0x231,  0x233,  0x2c65,  0x23c,  0x19a,  0x2c66,  0x242,  0x180,  0x289,  0x28c,  0x247,  0x249,  0x24b,  0x24d,  0x24f,  0x371,  0x373,  0x377,  0x3ac,  0x3ad,  0x3ae,  0x3af,  0x3cc,  0x3cd,  0x3ce,  0x3b1,  0x3b2,  0x3b3,  0x3b4,  0x3b5,  0x3b6,  0x3b7,  0x3b8,  0x3b9,  0x3ba,  0x3bb,  0x3bc,  0x3bd,  0x3be,  0x3bf,  0x3c0,  0x3c1,  0x3c3,  0x3c4,  0x3c5,  0x3c6,  0x3c7,  0x3c8,  0x3c9,  0x3ca,  0x3cb,  0x3d7,  0x3d9,  0x3db,  0x3dd,  0x3df,  0x3e1,  0x3e3,  0x3e5,  0x3e7,  0x3e9,  0x3eb,  0x3ed,  0x3ef,  0x3b8,  0x3f8,  0x3f2,  0x3fb,  0x37b,  0x37c,  0x37d,  0x450,  0x451,  0x452,  0x453,  0x454,  0x455,  0x456,  0x457,  0x458,  0x459,  0x45a,  0x45b,  0x45c,  0x45d,  0x45e,  0x45f,  0x430,  0x431,  0x432,  0x433,  0x434,  0x435,  0x436,  0x437,  0x438,  0x439,  0x43a,  0x43b,  0x43c,  0x43d,  0x43e,  0x43f,  0x440,  0x441,  0x442,  0x443,  0x444,  0x445,  0x446,  0x447,  0x448,  0x449,  0x44a,  0x44b,  0x44c,  0x44d,  0x44e,  0x44f,  0x461,  0x463,  0x465,  0x467,  0x469,  0x46b,  0x46d,  0x46f,  0x471,  0x473,  0x475,  0x477,  0x479,  0x47b,  0x47d,  0x47f,  0x481,  0x48b,  0x48d,  0x48f,  0x491,  0x493,  0x495,  0x497,  0x499,  0x49b,  0x49d,  0x49f,  0x4a1,  0x4a3,  0x4a5,  0x4a7,  0x4a9,  0x4ab,  0x4ad,  0x4af,  0x4b1,  0x4b3,  0x4b5,  0x4b7,  0x4b9,  0x4bb,  0x4bd,  0x4bf,  0x4cf,  0x4c2,  0x4c4,  0x4c6,  0x4c8,  0x4ca,  0x4cc,  0x4ce,  0x4d1,  0x4d3,  0x4d5,  0x4d7,  0x4d9,  0x4db,  0x4dd,  0x4df,  0x4e1,  0x4e3,  0x4e5,  0x4e7,  0x4e9,  0x4eb,  0x4ed,  0x4ef,  0x4f1,  0x4f3,  0x4f5,  0x4f7,  0x4f9,  0x4fb,  0x4fd,  0x4ff,  0x501,  0x503,  0x505,  0x507,  0x509,  0x50b,  0x50d,  0x50f,  0x511,  0x513,  0x515,  0x517,  0x519,  0x51b,  0x51d,  0x51f,  0x521,  0x523,  0x525,  0x527,  0x561,  0x562,  0x563,  0x564,  0x565,  0x566,  0x567,  0x568,  0x569,  0x56a,  0x56b,  0x56c,  0x56d,  0x56e,  0x56f,  0x570,  0x571,  0x572,  0x573,  0x574,  0x575,  0x576,  0x577,  0x578,  0x579,  0x57a,  0x57b,  0x57c,  0x57d,  0x57e,  0x57f,  0x580,  0x581,  0x582,  0x583,  0x584,  0x585,  0x586,  0x2d00,  0x2d01,  0x2d02,  0x2d03,  0x2d04,  0x2d05,  0x2d06,  0x2d07,  0x2d08,  0x2d09,  0x2d0a,  0x2d0b,  0x2d0c,  0x2d0d,  0x2d0e,  0x2d0f,  0x2d10,  0x2d11,  0x2d12,  0x2d13,  0x2d14,  0x2d15,  0x2d16,  0x2d17,  0x2d18,  0x2d19,  0x2d1a,  0x2d1b,  0x2d1c,  0x2d1d,  0x2d1e,  0x2d1f,  0x2d20,  0x2d21,  0x2d22,  0x2d23,  0x2d24,  0x2d25,  0x2d27,  0x2d2d,  0x1e01,  0x1e03,  0x1e05,  0x1e07,  0x1e09,  0x1e0b,  0x1e0d,  0x1e0f,  0x1e11,  0x1e13,  0x1e15,  0x1e17,  0x1e19,  0x1e1b,  0x1e1d,  0x1e1f,  0x1e21,  0x1e23,  0x1e25,  0x1e27,  0x1e29,  0x1e2b,  0x1e2d,  0x1e2f,  0x1e31,  0x1e33,  0x1e35,  0x1e37,  0x1e39,  0x1e3b,  0x1e3d,  0x1e3f,  0x1e41,  0x1e43,  0x1e45,  0x1e47,  0x1e49,  0x1e4b,  0x1e4d,  0x1e4f,  0x1e51,  0x1e53,  0x1e55,  0x1e57,  0x1e59,  0x1e5b,  0x1e5d,  0x1e5f,  0x1e61,  0x1e63,  0x1e65,  0x1e67,  0x1e69,  0x1e6b,  0x1e6d,  0x1e6f,  0x1e71,  0x1e73,  0x1e75,  0x1e77,  0x1e79,  0x1e7b,  0x1e7d,  0x1e7f,  0x1e81,  0x1e83,  0x1e85,  0x1e87,  0x1e89,  0x1e8b,  0x1e8d,  0x1e8f,  0x1e91,  0x1e93,  0x1e95,  0xdf,  0x1ea1,  0x1ea3,  0x1ea5,  0x1ea7,  0x1ea9,  0x1eab,  0x1ead,  0x1eaf,  0x1eb1,  0x1eb3,  0x1eb5,  0x1eb7,  0x1eb9,  0x1ebb,  0x1ebd,  0x1ebf,  0x1ec1,  0x1ec3,  0x1ec5,  0x1ec7,  0x1ec9,  0x1ecb,  0x1ecd,  0x1ecf,  0x1ed1,  0x1ed3,  0x1ed5,  0x1ed7,  0x1ed9,  0x1edb,  0x1edd,  0x1edf,  0x1ee1,  0x1ee3,  0x1ee5,  0x1ee7,  0x1ee9,  0x1eeb,  0x1eed,  0x1eef,  0x1ef1,  0x1ef3,  0x1ef5,  0x1ef7,  0x1ef9,  0x1efb,  0x1efd,  0x1eff,  0x1f00,  0x1f01,  0x1f02,  0x1f03,  0x1f04,  0x1f05,  0x1f06,  0x1f07,  0x1f10,  0x1f11,  0x1f12,  0x1f13,  0x1f14,  0x1f15,  0x1f20,  0x1f21,  0x1f22,  0x1f23,  0x1f24,  0x1f25,  0x1f26,  0x1f27,  0x1f30,  0x1f31,  0x1f32,  0x1f33,  0x1f34,  0x1f35,  0x1f36,  0x1f37,  0x1f40,  0x1f41,  0x1f42,  0x1f43,  0x1f44,  0x1f45,  0x1f51,  0x1f53,  0x1f55,  0x1f57,  0x1f60,  0x1f61,  0x1f62,  0x1f63,  0x1f64,  0x1f65,  0x1f66,  0x1f67,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fb0,  0x1fb1,  0x1f70,  0x1f71,  0x1fb3,  0x1f72,  0x1f73,  0x1f74,  0x1f75,  0x1fc3,  0x1fd0,  0x1fd1,  0x1f76,  0x1f77,  0x1fe0,  0x1fe1,  0x1f7a,  0x1f7b,  0x1fe5,  0x1f78,  0x1f79,  0x1f7c,  0x1f7d,  0x1ff3,  0x3c9,  0x6b,  0xe5,  0x214e,  0x2170,  0x2171,  0x2172,  0x2173,  0x2174,  0x2175,  0x2176,  0x2177,  0x2178,  0x2179,  0x217a,  0x217b,  0x217c,  0x217d,  0x217e,  0x217f,  0x2184,  0x24d0,  0x24d1,  0x24d2,  0x24d3,  0x24d4,  0x24d5,  0x24d6,  0x24d7,  0x24d8,  0x24d9,  0x24da,  0x24db,  0x24dc,  0x24dd,  0x24de,  0x24df,  0x24e0,  0x24e1,  0x24e2,  0x24e3,  0x24e4,  0x24e5,  0x24e6,  0x24e7,  0x24e8,  0x24e9,  0x2c30,  0x2c31,  0x2c32,  0x2c33,  0x2c34,  0x2c35,  0x2c36,  0x2c37,  0x2c38,  0x2c39,  0x2c3a,  0x2c3b,  0x2c3c,  0x2c3d,  0x2c3e,  0x2c3f,  0x2c40,  0x2c41,  0x2c42,  0x2c43,  0x2c44,  0x2c45,  0x2c46,  0x2c47,  0x2c48,  0x2c49,  0x2c4a,  0x2c4b,  0x2c4c,  0x2c4d,  0x2c4e,  0x2c4f,  0x2c50,  0x2c51,  0x2c52,  0x2c53,  0x2c54,  0x2c55,  0x2c56,  0x2c57,  0x2c58,  0x2c59,  0x2c5a,  0x2c5b,  0x2c5c,  0x2c5d,  0x2c5e,  0x2c61,  0x26b,  0x1d7d,  0x27d,  0x2c68,  0x2c6a,  0x2c6c,  0x251,  0x271,  0x250,  0x252,  0x2c73,  0x2c76,  0x23f,  0x240,  0x2c81,  0x2c83,  0x2c85,  0x2c87,  0x2c89,  0x2c8b,  0x2c8d,  0x2c8f,  0x2c91,  0x2c93,  0x2c95,  0x2c97,  0x2c99,  0x2c9b,  0x2c9d,  0x2c9f,  0x2ca1,  0x2ca3,  0x2ca5,  0x2ca7,  0x2ca9,  0x2cab,  0x2cad,  0x2caf,  0x2cb1,  0x2cb3,  0x2cb5,  0x2cb7,  0x2cb9,  0x2cbb,  0x2cbd,  0x2cbf,  0x2cc1,  0x2cc3,  0x2cc5,  0x2cc7,  0x2cc9,  0x2ccb,  0x2ccd,  0x2ccf,  0x2cd1,  0x2cd3,  0x2cd5,  0x2cd7,  0x2cd9,  0x2cdb,  0x2cdd,  0x2cdf,  0x2ce1,  0x2ce3,  0x2cec,  0x2cee,  0x2cf3,  0xa641,  0xa643,  0xa645,  0xa647,  0xa649,  0xa64b,  0xa64d,  0xa64f,  0xa651,  0xa653,  0xa655,  0xa657,  0xa659,  0xa65b,  0xa65d,  0xa65f,  0xa661,  0xa663,  0xa665,  0xa667,  0xa669,  0xa66b,  0xa66d,  0xa681,  0xa683,  0xa685,  0xa687,  0xa689,  0xa68b,  0xa68d,  0xa68f,  0xa691,  0xa693,  0xa695,  0xa697,  0xa723,  0xa725,  0xa727,  0xa729,  0xa72b,  0xa72d,  0xa72f,  0xa733,  0xa735,  0xa737,  0xa739,  0xa73b,  0xa73d,  0xa73f,  0xa741,  0xa743,  0xa745,  0xa747,  0xa749,  0xa74b,  0xa74d,  0xa74f,  0xa751,  0xa753,  0xa755,  0xa757,  0xa759,  0xa75b,  0xa75d,  0xa75f,  0xa761,  0xa763,  0xa765,  0xa767,  0xa769,  0xa76b,  0xa76d,  0xa76f,  0xa77a,  0xa77c,  0x1d79,  0xa77f,  0xa781,  0xa783,  0xa785,  0xa787,  0xa78c,  0x265,  0xa791,  0xa793,  0xa7a1,  0xa7a3,  0xa7a5,  0xa7a7,  0xa7a9,  0x266,  0xff41,  0xff42,  0xff43,  0xff44,  0xff45,  0xff46,  0xff47,  0xff48,  0xff49,  0xff4a,  0xff4b,  0xff4c,  0xff4d,  0xff4e,  0xff4f,  0xff50,  0xff51,  0xff52,  0xff53,  0xff54,  0xff55,  0xff56,  0xff57,  0xff58,  0xff59,  0xff5a,  0x10428,  0x10429,  0x1042a,  0x1042b,  0x1042c,  0x1042d,  0x1042e,  0x1042f,  0x10430,  0x10431,  0x10432,  0x10433,  0x10434,  0x10435,  0x10436,  0x10437,  0x10438,  0x10439,  0x1043a,  0x1043b,  0x1043c,  0x1043d,  0x1043e,  0x1043f,  0x10440,  0x10441,  0x10442,  0x10443,  0x10444,  0x10445,  0x10446,  0x10447,  0x10448,  0x10449,  0x1044a,  0x1044b,  0x1044c,  0x1044d,  0x1044e,  0x1044f,  0xdf,  0x2000069,  0x307,  0xfb00,  0xfb01,  0xfb02,  0xfb03,  0xfb04,  0xfb05,  0xfb06,  0x587,  0xfb13,  0xfb14,  0xfb15,  0xfb16,  0xfb17,  0x149,  0x390,  0x3b0,  0x1f0,  0x1e96,  0x1e97,  0x1e98,  0x1e99,  0x1e9a,  0x1f50,  0x1f52,  0x1f54,  0x1f56,  0x1fb6,  0x1fc6,  0x1fd2,  0x1fd3,  0x1fd6,  0x1fd7,  0x1fe2,  0x1fe3,  0x1fe4,  0x1fe6,  0x1fe7,  0x1ff6,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fb3,  0x1fb3,  0x1fc3,  0x1fc3,  0x1ff3,  0x1ff3,  0x1fb2,  0x1fb4,  0x1fc2,  0x1fc4,  0x1ff2,  0x1ff4,  0x1fb7,  0x1fc7,  0x1ff7]; return t; }
++_IUA toTitleTable() { static _IUA t = [ 0x41,  0x42,  0x43,  0x44,  0x45,  0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d,  0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0x55,  0x56,  0x57,  0x58,  0x59,  0x5a,  0x39c,  0xc0,  0xc1,  0xc2,  0xc3,  0xc4,  0xc5,  0xc6,  0xc7,  0xc8,  0xc9,  0xca,  0xcb,  0xcc,  0xcd,  0xce,  0xcf,  0xd0,  0xd1,  0xd2,  0xd3,  0xd4,  0xd5,  0xd6,  0xd8,  0xd9,  0xda,  0xdb,  0xdc,  0xdd,  0xde,  0x178,  0x100,  0x102,  0x104,  0x106,  0x108,  0x10a,  0x10c,  0x10e,  0x110,  0x112,  0x114,  0x116,  0x118,  0x11a,  0x11c,  0x11e,  0x120,  0x122,  0x124,  0x126,  0x128,  0x12a,  0x12c,  0x12e,  0x49,  0x132,  0x134,  0x136,  0x139,  0x13b,  0x13d,  0x13f,  0x141,  0x143,  0x145,  0x147,  0x14a,  0x14c,  0x14e,  0x150,  0x152,  0x154,  0x156,  0x158,  0x15a,  0x15c,  0x15e,  0x160,  0x162,  0x164,  0x166,  0x168,  0x16a,  0x16c,  0x16e,  0x170,  0x172,  0x174,  0x176,  0x179,  0x17b,  0x17d,  0x53,  0x243,  0x182,  0x184,  0x187,  0x18b,  0x191,  0x1f6,  0x198,  0x23d,  0x220,  0x1a0,  0x1a2,  0x1a4,  0x1a7,  0x1ac,  0x1af,  0x1b3,  0x1b5,  0x1b8,  0x1bc,  0x1f7,  0x1c5,  0x1c5,  0x1c5,  0x1c8,  0x1c8,  0x1c8,  0x1cb,  0x1cb,  0x1cb,  0x1cd,  0x1cf,  0x1d1,  0x1d3,  0x1d5,  0x1d7,  0x1d9,  0x1db,  0x18e,  0x1de,  0x1e0,  0x1e2,  0x1e4,  0x1e6,  0x1e8,  0x1ea,  0x1ec,  0x1ee,  0x1f2,  0x1f2,  0x1f2,  0x1f4,  0x1f8,  0x1fa,  0x1fc,  0x1fe,  0x200,  0x202,  0x204,  0x206,  0x208,  0x20a,  0x20c,  0x20e,  0x210,  0x212,  0x214,  0x216,  0x218,  0x21a,  0x21c,  0x21e,  0x222,  0x224,  0x226,  0x228,  0x22a,  0x22c,  0x22e,  0x230,  0x232,  0x23b,  0x2c7e,  0x2c7f,  0x241,  0x246,  0x248,  0x24a,  0x24c,  0x24e,  0x2c6f,  0x2c6d,  0x2c70,  0x181,  0x186,  0x189,  0x18a,  0x18f,  0x190,  0x193,  0x194,  0xa78d,  0xa7aa,  0x197,  0x196,  0x2c62,  0x19c,  0x2c6e,  0x19d,  0x19f,  0x2c64,  0x1a6,  0x1a9,  0x1ae,  0x244,  0x1b1,  0x1b2,  0x245,  0x1b7,  0x399,  0x370,  0x372,  0x376,  0x3fd,  0x3fe,  0x3ff,  0x386,  0x388,  0x389,  0x38a,  0x391,  0x392,  0x393,  0x394,  0x395,  0x396,  0x397,  0x398,  0x399,  0x39a,  0x39b,  0x39c,  0x39d,  0x39e,  0x39f,  0x3a0,  0x3a1,  0x3a3,  0x3a3,  0x3a4,  0x3a5,  0x3a6,  0x3a7,  0x3a8,  0x3a9,  0x3aa,  0x3ab,  0x38c,  0x38e,  0x38f,  0x392,  0x398,  0x3a6,  0x3a0,  0x3cf,  0x3d8,  0x3da,  0x3dc,  0x3de,  0x3e0,  0x3e2,  0x3e4,  0x3e6,  0x3e8,  0x3ea,  0x3ec,  0x3ee,  0x39a,  0x3a1,  0x3f9,  0x395,  0x3f7,  0x3fa,  0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,  0x418,  0x419,  0x41a,  0x41b,  0x41c,  0x41d,  0x41e,  0x41f,  0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,  0x428,  0x429,  0x42a,  0x42b,  0x42c,  0x42d,  0x42e,  0x42f,  0x400,  0x401,  0x402,  0x403,  0x404,  0x405,  0x406,  0x407,  0x408,  0x409,  0x40a,  0x40b,  0x40c,  0x40d,  0x40e,  0x40f,  0x460,  0x462,  0x464,  0x466,  0x468,  0x46a,  0x46c,  0x46e,  0x470,  0x472,  0x474,  0x476,  0x478,  0x47a,  0x47c,  0x47e,  0x480,  0x48a,  0x48c,  0x48e,  0x490,  0x492,  0x494,  0x496,  0x498,  0x49a,  0x49c,  0x49e,  0x4a0,  0x4a2,  0x4a4,  0x4a6,  0x4a8,  0x4aa,  0x4ac,  0x4ae,  0x4b0,  0x4b2,  0x4b4,  0x4b6,  0x4b8,  0x4ba,  0x4bc,  0x4be,  0x4c1,  0x4c3,  0x4c5,  0x4c7,  0x4c9,  0x4cb,  0x4cd,  0x4c0,  0x4d0,  0x4d2,  0x4d4,  0x4d6,  0x4d8,  0x4da,  0x4dc,  0x4de,  0x4e0,  0x4e2,  0x4e4,  0x4e6,  0x4e8,  0x4ea,  0x4ec,  0x4ee,  0x4f0,  0x4f2,  0x4f4,  0x4f6,  0x4f8,  0x4fa,  0x4fc,  0x4fe,  0x500,  0x502,  0x504,  0x506,  0x508,  0x50a,  0x50c,  0x50e,  0x510,  0x512,  0x514,  0x516,  0x518,  0x51a,  0x51c,  0x51e,  0x520,  0x522,  0x524,  0x526,  0x531,  0x532,  0x533,  0x534,  0x535,  0x536,  0x537,  0x538,  0x539,  0x53a,  0x53b,  0x53c,  0x53d,  0x53e,  0x53f,  0x540,  0x541,  0x542,  0x543,  0x544,  0x545,  0x546,  0x547,  0x548,  0x549,  0x54a,  0x54b,  0x54c,  0x54d,  0x54e,  0x54f,  0x550,  0x551,  0x552,  0x553,  0x554,  0x555,  0x556,  0xa77d,  0x2c63,  0x1e00,  0x1e02,  0x1e04,  0x1e06,  0x1e08,  0x1e0a,  0x1e0c,  0x1e0e,  0x1e10,  0x1e12,  0x1e14,  0x1e16,  0x1e18,  0x1e1a,  0x1e1c,  0x1e1e,  0x1e20,  0x1e22,  0x1e24,  0x1e26,  0x1e28,  0x1e2a,  0x1e2c,  0x1e2e,  0x1e30,  0x1e32,  0x1e34,  0x1e36,  0x1e38,  0x1e3a,  0x1e3c,  0x1e3e,  0x1e40,  0x1e42,  0x1e44,  0x1e46,  0x1e48,  0x1e4a,  0x1e4c,  0x1e4e,  0x1e50,  0x1e52,  0x1e54,  0x1e56,  0x1e58,  0x1e5a,  0x1e5c,  0x1e5e,  0x1e60,  0x1e62,  0x1e64,  0x1e66,  0x1e68,  0x1e6a,  0x1e6c,  0x1e6e,  0x1e70,  0x1e72,  0x1e74,  0x1e76,  0x1e78,  0x1e7a,  0x1e7c,  0x1e7e,  0x1e80,  0x1e82,  0x1e84,  0x1e86,  0x1e88,  0x1e8a,  0x1e8c,  0x1e8e,  0x1e90,  0x1e92,  0x1e94,  0x1e60,  0x1ea0,  0x1ea2,  0x1ea4,  0x1ea6,  0x1ea8,  0x1eaa,  0x1eac,  0x1eae,  0x1eb0,  0x1eb2,  0x1eb4,  0x1eb6,  0x1eb8,  0x1eba,  0x1ebc,  0x1ebe,  0x1ec0,  0x1ec2,  0x1ec4,  0x1ec6,  0x1ec8,  0x1eca,  0x1ecc,  0x1ece,  0x1ed0,  0x1ed2,  0x1ed4,  0x1ed6,  0x1ed8,  0x1eda,  0x1edc,  0x1ede,  0x1ee0,  0x1ee2,  0x1ee4,  0x1ee6,  0x1ee8,  0x1eea,  0x1eec,  0x1eee,  0x1ef0,  0x1ef2,  0x1ef4,  0x1ef6,  0x1ef8,  0x1efa,  0x1efc,  0x1efe,  0x1f08,  0x1f09,  0x1f0a,  0x1f0b,  0x1f0c,  0x1f0d,  0x1f0e,  0x1f0f,  0x1f18,  0x1f19,  0x1f1a,  0x1f1b,  0x1f1c,  0x1f1d,  0x1f28,  0x1f29,  0x1f2a,  0x1f2b,  0x1f2c,  0x1f2d,  0x1f2e,  0x1f2f,  0x1f38,  0x1f39,  0x1f3a,  0x1f3b,  0x1f3c,  0x1f3d,  0x1f3e,  0x1f3f,  0x1f48,  0x1f49,  0x1f4a,  0x1f4b,  0x1f4c,  0x1f4d,  0x1f59,  0x1f5b,  0x1f5d,  0x1f5f,  0x1f68,  0x1f69,  0x1f6a,  0x1f6b,  0x1f6c,  0x1f6d,  0x1f6e,  0x1f6f,  0x1fba,  0x1fbb,  0x1fc8,  0x1fc9,  0x1fca,  0x1fcb,  0x1fda,  0x1fdb,  0x1ff8,  0x1ff9,  0x1fea,  0x1feb,  0x1ffa,  0x1ffb,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fb8,  0x1fb9,  0x1fbc,  0x399,  0x1fcc,  0x1fd8,  0x1fd9,  0x1fe8,  0x1fe9,  0x1fec,  0x1ffc,  0x2132,  0x2160,  0x2161,  0x2162,  0x2163,  0x2164,  0x2165,  0x2166,  0x2167,  0x2168,  0x2169,  0x216a,  0x216b,  0x216c,  0x216d,  0x216e,  0x216f,  0x2183,  0x24b6,  0x24b7,  0x24b8,  0x24b9,  0x24ba,  0x24bb,  0x24bc,  0x24bd,  0x24be,  0x24bf,  0x24c0,  0x24c1,  0x24c2,  0x24c3,  0x24c4,  0x24c5,  0x24c6,  0x24c7,  0x24c8,  0x24c9,  0x24ca,  0x24cb,  0x24cc,  0x24cd,  0x24ce,  0x24cf,  0x2c00,  0x2c01,  0x2c02,  0x2c03,  0x2c04,  0x2c05,  0x2c06,  0x2c07,  0x2c08,  0x2c09,  0x2c0a,  0x2c0b,  0x2c0c,  0x2c0d,  0x2c0e,  0x2c0f,  0x2c10,  0x2c11,  0x2c12,  0x2c13,  0x2c14,  0x2c15,  0x2c16,  0x2c17,  0x2c18,  0x2c19,  0x2c1a,  0x2c1b,  0x2c1c,  0x2c1d,  0x2c1e,  0x2c1f,  0x2c20,  0x2c21,  0x2c22,  0x2c23,  0x2c24,  0x2c25,  0x2c26,  0x2c27,  0x2c28,  0x2c29,  0x2c2a,  0x2c2b,  0x2c2c,  0x2c2d,  0x2c2e,  0x2c60,  0x23a,  0x23e,  0x2c67,  0x2c69,  0x2c6b,  0x2c72,  0x2c75,  0x2c80,  0x2c82,  0x2c84,  0x2c86,  0x2c88,  0x2c8a,  0x2c8c,  0x2c8e,  0x2c90,  0x2c92,  0x2c94,  0x2c96,  0x2c98,  0x2c9a,  0x2c9c,  0x2c9e,  0x2ca0,  0x2ca2,  0x2ca4,  0x2ca6,  0x2ca8,  0x2caa,  0x2cac,  0x2cae,  0x2cb0,  0x2cb2,  0x2cb4,  0x2cb6,  0x2cb8,  0x2cba,  0x2cbc,  0x2cbe,  0x2cc0,  0x2cc2,  0x2cc4,  0x2cc6,  0x2cc8,  0x2cca,  0x2ccc,  0x2cce,  0x2cd0,  0x2cd2,  0x2cd4,  0x2cd6,  0x2cd8,  0x2cda,  0x2cdc,  0x2cde,  0x2ce0,  0x2ce2,  0x2ceb,  0x2ced,  0x2cf2,  0x10a0,  0x10a1,  0x10a2,  0x10a3,  0x10a4,  0x10a5,  0x10a6,  0x10a7,  0x10a8,  0x10a9,  0x10aa,  0x10ab,  0x10ac,  0x10ad,  0x10ae,  0x10af,  0x10b0,  0x10b1,  0x10b2,  0x10b3,  0x10b4,  0x10b5,  0x10b6,  0x10b7,  0x10b8,  0x10b9,  0x10ba,  0x10bb,  0x10bc,  0x10bd,  0x10be,  0x10bf,  0x10c0,  0x10c1,  0x10c2,  0x10c3,  0x10c4,  0x10c5,  0x10c7,  0x10cd,  0xa640,  0xa642,  0xa644,  0xa646,  0xa648,  0xa64a,  0xa64c,  0xa64e,  0xa650,  0xa652,  0xa654,  0xa656,  0xa658,  0xa65a,  0xa65c,  0xa65e,  0xa660,  0xa662,  0xa664,  0xa666,  0xa668,  0xa66a,  0xa66c,  0xa680,  0xa682,  0xa684,  0xa686,  0xa688,  0xa68a,  0xa68c,  0xa68e,  0xa690,  0xa692,  0xa694,  0xa696,  0xa722,  0xa724,  0xa726,  0xa728,  0xa72a,  0xa72c,  0xa72e,  0xa732,  0xa734,  0xa736,  0xa738,  0xa73a,  0xa73c,  0xa73e,  0xa740,  0xa742,  0xa744,  0xa746,  0xa748,  0xa74a,  0xa74c,  0xa74e,  0xa750,  0xa752,  0xa754,  0xa756,  0xa758,  0xa75a,  0xa75c,  0xa75e,  0xa760,  0xa762,  0xa764,  0xa766,  0xa768,  0xa76a,  0xa76c,  0xa76e,  0xa779,  0xa77b,  0xa77e,  0xa780,  0xa782,  0xa784,  0xa786,  0xa78b,  0xa790,  0xa792,  0xa7a0,  0xa7a2,  0xa7a4,  0xa7a6,  0xa7a8,  0xff21,  0xff22,  0xff23,  0xff24,  0xff25,  0xff26,  0xff27,  0xff28,  0xff29,  0xff2a,  0xff2b,  0xff2c,  0xff2d,  0xff2e,  0xff2f,  0xff30,  0xff31,  0xff32,  0xff33,  0xff34,  0xff35,  0xff36,  0xff37,  0xff38,  0xff39,  0xff3a,  0x10400,  0x10401,  0x10402,  0x10403,  0x10404,  0x10405,  0x10406,  0x10407,  0x10408,  0x10409,  0x1040a,  0x1040b,  0x1040c,  0x1040d,  0x1040e,  0x1040f,  0x10410,  0x10411,  0x10412,  0x10413,  0x10414,  0x10415,  0x10416,  0x10417,  0x10418,  0x10419,  0x1041a,  0x1041b,  0x1041c,  0x1041d,  0x1041e,  0x1041f,  0x10420,  0x10421,  0x10422,  0x10423,  0x10424,  0x10425,  0x10426,  0x10427,  0x2000053,  0x73,  0x130,  0x2000046,  0x66,  0x2000046,  0x69,  0x2000046,  0x6c,  0x3000046,  0x66,  0x69,  0x3000046,  0x66,  0x6c,  0x2000053,  0x74,  0x2000053,  0x74,  0x2000535,  0x582,  0x2000544,  0x576,  0x2000544,  0x565,  0x2000544,  0x56b,  0x200054e,  0x576,  0x2000544,  0x56d,  0x20002bc,  0x4e,  0x3000399,  0x308,  0x301,  0x30003a5,  0x308,  0x301,  0x200004a,  0x30c,  0x2000048,  0x331,  0x2000054,  0x308,  0x2000057,  0x30a,  0x2000059,  0x30a,  0x2000041,  0x2be,  0x20003a5,  0x313,  0x30003a5,  0x313,  0x300,  0x30003a5,  0x313,  0x301,  0x30003a5,  0x313,  0x342,  0x2000391,  0x342,  0x2000397,  0x342,  0x3000399,  0x308,  0x300,  0x3000399,  0x308,  0x301,  0x2000399,  0x342,  0x3000399,  0x308,  0x342,  0x30003a5,  0x308,  0x300,  0x30003a5,  0x308,  0x301,  0x20003a1,  0x313,  0x20003a5,  0x342,  0x30003a5,  0x308,  0x342,  0x20003a9,  0x342,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fbc,  0x1fbc,  0x1fcc,  0x1fcc,  0x1ffc,  0x1ffc,  0x2001fba,  0x345,  0x2000386,  0x345,  0x2001fca,  0x345,  0x2000389,  0x345,  0x2001ffa,  0x345,  0x200038f,  0x345,  0x3000391,  0x342,  0x345,  0x3000397,  0x342,  0x345,  0x30003a9,  0x342,  0x345]; return t; }
++}
++
++}
++
++
++static if(size_t.sizeof == 4) {
++//1536 bytes
++enum lowerCaseTrieEntries = TrieEntry!(bool, 8, 4, 9)([ 0x0,  0x40,  0x80], [ 0x100,  0x80,  0x2000], [ 0x2020100,  0x4020302,  0x2020205,  0x2060202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x50004,  0x30006,  0x30007,  0x30003,  0x30008,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x90003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0xa0003,  0xb0003,  0x30003,  0x3000c,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0xe000d,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x0,  0x0,  0x0,  0x7fffffe,  0x0,  0x4200400,  0x80000000,  0xff7fffff,  0xaaaaaaaa,  0x55aaaaaa,  0xaaaaab55,  0xd4aaaaaa,  0x4e243129,  0xe6512d2a,  0xb5555240,  0xaa29aaaa,  0xaaaaaaaa,  0x93faaaaa,  0xffffaa85,  0xffffffff,  0xffefffff,  0x1ffffff,  0x3,  0x1f,  0x0,  0x0,  0x20,  0x3c8a0000,  0x10000,  0xfffff000,  0xaae37fff,  0x192faaaa,  0x0,  0xffff0000,  0xffffffff,  0xaaaaaaaa,  0xaaaaa802,  0xaaaaaaaa,  0xaaaad554,  0xaaaaaaaa,  0xaaaaaaaa,  0xaa,  0x0,  0xfffffffe,  0xff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x0,  0x0,  0xaaaaaaaa,  0xaaaaaaaa,  0xaaaaaaaa,  0xaaaaaaaa,  0xbfeaaaaa,  0xaaaaaaaa,  0xaaaaaaaa,  0xaaaaaaaa,  0x3f00ff,  0xff00ff,  0xff003f,  0x3fff00ff,  0xff00ff,  0x40df00ff,  0xcf00dc,  0xdc00ff,  0x0,  0x0,  0x0,  0x80020000,  0x1fff0000,  0x0,  0x0,  0x0,  0x8c400,  0x32108000,  0x43c0,  0xffff0000,  0x10,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0x3ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0x7fffffff,  0x3fda1562,  0xaaaaaaaa,  0xaaaaaaaa,  0xaaaaaaaa,  0x8501a,  0xffffffff,  0x20bf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xaaaaaaaa,  0x2aaa,  0xaaaaaa,  0x0,  0x0,  0x0,  0x0,  0xaaabaaa8,  0xaaaaaaaa,  0x95ffaaaa,  0xa50aa,  0x2aa,  0x0,  0x7000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf8007f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7fffffe,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffff00,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfc000000,  0xfffff,  0xffdfc000,  0xff,  0xffffffc,  0xebc00000,  0xffef,  0xfffffc00,  0xc000000f,  0xffffff,  0xfffc0000,  0xfff,  0xffffffc0,  0xfc000000,  0xfffff,  0xffffc000,  0xff,  0xffffffc,  0xffc00000,  0xffff,  0xfffffc00,  0x3f,  0xf7fffffc,  0xf0000003,  0xfdfffff,  0xffc00000,  0x3f7fff,  0xffff0000,  0xfdff,  0xfffffc00,  0xbf7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//1472 bytes
++enum upperCaseTrieEntries = TrieEntry!(bool, 8, 4, 9)([ 0x0,  0x40,  0x80], [ 0x100,  0x80,  0x1e00], [ 0x2020100,  0x4020302,  0x2020205,  0x2060202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x30003,  0x30003,  0x30004,  0x30003,  0x30003,  0x50003,  0x30006,  0x30007,  0x30003,  0x30008,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x90003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0xa0003,  0x30003,  0x3000b,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0xd000c,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x30003,  0x0,  0x0,  0x7fffffe,  0x0,  0x0,  0x0,  0x7f7fffff,  0x0,  0x55555555,  0xaa555555,  0x555554aa,  0x2b555555,  0xb1dbced6,  0x11aed2d5,  0x4aaaa490,  0x55d25555,  0x55555555,  0x6c055555,  0x557a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x450000,  0xfffed740,  0xffb,  0x551c8000,  0xe6905555,  0xffffffff,  0xffff,  0x0,  0x55555555,  0x55555401,  0x55555555,  0x55552aab,  0x55555555,  0x55555555,  0xfffe0055,  0x7fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x20bf,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x55555555,  0x55555555,  0x55555555,  0x55555555,  0x40155555,  0x55555555,  0x55555555,  0x55555555,  0x3f00ff00,  0xff00ff00,  0xaa003f00,  0xff00,  0x0,  0xf000000,  0xf000f00,  0xf001f00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3e273884,  0xc00f3d50,  0x20,  0xffff,  0x8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffc00000,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x7fff,  0x0,  0xc025ea9d,  0x55555555,  0x55555555,  0x55555555,  0x42805,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x55555555,  0x1555,  0x555555,  0x0,  0x0,  0x0,  0x0,  0x55545554,  0x55555555,  0x6a005555,  0x52855,  0x555,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7fffffe,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ffffff,  0xfff00000,  0x3fff,  0xffffff00,  0xd0000003,  0x3fde64,  0xffff0000,  0x3ff,  0x1fdfe7b0,  0x7b000000,  0x1fc5f,  0xfffff000,  0x3f,  0x3ffffff,  0xfff00000,  0x3fff,  0xffffff00,  0xf0000003,  0x3fffff,  0xffff0000,  0x3ff,  0xffffff00,  0x1,  0x7fffffc,  0xf0000000,  0x1fffff,  0xffc00000,  0x7fff,  0xffff0000,  0x1ff,  0x400,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//8704 bytes
++enum simpleCaseTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x200], [ 0x100,  0x380,  0xd00], [ 0x2020100,  0x4020302,  0x2020205,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xa,  0xb0000,  0xd000c,  0xf000e,  0x110010,  0x130012,  0x14,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160015,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x0,  0x190018,  0x1b001a,  0x1d001c,  0x1f001e,  0x0,  0x0,  0x210020,  0x22,  0x0,  0x0,  0x0,  0x0,  0x0,  0x240023,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x260025,  0x280027,  0x29,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2a0000,  0x2b,  0x2d002c,  0x2e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30002f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x320031,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x20ffff,  0x240022,  0x280026,  0x2c002a,  0x30002e,  0x72f0032,  0x390037,  0x3d003b,  0x41003f,  0x1b00043,  0x4a0048,  0x4e004c,  0x520050,  0xffff0054,  0xffffffff,  0xffffffff,  0x21ffff,  0x250023,  0x290027,  0x2d002b,  0x31002f,  0x7300033,  0x3a0038,  0x3e003c,  0x420040,  0x1b10044,  0x4b0049,  0x4f004d,  0x530051,  0xffff0055,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x43fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xc800c6,  0xcc0498,  0x14904aa,  0xd500d3,  0xd900d7,  0xdd00db,  0xe100df,  0xe500e3,  0xe900e7,  0xed00eb,  0xf100ef,  0xffff00f3,  0xf700f5,  0xfb00f9,  0xff00fd,  0x6be0101,  0xc900c7,  0xcd0499,  0x14a04ab,  0xd600d4,  0xda00d8,  0xde00dc,  0xe200e0,  0xe600e4,  0xea00e8,  0xee00ec,  0xf200f0,  0xffff00f4,  0xf800f6,  0xfc00fa,  0x10000fe,  0x1a80102,  0x1160115,  0x1180117,  0x11c011b,  0x11e011d,  0x120011f,  0x1240123,  0x1260125,  0x1280127,  0x12c012b,  0x12e012d,  0x130012f,  0x1340133,  0x1360135,  0x1380137,  0x13a0139,  0x13c013b,  0x13e013d,  0x140013f,  0x1420141,  0x1440143,  0x1460145,  0x1480147,  0x14d014c,  0x14f014e,  0xffffffff,  0x1510150,  0x1530152,  0x1550154,  0x156ffff,  0x1580157,  0x15c0159,  0x15e015d,  0x160015f,  0x1620161,  0x1640163,  0x1660165,  0xffff0167,  0x1690168,  0x16b016a,  0x16d016c,  0x16f016e,  0x1710170,  0x1730172,  0x1750174,  0x1770176,  0x1790178,  0x17b017a,  0x17d017c,  0x17f017e,  0x1830182,  0x1870186,  0x18b018a,  0x18f018e,  0x1930192,  0x1970196,  0x19b019a,  0x19f019e,  0x1a301a2,  0x1a501a4,  0x1a701a6,  0x1aa01a9,  0x1ac01ab,  0x1ae01ad,  0x1b201af,  0x1b3028b,  0x1b601b5,  0x1ba01b9,  0x1bd01bb,  0x1bf01be,  0x1c301c1,  0xffff01c4,  0x1c701c5,  0x1cb01c9,  0x1cd01cc,  0x23b01cf,  0x1d301d1,  0x1d601d5,  0xffff0283,  0x1d901d7,  0x1db0269,  0x1de01dd,  0x1e001df,  0x1e201e1,  0x1e501e3,  0x1e701e6,  0xffffffff,  0x1ea01e9,  0x1ed01eb,  0x1ef01ee,  0x1f301f1,  0x1f501f4,  0x1f701f6,  0x1fa01f9,  0xffffffff,  0x1fc01fb,  0x23dffff,  0xffffffff,  0xffffffff,  0x2010200,  0x2060202,  0x2080207,  0x20d020c,  0x20f020e,  0x2110210,  0x2130212,  0x2150214,  0x2170216,  0x2190218,  0x21b021a,  0x21d021c,  0x1c6021e,  0x220021f,  0x2240223,  0x2260225,  0x2280227,  0x22a0229,  0x22c022b,  0x22e022d,  0x230022f,  0x2320231,  0x236ffff,  0x2380237,  0x23a0239,  0x23e023c,  0x240023f,  0x2440243,  0x2460245,  0x2480247,  0x24a0249,  0x24c024b,  0x24e024d,  0x250024f,  0x2520251,  0x2540253,  0x2560255,  0x2580257,  0x25a0259,  0x25c025b,  0x25e025d,  0x260025f,  0x2620261,  0x2640263,  0x2660265,  0x2680267,  0xffff026a,  0x26c026b,  0x26e026d,  0x270026f,  0x2720271,  0x2740273,  0x2760275,  0x2780277,  0x27a0279,  0x27c027b,  0xffffffff,  0xffffffff,  0xffffffff,  0x281027f,  0x2840282,  0x2d70285,  0x2870482,  0x28c0288,  0x28f028d,  0x2920291,  0x2940293,  0x2960295,  0x2980297,  0x29c029b,  0x466046a,  0x1b402b7,  0xffff01bc,  0x1c201c0,  0x1c8ffff,  0x1caffff,  0xffffffff,  0xffffffff,  0xffff01ce,  0x1d0ffff,  0x748ffff,  0xffff05fa,  0x1d201d4,  0x528ffff,  0xffffffff,  0x1d8ffff,  0x2b3ffff,  0xffff01da,  0x1dcffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2a3ffff,  0xffffffff,  0xffff01e4,  0x1e8ffff,  0xffffffff,  0xffffffff,  0x28e01ec,  0x1f201f0,  0xffff0290,  0xffffffff,  0xffffffff,  0xffff01f8,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x83affff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x31e031d,  0x320031f,  0xffffffff,  0x3240323,  0xffffffff,  0x3d5ffff,  0x3d903d7,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0329,  0x32f032d,  0xffff0331,  0xffff0333,  0x3370335,  0x339ffff,  0x33e0395,  0x3cc0340,  0x3470345,  0x83b03c8,  0x35403c2,  0x3590440,  0x35d035b,  0x3c5039f,  0x388ffff,  0x36a0368,  0x36f039c,  0x7100371,  0x3780376,  0x32e032a,  0x3320330,  0x33affff,  0x33f0396,  0x3cd0341,  0x3480346,  0x83c03c9,  0x35503c3,  0x35a0441,  0x35e035c,  0x3c603a0,  0x38a0389,  0x36b0369,  0x370039d,  0x7110372,  0x3790377,  0x3360334,  0x3930338,  0x3ca0397,  0xffffffff,  0x39effff,  0x39403a1,  0x3a303a2,  0x3a703a6,  0x3a903a8,  0x3ab03aa,  0x3ad03ac,  0x3af03ae,  0x3b103b0,  0x3b503b4,  0x3b903b8,  0x3bd03bc,  0x3bf03be,  0x3c103c0,  0x3c703c4,  0xffff03d1,  0x3ce03cb,  0x3cfffff,  0x3d203d0,  0x3d403d3,  0x3d6ffff,  0x3da03d8,  0x3dd03db,  0x3e103df,  0x3e503e3,  0x3e903e7,  0x3ed03eb,  0x3f103ef,  0x3f503f3,  0x3f903f7,  0x3fd03fb,  0x40103ff,  0x4050403,  0x4090407,  0x40d040b,  0x411040f,  0x4150413,  0x4190417,  0x41d041b,  0x421041f,  0x4250423,  0x4290427,  0x42d042b,  0x431042f,  0x4350433,  0x4390437,  0x3fe03fc,  0x4020400,  0x4060404,  0x40a0408,  0x40e040c,  0x4120410,  0x4160414,  0x41a0418,  0x41e041c,  0x4220420,  0x4260424,  0x42a0428,  0x42e042c,  0x4320430,  0x4360434,  0x43a0438,  0x3de03dc,  0x3e203e0,  0x3e603e4,  0x3ea03e8,  0x3ee03ec,  0x3f203f0,  0x3f603f4,  0x3fa03f8,  0x4510450,  0x4530452,  0x4570456,  0x4590458,  0x45d045c,  0x4610460,  0x4650464,  0x4690468,  0x46d046c,  0x4710470,  0x4730472,  0x4770476,  0x4790478,  0x47b047a,  0x47d047c,  0x4810480,  0x4850484,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4950494,  0x4970496,  0x49b049a,  0x49d049c,  0x49f049e,  0x4a304a2,  0x4a704a6,  0x4a904a8,  0x4ad04ac,  0x4b104b0,  0x4b304b2,  0x4b704b6,  0x4b904b8,  0x4bb04ba,  0x4bf04be,  0x4c104c0,  0x4c504c4,  0x4c904c8,  0x4cd04cc,  0x4cf04ce,  0x4d304d2,  0x4d504d4,  0x4d704d6,  0x4db04da,  0x4df04de,  0x4e304e2,  0x4e704e6,  0x4ec04ea,  0x4f004ed,  0x4f404f1,  0x4f804f5,  0x4fc04f9,  0x50004fd,  0x5040501,  0x4eb0505,  0x50b050a,  0x50d050c,  0x50f050e,  0x5130512,  0x5170516,  0x5190518,  0x51d051c,  0x51f051e,  0x5210520,  0x5250524,  0x5270526,  0x52b052a,  0x52d052c,  0x52f052e,  0x5330532,  0x5370536,  0x5390538,  0x53d053c,  0x53f053e,  0x5410540,  0x5430542,  0x5470546,  0x5490548,  0x54b054a,  0x54d054c,  0x54f054e,  0x5510550,  0x5550554,  0x5570556,  0x5590558,  0x55b055a,  0x55d055c,  0x55f055e,  0x5630562,  0x5650564,  0x5670566,  0x5690568,  0x56b056a,  0x56f056e,  0x5730572,  0x5750574,  0x5770576,  0x5790578,  0x57b057a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x580ffff,  0x5840582,  0x5880586,  0x58c058a,  0x590058e,  0x5940592,  0x5980596,  0x59c059a,  0x5a0059e,  0x5a405a2,  0x5a805a6,  0x5ac05aa,  0x5b005ae,  0x5b405b2,  0x5b805b6,  0x5bc05ba,  0x5c005be,  0x5c405c2,  0x5c805c6,  0xffff05ca,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x581ffff,  0x5850583,  0x5890587,  0x58d058b,  0x591058f,  0x5950593,  0x5990597,  0x59d059b,  0x5a1059f,  0x5a505a3,  0x5a905a7,  0x5ad05ab,  0x5b105af,  0x5b505b3,  0x5b905b7,  0x5bd05bb,  0x5c105bf,  0x5c505c3,  0x5c905c7,  0xffff05cb,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x880086,  0x8c008a,  0x90008e,  0x940092,  0x980096,  0x9c009a,  0xa0009e,  0xa400a2,  0xa800a6,  0xac00aa,  0xb000ae,  0xb400b2,  0xb800b6,  0xbc00ba,  0xc000be,  0xc400c2,  0x48e0486,  0x4a000ca,  0x4b400ce,  0x4c6ffff,  0xffffffff,  0xffffffff,  0x508ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7e8ffff,  0xffffffff,  0x454ffff,  0xffffffff,  0x5fd05fc,  0x5ff05fe,  0x6010600,  0x6050604,  0x6090608,  0x60b060a,  0x60f060e,  0x6110610,  0x6130612,  0x6170616,  0x6190618,  0x61d061c,  0x61f061e,  0x6210620,  0x6230622,  0x6270626,  0x6290628,  0x62b062a,  0x62d062c,  0x62f062e,  0x6310630,  0x6350634,  0x6370636,  0x6390638,  0x63b063a,  0x63d063c,  0x63f063e,  0x6430642,  0x6450644,  0x6470646,  0x6490648,  0x64b064a,  0x64d064c,  0x6510650,  0x6530652,  0x6550654,  0x6590658,  0x65d065c,  0x65f065e,  0x6630662,  0x6650664,  0x6670666,  0x6690668,  0x66b066a,  0x66d066c,  0x6710670,  0x6730672,  0x6750674,  0x6bc06bb,  0x67a0679,  0x67c067b,  0x680067f,  0x6820681,  0x6840683,  0x6860685,  0x6880687,  0x68a0689,  0x68e068d,  0x690068f,  0x6920691,  0x6960695,  0x6980697,  0x69a0699,  0x69e069d,  0x6a0069f,  0x6a206a1,  0x6a406a3,  0x6a606a5,  0x6a806a7,  0x6ac06ab,  0x6ae06ad,  0x6b006af,  0x6b206b1,  0x6b406b3,  0x6b606b5,  0xffffffff,  0xffffffff,  0x6bdffff,  0xffffffff,  0xffff06bf,  0x6c106c0,  0x6c306c2,  0x6c506c4,  0x6c906c8,  0x6cb06ca,  0x6cd06cc,  0x6cf06ce,  0x6d106d0,  0x6d506d4,  0x6d706d6,  0x6db06da,  0x6dd06dc,  0x6df06de,  0x6e106e0,  0x6e306e2,  0x6e506e4,  0x6e906e8,  0x6eb06ea,  0x6ef06ee,  0x6f106f0,  0x6f306f2,  0x6f506f4,  0x6f706f6,  0x6f906f8,  0x6fb06fa,  0x6fd06fc,  0x6ff06fe,  0x7010700,  0x7030702,  0x7050704,  0x7070706,  0x7090708,  0x70b070a,  0x70d070c,  0x70f070e,  0x7140713,  0x7160715,  0x7180717,  0x71c071b,  0x71e071d,  0x720071f,  0x7220721,  0x7240723,  0x7260725,  0x7280727,  0x72a0729,  0x72e072d,  0x7330732,  0x7380736,  0x73c073a,  0x740073e,  0x7440742,  0x7390737,  0x73d073b,  0x741073f,  0x7450743,  0x74c074a,  0x750074e,  0x7540752,  0xffffffff,  0x74d074b,  0x751074f,  0x7550753,  0xffffffff,  0x7660764,  0x76a0768,  0x76e076c,  0x7720770,  0x7670765,  0x76b0769,  0x76f076d,  0x7730771,  0x7860784,  0x78a0788,  0x78e078c,  0x7920790,  0x7870785,  0x78b0789,  0x78f078d,  0x7930791,  0x79e079c,  0x7a207a0,  0x7a607a4,  0xffffffff,  0x79f079d,  0x7a307a1,  0x7a707a5,  0xffffffff,  0x7b6ffff,  0x7baffff,  0x7beffff,  0x7c2ffff,  0x7b7ffff,  0x7bbffff,  0x7bfffff,  0x7c3ffff,  0x7d207d0,  0x7d607d4,  0x7da07d8,  0x7de07dc,  0x7d307d1,  0x7d707d5,  0x7db07d9,  0x7df07dd,  0x8360834,  0x840083e,  0x8440842,  0x84e084c,  0x8620860,  0x8580856,  0x8660864,  0xffffffff,  0x7f607f4,  0x7fa07f8,  0x7fe07fc,  0x8020800,  0x7f707f5,  0x7fb07f9,  0x7ff07fd,  0x8030801,  0x80a0808,  0x80e080c,  0x8120810,  0x8160814,  0x80b0809,  0x80f080d,  0x8130811,  0x8170815,  0x8220820,  0x8260824,  0x82a0828,  0x82e082c,  0x8230821,  0x8270825,  0x82b0829,  0x82f082d,  0x8320830,  0x838ffff,  0xffffffff,  0xffffffff,  0x8330831,  0x8370835,  0xffff0839,  0xffff083d,  0xffffffff,  0x846ffff,  0xffffffff,  0xffffffff,  0x841083f,  0x8450843,  0xffff0847,  0xffffffff,  0x84a0848,  0xffffffff,  0xffffffff,  0xffffffff,  0x84b0849,  0x84f084d,  0xffffffff,  0xffffffff,  0x8540852,  0xffffffff,  0x85affff,  0xffffffff,  0x8550853,  0x8590857,  0xffff085b,  0xffffffff,  0xffffffff,  0x868ffff,  0xffffffff,  0xffffffff,  0x8630861,  0x8670865,  0xffff0869,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0712,  0xffffffff,  0x14b0731,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0530,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0531,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x180029f,  0x18402af,  0x18802c1,  0x18c005e,  0x1900064,  0x194006c,  0x1980076,  0x19c007e,  0x18102a0,  0x18502b0,  0x18902c2,  0x18d005f,  0x1910065,  0x195006d,  0x1990077,  0x19d007f,  0xffffffff,  0x1b7ffff,  0xffff01b8,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4d80444,  0x4dc0446,  0x4e0044c,  0x4e4045e,  0x4e80474,  0x2d3086a,  0x204ee,  0x6c604f2,  0x6e04f6,  0x37a04fa,  0x10d04fe,  0x61a0502,  0x51a0506,  0x4d90445,  0x4dd0447,  0x4e1044d,  0x4e5045f,  0x4e90475,  0x2d4086b,  0x304ef,  0x6c704f3,  0x6f04f7,  0x37b04fb,  0x10e04ff,  0x61b0503,  0x51b0507,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x40000,  0xa0008,  0xe000c,  0x160010,  0x1a0018,  0x2bb001c,  0x2d102c7,  0x5602e7,  0x600058,  0x660062,  0x70006a,  0x780074,  0x80007c,  0x2990082,  0x607e0,  0x6020084,  0x2a7057c,  0x5d005ce,  0x10305de,  0x1070105,  0x10f0109,  0x1190113,  0x1290121,  0xffff0131,  0x50001,  0xb0009,  0xf000d,  0x170011,  0x1b0019,  0x2bc001d,  0x2d202c8,  0x5702e8,  0x610059,  0x670063,  0x71006b,  0x790075,  0x81007d,  0x29a0083,  0x707e1,  0x6030085,  0x2a8057d,  0x5d105cf,  0x10405df,  0x1080106,  0x110010a,  0x11a0114,  0x12a0122,  0xffff0132,  0x4c304c2,  0x4550529,  0x28002a4,  0x45a0286,  0x2a9045b,  0x46202aa,  0x4670463,  0x46b02b4,  0xffff02b8,  0x2ba02b9,  0x2bfffff,  0xffff02c0,  0xffffffff,  0xffffffff,  0xffffffff,  0x48302d8,  0x2e202e1,  0x4890488,  0x48b048a,  0x48d048c,  0x4910490,  0x2fe02fd,  0x3040303,  0x30e030d,  0x3160315,  0x31a0319,  0x3260325,  0x3280327,  0x2fc02fb,  0x6ed06ec,  0x3810380,  0x3830382,  0x3870386,  0x3920391,  0x3a503a4,  0x3b303b2,  0x56d056c,  0x5cd05cc,  0x5db05da,  0x5ed05ec,  0x60d060c,  0x6570656,  0x43e043d,  0x6e706e6,  0x72c072b,  0x7830782,  0x7e307e2,  0x6940693,  0x65b065a,  0x150014,  0x5d005c,  0x4bd04bc,  0x4d104d0,  0x5d505d4,  0x1a101a0,  0x5110510,  0x5230522,  0x5350534,  0x5450544,  0x5530552,  0x5610560,  0x5710570,  0x57f057e,  0x15b015a,  0x37d037c,  0x3bb03ba,  0xffffffff,  0xffffffff,  0xffffffff,  0x5d2ffff,  0x5d805d3,  0xffff05d9,  0xffffffff,  0x5e305e2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x890087,  0x8d008b,  0x91008f,  0x950093,  0x990097,  0x9d009b,  0xa1009f,  0xa500a3,  0xa900a7,  0xad00ab,  0xb100af,  0xb500b3,  0xb900b7,  0xbd00bb,  0xc100bf,  0xc500c3,  0x48f0487,  0x4a100cb,  0x4b500cf,  0x4c7ffff,  0xffffffff,  0xffffffff,  0x509ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2c402c3,  0x5d705d6,  0x5dd05dc,  0x5e105e0,  0x5e705e6,  0x5e905e8,  0x5eb05ea,  0x5ef05ee,  0x5f105f0,  0x5f505f4,  0x5f905f8,  0x3080307,  0x6150614,  0x6250624,  0x6330632,  0x6410640,  0x64f064e,  0x6610660,  0x66f066e,  0x67e067d,  0x68c068b,  0x69c069b,  0x6aa06a9,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7350734,  0x690068,  0x27e027d,  0x75f075e,  0x7770776,  0x390038f,  0x1f001e,  0x7b107b0,  0x7c707c6,  0x2a202a1,  0x7e507e4,  0x6b806b7,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7590758,  0x75d075c,  0x7610760,  0x2d602d5,  0x2e002df,  0x2e602e5,  0x2ee02ed,  0xffffffff,  0x7790778,  0x77d077c,  0x7810780,  0x30c030b,  0x3140313,  0x3180317,  0x3220321,  0x7950794,  0x7970796,  0x7990798,  0x79b079a,  0x37f037e,  0x3850384,  0x38e038d,  0x7a907a8,  0x7ab07aa,  0x7ad07ac,  0x7af07ae,  0x7b307b2,  0x7b507b4,  0x7b907b8,  0x7bd07bc,  0x7c107c0,  0x7c507c4,  0x7c907c8,  0x7cd07cc,  0x7cf07ce,  0x46f046e,  0x47f047e,  0x4930492,  0x4a504a4,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x514ffff,  0x7e60515,  0x7e907e7,  0x7eb07ea,  0x7ed07ec,  0x7ef07ee,  0x7f107f0,  0x7f307f2,  0xffffffff,  0x5f2ffff,  0x74905f3,  0xffffffff,  0x8050804,  0x8070806,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x8190818,  0x81b081a,  0x81d081c,  0x81f081e,  0x5f705f6,  0xffff05fb,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x756ffff,  0x75a02c5,  0x2cd02cb,  0x76202cf,  0x2db06d2,  0x2e30719,  0x2e90448,  0x2f107ca,  0x2f30774,  0x77a02f5,  0x77e02f9,  0x3050221,  0x30f007a,  0xffff043b,  0xffffffff,  0xffffffff,  0x757ffff,  0x75b02c6,  0x2ce02cc,  0x76302d0,  0x2dc06d3,  0x2e4071a,  0x2ea0449,  0x2f207cb,  0x2f40775,  0x77b02f6,  0x77f02fa,  0x3060222,  0x310007b,  0xffff043c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x85c0012,  0x72005a,  0x32b0311,  0x11106b9,  0x2ab05e4,  0x2dd029d,  0x2ef085e,  0x10b0606,  0x2d902a5,  0x4ca0289,  0x2b502ad,  0x2c902bd,  0x2eb0746,  0x30902f7,  0x241031b,  0x38b02b1,  0x44a03b6,  0x442053a,  0x6d8044e,  0x85004ae,  0x85d0013,  0x73005b,  0x32c0312,  0x11206ba,  0x2ac05e5,  0x2de029e,  0x2f0085f,  0x10c0607,  0x2da02a6,  0x4cb028a,  0x2b602ae,  0x2ca02be,  0x2ec0747,  0x30a02f8,  0x242031c,  0x38c02b2,  0x44b03b7,  0x443053b,  0x6d9044f,  0x85104af,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++//8832 bytes
++enum fullCaseTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x200], [ 0x100,  0x380,  0xd40], [ 0x2020100,  0x4020302,  0x2020205,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xa,  0xb0000,  0xd000c,  0xf000e,  0x110010,  0x130012,  0x14,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160015,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x170000,  0x0,  0x190018,  0x1b001a,  0x1d001c,  0x1f001e,  0x0,  0x0,  0x210020,  0x22,  0x0,  0x0,  0x0,  0x0,  0x0,  0x240023,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x260025,  0x280027,  0x29,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2a0000,  0x2b,  0x2d002c,  0x2e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x310030,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x330032,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x20ffff,  0x240022,  0x280026,  0x2c002a,  0x30002e,  0x7810032,  0x390037,  0x3d003b,  0x41003f,  0x1b90043,  0x4a0048,  0x4e004c,  0x520050,  0xffff0054,  0xffffffff,  0xffffffff,  0x21ffff,  0x250023,  0x290027,  0x2d002b,  0x31002f,  0x7820033,  0x3a0038,  0x3e003c,  0x420040,  0x1ba0044,  0x4b0049,  0x4f004d,  0x530051,  0xffff0055,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x470ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xc800c6,  0xcc04c9,  0x14e04db,  0xd500d3,  0xd900d7,  0xdd00db,  0xe100df,  0xe500e3,  0xe900e7,  0xed00eb,  0xf100ef,  0xffff00f3,  0xf700f5,  0xfb00f9,  0xff00fd,  0x70f0101,  0xc900c7,  0xcd04ca,  0x14f04dc,  0xd600d4,  0xda00d8,  0xde00dc,  0xe200e0,  0xe600e4,  0xea00e8,  0xee00ec,  0xf200f0,  0xffff00f4,  0xf800f6,  0xfc00fa,  0x10000fe,  0x1b10102,  0x1190118,  0x11b011a,  0x11f011e,  0x1210120,  0x1230122,  0x1270126,  0x1290128,  0x12b012a,  0x12f012e,  0x1310130,  0x1330132,  0x1370136,  0x1390138,  0x13b013a,  0x13d013c,  0x13f013e,  0x1410140,  0x1430142,  0x1470146,  0x1490148,  0x14b014a,  0x14d014c,  0x1520151,  0x1540153,  0xffff0155,  0x1580157,  0x15a0159,  0x15c015b,  0x15dffff,  0x15f015e,  0x1630160,  0x1650164,  0x1670166,  0x1690168,  0x16b016a,  0x16d016c,  0x16f016e,  0x1720171,  0x1740173,  0x1760175,  0x1780177,  0x17a0179,  0x17c017b,  0x17e017d,  0x180017f,  0x1820181,  0x1840183,  0x1860185,  0x1880187,  0x18c018b,  0x190018f,  0x1940193,  0x1980197,  0x19c019b,  0x1a0019f,  0x1a401a3,  0x1a801a7,  0x1ac01ab,  0x1ae01ad,  0x1b001af,  0x1b301b2,  0x1b501b4,  0x1b701b6,  0x1bb01b8,  0x1bc029c,  0x1bf01be,  0x1c301c2,  0x1c601c4,  0x1c801c7,  0x1cc01ca,  0xffff01cd,  0x1d001ce,  0x1d401d2,  0x1d601d5,  0x24801d8,  0x1dc01da,  0x1df01de,  0xffff0294,  0x1e201e0,  0x1e60278,  0x1e901e8,  0x1eb01ea,  0x1ed01ec,  0x1f001ee,  0x1f201f1,  0xffffffff,  0x1f501f4,  0x1f801f6,  0x1fa01f9,  0x1fe01fc,  0x20001ff,  0x2020201,  0x2050204,  0xffffffff,  0x2070206,  0x24affff,  0xffffffff,  0xffffffff,  0x20c020b,  0x211020d,  0x2130212,  0x2180217,  0x21a0219,  0x21c021b,  0x21e021d,  0x220021f,  0x2220221,  0x2240223,  0x2260225,  0x2280227,  0x1cf0229,  0x22b022a,  0x22f022e,  0x2310230,  0x2330232,  0x2350234,  0x2370236,  0x2390238,  0x23b023a,  0x23d023c,  0x243023e,  0x2450244,  0x2470246,  0x24b0249,  0x24d024c,  0x2510250,  0x2530252,  0x2550254,  0x2570256,  0x2590258,  0x25b025a,  0x25d025c,  0x2610260,  0x2630262,  0x2650264,  0x2670266,  0x2690268,  0x26b026a,  0x26d026c,  0x26f026e,  0x2710270,  0x2730272,  0x2750274,  0x2770276,  0xffff0279,  0x27b027a,  0x27d027c,  0x27f027e,  0x2810280,  0x2850284,  0x2870286,  0x2890288,  0x28b028a,  0x28d028c,  0xffffffff,  0xffffffff,  0xffffffff,  0x2920290,  0x2950293,  0x2ec0296,  0x29804b3,  0x29d0299,  0x2a0029e,  0x2a302a2,  0x2a502a4,  0x2a702a6,  0x2a902a8,  0x2ad02ac,  0x497049b,  0x1bd02ca,  0xffff01c5,  0x1cb01c9,  0x1d1ffff,  0x1d3ffff,  0xffffffff,  0xffffffff,  0xffff01d7,  0x1d9ffff,  0x79affff,  0xffff0643,  0x1db01dd,  0x559ffff,  0xffffffff,  0x1e1ffff,  0x2c6ffff,  0xffff01e3,  0x1e7ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2b4ffff,  0xffffffff,  0xffff01ef,  0x1f3ffff,  0xffffffff,  0xffffffff,  0x29f01f7,  0x1fd01fb,  0xffff02a1,  0xffffffff,  0xffffffff,  0xffff0203,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x8e4ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3450344,  0x3470346,  0xffffffff,  0x34b034a,  0xffffffff,  0x406ffff,  0x40a0408,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0350,  0x3560354,  0xffff0358,  0xffff035a,  0x35e035c,  0x3630902,  0x36803c2,  0x3fd036a,  0x371036f,  0x8e503f9,  0x37e03f3,  0x3830471,  0x3870385,  0x3f603cc,  0x3b5ffff,  0x3940392,  0x39903c9,  0x762039b,  0x3a203a0,  0x3550351,  0x3590357,  0x3640915,  0x36903c3,  0x3fe036b,  0x3720370,  0x8e603fa,  0x37f03f4,  0x3840472,  0x3880386,  0x3f703cd,  0x3b703b6,  0x3950393,  0x39a03ca,  0x763039c,  0x3a303a1,  0x35d035b,  0x3c0035f,  0x3fb03c4,  0xffffffff,  0x3cbffff,  0x3c103ce,  0x3d003cf,  0x3d403d3,  0x3d603d5,  0x3d803d7,  0x3da03d9,  0x3de03dd,  0x3e003df,  0x3e403e3,  0x3e803e7,  0x3ec03eb,  0x3ee03ed,  0x3f203f1,  0x3f803f5,  0xffff0402,  0x3ff03fc,  0x400ffff,  0x4030401,  0x4050404,  0x407ffff,  0x40b0409,  0x40e040c,  0x4120410,  0x4160414,  0x41a0418,  0x41e041c,  0x4220420,  0x4260424,  0x42a0428,  0x42e042c,  0x4320430,  0x4360434,  0x43a0438,  0x43e043c,  0x4420440,  0x4460444,  0x44a0448,  0x44e044c,  0x4520450,  0x4560454,  0x45a0458,  0x45e045c,  0x4620460,  0x4660464,  0x46a0468,  0x42f042d,  0x4330431,  0x4370435,  0x43b0439,  0x43f043d,  0x4430441,  0x4470445,  0x44b0449,  0x44f044d,  0x4530451,  0x4570455,  0x45b0459,  0x45f045d,  0x4630461,  0x4670465,  0x46b0469,  0x40f040d,  0x4130411,  0x4170415,  0x41b0419,  0x41f041d,  0x4230421,  0x4270425,  0x42b0429,  0x4820481,  0x4840483,  0x4880487,  0x48a0489,  0x48e048d,  0x4920491,  0x4960495,  0x49a0499,  0x49e049d,  0x4a204a1,  0x4a404a3,  0x4a804a7,  0x4aa04a9,  0x4ac04ab,  0x4ae04ad,  0x4b204b1,  0x4b604b5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4c604c5,  0x4c804c7,  0x4cc04cb,  0x4ce04cd,  0x4d004cf,  0x4d404d3,  0x4d804d7,  0x4da04d9,  0x4de04dd,  0x4e204e1,  0x4e404e3,  0x4e804e7,  0x4ea04e9,  0x4ec04eb,  0x4f004ef,  0x4f204f1,  0x4f604f5,  0x4fa04f9,  0x4fe04fd,  0x50004ff,  0x5040503,  0x5060505,  0x5080507,  0x50c050b,  0x510050f,  0x5140513,  0x5180517,  0x51d051b,  0x521051e,  0x5250522,  0x5290526,  0x52d052a,  0x531052e,  0x5350532,  0x51c0536,  0x53c053b,  0x53e053d,  0x540053f,  0x5440543,  0x5480547,  0x54a0549,  0x54e054d,  0x550054f,  0x5520551,  0x5560555,  0x5580557,  0x55c055b,  0x55e055d,  0x560055f,  0x5640563,  0x5680567,  0x56a0569,  0x56e056d,  0x570056f,  0x5720571,  0x5740573,  0x5780577,  0x57a0579,  0x57c057b,  0x57e057d,  0x5820581,  0x5840583,  0x5880587,  0x58a0589,  0x58c058b,  0x58e058d,  0x5920591,  0x5940593,  0x5980597,  0x59a0599,  0x59c059b,  0x59e059d,  0x5a205a1,  0x5a605a5,  0x5aa05a9,  0x5ac05ab,  0x5ae05ad,  0x5b005af,  0x5b405b3,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x5b9ffff,  0x5bd05bb,  0x5c105bf,  0x5c505c3,  0x5c905c7,  0x5cd05cb,  0x5d105cf,  0x5d505d3,  0x5d905d7,  0x5dd05db,  0x5e105df,  0x5e505e3,  0x5e905e7,  0x5ed05eb,  0x5f105ef,  0x5f505f3,  0x5f905f7,  0x5fd05fb,  0x60105ff,  0xffff0603,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x5baffff,  0x5be05bc,  0x5c205c0,  0x5c605c4,  0x5ca05c8,  0x5ce05cc,  0x5d205d0,  0x5d605d4,  0x5da05d8,  0x5de05dc,  0x5e205e0,  0x5e605e4,  0x5ea05e8,  0x5ee05ec,  0x5f205f0,  0x5f605f4,  0x5fa05f8,  0x5fe05fc,  0x6020600,  0x6130604,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x880086,  0x8c008a,  0x90008e,  0x940092,  0x980096,  0x9c009a,  0xa0009e,  0xa400a2,  0xa800a6,  0xac00aa,  0xb000ae,  0xb400b2,  0xb800b6,  0xbc00ba,  0xc000be,  0xc400c2,  0x4bf04b7,  0x4d100ca,  0x4e500ce,  0x4f7ffff,  0xffffffff,  0xffffffff,  0x539ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x83affff,  0xffffffff,  0x485ffff,  0xffffffff,  0x6460645,  0x6480647,  0x64a0649,  0x64e064d,  0x6520651,  0x6540653,  0x6580657,  0x65a0659,  0x65c065b,  0x660065f,  0x6620661,  0x6660665,  0x6680667,  0x66a0669,  0x66c066b,  0x670066f,  0x6720671,  0x6740673,  0x6760675,  0x6780677,  0x67a0679,  0x67e067d,  0x680067f,  0x6820681,  0x6840683,  0x6860685,  0x6880687,  0x68c068b,  0x68e068d,  0x690068f,  0x6920691,  0x6940693,  0x6960695,  0x69a0699,  0x69c069b,  0x69e069d,  0x6a206a1,  0x6a606a5,  0x6a806a7,  0x6ac06ab,  0x6ae06ad,  0x6b006af,  0x6b206b1,  0x6b406b3,  0x6b606b5,  0x6ba06b9,  0x6bc06bb,  0x6be06bd,  0x70d070c,  0x6c306c2,  0x6c706c6,  0x6cb06ca,  0x6cd06cc,  0x6cf06ce,  0x6d106d0,  0x6d306d2,  0x6d506d4,  0x6d906d8,  0x6db06da,  0x6dd06dc,  0x6e106e0,  0x6e306e2,  0x6e506e4,  0x6e906e8,  0x6eb06ea,  0x6ed06ec,  0x6ef06ee,  0x6f106f0,  0x6f306f2,  0x6f706f6,  0x6f906f8,  0x6fb06fa,  0x6fd06fc,  0x6ff06fe,  0x7010700,  0x7040702,  0x7080706,  0x70e070a,  0xffffffff,  0xffff0710,  0x7130712,  0x7150714,  0x7170716,  0x71b071a,  0x71d071c,  0x71f071e,  0x7210720,  0x7230722,  0x7270726,  0x7290728,  0x72d072c,  0x72f072e,  0x7310730,  0x7330732,  0x7350734,  0x7370736,  0x73b073a,  0x73d073c,  0x7410740,  0x7430742,  0x7450744,  0x7470746,  0x7490748,  0x74b074a,  0x74d074c,  0x74f074e,  0x7510750,  0x7530752,  0x7550754,  0x7570756,  0x7590758,  0x75b075a,  0x75d075c,  0x75f075e,  0x7610760,  0x7660765,  0x7680767,  0x76a0769,  0x76e076d,  0x770076f,  0x7720771,  0x7740773,  0x7760775,  0x7780777,  0x77a0779,  0x77c077b,  0x780077f,  0x7850784,  0x78a0788,  0x78e078c,  0x7920790,  0x7960794,  0x78b0789,  0x78f078d,  0x7930791,  0x7970795,  0x79e079c,  0x7a207a0,  0x7a607a4,  0xffffffff,  0x79f079d,  0x7a307a1,  0x7a707a5,  0xffffffff,  0x7b807b6,  0x7bc07ba,  0x7c007be,  0x7c407c2,  0x7b907b7,  0x7bd07bb,  0x7c107bf,  0x7c507c3,  0x7d807d6,  0x7dc07da,  0x7e007de,  0x7e407e2,  0x7d907d7,  0x7dd07db,  0x7e107df,  0x7e507e3,  0x7f007ee,  0x7f407f2,  0x7f807f6,  0xffffffff,  0x7f107ef,  0x7f507f3,  0x7f907f7,  0xffffffff,  0x80807fc,  0x80c07fe,  0x8100800,  0x8140804,  0x809ffff,  0x80dffff,  0x811ffff,  0x815ffff,  0x8240822,  0x8280826,  0x82c082a,  0x830082e,  0x8250823,  0x8290827,  0x82d082b,  0x831082f,  0x8df08dd,  0x8f708f5,  0x8fb08f9,  0x90f090d,  0x9370935,  0x9240922,  0x93b0939,  0xffffffff,  0x8590856,  0x85f085c,  0x8650862,  0x86b0868,  0x85a0857,  0x860085d,  0x8660863,  0x86c0869,  0x8890886,  0x88f088c,  0x8950892,  0x89b0898,  0x88a0887,  0x890088d,  0x8960893,  0x89c0899,  0x8b908b6,  0x8bf08bc,  0x8c508c2,  0x8cb08c8,  0x8ba08b7,  0x8c008bd,  0x8c608c3,  0x8cc08c9,  0x8db08d9,  0x8e108ce,  0xffff08d3,  0x8d708d5,  0x8dc08da,  0x8e008de,  0xffff08e2,  0xffff08e7,  0xffffffff,  0x8fd08e8,  0xffff08ed,  0x8f308f1,  0x8f808f6,  0x8fc08fa,  0xffff08fe,  0xffffffff,  0x90b0909,  0x9030900,  0xffffffff,  0x9070905,  0x90c090a,  0x910090e,  0xffffffff,  0xffffffff,  0x920091e,  0x9160913,  0x9260918,  0x91c091a,  0x921091f,  0x9250923,  0xffff0927,  0xffffffff,  0xffffffff,  0x93d092a,  0xffff092f,  0x9330931,  0x9380936,  0x93c093a,  0xffff093e,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0764,  0xffffffff,  0x1500783,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0561,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0562,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x18902b0,  0x18d02c2,  0x19102d6,  0x195005e,  0x1990064,  0x19d006c,  0x1a10076,  0x1a5007e,  0x18a02b1,  0x18e02c3,  0x19202d7,  0x196005f,  0x19a0065,  0x19e006d,  0x1a20077,  0x1a6007f,  0xffffffff,  0x1c0ffff,  0xffff01c1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x5090475,  0x50d0477,  0x511047d,  0x515048f,  0x51904a5,  0x2e80940,  0x2051f,  0x7180523,  0x6e0527,  0x3a4052b,  0x110052f,  0x6630533,  0x54b0537,  0x50a0476,  0x50e0478,  0x512047e,  0x5160490,  0x51a04a6,  0x2e90941,  0x30520,  0x7190524,  0x6f0528,  0x3a5052c,  0x1110530,  0x6640534,  0x54c0538,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x40000,  0xa0008,  0xe000c,  0x160010,  0x1a0018,  0x2ce001c,  0x2e602dc,  0x560308,  0x600058,  0x660062,  0x70006a,  0x780074,  0x80007c,  0x2aa0082,  0x60832,  0x64b0084,  0x2b805b5,  0x60d0609,  0x629061d,  0x1080106,  0x112010a,  0x11c0116,  0x12c0124,  0xffff0134,  0x50001,  0xb0009,  0xf000d,  0x170011,  0x1b0019,  0x2cf001d,  0x2e702dd,  0x570309,  0x610059,  0x670063,  0x71006b,  0x790075,  0x81007d,  0x2ab0083,  0x70833,  0x64c0085,  0x2b905b6,  0x60e060a,  0x62a061e,  0x1090107,  0x113010b,  0x11d0117,  0x12d0125,  0xffff0135,  0x4f404f3,  0x486055a,  0x29102b5,  0x48b0297,  0x2ba048c,  0x49302bb,  0x4980494,  0x49c02c7,  0xffff02cb,  0x2cd02cc,  0x2d4ffff,  0xffff02d5,  0xffffffff,  0xffffffff,  0xffffffff,  0x4b402ed,  0x2f902f8,  0x4ba04b9,  0x4bc04bb,  0x4be04bd,  0x4c204c1,  0x3250324,  0x32b032a,  0x3350334,  0x33d033c,  0x3410340,  0x34d034c,  0x34f034e,  0x3230322,  0x73f073e,  0x3ae03ad,  0x3b003af,  0x3b403b3,  0x3bf03be,  0x3d203d1,  0x3e203e1,  0x5a405a3,  0x6060605,  0x61a0619,  0x6320631,  0x6560655,  0x6a0069f,  0x46f046e,  0x7390738,  0x77e077d,  0x7d507d4,  0x8350834,  0x6df06de,  0x6a406a3,  0x150014,  0x5d005c,  0x4ee04ed,  0x5020501,  0x6120611,  0x1aa01a9,  0x5420541,  0x5540553,  0x5660565,  0x5760575,  0x5860585,  0x5960595,  0x5a805a7,  0x5b805b7,  0x1620161,  0x3a703a6,  0x3ea03e9,  0xffffffff,  0xffffffff,  0xffffffff,  0x60fffff,  0x6170610,  0xffff0618,  0xffffffff,  0x6240623,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x890087,  0x8d008b,  0x91008f,  0x950093,  0x990097,  0x9d009b,  0xa1009f,  0xa500a3,  0xa900a7,  0xad00ab,  0xb100af,  0xb500b3,  0xb900b7,  0xbd00bb,  0xc100bf,  0xc500c3,  0x4c004b8,  0x4d200cb,  0x4e600cf,  0x4f8ffff,  0xffffffff,  0xffffffff,  0x53affff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2d902d8,  0x6160615,  0x61c061b,  0x6220621,  0x6280627,  0x1e501e4,  0x62e062d,  0x6340633,  0x6380637,  0x63e063d,  0x6420641,  0x32f032e,  0x65e065d,  0x66e066d,  0x67c067b,  0x68a0689,  0x6980697,  0x6aa06a9,  0x6b806b7,  0x6c906c8,  0x6d706d6,  0x6e706e6,  0x6f506f4,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7870786,  0x690068,  0x28f028e,  0x7b107b0,  0x7c907c8,  0x3bd03bc,  0x1f001e,  0x8030802,  0x8190818,  0x2b302b2,  0x8370836,  0x2d302d2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7ab07aa,  0x7af07ae,  0x7b307b2,  0x2eb02ea,  0x2f502f4,  0x3070306,  0x3110310,  0xffffffff,  0x7cb07ca,  0x7cf07ce,  0x7d307d2,  0x3330332,  0x33b033a,  0x33f033e,  0x3490348,  0x7e707e6,  0x7e907e8,  0x7eb07ea,  0x7ed07ec,  0x3ac03ab,  0x3b203b1,  0x3bb03ba,  0x7fb07fa,  0x3dc03db,  0x3f003ef,  0x620061f,  0x2830282,  0x8070806,  0x80b080a,  0x80f080e,  0x8130812,  0x8170816,  0x81b081a,  0x81f081e,  0x8210820,  0x4a0049f,  0x4b004af,  0x4c404c3,  0x4d604d5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x545ffff,  0x8380546,  0x83b0839,  0x83d083c,  0x580057f,  0x590058f,  0x5a0059f,  0x5b205b1,  0xffffffff,  0x63bffff,  0x79b063c,  0xffffffff,  0x6080607,  0x60c060b,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x62c062b,  0x630062f,  0x6360635,  0x63a0639,  0x640063f,  0xffff0644,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x25e02f6,  0x2fc02fa,  0x30302fe,  0xffff0304,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x30cffff,  0x2c0030e,  0x3140312,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7a8ffff,  0x7ac02da,  0x2e202e0,  0x7b402e4,  0x2f00724,  0x144076b,  0x30a0479,  0x318081c,  0x31a07c6,  0x7cc031c,  0x7d00320,  0x32c022c,  0x336007a,  0xffff046c,  0xffffffff,  0xffffffff,  0x7a9ffff,  0x7ad02db,  0x2e302e1,  0x7b502e5,  0x2f10725,  0x145076c,  0x30b047a,  0x319081d,  0x31b07c7,  0x7cd031d,  0x7d10321,  0x32d022d,  0x337007b,  0xffff046d,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x9280012,  0x72005a,  0x3520338,  0x114010c,  0x2bc0625,  0x2f202ae,  0x31608ef,  0x10e064f,  0x2ee02b6,  0x4fb029a,  0x2c802be,  0x2de02d0,  0x47f0798,  0x330031e,  0x24e0342,  0x3b802c4,  0x47b03e5,  0x473056b,  0x72a06c4,  0x91104df,  0x9290013,  0x73005b,  0x3530339,  0x115010d,  0x2bd0626,  0x2f302af,  0x31708f0,  0x10f0650,  0x2ef02b7,  0x4fc029b,  0x2c902bf,  0x2df02d1,  0x4800799,  0x331031f,  0x24f0343,  0x3b902c5,  0x47c03e6,  0x474056c,  0x72b06c5,  0x91204e0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++//4000 bytes
++enum alphaTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0x160], [ 0x100,  0x240,  0x5100], [ 0x3020100,  0x7060504,  0xb0a0908,  0xe0d0c0a,  0x3030303,  0x100a0f03,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xb000a,  0xd000c,  0xf000e,  0x10010,  0x120011,  0x10013,  0x150014,  0x170016,  0x190018,  0x1b001a,  0x1c0001,  0x1e001d,  0x1f001f,  0x1f0020,  0x1f001f,  0x1f001f,  0x1f001f,  0x220021,  0x1f0023,  0x250024,  0x1f001f,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x260001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x270001,  0x10001,  0x10001,  0x10028,  0x2a0029,  0x2c002b,  0x2e002d,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x2f0001,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1001f,  0x310030,  0x320001,  0x340033,  0x360035,  0x380037,  0x1f0039,  0x1f001f,  0x3b003a,  0x3d003c,  0x1f003e,  0x1f001f,  0x40003f,  0x1f001f,  0x1f001f,  0x1f0041,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x10001,  0x420001,  0x1f0043,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x10001,  0x10001,  0x1f0044,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x10001,  0x1f0045,  0x1f001f,  0x46001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f0047,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x490048,  0x4b004a,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f004c,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x10001,  0x10001,  0x10001,  0x1004d,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x4e0001,  0x1f004f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x10001,  0x1f004f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x1f001f,  0x0,  0x0,  0x7fffffe,  0x7fffffe,  0x0,  0x4200400,  0xff7fffff,  0xff7fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3ffc3,  0x501f,  0x0,  0x0,  0x20,  0x3cdf0000,  0xffffd740,  0xfffffffb,  0xffffffff,  0xffbfffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffffc03,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffe00ff,  0x27fffff,  0xfffffffe,  0xff,  0xbfff0000,  0xffff00b6,  0x707ff,  0x7ff0000,  0xffffffff,  0xfeffffff,  0xffffc000,  0xffffffff,  0xffffffff,  0x1fefffff,  0x9c00e1fe,  0xffff0000,  0xffffffff,  0xffffe000,  0xffffffff,  0xffffffff,  0x3ffff,  0xfffffc00,  0x43007ff,  0xfcffffff,  0x1fff,  0x1ffffff,  0x0,  0x0,  0x1ffd,  0x0,  0x7fff03f0,  0xffffffff,  0xefffffff,  0xffe1dfff,  0xfefe000f,  0xfff99fee,  0xe3c5fdff,  0xb080599f,  0x3000f,  0xfff987ee,  0xc36dfdff,  0x5e021987,  0x3f0000,  0xfffbbfee,  0xe3edfdff,  0x11bbf,  0xf,  0xfff99fee,  0xe3edfdff,  0xb0c0199f,  0x2000f,  0xd63dc7ec,  0xc3ffc718,  0x811dc7,  0x0,  0xfffddfee,  0xe3effdff,  0x3601ddf,  0xf,  0xfffddfec,  0xe3effdff,  0x40601ddf,  0x6000f,  0xfffddfec,  0xe7ffffff,  0x805ddf,  0xfc00000f,  0xfc7fffec,  0x2ffbffff,  0xff5f807f,  0xc0000,  0xfffffffe,  0x7ffffff,  0x207f,  0x0,  0xfef02596,  0x3bffecae,  0xf000205f,  0x0,  0x1,  0x0,  0xfffffeff,  0xfffe1fff,  0xfeffff03,  0x1fffffff,  0x0,  0x0,  0xffffffff,  0xf97fffff,  0xffff0000,  0xffffc1e7,  0x3000407f,  0xffffffff,  0xffff20bf,  0xf7ffffff,  0xffffffff,  0xffffffff,  0x3d7f3dff,  0xffffffff,  0xffff3dff,  0x7f3dffff,  0xff7fff3d,  0xffffffff,  0xff3dffff,  0xffffffff,  0x87ffffff,  0x0,  0xffff,  0xffffffff,  0xffffffff,  0x1fffff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff9fff,  0x7fffffe,  0xffffffff,  0xffffffff,  0x1c7ff,  0xfdfff,  0xfffff,  0xfffff,  0xddfff,  0xffffffff,  0xffcfffff,  0x108001ff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffff,  0xffffffff,  0xffff07ff,  0xffffffff,  0x3fffff,  0x1fffffff,  0x1ff0fff,  0xffff0000,  0x1f3fff,  0xffffffff,  0xffff0fff,  0x3ff,  0x0,  0xfffffff,  0xffffffff,  0x7fffffff,  0x1ffffe,  0x0,  0x80,  0x0,  0x0,  0xffffffff,  0xffefffff,  0xfef,  0x0,  0xffffffff,  0xfc00f3ff,  0xffffffff,  0x3ffbf,  0xffffffff,  0x3fffff,  0xfc00e000,  0x3fffffff,  0x0,  0x0,  0x0,  0x6fde00,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x0,  0x0,  0x3f3fffff,  0xffffffff,  0xaaff3f3f,  0x3fffffff,  0xffffffff,  0x5fdfffff,  0xfcf1fdc,  0x1fdc1fff,  0x0,  0x0,  0x0,  0x80020000,  0x1fff0000,  0x0,  0x0,  0x0,  0x3e2ffc84,  0xf3ffbd50,  0x43e0,  0xffffffff,  0x1ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffc00000,  0xffffffff,  0x3ff,  0xffffffff,  0xffff7fff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xc781f,  0xffffffff,  0xffff20bf,  0xffffffff,  0x80ff,  0x7fffff,  0x7f7f7f7f,  0x7f7f7f7f,  0xffffffff,  0x0,  0x8000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe0,  0x1f3e03fe,  0xfffffffe,  0xffffffff,  0xe07fffff,  0xfffffffe,  0xffffffff,  0xf7ffffff,  0xffffffe0,  0xfffe3fff,  0xffffffff,  0xffffffff,  0x7fff,  0x7ffffff,  0x0,  0xffff0000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fff,  0x0,  0xffff0000,  0x3fffffff,  0xffff1fff,  0xc00,  0xffffffff,  0x8ff07fff,  0x80ffffff,  0xffffffff,  0xffffffff,  0xffff,  0xff800000,  0xfffffffc,  0xffffffff,  0xffffffff,  0xf79ff,  0x7ff,  0x0,  0xff000000,  0xfffff7bb,  0xff,  0xffffffff,  0xfffff,  0xffffffff,  0xffffffff,  0xf,  0x8fc0000,  0xfffffc00,  0xffff07ff,  0x7ffff,  0x1fffffff,  0xffffffff,  0xfff7ffff,  0x8000,  0x0,  0xffffffff,  0x7fffff,  0x3fff,  0x47fffff,  0xffffffff,  0x7fffffff,  0x38000005,  0x3cffff,  0x7e7e7e,  0x7f7f,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x7ff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff000f,  0xfffff87f,  0xfffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xe0f8007f,  0x5f7ffdff,  0xffffffdb,  0xffffffff,  0xffffffff,  0x3ffff,  0xfff80000,  0xffffffff,  0xffffffff,  0x3fffffff,  0xffff0000,  0xffffffff,  0xfffcffff,  0xffffffff,  0xff,  0xfff0000,  0x0,  0x0,  0x0,  0xffdf0000,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fffffff,  0x0,  0x7fffffe,  0x7fffffe,  0xffffffc0,  0xffffffff,  0x7fffffff,  0x1cfcfcfc,  0x0,  0xffffefff,  0xb7ffff7f,  0x3fff3fff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7ffffff,  0x0,  0x0,  0xffffffff,  0x1fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1fffffff,  0xffffffff,  0x1ffff,  0x0,  0x7fffffff,  0xffff0000,  0x7ff,  0x0,  0x3fffffff,  0xffffffff,  0x3eff0f,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x0,  0x0,  0x0,  0xfffffd3f,  0x91bfffff,  0x3fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3fffff,  0x3ffffff,  0x0,  0x0,  0xffffffff,  0xc0ffffff,  0x0,  0x0,  0xfeeff06f,  0xfffff,  0x0,  0x1fffffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x3fffff,  0x3fffff,  0x7ffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x1ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x3f,  0x0,  0xfffffffc,  0x1ffffff,  0xffff0000,  0x1ff,  0xffffffff,  0x7ffff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x1e,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x3fffff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x7fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x1ffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffff001f,  0x7fffffff,  0xfff80000,  0x0,  0x0,  0x0,  0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffdfffff,  0xffffffff,  0xdfffffff,  0xebffde64,  0xffffffef,  0xffffffff,  0xdfdfe7bf,  0x7bffffff,  0xfffdfc5f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffff3f,  0xf7fffffd,  0xf7ffffff,  0xffdfffff,  0xffdfffff,  0xffff7fff,  0xffff7fff,  0xfffffdff,  0xfffffdff,  0xff7,  0x0,  0xffffffef,  0xaf7fe96,  0xaa96ea84,  0x5ef7f796,  0xffffbff,  0xffffbee,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffff,  0x0,  0xffffffff,  0x1fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2304 bytes
++enum markTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xe0], [ 0x100,  0x140,  0x2c00], [ 0x2020100,  0x4020302,  0x6020205,  0x2070202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020208,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xb000a,  0xd000c,  0xe,  0xf0000,  0x0,  0x100000,  0x120011,  0x140013,  0x160015,  0x0,  0x17,  0x0,  0x0,  0x0,  0x0,  0x0,  0x190018,  0x0,  0x1a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1b,  0x1d001c,  0x1f001e,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200000,  0x0,  0x21,  0x220000,  0x0,  0x0,  0x0,  0x0,  0x23,  0x0,  0x0,  0x250024,  0x0,  0x0,  0x26,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x270000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x280000,  0x29,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2a0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfffe0000,  0xbfffffff,  0xb6,  0x0,  0x7ff0000,  0x0,  0xfffff800,  0x10000,  0x0,  0x0,  0x9fc00000,  0x3d9f,  0x20000,  0xffff0000,  0x7ff,  0x0,  0x0,  0x1ffc0,  0x0,  0xff800,  0xfbc00000,  0x3eef,  0xe000000,  0x0,  0x0,  0x0,  0x0,  0x7ffffff0,  0xf,  0xdc000000,  0xfeffff,  0xc,  0xe,  0xd0000000,  0x80399f,  0xc,  0xe,  0xd0000000,  0x23987,  0x230000,  0xe,  0xd0000000,  0x3bbf,  0xc,  0xe,  0xd0000000,  0xc0399f,  0xc,  0x4,  0xc0000000,  0x803dc7,  0x0,  0xe,  0xc0000000,  0x603ddf,  0xc,  0xc,  0xd0000000,  0x603ddf,  0xc,  0xc,  0xc0000000,  0x803ddf,  0xc,  0xc,  0x0,  0xff5f8400,  0xc0000,  0x0,  0x7f20000,  0x7f80,  0x0,  0x0,  0x1bf20000,  0x3f00,  0x0,  0x3000000,  0xc2a00000,  0x0,  0xfffe0000,  0xfeffe0df,  0x1fffffff,  0x40,  0x0,  0x0,  0x7ffff800,  0xc3c00000,  0x1e3f9d,  0x3c00bffc,  0x0,  0x0,  0x0,  0x0,  0x0,  0xe0000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1c0000,  0x1c0000,  0xc0000,  0xc0000,  0x0,  0xfff00000,  0x200fffff,  0x0,  0x3800,  0x0,  0x0,  0x0,  0x0,  0x200,  0x0,  0x0,  0x0,  0xfff0fff,  0x0,  0x0,  0x0,  0xffff0000,  0x301,  0x0,  0xf800000,  0x0,  0x7fe00000,  0x9fffffff,  0x0,  0x0,  0x0,  0x0,  0x1f,  0xfff00000,  0x1f,  0xff800,  0x7,  0x3ffe,  0x0,  0xfffc0,  0x0,  0xfffff0,  0x0,  0x0,  0x0,  0x0,  0xfff70000,  0x1c21ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xf000007f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0x1ffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x38000,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x0,  0xffffffff,  0x0,  0xfc00,  0x0,  0x0,  0x6000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff78000,  0x80000000,  0x0,  0x0,  0x30000,  0x844,  0xf8,  0x0,  0x0,  0x3,  0xfff00000,  0x1f,  0x3ffff,  0x0,  0x3fc0,  0xfff80,  0x0,  0xf,  0xfff80000,  0x1,  0x0,  0x0,  0x7ffe00,  0x3008,  0x8000000,  0x0,  0xc19d0000,  0x2,  0x60f800,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x37f8,  0x40000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff,  0x7f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000000,  0xf06e,  0x87000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0xff000000,  0x7f,  0x0,  0x7,  0x7ff0000,  0x0,  0x0,  0x7,  0x1fff80,  0x0,  0x0,  0x7,  0xfff80000,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfff800,  0x0,  0x0,  0x0,  0x0,  0xfffe0000,  0x7fffffff,  0x78000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xf807e3e0,  0xfe7,  0x3c00,  0x0,  0x0,  0x0,  0x0,  0x1c,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2384 bytes
++enum numberTrieEntries = TrieEntry!(bool, 8, 6, 7)([ 0x0,  0x40,  0x180], [ 0x100,  0x280,  0x1a80], [ 0x2020100,  0x4020302,  0x2020605,  0x8070202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x40003,  0x50002,  0x20002,  0x70006,  0x60006,  0x90008,  0x6000a,  0x2000b,  0xc000c,  0x2000d,  0xe0005,  0x20002,  0x20002,  0x2000f,  0x20002,  0x20002,  0x100002,  0x110002,  0x2000e,  0x130012,  0x140002,  0xc,  0x20015,  0x20002,  0x20002,  0x20002,  0x170016,  0x190018,  0x20002,  0x20002,  0x1b001a,  0x20002,  0x20002,  0x1d001c,  0x20002,  0x20002,  0x20002,  0x20002,  0x1e0002,  0x20002,  0x20002,  0x20002,  0x2001f,  0x200002,  0x220021,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x60023,  0x20002,  0xc0024,  0xc0017,  0x2000c,  0x40002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x2000e,  0x20002,  0x260025,  0x20002,  0x280027,  0x230002,  0x20002,  0x20002,  0x20002,  0x20029,  0x2002a,  0x2002b,  0x2002c,  0x20002,  0x20002,  0x2002d,  0x20002,  0x4002e,  0xc002f,  0x20002,  0x20002,  0x20002,  0x20002,  0x50002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20030,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20031,  0x20002,  0x20002,  0x20002,  0x320002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20033,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x20002,  0x0,  0x3ff0000,  0x0,  0x0,  0x0,  0x720c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff,  0x0,  0x0,  0x0,  0x3ff0000,  0x0,  0x0,  0x3ff,  0x0,  0x0,  0x0,  0x0,  0xffc0,  0x0,  0x0,  0x0,  0x3f0ffc0,  0x0,  0x0,  0x0,  0xfcffc0,  0x0,  0x0,  0x0,  0x7ffc0,  0x0,  0x0,  0x0,  0x7f00ffc0,  0x0,  0x0,  0x0,  0x3fffc0,  0x0,  0x0,  0x3ff0000,  0x0,  0x0,  0xfffff,  0x0,  0x0,  0x3ff0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ffffe00,  0x0,  0x0,  0x0,  0x1c000,  0x0,  0x0,  0x0,  0x3ff03ff,  0x0,  0x0,  0xffc0,  0x0,  0x0,  0x0,  0x7ff0000,  0x0,  0x3ff03ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff03ff,  0x0,  0x0,  0x0,  0x0,  0x3f10000,  0x3ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0xffffffff,  0x3e7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xfffffff,  0x0,  0x0,  0xfffffc00,  0x0,  0x0,  0x0,  0xffc00000,  0xfffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000000,  0x80,  0x70003fe,  0x0,  0x0,  0x3c0000,  0x0,  0x0,  0x0,  0x0,  0x3ff,  0xfffeff00,  0x0,  0x3ff,  0xfffe0000,  0x0,  0x0,  0x0,  0x3ff,  0x0,  0x0,  0x0,  0x3f0000,  0x0,  0x0,  0xffffff80,  0xfffff,  0xffffffff,  0x1ffffff,  0x400,  0x0,  0x0,  0x0,  0x0,  0xf,  0x402,  0x0,  0x0,  0x0,  0x3e0000,  0x0,  0x0,  0x0,  0xff000000,  0x0,  0xfc00000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xff,  0x60000000,  0x0,  0x0,  0xff000000,  0xff000000,  0x0,  0x0,  0x0,  0x7fffffff,  0x0,  0x0,  0xfffc0000,  0xffff,  0x0,  0xffc00000,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7,  0x0,  0x0,  0x0,  0x3ffff,  0x0,  0x0,  0xffffc000,  0xffffffff,  0x7ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2336 bytes
++enum punctuationTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xc0], [ 0x100,  0x100,  0x3100], [ 0x2020100,  0x4020302,  0x2020605,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x20001,  0x30001,  0x50004,  0x70006,  0x10008,  0x90001,  0xb000a,  0x1000c,  0xd0001,  0x1000e,  0x10000f,  0x120011,  0x140013,  0x10015,  0x10001,  0x10016,  0x170001,  0x10001,  0x180001,  0x190001,  0x10001,  0x1b001a,  0x1001c,  0x1001d,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x1001e,  0x1001f,  0x210020,  0x230022,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x240001,  0x260025,  0x270001,  0x280001,  0x10001,  0x10001,  0x2a0029,  0x2c002b,  0x10001,  0x10001,  0x2e002d,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x1002f,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x0,  0x8c00f7ee,  0xb8000001,  0x28000000,  0x0,  0x88c00882,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x40000000,  0x80,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfc000000,  0x0,  0x600,  0x40000000,  0x49,  0x180000,  0xc8003600,  0x0,  0x0,  0x3c00,  0x0,  0x0,  0x100000,  0x0,  0x3fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3800000,  0x0,  0x7fff0000,  0x40000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10030,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x100000,  0x0,  0x0,  0xc008000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x17fff0,  0x3c000000,  0x0,  0x0,  0x20,  0x0,  0x61f0000,  0x0,  0x0,  0x0,  0xfc00,  0x0,  0x0,  0x0,  0x0,  0x8000000,  0x0,  0x0,  0x0,  0x1ff,  0x0,  0x0,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x6000,  0x18000000,  0x0,  0x0,  0x3800,  0x0,  0x600000,  0x0,  0x0,  0x0,  0x0,  0x7700000,  0x0,  0x7ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x0,  0x3f7f,  0x0,  0x0,  0x0,  0x0,  0xfc000000,  0x1,  0x0,  0x0,  0x0,  0xf0000000,  0x0,  0xf8000000,  0x0,  0xc0000000,  0x0,  0x0,  0x800ff,  0x0,  0xffff0000,  0xffff00ff,  0x7ffbffef,  0x60000000,  0x6000,  0x0,  0x0,  0x0,  0xf00,  0x600,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3fff00,  0x0,  0x0,  0x60,  0xffc0,  0x0,  0x0,  0x0,  0x0,  0x1fffff8,  0x0,  0xf000000,  0x30000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xde000000,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xfff7fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfff3ff0e,  0x20010000,  0x0,  0x0,  0x0,  0x1,  0x0,  0x8000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0xe000,  0x0,  0x0,  0x40080000,  0x0,  0x0,  0x0,  0xfc0000,  0x0,  0x0,  0x0,  0xf00000,  0x0,  0x0,  0xc000,  0x7000000,  0x0,  0xc000,  0x80000000,  0x0,  0x0,  0x0,  0xc0003ffe,  0x0,  0x0,  0x0,  0xf0000000,  0x0,  0x0,  0x0,  0xc0000000,  0x30000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x800,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff0000,  0xffff0000,  0xfff7ffff,  0xd0b,  0x0,  0x0,  0x0,  0x0,  0x8c00f7ee,  0xb8000001,  0xa8000000,  0x3f,  0x0,  0x0,  0x0,  0x0,  0x7,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x800000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x80000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1ff0000,  0x80000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfe000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3f80,  0x0,  0x0,  0xd8000000,  0x3,  0x0,  0x0,  0x0,  0xf,  0x0,  0x0,  0x0,  0x1e0,  0x0,  0x0,  0x0,  0x0,  0xf0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//2848 bytes
++enum symbolTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0xe0], [ 0x100,  0x140,  0x3d00], [ 0x3020100,  0x5030403,  0x3030306,  0x8070303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x3030303,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x80001,  0xa0009,  0xc000b,  0xe000d,  0x1000f,  0x100001,  0x10001,  0x110001,  0x120001,  0x130001,  0x10001,  0x140001,  0x160015,  0x180017,  0x170019,  0x1a0017,  0x1b0017,  0x1c0017,  0x1001d,  0x1f001e,  0x210020,  0x170022,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x230001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10024,  0x250001,  0x10026,  0x10027,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x280001,  0x290001,  0x2b002a,  0x2c0001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x2e002d,  0x30002f,  0x10001,  0x320031,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10033,  0x350034,  0x370036,  0x390038,  0x3b003a,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x0,  0x70000810,  0x40000000,  0x50000001,  0x0,  0x113d37c,  0x800000,  0x800000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfffc003c,  0xffffafe0,  0x0,  0x0,  0x0,  0x200000,  0x30,  0x0,  0x0,  0x400000,  0x0,  0x0,  0x0,  0x0,  0x4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8000,  0x0,  0x0,  0x0,  0xc9c0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x40000000,  0x60000200,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x400000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x20000,  0x0,  0x0,  0x0,  0x10000,  0x0,  0x0,  0x0,  0x7f80000,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x80000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xfce8000e,  0x1500000,  0x0,  0x0,  0x0,  0xc0000000,  0x1e0dfbf,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc0000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3ff0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8000000,  0x0,  0x0,  0x0,  0x1,  0x0,  0x0,  0x0,  0xc0000000,  0xffffffff,  0x0,  0x0,  0x0,  0x1ff007fe,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xa0000000,  0xe000e003,  0x6000e000,  0x0,  0x0,  0x40010,  0x1c000000,  0x1c00,  0x7ffffff,  0x0,  0x0,  0xc1d0037b,  0xc0042af,  0xbc1f,  0x0,  0xffff0000,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffff0ff,  0xfffff9ff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffff,  0xffffffff,  0x7f,  0x7ff,  0x0,  0xf0000000,  0xffffffff,  0xffffffff,  0x3ff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xff,  0xfff00000,  0xffffffff,  0xffffff9f,  0xffff003f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfe000007,  0xffffffff,  0xf0ffffff,  0xcfffffff,  0xffffffff,  0xffffffff,  0x3ff1fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7e0,  0x0,  0x0,  0x0,  0x0,  0xfbffffff,  0xffffffff,  0xffffffff,  0xfffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0xfff0000,  0xc0010,  0xc0c00001,  0x0,  0x0,  0x18000000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffc30000,  0x0,  0xffffffff,  0xf,  0x7fffffff,  0xfffffc00,  0x100ff,  0xffffffff,  0xfffffc00,  0x1ffff,  0xffffffff,  0x7fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x0,  0x0,  0x0,  0x0,  0xffff0000,  0xffffffff,  0x7f,  0x0,  0x7fffff,  0x3,  0x0,  0x0,  0x600,  0x0,  0x0,  0x0,  0x0,  0x3c00f00,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3800000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200,  0x0,  0x0,  0x0,  0xfffc0000,  0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30000000,  0x0,  0x0,  0x0,  0x274,  0x0,  0x0,  0x0,  0x0,  0x70000810,  0x40000000,  0x50000001,  0x0,  0x0,  0x0,  0x0,  0x30007f7f,  0x0,  0xff800000,  0x0,  0xfe000000,  0xfff03ff,  0x0,  0xffff0000,  0x1fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0xffffffff,  0xfffffe7f,  0xffffffff,  0x1c1f,  0xfffff018,  0xffffc3ff,  0x3fffffff,  0x0,  0xffffffff,  0xffffffff,  0x23,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x7fffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8000002,  0x8000000,  0x200000,  0x200000,  0x8000,  0x8000,  0x200,  0x200,  0x8,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x30000,  0xffffffff,  0xffff0fff,  0xffffffff,  0xffffffff,  0xfffff,  0x7ffe7fff,  0xfffefffe,  0x0,  0xffff0000,  0xffff7fff,  0xffffffff,  0xffff0fff,  0x7ffffff,  0x0,  0x0,  0xffffffc0,  0xffff0007,  0x7ffffff,  0x301ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffbf0001,  0xffffffff,  0x1fffffff,  0xfffff,  0xffffffff,  0x7df,  0x1ffff,  0xffffffff,  0x7fffffff,  0xfffffffd,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1effffff,  0xffffffff,  0x3fffffff,  0xffff000f,  0xff,  0x0,  0x0,  0x0,  0xf8000000,  0xffffffff,  0xffffffff,  0xffe1,  0x0,  0xffffffff,  0xffffffff,  0x3f,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//4576 bytes
++enum graphicalTrieEntries = TrieEntry!(bool, 8, 5, 8)([ 0x0,  0x40,  0x170], [ 0x100,  0x260,  0x6100], [ 0x3020100,  0x7060504,  0xb0a0908,  0xe0d0c0a,  0x3030303,  0x100a0f03,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a11,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0xa0a0a0a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x20001,  0x30001,  0x50004,  0x70006,  0x90008,  0xb000a,  0xd000c,  0x1000e,  0x10000f,  0x10001,  0x120011,  0x140013,  0x160015,  0x180017,  0x190001,  0x1b001a,  0x1c0001,  0x1001d,  0x1e0001,  0x10001,  0x1f0001,  0x210020,  0x230022,  0x250024,  0x10026,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x270001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x280001,  0x10001,  0x10001,  0x10029,  0x2b002a,  0x2d002c,  0x2f002e,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x300001,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x10031,  0x330032,  0x340001,  0x360035,  0x380037,  0x3a0039,  0x31003b,  0x310031,  0x3d003c,  0x3f003e,  0x310040,  0x310041,  0x430042,  0x310031,  0x310031,  0x310044,  0x310031,  0x310031,  0x310031,  0x310031,  0x10001,  0x450001,  0x310046,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x10001,  0x10001,  0x310047,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x10001,  0x310048,  0x310031,  0x490031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x31004a,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x4c004b,  0x4e004d,  0x50004f,  0x520051,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310053,  0x550054,  0x570056,  0x590058,  0x5b005a,  0x310031,  0x310031,  0x310031,  0x310031,  0x10001,  0x10001,  0x10001,  0x1005c,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x10001,  0x5d0001,  0x31005e,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x10001,  0x31005e,  0x310031,  0x310031,  0x5f0031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x310031,  0x0,  0xffffffff,  0xffffffff,  0x7fffffff,  0x0,  0xffffdfff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7cffffff,  0xffffd7f0,  0xfffffffb,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffe00ff,  0xfe7fffff,  0xfffffffe,  0xfffe86ff,  0xffffffff,  0xffff00ff,  0x1f07ff,  0xcfffffc0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xdfffffff,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffe7ff,  0xffffffff,  0xffffffff,  0x3ffff,  0xffffffff,  0x7ffffff,  0xffffffff,  0x7fff3fff,  0x4fffffff,  0x0,  0x0,  0x1ffd,  0x0,  0x7ffffff0,  0xffffffff,  0xffffffff,  0xffffffff,  0xfeffffff,  0xfff99fee,  0xf3c5fdff,  0xb080799f,  0xfffffcf,  0xfff987ee,  0xd36dfdff,  0x5e023987,  0x3fffc0,  0xfffbbfee,  0xf3edfdff,  0x13bbf,  0x3ffcf,  0xfff99fee,  0xf3edfdff,  0xb0c0399f,  0xffffcf,  0xd63dc7ec,  0xc3ffc718,  0x813dc7,  0x7ffffc0,  0xfffddfee,  0xe3effdff,  0x3603ddf,  0xff00ffcf,  0xfffddfec,  0xf3effdff,  0x40603ddf,  0x6ffcf,  0xfffddfec,  0xe7ffffff,  0x807ddf,  0xfe3fffcf,  0xfc7fffec,  0x2ffbffff,  0xff5f847f,  0x1c0000,  0xfffffffe,  0x87ffffff,  0xfffffff,  0x0,  0xfef02596,  0x3bffecae,  0xf3ff3f5f,  0x0,  0xffffffff,  0xffffffff,  0xfffffeff,  0xfffe1fff,  0xfeffffff,  0xdfffffff,  0x7ffdfff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff20bf,  0xffffffff,  0xffffffff,  0xffffffff,  0x3d7f3dff,  0xffffffff,  0xffff3dff,  0x7f3dffff,  0xff7fff3d,  0xffffffff,  0xff3dffff,  0xffffffff,  0xe7ffffff,  0x1fffffff,  0x3ffffff,  0xffffffff,  0xffffffff,  0x1fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fffffff,  0xffffffff,  0xffffffff,  0x1ffff,  0x1fdfff,  0x7fffff,  0xfffff,  0xddfff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x3ff03ff,  0x3ff3fff,  0xffffffff,  0xffffffff,  0xffffff,  0xffffffff,  0xffff07ff,  0xffffffff,  0x3fffff,  0x1fffffff,  0xfff0fff,  0xfffffff1,  0x1f3fff,  0xffffffff,  0xffff0fff,  0xc7ff03ff,  0xffffffff,  0xcfffffff,  0xffffffff,  0x7fffffff,  0x9fffffff,  0x3ff03ff,  0x3fff,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffff0fff,  0x1fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf00fffff,  0xffffffff,  0xf8ffffff,  0xffffe3ff,  0xffffffff,  0x0,  0x0,  0xffff00ff,  0x7fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf000007f,  0x3f3fffff,  0xffffffff,  0xaaff3f3f,  0x3fffffff,  0xffffffff,  0xffdfffff,  0xefcfffdf,  0x7fdcffff,  0xffff07ff,  0xffff80ff,  0xffffffff,  0xfff30000,  0x1fff7fff,  0x7ffffff,  0xffff0000,  0x1ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff03ff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffff,  0xffffffff,  0x7f,  0x7ff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3ff1fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffff7fff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xfe0fffff,  0xffffffff,  0xffff20bf,  0xffffffff,  0x800180ff,  0x7fffff,  0x7f7f7f7f,  0x7f7f7f7f,  0xffffffff,  0xffffffff,  0xfffffff,  0x0,  0x0,  0xfbffffff,  0xffffffff,  0xffffffff,  0xfffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0xfff0000,  0xffffffff,  0xffffffff,  0xfffffffe,  0xffffffff,  0xfe7fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffe0,  0xfffe3fff,  0xffffffff,  0xffffffff,  0xffff7fff,  0x7ffffff,  0xffffffff,  0xffff000f,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff1fff,  0xffffffff,  0xffff007f,  0xffffffff,  0xffffffff,  0xfff,  0xffffffff,  0xffffffff,  0x80ffffff,  0xffffffff,  0xffffffff,  0xffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf7fff,  0x7ff,  0x0,  0xff000000,  0xffffffff,  0x3ff0fff,  0xffffffff,  0xffffff,  0xffffffff,  0xffffffff,  0x3ffc01f,  0xfffffff,  0xffffffff,  0xffffffff,  0x800fffff,  0x1fffffff,  0xffffffff,  0xffffffff,  0xc3ffbfff,  0x0,  0xffffffff,  0x7fffff,  0xf3ff3fff,  0xfffffff,  0xffffffff,  0xffffffff,  0xf8000007,  0x7fffff,  0x7e7e7e,  0x7f7f,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x3ff3fff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff000f,  0xfffff87f,  0xfffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff3fff,  0xffffffff,  0xffffffff,  0x3ffffff,  0x0,  0xe0f8007f,  0x5f7fffff,  0xffffffdb,  0xffffffff,  0xffffffff,  0xffffffff,  0xfff80003,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0000,  0xffffffff,  0xfffcffff,  0xffffffff,  0xff,  0x3fff0000,  0x3ffffff,  0xffff007f,  0xfff7ffff,  0xffdf0f7f,  0xffffffff,  0xffffffff,  0xffffffff,  0x1fffffff,  0xfffffffe,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffffff,  0x1cfcfcfc,  0x30007f7f,  0xffffefff,  0xb7ffff7f,  0x3fff3fff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7ffffff,  0xffffff87,  0xff8fffff,  0xffffffff,  0xffffffff,  0xfff07ff,  0x0,  0xffff0000,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x1fffffff,  0xffffffff,  0x1ffff,  0x0,  0x7fffffff,  0xffff000f,  0x7ff,  0x0,  0xbfffffff,  0xffffffff,  0x3fff0f,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x3ff,  0x0,  0x0,  0xfffffd3f,  0x91bfffff,  0xffbfffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x8fffffff,  0x83ffffff,  0x0,  0x0,  0xffffffff,  0xc0ffffff,  0x0,  0x0,  0xfeeff06f,  0x870fffff,  0x1ff00ff,  0xffffffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xfe3fffff,  0xff3fffff,  0xff07ffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x1ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7fffffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xfffc3fff,  0xffff,  0xffffffff,  0xdfffffff,  0xffff0003,  0x3ff01ff,  0xffffffff,  0xffdfffff,  0xf,  0x0,  0xffffffff,  0xffffffff,  0x3ff01ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffff,  0x3ff,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xf0007,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x7fff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0x1ffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffff001f,  0x7fffffff,  0xffff8000,  0x0,  0x0,  0x0,  0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffff,  0xffffffff,  0xfffffe7f,  0xffffffff,  0xf807ffff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x0,  0xffffffff,  0xffffffff,  0x3f,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0x7fffff,  0x3ffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffdfffff,  0xffffffff,  0xdfffffff,  0xebffde64,  0xffffffef,  0xffffffff,  0xdfdfe7bf,  0x7bffffff,  0xfffdfc5f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffff3f,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffcfff,  0xffffffff,  0xffffffef,  0xaf7fe96,  0xaa96ea84,  0x5ef7f796,  0xffffbff,  0xffffbee,  0x0,  0x30000,  0xffffffff,  0xffff0fff,  0xffffffff,  0xffffffff,  0xfffff,  0x7ffe7fff,  0xfffefffe,  0x0,  0xffff07ff,  0xffff7fff,  0xffffffff,  0xffff0fff,  0x7ffffff,  0x0,  0x0,  0xffffffc0,  0xffff0007,  0x7ffffff,  0x301ff,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffbf0001,  0xffffffff,  0x1fffffff,  0xfffff,  0xffffffff,  0x7df,  0x1ffff,  0xffffffff,  0x7fffffff,  0xfffffffd,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1effffff,  0xffffffff,  0x3fffffff,  0xffff000f,  0xff,  0x0,  0x0,  0x0,  0xf8000000,  0xffffffff,  0xffffffff,  0xffe1,  0x0,  0xffffffff,  0xffffffff,  0x3f,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xfffff,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x7fffff,  0x0,  0xffffffff,  0x1fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3fffffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0]);
++//3664 bytes
++enum nonCharacterTrieEntries = TrieEntry!(bool, 7, 4, 4, 6)([ 0x0,  0x20,  0x98,  0x208], [ 0x80,  0xf0,  0x2e0,  0x3180], [ 0x3020100,  0x7060504,  0xa090808,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0b,  0xb0b0b0c,  0xd080808,  0xd080808,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xb000a,  0xd000c,  0xd000d,  0xd000d,  0xe000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xf000d,  0x10000d,  0xd0011,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0x12000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0x140013,  0x160015,  0x180017,  0x1a0019,  0x1b001b,  0x1d001c,  0x1b001b,  0x1e000d,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x20001f,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b0021,  0x1b001b,  0x1b001b,  0x1b001b,  0x230022,  0x1b001b,  0x1b001b,  0x24001b,  0x260025,  0x1b001b,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0x27000d,  0xd000d,  0x28000d,  0x1b0029,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b002a,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b002b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0x1b001b,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0x2c000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0xd000d,  0x2c000d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x10000,  0x2,  0x0,  0x0,  0x40003,  0x60005,  0x7,  0x0,  0x90008,  0xb000a,  0xd000c,  0xf000e,  0x100000,  0x120011,  0x140013,  0x160015,  0x180017,  0x1a0019,  0x1c001b,  0x1e001d,  0x20001f,  0x220021,  0x240023,  0x260025,  0x270000,  0x290028,  0x0,  0x2a0000,  0x0,  0x0,  0x2b0000,  0x2d002c,  0x2f002e,  0x310030,  0x0,  0x0,  0x0,  0x0,  0x0,  0x330032,  0x350034,  0x360000,  0x380037,  0x3a0039,  0x3c003b,  0x3e003d,  0x40003f,  0x420041,  0x430000,  0x440000,  0x460045,  0x470042,  0x0,  0x480000,  0x0,  0x0,  0x4a0049,  0x4c004b,  0x4d0000,  0x4f004e,  0x0,  0x50,  0x0,  0x0,  0x0,  0x510000,  0x530052,  0x0,  0x0,  0x0,  0x0,  0x0,  0x54,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x550000,  0x420042,  0x570056,  0x580000,  0x5a0059,  0x5c005b,  0x42005d,  0x51005e,  0x0,  0x5f0000,  0x540000,  0x60,  0x61,  0x630062,  0x57,  0x640000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x3a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x650000,  0x0,  0x670066,  0x0,  0x0,  0x68,  0x380069,  0x0,  0x6b006a,  0x38006c,  0x6d0000,  0x6e0000,  0x6f0000,  0x710070,  0x720000,  0x420073,  0x740042,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x750063,  0x0,  0x0,  0x0,  0x0,  0x760000,  0x770000,  0x790078,  0x7a0000,  0x0,  0x0,  0x7b0000,  0x7d007c,  0x7f007e,  0x800000,  0x54,  0x810064,  0x830082,  0xb0000,  0x84,  0x860085,  0x420042,  0x870032,  0x890088,  0x8b008a,  0x0,  0x42008c,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x8e008d,  0x420042,  0x42008f,  0x420090,  0x920091,  0x420042,  0x940093,  0x420042,  0x950000,  0x420042,  0x420042,  0x420042,  0x960042,  0x420042,  0x420042,  0x420042,  0x970000,  0x980000,  0x99004b,  0x9a0000,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x9b0038,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9c0000,  0x420042,  0x9d0000,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x42009c,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x0,  0x0,  0x0,  0x0,  0x42009e,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x9f0000,  0x4200a0,  0x4200a1,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x0,  0x3a0000,  0xa2,  0xa30000,  0xa40000,  0x420042,  0xa50000,  0x420042,  0xa60000,  0xa800a7,  0xaa00a9,  0x0,  0x0,  0xab,  0x0,  0xac0000,  0x420042,  0x420042,  0x420042,  0x420042,  0xae00ad,  0xb000af,  0x420042,  0x420042,  0x3d,  0xb200b1,  0x3d00b3,  0xb500b4,  0xb700b6,  0x420042,  0xb900b8,  0xbb00ba,  0xbc0064,  0xbd0000,  0xbf00be,  0xc00042,  0xc10000,  0xa40000,  0x510000,  0x420042,  0x0,  0x0,  0x0,  0x0,  0x0,  0xc20000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x31,  0x0,  0x4200a3,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x420042,  0x0,  0x0,  0x0,  0x0,  0x4200a3,  0x420042,  0x420042,  0x420042,  0xc3,  0x420042,  0x0,  0xc40000,  0x420042,  0x420042,  0x420042,  0x420042,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbe0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xbe0000,  0x0,  0x0,  0x0,  0x83000000,  0x280f,  0x4,  0x0,  0x1ff00,  0x1800000,  0x1,  0x17900,  0x0,  0xff00,  0xffe0f800,  0x20000020,  0x0,  0x4000,  0x0,  0x1800,  0x0,  0x0,  0xfffc0000,  0x0,  0xf8000000,  0x0,  0x8000c000,  0xb0000000,  0xffffffff,  0xffffffff,  0xffffe002,  0xffffffff,  0x8000000f,  0x0,  0x1000000,  0x66011,  0xc3a0200,  0x4f7f8660,  0xf0000030,  0x67811,  0x2c920200,  0xa1fdc678,  0xffc0003f,  0x44011,  0xc120200,  0xfffec440,  0xfffc0030,  0x66011,  0xc120200,  0x4f3fc660,  0xff000030,  0x29c23813,  0x3c0038e7,  0xff7ec238,  0xf800003f,  0x22011,  0x1c100200,  0xfc9fc220,  0xff0030,  0x22013,  0xc100200,  0xbf9fc220,  0xfff90030,  0x22013,  0x18000000,  0xff7f8220,  0x1c00030,  0x3800013,  0xd0040000,  0xa07b80,  0xffe3ffff,  0x1,  0x78000000,  0xf0000000,  0xffffffff,  0x10fda69,  0xc4001351,  0xc00c0a0,  0xffffffff,  0x100,  0x1e000,  0x1000000,  0x20000000,  0xf8002000,  0xffffffff,  0xdf40,  0x0,  0xc280c200,  0x0,  0xc200,  0x80c20000,  0x8000c2,  0x0,  0xc20000,  0x0,  0x18000000,  0xe0000000,  0xfc000000,  0x0,  0x0,  0xffe00000,  0xe0000000,  0x0,  0x0,  0xfffe0000,  0xffe02000,  0xff800000,  0xfff00000,  0xfff22000,  0xc0000000,  0xfc00fc00,  0xfc008000,  0x0,  0x0,  0xff000000,  0x0,  0xf800,  0x0,  0xffc00000,  0xe0000000,  0xf000f000,  0xe,  0xffe0c000,  0x0,  0xf000,  0x3800fc00,  0x0,  0x30000000,  0x0,  0x80000000,  0x60000000,  0xfc00fc00,  0xffffc000,  0xffffffff,  0xffffffff,  0xf000,  0xe0000000,  0x0,  0xff00000,  0x0,  0x7000000,  0x1c00,  0x0,  0xff00,  0xff800000,  0x0,  0xfffff80,  0xc0c00000,  0x0,  0x5500c0c0,  0xc0000000,  0x0,  0x200000,  0x10300020,  0x80230000,  0x0,  0xc0020,  0xe0008000,  0xf8000000,  0xffff,  0xfffe0000,  0xfc00,  0x0,  0x0,  0xfff00000,  0x0,  0xffffff80,  0xfffff800,  0x0,  0x1,  0x0,  0xfc00e000,  0xffffffff,  0x0,  0x8000,  0x80000000,  0x0,  0x0,  0x1f00000,  0x0,  0xdf40,  0x0,  0x7ffe7f00,  0xff800000,  0x80808080,  0x80808080,  0x0,  0x0,  0xf0000000,  0x4000000,  0x0,  0xffc00000,  0xf000ffff,  0x1800000,  0x0,  0x1f,  0x1c000,  0x8000,  0xf8000000,  0x0,  0xfff0,  0x0,  0x80000000,  0xffffe000,  0xffffffff,  0xe000,  0x0,  0xff80,  0x0,  0x0,  0xfffff000,  0x7f000000,  0x0,  0xfff08000,  0xfffff800,  0xffffffff,  0xffffff,  0x0,  0xfc00f000,  0xfc003fe0,  0xf0000000,  0x7ff00000,  0xe0000000,  0x3c004000,  0xffffffff,  0x0,  0xff800000,  0xc00c000,  0xf0000000,  0x7fffff8,  0xff800000,  0xff818181,  0xffff8080,  0x0,  0xfc00c000,  0x780,  0xf0000000,  0x0,  0xc000,  0xfc000000,  0xffffffff,  0x1f07ff80,  0xa0800000,  0x24,  0x0,  0x7fffc,  0x0,  0xffff,  0x0,  0x30000,  0x0,  0xffffff00,  0xc000ffff,  0xfc000000,  0xff80,  0x80000,  0x20f080,  0x0,  0x60000000,  0xe3030303,  0xc1ff8080,  0x1000,  0x48000080,  0xc000c000,  0xffffffff,  0x78,  0x700000,  0xf000f800,  0xffffffff,  0xffff,  0xc0000000,  0xfffe0000,  0xffffffff,  0x80000000,  0xfff0,  0xfffff800,  0xffffffff,  0x40000000,  0x0,  0xffc000f0,  0xffffffff,  0xc0000000,  0xfffffc00,  0x2c0,  0x6e400000,  0x400000,  0xffffffff,  0x70000000,  0x7c000000,  0x0,  0x3f000000,  0x1100f90,  0x78f00000,  0xfe00ff00,  0x0,  0x0,  0x1c00000,  0xc00000,  0xf80000,  0xfffffe00,  0xffffffff,  0xffffffff,  0x80000000,  0x3c000,  0xffff0000,  0xfffc,  0xfc00fe00,  0xfffffff0,  0xffffffff,  0xfc00fe00,  0xffffffff,  0xfffffc00,  0xffffffff,  0x0,  0xffff8000,  0x0,  0xfff0fff8,  0x0,  0xfe000000,  0xffe0,  0x80000000,  0x7fff,  0xffffffff,  0xfffffffc,  0xffffffff,  0x0,  0x180,  0xc0000000,  0xffffffff,  0xffffffc0,  0xffffffff,  0xff800000,  0xfffc0000,  0x200000,  0x0,  0x20000000,  0x1400219b,  0x10,  0x0,  0x20201840,  0x84000000,  0x203a0,  0x0,  0x0,  0xc0,  0x3000,  0x0,  0x10,  0xf5080169,  0x5569157b,  0xa1080869,  0xf0000400,  0xf0000411,  0xffffffff,  0xfffcffff,  0xfff00000,  0x80018000,  0x10001,  0xffffffff,  0xf800,  0x8000,  0xf8000000,  0xffffffff,  0xffffffff,  0x3f,  0xfff8,  0xf8000000,  0xfffcfe00,  0xffffffff,  0x0,  0x40fffe,  0x0,  0xe0000000,  0xfff00000,  0x0,  0xfffff820,  0xfffe0000,  0x2,  0x0,  0x0,  0xe1000000,  0x0,  0xc0000000,  0xfff0,  0xffffff00,  0xffffffff,  0x7ffffff,  0xffff001e,  0xffffffff,  0xff800000,  0xffffffff,  0xfffffffd,  0x0,  0x0,  0xffff0000,  0x0,  0xc0000000]);
++enum MAX_SIMPLE_LOWER = 1043;
++enum MAX_SIMPLE_UPPER = 1051;
++enum MAX_SIMPLE_TITLE = 1055;
++//8192 bytes
++enum toUpperIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x200], [ 0x100,  0x380,  0xc00], [ 0x2020100,  0x4020302,  0x2020205,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xa,  0xb0000,  0xd000c,  0xf000e,  0x110010,  0x130012,  0x14,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x150000,  0x0,  0x170016,  0x190018,  0x1b001a,  0x1d001c,  0x0,  0x0,  0x1e0000,  0x1f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x220021,  0x240023,  0x25,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x260000,  0x27,  0x290028,  0x2a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2e002d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x20001,  0x40003,  0x60005,  0x80007,  0xa0009,  0xc000b,  0xe000d,  0x10000f,  0x120011,  0x140013,  0x160015,  0x180017,  0xffff0019,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1affff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x41bffff,  0x1c001b,  0x1e001d,  0x20001f,  0x220021,  0x240023,  0x260025,  0x280027,  0x2a0029,  0x2c002b,  0x2e002d,  0x30002f,  0xffff0031,  0x330032,  0x350034,  0x370036,  0x390038,  0x3affff,  0x3bffff,  0x3cffff,  0x3dffff,  0x3effff,  0x3fffff,  0x40ffff,  0x41ffff,  0x42ffff,  0x43ffff,  0x44ffff,  0x45ffff,  0x46ffff,  0x47ffff,  0x48ffff,  0x49ffff,  0x4affff,  0x4bffff,  0x4cffff,  0x4dffff,  0x4effff,  0x4fffff,  0x50ffff,  0x51ffff,  0x52041d,  0x53ffff,  0x54ffff,  0x55ffff,  0xffffffff,  0xffff0056,  0xffff0057,  0xffff0058,  0xffff0059,  0xffff005a,  0xffff005b,  0xffff005c,  0x43a005d,  0x5effff,  0x5fffff,  0x60ffff,  0x61ffff,  0x62ffff,  0x63ffff,  0x64ffff,  0x65ffff,  0x66ffff,  0x67ffff,  0x68ffff,  0x69ffff,  0x6affff,  0x6bffff,  0x6cffff,  0x6dffff,  0x6effff,  0x6fffff,  0x70ffff,  0x71ffff,  0x72ffff,  0x73ffff,  0x74ffff,  0xffffffff,  0xffff0075,  0xffff0076,  0x780077,  0xffff0079,  0x7affff,  0x7bffff,  0xffffffff,  0xffff007c,  0xffffffff,  0xffff007d,  0xffffffff,  0xffffffff,  0xffff007e,  0x7fffff,  0xffffffff,  0x80ffff,  0xffff0081,  0xffffffff,  0xffff0082,  0x83ffff,  0x84ffff,  0x85ffff,  0xffffffff,  0xffff0086,  0xffffffff,  0x87ffff,  0xffffffff,  0xffff0088,  0xffffffff,  0xffff0089,  0xffff008a,  0x8bffff,  0xffffffff,  0x8cffff,  0x8dffff,  0xffffffff,  0xffffffff,  0x8effff,  0xffff008f,  0x910090,  0x92ffff,  0xffff0093,  0xffff0094,  0xffff0095,  0xffff0096,  0xffff0097,  0xffff0098,  0xffff0099,  0xffff009a,  0x9c009b,  0x9dffff,  0x9effff,  0x9fffff,  0xa0ffff,  0xa1ffff,  0xa2ffff,  0xa3ffff,  0xa4ffff,  0xa5ffff,  0xffff0442,  0xa700a6,  0xa8ffff,  0xffffffff,  0xa9ffff,  0xaaffff,  0xabffff,  0xacffff,  0xadffff,  0xaeffff,  0xafffff,  0xb0ffff,  0xb1ffff,  0xb2ffff,  0xb3ffff,  0xb4ffff,  0xb5ffff,  0xb6ffff,  0xb7ffff,  0xb8ffff,  0xb9ffff,  0xbaffff,  0xbbffff,  0xbcffff,  0xffffffff,  0xbdffff,  0xbeffff,  0xbfffff,  0xc0ffff,  0xc1ffff,  0xc2ffff,  0xc3ffff,  0xc4ffff,  0xc5ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff00c6,  0xc7ffff,  0xffff00c8,  0xffff00c9,  0xffffffff,  0xcaffff,  0xcbffff,  0xccffff,  0xcdffff,  0xceffff,  0xd000cf,  0xd200d1,  0xffff00d3,  0xd500d4,  0xd6ffff,  0xd7ffff,  0xffffffff,  0xffffffff,  0xffff00d8,  0xd9ffff,  0xdaffff,  0xffff00db,  0xdd00dc,  0xdeffff,  0xffffffff,  0xdfffff,  0xe0ffff,  0xffff00e1,  0xe2ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xe3ffff,  0xffffffff,  0xffff00e4,  0xe5ffff,  0xffffffff,  0xffffffff,  0xe700e6,  0xe900e8,  0xffff00ea,  0xffffffff,  0xffffffff,  0xffff00eb,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xecffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xedffff,  0xeeffff,  0xffffffff,  0xefffff,  0xffffffff,  0xf0ffff,  0xf200f1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff043c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf400f3,  0xf600f5,  0xf7043f,  0xf900f8,  0xfb00fa,  0xfd00fc,  0xff00fe,  0x1010100,  0x1030102,  0x1050104,  0x1070106,  0x1090108,  0x10b010a,  0x10d010c,  0x10f010e,  0x1110110,  0x1130112,  0xffff0114,  0x1160115,  0xffffffff,  0x117ffff,  0x1190118,  0x11affff,  0x11bffff,  0x11cffff,  0x11dffff,  0x11effff,  0x11fffff,  0x120ffff,  0x121ffff,  0x122ffff,  0x123ffff,  0x124ffff,  0x125ffff,  0x1270126,  0xffff0128,  0x129ffff,  0xffffffff,  0xffff012a,  0x12bffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x12d012c,  0x12f012e,  0x1310130,  0x1330132,  0x1350134,  0x1370136,  0x1390138,  0x13b013a,  0x13d013c,  0x13f013e,  0x1410140,  0x1430142,  0x1450144,  0x1470146,  0x1490148,  0x14b014a,  0x14d014c,  0x14f014e,  0x1510150,  0x1530152,  0x1550154,  0x1570156,  0x1590158,  0x15b015a,  0x15cffff,  0x15dffff,  0x15effff,  0x15fffff,  0x160ffff,  0x161ffff,  0x162ffff,  0x163ffff,  0x164ffff,  0x165ffff,  0x166ffff,  0x167ffff,  0x168ffff,  0x169ffff,  0x16affff,  0x16bffff,  0x16cffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x16dffff,  0x16effff,  0x16fffff,  0x170ffff,  0x171ffff,  0x172ffff,  0x173ffff,  0x174ffff,  0x175ffff,  0x176ffff,  0x177ffff,  0x178ffff,  0x179ffff,  0x17affff,  0x17bffff,  0x17cffff,  0x17dffff,  0x17effff,  0x17fffff,  0x180ffff,  0x181ffff,  0x182ffff,  0x183ffff,  0x184ffff,  0x185ffff,  0x186ffff,  0x187ffff,  0xffffffff,  0xffff0188,  0xffff0189,  0xffff018a,  0xffff018b,  0xffff018c,  0xffff018d,  0x18f018e,  0x190ffff,  0x191ffff,  0x192ffff,  0x193ffff,  0x194ffff,  0x195ffff,  0x196ffff,  0x197ffff,  0x198ffff,  0x199ffff,  0x19affff,  0x19bffff,  0x19cffff,  0x19dffff,  0x19effff,  0x19fffff,  0x1a0ffff,  0x1a1ffff,  0x1a2ffff,  0x1a3ffff,  0x1a4ffff,  0x1a5ffff,  0x1a6ffff,  0x1a7ffff,  0x1a8ffff,  0x1a9ffff,  0x1aaffff,  0x1abffff,  0x1acffff,  0x1adffff,  0x1aeffff,  0x1afffff,  0x1b0ffff,  0x1b1ffff,  0x1b2ffff,  0x1b3ffff,  0x1b4ffff,  0x1b5ffff,  0x1b6ffff,  0x1b7ffff,  0x1b8ffff,  0x1b9ffff,  0x1baffff,  0x1bbffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1bcffff,  0x1be01bd,  0x1c001bf,  0x1c201c1,  0x1c401c3,  0x1c601c5,  0x1c801c7,  0x1ca01c9,  0x1cc01cb,  0x1ce01cd,  0x1d001cf,  0x1d201d1,  0x1d401d3,  0x1d601d5,  0x1d801d7,  0x1da01d9,  0x1dc01db,  0x1de01dd,  0x1e001df,  0x42e01e1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1e2ffff,  0xffffffff,  0x1e3ffff,  0xffffffff,  0x1e4ffff,  0x1e5ffff,  0x1e6ffff,  0x1e7ffff,  0x1e8ffff,  0x1e9ffff,  0x1eaffff,  0x1ebffff,  0x1ecffff,  0x1edffff,  0x1eeffff,  0x1efffff,  0x1f0ffff,  0x1f1ffff,  0x1f2ffff,  0x1f3ffff,  0x1f4ffff,  0x1f5ffff,  0x1f6ffff,  0x1f7ffff,  0x1f8ffff,  0x1f9ffff,  0x1faffff,  0x1fbffff,  0x1fcffff,  0x1fdffff,  0x1feffff,  0x1ffffff,  0x200ffff,  0x201ffff,  0x202ffff,  0x203ffff,  0x204ffff,  0x205ffff,  0x206ffff,  0x207ffff,  0x208ffff,  0x209ffff,  0x20affff,  0x20bffff,  0x20cffff,  0x20dffff,  0x20effff,  0x20fffff,  0x210ffff,  0x211ffff,  0x212ffff,  0x213ffff,  0x214ffff,  0x215ffff,  0x216ffff,  0x217ffff,  0x218ffff,  0x219ffff,  0x21affff,  0x21bffff,  0x21cffff,  0x21dffff,  0x21effff,  0x21fffff,  0x220ffff,  0x221ffff,  0x222ffff,  0x223ffff,  0x224ffff,  0x225ffff,  0x226ffff,  0x227ffff,  0x228ffff,  0x229ffff,  0x22affff,  0x22bffff,  0x22cffff,  0x22dffff,  0x22effff,  0x4460444,  0x44a0448,  0x22f044c,  0xffffffff,  0xffffffff,  0x230ffff,  0x231ffff,  0x232ffff,  0x233ffff,  0x234ffff,  0x235ffff,  0x236ffff,  0x237ffff,  0x238ffff,  0x239ffff,  0x23affff,  0x23bffff,  0x23cffff,  0x23dffff,  0x23effff,  0x23fffff,  0x240ffff,  0x241ffff,  0x242ffff,  0x243ffff,  0x244ffff,  0x245ffff,  0x246ffff,  0x247ffff,  0x248ffff,  0x249ffff,  0x24affff,  0x24bffff,  0x24cffff,  0x24dffff,  0x24effff,  0x24fffff,  0x250ffff,  0x251ffff,  0x252ffff,  0x253ffff,  0x254ffff,  0x255ffff,  0x256ffff,  0x257ffff,  0x258ffff,  0x259ffff,  0x25affff,  0x25bffff,  0x25cffff,  0x25dffff,  0x25effff,  0x25fffff,  0x2610260,  0x2630262,  0x2650264,  0x2670266,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2690268,  0x26b026a,  0x26d026c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x26f026e,  0x2710270,  0x2730272,  0x2750274,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2770276,  0x2790278,  0x27b027a,  0x27d027c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x27f027e,  0x2810280,  0x2830282,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x284044e,  0x2850450,  0x2860453,  0x2870456,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2890288,  0x28b028a,  0x28d028c,  0x28f028e,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2910290,  0x2930292,  0x2950294,  0x2970296,  0x2990298,  0x29b029a,  0x29d029c,  0xffffffff,  0x4790477,  0x47d047b,  0x481047f,  0x4850483,  0x4890487,  0x48d048b,  0x491048f,  0x4950493,  0x4990497,  0x49d049b,  0x4a1049f,  0x4a504a3,  0x4a904a7,  0x4ad04ab,  0x4b104af,  0x4b504b3,  0x4b904b7,  0x4bd04bb,  0x4c104bf,  0x4c504c3,  0x4c904c7,  0x4cd04cb,  0x4d104cf,  0x4d504d3,  0x2b702b6,  0x4d704e3,  0xffff04e5,  0x4ef0459,  0xffffffff,  0xffffffff,  0xffff04d9,  0xffff02b9,  0xffffffff,  0x4db04e7,  0xffff04e9,  0x4f2045b,  0xffffffff,  0xffffffff,  0xffff04dd,  0xffffffff,  0x2bc02bb,  0x460045d,  0xffffffff,  0x4650463,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2be02bd,  0x46b0468,  0x2bf046e,  0x4720470,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4df04eb,  0xffff04ed,  0x4f50475,  0xffffffff,  0xffffffff,  0xffff04e1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff02c1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2c302c2,  0x2c502c4,  0x2c702c6,  0x2c902c8,  0x2cb02ca,  0x2cd02cc,  0x2cf02ce,  0x2d102d0,  0xffffffff,  0xffffffff,  0xffff02d2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2d402d3,  0x2d602d5,  0x2d802d7,  0x2da02d9,  0x2dc02db,  0x2de02dd,  0x2e002df,  0x2e202e1,  0x2e402e3,  0x2e602e5,  0x2e802e7,  0x2ea02e9,  0x2ec02eb,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2ee02ed,  0x2f002ef,  0x2f202f1,  0x2f402f3,  0x2f602f5,  0x2f802f7,  0x2fa02f9,  0x2fc02fb,  0x2fe02fd,  0x30002ff,  0x3020301,  0x3040303,  0x3060305,  0x3080307,  0x30a0309,  0x30c030b,  0x30e030d,  0x310030f,  0x3120311,  0x3140313,  0x3160315,  0x3180317,  0x31a0319,  0xffff031b,  0x31cffff,  0xffffffff,  0x31dffff,  0xffff031e,  0xffff031f,  0xffff0320,  0xffff0321,  0xffffffff,  0xffffffff,  0x322ffff,  0xffffffff,  0xffff0323,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x324ffff,  0x325ffff,  0x326ffff,  0x327ffff,  0x328ffff,  0x329ffff,  0x32affff,  0x32bffff,  0x32cffff,  0x32dffff,  0x32effff,  0x32fffff,  0x330ffff,  0x331ffff,  0x332ffff,  0x333ffff,  0x334ffff,  0x335ffff,  0x336ffff,  0x337ffff,  0x338ffff,  0x339ffff,  0x33affff,  0x33bffff,  0x33cffff,  0x33dffff,  0x33effff,  0x33fffff,  0x340ffff,  0x341ffff,  0x342ffff,  0x343ffff,  0x344ffff,  0x345ffff,  0x346ffff,  0x347ffff,  0x348ffff,  0x349ffff,  0x34affff,  0x34bffff,  0x34cffff,  0x34dffff,  0x34effff,  0x34fffff,  0x350ffff,  0x351ffff,  0x352ffff,  0x353ffff,  0x354ffff,  0x355ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0356,  0xffff0357,  0xffffffff,  0x358ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x35a0359,  0x35c035b,  0x35e035d,  0x360035f,  0x3620361,  0x3640363,  0x3660365,  0x3680367,  0x36a0369,  0x36c036b,  0x36e036d,  0x370036f,  0x3720371,  0x3740373,  0x3760375,  0x3780377,  0x37a0379,  0x37c037b,  0x37e037d,  0x37fffff,  0xffffffff,  0xffffffff,  0x380ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x381ffff,  0x382ffff,  0x383ffff,  0x384ffff,  0x385ffff,  0x386ffff,  0x387ffff,  0x388ffff,  0x389ffff,  0x38affff,  0x38bffff,  0x38cffff,  0x38dffff,  0x38effff,  0x38fffff,  0x390ffff,  0x391ffff,  0x392ffff,  0x393ffff,  0x394ffff,  0x395ffff,  0x396ffff,  0x397ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x398ffff,  0x399ffff,  0x39affff,  0x39bffff,  0x39cffff,  0x39dffff,  0x39effff,  0x39fffff,  0x3a0ffff,  0x3a1ffff,  0x3a2ffff,  0x3a3ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3a4ffff,  0x3a5ffff,  0x3a6ffff,  0x3a7ffff,  0x3a8ffff,  0x3a9ffff,  0x3aaffff,  0xffffffff,  0x3abffff,  0x3acffff,  0x3adffff,  0x3aeffff,  0x3afffff,  0x3b0ffff,  0x3b1ffff,  0x3b2ffff,  0x3b3ffff,  0x3b4ffff,  0x3b5ffff,  0x3b6ffff,  0x3b7ffff,  0x3b8ffff,  0x3b9ffff,  0x3baffff,  0x3bbffff,  0x3bcffff,  0x3bdffff,  0x3beffff,  0x3bfffff,  0x3c0ffff,  0x3c1ffff,  0x3c2ffff,  0x3c3ffff,  0x3c4ffff,  0x3c5ffff,  0x3c6ffff,  0x3c7ffff,  0x3c8ffff,  0x3c9ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff03ca,  0xffff03cb,  0x3ccffff,  0x3cdffff,  0x3ceffff,  0x3cfffff,  0x3d0ffff,  0xffffffff,  0xffffffff,  0xffff03d1,  0xffffffff,  0x3d2ffff,  0x3d3ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3d4ffff,  0x3d5ffff,  0x3d6ffff,  0x3d7ffff,  0x3d8ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x420041e,  0x4240422,  0x42a0427,  0xffff042c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x430ffff,  0x4340432,  0x4380436,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3d9ffff,  0x3db03da,  0x3dd03dc,  0x3df03de,  0x3e103e0,  0x3e303e2,  0x3e503e4,  0x3e703e6,  0x3e903e8,  0x3eb03ea,  0x3ed03ec,  0x3ef03ee,  0x3f103f0,  0xffff03f2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3f403f3,  0x3f603f5,  0x3f803f7,  0x3fa03f9,  0x3fc03fb,  0x3fe03fd,  0x40003ff,  0x4020401,  0x4040403,  0x4060405,  0x4080407,  0x40a0409,  0x40c040b,  0x40e040d,  0x410040f,  0x4120411,  0x4140413,  0x4160415,  0x4180417,  0x41a0419,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++//8064 bytes
++enum toLowerIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x200], [ 0x100,  0x380,  0xbc0], [ 0x2020100,  0x4020302,  0x2020205,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x10000,  0x20000,  0x40003,  0x60005,  0x80007,  0x0,  0x90000,  0xb000a,  0xd000c,  0xf000e,  0x110010,  0x12,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x140013,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x160015,  0x180017,  0x1a0019,  0x1c001b,  0x0,  0x0,  0x1e001d,  0x1f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x210020,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x230022,  0x250024,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x260000,  0x27,  0x290028,  0x2a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2c,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x20001,  0x40003,  0x60005,  0x80007,  0xa0009,  0xc000b,  0xe000d,  0x10000f,  0x120011,  0x140013,  0x160015,  0x180017,  0xffff0019,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1b001a,  0x1d001c,  0x1f001e,  0x210020,  0x230022,  0x250024,  0x270026,  0x290028,  0x2b002a,  0x2d002c,  0x2f002e,  0xffff0030,  0x320031,  0x340033,  0x360035,  0x4130037,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0038,  0xffff0039,  0xffff003a,  0xffff003b,  0xffff003c,  0xffff003d,  0xffff003e,  0xffff003f,  0xffff0040,  0xffff0041,  0xffff0042,  0xffff0043,  0xffff0044,  0xffff0045,  0xffff0046,  0xffff0047,  0xffff0048,  0xffff0049,  0xffff004a,  0xffff004b,  0xffff004c,  0xffff004d,  0xffff004e,  0xffff004f,  0xffff0414,  0xffff0051,  0xffff0052,  0xffff0053,  0x54ffff,  0x55ffff,  0x56ffff,  0x57ffff,  0x58ffff,  0x59ffff,  0x5affff,  0x5bffff,  0x423ffff,  0xffff005c,  0xffff005d,  0xffff005e,  0xffff005f,  0xffff0060,  0xffff0061,  0xffff0062,  0xffff0063,  0xffff0064,  0xffff0065,  0xffff0066,  0xffff0067,  0xffff0068,  0xffff0069,  0xffff006a,  0xffff006b,  0xffff006c,  0xffff006d,  0xffff006e,  0xffff006f,  0xffff0070,  0xffff0071,  0xffff0072,  0x740073,  0x75ffff,  0x76ffff,  0xffffffff,  0x77ffff,  0xffff0078,  0xffff0079,  0x7b007a,  0x7cffff,  0x7e007d,  0xffffffff,  0x80007f,  0x820081,  0x83ffff,  0xffff0084,  0x860085,  0xffff0087,  0xffffffff,  0x890088,  0x8affff,  0xffff008b,  0xffff008c,  0xffff008d,  0x8f008e,  0x90ffff,  0xffffffff,  0xffff0091,  0x930092,  0x94ffff,  0x960095,  0x97ffff,  0x98ffff,  0xffff0099,  0xffffffff,  0xffff009a,  0xffffffff,  0xffffffff,  0xffffffff,  0x9c009b,  0x9dffff,  0xffff009e,  0xa0009f,  0xa1ffff,  0xa2ffff,  0xa3ffff,  0xa4ffff,  0xa5ffff,  0xa6ffff,  0xa7ffff,  0xa8ffff,  0xffffffff,  0xffff00a9,  0xffff00aa,  0xffff00ab,  0xffff00ac,  0xffff00ad,  0xffff00ae,  0xffff00af,  0xffff00b0,  0xffff00b1,  0xb20426,  0xffff00b3,  0xffff00b4,  0xb600b5,  0xffff00b7,  0xffff00b8,  0xffff00b9,  0xffff00ba,  0xffff00bb,  0xffff00bc,  0xffff00bd,  0xffff00be,  0xffff00bf,  0xffff00c0,  0xffff00c1,  0xffff00c2,  0xffff00c3,  0xffff00c4,  0xffff00c5,  0xffff00c6,  0xffff00c7,  0xffff00c8,  0xffff00c9,  0xffff00ca,  0xffff00cb,  0xffff00cc,  0xffff00cd,  0xffff00ce,  0xffff00cf,  0xffff00d0,  0xffff00d1,  0xffff00d2,  0xffff00d3,  0xffff00d4,  0xffffffff,  0xffffffff,  0xffffffff,  0xd600d5,  0xd7ffff,  0xffff00d8,  0xd9ffff,  0xdaffff,  0xdc00db,  0xffff00dd,  0xffff00de,  0xffff00df,  0xffff00e0,  0xffff00e1,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff00e2,  0xffff00e3,  0xffffffff,  0xffff00e4,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff00e5,  0xe700e6,  0xffff00e8,  0xffff00e9,  0xeb00ea,  0xec0424,  0xee00ed,  0xf000ef,  0xf200f1,  0xf400f3,  0xf600f5,  0xf800f7,  0xfa00f9,  0xfc00fb,  0xfdffff,  0xff00fe,  0x1010100,  0x1030102,  0x1050104,  0xffffffff,  0xffffffff,  0xffff0425,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x106ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0107,  0xffff0108,  0xffff0109,  0xffff010a,  0xffff010b,  0xffff010c,  0xffff010d,  0xffff010e,  0xffff010f,  0xffff0110,  0xffff0111,  0xffff0112,  0xffffffff,  0xffffffff,  0xffff0113,  0x114ffff,  0x115ffff,  0xffff0116,  0x117ffff,  0x1190118,  0x11b011a,  0x11d011c,  0x11f011e,  0x1210120,  0x1230122,  0x1250124,  0x1270126,  0x1290128,  0x12b012a,  0x12d012c,  0x12f012e,  0x1310130,  0x1330132,  0x1350134,  0x1370136,  0x1390138,  0x13b013a,  0x13d013c,  0x13f013e,  0x1410140,  0x1430142,  0x1450144,  0x1470146,  0x1490148,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff014a,  0xffff014b,  0xffff014c,  0xffff014d,  0xffff014e,  0xffff014f,  0xffff0150,  0xffff0151,  0xffff0152,  0xffff0153,  0xffff0154,  0xffff0155,  0xffff0156,  0xffff0157,  0xffff0158,  0xffff0159,  0xffff015a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff015b,  0xffff015c,  0xffff015d,  0xffff015e,  0xffff015f,  0xffff0160,  0xffff0161,  0xffff0162,  0xffff0163,  0xffff0164,  0xffff0165,  0xffff0166,  0xffff0167,  0xffff0168,  0xffff0169,  0xffff016a,  0xffff016b,  0xffff016c,  0xffff016d,  0xffff016e,  0xffff016f,  0xffff0170,  0xffff0171,  0xffff0172,  0xffff0173,  0xffff0174,  0xffff0175,  0x1770176,  0x178ffff,  0x179ffff,  0x17affff,  0x17bffff,  0x17cffff,  0x17dffff,  0xffffffff,  0xffff017e,  0xffff017f,  0xffff0180,  0xffff0181,  0xffff0182,  0xffff0183,  0xffff0184,  0xffff0185,  0xffff0186,  0xffff0187,  0xffff0188,  0xffff0189,  0xffff018a,  0xffff018b,  0xffff018c,  0xffff018d,  0xffff018e,  0xffff018f,  0xffff0190,  0xffff0191,  0xffff0192,  0xffff0193,  0xffff0194,  0xffff0195,  0xffff0196,  0xffff0197,  0xffff0198,  0xffff0199,  0xffff019a,  0xffff019b,  0xffff019c,  0xffff019d,  0xffff019e,  0xffff019f,  0xffff01a0,  0xffff01a1,  0xffff01a2,  0xffff01a3,  0xffff01a4,  0xffff01a5,  0xffff01a6,  0xffff01a7,  0xffff01a8,  0xffff01a9,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1aaffff,  0x1ac01ab,  0x1ae01ad,  0x1b001af,  0x1b201b1,  0x1b401b3,  0x1b601b5,  0x1b801b7,  0x1ba01b9,  0x1bc01bb,  0x1be01bd,  0x1c001bf,  0x1c201c1,  0x1c401c3,  0x1c601c5,  0x1c801c7,  0x1ca01c9,  0x1cc01cb,  0x1ce01cd,  0xffff01cf,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x41dffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1d101d0,  0x1d301d2,  0x1d501d4,  0x1d701d6,  0x1d901d8,  0x1db01da,  0x1dd01dc,  0x1df01de,  0x1e101e0,  0x1e301e2,  0x1e501e4,  0x1e701e6,  0x1e901e8,  0x1eb01ea,  0x1ed01ec,  0x1ef01ee,  0x1f101f0,  0x1f301f2,  0x1f501f4,  0x1f6ffff,  0xffffffff,  0xffffffff,  0x1f7ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff01f8,  0xffff01f9,  0xffff01fa,  0xffff01fb,  0xffff01fc,  0xffff01fd,  0xffff01fe,  0xffff01ff,  0xffff0200,  0xffff0201,  0xffff0202,  0xffff0203,  0xffff0204,  0xffff0205,  0xffff0206,  0xffff0207,  0xffff0208,  0xffff0209,  0xffff020a,  0xffff020b,  0xffff020c,  0xffff020d,  0xffff020e,  0xffff020f,  0xffff0210,  0xffff0211,  0xffff0212,  0xffff0213,  0xffff0214,  0xffff0215,  0xffff0216,  0xffff0217,  0xffff0218,  0xffff0219,  0xffff021a,  0xffff021b,  0xffff021c,  0xffff021d,  0xffff021e,  0xffff021f,  0xffff0220,  0xffff0221,  0xffff0222,  0xffff0223,  0xffff0224,  0xffff0225,  0xffff0226,  0xffff0227,  0xffff0228,  0xffff0229,  0xffff022a,  0xffff022b,  0xffff022c,  0xffff022d,  0xffff022e,  0xffff022f,  0xffff0230,  0xffff0231,  0xffff0232,  0xffff0233,  0xffff0234,  0xffff0235,  0xffff0236,  0xffff0237,  0xffff0238,  0xffff0239,  0xffff023a,  0xffff023b,  0xffff023c,  0xffff023d,  0xffff023e,  0xffff023f,  0xffff0240,  0xffff0241,  0xffff0242,  0x4280427,  0x42a0429,  0xffff042b,  0xffffffff,  0xffff0243,  0xffff0244,  0xffff0245,  0xffff0246,  0xffff0247,  0xffff0248,  0xffff0249,  0xffff024a,  0xffff024b,  0xffff024c,  0xffff024d,  0xffff024e,  0xffff024f,  0xffff0250,  0xffff0251,  0xffff0252,  0xffff0253,  0xffff0254,  0xffff0255,  0xffff0256,  0xffff0257,  0xffff0258,  0xffff0259,  0xffff025a,  0xffff025b,  0xffff025c,  0xffff025d,  0xffff025e,  0xffff025f,  0xffff0260,  0xffff0261,  0xffff0262,  0xffff0263,  0xffff0264,  0xffff0265,  0xffff0266,  0xffff0267,  0xffff0268,  0xffff0269,  0xffff026a,  0xffff026b,  0xffff026c,  0xffff026d,  0xffff026e,  0xffff026f,  0xffff0270,  0xffff0271,  0xffff0272,  0xffff0273,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2750274,  0x2770276,  0x2790278,  0x27b027a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x27d027c,  0x27f027e,  0x2810280,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2830282,  0x2850284,  0x2870286,  0x2890288,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x28b028a,  0x28d028c,  0x28f028e,  0x2910290,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2930292,  0x2950294,  0x2970296,  0xffffffff,  0xffff042c,  0xffff042d,  0xffff042e,  0xffff042f,  0x298ffff,  0x299ffff,  0x29affff,  0x29bffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x29d029c,  0x29f029e,  0x2a102a0,  0x2a302a2,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x43d043c,  0x43f043e,  0x4410440,  0x4430442,  0x4450444,  0x4470446,  0x4490448,  0x44b044a,  0x44d044c,  0x44f044e,  0x4510450,  0x4530452,  0x4550454,  0x4570456,  0x4590458,  0x45b045a,  0x45d045c,  0x45f045e,  0x4610460,  0x4630462,  0x4650464,  0x4670466,  0x4690468,  0x46b046a,  0xffffffff,  0x46c0472,  0xffff0473,  0x4780430,  0x2bd02bc,  0x2bf02be,  0xffff046d,  0xffffffff,  0xffffffff,  0x46e0474,  0xffff0475,  0x4790431,  0x2c202c1,  0x2c402c3,  0xffff046f,  0xffffffff,  0xffffffff,  0x4330432,  0xffffffff,  0x4350434,  0x2c702c6,  0x2c902c8,  0xffffffff,  0xffffffff,  0xffffffff,  0x4370436,  0xffff0438,  0x43a0439,  0x2cb02ca,  0x2cd02cc,  0xffff02ce,  0xffffffff,  0xffffffff,  0x4700476,  0xffff0477,  0x47a043b,  0x2d002cf,  0x2d202d1,  0xffff0471,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff02d4,  0xffffffff,  0x2d602d5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff02d7,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2d902d8,  0x2db02da,  0x2dd02dc,  0x2df02de,  0x2e102e0,  0x2e302e2,  0x2e502e4,  0x2e702e6,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2e8ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2ea02e9,  0x2ec02eb,  0x2ee02ed,  0x2f002ef,  0x2f202f1,  0x2f402f3,  0x2f602f5,  0x2f802f7,  0x2fa02f9,  0x2fc02fb,  0x2fe02fd,  0x30002ff,  0x3020301,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3040303,  0x3060305,  0x3080307,  0x30a0309,  0x30c030b,  0x30e030d,  0x310030f,  0x3120311,  0x3140313,  0x3160315,  0x3180317,  0x31a0319,  0x31c031b,  0x31e031d,  0x320031f,  0x3220321,  0x3240323,  0x3260325,  0x3280327,  0x32a0329,  0x32c032b,  0x32e032d,  0x330032f,  0xffff0331,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0332,  0x3340333,  0xffff0335,  0x336ffff,  0x337ffff,  0x338ffff,  0x339ffff,  0x33b033a,  0xffff033c,  0xffff033d,  0x33effff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x340033f,  0xffff0341,  0xffff0342,  0xffff0343,  0xffff0344,  0xffff0345,  0xffff0346,  0xffff0347,  0xffff0348,  0xffff0349,  0xffff034a,  0xffff034b,  0xffff034c,  0xffff034d,  0xffff034e,  0xffff034f,  0xffff0350,  0xffff0351,  0xffff0352,  0xffff0353,  0xffff0354,  0xffff0355,  0xffff0356,  0xffff0357,  0xffff0358,  0xffff0359,  0xffff035a,  0xffff035b,  0xffff035c,  0xffff035d,  0xffff035e,  0xffff035f,  0xffff0360,  0xffff0361,  0xffff0362,  0xffff0363,  0xffff0364,  0xffff0365,  0xffff0366,  0xffff0367,  0xffff0368,  0xffff0369,  0xffff036a,  0xffff036b,  0xffff036c,  0xffff036d,  0xffff036e,  0xffff036f,  0xffff0370,  0xffff0371,  0xffff0372,  0xffffffff,  0xffffffff,  0xffffffff,  0x373ffff,  0x374ffff,  0xffffffff,  0xffffffff,  0xffff0375,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0376,  0xffff0377,  0xffff0378,  0xffff0379,  0xffff037a,  0xffff037b,  0xffff037c,  0xffff037d,  0xffff037e,  0xffff037f,  0xffff0380,  0xffff0381,  0xffff0382,  0xffff0383,  0xffff0384,  0xffff0385,  0xffff0386,  0xffff0387,  0xffff0388,  0xffff0389,  0xffff038a,  0xffff038b,  0xffff038c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff038d,  0xffff038e,  0xffff038f,  0xffff0390,  0xffff0391,  0xffff0392,  0xffff0393,  0xffff0394,  0xffff0395,  0xffff0396,  0xffff0397,  0xffff0398,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0399,  0xffff039a,  0xffff039b,  0xffff039c,  0xffff039d,  0xffff039e,  0xffff039f,  0xffffffff,  0xffff03a0,  0xffff03a1,  0xffff03a2,  0xffff03a3,  0xffff03a4,  0xffff03a5,  0xffff03a6,  0xffff03a7,  0xffff03a8,  0xffff03a9,  0xffff03aa,  0xffff03ab,  0xffff03ac,  0xffff03ad,  0xffff03ae,  0xffff03af,  0xffff03b0,  0xffff03b1,  0xffff03b2,  0xffff03b3,  0xffff03b4,  0xffff03b5,  0xffff03b6,  0xffff03b7,  0xffff03b8,  0xffff03b9,  0xffff03ba,  0xffff03bb,  0xffff03bc,  0xffff03bd,  0xffff03be,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3bfffff,  0x3c0ffff,  0x3c1ffff,  0xffff03c2,  0xffff03c3,  0xffff03c4,  0xffff03c5,  0xffff03c6,  0xffffffff,  0x3c7ffff,  0x3c8ffff,  0xffffffff,  0xffff03c9,  0xffff03ca,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff03cb,  0xffff03cc,  0xffff03cd,  0xffff03ce,  0xffff03cf,  0xffff03d0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4170416,  0x4190418,  0x41b041a,  0xffff041c,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x41effff,  0x420041f,  0x4220421,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3d1ffff,  0x3d303d2,  0x3d503d4,  0x3d703d6,  0x3d903d8,  0x3db03da,  0x3dd03dc,  0x3df03de,  0x3e103e0,  0x3e303e2,  0x3e503e4,  0x3e703e6,  0x3e903e8,  0xffff03ea,  0xffffffff,  0xffffffff,  0x3ec03eb,  0x3ee03ed,  0x3f003ef,  0x3f203f1,  0x3f403f3,  0x3f603f5,  0x3f803f7,  0x3fa03f9,  0x3fc03fb,  0x3fe03fd,  0x40003ff,  0x4020401,  0x4040403,  0x4060405,  0x4080407,  0x40a0409,  0x40c040b,  0x40e040d,  0x410040f,  0x4120411,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++//8192 bytes
++enum toTitleIndexTrieEntries = TrieEntry!(ushort, 8, 7, 6)([ 0x0,  0x40,  0x200], [ 0x100,  0x380,  0xc00], [ 0x2020100,  0x4020302,  0x2020205,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x2020202,  0x10000,  0x30002,  0x50004,  0x70006,  0x90008,  0xa,  0xb0000,  0xd000c,  0xf000e,  0x110010,  0x130012,  0x14,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x150000,  0x0,  0x170016,  0x190018,  0x1b001a,  0x1d001c,  0x0,  0x0,  0x1e0000,  0x1f,  0x0,  0x0,  0x0,  0x0,  0x0,  0x200000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x220021,  0x240023,  0x25,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x260000,  0x27,  0x290028,  0x2a,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2b,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2c0000,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x2e002d,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff,  0x20001,  0x40003,  0x60005,  0x80007,  0xa0009,  0xc000b,  0xe000d,  0x10000f,  0x120011,  0x140013,  0x160015,  0x180017,  0xffff0019,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1affff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x41fffff,  0x1c001b,  0x1e001d,  0x20001f,  0x220021,  0x240023,  0x260025,  0x280027,  0x2a0029,  0x2c002b,  0x2e002d,  0x30002f,  0xffff0031,  0x330032,  0x350034,  0x370036,  0x390038,  0x3affff,  0x3bffff,  0x3cffff,  0x3dffff,  0x3effff,  0x3fffff,  0x40ffff,  0x41ffff,  0x42ffff,  0x43ffff,  0x44ffff,  0x45ffff,  0x46ffff,  0x47ffff,  0x48ffff,  0x49ffff,  0x4affff,  0x4bffff,  0x4cffff,  0x4dffff,  0x4effff,  0x4fffff,  0x50ffff,  0x51ffff,  0x520421,  0x53ffff,  0x54ffff,  0x55ffff,  0xffffffff,  0xffff0056,  0xffff0057,  0xffff0058,  0xffff0059,  0xffff005a,  0xffff005b,  0xffff005c,  0x43e005d,  0x5effff,  0x5fffff,  0x60ffff,  0x61ffff,  0x62ffff,  0x63ffff,  0x64ffff,  0x65ffff,  0x66ffff,  0x67ffff,  0x68ffff,  0x69ffff,  0x6affff,  0x6bffff,  0x6cffff,  0x6dffff,  0x6effff,  0x6fffff,  0x70ffff,  0x71ffff,  0x72ffff,  0x73ffff,  0x74ffff,  0xffffffff,  0xffff0075,  0xffff0076,  0x780077,  0xffff0079,  0x7affff,  0x7bffff,  0xffffffff,  0xffff007c,  0xffffffff,  0xffff007d,  0xffffffff,  0xffffffff,  0xffff007e,  0x7fffff,  0xffffffff,  0x80ffff,  0xffff0081,  0xffffffff,  0xffff0082,  0x83ffff,  0x84ffff,  0x85ffff,  0xffffffff,  0xffff0086,  0xffffffff,  0x87ffff,  0xffffffff,  0xffff0088,  0xffffffff,  0xffff0089,  0xffff008a,  0x8bffff,  0xffffffff,  0x8cffff,  0x8dffff,  0xffffffff,  0xffffffff,  0x8f008e,  0x910090,  0x930092,  0x950094,  0xffff0096,  0xffff0097,  0xffff0098,  0xffff0099,  0xffff009a,  0xffff009b,  0xffff009c,  0xffff009d,  0x9f009e,  0xa0ffff,  0xa1ffff,  0xa2ffff,  0xa3ffff,  0xa4ffff,  0xa5ffff,  0xa6ffff,  0xa7ffff,  0xa8ffff,  0xa90446,  0xab00aa,  0xacffff,  0xffffffff,  0xadffff,  0xaeffff,  0xafffff,  0xb0ffff,  0xb1ffff,  0xb2ffff,  0xb3ffff,  0xb4ffff,  0xb5ffff,  0xb6ffff,  0xb7ffff,  0xb8ffff,  0xb9ffff,  0xbaffff,  0xbbffff,  0xbcffff,  0xbdffff,  0xbeffff,  0xbfffff,  0xc0ffff,  0xffffffff,  0xc1ffff,  0xc2ffff,  0xc3ffff,  0xc4ffff,  0xc5ffff,  0xc6ffff,  0xc7ffff,  0xc8ffff,  0xc9ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff00ca,  0xcbffff,  0xffff00cc,  0xffff00cd,  0xffffffff,  0xceffff,  0xcfffff,  0xd0ffff,  0xd1ffff,  0xd2ffff,  0xd400d3,  0xd600d5,  0xffff00d7,  0xd900d8,  0xdaffff,  0xdbffff,  0xffffffff,  0xffffffff,  0xffff00dc,  0xddffff,  0xdeffff,  0xffff00df,  0xe100e0,  0xe2ffff,  0xffffffff,  0xe3ffff,  0xe4ffff,  0xffff00e5,  0xe6ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xe7ffff,  0xffffffff,  0xffff00e8,  0xe9ffff,  0xffffffff,  0xffffffff,  0xeb00ea,  0xed00ec,  0xffff00ee,  0xffffffff,  0xffffffff,  0xffff00ef,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf0ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf1ffff,  0xf2ffff,  0xffffffff,  0xf3ffff,  0xffffffff,  0xf4ffff,  0xf600f5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff0440,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xf800f7,  0xfa00f9,  0xfb0443,  0xfd00fc,  0xff00fe,  0x1010100,  0x1030102,  0x1050104,  0x1070106,  0x1090108,  0x10b010a,  0x10d010c,  0x10f010e,  0x1110110,  0x1130112,  0x1150114,  0x1170116,  0xffff0118,  0x11a0119,  0xffffffff,  0x11bffff,  0x11d011c,  0x11effff,  0x11fffff,  0x120ffff,  0x121ffff,  0x122ffff,  0x123ffff,  0x124ffff,  0x125ffff,  0x126ffff,  0x127ffff,  0x128ffff,  0x129ffff,  0x12b012a,  0xffff012c,  0x12dffff,  0xffffffff,  0xffff012e,  0x12fffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1310130,  0x1330132,  0x1350134,  0x1370136,  0x1390138,  0x13b013a,  0x13d013c,  0x13f013e,  0x1410140,  0x1430142,  0x1450144,  0x1470146,  0x1490148,  0x14b014a,  0x14d014c,  0x14f014e,  0x1510150,  0x1530152,  0x1550154,  0x1570156,  0x1590158,  0x15b015a,  0x15d015c,  0x15f015e,  0x160ffff,  0x161ffff,  0x162ffff,  0x163ffff,  0x164ffff,  0x165ffff,  0x166ffff,  0x167ffff,  0x168ffff,  0x169ffff,  0x16affff,  0x16bffff,  0x16cffff,  0x16dffff,  0x16effff,  0x16fffff,  0x170ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x171ffff,  0x172ffff,  0x173ffff,  0x174ffff,  0x175ffff,  0x176ffff,  0x177ffff,  0x178ffff,  0x179ffff,  0x17affff,  0x17bffff,  0x17cffff,  0x17dffff,  0x17effff,  0x17fffff,  0x180ffff,  0x181ffff,  0x182ffff,  0x183ffff,  0x184ffff,  0x185ffff,  0x186ffff,  0x187ffff,  0x188ffff,  0x189ffff,  0x18affff,  0x18bffff,  0xffffffff,  0xffff018c,  0xffff018d,  0xffff018e,  0xffff018f,  0xffff0190,  0xffff0191,  0x1930192,  0x194ffff,  0x195ffff,  0x196ffff,  0x197ffff,  0x198ffff,  0x199ffff,  0x19affff,  0x19bffff,  0x19cffff,  0x19dffff,  0x19effff,  0x19fffff,  0x1a0ffff,  0x1a1ffff,  0x1a2ffff,  0x1a3ffff,  0x1a4ffff,  0x1a5ffff,  0x1a6ffff,  0x1a7ffff,  0x1a8ffff,  0x1a9ffff,  0x1aaffff,  0x1abffff,  0x1acffff,  0x1adffff,  0x1aeffff,  0x1afffff,  0x1b0ffff,  0x1b1ffff,  0x1b2ffff,  0x1b3ffff,  0x1b4ffff,  0x1b5ffff,  0x1b6ffff,  0x1b7ffff,  0x1b8ffff,  0x1b9ffff,  0x1baffff,  0x1bbffff,  0x1bcffff,  0x1bdffff,  0x1beffff,  0x1bfffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1c0ffff,  0x1c201c1,  0x1c401c3,  0x1c601c5,  0x1c801c7,  0x1ca01c9,  0x1cc01cb,  0x1ce01cd,  0x1d001cf,  0x1d201d1,  0x1d401d3,  0x1d601d5,  0x1d801d7,  0x1da01d9,  0x1dc01db,  0x1de01dd,  0x1e001df,  0x1e201e1,  0x1e401e3,  0x43201e5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x1e6ffff,  0xffffffff,  0x1e7ffff,  0xffffffff,  0x1e8ffff,  0x1e9ffff,  0x1eaffff,  0x1ebffff,  0x1ecffff,  0x1edffff,  0x1eeffff,  0x1efffff,  0x1f0ffff,  0x1f1ffff,  0x1f2ffff,  0x1f3ffff,  0x1f4ffff,  0x1f5ffff,  0x1f6ffff,  0x1f7ffff,  0x1f8ffff,  0x1f9ffff,  0x1faffff,  0x1fbffff,  0x1fcffff,  0x1fdffff,  0x1feffff,  0x1ffffff,  0x200ffff,  0x201ffff,  0x202ffff,  0x203ffff,  0x204ffff,  0x205ffff,  0x206ffff,  0x207ffff,  0x208ffff,  0x209ffff,  0x20affff,  0x20bffff,  0x20cffff,  0x20dffff,  0x20effff,  0x20fffff,  0x210ffff,  0x211ffff,  0x212ffff,  0x213ffff,  0x214ffff,  0x215ffff,  0x216ffff,  0x217ffff,  0x218ffff,  0x219ffff,  0x21affff,  0x21bffff,  0x21cffff,  0x21dffff,  0x21effff,  0x21fffff,  0x220ffff,  0x221ffff,  0x222ffff,  0x223ffff,  0x224ffff,  0x225ffff,  0x226ffff,  0x227ffff,  0x228ffff,  0x229ffff,  0x22affff,  0x22bffff,  0x22cffff,  0x22dffff,  0x22effff,  0x22fffff,  0x230ffff,  0x231ffff,  0x232ffff,  0x44a0448,  0x44e044c,  0x2330450,  0xffffffff,  0xffffffff,  0x234ffff,  0x235ffff,  0x236ffff,  0x237ffff,  0x238ffff,  0x239ffff,  0x23affff,  0x23bffff,  0x23cffff,  0x23dffff,  0x23effff,  0x23fffff,  0x240ffff,  0x241ffff,  0x242ffff,  0x243ffff,  0x244ffff,  0x245ffff,  0x246ffff,  0x247ffff,  0x248ffff,  0x249ffff,  0x24affff,  0x24bffff,  0x24cffff,  0x24dffff,  0x24effff,  0x24fffff,  0x250ffff,  0x251ffff,  0x252ffff,  0x253ffff,  0x254ffff,  0x255ffff,  0x256ffff,  0x257ffff,  0x258ffff,  0x259ffff,  0x25affff,  0x25bffff,  0x25cffff,  0x25dffff,  0x25effff,  0x25fffff,  0x260ffff,  0x261ffff,  0x262ffff,  0x263ffff,  0x2650264,  0x2670266,  0x2690268,  0x26b026a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x26d026c,  0x26f026e,  0x2710270,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2730272,  0x2750274,  0x2770276,  0x2790278,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x27b027a,  0x27d027c,  0x27f027e,  0x2810280,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2830282,  0x2850284,  0x2870286,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2880452,  0x2890454,  0x28a0457,  0x28b045a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x28d028c,  0x28f028e,  0x2910290,  0x2930292,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2950294,  0x2970296,  0x2990298,  0x29b029a,  0x29d029c,  0x29f029e,  0x2a102a0,  0xffffffff,  0x47c047b,  0x47e047d,  0x480047f,  0x4820481,  0x4840483,  0x4860485,  0x4880487,  0x48a0489,  0x48c048b,  0x48e048d,  0x490048f,  0x4920491,  0x4940493,  0x4960495,  0x4980497,  0x49a0499,  0x49c049b,  0x49e049d,  0x4a0049f,  0x4a204a1,  0x4a404a3,  0x4a604a5,  0x4a804a7,  0x4aa04a9,  0x2bb02ba,  0x4ab04b1,  0xffff04b3,  0x4bd045d,  0xffffffff,  0xffffffff,  0xffff04ac,  0xffff02bd,  0xffffffff,  0x4ad04b5,  0xffff04b7,  0x4c0045f,  0xffffffff,  0xffffffff,  0xffff04ae,  0xffffffff,  0x2c002bf,  0x4640461,  0xffffffff,  0x4690467,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2c202c1,  0x46f046c,  0x2c30472,  0x4760474,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4af04b9,  0xffff04bb,  0x4c30479,  0xffffffff,  0xffffffff,  0xffff04b0,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff02c5,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2c702c6,  0x2c902c8,  0x2cb02ca,  0x2cd02cc,  0x2cf02ce,  0x2d102d0,  0x2d302d2,  0x2d502d4,  0xffffffff,  0xffffffff,  0xffff02d6,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2d802d7,  0x2da02d9,  0x2dc02db,  0x2de02dd,  0x2e002df,  0x2e202e1,  0x2e402e3,  0x2e602e5,  0x2e802e7,  0x2ea02e9,  0x2ec02eb,  0x2ee02ed,  0x2f002ef,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x2f202f1,  0x2f402f3,  0x2f602f5,  0x2f802f7,  0x2fa02f9,  0x2fc02fb,  0x2fe02fd,  0x30002ff,  0x3020301,  0x3040303,  0x3060305,  0x3080307,  0x30a0309,  0x30c030b,  0x30e030d,  0x310030f,  0x3120311,  0x3140313,  0x3160315,  0x3180317,  0x31a0319,  0x31c031b,  0x31e031d,  0xffff031f,  0x320ffff,  0xffffffff,  0x321ffff,  0xffff0322,  0xffff0323,  0xffff0324,  0xffff0325,  0xffffffff,  0xffffffff,  0x326ffff,  0xffffffff,  0xffff0327,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x328ffff,  0x329ffff,  0x32affff,  0x32bffff,  0x32cffff,  0x32dffff,  0x32effff,  0x32fffff,  0x330ffff,  0x331ffff,  0x332ffff,  0x333ffff,  0x334ffff,  0x335ffff,  0x336ffff,  0x337ffff,  0x338ffff,  0x339ffff,  0x33affff,  0x33bffff,  0x33cffff,  0x33dffff,  0x33effff,  0x33fffff,  0x340ffff,  0x341ffff,  0x342ffff,  0x343ffff,  0x344ffff,  0x345ffff,  0x346ffff,  0x347ffff,  0x348ffff,  0x349ffff,  0x34affff,  0x34bffff,  0x34cffff,  0x34dffff,  0x34effff,  0x34fffff,  0x350ffff,  0x351ffff,  0x352ffff,  0x353ffff,  0x354ffff,  0x355ffff,  0x356ffff,  0x357ffff,  0x358ffff,  0x359ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff035a,  0xffff035b,  0xffffffff,  0x35cffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x35e035d,  0x360035f,  0x3620361,  0x3640363,  0x3660365,  0x3680367,  0x36a0369,  0x36c036b,  0x36e036d,  0x370036f,  0x3720371,  0x3740373,  0x3760375,  0x3780377,  0x37a0379,  0x37c037b,  0x37e037d,  0x380037f,  0x3820381,  0x383ffff,  0xffffffff,  0xffffffff,  0x384ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x385ffff,  0x386ffff,  0x387ffff,  0x388ffff,  0x389ffff,  0x38affff,  0x38bffff,  0x38cffff,  0x38dffff,  0x38effff,  0x38fffff,  0x390ffff,  0x391ffff,  0x392ffff,  0x393ffff,  0x394ffff,  0x395ffff,  0x396ffff,  0x397ffff,  0x398ffff,  0x399ffff,  0x39affff,  0x39bffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x39cffff,  0x39dffff,  0x39effff,  0x39fffff,  0x3a0ffff,  0x3a1ffff,  0x3a2ffff,  0x3a3ffff,  0x3a4ffff,  0x3a5ffff,  0x3a6ffff,  0x3a7ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3a8ffff,  0x3a9ffff,  0x3aaffff,  0x3abffff,  0x3acffff,  0x3adffff,  0x3aeffff,  0xffffffff,  0x3afffff,  0x3b0ffff,  0x3b1ffff,  0x3b2ffff,  0x3b3ffff,  0x3b4ffff,  0x3b5ffff,  0x3b6ffff,  0x3b7ffff,  0x3b8ffff,  0x3b9ffff,  0x3baffff,  0x3bbffff,  0x3bcffff,  0x3bdffff,  0x3beffff,  0x3bfffff,  0x3c0ffff,  0x3c1ffff,  0x3c2ffff,  0x3c3ffff,  0x3c4ffff,  0x3c5ffff,  0x3c6ffff,  0x3c7ffff,  0x3c8ffff,  0x3c9ffff,  0x3caffff,  0x3cbffff,  0x3ccffff,  0x3cdffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffff03ce,  0xffff03cf,  0x3d0ffff,  0x3d1ffff,  0x3d2ffff,  0x3d3ffff,  0x3d4ffff,  0xffffffff,  0xffffffff,  0xffff03d5,  0xffffffff,  0x3d6ffff,  0x3d7ffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3d8ffff,  0x3d9ffff,  0x3daffff,  0x3dbffff,  0x3dcffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x4240422,  0x4280426,  0x42e042b,  0xffff0430,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x434ffff,  0x4380436,  0x43c043a,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3ddffff,  0x3df03de,  0x3e103e0,  0x3e303e2,  0x3e503e4,  0x3e703e6,  0x3e903e8,  0x3eb03ea,  0x3ed03ec,  0x3ef03ee,  0x3f103f0,  0x3f303f2,  0x3f503f4,  0xffff03f6,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0x3f803f7,  0x3fa03f9,  0x3fc03fb,  0x3fe03fd,  0x40003ff,  0x4020401,  0x4040403,  0x4060405,  0x4080407,  0x40a0409,  0x40c040b,  0x40e040d,  0x410040f,  0x4120411,  0x4140413,  0x4160415,  0x4180417,  0x41a0419,  0x41c041b,  0x41e041d,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff,  0xffffffff]);
++@property
++{
++private alias _IUA = immutable(uint[]);
++_IUA toUpperTable() { static _IUA t = [ 0x41,  0x42,  0x43,  0x44,  0x45,  0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d,  0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0x55,  0x56,  0x57,  0x58,  0x59,  0x5a,  0x39c,  0xc0,  0xc1,  0xc2,  0xc3,  0xc4,  0xc5,  0xc6,  0xc7,  0xc8,  0xc9,  0xca,  0xcb,  0xcc,  0xcd,  0xce,  0xcf,  0xd0,  0xd1,  0xd2,  0xd3,  0xd4,  0xd5,  0xd6,  0xd8,  0xd9,  0xda,  0xdb,  0xdc,  0xdd,  0xde,  0x178,  0x100,  0x102,  0x104,  0x106,  0x108,  0x10a,  0x10c,  0x10e,  0x110,  0x112,  0x114,  0x116,  0x118,  0x11a,  0x11c,  0x11e,  0x120,  0x122,  0x124,  0x126,  0x128,  0x12a,  0x12c,  0x12e,  0x49,  0x132,  0x134,  0x136,  0x139,  0x13b,  0x13d,  0x13f,  0x141,  0x143,  0x145,  0x147,  0x14a,  0x14c,  0x14e,  0x150,  0x152,  0x154,  0x156,  0x158,  0x15a,  0x15c,  0x15e,  0x160,  0x162,  0x164,  0x166,  0x168,  0x16a,  0x16c,  0x16e,  0x170,  0x172,  0x174,  0x176,  0x179,  0x17b,  0x17d,  0x53,  0x243,  0x182,  0x184,  0x187,  0x18b,  0x191,  0x1f6,  0x198,  0x23d,  0x220,  0x1a0,  0x1a2,  0x1a4,  0x1a7,  0x1ac,  0x1af,  0x1b3,  0x1b5,  0x1b8,  0x1bc,  0x1f7,  0x1c4,  0x1c4,  0x1c7,  0x1c7,  0x1ca,  0x1ca,  0x1cd,  0x1cf,  0x1d1,  0x1d3,  0x1d5,  0x1d7,  0x1d9,  0x1db,  0x18e,  0x1de,  0x1e0,  0x1e2,  0x1e4,  0x1e6,  0x1e8,  0x1ea,  0x1ec,  0x1ee,  0x1f1,  0x1f1,  0x1f4,  0x1f8,  0x1fa,  0x1fc,  0x1fe,  0x200,  0x202,  0x204,  0x206,  0x208,  0x20a,  0x20c,  0x20e,  0x210,  0x212,  0x214,  0x216,  0x218,  0x21a,  0x21c,  0x21e,  0x222,  0x224,  0x226,  0x228,  0x22a,  0x22c,  0x22e,  0x230,  0x232,  0x23b,  0x2c7e,  0x2c7f,  0x241,  0x246,  0x248,  0x24a,  0x24c,  0x24e,  0x2c6f,  0x2c6d,  0x2c70,  0x181,  0x186,  0x189,  0x18a,  0x18f,  0x190,  0x193,  0x194,  0xa78d,  0xa7aa,  0x197,  0x196,  0x2c62,  0x19c,  0x2c6e,  0x19d,  0x19f,  0x2c64,  0x1a6,  0x1a9,  0x1ae,  0x244,  0x1b1,  0x1b2,  0x245,  0x1b7,  0x399,  0x370,  0x372,  0x376,  0x3fd,  0x3fe,  0x3ff,  0x386,  0x388,  0x389,  0x38a,  0x391,  0x392,  0x393,  0x394,  0x395,  0x396,  0x397,  0x398,  0x399,  0x39a,  0x39b,  0x39c,  0x39d,  0x39e,  0x39f,  0x3a0,  0x3a1,  0x3a3,  0x3a3,  0x3a4,  0x3a5,  0x3a6,  0x3a7,  0x3a8,  0x3a9,  0x3aa,  0x3ab,  0x38c,  0x38e,  0x38f,  0x392,  0x398,  0x3a6,  0x3a0,  0x3cf,  0x3d8,  0x3da,  0x3dc,  0x3de,  0x3e0,  0x3e2,  0x3e4,  0x3e6,  0x3e8,  0x3ea,  0x3ec,  0x3ee,  0x39a,  0x3a1,  0x3f9,  0x395,  0x3f7,  0x3fa,  0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,  0x418,  0x419,  0x41a,  0x41b,  0x41c,  0x41d,  0x41e,  0x41f,  0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,  0x428,  0x429,  0x42a,  0x42b,  0x42c,  0x42d,  0x42e,  0x42f,  0x400,  0x401,  0x402,  0x403,  0x404,  0x405,  0x406,  0x407,  0x408,  0x409,  0x40a,  0x40b,  0x40c,  0x40d,  0x40e,  0x40f,  0x460,  0x462,  0x464,  0x466,  0x468,  0x46a,  0x46c,  0x46e,  0x470,  0x472,  0x474,  0x476,  0x478,  0x47a,  0x47c,  0x47e,  0x480,  0x48a,  0x48c,  0x48e,  0x490,  0x492,  0x494,  0x496,  0x498,  0x49a,  0x49c,  0x49e,  0x4a0,  0x4a2,  0x4a4,  0x4a6,  0x4a8,  0x4aa,  0x4ac,  0x4ae,  0x4b0,  0x4b2,  0x4b4,  0x4b6,  0x4b8,  0x4ba,  0x4bc,  0x4be,  0x4c1,  0x4c3,  0x4c5,  0x4c7,  0x4c9,  0x4cb,  0x4cd,  0x4c0,  0x4d0,  0x4d2,  0x4d4,  0x4d6,  0x4d8,  0x4da,  0x4dc,  0x4de,  0x4e0,  0x4e2,  0x4e4,  0x4e6,  0x4e8,  0x4ea,  0x4ec,  0x4ee,  0x4f0,  0x4f2,  0x4f4,  0x4f6,  0x4f8,  0x4fa,  0x4fc,  0x4fe,  0x500,  0x502,  0x504,  0x506,  0x508,  0x50a,  0x50c,  0x50e,  0x510,  0x512,  0x514,  0x516,  0x518,  0x51a,  0x51c,  0x51e,  0x520,  0x522,  0x524,  0x526,  0x531,  0x532,  0x533,  0x534,  0x535,  0x536,  0x537,  0x538,  0x539,  0x53a,  0x53b,  0x53c,  0x53d,  0x53e,  0x53f,  0x540,  0x541,  0x542,  0x543,  0x544,  0x545,  0x546,  0x547,  0x548,  0x549,  0x54a,  0x54b,  0x54c,  0x54d,  0x54e,  0x54f,  0x550,  0x551,  0x552,  0x553,  0x554,  0x555,  0x556,  0xa77d,  0x2c63,  0x1e00,  0x1e02,  0x1e04,  0x1e06,  0x1e08,  0x1e0a,  0x1e0c,  0x1e0e,  0x1e10,  0x1e12,  0x1e14,  0x1e16,  0x1e18,  0x1e1a,  0x1e1c,  0x1e1e,  0x1e20,  0x1e22,  0x1e24,  0x1e26,  0x1e28,  0x1e2a,  0x1e2c,  0x1e2e,  0x1e30,  0x1e32,  0x1e34,  0x1e36,  0x1e38,  0x1e3a,  0x1e3c,  0x1e3e,  0x1e40,  0x1e42,  0x1e44,  0x1e46,  0x1e48,  0x1e4a,  0x1e4c,  0x1e4e,  0x1e50,  0x1e52,  0x1e54,  0x1e56,  0x1e58,  0x1e5a,  0x1e5c,  0x1e5e,  0x1e60,  0x1e62,  0x1e64,  0x1e66,  0x1e68,  0x1e6a,  0x1e6c,  0x1e6e,  0x1e70,  0x1e72,  0x1e74,  0x1e76,  0x1e78,  0x1e7a,  0x1e7c,  0x1e7e,  0x1e80,  0x1e82,  0x1e84,  0x1e86,  0x1e88,  0x1e8a,  0x1e8c,  0x1e8e,  0x1e90,  0x1e92,  0x1e94,  0x1e60,  0x1ea0,  0x1ea2,  0x1ea4,  0x1ea6,  0x1ea8,  0x1eaa,  0x1eac,  0x1eae,  0x1eb0,  0x1eb2,  0x1eb4,  0x1eb6,  0x1eb8,  0x1eba,  0x1ebc,  0x1ebe,  0x1ec0,  0x1ec2,  0x1ec4,  0x1ec6,  0x1ec8,  0x1eca,  0x1ecc,  0x1ece,  0x1ed0,  0x1ed2,  0x1ed4,  0x1ed6,  0x1ed8,  0x1eda,  0x1edc,  0x1ede,  0x1ee0,  0x1ee2,  0x1ee4,  0x1ee6,  0x1ee8,  0x1eea,  0x1eec,  0x1eee,  0x1ef0,  0x1ef2,  0x1ef4,  0x1ef6,  0x1ef8,  0x1efa,  0x1efc,  0x1efe,  0x1f08,  0x1f09,  0x1f0a,  0x1f0b,  0x1f0c,  0x1f0d,  0x1f0e,  0x1f0f,  0x1f18,  0x1f19,  0x1f1a,  0x1f1b,  0x1f1c,  0x1f1d,  0x1f28,  0x1f29,  0x1f2a,  0x1f2b,  0x1f2c,  0x1f2d,  0x1f2e,  0x1f2f,  0x1f38,  0x1f39,  0x1f3a,  0x1f3b,  0x1f3c,  0x1f3d,  0x1f3e,  0x1f3f,  0x1f48,  0x1f49,  0x1f4a,  0x1f4b,  0x1f4c,  0x1f4d,  0x1f59,  0x1f5b,  0x1f5d,  0x1f5f,  0x1f68,  0x1f69,  0x1f6a,  0x1f6b,  0x1f6c,  0x1f6d,  0x1f6e,  0x1f6f,  0x1fba,  0x1fbb,  0x1fc8,  0x1fc9,  0x1fca,  0x1fcb,  0x1fda,  0x1fdb,  0x1ff8,  0x1ff9,  0x1fea,  0x1feb,  0x1ffa,  0x1ffb,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fb8,  0x1fb9,  0x1fbc,  0x399,  0x1fcc,  0x1fd8,  0x1fd9,  0x1fe8,  0x1fe9,  0x1fec,  0x1ffc,  0x2132,  0x2160,  0x2161,  0x2162,  0x2163,  0x2164,  0x2165,  0x2166,  0x2167,  0x2168,  0x2169,  0x216a,  0x216b,  0x216c,  0x216d,  0x216e,  0x216f,  0x2183,  0x24b6,  0x24b7,  0x24b8,  0x24b9,  0x24ba,  0x24bb,  0x24bc,  0x24bd,  0x24be,  0x24bf,  0x24c0,  0x24c1,  0x24c2,  0x24c3,  0x24c4,  0x24c5,  0x24c6,  0x24c7,  0x24c8,  0x24c9,  0x24ca,  0x24cb,  0x24cc,  0x24cd,  0x24ce,  0x24cf,  0x2c00,  0x2c01,  0x2c02,  0x2c03,  0x2c04,  0x2c05,  0x2c06,  0x2c07,  0x2c08,  0x2c09,  0x2c0a,  0x2c0b,  0x2c0c,  0x2c0d,  0x2c0e,  0x2c0f,  0x2c10,  0x2c11,  0x2c12,  0x2c13,  0x2c14,  0x2c15,  0x2c16,  0x2c17,  0x2c18,  0x2c19,  0x2c1a,  0x2c1b,  0x2c1c,  0x2c1d,  0x2c1e,  0x2c1f,  0x2c20,  0x2c21,  0x2c22,  0x2c23,  0x2c24,  0x2c25,  0x2c26,  0x2c27,  0x2c28,  0x2c29,  0x2c2a,  0x2c2b,  0x2c2c,  0x2c2d,  0x2c2e,  0x2c60,  0x23a,  0x23e,  0x2c67,  0x2c69,  0x2c6b,  0x2c72,  0x2c75,  0x2c80,  0x2c82,  0x2c84,  0x2c86,  0x2c88,  0x2c8a,  0x2c8c,  0x2c8e,  0x2c90,  0x2c92,  0x2c94,  0x2c96,  0x2c98,  0x2c9a,  0x2c9c,  0x2c9e,  0x2ca0,  0x2ca2,  0x2ca4,  0x2ca6,  0x2ca8,  0x2caa,  0x2cac,  0x2cae,  0x2cb0,  0x2cb2,  0x2cb4,  0x2cb6,  0x2cb8,  0x2cba,  0x2cbc,  0x2cbe,  0x2cc0,  0x2cc2,  0x2cc4,  0x2cc6,  0x2cc8,  0x2cca,  0x2ccc,  0x2cce,  0x2cd0,  0x2cd2,  0x2cd4,  0x2cd6,  0x2cd8,  0x2cda,  0x2cdc,  0x2cde,  0x2ce0,  0x2ce2,  0x2ceb,  0x2ced,  0x2cf2,  0x10a0,  0x10a1,  0x10a2,  0x10a3,  0x10a4,  0x10a5,  0x10a6,  0x10a7,  0x10a8,  0x10a9,  0x10aa,  0x10ab,  0x10ac,  0x10ad,  0x10ae,  0x10af,  0x10b0,  0x10b1,  0x10b2,  0x10b3,  0x10b4,  0x10b5,  0x10b6,  0x10b7,  0x10b8,  0x10b9,  0x10ba,  0x10bb,  0x10bc,  0x10bd,  0x10be,  0x10bf,  0x10c0,  0x10c1,  0x10c2,  0x10c3,  0x10c4,  0x10c5,  0x10c7,  0x10cd,  0xa640,  0xa642,  0xa644,  0xa646,  0xa648,  0xa64a,  0xa64c,  0xa64e,  0xa650,  0xa652,  0xa654,  0xa656,  0xa658,  0xa65a,  0xa65c,  0xa65e,  0xa660,  0xa662,  0xa664,  0xa666,  0xa668,  0xa66a,  0xa66c,  0xa680,  0xa682,  0xa684,  0xa686,  0xa688,  0xa68a,  0xa68c,  0xa68e,  0xa690,  0xa692,  0xa694,  0xa696,  0xa722,  0xa724,  0xa726,  0xa728,  0xa72a,  0xa72c,  0xa72e,  0xa732,  0xa734,  0xa736,  0xa738,  0xa73a,  0xa73c,  0xa73e,  0xa740,  0xa742,  0xa744,  0xa746,  0xa748,  0xa74a,  0xa74c,  0xa74e,  0xa750,  0xa752,  0xa754,  0xa756,  0xa758,  0xa75a,  0xa75c,  0xa75e,  0xa760,  0xa762,  0xa764,  0xa766,  0xa768,  0xa76a,  0xa76c,  0xa76e,  0xa779,  0xa77b,  0xa77e,  0xa780,  0xa782,  0xa784,  0xa786,  0xa78b,  0xa790,  0xa792,  0xa7a0,  0xa7a2,  0xa7a4,  0xa7a6,  0xa7a8,  0xff21,  0xff22,  0xff23,  0xff24,  0xff25,  0xff26,  0xff27,  0xff28,  0xff29,  0xff2a,  0xff2b,  0xff2c,  0xff2d,  0xff2e,  0xff2f,  0xff30,  0xff31,  0xff32,  0xff33,  0xff34,  0xff35,  0xff36,  0xff37,  0xff38,  0xff39,  0xff3a,  0x10400,  0x10401,  0x10402,  0x10403,  0x10404,  0x10405,  0x10406,  0x10407,  0x10408,  0x10409,  0x1040a,  0x1040b,  0x1040c,  0x1040d,  0x1040e,  0x1040f,  0x10410,  0x10411,  0x10412,  0x10413,  0x10414,  0x10415,  0x10416,  0x10417,  0x10418,  0x10419,  0x1041a,  0x1041b,  0x1041c,  0x1041d,  0x1041e,  0x1041f,  0x10420,  0x10421,  0x10422,  0x10423,  0x10424,  0x10425,  0x10426,  0x10427,  0x2000053,  0x53,  0x130,  0x2000046,  0x46,  0x2000046,  0x49,  0x2000046,  0x4c,  0x3000046,  0x46,  0x49,  0x3000046,  0x46,  0x4c,  0x2000053,  0x54,  0x2000053,  0x54,  0x2000535,  0x552,  0x2000544,  0x546,  0x2000544,  0x535,  0x2000544,  0x53b,  0x200054e,  0x546,  0x2000544,  0x53d,  0x20002bc,  0x4e,  0x3000399,  0x308,  0x301,  0x30003a5,  0x308,  0x301,  0x200004a,  0x30c,  0x2000048,  0x331,  0x2000054,  0x308,  0x2000057,  0x30a,  0x2000059,  0x30a,  0x2000041,  0x2be,  0x20003a5,  0x313,  0x30003a5,  0x313,  0x300,  0x30003a5,  0x313,  0x301,  0x30003a5,  0x313,  0x342,  0x2000391,  0x342,  0x2000397,  0x342,  0x3000399,  0x308,  0x300,  0x3000399,  0x308,  0x301,  0x2000399,  0x342,  0x3000399,  0x308,  0x342,  0x30003a5,  0x308,  0x300,  0x30003a5,  0x308,  0x301,  0x20003a1,  0x313,  0x20003a5,  0x342,  0x30003a5,  0x308,  0x342,  0x20003a9,  0x342,  0x2001f08,  0x399,  0x2001f09,  0x399,  0x2001f0a,  0x399,  0x2001f0b,  0x399,  0x2001f0c,  0x399,  0x2001f0d,  0x399,  0x2001f0e,  0x399,  0x2001f0f,  0x399,  0x2001f08,  0x399,  0x2001f09,  0x399,  0x2001f0a,  0x399,  0x2001f0b,  0x399,  0x2001f0c,  0x399,  0x2001f0d,  0x399,  0x2001f0e,  0x399,  0x2001f0f,  0x399,  0x2001f28,  0x399,  0x2001f29,  0x399,  0x2001f2a,  0x399,  0x2001f2b,  0x399,  0x2001f2c,  0x399,  0x2001f2d,  0x399,  0x2001f2e,  0x399,  0x2001f2f,  0x399,  0x2001f28,  0x399,  0x2001f29,  0x399,  0x2001f2a,  0x399,  0x2001f2b,  0x399,  0x2001f2c,  0x399,  0x2001f2d,  0x399,  0x2001f2e,  0x399,  0x2001f2f,  0x399,  0x2001f68,  0x399,  0x2001f69,  0x399,  0x2001f6a,  0x399,  0x2001f6b,  0x399,  0x2001f6c,  0x399,  0x2001f6d,  0x399,  0x2001f6e,  0x399,  0x2001f6f,  0x399,  0x2001f68,  0x399,  0x2001f69,  0x399,  0x2001f6a,  0x399,  0x2001f6b,  0x399,  0x2001f6c,  0x399,  0x2001f6d,  0x399,  0x2001f6e,  0x399,  0x2001f6f,  0x399,  0x2000391,  0x399,  0x2000391,  0x399,  0x2000397,  0x399,  0x2000397,  0x399,  0x20003a9,  0x399,  0x20003a9,  0x399,  0x2001fba,  0x399,  0x2000386,  0x399,  0x2001fca,  0x399,  0x2000389,  0x399,  0x2001ffa,  0x399,  0x200038f,  0x399,  0x3000391,  0x342,  0x399,  0x3000397,  0x342,  0x399,  0x30003a9,  0x342,  0x399]; return t; }
++_IUA toLowerTable() { static _IUA t = [ 0x61,  0x62,  0x63,  0x64,  0x65,  0x66,  0x67,  0x68,  0x69,  0x6a,  0x6b,  0x6c,  0x6d,  0x6e,  0x6f,  0x70,  0x71,  0x72,  0x73,  0x74,  0x75,  0x76,  0x77,  0x78,  0x79,  0x7a,  0xe0,  0xe1,  0xe2,  0xe3,  0xe4,  0xe5,  0xe6,  0xe7,  0xe8,  0xe9,  0xea,  0xeb,  0xec,  0xed,  0xee,  0xef,  0xf0,  0xf1,  0xf2,  0xf3,  0xf4,  0xf5,  0xf6,  0xf8,  0xf9,  0xfa,  0xfb,  0xfc,  0xfd,  0xfe,  0x101,  0x103,  0x105,  0x107,  0x109,  0x10b,  0x10d,  0x10f,  0x111,  0x113,  0x115,  0x117,  0x119,  0x11b,  0x11d,  0x11f,  0x121,  0x123,  0x125,  0x127,  0x129,  0x12b,  0x12d,  0x12f,  0x69,  0x133,  0x135,  0x137,  0x13a,  0x13c,  0x13e,  0x140,  0x142,  0x144,  0x146,  0x148,  0x14b,  0x14d,  0x14f,  0x151,  0x153,  0x155,  0x157,  0x159,  0x15b,  0x15d,  0x15f,  0x161,  0x163,  0x165,  0x167,  0x169,  0x16b,  0x16d,  0x16f,  0x171,  0x173,  0x175,  0x177,  0xff,  0x17a,  0x17c,  0x17e,  0x253,  0x183,  0x185,  0x254,  0x188,  0x256,  0x257,  0x18c,  0x1dd,  0x259,  0x25b,  0x192,  0x260,  0x263,  0x269,  0x268,  0x199,  0x26f,  0x272,  0x275,  0x1a1,  0x1a3,  0x1a5,  0x280,  0x1a8,  0x283,  0x1ad,  0x288,  0x1b0,  0x28a,  0x28b,  0x1b4,  0x1b6,  0x292,  0x1b9,  0x1bd,  0x1c6,  0x1c6,  0x1c9,  0x1c9,  0x1cc,  0x1cc,  0x1ce,  0x1d0,  0x1d2,  0x1d4,  0x1d6,  0x1d8,  0x1da,  0x1dc,  0x1df,  0x1e1,  0x1e3,  0x1e5,  0x1e7,  0x1e9,  0x1eb,  0x1ed,  0x1ef,  0x1f3,  0x1f3,  0x1f5,  0x195,  0x1bf,  0x1f9,  0x1fb,  0x1fd,  0x1ff,  0x201,  0x203,  0x205,  0x207,  0x209,  0x20b,  0x20d,  0x20f,  0x211,  0x213,  0x215,  0x217,  0x219,  0x21b,  0x21d,  0x21f,  0x19e,  0x223,  0x225,  0x227,  0x229,  0x22b,  0x22d,  0x22f,  0x231,  0x233,  0x2c65,  0x23c,  0x19a,  0x2c66,  0x242,  0x180,  0x289,  0x28c,  0x247,  0x249,  0x24b,  0x24d,  0x24f,  0x371,  0x373,  0x377,  0x3ac,  0x3ad,  0x3ae,  0x3af,  0x3cc,  0x3cd,  0x3ce,  0x3b1,  0x3b2,  0x3b3,  0x3b4,  0x3b5,  0x3b6,  0x3b7,  0x3b8,  0x3b9,  0x3ba,  0x3bb,  0x3bc,  0x3bd,  0x3be,  0x3bf,  0x3c0,  0x3c1,  0x3c3,  0x3c4,  0x3c5,  0x3c6,  0x3c7,  0x3c8,  0x3c9,  0x3ca,  0x3cb,  0x3d7,  0x3d9,  0x3db,  0x3dd,  0x3df,  0x3e1,  0x3e3,  0x3e5,  0x3e7,  0x3e9,  0x3eb,  0x3ed,  0x3ef,  0x3b8,  0x3f8,  0x3f2,  0x3fb,  0x37b,  0x37c,  0x37d,  0x450,  0x451,  0x452,  0x453,  0x454,  0x455,  0x456,  0x457,  0x458,  0x459,  0x45a,  0x45b,  0x45c,  0x45d,  0x45e,  0x45f,  0x430,  0x431,  0x432,  0x433,  0x434,  0x435,  0x436,  0x437,  0x438,  0x439,  0x43a,  0x43b,  0x43c,  0x43d,  0x43e,  0x43f,  0x440,  0x441,  0x442,  0x443,  0x444,  0x445,  0x446,  0x447,  0x448,  0x449,  0x44a,  0x44b,  0x44c,  0x44d,  0x44e,  0x44f,  0x461,  0x463,  0x465,  0x467,  0x469,  0x46b,  0x46d,  0x46f,  0x471,  0x473,  0x475,  0x477,  0x479,  0x47b,  0x47d,  0x47f,  0x481,  0x48b,  0x48d,  0x48f,  0x491,  0x493,  0x495,  0x497,  0x499,  0x49b,  0x49d,  0x49f,  0x4a1,  0x4a3,  0x4a5,  0x4a7,  0x4a9,  0x4ab,  0x4ad,  0x4af,  0x4b1,  0x4b3,  0x4b5,  0x4b7,  0x4b9,  0x4bb,  0x4bd,  0x4bf,  0x4cf,  0x4c2,  0x4c4,  0x4c6,  0x4c8,  0x4ca,  0x4cc,  0x4ce,  0x4d1,  0x4d3,  0x4d5,  0x4d7,  0x4d9,  0x4db,  0x4dd,  0x4df,  0x4e1,  0x4e3,  0x4e5,  0x4e7,  0x4e9,  0x4eb,  0x4ed,  0x4ef,  0x4f1,  0x4f3,  0x4f5,  0x4f7,  0x4f9,  0x4fb,  0x4fd,  0x4ff,  0x501,  0x503,  0x505,  0x507,  0x509,  0x50b,  0x50d,  0x50f,  0x511,  0x513,  0x515,  0x517,  0x519,  0x51b,  0x51d,  0x51f,  0x521,  0x523,  0x525,  0x527,  0x561,  0x562,  0x563,  0x564,  0x565,  0x566,  0x567,  0x568,  0x569,  0x56a,  0x56b,  0x56c,  0x56d,  0x56e,  0x56f,  0x570,  0x571,  0x572,  0x573,  0x574,  0x575,  0x576,  0x577,  0x578,  0x579,  0x57a,  0x57b,  0x57c,  0x57d,  0x57e,  0x57f,  0x580,  0x581,  0x582,  0x583,  0x584,  0x585,  0x586,  0x2d00,  0x2d01,  0x2d02,  0x2d03,  0x2d04,  0x2d05,  0x2d06,  0x2d07,  0x2d08,  0x2d09,  0x2d0a,  0x2d0b,  0x2d0c,  0x2d0d,  0x2d0e,  0x2d0f,  0x2d10,  0x2d11,  0x2d12,  0x2d13,  0x2d14,  0x2d15,  0x2d16,  0x2d17,  0x2d18,  0x2d19,  0x2d1a,  0x2d1b,  0x2d1c,  0x2d1d,  0x2d1e,  0x2d1f,  0x2d20,  0x2d21,  0x2d22,  0x2d23,  0x2d24,  0x2d25,  0x2d27,  0x2d2d,  0x1e01,  0x1e03,  0x1e05,  0x1e07,  0x1e09,  0x1e0b,  0x1e0d,  0x1e0f,  0x1e11,  0x1e13,  0x1e15,  0x1e17,  0x1e19,  0x1e1b,  0x1e1d,  0x1e1f,  0x1e21,  0x1e23,  0x1e25,  0x1e27,  0x1e29,  0x1e2b,  0x1e2d,  0x1e2f,  0x1e31,  0x1e33,  0x1e35,  0x1e37,  0x1e39,  0x1e3b,  0x1e3d,  0x1e3f,  0x1e41,  0x1e43,  0x1e45,  0x1e47,  0x1e49,  0x1e4b,  0x1e4d,  0x1e4f,  0x1e51,  0x1e53,  0x1e55,  0x1e57,  0x1e59,  0x1e5b,  0x1e5d,  0x1e5f,  0x1e61,  0x1e63,  0x1e65,  0x1e67,  0x1e69,  0x1e6b,  0x1e6d,  0x1e6f,  0x1e71,  0x1e73,  0x1e75,  0x1e77,  0x1e79,  0x1e7b,  0x1e7d,  0x1e7f,  0x1e81,  0x1e83,  0x1e85,  0x1e87,  0x1e89,  0x1e8b,  0x1e8d,  0x1e8f,  0x1e91,  0x1e93,  0x1e95,  0xdf,  0x1ea1,  0x1ea3,  0x1ea5,  0x1ea7,  0x1ea9,  0x1eab,  0x1ead,  0x1eaf,  0x1eb1,  0x1eb3,  0x1eb5,  0x1eb7,  0x1eb9,  0x1ebb,  0x1ebd,  0x1ebf,  0x1ec1,  0x1ec3,  0x1ec5,  0x1ec7,  0x1ec9,  0x1ecb,  0x1ecd,  0x1ecf,  0x1ed1,  0x1ed3,  0x1ed5,  0x1ed7,  0x1ed9,  0x1edb,  0x1edd,  0x1edf,  0x1ee1,  0x1ee3,  0x1ee5,  0x1ee7,  0x1ee9,  0x1eeb,  0x1eed,  0x1eef,  0x1ef1,  0x1ef3,  0x1ef5,  0x1ef7,  0x1ef9,  0x1efb,  0x1efd,  0x1eff,  0x1f00,  0x1f01,  0x1f02,  0x1f03,  0x1f04,  0x1f05,  0x1f06,  0x1f07,  0x1f10,  0x1f11,  0x1f12,  0x1f13,  0x1f14,  0x1f15,  0x1f20,  0x1f21,  0x1f22,  0x1f23,  0x1f24,  0x1f25,  0x1f26,  0x1f27,  0x1f30,  0x1f31,  0x1f32,  0x1f33,  0x1f34,  0x1f35,  0x1f36,  0x1f37,  0x1f40,  0x1f41,  0x1f42,  0x1f43,  0x1f44,  0x1f45,  0x1f51,  0x1f53,  0x1f55,  0x1f57,  0x1f60,  0x1f61,  0x1f62,  0x1f63,  0x1f64,  0x1f65,  0x1f66,  0x1f67,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fb0,  0x1fb1,  0x1f70,  0x1f71,  0x1fb3,  0x1f72,  0x1f73,  0x1f74,  0x1f75,  0x1fc3,  0x1fd0,  0x1fd1,  0x1f76,  0x1f77,  0x1fe0,  0x1fe1,  0x1f7a,  0x1f7b,  0x1fe5,  0x1f78,  0x1f79,  0x1f7c,  0x1f7d,  0x1ff3,  0x3c9,  0x6b,  0xe5,  0x214e,  0x2170,  0x2171,  0x2172,  0x2173,  0x2174,  0x2175,  0x2176,  0x2177,  0x2178,  0x2179,  0x217a,  0x217b,  0x217c,  0x217d,  0x217e,  0x217f,  0x2184,  0x24d0,  0x24d1,  0x24d2,  0x24d3,  0x24d4,  0x24d5,  0x24d6,  0x24d7,  0x24d8,  0x24d9,  0x24da,  0x24db,  0x24dc,  0x24dd,  0x24de,  0x24df,  0x24e0,  0x24e1,  0x24e2,  0x24e3,  0x24e4,  0x24e5,  0x24e6,  0x24e7,  0x24e8,  0x24e9,  0x2c30,  0x2c31,  0x2c32,  0x2c33,  0x2c34,  0x2c35,  0x2c36,  0x2c37,  0x2c38,  0x2c39,  0x2c3a,  0x2c3b,  0x2c3c,  0x2c3d,  0x2c3e,  0x2c3f,  0x2c40,  0x2c41,  0x2c42,  0x2c43,  0x2c44,  0x2c45,  0x2c46,  0x2c47,  0x2c48,  0x2c49,  0x2c4a,  0x2c4b,  0x2c4c,  0x2c4d,  0x2c4e,  0x2c4f,  0x2c50,  0x2c51,  0x2c52,  0x2c53,  0x2c54,  0x2c55,  0x2c56,  0x2c57,  0x2c58,  0x2c59,  0x2c5a,  0x2c5b,  0x2c5c,  0x2c5d,  0x2c5e,  0x2c61,  0x26b,  0x1d7d,  0x27d,  0x2c68,  0x2c6a,  0x2c6c,  0x251,  0x271,  0x250,  0x252,  0x2c73,  0x2c76,  0x23f,  0x240,  0x2c81,  0x2c83,  0x2c85,  0x2c87,  0x2c89,  0x2c8b,  0x2c8d,  0x2c8f,  0x2c91,  0x2c93,  0x2c95,  0x2c97,  0x2c99,  0x2c9b,  0x2c9d,  0x2c9f,  0x2ca1,  0x2ca3,  0x2ca5,  0x2ca7,  0x2ca9,  0x2cab,  0x2cad,  0x2caf,  0x2cb1,  0x2cb3,  0x2cb5,  0x2cb7,  0x2cb9,  0x2cbb,  0x2cbd,  0x2cbf,  0x2cc1,  0x2cc3,  0x2cc5,  0x2cc7,  0x2cc9,  0x2ccb,  0x2ccd,  0x2ccf,  0x2cd1,  0x2cd3,  0x2cd5,  0x2cd7,  0x2cd9,  0x2cdb,  0x2cdd,  0x2cdf,  0x2ce1,  0x2ce3,  0x2cec,  0x2cee,  0x2cf3,  0xa641,  0xa643,  0xa645,  0xa647,  0xa649,  0xa64b,  0xa64d,  0xa64f,  0xa651,  0xa653,  0xa655,  0xa657,  0xa659,  0xa65b,  0xa65d,  0xa65f,  0xa661,  0xa663,  0xa665,  0xa667,  0xa669,  0xa66b,  0xa66d,  0xa681,  0xa683,  0xa685,  0xa687,  0xa689,  0xa68b,  0xa68d,  0xa68f,  0xa691,  0xa693,  0xa695,  0xa697,  0xa723,  0xa725,  0xa727,  0xa729,  0xa72b,  0xa72d,  0xa72f,  0xa733,  0xa735,  0xa737,  0xa739,  0xa73b,  0xa73d,  0xa73f,  0xa741,  0xa743,  0xa745,  0xa747,  0xa749,  0xa74b,  0xa74d,  0xa74f,  0xa751,  0xa753,  0xa755,  0xa757,  0xa759,  0xa75b,  0xa75d,  0xa75f,  0xa761,  0xa763,  0xa765,  0xa767,  0xa769,  0xa76b,  0xa76d,  0xa76f,  0xa77a,  0xa77c,  0x1d79,  0xa77f,  0xa781,  0xa783,  0xa785,  0xa787,  0xa78c,  0x265,  0xa791,  0xa793,  0xa7a1,  0xa7a3,  0xa7a5,  0xa7a7,  0xa7a9,  0x266,  0xff41,  0xff42,  0xff43,  0xff44,  0xff45,  0xff46,  0xff47,  0xff48,  0xff49,  0xff4a,  0xff4b,  0xff4c,  0xff4d,  0xff4e,  0xff4f,  0xff50,  0xff51,  0xff52,  0xff53,  0xff54,  0xff55,  0xff56,  0xff57,  0xff58,  0xff59,  0xff5a,  0x10428,  0x10429,  0x1042a,  0x1042b,  0x1042c,  0x1042d,  0x1042e,  0x1042f,  0x10430,  0x10431,  0x10432,  0x10433,  0x10434,  0x10435,  0x10436,  0x10437,  0x10438,  0x10439,  0x1043a,  0x1043b,  0x1043c,  0x1043d,  0x1043e,  0x1043f,  0x10440,  0x10441,  0x10442,  0x10443,  0x10444,  0x10445,  0x10446,  0x10447,  0x10448,  0x10449,  0x1044a,  0x1044b,  0x1044c,  0x1044d,  0x1044e,  0x1044f,  0xdf,  0x2000069,  0x307,  0xfb00,  0xfb01,  0xfb02,  0xfb03,  0xfb04,  0xfb05,  0xfb06,  0x587,  0xfb13,  0xfb14,  0xfb15,  0xfb16,  0xfb17,  0x149,  0x390,  0x3b0,  0x1f0,  0x1e96,  0x1e97,  0x1e98,  0x1e99,  0x1e9a,  0x1f50,  0x1f52,  0x1f54,  0x1f56,  0x1fb6,  0x1fc6,  0x1fd2,  0x1fd3,  0x1fd6,  0x1fd7,  0x1fe2,  0x1fe3,  0x1fe4,  0x1fe6,  0x1fe7,  0x1ff6,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f80,  0x1f81,  0x1f82,  0x1f83,  0x1f84,  0x1f85,  0x1f86,  0x1f87,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1f90,  0x1f91,  0x1f92,  0x1f93,  0x1f94,  0x1f95,  0x1f96,  0x1f97,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fa0,  0x1fa1,  0x1fa2,  0x1fa3,  0x1fa4,  0x1fa5,  0x1fa6,  0x1fa7,  0x1fb3,  0x1fb3,  0x1fc3,  0x1fc3,  0x1ff3,  0x1ff3,  0x1fb2,  0x1fb4,  0x1fc2,  0x1fc4,  0x1ff2,  0x1ff4,  0x1fb7,  0x1fc7,  0x1ff7]; return t; }
++_IUA toTitleTable() { static _IUA t = [ 0x41,  0x42,  0x43,  0x44,  0x45,  0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d,  0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0x55,  0x56,  0x57,  0x58,  0x59,  0x5a,  0x39c,  0xc0,  0xc1,  0xc2,  0xc3,  0xc4,  0xc5,  0xc6,  0xc7,  0xc8,  0xc9,  0xca,  0xcb,  0xcc,  0xcd,  0xce,  0xcf,  0xd0,  0xd1,  0xd2,  0xd3,  0xd4,  0xd5,  0xd6,  0xd8,  0xd9,  0xda,  0xdb,  0xdc,  0xdd,  0xde,  0x178,  0x100,  0x102,  0x104,  0x106,  0x108,  0x10a,  0x10c,  0x10e,  0x110,  0x112,  0x114,  0x116,  0x118,  0x11a,  0x11c,  0x11e,  0x120,  0x122,  0x124,  0x126,  0x128,  0x12a,  0x12c,  0x12e,  0x49,  0x132,  0x134,  0x136,  0x139,  0x13b,  0x13d,  0x13f,  0x141,  0x143,  0x145,  0x147,  0x14a,  0x14c,  0x14e,  0x150,  0x152,  0x154,  0x156,  0x158,  0x15a,  0x15c,  0x15e,  0x160,  0x162,  0x164,  0x166,  0x168,  0x16a,  0x16c,  0x16e,  0x170,  0x172,  0x174,  0x176,  0x179,  0x17b,  0x17d,  0x53,  0x243,  0x182,  0x184,  0x187,  0x18b,  0x191,  0x1f6,  0x198,  0x23d,  0x220,  0x1a0,  0x1a2,  0x1a4,  0x1a7,  0x1ac,  0x1af,  0x1b3,  0x1b5,  0x1b8,  0x1bc,  0x1f7,  0x1c5,  0x1c5,  0x1c5,  0x1c8,  0x1c8,  0x1c8,  0x1cb,  0x1cb,  0x1cb,  0x1cd,  0x1cf,  0x1d1,  0x1d3,  0x1d5,  0x1d7,  0x1d9,  0x1db,  0x18e,  0x1de,  0x1e0,  0x1e2,  0x1e4,  0x1e6,  0x1e8,  0x1ea,  0x1ec,  0x1ee,  0x1f2,  0x1f2,  0x1f2,  0x1f4,  0x1f8,  0x1fa,  0x1fc,  0x1fe,  0x200,  0x202,  0x204,  0x206,  0x208,  0x20a,  0x20c,  0x20e,  0x210,  0x212,  0x214,  0x216,  0x218,  0x21a,  0x21c,  0x21e,  0x222,  0x224,  0x226,  0x228,  0x22a,  0x22c,  0x22e,  0x230,  0x232,  0x23b,  0x2c7e,  0x2c7f,  0x241,  0x246,  0x248,  0x24a,  0x24c,  0x24e,  0x2c6f,  0x2c6d,  0x2c70,  0x181,  0x186,  0x189,  0x18a,  0x18f,  0x190,  0x193,  0x194,  0xa78d,  0xa7aa,  0x197,  0x196,  0x2c62,  0x19c,  0x2c6e,  0x19d,  0x19f,  0x2c64,  0x1a6,  0x1a9,  0x1ae,  0x244,  0x1b1,  0x1b2,  0x245,  0x1b7,  0x399,  0x370,  0x372,  0x376,  0x3fd,  0x3fe,  0x3ff,  0x386,  0x388,  0x389,  0x38a,  0x391,  0x392,  0x393,  0x394,  0x395,  0x396,  0x397,  0x398,  0x399,  0x39a,  0x39b,  0x39c,  0x39d,  0x39e,  0x39f,  0x3a0,  0x3a1,  0x3a3,  0x3a3,  0x3a4,  0x3a5,  0x3a6,  0x3a7,  0x3a8,  0x3a9,  0x3aa,  0x3ab,  0x38c,  0x38e,  0x38f,  0x392,  0x398,  0x3a6,  0x3a0,  0x3cf,  0x3d8,  0x3da,  0x3dc,  0x3de,  0x3e0,  0x3e2,  0x3e4,  0x3e6,  0x3e8,  0x3ea,  0x3ec,  0x3ee,  0x39a,  0x3a1,  0x3f9,  0x395,  0x3f7,  0x3fa,  0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,  0x418,  0x419,  0x41a,  0x41b,  0x41c,  0x41d,  0x41e,  0x41f,  0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,  0x428,  0x429,  0x42a,  0x42b,  0x42c,  0x42d,  0x42e,  0x42f,  0x400,  0x401,  0x402,  0x403,  0x404,  0x405,  0x406,  0x407,  0x408,  0x409,  0x40a,  0x40b,  0x40c,  0x40d,  0x40e,  0x40f,  0x460,  0x462,  0x464,  0x466,  0x468,  0x46a,  0x46c,  0x46e,  0x470,  0x472,  0x474,  0x476,  0x478,  0x47a,  0x47c,  0x47e,  0x480,  0x48a,  0x48c,  0x48e,  0x490,  0x492,  0x494,  0x496,  0x498,  0x49a,  0x49c,  0x49e,  0x4a0,  0x4a2,  0x4a4,  0x4a6,  0x4a8,  0x4aa,  0x4ac,  0x4ae,  0x4b0,  0x4b2,  0x4b4,  0x4b6,  0x4b8,  0x4ba,  0x4bc,  0x4be,  0x4c1,  0x4c3,  0x4c5,  0x4c7,  0x4c9,  0x4cb,  0x4cd,  0x4c0,  0x4d0,  0x4d2,  0x4d4,  0x4d6,  0x4d8,  0x4da,  0x4dc,  0x4de,  0x4e0,  0x4e2,  0x4e4,  0x4e6,  0x4e8,  0x4ea,  0x4ec,  0x4ee,  0x4f0,  0x4f2,  0x4f4,  0x4f6,  0x4f8,  0x4fa,  0x4fc,  0x4fe,  0x500,  0x502,  0x504,  0x506,  0x508,  0x50a,  0x50c,  0x50e,  0x510,  0x512,  0x514,  0x516,  0x518,  0x51a,  0x51c,  0x51e,  0x520,  0x522,  0x524,  0x526,  0x531,  0x532,  0x533,  0x534,  0x535,  0x536,  0x537,  0x538,  0x539,  0x53a,  0x53b,  0x53c,  0x53d,  0x53e,  0x53f,  0x540,  0x541,  0x542,  0x543,  0x544,  0x545,  0x546,  0x547,  0x548,  0x549,  0x54a,  0x54b,  0x54c,  0x54d,  0x54e,  0x54f,  0x550,  0x551,  0x552,  0x553,  0x554,  0x555,  0x556,  0xa77d,  0x2c63,  0x1e00,  0x1e02,  0x1e04,  0x1e06,  0x1e08,  0x1e0a,  0x1e0c,  0x1e0e,  0x1e10,  0x1e12,  0x1e14,  0x1e16,  0x1e18,  0x1e1a,  0x1e1c,  0x1e1e,  0x1e20,  0x1e22,  0x1e24,  0x1e26,  0x1e28,  0x1e2a,  0x1e2c,  0x1e2e,  0x1e30,  0x1e32,  0x1e34,  0x1e36,  0x1e38,  0x1e3a,  0x1e3c,  0x1e3e,  0x1e40,  0x1e42,  0x1e44,  0x1e46,  0x1e48,  0x1e4a,  0x1e4c,  0x1e4e,  0x1e50,  0x1e52,  0x1e54,  0x1e56,  0x1e58,  0x1e5a,  0x1e5c,  0x1e5e,  0x1e60,  0x1e62,  0x1e64,  0x1e66,  0x1e68,  0x1e6a,  0x1e6c,  0x1e6e,  0x1e70,  0x1e72,  0x1e74,  0x1e76,  0x1e78,  0x1e7a,  0x1e7c,  0x1e7e,  0x1e80,  0x1e82,  0x1e84,  0x1e86,  0x1e88,  0x1e8a,  0x1e8c,  0x1e8e,  0x1e90,  0x1e92,  0x1e94,  0x1e60,  0x1ea0,  0x1ea2,  0x1ea4,  0x1ea6,  0x1ea8,  0x1eaa,  0x1eac,  0x1eae,  0x1eb0,  0x1eb2,  0x1eb4,  0x1eb6,  0x1eb8,  0x1eba,  0x1ebc,  0x1ebe,  0x1ec0,  0x1ec2,  0x1ec4,  0x1ec6,  0x1ec8,  0x1eca,  0x1ecc,  0x1ece,  0x1ed0,  0x1ed2,  0x1ed4,  0x1ed6,  0x1ed8,  0x1eda,  0x1edc,  0x1ede,  0x1ee0,  0x1ee2,  0x1ee4,  0x1ee6,  0x1ee8,  0x1eea,  0x1eec,  0x1eee,  0x1ef0,  0x1ef2,  0x1ef4,  0x1ef6,  0x1ef8,  0x1efa,  0x1efc,  0x1efe,  0x1f08,  0x1f09,  0x1f0a,  0x1f0b,  0x1f0c,  0x1f0d,  0x1f0e,  0x1f0f,  0x1f18,  0x1f19,  0x1f1a,  0x1f1b,  0x1f1c,  0x1f1d,  0x1f28,  0x1f29,  0x1f2a,  0x1f2b,  0x1f2c,  0x1f2d,  0x1f2e,  0x1f2f,  0x1f38,  0x1f39,  0x1f3a,  0x1f3b,  0x1f3c,  0x1f3d,  0x1f3e,  0x1f3f,  0x1f48,  0x1f49,  0x1f4a,  0x1f4b,  0x1f4c,  0x1f4d,  0x1f59,  0x1f5b,  0x1f5d,  0x1f5f,  0x1f68,  0x1f69,  0x1f6a,  0x1f6b,  0x1f6c,  0x1f6d,  0x1f6e,  0x1f6f,  0x1fba,  0x1fbb,  0x1fc8,  0x1fc9,  0x1fca,  0x1fcb,  0x1fda,  0x1fdb,  0x1ff8,  0x1ff9,  0x1fea,  0x1feb,  0x1ffa,  0x1ffb,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fb8,  0x1fb9,  0x1fbc,  0x399,  0x1fcc,  0x1fd8,  0x1fd9,  0x1fe8,  0x1fe9,  0x1fec,  0x1ffc,  0x2132,  0x2160,  0x2161,  0x2162,  0x2163,  0x2164,  0x2165,  0x2166,  0x2167,  0x2168,  0x2169,  0x216a,  0x216b,  0x216c,  0x216d,  0x216e,  0x216f,  0x2183,  0x24b6,  0x24b7,  0x24b8,  0x24b9,  0x24ba,  0x24bb,  0x24bc,  0x24bd,  0x24be,  0x24bf,  0x24c0,  0x24c1,  0x24c2,  0x24c3,  0x24c4,  0x24c5,  0x24c6,  0x24c7,  0x24c8,  0x24c9,  0x24ca,  0x24cb,  0x24cc,  0x24cd,  0x24ce,  0x24cf,  0x2c00,  0x2c01,  0x2c02,  0x2c03,  0x2c04,  0x2c05,  0x2c06,  0x2c07,  0x2c08,  0x2c09,  0x2c0a,  0x2c0b,  0x2c0c,  0x2c0d,  0x2c0e,  0x2c0f,  0x2c10,  0x2c11,  0x2c12,  0x2c13,  0x2c14,  0x2c15,  0x2c16,  0x2c17,  0x2c18,  0x2c19,  0x2c1a,  0x2c1b,  0x2c1c,  0x2c1d,  0x2c1e,  0x2c1f,  0x2c20,  0x2c21,  0x2c22,  0x2c23,  0x2c24,  0x2c25,  0x2c26,  0x2c27,  0x2c28,  0x2c29,  0x2c2a,  0x2c2b,  0x2c2c,  0x2c2d,  0x2c2e,  0x2c60,  0x23a,  0x23e,  0x2c67,  0x2c69,  0x2c6b,  0x2c72,  0x2c75,  0x2c80,  0x2c82,  0x2c84,  0x2c86,  0x2c88,  0x2c8a,  0x2c8c,  0x2c8e,  0x2c90,  0x2c92,  0x2c94,  0x2c96,  0x2c98,  0x2c9a,  0x2c9c,  0x2c9e,  0x2ca0,  0x2ca2,  0x2ca4,  0x2ca6,  0x2ca8,  0x2caa,  0x2cac,  0x2cae,  0x2cb0,  0x2cb2,  0x2cb4,  0x2cb6,  0x2cb8,  0x2cba,  0x2cbc,  0x2cbe,  0x2cc0,  0x2cc2,  0x2cc4,  0x2cc6,  0x2cc8,  0x2cca,  0x2ccc,  0x2cce,  0x2cd0,  0x2cd2,  0x2cd4,  0x2cd6,  0x2cd8,  0x2cda,  0x2cdc,  0x2cde,  0x2ce0,  0x2ce2,  0x2ceb,  0x2ced,  0x2cf2,  0x10a0,  0x10a1,  0x10a2,  0x10a3,  0x10a4,  0x10a5,  0x10a6,  0x10a7,  0x10a8,  0x10a9,  0x10aa,  0x10ab,  0x10ac,  0x10ad,  0x10ae,  0x10af,  0x10b0,  0x10b1,  0x10b2,  0x10b3,  0x10b4,  0x10b5,  0x10b6,  0x10b7,  0x10b8,  0x10b9,  0x10ba,  0x10bb,  0x10bc,  0x10bd,  0x10be,  0x10bf,  0x10c0,  0x10c1,  0x10c2,  0x10c3,  0x10c4,  0x10c5,  0x10c7,  0x10cd,  0xa640,  0xa642,  0xa644,  0xa646,  0xa648,  0xa64a,  0xa64c,  0xa64e,  0xa650,  0xa652,  0xa654,  0xa656,  0xa658,  0xa65a,  0xa65c,  0xa65e,  0xa660,  0xa662,  0xa664,  0xa666,  0xa668,  0xa66a,  0xa66c,  0xa680,  0xa682,  0xa684,  0xa686,  0xa688,  0xa68a,  0xa68c,  0xa68e,  0xa690,  0xa692,  0xa694,  0xa696,  0xa722,  0xa724,  0xa726,  0xa728,  0xa72a,  0xa72c,  0xa72e,  0xa732,  0xa734,  0xa736,  0xa738,  0xa73a,  0xa73c,  0xa73e,  0xa740,  0xa742,  0xa744,  0xa746,  0xa748,  0xa74a,  0xa74c,  0xa74e,  0xa750,  0xa752,  0xa754,  0xa756,  0xa758,  0xa75a,  0xa75c,  0xa75e,  0xa760,  0xa762,  0xa764,  0xa766,  0xa768,  0xa76a,  0xa76c,  0xa76e,  0xa779,  0xa77b,  0xa77e,  0xa780,  0xa782,  0xa784,  0xa786,  0xa78b,  0xa790,  0xa792,  0xa7a0,  0xa7a2,  0xa7a4,  0xa7a6,  0xa7a8,  0xff21,  0xff22,  0xff23,  0xff24,  0xff25,  0xff26,  0xff27,  0xff28,  0xff29,  0xff2a,  0xff2b,  0xff2c,  0xff2d,  0xff2e,  0xff2f,  0xff30,  0xff31,  0xff32,  0xff33,  0xff34,  0xff35,  0xff36,  0xff37,  0xff38,  0xff39,  0xff3a,  0x10400,  0x10401,  0x10402,  0x10403,  0x10404,  0x10405,  0x10406,  0x10407,  0x10408,  0x10409,  0x1040a,  0x1040b,  0x1040c,  0x1040d,  0x1040e,  0x1040f,  0x10410,  0x10411,  0x10412,  0x10413,  0x10414,  0x10415,  0x10416,  0x10417,  0x10418,  0x10419,  0x1041a,  0x1041b,  0x1041c,  0x1041d,  0x1041e,  0x1041f,  0x10420,  0x10421,  0x10422,  0x10423,  0x10424,  0x10425,  0x10426,  0x10427,  0x2000053,  0x73,  0x130,  0x2000046,  0x66,  0x2000046,  0x69,  0x2000046,  0x6c,  0x3000046,  0x66,  0x69,  0x3000046,  0x66,  0x6c,  0x2000053,  0x74,  0x2000053,  0x74,  0x2000535,  0x582,  0x2000544,  0x576,  0x2000544,  0x565,  0x2000544,  0x56b,  0x200054e,  0x576,  0x2000544,  0x56d,  0x20002bc,  0x4e,  0x3000399,  0x308,  0x301,  0x30003a5,  0x308,  0x301,  0x200004a,  0x30c,  0x2000048,  0x331,  0x2000054,  0x308,  0x2000057,  0x30a,  0x2000059,  0x30a,  0x2000041,  0x2be,  0x20003a5,  0x313,  0x30003a5,  0x313,  0x300,  0x30003a5,  0x313,  0x301,  0x30003a5,  0x313,  0x342,  0x2000391,  0x342,  0x2000397,  0x342,  0x3000399,  0x308,  0x300,  0x3000399,  0x308,  0x301,  0x2000399,  0x342,  0x3000399,  0x308,  0x342,  0x30003a5,  0x308,  0x300,  0x30003a5,  0x308,  0x301,  0x20003a1,  0x313,  0x20003a5,  0x342,  0x30003a5,  0x308,  0x342,  0x20003a9,  0x342,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f88,  0x1f89,  0x1f8a,  0x1f8b,  0x1f8c,  0x1f8d,  0x1f8e,  0x1f8f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1f98,  0x1f99,  0x1f9a,  0x1f9b,  0x1f9c,  0x1f9d,  0x1f9e,  0x1f9f,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fa8,  0x1fa9,  0x1faa,  0x1fab,  0x1fac,  0x1fad,  0x1fae,  0x1faf,  0x1fbc,  0x1fbc,  0x1fcc,  0x1fcc,  0x1ffc,  0x1ffc,  0x2001fba,  0x345,  0x2000386,  0x345,  0x2001fca,  0x345,  0x2000389,  0x345,  0x2001ffa,  0x345,  0x200038f,  0x345,  0x3000391,  0x342,  0x345,  0x3000397,  0x342,  0x345,  0x30003a9,  0x342,  0x345]; return t; }
++}
++
++}
++
+--- a/src/libphobos/src/std/json.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/json.d	2014-04-01 16:32:51.000000000 +0100
+@@ -22,486 +22,598 @@ import std.conv;
+ import std.range;
+ import std.utf;
+ 
+-private {
+-        // Prevent conflicts from these generic names
+-        alias std.utf.stride UTFStride;
+-        alias std.utf.decode toUnicode;
++private
++{
++    // Prevent conflicts from these generic names
++    alias std.utf.stride UTFStride;
++    alias std.utf.decode toUnicode;
+ }
+ 
+ /**
+- JSON type enumeration
++JSON type enumeration
+ */
+-enum JSON_TYPE : byte {
+-        /// Indicates the type of a $(D JSONValue).
+-        STRING,
+-        INTEGER, /// ditto
+-        UINTEGER,/// integers > 2^63-1
+-        FLOAT,   /// ditto
+-        OBJECT,  /// ditto
+-        ARRAY,   /// ditto
+-        TRUE,    /// ditto
+-        FALSE,   /// ditto
+-        NULL     /// ditto
++enum JSON_TYPE : byte
++{
++    /// Indicates the type of a $(D JSONValue).
++    STRING,
++    INTEGER, /// ditto
++    UINTEGER,/// integers > 2^63-1
++    FLOAT,   /// ditto
++    OBJECT,  /// ditto
++    ARRAY,   /// ditto
++    TRUE,    /// ditto
++    FALSE,   /// ditto
++    NULL     /// ditto
+ }
+ 
+ /**
+- JSON value node
++JSON value node
+ */
+-struct JSONValue {
+-        union {
+-                /// Value when $(D type) is $(D JSON_TYPE.STRING)
+-                string                          str;
+-                /// Value when $(D type) is $(D JSON_TYPE.INTEGER)
+-                long                            integer;
+-                /// Value when $(D type) is $(D JSON_TYPE.UINTEGER)
+-                ulong                           uinteger;
+-                /// Value when $(D type) is $(D JSON_TYPE.FLOAT)
+-                real                            floating;
+-                /// Value when $(D type) is $(D JSON_TYPE.OBJECT)
+-                JSONValue[string]               object;
+-                /// Value when $(D type) is $(D JSON_TYPE.ARRAY)
+-                JSONValue[]                     array;
+-        }
+-        /// Specifies the _type of the value stored in this structure.
+-        JSON_TYPE                               type;
+-
+-        /// array syntax for json arrays
+-        ref JSONValue opIndex(size_t i)
+-            in { assert(type == JSON_TYPE.ARRAY, "json type is not array"); }
+-        body
+-        {
+-            return array[i];
+-        }
+-
+-        /// hash syntax for json objects
+-        ref JSONValue opIndex(string k)
+-            in { assert(type == JSON_TYPE.OBJECT, "json type is not object"); }
+-        body
+-        {
+-            return object[k];
+-        }
++struct JSONValue
++{
++    union
++    {
++        /// Value when $(D type) is $(D JSON_TYPE.STRING)
++        string                          str;
++        /// Value when $(D type) is $(D JSON_TYPE.INTEGER)
++        long                            integer;
++        /// Value when $(D type) is $(D JSON_TYPE.UINTEGER)
++        ulong                           uinteger;
++        /// Value when $(D type) is $(D JSON_TYPE.FLOAT)
++        real                            floating;
++        /// Value when $(D type) is $(D JSON_TYPE.OBJECT)
++        JSONValue[string]               object;
++        /// Value when $(D type) is $(D JSON_TYPE.ARRAY)
++        JSONValue[]                     array;
++    }
++    /// Specifies the _type of the value stored in this structure.
++    JSON_TYPE                               type;
++
++    /// array syntax for json arrays
++    ref JSONValue opIndex(size_t i)
++    in { assert(type == JSON_TYPE.ARRAY, "json type is not array"); }
++    body
++    {
++        return array[i];
++    }
++
++    /// hash syntax for json objects
++    ref JSONValue opIndex(string k)
++    in { assert(type == JSON_TYPE.OBJECT, "json type is not object"); }
++    body
++    {
++        return object[k];
++    }
+ }
+ 
+ /**
+- Parses a serialized string and returns a tree of JSON values.
++Parses a serialized string and returns a tree of JSON values.
+ */
+-JSONValue parseJSON(T)(T json, int maxDepth = -1) if(isInputRange!T) {
+-        JSONValue root = void;
+-        root.type = JSON_TYPE.NULL;
++JSONValue parseJSON(T)(T json, int maxDepth = -1) if(isInputRange!T)
++{
++    JSONValue root = void;
++    root.type = JSON_TYPE.NULL;
+ 
+-        if(json.empty) return root;
++    if(json.empty) return root;
+ 
+-        int depth = -1;
+-        dchar next = 0;
+-        int line = 1, pos = 1;
++    int depth = -1;
++    dchar next = 0;
++    int line = 1, pos = 1;
+ 
+-        void error(string msg) {
+-                throw new JSONException(msg, line, pos);
+-        }
+-
+-        dchar peekChar() {
+-                if(!next) {
+-                        if(json.empty) return '\0';
+-                        next = json.front;
+-                        json.popFront();
+-                }
+-                return next;
+-        }
++    void error(string msg)
++    {
++        throw new JSONException(msg, line, pos);
++    }
+ 
+-        void skipWhitespace() {
+-                while(isWhite(peekChar())) next = 0;
++    dchar peekChar()
++    {
++        if(!next)
++        {
++            if(json.empty) return '\0';
++            next = json.front;
++            json.popFront();
+         }
++        return next;
++    }
+ 
+-        dchar getChar(bool SkipWhitespace = false)() {
+-                static if(SkipWhitespace) skipWhitespace();
+-
+-                dchar c = void;
+-                if(next) {
+-                        c = next;
+-                        next = 0;
+-                }
+-                else {
+-                        if(json.empty) error("Unexpected end of data.");
+-                        c = json.front;
+-                        json.popFront();
+-                }
++    void skipWhitespace()
++    {
++        while(isWhite(peekChar())) next = 0;
++    }
+ 
+-                if(c == '\n' || (c == '\r' && peekChar() != '\n')) {
+-                        line++;
+-                        pos = 1;
+-                }
+-                else {
+-                        pos++;
+-                }
++    dchar getChar(bool SkipWhitespace = false)()
++    {
++        static if(SkipWhitespace) skipWhitespace();
+ 
+-                return c;
++        dchar c = void;
++        if(next)
++        {
++            c = next;
++            next = 0;
++        }
++        else
++        {
++            if(json.empty) error("Unexpected end of data.");
++            c = json.front;
++            json.popFront();
+         }
+ 
+-        void checkChar(bool SkipWhitespace = true, bool CaseSensitive = true)(char c) {
+-                static if(SkipWhitespace) skipWhitespace();
+-                auto c2 = getChar();
+-                static if(!CaseSensitive) c2 = toLower(c2);
+-
+-                if(c2 != c) error(text("Found '", c2, "' when expecting '", c, "'."));
++        if(c == '\n' || (c == '\r' && peekChar() != '\n'))
++        {
++            line++;
++            pos = 1;
++        }
++        else
++        {
++            pos++;
+         }
+ 
+-        bool testChar(bool SkipWhitespace = true, bool CaseSensitive = true)(char c)
++        return c;
++    }
++
++    void checkChar(bool SkipWhitespace = true, bool CaseSensitive = true)(char c)
+     {
+-                static if(SkipWhitespace) skipWhitespace();
+-                auto c2 = peekChar();
+-                static if (!CaseSensitive) c2 = toLower(c2);
++        static if(SkipWhitespace) skipWhitespace();
++        auto c2 = getChar();
++        static if(!CaseSensitive) c2 = toLower(c2);
+ 
+-                if(c2 != c) return false;
++        if(c2 != c) error(text("Found '", c2, "' when expecting '", c, "'."));
++    }
+ 
+-                getChar();
+-                return true;
+-        }
++    bool testChar(bool SkipWhitespace = true, bool CaseSensitive = true)(char c)
++    {
++        static if(SkipWhitespace) skipWhitespace();
++        auto c2 = peekChar();
++        static if (!CaseSensitive) c2 = toLower(c2);
+ 
+-        string parseString() {
+-                auto str = appender!string();
++        if(c2 != c) return false;
+ 
+-        Next:
+-                switch(peekChar()) {
+-                case '"':
+-                        getChar();
+-                        break;
++        getChar();
++        return true;
++    }
+ 
+-                case '\\':
+-                        getChar();
+-                        auto c = getChar();
+-                        switch(c) {
+-                        case '"':       str.put('"');   break;
+-                        case '\\':      str.put('\\');  break;
+-                        case '/':       str.put('/');   break;
+-                        case 'b':       str.put('\b');  break;
+-                        case 'f':       str.put('\f');  break;
+-                        case 'n':       str.put('\n');  break;
+-                        case 'r':       str.put('\r');  break;
+-                        case 't':       str.put('\t');  break;
+-                        case 'u':
+-                                dchar val = 0;
+-                                foreach_reverse(i; 0 .. 4) {
+-                                        auto hex = toUpper(getChar());
+-                                        if(!isHexDigit(hex)) error("Expecting hex character");
+-                                        val += (isDigit(hex) ? hex - '0' : hex - ('A' - 10)) << (4 * i);
+-                                }
+-                                char[4] buf = void;
+-                                str.put(toUTF8(buf, val));
+-                                break;
++    string parseString()
++    {
++        auto str = appender!string();
+ 
+-                        default:
+-                                error(text("Invalid escape sequence '\\", c, "'."));
++    Next:
++        switch(peekChar())
++        {
++            case '"':
++                getChar();
++                break;
++
++            case '\\':
++                getChar();
++                auto c = getChar();
++                switch(c)
++                {
++                    case '"':       str.put('"');   break;
++                    case '\\':      str.put('\\');  break;
++                    case '/':       str.put('/');   break;
++                    case 'b':       str.put('\b');  break;
++                    case 'f':       str.put('\f');  break;
++                    case 'n':       str.put('\n');  break;
++                    case 'r':       str.put('\r');  break;
++                    case 't':       str.put('\t');  break;
++                    case 'u':
++                        dchar val = 0;
++                        foreach_reverse(i; 0 .. 4)
++                        {
++                            auto hex = toUpper(getChar());
++                            if(!isHexDigit(hex)) error("Expecting hex character");
++                            val += (isDigit(hex) ? hex - '0' : hex - ('A' - 10)) << (4 * i);
+                         }
+-                        goto Next;
++                        char[4] buf = void;
++                        str.put(toUTF8(buf, val));
++                        break;
+ 
+-                default:
+-                        auto c = getChar();
+-                        appendJSONChar(&str, c, &error);
+-                        goto Next;
++                    default:
++                        error(text("Invalid escape sequence '\\", c, "'."));
+                 }
++                goto Next;
+ 
+-                return str.data;
++            default:
++                auto c = getChar();
++                appendJSONChar(&str, c, &error);
++                goto Next;
+         }
+ 
+-        void parseValue(JSONValue* value) {
+-                depth++;
+-
+-                if(maxDepth != -1 && depth > maxDepth) error("Nesting too deep.");
++        return str.data ? str.data : "";
++    }
+ 
+-                auto c = getChar!true();
++    void parseValue(JSONValue* value)
++    {
++        depth++;
+ 
+-                switch(c) {
+-                case '{':
+-                        value.type = JSON_TYPE.OBJECT;
+-                        value.object = null;
++        if(maxDepth != -1 && depth > maxDepth) error("Nesting too deep.");
+ 
+-                        if(testChar('}')) break;
++        auto c = getChar!true();
+ 
+-                        do {
+-                                checkChar('"');
+-                                string name = parseString();
+-                                checkChar(':');
+-                                JSONValue member = void;
+-                                parseValue(&member);
+-                                value.object[name] = member;
+-                        } while(testChar(','));
++        switch(c)
++        {
++            case '{':
++                value.type = JSON_TYPE.OBJECT;
++                value.object = null;
+ 
+-                        checkChar('}');
+-                        break;
++                if(testChar('}')) break;
+ 
+-                case '[':
+-                        value.type = JSON_TYPE.ARRAY;
+-                        value.array = null;
+-
+-                        if(testChar(']')) break;
+-
+-                        do {
+-                                JSONValue element = void;
+-                                parseValue(&element);
+-                                value.array ~= element;
+-                        } while(testChar(','));
++                do
++                {
++                    checkChar('"');
++                    string name = parseString();
++                    checkChar(':');
++                    JSONValue member = void;
++                    parseValue(&member);
++                    value.object[name] = member;
++                }
++                while(testChar(','));
+ 
+-                        checkChar(']');
+-                        break;
++                checkChar('}');
++                break;
+ 
+-                case '"':
+-                        value.type = JSON_TYPE.STRING;
+-                        value.str = parseString();
+-                        break;
++            case '[':
++                value.type = JSON_TYPE.ARRAY;
+ 
+-                case '0': .. case '9':
+-                case '-':
+-                        auto number = appender!string();
+-                        bool isFloat, isNegative;
+-
+-                        void readInteger() {
+-                                if(!isDigit(c)) error("Digit expected");
+-
+-                                Next: number.put(c);
+-
+-                                if(isDigit(peekChar())) {
+-                                        c = getChar();
+-                                        goto Next;
+-                                }
+-                        }
++                if(testChar(']'))
++                {
++                    value.array = cast(JSONValue[]) "";
++                    break;
++                }
+ 
+-                        if(c == '-') {
+-                                number.put('-');
+-                                c = getChar();
+-                                isNegative = true;
+-                        }
++                value.array = null;
+ 
+-                        readInteger();
++                do
++                {
++                    JSONValue element = void;
++                    parseValue(&element);
++                    value.array ~= element;
++                }
++                while(testChar(','));
+ 
+-                        if(testChar('.')) {
+-                                isFloat = true;
+-                                number.put('.');
+-                                c = getChar();
+-                                readInteger();
+-                        }
+-                        if(testChar!(false, false)('e')) {
+-                                isFloat = true;
+-                                number.put('e');
+-                                if(testChar('+')) number.put('+');
+-                                else if(testChar('-')) number.put('-');
+-                                c = getChar();
+-                                readInteger();
+-                        }
++                checkChar(']');
++                break;
+ 
+-                        string data = number.data;
+-                        if(isFloat) {
+-                                value.type = JSON_TYPE.FLOAT;
+-                                value.floating = parse!real(data);
+-                        }
+-                        else {
+-                                if (isNegative)
+-                                    value.integer = parse!long(data);
+-                                else
+-                                    value.uinteger = parse!ulong(data);
+-                                value.type = !isNegative && value.uinteger & (1UL << 63) ? JSON_TYPE.UINTEGER : JSON_TYPE.INTEGER;
+-                        }
+-                        break;
++            case '"':
++                value.type = JSON_TYPE.STRING;
++                value.str = parseString();
++                break;
+ 
+-                case 't':
+-                case 'T':
+-                        value.type = JSON_TYPE.TRUE;
+-                        checkChar!(false, false)('r');
+-                        checkChar!(false, false)('u');
+-                        checkChar!(false, false)('e');
+-                        break;
++            case '0': .. case '9':
++            case '-':
++                auto number = appender!string();
++                bool isFloat, isNegative;
+ 
+-                case 'f':
+-                case 'F':
+-                        value.type = JSON_TYPE.FALSE;
+-                        checkChar!(false, false)('a');
+-                        checkChar!(false, false)('l');
+-                        checkChar!(false, false)('s');
+-                        checkChar!(false, false)('e');
+-                        break;
++                void readInteger()
++                {
++                    if(!isDigit(c)) error("Digit expected");
+ 
+-                case 'n':
+-                case 'N':
+-                        value.type = JSON_TYPE.NULL;
+-                        checkChar!(false, false)('u');
+-                        checkChar!(false, false)('l');
+-                        checkChar!(false, false)('l');
+-                        break;
++                Next: number.put(c);
+ 
+-                default:
+-                        error(text("Unexpected character '", c, "'."));
++                    if(isDigit(peekChar()))
++                    {
++                        c = getChar();
++                        goto Next;
++                    }
+                 }
+ 
+-                depth--;
++                if(c == '-')
++                {
++                    number.put('-');
++                    c = getChar();
++                    isNegative = true;
++                }
++
++                readInteger();
++
++                if(testChar('.'))
++                {
++                    isFloat = true;
++                    number.put('.');
++                    c = getChar();
++                    readInteger();
++                }
++                if(testChar!(false, false)('e'))
++                {
++                    isFloat = true;
++                    number.put('e');
++                    if(testChar('+')) number.put('+');
++                    else if(testChar('-')) number.put('-');
++                    c = getChar();
++                    readInteger();
++                }
++
++                string data = number.data;
++                if(isFloat)
++                {
++                    value.type = JSON_TYPE.FLOAT;
++                    value.floating = parse!real(data);
++                }
++                else
++                {
++                    if (isNegative)
++                        value.integer = parse!long(data);
++                    else
++                        value.uinteger = parse!ulong(data);
++                    value.type = !isNegative && value.uinteger & (1UL << 63) ? JSON_TYPE.UINTEGER : JSON_TYPE.INTEGER;
++                }
++                break;
++
++            case 't':
++            case 'T':
++                value.type = JSON_TYPE.TRUE;
++                checkChar!(false, false)('r');
++                checkChar!(false, false)('u');
++                checkChar!(false, false)('e');
++                break;
++
++            case 'f':
++            case 'F':
++                value.type = JSON_TYPE.FALSE;
++                checkChar!(false, false)('a');
++                checkChar!(false, false)('l');
++                checkChar!(false, false)('s');
++                checkChar!(false, false)('e');
++                break;
++
++            case 'n':
++            case 'N':
++                value.type = JSON_TYPE.NULL;
++                checkChar!(false, false)('u');
++                checkChar!(false, false)('l');
++                checkChar!(false, false)('l');
++                break;
++
++            default:
++                error(text("Unexpected character '", c, "'."));
+         }
+ 
+-        parseValue(&root);
+-        return root;
++        depth--;
++    }
++
++    parseValue(&root);
++    return root;
+ }
+ 
+ /**
+- Takes a tree of JSON values and returns the serialized string.
+-*/
+-string toJSON(in JSONValue* root) {
+-        auto json = appender!string();
++Takes a tree of JSON values and returns the serialized string.
+ 
+-        void toString(string str) {
+-                json.put('"');
++If $(D pretty) is false no whitespaces are generated.
++If $(D pretty) is true serialized string is formatted to be human-readable.
++No exact formatting layout is guaranteed in the latter case.
++*/
++string toJSON(in JSONValue* root, in bool pretty = false)
++{
++    auto json = appender!string();
+ 
+-                foreach (dchar c; str) {
+-                        switch(c) {
+-                        case '"':       json.put("\\\"");       break;
+-                        case '\\':      json.put("\\\\");       break;
+-                        case '/':       json.put("\\/");        break;
+-                        case '\b':      json.put("\\b");        break;
+-                        case '\f':      json.put("\\f");        break;
+-                        case '\n':      json.put("\\n");        break;
+-                        case '\r':      json.put("\\r");        break;
+-                        case '\t':      json.put("\\t");        break;
+-                        default:
+-                                appendJSONChar(&json, c,
+-                                        (string msg){throw new JSONException(msg);});
+-                        }
+-                }
++    void toString(string str)
++    {
++        json.put('"');
+ 
+-                json.put('"');
++        foreach (dchar c; str)
++        {
++            switch(c)
++            {
++                case '"':       json.put("\\\"");       break;
++                case '\\':      json.put("\\\\");       break;
++                case '/':       json.put("\\/");        break;
++                case '\b':      json.put("\\b");        break;
++                case '\f':      json.put("\\f");        break;
++                case '\n':      json.put("\\n");        break;
++                case '\r':      json.put("\\r");        break;
++                case '\t':      json.put("\\t");        break;
++                default:
++                    appendJSONChar(&json, c,
++                                   (msg) { throw new JSONException(msg); });
++            }
+         }
+ 
+-        void toValue(in JSONValue* value) {
+-                final switch(value.type) {
+-                case JSON_TYPE.OBJECT:
+-                        json.put('{');
+-                        bool first = true;
+-                        foreach(name, member; value.object) {
+-                                if(first) first = false;
+-                                else json.put(',');
+-                                toString(name);
+-                                json.put(':');
+-                                toValue(&member);
+-                        }
+-                        json.put('}');
+-                        break;
+-
+-                case JSON_TYPE.ARRAY:
+-                        json.put('[');
+-                        auto length = value.array.length;
+-                        foreach (i; 0 .. length) {
+-                                if(i) json.put(',');
+-                                toValue(&value.array[i]);
+-                        }
+-                        json.put(']');
+-                        break;
+-
+-                case JSON_TYPE.STRING:
+-                        toString(value.str);
+-                        break;
+-
+-                case JSON_TYPE.INTEGER:
+-                        json.put(to!string(value.integer));
+-                        break;
+-
+-                case JSON_TYPE.UINTEGER:
+-                        json.put(to!string(value.uinteger));
+-                        break;
+-
+-                case JSON_TYPE.FLOAT:
+-                        json.put(to!string(value.floating));
+-                        break;
++        json.put('"');
++    }
+ 
+-                case JSON_TYPE.TRUE:
+-                        json.put("true");
+-                        break;
+-
+-                case JSON_TYPE.FALSE:
+-                        json.put("false");
+-                        break;
++    void toValue(in JSONValue* value, ulong indentLevel)
++    {
++        void putTabs(ulong additionalIndent = 0)
++        {
++            if(pretty)
++                foreach(i; 0 .. indentLevel + additionalIndent)
++                    json.put("    ");
++        }
++        void putEOL()
++        {
++            if(pretty)
++                json.put('\n');
++        }
++        void putCharAndEOL(char ch)
++        {
++            json.put(ch);
++            putEOL();
++        }
+ 
+-                case JSON_TYPE.NULL:
+-                        json.put("null");
+-                        break;
+-                }
++        final switch(value.type)
++        {
++            case JSON_TYPE.OBJECT:
++                if(!value.object.length)
++                {
++                    json.put("{}");
++                }
++                else
++                {
++                    putCharAndEOL('{');
++                    bool first = true;
++                    foreach(name, member; value.object)
++                    {
++                        if(!first)
++                            putCharAndEOL(',');
++                        first = false;
++                        putTabs(1);
++                        toString(name);
++                        json.put(':');
++                        if(pretty)
++                            json.put(' ');
++                        toValue(&member, indentLevel + 1);
++                    }
++                    putEOL();
++                    putTabs();
++                    json.put('}');
++                }
++                break;
++
++            case JSON_TYPE.ARRAY:
++                if(value.array.empty)
++                {
++                    json.put("[]");
++                }
++                else
++                {
++                    putCharAndEOL('[');
++                    foreach (i, ref el; value.array)
++                    {
++                        if(i)
++                            putCharAndEOL(',');
++                        putTabs(1);
++                        toValue(&el, indentLevel + 1);
++                    }
++                    putEOL();
++                    putTabs();
++                    json.put(']');
++                }
++                break;
++
++            case JSON_TYPE.STRING:
++                toString(value.str);
++                break;
++
++            case JSON_TYPE.INTEGER:
++                json.put(to!string(value.integer));
++                break;
++
++            case JSON_TYPE.UINTEGER:
++                json.put(to!string(value.uinteger));
++                break;
++
++            case JSON_TYPE.FLOAT:
++                json.put(to!string(value.floating));
++                break;
++
++            case JSON_TYPE.TRUE:
++                json.put("true");
++                break;
++
++            case JSON_TYPE.FALSE:
++                json.put("false");
++                break;
++
++            case JSON_TYPE.NULL:
++                json.put("null");
++                break;
+         }
++    }
+ 
+-        toValue(root);
+-        return json.data;
++    toValue(root, 0);
++    return json.data;
+ }
+ 
+ private void appendJSONChar(Appender!string* dst, dchar c,
+-        scope void delegate(string) error)
++                            scope void delegate(string) error)
+ {
+-    if(isControl(c)) error("Illegal control character.");
++    import std.uni : isControl;
++
++    if(isControl(c))
++        error("Illegal control character.");
+     dst.put(c);
+-//      int stride = UTFStride((&c)[0 .. 1], 0);
+-//      if(stride == 1) {
+-//              if(isControl(c)) error("Illegal control character.");
+-//              dst.put(c);
+-//      }
+-//      else {
+-//              char[6] utf = void;
+-//              utf[0] = c;
+-//              foreach(i; 1 .. stride) utf[i] = next;
+-//              size_t index = 0;
+-//              if(isControl(toUnicode(utf[0 .. stride], index)))
+-//                      error("Illegal control character");
+-//              dst.put(utf[0 .. stride]);
+-//      }
+ }
+ 
+ /**
+- Exception thrown on JSON errors
++Exception thrown on JSON errors
+ */
+-class JSONException : Exception {
+-        this(string msg, int line = 0, int pos = 0) {
+-                if(line) super(text(msg, " (Line ", line, ":", pos, ")"));
+-                else super(msg);
+-        }
++class JSONException : Exception
++{
++    this(string msg, int line = 0, int pos = 0)
++    {
++        if(line)
++            super(text(msg, " (Line ", line, ":", pos, ")"));
++        else
++            super(msg);
++    }
+ }
+ 
+-version(unittest) import std.stdio;
++version(unittest) import std.exception;
+ 
+-unittest {
+-        // An overly simple test suite, if it can parse a serializated string and
+-        // then use the resulting values tree to generate an identical
+-        // serialization, both the decoder and encoder works.
+-
+-        auto jsons = [
+-                `null`,
+-                `true`,
+-                `false`,
+-                `0`,
+-                `123`,
+-                `-4321`,
+-                `0.23`,
+-                `-0.23`,
+-                `""`,
+-                `1.223e+24`,
+-                `"hello\nworld"`,
+-                `"\"\\\/\b\f\n\r\t"`,
+-                `[]`,
+-                `[12,"foo",true,false]`,
+-                `{}`,
+-                `{"a":1,"b":null}`,
+-// Currently broken
+-//              `{"hello":{"json":"is great","array":[12,null,{}]},"goodbye":[true,"or",false,["test",42,{"nested":{"a":23.54,"b":0.0012}}]]}`
+-        ];
+-
+-        JSONValue val;
+-        string result;
+-        foreach(json; jsons) {
+-                try {
+-                        val = parseJSON(json);
+-                        result = toJSON(&val);
+-                        assert(result == json, text(result, " should be ", json));
+-                }
+-                catch(JSONException e) {
+-                        writefln(text(json, "\n", e.toString()));
+-                }
++unittest
++{
++    // An overly simple test suite, if it can parse a serializated string and
++    // then use the resulting values tree to generate an identical
++    // serialization, both the decoder and encoder works.
++
++    auto jsons = [
++        `null`,
++        `true`,
++        `false`,
++        `0`,
++        `123`,
++        `-4321`,
++        `0.23`,
++        `-0.23`,
++        `""`,
++        `"hello\nworld"`,
++        `"\"\\\/\b\f\n\r\t"`,
++        `[]`,
++        `[12,"foo",true,false]`,
++        `{}`,
++        `{"a":1,"b":null}`,
++        // Currently broken
++        // `{"hello":{"json":"is great","array":[12,null,{}]},"goodbye":[true,"or",false,["test",42,{"nested":{"a":23.54,"b":0.0012}}]]}`
++    ];
++
++    version (MinGW)
++        jsons ~= `1.223e+024`;
++    else
++        jsons ~= `1.223e+24`;
++
++    JSONValue val;
++    string result;
++    foreach(json; jsons)
++    {
++        try
++        {
++            val = parseJSON(json);
++            result = toJSON(&val);
++            assert(result == json, text(result, " should be ", json));
+         }
++        catch(JSONException e)
++        {
++            import std.stdio;
++            writefln(text(json, "\n", e.toString()));
++        }
++    }
+ 
+-        // Should be able to correctly interpret unicode entities
+-        val = parseJSON(`"\u003C\u003E"`);
+-        assert(toJSON(&val) == "\"\<\>\"");
+-        val = parseJSON(`"\u0391\u0392\u0393"`);
+-        assert(toJSON(&val) == "\"\Α\Β\Γ\"");
+-        val = parseJSON(`"\u2660\u2666"`);
+-        assert(toJSON(&val) == "\"\♠\♦\"");
++    // Should be able to correctly interpret unicode entities
++    val = parseJSON(`"\u003C\u003E"`);
++    assert(toJSON(&val) == "\"\<\>\"");
++    val = parseJSON(`"\u0391\u0392\u0393"`);
++    assert(toJSON(&val) == "\"\Α\Β\Γ\"");
++    val = parseJSON(`"\u2660\u2666"`);
++    assert(toJSON(&val) == "\"\♠\♦\"");
++
++    //0x7F is a control character (see Unicode spec)
++    assertThrown(parseJSON(`{ "foo": "` ~ "\u007F" ~ `"}`));
++
++    with(parseJSON(`""`))
++        assert(str == "" && str !is null);
++    with(parseJSON(`[]`))
++        assert(!array.length && array !is null);
++
++    // Formatting
++    val = parseJSON(`{"a":[null,{"x":1},{},[]]}`);
++    assert(toJSON(&val, true) == `{
++    "a": [
++        null,
++        {
++            "x": 1
++        },
++        {},
++        []
++    ]
++}`);
+ }
+--- a/src/libphobos/src/std/math.d	2013-06-02 11:37:56.000000000 +0100
++++ b/src/libphobos/src/std/math.d	2014-04-01 16:32:51.000000000 +0100
+@@ -47,9 +47,16 @@
+  *      HALF = ½
+  *
+  * Copyright: Copyright Digital Mars 2000 - 2011.
++ *            D implementations of tan, atan, atan2, exp, expm1, exp2, log, log10, log1p,
++ *            log2, floor, ceil and lrint functions are based on the CEPHES math library,
++ *            which is Copyright (C) 2001 Stephen L. Moshier 
++ *            and are incorporated herein by permission of the author.  The author
++ *            reserves the right to distribute this material elsewhere under different
++ *            copying permissions.  These modifications are distributed here under
++ *            the following terms:
+  * License:   Boost License 1.0.
+  * Authors:   $(WEB digitalmars.com, Walter Bright),
+- *                        Don Clugston
++ *                        Don Clugston, Conversion of CEPHES math library to D by Iain Buclaw
+  * Source: $(PHOBOSSRC std/_math.d)
+  */
+ 
+@@ -127,8 +134,8 @@ version(unittest)
+         if (isnan(x) || isnan(y))
+             return 0;
+ 
+-        char bufx[30];
+-        char bufy[30];
++        char[30] bufx;
++        char[30] bufy;
+         assert(ndigits < bufx.length);
+ 
+         int ix;
+@@ -490,8 +497,7 @@ trigerr:
+     }
+     return real.nan;
+ 
+-Lret:
+-    ;
++Lret: {}
+     }
+     else version(D_InlineAsm_X86_64)
+     {
+@@ -539,18 +545,78 @@ trigerr:
+     }
+     return real.nan;
+ 
+-Lret:
+-    ;
++Lret: {}
+     }
+     else
+     {
+-        return core.stdc.math.tanl(x);
++        // Coefficients for tan(x)
++        static immutable real[3] P = [
++           -1.7956525197648487798769E7L,
++            1.1535166483858741613983E6L,
++           -1.3093693918138377764608E4L,
++        ];
++        static immutable real[5] Q = [
++           -5.3869575592945462988123E7L,
++            2.5008380182335791583922E7L,
++           -1.3208923444021096744731E6L,
++            1.3681296347069295467845E4L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // PI/4 split into three parts.
++        enum real P1 = 7.853981554508209228515625E-1L;
++        enum real P2 = 7.946627356147928367136046290398E-9L;
++        enum real P3 = 3.061616997868382943065164830688E-17L;
++
++        // Special cases.
++        if (x == 0.0 || isNaN(x))
++            return x;
++        if (isInfinity(x))
++            return real.nan;
++
++        // Make argument positive but save the sign.
++        bool sign = false;
++        if (signbit(x))
++        {
++            sign = true;
++            x = -x;
++        }
++
++        // Compute x mod PI/4.
++        real y = floor(x / PI_4);
++        // Strip high bits of integer part.
++        real z = ldexp(y, -4);
++        // Compute y - 16 * (y / 16).
++        z = y - ldexp(floor(z), 4);
++
++        // Integer and fraction part modulo one octant.
++        int j = cast(int)(z);
++
++        // Map zeros and singularities to origin.
++        if (j & 1)
++        {
++            j += 1;
++            y += 1.0;
++        }
++
++        z = ((x - y * P1) - y * P2) - y * P3;
++        real zz = z * z;
++
++        if (zz > 1.0e-20L)
++            y = z + z * (zz * poly(zz, P) / poly(zz, Q));
++        else
++            y = z;
++
++        if (j & 2)
++            y = -1.0 / y;
++
++        return (sign) ? -y : y;
+     }
+ }
+ 
+ unittest
+ {
+-    static real vals[][2] =     // angle,tan
++    static real[2][] vals =     // angle,tan
+         [
+          [   0,   0],
+          [   .5,  .5463024898],
+@@ -671,7 +737,72 @@ unittest
+  *      $(TR $(TD $(PLUSMN)$(INFIN)) $(TD $(NAN))       $(TD yes))
+  *  )
+  */
+-real atan(real x) @safe pure nothrow { return atan2(x, 1.0L); }
++real atan(real x) @safe pure nothrow
++{
++    version(InlineAsm_X86_Any)
++    {
++        return atan2(x, 1.0L);
++    }
++    else
++    {
++        // Coefficients for atan(x)
++        static immutable real[5] P = [
++           -5.0894116899623603312185E1L,
++           -9.9988763777265819915721E1L,
++           -6.3976888655834347413154E1L,
++           -1.4683508633175792446076E1L,
++           -8.6863818178092187535440E-1L,
++        ];
++        static immutable real[6] Q = [
++            1.5268235069887081006606E2L,
++            3.9157570175111990631099E2L,
++            3.6144079386152023162701E2L,
++            1.4399096122250781605352E2L,
++            2.2981886733594175366172E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // tan(PI/8)
++        enum real TAN_PI_8 = 4.1421356237309504880169e-1L;
++        // tan(3 * PI/8)
++        enum real TAN3_PI_8 = 2.41421356237309504880169L;
++
++        // Special cases.
++        if (x == 0.0)
++            return x;
++        if (isInfinity(x))
++            return copysign(PI_2, x);
++
++        // Make argument positive but save the sign.
++        bool sign = false;
++        if (signbit(x))
++        {
++            sign = true;
++            x = -x;
++        }
++
++        // Range reduction.
++        real y;
++        if (x > TAN3_PI_8)
++        {
++            y = PI_2;
++            x = -(1.0 / x);
++        }
++        else if (x > TAN_PI_8)
++        {
++            y = PI_4;
++            x = (x - 1.0)/(x + 1.0);
++        }
++        else
++            y = 0.0;
++
++        // Rational form in x^^2.
++        real z = x * x;
++        y = y + (poly(z, P) / poly(z, Q)) * z * x + x;
++
++        return (sign) ? -y : y;
++    }
++}
+ 
+ /// ditto
+ double atan(double x) @safe pure nothrow { return atan(cast(real)x); }
+@@ -730,7 +861,53 @@ real atan2(real y, real x) @trusted pure
+     }
+     else
+     {
+-        return core.stdc.math.atan2l(y,x);
++        // Special cases.
++        if (isNaN(x) || isNaN(y))
++            return real.nan;
++        if (y == 0.0)
++        {
++            if (x >= 0 && !signbit(x))
++                return copysign(0, y);
++            else
++                return copysign(PI, y);
++        }
++        if (x == 0.0)
++            return copysign(PI_2, y);
++        if (isInfinity(x))
++        {
++            if (signbit(x))
++            {
++                if (isInfinity(y))
++                    return copysign(3*PI_4, y);
++                else
++                    return copysign(PI, y);
++            }
++            else
++            {
++                if (isInfinity(y))
++                    return copysign(PI_4, y);
++                else
++                    return copysign(0.0, y);
++            }
++        }
++        if (isInfinity(y))
++            return copysign(PI_2, y);
++
++        // Call atan and determine the quadrant.
++        real z = atan(y / x);
++
++        if (signbit(x))
++        {
++            if (signbit(y))
++                z = z - PI;
++            else
++                z = z + PI;
++        }
++
++        if (z == 0.0)
++            return copysign(z, y);
++
++        return z;
+     }
+ }
+ 
+@@ -1108,7 +1285,53 @@ real exp(real x) @trusted pure nothrow
+     }
+     else
+     {
+-        return exp2(LOG2E*x);
++        // Coefficients for exp(x)
++        static immutable real[3] P = [
++            9.9999999999999999991025E-1L,
++            3.0299440770744196129956E-2L,
++            1.2617719307481059087798E-4L,
++        ];
++        static immutable real[4] Q = [
++            2.0000000000000000000897E0L,
++            2.2726554820815502876593E-1L,
++            2.5244834034968410419224E-3L,
++            3.0019850513866445504159E-6L,
++        ];
++
++        // C1 + C2 = LN2.
++        enum real C1 = 6.9314575195312500000000E-1L;
++        enum real C2 = 1.428606820309417232121458176568075500134E-6L;
++
++        // Overflow and Underflow limits.
++        enum real OF =  1.1356523406294143949492E4L;
++        enum real UF = -1.1432769596155737933527E4L;
++
++        // Special cases.
++        if (isNaN(x))
++            return x;
++        if (x > OF)
++            return real.infinity;
++        if (x < UF)
++            return 0.0;
++
++        // Express: e^^x = e^^g * 2^^n
++        //   = e^^g * e^^(n * LOG2E)
++        //   = e^^(g + n * LOG2E)
++        int n = cast(int)floor(LOG2E * x + 0.5);
++        x -= n * C1;
++        x -= n * C2;
++
++        // Rational approximation for exponential of the fractional part:
++        //  e^^x = 1 + 2x P(x^^2) / (Q(x^^2) - P(x^^2))
++        real xx = x * x;
++        real px = x * poly(xx, P);
++        x = px / (poly(xx, Q) - px);
++        x = 1.0 + ldexp(x, 1);
++
++        // Scale by power of 2.
++        x = ldexp(x, n);
++
++        return x;
+     }
+ }
+ 
+@@ -1120,7 +1343,7 @@ float exp(float x)  @safe pure nothrow
+ 
+ unittest
+ {
+-    assert(equalsDigit(exp(3.0), E * E * E, useDigits));
++    assert(equalsDigit(exp(3.0L), E * E * E, useDigits));
+ }
+ 
+ /**
+@@ -1303,7 +1526,57 @@ L_largenegative:
+     }
+     else
+     {
+-        return core.stdc.math.expm1l(x);
++        // Coefficients for exp(x) - 1
++        static immutable real[5] P = [
++           -1.586135578666346600772998894928250240826E4L,
++            2.642771505685952966904660652518429479531E3L,
++           -3.423199068835684263987132888286791620673E2L,
++            1.800826371455042224581246202420972737840E1L,
++           -5.238523121205561042771939008061958820811E-1L,
++        ];
++        static immutable real[6] Q = [
++           -9.516813471998079611319047060563358064497E4L,
++            3.964866271411091674556850458227710004570E4L,
++           -7.207678383830091850230366618190187434796E3L,
++            7.206038318724600171970199625081491823079E2L,
++           -4.002027679107076077238836622982900945173E1L,
++            1.000000000000000000000000000000000000000E0L,
++        ];
++
++        // C1 + C2 = LN2.
++        enum real C1 = 6.9314575195312500000000E-1L;
++        enum real C2 = 1.4286068203094172321215E-6L;
++
++        // Overflow and Underflow limits.
++        enum real OF =  1.1356523406294143949492E4L;
++        enum real UF = -4.5054566736396445112120088E1L;
++
++        // Special cases.
++        if (x > OF)
++            return real.infinity;
++        if (x == 0.0)
++            return x;
++        if (x < UF)
++            return -1.0;
++
++        // Express x = LN2 (n + remainder), remainder not exceeding 1/2.
++        int n = cast(int)floor(0.5 + x / LN2);
++        x -= n * C1;
++        x -= n * C2;
++
++        // Rational approximation:
++        //  exp(x) - 1 = x + 0.5 x^^2 + x^^3 P(x) / Q(x)
++        real px = x * poly(x, P);
++        real qx = poly(x, Q);
++        real xx = x * x;
++        qx = x + (0.5 * xx + xx * px / qx);
++
++        // We have qx = exp(remainder LN2) - 1, so:
++        //  exp(x) - 1 = 2^^n (qx + 1) - 1 = 2^^n qx + 2^^n - 1.
++        px = ldexp(1.0, n);
++        x = px * qx + (px - 1.0);
++
++        return x;
+     }
+ }
+ 
+@@ -1510,16 +1783,54 @@ L_was_nan:
+     }
+     else
+     {
+-        return core.stdc.math.exp2l(x);
++        // Coefficients for exp2(x)
++        static immutable real[3] P = [
++            2.0803843631901852422887E6L,
++            3.0286971917562792508623E4L,
++            6.0614853552242266094567E1L,
++        ];
++        static immutable real[4] Q = [
++            6.0027204078348487957118E6L,
++            3.2772515434906797273099E5L,
++            1.7492876999891839021063E3L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // Overflow and Underflow limits.
++        enum real OF =  16384.0L;
++        enum real UF = -16382.0L;
++
++        // Special cases.
++        if (isNaN(x))
++            return x;
++        if (x > OF)
++            return real.infinity;
++        if (x < UF)
++            return 0.0;
++
++        // Separate into integer and fractional parts.
++        int n = cast(int)floor(x + 0.5);
++        x -= n;
++
++        // Rational approximation:
++        //  exp2(x) = 1.0 + 2x P(x^^2) / (Q(x^^2) - P(x^^2))
++        real xx = x * x;
++        real px = x * poly(xx, P);
++        x = px / (poly(xx, Q) - px);
++        x = 1.0 + ldexp(x, 1);
++
++        // Scale by power of 2.
++        x = ldexp(x, n);
++
++        return x;
+     }
+ }
+ 
+ unittest
+ {
+-    assert(exp2(0.5L)== SQRT2);
++    assert(feqrel(exp2(0.5L), SQRT2) >= real.mant_dig -1);
+     assert(exp2(8.0L) == 256.0);
+     assert(exp2(-9.0L)== 1.0L/512.0);
+-    assert(exp(3.0L) == E*E*E);
+     assert( core.stdc.math.exp2f(0.0f) == 1 );
+     assert( core.stdc.math.exp2 (0.0)  == 1 );
+     assert( core.stdc.math.exp2l(0.0L) == 1 );
+@@ -1527,9 +1838,9 @@ unittest
+ 
+ unittest
+ {
+-    pragma(msg, "overflow/underflow test disabled in gdc. stdc exp doesn't set these flags");
+     FloatingPointControl ctrl;
+-    ctrl.disableExceptions(FloatingPointControl.allExceptions);
++    if(FloatingPointControl.hasExceptionTraps())
++        ctrl.disableExceptions(FloatingPointControl.allExceptions);
+     ctrl.rounding = FloatingPointControl.roundToNearest;
+ 
+     // @@BUG@@: Non-immutable array literals are ridiculous.
+@@ -1557,7 +1868,7 @@ unittest
+         resetIeeeFlags();
+         x = exp(exptestpoints[i][0]);
+         f = ieeeFlags;
+-        assert(x == exptestpoints[i][1]);
++        assert(equalsDigit(x, exptestpoints[i][1], 15));
+         // Check the overflow bit
+         //assert(f.overflow == (fabs(x) == real.infinity));
+         // Check the underflow bit
+@@ -1632,7 +1943,7 @@ creal expi(real y) @trusted pure nothrow
+ 
+ unittest
+ {
+-    real value = 1.3e5L; //Avoid constant folding
++    real value = 1.3e5L; // Avoid constant folding
+     assert(expi(value) == cos(value) + sin(value) * 1i);
+     assert(expi(0.0L) == 1L + 0.0Li);
+ }
+@@ -1659,7 +1970,7 @@ real frexp(real value, out int exp) @tru
+ {
+     ushort* vu = cast(ushort*)&value;
+     long* vl = cast(long*)&value;
+-    uint ex;
++    int ex;
+     alias floatTraits!(real) F;
+ 
+     ex = vu[F.EXPPOS_SHORT] & F.EXPMASK;
+@@ -1700,6 +2011,7 @@ real frexp(real value, out int exp) @tru
+             exp = ex - F.EXPBIAS - real.mant_dig + 1;
+             vu[F.EXPPOS_SHORT] = (0x8000 & vu[F.EXPPOS_SHORT]) | 0x3FFE;
+         }
++        return value;
+     }
+     else static if (real.mant_dig == 113)   // quadruple
+     {
+@@ -1742,6 +2054,7 @@ real frexp(real value, out int exp) @tru
+             vu[F.EXPPOS_SHORT] =
+                 cast(ushort)((0x8000 & vu[F.EXPPOS_SHORT]) | 0x3FFE);
+         }
++        return value;
+     }
+     else static if (real.mant_dig==53) // real is double
+     {
+@@ -1764,7 +2077,7 @@ real frexp(real value, out int exp) @tru
+             else
+             {
+                 exp = (ex - F.EXPBIAS) >> 4;
+-                vu[F.EXPPOS_SHORT] = cast(ushort)((0x8000 & vu[F.EXPPOS_SHORT]) | 0x3FE0);
++                vu[F.EXPPOS_SHORT] = cast(ushort)((0x800F & vu[F.EXPPOS_SHORT]) | 0x3FE0);
+             }
+         }
+         else if (!(*vl & 0x7FFF_FFFF_FFFF_FFFF))
+@@ -1781,18 +2094,18 @@ real frexp(real value, out int exp) @tru
+             vu[F.EXPPOS_SHORT] =
+                 cast(ushort)((0x8000 & vu[F.EXPPOS_SHORT]) | 0x3FE0);
+         }
++        return value;
+     }
+-    else
++    else // static if (real.mant_dig==106) // real is doubledouble
+     {
+         assert (0, "frexp not implemented");
+     }
+-    return value;
+ }
+ 
+ 
+ unittest
+ {
+-    static real vals[][3] =     // x,frexp,exp
++    static real[3][] vals =     // x,frexp,exp
+         [
+          [0.0,   0.0,    0],
+          [-0.0,  -0.0,   0],
+@@ -1822,7 +2135,7 @@ unittest
+ 
+     static if (real.mant_dig == 64)
+     {
+-        static real extendedvals[][3] = [ // x,frexp,exp
++        static real[3][] extendedvals = [ // x,frexp,exp
+                                           [0x1.a5f1c2eb3fe4efp+73L, 0x1.A5F1C2EB3FE4EFp-1L,   74],    // normal
+                                           [0x1.fa01712e8f0471ap-1064L,  0x1.fa01712e8f0471ap-1L,     -1063],
+                                           [real.min_normal,  .5,     -16381],
+@@ -1921,19 +2234,32 @@ real ldexp(real n, int exp) @safe pure n
+ 
+ unittest
+ {
+-    assert(ldexp(1, -16384) == 0x1p-16384L);
+-    assert(ldexp(1, -16382) == 0x1p-16382L);
+-    int x;
+-    real n = frexp(0x1p-16384L, x);
+-    assert(n==0.5L);
+-    assert(x==-16383);
+-    assert(ldexp(n, x)==0x1p-16384L);
+-
++    static if(real.mant_dig == 64)
++    {
++        assert(ldexp(1, -16384) == 0x1p-16384L);
++        assert(ldexp(1, -16382) == 0x1p-16382L);
++        int x;
++        real n = frexp(0x1p-16384L, x);
++        assert(n==0.5L);
++        assert(x==-16383);
++        assert(ldexp(n, x)==0x1p-16384L);
++    }
++    else static if(real.mant_dig == 53)
++    {
++        assert(ldexp(1, -1024) == 0x1p-1024L);
++        assert(ldexp(1, -1022) == 0x1p-1022L);
++        int x;
++        real n = frexp(0x1p-1024L, x);
++        assert(n==0.5L);
++        assert(x==-1023);
++        assert(ldexp(n, x)==0x1p-1024L);
++    }
++    else static assert(false, "Floating point type real not supported");
+ }
+ 
+ unittest
+ {
+-    static real vals[][3] =    // value,exp,ldexp
++    static real[3][] vals =    // value,exp,ldexp
+     [
+     [    0,    0,    0],
+     [    1,    0,    1],
+@@ -1989,7 +2315,110 @@ real log(real x) @safe pure nothrow
+     version (INLINE_YL2X)
+         return yl2x(x, LN2);
+     else
+-        return core.stdc.math.logl(x);
++    {
++        // Coefficients for log(1 + x)
++        static immutable real[7] P = [
++            2.0039553499201281259648E1L,
++            5.7112963590585538103336E1L,
++            6.0949667980987787057556E1L,
++            2.9911919328553073277375E1L,
++            6.5787325942061044846969E0L,
++            4.9854102823193375972212E-1L,
++            4.5270000862445199635215E-5L,
++        ];
++        static immutable real[7] Q = [
++            6.0118660497603843919306E1L,
++            2.1642788614495947685003E2L,
++            3.0909872225312059774938E2L,
++            2.2176239823732856465394E2L,
++            8.3047565967967209469434E1L,
++            1.5062909083469192043167E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // Coefficients for log(x)
++        static immutable real[4] R = [
++           -3.5717684488096787370998E1L,
++            1.0777257190312272158094E1L,
++           -7.1990767473014147232598E-1L,
++            1.9757429581415468984296E-3L,
++        ];
++        static immutable real[4] S = [
++           -4.2861221385716144629696E2L,
++            1.9361891836232102174846E2L,
++           -2.6201045551331104417768E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // C1 + C2 = LN2.
++        enum real C1 = 6.9314575195312500000000E-1L;
++        enum real C2 = 1.4286068203094172321215E-6L;
++
++        // Special cases.
++        if (isNaN(x))
++            return x;
++        if (isInfinity(x) && !signbit(x))
++            return x;
++        if (x == 0.0)
++            return -real.infinity;
++        if (x < 0.0)
++            return real.nan;
++
++        // Separate mantissa from exponent.
++        // Note, frexp is used so that denormal numbers will be handled properly.
++        real y, z;
++        int exp;
++
++        x = frexp(x, exp);
++
++        // Logarithm using log(x) = z + z^^3 P(z) / Q(z),
++        // where z = 2(x - 1)/(x + 1)
++        if((exp > 2) || (exp < -2))
++        {
++            if(x < SQRT1_2)
++            {   // 2(2x - 1)/(2x + 1)
++                exp -= 1;
++                z = x - 0.5;
++                y = 0.5 * z + 0.5;
++            }       
++            else
++            {   // 2(x - 1)/(x + 1)
++                z = x - 0.5;
++                z -= 0.5;
++                y = 0.5 * x  + 0.5;
++            }
++            x = z / y;
++            z = x * x;
++            z = x * (z * poly(z, R) / poly(z, S));
++            z += exp * C2;
++            z += x;
++            z += exp * C1;
++
++            return z;
++        }
++
++        // Logarithm using log(1 + x) = x - .5x^^2 + x^^3 P(x) / Q(x)
++        if (x < SQRT1_2)
++        {   // 2x - 1
++            exp -= 1;
++            x = ldexp(x, 1) - 1.0;
++        }
++        else
++        {
++            x = x - 1.0;
++        }
++        z = x * x;
++        y = x * (z * poly(x, P) / poly(x, Q));
++        y += exp * C2;
++        z = y - ldexp(z, -1);
++
++        // Note, the sum of above terms does not exceed x/4,
++        // so it contributes at most about 1/4 lsb to the error.
++        z += x;
++        z += exp * C1;
++
++        return z;
++    }
+ }
+ 
+ unittest
+@@ -2013,7 +2442,114 @@ real log10(real x) @safe pure nothrow
+     version (INLINE_YL2X)
+         return yl2x(x, LOG2);
+     else
+-        return core.stdc.math.log10l(x);
++    {
++        // Coefficients for log(1 + x)
++        static immutable real[7] P = [
++            2.0039553499201281259648E1L,
++            5.7112963590585538103336E1L,
++            6.0949667980987787057556E1L,
++            2.9911919328553073277375E1L,
++            6.5787325942061044846969E0L,
++            4.9854102823193375972212E-1L,
++            4.5270000862445199635215E-5L,
++        ];
++        static immutable real[7] Q = [
++            6.0118660497603843919306E1L,
++            2.1642788614495947685003E2L,
++            3.0909872225312059774938E2L,
++            2.2176239823732856465394E2L,
++            8.3047565967967209469434E1L,
++            1.5062909083469192043167E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // Coefficients for log(x)
++        static immutable real[4] R = [
++           -3.5717684488096787370998E1L,
++            1.0777257190312272158094E1L,
++           -7.1990767473014147232598E-1L,
++            1.9757429581415468984296E-3L,
++        ];
++        static immutable real[4] S = [
++           -4.2861221385716144629696E2L,
++            1.9361891836232102174846E2L,
++           -2.6201045551331104417768E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // log10(2) split into two parts.
++        enum real L102A =  0.3125L;
++        enum real L102B = -1.14700043360188047862611052755069732318101185E-2L;
++
++        // log10(e) split into two parts.
++        enum real L10EA =  0.5L;
++        enum real L10EB = -6.570551809674817234887108108339491770560299E-2L;
++
++        // Special cases are the same as for log.
++        if (isNaN(x))
++            return x;
++        if (isInfinity(x) && !signbit(x))
++            return x;
++        if (x == 0.0)
++            return -real.infinity;
++        if (x < 0.0)
++            return real.nan;
++
++        // Separate mantissa from exponent.
++        // Note, frexp is used so that denormal numbers will be handled properly.
++        real y, z;
++        int exp;
++
++        x = frexp(x, exp);
++
++        // Logarithm using log(x) = z + z^^3 P(z) / Q(z),
++        // where z = 2(x - 1)/(x + 1)
++        if((exp > 2) || (exp < -2))
++        {
++            if(x < SQRT1_2)
++            {   // 2(2x - 1)/(2x + 1)
++                exp -= 1;
++                z = x - 0.5;
++                y = 0.5 * z + 0.5;
++            }       
++            else
++            {   // 2(x - 1)/(x + 1)
++                z = x - 0.5;
++                z -= 0.5;
++                y = 0.5 * x  + 0.5;
++            }
++            x = z / y;
++            z = x * x;
++            y = x * (z * poly(z, R) / poly(z, S));
++            goto Ldone;
++        }
++
++        // Logarithm using log(1 + x) = x - .5x^^2 + x^^3 P(x) / Q(x)
++        if (x < SQRT1_2)
++        {   // 2x - 1
++            exp -= 1;
++            x = ldexp(x, 1) - 1.0;
++        }
++        else
++            x = x - 1.0;
++
++        z = x * x;
++        y = x * (z * poly(x, P) / poly(x, Q));
++        y = y - ldexp(z, -1);
++
++        // Multiply log of fraction by log10(e) and base 2 exponent by log10(2).
++        // This sequence of operations is critical and it may be horribly
++        // defeated by some compiler optimizers.
++    Ldone:
++        z = y * L10EB;
++        z += x * L10EB;
++        z += exp * L102B;
++        z += y * L10EA;
++        z += x * L10EA;
++        z += exp * L102A;
++
++        return z;
++    }
+ }
+ 
+ unittest
+@@ -2047,7 +2583,17 @@ real log1p(real x) @safe pure nothrow
+     }
+     else
+     {
+-        return core.stdc.math.log1pl(x);
++        // Special cases.
++        if (isNaN(x) || x == 0.0)
++            return x;
++        if (isInfinity(x) && !signbit(x))
++            return x;
++        if (x == -1.0)
++            return -real.infinity;
++        if (x < -1.0)
++            return real.nan;
++
++        return log(x + 1.0);
+     }
+ }
+ 
+@@ -2067,7 +2613,105 @@ real log2(real x) @safe pure nothrow
+     version (INLINE_YL2X)
+         return yl2x(x, 1);
+     else
+-        return core.stdc.math.log2l(x);
++    {
++        // Coefficients for log(1 + x)
++        static immutable real[7] P = [
++            2.0039553499201281259648E1L,
++            5.7112963590585538103336E1L,
++            6.0949667980987787057556E1L,
++            2.9911919328553073277375E1L,
++            6.5787325942061044846969E0L,
++            4.9854102823193375972212E-1L,
++            4.5270000862445199635215E-5L,
++        ];
++        static immutable real[7] Q = [
++            6.0118660497603843919306E1L,
++            2.1642788614495947685003E2L,
++            3.0909872225312059774938E2L,
++            2.2176239823732856465394E2L,
++            8.3047565967967209469434E1L,
++            1.5062909083469192043167E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // Coefficients for log(x)
++        static immutable real[4] R = [
++           -3.5717684488096787370998E1L,
++            1.0777257190312272158094E1L,
++           -7.1990767473014147232598E-1L,
++            1.9757429581415468984296E-3L,
++        ];
++        static immutable real[4] S = [
++           -4.2861221385716144629696E2L,
++            1.9361891836232102174846E2L,
++           -2.6201045551331104417768E1L,
++            1.0000000000000000000000E0L,
++        ];
++
++        // Special cases are the same as for log.
++        if (isNaN(x))
++            return x;
++        if (isInfinity(x) && !signbit(x))
++            return x;
++        if (x == 0.0)
++            return -real.infinity;
++        if (x < 0.0)
++            return real.nan;
++
++        // Separate mantissa from exponent.
++        // Note, frexp is used so that denormal numbers will be handled properly.
++        real y, z;
++        int exp;
++
++        x = frexp(x, exp);
++
++        // Logarithm using log(x) = z + z^^3 P(z) / Q(z),
++        // where z = 2(x - 1)/(x + 1)
++        if((exp > 2) || (exp < -2))
++        {
++            if(x < SQRT1_2)
++            {   // 2(2x - 1)/(2x + 1)
++                exp -= 1;
++                z = x - 0.5;
++                y = 0.5 * z + 0.5;
++            }       
++            else
++            {   // 2(x - 1)/(x + 1)
++                z = x - 0.5;
++                z -= 0.5;
++                y = 0.5 * x  + 0.5;
++            }
++            x = z / y;
++            z = x * x;
++            y = x * (z * poly(z, R) / poly(z, S));
++            goto Ldone;
++        }
++
++        // Logarithm using log(1 + x) = x - .5x^^2 + x^^3 P(x) / Q(x)
++        if (x < SQRT1_2)
++        {   // 2x - 1
++            exp -= 1;
++            x = ldexp(x, 1) - 1.0;
++        }
++        else
++            x = x - 1.0;
++
++        z = x * x;
++        y = x * (z * poly(x, P) / poly(x, Q));
++        y = y - ldexp(z, -1);
++
++        // Multiply log of fraction by log10(e) and base 2 exponent by log10(2).
++        // This sequence of operations is critical and it may be horribly
++        // defeated by some compiler optimizers.
++    Ldone:
++        z = y * (LOG2E - 1.0);
++        z += x * (LOG2E - 1.0);
++        z += y;
++        z += x;
++        z += exp;
++
++        return z;
++    }
+ }
+ 
+ unittest
+@@ -2309,7 +2953,7 @@ real hypot(real x, real y) @safe pure no
+ 
+ unittest
+ {
+-    static real vals[][3] =     // x,y,hypot
++    static real[3][] vals =     // x,y,hypot
+         [
+             [ 0.0,     0.0,   0.0],
+             [ 0.0,    -0.0,   0.0],
+@@ -2335,7 +2979,7 @@ unittest
+             real y = vals[i][1];
+             real z = vals[i][2];
+             real h = hypot(x, y);
+-            assert(isIdentical(z, h));
++            assert(isIdentical(z,h) || feqrel(z, h) >= real.mant_dig - 1);
+         }
+ }
+ 
+@@ -2343,7 +2987,7 @@ unittest
+  * Returns the value of x rounded upward to the next integer
+  * (toward positive infinity).
+  */
+-real ceil(real x)  @trusted nothrow
++real ceil(real x)  @trusted pure nothrow
+ {
+     version (Win64)
+     {
+@@ -2365,20 +3009,38 @@ real ceil(real x)  @trusted nothrow
+         }
+     }
+     else
+-        return core.stdc.math.ceill(x);
++    {
++        // Special cases.
++        if (isNaN(x) || isInfinity(x))
++            return x;
++
++        real y = floor(x);
++        if (y < x)
++            y += 1.0;
++
++        return y;
++    }
+ }
+ 
+ unittest
+ {
+     assert(ceil(+123.456) == +124);
+     assert(ceil(-123.456) == -123);
++    assert(ceil(-1.234) == -1);
++    assert(ceil(-0.123) == 0);
++    assert(ceil(0.0) == 0);
++    assert(ceil(+0.123) == 1);
++    assert(ceil(+1.234) == 2);
++    assert(ceil(real.infinity) == real.infinity);
++    assert(isNaN(ceil(real.nan)));
++    assert(isNaN(ceil(real.init)));
+ }
+ 
+ /**************************************
+  * Returns the value of x rounded downward to the next integer
+  * (toward negative infinity).
+  */
+-real floor(real x) @trusted nothrow
++real floor(real x) @trusted pure nothrow
+ {
+     version (Win64)
+     {
+@@ -2400,13 +3062,99 @@ real floor(real x) @trusted nothrow
+         }
+     }
+     else
+-        return core.stdc.math.floorl(x);
++    {
++        // Bit clearing masks.
++        static immutable ushort[17] BMASK = [
++            0xffff, 0xfffe, 0xfffc, 0xfff8,
++            0xfff0, 0xffe0, 0xffc0, 0xff80,
++            0xff00, 0xfe00, 0xfc00, 0xf800,
++            0xf000, 0xe000, 0xc000, 0x8000,
++            0x0000,
++        ];
++
++        // Special cases.
++        if (isNaN(x) || isInfinity(x) || x == 0.0)
++            return x;
++
++        alias floatTraits!(real) F;
++        auto vu = *cast(ushort[real.sizeof/2]*)(&x);
++
++        // Find the exponent (power of 2)
++        static if (real.mant_dig == 53)
++        {
++            int exp = ((vu[F.EXPPOS_SHORT] >> 4) & 0x7ff) - 0x3ff;
++
++            version (LittleEndian)
++                int pos = 0;
++            else
++                int pos = 3;
++        }
++        else static if (real.mant_dig == 64)
++        {
++            int exp = (vu[F.EXPPOS_SHORT] & 0x7fff) - 0x3fff;
++
++            version (LittleEndian)
++                int pos = 0;
++            else
++                int pos = 4;
++        }
++        else if (real.mant_dig == 113)
++        {
++            int exp = (vu[F.EXPPOS_SHORT] & 0x7fff) - 0x3fff;
++
++            version (LittleEndian)
++                int pos = 0;
++            else
++                int pos = 7;
++        }
++        else
++            static assert(false, "Only 64-bit, 80-bit, and 128-bit reals are supported by floor()");
++
++        if (exp < 0)
++        {
++            if (x < 0.0)
++                return -1.0;
++            else
++                return 0.0;
++        }
++
++        exp = (real.mant_dig - 1) - exp;
++
++        // Clean out 16 bits at a time.
++        while (exp >= 16)
++        {
++            version (LittleEndian)
++                vu[pos++] = 0;
++            else
++                vu[pos--] = 0;
++            exp -= 16;
++        }
++
++        // Clear the remaining bits.
++        if (exp > 0)
++            vu[pos] &= BMASK[exp];
++
++        real y = *cast(real*)(&vu);
++
++        if ((x < 0.0) && (x != y))
++            y -= 1.0;
++
++        return y;
++    }
+ }
+ 
+ unittest
+ {
+     assert(floor(+123.456) == +123);
+     assert(floor(-123.456) == -124);
++    assert(floor(-1.234) == -2);
++    assert(floor(-0.123) == -1);
++    assert(floor(0.0) == 0);
++    assert(floor(+0.123) == 0);
++    assert(floor(+1.234) == 1);
++    assert(floor(real.infinity) == real.infinity);
++    assert(isNaN(floor(real.nan)));
++    assert(isNaN(floor(real.init)));
+ }
+ 
+ /******************************************
+@@ -2474,10 +3222,126 @@ long lrint(real x) @trusted pure nothrow
+     }
+     else
+     {
+-        return core.stdc.math.llrintl(x);
++        static if (real.mant_dig == 53)
++        {
++            long result;
++
++            // Rounding limit when casting from real(double) to ulong.
++            enum real OF = 4.50359962737049600000E15L;
++
++            uint* vi = cast(uint*)(&x);
++
++            // Find the exponent and sign
++            uint msb = vi[MANTISSA_MSB];
++            uint lsb = vi[MANTISSA_LSB];
++            int exp = ((msb >> 20) & 0x7ff) - 0x3ff;
++            int sign = msb >> 31;
++            msb &= 0xfffff;
++            msb |= 0x100000;
++
++            if (exp < 63)
++            {
++                if (exp >= 52)
++                    result = (cast(long) msb << (exp - 20)) | (lsb << (exp - 52));
++                else
++                {
++                    // Adjust x and check result.
++                    real j = sign ? -OF : OF;
++                    x = (j + x) - j;
++                    msb = vi[MANTISSA_MSB];
++                    lsb = vi[MANTISSA_LSB];
++                    exp = ((msb >> 20) & 0x7ff) - 0x3ff;
++                    msb &= 0xfffff;
++                    msb |= 0x100000;
++
++                    if (exp < 0)
++                        result = 0;
++                    else if (exp < 20)
++                        result = cast(long) msb >> (20 - exp);
++                    else if (exp == 20)
++                        result = cast(long) msb;
++                    else
++                        result = (cast(long) msb << (exp - 20)) | (lsb >> (52 - exp));
++                }
++            }
++            else
++            {
++                // It is left implementation defined when the number is too large.
++                return cast(long) x;
++            }
++
++            return sign ? -result : result;
++        }
++        else static if (real.mant_dig == 64)
++        {
++            alias floatTraits!(real) F;
++            long result;
++
++            // Rounding limit when casting from real(80-bit) to ulong.
++            enum real OF = 9.22337203685477580800E18L;
++
++            ushort* vu = cast(ushort*)(&x);
++            uint* vi = cast(uint*)(&x);
++
++            // Find the exponent and sign
++            int exp = (vu[F.EXPPOS_SHORT] & 0x7fff) - 0x3fff;
++            int sign = (vu[F.EXPPOS_SHORT] >> 15) & 1;
++
++            if (exp < 63)
++            {
++                // Adjust x and check result.
++                real j = sign ? -OF : OF;
++                x = (j + x) - j;
++                exp = (vu[F.EXPPOS_SHORT] & 0x7fff) - 0x3fff;
++
++                version (LittleEndian)
++                {
++                    if (exp < 0)
++                        result = 0;
++                    else if (exp <= 31)
++                        result = vi[1] >> (31 - exp);
++                    else
++                        result = (cast(long) vi[1] << (exp - 31)) | (vi[0] >> (63 - exp));
++                }
++                else
++                {
++                    if (exp < 0)
++                        result = 0;
++                    else if (exp <= 31)
++                        result = vi[1] >> (31 - exp);
++                    else
++                        result = (cast(long) vi[1] << (exp - 31)) | (vi[2] >> (63 - exp));
++                }
++            }
++            else
++            {
++                // It is left implementation defined when the number is too large
++                // to fit in a 64bit long.
++                return cast(long) x;
++            }
++
++            return sign ? -result : result;
++        }
++        else
++        {
++            static assert(false, "Only 64-bit and 80-bit reals are supported by lrint()");
++        }
+     }
+ }
+ 
++unittest
++{
++    assert(lrint(4.5) == 4);
++    assert(lrint(5.5) == 6);
++    assert(lrint(-4.5) == -4);
++    assert(lrint(-5.5) == -6);
++
++    assert(lrint(int.max - 0.5) == 2147483646L);
++    assert(lrint(int.max + 0.5) == 2147483648L);
++    assert(lrint(int.min - 0.5) == -2147483648L);
++    assert(lrint(int.min + 0.5) == -2147483648L);
++}
++
+ /*******************************************
+  * Return the value of x rounded to the nearest integer.
+  * If the fractional part of x is exactly 0.5, the return value is rounded to
+@@ -2655,6 +3519,18 @@ private:
+             INVALID_MASK   = 0xF80 // PowerPC has five types of invalid exceptions.
+         }
+     }
++    else version (PPC64)
++    {
++        // PowerPC FPSCR is a 32-bit register.
++        enum : int
++        {
++            INEXACT_MASK   = 0x600,
++            UNDERFLOW_MASK = 0x010,
++            OVERFLOW_MASK  = 0x008,
++            DIVBYZERO_MASK = 0x020,
++            INVALID_MASK   = 0xF80 // PowerPC has five types of invalid exceptions.
++        }
++    }
+     else version (ARM)
+     {
+         enum : int
+@@ -2718,6 +3594,14 @@ private:
+             {
+                 "fstsw %%ax; andq $0x03D, %%rax;" : "=a" result;
+             }
++            else version (ARM_SoftFloat)
++            {
++                return 0;
++            }
++            else version (ARM) asm
++            {
++                "vmrs %0, FPSCR; and %0, %0, #0x1F;" : "=r" result;
++            }
+             else
+                 assert(0, "Not yet supported");
+             return result;
+@@ -2758,6 +3642,15 @@ private:
+             {
+                 "fnclex;";
+             }
++            else version (ARM_SoftFloat)
++            {
++            }
++            else version (ARM)
++            {
++                uint old = getIeeeFlags();
++                old &= ~0b11111; // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0408i/Chdfifdc.html
++                asm {"vmsr FPSCR, %0;" : : "r" (old);} 
++            }
+             else
+                 assert(0, "Not yet supported");
+         }
+@@ -2773,7 +3666,7 @@ private:
+         }
+     }
+ public:
+-    version (X86_Any) { // TODO: Lift this version condition when we support !x86.
++    version (IeeeFlagsSupport) {
+ 
+      /// The result cannot be represented exactly, so rounding occured.
+      /// (example: x = sin(0.1); )
+@@ -2793,7 +3686,14 @@ public:
+ 
+      }
+ }
+-
++version(X86_Any)
++{
++    version = IeeeFlagsSupport;
++}
++else version(ARM)
++{
++    version = IeeeFlagsSupport;
++}
+ 
+ /// Set all of the floating-point status flags to false.
+ void resetIeeeFlags() { IeeeFlags.resetIeeeFlags(); }
+@@ -2821,23 +3721,36 @@ void resetIeeeFlags() { IeeeFlags.resetI
+ 
+ 
+ Example:
+- ----
+-  {
++----
++{
++    FloatingPointControl fpctrl;
++
+     // Enable hardware exceptions for division by zero, overflow to infinity,
+     // invalid operations, and uninitialized floating-point variables.
+-
+-    FloatingPointControl fpctrl;
+     fpctrl.enableExceptions(FloatingPointControl.severeExceptions);
+ 
+-    double y = x*3.0; // will generate a hardware exception, if x is uninitialized.
+-    //
++    // This will generate a hardware exception, if x is a
++    // default-initialized floating point variable:
++    real x; // Add `= 0` or even `= real.nan` to not throw the exception.
++    real y = x * 3.0;
++
++    // The exception is only thrown for default-uninitialized NaN-s.
++    // NaN-s with other payload are valid:
++    real z = y * real.nan; // ok
++
++    // Changing the rounding mode:
+     fpctrl.rounding = FloatingPointControl.roundUp;
++    assert(rint(1.1) == 2);
+ 
+-    // The hardware exceptions will be disabled when leaving this scope.
++    // The set hardware exceptions will be disabled when leaving this scope.
+     // The original rounding mode will also be restored.
+-  }
++}
+ 
+- ----
++// Ensure previous values are returned:
++assert(!FloatingPointControl.enabledExceptions);
++assert(FloatingPointControl.rounding == FloatingPointControl.roundToNearest);
++assert(rint(1.1) == 1);
++----
+ 
+  */
+ struct FloatingPointControl
+@@ -2847,62 +3760,143 @@ struct FloatingPointControl
+     /** IEEE rounding modes.
+      * The default mode is roundToNearest.
+      */
+-    enum : RoundingMode
++    version(ARM)
++    {
++        enum : RoundingMode
++        {
++            roundToNearest = 0x000000,
++            roundDown      = 0x400000,
++            roundUp        = 0x800000,
++            roundToZero    = 0xC00000
++        }
++    }
++    else
+     {
+-        roundToNearest = 0x0000,
+-        roundDown      = 0x0400,
+-        roundUp        = 0x0800,
+-        roundToZero    = 0x0C00
+-    };
++        enum : RoundingMode
++        {
++            roundToNearest = 0x0000,
++            roundDown      = 0x0400,
++            roundUp        = 0x0800,
++            roundToZero    = 0x0C00
++        }
++    }
+ 
+     /** IEEE hardware exceptions.
+      *  By default, all exceptions are masked (disabled).
+      */
+-    enum : uint
++    version(ARM)
++    {
++        enum : uint
++        {
++            subnormalException    = 0x8000,
++            inexactException      = 0x1000,
++            underflowException    = 0x0800,
++            overflowException     = 0x0400,
++            divByZeroException    = 0x0200,
++            invalidException      = 0x0100,
++            /// Severe = The overflow, division by zero, and invalid exceptions.
++            severeExceptions   = overflowException | divByZeroException
++                                 | invalidException,
++            allExceptions      = severeExceptions | underflowException
++                                 | inexactException | subnormalException,
++        }
++    }
++    else
+     {
+-        inexactException      = 0x20,
+-        underflowException    = 0x10,
+-        overflowException     = 0x08,
+-        divByZeroException    = 0x04,
+-        subnormalException    = 0x02,
+-        invalidException      = 0x01,
+-        /// Severe = The overflow, division by zero, and invalid exceptions.
+-        severeExceptions   = overflowException | divByZeroException
+-                             | invalidException,
+-        allExceptions      = severeExceptions | underflowException
+-                             | inexactException | subnormalException,
+-    };
++        enum : uint
++        {
++            inexactException      = 0x20,
++            underflowException    = 0x10,
++            overflowException     = 0x08,
++            divByZeroException    = 0x04,
++            subnormalException    = 0x02,
++            invalidException      = 0x01,
++            /// Severe = The overflow, division by zero, and invalid exceptions.
++            severeExceptions   = overflowException | divByZeroException
++                                 | invalidException,
++            allExceptions      = severeExceptions | underflowException
++                                 | inexactException | subnormalException,
++        }
++    }
+ 
+ private:
+-    enum ushort EXCEPTION_MASK = 0x3F;
+-    enum ushort ROUNDING_MASK = 0xC00;
++    version(ARM)
++    {
++        enum uint EXCEPTION_MASK = 0x9F00;
++        enum uint ROUNDING_MASK = 0xC00000;
++    }
++    else version(X86)
++    {
++        enum ushort EXCEPTION_MASK = 0x3F;
++        enum ushort ROUNDING_MASK = 0xC00;
++    }
++    else version(X86_64)
++    {
++        enum ushort EXCEPTION_MASK = 0x3F;
++        enum ushort ROUNDING_MASK = 0xC00;
++    }
++    else
++        static assert(false, "Architecture not supported");
+ 
+ public:
++    /// Returns true if the current FPU supports exception trapping
++    @property static bool hasExceptionTraps() @safe nothrow
++    {
++        version(X86)
++            return true;
++        else version(X86_64)
++            return true;
++        else version(ARM)
++        {
++            auto oldState = getControlState();
++            // If exceptions are not supported, we set the bit but read it back as zero
++            // https://sourceware.org/ml/libc-ports/2012-06/msg00091.html
++            setControlState(oldState | (divByZeroException & EXCEPTION_MASK));
++            bool result = (getControlState() & EXCEPTION_MASK) != 0;
++            setControlState(oldState);
++            return result;
++        }
++        else
++            static assert(false, "Not implemented for this architecture");
++    }
++
+     /// Enable (unmask) specific hardware exceptions. Multiple exceptions may be ORed together.
+     void enableExceptions(uint exceptions)
+     {
++        assert(hasExceptionTraps);
+         initialize();
+-        setControlState(getControlState() & ~(exceptions & EXCEPTION_MASK));
++        version(ARM)
++            setControlState(getControlState() | (exceptions & EXCEPTION_MASK));
++        else
++            setControlState(getControlState() & ~(exceptions & EXCEPTION_MASK));
+     }
+ 
+     /// Disable (mask) specific hardware exceptions. Multiple exceptions may be ORed together.
+     void disableExceptions(uint exceptions)
+     {
++        assert(hasExceptionTraps);
+         initialize();
+-        setControlState(getControlState() | (exceptions & EXCEPTION_MASK));
++        version(ARM)
++            setControlState(getControlState() & ~(exceptions & EXCEPTION_MASK));
++        else
++            setControlState(getControlState() | (exceptions & EXCEPTION_MASK));
+     }
+ 
+     //// Change the floating-point hardware rounding mode
+     @property void rounding(RoundingMode newMode)
+     {
+-        ushort old = getControlState();
+-        setControlState((old & ~ROUNDING_MASK) | (newMode & ROUNDING_MASK));
++        initialize();
++        setControlState((getControlState() & ~ROUNDING_MASK) | (newMode & ROUNDING_MASK));
+     }
+ 
+     /// Return the exceptions which are currently enabled (unmasked)
+     @property static uint enabledExceptions()
+     {
+-        return (getControlState() & EXCEPTION_MASK) ^ EXCEPTION_MASK;
++        assert(hasExceptionTraps);
++        version(ARM)
++            return (getControlState() & EXCEPTION_MASK);
++        else
++            return (getControlState() & EXCEPTION_MASK) ^ EXCEPTION_MASK;
+     }
+ 
+     /// Return the currently active rounding mode
+@@ -2915,14 +3909,24 @@ public:
+     ~this()
+     {
+         clearExceptions();
+-        setControlState(savedState);
++        if (initialized)
++            setControlState(savedState);
+     }
+ 
+ private:
+-    ushort savedState;
++    ControlState savedState;
+ 
+     bool initialized = false;
+ 
++    version(ARM)
++    {
++        alias ControlState = uint;
++    }
++    else
++    {
++        alias ControlState = ushort;
++    }
++
+     void initialize()
+     {
+         // BUG: This works around the absence of this() constructors.
+@@ -2952,6 +3956,15 @@ private:
+             {
+                 "fclex;";
+             }
++            else version (ARM_SoftFloat)
++            {
++            }
++            else version (ARM)
++            {
++                uint old = getControlState();
++                old &= ~0b11111; // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0408i/Chdfifdc.html
++                asm {"vmsr FPSCR, %0;" : : "r" (old);} 
++            }
+             else
+                 assert(0, "Not yet supported");
+         }
+@@ -2960,7 +3973,7 @@ private:
+     }
+ 
+     // Read from the control register
+-    static ushort getControlState() @trusted nothrow
++    static ControlState getControlState() @trusted nothrow
+     {
+         version (D_InlineAsm_X86)
+         {
+@@ -2986,7 +3999,7 @@ private:
+         else
+         version (GNU)
+         {
+-            short cont;
++            ControlState cont;
+             version (X86) asm
+             {
+                 "xor %%eax, %%eax; fstcw %[cw];" : [cw] "=m" cont :: "eax";
+@@ -2995,12 +4008,14 @@ private:
+             {
+                 "xor %%rax, %%rax; fstcw %[cw];" : [cw] "=m" cont :: "rax";
+             }
+-            else version (ARM) asm
++            else version (ARM)
+             {
+-                "mrc p10, 7, %[cw], cr1, cr0, 0"
+-                :
+-                [cw] "=r" cont
+-                ;
++                version (ARM_SoftFloat)
++                   return 0;
++                else asm
++                {
++                    "vmrs %0, FPSCR;" : "=r" cont;
++                }
+             }
+             else
+                 assert(0, "Not yet supported");
+@@ -3011,7 +4026,7 @@ private:
+     }
+ 
+     // Set the control register
+-    static void setControlState(ushort newState) @trusted nothrow
++    static void setControlState(ControlState newState) @trusted nothrow
+     {
+         version (InlineAsm_X86_Any)
+         {
+@@ -3039,27 +4054,20 @@ private:
+         {
+             version (X86) asm
+             {
+-                "fclex; fldcw %[cw]"
+-                :
+-                :
+-                [cw] "m" newState
+-                ;
++                "fclex; fldcw %[cw]" : : [cw] "m" newState;
+             }
+             else version (X86_64) asm
+             {
+-                "fclex; fldcw %[cw]"
+-                :
+-                :
+-                [cw] "m" newState
+-                ;
++                "fclex; fldcw %[cw]" : : [cw] "m" newState;
+             }
+-            else version (ARM) asm
++            else version (ARM)
+             {
+-                "mcr p10, 7, %[cw], cr1, cr0, 0"
+-                :
+-                :
+-                [cw] "r" newState
+-                ;
++                version (ARM_SoftFloat)
++                   return;
++                else asm
++                {
++                    "vmsr FPSCR, %0;" : : "r" (newState);
++                }
+             }
+             else
+                 assert(0, "Not yet supported");
+@@ -3071,20 +4079,44 @@ private:
+ 
+ unittest
+ {
+-   {
++    //GCC floating point emulation doesn't allow changing
++    //rounding modes, getting error bits etc
++    version(GNU) version(D_SoftFloat)
++        return;
++
++    void ensureDefaults()
++    {
++        assert(FloatingPointControl.rounding
++               == FloatingPointControl.roundToNearest);
++        if(FloatingPointControl.hasExceptionTraps())
++            assert(FloatingPointControl.enabledExceptions == 0);
++    }
++
++    {
++        FloatingPointControl ctrl;
++    }
++    ensureDefaults();
++
++    {
++        FloatingPointControl ctrl;
++        ctrl.rounding = FloatingPointControl.roundDown;
++        assert(FloatingPointControl.rounding == FloatingPointControl.roundDown);
++    }
++    ensureDefaults();
++
++    if(FloatingPointControl.hasExceptionTraps)
++    {
+         FloatingPointControl ctrl;
+         ctrl.enableExceptions(FloatingPointControl.divByZeroException
+-                           | FloatingPointControl.overflowException);
++                              | FloatingPointControl.overflowException);
+         assert(ctrl.enabledExceptions ==
+-            (FloatingPointControl.divByZeroException
+-          | FloatingPointControl.overflowException));
++               (FloatingPointControl.divByZeroException
++                | FloatingPointControl.overflowException));
+ 
+         ctrl.rounding = FloatingPointControl.roundUp;
+         assert(FloatingPointControl.rounding == FloatingPointControl.roundUp);
+     }
+-    assert(FloatingPointControl.rounding
+-       == FloatingPointControl.roundToNearest);
+-    assert(FloatingPointControl.enabledExceptions ==0);
++    ensureDefaults();
+ }
+ 
+ 
+@@ -3287,7 +4319,7 @@ bool isInfinity(real x) @trusted pure no
+     {
+         // double
+         return ((*cast(ulong *)&x) & 0x7FFF_FFFF_FFFF_FFFF)
+-            == 0x7FF8_0000_0000_0000;
++            == 0x7FF0000000000000;
+     }
+     else static if(real.mant_dig == 106)
+     {
+@@ -3448,12 +4480,13 @@ real NaN(ulong payload) @trusted pure no
+ {
+     static if (real.mant_dig == 64)
+     {
+-        //real80
++        //real80 (in x86 real format, the implied bit is actually 
++        //not implied but a real bit which is stored in the real)
+         ulong v = 3; // implied bit = 1, quiet bit = 1
+     }
+     else
+     {
+-        ulong v = 2; // no implied bit. quiet bit = 1
++        ulong v = 1; // no implied bit. quiet bit = 1
+     }
+ 
+     ulong a = payload;
+@@ -3516,6 +4549,17 @@ real NaN(ulong payload) @trusted pure no
+     }
+ }
+ 
++unittest
++{
++    static if (real.mant_dig == 53)
++    {
++        auto x = NaN(1);
++        auto xl = *cast(ulong*)&x;
++        assert(xl & 0x8_0000_0000_0000UL); //non-signaling bit, bit 52
++        assert((xl & 0x7FF0_0000_0000_0000UL) == 0x7FF0_0000_0000_0000UL); //all exp bits set
++    }
++}
++
+ /**
+  * Extract an integral payload from a $(NAN).
+  *
+@@ -3703,7 +4747,11 @@ real nextUp(real x) @trusted pure nothro
+             }
+         }
+         return x;
+-    } // doubledouble is not supported
++    }
++    else // static if (real.mant_dig==106) // real is doubledouble
++    {
++        assert (0, "nextUp not implemented");
++    }
+ }
+ 
+ /** ditto */
+@@ -4015,13 +5063,17 @@ unittest
+     {
+         pragma(msg, "test disabled on x86_64, see bug 5628");
+     }
++    else version(ARM)
++    {
++        pragma(msg, "test disabled on ARM, see bug 5628");
++    }
+     else
+     {
+         assert(pow(xd, neg2) == 1 / (x * x));
+         assert(pow(xf, neg8) == 1 / ((x * x) * (x * x) * (x * x) * (x * x)));
+     }
+ 
+-    assert(pow(x, neg3) == 1 / (x * x * x));
++    assert(feqrel(pow(x, neg3),  1 / (x * x * x)) >= real.mant_dig - 1);
+ }
+ 
+ unittest
+@@ -4148,13 +5200,18 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+ 
+     static real impl(real x, real y) pure nothrow
+     {
++        // Special cases.
+         if (isNaN(y))
+             return y;
++        if (isNaN(x) && y != 0.0)
++            return x;
+ 
+-        if (y == 0)
+-            return 1;           // even if x is $(NAN)
+-        if (isNaN(x) && y != 0)
++        // Even if x is NaN.
++        if (y == 0.0)
++            return 1.0;
++        if (y == 1.0)
+             return x;
++
+         if (isInfinity(y))
+         {
+             if (fabs(x) > 1)
+@@ -4179,17 +5236,16 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+         if (isInfinity(x))
+         {
+             if (signbit(x))
+-            {   long i;
+-
+-                i = cast(long)y;
+-                if (y > 0)
++            {
++                long i = cast(long)y;
++                if (y > 0.0)
+                 {
+                     if (i == y && i & 1)
+                         return -F.infinity;
+                     else
+                         return F.infinity;
+                 }
+-                else if (y < 0)
++                else if (y < 0.0)
+                 {
+                     if (i == y && i & 1)
+                         return -0.0;
+@@ -4199,9 +5255,9 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+             }
+             else
+             {
+-                if (y > 0)
++                if (y > 0.0)
+                     return F.infinity;
+-                else if (y < 0)
++                else if (y < 0.0)
+                     return +0.0;
+             }
+         }
+@@ -4209,17 +5265,16 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+         if (x == 0.0)
+         {
+             if (signbit(x))
+-            {   long i;
+-
+-                i = cast(long)y;
+-                if (y > 0)
++            {
++                long i = cast(long)y;
++                if (y > 0.0)
+                 {
+                     if (i == y && i & 1)
+                         return -0.0;
+                     else
+                         return +0.0;
+                 }
+-                else if (y < 0)
++                else if (y < 0.0)
+                 {
+                     if (i == y && i & 1)
+                         return -F.infinity;
+@@ -4229,12 +5284,61 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+             }
+             else
+             {
+-                if (y > 0)
++                if (y > 0.0)
+                     return +0.0;
+-                else if (y < 0)
++                else if (y < 0.0)
++                    return F.infinity;
++            }
++        }
++        if (x == 1.0)
++            return 1.0;
++
++        if (y >= F.max)
++        {
++            if ((x > 0.0 && x < 1.0) || (x > -1.0 && x < 0.0))
++                return 0.0;
++            if (x > 1.0 || x < -1.0)
++                return F.infinity;
++        }
++        if (y <= -F.max)
++        {
++            if ((x > 0.0 && x < 1.0) || (x > -1.0 && x < 0.0))
++                return F.infinity;
++            if (x > 1.0 || x < -1.0)
++                return 0.0;
++        }
++
++        if (x >= F.max)
++        {
++            if (y > 0.0)
++                return F.infinity;
++            else
++                return 0.0;
++        }
++        if (x <= -F.max)
++        {
++            long i = cast(long)y;
++            if (y > 0.0)
++            {
++                if (i == y && i & 1)
++                    return -F.infinity;
++                else
+                     return F.infinity;
+             }
++            else if (y < 0.0)
++            {
++                if (i == y && i & 1)
++                    return -0.0;
++                else
++                    return +0.0;
++            }
+         }
++
++        // Integer power of x.
++        long iy = cast(long)y;
++        if (iy == y && fabs(y) < 32768.0)
++            return pow(x, iy);
++
+         double sign = 1.0;
+         if (x < 0)
+         {
+@@ -4260,7 +5364,13 @@ Unqual!(Largest!(F, G)) pow(F, G)(F x, G
+         }
+         else
+         {
+-            return sign * core.stdc.math.powl(x, y);
++            // If x > 0, x ^^ y == 2 ^^ ( y * log2(x) )
++            // TODO: This is not accurate in practice. A fast and accurate
++            // (though complicated) method is described in:
++            // "An efficient rounding boundary test for pow(x, y)
++            // in double precision", C.Q. Lauter and V. Lefèvre, INRIA (2007).
++            Float w = exp2(y * log2(x));
++            return sign * w;
+         }
+     }
+     return impl(x, y);
+@@ -4476,7 +5586,10 @@ unittest
+     }
+ 
+     assert(feqrel(7.1824L, 7.1824L) == real.mant_dig);
+-    assert(feqrel(real.min_normal / 8, real.min_normal / 17) == 3);
++    static if(real.mant_dig == 64)
++    {
++        assert(feqrel(real.min_normal / 8, real.min_normal / 17) == 3);
++    }
+ 
+     testFeqrel!(real)();
+     testFeqrel!(double)();
+@@ -4638,6 +5751,7 @@ public:
+  * Uses Horner's rule A(x) = $(SUB a, 0) + x($(SUB a, 1) + x($(SUB a, 2)
+  *                         + x($(SUB a, 3) + ...)))
+  * Params:
++ *      x =     the value to evaluate.
+  *      A =     array of coefficients $(SUB a, 0), $(SUB a, 1), etc.
+  */
+ real poly(real x, const real[] A) @trusted pure nothrow
+@@ -4784,7 +5898,7 @@ unittest
+ {
+     debug (math) printf("math.poly.unittest\n");
+     real x = 3.1;
+-    static real pp[] = [56.1, 32.7, 6];
++    static real[] pp = [56.1, 32.7, 6];
+ 
+     assert( poly(x, pp) == (56.1L + (32.7L + 6L * x) * x) );
+ }
+@@ -4968,3 +6082,10 @@ unittest
+     real r = tan(-2.0L);
+     assert(fabs(r - 2.18504f) < .00001);
+ }
++
++pure @safe nothrow unittest
++{
++    // issue 6381: floor/ceil should be usable in pure function.
++    auto x = floor(1.2);
++    auto y = ceil(1.2);
++}
+--- a/src/libphobos/src/std/md5.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/md5.d	2014-04-01 16:32:51.000000000 +0100
+@@ -6,7 +6,7 @@
+ 
+ /**
+  * $(RED Scheduled for deprecation. Please use std.digest.md instead.)
+- * 
++ *
+  * Computes MD5 digests of arbitrary data. MD5 digests are 16 byte quantities that are like a checksum or crc, but are more robust.
+  *
+  * There are two ways to do this. The first does it all in one function call to
+@@ -88,6 +88,7 @@ pragma(msg, "std.md5 is scheduled for de
+ //debug=md5;            // uncomment to turn on debugging printf's
+ 
+ import std.ascii;
++import std.bitmanip;
+ import std.string;
+ import std.exception;
+ debug(md5) import std.c.stdio : printf;
+@@ -163,7 +164,10 @@ unittest
+     string a = "Mary has ", b = "a little lamb";
+     int[] c = [ 1, 2, 3, 4, 5 ];
+     string d = getDigestString(a, b, c);
+-    assert(d == "F36625A66B2A8D9F47270C00C8BEFD2F", d);
++    version(LittleEndian)
++        assert(d == "F36625A66B2A8D9F47270C00C8BEFD2F", d);
++    else
++        assert(d == "2656D2008FF10DAE4B0783E6E0171655", d);
+ }
+ 
+ /**
+@@ -173,12 +177,14 @@ unittest
+  */
+ struct MD5_CTX
+ {
+-    uint state[4] =                                   /* state (ABCD) */
++    private import core.stdc.string : memcpy, memset;
++
++    uint[4] state =                                   /* state (ABCD) */
+     /* magic initialization constants */
+     [0x67452301,0xefcdab89,0x98badcfe,0x10325476];
+ 
+     ulong count;        /* number of bits, modulo 2^64 */
+-    ubyte buffer[64];   /* input buffer */
++    ubyte[64] buffer;   /* input buffer */
+ 
+     static ubyte[64] PADDING =
+     [
+@@ -211,28 +217,28 @@ struct MD5_CTX
+      */
+     static void FF(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac)
+     {
+-        a += F (b, c, d) + x + cast(uint)(ac);
++        a += F (b, c, d) + x + ac;
+         a = ROTATE_LEFT (a, s);
+         a += b;
+     }
+ 
+     static void GG(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac)
+     {
+-        a += G (b, c, d) + x + cast(uint)(ac);
++        a += G (b, c, d) + x + ac;
+         a = ROTATE_LEFT (a, s);
+         a += b;
+     }
+ 
+     static void HH(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac)
+     {
+-        a += H (b, c, d) + x + cast(uint)(ac);
++        a += H (b, c, d) + x + ac;
+         a = ROTATE_LEFT (a, s);
+         a += b;
+     }
+ 
+     static void II(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac)
+     {
+-        a += I (b, c, d) + x + cast(uint)(ac);
++        a += I (b, c, d) + x + ac;
+         a = ROTATE_LEFT (a, s);
+         a += b;
+     }
+@@ -265,7 +271,7 @@ struct MD5_CTX
+       /* Transform as many times as possible. */
+       if (inputLen >= partLen)
+       {
+-            std.c.string.memcpy(&buffer[index], input.ptr, partLen);
++            core.stdc.string.memcpy(&buffer[index], input.ptr, partLen);
+             transform (buffer.ptr);
+ 
+             for (i = partLen; i + 63 < inputLen; i += 64)
+@@ -278,7 +284,7 @@ struct MD5_CTX
+ 
+       /* Buffer remaining input */
+       if (inputLen - i)
+-            std.c.string.memcpy(&buffer[index], &input[i], inputLen-i);
++            core.stdc.string.memcpy(&buffer[index], &input[i], inputLen-i);
+     }
+ 
+     /** MD5 finalization. Ends an MD5 message-digest operation, writing the
+@@ -286,11 +292,11 @@ struct MD5_CTX
+      */
+     void finish(ref ubyte[16] digest)         /* message digest */
+     {
+-      ubyte bits[8] = void;
++      ubyte[8] bits = void;
+       uint index, padLen;
+ 
+       /* Save number of bits */
+-      Encode (bits.ptr, cast(const uint*) &count, 8);
++      bits[0 .. 8] = nativeToLittleEndian(count)[];
+ 
+       /* Pad out to 56 mod 64. */
+       index = (cast(uint)count >> 3) & (64 - 1);
+@@ -301,10 +307,13 @@ struct MD5_CTX
+       update (bits);
+ 
+       /* Store state in digest */
+-      Encode (digest.ptr, state.ptr, 16);
++      digest[0 .. 4]   = nativeToLittleEndian(state[0])[];
++      digest[4 .. 8]   = nativeToLittleEndian(state[1])[];
++      digest[8 .. 12]  = nativeToLittleEndian(state[2])[];
++      digest[12 .. 16] = nativeToLittleEndian(state[3])[];
+ 
+       /* Zeroize sensitive information. */
+-      std.c.string.memset (&this, 0, MD5_CTX.sizeof);
++      core.stdc.string.memset (&this, 0, MD5_CTX.sizeof);
+     }
+ 
+     /* MD5 basic transformation. Transforms state based on block.
+@@ -339,7 +348,17 @@ struct MD5_CTX
+            d = state[3];
+       uint[16] x = void;
+ 
+-      Decode (x.ptr, block, 64);
++      version(BigEndian)
++      {
++          for(size_t i = 0; i < 16; i++)
++          {
++              x[i] = littleEndianToNative!uint(*cast(ubyte[4]*)&block[i*4]);
++          }
++      }
++      else
++      {
++          (cast(ubyte*)x.ptr)[0 .. 64] = block[0 .. 64];
++      }
+ 
+       /* Round 1 */
+       FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+@@ -421,46 +440,6 @@ struct MD5_CTX
+       /* Zeroize sensitive information. */
+       x[] = 0;
+     }
+-
+-    /* Encodes input (uint) into output (ubyte). Assumes len is
+-      a multiple of 4.
+-     */
+-    private static void Encode (ubyte *output, const uint *input, uint len)
+-    {
+-        version (BigEndian)
+-        {
+-            uint i, j;
+-
+-            for (i = 0, j = 0; j < len; i++, j += 4)
+-            {
+-                *cast(uint *) &output[j] = core.bitop.bswap(input[i]);
+-            }
+-        }
+-        else
+-        {
+-            (cast(uint *)output)[0..len/4] = input[0..len/4];
+-        }
+-    }
+-
+-    /* Decodes input (ubyte) into output (uint). Assumes len is
+-      a multiple of 4.
+-     */
+-    private static void Decode (uint *output, const ubyte *input, uint len)
+-    {
+-        version (BigEndian)
+-        {
+-            uint i, j;
+-
+-            for (i = 0, j = 0; j < len; i++, j += 4)
+-            {
+-                output[i] = core.bitop.bswap(*cast(uint*)&input[j]);
+-            }
+-        }
+-        else
+-        {
+-            output[0..len/4] = (cast(const uint *)input)[0..len/4];
+-        }
+-    }
+ }
+ 
+ unittest
+--- a/src/libphobos/src/std/metastrings.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/metastrings.d	2014-04-01 16:32:51.000000000 +0100
+@@ -1,26 +1,30 @@
+ // Written in the D programming language.
+ 
+ /**
++$(RED Deprecated. It will be removed in March 2014.
++      Please use $(XREF string, format), $(XREF conv, to), or
++      $(XREF conv, parse) instead of these templates (which one would depend on
++      which template is being replaced.) They now work in CTFE, and these
++      templates are very inefficient.)
++
+ Templates with which to do compile-time manipulation of strings.
+ 
+ Macros:
+  WIKI = Phobos/StdMetastrings
+ 
+-Copyright: Copyright Digital Mars 2007 - 2009.
++Copyright: Copyright Digital Mars 2007 - 2013.
+ License:   Boost License 1.0.
+ Authors:   $(WEB digitalmars.com, Walter Bright),
+            Don Clugston
+ Source:    $(PHOBOSSRC std/_metastrings.d)
+ */
+-/*
+-         Copyright Digital Mars 2007 - 2009.
+-Distributed under the Boost Software License, Version 1.0.
+-   (See accompanying file LICENSE_1_0.txt or copy at
+-         http://www.boost.org/LICENSE_1_0.txt)
+- */
+ module std.metastrings;
+ 
+ /**
++$(RED Deprecated.
++     Please use $(XREF string, format) instead. It now works in CTFE,
++     and this template is very inefficient.)
++
+ Formats constants into a string at compile time.  Analogous to $(XREF
+ string,format).
+ 
+@@ -45,6 +49,7 @@ void main()
+  * ---
+  */
+ 
++deprecated("std.string.format now works in CTFE. Please use it instead.")
+ template Format(A...)
+ {
+     static if (A.length == 0)
+@@ -55,6 +60,7 @@ template Format(A...)
+         enum Format = toStringNow!(A[0]) ~ Format!(A[1..$]);
+ }
+ 
++deprecated("std.string.format now works in CTFE. Please use it instead.")
+ template FormatString(const(char)[] F, A...)
+ {
+     static if (F.length == 0)
+@@ -80,9 +86,14 @@ unittest
+ }
+ 
+ /**
++ * $(RED Deprecated.
++ *       Please use $(XREF conv, format) instead. It now works in CTFE,
++ *       and this template is very inefficient.)
++ *
+  * Convert constant argument to a string.
+  */
+ 
++deprecated("std.conv.to now works in CTFE. Please use it instead.")
+ template toStringNow(ulong v)
+ {
+     static if (v < 10)
+@@ -97,6 +108,7 @@ unittest
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(long v)
+ {
+     static if (v < 0)
+@@ -112,30 +124,35 @@ unittest
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(uint U)
+ {
+     enum toStringNow = toStringNow!(cast(ulong)U);
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(int I)
+ {
+     enum toStringNow = toStringNow!(cast(long)I);
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(bool B)
+ {
+     enum toStringNow = B ? "true" : "false";
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(string S)
+ {
+     enum toStringNow = S;
+ }
+ 
+ /// ditto
++deprecated("std.conv.to!string now works in CTFE. Please use it instead.")
+ template toStringNow(char C)
+ {
+     enum toStringNow = "" ~ C;
+@@ -143,6 +160,10 @@ template toStringNow(char C)
+ 
+ 
+ /********
++ * $(RED Deprecated.
++ *       Please use $(XREF conv, parse) instead. It now works in CTFE,
++ *       and this template is very inefficient.)
++ *
+  * Parse unsigned integer literal from the start of string s.
+  * returns:
+  *    .value = the integer literal as a string,
+@@ -152,6 +173,7 @@ template toStringNow(char C)
+  *    .rest = s
+  */
+ 
++deprecated("to!string(std.conv.parse!uint(value)) now works in CTFE. Please use it instead.")
+ template parseUinteger(const(char)[] s)
+ {
+     static if (s.length == 0)
+@@ -172,6 +194,10 @@ template parseUinteger(const(char)[] s)
+ }
+ 
+ /********
++$(RED Deprecated.
++      Please use $(XREF conv, parse) instead. It now works in CTFE,
++      and this template is very inefficient.)
++
+ Parse integer literal optionally preceded by $(D '-') from the start
+ of string $(D s).
+ 
+@@ -184,6 +210,7 @@ Otherwise:
+    .rest = s
+ */
+ 
++deprecated("to!string(std.conv.parse!int(value)) now works in CTFE. Please use it instead.")
+ template parseInteger(const(char)[] s)
+ {
+     static if (s.length == 0)
+--- a/src/libphobos/src/std/net/curl.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/net/curl.d	2014-04-01 16:32:51.000000000 +0100
+@@ -396,9 +396,9 @@ unittest
+  *
+  * Params:
+  * url = resource to post to
+- * putData = data to send as the body of the request. An array
+- *           of an arbitrary type is accepted and will be cast to ubyte[]
+- *           before sending it.
++ * postData = data to send as the body of the request. An array
++ *            of an arbitrary type is accepted and will be cast to ubyte[]
++ *            before sending it.
+  * conn = connection to use e.g. FTP or HTTP. The default AutoProtocol will
+  *        guess connection type and create a new instance for this call only.
+  *
+@@ -708,6 +708,13 @@ private auto _basicHTTP(T)(const(char)[]
+         client.onReceiveHeader = null;
+         client.onReceiveStatusLine = null;
+         client.onReceive = null;
++
++        if (sendData !is null &&
++            (client.method == HTTP.Method.post || client.method == HTTP.Method.put))
++        {
++            client.onSend = null;
++            client.handle.onSeek = null;
++        }
+     }
+     client.url = url;
+     HTTP.StatusLine statusLine;
+@@ -786,7 +793,12 @@ private auto _basicHTTP(T)(const(char)[]
+  */
+ private auto _basicFTP(T)(const(char)[] url, const(void)[] sendData, FTP client)
+ {
+-    scope (exit) client.onReceive = null;
++    scope (exit)
++    {
++        client.onReceive = null;
++        if (!sendData.empty)
++            client.onSend = null;
++    }
+ 
+     ubyte[] content;
+ 
+@@ -894,7 +906,6 @@ struct ByLineBuffer(Char)
+  *
+  * Params:
+  * url = The url to receive content from
+- * postData = Data to HTTP Post
+  * keepTerminator = KeepTerminator.yes signals that the line terminator should be
+  *                  returned as part of the lines in the range.
+  * terminator = The character that terminates a line
+@@ -1433,7 +1444,6 @@ static struct AsyncChunkInputRange
+  * Params:
+  * url = The url to receive content from
+  * postData = Data to HTTP Post
+- * terminator = The character that terminates a line
+  * chunkSize = The size of the chunks
+  * transmitBuffers = The number of chunks buffered asynchronously
+  * conn = The connection to use e.g. HTTP or FTP.
+@@ -2035,6 +2045,61 @@ struct HTTP
+ 
+         /// The HTTP method to use.
+         Method method = Method.undefined;
++
++        @property void onReceiveHeader(void delegate(in char[] key,
++                                                     in char[] value) callback)
++        {
++            // Wrap incoming callback in order to separate http status line from
++            // http headers.  On redirected requests there may be several such
++            // status lines. The last one is the one recorded.
++            auto dg = (in char[] header)
++            {
++                if (header.empty)
++                {
++                    // header delimiter
++                    return;
++                }
++                if (header.startsWith("HTTP/"))
++                {
++                    string[string] empty;
++                    headersIn = empty; // clear
++
++                    auto m = match(header, regex(r"^HTTP/(\d+)\.(\d+) (\d+) (.*)$"));
++                    if (m.empty)
++                    {
++                        // Invalid status line
++                    }
++                    else
++                    {
++                        status.majorVersion = to!ushort(m.captures[1]);
++                        status.minorVersion = to!ushort(m.captures[2]);
++                        status.code = to!ushort(m.captures[3]);
++                        status.reason = m.captures[4].idup;
++                        if (onReceiveStatusLine != null)
++                            onReceiveStatusLine(status);
++                    }
++                    return;
++                }
++
++                // Normal http header
++                auto m = match(cast(char[]) header, regex("(.*?): (.*)$"));
++
++                auto fieldName = m.captures[1].toLower().idup;
++                if (fieldName == "content-type")
++                {
++                    auto mct = match(cast(char[]) m.captures[2],
++                                     regex("charset=([^;]*)"));
++                    if (!mct.empty && mct.captures.length > 1)
++                        charset = mct.captures[1].idup;
++                }
++
++                if (!m.empty && callback !is null)
++                    callback(fieldName, m.captures[2]);
++                headersIn[fieldName] = m.captures[2].idup;
++            };
++
++            curl.onReceiveHeader = dg;
++        }
+     }
+ 
+     private RefCounted!Impl p;
+@@ -2551,55 +2616,7 @@ struct HTTP
+     @property void onReceiveHeader(void delegate(in char[] key,
+                                                  in char[] value) callback)
+     {
+-        // Wrap incoming callback in order to separate http status line from
+-        // http headers.  On redirected requests there may be several such
+-        // status lines. The last one is the one recorded.
+-        auto dg = (in char[] header)
+-        {
+-            if (header.empty)
+-            {
+-                // header delimiter
+-                return;
+-            }
+-            if (header.startsWith("HTTP/"))
+-            {
+-                string[string] empty;
+-                p.headersIn = empty; // clear
+-
+-                auto m = match(header, regex(r"^HTTP/(\d+)\.(\d+) (\d+) (.*)$"));
+-                if (m.empty)
+-                {
+-                    // Invalid status line
+-                }
+-                else
+-                {
+-                    p.status.majorVersion = to!ushort(m.captures[1]);
+-                    p.status.minorVersion = to!ushort(m.captures[2]);
+-                    p.status.code = to!ushort(m.captures[3]);
+-                    p.status.reason = m.captures[4].idup;
+-                    if (p.onReceiveStatusLine != null)
+-                        p.onReceiveStatusLine(p.status);
+-                }
+-                return;
+-            }
+-
+-            // Normal http header
+-            auto m = match(cast(char[]) header, regex("(.*?): (.*)$"));
+-
+-            auto fieldName = m.captures[1].toLower().idup;
+-            if (fieldName == "content-type")
+-            {
+-                auto mct = match(cast(char[]) m.captures[2],
+-                                 regex("charset=([^;]*)"));
+-                if (!mct.empty && mct.captures.length > 1)
+-                    p.charset = mct.captures[1].idup;
+-            }
+-
+-            if (!m.empty && callback !is null)
+-                callback(fieldName, m.captures[2]);
+-            p.headersIn[fieldName] = m.captures[2].idup;
+-        };
+-        p.curl.onReceiveHeader = dg;
++        p.onReceiveHeader = callback;
+     }
+ 
+     /**
+@@ -3060,6 +3077,23 @@ struct SMTP
+                 curl.shutdown();
+         }
+         Curl curl;
++
++        @property void message(string msg)
++        {
++            auto _message = msg;
++            /**
++                This delegate reads the message text and copies it.
++            */
++            curl.onSend = delegate size_t(void[] data)
++            {
++                if (!msg.length) return 0;
++                auto m = cast(void[])msg;
++                size_t to_copy = min(data.length, _message.length);
++                data[0..to_copy] = (cast(void[])_message)[0..to_copy];
++                _message = _message[to_copy..$];
++                return to_copy;
++            };
++        }
+     }
+ 
+     private RefCounted!Impl p;
+@@ -3329,19 +3363,7 @@ struct SMTP
+ 
+     @property void message(string msg)
+     {
+-        auto _message = msg;
+-        /**
+-            This delegate reads the message text and copies it.
+-        */
+-        p.curl.onSend = delegate size_t(void[] data)
+-        {
+-            if (!msg.length) return 0;
+-            auto m = cast(void[])msg;
+-            size_t to_copy = min(data.length, _message.length);
+-            data[0..to_copy] = (cast(void[])_message)[0..to_copy];
+-            _message = _message[to_copy..$];
+-            return to_copy;
+-        };
++        p.message = msg;
+     }
+ }
+ 
+@@ -3357,6 +3379,7 @@ class CurlException : Exception
+             line = The line number where the exception occurred.
+             next = The previous exception in the chain of exceptions, if any.
+       +/
++    @safe pure nothrow
+     this(string msg,
+          string file = __FILE__,
+          size_t line = __LINE__,
+@@ -3378,6 +3401,7 @@ class CurlTimeoutException : CurlExcepti
+             line = The line number where the exception occurred.
+             next = The previous exception in the chain of exceptions, if any.
+       +/
++    @safe pure nothrow
+     this(string msg,
+          string file = __FILE__,
+          size_t line = __LINE__,
+@@ -3394,6 +3418,11 @@ alias CURLcode CurlCode;
+   Wrapper to provide a better interface to libcurl than using the plain C API.
+   It is recommended to use the $(D HTTP)/$(D FTP) etc. structs instead unless
+   raw access to libcurl is needed.
++
++  Warning: This struct uses interior pointers for callbacks. Only allocate it
++  on the stack if you never move or copy it. This also means passing by reference
++  when passing Curl to other functions. Otherwise always allocate on
++  the heap. 
+ */
+ struct Curl
+ {
+@@ -3507,6 +3536,8 @@ struct Curl
+ 
+     private string errorString(CurlCode code)
+     {
++        import core.stdc.string : strlen;
++
+         auto msgZ = curl_easy_strerror(code);
+         // doing the following (instead of just using std.conv.to!string) avoids 1 allocation
+         return format("%s on handle %s", msgZ[0 .. core.stdc.string.strlen(msgZ)], handle);
+--- a/src/libphobos/src/std/net/isemail.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/net/isemail.d	2014-04-01 16:32:51.000000000 +0100
+@@ -69,6 +69,7 @@ EmailStatus isEmail (Char) (const(Char)[
+ {
+     alias const(Char)[] tstring;
+ 
++    enum defaultThreshold = 16;
+     int threshold;
+     bool diagnose;
+ 
+@@ -84,7 +85,7 @@ EmailStatus isEmail (Char) (const(Char)[
+ 
+         switch (errorLevel)
+         {
+-            case EmailStatusCode.warning: threshold = threshold; break;
++            case EmailStatusCode.warning: threshold = defaultThreshold; break;
+             case EmailStatusCode.error: threshold = EmailStatusCode.valid; break;
+             default: threshold = errorLevel;
+         }
+@@ -734,7 +735,7 @@ EmailStatus isEmail (Char) (const(Char)[
+             returnStatus ~= EmailStatusCode.rfc5321TopLevelDomainNumeric;
+     }
+ 
+-    returnStatus = array(std.algorithm.uniq(returnStatus));
++    returnStatus = array(uniq(returnStatus));
+     auto finalStatus = returnStatus.max();
+ 
+     if (returnStatus.length != 1)
+@@ -914,86 +915,77 @@ unittest
+         EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322LocalTooLong,
+         `Quoted pair is still part of the length restriction`);
+ 
+-    // assert(`test@[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5321AddressLiteral); // std.regex bug: *+? not allowed in atom
++    assert(`test@[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5321AddressLiteral);
+ 
+-    // assert(`test@a[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.errorExpectingText);
+-    //
+-    // assert(`test@[255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[255.255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[255.255.255.256]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[1111:2222:3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322IpV6GroupCount); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode
+-    //     == EmailStatusCode.rfc5321AddressLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6BadChar);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::8888]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321IpV6Deprecated);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555::8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5321AddressLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6MaxGroups);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6::3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322IpV6ColonStart); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:::3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5321AddressLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111::4444:5555::8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322IpV6TooManyDoubleColons); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:::]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5321AddressLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321AddressLiteral);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444::255.255.255.255]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321AddressLiteral);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]`.isEmail(CheckDns.no,
+-    //     EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6MaxGroups);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6:1111:2222:3333:4444:::255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode
+-    //     == EmailStatusCode.rfc5322IpV6TooManyDoubleColons); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[IPv6::255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322IpV6ColonStart); // std.regex bug: *+? not allowed in atom
++    assert(`test@a[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.errorExpectingText);
++
++    assert(`test@[255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
++
++    assert(`test@[255.255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
++
++    assert(`test@[255.255.255.256]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
++
++    assert(`test@[1111:2222:3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322IpV6GroupCount);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode
++        == EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6BadChar);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::8888]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321IpV6Deprecated);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555::8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6MaxGroups);
++
++    assert(`test@[IPv6::3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322IpV6ColonStart);
++
++    assert(`test@[IPv6:::3333:4444:5555:6666:7777:8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111::4444:5555::8888]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322IpV6TooManyDoubleColons);
++
++    assert(`test@[IPv6:::]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6GroupCount);
++
++    assert(`test@[IPv6:1111:2222:3333:4444::255.255.255.255]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5321AddressLiteral);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]`.isEmail(CheckDns.no,
++        EmailStatusCode.any).statusCode == EmailStatusCode.rfc5322IpV6MaxGroups);
++
++    assert(`test@[IPv6:1111:2222:3333:4444:::255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode
++        == EmailStatusCode.rfc5322IpV6TooManyDoubleColons);
++
++    assert(`test@[IPv6::255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322IpV6ColonStart);
+ 
+     assert(` test @iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+         EmailStatusCode.deprecatedCommentFoldingWhitespaceNearAt);
+@@ -1024,8 +1016,8 @@ unittest
+     assert(`test(comment)test@iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+         EmailStatusCode.errorTextAfterCommentFoldingWhitespace);
+ 
+-    // assert(`test@(comment)[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.deprecatedCommentFoldingWhitespaceNearAt); // std.regex bug: *+? not allowed in atom
++    assert(`test@(comment)[255.255.255.255]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.deprecatedCommentFoldingWhitespaceNearAt);
+ 
+     assert(`(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org`.isEmail(CheckDns.no,
+         EmailStatusCode.any).statusCode == EmailStatusCode.comment);
+@@ -1077,46 +1069,44 @@ unittest
+     assert(`test@iana.org(comment\`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+         EmailStatusCode.errorBackslashEnd);
+ 
+-    // assert(`test@[RFC-5322-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322]-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.errorTextAfterDomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322-[domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.errorExpectingDomainText); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert("test@[RFC-5322-\\\u0007-domain-literal]".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteralObsoleteText, `obs-dtext and obs-qp`);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert("test@[RFC-5322-\\\u0009-domain-literal]".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteralObsoleteText); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322-\]-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteralObsoleteText); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322-domain-literal\]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.errorUnclosedDomainLiteral); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322-domain-literal\`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.errorBackslashEnd); // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC 5322 domain literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral, `Spaces are FWS in a domain literal`);
+-        // std.regex bug: *+? not allowed in atom
+-    //
+-    // assert(`test@[RFC-5322-domain-literal] (comment)`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322DomainLiteral); // std.regex bug: *+? not allowed in atom
++    assert(`test@[RFC-5322-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
+ 
+-    assert(`@iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.errorExpectingText);
+-    assert(`test@.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.errorExpectingText);
+-    assert(`""@iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.deprecatedQuotedText);
++    assert(`test@[RFC-5322]-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.errorTextAfterDomainLiteral);
+ 
+-    assert(`"\"@iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++    assert(`test@[RFC-5322-[domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.errorExpectingDomainText);
++
++    assert("test@[RFC-5322-\\\u0007-domain-literal]".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteralObsoleteText, `obs-dtext and obs-qp`);
++
++    assert("test@[RFC-5322-\\\u0009-domain-literal]".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteralObsoleteText);
++
++    assert(`test@[RFC-5322-\]-domain-literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteralObsoleteText);
++
++    assert(`test@[RFC-5322-domain-literal\]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.errorUnclosedDomainLiteral);
++
++    assert(`test@[RFC-5322-domain-literal\`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.errorBackslashEnd);
++
++    assert(`test@[RFC 5322 domain literal]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral, `Spaces are FWS in a domain literal`);
++
++    assert(`test@[RFC-5322-domain-literal] (comment)`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322DomainLiteral);
++
++    assert("\u007F@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.errorExpectingText);
++    assert("test@\u007F.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.errorExpectingText);
++    assert("\"\u007F\"@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.deprecatedQuotedText);
++
++    assert("\"\\\u007F\"@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+             EmailStatusCode.deprecatedQuotedPair);
+ 
+-    assert(`()test@iana.org`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++    assert("(\u007F)test@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+         EmailStatusCode.deprecatedCommentText);
+ 
+     assert("test@iana.org\u000D".isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.errorCrNoLf,
+@@ -1216,8 +1206,8 @@ unittest
+     assert(" test@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.foldingWhitespace);
+     assert(`test@iana.org `.isEmail(CheckDns.no, EmailStatusCode.any).statusCode == EmailStatusCode.foldingWhitespace);
+ 
+-    // assert(`test@[IPv6:1::2:]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+-    //     EmailStatusCode.rfc5322IpV6ColonEnd); // std.regex bug: *+? not allowed in atom
++    assert(`test@[IPv6:1::2:]`.isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
++        EmailStatusCode.rfc5322IpV6ColonEnd);
+ 
+     assert("\"test\\\u00A9\"@iana.org".isEmail(CheckDns.no, EmailStatusCode.any).statusCode ==
+         EmailStatusCode.errorExpectingQuotedPair);
+@@ -1681,8 +1671,6 @@ enum EmailStatusCode
+ 
+ private:
+ 
+-enum threshold = 16;
+-
+ // Email parts for the isEmail function
+ enum EmailPart
+ {
+@@ -1751,6 +1739,8 @@ enum AsciiToken
+  */
+ T max (T) (T[] arr)
+ {
++    import std.algorithm/* : max*/;
++
+     auto max = arr.front;
+ 
+     foreach (i ; 0 .. arr.length - 1)
+@@ -1823,7 +1813,6 @@ T[] substr (T) (T[] str, ptrdiff_t start
+             end = str.length + end;
+         }
+ 
+-
+         else
+             end = start + end;
+     }
+@@ -1835,11 +1824,17 @@ T[] substr (T) (T[] str, ptrdiff_t start
+ 
+         if (end < 0)
+             end = str.length + end;
++
++        else
++            end = start + end;
+     }
+ 
+     if (start > end)
+         end = start;
+ 
++    if (end > str.length)
++        end = str.length;
++
+     return str[start .. end];
+ }
+ 
+@@ -1852,6 +1847,8 @@ unittest
+     assert("abcdef".substr(2, -1) == "cde");
+     assert("abcdef".substr(4, -4) == []);
+     assert("abcdef".substr(-3, -1) == "de");
++    assert("abcdef".substr(1, 1) == "b");
++    assert("abcdef".substr(-1, -1) == []);
+ }
+ 
+ /*
+--- a/src/libphobos/src/std/numeric.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/numeric.d	2014-04-01 16:32:51.000000000 +0100
+@@ -1318,11 +1318,7 @@ unittest
+         [1.0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
+     static const y =
+         [2.0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
+-    assert(dotProduct(x, y) == 2280);
+-
+-    // Test in CTFE
+-    enum ctfeDot = dotProduct(x, y);
+-    static assert(ctfeDot == 2280);
++    assertCTFEable!({ assert(dotProduct(x, y) == 2280); });
+ }
+ 
+ /**
+@@ -2072,7 +2068,7 @@ unittest
+             ["nyuk", "I", "have", "no", "chocolate", "giba"],
+             ["wyda", "I", "have", "I", "have", "have", "I", "have", "hehe"],
+             0.5);
+-    double witness[] = [ 7.0, 4.03125, 0, 0 ];
++    double[] witness = [ 7.0, 4.03125, 0, 0 ];
+     foreach (e; sim)
+     {
+         //writeln(e);
+@@ -2221,10 +2217,10 @@ private:
+             recurseRange.popHalf();
+             slowFourier2(recurseRange, buf[$ / 2..$]);
+         }
+-        
++
+         butterfly(buf);
+     }
+-    
++
+     // This algorithm works by performing the even and odd parts of our FFT
+     // using the "two for the price of one" method mentioned at
+     // http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM#Head521
+@@ -2236,7 +2232,7 @@ private:
+         assert(isPowerOfTwo(range.length));
+     } body {
+         alias ElementType!R E;
+-        
++
+         // Converts odd indices of range to the imaginary components of
+         // a range half the size.  The even indices become the real components.
+         static if(isArray!R && isFloatingPoint!E) {
+@@ -2244,57 +2240,57 @@ private:
+             // cheap way to convert.  This is a common case, so take advantage.
+             auto oddsImag = cast(Complex!E[]) range;
+         } else {
+-            // General case:  Use a higher order range.  We can assume 
++            // General case:  Use a higher order range.  We can assume
+             // source.length is even because it has to be a power of 2.
+             static struct OddToImaginary {
+                 R source;
+                 alias Complex!(CommonType!(E, typeof(buf[0].re))) C;
+-                
++
+                 @property {
+                     C front() {
+                         return C(source[0], source[1]);
+                     }
+-                
++
+                     C back() {
+                         immutable n = source.length;
+                         return C(source[n - 2], source[n - 1]);
+                     }
+-                    
++
+                     typeof(this) save() {
+                         return typeof(this)(source.save);
+                     }
+-                    
++
+                     bool empty() {
+                         return source.empty;
+                     }
+-                    
++
+                     size_t length() {
+                         return source.length / 2;
+                     }
+                 }
+-                
++
+                 void popFront() {
+                     source.popFront();
+                     source.popFront();
+                 }
+-                
++
+                 void popBack() {
+                     source.popBack();
+                     source.popBack();
+                 }
+-                
++
+                 C opIndex(size_t index) {
+                     return C(source[index * 2], source[index * 2 + 1]);
+                 }
+-                
++
+                 typeof(this) opSlice(size_t lower, size_t upper) {
+                     return typeof(this)(source[lower * 2..upper * 2]);
+                 }
+             }
+-            
++
+             auto oddsImag = OddToImaginary(range);
+         }
+-        
++
+         fft(oddsImag, buf[0..$ / 2]);
+         auto evenFft = buf[0..$ / 2];
+         auto oddFft = buf[$ / 2..$];
+@@ -2303,7 +2299,7 @@ private:
+         oddFft[0].im = 0;
+         evenFft[0].im = 0;
+         // evenFft[0].re is already right b/c it's aliased with buf[0].re.
+-        
++
+         foreach(k; 1..halfN / 2 + 1) {
+             immutable bufk = buf[k];
+             immutable bufnk = buf[buf.length / 2 - k];
+@@ -2311,7 +2307,7 @@ private:
+             evenFft[halfN - k].re = evenFft[k].re;
+             evenFft[k].im = 0.5 * (bufk.im - bufnk.im);
+             evenFft[halfN - k].im = -evenFft[k].im;
+-            
++
+             oddFft[k].re = 0.5 * (bufk.im + bufnk.im);
+             oddFft[halfN - k].re = oddFft[k].re;
+             oddFft[k].im = 0.5 * (bufnk.re - bufk.re);
+@@ -2320,8 +2316,8 @@ private:
+ 
+         butterfly(buf);
+     }
+-    
+-    void butterfly(R)(R buf) const 
++
++    void butterfly(R)(R buf) const
+     in {
+         assert(isPowerOfTwo(buf.length));
+     } body {
+@@ -2444,8 +2440,8 @@ private:
+     }
+ 
+ public:
+-    /**Create an $(D Fft) object for computing fast Fourier transforms of 
+-     * power of two sizes of $(D size) or smaller.  $(D size) must be a 
++    /**Create an $(D Fft) object for computing fast Fourier transforms of
++     * power of two sizes of $(D size) or smaller.  $(D size) must be a
+      * power of two.
+      */
+     this(size_t size) {
+@@ -2468,7 +2464,7 @@ public:
+      *
+      * Note:  Pure real FFTs are automatically detected and the relevant
+      *        optimizations are performed.
+-     * 
++     *
+      * Returns:  An array of complex numbers representing the transformed data in
+      *           the frequency domain.
+      */
+@@ -2510,7 +2506,7 @@ public:
+             alias ElementType!R E;
+             static if(is(E : real)) {
+                 return fftImplPureReal(range, buf);
+-            } else {                
++            } else {
+                 static if(is(R : Stride!R)) {
+                     return fftImpl(range, buf);
+                 } else {
+@@ -2615,13 +2611,13 @@ unittest {
+         [36.0, -4, -4, -4, -4, -4, -4, -4]));
+     assert(approxEqual(map!"a.im"(fft1),
+         [0, 9.6568, 4, 1.6568, 0, -1.6568, -4, -9.6568]));
+-    
++
+     auto fft1Retro = fft(retro(arr));
+     assert(approxEqual(map!"a.re"(fft1Retro),
+         [36.0, 4, 4, 4, 4, 4, 4, 4]));
+     assert(approxEqual(map!"a.im"(fft1Retro),
+-        [0, -9.6568, -4, -1.6568, 0, 1.6568, 4, 9.6568]));  
+-        
++        [0, -9.6568, -4, -1.6568, 0, 1.6568, 4, 9.6568]));
++
+     auto fft1Float = fft(to!(float[])(arr));
+     assert(approxEqual(map!"a.re"(fft1), map!"a.re"(fft1Float)));
+     assert(approxEqual(map!"a.im"(fft1), map!"a.im"(fft1Float)));
+--- a/src/libphobos/src/std/outbuffer.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/outbuffer.d	2014-04-01 16:32:51.000000000 +0100
+@@ -41,7 +41,7 @@ private
+ 
+ class OutBuffer
+ {
+-    ubyte data[];
++    ubyte[] data;
+     size_t offset;
+ 
+     invariant()
+@@ -318,10 +318,7 @@ class OutBuffer
+         }
+         else version (Win64)
+         {
+-            va_list ap;
+-            ap = cast(va_list)&format;
+-            ap += format.sizeof;
+-            vprintf(format, ap);
++            vprintf(format, _argptr);
+         }
+         else version (X86_64)
+         {
+--- a/src/libphobos/src/std/parallelism.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/parallelism.d	2014-04-01 16:32:51.000000000 +0100
+@@ -39,12 +39,12 @@ Synopsis:
+ import std.algorithm, std.parallelism, std.range;
+ 
+ void main() {
+-    // Parallel reduce can be combined with 
+-    // std.algorithm.map to interesting effect.  
+-    // The following example (thanks to Russel Winder) 
+-    // calculates pi by quadrature  using 
++    // Parallel reduce can be combined with
++    // std.algorithm.map to interesting effect.
++    // The following example (thanks to Russel Winder)
++    // calculates pi by quadrature  using
+     // std.algorithm.map and TaskPool.reduce.
+-    // getTerm is evaluated in parallel as needed by 
++    // getTerm is evaluated in parallel as needed by
+     // TaskPool.reduce.
+     //
+     // Timings on an Athlon 64 X2 dual core machine:
+@@ -115,8 +115,8 @@ version(Windows)
+             {
+                 WORD wProcessorArchitecture;
+                 WORD wReserved;
+-            };
+-        };
++            }
++        }
+         DWORD     dwPageSize;
+         LPVOID    lpMinimumApplicationAddress;
+         LPVOID    lpMaximumApplicationAddress;
+@@ -209,18 +209,18 @@ private template MapType(R, functions...
+ {
+     static if(functions.length == 0)
+     {
+-        alias typeof(unaryFun!(functions[0])(ElementType!(R).init)) MapType;
++        alias typeof(unaryFun!(functions[0])(ElementType!R.init)) MapType;
+     }
+     else
+     {
+         alias typeof(adjoin!(staticMap!(unaryFun, functions))
+-                     (ElementType!(R).init)) MapType;
++                     (ElementType!R.init)) MapType;
+     }
+ }
+ 
+ private template ReduceType(alias fun, R, E)
+ {
+-    alias typeof(binaryFun!(fun)(E.init, ElementType!(R).init)) ReduceType;
++    alias typeof(binaryFun!fun(E.init, ElementType!R.init)) ReduceType;
+ }
+ 
+ private template noUnsharedAliasing(T)
+@@ -234,11 +234,10 @@ private template noUnsharedAliasing(T)
+ private template isSafeTask(F)
+ {
+     enum bool isSafeTask =
+-    ((functionAttributes!(F) & FunctionAttribute.safe) ||
+-     (functionAttributes!(F) & FunctionAttribute.trusted)) &&
+-    !(functionAttributes!F & FunctionAttribute.ref_) &&
+-    (isFunctionPointer!F || !hasUnsharedAliasing!F) &&
+-    allSatisfy!(noUnsharedAliasing, ParameterTypeTuple!F);
++        (functionAttributes!F & (FunctionAttribute.safe | FunctionAttribute.trusted)) != 0 &&
++        (functionAttributes!F & FunctionAttribute.ref_) == 0 &&
++        (isFunctionPointer!F || !hasUnsharedAliasing!F) &&
++        allSatisfy!(noUnsharedAliasing, ParameterTypeTuple!F);
+ }
+ 
+ unittest
+@@ -248,13 +247,13 @@ unittest
+     alias void function(uint, string) @trusted F3;
+     alias void function(uint, char[]) F4;
+ 
+-    static assert(isSafeTask!(F1));
+-    static assert(!isSafeTask!(F2));
+-    static assert(isSafeTask!(F3));
+-    static assert(!isSafeTask!(F4));
++    static assert( isSafeTask!F1);
++    static assert(!isSafeTask!F2);
++    static assert( isSafeTask!F3);
++    static assert(!isSafeTask!F4);
+ 
+     alias uint[] function(uint, string) pure @trusted F5;
+-    static assert(isSafeTask!(F5));
++    static assert( isSafeTask!F5);
+ }
+ 
+ // This function decides whether Tasks that meet all of the other requirements
+@@ -371,11 +370,8 @@ private template isRoundRobin(T)
+ 
+ unittest
+ {
+-    static assert(isRoundRobin!(
+-        RoundRobinBuffer!(void delegate(char[]), bool delegate())
+-    ));
+-
+-    static assert(!isRoundRobin!uint);
++    static assert( isRoundRobin!(RoundRobinBuffer!(void delegate(char[]), bool delegate())));
++    static assert(!isRoundRobin!(uint));
+ }
+ 
+ // This is the base "class" for all of the other tasks.  Using C-style
+@@ -392,24 +388,24 @@ private struct AbstractTask
+     ubyte taskStatus = TaskStatus.notStarted;
+ 
+     bool done() @property
+-{
+-    if(atomicReadUbyte(taskStatus) == TaskStatus.done)
+     {
+-        if(exception)
++        if(atomicReadUbyte(taskStatus) == TaskStatus.done)
+         {
+-            throw exception;
++            if(exception)
++            {
++                throw exception;
++            }
++
++            return true;
+         }
+ 
+-        return true;
++        return false;
+     }
+ 
+-    return false;
+-}
+-
+-void job()
+-{
+-    runTask(&this);
+-}
++    void job()
++    {
++        runTask(&this);
++    }
+ }
+ 
+ /**
+@@ -442,8 +438,7 @@ Bugs:  Changes to $(D ref) and $(D out)
+ */
+ struct Task(alias fun, Args...)
+ {
+-AbstractTask base = {runTask :
+-                         &impl};
++    AbstractTask base = {runTask : &impl};
+     alias base this;
+ 
+     private @property AbstractTask* basePtr()
+@@ -773,7 +768,7 @@ AbstractTask base = {runTask :
+ // Calls $(D fpOrDelegate) with $(D args).  This is an
+ // adapter that makes $(D Task) work with delegates, function pointers and
+ // functors instead of just aliases.
+-ReturnType!(F) run(F, Args...)(F fpOrDelegate, ref Args args)
++ReturnType!F run(F, Args...)(F fpOrDelegate, ref Args args)
+ {
+     return fpOrDelegate(args);
+ }
+@@ -793,7 +788,7 @@ import std.file;
+ 
+ void main()
+ {
+-    // Create and execute a Task for reading 
++    // Create and execute a Task for reading
+     // foo.txt.
+     auto file1Task = task!read("foo.txt");
+     file1Task.executeInNewThread();
+@@ -808,10 +803,10 @@ void main()
+ 
+ ---
+ // Sorts an array using a parallel quick sort algorithm.
+-// The first partition is done serially.  Both recursion 
++// The first partition is done serially.  Both recursion
+ // branches are then executed in parallel.
+ //
+-// Timings for sorting an array of 1,000,000 doubles on 
++// Timings for sorting an array of 1,000,000 doubles on
+ // an Athlon 64 X2 dual core machine:
+ //
+ // This implementation:               176 milliseconds.
+@@ -837,7 +832,7 @@ void parallelSort(T)(T[] data)
+     greaterEqual = data[$ - greaterEqual.length..$];
+ 
+     // Execute both recursion branches in parallel.
+-    auto recurseTask = task!(parallelSort)(greaterEqual);
++    auto recurseTask = task!parallelSort(greaterEqual);
+     taskPool.put(recurseTask);
+     parallelSort(less);
+     recurseTask.yieldForce;
+@@ -855,14 +850,14 @@ class/struct with overloaded opCall.
+ 
+ Examples:
+ ---
+-// Read two files in at the same time again, 
+-// but this time use a function pointer instead 
++// Read two files in at the same time again,
++// but this time use a function pointer instead
+ // of an alias to represent std.file.read.
+ import std.file;
+ 
+ void main()
+ {
+-    // Create and execute a Task for reading 
++    // Create and execute a Task for reading
+     // foo.txt.
+     auto file1Task = task(&read, "foo.txt");
+     file1Task.executeInNewThread();
+@@ -1100,7 +1095,7 @@ private:
+ 
+     // This function performs initialization for each thread that affects
+     // thread local storage and therefore must be done from within the
+-    // worker thread.  It then calls executeWorkLoop().  
++    // worker thread.  It then calls executeWorkLoop().
+     void startWorkLoop()
+     {
+         // Initialize thread index.
+@@ -1110,7 +1105,7 @@ private:
+             threadIndex = nextThreadIndex;
+             nextThreadIndex++;
+         }
+-        
++
+         executeWorkLoop();
+     }
+ 
+@@ -1118,7 +1113,7 @@ private:
+     // until they terminate.  It's also entered by non-worker threads when
+     // finish() is called with the blocking variable set to true.
+     void executeWorkLoop()
+-    {    
++    {
+         while(atomicReadUbyte(status) != PoolState.stopNow)
+         {
+             AbstractTask* task = pop();
+@@ -1188,7 +1183,7 @@ private:
+     void abstractPut(AbstractTask* task)
+     {
+         queueLock();
+-        scope(exit) queueUnlock();        
++        scope(exit) queueUnlock();
+         abstractPutNoSync(task);
+     }
+ 
+@@ -1217,7 +1212,7 @@ private:
+                 "finish() or stop()."
+             );
+         }
+-        
++
+         task.next = null;
+         if (head is null)   //Queue is empty.
+         {
+@@ -1243,7 +1238,7 @@ private:
+                 "finish() or stop()."
+             );
+         }
+-        
++
+         if(head is null)
+         {
+             head = h;
+@@ -1414,8 +1409,7 @@ public:
+         }
+ 
+         immutable size_t eightSize = 4 * (this.size + 1);
+-        auto ret = (rangeLen / eightSize) +
+-                   ((rangeLen % eightSize == 0) ? 0 : 1);
++        auto ret = (rangeLen / eightSize) + ((rangeLen % eightSize == 0) ? 0 : 1);
+         return max(ret, 1);
+     }
+ 
+@@ -1673,8 +1667,7 @@ public:
+             }
+             else
+             {
+-                auto buf = uninitializedArray!(MapType!(Args[0], functions)[])
+-                           (len);
++                auto buf = uninitializedArray!(MapType!(Args[0], functions)[])(len);
+                 alias args args2;
+                 alias Args Args2;
+             }
+@@ -1790,9 +1783,9 @@ public:
+ 
+     Examples:
+     ---
+-    // Pipeline reading a file, converting each line 
+-    // to a number, taking the logarithms of the numbers, 
+-    // and performing the additions necessary to find 
++    // Pipeline reading a file, converting each line
++    // to a number, taking the logarithms of the numbers,
++    // and performing the additions necessary to find
+     // the sum of the logarithms.
+ 
+     auto lineRange = File("numberList.txt").byLine();
+@@ -1853,11 +1846,11 @@ public:
+                 size_t bufPos;
+                 bool lastTaskWaited;
+ 
+-                static if(isRandomAccessRange!S)
+-        {
+-            alias S FromType;
++            static if(isRandomAccessRange!S)
++            {
++                alias S FromType;
+ 
+-            void popSource()
++                void popSource()
+                 {
+                     static if(__traits(compiles, source[0..source.length]))
+                     {
+@@ -1870,17 +1863,15 @@ public:
+                     else
+                     {
+                         static assert(0, "S must have slicing for Map."
+-                                      ~ "  " ~ R.stringof ~ " doesn't.");
++                                      ~ "  " ~ S.stringof ~ " doesn't.");
+                     }
+                 }
+-
+             }
+             else static if(bufferTrick)
+-        {
+-
+-            // Make sure we don't have the buffer recycling overload of
+-            // asyncBuf.
+-            static if(
++            {
++                // Make sure we don't have the buffer recycling overload of
++                // asyncBuf.
++                static if(
+                     is(typeof(source.source)) &&
+                     isRoundRobin!(typeof(source.source))
+                 )
+@@ -1914,11 +1905,10 @@ public:
+ 
+                     return from;
+                 }
+-
+             }
+             else
+             {
+-                alias ElementType!(S)[] FromType;
++                alias ElementType!S[] FromType;
+ 
+                 // The temporary array that data is copied to before being
+                 // mapped.
+@@ -1940,155 +1930,155 @@ public:
+             }
+ 
+             static if(hasLength!S)
+-        {
+-            size_t _length;
++            {
++                size_t _length;
+ 
+-            public @property size_t length() const pure nothrow @safe
++                public @property size_t length() const pure nothrow @safe
+                 {
+                     return _length;
+                 }
+             }
+ 
+-            this(S source, size_t bufSize, size_t workUnitSize, TaskPool pool)
+-            {
+-                static if(bufferTrick)
++                this(S source, size_t bufSize, size_t workUnitSize, TaskPool pool)
+                 {
+-                    bufSize = source.buf1.length;
+-                }
++                    static if(bufferTrick)
++                    {
++                        bufSize = source.buf1.length;
++                    }
+ 
+-                buf1.length = bufSize;
+-                buf2.length = bufSize;
++                    buf1.length = bufSize;
++                    buf2.length = bufSize;
+ 
+-                static if(!isRandomAccessRange!S)
+-                {
+-                    from.length = bufSize;
+-                }
+-
+-                this.workUnitSize = (workUnitSize == size_t.max) ?
+-                pool.defaultWorkUnitSize(bufSize) : workUnitSize;
+-                this.source = source;
+-                this.pool = pool;
++                    static if(!isRandomAccessRange!S)
++                    {
++                        from.length = bufSize;
++                    }
+ 
+-                static if(hasLength!S)
+-                {
+-                    _length = source.length;
+-                }
++                    this.workUnitSize = (workUnitSize == size_t.max) ?
++                            pool.defaultWorkUnitSize(bufSize) : workUnitSize;
++                    this.source = source;
++                    this.pool = pool;
+ 
+-                buf1 = fillBuf(buf1);
+-                submitBuf2();
+-            }
++                    static if(hasLength!S)
++                    {
++                        _length = source.length;
++                    }
+ 
+-            // The from parameter is a dummy and ignored in the random access
+-            // case.
+-            E[] fillBuf(E[] buf)
+-            {
+-                static if(isRandomAccessRange!S)
+-                {
+-                    auto toMap = take(source, buf.length);
+-                    scope(success) popSource();
++                    buf1 = fillBuf(buf1);
++                    submitBuf2();
+                 }
+-                else
++
++                // The from parameter is a dummy and ignored in the random access
++                // case.
++                E[] fillBuf(E[] buf)
+                 {
+-                    auto toMap = dumpToFrom();
+-                }
++                    static if(isRandomAccessRange!S)
++                    {
++                        auto toMap = take(source, buf.length);
++                        scope(success) popSource();
++                    }
++                    else
++                    {
++                        auto toMap = dumpToFrom();
++                    }
+ 
+-                buf = buf[0..min(buf.length, toMap.length)];
++                    buf = buf[0..min(buf.length, toMap.length)];
+ 
+-                // Handle as a special case:
+-                if(pool.size == 0)
+-                {
+-                    size_t index = 0;
+-                    foreach(elem; toMap)
++                    // Handle as a special case:
++                    if(pool.size == 0)
+                     {
+-                        buf[index++] = fun(elem);
++                        size_t index = 0;
++                        foreach(elem; toMap)
++                        {
++                            buf[index++] = fun(elem);
++                        }
++                        return buf;
+                     }
++
++                    pool.amap!functions(toMap, workUnitSize, buf);
++
+                     return buf;
+                 }
+ 
+-                pool.amap!(functions)(toMap, workUnitSize, buf);
++                void submitBuf2()
++                in
++                {
++                    assert(nextBufTask.prev is null);
++                    assert(nextBufTask.next is null);
++                } body
++                {
++                    // Hack to reuse the task object.
+ 
+-                return buf;
+-            }
++                    nextBufTask = typeof(nextBufTask).init;
++                    nextBufTask._args[0] = &fillBuf;
++                    nextBufTask._args[1] = buf2;
++                    pool.put(nextBufTask);
++                }
+ 
+-            void submitBuf2()
+-            in
+-            {
+-                assert(nextBufTask.prev is null);
+-                assert(nextBufTask.next is null);
+-            } body
+-            {
+-                // Hack to reuse the task object.
++                void doBufSwap()
++                {
++                    if(lastTaskWaited)
++                    {
++                        // Then the source is empty.  Signal it here.
++                        buf1 = null;
++                        buf2 = null;
++
++                        static if(!isRandomAccessRange!S)
++                        {
++                            from = null;
++                        }
+ 
+-                nextBufTask = typeof(nextBufTask).init;
+-                nextBufTask._args[0] = &fillBuf;
+-                nextBufTask._args[1] = buf2;
+-                pool.put(nextBufTask);
+-            }
++                        return;
++                    }
+ 
+-            void doBufSwap()
+-            {
+-                if(lastTaskWaited)
+-                {
+-                    // Then the source is empty.  Signal it here.
+-                    buf1 = null;
+-                    buf2 = null;
++                    buf2 = buf1;
++                    buf1 = nextBufTask.yieldForce;
++                    bufPos = 0;
+ 
+-                    static if(!isRandomAccessRange!S)
++                    if(source.empty)
+                     {
+-                        from = null;
++                        lastTaskWaited = true;
++                    }
++                    else
++                    {
++                        submitBuf2();
+                     }
+-
+-                    return;
+                 }
+ 
+-                buf2 = buf1;
+-                buf1 = nextBufTask.yieldForce;
+-                bufPos = 0;
+-
+-                if(source.empty)
++            public:
++                @property auto front()
+                 {
+-                    lastTaskWaited = true;
+-                }
+-                else
+-                {
+-                    submitBuf2();
++                    return buf1[bufPos];
+                 }
+-            }
+-
+-public:
+-            @property auto front()
+-            {
+-                return buf1[bufPos];
+-            }
+ 
+-            void popFront()
+-            {
+-                static if(hasLength!S)
++                void popFront()
+                 {
+-                    _length--;
++                    static if(hasLength!S)
++                    {
++                        _length--;
++                    }
++
++                    bufPos++;
++                    if(bufPos >= buf1.length)
++                    {
++                        doBufSwap();
++                    }
+                 }
+ 
+-                bufPos++;
+-                if(bufPos >= buf1.length)
++                static if(std.range.isInfinite!S)
+                 {
+-                    doBufSwap();
++                    enum bool empty = false;
+                 }
+-            }
+-
+-            static if(std.range.isInfinite!S)
+-        {
+-            enum bool empty = false;
+-        }
+-        else
+-        {
+-
+-            bool empty() @property
++                else
+                 {
+-                    // popFront() sets this when source is empty
+-                    return buf1.length == 0;
++
++                    bool empty() @property
++                    {
++                        // popFront() sets this when source is empty
++                        return buf1.length == 0;
++                    }
+                 }
+             }
+-            }
+             return new Map(source, bufSize, workUnitSize, this);
+         }
+     }
+@@ -2099,7 +2089,7 @@ public:
+     $(D source) into a buffer of $(D bufSize) elements in a worker thread,
+     while making prevously buffered elements from a second buffer, also of size
+     $(D bufSize), available via the range interface of the returned
+-    object.  The returned range has a length iff $(D hasLength!(S)).
++    object.  The returned range has a length iff $(D hasLength!S).
+     $(D asyncBuf) is useful, for example, when performing expensive operations
+     on the elements of ranges that represent data on a disk or network.
+ 
+@@ -2156,10 +2146,10 @@ public:
+ 
+             static if(hasLength!S)
+             {
+-            size_t _length;
++                size_t _length;
+ 
+-            // Available if hasLength!(S).
+-            public @property size_t length() const pure nothrow @safe
++                // Available if hasLength!S.
++                public @property size_t length() const pure nothrow @safe
+                 {
+                     return _length;
+                 }
+@@ -2301,8 +2291,8 @@ public:
+ 
+     Examples:
+     ---
+-    // Fetch lines of a file in a background 
+-    // thread while processing prevously fetched 
++    // Fetch lines of a file in a background
++    // thread while processing prevously fetched
+     // lines, without duplicating any lines.
+     auto file = File("foo.txt");
+ 
+@@ -2311,8 +2301,8 @@ public:
+         file.readln(buf);
+     }
+ 
+-    // Fetch more lines in the background while we 
+-    // process the lines already read into memory 
++    // Fetch more lines in the background while we
++    // process the lines already read into memory
+     // into a matrix of doubles.
+     double[][] matrix;
+     auto asyncReader = taskPool.asyncBuf(&next, &file.eof);
+@@ -2336,15 +2326,13 @@ public:
+     processes them is in queue.  This is checked for at compile time
+     and will result in a static assertion failure.
+     */
+-    auto asyncBuf(C1, C2)
+-    (C1 next, C2 empty, size_t initialBufSize = 0, size_t nBuffers = 100)
++    auto asyncBuf(C1, C2)(C1 next, C2 empty, size_t initialBufSize = 0, size_t nBuffers = 100)
+     if(is(typeof(C2.init()) : bool) &&
+-        ParameterTypeTuple!(C1).length == 1 &&
+-        ParameterTypeTuple!(C2).length == 0 &&
+-        isArray!(ParameterTypeTuple!(C1)[0])
++        ParameterTypeTuple!C1.length == 1 &&
++        ParameterTypeTuple!C2.length == 0 &&
++        isArray!(ParameterTypeTuple!C1[0])
+     ) {
+-        auto roundRobin = RoundRobinBuffer!(C1, C2)
+-        (next, empty, initialBufSize, nBuffers);
++        auto roundRobin = RoundRobinBuffer!(C1, C2)(next, empty, initialBufSize, nBuffers);
+         return asyncBuf(roundRobin, nBuffers / 2);
+     }
+ 
+@@ -2380,7 +2368,7 @@ public:
+     those generated by $(XREF algorithm, _reduce) or depending on how many work
+     units are used.  The next argument must be the range to be reduced.
+     ---
+-    // Find the sum of squares of a range in parallel, using 
++    // Find the sum of squares of a range in parallel, using
+     // an explicit seed.
+     //
+     // Timings on an Athlon 64 X2 dual core machine:
+@@ -2397,7 +2385,7 @@ public:
+     is used as a seed.  For the final reduction, the result from the first
+     work unit is used as the seed.
+     ---
+-    // Find the sum of a range in parallel, using the first 
++    // Find the sum of a range in parallel, using the first
+     // element of each work unit as the seed.
+     auto sum = taskPool.reduce!"a + b"(nums);
+     ---
+@@ -2436,8 +2424,8 @@ public:
+         ///
+         auto reduce(Args...)(Args args)
+         {
+-            alias reduceAdjoin!(functions) fun;
+-            alias reduceFinish!(functions) finishFun;
++            alias reduceAdjoin!functions fun;
++            alias reduceFinish!functions finishFun;
+ 
+             static if(isIntegral!(Args[$ - 1]))
+             {
+@@ -2459,8 +2447,7 @@ public:
+                 }
+                 else
+                 {
+-                    typeof(adjoin!(staticMap!(binaryFun, functions))(e, e))
+-                    seed = void;
++                    typeof(adjoin!(staticMap!(binaryFun, functions))(e, e)) seed = void;
+                     foreach (i, T; seed.Types)
+                     {
+                         auto p = (cast(void*) &seed.expand[i])
+@@ -2505,8 +2492,7 @@ public:
+             alias typeof(seed) E;
+             alias typeof(range) R;
+ 
+-            E reduceOnRange
+-            (R range, size_t lowerBound, size_t upperBound)
++            E reduceOnRange(R range, size_t lowerBound, size_t upperBound)
+             {
+                 // This is for exploiting instruction level parallelism by
+                 // using multiple accumulator variables within each thread,
+@@ -2603,8 +2589,7 @@ public:
+                 workUnitSize = len;
+             }
+ 
+-            immutable size_t nWorkUnits = (len / workUnitSize) +
+-                                          ((len % workUnitSize == 0) ? 0 : 1);
++            immutable size_t nWorkUnits = (len / workUnitSize) + ((len % workUnitSize == 0) ? 0 : 1);
+             assert(nWorkUnits * workUnitSize >= len);
+ 
+             alias Task!(run, typeof(&reduceOnRange), R, size_t, size_t) RTask;
+@@ -2740,10 +2725,10 @@ public:
+ 
+     Examples:
+     ---
+-    // Execute a loop that computes the greatest common 
+-    // divisor of every number from 0 through 999 with 
++    // Execute a loop that computes the greatest common
++    // divisor of every number from 0 through 999 with
+     // 42 in parallel.  Write the results out to
+-    // a set of files, one for each thread.  This allows 
++    // a set of files, one for each thread.  This allows
+     // results to be written out without any synchronization.
+ 
+     import std.conv, std.range, std.numeric, std.stdio;
+@@ -2773,9 +2758,8 @@ public:
+     size_t workerIndex() @property @safe const nothrow
+     {
+         immutable rawInd = threadIndex;
+-        return (rawInd >= instanceStartIndex &&
+-        rawInd < instanceStartIndex + size) ?
+-        (rawInd - instanceStartIndex + 1) : 0;
++        return (rawInd >= instanceStartIndex && rawInd < instanceStartIndex + size) ?
++                (rawInd - instanceStartIndex + 1) : 0;
+     }
+ 
+     /**
+@@ -2965,7 +2949,7 @@ public:
+                 atomicSetUbyte(barrierDummy, 1);
+             }
+ 
+-            return WorkerLocalStorageRange!(T)(this);
++            return WorkerLocalStorageRange!T(this);
+         }
+     }
+ 
+@@ -2989,7 +2973,7 @@ public:
+         size_t _length;
+         size_t beginOffset;
+ 
+-        this(WorkerLocalStorage!(T) wl)
++        this(WorkerLocalStorage!T wl)
+         {
+             this.workerLocalStorage = wl;
+             _length = wl.size;
+@@ -3066,9 +3050,9 @@ public:
+     create one instance of a class for each worker.  For usage example,
+     see the $(D WorkerLocalStorage) struct.
+      */
+-    WorkerLocalStorage!(T) workerLocalStorage(T)(lazy T initialVal = T.init)
++    WorkerLocalStorage!T workerLocalStorage(T)(lazy T initialVal = T.init)
+     {
+-        WorkerLocalStorage!(T) ret;
++        WorkerLocalStorage!T ret;
+         ret.initialize(this);
+         foreach(i; 0..size + 1)
+         {
+@@ -3109,10 +3093,10 @@ public:
+     before returning.  This option might be used in applications where
+     task results are never consumed-- e.g. when $(D TaskPool) is employed as a
+     rudimentary scheduler for tasks which communicate by means other than
+-    return values.  
+-    
++    return values.
++
+     Warning:  Calling this function with $(D blocking = true) from a worker
+-              thread that is a member of the same $(D TaskPool) that 
++              thread that is a member of the same $(D TaskPool) that
+               $(D finish) is being called on will result in a deadlock.
+      */
+     void finish(bool blocking = false) @trusted
+@@ -3123,23 +3107,23 @@ public:
+             atomicCasUbyte(status, PoolState.running, PoolState.finishing);
+             notifyAll();
+         }
+-        if (blocking) 
++        if (blocking)
+         {
+             // Use this thread as a worker until everything is finished.
+             executeWorkLoop();
+-            
+-            foreach(t; pool) 
++
++            foreach(t; pool)
+             {
+                 // Maybe there should be something here to prevent a thread
+                 // from calling join() on itself if this function is called
+                 // from a worker thread in the same pool, but:
+                 //
+-                // 1.  Using an if statement to skip join() would result in 
++                // 1.  Using an if statement to skip join() would result in
+                 //     finish() returning without all tasks being finished.
+                 //
+                 // 2.  If an exception were thrown, it would bubble up to the
+                 //     Task from which finish() was called and likely be
+-                //     swallowed.                
++                //     swallowed.
+                 t.join();
+             }
+         }
+@@ -3333,8 +3317,8 @@ readable.
+ 
+ Example:
+ ---
+-// Find the logarithm of every number from 
+-// 1 to 1_000_000 in parallel, using the 
++// Find the logarithm of every number from
++// 1 to 1_000_000 in parallel, using the
+ // default TaskPool instance.
+ auto logs = new double[1_000_000];
+ 
+@@ -3380,6 +3364,7 @@ private void submitAndExecute(
+ 
+     alias typeof(scopedTask(doIt)) PTask;
+     import core.stdc.stdlib;
++    import core.stdc.string : memcpy;
+ 
+     // The logical thing to do would be to just use alloca() here, but that
+     // causes problems on Windows for reasons that I don't understand
+@@ -3492,11 +3477,11 @@ int doSizeZeroCase(R, Delegate)(ref Para
+ 
+         // The explicit ElementType!R in the foreach loops is necessary for
+         // correct behavior when iterating over strings.
+-        static if(hasLvalueElements!(R))
++        static if(hasLvalueElements!R)
+         {
+             foreach(ref ElementType!R elem; range)
+             {
+-                static if(ParameterTypeTuple!(dg).length == 2)
++                static if(ParameterTypeTuple!dg.length == 2)
+                 {
+                     res = dg(index, elem);
+                 }
+@@ -3512,7 +3497,7 @@ int doSizeZeroCase(R, Delegate)(ref Para
+         {
+             foreach(ElementType!R elem; range)
+             {
+-                static if(ParameterTypeTuple!(dg).length == 2)
++                static if(ParameterTypeTuple!dg.length == 2)
+                 {
+                     res = dg(index, elem);
+                 }
+@@ -3621,7 +3606,8 @@ enum string parallelApplyMixinInputRange
+ 
+         enum bool bufferTrick = true;
+     }
+-    else {
++    else
++    {
+         enum bool bufferTrick = false;
+     }
+ 
+@@ -3635,7 +3621,7 @@ enum string parallelApplyMixinInputRange
+ 
+         static if(hasLvalueElements!R)
+         {
+-            alias ElementType!(R)*[] Temp;
++            alias ElementType!R*[] Temp;
+             Temp temp;
+ 
+             // Returns:  The previous value of nPopped.
+@@ -3643,7 +3629,7 @@ enum string parallelApplyMixinInputRange
+             {
+                 if(temp is null)
+                 {
+-                    temp = uninitializedArray!(Temp)(workUnitSize);
++                    temp = uninitializedArray!Temp(workUnitSize);
+                 }
+ 
+                 rangeMutex.lock();
+@@ -3665,7 +3651,7 @@ enum string parallelApplyMixinInputRange
+         else
+         {
+ 
+-            alias ElementType!(R)[] Temp;
++            alias ElementType!R[] Temp;
+             Temp temp;
+ 
+             // Returns:  The previous value of nPopped.
+@@ -3673,7 +3659,7 @@ enum string parallelApplyMixinInputRange
+             {
+                 if(temp is null)
+                 {
+-                    temp = uninitializedArray!(Temp)(workUnitSize);
++                    temp = uninitializedArray!Temp(workUnitSize);
+                 }
+ 
+                 rangeMutex.lock();
+@@ -3786,7 +3772,8 @@ private void addToChain(
+         lastException.next = e;
+         lastException = findLastException(e);
+     }
+-    else {
++    else
++    {
+         firstException = e;
+         lastException = findLastException(e);
+     }
+@@ -4116,8 +4103,8 @@ unittest
+         auto tSlow = task!slowFun();
+         pool1.put(tSlow);
+         pool1.finish();
+-        tSlow.yieldForce();
+-        // Can't assert that pool1.status == PoolState.stopNow because status 
++        tSlow.yieldForce;
++        // Can't assert that pool1.status == PoolState.stopNow because status
+         // doesn't change until after the "done" flag is set and the waiting
+         // thread is woken up.
+ 
+@@ -4126,14 +4113,14 @@ unittest
+         pool2.put(tSlow2);
+         pool2.finish(true); // blocking
+         assert(tSlow2.done);
+-        
++
+         // Test fix for Bug 8582 by making pool size zero.
+         auto pool3 = new TaskPool(0);
+         auto tSlow3 = task!slowFun();
+         pool3.put(tSlow3);
+         pool3.finish(true); // blocking
+         assert(tSlow3.done);
+-        
++
+         // This is correct because no thread will terminate unless pool2.status
+         // and pool3.status have already been set to stopNow.
+         assert(pool2.status == TaskPool.PoolState.stopNow);
+@@ -4300,7 +4287,8 @@ unittest
+ 
+     assertThrown!Exception(mapThrow());
+ 
+-    struct ThrowingRange {
++    struct ThrowingRange
++    {
+         @property int front()
+         {
+             return 1;
+@@ -4390,8 +4378,7 @@ version(parallelismStressTest)
+             {
+                 foreach(j, number; poolInstance.parallel(nestedInner, 1))
+                 {
+-                    synchronized writeln
+-                    (i, ": ", letter, "  ", j, ": ", number);
++                    synchronized writeln(i, ": ", letter, "  ", j, ": ", number);
+                 }
+             }
+ 
+@@ -4417,7 +4404,7 @@ version(parallelismStressTest)
+             assert(poolInstance.workerIndex() == 0);
+ 
+             // Test worker-local storage.
+-            auto workerLocalStorage = poolInstance.workerLocalStorage!(uint)(1);
++            auto workerLocalStorage = poolInstance.workerLocalStorage!uint(1);
+             foreach(i; poolInstance.parallel(iota(0U, 1_000_000)))
+             {
+                 workerLocalStorage.get++;
+--- a/src/libphobos/src/std/path.d	2013-06-01 16:19:09.000000000 +0100
++++ b/src/libphobos/src/std/path.d	2014-04-01 16:32:51.000000000 +0100
+@@ -13,7 +13,7 @@
+     To differentiate between these cases, use $(XREF file,isDir) and
+     $(XREF file,exists).
+ 
+-    Note that on Windows, both the backslash ($(D '\')) and the slash ($(D '/'))
++    Note that on Windows, both the backslash ($(D `\`)) and the slash ($(D `/`))
+     are in principle valid directory separators.  This module treats them
+     both on equal footing, but in cases where a $(I new) separator is
+     added, a backslash will be used.  Furthermore, the $(LREF buildNormalizedPath)
+@@ -54,6 +54,7 @@ import std.algorithm;
+ import std.array;
+ import std.conv;
+ import std.file: getcwd;
++import std.range;
+ import std.string;
+ import std.traits;
+ 
+@@ -91,8 +92,8 @@ else static assert (0, "unsupported plat
+ 
+ /** Determines whether the given character is a directory separator.
+ 
+-    On Windows, this includes both $(D '\') and $(D '/').
+-    On POSIX, it's just $(D '/').
++    On Windows, this includes both $(D `\`) and $(D `/`).
++    On POSIX, it's just $(D `/`).
+ */
+ bool isDirSeparator(dchar c)  @safe pure nothrow
+ {
+@@ -760,6 +761,9 @@ unittest
+     extension is simply appended to the filename.  Including a leading dot
+     in $(D ext) is optional.
+ 
++    If the extension is empty, this function is equivalent to
++    $(LREF stripExtension).
++
+     This function normally allocates a new string (the possible exception
+     being the case when path is immutable and doesn't already have an
+     extension).
+@@ -768,6 +772,7 @@ unittest
+     ---
+     assert (setExtension("file", "ext")      == "file.ext");
+     assert (setExtension("file", ".ext")     == "file.ext");
++    assert (setExtension("file.old", "")     == "file");
+     assert (setExtension("file.old", "new")  == "file.new");
+     assert (setExtension("file.old", ".new") == "file.new");
+     ---
+@@ -776,10 +781,10 @@ immutable(Unqual!C1)[] setExtension(C1,
+     @trusted pure nothrow
+     if (isSomeChar!C1 && !is(C1 == immutable) && is(Unqual!C1 == Unqual!C2))
+ {
+-    if (ext.length > 0 && ext[0] == '.')
+-        return cast(typeof(return))(stripExtension(path)~ext);
+-    else
++    if (ext.length > 0 && ext[0] != '.')
+         return cast(typeof(return))(stripExtension(path)~'.'~ext);
++    else
++        return cast(typeof(return))(stripExtension(path)~ext);
+ }
+ 
+ ///ditto
+@@ -787,6 +792,9 @@ immutable(C1)[] setExtension(C1, C2)(imm
+     @trusted pure nothrow
+     if (isSomeChar!C1 && is(Unqual!C1 == Unqual!C2))
+ {
++    if (ext.length == 0)
++        return stripExtension(path);
++
+     // Optimised for the case where path is immutable and has no extension
+     if (ext.length > 0 && ext[0] == '.') ext = ext[1 .. $];
+     auto i = extSeparatorPos(path);
+@@ -829,8 +837,11 @@ unittest
+ 
+     static assert (setExtension("file"w.dup, "ext"w) == "file.ext");
+     static assert (setExtension("file.old"d.dup, "new"d) == "file.new");
+-}
+ 
++    // Issue 10601
++    assert (setExtension("file", "") == "file");
++    assert (setExtension("file.ext", "") == "file");
++}
+ 
+ 
+ 
+@@ -886,56 +897,113 @@ unittest
+ }
+ 
+ 
++/** Combines one or more path segments.
+ 
+-
+-/** Combines one or more path components.
+-
+-    The given path components are concatenated with each other,
+-    and if necessary, directory separators are inserted between
+-    them. If any of the path components are rooted (as defined by
+-    $(LREF isRooted)) the preceding path components will be dropped.
++    This function takes a set of path segments, given as an input
++    range of string elements or as a set of string arguments,
++    and concatenates them with each other.  Directory separators
++    are inserted between segments if necessary.  If any of the
++    path segments are absolute (as defined by $(LREF isAbsolute)), the
++    preceding segments will be dropped.
++
++    On Windows, if one of the path segments are rooted, but not absolute
++    (e.g. $(D `\foo`)), all preceding path segments down to the previous
++    root will be dropped.  (See below for an example.)
+ 
+     This function always allocates memory to hold the resulting path.
++    The variadic overload is guaranteed to only perform a single
++    allocation, as is the range version if $(D paths) is a forward
++    range.
++*/
++immutable(ElementEncodingType!(ElementType!Range))[]
++    buildPath(Range)(Range segments)
++        if (isInputRange!Range && isSomeString!(ElementType!Range))
++{
++    if (segments.empty) return null;
+ 
+-    Examples:
+-    ---
+-    version (Posix)
++    // If this is a forward range, we can pre-calculate a maximum length.
++    static if (isForwardRange!Range)
+     {
+-        assert (buildPath("foo", "bar", "baz") == "foo/bar/baz");
+-        assert (buildPath("/foo/", "bar")      == "/foo/bar");
+-        assert (buildPath("/foo", "/bar")      == "/bar");
++        auto segments2 = segments.save;
++        size_t precalc = 0;
++        foreach (segment; segments2) precalc += segment.length + 1;
+     }
++    // Otherwise, just venture a guess and resize later if necessary.
++    else size_t precalc = 255;
+ 
+-    version (Windows)
++    auto buf = new Unqual!(ElementEncodingType!(ElementType!Range))[](precalc);
++    size_t pos = 0;
++    foreach (segment; segments)
+     {
+-        assert (buildPath("foo", "bar", "baz") == `foo\bar\baz`);
+-        assert (buildPath(`c:\foo`, "bar")    == `c:\foo\bar`);
+-        assert (buildPath("foo", `d:\bar`)    == `d:\bar`);
+-        assert (buildPath("foo", `\bar`)      == `\bar`);
++        if (segment.empty) continue;
++        static if (!isForwardRange!Range)
++        {
++            immutable neededLength = pos + segment.length + 1;
++            if (buf.length < neededLength)
++                buf.length = reserve(buf, neededLength + buf.length/2);
++        }
++        if (pos > 0)
++        {
++            if (isRooted(segment))
++            {
++                version (Posix)
++                {
++                    pos = 0;
++                }
++                else version (Windows)
++                {
++                    if (isAbsolute(segment))
++                        pos = 0;
++                    else
++                    {
++                        pos = rootName(buf[0 .. pos]).length;
++                        if (pos > 0 && isDirSeparator(buf[pos-1])) --pos;
++                    }
++                }
++            }
++            else if (!isDirSeparator(buf[pos-1]))
++                buf[pos++] = dirSeparator[0];
++        }
++        buf[pos .. pos + segment.length] = segment[];
++        pos += segment.length;
+     }
+-    ---
+-*/
++    static U trustedCast(U, V)(V v) @trusted pure nothrow { return cast(U) v; }
++    return trustedCast!(typeof(return))(buf[0 .. pos]);
++}
++
++/// ditto
+ immutable(C)[] buildPath(C)(const(C[])[] paths...)
+-    @safe pure //TODO: nothrow (because of reduce() and to())
++    @safe pure nothrow
+     if (isSomeChar!C)
+ {
+-    static typeof(return) joinPaths(const(C)[] lhs, const(C)[] rhs)
+-        @trusted pure //TODO: nothrow (because of to())
++    return buildPath!(typeof(paths))(paths);
++}
++
++///
++unittest
++{
++    version (Posix)
+     {
+-        if (rhs.empty) return to!(typeof(return))(lhs);
+-        if (lhs.empty || isRooted(rhs)) return to!(typeof(return))(rhs);
+-        if (isDirSeparator(lhs[$-1]) || isDirSeparator(rhs[0]))
+-            return cast(typeof(return))(lhs ~ rhs);
+-        else
+-            return cast(typeof(return))(lhs ~ dirSeparator ~ rhs);
++        assert (buildPath("foo", "bar", "baz") == "foo/bar/baz");
++        assert (buildPath("/foo/", "bar/baz")  == "/foo/bar/baz");
++        assert (buildPath("/foo", "/bar")      == "/bar");
+     }
+ 
+-    return to!(typeof(return))(reduce!joinPaths(paths));
++    version (Windows)
++    {
++        assert (buildPath("foo", "bar", "baz") == `foo\bar\baz`);
++        assert (buildPath(`c:\foo`, `bar\baz`) == `c:\foo\bar\baz`);
++        assert (buildPath("foo", `d:\bar`)     == `d:\bar`);
++        assert (buildPath("foo", `\bar`)       == `\bar`);
++        assert (buildPath(`c:\foo`, `\bar`)    == `c:\bar`);
++    }
+ }
+ 
+-
+-unittest
++unittest // non-documented
+ {
++    // ir() wraps an array in a plain (i.e. non-forward) input range, so that
++    // we can test both code paths
++    InputRange!(C[]) ir(C)(C[][] p...) { return inputRangeObject(p); }
+     version (Posix)
+     {
+         assert (buildPath("foo") == "foo");
+@@ -955,6 +1023,23 @@ unittest
+ 
+         static assert (buildPath("foo", "bar", "baz") == "foo/bar/baz");
+         static assert (buildPath("foo", "/bar", "baz") == "/bar/baz");
++
++        // The following are mostly duplicates of the above, except that the
++        // range version does not accept mixed constness.
++        assert (buildPath(ir("foo")) == "foo");
++        assert (buildPath(ir("/foo/")) == "/foo/");
++        assert (buildPath(ir("foo", "bar")) == "foo/bar");
++        assert (buildPath(ir("foo", "bar", "baz")) == "foo/bar/baz");
++        assert (buildPath(ir("foo/".dup, "bar".dup)) == "foo/bar");
++        assert (buildPath(ir("foo///".dup, "bar".dup)) == "foo///bar");
++        assert (buildPath(ir("/foo"w, "bar"w)) == "/foo/bar");
++        assert (buildPath(ir("foo"w.dup, "/bar"w.dup)) == "/bar");
++        assert (buildPath(ir("foo"w.dup, "bar/"w.dup)) == "foo/bar/");
++        assert (buildPath(ir("/"d, "foo"d)) == "/foo");
++        assert (buildPath(ir(""d.dup, "foo"d.dup)) == "foo");
++        assert (buildPath(ir("foo"d, ""d)) == "foo");
++        assert (buildPath(ir("foo", "bar", "baz")) == "foo/bar/baz");
++        assert (buildPath(ir("foo"w.dup, "/bar"w.dup, "baz"w.dup)) == "/bar/baz");
+     }
+     version (Windows)
+     {
+@@ -964,10 +1049,32 @@ unittest
+         assert (buildPath("foo", `\bar`) == `\bar`);
+         assert (buildPath(`c:\foo`, "bar") == `c:\foo\bar`);
+         assert (buildPath("foo"w, `d:\bar`w.dup) ==  `d:\bar`);
++        assert (buildPath(`c:\foo\bar`, `\baz`) == `c:\baz`);
++        assert (buildPath(`\\foo\bar\baz`d, `foo`d, `\bar`d) == `\\foo\bar\bar`d);
+ 
+         static assert (buildPath("foo", "bar", "baz") == `foo\bar\baz`);
+         static assert (buildPath("foo", `c:\bar`, "baz") == `c:\bar\baz`);
+-    }
++
++        assert (buildPath(ir("foo")) == "foo");
++        assert (buildPath(ir(`\foo/`)) == `\foo/`);
++        assert (buildPath(ir("foo", "bar", "baz")) == `foo\bar\baz`);
++        assert (buildPath(ir("foo", `\bar`)) == `\bar`);
++        assert (buildPath(ir(`c:\foo`, "bar")) == `c:\foo\bar`);
++        assert (buildPath(ir("foo"w.dup, `d:\bar`w.dup)) ==  `d:\bar`);
++        assert (buildPath(ir(`c:\foo\bar`, `\baz`)) == `c:\baz`);
++        assert (buildPath(ir(`\\foo\bar\baz`d, `foo`d, `\bar`d)) == `\\foo\bar\bar`d);
++    }
++
++    // Test that allocation works as it should.
++    auto manyShort = "aaa".repeat(1000).array();
++    auto manyShortCombined = join(manyShort, dirSeparator);
++    assert (buildPath(manyShort) == manyShortCombined);
++    assert (buildPath(ir(manyShort)) == manyShortCombined);
++
++    auto fewLong = 'b'.repeat(500).array().repeat(10).array();
++    auto fewLongCombined = join(fewLong, dirSeparator);
++    assert (buildPath(fewLong) == fewLongCombined);
++    assert (buildPath(ir(fewLong)) == fewLongCombined);
+ }
+ 
+ unittest
+@@ -985,7 +1092,6 @@ unittest
+ }
+ 
+ 
+-
+ /** Performs the same task as $(LREF buildPath),
+     while at the same time resolving current/parent directory
+     symbols ($(D ".") and $(D "..")) and removing superfluous
+@@ -1619,8 +1725,11 @@ unittest
+         assert (equal2(pathSplitter(`\\foo\bar\baz`), [`\\foo\bar`, "baz"]));
+     }
+ 
+-    // CTFE
+-    static assert (equal(pathSplitter("/foo/bar".dup), ["/", "foo", "bar"]));
++    import std.exception;
++    assertCTFEable!(
++    {
++        assert (equal(pathSplitter("/foo/bar".dup), ["/", "foo", "bar"]));
++    });
+ }
+ 
+ 
+@@ -1703,7 +1812,7 @@ unittest
+     ---
+ 
+     On Windows, an absolute path starts at the root directory of
+-    a specific drive.  Hence, it must start with $(D "d:\") or $(D "d:/"),
++    a specific drive.  Hence, it must start with $(D `d:\`) or $(D `d:/`),
+     where $(D d) is the drive letter.  Alternatively, it may be a
+     network path, i.e. a path starting with a double (back)slash.
+     ---
+@@ -1786,6 +1895,7 @@ unittest
+         assert (absolutePath(`some\file`, `c:\foo\bar`)    == `c:\foo\bar\some\file`);
+         assert (absolutePath(`..\file`, `c:\foo\bar`)      == `c:\foo\bar\..\file`);
+         assert (absolutePath(`c:\some\file`, `c:\foo\bar`) == `c:\some\file`);
++        assert (absolutePath(`\file`, `c:\foo\bar`)        == `c:\file`);
+     }
+     ---
+ 
+@@ -1818,6 +1928,8 @@ unittest
+         assert (absolutePath(`some\file`, `c:\foo\bar`)    == `c:\foo\bar\some\file`);
+         assert (absolutePath(`..\file`, `c:\foo\bar`)      == `c:\foo\bar\..\file`);
+         assert (absolutePath(`c:\some\file`, `c:\foo\bar`) == `c:\some\file`);
++        assert (absolutePath(`\`, `c:\`)                   == `c:\`);
++        assert (absolutePath(`\some\file`, `c:\foo\bar`)   == `c:\some\file`);
+         static assert (absolutePath(`some\file`, `c:\foo\bar`) == `c:\foo\bar\some\file`);
+     }
+ 
+@@ -1834,14 +1946,14 @@ unittest
+     taken to be the current working directory.  If specified,
+     $(D base) must be an absolute _path, and it is always assumed
+     to refer to a directory.  If $(D path) and $(D base) refer to
+-    the same directory, the function returns $(D ".").
++    the same directory, the function returns $(D `.`).
+ 
+     The following algorithm is used:
+     $(OL
+         $(LI If $(D path) is a relative directory, return it unaltered.)
+         $(LI Find a common root between $(D path) and $(D base).
+             If there is no common root, return $(D path) unaltered.)
+-        $(LI Prepare a string with as many $(D "../") or $(D "..\") as
++        $(LI Prepare a string with as many $(D `../`) or $(D `..\`) as
+             necessary to reach the common root from base path.)
+         $(LI Append the remaining segments of $(D path) to the string
+             and return.)
+@@ -1943,8 +2055,10 @@ unittest
+         assert (relativePath("/foo/bar/baz", "/foo/bar") == "baz");
+         assertThrown(relativePath("/foo", "bar"));
+ 
+-        // CTFE
+-        static assert (relativePath("/foo/bar", "/foo/baz") == "../bar");
++        assertCTFEable!(
++        {
++            assert (relativePath("/foo/bar", "/foo/baz") == "../bar");
++        });
+     }
+     else version (Windows)
+     {
+@@ -1958,8 +2072,10 @@ unittest
+         assert (relativePath(`\\foo\bar`, `c:\foo`) == `\\foo\bar`);
+         assertThrown(relativePath(`c:\foo`, "bar"));
+ 
+-        // CTFE
+-        static assert (relativePath(`c:\foo\bar`, `c:\foo\baz`) == `..\bar`);
++        assertCTFEable!(
++        {
++            assert (relativePath(`c:\foo\bar`, `c:\foo\baz`) == `..\bar`);
++        });
+     }
+     else static assert (0);
+ }
+@@ -1975,7 +2091,7 @@ unittest
+     which, if not specified, is given by
+     $(LREF CaseSensitive)$(D .osDefault).
+ 
+-    On Windows, the backslash and slash characters ($(D '\') and $(D '/'))
++    On Windows, the backslash and slash characters ($(D `\`) and $(D `/`))
+     are considered equal.
+ 
+     Examples:
+@@ -2631,6 +2747,9 @@ string expandTilde(string inputPath)
+ {
+     version(Posix)
+     {
++        import core.stdc.string : strlen;
++        import core.stdc.stdlib : getenv, malloc, free;
++
+         /*  Joins a path from a C string to the remainder of path.
+ 
+             The last path separator from c_path is discarded. The result
+@@ -2801,1305 +2920,3 @@ unittest
+         assert(expandTilde("~Idontexist/hey") == "~Idontexist/hey");
+     }
+ }
+-
+-
+-
+-
+-// =============================================================================
+-// Everything below this line is from an old version of std.path, and is
+-// deprecated and will be removed in October 2012.
+-// =============================================================================
+-
+-
+-import std.algorithm, std.array, std.conv, std.file, std.process, std.string,
+-    std.traits;
+-import core.stdc.errno, core.stdc.stdlib;
+-
+-deprecated:
+-
+-version(Posix)
+-{
+-    private import core.sys.posix.pwd;
+-}
+-
+-version(Windows)
+-{
+-
+-    /* * String used to separate directory names in a path. Under
+-     *  Windows this is a backslash, under Linux a slash. */
+-    enum string sep = "\\";
+-    /* * Alternate version of sep[] used in Windows (a slash). Under
+-     *  Linux this is empty. */
+-    enum string altsep = "/";
+-    /* * Path separator string. A semi colon under Windows, a colon
+-     *  under Linux. */
+-    enum string pathsep = ";";
+-    /* * String used to separate lines, \r\n under Windows and \n
+-     * under Linux. */
+-    enum string linesep = "\r\n";   // / String used to separate lines.
+-    enum string curdir = ".";       // / String representing the current directory.
+-    enum string pardir = "..";      // / String representing the parent directory.
+-
+-    private bool isSep(dchar ch) {
+-        return ch == sep[0] || ch == altsep[0];
+-    }
+-
+-    private bool isSepOrDriveSep(dchar ch) {
+-        return isSep(ch) || ch == ':';
+-    }
+-}
+-version(Posix)
+-{
+-    /* * String used to separate directory names in a path. Under
+-     *  Windows this is a backslash, under Linux a slash. */
+-    enum string sep = "/";
+-    /* * Alternate version of sep[] used in Windows (a slash). Under
+-     *  Linux this is empty. */
+-    enum string altsep = "";
+-    /* * Path separator string. A semi colon under Windows, a colon
+-     *  under Linux. */
+-    enum string pathsep = ":";
+-    /* * String used to separate lines, \r\n under Windows and \n
+-     * under Linux. */
+-    enum string linesep = "\n";
+-    enum string curdir = ".";       // / String representing the current directory.
+-    enum string pardir = "..";      // / String representing the parent directory.
+-
+-    private bool isSep(dchar ch) {
+-        return ch == sep[0];
+-    }
+-}
+-
+-/******************************
+- * $(RED Deprecated. It will be removed in October 2012. Please use
+- *       $(LREF filenameCmp) instead.)
+- *
+- * Compare file names.
+- * Returns:
+- *      
+- *      
< 0 filename1 < filename2 +- *
= 0 filename1 == filename2 +- *
> 0 filename1 > filename2 +- *
+- */ +-int fcmp(alias pred = "a < b", S1, S2)(S1 s1, S2 s2) +- if (isSomeString!S1 && isSomeString!S2) +-{ +- version (Windows) return std.string.icmp(s1, s2); +- version (Posix) return std.algorithm.cmp(s1, s2); +-} +- +-/*************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF extension) instead.) +- * +- * Extracts the extension from a filename or path. +- * +- * This function will search fullname from the end until the +- * first dot, path separator or first character of fullname is +- * reached. Under Windows, the drive letter separator (colon) +- * also terminates the search. +- * +- * Returns: If a dot was found, characters to its right are +- * returned. If a path separator was found, or fullname didn't +- * contain any dots or path separators, returns null. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * getExt(r"d:\path\foo.bat") // "bat" +- * getExt(r"d:\path.two\bar") // null +- * } +- * version(Posix) +- * { +- * getExt(r"/home/user.name/bar.") // "" +- * getExt(r"d:\\path.two\\bar") // r"two\\bar" +- * getExt(r"/home/user/.resource") // "resource" +- * } +- * ----- +- */ +- +-string getExt()(string fullname) +-{ +- auto i = fullname.length; +- while (i > 0) +- { +- if (fullname[i - 1] == '.') +- return fullname[i .. $]; +- i--; +- version(Windows) +- { +- if (isSepOrDriveSep(fullname[i])) +- break; +- } +- else version(Posix) +- { +- if (isSep(fullname[i])) +- break; +- } +- else +- { +- static assert(0); +- } +- } +- return null; +-} +- +-version (OldStdPathUnittest) unittest +-{ +- debug(path) printf("path.getExt.unittest\n"); +- string result; +- +- version (Windows) +- result = getExt("d:\\path\\foo.bat"); +- version (Posix) +- result = getExt("/path/foo.bat"); +- auto i = cmp(result, "bat"); +- assert(i == 0); +- +- version (Windows) +- result = getExt("d:\\path\\foo."); +- version (Posix) +- result = getExt("d/path/foo."); +- i = cmp(result, ""); +- assert(i == 0); +- +- version (Windows) +- result = getExt("d:\\path\\foo"); +- version (Posix) +- result = getExt("d/path/foo"); +- i = cmp(result, ""); +- assert(i == 0); +- +- version (Windows) +- result = getExt("d:\\path.bar\\foo"); +- version (Posix) +- result = getExt("/path.bar/foo"); +- +- i = cmp(result, ""); +- assert(i == 0); +- +- result = getExt("foo"); +- i = cmp(result, ""); +- assert(i == 0); +-} +- +-/*************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF stripExtension) instead.) +- * +- * Returns the extensionless version of a filename or path. +- * +- * This function will search fullname from the end until the +- * first dot, path separator or first character of fullname is +- * reached. Under Windows, the drive letter separator (colon) +- * also terminates the search. +- * +- * Returns: If a dot was found, characters to its left are +- * returned. If a path separator was found, or fullname didn't +- * contain any dots or path separators, returns null. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * getName(r"d:\path\foo.bat") => r"d:\path\foo" +- * getName(r"d:\path.two\bar") => null +- * } +- * version(Posix) +- * { +- * getName("/home/user.name/bar.") => "/home/user.name/bar" +- * getName(r"d:\path.two\bar") => r"d:\path" +- * getName("/home/user/.resource") => "/home/user/" +- * } +- * ----- +- */ +- +-string getName()(string fullname) +-{ +- auto i = fullname.length; +- while (i > 0) +- { +- if (fullname[i - 1] == '.') +- return fullname[0 .. i - 1]; +- i--; +- version(Windows) +- { +- if (isSepOrDriveSep(fullname[i])) +- break; +- } +- else version(Posix) +- { +- if (isSep(fullname[i])) +- break; +- } +- else +- { +- static assert(0); +- } +- } +- return null; +-} +- +-version (OldStdPathUnittest) unittest +-{ +- debug(path) printf("path.getName.unittest\n"); +- string result; +- +- result = getName("foo.bar"); +- auto i = cmp(result, "foo"); +- assert(i == 0); +- +- result = getName("d:\\path.two\\bar"); +- version (Windows) +- i = cmp(result, ""); +- version (Posix) +- i = cmp(result, "d:\\path"); +- assert(i == 0); +-} +- +-/*************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF baseName) instead.) +- * +- * Extracts the base name of a path and optionally chops off a +- * specific suffix. +- * +- * This function will search $(D_PARAM fullname) from the end until +- * the first path separator or first character of $(D_PARAM fullname) +- * is reached. Under Windows, the drive letter separator ($(I colon)) +- * also terminates the search. After the search has ended, keep the +- * portion to the right of the separator if found, or the entire +- * $(D_PARAM fullname) otherwise. If the kept portion has suffix +- * $(D_PARAM extension), remove that suffix. Return the remaining string. +- * +- * Returns: The portion of $(D_PARAM fullname) left after the path +- * part and the extension part, if any, have been removed. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * basename(r"d:\path\foo.bat") => "foo.bat" +- * basename(r"d:\path\foo", ".bat") => "foo" +- * } +- * version(Posix) +- * { +- * basename("/home/user.name/bar.") => "bar." +- * basename("/home/user.name/bar.", ".") => "bar" +- * } +- * ----- +- */ +- +-Char[] basename(Char, ExtChar = immutable(char))( +- Char[] fullname, ExtChar[] extension = null) +- if (isSomeChar!Char && isSomeChar!ExtChar) +-out (result) +-{ +- assert(result.length <= fullname.length); +-} +-body +-{ +- auto i = fullname.length; +- for (; i > 0; i--) +- { +- version(Windows) +- { +- if (isSepOrDriveSep(fullname[i - 1])) +- break; +- } +- else version(Posix) +- { +- if (isSep(fullname[i - 1])) +- break; +- } +- else +- { +- static assert(0); +- } +- } +- return chomp(fullname[i .. $], +- extension.length ? extension : ""); +-} +- +-/* * Alias for $(D_PARAM basename), kept for backward +- * compatibility. New code should use $(D_PARAM basename). */ +-alias basename getBaseName; +- +-version (OldStdPathUnittest) unittest +-{ +- debug(path) printf("path.basename.unittest\n"); +- string result; +- +- version (Windows) +- result = basename("d:\\path\\foo.bat"); +- version (Posix) +- result = basename("/path/foo.bat"); +- //printf("result = '%.*s'\n", result); +- assert(result == "foo.bat"); +- +- version (Windows) +- result = basename("a\\b"); +- version (Posix) +- result = basename("a/b"); +- assert(result == "b"); +- +- version (Windows) +- result = basename("a\\b.cde", ".cde"); +- version (Posix) +- result = basename("a/b.cde", ".cde"); +- assert(result == "b"); +- +- version (Windows) +- { +- assert(basename("abc/xyz") == "xyz"); +- assert(basename("abc/") == ""); +- assert(basename("C:/a/b") == "b"); +- assert(basename(`C:\a/b`) == "b"); +- } +- +- assert(basename("~/dmd.conf"w, ".conf"d) == "dmd"); +- assert(basename("~/dmd.conf"d, ".conf"d) == "dmd"); +- assert(basename("dmd.conf"w.dup, ".conf"d.dup) == "dmd"); +-} +- +-/*************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF dirName) instead.) +- * +- * Extracts the directory part of a path. +- * +- * This function will search $(D fullname) from the end until the +- * first path separator or first character of $(D fullname) is +- * reached. Under Windows, the drive letter separator ($(I colon)) +- * also terminates the search. +- * +- * Returns: If a path separator was found, all the characters to its +- * left without any trailing path separators are returned. Otherwise, +- * $(D ".") is returned. +- * +- * The found path separator will be included in the returned string +- * if and only if it represents the root. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * assert(dirname(r"d:\path\foo.bat") == r"d:\path"); +- * assert(dirname(r"d:\path") == r"d:\"); +- * assert(dirname("d:foo.bat") == "d:."); +- * assert(dirname("foo.bat") == "."); +- * } +- * version(Posix) +- * { +- * assert(dirname("/home/user") == "/home"); +- * assert(dirname("/home") == "/"); +- * assert(dirname("user") == "."); +- * } +- * ----- +- */ +- +-Char[] dirname(Char)(Char[] fullname) +- if (isSomeChar!Char) +-{ +- alias immutable(Char)[] ImmString; +- Char[] s = fullname; +- +- version (Posix) +- { +- enum ImmString sep = .sep; +- enum ImmString curdir = .curdir; +- +- for (; !s.empty; s.popBack) +- { +- if (s.endsWith(sep)) +- break; +- } +- if (s.empty) +- { +- return to!(Char[])(curdir); +- } +- +- // remove excess non-root slashes: "/home//" --> "/home" +- while (s.length > sep.length && s.endsWith(sep)) +- { +- s.popBack; +- } +- return s; +- } +- else version (Windows) +- { +- enum ImmString sep = .sep; +- enum ImmString altsep = .altsep; +- enum ImmString curdir = .curdir; +- enum ImmString drvsep = ":"; +- +- bool foundSep; +- for (; !s.empty; s.popBack) +- { +- if (uint withWhat = s.endsWith(sep, altsep, drvsep)) +- { +- foundSep = (withWhat != 3); +- break; +- } +- } +- if (!foundSep) +- { +- return to!(Char[])(s.empty ? curdir : s ~ curdir); +- } +- +- // remove excess non-root separators: "C:\\" --> "C:\" +- while (s.endsWith(sep) || s.endsWith(altsep)) +- { +- auto ss = s.save; +- s.popBack; +- if (s.empty || s.endsWith(drvsep)) +- { +- s = ss; // preserve path separator representing root +- break; +- } +- } +- return s; +- } +- else // unknown platform +- { +- static assert(0); +- } +-} +- +-version (OldStdPathUnittest) unittest +-{ +- assert(dirname("") == "."); +- assert(dirname("fileonly") == "."); +- +- version (Posix) +- { +- assert(dirname("/path/to/file") == "/path/to"); +- assert(dirname("/home") == "/"); +- +- assert(dirname("/dev/zero"w) == "/dev"); +- assert(dirname("/dev/null"d) == "/dev"); +- assert(dirname(".login"w.dup) == "."); +- assert(dirname(".login"d.dup) == "."); +- +- // doc example +- assert(dirname("/home/user") == "/home"); +- assert(dirname("/home") == "/"); +- assert(dirname("user") == "."); +- } +- version (Windows) +- { +- assert(dirname(r"\path\to\file") == r"\path\to"); +- assert(dirname(r"\foo") == r"\"); +- assert(dirname(r"c:\foo") == r"c:\"); +- +- assert(dirname("\\Windows"w) == "\\"); +- assert(dirname("\\Users"d) == "\\"); +- assert(dirname("ntuser.dat"w.dup) == "."); +- assert(dirname("ntuser.dat"d.dup) == "."); +- +- // doc example +- assert(dirname(r"d:\path\foo.bat") == r"d:\path"); +- assert(dirname(r"d:\path") == "d:\\"); +- assert(dirname("d:foo.bat") == "d:."); +- assert(dirname("foo.bat") == "."); +- } +- +- { +- // fixed-length strings +- char[4] u = "abcd"; +- wchar[4] w = "abcd"; +- dchar[4] d = "abcd"; +- assert(dirname(u) == "."); +- assert(dirname(w) == "."w); +- assert(dirname(d) == "."d); +- } +-} +- +-/* * Alias for $(D_PARAM dirname), kept for backward +- * compatibility. New code should use $(D_PARAM dirname). */ +-alias dirname getDirName; +- +-version (OldStdPathUnittest) unittest +-{ +- string filename = "foo/bar"; +- auto d = getDirName(filename); +- assert(d == "foo"); +-} +- +-version (OldStdPathUnittest) unittest // dirname + basename +-{ +- static immutable Common_dirbasename_testcases = +- [ +- [ "/usr/lib" , "/usr" , "lib" ], +- [ "/usr/" , "/usr" , "" ], +- [ "/usr" , "/" , "usr" ], +- [ "/" , "/" , "" ], +- +- [ "var/run" , "var" , "run" ], +- [ "var/" , "var" , "" ], +- [ "var" , "." , "var" ], +- [ "." , "." , "." ], +- +- [ "/usr///lib", "/usr" , "lib" ], +- [ "///usr///" , "///usr" , "" ], +- [ "///usr" , "/" , "usr" ], +- [ "///" , "/" , "" ], +- [ "var///run" , "var" , "run" ], +- [ "var///" , "var" , "" ], +- +- [ "a/b/c" , "a/b" , "c" ], +- [ "a///c" , "a" , "c" ], +- [ "/\u7A74" , "/" , "\u7A74" ], +- [ "/\u7A74/." , "/\u7A74", "." ] +- ]; +- +- static immutable Windows_dirbasename_testcases = +- Common_dirbasename_testcases ~ +- [ +- [ "C:\\Users\\7mi", "C:\\Users", "7mi" ], +- [ "C:\\Users\\" , "C:\\Users", "" ], +- [ "C:\\Users" , "C:\\" , "Users" ], +- [ "C:\\" , "C:\\" , "" ], +- +- [ "C:Temp" , "C:." , "Temp" ], +- [ "C:" , "C:." , "" ], +- [ "\\dmd\\src" , "\\dmd" , "src" ], +- [ "\\dmd\\" , "\\dmd" , "" ], +- [ "\\dmd" , "\\" , "dmd" ], +- +- [ "C:/Users/7mi" , "C:/Users" , "7mi" ], +- [ "C:/Users/" , "C:/Users" , "" ], +- [ "C:/Users" , "C:/" , "Users" ], +- [ "C:/" , "C:/" , "" ], +- +- [ "C:\\//WinNT" , "C:\\" , "WinNT" ], +- [ "C://\\WinNT" , "C:/" , "WinNT" ], +- +- [ `a\b\c` , `a\b` , "c" ], +- [ `a\\\c` , "a" , "c" ] +- ]; +- +- version (Windows) +- alias Windows_dirbasename_testcases testcases; +- else +- alias Common_dirbasename_testcases testcases; +- +- foreach (tc; testcases) +- { +- string path = tc[0]; +- string dir = tc[1]; +- string base = tc[2]; +- +- assert(path.dirname == dir); +- assert(path.basename == base); +- } +-} +- +- +-/********************************* +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF driveName) instead.) +- * +- * Extracts the drive letter of a path. +- * +- * This function will search fullname for a colon from the beginning. +- * +- * Returns: If a colon is found, all the characters to its left +- * plus the colon are returned. Otherwise, null is returned. +- * +- * Under Linux, this function always returns null immediately. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * getDrive(r"d:\path\foo.bat") => "d:" +- * ----- +- */ +- +-Char[] getDrive(Char)(Char[] fullname) if (isSomeChar!Char) +-// out(result) +-// { +-// assert(result.length <= fullname.length); +-// } +-body +-{ +- version(Windows) +- { +- foreach (i; 0 .. fullname.length) +- { +- if (fullname[i] == ':') +- return fullname[0 .. i + 1]; +- } +- return null; +- } +- else version(Posix) +- { +- return null; +- } +- else +- { +- static assert(0); +- } +-} +- +-/***************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF defaultExtension) instead.) +- * +- * Appends a default extension to a filename. +- * +- * This function first searches filename for an extension and +- * appends ext if there is none. ext should not have any leading +- * dots, one will be inserted between filename and ext if filename +- * doesn't already end with one. +- * +- * Returns: filename if it contains an extension, otherwise filename +- * + ext. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * defaultExt("foo.txt", "raw") => "foo.txt" +- * defaultExt("foo.", "raw") => "foo.raw" +- * defaultExt("bar", "raw") => "bar.raw" +- * ----- +- */ +- +-string defaultExt()(string filename, string ext) +-{ +- string existing; +- +- existing = getExt(filename); +- if (existing.length == 0) +- { +- // Check for filename ending in '.' +- if (filename.length && filename[$ - 1] == '.') +- filename ~= ext; +- else +- filename = filename ~ "." ~ ext; +- } +- return filename; +-} +- +- +-/***************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF setExtension) instead.) +- * +- * Adds or replaces an extension to a filename. +- * +- * This function first searches filename for an extension and +- * replaces it with ext if found. If there is no extension, ext +- * will be appended. ext should not have any leading dots, one will +- * be inserted between filename and ext if filename doesn't already +- * end with one. +- * +- * Returns: filename + ext if filename is extensionless. Otherwise +- * strips filename's extension off, appends ext and returns the +- * result. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * addExt("foo.txt", "raw") => "foo.raw" +- * addExt("foo.", "raw") => "foo.raw" +- * addExt("bar", "raw") => "bar.raw" +- * ----- +- */ +- +-string addExt()(string filename, string ext) +-{ +- string existing; +- +- existing = getExt(filename); +- if (existing.length == 0) +- { +- // Check for filename ending in '.' +- if (filename.length && filename[$ - 1] == '.') +- filename ~= ext; +- else +- filename = filename ~ "." ~ ext; +- } +- else +- { +- filename = filename[0 .. $ - existing.length] ~ ext; +- } +- return filename; +-} +- +- +-/************************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF isAbsolute) instead.) +- * +- * Checks if path is absolute. +- * +- * Returns: non-zero if the path starts from the root directory (Linux) or +- * drive letter and root directory (Windows), +- * zero otherwise. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * isabs(r"relative\path") => 0 +- * isabs(r"\relative\path") => 0 +- * isabs(r"d:\absolute") => 1 +- * } +- * version(Posix) +- * { +- * isabs("/home/user") => 1 +- * isabs("foo") => 0 +- * } +- * ----- +- */ +- +-bool isabs()(in char[] path) +-{ +- auto d = getDrive(path); +- version (Windows) +- { +- return d.length < path.length && isSep(path[d.length]); +- } +- else version (Posix) +- { +- return d.length < path.length && isSep(path[d.length]); +- } +- else +- { +- static assert(0); +- } +-} +- +-version (OldStdPathUnittest) unittest +-{ +- debug(path) printf("path.isabs.unittest\n"); +- +- version (Windows) +- { +- assert(!isabs(r"relative\path")); +- assert(isabs(r"\relative\path")); +- assert(isabs(r"d:\absolute")); +- } +- version (Posix) +- { +- assert(isabs("/home/user")); +- assert(!isabs("foo")); +- } +-} +- +-/** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF absolutePath) instead.) +- * +- * Converts a relative path into an absolute path. +- */ +-string rel2abs()(string path) +-{ +- if (!path.length || isabs(path)) +- { +- return path; +- } +- auto myDir = getcwd; +- if (path.startsWith(curdir)) +- { +- auto p = path[curdir.length .. $]; +- if (p.startsWith(sep)) +- path = p[sep.length .. $]; +- else if (altsep.length && p.startsWith(altsep)) +- path = p[altsep.length .. $]; +- else if (!p.length) +- path = null; +- } +- return myDir.endsWith(sep) || path.length +- ? join(myDir, path) +- : myDir; +-} +- +-version (OldStdPathUnittest) unittest +-{ +- version (Posix) +- { +- auto myDir = getcwd(); +- scope(exit) std.file.chdir(myDir); +- std.file.chdir("/"); +- assert(rel2abs(".") == "/", rel2abs(".")); +- assert(rel2abs("bin") == "/bin", rel2abs("bin")); +- assert(rel2abs("./bin") == "/bin", rel2abs("./bin")); +- std.file.chdir("bin"); +- assert(rel2abs(".") == "/bin", rel2abs(".")); +- } +-} +- +-/************************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF buildPath) instead.) +- * +- * Joins two or more path components. +- * +- * If p1 doesn't have a trailing path separator, one will be appended +- * to it before concatenating p2. +- * +- * Returns: p1 ~ p2. However, if p2 is an absolute path, only p2 +- * will be returned. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * join(r"c:\foo", "bar") => r"c:\foo\bar" +- * join("foo", r"d:\bar") => r"d:\bar" +- * } +- * version(Posix) +- * { +- * join("/foo/", "bar") => "/foo/bar" +- * join("/foo", "/bar") => "/bar" +- * } +- * ----- +- */ +- +-string join()(const(char)[] p1, const(char)[] p2, const(char[])[] more...) +-{ +- if (more.length) +- { +- // more than two components present +- return join(join(p1, p2), more[0], more[1 .. $]); +- } +- +- // Focus on exactly two components +- if (!p2.length) +- return p1.idup; +- if (!p1.length) +- return p2.idup; +- +- version (Posix) +- { +- if (isabs(p2)) return p2.idup; +- if (p1.endsWith(sep) || altsep.length && p1.endsWith(altsep)) +- { +- return cast(string) (p1 ~ p2); +- } +- return cast(string) (p1 ~ sep ~ p2); +- } +- else version (Windows) +- { +- string p; +- const(char)[] d1; +- +- if (getDrive(p2)) +- { +- p = p2.idup; +- } +- else +- { +- d1 = getDrive(p1); +- if (p1.length == d1.length) +- { +- p = cast(string) (p1 ~ p2); +- } +- else if (isSep(p2[0])) +- { +- if (d1.length == 0) +- p = p2.idup; +- else if (isSep(p1[$ - 1])) +- p = cast(string) (p1 ~ p2[1 .. $]); +- else +- p = cast(string) (p1 ~ p2); +- } +- else if (isSep(p1[$ - 1])) +- { +- p = cast(string) (p1 ~ p2); +- } +- else +- { +- p = cast(string)(p1 ~ sep ~ p2); +- } +- } +- return p; +- } +- else // unknown platform +- { +- static assert(0); +- } +-} +- +-version (OldStdPathUnittest) unittest +-{ +- debug(path) printf("path.join.unittest\n"); +- +- string p; +- ptrdiff_t i; +- +- p = join("foo", "bar"); +- version (Windows) +- i = cmp(p, "foo\\bar"); +- version (Posix) +- i = cmp(p, "foo/bar"); +- assert(i == 0); +- +- version (Windows) +- { p = join("foo\\", "bar"); +- i = cmp(p, "foo\\bar"); +- } +- version (Posix) +- { p = join("foo/", "bar"); +- i = cmp(p, "foo/bar"); +- } +- assert(i == 0); +- +- version (Windows) +- { p = join("foo", "\\bar"); +- i = cmp(p, "\\bar"); +- } +- version (Posix) +- { p = join("foo", "/bar"); +- i = cmp(p, "/bar"); +- } +- assert(i == 0); +- +- version (Windows) +- { p = join("foo\\", "\\bar"); +- i = cmp(p, "\\bar"); +- } +- version (Posix) +- { p = join("foo/", "/bar"); +- i = cmp(p, "/bar"); +- } +- assert(i == 0); +- +- version(Windows) +- { +- p = join("d:", "bar"); +- i = cmp(p, "d:bar"); +- assert(i == 0); +- +- p = join("d:\\", "bar"); +- i = cmp(p, "d:\\bar"); +- assert(i == 0); +- +- p = join("d:\\", "\\bar"); +- i = cmp(p, "d:\\bar"); +- assert(i == 0); +- +- p = join("d:\\foo", "bar"); +- i = cmp(p, "d:\\foo\\bar"); +- assert(i == 0); +- +- p = join("d:", "\\bar"); +- i = cmp(p, "d:\\bar"); +- assert(i == 0); +- +- p = join("foo", "d:"); +- i = cmp(p, "d:"); +- assert(i == 0); +- +- p = join("foo", "d:\\"); +- i = cmp(p, "d:\\"); +- assert(i == 0); +- +- p = join("foo", "d:\\bar"); +- i = cmp(p, "d:\\bar"); +- assert(i == 0); +- +- assert(join("d","dmd","src") == "d\\dmd\\src"); +- } +- +- assert (join("", "foo") == "foo"); +- assert (join("foo", "") == "foo"); +-} +- +-unittest +-{ +- // 7397 +- string[] ary = ["a", "b"]; +- version (Posix) +- { +- assert (join("x", "y", ary) == "x/y/a/b"); +- } +- else version (Windows) +- { +- assert (join("x", "y", ary) == `x\y\a\b`); +- } +-} +- +-/********************************** +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF filenameCharCmp) instead.) +- * +- * Matches filename characters. +- * +- * Under Windows, the comparison is done ignoring case. Under Linux +- * an exact match is performed. +- * +- * Returns: non zero if c1 matches c2, zero otherwise. +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * fncharmatch('a', 'b') => 0 +- * fncharmatch('A', 'a') => 1 +- * } +- * version(Posix) +- * { +- * fncharmatch('a', 'b') => 0 +- * fncharmatch('A', 'a') => 0 +- * } +- * ----- +- */ +- +-bool fncharmatch()(dchar c1, dchar c2) +-{ +- version (Windows) +- { +- if (c1 != c2) +- { +- if ('A' <= c1 && c1 <= 'Z') +- c1 += cast(char)'a' - 'A'; +- if ('A' <= c2 && c2 <= 'Z') +- c2 += cast(char)'a' - 'A'; +- return c1 == c2; +- } +- return true; +- } +- else version (Posix) +- { +- return c1 == c2; +- } +- else +- { +- static assert(0); +- } +-} +- +-/************************************* +- * $(RED Deprecated. It will be removed in October 2012. Please use +- * $(LREF globMatch) instead.) +- * +- * Matches a pattern against a filename. +- * +- * Some characters of pattern have special a meaning (they are +- * meta-characters) and can't be escaped. These are: +- *

+- * +- * +- * +- * +- * +- * +- * +- * +- *
*Matches 0 or more instances of any character.
?Matches exactly one instances of any character.
[chars]Matches one instance of any character that appears +- * between the brackets.
[!chars]Matches one instance of any character that does not appear +- * between the brackets after the exclamation mark.

+- * Internally individual character comparisons are done calling +- * fncharmatch(), so its rules apply here too. Note that path +- * separators and dots don't stop a meta-character from matching +- * further portions of the filename. +- * +- * Returns: non zero if pattern matches filename, zero otherwise. +- * +- * See_Also: fncharmatch(). +- * +- * Throws: Nothing. +- * +- * Examples: +- * ----- +- * version(Windows) +- * { +- * fnmatch("foo.bar", "*") => 1 +- * fnmatch(r"foo/foo\bar", "f*b*r") => 1 +- * fnmatch("foo.bar", "f?bar") => 0 +- * fnmatch("Goo.bar", "[fg]???bar") => 1 +- * fnmatch(r"d:\foo\bar", "d*foo?bar") => 1 +- * } +- * version(Posix) +- * { +- * fnmatch("Go*.bar", "[fg]???bar") => 0 +- * fnmatch("/foo*home/bar", "?foo*bar") => 1 +- * fnmatch("foobar", "foo?bar") => 1 +- * } +- * ----- +- */ +-bool fnmatch()(const(char)[] filename, const(char)[] pattern) +-in +-{ +- // Verify that pattern[] is valid +- assert(balancedParens(pattern, '[', ']', 0)); +- assert(balancedParens(pattern, '{', '}', 0)); +-} +-body +-{ +- size_t ni; // current character in filename +- +- foreach (pi; 0 .. pattern.length) +- { +- char pc = pattern[pi]; +- switch (pc) +- { +- case '*': +- if (pi + 1 == pattern.length) +- return true; +- foreach (j; ni .. filename.length) +- { +- if (fnmatch(filename[j .. $], +- pattern[pi + 1 .. $])) +- return true; +- } +- return false; +- +- case '?': +- if (ni == filename.length) +- return false; +- ni++; +- break; +- +- case '[': { +- if (ni == filename.length) +- return false; +- auto nc = filename[ni]; +- ni++; +- auto not = false; +- pi++; +- if (pattern[pi] == '!') +- { +- not = true; +- pi++; +- } +- auto anymatch = false; +- while (1) +- { +- pc = pattern[pi]; +- if (pc == ']') +- break; +- if (!anymatch && fncharmatch(nc, pc)) +- anymatch = true; +- pi++; +- } +- if (anymatch == not) +- return false; +- } +- break; +- +- case '{': { +- // find end of {} section +- auto piRemain = pi; +- for (; piRemain < pattern.length +- && pattern[piRemain] != '}'; piRemain++) +- {} +- +- if (piRemain < pattern.length) piRemain++; +- pi++; +- +- while (pi < pattern.length) +- { +- auto pi0 = pi; +- pc = pattern[pi]; +- // find end of current alternative +- for (; pi= us1); +- assert(ms2 >= ms1); +- assert(s2 >= s1); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +- +- /** A low-cost, low-resolution performance counter +- +- This class provides low-resolution, but low-latency, performance monitoring. +- +- This class is available only on Windows, but +- is guaranteed to be meaningful on all Windows operating systems. +- */ +- class TickCounter +- { +- private: +- alias long epoch_type; +- public: +- /** The interval type +- +- The type of the interval measurement (generally a 64-bit signed integer) +- */ +- alias long interval_t; +- +- deprecated alias interval_t interval_type; +- +- public: +- +- public: +- /** Starts measurement +- +- Begins a measurement period +- */ +- void start() +- { +- m_start = GetTickCount(); +- } +- +- /** Ends measurement +- +- Marks the end of a measurement period. +- This must be called before querying the elapsed time with +- $(D_PARAM period_count), $(D_PARAM seconds), +- $(D_PARAM milliseconds), or $(D_PARAM microseconds). +- +- The $(D_PARAM stop()) method may be called multiple times without an intervening $(D_PARAM start()). +- Elapsed time is always measured from most recent $(D_PARAM start()) to the most recent +- $(D_PARAM stop()). +- */ +- void stop() +- { +- m_end = GetTickCount(); +- } +- +- public: +- /** +- The elapsed count in the measurement period +- +- This represents the extent, in machine-specific increments, of the measurement period +- */ +- interval_t periodCount() const +- { +- return m_end - m_start; +- } +- +- /** The number of whole seconds in the measurement period +- +- This represents the extent, in whole seconds, of the measurement period +- */ +- interval_t seconds() const +- { +- return periodCount() / 1000; +- } +- +- /** The number of whole milliseconds in the measurement period +- +- This represents the extent, in whole milliseconds, of the measurement period +- */ +- interval_t milliseconds() const +- { +- return periodCount(); +- } +- +- /** The number of whole microseconds in the measurement period +- +- This represents the extent, in whole microseconds, of the measurement period +- */ +- interval_t microseconds() const +- { +- return periodCount() * 1000; +- } +- +- private: +- uint m_start; // start of measurement period +- uint m_end; // End of measurement period +- } +- +- unittest +- { +- alias TickCounter counter_type; +- +- counter_type counter = new counter_type(); +- +- counter.start(); +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us1 = counter.microseconds(); +- counter_type.interval_t ms1 = counter.milliseconds(); +- counter_type.interval_t s1 = counter.seconds(); +- +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us2 = counter.microseconds(); +- counter_type.interval_t ms2 = counter.milliseconds(); +- counter_type.interval_t s2 = counter.seconds(); +- +- assert(us2 >= us1); +- assert(ms2 >= ms1); +- assert(s2 >= s1); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +- +- /** A performance counter that provides thread-specific performance timings +- +- This class uses the operating system's performance monitoring facilities to provide timing +- information pertaining to the calling thread only, irrespective of the activities of other +- threads on the system. This class does not provide meaningful timing information on operating +- systems that do not provide thread-specific monitoring. +- +- This class is available only on Windows. +- */ +- class ThreadTimesCounter +- { +- private: +- alias long epoch_type; +- public: +- /** The interval type +- +- The type of the interval measurement (generally a 64-bit signed integer) +- */ +- alias long interval_t; +- +- deprecated alias interval_t interval_type; +- +- public: +- /** Constructor +- +- Creates an instance of the class, and caches the thread token so that measurements will +- be taken with respect to the thread in which the class was created. +- */ +- this() +- { +- m_thread = GetCurrentThread(); +- } +- +- public: +- /** Starts measurement +- +- Begins a measurement period +- */ +- void start() +- { +- FILETIME creationTime; +- FILETIME exitTime; +- +- GetThreadTimes(m_thread, &creationTime, &exitTime, cast(FILETIME*)&m_kernelStart, cast(FILETIME*)&m_userStart); +- } +- +- /** Ends measurement +- +- Marks the end of a measurement period. +- This must be called before querying the elapsed time with +- $(D_PARAM period_count), $(D_PARAM seconds), +- $(D_PARAM milliseconds), or $(D_PARAM microseconds). +- +- The $(D_PARAM stop()) method may be called multiple times without an intervening $(D_PARAM start()). +- Elapsed time is always measured from most recent $(D_PARAM start()) to the most recent +- $(D_PARAM stop()). +- */ +- void stop() +- { +- FILETIME creationTime; +- FILETIME exitTime; +- +- GetThreadTimes(m_thread, &creationTime, &exitTime, cast(FILETIME*)&m_kernelEnd, cast(FILETIME*)&m_userEnd); +- } +- +- +- public: +- +- /** The elapsed count in the measurement period for kernel mode activity +- +- This represents the extent, in machine-specific increments, of the measurement period for kernel mode activity +- */ +- interval_t kernelPeriodCount() const +- { +- return m_kernelEnd - m_kernelStart; +- } +- /** The number of whole seconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole seconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelSeconds() const +- { +- return kernelPeriodCount() / 10000000; +- } +- /** The number of whole milliseconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole milliseconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelMilliseconds() const +- { +- return kernelPeriodCount() / 10000; +- } +- /** The number of whole microseconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole microseconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelMicroseconds() const +- { +- return kernelPeriodCount() / 10; +- } +- +- +- /** The elapsed count in the measurement period for user mode activity +- +- This represents the extent, in machine-specific increments, of the measurement period for user mode activity +- */ +- interval_t userPeriodCount() const +- { +- return m_userEnd - m_userStart; +- } +- /** The number of whole seconds in the measurement period for user mode activity +- +- This represents the extent, in whole seconds, of the measurement period for user mode activity +- */ +- interval_t userSeconds() const +- { +- return userPeriodCount() / 10000000; +- } +- /** The number of whole milliseconds in the measurement period for user mode activity +- +- This represents the extent, in whole milliseconds, of the measurement period for user mode activity +- */ +- interval_t userMilliseconds() const +- { +- return userPeriodCount() / 10000; +- } +- /** The number of whole microseconds in the measurement period for user mode activity +- +- This represents the extent, in whole microseconds, of the measurement period for user mode activity +- */ +- interval_t userMicroseconds() const +- { +- return userPeriodCount() / 10; +- } +- +- +- /** The elapsed count in the measurement period +- +- This represents the extent, in machine-specific increments, of the measurement period +- */ +- interval_t periodCount() const +- { +- return kernelPeriodCount() + userPeriodCount(); +- } +- +- /** The number of whole seconds in the measurement period +- +- This represents the extent, in whole seconds, of the measurement period +- */ +- interval_t seconds() const +- { +- return periodCount() / 10000000; +- } +- +- /** The number of whole milliseconds in the measurement period +- +- This represents the extent, in whole milliseconds, of the measurement period +- */ +- interval_t milliseconds() const +- { +- return periodCount() / 10000; +- } +- +- /** The number of whole microseconds in the measurement period +- +- This represents the extent, in whole microseconds, of the measurement period +- */ +- interval_t microseconds() const +- { +- return periodCount() / 10; +- } +- +- +- private: +- epoch_type m_kernelStart; +- epoch_type m_kernelEnd; +- epoch_type m_userStart; +- epoch_type m_userEnd; +- HANDLE m_thread; +- } +- +- unittest +- { +- alias ThreadTimesCounter counter_type; +- +- counter_type counter = new counter_type(); +- +- counter.start(); +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us1 = counter.microseconds(); +- counter_type.interval_t ms1 = counter.milliseconds(); +- counter_type.interval_t s1 = counter.seconds(); +- +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us2 = counter.microseconds(); +- counter_type.interval_t ms2 = counter.milliseconds(); +- counter_type.interval_t s2 = counter.seconds(); +- +- assert(us2 >= us1); +- assert(ms2 >= ms1); +- assert(s2 >= s1); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +- +- /** A performance counter that provides process-specific performance timings +- +- This class uses the operating system's performance monitoring facilities to provide timing +- information pertaining to the calling process only, irrespective of the activities of other +- processes on the system. This class does not provide meaningful timing information on operating +- systems that do not provide process-specific monitoring. +- +- This class is available only on Windows. +- */ +- class ProcessTimesCounter +- { +- private: +- alias long epoch_type; +- public: +- /** The interval type +- +- The type of the interval measurement (generally a 64-bit signed integer) +- */ +- alias long interval_t; +- +- deprecated alias interval_t interval_type; +- +- private: +- /** Class constructor +- +- */ +- shared static this() +- { +- sm_process = GetCurrentProcess(); +- } +- +- public: +- /** Starts measurement +- +- Begins a measurement period +- */ +- void start() +- { +- FILETIME creationTime; +- FILETIME exitTime; +- +- GetProcessTimes(sm_process, &creationTime, &exitTime, cast(FILETIME*)&m_kernelStart, cast(FILETIME*)&m_userStart); +- } +- +- /** Ends measurement +- +- Marks the end of a measurement period. +- This must be called before querying the elapsed time with +- $(D_PARAM period_count), $(D_PARAM seconds), +- $(D_PARAM milliseconds), or $(D_PARAM microseconds). +- +- The $(D_PARAM stop()) method may be called multiple times without an intervening $(D_PARAM start()). +- Elapsed time is always measured from most recent $(D_PARAM start()) to the most recent +- $(D_PARAM stop()). +- */ +- void stop() +- { +- FILETIME creationTime; +- FILETIME exitTime; +- +- GetProcessTimes(sm_process, &creationTime, &exitTime, cast(FILETIME*)&m_kernelEnd, cast(FILETIME*)&m_userEnd); +- } +- +- public: +- /** The elapsed count in the measurement period for kernel mode activity +- +- This represents the extent, in machine-specific increments, of the measurement period for kernel mode activity +- */ +- interval_t kernelPeriodCount() const +- { +- return m_kernelEnd - m_kernelStart; +- } +- /** The number of whole seconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole seconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelSeconds() const +- { +- return kernelPeriodCount() / 10000000; +- } +- /** The number of whole milliseconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole milliseconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelMilliseconds() const +- { +- return kernelPeriodCount() / 10000; +- } +- /** The number of whole microseconds in the measurement period for kernel mode activity +- +- This represents the extent, in whole microseconds, of the measurement period for kernel mode activity +- */ +- interval_t kernelMicroseconds() const +- { +- return kernelPeriodCount() / 10; +- } +- +- +- /** The elapsed count in the measurement period for user mode activity +- +- This represents the extent, in machine-specific increments, of the measurement period for user mode activity +- */ +- interval_t userPeriodCount() const +- { +- return m_userEnd - m_userStart; +- } +- /** The number of whole seconds in the measurement period for user mode activity +- +- This represents the extent, in whole seconds, of the measurement period for user mode activity +- */ +- interval_t userSeconds() const +- { +- return userPeriodCount() / 10000000; +- } +- /** The number of whole milliseconds in the measurement period for user mode activity +- +- This represents the extent, in whole milliseconds, of the measurement period for user mode activity +- */ +- interval_t userMilliseconds() const +- { +- return userPeriodCount() / 10000; +- } +- /** The number of whole microseconds in the measurement period for user mode activity +- +- This represents the extent, in whole microseconds, of the measurement period for user mode activity +- */ +- interval_t userMicroseconds() const +- { +- return userPeriodCount() / 10; +- } +- +- /** The elapsed count in the measurement period +- +- This represents the extent, in machine-specific increments, of the measurement period +- */ +- interval_t periodCount() const +- { +- return kernelPeriodCount() + userPeriodCount(); +- } +- +- /** The number of whole seconds in the measurement period +- +- This represents the extent, in whole seconds, of the measurement period +- */ +- interval_t seconds() const +- { +- return periodCount() / 10000000; +- } +- +- /** The number of whole milliseconds in the measurement period +- +- This represents the extent, in whole milliseconds, of the measurement period +- */ +- interval_t milliseconds() const +- { +- return periodCount() / 10000; +- } +- +- /** The number of whole microseconds in the measurement period +- +- This represents the extent, in whole microseconds, of the measurement period +- */ +- interval_t microseconds() const +- { +- return periodCount() / 10; +- } +- +- private: +- epoch_type m_kernelStart; +- epoch_type m_kernelEnd; +- epoch_type m_userStart; +- epoch_type m_userEnd; +- __gshared HANDLE sm_process; +- } +- +- unittest +- { +- alias ProcessTimesCounter counter_type; +- +- counter_type counter = new counter_type(); +- +- counter.start(); +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us1 = counter.microseconds(); +- counter_type.interval_t ms1 = counter.milliseconds(); +- counter_type.interval_t s1 = counter.seconds(); +- +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us2 = counter.microseconds(); +- counter_type.interval_t ms2 = counter.milliseconds(); +- counter_type.interval_t s2 = counter.seconds(); +- +- assert(us2 >= us1); +- assert(ms2 >= ms1); +- assert(s2 >= s1); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +-} +-else version(Posix) +-{ +- extern (C) +- { +- private struct timeval +- { +- int tv_sec; // The number of seconds, since Jan. 1, 1970, in the time value. +- int tv_usec; // The number of microseconds in the time value. +- }; +- private struct timezone +- { +- int tz_minuteswest; // minutes west of Greenwich. +- int tz_dsttime; // type of dst corrections to apply. +- }; +- private void gettimeofday(timeval *tv, timezone *tz); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +- +- class PerformanceCounter +- { +- // documentation is in the Windows version of the class above +- +- +- private: +- alias timeval epoch_type; +- public: +- alias long interval_t; +- +- public: +- void start() +- { +- timezone tz; +- +- gettimeofday(&m_start, &tz); +- } +- +- void stop() +- { +- timezone tz; +- +- gettimeofday(&m_end, &tz); +- } +- +- public: +- interval_t periodCount() const +- { +- return microseconds(); +- } +- +- interval_t seconds() const +- { +- interval_t start = cast(interval_t)m_start.tv_sec + cast(interval_t)m_start.tv_usec / (1000 * 1000); +- interval_t end = cast(interval_t)m_end.tv_sec + cast(interval_t)m_end.tv_usec / (1000 * 1000); +- +- return end - start; +- } +- +- interval_t milliseconds() const +- { +- interval_t start = cast(interval_t)m_start.tv_sec * 1000 + cast(interval_t)m_start.tv_usec / 1000; +- interval_t end = cast(interval_t)m_end.tv_sec * 1000 + cast(interval_t)m_end.tv_usec / 1000; +- +- return end - start; +- } +- +- interval_t microseconds() const +- { +- interval_t start = cast(interval_t)m_start.tv_sec * 1000 * 1000 + cast(interval_t)m_start.tv_usec; +- interval_t end = cast(interval_t)m_end.tv_sec * 1000 * 1000 + cast(interval_t)m_end.tv_usec; +- +- return end - start; +- } +- +- private: +- epoch_type m_start; // start of measurement period +- epoch_type m_end; // End of measurement period +- } +- +- unittest +- { +- alias PerformanceCounter counter_type; +- +- counter_type counter = new counter_type(); +- +- counter.start(); +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us1 = counter.microseconds(); +- counter_type.interval_t ms1 = counter.milliseconds(); +- counter_type.interval_t s1 = counter.seconds(); +- +- for(int i = 0; i < 10000000; ++i) +- { } +- counter.stop(); +- +- counter_type.interval_t us2 = counter.microseconds(); +- counter_type.interval_t ms2 = counter.milliseconds(); +- counter_type.interval_t s2 = counter.seconds(); +- +- assert(us2 >= us1); +- assert(ms2 >= ms1); +- assert(s2 >= s1); +- } +- +- /* ////////////////////////////////////////////////////////////////////////// */ +-} +-else +-{ +- const int platform_not_supported = 0; +- +- static assert(platform_not_supported); +-} +--- a/src/libphobos/src/std/process.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/process.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,843 +1,2152 @@ + // Written in the D programming language. + + /** +-Macros: +- +-WIKI=Phobos/StdProcess ++Functions for starting and interacting with other processes, and for ++working with the current _process' execution environment. + +-Copyright: Copyright Digital Mars 2007 - 2009. +-License: Boost License 1.0. +-Authors: $(WEB digitalmars.com, Walter Bright), +- $(WEB erdani.org, Andrei Alexandrescu), +- $(WEB thecybershadow.net, Vladimir Panteleev) +-Source: $(PHOBOSSRC std/_process.d) +-*/ +-/* +- Copyright Digital Mars 2007 - 2009. +-Distributed under the Boost Software License, Version 1.0. +- (See accompanying file LICENSE_1_0.txt or copy at +- http://www.boost.org/LICENSE_1_0.txt) ++Process_handling: ++$(UL $(LI ++ $(LREF spawnProcess) spawns a new _process, optionally assigning it an ++ arbitrary set of standard input, output, and error streams. ++ The function returns immediately, leaving the child _process to execute ++ in parallel with its parent. All other functions in this module that ++ spawn processes are built around $(D spawnProcess).) ++$(LI ++ $(LREF wait) makes the parent _process wait for a child _process to ++ terminate. In general one should always do this, to avoid ++ child processes becoming "zombies" when the parent _process exits. ++ Scope guards are perfect for this – see the $(LREF spawnProcess) ++ documentation for examples. $(LREF tryWait) is similar to $(D wait), ++ but does not block if the _process has not yet terminated.) ++$(LI ++ $(LREF pipeProcess) also spawns a child _process which runs ++ in parallel with its parent. However, instead of taking ++ arbitrary streams, it automatically creates a set of ++ pipes that allow the parent to communicate with the child ++ through the child's standard input, output, and/or error streams. ++ This function corresponds roughly to C's $(D popen) function.) ++$(LI ++ $(LREF execute) starts a new _process and waits for it ++ to complete before returning. Additionally, it captures ++ the _process' standard output and error streams and returns ++ the output of these as a string.) ++$(LI ++ $(LREF spawnShell), $(LREF pipeShell) and $(LREF executeShell) work like ++ $(D spawnProcess), $(D pipeProcess) and $(D execute), respectively, ++ except that they take a single command string and run it through ++ the current user's default command interpreter. ++ $(D executeShell) corresponds roughly to C's $(D system) function.) ++$(LI ++ $(LREF kill) attempts to terminate a running _process.) ++) ++ ++The following table compactly summarises the different _process creation ++functions and how they relate to each other: ++$(BOOKTABLE, ++ $(TR $(TH ) ++ $(TH Runs program directly) ++ $(TH Runs shell command)) ++ $(TR $(TD Low-level _process creation) ++ $(TD $(LREF spawnProcess)) ++ $(TD $(LREF spawnShell))) ++ $(TR $(TD Automatic input/output redirection using pipes) ++ $(TD $(LREF pipeProcess)) ++ $(TD $(LREF pipeShell))) ++ $(TR $(TD Execute and wait for completion, collect output) ++ $(TD $(LREF execute)) ++ $(TD $(LREF executeShell))) ++) ++ ++Other_functionality: ++$(UL ++$(LI ++ $(LREF pipe) is used to create unidirectional pipes.) ++$(LI ++ $(LREF environment) is an interface through which the current _process' ++ environment variables can be read and manipulated.) ++$(LI ++ $(LREF escapeShellCommand) and $(LREF escapeShellFileName) are useful ++ for constructing shell command lines in a portable way.) ++) ++ ++Authors: ++ $(LINK2 https://github.com/kyllingstad, Lars Tandle Kyllingstad), ++ $(LINK2 https://github.com/schveiguy, Steven Schveighoffer), ++ $(WEB thecybershadow.net, Vladimir Panteleev) ++Copyright: ++ Copyright (c) 2013, the authors. All rights reserved. ++Source: ++ $(PHOBOSSRC std/_process.d) ++Macros: ++ WIKI=Phobos/StdProcess ++ OBJECTREF=$(D $(LINK2 object.html#$0,$0)) ++ LREF=$(D $(LINK2 #.$0,$0)) + */ + module std.process; + +- +-import core.stdc.stdlib; +-import std.c.stdlib; +-import core.stdc.errno; +-import core.thread; +-import std.c.process; +-import std.c.string; +- +-import std.array; +-import std.conv; +-import std.exception; +-import std.internal.processinit; +-import std.stdio; +-import std.string; +-import std.typecons; +- ++version (Posix) ++{ ++ import core.stdc.errno; ++ import core.stdc.string; ++ import core.sys.posix.stdio; ++ import core.sys.posix.unistd; ++ import core.sys.posix.sys.wait; ++} + version (Windows) + { +- import std.format, std.random, std.file; ++ import core.stdc.stdio; + import core.sys.windows.windows; + import std.utf; + import std.windows.syserror; + } +-version (Posix) +-{ +- import core.sys.posix.stdlib; +-} +-version (unittest) +-{ +- import std.file, std.conv, std.array, std.random; +- import std.path : absolutePath; +-} ++import std.algorithm; ++import std.array; ++import std.conv; ++import std.exception; ++import std.path; ++import std.stdio; ++import std.string; ++import std.internal.processinit; + + +-// The following is needed for reading/writing environment variables. +-version(Posix) ++// When the DMC runtime is used, we have to use some custom functions ++// to convert between Windows file handles and FILE*s. ++version (Win32) version (DigitalMars) version = DMC_RUNTIME; ++ ++ ++// Some of the following should be moved to druntime. ++private + { +- version(OSX) +- { +- // https://www.gnu.org/software/gnulib/manual/html_node/environ.html +- private extern(C) extern __gshared char*** _NSGetEnviron(); +- __gshared char** environ; + +- // Run in std.__processinit to avoid cyclic construction errors. +- extern(C) void std_process_static_this() ++// Microsoft Visual C Runtime (MSVCRT) declarations. ++version (Windows) ++{ ++ version (DMC_RUNTIME) { } else ++ { ++ import core.stdc.stdint; ++ extern(C) + { +- environ = *_NSGetEnviron(); ++ int _fileno(FILE* stream); ++ HANDLE _get_osfhandle(int fd); ++ int _open_osfhandle(HANDLE osfhandle, int flags); ++ FILE* _fdopen(int fd, const (char)* mode); ++ int _close(int fd); ++ } ++ enum ++ { ++ STDIN_FILENO = 0, ++ STDOUT_FILENO = 1, ++ STDERR_FILENO = 2, ++ } ++ enum ++ { ++ _O_RDONLY = 0x0000, ++ _O_APPEND = 0x0004, ++ _O_TEXT = 0x4000, + } +- } +- else +- { +- // Made available by the C runtime: +- private extern(C) extern __gshared const char** environ; + } + } + +- +-/** +- Execute $(D command) in a _command shell. +- +- Returns: If $(D command) is null, returns nonzero if the _command +- interpreter is found, and zero otherwise. If $(D command) is not +- null, returns -1 on error, or the exit status of command (which may +- in turn signal an error in command's execution). +- +- Note: On Unix systems, the homonym C function (which is accessible +- to D programs as $(LINK2 std_c_process.html, std.c._system)) +- returns a code in the same format as $(LUCKY waitpid, waitpid), +- meaning that C programs must use the $(D WEXITSTATUS) macro to +- extract the actual exit code from the $(D system) call. D's $(D +- system) automatically extracts the exit status. +- +-*/ +- +-int system(string command) ++// POSIX API declarations. ++version (Posix) + { +- if (!command) return std.c.process.system(null); +- const commandz = toStringz(command); +- immutable status = std.c.process.system(commandz); +- if (status == -1) return status; +- version (Posix) ++ version (OSX) + { +- if (exited(status)) +- return exitstatus(status); +- +- // Abnormal termination, return -1. +- return -1; ++ extern(C) char*** _NSGetEnviron() nothrow; ++ private const(char**)* environPtr; ++ extern(C) void std_process_static_this() { environPtr = _NSGetEnviron(); } ++ const(char**) environ() @property @trusted nothrow { return *environPtr; } + } +- else version (Windows) +- return status; + else +- static assert(0, "system not implemented for this OS."); +-} +- +-private void toAStringz(in string[] a, const(char)**az) +-{ +- foreach(string s; a) + { +- *az++ = toStringz(s); ++ // Made available by the C runtime: ++ extern(C) extern __gshared const char** environ; + } +- *az = null; + } + + +-/* ========================================================== */ ++} // private + +-//version (Windows) +-//{ +-// int spawnvp(int mode, string pathname, string[] argv) +-// { +-// char** argv_ = cast(char**)alloca((char*).sizeof * (1 + argv.length)); +-// +-// toAStringz(argv, argv_); +-// +-// return std.c.process.spawnvp(mode, toStringz(pathname), argv_); +-// } +-//} + +-// Incorporating idea (for spawnvp() on Posix) from Dave Fladebo ++// ============================================================================= ++// Functions and classes for process management. ++// ============================================================================= + +-alias std.c.process._P_WAIT P_WAIT; +-alias std.c.process._P_NOWAIT P_NOWAIT; + +-int spawnvp(int mode, string pathname, string[] argv) ++/** ++Spawns a new _process, optionally assigning it an arbitrary set of standard ++input, output, and error streams. ++ ++The function returns immediately, leaving the child _process to execute ++in parallel with its parent. It is recommended to always call $(LREF wait) ++on the returned $(LREF Pid), as detailed in the documentation for $(D wait). ++ ++Command_line: ++There are four overloads of this function. The first two take an array ++of strings, $(D args), which should contain the program name as the ++zeroth element and any command-line arguments in subsequent elements. ++The third and fourth versions are included for convenience, and may be ++used when there are no command-line arguments. They take a single string, ++$(D program), which specifies the program name. ++ ++Unless a directory is specified in $(D args[0]) or $(D program), ++$(D spawnProcess) will search for the program in a platform-dependent ++manner. On POSIX systems, it will look for the executable in the ++directories listed in the PATH environment variable, in the order ++they are listed. On Windows, it will search for the executable in ++the following sequence: ++$(OL ++ $(LI The directory from which the application loaded.) ++ $(LI The current directory for the parent process.) ++ $(LI The 32-bit Windows system directory.) ++ $(LI The 16-bit Windows system directory.) ++ $(LI The Windows directory.) ++ $(LI The directories listed in the PATH environment variable.) ++) ++--- ++// Run an executable called "prog" located in the current working ++// directory: ++auto pid = spawnProcess("./prog"); ++scope(exit) wait(pid); ++// We can do something else while the program runs. The scope guard ++// ensures that the process is waited for at the end of the scope. ++... ++ ++// Run DMD on the file "myprog.d", specifying a few compiler switches: ++auto dmdPid = spawnProcess(["dmd", "-O", "-release", "-inline", "myprog.d" ]); ++if (wait(dmdPid) != 0) ++ writeln("Compilation failed!"); ++--- ++ ++Environment_variables: ++By default, the child process inherits the environment of the parent ++process, along with any additional variables specified in the $(D env) ++parameter. If the same variable exists in both the parent's environment ++and in $(D env), the latter takes precedence. ++ ++If the $(LREF Config.newEnv) flag is set in $(D config), the child ++process will $(I not) inherit the parent's environment. Its entire ++environment will then be determined by $(D env). ++--- ++wait(spawnProcess("myapp", ["foo" : "bar"], Config.newEnv)); ++--- ++ ++Standard_streams: ++The optional arguments $(D stdin), $(D stdout) and $(D stderr) may ++be used to assign arbitrary $(XREF stdio,File) objects as the standard ++input, output and error streams, respectively, of the child process. The ++former must be opened for reading, while the latter two must be opened for ++writing. The default is for the child process to inherit the standard ++streams of its parent. ++--- ++// Run DMD on the file myprog.d, logging any error messages to a ++// file named errors.log. ++auto logFile = File("errors.log", "w"); ++auto pid = spawnProcess(["dmd", "myprog.d"], ++ std.stdio.stdin, ++ std.stdio.stdout, ++ logFile); ++if (wait(pid) != 0) ++ writeln("Compilation failed. See errors.log for details."); ++--- ++ ++Note that if you pass a $(D File) object that is $(I not) ++one of the standard input/output/error streams of the parent process, ++that stream will by default be $(I closed) in the parent process when ++this function returns. See the $(LREF Config) documentation below for ++information about how to disable this behaviour. ++ ++Beware of buffering issues when passing $(D File) objects to ++$(D spawnProcess). The child process will inherit the low-level raw ++read/write offset associated with the underlying file descriptor, but ++it will not be aware of any buffered data. In cases where this matters ++(e.g. when a file should be aligned before being passed on to the ++child process), it may be a good idea to use unbuffered streams, or at ++least ensure all relevant buffers are flushed. ++ ++Params: ++args = An array which contains the program name as the zeroth element ++ and any command-line arguments in the following elements. ++stdin = The standard input stream of the child process. ++ This can be any $(XREF stdio,File) that is opened for reading. ++ By default the child process inherits the parent's input ++ stream. ++stdout = The standard output stream of the child process. ++ This can be any $(XREF stdio,File) that is opened for writing. ++ By default the child process inherits the parent's output stream. ++stderr = The standard error stream of the child process. ++ This can be any $(XREF stdio,File) that is opened for writing. ++ By default the child process inherits the parent's error stream. ++env = Additional environment variables for the child process. ++config = Flags that control process creation. See $(LREF Config) ++ for an overview of available flags. ++ ++Returns: ++A $(LREF Pid) object that corresponds to the spawned process. ++ ++Throws: ++$(LREF ProcessException) on failure to start the process.$(BR) ++$(XREF stdio,StdioException) on failure to pass one of the streams ++ to the child process (Windows only).$(BR) ++$(CXREF exception,RangeError) if $(D args) is empty. ++*/ ++Pid spawnProcess(in char[][] args, ++ File stdin = std.stdio.stdin, ++ File stdout = std.stdio.stdout, ++ File stderr = std.stdio.stderr, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted // TODO: Should be @safe ++{ ++ version (Windows) auto args2 = escapeShellArguments(args); ++ else version (Posix) alias args2 = args; ++ return spawnProcessImpl(args2, stdin, stdout, stderr, env, config); ++} ++ ++/// ditto ++Pid spawnProcess(in char[][] args, ++ const string[string] env, ++ Config config = Config.none) ++ @trusted // TODO: Should be @safe ++{ ++ return spawnProcess(args, ++ std.stdio.stdin, ++ std.stdio.stdout, ++ std.stdio.stderr, ++ env, ++ config); ++} ++ ++/// ditto ++Pid spawnProcess(in char[] program, ++ File stdin = std.stdio.stdin, ++ File stdout = std.stdio.stdout, ++ File stderr = std.stdio.stderr, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted ++{ ++ return spawnProcess((&program)[0 .. 1], ++ stdin, stdout, stderr, env, config); ++} ++ ++/// ditto ++Pid spawnProcess(in char[] program, ++ const string[string] env, ++ Config config = Config.none) ++ @trusted + { +- auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ return spawnProcess((&program)[0 .. 1], env, config); ++} + +- toAStringz(argv, argv_); ++/* ++Implementation of spawnProcess() for POSIX. + +- version (Posix) ++envz should be a zero-terminated array of zero-terminated strings ++on the form "var=value". ++*/ ++version (Posix) ++private Pid spawnProcessImpl(in char[][] args, ++ File stdin, ++ File stdout, ++ File stderr, ++ const string[string] env, ++ Config config) ++ @trusted // TODO: Should be @safe ++{ ++ import core.exception: RangeError; ++ ++ if (args.empty) throw new RangeError(); ++ const(char)[] name = args[0]; ++ if (any!isDirSeparator(name)) + { +- return _spawnvp(mode, toStringz(pathname), argv_); ++ if (!isExecutable(name)) ++ throw new ProcessException(text("Not an executable file: ", name)); + } +- else version (Windows) ++ else + { +- return std.c.process.spawnvp(mode, toStringz(pathname), argv_); ++ name = searchPathFor(name); ++ if (name is null) ++ throw new ProcessException(text("Executable file not found: ", name)); ++ } ++ ++ // Convert program name and arguments to C-style strings. ++ auto argz = new const(char)*[args.length+1]; ++ argz[0] = toStringz(name); ++ foreach (i; 1 .. args.length) argz[i] = toStringz(args[i]); ++ argz[$-1] = null; ++ ++ // Prepare environment. ++ auto envz = createEnv(env, !(config & Config.newEnv)); ++ ++ // Get the file descriptors of the streams. ++ // These could potentially be invalid, but that is OK. If so, later calls ++ // to dup2() and close() will just silently fail without causing any harm. ++ auto stdinFD = core.stdc.stdio.fileno(stdin.getFP()); ++ auto stdoutFD = core.stdc.stdio.fileno(stdout.getFP()); ++ auto stderrFD = core.stdc.stdio.fileno(stderr.getFP()); ++ ++ auto id = fork(); ++ if (id < 0) ++ throw ProcessException.newFromErrno("Failed to spawn new process"); ++ if (id == 0) ++ { ++ // Child process ++ ++ // Redirect streams and close the old file descriptors. ++ // In the case that stderr is redirected to stdout, we need ++ // to backup the file descriptor since stdout may be redirected ++ // as well. ++ if (stderrFD == STDOUT_FILENO) stderrFD = dup(stderrFD); ++ dup2(stdinFD, STDIN_FILENO); ++ dup2(stdoutFD, STDOUT_FILENO); ++ dup2(stderrFD, STDERR_FILENO); ++ ++ // Ensure that the standard streams aren't closed on execute, and ++ // optionally close all other file descriptors. ++ setCLOEXEC(STDIN_FILENO, false); ++ setCLOEXEC(STDOUT_FILENO, false); ++ setCLOEXEC(STDERR_FILENO, false); ++ if (!(config & Config.inheritFDs)) ++ { ++ import core.sys.posix.sys.resource; ++ rlimit r; ++ getrlimit(RLIMIT_NOFILE, &r); ++ foreach (i; 3 .. cast(int) r.rlim_cur) close(i); ++ } ++ ++ // Close the old file descriptors, unless they are ++ // either of the standard streams. ++ if (stdinFD > STDERR_FILENO) close(stdinFD); ++ if (stdoutFD > STDERR_FILENO) close(stdoutFD); ++ if (stderrFD > STDERR_FILENO) close(stderrFD); ++ ++ // Execute program. ++ core.sys.posix.unistd.execve(argz[0], argz.ptr, envz); ++ ++ // If execution fails, exit as quickly as possible. ++ core.sys.posix.stdio.perror("spawnProcess(): Failed to execute program"); ++ core.sys.posix.unistd._exit(1); ++ assert (0); + } + else +- static assert(0, "spawnvp not implemented for this OS."); ++ { ++ // Parent process: Close streams and return. ++ if (stdinFD > STDERR_FILENO && !(config & Config.retainStdin)) ++ stdin.close(); ++ if (stdoutFD > STDERR_FILENO && !(config & Config.retainStdout)) ++ stdout.close(); ++ if (stderrFD > STDERR_FILENO && !(config & Config.retainStderr)) ++ stderr.close(); ++ return new Pid(id); ++ } + } + +-version (Posix) +-{ +-private import core.sys.posix.unistd; +-private import core.sys.posix.sys.wait; +-int _spawnvp(int mode, in char *pathname, in char **argv) +-{ +- int retval = 0; +- pid_t pid = fork(); ++/* ++Implementation of spawnProcess() for Windows. + +- if(!pid) +- { // child +- std.c.process.execvp(pathname, argv); +- goto Lerror; +- } +- else if(pid > 0) +- { // parent +- if(mode == _P_NOWAIT) ++commandLine must contain the entire command line, properly ++quoted/escaped as required by CreateProcessW(). ++ ++envz must be a pointer to a block of UTF-16 characters on the form ++"var1=value1\0var2=value2\0...varN=valueN\0\0". ++*/ ++version (Windows) ++private Pid spawnProcessImpl(in char[] commandLine, ++ File stdin, ++ File stdout, ++ File stderr, ++ const string[string] env, ++ Config config) ++ @trusted ++{ ++ import core.exception: RangeError; ++ ++ if (commandLine.empty) throw new RangeError("Command line is empty"); ++ auto commandz = toUTFz!(wchar*)(commandLine); ++ ++ // Prepare environment. ++ auto envz = createEnv(env, !(config & Config.newEnv)); ++ ++ // Startup info for CreateProcessW(). ++ STARTUPINFO_W startinfo; ++ startinfo.cb = startinfo.sizeof; ++ startinfo.dwFlags = STARTF_USESTDHANDLES; ++ ++ // Extract file descriptors and HANDLEs from the streams and make the ++ // handles inheritable. ++ static void prepareStream(ref File file, DWORD stdHandle, string which, ++ out int fileDescriptor, out HANDLE handle) ++ { ++ fileDescriptor = _fileno(file.getFP()); ++ if (fileDescriptor < 0) handle = GetStdHandle(stdHandle); ++ else + { +- retval = pid; // caller waits ++ version (DMC_RUNTIME) handle = _fdToHandle(fileDescriptor); ++ else /* MSVCRT */ handle = _get_osfhandle(fileDescriptor); + } +- else ++ ++ DWORD dwFlags; ++ if (GetHandleInformation(handle, &dwFlags)) + { +- while(1) ++ if (!(dwFlags & HANDLE_FLAG_INHERIT)) + { +- int status; +- pid_t wpid = waitpid(pid, &status, 0); +- if(exited(status)) +- { +- retval = exitstatus(status); +- break; +- } +- else if(signaled(status)) ++ if (!SetHandleInformation(handle, ++ HANDLE_FLAG_INHERIT, ++ HANDLE_FLAG_INHERIT)) + { +- retval = -termsig(status); +- break; ++ throw new StdioException( ++ "Failed to make "~which~" stream inheritable by child process (" ++ ~sysErrorString(GetLastError()) ~ ')', ++ 0); + } +- else if(stopped(status)) // ptrace support +- continue; +- else +- goto Lerror; + } + } +- +- return retval; + } ++ int stdinFD = -1, stdoutFD = -1, stderrFD = -1; ++ prepareStream(stdin, STD_INPUT_HANDLE, "stdin" , stdinFD, startinfo.hStdInput ); ++ prepareStream(stdout, STD_OUTPUT_HANDLE, "stdout", stdoutFD, startinfo.hStdOutput); ++ prepareStream(stderr, STD_ERROR_HANDLE, "stderr", stderrFD, startinfo.hStdError ); ++ ++ // Create process. ++ PROCESS_INFORMATION pi; ++ DWORD dwCreationFlags = ++ CREATE_UNICODE_ENVIRONMENT | ++ ((config & Config.suppressConsole) ? CREATE_NO_WINDOW : 0); ++ if (!CreateProcessW(null, commandz, null, null, true, dwCreationFlags, ++ envz, null, &startinfo, &pi)) ++ throw ProcessException.newFromLastError("Failed to spawn new process"); ++ ++ // figure out if we should close any of the streams ++ if (stdinFD > STDERR_FILENO && !(config & Config.retainStdin)) ++ stdin.close(); ++ if (stdoutFD > STDERR_FILENO && !(config & Config.retainStdout)) ++ stdout.close(); ++ if (stderrFD > STDERR_FILENO && !(config & Config.retainStderr)) ++ stderr.close(); ++ ++ // close the thread handle in the process info structure ++ CloseHandle(pi.hThread); ++ ++ return new Pid(pi.dwProcessId, pi.hProcess); ++} ++ ++// Converts childEnv to a zero-terminated array of zero-terminated strings ++// on the form "name=value", optionally adding those of the current process' ++// environment strings that are not present in childEnv. If the parent's ++// environment should be inherited without modification, this function ++// returns environ directly. ++version (Posix) ++private const(char*)* createEnv(const string[string] childEnv, ++ bool mergeWithParentEnv) ++{ ++ // Determine the number of strings in the parent's environment. ++ int parentEnvLength = 0; ++ if (mergeWithParentEnv) ++ { ++ if (childEnv.length == 0) return environ; ++ while (environ[parentEnvLength] != null) ++parentEnvLength; ++ } ++ ++ // Convert the "new" variables to C-style strings. ++ auto envz = new const(char)*[parentEnvLength + childEnv.length + 1]; ++ int pos = 0; ++ foreach (var, val; childEnv) ++ envz[pos++] = (var~'='~val~'\0').ptr; ++ ++ // Add the parent's environment. ++ foreach (environStr; environ[0 .. parentEnvLength]) ++ { ++ int eqPos = 0; ++ while (environStr[eqPos] != '=' && environStr[eqPos] != '\0') ++eqPos; ++ if (environStr[eqPos] != '=') continue; ++ auto var = environStr[0 .. eqPos]; ++ if (var in childEnv) continue; ++ envz[pos++] = environStr; ++ } ++ envz[pos] = null; ++ return envz.ptr; ++} + +-Lerror: +- retval = errno; +- char[80] buf = void; +- throw new Exception( +- "Cannot spawn " ~ to!string(pathname) ~ "; " +- ~ to!string(strerror_r(retval, buf.ptr, buf.length)) +- ~ " [errno " ~ to!string(retval) ~ "]"); +-} // _spawnvp +-private ++version (Posix) unittest + { +- alias WIFSTOPPED stopped; +- alias WIFSIGNALED signaled; +- alias WTERMSIG termsig; +- alias WIFEXITED exited; +- alias WEXITSTATUS exitstatus; +-} // private +-} // version (Posix) ++ auto e1 = createEnv(null, false); ++ assert (e1 != null && *e1 == null); + +-/* ========================================================== */ ++ auto e2 = createEnv(null, true); ++ assert (e2 != null); ++ int i = 0; ++ for (; environ[i] != null; ++i) ++ { ++ assert (e2[i] != null); ++ import core.stdc.string; ++ assert (strcmp(e2[i], environ[i]) == 0); ++ } ++ assert (e2[i] == null); + +-/** +- * Replace the current process by executing a command, $(D pathname), with +- * the arguments in $(D argv). Typically, the first element of $(D argv) is +- * the command being executed, i.e. $(D argv[0] == pathname). The 'p' +- * versions of $(D exec) search the PATH environment variable for $(D +- * pathname). The 'e' versions additionally take the new process' +- * environment variables as an array of strings of the form key=value. +- * +- * Does not return on success (the current process will have been +- * replaced). Returns -1 on failure with no indication of the +- * underlying error. +- */ ++ auto e3 = createEnv(["foo" : "bar", "hello" : "world"], false); ++ assert (e3 != null && e3[0] != null && e3[1] != null && e3[2] == null); ++ assert ((e3[0][0 .. 8] == "foo=bar\0" && e3[1][0 .. 12] == "hello=world\0") ++ || (e3[0][0 .. 12] == "hello=world\0" && e3[1][0 .. 8] == "foo=bar\0")); ++} + +-int execv(in string pathname, in string[] argv) ++ ++// Converts childEnv to a Windows environment block, which is on the form ++// "name1=value1\0name2=value2\0...nameN=valueN\0\0", optionally adding ++// those of the current process' environment strings that are not present ++// in childEnv. Returns null if the parent's environment should be ++// inherited without modification, as this is what is expected by ++// CreateProcess(). ++version (Windows) ++private LPVOID createEnv(const string[string] childEnv, ++ bool mergeWithParentEnv) + { +- auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ if (mergeWithParentEnv && childEnv.length == 0) return null; + +- toAStringz(argv, argv_); ++ auto envz = appender!(wchar[])(); ++ void put(string var, string val) ++ { ++ envz.put(var); ++ envz.put('='); ++ envz.put(val); ++ envz.put(cast(wchar) '\0'); ++ } + +- return std.c.process.execv(toStringz(pathname), argv_); +-} ++ // Add the variables in childEnv, removing them from parentEnv ++ // if they exist there too. ++ auto parentEnv = mergeWithParentEnv ? environment.toAA() : null; ++ foreach (k, v; childEnv) ++ { ++ auto uk = toUpper(k); ++ put(uk, v); ++ if (uk in parentEnv) parentEnv.remove(uk); ++ } + +-/** ditto */ +-int execve(in string pathname, in string[] argv, in string[] envp) +-{ +- auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); +- auto envp_ = cast(const(char)**)alloca((char*).sizeof * (1 + envp.length)); ++ // Add remaining parent environment variables. ++ foreach (k, v; parentEnv) put(k, v); + +- toAStringz(argv, argv_); +- toAStringz(envp, envp_); ++ // Two final zeros are needed in case there aren't any environment vars, ++ // and the last one does no harm when there are. ++ envz.put("\0\0"w); ++ return envz.data.ptr; ++} + +- return std.c.process.execve(toStringz(pathname), argv_, envp_); ++version (Windows) unittest ++{ ++ assert (createEnv(null, true) == null); ++ assert ((cast(wchar*) createEnv(null, false))[0 .. 2] == "\0\0"w); ++ auto e1 = (cast(wchar*) createEnv(["foo":"bar", "ab":"c"], false))[0 .. 14]; ++ assert (e1 == "FOO=bar\0AB=c\0\0"w || e1 == "AB=c\0FOO=bar\0\0"w); + } + +-/** ditto */ +-int execvp(in string pathname, in string[] argv) ++// Searches the PATH variable for the given executable file, ++// (checking that it is in fact executable). ++version (Posix) ++private string searchPathFor(in char[] executable) ++ @trusted //TODO: @safe nothrow + { +- auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ auto pathz = core.stdc.stdlib.getenv("PATH"); ++ if (pathz == null) return null; + +- toAStringz(argv, argv_); ++ foreach (dir; splitter(to!string(pathz), ':')) ++ { ++ auto execPath = buildPath(dir, executable); ++ if (isExecutable(execPath)) return execPath; ++ } + +- return std.c.process.execvp(toStringz(pathname), argv_); ++ return null; + } + +-/** ditto */ +-int execvpe(in string pathname, in string[] argv, in string[] envp) +-{ +-version(Posix) ++// Checks whether the file exists and can be executed by the ++// current user. ++version (Posix) ++private bool isExecutable(in char[] path) @trusted //TODO: @safe nothrow + { +- // Is pathname rooted? +- if(pathname[0] == '/') +- { +- // Yes, so just call execve() +- return execve(pathname, argv, envp); +- } +- else +- { +- // No, so must traverse PATHs, looking for first match +- string[] envPaths = std.array.split( +- to!string(core.stdc.stdlib.getenv("PATH")), ":"); +- int iRet = 0; +- +- // Note: if any call to execve() succeeds, this process will cease +- // execution, so there's no need to check the execve() result through +- // the loop. +- +- foreach(string pathDir; envPaths) +- { +- string composite = cast(string) (pathDir ~ "/" ~ pathname); +- +- iRet = execve(composite, argv, envp); +- } +- if(0 != iRet) +- { +- iRet = execve(pathname, argv, envp); +- } +- +- return iRet; +- } ++ return (access(toStringz(path), X_OK) == 0); + } +-else version(Windows) +-{ +- auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); +- auto envp_ = cast(const(char)**)alloca((char*).sizeof * (1 + envp.length)); + +- toAStringz(argv, argv_); +- toAStringz(envp, envp_); ++version (Posix) unittest ++{ ++ auto unamePath = searchPathFor("uname"); ++ assert (!unamePath.empty); ++ assert (unamePath[0] == '/'); ++ assert (unamePath.endsWith("uname")); ++ auto unlikely = searchPathFor("lkmqwpoialhggyaofijadsohufoiqezm"); ++ assert (unlikely is null, "Are you kidding me?"); ++} + +- return std.c.process.execvpe(toStringz(pathname), argv_, envp_); ++// Sets or unsets the FD_CLOEXEC flag on the given file descriptor. ++version (Posix) ++private void setCLOEXEC(int fd, bool on) ++{ ++ import core.sys.posix.fcntl; ++ auto flags = fcntl(fd, F_GETFD); ++ if (flags >= 0) ++ { ++ if (on) flags |= FD_CLOEXEC; ++ else flags &= ~(cast(typeof(flags)) FD_CLOEXEC); ++ flags = fcntl(fd, F_SETFD, flags); ++ } ++ if (flags == -1) ++ { ++ throw new StdioException("Failed to "~(on ? "" : "un") ++ ~"set close-on-exec flag on file descriptor"); ++ } ++} ++ ++unittest // Command line arguments in spawnProcess(). ++{ ++ version (Windows) TestScript prog = ++ "if not [%~1]==[foo] ( exit 1 ) ++ if not [%~2]==[bar] ( exit 2 ) ++ exit 0"; ++ else version (Posix) TestScript prog = ++ `if test "$1" != "foo"; then exit 1; fi ++ if test "$2" != "bar"; then exit 2; fi ++ exit 0`; ++ assert (wait(spawnProcess(prog.path)) == 1); ++ assert (wait(spawnProcess([prog.path])) == 1); ++ assert (wait(spawnProcess([prog.path, "foo"])) == 2); ++ assert (wait(spawnProcess([prog.path, "foo", "baz"])) == 2); ++ assert (wait(spawnProcess([prog.path, "foo", "bar"])) == 0); ++} ++ ++unittest // Environment variables in spawnProcess(). ++{ ++ // We really should use set /a on Windows, but Wine doesn't support it. ++ version (Windows) TestScript envProg = ++ `if [%STD_PROCESS_UNITTEST1%] == [1] ( ++ if [%STD_PROCESS_UNITTEST2%] == [2] (exit 3) ++ exit 1 ++ ) ++ if [%STD_PROCESS_UNITTEST1%] == [4] ( ++ if [%STD_PROCESS_UNITTEST2%] == [2] (exit 6) ++ exit 4 ++ ) ++ if [%STD_PROCESS_UNITTEST2%] == [2] (exit 2) ++ exit 0`; ++ version (Posix) TestScript envProg = ++ `if test "$std_process_unittest1" = ""; then ++ std_process_unittest1=0 ++ fi ++ if test "$std_process_unittest2" = ""; then ++ std_process_unittest2=0 ++ fi ++ exit $(($std_process_unittest1+$std_process_unittest2))`; ++ ++ environment.remove("std_process_unittest1"); // Just in case. ++ environment.remove("std_process_unittest2"); ++ assert (wait(spawnProcess(envProg.path)) == 0); ++ assert (wait(spawnProcess(envProg.path, null, Config.newEnv)) == 0); ++ ++ environment["std_process_unittest1"] = "1"; ++ assert (wait(spawnProcess(envProg.path)) == 1); ++ assert (wait(spawnProcess(envProg.path, null, Config.newEnv)) == 0); ++ ++ auto env = ["std_process_unittest2" : "2"]; ++ assert (wait(spawnProcess(envProg.path, env)) == 3); ++ assert (wait(spawnProcess(envProg.path, env, Config.newEnv)) == 2); ++ ++ env["std_process_unittest1"] = "4"; ++ assert (wait(spawnProcess(envProg.path, env)) == 6); ++ assert (wait(spawnProcess(envProg.path, env, Config.newEnv)) == 6); ++ ++ environment.remove("std_process_unittest1"); ++ assert (wait(spawnProcess(envProg.path, env)) == 6); ++ assert (wait(spawnProcess(envProg.path, env, Config.newEnv)) == 6); ++} ++ ++unittest // Stream redirection in spawnProcess(). ++{ ++ version (Windows) TestScript prog = ++ "set /p INPUT= ++ echo %INPUT% output %~1 ++ echo %INPUT% error %~2 1>&2"; ++ else version (Posix) TestScript prog = ++ "read INPUT ++ echo $INPUT output $1 ++ echo $INPUT error $2 >&2"; ++ ++ // Pipes ++ auto pipei = pipe(); ++ auto pipeo = pipe(); ++ auto pipee = pipe(); ++ auto pid = spawnProcess([prog.path, "foo", "bar"], ++ pipei.readEnd, pipeo.writeEnd, pipee.writeEnd); ++ pipei.writeEnd.writeln("input"); ++ pipei.writeEnd.flush(); ++ assert (pipeo.readEnd.readln().chomp() == "input output foo"); ++ assert (pipee.readEnd.readln().chomp().stripRight() == "input error bar"); ++ wait(pid); ++ ++ // Files ++ import std.ascii, std.file, std.uuid; ++ auto pathi = buildPath(tempDir(), randomUUID().toString()); ++ auto patho = buildPath(tempDir(), randomUUID().toString()); ++ auto pathe = buildPath(tempDir(), randomUUID().toString()); ++ std.file.write(pathi, "INPUT"~std.ascii.newline); ++ auto filei = File(pathi, "r"); ++ auto fileo = File(patho, "w"); ++ auto filee = File(pathe, "w"); ++ pid = spawnProcess([prog.path, "bar", "baz" ], filei, fileo, filee); ++ wait(pid); ++ assert (readText(patho).chomp() == "INPUT output bar"); ++ assert (readText(pathe).chomp().stripRight() == "INPUT error baz"); ++ remove(pathi); ++ remove(patho); ++ remove(pathe); + } +-else ++ ++unittest // Error handling in spawnProcess() + { +- static assert(0); +-} // version ++ assertThrown!ProcessException(spawnProcess("ewrgiuhrifuheiohnmnvqweoijwf")); ++ assertThrown!ProcessException(spawnProcess("./rgiuhrifuheiohnmnvqweoijwf")); + } + +-/** +- * Returns the process ID of the calling process, which is guaranteed to be +- * unique on the system. This call is always successful. +- * +- * Example: +- * --- +- * writefln("Current process id: %s", getpid()); +- * --- +- */ +-alias core.thread.getpid getpid; + + /** +- Runs $(D_PARAM cmd) in a shell and returns its standard output. If +- the process could not be started or exits with an error code, +- throws an exception. ++A variation on $(LREF spawnProcess) that runs the given _command through ++the current user's preferred _command interpreter (aka. shell). + +- Example: ++The string $(D command) is passed verbatim to the shell, and is therefore ++subject to its rules about _command structure, argument/filename quoting ++and escaping of special characters. ++The path to the shell executable is determined by the $(LREF userShell) ++function. ++ ++In all other respects this function works just like $(D spawnProcess). ++Please refer to the $(LREF spawnProcess) documentation for descriptions ++of the other function parameters, the return value and any exceptions ++that may be thrown. ++--- ++// Run the command/program "foo" on the file named "my file.txt", and ++// redirect its output into foo.log. ++auto pid = spawnShell(`foo "my file.txt" > foo.log`); ++wait(pid); ++--- + +- ---- +- auto tempFilename = chomp(shell("mcookie")); +- auto f = enforce(fopen(tempFilename), "w"); +- scope(exit) +- { +- fclose(f) == 0 || assert(false); +- system(escapeShellCommand("rm", tempFilename)); +- } +- ... use f ... +- ---- ++See_also: ++$(LREF escapeShellCommand), which may be helpful in constructing a ++properly quoted and escaped shell _command line for the current platform. + */ +-string shell(string cmd) ++Pid spawnShell(in char[] command, ++ File stdin = std.stdio.stdin, ++ File stdout = std.stdio.stdout, ++ File stderr = std.stdio.stderr, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted // TODO: Should be @safe + { +- version(Windows) ++ version (Windows) + { +- // Generate a random filename +- auto a = appender!string(); +- foreach (ref e; 0 .. 8) +- { +- formattedWrite(a, "%x", rndGen.front); +- rndGen.popFront(); +- } +- auto filename = a.data; +- scope(exit) if (exists(filename)) remove(filename); +- // We can't use escapeShellCommands here because we don't know +- // if cmd is escaped (wrapped in quotes) or not, without relying +- // on shady heuristics. The current code shouldn't cause much +- // trouble unless filename contained spaces (it won't). +- errnoEnforce(system(cmd ~ "> " ~ filename) == 0); +- return readText(filename); ++ auto args = escapeShellArguments(userShell, shellSwitch) ++ ~ " " ~ command; + } +- else version(Posix) ++ else version (Posix) + { +- File f; +- f.popen(cmd, "r"); +- char[] line; +- string result; +- while (f.readln(line)) +- { +- result ~= line; +- } +- f.close(); +- return result; +- } +- else +- static assert(0, "shell not implemented for this OS."); ++ const(char)[][3] args; ++ args[0] = userShell; ++ args[1] = shellSwitch; ++ args[2] = command; ++ } ++ return spawnProcessImpl(args, stdin, stdout, stderr, env, config); ++} ++ ++/// ditto ++Pid spawnShell(in char[] command, ++ const string[string] env, ++ Config config = Config.none) ++ @trusted // TODO: Should be @safe ++{ ++ return spawnShell(command, ++ std.stdio.stdin, ++ std.stdio.stdout, ++ std.stdio.stderr, ++ env, ++ config); + } + + unittest + { +- auto x = shell("echo wyda"); +- // @@@ This fails on wine +- //assert(x == "wyda" ~ newline, text(x.length)); ++ version (Windows) ++ auto cmd = "echo %FOO%"; ++ else version (Posix) ++ auto cmd = "echo $foo"; ++ import std.file; ++ auto tmpFile = uniqueTempPath(); ++ scope(exit) if (exists(tmpFile)) remove(tmpFile); ++ auto redir = "> \""~tmpFile~'"'; ++ auto env = ["foo" : "bar"]; ++ assert (wait(spawnShell(cmd~redir, env)) == 0); ++ auto f = File(tmpFile, "a"); ++ assert (wait(spawnShell(cmd, std.stdio.stdin, f, std.stdio.stderr, env)) == 0); ++ f.close(); ++ auto output = std.file.readText(tmpFile); ++ assert (output == "bar\nbar\n" || output == "bar\r\nbar\r\n"); + } + ++ + /** +-Gets the value of environment variable $(D name) as a string. Calls +-$(LINK2 std_c_stdlib.html#_getenv, std.c.stdlib._getenv) +-internally. */ ++Flags that control the behaviour of $(LREF spawnProcess) and ++$(LREF spawnShell). + +-string getenv(in char[] name) +-{ +- // Cache the last call's result +- static string lastResult; +- auto p = core.stdc.stdlib.getenv(toStringz(name)); +- if (!p) return null; +- auto value = p[0 .. strlen(p)]; +- if (value == lastResult) return lastResult; +- return lastResult = value.idup; +-} ++Use bitwise OR to combine flags. + +-/** +-Sets the value of environment variable $(D name) to $(D value). If the +-value was written, or the variable was already present and $(D +-overwrite) is false, returns normally. Otherwise, it throws an +-exception. Calls $(LINK2 std_c_stdlib.html#_setenv, +-std.c.stdlib._setenv) internally. */ +-version(StdDdoc) void setenv(in char[] name, in char[] value, bool overwrite); +-else version(Posix) void setenv(in char[] name, in char[] value, bool overwrite) +-{ +- errnoEnforce( +- std.c.stdlib.setenv(toStringz(name), toStringz(value), overwrite) == 0); +-} ++Example: ++--- ++auto logFile = File("myapp_error.log", "w"); + +-/** +-Removes variable $(D name) from the environment. Calls $(LINK2 +-std_c_stdlib.html#_unsetenv, std.c.stdlib._unsetenv) internally. */ +-version(StdDdoc) void unsetenv(in char[] name); +-else version(Posix) void unsetenv(in char[] name) +-{ +- errnoEnforce(std.c.stdlib.unsetenv(toStringz(name)) == 0); ++// Start program, suppressing the console window (Windows only), ++// redirect its error stream to logFile, and leave logFile open ++// in the parent process as well. ++auto pid = spawnProcess("myapp", stdin, stdout, logFile, ++ Config.retainStderr | Config.suppressConsole); ++scope(exit) ++{ ++ auto exitCode = wait(pid); ++ logFile.writeln("myapp exited with code ", exitCode); ++ logFile.close(); + } +- +-version (Posix) unittest ++--- ++*/ ++enum Config + { +- setenv("wyda", "geeba", true); +- assert(getenv("wyda") == "geeba"); +- // Get again to make sure caching works +- assert(getenv("wyda") == "geeba"); +- unsetenv("wyda"); +- assert(getenv("wyda") is null); +-} ++ none = 0, + +-/* ////////////////////////////////////////////////////////////////////////// */ ++ /** ++ By default, the child process inherits the parent's environment, ++ and any environment variables passed to $(LREF spawnProcess) will ++ be added to it. If this flag is set, the only variables in the ++ child process' environment will be those given to spawnProcess. ++ */ ++ newEnv = 1, ++ ++ /** ++ Unless the child process inherits the standard input/output/error ++ streams of its parent, one almost always wants the streams closed ++ in the parent when $(LREF spawnProcess) returns. Therefore, by ++ default, this is done. If this is not desirable, pass any of these ++ options to spawnProcess. ++ */ ++ retainStdin = 2, ++ retainStdout = 4, /// ditto ++ retainStderr = 8, /// ditto ++ ++ /** ++ On Windows, if the child process is a console application, this ++ flag will prevent the creation of a console window. Otherwise, ++ it will be ignored. On POSIX, $(D suppressConsole) has no effect. ++ */ ++ suppressConsole = 16, ++ ++ /** ++ On POSIX, open $(LINK2 http://en.wikipedia.org/wiki/File_descriptor,file descriptors) ++ are by default inherited by the child process. As this may lead ++ to subtle bugs when pipes or multiple threads are involved, ++ $(LREF spawnProcess) ensures that all file descriptors except the ++ ones that correspond to standard input/output/error are closed ++ in the child process when it starts. Use $(D inheritFDs) to prevent ++ this. ++ ++ On Windows, this option has no effect, and any handles which have been ++ explicitly marked as inheritable will always be inherited by the child ++ process. ++ */ ++ inheritFDs = 32, ++} ++ ++ ++/// A handle that corresponds to a spawned process. ++final class Pid ++{ ++ /** ++ The process ID number. ++ ++ This is a number that uniquely identifies the process on the operating ++ system, for at least as long as the process is running. Once $(LREF wait) ++ has been called on the $(LREF Pid), this method will return an ++ invalid process ID. ++ */ ++ @property int processID() const @safe pure nothrow ++ { ++ return _processID; ++ } ++ ++ /** ++ An operating system handle to the process. ++ ++ This handle is used to specify the process in OS-specific APIs. ++ On POSIX, this function returns a $(D core.sys.posix.sys.types.pid_t) ++ with the same value as $(LREF Pid.processID), while on Windows it returns ++ a $(D core.sys.windows.windows.HANDLE). ++ ++ Once $(LREF wait) has been called on the $(LREF Pid), this method ++ will return an invalid handle. ++ */ ++ // Note: Since HANDLE is a reference, this function cannot be const. ++ version (Windows) ++ @property HANDLE osHandle() @safe pure nothrow ++ { ++ return _handle; ++ } ++ else version (Posix) ++ @property pid_t osHandle() @safe pure nothrow ++ { ++ return _processID; ++ } + +-version(MainTest) +-{ +- int main(string[] args) ++private: ++ /* ++ Pid.performWait() does the dirty work for wait() and nonBlockingWait(). ++ ++ If block == true, this function blocks until the process terminates, ++ sets _processID to terminated, and returns the exit code or terminating ++ signal as described in the wait() documentation. ++ ++ If block == false, this function returns immediately, regardless ++ of the status of the process. If the process has terminated, the ++ function has the exact same effect as the blocking version. If not, ++ it returns 0 and does not modify _processID. ++ */ ++ version (Posix) ++ int performWait(bool block) @trusted + { +- if(args.length < 2) ++ if (_processID == terminated) return _exitCode; ++ int exitCode; ++ while(true) ++ { ++ int status; ++ auto check = waitpid(_processID, &status, block ? 0 : WNOHANG); ++ if (check == -1) ++ { ++ if (errno == ECHILD) ++ { ++ throw new ProcessException( ++ "Process does not exist or is not a child process."); ++ } ++ else ++ { ++ // waitpid() was interrupted by a signal. We simply ++ // restart it. ++ assert (errno == EINTR); ++ continue; ++ } ++ } ++ if (!block && check == 0) return 0; ++ if (WIFEXITED(status)) ++ { ++ exitCode = WEXITSTATUS(status); ++ break; ++ } ++ else if (WIFSIGNALED(status)) ++ { ++ exitCode = -WTERMSIG(status); ++ break; ++ } ++ // We check again whether the call should be blocking, ++ // since we don't care about other status changes besides ++ // "exited" and "terminated by signal". ++ if (!block) return 0; ++ ++ // Process has stopped, but not terminated, so we continue waiting. ++ } ++ // Mark Pid as terminated, and cache and return exit code. ++ _processID = terminated; ++ _exitCode = exitCode; ++ return exitCode; ++ } ++ else version (Windows) ++ { ++ int performWait(bool block) @trusted + { +- printf("Must supply executable (and optional arguments)\n"); +- +- return 1; ++ if (_processID == terminated) return _exitCode; ++ assert (_handle != INVALID_HANDLE_VALUE); ++ if (block) ++ { ++ auto result = WaitForSingleObject(_handle, INFINITE); ++ if (result != WAIT_OBJECT_0) ++ throw ProcessException.newFromLastError("Wait failed."); ++ } ++ if (!GetExitCodeProcess(_handle, cast(LPDWORD)&_exitCode)) ++ throw ProcessException.newFromLastError(); ++ if (!block && _exitCode == STILL_ACTIVE) return 0; ++ CloseHandle(_handle); ++ _handle = INVALID_HANDLE_VALUE; ++ _processID = terminated; ++ return _exitCode; + } +- else +- { +- string[] dummy_env; +- +- dummy_env ~= "VAL0=value"; +- dummy_env ~= "VAL1=value"; + +-/+ +- foreach(string arg; args) ++ ~this() ++ { ++ if(_handle != INVALID_HANDLE_VALUE) + { +- printf("%.*s\n", arg); ++ CloseHandle(_handle); ++ _handle = INVALID_HANDLE_VALUE; + } +-+/ ++ } ++ } + +-// int i = execv(args[1], args[1 .. args.length]); +-// int i = execvp(args[1], args[1 .. args.length]); +- int i = execvpe(args[1], args[1 .. args.length], dummy_env); ++ // Special values for _processID. ++ enum invalid = -1, terminated = -2; + +- printf("exec??() has returned! Error code: %d; errno: %d\n", i, /* errno */-1); ++ // OS process ID number. Only nonnegative IDs correspond to ++ // running processes. ++ int _processID = invalid; ++ ++ // Exit code cached by wait(). This is only expected to hold a ++ // sensible value if _processID == terminated. ++ int _exitCode; + +- return 0; ++ // Pids are only meant to be constructed inside this module, so ++ // we make the constructor private. ++ version (Windows) ++ { ++ HANDLE _handle = INVALID_HANDLE_VALUE; ++ this(int pid, HANDLE handle) @safe pure nothrow ++ { ++ _processID = pid; ++ _handle = handle; ++ } ++ } ++ else ++ { ++ this(int id) @safe pure nothrow ++ { ++ _processID = id; + } + } + } + +-/* ////////////////////////////////////////////////////////////////////////// */ + ++/** ++Waits for the process associated with $(D pid) to terminate, and returns ++its exit status. + ++In general one should always _wait for child processes to terminate ++before exiting the parent process. Otherwise, they may become ++"$(WEB en.wikipedia.org/wiki/Zombie_process,zombies)" – processes ++that are defunct, yet still occupy a slot in the OS process table. ++ ++If the process has already terminated, this function returns directly. ++The exit code is cached, so that if wait() is called multiple times on ++the same $(LREF Pid) it will always return the same value. ++ ++POSIX_specific: ++If the process is terminated by a signal, this function returns a ++negative number whose absolute value is the signal number. ++Since POSIX restricts normal exit codes to the range 0-255, a ++negative return value will always indicate termination by signal. ++Signal codes are defined in the $(D core.sys.posix.signal) module ++(which corresponds to the $(D signal.h) POSIX header). + ++Throws: ++$(LREF ProcessException) on failure. + +-/** Manipulates environment variables using an associative-array-like +- interface. ++Examples: ++See the $(LREF spawnProcess) documentation. + +- Examples: +- --- +- // Return variable, or throw an exception if it doesn't exist. +- auto path = environment["PATH"]; ++See_also: ++$(LREF tryWait), for a non-blocking function. ++*/ ++int wait(Pid pid) @safe ++{ ++ assert(pid !is null, "Called wait on a null Pid."); ++ return pid.performWait(true); ++} + +- // Add/replace variable. +- environment["foo"] = "bar"; + +- // Remove variable. +- environment.remove("foo"); ++unittest // Pid and wait() ++{ ++ version (Windows) TestScript prog = "exit %~1"; ++ else version (Posix) TestScript prog = "exit $1"; ++ assert (wait(spawnProcess([prog.path, "0"])) == 0); ++ assert (wait(spawnProcess([prog.path, "123"])) == 123); ++ auto pid = spawnProcess([prog.path, "10"]); ++ assert (pid.processID > 0); ++ version (Windows) assert (pid.osHandle != INVALID_HANDLE_VALUE); ++ else version (Posix) assert (pid.osHandle == pid.processID); ++ assert (wait(pid) == 10); ++ assert (wait(pid) == 10); // cached exit code ++ assert (pid.processID < 0); ++ version (Windows) assert (pid.osHandle == INVALID_HANDLE_VALUE); ++ else version (Posix) assert (pid.osHandle < 0); ++} + +- // Return variable, or null if it doesn't exist. +- auto foo = environment.get("foo"); + +- // Return variable, or a default value if it doesn't exist. +- auto foo = environment.get("foo", "default foo value"); ++/** ++A non-blocking version of $(LREF wait). + +- // Return an associative array of type string[string] containing +- // all the environment variables. +- auto aa = environment.toAA(); +- --- +-*/ +-alias Environment environment; ++If the process associated with $(D pid) has already terminated, ++$(D tryWait) has the exact same effect as $(D wait). ++In this case, it returns a struct where the $(D terminated) field ++is set to $(D true) and the $(D status) field has the same ++interpretation as the return value of $(D wait). ++ ++If the process has $(I not) yet terminated, this function differs ++from $(D wait) in that does not wait for this to happen, but instead ++returns immediately. The $(D terminated) field of the returned ++tuple will then be set to $(D false), while the $(D status) field ++will always be 0 (zero). $(D wait) or $(D tryWait) should then be ++called again on the same $(D Pid) at some later time; not only to ++get the exit code, but also to avoid the process becoming a "zombie" ++when it finally terminates. (See $(LREF wait) for details). ++ ++Returns: ++A $(D struct) which contains the fields $(D bool terminated) ++and $(D int status). (This will most likely change to become a ++$(D std.typecons.Tuple!(bool,"terminated",int,"status")) in the future, ++but a compiler bug currently prevents this.) + +-abstract final class Environment ++Throws: ++$(LREF ProcessException) on failure. ++ ++Example: ++--- ++auto pid = spawnProcess("dmd myapp.d"); ++scope(exit) wait(pid); ++... ++auto dmd = tryWait(pid); ++if (dmd.terminated) + { +-static: +-private: +- // Return the length of an environment variable (in number of +- // wchars, including the null terminator), 0 if it doesn't exist. +- version(Windows) +- int varLength(LPCWSTR namez) ++ if (dmd.status == 0) writeln("Compilation succeeded!"); ++ else writeln("Compilation failed"); ++} ++else writeln("Still compiling..."); ++... ++--- ++Note that in this example, the first $(D wait) call will have no ++effect if the process has already terminated by the time $(D tryWait) ++is called. In the opposite case, however, the $(D scope) statement ++ensures that we always wait for the process if it hasn't terminated ++by the time we reach the end of the scope. ++*/ ++auto tryWait(Pid pid) @safe ++{ ++ struct TryWaitResult + { +- return GetEnvironmentVariableW(namez, null, 0); ++ bool terminated; ++ int status; + } ++ assert(pid !is null, "Called tryWait on a null Pid."); ++ auto code = pid.performWait(false); ++ return TryWaitResult(pid._processID == Pid.terminated, code); ++} ++// unittest: This function is tested together with kill() below. + + +- // Retrieve the environment variable, or return false on failure. +- bool getImpl(string name, out string value) +- { +- version(Posix) +- { +- const vz = core.sys.posix.stdlib.getenv(toStringz(name)); +- if (vz == null) return false; +- auto v = vz[0 .. strlen(vz)]; ++/** ++Attempts to terminate the process associated with $(D pid). + +- // Cache the last call's result. +- static string lastResult; +- if (v != lastResult) lastResult = v.idup; +- value = lastResult; +- return true; +- } ++The effect of this function, as well as the meaning of $(D codeOrSignal), ++is highly platform dependent. Details are given below. Common to all ++platforms is that this function only $(I initiates) termination of the process, ++and returns immediately. It does not wait for the process to end, ++nor does it guarantee that the process does in fact get terminated. ++ ++Always call $(LREF wait) to wait for a process to complete, even if $(D kill) ++has been called on it. ++ ++Windows_specific: ++The process will be ++$(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686714%28v=vs.100%29.aspx, ++forcefully and abruptly terminated). If $(D codeOrSignal) is specified, it ++must be a nonnegative number which will be used as the exit code of the process. ++If not, the process wil exit with code 1. Do not use $(D codeOrSignal = 259), ++as this is a special value (aka. $(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683189.aspx,STILL_ACTIVE)) ++used by Windows to signal that a process has in fact $(I not) terminated yet. ++--- ++auto pid = spawnProcess("some_app"); ++kill(pid, 10); ++assert (wait(pid) == 10); ++--- + +- else version(Windows) +- { +- const namez = toUTF16z(name); +- immutable len = varLength(namez); +- if (len == 0) return false; +- if (len == 1) return true; +- +- auto buf = new WCHAR[len]; +- GetEnvironmentVariableW(namez, buf.ptr, to!DWORD(buf.length)); +- value = toUTF8(buf[0 .. $-1]); +- return true; +- } ++POSIX_specific: ++A $(LINK2 http://en.wikipedia.org/wiki/Unix_signal,signal) will be sent to ++the process, whose value is given by $(D codeOrSignal). Depending on the ++signal sent, this may or may not terminate the process. Symbolic constants ++for various $(LINK2 http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals, ++POSIX signals) are defined in $(D core.sys.posix.signal), which corresponds to the ++$(LINK2 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html, ++$(D signal.h) POSIX header). If $(D codeOrSignal) is omitted, the ++$(D SIGTERM) signal will be sent. (This matches the behaviour of the ++$(LINK2 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/kill.html, ++$(D _kill)) shell command.) ++--- ++import core.sys.posix.signal: SIGKILL; ++auto pid = spawnProcess("some_app"); ++kill(pid, SIGKILL); ++assert (wait(pid) == -SIGKILL); // Negative return value on POSIX! ++--- + +- else static assert(0); ++Throws: ++$(LREF ProcessException) on error (e.g. if codeOrSignal is invalid). ++ Note that failure to terminate the process is considered a "normal" ++ outcome, not an error.$(BR) ++*/ ++void kill(Pid pid) ++{ ++ version (Windows) kill(pid, 1); ++ else version (Posix) ++ { ++ import core.sys.posix.signal: SIGTERM; ++ kill(pid, SIGTERM); + } ++} + ++/// ditto ++void kill(Pid pid, int codeOrSignal) ++{ ++ version (Windows) ++ { ++ if (codeOrSignal < 0) throw new ProcessException("Invalid exit code"); ++ version (Win32) ++ { ++ // On Windows XP, TerminateProcess() appears to terminate the ++ // *current* process if it is passed an invalid handle... ++ if (pid.osHandle == INVALID_HANDLE_VALUE) ++ throw new ProcessException("Invalid process handle"); ++ } ++ if (!TerminateProcess(pid.osHandle, codeOrSignal)) ++ throw ProcessException.newFromLastError(); ++ } ++ else version (Posix) ++ { ++ import core.sys.posix.signal; ++ if (kill(pid.osHandle, codeOrSignal) == -1) ++ throw ProcessException.newFromErrno(); ++ } ++} + +- +-public: +- // Retrieve an environment variable, throw on failure. +- string opIndex(string name) ++unittest // tryWait() and kill() ++{ ++ import core.thread; ++ // The test script goes into an infinite loop. ++ version (Windows) + { +- string value; +- enforce(getImpl(name, value), "Environment variable not found: "~name); +- return value; ++ TestScript prog = ":loop ++ goto loop"; ++ } ++ else version (Posix) ++ { ++ import core.sys.posix.signal: SIGTERM, SIGKILL; ++ TestScript prog = "while true; do sleep 1; done"; + } ++ auto pid = spawnProcess(prog.path); ++ Thread.sleep(dur!"seconds"(1)); ++ kill(pid); ++ version (Windows) assert (wait(pid) == 1); ++ else version (Posix) assert (wait(pid) == -SIGTERM); ++ ++ pid = spawnProcess(prog.path); ++ Thread.sleep(dur!"seconds"(1)); ++ auto s = tryWait(pid); ++ assert (!s.terminated && s.status == 0); ++ assertThrown!ProcessException(kill(pid, -123)); // Negative code not allowed. ++ version (Windows) kill(pid, 123); ++ else version (Posix) kill(pid, SIGKILL); ++ do { s = tryWait(pid); } while (!s.terminated); ++ version (Windows) assert (s.status == 123); ++ else version (Posix) assert (s.status == -SIGKILL); ++ assertThrown!ProcessException(kill(pid)); ++} ++ ++ ++/** ++Creates a unidirectional _pipe. + ++Data is written to one end of the _pipe and read from the other. ++--- ++auto p = pipe(); ++p.writeEnd.writeln("Hello World"); ++assert (p.readEnd.readln().chomp() == "Hello World"); ++--- ++Pipes can, for example, be used for interprocess communication ++by spawning a new process and passing one end of the _pipe to ++the child, while the parent uses the other end. ++(See also $(LREF pipeProcess) and $(LREF pipeShell) for an easier ++way of doing this.) ++--- ++// Use cURL to download the dlang.org front page, pipe its ++// output to grep to extract a list of links to ZIP files, ++// and write the list to the file "D downloads.txt": ++auto p = pipe(); ++auto outFile = File("D downloads.txt", "w"); ++auto cpid = spawnProcess(["curl", "http://dlang.org/download.html"], ++ std.stdio.stdin, p.writeEnd); ++scope(exit) wait(cpid); ++auto gpid = spawnProcess(["grep", "-o", `http://\S*\.zip`], ++ p.readEnd, outFile); ++scope(exit) wait(gpid); ++--- + ++Returns: ++A $(LREF Pipe) object that corresponds to the created _pipe. + +- // Assign a value to an environment variable. If the variable +- // exists, it is overwritten. +- string opIndexAssign(string value, string name) ++Throws: ++$(XREF stdio,StdioException) on failure. ++*/ ++version (Posix) ++Pipe pipe() @trusted //TODO: @safe ++{ ++ int[2] fds; ++ if (core.sys.posix.unistd.pipe(fds) != 0) ++ throw new StdioException("Unable to create pipe"); ++ Pipe p; ++ auto readFP = fdopen(fds[0], "r"); ++ if (readFP == null) ++ throw new StdioException("Cannot open read end of pipe"); ++ p._read = File(readFP, null); ++ auto writeFP = fdopen(fds[1], "w"); ++ if (writeFP == null) ++ throw new StdioException("Cannot open write end of pipe"); ++ p._write = File(writeFP, null); ++ return p; ++} ++else version (Windows) ++Pipe pipe() @trusted //TODO: @safe ++{ ++ // use CreatePipe to create an anonymous pipe ++ HANDLE readHandle; ++ HANDLE writeHandle; ++ if (!CreatePipe(&readHandle, &writeHandle, null, 0)) + { +- version(Posix) +- { +- if (core.sys.posix.stdlib.setenv(toStringz(name), +- toStringz(value), 1) != -1) +- { +- return value; +- } ++ throw new StdioException( ++ "Error creating pipe (" ~ sysErrorString(GetLastError()) ~ ')', ++ 0); ++ } + +- // The default errno error message is very uninformative +- // in the most common case, so we handle it manually. +- enforce(errno != EINVAL, +- "Invalid environment variable name: '"~name~"'"); +- errnoEnforce(false, +- "Failed to add environment variable"); +- assert(0); +- } ++ // Create file descriptors from the handles ++ version (DMC_RUNTIME) ++ { ++ auto readFD = _handleToFD(readHandle, FHND_DEVICE); ++ auto writeFD = _handleToFD(writeHandle, FHND_DEVICE); ++ } ++ else // MSVCRT ++ { ++ auto readFD = _open_osfhandle(readHandle, _O_RDONLY); ++ auto writeFD = _open_osfhandle(writeHandle, _O_APPEND); ++ } ++ version (DMC_RUNTIME) alias .close _close; ++ if (readFD == -1 || writeFD == -1) ++ { ++ // Close file descriptors, then throw. ++ if (readFD >= 0) _close(readFD); ++ else CloseHandle(readHandle); ++ if (writeFD >= 0) _close(writeFD); ++ else CloseHandle(writeHandle); ++ throw new StdioException("Error creating pipe"); ++ } + +- else version(Windows) ++ // Create FILE pointers from the file descriptors ++ Pipe p; ++ version (DMC_RUNTIME) ++ { ++ // This is a re-implementation of DMC's fdopen, but without the ++ // mucking with the file descriptor. POSIX standard requires the ++ // new fdopen'd file to retain the given file descriptor's ++ // position. ++ FILE * local_fdopen(int fd, const(char)* mode) + { +- enforce( +- SetEnvironmentVariableW(toUTF16z(name), toUTF16z(value)), +- sysErrorString(GetLastError()) +- ); +- return value; ++ auto fp = core.stdc.stdio.fopen("NUL", mode); ++ if(!fp) return null; ++ FLOCK(fp); ++ auto iob = cast(_iobuf*)fp; ++ .close(iob._file); ++ iob._file = fd; ++ iob._flag &= ~_IOTRAN; ++ FUNLOCK(fp); ++ return fp; + } + +- else static assert(0); ++ auto readFP = local_fdopen(readFD, "r"); ++ auto writeFP = local_fdopen(writeFD, "a"); + } ++ else // MSVCRT ++ { ++ auto readFP = _fdopen(readFD, "r"); ++ auto writeFP = _fdopen(writeFD, "a"); ++ } ++ if (readFP == null || writeFP == null) ++ { ++ // Close streams, then throw. ++ if (readFP != null) fclose(readFP); ++ else _close(readFD); ++ if (writeFP != null) fclose(writeFP); ++ else _close(writeFD); ++ throw new StdioException("Cannot open pipe"); ++ } ++ p._read = File(readFP, null); ++ p._write = File(writeFP, null); ++ return p; ++} + + ++/// An interface to a pipe created by the $(LREF pipe) function. ++struct Pipe ++{ ++ /// The read end of the pipe. ++ @property File readEnd() @trusted /*TODO: @safe nothrow*/ { return _read; } + +- // Remove an environment variable. The function succeeds even +- // if the variable isn't in the environment. +- void remove(string name) +- { +- version(Posix) +- { +- core.sys.posix.stdlib.unsetenv(toStringz(name)); +- } + +- else version(Windows) +- { +- SetEnvironmentVariableW(toUTF16z(name), null); +- } ++ /// The write end of the pipe. ++ @property File writeEnd() @trusted /*TODO: @safe nothrow*/ { return _write; } + +- else static assert(0); +- } + ++ /** ++ Closes both ends of the pipe. + ++ Normally it is not necessary to do this manually, as $(XREF stdio,File) ++ objects are automatically closed when there are no more references ++ to them. + +- // Same as opIndex, except return a default value if +- // the variable doesn't exist. +- string get(string name, string defaultValue = null) ++ Note that if either end of the pipe has been passed to a child process, ++ it will only be closed in the parent process. (What happens in the ++ child process is platform dependent.) ++ */ ++ void close() @trusted //TODO: @safe nothrow + { +- string value; +- auto found = getImpl(name, value); +- return found ? value : defaultValue; ++ _read.close(); ++ _write.close(); + } + ++private: ++ File _read, _write; ++} + ++unittest ++{ ++ auto p = pipe(); ++ p.writeEnd.writeln("Hello World"); ++ p.writeEnd.flush(); ++ assert (p.readEnd.readln().chomp() == "Hello World"); ++ p.close(); ++ assert (!p.readEnd.isOpen); ++ assert (!p.writeEnd.isOpen); ++} + +- // Return all environment variables in an associative array. +- string[string] toAA() +- { +- string[string] aa; + +- version(Posix) +- { +- for (int i=0; environ[i] != null; ++i) +- { +- immutable varDef = to!string(environ[i]); +- immutable eq = varDef.indexOf('='); +- assert (eq >= 0); ++/** ++Starts a new process, creating pipes to redirect its standard ++input, output and/or error streams. + +- immutable name = varDef[0 .. eq]; +- immutable value = varDef[eq+1 .. $]; ++$(D pipeProcess) and $(D pipeShell) are convenient wrappers around ++$(LREF spawnProcess) and $(LREF spawnShell), respectively, and ++automate the task of redirecting one or more of the child process' ++standard streams through pipes. Like the functions they wrap, ++these functions return immediately, leaving the child process to ++execute in parallel with the invoking process. It is recommended ++to always call $(LREF wait) on the returned $(LREF ProcessPipes.pid), ++as detailed in the documentation for $(D wait). ++ ++The $(D args)/$(D program)/$(D command), $(D env) and $(D config) ++parameters are forwarded straight to the underlying spawn functions, ++and we refer to their documentation for details. ++ ++Params: ++args = An array which contains the program name as the zeroth element ++ and any command-line arguments in the following elements. ++ (See $(LREF spawnProcess) for details.) ++program = The program name, $(I without) command-line arguments. ++ (See $(LREF spawnProcess) for details.) ++command = A shell command which is passed verbatim to the command ++ interpreter. (See $(LREF spawnShell) for details.) ++redirect = Flags that determine which streams are redirected, and ++ how. See $(LREF Redirect) for an overview of available ++ flags. ++env = Additional environment variables for the child process. ++ (See $(LREF spawnProcess) for details.) ++config = Flags that control process creation. See $(LREF Config) ++ for an overview of available flags, and note that the ++ $(D retainStd...) flags have no effect in this function. ++ ++Returns: ++A $(LREF ProcessPipes) object which contains $(XREF stdio,File) ++handles that communicate with the redirected streams of the child ++process, along with a $(LREF Pid) object that corresponds to the ++spawned process. ++ ++Throws: ++$(LREF ProcessException) on failure to start the process.$(BR) ++$(XREF stdio,StdioException) on failure to redirect any of the streams.$(BR) + +- // In POSIX, environment variables may be defined more +- // than once. This is a security issue, which we avoid +- // by checking whether the key already exists in the array. +- // For more info: +- // http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/environment-variables.html +- if (name !in aa) aa[name] = value; +- } +- } ++Example: ++--- ++auto pipes = pipeProcess("my_application", Redirect.stdout | Redirect.stderr); ++scope(exit) wait(pipes.pid); + +- else version(Windows) +- { +- auto envBlock = GetEnvironmentStringsW(); +- enforce (envBlock, "Failed to retrieve environment variables."); +- scope(exit) FreeEnvironmentStringsW(envBlock); ++// Store lines of output. ++string[] output; ++foreach (line; pipes.stdout.byLine) output ~= line.idup; ++ ++// Store lines of errors. ++string[] errors; ++foreach (line; pipes.stderr.byLine) errors ~= line.idup; ++--- ++*/ ++ProcessPipes pipeProcess(in char[][] args, ++ Redirect redirect = Redirect.all, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted //TODO: @safe ++{ ++ return pipeProcessImpl!spawnProcess(args, redirect, env, config); ++} + +- for (int i=0; envBlock[i] != '\0'; ++i) +- { +- auto start = i; +- while (envBlock[i] != '=') +- { +- assert (envBlock[i] != '\0'); +- ++i; +- } +- immutable name = toUTF8(envBlock[start .. i]); ++/// ditto ++ProcessPipes pipeProcess(in char[] program, ++ Redirect redirect = Redirect.all, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted ++{ ++ return pipeProcessImpl!spawnProcess(program, redirect, env, config); ++} + +- start = i+1; +- while (envBlock[i] != '\0') ++i; +- aa[name] = toUTF8(envBlock[start .. i]); +- } +- } ++/// ditto ++ProcessPipes pipeShell(in char[] command, ++ Redirect redirect = Redirect.all, ++ const string[string] env = null, ++ Config config = Config.none) ++ @safe ++{ ++ return pipeProcessImpl!spawnShell(command, redirect, env, config); ++} + +- else static assert(0); ++// Implementation of the pipeProcess() family of functions. ++private ProcessPipes pipeProcessImpl(alias spawnFunc, Cmd) ++ (Cmd command, ++ Redirect redirectFlags, ++ const string[string] env = null, ++ Config config = Config.none) ++ @trusted //TODO: @safe ++{ ++ File childStdin, childStdout, childStderr; ++ ProcessPipes pipes; ++ pipes._redirectFlags = redirectFlags; + +- return aa; ++ if (redirectFlags & Redirect.stdin) ++ { ++ auto p = pipe(); ++ childStdin = p.readEnd; ++ pipes._stdin = p.writeEnd; ++ } ++ else ++ { ++ childStdin = std.stdio.stdin; ++ } ++ ++ if (redirectFlags & Redirect.stdout) ++ { ++ if ((redirectFlags & Redirect.stdoutToStderr) != 0) ++ throw new StdioException("Cannot create pipe for stdout AND " ++ ~"redirect it to stderr", 0); ++ auto p = pipe(); ++ childStdout = p.writeEnd; ++ pipes._stdout = p.readEnd; ++ } ++ else ++ { ++ childStdout = std.stdio.stdout; ++ } ++ ++ if (redirectFlags & Redirect.stderr) ++ { ++ if ((redirectFlags & Redirect.stderrToStdout) != 0) ++ throw new StdioException("Cannot create pipe for stderr AND " ++ ~"redirect it to stdout", 0); ++ auto p = pipe(); ++ childStderr = p.writeEnd; ++ pipes._stderr = p.readEnd; ++ } ++ else ++ { ++ childStderr = std.stdio.stderr; ++ } ++ ++ if (redirectFlags & Redirect.stdoutToStderr) ++ { ++ if (redirectFlags & Redirect.stderrToStdout) ++ { ++ // We know that neither of the other options have been ++ // set, so we assign the std.stdio.std* streams directly. ++ childStdout = std.stdio.stderr; ++ childStderr = std.stdio.stdout; ++ } ++ else ++ { ++ childStdout = childStderr; ++ } ++ } ++ else if (redirectFlags & Redirect.stderrToStdout) ++ { ++ childStderr = childStdout; + } + ++ config &= ~(Config.retainStdin | Config.retainStdout | Config.retainStderr); ++ pipes._pid = spawnFunc(command, childStdin, childStdout, childStderr, ++ env, config); ++ return pipes; + } + + +-unittest ++/** ++Flags that can be passed to $(LREF pipeProcess) and $(LREF pipeShell) ++to specify which of the child process' standard streams are redirected. ++Use bitwise OR to combine flags. ++*/ ++enum Redirect + { +- // New variable +- environment["std_process"] = "foo"; +- assert (environment["std_process"] == "foo"); ++ /// Redirect the standard input, output or error streams, respectively. ++ stdin = 1, ++ stdout = 2, /// ditto ++ stderr = 4, /// ditto ++ ++ /** ++ Redirect _all three streams. This is equivalent to ++ $(D Redirect.stdin | Redirect.stdout | Redirect.stderr). ++ */ ++ all = stdin | stdout | stderr, ++ ++ /** ++ Redirect the standard error stream into the standard output stream. ++ This can not be combined with $(D Redirect.stderr). ++ */ ++ stderrToStdout = 8, ++ ++ /** ++ Redirect the standard output stream into the standard error stream. ++ This can not be combined with $(D Redirect.stdout). ++ */ ++ stdoutToStderr = 16, ++} + +- // Set variable again +- environment["std_process"] = "bar"; +- assert (environment["std_process"] == "bar"); ++unittest ++{ ++ version (Windows) TestScript prog = ++ "call :sub %~1 %~2 0 ++ call :sub %~1 %~2 1 ++ call :sub %~1 %~2 2 ++ call :sub %~1 %~2 3 ++ exit 3 ++ ++ :sub ++ set /p INPUT= ++ if -%INPUT%-==-stop- ( exit %~3 ) ++ echo %INPUT% %~1 ++ echo %INPUT% %~2 1>&2"; ++ else version (Posix) TestScript prog = ++ `for EXITCODE in 0 1 2 3; do ++ read INPUT ++ if test "$INPUT" = stop; then break; fi ++ echo "$INPUT $1" ++ echo "$INPUT $2" >&2 ++ done ++ exit $EXITCODE`; ++ auto pp = pipeProcess([prog.path, "bar", "baz"]); ++ pp.stdin.writeln("foo"); ++ pp.stdin.flush(); ++ assert (pp.stdout.readln().chomp() == "foo bar"); ++ assert (pp.stderr.readln().chomp().stripRight() == "foo baz"); ++ pp.stdin.writeln("1234567890"); ++ pp.stdin.flush(); ++ assert (pp.stdout.readln().chomp() == "1234567890 bar"); ++ assert (pp.stderr.readln().chomp().stripRight() == "1234567890 baz"); ++ pp.stdin.writeln("stop"); ++ pp.stdin.flush(); ++ assert (wait(pp.pid) == 2); ++ ++ pp = pipeProcess([prog.path, "12345", "67890"], ++ Redirect.stdin | Redirect.stdout | Redirect.stderrToStdout); ++ pp.stdin.writeln("xyz"); ++ pp.stdin.flush(); ++ assert (pp.stdout.readln().chomp() == "xyz 12345"); ++ assert (pp.stdout.readln().chomp().stripRight() == "xyz 67890"); ++ pp.stdin.writeln("stop"); ++ pp.stdin.flush(); ++ assert (wait(pp.pid) == 1); ++ ++ pp = pipeShell(prog.path~" AAAAA BBB", ++ Redirect.stdin | Redirect.stdoutToStderr | Redirect.stderr); ++ pp.stdin.writeln("ab"); ++ pp.stdin.flush(); ++ assert (pp.stderr.readln().chomp() == "ab AAAAA"); ++ assert (pp.stderr.readln().chomp().stripRight() == "ab BBB"); ++ pp.stdin.writeln("stop"); ++ pp.stdin.flush(); ++ assert (wait(pp.pid) == 1); ++} + +- // Remove variable +- environment.remove("std_process"); ++unittest ++{ ++ TestScript prog = "exit 0"; ++ assertThrown!StdioException(pipeProcess( ++ prog.path, ++ Redirect.stdout | Redirect.stdoutToStderr)); ++ assertThrown!StdioException(pipeProcess( ++ prog.path, ++ Redirect.stderr | Redirect.stderrToStdout)); ++ auto p = pipeProcess(prog.path, Redirect.stdin); ++ assertThrown!Error(p.stdout); ++ assertThrown!Error(p.stderr); ++ wait(p.pid); ++ p = pipeProcess(prog.path, Redirect.stderr); ++ assertThrown!Error(p.stdin); ++ assertThrown!Error(p.stdout); ++ wait(p.pid); ++} + +- // Remove again, should succeed +- environment.remove("std_process"); ++/** ++Object which contains $(XREF stdio,File) handles that allow communication ++with a child process through its standard streams. ++*/ ++struct ProcessPipes ++{ ++ /// The $(LREF Pid) of the child process. ++ @property Pid pid() @safe nothrow ++ { ++ assert(_pid !is null); ++ return _pid; ++ } + +- // Throw on not found. +- try { environment["std_process"]; assert(0); } catch(Exception e) { } ++ /** ++ An $(XREF stdio,File) that allows writing to the child process' ++ standard input stream. + +- // get() without default value +- assert (environment.get("std.process") == null); ++ Throws: ++ $(OBJECTREF Error) if the child process' standard input stream hasn't ++ been redirected. ++ */ ++ @property File stdin() @trusted //TODO: @safe nothrow ++ { ++ if ((_redirectFlags & Redirect.stdin) == 0) ++ throw new Error("Child process' standard input stream hasn't " ++ ~"been redirected."); ++ return _stdin; ++ } + +- // get() with default value +- assert (environment.get("std_process", "baz") == "baz"); ++ /** ++ An $(XREF stdio,File) that allows reading from the child process' ++ standard output stream. + +- // Convert to associative array +- auto aa = environment.toAA(); +- assert (aa.length > 0); +- foreach (n, v; aa) ++ Throws: ++ $(OBJECTREF Error) if the child process' standard output stream hasn't ++ been redirected. ++ */ ++ @property File stdout() @trusted //TODO: @safe nothrow + { +- // Wine has some bugs related to environment variables: +- // - Wine allows the existence of an env. variable with the name +- // "\0", but GetEnvironmentVariable refuses to retrieve it. +- // - If an env. variable has zero length, i.e. is "\0", +- // GetEnvironmentVariable should return 1. Instead it returns +- // 0, indicating the variable doesn't exist. +- version(Windows) if (n.length == 0 || v.length == 0) continue; ++ if ((_redirectFlags & Redirect.stdout) == 0) ++ throw new Error("Child process' standard output stream hasn't " ++ ~"been redirected."); ++ return _stdout; ++ } + +- // why does this happen? +- // n = "temp" || "tmp" +- // v = "C:\Users\ADMINI~1\AppData\Local\Temp\2" +- // e[n] = "C:\cygwin\tmp" +- // for n = "TEMP" or "TMP", v and en[v] are both "C:\cygwin\tmp" +- version(Windows) if (n == "temp" || n == "tmp") continue; ++ /** ++ An $(XREF stdio,File) that allows reading from the child process' ++ standard error stream. + +- //printf("%.*s, %.*s, %.*s\n", n.length, n.ptr, v.length, v.ptr, environment[n].length, environment[n].ptr); +- assert (v == environment[n]); ++ Throws: ++ $(OBJECTREF Error) if the child process' standard error stream hasn't ++ been redirected. ++ */ ++ @property File stderr() @trusted //TODO: @safe nothrow ++ { ++ if ((_redirectFlags & Redirect.stderr) == 0) ++ throw new Error("Child process' standard error stream hasn't " ++ ~"been redirected."); ++ return _stderr; + } ++ ++private: ++ Redirect _redirectFlags; ++ Pid _pid; ++ File _stdin, _stdout, _stderr; + } + + +-version(StdDdoc) ++ ++/** ++Executes the given program or shell command and returns its exit ++code and output. ++ ++$(D execute) and $(D executeShell) start a new process using ++$(LREF spawnProcess) and $(LREF spawnShell), respectively, and wait ++for the process to complete before returning. The functions capture ++what the child process prints to both its standard output and ++standard error streams, and return this together with its exit code. ++--- ++auto dmd = execute("dmd", "myapp.d"); ++if (dmd.status != 0) writeln("Compilation failed:\n", dmd.output); ++ ++auto ls = executeShell("ls -l"); ++if (ls.status == 0) writeln("Failed to retrieve file listing"); ++else writeln(ls.output); ++--- ++ ++The $(D args)/$(D program)/$(D command), $(D env) and $(D config) ++parameters are forwarded straight to the underlying spawn functions, ++and we refer to their documentation for details. ++ ++Params: ++args = An array which contains the program name as the zeroth element ++ and any command-line arguments in the following elements. ++ (See $(LREF spawnProcess) for details.) ++program = The program name, $(I without) command-line arguments. ++ (See $(LREF spawnProcess) for details.) ++command = A shell command which is passed verbatim to the command ++ interpreter. (See $(LREF spawnShell) for details.) ++env = Additional environment variables for the child process. ++ (See $(LREF spawnProcess) for details.) ++config = Flags that control process creation. See $(LREF Config) ++ for an overview of available flags, and note that the ++ $(D retainStd...) flags have no effect in this function. ++maxOutput = The maximum number of bytes of output that should be ++ captured. ++ ++Returns: ++A $(D struct) which contains the fields $(D int status) and ++$(D string output). (This will most likely change to become a ++$(D std.typecons.Tuple!(int,"status",string,"output")) in the future, ++but a compiler bug currently prevents this.) ++ ++POSIX_specific: ++If the process is terminated by a signal, the $(D status) field of ++the return value will contain a negative number whose absolute ++value is the signal number. (See $(LREF wait) for details.) ++ ++Throws: ++$(LREF ProcessException) on failure to start the process.$(BR) ++$(XREF stdio,StdioException) on failure to capture output. ++*/ ++auto execute(in char[][] args, ++ const string[string] env = null, ++ Config config = Config.none, ++ size_t maxOutput = size_t.max) ++ @trusted //TODO: @safe + { +- /**************************************** +- * Start up the browser and set it to viewing the page at url. +- */ +- void browse(string url); ++ return executeImpl!pipeProcess(args, env, config, maxOutput); + } +-else +-version (Windows) ++ ++/// ditto ++auto execute(in char[] program, ++ const string[string] env = null, ++ Config config = Config.none, ++ size_t maxOutput = size_t.max) ++ @trusted //TODO: @safe + { +- import core.sys.windows.windows; ++ return executeImpl!pipeProcess(program, env, config, maxOutput); ++} + +- extern (Windows) +- HINSTANCE ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd); ++/// ditto ++auto executeShell(in char[] command, ++ const string[string] env = null, ++ Config config = Config.none, ++ size_t maxOutput = size_t.max) ++ @trusted //TODO: @safe ++{ ++ return executeImpl!pipeShell(command, env, config, maxOutput); ++} + ++// Does the actual work for execute() and executeShell(). ++private auto executeImpl(alias pipeFunc, Cmd)( ++ Cmd commandLine, ++ const string[string] env = null, ++ Config config = Config.none, ++ size_t maxOutput = size_t.max) ++{ ++ auto p = pipeFunc(commandLine, Redirect.stdout | Redirect.stderrToStdout, ++ env, config); + +- pragma(lib,"shell32.lib"); ++ auto a = appender!(ubyte[])(); ++ enum size_t defaultChunkSize = 4096; ++ immutable chunkSize = min(maxOutput, defaultChunkSize); + +- void browse(string url) ++ // Store up to maxOutput bytes in a. ++ foreach (ubyte[] chunk; p.stdout.byChunk(chunkSize)) + { +- ShellExecuteA(null, "open", toStringz(url), null, null, SW_SHOWNORMAL); ++ immutable size_t remain = maxOutput - a.data.length; ++ ++ if (chunk.length < remain) a.put(chunk); ++ else ++ { ++ a.put(chunk[0 .. remain]); ++ break; ++ } + } ++ // Exhaust the stream, if necessary. ++ foreach (ubyte[] chunk; p.stdout.byChunk(defaultChunkSize)) { } ++ ++ struct ProcessOutput { int status; string output; } ++ return ProcessOutput(wait(p.pid), cast(string) a.data); + } +-else version (OSX) ++ ++unittest + { +- import core.stdc.stdio; +- import core.stdc.string; +- import core.sys.posix.unistd; ++ // To avoid printing the newline characters, we use the echo|set trick on ++ // Windows, and printf on POSIX (neither echo -n nor echo \c are portable). ++ version (Windows) TestScript prog = ++ "echo|set /p=%~1 ++ echo|set /p=%~2 1>&2 ++ exit 123"; ++ else version (Posix) TestScript prog = ++ `printf '%s' $1 ++ printf '%s' $2 >&2 ++ exit 123`; ++ auto r = execute([prog.path, "foo", "bar"]); ++ assert (r.status == 123); ++ assert (r.output.stripRight() == "foobar"); ++ auto s = execute([prog.path, "Hello", "World"]); ++ assert (s.status == 123); ++ assert (s.output.stripRight() == "HelloWorld"); ++} + +- void browse(string url) ++unittest ++{ ++ auto r1 = executeShell("echo foo"); ++ assert (r1.status == 0); ++ assert (r1.output.chomp() == "foo"); ++ auto r2 = executeShell("echo bar 1>&2"); ++ assert (r2.status == 0); ++ assert (r2.output.chomp().stripRight() == "bar"); ++ auto r3 = executeShell("exit 123"); ++ assert (r3.status == 123); ++ assert (r3.output.empty); ++} ++ ++ ++/// An exception that signals a problem with starting or waiting for a process. ++class ProcessException : Exception ++{ ++ // Standard constructor. ++ this(string msg, string file = __FILE__, size_t line = __LINE__) + { +- const(char)*[5] args; ++ super(msg, file, line); ++ } + +- const(char)* browser = core.stdc.stdlib.getenv("BROWSER"); +- if (browser) +- { browser = strdup(browser); +- args[0] = browser; +- args[1] = toStringz(url); +- args[2] = null; ++ // Creates a new ProcessException based on errno. ++ static ProcessException newFromErrno(string customMsg = null, ++ string file = __FILE__, ++ size_t line = __LINE__) ++ { ++ import core.stdc.errno; ++ import std.c.string; ++ version (linux) ++ { ++ char[1024] buf; ++ auto errnoMsg = to!string( ++ std.c.string.strerror_r(errno, buf.ptr, buf.length)); + } + else + { +- args[0] = "open".ptr; +- args[1] = toStringz(url); +- args[2] = null; ++ auto errnoMsg = to!string(std.c.string.strerror(errno)); + } ++ auto msg = customMsg.empty ? errnoMsg ++ : customMsg ~ " (" ~ errnoMsg ~ ')'; ++ return new ProcessException(msg, file, line); ++ } + +- auto childpid = fork(); +- if (childpid == 0) +- { +- core.sys.posix.unistd.execvp(args[0], cast(char**)args.ptr); +- perror(args[0]); // failed to execute +- return; +- } +- if (browser) +- free(cast(void*)browser); ++ // Creates a new ProcessException based on GetLastError() (Windows only). ++ version (Windows) ++ static ProcessException newFromLastError(string customMsg = null, ++ string file = __FILE__, ++ size_t line = __LINE__) ++ { ++ auto lastMsg = sysErrorString(GetLastError()); ++ auto msg = customMsg.empty ? lastMsg ++ : customMsg ~ " (" ~ lastMsg ~ ')'; ++ return new ProcessException(msg, file, line); + } + } +-else version (Posix) ++ ++ ++/** ++Determines the path to the current user's default command interpreter. ++ ++On Windows, this function returns the contents of the COMSPEC environment ++variable, if it exists. Otherwise, it returns the string $(D "cmd.exe"). ++ ++On POSIX, $(D userShell) returns the contents of the SHELL environment ++variable, if it exists and is non-empty. Otherwise, it returns ++$(D "/bin/sh"). ++*/ ++@property string userShell() @safe //TODO: nothrow + { +- import core.stdc.stdio; +- import core.stdc.string; +- import core.sys.posix.unistd; ++ version (Windows) return environment.get("COMSPEC", "cmd.exe"); ++ else version (Posix) return environment.get("SHELL", "/bin/sh"); ++} + +- void browse(string url) +- { +- const(char)*[3] args; + +- const(char)* browser = core.stdc.stdlib.getenv("BROWSER"); +- if (browser) +- { browser = strdup(browser); +- args[0] = browser; +- } +- else +- //args[0] = "x-www-browser".ptr; // doesn't work on some systems +- args[0] = "xdg-open".ptr; ++// A command-line switch that indicates to the shell that it should ++// interpret the following argument as a command to be executed. ++version (Posix) private immutable string shellSwitch = "-c"; ++version (Windows) private immutable string shellSwitch = "/C"; + +- args[1] = toStringz(url); +- args[2] = null; + +- auto childpid = fork(); +- if (childpid == 0) ++/// Returns the process ID number of the current process. ++@property int thisProcessID() @trusted //TODO: @safe nothrow ++{ ++ version (Windows) return GetCurrentProcessId(); ++ else version (Posix) return getpid(); ++} ++ ++ ++// Unittest support code: TestScript takes a string that contains a ++// shell script for the current platform, and writes it to a temporary ++// file. On Windows the file name gets a .cmd extension, while on ++// POSIX its executable permission bit is set. The file is ++// automatically deleted when the object goes out of scope. ++version (unittest) ++private struct TestScript ++{ ++ this(string code) ++ { ++ import std.ascii, std.file; ++ version (Windows) + { +- core.sys.posix.unistd.execvp(args[0], cast(char**)args.ptr); +- perror(args[0]); // failed to execute +- return; ++ auto ext = ".cmd"; ++ auto firstLine = "@echo off"; ++ } ++ else version (Posix) ++ { ++ auto ext = ""; ++ auto firstLine = "#!/bin/sh"; ++ } ++ path = uniqueTempPath()~ext; ++ std.file.write(path, firstLine~std.ascii.newline~code~std.ascii.newline); ++ version (Posix) ++ { ++ import core.sys.posix.sys.stat; ++ chmod(toStringz(path), octal!777); ++ } ++ } ++ ++ ~this() ++ { ++ import std.file; ++ if (!path.empty && exists(path)) ++ { ++ try { remove(path); } ++ catch (Exception e) ++ { ++ debug std.stdio.stderr.writeln(e.msg); ++ } + } +- if (browser) +- free(cast(void*)browser); + } ++ ++ string path; + } +-else +- static assert(0, "os not supported"); + ++version (unittest) ++private string uniqueTempPath() ++{ ++ import std.file, std.uuid; ++ return buildPath(tempDir(), randomUUID().toString()); ++} ++ ++ ++// ============================================================================= ++// Functions for shell command quoting/escaping. ++// ============================================================================= + +-/* ////////////////////////////////////////////////////////////////////////// */ + + /* + Command line arguments exist in three forms: +@@ -857,17 +2166,160 @@ else + format (2) is hidden away from the user in this module. + */ + +-pure @safe nothrow +-private char[] charAllocator(size_t size) { return new char[size]; } +- + /** +- Quote an argument in a manner conforming to the behavior of +- $(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx, +- CommandLineToArgvW). ++Escapes an argv-style argument array to be used with $(LREF spawnShell), ++$(LREF pipeShell) or $(LREF executeShell). ++--- ++string url = "http://dlang.org/"; ++executeShell(escapeShellCommand("wget", url, "-O", "dlang-index.html")); ++--- ++ ++Concatenate multiple $(D escapeShellCommand) and ++$(LREF escapeShellFileName) results to use shell redirection or ++piping operators. ++--- ++executeShell( ++ escapeShellCommand("curl", "http://dlang.org/download.html") ~ ++ "|" ~ ++ escapeShellCommand("grep", "-o", `http://\S*\.zip`) ~ ++ ">" ~ ++ escapeShellFileName("D download links.txt")); ++--- ++ ++Throws: ++$(OBJECTREF Exception) if any part of the command line contains unescapable ++characters (NUL on all platforms, as well as CR and LF on Windows). + */ ++string escapeShellCommand(in char[][] args...) ++ //TODO: @safe pure nothrow ++{ ++ return escapeShellCommandString(escapeShellArguments(args)); ++} ++ ++unittest ++{ ++ // This is a simple unit test without any special requirements, ++ // in addition to the unittest_burnin one below which requires ++ // special preparation. ++ ++ struct TestVector { string[] args; string windows, posix; } ++ TestVector[] tests = ++ [ ++ { ++ args : ["foo"], ++ windows : `^"foo^"`, ++ posix : `'foo'` ++ }, ++ { ++ args : ["foo", "hello"], ++ windows : `^"foo^" ^"hello^"`, ++ posix : `'foo' 'hello'` ++ }, ++ { ++ args : ["foo", "hello world"], ++ windows : `^"foo^" ^"hello world^"`, ++ posix : `'foo' 'hello world'` ++ }, ++ { ++ args : ["foo", "hello", "world"], ++ windows : `^"foo^" ^"hello^" ^"world^"`, ++ posix : `'foo' 'hello' 'world'` ++ }, ++ { ++ args : ["foo", `'"^\`], ++ windows : `^"foo^" ^"'\^"^^\\^"`, ++ posix : `'foo' ''\''"^\'` ++ }, ++ ]; ++ ++ foreach (test; tests) ++ version (Windows) ++ assert(escapeShellCommand(test.args) == test.windows); ++ else ++ assert(escapeShellCommand(test.args) == test.posix ); ++} ++ ++private string escapeShellCommandString(string command) ++ //TODO: @safe pure nothrow ++{ ++ version (Windows) ++ return escapeWindowsShellCommand(command); ++ else ++ return command; ++} ++ ++private string escapeWindowsShellCommand(in char[] command) ++ //TODO: @safe pure nothrow (prevented by Appender) ++{ ++ auto result = appender!string(); ++ result.reserve(command.length); ++ ++ foreach (c; command) ++ switch (c) ++ { ++ case '\0': ++ throw new Exception("Cannot put NUL in command line"); ++ case '\r': ++ case '\n': ++ throw new Exception("CR/LF are not escapable"); ++ case '\x01': .. case '\x09': ++ case '\x0B': .. case '\x0C': ++ case '\x0E': .. case '\x1F': ++ case '"': ++ case '^': ++ case '&': ++ case '<': ++ case '>': ++ case '|': ++ result.put('^'); ++ goto default; ++ default: ++ result.put(c); ++ } ++ return result.data; ++} ++ ++private string escapeShellArguments(in char[][] args...) ++ @trusted pure nothrow ++{ ++ char[] buf; ++ ++ @safe nothrow ++ char[] allocator(size_t size) ++ { ++ if (buf.length == 0) ++ return buf = new char[size]; ++ else ++ { ++ auto p = buf.length; ++ buf.length = buf.length + 1 + size; ++ buf[p++] = ' '; ++ return buf[p..p+size]; ++ } ++ } ++ ++ foreach (arg; args) ++ escapeShellArgument!allocator(arg); ++ return assumeUnique(buf); ++} ++ ++private auto escapeShellArgument(alias allocator)(in char[] arg) @safe nothrow ++{ ++ // The unittest for this function requires special ++ // preparation - see below. ++ ++ version (Windows) ++ return escapeWindowsArgumentImpl!allocator(arg); ++ else ++ return escapePosixArgumentImpl!allocator(arg); ++} + +-pure nothrow +-string escapeWindowsArgument(in char[] arg) ++/** ++Quotes a command-line argument in a manner conforming to the behavior of ++$(LINK2 http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx, ++CommandLineToArgvW). ++*/ ++string escapeWindowsArgument(in char[] arg) @trusted pure nothrow + { + // Rationale for leaving this function as public: + // this algorithm of escaping paths is also used in other software, +@@ -877,8 +2329,15 @@ string escapeWindowsArgument(in char[] a + return assumeUnique(buf); + } + +-@safe nothrow ++ ++private char[] charAllocator(size_t size) @safe pure nothrow ++{ ++ return new char[size]; ++} ++ ++ + private char[] escapeWindowsArgumentImpl(alias allocator)(in char[] arg) ++ @safe nothrow + if (is(typeof(allocator(size_t.init)[0] = char.init))) + { + // References: +@@ -974,15 +2433,14 @@ version(Windows) version(unittest) + } + } + +-pure nothrow +-private string escapePosixArgument(in char[] arg) ++private string escapePosixArgument(in char[] arg) @trusted pure nothrow + { + auto buf = escapePosixArgumentImpl!charAllocator(arg); + return assumeUnique(buf); + } + +-@safe nothrow + private char[] escapePosixArgumentImpl(alias allocator)(in char[] arg) ++ @safe nothrow + if (is(typeof(allocator(size_t.init)[0] = char.init))) + { + // '\'' means: close quoted part of argument, append an escaped +@@ -1013,169 +2471,63 @@ private char[] escapePosixArgumentImpl(a + return buf; + } + +-@safe nothrow +-private auto escapeShellArgument(alias allocator)(in char[] arg) ++/** ++Escapes a filename to be used for shell redirection with $(LREF spawnShell), ++$(LREF pipeShell) or $(LREF executeShell). ++*/ ++string escapeShellFileName(in char[] fileName) @trusted pure nothrow + { + // The unittest for this function requires special + // preparation - see below. + + version (Windows) +- return escapeWindowsArgumentImpl!allocator(arg); ++ return cast(string)('"' ~ fileName ~ '"'); + else +- return escapePosixArgumentImpl!allocator(arg); ++ return escapePosixArgument(fileName); + } + +-pure nothrow +-private string escapeShellArguments(in char[][] args) ++// Loop generating strings with random characters ++//version = unittest_burnin; ++ ++version(unittest_burnin) ++unittest + { +- char[] buf; ++ // There are no readily-available commands on all platforms suitable ++ // for properly testing command escaping. The behavior of CMD's "echo" ++ // built-in differs from the POSIX program, and Windows ports of POSIX ++ // environments (Cygwin, msys, gnuwin32) may interfere with their own ++ // "echo" ports. + +- @safe nothrow +- char[] allocator(size_t size) ++ // To run this unit test, create std_process_unittest_helper.d with the ++ // following content and compile it: ++ // import std.stdio, std.array; void main(string[] args) { write(args.join("\0")); } ++ // Then, test this module with: ++ // rdmd --main -unittest -version=unittest_burnin process.d ++ ++ auto helper = absolutePath("std_process_unittest_helper"); ++ assert(shell(helper ~ " hello").split("\0")[1..$] == ["hello"], "Helper malfunction"); ++ ++ void test(string[] s, string fn) + { +- if (buf.length == 0) +- return buf = new char[size]; +- else ++ string e; ++ string[] g; ++ ++ e = escapeShellCommand(helper ~ s); + { +- auto p = buf.length; +- buf.length = buf.length + 1 + size; +- buf[p++] = ' '; +- return buf[p..p+size]; ++ scope(failure) writefln("shell() failed.\nExpected:\t%s\nEncoded:\t%s", s, [e]); ++ g = shell(e).split("\0")[1..$]; + } +- } +- +- foreach (arg; args) +- escapeShellArgument!allocator(arg); +- return assumeUnique(buf); +-} +- +-string escapeWindowsShellCommand(in char[] command) +-{ +- auto result = appender!string(); +- result.reserve(command.length); ++ assert(s == g, format("shell() test failed.\nExpected:\t%s\nGot:\t\t%s\nEncoded:\t%s", s, g, [e])); + +- foreach (c; command) +- switch (c) ++ e = escapeShellCommand(helper ~ s) ~ ">" ~ escapeShellFileName(fn); + { +- case '\0': +- assert(0, "Cannot put NUL in command line"); +- case '\r': +- case '\n': +- assert(0, "CR/LF are not escapable"); +- case '\x01': .. case '\x09': +- case '\x0B': .. case '\x0C': +- case '\x0E': .. case '\x1F': +- case '"': +- case '^': +- case '&': +- case '<': +- case '>': +- case '|': +- result.put('^'); +- goto default; +- default: +- result.put(c); ++ scope(failure) writefln("system() failed.\nExpected:\t%s\nFilename:\t%s\nEncoded:\t%s", s, [fn], [e]); ++ system(e); ++ g = readText(fn).split("\0")[1..$]; + } +- return result.data; +-} +- +-private string escapeShellCommandString(string command) +-{ +- version (Windows) +- return escapeWindowsShellCommand(command); +- else +- return command; +-} +- +-/** +- Escape an argv-style argument array to be used with the +- $(D system) or $(D shell) functions. +- +- Example: +---- +-string url = "http://dlang.org/"; +-system(escapeShellCommand("wget", url, "-O", "dlang-index.html")); +---- +- +- Concatenate multiple $(D escapeShellCommand) and +- $(D escapeShellFileName) results to use shell redirection or +- piping operators. +- +- Example: +---- +-system( +- escapeShellCommand("curl", "http://dlang.org/download.html") ~ +- "|" ~ +- escapeShellCommand("grep", "-o", `http://\S*\.zip`) ~ +- ">" ~ +- escapeShellFileName("D download links.txt")); +---- +-*/ +- +-string escapeShellCommand(in char[][] args...) +-{ +- return escapeShellCommandString(escapeShellArguments(args)); +-} +- +-/** +- Escape a filename to be used for shell redirection with +- the $(D system) or $(D shell) functions. +-*/ +- +-pure nothrow +-string escapeShellFileName(in char[] fn) +-{ +- // The unittest for this function requires special +- // preparation - see below. +- +- version (Windows) +- return cast(string)('"' ~ fn ~ '"'); +- else +- return escapePosixArgument(fn); +-} +- +-// Loop generating strings with random characters +-//version = unittest_burnin; +- +-version(unittest_burnin) +-unittest +-{ +- // There are no readily-available commands on all platforms suitable +- // for properly testing command escaping. The behavior of CMD's "echo" +- // built-in differs from the POSIX program, and Windows ports of POSIX +- // environments (Cygwin, msys, gnuwin32) may interfere with their own +- // "echo" ports. +- +- // To run this unit test, create std_process_unittest_helper.d with the +- // following content and compile it: +- // import std.stdio, std.array; void main(string[] args) { write(args.join("\0")); } +- // Then, test this module with: +- // rdmd --main -unittest -version=unittest_burnin process.d +- +- auto helper = absolutePath("std_process_unittest_helper"); +- assert(shell(helper ~ " hello").split("\0")[1..$] == ["hello"], "Helper malfunction"); +- +- void test(string[] s, string fn) +- { +- string e; +- string[] g; +- +- e = escapeShellCommand(helper ~ s); +- { +- scope(failure) writefln("shell() failed.\nExpected:\t%s\nEncoded:\t%s", s, [e]); +- g = shell(e).split("\0")[1..$]; +- } +- assert(s == g, format("shell() test failed.\nExpected:\t%s\nGot:\t\t%s\nEncoded:\t%s", s, g, [e])); +- +- e = escapeShellCommand(helper ~ s) ~ ">" ~ escapeShellFileName(fn); +- { +- scope(failure) writefln("system() failed.\nExpected:\t%s\nFilename:\t%s\nEncoded:\t%s", s, [fn], [e]); +- system(e); +- g = readText(fn).split("\0")[1..$]; +- } +- remove(fn); +- assert(s == g, format("system() test failed.\nExpected:\t%s\nGot:\t\t%s\nEncoded:\t%s", s, g, [e])); +- } ++ remove(fn); ++ assert(s == g, format("system() test failed.\nExpected:\t%s\nGot:\t\t%s\nEncoded:\t%s", s, g, [e])); ++ } + + while (true) + { +@@ -1237,3 +2589,848 @@ unittest + test(args, fn); + } + } ++ ++ ++// ============================================================================= ++// Environment variable manipulation. ++// ============================================================================= ++ ++ ++/** ++Manipulates _environment variables using an associative-array-like ++interface. ++ ++This class contains only static methods, and cannot be instantiated. ++See below for examples of use. ++*/ ++abstract final class environment ++{ ++static: ++ /** ++ Retrieves the value of the environment variable with the given $(D name). ++ --- ++ auto path = environment["PATH"]; ++ --- ++ ++ Throws: ++ $(OBJECTREF Exception) if the environment variable does not exist. ++ ++ See_also: ++ $(LREF environment.get), which doesn't throw on failure. ++ */ ++ string opIndex(in char[] name) @safe ++ { ++ string value; ++ enforce(getImpl(name, value), "Environment variable not found: "~name); ++ return value; ++ } ++ ++ /** ++ Retrieves the value of the environment variable with the given $(D name), ++ or a default value if the variable doesn't exist. ++ ++ Unlike $(LREF environment.opIndex), this function never throws. ++ --- ++ auto sh = environment.get("SHELL", "/bin/sh"); ++ --- ++ This function is also useful in checking for the existence of an ++ environment variable. ++ --- ++ auto myVar = environment.get("MYVAR"); ++ if (myVar is null) ++ { ++ // Environment variable doesn't exist. ++ // Note that we have to use 'is' for the comparison, since ++ // myVar == null is also true if the variable exists but is ++ // empty. ++ } ++ --- ++ */ ++ string get(in char[] name, string defaultValue = null) @safe //TODO: nothrow ++ { ++ string value; ++ auto found = getImpl(name, value); ++ return found ? value : defaultValue; ++ } ++ ++ /** ++ Assigns the given $(D value) to the environment variable with the given ++ $(D name). ++ ++ If the variable does not exist, it will be created. If it already exists, ++ it will be overwritten. ++ --- ++ environment["foo"] = "bar"; ++ --- ++ ++ Throws: ++ $(OBJECTREF Exception) if the environment variable could not be added ++ (e.g. if the name is invalid). ++ */ ++ inout(char)[] opIndexAssign(inout char[] value, in char[] name) @trusted ++ { ++ version (Posix) ++ { ++ if (core.sys.posix.stdlib.setenv(toStringz(name), toStringz(value), 1) != -1) ++ { ++ return value; ++ } ++ // The default errno error message is very uninformative ++ // in the most common case, so we handle it manually. ++ enforce(errno != EINVAL, ++ "Invalid environment variable name: '"~name~"'"); ++ errnoEnforce(false, ++ "Failed to add environment variable"); ++ assert(0); ++ } ++ else version (Windows) ++ { ++ enforce( ++ SetEnvironmentVariableW(toUTF16z(name), toUTF16z(value)), ++ sysErrorString(GetLastError()) ++ ); ++ return value; ++ } ++ else static assert(0); ++ } ++ ++ /** ++ Removes the environment variable with the given $(D name). ++ ++ If the variable isn't in the environment, this function returns ++ successfully without doing anything. ++ */ ++ void remove(in char[] name) @trusted // TODO: @safe nothrow ++ { ++ version (Windows) SetEnvironmentVariableW(toUTF16z(name), null); ++ else version (Posix) core.sys.posix.stdlib.unsetenv(toStringz(name)); ++ else static assert(0); ++ } ++ ++ /** ++ Copies all environment variables into an associative array. ++ ++ Windows_specific: ++ While Windows environment variable names are case insensitive, D's ++ built-in associative arrays are not. This function will store all ++ variable names in uppercase (e.g. $(D PATH)). ++ ++ Throws: ++ $(OBJECTREF Exception) if the environment variables could not ++ be retrieved (Windows only). ++ */ ++ string[string] toAA() @trusted ++ { ++ string[string] aa; ++ version (Posix) ++ { ++ for (int i=0; environ[i] != null; ++i) ++ { ++ immutable varDef = to!string(environ[i]); ++ immutable eq = std.string.indexOf(varDef, '='); ++ assert (eq >= 0); ++ ++ immutable name = varDef[0 .. eq]; ++ immutable value = varDef[eq+1 .. $]; ++ ++ // In POSIX, environment variables may be defined more ++ // than once. This is a security issue, which we avoid ++ // by checking whether the key already exists in the array. ++ // For more info: ++ // http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/environment-variables.html ++ if (name !in aa) aa[name] = value; ++ } ++ } ++ else version (Windows) ++ { ++ auto envBlock = GetEnvironmentStringsW(); ++ enforce(envBlock, "Failed to retrieve environment variables."); ++ scope(exit) FreeEnvironmentStringsW(envBlock); ++ ++ for (int i=0; envBlock[i] != '\0'; ++i) ++ { ++ auto start = i; ++ while (envBlock[i] != '=') ++i; ++ immutable name = toUTF8(toUpper(envBlock[start .. i])); ++ ++ start = i+1; ++ while (envBlock[i] != '\0') ++i; ++ // Just like in POSIX systems, environment variables may be ++ // defined more than once in an environment block on Windows, ++ // and it is just as much of a security issue there. Moreso, ++ // in fact, due to the case insensensitivity of variable names, ++ // which is not handled correctly by all programs. ++ if (name !in aa) aa[name] = toUTF8(envBlock[start .. i]); ++ } ++ } ++ else static assert(0); ++ return aa; ++ } ++ ++private: ++ // Returns the length of an environment variable (in number of ++ // wchars, including the null terminator), or 0 if it doesn't exist. ++ version (Windows) ++ int varLength(LPCWSTR namez) @trusted nothrow ++ { ++ return GetEnvironmentVariableW(namez, null, 0); ++ } ++ ++ // Retrieves the environment variable, returns false on failure. ++ bool getImpl(in char[] name, out string value) @trusted //TODO: nothrow ++ { ++ version (Windows) ++ { ++ const namez = toUTF16z(name); ++ immutable len = varLength(namez); ++ if (len == 0) return false; ++ if (len == 1) ++ { ++ value = ""; ++ return true; ++ } ++ ++ auto buf = new WCHAR[len]; ++ GetEnvironmentVariableW(namez, buf.ptr, to!DWORD(buf.length)); ++ value = toUTF8(buf[0 .. $-1]); ++ return true; ++ } ++ else version (Posix) ++ { ++ const vz = core.sys.posix.stdlib.getenv(toStringz(name)); ++ if (vz == null) return false; ++ auto v = vz[0 .. strlen(vz)]; ++ ++ // Cache the last call's result. ++ static string lastResult; ++ if (v != lastResult) lastResult = v.idup; ++ value = lastResult; ++ return true; ++ } ++ else static assert(0); ++ } ++} ++ ++unittest ++{ ++ // New variable ++ environment["std_process"] = "foo"; ++ assert (environment["std_process"] == "foo"); ++ ++ // Set variable again ++ environment["std_process"] = "bar"; ++ assert (environment["std_process"] == "bar"); ++ ++ // Remove variable ++ environment.remove("std_process"); ++ ++ // Remove again, should succeed ++ environment.remove("std_process"); ++ ++ // Throw on not found. ++ assertThrown(environment["std_process"]); ++ ++ // get() without default value ++ assert (environment.get("std_process") == null); ++ ++ // get() with default value ++ assert (environment.get("std_process", "baz") == "baz"); ++ ++ // Convert to associative array ++ auto aa = environment.toAA(); ++ assert (aa.length > 0); ++ foreach (n, v; aa) ++ { ++ // Wine has some bugs related to environment variables: ++ // - Wine allows the existence of an env. variable with the name ++ // "\0", but GetEnvironmentVariable refuses to retrieve it. ++ // - If an env. variable has zero length, i.e. is "\0", ++ // GetEnvironmentVariable should return 1. Instead it returns ++ // 0, indicating the variable doesn't exist. ++ version (Windows) if (n.length == 0 || v.length == 0) continue; ++ ++ assert (v == environment[n]); ++ } ++} ++ ++ ++ ++ ++// ============================================================================= ++// Everything below this line was part of the old std.process, and most of ++// it will be deprecated and removed. ++// ============================================================================= ++ ++ ++/* ++Macros: ++ ++WIKI=Phobos/StdProcess ++ ++Copyright: Copyright Digital Mars 2007 - 2009. ++License: Boost License 1.0. ++Authors: $(WEB digitalmars.com, Walter Bright), ++ $(WEB erdani.org, Andrei Alexandrescu), ++ $(WEB thecybershadow.net, Vladimir Panteleev) ++Source: $(PHOBOSSRC std/_process.d) ++*/ ++/* ++ Copyright Digital Mars 2007 - 2009. ++Distributed under the Boost Software License, Version 1.0. ++ (See accompanying file LICENSE_1_0.txt or copy at ++ http://www.boost.org/LICENSE_1_0.txt) ++*/ ++ ++ ++import core.stdc.stdlib; ++import std.c.stdlib; ++import core.stdc.errno; ++import core.thread; ++import std.c.process; ++import std.c.string; ++ ++version (Windows) ++{ ++ import std.format, std.random, std.file; ++} ++version (Posix) ++{ ++ import core.sys.posix.stdlib; ++} ++version (unittest) ++{ ++ import std.file, std.conv, std.random; ++} ++ ++ ++ ++/** ++ Execute $(D command) in a _command shell. ++ ++ $(RED This function is scheduled for deprecation. Please use ++ $(LREF spawnShell) or $(LREF executeShell) instead.) ++ ++ Returns: If $(D command) is null, returns nonzero if the _command ++ interpreter is found, and zero otherwise. If $(D command) is not ++ null, returns -1 on error, or the exit status of command (which may ++ in turn signal an error in command's execution). ++ ++ Note: On Unix systems, the homonym C function (which is accessible ++ to D programs as $(LINK2 std_c_process.html, std.c._system)) ++ returns a code in the same format as $(LUCKY waitpid, waitpid), ++ meaning that C programs must use the $(D WEXITSTATUS) macro to ++ extract the actual exit code from the $(D system) call. D's $(D ++ system) automatically extracts the exit status. ++ ++*/ ++ ++int system(string command) ++{ ++ if (!command) return std.c.process.system(null); ++ const commandz = toStringz(command); ++ immutable status = std.c.process.system(commandz); ++ if (status == -1) return status; ++ version (Posix) ++ { ++ if (exited(status)) ++ return exitstatus(status); ++ ++ // Abnormal termination, return -1. ++ return -1; ++ } ++ else version (Windows) ++ return status; ++ else ++ static assert(0, "system not implemented for this OS."); ++} ++ ++private void toAStringz(in string[] a, const(char)**az) ++{ ++ foreach(string s; a) ++ { ++ *az++ = toStringz(s); ++ } ++ *az = null; ++} ++ ++ ++/* ========================================================== */ ++ ++//version (Windows) ++//{ ++// int spawnvp(int mode, string pathname, string[] argv) ++// { ++// char** argv_ = cast(char**)alloca((char*).sizeof * (1 + argv.length)); ++// ++// toAStringz(argv, argv_); ++// ++// return std.c.process.spawnvp(mode, toStringz(pathname), argv_); ++// } ++//} ++ ++// Incorporating idea (for spawnvp() on Posix) from Dave Fladebo ++ ++alias std.c.process._P_WAIT P_WAIT; ++alias std.c.process._P_NOWAIT P_NOWAIT; ++ ++int spawnvp(int mode, string pathname, string[] argv) ++{ ++ auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ ++ toAStringz(argv, argv_); ++ ++ version (Posix) ++ { ++ return _spawnvp(mode, toStringz(pathname), argv_); ++ } ++ else version (Windows) ++ { ++ return std.c.process.spawnvp(mode, toStringz(pathname), argv_); ++ } ++ else ++ static assert(0, "spawnvp not implemented for this OS."); ++} ++ ++version (Posix) ++{ ++private import core.sys.posix.unistd; ++private import core.sys.posix.sys.wait; ++int _spawnvp(int mode, in char *pathname, in char **argv) ++{ ++ int retval = 0; ++ pid_t pid = fork(); ++ ++ if(!pid) ++ { // child ++ std.c.process.execvp(pathname, argv); ++ goto Lerror; ++ } ++ else if(pid > 0) ++ { // parent ++ if(mode == _P_NOWAIT) ++ { ++ retval = pid; // caller waits ++ } ++ else ++ { ++ while(1) ++ { ++ int status; ++ pid_t wpid = waitpid(pid, &status, 0); ++ if(exited(status)) ++ { ++ retval = exitstatus(status); ++ break; ++ } ++ else if(signaled(status)) ++ { ++ retval = -termsig(status); ++ break; ++ } ++ else if(stopped(status)) // ptrace support ++ continue; ++ else ++ goto Lerror; ++ } ++ } ++ ++ return retval; ++ } ++ ++Lerror: ++ retval = errno; ++ char[80] buf = void; ++ throw new Exception( ++ "Cannot spawn " ~ to!string(pathname) ~ "; " ++ ~ to!string(strerror_r(retval, buf.ptr, buf.length)) ++ ~ " [errno " ~ to!string(retval) ~ "]"); ++} // _spawnvp ++private ++{ ++ alias WIFSTOPPED stopped; ++ alias WIFSIGNALED signaled; ++ alias WTERMSIG termsig; ++ alias WIFEXITED exited; ++ alias WEXITSTATUS exitstatus; ++} // private ++} // version (Posix) ++ ++/* ========================================================== */ ++ ++/** ++ * Replace the current process by executing a command, $(D pathname), with ++ * the arguments in $(D argv). ++ * ++ * $(RED These functions are scheduled for deprecation. Please use ++ * $(LREF spawnShell) instead (or, alternatively, the homonymous C ++ * functions declared in $(D std.c.process).)) ++ * ++ * Typically, the first element of $(D argv) is ++ * the command being executed, i.e. $(D argv[0] == pathname). The 'p' ++ * versions of $(D exec) search the PATH environment variable for $(D ++ * pathname). The 'e' versions additionally take the new process' ++ * environment variables as an array of strings of the form key=value. ++ * ++ * Does not return on success (the current process will have been ++ * replaced). Returns -1 on failure with no indication of the ++ * underlying error. ++ */ ++ ++int execv(in string pathname, in string[] argv) ++{ ++ auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ ++ toAStringz(argv, argv_); ++ ++ return std.c.process.execv(toStringz(pathname), argv_); ++} ++ ++/** ditto */ ++int execve(in string pathname, in string[] argv, in string[] envp) ++{ ++ auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ auto envp_ = cast(const(char)**)alloca((char*).sizeof * (1 + envp.length)); ++ ++ toAStringz(argv, argv_); ++ toAStringz(envp, envp_); ++ ++ return std.c.process.execve(toStringz(pathname), argv_, envp_); ++} ++ ++/** ditto */ ++int execvp(in string pathname, in string[] argv) ++{ ++ auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ ++ toAStringz(argv, argv_); ++ ++ return std.c.process.execvp(toStringz(pathname), argv_); ++} ++ ++/** ditto */ ++int execvpe(in string pathname, in string[] argv, in string[] envp) ++{ ++version(Posix) ++{ ++ // Is pathname rooted? ++ if(pathname[0] == '/') ++ { ++ // Yes, so just call execve() ++ return execve(pathname, argv, envp); ++ } ++ else ++ { ++ // No, so must traverse PATHs, looking for first match ++ string[] envPaths = std.array.split( ++ to!string(core.stdc.stdlib.getenv("PATH")), ":"); ++ int iRet = 0; ++ ++ // Note: if any call to execve() succeeds, this process will cease ++ // execution, so there's no need to check the execve() result through ++ // the loop. ++ ++ foreach(string pathDir; envPaths) ++ { ++ string composite = cast(string) (pathDir ~ "/" ~ pathname); ++ ++ iRet = execve(composite, argv, envp); ++ } ++ if(0 != iRet) ++ { ++ iRet = execve(pathname, argv, envp); ++ } ++ ++ return iRet; ++ } ++} ++else version(Windows) ++{ ++ auto argv_ = cast(const(char)**)alloca((char*).sizeof * (1 + argv.length)); ++ auto envp_ = cast(const(char)**)alloca((char*).sizeof * (1 + envp.length)); ++ ++ toAStringz(argv, argv_); ++ toAStringz(envp, envp_); ++ ++ return std.c.process.execvpe(toStringz(pathname), argv_, envp_); ++} ++else ++{ ++ static assert(0); ++} // version ++} ++ ++/** ++ * Returns the process ID of the calling process, which is guaranteed to be ++ * unique on the system. This call is always successful. ++ * ++ * $(RED This function is scheduled for deprecation. Please use ++ * $(LREF thisProcessID) instead.) ++ * ++ * Example: ++ * --- ++ * writefln("Current process id: %s", getpid()); ++ * --- ++ */ ++alias core.thread.getpid getpid; ++ ++/** ++ Runs $(D_PARAM cmd) in a shell and returns its standard output. If ++ the process could not be started or exits with an error code, ++ throws ErrnoException. ++ ++ $(RED This function is scheduled for deprecation. Please use ++ $(LREF executeShell) instead.) ++ ++ Example: ++ ++ ---- ++ auto tempFilename = chomp(shell("mcookie")); ++ auto f = enforce(fopen(tempFilename), "w"); ++ scope(exit) ++ { ++ fclose(f) == 0 || assert(false); ++ system(escapeShellCommand("rm", tempFilename)); ++ } ++ ... use f ... ++ ---- ++*/ ++string shell(string cmd) ++{ ++ version(Windows) ++ { ++ // Generate a random filename ++ auto a = appender!string(); ++ foreach (ref e; 0 .. 8) ++ { ++ formattedWrite(a, "%x", rndGen.front); ++ rndGen.popFront(); ++ } ++ auto filename = a.data; ++ scope(exit) if (exists(filename)) remove(filename); ++ // We can't use escapeShellCommands here because we don't know ++ // if cmd is escaped (wrapped in quotes) or not, without relying ++ // on shady heuristics. The current code shouldn't cause much ++ // trouble unless filename contained spaces (it won't). ++ errnoEnforce(system(cmd ~ "> " ~ filename) == 0); ++ return readText(filename); ++ } ++ else version(Posix) ++ { ++ File f; ++ f.popen(cmd, "r"); ++ char[] line; ++ string result; ++ while (f.readln(line)) ++ { ++ result ~= line; ++ } ++ f.close(); ++ return result; ++ } ++ else ++ static assert(0, "shell not implemented for this OS."); ++} ++ ++unittest ++{ ++ auto x = shell("echo wyda"); ++ // @@@ This fails on wine ++ //assert(x == "wyda" ~ newline, text(x.length)); ++ ++ import std.exception; // Issue 9444 ++ assertThrown!ErrnoException(shell("qwertyuiop09813478")); ++} ++ ++/** ++Gets the value of environment variable $(D name) as a string. Calls ++$(LINK2 std_c_stdlib.html#_getenv, std.c.stdlib._getenv) ++internally. ++ ++ $(RED This function is scheduled for deprecation. Please use ++ $(LREF environment.get) instead.) ++*/ ++ ++string getenv(in char[] name) ++{ ++ // Cache the last call's result ++ static string lastResult; ++ auto p = core.stdc.stdlib.getenv(toStringz(name)); ++ if (!p) return null; ++ auto value = p[0 .. strlen(p)]; ++ if (value == lastResult) return lastResult; ++ return lastResult = value.idup; ++} ++ ++/** ++Sets the value of environment variable $(D name) to $(D value). If the ++value was written, or the variable was already present and $(D ++overwrite) is false, returns normally. Otherwise, it throws an ++exception. Calls $(LINK2 std_c_stdlib.html#_setenv, ++std.c.stdlib._setenv) internally. ++ ++ $(RED This function is scheduled for deprecation. Please use ++ $(LREF environment.opIndexAssign) instead.) ++*/ ++version(StdDdoc) void setenv(in char[] name, in char[] value, bool overwrite); ++else version(Posix) void setenv(in char[] name, in char[] value, bool overwrite) ++{ ++ errnoEnforce( ++ std.c.stdlib.setenv(toStringz(name), toStringz(value), overwrite) == 0); ++} ++ ++/** ++Removes variable $(D name) from the environment. Calls $(LINK2 ++std_c_stdlib.html#_unsetenv, std.c.stdlib._unsetenv) internally. ++ ++ $(RED This function is scheduled for deprecation. Please use ++ $(LREF environment.remove) instead.) ++*/ ++version(StdDdoc) void unsetenv(in char[] name); ++else version(Posix) void unsetenv(in char[] name) ++{ ++ errnoEnforce(std.c.stdlib.unsetenv(toStringz(name)) == 0); ++} ++ ++version (Posix) unittest ++{ ++ setenv("wyda", "geeba", true); ++ assert(getenv("wyda") == "geeba"); ++ // Get again to make sure caching works ++ assert(getenv("wyda") == "geeba"); ++ unsetenv("wyda"); ++ assert(getenv("wyda") is null); ++} ++ ++/* ////////////////////////////////////////////////////////////////////////// */ ++ ++version(MainTest) ++{ ++ int main(string[] args) ++ { ++ if(args.length < 2) ++ { ++ printf("Must supply executable (and optional arguments)\n"); ++ ++ return 1; ++ } ++ else ++ { ++ string[] dummy_env; ++ ++ dummy_env ~= "VAL0=value"; ++ dummy_env ~= "VAL1=value"; ++ ++/+ ++ foreach(string arg; args) ++ { ++ printf("%.*s\n", arg); ++ } +++/ ++ ++// int i = execv(args[1], args[1 .. args.length]); ++// int i = execvp(args[1], args[1 .. args.length]); ++ int i = execvpe(args[1], args[1 .. args.length], dummy_env); ++ ++ printf("exec??() has returned! Error code: %d; errno: %d\n", i, /* errno */-1); ++ ++ return 0; ++ } ++ } ++} ++ ++/* ////////////////////////////////////////////////////////////////////////// */ ++ ++ ++version(StdDdoc) ++{ ++ /**************************************** ++ * Start up the browser and set it to viewing the page at url. ++ */ ++ void browse(string url); ++} ++else ++version (Windows) ++{ ++ import core.sys.windows.windows; ++ ++ extern (Windows) ++ HINSTANCE ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd); ++ ++ ++ pragma(lib,"shell32.lib"); ++ ++ void browse(string url) ++ { ++ ShellExecuteA(null, "open", toStringz(url), null, null, SW_SHOWNORMAL); ++ } ++} ++else version (OSX) ++{ ++ import core.stdc.stdio; ++ import core.stdc.string; ++ import core.sys.posix.unistd; ++ ++ void browse(string url) ++ { ++ const(char)*[5] args; ++ ++ const(char)* browser = core.stdc.stdlib.getenv("BROWSER"); ++ if (browser) ++ { browser = strdup(browser); ++ args[0] = browser; ++ args[1] = toStringz(url); ++ args[2] = null; ++ } ++ else ++ { ++ args[0] = "open".ptr; ++ args[1] = toStringz(url); ++ args[2] = null; ++ } ++ ++ auto childpid = fork(); ++ if (childpid == 0) ++ { ++ core.sys.posix.unistd.execvp(args[0], cast(char**)args.ptr); ++ perror(args[0]); // failed to execute ++ return; ++ } ++ if (browser) ++ free(cast(void*)browser); ++ } ++} ++else version (Posix) ++{ ++ import core.stdc.stdio; ++ import core.stdc.string; ++ import core.sys.posix.unistd; ++ ++ void browse(string url) ++ { ++ const(char)*[3] args; ++ ++ const(char)* browser = core.stdc.stdlib.getenv("BROWSER"); ++ if (browser) ++ { browser = strdup(browser); ++ args[0] = browser; ++ } ++ else ++ //args[0] = "x-www-browser".ptr; // doesn't work on some systems ++ args[0] = "xdg-open".ptr; ++ ++ args[1] = toStringz(url); ++ args[2] = null; ++ ++ auto childpid = fork(); ++ if (childpid == 0) ++ { ++ core.sys.posix.unistd.execvp(args[0], cast(char**)args.ptr); ++ perror(args[0]); // failed to execute ++ return; ++ } ++ if (browser) ++ free(cast(void*)browser); ++ } ++} ++else ++ static assert(0, "os not supported"); +--- a/src/libphobos/src/std/random.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/random.d 2014-04-01 16:32:51.000000000 +0100 +@@ -112,7 +112,6 @@ version(unittest) import std.typetuple; + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) + */ + +- + /** + * Test if Rng is a random-number generator. The overload + * taking a ElementType also makes sure that the Rng generates +@@ -184,10 +183,10 @@ unittest + @property bool empty() {return false;} + void popFront() {} + } +- assert(!isUniformRNG!(NoRng, uint)); +- assert(!isUniformRNG!(NoRng)); +- assert(!isSeedable!(NoRng, uint)); +- assert(!isSeedable!(NoRng)); ++ static assert(!isUniformRNG!(NoRng, uint)); ++ static assert(!isUniformRNG!(NoRng)); ++ static assert(!isSeedable!(NoRng, uint)); ++ static assert(!isSeedable!(NoRng)); + + struct NoRng2 + { +@@ -197,10 +196,10 @@ unittest + + enum isUniformRandom = false; + } +- assert(!isUniformRNG!(NoRng2, uint)); +- assert(!isUniformRNG!(NoRng2)); +- assert(!isSeedable!(NoRng2, uint)); +- assert(!isSeedable!(NoRng2)); ++ static assert(!isUniformRNG!(NoRng2, uint)); ++ static assert(!isUniformRNG!(NoRng2)); ++ static assert(!isSeedable!(NoRng2, uint)); ++ static assert(!isSeedable!(NoRng2)); + + struct NoRng3 + { +@@ -209,10 +208,10 @@ unittest + + enum isUniformRandom = true; + } +- assert(!isUniformRNG!(NoRng3, uint)); +- assert(!isUniformRNG!(NoRng3)); +- assert(!isSeedable!(NoRng3, uint)); +- assert(!isSeedable!(NoRng3)); ++ static assert(!isUniformRNG!(NoRng3, uint)); ++ static assert(!isUniformRNG!(NoRng3)); ++ static assert(!isSeedable!(NoRng3, uint)); ++ static assert(!isSeedable!(NoRng3)); + + struct validRng + { +@@ -222,10 +221,10 @@ unittest + + enum isUniformRandom = true; + } +- assert(isUniformRNG!(validRng, uint)); +- assert(isUniformRNG!(validRng)); +- assert(!isSeedable!(validRng, uint)); +- assert(!isSeedable!(validRng)); ++ static assert(isUniformRNG!(validRng, uint)); ++ static assert(isUniformRNG!(validRng)); ++ static assert(!isSeedable!(validRng, uint)); ++ static assert(!isSeedable!(validRng)); + + struct seedRng + { +@@ -235,10 +234,10 @@ unittest + void seed(uint val){} + enum isUniformRandom = true; + } +- assert(isUniformRNG!(seedRng, uint)); +- assert(isUniformRNG!(seedRng)); +- assert(isSeedable!(seedRng, uint)); +- assert(isSeedable!(seedRng)); ++ static assert(isUniformRNG!(seedRng, uint)); ++ static assert(isUniformRNG!(seedRng)); ++ static assert(isSeedable!(seedRng, uint)); ++ static assert(isSeedable!(seedRng)); + } + + /** +@@ -456,15 +455,15 @@ alias LinearCongruentialEngine!(uint, 48 + + unittest + { +- assert(isForwardRange!MinstdRand); +- assert(isUniformRNG!MinstdRand); +- assert(isUniformRNG!MinstdRand0); +- assert(isUniformRNG!(MinstdRand, uint)); +- assert(isUniformRNG!(MinstdRand0, uint)); +- assert(isSeedable!MinstdRand); +- assert(isSeedable!MinstdRand0); +- assert(isSeedable!(MinstdRand, uint)); +- assert(isSeedable!(MinstdRand0, uint)); ++ static assert(isForwardRange!MinstdRand); ++ static assert(isUniformRNG!MinstdRand); ++ static assert(isUniformRNG!MinstdRand0); ++ static assert(isUniformRNG!(MinstdRand, uint)); ++ static assert(isUniformRNG!(MinstdRand0, uint)); ++ static assert(isSeedable!MinstdRand); ++ static assert(isSeedable!MinstdRand0); ++ static assert(isSeedable!(MinstdRand, uint)); ++ static assert(isSeedable!(MinstdRand0, uint)); + + // The correct numbers are taken from The Database of Integer Sequences + // http://www.research.att.com/~njas/sequences/eisBTfry00128.txt +@@ -505,6 +504,17 @@ unittest + rnd.seed(); + popFrontN(rnd, 9999); + assert(rnd.front == 399268537); ++ ++ // Check .save works ++ foreach (Type; TypeTuple!(MinstdRand0, MinstdRand)) ++ { ++ auto rnd1 = Type(unpredictableSeed); ++ auto rnd2 = rnd1.save; ++ assert(rnd1 == rnd2); ++ // Enable next test when RNGs are reference types ++ version(none) { assert(rnd1 !is rnd2); } ++ assert(rnd1.take(100).array() == rnd2.take(100).array()); ++ } + } + + /** +@@ -593,7 +603,7 @@ Parameter for the generator. + Throws: + $(D Exception) if the InputRange didn't provide enough elements to seed the generator. + The number of elements required is the 'n' template parameter of the MersenneTwisterEngine struct. +- ++ + Examples: + ---------------- + Mt19937 gen; +@@ -628,7 +638,7 @@ Parameter for the generator. + upperMask = ~((cast(UIntType) 1u << + (UIntType.sizeof * 8 - (w - r))) - 1), + lowerMask = (cast(UIntType) 1u << r) - 1; +- static immutable UIntType mag01[2] = [0x0UL, a]; ++ static immutable UIntType[2] mag01 = [0x0UL, a]; + + ulong y = void; + +@@ -689,7 +699,7 @@ Always $(D false). + */ + enum bool empty = false; + +- private UIntType mt[n]; ++ private UIntType[n] mt; + private size_t mti = size_t.max; /* means mt is not initialized */ + UIntType _y = UIntType.max; + } +@@ -719,11 +729,11 @@ alias MersenneTwisterEngine!(uint, 32, 6 + + unittest + { +- assert(isUniformRNG!Mt19937); +- assert(isUniformRNG!(Mt19937, uint)); +- assert(isSeedable!Mt19937); +- assert(isSeedable!(Mt19937, uint)); +- assert(isSeedable!(Mt19937, typeof(map!((a) => unpredictableSeed)(repeat(0))))); ++ static assert(isUniformRNG!Mt19937); ++ static assert(isUniformRNG!(Mt19937, uint)); ++ static assert(isSeedable!Mt19937); ++ static assert(isSeedable!(Mt19937, uint)); ++ static assert(isSeedable!(Mt19937, typeof(map!((a) => unpredictableSeed)(repeat(0))))); + Mt19937 gen; + popFrontN(gen, 9999); + assert(gen.front == 4123659995); +@@ -756,6 +766,20 @@ unittest + assert(a != b); + } + ++unittest ++{ ++ // Check .save works ++ foreach(Type; TypeTuple!(Mt19937)) ++ { ++ auto gen1 = Type(unpredictableSeed); ++ auto gen2 = gen1.save; ++ assert(gen1 == gen2); // Danger, Will Robinson -- no opEquals for MT ++ // Enable next test when RNGs are reference types ++ version(none) { assert(gen1 !is gen2); } ++ assert(gen1.take(100).array() == gen2.take(100).array()); ++ } ++} ++ + + /** + * Xorshift generator using 32bit algorithm. +@@ -776,8 +800,8 @@ struct XorshiftEngine(UIntType, UIntType + if(isUnsigned!UIntType) + { + static assert(bits == 32 || bits == 64 || bits == 96 || bits == 128 || bits == 160 || bits == 192, +- "Supporting bits are 32, 64, 96, 128, 160 and 192. " ~ to!string(bits) ~ " is not supported."); +- ++ "Xorshift supports only 32, 64, 96, 128, 160 and 192 bit versions. " ++ ~ to!string(bits) ~ " is not supported."); + + public: + ///Mark this as a Rng +@@ -803,11 +827,16 @@ struct XorshiftEngine(UIntType, UIntType + UIntType[size] seeds_ = [123456789, 362436069, 521288629, 88675123]; + else static if (bits == 160) + UIntType[size] seeds_ = [123456789, 362436069, 521288629, 88675123, 5783321]; +- else +- { // 192bits ++ else static if (bits == 192) ++ { + UIntType[size] seeds_ = [123456789, 362436069, 521288629, 88675123, 5783321, 6615241]; + UIntType value_; + } ++ else ++ { ++ static assert(false, "Phobos Error: Xorshift has no instantiation rule for " ++ ~ to!string(bits) ~ " bits."); ++ } + + + public: +@@ -862,7 +891,7 @@ struct XorshiftEngine(UIntType, UIntType + static if (bits == 32) + { + temp = seeds_[0] ^ (seeds_[0] << a); +- temp = temp >> b; ++ temp = temp ^ (temp >> b); + seeds_[0] = temp ^ (temp << c); + } + else static if (bits == 64) +@@ -888,15 +917,15 @@ struct XorshiftEngine(UIntType, UIntType + } + else static if (bits == 160) + { +- temp = seeds_[0] ^ (seeds_[0] >> a); ++ temp = seeds_[0] ^ (seeds_[0] << a); + seeds_[0] = seeds_[1]; + seeds_[1] = seeds_[2]; + seeds_[2] = seeds_[3]; + seeds_[3] = seeds_[4]; + seeds_[4] = seeds_[4] ^ (seeds_[4] >> c) ^ temp ^ (temp >> b); + } +- else +- { // 192bits ++ else static if (bits == 192) ++ { + temp = seeds_[0] ^ (seeds_[0] >> a); + seeds_[0] = seeds_[1]; + seeds_[1] = seeds_[2]; +@@ -905,6 +934,11 @@ struct XorshiftEngine(UIntType, UIntType + seeds_[4] = seeds_[4] ^ (seeds_[4] << c) ^ temp ^ (temp << b); + value_ = seeds_[4] + (seeds_[5] += 362437); + } ++ else ++ { ++ static assert(false, "Phobos Error: Xorshift has no popFront() update for " ++ ~ to!string(bits) ~ " bits."); ++ } + } + + +@@ -969,7 +1003,7 @@ struct XorshiftEngine(UIntType, UIntType + * num = rnd.front; // different across runs + * ----- + */ +-alias XorshiftEngine!(uint, 32, 13, 17, 5) Xorshift32; ++alias XorshiftEngine!(uint, 32, 13, 17, 15) Xorshift32; + alias XorshiftEngine!(uint, 64, 10, 13, 10) Xorshift64; /// ditto + alias XorshiftEngine!(uint, 96, 10, 5, 26) Xorshift96; /// ditto + alias XorshiftEngine!(uint, 128, 11, 8, 19) Xorshift128; /// ditto +@@ -980,23 +1014,25 @@ alias Xorshift128 Xorshift; + + unittest + { +- assert(isForwardRange!Xorshift); +- assert(isUniformRNG!Xorshift); +- assert(isUniformRNG!(Xorshift, uint)); +- assert(isSeedable!Xorshift); +- assert(isSeedable!(Xorshift, uint)); ++ static assert(isForwardRange!Xorshift); ++ static assert(isUniformRNG!Xorshift); ++ static assert(isUniformRNG!(Xorshift, uint)); ++ static assert(isSeedable!Xorshift); ++ static assert(isSeedable!(Xorshift, uint)); + + // Result from reference implementation. + auto checking = [ +- [2463534242UL, 267649, 551450, 53765, 108832, 215250, 435468, 860211, 660133, 263375], ++ [2463534242UL, 901999875, 3371835698, 2675058524, 1053936272, 3811264849, 472493137, 3856898176, 2131710969, 2312157505], + [362436069UL, 2113136921, 19051112, 3010520417, 951284840, 1213972223, 3173832558, 2611145638, 2515869689, 2245824891], + [521288629UL, 1950277231, 185954712, 1582725458, 3580567609, 2303633688, 2394948066, 4108622809, 1116800180, 3357585673], + [88675123UL, 3701687786, 458299110, 2500872618, 3633119408, 516391518, 2377269574, 2599949379, 717229868, 137866584], +- [5783321UL, 93724048, 491642011, 136638118, 246438988, 238186808, 140181925, 533680092, 285770921, 462053907], ++ [5783321UL, 393427209, 1947109840, 565829276, 1006220149, 971147905, 1436324242, 2800460115, 1484058076, 3823330032], + [0UL, 246875399, 3690007200, 1264581005, 3906711041, 1866187943, 2481925219, 2464530826, 1604040631, 3653403911] + ]; + +- foreach (I, Type; TypeTuple!(Xorshift32, Xorshift64, Xorshift96, Xorshift128, Xorshift160, Xorshift192)) ++ alias TypeTuple!(Xorshift32, Xorshift64, Xorshift96, Xorshift128, Xorshift160, Xorshift192) XorshiftTypes; ++ ++ foreach (I, Type; XorshiftTypes) + { + Type rnd; + +@@ -1006,6 +1042,48 @@ unittest + rnd.popFront(); + } + } ++ ++ // Check .save works ++ foreach (Type; XorshiftTypes) ++ { ++ auto rnd1 = Type(unpredictableSeed); ++ auto rnd2 = rnd1.save; ++ assert(rnd1 == rnd2); ++ // Enable next test when RNGs are reference types ++ version(none) { assert(rnd1 !is rnd2); } ++ assert(rnd1.take(100).array() == rnd2.take(100).array()); ++ } ++} ++ ++ ++/* A complete list of all pseudo-random number generators implemented in ++ * std.random. This can be used to confirm that a given function or ++ * object is compatible with all the pseudo-random number generators ++ * available. It is enabled only in unittest mode. ++ * ++ * Example: ++ * ++ * ---- ++ * foreach(Rng; PseudoRngTypes) ++ * { ++ * static assert(isUniformRng!Rng); ++ * auto rng = Rng(unpredictableSeed); ++ * foo(rng); ++ * } ++ * ---- ++ */ ++version(unittest) ++{ ++ package alias PseudoRngTypes = TypeTuple!(MinstdRand0, MinstdRand, Mt19937, Xorshift32, Xorshift64, ++ Xorshift96, Xorshift128, Xorshift160, Xorshift192); ++} ++ ++unittest ++{ ++ foreach(Rng; PseudoRngTypes) ++ { ++ static assert(isUniformRNG!Rng); ++ } + } + + +@@ -1056,10 +1134,10 @@ alias Mt19937 Random; + + unittest + { +- assert(isUniformRNG!Random); +- assert(isUniformRNG!(Random, uint)); +- assert(isSeedable!Random); +- assert(isSeedable!(Random, uint)); ++ static assert(isUniformRNG!Random); ++ static assert(isUniformRNG!(Random, uint)); ++ static assert(isSeedable!Random); ++ static assert(isSeedable!(Random, uint)); + } + + /** +@@ -1093,7 +1171,7 @@ take $(D urng) uses the default generato + Example: + + ---- +-Random gen(unpredictableSeed); ++auto gen = Random(unpredictableSeed); + // Generate an integer in [0, 1023] + auto a = uniform(0, 1024, gen); + // Generate a float in [0, 1$(RPAREN) +@@ -1253,7 +1331,7 @@ passed, uses the default $(D rndGen). + */ + auto uniform(T, UniformRandomNumberGenerator) + (ref UniformRandomNumberGenerator urng) +-if (isIntegral!T || isSomeChar!T) ++if (!is(T == enum) && (isIntegral!T || isSomeChar!T)) + { + auto r = urng.front; + urng.popFront(); +@@ -1272,7 +1350,7 @@ if (isIntegral!T || isSomeChar!T) + + /// Ditto + auto uniform(T)() +-if (isIntegral!T || isSomeChar!T) ++if (!is(T == enum) && (isIntegral!T || isSomeChar!T)) + { + return uniform!T(rndGen); + } +@@ -1290,6 +1368,37 @@ unittest + } + + /** ++Returns a uniformly selected member of enum $(D E). If no random number ++generator is passed, uses the default $(D rndGen). ++ */ ++auto uniform(E, UniformRandomNumberGenerator) ++(ref UniformRandomNumberGenerator urng) ++if (is(E == enum)) ++{ ++ static immutable E[EnumMembers!E.length] members = [EnumMembers!E]; ++ return members[std.random.uniform(0, members.length, urng)]; ++} ++ ++/// Ditto ++auto uniform(E)() ++if (is(E == enum)) ++{ ++ return uniform!E(rndGen); ++} ++ ++unittest ++{ ++ enum Fruit { Apple = 12, Mango = 29, Pear = 72 } ++ foreach (_; 0 .. 100) ++ { ++ foreach(f; [uniform!Fruit(), rndGen.uniform!Fruit()]) ++ { ++ assert(f == Fruit.Apple || f == Fruit.Mango || f == Fruit.Pear); ++ } ++ } ++} ++ ++/** + Generates a uniform probability distribution of size $(D n), i.e., an + array of size $(D n) of positive numbers of type $(D F) that sum to + $(D 1). If $(D useThis) is provided, it is used as storage. +@@ -1322,38 +1431,47 @@ Shuffles elements of $(D r) using $(D ge + a random-access range with length. + */ + +-void randomShuffle(Range, RandomGen = Random)(Range r, +- ref RandomGen gen = rndGen) ++void randomShuffle(Range, RandomGen)(Range r, ref RandomGen gen) + if(isRandomAccessRange!Range && isUniformRNG!RandomGen) + { + return partialShuffle!(Range, RandomGen)(r, r.length, gen); + } + ++/// ditto ++void randomShuffle(Range)(Range r) ++ if(isRandomAccessRange!Range) ++{ ++ return randomShuffle(r, rndGen); ++} ++ + unittest + { +- // Also tests partialShuffle indirectly. +- auto a = ([ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]).dup; +- auto b = a.dup; +- Mt19937 gen; +- randomShuffle(a, gen); +- assert(a.sort == b.sort); +- randomShuffle(a); +- assert(a.sort == b.sort); ++ foreach(Rng; PseudoRngTypes) ++ { ++ static assert(isUniformRNG!Rng); ++ // Also tests partialShuffle indirectly. ++ auto a = ([ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]).dup; ++ auto b = a.dup; ++ Rng gen; ++ randomShuffle(a, gen); ++ assert(a.sort == b.sort); ++ randomShuffle(a); ++ assert(a.sort == b.sort); ++ } + } + + /** +-Partially shuffles the elements of $(D r) such that upon returning $(D r[0..n]) +-is a random subset of $(D r) and is randomly ordered. $(D r[n..r.length]) +-will contain the elements not in $(D r[0..n]). These will be in an undefined +-order, but will not be random in the sense that their order after +-$(D partialShuffle) returns will not be independent of their order before ++Partially shuffles the elements of $(D r) such that upon returning $(D r[0..n]) ++is a random subset of $(D r) and is randomly ordered. $(D r[n..r.length]) ++will contain the elements not in $(D r[0..n]). These will be in an undefined ++order, but will not be random in the sense that their order after ++$(D partialShuffle) returns will not be independent of their order before + $(D partialShuffle) was called. + + $(D r) must be a random-access range with length. $(D n) must be less than +-or equal to $(D r.length). ++or equal to $(D r.length). + */ +-void partialShuffle(Range, RandomGen = Random)(Range r, size_t n, +- ref RandomGen gen = rndGen) ++void partialShuffle(Range, RandomGen)(Range r, size_t n, ref RandomGen gen) + if(isRandomAccessRange!Range && isUniformRNG!RandomGen) + { + enforce(n <= r.length, "n must be <= r.length for partialShuffle."); +@@ -1363,6 +1481,13 @@ void partialShuffle(Range, RandomGen = R + } + } + ++/// ditto ++void partialShuffle(Range)(Range r, size_t n) ++ if(isRandomAccessRange!Range) ++{ ++ return partialShuffle(r, n, rndGen); ++} ++ + /** + Rolls a dice with relative probabilities stored in $(D + proportions). Returns the index in $(D proportions) that was chosen. +@@ -1440,41 +1565,102 @@ Covers a given range $(D r) in a random + element of $(D r) once and only once, just in a random order. $(D r) + must be a random-access range with length. + ++If no random number generator is passed to $(D randomCover), the ++thread-global RNG rndGen will be used internally. ++ + Example: + ---- + int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; +-auto rnd = Random(unpredictableSeed); +-foreach (e; randomCover(a, rnd)) ++foreach (e; randomCover(a)) + { + writeln(e); + } + ---- ++ ++$(B WARNING:) If an alternative RNG is desired, it is essential for this ++to be a $(I new) RNG seeded in an unpredictable manner. Passing it a RNG ++used elsewhere in the program will result in unintended correlations, ++due to the current implementation of RNGs as value types. ++ ++Example: ++---- ++int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; ++foreach (e; randomCover(a, Random(unpredictableSeed))) // correct! ++{ ++ writeln(e); ++} ++ ++foreach (e; randomCover(a, rndGen)) // DANGEROUS!! rndGen gets copied by value ++{ ++ writeln(e); ++} ++ ++foreach (e; randomCover(a, rndGen)) // ... so this second random cover ++{ // will output the same sequence as ++ writeln(e); // the previous one. ++} ++---- ++ ++These issues will be resolved in a second-generation std.random that ++re-implements random number generators as reference types. + */ +-struct RandomCover(Range, Random) +- if(isRandomAccessRange!Range && isUniformRNG!Random) ++struct RandomCover(Range, UniformRNG = void) ++ if (isRandomAccessRange!Range && (isUniformRNG!UniformRNG || is(UniformRNG == void))) + { + private Range _input; +- private Random _rnd; + private bool[] _chosen; +- private uint _current; +- private uint _alreadyChosen; ++ private size_t _current; ++ private size_t _alreadyChosen = 0; + +- this(Range input, Random rnd) ++ static if (is(UniformRNG == void)) + { +- _input = input; +- _rnd = rnd; +- _chosen.length = _input.length; +- popFront(); ++ this(Range input) ++ { ++ _input = input; ++ _chosen.length = _input.length; ++ _alreadyChosen = 0; ++ } ++ } ++ else ++ { ++ private UniformRNG _rng; ++ ++ this(Range input, ref UniformRNG rng) ++ { ++ _input = input; ++ _rng = rng; ++ _chosen.length = _input.length; ++ _alreadyChosen = 0; ++ } ++ ++ this(Range input, UniformRNG rng) ++ { ++ this(input, rng); ++ } + } + + static if (hasLength!Range) ++ { + @property size_t length() + { +- return (1 + _input.length) - _alreadyChosen; ++ if (_alreadyChosen == 0) ++ { ++ return _input.length; ++ } ++ else ++ { ++ return (1 + _input.length) - _alreadyChosen; ++ } + } ++ } + + @property auto ref front() + { ++ if (_alreadyChosen == 0) ++ { ++ _chosen[] = false; ++ popFront(); ++ } + return _input[_current]; + } + +@@ -1487,12 +1673,19 @@ struct RandomCover(Range, Random) + return; + } + size_t k = _input.length - _alreadyChosen; +- uint i; ++ size_t i; + foreach (e; _input) + { + if (_chosen[i]) { ++i; continue; } + // Roll a dice with k faces +- auto chooseMe = uniform(0, k, _rnd) == 0; ++ static if (is(UniformRNG == void)) ++ { ++ auto chooseMe = uniform(0, k) == 0; ++ } ++ else ++ { ++ auto chooseMe = uniform(0, k, _rng) == 0; ++ } + assert(k > 1 || chooseMe); + if (chooseMe) + { +@@ -1504,43 +1697,67 @@ struct RandomCover(Range, Random) + --k; + ++i; + } +- assert(false); + } + +- @property typeof(this) save() ++ static if (isForwardRange!UniformRNG) + { +- auto ret = this; +- ret._input = _input.save; +- ret._rnd = _rnd.save; +- return ret; ++ @property typeof(this) save() ++ { ++ auto ret = this; ++ ret._input = _input.save; ++ ret._rng = _rng.save; ++ return ret; ++ } + } + + @property bool empty() { return _alreadyChosen > _input.length; } + } + + /// Ditto +-RandomCover!(Range, Random) randomCover(Range, Random)(Range r, Random rnd) +- if(isRandomAccessRange!Range && isUniformRNG!Random) ++auto randomCover(Range, UniformRNG)(Range r, auto ref UniformRNG rng) ++ if (isRandomAccessRange!Range && isUniformRNG!UniformRNG) + { +- return typeof(return)(r, rnd); ++ return RandomCover!(Range, UniformRNG)(r, rng); ++} ++ ++/// Ditto ++auto randomCover(Range)(Range r) ++ if (isRandomAccessRange!Range) ++{ ++ return RandomCover!(Range, void)(r); + } + + unittest + { + int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; +- auto rnd = Random(unpredictableSeed); +- RandomCover!(int[], Random) rc = randomCover(a, rnd); +- static assert(isForwardRange!(typeof(rc))); +- +- int[] b = new int[9]; +- uint i; +- foreach (e; rc) ++ foreach (UniformRNG; TypeTuple!(void, PseudoRngTypes)) + { +- //writeln(e); +- b[i++] = e; ++ static if (is(UniformRNG == void)) ++ { ++ auto rc = randomCover(a); ++ static assert(isInputRange!(typeof(rc))); ++ static assert(!isForwardRange!(typeof(rc))); ++ } ++ else ++ { ++ auto rng = UniformRNG(unpredictableSeed); ++ auto rc = randomCover(a, rng); ++ static assert(isForwardRange!(typeof(rc))); ++ // check for constructor passed a value-type RNG ++ auto rc2 = RandomCover!(int[], UniformRNG)(a, UniformRNG(unpredictableSeed)); ++ static assert(isForwardRange!(typeof(rc2))); ++ } ++ ++ int[] b = new int[9]; ++ uint i; ++ foreach (e; rc) ++ { ++ //writeln(e); ++ b[i++] = e; ++ } ++ sort(b); ++ assert(a == b, text(b)); + } +- sort(b); +- assert(a == b, text(b)); + } + + // RandomSample +@@ -1551,10 +1768,22 @@ range. The total length of $(D r) must b + passed in, the total number of sample is considered to be $(D + total). Otherwise, $(D RandomSample) uses $(D r.length). + +-If the number of elements is not exactly $(D total), $(D +-RandomSample) throws an exception. This is because $(D total) is +-essential to computing the probability of selecting elements in the +-range. ++$(D RandomSample) implements Jeffrey Scott Vitter's Algorithm D ++(see Vitter $(WEB dx.doi.org/10.1145/358105.893, 1984), $(WEB ++dx.doi.org/10.1145/23002.23003, 1987)), which selects a sample ++of size $(D n) in O(n) steps and requiring O(n) random variates, ++regardless of the size of the data being sampled. The exception ++to this is if traversing k elements on the input range is itself ++an O(k) operation (e.g. when sampling lines from an input file), ++in which case the sampling calculation will inevitably be of ++O(total). ++ ++RandomSample will throw an exception if $(D total) is verifiably ++less than the total number of elements available in the input, ++or if $(D n > total). ++ ++If no random number generator is passed to $(D randomSample), the ++thread-global RNG rndGen will be used internally. + + Example: + ---- +@@ -1566,68 +1795,128 @@ foreach (e; randomSample(a, 5)) + } + ---- + +-$(D RandomSample) implements Jeffrey Scott Vitter's Algorithm D +-(see Vitter $(WEB dx.doi.org/10.1145/358105.893, 1984), $(WEB +-dx.doi.org/10.1145/23002.23003, 1987)), which selects a sample +-of size $(D n) in O(n) steps and requiring O(n) random variates, +-regardless of the size of the data being sampled. ++$(B WARNING:) If an alternative RNG is desired, it is essential for this ++to be a $(I new) RNG seeded in an unpredictable manner. Passing it a RNG ++used elsewhere in the program will result in unintended correlations, ++due to the current implementation of RNGs as value types. ++ ++Example: ++---- ++int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; ++foreach (e; randomSample(a, 5, Random(unpredictableSeed))) // correct! ++{ ++ writeln(e); ++} ++ ++foreach (e; randomSample(a, 5, rndGen)) // DANGEROUS!! rndGen gets ++{ // copied by value ++ writeln(e); ++} ++ ++foreach (e; randomSample(a, 5, rndGen)) // ... so this second random ++{ // sample will select the same ++ writeln(e); // values as the previous one. ++} ++---- ++ ++These issues will be resolved in a second-generation std.random that ++re-implements random number generators as reference types. + */ +-struct RandomSample(R, Random = void) +- if(isInputRange!R && (isUniformRNG!Random || is(Random == void))) ++struct RandomSample(Range, UniformRNG = void) ++ if (isInputRange!Range && (isUniformRNG!UniformRNG || is(UniformRNG == void))) + { + private size_t _available, _toSelect; +- private immutable ushort _alphaInverse = 13; // Vitter's recommended value. +- private bool _first, _algorithmA; ++ private enum ushort _alphaInverse = 13; // Vitter's recommended value. + private double _Vprime; +- private R _input; ++ private Range _input; + private size_t _index; ++ private enum Skip { None, A, D }; ++ private Skip _skip = Skip.None; + + // If we're using the default thread-local random number generator then +- // we shouldn't store a copy of it here. Random == void is a sentinel ++ // we shouldn't store a copy of it here. UniformRNG == void is a sentinel + // for this. If we're using a user-specified generator then we have no + // choice but to store a copy. +- static if(!is(Random == void)) ++ static if (is(UniformRNG == void)) + { +- Random _gen; +- +- static if (hasLength!R) ++ static if (hasLength!Range) + { +- this(R input, size_t howMany, Random gen) ++ this(Range input, size_t howMany) + { +- _gen = gen; +- initialize(input, howMany, input.length); ++ _input = input; ++ initialize(howMany, input.length); + } + } + +- this(R input, size_t howMany, size_t total, Random gen) ++ this(Range input, size_t howMany, size_t total) + { +- _gen = gen; +- initialize(input, howMany, total); ++ _input = input; ++ initialize(howMany, total); + } + } + else + { +- static if (hasLength!R) ++ UniformRNG _rng; ++ ++ static if (hasLength!Range) + { +- this(R input, size_t howMany) ++ this(Range input, size_t howMany, ref UniformRNG rng) + { +- initialize(input, howMany, input.length); ++ _rng = rng; ++ _input = input; ++ initialize(howMany, input.length); + } ++ ++ this(Range input, size_t howMany, UniformRNG rng) ++ { ++ this(input, howMany, rng); ++ } ++ } ++ ++ this(Range input, size_t howMany, size_t total, ref UniformRNG rng) ++ { ++ _rng = rng; ++ _input = input; ++ initialize(howMany, total); + } + +- this(R input, size_t howMany, size_t total) ++ this(Range input, size_t howMany, size_t total, UniformRNG rng) + { +- initialize(input, howMany, total); ++ this(input, howMany, total, rng); + } + } + +- private void initialize(R input, size_t howMany, size_t total) ++ private void initialize(size_t howMany, size_t total) + { +- _input = input; + _available = total; + _toSelect = howMany; +- enforce(_toSelect <= _available); +- _first = true; ++ enforce(_toSelect <= _available, ++ text("RandomSample: cannot sample ", _toSelect, ++ " items when only ", _available, " are available")); ++ static if (hasLength!Range) ++ { ++ enforce(_available <= _input.length, ++ text("RandomSample: specified ", _available, ++ " items as available when input contains only ", ++ _input.length)); ++ } ++ } ++ ++ private void initializeFront() ++ { ++ assert(_skip == Skip.None); ++ // We can save ourselves a random variate by checking right ++ // at the beginning if we should use Algorithm A. ++ if ((_alphaInverse * _toSelect) > _available) ++ { ++ _skip = Skip.A; ++ } ++ else ++ { ++ _skip = Skip.D; ++ _Vprime = newVprime(_toSelect); ++ } ++ prime(); + } + + /** +@@ -1645,21 +1934,9 @@ struct RandomSample(R, Random = void) + // having it always correspond to the first element of the + // input. The rest of the sample points are determined each + // time we call popFront(). +- if(_first) ++ if (_skip == Skip.None) + { +- // We can save ourselves a random variate by checking right +- // at the beginning if we should use Algorithm A. +- if((_alphaInverse * _toSelect) > _available) +- { +- _algorithmA = true; +- } +- else +- { +- _Vprime = newVprime(_toSelect); +- _algorithmA = false; +- } +- prime(); +- _first = false; ++ initializeFront(); + } + return _input.front; + } +@@ -1667,6 +1944,13 @@ struct RandomSample(R, Random = void) + /// Ditto + void popFront() + { ++ // First we need to check if the sample has ++ // been initialized in the first place. ++ if (_skip == Skip.None) ++ { ++ initializeFront(); ++ } ++ + _input.popFront(); + --_available; + --_toSelect; +@@ -1675,11 +1959,15 @@ struct RandomSample(R, Random = void) + } + + /// Ditto +- @property typeof(this) save() ++ static if (isForwardRange!Range && isForwardRange!UniformRNG) + { +- auto ret = this; +- ret._input = _input.save; +- return ret; ++ @property typeof(this) save() ++ { ++ auto ret = this; ++ ret._input = _input.save; ++ ret._rng = _rng.save; ++ return ret; ++ } + } + + /// Ditto +@@ -1691,11 +1979,42 @@ struct RandomSample(R, Random = void) + /** + Returns the index of the visited record. + */ +- size_t index() ++ @property size_t index() + { ++ if (_skip == Skip.None) ++ { ++ initializeFront(); ++ } + return _index; + } + ++ private size_t skip() ++ { ++ assert(_skip != Skip.None); ++ ++ // Step D1: if the number of points still to select is greater ++ // than a certain proportion of the remaining data points, i.e. ++ // if n >= alpha * N where alpha = 1/13, we carry out the ++ // sampling with Algorithm A. ++ if (_skip == Skip.A) ++ { ++ return skipA(); ++ } ++ else if ((_alphaInverse * _toSelect) > _available) ++ { ++ // We shouldn't get here unless the current selected ++ // algorithm is D. ++ assert(_skip == Skip.D); ++ _skip = Skip.A; ++ return skipA(); ++ } ++ else ++ { ++ assert(_skip == Skip.D); ++ return skipD(); ++ } ++ } ++ + /* + Vitter's Algorithm A, used when the ratio of needed sample values + to remaining data values is sufficiently large. +@@ -1705,15 +2024,15 @@ to remaining data values is sufficiently + size_t s; + double v, quot, top; + +- if(_toSelect==1) ++ if (_toSelect==1) + { +- static if(is(Random==void)) ++ static if (is(UniformRNG == void)) + { + s = uniform(0, _available); + } + else + { +- s = uniform(0, _available, _gen); ++ s = uniform(0, _available, _rng); + } + } + else +@@ -1722,13 +2041,13 @@ to remaining data values is sufficiently + top = _available - _toSelect; + quot = top / _available; + +- static if(is(Random==void)) ++ static if (is(UniformRNG == void)) + { + v = uniform!"()"(0.0, 1.0); + } + else + { +- v = uniform!"()"(0.0, 1.0, _gen); ++ v = uniform!"()"(0.0, 1.0, _rng); + } + + while (quot > v) +@@ -1746,13 +2065,13 @@ Randomly reset the value of _Vprime. + */ + private double newVprime(size_t remaining) + { +- static if(is(Random == void)) ++ static if (is(UniformRNG == void)) + { + double r = uniform!"()"(0.0, 1.0); + } + else + { +- double r = uniform!"()"(0.0, 1.0, _gen); ++ double r = uniform!"()"(0.0, 1.0, _rng); + } + + return r ^^ (1.0 / remaining); +@@ -1770,45 +2089,38 @@ and its rationale, see: + + Variable names are chosen to match those in Vitter's paper. + */ +- private size_t skip() ++ private size_t skipD() + { +- // Step D1: if the number of points still to select is greater +- // than a certain proportion of the remaining data points, i.e. +- // if n >= alpha * N where alpha = 1/13, we carry out the +- // sampling with Algorithm A. +- if(_algorithmA) +- { +- return skipA(); +- } +- else if((_alphaInverse * _toSelect) > _available) +- { +- _algorithmA = true; +- return skipA(); +- } +- // Otherwise, we use the standard Algorithm D mechanism. +- else if ( _toSelect > 1 ) ++ // Confirm that the check in Step D1 is valid and we ++ // haven't been sent here by mistake ++ assert((_alphaInverse * _toSelect) <= _available); ++ ++ // Now it's safe to use the standard Algorithm D mechanism. ++ if (_toSelect > 1) + { + size_t s; + size_t qu1 = 1 + _available - _toSelect; + double x, y1; + +- while(true) ++ assert(!_Vprime.isNaN); ++ ++ while (true) + { + // Step D2: set values of x and u. +- for(x = _available * (1-_Vprime), s = cast(size_t) trunc(x); +- s >= qu1; +- x = _available * (1-_Vprime), s = cast(size_t) trunc(x)) ++ for (x = _available * (1-_Vprime), s = cast(size_t) trunc(x); ++ s >= qu1; ++ x = _available * (1-_Vprime), s = cast(size_t) trunc(x)) + { + _Vprime = newVprime(_toSelect); + } + +- static if(is(Random == void)) ++ static if (is(UniformRNG == void)) + { + double u = uniform!"()"(0.0, 1.0); + } + else + { +- double u = uniform!"()"(0.0, 1.0, _gen); ++ double u = uniform!"()"(0.0, 1.0, _rng); + } + + y1 = (u * (cast(double) _available) / qu1) ^^ (1.0/(_toSelect - 1)); +@@ -1817,12 +2129,12 @@ Variable names are chosen to match those + + // Step D3: if _Vprime <= 1.0 our work is done and we return S. + // Otherwise ... +- if(_Vprime > 1.0) ++ if (_Vprime > 1.0) + { + size_t top = _available - 1, limit; + double y2 = 1.0, bottom; + +- if(_toSelect > (s+1) ) ++ if (_toSelect > (s+1)) + { + bottom = _available - _toSelect; + limit = _available - s; +@@ -1833,7 +2145,7 @@ Variable names are chosen to match those + limit = qu1; + } + +- foreach(size_t t; limit.._available) ++ foreach (size_t t; limit .. _available) + { + y2 *= top/bottom; + top--; +@@ -1841,10 +2153,10 @@ Variable names are chosen to match those + } + + // Step D4: decide whether or not to accept the current value of S. +- if( (_available/(_available-x)) < (y1 * (y2 ^^ (1.0/(_toSelect-1)))) ) ++ if (_available/(_available-x) < y1 * (y2 ^^ (1.0/(_toSelect-1)))) + { + // If it's not acceptable, we generate a new value of _Vprime +- // and go back to the start of the for(;;) loop. ++ // and go back to the start of the for (;;) loop. + _Vprime = newVprime(_toSelect); + } + else +@@ -1872,71 +2184,366 @@ Variable names are chosen to match those + + private void prime() + { +- if (empty) return; ++ if (empty) ++ { ++ return; ++ } + assert(_available && _available >= _toSelect); + immutable size_t s = skip(); +- _input.popFrontN(s); ++ assert(s + _toSelect <= _available); ++ static if (hasLength!Range) ++ { ++ assert(s + _toSelect <= _input.length); ++ } ++ assert(!_input.empty); ++ _input.popFrontExactly(s); + _index += s; + _available -= s; + assert(_available > 0); +- return; + } + } + + /// Ditto +-auto randomSample(R)(R r, size_t n, size_t total) +-if(isInputRange!R) ++auto randomSample(Range)(Range r, size_t n, size_t total) ++ if (isInputRange!Range) + { +- return RandomSample!(R, void)(r, n, total); ++ return RandomSample!(Range, void)(r, n, total); + } + + /// Ditto +-auto randomSample(R)(R r, size_t n) +- if(isInputRange!R && hasLength!R) ++auto randomSample(Range)(Range r, size_t n) ++ if (isInputRange!Range && hasLength!Range) + { +- return RandomSample!(R, void)(r, n, r.length); ++ return RandomSample!(Range, void)(r, n, r.length); + } + + /// Ditto +-auto randomSample(R, Random)(R r, size_t n, size_t total, Random gen) +-if(isInputRange!R && isUniformRNG!Random) ++auto randomSample(Range, UniformRNG)(Range r, size_t n, size_t total, auto ref UniformRNG rng) ++ if (isInputRange!Range && isUniformRNG!UniformRNG) + { +- return RandomSample!(R, Random)(r, n, total, gen); ++ return RandomSample!(Range, UniformRNG)(r, n, total, rng); + } + + /// Ditto +-auto randomSample(R, Random)(R r, size_t n, Random gen) +-if (isInputRange!R && hasLength!R && isUniformRNG!Random) ++auto randomSample(Range, UniformRNG)(Range r, size_t n, auto ref UniformRNG rng) ++ if (isInputRange!Range && hasLength!Range && isUniformRNG!UniformRNG) + { +- return RandomSample!(R, Random)(r, n, r.length, gen); ++ return RandomSample!(Range, UniformRNG)(r, n, r.length, rng); + } + + unittest + { +- Random gen; +- int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; +- static assert(isForwardRange!(typeof(randomSample(a, 5)))); +- static assert(isForwardRange!(typeof(randomSample(a, 5, gen)))); +- +- //int[] a = [ 0, 1, 2 ]; +- assert(randomSample(a, 5).length == 5); +- assert(randomSample(a, 5, 10).length == 5); +- assert(randomSample(a, 5, gen).length == 5); +- uint i; +- foreach (e; randomSample(randomCover(a, rndGen), 5)) ++ // For test purposes, an infinite input range ++ struct TestInputRange + { +- ++i; +- //writeln(e); ++ private auto r = recurrence!"a[n-1] + 1"(0); ++ bool empty() @property const pure nothrow { return r.empty; } ++ auto front() @property pure nothrow { return r.front; } ++ void popFront() pure nothrow { r.popFront(); } + } +- assert(i == 5); ++ static assert(isInputRange!TestInputRange); ++ static assert(!isForwardRange!TestInputRange); ++ ++ int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; + +- // Bugzilla 8314 ++ foreach (UniformRNG; PseudoRngTypes) + { +- auto sample(uint seed) { return randomSample(a, 1, Random(seed)).front; } ++ auto rng = UniformRNG(unpredictableSeed); ++ /* First test the most general case: randomSample of input range, with and ++ * without a specified random number generator. ++ */ ++ static assert(isInputRange!(typeof(randomSample(TestInputRange(), 5, 10)))); ++ static assert(isInputRange!(typeof(randomSample(TestInputRange(), 5, 10, rng)))); ++ static assert(!isForwardRange!(typeof(randomSample(TestInputRange(), 5, 10)))); ++ static assert(!isForwardRange!(typeof(randomSample(TestInputRange(), 5, 10, rng)))); ++ // test case with range initialized by direct call to struct ++ { ++ auto sample = ++ RandomSample!(TestInputRange, UniformRNG) ++ (TestInputRange(), 5, 10, UniformRNG(unpredictableSeed)); ++ static assert(isInputRange!(typeof(sample))); ++ static assert(!isForwardRange!(typeof(sample))); ++ } ++ ++ /* Now test the case of an input range with length. We ignore the cases ++ * already covered by the previous tests. ++ */ ++ static assert(isInputRange!(typeof(randomSample(TestInputRange().takeExactly(10), 5)))); ++ static assert(isInputRange!(typeof(randomSample(TestInputRange().takeExactly(10), 5, rng)))); ++ static assert(!isForwardRange!(typeof(randomSample(TestInputRange().takeExactly(10), 5)))); ++ static assert(!isForwardRange!(typeof(randomSample(TestInputRange().takeExactly(10), 5, rng)))); ++ // test case with range initialized by direct call to struct ++ { ++ auto sample = ++ RandomSample!(typeof(TestInputRange().takeExactly(10)), UniformRNG) ++ (TestInputRange().takeExactly(10), 5, 10, UniformRNG(unpredictableSeed)); ++ static assert(isInputRange!(typeof(sample))); ++ static assert(!isForwardRange!(typeof(sample))); ++ } ++ ++ // Now test the case of providing a forward range as input. ++ static assert(!isForwardRange!(typeof(randomSample(a, 5)))); ++ static if (isForwardRange!UniformRNG) ++ { ++ static assert(isForwardRange!(typeof(randomSample(a, 5, rng)))); ++ // ... and test with range initialized directly ++ { ++ auto sample = ++ RandomSample!(int[], UniformRNG) ++ (a, 5, UniformRNG(unpredictableSeed)); ++ static assert(isForwardRange!(typeof(sample))); ++ } ++ } ++ else ++ { ++ static assert(isInputRange!(typeof(randomSample(a, 5, rng)))); ++ static assert(!isForwardRange!(typeof(randomSample(a, 5, rng)))); ++ // ... and test with range initialized directly ++ { ++ auto sample = ++ RandomSample!(int[], UniformRNG) ++ (a, 5, UniformRNG(unpredictableSeed)); ++ static assert(isInputRange!(typeof(sample))); ++ static assert(!isForwardRange!(typeof(sample))); ++ } ++ } ++ ++ /* Check that randomSample will throw an error if we claim more ++ * items are available than there actually are, or if we try to ++ * sample more items than are available. */ ++ assert(collectExceptionMsg(randomSample(a, 5, 15)) == "RandomSample: specified 15 items as available when input contains only 10"); ++ assert(collectExceptionMsg(randomSample(a, 15)) == "RandomSample: cannot sample 15 items when only 10 are available"); ++ assert(collectExceptionMsg(randomSample(a, 9, 8)) == "RandomSample: cannot sample 9 items when only 8 are available"); ++ assert(collectExceptionMsg(randomSample(TestInputRange(), 12, 11)) == "RandomSample: cannot sample 12 items when only 11 are available"); ++ ++ /* Check that sampling algorithm never accidentally overruns the end of ++ * the input range. If input is an InputRange without .length, this ++ * relies on the user specifying the total number of available items ++ * correctly. ++ */ ++ { ++ uint i = 0; ++ foreach (e; randomSample(a, a.length)) ++ { ++ assert(e == i); ++ ++i; ++ } ++ assert(i == a.length); ++ ++ i = 0; ++ foreach (e; randomSample(TestInputRange(), 17, 17)) ++ { ++ assert(e == i); ++ ++i; ++ } ++ assert(i == 17); ++ } ++ ++ ++ // Check length properties of random samples. ++ assert(randomSample(a, 5).length == 5); ++ assert(randomSample(a, 5, 10).length == 5); ++ assert(randomSample(a, 5, rng).length == 5); ++ assert(randomSample(a, 5, 10, rng).length == 5); ++ assert(randomSample(TestInputRange(), 5, 10).length == 5); ++ assert(randomSample(TestInputRange(), 5, 10, rng).length == 5); ++ ++ // ... and emptiness! ++ assert(randomSample(a, 0).empty); ++ assert(randomSample(a, 0, 5).empty); ++ assert(randomSample(a, 0, rng).empty); ++ assert(randomSample(a, 0, 5, rng).empty); ++ assert(randomSample(TestInputRange(), 0, 10).empty); ++ assert(randomSample(TestInputRange(), 0, 10, rng).empty); ++ ++ /* Test that the (lazy) evaluation of random samples works correctly. ++ * ++ * We cover 2 different cases: a sample where the ratio of sample points ++ * to total points is greater than the threshold for using Algorithm, and ++ * one where the ratio is small enough (< 1/13) for Algorithm D to be used. ++ * ++ * For each, we also cover the case with and without a specified RNG. ++ */ ++ { ++ // Small sample/source ratio, no specified RNG. ++ uint i = 0; ++ foreach (e; randomSample(randomCover(a), 5)) ++ { ++ ++i; ++ } ++ assert(i == 5); + +- immutable fst = sample(0); +- uint n; +- while (sample(++n) == fst && n < n.max) {} +- assert(n < n.max); ++ // Small sample/source ratio, specified RNG. ++ i = 0; ++ foreach (e; randomSample(randomCover(a), 5, rng)) ++ { ++ ++i; ++ } ++ assert(i == 5); ++ ++ // Large sample/source ratio, no specified RNG. ++ i = 0; ++ foreach (e; randomSample(TestInputRange(), 123, 123_456)) ++ { ++ ++i; ++ } ++ assert(i == 123); ++ ++ // Large sample/source ratio, specified RNG. ++ i = 0; ++ foreach (e; randomSample(TestInputRange(), 123, 123_456, rng)) ++ { ++ ++i; ++ } ++ assert(i == 123); ++ ++ /* Sample/source ratio large enough to start with Algorithm D, ++ * small enough to switch to Algorithm A. ++ */ ++ i = 0; ++ foreach (e; randomSample(TestInputRange(), 10, 131)) ++ { ++ ++i; ++ } ++ assert(i == 10); ++ } ++ ++ // Test that the .index property works correctly ++ { ++ auto sample1 = randomSample(TestInputRange(), 654, 654_321); ++ for (; !sample1.empty; sample1.popFront()) ++ { ++ assert(sample1.front == sample1.index); ++ } ++ ++ auto sample2 = randomSample(TestInputRange(), 654, 654_321, rng); ++ for (; !sample2.empty; sample2.popFront()) ++ { ++ assert(sample2.front == sample2.index); ++ } ++ ++ /* Check that it also works if .index is called before .front. ++ * See: http://d.puremagic.com/issues/show_bug.cgi?id=10322 ++ */ ++ auto sample3 = randomSample(TestInputRange(), 654, 654_321); ++ for (; !sample3.empty; sample3.popFront()) ++ { ++ assert(sample3.index == sample3.front); ++ } ++ ++ auto sample4 = randomSample(TestInputRange(), 654, 654_321, rng); ++ for (; !sample4.empty; sample4.popFront()) ++ { ++ assert(sample4.index == sample4.front); ++ } ++ } ++ ++ /* Test behaviour if .popFront() is called before sample is read. ++ * This is a rough-and-ready check that the statistical properties ++ * are in the ballpark -- not a proper validation of statistical ++ * quality! This incidentally also checks for reference-type ++ * initialization bugs, as the foreach() loop will operate on a ++ * copy of the popFronted (and hence initialized) sample. ++ */ ++ { ++ size_t count0, count1, count99; ++ foreach(_; 0 .. 100_000) ++ { ++ auto sample = randomSample(iota(100), 5); ++ sample.popFront(); ++ foreach(s; sample) ++ { ++ if (s == 0) ++ { ++ ++count0; ++ } ++ else if (s == 1) ++ { ++ ++count1; ++ } ++ else if (s == 99) ++ { ++ ++count99; ++ } ++ } ++ } ++ /* Statistical assumptions here: this is a sequential sampling process ++ * so (i) 0 can only be the first sample point, so _can't_ be in the ++ * remainder of the sample after .popFront() is called. (ii) By similar ++ * token, 1 can only be in the remainder if it's the 2nd point of the ++ * whole sample, and hence if 0 was the first; probability of 0 being ++ * first and 1 second is 5/100 * 4/99 (thank you, Algorithm S:-) and ++ * so the mean count of 1 should be about 202. Finally, 99 can only ++ * be the _last_ sample point to be picked, so its probability of ++ * inclusion should be independent of the .popFront() and it should ++ * occur with frequency 5/100, hence its count should be about 5000. ++ * Unfortunately we have to set quite a high tolerance because with ++ * sample size small enough for unittests to run in reasonable time, ++ * the variance can be quite high. ++ */ ++ assert(count0 == 0); ++ assert(count1 < 300, text("1: ", count1, " > 300.")); ++ assert(4_700 < count99, text("99: ", count99, " < 4700.")); ++ assert(count99 < 5_300, text("99: ", count99, " > 5300.")); ++ } ++ ++ /* Odd corner-cases: RandomSample has 2 constructors that are not called ++ * by the randomSample() helper functions, but that can be used if the ++ * constructor is called directly. These cover the case of the user ++ * specifying input but not input length. ++ */ ++ { ++ auto input1 = TestInputRange().takeExactly(456_789); ++ static assert(hasLength!(typeof(input1))); ++ auto sample1 = RandomSample!(typeof(input1), void)(input1, 789); ++ static assert(isInputRange!(typeof(sample1))); ++ static assert(!isForwardRange!(typeof(sample1))); ++ assert(sample1.length == 789); ++ assert(sample1._available == 456_789); ++ uint i = 0; ++ for (; !sample1.empty; sample1.popFront()) ++ { ++ assert(sample1.front == sample1.index); ++ ++i; ++ } ++ assert(i == 789); ++ ++ auto input2 = TestInputRange().takeExactly(456_789); ++ static assert(hasLength!(typeof(input2))); ++ auto sample2 = RandomSample!(typeof(input2), typeof(rng))(input2, 789, rng); ++ static assert(isInputRange!(typeof(sample2))); ++ static assert(!isForwardRange!(typeof(sample2))); ++ assert(sample2.length == 789); ++ assert(sample2._available == 456_789); ++ i = 0; ++ for (; !sample2.empty; sample2.popFront()) ++ { ++ assert(sample2.front == sample2.index); ++ ++i; ++ } ++ assert(i == 789); ++ } ++ ++ /* Test that the save property works where input is a forward range, ++ * and RandomSample is using a (forward range) random number generator ++ * that is not rndGen. ++ */ ++ static if (isForwardRange!UniformRNG) ++ { ++ auto sample1 = randomSample(a, 5, rng); ++ auto sample2 = sample1.save; ++ assert(sample1.array() == sample2.array()); ++ } ++ ++ // Bugzilla 8314 ++ { ++ auto sample(RandomGen)(uint seed) { return randomSample(a, 1, RandomGen(seed)).front; } ++ ++ // Start from 1 because not all RNGs accept 0 as seed. ++ immutable fst = sample!UniformRNG(1); ++ uint n = 1; ++ while (sample!UniformRNG(++n) == fst && n < n.max) {} ++ assert(n < n.max); ++ } + } + } +--- a/src/libphobos/src/std/range.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/range.d 2014-04-01 16:32:51.000000000 +0100 +@@ -24,8 +24,8 @@ $(BOOKTABLE , + )) + $(TR $(TD $(D $(LREF isOutputRange))) + $(TD Tests if something is an $(I output _range), defined to be +- something to which one can sequentially write data using the $(D $(LREF +- put)) primitive. ++ something to which one can sequentially write data using the ++ $(D $(LREF put)) primitive. + )) + $(TR $(TD $(D $(LREF isForwardRange))) + $(TD Tests if something is a $(I forward _range), defined to be an +@@ -188,7 +188,7 @@ $(BOOKTABLE , + These _range-construction tools are implemented using templates; but sometimes + an object-based interface for ranges is needed. For this purpose, this module + provides a number of object and $(D interface) definitions that can be used to +-wrap around _range objects created by the above templates: ++wrap around _range objects created by the above templates. + + $(BOOKTABLE , + $(TR $(TD $(D $(LREF InputRange))) +@@ -229,12 +229,15 @@ $(BOOKTABLE , + $(TD Class that implements the $(D InputRange) interface and wraps the + input _range methods in virtual functions. + )) ++ $(TR $(TD $(D $(LREF RefRange))) ++ $(TD Wrapper around a forward _range that gives it reference semantics. ++ )) + ) + + Ranges whose elements are sorted afford better efficiency with certain + operations. For this, the $(D $(LREF assumeSorted)) function can be used to +-construct a $(D $(LREF SortedRange)) from a pre-sorted _range. The $(D $(LINK2 +-std_algorithm.html#sort, std.algorithm.sort)) function also conveniently ++construct a $(D $(LREF SortedRange)) from a pre-sorted _range. The $(LINK2 ++std_algorithm.html#sort, $(D std.algorithm.sort)) function also conveniently + returns a $(D SortedRange). $(D SortedRange) objects provide some additional + _range operations that take advantage of the fact that the _range is sorted. + +@@ -286,7 +289,7 @@ module std.range; + public import std.array; + import core.bitop, core.exception; + import std.algorithm, std.conv, std.exception, std.functional, +- std.traits, std.typecons, std.typetuple; ++ std.traits, std.typecons, std.typetuple, std.string; + + // For testing only. This code is included in a string literal to be included + // in whatever module it's needed in, so that each module that uses it can be +@@ -1459,7 +1462,7 @@ if (isBidirectionalRange!(Unqual!Range)) + } + else + { +- static struct Result ++ static struct Result() + { + private alias Unqual!Range R; + +@@ -1556,7 +1559,7 @@ if (isBidirectionalRange!(Unqual!Range)) + } + } + +- return Result(r); ++ return Result!()(r); + } + } + +@@ -1887,7 +1890,7 @@ unittest + assert(s1[0..0].empty); + assert(s1[3..3].empty); + // assert(s1[$ .. $].empty); +- assert(s1[s1.opDollar() .. s1.opDollar()].empty); ++ assert(s1[s1.opDollar .. s1.opDollar].empty); + + auto s2 = stride(arr, 2); + assert(equal(s2[0..2], [1,3])); +@@ -1897,7 +1900,7 @@ unittest + assert(s2[0..0].empty); + assert(s2[3..3].empty); + // assert(s2[$ .. $].empty); +- assert(s2[s2.opDollar() .. s2.opDollar()].empty); ++ assert(s2[s2.opDollar .. s2.opDollar].empty); + + // Test fix for Bug 5035 + auto m = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]; // 3 rows, 4 columns +@@ -2944,6 +2947,28 @@ if (isInputRange!R) + { + return Result(_input.save, _n); + } ++ ++ static if (hasMobileElements!R) ++ { ++ auto moveFront() ++ { ++ assert(!empty, ++ "Attempting to move the front of an empty " ++ ~ typeof(this).stringof); ++ return .moveFront(_input); ++ } ++ } ++ ++ static if (hasAssignableElements!R) ++ { ++ @property auto ref front(ElementType!R v) ++ { ++ assert(!empty, ++ "Attempting to assign to the front of an empty " ++ ~ typeof(this).stringof); ++ return _input.front = v; ++ } ++ } + } + + return Result(range, n); +@@ -3000,11 +3025,31 @@ unittest + + foreach(DummyType; AllDummyRanges) + { +- DummyType dummy; +- auto t = takeExactly(dummy, 5); ++ { ++ DummyType dummy; ++ auto t = takeExactly(dummy, 5); ++ ++ //Test that takeExactly doesn't wrap the result of takeExactly. ++ assert(takeExactly(t, 4) == takeExactly(dummy, 4)); ++ } ++ ++ static if(hasMobileElements!DummyType) ++ { ++ { ++ auto t = takeExactly(DummyType.init, 4); ++ assert(t.moveFront() == 1); ++ assert(equal(t, [1, 2, 3, 4])); ++ } ++ } + +- //Test that takeExactly doesn't wrap the result of takeExactly. +- assert(takeExactly(t, 4) == takeExactly(dummy, 4)); ++ static if(hasAssignableElements!DummyType) ++ { ++ { ++ auto t = takeExactly(DummyType.init, 4); ++ t.front = 9; ++ assert(equal(t, [9, 2, 3, 4])); ++ } ++ } + } + } + +@@ -3162,8 +3207,6 @@ unittest + + unittest + { +- import std.metastrings; +- + string genInput() + { + return "@property bool empty() { return _arr.empty; }" ~ +@@ -3241,21 +3284,21 @@ unittest + //`InitStruct([1, 2, 3])`, + `TakeNoneStruct([1, 2, 3])`)) + { +- mixin(Format!("enum a = takeNone(%s).empty;", range)); ++ mixin(format("enum a = takeNone(%s).empty;", range)); + assert(a, typeof(range).stringof); +- mixin(Format!("assert(takeNone(%s).empty);", range)); +- mixin(Format!("static assert(is(typeof(%s) == typeof(takeNone(%s))), typeof(%s).stringof);", +- range, range, range)); ++ mixin(format("assert(takeNone(%s).empty);", range)); ++ mixin(format("static assert(is(typeof(%s) == typeof(takeNone(%s))), typeof(%s).stringof);", ++ range, range, range)); + } + + foreach(range; TypeTuple!(`NormalStruct([1, 2, 3])`, + `InitStruct([1, 2, 3])`)) + { +- mixin(Format!("enum a = takeNone(%s).empty;", range)); ++ mixin(format("enum a = takeNone(%s).empty;", range)); + assert(a, typeof(range).stringof); +- mixin(Format!("assert(takeNone(%s).empty);", range)); +- mixin(Format!("static assert(is(typeof(takeExactly(%s, 0)) == typeof(takeNone(%s))), typeof(%s).stringof);", +- range, range, range)); ++ mixin(format("assert(takeNone(%s).empty);", range)); ++ mixin(format("static assert(is(typeof(takeExactly(%s, 0)) == typeof(takeNone(%s))), typeof(%s).stringof);", ++ range, range, range)); + } + + //Don't work in CTFE. +@@ -3730,10 +3773,7 @@ Take!(Repeat!T) repeat(T)(T value, size_ + return take(repeat(value), n); + } + +-/++ +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(LREF repeat) instead.) +- +/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.range.repeat instead.") Take!(Repeat!T) replicate(T)(T value, size_t n) + { + return repeat(value, n); +@@ -3826,14 +3866,11 @@ struct Cycle(Range) + } + + private static struct DollarToken {} +- +- DollarToken opDollar() +- { +- return DollarToken.init; +- } ++ enum opDollar = DollarToken.init; + + auto opSlice(size_t i, size_t j) + { ++ version (assert) if (i > j) throw new RangeError(); + auto retval = this.save; + retval._index += i; + return takeExactly(retval, j - i); +@@ -3934,6 +3971,7 @@ struct Cycle(R) + + auto opSlice(size_t i, size_t j) + { ++ version (assert) if (i > j) throw new RangeError(); + auto retval = this.save; + retval._index += i; + return takeExactly(retval, j - i); +@@ -4023,6 +4061,8 @@ unittest + } + + assert(cRange[10] == 1); ++ ++ assertThrown!RangeError(cy[2..1]); + } + } + +@@ -4161,6 +4201,14 @@ struct Zip(Ranges...) + return result; + } + ++ private void emplaceIfCan(T)(T* addr) ++ { ++ static if(__traits(compiles, emplace(addr))) ++ emplace(addr); ++ else ++ throw new Exception("Range with non-default constructable elements exhausted."); ++ } ++ + /** + Returns the current iterated element. + */ +@@ -4172,7 +4220,7 @@ struct Zip(Ranges...) + auto addr = cast(Unqual!(typeof(result[i]))*) &result[i]; + if (ranges[i].empty) + { +- emplace(addr); ++ emplaceIfCan(addr); + } + else + { +@@ -4216,7 +4264,7 @@ struct Zip(Ranges...) + } + else + { +- emplace(addr); ++ emplaceIfCan(addr); + } + } + return result; +@@ -4240,7 +4288,7 @@ struct Zip(Ranges...) + } + else + { +- emplace(addr); ++ emplaceIfCan(addr); + } + } + return result; +@@ -4263,7 +4311,7 @@ struct Zip(Ranges...) + } + else + { +- emplace(addr); ++ emplaceIfCan(addr); + } + } + return result; +@@ -4607,87 +4655,67 @@ unittest + assert(equal(z2, [tuple(7, 0L)])); + } + +-/* CTFE function to generate opApply loop for Lockstep.*/ +-private string lockstepApply(Ranges...)(bool withIndex) if (Ranges.length > 0) ++// Text for Issue 11196 ++unittest + { +- // Since there's basically no way to make this code readable as-is, I've +- // included formatting to make the generated code look "normal" when +- // printed out via pragma(msg). +- string ret = "int opApply(scope int delegate("; +- +- if (withIndex) +- { +- ret ~= "size_t, "; +- } +- +- foreach (ti, Type; Ranges) +- { +- static if(hasLvalueElements!Type) +- { +- ret ~= "ref "; +- } +- +- ret ~= "ElementType!(Ranges[" ~ to!string(ti) ~ "]), "; +- } +- +- // Remove trailing , +- ret = ret[0..$ - 2]; +- ret ~= ") dg) {\n"; +- +- // Shallow copy _ranges to be consistent w/ regular foreach. +- ret ~= "\tauto ranges = _ranges;\n"; +- ret ~= "\tint res;\n"; +- +- if (withIndex) +- { +- ret ~= "\tsize_t index = 0;\n"; +- } ++ static struct S { @disable this(); } ++ static assert(__traits(compiles, zip((S[5]).init[]))); ++ auto z = zip(StoppingPolicy.longest, cast(S[]) null, new int[1]); ++ assertThrown(zip(StoppingPolicy.longest, cast(S[]) null, new int[1]).front); ++} + +- // Check for emptiness. +- ret ~= "\twhile("; //someEmpty) {\n"; +- foreach(ti, Unused; Ranges) +- { +- ret ~= "!ranges[" ~ to!string(ti) ~ "].empty && "; +- } +- // Strip trailing && +- ret = ret[0..$ - 4]; +- ret ~= ") {\n"; ++/* ++ Generate lockstep's opApply function as a mixin string. ++ If withIndex is true prepend a size_t index to the delegate. ++*/ ++private string lockstepMixin(Ranges...)(bool withIndex) ++{ ++ string[] params; ++ string[] emptyChecks; ++ string[] dgArgs; ++ string[] popFronts; + +- // Create code to call the delegate. +- ret ~= "\t\tres = dg("; + if (withIndex) + { +- ret ~= "index, "; ++ params ~= "size_t"; ++ dgArgs ~= "index"; + } + +- +- foreach(ti, Range; Ranges) ++ foreach (idx, Range; Ranges) + { +- ret ~= "ranges[" ~ to!string(ti) ~ "].front, "; ++ params ~= format("%sElementType!(Ranges[%s])", hasLvalueElements!Range ? "ref " : "", idx); ++ emptyChecks ~= format("!ranges[%s].empty", idx); ++ dgArgs ~= format("ranges[%s].front", idx); ++ popFronts ~= format("ranges[%s].popFront();", idx); + } + +- // Remove trailing , +- ret = ret[0..$ - 2]; +- ret ~= ");\n"; +- ret ~= "\t\tif(res) break;\n"; +- foreach(ti, Range; Ranges) +- { +- ret ~= "\t\tranges[" ~ to!(string)(ti) ~ "].popFront();\n"; +- } +- +- if (withIndex) +- { +- ret ~= "\t\tindex++;\n"; +- } ++ return format( ++ q{ ++ int opApply(scope int delegate(%s) dg) ++ { ++ auto ranges = _ranges; ++ int res; ++ %s + +- ret ~= "\t}\n"; +- ret ~= "\tif(_s == StoppingPolicy.requireSameLength) {\n"; +- ret ~= "\t\tforeach(range; ranges)\n"; +- ret ~= "\t\t\tenforce(range.empty);\n"; +- ret ~= "\t}\n"; +- ret ~= "\treturn res;\n}"; ++ while (%s) ++ { ++ res = dg(%s); ++ if (res) break; ++ %s ++ %s ++ } + +- return ret; ++ if (_stoppingPolicy == StoppingPolicy.requireSameLength) ++ { ++ foreach(range; ranges) ++ enforce(range.empty); ++ } ++ return res; ++ } ++ }, params.join(", "), withIndex ? "size_t index = 0;" : "", ++ emptyChecks.join(" && "), dgArgs.join(", "), ++ popFronts.join("\n "), ++ withIndex ? "index++;" : "").outdent(); + } + + /** +@@ -4726,22 +4754,21 @@ private string lockstepApply(Ranges...)( + struct Lockstep(Ranges...) + if (Ranges.length > 1 && allSatisfy!(isInputRange, Ranges)) + { +-private: +- alias R = Ranges; +- R _ranges; +- StoppingPolicy _s; +- +-public: +- this(R ranges, StoppingPolicy s = StoppingPolicy.shortest) ++ this(R ranges, StoppingPolicy sp = StoppingPolicy.shortest) + { + _ranges = ranges; +- enforce(s != StoppingPolicy.longest, ++ enforce(sp != StoppingPolicy.longest, + "Can't use StoppingPolicy.Longest on Lockstep."); +- this._s = s; ++ _stoppingPolicy = sp; + } + +- mixin(lockstepApply!(Ranges)(false)); +- mixin(lockstepApply!(Ranges)(true)); ++ mixin(lockstepMixin!Ranges(false)); ++ mixin(lockstepMixin!Ranges(true)); ++ ++private: ++ alias R = Ranges; ++ R _ranges; ++ StoppingPolicy _stoppingPolicy; + } + + // For generic programming, make sure Lockstep!(Range) is well defined for a +@@ -4845,6 +4872,9 @@ unittest + auto c = chain(foo2, bar2); + + foreach(f, b; lockstep(c, c)) {} ++ ++ // Regression 10468 ++ foreach (x, y; lockstep(iota(0, 10), iota(0, 10))) { } + } + + /** +@@ -5109,14 +5139,15 @@ if ((isIntegral!(CommonType!(B, E)) || i + && isIntegral!S) + { + alias CommonType!(Unqual!B, Unqual!E) Value; ++ alias Unqual!S StepType; + alias typeof(unsigned((end - begin) / step)) IndexType; + + static struct Result + { + private Value current, pastLast; +- private S step; ++ private StepType step; + +- this(Value current, Value pastLast, S step) ++ this(Value current, Value pastLast, StepType step) + { + if ((current < pastLast && step >= 0) || + (current > pastLast && step <= 0)) +@@ -5267,7 +5298,7 @@ auto iota(E)(E end) + auto iota(B, E, S)(B begin, E end, S step) + if (isFloatingPoint!(CommonType!(B, E, S))) + { +- alias CommonType!(B, E, S) Value; ++ alias Unqual!(CommonType!(B, E, S)) Value; + static struct Result + { + private Value start, step; +@@ -6424,9 +6455,11 @@ unittest + + /** + This range iterates over fixed-sized chunks of size $(D chunkSize) of a +-$(D source) range. $(D Source) must be an input range with slicing and length. +-If $(D source.length) is not evenly divisible by $(D chunkSize), the back +-element of this range will contain fewer than $(D chunkSize) elements. ++$(D source) range. $(D Source) must be a forward range. ++ ++If $(D !isInfinitite!Source) and $(D source.walkLength) is not evenly ++divisible by $(D chunkSize), the back element of this range will contain ++fewer than $(D chunkSize) elements. + + Examples: + --- +@@ -6440,102 +6473,193 @@ assert(chunks.front == chunks[0]); + assert(chunks.length == 3); + --- + */ +-struct Chunks(Source) if(isInputRange!Source && hasSlicing!Source && hasLength!Source) ++struct Chunks(Source) ++ if (isForwardRange!Source) + { +- /// ++ /// Standard constructor + this(Source source, size_t chunkSize) + { +- this._source = source; +- this._chunkSize = chunkSize; ++ assert(chunkSize != 0, "Cannot create a Chunk with an empty chunkSize"); ++ _source = source; ++ _chunkSize = chunkSize; + } + +- /// Range primitives. ++ /// Forward range primitives. Always present. + @property auto front() + { + assert(!empty); +- return _source[0..min(_chunkSize, _source.length)]; ++ return _source.save.take(_chunkSize); + } + + /// Ditto + void popFront() + { + assert(!empty); +- popFrontN(_source, _chunkSize); ++ _source.popFrontN(_chunkSize); + } + +- /// Ditto +- @property bool empty() +- { +- return _source.empty; +- } +- +- static if(isForwardRange!Source) +- { ++ static if (!isInfinite!Source) + /// Ditto +- @property typeof(this) save() ++ @property bool empty() + { +- return typeof(this)(_source.save, _chunkSize); ++ return _source.empty; + } +- } ++ else ++ // undocumented ++ enum empty = false; + + /// Ditto +- auto opIndex(size_t index) ++ @property typeof(this) save() + { +- immutable end = min(_source.length, (index + 1) * _chunkSize); +- return _source[index * _chunkSize..end]; ++ return typeof(this)(_source.save, _chunkSize); + } + +- /// Ditto +- typeof(this) opSlice(size_t lower, size_t upper) ++ static if (hasLength!Source) + { +- immutable start = lower * _chunkSize; +- immutable end = min(_source.length, upper * _chunkSize); +- return typeof(this)(_source[start..end], _chunkSize); ++ /// Length. Only if $(D hasLength!Source) is $(D true) ++ @property size_t length() ++ { ++ // Note: _source.length + _chunkSize may actually overflow. ++ // We cast to ulong to mitigate the problem on x86 machines. ++ // For x64 machines, we just suppose we'll never overflow. ++ // The "safe" code would require either an extra branch, or a ++ // modulo operation, which is too expensive for such a rare case ++ return cast(size_t)((cast(ulong)(_source.length) + _chunkSize - 1) / _chunkSize); ++ } ++ //Note: No point in defining opDollar here without slicing. ++ //opDollar is defined below in the hasSlicing!Source section + } + +- /// Ditto +- @property size_t length() ++ static if (hasSlicing!Source) + { +- return (_source.length / _chunkSize) + +- (_source.length % _chunkSize > 0); +- } ++ //Used for various purposes ++ private enum hasSliceToEnd = is(typeof(Source.init[_chunkSize .. $]) == Source); + +- alias length opDollar; ++ /** ++ Indexing and slicing operations. Provided only if ++ $(D hasSlicing!Source) is $(D true). ++ */ ++ auto opIndex(size_t index) ++ { ++ immutable start = index * _chunkSize; ++ immutable end = start + _chunkSize; + +- /// Ditto +- @property auto back() +- { +- assert(!empty); ++ static if (isInfinite!Source) ++ return _source[start .. end]; ++ else ++ { ++ immutable len = _source.length; ++ assert(start < len, "chunks index out of bounds"); ++ return _source[start .. min(end, len)]; ++ } ++ } + +- immutable remainder = _source.length % _chunkSize; +- immutable len = _source.length; ++ /// Ditto ++ static if (hasLength!Source) ++ typeof(this) opSlice(size_t lower, size_t upper) ++ { ++ assert(lower <= upper && upper <= length, "chunks slicing index out of bounds"); ++ immutable len = _source.length; ++ return chunks(_source[min(lower * _chunkSize, len) .. min(upper * _chunkSize, len)], _chunkSize); ++ } ++ else static if (hasSliceToEnd) ++ //For slicing an infinite chunk, we need to slice the source to the end. ++ typeof(takeExactly(this, 0)) opSlice(size_t lower, size_t upper) ++ { ++ assert(lower <= upper, "chunks slicing index out of bounds"); ++ return chunks(_source[lower * _chunkSize .. $], _chunkSize).takeExactly(upper - lower); ++ } + +- if(remainder == 0) ++ static if (isInfinite!Source) + { +- // Return a full chunk. +- return _source[len - _chunkSize..len]; ++ static if (hasSliceToEnd) ++ { ++ private static struct DollarToken{} ++ DollarToken opDollar() ++ { ++ return DollarToken(); ++ } ++ //Slice to dollar ++ typeof(this) opSlice(size_t lower, DollarToken) ++ { ++ return typeof(this)(_source[lower * _chunkSize .. $], _chunkSize); ++ } ++ } + } + else + { +- return _source[len - remainder..len]; ++ //Dollar token carries a static type, with no extra information. ++ //It can lazily transform into _source.length on algorithmic ++ //operations such as : chunks[$/2, $-1]; ++ private static struct DollarToken ++ { ++ Chunks!Source* mom; ++ @property size_t momLength() ++ { ++ return mom.length; ++ } ++ alias momLength this; ++ } ++ DollarToken opDollar() ++ { ++ return DollarToken(&this); ++ } ++ ++ //Slice overloads optimized for using dollar. Without this, to slice to end, we would... ++ //1. Evaluate chunks.length ++ //2. Multiply by _chunksSize ++ //3. To finally just compare it (with min) to the original length of source (!) ++ //These overloads avoid that. ++ typeof(this) opSlice(DollarToken, DollarToken) ++ { ++ static if (hasSliceToEnd) ++ return chunks(_source[$ .. $], _chunkSize); ++ else ++ { ++ immutable len = _source.length; ++ return chunks(_source[len .. len], _chunkSize); ++ } ++ } ++ typeof(this) opSlice(size_t lower, DollarToken) ++ { ++ assert(lower <= length, "chunks slicing index out of bounds"); ++ static if (hasSliceToEnd) ++ return chunks(_source[min(lower * _chunkSize, _source.length) .. $], _chunkSize); ++ else ++ { ++ immutable len = _source.length; ++ return chunks(_source[min(lower * _chunkSize, len) .. len], _chunkSize); ++ } ++ } ++ typeof(this) opSlice(DollarToken, size_t upper) ++ { ++ assert(upper == length, "chunks slicing index out of bounds"); ++ return this[$ .. $]; ++ } + } + } + +- /// Ditto +- void popBack() ++ //Bidirectional range primitives ++ static if (hasSlicing!Source && hasLength!Source) + { +- assert(!empty); +- +- immutable remainder = _source.length % _chunkSize; +- immutable len = _source.length; +- +- if(remainder == 0) +- { +- _source = _source[0..len - _chunkSize]; ++ /** ++ Bidirectional range primitives. Provided only if both ++ $(D hasSlicing!Source) and $(D hasLength!Source) are $(D true). ++ */ ++ @property auto back() ++ { ++ assert(!empty, "back called on empty chunks"); ++ immutable len = _source.length; ++ immutable start = (len - 1) / _chunkSize * _chunkSize; ++ return _source[start .. len]; + } +- else ++ ++ /// Ditto ++ void popBack() + { +- _source = _source[0..len - remainder]; ++ assert(!empty, "popBack() called on empty chunks"); ++ immutable end = (_source.length - 1) / _chunkSize * _chunkSize; ++ _source = _source[0 .. end]; + } + } + +@@ -6545,7 +6669,8 @@ private: + } + + /// Ditto +-Chunks!(Source) chunks(Source)(Source source, size_t chunkSize) ++Chunks!Source chunks(Source)(Source source, size_t chunkSize) ++if (isForwardRange!Source) + { + return typeof(return)(source, chunkSize); + } +@@ -6573,6 +6698,60 @@ unittest + static assert(isRandomAccessRange!(typeof(chunks))); + } + ++unittest ++{ ++ //Extra toying with slicing and indexing. ++ auto chunks1 = [0, 0, 1, 1, 2, 2, 3, 3, 4].chunks(2); ++ auto chunks2 = [0, 0, 1, 1, 2, 2, 3, 3, 4, 4].chunks(2); ++ ++ assert (chunks1.length == 5); ++ assert (chunks2.length == 5); ++ assert (chunks1[4] == [4]); ++ assert (chunks2[4] == [4, 4]); ++ assert (chunks1.back == [4]); ++ assert (chunks2.back == [4, 4]); ++ ++ assert (chunks1[0 .. 1].equal([[0, 0]])); ++ assert (chunks1[0 .. 2].equal([[0, 0], [1, 1]])); ++ assert (chunks1[4 .. 5].equal([[4]])); ++ assert (chunks2[4 .. 5].equal([[4, 4]])); ++ ++ assert (chunks1[0 .. 0].equal((int[][]).init)); ++ assert (chunks1[5 .. 5].equal((int[][]).init)); ++ assert (chunks2[5 .. 5].equal((int[][]).init)); ++ ++ //Fun with opDollar ++ assert (chunks1[$ .. $].equal((int[][]).init)); //Quick ++ assert (chunks2[$ .. $].equal((int[][]).init)); //Quick ++ assert (chunks1[$ - 1 .. $].equal([[4]])); //Semiquick ++ assert (chunks2[$ - 1 .. $].equal([[4, 4]])); //Semiquick ++ assert (chunks1[$ .. 5].equal((int[][]).init)); //Semiquick ++ assert (chunks2[$ .. 5].equal((int[][]).init)); //Semiquick ++ ++ assert (chunks1[$ / 2 .. $ - 1].equal([[2, 2], [3, 3]])); //Slow ++} ++ ++unittest ++{ ++ //ForwardRange ++ auto r = filter!"true"([1, 2, 3, 4, 5]).chunks(2); ++ assert(equal!"equal(a, b)"(r, [[1, 2], [3, 4], [5]])); ++ ++ //InfiniteRange w/o RA ++ auto fibsByPairs = recurrence!"a[n-1] + a[n-2]"(1, 1).chunks(2); ++ assert(equal!`equal(a, b)`(fibsByPairs.take(2), [[ 1, 1], [ 2, 3]])); ++ ++ //InfiniteRange w/ RA and slicing ++ auto odds = sequence!("a[0] + n * a[1]")(1, 2); ++ auto oddsByPairs = odds.chunks(2); ++ assert(equal!`equal(a, b)`(oddsByPairs.take(2), [[ 1, 3], [ 5, 7]])); ++ ++ //Requires phobos#991 for Sequence to have slice to end ++ static assert(hasSlicing!(typeof(odds))); ++ assert(equal!`equal(a, b)`(oddsByPairs[3 .. 5], [[13, 15], [17, 19]])); ++ assert(equal!`equal(a, b)`(oddsByPairs[3 .. $].take(2), [[13, 15], [17, 19]])); ++} ++ + /** + This range iterates a single element. This is useful when a sole value + must be passed to an algorithm expecting a range. +@@ -7712,10 +7891,7 @@ sgi.com/tech/stl/binary_search.html, bin + return false; + } + +-/++ +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(LREF contains) instead.) +- +/ ++ // Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use contains instead.") alias contains canFind; + } + +--- a/src/libphobos/src/std/regex.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/regex.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,12 +1,13 @@ + //Written in the D programming language + /++ ++ $(SECTION Intro) + $(LUCKY Regular expressions) are a commonly used method of pattern matching + on strings, with $(I regex) being a catchy word for a pattern in this domain + specific language. Typical problems usually solved by regular expressions + include validation of user input and the ubiquitous find & replace + in text processing utilities. + +- Synposis: ++ $(SECTION Synopsis) + --- + import std.regex; + import std.stdio; +@@ -41,19 +42,24 @@ + + + --- +- ++ $(SECTION Syntax and general information) + The general usage guideline is to keep regex complexity on the side of simplicity, +- as its capabilities reside in purely character-level manipulation, +- and as such are ill-suited for tasks involving higher level invariants ++ as its capabilities reside in purely character-level manipulation. ++ As such it's ill-suited for tasks involving higher level invariants + like matching an integer number $(U bounded) in an [a,b] interval. + Checks of this sort of are better addressed by additional post-processing. + + The basic syntax shouldn't surprise experienced users of regular expressions. +- Thankfully, nowadays the web is bustling with resources to help newcomers, and a good +- $(WEB www.regular-expressions.info, reference with tutorial) on regular expressions +- can be found. ++ For an introduction to $(D std.regex) see a ++ $(WEB dlang.org/regular-expression.html, short tour) of the module API ++ and its abilities. ++ ++ There are other web resources on regular expressions to help newcomers, ++ and a good $(WEB www.regular-expressions.info, reference with tutorial) ++ can easily be found. + +- This library uses an ECMAScript syntax flavor with the following extensions: ++ This library uses a remarkably common ECMAScript syntax flavor ++ with the following extensions: + $(UL + $(LI Named subexpressions, with Python syntax. ) + $(LI Unicode properties such as Scripts, Blocks and common binary properties e.g Alphabetic, White_Space, Hex_Digit etc.) +@@ -62,12 +68,12 @@ + + $(REG_START Pattern syntax ) + $(I std.regex operates on codepoint level, +- 'character' in this table denotes a single unicode codepoint.) ++ 'character' in this table denotes a single Unicode codepoint.) + $(REG_TABLE + $(REG_TITLE Pattern element, Semantics ) + $(REG_TITLE Atoms, Match single characters ) + $(REG_ROW any character except [{|*+?()^$, Matches the character itself. ) +- $(REG_ROW ., In single line mode matches any charcter. ++ $(REG_ROW ., In single line mode matches any character. + Otherwise it matches any character except '\n' and '\r'. ) + $(REG_ROW [class], Matches a single character + that belongs to this character class. ) +@@ -82,8 +88,8 @@ + $(REG_ROW \r, Matches a carriage return character. ) + $(REG_ROW \t, Matches a tab character. ) + $(REG_ROW \v, Matches a vertical tab character. ) +- $(REG_ROW \d, Matches any unicode digit. ) +- $(REG_ROW \D, Matches any character except unicode digits. ) ++ $(REG_ROW \d, Matches any Unicode digit. ) ++ $(REG_ROW \D, Matches any character except Unicode digits. ) + $(REG_ROW \w, Matches any word character (note: this includes numbers).) + $(REG_ROW \W, Matches any non-word character.) + $(REG_ROW \s, Matches whitespace, same as \p{White_Space}.) +@@ -91,15 +97,15 @@ + $(REG_ROW \\, Matches \ character. ) + $(REG_ROW \c where c is one of [|*+?(), Matches the character c itself. ) + $(REG_ROW \p{PropertyName}, Matches a character that belongs +- to the unicode PropertyName set. ++ to the Unicode PropertyName set. + Single letter abbreviations can be used without surrounding {,}. ) + $(REG_ROW \P{PropertyName}, Matches a character that does not belong +- to the unicode PropertyName set. ++ to the Unicode PropertyName set. + Single letter abbreviations can be used without surrounding {,}. ) + $(REG_ROW \p{InBasicLatin}, Matches any character that is part of +- the BasicLatin unicode $(U block).) ++ the BasicLatin Unicode $(U block).) + $(REG_ROW \P{InBasicLatin}, Matches any character except ones in +- the BasicLatin unicode $(U block).) ++ the BasicLatin Unicode $(U block).) + $(REG_ROW \p{Cyrilic}, Matches any character that is part of + Cyrilic $(U script).) + $(REG_ROW \P{Cyrilic}, Matches any character except ones in +@@ -178,7 +184,7 @@ + useful for formatting complex regular expressions. ) + ) + +- $(B Unicode support) ++ $(SECTION Unicode support) + + This library provides full Level 1 support* according to + $(WEB unicode.org/reports/tr18/, UTS 18). Specifically: +@@ -196,19 +202,42 @@ + *With exception of point 1.1.1, as of yet, normalization of input + is expected to be enforced by user. + +- $(B Slicing) ++ $(SECTION Replace format string) ++ ++ A set of functions in this module that do the substitution rely ++ on a simple format to guide the process. In particular the table below ++ applies to the $(D format) argument of ++ $(LREF replaceFirst) and $(LREF replaceAll). ++ ++ The format string can reference parts of match using the following notation. ++ $(REG_TABLE ++ $(REG_TITLE Format specifier, Replaced by ) ++ $(REG_ROW $&, the whole match. ) ++ $(REG_ROW $`, part of input $(I preceding) the match. ) ++ $(REG_ROW $', part of input $(I following) the match. ) ++ $(REG_ROW $$, '$' character. ) ++ $(REG_ROW \c , where c is any character, the character c itself. ) ++ $(REG_ROW \\, '\' character. ) ++ $(REG_ROW $1 .. $99, submatch number 1 to 99 respectively. ) ++ ) ++ ++ $(SECTION Slicing and zero memory allocations orientation) + + All matches returned by pattern matching functionality in this library +- are slices of the original input, with the notable exception of the $(D replace) +- family of functions which generate a new string from the input. ++ are slices of the original input. The notable exception is the $(D replace) ++ family of functions that generate a new string from the input. + +- Copyright: Copyright Dmitry Olshansky, 2011 ++ In cases where producing the replacement is the ultimate goal ++ $(LREF replaceFirstInto) and $(LREF replaceAllInto) could come in handy ++ as functions that avoid allocations even for replacement. ++ ++ Copyright: Copyright Dmitry Olshansky, 2011- + + License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). + + Authors: Dmitry Olshansky, + +- API and utility constructs are based on original $(D std.regex) ++ API and utility constructs are modeled after the original $(D std.regex) + by Walter Bright and Andrei Alexandrescu. + + Source: $(PHOBOSSRC std/_regex.d) +@@ -218,28 +247,33 @@ Macros: + REG_TITLE = $(TR $(TD $(B $1)) $(TD $(B $2)) ) + REG_TABLE = $0
+ REG_START =

$0

++ SECTION =

$0

++ S_LINK = $+ + +/ + + module std.regex; + +-import std.internal.uni, std.internal.uni_tab;//unicode property tables ++import std.internal.uni, std.internal.uni_tab;//Unicode property tables + import std.array, std.algorithm, std.range, + std.conv, std.exception, std.traits, std.typetuple, +- std.uni, std.utf, std.format, std.typecons, std.bitmanip, ++ std.utf, std.format, std.typecons, std.bitmanip, + std.functional, std.exception; ++ + import core.bitop, core.stdc.string, core.stdc.stdlib; +-import ascii = std.ascii; ++static import ascii = std.ascii; + import std.string : representation; + +-debug import std.stdio; ++debug(std_regex_parser) import std.stdio; //trace parser progress ++debug(std_regex_search) import std.stdio; //trace prefix search engine ++debug(std_regex_matcher) import std.stdio; //trace matcher engine ++debug(std_regex_allocation) import std.stdio; //track object life cycle ++debug(std_regex_ctr) import std.stdio; //dump ctRegex generated sources ++debug(std_regex_test) import std.stdio; //trace test suite progress + + private: +-@safe: + +-//uncomment to get a barrage of debug info +-//debug = fred_parser; +-//debug = fred_matching; +-//debug = fred_charset; ++import std.uni : isAlpha, isWhite; ++ + + // IR bit pattern: 0b1_xxxxx_yy + // where yy indicates class of instruction, xxxxx for actual operation code +@@ -338,7 +372,7 @@ int lengthOfPairedIR(IR i) + //if the operation has a merge point (this relies on the order of the ops) + bool hasMerge(IR i) + { +- return (i&0b11)==0b10 && i<=IR.RepeatQEnd; ++ return (i&0b11)==0b10 && i <= IR.RepeatQEnd; + } + + //is an IR that opens a "group" +@@ -385,7 +419,7 @@ struct Bytecode + { + assert(data < (1<<22) && code < 256 ); + assert(seq >= 2 && seq < maxSequence); +- raw = code<<24 | ((seq-2)<<22) | data; ++ raw = code << 24 | (seq - 2)<<22 | data; + } + + //store raw data +@@ -400,7 +434,7 @@ struct Bytecode + @property uint data() const { return raw & 0x003f_ffff; } + + //ditto +- @property uint sequence() const { return 2+((raw >>22) & 0x3); } ++ @property uint sequence() const { return 2 + (raw >> 22 & 0x3); } + + //ditto + @property IR code() const { return cast(IR)(raw>>24); } +@@ -424,28 +458,28 @@ struct Bytecode + void setBackrefence() + { + assert(code == IR.GroupStart || code == IR.GroupEnd); +- raw = raw | (1<<23); ++ raw = raw | 1 << 23; + } + + //is referenced + @property bool backreference() const + { + assert(code == IR.GroupStart || code == IR.GroupEnd); +- return cast(bool)(raw & (1<<23)); ++ return cast(bool)(raw & 1 << 23); + } + + //mark as local reference (for backrefs in lookarounds) + void setLocalRef() + { + assert(code == IR.Backref); +- raw = raw | (1<<23); ++ raw = raw | 1 << 23; + } + + //is a local ref + @property bool localRef() const + { + assert(code == IR.Backref); +- return cast(bool)(raw & (1<<23)); ++ return cast(bool)(raw & 1 << 23); + } + + //human readable name of instruction +@@ -470,7 +504,7 @@ struct Bytecode + @property Bytecode paired() const + {//depends on bit and struct layout order + assert(isStart || isEnd); +- return Bytecode.fromRaw(raw ^ (0b11<<24)); ++ return Bytecode.fromRaw(raw ^ 0b11 << 24); + } + + //gets an index into IR block of the respective pair +@@ -503,8 +537,8 @@ static assert(Bytecode.sizeof == 4); + break; + case IR.RepeatEnd, IR.RepeatQEnd: //backward-jump instructions + uint len = irb[pc].data; +- formattedWrite(output, " pc=>%u min=%u max=%u step=%u" +- , pc-len, irb[pc+3].raw, irb[pc+4].raw, irb[pc+2].raw); ++ formattedWrite(output, " pc=>%u min=%u max=%u step=%u", ++ pc - len, irb[pc + 3].raw, irb[pc + 4].raw, irb[pc + 2].raw); + break; + case IR.InfiniteEnd, IR.InfiniteQEnd, IR.OrEnd: //ditto + uint len = irb[pc].data; +@@ -544,77 +578,12 @@ static assert(Bytecode.sizeof == 4); + return output.data; + } + +-//another pretty printer, writes out the bytecode of a regex and where the pc is +-@trusted void prettyPrint(Sink,Char=const(char)) +- (Sink sink, const(Bytecode)[] irb, uint pc=uint.max, int indent=3, size_t index=0) +- if (isOutputRange!(Sink,Char)) +-{//formattedWrite is @system +- while(irb.length>0) +- { +- formattedWrite(sink,"%3d",index); +- if(pc==0 && irb[0].code!=IR.Char) +- { +- for (int i=0;i "); +- } +- else +- { +- if(isEndIR(irb[0].code)) +- { +- indent-=2; +- } +- if(indent>0) +- { +- string spaces=" "; +- put(sink,spaces[0..(indent%spaces.length)]); +- for (size_t i=indent/spaces.length;i>0;--i) +- put(sink,spaces); +- } +- } +- if(irb[0].code==IR.Char) +- { +- put(sink,`"`); +- int i=0; +- do +- { +- put(sink,cast(char[])([cast(dchar)irb[i].data])); +- ++i; +- } while(i0;++ii) +- put(sink,"="); +- put(sink,"^"); +- } +- index+=i; +- irb=irb[i..$]; +- } +- else +- { +- put(sink,irb[0].mnemonic); +- put(sink,"("); +- formattedWrite(sink,"%d",irb[0].data); +- int nArgs= irb[0].args; +- for(int iarg=0;iarg number of submatch +@@ -636,6 +605,87 @@ struct Group(DataIndex) + } + } + ++@trusted void reverseBytecode()(Bytecode[] code) ++{ ++ Bytecode[] rev = new Bytecode[code.length]; ++ uint revPc = cast(uint)rev.length; ++ Stack!(Tuple!(uint, uint, uint)) stack; ++ uint start = 0; ++ uint end = cast(uint)code.length; ++ for(;;) ++ { ++ for(uint pc = start; pc < end; ) ++ { ++ uint len = code[pc].length; ++ if(code[pc].code == IR.GotoEndOr) ++ break; //pick next alternation branch ++ if(code[pc].isAtom) ++ { ++ rev[revPc - len .. revPc] = code[pc .. pc + len]; ++ revPc -= len; ++ pc += len; ++ } ++ else if(code[pc].isStart || code[pc].isEnd) ++ { ++ //skip over other embedded lookbehinds they are reversed ++ if(code[pc].code == IR.LookbehindStart ++ || code[pc].code == IR.NeglookbehindStart) ++ { ++ uint blockLen = len + code[pc].data ++ + code[pc].pairedLength; ++ rev[revPc - blockLen .. revPc] = code[pc .. pc + blockLen]; ++ pc += blockLen; ++ revPc -= blockLen; ++ continue; ++ } ++ uint second = code[pc].indexOfPair(pc); ++ uint secLen = code[second].length; ++ rev[revPc - secLen .. revPc] = code[second .. second + secLen]; ++ revPc -= secLen; ++ if(code[pc].code == IR.OrStart) ++ { ++ //we pass len bytes forward, but secLen in reverse ++ uint revStart = revPc - (second + len - secLen - pc); ++ uint r = revStart; ++ uint i = pc + IRL!(IR.OrStart); ++ while(code[i].code == IR.Option) ++ { ++ if(code[i - 1].code != IR.OrStart) ++ { ++ assert(code[i - 1].code == IR.GotoEndOr); ++ rev[r - 1] = code[i - 1]; ++ } ++ rev[r] = code[i]; ++ auto newStart = i + IRL!(IR.Option); ++ auto newEnd = newStart + code[i].data; ++ auto newRpc = r + code[i].data + IRL!(IR.Option); ++ if(code[newEnd].code != IR.OrEnd) ++ { ++ newRpc--; ++ } ++ stack.push(tuple(newStart, newEnd, newRpc)); ++ r += code[i].data + IRL!(IR.Option); ++ i += code[i].data + IRL!(IR.Option); ++ } ++ pc = i; ++ revPc = revStart; ++ assert(code[pc].code == IR.OrEnd); ++ } ++ else ++ pc += len; ++ } ++ } ++ if(stack.empty) ++ break; ++ start = stack.top[0]; ++ end = stack.top[1]; ++ revPc = stack.top[2]; ++ stack.pop(); ++ } ++ code[] = rev[]; ++} ++ ++ + //Regular expression engine/parser options: + // global - search all nonoverlapping matches in input + // casefold - case insensitive matching, do casefolding on match in unicode mode +@@ -648,27 +698,30 @@ enum RegexOption: uint { + nonunicode = 0x8, + multiline = 0x10, + singleline = 0x20 +-}; ++} + alias TypeTuple!('g', 'i', 'x', 'U', 'm', 's') RegexOptionNames;//do not reorder this list + static assert( RegexOption.max < 0x80); +-enum RegexInfo : uint { oneShot = 0x80 }; ++enum RegexInfo : uint { oneShot = 0x80 } ++alias Escapables = TypeTuple!('[', ']', '\\', '^', '$', '.', '|', '?', ',', '-', ++ ';', ':', '#', '&', '%', '/', '<', '>', '`', '*', '+', '(', ')', '{', '}', '~'); + + private enum NEL = '\u0085', LS = '\u2028', PS = '\u2029'; + + //test if a given string starts with hex number of maxDigit that's a valid codepoint + //returns it's value and skips these maxDigit chars on success, throws on failure +-dchar parseUniHex(Char)(ref Char[] str, uint maxDigit) ++dchar parseUniHex(Char)(ref Char[] str, size_t maxDigit) + { ++ //std.conv.parse is both @system and bogus + enforce(str.length >= maxDigit,"incomplete escape sequence"); + uint val; +- for(int k=0;k ucmp(x.name, y.name) < 0)(unicodeProperties); + //creating empty Codepointset is a workaround + auto eq = range.lowerBound(UnicodeProperty(cast(string)name,CodepointSet.init)).length; +- enforce(eq!=range.length && ucmp(name,range[eq].name)==0,"invalid property name"); ++ enforce(eq != range.length && ucmp(name,range[eq].name) == 0, ++ "invalid property name"); + s = range[eq].set.dup; + } + +@@ -795,40 +864,29 @@ auto memoizeExpr(string expr)() + } + + //basic stack, just in case it gets used anywhere else then Parser +-@trusted struct Stack(T, bool CTFE=false) ++@trusted struct Stack(T) + { +- static if(!CTFE) +- Appender!(T[]) stack;//compiles but bogus at CTFE +- else +- { +- struct Proxy +- { +- T[] data; +- void put(T val) +- { +- data ~= val; +- } +- void shrinkTo(size_t sz){ data = data[0..sz]; } +- } +- Proxy stack; +- } +- @property bool empty(){ return stack.data.empty; } +- void push(T item) +- { +- stack.put(item); +- } +- @property ref T top() ++ T[] data; ++ @property bool empty(){ return data.empty; } ++ ++ @property size_t length(){ return data.length; } ++ ++ void push(T val){ data ~= val; } ++ ++ T pop() + { + assert(!empty); +- return stack.data[$-1]; ++ auto val = data[$ - 1]; ++ data = data[0 .. $ - 1]; ++ if(!__ctfe) ++ data.assumeSafeAppend(); ++ return val; + } +- @property size_t length() { return stack.data.length; } +- T pop() ++ ++ @property ref T top() + { + assert(!empty); +- auto t = stack.data[$-1]; +- stack.shrinkTo(stack.data.length-1); +- return t; ++ return data[$ - 1]; + } + } + +@@ -845,7 +903,7 @@ template BasicElementOf(Range) + alias Unqual!(ElementEncodingType!Range) BasicElementOf; + } + +-struct Parser(R, bool CTFE=false) ++struct Parser(R) + if (isForwardRange!R && is(ElementType!R : dchar)) + { + enum infinite = ~0u; +@@ -854,10 +912,10 @@ struct Parser(R, bool CTFE=false) + R pat, origin; //keep full pattern for pretty printing error messages + Bytecode[] ir; //resulting bytecode + uint re_flags = 0; //global flags e.g. multiline + internal ones +- Stack!(uint, CTFE) fixupStack; //stack of opened start instructions ++ Stack!(uint) fixupStack; //stack of opened start instructions + NamedGroup[] dict; //maps name -> user group number + //current num of group, group nesting level and repetitions step +- Stack!(uint, CTFE) groupStack; ++ Stack!(uint) groupStack; + uint nesting = 0; + uint lookaroundNest = 0; + uint counterDepth = 0; //current depth of nested counted repetitions +@@ -891,7 +949,7 @@ struct Parser(R, bool CTFE=false) + { + if(n/32 >= backrefed.length) + backrefed.length = n/32 + 1; +- backrefed[n/32] |= 1<<(n & 31); ++ backrefed[n / 32] |= 1 << (n & 31); + } + + @property dchar current(){ return _current; } +@@ -927,27 +985,22 @@ struct Parser(R, bool CTFE=false) + + void put(Bytecode code) + { +- enforce(ir.length < maxCompiledLength +- , "maximum compiled pattern length is exceeded"); +- if(__ctfe) +- { +- ir = ir ~ code; +- } +- else +- ir ~= code; ++ enforce(ir.length < maxCompiledLength, ++ "maximum compiled pattern length is exceeded"); ++ ir ~= code; + } + + void putRaw(uint number) + { +- enforce(ir.length < maxCompiledLength +- , "maximum compiled pattern length is exceeded"); ++ enforce(ir.length < maxCompiledLength, ++ "maximum compiled pattern length is exceeded"); + ir ~= Bytecode.fromRaw(number); + } + + //parsing number with basic overflow check + uint parseDecimal() + { +- uint r=0; ++ uint r = 0; + while(ascii.isDigit(current)) + { + if(r >= (uint.max/10)) +@@ -986,10 +1039,7 @@ struct Parser(R, bool CTFE=false) + break L_FlagSwitch; + } + default: +- if(__ctfe) +- assert(text("unknown regex flag '",ch,"'")); +- else +- new RegexException(text("unknown regex flag '",ch,"'")); ++ throw new RegexException(text("unknown regex flag '",ch,"'")); + } + } + } +@@ -1004,7 +1054,7 @@ struct Parser(R, bool CTFE=false) + + while(!empty) + { +- debug(fred_parser) ++ debug(std_regex_parser) + writeln("*LR*\nSource: ", pat, "\nStack: ",fixupStack.stack.data); + switch(current) + { +@@ -1045,21 +1095,9 @@ struct Parser(R, bool CTFE=false) + nglob = groupStack.top++; + enforce(groupStack.top <= maxGroupNumber, "limit on submatches is exceeded"); + auto t = NamedGroup(name, nglob); +- +- if(__ctfe) +- { +- size_t ind; +- for(ind=0; ind = dict[ind].name) +- break; +- insertInPlaceAlt(dict, ind, t); +- } +- else +- { +- auto d = assumeSorted!"a.name < b.name"(dict); +- auto ind = d.lowerBound(t).length; +- insertInPlaceAlt(dict, ind, t); +- } ++ auto d = assumeSorted!"a.name < b.name"(dict); ++ auto ind = d.lowerBound(t).length; ++ insertInPlaceAlt(dict, ind, t); + put(Bytecode(IR.GroupStart, nglob)); + break; + case '<': +@@ -1098,7 +1136,6 @@ struct Parser(R, bool CTFE=false) + assert(lookaroundNest); + fixLookaround(fix); + lookaroundNest--; +- put(ir[fix].paired); + break; + case IR.Option: //| xxx ) + //two fixups: last option + full OR +@@ -1116,7 +1153,6 @@ struct Parser(R, bool CTFE=false) + lookaroundNest--; + fix = fixupStack.pop(); + fixLookaround(fix); +- put(ir[fix].paired); + break; + default://(?:xxx) + fixupStack.pop(); +@@ -1240,7 +1276,7 @@ struct Parser(R, bool CTFE=false) + default: + if(replace) + { +- copyForwardAlt(ir[offset+1..$],ir[offset..$-1]); ++ copyForwardAlt(ir[offset + 1 .. $],ir[offset .. $ - 1]); + ir.length -= 1; + } + return; +@@ -1294,7 +1330,14 @@ struct Parser(R, bool CTFE=false) + } + put(Bytecode(greedy ? IR.InfiniteStart : IR.InfiniteQStart, len)); + enforce(ir.length + len < maxCompiledLength, "maximum compiled pattern length is exceeded"); +- ir ~= ir[offset .. offset+len]; ++ //workaround @@@BUG@@@ 9634 ++ if(__ctfe) ++ { ++ foreach(v; ir[offset .. offset+len]) ++ ir ~= v; ++ } ++ else ++ ir ~= ir[offset .. offset+len]; + //IR.InfinteX is always a hotspot + put(Bytecode(greedy ? IR.InfiniteEnd : IR.InfiniteQEnd, len)); + put(Bytecode.init); //merge index +@@ -1368,27 +1411,32 @@ struct Parser(R, bool CTFE=false) + put(Bytecode.fromRaw(0)); + groupStack.push(0); + lookaroundNest++; +- enforce(lookaroundNest <= maxLookaroundDepth +- , "maximum lookaround depth is exceeded"); ++ enforce(lookaroundNest <= maxLookaroundDepth, ++ "maximum lookaround depth is exceeded"); + } + +- //fixup lookaround with start at offset fix ++ //fixup lookaround with start at offset fix and append a proper *-End opcode + void fixLookaround(uint fix) + { +- ir[fix] = Bytecode(ir[fix].code +- , cast(uint)ir.length - fix - IRL!(IR.LookaheadStart)); ++ ir[fix] = Bytecode(ir[fix].code, ++ cast(uint)ir.length - fix - IRL!(IR.LookaheadStart)); + auto g = groupStack.pop(); + assert(!groupStack.empty); + ir[fix+1] = Bytecode.fromRaw(groupStack.top); + //groups are cumulative across lookarounds + ir[fix+2] = Bytecode.fromRaw(groupStack.top+g); + groupStack.top += g; ++ if(ir[fix].code == IR.LookbehindStart || ir[fix].code == IR.NeglookbehindStart) ++ { ++ reverseBytecode(ir[fix + IRL!(IR.LookbehindStart) .. $]); ++ } ++ put(ir[fix].paired); + } + + //CodepointSet operations relatively in order of priority + enum Operator:uint { +- Open=0, Negate, Difference, SymDifference, Intersection, Union, None +- }; ++ Open = 0, Negate, Difference, SymDifference, Intersection, Union, None ++ } + + //parse unit of CodepointSet spec, most notably escape sequences and char ranges + //also fetches next set operation +@@ -1527,9 +1575,10 @@ struct Parser(R, bool CTFE=false) + last = parseControlCode(); + state = State.Char; + break; +- case '[',']','\\','^','$','.','|','?',',','-',';',':' +- ,'#','&','%','/','<','>','`' +- ,'*','+','(',')','{','}', '~': ++ foreach(val; Escapables) ++ { ++ case val: ++ } + last = current; + state = State.Char; + break; +@@ -1633,9 +1682,10 @@ struct Parser(R, bool CTFE=false) + case 'v': + end = '\v'; + break; +- case '[',']','\\','^','$','.','|','?',',','-',';',':' +- ,'#','&','%','/','<','>','`' +- ,'*','+','(',')','{','}', '~': ++ foreach(val; Escapables) ++ { ++ case val: ++ } + end = current; + break; + case 'c': +@@ -1663,8 +1713,8 @@ struct Parser(R, bool CTFE=false) + return tuple(set, op); + } + +- alias Stack!(CodepointSet, CTFE) ValStack; +- alias Stack!(Operator, CTFE) OpStack; ++ alias Stack!(CodepointSet) ValStack; ++ alias Stack!(Operator) OpStack; + + //parse and store IR for CodepointSet + void parseCharset() +@@ -1708,8 +1758,6 @@ struct Parser(R, bool CTFE=false) + { + while(cond(opstack.top)) + { +- debug(fred_charset) +- writeln(opstack.stack.data); + if(!apply(opstack.pop(),vstack)) + return false;//syntax error + if(opstack.empty) +@@ -1725,18 +1773,18 @@ struct Parser(R, bool CTFE=false) + { + case '[': + opstack.push(Operator.Open); +- enforce(next(), "unexpected end of CodepointSet"); ++ enforce(next(), "unexpected end of character class"); + if(current == '^') + { + opstack.push(Operator.Negate); +- enforce(next(), "unexpected end of CodepointSet"); ++ enforce(next(), "unexpected end of character class"); + } + //[] is prohibited +- enforce(current != ']', "wrong CodepointSet"); ++ enforce(current != ']', "wrong character class"); + goto default; + case ']': +- enforce(unrollWhile!(unaryFun!"a != a.Open")(vstack, opstack) +- , "CodepointSet syntax error"); ++ enforce(unrollWhile!(unaryFun!"a != a.Open")(vstack, opstack), ++ "character class syntax error"); + enforce(!opstack.empty, "unmatched ']'"); + opstack.pop(); + next(); +@@ -1798,7 +1846,7 @@ struct Parser(R, bool CTFE=false) + auto t = getTrie(set); + put(Bytecode(IR.Trie, cast(uint)tries.length)); + tries ~= t; +- debug(fred_allocation) writeln("Trie generated"); ++ debug(std_regex_allocation) writeln("Trie generated"); + } + else + { +@@ -1874,7 +1922,7 @@ struct Parser(R, bool CTFE=false) + case '1': .. case '9': + uint nref = cast(uint)current - '0'; + uint maxBackref; +- foreach(v; groupStack.stack.data) ++ foreach(v; groupStack.data) + maxBackref += v; + uint localLimit = maxBackref - groupStack.top; + enforce(nref < maxBackref, "Backref to unseen group"); +@@ -1910,11 +1958,11 @@ struct Parser(R, bool CTFE=false) + alias comparePropertyName ucmp; + enum MAX_PROPERTY = 128; + char[MAX_PROPERTY] result; +- uint k=0; ++ uint k = 0; + enforce(next()); + if(current == '{') + { +- while(k\w+) = (?P\d+)`); ++ auto nc = re.namedCaptures; ++ static assert(isRandomAccessRange!(typeof(nc))); ++ assert(!nc.empty); ++ assert(nc.length == 2); ++ assert(nc.equal(["name", "var"])); ++ assert(nc[0] == "name"); ++ assert(nc[1..$].equal(["var"])); ++ ---- ++ +/ ++ @safe @property auto namedCaptures() ++ { ++ static struct NamedGroupRange ++ { ++ private: ++ NamedGroup[] groups; ++ size_t start; ++ size_t end; ++ public: ++ this(NamedGroup[] g, size_t s, size_t e) ++ { ++ assert(s <= e); ++ assert(e <= g.length); ++ groups = g; ++ start = s; ++ end = e; ++ } ++ ++ @property string front() { return groups[start].name; } ++ @property string back() { return groups[end-1].name; } ++ @property bool empty() { return start >= end; } ++ @property size_t length() { return end - start; } ++ alias length opDollar; ++ @property NamedGroupRange save() ++ { ++ return NamedGroupRange(groups, start, end); ++ } ++ void popFront() { assert(!empty); start++; } ++ void popBack() { assert(!empty); end--; } ++ string opIndex()(size_t i) ++ { ++ assert(start + i < end, ++ "Requested named group is out of range."); ++ return groups[start+i].name; ++ } ++ NamedGroupRange opSlice(size_t low, size_t high) { ++ assert(low <= high); ++ assert(start + high <= end); ++ return NamedGroupRange(groups, start + low, start + high); ++ } ++ NamedGroupRange opSlice() { return this.save; } ++ } ++ return NamedGroupRange(dict, 0, dict.length); ++ } ++ ++ /// + + private: + NamedGroup[] dict; //maps name -> user group number +@@ -1991,7 +2103,7 @@ private: + { + if(n/32 >= backrefed.length) + return 0; +- return backrefed[n/32] & (1<<(n&31)); ++ return backrefed[n / 32] & (1 << (n & 31)); + } + + //check if searching is not needed +@@ -2000,7 +2112,7 @@ private: + if(flags & RegexOption.multiline) + return; + L_CheckLoop: +- for(uint i=0; i\w+) = (?P\d+)`); ++ auto nc = re.namedCaptures; ++ static assert(isRandomAccessRange!(typeof(nc))); ++ assert(!nc.empty); ++ assert(nc.length == 2); ++ assert(nc.equal(["name", "var"])); ++ assert(nc[0] == "name"); ++ assert(nc[1..$].equal(["var"])); ++ ++ re = regex(`(\w+) (?P\w+) (\w+)`); ++ nc = re.namedCaptures; ++ assert(nc.length == 1); ++ assert(nc[0] == "named"); ++ assert(nc.front == "named"); ++ assert(nc.back == "named"); ++ ++ re = regex(`(\w+) (\w+)`); ++ nc = re.namedCaptures; ++ assert(nc.empty); ++ ++ re = regex(`(?P\d{4})/(?P\d{2})/(?P\d{2})/`); ++ nc = re.namedCaptures; ++ auto cp = nc.save; ++ assert(nc.equal(cp)); ++ nc.popFront(); ++ assert(nc.equal(cp[1..$])); ++ nc.popBack(); ++ assert(nc.equal(cp[1 .. $ - 1])); ++} ++ + // + @trusted uint lookupNamedGroup(String)(NamedGroup[] dict, String name) + {//equal is @system? +@@ -2177,7 +2315,7 @@ int quickTestFwd(RegEx)(uint pc, dchar f + uint end = pc + len; + if(re.ir[pc].data != front && re.ir[pc+1].data != front) + { +- for(pc = pc+2; pc 0) + { +- debug(fred_matching) +- writefln("PC: %s\tCNT: %s\t%s \tfront: %s src: %s" +- , pc, counter, disassemble(re.ir, pc, re.dict) +- , front, retro(s[index..s.lastIndex])); +- switch(re.ir[pc].code) +- { +- case IR.OrChar://assumes IRL!(OrChar) == 1 +- if(atEnd) +- goto L_backtrack; +- uint len = re.ir[pc].sequence; +- uint end = pc - len; +- if(re.ir[pc].data != front && re.ir[pc-1].data != front) +- { +- for(pc = pc-2; pc>end; pc--) +- if(re.ir[pc].data == front) +- break; +- if(pc == end) +- goto L_backtrack; +- } +- pc = end; +- next(); +- break; +- case IR.Char: +- if(atEnd || front != re.ir[pc].data) +- goto L_backtrack; +- pc--; +- next(); +- break; +- case IR.Any: +- if(atEnd || (!(re.flags & RegexOption.singleline) +- && (front == '\r' || front == '\n'))) +- goto L_backtrack; +- pc--; +- next(); +- break; +- case IR.CodepointSet: +- if(atEnd || !re.charsets[re.ir[pc].data].scanFor(front)) +- goto L_backtrack; +- next(); +- pc--; +- break; +- case IR.Trie: +- if(atEnd || !re.tries[re.ir[pc].data][front]) +- goto L_backtrack; +- next(); +- pc--; +- break; +- case IR.Wordboundary: +- dchar back; +- DataIndex bi; +- //at start & end of input +- if(atStart && wordTrie[front]) +- { +- pc--; +- break; +- } +- else if(atEnd && s.loopBack.nextChar(back, bi) +- && wordTrie[back]) +- { +- pc--; +- break; +- } +- else if(s.loopBack.nextChar(back, index)) +- { +- bool af = wordTrie[front]; +- bool ab = wordTrie[back]; +- if(af ^ ab) +- { +- pc--; +- break; +- } +- } +- goto L_backtrack; +- case IR.Notwordboundary: +- dchar back; +- DataIndex bi; +- //at start & end of input +- if(atStart && wordTrie[front]) +- goto L_backtrack; +- else if(atEnd && s.loopBack.nextChar(back, bi) +- && wordTrie[back]) +- goto L_backtrack; +- else if(s.loopBack.nextChar(back, index)) +- { +- bool af = wordTrie[front]; +- bool ab = wordTrie[back]; +- if(af ^ ab) +- goto L_backtrack; +- } +- pc--; +- break; +- case IR.Bol: +- dchar back; +- DataIndex bi; +- if(atStart) +- pc--; +- else if((re.flags & RegexOption.multiline) +- && s.loopBack.nextChar(back,bi) +- && endOfLine(back, front == '\n')) +- { +- pc--; +- } +- else +- goto L_backtrack; +- break; +- case IR.Eol: +- dchar back; +- DataIndex bi; +- debug(fred_matching) +- writefln("EOL (front 0x%x) %s", front, s[index..s.lastIndex]); +- //no matching inside \r\n +- if((re.flags & RegexOption.multiline) +- && s.loopBack.nextChar(back,bi) +- && endOfLine(front, back == '\r')) +- { +- pc -= IRL!(IR.Eol); +- } +- else +- goto L_backtrack; +- break; +- case IR.InfiniteStart, IR.InfiniteQStart: +- uint len = re.ir[pc].data; +- assert(infiniteNesting < trackers.length); +- if(trackers[infiniteNesting] == index) +- {//source not consumed +- pc--; //out of loop +- infiniteNesting--; +- break; +- } +- else +- trackers[infiniteNesting] = index; +- if(re.ir[pc].code == IR.InfiniteStart)//greedy +- { +- infiniteNesting--; +- pushState(pc-1, counter);//out of loop +- infiniteNesting++; +- pc += len; +- } +- else +- { +- pushState(pc+len, counter); +- pc--; +- infiniteNesting--; +- } +- break; +- case IR.InfiniteEnd: +- case IR.InfiniteQEnd://now it's a start +- uint len = re.ir[pc].data; +- trackers[infiniteNesting+1] = index; +- pc -= len+IRL!(IR.InfiniteStart); +- assert(re.ir[pc].code == IR.InfiniteStart +- || re.ir[pc].code == IR.InfiniteQStart); +- debug(fred_matching) +- writeln("(backmatch) Infinite nesting:", infiniteNesting); +- if(re.ir[pc].code == IR.InfiniteStart)//greedy +- { +- pushState(pc-1, counter); +- infiniteNesting++; +- pc += len; +- } +- else +- { +- infiniteNesting++; +- pushState(pc + len, counter); +- infiniteNesting--; +- pc--; +- } +- break; +- case IR.RepeatStart, IR.RepeatQStart: +- uint len = re.ir[pc].data; +- uint tail = pc + len + 1; +- uint step = re.ir[tail+2].raw; +- uint min = re.ir[tail+3].raw; +- uint max = re.ir[tail+4].raw; +- if(counter < min) +- { +- counter += step; +- pc += len; +- } +- else if(counter < max) +- { +- if(re.ir[pc].code == IR.RepeatStart)//greedy +- { +- pushState(pc-1, counter%step); +- counter += step; +- pc += len; +- } +- else +- { +- pushState(pc + len, counter + step); +- counter = counter%step; +- pc--; +- } +- } +- else +- { +- counter = counter%step; +- pc--; +- } +- break; +- case IR.RepeatEnd: +- case IR.RepeatQEnd: +- pc -= re.ir[pc].data+IRL!(IR.RepeatStart); +- assert(re.ir[pc].code == IR.RepeatStart || re.ir[pc].code == IR.RepeatQStart); +- goto case IR.RepeatStart; +- case IR.OrEnd: +- uint len = re.ir[pc].data; +- pc -= len; +- assert(re.ir[pc].code == IR.Option); +- len = re.ir[pc].data; +- auto pc_save = pc+len-IRL!(IR.GotoEndOr); +- pc = pc + len + IRL!(IR.Option); +- while(re.ir[pc].code == IR.Option) +- { +- pushState(pc-IRL!(IR.GotoEndOr)-1, counter); +- len = re.ir[pc].data; +- pc += len + IRL!(IR.Option); +- } +- assert(re.ir[pc].code == IR.OrEnd); +- pc--; +- if(pc != pc_save) +- { +- pushState(pc, counter); +- pc = pc_save; +- } +- break; +- case IR.OrStart: +- assert(0); +- case IR.Option: +- assert(re.ir[pc].code == IR.Option); +- pc += re.ir[pc].data + IRL!(IR.Option); +- if(re.ir[pc].code == IR.Option) +- { +- pc--;//hackish, assumes size of IR.Option == 1 +- if(re.ir[pc].code == IR.GotoEndOr) +- { +- pc += re.ir[pc].data + IRL!(IR.GotoEndOr); +- } +- +- } +- assert(re.ir[pc].code == IR.OrEnd); +- pc -= re.ir[pc].data + IRL!(IR.OrStart)+1; +- break; +- case IR.GotoEndOr: +- assert(0); +- case IR.GroupStart: +- uint n = re.ir[pc].data; +- matches[n].begin = index; +- debug(fred_matching) writefln("IR group #%u starts at %u", n, index); +- pc --; +- break; +- case IR.GroupEnd: +- uint n = re.ir[pc].data; +- matches[n].end = index; +- debug(fred_matching) writefln("IR group #%u ends at %u", n, index); +- pc --; +- break; +- case IR.LookaheadStart: +- case IR.NeglookaheadStart: +- assert(0); +- case IR.LookaheadEnd: +- case IR.NeglookaheadEnd: +- uint len = re.ir[pc].data; +- pc -= len + IRL!(IR.LookaheadStart); +- uint ms = re.ir[pc+1].raw, me = re.ir[pc+2].raw; +- auto mem = malloc(initialMemory(re))[0..initialMemory(re)]; +- scope(exit) free(mem.ptr); +- auto matcher = BacktrackingMatcher!(Char, typeof(s.loopBack))(re, s.loopBack, mem); +- matcher.matches = matches[ms .. me]; +- matcher.backrefed = backrefed.empty ? matches : backrefed; +- matcher.re.ir = re.ir[pc+IRL!(IR.LookaheadStart) .. pc+IRL!(IR.LookaheadStart)+len+IRL!(IR.LookaheadEnd)]; +- bool match = matcher.matchImpl() ^ (re.ir[pc].code == IR.NeglookaheadStart); +- if(!match) +- goto L_backtrack; +- else +- { +- pc --; +- } +- break; +- case IR.LookbehindEnd: +- case IR.NeglookbehindEnd: +- uint len = re.ir[pc].data; +- pc -= len + IRL!(IR.LookbehindStart); +- auto save = index; +- uint ms = re.ir[pc+1].raw, me = re.ir[pc+2].raw; +- auto mem = malloc(initialMemory(re))[0..initialMemory(re)]; +- scope(exit) free(mem.ptr); +- auto matcher = BacktrackingMatcher(re, s, mem, front, index); +- matcher.re.ngroup = me - ms; +- matcher.matches = matches[ms .. me]; +- matcher.backrefed = backrefed.empty ? matches : backrefed; +- matcher.re.ir = re.ir[pc .. pc+IRL!(IR.LookbehindStart)+len]; +- bool match = matcher.matchBackImpl() ^ (re.ir[pc].code == IR.NeglookbehindStart); +- s.reset(save); +- next(); +- if(!match) +- goto L_backtrack; +- else +- { +- pc --; +- } +- break; +- case IR.Backref: +- uint n = re.ir[pc].data; +- auto referenced = re.ir[pc].localRef +- ? s[matches[n].begin .. matches[n].end] +- : s[backrefed[n].begin .. backrefed[n].end]; +- while(!atEnd && !referenced.empty && front == referenced.front) +- { +- next(); +- referenced.popFront(); +- } +- if(referenced.empty) +- pc--; +- else +- goto L_backtrack; +- break; +- case IR.Nop: +- pc --; +- break; +- case IR.LookbehindStart: +- case IR.NeglookbehindStart: +- return true; +- default: +- assert(re.ir[pc].code < 0x80); +- pc --; //data +- break; +- L_backtrack: +- if(!popState()) +- { +- s.reset(start); +- return false; +- } +- } +- } +- return true; +- } +- } +- } +-} +- +-//very shitty string formatter, $$ replaced with next argument converted to string +-@trusted string ctSub( U...)(string format, U args) +-{ +- bool seenDollar; +- foreach(i, ch; format) +- { +- if(ch == '$') +- { +- if(seenDollar) +- { +- static if(args.length > 0) +- { +- return format[0..i-1] ~ to!string(args[0]) +- ~ ctSub(format[i+1..$], args[1..$]); ++ return format[0 .. i - 1] ~ to!string(args[0]) ++ ~ ctSub(format[i + 1 .. $], args[1 .. $]); + } + else + assert(0); +@@ -4218,7 +3870,7 @@ template BacktrackingMatcher(bool CTrege + string s = "alias TypeTuple!("; + if(S < E) + s ~= to!string(S); +- for(int i=S+1; i= 0)`, id, code ? code : "return 0;", ++ ir[pc].mnemonic, id); + } + } + return ""; +@@ -4578,7 +4307,7 @@ struct CtContext + bailOut = "goto L_backtrack;"; + nextInstr = ctSub("goto case $$;", addr+1); + code ~= ctSub( ` +- case $$: debug(fred_matching) writeln("#$$"); ++ case $$: debug(std_regex_matcher) writeln("#$$"); + `, addr, addr); + } + switch(ir[0].code) +@@ -4588,7 +4317,7 @@ struct CtContext + if(atEnd) + $$`, bailOut); + uint len = ir[0].sequence; +- for(uint i = 0; iend; t.pc--) +- if(re.ir[t.pc].data == front) +- break; +- if(t.pc != end) +- { +- t.pc = end; +- nlist.insertBack(t); +- } +- else +- recycle(t); +- t = worklist.fetch(); +- break; +- case IR.Char: +- if(front == re.ir[t.pc].data) +- { +- t.pc--; +- nlist.insertBack(t); +- } +- else +- recycle(t); +- t = worklist.fetch(); +- break; +- case IR.Any: +- t.pc--; +- if(!(re.flags & RegexOption.singleline) +- && (front == '\r' || front == '\n')) +- recycle(t); +- else +- nlist.insertBack(t); +- t = worklist.fetch(); +- break; +- case IR.CodepointSet: +- if(re.charsets[re.ir[t.pc].data].scanFor(front)) +- { +- t.pc--; +- nlist.insertBack(t); +- } +- else +- { +- recycle(t); +- } +- t = worklist.fetch(); +- break; +- case IR.Trie: +- if(re.tries[re.ir[t.pc].data][front]) +- { +- t.pc--; +- nlist.insertBack(t); +- } +- else +- { +- recycle(t); +- } +- t = worklist.fetch(); ++ if (!atEnd) return MatchResult.PartialMatch; + break; +- default: +- assert(re.ir[t.pc].code < 0x80, "Unrecognized instruction " ~ re.ir[t.pc].mnemonic); +- t.pc--; +- } +- else +- { +- default: +- if(re.ir[t.pc].code < 0x80) +- t.pc--; +- else +- { +- recycle(t); +- t = worklist.fetch(); +- } +- } ++ } ++ debug(std_regex_matcher) writeln("-- Ended iteration of main cycle\n"); + } +- }while(t); ++ } ++ genCounter++; //increment also on each end ++ debug(std_regex_matcher) writefln("-- Matching threads at end"); ++ //try out all zero-width posibilities ++ for(Thread!DataIndex* t = clist.fetch(); t; t = clist.fetch()) ++ { ++ evalFn!false(t, matches); ++ } ++ if(!matched) ++ evalFn!false(createStart(index, startPc), matches); ++ ++ return (matched?MatchResult.Match:MatchResult.NoMatch); + } + + //get a dirty recycled Thread +@@ -6086,10 +5400,10 @@ enum OneShot { Fwd, Bwd }; + void prepareFreeList(size_t size, ref void[] memory) + { + void[] mem = memory[0 .. threadSize*size]; +- memory = memory[threadSize*size..$]; ++ memory = memory[threadSize * size .. $]; + freelist = cast(Thread!DataIndex*)&mem[0]; + size_t i; +- for(i=threadSize; i smallString ? big_matches : small_matches[0..ngroup]; ++ return _ngroup > smallString ? big_matches : small_matches[0 .. _ngroup]; + } + + void newMatches() + { +- if(ngroup > smallString) +- big_matches = new Group!DataIndex[ngroup]; ++ if(_ngroup > smallString) ++ big_matches = new Group!DataIndex[_ngroup]; + } + + public: +@@ -6231,39 +5555,40 @@ public: + @property R front() + { + assert(!empty); +- return _input[matches[f].begin .. matches[f].end]; ++ return _input[matches[_f].begin .. matches[_f].end]; + } + + ///ditto + @property R back() + { + assert(!empty); +- return _input[matches[b-1].begin .. matches[b-1].end]; ++ return _input[matches[_b - 1].begin .. matches[_b - 1].end]; + } + + ///ditto + void popFront() + { + assert(!empty); +- ++f; ++ ++_f; + } + + ///ditto + void popBack() + { + assert(!empty); +- --b; ++ --_b; + } + + ///ditto +- @property bool empty() const { return _empty || f >= b; } ++ @property bool empty() const { return _empty || _f >= _b; } + + ///ditto + R opIndex()(size_t i) /*const*/ //@@@BUG@@@ + { +- assert(f+i < b,text("requested submatch number ", i,"is out of range")); +- assert(matches[f+i].begin <= matches[f+i].end, text("wrong match: ", matches[f+i].begin, "..", matches[f+i].end)); +- return _input[matches[f+i].begin..matches[f+i].end]; ++ assert(_f + i < _b,text("requested submatch number ", i," is out of range")); ++ assert(matches[_f + i].begin <= matches[_f + i].end, ++ text("wrong match: ", matches[_f + i].begin, "..", matches[_f + i].end)); ++ return _input[matches[_f + i].begin .. matches[_f + i].end]; + } + + /++ +@@ -6286,12 +5611,12 @@ public: + R opIndex(String)(String i) /*const*/ //@@@BUG@@@ + if(isSomeString!String) + { +- size_t index = lookupNamedGroup(names, i); +- return _input[matches[index].begin..matches[index].end]; ++ size_t index = lookupNamedGroup(_names, i); ++ return _input[matches[index].begin .. matches[index].end]; + } + + ///Number of matches in this object. +- @property size_t length() const { return _empty ? 0 : b-f; } ++ @property size_t length() const { return _empty ? 0 : _b - _f; } + + ///A hook for compatibility with original std.regex. + @property ref captures(){ return this; } +@@ -6321,10 +5646,10 @@ unittest//verify example + Effectively it's a forward range of Captures!R, produced + by lazily searching for matches in a given input. + +- alias Engine specifies an engine type to use during matching, ++ $(D alias Engine) specifies an engine type to use during matching, + and is automatically deduced in a call to $(D match)/$(D bmatch). + +/ +-@trusted public struct RegexMatch(R, alias Engine=ThompsonMatcher) ++@trusted public struct RegexMatch(R, alias Engine = ThompsonMatcher) + if(isSomeString!R) + { + private: +@@ -6335,7 +5660,7 @@ private: + Captures!(R,EngineType.DataIndex) _captures; + void[] _memory;//is ref-counted + +- this(RegEx)(RegEx prog, R input) ++ this(RegEx)(R input, RegEx prog) + { + _input = input; + immutable size = EngineType.initialMemory(prog)+size_t.sizeof; +@@ -6343,9 +5668,11 @@ private: + scope(failure) free(_memory.ptr); + *cast(size_t*)_memory.ptr = 1; + _engine = EngineType(prog, Input!Char(input), _memory[size_t.sizeof..$]); ++ static if(is(RegEx == StaticRegex!(BasicElementOf!R))) ++ _engine.nativeFn = prog.nativeFn; + _captures = Captures!(R,EngineType.DataIndex)(this); + _captures._empty = !_engine.match(_captures.matches); +- debug(fred_allocation) writefln("RefCount (ctor): %x %d", _memory.ptr, counter); ++ debug(std_regex_allocation) writefln("RefCount (ctor): %x %d", _memory.ptr, counter); + } + + @property ref size_t counter(){ return *cast(size_t*)_memory.ptr; } +@@ -6355,8 +5682,8 @@ public: + if(_memory.ptr) + { + ++counter; +- debug(fred_allocation) writefln("RefCount (postblit): %x %d" +- , _memory.ptr, *cast(size_t*)_memory.ptr); ++ debug(std_regex_allocation) writefln("RefCount (postblit): %x %d", ++ _memory.ptr, *cast(size_t*)_memory.ptr); + } + } + +@@ -6364,8 +5691,8 @@ public: + { + if(_memory.ptr && --*cast(size_t*)_memory.ptr == 0) + { +- debug(fred_allocation) writefln("RefCount (dtor): %x %d" +- , _memory.ptr, *cast(size_t*)_memory.ptr); ++ debug(std_regex_allocation) writefln("RefCount (dtor): %x %d", ++ _memory.ptr, *cast(size_t*)_memory.ptr); + free(cast(void*)_memory.ptr); + } + } +@@ -6436,6 +5763,35 @@ public: + + } + ++private @trusted auto matchOnce(alias Engine, RegEx, R)(R input, RegEx re) ++{ ++ alias BasicElementOf!R Char; ++ alias Engine!Char EngineType; ++ ++ size_t size = EngineType.initialMemory(re); ++ void[] memory = enforce(malloc(size))[0..size]; ++ scope(exit) free(memory.ptr); ++ auto captures = Captures!(R, EngineType.DataIndex)(input, re.ngroup, re.dict); ++ auto engine = EngineType(re, Input!Char(input), memory); ++ static if(is(RegEx == StaticRegex!(BasicElementOf!R))) ++ engine.nativeFn = re.nativeFn; ++ captures._empty = !engine.match(captures.matches); ++ return captures; ++} ++ ++private auto matchMany(alias Engine, RegEx, R)(R input, RegEx re) ++{ ++ re.flags |= RegexOption.global; ++ return RegexMatch!(R, Engine)(input, re); ++} ++ ++unittest ++{ ++ //sanity checks for new API ++ auto re = regex("abc"); ++ assert(!"abc".matchOnce!(ThompsonMatcher)(re).empty); ++ assert("abc".matchOnce!(ThompsonMatcher)(re)[0] == "abc"); ++} + /++ + Compile regular expression pattern for the later execution. + Returns: $(D Regex) object that works on inputs having +@@ -6459,19 +5815,9 @@ public: + public auto regexImpl(S)(S pattern, const(char)[] flags="") + if(isSomeString!(S)) + { +- alias Regex!(BasicElementOf!S) Reg; +- if(!__ctfe) +- { +- auto parser = Parser!(Unqual!(typeof(pattern)))(pattern, flags); +- Regex!(BasicElementOf!S) r = parser.program; +- return r; +- } +- else +- { +- auto parser = Parser!(Unqual!(typeof(pattern)), true)(pattern, flags); +- Regex!(BasicElementOf!S) r = parser.program; +- return r; +- } ++ auto parser = Parser!(Unqual!(typeof(pattern)))(pattern, flags); ++ auto r = parser.program; ++ return r; + } + + +@@ -6483,83 +5829,197 @@ template ctRegexImpl(alias pattern, stri + alias BacktrackingMatcher!(true) Matcher; + @trusted bool func(ref Matcher!Char matcher) + { +- version(fred_ct) debug pragma(msg, source); ++ debug(std_regex_ctr) pragma(msg, source); + mixin(source); + } + enum nr = StaticRegex!Char(r, &func); + } + + /++ +- Experimental feature. ++ Experimental feature. ++ ++ Compile regular expression using CTFE ++ and generate optimized native machine code for matching it. ++ ++ Returns: StaticRegex object for faster matching. ++ ++ Params: ++ pattern = Regular expression ++ flags = The _attributes (g, i, m and x accepted) +++/ ++public template ctRegex(alias pattern, alias flags=[]) ++{ ++ enum ctRegex = ctRegexImpl!(pattern, flags).nr; ++} ++ ++template isRegexFor(RegEx, R) ++{ ++ enum isRegexFor = is(RegEx == Regex!(BasicElementOf!R)) ++ || is(RegEx == StaticRegex!(BasicElementOf!R)); ++} ++ ++/++ ++ Start matching $(D input) to regex pattern $(D re), ++ using Thompson NFA matching scheme. ++ ++ The use of this function is $(RED discouraged) - use either of ++ $(LREF matchAll) or $(LREF matchFirst). ++ ++ Delegating the kind of operation ++ to "g" flag is soon to be phased out along with the ++ ability to choose the exact matching scheme. The choice of ++ matching scheme to use depends highly on the pattern kind and ++ can done automatically on case by case basis. ++ ++ Returns: a $(D RegexMatch) object holding engine state after first match. +++/ ++ ++public auto match(R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && is(RegEx == Regex!(BasicElementOf!R))) ++{ ++ return RegexMatch!(Unqual!(typeof(input)),ThompsonMatcher)(input, re); ++} ++ ++///ditto ++public auto match(R, String)(R input, String re) ++ if(isSomeString!R && isSomeString!String) ++{ ++ return RegexMatch!(Unqual!(typeof(input)),ThompsonMatcher)(input, regex(re)); ++} ++ ++public auto match(R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && is(RegEx == StaticRegex!(BasicElementOf!R))) ++{ ++ return RegexMatch!(Unqual!(typeof(input)),BacktrackingMatcher!true)(input, re); ++} ++ ++/++ ++ Find the first (leftmost) slice of the $(D input) that ++ matches the pattern $(D re). This function picks the most suitable ++ regular expression engine depending on the pattern properties. + +- Compile regular expression using CTFE +- and generate optimized native machine code for matching it. +- +- Returns: StaticRegex object for faster matching. ++ $(D re) parameter can be one of three types: ++ $(UL ++ $(LI Plain string, in which case it's compiled to bytecode before matching. ) ++ $(LI Regex!char (wchar/dchar) that contains a pattern in the form of ++ compiled bytecode. ) ++ $(LI StaticRegex!char (wchar/dchar) that contains a pattern in the form of ++ compiled native machine code. ) ++ ) + +- Params: +- pattern = Regular expression +- flags = The _attributes (g, i, m and x accepted) ++ Returns: ++ $(LREF Captures) containing the extent of a match together with all submatches ++ if there was a match, otherwise an empty $(LREF Captures) object. + +/ +-public template ctRegex(alias pattern, alias flags=[]) ++public auto matchFirst(R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && is(RegEx == Regex!(BasicElementOf!R))) + { +- enum ctRegex = ctRegexImpl!(pattern, flags).nr; ++ return matchOnce!ThompsonMatcher(input, re); + } + +-template isRegexFor(RegEx, R) ++///ditto ++public auto matchFirst(R, String)(R input, String re) ++ if(isSomeString!R && isSomeString!String) + { +- enum isRegexFor = is(RegEx == Regex!(BasicElementOf!R)) +- || is(RegEx == StaticRegex!(BasicElementOf!R)); ++ return matchOnce!ThompsonMatcher(input, regex(re)); ++} ++ ++public auto matchFirst(R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && is(RegEx == StaticRegex!(BasicElementOf!R))) ++{ ++ return matchOnce!(BacktrackingMatcher!true)(input, re); + } + + /++ +- Start matching $(D input) to regex pattern $(D re), +- using Thompson NFA matching scheme. ++ Initiate a search for all non-overlapping matches to the pattern $(D re) ++ in the given $(D input). The result is a lazy range of matches generated ++ as they are encountered in the input going left to right. + +- This is the $(U recommended) method for matching regular expression. ++ This function picks the most suitable regular expression engine ++ depending on the pattern properties. + + $(D re) parameter can be one of three types: + $(UL + $(LI Plain string, in which case it's compiled to bytecode before matching. ) +- $(LI Regex!char (wchar/dchar) that contains pattern in form of +- precompiled bytecode. ) +- $(LI StaticRegex!char (wchar/dchar) that contains pattern in form of +- specially crafted native code. ) ++ $(LI Regex!char (wchar/dchar) that contains a pattern in the form of ++ compiled bytecode. ) ++ $(LI StaticRegex!char (wchar/dchar) that contains a pattern in the form of ++ compiled native machine code. ) + ) +- Returns: a $(D RegexMatch) object holding engine state after first match. +-+/ + +-public auto match(R, RegEx)(R input, RegEx re) ++ Returns: ++ $(LREF RegexMatch) object that represents matcher state ++ after the first match was found or an empty one if not present. +++/ ++public auto matchAll(R, RegEx)(R input, RegEx re) + if(isSomeString!R && is(RegEx == Regex!(BasicElementOf!R))) + { +- return RegexMatch!(Unqual!(typeof(input)),ThompsonMatcher)(re, input); ++ return matchMany!ThompsonMatcher(input, re); + } + + ///ditto +-public auto match(R, String)(R input, String re) ++public auto matchAll(R, String)(R input, String re) + if(isSomeString!R && isSomeString!String) + { +- return RegexMatch!(Unqual!(typeof(input)),ThompsonMatcher)(regex(re), input); ++ return matchMany!ThompsonMatcher(input, regex(re)); + } + +-public auto match(R, RegEx)(R input, RegEx re) ++public auto matchAll(R, RegEx)(R input, RegEx re) + if(isSomeString!R && is(RegEx == StaticRegex!(BasicElementOf!R))) + { +- return RegexMatch!(Unqual!(typeof(input)),BacktrackingMatcher!true)(re, input); ++ return matchMany!(BacktrackingMatcher!true)(input, re); ++} ++ ++// another set of tests just to cover the new API ++@system unittest ++{ ++ foreach(String; TypeTuple!(string, wstring, const(dchar)[])) ++ { ++ auto str1 = "blah-bleh".to!String(); ++ auto pat1 = "bl[ae]h".to!String(); ++ auto mf = matchFirst(str1, pat1); ++ assert(mf.equal(["blah".to!String()])); ++ auto mAll = matchAll(str1, pat1); ++ assert(mAll.equal!((a,b) => a.equal(b)) ++ ([["blah".to!String()], ["bleh".to!String()]])); ++ ++ auto str2 = "1/03/12 - 3/03/12".to!String(); ++ auto pat2 = regex(r"(\d+)/(\d+)/(\d+)".to!String()); ++ auto mf2 = matchFirst(str2, pat2); ++ assert(mf2.equal(["1/03/12", "1", "03", "12"].map!(to!String)())); ++ auto mAll2 = matchAll(str2, pat2); ++ assert(mAll2.front.equal(mf2)); ++ mAll2.popFront(); ++ assert(mAll2.front.equal(["3/03/12", "3", "03", "12"].map!(to!String)())); ++ mf2.popFrontN(3); ++ assert(mf2.equal(["12".to!String()])); ++ ++ auto ctPat = ctRegex!(`(?P\d+)/(?P\d+)`.to!String()); ++ auto str = "2 + 34/56 - 6/1".to!String(); ++ auto cmf = matchFirst(str, ctPat); ++ assert(cmf.equal(["34/56", "34", "56"].map!(to!String)())); ++ assert(cmf["Quot"] == "34".to!String()); ++ assert(cmf["Denom"] == "56".to!String()); ++ ++ auto cmAll = matchAll(str, ctPat); ++ assert(cmAll.front.equal(cmf)); ++ cmAll.popFront(); ++ assert(cmAll.front.equal(["6/1", "6", "1"].map!(to!String)())); ++ } + } + + /++ +- Start matching $(D input) to regex pattern $(D re), ++ Start matching of $(D input) to regex pattern $(D re), + using traditional $(LUCKY backtracking) matching scheme. + +- $(D re) parameter can be one of three types: +- $(UL +- $(LI Plain string, in which case it's compiled to bytecode before matching. ) +- $(LI Regex!char (wchar/dchar) that contains pattern in form of +- precompiled bytecode. ) +- $(LI StaticRegex!char (wchar/dchar) that contains pattern in form of +- specially crafted native code. ) +- ) ++ The use of this function is $(RED discouraged) - use either of ++ $(LREF matchAll) or $(LREF matchFirst). ++ ++ Delegating the kind of operation ++ to "g" flag is soon to be phased out along with the ++ ability to choose the exact matching scheme. The choice of ++ matching scheme to use depends highly on the pattern kind and ++ can done automatically on case by case basis. + + Returns: a $(D RegexMatch) object holding engine + state after first match. +@@ -6568,83 +6028,245 @@ public auto match(R, RegEx)(R input, Reg + public auto bmatch(R, RegEx)(R input, RegEx re) + if(isSomeString!R && is(RegEx == Regex!(BasicElementOf!R))) + { +- return RegexMatch!(Unqual!(typeof(input)), BacktrackingMatcher!false)(re, input); ++ return RegexMatch!(Unqual!(typeof(input)), BacktrackingMatcher!false)(input, re); + } + + ///ditto + public auto bmatch(R, String)(R input, String re) + if(isSomeString!R && isSomeString!String) + { +- return RegexMatch!(Unqual!(typeof(input)), BacktrackingMatcher!false)(regex(re), input); ++ return RegexMatch!(Unqual!(typeof(input)), BacktrackingMatcher!false)(input, regex(re)); + } + + public auto bmatch(R, RegEx)(R input, RegEx re) + if(isSomeString!R && is(RegEx == StaticRegex!(BasicElementOf!R))) + { +- return RegexMatch!(Unqual!(typeof(input)),BacktrackingMatcher!true)(re, input); ++ return RegexMatch!(Unqual!(typeof(input)),BacktrackingMatcher!true)(input, re); ++} ++ ++ ++enum isReplaceFunctor(alias fun, R) = ++ __traits(compiles, (Captures!R c) { fun(c); }); ++ ++// the lowest level - just stuff replacements into the sink ++private @trusted void replaceCapturesInto(alias output, Sink, R, T) ++ (ref Sink sink, R input, T captures) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R) ++{ ++ sink.put(captures.pre); ++ // a hack to get around bogus errors, should be simply output(captures, sink) ++ // "is a nested function and cannot be accessed from" ++ static if(isReplaceFunctor!(output, R)) ++ sink.put(output(captures)); //"mutator" type of function ++ else ++ output(captures, sink); //"output" type of function ++ sink.put(captures.post); ++} ++ ++// ditto for a range of captures ++private void replaceMatchesInto(alias output, Sink, R, T) ++ (ref Sink sink, R input, T matches) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R) ++{ ++ size_t offset = 0; ++ foreach(cap; matches) ++ { ++ sink.put(cap.pre[offset .. $]); ++ // same hack, see replaceCapturesInto ++ static if(isReplaceFunctor!(output, R)) ++ sink.put(output(cap)); //"mutator" type of function ++ else ++ output(cap, sink); //"output" type of function ++ offset = cap.pre.length + cap.hit.length; ++ } ++ sink.put(input[offset .. $]); ++} ++ ++// a general skeleton of replaceFirst ++private R replaceFirstWith(alias output, R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ auto data = matchFirst(input, re); ++ if(data.empty) ++ return input; ++ auto app = appender!(R)(); ++ replaceCapturesInto!output(app, input, data); ++ return app.data; ++} ++ ++// ditto for replaceAll ++// the method parameter allows old API to ride on the back of the new one ++private R replaceAllWith(alias output, ++ alias method=matchAll, R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ auto matches = method(input, re); //inout(C)[] fails ++ if(matches.empty) ++ return input; ++ auto app = appender!(R)(); ++ replaceMatchesInto!output(app, input, matches); ++ return app.data; + } + + /++ +- Construct a new string from $(D input) by replacing each match with +- a string generated from match according to $(D format) specifier. ++ Construct a new string from $(D input) by replacing the first match with ++ a string generated from it according to the $(D format) specifier. + +- To replace all occurrences use regex with "g" flag, otherwise +- only the first occurrence gets replaced. ++ To replace all matches use $(LREF replaceAll). + + Params: + input = string to search + re = compiled regular expression to use +- format = format string to generate replacements from ++ format = format string to generate replacements from, ++ see $(S_LINK Replace format string). ++ ++ Returns: ++ A string of the same type with the first match (if any) replaced. ++ If no match is found returns the input string itself. + + Example: + --- +- // Comify a number +- auto com = regex(r"(?<=\d)(?=(\d\d\d)+\b)","g"); +- assert(replace("12000 + 42100 = 54100", com, ",") == "12,000 + 42,100 = 54,100"); ++ assert(replaceFirst("noon", regex("n"), "[$&]") == "[n]oon"); + --- +++/ ++public R replaceFirst(R, C, RegEx)(R input, RegEx re, const(C)[] format) ++ if(isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R)) ++{ ++ return replaceFirstWith!((m, sink) => replaceFmt(format, m, sink))(input, re); ++} + +- The format string can reference parts of match using the following notation. +- $(REG_TABLE +- $(REG_TITLE Format specifier, Replaced by ) +- $(REG_ROW $&, the whole match. ) +- $(REG_ROW $`, part of input $(I preceding) the match. ) +- $(REG_ROW $', part of input $(I following) the match. ) +- $(REG_ROW $$, '$' character. ) +- $(REG_ROW \c , where c is any character, the character c itself. ) +- $(REG_ROW \\, '\' character. ) +- $(REG_ROW $1 .. $99, submatch number 1 to 99 respectively. ) +- ) ++/++ ++ This is a general replacement tool that construct a new string by replacing ++ matches of pattern $(D re) in the $(D input). Unlike the other overload ++ there is no format string instead captures are passed to ++ to a user-defined functor $(D fun) that returns a new string ++ to use as replacement. ++ ++ This version replaces the first match in $(D input), ++ see $(LREF replaceAll) to replace the all of the matches. ++ ++ Returns: ++ A new string of the same type as $(D input) with all matches ++ replaced by return values of $(D fun). If no matches found ++ returns the $(D input) itself. ++ ++ Example: + --- +- assert(replace("noon", regex("^n"), "[$&]") == "[n]oon"); ++ string list = "#21 out of 46"; ++ string newList = replaceFirst!(cap => to!string(to!int(cap.hit)+1)) ++ (list, regex(`[0-9]+`)); ++ assert(newList == "#22 out of 46"); + --- + +/ +-public @trusted R replace(alias scheme=match, R, RegEx)(R input, RegEx re, R format) ++public R replaceFirst(alias fun, R, RegEx)(R input, RegEx re) + if(isSomeString!R && isRegexFor!(RegEx, R)) + { +- auto app = appender!(R)(); +- auto matches = scheme(input, re); +- size_t offset = 0; +- foreach(ref m; matches) ++ return replaceFirstWith!((m, sink) => sink.put(fun(m)))(input, re); ++} ++ ++/++ ++ A variation on $(LREF replaceFirst) that instead of allocating a new string ++ on each call outputs the result piece-wise to the $(D sink). In particular ++ this enables efficient construction of a final output incrementally. ++ ++ Like in $(LREF replaceFirst) family of functions there is an overload ++ for the substitution guided by the $(D format) string ++ and the one with the user defined callback. ++ ++ Example: ++ --- ++ import std.array; ++ string m1 = "first message\n"; ++ string m2 = "second message\n"; ++ auto result = appender!string(); ++ replaceFirstInto(result, m1, regex(`([a-z]+) message`), "$1"); ++ //equivalent of the above with user-defined callback ++ replaceFirstInto!(cap=>cap[1])(result, m2, regex(`([a-z]+) message`)); ++ assert(result.data == "first\nsecond\n"); ++ --- +++/ ++public @trusted void replaceFirstInto(Sink, R, C, RegEx) ++ (ref Sink sink, R input, RegEx re, const(C)[] format) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R ++ && is(C : dchar) && isRegexFor!(RegEx, R)) + { +- app.put(m.pre[offset .. $]); +- replaceFmt(format, m.captures, app); +- offset = m.pre.length + m.hit.length; ++ replaceCapturesInto!((m, sink) => replaceFmt(format, m, sink)) ++ (sink, input, matchFirst(input, re)); + } +- app.put(input[offset .. $]); +- return app.data; ++ ++///ditto ++public @trusted void replaceFirstInto(alias fun, Sink, R, RegEx) ++ (Sink sink, R input, RegEx re) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ replaceCapturesInto!fun(sink, input, matchFirst(input, re)); ++} ++ ++//examples for replaceFirst ++@system unittest ++{ ++ string list = "#21 out of 46"; ++ string newList = replaceFirst!(cap => to!string(to!int(cap.hit)+1)) ++ (list, regex(`[0-9]+`)); ++ assert(newList == "#22 out of 46"); ++ import std.array; ++ string m1 = "first message\n"; ++ string m2 = "second message\n"; ++ auto result = appender!string(); ++ replaceFirstInto(result, m1, regex(`([a-z]+) message`), "$1"); ++ //equivalent of the above with user-defined callback ++ replaceFirstInto!(cap=>cap[1])(result, m2, regex(`([a-z]+) message`)); ++ assert(result.data == "first\nsecond\n"); + } + + /++ +- Search string for matches using regular expression pattern $(D re) +- and pass captures for each match to user-defined functor $(D fun). ++ Construct a new string from $(D input) by replacing all of the ++ fragments that match a pattern $(D re) with a string generated ++ from the match according to the $(D format) specifier. ++ ++ To replace only the first match use $(LREF replaceFirst). ++ ++ Params: ++ input = string to search ++ re = compiled regular expression to use ++ format = format string to generate replacements from, ++ see $(S_LINK Replace format string). + +- To replace all occurrances use regex with "g" flag, otherwise +- only first occurrence gets replaced. ++ Returns: ++ A string of the same type as $(D input) with the all ++ of the matches (if any) replaced. ++ If no match is found returns the input string itself. ++ ++ Example: ++ --- ++ // Comify a number ++ auto com = regex(r"(?<=\d)(?=(\d\d\d)+\b)","g"); ++ assert(replaceAll("12000 + 42100 = 54100", com, ",") == "12,000 + 42,100 = 54,100"); ++ --- +++/ ++public @trusted R replaceAll(R, C, RegEx)(R input, RegEx re, const(C)[] format) ++ if(isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R)) ++{ ++ return replaceAllWith!((m, sink) => replaceFmt(format, m, sink))(input, re); ++} + +- Returns: new string with all matches replaced by return values of $(D fun). ++/++ ++ This is a general replacement tool that construct a new string by replacing ++ matches of pattern $(D re) in the $(D input). Unlike the other overload ++ there is no format string instead captures are passed to ++ to a user-defined functor $(D fun) that returns a new string ++ to use as replacement. ++ ++ This version replaces all of the matches found in $(D input), ++ see $(LREF replaceFirst) to replace the first match only. ++ ++ Returns: ++ A new string of the same type as $(D input) with all matches ++ replaced by return values of $(D fun). If no matches found ++ returns the $(D input) itself. + + Params: +- s = string to search ++ input = string to search + re = compiled regular expression + fun = delegate to use + +@@ -6655,30 +6277,132 @@ public @trusted R replace(alias scheme=m + { + return std.string.toUpper(m.hit); + } +- auto s = replace!(baz)("Strap a rocket engine on a chicken.", +- regex("[ar]", "g")); ++ auto s = replaceAll!(baz)("Strap a rocket engine on a chicken.", ++ regex("[ar]")); + assert(s == "StRAp A Rocket engine on A chicken."); + --- + +/ +-public @trusted R replace(alias fun, R, RegEx, alias scheme=match)(R input, RegEx re) ++public @trusted R replaceAll(alias fun, R, RegEx)(R input, RegEx re) + if(isSomeString!R && isRegexFor!(RegEx, R)) + { +- auto app = appender!(R)(); +- auto matches = scheme(input, re); +- size_t offset = 0; +- foreach(m; matches) ++ return replaceAllWith!((m, sink) => sink.put(fun(m)))(input, re); ++} ++ ++/++ ++ A variation on $(LREF replaceAll) that instead of allocating a new string ++ on each call outputs the result piece-wise to the $(D sink). In particular ++ this enables efficient construction of a final output incrementally. ++ ++ As with $(LREF replaceAll) there are 2 overloads - one with a format string, ++ the other one with a user defined functor. ++ ++ Example: ++ --- ++ //swap all 3 letter words and bring it back ++ string text = "How are you doing?"; ++ auto sink = appender!(char[])(); ++ replaceAllInto!(cap => retro(cap[0]))(sink, text, regex(`\b\w{3}\b`)); ++ auto swapped = sink.data.dup; // make a copy explicitly ++ assert(swapped == "woH era uoy doing?"); ++ sink.clear(); ++ replaceAllInto!(cap => retro(cap[0]))(sink, swapped, regex(`\b\w{3}\b`)); ++ assert(sink.data == text); ++ --- +++/ ++public @trusted void replaceAllInto(Sink, R, C, RegEx) ++ (Sink sink, R input, RegEx re, const(C)[] format) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R ++ && is(C : dchar) && isRegexFor!(RegEx, R)) + { +- app.put(m.pre[offset .. $]); +- app.put(fun(m)); +- offset = m.pre.length + m.hit.length; ++ replaceMatchesInto!((m, sink) => replaceFmt(format, m, sink)) ++ (sink, input, matchAll(input, re)); + } +- app.put(input[offset .. $]); +- return app.data; ++ ++///ditto ++public @trusted void replaceAllInto(alias fun, Sink, R, RegEx) ++ (Sink sink, R input, RegEx re) ++ if(isOutputRange!(Sink, dchar) && isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ replaceMatchesInto!fun(sink, input, matchAll(input, re)); ++} ++ ++// a bit of examples ++@system unittest ++{ ++ //swap all 3 letter words and bring it back ++ string text = "How are you doing?"; ++ auto sink = appender!(char[])(); ++ replaceAllInto!(cap => retro(cap[0]))(sink, text, regex(`\b\w{3}\b`)); ++ auto swapped = sink.data.dup; // make a copy explicitly ++ assert(swapped == "woH era uoy doing?"); ++ sink.clear(); ++ replaceAllInto!(cap => retro(cap[0]))(sink, swapped, regex(`\b\w{3}\b`)); ++ assert(sink.data == text); ++} ++ ++// exercise all of the replace APIs ++@system unittest ++{ ++ // try and check first/all simple substitution ++ foreach(S; TypeTuple!(string, wstring, dstring, char[], wchar[], dchar[])) ++ { ++ S s1 = "curt trial".to!S(); ++ S s2 = "round dome".to!S(); ++ S t1F = "court trial".to!S(); ++ S t2F = "hound dome".to!S(); ++ S t1A = "court trial".to!S(); ++ S t2A = "hound home".to!S(); ++ auto re1 = regex("curt".to!S()); ++ auto re2 = regex("[dr]o".to!S()); ++ ++ assert(replaceFirst(s1, re1, "court") == t1F); ++ assert(replaceFirst(s2, re2, "ho") == t2F); ++ assert(replaceAll(s1, re1, "court") == t1A); ++ assert(replaceAll(s2, re2, "ho") == t2A); ++ ++ auto rep1 = replaceFirst!(cap => cap[0][0]~"o".to!S()~cap[0][1..$])(s1, re1); ++ assert(rep1 == t1F); ++ assert(replaceFirst!(cap => "ho".to!S())(s2, re2) == t2F); ++ auto rep1A = replaceAll!(cap => cap[0][0]~"o".to!S()~cap[0][1..$])(s1, re1); ++ assert(rep1A == t1A); ++ assert(replaceAll!(cap => "ho".to!S())(s2, re2) == t2A); ++ ++ auto sink = appender!S(); ++ replaceFirstInto(sink, s1, re1, "court"); ++ assert(sink.data == t1F); ++ replaceFirstInto(sink, s2, re2, "ho"); ++ assert(sink.data == t1F~t2F); ++ replaceAllInto(sink, s1, re1, "court"); ++ assert(sink.data == t1F~t2F~t1A); ++ replaceAllInto(sink, s2, re2, "ho"); ++ assert(sink.data == t1F~t2F~t1A~t2A); ++ } ++} ++ ++/++ ++ Old API for replacement, operation depends on flags of pattern $(D re). ++ With "g" flag it performs the equivalent of $(LREF replaceAll) otherwise it ++ works the same as $(LREF replaceFirst). ++ ++ The use of this function is $(RED discouraged), please use $(LREF replaceAll) ++ or $(LREF replaceFirst) explicitly. +++/ ++public R replace(alias scheme = match, R, C, RegEx)(R input, RegEx re, const(C)[] format) ++ if(isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ return replaceAllWith!((m, sink) => replaceFmt(format, m, sink), match)(input, re); ++} ++ ++///ditto ++public R replace(alias fun, R, RegEx)(R input, RegEx re) ++ if(isSomeString!R && isRegexFor!(RegEx, R)) ++{ ++ return replaceAllWith!(fun, match)(input, re); + } + +-//produce replacement string from format using captures for substitue +-public @trusted void replaceFmt(R, Capt, OutR) +- (R format, Capt captures, OutR sink, bool ignoreBadSubs=false) ++//produce replacement string from format using captures for substitution ++private void replaceFmt(R, Capt, OutR) ++ (R format, Capt captures, OutR sink, bool ignoreBadSubs = false) + if(isOutputRange!(OutR, ElementEncodingType!R[]) && + isOutputRange!(OutR, ElementEncodingType!(Capt.String)[])) + { +@@ -6713,7 +6437,7 @@ L_Replace_Loop: + } + else if(format[0] == '{') + { +- auto x = find!"!std.ascii.isAlpha(a)"(format[1..$]); ++ auto x = find!(a => !ascii.isAlpha(a))(format[1..$]); + enforce(!x.empty && x[0] == '}', "no matching '}' in replacement format"); + auto name = format[1 .. $ - x.length]; + format = x[1..$]; +@@ -6757,7 +6481,7 @@ assert(equal(splitter(s1, regex(", *")), + ["", "abc", "de", "fg", "hi", ""])); + ---- + +/ +-public struct Splitter(Range, alias RegEx=Regex) ++public struct Splitter(Range, alias RegEx = Regex) + if(isSomeString!Range && isRegexFor!(RegEx, Range)) + { + private: +@@ -6777,7 +6501,7 @@ private: + } + else + { +- _match = Rx(separator, _input); ++ _match = Rx(_input, separator); + } + } + +@@ -6915,6 +6639,7 @@ unittest + } + + enum TestVectors tv[] = [ ++ TestVectors( "a\\b", "a", "y", "$&", "a" ), + TestVectors( "(a)b\\1", "abaab","y", "$&", "aba" ), + TestVectors( "()b\\1", "aaab", "y", "$&", "b" ), + TestVectors( "abc", "abc", "y", "$&", "abc" ), +@@ -7203,7 +6928,7 @@ unittest + foreach(a, tvd; tv) + { + uint c = tvd.result[0]; +- debug(fred_test) writeln(" Test #", a, " pattern: ", tvd.pattern, " with Char = ", Char.stringof); ++ debug(std_regex_test) writeln(" Test #", a, " pattern: ", tvd.pattern, " with Char = ", Char.stringof); + try + { + i = 1; +@@ -7212,7 +6937,7 @@ unittest + catch (RegexException e) + { + i = 0; +- debug(fred_test) writeln(e.msg); ++ debug(std_regex_test) writeln(e.msg); + } + + assert((c == 'c') ? !i : i, "failed to compile pattern "~tvd.pattern); +@@ -7225,423 +6950,474 @@ unittest + if(c == 'y') + { + auto result = produceExpected(m, to!(String)(tvd.format)); +- assert(result == to!String(tvd.replace), text(matchFn.stringof ~": mismatch pattern #", a, ": ", tvd.pattern," expected: ", ++ assert(result == to!String(tvd.replace), ++ text(matchFn.stringof ~": mismatch pattern #", a, ": ", tvd.pattern," expected: ", + tvd.replace, " vs ", result)); + } + } + } + } +- debug(fred_test) writeln("!!! FReD bulk test done "~matchFn.stringof~" !!!"); ++ debug(std_regex_test) writeln("!!! FReD bulk test done "~matchFn.stringof~" !!!"); + } +- static string generate(uint n,uint[] black_list...) ++ ++ ++ void ct_tests() + { +- string s = "TypeTuple!("; +- for(uint i=0; i"); ++ assert(bmatch("texttext", greed).hit ++ == "text"); ++ auto cr8 = ctRegex!("^(a)(b)?(c*)"); ++ auto m8 = bmatch("abcc",cr8); ++ assert(m8); ++ assert(m8.captures[1] == "a"); ++ assert(m8.captures[2] == "b"); ++ assert(m8.captures[3] == "cc"); ++ auto cr9 = ctRegex!("q(a|b)*q"); ++ auto m9 = match("xxqababqyy",cr9); ++ assert(m9); ++ assert(equal(bmatch("xxqababqyy",cr9).captures, ["qababq", "b"])); ++ ++ auto rtr = regex("a|b|c"); ++ enum ctr = regex("a|b|c"); ++ assert(equal(rtr.ir,ctr.ir)); ++ //CTFE parser BUG is triggered by group ++ //in the middle of alternation (at least not first and not last) ++ enum testCT = regex(`abc|(edf)|xyz`); ++ auto testRT = regex(`abc|(edf)|xyz`); ++ assert(equal(testCT.ir,testRT.ir)); ++} ++ ++unittest ++{ ++ enum cx = ctRegex!"(A|B|C)"; ++ auto mx = match("B",cx); ++ assert(mx); ++ assert(equal(mx.captures, [ "B", "B"])); ++ enum cx2 = ctRegex!"(A|B)*"; ++ assert(match("BAAA",cx2)); ++ enum cx3 = ctRegex!("a{3,4}","i"); ++ auto mx3 = match("AaA",cx3); ++ assert(mx3); ++ assert(mx3.captures[0] == "AaA"); ++ enum cx4 = ctRegex!(`^a{3,4}?[a-zA-Z0-9~]{1,2}`,"i"); ++ auto mx4 = match("aaaabc", cx4); ++ assert(mx4); ++ assert(mx4.captures[0] == "aaaab"); ++ auto cr8 = ctRegex!("(a)(b)?(c*)"); ++ auto m8 = bmatch("abcc",cr8); ++ assert(m8); ++ assert(m8.captures[1] == "a"); ++ assert(m8.captures[2] == "b"); ++ assert(m8.captures[3] == "cc"); ++ auto cr9 = ctRegex!(".*$", "gm"); ++ auto m9 = match("First\rSecond", cr9); ++ assert(m9); ++ assert(equal(map!"a.hit"(m9), ["First", "", "Second"])); ++} ++ ++unittest ++{ ++//global matching ++ void test_body(alias matchFn)() ++ { ++ string s = "a quick brown fox jumps over a lazy dog"; ++ auto r1 = regex("\\b[a-z]+\\b","g"); ++ string[] test; ++ foreach(m; matchFn(s, r1)) ++ test ~= m.hit; ++ assert(equal(test, [ "a", "quick", "brown", "fox", "jumps", "over", "a", "lazy", "dog"])); ++ auto free_reg = regex(` ++ ++ abc ++ \s+ ++ " ++ ( ++ [^"]+ ++ | \\ " ++ )+ ++ " ++ z ++ `, "x"); ++ auto m = match(`abc "quoted string with \" inside"z`,free_reg); ++ assert(m); ++ string mails = " hey@you.com no@spam.net "; ++ auto rm = regex(`@(?<=\S+@)\S+`,"g"); ++ assert(equal(map!"a[0]"(matchFn(mails, rm)), ["@you.com", "@spam.net"])); ++ auto m2 = matchFn("First line\nSecond line",regex(".*$","gm")); ++ assert(equal(map!"a[0]"(m2), ["First line", "", "Second line"])); ++ auto m2a = matchFn("First line\nSecond line",regex(".+$","gm")); ++ assert(equal(map!"a[0]"(m2a), ["First line", "Second line"])); ++ auto m2b = matchFn("First line\nSecond line",regex(".+?$","gm")); ++ assert(equal(map!"a[0]"(m2b), ["First line", "Second line"])); ++ debug(std_regex_test) writeln("!!! FReD FLAGS test done "~matchFn.stringof~" !!!"); + } +- //CTFE parsing +- version(fred_ct) +- void ct_tests() ++ test_body!bmatch(); ++ test_body!match(); ++} ++ ++//tests for accumulated std.regex issues and other regressions ++unittest ++{ ++ void test_body(alias matchFn)() + { +- foreach(a, v; mixin(generate(140,38,39,40,52,55,57,62,63,67,80,190,191,192))) +- { +- enum tvd = tv[v]; +- enum r = regex(tvd.pattern, tvd.flags); +- auto nr = regex(tvd.pattern, tvd.flags); ++ //issue 5857 ++ //matching goes out of control if ... in (...){x} has .*/.+ ++ auto c = matchFn("axxxzayyyyyzd",regex("(a.*z){2}d")).captures; ++ assert(c[0] == "axxxzayyyyyzd"); ++ assert(c[1] == "ayyyyyz"); ++ auto c2 = matchFn("axxxayyyyyd",regex("(a.*){2}d")).captures; ++ assert(c2[0] == "axxxayyyyyd"); ++ assert(c2[1] == "ayyyyy"); ++ //issue 2108 ++ //greedy vs non-greedy ++ auto nogreed = regex(""); ++ assert(matchFn("texttext", nogreed).hit ++ == "text"); ++ auto greed = regex(""); ++ assert(matchFn("texttext", greed).hit ++ == "texttext"); ++ //issue 4574 ++ //empty successful match still advances the input ++ string[] pres, posts, hits; ++ foreach(m; matchFn("abcabc", regex("","g"))) { ++ pres ~= m.pre; ++ posts ~= m.post; ++ assert(m.hit.empty); ++ ++ } ++ auto heads = [ ++ "abcabc", ++ "abcab", ++ "abca", ++ "abc", ++ "ab", ++ "a", ++ "" ++ ]; ++ auto tails = [ ++ "abcabc", ++ "bcabc", ++ "cabc", ++ "abc", ++ "bc", ++ "c", ++ "" ++ ]; ++ assert(pres == array(retro(heads))); ++ assert(posts == tails); ++ //issue 6076 ++ //regression on .* ++ auto re = regex("c.*|d"); ++ auto m = matchFn("mm", re); ++ assert(!m); ++ debug(std_regex_test) writeln("!!! FReD REGRESSION test done "~matchFn.stringof~" !!!"); ++ auto rprealloc = regex(`((.){5}.{1,10}){5}`); ++ auto arr = array(repeat('0',100)); ++ auto m2 = matchFn(arr, rprealloc); ++ assert(m2); ++ assert(collectException( ++ regex(r"^(import|file|binary|config)\s+([^\(]+)\(?([^\)]*)\)?\s*$") ++ ) is null); ++ foreach(ch; [Escapables]) ++ { ++ assert(match(to!string(ch),regex(`[\`~ch~`]`))); ++ assert(!match(to!string(ch),regex(`[^\`~ch~`]`))); ++ assert(match(to!string(ch),regex(`[\`~ch~`-\`~ch~`]`))); ++ } ++ //bugzilla 7718 ++ string strcmd = "./myApp.rb -os OSX -path \"/GIT/Ruby Apps/sec\" -conf 'notimer'"; ++ auto reStrCmd = regex (`(".*")|('.*')`, "g"); ++ assert(equal(map!"a[0]"(matchFn(strcmd, reStrCmd)), ++ [`"/GIT/Ruby Apps/sec"`, `'notimer'`])); ++ } ++ test_body!bmatch(); ++ test_body!match(); ++} ++ ++// tests for replace ++unittest ++{ ++ void test(alias matchFn)() ++ { ++ import std.string : toUpper; + +- debug(fred_test) ++ foreach(i, v; TypeTuple!(string, wstring, dstring)) ++ { ++ auto baz(Cap)(Cap m) ++ if (is(Cap == Captures!(Cap.String))) + { +- writeln(" Test #", a, " pattern: ", tvd.pattern); +- if(!equal(r.ir, nr.ir)) +- { +- writeln("C-T version :"); +- r.print(); +- writeln("R-T version :"); +- nr.print(); +- assert(0, text("!C-T regex! failed to compile pattern #", a ,": ", tvd.pattern)); +- } ++ return std.string.toUpper(m.hit); + } +- else +- assert(equal(r.ir, nr.ir), text("!C-T regex! failed to compile pattern #", a ,": ", tvd.pattern)); +- ++ alias v String; ++ assert(std.regex.replace!(matchFn)(to!String("ark rapacity"), regex(to!String("r")), to!String("c")) ++ == to!String("ack rapacity")); ++ assert(std.regex.replace!(matchFn)(to!String("ark rapacity"), regex(to!String("r"), "g"), to!String("c")) ++ == to!String("ack capacity")); ++ assert(std.regex.replace!(matchFn)(to!String("noon"), regex(to!String("^n")), to!String("[$&]")) ++ == to!String("[n]oon")); ++ assert(std.regex.replace!(matchFn)(to!String("test1 test2"), regex(to!String(`\w+`),"g"), to!String("$`:$'")) ++ == to!String(": test2 test1 :")); ++ auto s = std.regex.replace!(baz!(Captures!(String)))(to!String("Strap a rocket engine on a chicken."), ++ regex(to!String("[ar]"), "g")); ++ assert(s == "StRAp A Rocket engine on A chicken."); + } +- debug(fred_test) writeln("!!! FReD C-T test done !!!"); ++ debug(std_regex_test) writeln("!!! Replace test done "~matchFn.stringof~" !!!"); + } ++ test!(bmatch)(); ++ test!(match)(); ++} + +- version(fred_ct) +- ct_tests(); +- else ++// tests for splitter ++unittest ++{ ++ auto s1 = ", abc, de, fg, hi, "; ++ auto sp1 = splitter(s1, regex(", *")); ++ auto w1 = ["", "abc", "de", "fg", "hi", ""]; ++ assert(equal(sp1, w1)); ++ ++ auto s2 = ", abc, de, fg, hi"; ++ auto sp2 = splitter(s2, regex(", *")); ++ auto w2 = ["", "abc", "de", "fg", "hi"]; ++ ++ uint cnt; ++ foreach(e; sp2) { ++ assert(w2[cnt++] == e); ++ } ++ assert(equal(sp2, w2)); ++} ++ ++unittest ++{ ++ char[] s1 = ", abc, de, fg, hi, ".dup; ++ auto sp2 = splitter(s1, regex(", *")); ++} ++ ++unittest ++{ ++ auto s1 = ", abc, de, fg, hi, "; ++ auto w1 = ["", "abc", "de", "fg", "hi", ""]; ++ assert(equal(split(s1, regex(", *")), w1[])); ++} ++ ++unittest ++{ // bugzilla 7141 ++ string pattern = `[a\--b]`; ++ assert(match("-", pattern)); ++ assert(match("b", pattern)); ++ string pattern2 = `[&-z]`; ++ assert(match("b", pattern2)); ++} ++unittest ++{//bugzilla 7111 ++ assert(match("", regex("^"))); ++} ++unittest ++{//bugzilla 7300 ++ assert(!match("a"d, "aa"d)); ++} ++ ++unittest ++{//bugzilla 7674 ++ assert("1234".replace(regex("^"), "$$") == "$1234"); ++ assert("hello?".replace(regex(r"\?", "g"), r"\?") == r"hello\?"); ++ assert("hello?".replace(regex(r"\?", "g"), r"\\?") != r"hello\?"); ++} ++unittest ++{// bugzilla 7679 ++ foreach(S; TypeTuple!(string, wstring, dstring)) + { +- run_tests!bmatch(); //backtracker +- run_tests!match(); //thompson VM ++ enum re = ctRegex!(to!S(r"\.")); ++ auto str = to!S("a.b"); ++ assert(equal(std.regex.splitter(str, re), [to!S("a"), to!S("b")])); ++ assert(split(str, re) == [to!S("a"), to!S("b")]); + } + } ++unittest ++{//bugzilla 8203 ++ string data = " ++ NAME = XPAW01_STA:STATION ++ NAME = XPAW01_STA ++ "; ++ auto uniFileOld = data; ++ auto r = regex( ++ r"^NAME = (?P[a-zA-Z0-9_]+):*(?P[a-zA-Z0-9_]*)","gm"); ++ auto uniCapturesNew = match(uniFileOld, r); ++ for(int i = 0; i < 20; i++) ++ foreach (matchNew; uniCapturesNew) {} ++} ++unittest ++{// bugzilla 8637 purity of enforce ++ auto m = match("hello world", regex("world")); ++ enforce(m); ++} ++ ++// bugzilla 8725 ++unittest ++{ ++ static italic = regex( r"\* ++ (?!\s+) ++ (.*?) ++ (?!\s+) ++ \*", "gx" ); ++ string input = "this * is* interesting, *very* interesting"; ++ assert(replace(input, italic, "$1") == ++ "this * is* interesting, very interesting"); ++} ++ ++// bugzilla 8349 ++unittest ++{ ++ enum peakRegexStr = r"\>(wgEncode.*Tfbs.*\.(?:narrow)|(?:broad)Peak.gz)"; ++ enum peakRegex = ctRegex!(peakRegexStr); ++ //note that the regex pattern itself is probably bogus ++ assert(match(r"\>wgEncode-blah-Tfbs.narrow", peakRegex)); ++} ++ ++// bugzilla 9211 ++unittest ++{ ++ auto rx_1 = regex(r"^(\w)*(\d)"); ++ auto m = match("1234", rx_1); ++ assert(equal(m.front, ["1234", "3", "4"])); ++ auto rx_2 = regex(r"^([0-9])*(\d)"); ++ auto m2 = match("1234", rx_2); ++ assert(equal(m2.front, ["1234", "3", "4"])); ++} ++ ++// bugzilla 9280 ++unittest ++{ ++ string tomatch = "a!b@c"; ++ static r = regex(r"^(?P.*?)!(?P.*?)@(?P.*?)$"); ++ auto nm = match(tomatch, r); ++ assert(nm); ++ auto c = nm.captures; ++ assert(c[1] == "a"); ++ assert(c["nick"] == "a"); ++} ++ ++ ++// bugzilla 9579 ++unittest ++{ ++ char[] input = ['a', 'b', 'c']; ++ string format = "($1)"; ++ // used to give a compile error: ++ auto re = regex(`(a)`, "g"); ++ auto r = replace(input, re, format); ++ assert(r == "(a)bc"); ++} ++ ++// bugzilla 9634 ++unittest ++{ ++ auto re = ctRegex!"(?:a+)"; ++ assert(match("aaaa", re).hit == "aaaa"); ++} + +-version(fred_ct) ++// bugzilla 10913 ++unittest + { +- unittest ++ @system static string foo(const(char)[] s) ++ { ++ return s.dup; ++ } ++ @safe static string bar(const(char)[] s) + { +- auto cr = ctRegex!("abc"); +- assert(bmatch("abc",cr).hit == "abc"); +- auto cr2 = ctRegex!("ab*c"); +- assert(bmatch("abbbbc",cr2).hit == "abbbbc"); +- auto cr3 = ctRegex!("^abc$"); +- assert(bmatch("abc",cr3).hit == "abc"); +- auto cr4 = ctRegex!(`\b(a\B[a-z]b)\b`); +- assert(array(match("azb",cr4).captures) == ["azb", "azb"]); +- auto cr5 = ctRegex!("(?:a{2,4}b{1,3}){1,2}"); +- assert(bmatch("aaabaaaabbb", cr5).hit == "aaabaaaabbb"); +- auto cr6 = ctRegex!("(?:a{2,4}b{1,3}){1,2}?"w); +- assert(bmatch("aaabaaaabbb"w, cr6).hit == "aaab"w); +- auto cr7 = ctRegex!(`\r.*?$`,"m"); +- assert(bmatch("abc\r\nxy", cr7).hit == "\r\nxy"); +- auto greed = ctRegex!(""); +- assert(bmatch("texttext", greed).hit +- == "text"); +- auto cr8 = ctRegex!("^(a)(b)?(c*)"); +- auto m8 = bmatch("abcc",cr8); +- assert(m8); +- assert(m8.captures[1] == "a"); +- assert(m8.captures[2] == "b"); +- assert(m8.captures[3] == "cc"); +- auto cr9 = ctRegex!("q(a|b)*q"); +- auto m9 = match("xxqababqyy",cr9); +- assert(m9); +- assert(equal(bmatch("xxqababqyy",cr9).captures, ["qababq", "b"])); +- +- auto rtr = regex("a|b|c"); +- enum ctr = regex("a|b|c"); +- assert(equal(rtr.ir,ctr.ir)); +- //CTFE parser BUG is triggered by group +- //in the middle of alternation (at least not first and not last) +- version(fred_bug) +- { +- enum testCT = regex(`abc|(edf)|xyz`); +- auto testRT = regex(`abc|(edf)|xyz`); +- debug +- { +- writeln("C-T version :"); +- testCT.print(); +- writeln("R-T version :"); +- testRT.print(); +- +- } +- +- } +- +- } +- +- unittest +- { +- enum cx = ctRegex!"(A|B|C)"; +- auto mx = match("B",cx); +- assert(mx); +- assert(equal(mx.captures, [ "B", "B"])); +- enum cx2 = ctRegex!"(A|B)*"; +- assert(match("BAAA",cx2)); +- enum cx3 = ctRegex!("a{3,4}","i"); +- auto mx3 = match("AaA",cx3); +- assert(mx3); +- assert(mx3.captures[0] == "AaA"); +- enum cx4 = ctRegex!(`^a{3,4}?[a-zA-Z0-9~]{1,2}`,"i"); +- auto mx4 = match("aaaabc", cx4); +- assert(mx4); +- assert(mx4.captures[0] == "aaaab"); +- auto cr8 = ctRegex!("(a)(b)?(c*)"); +- auto m8 = bmatch("abcc",cr8); +- assert(m8); +- assert(m8.captures[1] == "a"); +- assert(m8.captures[2] == "b"); +- assert(m8.captures[3] == "cc"); +- auto cr9 = ctRegex!(".*$", "gm"); +- auto m9 = match("First\rSecond"); +- assert(m9); +- assert(equal(map!"a.hit"(m9.captures), ["First", "", "Second"])); +- } +-} +-else +-{ +- unittest +- { +- //global matching +- void test_body(alias matchFn)() +- { +- string s = "a quick brown fox jumps over a lazy dog"; +- auto r1 = regex("\\b[a-z]+\\b","g"); +- string[] test; +- foreach(m; matchFn(s, r1)) +- test ~= m.hit; +- assert(equal(test, [ "a", "quick", "brown", "fox", "jumps", "over", "a", "lazy", "dog"])); +- auto free_reg = regex(` +- +- abc +- \s+ +- " +- ( +- [^"]+ +- | \\ " +- )+ +- " +- z +- `, "x"); +- auto m = match(`abc "quoted string with \" inside"z`,free_reg); +- assert(m); +- string mails = " hey@you.com no@spam.net "; +- auto rm = regex(`@(?<=\S+@)\S+`,"g"); +- assert(equal(map!"a[0]"(matchFn(mails, rm)), ["@you.com", "@spam.net"])); +- auto m2 = matchFn("First line\nSecond line",regex(".*$","gm")); +- assert(equal(map!"a[0]"(m2), ["First line", "", "Second line"])); +- auto m2a = matchFn("First line\nSecond line",regex(".+$","gm")); +- assert(equal(map!"a[0]"(m2a), ["First line", "Second line"])); +- auto m2b = matchFn("First line\nSecond line",regex(".+?$","gm")); +- assert(equal(map!"a[0]"(m2b), ["First line", "Second line"])); +- debug(fred_test) writeln("!!! FReD FLAGS test done "~matchFn.stringof~" !!!"); +- } +- test_body!bmatch(); +- test_body!match(); +- } +- +- //tests for accomulated std.regex issues and other regressions +- unittest +- { +- void test_body(alias matchFn)() +- { +- //issue 5857 +- //matching goes out of control if ... in (...){x} has .*/.+ +- auto c = matchFn("axxxzayyyyyzd",regex("(a.*z){2}d")).captures; +- assert(c[0] == "axxxzayyyyyzd"); +- assert(c[1] == "ayyyyyz"); +- auto c2 = matchFn("axxxayyyyyd",regex("(a.*){2}d")).captures; +- assert(c2[0] == "axxxayyyyyd"); +- assert(c2[1] == "ayyyyy"); +- //issue 2108 +- //greedy vs non-greedy +- auto nogreed = regex(""); +- assert(matchFn("texttext", nogreed).hit +- == "text"); +- auto greed = regex(""); +- assert(matchFn("texttext", greed).hit +- == "texttext"); +- //issue 4574 +- //empty successful match still advances the input +- string[] pres, posts, hits; +- foreach(m; matchFn("abcabc", regex("","g"))) { +- pres ~= m.pre; +- posts ~= m.post; +- assert(m.hit.empty); +- +- } +- auto heads = [ +- "abcabc", +- "abcab", +- "abca", +- "abc", +- "ab", +- "a", +- "" +- ]; +- auto tails = [ +- "abcabc", +- "bcabc", +- "cabc", +- "abc", +- "bc", +- "c", +- "" +- ]; +- assert(pres == array(retro(heads))); +- assert(posts == tails); +- //issue 6076 +- //regression on .* +- auto re = regex("c.*|d"); +- auto m = matchFn("mm", re); +- assert(!m); +- debug(fred_test) writeln("!!! FReD REGRESSION test done "~matchFn.stringof~" !!!"); +- auto rprealloc = regex(`((.){5}.{1,10}){5}`); +- auto arr = array(repeat('0',100)); +- auto m2 = matchFn(arr, rprealloc); +- assert(m2); +- assert(collectException( +- regex(r"^(import|file|binary|config)\s+([^\(]+)\(?([^\)]*)\)?\s*$") +- ) is null); +- foreach(ch; ['^','$','.','|','?',',','-',';',':' +- ,'#','&','%','/','<','>','`' +- ,'*','+','(',')','{','}']) +- { +- assert(match(to!string(ch),regex(`[\`~ch~`]`))); +- assert(!match(to!string(ch),regex(`[^\`~ch~`]`))); +- if(ch != '-') //'--' is an operator +- assert(match(to!string(ch),regex(`[\`~ch~`-\`~ch~`]`))); +- } +- //bugzilla 7718 +- string strcmd = "./myApp.rb -os OSX -path \"/GIT/Ruby Apps/sec\" -conf 'notimer'"; +- auto reStrCmd = regex (`(".*")|('.*')`, "g"); +- assert(equal(map!"a[0]"(matchFn(strcmd, reStrCmd)), +- [`"/GIT/Ruby Apps/sec"`, `'notimer'`])); +- } +- test_body!bmatch(); +- test_body!match(); +- } +- +- // tests for replace +- unittest +- { +- void test(alias matchFn)() +- { +- foreach(i, v; TypeTuple!(string, wstring, dstring)) +- { +- auto baz(Cap)(Cap m) +- if (is(Cap==Captures!(Cap.String))) +- { +- return std.string.toUpper(m.hit); +- } +- alias v String; +- assert(std.regex.replace!(matchFn)(to!String("ark rapacity"), regex(to!String("r")), to!String("c")) +- == to!String("ack rapacity")); +- assert(std.regex.replace!(matchFn)(to!String("ark rapacity"), regex(to!String("r"), "g"), to!String("c")) +- == to!String("ack capacity")); +- assert(std.regex.replace!(matchFn)(to!String("noon"), regex(to!String("^n")), to!String("[$&]")) +- == to!String("[n]oon")); +- assert(std.regex.replace!(matchFn)(to!String("test1 test2"), regex(to!String(`\w+`),"g"), to!String("$`:$'")) +- == to!String(": test2 test1 :")); +- auto s = std.regex.replace!(baz!(Captures!(String)))(to!String("Strap a rocket engine on a chicken."), +- regex(to!String("[ar]"), "g")); +- assert(s == "StRAp A Rocket engine on A chicken."); +- } +- debug(fred_test) writeln("!!! Replace test done "~matchFn.stringof~" !!!"); +- } +- test!(bmatch)(); +- test!(match)(); +- } +- +- // tests for splitter +- unittest +- { +- auto s1 = ", abc, de, fg, hi, "; +- auto sp1 = splitter(s1, regex(", *")); +- auto w1 = ["", "abc", "de", "fg", "hi", ""]; +- assert(equal(sp1, w1)); +- +- auto s2 = ", abc, de, fg, hi"; +- auto sp2 = splitter(s2, regex(", *")); +- auto w2 = ["", "abc", "de", "fg", "hi"]; +- +- uint cnt; +- foreach(e; sp2) { +- assert(w2[cnt++] == e); +- } +- assert(equal(sp2, w2)); +- } +- +- unittest +- { +- char[] s1 = ", abc, de, fg, hi, ".dup; +- auto sp2 = splitter(s1, regex(", *")); +- } +- +- unittest +- { +- auto s1 = ", abc, de, fg, hi, "; +- auto w1 = ["", "abc", "de", "fg", "hi", ""]; +- assert(equal(split(s1, regex(", *")), w1[])); +- } +- +- unittest +- { // bugzilla 7141 +- string pattern = `[a\--b]`; +- assert(match("-", pattern)); +- assert(match("b", pattern)); +- string pattern2 = `[&-z]`; +- assert(match("b", pattern2)); +- } +- unittest +- {//bugzilla 7111 +- assert(match("", regex("^"))); +- } +- unittest +- {//bugzilla 7300 +- assert(!match("a"d, "aa"d)); +- } +- +- unittest +- {//bugzilla 7674 +- assert("1234".replace(regex("^"), "$$") == "$1234"); +- assert("hello?".replace(regex(r"\?", "g"), r"\?") == r"hello\?"); +- assert("hello?".replace(regex(r"\?", "g"), r"\\?") != r"hello\?"); +- } +- unittest +- {// bugzilla 7679 +- foreach(S; TypeTuple!(string, wstring, dstring)) +- { +- enum re = ctRegex!(to!S(r"\.")); +- auto str = to!S("a.b"); +- assert(equal(std.regex.splitter(str, re), [to!S("a"), to!S("b")])); +- assert(split(str, re) == [to!S("a"), to!S("b")]); +- } +- } +- unittest +- {//bugzilla 8203 +- string data = " +- NAME = XPAW01_STA:STATION +- NAME = XPAW01_STA +- "; +- auto uniFileOld = data; +- auto r = regex( +- r"^NAME = (?P[a-zA-Z0-9_]+):*(?P[a-zA-Z0-9_]*)","gm"); +- auto uniCapturesNew = match(uniFileOld, r); +- for(int i=0; i<20; i++) +- foreach (matchNew; uniCapturesNew) {} +- } +- unittest +- {// bugzilla 8637 purity of enforce +- auto m = match("hello world", regex("world")); +- enforce(m); +- } +- +- // bugzilla 8725 +- unittest +- { +- static italic = regex( r"\* +- (?!\s+) +- (.*?) +- (?!\s+) +- \*", "gx" ); +- string input = "this * is* interesting, *very* interesting"; +- assert(replace(input, italic, "$1") == +- "this * is* interesting, very interesting"); +- } +- +- // bugzilla 8349 +- unittest +- { +- enum peakRegexStr = r"\>(wgEncode.*Tfbs.*\.(?:narrow)|(?:broad)Peak.gz)"; +- enum peakRegex = ctRegex!(peakRegexStr); +- //note that the regex pattern itself is probably bogus +- assert(match(r"\>wgEncode-blah-Tfbs.narrow", peakRegex)); +- } +- +- // bugzilla 9211 +- unittest +- { +- auto rx_1 = regex(r"^(\w)*(\d)"); +- auto m = match("1234", rx_1); +- assert(equal(m.front, ["1234", "3", "4"])); +- auto rx_2 = regex(r"^([0-9])*(\d)"); +- auto m2 = match("1234", rx_2); +- assert(equal(m2.front, ["1234", "3", "4"])); ++ return s.dup; + } ++ () @system { ++ replace!((a) => foo(a.hit))("blah", regex(`a`)); ++ }(); ++ () @safe { ++ replace!((a) => bar(a.hit))("blah", regex(`a`)); ++ }(); ++} ++ ++// bugzilla 11262 ++unittest ++{ ++ enum reg = ctRegex!(r",", "g"); ++ auto str = "This,List"; ++ str = str.replace(reg, "-"); ++ assert(str == "This-List"); + } + + }//version(unittest) +--- a/src/libphobos/src/std/regexp.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/regexp.d 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3434 +0,0 @@ +-// Written in the D programming language. +-// Regular Expressions. +- +-/** +- * $(RED Deprecated. +- * Please use $(LINK2 std_regex.html, std.regex) instead.) +- * +- * $(LINK2 http://www.digitalmars.com/ctg/regular.html, Regular +- * expressions) are a powerful method of string pattern matching. The +- * regular expression language used in this library is the same as +- * that commonly used, however, some of the very advanced forms may +- * behave slightly differently. The standard observed is the $(WEB +- * www.ecma-international.org/publications/standards/Ecma-262.htm, +- * ECMA standard) for regular expressions. +- * +- * std.regexp is designed to work only with valid UTF strings as input. +- * To validate untrusted input, use std.utf.validate(). +- * +- * In the following guide, $(I pattern)[] refers to a +- * $(LINK2 http://www.digitalmars.com/ctg/regular.html, regular expression). +- * The $(I attributes)[] refers to +- * a string controlling the interpretation +- * of the regular expression. +- * It consists of a sequence of one or more +- * of the following characters: +- * +- * +- * +- * $(TR $(TH Attribute) $(TH Action)) +- * +- * $(TD $(B g)) +- * $(TD global; repeat over the whole input string) +- * +- * +- * $(TD $(B i)) +- * $(TD case insensitive) +- * +- * +- * $(TD $(B m)) +- * $(TD treat as multiple lines separated by newlines) +- * +- *
Attribute Characters
+- * +- * The $(I format)[] string has the formatting characters: +- * +- * +- * +- * $(TR $(TH Format) $(TH Replaced With)) +- * $(TR +- * $(TD $(B $$)) $(TD $) +- * ) +- * $(TR +- * $(TD $(B $&)) $(TD The matched substring.) +- * ) +- * $(TR +- * $(TD $(B $`)) $(TD The portion of string that precedes the matched substring.) +- * ) +- * $(TR +- * $(TD $(B $')) $(TD The portion of string that follows the matched substring.) +- * ) +- * $(TR +- * $(TD $(B $(DOLLAR))$(I n)) $(TD The $(I n)th capture, where $(I n) +- * is a single digit 1-9 +- * and $$(I n) is not followed by a decimal digit.) +- * ) +- * $(TR +- * $(TD $(B $(DOLLAR))$(I nn)) $(TD The $(I nn)th capture, where $(I nn) +- * is a two-digit decimal +- * number 01-99. +- * If $(I nn)th capture is undefined or more than the number +- * of parenthesized subexpressions, use the empty +- * string instead.) +- * ) +- *
Formatting Characters
+- * +- * Any other $ are left as is. +- * +- * References: +- * $(LINK2 http://en.wikipedia.org/wiki/Regular_expressions, Wikipedia) +- * Macros: +- * WIKI = StdRegexp +- * DOLLAR = $ +- * +- * Copyright: Copyright Digital Mars 2000 - 2011. +- * License: Boost License 1.0. +- * Authors: $(WEB digitalmars.com, Walter Bright) +- * Source: $(PHOBOSSRC std/_regexp.d) +- */ +-/* Copyright Digital Mars 2000 - 2011. +- * Distributed under the Boost Software License, Version 1.0. +- * (See accompanying file LICENSE_1_0.txt or copy at +- * http://www.boost.org/LICENSE_1_0.txt) +- */ +- +-/* +- Escape sequences: +- +- \nnn starts out a 1, 2 or 3 digit octal sequence, +- where n is an octal digit. If nnn is larger than +- 0377, then the 3rd digit is not part of the sequence +- and is not consumed. +- For maximal portability, use exactly 3 digits. +- +- \xXX starts out a 1 or 2 digit hex sequence. X +- is a hex character. If the first character after the \x +- is not a hex character, the value of the sequence is 'x' +- and the XX are not consumed. +- For maximal portability, use exactly 2 digits. +- +- \uUUUU is a unicode sequence. There are exactly +- 4 hex characters after the \u, if any are not, then +- the value of the sequence is 'u', and the UUUU are not +- consumed. +- +- Character classes: +- +- [a-b], where a is greater than b, will produce +- an error. +- +- References: +- +- http://www.unicode.org/unicode/reports/tr18/ +-*/ +- +-module std.regexp; +- +-pragma(msg, "Notice: As of Phobos 2.055, std.regexp has been deprecated. " ~ +- "Please use std.regex instead."); +- +-//debug = regexp; // uncomment to turn on debugging printf's +- +-private +-{ +- import core.stdc.stdio; +- import core.stdc.stdlib; +- import core.stdc.string; +- import std.algorithm; +- import std.array; +- import std.stdio; +- import std.string; +- import std.ascii; +- import std.outbuffer; +- import std.bitmanip; +- import std.utf; +- import std.algorithm; +- import std.array; +- import std.traits; +-} +- +-deprecated: +- +-/** Regular expression to extract an _email address. +- * References: +- * $(LINK2 http://www.regular-expressions.info/email.html, How to Find or Validate an Email Address)$(BR) +- * $(LINK2 http://tools.ietf.org/html/rfc2822#section-3.4.1, RFC 2822 Internet Message Format) +- */ +-string email = +- r"[a-zA-Z]([.]?([[a-zA-Z0-9_]-]+)*)?@([[a-zA-Z0-9_]\-_]+\.)+[a-zA-Z]{2,6}"; +- +-/** Regular expression to extract a _url */ +-string url = r"(([h|H][t|T]|[f|F])[t|T][p|P]([s|S]?)\:\/\/|~/|/)?([\w]+:\w+@)?(([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?)?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?([,]\w+)*((\?\w+=\w+)?(&\w+=\w+)*([,]\w*)*)?"; +- +-/************************************ +- * One of these gets thrown on compilation errors +- */ +- +-class RegExpException : Exception +-{ +- this(string msg) +- { +- super(msg); +- } +-} +- +-struct regmatch_t +-{ +- ptrdiff_t rm_so; // index of start of match +- ptrdiff_t rm_eo; // index past end of match +-} +- +-private alias char rchar; // so we can make a wchar version +- +-/****************************************************** +- * Search string for matches with regular expression +- * pattern with attributes. +- * Replace each match with string generated from format. +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * format = Replacement string format. +- * attributes = Regular expression attributes. +- * Returns: +- * the resulting string +- * Example: +- * Replace the letters 'a' with the letters 'ZZ'. +- * --- +- * s = "Strap a rocket engine on a chicken." +- * sub(s, "a", "ZZ") // result: StrZZp a rocket engine on a chicken. +- * sub(s, "a", "ZZ", "g") // result: StrZZp ZZ rocket engine on ZZ chicken. +- * --- +- * The replacement format can reference the matches using +- * the $&, $$, $', $`, $0 .. $99 notation: +- * --- +- * sub(s, "[ar]", "[$&]", "g") // result: St[r][a]p [a] [r]ocket engine on [a] chi +- * --- +- */ +- +-string sub(string s, string pattern, string format, string attributes = null) +-{ +- auto r = new RegExp(pattern, attributes); +- auto result = r.replace(s, format); +- delete r; +- return result; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.sub.unittest\n"); +- +- string r = sub("hello", "ll", "ss"); +- assert(r == "hesso"); +-} +- +-/******************************************************* +- * Search string for matches with regular expression +- * pattern with attributes. +- * Pass each match to delegate dg. +- * Replace each match with the return value from dg. +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * dg = Delegate +- * attributes = Regular expression attributes. +- * Returns: the resulting string. +- * Example: +- * Capitalize the letters 'a' and 'r': +- * --- +- * s = "Strap a rocket engine on a chicken."; +- * sub(s, "[ar]", +- * delegate char[] (RegExp m) +- * { +- * return toUpper(m[0]); +- * }, +- * "g"); // result: StRAp A Rocket engine on A chicken. +- * --- +- */ +- +-string sub(string s, string pattern, string delegate(RegExp) dg, string attributes = null) +-{ +- auto r = new RegExp(pattern, attributes); +- +- string result = s; +- size_t lastindex = 0; +- size_t offset = 0; +- +- while (r.test(s, lastindex)) +- { +- auto so = r.pmatch[0].rm_so; +- auto eo = r.pmatch[0].rm_eo; +- +- string replacement = dg(r); +- +- // Optimize by using std.string.replace if possible - Dave Fladebo +- string slice = result[offset + so .. offset + eo]; +- if (r.attributes & RegExp.REA.global && // global, so replace all +- !(r.attributes & RegExp.REA.ignoreCase) && // not ignoring case +- !(r.attributes & RegExp.REA.multiline) && // not multiline +- pattern == slice) // simple pattern (exact match, no special characters) +- { +- debug(regexp) +- printf("result: %.*s, pattern: %.*s, slice: %.*s, replacement: %.*s\n", +- result.length, result.ptr, +- pattern.length, pattern.ptr, +- slice.length, slice.ptr, +- replacement.length, replacement.ptr); +- result = replace(result,slice,replacement); +- break; +- } +- +- result = replaceSlice(result, result[offset + so .. offset + eo], replacement); +- +- if (r.attributes & RegExp.REA.global) +- { +- offset += replacement.length - (eo - so); +- +- if (lastindex == eo) +- lastindex++; // always consume some source +- else +- lastindex = eo; +- } +- else +- break; +- } +- delete r; +- +- return result; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.sub.unittest\n"); +- +- string foo(RegExp r) { return "ss"; } +- +- auto r = sub("hello", "ll", delegate string(RegExp r) { return "ss"; }); +- assert(r == "hesso"); +- +- r = sub("hello", "l", delegate string(RegExp r) { return "l"; }, "g"); +- assert(r == "hello"); +- +- auto s = sub("Strap a rocket engine on a chicken.", +- "[ar]", +- delegate string (RegExp m) +- { +- return std.string.toUpper(m[0]); +- }, +- "g"); +- assert(s == "StRAp A Rocket engine on A chicken."); +-} +- +- +-/************************************************* +- * Search $(D_PARAM s[]) for first match with $(D_PARAM pattern). +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * Returns: +- * index into s[] of match if found, -1 if no match. +- * Example: +- * --- +- * auto s = "abcabcabab"; +- * find(s, RegExp("b")); // match, returns 1 +- * find(s, RegExp("f")); // no match, returns -1 +- * --- +- */ +- +-ptrdiff_t find(string s, RegExp pattern) +-{ +- return pattern.test(s) +- ? pattern.pmatch[0].rm_so +- : -1; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.find.unittest\n"); +- +- auto i = find("xabcy", RegExp("abc")); +- assert(i == 1); +- i = find("cba", RegExp("abc")); +- assert(i == -1); +-} +- +-/** +- Returns: +- +- Same as $(D_PARAM find(s, RegExp(pattern, attributes))). +- +- WARNING: +- +- This function is scheduled for deprecation due to unnecessary +- ambiguity with the homonym function in std.string. Instead of +- $(D_PARAM std.regexp.find(s, p, a)), you may want to use $(D_PARAM +- find(s, RegExp(p, a))). +-*/ +- +-ptrdiff_t +-find(string s, string pattern, string attributes = null) +-{ +- auto r = new RegExp(pattern, attributes); +- scope(exit) delete r; +- return r.test(s) ? r.pmatch[0].rm_so : -1; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.find.unittest\n"); +- +- auto i = find("xabcy", "abc"); +- assert(i == 1); +- i = find("cba", "abc"); +- assert(i == -1); +-} +- +-/************************************************* +- * Search $(D_PARAM s[]) for last match with $(D_PARAM pattern). +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * Returns: +- * index into s[] of match if found, -1 if no match. +- * Example: +- * --- +- * auto s = "abcabcabab"; +- * rfind(s, RegExp("b")); // match, returns 9 +- * rfind(s, RegExp("f")); // no match, returns -1 +- * --- +- */ +- +-ptrdiff_t rfind(string s, RegExp pattern) +-{ +- ptrdiff_t i = -1, lastindex = 0; +- +- while (pattern.test(s, lastindex)) +- { +- auto eo = pattern.pmatch[0].rm_eo; +- i = pattern.pmatch[0].rm_so; +- if (lastindex == eo) +- lastindex++; // always consume some source +- else +- lastindex = eo; +- } +- return i; +-} +- +-unittest +-{ +- ptrdiff_t i; +- +- debug(regexp) printf("regexp.rfind.unittest\n"); +- i = rfind("abcdefcdef", RegExp("c")); +- assert(i == 6); +- i = rfind("abcdefcdef", RegExp("cd")); +- assert(i == 6); +- i = rfind("abcdefcdef", RegExp("x")); +- assert(i == -1); +- i = rfind("abcdefcdef", RegExp("xy")); +- assert(i == -1); +- i = rfind("abcdefcdef", RegExp("")); +- assert(i == 10); +-} +- +-/************************************************* +-Returns: +- +- Same as $(D_PARAM rfind(s, RegExp(pattern, attributes))). +- +-WARNING: +- +-This function is scheduled for deprecation due to unnecessary +-ambiguity with the homonym function in std.string. Instead of +-$(D_PARAM std.regexp.rfind(s, p, a)), you may want to use $(D_PARAM +-rfind(s, RegExp(p, a))). +-*/ +- +-ptrdiff_t +-rfind(string s, string pattern, string attributes = null) +-{ +- typeof(return) i = -1, lastindex = 0; +- +- auto r = new RegExp(pattern, attributes); +- while (r.test(s, lastindex)) +- { +- auto eo = r.pmatch[0].rm_eo; +- i = r.pmatch[0].rm_so; +- if (lastindex == eo) +- lastindex++; // always consume some source +- else +- lastindex = eo; +- } +- delete r; +- return i; +-} +- +-unittest +-{ +- ptrdiff_t i; +- +- debug(regexp) printf("regexp.rfind.unittest\n"); +- i = rfind("abcdefcdef", "c"); +- assert(i == 6); +- i = rfind("abcdefcdef", "cd"); +- assert(i == 6); +- i = rfind("abcdefcdef", "x"); +- assert(i == -1); +- i = rfind("abcdefcdef", "xy"); +- assert(i == -1); +- i = rfind("abcdefcdef", ""); +- assert(i == 10); +-} +- +- +-/******************************************** +- * Split s[] into an array of strings, using the regular +- * expression $(D_PARAM pattern) as the separator. +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * Returns: +- * array of slices into s[] +- * Example: +- * --- +- * foreach (s; split("abcabcabab", RegExp("C.", "i"))) +- * { +- * writefln("s = '%s'", s); +- * } +- * // Prints: +- * // s = 'ab' +- * // s = 'b' +- * // s = 'bab' +- * --- +- */ +- +-string[] split(string s, RegExp pattern) +-{ +- return pattern.split(s); +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.split.unittest()\n"); +- string[] result; +- +- result = split("ab", RegExp("a*")); +- assert(result.length == 2); +- assert(result[0] == ""); +- assert(result[1] == "b"); +- +- foreach (i, s; split("abcabcabab", RegExp("C.", "i"))) +- { +- //writefln("s[%d] = '%s'", i, s); +- if (i == 0) assert(s == "ab"); +- else if (i == 1) assert(s == "b"); +- else if (i == 2) assert(s == "bab"); +- else assert(0); +- } +-} +- +-/******************************************** +- Returns: +- Same as $(D_PARAM split(s, RegExp(pattern, attributes))). +- +-WARNING: +- +-This function is scheduled for deprecation due to unnecessary +-ambiguity with the homonym function in std.string. Instead of +-$(D_PARAM std.regexp.split(s, p, a)), you may want to use $(D_PARAM +-split(s, RegExp(p, a))). +-*/ +- +-string[] split(string s, string pattern, string attributes = null) +-{ +- auto r = new RegExp(pattern, attributes); +- auto result = r.split(s); +- delete r; +- return result; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.split.unittest()\n"); +- string[] result; +- +- result = split("ab", "a*"); +- assert(result.length == 2); +- assert(result[0] == ""); +- assert(result[1] == "b"); +- +- foreach (i, s; split("abcabcabab", "C.", "i")) +- { +- //writefln("s[%d] = '%s'", i, s.length, s.ptr); +- if (i == 0) assert(s == "ab"); +- else if (i == 1) assert(s == "b"); +- else if (i == 2) assert(s == "bab"); +- else assert(0); +- } +-} +- +-/**************************************************** +- * Search s[] for first match with pattern[] with attributes[]. +- * Params: +- * s = String to search. +- * pattern = Regular expression pattern. +- * attributes = Regular expression attributes. +- * Returns: +- * corresponding RegExp if found, null if not. +- * Example: +- * --- +- * import std.stdio; +- * import std.regexp; +- * +- * void main() +- * { +- * if (auto m = std.regexp.search("abcdef", "c")) +- * { +- * writefln("%s[%s]%s", m.pre, m[0], m.post); +- * } +- * } +- * // Prints: +- * // ab[c]def +- * --- +- */ +- +-RegExp search(string s, string pattern, string attributes = null) +-{ +- auto r = new RegExp(pattern, attributes); +- if (!r.test(s)) +- { delete r; +- assert(r is null); +- } +- return r; +-} +- +-unittest +-{ +- debug(regexp) printf("regexp.string.unittest()\n"); +- +- if (auto m = std.regexp.search("abcdef", "c()")) +- { +- auto result = std.string.format("%s[%s]%s", m.pre, m[0], m.post); +- assert(result == "ab[c]def"); +- assert(m[1] == null); +- assert(m[2] == null); +- } +- else +- assert(0); +- +- if (auto n = std.regexp.search("abcdef", "g")) +- { +- assert(0); +- } +-} +- +-/* ********************************* RegExp ******************************** */ +- +-/***************************** +- * RegExp is a class to handle regular expressions. +- * +- * It is the core foundation for adding powerful string pattern matching +- * capabilities to programs like grep, text editors, awk, sed, etc. +- */ +-class RegExp +-{ +- /***** +- * Construct a RegExp object. Compile pattern +- * with attributes into +- * an internal form for fast execution. +- * Params: +- * pattern = regular expression +- * attributes = _attributes +- * Throws: RegExpException if there are any compilation errors. +- * Example: +- * Declare two variables and assign to them a RegExp object: +- * --- +- * auto r = new RegExp("pattern"); +- * auto s = new RegExp(r"p[1-5]\s*"); +- * --- +- */ +- public this(string pattern, string attributes = null) +- { +- pmatch = (&gmatch)[0 .. 1]; +- compile(pattern, attributes); +- } +- +- /***** +- * Generate instance of RegExp. +- * Params: +- * pattern = regular expression +- * attributes = _attributes +- * Throws: RegExpException if there are any compilation errors. +- * Example: +- * Declare two variables and assign to them a RegExp object: +- * --- +- * auto r = RegExp("pattern"); +- * auto s = RegExp(r"p[1-5]\s*"); +- * --- +- */ +- public static RegExp opCall(string pattern, string attributes = null) +- { +- return new RegExp(pattern, attributes); +- } +- +- unittest +- { +- debug(regexp) printf("regexp.opCall.unittest()\n"); +- auto r1 = RegExp("hello", "m"); +- string msg; +- try +- { +- auto r2 = RegExp("hello", "q"); +- assert(0); +- } +- catch (RegExpException ree) +- { +- msg = ree.toString(); +- //writefln("message: %s", ree); +- } +- assert(std.algorithm.countUntil(msg, "unrecognized attribute") >= 0); +- } +- +- /************************************ +- * Set up for start of foreach loop. +- * Returns: +- * search() returns instance of RegExp set up to _search string[]. +- * Example: +- * --- +- * import std.stdio; +- * import std.regexp; +- * +- * void main() +- * { +- * foreach(m; RegExp("ab").search("abcabcabab")) +- * { +- * writefln("%s[%s]%s", m.pre, m[0], m.post); +- * } +- * } +- * // Prints: +- * // [ab]cabcabab +- * // abc[ab]cabab +- * // abcabc[ab]ab +- * // abcabcab[ab] +- * --- +- */ +- +- public RegExp search(string string) +- { +- input = string; +- pmatch[0].rm_eo = 0; +- return this; +- } +- +- /** ditto */ +- public int opApply(scope int delegate(ref RegExp) dg) +- { +- int result; +- RegExp r = this; +- +- while (test()) +- { +- result = dg(r); +- if (result) +- break; +- } +- +- return result; +- } +- +- unittest +- { +- debug(regexp) printf("regexp.search.unittest()\n"); +- +- int i; +- foreach(m; RegExp("ab").search("abcabcabab")) +- { +- auto s = std.string.format("%s[%s]%s", m.pre, m[0], m.post); +- if (i == 0) assert(s == "[ab]cabcabab"); +- else if (i == 1) assert(s == "abc[ab]cabab"); +- else if (i == 2) assert(s == "abcabc[ab]ab"); +- else if (i == 3) assert(s == "abcabcab[ab]"); +- else assert(0); +- i++; +- } +- } +- +- /****************** +- * Retrieve match n. +- * +- * n==0 means the matched substring, n>0 means the +- * n'th parenthesized subexpression. +- * if n is larger than the number of parenthesized subexpressions, +- * null is returned. +- */ +- public string opIndex(size_t n) +- { +- if (n >= pmatch.length) +- return null; +- else +- { +- auto rm_so = pmatch[n].rm_so; +- auto rm_eo = pmatch[n].rm_eo; +- if (rm_so == rm_eo) +- return null; +- return input[rm_so .. rm_eo]; +- } +- } +- +- /** +- Same as $(D_PARAM opIndex(n)). +- +- WARNING: +- +- Scheduled for deprecation due to confusion with overloaded +- $(D_PARAM match(string)). Instead of $(D_PARAM regex.match(n)) +- you may want to use $(D_PARAM regex[n]). +- */ +- public string match(size_t n) +- { +- return this[n]; +- } +- +- /******************* +- * Return the slice of the input that precedes the matched substring. +- */ +- public @property string pre() +- { +- return input[0 .. pmatch[0].rm_so]; +- } +- +- /******************* +- * Return the slice of the input that follows the matched substring. +- */ +- public @property string post() +- { +- return input[pmatch[0].rm_eo .. $]; +- } +- +- uint re_nsub; // number of parenthesized subexpression matches +- regmatch_t[] pmatch; // array [re_nsub + 1] +- +- string input; // the string to search +- +- // per instance: +- +- string pattern; // source text of the regular expression +- +- string flags; // source text of the attributes parameter +- +- int errors; +- +- uint attributes; +- +- enum REA +- { +- global = 1, // has the g attribute +- ignoreCase = 2, // has the i attribute +- multiline = 4, // if treat as multiple lines separated +- // by newlines, or as a single line +- dotmatchlf = 8, // if . matches \n +- } +- +- +-private: +- size_t src; // current source index in input[] +- size_t src_start; // starting index for match in input[] +- size_t p; // position of parser in pattern[] +- regmatch_t gmatch; // match for the entire regular expression +- // (serves as storage for pmatch[0]) +- +- const(ubyte)[] program; // pattern[] compiled into regular expression program +- OutBuffer buf; +- +- +- +- +-/******************************************/ +- +-// Opcodes +- +- enum : ubyte +- { +- REend, // end of program +- REchar, // single character +- REichar, // single character, case insensitive +- REdchar, // single UCS character +- REidchar, // single wide character, case insensitive +- REanychar, // any character +- REanystar, // ".*" +- REstring, // string of characters +- REistring, // string of characters, case insensitive +- REtestbit, // any in bitmap, non-consuming +- REbit, // any in the bit map +- REnotbit, // any not in the bit map +- RErange, // any in the string +- REnotrange, // any not in the string +- REor, // a | b +- REplus, // 1 or more +- REstar, // 0 or more +- REquest, // 0 or 1 +- REnm, // n..m +- REnmq, // n..m, non-greedy version +- REbol, // beginning of line +- REeol, // end of line +- REparen, // parenthesized subexpression +- REgoto, // goto offset +- +- REwordboundary, +- REnotwordboundary, +- REdigit, +- REnotdigit, +- REspace, +- REnotspace, +- REword, +- REnotword, +- REbackref, +- }; +- +-// BUG: should this include '$'? +- private int isword(dchar c) { return isAlphaNum(c) || c == '_'; } +- +- private uint inf = ~0u; +- +-/* ******************************** +- * Throws RegExpException on error +- */ +- +- public void compile(string pattern, string attributes) +- { +- //printf("RegExp.compile('%.*s', '%.*s')\n", pattern.length, pattern.ptr, attributes.length, attributes.ptr); +- +- this.attributes = 0; +- foreach (rchar c; attributes) +- { REA att; +- +- switch (c) +- { +- case 'g': att = REA.global; break; +- case 'i': att = REA.ignoreCase; break; +- case 'm': att = REA.multiline; break; +- default: +- error("unrecognized attribute"); +- return; +- } +- if (this.attributes & att) +- { error("redundant attribute"); +- return; +- } +- this.attributes |= att; +- } +- +- input = null; +- +- this.pattern = pattern; +- this.flags = attributes; +- +- uint oldre_nsub = re_nsub; +- re_nsub = 0; +- errors = 0; +- +- buf = new OutBuffer(); +- buf.reserve(pattern.length * 8); +- p = 0; +- parseRegexp(); +- if (p < pattern.length) +- { error("unmatched ')'"); +- } +- // @@@ SKIPPING OPTIMIZATION SOLVES BUG 941 @@@ +- //optimize(); +- program = buf.data; +- buf.data = null; +- delete buf; +- +- if (re_nsub > oldre_nsub) +- { +- if (pmatch.ptr is &gmatch) +- pmatch = null; +- pmatch.length = re_nsub + 1; +- } +- pmatch[0].rm_so = 0; +- pmatch[0].rm_eo = 0; +- } +- +-/******************************************** +- * Split s[] into an array of strings, using the regular +- * expression as the separator. +- * Returns: +- * array of slices into s[] +- */ +- +- public string[] split(string s) +- { +- debug(regexp) printf("regexp.split()\n"); +- +- string[] result; +- +- if (s.length) +- { +- ptrdiff_t p, q; +- for (q = p; q != s.length;) +- { +- if (test(s, q)) +- { +- q = pmatch[0].rm_so; +- auto e = pmatch[0].rm_eo; +- if (e != p) +- { +- result ~= s[p .. q]; +- for (size_t i = 1; i < pmatch.length; i++) +- { +- auto so = pmatch[i].rm_so; +- auto eo = pmatch[i].rm_eo; +- if (so == eo) +- { so = 0; // -1 gives array bounds error +- eo = 0; +- } +- result ~= s[so .. eo]; +- } +- q = p = e; +- continue; +- } +- } +- q++; +- } +- result ~= s[p .. s.length]; +- } +- else if (!test(s)) +- result ~= s; +- return result; +- } +- +- unittest +- { +- debug(regexp) printf("regexp.split.unittest()\n"); +- +- auto r = new RegExp("a*?", null); +- string[] result; +- string j; +- int i; +- +- result = r.split("ab"); +- +- assert(result.length == 2); +- i = std.algorithm.cmp(result[0], "a"); +- assert(i == 0); +- i = std.algorithm.cmp(result[1], "b"); +- assert(i == 0); +- +- r = new RegExp("a*", null); +- result = r.split("ab"); +- assert(result.length == 2); +- i = std.algorithm.cmp(result[0], ""); +- assert(i == 0); +- i = std.algorithm.cmp(result[1], "b"); +- assert(i == 0); +- +- r = new RegExp("<(\\/)?([^<>]+)>", null); +- result = r.split("afontbarhello"); +- +- debug(regexp) +- { +- for (i = 0; i < result.length; i++) +- printf("result[%d] = '%.*s'\n", i, result[i].length, result[i].ptr); +- } +- +- j = join(result, ","); +- //printf("j = '%.*s'\n", j.length, j.ptr); +- i = std.algorithm.cmp(j, "a,,b,font,/,b,bar,,TAG,hello,/,TAG,"); +- assert(i == 0); +- +- r = new RegExp("a[bc]", null); +- result = r.match("123ab"); +- j = join(result, ","); +- i = std.algorithm.cmp(j, "ab"); +- assert(i == 0); +- +- result = r.match("ac"); +- j = join(result, ","); +- i = std.algorithm.cmp(j, "ac"); +- assert(i == 0); +- } +- +-/************************************************* +- * Search string[] for match with regular expression. +- * Returns: +- * index of match if successful, -1 if not found +- */ +- +- public ptrdiff_t find(string string) +- { +- if (test(string)) +- return pmatch[0].rm_so; +- else +- return -1; // no match +- } +- +-//deprecated alias find search; +- +- unittest +- { +- debug(regexp) printf("regexp.find.unittest()\n"); +- +- RegExp r = new RegExp("abc", null); +- auto i = r.find("xabcy"); +- assert(i == 1); +- i = r.find("cba"); +- assert(i == -1); +- } +- +- +-/************************************************* +- * Search s[] for match. +- * Returns: +- * If global attribute, return same value as exec(s). +- * If not global attribute, return array of all matches. +- */ +- +- public string[] match(string s) +- { +- string[] result; +- +- if (attributes & REA.global) +- { +- ptrdiff_t lastindex = 0; +- +- while (test(s, lastindex)) +- { +- auto eo = pmatch[0].rm_eo; +- +- result ~= input[pmatch[0].rm_so .. eo]; +- if (lastindex == eo) +- lastindex++; // always consume some source +- else +- lastindex = eo; +- } +- } +- else +- { +- result = exec(s); +- } +- return result; +- } +- +- unittest +- { +- debug(regexp) printf("regexp.match.unittest()\n"); +- +- int i; +- string[] result; +- string j; +- RegExp r; +- +- r = new RegExp("a[bc]", null); +- result = r.match("1ab2ac3"); +- j = join(result, ","); +- i = std.algorithm.cmp(j, "ab"); +- assert(i == 0); +- +- r = new RegExp("a[bc]", "g"); +- result = r.match("1ab2ac3"); +- j = join(result, ","); +- i = std.algorithm.cmp(j, "ab,ac"); +- assert(i == 0); +- } +- +- +-/************************************************* +- * Find regular expression matches in s[]. Replace those matches +- * with a new string composed of format[] merged with the result of the +- * matches. +- * If global, replace all matches. Otherwise, replace first match. +- * Returns: the new string +- */ +- +- public string replace(string s, string format) +- { +- debug(regexp) printf("string = %.*s, format = %.*s\n", s.length, s.ptr, format.length, format.ptr); +- +- string result = s; +- ptrdiff_t lastindex = 0; +- size_t offset = 0; +- +- for (;;) +- { +- if (!test(s, lastindex)) +- break; +- +- auto so = pmatch[0].rm_so; +- auto eo = pmatch[0].rm_eo; +- +- string replacement = replace(format); +- +- // Optimize by using replace if possible - Dave Fladebo +- string slice = result[offset + so .. offset + eo]; +- if (attributes & REA.global && // global, so replace all +- !(attributes & REA.ignoreCase) && // not ignoring case +- !(attributes & REA.multiline) && // not multiline +- pattern == slice && // simple pattern (exact match, no special characters) +- format == replacement) // simple format, not $ formats +- { +- debug(regexp) +- { +- auto sss = result[offset + so .. offset + eo]; +- printf("pattern: %.*s, slice: %.*s, format: %.*s, replacement: %.*s\n", +- pattern.length, pattern.ptr, sss.length, sss.ptr, format.length, format.ptr, replacement.length, replacement.ptr); +- } +- result = std.array.replace(result,slice,replacement); +- break; +- } +- +- result = replaceSlice(result, result[offset + so .. offset + eo], replacement); +- +- if (attributes & REA.global) +- { +- offset += replacement.length - (eo - so); +- +- if (lastindex == eo) +- lastindex++; // always consume some source +- else +- lastindex = eo; +- } +- else +- break; +- } +- +- return result; +- } +- +- unittest +- { +- debug(regexp) printf("regexp.replace.unittest()\n"); +- +- int i; +- string result; +- RegExp r; +- +- r = new RegExp("a[bc]", "g"); +- result = r.replace("1ab2ac3", "x$&y"); +- i = std.algorithm.cmp(result, "1xaby2xacy3"); +- assert(i == 0); +- +- r = new RegExp("ab", "g"); +- result = r.replace("1ab2ac3", "xy"); +- i = std.algorithm.cmp(result, "1xy2ac3"); +- assert(i == 0); +- } +- +- +-/************************************************* +- * Search string[] for match. +- * Returns: +- * array of slices into string[] representing matches +- */ +- +- public string[] exec(string s) +- { +- debug(regexp) printf("regexp.exec(string = '%.*s')\n", s.length, s.ptr); +- input = s; +- pmatch[0].rm_so = 0; +- pmatch[0].rm_eo = 0; +- return exec(); +- } +- +-/************************************************* +- * Pick up where last exec(string) or exec() left off, +- * searching string[] for next match. +- * Returns: +- * array of slices into string[] representing matches +- */ +- +- public string[] exec() +- { +- if (!test()) +- return null; +- +- auto result = new string[pmatch.length]; +- for (int i = 0; i < pmatch.length; i++) +- { +- if (pmatch[i].rm_so == pmatch[i].rm_eo) +- result[i] = null; +- else +- result[i] = input[pmatch[i].rm_so .. pmatch[i].rm_eo]; +- } +- +- return result; +- } +- +-/************************************************ +- * Search s[] for match. +- * Returns: 0 for no match, !=0 for match +- * Example: +---- +-import std.stdio; +-import std.regexp; +-import std.string; +- +-int grep(int delegate(char[]) pred, char[][] list) +-{ +- int count; +- foreach (s; list) +- { if (pred(s)) +- ++count; +- } +- return count; +-} +- +-void main() +-{ +- auto x = grep(&RegExp("[Ff]oo").test, +- std.string.split("mary had a foo lamb")); +- writefln(x); +-} +---- +-* which prints: 1 +-*/ +- //@@@ +-public bool test(string s) +- { +- return test(s, 0 /*pmatch[0].rm_eo*/) != 0; +- } +- +-/************************************************ +- * Pick up where last test(string) or test() left off, and search again. +- * Returns: 0 for no match, !=0 for match +- */ +- +- public int test() +- { +- return test(input, pmatch[0].rm_eo); +- } +- +-/************************************************ +- * Test s[] starting at startindex against regular expression. +- * Returns: 0 for no match, !=0 for match +- */ +- +- public int test(string s, size_t startindex) +- { +- char firstc; +- +- input = s; +- debug (regexp) printf("RegExp.test(input[] = '%.*s', startindex = %zd)\n", input.length, input.ptr, startindex); +- pmatch[0].rm_so = 0; +- pmatch[0].rm_eo = 0; +- if (startindex < 0 || startindex > input.length) +- { +- return 0; // fail +- } +- //debug(regexp) printProgram(program); +- +- // First character optimization +- firstc = 0; +- if (program[0] == REchar) +- { +- firstc = program[1]; +- if (attributes & REA.ignoreCase && isAlpha(firstc)) +- firstc = 0; +- } +- +- for (auto si = startindex; ; si++) +- { +- if (firstc) +- { +- if (si == input.length) +- break; // no match +- if (input[si] != firstc) +- { +- si++; +- if (!chr(si, firstc)) // if first character not found +- break; // no match +- } +- } +- for (size_t i = 0; i < re_nsub + 1; i++) +- { +- pmatch[i].rm_so = -1; +- pmatch[i].rm_eo = -1; +- } +- src_start = src = si; +- if (trymatch(0, program.length)) +- { +- pmatch[0].rm_so = si; +- pmatch[0].rm_eo = src; +- //debug(regexp) printf("start = %d, end = %d\n", gmatch.rm_so, gmatch.rm_eo); +- return 1; +- } +- // If possible match must start at beginning, we are done +- if (program[0] == REbol || program[0] == REanystar) +- { +- if (attributes & REA.multiline) +- { +- // Scan for the next \n +- if (!chr(si, '\n')) +- break; // no match if '\n' not found +- } +- else +- break; +- } +- if (si == input.length) +- break; +- debug(regexp) +- { +- auto sss = input[si + 1 .. input.length]; +- printf("Starting new try: '%.*s'\n", sss.length, sss.ptr); +- } +- } +- return 0; // no match +- } +- +- /** +- Returns whether string $(D_PARAM s) matches $(D_PARAM this). +- */ +- alias test opEquals; +-// bool opEquals(string s) +-// { +-// return test(s); +-// } +- +- unittest +- { +- assert("abc" == RegExp(".b.")); +- assert("abc" != RegExp(".b..")); +- } +- +- int chr(ref size_t si, rchar c) +- { +- for (; si < input.length; si++) +- { +- if (input[si] == c) +- return 1; +- } +- return 0; +- } +- +- +- void printProgram(const(ubyte)[] prog) +- { +- //debug(regexp) +- { +- size_t len; +- uint n; +- uint m; +- ushort *pu; +- uint *puint; +- char[] str; +- +- printf("printProgram()\n"); +- for (size_t pc = 0; pc < prog.length; ) +- { +- printf("%3d: ", pc); +- +- //printf("prog[pc] = %d, REchar = %d, REnmq = %d\n", prog[pc], REchar, REnmq); +- switch (prog[pc]) +- { +- case REchar: +- printf("\tREchar '%c'\n", prog[pc + 1]); +- pc += 1 + char.sizeof; +- break; +- +- case REichar: +- printf("\tREichar '%c'\n", prog[pc + 1]); +- pc += 1 + char.sizeof; +- break; +- +- case REdchar: +- printf("\tREdchar '%c'\n", *cast(dchar *)&prog[pc + 1]); +- pc += 1 + dchar.sizeof; +- break; +- +- case REidchar: +- printf("\tREidchar '%c'\n", *cast(dchar *)&prog[pc + 1]); +- pc += 1 + dchar.sizeof; +- break; +- +- case REanychar: +- printf("\tREanychar\n"); +- pc++; +- break; +- +- case REstring: +- len = *cast(size_t *)&prog[pc + 1]; +- str = (cast(char*)&prog[pc + 1 + size_t.sizeof])[0 .. len]; +- printf("\tREstring x%x, '%.*s'\n", len, str.length, str.ptr); +- pc += 1 + size_t.sizeof + len * rchar.sizeof; +- break; +- +- case REistring: +- len = *cast(size_t *)&prog[pc + 1]; +- str = (cast(char*)&prog[pc + 1 + size_t.sizeof])[0 .. len]; +- printf("\tREistring x%x, '%.*s'\n", len, str.length, str.ptr); +- pc += 1 + size_t.sizeof + len * rchar.sizeof; +- break; +- +- case REtestbit: +- pu = cast(ushort *)&prog[pc + 1]; +- printf("\tREtestbit %d, %d\n", pu[0], pu[1]); +- len = pu[1]; +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case REbit: +- pu = cast(ushort *)&prog[pc + 1]; +- len = pu[1]; +- printf("\tREbit cmax=%02x, len=%d:", pu[0], len); +- for (n = 0; n < len; n++) +- printf(" %02x", prog[pc + 1 + 2 * ushort.sizeof + n]); +- printf("\n"); +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case REnotbit: +- pu = cast(ushort *)&prog[pc + 1]; +- printf("\tREnotbit %d, %d\n", pu[0], pu[1]); +- len = pu[1]; +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case RErange: +- len = *cast(uint *)&prog[pc + 1]; +- printf("\tRErange %d\n", len); +- // BUG: REAignoreCase? +- pc += 1 + uint.sizeof + len; +- break; +- +- case REnotrange: +- len = *cast(uint *)&prog[pc + 1]; +- printf("\tREnotrange %d\n", len); +- // BUG: REAignoreCase? +- pc += 1 + uint.sizeof + len; +- break; +- +- case REbol: +- printf("\tREbol\n"); +- pc++; +- break; +- +- case REeol: +- printf("\tREeol\n"); +- pc++; +- break; +- +- case REor: +- len = *cast(uint *)&prog[pc + 1]; +- printf("\tREor %d, pc=>%d\n", len, pc + 1 + uint.sizeof + len); +- pc += 1 + uint.sizeof; +- break; +- +- case REgoto: +- len = *cast(uint *)&prog[pc + 1]; +- printf("\tREgoto %d, pc=>%d\n", len, pc + 1 + uint.sizeof + len); +- pc += 1 + uint.sizeof; +- break; +- +- case REanystar: +- printf("\tREanystar\n"); +- pc++; +- break; +- +- case REnm: +- case REnmq: +- // len, n, m, () +- puint = cast(uint *)&prog[pc + 1]; +- len = puint[0]; +- n = puint[1]; +- m = puint[2]; +- printf("\tREnm%s len=%d, n=%u, m=%u, pc=>%d\n", +- (prog[pc] == REnmq) ? "q".ptr : " ".ptr, +- len, n, m, pc + 1 + uint.sizeof * 3 + len); +- pc += 1 + uint.sizeof * 3; +- break; +- +- case REparen: +- // len, n, () +- puint = cast(uint *)&prog[pc + 1]; +- len = puint[0]; +- n = puint[1]; +- printf("\tREparen len=%d n=%d, pc=>%d\n", len, n, pc + 1 + uint.sizeof * 2 + len); +- pc += 1 + uint.sizeof * 2; +- break; +- +- case REend: +- printf("\tREend\n"); +- return; +- +- case REwordboundary: +- printf("\tREwordboundary\n"); +- pc++; +- break; +- +- case REnotwordboundary: +- printf("\tREnotwordboundary\n"); +- pc++; +- break; +- +- case REdigit: +- printf("\tREdigit\n"); +- pc++; +- break; +- +- case REnotdigit: +- printf("\tREnotdigit\n"); +- pc++; +- break; +- +- case REspace: +- printf("\tREspace\n"); +- pc++; +- break; +- +- case REnotspace: +- printf("\tREnotspace\n"); +- pc++; +- break; +- +- case REword: +- printf("\tREword\n"); +- pc++; +- break; +- +- case REnotword: +- printf("\tREnotword\n"); +- pc++; +- break; +- +- case REbackref: +- printf("\tREbackref %d\n", prog[1]); +- pc += 2; +- break; +- +- default: +- assert(0); +- } +- } +- } +- } +- +- +-/************************************************** +- * Match input against a section of the program[]. +- * Returns: +- * 1 if successful match +- * 0 no match +- */ +- +- int trymatch(size_t pc, size_t pcend) +- { +- size_t len; +- size_t n; +- size_t m; +- size_t count; +- size_t pop; +- size_t ss; +- regmatch_t *psave; +- size_t c1; +- size_t c2; +- ushort* pu; +- uint* puint; +- +- debug(regexp) +- { +- auto sss = input[src .. input.length]; +- printf("RegExp.trymatch(pc = %zd, src = '%.*s', pcend = %zd)\n", pc, sss.length, sss.ptr, pcend); +- } +- auto srcsave = src; +- psave = null; +- for (;;) +- { +- if (pc == pcend) // if done matching +- { debug(regex) printf("\tprogend\n"); +- return 1; +- } +- +- //printf("\top = %d\n", program[pc]); +- switch (program[pc]) +- { +- case REchar: +- if (src == input.length) +- goto Lnomatch; +- debug(regexp) printf("\tREchar '%c', src = '%c'\n", program[pc + 1], input[src]); +- if (program[pc + 1] != input[src]) +- goto Lnomatch; +- src++; +- pc += 1 + char.sizeof; +- break; +- +- case REichar: +- if (src == input.length) +- goto Lnomatch; +- debug(regexp) printf("\tREichar '%c', src = '%c'\n", program[pc + 1], input[src]); +- c1 = program[pc + 1]; +- c2 = input[src]; +- if (c1 != c2) +- { +- if (isLower(cast(rchar)c2)) +- c2 = std.ascii.toUpper(cast(rchar)c2); +- else +- goto Lnomatch; +- if (c1 != c2) +- goto Lnomatch; +- } +- src++; +- pc += 1 + char.sizeof; +- break; +- +- case REdchar: +- debug(regexp) printf("\tREdchar '%c', src = '%c'\n", *(cast(dchar *)&program[pc + 1]), input[src]); +- if (src == input.length) +- goto Lnomatch; +- if (*(cast(dchar *)&program[pc + 1]) != input[src]) +- goto Lnomatch; +- src++; +- pc += 1 + dchar.sizeof; +- break; +- +- case REidchar: +- debug(regexp) printf("\tREidchar '%c', src = '%c'\n", *(cast(dchar *)&program[pc + 1]), input[src]); +- if (src == input.length) +- goto Lnomatch; +- c1 = *(cast(dchar *)&program[pc + 1]); +- c2 = input[src]; +- if (c1 != c2) +- { +- if (isLower(cast(rchar)c2)) +- c2 = std.ascii.toUpper(cast(rchar)c2); +- else +- goto Lnomatch; +- if (c1 != c2) +- goto Lnomatch; +- } +- src++; +- pc += 1 + dchar.sizeof; +- break; +- +- case REanychar: +- debug(regexp) printf("\tREanychar\n"); +- if (src == input.length) +- goto Lnomatch; +- if (!(attributes & REA.dotmatchlf) && input[src] == cast(rchar)'\n') +- goto Lnomatch; +- src += std.utf.stride(input, src); +- //src++; +- pc++; +- break; +- +- case REstring: +- len = *cast(size_t *)&program[pc + 1]; +- debug(regexp) +- { +- auto sss2 = (&program[pc + 1 + size_t.sizeof])[0 .. len]; +- printf("\tREstring x%x, '%.*s'\n", len, sss2.length, sss2.ptr); +- } +- if (src + len > input.length) +- goto Lnomatch; +- if (memcmp(&program[pc + 1 + size_t.sizeof], &input[src], len * rchar.sizeof)) +- goto Lnomatch; +- src += len; +- pc += 1 + size_t.sizeof + len * rchar.sizeof; +- break; +- +- case REistring: +- len = *cast(size_t *)&program[pc + 1]; +- debug(regexp) +- { +- auto sss2 = (&program[pc + 1 + size_t.sizeof])[0 .. len]; +- printf("\tREistring x%x, '%.*s'\n", len, sss2.length, sss2.ptr); +- } +- if (src + len > input.length) +- goto Lnomatch; +- if (icmp((cast(char*)&program[pc + 1 + size_t.sizeof])[0..len], +- input[src .. src + len])) +- goto Lnomatch; +- src += len; +- pc += 1 + size_t.sizeof + len * rchar.sizeof; +- break; +- +- case REtestbit: +- pu = (cast(ushort *)&program[pc + 1]); +- if (src == input.length) +- goto Lnomatch; +- debug(regexp) printf("\tREtestbit %d, %d, '%c', x%02x\n", +- pu[0], pu[1], input[src], input[src]); +- len = pu[1]; +- c1 = input[src]; +- //printf("[x%02x]=x%02x, x%02x\n", c1 >> 3, ((&program[pc + 1 + 4])[c1 >> 3] ), (1 << (c1 & 7))); +- if (c1 <= pu[0] && +- !((&(program[pc + 1 + 4]))[c1 >> 3] & (1 << (c1 & 7)))) +- goto Lnomatch; +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case REbit: +- pu = (cast(ushort *)&program[pc + 1]); +- if (src == input.length) +- goto Lnomatch; +- debug(regexp) printf("\tREbit %d, %d, '%c'\n", +- pu[0], pu[1], input[src]); +- len = pu[1]; +- c1 = input[src]; +- if (c1 > pu[0]) +- goto Lnomatch; +- if (!((&program[pc + 1 + 4])[c1 >> 3] & (1 << (c1 & 7)))) +- goto Lnomatch; +- src++; +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case REnotbit: +- pu = (cast(ushort *)&program[pc + 1]); +- if (src == input.length) +- goto Lnomatch; +- debug(regexp) printf("\tREnotbit %d, %d, '%c'\n", +- pu[0], pu[1], input[src]); +- len = pu[1]; +- c1 = input[src]; +- if (c1 <= pu[0] && +- ((&program[pc + 1 + 4])[c1 >> 3] & (1 << (c1 & 7)))) +- goto Lnomatch; +- src++; +- pc += 1 + 2 * ushort.sizeof + len; +- break; +- +- case RErange: +- len = *cast(uint *)&program[pc + 1]; +- debug(regexp) printf("\tRErange %d\n", len); +- if (src == input.length) +- goto Lnomatch; +- // BUG: REA.ignoreCase? +- if (memchr(cast(char*)&program[pc + 1 + uint.sizeof], input[src], len) == null) +- goto Lnomatch; +- src++; +- pc += 1 + uint.sizeof + len; +- break; +- +- case REnotrange: +- len = *cast(uint *)&program[pc + 1]; +- debug(regexp) printf("\tREnotrange %d\n", len); +- if (src == input.length) +- goto Lnomatch; +- // BUG: REA.ignoreCase? +- if (memchr(cast(char*)&program[pc + 1 + uint.sizeof], input[src], len) != null) +- goto Lnomatch; +- src++; +- pc += 1 + uint.sizeof + len; +- break; +- +- case REbol: +- debug(regexp) printf("\tREbol\n"); +- if (src == 0) +- { +- } +- else if (attributes & REA.multiline) +- { +- if (input[src - 1] != '\n') +- goto Lnomatch; +- } +- else +- goto Lnomatch; +- pc++; +- break; +- +- case REeol: +- debug(regexp) printf("\tREeol\n"); +- if (src == input.length) +- { +- } +- else if (attributes & REA.multiline && input[src] == '\n') +- src++; +- else +- goto Lnomatch; +- pc++; +- break; +- +- case REor: +- len = (cast(uint *)&program[pc + 1])[0]; +- debug(regexp) printf("\tREor %d\n", len); +- pop = pc + 1 + uint.sizeof; +- ss = src; +- if (trymatch(pop, pcend)) +- { +- if (pcend != program.length) +- { +- auto s = src; +- if (trymatch(pcend, program.length)) +- { debug(regexp) printf("\tfirst operand matched\n"); +- src = s; +- return 1; +- } +- else +- { +- // If second branch doesn't match to end, take first anyway +- src = ss; +- if (!trymatch(pop + len, program.length)) +- { +- debug(regexp) printf("\tfirst operand matched\n"); +- src = s; +- return 1; +- } +- } +- src = ss; +- } +- else +- { debug(regexp) printf("\tfirst operand matched\n"); +- return 1; +- } +- } +- pc = pop + len; // proceed with 2nd branch +- break; +- +- case REgoto: +- debug(regexp) printf("\tREgoto\n"); +- len = (cast(uint *)&program[pc + 1])[0]; +- pc += 1 + uint.sizeof + len; +- break; +- +- case REanystar: +- debug(regexp) printf("\tREanystar\n"); +- pc++; +- for (;;) +- { +- auto s1 = src; +- if (src == input.length) +- break; +- if (!(attributes & REA.dotmatchlf) && input[src] == '\n') +- break; +- src++; +- auto s2 = src; +- +- // If no match after consumption, but it +- // did match before, then no match +- if (!trymatch(pc, program.length)) +- { +- src = s1; +- // BUG: should we save/restore pmatch[]? +- if (trymatch(pc, program.length)) +- { +- src = s1; // no match +- break; +- } +- } +- src = s2; +- } +- break; +- +- case REnm: +- case REnmq: +- // len, n, m, () +- puint = cast(uint *)&program[pc + 1]; +- len = puint[0]; +- n = puint[1]; +- m = puint[2]; +- debug(regexp) printf("\tREnm%s len=%d, n=%u, m=%u\n", +- (program[pc] == REnmq) ? "q".ptr : "".ptr, len, n, m); +- pop = pc + 1 + uint.sizeof * 3; +- for (count = 0; count < n; count++) +- { +- if (!trymatch(pop, pop + len)) +- goto Lnomatch; +- } +- if (!psave && count < m) +- { +- //version (Win32) +- psave = cast(regmatch_t *)alloca((re_nsub + 1) * regmatch_t.sizeof); +- //else +- //psave = new regmatch_t[re_nsub + 1]; +- } +- if (program[pc] == REnmq) // if minimal munch +- { +- for (; count < m; count++) +- { +- memcpy(psave, pmatch.ptr, (re_nsub + 1) * regmatch_t.sizeof); +- auto s1 = src; +- +- if (trymatch(pop + len, program.length)) +- { +- src = s1; +- memcpy(pmatch.ptr, psave, (re_nsub + 1) * regmatch_t.sizeof); +- break; +- } +- +- if (!trymatch(pop, pop + len)) +- { debug(regexp) printf("\tdoesn't match subexpression\n"); +- break; +- } +- +- // If source is not consumed, don't +- // infinite loop on the match +- if (s1 == src) +- { debug(regexp) printf("\tsource is not consumed\n"); +- break; +- } +- } +- } +- else // maximal munch +- { +- for (; count < m; count++) +- { +- memcpy(psave, pmatch.ptr, (re_nsub + 1) * regmatch_t.sizeof); +- auto s1 = src; +- if (!trymatch(pop, pop + len)) +- { debug(regexp) printf("\tdoesn't match subexpression\n"); +- break; +- } +- auto s2 = src; +- +- // If source is not consumed, don't +- // infinite loop on the match +- if (s1 == s2) +- { debug(regexp) printf("\tsource is not consumed\n"); +- break; +- } +- +- // If no match after consumption, but it +- // did match before, then no match +- if (!trymatch(pop + len, program.length)) +- { +- src = s1; +- if (trymatch(pop + len, program.length)) +- { +- src = s1; // no match +- memcpy(pmatch.ptr, psave, (re_nsub + 1) * regmatch_t.sizeof); +- break; +- } +- } +- src = s2; +- } +- } +- debug(regexp) printf("\tREnm len=%d, n=%u, m=%u, DONE count=%d\n", len, n, m, count); +- pc = pop + len; +- break; +- +- case REparen: +- // len, () +- debug(regexp) printf("\tREparen\n"); +- puint = cast(uint *)&program[pc + 1]; +- len = puint[0]; +- n = puint[1]; +- pop = pc + 1 + uint.sizeof * 2; +- ss = src; +- if (!trymatch(pop, pop + len)) +- goto Lnomatch; +- pmatch[n + 1].rm_so = ss; +- pmatch[n + 1].rm_eo = src; +- pc = pop + len; +- break; +- +- case REend: +- debug(regexp) printf("\tREend\n"); +- return 1; // successful match +- +- case REwordboundary: +- debug(regexp) printf("\tREwordboundary\n"); +- if (src > 0 && src < input.length) +- { +- c1 = input[src - 1]; +- c2 = input[src]; +- if (!( +- (isword(cast(rchar)c1) && !isword(cast(rchar)c2)) || +- (!isword(cast(rchar)c1) && isword(cast(rchar)c2)) +- ) +- ) +- goto Lnomatch; +- } +- pc++; +- break; +- +- case REnotwordboundary: +- debug(regexp) printf("\tREnotwordboundary\n"); +- if (src == 0 || src == input.length) +- goto Lnomatch; +- c1 = input[src - 1]; +- c2 = input[src]; +- if ( +- (isword(cast(rchar)c1) && !isword(cast(rchar)c2)) || +- (!isword(cast(rchar)c1) && isword(cast(rchar)c2)) +- ) +- goto Lnomatch; +- pc++; +- break; +- +- case REdigit: +- debug(regexp) printf("\tREdigit\n"); +- if (src == input.length) +- goto Lnomatch; +- if (!isDigit(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REnotdigit: +- debug(regexp) printf("\tREnotdigit\n"); +- if (src == input.length) +- goto Lnomatch; +- if (isDigit(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REspace: +- debug(regexp) printf("\tREspace\n"); +- if (src == input.length) +- goto Lnomatch; +- if (!isWhite(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REnotspace: +- debug(regexp) printf("\tREnotspace\n"); +- if (src == input.length) +- goto Lnomatch; +- if (isWhite(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REword: +- debug(regexp) printf("\tREword\n"); +- if (src == input.length) +- goto Lnomatch; +- if (!isword(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REnotword: +- debug(regexp) printf("\tREnotword\n"); +- if (src == input.length) +- goto Lnomatch; +- if (isword(input[src])) +- goto Lnomatch; +- src++; +- pc++; +- break; +- +- case REbackref: +- { +- n = program[pc + 1]; +- debug(regexp) printf("\tREbackref %d\n", n); +- +- auto so = pmatch[n + 1].rm_so; +- auto eo = pmatch[n + 1].rm_eo; +- len = eo - so; +- if (src + len > input.length) +- goto Lnomatch; +- else if (attributes & REA.ignoreCase) +- { +- if (icmp(input[src .. src + len], input[so .. eo])) +- goto Lnomatch; +- } +- else if (memcmp(&input[src], &input[so], len * rchar.sizeof)) +- goto Lnomatch; +- src += len; +- pc += 2; +- break; +- } +- +- default: +- assert(0); +- } +- } +- +- Lnomatch: +- debug(regexp) printf("\tnomatch pc=%d\n", pc); +- src = srcsave; +- return 0; +- } +- +-/* =================== Compiler ================== */ +- +- int parseRegexp() +- { +- size_t gotooffset; +- uint len1; +- uint len2; +- +- debug(regexp) +- { +- auto sss = pattern[p .. pattern.length]; +- printf("parseRegexp() '%.*s'\n", sss.length, sss.ptr); +- } +- auto offset = buf.offset; +- for (;;) +- { +- assert(p <= pattern.length); +- if (p == pattern.length) +- { buf.write(REend); +- return 1; +- } +- switch (pattern[p]) +- { +- case ')': +- return 1; +- +- case '|': +- p++; +- gotooffset = buf.offset; +- buf.write(REgoto); +- buf.write(cast(uint)0); +- len1 = cast(uint)(buf.offset - offset); +- buf.spread(offset, 1 + uint.sizeof); +- gotooffset += 1 + uint.sizeof; +- parseRegexp(); +- len2 = cast(uint)(buf.offset - (gotooffset + 1 + uint.sizeof)); +- buf.data[offset] = REor; +- (cast(uint *)&buf.data[offset + 1])[0] = len1; +- (cast(uint *)&buf.data[gotooffset + 1])[0] = len2; +- break; +- +- default: +- parsePiece(); +- break; +- } +- } +- } +- +- int parsePiece() +- { +- uint len; +- uint n; +- uint m; +- ubyte op; +- auto plength = pattern.length; +- +- debug(regexp) +- { +- auto sss = pattern[p .. pattern.length]; +- printf("parsePiece() '%.*s'\n", sss.length, sss.ptr); +- } +- auto offset = buf.offset; +- parseAtom(); +- if (p == plength) +- return 1; +- switch (pattern[p]) +- { +- case '*': +- // Special optimization: replace .* with REanystar +- if (buf.offset - offset == 1 && +- buf.data[offset] == REanychar && +- p + 1 < plength && +- pattern[p + 1] != '?') +- { +- buf.data[offset] = REanystar; +- p++; +- break; +- } +- +- n = 0; +- m = inf; +- goto Lnm; +- +- case '+': +- n = 1; +- m = inf; +- goto Lnm; +- +- case '?': +- n = 0; +- m = 1; +- goto Lnm; +- +- case '{': // {n} {n,} {n,m} +- p++; +- if (p == plength || !isDigit(pattern[p])) +- goto Lerr; +- n = 0; +- do +- { +- // BUG: handle overflow +- n = n * 10 + pattern[p] - '0'; +- p++; +- if (p == plength) +- goto Lerr; +- } while (isDigit(pattern[p])); +- if (pattern[p] == '}') // {n} +- { m = n; +- goto Lnm; +- } +- if (pattern[p] != ',') +- goto Lerr; +- p++; +- if (p == plength) +- goto Lerr; +- if (pattern[p] == /*{*/ '}') // {n,} +- { m = inf; +- goto Lnm; +- } +- if (!isDigit(pattern[p])) +- goto Lerr; +- m = 0; // {n,m} +- do +- { +- // BUG: handle overflow +- m = m * 10 + pattern[p] - '0'; +- p++; +- if (p == plength) +- goto Lerr; +- } while (isDigit(pattern[p])); +- if (pattern[p] != /*{*/ '}') +- goto Lerr; +- goto Lnm; +- +- Lnm: +- p++; +- op = REnm; +- if (p < plength && pattern[p] == '?') +- { op = REnmq; // minimal munch version +- p++; +- } +- len = cast(uint)(buf.offset - offset); +- buf.spread(offset, 1 + uint.sizeof * 3); +- buf.data[offset] = op; +- uint* puint = cast(uint *)&buf.data[offset + 1]; +- puint[0] = len; +- puint[1] = n; +- puint[2] = m; +- break; +- +- default: +- break; +- } +- return 1; +- +- Lerr: +- error("badly formed {n,m}"); +- assert(0); +- } +- +- int parseAtom() +- { ubyte op; +- size_t offset; +- rchar c; +- +- debug(regexp) +- { +- auto sss = pattern[p .. pattern.length]; +- printf("parseAtom() '%.*s'\n", sss.length, sss.ptr); +- } +- if (p < pattern.length) +- { +- c = pattern[p]; +- switch (c) +- { +- case '*': +- case '+': +- case '?': +- error("*+? not allowed in atom"); +- p++; +- return 0; +- +- case '(': +- p++; +- buf.write(REparen); +- offset = buf.offset; +- buf.write(cast(uint)0); // reserve space for length +- buf.write(re_nsub); +- re_nsub++; +- parseRegexp(); +- *cast(uint *)&buf.data[offset] = +- cast(uint)(buf.offset - (offset + uint.sizeof * 2)); +- if (p == pattern.length || pattern[p] != ')') +- { +- error("')' expected"); +- return 0; +- } +- p++; +- break; +- +- case '[': +- if (!parseRange()) +- return 0; +- break; +- +- case '.': +- p++; +- buf.write(REanychar); +- break; +- +- case '^': +- p++; +- buf.write(REbol); +- break; +- +- case '$': +- p++; +- buf.write(REeol); +- break; +- +- case '\\': +- p++; +- if (p == pattern.length) +- { error("no character past '\\'"); +- return 0; +- } +- c = pattern[p]; +- switch (c) +- { +- case 'b': op = REwordboundary; goto Lop; +- case 'B': op = REnotwordboundary; goto Lop; +- case 'd': op = REdigit; goto Lop; +- case 'D': op = REnotdigit; goto Lop; +- case 's': op = REspace; goto Lop; +- case 'S': op = REnotspace; goto Lop; +- case 'w': op = REword; goto Lop; +- case 'W': op = REnotword; goto Lop; +- +- Lop: +- buf.write(op); +- p++; +- break; +- +- case 'f': +- case 'n': +- case 'r': +- case 't': +- case 'v': +- case 'c': +- case 'x': +- case 'u': +- case '0': +- c = cast(char)escape(); +- goto Lbyte; +- +- case '1': case '2': case '3': +- case '4': case '5': case '6': +- case '7': case '8': case '9': +- c -= '1'; +- if (c < re_nsub) +- { buf.write(REbackref); +- buf.write(cast(ubyte)c); +- } +- else +- { error("no matching back reference"); +- return 0; +- } +- p++; +- break; +- +- default: +- p++; +- goto Lbyte; +- } +- break; +- +- default: +- p++; +- Lbyte: +- op = REchar; +- if (attributes & REA.ignoreCase) +- { +- if (isAlpha(c)) +- { +- op = REichar; +- c = cast(char)std.ascii.toUpper(c); +- } +- } +- if (op == REchar && c <= 0xFF) +- { +- // Look ahead and see if we can make this into +- // an REstring +- auto q = p; +- for (; q < pattern.length; ++q) +- { rchar qc = pattern[q]; +- +- switch (qc) +- { +- case '{': +- case '*': +- case '+': +- case '?': +- if (q == p) +- goto Lchar; +- q--; +- break; +- +- case '(': case ')': +- case '|': +- case '[': case ']': +- case '.': case '^': +- case '$': case '\\': +- case '}': +- break; +- +- default: +- continue; +- } +- break; +- } +- auto len = q - p; +- if (len > 0) +- { +- debug(regexp) printf("writing string len %d, c = '%c', pattern[p] = '%c'\n", len+1, c, pattern[p]); +- buf.reserve(5 + (1 + len) * rchar.sizeof); +- buf.write((attributes & REA.ignoreCase) ? REistring : REstring); +- buf.write(len + 1); +- buf.write(c); +- buf.write(pattern[p .. p + len]); +- p = q; +- break; +- } +- } +- if (c >= 0x80) +- { +- // Convert to dchar opcode +- op = (op == REchar) ? REdchar : REidchar; +- buf.write(op); +- buf.write(c); +- } +- else +- { +- Lchar: +- debug(regexp) printf("It's an REchar '%c'\n", c); +- buf.write(op); +- buf.write(cast(char)c); +- } +- break; +- } +- } +- return 1; +- } +- +-private: +- class Range +- { +- size_t maxc; +- size_t maxb; +- OutBuffer buf; +- ubyte* base; +- BitArray bits; +- +- this(OutBuffer buf) +- { +- this.buf = buf; +- if (buf.data.length) +- this.base = &buf.data[buf.offset]; +- } +- +- void setbitmax(size_t u) +- { +- //printf("setbitmax(x%x), maxc = x%x\n", u, maxc); +- if (u > maxc) +- { +- maxc = u; +- auto b = u / 8; +- if (b >= maxb) +- { +- auto u2 = base ? base - &buf.data[0] : 0; +- buf.fill0(b - maxb + 1); +- base = &buf.data[u2]; +- maxb = b + 1; +- //bits = (cast(bit*)this.base)[0 .. maxc + 1]; +- bits.ptr = cast(size_t*)this.base; +- } +- bits.len = maxc + 1; +- } +- } +- +- void setbit2(size_t u) +- { +- setbitmax(u + 1); +- //printf("setbit2 [x%02x] |= x%02x\n", u >> 3, 1 << (u & 7)); +- bits[u] = 1; +- } +- +- }; +- +- int parseRange() +- { +- int c; +- int c2; +- uint i; +- uint cmax; +- +- cmax = 0x7F; +- p++; +- ubyte op = REbit; +- if (p == pattern.length) +- goto Lerr; +- if (pattern[p] == '^') +- { p++; +- op = REnotbit; +- if (p == pattern.length) +- goto Lerr; +- } +- buf.write(op); +- auto offset = buf.offset; +- buf.write(cast(uint)0); // reserve space for length +- buf.reserve(128 / 8); +- auto r = new Range(buf); +- if (op == REnotbit) +- r.setbit2(0); +- switch (pattern[p]) +- { +- case ']': +- case '-': +- c = pattern[p]; +- p++; +- r.setbit2(c); +- break; +- +- default: +- break; +- } +- +- enum RS { start, rliteral, dash } +- RS rs; +- +- rs = RS.start; +- for (;;) +- { +- if (p == pattern.length) +- goto Lerr; +- switch (pattern[p]) +- { +- case ']': +- switch (rs) +- { case RS.dash: +- r.setbit2('-'); +- goto case; +- case RS.rliteral: +- r.setbit2(c); +- break; +- case RS.start: +- break; +- default: +- assert(0); +- } +- p++; +- break; +- +- case '\\': +- p++; +- r.setbitmax(cmax); +- if (p == pattern.length) +- goto Lerr; +- switch (pattern[p]) +- { +- case 'd': +- for (i = '0'; i <= '9'; i++) +- r.bits[i] = 1; +- goto Lrs; +- +- case 'D': +- for (i = 1; i < '0'; i++) +- r.bits[i] = 1; +- for (i = '9' + 1; i <= cmax; i++) +- r.bits[i] = 1; +- goto Lrs; +- +- case 's': +- for (i = 0; i <= cmax; i++) +- if (isWhite(i)) +- r.bits[i] = 1; +- goto Lrs; +- +- case 'S': +- for (i = 1; i <= cmax; i++) +- if (!isWhite(i)) +- r.bits[i] = 1; +- goto Lrs; +- +- case 'w': +- for (i = 0; i <= cmax; i++) +- if (isword(cast(rchar)i)) +- r.bits[i] = 1; +- goto Lrs; +- +- case 'W': +- for (i = 1; i <= cmax; i++) +- if (!isword(cast(rchar)i)) +- r.bits[i] = 1; +- goto Lrs; +- +- Lrs: +- switch (rs) +- { case RS.dash: +- r.setbit2('-'); +- goto case; +- case RS.rliteral: +- r.setbit2(c); +- break; +- default: +- break; +- } +- rs = RS.start; +- continue; +- +- default: +- break; +- } +- c2 = escape(); +- goto Lrange; +- +- case '-': +- p++; +- if (rs == RS.start) +- goto Lrange; +- else if (rs == RS.rliteral) +- rs = RS.dash; +- else if (rs == RS.dash) +- { +- r.setbit2(c); +- r.setbit2('-'); +- rs = RS.start; +- } +- continue; +- +- default: +- c2 = pattern[p]; +- p++; +- Lrange: +- switch (rs) +- { case RS.rliteral: +- r.setbit2(c); +- goto case; +- case RS.start: +- c = c2; +- rs = RS.rliteral; +- break; +- +- case RS.dash: +- if (c > c2) +- { error("inverted range in character class"); +- return 0; +- } +- r.setbitmax(c2); +- //printf("c = %x, c2 = %x\n",c,c2); +- for (; c <= c2; c++) +- r.bits[c] = 1; +- rs = RS.start; +- break; +- +- default: +- assert(0); +- } +- continue; +- } +- break; +- } +- if (attributes & REA.ignoreCase) +- { +- // BUG: what about dchar? +- r.setbitmax(0x7F); +- for (c = 'a'; c <= 'z'; c++) +- { +- if (r.bits[c]) +- r.bits[c + 'A' - 'a'] = 1; +- else if (r.bits[c + 'A' - 'a']) +- r.bits[c] = 1; +- } +- } +- //printf("maxc = %d, maxb = %d\n",r.maxc,r.maxb); +- (cast(ushort *)&buf.data[offset])[0] = cast(ushort)r.maxc; +- (cast(ushort *)&buf.data[offset])[1] = cast(ushort)r.maxb; +- return 1; +- +- Lerr: +- error("invalid range"); +- return 0; +- } +- +- void error(string msg) +- { +- errors++; +- debug(regexp) printf("error: %.*s\n", msg.length, msg.ptr); +-//assert(0); +-//*(char*)0=0; +- throw new RegExpException(msg); +- } +- +-// p is following the \ char +- int escape() +- in +- { +- assert(p < pattern.length); +- } +- body +- { int c; +- int i; +- rchar tc; +- +- c = pattern[p]; // none of the cases are multibyte +- switch (c) +- { +- case 'b': c = '\b'; break; +- case 'f': c = '\f'; break; +- case 'n': c = '\n'; break; +- case 'r': c = '\r'; break; +- case 't': c = '\t'; break; +- case 'v': c = '\v'; break; +- +- // BUG: Perl does \a and \e too, should we? +- +- case 'c': +- ++p; +- if (p == pattern.length) +- goto Lretc; +- c = pattern[p]; +- // Note: we are deliberately not allowing dchar letters +- if (!(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))) +- { +- Lcerr: +- error("letter expected following \\c"); +- return 0; +- } +- c &= 0x1F; +- break; +- +- case '0': +- case '1': +- case '2': +- case '3': +- case '4': +- case '5': +- case '6': +- case '7': +- c -= '0'; +- for (i = 0; i < 2; i++) +- { +- p++; +- if (p == pattern.length) +- goto Lretc; +- tc = pattern[p]; +- if ('0' <= tc && tc <= '7') +- { c = c * 8 + (tc - '0'); +- // Treat overflow as if last +- // digit was not an octal digit +- if (c >= 0xFF) +- { c >>= 3; +- return c; +- } +- } +- else +- return c; +- } +- break; +- +- case 'x': +- c = 0; +- for (i = 0; i < 2; i++) +- { +- p++; +- if (p == pattern.length) +- goto Lretc; +- tc = pattern[p]; +- if ('0' <= tc && tc <= '9') +- c = c * 16 + (tc - '0'); +- else if ('a' <= tc && tc <= 'f') +- c = c * 16 + (tc - 'a' + 10); +- else if ('A' <= tc && tc <= 'F') +- c = c * 16 + (tc - 'A' + 10); +- else if (i == 0) // if no hex digits after \x +- { +- // Not a valid \xXX sequence +- return 'x'; +- } +- else +- return c; +- } +- break; +- +- case 'u': +- c = 0; +- for (i = 0; i < 4; i++) +- { +- p++; +- if (p == pattern.length) +- goto Lretc; +- tc = pattern[p]; +- if ('0' <= tc && tc <= '9') +- c = c * 16 + (tc - '0'); +- else if ('a' <= tc && tc <= 'f') +- c = c * 16 + (tc - 'a' + 10); +- else if ('A' <= tc && tc <= 'F') +- c = c * 16 + (tc - 'A' + 10); +- else +- { +- // Not a valid \uXXXX sequence +- p -= i; +- return 'u'; +- } +- } +- break; +- +- default: +- break; +- } +- p++; +- Lretc: +- return c; +- } +- +-/* ==================== optimizer ======================= */ +- +- void optimize() +- { ubyte[] prog; +- +- debug(regexp) printf("RegExp.optimize()\n"); +- prog = buf.toBytes(); +- for (size_t i = 0; 1;) +- { +- //printf("\tprog[%d] = %d, %d\n", i, prog[i], REstring); +- switch (prog[i]) +- { +- case REend: +- case REanychar: +- case REanystar: +- case REbackref: +- case REeol: +- case REchar: +- case REichar: +- case REdchar: +- case REidchar: +- case REstring: +- case REistring: +- case REtestbit: +- case REbit: +- case REnotbit: +- case RErange: +- case REnotrange: +- case REwordboundary: +- case REnotwordboundary: +- case REdigit: +- case REnotdigit: +- case REspace: +- case REnotspace: +- case REword: +- case REnotword: +- return; +- +- case REbol: +- i++; +- continue; +- +- case REor: +- case REnm: +- case REnmq: +- case REparen: +- case REgoto: +- { +- auto bitbuf = new OutBuffer; +- auto r = new Range(bitbuf); +- auto offset = i; +- if (starrchars(r, prog[i .. prog.length])) +- { +- debug(regexp) printf("\tfilter built\n"); +- buf.spread(offset, 1 + 4 + r.maxb); +- buf.data[offset] = REtestbit; +- (cast(ushort *)&buf.data[offset + 1])[0] = cast(ushort)r.maxc; +- (cast(ushort *)&buf.data[offset + 1])[1] = cast(ushort)r.maxb; +- i = offset + 1 + 4; +- buf.data[i .. i + r.maxb] = r.base[0 .. r.maxb]; +- } +- return; +- } +- default: +- assert(0); +- } +- } +- } +- +-///////////////////////////////////////// +-// OR the leading character bits into r. +-// Limit the character range from 0..7F, +-// trymatch() will allow through anything over maxc. +-// Return 1 if success, 0 if we can't build a filter or +-// if there is no point to one. +- +- int starrchars(Range r, const(ubyte)[] prog) +- { rchar c; +- uint maxc; +- size_t maxb; +- size_t len; +- uint b; +- uint n; +- uint m; +- const(ubyte)* pop; +- +- //printf("RegExp.starrchars(prog = %p, progend = %p)\n", prog, progend); +- for (size_t i = 0; i < prog.length;) +- { +- switch (prog[i]) +- { +- case REchar: +- c = prog[i + 1]; +- if (c <= 0x7F) +- r.setbit2(c); +- return 1; +- +- case REichar: +- c = prog[i + 1]; +- if (c <= 0x7F) +- { r.setbit2(c); +- r.setbit2(std.ascii.toLower(cast(rchar)c)); +- } +- return 1; +- +- case REdchar: +- case REidchar: +- return 1; +- +- case REanychar: +- return 0; // no point +- +- case REstring: +- len = *cast(size_t *)&prog[i + 1]; +- assert(len); +- c = *cast(rchar *)&prog[i + 1 + size_t.sizeof]; +- debug(regexp) printf("\tREstring %d, '%c'\n", len, c); +- if (c <= 0x7F) +- r.setbit2(c); +- return 1; +- +- case REistring: +- len = *cast(size_t *)&prog[i + 1]; +- assert(len); +- c = *cast(rchar *)&prog[i + 1 + size_t.sizeof]; +- debug(regexp) printf("\tREistring %d, '%c'\n", len, c); +- if (c <= 0x7F) +- { r.setbit2(std.ascii.toUpper(cast(rchar)c)); +- r.setbit2(std.ascii.toLower(cast(rchar)c)); +- } +- return 1; +- +- case REtestbit: +- case REbit: +- maxc = (cast(ushort *)&prog[i + 1])[0]; +- maxb = (cast(ushort *)&prog[i + 1])[1]; +- if (maxc <= 0x7F) +- r.setbitmax(maxc); +- else +- maxb = r.maxb; +- for (b = 0; b < maxb; b++) +- r.base[b] |= prog[i + 1 + 4 + b]; +- return 1; +- +- case REnotbit: +- maxc = (cast(ushort *)&prog[i + 1])[0]; +- maxb = (cast(ushort *)&prog[i + 1])[1]; +- if (maxc <= 0x7F) +- r.setbitmax(maxc); +- else +- maxb = r.maxb; +- for (b = 0; b < maxb; b++) +- r.base[b] |= ~prog[i + 1 + 4 + b]; +- return 1; +- +- case REbol: +- case REeol: +- return 0; +- +- case REor: +- len = (cast(uint *)&prog[i + 1])[0]; +- return starrchars(r, prog[i + 1 + uint.sizeof .. prog.length]) && +- starrchars(r, prog[i + 1 + uint.sizeof + len .. prog.length]); +- +- case REgoto: +- len = (cast(uint *)&prog[i + 1])[0]; +- i += 1 + uint.sizeof + len; +- break; +- +- case REanystar: +- return 0; +- +- case REnm: +- case REnmq: +- // len, n, m, () +- len = (cast(uint *)&prog[i + 1])[0]; +- n = (cast(uint *)&prog[i + 1])[1]; +- m = (cast(uint *)&prog[i + 1])[2]; +- pop = &prog[i + 1 + uint.sizeof * 3]; +- if (!starrchars(r, pop[0 .. len])) +- return 0; +- if (n) +- return 1; +- i += 1 + uint.sizeof * 3 + len; +- break; +- +- case REparen: +- // len, () +- len = (cast(uint *)&prog[i + 1])[0]; +- n = (cast(uint *)&prog[i + 1])[1]; +- pop = &prog[0] + i + 1 + uint.sizeof * 2; +- return starrchars(r, pop[0 .. len]); +- +- case REend: +- return 0; +- +- case REwordboundary: +- case REnotwordboundary: +- return 0; +- +- case REdigit: +- r.setbitmax('9'); +- for (c = '0'; c <= '9'; c++) +- r.bits[c] = 1; +- return 1; +- +- case REnotdigit: +- r.setbitmax(0x7F); +- for (c = 0; c <= '0'; c++) +- r.bits[c] = 1; +- for (c = '9' + 1; c <= r.maxc; c++) +- r.bits[c] = 1; +- return 1; +- +- case REspace: +- r.setbitmax(0x7F); +- for (c = 0; c <= r.maxc; c++) +- if (isWhite(c)) +- r.bits[c] = 1; +- return 1; +- +- case REnotspace: +- r.setbitmax(0x7F); +- for (c = 0; c <= r.maxc; c++) +- if (!isWhite(c)) +- r.bits[c] = 1; +- return 1; +- +- case REword: +- r.setbitmax(0x7F); +- for (c = 0; c <= r.maxc; c++) +- if (isword(cast(rchar)c)) +- r.bits[c] = 1; +- return 1; +- +- case REnotword: +- r.setbitmax(0x7F); +- for (c = 0; c <= r.maxc; c++) +- if (!isword(cast(rchar)c)) +- r.bits[c] = 1; +- return 1; +- +- case REbackref: +- return 0; +- +- default: +- assert(0); +- } +- } +- return 1; +- } +- +-/* ==================== replace ======================= */ +- +-/*********************** +- * After a match is found with test(), this function +- * will take the match results and, using the format +- * string, generate and return a new string. +- */ +- +- public string replace(string format) +- { +- return replace3(format, input, pmatch[0 .. re_nsub + 1]); +- } +- +-// Static version that doesn't require a RegExp object to be created +- +- public static string replace3(string format, string input, regmatch_t[] pmatch) +- { +- string result; +- size_t c2; +- ptrdiff_t rm_so, rm_eo, i; +- +-// printf("replace3(format = '%.*s', input = '%.*s')\n", format.length, format.ptr, input.length, input.ptr); +- result.length = format.length; +- result.length = 0; +- for (size_t f = 0; f < format.length; f++) +- { +- char c = format[f]; +- L1: +- if (c != '$') +- { +- result ~= c; +- continue; +- } +- ++f; +- if (f == format.length) +- { +- result ~= '$'; +- break; +- } +- c = format[f]; +- switch (c) +- { +- case '&': +- rm_so = pmatch[0].rm_so; +- rm_eo = pmatch[0].rm_eo; +- goto Lstring; +- +- case '`': +- rm_so = 0; +- rm_eo = pmatch[0].rm_so; +- goto Lstring; +- +- case '\'': +- rm_so = pmatch[0].rm_eo; +- rm_eo = input.length; +- goto Lstring; +- +- case '0': case '1': case '2': case '3': case '4': +- case '5': case '6': case '7': case '8': case '9': +- i = c - '0'; +- if (f + 1 == format.length) +- { +- if (i == 0) +- { +- result ~= '$'; +- result ~= c; +- continue; +- } +- } +- else +- { +- c2 = format[f + 1]; +- if (c2 >= '0' && c2 <= '9') +- { +- i = (c - '0') * 10 + (c2 - '0'); +- f++; +- } +- if (i == 0) +- { +- result ~= '$'; +- result ~= c; +- c = cast(char)c2; +- goto L1; +- } +- } +- +- if (i < pmatch.length) +- { rm_so = pmatch[i].rm_so; +- rm_eo = pmatch[i].rm_eo; +- goto Lstring; +- } +- break; +- +- Lstring: +- if (rm_so != rm_eo) +- result ~= input[rm_so .. rm_eo]; +- break; +- +- default: +- result ~= '$'; +- result ~= c; +- break; +- } +- } +- return result; +- } +- +-/************************************ +- * Like replace(char[] format), but uses old style formatting: +- +- +- +- +- +- +- +-
Format +- Description +-
& +- replace with the match +-
\n +- replace with the nth parenthesized match, n is 1..9 +-
\c +- replace with char c. +-
+-*/ +- +- public string replaceOld(string format) +- { +- string result; +- +-//printf("replace: this = %p so = %d, eo = %d\n", this, pmatch[0].rm_so, pmatch[0].rm_eo); +-//printf("3input = '%.*s'\n", input.length, input.ptr); +- result.length = format.length; +- result.length = 0; +- for (size_t i; i < format.length; i++) +- { +- char c = format[i]; +- switch (c) +- { +- case '&': +- { +- auto sss = input[pmatch[0].rm_so .. pmatch[0].rm_eo]; +- //printf("match = '%.*s'\n", sss.length, sss.ptr); +- result ~= sss; +- } +- break; +- +- case '\\': +- if (i + 1 < format.length) +- { +- c = format[++i]; +- if (c >= '1' && c <= '9') +- { uint j; +- +- j = c - '0'; +- if (j <= re_nsub && pmatch[j].rm_so != pmatch[j].rm_eo) +- result ~= input[pmatch[j].rm_so .. pmatch[j].rm_eo]; +- break; +- } +- } +- result ~= c; +- break; +- +- default: +- result ~= c; +- break; +- } +- } +- return result; +- } +- +-} +- +-unittest +-{ // Created and placed in public domain by Don Clugston +- +- auto m = search("aBC r s", `bc\x20r[\40]s`, "i"); +- assert(m.pre=="a"); +- assert(m[0]=="BC r s"); +- auto m2 = search("7xxyxxx", `^\d([a-z]{2})\D\1`); +- assert(m2[0]=="7xxyxx"); +- // Just check the parsing. +- auto m3 = search("dcbxx", `ca|b[\d\]\D\s\S\w-\W]`); +- auto m4 = search("xy", `[^\ca-\xFa\r\n\b\f\t\v\0123]{2,485}$`); +- auto m5 = search("xxx", `^^\r\n\b{13,}\f{4}\t\v\u02aF3a\w\W`); +- auto m6 = search("xxy", `.*y`); +- assert(m6[0]=="xxy"); +- auto m7 = search("QWDEfGH", "(ca|b|defg)+", "i"); +- assert(m7[0]=="DEfG"); +- auto m8 = search("dcbxx", `a?\B\s\S`); +- auto m9 = search("dcbxx", `[-w]`); +- auto m10 = search("dcbsfd", `aB[c-fW]dB|\d|\D|\u012356|\w|\W|\s|\S`, "i"); +- auto m11 = search("dcbsfd", `[]a-]`); +- m.replaceOld(`a&b\1c`); +- m.replace(`a$&b$'$1c`); +-} +- +-// Andrei +-//------------------------------------------------------------------------------ +- +-struct Pattern(Char) +-{ +- immutable(Char)[] pattern; +- +- this(immutable(Char)[] pattern) +- { +- this.pattern = pattern; +- } +-} +- +-Pattern!(Char) pattern(Char)(immutable(Char)[] pat) +-{ +- return typeof(return)(pat); +-} +- +-struct Splitter(Range) +-{ +- Range _input; +- size_t _chunkLength; +- RegExp _rx; +- +- private Range search() +- { +- //rx = std.regexp.search(_input, "(" ~ _separator.pattern ~ ")"); +- auto i = std.regexp.find(cast(string) _input, _rx); +- return _input[i >= 0 ? i : _input.length .. _input.length]; +- } +- +- private void advance() +- { +- //writeln("(" ~ _separator.pattern ~ ")"); +- //writeln(_input); +- //assert(_rx[0].length > 0); +- _chunkLength += _rx[0].length; +- } +- +- this(Range input, Pattern!(char) separator) +- { +- _input = input; +- _rx = RegExp(separator.pattern); +- _chunkLength = _input.length - search().length; +- } +- +- ref auto opSlice() +- { +- return this; +- } +- +- @property Range front() +- { +- return _input[0 .. _chunkLength]; +- } +- +- @property bool empty() +- { +- return _input.empty; +- } +- +- void popFront() +- { +- if (_chunkLength == _input.length) +- { +- _input = _input[_chunkLength .. _input.length]; +- return; +- } +- advance(); +- _input = _input[_chunkLength .. _input.length]; +- _chunkLength = _input.length - search().length; +- } +-} +- +-Splitter!(Range) splitter(Range)(Range r, Pattern!(char) pat) +-{ +- static assert(is(Unqual!(typeof(Range.init[0])) == char), +- Unqual!(typeof(Range.init[0])).stringof); +- return typeof(return)(cast(string) r, pat); +-} +- +-unittest +-{ +- auto s1 = ", abc, de, fg, hi, "; +- auto sp2 = splitter(s1, pattern(", *")); +- //foreach (e; sp2) writeln("[", e, "]"); +- assert(equal(sp2, ["", "abc", "de", "fg", "hi"][])); +-} +- +-unittest +-{ +- auto str= "foo"; +- string[] re_strs= [ +- r"^(h|a|)fo[oas]$", +- r"^(a|b|)fo[oas]$", +- r"^(a|)foo$", +- r"(a|)foo", +- r"^(h|)foo$", +- r"(h|)foo", +- r"(h|a|)fo[oas]", +- r"^(a|b|)fo[o]$", +- r"[abf][ops](o|oo|)(h|a|)", +- r"(h|)[abf][ops](o|oo|)", +- r"(c|)[abf][ops](o|oo|)" +- ]; +- +- foreach (re_str; re_strs) { +- auto re= new RegExp(re_str); +- auto matches= cast(bool)re.test(str); +- assert(matches); +- //writefln("'%s' matches '%s' ? %s", str, re_str, matches); +- } +- +- for (char c='a'; c<='z'; ++c) { +- auto re_str= "("~c~"|)foo"; +- auto re= new RegExp(re_str); +- auto matches= cast(bool)re.test(str); +- assert(matches); +- //writefln("'%s' matches '%s' ? %s", str, re_str, matches); +- } +-} +--- a/src/libphobos/src/std/socket.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/socket.d 2014-04-01 16:32:51.000000000 +0100 +@@ -61,7 +61,7 @@ version(Windows) + private alias std.c.windows.winsock.timeval _ctimeval; + private alias std.c.windows.winsock.linger _clinger; + +- enum socket_t : SOCKET { INVALID_SOCKET }; ++ enum socket_t : SOCKET { INVALID_SOCKET } + private const int _SOCKET_ERROR = SOCKET_ERROR; + + +@@ -94,6 +94,7 @@ else version(Posix) + static assert(false); + + import core.sys.posix.netdb; ++ import core.sys.posix.sys.un : sockaddr_un; + private import core.sys.posix.fcntl; + private import core.sys.posix.unistd; + private import core.sys.posix.arpa.inet; +@@ -144,12 +145,7 @@ version(unittest) + /// Base exception thrown by $(D std.socket). + class SocketException: Exception + { +- /** +- * $(RED Deprecated. It will be removed in January 2013. +- * Please use $(LREF SocketOSException) instead.) +- * +- * Provided for compatibility with older code using $(D SocketException). +- */ ++ // Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.socket.SocketOSException instead.") @property int errorCode() const + { + auto osException = cast(SocketOSException)this; +@@ -1770,13 +1766,13 @@ public: + /** + * Construct a new $(D Internet6Address). + * Params: +- * node = an IPv6 host address string in the form described in RFC 2373, +- * or a host name which will be resolved using $(D getAddressInfo). +- * port = (optional) service name or port number. ++ * addr = an IPv6 host address string in the form described in RFC 2373, ++ * or a host name which will be resolved using $(D getAddressInfo). ++ * service = (optional) service name. + */ +- this(in char[] node, in char[] service = null) ++ this(in char[] addr, in char[] service = null) + { +- auto results = getAddressInfo(node, service, AddressFamily.INET6); ++ auto results = getAddressInfo(addr, service, AddressFamily.INET6); + assert(results.length && results[0].family == AddressFamily.INET6); + sin6 = *cast(sockaddr_in6*)results[0].address.name; + } +@@ -1788,19 +1784,19 @@ public: + * or a host name which will be resolved using $(D getAddressInfo). + * port = port number, may be $(D PORT_ANY). + */ +- this(in char[] node, ushort port) ++ this(in char[] addr, ushort port) + { + if (port == PORT_ANY) +- this(node); ++ this(addr); + else +- this(node, to!string(port)); ++ this(addr, to!string(port)); + } + + /** + * Construct a new $(D Internet6Address). + * Params: + * addr = (optional) an IPv6 host address in host byte order, or +- $(D ADDR_ANY). ++ * $(D ADDR_ANY). + * port = port number, may be $(D PORT_ANY). + */ + this(ubyte[16] addr, ushort port) +@@ -1898,10 +1894,10 @@ static if (is(sockaddr_un)) + + this(in char[] path) + { +- len = sockaddr_un.sun_path.offsetof + path.length + 1; ++ len = cast(socklen_t)(sockaddr_un.init.sun_path.offsetof + path.length + 1); + sun = cast(sockaddr_un*) (new ubyte[len]).ptr; + sun.sun_family = AF_UNIX; +- sun.sun_path.ptr[0..path.length] = path; ++ sun.sun_path.ptr[0..path.length] = (cast(byte[]) path)[]; + sun.sun_path.ptr[path.length] = 0; + } + +@@ -1915,6 +1911,40 @@ static if (is(sockaddr_un)) + return path; + } + } ++ ++ unittest ++ { ++ import core.stdc.stdio : remove; ++ ++ immutable ubyte[] data = [1, 2, 3, 4]; ++ Socket[2] pair; ++ ++ auto name = "unix-address-family-unittest-socket-name"; ++ auto address = new UnixAddress(name); ++ ++ auto listener = new Socket(AddressFamily.UNIX, SocketType.STREAM); ++ scope(exit) listener.close(); ++ ++ listener.bind(address); ++ scope(exit) remove(toStringz(name)); ++ ++ listener.listen(1); ++ ++ pair[0] = new Socket(AddressFamily.UNIX, SocketType.STREAM); ++ scope(exit) listener.close(); ++ ++ pair[0].connect(address); ++ scope(exit) pair[0].close(); ++ ++ pair[1] = listener.accept(); ++ scope(exit) pair[1].close(); ++ ++ pair[0].send(data); ++ ++ auto buf = new ubyte[data.length]; ++ pair[1].receive(buf); ++ assert(buf == data); ++ } + } + + +@@ -1999,10 +2029,7 @@ struct TimeVal + } + } + +-/++ +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(LREF TimeVal) instead.) +- +/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.socket.TimeVal instead.") alias TimeVal timeval; + + +@@ -2230,10 +2257,7 @@ struct Linger + } + } + +-/++ +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(LREF Linger) instead.) +- +/ ++// Explicitly undocumented. It will be removed in November 2013. + deprecated("Please use std.socket.Linger instead.") alias Linger linger; + + /// Specifies a socket option: +@@ -2896,7 +2920,9 @@ public: + * randomly varies on the order of 10ms. + * + * Params: +- * value = The timeout duration to set. Must not be negative. ++ * level = The level at which a socket option is defined. ++ * option = Either $(D SocketOption.SNDTIMEO) or $(D SocketOption.RCVTIMEO). ++ * value = The timeout duration to set. Must not be negative. + * + * Throws: $(D SocketException) if setting the options fails. + * +@@ -2936,7 +2962,7 @@ public: + else version (Posix) + { + _ctimeval tv; +- tv.tv_sec = to!(typeof(tv.tv_sec ))(value.total!"seconds"()); ++ tv.tv_sec = to!(typeof(tv.tv_sec ))(value.total!"seconds"); + tv.tv_usec = to!(typeof(tv.tv_usec))(value.fracSec.usecs); + setOption(level, option, (&tv)[0 .. 1]); + } +--- a/src/libphobos/src/std/stdio.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/stdio.d 2014-04-01 16:32:51.000000000 +0100 +@@ -23,7 +23,7 @@ public import core.stdc.stdio, std.strin + static import std.c.stdio; + import std.stdiobase; + import core.stdc.errno, core.stdc.stddef, core.stdc.stdlib, core.memory, +- core.stdc.string, core.stdc.wchar_; ++ core.stdc.string, core.stdc.wchar_, core.exception; + import std.algorithm, std.array, std.conv, std.exception, std.format, + std.range, std.string, std.traits, std.typecons, + std.typetuple, std.utf; +@@ -294,6 +294,14 @@ manner, such that as soon as the last $( + given $(D FILE*) goes out of scope, the underlying $(D FILE*) is + automatically closed. + ++Bugs: ++$(D File) expects file names to be encoded in $(B CP_ACP) on $(I Windows) ++instead of UTF-8 ($(BUGZILLA 7648)) thus must not be used in $(I Windows) ++or cross-platform applications other than with an immediate ASCII string as ++a file name to prevent accidental changes to result in incorrect behavior. ++One can use $(XREF file, read)/$(XREF file, write)/$(XREF stream, File) ++instead. ++ + Example: + ---- + // test.d +@@ -326,18 +334,18 @@ struct File + { + FILE * handle = null; // Is null iff this Impl is closed by another File + uint refs = uint.max / 2; +- bool isPipe; ++ bool isPopened; // true iff the stream has been created by popen() + } + private Impl* _p; + private string _name; + +- private this(FILE* handle, string name, uint refs = 1, bool isPipe = false) ++ package this(FILE* handle, string name, uint refs = 1, bool isPopened = false) + { + assert(!_p); + _p = cast(Impl*) enforce(malloc(Impl.sizeof), "Out of memory"); + _p.handle = handle; + _p.refs = refs; +- _p.isPipe = isPipe; ++ _p.isPopened = isPopened; + _name = name; + } + +@@ -345,13 +353,15 @@ struct File + Constructor taking the name of the file to open and the open mode + (with the same semantics as in the C standard library $(WEB + cplusplus.com/reference/clibrary/cstdio/fopen.html, fopen) +-function). Throws an exception if the file could not be opened. ++function). + + Copying one $(D File) object to another results in the two $(D File) + objects referring to the same underlying file. + + The destructor automatically closes the file as soon as no $(D File) + object refers to it anymore. ++ ++Throws: $(D ErrnoException) if the file could not be opened. + */ + this(string name, in char[] stdioOpenmode = "rb") + { +@@ -388,7 +398,8 @@ First calls $(D detach) (throwing on fai + _open file $(D name) with mode $(D stdioOpenmode). The mode has the + same semantics as in the C standard library $(WEB + cplusplus.com/reference/clibrary/cstdio/fopen.html, fopen) function. +-Throws exception in case of error. ++ ++Throws: $(D ErrnoException) in case of error. + */ + void open(string name, in char[] stdioOpenmode = "rb") + { +@@ -400,6 +411,8 @@ Throws exception in case of error. + First calls $(D detach) (throwing on failure), and then runs a command + by calling the C standard library function $(WEB + opengroup.org/onlinepubs/007908799/xsh/_popen.html, _popen). ++ ++Throws: $(D ErrnoException) in case of error. + */ + version(Posix) void popen(string command, in char[] stdioOpenmode = "r") + { +@@ -417,8 +430,9 @@ opengroup.org/onlinepubs/007908799/xsh/_ + + /** + Returns $(D true) if the file is at end (see $(WEB +-cplusplus.com/reference/clibrary/cstdio/feof.html, feof)). The file +-must be opened, otherwise an exception is thrown. ++cplusplus.com/reference/clibrary/cstdio/feof.html, feof)). ++ ++Throws: $(D Exception) if the file is not opened. + */ + @property bool eof() const pure + { +@@ -445,8 +459,9 @@ the file handle. + } + + /** +-Detaches from the underlying file. If the sole owner, calls $(D close) +-and throws if that fails. ++Detaches from the underlying file. If the sole owner, calls $(D close). ++ ++Throws: $(D ErrnoException) on failure if closing the file. + */ + void detach() + { +@@ -482,6 +497,8 @@ throwing on error. Even if an exception + File) object is empty. This is different from $(D detach) in that it + always closes the file; consequently, all other $(D File) objects + referring to the same handle will see a closed file henceforth. ++ ++Throws: $(D ErrnoException) on error. + */ + void close() + { +@@ -498,11 +515,12 @@ referring to the same handle will see a + scope(exit) _p.handle = null; // nullify the handle anyway + version (Posix) + { +- if (_p.isPipe) ++ if (_p.isPopened) + { +- // Ignore the result of the command +- errnoEnforce(.pclose(_p.handle) != -1, ++ auto res = .pclose(_p.handle); ++ errnoEnforce(res != -1, + "Could not close pipe `"~_name~"'"); ++ errnoEnforce(res == 0, format("Command returned %d", res)); + return; + } + } +@@ -523,9 +541,10 @@ _clearerr) for the file handle. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/_fflush.html, _fflush) for the +-file handle and throws on error. ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/_fflush.html, _fflush) ++for the file handle. ++ ++Throws: $(D Exception) if the file is not opened or if the call to $D(fflush) fails. + */ + void flush() + { +@@ -535,15 +554,17 @@ file handle and throws on error. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/fread.html, fread) for the +-file handle and throws on error. The number of items to read and the size of ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/fread.html, fread) for the ++file handle. The number of items to read and the size of + each item is inferred from the size and type of the input array, respectively. + + Returns: The slice of $(D buffer) containing the data that was actually read. + This will be shorter than $(D buffer) if EOF was reached before the buffer + could be filled. + ++Throws: $(D Exception) if $(D buffer) is empty. ++ $(D ErrnoException) if the file is not opened or the call to $D(fread) fails. ++ + $(D rawRead) always reads in binary mode on Windows. + */ + T[] rawRead(T)(T[] buffer) +@@ -584,13 +605,14 @@ $(D rawRead) always reads in binary mode + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/fwrite.html, fwrite) for the file +-handle and throws on error. The number of items to write and the size of each ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/fwrite.html, fwrite) for the file ++handle. The number of items to write and the size of each + item is inferred from the size and type of the input array, respectively. An + error is thrown if the buffer could not be written in its entirety. + + $(D rawWrite) always writes in binary mode on Windows. ++ ++Throws: $(D ErrnoException) if the file is not opened or if the call to $D(fread) fails. + */ + void rawWrite(T)(in T[] buffer) + { +@@ -630,9 +652,11 @@ $(D rawWrite) always writes in binary mo + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/fseek.html, fseek) for the +-file handle. Throws on error. ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/fseek.html, fseek) ++for the file handle. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) if the call to $D(fseek) fails. + */ + void seek(long offset, int origin = SEEK_SET) + { +@@ -677,9 +701,11 @@ file handle. Throws on error. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/ftell.html, ftell) for the +-managed file handle. Throws on error. ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/ftell.html, ftell) for the ++managed file handle. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) if the call to $D(ftell) fails. + */ + @property ulong tell() const + { +@@ -709,9 +735,10 @@ managed file handle. Throws on error. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/_rewind.html, _rewind) for the +-file handle. Throws on error. ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/_rewind.html, _rewind) ++for the file handle. ++ ++Throws: $(D Exception) if the file is not opened. + */ + void rewind() + { +@@ -720,9 +747,11 @@ file handle. Throws on error. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls $(WEB +-cplusplus.com/reference/clibrary/cstdio/_setvbuf.html, _setvbuf) for ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/_setvbuf.html, _setvbuf) for + the file handle. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) if the call to $D(setvbuf) fails. + */ + void setvbuf(size_t size, int mode = _IOFBF) + { +@@ -732,9 +761,12 @@ the file handle. + } + + /** +-If the file is not opened, throws an exception. Otherwise, calls +-$(WEB cplusplus.com/reference/clibrary/cstdio/_setvbuf.html, +-_setvbuf) for the file handle. */ ++Calls $(WEB cplusplus.com/reference/clibrary/cstdio/_setvbuf.html, ++_setvbuf) for the file handle. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) if the call to $D(setvbuf) fails. ++*/ + void setvbuf(void[] buf, int mode = _IOFBF) + { + enforce(isOpen, "Attempting to call setvbuf() on an unopened file"); +@@ -744,11 +776,14 @@ _setvbuf) for the file handle. */ + } + + /** +-If the file is not opened, throws an exception. Otherwise, writes its +-arguments in text format to the file. */ ++Writes its arguments in text format to the file. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) on an error writing to the file. ++*/ + void write(S...)(S args) + { +- auto w = lockingTextWriter; ++ auto w = lockingTextWriter(); + foreach (arg; args) + { + alias typeof(arg) A; +@@ -781,73 +816,78 @@ arguments in text format to the file. */ + } + + /** +-If the file is not opened, throws an exception. Otherwise, writes its +-arguments in text format to the file, followed by a newline. */ ++Writes its arguments in text format to the file, followed by a newline. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) on an error writing to the file. ++*/ + void writeln(S...)(S args) + { + write(args, '\n'); + } + + /** +-If the file is not opened, throws an exception. Otherwise, writes its +-arguments in text format to the file, according to the format in the +-first argument. */ ++Writes its arguments in text format to the file, according to the ++format in the first argument. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) on an error writing to the file. ++*/ + void writef(Char, A...)(in Char[] fmt, A args) + { +- std.format.formattedWrite(lockingTextWriter, fmt, args); ++ std.format.formattedWrite(lockingTextWriter(), fmt, args); + } + + /** +-Same as writef, plus adds a newline. */ ++Writes its arguments in text format to the file, according to the ++format in the first argument, followed by a newline. ++ ++Throws: $(D Exception) if the file is not opened. ++ $(D ErrnoException) on an error writing to the file. ++*/ + void writefln(Char, A...)(in Char[] fmt, A args) + { +- auto w = lockingTextWriter; ++ auto w = lockingTextWriter(); + std.format.formattedWrite(w, fmt, args); + w.put('\n'); + } + +-/********************************** +-Read line from stream $(D fp) and write it to $(D buf[]), including +-terminating character. ++/** ++Read line from the file handle and return it as a specified type. + +-This is often faster than $(D File.readln(dchar)) because the buffer +-is reused each call. Note that reusing the buffer means that the +-previous contents of it has to be copied if needed. ++This version manages its own read buffer, which means one memory allocation per call. If you are not ++retaining a reference to the read data, consider the $(D File.readln(buf)) version, which may offer ++better performance as it can reuse its read buffer. + + Params: +-fp = input stream +-buf = buffer used to store the resulting line data. buf is +-resized as necessary. ++ S = Template parameter; the type of the allocated buffer, and the type returned. Defaults to $(D string). ++ terminator = line terminator (by default, '\n') + + Returns: +-0 for end of file, otherwise number of characters read ++ The line that was read, including the line terminator character. + +-Throws: $(D StdioException) on I/O error, or $(D UnicodeException) on Unicode +-conversion error. ++Throws: ++ $(D StdioException) on I/O error, or $(D UnicodeException) on Unicode conversion error. + + Example: + --- + // Reads $(D stdin) and writes it to $(D stdout). + import std.stdio; + +-int main() ++void main() + { +- char[] buf; +- while (stdin.readln(buf)) +- write(buf); +- return 0; ++ string line; ++ while ((line = stdin.readln()) !is null) ++ write(line); + } + --- +- +-This method is more efficient than the one in the previous example +-because $(D stdin.readln(buf)) reuses (if possible) memory allocated +-by $(D buf), whereas $(D buf = stdin.readln()) makes a new memory allocation +-with every line. */ ++*/ + S readln(S = string)(dchar terminator = '\n') ++ if (isSomeString!S) + { + Unqual!(ElementEncodingType!S)[] buf; + readln(buf, terminator); +- return assumeUnique(buf); ++ return cast(S)buf; + } + + unittest +@@ -855,13 +895,13 @@ with every line. */ + auto deleteme = testFilename(); + std.file.write(deleteme, "hello\nworld\n"); + scope(exit) std.file.remove(deleteme); +- foreach (C; Tuple!(char, wchar, dchar).Types) ++ foreach (String; TypeTuple!(string, char[], wstring, wchar[], dstring, dchar[])) + { + auto witness = [ "hello\n", "world\n" ]; + auto f = File(deleteme); + uint i = 0; +- immutable(C)[] buf; +- while ((buf = f.readln!(typeof(buf))()).length) ++ String buf; ++ while ((buf = f.readln!String()).length) + { + assert(i < witness.length); + assert(equal(buf, witness[i++])); +@@ -870,8 +910,70 @@ with every line. */ + } + } + +-/** ditto */ +- size_t readln(C)(ref C[] buf, dchar terminator = '\n') if (isSomeChar!C && !is(C == enum)) ++ unittest ++ { ++ auto deleteme = testFilename(); ++ std.file.write(deleteme, "cześć \U0002000D"); ++ scope(exit) std.file.remove(deleteme); ++ uint[] lengths=[12,8,7]; ++ foreach (uint i,C; Tuple!(char, wchar, dchar).Types) ++ { ++ immutable(C)[] witness = "cześć \U0002000D"; ++ auto buf = File(deleteme).readln!(immutable(C)[])(); ++ assert(buf.length==lengths[i]); ++ assert(buf==witness); ++ } ++ } ++ ++/** ++Read line from the file handle and write it to $(D buf[]), including ++terminating character. ++ ++This can be faster than $(D line = File.readln()) because you can reuse ++the buffer for each call. Note that reusing the buffer means that you ++must copy the previous contents if you wish to retain them. ++ ++Params: ++buf = buffer used to store the resulting line data. buf is ++resized as necessary. ++terminator = line terminator (by default, '\n') ++ ++Returns: ++0 for end of file, otherwise number of characters read ++ ++Throws: $(D StdioException) on I/O error, or $(D UnicodeException) on Unicode ++conversion error. ++ ++Example: ++--- ++// Read lines from $(D stdin) into a string ++// Ignore lines starting with '#' ++// Write the string to $(D stdout) ++ ++void main() ++{ ++ string output; ++ char[] buf; ++ ++ while (stdin.readln(buf)) ++ { ++ if (buf[0] == '#') ++ continue; ++ ++ output ~= buf; ++ } ++ ++ write(output); ++} ++--- ++ ++This method can be more efficient than the one in the previous example ++because $(D stdin.readln(buf)) reuses (if possible) memory allocated ++for $(D buf), whereas $(D line = stdin.readln()) makes a new memory allocation ++for every line. ++*/ ++ size_t readln(C)(ref C[] buf, dchar terminator = '\n') ++ if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum)) + { + static if (is(C == char)) + { +@@ -882,9 +984,9 @@ with every line. */ + { + // TODO: optimize this + string s = readln(terminator); +- if (!s.length) return 0; + buf.length = 0; +- foreach (wchar c; s) ++ if (!s.length) return 0; ++ foreach (C c; s) + { + buf ~= c; + } +@@ -894,7 +996,8 @@ with every line. */ + + /** ditto */ + size_t readln(C, R)(ref C[] buf, R terminator) +- if (isBidirectionalRange!R && is(typeof(terminator.front == buf[0]))) ++ if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum) && ++ isBidirectionalRange!R && is(typeof(terminator.front == dchar.init))) + { + auto last = terminator.back; + C[] buf2; +@@ -917,15 +1020,19 @@ with every line. */ + { + auto deleteme = testFilename(); + std.file.write(deleteme, "hello\n\rworld\nhow\n\rare ya"); +- auto witness = [ "hello\n\r", "world\nhow\n\r", "are ya" ]; + scope(exit) std.file.remove(deleteme); +- auto f = File(deleteme); +- uint i = 0; +- char[] buf; +- while (f.readln(buf, "\n\r")) ++ foreach (C; Tuple!(char, wchar, dchar).Types) + { +- assert(i < witness.length); +- assert(buf == witness[i++]); ++ immutable(C)[][] witness = [ "hello\n\r", "world\nhow\n\r", "are ya" ]; ++ auto f = File(deleteme); ++ uint i = 0; ++ C[] buf; ++ while (f.readln(buf, "\n\r")) ++ { ++ assert(i < witness.length); ++ assert(buf == witness[i++]); ++ } ++ assert(buf.length==0); + } + } + +@@ -997,27 +1104,70 @@ Returns the file number corresponding to + return .fileno(cast(FILE*) _p.handle); + } + +-/** +-Range that reads one line at a time. */ +- /// ditto ++// Note: This was documented until 2013/08 ++/* ++Range that reads one line at a time. Returned by $(LREF byLine). ++ ++Allows to directly use range operations on lines of a file. ++*/ + struct ByLine(Char, Terminator) + { ++ private: ++ /* Ref-counting stops the source range's ByLineImpl ++ * from getting out of sync after the range is copied, e.g. ++ * when accessing range.front, then using std.range.take, ++ * then accessing range.front again. */ ++ alias Impl = RefCounted!(ByLineImpl!(Char, Terminator), ++ RefCountedAutoInitialize.no); ++ Impl impl; ++ ++ static if (isScalarType!Terminator) ++ enum defTerm = '\n'; ++ else ++ enum defTerm = cast(Terminator)"\n"; ++ ++ public: ++ this(File f, KeepTerminator kt = KeepTerminator.no, ++ Terminator terminator = defTerm) ++ { ++ impl = Impl(f, kt, terminator); ++ } ++ ++ @property bool empty() ++ { ++ return impl.refCountedPayload.empty; ++ } ++ ++ @property Char[] front() ++ { ++ return impl.refCountedPayload.front; ++ } ++ ++ void popFront() ++ { ++ impl.refCountedPayload.popFront(); ++ } ++ } ++ ++ private struct ByLineImpl(Char, Terminator) ++ { ++ private: + File file; + Char[] line; + Terminator terminator; + KeepTerminator keepTerminator; + bool first_call = true; + +- this(File f, KeepTerminator kt = KeepTerminator.no, +- Terminator terminator = '\n') ++ public: ++ this(File f, KeepTerminator kt, Terminator terminator) + { + file = f; + this.terminator = terminator; + keepTerminator = kt; + } + +- /// Range primitive implementations. +- @property bool empty() const ++ // Range primitive implementations. ++ @property bool empty() + { + if (line !is null) return false; + if (!file.isOpen) return true; +@@ -1025,21 +1175,19 @@ Range that reads one line at a time. */ + // First read ever, must make sure stream is not empty. We + // do so by reading a character and putting it back. Doing + // so is guaranteed to work on all files opened in all +- // buffering modes. Although we internally mutate the +- // state of the file, we restore everything, which +- // justifies the cast. +- auto mutableFP = (cast(File*) &file).getFP(); +- auto c = fgetc(mutableFP); ++ // buffering modes. ++ auto fp = file.getFP(); ++ auto c = fgetc(fp); + if (c == -1) + { ++ file.detach(); + return true; + } +- ungetc(c, mutableFP) == c ++ ungetc(c, fp) == c + || assert(false, "Bug in cstdlib implementation"); + return false; + } + +- /// Ditto + @property Char[] front() + { + if (first_call) +@@ -1050,7 +1198,6 @@ Range that reads one line at a time. */ + return line; + } + +- /// Ditto + void popFront() + { + assert(file.isOpen); +@@ -1064,19 +1211,91 @@ Range that reads one line at a time. */ + else if (keepTerminator == KeepTerminator.no + && std.algorithm.endsWith(line, terminator)) + { +- line = line.ptr[0 .. line.length - 1]; ++ static if (isScalarType!Terminator) ++ enum tlen = 1; ++ else static if (isArray!Terminator) ++ { ++ static assert( ++ is(Unqual!(ElementEncodingType!Terminator) == Char)); ++ const tlen = terminator.length; ++ } ++ else ++ static assert(false); ++ line = line.ptr[0 .. line.length - tlen]; + } + } + } + + /** +-Convenience function that returns the $(D LinesReader) corresponding +-to this file. */ +- ByLine!(Char, Terminator) byLine(Terminator = char, Char = char) ++Returns an input range set up to read from the file handle one line ++at a time. ++ ++The element type for the range will be $(D Char[]). Range primitives ++may throw $(D StdioException) on I/O error. ++ ++Note: ++Each $(D front) will not persist after $(D ++popFront) is called, so the caller must copy its contents (e.g. by ++calling $(D to!string)) if retention is needed. ++ ++Params: ++Char = Character type for each line, defaulting to $(D char). ++keepTerminator = Use $(D KeepTerminator.yes) to include the ++terminator at the end of each line. ++terminator = Line separator ($(D '\n') by default). ++ ++Example: ++---- ++import std.algorithm, std.stdio, std.string; ++// Count words in a file using ranges. ++void main() ++{ ++ auto file = File("file.txt"); // Open for reading ++ const wordCount = file.byLine() // Read lines ++ .map!split // Split into words ++ .map!(a => a.length) // Count words per line ++ .reduce!((a, b) => a + b); // Total word count ++ writeln(wordCount); ++} ++---- ++ ++Example: ++---- ++import std.range, std.stdio; ++// Read lines using foreach. ++void main() ++{ ++ auto file = File("file.txt"); // Open for reading ++ auto range = file.byLine(); ++ // Print first three lines ++ foreach (line; range.take(3)) ++ writeln(line); ++ // Print remaining lines beginning with '#' ++ foreach (line; range) ++ { ++ if (!line.empty && line[0] == '#') ++ writeln(line); ++ } ++} ++---- ++Notice that neither example accesses the line data returned by ++$(D front) after the corresponding $(D popFront) call is made (because ++the contents may well have changed). ++*/ ++ auto byLine(Terminator = char, Char = char) + (KeepTerminator keepTerminator = KeepTerminator.no, + Terminator terminator = '\n') ++ if (isScalarType!Terminator) + { +- return typeof(return)(this, keepTerminator, terminator); ++ return ByLine!(Char, Terminator)(this, keepTerminator, terminator); ++ } ++ ++/// ditto ++ auto byLine(Terminator, Char = char) ++ (KeepTerminator keepTerminator, Terminator terminator) ++ if (is(Unqual!(ElementEncodingType!Terminator) == Char)) ++ { ++ return ByLine!(Char, Terminator)(this, keepTerminator, terminator); + } + + unittest +@@ -1093,11 +1312,11 @@ to this file. */ + { + assert(false); + } +- f.close(); ++ f.detach(); ++ assert(!f.isOpen); + +- void test(string txt, string[] witness, +- KeepTerminator kt = KeepTerminator.no, +- bool popFirstLine = false) ++ void testTerm(Terminator)(string txt, string[] witness, ++ KeepTerminator kt, Terminator term, bool popFirstLine) + { + uint i; + std.file.write(deleteme, txt); +@@ -1107,30 +1326,72 @@ to this file. */ + f.close(); + assert(!f.isOpen); + } +- auto lines = f.byLine(kt); ++ auto lines = f.byLine(kt, term); + if (popFirstLine) + { + lines.popFront(); + i = 1; + } ++ assert(lines.empty || lines.front is lines.front); + foreach (line; lines) + { + assert(line == witness[i++]); + } + assert(i == witness.length, text(i, " != ", witness.length)); + } ++ /* Wrap with default args. ++ * Note: Having a default argument for terminator = '\n' would prevent ++ * instantiating Terminator=string (or "\n" would prevent Terminator=char) */ ++ void test(string txt, string[] witness, ++ KeepTerminator kt = KeepTerminator.no, ++ bool popFirstLine = false) ++ { ++ testTerm(txt, witness, kt, '\n', popFirstLine); ++ } + + test("", null); + test("\n", [ "" ]); + test("asd\ndef\nasdf", [ "asd", "def", "asdf" ]); + test("asd\ndef\nasdf", [ "asd", "def", "asdf" ], KeepTerminator.no, true); + test("asd\ndef\nasdf\n", [ "asd", "def", "asdf" ]); ++ test("foo", [ "foo" ], KeepTerminator.no, true); ++ testTerm("bob\r\nmarge\r\nsteve\r\n", ["bob", "marge", "steve"], ++ KeepTerminator.no, "\r\n", false); ++ testTerm("sue\r", ["sue"], KeepTerminator.no, '\r', false); + + test("", null, KeepTerminator.yes); + test("\n", [ "\n" ], KeepTerminator.yes); + test("asd\ndef\nasdf", [ "asd\n", "def\n", "asdf" ], KeepTerminator.yes); + test("asd\ndef\nasdf\n", [ "asd\n", "def\n", "asdf\n" ], KeepTerminator.yes); + test("asd\ndef\nasdf\n", [ "asd\n", "def\n", "asdf\n" ], KeepTerminator.yes, true); ++ test("foo", [ "foo" ], KeepTerminator.yes, false); ++ testTerm("bob\r\nmarge\r\nsteve\r\n", ["bob\r\n", "marge\r\n", "steve\r\n"], ++ KeepTerminator.yes, "\r\n", false); ++ testTerm("sue\r", ["sue\r"], KeepTerminator.yes, '\r', false); ++ ++ auto file = File.tmpfile(); ++ file.write("1\n2\n3\n"); ++ ++ // bug 9599 ++ file.rewind(); ++ File.ByLine!(char, char) fbl = file.byLine(); ++ auto fbl2 = fbl; ++ assert(fbl.front == "1"); ++ assert(fbl.front is fbl2.front); ++ assert(fbl.take(1).equal(["1"])); ++ assert(fbl.equal(["2", "3"])); ++ assert(fbl.empty); ++ assert(file.isOpen); // we still have a valid reference ++ ++ file.rewind(); ++ fbl = file.byLine(); ++ assert(!fbl.drop(2).empty); ++ assert(fbl.equal(["3"])); ++ assert(fbl.empty); ++ assert(file.isOpen); ++ ++ file.detach(); ++ assert(!file.isOpen); + } + + template byRecord(Fields...) +@@ -1160,7 +1421,8 @@ to this file. */ + } + + +- /** ++ // Note: This was documented until 2013/08 ++ /* + * Range that reads a chunk at a time. + */ + struct ByChunk +@@ -1186,7 +1448,7 @@ to this file. */ + + + /// Range primitive operations. +- @property ++ @property nothrow + bool empty() const + { + return !file_.isOpen; +@@ -1194,9 +1456,10 @@ to this file. */ + + + /// Ditto +- @property +- nothrow ubyte[] front() ++ @property nothrow ++ ubyte[] front() + { ++ version(assert) if (empty) throw new RangeError(); + return chunk_; + } + +@@ -1204,7 +1467,7 @@ to this file. */ + /// Ditto + void popFront() + { +- enforce(!empty, "Cannot call popFront on empty range"); ++ version(assert) if (empty) throw new RangeError(); + + chunk_ = file_.rawRead(chunk_); + if (chunk_.length == 0) +@@ -1213,10 +1476,17 @@ to this file. */ + } + + /** +-Iterates through a file a chunk at a time by using $(D foreach). ++Returns an input range set up to read from the file handle a chunk at a ++time. + +-Example: ++The element type for the range will be $(D ubyte[]). Range primitives ++may throw $(D StdioException) on I/O error. + ++Note: Each $(D front) will not persist after $(D ++popFront) is called, so the caller must copy its contents (e.g. by ++calling $(D buffer.dup)) if retention is needed. ++ ++Example: + --------- + void main() + { +@@ -1226,15 +1496,22 @@ void main() + } + } + --------- +- + The content of $(D buffer) is reused across calls. In the example + above, $(D buffer.length) is 4096 for all iterations, except for the + last one, in which case $(D buffer.length) may be less than 4096 (but + always greater than zero). + +-In case of an I/O error, an $(D StdioException) is thrown. ++Example: ++--- ++import std.algorithm, std.stdio; ++ ++void main() ++{ ++ stdin.byChunk(1024).copy(stdout.lockingTextWriter()); ++} ++--- + */ +- ByChunk byChunk(size_t chunkSize) ++ auto byChunk(size_t chunkSize) + { + return ByChunk(this, chunkSize); + } +@@ -1262,7 +1539,8 @@ In case of an I/O error, an $(D StdioExc + assert(i == witness.length); + } + +-/** ++// Note: This was documented until 2013/08 ++/* + $(D Range) that locks the file and allows fast writing to it. + */ + struct LockingTextWriter +@@ -1282,15 +1560,20 @@ $(D Range) that locks the file and allow + + ~this() + { +- FUNLOCK(fps); +- fps = null; +- handle = null; ++ if(fps) ++ { ++ FUNLOCK(fps); ++ fps = null; ++ handle = null; ++ } + } + + this(this) + { +- enforce(fps); +- FLOCK(fps); ++ if(fps) ++ { ++ FLOCK(fps); ++ } + } + + /// Range primitive implementations. +@@ -1396,8 +1679,11 @@ $(D Range) that locks the file and allow + } + } + +-/// Convenience function. +- @property LockingTextWriter lockingTextWriter() ++/** Returns an output range that locks the file and allows fast writing to it. ++ ++See $(LREF byChunk) for an example. ++*/ ++ auto lockingTextWriter() + { + return LockingTextWriter(this); + } +@@ -1472,13 +1758,13 @@ struct LockingTextReader + + @property dchar front() + { +- enforce(!empty); ++ version(assert) if (empty) throw new RangeError(); + return _crt; + } + + void popFront() + { +- enforce(!empty); ++ version(assert) if (empty) throw new RangeError(); + if (FGETC(cast(_iobuf*) _f._p.handle) == -1) + { + enforce(_f.eof); +@@ -1752,6 +2038,19 @@ unittest + "A\nB\nA\nB\nA\nB\nA\nB\n"); + } + ++unittest ++{ ++ static auto useInit(T)(T ltw) ++ { ++ T val; ++ val = ltw; ++ val = T.init; ++ return val; ++ } ++ useInit(stdout.lockingTextWriter()); ++} ++ ++ + /*********************************** + * If the first argument $(D args[0]) is a $(D FILE*), use + * $(LINK2 std_format.html#format-string, the format specifier) in +@@ -1886,40 +2185,102 @@ unittest + } + + /********************************** +- * Read line from stream $(D fp). ++ * Read line from $(D stdin). ++ * ++ * This version manages its own read buffer, which means one memory allocation per call. If you are not ++ * retaining a reference to the read data, consider the $(D readln(buf)) version, which may offer ++ * better performance as it can reuse its read buffer. ++ * + * Returns: +- * $(D null) for end of file, +- * $(D char[]) for line read from $(D fp), including terminating character ++ * The line that was read, including the line terminator character. + * Params: +- * $(D fp) = input stream +- * $(D terminator) = line terminator, '\n' by default ++ * S = Template parameter; the type of the allocated buffer, and the type returned. Defaults to $(D string). ++ * terminator = line terminator (by default, '\n') + * Throws: +- * $(D StdioException) on error ++ * $(D StdioException) on I/O error, or $(D UnicodeException) on Unicode conversion error. + * Example: + * Reads $(D stdin) and writes it to $(D stdout). + --- + import std.stdio; + +-int main() ++void main() + { +- string buf; +- while ((buf = stdin.readln()) !is null) ++ string line; ++ while ((line = readln()) !is null) ++ write(line); ++} ++--- ++*/ ++S readln(S = string)(dchar terminator = '\n') ++if (isSomeString!S) ++{ ++ return stdin.readln!S(terminator); ++} ++ ++/********************************** ++ * Read line from $(D stdin) and write it to buf[], including terminating character. ++ * ++ * This can be faster than $(D line = readln()) because you can reuse ++ * the buffer for each call. Note that reusing the buffer means that you ++ * must copy the previous contents if you wish to retain them. ++ * ++ * Returns: ++ * $(D size_t) 0 for end of file, otherwise number of characters read ++ * Params: ++ * buf = Buffer used to store the resulting line data. buf is resized as necessary. ++ * terminator = line terminator (by default, '\n') ++ * Throws: ++ * $(D StdioException) on I/O error, or $(D UnicodeException) on Unicode conversion error. ++ * Example: ++ * Reads $(D stdin) and writes it to $(D stdout). ++--- ++import std.stdio; ++ ++void main() ++{ ++ char[] buf; ++ while (readln(buf)) + write(buf); +- return 0; + } + --- + */ +-string readln(dchar terminator = '\n') ++size_t readln(C)(ref C[] buf, dchar terminator = '\n') ++if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum)) + { +- return stdin.readln(terminator); ++ return stdin.readln(buf, terminator); + } + + /** ditto */ +-size_t readln(ref char[] buf, dchar terminator = '\n') ++size_t readln(C, R)(ref C[] buf, R terminator) ++if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum) && ++ isBidirectionalRange!R && is(typeof(terminator.front == dchar.init))) + { + return stdin.readln(buf, terminator); + } + ++unittest ++{ ++ //we can't actually test readln, so at the very least, ++ //we test compilability ++ void foo() ++ { ++ readln(); ++ readln('\t'); ++ foreach (String; TypeTuple!(string, char[], wstring, wchar[], dstring, dchar[])) ++ { ++ readln!String(); ++ readln!String('\t'); ++ } ++ foreach (String; TypeTuple!(char[], wchar[], dchar[])) ++ { ++ String buf; ++ readln(buf); ++ readln(buf, '\t'); ++ readln(buf, "
"); ++ } ++ } ++} ++ + /* + * Convenience function that forwards to $(D core.stdc.stdio.fopen) + * (to $(D _wfopen) on Windows) +@@ -2239,18 +2600,17 @@ unittest + } + + /** +-Iterates through a file a chunk at a time by using $(D +-foreach). ++Iterates through a file a chunk at a time by using $(D foreach). + + Example: + + --------- + void main() + { +- foreach (ubyte[] buffer; chunks(stdin, 4096)) +- { +- ... use buffer ... +- } ++ foreach (ubyte[] buffer; chunks(stdin, 4096)) ++ { ++ ... use buffer ... ++ } + } + --------- + +@@ -2261,8 +2621,11 @@ The content of $(D buffer) is reused acr + + In case of an I/O error, an $(D StdioException) is thrown. + */ +- +-struct chunks ++auto chunks(File f, size_t size) ++{ ++ return ChunksImpl(f, size); ++} ++private struct ChunksImpl + { + private File f; + private size_t size; +@@ -2290,7 +2653,7 @@ struct chunks + + int opApply(D)(scope D dg) + { +- const maxStackSize = 1024 * 16; ++ enum maxStackSize = 1024 * 16; + ubyte[] buffer = void; + if (size < maxStackSize) + buffer = (cast(ubyte*) alloca(size))[0 .. size]; +@@ -2322,7 +2685,7 @@ struct chunks + + unittest + { +- //printf("Entering test at line %d\n", __LINE__); ++ //printf("Entering test at line %d\n", __LINE__); + scope(failure) printf("Failed test at line %d\n", __LINE__); + auto deleteme = testFilename(); + scope(exit) { std.file.remove(deleteme); } +@@ -2365,6 +2728,8 @@ Initialize with a message and an error c + errno = e; + version (Posix) + { ++ import std.c.string : strerror_r; ++ + char[256] buf = void; + version (linux) + { +@@ -2378,10 +2743,13 @@ Initialize with a message and an error c + } + else + { +- auto s = std.c.string.strerror(errno); ++ auto s = core.stdc.string.strerror(errno); + } + auto sysmsg = to!string(s); +- super(message ? message ~ "(" ~ sysmsg ~ ")" : sysmsg); ++ // If e is 0, we don't use the system error message. (The message ++ // is "Success", which is rather pointless for an exception.) ++ super(e == 0 ? message ++ : (message ? message ~ " (" ~ sysmsg ~ ")" : sysmsg)); + } + + /** Convenience functions that throw an $(D StdioException). */ +@@ -2887,18 +3255,22 @@ private size_t readlnImpl(FILE* fps, ref + Bugs: + Only works on Linux + */ +-version(linux) { ++version(linux) ++{ + static import linux = std.c.linux.linux; + static import sock = std.c.linux.socket; ++ import core.stdc.string : memcpy; + +- File openNetwork(string host, ushort port) { ++ File openNetwork(string host, ushort port) ++ { + auto h = enforce( sock.gethostbyname(std.string.toStringz(host)), + new StdioException("gethostbyname")); + + int s = sock.socket(sock.AF_INET, sock.SOCK_STREAM, 0); + enforce(s != -1, new StdioException("socket")); + +- scope(failure) { ++ scope(failure) ++ { + linux.close(s); // want to make sure it doesn't dangle if + // something throws. Upon normal exit, the + // File struct's reference counting takes +@@ -2910,7 +3282,7 @@ version(linux) { + + addr.sin_family = sock.AF_INET; + addr.sin_port = sock.htons(port); +- std.c.string.memcpy(&addr.sin_addr.s_addr, h.h_addr, h.h_length); ++ core.stdc.string.memcpy(&addr.sin_addr.s_addr, h.h_addr, h.h_length); + + enforce(sock.connect(s, cast(sock.sockaddr*) &addr, addr.sizeof) != -1, + new StdioException("Connect failed")); +--- a/src/libphobos/src/std/stream.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/stream.d 2014-04-01 16:32:51.000000000 +0100 +@@ -88,10 +88,7 @@ private { + import std.utf; + import core.bitop; // for bswap + import core.vararg; +-} +- +-version (Windows) { +- private import std.file; ++ import std.file; + } + + /// InputStream is the interface for readable streams. +@@ -1175,10 +1172,7 @@ class Stream : InputStream, OutputStream + } + else version (Win64) + size_t printf(const(char)[] format, ...) { +- va_list ap; +- ap = cast(va_list) &format; +- ap += format.sizeof; +- return vprintf(format, ap); ++ return vprintf(format, _argptr); + } + else version (X86_64) + size_t printf(const(char)[] format, ...) { +--- a/src/libphobos/src/std/string.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/string.d 2014-04-01 16:32:51.000000000 +0100 +@@ -24,11 +24,12 @@ Source: $(PHOBOSSRC std/_string.d) + module std.string; + + //debug=string; // uncomment to turn on debugging printf's ++debug(string) import core.stdc.stdio; + + import core.exception : RangeError, onRangeError; + import core.vararg, core.stdc.stdlib, core.stdc.string, + std.algorithm, std.ascii, std.conv, std.exception, std.format, std.functional, +- std.metastrings, std.range, std.regex, std.traits, ++ std.range, std.traits, + std.typecons, std.typetuple, std.uni, std.utf; + + //Remove when repeat is finally removed. They're only here as part of the +@@ -61,120 +62,32 @@ class StringException : Exception + this(string msg, + string file = __FILE__, + size_t line = __LINE__, +- Throwable next = null) ++ Throwable next = null) @safe pure nothrow + { + super(msg, file, line, next); + } + } + +-/* ************* Constants *************** */ +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.ascii.hexDigits instead.") immutable char[16] hexdigits = "0123456789ABCDEF"; +-deprecated("Please use std.ascii.digits instead.") immutable digits = "0123456789"; +-deprecated("Please use std.ascii.octalDigits instead.") immutable char[8] octdigits = "01234567"; +-deprecated("Please use std.ascii.lowercase instead.") immutable char[26] lowercase = "abcdefghijklmnopqrstuvwxyz"; +-deprecated("Please use std.ascii.letters instead.") immutable char[52] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +-deprecated("Please use std.ascii.uppercase instead.") immutable char[26] uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +-deprecated("Please use std.ascii.whitespace instead.") alias std.ascii.whitespace whitespace; +-deprecated("Please use std.uni.lineSep instead.") enum dchar LS = '\u2028'; +-deprecated("Please use std.uni.paraSep instead.") enum dchar PS = '\u2029'; +-deprecated("Please use std.ascii.newline instead.") alias std.ascii.newline newline; +-deprecated("Please use std.uni.isWhite instead.") bool iswhite(dchar c) +-{ +- return c <= 0x7F +- ? indexOf(whitespace, c) != -1 +- : (c == paraSep || c == lineSep); +-} +- + + /++ + Compares two ranges of characters lexicographically. The comparison is +- case insensitive. Use $(D XREF algorithm, cmp) for a case sensitive +- comparison. $(D icmp) works like $(D XREF algorithm, cmp) except that it +- converts characters to lowercase prior to applying ($D pred). Technically, +- $(D icmp(r1, r2)) is equivalent to +- $(D cmp!"std.uni.toLower(a) < std.uni.toLower(b)"(r1, r2)). ++ case insensitive. Use $(XREF algorithm, cmp) for a case sensitive ++ comparison. For details see $(XREF uni, icmp). + + $(BOOKTABLE, + $(TR $(TD $(D < 0)) $(TD $(D s1 < s2) )) + $(TR $(TD $(D = 0)) $(TD $(D s1 == s2))) + $(TR $(TD $(D > 0)) $(TD $(D s1 > s2))) + ) +- +/ +-int icmp(alias pred = "a < b", S1, S2)(S1 s1, S2 s2) +- if(isSomeString!S1 && isSomeString!S2) +-{ +- static if(is(typeof(pred) : string)) +- enum isLessThan = pred == "a < b"; +- else +- enum isLessThan = false; +- +- size_t i, j; +- while(i < s1.length && j < s2.length) +- { +- immutable c1 = std.uni.toLower(decode(s1, i)); +- immutable c2 = std.uni.toLower(decode(s2, j)); +- +- static if(isLessThan) +- { +- if(c1 != c2) +- { +- if(c1 < c2) return -1; +- if(c1 > c2) return 1; +- } +- } +- else +- { +- if(binaryFun!pred(c1, c2)) return -1; +- if(binaryFun!pred(c2, c1)) return 1; +- } +- } +- +- if(i < s1.length) return 1; +- if(j < s2.length) return -1; +- +- return 0; +-} +- +-int icmp(alias pred = "a < b", S1, S2)(S1 s1, S2 s2) +- if(!(isSomeString!S1 && isSomeString!S2) && +- isForwardRange!S1 && is(Unqual!(ElementType!S1) == dchar) && +- isForwardRange!S2 && is(Unqual!(ElementType!S2) == dchar)) +-{ +- static if(is(typeof(pred) : string)) +- enum isLessThan = pred == "a < b"; +- else +- enum isLessThan = false; +- +- for(;; s1.popFront(), s2.popFront()) +- { +- if(s1.empty) return s2.empty ? 0 : -1; +- if(s2.empty) return 1; +- +- immutable c1 = std.uni.toLower(s1.front); +- immutable c2 = std.uni.toLower(s2.front); +- +- static if(isLessThan) +- { +- if(c1 != c2) +- { +- if(c1 < c2) return -1; +- if(c1 > c2) return 1; +- } +- } +- else +- { +- if(binaryFun!pred(c1, c2)) return -1; +- if(binaryFun!pred(c2, c1)) return 1; +- } +- } +-} +++/ ++alias icmp = std.uni.icmp; + + unittest + { + debug(string) printf("string.icmp.unittest\n"); + ++ assertCTFEable!( ++ { + assert(icmp("Ü", "ü") == 0, "Über failure"); + assert(icmp("abc", "abc") == 0); + assert(icmp("ABC", "abc") == 0); +@@ -220,6 +133,7 @@ unittest + assert(icmp("\u0430\u0410\u0543"d, filter!"true"("\u0430\u0410\u0544")) < 0); + assert(icmp(filter!"true"("\u0430\u0411\u0543"d), filter!"true"("\u0430\u0411\u0543\u0237")) < 0); + assert(icmp(filter!"true"("\u0430\u0411\u0543\u0237"d), filter!"true"("\u0430\u0411\u0543")) > 0); ++ }); + } + + +@@ -300,9 +214,12 @@ unittest + { + debug(string) printf("string.toStringz.unittest\n"); + ++ // TODO: CTFEable toStringz is really necessary? ++ //assertCTFEable!( ++ //{ + auto p = toStringz("foo"); + assert(strlen(p) == 3); +- const(char) foo[] = "abbzxyzzy"; ++ const(char)[] foo = "abbzxyzzy"; + p = toStringz(foo[3..5]); + assert(strlen(p) == 2); + +@@ -317,6 +234,7 @@ unittest + test = "foo\0"; + p = toStringz(test); + assert(p[0] == 'f' && p[1] == 'o' && p[2] == 'o' && p[3] == 0); ++ //}); + } + + +@@ -333,18 +251,19 @@ enum CaseSensitive { no, yes } + +/ + ptrdiff_t indexOf(Char)(in Char[] s, + dchar c, +- CaseSensitive cs = CaseSensitive.yes) pure +- if(isSomeChar!Char) ++ CaseSensitive cs = CaseSensitive.yes) @safe pure ++ if (isSomeChar!Char) + { + if (cs == CaseSensitive.yes) + { + static if (Char.sizeof == 1) + { +- if (std.ascii.isASCII(c)) ++ if (std.ascii.isASCII(c) && !__ctfe) + { // Plain old ASCII +- auto p = cast(char*)memchr(s.ptr, c, s.length); ++ auto trustedmemchr() @trusted { return cast(Char*)memchr(s.ptr, c, s.length); } ++ auto p = trustedmemchr(); + if (p) +- return p - cast(char *)s; ++ return p - s.ptr; + else + return -1; + } +@@ -389,6 +308,8 @@ unittest + { + debug(string) printf("string.indexOf.unittest\n"); + ++ assertCTFEable!( ++ { + foreach (S; TypeTuple!(string, wstring, dstring)) + { + assert(indexOf(cast(S)null, cast(dchar)'a') == -1); +@@ -400,6 +321,7 @@ unittest + assert(indexOf(to!S("def"), cast(dchar)'a', CaseSensitive.no) == -1); + assert(indexOf(to!S("Abba"), cast(dchar)'a', CaseSensitive.no) == 0); + assert(indexOf(to!S("def"), cast(dchar)'F', CaseSensitive.no) == 2); ++ assert(indexOf(to!S("ödef"), 'ö', CaseSensitive.no) == 0); + + S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; + assert(indexOf("def", cast(char)'f', CaseSensitive.no) == 2); +@@ -407,12 +329,78 @@ unittest + assert(indexOf(sPlts, cast(char)'R', CaseSensitive.no) == 2); + } + +- foreach(cs; EnumMembers!CaseSensitive) ++ foreach (cs; EnumMembers!CaseSensitive) + { + assert(indexOf("hello\U00010143\u0100\U00010143", '\u0100', cs) == 9); + assert(indexOf("hello\U00010143\u0100\U00010143"w, '\u0100', cs) == 7); + assert(indexOf("hello\U00010143\u0100\U00010143"d, '\u0100', cs) == 6); + } ++ }); ++} ++ ++/++ ++ Returns the index of the first occurence of $(D c) in $(D s) with respect ++ to the start index $(D startIdx). If $(D c) is not found, then $(D -1) is ++ returned. If $(D c) is found the value of the returned index is at least ++ $(D startIdx). $(D startIdx) represents a codeunit index in $(D s). If the ++ sequence starting at $(D startIdx) does not represent a well formed codepoint, ++ then a $(XREF utf,UTFException) may be thrown. ++ ++ $(D cs) indicates whether the comparisons are case sensitive. ++ +/ ++ptrdiff_t indexOf(Char)(const(Char)[] s, dchar c, const size_t startIdx, ++ CaseSensitive cs = CaseSensitive.yes) @safe pure ++ if (isSomeChar!Char) ++{ ++ if (startIdx < s.length) ++ { ++ ptrdiff_t foundIdx = indexOf(s[startIdx .. $], c, cs); ++ if (foundIdx != -1) ++ { ++ return foundIdx + cast(ptrdiff_t)startIdx; ++ } ++ } ++ return -1; ++} ++ ++unittest ++{ ++ debug(string) printf("string.indexOf(startIdx).unittest\n"); ++ ++ foreach (S; TypeTuple!(string, wstring, dstring)) ++ { ++ assert(indexOf(cast(S)null, cast(dchar)'a', 1) == -1); ++ assert(indexOf(to!S("def"), cast(dchar)'a', 1) == -1); ++ assert(indexOf(to!S("abba"), cast(dchar)'a', 1) == 3); ++ assert(indexOf(to!S("def"), cast(dchar)'f', 1) == 2); ++ ++ assert((to!S("def")).indexOf(cast(dchar)'a', 1, ++ CaseSensitive.no) == -1); ++ assert(indexOf(to!S("def"), cast(dchar)'a', 1, ++ CaseSensitive.no) == -1); ++ assert(indexOf(to!S("def"), cast(dchar)'a', 12, ++ CaseSensitive.no) == -1); ++ assert(indexOf(to!S("AbbA"), cast(dchar)'a', 2, ++ CaseSensitive.no) == 3); ++ assert(indexOf(to!S("def"), cast(dchar)'F', 2, CaseSensitive.no) == 2); ++ ++ S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; ++ assert(indexOf("def", cast(char)'f', cast(uint)2, ++ CaseSensitive.no) == 2); ++ assert(indexOf(sPlts, cast(char)'P', 12, CaseSensitive.no) == 23); ++ assert(indexOf(sPlts, cast(char)'R', cast(ulong)1, ++ CaseSensitive.no) == 2); ++ } ++ ++ foreach(cs; EnumMembers!CaseSensitive) ++ { ++ assert(indexOf("hello\U00010143\u0100\U00010143", '\u0100', 2, cs) ++ == 9); ++ assert(indexOf("hello\U00010143\u0100\U00010143"w, '\u0100', 3, cs) ++ == 7); ++ assert(indexOf("hello\U00010143\u0100\U00010143"d, '\u0100', 6, cs) ++ == 6); ++ } + } + + /++ +@@ -424,7 +412,7 @@ unittest + ptrdiff_t indexOf(Char1, Char2)(const(Char1)[] s, + const(Char2)[] sub, + CaseSensitive cs = CaseSensitive.yes) +- if(isSomeChar!Char1 && isSomeChar!Char2) ++ if (isSomeChar!Char1 && isSomeChar!Char2) + { + const(Char1)[] balance; + if (cs == CaseSensitive.yes) +@@ -434,7 +422,7 @@ ptrdiff_t indexOf(Char1, Char2)(const(Ch + else + { + balance = std.algorithm.find! +- ((dchar a, dchar b){return std.uni.toLower(a) == std.uni.toLower(b);}) ++ ((a, b) => std.uni.toLower(a) == std.uni.toLower(b)) + (s, sub); + } + return balance.empty ? -1 : balance.ptr - s.ptr; +@@ -444,9 +432,11 @@ unittest + { + debug(string) printf("string.indexOf.unittest\n"); + +- foreach(S; TypeTuple!(string, wstring, dstring)) ++ assertCTFEable!( + { +- foreach(T; TypeTuple!(string, wstring, dstring)) ++ foreach (S; TypeTuple!(string, wstring, dstring)) ++ { ++ foreach (T; TypeTuple!(string, wstring, dstring)) + { + assert(indexOf(cast(S)null, to!T("a")) == -1); + assert(indexOf(to!S("def"), to!T("a")) == -1); +@@ -479,15 +469,98 @@ unittest + to!T("page-break-before"), CaseSensitive.no) == -1); + } + +- foreach(cs; EnumMembers!CaseSensitive) ++ foreach (cs; EnumMembers!CaseSensitive) + { + assert(indexOf("hello\U00010143\u0100\U00010143", to!S("\u0100"), cs) == 9); + assert(indexOf("hello\U00010143\u0100\U00010143"w, to!S("\u0100"), cs) == 7); + assert(indexOf("hello\U00010143\u0100\U00010143"d, to!S("\u0100"), cs) == 6); + } + } ++ }); + } + ++/++ ++ Returns the index of the first occurence of $(D sub) in $(D s) with ++ respect to the start index $(D startIdx). If $(D sub) is not found, then ++ $(D -1) is returned. If $(D sub) is found the value of the returned index ++ is at least $(D startIdx). $(D startIdx) represents a codeunit index in ++ $(D s). If the sequence starting at $(D startIdx) does not represent a well ++ formed codepoint, then a $(XREF utf,UTFException) may be thrown. ++ ++ $(D cs) indicates whether the comparisons are case sensitive. ++ +/ ++ptrdiff_t indexOf(Char1, Char2)(const(Char1)[] s, const(Char2)[] sub, ++ const size_t startIdx, CaseSensitive cs = CaseSensitive.yes) ++ if (isSomeChar!Char1 && isSomeChar!Char2) ++{ ++ if (startIdx < s.length) ++ { ++ ptrdiff_t foundIdx = indexOf(s[startIdx .. $], sub, cs); ++ if (foundIdx != -1) ++ { ++ return foundIdx + cast(ptrdiff_t)startIdx; ++ } ++ } ++ return -1; ++} ++ ++unittest ++{ ++ debug(string) printf("string.indexOf(startIdx).unittest\n"); ++ ++ foreach(S; TypeTuple!(string, wstring, dstring)) ++ { ++ foreach(T; TypeTuple!(string, wstring, dstring)) ++ { ++ assert(indexOf(cast(S)null, to!T("a"), 1337) == -1); ++ assert(indexOf(to!S("def"), to!T("a"), 0) == -1); ++ assert(indexOf(to!S("abba"), to!T("a"), 2) == 3); ++ assert(indexOf(to!S("def"), to!T("f"), 1) == 2); ++ assert(indexOf(to!S("dfefffg"), to!T("fff"), 1) == 3); ++ assert(indexOf(to!S("dfeffgfff"), to!T("fff"), 5) == 6); ++ ++ assert(indexOf(to!S("dfeffgfff"), to!T("a"), 1, CaseSensitive.no) == -1); ++ assert(indexOf(to!S("def"), to!T("a"), 2, CaseSensitive.no) == -1); ++ assert(indexOf(to!S("abba"), to!T("a"), 3, CaseSensitive.no) == 3); ++ assert(indexOf(to!S("def"), to!T("f"), 1, CaseSensitive.no) == 2); ++ assert(indexOf(to!S("dfefffg"), to!T("fff"), 2, CaseSensitive.no) == 3); ++ assert(indexOf(to!S("dfeffgfff"), to!T("fff"), 4, CaseSensitive.no) == 6); ++ assert(indexOf(to!S("dfeffgffföä"), to!T("öä"), 9, CaseSensitive.no) == 9, ++ to!string(indexOf(to!S("dfeffgffföä"), to!T("öä"), 9, CaseSensitive.no)) ++ ~ " " ~ S.stringof ~ " " ~ T.stringof); ++ ++ S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; ++ S sMars = "Who\'s \'My Favorite Maritian?\'"; ++ ++ assert(indexOf(sMars, to!T("MY fAVe"), 10, ++ CaseSensitive.no) == -1); ++ assert(indexOf(sMars, to!T("mY fAVOriTe"), 4, CaseSensitive.no) == 7); ++ assert(indexOf(sPlts, to!T("mArS:"), 0, CaseSensitive.no) == 0); ++ assert(indexOf(sPlts, to!T("rOcK"), 12, CaseSensitive.no) == 17); ++ assert(indexOf(sPlts, to!T("Un."), 32, CaseSensitive.no) == 41); ++ assert(indexOf(sPlts, to!T(sPlts), 0, CaseSensitive.no) == 0); ++ ++ assert(indexOf("\u0100", to!T("\u0100"), 0, CaseSensitive.no) == 0); ++ ++ // Thanks to Carlos Santander B. and zwang ++ assert(indexOf("sus mejores cortesanos. Se embarcaron en el puerto de Dubai y", ++ to!T("page-break-before"), 10, CaseSensitive.no) == -1); ++ ++ // In order for indexOf with and without index to be consistent ++ assert(indexOf(to!S(""), to!T("")) == indexOf(to!S(""), to!T(""), 0)); ++ } ++ ++ foreach(cs; EnumMembers!CaseSensitive) ++ { ++ assert(indexOf("hello\U00010143\u0100\U00010143", to!S("\u0100"), ++ 3, cs) == 9); ++ assert(indexOf("hello\U00010143\u0100\U00010143"w, to!S("\u0100"), ++ 3, cs) == 7); ++ assert(indexOf("hello\U00010143\u0100\U00010143"d, to!S("\u0100"), ++ 3, cs) == 6); ++ } ++ } ++} + + /++ + Returns the index of the last occurence of $(D c) in $(D s). If $(D c) +@@ -498,54 +571,57 @@ unittest + ptrdiff_t lastIndexOf(Char)(const(Char)[] s, + dchar c, + CaseSensitive cs = CaseSensitive.yes) +- if(isSomeChar!Char) ++ if (isSomeChar!Char) + { +- if(cs == CaseSensitive.yes) ++ if (cs == CaseSensitive.yes) + { +- if(cast(dchar)(cast(Char)c) == c) ++ if (std.ascii.isASCII(c)) + { +- for(auto i = s.length; i-- != 0;) ++ foreach_reverse (i, it; s) + { +- if(s[i] == c) +- return cast(ptrdiff_t)i; ++ if (it == c) ++ { ++ return i; ++ } + } + } + else + { +- for(size_t i = s.length; !s.empty;) ++ foreach_reverse (i, dchar it; s) + { +- if(s.back == c) +- return cast(ptrdiff_t)i - codeLength!Char(c); +- +- i -= strideBack(s, i); +- s = s[0 .. i]; ++ if (it == c) ++ { ++ return i; ++ } + } + } + } + else + { +- if(std.ascii.isASCII(c)) ++ if (std.ascii.isASCII(c)) + { + immutable c1 = std.ascii.toLower(c); + +- for(auto i = s.length; i-- != 0;) ++ foreach_reverse (i, it; s) + { +- immutable c2 = std.ascii.toLower(s[i]); +- if(c1 == c2) +- return cast(ptrdiff_t)i; ++ immutable c2 = std.ascii.toLower(it); ++ if (c1 == c2) ++ { ++ return i; ++ } + } + } + else + { + immutable c1 = std.uni.toLower(c); + +- for(size_t i = s.length; !s.empty;) ++ foreach_reverse (i, dchar it; s) + { +- if(std.uni.toLower(s.back) == c1) +- return cast(ptrdiff_t)i - codeLength!Char(c); +- +- i -= strideBack(s, i); +- s = s[0 .. i]; ++ immutable c2 = std.uni.toLower(it); ++ if (c1 == c2) ++ { ++ return i; ++ } + } + } + } +@@ -557,17 +633,23 @@ unittest + { + debug(string) printf("string.lastIndexOf.unittest\n"); + +- foreach(S; TypeTuple!(string, wstring, dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!(string, wstring, dstring)) + { + assert(lastIndexOf(cast(S) null, 'a') == -1); + assert(lastIndexOf(to!S("def"), 'a') == -1); + assert(lastIndexOf(to!S("abba"), 'a') == 3); + assert(lastIndexOf(to!S("def"), 'f') == 2); ++ assert(lastIndexOf(to!S("ödef"), 'ö') == 0); + + assert(lastIndexOf(cast(S) null, 'a', CaseSensitive.no) == -1); + assert(lastIndexOf(to!S("def"), 'a', CaseSensitive.no) == -1); + assert(lastIndexOf(to!S("AbbA"), 'a', CaseSensitive.no) == 3); + assert(lastIndexOf(to!S("def"), 'F', CaseSensitive.no) == 2); ++ assert(lastIndexOf(to!S("ödef"), 'ö', CaseSensitive.no) == 0); ++ assert(lastIndexOf(to!S("i\u0100def"), to!dchar("\u0100"), ++ CaseSensitive.no) == 1); + + S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; + +@@ -576,6 +658,61 @@ unittest + assert(lastIndexOf(sPlts, 'S', CaseSensitive.no) == 40); + } + ++ foreach (cs; EnumMembers!CaseSensitive) ++ { ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello", '\u0100', cs) == 4); ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello"w, '\u0100', cs) == 2); ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello"d, '\u0100', cs) == 1); ++ } ++ }); ++} ++ ++/++ ++ Returns the index of the last occurence of $(D c) in $(D s). If $(D c) is ++ not found, then $(D -1) is returned. The $(D startIdx) slices $(D s) in ++ the following way $(D s[0 .. startIdx]). $(D startIdx) represents a ++ codeunit index in $(D s). If the sequence ending at $(D startIdx) does not ++ represent a well formed codepoint, then a $(XREF utf,UTFException) may be ++ thrown. ++ ++ $(D cs) indicates whether the comparisons are case sensitive. ++ +/ ++ptrdiff_t lastIndexOf(Char)(const(Char)[] s, dchar c, const size_t startIdx, ++ CaseSensitive cs = CaseSensitive.yes) ++ if (isSomeChar!Char) ++{ ++ if (startIdx <= s.length) ++ { ++ return lastIndexOf(s[0u .. startIdx], c, cs); ++ } ++ ++ return -1; ++} ++ ++unittest ++{ ++ debug(string) printf("string.lastIndexOf.unittest\n"); ++ ++ foreach(S; TypeTuple!(string, wstring, dstring)) ++ { ++ assert(lastIndexOf(cast(S) null, 'a') == -1); ++ assert(lastIndexOf(to!S("def"), 'a') == -1); ++ assert(lastIndexOf(to!S("abba"), 'a', 3) == 0); ++ assert(lastIndexOf(to!S("deff"), 'f', 3) == 2); ++ ++ assert(lastIndexOf(cast(S) null, 'a', CaseSensitive.no) == -1); ++ assert(lastIndexOf(to!S("def"), 'a', CaseSensitive.no) == -1); ++ assert(lastIndexOf(to!S("AbbAa"), 'a', to!ushort(4), CaseSensitive.no) == 3, ++ to!string(lastIndexOf(to!S("AbbAa"), 'a', 4, CaseSensitive.no))); ++ assert(lastIndexOf(to!S("def"), 'F', 3, CaseSensitive.no) == 2); ++ ++ S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; ++ ++ assert(lastIndexOf(to!S("def"), 'f', 4, CaseSensitive.no) == -1); ++ assert(lastIndexOf(sPlts, 'M', sPlts.length -2, CaseSensitive.no) == 34); ++ assert(lastIndexOf(sPlts, 'S', sPlts.length -2, CaseSensitive.no) == 40); ++ } ++ + foreach(cs; EnumMembers!CaseSensitive) + { + assert(lastIndexOf("\U00010143\u0100\U00010143hello", '\u0100', cs) == 4); +@@ -593,31 +730,46 @@ unittest + ptrdiff_t lastIndexOf(Char1, Char2)(const(Char1)[] s, + const(Char2)[] sub, + CaseSensitive cs = CaseSensitive.yes) +- if(isSomeChar!Char1 && isSomeChar!Char2) ++ if (isSomeChar!Char1 && isSomeChar!Char2) + { +- if(sub.empty) ++ if (sub.empty) + return s.length; + +- if(walkLength(sub) == 1) ++ if (walkLength(sub) == 1) + return lastIndexOf(s, sub.front, cs); + +- if(cs == CaseSensitive.yes) ++ if (cs == CaseSensitive.yes) + { +- static if(is(Unqual!Char1 == Unqual!Char2)) ++ static if (is(Unqual!Char1 == Unqual!Char2)) + { + immutable c = sub[0]; + +- for(ptrdiff_t i = s.length - sub.length; i >= 0; --i) ++ for (ptrdiff_t i = s.length - sub.length; i >= 0; --i) + { +- if(s[i] == c && memcmp(&s[i + 1], &sub[1], sub.length - 1) == 0) +- return i; ++ if (s[i] == c) ++ { ++ if (__ctfe) ++ { ++ foreach (j; 1 .. sub.length) ++ { ++ if (s[i + j] != sub[j]) ++ continue; ++ } ++ return i; ++ } ++ else ++ { ++ if (memcmp(&s[i + 1], &sub[1], sub.length - 1) == 0) ++ return i; ++ } ++ } + } + } + else + { +- for(size_t i = s.length; !s.empty;) ++ for (size_t i = s.length; !s.empty;) + { +- if(s.endsWith(sub)) ++ if (s.endsWith(sub)) + return cast(ptrdiff_t)i - to!(const(Char1)[])(sub).length; + + i -= strideBack(s, i); +@@ -627,10 +779,10 @@ ptrdiff_t lastIndexOf(Char1, Char2)(cons + } + else + { +- for(size_t i = s.length; !s.empty;) ++ for (size_t i = s.length; !s.empty;) + { +- if(endsWith!((dchar a, dchar b) {return std.uni.toLower(a) == std.uni.toLower(b);}) +- (s, sub)) ++ if (endsWith!((a, b) => std.uni.toLower(a) == std.uni.toLower(b)) ++ (s, sub)) + { + return cast(ptrdiff_t)i - to!(const(Char1)[])(sub).length; + } +@@ -647,9 +799,11 @@ unittest + { + debug(string) printf("string.lastIndexOf.unittest\n"); + +- foreach(S; TypeTuple!(string, wstring, dstring)) ++ assertCTFEable!( + { +- foreach(T; TypeTuple!(string, wstring, dstring)) ++ foreach (S; TypeTuple!(string, wstring, dstring)) ++ { ++ foreach (T; TypeTuple!(string, wstring, dstring)) + { + enum typeStr = S.stringof ~ " " ~ T.stringof; + +@@ -662,6 +816,7 @@ unittest + assert(lastIndexOf(to!S("abcdefcdef"), to!T("x")) == -1, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T("xy")) == -1, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T("")) == 10, typeStr); ++ assert(lastIndexOf(to!S("öabcdefcdef"), to!T("ö")) == 0, typeStr); + + assert(lastIndexOf(cast(S)null, to!T("a"), CaseSensitive.no) == -1, typeStr); + assert(lastIndexOf(to!S("abcdefCdef"), to!T("c"), CaseSensitive.no) == 6, typeStr); +@@ -669,11 +824,14 @@ unittest + assert(lastIndexOf(to!S("abcdefcdef"), to!T("x"), CaseSensitive.no) == -1, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T("xy"), CaseSensitive.no) == -1, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T(""), CaseSensitive.no) == 10, typeStr); ++ assert(lastIndexOf(to!S("öabcdefcdef"), to!T("ö"), CaseSensitive.no) == 0, typeStr); + + assert(lastIndexOf(to!S("abcdefcdef"), to!T("c"), CaseSensitive.no) == 6, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T("cd"), CaseSensitive.no) == 6, typeStr); + assert(lastIndexOf(to!S("abcdefcdef"), to!T("def"), CaseSensitive.no) == 7, typeStr); + ++ assert(lastIndexOf(to!S("ödfeffgfff"), to!T("ö"), CaseSensitive.yes) == 0); ++ + S sPlts = "Mars: the fourth Rock (Planet) from the Sun."; + S sMars = "Who\'s \'My Favorite Maritian?\'"; + +@@ -683,7 +841,7 @@ unittest + assert(lastIndexOf(sMars, to!T(sMars), CaseSensitive.no) == 0, typeStr); + } + +- foreach(cs; EnumMembers!CaseSensitive) ++ foreach (cs; EnumMembers!CaseSensitive) + { + enum csString = to!string(cs); + +@@ -692,6 +850,77 @@ unittest + assert(lastIndexOf("\U00010143\u0100\U00010143hello"d, to!S("\u0100"), cs) == 1, csString); + } + } ++ }); ++} ++ ++/++ ++ Returns the index of the last occurence of $(D sub) in $(D s). If $(D sub) ++ is not found, then $(D -1) is returned. The $(D startIdx) slices $(D s) in ++ the following way $(D s[0 .. startIdx]). $(D startIdx) represents a ++ codeunit index in $(D s). If the sequence ending at $(D startIdx) does not ++ represent a well formed codepoint, then a $(XREF utf,UTFException) may be ++ thrown. ++ ++ $(D cs) indicates whether the comparisons are case sensitive. ++ +/ ++ptrdiff_t lastIndexOf(Char1, Char2)(const(Char1)[] s, const(Char2)[] sub, ++ const size_t startIdx, CaseSensitive cs = CaseSensitive.yes) ++ if (isSomeChar!Char1 && isSomeChar!Char2) ++{ ++ if (startIdx <= s.length) ++ { ++ return lastIndexOf(s[0u .. startIdx], sub, cs); ++ } ++ ++ return -1; ++} ++ ++unittest ++{ ++ debug(string) printf("string.lastIndexOf.unittest\n"); ++ ++ foreach(S; TypeTuple!(string, wstring, dstring)) ++ { ++ foreach(T; TypeTuple!(string, wstring, dstring)) ++ { ++ enum typeStr = S.stringof ~ " " ~ T.stringof; ++ ++ assert(lastIndexOf(cast(S)null, to!T("a")) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("c"), 5) == 2, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("cd"), 3) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("ef"), 6) == 4, typeStr ~ ++ format(" %u", lastIndexOf(to!S("abcdefcdef"), to!T("ef"), 6))); ++ assert(lastIndexOf(to!S("abcdefCdef"), to!T("c"), 5) == 2, typeStr); ++ assert(lastIndexOf(to!S("abcdefCdef"), to!T("cd"), 3) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdefx"), to!T("x"), 1) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdefxy"), to!T("xy"), 6) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T(""), 8) == 8, typeStr); ++ assert(lastIndexOf(to!S("öafö"), to!T("ö"), 3) == 0, typeStr ~ ++ to!string(lastIndexOf(to!S("öafö"), to!T("ö"), 3))); //BUG 10472 ++ ++ assert(lastIndexOf(cast(S)null, to!T("a"), 1, CaseSensitive.no) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefCdef"), to!T("c"), 5, CaseSensitive.no) == 2, typeStr); ++ assert(lastIndexOf(to!S("abcdefCdef"), to!T("cD"), 4, CaseSensitive.no) == 2, typeStr ~ ++ " " ~ to!string(lastIndexOf(to!S("abcdefCdef"), to!T("cD"), 3, CaseSensitive.no))); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("x"),3 , CaseSensitive.no) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdefXY"), to!T("xy"), 4, CaseSensitive.no) == -1, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T(""), 7, CaseSensitive.no) == 7, typeStr); ++ ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("c"), 4, CaseSensitive.no) == 2, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("cd"), 4, CaseSensitive.no) == 2, typeStr); ++ assert(lastIndexOf(to!S("abcdefcdef"), to!T("def"), 6, CaseSensitive.no) == 3, typeStr); ++ assert(lastIndexOf(to!S(""), to!T(""), 0) == lastIndexOf(to!S(""), to!T("")), typeStr); ++ } ++ ++ foreach(cs; EnumMembers!CaseSensitive) ++ { ++ enum csString = to!string(cs); ++ ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello", to!S("\u0100"), 6, cs) == 4, csString); ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello"w, to!S("\u0100"), 6, cs) == 2, csString); ++ assert(lastIndexOf("\U00010143\u0100\U00010143hello"d, to!S("\u0100"), 3, cs) == 1, csString); ++ } ++ } + } + + +@@ -699,36 +928,32 @@ unittest + * Returns the representation of a string, which has the same type + * as the string except the character type is replaced by $(D ubyte), + * $(D ushort), or $(D uint) depending on the character width. +- * +- * Example: +----- +-string s = "hello"; +-static assert(is(typeof(representation(s)) == immutable(ubyte)[])); +-assert(representation(s) is cast(immutable(ubyte)[]) s); +-assert(representation(s) == [0x68, 0x65, 0x6c, 0x6c, 0x6f]); +----- + */ + auto representation(Char)(Char[] s) pure nothrow +- if(isSomeChar!Char) ++ if (isSomeChar!Char) + { + // Get representation type + alias TypeTuple!(ubyte, ushort, uint)[Char.sizeof / 2] U; + + // const and immutable storage classes +- static if (is(Char == immutable)) alias immutable(U) T; +- else static if (is(Char == const)) alias const(U) T; +- else alias U T; ++ static if (is(Char == immutable)) ++ alias T = immutable(U); ++ else static if (is(Char == const)) ++ alias T = const(U); ++ else ++ alias T = U; + + // shared storage class (because shared(const(T)) is possible) +- static if (is(Char == shared)) alias shared(T) ST; +- else alias T ST; ++ static if (is(Char == shared)) ++ alias ST = shared(T); ++ else ++ alias ST = T; + + return cast(ST[]) s; + } +- ++/// + unittest + { +- //test example + string s = "hello"; + static assert(is(typeof(representation(s)) == immutable(ubyte)[])); + assert(representation(s) is cast(immutable(ubyte)[]) s); +@@ -736,370 +961,87 @@ unittest + } + unittest + { ++ assertCTFEable!( ++ { + void test(Char, T)(Char[] str) + { + static assert(is(typeof(representation(str)) == T[])); + assert(representation(str) is cast(T[]) str); + } + +- foreach(Type; TypeTuple!(Tuple!(char , ubyte ), +- Tuple!(wchar, ushort), +- Tuple!(dchar, uint ))) ++ foreach (Type; TypeTuple!(Tuple!(char , ubyte ), ++ Tuple!(wchar, ushort), ++ Tuple!(dchar, uint ))) + { + alias Char = FieldTypeTuple!Type[0]; + alias Int = FieldTypeTuple!Type[1]; + enum immutable(Char)[] hello = "hello"; + +- test!( immutable(Char) , immutable(Int) )(hello); +- test!( const(Char) , const(Int) )(hello); +- test!( Char , Int )(hello.dup); +- test!( shared(Char) , shared(Int) )(cast(shared) hello.dup); +- test!(const(shared(Char)), const(shared(Int)))(hello); ++ test!( immutable Char, immutable Int)(hello); ++ test!( const Char, const Int)(hello); ++ test!( Char, Int)(hello.dup); ++ test!( shared Char, shared Int)(cast(shared) hello.dup); ++ test!(const shared Char, const shared Int)(hello); + } ++ }); + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.toLower instead.") S tolower(S)(S s) if (isSomeString!S) +-{ +- return toLower!S(s); +-} +- + /++ + Returns a string which is identical to $(D s) except that all of its +- characters are lowercase (in unicode, not just ASCII). If $(D s) does not +- have any uppercase characters, then $(D s) is returned. ++ characters are converted to lowercase (by preforming Unicode lowercase mapping). ++ If none of $(D s) characters were affected, then $(D s) itself is returned. + +/ +-S toLower(S)(S s) @trusted pure +- if(isSomeString!S) +-{ +- foreach (i, dchar cOuter; s) +- { +- if (!std.uni.isUpper(cOuter)) continue; +- auto result = s[0.. i].dup; +- foreach (dchar c; s[i .. $]) +- { +- if (std.uni.isUpper(c)) +- { +- c = std.uni.toLower(c); +- } +- result ~= c; +- } +- return cast(S) result; +- } +- return s; +-} +- +-unittest +-{ +- debug(string) printf("string.toLower.unittest\n"); +- +- foreach(S; TypeTuple!(string, wstring, dstring, char[], wchar[], dchar[])) +- { +- S s = cast(S)"hello world\u0101"; +- assert(toLower(s) is s); +- const S sc = "hello world\u0101"; +- assert(toLower(sc) is sc); +- immutable S si = "hello world\u0101"; +- assert(toLower(si) is si); +- +- S t = cast(S)"Hello World\u0100"; +- assert(toLower(t) == s); +- const S tc = "hello world\u0101"; +- assert(toLower(tc) == s); +- immutable S ti = "hello world\u0101"; +- assert(toLower(ti) == s); +- } +-} +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.toLowerInPlace instead.") void tolowerInPlace(C)(ref C[] s) if (isSomeChar!C) +-{ +- toLowerInPlace!C(s); +-} +- ++alias toLower = std.uni.toLower; + /++ +- Converts $(D s) to lowercase (in unicode, not just ASCII) in place. ++ Converts $(D s) to lowercase (by performing Unicode lowercase mapping) in place. ++ For a few characters string length may increase after the transformation, ++ in such a case the function reallocates exactly once. + If $(D s) does not have any uppercase characters, then $(D s) is unaltered. + +/ +-void toLowerInPlace(C)(ref C[] s) +- if(is(C == char) || is(C == wchar)) +-{ +- for (size_t i = 0; i < s.length; ) +- { +- immutable c = s[i]; +- if (std.ascii.isUpper(c)) +- { +- s[i++] = cast(C) (c + (cast(C)'a' - 'A')); +- } +- else if (!std.ascii.isASCII(c)) +- { +- // wide character +- size_t j = i; +- dchar dc = decode(s, j); +- assert(j > i); +- if (!std.uni.isUpper(dc)) +- { +- i = j; +- continue; +- } +- auto toAdd = to!(C[])(std.uni.toLower(dc)); +- s = s[0 .. i] ~ toAdd ~ s[j .. $]; +- i += toAdd.length; +- } +- else +- { +- ++i; +- } +- } +-} +- +-void toLowerInPlace(C)(ref C[] s) @safe pure nothrow +- if(is(C == dchar)) +-{ +- foreach(ref c; s) +- { +- if(std.uni.isUpper(c)) +- c = std.uni.toLower(c); +- } +-} +- +-unittest +-{ +- debug(string) printf("string.toLowerInPlace.unittest\n"); +- +- foreach(S; TypeTuple!(char[], wchar[], dchar[])) +- { +- S s = to!S("hello world\u0101"); +- toLowerInPlace(s); +- assert(s == "hello world\u0101"); +- +- S t = to!S("Hello World\u0100"); +- toLowerInPlace(t); +- assert(t == "hello world\u0101"); +- } +-} +- +-unittest +-{ +- debug(string) printf("string.toLower/toLowerInPlace.unittest\n"); +- +- string s1 = "FoL"; +- string s2 = toLower(s1); +- assert(cmp(s2, "fol") == 0, s2); +- assert(s2 != s1); +- +- char[] s3 = s1.dup; +- toLowerInPlace(s3); +- assert(s3 == s2, s3); +- +- s1 = "A\u0100B\u0101d"; +- s2 = toLower(s1); +- s3 = s1.dup; +- assert(cmp(s2, "a\u0101b\u0101d") == 0); +- assert(s2 !is s1); +- toLowerInPlace(s3); +- assert(s3 == s2, s3); +- +- s1 = "A\u0460B\u0461d"; +- s2 = toLower(s1); +- s3 = s1.dup; +- assert(cmp(s2, "a\u0461b\u0461d") == 0); +- assert(s2 !is s1); +- toLowerInPlace(s3); +- assert(s3 == s2, s3); +- +- s1 = "\u0130"; +- s2 = toLower(s1); +- s3 = s1.dup; +- assert(s2 == "i"); +- assert(s2 !is s1); +- toLowerInPlace(s3); +- assert(s3 == s2, s3); +- +- // Test on wchar and dchar strings. +- assert(toLower("Some String"w) == "some string"w); +- assert(toLower("Some String"d) == "some string"d); +-} +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.toUpper instead.") S toupper(S)(S s) if (isSomeString!S) +-{ +- return toUpper!S(s); +-} ++alias toLowerInPlace = std.uni.toLowerInPlace; + + /++ + Returns a string which is identical to $(D s) except that all of its +- characters are uppercase (in unicode, not just ASCII). If $(D s) does not +- have any lowercase characters, then $(D s) is returned. ++ characters are converted to uppercase (by preforming Unicode uppercase mapping). ++ If none of $(D s) characters were affected, then $(D s) itself is returned. + +/ +-S toUpper(S)(S s) @trusted pure +- if(isSomeString!S) +-{ +- foreach (i, dchar cOuter; s) +- { +- if (!std.uni.isLower(cOuter)) continue; +- auto result = s[0.. i].dup; +- foreach (dchar c; s[i .. $]) +- { +- if (std.uni.isLower(c)) +- { +- c = std.uni.toUpper(c); +- } +- result ~= c; +- } +- return cast(S) result; +- } +- return s; +-} +- +-unittest +-{ +- debug(string) printf("string.toUpper.unittest\n"); +- +- foreach(S; TypeTuple!(string, wstring, dstring, char[], wchar[], dchar[])) +- { +- S s = cast(S)"HELLO WORLD\u0100"; +- assert(toUpper(s) is s); +- const S sc = "HELLO WORLD\u0100"; +- assert(toUpper(sc) is sc); +- immutable S si = "HELLO WORLD\u0100"; +- assert(toUpper(si) is si); +- +- S t = cast(S)"hello world\u0101"; +- assert(toUpper(t) == s); +- const S tc = "HELLO WORLD\u0100"; +- assert(toUpper(tc) == s); +- immutable S ti = "HELLO WORLD\u0100"; +- assert(toUpper(ti) == s); +- } +-} +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.toUpperInPlace instead.") void toupperInPlace(C)(ref C[] s) if (isSomeChar!C) +-{ +- toUpperInPlace!C(s); +-} ++alias toUpper = std.uni.toUpper; + + /++ +- Converts $(D s) to uppercase (in unicode, not just ASCII) in place. ++ Converts $(D s) to uppercase (by performing Unicode uppercase mapping) in place. ++ For a few characters string length may increase after the transformation, ++ in such a case the function reallocates exactly once. + If $(D s) does not have any lowercase characters, then $(D s) is unaltered. + +/ +-void toUpperInPlace(C)(ref C[] s) +- if(isSomeChar!C && +- (is(C == char) || is(C == wchar))) +-{ +- for (size_t i = 0; i < s.length; ) +- { +- immutable c = s[i]; +- if ('a' <= c && c <= 'z') +- { +- s[i++] = cast(C) (c - (cast(C)'a' - 'A')); +- } +- else if (!std.ascii.isASCII(c)) +- { +- // wide character +- size_t j = i; +- dchar dc = decode(s, j); +- assert(j > i); +- if (!std.uni.isLower(dc)) +- { +- i = j; +- continue; +- } +- auto toAdd = to!(C[])(std.uni.toUpper(dc)); +- s = s[0 .. i] ~ toAdd ~ s[j .. $]; +- i += toAdd.length; +- } +- else +- { +- ++i; +- } +- } +-} +- +-void toUpperInPlace(C)(ref C[] s) @safe pure nothrow +- if(is(C == dchar)) +-{ +- foreach(ref c; s) +- { +- if(std.uni.isLower(c)) +- c = std.uni.toUpper(c); +- } +-} +- +-unittest +-{ +- debug(string) printf("string.toUpperInPlace.unittest\n"); +- +- foreach(S; TypeTuple!(char[], wchar[], dchar[])) +- { +- S s = to!S("HELLO WORLD\u0100"); +- toUpperInPlace(s); +- assert(s == "HELLO WORLD\u0100"); +- +- S t = to!S("Hello World\u0101"); +- toUpperInPlace(t); +- assert(t == "HELLO WORLD\u0100"); +- } +-} +- +-unittest +-{ +- debug(string) printf("string.toUpper/toUpperInPlace.unittest\n"); +- +- string s1 = "FoL"; +- string s2; +- char[] s3; +- +- s2 = toUpper(s1); +- s3 = s1.dup; toUpperInPlace(s3); +- assert(s3 == s2, s3); +- assert(cmp(s2, "FOL") == 0); +- assert(s2 !is s1); +- +- s1 = "a\u0100B\u0101d"; +- s2 = toUpper(s1); +- s3 = s1.dup; toUpperInPlace(s3); +- assert(s3 == s2); +- assert(cmp(s2, "A\u0100B\u0100D") == 0); +- assert(s2 !is s1); +- +- s1 = "a\u0460B\u0461d"; +- s2 = toUpper(s1); +- s3 = s1.dup; toUpperInPlace(s3); +- assert(s3 == s2); +- assert(cmp(s2, "A\u0460B\u0460D") == 0); +- assert(s2 !is s1); +-} +- ++alias toUpperInPlace = std.uni.toUpperInPlace; + + /++ +- Capitalize the first character of $(D s) and conver the rest of $(D s) ++ Capitalize the first character of $(D s) and convert the rest of $(D s) + to lowercase. + +/ + S capitalize(S)(S s) @trusted pure +- if(isSomeString!S) ++ if (isSomeString!S) + { + Unqual!(typeof(s[0]))[] retval; + bool changed = false; + +- foreach(i, dchar c; s) ++ foreach (i, dchar c; s) + { + dchar c2; + +- if(i == 0) ++ if (i == 0) + { + c2 = std.uni.toUpper(c); +- if(c != c2) ++ if (c != c2) + changed = true; + } + else + { + c2 = std.uni.toLower(c); +- if(c != c2) ++ if (c != c2) + { +- if(!changed) ++ if (!changed) + { + changed = true; + retval = s[0 .. i].dup; +@@ -1107,7 +1049,7 @@ S capitalize(S)(S s) @trusted pure + } + } + +- if(changed) ++ if (changed) + std.utf.encode(retval, c2); + } + +@@ -1116,8 +1058,8 @@ S capitalize(S)(S s) @trusted pure + + unittest + { +- debug(string) printf("string.capitalize.unittest\n"); +- ++ assertCTFEable!( ++ { + foreach (S; TypeTuple!(string, wstring, dstring, char[], wchar[], dchar[])) + { + S s1 = to!S("FoL"); +@@ -1135,10 +1077,9 @@ unittest + s2 = capitalize(s1); + assert(cmp(s2, "Fol") == 0); + assert(s2 !is s1); +- + s1 = to!S("\u0131 \u0130"); + s2 = capitalize(s1); +- assert(cmp(s2, "\u0049 \u0069") == 0); ++ assert(cmp(s2, "I \u0130") == 0); + assert(s2 !is s1); + + s1 = to!S("\u017F \u0049"); +@@ -1146,75 +1087,7 @@ unittest + assert(cmp(s2, "\u0053 \u0069") == 0); + assert(s2 !is s1); + } +-} +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated S capwords(S)(S s) if (isSomeString!S) +-{ +- alias typeof(s[0]) C; +- auto retval = appender!(C[])(); +- bool inWord = false; +- size_t wordStart = 0; +- +- foreach(i, dchar c; s) +- { +- if(std.uni.isWhite(s[i])) +- { +- if(inWord) +- { +- retval.put(capitalize(s[wordStart .. i])); +- inWord = false; +- } +- } +- else if(!inWord) +- { +- if(!retval.data.empty) +- retval.put(' '); +- +- wordStart = i; +- inWord = true; +- } +- } +- +- if(inWord) +- retval.put(capitalize(s[wordStart .. $])); +- +- return cast(S)retval.data; +-} +- +-deprecated unittest +-{ +- debug(string) printf("string.capwords.unittest\n"); +- +- foreach (S; TypeTuple!(string, wstring, dstring, char[], wchar[], dchar[])) +- { +- auto s1 = to!S("\tfoo abc(aD)* \t (q PTT "); +- S s2; +- +- s2 = capwords(s1); +- assert(cmp(s2, "Foo Abc(ad)* (q Ptt") == 0); +- +- s1 = to!S("\u0430\u0411\u0544 \uFF48elLO\u00A0\u0131\u0053\u0049\u017F " ~ +- "\u017F\u0053\u0131\u0130"); +- s2 = capwords(s1); +- assert(cmp(s2, "\u0410\u0431\u0574 \uFF28ello\u00A0\u0049\u0073\u0069\u017F " ~ +- "\u0053\u0053\u0131\u0069")); +- } +-} +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.array.replicate instead.") S repeat(S)(S s, size_t n) +-{ +- return std.array.replicate(s, n); +-} +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.splitLines instead.") S[] splitlines(S)(S s) +-{ +- return splitLines!S(s); ++ }); + } + + /++ +@@ -1225,23 +1098,23 @@ deprecated("Please use std.string.splitL + +/ + enum KeepTerminator : bool { no, yes } + /// ditto +-S[] splitLines(S)(S s, KeepTerminator keepTerm = KeepTerminator.no) +- if(isSomeString!S) ++S[] splitLines(S)(S s, KeepTerminator keepTerm = KeepTerminator.no) @safe pure ++ if (isSomeString!S) + { + size_t iStart = 0; + size_t nextI = 0; + auto retval = appender!(S[])(); + +- for(size_t i; i < s.length; i = nextI) ++ for (size_t i; i < s.length; i = nextI) + { + immutable c = decode(s, nextI); + +- if(c == '\r' || c == '\n' || c == lineSep || c == paraSep) ++ if (c == '\r' || c == '\n' || c == lineSep || c == paraSep) + { + immutable isWinEOL = c == '\r' && i + 1 < s.length && s[i + 1] == '\n'; + auto iEnd = i; + +- if(keepTerm == KeepTerminator.yes) ++ if (keepTerm == KeepTerminator.yes) + { + iEnd = isWinEOL? nextI + 1 : nextI; + } +@@ -1249,7 +1122,7 @@ S[] splitLines(S)(S s, KeepTerminator ke + retval.put(s[iStart .. iEnd]); + iStart = nextI; + +- if(isWinEOL) ++ if (isWinEOL) + { + ++nextI; + ++iStart; +@@ -1257,7 +1130,7 @@ S[] splitLines(S)(S s, KeepTerminator ke + } + } + +- if(iStart != nextI) ++ if (iStart != nextI) + retval.put(s[iStart .. $]); + + return retval.data; +@@ -1267,6 +1140,8 @@ unittest + { + debug(string) printf("string.splitLines.unittest\n"); + ++ assertCTFEable!( ++ { + foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + auto s = to!S("\rpeter\n\rpaul\r\njerry\u2028ice\u2029cream\n\nsunday\n"); +@@ -1304,46 +1179,27 @@ unittest + assert(lines.length == 9); + assert(lines[8] == "sunday"); + } ++ }); + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.stripLeft instead.") String stripl(String)(String s) +-{ +- return stripLeft!String(s); +-} +- + /++ + Strips leading whitespace. +- +- Examples: +--------------------- +-assert(stripLeft(" hello world ") == +- "hello world "); +-assert(stripLeft("\n\t\v\rhello world\n\t\v\r") == +- "hello world\n\t\v\r"); +-assert(stripLeft("hello world") == +- "hello world"); +-assert(stripLeft([lineSep] ~ "hello world" ~ lineSep) == +- "hello world" ~ [lineSep]); +-assert(stripLeft([paraSep] ~ "hello world" ~ paraSep) == +- "hello world" ~ [paraSep]); +--------------------- + +/ + C[] stripLeft(C)(C[] str) @safe pure +- if(isSomeChar!C) ++ if (isSomeChar!C) + { +- foreach(i, dchar c; str) ++ foreach (i, dchar c; str) + { +- if(!std.uni.isWhite(c)) ++ if (!std.uni.isWhite(c)) + return str[i .. $]; + } + + return str[$ .. $]; //Empty string with correct type. + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(stripLeft(" hello world ") == + "hello world "); +@@ -1358,43 +1214,23 @@ unittest + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.stripRight instead.") String stripr(String)(String s) +-{ +- return stripRight!String(s); +-} +- + /++ + Strips trailing whitespace. +- +- Examples: +--------------------- +-assert(stripRight(" hello world ") == +- " hello world"); +-assert(stripRight("\n\t\v\rhello world\n\t\v\r") == +- "\n\t\v\rhello world"); +-assert(stripRight("hello world") == +- "hello world"); +-assert(stripRight([lineSep] ~ "hello world" ~ lineSep) == +- [lineSep] ~ "hello world"); +-assert(stripRight([paraSep] ~ "hello world" ~ paraSep) == +- [paraSep] ~ "hello world"); +--------------------- + +/ +-C[] stripRight(C)(C[] str) +- if(isSomeChar!C) ++C[] stripRight(C)(C[] str) @safe pure ++ if (isSomeChar!C) + { +- foreach_reverse(i, dchar c; str) ++ foreach_reverse (i, dchar c; str) + { +- if(!std.uni.isWhite(c)) ++ if (!std.uni.isWhite(c)) + return str[0 .. i + codeLength!C(c)]; + } + + return str[0 .. 0]; + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(stripRight(" hello world ") == + " hello world"); +@@ -1411,29 +1247,15 @@ unittest + + /++ + Strips both leading and trailing whitespace. +- +- Examples: +--------------------- +-assert(strip(" hello world ") == +- "hello world"); +-assert(strip("\n\t\v\rhello world\n\t\v\r") == +- "hello world"); +-assert(strip("hello world") == +- "hello world"); +-assert(strip([lineSep] ~ "hello world" ~ [lineSep]) == +- "hello world"); +-assert(strip([paraSep] ~ "hello world" ~ [paraSep]) == +- "hello world"); +--------------------- + +/ +-C[] strip(C)(C[] str) +- if(isSomeChar!C) ++C[] strip(C)(C[] str) @safe pure ++ if (isSomeChar!C) + { + return stripRight(stripLeft(str)); + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(strip(" hello world ") == + "hello world"); +@@ -1451,9 +1273,11 @@ unittest + { + debug(string) printf("string.strip.unittest\n"); + +- foreach(S; TypeTuple!(char[], const char[], string, +- wchar[], const wchar[], wstring, +- dchar[], const dchar[], dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!( char[], const char[], string, ++ wchar[], const wchar[], wstring, ++ dchar[], const dchar[], dstring)) + { + assert(equal(stripLeft(to!S(" foo\t ")), "foo\t ")); + assert(equal(stripLeft(to!S("\u2008 foo\t \u2007")), "foo\t \u2007")); +@@ -1475,13 +1299,17 @@ unittest + assert(equal(strip(to!S("\U0010FFFE")), "\U0010FFFE")); + assert(equal(strip(to!S("")), "")); + } ++ }); + } + +-unittest ++@safe pure unittest + { ++ assertCTFEable!( ++ { + wstring s = " "; + assert(s.sameTail(s.stripLeft())); + assert(s.sameHead(s.stripRight())); ++ }); + } + + +@@ -1494,34 +1322,18 @@ unittest + $(D "\r\n"), $(XREF uni, lineSep), or $(XREF uni, paraSep) is removed from + the end of $(D str). If $(D str) does not end with any of those characters, + then it is returned unchanged. +- +- Examples: +--------------------- +-assert(chomp(" hello world \n\r") == " hello world \n"); +-assert(chomp(" hello world \r\n") == " hello world "); +-assert(chomp(" hello world \n\n") == " hello world \n"); +-assert(chomp(" hello world \n\n ") == " hello world \n\n "); +-assert(chomp(" hello world \n\n" ~ [lineSep]) == " hello world \n\n"); +-assert(chomp(" hello world \n\n" ~ [paraSep]) == " hello world \n\n"); +-assert(chomp(" hello world") == " hello world"); +-assert(chomp("") == ""); +- +-assert(chomp(" hello world", "orld") == " hello w"); +-assert(chomp(" hello world", " he") == " hello world"); +-assert(chomp("", "hello") == ""); +--------------------- + +/ +-C[] chomp(C)(C[] str) +- if(isSomeChar!C) ++C[] chomp(C)(C[] str) @safe pure ++ if (isSomeChar!C) + { +- if(str.empty) ++ if (str.empty) + return str; + +- switch(str[$ - 1]) ++ switch (str[$ - 1]) + { + case '\n': + { +- if(str.length > 1 && str[$ - 2] == '\r') ++ if (str.length > 1 && str[$ - 2] == '\r') + return str[0 .. $ - 2]; + goto case; + } +@@ -1529,14 +1341,14 @@ C[] chomp(C)(C[] str) + return str[0 .. $ - 1]; + + //Pops off the last character if it's lineSep or paraSep. +- static if(is(C : const char)) ++ static if (is(C : const char)) + { + //In UTF-8, lineSep and paraSep are [226, 128, 168], and + //[226, 128, 169] respectively, so their first two bytes are the same. + case 168: //Last byte of lineSep + case 169: //Last byte of paraSep + { +- if(str.length > 2 && str[$ - 2] == 128 && str[$ - 3] == 226) ++ if (str.length > 2 && str[$ - 2] == 128 && str[$ - 3] == 226) + return str [0 .. $ - 3]; + goto default; + } +@@ -1553,23 +1365,23 @@ C[] chomp(C)(C[] str) + } + + /// Ditto +-C1[] chomp(C1, C2)(C1[] str, const(C2)[] delimiter) +- if(isSomeChar!C1 && isSomeChar!C2) ++C1[] chomp(C1, C2)(C1[] str, const(C2)[] delimiter) @safe pure ++ if (isSomeChar!C1 && isSomeChar!C2) + { +- if(delimiter.empty) ++ if (delimiter.empty) + return chomp(str); + +- static if(is(Unqual!C1 == Unqual!C2)) ++ static if (is(Unqual!C1 == Unqual!C2)) + { +- if(str.endsWith(delimiter)) ++ if (str.endsWith(delimiter)) + return str[0 .. $ - delimiter.length]; + } + + auto orig = str; + +- foreach_reverse(dchar c; delimiter) ++ foreach_reverse (dchar c; delimiter) + { +- if(str.empty || str.back != c) ++ if (str.empty || str.back != c) + return orig; + + str.popBack(); +@@ -1578,8 +1390,8 @@ C1[] chomp(C1, C2)(C1[] str, const(C2)[] + return str; + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(chomp(" hello world \n\r") == " hello world \n"); + assert(chomp(" hello world \r\n") == " hello world "); +@@ -1600,7 +1412,9 @@ unittest + debug(string) printf("string.chomp.unittest\n"); + string s; + +- foreach(S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + // @@@ BUG IN COMPILER, MUST INSERT CAST + assert(chomp(cast(S)null) is null); +@@ -1617,7 +1431,7 @@ unittest + assert(chomp(to!S("hello\u2028\u2028")) == "hello\u2028"); + assert(chomp(to!S("hello\u2029\u2029")) == "hello\u2029"); + +- foreach(T; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ foreach (T; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + // @@@ BUG IN COMPILER, MUST INSERT CAST + assert(chomp(cast(S)null, cast(T)null) is null); +@@ -1631,6 +1445,7 @@ unittest + assert(chomp(to!S("\uFF28el\uFF4co"), to!T("l\uFF4co")) == "\uFF28e"); + } + } ++ }); + } + + +@@ -1638,21 +1453,13 @@ unittest + If $(D str) starts with $(D delimiter), then the part of $(D str) following + $(D delimiter) is returned. If it $(D str) does $(I not) start with + $(D delimiter), then it is returned unchanged. +- +- Examples: +--------------------- +-assert(chompPrefix("hello world", "he") == "llo world"); +-assert(chompPrefix("hello world", "hello w") == "orld"); +-assert(chompPrefix("hello world", " world") == "hello world"); +-assert(chompPrefix("", "hello") == ""); +--------------------- + +/ +-C1[] chompPrefix(C1, C2)(C1[] str, C2[] delimiter) +- if(isSomeChar!C1 && isSomeChar!C2) ++C1[] chompPrefix(C1, C2)(C1[] str, C2[] delimiter) @safe pure ++ if (isSomeChar!C1 && isSomeChar!C2) + { +- static if(is(Unqual!C1 == Unqual!C2)) ++ static if (is(Unqual!C1 == Unqual!C2)) + { +- if(str.startsWith(delimiter)) ++ if (str.startsWith(delimiter)) + return str[delimiter.length .. $]; + return str; + } +@@ -1661,9 +1468,9 @@ C1[] chompPrefix(C1, C2)(C1[] str, C2[] + auto orig = str; + size_t index = 0; + +- foreach(dchar c; delimiter) ++ foreach (dchar c; delimiter) + { +- if(index >= str.length || decode(str, index) != c) ++ if (index >= str.length || decode(str, index) != c) + return orig; + } + +@@ -1671,8 +1478,8 @@ C1[] chompPrefix(C1, C2)(C1[] str, C2[] + } + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(chompPrefix("hello world", "he") == "llo world"); + assert(chompPrefix("hello world", "hello w") == "orld"); +@@ -1680,11 +1487,13 @@ unittest + assert(chompPrefix("", "hello") == ""); + } + +-unittest ++/* @safe */ pure unittest + { +- foreach(S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ assertCTFEable!( + { +- foreach(T; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ { ++ foreach (T; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + assert(equal(chompPrefix(to!S("abcdefgh"), to!T("abcde")), "fgh")); + assert(equal(chompPrefix(to!S("abcde"), to!T("abcdefgh")), "abcde")); +@@ -1693,6 +1502,7 @@ unittest + assert(equal(chompPrefix(to!S("\uFF28el"), to!T("\uFF28el\uFF4co")), "\uFF28el")); + } + } ++ }); + } + + +@@ -1700,25 +1510,14 @@ unittest + Returns $(D str) without its last character, if there is one. If $(D str) + ends with $(D "\r\n"), then both are removed. If $(D str) is empty, then + then it is returned unchanged. +- +- Examples: +--------------------- +-assert(chop("hello world") == "hello worl"); +-assert(chop("hello world\n") == "hello world"); +-assert(chop("hello world\r") == "hello world"); +-assert(chop("hello world\n\r") == "hello world\n"); +-assert(chop("hello world\r\n") == "hello world"); +-assert(chop("Walter Bright") == "Walter Brigh"); +-assert(chop("") == ""); +--------------------- + +/ +-S chop(S)(S str) +- if(isSomeString!S) ++S chop(S)(S str) @safe pure ++ if (isSomeString!S) + { +- if(str.empty) ++ if (str.empty) + return str; + +- if(str.length >= 2 && str[$ - 1] == '\n' && str[$ - 2] == '\r') ++ if (str.length >= 2 && str[$ - 1] == '\n' && str[$ - 2] == '\r') + return str[0 .. $ - 2]; + + str.popBack(); +@@ -1726,8 +1525,8 @@ S chop(S)(S str) + return str; + } + +-//Verify Example. +-unittest ++/// ++@safe pure unittest + { + assert(chop("hello world") == "hello worl"); + assert(chop("hello world\n") == "hello world"); +@@ -1742,7 +1541,9 @@ unittest + { + debug(string) printf("string.chop.unittest\n"); + +- foreach(S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + assert(chop(cast(S) null) is null); + assert(equal(chop(to!S("hello")), "hell")); +@@ -1752,29 +1553,24 @@ unittest + assert(equal(chop(to!S(`さいごの果実`)), "さいごの果")); + assert(equal(chop(to!S(`ミツバチと科学者`)), "ミツバチと科学")); + } ++ }); + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.leftJustify instead.") S ljustify(S)(S s, size_t width) if (isSomeString!S) +-{ +- return leftJustify!S(s, width); +-} +- + /++ + Left justify $(D s) in a field $(D width) characters wide. $(D fillChar) + is the character that will be used to fill up the space in the field that + $(D s) doesn't fill. + +/ +-S leftJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted +- if(isSomeString!S) ++S leftJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted pure ++ if (isSomeString!S) + { + alias typeof(s[0]) C; + +- if(cast(dchar)(cast(C)fillChar) == fillChar) ++ if (cast(dchar)(cast(C)fillChar) == fillChar) + { + immutable len = s.walkLength(); +- if(len >= width) ++ if (len >= width) + return s; + + auto retval = new Unqual!(C)[width - len + s.length]; +@@ -1785,7 +1581,7 @@ S leftJustify(S)(S s, size_t width, dcha + else + { + auto dstr = to!dstring(s); +- if(dstr.length >= width) ++ if (dstr.length >= width) + return s; + + auto retval = new dchar[](width); +@@ -1796,29 +1592,23 @@ S leftJustify(S)(S s, size_t width, dcha + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.rightJustify instead.") S rjustify(S)(S s, size_t width) if (isSomeString!S) +-{ +- return rightJustify!S(s, width); +-} +- + /++ + Right justify $(D s) in a field $(D width) characters wide. $(D fillChar) + is the character that will be used to fill up the space in the field that + $(D s) doesn't fill. + +/ +-S rightJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted +- if(isSomeString!S) ++S rightJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted pure ++ if (isSomeString!S) + { + alias typeof(s[0]) C; + +- if(cast(dchar)(cast(C)fillChar) == fillChar) ++ if (cast(dchar)(cast(C)fillChar) == fillChar) + { + immutable len = s.walkLength(); +- if(len >= width) ++ if (len >= width) + return s; + +- auto retval = new Unqual!(C)[width - len + s.length]; ++ auto retval = new Unqual!C[width - len + s.length]; + retval[0 .. $ - s.length] = cast(C)fillChar; + retval[$ - s.length .. $] = s[]; + return cast(S)retval; +@@ -1826,7 +1616,7 @@ S rightJustify(S)(S s, size_t width, dch + else + { + auto dstr = to!dstring(s); +- if(dstr.length >= width) ++ if (dstr.length >= width) + return s; + + auto retval = new dchar[](width); +@@ -1842,18 +1632,18 @@ S rightJustify(S)(S s, size_t width, dch + is the character that will be used to fill up the space in the field that + $(D s) doesn't fill. + +/ +-S center(S)(S s, size_t width, dchar fillChar = ' ') @trusted +- if(isSomeString!S) ++S center(S)(S s, size_t width, dchar fillChar = ' ') @trusted pure ++ if (isSomeString!S) + { + alias typeof(s[0]) C; + +- if(cast(dchar)(cast(C)fillChar) == fillChar) ++ if (cast(dchar)(cast(C)fillChar) == fillChar) + { + immutable len = s.walkLength(); +- if(len >= width) ++ if (len >= width) + return s; + +- auto retval = new Unqual!(C)[width - len + s.length]; ++ auto retval = new Unqual!C[width - len + s.length]; + immutable left = (retval.length - s.length) / 2; + retval[0 .. left] = cast(C)fillChar; + retval[left .. left + s.length] = s[]; +@@ -1863,7 +1653,7 @@ S center(S)(S s, size_t width, dchar fil + else + { + auto dstr = to!dstring(s); +- if(dstr.length >= width) ++ if (dstr.length >= width) + return s; + + auto retval = new dchar[](width); +@@ -1879,7 +1669,9 @@ unittest + { + debug(string) printf("string.justify.unittest\n"); + +- foreach(S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + S s = to!S("hello"); + +@@ -1889,53 +1681,27 @@ unittest + + assert(leftJustify(s, 7) == "hello "); + assert(rightJustify(s, 7) == " hello"); +- assert(center(s, 7) == " hello "); +- +- assert(leftJustify(s, 8) == "hello "); +- assert(rightJustify(s, 8) == " hello"); +- assert(center(s, 8) == " hello "); +- +- assert(leftJustify(s, 8, '\u0100') == "hello\u0100\u0100\u0100"); +- assert(rightJustify(s, 8, '\u0100') == "\u0100\u0100\u0100hello"); +- assert(center(s, 8, '\u0100') == "\u0100hello\u0100\u0100"); +- } +-} +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.rightJustify with a fill character of '0' instead.") +-S zfill(S)(S s, int width) if (isSomeString!S) +-{ +- return rightJustify!S(s, width, '0'); +-} +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.array.insertInPlace instead.") S insert(S)(S s, size_t index, S sub) +-in +-{ +- assert(0 <= index && index <= s.length); +-} +-body +-{ +- std.array.insertInPlace(s, index, sub); +- return s; +-} ++ assert(center(s, 7) == " hello "); + ++ assert(leftJustify(s, 8) == "hello "); ++ assert(rightJustify(s, 8) == " hello"); ++ assert(center(s, 8) == " hello "); + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.detab instead.") S expandtabs(S)(S str, size_t tabsize = 8) if (isSomeString!S) +-{ +- return detab!S(str, tabsize); ++ assert(leftJustify(s, 8, '\u0100') == "hello\u0100\u0100\u0100"); ++ assert(rightJustify(s, 8, '\u0100') == "\u0100\u0100\u0100hello"); ++ assert(center(s, 8, '\u0100') == "\u0100hello\u0100\u0100"); ++ } ++ }); + } + ++ + /++ + Replace each tab character in $(D s) with the number of spaces necessary + to align the following character at the next tab stop where $(D tabSize) + is the distance between tab stops. + +/ + S detab(S)(S s, size_t tabSize = 8) @trusted pure +- if(isSomeString!S) ++ if (isSomeString!S) + { + assert(tabSize > 0); + alias Unqual!(typeof(s[0])) C; +@@ -1996,6 +1762,8 @@ unittest + { + debug(string) printf("string.detab.unittest\n"); + ++ assertCTFEable!( ++ { + foreach (S; TypeTuple!(char[], wchar[], dchar[], string, wstring, dstring)) + { + S s = to!S("This \tis\t a fofof\tof list"); +@@ -2010,9 +1778,9 @@ unittest + assert(detab( " ab\t asdf ") == " ab asdf "); + assert(detab( " \U00010000b\tasdf ") == " \U00010000b asdf "); + } ++ }); + } + +- + /++ + Replaces spaces in $(D s) with the optimal number of tabs. + All spaces and tabs at the end of a line are removed. +@@ -2022,7 +1790,7 @@ unittest + tabSize = Tab columns are $(D tabSize) spaces apart. + +/ + S entab(S)(S s, size_t tabSize = 8) @trusted pure +- if(isSomeString!S) ++ if (isSomeString!S) + { + bool changes = false; + alias Unqual!(typeof(s[0])) C; +@@ -2124,8 +1892,8 @@ unittest + { + debug(string) printf("string.entab.unittest\n"); + +- string r; +- ++ assertCTFEable!( ++ { + assert(entab(cast(string) null) is null); + assert(entab("").empty); + assert(entab("a") == "a"); +@@ -2156,6 +1924,7 @@ unittest + assert(entab("a\t") == "a"); + assert(entab("\uFF28\uFF45\uFF4C\uFF4C567 \t\uFF4F \t") == + "\uFF28\uFF45\uFF4C\uFF4C567\t\t\uFF4F"); ++ }); + } + + +@@ -2176,28 +1945,19 @@ unittest + transTable = The AA indicating which characters to replace and what to + replace them with. + toRemove = The characters to remove from the string. +- +- Examples: +--------------------- +-dchar[dchar] transTable1 = ['e' : '5', 'o' : '7', '5': 'q']; +-assert(translate("hello world", transTable1) == "h5ll7 w7rld"); +- +-assert(translate("hello world", transTable1, "low") == "h5 rd"); +- +-string[dchar] transTable2 = ['e' : "5", 'o' : "orange"]; +-assert(translate("hello world", transTable2) == "h5llorange worangerld"); +--------------------- + +/ + C1[] translate(C1, C2 = immutable char)(C1[] str, + dchar[dchar] transTable, +- const(C2)[] toRemove = null) @safe +- if(isSomeChar!C1 && isSomeChar!C2) ++ const(C2)[] toRemove = null) @safe pure ++ if (isSomeChar!C1 && isSomeChar!C2) + { +- return translateImpl(str, transTable, toRemove); ++ auto buffer = appender!(C1[])(); ++ translateImpl(str, transTable, toRemove, buffer); ++ return buffer.data; + } + +-//Verify Examples. +-unittest ++/// ++@safe pure unittest + { + dchar[dchar] transTable1 = ['e' : '5', 'o' : '7', '5': 'q']; + assert(translate("hello world", transTable1) == "h5ll7 w7rld"); +@@ -2208,11 +1968,13 @@ unittest + assert(translate("hello world", transTable2) == "h5llorange worangerld"); + } + +-unittest ++/* @safe */ pure unittest + { +- foreach(S; TypeTuple!(char[], const(char)[], immutable(char)[], +- wchar[], const(wchar)[], immutable(wchar)[], +- dchar[], const(dchar)[], immutable(dchar)[])) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!( char[], const( char)[], immutable( char)[], ++ wchar[], const(wchar)[], immutable(wchar)[], ++ dchar[], const(dchar)[], immutable(dchar)[])) + { + assert(translate(to!S("hello world"), cast(dchar[dchar])['h' : 'q', 'l' : '5']) == + to!S("qe55o wor5d")); +@@ -2224,9 +1986,9 @@ unittest + to!S("hell0 o w0rld")); + assert(translate(to!S("hello world"), cast(dchar[dchar])null) == to!S("hello world")); + +- foreach(T; TypeTuple!(char[], const(char)[], immutable(char)[], +- wchar[], const(wchar)[], immutable(wchar)[], +- dchar[], const(dchar)[], immutable(dchar)[])) ++ foreach (T; TypeTuple!( char[], const( char)[], immutable( char)[], ++ wchar[], const(wchar)[], immutable(wchar)[], ++ dchar[], const(dchar)[], immutable(dchar)[])) + { + assert(translate(to!S("hello world"), + cast(dchar[dchar])['h' : 'q', 'l' : '5'], +@@ -2250,22 +2012,27 @@ unittest + dchar[dchar] transTable = ['h' : 'q', 'l' : '5']; + static assert(is(typeof(s) == typeof(translate(s, transTable)))); + } ++ }); + } + + /++ Ditto +/ + C1[] translate(C1, S, C2 = immutable char)(C1[] str, + S[dchar] transTable, +- const(C2)[] toRemove = null) @safe +- if(isSomeChar!C1 && isSomeString!S && isSomeChar!C2) ++ const(C2)[] toRemove = null) @safe pure ++ if (isSomeChar!C1 && isSomeString!S && isSomeChar!C2) + { +- return translateImpl(str, transTable, toRemove); ++ auto buffer = appender!(C1[])(); ++ translateImpl(str, transTable, toRemove, buffer); ++ return buffer.data; + } + +-unittest ++/* @safe */ pure unittest + { +- foreach(S; TypeTuple!(char[], const(char)[], immutable(char)[], +- wchar[], const(wchar)[], immutable(wchar)[], +- dchar[], const(dchar)[], immutable(dchar)[])) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!( char[], const( char)[], immutable( char)[], ++ wchar[], const(wchar)[], immutable(wchar)[], ++ dchar[], const(dchar)[], immutable(dchar)[])) + { + assert(translate(to!S("hello world"), ['h' : "yellow", 'l' : "42"]) == + to!S("yellowe4242o wor42d")); +@@ -2281,9 +2048,9 @@ unittest + to!S("hello world")); + assert(translate(to!S("hello world"), cast(string[dchar])null) == to!S("hello world")); + +- foreach(T; TypeTuple!(char[], const(char)[], immutable(char)[], +- wchar[], const(wchar)[], immutable(wchar)[], +- dchar[], const(dchar)[], immutable(dchar)[])) ++ foreach (T; TypeTuple!( char[], const( char)[], immutable( char)[], ++ wchar[], const(wchar)[], immutable(wchar)[], ++ dchar[], const(dchar)[], immutable(dchar)[])) + { + assert(translate(to!S("hello world"), ['h' : "yellow", 'l' : "42"], to!T("r")) == + to!S("yellowe4242o wo42d")); +@@ -2305,36 +2072,80 @@ unittest + string[dchar] transTable = ['h' : "silly", 'l' : "putty"]; + static assert(is(typeof(s) == typeof(translate(s, transTable)))); + } ++ }); + } + +-private auto translateImpl(C1, T, C2)(C1[] str, +- T transTable, +- const(C2)[] toRemove) @trusted ++/++ ++ This is an overload of $(D translate) which takes an existing buffer to write the contents to. ++ ++ Params: ++ str = The original string. ++ transTable = The AA indicating which characters to replace and what to ++ replace them with. ++ toRemove = The characters to remove from the string. ++ buffer = An output range to write the contents to. ++ +/ ++void translate(C1, C2 = immutable char, Buffer)(C1[] str, ++ dchar[dchar] transTable, ++ const(C2)[] toRemove, ++ Buffer buffer) ++ if (isSomeChar!C1 && isSomeChar!C2 && isOutputRange!(Buffer, C1)) ++{ ++ translateImpl(str, transTable, toRemove, buffer); ++} ++ ++/// ++@safe pure unittest ++{ ++ dchar[dchar] transTable1 = ['e' : '5', 'o' : '7', '5': 'q']; ++ auto buffer = appender!(dchar[])(); ++ translate("hello world", transTable1, null, buffer); ++ assert(buffer.data == "h5ll7 w7rld"); ++ ++ buffer.clear(); ++ translate("hello world", transTable1, "low", buffer); ++ assert(buffer.data == "h5 rd"); ++ ++ buffer.clear(); ++ string[dchar] transTable2 = ['e' : "5", 'o' : "orange"]; ++ translate("hello world", transTable2, null, buffer); ++ assert(buffer.data == "h5llorange worangerld"); ++} ++ ++/++ Ditto +/ ++void translate(C1, S, C2 = immutable char, Buffer)(C1[] str, ++ S[dchar] transTable, ++ const(C2)[] toRemove, ++ Buffer buffer) ++ if (isSomeChar!C1 && isSomeString!S && isSomeChar!C2 && isOutputRange!(Buffer, S)) + { +- auto retval = appender!(C1[])(); ++ translateImpl(str, transTable, toRemove, buffer); ++} + ++private void translateImpl(C1, T, C2, Buffer)(C1[] str, ++ T transTable, ++ const(C2)[] toRemove, ++ Buffer buffer) ++{ + bool[dchar] removeTable; + +- foreach(dchar c; toRemove) ++ foreach (dchar c; toRemove) + removeTable[c] = true; + +- foreach(dchar c; str) ++ foreach (dchar c; str) + { +- if(c in removeTable) ++ if (c in removeTable) + continue; + + auto newC = c in transTable; + +- if(newC) +- retval.put(*newC); ++ if (newC) ++ put(buffer, *newC); + else +- retval.put(c); ++ put(buffer, c); + } +- +- return retval.data; + } + +- + /++ + This is an $(I $(RED ASCII-only)) overload of $(LREF _translate). It + will $(I not) work with Unicode. It exists as an optimization for the +@@ -2367,50 +2178,30 @@ private auto translateImpl(C1, T, C2)(C1 + transTable = The string indicating which characters to replace and what + to replace them with. It is generated by $(LREF makeTrans). + toRemove = The characters to remove from the string. +- +- Examples: +--------------------- +-auto transTable1 = makeTrans("eo5", "57q"); +-assert(translate("hello world", transTable1) == "h5ll7 w7rld"); +- +-assert(translate("hello world", transTable1, "low") == "h5 rd"); +--------------------- + +/ +-C[] translate(C = immutable char)(in char[] str, in char[] transTable, in char[] toRemove = null) @trusted nothrow +- if(is(Unqual!C == char)) ++C[] translate(C = immutable char)(in char[] str, in char[] transTable, in char[] toRemove = null) @trusted pure nothrow ++ if (is(Unqual!C == char)) + in + { + assert(transTable.length == 256); +- foreach(char c; str) +- assert(c <= 256); +- foreach(char c; transTable) +- assert(c <= 256); +- foreach(char c; toRemove) +- assert(c <= 256); + } + body + { + bool[256] remTable = false; + +- foreach(char c; toRemove) ++ foreach (char c; toRemove) + remTable[c] = true; + + size_t count = 0; +- foreach(char c; str) ++ foreach (char c; str) + { +- if(!remTable[c]) ++ if (!remTable[c]) + ++count; + } + +- auto retval = new char[count]; +- size_t i = 0; +- foreach(char c; str) +- { +- if(!remTable[c]) +- retval[i++] = transTable[c]; +- } +- +- return cast(C[])(retval); ++ auto buffer = new char[count]; ++ translateImplAscii(str, transTable, remTable, buffer, toRemove); ++ return cast(C[])(buffer); + } + + +@@ -2420,25 +2211,25 @@ in + { + assert(from.length == to.length); + assert(from.length <= 256); +- foreach(char c; from) ++ foreach (char c; from) + assert(std.ascii.isASCII(c)); +- foreach(char c; to) ++ foreach (char c; to) + assert(std.ascii.isASCII(c)); + } + body + { + char[] transTable = new char[256]; + +- foreach(i; 0 .. transTable.length) ++ foreach (i; 0 .. transTable.length) + transTable[i] = cast(char)i; +- foreach(i; 0 .. from.length) ++ foreach (i; 0 .. from.length) + transTable[from[i]] = to[i]; + + return assumeUnique(transTable); + } + +-// Verify Examples. +-unittest ++/// ++@safe pure nothrow unittest + { + auto transTable1 = makeTrans("eo5", "57q"); + assert(translate("hello world", transTable1) == "h5ll7 w7rld"); +@@ -2446,9 +2237,11 @@ unittest + assert(translate("hello world", transTable1, "low") == "h5 rd"); + } + +-unittest ++@safe pure unittest + { +- foreach(C; TypeTuple!(char, const char, immutable char)) ++ assertCTFEable!( ++ { ++ foreach (C; TypeTuple!(char, const char, immutable char)) + { + assert(translate!C("hello world", makeTrans("hl", "q5")) == to!(C[])("qe55o wor5d")); + +@@ -2457,7 +2250,7 @@ unittest + static assert(is(typeof(s) == typeof(translate!C(s, transTable)))); + } + +- foreach(S; TypeTuple!(char[], const(char)[], immutable(char)[])) ++ foreach (S; TypeTuple!(char[], const(char)[], immutable(char)[])) + { + assert(translate(to!S("hello world"), makeTrans("hl", "q5")) == to!S("qe55o wor5d")); + assert(translate(to!S("hello \U00010143 world"), makeTrans("hl", "q5")) == +@@ -2468,7 +2261,7 @@ unittest + assert(translate(to!S("hello \U00010143 world"), makeTrans("12345", "67890")) == + to!S("hello \U00010143 world")); + +- foreach(T; TypeTuple!(char[], const(char)[], immutable(char)[])) ++ foreach (T; TypeTuple!(char[], const(char)[], immutable(char)[])) + { + assert(translate(to!S("hello world"), makeTrans("hl", "q5"), to!T("r")) == + to!S("qe55o wo5d")); +@@ -2480,34 +2273,75 @@ unittest + to!S("qe55o wor5d")); + } + } ++ }); ++} ++ ++/++ ++ This is an $(I $(RED ASCII-only)) overload of $(D translate) which takes an existing buffer to write the contents to. ++ ++ Params: ++ str = The original string. ++ transTable = The string indicating which characters to replace and what ++ to replace them with. It is generated by $(LREF makeTrans). ++ toRemove = The characters to remove from the string. ++ buffer = An output range to write the contents to. ++ +/ ++void translate(C = immutable char, Buffer)(in char[] str, in char[] transTable, in char[] toRemove, Buffer buffer) ++ if (is(Unqual!C == char) && isOutputRange!(Buffer, char)) ++in ++{ ++ assert(transTable.length == 256); + } ++body ++{ ++ bool[256] remTable = false; + ++ foreach (char c; toRemove) ++ remTable[c] = true; + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.string.makeTrans instead.") alias makeTrans maketrans; ++ translateImplAscii(str, transTable, remTable, buffer, toRemove); ++} + +-deprecated unittest ++/// ++@safe pure unittest + { +- debug(string) printf("string.translate.unittest\n"); ++ auto buffer = appender!(char[])(); ++ auto transTable1 = makeTrans("eo5", "57q"); ++ translate("hello world", transTable1, null, buffer); ++ assert(buffer.data == "h5ll7 w7rld"); + +- string from = "abcdef"; +- string to = "ABCDEF"; +- string s = "The quick dog fox"; +- string t; +- string r; +- int i; +- +- t = maketrans(from, to); +- r = translate(s, t, "kg"); +- //printf("r = '%.*s'\n", r); +- i = cmp(r, "ThE quiC Do Fox"); +- assert(i == 0); ++ buffer.clear(); ++ translate("hello world", transTable1, "low", buffer); ++ assert(buffer.data == "h5 rd"); + } + ++private void translateImplAscii(C = immutable char, Buffer)(in char[] str, in char[] transTable, ref bool[256] remTable, Buffer buffer, in char[] toRemove = null) ++{ ++ static if (isOutputRange!(Buffer, char)) ++ { ++ foreach (char c; str) ++ { ++ if (!remTable[c]) ++ put(buffer, transTable[c]); ++ } ++ } ++ else ++ { ++ size_t i = 0; ++ foreach (char c; str) ++ { ++ if (!remTable[c]) ++ buffer[i++] = transTable[c]; ++ } ++ } ++} + + /***************************************************** + * Format arguments into a string. + * ++ * Params: fmt = Format string. For detailed specification, see $(XREF format,formattedWrite). ++ * args = Variadic list of arguments to format into returned string. ++ * + * $(RED format's current implementation has been replaced with $(LREF xformat)'s + * implementation. in November 2012. + * This is seamless for most code, but it makes it so that the only +@@ -2516,13 +2350,13 @@ deprecated unittest + * your calls to format accordingly. + * + * e.g.: +----- +-format("key = %s", key, ", value = %s", value) +----- ++ * ---- ++ * format("key = %s", key, ", value = %s", value) ++ * ---- + * needs to be rewritten as: +----- +-format("key = %s, value = %s", key, value) +----- ++ * ---- ++ * format("key = %s, value = %s", key, value) ++ * ---- + * ) + */ + string format(Char, Args...)(in Char[] fmt, Args args) +@@ -2543,6 +2377,8 @@ unittest + { + debug(string) printf("std.string.format.unittest\n"); + ++ assertCTFEable!( ++ { + // assert(format(null) == ""); + assert(format("foo") == "foo"); + assert(format("foo%%") == "foo%"); +@@ -2554,13 +2390,17 @@ unittest + + assertThrown!FormatException(format("foo %s")); + assertThrown!FormatException(format("foo %s", 123, 456)); ++ ++ assert(format("hel%slo%s%s%s", "world", -138, 'c', true) == ++ "helworldlo-138ctrue"); ++ }); + } + + + /***************************************************** +- * Format arguments into string s which must be large ++ * Format arguments into buffer buf which must be large + * enough to hold the result. Throws RangeError if it is not. +- * Returns: s ++ * Returns: The slice of $(D buf) containing the formatted string. + * + * $(RED sformat's current implementation has been replaced with $(LREF xsformat)'s + * implementation. in November 2012. +@@ -2570,13 +2410,13 @@ unittest + * your calls to sformat accordingly. + * + * e.g.: +----- +-sformat(buf, "key = %s", key, ", value = %s", value) +----- ++ * ---- ++ * sformat(buf, "key = %s", key, ", value = %s", value) ++ * ---- + * needs to be rewritten as: +----- +-sformat(buf, "key = %s, value = %s", key, value) +----- ++ * ---- ++ * sformat(buf, "key = %s, value = %s", key, value) ++ * ---- + * ) + */ + char[] sformat(Char, Args...)(char[] buf, in Char[] fmt, Args args) +@@ -2630,6 +2470,8 @@ unittest + { + debug(string) printf("std.string.sformat.unittest\n"); + ++ assertCTFEable!( ++ { + char[10] buf; + + assert(sformat(buf[], "foo") == "foo"); +@@ -2644,35 +2486,27 @@ unittest + assertThrown!FormatException(sformat(buf[], "foo %s", 123, 456)); + + assert(sformat(buf[], "%s %s %s", "c"c, "w"w, "d"d) == "c w d"); ++ }); + } + + + /***************************************************** ++ * $(RED Deprecated. It will be removed in November 2013. ++ * Please use std.string.format instead.) ++ * + * Format arguments into a string. + * +- * $(LREF format) has been changed to use this implementation in November 2012. +- * Then xformat has been scheduled for deprecation at the same time. +- * It will be deprecateed in May 2013. ++ * $(LREF format) was changed to use this implementation in November 2012, + */ + +-string xformat(Char, Args...)(in Char[] fmt, Args args) +-{ +- auto w = appender!string(); +- auto n = formattedWrite(w, fmt, args); +- version (all) +- { +- // In the future, this check will be removed to increase consistency +- // with formattedWrite +- enforce(n == args.length, new FormatException( +- text("Orphan format arguments: args[", n, "..", args.length, "]"))); +- } +- return w.data; +-} ++deprecated("Please use std.string.format instead.") alias format xformat; + + deprecated unittest + { + debug(string) printf("std.string.xformat.unittest\n"); + ++ assertCTFEable!( ++ { + // assert(xformat(null) == ""); + assert(xformat("foo") == "foo"); + assert(xformat("foo%%") == "foo%"); +@@ -2684,71 +2518,28 @@ deprecated unittest + + assertThrown!FormatException(xformat("foo %s")); + assertThrown!FormatException(xformat("foo %s", 123, 456)); ++ }); + } + + + /***************************************************** +- * Format arguments into string $(D_PARAM buf) which must be large +- * enough to hold the result. Throws RangeError if it is not. ++ * $(RED Deprecated. It will be removed in November 2013. ++ * Please use std.string.sformat instead.) + * +- * $(LREF sformat) has been changed to use this implementation in November 2012. +- * Then xsformat has been scheduled for deprecation at the same time. +- * It will be deprecateed in May 2013. ++ * Format arguments into string $(D buf) which must be large ++ * enough to hold the result. Throws RangeError if it is not. + * +- * Returns: filled slice of $(D_PARAM buf) ++ * $(LREF sformat) was changed to use this implementation in November 2012, + */ + +-char[] xsformat(Char, Args...)(char[] buf, in Char[] fmt, Args args) +-{ +- size_t i; +- +- struct Sink +- { +- void put(dchar c) +- { +- char[4] enc; +- auto n = encode(enc, c); +- +- if (buf.length < i + n) +- onRangeError("std.string.xsformat", 0); +- +- buf[i .. i + n] = enc[0 .. n]; +- i += n; +- } +- void put(const(char)[] s) +- { +- if (buf.length < i + s.length) +- onRangeError("std.string.xsformat", 0); +- +- buf[i .. i + s.length] = s[]; +- i += s.length; +- } +- void put(const(wchar)[] s) +- { +- for (; !s.empty; s.popFront()) +- put(s.front); +- } +- void put(const(dchar)[] s) +- { +- for (; !s.empty; s.popFront()) +- put(s.front); +- } +- } +- auto n = formattedWrite(Sink(), fmt, args); +- version (all) +- { +- // In the future, this check will be removed to increase consistency +- // with formattedWrite +- enforce(n == args.length, new FormatException( +- text("Orphan format arguments: args[", n, "..", args.length, "]"))); +- } +- return buf[0 .. i]; +-} ++deprecated("Please use std.string.sformat instead.") alias sformat xsformat; + + deprecated unittest + { + debug(string) printf("std.string.xsformat.unittest\n"); + ++ assertCTFEable!( ++ { + char[10] buf; + + assert(xsformat(buf[], "foo") == "foo"); +@@ -2763,6 +2554,7 @@ deprecated unittest + assertThrown!FormatException(xsformat(buf[], "foo %s", 123, 456)); + + assert(xsformat(buf[], "%s %s %s", "c"c, "w"w, "d"d) == "c w d"); ++ }); + } + + +@@ -2785,7 +2577,7 @@ deprecated unittest + * to be more like regular expression character classes. + */ + +-bool inPattern(S)(dchar c, in S pattern) if (isSomeString!S) ++bool inPattern(S)(dchar c, in S pattern) @safe pure if (isSomeString!S) + { + bool result = false; + int range = 0; +@@ -2793,25 +2585,26 @@ bool inPattern(S)(dchar c, in S pattern) + + foreach (size_t i, dchar p; pattern) + { +- if (p == '^' && i == 0) +- { result = true; +- if (i + 1 == pattern.length) +- return (c == p); // or should this be an error? +- } +- else if (range) +- { +- range = 0; +- if (lastc <= c && c <= p || c == p) +- return !result; +- } +- else if (p == '-' && i > result && i + 1 < pattern.length) +- { +- range = 1; +- continue; +- } +- else if (c == p) +- return !result; +- lastc = p; ++ if (p == '^' && i == 0) ++ { ++ result = true; ++ if (i + 1 == pattern.length) ++ return (c == p); // or should this be an error? ++ } ++ else if (range) ++ { ++ range = 0; ++ if (lastc <= c && c <= p || c == p) ++ return !result; ++ } ++ else if (p == '-' && i > result && i + 1 < pattern.length) ++ { ++ range = 1; ++ continue; ++ } ++ else if (c == p) ++ return !result; ++ lastc = p; + } + return result; + } +@@ -2821,46 +2614,28 @@ unittest + { + debug(string) printf("std.string.inPattern.unittest\n"); + +- int i; +- +- i = inPattern('x', "x"); +- assert(i == 1); +- i = inPattern('x', "y"); +- assert(i == 0); +- i = inPattern('x', cast(string)null); +- assert(i == 0); +- i = inPattern('x', "^y"); +- assert(i == 1); +- i = inPattern('x', "yxxy"); +- assert(i == 1); +- i = inPattern('x', "^yxxy"); +- assert(i == 0); +- i = inPattern('x', "^abcd"); +- assert(i == 1); +- i = inPattern('^', "^^"); +- assert(i == 0); +- i = inPattern('^', "^"); +- assert(i == 1); +- i = inPattern('^', "a^"); +- assert(i == 1); +- i = inPattern('x', "a-z"); +- assert(i == 1); +- i = inPattern('x', "A-Z"); +- assert(i == 0); +- i = inPattern('x', "^a-z"); +- assert(i == 0); +- i = inPattern('x', "^A-Z"); +- assert(i == 1); +- i = inPattern('-', "a-"); +- assert(i == 1); +- i = inPattern('-', "^A-"); +- assert(i == 0); +- i = inPattern('a', "z-a"); +- assert(i == 1); +- i = inPattern('z', "z-a"); +- assert(i == 1); +- i = inPattern('x', "z-a"); +- assert(i == 0); ++ assertCTFEable!( ++ { ++ assert(inPattern('x', "x") == 1); ++ assert(inPattern('x', "y") == 0); ++ assert(inPattern('x', string.init) == 0); ++ assert(inPattern('x', "^y") == 1); ++ assert(inPattern('x', "yxxy") == 1); ++ assert(inPattern('x', "^yxxy") == 0); ++ assert(inPattern('x', "^abcd") == 1); ++ assert(inPattern('^', "^^") == 0); ++ assert(inPattern('^', "^") == 1); ++ assert(inPattern('^', "a^") == 1); ++ assert(inPattern('x', "a-z") == 1); ++ assert(inPattern('x', "A-Z") == 0); ++ assert(inPattern('x', "^a-z") == 0); ++ assert(inPattern('x', "^A-Z") == 1); ++ assert(inPattern('-', "a-") == 1); ++ assert(inPattern('-', "^A-") == 0); ++ assert(inPattern('a', "z-a") == 1); ++ assert(inPattern('z', "z-a") == 1); ++ assert(inPattern('x', "z-a") == 0); ++ }); + } + + +@@ -2868,7 +2643,7 @@ unittest + * See if character c is in the intersection of the patterns. + */ + +-bool inPattern(S)(dchar c, S[] patterns) if (isSomeString!S) ++bool inPattern(S)(dchar c, S[] patterns) @safe pure if (isSomeString!S) + { + foreach (string pattern; patterns) + { +@@ -2885,7 +2660,7 @@ bool inPattern(S)(dchar c, S[] patterns) + * Count characters in s that match pattern. + */ + +-size_t countchars(S, S1)(S s, in S1 pattern) if (isSomeString!S && isSomeString!S1) ++size_t countchars(S, S1)(S s, in S1 pattern) @safe pure if (isSomeString!S && isSomeString!S1) + { + size_t count; + foreach (dchar c; s) +@@ -2899,12 +2674,11 @@ unittest + { + debug(string) printf("std.string.count.unittest\n"); + +- size_t c; +- +- c = countchars("abc", "a-c"); +- assert(c == 3); +- c = countchars("hello world", "or"); +- assert(c == 3); ++ assertCTFEable!( ++ { ++ assert(countchars("abc", "a-c") == 3); ++ assert(countchars("hello world", "or") == 3); ++ }); + } + + +@@ -2912,14 +2686,15 @@ unittest + * Return string that is s with all characters removed that match pattern. + */ + +-S removechars(S)(S s, in S pattern) if (isSomeString!S) ++S removechars(S)(S s, in S pattern) @safe pure if (isSomeString!S) + { + Unqual!(typeof(s[0]))[] r; + bool changed = false; + + foreach (size_t i, dchar c; s) + { +- if (inPattern(c, pattern)){ ++ if (inPattern(c, pattern)) ++ { + if (!changed) + { + changed = true; +@@ -2932,23 +2707,23 @@ S removechars(S)(S s, in S pattern) if ( + std.utf.encode(r, c); + } + } +- return (changed? cast(S) r : s); ++ if (changed) ++ return r; ++ else ++ return s; + } + + unittest + { + debug(string) printf("std.string.removechars.unittest\n"); + +- string r; +- +- r = removechars("abc", "a-c"); +- assert(r.length == 0); +- r = removechars("hello world", "or"); +- assert(r == "hell wld"); +- r = removechars("hello world", "d"); +- assert(r == "hello worl"); +- r = removechars("hah", "h"); +- assert(r == "a"); ++ assertCTFEable!( ++ { ++ assert(removechars("abc", "a-c").length == 0); ++ assert(removechars("hello world", "or") == "hell wld"); ++ assert(removechars("hello world", "d") == "hello worl"); ++ assert(removechars("hah", "h") == "a"); ++ }); + } + + +@@ -2976,7 +2751,8 @@ S squeeze(S)(S s, in S pattern = null) + { + run = 1; + if (changed) +- { if (r is null) ++ { ++ if (r is null) + r = s[0 .. lasti].dup; + std.utf.encode(r, c); + } +@@ -2988,7 +2764,8 @@ S squeeze(S)(S s, in S pattern = null) + { + run = 0; + if (changed) +- { if (r is null) ++ { ++ if (r is null) + r = s[0 .. lasti].dup; + std.utf.encode(r, c); + } +@@ -3000,19 +2777,20 @@ S squeeze(S)(S s, in S pattern = null) + unittest + { + debug(string) printf("std.string.squeeze.unittest\n"); +- string s,r; + +- r = squeeze("hello"); +- //writefln("r = '%s'", r); +- assert(r == "helo"); ++ assertCTFEable!( ++ { ++ string s; ++ ++ assert(squeeze("hello") == "helo"); ++ + s = "abcd"; +- r = squeeze(s); +- assert(r is s); ++ assert(squeeze(s) is s); + s = "xyzz"; +- r = squeeze(s); +- assert(r.ptr == s.ptr); // should just be a slice +- r = squeeze("hello goodbyee", "oe"); +- assert(r == "hello godbye"); ++ assert(squeeze(s).ptr == s.ptr); // should just be a slice ++ ++ assert(squeeze("hello goodbyee", "oe") == "hello godbye"); ++ }); + } + + /*************************************************************** +@@ -3024,11 +2802,11 @@ unittest + + Example: + --- +-string s = "123abc"; +-string t = munch(s, "0123456789"); +-assert(t == "123" && s == "abc"); +-t = munch(s, "0123456789"); +-assert(t == "" && s == "abc"); ++ string s = "123abc"; ++ string t = munch(s, "0123456789"); ++ assert(t == "123" && s == "abc"); ++ t = munch(s, "0123456789"); ++ assert(t == "" && s == "abc"); + --- + + The $(D_PARAM munch) function is mostly convenient for skipping +@@ -3051,7 +2829,7 @@ S1 munch(S1, S2)(ref S1 s, S2 pattern) + return s[0 .. j]; + } + +-unittest ++@safe pure unittest + { + string s = "123abc"; + string t = munch(s, "0123456789"); +@@ -3068,7 +2846,7 @@ unittest + * repeated with the one to its immediate left. + */ + +-S succ(S)(S s) if (isSomeString!S) ++S succ(S)(S s) @safe pure if (isSomeString!S) + { + if (s.length && std.ascii.isAlphaNum(s[$ - 1])) + { +@@ -3097,7 +2875,7 @@ S succ(S)(S s) if (isSomeString!S) + auto t = new typeof(r[0])[r.length + 1]; + t[0] = cast(char) carry; + t[1 .. $] = r[]; +- return assumeUnique(t); ++ return t; + } + i--; + break; +@@ -3105,7 +2883,7 @@ S succ(S)(S s) if (isSomeString!S) + default: + if (std.ascii.isAlphaNum(c)) + r[i]++; +- return cast(S) r; ++ return r; + } + } + } +@@ -3116,20 +2894,15 @@ unittest + { + debug(string) printf("std.string.succ.unittest\n"); + +- string r; +- +- r = succ(cast(string) null); +- assert(r is null); +- r = succ("!@#$%"); +- assert(r == "!@#$%"); +- r = succ("1"); +- assert(r == "2"); +- r = succ("9"); +- assert(r == "10"); +- r = succ("999"); +- assert(r == "1000"); +- r = succ("zz99"); +- assert(r == "aaa00"); ++ assertCTFEable!( ++ { ++ assert(succ(string.init) is null); ++ assert(succ("!@#$%") == "!@#$%"); ++ assert(succ("1") == "2"); ++ assert(succ("9") == "10"); ++ assert(succ("999") == "1000"); ++ assert(succ("zz99") == "aaa00"); ++ }); + } + + +@@ -3168,7 +2941,7 @@ unittest + $(D to). + + Both $(D from) and $(D to) may contain ranges using the $(D '-') character +- (e.g. $(D "a-d") is synonymous with $(D "abcd).) Neither accept a leading ++ (e.g. $(D "a-d") is synonymous with $(D "abcd").) Neither accept a leading + $(D '^') as meaning the complement of the string (use the $(D 'c') modifier + for that). + +/ +@@ -3288,20 +3061,21 @@ unittest + import std.algorithm; + + // Complete list of test types; too slow to test'em all +- // alias TypeTuple!(char[], const(char)[], immutable(char)[], ++ // alias TestTypes = TypeTuple!( ++ // char[], const( char)[], immutable( char)[], + // wchar[], const(wchar)[], immutable(wchar)[], +- // dchar[], const(dchar)[], immutable(dchar)[]) +- // TestTypes; ++ // dchar[], const(dchar)[], immutable(dchar)[]); + + // Reduced list of test types +- alias TypeTuple!(char[], const(wchar)[], immutable(dchar)[]) +- TestTypes; ++ alias TestTypes = TypeTuple!(char[], const(wchar)[], immutable(dchar)[]); + +- foreach(S; TestTypes) ++ assertCTFEable!( ++ { ++ foreach (S; TestTypes) + { +- foreach(T; TestTypes) ++ foreach (T; TestTypes) + { +- foreach(U; TestTypes) ++ foreach (U; TestTypes) + { + assert(equal(tr(to!S("abcdef"), to!T("cd"), to!U("CD")), "abCDef")); + assert(equal(tr(to!S("abcdef"), to!T("b-d"), to!U("B-D")), "aBCDef")); +@@ -3320,6 +3094,7 @@ unittest + auto s = to!S("hello world"); + static assert(is(typeof(s) == typeof(tr(s, "he", "if")))); + } ++ }); + } + + +@@ -3370,7 +3145,7 @@ unittest + * function, or any of the conversion functions. + */ + +-bool isNumeric(const(char)[] s, in bool bAllowSep = false) ++bool isNumeric(const(char)[] s, in bool bAllowSep = false) @safe pure + { + ptrdiff_t iLen = s.length; + bool bDecimalPoint = false; +@@ -3395,7 +3170,12 @@ bool isNumeric(const(char)[] s, in bool + + // A sign is allowed only in the 1st character + if (sx[0] == '-' || sx[0] == '+') ++ { ++ if (iLen == 1) // but must be followed by other characters ++ return false; ++ + j++; ++ } + + for (int i = j; i < iLen; i++) + { +@@ -3409,6 +3189,7 @@ bool isNumeric(const(char)[] s, in bool + // Check for the complex type, and if found + // reset the flags for checking the 2nd number. + else if (c == '+') ++ { + if (i > 0) + { + bDecimalPoint = false; +@@ -3418,7 +3199,7 @@ bool isNumeric(const(char)[] s, in bool + } + else + return false; +- ++ } + // Allow only one exponent per number + else if (c == 'e') + { +@@ -3512,103 +3293,13 @@ bool isNumeric(const(char)[] s, in bool + return true; + } + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated bool isNumeric(...) +-{ +- return isNumeric(_arguments, _argptr); +-} +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated bool isNumeric(TypeInfo[] _arguments, va_list _argptr) +-{ +- auto s = ""c; +- auto ws = ""w; +- auto ds = ""d; +- +- //writefln("isNumeric(...) called!"); +- if (_arguments.length == 0) +- return false; +- +- if (_arguments[0] == typeid(char[])) +- return isNumeric(va_arg!(char[])(_argptr)); +- else if (_arguments[0] == typeid(wchar[])) +- return isNumeric(std.utf.toUTF8(va_arg!(wchar[])(_argptr))); +- else if (_arguments[0] == typeid(dchar[])) +- return isNumeric(std.utf.toUTF8(va_arg!(dstring)(_argptr))); +- else if (_arguments[0] == typeid(real)) +- return true; +- else if (_arguments[0] == typeid(double)) +- return true; +- else if (_arguments[0] == typeid(float)) +- return true; +- else if (_arguments[0] == typeid(ulong)) +- return true; +- else if (_arguments[0] == typeid(long)) +- return true; +- else if (_arguments[0] == typeid(uint)) +- return true; +- else if (_arguments[0] == typeid(int)) +- return true; +- else if (_arguments[0] == typeid(ushort)) +- return true; +- else if (_arguments[0] == typeid(short)) +- return true; +- else if (_arguments[0] == typeid(ubyte)) +- { +- char[1] t; +- t[0]= va_arg!(ubyte)(_argptr); +- return isNumeric(cast(string)t); +- } +- else if (_arguments[0] == typeid(byte)) +- { +- char[1] t; +- t[0] = va_arg!(char)(_argptr); +- return isNumeric(cast(string)t); +- } +- else if (_arguments[0] == typeid(ireal)) +- return true; +- else if (_arguments[0] == typeid(idouble)) +- return true; +- else if (_arguments[0] == typeid(ifloat)) +- return true; +- else if (_arguments[0] == typeid(creal)) +- return true; +- else if (_arguments[0] == typeid(cdouble)) +- return true; +- else if (_arguments[0] == typeid(cfloat)) +- return true; +- else if (_arguments[0] == typeid(char)) +- { +- char[1] t; +- t[0] = va_arg!(char)(_argptr); +- return isNumeric(cast(string)t); +- } +- else if (_arguments[0] == typeid(wchar)) +- { +- wchar[1] t; +- t[0] = va_arg!(wchar)(_argptr); +- return isNumeric(std.utf.toUTF8(t)); +- } +- else if (_arguments[0] == typeid(dchar)) +- { +- dchar[1] t; +- t[0] = va_arg!(dchar)(_argptr); +- dchar[] t1 = t; +- return isNumeric(std.utf.toUTF8(cast(dstring) t1)); +- } +- //else if (_arguments[0] == typeid(cent)) +- // return true; +- //else if (_arguments[0] == typeid(ucent)) +- // return true; +- else +- return false; +-} + + unittest + { +- debug (string) printf("isNumeric(in string, bool = false).unittest\n"); +- string s; ++ debug(string) printf("isNumeric(in string, bool = false).unittest\n"); + ++ assertCTFEable!( ++ { + // Test the isNumeric(in string) function + assert(isNumeric("1") == true ); + assert(isNumeric("1.0") == true ); +@@ -3634,30 +3325,23 @@ unittest + assert(isNumeric("123f") == true); + assert(isNumeric("123.u") == false); + ++ // @@@BUG@@ to!string(float) is not CTFEable. ++ // Related: formatValue(T) if (is(FloatingPointTypeOf!T)) ++ if (!__ctfe) ++ { + assert(isNumeric(to!string(real.nan)) == true); + assert(isNumeric(to!string(-real.infinity)) == true); + assert(isNumeric(to!string(123e+2+1234.78Li)) == true); ++ } + +- s = "$250.99-"; ++ string s = "$250.99-"; + assert(isNumeric(s[1..s.length - 2]) == true); + assert(isNumeric(s) == false); + assert(isNumeric(s[0..s.length - 1]) == false); +-} ++ }); + +-deprecated unittest +-{ +- // These test calling the isNumeric(...) function +- assert(isNumeric(1,123UL) == true); +- assert(isNumeric('2') == true); +- assert(isNumeric('x') == false); +- assert(isNumeric(cast(byte)0x57) == false); // 'W' +- assert(isNumeric(cast(byte)0x37) == true); // '7' +- assert(isNumeric(cast(wchar[])"145.67") == true); +- assert(isNumeric(cast(dchar[])"145.67U") == false); +- assert(isNumeric(123_000.23fi) == true); +- assert(isNumeric(123.00E-5+1234.45E-12Li) == true); +- assert(isNumeric(real.nan) == true); +- assert(isNumeric(-real.infinity) == true); ++ assert(!isNumeric("-")); ++ assert(!isNumeric("+")); + } + + +@@ -3689,7 +3373,7 @@ deprecated unittest + * but this one is the standard one. + */ + +-char[] soundex(const(char)[] string, char[] buffer = null) ++char[] soundex(const(char)[] string, char[] buffer = null) @safe pure nothrow + in + { + assert(!buffer || buffer.length >= 4); +@@ -3721,7 +3405,8 @@ body + { + } + else +- { lastc = lastc.init; ++ { ++ lastc = lastc.init; + continue; + } + if (b == 0) +@@ -3757,8 +3442,11 @@ body + return buffer; + } + +-unittest +-{ char[4] buffer; ++@safe pure nothrow unittest ++{ ++ assertCTFEable!( ++ { ++ char[4] buffer; + + assert(soundex(null) == null); + assert(soundex("") == null); +@@ -3798,6 +3486,7 @@ unittest + assert(soundex("johnsons") == "J525"); + assert(soundex("Hardin") == "H635"); + assert(soundex("Martinez") == "M635"); ++ }); + } + + +@@ -3835,12 +3524,12 @@ unittest + *
+ */ + +-string[string] abbrev(string[] values) ++string[string] abbrev(string[] values) @safe pure + { + string[string] result; + + // Make a copy when sorting so we follow COW principles. +- values = values.dup.sort; ++ values = values.dup.sort; // @@@BUG@@@ not CTFEable + + size_t values_length = values.length; + size_t lasti = values_length; +@@ -3850,25 +3539,30 @@ string[string] abbrev(string[] values) + string lv; + + for (size_t i = 0; i < values_length; i = nexti) +- { string value = values[i]; ++ { ++ string value = values[i]; + +- // Skip dups +- for (nexti = i + 1; nexti < values_length; nexti++) +- { nv = values[nexti]; +- if (value != values[nexti]) +- break; +- } ++ // Skip dups ++ for (nexti = i + 1; nexti < values_length; nexti++) ++ { ++ nv = values[nexti]; ++ if (value != values[nexti]) ++ break; ++ } + +- for (size_t j = 0; j < value.length; j += std.utf.stride(value, j)) +- { string v = value[0 .. j]; ++ for (size_t j = 0; j < value.length; j += std.utf.stride(value, j)) ++ { ++ string v = value[0 .. j]; + +- if ((nexti == values_length || j > nv.length || v != nv[0 .. j]) && +- (lasti == values_length || j > lv.length || v != lv[0 .. j])) +- result[v] = value; +- } +- result[value] = value; +- lasti = i; +- lv = value; ++ if ((nexti == values_length || j > nv.length || v != nv[0 .. j]) && ++ (lasti == values_length || j > lv.length || v != lv[0 .. j])) ++ { ++ result[v] = value; ++ } ++ } ++ result[value] = value; ++ lasti = i; ++ lv = value; + } + + return result; +@@ -3878,6 +3572,9 @@ unittest + { + debug(string) printf("string.abbrev.unittest\n"); + ++ // @@@BUG@@@ Built-in arr.sort is not CTFEable ++ //assertCTFEable!( ++ //{ + string[] values; + values ~= "hello"; + values ~= "hello"; +@@ -3899,6 +3596,7 @@ unittest + assert(r[keys[1]] == "hello"); + assert(r[keys[2]] == "hello"); + assert(r[keys[3]] == "hello"); ++ //}); + } + + +@@ -3907,7 +3605,7 @@ unittest + * leftmost column, which is numbered starting from 0. + */ + +-size_t column(S)(S str, size_t tabsize = 8) if (isSomeString!S) ++size_t column(S)(S str, size_t tabsize = 8) @safe pure if (isSomeString!S) + { + size_t column; + +@@ -3938,11 +3636,14 @@ unittest + { + debug(string) printf("string.column.unittest\n"); + +- assert(column(cast(string) null) == 0); ++ assertCTFEable!( ++ { ++ assert(column(string.init) == 0); + assert(column("") == 0); + assert(column("\t") == 8); + assert(column("abc\t") == 8); + assert(column("12345678\t") == 16); ++ }); + } + + /****************************************** +@@ -3964,7 +3665,7 @@ unittest + */ + + S wrap(S)(S s, size_t columns = 80, S firstindent = null, +- S indent = null, size_t tabsize = 8) if (isSomeString!S) ++ S indent = null, size_t tabsize = 8) @safe pure if (isSomeString!S) + { + typeof(s.dup) result; + int spaces; +@@ -4025,22 +3726,23 @@ S wrap(S)(S s, size_t columns = 80, S fi + } + result ~= '\n'; + +- return assumeUnique(result); ++ return result; + } + + unittest + { + debug(string) printf("string.wrap.unittest\n"); + +- assert(wrap(cast(string) null) == "\n"); ++ assertCTFEable!( ++ { ++ assert(wrap(string.init) == "\n"); + assert(wrap(" a b df ") == "a b df\n"); +- //writefln("'%s'", wrap(" a b df ",3)); + assert(wrap(" a b df ", 3) == "a b\ndf\n"); + assert(wrap(" a bc df ", 3) == "a\nbc\ndf\n"); +- //writefln("'%s'", wrap(" abcd df ",3)); + assert(wrap(" abcd df ", 3) == "abcd\ndf\n"); + assert(wrap("x") == "x\n"); + assert(wrap("u u") == "u u\n"); ++ }); + } + + /****************************************** +@@ -4076,13 +3778,13 @@ unittest + * + */ + +-S outdent(S)(S str) if(isSomeString!S) ++S outdent(S)(S str) @safe pure if(isSomeString!S) + { + return str.splitLines(KeepTerminator.yes).outdent().join(); + } + + /// ditto +-S[] outdent(S)(S[] lines) if(isSomeString!S) ++S[] outdent(S)(S[] lines) @safe pure if(isSomeString!S) + { + if (lines.empty) + { +@@ -4111,7 +3813,8 @@ S[] outdent(S)(S[] lines) if(isSomeStrin + // because this function throws upon inconsistent indentation. + if (shortestIndent is null || indent.length < shortestIndent.length) + { +- if (indent.empty) return lines; ++ if (indent.empty) ++ return lines; + shortestIndent = indent; + } + } +@@ -4120,6 +3823,7 @@ S[] outdent(S)(S[] lines) if(isSomeStrin + foreach (i; 0..lines.length) + { + auto stripped = __ctfe? lines[i].ctfe_strip() : lines[i].strip(); ++ + if (stripped.empty) + { + // Do nothing +@@ -4130,8 +3834,10 @@ S[] outdent(S)(S[] lines) if(isSomeStrin + } + else + { +- if (__ctfe) assert(false, "outdent: Inconsistent indentation"); +- else throw new StringException("outdent: Inconsistent indentation"); ++ if (__ctfe) ++ assert(false, "outdent: Inconsistent indentation"); ++ else ++ throw new StringException("outdent: Inconsistent indentation"); + } + } + +@@ -4163,8 +3869,10 @@ private S ctfe_stripRight(S)(S str) if(i + return str[0..endIndex]; + } + +-version(unittest) ++unittest + { ++ debug(string) printf("string.outdent.unittest\n"); ++ + template outdent_testStr(S) + { + enum S outdent_testStr = +@@ -4188,12 +3896,9 @@ version(unittest) + \t\tX + "; + } +-} +- +-unittest +-{ +- debug(string) printf("string.outdent.unittest\n"); + ++ assertCTFEable!( ++ { + static assert(ctfe_strip(" \tHi \r\n") == "Hi"); + static assert(ctfe_strip(" \tHi©\u2028 \r\n") == "Hi©"); + static assert(ctfe_strip("Hi") == "Hi"); +@@ -4253,4 +3958,5 @@ unittest + assert(testStr6.outdent() == expected6); + static assert(testStr6.outdent() == expected6); + } ++ }); + } +--- a/src/libphobos/src/std/traits.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/traits.d 2014-04-01 16:32:51.000000000 +0100 +@@ -113,7 +113,9 @@ private + alias TypeTuple!(cfloat, cdouble, creal) ComplexTypeList; + alias TypeTuple!(IntegralTypeList, FloatingPointTypeList) NumericTypeList; + alias TypeTuple!(char, wchar, dchar) CharTypeList; +- ++} ++package ++{ + /* Get an expression typed as T, like T.init */ + template defaultInit(T) + { +@@ -122,18 +124,53 @@ private + else + @property T defaultInit(); + } ++ ++ // Add specific qualifier to the given type T ++ template MutableOf(T) { alias MutableOf = T ; } ++ template InoutOf(T) { alias InoutOf = inout(T) ; } ++ template ConstOf(T) { alias ConstOf = const(T) ; } ++ template SharedOf(T) { alias SharedOf = shared(T) ; } ++ template SharedInoutOf(T) { alias SharedInoutOf = shared(inout(T)); } ++ template SharedConstOf(T) { alias SharedConstOf = shared(const(T)); } ++ template ImmutableOf(T) { alias ImmutableOf = immutable(T) ; } ++ ++ unittest ++ { ++ static assert(is( MutableOf!int == int)); ++ static assert(is( InoutOf!int == inout int)); ++ static assert(is( ConstOf!int == const int)); ++ static assert(is( SharedOf!int == shared int)); ++ static assert(is(SharedInoutOf!int == shared inout int)); ++ static assert(is(SharedConstOf!int == shared const int)); ++ static assert(is( ImmutableOf!int == immutable int)); ++ } ++ ++ // Get qualifier template from the given type T ++ template QualifierOf(T) ++ { ++ static if (is(T == shared(const U), U)) alias QualifierOf = SharedConstOf; ++ else static if (is(T == const U , U)) alias QualifierOf = ConstOf; ++ else static if (is(T == shared(inout U), U)) alias QualifierOf = SharedInoutOf; ++ else static if (is(T == inout U , U)) alias QualifierOf = InoutOf; ++ else static if (is(T == immutable U , U)) alias QualifierOf = ImmutableOf; ++ else static if (is(T == shared U , U)) alias QualifierOf = SharedOf; ++ else alias QualifierOf = MutableOf; ++ } ++ ++ unittest ++ { ++ alias Qual1 = QualifierOf!( int); static assert(is(Qual1!long == long)); ++ alias Qual2 = QualifierOf!( inout int); static assert(is(Qual2!long == inout long)); ++ alias Qual3 = QualifierOf!( const int); static assert(is(Qual3!long == const long)); ++ alias Qual4 = QualifierOf!(shared int); static assert(is(Qual4!long == shared long)); ++ alias Qual5 = QualifierOf!(shared inout int); static assert(is(Qual5!long == shared inout long)); ++ alias Qual6 = QualifierOf!(shared const int); static assert(is(Qual6!long == shared const long)); ++ alias Qual7 = QualifierOf!( immutable int); static assert(is(Qual7!long == immutable long)); ++ } + } + + version(unittest) + { +- template MutableOf(T) { alias T MutableOf; } +- template ConstOf(T) { alias const(T) ConstOf; } +- template SharedOf(T) { alias shared(T) SharedOf; } +- template SharedConstOf(T) { alias shared(const(T)) SharedConstOf; } +- template ImmutableOf(T) { alias immutable(T) ImmutableOf; } +- template WildOf(T) { alias inout(T) WildOf; } +- template SharedWildOf(T) { alias shared(inout(T)) SharedWildOf; } +- + alias TypeTuple!(MutableOf, ConstOf, SharedOf, SharedConstOf, ImmutableOf) TypeQualifierList; + + struct SubTypeOf(T) +@@ -286,6 +323,11 @@ version(unittest) + + shared(immutable(Inner) delegate(ref double, scope string) const shared @trusted nothrow) attrDeleg; + } ++ ++ private enum QualifiedEnum ++ { ++ a = 42 ++ } + } + + private template fullyQualifiedNameImplForSymbols(alias T) +@@ -300,7 +342,7 @@ private template fullyQualifiedNameImplF + if(s.skipOver("package ") || s.skipOver("module ")) + return s; + return s.findSplit("(")[0]; +- }(T.stringof); ++ }(__traits(identifier, T)); + } + + unittest +@@ -313,6 +355,7 @@ unittest + alias fqn = fullyQualifiedName; + static assert(fqn!fqn == "std.traits.fullyQualifiedName"); + static assert(fqn!(QualifiedNameTests.Inner) == "std.traits.QualifiedNameTests.Inner"); ++ static assert(fqn!(QualifiedNameTests.func) == "std.traits.QualifiedNameTests.func"); + import core.sync.barrier; + static assert(fullyQualifiedName!Barrier == "core.sync.barrier.Barrier"); + } +@@ -449,11 +492,11 @@ private template fullyQualifiedNameImplF + { + enum fullyQualifiedNameImplForTypes = "dstring"; + } +- else static if (isBasicType!T || is(T == enum)) ++ else static if (isBasicType!T && !is(T == enum)) + { + enum fullyQualifiedNameImplForTypes = chain!((Unqual!T).stringof); + } +- else static if (isAggregateType!T) ++ else static if (isAggregateType!T || is(T == enum)) + { + enum fullyQualifiedNameImplForTypes = chain!(fullyQualifiedNameImplForSymbols!T); + } +@@ -537,6 +580,8 @@ unittest + + // Basic qualified name + static assert(fqn!(Inner) == inner_name); ++ static assert(fqn!(QualifiedEnum) == "std.traits.QualifiedEnum"); // type ++ static assert(fqn!(QualifiedEnum.a) == "std.traits.QualifiedEnum.a"); // symbol + + // Array types + static assert(fqn!(typeof(array)) == format("%s[]", inner_name)); +@@ -727,7 +772,7 @@ enum ParameterStorageClass : uint + * These flags can be bitwise OR-ed together to represent complex storage + * class. + */ +- none = 0, /// ditto ++ none = 0, + scope_ = 0b000_1, /// ditto + out_ = 0b001_0, /// ditto + ref_ = 0b010_0, /// ditto +@@ -826,18 +871,18 @@ static assert([ParameterIdentifierTuple! + template ParameterIdentifierTuple(func...) + if (func.length == 1 && isCallable!func) + { +- static if (is(typeof(func[0]) PT == __parameters)) ++ static if (is(FunctionTypeOf!func PT == __parameters)) + { + template Get(size_t i) + { +- enum Get = __traits(identifier, PT[i..i+1]); +- } +- } +- else static if (is(FunctionTypeOf!func PT == __parameters)) +- { +- template Get(size_t i) +- { +- enum Get = ""; ++ static if (!isFunctionPointer!func && !isDelegate!func) ++ { ++ enum Get = __traits(identifier, PT[i..i+1]); ++ } ++ else ++ { ++ enum Get = ""; ++ } + } + } + else +@@ -881,6 +926,17 @@ unittest + // might be changed in the future? + void delegate(int num, string name, int[long] aa) dg; + static assert([PIT!dg] == ["", "", ""]); ++ ++ interface Test ++ { ++ @property string getter(); ++ @property void setter(int a); ++ Test method(int a, long b, string c); ++ } ++ static assert([PIT!(Test.getter)] == []); ++ static assert([PIT!(Test.setter)] == ["a"]); ++ static assert([PIT!(Test.method)] == ["a", "b", "c"]); ++ + /+ + // depends on internal + void baw(int, string, int[]){} +@@ -909,7 +965,7 @@ static assert( ParameterDefaultValueTu + template ParameterDefaultValueTuple(func...) + if (func.length == 1 && isCallable!func) + { +- static if (is(typeof(func[0]) PT == __parameters)) ++ static if (is(FunctionTypeOf!(func[0]) PT == __parameters)) + { + template Get(size_t i) + { +@@ -973,6 +1029,12 @@ unittest + static assert( PDVT!baz[2] == "hello"); + static assert(is(typeof(PDVT!baz) == typeof(TypeTuple!(void, 1, "hello")))); + ++ // bug 10800 - property functions return empty string ++ @property void foo(int x = 3) { } ++ static assert(PDVT!foo.length == 1); ++ static assert(PDVT!foo[0] == 3); ++ static assert(is(typeof(PDVT!foo) == typeof(TypeTuple!(3)))); ++ + struct Colour + { + ubyte a,r,g,b; +@@ -1006,7 +1068,7 @@ enum FunctionAttribute : uint + /** + * These flags can be bitwise OR-ed together to represent complex attribute. + */ +- none = 0, /// ditto ++ none = 0, + pure_ = 0b00000001, /// ditto + nothrow_ = 0b00000010, /// ditto + ref_ = 0b00000100, /// ditto +@@ -1673,22 +1735,125 @@ unittest + // Aggregate Types + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// + ++/** ++Determines whether $(D T) has its own context pointer. ++$(D T) must be either $(D class), $(D struct), or $(D union). ++*/ ++template isNested(T) ++ if(is(T == class) || is(T == struct) || is(T == union)) ++{ ++ enum isNested = __traits(isNested, T); ++} ++ ++/** ++Determines whether $(D T) or any of its representation types ++have a context pointer. ++*/ ++template hasNested(T) ++{ ++ static if(isStaticArray!T && T.length) ++ enum hasNested = hasNested!(typeof(T.init[0])); ++ else static if(is(T == class) || is(T == struct) || is(T == union)) ++ enum hasNested = isNested!T || ++ anySatisfy!(.hasNested, FieldTypeTuple!T); ++ else ++ enum hasNested = false; ++} ++ ++unittest ++{ ++ static assert(!__traits(compiles, isNested!int)); ++ static assert(!hasNested!int); ++ ++ static struct StaticStruct { } ++ static assert(!isNested!StaticStruct); ++ static assert(!hasNested!StaticStruct); ++ ++ int i; ++ struct NestedStruct { void f() { ++i; } } ++ static assert( isNested!NestedStruct); ++ static assert( hasNested!NestedStruct); ++ static assert( isNested!(immutable NestedStruct)); ++ static assert( hasNested!(immutable NestedStruct)); ++ ++ static assert(!__traits(compiles, isNested!(NestedStruct[1]))); ++ static assert( hasNested!(NestedStruct[1])); ++ static assert(!hasNested!(NestedStruct[0])); ++ ++ struct S1 { NestedStruct nested; } ++ static assert(!isNested!S1); ++ static assert( hasNested!S1); ++ ++ static struct S2 { NestedStruct nested; } ++ static assert(!isNested!S2); ++ static assert( hasNested!S2); ++ ++ static struct S3 { NestedStruct[0] nested; } ++ static assert(!isNested!S3); ++ static assert(!hasNested!S3); ++ ++ static union U { NestedStruct nested; } ++ static assert(!isNested!U); ++ static assert( hasNested!U); ++ ++ static class StaticClass { } ++ static assert(!isNested!StaticClass); ++ static assert(!hasNested!StaticClass); ++ ++ class NestedClass { void f() { ++i; } } ++ static assert( isNested!NestedClass); ++ static assert( hasNested!NestedClass); ++ static assert( isNested!(immutable NestedClass)); ++ static assert( hasNested!(immutable NestedClass)); ++ ++ static assert(!__traits(compiles, isNested!(NestedClass[1]))); ++ static assert( hasNested!(NestedClass[1])); ++ static assert(!hasNested!(NestedClass[0])); ++} ++ ++ + /*** +- * Get the types of the fields of a struct or class. ++ * Get as a typetuple the types of the fields of a struct, class, or union. + * This consists of the fields that take up memory space, + * excluding the hidden fields like the virtual function +- * table pointer. ++ * table pointer or a context pointer for nested types. ++ * If $(D T) isn't a struct, class, or union returns typetuple ++ * with one element $(D T). + */ + +-template FieldTypeTuple(S) ++template FieldTypeTuple(T) + { +- static if (is(S == struct) || is(S == class) || is(S == union)) +- alias typeof(S.tupleof) FieldTypeTuple; ++ static if (is(T == struct) || is(T == union)) ++ alias typeof(T.tupleof[0 .. $ - isNested!T]) FieldTypeTuple; ++ else static if (is(T == class)) ++ alias typeof(T.tupleof) FieldTypeTuple; + else +- alias TypeTuple!S FieldTypeTuple; +- //static assert(0, "argument is not struct or class"); ++ alias TypeTuple!T FieldTypeTuple; + } + ++unittest ++{ ++ static assert(is(FieldTypeTuple!int == TypeTuple!int)); ++ ++ static struct StaticStruct1 { } ++ static assert(is(FieldTypeTuple!StaticStruct1 == TypeTuple!())); ++ ++ static struct StaticStruct2 { int a, b; } ++ static assert(is(FieldTypeTuple!StaticStruct2 == TypeTuple!(int, int))); ++ ++ int i; ++ ++ struct NestedStruct1 { void f() { ++i; } } ++ static assert(is(FieldTypeTuple!NestedStruct1 == TypeTuple!())); ++ ++ struct NestedStruct2 { int a; void f() { ++i; } } ++ static assert(is(FieldTypeTuple!NestedStruct2 == TypeTuple!int)); ++ ++ class NestedClass { int a; void f() { ++i; } } ++ static assert(is(FieldTypeTuple!NestedClass == TypeTuple!int)); ++} ++ ++ + // // FieldOffsetsTuple + // private template FieldOffsetsTupleImpl(size_t n, T...) + // { +@@ -2439,7 +2604,7 @@ unittest + + // void static array hides actual type of bits, so "may have indirections". + static assert( hasIndirections!(void[1])); +- interface I; ++ interface I {} + struct S1 {} + struct S2 { int a; } + struct S3 { int a; int b; } +@@ -2668,8 +2833,9 @@ unittest + /** + True if $(D S) or any type embedded directly in the representation of $(D S) + defines an elaborate copy constructor. Elaborate copy constructors are +- introduced by defining $(D this(this)) for a $(D struct). (Non-struct types +- never have elaborate copy constructors.) ++ introduced by defining $(D this(this)) for a $(D struct). ++ ++ Classes and unions never have elaborate copy constructors. + */ + template hasElaborateCopyConstructor(S) + { +@@ -2680,7 +2846,7 @@ template hasElaborateCopyConstructor(S) + else static if(is(S == struct)) + { + enum hasElaborateCopyConstructor = hasMember!(S, "__postblit") +- || anySatisfy!(.hasElaborateCopyConstructor, typeof(S.tupleof)); ++ || anySatisfy!(.hasElaborateCopyConstructor, FieldTypeTuple!S); + } + else + { +@@ -2715,21 +2881,30 @@ unittest + True if $(D S) or any type directly embedded in the representation of $(D S) + defines an elaborate assignment. Elaborate assignments are introduced by + defining $(D opAssign(typeof(this))) or $(D opAssign(ref typeof(this))) +- for a $(D struct). (Non-struct types never have elaborate assignments.) ++ for a $(D struct) or when there is a compiler-generated $(D opAssign) ++ (in case $(D S) has an elaborate copy constructor or destructor). ++ ++ Classes and unions never have elaborate assignments. ++ ++ Note: Structs with (possibly nested) postblit operator(s) will have a ++ hidden yet elaborate compiler generated assignement operator (unless ++ explicitly disabled). + */ + template hasElaborateAssign(S) + { +- static if(!is(S == struct)) ++ static if(isStaticArray!S && S.length) + { +- enum bool hasElaborateAssign = false; ++ enum bool hasElaborateAssign = hasElaborateAssign!(typeof(S.init[0])); ++ } ++ else static if(is(S == struct)) ++ { ++ enum hasElaborateAssign = is(typeof(S.init.opAssign(rvalueOf!S))) || ++ is(typeof(S.init.opAssign(lvalueOf!S))) || ++ anySatisfy!(.hasElaborateAssign, FieldTypeTuple!S); + } + else + { +- @property auto ref lvalueOf() { static S s = void; return s; } +- +- enum hasElaborateAssign = is(typeof(S.init.opAssign(S.init))) || +- is(typeof(S.init.opAssign(lvalueOf))) || +- anySatisfy!(.hasElaborateAssign, typeof(S.tupleof)); ++ enum bool hasElaborateAssign = false; + } + } + +@@ -2737,34 +2912,64 @@ unittest + { + static assert(!hasElaborateAssign!int); + +- struct S { void opAssign(S) {} } ++ static struct S { void opAssign(S) {} } + static assert( hasElaborateAssign!S); + static assert(!hasElaborateAssign!(const(S))); + +- struct S1 { void opAssign(ref S1) {} } +- struct S2 { void opAssign(S1) {} } +- struct S3 { S s; } ++ static struct S1 { void opAssign(ref S1) {} } ++ static struct S2 { void opAssign(int) {} } ++ static struct S3 { S s; } + static assert( hasElaborateAssign!S1); + static assert(!hasElaborateAssign!S2); + static assert( hasElaborateAssign!S3); ++ static assert( hasElaborateAssign!(S3[1])); ++ static assert(!hasElaborateAssign!(S3[0])); + +- struct S4 ++ static struct S4 + { + void opAssign(U)(U u) {} + @disable void opAssign(U)(ref U u); + } + static assert( hasElaborateAssign!S4); + +- struct S5 { @disable this(); this(int n){ s = S(); } S s; } ++ static struct S41 ++ { ++ void opAssign(U)(ref U u) {} ++ @disable void opAssign(U)(U u); ++ } ++ static assert( hasElaborateAssign!S41); ++ ++ static struct S5 { @disable this(); this(int n){ s = S(); } S s; } + static assert( hasElaborateAssign!S5); ++ ++ static struct S6 { this(this) {} } ++ static struct S7 { this(this) {} @disable void opAssign(S7); } ++ static struct S8 { this(this) {} @disable void opAssign(S8); void opAssign(int) {} } ++ static struct S9 { this(this) {} void opAssign(int) {} } ++ static struct S10 { ~this() { } } ++ static assert( hasElaborateAssign!S6); ++ static assert(!hasElaborateAssign!S7); ++ static assert(!hasElaborateAssign!S8); ++ static assert( hasElaborateAssign!S9); ++ static assert( hasElaborateAssign!S10); ++ static struct SS6 { S6 s; } ++ static struct SS7 { S7 s; } ++ static struct SS8 { S8 s; } ++ static struct SS9 { S9 s; } ++ static assert( hasElaborateAssign!SS6); ++ static assert( hasElaborateAssign!SS7); ++ static assert( hasElaborateAssign!SS8); ++ static assert( hasElaborateAssign!SS9); + } + + /** + True if $(D S) or any type directly embedded in the representation + of $(D S) defines an elaborate destructor. Elaborate destructors + are introduced by defining $(D ~this()) for a $(D +- struct). (Non-struct types never have elaborate destructors, even +- though classes may define $(D ~this()).) ++ struct). ++ ++ Classes and unions never have elaborate destructors, even ++ though classes may define $(D ~this()). + */ + template hasElaborateDestructor(S) + { +@@ -2775,7 +2980,7 @@ template hasElaborateDestructor(S) + else static if(is(S == struct)) + { + enum hasElaborateDestructor = hasMember!(S, "__dtor") +- || anySatisfy!(.hasElaborateDestructor, typeof(S.tupleof)); ++ || anySatisfy!(.hasElaborateDestructor, FieldTypeTuple!S); + } + else + { +@@ -2844,10 +3049,9 @@ unittest + static assert(isOutputRange!(OutputRange!int, int)); + } + +-// Temporarily disabled until bug4617 is fixed. +-version(none) unittest ++unittest + { +- // 8231 ++ // 8321 + struct S { + int x; + void f(){} +@@ -2888,6 +3092,12 @@ Returns: + The members are arranged in the same order as declared in $(D E). + + Note: ++ An enum can have multiple members which have the same value. If you want ++ to use EnumMembers to e.g. generate switch cases at compile-time, ++ you should use the $(XREF typetuple, NoDuplicates) template to avoid ++ generating duplicate switch cases. ++ ++Note: + Returned values are strictly typed with $(D E). Thus, the following code + does not work without the explicit cast: + -------------------- +@@ -3630,41 +3840,45 @@ unittest + Returns $(D true) iff a value of type $(D Rhs) can be assigned to a variable of + type $(D Lhs). + ++$(D isAssignable) returns whether both an lvalue and rvalue can be assigned. ++ + If you omit $(D Rhs), $(D isAssignable) will check identity assignable of $(D Lhs). ++*/ ++enum isAssignable(Lhs, Rhs = Lhs) = isRvalueAssignable!(Lhs, Rhs) && isLvalueAssignable!(Lhs, Rhs); + +-Examples: +---- +-static assert(isAssignable!(long, int)); +-static assert(!isAssignable!(int, long)); +-static assert( isAssignable!(const(char)[], string)); +-static assert(!isAssignable!(string, char[])); ++/// ++unittest ++{ ++ static assert( isAssignable!(long, int)); ++ static assert(!isAssignable!(int, long)); ++ static assert( isAssignable!(const(char)[], string)); ++ static assert(!isAssignable!(string, char[])); + +-// int is assignable to int +-static assert( isAssignable!int); ++ // int is assignable to int ++ static assert( isAssignable!int); + +-// immutable int is not assinable to immutable int +-static assert(!isAssignable!(immutable int)); +---- +-*/ +-template isAssignable(Lhs, Rhs = Lhs) +-{ +- enum bool isAssignable = is(typeof({ +- Lhs l = void; +- void f(Rhs r) { l = r; } +- return l; +- })); ++ // immutable int is not assinable to immutable int ++ static assert(!isAssignable!(immutable int)); + } + ++// ditto ++private enum isRvalueAssignable(Lhs, Rhs = Lhs) = __traits(compiles, lvalueOf!Lhs = rvalueOf!Rhs); ++ ++// ditto ++private enum isLvalueAssignable(Lhs, Rhs = Lhs) = __traits(compiles, lvalueOf!Lhs = lvalueOf!Rhs); ++ + unittest + { +- static assert( isAssignable!(long, int)); +- static assert( isAssignable!(const(char)[], string)); ++ static assert(!isAssignable!(immutable int, int)); ++ static assert( isAssignable!(int, immutable int)); + +- static assert(!isAssignable!(int, long)); +- static assert(!isAssignable!(string, char[])); ++ static assert(!isAssignable!(inout int, int)); ++ static assert( isAssignable!(int, inout int)); ++ static assert(!isAssignable!(inout int)); + +- static assert(!isAssignable!(immutable(int), int)); +- static assert( isAssignable!(int, immutable(int))); ++ static assert( isAssignable!(shared int, int)); ++ static assert( isAssignable!(int, shared int)); ++ static assert( isAssignable!(shared int)); + + struct S { @disable this(); this(int n){} } + static assert( isAssignable!(S, S)); +@@ -3682,17 +3896,14 @@ unittest + struct S4 { void opAssign(int); } + static assert( isAssignable!(S4, S4)); + static assert( isAssignable!(S4, int)); +- static assert( isAssignable!(S4, immutable(int))); ++ static assert( isAssignable!(S4, immutable int)); + + struct S5 { @disable this(); @disable this(this); } + struct S6 { void opAssign(in ref S5); } +- static assert( isAssignable!(S6, S5)); +- static assert( isAssignable!(S6, immutable(S5))); +-} +-unittest +-{ +- static assert( isAssignable!int); +- static assert(!isAssignable!(immutable int)); ++ static assert(!isAssignable!(S6, S5)); ++ static assert(!isRvalueAssignable!(S6, S5)); ++ static assert( isLvalueAssignable!(S6, S5)); ++ static assert( isLvalueAssignable!(S6, immutable S5)); + } + + +@@ -3915,6 +4126,57 @@ unittest + } + + ++// Needed for rvalueOf/lvalueOf because "inout on return means ++// inout must be on a parameter as well" ++private struct __InoutWorkaroundStruct{} ++ ++/** ++Creates an lvalue or rvalue of type $(D T) for $(D typeof(...)) and ++$(D __traits(compiles, ...)) purposes. No actual value is returned. ++ ++Note: Trying to use returned value will result in a ++"Symbol Undefined" error at link time. ++ ++Examples: ++--- ++// Note that `f` doesn't have to be implemented ++// as is isn't called. ++int f(int); ++bool f(ref int); ++static assert(is(typeof(f(rvalueOf!int)) == int)); ++static assert(is(typeof(f(lvalueOf!int)) == bool)); ++ ++int i = rvalueOf!int; // error, no actual value is returned ++--- ++*/ ++@property T rvalueOf(T)(inout __InoutWorkaroundStruct = __InoutWorkaroundStruct.init); ++ ++/// ditto ++@property ref T lvalueOf(T)(inout __InoutWorkaroundStruct = __InoutWorkaroundStruct.init); ++ ++// Note: unittest can't be used as an example here as function overloads ++// aren't allowed inside functions. ++ ++unittest ++{ ++ void needLvalue(T)(ref T); ++ static struct S { } ++ int i; ++ struct Nested { void f() { ++i; } } ++ foreach(T; TypeTuple!(int, immutable int, inout int, string, S, Nested, Object)) ++ { ++ static assert(!__traits(compiles, needLvalue(rvalueOf!T))); ++ static assert( __traits(compiles, needLvalue(lvalueOf!T))); ++ static assert(is(typeof(rvalueOf!T) == T)); ++ static assert(is(typeof(lvalueOf!T) == T)); ++ } ++ ++ static assert(!__traits(compiles, rvalueOf!int = 1)); ++ static assert( __traits(compiles, lvalueOf!byte = 127)); ++ static assert(!__traits(compiles, lvalueOf!byte = 128)); ++} ++ ++ + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// + // SomethingTypeOf + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// +@@ -3942,17 +4204,18 @@ unittest + { + // unexpected failure, maybe dmd type-merging bug + foreach (T; TypeTuple!bool) +- foreach (Q; TypeQualifierList) +- { +- static assert( is(Q!T == BooleanTypeOf!( Q!T ))); +- static assert( is(Q!T == BooleanTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert( is(Q!T == BooleanTypeOf!( Q!T ))); ++ static assert( is(Q!T == BooleanTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(void, NumericTypeList, ImaginaryTypeList, ComplexTypeList, CharTypeList)) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(BooleanTypeOf!( Q!T )), Q!T.stringof); +- static assert(!is(BooleanTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(BooleanTypeOf!( Q!T )), Q!T.stringof); ++ static assert(!is(BooleanTypeOf!( SubTypeOf!(Q!T) ))); ++ } + } + + /* +@@ -3979,7 +4242,7 @@ template IntegralTypeOf(T) + immutable( char) idy( immutable( char) ); + immutable( wchar) idy( immutable( wchar) ); + immutable( dchar) idy( immutable( dchar) ); +- // Integrals and characers are impilcit convertible each other with value copy. ++ // Integrals and characers are implicitly convertible with each other for value copy. + // Then adding exact overloads to detect it. + immutable( byte) idy( immutable( byte) ); + immutable( ubyte) idy( immutable( ubyte) ); +@@ -4003,17 +4266,18 @@ template IntegralTypeOf(T) + unittest + { + foreach (T; IntegralTypeList) +- foreach (Q; TypeQualifierList) +- { +- static assert( is(Q!T == IntegralTypeOf!( Q!T ))); +- static assert( is(Q!T == IntegralTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert( is(Q!T == IntegralTypeOf!( Q!T ))); ++ static assert( is(Q!T == IntegralTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(void, bool, FloatingPointTypeList, ImaginaryTypeList, ComplexTypeList, CharTypeList)) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(IntegralTypeOf!( Q!T ))); +- static assert(!is(IntegralTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(IntegralTypeOf!( Q!T ))); ++ static assert(!is(IntegralTypeOf!( SubTypeOf!(Q!T) ))); ++ } + } + + /* +@@ -4044,17 +4308,18 @@ template FloatingPointTypeOf(T) + unittest + { + foreach (T; FloatingPointTypeList) +- foreach (Q; TypeQualifierList) +- { +- static assert( is(Q!T == FloatingPointTypeOf!( Q!T ))); +- static assert( is(Q!T == FloatingPointTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert( is(Q!T == FloatingPointTypeOf!( Q!T ))); ++ static assert( is(Q!T == FloatingPointTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(void, bool, IntegralTypeList, ImaginaryTypeList, ComplexTypeList, CharTypeList)) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(FloatingPointTypeOf!( Q!T ))); +- static assert(!is(FloatingPointTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(FloatingPointTypeOf!( Q!T ))); ++ static assert(!is(FloatingPointTypeOf!( SubTypeOf!(Q!T) ))); ++ } + } + + /* +@@ -4072,17 +4337,18 @@ template NumericTypeOf(T) + unittest + { + foreach (T; NumericTypeList) +- foreach (Q; TypeQualifierList) +- { +- static assert( is(Q!T == NumericTypeOf!( Q!T ))); +- static assert( is(Q!T == NumericTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert( is(Q!T == NumericTypeOf!( Q!T ))); ++ static assert( is(Q!T == NumericTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(void, bool, CharTypeList, ImaginaryTypeList, ComplexTypeList)) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(NumericTypeOf!( Q!T ))); +- static assert(!is(NumericTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(NumericTypeOf!( Q!T ))); ++ static assert(!is(NumericTypeOf!( SubTypeOf!(Q!T) ))); ++ } + } + + /* +@@ -4123,7 +4389,7 @@ template CharTypeOf(T) + immutable( char) idy( immutable( char) ); + immutable( wchar) idy( immutable( wchar) ); + immutable( dchar) idy( immutable( dchar) ); +- // Integrals and characers are impilcit convertible each other with value copy. ++ // Integrals and characers are implicitly convertible with each other for value copy. + // Then adding exact overloads to detect it. + immutable( byte) idy( immutable( byte) ); + immutable( ubyte) idy( immutable( ubyte) ); +@@ -4131,8 +4397,6 @@ template CharTypeOf(T) + immutable(ushort) idy( immutable(ushort) ); + immutable( int) idy( immutable( int) ); + immutable( uint) idy( immutable( uint) ); +- immutable( long) idy( immutable( long) ); +- immutable( ulong) idy( immutable( ulong) ); + + static if (is(T == enum)) + alias .CharTypeOf!(OriginalType!T) CharTypeOf; +@@ -4147,23 +4411,25 @@ template CharTypeOf(T) + unittest + { + foreach (T; CharTypeList) +- foreach (Q; TypeQualifierList) +- { +- static assert( is(CharTypeOf!( Q!T ))); +- static assert( is(CharTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert( is(CharTypeOf!( Q!T ))); ++ static assert( is(CharTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(void, bool, NumericTypeList, ImaginaryTypeList, ComplexTypeList)) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(CharTypeOf!( Q!T ))); +- static assert(!is(CharTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(CharTypeOf!( Q!T ))); ++ static assert(!is(CharTypeOf!( SubTypeOf!(Q!T) ))); ++ } ++ + foreach (T; TypeTuple!(string, wstring, dstring, char[4])) +- foreach (Q; TypeQualifierList) +- { +- static assert(!is(CharTypeOf!( Q!T ))); +- static assert(!is(CharTypeOf!( SubTypeOf!(Q!T) ))); +- } ++ foreach (Q; TypeQualifierList) ++ { ++ static assert(!is(CharTypeOf!( Q!T ))); ++ static assert(!is(CharTypeOf!( SubTypeOf!(Q!T) ))); ++ } + } + + /* +@@ -4183,20 +4449,21 @@ template StaticArrayTypeOf(T) + unittest + { + foreach (T; TypeTuple!(bool, NumericTypeList, ImaginaryTypeList, ComplexTypeList)) +- foreach (Q; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- { +- static assert(is( Q!( T[1] ) == StaticArrayTypeOf!( Q!( T[1] ) ) )); ++ foreach (Q; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ { ++ static assert(is( Q!( T[1] ) == StaticArrayTypeOf!( Q!( T[1] ) ) )); ++ ++ foreach (P; TypeQualifierList) ++ { // SubTypeOf cannot have inout type ++ static assert(is( Q!(P!(T[1])) == StaticArrayTypeOf!( Q!(SubTypeOf!(P!(T[1]))) ) )); ++ } ++ } + +- foreach (P; TypeQualifierList) +- { // SubTypeOf cannot have inout type +- static assert(is( Q!(P!(T[1])) == StaticArrayTypeOf!( Q!(SubTypeOf!(P!(T[1]))) ) )); +- } +- } + foreach (T; TypeTuple!void) +- foreach (Q; TypeTuple!TypeQualifierList) +- { +- static assert(is( StaticArrayTypeOf!( Q!(void[1]) ) == Q!(void[1]) )); +- } ++ foreach (Q; TypeTuple!TypeQualifierList) ++ { ++ static assert(is( StaticArrayTypeOf!( Q!(void[1]) ) == Q!(void[1]) )); ++ } + } + + /* +@@ -4229,17 +4496,17 @@ template DynamicArrayTypeOf(T) + unittest + { + foreach (T; TypeTuple!(/*void, */bool, NumericTypeList, ImaginaryTypeList, ComplexTypeList)) +- foreach (Q; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- { +- static assert(is( Q!T[] == DynamicArrayTypeOf!( Q!T[] ) )); +- static assert(is( Q!(T[]) == DynamicArrayTypeOf!( Q!(T[]) ) )); ++ foreach (Q; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ { ++ static assert(is( Q!T[] == DynamicArrayTypeOf!( Q!T[] ) )); ++ static assert(is( Q!(T[]) == DynamicArrayTypeOf!( Q!(T[]) ) )); + +- foreach (P; TypeTuple!(MutableOf, ConstOf, ImmutableOf)) +- { +- static assert(is( Q!(P!T[]) == DynamicArrayTypeOf!( Q!(SubTypeOf!(P!T[])) ) )); +- static assert(is( Q!(P!(T[])) == DynamicArrayTypeOf!( Q!(SubTypeOf!(P!(T[]))) ) )); +- } +- } ++ foreach (P; TypeTuple!(MutableOf, ConstOf, ImmutableOf)) ++ { ++ static assert(is( Q!(P!T[]) == DynamicArrayTypeOf!( Q!(SubTypeOf!(P!T[])) ) )); ++ static assert(is( Q!(P!(T[])) == DynamicArrayTypeOf!( Q!(SubTypeOf!(P!(T[]))) ) )); ++ } ++ } + + static assert(!is(DynamicArrayTypeOf!(int[3]))); + static assert(!is(DynamicArrayTypeOf!(void[3]))); +@@ -4284,24 +4551,25 @@ template StringTypeOf(T) + unittest + { + foreach (T; CharTypeList) +- foreach (Q; TypeTuple!(MutableOf, ConstOf, ImmutableOf, WildOf)) +- { +- static assert(is(Q!T[] == StringTypeOf!( Q!T[] ))); +- +- static if (!__traits(isSame, Q, WildOf)) ++ foreach (Q; TypeTuple!(MutableOf, ConstOf, ImmutableOf, InoutOf)) + { +- static assert(is(Q!T[] == StringTypeOf!( SubTypeOf!(Q!T[]) ))); ++ static assert(is(Q!T[] == StringTypeOf!( Q!T[] ))); ++ ++ static if (!__traits(isSame, Q, InoutOf)) ++ { ++ static assert(is(Q!T[] == StringTypeOf!( SubTypeOf!(Q!T[]) ))); + +- alias Q!T[] Str; +- class C(Str) { Str val; alias val this; } +- static assert(is(StringTypeOf!(C!Str) == Str)); ++ alias Q!T[] Str; ++ class C(Str) { Str val; alias val this; } ++ static assert(is(StringTypeOf!(C!Str) == Str)); ++ } + } +- } ++ + foreach (T; CharTypeList) +- foreach (Q; TypeTuple!(SharedOf, SharedConstOf, SharedWildOf)) +- { +- static assert(!is(StringTypeOf!( Q!T[] ))); +- } ++ foreach (Q; TypeTuple!(SharedOf, SharedConstOf, SharedInoutOf)) ++ { ++ static assert(!is(StringTypeOf!( Q!T[] ))); ++ } + } + + /* +@@ -4330,7 +4598,6 @@ template AssocArrayTypeOf(T) + else static if (is(typeof(idz(defaultInit!T)) X)) + { + inout( V [K]) idzp(K, V)( inout( V [K]) ); +- inout( shared(V) [K]) idzp(K, V)( inout( shared(V) [K]) ); + inout( const(V) [K]) idzp(K, V)( inout( const(V) [K]) ); + inout(shared(const V) [K]) idzp(K, V)( inout(shared(const V) [K]) ); + inout( immutable(V) [K]) idzp(K, V)( inout( immutable(V) [K]) ); +@@ -4349,20 +4616,21 @@ template AssocArrayTypeOf(T) + unittest + { + foreach (T; TypeTuple!(int/*bool, CharTypeList, NumericTypeList, ImaginaryTypeList, ComplexTypeList*/)) +- foreach (P; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- foreach (Q; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- foreach (R; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- { +- static assert(is( P!(Q!T[R!T]) == AssocArrayTypeOf!( P!(Q!T[R!T]) ) )); +- } ++ foreach (P; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ foreach (Q; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ foreach (R; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ { ++ static assert(is( P!(Q!T[R!T]) == AssocArrayTypeOf!( P!(Q!T[R!T]) ) )); ++ } ++ + foreach (T; TypeTuple!(int/*bool, CharTypeList, NumericTypeList, ImaginaryTypeList, ComplexTypeList*/)) +- foreach (O; TypeTuple!(TypeQualifierList, WildOf, SharedWildOf)) +- foreach (P; TypeTuple!TypeQualifierList) +- foreach (Q; TypeTuple!TypeQualifierList) +- foreach (R; TypeTuple!TypeQualifierList) +- { +- static assert(is( O!(P!(Q!T[R!T])) == AssocArrayTypeOf!( O!(SubTypeOf!(P!(Q!T[R!T]))) ) )); +- } ++ foreach (O; TypeTuple!(TypeQualifierList, InoutOf, SharedInoutOf)) ++ foreach (P; TypeTuple!TypeQualifierList) ++ foreach (Q; TypeTuple!TypeQualifierList) ++ foreach (R; TypeTuple!TypeQualifierList) ++ { ++ static assert(is( O!(P!(Q!T[R!T])) == AssocArrayTypeOf!( O!(SubTypeOf!(P!(Q!T[R!T]))) ) )); ++ } + } + + /* +@@ -4899,10 +5167,13 @@ unittest + */ + template isExpressionTuple(T ...) + { +- static if (T.length > 0) ++ static if (T.length >= 2) + enum bool isExpressionTuple = +- !is(T[0]) && __traits(compiles, { auto ex = T[0]; }) && +- isExpressionTuple!(T[1 .. $]); ++ isExpressionTuple!(T[0 .. $/2]) && ++ isExpressionTuple!(T[$/2 .. $]); ++ else static if (T.length == 1) ++ enum bool isExpressionTuple = ++ !is(T[0]) && __traits(compiles, { auto ex = T[0]; }); + else + enum bool isExpressionTuple = true; // default + } +@@ -4932,8 +5203,10 @@ Detect whether tuple $(D T) is a type tu + */ + template isTypeTuple(T...) + { +- static if (T.length > 0) +- enum bool isTypeTuple = is(T[0]) && isTypeTuple!(T[1 .. $]); ++ static if (T.length >= 2) ++ enum bool isTypeTuple = isTypeTuple!(T[0 .. $/2]) && isTypeTuple!(T[$/2 .. $]); ++ else static if (T.length == 1) ++ enum bool isTypeTuple = is(T[0]); + else + enum bool isTypeTuple = true; // default + } +@@ -4993,25 +5266,42 @@ unittest + } + + /** +-Detect whether $(D T) is a delegate. ++Detect whether symbol or type $(D T) is a delegate. + */ + template isDelegate(T...) +- if(T.length == 1) ++ if (T.length == 1) + { +- enum bool isDelegate = is(T[0] == delegate); ++ static if (is(typeof(& T[0]) U : U*) && is(typeof(& T[0]) U == delegate)) ++ { ++ // T is a (nested) function symbol. ++ enum bool isDelegate = true; ++ } ++ else static if (is(T[0] W) || is(typeof(T[0]) W)) ++ { ++ // T is an expression or a type. Take the type of it and examine. ++ enum bool isDelegate = is(W == delegate); ++ } ++ else ++ enum bool isDelegate = false; + } + + unittest + { +- static assert( isDelegate!(void delegate())); +- static assert( isDelegate!(uint delegate(uint))); +- static assert( isDelegate!(shared uint delegate(uint))); ++ static void sfunc() { } ++ int x; ++ void func() { x++; } + +- static assert(!isDelegate!uint); +- static assert(!isDelegate!(void function())); ++ int delegate() dg; ++ assert(isDelegate!dg); ++ assert(isDelegate!(int delegate())); ++ assert(isDelegate!(typeof(&func))); ++ ++ int function() fp; ++ assert(!isDelegate!fp); ++ assert(!isDelegate!(int function())); ++ assert(!isDelegate!(typeof(&sfunc))); + } + +- + /** + Detect whether symbol or type $(D T) is a function, a function pointer or a delegate. + */ +@@ -5150,6 +5440,22 @@ unittest + } + + /** ++Determines whether function $(D f) requires a context pointer. ++*/ ++template isNestedFunction(alias f) ++{ ++ enum isNestedFunction = __traits(isNested, f); ++} ++ ++unittest ++{ ++ static void f() { } ++ void g() { } ++ static assert(!isNestedFunction!f); ++ static assert( isNestedFunction!g); ++} ++ ++/** + * Detect whether $(D T) is a an abstract class. + */ + template isAbstractClass(T...) +@@ -5217,10 +5523,11 @@ template Unqual(T) + } + else // workaround + { +- static if (is(T U == shared(const U))) alias U Unqual; ++ static if (is(T U == shared(inout U))) alias U Unqual; ++ else static if (is(T U == shared(const U))) alias U Unqual; ++ else static if (is(T U == inout U )) alias U Unqual; + else static if (is(T U == const U )) alias U Unqual; + else static if (is(T U == immutable U )) alias U Unqual; +- else static if (is(T U == inout U )) alias U Unqual; + else static if (is(T U == shared U )) alias U Unqual; + else alias T Unqual; + } +@@ -5228,12 +5535,13 @@ template Unqual(T) + + unittest + { +- static assert(is(Unqual!int == int)); +- static assert(is(Unqual!(const int) == int)); +- static assert(is(Unqual!(immutable int) == int)); +- static assert(is(Unqual!(inout int) == int)); +- static assert(is(Unqual!(shared int) == int)); +- static assert(is(Unqual!(shared(const int)) == int)); ++ static assert(is(Unqual!( int) == int)); ++ static assert(is(Unqual!( const int) == int)); ++ static assert(is(Unqual!( inout int) == int)); ++ static assert(is(Unqual!( immutable int) == int)); ++ static assert(is(Unqual!( shared int) == int)); ++ static assert(is(Unqual!(shared const int) == int)); ++ static assert(is(Unqual!(shared inout int) == int)); + alias immutable(int[]) ImmIntArr; + static assert(is(Unqual!ImmIntArr == immutable(int)[])); + } +@@ -5241,7 +5549,9 @@ unittest + // [For internal use] + private template ModifyTypePreservingSTC(alias Modifier, T) + { +- static if (is(T U == shared(const U))) alias shared(const Modifier!U) ModifyTypePreservingSTC; ++ static if (is(T U == shared(inout U))) alias shared(inout Modifier!U) ModifyTypePreservingSTC; ++ else static if (is(T U == shared(const U))) alias shared(const Modifier!U) ModifyTypePreservingSTC; ++ else static if (is(T U == inout U )) alias inout(Modifier!U) ModifyTypePreservingSTC; + else static if (is(T U == const U )) alias const(Modifier!U) ModifyTypePreservingSTC; + else static if (is(T U == immutable U )) alias immutable(Modifier!U) ModifyTypePreservingSTC; + else static if (is(T U == shared U )) alias shared(Modifier!U) ModifyTypePreservingSTC; +@@ -5250,10 +5560,13 @@ private template ModifyTypePreservingSTC + + unittest + { +- static assert(is(ModifyTypePreservingSTC!(Intify, const real) == const int)); +- static assert(is(ModifyTypePreservingSTC!(Intify, immutable real) == immutable int)); +- static assert(is(ModifyTypePreservingSTC!(Intify, shared real) == shared int)); +- static assert(is(ModifyTypePreservingSTC!(Intify, shared(const real)) == shared(const int))); ++ static assert(is(ModifyTypePreservingSTC!(Intify, real) == int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, shared real) == shared int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, immutable real) == immutable int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, const real) == const int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, inout real) == inout int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, shared const real) == shared const int)); ++ static assert(is(ModifyTypePreservingSTC!(Intify, shared inout real) == shared inout int)); + } + version (unittest) private template Intify(T) { alias int Intify; } + +@@ -5426,13 +5739,13 @@ template Largest(T...) if(T.length >= 1) + } + else + { +- alias Largest!(Largest!(T[0], T[1]), T[2..$]) Largest; ++ alias Largest!(Largest!(T[0 .. $/2]), Largest!(T[$/2 .. $])) Largest; + } + } + + unittest + { +- static assert(is(Largest!(uint, ubyte, ulong, real) == real)); ++ static assert(is(Largest!(uint, ubyte, ushort, real) == real)); + static assert(is(Largest!(ulong, double) == ulong)); + static assert(is(Largest!(double, ulong) == double)); + static assert(is(Largest!(uint, byte, double, short) == double)); +@@ -5473,78 +5786,20 @@ unittest + static assert(is(S3 == immutable(int))); + } + +-/** +- * Returns the corresponding unsigned value for $(D x), e.g. if $(D x) +- * has type $(D int), returns $(D cast(uint) x). The advantage +- * compared to the cast is that you do not need to rewrite the cast if +- * $(D x) later changes type to e.g. $(D long). +- */ +-auto unsigned(T)(T x) if (isIntegral!T) +-{ +- static if (is(Unqual!T == byte )) return cast(ubyte ) x; +- else static if (is(Unqual!T == short)) return cast(ushort) x; +- else static if (is(Unqual!T == int )) return cast(uint ) x; +- else static if (is(Unqual!T == long )) return cast(ulong ) x; +- else +- { +- static assert(T.min == 0, "Bug in either unsigned or isIntegral"); +- return cast(Unqual!T) x; +- } +-} + +-unittest +-{ +- foreach(T; TypeTuple!(byte, ubyte)) +- { +- static assert(is(typeof(unsigned(cast(T)1)) == ubyte)); +- static assert(is(typeof(unsigned(cast(const T)1)) == ubyte)); +- static assert(is(typeof(unsigned(cast(immutable T)1)) == ubyte)); +- } ++// Remove import when unsigned is removed. ++import std.conv; + +- foreach(T; TypeTuple!(short, ushort)) +- { +- static assert(is(typeof(unsigned(cast(T)1)) == ushort)); +- static assert(is(typeof(unsigned(cast(const T)1)) == ushort)); +- static assert(is(typeof(unsigned(cast(immutable T)1)) == ushort)); +- } ++// Purposefully undocumented. Will be removed in June 2014. ++deprecated("unsigned has been moved to std.conv. Please adjust your imports accordingly.") ++alias std.conv.unsigned unsigned; + +- foreach(T; TypeTuple!(int, uint)) +- { +- static assert(is(typeof(unsigned(cast(T)1)) == uint)); +- static assert(is(typeof(unsigned(cast(const T)1)) == uint)); +- static assert(is(typeof(unsigned(cast(immutable T)1)) == uint)); +- } +- +- foreach(T; TypeTuple!(long, ulong)) +- { +- static assert(is(typeof(unsigned(cast(T)1)) == ulong)); +- static assert(is(typeof(unsigned(cast(const T)1)) == ulong)); +- static assert(is(typeof(unsigned(cast(immutable T)1)) == ulong)); +- } +-} +- +-auto unsigned(T)(T x) if (isSomeChar!T) +-{ +- // All characters are unsigned +- static assert(T.min == 0); +- return cast(Unqual!T) x; +-} +- +-unittest +-{ +- foreach(T; TypeTuple!(char, wchar, dchar)) +- { +- static assert(is(typeof(unsigned(cast(T)'A')) == T)); +- static assert(is(typeof(unsigned(cast(const T)'A')) == T)); +- static assert(is(typeof(unsigned(cast(immutable T)'A')) == T)); +- } +-} + + /** + Returns the most negative value of the numeric type T. + */ + template mostNegative(T) +- if(isNumeric!T || isSomeChar!T) ++ if(isNumeric!T || isSomeChar!T || isBoolean!T) + { + static if (is(typeof(T.min_normal))) + enum mostNegative = -T.max; +@@ -5559,8 +5814,9 @@ unittest + static assert(mostNegative!float == -float.max); + static assert(mostNegative!double == -double.max); + static assert(mostNegative!real == -real.max); ++ static assert(mostNegative!bool == false); + +- foreach(T; TypeTuple!(byte, short, int, long)) ++ foreach(T; TypeTuple!(bool, byte, short, int, long)) + static assert(mostNegative!T == T.min); + + foreach(T; TypeTuple!(ubyte, ushort, uint, ulong, char, wchar, dchar)) +@@ -5675,10 +5931,12 @@ unittest + // Test for bug 5718 + import std.demangle; + int foo; +- assert(demangle(mangledName!foo)[$-7 .. $] == "int foo"); ++ auto foo_demangled = demangle(mangledName!foo); ++ assert(foo_demangled[0 .. 4] == "int " && foo_demangled[$-3 .. $] == "foo"); + + void bar(){} +- assert(demangle(mangledName!bar)[$-10 .. $] == "void bar()"); ++ auto bar_demangled = demangle(mangledName!bar); ++ assert(bar_demangled[0 .. 5] == "void " && bar_demangled[$-5 .. $] == "bar()"); + } + + +@@ -5686,24 +5944,28 @@ unittest + // XXX Select & select should go to another module. (functional or algorithm?) + + /** +-Aliases itself to $(D T) if the boolean $(D condition) is $(D true) +-and to $(D F) otherwise. +- +-Example: +----- +-alias Select!(size_t.sizeof == 4, int, long) Int; +----- ++Aliases itself to $(D T[0]) if the boolean $(D condition) is $(D true) ++and to $(D T[1]) otherwise. + */ +-template Select(bool condition, T, F) ++template Select(bool condition, T...) if (T.length == 2) + { +- static if (condition) alias T Select; +- else alias F Select; ++ alias Select = T[!condition]; + } + ++/// + unittest + { ++ // can select types + static assert(is(Select!(true, int, long) == int)); + static assert(is(Select!(false, int, long) == long)); ++ ++ // can select symbols ++ int a = 1; ++ int b = 2; ++ alias selA = Select!(true, a, b); ++ alias selB = Select!(false, a, b); ++ assert(selA == 1); ++ assert(selB == 2); + } + + /** +--- a/src/libphobos/src/std/typecons.d 2013-06-02 11:37:56.000000000 +0100 ++++ b/src/libphobos/src/std/typecons.d 2014-04-01 16:32:51.000000000 +0100 +@@ -45,7 +45,7 @@ Authors: $(WEB erdani.org, Andrei Alex + module std.typecons; + import core.memory, core.stdc.stdlib; + import std.algorithm, std.array, std.conv, std.exception, std.format, +- std.metastrings, std.traits, std.typetuple, std.range; ++ std.string, std.traits, std.typetuple, std.range; + + debug(Unique) import std.stdio; + +@@ -268,10 +268,8 @@ Tuple!(int, int) point2; + assert(!is(typeof(point1) == typeof(point2))); // passes + ---- + */ +-struct Tuple(Specs...) ++template Tuple(Specs...) + { +-private: +- + // Parse (type,name) pairs (FieldSpecs) out of the specified + // arguments. Some fields would have name, others not. + template parseSpecs(Specs...) +@@ -318,16 +316,15 @@ private: + // : + // NOTE: field[k] is an expression (which yields a symbol of a + // variable) and can't be aliased directly. +- static string injectNamedFields() ++ string injectNamedFields() + { + string decl = ""; + foreach (i, name; staticMap!(extractName, fieldSpecs)) + { +- enum numbered = toStringNow!(i); +- decl ~= "alias Identity!(field[" ~ numbered ~ "]) _" ~ numbered ~ ";"; ++ decl ~= format("alias Identity!(field[%s]) _%s;", i, i); + if (name.length != 0) + { +- decl ~= "alias _" ~ numbered ~ " " ~ name ~ ";"; ++ decl ~= format("alias _%s %s;", i, name); + } + } + return decl; +@@ -353,206 +350,229 @@ private: + } + } + +- template defaultInit(T) +- { +- static if (!is(typeof({ T v = void; }))) // inout(U) and others +- @property T defaultInit(T v = T.init); +- else +- @property T defaultInit(); +- } +- template isCompatibleTuples(Tup1, Tup2, string op) ++ template areCompatibleTuples(Tup1, Tup2, string op) + { +- enum isCompatibleTuples = is(typeof( ++ enum areCompatibleTuples = isTuple!Tup2 && is(typeof( + { + Tup1 tup1 = void; + Tup2 tup2 = void; + static assert(tup1.field.length == tup2.field.length); + foreach (i, _; Tup1.Types) + { +- // this doesn't work if typeof(tup1.field[i]) == const(int) +- //typeof(tup1.field[i]) lhs = void; +- //typeof(tup2.field[i]) rhs = void; +- auto lhs = defaultInit!(typeof(tup1.field[i])); // workaround +- auto rhs = defaultInit!(typeof(tup2.field[i])); ++ auto lhs = typeof(tup1.field[i]).init; ++ auto rhs = typeof(tup2.field[i]).init; + auto result = mixin("lhs "~op~" rhs"); + } + })); + } + +-public: +-/** +- The type of the tuple's components. +-*/ +- alias staticMap!(extractType, fieldSpecs) Types; ++ struct Tuple ++ { ++ /** ++ * The type of the tuple's components. ++ */ ++ alias staticMap!(extractType, fieldSpecs) Types; + +- Types field; +- mixin(injectNamedFields()); +- alias field expand; +- alias field this; ++ /** ++ * Use $(D t.expand) for a tuple $(D t) to expand it into its ++ * components. The result of $(D expand) acts as if the tuple components ++ * were listed as a list of values. (Ordinarily, a $(D Tuple) acts as a ++ * single value.) ++ * ++ * Examples: ++ * ---- ++ * auto t = tuple(1, " hello ", 2.3); ++ * writeln(t); // Tuple!(int, string, double)(1, " hello ", 2.3) ++ * writeln(t.expand); // 1 hello 2.3 ++ * ---- ++ */ ++ Types expand; ++ mixin(injectNamedFields()); + +- // This mitigates breakage of old code now that std.range.Zip uses +- // Tuple instead of the old Proxy. It's intentionally lacking ddoc +- // because it was intended for deprecation. +- // Now that it has been deprecated, it will be removed in January 2013. +- deprecated auto at(size_t index)() { +- return field[index]; +- } ++ static if (is(Specs)) ++ { ++ // This is mostly to make t[n] work. ++ alias expand this; ++ } ++ else ++ { ++ @property ++ ref inout(Tuple!Types) _Tuple_super() inout @trusted ++ { ++ foreach (i, _; Types) // Rely on the field layout ++ { ++ static assert(typeof(return).init.tupleof[i].offsetof == ++ expand[i].offsetof); ++ } ++ return *cast(typeof(return)*) &(field[0]); ++ } ++ // This is mostly to make t[n] work. ++ alias _Tuple_super this; ++ } + +-/** +- Constructor taking one value for each field. Each argument must be +- implicitly assignable to the respective element of the target. +- */ +- this(U...)(U values) if (U.length == Types.length) +- { +- foreach (i, Unused; Types) ++ // backwards compatibility ++ alias field = expand; ++ ++ /** ++ * Constructor taking one value for each field. Each argument must be ++ * implicitly assignable to the respective element of the target. ++ */ ++ this()(Types values) + { +- field[i] = values[i]; ++ field[] = values[]; + } +- } + +-/** +- Constructor taking a compatible tuple. Each element of the source +- must be implicitly assignable to the respective element of the +- target. +- */ +- this(U)(U another) +- if (isTuple!U && isCompatibleTuples!(typeof(this), U, "=")) +- { +- foreach (i, T; Types) ++ /** ++ * Constructor taking a compatible array. The array element type must ++ * be implicitly assignable to each element of the target. ++ * ++ * Examples: ++ * ---- ++ * int[2] ints; ++ * Tuple!(int, int) t = ints; ++ * ---- ++ */ ++ this(U, size_t n)(U[n] values) ++ if (n == Types.length && ++ is(typeof({ foreach (i, _; Types) field[i] = values[i]; }))) + { +- field[i] = another.field[i]; ++ foreach (i, _; Types) ++ { ++ field[i] = values[i]; ++ } + } +- } + +-/** +- Comparison for equality. +- */ +- bool opEquals(R)(R rhs) +- if (isTuple!R && isCompatibleTuples!(typeof(this), R, "==")) +- { +- foreach (i, Unused; Types) ++ /** ++ * Constructor taking a compatible tuple. Each element of the source ++ * must be implicitly assignable to the respective element of the ++ * target. ++ */ ++ this(U)(U another) ++ if (areCompatibleTuples!(typeof(this), U, "=")) + { +- if (field[i] != rhs.field[i]) return false; ++ field[] = another.field[]; + } +- return true; +- } +- /// ditto +- bool opEquals(R)(R rhs) const +- if (isTuple!R && isCompatibleTuples!(typeof(this), R, "==")) +- { +- foreach (i, Unused; Types) ++ ++ /** ++ * Comparison for equality. ++ */ ++ bool opEquals(R)(R rhs) ++ if (areCompatibleTuples!(typeof(this), R, "==")) + { +- if (field[i] != rhs.field[i]) return false; ++ return field[] == rhs.field[]; ++ } ++ /// ditto ++ bool opEquals(R)(R rhs) const ++ if (areCompatibleTuples!(typeof(this), R, "==")) ++ { ++ return field[] == rhs.field[]; + } +- return true; +- } + +-/** +- Comparison for ordering. +- */ +- int opCmp(R)(R rhs) +- if (isTuple!R && isCompatibleTuples!(typeof(this), R, "<")) +- { +- foreach (i, Unused; Types) ++ /** ++ * Comparison for ordering. ++ */ ++ int opCmp(R)(R rhs) ++ if (areCompatibleTuples!(typeof(this), R, "<")) + { +- if (field[i] != rhs.field[i]) ++ foreach (i, Unused; Types) + { +- return field[i] < rhs.field[i] ? -1 : 1; ++ if (field[i] != rhs.field[i]) ++ { ++ return field[i] < rhs.field[i] ? -1 : 1; ++ } + } ++ return 0; + } +- return 0; +- } +- /// ditto +- int opCmp(R)(R rhs) const +- if (isTuple!R && isCompatibleTuples!(typeof(this), R, "<")) +- { +- foreach (i, Unused; Types) ++ /// ditto ++ int opCmp(R)(R rhs) const ++ if (areCompatibleTuples!(typeof(this), R, "<")) + { +- if (field[i] != rhs.field[i]) ++ foreach (i, Unused; Types) + { +- return field[i] < rhs.field[i] ? -1 : 1; ++ if (field[i] != rhs.field[i]) ++ { ++ return field[i] < rhs.field[i] ? -1 : 1; ++ } + } ++ return 0; + } +- return 0; +- } + +-/** +- Assignment from another tuple. Each element of the source must be +- implicitly assignable to the respective element of the target. +- */ +- void opAssign(R)(R rhs) +- if (isTuple!R && allSatisfy!(isAssignable, Types)) +- { +- static assert(field.length == rhs.field.length, +- "Length mismatch in attempting to assign a " +- ~ R.stringof ~" to a "~ typeof(this).stringof); +- // Do not swap; opAssign should be called on the fields. +- foreach (i, Unused; Types) ++ /** ++ * Assignment from another tuple. Each element of the source must be ++ * implicitly assignable to the respective element of the target. ++ */ ++ void opAssign(R)(auto ref R rhs) ++ if (areCompatibleTuples!(typeof(this), R, "=")) + { +- field[i] = rhs.field[i]; ++ static if (is(R : Tuple!Types) && !__traits(isRef, rhs)) ++ { ++ if (__ctfe) ++ { ++ // Cannot use swap at compile time ++ field[] = rhs.field[]; ++ } ++ else ++ { ++ // Use swap-and-destroy to optimize rvalue assignment ++ swap!(Tuple!Types)(this, rhs); ++ } ++ } ++ else ++ { ++ // Do not swap; opAssign should be called on the fields. ++ field[] = rhs.field[]; ++ } + } +- } +- +- // @@@BUG4424@@@ workaround +- private mixin template _workaround4424() +- { +- @disable void opAssign(typeof(this) ); +- } +- mixin _workaround4424; +- +-/** +- Takes a slice of the tuple. +- +- Example: +- +----- +-Tuple!(int, string, float, double) a; +-a[1] = "abc"; +-a[2] = 4.5; +-auto s = a.slice!(1, 3); +-static assert(is(typeof(s) == Tuple!(string, float))); +-assert(s[0] == "abc" && s[1] == 4.5); +----- +- */ +- @property +- ref Tuple!(sliceSpecs!(from, to)) slice(uint from, uint to)() +- { +- return *cast(typeof(return) *) &(field[from]); +- } +- +-/** +- The length of the tuple. +- */ +- enum length = field.length; + +-/** +- Converts to string. +- */ +- string toString() +- { +- enum header = typeof(this).stringof ~ "(", +- footer = ")", +- separator = ", "; ++ /** ++ * Takes a slice of the tuple. ++ * ++ * Examples: ++ * ---- ++ * Tuple!(int, string, float, double) a; ++ * a[1] = "abc"; ++ * a[2] = 4.5; ++ * auto s = a.slice!(1, 3); ++ * static assert(is(typeof(s) == Tuple!(string, float))); ++ * assert(s[0] == "abc" && s[1] == 4.5); ++ * ---- ++ */ ++ @property ++ ref Tuple!(sliceSpecs!(from, to)) slice(size_t from, size_t to)() @trusted ++ if (from <= to && to <= Types.length) ++ { ++ return *cast(typeof(return)*) &(field[from]); ++ } + +- Appender!string app; +- app.put(header); +- foreach (i, Unused; Types) ++ /** ++ * Converts to string. ++ */ ++ string toString() + { +- static if (i > 0) +- { +- app.put(separator); +- } +- // TODO: Change this once toString() works for shared objects. +- static if (is(Unused == class) && is(Unused == shared)) +- formattedWrite(app, "%s", field[i].stringof); +- else ++ enum header = typeof(this).stringof ~ "(", ++ footer = ")", ++ separator = ", "; ++ ++ Appender!string w; ++ w.put(header); ++ foreach (i, Unused; Types) + { +- FormatSpec!char f; // "%s" +- formatElement(app, field[i], f); ++ static if (i > 0) ++ { ++ w.put(separator); ++ } ++ // TODO: Change this once toString() works for shared objects. ++ static if (is(Unused == class) && is(Unused == shared)) ++ formattedWrite(w, "%s", field[i].stringof); ++ else ++ { ++ FormatSpec!char f; // "%s" ++ formatElement(w, field[i], f); ++ } + } ++ w.put(footer); ++ return w.data; + } +- app.put(footer); +- return app.data; + } + } + +@@ -708,6 +728,11 @@ unittest + alias Tuple!(const(int)) T; + auto t2 = T(1); + } ++ // 9431 ++ { ++ alias T = Tuple!(int[1][]); ++ auto t = T([[10]]); ++ } + } + unittest + { +@@ -779,6 +804,45 @@ unittest + static assert( is(typeof(tc4 < tm4))); + static assert( is(typeof(tc4 < tc4))); + } ++ { ++ int[2] ints = [ 1, 2 ]; ++ Tuple!(int, int) t = ints; ++ assert(t[0] == 1 && t[1] == 2); ++ Tuple!(long, uint) t2 = ints; ++ assert(t2[0] == 1 && t2[1] == 2); ++ } ++} ++@safe unittest ++{ ++ auto t1 = Tuple!(int, "x", string, "y")(1, "a"); ++ assert(t1.x == 1); ++ assert(t1.y == "a"); ++ void foo(Tuple!(int, string) t2) {} ++ foo(t1); ++ ++ Tuple!(int, int)[] arr; ++ arr ~= tuple(10, 20); // OK ++ arr ~= Tuple!(int, "x", int, "y")(10, 20); // NG -> OK ++ ++ static assert(is(typeof(Tuple!(int, "x", string, "y").tupleof) == ++ typeof(Tuple!(int, string ).tupleof))); ++} ++unittest ++{ ++ // Bugzilla 10686 ++ immutable Tuple!(int) t1; ++ auto r1 = t1[0]; // OK ++ immutable Tuple!(int, "x") t2; ++ auto r2 = t2[0]; // error ++} ++unittest ++{ ++ // Bugzilla 10218 ++ assertCTFEable!( ++ { ++ auto t = tuple(1); ++ t = tuple(2); // assignment ++ }); + } + + /** +@@ -844,7 +908,7 @@ $(D Rebindable!(T)) does not compile if + Regular $(D const) object references cannot be reassigned: + + ---- +-class Widget { int x; int y() const { return a; } } ++class Widget { int x; int y() const { return x; } } + const a = new Widget; + a.y(); // fine + a.x = 5; // error! can't modify const a +@@ -1038,7 +1102,8 @@ string alignForSize(E...)(string[] names + + string[7] declaration = ["", "", "", "", "", "", ""]; + +- foreach (i, T; E) { ++ foreach (i, T; E) ++ { + auto a = T.alignof; + auto k = a>=64? 0 : a>=32? 1 : a>=16? 2 : a>=8? 3 : a>=4? 4 : a>=2? 5 : 6; + declaration[k] ~= T.stringof ~ " " ~ names[i] ~ ";\n"; +@@ -1050,28 +1115,21 @@ string alignForSize(E...)(string[] names + return s; + } + +-unittest { ++unittest ++{ + enum x = alignForSize!(int[], char[3], short, double[5])("x", "y","z", "w"); +- struct Foo{ int x; } +- enum y = alignForSize!(ubyte, Foo, cdouble)("x", "y","z"); ++ struct Foo { int x; } ++ enum y = alignForSize!(ubyte, Foo, cdouble)("x", "y", "z"); + +- static if(size_t.sizeof == uint.sizeof) +- { +- enum passNormalX = x == "double[5u] w;\nint[] x;\nshort z;\nchar[3u] y;\n"; +- enum passNormalY = y == "cdouble z;\nFoo y;\nubyte x;\n"; ++ enum passNormalX = x == "double[5] w;\nint[] x;\nshort z;\nchar[3] y;\n"; ++ enum passNormalY = y == "cdouble z;\nFoo y;\nubyte x;\n"; + +- enum passAbnormalX = x == "int[] x;\ndouble[5u] w;\nshort z;\nchar[3u] y;\n"; +- enum passAbnormalY = y == "Foo y;\ncdouble z;\nubyte x;\n"; +- // ^ blame http://d.puremagic.com/issues/show_bug.cgi?id=231 ++ enum passAbnormalX = x == "int[] x;\ndouble[5] w;\nshort z;\nchar[3] y;\n"; ++ enum passAbnormalY = y == "Foo y;\ncdouble z;\nubyte x;\n"; ++ // ^ blame http://d.puremagic.com/issues/show_bug.cgi?id=231 + +- static assert(passNormalX || double.alignof <= (int[]).alignof && passAbnormalX); +- static assert(passNormalY || double.alignof <= int.alignof && passAbnormalY); +- } +- else +- { +- static assert(x == "int[] x;\ndouble[5LU] w;\nshort z;\nchar[3LU] y;\n"); +- static assert(y == "cdouble z;\nFoo y;\nubyte x;\n"); +- } ++ static assert(passNormalX || passAbnormalX && double.alignof <= (int[]).alignof); ++ static assert(passNormalY || passAbnormalY && double.alignof <= int.alignof); + } + + /*--* +@@ -1131,7 +1189,8 @@ struct Nullable(T) + /** + Constructor initializing $(D this) with $(D value). + */ +- this()(T value) ++ //this()(inout T value) inout // proper signature ++ this(U:T)(inout U value) inout // workaround for BUG 10313 + { + _value = value; + _isNull = false; +@@ -1154,13 +1213,6 @@ Forces $(D this) to the null state. + _isNull = true; + } + +- //@@@BUG4424@@@ +- private mixin template _workaround4424() +- { +- @disable void opAssign(ref const Nullable); +- } +- mixin _workaround4424; +- + /** + Assigns $(D value) to the internally-held state. If the assignment + succeeds, $(D this) becomes non-null. +@@ -1172,19 +1224,19 @@ succeeds, $(D this) becomes non-null. + } + + /** +-Gets the value. Throws an exception if $(D this) is in the null +-state. This function is also called for the implicit conversion to $(D +-T). ++Gets the value. $(D this) must not be in the null state. ++This function is also called for the implicit conversion to $(D T). + */ +- @property ref inout(T) get() inout pure @safe ++ @property ref inout(T) get() inout pure nothrow @safe + { +- enforce(!isNull); ++ enum message = "Called `get' on null Nullable!" ~ T.stringof ~ "."; ++ assert(!isNull, message); + return _value; + } + + /** +-Implicitly converts to $(D T). Throws an exception if $(D this) is in +-the null state. ++Implicitly converts to $(D T). ++$(D this) must not be in the null state. + */ + alias get this; + } +@@ -1193,7 +1245,7 @@ unittest + { + Nullable!int a; + assert(a.isNull); +- assertThrown(a.get); ++ assertThrown!Throwable(a.get); + a = 5; + assert(!a.isNull); + assert(a == 5); +@@ -1208,7 +1260,7 @@ unittest + a = a; + assert(a == 18); + a.nullify(); +- assertThrown(a += 2); ++ assertThrown!Throwable(a += 2); + } + unittest + { +@@ -1241,7 +1293,7 @@ unittest + s.x = 9190; + assert(s.x == 9190); + s.nullify(); +- assertThrown(s.x = 9441); ++ assertThrown!Throwable(s.x = 9441); + } + unittest + { +@@ -1252,7 +1304,7 @@ unittest + assert(n.isNull); + n = 4; + assert(!n.isNull); +- try { assert(n == 4); } catch (Exception) { assert(false); } ++ assert(n == 4); + n.nullify(); + assert(n.isNull); + }(); +@@ -1287,6 +1339,139 @@ unittest + N n; + foo(n); + } ++unittest ++{ ++ //Check nullable immutable is constructable ++ { ++ auto a1 = Nullable!(immutable int)(); ++ auto a2 = Nullable!(immutable int)(1); ++ auto i = a2.get; ++ } ++ //Check immutable nullable is constructable ++ { ++ auto a1 = immutable (Nullable!int)(); ++ auto a2 = immutable (Nullable!int)(1); ++ auto i = a2.get; ++ } ++} ++unittest ++{ ++ alias NInt = Nullable!int; ++ ++ //Construct tests ++ { ++ //from other Nullable null ++ NInt a1; ++ NInt b1 = a1; ++ assert(b1.isNull); ++ ++ //from other Nullable non-null ++ NInt a2 = NInt(1); ++ NInt b2 = a2; ++ assert(b2 == 1); ++ ++ //Construct from similar nullable ++ auto a3 = immutable(NInt)(); ++ NInt b3 = a3; ++ assert(b3.isNull); ++ } ++ ++ //Assign tests ++ { ++ //from other Nullable null ++ NInt a1; ++ NInt b1; ++ b1 = a1; ++ assert(b1.isNull); ++ ++ //from other Nullable non-null ++ NInt a2 = NInt(1); ++ NInt b2; ++ b2 = a2; ++ assert(b2 == 1); ++ ++ //Construct from similar nullable ++ auto a3 = immutable(NInt)(); ++ NInt b3 = a3; ++ b3 = a3; ++ assert(b3.isNull); ++ } ++} ++unittest ++{ ++ //Check nullable is nicelly embedable in a struct ++ static struct S1 ++ { ++ Nullable!int ni; ++ } ++ static struct S2 //inspired from 9404 ++ { ++ Nullable!int ni; ++ this(S2 other) ++ { ++ ni = other.ni; ++ } ++ void opAssign(S2 other) ++ { ++ ni = other.ni; ++ } ++ } ++ foreach (S; TypeTuple!(S1, S2)) ++ { ++ S a; ++ S b = a; ++ S c; ++ c = a; ++ } ++} ++unittest ++{ ++ // Bugzilla 10268 ++ import std.json; ++ JSONValue value = void; ++ value.type = JSON_TYPE.NULL; ++ auto na = Nullable!JSONValue(value); ++ ++ struct S1 { int val; } ++ struct S2 { int* val; } ++ struct S3 { immutable int* val; } ++ ++ { ++ auto sm = S1(1); ++ immutable si = immutable S1(1); ++ static assert( __traits(compiles, { auto x1 = Nullable!S1(sm); })); ++ static assert( __traits(compiles, { auto x2 = immutable Nullable!S1(sm); })); ++ static assert( __traits(compiles, { auto x3 = Nullable!S1(si); })); ++ static assert( __traits(compiles, { auto x4 = immutable Nullable!S1(si); })); ++ } ++ ++ auto nm = 10; ++ immutable ni = 10; ++ ++ { ++ auto sm = S2(&nm); ++ immutable si = immutable S2(&ni); ++ static assert( __traits(compiles, { auto x = Nullable!S2(sm); })); ++ static assert(!__traits(compiles, { auto x = immutable Nullable!S2(sm); })); ++ static assert(!__traits(compiles, { auto x = Nullable!S2(si); })); ++ static assert( __traits(compiles, { auto x = immutable Nullable!S2(si); })); ++ } ++ ++ { ++ auto sm = S3(&ni); ++ immutable si = immutable S3(&ni); ++ static assert( __traits(compiles, { auto x = Nullable!S3(sm); })); ++ static assert( __traits(compiles, { auto x = immutable Nullable!S3(sm); })); ++ static assert( __traits(compiles, { auto x = Nullable!S3(si); })); ++ static assert( __traits(compiles, { auto x = immutable Nullable!S3(si); })); ++ } ++} ++unittest ++{ ++ // Bugzila 10357 ++ import std.datetime; ++ Nullable!SysTime time = SysTime(0); ++} + + /** + Just like $(D Nullable!T), except that the null state is defined as a +@@ -1325,7 +1510,7 @@ Forces $(D this) to the null state. + + /** + Assigns $(D value) to the internally-held state. No null checks are +-made. ++made. Note that the assignment may leave $(D this) in the null state. + */ + void opAssign()(T value) + { +@@ -1333,19 +1518,21 @@ made. + } + + /** +-Gets the value. Throws an exception if $(D this) is in the null +-state. This function is also called for the implicit conversion to $(D +-T). ++Gets the value. $(D this) must not be in the null state. ++This function is also called for the implicit conversion to $(D T). + */ + @property ref inout(T) get()() inout + { +- enforce(!isNull); ++ //@@@6169@@@: We avoid any call that might evaluate nullValue's %s, ++ //Because it might messup get's purity and safety inference. ++ enum message = "Called `get' on null Nullable!(" ~ T.stringof ~ ",nullValue)."; ++ assert(!isNull, message); + return _value; + } + + /** +-Implicitly converts to $(D T). Throws an exception if $(D this) is in +-the null state. ++Implicitly converts to $(D T). ++Gets the value. $(D this) must not be in the null state. + */ + alias get this; + } +@@ -1354,7 +1541,7 @@ unittest + { + Nullable!(int, int.min) a; + assert(a.isNull); +- assertThrown(a.get); ++ assertThrown!Throwable(a.get); + a = 5; + assert(!a.isNull); + assert(a == 5); +@@ -1385,12 +1572,10 @@ unittest + function() pure nothrow @safe + { + Nullable!(int, int.min) n; +- pragma(msg, typeof(&n.get!())); +- + assert(n.isNull); + n = 4; + assert(!n.isNull); +- try { assert(n == 4); } catch (Exception) { assert(false); } ++ assert(n == 4); + n.nullify(); + assert(n.isNull); + }(); +@@ -1412,6 +1597,33 @@ unittest + s.nullify(); + assert(s.isNull); + } ++unittest ++{ ++ //Check nullable is nicelly embedable in a struct ++ static struct S1 ++ { ++ Nullable!(int, 0) ni; ++ } ++ static struct S2 //inspired from 9404 ++ { ++ Nullable!(int, 0) ni; ++ this(S2 other) ++ { ++ ni = other.ni; ++ } ++ void opAssign(S2 other) ++ { ++ ni = other.ni; ++ } ++ } ++ foreach (S; TypeTuple!(S1, S2)) ++ { ++ S a; ++ S b = a; ++ S c; ++ c = a; ++ } ++} + + /** + Just like $(D Nullable!T), except that the object refers to a value +@@ -1426,7 +1638,7 @@ struct NullableRef(T) + /** + Constructor binding $(D this) with $(D value). + */ +- this(T * value) pure nothrow @safe ++ this(T* value) pure nothrow @safe + { + _value = value; + } +@@ -1434,7 +1646,7 @@ Constructor binding $(D this) with $(D v + /** + Binds the internal state to $(D value). + */ +- void bind(T * value) pure nothrow @safe ++ void bind(T* value) pure nothrow @safe + { + _value = value; + } +@@ -1459,25 +1671,27 @@ Forces $(D this) to the null state. + Assigns $(D value) to the internally-held state. + */ + void opAssign()(T value) ++ if (isAssignable!T) //@@@9416@@@ + { +- enforce(_value); ++ enum message = "Called `opAssign' on null NullableRef!" ~ T.stringof ~ "."; ++ assert(!isNull, message); + *_value = value; + } + + /** +-Gets the value. Throws an exception if $(D this) is in the null +-state. This function is also called for the implicit conversion to $(D +-T). ++Gets the value. $(D this) must not be in the null state. ++This function is also called for the implicit conversion to $(D T). + */ +- @property ref inout(T) get()() inout ++ @property ref inout(T) get() inout pure nothrow @safe + { +- enforce(!isNull); ++ enum message = "Called `get' on null NullableRef!" ~ T.stringof ~ "."; ++ assert(!isNull, message); + return *_value; + } + + /** +-Implicitly converts to $(D T). Throws an exception if $(D this) is in +-the null state. ++Implicitly converts to $(D T). ++$(D this) must not be in the null state. + */ + alias get this; + } +@@ -1496,8 +1710,8 @@ unittest + a.nullify(); + assert(x == 42); + assert(a.isNull); +- assertThrown(a.get); +- assertThrown(a = 71); ++ assertThrown!Throwable(a.get); ++ assertThrown!Throwable(a = 71); + a.bind(&y); + assert(a == 7); + y = 135; +@@ -1525,16 +1739,9 @@ unittest + assert(n.isNull); + n.bind(storage); + assert(!n.isNull); +- try +- { +- assert(n == 19902); +- n = 2294; +- assert(n == 2294); +- } +- catch (Exception) +- { +- assert(false); +- } ++ assert(n == 19902); ++ n = 2294; ++ assert(n == 2294); + assert(*storage == 2294); + n.nullify(); + assert(n.isNull); +@@ -1560,6 +1767,33 @@ unittest + s.nullify(); + assert(s.isNull); + } ++unittest ++{ ++ //Check nullable is nicelly embedable in a struct ++ static struct S1 ++ { ++ NullableRef!int ni; ++ } ++ static struct S2 //inspired from 9404 ++ { ++ NullableRef!int ni; ++ this(S2 other) ++ { ++ ni = other.ni; ++ } ++ void opAssign(S2 other) ++ { ++ ni = other.ni; ++ } ++ } ++ foreach (S; TypeTuple!(S1, S2)) ++ { ++ S a; ++ S b = a; ++ S c; ++ c = a; ++ } ++} + + /** + $(D BlackHole!Base) is a subclass of $(D Base) which automatically implements +@@ -1738,6 +1972,7 @@ Params: + // Prints log messages for each call to overridden functions. + string generateLogger(C, alias fun)() @property + { ++ import std.traits; + enum qname = C.stringof ~ "." ~ __traits(identifier, fun); + string stmt; + +@@ -1745,7 +1980,7 @@ string generateLogger(C, alias fun)() @p + stmt ~= `Importer.writeln$(LPAREN)"Log: ` ~ qname ~ `(", args, ")"$(RPAREN);`; + static if (!__traits(isAbstractFunction, fun)) + { +- static if (is(typeof(return) == void)) ++ static if (is(ReturnType!fun == void)) + stmt ~= q{ parent(args); }; + else + stmt ~= q{ +@@ -1903,7 +2138,7 @@ private static: + // overloaded function with the name. + template INTERNAL_FUNCINFO_ID(string name, size_t i) + { +- enum string INTERNAL_FUNCINFO_ID = "F_" ~ name ~ "_" ~ toStringNow!(i); ++ enum string INTERNAL_FUNCINFO_ID = format("F_%s_%s", name, i); + } + + /* +@@ -2036,7 +2271,6 @@ unittest + void test(string); + real test(real); + int test(); +- int test() @property; // ? + } + auto o = new BlackHole!I_5; + } +@@ -2090,6 +2324,44 @@ unittest + }+/ + } + ++version(unittest) ++{ ++ // Issue 10647 ++ private string generateDoNothing(C, alias fun)() @property ++ { ++ string stmt; ++ ++ static if (is(ReturnType!fun == void)) ++ stmt ~= ""; ++ else ++ { ++ string returnType = ReturnType!fun.stringof; ++ stmt ~= "return "~returnType~".init;"; ++ } ++ return stmt; ++ } ++ ++ private template isAlwaysTrue(alias fun) ++ { ++ enum isAlwaysTrue = true; ++ } ++ ++ // Do nothing template ++ private template DoNothing(Base) ++ { ++ alias DoNothing = AutoImplement!(Base, generateDoNothing, isAlwaysTrue); ++ } ++ ++ // A class to be overridden ++ private class Foo{ ++ void bar(int a) { } ++ } ++} ++unittest ++{ ++ auto foo = new DoNothing!Foo(); ++ foo.bar(13); ++} + + /* + Used by MemberFunctionGenerator. +@@ -2164,7 +2436,7 @@ private static: + { + template PARAMETER_VARIABLE_ID(size_t i) + { +- enum string PARAMETER_VARIABLE_ID = "a" ~ toStringNow!(i); ++ enum string PARAMETER_VARIABLE_ID = format("a%s", i); + // default: a0, a1, ... + } + } +@@ -2204,7 +2476,7 @@ private static: + // The generated function declarations may hide existing ones + // in the base class (cf. HiddenFuncError), so we put an alias + // declaration here to reveal possible hidden functions. +- code ~= Format!("alias %s.%s %s;\n", ++ code ~= format("alias %s.%s %s;\n", + Policy.BASE_CLASS_ID, // [BUG 2540] super. + oset.name, oset.name ); + } +@@ -2246,6 +2518,8 @@ private static: + enum atts = functionAttributes!(func); + enum realName = isCtor ? "this" : name; + ++ // FIXME?? Make it so that these aren't CTFE funcs any more, since ++ // Format is deprecated, and format works at compile time? + /* Made them CTFE funcs just for the sake of Format!(...) */ + + // return type with optional "ref" +@@ -2287,9 +2561,9 @@ private static: + enum storageClass = make_storageClass(); + + // +- if (isAbstractFunction!func) ++ if (__traits(isVirtualMethod, func)) + code ~= "override "; +- code ~= Format!("extern(%s) %s %s(%s) %s %s\n", ++ code ~= format("extern(%s) %s %s(%s) %s %s\n", + functionLinkage!(func), + returnType, + realName, +@@ -2351,7 +2625,7 @@ private static: + if (stc & STC.lazy_ ) params ~= "lazy "; + + // Take parameter type from the FuncInfo. +- params ~= myFuncInfo ~ ".PT[" ~ toStringNow!(i) ~ "]"; ++ params ~= format("%s.PT[%s]", myFuncInfo, i); + + // Declare a parameter variable. + params ~= " " ~ PARAMETER_VARIABLE_ID!(i); +@@ -2431,21 +2705,774 @@ template generateAssertTrap(C, func.../+ + ~ __traits(identifier, func) ~ `");`; + } + +-/** +-Options regarding auto-initialization of a $(D RefCounted) object (see +-the definition of $(D RefCounted) below). +- */ +-enum RefCountedAutoInitialize ++private + { +- /// Do not auto-initialize the object +- no, +- /// Auto-initialize the object +- yes, ++ pragma(mangle, "_d_toObject") ++ extern(C) pure nothrow Object typecons_d_toObject(void* p); + } + +-/** +-Defines a reference-counted object containing a $(D T) value as +-payload. $(D RefCounted) keeps track of all references of an object, ++/* ++ * Avoids opCast operator overloading. ++ */ ++private template dynamicCast(T) ++if (is(T == class) || is(T == interface)) ++{ ++ @trusted ++ T dynamicCast(S)(inout S source) ++ if (is(S == class) || is(S == interface)) ++ { ++ static if (is(Unqual!S : Unqual!T)) ++ { ++ import std.traits : QualifierOf; ++ alias Qual = QualifierOf!S; // SharedOf or MutableOf ++ alias TmpT = Qual!(Unqual!T); ++ inout(TmpT) tmp = source; // bypass opCast by implicit conversion ++ return *cast(T*)(&tmp); // + variable pointer cast + dereference ++ } ++ else ++ { ++ return cast(T)typecons_d_toObject(*cast(void**)(&source)); ++ } ++ } ++} ++ ++unittest ++{ ++ class C { @disable opCast(T)() {} } ++ auto c = new C; ++ static assert(!__traits(compiles, cast(Object)c)); ++ auto o = dynamicCast!Object(c); ++ assert(c is o); ++ ++ interface I { @disable opCast(T)() {} Object instance(); } ++ interface J { @disable opCast(T)() {} Object instance(); } ++ class D : I, J { Object instance() { return this; } } ++ I i = new D(); ++ static assert(!__traits(compiles, cast(J)i)); ++ J j = dynamicCast!J(i); ++ assert(i.instance() is j.instance()); ++} ++ ++/** ++ * Supports structural based typesafe conversion. ++ * ++ * If $(D Source) has structural conformance with the $(D interface) $(D Targets), ++ * wrap creates internal wrapper class which inherits $(D Targets) and ++ * wrap $(D src) object, then return it. ++ */ ++template wrap(Targets...) ++if (Targets.length >= 1 && allSatisfy!(isMutable, Targets)) ++{ ++ // strict upcast ++ auto wrap(Source)(inout Source src) @trusted pure nothrow ++ if (Targets.length == 1 && is(Source : Targets[0])) ++ { ++ alias T = Select!(is(Source == shared), shared Targets[0], Targets[0]); ++ return dynamicCast!(inout T)(src); ++ } ++ // structural upcast ++ template wrap(Source) ++ if (!allSatisfy!(Bind!(isImplicitlyConvertible, Source), Targets)) ++ { ++ auto wrap(inout Source src) ++ { ++ static assert(hasRequireMethods!(), ++ "Source "~Source.stringof~ ++ " does not have structural conformance to "~ ++ Targets.stringof); ++ ++ alias T = Select!(is(Source == shared), shared Impl, Impl); ++ return new inout T(src); ++ } ++ ++ template FuncInfo(string s, F) ++ { ++ enum name = s; ++ alias type = F; ++ } ++ ++ // Concat all Targets function members into one tuple ++ template Concat(size_t i = 0) ++ { ++ static if (i >= Targets.length) ++ alias Concat = TypeTuple!(); ++ else ++ { ++ alias Concat = TypeTuple!(GetOverloadedMethods!(Targets[i]), Concat!(i + 1)); ++ } ++ } ++ // Remove duplicated functions based on the identifier name and function type covariance ++ template Uniq(members...) ++ { ++ static if (members.length == 0) ++ alias Uniq = TypeTuple!(); ++ else ++ { ++ alias func = members[0]; ++ enum name = __traits(identifier, func); ++ alias type = FunctionTypeOf!func; ++ template check(size_t i, mem...) ++ { ++ static if (i >= mem.length) ++ enum ptrdiff_t check = -1; ++ else ++ { ++ enum ptrdiff_t check = ++ __traits(identifier, func) == __traits(identifier, mem[i]) && ++ !is(DerivedFunctionType!(type, FunctionTypeOf!(mem[i])) == void) ++ ? i : check!(i + 1, mem); ++ } ++ } ++ enum ptrdiff_t x = 1 + check!(0, members[1 .. $]); ++ static if (x >= 1) ++ { ++ alias typex = DerivedFunctionType!(type, FunctionTypeOf!(members[x])); ++ alias remain = Uniq!(members[1 .. x], members[x + 1 .. $]); ++ ++ static if (remain.length >= 1 && remain[0].name == name && ++ !is(DerivedFunctionType!(typex, remain[0].type) == void)) ++ { ++ alias F = DerivedFunctionType!(typex, remain[0].type); ++ alias Uniq = TypeTuple!(FuncInfo!(name, F), remain[1 .. $]); ++ } ++ else ++ alias Uniq = TypeTuple!(FuncInfo!(name, typex), remain); ++ } ++ else ++ { ++ alias Uniq = TypeTuple!(FuncInfo!(name, type), Uniq!(members[1 .. $])); ++ } ++ } ++ } ++ alias TargetMembers = Uniq!(Concat!()); // list of FuncInfo ++ alias SourceMembers = GetOverloadedMethods!Source; // list of function symbols ++ ++ // Check whether all of SourceMembers satisfy covariance target in TargetMembers ++ template hasRequireMethods(size_t i = 0) ++ { ++ static if (i >= TargetMembers.length) ++ enum hasRequireMethods = true; ++ else ++ { ++ enum hasRequireMethods = ++ findCovariantFunction!(TargetMembers[i], Source, SourceMembers) != -1 && ++ hasRequireMethods!(i + 1); ++ } ++ } ++ ++ // Internal wrapper class ++ final class Impl : Structural, Targets ++ { ++ private: ++ Source _wrap_source; ++ ++ this( inout Source s) inout @safe pure nothrow { _wrap_source = s; } ++ this(shared inout Source s) shared inout @safe pure nothrow { _wrap_source = s; } ++ ++ // BUG: making private should work with NVI. ++ protected final inout(Object) _wrap_getSource() inout @trusted ++ { ++ return dynamicCast!(inout Object)(_wrap_source); ++ } ++ ++ import std.conv : to; ++ import std.algorithm : forward; ++ template generateFun(size_t i) ++ { ++ enum name = TargetMembers[i].name; ++ enum fa = functionAttributes!(TargetMembers[i].type); ++ static @property stc() ++ { ++ string r; ++ if (fa & FunctionAttribute.property) r ~= "@property "; ++ if (fa & FunctionAttribute.ref_) r ~= "ref "; ++ if (fa & FunctionAttribute.pure_) r ~= "pure "; ++ if (fa & FunctionAttribute.nothrow_) r ~= "nothrow "; ++ if (fa & FunctionAttribute.trusted) r ~= "@trusted "; ++ if (fa & FunctionAttribute.safe) r ~= "@safe "; ++ return r; ++ } ++ static @property mod() ++ { ++ alias TypeTuple!(TargetMembers[i].type)[0] type; ++ string r; ++ static if (is(type == immutable)) r ~= " immutable"; ++ else ++ { ++ static if (is(type == shared)) r ~= " shared"; ++ static if (is(type == const)) r ~= " const"; ++ else static if (is(type == inout)) r ~= " inout"; ++ //else --> mutable ++ } ++ return r; ++ } ++ enum n = to!string(i); ++ static if (fa & FunctionAttribute.property) ++ { ++ static if (ParameterTypeTuple!(TargetMembers[i].type).length == 0) ++ enum fbody = "_wrap_source."~name; ++ else ++ enum fbody = "_wrap_source."~name~" = forward!args"; ++ } ++ else ++ { ++ enum fbody = "_wrap_source."~name~"(forward!args)"; ++ } ++ enum generateFun = ++ "override "~stc~"ReturnType!(TargetMembers["~n~"].type) " ++ ~ name~"(ParameterTypeTuple!(TargetMembers["~n~"].type) args) "~mod~ ++ "{ return "~fbody~"; }"; ++ } ++ ++ public: ++ mixin mixinAll!( ++ staticMap!(generateFun, staticIota!(0, TargetMembers.length))); ++ } ++ } ++} ++/// ditto ++template wrap(Targets...) ++if (Targets.length >= 1 && !allSatisfy!(isMutable, Targets)) ++{ ++ alias wrap = .wrap!(staticMap!(Unqual, Targets)); ++} ++ ++// Internal class to support dynamic cross-casting ++private interface Structural ++{ ++ inout(Object) _wrap_getSource() inout @safe pure nothrow; ++} ++ ++/** ++ * Extract object which wrapped by $(D wrap). ++ */ ++template unwrap(Target) ++if (isMutable!Target) ++{ ++ // strict downcast ++ auto unwrap(Source)(inout Source src) @trusted pure nothrow ++ if (is(Target : Source)) ++ { ++ alias T = Select!(is(Source == shared), shared Target, Target); ++ return dynamicCast!(inout T)(src); ++ } ++ // structural downcast ++ auto unwrap(Source)(inout Source src) @trusted pure nothrow ++ if (!is(Target : Source)) ++ { ++ alias T = Select!(is(Source == shared), shared Target, Target); ++ Object o = dynamicCast!(Object)(src); // remove qualifier ++ do ++ { ++ if (auto a = dynamicCast!(Structural)(o)) ++ { ++ if (auto d = dynamicCast!(inout T)(o = a._wrap_getSource())) ++ return d; ++ } ++ else if (auto d = dynamicCast!(inout T)(o)) ++ return d; ++ else ++ break; ++ } while (o); ++ return null; ++ } ++} ++/// ditto ++template unwrap(Target) ++if (!isMutable!Target) ++{ ++ alias unwrap = .unwrap!(Unqual!Target); ++} ++ ++/// ++unittest ++{ ++ interface Quack ++ { ++ int quack(); ++ @property int height(); ++ } ++ interface Flyer ++ { ++ @property int height(); ++ } ++ class Duck : Quack ++ { ++ int quack() { return 1; } ++ @property int height() { return 10; } ++ } ++ class Human ++ { ++ int quack() { return 2; } ++ @property int height() { return 20; } ++ } ++ ++ Duck d1 = new Duck(); ++ Human h1 = new Human(); ++ ++ interface Refleshable ++ { ++ int reflesh(); ++ } ++ // does not have structural conformance ++ static assert(!__traits(compiles, d1.wrap!Refleshable)); ++ static assert(!__traits(compiles, h1.wrap!Refleshable)); ++ ++ // strict upcast ++ Quack qd = d1.wrap!Quack; ++ assert(qd is d1); ++ assert(qd.quack() == 1); // calls Duck.quack ++ // strict downcast ++ Duck d2 = qd.unwrap!Duck; ++ assert(d2 is d1); ++ ++ // structural upcast ++ Quack qh = h1.wrap!Quack; ++ assert(qh.quack() == 2); // calls Human.quack ++ // structural downcast ++ Human h2 = qh.unwrap!Human; ++ assert(h2 is h1); ++ ++ // structural upcast (two steps) ++ Quack qx = h1.wrap!Quack; // Human -> Quack ++ Flyer fx = qx.wrap!Flyer; // Quack -> Flyer ++ assert(fx.height == 20); // calls Human.height ++ // strucural downcast (two steps) ++ Quack qy = fx.unwrap!Quack; // Flyer -> Quack ++ Human hy = qy.unwrap!Human; // Quack -> Human ++ assert(hy is h1); ++ // strucural downcast (one step) ++ Human hz = fx.unwrap!Human; // Flyer -> Human ++ assert(hz is h1); ++} ++/// ++unittest ++{ ++ interface A { int run(); } ++ interface B { int stop(); @property int status(); } ++ class X ++ { ++ int run() { return 1; } ++ int stop() { return 2; } ++ @property int status() { return 3; } ++ } ++ ++ auto x = new X(); ++ auto ab = x.wrap!(A, B); ++ A a = ab; ++ B b = ab; ++ assert(a.run() == 1); ++ assert(b.stop() == 2); ++ assert(b.status == 3); ++ static assert(functionAttributes!(typeof(ab).status) & FunctionAttribute.property); ++} ++unittest ++{ ++ class A ++ { ++ int draw() { return 1; } ++ int draw(int v) { return v; } ++ ++ int draw() const { return 2; } ++ int draw() shared { return 3; } ++ int draw() shared const { return 4; } ++ int draw() immutable { return 5; } ++ } ++ interface Drawable ++ { ++ int draw(); ++ int draw() const; ++ int draw() shared; ++ int draw() shared const; ++ int draw() immutable; ++ } ++ interface Drawable2 ++ { ++ int draw(int v); ++ } ++ ++ auto ma = new A(); ++ auto sa = new shared A(); ++ auto ia = new immutable A(); ++ { ++ Drawable md = ma.wrap!Drawable; ++ const Drawable cd = ma.wrap!Drawable; ++ shared Drawable sd = sa.wrap!Drawable; ++ shared const Drawable scd = sa.wrap!Drawable; ++ immutable Drawable id = ia.wrap!Drawable; ++ assert( md.draw() == 1); ++ assert( cd.draw() == 2); ++ assert( sd.draw() == 3); ++ assert(scd.draw() == 4); ++ assert( id.draw() == 5); ++ } ++ { ++ Drawable2 d = ma.wrap!Drawable2; ++ static assert(!__traits(compiles, d.draw())); ++ assert(d.draw(10) == 10); ++ } ++} ++unittest ++{ ++ // Bugzilla 10377 ++ import std.range, std.algorithm; ++ ++ interface MyInputRange(T) ++ { ++ @property T front(); ++ void popFront(); ++ @property bool empty(); ++ } ++ ++ //auto o = iota(0,10,1).inputRangeObject(); ++ //pragma(msg, __traits(allMembers, typeof(o))); ++ auto r = iota(0,10,1).inputRangeObject().wrap!(MyInputRange!int)(); ++ assert(equal(r, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])); ++} ++unittest ++{ ++ // Bugzilla 10536 ++ interface Interface ++ { ++ int foo(); ++ } ++ class Pluggable ++ { ++ int foo() { return 1; } ++ @disable void opCast(T, this X)(); // ! ++ } ++ ++ Interface i = new Pluggable().wrap!Interface; ++ assert(i.foo() == 1); ++} ++unittest ++{ ++ // Enhancement 10538 ++ interface Interface ++ { ++ int foo(); ++ int bar(int); ++ } ++ class Pluggable ++ { ++ int opDispatch(string name, A...)(A args) { return 100; } ++ } ++ ++ Interface i = wrap!Interface(new Pluggable()); ++ assert(i.foo() == 100); ++ assert(i.bar(10) == 100); ++} ++ ++// Make a tuple of non-static function symbols ++private template GetOverloadedMethods(T) ++{ ++ alias allMembers = TypeTuple!(__traits(allMembers, T)); ++ template follows(size_t i = 0) ++ { ++ static if (i >= allMembers.length) ++ { ++ alias follows = TypeTuple!(); ++ } ++ else static if (!__traits(compiles, mixin("T."~allMembers[i]))) ++ { ++ alias follows = follows!(i + 1); ++ } ++ else ++ { ++ enum name = allMembers[i]; ++ ++ template isMethod(alias f) ++ { ++ static if (is(typeof(&f) F == F*) && is(F == function)) ++ enum isMethod = !__traits(isStaticFunction, f); ++ else ++ enum isMethod = false; ++ } ++ alias follows = TypeTuple!( ++ std.typetuple.Filter!(isMethod, __traits(getOverloads, T, name)), ++ follows!(i + 1)); ++ } ++ } ++ alias GetOverloadedMethods = follows!(); ++} ++// find a function from Fs that has same identifier and covariant type with f ++private template findCovariantFunction(alias finfo, Source, Fs...) ++{ ++ template check(size_t i = 0) ++ { ++ static if (i >= Fs.length) ++ enum ptrdiff_t check = -1; ++ else ++ { ++ enum ptrdiff_t check = ++ (finfo.name == __traits(identifier, Fs[i])) && ++ isCovariantWith!(FunctionTypeOf!(Fs[i]), finfo.type) ++ ? i : check!(i + 1); ++ } ++ } ++ enum x = check!(); ++ static if (x == -1 && is(typeof(Source.opDispatch))) ++ { ++ alias Params = ParameterTypeTuple!(finfo.type); ++ enum ptrdiff_t findCovariantFunction = ++ is(typeof(( Source).init.opDispatch!(finfo.name)(Params.init))) || ++ is(typeof(( const Source).init.opDispatch!(finfo.name)(Params.init))) || ++ is(typeof(( immutable Source).init.opDispatch!(finfo.name)(Params.init))) || ++ is(typeof(( shared Source).init.opDispatch!(finfo.name)(Params.init))) || ++ is(typeof((shared const Source).init.opDispatch!(finfo.name)(Params.init))) ++ ? ptrdiff_t.max : -1; ++ } ++ else ++ enum ptrdiff_t findCovariantFunction = x; ++} ++ ++private enum TypeModifier ++{ ++ mutable = 0, // type is mutable ++ const_ = 1, // type is const ++ immutable_ = 2, // type is immutable ++ shared_ = 4, // type is shared ++ inout_ = 8, // type is wild ++} ++private template TypeMod(T) ++{ ++ static if (is(T == immutable)) ++ { ++ enum mod1 = TypeModifier.immutable_; ++ enum mod2 = 0; ++ } ++ else ++ { ++ enum mod1 = is(T == shared) ? TypeModifier.shared_ : 0; ++ static if (is(T == const)) ++ enum mod2 = TypeModifier.const_; ++ else static if (is(T == inout)) ++ enum mod2 = TypeModifier.inout_; ++ else ++ enum mod2 = TypeModifier.mutable; ++ } ++ enum TypeMod = cast(TypeModifier)(mod1 | mod2); ++} ++ ++version(unittest) ++{ ++ private template UnittestFuncInfo(alias f) ++ { ++ enum name = __traits(identifier, f); ++ alias type = FunctionTypeOf!f; ++ } ++} ++unittest ++{ ++ class A ++ { ++ int draw() { return 1; } ++ @property int value() { return 2; } ++ final int run() { return 3; } ++ } ++ alias methods = GetOverloadedMethods!A; ++ ++ alias int F1(); ++ alias @property int F2(); ++ alias string F3(); ++ alias nothrow @trusted uint F4(); ++ alias int F5(Object); ++ alias bool F6(Object); ++ static assert(methods.length == 3 + 4); ++ static assert(__traits(identifier, methods[0]) == "draw" && is(typeof(&methods[0]) == F1*)); ++ static assert(__traits(identifier, methods[1]) == "value" && is(typeof(&methods[1]) == F2*)); ++ static assert(__traits(identifier, methods[2]) == "run" && is(typeof(&methods[2]) == F1*)); ++ ++ int draw() { return 0; } ++ @property int value() { return 0; } ++ void opEquals() {} ++ int nomatch() { return 0; } ++ static assert(findCovariantFunction!(UnittestFuncInfo!draw, A, methods) == 0); ++ static assert(findCovariantFunction!(UnittestFuncInfo!value, A, methods) == 1); ++ static assert(findCovariantFunction!(UnittestFuncInfo!opEquals, A, methods) == -1); ++ static assert(findCovariantFunction!(UnittestFuncInfo!nomatch, A, methods) == -1); ++ ++ // considering opDispatch ++ class B ++ { ++ void opDispatch(string name, A...)(A) {} ++ } ++ alias methodsB = GetOverloadedMethods!B; ++ static assert(findCovariantFunction!(UnittestFuncInfo!draw, B, methodsB) == ptrdiff_t.max); ++ static assert(findCovariantFunction!(UnittestFuncInfo!value, B, methodsB) == ptrdiff_t.max); ++ static assert(findCovariantFunction!(UnittestFuncInfo!opEquals, B, methodsB) == ptrdiff_t.max); ++ static assert(findCovariantFunction!(UnittestFuncInfo!nomatch, B, methodsB) == ptrdiff_t.max); ++} ++ ++private template DerivedFunctionType(T...) ++{ ++ static if (!T.length) ++ { ++ alias DerivedFunctionType = void; ++ } ++ else static if (T.length == 1) ++ { ++ static if (is(T[0] == function)) ++ { ++ alias DerivedFunctionType = T[0]; ++ } ++ else ++ { ++ alias DerivedFunctionType = void; ++ } ++ } ++ else static if (is(T[0] P0 == function) && is(T[1] P1 == function)) ++ { ++ alias FA = FunctionAttribute; ++ ++ alias F0 = T[0], R0 = ReturnType!F0, PSTC0 = ParameterStorageClassTuple!F0; ++ alias F1 = T[1], R1 = ReturnType!F1, PSTC1 = ParameterStorageClassTuple!F1; ++ enum FA0 = functionAttributes!F0; ++ enum FA1 = functionAttributes!F1; ++ ++ template CheckParams(size_t i = 0) ++ { ++ static if (i >= P0.length) ++ enum CheckParams = true; ++ else ++ { ++ enum CheckParams = (is(P0[i] == P1[i]) && PSTC0[i] == PSTC1[i]) && ++ CheckParams!(i + 1); ++ } ++ } ++ static if (R0.sizeof == R1.sizeof && !is(CommonType!(R0, R1) == void) && ++ P0.length == P1.length && CheckParams!() && TypeMod!F0 == TypeMod!F1 && ++ variadicFunctionStyle!F0 == variadicFunctionStyle!F1 && ++ functionLinkage!F0 == functionLinkage!F1 && ++ ((FA0 ^ FA1) & (FA.ref_ | FA.property)) == 0) ++ { ++ alias R = Select!(is(R0 : R1), R0, R1); ++ alias FX = FunctionTypeOf!(R function(P0)); ++ alias FY = SetFunctionAttributes!(FX, functionLinkage!F0, FA0 | FA1); ++ alias DerivedFunctionType = DerivedFunctionType!(FY, T[2 .. $]); ++ } ++ else ++ alias DerivedFunctionType = void; ++ } ++ else ++ alias DerivedFunctionType = void; ++} ++unittest ++{ ++ // attribute covariance ++ alias int F1(); ++ static assert(is(DerivedFunctionType!(F1, F1) == F1)); ++ alias int F2() pure nothrow; ++ static assert(is(DerivedFunctionType!(F1, F2) == F2)); ++ alias int F3() @safe; ++ alias int F23() pure nothrow @safe; ++ static assert(is(DerivedFunctionType!(F2, F3) == F23)); ++ ++ // return type covariance ++ alias long F4(); ++ static assert(is(DerivedFunctionType!(F1, F4) == void)); ++ class C {} ++ class D : C {} ++ alias C F5(); ++ alias D F6(); ++ static assert(is(DerivedFunctionType!(F5, F6) == F6)); ++ alias typeof(null) F7(); ++ alias int[] F8(); ++ alias int* F9(); ++ static assert(is(DerivedFunctionType!(F5, F7) == F7)); ++ static assert(is(DerivedFunctionType!(F7, F8) == void)); ++ static assert(is(DerivedFunctionType!(F7, F9) == F7)); ++ ++ // variadic type equality ++ alias int F10(int); ++ alias int F11(int...); ++ alias int F12(int, ...); ++ static assert(is(DerivedFunctionType!(F10, F11) == void)); ++ static assert(is(DerivedFunctionType!(F10, F12) == void)); ++ static assert(is(DerivedFunctionType!(F11, F12) == void)); ++ ++ // linkage equality ++ alias extern(C) int F13(int); ++ alias extern(D) int F14(int); ++ alias extern(Windows) int F15(int); ++ static assert(is(DerivedFunctionType!(F13, F14) == void)); ++ static assert(is(DerivedFunctionType!(F13, F15) == void)); ++ static assert(is(DerivedFunctionType!(F14, F15) == void)); ++ ++ // ref & @property equality ++ alias int F16(int); ++ alias ref int F17(int); ++ alias @property int F18(int); ++ static assert(is(DerivedFunctionType!(F16, F17) == void)); ++ static assert(is(DerivedFunctionType!(F16, F18) == void)); ++ static assert(is(DerivedFunctionType!(F17, F18) == void)); ++} ++ ++private template staticIota(int beg, int end, int step = 1) if (step != 0) ++{ ++ static if (beg + 1 >= end) ++ { ++ static if (beg >= end) ++ { ++ alias TypeTuple!() staticIota; ++ } ++ else ++ { ++ alias TypeTuple!(+beg) staticIota; ++ } ++ } ++ else ++ { ++ enum mid = beg + (end - beg) / 2; ++ alias staticIota = TypeTuple!(staticIota!(beg, mid), staticIota!(mid, end)); ++ } ++} ++ ++private template mixinAll(mixins...) ++{ ++ static if (mixins.length == 1) ++ { ++ static if (is(typeof(mixins[0]) == string)) ++ { ++ mixin(mixins[0]); ++ } ++ else ++ { ++ alias mixins[0] it; ++ mixin it; ++ } ++ } ++ else static if (mixins.length >= 2) ++ { ++ mixin mixinAll!(mixins[ 0 .. $/2]); ++ mixin mixinAll!(mixins[$/2 .. $ ]); ++ } ++} ++ ++private template Bind(alias Template, args1...) ++{ ++ template Bind(args2...) ++ { ++ alias Bind = Template!(args1, args2); ++ } ++} ++ ++ ++/** ++Options regarding auto-initialization of a $(D RefCounted) object (see ++the definition of $(D RefCounted) below). ++ */ ++enum RefCountedAutoInitialize ++{ ++ /// Do not auto-initialize the object ++ no, ++ /// Auto-initialize the object ++ yes, ++} ++ ++/** ++Defines a reference-counted object containing a $(D T) value as ++payload. $(D RefCounted) keeps track of all references of an object, + and when the reference count goes down to zero, frees the underlying + store. $(D RefCounted) uses $(D malloc) and $(D free) for operation. + +@@ -2457,7 +3484,7 @@ automatically initialized. Leaving $(D a + RefCountedAutoInitialize.yes) (the default option) is convenient but + has the cost of a test whenever the payload is accessed. If $(D + autoInit == RefCountedAutoInitialize.no), user code must call either +-$(D refCountedIsInitialized) or $(D refCountedEnsureInitialized) ++$(D refCountedStore.isInitialized) or $(D refCountedStore.ensureInitialized) + before attempting to access the payload. Not doing so results in null + pointer dereference. + +@@ -2541,7 +3568,7 @@ if (!is(T == class)) + /** + Constructor that initializes the payload. + +-Postcondition: $(D refCountedIsInitialized) ++Postcondition: $(D refCountedStore.isInitialized) + */ + this(A...)(auto ref A args) if (A.length > 0) + { +@@ -2550,7 +3577,7 @@ Postcondition: $(D refCountedIsInitializ + + /** + Constructor that tracks the reference count appropriately. If $(D +-!refCountedIsInitialized), does nothing. ++!refCountedStore.isInitialized), does nothing. + */ + this(this) + { +@@ -2560,7 +3587,7 @@ Constructor that tracks the reference co + + /** + Destructor that tracks the reference count appropriately. If $(D +-!refCountedIsInitialized), does nothing. When the reference count goes ++!refCountedStore.isInitialized), does nothing. When the reference count goes + down to zero, calls $(D destroy) agaist the payload and calls $(D free) + to deallocate the corresponding resource. + */ +@@ -2606,8 +3633,8 @@ Assignment operators + /** + Returns a reference to the payload. If (autoInit == + RefCountedAutoInitialize.yes), calls $(D +- refCountedEnsureInitialized). Otherwise, just issues $(D +- assert(refCountedIsInitialized)). Used with $(D alias ++ refCountedStore.ensureInitialized). Otherwise, just issues $(D ++ assert(refCountedStore.isInitialized)). Used with $(D alias + refCountedPayload this;), so callers can just use the $(D RefCounted) + object as a $(D T). + +@@ -2640,7 +3667,7 @@ Assignment operators + @property nothrow @safe + ref inout(T) refCountedPayload() inout + { +- assert(_refCounted.isInitialized); ++ assert(_refCounted.isInitialized, "Attempted to access an uninitialized payload."); + return _refCounted._store._payload; + } + } +@@ -2648,8 +3675,8 @@ Assignment operators + /** + Returns a reference to the payload. If (autoInit == + RefCountedAutoInitialize.yes), calls $(D +-refCountedEnsureInitialized). Otherwise, just issues $(D +-assert(refCountedIsInitialized)). ++refCountedStore.ensureInitialized). Otherwise, just issues $(D ++assert(refCountedStore.isInitialized)). + */ + alias refCountedPayload this; + } +@@ -2764,15 +3791,16 @@ void func(int n) { } + */ + mixin template Proxy(alias a) + { +- auto ref opEquals(this X)(auto ref typeof(this) b) +- { +- import std.algorithm; +- static assert(startsWith(a.stringof, "this.")); +- return a == mixin("b."~a.stringof[5..$]); // remove "this." +- } +- auto ref opEquals(this X, B)(auto ref B b) if (!is(B == typeof(this))) ++ auto ref opEquals(this X, B)(auto ref B b) + { +- return a == b; ++ static if (is(immutable B == immutable typeof(this))) ++ { ++ import std.algorithm; ++ static assert(startsWith(a.stringof, "this.")); ++ return a == mixin("b."~a.stringof[5..$]); // remove "this." ++ } ++ else ++ return a == b; + } + + auto ref opCmp(this X, B)(auto ref B b) +@@ -2799,13 +3827,17 @@ mixin template Proxy(alias a) + auto ref opSliceUnary(string op, this X )() { return mixin(op~"a[]"); } + auto ref opSliceUnary(string op, this X, B, E)(auto ref B b, auto ref E e) { return mixin(op~"a[b..e]"); } + +- auto ref opBinary (string op, this X, B)(auto ref B b) { return mixin("a "~op~" b"); } ++ auto ref opBinary(string op, this X, B)(auto ref B b) ++ if (op == "in" && is(typeof(a in b)) || op != "in") ++ { ++ return mixin("a "~op~" b"); ++ } + auto ref opBinaryRight(string op, this X, B)(auto ref B b) { return mixin("b "~op~" a"); } + + static if (!is(typeof(this) == class)) + { + private import std.traits; +- static if (isAssignable!(typeof(a), typeof(a))) ++ static if (isAssignable!(typeof(a))) + { + auto ref opAssign(this X)(auto ref typeof(this) v) + { +@@ -2836,6 +3868,11 @@ mixin template Proxy(alias a) + // non template function + auto ref opDispatch(this X, Args...)(auto ref Args args) { return mixin("a."~name~"(args)"); } + } ++ else static if (is(typeof({ enum x = mixin("a."~name); }))) ++ { ++ // built-in type field, manifest constant, and static non-mutable field ++ enum opDispatch = mixin("a."~name); ++ } + else static if (is(typeof(mixin("a."~name))) || __traits(getOverloads, a, name).length != 0) + { + // field or property function +@@ -2858,32 +3895,46 @@ unittest + { + private int value; + mixin Proxy!value; +- this(int n){ value = n; } ++ this(int n) inout { value = n; } ++ ++ enum str = "str"; ++ static immutable arr = [1,2,3]; + } + +- MyInt m = 10; +- static assert(!__traits(compiles, { int x = m; })); +- static assert(!__traits(compiles, { void func(int n){} func(m); })); +- assert(m == 10); +- assert(m != 20); +- assert(m < 20); +- assert(+m == 10); +- assert(-m == -10); +- assert(++m == 11); +- assert(m++ == 11); assert(m == 12); +- assert(--m == 11); +- assert(m-- == 11); assert(m == 10); +- assert(cast(double)m == 10.0); +- assert(m + 10 == 20); +- assert(m - 5 == 5); +- assert(m * 20 == 200); +- assert(m / 2 == 5); +- assert(10 + m == 20); +- assert(15 - m == 5); +- assert(20 * m == 200); +- assert(50 / m == 5); +- m = m; +- m = 20; assert(m == 20); ++ foreach (T; TypeTuple!(MyInt, const MyInt, immutable MyInt)) ++ { ++ T m = 10; ++ static assert(!__traits(compiles, { int x = m; })); ++ static assert(!__traits(compiles, { void func(int n){} func(m); })); ++ assert(m == 10); ++ assert(m != 20); ++ assert(m < 20); ++ assert(+m == 10); ++ assert(-m == -10); ++ assert(cast(double)m == 10.0); ++ assert(m + 10 == 20); ++ assert(m - 5 == 5); ++ assert(m * 20 == 200); ++ assert(m / 2 == 5); ++ assert(10 + m == 20); ++ assert(15 - m == 5); ++ assert(20 * m == 200); ++ assert(50 / m == 5); ++ static if (is(T == MyInt)) // mutable ++ { ++ assert(++m == 11); ++ assert(m++ == 11); assert(m == 12); ++ assert(--m == 11); ++ assert(m-- == 11); assert(m == 10); ++ m = m; ++ m = 20; assert(m == 20); ++ } ++ static assert(T.max == int.max); ++ static assert(T.min == int.min); ++ static assert(T.init == int.init); ++ static assert(T.str == "str"); ++ static assert(T.arr == [1,2,3]); ++ } + } + unittest + { +@@ -2891,29 +3942,39 @@ unittest + { + private int[] value; + mixin Proxy!value; +- this(int[] arr){ value = arr; } ++ this(int[] arr) { value = arr; } ++ this(immutable int[] arr) immutable { value = arr; } + } + +- MyArray a = [1,2,3,4]; +- assert(a == [1,2,3,4]); +- assert(a != [5,6,7,8]); +- assert(+a[0] == 1); +- version (LittleEndian) +- assert(cast(ulong[])a == [0x0000_0002_0000_0001, 0x0000_0004_0000_0003]); +- else +- assert(cast(ulong[])a == [0x0000_0001_0000_0002, 0x0000_0003_0000_0004]); +- assert(a ~ [10,11] == [1,2,3,4,10,11]); +- assert(a[0] == 1); +- //assert(a[] == [1,2,3,4]); // blocked by bug 2486 +- //assert(a[2..4] == [3,4]); // blocked by bug 2486 +- a = a; +- a = [5,6,7,8]; assert(a == [5,6,7,8]); +- a[0] = 0; assert(a == [0,6,7,8]); +- a[] = 1; assert(a == [1,1,1,1]); +- a[0..3] = 2; assert(a == [2,2,2,1]); +- a[0] += 2; assert(a == [4,2,2,1]); +- a[] *= 2; assert(a == [8,4,4,2]); +- a[0..2] /= 2; assert(a == [4,2,4,2]); ++ foreach (T; TypeTuple!(MyArray, const MyArray, immutable MyArray)) ++ { ++ static if (is(T == immutable) && !is(typeof({ T a = [1,2,3,4]; }))) ++ T a = [1,2,3,4].idup; // workaround until qualified ctor is properly supported ++ else ++ T a = [1,2,3,4]; ++ assert(a == [1,2,3,4]); ++ assert(a != [5,6,7,8]); ++ assert(+a[0] == 1); ++ version (LittleEndian) ++ assert(cast(ulong[])a == [0x0000_0002_0000_0001, 0x0000_0004_0000_0003]); ++ else ++ assert(cast(ulong[])a == [0x0000_0001_0000_0002, 0x0000_0003_0000_0004]); ++ assert(a ~ [10,11] == [1,2,3,4,10,11]); ++ assert(a[0] == 1); ++ assert(a[] == [1,2,3,4]); ++ assert(a[2..4] == [3,4]); ++ static if (is(T == MyArray)) // mutable ++ { ++ a = a; ++ a = [5,6,7,8]; assert(a == [5,6,7,8]); ++ a[0] = 0; assert(a == [0,6,7,8]); ++ a[] = 1; assert(a == [1,1,1,1]); ++ a[0..3] = 2; assert(a == [2,2,2,1]); ++ a[0] += 2; assert(a == [4,2,2,1]); ++ a[] *= 2; assert(a == [8,4,4,2]); ++ a[0..2] /= 2; assert(a == [4,2,4,2]); ++ } ++ } + } + unittest + { +@@ -2943,8 +4004,7 @@ unittest + auto h = new Hoge(new Foo()); + int n; + +- // blocked by bug 7641 +- //static assert(!__traits(compiles, { Foo f = h; })); ++ static assert(!__traits(compiles, { Foo f = h; })); + + // field + h.field = 1; // lhs of assign +@@ -2975,7 +4035,7 @@ unittest + // bug5896 test + assert(h.opCast!int() == 0); + assert(cast(int)h == 0); +- immutable(Hoge) ih = new immutable(Hoge)(new Foo()); ++ const ih = new const Hoge(new Foo()); + static assert(!__traits(compiles, ih.opCast!int())); + static assert(!__traits(compiles, cast(int)ih)); + +@@ -3019,6 +4079,20 @@ unittest + MyFoo2 f2; + f2 = f2; + } ++unittest ++{ ++ // bug8613 ++ static struct Name ++ { ++ mixin Proxy!val; ++ private string val; ++ this(string s) { val = s; } ++ } ++ ++ bool[Name] names; ++ names[Name("a")] = true; ++ bool* b = Name("a") in names; ++} + + /** + Library typedef. +@@ -3050,12 +4124,38 @@ unittest + Typedef!int y = 10; + assert(x == y); + ++ static assert(Typedef!int.init == int.init); ++ + Typedef!(float, 1.0) z; // specifies the init + assert(z == 1.0); + ++ static assert(typeof(z).init == 1.0); ++ + alias Typedef!(int, 0, "dollar") Dollar; + alias Typedef!(int, 0, "yen") Yen; + static assert(!is(Dollar == Yen)); ++ ++ Typedef!(int[3]) sa; ++ static assert(sa.length == 3); ++ static assert(typeof(sa).length == 3); ++} ++ ++unittest ++{ ++ // bug8655 ++ import std.typecons; ++ import std.bitmanip; ++ static import core.stdc.config; ++ ++ alias Typedef!(core.stdc.config.c_ulong) c_ulong; ++ ++ static struct Foo ++ { ++ mixin(bitfields!( ++ c_ulong, "NameOffset", 31, ++ c_ulong, "NameIsString", 1 ++ )); ++ } + } + + +@@ -3066,32 +4166,17 @@ it is the responsibility of the user to + object outside the scope. + + Note: it's illegal to move a class reference even if you are sure there +-are no pointers to it. +- +-Example: +----- +-unittest +-{ +- class A { int x; } +- auto a1 = scoped!A(); +- auto a2 = scoped!A(); +- a1.x = 42; +- a2.x = 53; +- assert(a1.x == 42); +- +- auto a3 = a2; // illegal, fails to compile +- assert([a2][0].x == 42); // illegal, unexpected behaviour +-} +----- ++are no pointers to it. As such, it is illegal to move a scoped object. + */ +-@system auto scoped(T, Args...)(auto ref Args args) if (is(T == class)) ++template scoped(T) ++ if (is(T == class)) + { + // _d_newclass now use default GC alignment (looks like (void*).sizeof * 2 for + // small objects). We will just use the maximum of filed alignments. + alias classInstanceAlignment!T alignment; + alias _alignUp!alignment aligned; + +- static struct Scoped(T) ++ static struct Scoped + { + // Addition of `alignment` is required as `Scoped_store` can be misaligned in memory. + private void[aligned(__traits(classInstanceSize, T) + size_t.sizeof) + alignment] Scoped_store = void; +@@ -3112,10 +4197,8 @@ unittest + } + alias Scoped_payload this; + +- @disable this(this) +- { +- assert(false, "Illegal call to Scoped this(this)"); +- } ++ @disable this(); ++ @disable this(this); + + ~this() + { +@@ -3125,11 +4208,47 @@ unittest + } + } + +- Scoped!T result; +- immutable size_t d = cast(void*) result.Scoped_payload - result.Scoped_store.ptr; +- *cast(size_t*) &result.Scoped_store[$ - size_t.sizeof] = d; +- emplace!(Unqual!T)(result.Scoped_store[d .. $ - size_t.sizeof], args); +- return result; ++ /// Returns the scoped object ++ @system auto scoped(Args...)(auto ref Args args) ++ { ++ Scoped result = void; ++ void* alignedStore = cast(void*) aligned(cast(size_t) result.Scoped_store.ptr); ++ immutable size_t d = alignedStore - result.Scoped_store.ptr; ++ *cast(size_t*) &result.Scoped_store[$ - size_t.sizeof] = d; ++ emplace!(Unqual!T)(result.Scoped_store[d .. $ - size_t.sizeof], args); ++ return result; ++ } ++} ++/// ++unittest ++{ ++ class A ++ { ++ int x; ++ this() {x = 0;} ++ this(int i){x = i;} ++ } ++ ++ // Standard usage ++ auto a1 = scoped!A(); ++ auto a2 = scoped!A(1); ++ a1.x = 42; ++ assert(a1.x == 42); ++ assert(a2.x == 1); ++ ++ // Restrictions ++ static assert(!is(typeof({ ++ auto e1 = a1; // illegal, scoped objects can't be copied ++ assert([a2][0].x == 42); // ditto ++ alias ScopedObject = typeof(a1); ++ auto e2 = ScopedObject(); //Illegal, must be built via scoped!A ++ auto e3 = ScopedObject(1); //Illegal, must be built via scoped!A ++ }))); ++ ++ // Use with alias ++ alias makeScopedA = scoped!A; ++ auto a6 = makeScopedA(); ++ auto a7 = makeScopedA(); + } + + private size_t _alignUp(size_t alignment)(size_t n) +@@ -3278,11 +4397,10 @@ unittest // Issue 8039 testcase + assert(dels == 1+6); + } + ++//GDC bug 52 ++/+ + unittest + { +- pragma(msg, "test disabled on gdc, see gdc bug 52 (NRVO not implemented)"); +- version(none) +- { + // bug4500 + class A + { +@@ -3300,8 +4418,8 @@ unittest + + a1.a = a1; + assert(a1.check()); +- } + } +++/ + + unittest + { +@@ -3370,6 +4488,24 @@ unittest + assert(val == 4); + } + ++unittest ++{ ++ class C ++ { ++ this(){} ++ this(int){} ++ this(int, int){} ++ } ++ alias makeScopedC = scoped!C; ++ ++ auto a = makeScopedC(); ++ auto b = makeScopedC(1); ++ auto c = makeScopedC(1, 1); ++ ++ static assert(is(typeof(a) == typeof(b))); ++ static assert(is(typeof(b) == typeof(c))); ++} ++ + /** + Defines a simple, self-documenting yes/no flag. This makes it easy for + APIs to define functions accepting flags without resorting to $(D +--- a/src/libphobos/src/std/typelist.d 1970-01-01 01:00:00.000000000 +0100 ++++ b/src/libphobos/src/std/typelist.d 2014-04-01 16:32:51.000000000 +0100 +@@ -0,0 +1,456 @@ ++// Written in the D programming language. ++ ++/** ++ * This module defines a list of types $(D_PARAM TypeList) ++ * and operations on $(D_PARAM TypeList)s. ++ * Together they define a compile-time functional programming framework, ++ * complete with lambdas, higher-order functions, and arbitrary data structures ++ * ++ * Macros: ++ * WIKI = Phobos/StdTypelist ++ * ++ * Synopsis: ++ * ++ * ---- ++ * // **** BUG **** problems with mutual recursion ++ * template Synopsis(T...) ++ * { ++ * alias TypeList!(T) list; ++ * ++ * template IsPtr(U) { ++ * static if (is(U foo: V*, V)) ++ * enum IsPtr = true; ++ * else ++ * enum IsPtr = false; ++ * } ++ * enum arePointers = All!(list, IsPtr); ++ * ++ * alias Map!(StripPtr, list) StripPointers; ++ * } ++ * static assert(is (Synopsis!(char**, void***).StripPointers.toTuple == TypeTuple!(char, void))); ++ * ---- ++ * ++ * Copyright: Copyright Bartosz Milewski 2008- 2009. ++ * License: Boost License 1.0. ++ * Authors: $(WEB bartoszmilewski.wordpress.com, Bartosz Milewski) ++ * Source: $(PHOBOSSRC std/_typelist.d) ++ */ ++/* Copyright Burton Radons 2008 - 2009. ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ */ ++module std.typelist; ++version(unittest) { ++ import std.typetuple; ++} ++ ++/** ++ * Creates a compile-time list of types from a tuple. ++ * $(D TypeList)s are more general than tuples because ++ * you can pass more than one $(D TypeList) to a template. ++ * You may also combine them into higher-order structures. ++ * $(D TypeList)s are passed to other templates as alias parameters ++ * To create an empty list use $(D TypeList!()) ++ * ++ * $(D TypeList) efines several "methods": ++ * ++ * $(D_PARAM toTuple), $(D_PARAM head), $(D_PARAM tail), $(D_PARAM length), $(D_PARAM isEmpty) ++ * ++ * Example: ++ * --- ++ * template Filter(alias Pred, alias List) ++ * { ++ * static if (List.isEmpty) ++ * alias TypeList!() Filter; ++ * else static if (Pred!(List.head)) ++ * alias Cons!(List.head, Filter!(Pred, List.tail)) Filter; ++ * else ++ * alias Filter!(Pred, List.tail) Filter; ++ * } ++ * --- ++ */ ++ ++template TypeList(T...) ++{ ++ alias T toTuple; ++ ++ static if(T.length != 0) ++ { ++ alias T[0] head; ++ alias TypeList!(T[1..$]) tail; ++ enum length = T.length; ++ enum isEmpty = false; ++ } ++ else ++ { ++ enum length = 0; ++ enum isEmpty = true; ++ } ++} ++ ++unittest { ++ static assert (is (TypeList!(void*, int).toTuple == TypeTuple!(void*, int))); ++ static assert (is (TypeList!(void*, int).head == void*)); ++ static assert (is (TypeList!(void*, int).tail.toTuple == TypeTuple!(int))); ++ static assert (is (TypeList!(int).tail.toTuple == TypeTuple!())); ++ static assert (TypeList!(int).tail.isEmpty); ++ ++ static assert (TypeList!(void*, int).length == 2); ++ static assert (!TypeList!(void*, int).isEmpty); ++ static assert (TypeList!().length == 0); ++ static assert (TypeList!().isEmpty); ++} ++ ++/** ++ * Appends a type tuple to a $(D TypeList), returns a $(D TypeList) ++*/ ++template AppendTypes(alias List, T...) ++{ ++ static if (List.isEmpty) ++ alias TypeList!(T) AppendTypes; ++ else ++ alias TypeList!(List.toTuple, T) AppendTypes; ++} ++ ++unittest { ++ static assert (is (AppendTypes!(TypeList!(void*, int), long, short).toTuple ++ == TypeTuple!(void*, int, long, short))); ++ static assert (is (AppendTypes!(TypeList!(void*, int)).toTuple ++ == TypeTuple!(void*, int))); ++ static assert (AppendTypes!(TypeList!()).isEmpty); ++} ++ ++/** ++ * Appends one $(D TypeList) to another, returns a $(D TypeList) ++*/ ++template Append(alias Left, alias Right) ++{ ++ alias AppendTypes!(Left, Right.toTuple) Append; ++} ++ ++unittest { ++ static assert (is (Append!(TypeList!(void*, int), TypeList!(long, short)).toTuple ++ == TypeTuple!(void*, int, long, short))); ++ static assert (is (Append!(TypeList!(void*, int), TypeList!()).toTuple ++ == TypeTuple!(void*, int))); ++ static assert (Append!(TypeList!(), TypeList!()).isEmpty); ++} ++ ++/** ++ * Prepends a type to a $(D TypeList), returns a $(D TypeList) ++*/ ++template Cons(T, alias List) ++{ ++ static if (List.isEmpty) ++ alias TypeList!(T) Cons; ++ else ++ alias TypeList!(T, List.toTuple) Cons; ++} ++ ++unittest { ++ static assert (is (Cons!(long, TypeList!(void*, int)).toTuple ++ == TypeTuple!(long, void*, int))); ++ static assert (is (Cons!(long, TypeList!(void*, int)).head ++ == long)); ++ static assert (is (Cons!(int, TypeList!()).toTuple == TypeTuple!(int))); ++ static assert (is (Cons!(char[], Cons!(int, TypeList!())).toTuple ++ == TypeTuple!(char[], int))); ++} ++ ++/** ++ * Tests if all emements of a $(D TypeList) against a predicate. ++ * Returns true if all all types satisfy the predicate, false otherwise. ++*/ ++template All(alias List, alias F) ++{ ++ static if (List.isEmpty) ++ enum All = true; ++ else ++ enum All = F!(List.head) && All!(List.tail, F); ++} ++ ++version(unittest) { ++ template IsPointer(T) ++ { ++ static if (is (T foo: U*, U)) ++ enum IsPointer = true; ++ else ++ enum IsPointer = false; ++ } ++} ++ ++unittest { ++ static assert (All!(TypeList!(void*, char*, int**), IsPointer)); ++ static assert (!All!(TypeList!(void*, char*, int), IsPointer)); ++} ++ ++/** ++ * Tests if there is an emement in a $(D TypeList) that satisfies a predicate. ++*/ ++template Any(alias List, alias F) ++{ ++ static if (List.isEmpty) ++ enum Any = false; ++ else ++ enum Any = F!(List.head) || Any!(List.tail, F); ++} ++ ++unittest { ++ static assert (Any!(TypeList!(int, char*, int**), IsPointer)); ++ static assert (!Any!(TypeList!(char[], char, int), IsPointer)); ++} ++ ++/** ++ * Applies a given "function" on types to a type tuple. Returns a tuple of results ++*/ ++template Map(alias F, T...) ++{ ++ alias Map!(F, TypeList!(T)).toTuple Map; ++} ++ ++/** ++ * Applies a given "function" to a $(D TypeList). Returns a $(D TypeList) of results ++*/ ++private template Map(alias F, alias List) ++{ ++ static if (List.isEmpty) ++ alias TypeList!() Map; ++ else ++ alias Cons!(F!(List.head), Map!(F, List.tail)) Map; ++} ++ ++version(unittest) { ++ template MakePtr(T) ++ { ++ alias T* MakePtr; ++ } ++} ++ ++unittest { ++ static assert (is (MakePtr!(int) == int*)); ++ static assert (is (Map!(MakePtr, void *, char) == TypeTuple!(void**, char*))); ++} ++ ++/** ++ * Filters a type tuple using a predicate. ++ * Takes a predicate and a tuple and returns another tuple ++*/ ++template Filter(alias Pred, T...) ++{ ++ alias Filter!(Pred, TypeList!(T)).toTuple Filter; ++} ++ ++/** ++ * Filters a $(D TypeList) using a predicate. Returns a $(D TypeList) of elements that ++ * satisfy the predicate. ++*/ ++template Filter(alias Pred, alias List) ++{ ++ static if (List.isEmpty) ++ alias TypeList!() Filter; ++ else static if (Pred!(List.head)) ++ alias Cons!(List.head, Filter!(Pred, List.tail)) Filter; ++ else ++ alias Filter!(Pred, List.tail) Filter; ++} ++ ++unittest { ++ static assert(is(Filter!(IsPointer, int, void*, char[], int*) == TypeTuple!(void*, int*))); ++ static assert(is(Filter!(IsPointer) == TypeTuple!())); ++} ++ ++template FoldRight(alias F, alias Init, alias List) ++{ ++ static if (List.isEmpty) ++ alias Init FoldRight; ++ else ++ alias F!(List.head, FoldRight!(F, Init, List.tail)) FoldRight; ++} ++ ++template FoldRight(alias F, int Init, alias List) ++{ ++ static if (List.isEmpty) ++ alias Init FoldRight; ++ else ++ alias F!(List.head, FoldRight!(F, Init, List.tail)) FoldRight; ++} ++ ++version(unittest) { ++ template snoC(T, alias List) ++ { ++ alias TypeList!(List.toTuple, T) snoC; ++ } ++ ++ template Inc(T, int i) ++ { ++ enum Inc = i + 1; ++ } ++} ++ ++unittest { ++ // *** Compiler bugs ++ //static assert (snoC!(int, TypeList!(long)).toTuple == TypeTuple!(long, int)); ++ //static assert (FoldRight!(snoC, TypeList!(), TypeList!(int, long)).toTuple == TypeTuple!(long, int)); ++ static assert (!FoldRight!(snoC, TypeList!(), TypeList!(int)).isEmpty); ++ static assert (FoldRight!(Inc, 0, TypeList!(int, long)) == 2); ++} ++ ++/** A list of functions operating on types. ++ * Used to pass multiple type functions to ++ * a template. ++ * ++ * Example: ++ * ---- ++ * template Or(alias FList) ++ * { ++ * template lambda(X) ++ * { ++ * static if (FList.isEmpty) ++ * enum lambda = true; ++ * else ++ * enum lambda = FList.head!(X) || Or!(FList.tail).apply!(X); ++ * } ++ * alias lambda apply; ++ * } ++ * ---- ++*/ ++template TypeFunList() ++{ ++ enum length = 0; ++ enum isEmpty = true; ++} ++ ++template TypeFunList(alias F) ++{ ++ alias F head; ++ alias TypeFunList!() tail; ++ enum length = 1; ++ enum isEmpty = false; ++} ++ ++template TypeFunList(alias F, alias Tail) ++{ ++ alias F head; ++ alias Tail tail; ++ enum length = 1 + Tail.length; ++ enum isEmpty = false; ++} ++ ++unittest { ++ static assert (TypeFunList!().isEmpty); ++ static assert (!TypeFunList!(IsPointer).isEmpty); ++ static assert (TypeFunList!(IsPointer).tail.isEmpty); ++ static assert (TypeFunList!(IsPointer).head!(void*)); ++ static assert (TypeFunList!(IsPointer, TypeFunList!(IsPointer)).head!(void *)); ++ static assert (TypeFunList!(IsPointer, TypeFunList!(IsPointer)).tail.head!(void *)); ++} ++ ++/** Negates a type predicate. ++ * The negated predicate is a "member" $(D apply). ++ * ++ * Example: ++ * ---- ++ * static assert (Not!(IsPointer).apply!(int)); ++ * ---- ++*/ ++template Not(alias F) ++{ ++ template lambda(X) ++ { ++ enum lambda = !F!(X); ++ } ++ alias lambda apply; ++} ++ ++unittest { ++ static assert (Not!(IsPointer).apply!(int)); ++} ++ ++/** Combines two type predicates using logical OR. ++ * The resulting predicate is callable through the field $(D apply) ++ * ++ * Example: ++ * ---- ++ * static assert(Or!(IsPointer, Not!(IsPointer).apply).apply!(int)); ++ * ---- ++*/ ++template Or(alias F1, alias F2) ++{ ++ template lambda(X) ++ { ++ enum lambda = F1!(X) || F2!(X); ++ } ++ alias lambda apply; ++} ++ ++unittest { ++ static assert(Or!(IsPointer, IsPointer).apply!(int*)); ++ static assert(Or!(IsPointer, Not!(IsPointer).apply).apply!(int)); ++} ++ ++/** Combines a list of type predicates using logical OR. ++ * The resulting predicate is callable through the field $(D apply) ++*/ ++template Or(alias FList) ++{ ++ template lambda(X) ++ { ++ static if (FList.isEmpty) ++ enum lambda = true; ++ else ++ enum lambda = FList.head!(X) || Or!(FList.tail).apply!(X); ++ } ++ alias lambda apply; ++} ++ ++unittest { ++ static assert (Or!( ++ TypeFunList!(IsPointer, ++ TypeFunList!(Not!(IsPointer).apply) ++ )).apply!(int*)); ++} ++ ++/** Combines two type predicates using logical AND. ++ * The resulting predicate is callable through the field $(D apply) ++ * ++ * Example: ++ * ---- ++ * static assert(!And!(IsPointer, Not!(IsPointer).apply).apply!(int)); ++ * ---- ++*/ ++template And(alias F1, alias F2) ++{ ++ template lambda(X) ++ { ++ enum lambda = F1!(X) && F2!(X); ++ } ++ alias lambda apply; ++} ++ ++unittest { ++ static assert(And!(IsPointer, IsPointer).apply!(int*)); ++ static assert(!And!(IsPointer, Not!(IsPointer).apply).apply!(int)); ++} ++ ++/** Combines a list of type predicates using logical AND. ++ * The resulting predicate is callable through the field $(D apply) ++*/ ++template And(alias FList) ++{ ++ template lambda(X) ++ { ++ static if (FList.isEmpty) ++ enum lambda = true; ++ else ++ enum lambda = FList.head!(X) && And!(FList.tail).apply!(X); ++ } ++ alias lambda apply; ++} ++ ++unittest { ++ static assert (!And!( ++ TypeFunList!(IsPointer, ++ TypeFunList!(Not!(IsPointer).apply) ++ )).apply!(int*)); ++} +--- a/src/libphobos/src/std/typetuple.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/typetuple.d 2014-04-01 16:32:51.000000000 +0100 +@@ -38,45 +38,37 @@ import std.traits; + + /** + * Creates a typetuple out of a sequence of zero or more types. +- * Example: +- * --- +- * import std.typetuple; +- * alias TypeTuple!(int, double) TL; +- * +- * int foo(TL td) // same as int foo(int, double); +- * { +- * return td[0] + cast(int)td[1]; +- * } +- * --- +- * +- * Example: +- * --- +- * TypeTuple!(TL, char) +- * // is equivalent to: +- * TypeTuple!(int, double, char) +- * --- + */ + template TypeTuple(TList...) + { + alias TList TypeTuple; + } + ++/// ++unittest ++{ ++ import std.typetuple; ++ alias TL = TypeTuple!(int, double); ++ ++ int foo(TL td) // same as int foo(int, double); ++ { ++ return td[0] + cast(int)td[1]; ++ } ++} ++ ++/// ++unittest ++{ ++ alias TL = TypeTuple!(int, double); ++ ++ alias Types = TypeTuple!(TL, char); ++ static assert(is(Types == TypeTuple!(int, double, char))); ++} ++ + /** + * Returns the index of the first occurrence of type T in the + * sequence of zero or more types TList. + * If not found, -1 is returned. +- * Example: +- * --- +- * import std.typetuple; +- * import std.stdio; +- * +- * void foo() +- * { +- * writefln("The index of long is %s", +- * staticIndexOf!(long, TypeTuple!(int, long, double))); +- * // prints: The index of long is 1 +- * } +- * --- + */ + template staticIndexOf(T, TList...) + { +@@ -89,6 +81,20 @@ template staticIndexOf(alias T, TList... + enum staticIndexOf = genericIndexOf!(T, TList).index; + } + ++/// ++unittest ++{ ++ import std.typetuple; ++ import std.stdio; ++ ++ void foo() ++ { ++ writefln("The index of long is %s", ++ staticIndexOf!(long, TypeTuple!(int, long, double))); ++ // prints: The index of long is 1 ++ } ++} ++ + // [internal] + private template genericIndexOf(args...) + if (args.length >= 1) +@@ -145,24 +151,9 @@ alias staticIndexOf IndexOf; + /** + * Returns a typetuple created from TList with the first occurrence, + * if any, of T removed. +- * Example: +- * --- +- * Erase!(long, int, long, double, char) +- * // is the same as: +- * TypeTuple!(int, double, char) +- * --- +- */ +-// template Erase(T, TList...) +-// { +-// static if (TList.length == 0) +-// alias TList Erase; +-// else static if (is(T == TList[0])) +-// alias TList[1 .. $] Erase; +-// else +-// alias TypeTuple!(TList[0], Erase!(T, TList[1 .. $])) Erase; +-// } +- template Erase(T, TList...) +- { ++ */ ++template Erase(T, TList...) ++{ + alias GenericErase!(T, TList).result Erase; + } + +@@ -172,6 +163,14 @@ template Erase(alias T, TList...) + alias GenericErase!(T, TList).result Erase; + } + ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, double, char); ++ alias TL = Erase!(long, Types); ++ static assert(is(TL == TypeTuple!(int, double, char))); ++} ++ + // [internal] + private template GenericErase(args...) + if (args.length >= 1) +@@ -189,11 +188,11 @@ private template GenericErase(args...) + else + alias TypeTuple!(head, GenericErase!(e, tail).result) result; + } +- else ++ else + { + alias TypeTuple!() result; + } +- } ++} + + unittest + { +@@ -210,14 +209,6 @@ unittest + /** + * Returns a typetuple created from TList with the all occurrences, + * if any, of T removed. +- * Example: +- * --- +- * alias TypeTuple!(int, long, long, int) TL; +- * +- * EraseAll!(long, TL) +- * // is the same as: +- * TypeTuple!(int, int) +- * --- + */ + template EraseAll(T, TList...) + { +@@ -230,6 +221,15 @@ template EraseAll(alias T, TList...) + alias GenericEraseAll!(T, TList).result EraseAll; + } + ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, long, int); ++ ++ alias TL = EraseAll!(long, Types); ++ static assert(is(TL == TypeTuple!(int, int))); ++} ++ + // [internal] + private template GenericEraseAll(args...) + if (args.length >= 1) +@@ -248,11 +248,11 @@ private template GenericEraseAll(args... + else + alias TypeTuple!(head, next) result; + } +- else ++ else + { + alias TypeTuple!() result; + } +- } ++} + + unittest + { +@@ -269,14 +269,6 @@ unittest + /** + * Returns a typetuple created from TList with the all duplicate + * types removed. +- * Example: +- * --- +- * alias TypeTuple!(int, long, long, int, float) TL; +- * +- * NoDuplicates!(TL) +- * // is the same as: +- * TypeTuple!(int, long, float) +- * --- + */ + template NoDuplicates(TList...) + { +@@ -286,6 +278,15 @@ template NoDuplicates(TList...) + alias TypeTuple!(TList[0], NoDuplicates!(EraseAll!(TList[0], TList[1 .. $]))) NoDuplicates; + } + ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, long, int, float); ++ ++ alias TL = NoDuplicates!(Types); ++ static assert(is(TL == TypeTuple!(int, long, float))); ++} ++ + unittest + { + static assert( +@@ -298,14 +299,6 @@ unittest + /** + * Returns a typetuple created from TList with the first occurrence + * of type T, if found, replaced with type U. +- * Example: +- * --- +- * alias TypeTuple!(int, long, long, int, float) TL; +- * +- * Replace!(long, char, TL) +- * // is the same as: +- * TypeTuple!(int, char, long, int, float) +- * --- + */ + template Replace(T, U, TList...) + { +@@ -330,6 +323,15 @@ template Replace(alias T, alias U, TList + alias GenericReplace!(T, U, TList).result Replace; + } + ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, long, int, float); ++ ++ alias TL = Replace!(long, char, Types); ++ static assert(is(TL == TypeTuple!(int, char, long, int, float))); ++} ++ + // [internal] + private template GenericReplace(args...) + if (args.length >= 2) +@@ -349,7 +351,7 @@ private template GenericReplace(args...) + alias TypeTuple!(head, + GenericReplace!(from, to, tail).result) result; + } +- else ++ else + { + alias TypeTuple!() result; + } +@@ -377,14 +379,6 @@ unittest + /** + * Returns a typetuple created from TList with all occurrences + * of type T, if found, replaced with type U. +- * Example: +- * --- +- * alias TypeTuple!(int, long, long, int, float) TL; +- * +- * ReplaceAll!(long, char, TL) +- * // is the same as: +- * TypeTuple!(int, char, char, int, float) +- * --- + */ + template ReplaceAll(T, U, TList...) + { +@@ -409,6 +403,15 @@ template ReplaceAll(alias T, alias U, TL + alias GenericReplaceAll!(T, U, TList).result ReplaceAll; + } + ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, long, int, float); ++ ++ alias TL = ReplaceAll!(long, char, Types); ++ static assert(is(TL == TypeTuple!(int, char, char, int, float))); ++} ++ + // [internal] + private template GenericReplaceAll(args...) + if (args.length >= 2) +@@ -455,35 +458,34 @@ unittest + + /** + * Returns a typetuple created from TList with the order reversed. +- * Example: +- * --- +- * alias TypeTuple!(int, long, long, int, float) TL; +- * +- * Reverse!(TL) +- * // is the same as: +- * TypeTuple!(float, int, long, long, int) +- * --- + */ + template Reverse(TList...) + { +- static if (TList.length == 0) +- alias TList Reverse; ++ static if (TList.length <= 1) ++ { ++ alias Reverse = TList; ++ } + else +- alias TypeTuple!(Reverse!(TList[1 .. $]), TList[0]) Reverse; ++ { ++ alias Reverse = ++ TypeTuple!( ++ Reverse!(TList[$/2 .. $ ]), ++ Reverse!(TList[ 0 .. $/2])); ++ } ++} ++ ++/// ++unittest ++{ ++ alias Types = TypeTuple!(int, long, long, int, float); ++ ++ alias TL = Reverse!(Types); ++ static assert(is(TL == TypeTuple!(float, int, long, long, int))); + } + + /** + * Returns the type from TList that is the most derived from type T. + * If none are found, T is returned. +- * Example: +- * --- +- * class A { } +- * class B : A { } +- * class C : B { } +- * alias TypeTuple!(A, C, B) TL; +- * +- * MostDerived!(Object, TL) x; // x is declared as type C +- * --- + */ + template MostDerived(T, TList...) + { +@@ -495,20 +497,21 @@ template MostDerived(T, TList...) + alias MostDerived!(T, TList[1 .. $]) MostDerived; + } + ++/// ++unittest ++{ ++ class A { } ++ class B : A { } ++ class C : B { } ++ alias Types = TypeTuple!(A, C, B); ++ ++ MostDerived!(Object, Types) x; // x is declared as type C ++ static assert(is(typeof(x) == C)); ++} ++ + /** + * Returns the typetuple TList with the types sorted so that the most + * derived types come first. +- * Example: +- * --- +- * class A { } +- * class B : A { } +- * class C : B { } +- * alias TypeTuple!(A, C, B) TL; +- * +- * DerivedToFront!(TL) +- * // is the same as: +- * TypeTuple!(C, B, A) +- * --- + */ + template DerivedToFront(TList...) + { +@@ -521,29 +524,47 @@ template DerivedToFront(TList...) + TList[1 .. $]))) DerivedToFront; + } + ++/// ++unittest ++{ ++ class A { } ++ class B : A { } ++ class C : B { } ++ alias Types = TypeTuple!(A, C, B); ++ ++ alias TL = DerivedToFront!(Types); ++ static assert(is(TL == TypeTuple!(C, B, A))); ++} + + /** + Evaluates to $(D TypeTuple!(F!(T[0]), F!(T[1]), ..., F!(T[$ - 1]))). +- +-Example: +----- +-alias staticMap!(Unqual, int, const int, immutable int) T; +-static assert(is(T == TypeTuple!(int, int, int))); +----- + */ + template staticMap(alias F, T...) + { + static if (T.length == 0) + { +- alias TypeTuple!() staticMap; ++ alias staticMap = TypeTuple!(); ++ } ++ else static if (T.length == 1) ++ { ++ alias staticMap = TypeTuple!(F!(T[0])); + } + else + { +- alias TypeTuple!(F!(T[0]), +- staticMap!(F, T[1 .. $])) staticMap; ++ alias staticMap = ++ TypeTuple!( ++ staticMap!(F, T[ 0 .. $/2]), ++ staticMap!(F, T[$/2 .. $ ])); + } + } + ++/// ++unittest ++{ ++ alias TL = staticMap!(Unqual, int, const int, immutable int); ++ static assert(is(TL == TypeTuple!(int, int, int))); ++} ++ + unittest + { + // empty +@@ -564,33 +585,30 @@ $(D F!(T[0]) && F!(T[1]) && ... && F!(T[ + + Evaluation is $(I not) short-circuited if a false result is encountered; the + template predicate must be instantiable with all the given items. +- +-Example: +----- +-static assert(!allSatisfy!(isIntegral, int, double)); +-static assert(allSatisfy!(isIntegral, int, long)); +----- + */ + template allSatisfy(alias F, T...) + { + static if (T.length == 0) + { +- enum bool allSatisfy = true; ++ enum allSatisfy = true; + } + else static if (T.length == 1) + { +- alias F!(T[0]) allSatisfy; ++ enum allSatisfy = F!(T[0]); + } + else + { +- enum bool allSatisfy = F!(T[0]) && allSatisfy!(F, T[1 .. $]); ++ enum allSatisfy = ++ allSatisfy!(F, T[ 0 .. $/2]) && ++ allSatisfy!(F, T[$/2 .. $ ]); + } + } + ++/// + unittest + { + static assert(!allSatisfy!(isIntegral, int, double)); +- static assert(allSatisfy!(isIntegral, int, long)); ++ static assert( allSatisfy!(isIntegral, int, long)); + } + + /** +@@ -599,69 +617,69 @@ $(D F!(T[0]) || F!(T[1]) || ... || F!(T[ + + Evaluation is $(I not) short-circuited if a true result is encountered; the + template predicate must be instantiable with all the given items. +- +-Example: +----- +-static assert(!anySatisfy!(isIntegral, string, double)); +-static assert(anySatisfy!(isIntegral, int, double)); +----- + */ + template anySatisfy(alias F, T...) + { + static if(T.length == 0) + { +- enum bool anySatisfy = false; ++ enum anySatisfy = false; + } + else static if (T.length == 1) + { +- alias F!(T[0]) anySatisfy; ++ enum anySatisfy = F!(T[0]); + } + else + { +- enum bool anySatisfy = F!(T[0]) || anySatisfy!(F, T[1 .. $]); ++ enum anySatisfy = ++ anySatisfy!(F, T[ 0 .. $/2]) || ++ anySatisfy!(F, T[$/2 .. $ ]); + } + } + ++/// + unittest + { + static assert(!anySatisfy!(isIntegral, string, double)); +- static assert(anySatisfy!(isIntegral, int, double)); ++ static assert( anySatisfy!(isIntegral, int, double)); + } + + +-/++ +- Filters a $(D TypeTuple) using a template predicate. Returns a +- $(D TypeTuple) of the elements which satisfy the predicate. +- +- Examples: +--------------------- +-static assert(is(Filter!(isNarrowString, string, wstring, +- dchar[], char[], dstring, int) == +- TypeTuple!(string, wstring, char[]))); +-static assert(is(Filter!(isUnsigned, int, byte, ubyte, +- dstring, dchar, uint, ulong) == +- TypeTuple!(ubyte, uint, ulong))); +--------------------- +- +/ ++/** ++ * Filters a $(D TypeTuple) using a template predicate. Returns a ++ * $(D TypeTuple) of the elements which satisfy the predicate. ++ */ + template Filter(alias pred, TList...) + { +- static if(TList.length == 0) +- alias TypeTuple!() Filter; +- else static if(pred!(TList[0])) +- alias TypeTuple!(TList[0], Filter!(pred, TList[1 .. $])) Filter; ++ static if (TList.length == 0) ++ { ++ alias Filter = TypeTuple!(); ++ } ++ else static if (TList.length == 1) ++ { ++ static if (pred!(TList[0])) ++ alias Filter = TypeTuple!(TList[0]); ++ else ++ alias Filter = TypeTuple!(); ++ } + else +- alias Filter!(pred, TList[1 .. $]) Filter; ++ { ++ alias Filter = ++ TypeTuple!( ++ Filter!(pred, TList[ 0 .. $/2]), ++ Filter!(pred, TList[$/2 .. $ ])); ++ } + } + +-//Verify Examples ++/// + unittest + { +- static assert(is(Filter!(isNarrowString, string, wstring, +- dchar[], char[], dstring, int) == +- TypeTuple!(string, wstring, char[]))); +- static assert(is(Filter!(isUnsigned, int, byte, ubyte, +- dstring, dchar, uint, ulong) == +- TypeTuple!(ubyte, uint, ulong))); ++ alias Types1 = TypeTuple!(string, wstring, dchar[], char[], dstring, int); ++ alias TL1 = Filter!(isNarrowString, Types1); ++ static assert(is(TL1 == TypeTuple!(string, wstring, char[]))); ++ ++ alias Types2 = TypeTuple!(int, byte, ubyte, dstring, dchar, uint, ulong); ++ alias TL2 = Filter!(isUnsigned, Types2); ++ static assert(is(TL2 == TypeTuple!(ubyte, uint, ulong))); + } + + unittest +@@ -693,13 +711,6 @@ private version (unittest) + + /** + * Negates the passed template predicate. +- * +- * Examples: +- * --- +- * alias templateNot!isPointer isNoPointer; +- * static assert(!isNoPointer!(int*)); +- * static assert(allSatisfy!(isNoPointer, string, char, float)); +- * --- + */ + template templateNot(alias pred) + { +@@ -709,12 +720,12 @@ template templateNot(alias pred) + } + } + +-// Verify examples. ++/// + unittest + { + import std.traits; + +- alias templateNot!isPointer isNoPointer; ++ alias isNoPointer = templateNot!isPointer; + static assert(!isNoPointer!(int*)); + static assert(allSatisfy!(isNoPointer, string, char, float)); + } +@@ -737,17 +748,6 @@ unittest + * The predicates are evaluated from left to right, aborting evaluation in a + * short-cut manner if a false result is encountered, in which case the latter + * instantiations do not need to compile. +- * +- * Examples: +- * --- +- * alias templateAnd!(isNumeric, templateNot!isUnsigned) storesNegativeNumbers; +- * static assert(storesNegativeNumbers!int); +- * static assert(!storesNegativeNumbers!string && !storesNegativeNumbers!uint); +- * +- * // An empty list of predicates always yields true. +- * alias templateAnd!() alwaysTrue; +- * static assert(alwaysTrue!int); +- * --- + */ + template templateAnd(Preds...) + { +@@ -767,15 +767,15 @@ template templateAnd(Preds...) + } + } + +-// Verify examples. ++/// + unittest + { +- alias templateAnd!(isNumeric, templateNot!isUnsigned) storesNegativeNumbers; ++ alias storesNegativeNumbers = templateAnd!(isNumeric, templateNot!isUnsigned); + static assert(storesNegativeNumbers!int); + static assert(!storesNegativeNumbers!string && !storesNegativeNumbers!uint); + + // An empty list of predicates always yields true. +- alias templateAnd!() alwaysTrue; ++ alias alwaysTrue = templateAnd!(); + static assert(alwaysTrue!int); + } + +@@ -783,9 +783,9 @@ unittest + { + foreach (T; TypeTuple!(int, staticMap, 42)) + { +- static assert(Instantiate!(templateAnd!(), T)); +- static assert(Instantiate!(templateAnd!(testAlways), T)); +- static assert(Instantiate!(templateAnd!(testAlways, testAlways), T)); ++ static assert( Instantiate!(templateAnd!(), T)); ++ static assert( Instantiate!(templateAnd!(testAlways), T)); ++ static assert( Instantiate!(templateAnd!(testAlways, testAlways), T)); + static assert(!Instantiate!(templateAnd!(testNever), T)); + static assert(!Instantiate!(templateAnd!(testAlways, testNever), T)); + static assert(!Instantiate!(templateAnd!(testNever, testAlways), T)); +@@ -804,17 +804,6 @@ unittest + * The predicates are evaluated from left to right, aborting evaluation in a + * short-cut manner if a true result is encountered, in which case the latter + * instantiations do not need to compile. +- * +- * Examples: +- * --- +- * alias templateOr!(isPointer, isUnsigned) isPtrOrUnsigned; +- * static assert(isPtrOrUnsigned!uint && isPtrOrUnsigned!(short*)); +- * static assert(!isPtrOrUnsigned!int && !isPtrOrUnsigned!string); +- * +- * // An empty list of predicates never yields true. +- * alias templateOr!() alwaysFalse; +- * static assert(!alwaysFalse!int); +- * --- + */ + template templateOr(Preds...) + { +@@ -834,15 +823,15 @@ template templateOr(Preds...) + } + } + +-// Verify examples. ++/// + unittest + { +- alias templateOr!(isPointer, isUnsigned) isPtrOrUnsigned; +- static assert(isPtrOrUnsigned!uint && isPtrOrUnsigned!(short*)); +- static assert(!isPtrOrUnsigned!int && !isPtrOrUnsigned!string); ++ alias isPtrOrUnsigned = templateOr!(isPointer, isUnsigned); ++ static assert( isPtrOrUnsigned!uint && isPtrOrUnsigned!(short*)); ++ static assert(!isPtrOrUnsigned!int && !isPtrOrUnsigned!(string)); + + // An empty list of predicates never yields true. +- alias templateOr!() alwaysFalse; ++ alias alwaysFalse = templateOr!(); + static assert(!alwaysFalse!int); + } + +@@ -850,15 +839,15 @@ unittest + { + foreach (T; TypeTuple!(int, staticMap, 42)) + { +- static assert(Instantiate!(templateOr!(testAlways), T)); +- static assert(Instantiate!(templateOr!(testAlways, testAlways), T)); +- static assert(Instantiate!(templateOr!(testAlways, testNever), T)); +- static assert(Instantiate!(templateOr!(testNever, testAlways), T)); ++ static assert( Instantiate!(templateOr!(testAlways), T)); ++ static assert( Instantiate!(templateOr!(testAlways, testAlways), T)); ++ static assert( Instantiate!(templateOr!(testAlways, testNever), T)); ++ static assert( Instantiate!(templateOr!(testNever, testAlways), T)); + static assert(!Instantiate!(templateOr!(), T)); + static assert(!Instantiate!(templateOr!(testNever), T)); + +- static assert(Instantiate!(templateOr!(testAlways, testError), T)); +- static assert(Instantiate!(templateOr!(testNever, testAlways, testError), T)); ++ static assert( Instantiate!(templateOr!(testAlways, testError), T)); ++ static assert( Instantiate!(templateOr!(testNever, testAlways, testError), T)); + // DMD @@BUG@@: Assertion fails for int, seems like a error gagging + // problem. The bug goes away when removing some of the other template + // instantiations in the module. +--- a/src/libphobos/src/std/uni.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/uni.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,1457 +1,7217 @@ + // Written in the D programming language. + + /++ +- Functions which operate on Unicode characters. +- +- For functions which operate on ASCII characters and ignore Unicode +- characters, see $(LINK2 std_ascii.html, std.ascii). ++ $(SECTION Overview) + ++ $(P The $(D std.uni) module provides an implementation ++ of fundamental Unicode algorithms and data structures. ++ This doesn't include UTF encoding and decoding primitives, ++ see $(XREF _utf, decode) and $(XREF _utf, encode) in std.utf ++ for this functionality. ) ++ ++ $(P All primitives listed operate on Unicode characters and ++ sets of characters. For functions which operate on ASCII characters ++ and ignore Unicode $(CHARACTERS), see $(LINK2 std_ascii.html, std.ascii). ++ For definitions of Unicode $(CHARACTER), $(CODEPOINT) and other terms ++ used throughout this module see the $(S_LINK Terminology, terminology) section ++ below. ++ ) ++ ++ $(P The focus of this module is the core needs of developing Unicode-aware ++ applications. To that effect it provides the following optimized primitives: ++ ) ++ $(UL ++ $(LI Character classification by category and common properties: ++ $(LREF isAlpha), $(LREF isWhite) and others. ++ ) ++ $(LI ++ Case-insensitive string comparison ($(LREF sicmp), $(LREF icmp)). ++ ) ++ $(LI ++ Converting text to any of the four normalization forms via $(LREF normalize). ++ ) ++ $(LI ++ Decoding ($(LREF decodeGrapheme)) and iteration ($(LREF graphemeStride)) ++ by user-perceived characters, that is by $(LREF Grapheme) clusters. ++ ) ++ $(LI ++ Decomposing and composing of individual character(s) according to canonical ++ or compatibility rules, see $(LREF compose) and $(LREF decompose), ++ including the specific version for Hangul syllables $(LREF composeJamo) ++ and $(LREF decomposeHangul). ++ ) ++ ) ++ $(P It's recognized that an application may need further enhancements ++ and extensions, such as less commonly known algorithms, ++ or tailoring existing ones for region specific needs. To help users ++ with building any extra functionality beyond the core primitives, ++ the module provides: ++ ) ++ $(UL ++ $(LI ++ $(LREF CodepointSet), a type for easy manipulation of sets of characters. ++ Besides the typical set algebra it provides an unusual feature: ++ a D source code generator for detection of $(CODEPOINTS) in this set. ++ This is a boon for meta-programming parser frameworks, ++ and is used internally to power classification in small ++ sets like $(LREF isWhite). ++ ) ++ $(LI ++ A way to construct optimal packed multi-stage tables also known as a ++ special case of $(LUCKY Trie). ++ The functions $(LREF codepointTrie), $(LREF codepointSetTrie) ++ construct custom tries that map dchar to value. ++ The end result is a fast and predictable $(BIGOH 1) lookup that powers ++ functions like $(LREF isAlpha) and $(LREF combiningClass), ++ but for user-defined data sets. ++ ) ++ $(LI ++ Generally useful building blocks for customized normalization: ++ $(LREF combiningClass) for querying combining class ++ and $(LREF allowedIn) for testing the Quick_Check ++ property of a given normalization form. ++ ) ++ $(LI ++ Access to a large selection of commonly used sets of $(CODEPOINTS). ++ $(S_LINK Unicode properties, Supported sets) include Script, ++ Block and General Category. The exact contents of a set can be ++ observed in the CLDR utility, on the ++ $(WEB www.unicode.org/cldr/utility/properties.jsp, property index) page ++ of the Unicode website. ++ See $(LREF unicode) for easy and (optionally) compile-time checked set ++ queries. ++ ) ++ ) ++ $(SECTION Synopsis) ++ --- ++ import std.uni; ++ void main() ++ { ++ // initialize code point sets using script/block or property name ++ // now 'set' contains code points from both scripts. ++ auto set = unicode("Cyrillic") | unicode("Armenian"); ++ // same thing but simpler and checked at compile-time ++ auto ascii = unicode.ASCII; ++ auto currency = unicode.Currency_Symbol; ++ ++ // easy set ops ++ auto a = set & ascii; ++ assert(a.empty); // as it has no intersection with ascii ++ a = set | ascii; ++ auto b = currency - a; // subtract all ASCII, Cyrillic and Armenian ++ ++ // some properties of code point sets ++ assert(b.length > 45); // 46 items in Unicode 6.1, even more in 6.2 ++ // testing presence of a code point in a set ++ // is just fine, it is O(logN) ++ assert(!b['$']); ++ assert(!b['\u058F']); // Armenian dram sign ++ assert(b['¥']); ++ ++ // building fast lookup tables, these guarantee O(1) complexity ++ // 1-level Trie lookup table essentially a huge bit-set ~262Kb ++ auto oneTrie = toTrie!1(b); ++ // 2-level far more compact but typically slightly slower ++ auto twoTrie = toTrie!2(b); ++ // 3-level even smaller, and a bit slower yet ++ auto threeTrie = toTrie!3(b); ++ assert(oneTrie['£']); ++ assert(twoTrie['£']); ++ assert(threeTrie['£']); ++ ++ // build the trie with the most sensible trie level ++ // and bind it as a functor ++ auto cyrilicOrArmenian = toDelegate(set); ++ auto balance = find!(cyrilicOrArmenian)("Hello ընկեր!"); ++ assert(balance == "ընկեր!"); ++ // compatible with bool delegate(dchar) ++ bool delegate(dchar) bindIt = cyrilicOrArmenian; ++ ++ // Normalization ++ string s = "Plain ascii (and not only), is always normalized!"; ++ assert(s is normalize(s));// is the same string ++ ++ string nonS = "A\u0308ffin"; // A ligature ++ auto nS = normalize(nonS); // to NFC, the W3C endorsed standard ++ assert(nS == "Äffin"); ++ assert(nS != nonS); ++ string composed = "Äffin"; ++ ++ assert(normalize!NFD(composed) == "A\u0308ffin"); ++ // to NFKD, compatibility decomposition useful for fuzzy matching/searching ++ assert(normalize!NFKD("2¹⁰") == "210"); ++ } ++ --- ++ $(SECTION Terminology) ++ $(P The following is a list of important Unicode notions ++ and definitions. Any conventions used specifically in this ++ module alone are marked as such. The descriptions are based on the formal ++ definition as found in ($WEB http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, ++ chapter three of The Unicode Standard Core Specification.) ++ ) ++ ++ $(P $(DEF Abstract character) A unit of information used for the organization, ++ control, or representation of textual data. ++ Note that: ++ $(UL ++ $(LI When representing data, the nature of that data ++ is generally symbolic as opposed to some other ++ kind of data (for example, visual).) ++ ++ $(LI An abstract character has no concrete form ++ and should not be confused with a $(S_LINK Glyph, glyph).) ++ ++ $(LI An abstract character does not necessarily ++ correspond to what a user thinks of as a “character” ++ and should not be confused with a $(LREF Grapheme).) ++ ++ $(LI The abstract characters encoded (see Encoded character) ++ are known as Unicode abstract characters.) ++ ++ $(LI Abstract characters not directly ++ encoded by the Unicode Standard can often be ++ represented by the use of combining character sequences.) ++ ) ++ ) ++ ++ $(P $(DEF Canonical decomposition) ++ The decomposition of a character or character sequence ++ that results from recursively applying the canonical ++ mappings found in the Unicode Character Database ++ and these described in Conjoining Jamo Behavior ++ (section 12 of ++ $(WEB www.unicode.org/uni2book/ch03.pdf, Unicode Conformance)). ++ ) ++ ++ $(P $(DEF Canonical composition) ++ The precise definition of the Canonical composition ++ is the algorithm as specified in $(WEB www.unicode.org/uni2book/ch03.pdf, ++ Unicode Conformance) section 11. ++ Informally it's the process that does the reverse of the canonical ++ decomposition with the addition of certain rules ++ that e.g. prevent legacy characters from appearing in the composed result. ++ ) ++ ++ $(P $(DEF Canonical equivalent) ++ Two character sequences are said to be canonical equivalents if ++ their full canonical decompositions are identical. ++ ) ++ ++ $(P $(DEF Character) Typically differs by context. ++ For the purpose of this documentation the term $(I character) ++ implies $(I encoded character), that is, a code point having ++ an assigned abstract character (a symbolic meaning). ++ ) ++ ++ $(P $(DEF Code point) Any value in the Unicode codespace; ++ that is, the range of integers from 0 to 10FFFF (hex). ++ Not all code points are assigned to encoded characters. ++ ) ++ ++ $(P $(DEF Code unit) The minimal bit combination that can represent ++ a unit of encoded text for processing or interchange. ++ Depending on the encoding this could be: ++ 8-bit code units in the UTF-8 ($(D char)), ++ 16-bit code units in the UTF-16 ($(D wchar)), ++ and 32-bit code units in the UTF-32 ($(D dchar)). ++ $(I Note that in UTF-32, a code unit is a code point ++ and is represented by the D $(D dchar) type.) ++ ) ++ ++ $(P $(DEF Combining character) A character with the General Category ++ of Combining Mark(M). ++ $(UL ++ $(LI All characters with non-zero canonical combining class ++ are combining characters, but the reverse is not the case: ++ there are combining characters with a zero combining class. ++ ) ++ $(LI These characters are not normally used in isolation ++ unless they are being described. They include such characters ++ as accents, diacritics, Hebrew points, Arabic vowel signs, ++ and Indic matras. ++ ) ++ ) ++ ) ++ ++ $(P $(DEF Combining class) ++ A numerical value used by the Unicode Canonical Ordering Algorithm ++ to determine which sequences of combining marks are to be ++ considered canonically equivalent and which are not. ++ ) ++ ++ $(P $(DEF Compatibility decomposition) ++ The decomposition of a character or character sequence that results ++ from recursively applying both the compatibility mappings and ++ the canonical mappings found in the Unicode Character Database, and those ++ described in Conjoining Jamo Behavior no characters ++ can be further decomposed. ++ ) ++ ++ $(P $(DEF Compatibility equivalent) ++ Two character sequences are said to be compatibility ++ equivalents if their full compatibility decompositions are identical. ++ ) ++ ++ $(P $(DEF Encoded character) An association (or mapping) ++ between an abstract character and a code point. ++ ) ++ ++ $(P $(DEF Glyph) The actual, concrete image of a glyph representation ++ having been rasterized or otherwise imaged onto some display surface. ++ ) ++ ++ $(P $(DEF Grapheme base) A character with the property ++ Grapheme_Base, or any standard Korean syllable block. ++ ) ++ ++ $(P $(DEF Grapheme cluster) Defined as the text between ++ grapheme boundaries as specified by Unicode Standard Annex #29, ++ $(WEB www.unicode.org/reports/tr29/, Unicode text segmentation). ++ Important general properties of a grapheme: ++ $(UL ++ $(LI The grapheme cluster represents a horizontally segmentable ++ unit of text, consisting of some grapheme base (which may ++ consist of a Korean syllable) together with any number of ++ nonspacing marks applied to it. ++ ) ++ $(LI A grapheme cluster typically starts with a grapheme base ++ and then extends across any subsequent sequence of nonspacing marks. ++ A grapheme cluster is most directly relevant to text rendering and ++ processes such as cursor placement and text selection in editing, ++ but may also be relevant to comparison and searching. ++ ) ++ $(LI For many processes, a grapheme cluster behaves as if it was a ++ single character with the same properties as its grapheme base. ++ Effectively, nonspacing marks apply $(I graphically) to the base, ++ but do not change its properties. ++ ) ++ ) ++ $(P This module defines a number of primitives that work with graphemes: ++ $(LREF Grapheme), $(LREF decodeGrapheme) and $(LREF graphemeStride). ++ All of them are using $(I extended grapheme) boundaries ++ as defined in the aforementioned standard annex. ++ ) ++ ) ++ ++ ++ $(P $(DEF Nonspacing mark) A combining character with the ++ General Category of Nonspacing Mark (Mn) or Enclosing Mark (Me). ++ ) ++ ++ $(P $(DEF Spacing mark) A combining character that is not a nonspacing mark.) ++ ++ ++ $(SECTION Normalization) ++ ++ $(P The concepts of $(S_LINK Canonical equivalent, canonical equivalent) ++ or $(S_LINK Compatibility equivalent, compatibility equivalent) ++ characters in the Unicode Standard make it necessary to have a full, formal ++ definition of equivalence for Unicode strings. ++ String equivalence is determined by a process called normalization, ++ whereby strings are converted into forms which are compared ++ directly for identity. This is the primary goal of the normalization process, ++ see the function $(LREF normalize) to convert into any of ++ the four defined forms. ++ ) ++ ++ $(P A very important attribute of the Unicode Normalization Forms ++ is that they must remain stable between versions of the Unicode Standard. ++ A Unicode string normalized to a particular Unicode Normalization Form ++ in one version of the standard is guaranteed to remain in that Normalization ++ Form for implementations of future versions of the standard. ++ ) ++ ++ $(P The Unicode Standard specifies four normalization forms. ++ Informally, two of these forms are defined by maximal decomposition ++ of equivalent sequences, and two of these forms are defined ++ by maximal $(I composition) of equivalent sequences. ++ $(UL ++ $(LI Normalization Form D (NFD): The $(S_LINK Canonical decomposition, ++ canonical decomposition) of a character sequence.) ++ $(LI Normalization Form KD (NFKD): The $(S_LINK Compatibility decomposition, ++ compatibility decomposition) of a character sequence.) ++ $(LI Normalization Form C (NFC): The canonical composition of the ++ $(S_LINK Canonical decomposition, canonical decomposition) ++ of a coded character sequence.) ++ $(LI Normalization Form KC (NFKC): The canonical composition ++ of the $(S_LINK Compatibility decomposition, ++ compatibility decomposition) of a character sequence) ++ ) ++ ) ++ ++ $(P The choice of the normalization form depends on the particular use case. ++ NFC is the best form for general text, since it's more compatible with ++ strings converted from legacy encodings. NFKC is the preferred form for ++ identifiers, especially where there are security concerns. NFD and NFKD ++ are the most useful for internal processing. ++ ) ++ ++ $(SECTION Construction of lookup tables) ++ ++ $(P The Unicode standard describes a set of algorithms that ++ depend on having the ability to quickly look up various properties ++ of a code point. Given the the codespace of about 1 million $(CODEPOINTS), ++ it is not a trivial task to provide a space-efficient solution for ++ the multitude of properties.) ++ ++ $(P Common approaches such as hash-tables or binary search over ++ sorted code point intervals (as in $(LREF InversionList)) are insufficient. ++ Hash-tables have enormous memory footprint and binary search ++ over intervals is not fast enough for some heavy-duty algorithms. ++ ) ++ ++ $(P The recommended solution (see Unicode Implementation Guidelines) ++ is using multi-stage tables that are an implementation of the ++ $(WEB http://en.wikipedia.org/wiki/Trie, Trie) data structure with integer ++ keys and a fixed number of stages. For the remainder of the section ++ this will be called a fixed trie. The following describes a particular ++ implementation that is aimed for the speed of access at the expense ++ of ideal size savings. ++ ) ++ ++ $(P Taking a 2-level Trie as an example the principle of operation is as follows. ++ Split the number of bits in a key (code point, 21 bits) into 2 components ++ (e.g. 15 and 8). The first is the number of bits in the index of the trie ++ and the other is number of bits in each page of the trie. ++ The layout of the trie is then an array of size 2^^bits-of-index followed ++ an array of memory chunks of size 2^^bits-of-page/bits-per-element. ++ ) ++ ++ $(P The number of pages is variable (but not less then 1) ++ unlike the number of entries in the index. The slots of the index ++ all have to contain a number of a page that is present. The lookup is then ++ just a couple of operations - slice the upper bits, ++ lookup an index for these, take a page at this index and use ++ the lower bits as an offset within this page. ++ ++ Assuming that pages are laid out consequently ++ in one array at $(D pages), the pseudo-code is: ++ ) ++ --- ++ auto elemsPerPage = (2 ^^ bits_per_page) / Value.sizeOfInBits; ++ pages[index[n >> bits_per_page]][n & (elemsPerPage - 1)]; ++ --- ++ $(P Where if $(D elemsPerPage) is a power of 2 the whole process is ++ a handful of simple instructions and 2 array reads. Subsequent levels ++ of the trie are introduced by recursing on this notion - the index array ++ is treated as values. The number of bits in index is then again ++ split into 2 parts, with pages over 'current-index' and the new 'upper-index'. ++ ) ++ ++ $(P For completeness a level 1 trie is simply an array. ++ The current implementation takes advantage of bit-packing values ++ when the range is known to be limited in advance (such as $(D bool)). ++ See also $(LREF BitPacked) for enforcing it manually. ++ The major size advantage however comes from the fact ++ that multiple $(B identical pages on every level are merged) by construction. ++ ) ++ ++ $(P The process of constructing a trie is more involved and is hidden from ++ the user in a form of the convenience functions $(LREF codepointTrie), ++ $(LREF codepointSetTrie) and the even more convenient $(LREF toTrie). ++ In general a set or built-in AA with $(D dchar) type ++ can be turned into a trie. The trie object in this module ++ is read-only (immutable); it's effectively frozen after construction. ++ ) ++ ++ $(SECTION Unicode properties) ++ ++ $(P This is a full list of Unicode properties accessible through $(LREF unicode) ++ with specific helpers per category nested within. Consult the ++ $(WEB www.unicode.org/cldr/utility/properties.jsp, CLDR utility) ++ when in doubt about the contents of a particular set.) ++ ++ $(P General category sets listed below are only accessible with the ++ $(LREF unicode) shorthand accessor.) ++ $(BOOKTABLE $(B General category ), ++ $(TR $(TH Abb.) $(TH Long form) ++ $(TH Abb.) $(TH Long form)$(TH Abb.) $(TH Long form)) ++ $(TR $(TD L) $(TD Letter) ++ $(TD Cn) $(TD Unassigned) $(TD Po) $(TD Other_Punctuation)) ++ $(TR $(TD Ll) $(TD Lowercase_Letter) ++ $(TD Co) $(TD Private_Use) $(TD Ps) $(TD Open_Punctuation)) ++ $(TR $(TD Lm) $(TD Modifier_Letter) ++ $(TD Cs) $(TD Surrogate) $(TD S) $(TD Symbol)) ++ $(TR $(TD Lo) $(TD Other_Letter) ++ $(TD N) $(TD Number) $(TD Sc) $(TD Currency_Symbol)) ++ $(TR $(TD Lt) $(TD Titlecase_Letter) ++ $(TD Nd) $(TD Decimal_Number) $(TD Sk) $(TD Modifier_Symbol)) ++ $(TR $(TD Lu) $(TD Uppercase_Letter) ++ $(TD Nl) $(TD Letter_Number) $(TD Sm) $(TD Math_Symbol)) ++ $(TR $(TD M) $(TD Mark) ++ $(TD No) $(TD Other_Number) $(TD So) $(TD Other_Symbol)) ++ $(TR $(TD Mc) $(TD Spacing_Mark) ++ $(TD P) $(TD Punctuation) $(TD Z) $(TD Separator)) ++ $(TR $(TD Me) $(TD Enclosing_Mark) ++ $(TD Pc) $(TD Connector_Punctuation) $(TD Zl) $(TD Line_Separator)) ++ $(TR $(TD Mn) $(TD Nonspacing_Mark) ++ $(TD Pd) $(TD Dash_Punctuation) $(TD Zp) $(TD Paragraph_Separator)) ++ $(TR $(TD C) $(TD Other) ++ $(TD Pe) $(TD Close_Punctuation) $(TD Zs) $(TD Space_Separator)) ++ $(TR $(TD Cc) $(TD Control) $(TD Pf) ++ $(TD Final_Punctuation) $(TD -) $(TD Any)) ++ $(TR $(TD Cf) $(TD Format) ++ $(TD Pi) $(TD Initial_Punctuation) $(TD -) $(TD ASCII)) ++ ) ++ $(P Sets for other commonly useful properties that are ++ accessible with $(LREF unicode):) ++ $(BOOKTABLE $(B Common binary properties), ++ $(TR $(TH Name) $(TH Name) $(TH Name)) ++ $(TR $(TD Alphabetic) $(TD Ideographic) $(TD Other_Uppercase)) ++ $(TR $(TD ASCII_Hex_Digit) $(TD IDS_Binary_Operator) $(TD Pattern_Syntax)) ++ $(TR $(TD Bidi_Control) $(TD ID_Start) $(TD Pattern_White_Space)) ++ $(TR $(TD Cased) $(TD IDS_Trinary_Operator) $(TD Quotation_Mark)) ++ $(TR $(TD Case_Ignorable) $(TD Join_Control) $(TD Radical)) ++ $(TR $(TD Dash) $(TD Logical_Order_Exception) $(TD Soft_Dotted)) ++ $(TR $(TD Default_Ignorable_Code_Point) $(TD Lowercase) $(TD STerm)) ++ $(TR $(TD Deprecated) $(TD Math) $(TD Terminal_Punctuation)) ++ $(TR $(TD Diacritic) $(TD Noncharacter_Code_Point) $(TD Unified_Ideograph)) ++ $(TR $(TD Extender) $(TD Other_Alphabetic) $(TD Uppercase)) ++ $(TR $(TD Grapheme_Base) $(TD Other_Default_Ignorable_Code_Point) $(TD Variation_Selector)) ++ $(TR $(TD Grapheme_Extend) $(TD Other_Grapheme_Extend) $(TD White_Space)) ++ $(TR $(TD Grapheme_Link) $(TD Other_ID_Continue) $(TD XID_Continue)) ++ $(TR $(TD Hex_Digit) $(TD Other_ID_Start) $(TD XID_Start)) ++ $(TR $(TD Hyphen) $(TD Other_Lowercase) ) ++ $(TR $(TD ID_Continue) $(TD Other_Math) ) ++ ) ++ $(P Bellow is the table with block names accepted by $(LREF unicode.block). ++ Note that the shorthand version $(LREF unicode) requires "In" ++ to be prepended to the names of blocks so as to disambiguate ++ scripts and blocks.) ++ ++ $(BOOKTABLE $(B Blocks), ++ $(TR $(TD Aegean Numbers) $(TD Ethiopic Extended) $(TD Mongolian)) ++ $(TR $(TD Alchemical Symbols) $(TD Ethiopic Extended-A) $(TD Musical Symbols)) ++ $(TR $(TD Alphabetic Presentation Forms) $(TD Ethiopic Supplement) $(TD Myanmar)) ++ $(TR $(TD Ancient Greek Musical Notation) $(TD General Punctuation) $(TD Myanmar Extended-A)) ++ $(TR $(TD Ancient Greek Numbers) $(TD Geometric Shapes) $(TD New Tai Lue)) ++ $(TR $(TD Ancient Symbols) $(TD Georgian) $(TD NKo)) ++ $(TR $(TD Arabic) $(TD Georgian Supplement) $(TD Number Forms)) ++ $(TR $(TD Arabic Extended-A) $(TD Glagolitic) $(TD Ogham)) ++ $(TR $(TD Arabic Mathematical Alphabetic Symbols) $(TD Gothic) $(TD Ol Chiki)) ++ $(TR $(TD Arabic Presentation Forms-A) $(TD Greek and Coptic) $(TD Old Italic)) ++ $(TR $(TD Arabic Presentation Forms-B) $(TD Greek Extended) $(TD Old Persian)) ++ $(TR $(TD Arabic Supplement) $(TD Gujarati) $(TD Old South Arabian)) ++ $(TR $(TD Armenian) $(TD Gurmukhi) $(TD Old Turkic)) ++ $(TR $(TD Arrows) $(TD Halfwidth and Fullwidth Forms) $(TD Optical Character Recognition)) ++ $(TR $(TD Avestan) $(TD Hangul Compatibility Jamo) $(TD Oriya)) ++ $(TR $(TD Balinese) $(TD Hangul Jamo) $(TD Osmanya)) ++ $(TR $(TD Bamum) $(TD Hangul Jamo Extended-A) $(TD Phags-pa)) ++ $(TR $(TD Bamum Supplement) $(TD Hangul Jamo Extended-B) $(TD Phaistos Disc)) ++ $(TR $(TD Basic Latin) $(TD Hangul Syllables) $(TD Phoenician)) ++ $(TR $(TD Batak) $(TD Hanunoo) $(TD Phonetic Extensions)) ++ $(TR $(TD Bengali) $(TD Hebrew) $(TD Phonetic Extensions Supplement)) ++ $(TR $(TD Block Elements) $(TD High Private Use Surrogates) $(TD Playing Cards)) ++ $(TR $(TD Bopomofo) $(TD High Surrogates) $(TD Private Use Area)) ++ $(TR $(TD Bopomofo Extended) $(TD Hiragana) $(TD Rejang)) ++ $(TR $(TD Box Drawing) $(TD Ideographic Description Characters) $(TD Rumi Numeral Symbols)) ++ $(TR $(TD Brahmi) $(TD Imperial Aramaic) $(TD Runic)) ++ $(TR $(TD Braille Patterns) $(TD Inscriptional Pahlavi) $(TD Samaritan)) ++ $(TR $(TD Buginese) $(TD Inscriptional Parthian) $(TD Saurashtra)) ++ $(TR $(TD Buhid) $(TD IPA Extensions) $(TD Sharada)) ++ $(TR $(TD Byzantine Musical Symbols) $(TD Javanese) $(TD Shavian)) ++ $(TR $(TD Carian) $(TD Kaithi) $(TD Sinhala)) ++ $(TR $(TD Chakma) $(TD Kana Supplement) $(TD Small Form Variants)) ++ $(TR $(TD Cham) $(TD Kanbun) $(TD Sora Sompeng)) ++ $(TR $(TD Cherokee) $(TD Kangxi Radicals) $(TD Spacing Modifier Letters)) ++ $(TR $(TD CJK Compatibility) $(TD Kannada) $(TD Specials)) ++ $(TR $(TD CJK Compatibility Forms) $(TD Katakana) $(TD Sundanese)) ++ $(TR $(TD CJK Compatibility Ideographs) $(TD Katakana Phonetic Extensions) $(TD Sundanese Supplement)) ++ $(TR $(TD CJK Compatibility Ideographs Supplement) $(TD Kayah Li) $(TD Superscripts and Subscripts)) ++ $(TR $(TD CJK Radicals Supplement) $(TD Kharoshthi) $(TD Supplemental Arrows-A)) ++ $(TR $(TD CJK Strokes) $(TD Khmer) $(TD Supplemental Arrows-B)) ++ $(TR $(TD CJK Symbols and Punctuation) $(TD Khmer Symbols) $(TD Supplemental Mathematical Operators)) ++ $(TR $(TD CJK Unified Ideographs) $(TD Lao) $(TD Supplemental Punctuation)) ++ $(TR $(TD CJK Unified Ideographs Extension A) $(TD Latin-1 Supplement) $(TD Supplementary Private Use Area-A)) ++ $(TR $(TD CJK Unified Ideographs Extension B) $(TD Latin Extended-A) $(TD Supplementary Private Use Area-B)) ++ $(TR $(TD CJK Unified Ideographs Extension C) $(TD Latin Extended Additional) $(TD Syloti Nagri)) ++ $(TR $(TD CJK Unified Ideographs Extension D) $(TD Latin Extended-B) $(TD Syriac)) ++ $(TR $(TD Combining Diacritical Marks) $(TD Latin Extended-C) $(TD Tagalog)) ++ $(TR $(TD Combining Diacritical Marks for Symbols) $(TD Latin Extended-D) $(TD Tagbanwa)) ++ $(TR $(TD Combining Diacritical Marks Supplement) $(TD Lepcha) $(TD Tags)) ++ $(TR $(TD Combining Half Marks) $(TD Letterlike Symbols) $(TD Tai Le)) ++ $(TR $(TD Common Indic Number Forms) $(TD Limbu) $(TD Tai Tham)) ++ $(TR $(TD Control Pictures) $(TD Linear B Ideograms) $(TD Tai Viet)) ++ $(TR $(TD Coptic) $(TD Linear B Syllabary) $(TD Tai Xuan Jing Symbols)) ++ $(TR $(TD Counting Rod Numerals) $(TD Lisu) $(TD Takri)) ++ $(TR $(TD Cuneiform) $(TD Low Surrogates) $(TD Tamil)) ++ $(TR $(TD Cuneiform Numbers and Punctuation) $(TD Lycian) $(TD Telugu)) ++ $(TR $(TD Currency Symbols) $(TD Lydian) $(TD Thaana)) ++ $(TR $(TD Cypriot Syllabary) $(TD Mahjong Tiles) $(TD Thai)) ++ $(TR $(TD Cyrillic) $(TD Malayalam) $(TD Tibetan)) ++ $(TR $(TD Cyrillic Extended-A) $(TD Mandaic) $(TD Tifinagh)) ++ $(TR $(TD Cyrillic Extended-B) $(TD Mathematical Alphanumeric Symbols) $(TD Transport And Map Symbols)) ++ $(TR $(TD Cyrillic Supplement) $(TD Mathematical Operators) $(TD Ugaritic)) ++ $(TR $(TD Deseret) $(TD Meetei Mayek) $(TD Unified Canadian Aboriginal Syllabics)) ++ $(TR $(TD Devanagari) $(TD Meetei Mayek Extensions) $(TD Unified Canadian Aboriginal Syllabics Extended)) ++ $(TR $(TD Devanagari Extended) $(TD Meroitic Cursive) $(TD Vai)) ++ $(TR $(TD Dingbats) $(TD Meroitic Hieroglyphs) $(TD Variation Selectors)) ++ $(TR $(TD Domino Tiles) $(TD Miao) $(TD Variation Selectors Supplement)) ++ $(TR $(TD Egyptian Hieroglyphs) $(TD Miscellaneous Mathematical Symbols-A) $(TD Vedic Extensions)) ++ $(TR $(TD Emoticons) $(TD Miscellaneous Mathematical Symbols-B) $(TD Vertical Forms)) ++ $(TR $(TD Enclosed Alphanumerics) $(TD Miscellaneous Symbols) $(TD Yijing Hexagram Symbols)) ++ $(TR $(TD Enclosed Alphanumeric Supplement) $(TD Miscellaneous Symbols and Arrows) $(TD Yi Radicals)) ++ $(TR $(TD Enclosed CJK Letters and Months) $(TD Miscellaneous Symbols And Pictographs) $(TD Yi Syllables)) ++ $(TR $(TD Enclosed Ideographic Supplement) $(TD Miscellaneous Technical) ) ++ $(TR $(TD Ethiopic) $(TD Modifier Tone Letters) ) ++ ) ++ ++ $(P Bellow is the table with script names accepted by $(LREF unicode.script) ++ and by the shorthand version $(LREF unicode):) ++ $(BOOKTABLE $(B Scripts), ++ $(TR $(TD Arabic) $(TD Hanunoo) $(TD Old_Italic)) ++ $(TR $(TD Armenian) $(TD Hebrew) $(TD Old_Persian)) ++ $(TR $(TD Avestan) $(TD Hiragana) $(TD Old_South_Arabian)) ++ $(TR $(TD Balinese) $(TD Imperial_Aramaic) $(TD Old_Turkic)) ++ $(TR $(TD Bamum) $(TD Inherited) $(TD Oriya)) ++ $(TR $(TD Batak) $(TD Inscriptional_Pahlavi) $(TD Osmanya)) ++ $(TR $(TD Bengali) $(TD Inscriptional_Parthian) $(TD Phags_Pa)) ++ $(TR $(TD Bopomofo) $(TD Javanese) $(TD Phoenician)) ++ $(TR $(TD Brahmi) $(TD Kaithi) $(TD Rejang)) ++ $(TR $(TD Braille) $(TD Kannada) $(TD Runic)) ++ $(TR $(TD Buginese) $(TD Katakana) $(TD Samaritan)) ++ $(TR $(TD Buhid) $(TD Kayah_Li) $(TD Saurashtra)) ++ $(TR $(TD Canadian_Aboriginal) $(TD Kharoshthi) $(TD Sharada)) ++ $(TR $(TD Carian) $(TD Khmer) $(TD Shavian)) ++ $(TR $(TD Chakma) $(TD Lao) $(TD Sinhala)) ++ $(TR $(TD Cham) $(TD Latin) $(TD Sora_Sompeng)) ++ $(TR $(TD Cherokee) $(TD Lepcha) $(TD Sundanese)) ++ $(TR $(TD Common) $(TD Limbu) $(TD Syloti_Nagri)) ++ $(TR $(TD Coptic) $(TD Linear_B) $(TD Syriac)) ++ $(TR $(TD Cuneiform) $(TD Lisu) $(TD Tagalog)) ++ $(TR $(TD Cypriot) $(TD Lycian) $(TD Tagbanwa)) ++ $(TR $(TD Cyrillic) $(TD Lydian) $(TD Tai_Le)) ++ $(TR $(TD Deseret) $(TD Malayalam) $(TD Tai_Tham)) ++ $(TR $(TD Devanagari) $(TD Mandaic) $(TD Tai_Viet)) ++ $(TR $(TD Egyptian_Hieroglyphs) $(TD Meetei_Mayek) $(TD Takri)) ++ $(TR $(TD Ethiopic) $(TD Meroitic_Cursive) $(TD Tamil)) ++ $(TR $(TD Georgian) $(TD Meroitic_Hieroglyphs) $(TD Telugu)) ++ $(TR $(TD Glagolitic) $(TD Miao) $(TD Thaana)) ++ $(TR $(TD Gothic) $(TD Mongolian) $(TD Thai)) ++ $(TR $(TD Greek) $(TD Myanmar) $(TD Tibetan)) ++ $(TR $(TD Gujarati) $(TD New_Tai_Lue) $(TD Tifinagh)) ++ $(TR $(TD Gurmukhi) $(TD Nko) $(TD Ugaritic)) ++ $(TR $(TD Han) $(TD Ogham) $(TD Vai)) ++ $(TR $(TD Hangul) $(TD Ol_Chiki) $(TD Yi)) ++ ) ++ ++ $(P Bellow is the table of names accepted by $(LREF unicode.hangulSyllableType).) ++ $(BOOKTABLE $(B Hangul syllable type), ++ $(TR $(TH Abb.) $(TH Long form)) ++ $(TR $(TD L) $(TD Leading_Jamo)) ++ $(TR $(TD LV) $(TD LV_Syllable)) ++ $(TR $(TD LVT) $(TD LVT_Syllable) ) ++ $(TR $(TD T) $(TD Trailing_Jamo)) ++ $(TR $(TD V) $(TD Vowel_Jamo)) ++ ) + References: + $(WEB www.digitalmars.com/d/ascii-table.html, ASCII Table), + $(WEB en.wikipedia.org/wiki/Unicode, Wikipedia), +- $(WEB www.unicode.org, The Unicode Consortium) ++ $(WEB www.unicode.org, The Unicode Consortium), ++ $(WEB www.unicode.org/reports/tr15/, Unicode normalization forms), ++ $(WEB www.unicode.org/reports/tr29/, Unicode text segmentation) ++ $(WEB www.unicode.org/uni2book/ch05.pdf, ++ Unicode Implementation Guidelines) ++ $(WEB www.unicode.org/uni2book/ch03.pdf, ++ Unicode Conformance) ++ Trademarks: ++ Unicode(tm) is a trademark of Unicode, Inc. ++ ++ Macros: ++ WIKI=Phobos/StdUni ++ ++ Copyright: Copyright 2013 - ++ License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). ++ Authors: Dmitry Olshansky ++ Source: $(PHOBOSSRC std/_uni.d) ++ Standards: $(WEB www.unicode.org/versions/Unicode6.2.0/, Unicode v6.2) ++ ++Macros: ++ ++SECTION =

$0

++DEF = ++S_LINK = $+ ++CODEPOINT = $(S_LINK Code point, code point) ++CODEPOINTS = $(S_LINK Code point, code points) ++CHARACTER = $(S_LINK Character, character) ++CHARACTERS = $(S_LINK Character, characters) ++CLUSTER = $(S_LINK Grapheme cluster, grapheme cluster) +++/ ++module std.uni; ++ ++static import std.ascii; ++import std.traits, std.range, std.algorithm, std.conv, ++ std.typetuple, std.exception, core.stdc.stdlib; ++import std.array; //@@BUG UFCS doesn't work with 'local' imports ++import core.bitop; ++ ++version(unittest) import std.typecons; ++ ++// debug = std_uni; ++ ++debug(std_uni) import std.stdio; ++ ++private: ++ ++version(std_uni_bootstrap){} ++else ++{ ++ import std.internal.unicode_tables; // generated file ++} ++ ++void copyBackwards(T)(T[] src, T[] dest) ++{ ++ assert(src.length == dest.length); ++ for(size_t i=src.length; i-- > 0; ) ++ dest[i] = src[i]; ++} ++ ++void copyForward(T)(T[] src, T[] dest) ++{ ++ assert(src.length == dest.length); ++ for(size_t i=0; i 45); // 46 items in Unicode 6.1, even more in 6.2 ++ // testing presence of a code point in a set ++ // is just fine, it is O(logN) ++ assert(!b['$']); ++ assert(!b['\u058F']); // Armenian dram sign ++ assert(b['¥']); ++ ++ // building fast lookup tables, these guarantee O(1) complexity ++ // 1-level Trie lookup table essentially a huge bit-set ~262Kb ++ auto oneTrie = toTrie!1(b); ++ // 2-level far more compact but typically slightly slower ++ auto twoTrie = toTrie!2(b); ++ // 3-level even smaller, and a bit slower yet ++ auto threeTrie = toTrie!3(b); ++ assert(oneTrie['£']); ++ assert(twoTrie['£']); ++ assert(threeTrie['£']); ++ ++ // build the trie with the most sensible trie level ++ // and bind it as a functor ++ auto cyrilicOrArmenian = toDelegate(set); ++ auto balance = find!(cyrilicOrArmenian)("Hello ընկեր!"); ++ assert(balance == "ընկեր!"); ++ // compatible with bool delegate(dchar) ++ bool delegate(dchar) bindIt = cyrilicOrArmenian; ++ ++ // Normalization ++ string s = "Plain ascii (and not only), is always normalized!"; ++ assert(s is normalize(s));// is the same string ++ ++ string nonS = "A\u0308ffin"; // A ligature ++ auto nS = normalize(nonS); // to NFC, the W3C endorsed standard ++ assert(nS == "Äffin"); ++ assert(nS != nonS); ++ string composed = "Äffin"; ++ ++ assert(normalize!NFD(composed) == "A\u0308ffin"); ++ // to NFKD, compatibility decomposition useful for fuzzy matching/searching ++ assert(normalize!NFKD("2¹⁰") == "210"); ++} ++ ++enum lastDchar = 0x10FFFF; ++ ++auto force(T, F)(F from) ++ if(isIntegral!T && !is(T == F)) ++{ ++ assert(from <= T.max && from >= T.min); ++ return cast(T)from; ++} ++ ++auto force(T, F)(F from) ++ if(isBitPacked!T && !is(T == F)) ++{ ++ assert(from <= 2^^bitSizeOf!T-1); ++ return T(cast(TypeOfBitPacked!T)from); ++} ++ ++auto force(T, F)(F from) ++ if(is(T == F)) ++{ ++ return from; ++} ++ ++// cheap algorithm grease ;) ++auto adaptIntRange(T, F)(F[] src) ++{ ++ //@@@BUG when in the 9 hells will map be copyable again?! ++ static struct ConvertIntegers ++ { ++ private F[] data; ++ ++ @property T front() ++ { ++ return force!T(data.front); ++ } ++ ++ void popFront(){ data.popFront(); } ++ ++ @property bool empty()const { return data.empty; } ++ ++ @property size_t length()const { return data.length; } ++ ++ auto opSlice(size_t s, size_t e) ++ { ++ return ConvertIntegers(data[s..e]); ++ } ++ ++ @property size_t opDollar(){ return data.length; } ++ } ++ return ConvertIntegers(src); ++} ++ ++// repeat X times the bit-pattern in val assuming it's length is 'bits' ++size_t replicateBits(size_t times, size_t bits)(size_t val) ++{ ++ static if(times == 1) ++ return val; ++ else static if(times % 2) ++ return (replicateBits!(times-1, bits)(val)<= 1) ++ offsets[i] = offsets[i-1] + ++ spaceFor!(bitSizeOf!(Types[i-1]))(sizes[i-1]); ++ } ++ ++ storage = new size_t[full_size]; ++ } ++ ++ this(const(size_t)[] raw_offsets, ++ const(size_t)[] raw_sizes, const(size_t)[] data)const ++ { ++ offsets[] = raw_offsets[]; ++ sz[] = raw_sizes[]; ++ storage = data; ++ } ++ ++ @property auto slice(size_t n)()inout pure nothrow ++ { ++ auto ptr = raw_ptr!n; ++ return packedArrayView!(Types[n])(ptr, sz[n]); ++ } ++ ++ @property auto ptr(size_t n)()inout pure nothrow ++ { ++ auto ptr = raw_ptr!n; ++ return inout(PackedPtr!(Types[n]))(ptr); ++ } ++ ++ template length(size_t n) ++ { ++ @property size_t length()const{ return sz[n]; } ++ ++ @property void length(size_t new_size) ++ { ++ if(new_size > sz[n]) ++ {// extend ++ size_t delta = (new_size - sz[n]); ++ sz[n] += delta; ++ delta = spaceFor!(bitSizeOf!(Types[n]))(delta); ++ storage.length += delta;// extend space at end ++ // raw_slice!x must follow resize as it could be moved! ++ // next stmts move all data past this array, last-one-goes-first ++ static if(n != dim-1) ++ { ++ auto start = raw_ptr!(n+1); ++ // len includes delta ++ size_t len = (storage.ptr+storage.length-start); ++ ++ copyBackwards(start[0..len-delta], start[delta..len]); ++ ++ start[0..delta] = 0; ++ // offsets are used for raw_slice, ptr etc. ++ foreach(i; n+1..dim) ++ offsets[i] += delta; ++ } ++ } ++ else if(new_size < sz[n]) ++ {// shrink ++ size_t delta = (sz[n] - new_size); ++ sz[n] -= delta; ++ delta = spaceFor!(bitSizeOf!(Types[n]))(delta); ++ // move all data past this array, forward direction ++ static if(n != dim-1) ++ { ++ auto start = raw_ptr!(n+1); ++ size_t len = storage.length; ++ copyForward(start[0..len-delta], start[delta..len]); ++ ++ // adjust offsets last, they affect raw_slice ++ foreach(i; n+1..dim) ++ offsets[i] -= delta; ++ } ++ storage.length -= delta; ++ } ++ // else - NOP ++ } ++ } ++ ++ @property size_t bytes(size_t n=size_t.max)() const ++ { ++ static if(n == size_t.max) ++ return storage.length*size_t.sizeof; ++ else static if(n != Types.length-1) ++ return (raw_ptr!(n+1)-raw_ptr!n)*size_t.sizeof; ++ else ++ return (storage.ptr+storage.length - raw_ptr!n)*size_t.sizeof; ++ } ++ ++ void store(OutRange)(scope OutRange sink) const ++ if(isOutputRange!(OutRange, char)) ++ { ++ formattedWrite(sink, "[%( 0x%x, %)]", offsets[]); ++ formattedWrite(sink, ", [%( 0x%x, %)]", sz[]); ++ formattedWrite(sink, ", [%( 0x%x, %)]", storage); ++ } ++ ++private: ++ @property auto raw_ptr(size_t n)()inout ++ { ++ static if(n == 0) ++ return storage.ptr; ++ else ++ { ++ return storage.ptr+offsets[n]; ++ } ++ } ++ enum dim = Types.length; ++ size_t[dim] offsets;// offset for level x ++ size_t[dim] sz;// size of level x ++ alias staticMap!(bitSizeOf, Types) bitWidth; ++ size_t[] storage; ++} ++ ++unittest ++{ ++ // sizes are: ++ // lvl0: 3, lvl1 : 2, lvl2: 1 ++ auto m = MultiArray!(int, ubyte, int)(3,2,1); ++ ++ static void check(size_t k, T)(ref T m, int n) ++ { ++ foreach(i; 0..n) ++ assert(m.slice!(k)[i] == i+1, text("level:",i," : ",m.slice!(k)[0..n])); ++ } ++ ++ static void checkB(size_t k, T)(ref T m, int n) ++ { ++ foreach(i; 0..n) ++ assert(m.slice!(k)[i] == n-i, text("level:",i," : ",m.slice!(k)[0..n])); ++ } ++ ++ static void fill(size_t k, T)(ref T m, int n) ++ { ++ foreach(i; 0..n) ++ m.slice!(k)[i] = force!ubyte(i+1); ++ } ++ ++ static void fillB(size_t k, T)(ref T m, int n) ++ { ++ foreach(i; 0..n) ++ m.slice!(k)[i] = force!ubyte(n-i); ++ } ++ ++ m.length!1 = 100; ++ fill!1(m, 100); ++ check!1(m, 100); ++ ++ m.length!0 = 220; ++ fill!0(m, 220); ++ check!1(m, 100); ++ check!0(m, 220); ++ ++ m.length!2 = 17; ++ fillB!2(m, 17); ++ checkB!2(m, 17); ++ check!0(m, 220); ++ check!1(m, 100); ++ ++ m.length!2 = 33; ++ checkB!2(m, 17); ++ fillB!2(m, 33); ++ checkB!2(m, 33); ++ check!0(m, 220); ++ check!1(m, 100); ++ ++ m.length!1 = 195; ++ fillB!1(m, 195); ++ checkB!1(m, 195); ++ checkB!2(m, 33); ++ check!0(m, 220); ++ ++ auto marr = MultiArray!(BitPacked!(uint, 4), BitPacked!(uint, 6))(20, 10); ++ marr.length!0 = 15; ++ marr.length!1 = 30; ++ fill!1(marr, 30); ++ fill!0(marr, 15); ++ check!1(marr, 30); ++ check!0(marr, 15); ++} ++ ++unittest ++{// more bitpacking tests ++ alias MultiArray!(BitPacked!(size_t, 3) ++ , BitPacked!(size_t, 4) ++ , BitPacked!(size_t, 3) ++ , BitPacked!(size_t, 6) ++ , bool) Bitty; ++ alias sliceBits!(13, 16) fn1; ++ alias sliceBits!( 9, 13) fn2; ++ alias sliceBits!( 6, 9) fn3; ++ alias sliceBits!( 0, 6) fn4; ++ static void check(size_t lvl, MA)(ref MA arr){ ++ for(size_t i = 0; i< arr.length!lvl; i++) ++ assert(arr.slice!(lvl)[i] == i, text("Mismatch on lvl ", lvl, " idx ", i, " value: ", arr.slice!(lvl)[i])); ++ } ++ ++ static void fillIdx(size_t lvl, MA)(ref MA arr){ ++ for(size_t i = 0; i< arr.length!lvl; i++) ++ arr.slice!(lvl)[i] = i; ++ } ++ Bitty m1; ++ ++ m1.length!4 = 10; ++ m1.length!3 = 2^^6; ++ m1.length!2 = 2^^3; ++ m1.length!1 = 2^^4; ++ m1.length!0 = 2^^3; ++ ++ m1.length!4 = 2^^16; ++ ++ for(size_t i = 0; i< m1.length!4; i++) ++ m1.slice!(4)[i] = i % 2; ++ ++ fillIdx!1(m1); ++ check!1(m1); ++ fillIdx!2(m1); ++ check!2(m1); ++ fillIdx!3(m1); ++ check!3(m1); ++ fillIdx!0(m1); ++ check!0(m1); ++ check!3(m1); ++ check!2(m1); ++ check!1(m1); ++ for(size_t i=0; i < 2^^16; i++) ++ { ++ m1.slice!(4)[i] = i % 2; ++ m1.slice!(0)[fn1(i)] = fn1(i); ++ m1.slice!(1)[fn2(i)] = fn2(i); ++ m1.slice!(2)[fn3(i)] = fn3(i); ++ m1.slice!(3)[fn4(i)] = fn4(i); ++ } ++ for(size_t i=0; i < 2^^16; i++) ++ { ++ assert(m1.slice!(4)[i] == i % 2); ++ assert(m1.slice!(0)[fn1(i)] == fn1(i)); ++ assert(m1.slice!(1)[fn2(i)] == fn2(i)); ++ assert(m1.slice!(2)[fn3(i)] == fn3(i)); ++ assert(m1.slice!(3)[fn4(i)] == fn4(i)); ++ } ++} ++ ++size_t spaceFor(size_t _bits)(size_t new_len) pure nothrow ++{ ++ enum bits = _bits == 1 ? 1 : ceilPowerOf2(_bits);// see PackedArrayView ++ static if(bits > 8*size_t.sizeof) ++ { ++ static assert(bits % (size_t.sizeof*8) == 0); ++ return new_len * bits/(8*size_t.sizeof); ++ } ++ else ++ { ++ enum factor = size_t.sizeof*8/bits; ++ return (new_len+factor-1)/factor; // rounded up ++ } ++} ++ ++template isBitPackableType(T) ++{ ++ enum isBitPackableType = isBitPacked!T ++ || isIntegral!T || is(T == bool) || isSomeChar!T; ++} ++ ++//============================================================================ ++template PackedArrayView(T) ++ if((is(T dummy == BitPacked!(U, sz), U, size_t sz) ++ && isBitPackableType!U) || isBitPackableType!T) ++{ ++ private enum bits = bitSizeOf!T; ++ alias PackedArrayView = PackedArrayViewImpl!(T, bits > 1 ? ceilPowerOf2(bits) : 1); ++} ++ ++//unsafe and fast access to a chunk of RAM as if it contains packed values ++template PackedPtr(T) ++ if((is(T dummy == BitPacked!(U, sz), U, size_t sz) ++ && isBitPackableType!U) || isBitPackableType!T) ++{ ++ private enum bits = bitSizeOf!T; ++ alias PackedPtr = PackedPtrImpl!(T, bits > 1 ? ceilPowerOf2(bits) : 1); ++} ++ ++@trusted struct PackedPtrImpl(T, size_t bits) ++{ ++pure nothrow: ++ static assert(isPowerOf2(bits)); ++ ++ this(inout(size_t)* ptr)inout ++ { ++ origin = ptr; ++ } ++ ++ private T simpleIndex(size_t n) inout ++ { ++ static if(factor == bytesPerWord*8) ++ { ++ // a re-write with less data dependency ++ auto q = n / factor; ++ auto r = n % factor; ++ return cast(T)(origin[q] & (mask<> bits*r) & mask); ++ } ++ } ++ ++ static if(factor == bytesPerWord// can safely pack by byte ++ || factor == 1 // a whole word at a time ++ || ((factor == bytesPerWord/2 || factor == bytesPerWord/4) ++ && hasUnalignedReads)) // this needs unaligned reads ++ { ++ static if(factor == bytesPerWord) ++ alias U = ubyte; ++ else static if(factor == bytesPerWord/2) ++ alias U = ushort; ++ else static if(factor == bytesPerWord/4) ++ alias U = uint; ++ else static if(size_t.sizeof == 8 && factor == bytesPerWord/8) ++ alias U = ulong; ++ ++ T opIndex(size_t idx) inout ++ { ++ return __ctfe ? simpleIndex(idx) : ++ cast(inout(T))(cast(U*)origin)[idx]; ++ } ++ ++ static if(isBitPacked!T) // lack of user-defined implicit conversion ++ { ++ void opIndexAssign(T val, size_t idx) ++ { ++ return opIndexAssign(cast(TypeOfBitPacked!T)val, idx); ++ } ++ } ++ ++ void opIndexAssign(TypeOfBitPacked!T val, size_t idx) ++ { ++ (cast(U*)origin)[idx] = cast(U)val; ++ } ++ } ++ else ++ { ++ T opIndex(size_t n) inout ++ { ++ return simpleIndex(n); ++ } ++ ++ static if(isBitPacked!T) // lack of user-defined implicit conversion ++ { ++ void opIndexAssign(T val, size_t idx) ++ { ++ return opIndexAssign(cast(TypeOfBitPacked!T)val, idx); ++ } ++ } ++ ++ void opIndexAssign(TypeOfBitPacked!T val, size_t n) ++ in ++ { ++ static if(isIntegral!T) ++ assert(val <= mask); ++ } ++ body ++ { ++ auto q = n / factor; ++ auto r = n % factor; ++ size_t tgt_shift = bits*r; ++ size_t word = origin[q]; ++ origin[q] = (word & ~(mask<= end) //rounded up >= then end of slice ++ { ++ //nothing to gain, use per element assignment ++ foreach(i; start..end) ++ ptr[i] = val; ++ return; ++ } ++ size_t pad_end = end/factor*factor; // rounded down ++ size_t i; ++ for(i=start; i= max) ++ { ++ if(pred(range[idx+m], needle)) ++ idx += m; ++ m /= 2; ++ } ++ mixin(genUnrolledSwitchSearch(max)); ++ return idx; ++} ++ ++// ++size_t floorPowerOf2(size_t arg) @safe pure nothrow ++{ ++ assert(arg > 1); // else bsr is undefined ++ return 1< 1); // else bsr is undefined ++ return 1< delta) ++ {// replace increases length ++ delta = stuff.length - delta;// now, new is > old by delta ++ static if(is(Policy == void)) ++ dest.length = dest.length+delta;//@@@BUG lame @property ++ else ++ dest = Policy.realloc(dest, dest.length+delta); ++ auto rem = copy(retro(dest[to..dest.length-delta]) ++ , retro(dest[to+delta..dest.length])); ++ assert(rem.empty); ++ copy(stuff, dest[from..stuff_end]); ++ } ++ else if(stuff.length == delta) ++ { ++ copy(stuff, dest[from..to]); ++ } ++ else ++ {// replace decreases length by delta ++ delta = delta - stuff.length; ++ copy(stuff, dest[from..stuff_end]); ++ auto rem = copy(dest[to..dest.length] ++ , dest[stuff_end..dest.length-delta]); ++ static if(is(Policy == void)) ++ dest.length = dest.length - delta;//@@@BUG lame @property ++ else ++ dest = Policy.realloc(dest, dest.length-delta); ++ assert(rem.empty); ++ } ++ return stuff_end; ++} ++ ++ ++// Simple storage manipulation policy ++@trusted public struct GcPolicy ++{ ++ static T[] dup(T)(const T[] arr) ++ { ++ return arr.dup; ++ } ++ ++ static T[] alloc(T)(size_t size) ++ { ++ return new T[size]; ++ } ++ ++ static T[] realloc(T)(T[] arr, size_t sz) ++ { ++ arr.length = sz; ++ return arr; ++ } ++ ++ static void replaceImpl(T, Range)(ref T[] dest, size_t from, size_t to, Range stuff) ++ { ++ replaceInPlace(dest, from, to, stuff); ++ } ++ ++ static void append(T, V)(ref T[] arr, V value) ++ if(!isInputRange!V) ++ { ++ arr ~= force!T(value); ++ } ++ ++ static void append(T, V)(ref T[] arr, V value) ++ if(isInputRange!V) ++ { ++ insertInPlace(arr, arr.length, value); ++ } ++ ++ static void destroy(T)(ref T arr) ++ if(isDynamicArray!T && is(Unqual!T == T)) ++ { ++ debug ++ { ++ arr[] = cast(typeof(T.init[0]))(0xdead_beef); ++ } ++ arr = null; ++ } ++ ++ static void destroy(T)(ref T arr) ++ if(isDynamicArray!T && !is(Unqual!T == T)) ++ { ++ arr = null; ++ } ++} ++ ++// ditto ++@trusted struct ReallocPolicy ++{ ++ static T[] dup(T)(const T[] arr) ++ { ++ auto result = alloc!T(arr.length); ++ result[] = arr[]; ++ return result; ++ } ++ ++ static T[] alloc(T)(size_t size) ++ { ++ auto ptr = cast(T*)enforce(malloc(T.sizeof*size), "out of memory on C heap"); ++ return ptr[0..size]; ++ } ++ ++ static T[] realloc(T)(T[] arr, size_t size) ++ { ++ if(!size) ++ { ++ destroy(arr); ++ return null; ++ } ++ auto ptr = cast(T*)enforce(core.stdc.stdlib.realloc( ++ arr.ptr, T.sizeof*size), "out of memory on C heap"); ++ return ptr[0..size]; ++ } ++ ++ static void replaceImpl(T, Range)(ref T[] dest, size_t from, size_t to, Range stuff) ++ { ++ genericReplace!(ReallocPolicy)(dest, from, to, stuff); ++ } ++ ++ static void append(T, V)(ref T[] arr, V value) ++ if(!isInputRange!V) ++ { ++ arr = realloc(arr, arr.length+1); ++ arr[$-1] = force!T(value); ++ } ++ ++ static void append(T, V)(ref T[] arr, V value) ++ if(isInputRange!V && hasLength!V) ++ { ++ arr = realloc(arr, arr.length+value.length); ++ copy(value, arr[$-value.length..$]); ++ } ++ ++ static void destroy(T)(ref T[] arr) ++ { ++ if(arr.ptr) ++ free(arr.ptr); ++ arr = null; ++ } ++} ++ ++//build hack ++alias Uint24Array!ReallocPolicy _RealArray; ++ ++unittest ++{ ++ with(ReallocPolicy) ++ { ++ bool test(T, U, V)(T orig, size_t from, size_t to, U toReplace, V result, ++ string file = __FILE__, size_t line = __LINE__) ++ { ++ { ++ replaceImpl(orig, from, to, toReplace); ++ scope(exit) destroy(orig); ++ if(!equalS(orig, result)) ++ return false; ++ } ++ return true; ++ } ++ static T[] arr(T)(T[] args... ) ++ { ++ return dup(args); ++ } ++ ++ assert(test(arr([1, 2, 3, 4]), 0, 0, [5, 6, 7], [5, 6, 7, 1, 2, 3, 4])); ++ assert(test(arr([1, 2, 3, 4]), 0, 2, cast(int[])[], [3, 4])); ++ assert(test(arr([1, 2, 3, 4]), 0, 4, [5, 6, 7], [5, 6, 7])); ++ assert(test(arr([1, 2, 3, 4]), 0, 2, [5, 6, 7], [5, 6, 7, 3, 4])); ++ assert(test(arr([1, 2, 3, 4]), 2, 3, [5, 6, 7], [1, 2, 5, 6, 7, 4])); ++ } ++} ++ ++/** ++ Tests if T is some kind a set of code points. Intended for template constraints. ++*/ ++public template isCodepointSet(T) ++{ ++ static if(is(T dummy == InversionList!(Args), Args...)) ++ enum isCodepointSet = true; ++ else ++ enum isCodepointSet = false; ++} ++ ++/** ++ Tests if $(D T) is a pair of integers that implicitly convert to $(D V). ++ The following code must compile for any pair $(D T): ++ --- ++ (T x){ V a = x[0]; V b = x[1];} ++ --- ++ The following must not compile: ++ --- ++ (T x){ V c = x[2];} ++ --- ++*/ ++public template isIntegralPair(T, V=uint) ++{ ++ enum isIntegralPair = is(typeof((T x){ V a = x[0]; V b = x[1];})) ++ && !is(typeof((T x){ V c = x[2]; })); ++} ++ ++ ++/** ++ The recommended default type for set of $(CODEPOINTS). ++ For details, see the current implementation: $(LREF InversionList). ++*/ ++public alias InversionList!GcPolicy CodepointSet; ++ ++ ++//@@@BUG: std.typecons tuples depend on std.format to produce fields mixin ++// which relies on std.uni.isGraphical and this chain blows up with Forward reference error ++// hence below doesn't seem to work ++// public alias Tuple!(uint, "a", uint, "b") CodepointInterval; ++ ++/** ++ The recommended type of $(XREF _typecons, Tuple) ++ to represent [a, b$(RPAREN) intervals of $(CODEPOINTS). As used in $(LREF InversionList). ++ Any interval type should pass $(LREF isIntegralPair) trait. ++*/ ++public struct CodepointInterval ++{ ++ uint[2] _tuple; ++ alias _tuple this; ++ this(uint low, uint high) ++ { ++ _tuple[0] = low; ++ _tuple[1] = high; ++ } ++ bool opEquals(T)(T val) const ++ { ++ return this[0] == val[0] && this[1] == val[1]; ++ } ++ @property ref uint a(){ return _tuple[0]; } ++ @property ref uint b(){ return _tuple[1]; } ++} ++ ++//@@@BUG another forward reference workaround ++@trusted bool equalS(R1, R2)(R1 lhs, R2 rhs) ++{ ++ for(;;){ ++ if(lhs.empty) ++ return rhs.empty; ++ if(rhs.empty) ++ return false; ++ if(lhs.front != rhs.front) ++ return false; ++ lhs.popFront(); ++ rhs.popFront(); ++ } ++} ++ ++/** ++ $(P ++ $(D InversionList) is a set of $(CODEPOINTS) ++ represented as an array of open-right [a, b$(RPAREN) ++ intervals (see $(LREF CodepointInterval) above). ++ The name comes from the way the representation reads left to right. ++ For instance a set of all values [10, 50$(RPAREN), [80, 90$(RPAREN), ++ plus a singular value 60 looks like this: ++ ) ++ --- ++ 10, 50, 60, 61, 80, 90 ++ --- ++ $(P ++ The way to read this is: start with negative meaning that all numbers ++ smaller then the next one are not present in this set (and positive ++ - the contrary). Then switch positive/negative after each ++ number passed from left to right. ++ ) ++ $(P This way negative spans until 10, then positive until 50, ++ then negative until 60, then positive until 61, and so on. ++ As seen this provides a space-efficient storage of highly redundant data ++ that comes in long runs. A description which Unicode $(CHARACTER) ++ properties fit nicely. The technique itself could be seen as a variation ++ on $(LUCKY RLE encoding). ++ ) ++ ++ $(P Sets are value types (just like $(D int) is) thus they ++ are never aliased. ++ ) ++ Example: ++ --- ++ auto a = CodepointSet('a', 'z'+1); ++ auto b = CodepointSet('A', 'Z'+1); ++ auto c = a; ++ a = a | b; ++ assert(a == CodepointSet('A', 'Z'+1, 'a', 'z'+1)); ++ assert(a != c); ++ --- ++ $(P See also $(LREF unicode) for simpler construction of sets ++ from predefined ones. ++ ) ++ ++ $(P Memory usage is 6 bytes per each contiguous interval in a set. ++ The value semantics are achieved by using the ++ ($WEB http://en.wikipedia.org/wiki/Copy-on-write, COW) technique ++ and thus it's $(RED not) safe to cast this type to $(D_KEYWORD shared). ++ ) ++ ++ Note: ++ $(P It's not recommended to rely on the template parameters ++ or the exact type of a current $(CODEPOINT) set in $(D std.uni). ++ The type and parameters may change when the standard ++ allocators design is finalized. ++ Use $(LREF isCodepointSet) with templates or just stick with the default ++ alias $(LREF CodepointSet) throughout the whole code base. ++ ) ++*/ ++@trusted public struct InversionList(SP=GcPolicy) ++{ ++public: ++ /** ++ Construct from another code point set of any type. ++ */ ++ this(Set)(Set set) ++ if(isCodepointSet!Set) ++ { ++ uint[] arr; ++ foreach(v; set.byInterval) ++ { ++ arr ~= v.a; ++ arr ~= v.b; ++ } ++ data = Uint24Array!(SP)(arr); ++ } ++ ++ /** ++ Construct a set from a range of sorted code point intervals. ++ */ ++ this(Range)(Range intervals) ++ if(isForwardRange!Range && isIntegralPair!(ElementType!Range)) ++ { ++ auto flattened = roundRobin(intervals.save.map!"a[0]"(), ++ intervals.save.map!"a[1]"()); ++ data = Uint24Array!(SP)(flattened); ++ } ++ ++ /** ++ Construct a set from plain values of sorted code point intervals. ++ Example: ++ --- ++ auto set = CodepointSet('a', 'z'+1, 'а', 'я'+1); ++ foreach(v; 'a'..'z'+1) ++ assert(set[v]); ++ // Cyrillic lowercase interval ++ foreach(v; 'а'..'я'+1) ++ assert(set[v]); ++ --- ++ */ ++ this()(uint[] intervals...) ++ in ++ { ++ assert(intervals.length % 2 == 0, "Odd number of interval bounds [a, b)!"); ++ for(uint i=1; i a<=b)(data[]).lowerBound(val).length & 1; ++ return sharSwitchLowerBound!"a<=b"(data[], val) & 1; ++ } ++ ++ /// Number of $(CODEPOINTS) in this set ++ @property size_t length() ++ { ++ size_t sum = 0; ++ foreach(iv; byInterval) ++ { ++ sum += iv.b - iv.a; ++ } ++ return sum; ++ } ++ ++// bootstrap full set operations from 4 primitives (suitable as a template mixin): ++// addInterval, skipUpTo, dropUpTo & byInterval iteration ++//============================================================================ ++public: ++ /** ++ $(P Sets support natural syntax for set algebra, namely: ) ++ $(BOOKTABLE , ++ $(TR $(TH Operator) $(TH Math notation) $(TH Description) ) ++ $(TR $(TD &) $(TD a ∩ b) $(TD intersection) ) ++ $(TR $(TD |) $(TD a ∪ b) $(TD union) ) ++ $(TR $(TD -) $(TD a ∖ b) $(TD subtraction) ) ++ $(TR $(TD ~) $(TD a ~ b) $(TD symmetric set difference i.e. (a ∪ b) \ (a ∩ b)) ) ++ ) ++ ++ Example: ++ --- ++ auto lower = unicode.LowerCase; ++ auto upper = unicode.UpperCase; ++ auto ascii = unicode.ASCII; ++ ++ assert((lower & upper).empty); // no intersection ++ auto lowerASCII = lower & ascii; ++ assert(lowerASCII.byCodepoint.equal(iota('a', 'z'+1))); ++ // throw away all of the lowercase ASCII ++ assert((ascii - lower).length == 128 - 26); ++ ++ auto onlyOneOf = lower ~ ascii; ++ assert(!onlyOneOf['Δ']); // not ASCII and not lowercase ++ assert(onlyOneOf['$']); // ASCII and not lowercase ++ assert(!onlyOneOf['a']); // ASCII and lowercase ++ assert(onlyOneOf['я']); // not ASCII but lowercase ++ ++ // throw away all cased letters from ASCII ++ auto noLetters = ascii - (lower | upper); ++ assert(noLetters.length == 128 - 26*2); ++ --- ++ */ ++ This opBinary(string op, U)(U rhs) ++ if(isCodepointSet!U || is(U:dchar)) ++ { ++ static if(op == "&" || op == "|" || op == "~") ++ {// symmetric ops thus can swap arguments to reuse r-value ++ static if(is(U:dchar)) ++ { ++ auto tmp = this; ++ mixin("tmp "~op~"= rhs; "); ++ return tmp; ++ } ++ else ++ { ++ static if(is(Unqual!U == U)) ++ { ++ // try hard to reuse r-value ++ mixin("rhs "~op~"= this;"); ++ return rhs; ++ } ++ else ++ { ++ auto tmp = this; ++ mixin("tmp "~op~"= rhs;"); ++ return tmp; ++ } ++ } ++ } ++ else static if(op == "-") // anti-symmetric ++ { ++ auto tmp = this; ++ tmp -= rhs; ++ return tmp; ++ } ++ else ++ static assert(0, "no operator "~op~" defined for Set"); ++ } ++ ++ /// The 'op=' versions of the above overloaded operators. ++ ref This opOpAssign(string op, U)(U rhs) ++ if(isCodepointSet!U || is(U:dchar)) ++ { ++ static if(op == "|") // union ++ { ++ static if(is(U:dchar)) ++ { ++ this.addInterval(rhs, rhs+1); ++ return this; ++ } ++ else ++ return this.add(rhs); ++ } ++ else static if(op == "&") // intersection ++ return this.intersect(rhs);// overloaded ++ else static if(op == "-") // set difference ++ return this.sub(rhs);// overloaded ++ else static if(op == "~") // symmetric set difference ++ { ++ auto copy = this & rhs; ++ this |= rhs; ++ this -= copy; ++ return this; ++ } ++ else ++ static assert(0, "no operator "~op~" defined for Set"); ++ } ++ ++ /** ++ Tests the presence of codepoint $(D ch) in this set, ++ the same as $(LREF opIndex). ++ */ ++ bool opBinaryRight(string op: "in", U)(U ch) ++ if(is(U : dchar)) ++ { ++ return this[ch]; ++ } ++ ++ /// Obtains a set that is the inversion of this set. See also $(LREF inverted). ++ auto opUnary(string op: "!")() ++ { ++ return this.inverted; ++ } ++ ++ /** ++ A range that spans each $(CODEPOINT) in this set. ++ ++ Example: ++ --- ++ import std.algorithm; ++ auto set = unicode.ASCII; ++ set.byCodepoint.equal(iota(0, 0x80)); ++ --- ++ */ ++ @property auto byCodepoint() ++ { ++ @trusted static struct CodepointRange ++ { ++ this(This set) ++ { ++ r = set.byInterval; ++ if(!r.empty) ++ cur = r.front.a; ++ } ++ ++ @property dchar front() const ++ { ++ return cast(dchar)cur; ++ } ++ ++ @property bool empty() const ++ { ++ return r.empty; ++ } ++ ++ void popFront() ++ { ++ cur++; ++ while(cur >= r.front.b) ++ { ++ r.popFront(); ++ if(r.empty) ++ break; ++ cur = r.front.a; ++ } ++ } ++ private: ++ uint cur; ++ typeof(This.init.byInterval) r; ++ } ++ ++ return CodepointRange(this); ++ } ++ ++ /** ++ $(P Obtain textual representation of this set in from of ++ open-right intervals and feed it to $(D sink). ++ ) ++ $(P Used by various standard formatting facilities such as ++ $(XREF _format, formattedWrite), $(XREF _stdio, write), ++ $(XREF _stdio, writef), $(XREF _conv, to) and others. ++ ) ++ Example: ++ --- ++ import std.conv; ++ assert(unicode.ASCII.to!string == "[0..128$(RPAREN)"); ++ --- ++ */ ++ void toString(scope void delegate (const(char)[]) sink) ++ { ++ import std.format; ++ auto range = byInterval; ++ if(range.empty) ++ return; ++ auto val = range.front; ++ formattedWrite(sink, "[%d..%d)", val.a, val.b); ++ range.popFront(); ++ foreach(i; range) ++ formattedWrite(sink, " [%d..%d)", i.a, i.b); ++ } ++ /** ++ Add an interval [a, b$(RPAREN) to this set. ++ ++ Example: ++ --- ++ CodepointSet someSet; ++ someSet.add('0', '5').add('A','Z'+1); ++ someSet.add('5', '9'+1); ++ assert(someSet['0']); ++ assert(someSet['5']); ++ assert(someSet['9']); ++ assert(someSet['Z']); ++ --- ++ */ ++ ref add()(uint a, uint b) ++ { ++ addInterval(a, b); ++ return this; ++ } ++ ++private: ++ ++ ref intersect(U)(U rhs) ++ if(isCodepointSet!U) ++ { ++ Marker mark; ++ foreach( i; rhs.byInterval) ++ { ++ mark = this.dropUpTo(i.a, mark); ++ mark = this.skipUpTo(i.b, mark); ++ } ++ this.dropUpTo(uint.max, mark); ++ return this; ++ } ++ ++ ref intersect()(dchar ch) ++ { ++ foreach(i; byInterval) ++ if(i.a >= ch && ch < i.b) ++ return this = This.init.add(ch, ch+1); ++ this = This.init; ++ return this; ++ } ++ ++ ref sub()(dchar ch) ++ { ++ return subChar(ch); ++ } ++ ++ // same as the above except that skip & drop parts are swapped ++ ref sub(U)(U rhs) ++ if(isCodepointSet!U) ++ { ++ uint top; ++ Marker mark; ++ foreach(i; rhs.byInterval) ++ { ++ mark = this.skipUpTo(i.a, mark); ++ mark = this.dropUpTo(i.b, mark); ++ } ++ return this; ++ } ++ ++ ref add(U)(U rhs) ++ if(isCodepointSet!U) ++ { ++ Marker start; ++ foreach(i; rhs.byInterval) ++ { ++ start = addInterval(i.a, i.b, start); ++ } ++ return this; ++ } ++// end of mixin-able part ++//============================================================================ ++public: ++ /** ++ Obtains a set that is the inversion of this set. ++ ++ See the '!' $(LREF opUnary) for the same but using operators. ++ ++ Example: ++ --- ++ set = unicode.ASCII; ++ // union with the inverse gets all of the code points in the Unicode ++ assert((set | set.inverted).length == 0x110000); ++ // no intersection with the inverse ++ assert((set & set.inverted).empty); ++ --- ++ */ ++ @property auto inverted() ++ { ++ InversionList inversion = this; ++ if(inversion.data.length == 0) ++ { ++ inversion.addInterval(0, lastDchar+1); ++ return inversion; ++ } ++ if(inversion.data[0] != 0) ++ genericReplace(inversion.data, 0, 0, [0]); ++ else ++ genericReplace(inversion.data, 0, 1, cast(uint[])null); ++ if(data[data.length-1] != lastDchar+1) ++ genericReplace(inversion.data, ++ inversion.data.length, inversion.data.length, [lastDchar+1]); ++ else ++ genericReplace(inversion.data, ++ inversion.data.length-1, inversion.data.length, cast(uint[])null); ++ ++ return inversion; ++ } ++ ++ /** ++ Generates string with D source code of unary function with name of ++ $(D funcName) taking a single $(D dchar) argument. If $(D funcName) is empty ++ the code is adjusted to be a lambda function. ++ ++ The function generated tests if the $(CODEPOINT) passed ++ belongs to this set or not. The result is to be used with string mixin. ++ The intended usage area is aggressive optimization via meta programming ++ in parser generators and the like. ++ ++ Note: Use with care for relatively small or regular sets. It ++ could end up being slower then just using multi-staged tables. ++ ++ Example: ++ --- ++ import std.stdio; ++ ++ // construct set directly from [a, b) intervals ++ auto set = CodepointSet(10, 12, 45, 65, 100, 200); ++ writeln(set); ++ writeln(set.toSourceCode("func")); ++ --- ++ ++ The above outputs something along the lines of: ++ --- ++ bool func(dchar ch) ++ { ++ if(ch < 45) ++ { ++ if(ch == 10 || ch == 11) return true; ++ return false; ++ } ++ else if (ch < 65) return true; ++ else ++ { ++ if(ch < 100) return false; ++ if(ch < 200) return true; ++ return false; ++ } ++ } ++ --- ++ */ ++ string toSourceCode(string funcName="") ++ { ++ import std.string; ++ enum maxBinary = 3; ++ static string linearScope(R)(R ivals, string indent) ++ { ++ string result = indent~"{\n"; ++ string deeper = indent~" "; ++ foreach(ival; ivals) ++ { ++ auto span = ival[1] - ival[0]; ++ assert(span != 0); ++ if(span == 1) ++ { ++ result ~= format("%sif(ch == %s) return true;\n", deeper, ival[0]); ++ } ++ else if(span == 2) ++ { ++ result ~= format("%sif(ch == %s || ch == %s) return true;\n", ++ deeper, ival[0], ival[0]+1); ++ } ++ else ++ { ++ if(ival[0] != 0) // dchar is unsigned and < 0 is useless ++ result ~= format("%sif(ch < %s) return false;\n", deeper, ival[0]); ++ result ~= format("%sif(ch < %s) return true;\n", deeper, ival[1]); ++ } ++ } ++ result ~= format("%sreturn false;\n%s}\n", deeper, indent); // including empty range of intervals ++ return result; ++ } ++ ++ static string binaryScope(R)(R ivals, string indent) ++ { ++ // time to do unrolled comparisons? ++ if(ivals.length < maxBinary) ++ return linearScope(ivals, indent); ++ else ++ return bisect(ivals, ivals.length/2, indent); ++ } ++ ++ // not used yet if/elsebinary search is far better with DMD as of 2.061 ++ // and GDC is doing fine job either way ++ static string switchScope(R)(R ivals, string indent) ++ { ++ string result = indent~"switch(ch){\n"; ++ string deeper = indent~" "; ++ foreach(ival; ivals) ++ { ++ if(ival[0]+1 == ival[1]) ++ { ++ result ~= format("%scase %s: return true;\n", ++ deeper, ival[0]); ++ } ++ else ++ { ++ result ~= format("%scase %s: .. case %s: return true;\n", ++ deeper, ival[0], ival[1]-1); ++ } ++ } ++ result ~= deeper~"default: return false;\n"~indent~"}\n"; ++ return result; ++ } ++ ++ static string bisect(R)(R range, size_t idx, string indent) ++ { ++ string deeper = indent ~ " "; ++ // bisect on one [a, b) interval at idx ++ string result = indent~"{\n"; ++ // less branch, < a ++ result ~= format("%sif(ch < %s)\n%s", ++ deeper, range[idx][0], binaryScope(range[0..idx], deeper)); ++ // middle point, >= a && < b ++ result ~= format("%selse if (ch < %s) return true;\n", ++ deeper, range[idx][1]); ++ // greater or equal branch, >= b ++ result ~= format("%selse\n%s", ++ deeper, binaryScope(range[idx+1..$], deeper)); ++ return result~indent~"}\n"; ++ } ++ ++ string code = format("bool %s(dchar ch) @safe pure nothrow\n", ++ funcName.empty ? "function" : funcName); ++ auto range = byInterval.array(); ++ // special case first bisection to be on ASCII vs beyond ++ auto tillAscii = countUntil!"a[0] > 0x80"(range); ++ if(tillAscii <= 0) // everything is ASCII or nothing is ascii (-1 & 0) ++ code ~= binaryScope(range, ""); ++ else ++ code ~= bisect(range, tillAscii, ""); ++ return code; ++ } ++ ++ /** ++ True if this set doesn't contain any $(CODEPOINTS). ++ Example: ++ --- ++ CodepointSet emptySet; ++ assert(emptySet.length == 0); ++ assert(emptySet.empty); ++ --- ++ */ ++ @property bool empty() const ++ { ++ return data.length == 0; ++ } ++ ++private: ++ alias typeof(this) This; ++ alias size_t Marker; ++ ++ // special case for normal InversionList ++ ref subChar(dchar ch) ++ { ++ auto mark = skipUpTo(ch); ++ if(mark != data.length ++ && data[mark] == ch && data[mark-1] == ch) ++ { ++ // it has split, meaning that ch happens to be in one of intervals ++ data[mark] = data[mark]+1; ++ } ++ return this; ++ } ++ ++ // ++ Marker addInterval(int a, int b, Marker hint=Marker.init) ++ in ++ { ++ assert(a <= b, text(a, " > ", b)); ++ } ++ body ++ { ++ auto range = assumeSorted(data[]); ++ size_t pos; ++ size_t a_idx = range.lowerBound(a).length; ++ if(a_idx == range.length) ++ { ++ // [---+++----++++----++++++] ++ // [ a b] ++ data.append([a, b]); ++ return data.length-1; ++ } ++ size_t b_idx = range[a_idx..range.length].lowerBound(b).length+a_idx; ++ uint[] to_insert; ++ debug(std_uni) ++ { ++ writefln("a_idx=%d; b_idx=%d;", a_idx, b_idx); ++ } ++ if(b_idx == range.length) ++ { ++ // [-------++++++++----++++++-] ++ // [ s a b] ++ if(a_idx & 1)// a in positive ++ { ++ to_insert = [ b ]; ++ } ++ else// a in negative ++ { ++ to_insert = [a, b]; ++ } ++ genericReplace(data, a_idx, b_idx, to_insert); ++ return a_idx+to_insert.length-1; ++ } ++ ++ uint top = data[b_idx]; ++ ++ debug(std_uni) ++ { ++ writefln("a_idx=%d; b_idx=%d;", a_idx, b_idx); ++ writefln("a=%s; b=%s; top=%s;", a, b, top); ++ } ++ if(a_idx & 1) ++ {// a in positive ++ if(b_idx & 1)// b in positive ++ { ++ // [-------++++++++----++++++-] ++ // [ s a b ] ++ to_insert = [top]; ++ } ++ else // b in negative ++ { ++ // [-------++++++++----++++++-] ++ // [ s a b ] ++ if(top == b) ++ { ++ assert(b_idx+1 < data.length); ++ pos = genericReplace(data, a_idx, b_idx+2, [data[b_idx+1]]); ++ return pos; ++ } ++ to_insert = [b, top ]; ++ } ++ } ++ else ++ { // a in negative ++ if(b_idx & 1) // b in positive ++ { ++ // [----------+++++----++++++-] ++ // [ a b ] ++ to_insert = [a, top]; ++ } ++ else// b in negative ++ { ++ // [----------+++++----++++++-] ++ // [ a s b ] ++ if(top == b) ++ { ++ assert(b_idx+1 < data.length); ++ pos = genericReplace(data, a_idx, b_idx+2, [a, data[b_idx+1] ]); ++ return pos; ++ } ++ to_insert = [a, b, top]; ++ } ++ } ++ pos = genericReplace(data, a_idx, b_idx+1, to_insert); ++ debug(std_uni) ++ { ++ writefln("marker idx: %d; length=%d", pos, data[pos], data.length); ++ writeln("inserting ", to_insert); ++ } ++ return pos; ++ } ++ ++ // ++ Marker dropUpTo(uint a, Marker pos=Marker.init) ++ in ++ { ++ assert(pos % 2 == 0); // at start of interval ++ } ++ body ++ { ++ auto range = assumeSorted!"a<=b"(data[pos..data.length]); ++ if(range.empty) ++ return pos; ++ size_t idx = pos; ++ idx += range.lowerBound(a).length; ++ ++ debug(std_uni) ++ { ++ writeln("dropUpTo full length=", data.length); ++ writeln(pos,"~~~", idx); ++ } ++ if(idx == data.length) ++ return genericReplace(data, pos, idx, cast(uint[])[]); ++ if(idx & 1) ++ { // a in positive ++ //[--+++----++++++----+++++++------...] ++ // |<---si s a t ++ genericReplace(data, pos, idx, [a]); ++ } ++ else ++ { // a in negative ++ //[--+++----++++++----+++++++-------+++...] ++ // |<---si s a t ++ genericReplace(data, pos, idx, cast(uint[])[]); ++ } ++ return pos; ++ } ++ ++ // ++ Marker skipUpTo(uint a, Marker pos=Marker.init) ++ out(result) ++ { ++ assert(result % 2 == 0);// always start of interval ++ //(may be 0-width after-split) ++ } ++ body ++ { ++ assert(data.length % 2 == 0); ++ auto range = assumeSorted!"a<=b"(data[pos..data.length]); ++ size_t idx = pos+range.lowerBound(a).length; ++ ++ if(idx >= data.length) // could have Marker point to recently removed stuff ++ return data.length; ++ ++ if(idx & 1)// inside of interval, check for split ++ { ++ ++ uint top = data[idx]; ++ if(top == a)// no need to split, it's end ++ return idx+1; ++ uint start = data[idx-1]; ++ if(a == start) ++ return idx-1; ++ // split it up ++ genericReplace(data, idx, idx+1, [a, a, top]); ++ return idx+1; // avoid odd index ++ } ++ return idx; ++ } ++ ++ Uint24Array!SP data; ++}; ++ ++@system unittest ++{ ++ // test examples ++ import std.algorithm, std.typecons; ++ auto set = CodepointSet('A', 'D'+1, 'a', 'd'+1); ++ set.byInterval.equalS([tuple('A', 'E'), tuple('a', 'e')]); ++ set = unicode.ASCII; ++ assert(set.byCodepoint.equalS(iota(0, 0x80))); ++ set = CodepointSet('a', 'z'+1, 'а', 'я'+1); ++ foreach(v; 'a'..'z'+1) ++ assert(set[v]); ++ // Cyrillic lowercase interval ++ foreach(v; 'а'..'я'+1) ++ assert(set[v]); ++ ++ auto gothic = unicode.Gothic; ++ // Gothic letter ahsa ++ assert(gothic['\U00010330']); ++ // no ascii in Gothic obviously ++ assert(!gothic['$']); ++ ++ CodepointSet emptySet; ++ assert(emptySet.length == 0); ++ assert(emptySet.empty); ++ ++ set = unicode.ASCII; ++ // union with the inverse gets all of code points in the Unicode ++ assert((set | set.inverted).length == 0x110000); ++ // no intersection with inverse ++ assert((set & set.inverted).empty); ++ ++ CodepointSet someSet; ++ someSet.add('0', '5').add('A','Z'+1); ++ someSet.add('5', '9'+1); ++ assert(someSet['0']); ++ assert(someSet['5']); ++ assert(someSet['9']); ++ assert(someSet['Z']); ++ ++ auto lower = unicode.LowerCase; ++ auto upper = unicode.UpperCase; ++ auto ascii = unicode.ASCII; ++ assert((lower & upper).empty); // no intersection ++ auto lowerASCII = lower & ascii; ++ assert(lowerASCII.byCodepoint.equalS(iota('a', 'z'+1))); ++ // throw away all of the lowercase ASCII ++ assert((ascii - lower).length == 128 - 26); ++ auto onlyOneOf = lower ~ ascii; ++ assert(!onlyOneOf['Δ']); // not ASCII and not lowercase ++ assert(onlyOneOf['$']); // ASCII and not lowercase ++ assert(!onlyOneOf['a']); // ASCII and lowercase ++ assert(onlyOneOf['я']); // not ASCII but lowercase ++ ++ auto noLetters = ascii - (lower | upper); ++ assert(noLetters.length == 128 - 26*2); ++ import std.conv; ++ assert(unicode.ASCII.to!string() == "[0..128)"); ++} ++ ++// pedantic version for ctfe, and aligned-access only architectures ++@trusted uint safeRead24(const ubyte* ptr, size_t idx) pure nothrow ++{ ++ idx *= 3; ++ version(LittleEndian) ++ return ptr[idx] + (cast(uint)ptr[idx+1]<<8) ++ + (cast(uint)ptr[idx+2]<<16); ++ else ++ return (cast(uint)ptr[idx]<<16) + (cast(uint)ptr[idx+1]<<8) ++ + ptr[idx+2]; ++} ++ ++// ditto ++@trusted void safeWrite24(ubyte* ptr, uint val, size_t idx) pure nothrow ++{ ++ idx *= 3; ++ version(LittleEndian) ++ { ++ ptr[idx] = val & 0xFF; ++ ptr[idx+1] = (val>>8) & 0xFF; ++ ptr[idx+2] = (val>>16) & 0xFF; ++ } ++ else ++ { ++ ptr[idx] = (val>>16) & 0xFF; ++ ptr[idx+1] = (val>>8) & 0xFF; ++ ptr[idx+2] = val & 0xFF; ++ } ++} ++ ++// unaligned x86-like read/write functions ++@trusted uint unalignedRead24(const ubyte* ptr, size_t idx) pure nothrow ++{ ++ uint* src = cast(uint*)(ptr+3*idx); ++ version(LittleEndian) ++ return *src & 0xFF_FFFF; ++ else ++ return *src >> 8; ++} ++ ++// ditto ++@trusted void unalignedWrite24(ubyte* ptr, uint val, size_t idx) pure nothrow ++{ ++ uint* dest = cast(uint*)(cast(ubyte*)ptr + 3*idx); ++ version(LittleEndian) ++ *dest = val | (*dest & 0xFF00_0000); ++ else ++ *dest = (val<<8) | (*dest & 0xFF); ++} ++ ++uint read24(const ubyte* ptr, size_t idx) pure nothrow ++{ ++ static if(hasUnalignedReads) ++ return __ctfe ? safeRead24(ptr, idx) : unalignedRead24(ptr, idx); ++ else ++ return safeRead24(ptr, idx); ++} ++ ++void write24(ubyte* ptr, uint val, size_t idx) pure nothrow ++{ ++ static if(hasUnalignedReads) ++ return __ctfe ? safeWrite24(ptr, val, idx) : unalignedWrite24(ptr, val, idx); ++ else ++ return safeWrite24(ptr, val, idx); ++} ++ ++// Packed array of 24-bit integers, COW semantics. ++@trusted struct Uint24Array(SP=GcPolicy) ++{ ++ this(Range)(Range range) ++ if(isInputRange!Range && hasLength!Range) ++ { ++ length = range.length; ++ copy(range, this[]); ++ } ++ ++ this(Range)(Range range) ++ if(isForwardRange!Range && !hasLength!Range) ++ { ++ auto len = walkLength(range.save); ++ length = len; ++ copy(range, this[]); ++ } ++ ++ this(this) ++ { ++ if(!empty) ++ { ++ refCount = refCount + 1; ++ } ++ } ++ ++ ~this() ++ { ++ if(!empty) ++ { ++ auto cnt = refCount; ++ if(cnt == 1) ++ SP.destroy(data); ++ else ++ refCount = cnt - 1; ++ } ++ } ++ ++ // no ref-count for empty U24 array ++ @property bool empty() const { return data.length == 0; } ++ ++ // report one less then actual size ++ @property size_t length() const ++ { ++ return data.length ? (data.length-4)/3 : 0; ++ } ++ ++ //+ an extra slot for ref-count ++ @property void length(size_t len) ++ { ++ if(len == 0) ++ { ++ if(!empty) ++ freeThisReference(); ++ return; ++ } ++ immutable bytes = len*3+4; // including ref-count ++ if(empty) ++ { ++ data = SP.alloc!ubyte(bytes); ++ refCount = 1; ++ return; ++ } ++ auto cur_cnt = refCount; ++ if(cur_cnt != 1) // have more references to this memory ++ { ++ refCount = cur_cnt - 1; ++ auto new_data = SP.alloc!ubyte(bytes); ++ // take shrinking into account ++ auto to_copy = min(bytes, data.length)-4; ++ copy(data[0..to_copy], new_data[0..to_copy]); ++ data = new_data; // before setting refCount! ++ refCount = 1; ++ } ++ else // 'this' is the only reference ++ { ++ // use the realloc (hopefully in-place operation) ++ data = SP.realloc(data, bytes); ++ refCount = 1; // setup a ref-count in the new end of the array ++ } ++ } ++ ++ alias opDollar = length; ++ ++ // Read 24-bit packed integer ++ uint opIndex(size_t idx)const ++ { ++ return read24(data.ptr, idx); ++ } ++ ++ // Write 24-bit packed integer ++ void opIndexAssign(uint val, size_t idx) ++ in ++ { ++ assert(!empty && val <= 0xFF_FFFF); ++ } ++ body ++ { ++ auto cnt = refCount; ++ if(cnt != 1) ++ dupThisReference(cnt); ++ write24(data.ptr, val, idx); ++ } ++ ++ // ++ auto opSlice(size_t from, size_t to) ++ { ++ return sliceOverIndexed(from, to, &this); ++ } ++ ++ /// ++ auto opSlice(size_t from, size_t to) const ++ { ++ return sliceOverIndexed(from, to, &this); ++ } ++ ++ // length slices before the ref count ++ auto opSlice() ++ { ++ return opSlice(0, length); ++ } ++ ++ // length slices before the ref count ++ auto opSlice() const ++ { ++ return opSlice(0, length); ++ } ++ ++ void append(Range)(Range range) ++ if(isInputRange!Range && hasLength!Range && is(ElementType!Range : uint)) ++ { ++ size_t nl = length + range.length; ++ length = nl; ++ copy(range, this[nl-range.length..nl]); ++ } ++ ++ void append()(uint val) ++ { ++ length = length + 1; ++ this[$-1] = val; ++ } ++ ++ bool opEquals()(auto const ref Uint24Array rhs)const ++ { ++ if(empty ^ rhs.empty) ++ return false; // one is empty and the other isn't ++ return empty || data[0..$-4] == rhs.data[0..$-4]; ++ } ++ ++private: ++ // ref-count is right after the data ++ @property uint refCount() const ++ { ++ return read24(data.ptr, length); ++ } ++ ++ @property void refCount(uint cnt) ++ in ++ { ++ assert(cnt <= 0xFF_FFFF); ++ } ++ body ++ { ++ write24(data.ptr, cnt, length); ++ } ++ ++ void freeThisReference() ++ { ++ auto count = refCount; ++ if(count != 1) // have more references to this memory ++ { ++ // dec shared ref-count ++ refCount = count - 1; ++ data = []; ++ } ++ else ++ SP.destroy(data); ++ assert(!data.ptr); ++ } ++ ++ void dupThisReference(uint count) ++ in ++ { ++ assert(!empty && count != 1 && count == refCount); ++ } ++ body ++ { ++ // dec shared ref-count ++ refCount = count - 1; ++ // copy to the new chunk of RAM ++ auto new_data = SP.alloc!ubyte(data.length); ++ // bit-blit old stuff except the counter ++ copy(data[0..$-4], new_data[0..$-4]); ++ data = new_data; // before setting refCount! ++ refCount = 1; // so that this updates the right one ++ } ++ ++ ubyte[] data; ++} ++ ++@trusted unittest// Uint24 tests //@@@BUG@@ iota is system ?! ++{ ++ void funcRef(T)(ref T u24) ++ { ++ u24.length = 2; ++ u24[1] = 1024; ++ T u24_c = u24; ++ assert(u24[1] == 1024); ++ u24.length = 0; ++ assert(u24.empty); ++ u24.append([1, 2]); ++ assert(equalS(u24[], [1, 2])); ++ u24.append(111); ++ assert(equalS(u24[], [1, 2, 111])); ++ assert(!u24_c.empty && u24_c[1] == 1024); ++ u24.length = 3; ++ copy(iota(0, 3), u24[]); ++ assert(equalS(u24[], iota(0, 3))); ++ assert(u24_c[1] == 1024); ++ } ++ ++ void func2(T)(T u24) ++ { ++ T u24_2 = u24; ++ T u24_3; ++ u24_3 = u24_2; ++ assert(u24_2 == u24_3); ++ assert(equalS(u24[], u24_2[])); ++ assert(equalS(u24_2[], u24_3[])); ++ funcRef(u24_3); ++ ++ assert(equalS(u24_3[], iota(0, 3))); ++ assert(!equalS(u24_2[], u24_3[])); ++ assert(equalS(u24_2[], u24[])); ++ u24_2 = u24_3; ++ assert(equalS(u24_2[], iota(0, 3))); ++ // to test that passed arg is intact outside ++ // plus try out opEquals ++ u24 = u24_3; ++ u24 = T.init; ++ u24_3 = T.init; ++ assert(u24.empty); ++ assert(u24 == u24_3); ++ assert(u24 != u24_2); ++ } ++ ++ foreach(Policy; TypeTuple!(GcPolicy, ReallocPolicy)) ++ { ++ alias typeof(Uint24Array!Policy.init[]) Range; ++ alias Uint24Array!Policy U24A; ++ static assert(isForwardRange!Range); ++ static assert(isBidirectionalRange!Range); ++ static assert(isOutputRange!(Range, uint)); ++ static assert(isRandomAccessRange!(Range)); ++ ++ auto arr = U24A([42u, 36, 100]); ++ assert(arr[0] == 42); ++ assert(arr[1] == 36); ++ arr[0] = 72; ++ arr[1] = 0xFE_FEFE; ++ assert(arr[0] == 72); ++ assert(arr[1] == 0xFE_FEFE); ++ assert(arr[2] == 100); ++ U24A arr2 = arr; ++ assert(arr2[0] == 72); ++ arr2[0] = 11; ++ // test COW-ness ++ assert(arr[0] == 72); ++ assert(arr2[0] == 11); ++ // set this to about 100M to stress-test COW memory management ++ foreach(v; 0..10_000) ++ func2(arr); ++ assert(equalS(arr[], [72, 0xFE_FEFE, 100])); ++ ++ auto r2 = U24A(iota(0, 100)); ++ assert(equalS(r2[], iota(0, 100)), text(r2[])); ++ copy(iota(10, 170, 2), r2[10..90]); ++ assert(equalS(r2[], chain(iota(0, 10), iota(10, 170, 2), iota(90, 100))) ++ , text(r2[])); ++ } ++} ++ ++version(unittest) ++{ ++ private alias TypeTuple!(InversionList!GcPolicy, InversionList!ReallocPolicy) AllSets; ++} ++ ++@trusted unittest// core set primitives test ++{ ++ foreach(CodeList; AllSets) ++ { ++ CodeList a; ++ //"plug a hole" test ++ a.add(10, 20).add(25, 30).add(15, 27); ++ assert(a == CodeList(10, 30), text(a)); ++ ++ auto x = CodeList.init; ++ x.add(10, 20).add(30, 40).add(50, 60); ++ ++ a = x; ++ a.add(20, 49);//[10, 49) [50, 60) ++ assert(a == CodeList(10, 49, 50 ,60)); ++ ++ a = x; ++ a.add(20, 50); ++ assert(a == CodeList(10, 60), text(a)); ++ ++ // simple unions, mostly edge effects ++ x = CodeList.init; ++ x.add(10, 20).add(40, 60); ++ ++ a = x; ++ a.add(10, 25); //[10, 25) [40, 60) ++ assert(a == CodeList(10, 25, 40, 60)); ++ ++ a = x; ++ a.add(5, 15); //[5, 20) [40, 60) ++ assert(a == CodeList(5, 20, 40, 60)); ++ ++ a = x; ++ a.add(0, 10); // [0, 20) [40, 60) ++ assert(a == CodeList(0, 20, 40, 60)); ++ ++ a = x; ++ a.add(0, 5); // prepand ++ assert(a == CodeList(0, 5, 10, 20, 40, 60), text(a)); ++ ++ a = x; ++ a.add(5, 20); ++ assert(a == CodeList(5, 20, 40, 60)); ++ ++ a = x; ++ a.add(3, 37); ++ assert(a == CodeList(3, 37, 40, 60)); ++ ++ a = x; ++ a.add(37, 65); ++ assert(a == CodeList(10, 20, 37, 65)); ++ ++ // some tests on helpers for set intersection ++ x = CodeList.init.add(10, 20).add(40, 60).add(100, 120); ++ a = x; ++ ++ auto m = a.skipUpTo(60); ++ a.dropUpTo(110, m); ++ assert(a == CodeList(10, 20, 40, 60, 110, 120), text(a.data[])); ++ ++ a = x; ++ a.dropUpTo(100); ++ assert(a == CodeList(100, 120), text(a.data[])); ++ ++ a = x; ++ m = a.skipUpTo(50); ++ a.dropUpTo(140, m); ++ assert(a == CodeList(10, 20, 40, 50), text(a.data[])); ++ a = x; ++ a.dropUpTo(60); ++ assert(a == CodeList(100, 120), text(a.data[])); ++ } ++} ++ ++@trusted unittest ++{ // full set operations ++ foreach(CodeList; AllSets) ++ { ++ CodeList a, b, c, d; ++ ++ //"plug a hole" ++ a.add(20, 40).add(60, 80).add(100, 140).add(150, 200); ++ b.add(40, 60).add(80, 100).add(140, 150); ++ c = a | b; ++ d = b | a; ++ assert(c == CodeList(20, 200), text(CodeList.stringof," ", c)); ++ assert(c == d, text(c," vs ", d)); ++ ++ b = CodeList.init.add(25, 45).add(65, 85).add(95,110).add(150, 210); ++ c = a | b; //[20,45) [60, 85) [95, 140) [150, 210) ++ d = b | a; ++ assert(c == CodeList(20, 45, 60, 85, 95, 140, 150, 210), text(c)); ++ assert(c == d, text(c," vs ", d)); ++ ++ b = CodeList.init.add(10, 20).add(30,100).add(145,200); ++ c = a | b;//[10, 140) [145, 200) ++ d = b | a; ++ assert(c == CodeList(10, 140, 145, 200)); ++ assert(c == d, text(c," vs ", d)); ++ ++ b = CodeList.init.add(0, 10).add(15, 100).add(10, 20).add(200, 220); ++ c = a | b;//[0, 140) [150, 220) ++ d = b | a; ++ assert(c == CodeList(0, 140, 150, 220)); ++ assert(c == d, text(c," vs ", d)); ++ ++ ++ a = CodeList.init.add(20, 40).add(60, 80); ++ b = CodeList.init.add(25, 35).add(65, 75); ++ c = a & b; ++ d = b & a; ++ assert(c == CodeList(25, 35, 65, 75), text(c)); ++ assert(c == d, text(c," vs ", d)); ++ ++ a = CodeList.init.add(20, 40).add(60, 80).add(100, 140).add(150, 200); ++ b = CodeList.init.add(25, 35).add(65, 75).add(110, 130).add(160, 180); ++ c = a & b; ++ d = b & a; ++ assert(c == CodeList(25, 35, 65, 75, 110, 130, 160, 180), text(c)); ++ assert(c == d, text(c," vs ", d)); ++ ++ a = CodeList.init.add(20, 40).add(60, 80).add(100, 140).add(150, 200); ++ b = CodeList.init.add(10, 30).add(60, 120).add(135, 160); ++ c = a & b;//[20, 30)[60, 80) [100, 120) [135, 140) [150, 160) ++ d = b & a; ++ ++ assert(c == CodeList(20, 30, 60, 80, 100, 120, 135, 140, 150, 160),text(c)); ++ assert(c == d, text(c, " vs ",d)); ++ assert((c & a) == c); ++ assert((d & b) == d); ++ assert((c & d) == d); ++ ++ b = CodeList.init.add(40, 60).add(80, 100).add(140, 200); ++ c = a & b; ++ d = b & a; ++ assert(c == CodeList(150, 200), text(c)); ++ assert(c == d, text(c, " vs ",d)); ++ assert((c & a) == c); ++ assert((d & b) == d); ++ assert((c & d) == d); ++ ++ assert((a & a) == a); ++ assert((b & b) == b); ++ ++ a = CodeList.init.add(20, 40).add(60, 80).add(100, 140).add(150, 200); ++ b = CodeList.init.add(30, 60).add(75, 120).add(190, 300); ++ c = a - b;// [30, 40) [60, 75) [120, 140) [150, 190) ++ d = b - a;// [40, 60) [80, 100) [200, 300) ++ assert(c == CodeList(20, 30, 60, 75, 120, 140, 150, 190), text(c)); ++ assert(d == CodeList(40, 60, 80, 100, 200, 300), text(d)); ++ assert(c - d == c, text(c-d, " vs ", c)); ++ assert(d - c == d, text(d-c, " vs ", d)); ++ assert(c - c == CodeList.init); ++ assert(d - d == CodeList.init); ++ ++ a = CodeList.init.add(20, 40).add( 60, 80).add(100, 140).add(150, 200); ++ b = CodeList.init.add(10, 50).add(60, 160).add(190, 300); ++ c = a - b;// [160, 190) ++ d = b - a;// [10, 20) [40, 50) [80, 100) [140, 150) [200, 300) ++ assert(c == CodeList(160, 190), text(c)); ++ assert(d == CodeList(10, 20, 40, 50, 80, 100, 140, 150, 200, 300), text(d)); ++ assert(c - d == c, text(c-d, " vs ", c)); ++ assert(d - c == d, text(d-c, " vs ", d)); ++ assert(c - c == CodeList.init); ++ assert(d - d == CodeList.init); ++ ++ a = CodeList.init.add(20, 40).add(60, 80).add(100, 140).add(150, 200); ++ b = CodeList.init.add(10, 30).add(45, 100).add(130, 190); ++ c = a ~ b; // [10, 20) [30, 40) [45, 60) [80, 130) [140, 150) [190, 200) ++ d = b ~ a; ++ assert(c == CodeList(10, 20, 30, 40, 45, 60, 80, 130, 140, 150, 190, 200), ++ text(c)); ++ assert(c == d, text(c, " vs ", d)); ++ } ++} ++ ++ ++@system: ++unittest// vs single dchar ++{ ++ CodepointSet a = CodepointSet(10, 100, 120, 200); ++ assert(a - 'A' == CodepointSet(10, 65, 66, 100, 120, 200), text(a - 'A')); ++ assert((a & 'B') == CodepointSet(66, 67)); ++} ++ ++unittest// iteration & opIndex ++{ ++ import std.typecons; ++ foreach(CodeList; TypeTuple!(InversionList!(ReallocPolicy))) ++ { ++ auto arr = "ABCDEFGHIJKLMabcdefghijklm"d; ++ auto a = CodeList('A','N','a', 'n'); ++ assert(equalS(a.byInterval, ++ [tuple(cast(uint)'A', cast(uint)'N'), tuple(cast(uint)'a', cast(uint)'n')] ++ ), text(a.byInterval)); ++ ++ // same @@@BUG as in issue 8949 ? ++ version(bug8949) ++ { ++ assert(equalS(retro(a.byInterval), ++ [tuple(cast(uint)'a', cast(uint)'n'), tuple(cast(uint)'A', cast(uint)'N')] ++ ), text(retro(a.byInterval))); ++ } ++ auto achr = a.byCodepoint; ++ assert(equalS(achr, arr), text(a.byCodepoint)); ++ foreach(ch; a.byCodepoint) ++ assert(a[ch]); ++ auto x = CodeList(100, 500, 600, 900, 1200, 1500); ++ assert(equalS(x.byInterval, [ tuple(100, 500), tuple(600, 900), tuple(1200, 1500)]), text(x.byInterval)); ++ foreach(ch; x.byCodepoint) ++ assert(x[ch]); ++ static if(is(CodeList == CodepointSet)) ++ { ++ auto y = CodeList(x.byInterval); ++ assert(equalS(x.byInterval, y.byInterval)); ++ } ++ assert(equalS(CodepointSet.init.byInterval, cast(Tuple!(uint, uint)[])[])); ++ assert(equalS(CodepointSet.init.byCodepoint, cast(dchar[])[])); ++ } ++} ++ ++//============================================================================ ++// Generic Trie template and various ways to build it ++//============================================================================ ++ ++// debug helper to get a shortened array dump ++auto arrayRepr(T)(T x) ++{ ++ if(x.length > 32) ++ { ++ return text(x[0..16],"~...~", x[x.length-16..x.length]); ++ } ++ else ++ return text(x); ++} ++ ++/** ++ Maps $(D Key) to a suitable integer index within the range of $(D size_t). ++ The mapping is constructed by applying predicates from $(D Prefix) left to right ++ and concatenating the resulting bits. ++ ++ The first (leftmost) predicate defines the most significant bits of ++ the resulting index. ++ */ ++template mapTrieIndex(Prefix...) ++{ ++ size_t mapTrieIndex(Key)(Key key) ++ if(isValidPrefixForTrie!(Key, Prefix)) ++ { ++ alias Prefix p; ++ size_t idx; ++ foreach(i, v; p[0..$-1]) ++ { ++ idx |= p[i](key); ++ idx <<= p[i+1].bitSize; ++ } ++ idx |= p[$-1](key); ++ return idx; ++ } ++} ++ ++/* ++ $(D TrieBuilder) is a type used for incremental construction ++ of $(LREF Trie)s. ++ ++ See $(LREF buildTrie) for generic helpers built on top of it. ++*/ ++@trusted struct TrieBuilder(Value, Key, Args...) ++ if(isBitPackableType!Value && isValidArgsForTrie!(Key, Args)) ++{ ++private: ++ // last index is not stored in table, it is used as an offset to values in a block. ++ static if(is(Value == bool))// always pack bool ++ alias V = BitPacked!(Value, 1); ++ else ++ alias V = Value; ++ static auto deduceMaxIndex(Preds...)() ++ { ++ size_t idx = 1; ++ foreach(v; Preds) ++ idx *= 2^^v.bitSize; ++ return idx; ++ } ++ ++ static if(is(typeof(Args[0]) : Key)) // Args start with upper bound on Key ++ { ++ alias Prefix = Args[1..$]; ++ enum lastPageSize = 2^^Prefix[$-1].bitSize; ++ enum translatedMaxIndex = mapTrieIndex!(Prefix)(Args[0]); ++ enum roughedMaxIndex = ++ (translatedMaxIndex + lastPageSize-1)/lastPageSize*lastPageSize; ++ // check warp around - if wrapped, use the default deduction rule ++ enum maxIndex = roughedMaxIndex < translatedMaxIndex ? ++ deduceMaxIndex!(Prefix)() : roughedMaxIndex; ++ } ++ else ++ { ++ alias Prefix = Args; ++ enum maxIndex = deduceMaxIndex!(Prefix)(); ++ } ++ ++ alias getIndex = mapTrieIndex!(Prefix); ++ ++ enum lastLevel = Prefix.length-1; ++ struct ConstructState ++ { ++ bool zeros, ones; // current page is zeros? ones? ++ uint idx_zeros, idx_ones; ++ } ++ // iteration over levels of Trie, each indexes its own level and thus a shortened domain ++ size_t[Prefix.length] indices; ++ // default filler value to use ++ Value defValue; ++ // this is a full-width index of next item ++ size_t curIndex; ++ // all-zeros page index, all-ones page index (+ indicator if there is such a page) ++ ConstructState[Prefix.length] state; ++ // the table being constructed ++ MultiArray!(idxTypes!(Key, fullBitSize!(Prefix), Prefix[0..$]), V) table; ++ ++ @disable this(); ++ ++ // this function assumes no holes in the input so ++ // indices are going one by one ++ void addValue(size_t level, T)(T val, size_t numVals) ++ { ++ enum pageSize = 1< n) ++ numVals -= n; ++ else ++ { ++ n = numVals; ++ numVals = 0; ++ } ++ static if(level < Prefix.length-1) ++ assert(indices[level] <= 2^^Prefix[level+1].bitSize); ++ ptr[j..j+n] = val; ++ j += n; ++ indices[level] = j; ++ } ++ // last level (i.e. topmost) has 1 "page" ++ // thus it need not to add a new page on upper level ++ static if(level != 0) ++ { ++ if(indices[level] % pageSize == 0) ++ spillToNextPage!level(ptr); ++ } ++ } ++ while(numVals); ++ } ++ ++ // this can re-use the current page if duplicate or allocate a new one ++ // it also makes sure that previous levels point to the correct page in this level ++ void spillToNextPage(size_t level, Slice)(ref Slice ptr) ++ { ++ alias typeof(table.slice!(level-1)[0]) NextIdx; ++ NextIdx next_lvl_index; ++ enum pageSize = 1< [%s..%s]" ++ ,level ++ ,indices[level-1], pageSize, j, j+pageSize); ++ writeln("LEVEL(", level ++ , ") mapped page is: ", slice, ": ", arrayRepr(ptr[j..j+pageSize])); ++ writeln("LEVEL(", level ++ , ") src page is :", ptr, ": ", arrayRepr(slice[0..pageSize])); ++ } ++ indices[level] -= pageSize; // reuse this page, it is duplicate ++ break; ++ } ++ } ++ if(j == last) ++ { ++ L_allocate_page: ++ next_lvl_index = force!NextIdx(indices[level]/pageSize - 1); ++ // allocate next page ++ version(none) ++ { ++ writefln("LEVEL(%s) page allocated: %s" ++ , level, arrayRepr(slice[0..pageSize])); ++ writefln("LEVEL(%s) index: %s ; page at this index %s" ++ , level ++ , next_lvl_index ++ , arrayRepr( ++ table.slice!(level) ++ [pageSize*next_lvl_index..(next_lvl_index+1)*pageSize] ++ )); ++ } ++ table.length!level = table.length!level + pageSize; ++ } ++ L_know_index: ++ // reset all zero/ones tracking variables ++ static if(is(TypeOfBitPacked!T : bool)) ++ { ++ state[level].zeros = true; ++ state[level].ones = true; ++ } ++ // for the previous level, values are indices to the pages in the current level ++ addValue!(level-1)(next_lvl_index, 1); ++ } ++ ++ // idx - full-width index to fill with v (full-width index != key) ++ // fills everything in the range of [curIndex, idx) with filler ++ void putAt(size_t idx, Value v) ++ { ++ assert(idx >= curIndex); ++ size_t numFillers = idx - curIndex; ++ addValue!lastLevel(defValue, numFillers); ++ addValue!lastLevel(v, 1); ++ curIndex = idx + 1; ++ } ++ ++ // ditto, but sets the range of [idxA, idxB) to v ++ void putRangeAt(size_t idxA, size_t idxB, Value v) ++ { ++ assert(idxA >= curIndex); ++ assert(idxB >= idxA); ++ size_t numFillers = idxA - curIndex; ++ addValue!lastLevel(defValue, numFillers); ++ addValue!lastLevel(v, idxB - idxA); ++ curIndex = idxB; // open-right ++ } ++ ++ enum errMsg = "non-monotonic prefix function(s), an unsorted range or " ++ "duplicate key->value mapping"; ++ ++public: ++ /** ++ Construct a builder, where $(D filler) is a value ++ to indicate empty slots (or "not found" condition). ++ */ ++ this(Value filler) ++ { ++ curIndex = 0; ++ defValue = filler; ++ // zeros-page index, ones-page index ++ foreach(ref v; state) ++ v = ConstructState(true, true, uint.max, uint.max); ++ table = typeof(table)(indices); ++ // one page per level is a bootstrap minimum ++ foreach(i; Sequence!(0, Prefix.length)) ++ table.length!i = (1<= idxA && idxA >= curIndex, errMsg); ++ putRangeAt(idxA, idxB, v); ++ } ++ ++ /** ++ Put a value $(D v) into slot mapped by $(D key). ++ All slots prior to $(D key) are filled with the ++ default filler. ++ */ ++ void putValue(Key key, Value v) ++ { ++ auto idx = getIndex(key); ++ enforce(idx >= curIndex, text(errMsg, " ", idx)); ++ putAt(idx, v); ++ } ++ ++ /// Finishes construction of Trie, yielding an immutable Trie instance. ++ auto build() ++ { ++ static if(maxIndex != 0) // doesn't cover full range of size_t ++ { ++ assert(curIndex <= maxIndex); ++ addValue!lastLevel(defValue, maxIndex - curIndex); ++ } ++ else ++ { ++ if(curIndex != 0 // couldn't wrap around ++ || (Prefix.length != 1 && indices[lastLevel] == 0)) // can be just empty ++ { ++ addValue!lastLevel(defValue, size_t.max - curIndex); ++ addValue!lastLevel(defValue, 1); ++ } ++ // else curIndex already completed the full range of size_t by wrapping around ++ } ++ return Trie!(V, Key, maxIndex, Prefix)(table); ++ } ++} ++ ++/* ++ $(P A generic Trie data-structure for a fixed number of stages. ++ The design goal is optimal speed with smallest footprint size. ++ ) ++ $(P It's intentionally read-only and doesn't provide constructors. ++ To construct one use a special builder, ++ see $(LREF TrieBuilder) and $(LREF buildTrie). ++ ) ++ ++*/ ++@trusted public struct Trie(Value, Key, Args...) ++ if(isValidPrefixForTrie!(Key, Args) ++ || (isValidPrefixForTrie!(Key, Args[1..$]) ++ && is(typeof(Args[0]) : size_t))) ++{ ++ static if(is(typeof(Args[0]) : size_t)) ++ { ++ enum maxIndex = Args[0]; ++ enum hasBoundsCheck = true; ++ alias Prefix = Args[1..$]; ++ } ++ else ++ { ++ enum hasBoundsCheck = false; ++ alias Prefix = Args; ++ } ++ ++ private this()(typeof(_table) table) ++ { ++ _table = table; ++ } ++ ++ // only for constant Tries constructed from precompiled tables ++ private this()(const(size_t)[] offsets, const(size_t)[] sizes, ++ const(size_t)[] data) const ++ { ++ _table = typeof(_table)(offsets, sizes, data); ++ } ++ ++ /* ++ $(P Lookup the $(D key) in this $(D Trie). ) ++ ++ $(P The lookup always succeeds if key fits the domain ++ provided during construction. The whole domain defined ++ is covered so instead of not found condition ++ the sentinel (filler) value could be used. ) ++ ++ $(P See $(LREF buildTrie), $(LREF TrieBuilder) for how to ++ define a domain of $(D Trie) keys and the sentinel value. ) ++ ++ Note: ++ Domain range-checking is only enabled in debug builds ++ and results in assertion failure. ++ */ ++ // templated to auto-detect pure, @safe and nothrow ++ TypeOfBitPacked!Value opIndex()(Key key) const ++ { ++ static if(hasBoundsCheck) ++ assert(mapTrieIndex!Prefix(key) < maxIndex); ++ size_t idx; ++ alias p = Prefix; ++ idx = cast(size_t)p[0](key); ++ foreach(i, v; p[0..$-1]) ++ idx = cast(size_t)((_table.ptr!i[idx]< 0) ++ alias TypeTuple!(sliceBits!(top - sizes[0], top) ++ , GetBitSlicing!(top - sizes[0], sizes[1..$])) GetBitSlicing; ++ else ++ alias TypeTuple!() GetBitSlicing; ++} ++ ++template callableWith(T) ++{ ++ template callableWith(alias Pred) ++ { ++ static if(!is(typeof(Pred(T.init)))) ++ enum callableWith = false; ++ else ++ { ++ alias Result = typeof(Pred(T.init)); ++ enum callableWith = isBitPackableType!(TypeOfBitPacked!(Result)); ++ } ++ } ++} ++ ++/* ++ Check if $(D Prefix) is a valid set of predicates ++ for $(D Trie) template having $(D Key) as the type of keys. ++ This requires all predicates to be callable, take ++ single argument of type $(D Key) and return unsigned value. ++*/ ++template isValidPrefixForTrie(Key, Prefix...) ++{ ++ enum isValidPrefixForTrie = allSatisfy!(callableWith!Key, Prefix); // TODO: tighten the screws ++} ++ ++/* ++ Check if $(D Args) is a set of maximum key value followed by valid predicates ++ for $(D Trie) template having $(D Key) as the type of keys. ++*/ ++template isValidArgsForTrie(Key, Args...) ++{ ++ static if(Args.length > 1) ++ { ++ enum isValidArgsForTrie = isValidPrefixForTrie!(Key, Args) ++ || (isValidPrefixForTrie!(Key, Args[1..$]) && is(typeof(Args[0]) : Key)); ++ } ++ else ++ enum isValidArgsForTrie = isValidPrefixForTrie!Args; ++} ++ ++@property size_t sumOfIntegerTuple(ints...)() ++{ ++ size_t count=0; ++ foreach(v; ints) ++ count += v; ++ return count; ++} ++ ++/** ++ A shorthand for creating a custom multi-level fixed Trie ++ from a $(D CodepointSet). $(D sizes) are numbers of bits per level, ++ with the most significant bits used first. ++ ++ Note: The sum of $(D sizes) must be equal 21. ++ ++ See_Also: $(LREF toTrie), which is even simpler. ++ ++ Example: ++ --- ++ { ++ import std.stdio; ++ auto set = unicode("Number"); ++ auto trie = codepointSetTrie!(8, 5, 8)(set); ++ writeln("Input code points to test:"); ++ foreach(line; stdin.byLine) ++ { ++ int count=0; ++ foreach(dchar ch; line) ++ if(trie[ch])// is number ++ count++; ++ writefln("Contains %d number code points.", count); ++ } ++ } ++ --- ++*/ ++public template codepointSetTrie(sizes...) ++ if(sumOfIntegerTuple!sizes == 21) ++{ ++ auto codepointSetTrie(Set)(Set set) ++ if(isCodepointSet!Set) ++ { ++ auto builder = TrieBuilder!(bool, dchar, lastDchar+1, GetBitSlicing!(21, sizes))(false); ++ foreach(ival; set.byInterval) ++ builder.putRange(ival[0], ival[1], true); ++ return builder.build(); ++ } ++} ++ ++/// Type of Trie generated by codepointSetTrie function. ++public template CodepointSetTrie(sizes...) ++ if(sumOfIntegerTuple!sizes == 21) ++{ ++ alias Prefix = GetBitSlicing!(21, sizes); ++ alias CodepointSetTrie = typeof(TrieBuilder!(bool, dchar, lastDchar+1, Prefix)(false).build()); ++} ++ ++/** ++ A slightly more general tool for building fixed $(D Trie) ++ for the Unicode data. ++ ++ Specifically unlike $(D codepointSetTrie) it's allows creating mappings ++ of $(D dchar) to an arbitrary type $(D T). ++ ++ Note: Overload taking $(D CodepointSet)s will naturally convert ++ only to bool mapping $(D Trie)s. ++ ++ Example: ++ --- ++ // pick characters from the Greek script ++ auto set = unicode.Greek; ++ ++ // a user-defined property (or an expensive function) ++ // that we want to look up ++ static uint luckFactor(dchar ch) ++ { ++ // here we consider a character lucky ++ // if its code point has a lot of identical hex-digits ++ // e.g. arabic letter DDAL (\u0688) has a "luck factor" of 2 ++ ubyte[6] nibbles; // 6 4-bit chunks of code point ++ uint value = ch; ++ foreach(i; 0..6) ++ { ++ nibbles[i] = value & 0xF; ++ value >>= 4; ++ } ++ uint luck; ++ foreach(n; nibbles) ++ luck = cast(uint)max(luck, count(nibbles[], n)); ++ return luck; ++ } ++ ++ // only unsigned built-ins are supported at the moment ++ alias LuckFactor = BitPacked!(uint, 3); ++ ++ // create a temporary associative array (AA) ++ LuckFactor[dchar] map; ++ foreach(ch; set.byCodepoint) ++ map[ch] = luckFactor(ch); ++ ++ // bits per stage are chosen randomly, fell free to optimize ++ auto trie = codepointTrie!(LuckFactor, 8, 5, 8)(map); ++ ++ // from now on the AA is not needed ++ foreach(ch; set.byCodepoint) ++ assert(trie[ch] == luckFactor(ch)); // verify ++ // CJK is not Greek, thus it has the default value ++ assert(trie['\u4444'] == 0); ++ // and here is a couple of quite lucky Greek characters: ++ // Greek small letter epsilon with dasia ++ assert(trie['\u1F11'] == 3); ++ // Ancient Greek metretes sign ++ assert(trie['\U00010181'] == 3); ++ --- ++*/ ++public template codepointTrie(T, sizes...) ++ if(sumOfIntegerTuple!sizes == 21) ++{ ++ alias Prefix = GetBitSlicing!(21, sizes); ++ ++ static if(is(TypeOfBitPacked!T == bool)) ++ { ++ auto codepointTrie(Set)(in Set set) ++ if(isCodepointSet!Set) ++ { ++ return codepointSetTrie(set); ++ } ++ } ++ ++ auto codepointTrie()(T[dchar] map, T defValue=T.init) ++ { ++ return buildTrie!(T, dchar, Prefix)(map, defValue); ++ } ++ ++ // unsorted range of pairs ++ auto codepointTrie(R)(R range, T defValue=T.init) ++ if(isInputRange!R ++ && is(typeof(ElementType!R.init[0]) : T) ++ && is(typeof(ElementType!R.init[1]) : dchar)) ++ { ++ // build from unsorted array of pairs ++ // TODO: expose index sorting functions for Trie ++ return buildTrie!(T, dchar, Prefix)(range, defValue, true); ++ } ++} ++ ++unittest // codepointTrie example ++{ ++ // pick characters from the Greek script ++ auto set = unicode.Greek; ++ ++ // a user-defined property (or an expensive function) ++ // that we want to look up ++ static uint luckFactor(dchar ch) ++ { ++ // here we consider a character lucky ++ // if its code point has a lot of identical hex-digits ++ // e.g. arabic letter DDAL (\u0688) has a "luck factor" of 2 ++ ubyte[6] nibbles; // 6 4-bit chunks of code point ++ uint value = ch; ++ foreach(i; 0..6) ++ { ++ nibbles[i] = value & 0xF; ++ value >>= 4; ++ } ++ uint luck; ++ foreach(n; nibbles) ++ luck = cast(uint)max(luck, count(nibbles[], n)); ++ return luck; ++ } ++ ++ // only unsigned built-ins are supported at the moment ++ alias LuckFactor = BitPacked!(uint, 3); ++ ++ // create a temporary associative array (AA) ++ LuckFactor[dchar] map; ++ foreach(ch; set.byCodepoint) ++ map[ch] = LuckFactor(luckFactor(ch)); ++ ++ // bits per stage are chosen randomly, fell free to optimize ++ auto trie = codepointTrie!(LuckFactor, 8, 5, 8)(map); ++ ++ // from now on the AA is not needed ++ foreach(ch; set.byCodepoint) ++ assert(trie[ch] == luckFactor(ch)); // verify ++ // CJK is not Greek, thus it has the default value ++ assert(trie['\u4444'] == 0); ++ // and here is a couple of quite lucky Greek characters: ++ // Greek small letter epsilon with dasia ++ assert(trie['\u1F11'] == 3); ++ // Ancient Greek metretes sign ++ assert(trie['\U00010181'] == 3); ++ ++} ++ ++/// Type of Trie as generated by codepointTrie function. ++public template CodepointTrie(T, sizes...) ++ if(sumOfIntegerTuple!sizes == 21) ++{ ++ alias Prefix = GetBitSlicing!(21, sizes); ++ alias CodepointTrie = typeof(TrieBuilder!(T, dchar, lastDchar+1, Prefix)(T.init).build()); ++} ++ ++// @@@BUG multiSort can's access private symbols from uni ++public template cmpK0(alias Pred) ++{ ++ static bool cmpK0(Value, Key) ++ (Tuple!(Value, Key) a, Tuple!(Value, Key) b) ++ { ++ return Pred(a[1]) < Pred(b[1]); ++ } ++} ++ ++/* ++ The most general utility for construction of $(D Trie)s ++ short of using $(D TrieBuilder) directly. ++ ++ Provides a number of convenience overloads. ++ $(D Args) is tuple of maximum key value followed by ++ predicates to construct index from key. ++ ++ Alternatively if the first argument is not a value convertible to $(D Key) ++ then the whole tuple of $(D Args) is treated as predicates ++ and the maximum Key is deduced from predicates. ++*/ ++public template buildTrie(Value, Key, Args...) ++ if(isValidArgsForTrie!(Key, Args)) ++{ ++ static if(is(typeof(Args[0]) : Key)) // prefix starts with upper bound on Key ++ { ++ alias Prefix = Args[1..$]; ++ } ++ else ++ alias Prefix = Args; ++ ++ alias getIndex = mapTrieIndex!(Prefix); ++ ++ // for multi-sort ++ template GetComparators(size_t n) ++ { ++ static if(n > 0) ++ alias GetComparators = ++ TypeTuple!(GetComparators!(n-1), cmpK0!(Prefix[n-1])); ++ else ++ alias GetComparators = TypeTuple!(); ++ } ++ ++ /* ++ Build $(D Trie) from a range of a Key-Value pairs, ++ assuming it is sorted by Key as defined by the following lambda: ++ ------ ++ (a, b) => mapTrieIndex!(Prefix)(a) < mapTrieIndex!(Prefix)(b) ++ ------ ++ Exception is thrown if it's detected that the above order doesn't hold. ++ ++ In other words $(LREF mapTrieIndex) should be a ++ monotonically increasing function that maps $(D Key) to an integer. ++ ++ See also: $(XREF _algorithm, sort), ++ $(XREF _range, SortedRange), ++ $(XREF _algorithm, setUnion). ++ */ ++ auto buildTrie(Range)(Range range, Value filler=Value.init) ++ if(isInputRange!Range && is(typeof(Range.init.front[0]) : Value) ++ && is(typeof(Range.init.front[1]) : Key)) ++ { ++ auto builder = TrieBuilder!(Value, Key, Prefix)(filler); ++ foreach(v; range) ++ builder.putValue(v[1], v[0]); ++ return builder.build(); ++ } ++ ++ /* ++ If $(D Value) is bool (or BitPacked!(bool, x)) then it's possible ++ to build $(D Trie) from a range of open-right intervals of $(D Key)s. ++ The requirement on the ordering of keys (and the behavior on the ++ violation of it) is the same as for Key-Value range overload. ++ ++ Intervals denote ranges of !$(D filler) i.e. the opposite of filler. ++ If no filler provided keys inside of the intervals map to true, ++ and $(D filler) is false. ++ */ ++ auto buildTrie(Range)(Range range, Value filler=Value.init) ++ if(is(TypeOfBitPacked!Value == bool) ++ && isInputRange!Range && is(typeof(Range.init.front[0]) : Key) ++ && is(typeof(Range.init.front[1]) : Key)) ++ { ++ auto builder = TrieBuilder!(Value, Key, Prefix)(filler); ++ foreach(ival; range) ++ builder.putRange(ival[0], ival[1], !filler); ++ return builder.build(); ++ } ++ ++ auto buildTrie(Range)(Range range, Value filler, bool unsorted) ++ if(isInputRange!Range ++ && is(typeof(Range.init.front[0]) : Value) ++ && is(typeof(Range.init.front[1]) : Key)) ++ { ++ alias Comps = GetComparators!(Prefix.length); ++ if(unsorted) ++ multiSort!(Comps)(range); ++ return buildTrie(range, filler); ++ } ++ ++ /* ++ If $(D Value) is bool (or BitPacked!(bool, x)) then it's possible ++ to build $(D Trie) simply from an input range of $(D Key)s. ++ The requirement on the ordering of keys (and the behavior on the ++ violation of it) is the same as for Key-Value range overload. ++ ++ Keys found in range denote !$(D filler) i.e. the opposite of filler. ++ If no filler provided keys map to true, and $(D filler) is false. ++ */ ++ auto buildTrie(Range)(Range range, Value filler=Value.init) ++ if(is(TypeOfBitPacked!Value == bool) ++ && isInputRange!Range && is(typeof(Range.init.front) : Key)) ++ { ++ auto builder = TrieBuilder!(Value, Key, Prefix)(filler); ++ foreach(v; range) ++ builder.putValue(v, !filler); ++ return builder.build(); ++ } ++ ++ /* ++ If $(D Key) is unsigned integer $(D Trie) could be constructed from array ++ of values where array index serves as key. ++ */ ++ auto buildTrie()(Value[] array, Value filler=Value.init) ++ if(isUnsigned!Key) ++ { ++ auto builder = TrieBuilder!(Value, Key, Prefix)(filler); ++ foreach(idx, v; array) ++ builder.putValue(idx, v); ++ return builder.build(); ++ } ++ ++ /* ++ Builds $(D Trie) from associative array. ++ */ ++ auto buildTrie(Key, Value)(Value[Key] map, Value filler=Value.init) ++ { ++ auto range = array(zip(map.values, map.keys)); ++ return buildTrie(range, filler, true); // sort it ++ } ++} ++ ++/++ ++ Convenience function to construct optimal configurations for ++ packed Trie from any $(D set) of $(CODEPOINTS). ++ ++ The parameter $(D level) indicates the number of trie levels to use, ++ allowed values are: 1, 2, 3 or 4. Levels represent different trade-offs ++ speed-size wise. ++ ++ $(P Level 1 is fastest and the most memory hungry (a bit array). ) ++ $(P Level 4 is the slowest and has the smallest footprint. ) ++ ++ See the $(S_LINK Synopsis, Synopsis) section for example. ++ ++ Note: ++ Level 4 stays very practical (being faster and more predictable) ++ compared to using direct lookup on the $(D set) itself. ++ ++ +++/ ++public auto toTrie(size_t level, Set)(Set set) ++ if(isCodepointSet!Set) ++{ ++ static if(level == 1) ++ return codepointSetTrie!(21)(set); ++ else static if(level == 2) ++ return codepointSetTrie!(10, 11)(set); ++ else static if(level == 3) ++ return codepointSetTrie!(8, 5, 8)(set); ++ else static if(level == 4) ++ return codepointSetTrie!(6, 4, 4, 7)(set); ++ else ++ static assert(false, ++ "Sorry, toTrie doesn't support levels > 4, use codepointSetTrie directly"); ++} ++ ++/** ++ $(P Builds a $(D Trie) with typically optimal speed-size trade-off ++ and wraps it into a delegate of the following type: ++ $(D bool delegate(dchar ch)). ) ++ ++ $(P Effectively this creates a 'tester' lambda suitable ++ for algorithms like std.algorithm.find that take unary predicates. ) ++ ++ See the $(S_LINK Synopsis, Synopsis) section for example. ++*/ ++public auto toDelegate(Set)(Set set) ++ if(isCodepointSet!Set) ++{ ++ // 3 is very small and is almost as fast as 2-level (due to CPU caches?) ++ auto t = toTrie!3(set); ++ return (dchar ch) => t[ch]; ++} ++ ++/** ++ $(P Opaque wrapper around unsigned built-in integers and ++ code unit (char/wchar/dchar) types. ++ Parameter $(D sz) indicates that the value is confined ++ to the range of [0, 2^^sz$(RPAREN). With this knowledge it can be ++ packed more tightly when stored in certain ++ data-structures like trie. ) ++ ++ Note: ++ $(P The $(D BitPacked!(T, sz)) is implicitly convertible to $(D T) ++ but not vise-versa. Users have to ensure the value fits in ++ the range required and use the $(D cast) ++ operator to perform the conversion.) ++*/ ++struct BitPacked(T, size_t sz) ++ if(isIntegral!T || is(T:dchar)) ++{ ++ enum bitSize = sz; ++ T _value; ++ alias _value this; ++} ++ ++/* ++ Depending on the form of the passed argument $(D bitSizeOf) returns ++ the amount of bits required to represent a given type ++ or a return type of a given functor. ++*/ ++template bitSizeOf(Args...) ++ if(Args.length == 1) ++{ ++ alias T = Args[0]; ++ static if(__traits(compiles, { size_t val = T.bitSize; })) //(is(typeof(T.bitSize) : size_t)) ++ { ++ enum bitSizeOf = T.bitSize; ++ } ++ else static if(is(ReturnType!T dummy == BitPacked!(U, bits), U, size_t bits)) ++ { ++ enum bitSizeOf = bitSizeOf!(ReturnType!T); ++ } ++ else ++ { ++ enum bitSizeOf = T.sizeof*8; ++ } ++} ++ ++/** ++ Tests if $(D T) is some instantiation of $(LREF BitPacked)!(U, x) ++ and thus suitable for packing. ++*/ ++template isBitPacked(T) ++{ ++ static if(is(T dummy == BitPacked!(U, bits), U, size_t bits)) ++ enum isBitPacked = true; ++ else ++ enum isBitPacked = false; ++} ++ ++/** ++ Gives the type $(D U) from $(LREF BitPacked)!(U, x) ++ or $(D T) itself for every other type. ++*/ ++template TypeOfBitPacked(T) ++{ ++ static if(is(T dummy == BitPacked!(U, bits), U, size_t bits)) ++ alias TypeOfBitPacked = U; ++ else ++ alias TypeOfBitPacked = T; ++} ++ ++/* ++ Wrapper, used in definition of custom data structures from $(D Trie) template. ++ Applying it to a unary lambda function indicates that the returned value always ++ fits within $(D bits) of bits. ++*/ ++struct assumeSize(alias Fn, size_t bits) ++{ ++ enum bitSize = bits; ++ static auto ref opCall(T)(auto ref T arg) ++ { ++ return Fn(arg); ++ } ++} ++ ++/* ++ A helper for defining lambda function that yields a slice ++ of certain bits from an unsigned integral value. ++ The resulting lambda is wrapped in assumeSize and can be used directly ++ with $(D Trie) template. ++*/ ++struct sliceBits(size_t from, size_t to) ++{ ++ //for now bypass assumeSize, DMD has trouble inlining it ++ enum bitSize = to-from; ++ static auto opCall(T)(T x) ++ out(result) ++ { ++ assert(result < (1<> from) & ((1<<(to-from))-1); ++ } ++} ++ ++uint low_8(uint x) { return x&0xFF; } ++@safe pure nothrow uint midlow_8(uint x){ return (x&0xFF00)>>8; } ++alias assumeSize!(low_8, 8) lo8; ++alias assumeSize!(midlow_8, 8) mlo8; ++ ++static assert(bitSizeOf!lo8 == 8); ++static assert(bitSizeOf!(sliceBits!(4, 7)) == 3); ++static assert(bitSizeOf!(BitPacked!(uint, 2)) == 2); ++ ++template Sequence(size_t start, size_t end) ++{ ++ static if(start < end) ++ alias TypeTuple!(start, Sequence!(start+1, end)) Sequence; ++ else ++ alias TypeTuple!() Sequence; ++} ++ ++//---- TRIE TESTS ---- ++unittest ++{ ++ static trieStats(TRIE)(TRIE t) ++ { ++ version(std_uni_stats) ++ { ++ import std.stdio; ++ writeln("---TRIE FOOTPRINT STATS---"); ++ foreach(i; Sequence!(0, t.table.dim) ) ++ { ++ writefln("lvl%s = %s bytes; %s pages" ++ , i, t.bytes!i, t.pages!i); ++ } ++ writefln("TOTAL: %s bytes", t.bytes); ++ version(none) ++ { ++ writeln("INDEX (excluding value level):"); ++ foreach(i; Sequence!(0, t.table.dim-1) ) ++ writeln(t.table.slice!(i)[0..t.table.length!i]); ++ } ++ writeln("---------------------------"); ++ } ++ } ++ //@@@BUG link failure, lambdas not found by linker somehow (in case of trie2) ++ // alias assumeSize!(8, function (uint x) { return x&0xFF; }) lo8; ++ // alias assumeSize!(7, function (uint x) { return (x&0x7F00)>>8; }) next8; ++ alias CodepointSet Set; ++ auto set = Set('A','Z','a','z'); ++ auto trie = buildTrie!(bool, uint, 256, lo8)(set.byInterval);// simple bool array ++ for(int a='a'; a<'z';a++) ++ assert(trie[a]); ++ for(int a='A'; a<'Z';a++) ++ assert(trie[a]); ++ for(int a=0; a<'A'; a++) ++ assert(!trie[a]); ++ for(int a ='Z'; a<'a'; a++) ++ assert(!trie[a]); ++ trieStats(trie); ++ ++ auto redundant2 = Set( ++ 1, 18, 256+2, 256+111, 512+1, 512+18, 768+2, 768+111); ++ auto trie2 = buildTrie!(bool, uint, 1024, mlo8, lo8)(redundant2.byInterval); ++ trieStats(trie2); ++ foreach(e; redundant2.byCodepoint) ++ assert(trie2[e], text(cast(uint)e, " - ", trie2[e])); ++ foreach(i; 0..1024) ++ { ++ assert(trie2[i] == (i in redundant2)); ++ } ++ ++ ++ auto redundant3 = Set( ++ 2, 4, 6, 8, 16, ++ 2+16, 4+16, 16+6, 16+8, 16+16, ++ 2+32, 4+32, 32+6, 32+8, ++ ); ++ ++ enum max3 = 256; ++ // sliceBits ++ auto trie3 = buildTrie!(bool, uint, max3, ++ sliceBits!(6,8), sliceBits!(4,6), sliceBits!(0,4) ++ )(redundant3.byInterval); ++ trieStats(trie3); ++ foreach(i; 0..max3) ++ assert(trie3[i] == (i in redundant3), text(cast(uint)i)); ++ ++ auto redundant4 = Set( ++ 10, 64, 64+10, 128, 128+10, 256, 256+10, 512, ++ 1000, 2000, 3000, 4000, 5000, 6000 ++ ); ++ enum max4 = 2^^16; ++ auto trie4 = buildTrie!(bool, size_t, max4, ++ sliceBits!(13, 16), sliceBits!(9, 13), sliceBits!(6, 9) , sliceBits!(0, 6) ++ )(redundant4.byInterval); ++ foreach(i; 0..max4){ ++ if(i in redundant4) ++ assert(trie4[i], text(cast(uint)i)); ++ } ++ trieStats(trie4); ++ ++ alias mapToS = mapTrieIndex!(useItemAt!(0, char)); ++ string[] redundantS = ["tea", "start", "orange"]; ++ redundantS.sort!((a,b) => mapToS(a) < mapToS(b))(); ++ auto strie = buildTrie!(bool, string, useItemAt!(0, char))(redundantS); ++ // using first char only ++ assert(redundantS == ["orange", "start", "tea"]); ++ assert(strie["test"], text(strie["test"])); ++ assert(!strie["aea"]); ++ assert(strie["s"]); ++ ++ // a bit size test ++ auto a = array(map!(x => to!ubyte(x))(iota(0, 256))); ++ auto bt = buildTrie!(bool, ubyte, sliceBits!(7, 8), sliceBits!(5, 7), sliceBits!(0, 5))(a); ++ trieStats(bt); ++ foreach(i; 0..256) ++ assert(bt[cast(ubyte)i]); ++} ++ ++template useItemAt(size_t idx, T) ++ if(isIntegral!T || is(T: dchar)) ++{ ++ size_t impl(in T[] arr){ return arr[idx]; } ++ alias useItemAt = assumeSize!(impl, 8*T.sizeof); ++} ++ ++template useLastItem(T) ++{ ++ size_t impl(in T[] arr){ return arr[$-1]; } ++ alias useLastItem = assumeSize!(impl, 8*T.sizeof); ++} ++ ++template fullBitSize(Prefix...) ++{ ++ static if(Prefix.length > 0) ++ enum fullBitSize = bitSizeOf!(Prefix[0])+fullBitSize!(Prefix[1..$]); ++ else ++ enum fullBitSize = 0; ++} ++ ++template idxTypes(Key, size_t fullBits, Prefix...) ++{ ++ static if(Prefix.length == 1) ++ {// the last level is value level, so no index once reduced to 1-level ++ alias TypeTuple!() idxTypes; ++ } ++ else ++ { ++ // Important note on bit packing ++ // Each level has to hold enough of bits to address the next one ++ // The bottom level is known to hold full bit width ++ // thus it's size in pages is full_bit_width - size_of_last_prefix ++ // Recourse on this notion ++ alias TypeTuple!( ++ idxTypes!(Key, fullBits - bitSizeOf!(Prefix[$-1]), Prefix[0..$-1]), ++ BitPacked!(typeof(Prefix[$-2](Key.init)), fullBits - bitSizeOf!(Prefix[$-1])) ++ ) idxTypes; ++ } ++} ++ ++//============================================================================ ++ ++@trusted int comparePropertyName(Char1, Char2)(const(Char1)[] a, const(Char2)[] b) ++{ ++ alias low = std.ascii.toLower; ++ return cmp( ++ a.map!(x => low(x))() ++ .filter!(x => !isWhite(x) && x != '-' && x != '_')(), ++ b.map!(x => low(x))() ++ .filter!(x => !isWhite(x) && x != '-' && x != '_')() ++ ); ++} ++ ++bool propertyNameLess(Char1, Char2)(const(Char1)[] a, const(Char2)[] b) ++{ ++ return comparePropertyName(a, b) < 0; ++} ++ ++//============================================================================ ++// Utilities for compression of Unicode code point sets ++//============================================================================ ++ ++@safe void compressTo(uint val, ref ubyte[] arr) pure nothrow ++{ ++ // not optimized as usually done 1 time (and not public interface) ++ if(val < 128) ++ arr ~= cast(ubyte)val; ++ else if(val < (1<<13)) ++ { ++ arr ~= (0b1_00<<5) | cast(ubyte)(val>>8); ++ arr ~= val & 0xFF; ++ } ++ else ++ { ++ assert(val < (1<<21)); ++ arr ~= (0b1_01<<5) | cast(ubyte)(val>>16); ++ arr ~= (val >> 8) & 0xFF; ++ arr ~= val & 0xFF; ++ } ++} ++ ++@safe uint decompressFrom(const(ubyte)[] arr, ref size_t idx) pure ++{ ++ uint first = arr[idx++]; ++ if(!(first & 0x80)) // no top bit -> [0..127] ++ return first; ++ uint extra = ((first>>5) & 1) + 1; // [1, 2] ++ uint val = (first & 0x1F); ++ enforce(idx + extra <= arr.length, "bad code point interval encoding"); ++ foreach(j; 0..extra) ++ val = (val<<8) | arr[idx+j]; ++ idx += extra; ++ return val; ++} ++ ++ ++package ubyte[] compressIntervals(Range)(Range intervals) ++ if(isInputRange!Range && isIntegralPair!(ElementType!Range)) ++{ ++ ubyte[] storage; ++ uint base = 0; ++ // RLE encode ++ foreach(val; intervals) ++ { ++ compressTo(val[0]-base, storage); ++ base = val[0]; ++ if(val[1] != lastDchar+1) // till the end of the domain so don't store it ++ { ++ compressTo(val[1]-base, storage); ++ base = val[1]; ++ } ++ } ++ return storage; ++} ++ ++unittest ++{ ++ auto run = [tuple(80, 127), tuple(128, (1<<10)+128)]; ++ ubyte[] enc = [cast(ubyte)80, 47, 1, (0b1_00<<5) | (1<<2), 0]; ++ assert(compressIntervals(run) == enc); ++ auto run2 = [tuple(0, (1<<20)+512+1), tuple((1<<20)+512+4, lastDchar+1)]; ++ ubyte[] enc2 = [cast(ubyte)0, (0b1_01<<5) | (1<<4), 2, 1, 3]; // odd length-ed ++ assert(compressIntervals(run2) == enc2); ++ size_t idx = 0; ++ assert(decompressFrom(enc, idx) == 80); ++ assert(decompressFrom(enc, idx) == 47); ++ assert(decompressFrom(enc, idx) == 1); ++ assert(decompressFrom(enc, idx) == (1<<10)); ++ idx = 0; ++ assert(decompressFrom(enc2, idx) == 0); ++ assert(decompressFrom(enc2, idx) == (1<<20)+512+1); ++ assert(equalS(decompressIntervals(compressIntervals(run)), run)); ++ assert(equalS(decompressIntervals(compressIntervals(run2)), run2)); ++} ++ ++// Creates a range of $(D CodepointInterval) that lazily decodes compressed data. ++@safe package auto decompressIntervals(const(ubyte)[] data) ++{ ++ return DecompressedIntervals(data); ++} ++ ++@trusted struct DecompressedIntervals ++{ ++ const(ubyte)[] _stream; ++ size_t _idx; ++ CodepointInterval _front; ++ ++ this(const(ubyte)[] stream) ++ { ++ _stream = stream; ++ popFront(); ++ } ++ ++ @property CodepointInterval front() ++ { ++ assert(!empty); ++ return _front; ++ } ++ ++ void popFront() ++ { ++ if(_idx == _stream.length) ++ { ++ _idx = size_t.max; ++ return; ++ } ++ uint base = _front[1]; ++ _front[0] = base + decompressFrom(_stream, _idx); ++ if(_idx == _stream.length)// odd length ---> till the end ++ _front[1] = lastDchar+1; ++ else ++ { ++ base = _front[0]; ++ _front[1] = base + decompressFrom(_stream, _idx); ++ } ++ } ++ ++ @property bool empty() const ++ { ++ return _idx == size_t.max; ++ } ++ ++ @property DecompressedIntervals save() { return this; } ++} ++ ++static assert(isInputRange!DecompressedIntervals); ++static assert(isForwardRange!DecompressedIntervals); ++//============================================================================ ++ ++version(std_uni_bootstrap){} ++else ++{ ++ ++// helper for looking up code point sets ++@trusted ptrdiff_t findUnicodeSet(alias table, C)(in C[] name) ++{ ++ auto range = assumeSorted!((a,b) => propertyNameLess(a,b)) ++ (table.map!"a.name"()); ++ size_t idx = range.lowerBound(name).length; ++ if(idx < range.length && comparePropertyName(range[idx], name) == 0) ++ return idx; ++ return -1; ++} ++ ++// another one that loads it ++@trusted bool loadUnicodeSet(alias table, Set, C)(in C[] name, ref Set dest) ++{ ++ auto idx = findUnicodeSet!table(name); ++ if(idx >= 0) ++ { ++ dest = Set(asSet(table[idx].compressed)); ++ return true; ++ } ++ return false; ++} ++ ++@trusted bool loadProperty(Set=CodepointSet, C) ++ (in C[] name, ref Set target) ++{ ++ alias comparePropertyName ucmp; ++ // conjure cumulative properties by hand ++ if(ucmp(name, "L") == 0 || ucmp(name, "Letter") == 0) ++ { ++ target |= asSet(uniProps.Lu); ++ target |= asSet(uniProps.Ll); ++ target |= asSet(uniProps.Lt); ++ target |= asSet(uniProps.Lo); ++ target |= asSet(uniProps.Lm); ++ } ++ else if(ucmp(name,"LC") == 0 || ucmp(name,"Cased Letter")==0) ++ { ++ target |= asSet(uniProps.Ll); ++ target |= asSet(uniProps.Lu); ++ target |= asSet(uniProps.Lt);// Title case ++ } ++ else if(ucmp(name, "M") == 0 || ucmp(name, "Mark") == 0) ++ { ++ target |= asSet(uniProps.Mn); ++ target |= asSet(uniProps.Mc); ++ target |= asSet(uniProps.Me); ++ } ++ else if(ucmp(name, "N") == 0 || ucmp(name, "Number") == 0) ++ { ++ target |= asSet(uniProps.Nd); ++ target |= asSet(uniProps.Nl); ++ target |= asSet(uniProps.No); ++ } ++ else if(ucmp(name, "P") == 0 || ucmp(name, "Punctuation") == 0) ++ { ++ target |= asSet(uniProps.Pc); ++ target |= asSet(uniProps.Pd); ++ target |= asSet(uniProps.Ps); ++ target |= asSet(uniProps.Pe); ++ target |= asSet(uniProps.Pi); ++ target |= asSet(uniProps.Pf); ++ target |= asSet(uniProps.Po); ++ } ++ else if(ucmp(name, "S") == 0 || ucmp(name, "Symbol") == 0) ++ { ++ target |= asSet(uniProps.Sm); ++ target |= asSet(uniProps.Sc); ++ target |= asSet(uniProps.Sk); ++ target |= asSet(uniProps.So); ++ } ++ else if(ucmp(name, "Z") == 0 || ucmp(name, "Separator") == 0) ++ { ++ target |= asSet(uniProps.Zs); ++ target |= asSet(uniProps.Zl); ++ target |= asSet(uniProps.Zp); ++ } ++ else if(ucmp(name, "C") == 0 || ucmp(name, "Other") == 0) ++ { ++ target |= asSet(uniProps.Co); ++ target |= asSet(uniProps.Lo); ++ target |= asSet(uniProps.No); ++ target |= asSet(uniProps.So); ++ target |= asSet(uniProps.Po); ++ } ++ else if(ucmp(name, "graphical") == 0){ ++ target |= asSet(uniProps.Alphabetic); ++ ++ target |= asSet(uniProps.Mn); ++ target |= asSet(uniProps.Mc); ++ target |= asSet(uniProps.Me); ++ ++ target |= asSet(uniProps.Nd); ++ target |= asSet(uniProps.Nl); ++ target |= asSet(uniProps.No); ++ ++ target |= asSet(uniProps.Pc); ++ target |= asSet(uniProps.Pd); ++ target |= asSet(uniProps.Ps); ++ target |= asSet(uniProps.Pe); ++ target |= asSet(uniProps.Pi); ++ target |= asSet(uniProps.Pf); ++ target |= asSet(uniProps.Po); ++ ++ target |= asSet(uniProps.Zs); ++ ++ target |= asSet(uniProps.Sm); ++ target |= asSet(uniProps.Sc); ++ target |= asSet(uniProps.Sk); ++ target |= asSet(uniProps.So); ++ } ++ else if(ucmp(name, "any") == 0) ++ target = Set(0,0x110000); ++ else if(ucmp(name, "ascii") == 0) ++ target = Set(0,0x80); ++ else ++ return loadUnicodeSet!(uniProps.tab)(name, target); ++ return true; ++} ++ ++// CTFE-only helper for checking property names at compile-time ++@safe bool isPrettyPropertyName(C)(in C[] name) ++{ ++ auto names = [ ++ "L", "Letters", ++ "LC", "Cased Letter", ++ "M", "Mark", ++ "N", "Number", ++ "P", "Punctuation", ++ "S", "Symbol", ++ "Z", "Separator" ++ "Graphical", ++ "any", ++ "ascii" ++ ]; ++ auto x = find!(x => comparePropertyName(x, name) == 0)(names); ++ return !x.empty; ++} ++ ++// ditto, CTFE-only, not optimized ++@safe private static bool findSetName(alias table, C)(in C[] name) ++{ ++ return findUnicodeSet!table(name) >= 0; ++} ++ ++template SetSearcher(alias table, string kind) ++{ ++ /// Run-time checked search. ++ static auto opCall(C)(in C[] name) ++ if(is(C : dchar)) ++ { ++ CodepointSet set; ++ if(loadUnicodeSet!table(name, set)) ++ return set; ++ throw new Exception("No unicode set for "~kind~" by name " ++ ~name.to!string()~" was found."); ++ } ++ /// Compile-time checked search. ++ static @property auto opDispatch(string name)() ++ { ++ static if(findSetName!table(name)) ++ { ++ CodepointSet set; ++ loadUnicodeSet!table(name, set); ++ return set; ++ } ++ else ++ static assert(false, "No unicode set for "~kind~" by name " ++ ~name~" was found."); ++ } ++} ++ ++/** ++ A single entry point to lookup Unicode $(CODEPOINT) sets by name or alias of ++ a block, script or general category. ++ ++ It uses well defined standard rules of property name lookup. ++ This includes fuzzy matching of names, so that ++ 'White_Space', 'white-SpAce' and 'whitespace' are all considered equal ++ and yield the same set of white space $(CHARACTERS). ++*/ ++@safe public struct unicode ++{ ++ /** ++ Performs the lookup of set of $(CODEPOINTS) ++ with compile-time correctness checking. ++ This short-cut version combines 3 searches: ++ across blocks, scripts, and common binary properties. ++ ++ Note that since scripts and blocks overlap the ++ usual trick to disambiguate is used - to get a block use ++ $(D unicode.InBlockName), to search a script ++ use $(D unicode.ScriptName). ++ ++ See also $(LREF block), $(LREF script) ++ and (not included in this search) $(LREF hangulSyllableType). ++ ++ Example: ++ --- ++ auto ascii = unicode.ASCII; ++ assert(ascii['A']); ++ assert(ascii['~']); ++ assert(!ascii['\u00e0']); ++ // matching is case-insensitive ++ assert(ascii == unicode.ascII); ++ assert(!ascii['à']); ++ // underscores, '-' and whitespace in names are ignored too ++ auto latin = unicode.in_latin1_Supplement; ++ assert(latin['à']); ++ assert(!latin['$']); ++ // BTW Latin 1 Supplement is a block, hence "In" prefix ++ assert(latin == unicode("In Latin 1 Supplement")); ++ import std.exception; ++ // run-time look up throws if no such set is found ++ assert(collectException(unicode("InCyrilliac"))); ++ --- ++ */ ++ ++ static @property auto opDispatch(string name)() ++ { ++ static if(findAny(name)) ++ return loadAny(name); ++ else ++ static assert(false, "No unicode set by name "~name~" was found."); ++ } ++ ++ /** ++ The same lookup across blocks, scripts, or binary properties, ++ but performed at run-time. ++ This version is provided for cases where $(D name) ++ is not known beforehand; otherwise compile-time ++ checked $(LREF opDispatch) is typically a better choice. ++ ++ See the $(S_LINK Unicode properties, table of properties) for available ++ sets. ++ */ ++ static auto opCall(C)(in C[] name) ++ if(is(C : dchar)) ++ { ++ return loadAny(name); ++ } ++ ++ /** ++ Narrows down the search for sets of $(CODEPOINTS) to all Unicode blocks. ++ ++ See also $(S_LINK Unicode properties, table of properties). ++ ++ Note: ++ Here block names are unambiguous as no scripts are searched ++ and thus to search use simply $(D unicode.block.BlockName) notation. ++ ++ See $(S_LINK Unicode properties, table of properties) for available sets. ++ ++ Example: ++ --- ++ // use .block for explicitness ++ assert(unicode.block.Greek_and_Coptic == unicode.InGreek_and_Coptic); ++ --- ++ */ ++ struct block ++ { ++ mixin SetSearcher!(blocks.tab, "block"); ++ } ++ ++ /** ++ Narrows down the search for sets of $(CODEPOINTS) to all Unicode scripts. ++ ++ See the $(S_LINK Unicode properties, table of properties) for available ++ sets. ++ ++ Example: ++ --- ++ auto arabicScript = unicode.script.arabic; ++ auto arabicBlock = unicode.block.arabic; ++ // there is an intersection between script and block ++ assert(arabicBlock['؁']); ++ assert(arabicScript['؁']); ++ // but they are different ++ assert(arabicBlock != arabicScript); ++ assert(arabicBlock == unicode.inArabic); ++ assert(arabicScript == unicode.arabic); ++ --- ++ */ ++ struct script ++ { ++ mixin SetSearcher!(scripts.tab, "script"); ++ } ++ ++ /** ++ Fetch a set of $(CODEPOINTS) that have the given hangul syllable type. ++ ++ Other non-binary properties (once supported) follow the same ++ notation - $(D unicode.propertyName.propertyValue) for compile-time ++ checked access and $(D unicode.propertyName(propertyValue)) ++ for run-time checked one. ++ ++ See the $(S_LINK Unicode properties, table of properties) for available ++ sets. ++ ++ Example: ++ --- ++ // L here is syllable type not Letter as in unicode.L short-cut ++ auto leadingVowel = unicode.hangulSyllableType("L"); ++ // check that some leading vowels are present ++ foreach(vowel; '\u1110'..'\u115F') ++ assert(leadingVowel[vowel]); ++ assert(leadingVowel == unicode.hangulSyllableType.L); ++ --- ++ */ ++ struct hangulSyllableType ++ { ++ mixin SetSearcher!(hangul.tab, "hangul syllable type"); ++ } ++ ++private: ++ alias ucmp = comparePropertyName; ++ ++ static bool findAny(string name) ++ { ++ return isPrettyPropertyName(name) ++ || findSetName!(uniProps.tab)(name) || findSetName!(scripts.tab)(name) ++ || (ucmp(name[0..2],"In") == 0 && findSetName!(blocks.tab)(name[2..$])); ++ } ++ ++ static auto loadAny(Set=CodepointSet, C)(in C[] name) ++ { ++ Set set; ++ bool loaded = loadProperty(name, set) || loadUnicodeSet!(scripts.tab)(name, set) ++ || (ucmp(name[0..2],"In") == 0 ++ && loadUnicodeSet!(blocks.tab)(name[2..$], set)); ++ if(loaded) ++ return set; ++ throw new Exception("No unicode set by name "~name.to!string()~" was found."); ++ } ++ ++ // FIXME: re-disable once the compiler is fixed ++ // Disabled to prevent the mistake of creating instances of this pseudo-struct. ++ //@disable ~this(); ++} ++ ++unittest ++{ ++ auto ascii = unicode.ASCII; ++ assert(ascii['A']); ++ assert(ascii['~']); ++ assert(!ascii['\u00e0']); ++ // matching is case-insensitive ++ assert(ascii == unicode.ascII); ++ assert(!ascii['à']); ++ // underscores, '-' and whitespace in names are ignored too ++ auto latin = unicode.Inlatin1_Supplement; ++ assert(latin['à']); ++ assert(!latin['$']); ++ // BTW Latin 1 Supplement is a block, hence "In" prefix ++ assert(latin == unicode("In Latin 1 Supplement")); ++ import std.exception; ++ // R-T look up throws if no such set is found ++ assert(collectException(unicode("InCyrilliac"))); ++ ++ assert(unicode.block.Greek_and_Coptic == unicode.InGreek_and_Coptic); ++ ++ // L here is explicitly syllable type not "Letter" as in unicode.L ++ auto leadingVowel = unicode.hangulSyllableType("L"); ++ // check that some leading vowels are present ++ foreach(vowel; '\u1110'..'\u115F'+1) ++ assert(leadingVowel[vowel]); ++ assert(leadingVowel == unicode.hangulSyllableType.L); ++ ++ auto arabicScript = unicode.script.arabic; ++ auto arabicBlock = unicode.block.arabic; ++ // there is an intersection between script and block ++ assert(arabicBlock['؁']); ++ assert(arabicScript['؁']); ++ // but they are different ++ assert(arabicBlock != arabicScript); ++ assert(arabicBlock == unicode.inArabic); ++ assert(arabicScript == unicode.arabic); ++} ++ ++unittest ++{ ++ assert(unicode("InHebrew") == asSet(blocks.Hebrew)); ++ assert(unicode("separator") == (asSet(uniProps.Zs) | asSet(uniProps.Zl) | asSet(uniProps.Zp))); ++ assert(unicode("In-Kharoshthi") == asSet(blocks.Kharoshthi)); ++} ++ ++enum EMPTY_CASE_TRIE = ushort.max;// from what gen_uni uses internally ++ ++// control - '\r' ++enum controlSwitch = ` ++ case '\u0000':..case '\u0008':case '\u000E':..case '\u001F':case '\u007F':..case '\u0084':case '\u0086':..case '\u009F': case '\u0009':..case '\u000C': case '\u0085': ++`; ++// TODO: redo the most of hangul stuff algorithmically in case of Graphemes too ++// kill unrolled switches ++ ++private static bool isRegionalIndicator(dchar ch) ++{ ++ return ch >= '\U0001F1E6' && ch <= '\U0001F1FF'; ++} ++ ++template genericDecodeGrapheme(bool getValue) ++{ ++ alias graphemeExtend = graphemeExtendTrie; ++ alias spacingMark = mcTrie; ++ static if(getValue) ++ alias Grapheme Value; ++ else ++ alias void Value; ++ ++ Value genericDecodeGrapheme(Input)(ref Input range) ++ { ++ enum GraphemeState { ++ Start, ++ CR, ++ RI, ++ L, ++ V, ++ LVT ++ } ++ static if(getValue) ++ Grapheme grapheme; ++ auto state = GraphemeState.Start; ++ enum eat = q{ ++ static if(getValue) ++ grapheme ~= ch; ++ range.popFront(); ++ }; ++ ++ dchar ch; ++ assert(!range.empty, "Attempting to decode grapheme from an empty " ~ Input.stringof); ++ while(!range.empty) ++ { ++ ch = range.front; ++ final switch(state) with(GraphemeState) ++ { ++ case Start: ++ mixin(eat); ++ if(ch == '\r') ++ state = CR; ++ else if(isRegionalIndicator(ch)) ++ state = RI; ++ else if(isHangL(ch)) ++ state = L; ++ else if(hangLV[ch] || isHangV(ch)) ++ state = V; ++ else if(hangLVT[ch]) ++ state = LVT; ++ else if(isHangT(ch)) ++ state = LVT; ++ else ++ { ++ switch(ch) ++ { ++ mixin(controlSwitch); ++ goto L_End; ++ default: ++ goto L_End_Extend; ++ } ++ } ++ break; ++ case CR: ++ if(ch == '\n') ++ mixin(eat); ++ goto L_End_Extend; ++ case RI: ++ if(isRegionalIndicator(ch)) ++ mixin(eat); ++ else ++ goto L_End_Extend; ++ break; ++ case L: ++ if(isHangL(ch)) ++ mixin(eat); ++ else if(isHangV(ch) || hangLV[ch]) ++ { ++ state = V; ++ mixin(eat); ++ } ++ else if(hangLVT[ch]) ++ { ++ state = LVT; ++ mixin(eat); ++ } ++ else ++ goto L_End_Extend; ++ break; ++ case V: ++ if(isHangV(ch)) ++ mixin(eat); ++ else if(isHangT(ch)) ++ { ++ state = LVT; ++ mixin(eat); ++ } ++ else ++ goto L_End_Extend; ++ break; ++ case LVT: ++ if(isHangT(ch)) ++ { ++ mixin(eat); ++ } ++ else ++ goto L_End_Extend; ++ break; ++ } ++ } ++ L_End_Extend: ++ while(!range.empty) ++ { ++ ch = range.front; ++ // extend & spacing marks ++ if(!graphemeExtend[ch] && !spacingMark[ch]) ++ break; ++ mixin(eat); ++ } ++ L_End: ++ static if(getValue) ++ return grapheme; ++ } ++ ++} ++ ++@trusted: ++public: // Public API continues ++ ++/++ ++ Returns the length of grapheme cluster starting at $(D index). ++ Both the resulting length and the $(D index) are measured ++ in $(S_LINK Code unit, code units). ++ ++ Example: ++ --- ++ // ASCII as usual is 1 code unit, 1 code point etc. ++ assert(graphemeStride(" ", 1) == 1); ++ // A + combing ring above ++ string city = "A\u030Arhus"; ++ size_t first = graphemeStride(city, 0); ++ assert(first == 3); //\u030A has 2 UTF-8 code units ++ assert(city[0..first] == "A\u030A"); ++ assert(city[first..$] == "rhus"); ++ --- +++/ ++size_t graphemeStride(C)(in C[] input, size_t index) ++ if(is(C : dchar)) ++{ ++ auto src = input[index..$]; ++ auto n = src.length; ++ genericDecodeGrapheme!(false)(src); ++ return n - src.length; ++} ++ ++// for now tested separately see test_grapheme.d ++unittest ++{ ++ assert(graphemeStride(" ", 1) == 1); ++ // A + combing ring above ++ string city = "A\u030Arhus"; ++ size_t first = graphemeStride(city, 0); ++ assert(first == 3); //\u030A has 2 UTF-8 code units ++ assert(city[0..first] == "A\u030A"); ++ assert(city[first..$] == "rhus"); ++} ++ ++/++ ++ Reads one full grapheme cluster from an input range of dchar $(D inp). ++ ++ For examples see the $(LREF Grapheme) below. ++ ++ Note: ++ This function modifies $(D inp) and thus $(D inp) ++ must be an L-value. +++/ ++Grapheme decodeGrapheme(Input)(ref Input inp) ++ if(isInputRange!Input && is(Unqual!(ElementType!Input) == dchar)) ++{ ++ return genericDecodeGrapheme!true(inp); ++} ++ ++unittest ++{ ++ Grapheme gr; ++ string s = " \u0020\u0308 "; ++ gr = decodeGrapheme(s); ++ assert(gr.length == 1 && gr[0] == ' '); ++ gr = decodeGrapheme(s); ++ assert(gr.length == 2 && equalS(gr[0..2], " \u0308")); ++ s = "\u0300\u0308\u1100"; ++ assert(equalS(decodeGrapheme(s)[], "\u0300\u0308")); ++ assert(equalS(decodeGrapheme(s)[], "\u1100")); ++ s = "\u11A8\u0308\uAC01"; ++ assert(equalS(decodeGrapheme(s)[], "\u11A8\u0308")); ++ assert(equalS(decodeGrapheme(s)[], "\uAC01")); ++} ++ ++/++ ++ $(P A structure designed to effectively pack $(CHARACTERS) ++ of a $(CLUSTER). ++ ) ++ ++ $(P $(D Grapheme) has value semantics so 2 copies of a $(D Grapheme) ++ always refer to distinct objects. In most actual scenarios a $(D Grapheme) ++ fits on the stack and avoids memory allocation overhead for all but quite ++ long clusters. ++ ) ++ ++ Example: ++ --- ++ import std.algorithm; ++ string bold = "ku\u0308hn"; ++ ++ // note that decodeGrapheme takes parameter by ref ++ // slicing a grapheme yields a range of dchar ++ assert(decodeGrapheme(bold)[].equal("k")); ++ ++ // the next grapheme is 2 characters long ++ auto wideOne = decodeGrapheme(bold); ++ assert(wideOne.length == 2); ++ assert(wideOne[].equal("u\u0308")); ++ ++ // the usual range manipulation is possible ++ assert(wideOne[].filter!isMark.equal("\u0308")); ++ --- ++ $(P See also $(LREF decodeGrapheme), $(LREF graphemeStride). ) +++/ ++@trusted struct Grapheme ++{ ++public: ++ this(C)(in C[] chars...) ++ if(is(C : dchar)) ++ { ++ this ~= chars; ++ } ++ ++ this(Input)(Input seq) ++ if(!isDynamicArray!Input ++ && isInputRange!Input && is(ElementType!Input : dchar)) ++ { ++ this ~= seq; ++ } ++ ++ /// Gets a $(CODEPOINT) at the given index in this cluster. ++ dchar opIndex(size_t index) const pure nothrow ++ { ++ assert(index < length); ++ return read24(isBig ? ptr_ : small_.ptr, index); ++ } ++ ++ /++ ++ Writes a $(CODEPOINT) $(D ch) at given index in this cluster. ++ ++ Warning: ++ Use of this facility may invalidate grapheme cluster, ++ see also $(LREF Grapheme.valid). ++ ++ Example: ++ --- ++ auto g = Grapheme("A\u0302"); ++ assert(g[0] == 'A'); ++ assert(g.valid); ++ g[1] = '~'; // ASCII tilda is not a combining mark ++ assert(g[1] == '~'); ++ assert(!g.valid); ++ --- ++ +/ ++ void opIndexAssign(dchar ch, size_t index) pure nothrow ++ { ++ assert(index < length); ++ write24(isBig ? ptr_ : small_.ptr, ch, index); ++ } ++ ++ /++ ++ Random-access range over Grapheme's $(CHARACTERS). ++ ++ Warning: Invalidates when this Grapheme leaves the scope, ++ attempts to use it then would lead to memory corruption. ++ +/ ++ @system auto opSlice(size_t a, size_t b) pure nothrow ++ { ++ return sliceOverIndexed(a, b, &this); ++ } ++ ++ /// ditto ++ @system auto opSlice() pure nothrow ++ { ++ return sliceOverIndexed(0, length, &this); ++ } ++ ++ /// Grapheme cluster length in $(CODEPOINTS). ++ @property size_t length() const pure nothrow ++ { ++ return isBig ? len_ : slen_ & 0x7F; ++ } ++ ++ /++ ++ Append $(CHARACTER) $(D ch) to this grapheme. ++ Warning: ++ Use of this facility may invalidate grapheme cluster, ++ see also $(D valid). ++ ++ Example: ++ --- ++ auto g = Grapheme("A"); ++ assert(g.valid); ++ g ~= '\u0301'; ++ assert(g[].equal("A\u0301")); ++ assert(g.valid); ++ g ~= "B"; ++ // not a valid grapheme cluster anymore ++ assert(!g.valid); ++ // still could be useful though ++ assert(g[].equal("A\u0301B")); ++ --- ++ See also $(LREF Grapheme.valid) below. ++ +/ ++ ref opOpAssign(string op)(dchar ch) ++ { ++ static if(op == "~") ++ { ++ if(!isBig) ++ { ++ if(slen_ + 1 > small_cap) ++ convertToBig();// & fallthrough to "big" branch ++ else ++ { ++ write24(small_.ptr, ch, smallLength); ++ slen_++; ++ return this; ++ } ++ } ++ ++ assert(isBig); ++ if(len_ + 1 > cap_) ++ { ++ cap_ += grow; ++ ptr_ = cast(ubyte*)enforce(realloc(ptr_, 3*(cap_+1))); ++ } ++ write24(ptr_, ch, len_++); ++ return this; ++ } ++ else ++ static assert(false, "No operation "~op~" defined for Grapheme"); ++ } ++ ++ /// Append all $(CHARACTERS) from the input range $(D inp) to this Grapheme. ++ ref opOpAssign(string op, Input)(Input inp) ++ if(isInputRange!Input && is(ElementType!Input : dchar)) ++ { ++ static if(op == "~") ++ { ++ foreach(dchar ch; inp) ++ this ~= ch; ++ return this; ++ } ++ else ++ static assert(false, "No operation "~op~" defined for Grapheme"); ++ } ++ ++ /++ ++ True if this object contains valid extended grapheme cluster. ++ Decoding primitives of this module always return a valid $(D Grapheme). ++ ++ Appending to and direct manipulation of grapheme's $(CHARACTERS) may ++ render it no longer valid. Certain applications may chose to use ++ Grapheme as a "small string" of any $(CODEPOINTS) and ignore this property ++ entirely. ++ +/ ++ @property bool valid()() /*const*/ ++ { ++ auto r = this[]; ++ genericDecodeGrapheme!false(r); ++ return r.length == 0; ++ } ++ ++ this(this) ++ { ++ if(isBig) ++ {// dup it ++ auto raw_cap = 3*(cap_+1); ++ auto p = cast(ubyte*)enforce(malloc(raw_cap)); ++ p[0..raw_cap] = ptr_[0..raw_cap]; ++ ptr_ = p; ++ } ++ } ++ ++ ~this() ++ { ++ if(isBig) ++ { ++ free(ptr_); ++ } ++ } ++ ++ ++private: ++ enum small_bytes = ((ubyte*).sizeof+3*size_t.sizeof-1); ++ // "out of the blue" grow rate, needs testing ++ // (though graphemes are typically small < 9) ++ enum grow = 20; ++ enum small_cap = small_bytes/3; ++ enum small_flag = 0x80, small_mask = 0x7F; ++ // 16 bytes in 32bits, should be enough for the majority of cases ++ union ++ { ++ struct ++ { ++ ubyte* ptr_; ++ size_t cap_; ++ size_t len_; ++ size_t padding_; ++ } ++ struct ++ { ++ ubyte[small_bytes] small_; ++ ubyte slen_; ++ } ++ } ++ ++ void convertToBig() ++ { ++ size_t k = smallLength; ++ ubyte* p = cast(ubyte*)enforce(malloc(3*(grow+1))); ++ for(int i=0; i len_); ++ cap_ = grow; ++ setBig(); ++ } ++ ++ void setBig(){ slen_ |= small_flag; } ++ ++ @property size_t smallLength() pure nothrow ++ { ++ return slen_ & small_mask; ++ } ++ @property ubyte isBig() const pure nothrow ++ { ++ return slen_ & small_flag; ++ } ++} ++ ++static assert(Grapheme.sizeof == size_t.sizeof*4); ++ ++// verify the example ++unittest ++{ ++ import std.algorithm; ++ string bold = "ku\u0308hn"; ++ ++ // note that decodeGrapheme takes parameter by ref ++ auto first = decodeGrapheme(bold); ++ ++ assert(first.length == 1); ++ assert(first[0] == 'k'); ++ ++ // the next grapheme is 2 characters long ++ auto wideOne = decodeGrapheme(bold); ++ // slicing a grapheme yields a random-access range of dchar ++ assert(wideOne[].equalS("u\u0308")); ++ assert(wideOne.length == 2); ++ static assert(isRandomAccessRange!(typeof(wideOne[]))); ++ ++ // all of the usual range manipulation is possible ++ assert(wideOne[].filter!isMark().equalS("\u0308")); ++ ++ auto g = Grapheme("A"); ++ assert(g.valid); ++ g ~= '\u0301'; ++ assert(g[].equalS("A\u0301")); ++ assert(g.valid); ++ g ~= "B"; ++ // not a valid grapheme cluster anymore ++ assert(!g.valid); ++ // still could be useful though ++ assert(g[].equalS("A\u0301B")); ++} ++ ++unittest ++{ ++ auto g = Grapheme("A\u0302"); ++ assert(g[0] == 'A'); ++ assert(g.valid); ++ g[1] = '~'; // ASCII tilda is not a combining mark ++ assert(g[1] == '~'); ++ assert(!g.valid); ++} ++ ++unittest ++{ ++ // not valid clusters (but it just a test) ++ auto g = Grapheme('a', 'b', 'c', 'd', 'e'); ++ assert(g[0] == 'a'); ++ assert(g[1] == 'b'); ++ assert(g[2] == 'c'); ++ assert(g[3] == 'd'); ++ assert(g[4] == 'e'); ++ g[3] = 'Й'; ++ assert(g[2] == 'c'); ++ assert(g[3] == 'Й', text(g[3], " vs ", 'Й')); ++ assert(g[4] == 'e'); ++ assert(!g.valid); ++ ++ g ~= 'ц'; ++ g ~= '~'; ++ assert(g[0] == 'a'); ++ assert(g[1] == 'b'); ++ assert(g[2] == 'c'); ++ assert(g[3] == 'Й'); ++ assert(g[4] == 'e'); ++ assert(g[5] == 'ц'); ++ assert(g[6] == '~'); ++ assert(!g.valid); ++ ++ Grapheme copy = g; ++ copy[0] = 'X'; ++ copy[1] = '-'; ++ assert(g[0] == 'a' && copy[0] == 'X'); ++ assert(g[1] == 'b' && copy[1] == '-'); ++ assert(equalS(g[2..g.length], copy[2..copy.length])); ++ copy = Grapheme("АБВГДЕЁЖЗИКЛМ"); ++ assert(equalS(copy[0..8], "АБВГДЕЁЖ"), text(copy[0..8])); ++ copy ~= "xyz"; ++ assert(equalS(copy[13..15], "xy"), text(copy[13..15])); ++ assert(!copy.valid); ++ ++ Grapheme h; ++ foreach(dchar v; iota(cast(int)'A', cast(int)'Z'+1).map!"cast(dchar)a"()) ++ h ~= v; ++ assert(equalS(h[], iota(cast(int)'A', cast(int)'Z'+1))); ++} ++ ++/++ ++ $(P Does basic case-insensitive comparison of strings $(D str1) and $(D str2). ++ This function uses simpler comparison rule thus achieving better performance ++ then $(LREF icmp). However keep in mind the warning below.) ++ ++ Warning: ++ This function only handles 1:1 $(CODEPOINT) mapping ++ and thus is not sufficient for certain alphabets ++ like German, Greek and few others. ++ ++ Example: ++ --- ++ assert(sicmp("Август", "авгусТ") == 0); ++ // Greek also works as long as there is no 1:M mapping in sight ++ assert(sicmp("ΌΎ", "όύ") == 0); ++ // things like the following won't get matched as equal ++ // Greek small letter iota with dialytika and tonos ++ assert(sicmp("ΐ", "\u03B9\u0308\u0301") != 0); ++ ++ // while icmp has no problem with that ++ assert(icmp("ΐ", "\u03B9\u0308\u0301") == 0); ++ assert(icmp("ΌΎ", "όύ") == 0); ++ --- +++/ ++int sicmp(S1, S2)(S1 str1, S2 str2) ++ if(isForwardRange!S1 && is(Unqual!(ElementType!S1) == dchar) ++ && isForwardRange!S2 && is(Unqual!(ElementType!S2) == dchar)) ++{ ++ alias sTable = simpleCaseTable; ++ size_t ridx=0; ++ foreach(dchar lhs; str1) ++ { ++ if(ridx == str2.length) ++ return 1; ++ dchar rhs = std.utf.decode(str2, ridx); ++ int diff = lhs - rhs; ++ if(!diff) ++ continue; ++ size_t idx = simpleCaseTrie[lhs]; ++ size_t idx2 = simpleCaseTrie[rhs]; ++ // simpleCaseTrie is packed index table ++ if(idx != EMPTY_CASE_TRIE) ++ { ++ if(idx2 != EMPTY_CASE_TRIE) ++ {// both cased chars ++ // adjust idx --> start of bucket ++ idx = idx - sTable[idx].n; ++ idx2 = idx2 - sTable[idx2].n; ++ if(idx == idx2)// one bucket, equivalent chars ++ continue; ++ else// not the same bucket ++ diff = sTable[idx].ch - sTable[idx2].ch; ++ } ++ else ++ diff = sTable[idx - sTable[idx].n].ch - rhs; ++ } ++ else if(idx2 != EMPTY_CASE_TRIE) ++ { ++ diff = lhs - sTable[idx2 - sTable[idx2].n].ch; ++ } ++ // one of chars is not cased at all ++ return diff; ++ } ++ return ridx == str2.length ? 0 : -1; ++} ++// overloads for the most common cases to reduce compile time ++@safe pure /*TODO nothrow*/ ++{ ++ int sicmp(const(char)[] str1, const(char)[] str2) ++ { return sicmp!(const(char)[], const(char)[])(str1, str2); } ++ int sicmp(const(wchar)[] str1, const(wchar)[] str2) ++ { return sicmp!(const(wchar)[], const(wchar)[])(str1, str2); } ++ int sicmp(const(dchar)[] str1, const(dchar)[] str2) ++ { return sicmp!(const(dchar)[], const(dchar)[])(str1, str2); } ++} ++ ++private int fullCasedCmp(Range)(dchar lhs, dchar rhs, ref Range rtail) ++ @trusted pure /*TODO nothrow*/ ++{ ++ alias fTable = fullCaseTable; ++ size_t idx = fullCaseTrie[lhs]; ++ // fullCaseTrie is packed index table ++ if(idx == EMPTY_CASE_TRIE) ++ return lhs; ++ size_t start = idx - fTable[idx].n; ++ size_t end = fTable[idx].size + start; ++ assert(fTable[start].entry_len == 1); ++ for(idx=start; idx \u1F70\u03B9", "\u1F61\u03B9 -> ᾲ") == 0); ++ --- +++/ ++int icmp(S1, S2)(S1 str1, S2 str2) ++ if(isForwardRange!S1 && is(Unqual!(ElementType!S1) == dchar) ++ && isForwardRange!S2 && is(Unqual!(ElementType!S2) == dchar)) ++{ ++ for(;;) ++ { ++ if(str1.empty) ++ return str2.empty ? 0 : -1; ++ dchar lhs = str1.front; ++ if(str2.empty) ++ return 1; ++ dchar rhs = str2.front; ++ str1.popFront(); ++ str2.popFront(); ++ int diff = lhs - rhs; ++ if(!diff) ++ continue; ++ // first try to match lhs to sequence ++ int cmpLR = fullCasedCmp(lhs, rhs, str2); ++ if(!cmpLR) ++ continue; ++ // then rhs to sequence ++ int cmpRL = fullCasedCmp(rhs, lhs, str1); ++ if(!cmpRL) ++ continue; ++ // cmpXX contain remapped codepoints ++ // to obtain stable ordering of icmp ++ diff = cmpLR - cmpRL; ++ return diff; ++ } ++} ++// overloads for the most common cases to reduce compile time ++@safe pure /*TODO nothrow*/ ++{ ++ int icmp(const(char)[] str1, const(char)[] str2) ++ { return icmp!(const(char)[], const(char)[])(str1, str2); } ++ int icmp(const(wchar)[] str1, const(wchar)[] str2) ++ { return icmp!(const(wchar)[], const(wchar)[])(str1, str2); } ++ int icmp(const(dchar)[] str1, const(dchar)[] str2) ++ { return icmp!(const(dchar)[], const(dchar)[])(str1, str2); } ++} ++ ++unittest ++{ ++ assertCTFEable!( ++ { ++ foreach(cfunc; TypeTuple!(icmp, sicmp)) ++ { ++ foreach(S1; TypeTuple!(string, wstring, dstring)) ++ foreach(S2; TypeTuple!(string, wstring, dstring)) ++ { ++ assert(cfunc("".to!S1(), "".to!S2()) == 0); ++ assert(cfunc("A".to!S1(), "".to!S2()) > 0); ++ assert(cfunc("".to!S1(), "0".to!S2()) < 0); ++ assert(cfunc("abc".to!S1(), "abc".to!S2()) == 0); ++ assert(cfunc("abcd".to!S1(), "abc".to!S2()) > 0); ++ assert(cfunc("abc".to!S1(), "abcd".to!S2()) < 0); ++ assert(cfunc("Abc".to!S1(), "aBc".to!S2()) == 0); ++ assert(cfunc("авГуст".to!S1(), "АВгУСТ".to!S2()) == 0); ++ // Check example: ++ assert(cfunc("Август".to!S1(), "авгусТ".to!S2()) == 0); ++ assert(cfunc("ΌΎ".to!S1(), "όύ".to!S2()) == 0); ++ } ++ // check that the order is properly agnostic to the case ++ auto strs = [ "Apple", "ORANGE", "orAcle", "amp", "banana"]; ++ sort!((a,b) => cfunc(a,b) < 0)(strs); ++ assert(strs == ["amp", "Apple", "banana", "orAcle", "ORANGE"]); ++ } ++ assert(icmp("ßb", "ssa") > 0); ++ // Check example: ++ assert(icmp("Russland", "Rußland") == 0); ++ assert(icmp("ᾩ -> \u1F70\u03B9", "\u1F61\u03B9 -> ᾲ") == 0); ++ assert(icmp("ΐ"w, "\u03B9\u0308\u0301") == 0); ++ assert(sicmp("ΐ", "\u03B9\u0308\u0301") != 0); ++ //bugzilla 11057 ++ assert( icmp("K", "L") < 0 ); ++ }); ++} ++ ++/++ ++ $(P Returns the $(S_LINK Combining class, combining class) of $(D ch).) ++ ++ Example: ++ --- ++ // shorten the code ++ alias CC = combiningClass; ++ ++ // combining tilda ++ assert(CC('\u0303') == 230); ++ // combining ring below ++ assert(CC('\u0325') == 220); ++ // the simple consequence is that "tilda" should be ++ // placed after a "ring below" in a sequence ++ --- +++/ ++ubyte combiningClass(dchar ch) ++{ ++ return combiningClassTrie[ch]; ++} ++ ++unittest ++{ ++ foreach(ch; 0..0x80) ++ assert(combiningClass(ch) == 0); ++ assert(combiningClass('\u05BD') == 22); ++ assert(combiningClass('\u0300') == 230); ++ assert(combiningClass('\u0317') == 220); ++ assert(combiningClass('\u1939') == 222); ++} ++ ++/// Unicode character decomposition type. ++enum UnicodeDecomposition { ++ /// Canonical decomposition. The result is canonically equivalent sequence. ++ Canonical, ++ /** ++ Compatibility decomposition. The result is compatibility equivalent sequence. ++ Note: Compatibility decomposition is a $(B lossy) conversion, ++ typically suitable only for fuzzy matching and internal processing. ++ */ ++ Compatibility ++}; ++ ++/** ++ Shorthand aliases for character decomposition type, passed as a ++ template parameter to $(LREF decompose). ++*/ ++enum { ++ Canonical = UnicodeDecomposition.Canonical, ++ Compatibility = UnicodeDecomposition.Compatibility ++}; ++ ++/++ ++ Try to canonically compose 2 $(CHARACTERS). ++ Returns the composed $(CHARACTER) if they do compose and dchar.init otherwise. ++ ++ The assumption is that $(D first) comes before $(D second) in the original text, ++ usually meaning that the first is a starter. ++ ++ Note: Hangul syllables are not covered by this function. ++ See $(D composeJamo) below. ++ ++ Example: ++ --- ++ assert(compose('A','\u0308') == '\u00C4'); ++ assert(compose('A', 'B') == dchar.init); ++ assert(compose('C', '\u0301') == '\u0106'); ++ // note that the starter is the first one ++ // thus the following doesn't compose ++ assert(compose('\u0308', 'A') == dchar.init); ++ --- +++/ ++public dchar compose(dchar first, dchar second) ++{ ++ import std.internal.unicode_comp; ++ size_t packed = compositionJumpTrie[first]; ++ if(packed == ushort.max) ++ return dchar.init; ++ // unpack offset and length ++ size_t idx = packed & composeIdxMask, cnt = packed >> composeCntShift; ++ // TODO: optimize this micro binary search (no more then 4-5 steps) ++ auto r = compositionTable[idx..idx+cnt].map!"a.rhs"().assumeSorted(); ++ auto target = r.lowerBound(second).length; ++ if(target == cnt) ++ return dchar.init; ++ auto entry = compositionTable[idx+target]; ++ if(entry.rhs != second) ++ return dchar.init; ++ return entry.composed; ++} ++ ++/++ ++ Returns a full $(S_LINK Canonical decomposition, Canonical) ++ (by default) or $(S_LINK Compatibility decomposition, Compatibility) ++ decomposition of $(CHARACTER) $(D ch). ++ If no decomposition is available returns a $(LREF Grapheme) ++ with the $(D ch) itself. ++ ++ Note: ++ This function also decomposes hangul syllables ++ as prescribed by the standard. ++ See also $(LREF decomposeHangul) for a restricted version ++ that takes into account only hangul syllables but ++ no other decompositions. ++ ++ Example: ++ --- ++ import std.algorithm; ++ assert(decompose('Ĉ')[].equal("C\u0302")); ++ assert(decompose('D')[].equal("D")); ++ assert(decompose('\uD4DC')[].equal("\u1111\u1171\u11B7")); ++ assert(decompose!Compatibility('¹').equal("1")); ++ --- +++/ ++public Grapheme decompose(UnicodeDecomposition decompType=Canonical)(dchar ch) ++{ ++ import std.internal.unicode_decomp; ++ static if(decompType == Canonical) ++ { ++ alias table = decompCanonTable; ++ alias mapping = canonMappingTrie; ++ } ++ else static if(decompType == Compatibility) ++ { ++ alias table = decompCompatTable; ++ alias mapping = compatMappingTrie; ++ } ++ ushort idx = mapping[ch]; ++ if(!idx) // not found, check hangul arithmetic decomposition ++ return decomposeHangul(ch); ++ auto decomp = table[idx..$].until(0); ++ return Grapheme(decomp); ++} ++ ++unittest ++{ ++ // verify examples ++ assert(compose('A','\u0308') == '\u00C4'); ++ assert(compose('A', 'B') == dchar.init); ++ assert(compose('C', '\u0301') == '\u0106'); ++ // note that the starter is the first one ++ // thus the following doesn't compose ++ assert(compose('\u0308', 'A') == dchar.init); ++ ++ import std.algorithm; ++ assert(decompose('Ĉ')[].equalS("C\u0302")); ++ assert(decompose('D')[].equalS("D")); ++ assert(decompose('\uD4DC')[].equalS("\u1111\u1171\u11B7")); ++ assert(decompose!Compatibility('¹')[].equalS("1")); ++} ++ ++//---------------------------------------------------------------------------- ++// Hangul specific composition/decomposition ++enum jamoSBase = 0xAC00; ++enum jamoLBase = 0x1100; ++enum jamoVBase = 0x1161; ++enum jamoTBase = 0x11A7; ++enum jamoLCount = 19, jamoVCount = 21, jamoTCount = 28; ++enum jamoNCount = jamoVCount * jamoTCount; ++enum jamoSCount = jamoLCount * jamoNCount; ++ ++// Tests if $(D ch) is a Hangul leading consonant jamo. ++bool isJamoL(dchar ch) ++{ ++ // first cmp rejects ~ 1M code points above leading jamo range ++ return ch < jamoLBase+jamoLCount && ch >= jamoLBase; ++} ++ ++// Tests if $(D ch) is a Hangul vowel jamo. ++bool isJamoT(dchar ch) ++{ ++ // first cmp rejects ~ 1M code points above trailing jamo range ++ // Note: ch == jamoTBase doesn't indicate trailing jamo (TIndex must be > 0) ++ return ch < jamoTBase+jamoTCount && ch > jamoTBase; ++} ++ ++// Tests if $(D ch) is a Hangul trailnig consonant jamo. ++bool isJamoV(dchar ch) ++{ ++ // first cmp rejects ~ 1M code points above vowel range ++ return ch < jamoVBase+jamoVCount && ch >= jamoVBase; ++} ++ ++int hangulSyllableIndex(dchar ch) ++{ ++ int idxS = cast(int)ch - jamoSBase; ++ return idxS >= 0 && idxS < jamoSCount ? idxS : -1; ++} ++ ++// internal helper: compose hangul syllables leaving dchar.init in holes ++void hangulRecompose(dchar[] seq) ++{ ++ for(size_t idx = 0; idx + 1 < seq.length; ) ++ { ++ if(isJamoL(seq[idx]) && isJamoV(seq[idx+1])) ++ { ++ int indexL = seq[idx] - jamoLBase; ++ int indexV = seq[idx+1] - jamoVBase; ++ int indexLV = indexL * jamoNCount + indexV * jamoTCount; ++ if(idx + 2 < seq.length && isJamoT(seq[idx+2])) ++ { ++ seq[idx] = jamoSBase + indexLV + seq[idx+2] - jamoTBase; ++ seq[idx+1] = dchar.init; ++ seq[idx+2] = dchar.init; ++ idx += 3; ++ } ++ else ++ { ++ seq[idx] = jamoSBase + indexLV; ++ seq[idx+1] = dchar.init; ++ idx += 2; ++ } ++ } ++ else ++ idx++; ++ } ++} ++ ++//---------------------------------------------------------------------------- ++public: ++ ++/** ++ Decomposes a Hangul syllable. If $(D ch) is not a composed syllable ++ then this function returns $(LREF Grapheme) containing only $(D ch) as is. ++ ++ Example: ++ --- ++ import std.algorithm; ++ assert(decomposeHangul('\uD4DB')[].equal("\u1111\u1171\u11B6")); ++ --- ++*/ ++Grapheme decomposeHangul(dchar ch) ++{ ++ int idxS = cast(int)ch - jamoSBase; ++ if(idxS < 0 || idxS >= jamoSCount) return Grapheme(ch); ++ int idxL = idxS / jamoNCount; ++ int idxV = (idxS % jamoNCount) / jamoTCount; ++ int idxT = idxS % jamoTCount; ++ ++ int partL = jamoLBase + idxL; ++ int partV = jamoVBase + idxV; ++ if(idxT > 0) // there is a trailling consonant (T); decomposition ++ return Grapheme(partL, partV, jamoTBase + idxT); ++ else // decomposition ++ return Grapheme(partL, partV); ++} ++ ++/++ ++ Try to compose hangul syllable out of a leading consonant ($(D lead)), ++ a $(D vowel) and optional $(D trailing) consonant jamos. ++ ++ On success returns the composed LV or LVT hangul syllable. ++ ++ If any of $(D lead) and $(D vowel) are not a valid hangul jamo ++ of the respective $(CHARACTER) class returns dchar.init. ++ ++ Example: ++ --- ++ assert(composeJamo('\u1111', '\u1171', '\u11B6') == '\uD4DB'); ++ // leaving out T-vowel, or passing any codepoint ++ // that is not trailing consonant composes an LV-syllable ++ assert(composeJamo('\u1111', '\u1171') == '\uD4CC'); ++ assert(composeJamo('\u1111', '\u1171', ' ') == '\uD4CC'); ++ assert(composeJamo('\u1111', 'A') == dchar.init); ++ assert(composeJamo('A', '\u1171') == dchar.init); ++ --- +++/ ++dchar composeJamo(dchar lead, dchar vowel, dchar trailing=dchar.init) ++{ ++ if(!isJamoL(lead)) ++ return dchar.init; ++ int indexL = lead - jamoLBase; ++ if(!isJamoV(vowel)) ++ return dchar.init; ++ int indexV = vowel - jamoVBase; ++ int indexLV = indexL * jamoNCount + indexV * jamoTCount; ++ dchar syllable = jamoSBase + indexLV; ++ return isJamoT(trailing) ? syllable + (trailing - jamoTBase) : syllable; ++} ++ ++unittest ++{ ++ static void testDecomp(UnicodeDecomposition T)(dchar ch, string r) ++ { ++ Grapheme g = decompose!T(ch); ++ assert(equalS(g[], r), text(g[], " vs ", r)); ++ } ++ testDecomp!Canonical('\u1FF4', "\u03C9\u0301\u0345"); ++ testDecomp!Canonical('\uF907', "\u9F9C"); ++ testDecomp!Compatibility('\u33FF', "\u0067\u0061\u006C"); ++ testDecomp!Compatibility('\uA7F9', "\u0153"); ++ ++ // check examples ++ assert(decomposeHangul('\uD4DB')[].equalS("\u1111\u1171\u11B6")); ++ assert(composeJamo('\u1111', '\u1171', '\u11B6') == '\uD4DB'); ++ assert(composeJamo('\u1111', '\u1171') == '\uD4CC'); // leave out T-vowel ++ assert(composeJamo('\u1111', '\u1171', ' ') == '\uD4CC'); ++ assert(composeJamo('\u1111', 'A') == dchar.init); ++ assert(composeJamo('A', '\u1171') == dchar.init); ++} ++ ++/** ++ Enumeration type for normalization forms, ++ passed as template parameter for functions like $(LREF normalize). ++*/ ++enum NormalizationForm { ++ NFC, ++ NFD, ++ NFKC, ++ NFKD ++} ++ ++ ++enum { ++ /** ++ Shorthand aliases from values indicating normalization forms. ++ */ ++ NFC = NormalizationForm.NFC, ++ ///ditto ++ NFD = NormalizationForm.NFD, ++ ///ditto ++ NFKC = NormalizationForm.NFKC, ++ ///ditto ++ NFKD = NormalizationForm.NFKD ++}; ++ ++/++ ++ Returns $(D input) string normalized to the chosen form. ++ Form C is used by default. ++ ++ For more information on normalization forms see ++ the $(S_LINK Normalization, normalization section). ++ ++ Note: ++ In cases where the string in question is already normalized, ++ it is returned unmodified and no memory allocation happens. ++ ++ Example: ++ --- ++ // any encoding works ++ wstring greet = "Hello world"; ++ assert(normalize(greet) is greet); // the same exact slice ++ ++ // An example of a character with all 4 forms being different: ++ // Greek upsilon with acute and hook symbol (code point 0x03D3) ++ assert(normalize!NFC("ϓ") == "\u03D3"); ++ assert(normalize!NFD("ϓ") == "\u03D2\u0301"); ++ assert(normalize!NFKC("ϓ") == "\u038E"); ++ assert(normalize!NFKD("ϓ") == "\u03A5\u0301"); ++ --- +++/ ++inout(C)[] normalize(NormalizationForm norm=NFC, C)(inout(C)[] input) ++{ ++ auto anchors = splitNormalized!norm(input); ++ if(anchors[0] == input.length && anchors[1] == input.length) ++ return input; ++ dchar[] decomposed; ++ decomposed.reserve(31); ++ ubyte[] ccc; ++ ccc.reserve(31); ++ auto app = appender!(C[])(); ++ do ++ { ++ app.put(input[0..anchors[0]]); ++ foreach(dchar ch; input[anchors[0]..anchors[1]]) ++ static if(norm == NFD || norm == NFC) ++ { ++ foreach(dchar c; decompose!Canonical(ch)[]) ++ decomposed ~= c; ++ } ++ else // NFKD & NFKC ++ { ++ foreach(dchar c; decompose!Compatibility(ch)[]) ++ decomposed ~= c; ++ } ++ ccc.length = decomposed.length; ++ size_t firstNonStable = 0; ++ ubyte lastClazz = 0; ++ ++ foreach(idx, dchar ch; decomposed) ++ { ++ auto clazz = combiningClass(ch); ++ ccc[idx] = clazz; ++ if(clazz == 0 && lastClazz != 0) ++ { ++ // found a stable code point after unstable ones ++ sort!("a[0] < b[0]", SwapStrategy.stable) ++ (zip(ccc[firstNonStable..idx], decomposed[firstNonStable..idx])); ++ firstNonStable = decomposed.length; ++ } ++ else if(clazz != 0 && lastClazz == 0) ++ { ++ // found first unstable code point after stable ones ++ firstNonStable = idx; ++ } ++ lastClazz = clazz; ++ } ++ sort!("a[0] < b[0]", SwapStrategy.stable) ++ (zip(ccc[firstNonStable..$], decomposed[firstNonStable..$])); ++ static if(norm == NFC || norm == NFKC) ++ { ++ size_t idx = 0; ++ auto first = countUntil(ccc, 0); ++ if(first >= 0) // no starters?? no recomposition ++ { ++ for(;;) ++ { ++ auto second = recompose(first, decomposed, ccc); ++ if(second == decomposed.length) ++ break; ++ first = second; ++ } ++ // 2nd pass for hangul syllables ++ hangulRecompose(decomposed); ++ } ++ } ++ static if(norm == NFD || norm == NFKD) ++ app.put(decomposed); ++ else ++ { ++ auto clean = remove!("a == dchar.init", SwapStrategy.stable)(decomposed); ++ app.put(decomposed[0 .. clean.length]); ++ } ++ // reset variables ++ decomposed.length = 0; ++ decomposed.assumeSafeAppend(); ++ ccc.length = 0; ++ ccc.assumeSafeAppend(); ++ input = input[anchors[1]..$]; ++ // and move on ++ anchors = splitNormalized!norm(input); ++ }while(anchors[0] != input.length); ++ app.put(input[0..anchors[0]]); ++ return cast(inout(C)[])app.data; ++} ++ ++unittest ++{ ++ assert(normalize!NFD("abc\uF904def") == "abc\u6ED1def", text(normalize!NFD("abc\uF904def"))); ++ assert(normalize!NFKD("2¹⁰") == "210", normalize!NFKD("2¹⁰")); ++ assert(normalize!NFD("Äffin") == "A\u0308ffin"); ++ ++ // check example ++ ++ // any encoding works ++ wstring greet = "Hello world"; ++ assert(normalize(greet) is greet); // the same exact slice ++ ++ // An example of a character with all 4 forms being different: ++ // Greek upsilon with acute and hook symbol (code point 0x03D3) ++ assert(normalize!NFC("ϓ") == "\u03D3"); ++ assert(normalize!NFD("ϓ") == "\u03D2\u0301"); ++ assert(normalize!NFKC("ϓ") == "\u038E"); ++ assert(normalize!NFKD("ϓ") == "\u03A5\u0301"); ++} ++ ++// canonically recompose given slice of code points, works in-place and mutates data ++private size_t recompose(size_t start, dchar[] input, ubyte[] ccc) ++{ ++ assert(input.length == ccc.length); ++ int accumCC = -1;// so that it's out of 0..255 range ++ bool foundSolidStarter = false; ++ // writefln("recomposing %( %04x %)", input); ++ // first one is always a starter thus we start at i == 1 ++ size_t i = start+1; ++ for(; ; ) ++ { ++ if(i == input.length) ++ break; ++ int curCC = ccc[i]; ++ // In any character sequence beginning with a starter S ++ // a character C is blocked from S if and only if there ++ // is some character B between S and C, and either B ++ // is a starter or it has the same or higher combining class as C. ++ //------------------------ ++ // Applying to our case: ++ // S is input[0] ++ // accumCC is the maximum CCC of characters between C and S, ++ // as ccc are sorted ++ // C is input[i] ++ ++ if(curCC > accumCC) ++ { ++ dchar comp = compose(input[start], input[i]); ++ if(comp != dchar.init) ++ { ++ input[start] = comp; ++ input[i] = dchar.init;// put a sentinel ++ // current was merged so its CCC shouldn't affect ++ // composing with the next one ++ } ++ else { ++ // if it was a starter then accumCC is now 0, end of loop ++ accumCC = curCC; ++ if(accumCC == 0) ++ break; ++ } ++ } ++ else{ ++ // ditto here ++ accumCC = curCC; ++ if(accumCC == 0) ++ break; ++ } ++ i++; ++ } ++ return i; ++} ++ ++// returns tuple of 2 indexes that delimit: ++// normalized text, piece that needs normalization and ++// the rest of input starting with stable code point ++private auto splitNormalized(NormalizationForm norm, C)(const(C)[] input) ++{ ++ auto result = input; ++ ubyte lastCC = 0; ++ ++ foreach(idx, dchar ch; input) ++ { ++ static if(norm == NFC) ++ if(ch < 0x0300) ++ { ++ lastCC = 0; ++ continue; ++ } ++ ubyte CC = combiningClass(ch); ++ if(lastCC > CC && CC != 0) ++ { ++ return seekStable!norm(idx, input); ++ } ++ ++ if(notAllowedIn!norm(ch)) ++ { ++ return seekStable!norm(idx, input); ++ } ++ lastCC = CC; ++ } ++ return tuple(input.length, input.length); ++} ++ ++private auto seekStable(NormalizationForm norm, C)(size_t idx, in C[] input) ++{ ++ auto br = input[0..idx]; ++ size_t region_start = 0;// default ++ for(;;) ++ { ++ if(br.empty)// start is 0 ++ break; ++ dchar ch = br.back; ++ if(combiningClass(ch) == 0 && allowedIn!norm(ch)) ++ { ++ region_start = br.length - std.utf.codeLength!C(ch); ++ break; ++ } ++ br.popFront(); ++ } ++ ///@@@BUG@@@ can't use find: " find is a nested function and can't be used..." ++ size_t region_end=input.length;// end is $ by default ++ foreach(i, dchar ch; input[idx..$]) ++ { ++ if(combiningClass(ch) == 0 && allowedIn!norm(ch)) ++ { ++ region_end = i+idx; ++ break; ++ } ++ } ++ // writeln("Region to normalize: ", input[region_start..region_end]); ++ return tuple(region_start, region_end); ++} ++ ++/** ++ Tests if dchar $(D ch) is always allowed (Quick_Check=YES) in normalization ++ form $(D norm). ++ --- ++ // e.g. Cyrillic is always allowed, so is ASCII ++ assert(allowedIn!NFC('я')); ++ assert(allowedIn!NFD('я')); ++ assert(allowedIn!NFKC('я')); ++ assert(allowedIn!NFKD('я')); ++ assert(allowedIn!NFC('Z')); ++ --- ++*/ ++public bool allowedIn(NormalizationForm norm)(dchar ch) ++{ ++ return !notAllowedIn!norm(ch); ++} ++ ++// not user friendly name but more direct ++private bool notAllowedIn(NormalizationForm norm)(dchar ch) ++{ ++ static if(norm == NFC) ++ alias qcTrie = nfcQCTrie; ++ else static if(norm == NFD) ++ alias qcTrie = nfdQCTrie; ++ else static if(norm == NFKC) ++ alias qcTrie = nfkcQCTrie; ++ else static if(norm == NFKD) ++ alias qcTrie = nfkdQCTrie; ++ else ++ static assert("Unknown normalization form "~norm); ++ return qcTrie[ch]; ++} ++ ++unittest ++{ ++ assert(allowedIn!NFC('я')); ++ assert(allowedIn!NFD('я')); ++ assert(allowedIn!NFKC('я')); ++ assert(allowedIn!NFKD('я')); ++ assert(allowedIn!NFC('Z')); ++} ++ ++} ++ ++version(std_uni_bootstrap) ++{ ++ // old version used for bootstrapping of gen_uni.d that generates ++ // up to date optimal versions of all of isXXX functions ++ @safe pure nothrow public bool isWhite(dchar c) ++ { ++ return std.ascii.isWhite(c) || ++ c == lineSep || c == paraSep || ++ c == '\u0085' || c == '\u00A0' || c == '\u1680' || c == '\u180E' || ++ (c >= '\u2000' && c <= '\u200A') || ++ c == '\u202F' || c == '\u205F' || c == '\u3000'; ++ } ++} ++else ++{ ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++ushort toLowerIndex(dchar c) ++{ ++ alias trie = toLowerIndexTrie; ++ return trie[c]; ++} ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++dchar toLowerTab(size_t idx) ++{ ++ return toLowerTable[idx]; ++} ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++ushort toTitleIndex(dchar c) ++{ ++ alias trie = toTitleIndexTrie; ++ return trie[c]; ++} ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++dchar toTitleTab(size_t idx) ++{ ++ return toTitleTable[idx]; ++} ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++ushort toUpperIndex(dchar c) ++{ ++ alias trie = toUpperIndexTrie; ++ return trie[c]; ++} ++ ++// trusted -> avoid bounds check ++@trusted pure nothrow ++dchar toUpperTab(size_t idx) ++{ ++ return toUpperTable[idx]; ++} ++ ++public: ++ ++/++ ++ Whether or not $(D c) is a Unicode whitespace $(CHARACTER). ++ (general Unicode category: Part of C0(tab, vertical tab, form feed, ++ carriage return, and linefeed characters), Zs, Zl, Zp, and NEL(U+0085)) +++/ ++@safe pure nothrow ++public bool isWhite(dchar c) ++{ ++ return isWhiteGen(c); // call pregenerated binary search ++} ++ ++deprecated ("Please use std.uni.isLower instead") ++bool isUniLower(dchar c) @safe pure nothrow ++{ ++ return isLower(c); ++} ++ ++/++ ++ Return whether $(D c) is a Unicode lowercase $(CHARACTER). +++/ ++@safe pure nothrow ++bool isLower(dchar c) ++{ ++ if(std.ascii.isASCII(c)) ++ return std.ascii.isLower(c); ++ return lowerCaseTrie[c]; ++} ++ ++@safe unittest ++{ ++ foreach(v; 0..0x80) ++ assert(std.ascii.isLower(v) == isLower(v)); ++ assert(isLower('я')); ++ assert(isLower('й')); ++ assert(!isLower('Ж')); ++ // Greek HETA ++ assert(!isLower('\u0370')); ++ assert(isLower('\u0371')); ++ assert(!isLower('\u039C')); // capital MU ++ assert(isLower('\u03B2')); // beta ++ // from extended Greek ++ assert(!isLower('\u1F18')); ++ assert(isLower('\u1F00')); ++ foreach(v; unicode.lowerCase.byCodepoint) ++ assert(isLower(v) && !isUpper(v)); ++} ++ ++ ++deprecated ("Please use std.uni.isUpper instead") ++@safe pure nothrow ++bool isUniUpper(dchar c) ++{ ++ return isUpper(c); ++} ++ ++/++ ++ Return whether $(D c) is a Unicode uppercase $(CHARACTER). +++/ ++@safe pure nothrow ++bool isUpper(dchar c) ++{ ++ if(std.ascii.isASCII(c)) ++ return std.ascii.isUpper(c); ++ return upperCaseTrie[c]; ++} ++ ++@safe unittest ++{ ++ foreach(v; 0..0x80) ++ assert(std.ascii.isLower(v) == isLower(v)); ++ assert(!isUpper('й')); ++ assert(isUpper('Ж')); ++ // Greek HETA ++ assert(isUpper('\u0370')); ++ assert(!isUpper('\u0371')); ++ assert(isUpper('\u039C')); // capital MU ++ assert(!isUpper('\u03B2')); // beta ++ // from extended Greek ++ assert(!isUpper('\u1F00')); ++ assert(isUpper('\u1F18')); ++ foreach(v; unicode.upperCase.byCodepoint) ++ assert(isUpper(v) && !isLower(v)); ++} ++ ++ ++deprecated ("Please use std.uni.toLower instead") ++@safe pure nothrow ++dchar toUniLower(dchar c) ++{ ++ return toLower(c); ++} ++ ++ ++/++ ++ If $(D c) is a Unicode uppercase $(CHARACTER), then its lowercase equivalent ++ is returned. Otherwise $(D c) is returned. ++ ++ Warning: certain alphabets like German and Greek have no 1:1 ++ upper-lower mapping. Use overload of toLower which takes full string instead. +++/ ++@safe pure nothrow ++dchar toLower(dchar c) ++{ ++ // optimize ASCII case ++ if(c < 0xAA) ++ { ++ if(c < 'A') ++ return c; ++ if(c <= 'Z') ++ return c + 32; ++ return c; ++ } ++ size_t idx = toLowerIndex(c); ++ if(idx < MAX_SIMPLE_LOWER) ++ { ++ return toLowerTab(idx); ++ } ++ return c; ++} ++ ++//TODO: Hidden for now, needs better API. ++//Other transforms could use better API as well, but this one is a new primitive. ++@safe pure nothrow ++private dchar toTitlecase(dchar c) ++{ ++ // optimize ASCII case ++ if(c < 0xAA) ++ { ++ if(c < 'a') ++ return c; ++ if(c <= 'z') ++ return c - 32; ++ return c; ++ } ++ size_t idx = toTitleIndex(c); ++ if(idx < MAX_SIMPLE_TITLE) ++ { ++ return toTitleTab(idx); ++ } ++ return c; ++} ++ ++private alias UpperTriple = TypeTuple!(toUpperIndex, MAX_SIMPLE_UPPER, toUpperTab); ++private alias LowerTriple = TypeTuple!(toLowerIndex, MAX_SIMPLE_LOWER, toLowerTab); ++ ++// generic toUpper/toLower on whole string, creates new or returns as is ++private S toCase(alias indexFn, uint maxIdx, alias tableFn, S)(S s) @trusted pure ++ if(isSomeString!S) ++{ ++ foreach(i, dchar cOuter; s) ++ { ++ ushort idx = indexFn(cOuter); ++ if(idx == ushort.max) ++ continue; ++ auto result = s[0 .. i].dup; ++ foreach(dchar c; s[i .. $]) ++ { ++ idx = indexFn(c); ++ if(idx == ushort.max) ++ result ~= c; ++ else if(idx < maxIdx) ++ { ++ c = tableFn(idx); ++ result ~= c; ++ } ++ else ++ { ++ auto val = tableFn(idx); ++ // unpack length + codepoint ++ uint len = val>>24; ++ result ~= cast(dchar)(val & 0xFF_FFFF); ++ foreach(j; idx+1..idx+len) ++ result ~= tableFn(j); ++ } ++ } ++ return cast(S) result; ++ } ++ return s; ++} ++ ++// TODO: helper, I wish std.utf was more flexible (and stright) ++private size_t encodeTo(char[] buf, size_t idx, dchar c) @trusted pure ++{ ++ if (c <= 0x7F) ++ { ++ buf[idx] = cast(char)c; ++ idx++; ++ } ++ else if (c <= 0x7FF) ++ { ++ buf[idx] = cast(char)(0xC0 | (c >> 6)); ++ buf[idx+1] = cast(char)(0x80 | (c & 0x3F)); ++ idx += 2; ++ } ++ else if (c <= 0xFFFF) ++ { ++ buf[idx] = cast(char)(0xE0 | (c >> 12)); ++ buf[idx+1] = cast(char)(0x80 | ((c >> 6) & 0x3F)); ++ buf[idx+2] = cast(char)(0x80 | (c & 0x3F)); ++ idx += 3; ++ } ++ else if (c <= 0x10FFFF) ++ { ++ buf[idx] = cast(char)(0xF0 | (c >> 18)); ++ buf[idx+1] = cast(char)(0x80 | ((c >> 12) & 0x3F)); ++ buf[idx+2] = cast(char)(0x80 | ((c >> 6) & 0x3F)); ++ buf[idx+3] = cast(char)(0x80 | (c & 0x3F)); ++ idx += 4; ++ } ++ else ++ assert(0); ++ return idx; ++} ++ ++unittest ++{ ++ char[] s = "abcd".dup; ++ size_t i = 0; ++ i = encodeTo(s, i, 'X'); ++ assert(s == "Xbcd"); ++ ++ i = encodeTo(s, i, cast(dchar)'\u00A9'); ++ assert(s == "X\xC2\xA9d"); ++} ++ ++// TODO: helper, I wish std.utf was more flexible (and stright) ++private size_t encodeTo(wchar[] buf, size_t idx, dchar c) @trusted pure ++{ ++ import std.utf; ++ if (c <= 0xFFFF) ++ { ++ if (0xD800 <= c && c <= 0xDFFF) ++ throw (new UTFException("Encoding an isolated surrogate code point in UTF-16")).setSequence(c); ++ buf[idx] = cast(wchar)c; ++ idx++; ++ } ++ else if (c <= 0x10FFFF) ++ { ++ buf[idx] = cast(wchar)((((c - 0x10000) >> 10) & 0x3FF) + 0xD800); ++ buf[idx+1] = cast(wchar)(((c - 0x10000) & 0x3FF) + 0xDC00); ++ idx += 2; ++ } ++ else ++ assert(0); ++ return idx; ++} + +- Trademarks: +- Unicode(tm) is a trademark of Unicode, Inc. ++private size_t encodeTo(dchar[] buf, size_t idx, dchar c) @trusted pure ++{ ++ buf[idx] = c; ++ idx++; ++ return idx; ++} + +- Macros: +- WIKI=Phobos/StdUni ++private void toCaseInPlace(alias indexFn, uint maxIdx, alias tableFn, C)(ref C[] s) @trusted pure ++ if (is(C == char) || is(C == wchar) || is(C == dchar)) ++{ ++ import std.utf; ++ size_t curIdx = 0; ++ size_t destIdx = 0; ++ alias slowToCase = toCaseInPlaceAlloc!(indexFn, maxIdx, tableFn); ++ size_t lastUnchanged = 0; ++ // in-buffer move of bytes to a new start index ++ // the trick is that it may not need to copy at all ++ static size_t moveTo(C[] str, size_t dest, size_t from, size_t to) ++ { ++ // Interestingly we may just bump pointer for a while ++ // then have to copy if a re-cased char was smaller the original ++ // later we may regain pace with char that got bigger ++ // In the end it sometimes flip-flops between the 2 cases below ++ if(dest == from) ++ return to; ++ // got to copy ++ foreach(C c; str[from..to]) ++ str[dest++] = c; ++ return dest; ++ } ++ while(curIdx != s.length) ++ { ++ size_t startIdx = curIdx; ++ dchar ch = decode(s, curIdx); ++ // TODO: special case for ASCII ++ auto caseIndex = indexFn(ch); ++ if(caseIndex == ushort.max) // unchanged, skip over ++ { ++ continue; ++ } ++ else if(caseIndex < maxIdx) // 1:1 codepoint mapping ++ { ++ // previous cased chars had the same length as uncased ones ++ // thus can just adjust pointer ++ destIdx = moveTo(s, destIdx, lastUnchanged, startIdx); ++ lastUnchanged = curIdx; ++ dchar cased = tableFn(caseIndex); ++ auto casedLen = codeLength!C(cased); ++ if(casedLen + destIdx > curIdx) // no place to fit cased char ++ { ++ // switch to slow codepath, where we allocate ++ return slowToCase(s, startIdx, destIdx); ++ } ++ else ++ { ++ destIdx = encodeTo(s, destIdx, cased); ++ } ++ } ++ else // 1:m codepoint mapping, slow codepath ++ { ++ destIdx = moveTo(s, destIdx, lastUnchanged, startIdx); ++ lastUnchanged = curIdx; ++ return slowToCase(s, startIdx, destIdx); ++ } ++ assert(destIdx <= curIdx); ++ } ++ if(lastUnchanged != s.length) ++ { ++ destIdx = moveTo(s, destIdx, lastUnchanged, s.length); ++ } ++ s = s[0..destIdx]; ++} + +- Copyright: Copyright 2000 - +- License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). +- Authors: $(WEB digitalmars.com, Walter Bright), Jonathan M Davis, and Kenji Hara +- Source: $(PHOBOSSRC std/_uni.d) +- +/ +-module std.uni; ++// helper to precalculate size of case-converted string ++private template toCaseLength(alias indexFn, uint maxIdx, alias tableFn) ++{ ++ size_t toCaseLength(C)(in C[] str) ++ { ++ import std.utf; ++ size_t codeLen = 0; ++ size_t lastNonTrivial = 0; ++ size_t curIdx = 0; ++ while(curIdx != str.length) ++ { ++ size_t startIdx = curIdx; ++ dchar ch = decode(str, curIdx); ++ ushort caseIndex = indexFn(ch); ++ if(caseIndex == ushort.max) ++ continue; ++ else if(caseIndex < maxIdx) ++ { ++ codeLen += startIdx - lastNonTrivial; ++ lastNonTrivial = curIdx; ++ dchar cased = tableFn(caseIndex); ++ codeLen += codeLength!C(cased); ++ } ++ else ++ { ++ codeLen += startIdx - lastNonTrivial; ++ lastNonTrivial = curIdx; ++ auto val = tableFn(caseIndex); ++ auto len = val>>24; ++ dchar cased = val & 0xFF_FFFF; ++ codeLen += codeLength!C(cased); ++ foreach(j; caseIndex+1..caseIndex+len) ++ codeLen += codeLength!C(tableFn(j)); ++ } ++ } ++ if(lastNonTrivial != str.length) ++ codeLen += str.length - lastNonTrivial; ++ return codeLen; ++ } ++} + +-static import std.ascii; ++unittest ++{ ++ import std.conv; ++ alias toLowerLength = toCaseLength!(LowerTriple); ++ assert(toLowerLength("abcd") == 4); ++ assert(toLowerLength("аБВгд456") == 10+3); ++} + +-enum dchar lineSep = '\u2028'; /// UTF line separator +-enum dchar paraSep = '\u2029'; /// UTF paragraph separator ++// slower code path that preallocates and then copies ++// case-converted stuf to the new string ++private template toCaseInPlaceAlloc(alias indexFn, uint maxIdx, alias tableFn) ++{ ++ void toCaseInPlaceAlloc(C)(ref C[] s, size_t curIdx, ++ size_t destIdx) @trusted pure ++ if (is(C == char) || is(C == wchar) || is(C == dchar)) ++ { ++ import std.utf : decode; ++ alias caseLength = toCaseLength!(indexFn, maxIdx, tableFn); ++ auto trueLength = destIdx + caseLength(s[curIdx..$]); ++ C[] ns = new C[trueLength]; ++ ns[0..destIdx] = s[0..destIdx]; ++ size_t lastUnchanged = curIdx; ++ while(curIdx != s.length) ++ { ++ size_t startIdx = curIdx; // start of current codepoint ++ dchar ch = decode(s, curIdx); ++ auto caseIndex = indexFn(ch); ++ if(caseIndex == ushort.max) // skip over ++ { ++ continue; ++ } ++ else if(caseIndex < maxIdx) // 1:1 codepoint mapping ++ { ++ dchar cased = tableFn(caseIndex); ++ auto toCopy = startIdx - lastUnchanged; ++ ns[destIdx .. destIdx+toCopy] = s[lastUnchanged .. startIdx]; ++ lastUnchanged = curIdx; ++ destIdx += toCopy; ++ destIdx = encodeTo(ns, destIdx, cased); ++ } ++ else // 1:m codepoint mapping, slow codepath ++ { ++ auto toCopy = startIdx - lastUnchanged; ++ ns[destIdx .. destIdx+toCopy] = s[lastUnchanged .. startIdx]; ++ lastUnchanged = curIdx; ++ destIdx += toCopy; ++ auto val = tableFn(caseIndex); ++ // unpack length + codepoint ++ uint len = val>>24; ++ destIdx = encodeTo(ns, destIdx, cast(dchar)(val & 0xFF_FFFF)); ++ foreach(j; caseIndex+1..caseIndex+len) ++ destIdx = encodeTo(ns, destIdx, tableFn(j)); ++ } ++ } ++ if(lastUnchanged != s.length) ++ { ++ auto toCopy = s.length - lastUnchanged; ++ ns[destIdx..destIdx+toCopy] = s[lastUnchanged..$]; ++ destIdx += toCopy; ++ } ++ assert(ns.length == destIdx); ++ s = ns; ++ } ++} + + /++ +- Whether or not $(D c) is a Unicode whitespace character. +- (general Unicode category: Part of C0(tab, vertical tab, form feed, +- carriage return, and linefeed characters), Zs, Zl, Zp, and NEL(U+0085)) +- +/ +-bool isWhite(dchar c) @safe pure nothrow ++ Converts $(D s) to lowercase (by performing Unicode lowercase mapping) in place. ++ For a few characters string length may increase after the transformation, ++ in such a case the function reallocates exactly once. ++ If $(D s) does not have any uppercase characters, then $(D s) is unaltered. +++/ ++void toLowerInPlace(C)(ref C[] s) @trusted pure ++ if (is(C == char) || is(C == wchar) || is(C == dchar)) + { +- return std.ascii.isWhite(c) || +- c == lineSep || c == paraSep || +- c == '\u0085' || c == '\u00A0' || c == '\u1680' || c == '\u180E' || +- (c >= '\u2000' && c <= '\u200A') || +- c == '\u202F' || c == '\u205F' || c == '\u3000'; ++ toCaseInPlace!(LowerTriple)(s); + } +- +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.uni.isLower instead.") bool isUniLower(dchar c) @safe pure nothrow ++// overloads for the most common cases to reduce compile time ++@safe pure /*TODO nothrow*/ + { +- return isLower(c); ++ void toLowerInPlace(ref char[] s) ++ { toLowerInPlace!char(s); } ++ void toLowerInPlace(ref wchar[] s) ++ { toLowerInPlace!wchar(s); } ++ void toLowerInPlace(ref dchar[] s) ++ { toLowerInPlace!dchar(s); } + } + + /++ +- Return whether $(D c) is a Unicode lowercase character. +- +/ +-bool isLower(dchar c) @safe pure nothrow ++ Converts $(D s) to uppercase (by performing Unicode uppercase mapping) in place. ++ For a few characters string length may increase after the transformation, ++ in such a case the function reallocates exactly once. ++ If $(D s) does not have any lowercase characters, then $(D s) is unaltered. +++/ ++void toUpperInPlace(C)(ref C[] s) @trusted pure ++ if (is(C == char) || is(C == wchar) || is(C == dchar)) + { +- if(std.ascii.isASCII(c)) +- return std.ascii.isLower(c); ++ toCaseInPlace!(UpperTriple)(s); ++} ++// overloads for the most common cases to reduce compile time/code size ++@safe pure /*TODO nothrow*/ ++{ ++ void toUpperInPlace(ref char[] s) ++ { toUpperInPlace!char(s); } ++ void toUpperInPlace(ref wchar[] s) ++ { toUpperInPlace!wchar(s); } ++ void toUpperInPlace(ref dchar[] s) ++ { toUpperInPlace!dchar(s); } ++} + +- return isAlpha(c) && c == toLower(c); ++/++ ++ Returns a string which is identical to $(D s) except that all of its ++ characters are converted to lowercase (by preforming Unicode lowercase mapping). ++ If none of $(D s) characters were affected, then $(D s) itself is returned. +++/ ++S toLower(S)(S s) @trusted pure ++ if(isSomeString!S) ++{ ++ return toCase!(LowerTriple)(s); ++} ++// overloads for the most common cases to reduce compile time ++@safe pure /*TODO nothrow*/ ++{ ++ string toLower(string s) ++ { return toLower!string(s); } ++ wstring toLower(wstring s) ++ { return toLower!wstring(s); } ++ dstring toLower(dstring s) ++ { return toLower!dstring(s); } + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.uni.isUpper instead.") bool isUniUpper(dchar c) @safe pure nothrow ++@trusted unittest //@@@BUG std.format is not @safe + { +- return isUpper(c); ++ import std.string : format; ++ foreach(ch; 0..0x80) ++ assert(std.ascii.toLower(ch) == toLower(ch)); ++ assert(toLower('Я') == 'я'); ++ assert(toLower('Δ') == 'δ'); ++ foreach(ch; unicode.upperCase.byCodepoint) ++ { ++ dchar low = ch.toLower(); ++ assert(low == ch || isLower(low), format("%s -> %s", ch, low)); ++ } ++ assert(toLower("АЯ") == "ая"); ++ ++ assert("\u1E9E".toLower == "\u00df"); ++ assert("\u00df".toUpper == "SS"); + } + +-/++ +- Return whether $(D c) is a Unicode uppercase character. +- +/ +-bool isUpper(dchar c) @safe pure nothrow ++//bugzilla 9629 ++unittest + { +- if(std.ascii.isASCII(c)) +- return std.ascii.isUpper(c); ++ wchar[] test = "hello þ world"w.dup; ++ auto piece = test[6..7]; ++ toUpperInPlace(piece); ++ assert(test == "hello Þ world"); ++} + +- return isAlpha(c) && c == toUpper(c); ++ ++unittest ++{ ++ string s1 = "FoL"; ++ string s2 = toLower(s1); ++ assert(cmp(s2, "fol") == 0, s2); ++ assert(s2 != s1); ++ ++ char[] s3 = s1.dup; ++ toLowerInPlace(s3); ++ assert(s3 == s2); ++ ++ s1 = "A\u0100B\u0101d"; ++ s2 = toLower(s1); ++ s3 = s1.dup; ++ assert(cmp(s2, "a\u0101b\u0101d") == 0); ++ assert(s2 !is s1); ++ toLowerInPlace(s3); ++ assert(s3 == s2); ++ ++ s1 = "A\u0460B\u0461d"; ++ s2 = toLower(s1); ++ s3 = s1.dup; ++ assert(cmp(s2, "a\u0461b\u0461d") == 0); ++ assert(s2 !is s1); ++ toLowerInPlace(s3); ++ assert(s3 == s2); ++ ++ s1 = "\u0130"; ++ s2 = toLower(s1); ++ s3 = s1.dup; ++ assert(s2 == "i\u0307"); ++ assert(s2 !is s1); ++ toLowerInPlace(s3); ++ assert(s3 == s2); ++ ++ // Test on wchar and dchar strings. ++ assert(toLower("Some String"w) == "some string"w); ++ assert(toLower("Some String"d) == "some string"d); + } + + +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.uni.toLower instead.") dchar toUniLower(dchar c) @safe pure nothrow ++deprecated("Please use std.uni.toUpper instead") ++@safe pure nothrow ++dchar toUniUpper(dchar c) + { +- return toLower(c); ++ return toUpper(c); + } + + /++ +- If $(D c) is a Unicode uppercase character, then its lowercase equivalent ++ If $(D c) is a Unicode lowercase $(CHARACTER), then its uppercase equivalent + is returned. Otherwise $(D c) is returned. +- +/ +-dchar toLower(dchar c) @safe pure nothrow ++ ++ Warning: ++ Certain alphabets like German and Greek have no 1:1 ++ upper-lower mapping. Use overload of toUpper which takes full string instead. +++/ ++@safe pure nothrow ++dchar toUpper(dchar c) + { +- if(std.ascii.isUpper(c)) +- c += 32; +- else if(c >= 0x00C0) ++ // optimize ASCII case ++ if(c < 0xAA) + { +- if((c >= 0x00C0 && c <= 0x00D6) || +- (c >= 0x00D8 && c<=0x00DE)) +- { +- c += 32; +- } +- else if((c >= 0x0100 && c < 0x0138) || +- (c > 0x0149 && c < 0x0178)) +- { +- if(c == 0x0130) +- c = 0x0069; +- else if((c & 1) == 0) +- ++c; +- } +- else if(c == 0x0178) +- c = 0x00FF; +- else if((c >= 0x0139 && c < 0x0149) || +- (c > 0x0178 && c < 0x017F)) +- { +- if(c & 1) +- ++c; +- } +- else if(c >= 0x0200 && c <= 0x0217) +- { +- if((c & 1) == 0) +- ++c; +- } +- else if((c >= 0x0401 && c <= 0x040C) || +- (c>= 0x040E && c <= 0x040F)) +- { +- c += 80; +- } +- else if(c >= 0x0410 && c <= 0x042F) +- c += 32; +- else if(c >= 0x0460 && c <= 0x047F) +- { +- if((c & 1) == 0) +- ++c; +- } +- else if(c >= 0x0531 && c <= 0x0556) +- c += 48; +- else if(c >= 0x10A0 && c <= 0x10C5) +- c += 48; +- else if(c >= 0xFF21 && c <= 0xFF3A) +- c += 32; ++ if(c < 'a') ++ return c; ++ if(c <= 'z') ++ return c - 32; ++ return c; ++ } ++ size_t idx = toUpperIndex(c); ++ if(idx < MAX_SIMPLE_UPPER) ++ { ++ return toUpperTab(idx); + } +- + return c; + } + +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.uni.toUpper instead.") dchar toUniUpper(dchar c) @safe pure nothrow ++@trusted unittest + { +- return toUpper(c); ++ import std.string : format; ++ foreach(ch; 0..0x80) ++ assert(std.ascii.toUpper(ch) == toUpper(ch)); ++ assert(toUpper('я') == 'Я'); ++ assert(toUpper('δ') == 'Δ'); ++ foreach(ch; unicode.lowerCase.byCodepoint) ++ { ++ dchar up = ch.toUpper(); ++ assert(up == ch || isUpper(up), format("%s -> %s", ch, up)); ++ } + } + + /++ +- If $(D c) is a Unicode lowercase character, then its uppercase equivalent +- is returned. Otherwise $(D c) is returned. +- +/ +-dchar toUpper(dchar c) @safe pure nothrow ++ Returns a string which is identical to $(D s) except that all of its ++ characters are converted to uppercase (by preforming Unicode uppercase mapping). ++ If none of $(D s) characters were affected, then $(D s) itself is returned. +++/ ++S toUpper(S)(S s) @trusted pure ++ if(isSomeString!S) ++{ ++ return toCase!(UpperTriple)(s); ++} ++// overloads for the most common cases to reduce compile time ++@safe pure /*TODO nothrow*/ ++{ ++ string toUpper(string s) ++ { return toUpper!string(s); } ++ wstring toUpper(wstring s) ++ { return toUpper!wstring(s); } ++ dstring toUpper(dstring s) ++ { return toUpper!dstring(s); } ++} ++ ++unittest ++{ ++ string s1 = "FoL"; ++ string s2; ++ char[] s3; ++ ++ s2 = toUpper(s1); ++ s3 = s1.dup; toUpperInPlace(s3); ++ assert(s3 == s2, s3); ++ assert(cmp(s2, "FOL") == 0); ++ assert(s2 !is s1); ++ ++ s1 = "a\u0100B\u0101d"; ++ s2 = toUpper(s1); ++ s3 = s1.dup; toUpperInPlace(s3); ++ assert(s3 == s2); ++ assert(cmp(s2, "A\u0100B\u0100D") == 0); ++ assert(s2 !is s1); ++ ++ s1 = "a\u0460B\u0461d"; ++ s2 = toUpper(s1); ++ s3 = s1.dup; toUpperInPlace(s3); ++ assert(s3 == s2); ++ assert(cmp(s2, "A\u0460B\u0460D") == 0); ++ assert(s2 !is s1); ++} ++ ++unittest + { +- if(std.ascii.isLower(c)) +- c -= 32; +- else if(c >= 0x00E0) ++ static void doTest(C)(const(C)[] s, const(C)[] trueUp, const(C)[] trueLow) + { +- if((c >= 0x00E0 && c <= 0x00F6) || +- (c >= 0x00F8 && c <= 0x00FE)) +- { +- c -= 32; +- } +- else if(c == 0x00FF) +- c = 0x0178; +- else if((c >= 0x0100 && c < 0x0138) || +- (c > 0x0149 && c < 0x0178)) +- { +- if(c == 0x0131) +- c = 0x0049; +- else if(c & 1) +- --c; +- } +- else if((c >= 0x0139 && c < 0x0149) || +- (c > 0x0178 && c < 0x017F)) +- { +- if((c & 1) == 0) +- --c; +- } +- else if(c == 0x017F) +- c = 0x0053; +- else if(c >= 0x0200 && c <= 0x0217) ++ import std.string : format; ++ string diff = "src: %( %x %)\nres: %( %x %)\ntru: %( %x %)"; ++ auto low = s.toLower() , up = s.toUpper(); ++ auto lowInp = s.dup, upInp = s.dup; ++ lowInp.toLowerInPlace(); ++ upInp.toUpperInPlace(); ++ assert(low == trueLow, format(diff, low, trueLow)); ++ assert(up == trueUp, format(diff, up, trueUp)); ++ assert(lowInp == trueLow, ++ format(diff, cast(ubyte[])s, cast(ubyte[])lowInp, cast(ubyte[])trueLow)); ++ assert(upInp == trueUp, ++ format(diff, cast(ubyte[])s, cast(ubyte[])upInp, cast(ubyte[])trueUp)); ++ } ++ foreach(S; TypeTuple!(dstring, wstring, string)) ++ { ++ ++ S easy = "123"; ++ S good = "abCФеж"; ++ S awful = "\u0131\u023f\u2126"; ++ S wicked = "\u0130\u1FE2"; ++ auto options = [easy, good, awful, wicked]; ++ S[] lower = ["123", "abcфеж", "\u0131\u023f\u03c9", "i\u0307\u1Fe2"]; ++ S[] upper = ["123", "ABCФЕЖ", "I\u2c7e\u2126", "\u0130\u03A5\u0308\u0300"]; ++ ++ foreach(val; TypeTuple!(easy, good)) + { +- if(c & 1) +- --c; ++ auto e = val.dup; ++ auto g = e; ++ e.toUpperInPlace(); ++ assert(e is g); ++ e.toLowerInPlace(); ++ assert(e is g); + } +- else if(c >= 0x0430 && c<= 0x044F) +- c -= 32; +- else if((c >= 0x0451 && c <= 0x045C) || +- (c >=0x045E && c<= 0x045F)) ++ foreach(i, v; options) + { +- c -= 80; ++ doTest(v, upper[i], lower[i]); + } +- else if(c >= 0x0460 && c <= 0x047F) ++ ++ // a few combinatorial runs ++ foreach(i; 0..options.length) ++ foreach(j; i..options.length) ++ foreach(k; j..options.length) + { +- if(c & 1) +- --c; ++ auto sample = options[i] ~ options[j] ~ options[k]; ++ auto sample2 = options[k] ~ options[j] ~ options[i]; ++ doTest(sample, upper[i] ~ upper[j] ~ upper[k], ++ lower[i] ~ lower[j] ~ lower[k]); ++ doTest(sample2, upper[k] ~ upper[j] ~ upper[i], ++ lower[k] ~ lower[j] ~ lower[i]); + } +- else if(c >= 0x0561 && c < 0x0587) +- c -= 48; +- else if(c >= 0xFF41 && c <= 0xFF5A) +- c -= 32; + } +- +- return c; + } + +- +-//Explicitly undocumented. Do not use. To be removed in March 2013. +-deprecated("Please use std.uni.isAlpha instead.") bool isUniAlpha(dchar c) @safe pure nothrow ++deprecated("Please use std.uni.isAlpha instead.") ++@safe pure nothrow ++bool isUniAlpha(dchar c) + { + return isAlpha(c); + } + + /++ +- Returns whether $(D c) is a Unicode alpha character +- (general Unicode category: Lu, Ll, Lt, Lm, and Lo). +- +- Standards: Unicode 5.0.0. +- +/ +-bool isAlpha(dchar c) @safe pure nothrow +-{ +- static immutable dchar[2][] table = +- [ +- [ 'A', 'Z' ], +- [ 'a', 'z' ], +- [ 0x00AA, 0x00AA ], +- [ 0x00B5, 0x00B5 ], +- [ 0x00BA, 0x00BA ], +- [ 0x00C0, 0x00D6 ], +- [ 0x00D8, 0x00F6 ], +- [ 0x00F8, 0x02C1 ], +- [ 0x02C6, 0x02D1 ], +- [ 0x02E0, 0x02E4 ], +- [ 0x02EE, 0x02EE ], +- [ 0x037A, 0x037D ], +- [ 0x0386, 0x0386 ], +- [ 0x0388, 0x038A ], +- [ 0x038C, 0x038C ], +- [ 0x038E, 0x03A1 ], +- [ 0x03A3, 0x03CE ], +- [ 0x03D0, 0x03F5 ], +- [ 0x03F7, 0x0481 ], +- [ 0x048A, 0x0513 ], +- [ 0x0531, 0x0556 ], +- [ 0x0559, 0x0559 ], +- [ 0x0561, 0x0587 ], +- [ 0x05D0, 0x05EA ], +- [ 0x05F0, 0x05F2 ], +- [ 0x0621, 0x063A ], +- [ 0x0640, 0x064A ], +- [ 0x066E, 0x066F ], +- [ 0x0671, 0x06D3 ], +- [ 0x06D5, 0x06D5 ], +- [ 0x06E5, 0x06E6 ], +- [ 0x06EE, 0x06EF ], +- [ 0x06FA, 0x06FC ], +- [ 0x06FF, 0x06FF ], +- [ 0x0710, 0x0710 ], +- [ 0x0712, 0x072F ], +- [ 0x074D, 0x076D ], +- [ 0x0780, 0x07A5 ], +- [ 0x07B1, 0x07B1 ], +- [ 0x07CA, 0x07EA ], +- [ 0x07F4, 0x07F5 ], +- [ 0x07FA, 0x07FA ], +- [ 0x0904, 0x0939 ], +- [ 0x093D, 0x093D ], +- [ 0x0950, 0x0950 ], +- [ 0x0958, 0x0961 ], +- [ 0x097B, 0x097F ], +- [ 0x0985, 0x098C ], +- [ 0x098F, 0x0990 ], +- [ 0x0993, 0x09A8 ], +- [ 0x09AA, 0x09B0 ], +- [ 0x09B2, 0x09B2 ], +- [ 0x09B6, 0x09B9 ], +- [ 0x09BD, 0x09BD ], +- [ 0x09CE, 0x09CE ], +- [ 0x09DC, 0x09DD ], +- [ 0x09DF, 0x09E1 ], +- [ 0x09F0, 0x09F1 ], +- [ 0x0A05, 0x0A0A ], +- [ 0x0A0F, 0x0A10 ], +- [ 0x0A13, 0x0A28 ], +- [ 0x0A2A, 0x0A30 ], +- [ 0x0A32, 0x0A33 ], +- [ 0x0A35, 0x0A36 ], +- [ 0x0A38, 0x0A39 ], +- [ 0x0A59, 0x0A5C ], +- [ 0x0A5E, 0x0A5E ], +- [ 0x0A72, 0x0A74 ], +- [ 0x0A85, 0x0A8D ], +- [ 0x0A8F, 0x0A91 ], +- [ 0x0A93, 0x0AA8 ], +- [ 0x0AAA, 0x0AB0 ], +- [ 0x0AB2, 0x0AB3 ], +- [ 0x0AB5, 0x0AB9 ], +- [ 0x0ABD, 0x0ABD ], +- [ 0x0AD0, 0x0AD0 ], +- [ 0x0AE0, 0x0AE1 ], +- [ 0x0B05, 0x0B0C ], +- [ 0x0B0F, 0x0B10 ], +- [ 0x0B13, 0x0B28 ], +- [ 0x0B2A, 0x0B30 ], +- [ 0x0B32, 0x0B33 ], +- [ 0x0B35, 0x0B39 ], +- [ 0x0B3D, 0x0B3D ], +- [ 0x0B5C, 0x0B5D ], +- [ 0x0B5F, 0x0B61 ], +- [ 0x0B71, 0x0B71 ], +- [ 0x0B83, 0x0B83 ], +- [ 0x0B85, 0x0B8A ], +- [ 0x0B8E, 0x0B90 ], +- [ 0x0B92, 0x0B95 ], +- [ 0x0B99, 0x0B9A ], +- [ 0x0B9C, 0x0B9C ], +- [ 0x0B9E, 0x0B9F ], +- [ 0x0BA3, 0x0BA4 ], +- [ 0x0BA8, 0x0BAA ], +- [ 0x0BAE, 0x0BB9 ], +- [ 0x0C05, 0x0C0C ], +- [ 0x0C0E, 0x0C10 ], +- [ 0x0C12, 0x0C28 ], +- [ 0x0C2A, 0x0C33 ], +- [ 0x0C35, 0x0C39 ], +- [ 0x0C60, 0x0C61 ], +- [ 0x0C85, 0x0C8C ], +- [ 0x0C8E, 0x0C90 ], +- [ 0x0C92, 0x0CA8 ], +- [ 0x0CAA, 0x0CB3 ], +- [ 0x0CB5, 0x0CB9 ], +- [ 0x0CBD, 0x0CBD ], +- [ 0x0CDE, 0x0CDE ], +- [ 0x0CE0, 0x0CE1 ], +- [ 0x0D05, 0x0D0C ], +- [ 0x0D0E, 0x0D10 ], +- [ 0x0D12, 0x0D28 ], +- [ 0x0D2A, 0x0D39 ], +- [ 0x0D60, 0x0D61 ], +- [ 0x0D85, 0x0D96 ], +- [ 0x0D9A, 0x0DB1 ], +- [ 0x0DB3, 0x0DBB ], +- [ 0x0DBD, 0x0DBD ], +- [ 0x0DC0, 0x0DC6 ], +- [ 0x0E01, 0x0E30 ], +- [ 0x0E32, 0x0E33 ], +- [ 0x0E40, 0x0E46 ], +- [ 0x0E81, 0x0E82 ], +- [ 0x0E84, 0x0E84 ], +- [ 0x0E87, 0x0E88 ], +- [ 0x0E8A, 0x0E8A ], +- [ 0x0E8D, 0x0E8D ], +- [ 0x0E94, 0x0E97 ], +- [ 0x0E99, 0x0E9F ], +- [ 0x0EA1, 0x0EA3 ], +- [ 0x0EA5, 0x0EA5 ], +- [ 0x0EA7, 0x0EA7 ], +- [ 0x0EAA, 0x0EAB ], +- [ 0x0EAD, 0x0EB0 ], +- [ 0x0EB2, 0x0EB3 ], +- [ 0x0EBD, 0x0EBD ], +- [ 0x0EC0, 0x0EC4 ], +- [ 0x0EC6, 0x0EC6 ], +- [ 0x0EDC, 0x0EDD ], +- [ 0x0F00, 0x0F00 ], +- [ 0x0F40, 0x0F47 ], +- [ 0x0F49, 0x0F6A ], +- [ 0x0F88, 0x0F8B ], +- [ 0x1000, 0x1021 ], +- [ 0x1023, 0x1027 ], +- [ 0x1029, 0x102A ], +- [ 0x1050, 0x1055 ], +- [ 0x10A0, 0x10C5 ], +- [ 0x10D0, 0x10FA ], +- [ 0x10FC, 0x10FC ], +- [ 0x1100, 0x1159 ], +- [ 0x115F, 0x11A2 ], +- [ 0x11A8, 0x11F9 ], +- [ 0x1200, 0x1248 ], +- [ 0x124A, 0x124D ], +- [ 0x1250, 0x1256 ], +- [ 0x1258, 0x1258 ], +- [ 0x125A, 0x125D ], +- [ 0x1260, 0x1288 ], +- [ 0x128A, 0x128D ], +- [ 0x1290, 0x12B0 ], +- [ 0x12B2, 0x12B5 ], +- [ 0x12B8, 0x12BE ], +- [ 0x12C0, 0x12C0 ], +- [ 0x12C2, 0x12C5 ], +- [ 0x12C8, 0x12D6 ], +- [ 0x12D8, 0x1310 ], +- [ 0x1312, 0x1315 ], +- [ 0x1318, 0x135A ], +- [ 0x1380, 0x138F ], +- [ 0x13A0, 0x13F4 ], +- [ 0x1401, 0x166C ], +- [ 0x166F, 0x1676 ], +- [ 0x1681, 0x169A ], +- [ 0x16A0, 0x16EA ], +- [ 0x1700, 0x170C ], +- [ 0x170E, 0x1711 ], +- [ 0x1720, 0x1731 ], +- [ 0x1740, 0x1751 ], +- [ 0x1760, 0x176C ], +- [ 0x176E, 0x1770 ], +- [ 0x1780, 0x17B3 ], +- [ 0x17D7, 0x17D7 ], +- [ 0x17DC, 0x17DC ], +- [ 0x1820, 0x1877 ], +- [ 0x1880, 0x18A8 ], +- [ 0x1900, 0x191C ], +- [ 0x1950, 0x196D ], +- [ 0x1970, 0x1974 ], +- [ 0x1980, 0x19A9 ], +- [ 0x19C1, 0x19C7 ], +- [ 0x1A00, 0x1A16 ], +- [ 0x1B05, 0x1B33 ], +- [ 0x1B45, 0x1B4B ], +- [ 0x1D00, 0x1DBF ], +- [ 0x1E00, 0x1E9B ], +- [ 0x1EA0, 0x1EF9 ], +- [ 0x1F00, 0x1F15 ], +- [ 0x1F18, 0x1F1D ], +- [ 0x1F20, 0x1F45 ], +- [ 0x1F48, 0x1F4D ], +- [ 0x1F50, 0x1F57 ], +- [ 0x1F59, 0x1F59 ], +- [ 0x1F5B, 0x1F5B ], +- [ 0x1F5D, 0x1F5D ], +- [ 0x1F5F, 0x1F7D ], +- [ 0x1F80, 0x1FB4 ], +- [ 0x1FB6, 0x1FBC ], +- [ 0x1FBE, 0x1FBE ], +- [ 0x1FC2, 0x1FC4 ], +- [ 0x1FC6, 0x1FCC ], +- [ 0x1FD0, 0x1FD3 ], +- [ 0x1FD6, 0x1FDB ], +- [ 0x1FE0, 0x1FEC ], +- [ 0x1FF2, 0x1FF4 ], +- [ 0x1FF6, 0x1FFC ], +- [ 0x2071, 0x2071 ], +- [ 0x207F, 0x207F ], +- [ 0x2090, 0x2094 ], +- [ 0x2102, 0x2102 ], +- [ 0x2107, 0x2107 ], +- [ 0x210A, 0x2113 ], +- [ 0x2115, 0x2115 ], +- [ 0x2119, 0x211D ], +- [ 0x2124, 0x2124 ], +- [ 0x2126, 0x2126 ], +- [ 0x2128, 0x2128 ], +- [ 0x212A, 0x212D ], +- [ 0x212F, 0x2139 ], +- [ 0x213C, 0x213F ], +- [ 0x2145, 0x2149 ], +- [ 0x214E, 0x214E ], +- [ 0x2183, 0x2184 ], +- [ 0x2C00, 0x2C2E ], +- [ 0x2C30, 0x2C5E ], +- [ 0x2C60, 0x2C6C ], +- [ 0x2C74, 0x2C77 ], +- [ 0x2C80, 0x2CE4 ], +- [ 0x2D00, 0x2D25 ], +- [ 0x2D30, 0x2D65 ], +- [ 0x2D6F, 0x2D6F ], +- [ 0x2D80, 0x2D96 ], +- [ 0x2DA0, 0x2DA6 ], +- [ 0x2DA8, 0x2DAE ], +- [ 0x2DB0, 0x2DB6 ], +- [ 0x2DB8, 0x2DBE ], +- [ 0x2DC0, 0x2DC6 ], +- [ 0x2DC8, 0x2DCE ], +- [ 0x2DD0, 0x2DD6 ], +- [ 0x2DD8, 0x2DDE ], +- [ 0x3005, 0x3006 ], +- [ 0x3031, 0x3035 ], +- [ 0x303B, 0x303C ], +- [ 0x3041, 0x3096 ], +- [ 0x309D, 0x309F ], +- [ 0x30A1, 0x30FA ], +- [ 0x30FC, 0x30FF ], +- [ 0x3105, 0x312C ], +- [ 0x3131, 0x318E ], +- [ 0x31A0, 0x31B7 ], +- [ 0x31F0, 0x31FF ], +- [ 0x3400, 0x4DB5 ], +- [ 0x4E00, 0x9FBB ], +- [ 0xA000, 0xA48C ], +- [ 0xA717, 0xA71A ], +- [ 0xA800, 0xA801 ], +- [ 0xA803, 0xA805 ], +- [ 0xA807, 0xA80A ], +- [ 0xA80C, 0xA822 ], +- [ 0xA840, 0xA873 ], +- [ 0xAC00, 0xD7A3 ], +- [ 0xF900, 0xFA2D ], +- [ 0xFA30, 0xFA6A ], +- [ 0xFA70, 0xFAD9 ], +- [ 0xFB00, 0xFB06 ], +- [ 0xFB13, 0xFB17 ], +- [ 0xFB1D, 0xFB1D ], +- [ 0xFB1F, 0xFB28 ], +- [ 0xFB2A, 0xFB36 ], +- [ 0xFB38, 0xFB3C ], +- [ 0xFB3E, 0xFB3E ], +- [ 0xFB40, 0xFB41 ], +- [ 0xFB43, 0xFB44 ], +- [ 0xFB46, 0xFBB1 ], +- [ 0xFBD3, 0xFD3D ], +- [ 0xFD50, 0xFD8F ], +- [ 0xFD92, 0xFDC7 ], +- [ 0xFDF0, 0xFDFB ], +- [ 0xFE70, 0xFE74 ], +- [ 0xFE76, 0xFEFC ], +- [ 0xFF21, 0xFF3A ], +- [ 0xFF41, 0xFF5A ], +- [ 0xFF66, 0xFFBE ], +- [ 0xFFC2, 0xFFC7 ], +- [ 0xFFCA, 0xFFCF ], +- [ 0xFFD2, 0xFFD7 ], +- [ 0xFFDA, 0xFFDC ], +- [ 0x10000, 0x1000B ], +- [ 0x1000D, 0x10026 ], +- [ 0x10028, 0x1003A ], +- [ 0x1003C, 0x1003D ], +- [ 0x1003F, 0x1004D ], +- [ 0x10050, 0x1005D ], +- [ 0x10080, 0x100FA ], +- [ 0x10300, 0x1031E ], +- [ 0x10330, 0x10340 ], +- [ 0x10342, 0x10349 ], +- [ 0x10380, 0x1039D ], +- [ 0x103A0, 0x103C3 ], +- [ 0x103C8, 0x103CF ], +- [ 0x10400, 0x1049D ], +- [ 0x10800, 0x10805 ], +- [ 0x10808, 0x10808 ], +- [ 0x1080A, 0x10835 ], +- [ 0x10837, 0x10838 ], +- [ 0x1083C, 0x1083C ], +- [ 0x1083F, 0x1083F ], +- [ 0x10900, 0x10915 ], +- [ 0x10A00, 0x10A00 ], +- [ 0x10A10, 0x10A13 ], +- [ 0x10A15, 0x10A17 ], +- [ 0x10A19, 0x10A33 ], +- [ 0x12000, 0x1236E ], +- [ 0x1D400, 0x1D454 ], +- [ 0x1D456, 0x1D49C ], +- [ 0x1D49E, 0x1D49F ], +- [ 0x1D4A2, 0x1D4A2 ], +- [ 0x1D4A5, 0x1D4A6 ], +- [ 0x1D4A9, 0x1D4AC ], +- [ 0x1D4AE, 0x1D4B9 ], +- [ 0x1D4BB, 0x1D4BB ], +- [ 0x1D4BD, 0x1D4C3 ], +- [ 0x1D4C5, 0x1D505 ], +- [ 0x1D507, 0x1D50A ], +- [ 0x1D50D, 0x1D514 ], +- [ 0x1D516, 0x1D51C ], +- [ 0x1D51E, 0x1D539 ], +- [ 0x1D53B, 0x1D53E ], +- [ 0x1D540, 0x1D544 ], +- [ 0x1D546, 0x1D546 ], +- [ 0x1D54A, 0x1D550 ], +- [ 0x1D552, 0x1D6A5 ], +- [ 0x1D6A8, 0x1D6C0 ], +- [ 0x1D6C2, 0x1D6DA ], +- [ 0x1D6DC, 0x1D6FA ], +- [ 0x1D6FC, 0x1D714 ], +- [ 0x1D716, 0x1D734 ], +- [ 0x1D736, 0x1D74E ], +- [ 0x1D750, 0x1D76E ], +- [ 0x1D770, 0x1D788 ], +- [ 0x1D78A, 0x1D7A8 ], +- [ 0x1D7AA, 0x1D7C2 ], +- [ 0x1D7C4, 0x1D7CB ], +- [ 0x20000, 0x2A6D6 ], +- [ 0x2F800, 0x2FA1D ], +- ]; +- ++ Returns whether $(D c) is a Unicode alphabetic $(CHARACTER) ++ (general Unicode category: Alphabetic). +++/ ++@safe pure nothrow ++bool isAlpha(dchar c) ++{ + // optimization + if(c < 0xAA) + { +- if(c < 'A') +- return false; +- if(c <= 'Z') +- return true; +- if(c < 'a') +- return false; +- if(c <= 'z') ++ size_t x = c - 'A'; ++ if(x <= 'Z' - 'A') + return true; ++ else ++ { ++ x = c - 'a'; ++ if(x <= 'z'-'a') ++ return true; ++ } + return false; + } + +- return binarySearch!table(c); ++ return alphaTrie[c]; + } + +-unittest ++@safe unittest + { +- for(dchar c = 0; c < 0x80; ++c) +- { +- if(c >= 'A' && c <= 'Z') +- assert(isAlpha(c)); +- else if(c >= 'a' && c <= 'z') +- assert(isAlpha(c)); +- else +- assert(!isAlpha(c)); +- } ++ auto alpha = unicode("Alphabetic"); ++ foreach(ch; alpha.byCodepoint) ++ assert(isAlpha(ch)); ++ foreach(ch; 0..0x4000) ++ assert((ch in alpha) == isAlpha(ch)); + } + + + /++ + Returns whether $(D c) is a Unicode mark + (general Unicode category: Mn, Me, Mc). +- +- Standards: Unicode 6.0.0. +- +/ +- +-bool isMark(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isMark(dchar c) + { +- static immutable dchar[2][] tableMn = +- [ +- [ 0x0300, 0x036F ], +- [ 0x0483, 0x0487 ], +- [ 0x0591, 0x05BD ], +- [ 0x05BF, 0x05BF ], +- [ 0x05C1, 0x05C2 ], +- [ 0x05C4, 0x05C5 ], +- [ 0x05C7, 0x05C7 ], +- [ 0x0610, 0x061A ], +- [ 0x064B, 0x065F ], +- [ 0x0670, 0x0670 ], +- [ 0x06D6, 0x06DC ], +- [ 0x06DF, 0x06E4 ], +- [ 0x06E7, 0x06E8 ], +- [ 0x06EA, 0x06ED ], +- [ 0x0711, 0x0711 ], +- [ 0x0730, 0x074A ], +- [ 0x07A6, 0x07B0 ], +- [ 0x07EB, 0x07F3 ], +- [ 0x0816, 0x0819 ], +- [ 0x081B, 0x0823 ], +- [ 0x0825, 0x0827 ], +- [ 0x0829, 0x082D ], +- [ 0x0859, 0x085B ], +- [ 0x0900, 0x0902 ], +- [ 0x093A, 0x093A ], +- [ 0x093C, 0x093C ], +- [ 0x0941, 0x0948 ], +- [ 0x094D, 0x094D ], +- [ 0x0951, 0x0957 ], +- [ 0x0962, 0x0963 ], +- [ 0x0981, 0x0981 ], +- [ 0x09BC, 0x09BC ], +- [ 0x09C1, 0x09C4 ], +- [ 0x09CD, 0x09CD ], +- [ 0x09E2, 0x09E3 ], +- [ 0x0A01, 0x0A02 ], +- [ 0x0A3C, 0x0A3C ], +- [ 0x0A41, 0x0A42 ], +- [ 0x0A47, 0x0A48 ], +- [ 0x0A4B, 0x0A4D ], +- [ 0x0A51, 0x0A51 ], +- [ 0x0A70, 0x0A71 ], +- [ 0x0A75, 0x0A75 ], +- [ 0x0A81, 0x0A82 ], +- [ 0x0ABC, 0x0ABC ], +- [ 0x0AC1, 0x0AC5 ], +- [ 0x0AC7, 0x0AC8 ], +- [ 0x0ACD, 0x0ACD ], +- [ 0x0AE2, 0x0AE3 ], +- [ 0x0B01, 0x0B01 ], +- [ 0x0B3C, 0x0B3C ], +- [ 0x0B3F, 0x0B3F ], +- [ 0x0B41, 0x0B44 ], +- [ 0x0B4D, 0x0B4D ], +- [ 0x0B56, 0x0B56 ], +- [ 0x0B62, 0x0B63 ], +- [ 0x0B82, 0x0B82 ], +- [ 0x0BC0, 0x0BC0 ], +- [ 0x0BCD, 0x0BCD ], +- [ 0x0C3E, 0x0C40 ], +- [ 0x0C46, 0x0C48 ], +- [ 0x0C4A, 0x0C4D ], +- [ 0x0C55, 0x0C56 ], +- [ 0x0C62, 0x0C63 ], +- [ 0x0CBC, 0x0CBC ], +- [ 0x0CBF, 0x0CBF ], +- [ 0x0CC6, 0x0CC6 ], +- [ 0x0CCC, 0x0CCD ], +- [ 0x0CE2, 0x0CE3 ], +- [ 0x0D41, 0x0D44 ], +- [ 0x0D4D, 0x0D4D ], +- [ 0x0D62, 0x0D63 ], +- [ 0x0DCA, 0x0DCA ], +- [ 0x0DD2, 0x0DD4 ], +- [ 0x0DD6, 0x0DD6 ], +- [ 0x0E31, 0x0E31 ], +- [ 0x0E34, 0x0E3A ], +- [ 0x0E47, 0x0E4E ], +- [ 0x0EB1, 0x0EB1 ], +- [ 0x0EB4, 0x0EB9 ], +- [ 0x0EBB, 0x0EBC ], +- [ 0x0EC8, 0x0ECD ], +- [ 0x0F18, 0x0F19 ], +- [ 0x0F35, 0x0F35 ], +- [ 0x0F37, 0x0F37 ], +- [ 0x0F39, 0x0F39 ], +- [ 0x0F71, 0x0F7E ], +- [ 0x0F80, 0x0F84 ], +- [ 0x0F86, 0x0F87 ], +- [ 0x0F8D, 0x0F97 ], +- [ 0x0F99, 0x0FBC ], +- [ 0x0FC6, 0x0FC6 ], +- [ 0x102D, 0x1030 ], +- [ 0x1032, 0x1037 ], +- [ 0x1039, 0x103A ], +- [ 0x103D, 0x103E ], +- [ 0x1058, 0x1059 ], +- [ 0x105E, 0x1060 ], +- [ 0x1071, 0x1074 ], +- [ 0x1082, 0x1082 ], +- [ 0x1085, 0x1086 ], +- [ 0x108D, 0x108D ], +- [ 0x109D, 0x109D ], +- [ 0x135D, 0x135F ], +- [ 0x1712, 0x1714 ], +- [ 0x1732, 0x1734 ], +- [ 0x1752, 0x1753 ], +- [ 0x1772, 0x1773 ], +- [ 0x17B7, 0x17BD ], +- [ 0x17C6, 0x17C6 ], +- [ 0x17C9, 0x17D3 ], +- [ 0x17DD, 0x17DD ], +- [ 0x180B, 0x180D ], +- [ 0x18A9, 0x18A9 ], +- [ 0x1920, 0x1922 ], +- [ 0x1927, 0x1928 ], +- [ 0x1932, 0x1932 ], +- [ 0x1939, 0x193B ], +- [ 0x1A17, 0x1A18 ], +- [ 0x1A56, 0x1A56 ], +- [ 0x1A58, 0x1A5E ], +- [ 0x1A60, 0x1A60 ], +- [ 0x1A62, 0x1A62 ], +- [ 0x1A65, 0x1A6C ], +- [ 0x1A73, 0x1A7C ], +- [ 0x1A7F, 0x1A7F ], +- [ 0x1B00, 0x1B03 ], +- [ 0x1B34, 0x1B34 ], +- [ 0x1B36, 0x1B3A ], +- [ 0x1B3C, 0x1B3C ], +- [ 0x1B42, 0x1B42 ], +- [ 0x1B6B, 0x1B73 ], +- [ 0x1B80, 0x1B81 ], +- [ 0x1BA2, 0x1BA5 ], +- [ 0x1BA8, 0x1BA9 ], +- [ 0x1BE6, 0x1BE6 ], +- [ 0x1BE8, 0x1BE9 ], +- [ 0x1BED, 0x1BED ], +- [ 0x1BEF, 0x1BF1 ], +- [ 0x1C2C, 0x1C33 ], +- [ 0x1C36, 0x1C37 ], +- [ 0x1CD0, 0x1CD2 ], +- [ 0x1CD4, 0x1CE0 ], +- [ 0x1CE2, 0x1CE8 ], +- [ 0x1CED, 0x1CED ], +- [ 0x1DC0, 0x1DE6 ], +- [ 0x1DFC, 0x1DFF ], +- [ 0x20D0, 0x20DC ], +- [ 0x20E1, 0x20E1 ], +- [ 0x20E5, 0x20F0 ], +- [ 0x2CEF, 0x2CF1 ], +- [ 0x2D7F, 0x2D7F ], +- [ 0x2DE0, 0x2DFF ], +- [ 0x302A, 0x302F ], +- [ 0x3099, 0x309A ], +- [ 0xA66F, 0xA66F ], +- [ 0xA67C, 0xA67D ], +- [ 0xA6F0, 0xA6F1 ], +- [ 0xA802, 0xA802 ], +- [ 0xA806, 0xA806 ], +- [ 0xA80B, 0xA80B ], +- [ 0xA825, 0xA826 ], +- [ 0xA8C4, 0xA8C4 ], +- [ 0xA8E0, 0xA8F1 ], +- [ 0xA926, 0xA92D ], +- [ 0xA947, 0xA951 ], +- [ 0xA980, 0xA982 ], +- [ 0xA9B3, 0xA9B3 ], +- [ 0xA9B6, 0xA9B9 ], +- [ 0xA9BC, 0xA9BC ], +- [ 0xAA29, 0xAA2E ], +- [ 0xAA31, 0xAA32 ], +- [ 0xAA35, 0xAA36 ], +- [ 0xAA43, 0xAA43 ], +- [ 0xAA4C, 0xAA4C ], +- [ 0xAAB0, 0xAAB0 ], +- [ 0xAAB2, 0xAAB4 ], +- [ 0xAAB7, 0xAAB8 ], +- [ 0xAABE, 0xAABF ], +- [ 0xAAC1, 0xAAC1 ], +- [ 0xABE5, 0xABE5 ], +- [ 0xABE8, 0xABE8 ], +- [ 0xABED, 0xABED ], +- [ 0xFB1E, 0xFB1E ], +- [ 0xFE00, 0xFE0F ], +- [ 0xFE20, 0xFE26 ], +- [ 0x101FD, 0x101FD ], +- [ 0x10A01, 0x10A03 ], +- [ 0x10A05, 0x10A06 ], +- [ 0x10A0C, 0x10A0F ], +- [ 0x10A38, 0x10A3A ], +- [ 0x10A3F, 0x10A3F ], +- [ 0x11001, 0x11001 ], +- [ 0x11038, 0x11046 ], +- [ 0x11080, 0x11081 ], +- [ 0x110B3, 0x110B6 ], +- [ 0x110B9, 0x110BA ], +- [ 0x1D167, 0x1D169 ], +- [ 0x1D17B, 0x1D182 ], +- [ 0x1D185, 0x1D18B ], +- [ 0x1D1AA, 0x1D1AD ], +- [ 0x1D242, 0x1D244 ], +- [ 0xE0100, 0xE01EF ], +- ]; +- +- static immutable dchar[2][] tableMe = +- [ +- [ 0x0488, 0x0489 ], +- [ 0x20DD, 0x20E0 ], +- [ 0x20E2, 0x20E4 ], +- [ 0xA670, 0xA672 ], +- ]; +- +- static immutable dchar[2][] tableMc = +- [ +- [ 0x0903, 0x0903 ], +- [ 0x093B, 0x093B ], +- [ 0x093E, 0x0940 ], +- [ 0x0949, 0x094C ], +- [ 0x094E, 0x094F ], +- [ 0x0982, 0x0983 ], +- [ 0x09BE, 0x09C0 ], +- [ 0x09C7, 0x09C8 ], +- [ 0x09CB, 0x09CC ], +- [ 0x09D7, 0x09D7 ], +- [ 0x0A03, 0x0A03 ], +- [ 0x0A3E, 0x0A40 ], +- [ 0x0A83, 0x0A83 ], +- [ 0x0ABE, 0x0AC0 ], +- [ 0x0AC9, 0x0AC9 ], +- [ 0x0ACB, 0x0ACC ], +- [ 0x0B02, 0x0B03 ], +- [ 0x0B3E, 0x0B3E ], +- [ 0x0B40, 0x0B40 ], +- [ 0x0B47, 0x0B48 ], +- [ 0x0B4B, 0x0B4C ], +- [ 0x0B57, 0x0B57 ], +- [ 0x0BBE, 0x0BBF ], +- [ 0x0BC1, 0x0BC2 ], +- [ 0x0BC6, 0x0BC8 ], +- [ 0x0BCA, 0x0BCC ], +- [ 0x0BD7, 0x0BD7 ], +- [ 0x0C01, 0x0C03 ], +- [ 0x0C41, 0x0C44 ], +- [ 0x0C82, 0x0C83 ], +- [ 0x0CBE, 0x0CBE ], +- [ 0x0CC0, 0x0CC4 ], +- [ 0x0CC7, 0x0CC8 ], +- [ 0x0CCA, 0x0CCB ], +- [ 0x0CD5, 0x0CD6 ], +- [ 0x0D02, 0x0D03 ], +- [ 0x0D3E, 0x0D40 ], +- [ 0x0D46, 0x0D48 ], +- [ 0x0D4A, 0x0D4C ], +- [ 0x0D57, 0x0D57 ], +- [ 0x0D82, 0x0D83 ], +- [ 0x0DCF, 0x0DD1 ], +- [ 0x0DD8, 0x0DDF ], +- [ 0x0DF2, 0x0DF3 ], +- [ 0x0F3E, 0x0F3F ], +- [ 0x0F7F, 0x0F7F ], +- [ 0x102B, 0x102C ], +- [ 0x1031, 0x1031 ], +- [ 0x1038, 0x1038 ], +- [ 0x103B, 0x103C ], +- [ 0x1056, 0x1057 ], +- [ 0x1062, 0x1064 ], +- [ 0x1067, 0x106D ], +- [ 0x1083, 0x1084 ], +- [ 0x1087, 0x108C ], +- [ 0x108F, 0x108F ], +- [ 0x109A, 0x109C ], +- [ 0x17B6, 0x17B6 ], +- [ 0x17BE, 0x17C5 ], +- [ 0x17C7, 0x17C8 ], +- [ 0x1923, 0x1926 ], +- [ 0x1929, 0x192B ], +- [ 0x1930, 0x1931 ], +- [ 0x1933, 0x1938 ], +- [ 0x19B0, 0x19C0 ], +- [ 0x19C8, 0x19C9 ], +- [ 0x1A19, 0x1A1B ], +- [ 0x1A55, 0x1A55 ], +- [ 0x1A57, 0x1A57 ], +- [ 0x1A61, 0x1A61 ], +- [ 0x1A63, 0x1A64 ], +- [ 0x1A6D, 0x1A72 ], +- [ 0x1B04, 0x1B04 ], +- [ 0x1B35, 0x1B35 ], +- [ 0x1B3B, 0x1B3B ], +- [ 0x1B3D, 0x1B41 ], +- [ 0x1B43, 0x1B44 ], +- [ 0x1B82, 0x1B82 ], +- [ 0x1BA1, 0x1BA1 ], +- [ 0x1BA6, 0x1BA7 ], +- [ 0x1BAA, 0x1BAA ], +- [ 0x1BE7, 0x1BE7 ], +- [ 0x1BEA, 0x1BEC ], +- [ 0x1BEE, 0x1BEE ], +- [ 0x1BF2, 0x1BF3 ], +- [ 0x1C24, 0x1C2B ], +- [ 0x1C34, 0x1C35 ], +- [ 0x1CE1, 0x1CE1 ], +- [ 0x1CF2, 0x1CF2 ], +- [ 0xA823, 0xA824 ], +- [ 0xA827, 0xA827 ], +- [ 0xA880, 0xA881 ], +- [ 0xA8B4, 0xA8C3 ], +- [ 0xA952, 0xA953 ], +- [ 0xA983, 0xA983 ], +- [ 0xA9B4, 0xA9B5 ], +- [ 0xA9BA, 0xA9BB ], +- [ 0xA9BD, 0xA9C0 ], +- [ 0xAA2F, 0xAA30 ], +- [ 0xAA33, 0xAA34 ], +- [ 0xAA4D, 0xAA4D ], +- [ 0xAA7B, 0xAA7B ], +- [ 0xABE3, 0xABE4 ], +- [ 0xABE6, 0xABE7 ], +- [ 0xABE9, 0xABEA ], +- [ 0xABEC, 0xABEC ], +- [ 0x11000, 0x11000 ], +- [ 0x11002, 0x11002 ], +- [ 0x11082, 0x11082 ], +- [ 0x110B0, 0x110B2 ], +- [ 0x110B7, 0x110B8 ], +- [ 0x1D165, 0x1D166 ], +- [ 0x1D16D, 0x1D172 ], +- ]; +- +- return binarySearch!tableMn(c) || binarySearch!tableMe(c) || binarySearch!tableMc(c); ++ return markTrie[c]; + } + +-unittest ++@safe unittest + { +- assert(isMark('\u0300')); +- assert(isMark('\u0488')); +- assert(isMark('\u0903')); ++ auto mark = unicode("Mark"); ++ foreach(ch; mark.byCodepoint) ++ assert(isMark(ch)); ++ foreach(ch; 0..0x4000) ++ assert((ch in mark) == isMark(ch)); + } + +- + /++ +- Returns whether $(D c) is a Unicode numerical character ++ Returns whether $(D c) is a Unicode numerical $(CHARACTER) + (general Unicode category: Nd, Nl, No). +- +- Standards: Unicode 6.0.0. +- +/ +- +-bool isNumber(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isNumber(dchar c) + { +- static immutable dchar[2][] tableNd = +- [ +- [ 0x0030, 0x0039 ], +- [ 0x0660, 0x0669 ], +- [ 0x06F0, 0x06F9 ], +- [ 0x07C0, 0x07C9 ], +- [ 0x0966, 0x096F ], +- [ 0x09E6, 0x09EF ], +- [ 0x0A66, 0x0A6F ], +- [ 0x0AE6, 0x0AEF ], +- [ 0x0B66, 0x0B6F ], +- [ 0x0BE6, 0x0BEF ], +- [ 0x0C66, 0x0C6F ], +- [ 0x0CE6, 0x0CEF ], +- [ 0x0D66, 0x0D6F ], +- [ 0x0E50, 0x0E59 ], +- [ 0x0ED0, 0x0ED9 ], +- [ 0x0F20, 0x0F29 ], +- [ 0x1040, 0x1049 ], +- [ 0x1090, 0x1099 ], +- [ 0x17E0, 0x17E9 ], +- [ 0x1810, 0x1819 ], +- [ 0x1946, 0x194F ], +- [ 0x19D0, 0x19D9 ], +- [ 0x1A80, 0x1A89 ], +- [ 0x1A90, 0x1A99 ], +- [ 0x1B50, 0x1B59 ], +- [ 0x1BB0, 0x1BB9 ], +- [ 0x1C40, 0x1C49 ], +- [ 0x1C50, 0x1C59 ], +- [ 0xA620, 0xA629 ], +- [ 0xA8D0, 0xA8D9 ], +- [ 0xA900, 0xA909 ], +- [ 0xA9D0, 0xA9D9 ], +- [ 0xAA50, 0xAA59 ], +- [ 0xABF0, 0xABF9 ], +- [ 0xFF10, 0xFF19 ], +- [ 0x104A0, 0x104A9 ], +- [ 0x11066, 0x1106F ], +- [ 0x1D7CE, 0x1D7FF ], +- ]; +- +- static immutable dchar[2][] tableNl = +- [ +- [ 0x16EE, 0x16F0 ], +- [ 0x2160, 0x2182 ], +- [ 0x2185, 0x2188 ], +- [ 0x3007, 0x3007 ], +- [ 0x3021, 0x3029 ], +- [ 0x3038, 0x303A ], +- [ 0xA6E6, 0xA6EF ], +- [ 0x10140, 0x10174 ], +- [ 0x10341, 0x10341 ], +- [ 0x1034A, 0x1034A ], +- [ 0x103D1, 0x103D5 ], +- [ 0x12400, 0x12462 ], +- ]; +- +- static immutable dchar[2][] tableNo = +- [ +- [ 0x00B2, 0x00B3 ], +- [ 0x00B9, 0x00B9 ], +- [ 0x00BC, 0x00BE ], +- [ 0x09F4, 0x09F9 ], +- [ 0x0B72, 0x0B77 ], +- [ 0x0BF0, 0x0BF2 ], +- [ 0x0C78, 0x0C7E ], +- [ 0x0D70, 0x0D75 ], +- [ 0x0F2A, 0x0F33 ], +- [ 0x1369, 0x137C ], +- [ 0x17F0, 0x17F9 ], +- [ 0x19DA, 0x19DA ], +- [ 0x2070, 0x2070 ], +- [ 0x2074, 0x2079 ], +- [ 0x2080, 0x2089 ], +- [ 0x2150, 0x215F ], +- [ 0x2189, 0x2189 ], +- [ 0x2460, 0x249B ], +- [ 0x24EA, 0x24FF ], +- [ 0x2776, 0x2793 ], +- [ 0x2CFD, 0x2CFD ], +- [ 0x3192, 0x3195 ], +- [ 0x3220, 0x3229 ], +- [ 0x3251, 0x325F ], +- [ 0x3280, 0x3289 ], +- [ 0x32B1, 0x32BF ], +- [ 0xA830, 0xA835 ], +- [ 0x10107, 0x10133 ], +- [ 0x10175, 0x10178 ], +- [ 0x1018A, 0x1018A ], +- [ 0x10320, 0x10323 ], +- [ 0x10858, 0x1085F ], +- [ 0x10916, 0x1091B ], +- [ 0x10A40, 0x10A47 ], +- [ 0x10A7D, 0x10A7E ], +- [ 0x10B58, 0x10B5F ], +- [ 0x10B78, 0x10B7F ], +- [ 0x10E60, 0x10E7E ], +- [ 0x11052, 0x11065 ], +- [ 0x1D360, 0x1D371 ], +- [ 0x1F100, 0x1F10A ], +- ]; +- +- return binarySearch!tableNd(c) +- || binarySearch!tableNl(c) +- || binarySearch!tableNo(c); ++ return numberTrie[c]; + } + +-unittest ++@safe unittest + { +- for (dchar c = '0'; c < '9'; ++c) +- { +- assert(isNumber(c)); +- } ++ auto n = unicode("N"); ++ foreach(ch; n.byCodepoint) ++ assert(isNumber(ch)); ++ foreach(ch; 0..0x4000) ++ assert((ch in n) == isNumber(ch)); + } + + + /++ +- Returns whether $(D c) is a Unicode punctuation character ++ Returns whether $(D c) is a Unicode punctuation $(CHARACTER) + (general Unicode category: Pd, Ps, Pe, Pc, Po, Pi, Pf). +- +- Standards: Unicode 6.0.0. +- +/ +- +-bool isPunctuation(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isPunctuation(dchar c) + { +- static immutable dchar[2][] tablePd = +- [ +- [ 0x002D, 0x002D ], +- [ 0x058A, 0x058A ], +- [ 0x05BE, 0x05BE ], +- [ 0x1400, 0x1400 ], +- [ 0x1806, 0x1806 ], +- [ 0x2010, 0x2015 ], +- [ 0x2E17, 0x2E17 ], +- [ 0x2E1A, 0x2E1A ], +- [ 0x301C, 0x301C ], +- [ 0x3030, 0x3030 ], +- [ 0x30A0, 0x30A0 ], +- [ 0xFE31, 0xFE32 ], +- [ 0xFE58, 0xFE58 ], +- [ 0xFE63, 0xFE63 ], +- [ 0xFF0D, 0xFF0D ], +- ]; +- +- static immutable dchar[2][] tablePs = +- [ +- [ 0x0028, 0x0028 ], +- [ 0x005B, 0x005B ], +- [ 0x007B, 0x007B ], +- [ 0x0F3A, 0x0F3A ], +- [ 0x0F3C, 0x0F3C ], +- [ 0x169B, 0x169B ], +- [ 0x201A, 0x201A ], +- [ 0x201E, 0x201E ], +- [ 0x2045, 0x2045 ], +- [ 0x207D, 0x207D ], +- [ 0x208D, 0x208D ], +- [ 0x2329, 0x2329 ], +- [ 0x2768, 0x2768 ], +- [ 0x276A, 0x276A ], +- [ 0x276C, 0x276C ], +- [ 0x276E, 0x276E ], +- [ 0x2770, 0x2770 ], +- [ 0x2772, 0x2772 ], +- [ 0x2774, 0x2774 ], +- [ 0x27C5, 0x27C5 ], +- [ 0x27E6, 0x27E6 ], +- [ 0x27E8, 0x27E8 ], +- [ 0x27EA, 0x27EA ], +- [ 0x27EC, 0x27EC ], +- [ 0x27EE, 0x27EE ], +- [ 0x2983, 0x2983 ], +- [ 0x2985, 0x2985 ], +- [ 0x2987, 0x2987 ], +- [ 0x2989, 0x2989 ], +- [ 0x298B, 0x298B ], +- [ 0x298D, 0x298D ], +- [ 0x298F, 0x298F ], +- [ 0x2991, 0x2991 ], +- [ 0x2993, 0x2993 ], +- [ 0x2995, 0x2995 ], +- [ 0x2997, 0x2997 ], +- [ 0x29D8, 0x29D8 ], +- [ 0x29DA, 0x29DA ], +- [ 0x29FC, 0x29FC ], +- [ 0x2E22, 0x2E22 ], +- [ 0x2E24, 0x2E24 ], +- [ 0x2E26, 0x2E26 ], +- [ 0x2E28, 0x2E28 ], +- [ 0x3008, 0x3008 ], +- [ 0x300A, 0x300A ], +- [ 0x300C, 0x300C ], +- [ 0x300E, 0x300E ], +- [ 0x3010, 0x3010 ], +- [ 0x3014, 0x3014 ], +- [ 0x3016, 0x3016 ], +- [ 0x3018, 0x3018 ], +- [ 0x301A, 0x301A ], +- [ 0x301D, 0x301D ], +- [ 0xFD3E, 0xFD3E ], +- [ 0xFE17, 0xFE17 ], +- [ 0xFE35, 0xFE35 ], +- [ 0xFE37, 0xFE37 ], +- [ 0xFE39, 0xFE39 ], +- [ 0xFE3B, 0xFE3B ], +- [ 0xFE3D, 0xFE3D ], +- [ 0xFE3F, 0xFE3F ], +- [ 0xFE41, 0xFE41 ], +- [ 0xFE43, 0xFE43 ], +- [ 0xFE47, 0xFE47 ], +- [ 0xFE59, 0xFE59 ], +- [ 0xFE5B, 0xFE5B ], +- [ 0xFE5D, 0xFE5D ], +- [ 0xFF08, 0xFF08 ], +- [ 0xFF3B, 0xFF3B ], +- [ 0xFF5B, 0xFF5B ], +- [ 0xFF5F, 0xFF5F ], +- [ 0xFF62, 0xFF62 ], +- ]; +- +- static immutable dchar[2][] tablePe = +- [ +- [ 0x0029, 0x0029 ], +- [ 0x005D, 0x005D ], +- [ 0x007D, 0x007D ], +- [ 0x0F3B, 0x0F3B ], +- [ 0x0F3D, 0x0F3D ], +- [ 0x169C, 0x169C ], +- [ 0x2046, 0x2046 ], +- [ 0x207E, 0x207E ], +- [ 0x208E, 0x208E ], +- [ 0x232A, 0x232A ], +- [ 0x2769, 0x2769 ], +- [ 0x276B, 0x276B ], +- [ 0x276D, 0x276D ], +- [ 0x276F, 0x276F ], +- [ 0x2771, 0x2771 ], +- [ 0x2773, 0x2773 ], +- [ 0x2775, 0x2775 ], +- [ 0x27C6, 0x27C6 ], +- [ 0x27E7, 0x27E7 ], +- [ 0x27E9, 0x27E9 ], +- [ 0x27EB, 0x27EB ], +- [ 0x27ED, 0x27ED ], +- [ 0x27EF, 0x27EF ], +- [ 0x2984, 0x2984 ], +- [ 0x2986, 0x2986 ], +- [ 0x2988, 0x2988 ], +- [ 0x298A, 0x298A ], +- [ 0x298C, 0x298C ], +- [ 0x298E, 0x298E ], +- [ 0x2990, 0x2990 ], +- [ 0x2992, 0x2992 ], +- [ 0x2994, 0x2994 ], +- [ 0x2996, 0x2996 ], +- [ 0x2998, 0x2998 ], +- [ 0x29D9, 0x29D9 ], +- [ 0x29DB, 0x29DB ], +- [ 0x29FD, 0x29FD ], +- [ 0x2E23, 0x2E23 ], +- [ 0x2E25, 0x2E25 ], +- [ 0x2E27, 0x2E27 ], +- [ 0x2E29, 0x2E29 ], +- [ 0x3009, 0x3009 ], +- [ 0x300B, 0x300B ], +- [ 0x300D, 0x300D ], +- [ 0x300F, 0x300F ], +- [ 0x3011, 0x3011 ], +- [ 0x3015, 0x3015 ], +- [ 0x3017, 0x3017 ], +- [ 0x3019, 0x3019 ], +- [ 0x301B, 0x301B ], +- [ 0x301E, 0x301F ], +- [ 0xFD3F, 0xFD3F ], +- [ 0xFE18, 0xFE18 ], +- [ 0xFE36, 0xFE36 ], +- [ 0xFE38, 0xFE38 ], +- [ 0xFE3A, 0xFE3A ], +- [ 0xFE3C, 0xFE3C ], +- [ 0xFE3E, 0xFE3E ], +- [ 0xFE40, 0xFE40 ], +- [ 0xFE42, 0xFE42 ], +- [ 0xFE44, 0xFE44 ], +- [ 0xFE48, 0xFE48 ], +- [ 0xFE5A, 0xFE5A ], +- [ 0xFE5C, 0xFE5C ], +- [ 0xFE5E, 0xFE5E ], +- [ 0xFF09, 0xFF09 ], +- [ 0xFF3D, 0xFF3D ], +- [ 0xFF5D, 0xFF5D ], +- [ 0xFF60, 0xFF60 ], +- [ 0xFF63, 0xFF63 ], +- ]; +- +- static immutable dchar[2][] tablePc = +- [ +- [ 0x005F, 0x005F ], +- [ 0x203F, 0x2040 ], +- [ 0x2054, 0x2054 ], +- [ 0xFE33, 0xFE34 ], +- [ 0xFE4D, 0xFE4F ], +- [ 0xFF3F, 0xFF3F ], +- ]; +- +- static immutable dchar[2][] tablePo = +- [ +- [ 0x0021, 0x0023 ], +- [ 0x0025, 0x0027 ], +- [ 0x002A, 0x002A ], +- [ 0x002C, 0x002C ], +- [ 0x002E, 0x002F ], +- [ 0x003A, 0x003B ], +- [ 0x003F, 0x0040 ], +- [ 0x005C, 0x005C ], +- [ 0x00A1, 0x00A1 ], +- [ 0x00B7, 0x00B7 ], +- [ 0x00BF, 0x00BF ], +- [ 0x037E, 0x037E ], +- [ 0x0387, 0x0387 ], +- [ 0x055A, 0x055F ], +- [ 0x0589, 0x0589 ], +- [ 0x05C0, 0x05C0 ], +- [ 0x05C3, 0x05C3 ], +- [ 0x05C6, 0x05C6 ], +- [ 0x05F3, 0x05F4 ], +- [ 0x0609, 0x060A ], +- [ 0x060C, 0x060D ], +- [ 0x061B, 0x061B ], +- [ 0x061E, 0x061F ], +- [ 0x066A, 0x066D ], +- [ 0x06D4, 0x06D4 ], +- [ 0x0700, 0x070D ], +- [ 0x07F7, 0x07F9 ], +- [ 0x0830, 0x083E ], +- [ 0x085E, 0x085E ], +- [ 0x0964, 0x0965 ], +- [ 0x0970, 0x0970 ], +- [ 0x0DF4, 0x0DF4 ], +- [ 0x0E4F, 0x0E4F ], +- [ 0x0E5A, 0x0E5B ], +- [ 0x0F04, 0x0F12 ], +- [ 0x0F85, 0x0F85 ], +- [ 0x0FD0, 0x0FD4 ], +- [ 0x0FD9, 0x0FDA ], +- [ 0x104A, 0x104F ], +- [ 0x10FB, 0x10FB ], +- [ 0x1361, 0x1368 ], +- [ 0x166D, 0x166E ], +- [ 0x16EB, 0x16ED ], +- [ 0x1735, 0x1736 ], +- [ 0x17D4, 0x17D6 ], +- [ 0x17D8, 0x17DA ], +- [ 0x1800, 0x1805 ], +- [ 0x1807, 0x180A ], +- [ 0x1944, 0x1945 ], +- [ 0x1A1E, 0x1A1F ], +- [ 0x1AA0, 0x1AA6 ], +- [ 0x1AA8, 0x1AAD ], +- [ 0x1B5A, 0x1B60 ], +- [ 0x1BFC, 0x1BFF ], +- [ 0x1C3B, 0x1C3F ], +- [ 0x1C7E, 0x1C7F ], +- [ 0x1CD3, 0x1CD3 ], +- [ 0x2016, 0x2017 ], +- [ 0x2020, 0x2027 ], +- [ 0x2030, 0x2038 ], +- [ 0x203B, 0x203E ], +- [ 0x2041, 0x2043 ], +- [ 0x2047, 0x2051 ], +- [ 0x2053, 0x2053 ], +- [ 0x2055, 0x205E ], +- [ 0x2CF9, 0x2CFC ], +- [ 0x2CFE, 0x2CFF ], +- [ 0x2D70, 0x2D70 ], +- [ 0x2E00, 0x2E01 ], +- [ 0x2E06, 0x2E08 ], +- [ 0x2E0B, 0x2E0B ], +- [ 0x2E0E, 0x2E16 ], +- [ 0x2E18, 0x2E19 ], +- [ 0x2E1B, 0x2E1B ], +- [ 0x2E1E, 0x2E1F ], +- [ 0x2E2A, 0x2E2E ], +- [ 0x2E30, 0x2E31 ], +- [ 0x3001, 0x3003 ], +- [ 0x303D, 0x303D ], +- [ 0x30FB, 0x30FB ], +- [ 0xA4FE, 0xA4FF ], +- [ 0xA60D, 0xA60F ], +- [ 0xA673, 0xA673 ], +- [ 0xA67E, 0xA67E ], +- [ 0xA6F2, 0xA6F7 ], +- [ 0xA874, 0xA877 ], +- [ 0xA8CE, 0xA8CF ], +- [ 0xA8F8, 0xA8FA ], +- [ 0xA92E, 0xA92F ], +- [ 0xA95F, 0xA95F ], +- [ 0xA9C1, 0xA9CD ], +- [ 0xA9DE, 0xA9DF ], +- [ 0xAA5C, 0xAA5F ], +- [ 0xAADE, 0xAADF ], +- [ 0xABEB, 0xABEB ], +- [ 0xFE10, 0xFE16 ], +- [ 0xFE19, 0xFE19 ], +- [ 0xFE30, 0xFE30 ], +- [ 0xFE45, 0xFE46 ], +- [ 0xFE49, 0xFE4C ], +- [ 0xFE50, 0xFE52 ], +- [ 0xFE54, 0xFE57 ], +- [ 0xFE5F, 0xFE61 ], +- [ 0xFE68, 0xFE68 ], +- [ 0xFE6A, 0xFE6B ], +- [ 0xFF01, 0xFF03 ], +- [ 0xFF05, 0xFF07 ], +- [ 0xFF0A, 0xFF0A ], +- [ 0xFF0C, 0xFF0C ], +- [ 0xFF0E, 0xFF0F ], +- [ 0xFF1A, 0xFF1B ], +- [ 0xFF1F, 0xFF20 ], +- [ 0xFF3C, 0xFF3C ], +- [ 0xFF61, 0xFF61 ], +- [ 0xFF64, 0xFF65 ], +- [ 0x10100, 0x10101 ], +- [ 0x1039F, 0x1039F ], +- [ 0x103D0, 0x103D0 ], +- [ 0x10857, 0x10857 ], +- [ 0x1091F, 0x1091F ], +- [ 0x1093F, 0x1093F ], +- [ 0x10A50, 0x10A58 ], +- [ 0x10A7F, 0x10A7F ], +- [ 0x10B39, 0x10B3F ], +- [ 0x11047, 0x1104D ], +- [ 0x110BB, 0x110BC ], +- [ 0x110BE, 0x110C1 ], +- [ 0x12470, 0x12473 ], +- ]; +- +- static immutable dchar[2][] tablePi = +- [ +- [ 0x00AB, 0x00AB ], +- [ 0x2018, 0x2018 ], +- [ 0x201B, 0x201C ], +- [ 0x201F, 0x201F ], +- [ 0x2039, 0x2039 ], +- [ 0x2E02, 0x2E02 ], +- [ 0x2E04, 0x2E04 ], +- [ 0x2E09, 0x2E09 ], +- [ 0x2E0C, 0x2E0C ], +- [ 0x2E1C, 0x2E1C ], +- [ 0x2E20, 0x2E20 ], +- ]; +- +- static immutable dchar[2][] tablePf = +- [ +- [ 0x00BB, 0x00BB ], +- [ 0x2019, 0x2019 ], +- [ 0x201D, 0x201D ], +- [ 0x203A, 0x203A ], +- [ 0x2E03, 0x2E03 ], +- [ 0x2E05, 0x2E05 ], +- [ 0x2E0A, 0x2E0A ], +- [ 0x2E0D, 0x2E0D ], +- [ 0x2E1D, 0x2E1D ], +- [ 0x2E21, 0x2E21 ], +- ]; +- +- return binarySearch!tablePd(c) +- || binarySearch!tablePs(c) +- || binarySearch!tablePe(c) +- || binarySearch!tablePc(c) +- || binarySearch!tablePo(c) +- || binarySearch!tablePi(c) +- || binarySearch!tablePf(c); ++ return punctuationTrie[c]; + } + + unittest +@@ -1463,1052 +7223,305 @@ unittest + assert(isPunctuation('\u005F')); + assert(isPunctuation('\u00AB')); + assert(isPunctuation('\u00BB')); ++ foreach(ch; unicode("P").byCodepoint) ++ assert(isPunctuation(ch)); + } + +- + /++ +- Returns whether $(D c) is a Unicode symbol character +- (general Unicode category: Sm, Sc, Sk, So) +- +- Standards: Unicode 6.0.0. +- +/ +-bool isSymbol(dchar c) @safe pure nothrow +-{ +- static immutable dchar[2][] tableSm = +- [ +- [ 0x002B, 0x002B ], +- [ 0x003C, 0x003E ], +- [ 0x007C, 0x007C ], +- [ 0x007E, 0x007E ], +- [ 0x00AC, 0x00AC ], +- [ 0x00B1, 0x00B1 ], +- [ 0x00D7, 0x00D7 ], +- [ 0x00F7, 0x00F7 ], +- [ 0x03F6, 0x03F6 ], +- [ 0x0606, 0x0608 ], +- [ 0x2044, 0x2044 ], +- [ 0x2052, 0x2052 ], +- [ 0x207A, 0x207C ], +- [ 0x208A, 0x208C ], +- [ 0x2118, 0x2118 ], +- [ 0x2140, 0x2144 ], +- [ 0x214B, 0x214B ], +- [ 0x2190, 0x2194 ], +- [ 0x219A, 0x219B ], +- [ 0x21A0, 0x21A0 ], +- [ 0x21A3, 0x21A3 ], +- [ 0x21A6, 0x21A6 ], +- [ 0x21AE, 0x21AE ], +- [ 0x21CE, 0x21CF ], +- [ 0x21D2, 0x21D2 ], +- [ 0x21D4, 0x21D4 ], +- [ 0x21F4, 0x22FF ], +- [ 0x2308, 0x230B ], +- [ 0x2320, 0x2321 ], +- [ 0x237C, 0x237C ], +- [ 0x239B, 0x23B3 ], +- [ 0x23DC, 0x23E1 ], +- [ 0x25B7, 0x25B7 ], +- [ 0x25C1, 0x25C1 ], +- [ 0x25F8, 0x25FF ], +- [ 0x266F, 0x266F ], +- [ 0x27C0, 0x27C4 ], +- [ 0x27C7, 0x27CA ], +- [ 0x27CC, 0x27CC ], +- [ 0x27CE, 0x27E5 ], +- [ 0x27F0, 0x27FF ], +- [ 0x2900, 0x2982 ], +- [ 0x2999, 0x29D7 ], +- [ 0x29DC, 0x29FB ], +- [ 0x29FE, 0x2AFF ], +- [ 0x2B30, 0x2B44 ], +- [ 0x2B47, 0x2B4C ], +- [ 0xFB29, 0xFB29 ], +- [ 0xFE62, 0xFE62 ], +- [ 0xFE64, 0xFE66 ], +- [ 0xFF0B, 0xFF0B ], +- [ 0xFF1C, 0xFF1E ], +- [ 0xFF5C, 0xFF5C ], +- [ 0xFF5E, 0xFF5E ], +- [ 0xFFE2, 0xFFE2 ], +- [ 0xFFE9, 0xFFEC ], +- [ 0x1D6C1, 0x1D6C1 ], +- [ 0x1D6DB, 0x1D6DB ], +- [ 0x1D6FB, 0x1D6FB ], +- [ 0x1D715, 0x1D715 ], +- [ 0x1D735, 0x1D735 ], +- [ 0x1D74F, 0x1D74F ], +- [ 0x1D76F, 0x1D76F ], +- [ 0x1D789, 0x1D789 ], +- [ 0x1D7A9, 0x1D7A9 ], +- [ 0x1D7C3, 0x1D7C3 ], +- ]; +- +- static immutable dchar[2][] tableSc = +- [ +- [ 0x0024, 0x0024 ], +- [ 0x00A2, 0x00A5 ], +- [ 0x060B, 0x060B ], +- [ 0x09F2, 0x09F3 ], +- [ 0x09FB, 0x09FB ], +- [ 0x0AF1, 0x0AF1 ], +- [ 0x0BF9, 0x0BF9 ], +- [ 0x0E3F, 0x0E3F ], +- [ 0x17DB, 0x17DB ], +- [ 0x20A0, 0x20B9 ], +- [ 0xA838, 0xA838 ], +- [ 0xFDFC, 0xFDFC ], +- [ 0xFE69, 0xFE69 ], +- [ 0xFF04, 0xFF04 ], +- [ 0xFFE0, 0xFFE1 ], +- [ 0xFFE5, 0xFFE6 ], +- ]; +- +- static immutable dchar[2][] tableSk = +- [ +- [ 0x005E, 0x005E ], +- [ 0x0060, 0x0060 ], +- [ 0x00A8, 0x00A8 ], +- [ 0x00AF, 0x00AF ], +- [ 0x00B4, 0x00B4 ], +- [ 0x00B8, 0x00B8 ], +- [ 0x02C2, 0x02C5 ], +- [ 0x02D2, 0x02DF ], +- [ 0x02E5, 0x02EB ], +- [ 0x02ED, 0x02ED ], +- [ 0x02EF, 0x02FF ], +- [ 0x0375, 0x0375 ], +- [ 0x0384, 0x0385 ], +- [ 0x1FBD, 0x1FBD ], +- [ 0x1FBF, 0x1FC1 ], +- [ 0x1FCD, 0x1FCF ], +- [ 0x1FDD, 0x1FDF ], +- [ 0x1FED, 0x1FEF ], +- [ 0x1FFD, 0x1FFE ], +- [ 0x309B, 0x309C ], +- [ 0xA700, 0xA716 ], +- [ 0xA720, 0xA721 ], +- [ 0xA789, 0xA78A ], +- [ 0xFBB2, 0xFBC1 ], +- [ 0xFF3E, 0xFF3E ], +- [ 0xFF40, 0xFF40 ], +- [ 0xFFE3, 0xFFE3 ], +- ]; +- +- static immutable dchar[2][] tableSo = +- [ +- [ 0x00A6, 0x00A7 ], +- [ 0x00A9, 0x00A9 ], +- [ 0x00AE, 0x00AE ], +- [ 0x00B0, 0x00B0 ], +- [ 0x00B6, 0x00B6 ], +- [ 0x0482, 0x0482 ], +- [ 0x060E, 0x060F ], +- [ 0x06DE, 0x06DE ], +- [ 0x06E9, 0x06E9 ], +- [ 0x06FD, 0x06FE ], +- [ 0x07F6, 0x07F6 ], +- [ 0x09FA, 0x09FA ], +- [ 0x0B70, 0x0B70 ], +- [ 0x0BF3, 0x0BF8 ], +- [ 0x0BFA, 0x0BFA ], +- [ 0x0C7F, 0x0C7F ], +- [ 0x0D79, 0x0D79 ], +- [ 0x0F01, 0x0F03 ], +- [ 0x0F13, 0x0F17 ], +- [ 0x0F1A, 0x0F1F ], +- [ 0x0F34, 0x0F34 ], +- [ 0x0F36, 0x0F36 ], +- [ 0x0F38, 0x0F38 ], +- [ 0x0FBE, 0x0FC5 ], +- [ 0x0FC7, 0x0FCC ], +- [ 0x0FCE, 0x0FCF ], +- [ 0x0FD5, 0x0FD8 ], +- [ 0x109E, 0x109F ], +- [ 0x1360, 0x1360 ], +- [ 0x1390, 0x1399 ], +- [ 0x1940, 0x1940 ], +- [ 0x19DE, 0x19FF ], +- [ 0x1B61, 0x1B6A ], +- [ 0x1B74, 0x1B7C ], +- [ 0x2100, 0x2101 ], +- [ 0x2103, 0x2106 ], +- [ 0x2108, 0x2109 ], +- [ 0x2114, 0x2114 ], +- [ 0x2116, 0x2117 ], +- [ 0x211E, 0x2123 ], +- [ 0x2125, 0x2125 ], +- [ 0x2127, 0x2127 ], +- [ 0x2129, 0x2129 ], +- [ 0x212E, 0x212E ], +- [ 0x213A, 0x213B ], +- [ 0x214A, 0x214A ], +- [ 0x214C, 0x214D ], +- [ 0x214F, 0x214F ], +- [ 0x2195, 0x2199 ], +- [ 0x219C, 0x219F ], +- [ 0x21A1, 0x21A2 ], +- [ 0x21A4, 0x21A5 ], +- [ 0x21A7, 0x21AD ], +- [ 0x21AF, 0x21CD ], +- [ 0x21D0, 0x21D1 ], +- [ 0x21D3, 0x21D3 ], +- [ 0x21D5, 0x21F3 ], +- [ 0x2300, 0x2307 ], +- [ 0x230C, 0x231F ], +- [ 0x2322, 0x2328 ], +- [ 0x232B, 0x237B ], +- [ 0x237D, 0x239A ], +- [ 0x23B4, 0x23DB ], +- [ 0x23E2, 0x23F3 ], +- [ 0x2400, 0x2426 ], +- [ 0x2440, 0x244A ], +- [ 0x249C, 0x24E9 ], +- [ 0x2500, 0x25B6 ], +- [ 0x25B8, 0x25C0 ], +- [ 0x25C2, 0x25F7 ], +- [ 0x2600, 0x266E ], +- [ 0x2670, 0x26FF ], +- [ 0x2701, 0x2767 ], +- [ 0x2794, 0x27BF ], +- [ 0x2800, 0x28FF ], +- [ 0x2B00, 0x2B2F ], +- [ 0x2B45, 0x2B46 ], +- [ 0x2B50, 0x2B59 ], +- [ 0x2CE5, 0x2CEA ], +- [ 0x2E80, 0x2E99 ], +- [ 0x2E9B, 0x2EF3 ], +- [ 0x2F00, 0x2FD5 ], +- [ 0x2FF0, 0x2FFB ], +- [ 0x3004, 0x3004 ], +- [ 0x3012, 0x3013 ], +- [ 0x3020, 0x3020 ], +- [ 0x3036, 0x3037 ], +- [ 0x303E, 0x303F ], +- [ 0x3190, 0x3191 ], +- [ 0x3196, 0x319F ], +- [ 0x31C0, 0x31E3 ], +- [ 0x3200, 0x321E ], +- [ 0x322A, 0x3250 ], +- [ 0x3260, 0x327F ], +- [ 0x328A, 0x32B0 ], +- [ 0x32C0, 0x32FE ], +- [ 0x3300, 0x33FF ], +- [ 0x4DC0, 0x4DFF ], +- [ 0xA490, 0xA4C6 ], +- [ 0xA828, 0xA82B ], +- [ 0xA836, 0xA837 ], +- [ 0xA839, 0xA839 ], +- [ 0xAA77, 0xAA79 ], +- [ 0xFDFD, 0xFDFD ], +- [ 0xFFE4, 0xFFE4 ], +- [ 0xFFE8, 0xFFE8 ], +- [ 0xFFED, 0xFFEE ], +- [ 0xFFFC, 0xFFFD ], +- [ 0x10102, 0x10102 ], +- [ 0x10137, 0x1013F ], +- [ 0x10179, 0x10189 ], +- [ 0x10190, 0x1019B ], +- [ 0x101D0, 0x101FC ], +- [ 0x1D000, 0x1D0F5 ], +- [ 0x1D100, 0x1D126 ], +- [ 0x1D129, 0x1D164 ], +- [ 0x1D16A, 0x1D16C ], +- [ 0x1D183, 0x1D184 ], +- [ 0x1D18C, 0x1D1A9 ], +- [ 0x1D1AE, 0x1D1DD ], +- [ 0x1D200, 0x1D241 ], +- [ 0x1D245, 0x1D245 ], +- [ 0x1D300, 0x1D356 ], +- [ 0x1F000, 0x1F02B ], +- [ 0x1F030, 0x1F093 ], +- [ 0x1F0A0, 0x1F0AE ], +- [ 0x1F0B1, 0x1F0BE ], +- [ 0x1F0C1, 0x1F0CF ], +- [ 0x1F0D1, 0x1F0DF ], +- [ 0x1F110, 0x1F12E ], +- [ 0x1F130, 0x1F169 ], +- [ 0x1F170, 0x1F19A ], +- [ 0x1F1E6, 0x1F202 ], +- [ 0x1F210, 0x1F23A ], +- [ 0x1F240, 0x1F248 ], +- [ 0x1F250, 0x1F251 ], +- [ 0x1F300, 0x1F320 ], +- [ 0x1F330, 0x1F335 ], +- [ 0x1F337, 0x1F37C ], +- [ 0x1F380, 0x1F393 ], +- [ 0x1F3A0, 0x1F3C4 ], +- [ 0x1F3C6, 0x1F3CA ], +- [ 0x1F3E0, 0x1F3F0 ], +- [ 0x1F400, 0x1F43E ], +- [ 0x1F440, 0x1F440 ], +- [ 0x1F442, 0x1F4F7 ], +- [ 0x1F4F9, 0x1F4FC ], +- [ 0x1F500, 0x1F53D ], +- [ 0x1F550, 0x1F567 ], +- [ 0x1F5FB, 0x1F5FF ], +- [ 0x1F601, 0x1F610 ], +- [ 0x1F612, 0x1F614 ], +- [ 0x1F616, 0x1F616 ], +- [ 0x1F618, 0x1F618 ], +- [ 0x1F61A, 0x1F61A ], +- [ 0x1F61C, 0x1F61E ], +- [ 0x1F620, 0x1F625 ], +- [ 0x1F628, 0x1F62B ], +- [ 0x1F62D, 0x1F62D ], +- [ 0x1F630, 0x1F633 ], +- [ 0x1F635, 0x1F640 ], +- [ 0x1F645, 0x1F64F ], +- [ 0x1F680, 0x1F6C5 ], +- [ 0x1F700, 0x1F773 ], +- ]; +- +- return binarySearch!tableSm(c) +- || binarySearch!tableSc(c) +- || binarySearch!tableSk(c) +- || binarySearch!tableSo(c); ++ Returns whether $(D c) is a Unicode symbol $(CHARACTER) ++ (general Unicode category: Sm, Sc, Sk, So). +++/ ++@safe pure nothrow ++bool isSymbol(dchar c) ++{ ++ return symbolTrie[c]; + } + + unittest + { ++ import std.string; + assert(isSymbol('\u0024')); + assert(isSymbol('\u002B')); + assert(isSymbol('\u005E')); + assert(isSymbol('\u00A6')); ++ foreach(ch; unicode("S").byCodepoint) ++ assert(isSymbol(ch), format("%04x", ch)); + } + +- + /++ +- Returns whether $(D c) is a Unicode whitespace character ++ Returns whether $(D c) is a Unicode space $(CHARACTER) + (general Unicode category: Zs) +- +- Standards: Unicode 6.0.0. +- +/ +-bool isSpace(dchar c) @safe pure nothrow +-{ +- return (c == 0x0020 || +- c == 0x00A0 || c == 0x1680 || c == 0x180E || +- (0x2000 <= c && c <= 0x200A) || +- c == 0x202F || c == 0x205F || c == 0x3000); ++ Note: This doesn't include '\n', '\r', \t' and other non-space $(CHARACTER). ++ For commonly used less strict semantics see $(LREF isWhite). +++/ ++@safe pure nothrow ++bool isSpace(dchar c) ++{ ++ return isSpaceGen(c); + } + + unittest + { + assert(isSpace('\u0020')); ++ auto space = unicode.Zs; ++ foreach(ch; space.byCodepoint) ++ assert(isSpace(ch)); ++ foreach(ch; 0..0x1000) ++ assert(isSpace(ch) == space[ch]); + } + + + /++ +- Returns whether $(D c) is a Unicode graphical character ++ Returns whether $(D c) is a Unicode graphical $(CHARACTER) + (general Unicode category: L, M, N, P, S, Zs). + +- Standards: Unicode 6.0.0. +- +/ +- +-bool isGraphical(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isGraphical(dchar c) + { +- return isAlpha(c) || isNumber(c) || isSpace(c) +- || isMark(c) || isPunctuation(c) || isSymbol(c); ++ return graphicalTrie[c]; + } + ++ + unittest + { ++ auto set = unicode("Graphical"); ++ import std.string; ++ foreach(ch; set.byCodepoint) ++ assert(isGraphical(ch), format("%4x", ch)); ++ foreach(ch; 0..0x4000) ++ assert((ch in set) == isGraphical(ch)); + } + + + /++ +- Returns whether $(D c) is a Unicode control character +- (general Unicode category: Cc) +- +- Standards: Unicode 6.0.0. +- +/ +- +-bool isControl(dchar c) @safe pure nothrow ++ Returns whether $(D c) is a Unicode control $(CHARACTER) ++ (general Unicode category: Cc). +++/ ++@safe pure nothrow ++bool isControl(dchar c) + { +- return (c <= 0x1F || (0x80 <= c && c <= 0x9F)); ++ return isControlGen(c); + } + + unittest + { + assert(isControl('\u0000')); ++ assert(isControl('\u0081')); ++ assert(!isControl('\u0100')); ++ auto cc = unicode.Cc; ++ foreach(ch; cc.byCodepoint) ++ assert(isControl(ch)); ++ foreach(ch; 0..0x1000) ++ assert(isControl(ch) == cc[ch]); + } + + + /++ +- Returns whether $(D c) is a Unicode formatting character +- (general Unicode category: Cf) +- +- Standards: Unicode 6.0.0. +- +/ +-bool isFormat(dchar c) @safe pure nothrow +-{ +- static immutable dchar[2][] tableCf = +- [ +- [ 0x00AD, 0x00AD ], +- [ 0x0600, 0x0603 ], +- [ 0x06DD, 0x06DD ], +- [ 0x070F, 0x070F ], +- [ 0x17B4, 0x17B5 ], +- [ 0x200B, 0x200F ], +- [ 0x202A, 0x202E ], +- [ 0x2060, 0x2064 ], +- [ 0x206A, 0x206F ], +- [ 0xFEFF, 0xFEFF ], +- [ 0xFFF9, 0xFFFB ], +- [ 0x110BD, 0x110BD ], +- [ 0x1D173, 0x1D17A ], +- [ 0xE0001, 0xE0001 ], +- [ 0xE0020, 0xE007F ], +- ]; +- +- return binarySearch!tableCf(c); ++ Returns whether $(D c) is a Unicode formatting $(CHARACTER) ++ (general Unicode category: Cf). +++/ ++@safe pure nothrow ++bool isFormat(dchar c) ++{ ++ return isFormatGen(c); + } + ++ + unittest + { + assert(isFormat('\u00AD')); ++ foreach(ch; unicode("Format").byCodepoint) ++ assert(isFormat(ch)); + } + ++// code points for private use, surrogates are not likely to change in near feature ++// if need be they can be generated from unicode data as well + + /++ +- Returns whether $(D c) is a Unicode Private Use character +- (general Unicode category: Co) +- +- Standards: Unicode 6.0.0. +- +/ +-bool isPrivateUse(dchar c) @safe pure nothrow ++ Returns whether $(D c) is a Unicode Private Use $(CODEPOINT) ++ (general Unicode category: Co). +++/ ++@safe pure nothrow ++bool isPrivateUse(dchar c) + { + return (0x00_E000 <= c && c <= 0x00_F8FF) + || (0x0F_0000 <= c && c <= 0x0F_FFFD) + || (0x10_0000 <= c && c <= 0x10_FFFD); + } + +- +-unittest +-{ +-} +- +- + /++ +- Returns whether $(D c) is a Unicode surrogate character +- (general Unicode category: Cs) +- +- Standards: Unicode 6.0.0. +- +/ +-bool isSurrogate(dchar c) @safe pure nothrow ++ Returns whether $(D c) is a Unicode surrogate $(CODEPOINT) ++ (general Unicode category: Cs). +++/ ++@safe pure nothrow ++bool isSurrogate(dchar c) + { + return (0xD800 <= c && c <= 0xDFFF); + } + + /++ + Returns whether $(D c) is a Unicode high surrogate (lead surrogate). +- +- Standards: Unicode 2.0. +- +/ +-bool isSurrogateHi(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isSurrogateHi(dchar c) + { + return (0xD800 <= c && c <= 0xDBFF); + } + + /++ + Returns whether $(D c) is a Unicode low surrogate (trail surrogate). +- +- Standards: Unicode 2.0. +- +/ +-bool isSurrogateLo(dchar c) @safe pure nothrow +++/ ++@safe pure nothrow ++bool isSurrogateLo(dchar c) + { + return (0xDC00 <= c && c <= 0xDFFF); + } + +-unittest ++/++ ++ Returns whether $(D c) is a Unicode non-character i.e. ++ a $(CODEPOINT) with no assigned abstract character. ++ (general Unicode category: Cn) +++/ ++@safe pure nothrow ++bool isNonCharacter(dchar c) + { ++ return nonCharacterTrie[c]; + } + ++unittest ++{ ++ auto set = unicode("Cn"); ++ foreach(ch; set.byCodepoint) ++ assert(isNonCharacter(ch)); ++} + +-/++ +- Returns whether $(D c) is a Unicode non-character +- (general Unicode category: Cn) ++private: ++// load static data from pre-generated tables into usable datastructures + +- Standards: Unicode 6.0.0. +- +/ +-bool isNonCharacter(dchar c) @safe pure nothrow +-{ +- static immutable dchar[2][] table = +- [ +- [ 0x0378, 0x0379 ], +- [ 0x037F, 0x0383 ], +- [ 0x038B, 0x038B ], +- [ 0x038D, 0x038D ], +- [ 0x03A2, 0x03A2 ], +- [ 0x0528, 0x0530 ], +- [ 0x0557, 0x0558 ], +- [ 0x0560, 0x0560 ], +- [ 0x0588, 0x0588 ], +- [ 0x058B, 0x0590 ], +- [ 0x05C8, 0x05CF ], +- [ 0x05EB, 0x05EF ], +- [ 0x05F5, 0x05FF ], +- [ 0x0604, 0x0605 ], +- [ 0x061C, 0x061D ], +- [ 0x070E, 0x070E ], +- [ 0x074B, 0x074C ], +- [ 0x07B2, 0x07BF ], +- [ 0x07FB, 0x07FF ], +- [ 0x082E, 0x082F ], +- [ 0x083F, 0x083F ], +- [ 0x085C, 0x085D ], +- [ 0x085F, 0x08FF ], +- [ 0x0978, 0x0978 ], +- [ 0x0980, 0x0980 ], +- [ 0x0984, 0x0984 ], +- [ 0x098D, 0x098E ], +- [ 0x0991, 0x0992 ], +- [ 0x09A9, 0x09A9 ], +- [ 0x09B1, 0x09B1 ], +- [ 0x09B3, 0x09B5 ], +- [ 0x09BA, 0x09BB ], +- [ 0x09C5, 0x09C6 ], +- [ 0x09C9, 0x09CA ], +- [ 0x09CF, 0x09D6 ], +- [ 0x09D8, 0x09DB ], +- [ 0x09DE, 0x09DE ], +- [ 0x09E4, 0x09E5 ], +- [ 0x09FC, 0x0A00 ], +- [ 0x0A04, 0x0A04 ], +- [ 0x0A0B, 0x0A0E ], +- [ 0x0A11, 0x0A12 ], +- [ 0x0A29, 0x0A29 ], +- [ 0x0A31, 0x0A31 ], +- [ 0x0A34, 0x0A34 ], +- [ 0x0A37, 0x0A37 ], +- [ 0x0A3A, 0x0A3B ], +- [ 0x0A3D, 0x0A3D ], +- [ 0x0A43, 0x0A46 ], +- [ 0x0A49, 0x0A4A ], +- [ 0x0A4E, 0x0A50 ], +- [ 0x0A52, 0x0A58 ], +- [ 0x0A5D, 0x0A5D ], +- [ 0x0A5F, 0x0A65 ], +- [ 0x0A76, 0x0A80 ], +- [ 0x0A84, 0x0A84 ], +- [ 0x0A8E, 0x0A8E ], +- [ 0x0A92, 0x0A92 ], +- [ 0x0AA9, 0x0AA9 ], +- [ 0x0AB1, 0x0AB1 ], +- [ 0x0AB4, 0x0AB4 ], +- [ 0x0ABA, 0x0ABB ], +- [ 0x0AC6, 0x0AC6 ], +- [ 0x0ACA, 0x0ACA ], +- [ 0x0ACE, 0x0ACF ], +- [ 0x0AD1, 0x0ADF ], +- [ 0x0AE4, 0x0AE5 ], +- [ 0x0AF0, 0x0AF0 ], +- [ 0x0AF2, 0x0B00 ], +- [ 0x0B04, 0x0B04 ], +- [ 0x0B0D, 0x0B0E ], +- [ 0x0B11, 0x0B12 ], +- [ 0x0B29, 0x0B29 ], +- [ 0x0B31, 0x0B31 ], +- [ 0x0B34, 0x0B34 ], +- [ 0x0B3A, 0x0B3B ], +- [ 0x0B45, 0x0B46 ], +- [ 0x0B49, 0x0B4A ], +- [ 0x0B4E, 0x0B55 ], +- [ 0x0B58, 0x0B5B ], +- [ 0x0B5E, 0x0B5E ], +- [ 0x0B64, 0x0B65 ], +- [ 0x0B78, 0x0B81 ], +- [ 0x0B84, 0x0B84 ], +- [ 0x0B8B, 0x0B8D ], +- [ 0x0B91, 0x0B91 ], +- [ 0x0B96, 0x0B98 ], +- [ 0x0B9B, 0x0B9B ], +- [ 0x0B9D, 0x0B9D ], +- [ 0x0BA0, 0x0BA2 ], +- [ 0x0BA5, 0x0BA7 ], +- [ 0x0BAB, 0x0BAD ], +- [ 0x0BBA, 0x0BBD ], +- [ 0x0BC3, 0x0BC5 ], +- [ 0x0BC9, 0x0BC9 ], +- [ 0x0BCE, 0x0BCF ], +- [ 0x0BD1, 0x0BD6 ], +- [ 0x0BD8, 0x0BE5 ], +- [ 0x0BFB, 0x0C00 ], +- [ 0x0C04, 0x0C04 ], +- [ 0x0C0D, 0x0C0D ], +- [ 0x0C11, 0x0C11 ], +- [ 0x0C29, 0x0C29 ], +- [ 0x0C34, 0x0C34 ], +- [ 0x0C3A, 0x0C3C ], +- [ 0x0C45, 0x0C45 ], +- [ 0x0C49, 0x0C49 ], +- [ 0x0C4E, 0x0C54 ], +- [ 0x0C57, 0x0C57 ], +- [ 0x0C5A, 0x0C5F ], +- [ 0x0C64, 0x0C65 ], +- [ 0x0C70, 0x0C77 ], +- [ 0x0C80, 0x0C81 ], +- [ 0x0C84, 0x0C84 ], +- [ 0x0C8D, 0x0C8D ], +- [ 0x0C91, 0x0C91 ], +- [ 0x0CA9, 0x0CA9 ], +- [ 0x0CB4, 0x0CB4 ], +- [ 0x0CBA, 0x0CBB ], +- [ 0x0CC5, 0x0CC5 ], +- [ 0x0CC9, 0x0CC9 ], +- [ 0x0CCE, 0x0CD4 ], +- [ 0x0CD7, 0x0CDD ], +- [ 0x0CDF, 0x0CDF ], +- [ 0x0CE4, 0x0CE5 ], +- [ 0x0CF0, 0x0CF0 ], +- [ 0x0CF3, 0x0D01 ], +- [ 0x0D04, 0x0D04 ], +- [ 0x0D0D, 0x0D0D ], +- [ 0x0D11, 0x0D11 ], +- [ 0x0D3B, 0x0D3C ], +- [ 0x0D45, 0x0D45 ], +- [ 0x0D49, 0x0D49 ], +- [ 0x0D4F, 0x0D56 ], +- [ 0x0D58, 0x0D5F ], +- [ 0x0D64, 0x0D65 ], +- [ 0x0D76, 0x0D78 ], +- [ 0x0D80, 0x0D81 ], +- [ 0x0D84, 0x0D84 ], +- [ 0x0D97, 0x0D99 ], +- [ 0x0DB2, 0x0DB2 ], +- [ 0x0DBC, 0x0DBC ], +- [ 0x0DBE, 0x0DBF ], +- [ 0x0DC7, 0x0DC9 ], +- [ 0x0DCB, 0x0DCE ], +- [ 0x0DD5, 0x0DD5 ], +- [ 0x0DD7, 0x0DD7 ], +- [ 0x0DE0, 0x0DF1 ], +- [ 0x0DF5, 0x0E00 ], +- [ 0x0E3B, 0x0E3E ], +- [ 0x0E5C, 0x0E80 ], +- [ 0x0E83, 0x0E83 ], +- [ 0x0E85, 0x0E86 ], +- [ 0x0E89, 0x0E89 ], +- [ 0x0E8B, 0x0E8C ], +- [ 0x0E8E, 0x0E93 ], +- [ 0x0E98, 0x0E98 ], +- [ 0x0EA0, 0x0EA0 ], +- [ 0x0EA4, 0x0EA4 ], +- [ 0x0EA6, 0x0EA6 ], +- [ 0x0EA8, 0x0EA9 ], +- [ 0x0EAC, 0x0EAC ], +- [ 0x0EBA, 0x0EBA ], +- [ 0x0EBE, 0x0EBF ], +- [ 0x0EC5, 0x0EC5 ], +- [ 0x0EC7, 0x0EC7 ], +- [ 0x0ECE, 0x0ECF ], +- [ 0x0EDA, 0x0EDB ], +- [ 0x0EDE, 0x0EFF ], +- [ 0x0F48, 0x0F48 ], +- [ 0x0F6D, 0x0F70 ], +- [ 0x0F98, 0x0F98 ], +- [ 0x0FBD, 0x0FBD ], +- [ 0x0FCD, 0x0FCD ], +- [ 0x0FDB, 0x0FFF ], +- [ 0x10C6, 0x10CF ], +- [ 0x10FD, 0x10FF ], +- [ 0x1249, 0x1249 ], +- [ 0x124E, 0x124F ], +- [ 0x1257, 0x1257 ], +- [ 0x1259, 0x1259 ], +- [ 0x125E, 0x125F ], +- [ 0x1289, 0x1289 ], +- [ 0x128E, 0x128F ], +- [ 0x12B1, 0x12B1 ], +- [ 0x12B6, 0x12B7 ], +- [ 0x12BF, 0x12BF ], +- [ 0x12C1, 0x12C1 ], +- [ 0x12C6, 0x12C7 ], +- [ 0x12D7, 0x12D7 ], +- [ 0x1311, 0x1311 ], +- [ 0x1316, 0x1317 ], +- [ 0x135B, 0x135C ], +- [ 0x137D, 0x137F ], +- [ 0x139A, 0x139F ], +- [ 0x13F5, 0x13FF ], +- [ 0x169D, 0x169F ], +- [ 0x16F1, 0x16FF ], +- [ 0x170D, 0x170D ], +- [ 0x1715, 0x171F ], +- [ 0x1737, 0x173F ], +- [ 0x1754, 0x175F ], +- [ 0x176D, 0x176D ], +- [ 0x1771, 0x1771 ], +- [ 0x1774, 0x177F ], +- [ 0x17DE, 0x17DF ], +- [ 0x17EA, 0x17EF ], +- [ 0x17FA, 0x17FF ], +- [ 0x180F, 0x180F ], +- [ 0x181A, 0x181F ], +- [ 0x1878, 0x187F ], +- [ 0x18AB, 0x18AF ], +- [ 0x18F6, 0x18FF ], +- [ 0x191D, 0x191F ], +- [ 0x192C, 0x192F ], +- [ 0x193C, 0x193F ], +- [ 0x1941, 0x1943 ], +- [ 0x196E, 0x196F ], +- [ 0x1975, 0x197F ], +- [ 0x19AC, 0x19AF ], +- [ 0x19CA, 0x19CF ], +- [ 0x19DB, 0x19DD ], +- [ 0x1A1C, 0x1A1D ], +- [ 0x1A5F, 0x1A5F ], +- [ 0x1A7D, 0x1A7E ], +- [ 0x1A8A, 0x1A8F ], +- [ 0x1A9A, 0x1A9F ], +- [ 0x1AAE, 0x1AFF ], +- [ 0x1B4C, 0x1B4F ], +- [ 0x1B7D, 0x1B7F ], +- [ 0x1BAB, 0x1BAD ], +- [ 0x1BBA, 0x1BBF ], +- [ 0x1BF4, 0x1BFB ], +- [ 0x1C38, 0x1C3A ], +- [ 0x1C4A, 0x1C4C ], +- [ 0x1C80, 0x1CCF ], +- [ 0x1CF3, 0x1CFF ], +- [ 0x1DE7, 0x1DFB ], +- [ 0x1F16, 0x1F17 ], +- [ 0x1F1E, 0x1F1F ], +- [ 0x1F46, 0x1F47 ], +- [ 0x1F4E, 0x1F4F ], +- [ 0x1F58, 0x1F58 ], +- [ 0x1F5A, 0x1F5A ], +- [ 0x1F5C, 0x1F5C ], +- [ 0x1F5E, 0x1F5E ], +- [ 0x1F7E, 0x1F7F ], +- [ 0x1FB5, 0x1FB5 ], +- [ 0x1FC5, 0x1FC5 ], +- [ 0x1FD4, 0x1FD5 ], +- [ 0x1FDC, 0x1FDC ], +- [ 0x1FF0, 0x1FF1 ], +- [ 0x1FF5, 0x1FF5 ], +- [ 0x1FFF, 0x1FFF ], +- [ 0x2065, 0x2069 ], +- [ 0x2072, 0x2073 ], +- [ 0x208F, 0x208F ], +- [ 0x209D, 0x209F ], +- [ 0x20BA, 0x20CF ], +- [ 0x20F1, 0x20FF ], +- [ 0x218A, 0x218F ], +- [ 0x23F4, 0x23FF ], +- [ 0x2427, 0x243F ], +- [ 0x244B, 0x245F ], +- [ 0x2700, 0x2700 ], +- [ 0x27CB, 0x27CB ], +- [ 0x27CD, 0x27CD ], +- [ 0x2B4D, 0x2B4F ], +- [ 0x2B5A, 0x2BFF ], +- [ 0x2C2F, 0x2C2F ], +- [ 0x2C5F, 0x2C5F ], +- [ 0x2CF2, 0x2CF8 ], +- [ 0x2D26, 0x2D2F ], +- [ 0x2D66, 0x2D6E ], +- [ 0x2D71, 0x2D7E ], +- [ 0x2D97, 0x2D9F ], +- [ 0x2DA7, 0x2DA7 ], +- [ 0x2DAF, 0x2DAF ], +- [ 0x2DB7, 0x2DB7 ], +- [ 0x2DBF, 0x2DBF ], +- [ 0x2DC7, 0x2DC7 ], +- [ 0x2DCF, 0x2DCF ], +- [ 0x2DD7, 0x2DD7 ], +- [ 0x2DDF, 0x2DDF ], +- [ 0x2E32, 0x2E7F ], +- [ 0x2E9A, 0x2E9A ], +- [ 0x2EF4, 0x2EFF ], +- [ 0x2FD6, 0x2FEF ], +- [ 0x2FFC, 0x2FFF ], +- [ 0x3040, 0x3040 ], +- [ 0x3097, 0x3098 ], +- [ 0x3100, 0x3104 ], +- [ 0x312E, 0x3130 ], +- [ 0x318F, 0x318F ], +- [ 0x31BB, 0x31BF ], +- [ 0x31E4, 0x31EF ], +- [ 0x321F, 0x321F ], +- [ 0x32FF, 0x32FF ], +- [ 0x4DB6, 0x4DBF ], +- [ 0x9FCC, 0x9FFF ], +- [ 0xA48D, 0xA48F ], +- [ 0xA4C7, 0xA4CF ], +- [ 0xA62C, 0xA63F ], +- [ 0xA674, 0xA67B ], +- [ 0xA698, 0xA69F ], +- [ 0xA6F8, 0xA6FF ], +- [ 0xA78F, 0xA78F ], +- [ 0xA792, 0xA79F ], +- [ 0xA7AA, 0xA7F9 ], +- [ 0xA82C, 0xA82F ], +- [ 0xA83A, 0xA83F ], +- [ 0xA878, 0xA87F ], +- [ 0xA8C5, 0xA8CD ], +- [ 0xA8DA, 0xA8DF ], +- [ 0xA8FC, 0xA8FF ], +- [ 0xA954, 0xA95E ], +- [ 0xA97D, 0xA97F ], +- [ 0xA9CE, 0xA9CE ], +- [ 0xA9DA, 0xA9DD ], +- [ 0xA9E0, 0xA9FF ], +- [ 0xAA37, 0xAA3F ], +- [ 0xAA4E, 0xAA4F ], +- [ 0xAA5A, 0xAA5B ], +- [ 0xAA7C, 0xAA7F ], +- [ 0xAAC3, 0xAADA ], +- [ 0xAAE0, 0xAB00 ], +- [ 0xAB07, 0xAB08 ], +- [ 0xAB0F, 0xAB10 ], +- [ 0xAB17, 0xAB1F ], +- [ 0xAB27, 0xAB27 ], +- [ 0xAB2F, 0xABBF ], +- [ 0xABEE, 0xABEF ], +- [ 0xABFA, 0xABFF ], +- [ 0xD7A4, 0xD7AF ], +- [ 0xD7C7, 0xD7CA ], +- [ 0xD7FC, 0xD7FF ], +- [ 0xFA2E, 0xFA2F ], +- [ 0xFA6E, 0xFA6F ], +- [ 0xFADA, 0xFAFF ], +- [ 0xFB07, 0xFB12 ], +- [ 0xFB18, 0xFB1C ], +- [ 0xFB37, 0xFB37 ], +- [ 0xFB3D, 0xFB3D ], +- [ 0xFB3F, 0xFB3F ], +- [ 0xFB42, 0xFB42 ], +- [ 0xFB45, 0xFB45 ], +- [ 0xFBC2, 0xFBD2 ], +- [ 0xFD40, 0xFD4F ], +- [ 0xFD90, 0xFD91 ], +- [ 0xFDC8, 0xFDEF ], +- [ 0xFDFE, 0xFDFF ], +- [ 0xFE1A, 0xFE1F ], +- [ 0xFE27, 0xFE2F ], +- [ 0xFE53, 0xFE53 ], +- [ 0xFE67, 0xFE67 ], +- [ 0xFE6C, 0xFE6F ], +- [ 0xFE75, 0xFE75 ], +- [ 0xFEFD, 0xFEFE ], +- [ 0xFF00, 0xFF00 ], +- [ 0xFFBF, 0xFFC1 ], +- [ 0xFFC8, 0xFFC9 ], +- [ 0xFFD0, 0xFFD1 ], +- [ 0xFFD8, 0xFFD9 ], +- [ 0xFFDD, 0xFFDF ], +- [ 0xFFE7, 0xFFE7 ], +- [ 0xFFEF, 0xFFF8 ], +- [ 0xFFFE, 0xFFFF ], +- [ 0x1000C, 0x1000C ], +- [ 0x10027, 0x10027 ], +- [ 0x1003B, 0x1003B ], +- [ 0x1003E, 0x1003E ], +- [ 0x1004E, 0x1004F ], +- [ 0x1005E, 0x1007F ], +- [ 0x100FB, 0x100FF ], +- [ 0x10103, 0x10106 ], +- [ 0x10134, 0x10136 ], +- [ 0x1018B, 0x1018F ], +- [ 0x1019C, 0x101CF ], +- [ 0x101FE, 0x1027F ], +- [ 0x1029D, 0x1029F ], +- [ 0x102D1, 0x102FF ], +- [ 0x1031F, 0x1031F ], +- [ 0x10324, 0x1032F ], +- [ 0x1034B, 0x1037F ], +- [ 0x1039E, 0x1039E ], +- [ 0x103C4, 0x103C7 ], +- [ 0x103D6, 0x103FF ], +- [ 0x1049E, 0x1049F ], +- [ 0x104AA, 0x107FF ], +- [ 0x10806, 0x10807 ], +- [ 0x10809, 0x10809 ], +- [ 0x10836, 0x10836 ], +- [ 0x10839, 0x1083B ], +- [ 0x1083D, 0x1083E ], +- [ 0x10856, 0x10856 ], +- [ 0x10860, 0x108FF ], +- [ 0x1091C, 0x1091E ], +- [ 0x1093A, 0x1093E ], +- [ 0x10940, 0x109FF ], +- [ 0x10A04, 0x10A04 ], +- [ 0x10A07, 0x10A0B ], +- [ 0x10A14, 0x10A14 ], +- [ 0x10A18, 0x10A18 ], +- [ 0x10A34, 0x10A37 ], +- [ 0x10A3B, 0x10A3E ], +- [ 0x10A48, 0x10A4F ], +- [ 0x10A59, 0x10A5F ], +- [ 0x10A80, 0x10AFF ], +- [ 0x10B36, 0x10B38 ], +- [ 0x10B56, 0x10B57 ], +- [ 0x10B73, 0x10B77 ], +- [ 0x10B80, 0x10BFF ], +- [ 0x10C49, 0x10E5F ], +- [ 0x10E7F, 0x10FFF ], +- [ 0x1104E, 0x11051 ], +- [ 0x11070, 0x1107F ], +- [ 0x110C2, 0x11FFF ], +- [ 0x1236F, 0x123FF ], +- [ 0x12463, 0x1246F ], +- [ 0x12474, 0x12FFF ], +- [ 0x1342F, 0x167FF ], +- [ 0x16A39, 0x1AFFF ], +- [ 0x1B002, 0x1CFFF ], +- [ 0x1D0F6, 0x1D0FF ], +- [ 0x1D127, 0x1D128 ], +- [ 0x1D1DE, 0x1D1FF ], +- [ 0x1D246, 0x1D2FF ], +- [ 0x1D357, 0x1D35F ], +- [ 0x1D372, 0x1D3FF ], +- [ 0x1D455, 0x1D455 ], +- [ 0x1D49D, 0x1D49D ], +- [ 0x1D4A0, 0x1D4A1 ], +- [ 0x1D4A3, 0x1D4A4 ], +- [ 0x1D4A7, 0x1D4A8 ], +- [ 0x1D4AD, 0x1D4AD ], +- [ 0x1D4BA, 0x1D4BA ], +- [ 0x1D4BC, 0x1D4BC ], +- [ 0x1D4C4, 0x1D4C4 ], +- [ 0x1D506, 0x1D506 ], +- [ 0x1D50B, 0x1D50C ], +- [ 0x1D515, 0x1D515 ], +- [ 0x1D51D, 0x1D51D ], +- [ 0x1D53A, 0x1D53A ], +- [ 0x1D53F, 0x1D53F ], +- [ 0x1D545, 0x1D545 ], +- [ 0x1D547, 0x1D549 ], +- [ 0x1D551, 0x1D551 ], +- [ 0x1D6A6, 0x1D6A7 ], +- [ 0x1D7CC, 0x1D7CD ], +- [ 0x1D800, 0x1EFFF ], +- [ 0x1F02C, 0x1F02F ], +- [ 0x1F094, 0x1F09F ], +- [ 0x1F0AF, 0x1F0B0 ], +- [ 0x1F0BF, 0x1F0C0 ], +- [ 0x1F0D0, 0x1F0D0 ], +- [ 0x1F0E0, 0x1F0FF ], +- [ 0x1F10B, 0x1F10F ], +- [ 0x1F12F, 0x1F12F ], +- [ 0x1F16A, 0x1F16F ], +- [ 0x1F19B, 0x1F1E5 ], +- [ 0x1F203, 0x1F20F ], +- [ 0x1F23B, 0x1F23F ], +- [ 0x1F249, 0x1F24F ], +- [ 0x1F252, 0x1F2FF ], +- [ 0x1F321, 0x1F32F ], +- [ 0x1F336, 0x1F336 ], +- [ 0x1F37D, 0x1F37F ], +- [ 0x1F394, 0x1F39F ], +- [ 0x1F3C5, 0x1F3C5 ], +- [ 0x1F3CB, 0x1F3DF ], +- [ 0x1F3F1, 0x1F3FF ], +- [ 0x1F43F, 0x1F43F ], +- [ 0x1F441, 0x1F441 ], +- [ 0x1F4F8, 0x1F4F8 ], +- [ 0x1F4FD, 0x1F4FF ], +- [ 0x1F53E, 0x1F54F ], +- [ 0x1F568, 0x1F5FA ], +- [ 0x1F600, 0x1F600 ], +- [ 0x1F611, 0x1F611 ], +- [ 0x1F615, 0x1F615 ], +- [ 0x1F617, 0x1F617 ], +- [ 0x1F619, 0x1F619 ], +- [ 0x1F61B, 0x1F61B ], +- [ 0x1F61F, 0x1F61F ], +- [ 0x1F626, 0x1F627 ], +- [ 0x1F62C, 0x1F62C ], +- [ 0x1F62E, 0x1F62F ], +- [ 0x1F634, 0x1F634 ], +- [ 0x1F641, 0x1F644 ], +- [ 0x1F650, 0x1F67F ], +- [ 0x1F6C6, 0x1F6FF ], +- [ 0x1F774, 0x1FFFF ], +- [ 0x2A6D7, 0x2A6FF ], +- [ 0x2B735, 0x2B73F ], +- [ 0x2B81E, 0x2F7FF ], +- [ 0x2FA1E, 0xE0000 ], +- [ 0xE0002, 0xE001F ], +- [ 0xE0080, 0xE00FF ], +- [ 0xE01F0, 0xEFFFF ], +- [ 0xFFFFE, 0xFFFFF ], +- [ 0x10FFFE, 0x10FFFF ], +- ]; + +- return binarySearch!table(c); ++@safe auto asSet(const (ubyte)[] compressed) ++{ ++ return CodepointSet(decompressIntervals(compressed)); + } + +-unittest ++@safe pure nothrow auto asTrie(T...)(in TrieEntry!T e) + { ++ return const(CodepointTrie!T)(e.offsets, e.sizes, e.data); + } + ++@safe pure nothrow @property ++{ ++ // It's important to use auto return here, so that the compiler ++ // only runs semantic on the return type if the function gets ++ // used. Also these are functions rather than templates to not ++ // increase the object size of the caller. ++ auto lowerCaseTrie() { static immutable res = asTrie(lowerCaseTrieEntries); return res; } ++ auto upperCaseTrie() { static immutable res = asTrie(upperCaseTrieEntries); return res; } ++ auto simpleCaseTrie() { static immutable res = asTrie(simpleCaseTrieEntries); return res; } ++ auto fullCaseTrie() { static immutable res = asTrie(fullCaseTrieEntries); return res; } ++ auto alphaTrie() { static immutable res = asTrie(alphaTrieEntries); return res; } ++ auto markTrie() { static immutable res = asTrie(markTrieEntries); return res; } ++ auto numberTrie() { static immutable res = asTrie(numberTrieEntries); return res; } ++ auto punctuationTrie() { static immutable res = asTrie(punctuationTrieEntries); return res; } ++ auto symbolTrie() { static immutable res = asTrie(symbolTrieEntries); return res; } ++ auto graphicalTrie() { static immutable res = asTrie(graphicalTrieEntries); return res; } ++ auto nonCharacterTrie() { static immutable res = asTrie(nonCharacterTrieEntries); return res; } + +-//============================================================================== +-// Private Section. +-//============================================================================== +-private: ++ //normalization quick-check tables ++ auto nfcQCTrie() ++ { ++ import std.internal.unicode_norm; ++ static immutable res = asTrie(nfcQCTrieEntries); ++ return res; ++ } + +-bool binarySearch(alias table)(dchar c) @safe pure nothrow +-{ +- static @property bool checkTableEntry(alias table)() ++ auto nfdQCTrie() + { +- foreach(i, entry; table) +- { +- assert(table[i][0] <= table[i][1]); +- if(i < table.length - 1) +- assert(table[i][1] < table[i + 1][0]); +- } +- return true; ++ import std.internal.unicode_norm; ++ static immutable res = asTrie(nfdQCTrieEntries); ++ return res; + } +- static assert(checkTableEntry!table); + +- return binarySearch2(c, table); +-} ++ auto nfkcQCTrie() ++ { ++ import std.internal.unicode_norm; ++ static immutable res = asTrie(nfkcQCTrieEntries); ++ return res; ++ } + +-bool binarySearch2(dchar c, immutable dchar[2][] table) @safe pure nothrow +-{ +- // Binary search +- size_t mid; +- size_t low; +- size_t high; ++ auto nfkdQCTrie() ++ { ++ import std.internal.unicode_norm; ++ static immutable res = asTrie(nfkdQCTrieEntries); ++ return res; ++ } + +- low = 0; +- high = table.length - 1; +- while(cast(int)low <= cast(int)high) ++ //grapheme breaking algorithm tables ++ auto mcTrie() + { +- mid = (low + high) >> 1; ++ import std.internal.unicode_grapheme; ++ static immutable res = asTrie(mcTrieEntries); ++ return res; ++ } + +- if(c < table[mid][0]) +- high = mid - 1; +- else if(c > table[mid][1]) +- low = mid + 1; +- else +- goto Lis; ++ auto graphemeExtendTrie() ++ { ++ import std.internal.unicode_grapheme; ++ static immutable res = asTrie(graphemeExtendTrieEntries); ++ return res; + } + +-Lisnot: +- debug ++ auto hangLV() ++ { ++ import std.internal.unicode_grapheme; ++ static immutable res = asTrie(hangulLVTrieEntries); ++ return res; ++ } ++ ++ auto hangLVT() + { +- for(size_t i = 0; i < table.length; ++i) +- assert(c < table[i][0] || c > table[i][1]); ++ import std.internal.unicode_grapheme; ++ static immutable res = asTrie(hangulLVTTrieEntries); ++ return res; + } + +- return false; ++ // tables below are used for composition/decomposition ++ auto combiningClassTrie() ++ { ++ import std.internal.unicode_comp; ++ static immutable res = asTrie(combiningClassTrieEntries); ++ return res; ++ } + +-Lis: +- debug +- { +- for(size_t i = 0; i < table.length; ++i) +- { +- if(c >= table[i][0] && c <= table[i][1]) +- return true; +- } ++ auto compatMappingTrie() ++ { ++ import std.internal.unicode_decomp; ++ static immutable res = asTrie(compatMappingTrieEntries); ++ return res; ++ } + +- assert(0); // should have been in table ++ auto canonMappingTrie() ++ { ++ import std.internal.unicode_decomp; ++ static immutable res = asTrie(canonMappingTrieEntries); ++ return res; + } +- else +- return true; +-}; ++ ++ auto compositionJumpTrie() ++ { ++ import std.internal.unicode_comp; ++ static immutable res = asTrie(compositionJumpTrieEntries); ++ return res; ++ } ++ ++ //case conversion tables ++ auto toUpperIndexTrie() { static immutable res = asTrie(toUpperIndexTrieEntries); return res; } ++ auto toLowerIndexTrie() { static immutable res = asTrie(toLowerIndexTrieEntries); return res; } ++ auto toTitleIndexTrie() { static immutable res = asTrie(toTitleIndexTrieEntries); return res; } ++ ++ ++} ++ ++}// version(!std_uni_bootstrap) ++ +--- a/src/libphobos/src/std/uri.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/uri.d 2014-04-01 16:32:51.000000000 +0100 +@@ -26,21 +26,21 @@ + */ + module std.uri; + +-//debug=uri; // uncomment to turn on debugging printf's ++//debug=uri; // uncomment to turn on debugging writefln's ++debug(uri) private import std.stdio; + + /* ====================== URI Functions ================ */ + + private import std.ascii; + private import std.c.stdlib; + private import std.utf; +-private import std.stdio; + import std.exception; + + class URIerror : Error + { + this() + { +- super("URI error"); ++ super("URI error"); + } + } + +@@ -60,19 +60,18 @@ __gshared ubyte[128] uri_flags; // + shared static this() + { + // Initialize uri_flags[] +- + static void helper(immutable char[] p, uint flags) +- { int i; +- +- for (i = 0; i < p.length; i++) +- uri_flags[p[i]] |= flags; ++ { ++ for (int i = 0; i < p.length; i++) ++ uri_flags[p[i]] |= flags; + } + + uri_flags['#'] |= URI_Hash; + + for (int i = 'A'; i <= 'Z'; i++) +- { uri_flags[i] |= URI_Alpha; +- uri_flags[i + 0x20] |= URI_Alpha; // lowercase letters ++ { ++ uri_flags[i] |= URI_Alpha; ++ uri_flags[i + 0x20] |= URI_Alpha; // lowercase letters + } + helper("0123456789", URI_Digit); + helper(";/?:@&=+$,", URI_Reserved); +@@ -101,110 +100,118 @@ private string URI_Encode(dstring string + + for (k = 0; k != len; k++) + { +- C = string[k]; +- // if (C in unescapedSet) +- if (C < uri_flags.length && uri_flags[C] & unescapedSet) +- { +- if (Rlen == Rsize) +- { char* R2; +- +- Rsize *= 2; +- if (Rsize > 1024) +- R2 = (new char[Rsize]).ptr; +- else +- { R2 = cast(char *)alloca(Rsize * char.sizeof); +- if (!R2) +- goto LthrowURIerror; +- } +- R2[0..Rlen] = R[0..Rlen]; +- R = R2; +- } +- R[Rlen] = cast(char)C; +- Rlen++; +- } +- else +- { char[6] Octet; +- uint L; +- +- V = C; +- +- // Transform V into octets +- if (V <= 0x7F) +- { +- Octet[0] = cast(char) V; +- L = 1; +- } +- else if (V <= 0x7FF) +- { +- Octet[0] = cast(char)(0xC0 | (V >> 6)); +- Octet[1] = cast(char)(0x80 | (V & 0x3F)); +- L = 2; +- } +- else if (V <= 0xFFFF) +- { +- Octet[0] = cast(char)(0xE0 | (V >> 12)); +- Octet[1] = cast(char)(0x80 | ((V >> 6) & 0x3F)); +- Octet[2] = cast(char)(0x80 | (V & 0x3F)); +- L = 3; +- } +- else if (V <= 0x1FFFFF) +- { +- Octet[0] = cast(char)(0xF0 | (V >> 18)); +- Octet[1] = cast(char)(0x80 | ((V >> 12) & 0x3F)); +- Octet[2] = cast(char)(0x80 | ((V >> 6) & 0x3F)); +- Octet[3] = cast(char)(0x80 | (V & 0x3F)); +- L = 4; +- } +- /+ +- else if (V <= 0x3FFFFFF) +- { +- Octet[0] = cast(char)(0xF8 | (V >> 24)); +- Octet[1] = cast(char)(0x80 | ((V >> 18) & 0x3F)); +- Octet[2] = cast(char)(0x80 | ((V >> 12) & 0x3F)); +- Octet[3] = cast(char)(0x80 | ((V >> 6) & 0x3F)); +- Octet[4] = cast(char)(0x80 | (V & 0x3F)); +- L = 5; +- } +- else if (V <= 0x7FFFFFFF) ++ C = string[k]; ++ // if (C in unescapedSet) ++ if (C < uri_flags.length && uri_flags[C] & unescapedSet) + { +- Octet[0] = cast(char)(0xFC | (V >> 30)); +- Octet[1] = cast(char)(0x80 | ((V >> 24) & 0x3F)); +- Octet[2] = cast(char)(0x80 | ((V >> 18) & 0x3F)); +- Octet[3] = cast(char)(0x80 | ((V >> 12) & 0x3F)); +- Octet[4] = cast(char)(0x80 | ((V >> 6) & 0x3F)); +- Octet[5] = cast(char)(0x80 | (V & 0x3F)); +- L = 6; ++ if (Rlen == Rsize) ++ { ++ char* R2; ++ ++ Rsize *= 2; ++ if (Rsize > 1024) { ++ R2 = (new char[Rsize]).ptr; ++ } ++ else ++ { ++ R2 = cast(char *)alloca(Rsize * char.sizeof); ++ if (!R2) ++ goto LthrowURIerror; ++ } ++ R2[0..Rlen] = R[0..Rlen]; ++ R = R2; ++ } ++ R[Rlen] = cast(char)C; ++ Rlen++; + } +- +/ + else +- { goto LthrowURIerror; // undefined UTF-32 code +- } +- +- if (Rlen + L * 3 > Rsize) +- { char *R2; ++ { ++ char[6] Octet; ++ uint L; + +- Rsize = 2 * (Rlen + L * 3); +- if (Rsize > 1024) +- R2 = (new char[Rsize]).ptr; +- else +- { R2 = cast(char *)alloca(Rsize * char.sizeof); +- if (!R2) +- goto LthrowURIerror; +- } +- R2[0..Rlen] = R[0..Rlen]; +- R = R2; +- } ++ V = C; + +- for (j = 0; j < L; j++) +- { +- R[Rlen] = '%'; +- R[Rlen + 1] = hex2ascii[Octet[j] >> 4]; +- R[Rlen + 2] = hex2ascii[Octet[j] & 15]; ++ // Transform V into octets ++ if (V <= 0x7F) ++ { ++ Octet[0] = cast(char) V; ++ L = 1; ++ } ++ else if (V <= 0x7FF) ++ { ++ Octet[0] = cast(char)(0xC0 | (V >> 6)); ++ Octet[1] = cast(char)(0x80 | (V & 0x3F)); ++ L = 2; ++ } ++ else if (V <= 0xFFFF) ++ { ++ Octet[0] = cast(char)(0xE0 | (V >> 12)); ++ Octet[1] = cast(char)(0x80 | ((V >> 6) & 0x3F)); ++ Octet[2] = cast(char)(0x80 | (V & 0x3F)); ++ L = 3; ++ } ++ else if (V <= 0x1FFFFF) ++ { ++ Octet[0] = cast(char)(0xF0 | (V >> 18)); ++ Octet[1] = cast(char)(0x80 | ((V >> 12) & 0x3F)); ++ Octet[2] = cast(char)(0x80 | ((V >> 6) & 0x3F)); ++ Octet[3] = cast(char)(0x80 | (V & 0x3F)); ++ L = 4; ++ } ++ /+ ++ else if (V <= 0x3FFFFFF) ++ { ++ Octet[0] = cast(char)(0xF8 | (V >> 24)); ++ Octet[1] = cast(char)(0x80 | ((V >> 18) & 0x3F)); ++ Octet[2] = cast(char)(0x80 | ((V >> 12) & 0x3F)); ++ Octet[3] = cast(char)(0x80 | ((V >> 6) & 0x3F)); ++ Octet[4] = cast(char)(0x80 | (V & 0x3F)); ++ L = 5; ++ } ++ else if (V <= 0x7FFFFFFF) ++ { ++ Octet[0] = cast(char)(0xFC | (V >> 30)); ++ Octet[1] = cast(char)(0x80 | ((V >> 24) & 0x3F)); ++ Octet[2] = cast(char)(0x80 | ((V >> 18) & 0x3F)); ++ Octet[3] = cast(char)(0x80 | ((V >> 12) & 0x3F)); ++ Octet[4] = cast(char)(0x80 | ((V >> 6) & 0x3F)); ++ Octet[5] = cast(char)(0x80 | (V & 0x3F)); ++ L = 6; ++ } ++ +/ ++ else ++ { ++ goto LthrowURIerror; // undefined UTF-32 code ++ } ++ ++ if (Rlen + L * 3 > Rsize) ++ { ++ char *R2; ++ ++ Rsize = 2 * (Rlen + L * 3); ++ if (Rsize > 1024) { ++ R2 = (new char[Rsize]).ptr; ++ } ++ else ++ { ++ R2 = cast(char *)alloca(Rsize * char.sizeof); ++ if (!R2) ++ goto LthrowURIerror; ++ } ++ R2[0..Rlen] = R[0..Rlen]; ++ R = R2; ++ } ++ ++ for (j = 0; j < L; j++) ++ { ++ R[Rlen] = '%'; ++ R[Rlen + 1] = hex2ascii[Octet[j] >> 4]; ++ R[Rlen + 2] = hex2ascii[Octet[j] & 15]; + +- Rlen += 3; ++ Rlen += 3; ++ } + } + } +- } + + return R[0..Rlen].idup; + +@@ -215,8 +222,8 @@ LthrowURIerror: + uint ascii2hex(dchar c) + { + return (c <= '9') ? c - '0' : +- (c <= 'F') ? c - 'A' + 10 : +- c - 'a' + 10; ++ (c <= 'F') ? c - 'A' + 10 : ++ c - 'a' + 10; + } + + private dstring URI_Decode(string string, uint reservedSet) +@@ -226,8 +233,6 @@ private dstring URI_Decode(string string + uint V; + dchar C; + +- //printf("URI_Decode('%.*s')\n", string); +- + // Result array, allocated on stack + dchar* R; + uint Rlen; +@@ -237,86 +242,91 @@ private dstring URI_Decode(string string + + // Preallocate result buffer R guaranteed to be large enough for result + auto Rsize = len; +- if (Rsize > 1024 / dchar.sizeof) +- R = (new dchar[Rsize]).ptr; ++ if (Rsize > 1024 / dchar.sizeof) { ++ R = (new dchar[Rsize]).ptr; ++ } + else +- { R = cast(dchar *)alloca(Rsize * dchar.sizeof); +- if (!R) +- goto LthrowURIerror; ++ { ++ R = cast(dchar *)alloca(Rsize * dchar.sizeof); ++ if (!R) ++ goto LthrowURIerror; + } + Rlen = 0; + + for (k = 0; k != len; k++) +- { char B; +- uint start; +- +- C = s[k]; +- if (C != '%') +- { R[Rlen] = C; +- Rlen++; +- continue; +- } +- start = k; +- if (k + 2 >= len) +- goto LthrowURIerror; +- if (!isHexDigit(s[k + 1]) || !isHexDigit(s[k + 2])) +- goto LthrowURIerror; +- B = cast(char)((ascii2hex(s[k + 1]) << 4) + ascii2hex(s[k + 2])); +- k += 2; +- if ((B & 0x80) == 0) + { +- C = B; +- } +- else +- { uint n; ++ char B; ++ uint start; + +- for (n = 1; ; n++) +- { +- if (n > 4) +- goto LthrowURIerror; +- if (((B << n) & 0x80) == 0) ++ C = s[k]; ++ if (C != '%') + { +- if (n == 1) +- goto LthrowURIerror; +- break; +- } ++ R[Rlen] = C; ++ Rlen++; ++ continue; + } +- +- // Pick off (7 - n) significant bits of B from first byte of octet +- V = B & ((1 << (7 - n)) - 1); // (!!!) +- +- if (k + (3 * (n - 1)) >= len) +- goto LthrowURIerror; +- for (j = 1; j != n; j++) +- { +- k++; +- if (s[k] != '%') ++ start = k; ++ if (k + 2 >= len) + goto LthrowURIerror; + if (!isHexDigit(s[k + 1]) || !isHexDigit(s[k + 2])) + goto LthrowURIerror; + B = cast(char)((ascii2hex(s[k + 1]) << 4) + ascii2hex(s[k + 2])); +- if ((B & 0xC0) != 0x80) +- goto LthrowURIerror; + k += 2; +- V = (V << 6) | (B & 0x3F); ++ if ((B & 0x80) == 0) ++ { ++ C = B; ++ } ++ else ++ { ++ uint n; ++ ++ for (n = 1; ; n++) ++ { ++ if (n > 4) ++ goto LthrowURIerror; ++ if (((B << n) & 0x80) == 0) ++ { ++ if (n == 1) ++ goto LthrowURIerror; ++ break; ++ } ++ } ++ ++ // Pick off (7 - n) significant bits of B from first byte of octet ++ V = B & ((1 << (7 - n)) - 1); // (!!!) ++ ++ if (k + (3 * (n - 1)) >= len) ++ goto LthrowURIerror; ++ for (j = 1; j != n; j++) ++ { ++ k++; ++ if (s[k] != '%') ++ goto LthrowURIerror; ++ if (!isHexDigit(s[k + 1]) || !isHexDigit(s[k + 2])) ++ goto LthrowURIerror; ++ B = cast(char)((ascii2hex(s[k + 1]) << 4) + ascii2hex(s[k + 2])); ++ if ((B & 0xC0) != 0x80) ++ goto LthrowURIerror; ++ k += 2; ++ V = (V << 6) | (B & 0x3F); ++ } ++ if (V > 0x10FFFF) ++ goto LthrowURIerror; ++ C = V; ++ } ++ if (C < uri_flags.length && uri_flags[C] & reservedSet) ++ { ++ // R ~= s[start .. k + 1]; ++ int width = (k + 1) - start; ++ for (int ii = 0; ii < width; ii++) ++ R[Rlen + ii] = s[start + ii]; ++ Rlen += width; ++ } ++ else ++ { ++ R[Rlen] = C; ++ Rlen++; + } +- if (V > 0x10FFFF) +- goto LthrowURIerror; +- C = V; +- } +- if (C < uri_flags.length && uri_flags[C] & reservedSet) +- { +- // R ~= s[start .. k + 1]; +- int width = (k + 1) - start; +- for (int ii = 0; ii < width; ii++) +- R[Rlen + ii] = s[start + ii]; +- Rlen += width; +- } +- else +- { +- R[Rlen] = C; +- Rlen++; +- } + } + assert(Rlen <= Rsize); // enforce our preallocation size guarantee + +@@ -387,43 +397,47 @@ size_t uriLength(string s) + * https:// + * www. + */ ++ import std.string : icmp; + + size_t i; + + if (s.length <= 4) +- goto Lno; ++ goto Lno; + +- //writefln("isURL(%s)", s); +- if (s.length > 7 && std.string.icmp(s[0 .. 7], "http://") == 0) +- i = 7; +- else if (s.length > 8 && std.string.icmp(s[0 .. 8], "https://") == 0) +- i = 8; +-// if (icmp(s[0 .. 4], "www.") == 0) +-// i = 4; ++ if (s.length > 7 && std.string.icmp(s[0 .. 7], "http://") == 0) { ++ i = 7; ++ } + else +- goto Lno; ++ { ++ if (s.length > 8 && std.string.icmp(s[0 .. 8], "https://") == 0) ++ i = 8; ++ else ++ goto Lno; ++ } ++ // if (icmp(s[0 .. 4], "www.") == 0) ++ // i = 4; + + size_t lastdot; + for (; i < s.length; i++) + { +- auto c = s[i]; +- if (isAlphaNum(c)) +- continue; +- if (c == '-' || c == '_' || c == '?' || +- c == '=' || c == '%' || c == '&' || +- c == '/' || c == '+' || c == '#' || +- c == '~' || c == '$') +- continue; +- if (c == '.') +- { +- lastdot = i; +- continue; +- } +- break; ++ auto c = s[i]; ++ if (isAlphaNum(c)) ++ continue; ++ if (c == '-' || c == '_' || c == '?' || ++ c == '=' || c == '%' || c == '&' || ++ c == '/' || c == '+' || c == '#' || ++ c == '~' || c == '$') ++ continue; ++ if (c == '.') ++ { ++ lastdot = i; ++ continue; ++ } ++ break; + } + //if (!lastdot || (i - lastdot != 3 && i - lastdot != 4)) + if (!lastdot) +- goto Lno; ++ goto Lno; + + return i; + +@@ -431,6 +445,15 @@ Lno: + return -1; + } + ++unittest ++{ ++ string s1 = "http://www.digitalmars.com/~fred/fredsRX.html#foo end!"; ++ assert (uriLength(s1) == 49); ++ string s2 = "no uri here"; ++ assert (uriLength(s2) == -1); ++} ++ ++ + /*************************** + * Does string s[] start with an email address? + * Returns: +@@ -440,46 +463,46 @@ Lno: + * RFC2822 + */ + size_t emailLength(string s) +-{ size_t i; ++{ ++ size_t i; + + if (!isAlpha(s[0])) +- goto Lno; ++ goto Lno; + + for (i = 1; 1; i++) + { +- if (i == s.length) +- goto Lno; +- auto c = s[i]; +- if (isAlphaNum(c)) +- continue; +- if (c == '-' || c == '_' || c == '.') +- continue; +- if (c != '@') +- goto Lno; +- i++; +- break; ++ if (i == s.length) ++ goto Lno; ++ auto c = s[i]; ++ if (isAlphaNum(c)) ++ continue; ++ if (c == '-' || c == '_' || c == '.') ++ continue; ++ if (c != '@') ++ goto Lno; ++ i++; ++ break; + } +- //writefln("test1 '%s'", s[0 .. i]); + + /* Now do the part past the '@' + */ + size_t lastdot; + for (; i < s.length; i++) + { +- auto c = s[i]; +- if (isAlphaNum(c)) +- continue; +- if (c == '-' || c == '_') +- continue; +- if (c == '.') +- { +- lastdot = i; +- continue; +- } +- break; ++ auto c = s[i]; ++ if (isAlphaNum(c)) ++ continue; ++ if (c == '-' || c == '_') ++ continue; ++ if (c == '.') ++ { ++ lastdot = i; ++ continue; ++ } ++ break; + } + if (!lastdot || (i - lastdot != 3 && i - lastdot != 4)) +- goto Lno; ++ goto Lno; + + return i; + +@@ -487,34 +510,41 @@ Lno: + return -1; + } + ++unittest ++{ ++ string s1 = "my.e-mail@www.example-domain.com with garbage added"; ++ assert (emailLength(s1) == 32); ++ string s2 = "no email address here"; ++ assert (emailLength(s2) == -1); ++} ++ + + unittest + { +- debug(uri) printf("uri.encodeURI.unittest\n"); ++ debug(uri) writeln("uri.encodeURI.unittest"); + + string s = "http://www.digitalmars.com/~fred/fred's RX.html#foo"; + string t = "http://www.digitalmars.com/~fred/fred's%20RX.html#foo"; + + auto r = encode(s); +- debug(uri) printf("r = '%.*s'\n", r); ++ debug(uri) writefln("r = '%s'", r); + assert(r == t); + r = decode(t); +- debug(uri) printf("r = '%.*s'\n", r); ++ debug(uri) writefln("r = '%s'", r); + assert(r == s); + + r = encode( decode("%E3%81%82%E3%81%82") ); + assert(r == "%E3%81%82%E3%81%82"); + + r = encodeComponent("c++"); +- //printf("r = '%.*s'\n", r); + assert(r == "c%2B%2B"); + + auto str = new char[10_000_000]; + str[] = 'A'; + r = encodeComponent(assumeUnique(str)); + foreach (char c; r) +- assert(c == 'A'); ++ assert(c == 'A'); + + r = decode("%41%42%43"); +- debug(uri) writefln(r); ++ debug(uri) writeln(r); + } +--- a/src/libphobos/src/std/utf.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/utf.d 2014-04-01 16:32:51.000000000 +0100 +@@ -45,8 +45,8 @@ class UTFException : Exception + uint[4] sequence; + size_t len; + +- +- UTFException setSequence(uint[] data...) @safe pure nothrow ++ @safe pure nothrow ++ UTFException setSequence(uint[] data...) + { + import std.algorithm; + +@@ -58,13 +58,13 @@ class UTFException : Exception + return this; + } + +- ++ @safe pure nothrow + this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + super(msg, file, line, next); + } + +- ++ @safe pure + this(string msg, size_t index, string file = __FILE__, size_t line = __LINE__, Throwable next = null) + { + import std.string; +@@ -75,15 +75,15 @@ class UTFException : Exception + override string toString() + { + import std.string; +- if(len == 0) ++ if (len == 0) + return super.toString(); + + string result = "Invalid UTF sequence:"; + +- foreach(i; sequence[0 .. len]) ++ foreach (i; sequence[0 .. len]) + result ~= format(" %02x", i); + +- if(super.msg.length > 0) ++ if (super.msg.length > 0) + { + result ~= " - "; + result ~= super.msg; +@@ -94,11 +94,8 @@ class UTFException : Exception + } + + +-/++ +- $(RED Deprecated. It will be removed in January 2013. +- Please use $(LREF UTFException) instead.) +- +/ +-deprecated("Please use std.utf.UTFException instead.") alias UTFException UtfException; ++// Explicitly undocumented. It will be removed in November 2013. ++deprecated("Please use std.utf.UTFException instead.") alias UtfException = UTFException; + + + /++ +@@ -124,18 +121,22 @@ pure nothrow bool isValidDchar(dchar c) + unittest + { + debug(utf) printf("utf.isValidDchar.unittest\n"); +- assert(isValidDchar(cast(dchar)'a') == true); +- assert(isValidDchar(cast(dchar)0x1FFFFF) == false); ++ ++ assertCTFEable!( ++ { ++ assert( isValidDchar(cast(dchar)'a') == true); ++ assert( isValidDchar(cast(dchar)0x1FFFFF) == false); + + assert(!isValidDchar(cast(dchar)0x00D800)); + assert(!isValidDchar(cast(dchar)0x00DBFF)); + assert(!isValidDchar(cast(dchar)0x00DC00)); + assert(!isValidDchar(cast(dchar)0x00DFFF)); +- assert(isValidDchar(cast(dchar)0x00FFFE)); +- assert(isValidDchar(cast(dchar)0x00FFFF)); +- assert(isValidDchar(cast(dchar)0x01FFFF)); +- assert(isValidDchar(cast(dchar)0x10FFFF)); ++ assert( isValidDchar(cast(dchar)0x00FFFE)); ++ assert( isValidDchar(cast(dchar)0x00FFFF)); ++ assert( isValidDchar(cast(dchar)0x01FFFF)); ++ assert( isValidDchar(cast(dchar)0x10FFFF)); + assert(!isValidDchar(cast(dchar)0x110000)); ++ }); + } + + +@@ -213,6 +214,13 @@ unittest + enforce(stride(RandomCU!char(s), i) == codeLength!char(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!char(s); ++ immutable randLen = refRandom.length; ++ enforce(stride(refRandom, i) == codeLength!char(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == 0) + { + enforce(stride(s) == codeLength!char(c), +@@ -220,9 +228,18 @@ unittest + + enforce(stride(InputCU!char(s)) == codeLength!char(c), + new AssertError(format("Unit test failure range 0: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!char(s); ++ immutable bidirLen = refBidir.length; ++ enforce(stride(refBidir) == codeLength!char(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -239,14 +256,15 @@ unittest + test("hello\U00010143\u0100\U00010143", '\u0100', 9); + test("hello\U00010143\u0100\U00010143", '\U00010143', 11); + +- foreach(S; TypeTuple!(char[], const char[], string)) ++ foreach (S; TypeTuple!(char[], const char[], string)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){stride(str, 0);})); +- static assert(isSafe!((){stride(str);})); +- static assert((functionAttributes!((){stride(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){stride(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ stride(str, 0); })); ++ static assert(isSafe!({ stride(str); })); ++ static assert((functionAttributes!({ stride(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ stride(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -278,14 +296,14 @@ uint strideBack(S)(auto ref S str, size_ + { + static if (is(typeof(str.length) : ulong)) + assert(index <= str.length, "Past the end of the UTF-8 sequence"); +- assert (index > 0, "Not the end of the UTF-8 sequence"); ++ assert(index > 0, "Not the end of the UTF-8 sequence"); + + if ((str[index-1] & 0b1100_0000) != 0b1000_0000) + return 1; + + if (index >= 4) //single verification for most common case + { +- foreach(i; TypeTuple!(2, 3, 4)) ++ foreach (i; TypeTuple!(2, 3, 4)) + { + if ((str[index-i] & 0b1100_0000) != 0b1000_0000) + return i; +@@ -293,7 +311,7 @@ uint strideBack(S)(auto ref S str, size_ + } + else + { +- foreach(i; TypeTuple!(2, 3)) ++ foreach (i; TypeTuple!(2, 3)) + { + if (index >= i && (str[index-i] & 0b1100_0000) != 0b1000_0000) + return i; +@@ -305,7 +323,7 @@ uint strideBack(S)(auto ref S str, size_ + /// Ditto + uint strideBack(S)(auto ref S str) + if (is(S : const char[]) || +- (isRandomAccessRange!S && hasLength!S && is(Unqual!(ElementType!S) == char))) ++ (isRandomAccessRange!S && hasLength!S && is(Unqual!(ElementType!S) == char))) + { + return strideBack(str, str.length); + } +@@ -314,11 +332,14 @@ uint strideBack(S)(auto ref S str) + if (isBidirectionalRange!S && is(Unqual!(ElementType!S) == char) && !isRandomAccessRange!S) + { + assert(!str.empty, "Past the end of the UTF-8 sequence"); +- foreach(i; TypeTuple!(1, 2, 3, 4)) ++ auto temp = str.save; ++ foreach (i; TypeTuple!(1, 2, 3, 4)) + { +- if ((str.back & 0b1100_0000) != 0b1000_0000) return i; +- str.popBack(); +- if (str.empty) break; ++ if ((temp.back & 0b1100_0000) != 0b1000_0000) ++ return i; ++ temp.popBack(); ++ if (temp.empty) ++ break; + } + throw new UTFException("The last code unit is not the end of the UTF-8 sequence"); + } +@@ -333,16 +354,32 @@ unittest + enforce(strideBack(RandomCU!char(s), i == size_t.max ? s.length : i) == codeLength!char(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!char(s); ++ immutable randLen = refRandom.length; ++ enforce(strideBack(refRandom, i == size_t.max ? s.length : i) == codeLength!char(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == size_t.max) + { + enforce(strideBack(s) == codeLength!char(c), +- new AssertError(format("Unit test failure string length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure string code length: %s", s), __FILE__, line)); + + enforce(strideBack(BidirCU!char(s)) == codeLength!char(c), +- new AssertError(format("Unit test failure range length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure range code length: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!char(s); ++ immutable bidirLen = refBidir.length; ++ enforce(strideBack(refBidir) == codeLength!char(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -359,14 +396,15 @@ unittest + test("\U00010143\u0100\U00010143hello", '\u0100', 6); + test("\U00010143\u0100\U00010143hello", '\U00010143', 4); + +- foreach(S; TypeTuple!(char[], const char[], string)) ++ foreach (S; TypeTuple!(char[], const char[], string)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){strideBack(str, 0);})); +- static assert(isSafe!((){strideBack(str);})); +- static assert((functionAttributes!((){strideBack(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){strideBack(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ strideBack(str, 0); })); ++ static assert(isSafe!({ strideBack(str); })); ++ static assert((functionAttributes!({ strideBack(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ strideBack(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -413,7 +451,7 @@ uint stride(S)(auto ref S str) @safe pur + uint stride(S)(auto ref S str) + if (isInputRange!S && is(Unqual!(ElementType!S) == wchar)) + { +- assert (!str.empty, "UTF-16 sequence is empty"); ++ assert(!str.empty, "UTF-16 sequence is empty"); + immutable uint u = str.front; + return 1 + (u >= 0xD800 && u <= 0xDBFF); + } +@@ -428,6 +466,13 @@ uint stride(S)(auto ref S str) + enforce(stride(RandomCU!wchar(s), i) == codeLength!wchar(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!wchar(s); ++ immutable randLen = refRandom.length; ++ enforce(stride(refRandom, i) == codeLength!wchar(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == 0) + { + enforce(stride(s) == codeLength!wchar(c), +@@ -435,9 +480,18 @@ uint stride(S)(auto ref S str) + + enforce(stride(InputCU!wchar(s)) == codeLength!wchar(c), + new AssertError(format("Unit test failure range 0: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!wchar(s); ++ immutable bidirLen = refBidir.length; ++ enforce(stride(refBidir) == codeLength!wchar(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -454,14 +508,15 @@ uint stride(S)(auto ref S str) + test("hello\U00010143\u0100\U00010143", '\u0100', 7); + test("hello\U00010143\u0100\U00010143", '\U00010143', 8); + +- foreach(S; TypeTuple!(wchar[], const wchar[], wstring)) ++ foreach (S; TypeTuple!(wchar[], const wchar[], wstring)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){stride(str, 0);})); +- static assert(isSafe!((){stride(str);})); +- static assert((functionAttributes!((){stride(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){stride(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ stride(str, 0); })); ++ static assert(isSafe!({ stride(str); })); ++ static assert((functionAttributes!({ stride(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ stride(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -496,7 +551,7 @@ uint strideBack(S)(auto ref S str, size_ + { + static if (is(typeof(str.length) : ulong)) + assert(index <= str.length, "Past the end of the UTF-16 sequence"); +- assert (index > 0, "Not the end of a UTF-16 sequence"); ++ assert(index > 0, "Not the end of a UTF-16 sequence"); + + immutable c2 = str[index-1]; + return 1 + (0xDC00 <= c2 && c2 < 0xE000); +@@ -507,7 +562,7 @@ uint strideBack(S)(auto ref S str) + if (is(S : const wchar[]) || + (isBidirectionalRange!S && is(Unqual!(ElementType!S) == wchar))) + { +- assert (!str.empty, "UTF-16 sequence is empty"); ++ assert(!str.empty, "UTF-16 sequence is empty"); + + static if (is(S : const(wchar)[])) + immutable c2 = str[$ - 1]; +@@ -527,16 +582,32 @@ unittest + enforce(strideBack(RandomCU!wchar(s), i == size_t.max ? s.length : i) == codeLength!wchar(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!wchar(s); ++ immutable randLen = refRandom.length; ++ enforce(strideBack(refRandom, i == size_t.max ? s.length : i) == codeLength!wchar(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == size_t.max) + { + enforce(strideBack(s) == codeLength!wchar(c), +- new AssertError(format("Unit test failure string length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure string code length: %s", s), __FILE__, line)); + + enforce(strideBack(BidirCU!wchar(s)) == codeLength!wchar(c), +- new AssertError(format("Unit test failure range length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure range code length: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!wchar(s); ++ immutable bidirLen = refBidir.length; ++ enforce(strideBack(refBidir) == codeLength!wchar(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -553,14 +624,15 @@ unittest + test("\U00010143\u0100\U00010143hello", '\u0100', 3); + test("\U00010143\u0100\U00010143hello", '\U00010143', 2); + +- foreach(S; TypeTuple!(wchar[], const wchar[], wstring)) ++ foreach (S; TypeTuple!(wchar[], const wchar[], wstring)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){strideBack(str, 0);})); +- static assert(isSafe!((){strideBack(str);})); +- static assert((functionAttributes!((){strideBack(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){strideBack(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ strideBack(str, 0); })); ++ static assert(isSafe!({ strideBack(str); })); ++ static assert((functionAttributes!({ strideBack(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ strideBack(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -597,6 +669,13 @@ unittest + enforce(stride(RandomCU!dchar(s), i) == codeLength!dchar(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!dchar(s); ++ immutable randLen = refRandom.length; ++ enforce(stride(refRandom, i) == codeLength!dchar(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == 0) + { + enforce(stride(s) == codeLength!dchar(c), +@@ -604,9 +683,18 @@ unittest + + enforce(stride(InputCU!dchar(s)) == codeLength!dchar(c), + new AssertError(format("Unit test failure range 0: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!dchar(s); ++ immutable bidirLen = refBidir.length; ++ enforce(stride(refBidir) == codeLength!dchar(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -623,14 +711,15 @@ unittest + test("hello\U00010143\u0100\U00010143", '\u0100', 6); + test("hello\U00010143\u0100\U00010143", '\U00010143', 7); + +- foreach(S; TypeTuple!(dchar[], const dchar[], dstring)) ++ foreach (S; TypeTuple!(dchar[], const dchar[], dstring)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){stride(str, 0);})); +- static assert(isSafe!((){stride(str);})); +- static assert((functionAttributes!((){stride(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){stride(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ stride(str, 0); })); ++ static assert(isSafe!({ stride(str); })); ++ static assert((functionAttributes!({ stride(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ stride(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -655,7 +744,7 @@ uint strideBack(S)(auto ref S str, size_ + { + static if (is(typeof(str.length) : ulong)) + assert(index <= str.length, "Past the end of the UTF-32 sequence"); +- assert (index > 0, "Not the end of the UTF-32 sequence"); ++ assert(index > 0, "Not the end of the UTF-32 sequence"); + return 1; + } + +@@ -677,16 +766,32 @@ unittest + enforce(strideBack(RandomCU!dchar(s), i == size_t.max ? s.length : i) == codeLength!dchar(c), + new AssertError(format("Unit test failure range: %s", s), __FILE__, line)); + ++ auto refRandom = new RefRandomCU!dchar(s); ++ immutable randLen = refRandom.length; ++ enforce(strideBack(refRandom, i == size_t.max ? s.length : i) == codeLength!dchar(c), ++ new AssertError(format("Unit test failure rand ref range: %s", s), __FILE__, line)); ++ enforce(refRandom.length == randLen, ++ new AssertError(format("Unit test failure rand ref range length: %s", s), __FILE__, line)); ++ + if (i == size_t.max) + { + enforce(strideBack(s) == codeLength!dchar(c), +- new AssertError(format("Unit test failure string length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure string code length: %s", s), __FILE__, line)); + + enforce(strideBack(BidirCU!dchar(s)) == codeLength!dchar(c), +- new AssertError(format("Unit test failure range length: %s", s), __FILE__, line)); ++ new AssertError(format("Unit test failure range code length: %s", s), __FILE__, line)); ++ ++ auto refBidir = new RefBidirCU!dchar(s); ++ immutable bidirLen = refBidir.length; ++ enforce(strideBack(refBidir) == codeLength!dchar(c), ++ new AssertError(format("Unit test failure bidir ref range code length: %s", s), __FILE__, line)); ++ enforce(refBidir.length == bidirLen, ++ new AssertError(format("Unit test failure bidir ref range length: %s", s), __FILE__, line)); + } + } + ++ assertCTFEable!( ++ { + test("a", 'a'); + test(" ", ' '); + test("\u2029", '\u2029'); //paraSep +@@ -703,14 +808,15 @@ unittest + test("\U00010143\u0100\U00010143hello", '\u0100', 2); + test("\U00010143\u0100\U00010143hello", '\U00010143', 1); + +- foreach(S; TypeTuple!(dchar[], const dchar[], dstring)) ++ foreach (S; TypeTuple!(dchar[], const dchar[], dstring)) + { + enum str = to!S("hello world"); +- static assert(isSafe!((){strideBack(str, 0);})); +- static assert(isSafe!((){strideBack(str);})); +- static assert((functionAttributes!((){strideBack(str, 0);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){strideBack(str);}) & FunctionAttribute.pure_) != 0); ++ static assert(isSafe!({ strideBack(str, 0); })); ++ static assert(isSafe!({ strideBack(str); })); ++ static assert((functionAttributes!({ strideBack(str, 0); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ strideBack(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -720,38 +826,23 @@ unittest + up to $(D index). So, $(D index) is the index of a code unit at the + beginning of a code point, and the return value is how many code points into + the string that that code point is. +- +-Examples: +--------------------- +-assert(toUCSindex(`hello world`, 7) == 7); +-assert(toUCSindex(`hello world`w, 7) == 7); +-assert(toUCSindex(`hello world`d, 7) == 7); +- +-assert(toUCSindex(`Ma Chérie`, 7) == 6); +-assert(toUCSindex(`Ma Chérie`w, 7) == 7); +-assert(toUCSindex(`Ma Chérie`d, 7) == 7); +- +-assert(toUCSindex(`さいごの果実 / ミツバチと科学者`, 9) == 3); +-assert(toUCSindex(`さいごの果実 / ミツバチと科学者`w, 9) == 9); +-assert(toUCSindex(`さいごの果実 / ミツバチと科学者`d, 9) == 9); +--------------------- + +/ + size_t toUCSindex(C)(const(C)[] str, size_t index) @safe pure +- if(isSomeChar!C) ++ if (isSomeChar!C) + { +- static if(is(Unqual!C == dchar)) ++ static if (is(Unqual!C == dchar)) + return index; + else + { + size_t n = 0; + size_t j = 0; + +- for(; j < index; ++n) ++ for (; j < index; ++n) + j += stride(str, j); + +- if(j > index) ++ if (j > index) + { +- static if(is(Unqual!C == char)) ++ static if (is(Unqual!C == char)) + throw new UTFException("Invalid UTF-8 sequence", index); + else + throw new UTFException("Invalid UTF-16 sequence", index); +@@ -761,6 +852,7 @@ size_t toUCSindex(C)(const(C)[] str, siz + } + } + ++/// + unittest + { + assert(toUCSindex(`hello world`, 7) == 7); +@@ -781,73 +873,61 @@ unittest + Given a UCS index $(D n) into $(D str), returns the UTF index. + So, $(D n) is how many code points into the string the code point is, and + the array index of the code unit is returned. +- +-Examples: +--------------------- +-assert(toUTFindex(`hello world`, 7) == 7); +-assert(toUTFindex(`hello world`w, 7) == 7); +-assert(toUTFindex(`hello world`d, 7) == 7); +- +-assert(toUTFindex(`Ma Chérie`, 6) == 7); +-assert(toUTFindex(`Ma Chérie`w, 7) == 7); +-assert(toUTFindex(`Ma Chérie`d, 7) == 7); +- +-assert(toUTFindex(`さいごの果実 / ミツバチと科学者`, 3) == 9); +-assert(toUTFindex(`さいごの果実 / ミツバチと科学者`w, 9) == 9); +-assert(toUTFindex(`さいごの果実 / ミツバチと科学者`d, 9) == 9); +--------------------- + +/ +-size_t toUTFindex(in char[] str, size_t n) @safe pure ++size_t toUTFindex(C)(const(C)[] str, size_t n) @safe pure ++ if (isSomeChar!C) + { +- size_t i; +- while (n--) +- i += stride(str, i); +- return i; +-} +- +-/// ditto +-size_t toUTFindex(in wchar[] str, size_t n) @safe pure nothrow +-{ +- size_t i; +- +- while (n--) ++ static if (is(Unqual!C == dchar)) + { +- wchar u = str[i]; +- +- i += 1 + (u >= 0xD800 && u <= 0xDBFF); ++ return n; ++ } ++ else ++ { ++ size_t i; ++ while (n--) ++ { ++ i += stride(str, i); ++ } ++ return i; + } +- +- return i; + } + +-/// ditto +-size_t toUTFindex(in dchar[] str, size_t n) @safe pure nothrow ++/// ++unittest + { +- return n; ++ assert(toUTFindex(`hello world`, 7) == 7); ++ assert(toUTFindex(`hello world`w, 7) == 7); ++ assert(toUTFindex(`hello world`d, 7) == 7); ++ ++ assert(toUTFindex(`Ma Chérie`, 6) == 7); ++ assert(toUTFindex(`Ma Chérie`w, 7) == 7); ++ assert(toUTFindex(`Ma Chérie`d, 7) == 7); ++ ++ assert(toUTFindex(`さいごの果実 / ミツバチと科学者`, 3) == 9); ++ assert(toUTFindex(`さいごの果実 / ミツバチと科学者`w, 9) == 9); ++ assert(toUTFindex(`さいごの果実 / ミツバチと科学者`d, 9) == 9); + } + + + /* =================== Decode ======================= */ + + /++ +- Decodes and returns the character starting at $(D str[index]). $(D index) +- is advanced to one past the decoded character. If the character is not ++ Decodes and returns the code point starting at $(D str[index]). $(D index) ++ is advanced to one past the decoded code point. If the code point is not + well-formed, then a $(D UTFException) is thrown and $(D index) remains + unchanged. + +- $(D decodeFront) is a variant of $(D decode) which specifically decodes +- the first character. +- +- $(D decode) will only work with strings and random access ranges of +- code units with length and slicing, whereas $(D decodeFront) will also work +- with any input range of code units. ++ decode will only work with strings and random access ranges of code units ++ with length and slicing, whereas $(LREF decodeFront) will work with any ++ input range of code units. + + Throws: +- $(D UTFException) if $(D str[index]) is not the start of a valid UTF ++ $(LREF UTFException) if $(D str[index]) is not the start of a valid UTF + sequence. + +/ +-dchar decode(S)(auto ref S str, ref size_t index) @trusted pure +- if (isSomeString!S) ++dchar decode(S)(auto ref S str, ref size_t index) ++ if (!isSomeString!S && ++ isRandomAccessRange!S && hasSlicing!S && hasLength!S && isSomeChar!(ElementType!S)) + in + { + assert(index < str.length, "Attempted to decode past the end of a string"); +@@ -863,9 +943,8 @@ body + return decodeImpl!true(str, index); + } + +-dchar decode(S)(auto ref S str, ref size_t index) +- if (!isSomeString!S && +- (isRandomAccessRange!S && hasSlicing!S && hasLength!S && isSomeChar!(ElementType!S))) ++dchar decode(S)(auto ref S str, ref size_t index) @trusted pure ++ if (isSomeString!S) + in + { + assert(index < str.length, "Attempted to decode past the end of a string"); +@@ -881,9 +960,23 @@ body + return decodeImpl!true(str, index); + } + +-/// Ditto +-dchar decodeFront(S)(auto ref S str, out size_t index) @trusted pure +- if (isSomeString!S) ++/++ ++ $(D decodeFront) is a variant of $(LREF decode) which specifically decodes ++ the first code point. Unlike $(LREF decode), $(D decodeFront) accepts any ++ input range of code units (rather than just a string or random access ++ range). It also takes the range by $(D ref) and pops off the elements as it ++ decodes them. If $(D numCodeUnits) is passed in, it gets set to the number ++ of code units which were in the code point which was decoded. ++ ++ Throws: ++ $(LREF UTFException) if $(D str.front) is not the start of a valid UTF ++ sequence. If an exception is thrown, then there is no guarantee as to ++ the number of code units which were popped off, as it depends on the ++ type of range being used and how many code units had to be popped off ++ before the code point was determined to be invalid. ++ +/ ++dchar decodeFront(S)(ref S str, out size_t numCodeUnits) ++ if (!isSomeString!S && isInputRange!S && isSomeChar!(ElementType!S)) + in + { + assert(!str.empty); +@@ -894,18 +987,30 @@ out (result) + } + body + { +- if (str[0] < codeUnitLimit!S) ++ immutable fst = str.front; ++ ++ if (fst < codeUnitLimit!S) + { +- index = 1; +- return str[0]; ++ str.popFront(); ++ numCodeUnits = 1; ++ return fst; + } + +- return decodeImpl!true(str, index); ++ //@@@BUG@@@ 8521 forces canIndex to be done outside of decodeImpl, which ++ //is undesirable, since not all overloads of decodeImpl need it. So, it ++ //should be moved back into decodeImpl once bug# 8521 has been fixed. ++ enum canIndex = isRandomAccessRange!S && hasSlicing!S && hasLength!S; ++ immutable retval = decodeImpl!canIndex(str, numCodeUnits); ++ ++ // The other range types were already popped by decodeImpl. ++ static if (isRandomAccessRange!S && hasSlicing!S && hasLength!S) ++ str = str[numCodeUnits .. str.length]; ++ ++ return retval; + } + +-/// Ditto +-dchar decodeFront(S)(auto ref S str, out size_t index) +- if (!isSomeString!S) ++dchar decodeFront(S)(ref S str, out size_t numCodeUnits) @trusted pure ++ if (isSomeString!S) + in + { + assert(!str.empty); +@@ -916,28 +1021,30 @@ out (result) + } + body + { +- //@@@BUG@@@ 8521 forces canIndex to be down outside of decodeImpl, which +- //is undesirable, since not all overloads of decodeImpl need it. So, it +- //should be moved back into decodeImpl once bug# 8521 has been fixed. +- enum canIndex = isRandomAccessRange!S && hasSlicing!S && hasLength!S && isSomeChar!(ElementType!S); +- //static if (isRandomAccessRange!S && hasSlicing!S && hasLength!S && isSomeChar!(ElementType!S)) +- static if (canIndex) +- immutable fst = str[0]; +- else +- immutable fst = str.front; +- +- if (fst < codeUnitLimit!S) ++ if (str[0] < codeUnitLimit!S) + { +- index = 1; +- return fst; ++ numCodeUnits = 1; ++ immutable retval = str[0]; ++ str = str[1 .. $]; ++ return retval; + } + +- return decodeImpl!canIndex(str, index); ++ immutable retval = decodeImpl!true(str, numCodeUnits); ++ str = str[numCodeUnits .. $]; ++ return retval; ++} ++ ++/++ Ditto +/ ++dchar decodeFront(S)(ref S str) ++ if (isInputRange!S && isSomeChar!(ElementType!S)) ++{ ++ size_t numCodeUnits; ++ return decodeFront(str, numCodeUnits); + } + + // Gives the maximum value that a code unit for the given range type can hold. + private template codeUnitLimit(S) +- if (isSomeChar!(ElementEncodingType!S)) ++ if (isSomeChar!(ElementEncodingType!S)) + { + static if (is(Unqual!(ElementEncodingType!S) == char)) + enum char codeUnitLimit = 0x80; +@@ -975,9 +1082,9 @@ private dchar decodeImpl(bool canIndex, + else static if (isRandomAccessRange!S && hasSlicing!S && hasLength!S) + auto pstr = str[index .. str.length]; + else +- alias str pstr; ++ alias pstr = str; + +- //@@@BUG@@@ 8521 forces this to be down outside of decodeImpl ++ //@@@BUG@@@ 8521 forces this to be done outside of decodeImpl + //enum canIndex = is(S : const char[]) || (isRandomAccessRange!S && hasSlicing!S && hasLength!S); + + static if (canIndex) +@@ -1003,7 +1110,7 @@ private dchar decodeImpl(bool canIndex, + sequence[i] = str[i]; + } while (++i < str.length && i < 4 && (str[i] & 0xC0) == 0x80); + +- return (new UTFException(msg, i)).setSequence(sequence[0 .. i]); ++ return new UTFException(msg, i).setSequence(sequence[0 .. i]); + } + } + +@@ -1037,7 +1144,7 @@ private dchar decodeImpl(bool canIndex, + dchar d = fst; // upper control bits are masked out later + fst <<= 1; + +- foreach(i; TypeTuple!(1, 2, 3)) ++ foreach (i; TypeTuple!(1, 2, 3)) + { + + static if (canIndex) +@@ -1096,9 +1203,9 @@ private dchar decodeImpl(bool canIndex, + else static if (isRandomAccessRange!S && hasSlicing!S && hasLength!S) + auto pstr = str[index .. str.length]; + else +- alias str pstr; ++ alias pstr = str; + +- //@@@BUG@@@ 8521 forces this to be down outside of decodeImpl ++ //@@@BUG@@@ 8521 forces this to be done outside of decodeImpl + //enum canIndex = is(S : const wchar[]) || (isRandomAccessRange!S && hasSlicing!S && hasLength!S); + + static if (canIndex) +@@ -1115,7 +1222,7 @@ private dchar decodeImpl(bool canIndex, + UTFException exception(string msg) + { + static if (canIndex) +- return (new UTFException(msg)).setSequence(pstr[0]); ++ return new UTFException(msg).setSequence(pstr[0]); + else + return new UTFException(msg); + } +@@ -1164,220 +1271,262 @@ private dchar decodeImpl(bool canIndex, + static if (is(S : const dchar[])) + auto pstr = str.ptr; + else +- alias str pstr; ++ alias pstr = str; + + static if (is(S : const dchar[]) || (isRandomAccessRange!S && hasSlicing!S && hasLength!S)) + { + if (!isValidDchar(pstr[index])) +- throw (new UTFException("Invalid UTF-32 value")).setSequence(pstr[index]); ++ throw new UTFException("Invalid UTF-32 value").setSequence(pstr[index]); + return pstr[index++]; + } + else + { + if (!isValidDchar(pstr.front)) +- throw (new UTFException("Invalid UTF-32 value")).setSequence(pstr.front); ++ throw new UTFException("Invalid UTF-32 value").setSequence(pstr.front); + ++index; +- return pstr.front; ++ immutable retval = pstr.front; ++ pstr.popFront(); ++ return retval; + } + } + +-unittest ++version(unittest) private void testDecode(R)(R range, ++ size_t index, ++ dchar expectedChar, ++ size_t expectedIndex, ++ size_t line = __LINE__) + { +- foreach(S; TypeTuple!(to!string, RandomCU!char)) +- { +- size_t i; +- dchar c; +- +- debug(utf) printf("utf.decode.unittest\n"); +- +- auto s1 = S("abcd"); +- i = 0; +- c = decode(s1, i); +- assert(c == cast(dchar)'a'); +- assert(i == 1); +- c = decode(s1, i); +- assert(c == cast(dchar)'b'); +- assert(i == 2); +- +- auto s2 = S("\xC2\xA9"); +- i = 0; +- c = decode(s2, i); +- assert(c == cast(dchar)'\u00A9'); +- assert(i == 2); +- +- auto s3 = S("\xE2\x89\xA0"); +- i = 0; +- c = decode(s3, i); +- assert(c == cast(dchar)'\u2260'); +- assert(i == 3); +- +- string[] s4 = [ +- "\xE2\x89", // too short +- "\xC0\x8A", +- "\xE0\x80\x8A", +- "\xF0\x80\x80\x8A", +- "\xF8\x80\x80\x80\x8A", +- "\xFC\x80\x80\x80\x80\x8A", +- ]; ++ static if (hasLength!R) ++ immutable lenBefore = range.length; + +- for (int j = 0; j < s4.length; j++) ++ static if (isRandomAccessRange!R) ++ { + { +- i = 0; +- assertThrown!UTFException(decode(S(s4[j]), i)); ++ immutable result = decode(range, index); ++ enforce(result == expectedChar, ++ new AssertError(format("decode: Wrong character: %s", result), __FILE__, line)); ++ enforce(index == expectedIndex, ++ new AssertError(format("decode: Wrong index: %s", index), __FILE__, line)); ++ static if (hasLength!R) ++ { ++ enforce(range.length == lenBefore, ++ new AssertError(format("decode: length changed: %s", range.length), __FILE__, line)); ++ } + } + } ++} ++ ++version(unittest) private void testDecodeFront(R)(ref R range, ++ dchar expectedChar, ++ size_t expectedNumCodeUnits, ++ size_t line = __LINE__) ++{ ++ static if (hasLength!R) ++ immutable lenBefore = range.length; ++ ++ size_t numCodeUnits; ++ immutable result = decodeFront(range, numCodeUnits); ++ enforce(result == expectedChar, ++ new AssertError(format("decodeFront: Wrong character: %s", result), __FILE__, line)); ++ enforce(numCodeUnits == expectedNumCodeUnits, ++ new AssertError(format("decodeFront: Wrong numCodeUnits: %s", numCodeUnits), __FILE__, line)); + +- foreach(S; TypeTuple!(to!string, RandomCU!char, InputCU!char)) ++ static if (hasLength!R) + { +- size_t i; +- dchar c; ++ enforce(range.length == lenBefore - numCodeUnits, ++ new AssertError(format("decodeFront: wrong length: %s", range.length), __FILE__, line)); ++ } ++} + +- debug(utf) printf("utf.decode.unittest\n"); ++version(unittest) private void testBothDecode(R)(R range, ++ dchar expectedChar, ++ size_t expectedIndex, ++ size_t line = __LINE__) ++{ ++ testDecode(range, 0, expectedChar, expectedIndex, line); ++ testDecodeFront(range, expectedChar, expectedIndex, line); ++} ++ ++version(unittest) private void testBadDecode(R)(R range, size_t index, size_t line = __LINE__) ++{ ++ immutable initialIndex = index; + +- auto s1 = S("abcd"); +- i = 42; +- c = decodeFront(s1, i); +- assert(c == cast(dchar)'a'); +- assert(i == 1); +- +- auto s2 = S("\xC2\xA9"); +- i = 42; +- c = decodeFront(s2, i); +- assert(c == cast(dchar)'\u00A9'); +- assert(i == 2); +- +- auto s3 = S("\xE2\x89\xA0"); +- i = 42; +- c = decodeFront(s3, i); +- assert(c == cast(dchar)'\u2260'); +- assert(i == 3); +- +- string[] s4 = [ +- "\xE2\x89", // too short +- "\xC0\x8A", +- "\xE0\x80\x8A", +- "\xF0\x80\x80\x8A", +- "\xF8\x80\x80\x80\x8A", +- "\xFC\x80\x80\x80\x80\x8A", +- ]; ++ static if (hasLength!R) ++ immutable lenBefore = range.length; + +- for (int j = 0; j < s4.length; j++) ++ static if (isRandomAccessRange!R) ++ { ++ assertThrown!UTFException(decode(range, index), null, __FILE__, line); ++ enforce(index == initialIndex, ++ new AssertError(format("decode: Wrong index: %s", index), __FILE__, line)); ++ static if (hasLength!R) + { +- i = 0; +- assertThrown!UTFException(decodeFront(S(s4[j]), i)); ++ enforce(range.length == lenBefore, ++ new AssertError(format("decode: length changed:", range.length), __FILE__, line)); + } + } ++ ++ if (initialIndex == 0) ++ assertThrown!UTFException(decodeFront(range, index), null, __FILE__, line); + } + + unittest + { +- size_t i; ++ debug(utf) printf("utf.decode.unittest\n"); + +- foreach(S; TypeTuple!(to!string, RandomCU!char, InputCU!char)) ++ assertCTFEable!( + { +- static if (is(S == InputCU!char)) +- alias TypeTuple!(decodeFront) funcs; +- else +- alias TypeTuple!(decode, decodeFront) funcs; ++ foreach (S; TypeTuple!(to!string, InputCU!char, RandomCU!char, ++ (string s) => new RefBidirCU!char(s), ++ (string s) => new RefRandomCU!char(s))) ++ { ++ enum sHasLength = hasLength!(typeof(S("abcd"))); ++ ++ { ++ auto range = S("abcd"); ++ testDecode(range, 0, 'a', 1); ++ testDecode(range, 1, 'b', 2); ++ testDecodeFront(range, 'a', 1); ++ testDecodeFront(range, 'b', 1); ++ assert(decodeFront(range) == 'c'); ++ assert(decodeFront(range) == 'd'); ++ } ++ ++ { ++ auto range = S("ウェブサイト"); ++ testDecode(range, 0, 'ウ', 3); ++ testDecode(range, 3, 'ェ', 6); ++ testDecodeFront(range, 'ウ', 3); ++ testDecodeFront(range, 'ェ', 3); ++ assert(decodeFront(range) == 'ブ'); ++ assert(decodeFront(range) == 'サ'); ++ } + +- foreach(func; funcs) ++ testBothDecode(S("\xC2\xA9"), '\u00A9', 2); ++ testBothDecode(S("\xE2\x89\xA0"), '\u2260', 3); ++ ++ foreach (str; ["\xE2\x89", // too short ++ "\xC0\x8A", ++ "\xE0\x80\x8A", ++ "\xF0\x80\x80\x8A", ++ "\xF8\x80\x80\x80\x8A", ++ "\xFC\x80\x80\x80\x80\x8A"]) + { +- i = 0; assert(func(S("\xEF\xBF\xBE"c), i) == cast(dchar)0xFFFE); +- i = 0; assert(func(S("\xEF\xBF\xBF"c), i) == cast(dchar)0xFFFF); +- i = 0; +- +- assertThrown!UTFException(func(S("\xED\xA0\x80"c), i)); +- assertThrown!UTFException(func(S("\xED\xAD\xBF"c), i)); +- assertThrown!UTFException(func(S("\xED\xAE\x80"c), i)); +- assertThrown!UTFException(func(S("\xED\xAF\xBF"c), i)); +- assertThrown!UTFException(func(S("\xED\xB0\x80"c), i)); +- assertThrown!UTFException(func(S("\xED\xBE\x80"c), i)); +- assertThrown!UTFException(func(S("\xED\xBF\xBF"c), i)); ++ testBadDecode(S(str), 0); ++ testBadDecode(S(str), 1); + } ++ ++ //Invalid UTF-8 sequence where the first code unit is valid. ++ testBothDecode(S("\xEF\xBF\xBE"), cast(dchar)0xFFFE, 3); ++ testBothDecode(S("\xEF\xBF\xBF"), cast(dchar)0xFFFF, 3); ++ ++ //Invalid UTF-8 sequence where the first code unit isn't valid. ++ testBadDecode(S("\xED\xA0\x80"), 0); ++ testBadDecode(S("\xED\xAD\xBF"), 0); ++ testBadDecode(S("\xED\xAE\x80"), 0); ++ testBadDecode(S("\xED\xAF\xBF"), 0); ++ testBadDecode(S("\xED\xB0\x80"), 0); ++ testBadDecode(S("\xED\xBE\x80"), 0); ++ testBadDecode(S("\xED\xBF\xBF"), 0); + } ++ }); + } + + unittest + { +- size_t i; +- +- foreach(S; TypeTuple!(to!wstring, RandomCU!wchar, InputCU!wchar)) ++ assertCTFEable!( + { +- static if (is(S == InputCU!wchar)) +- alias TypeTuple!(decodeFront) funcs; +- else +- alias TypeTuple!(decode, decodeFront) funcs; ++ foreach (S; TypeTuple!(to!wstring, InputCU!wchar, RandomCU!wchar, ++ (wstring s) => new RefBidirCU!wchar(s), ++ (wstring s) => new RefRandomCU!wchar(s))) ++ { ++ testBothDecode(S([cast(wchar)0x1111]), cast(dchar)0x1111, 1); ++ testBothDecode(S([cast(wchar)0xD800, cast(wchar)0xDC00]), cast(dchar)0x10000, 2); ++ testBothDecode(S([cast(wchar)0xDBFF, cast(wchar)0xDFFF]), cast(dchar)0x10FFFF, 2); ++ testBothDecode(S([cast(wchar)0xFFFE]), cast(dchar)0xFFFE, 1); ++ testBothDecode(S([cast(wchar)0xFFFF]), cast(dchar)0xFFFF, 1); ++ ++ testBadDecode(S([ cast(wchar)0xD801 ]), 0); ++ testBadDecode(S([ cast(wchar)0xD800, cast(wchar)0x1200 ]), 0); + +- foreach(func; funcs) + { +- i = 0; assert(func(S([ cast(wchar)0x1111 ]), i) == cast(dchar)0x1111 && i == 1); +- i = 0; assert(func(S([ cast(wchar)0xD800, cast(wchar)0xDC00 ]), i) == cast(dchar)0x10000 && i == 2); +- i = 0; assert(func(S([ cast(wchar)0xDBFF, cast(wchar)0xDFFF ]), i) == cast(dchar)0x10FFFF && i == 2); +- i = 0; assert(func(S([ cast(wchar)0xFFFE ]), i) == cast(dchar)0xFFFE && i == 1); +- i = 0; assert(func(S([ cast(wchar)0xFFFF ]), i) == cast(dchar)0xFFFF && i == 1); +- i = 0; assertThrown!UTFException(func(S([ cast(wchar)0xD801 ]), i)); +- i = 0; assertThrown!UTFException(func(S([ cast(wchar)0xD800, cast(wchar)0x1200 ]), i)); ++ auto range = S("ウェブサイト"); ++ testDecode(range, 0, 'ウ', 1); ++ testDecode(range, 1, 'ェ', 2); ++ testDecodeFront(range, 'ウ', 1); ++ testDecodeFront(range, 'ェ', 1); ++ assert(decodeFront(range) == 'ブ'); ++ assert(decodeFront(range) == 'サ'); + } + } + +- foreach(S; TypeTuple!(to!wstring, RandomCU!wchar)) ++ foreach (S; TypeTuple!(to!wstring, RandomCU!wchar, (wstring s) => new RefRandomCU!wchar(s))) + { +- auto str = S([ cast(wchar)0xD800, cast(wchar)0xDC00, +- cast(wchar)0x1400, +- cast(wchar)0xDAA7, cast(wchar)0xDDDE ]); +- i = 0; +- assert(decode(str, i) == 0x10000 && i == 2); +- assert(decode(str, i) == 0x1400 && i == 3); +- assert(decode(str, i) == 0xB9DDE && i == 5); ++ auto str = S([cast(wchar)0xD800, cast(wchar)0xDC00, ++ cast(wchar)0x1400, ++ cast(wchar)0xDAA7, cast(wchar)0xDDDE]); ++ testDecode(str, 0, cast(dchar)0x10000, 2); ++ testDecode(str, 2, cast(dchar)0x1400, 3); ++ testDecode(str, 3, cast(dchar)0xB9DDE, 5); + } ++ }); + } + + unittest + { +- size_t i; +- +- foreach(S; TypeTuple!(to!dstring, RandomCU!dchar, InputCU!dchar)) ++ assertCTFEable!( + { +- static if (is(S == InputCU!dchar)) +- alias TypeTuple!(decodeFront) funcs; +- else +- alias TypeTuple!(decode, decodeFront) funcs; ++ foreach (S; TypeTuple!(to!dstring, RandomCU!dchar, InputCU!dchar, ++ (dstring s) => new RefBidirCU!dchar(s), ++ (dstring s) => new RefRandomCU!dchar(s))) ++ { ++ testBothDecode(S([cast(dchar)0x1111]), cast(dchar)0x1111, 1); ++ testBothDecode(S([cast(dchar)0x10000]), cast(dchar)0x10000, 1); ++ testBothDecode(S([cast(dchar)0x10FFFF]), cast(dchar)0x10FFFF, 1); ++ testBothDecode(S([cast(dchar)0xFFFE]), cast(dchar)0xFFFE, 1); ++ testBothDecode(S([cast(dchar)0xFFFF]), cast(dchar)0xFFFF, 1); ++ ++ testBadDecode(S([cast(dchar)0xD800]), 0); ++ testBadDecode(S([cast(dchar)0xDFFE]), 0); ++ testBadDecode(S([cast(dchar)0x110000]), 0); + +- foreach(func; funcs) + { +- i = 0; assert(func(S([ cast(dchar)0x1111 ]), i) == cast(dchar)0x1111 && i == 1); +- i = 0; assert(func(S([ cast(dchar)0x10000 ]), i) == cast(dchar)0x10000 && i == 1); +- i = 0; assert(func(S([ cast(dchar)0x10FFFF ]), i) == cast(dchar)0x10FFFF && i == 1); +- i = 0; assert(func(S([ cast(dchar)0xFFFE ]), i) == cast(dchar)0xFFFE && i == 1); +- i = 0; assert(func(S([ cast(dchar)0xFFFF ]), i) == cast(dchar)0xFFFF && i == 1); +- i = 0; assertThrown!UTFException(func(S([ cast(dchar)0xD800 ]), i)); +- i = 0; assertThrown!UTFException(func(S([ cast(dchar)0xDFFE ]), i)); +- i = 0; assertThrown!UTFException(func(S([ cast(dchar)0x110000 ]), i)); ++ auto range = S("ウェブサイト"); ++ testDecode(range, 0, 'ウ', 1); ++ testDecode(range, 1, 'ェ', 2); ++ testDecodeFront(range, 'ウ', 1); ++ testDecodeFront(range, 'ェ', 1); ++ assert(decodeFront(range) == 'ブ'); ++ assert(decodeFront(range) == 'サ'); + } + } + +- foreach(S; TypeTuple!(to!dstring, RandomCU!dchar)) ++ foreach (S; TypeTuple!(to!dstring, RandomCU!dchar, (dstring s) => new RefRandomCU!dchar(s))) + { +- auto str = S([ cast(dchar)0x10000, cast(dchar)0x1400, cast(dchar)0xB9DDE ]); +- i = 0; +- assert(decode(str, i) == 0x10000 && i == 1); +- assert(decode(str, i) == 0x1400 && i == 2); +- assert(decode(str, i) == 0xB9DDE && i == 3); ++ auto str = S([cast(dchar)0x10000, cast(dchar)0x1400, cast(dchar)0xB9DDE]); ++ testDecode(str, 0, 0x10000, 1); ++ testDecode(str, 1, 0x1400, 2); ++ testDecode(str, 2, 0xB9DDE, 3); + } ++ }); + } + + unittest + { +- foreach(S; TypeTuple!(char[], const char[], string, +- wchar[], const wchar[], wstring, +- dchar[], const dchar[], dstring)) ++ assertCTFEable!( + { +- enum str = to!S("hello world"); +- static assert(isSafe!((){size_t i = 0; decode(str, i);})); +- static assert(isSafe!((){size_t i = 0; decodeFront(str, i);})); +- static assert((functionAttributes!((){size_t i = 0; decode(str, i);}) & FunctionAttribute.pure_) != 0); +- static assert((functionAttributes!((){size_t i = 0; decodeFront(str, i);}) & FunctionAttribute.pure_) != 0); ++ foreach (S; TypeTuple!( char[], const( char)[], string, ++ wchar[], const(wchar)[], wstring, ++ dchar[], const(dchar)[], dstring)) ++ { ++ static assert(isSafe!({ S str; size_t i = 0; decode(str, i); })); ++ static assert(isSafe!({ S str; size_t i = 0; decodeFront(str, i); })); ++ static assert(isSafe!({ S str; decodeFront(str); })); ++ static assert((functionAttributes!({ S str; size_t i = 0; decode(str, i); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ S str; size_t i = 0; decodeFront(str, i); }) & FunctionAttribute.pure_) != 0); ++ static assert((functionAttributes!({ S str; decodeFront(str); }) & FunctionAttribute.pure_) != 0); + } ++ }); + } + + +@@ -1410,7 +1559,7 @@ size_t encode(ref char[4] buf, dchar c) + if (c <= 0xFFFF) + { + if (0xD800 <= c && c <= 0xDFFF) +- throw (new UTFException("Encoding a surrogate code point in UTF-8")).setSequence(c); ++ throw new UTFException("Encoding a surrogate code point in UTF-8").setSequence(c); + + assert(isValidDchar(c)); + buf[0] = cast(char)(0xE0 | (c >> 12)); +@@ -1429,11 +1578,13 @@ size_t encode(ref char[4] buf, dchar c) + } + + assert(!isValidDchar(c)); +- throw (new UTFException("Encoding an invalid code point in UTF-8")).setSequence(c); ++ throw new UTFException("Encoding an invalid code point in UTF-8").setSequence(c); + } + + unittest + { ++ assertCTFEable!( ++ { + char[4] buf; + + assert(encode(buf, '\u0000') == 1 && buf[0 .. 1] == "\u0000"); +@@ -1453,6 +1604,7 @@ unittest + assertThrown!UTFException(encode(buf, cast(dchar)0xDC00)); + assertThrown!UTFException(encode(buf, cast(dchar)0xDFFF)); + assertThrown!UTFException(encode(buf, cast(dchar)0x110000)); ++ }); + } + + +@@ -1462,7 +1614,7 @@ size_t encode(ref wchar[2] buf, dchar c) + if (c <= 0xFFFF) + { + if (0xD800 <= c && c <= 0xDFFF) +- throw (new UTFException("Encoding an isolated surrogate code point in UTF-16")).setSequence(c); ++ throw new UTFException("Encoding an isolated surrogate code point in UTF-16").setSequence(c); + + assert(isValidDchar(c)); + buf[0] = cast(wchar)c; +@@ -1477,11 +1629,13 @@ size_t encode(ref wchar[2] buf, dchar c) + } + + assert(!isValidDchar(c)); +- throw (new UTFException("Encoding an invalid code point in UTF-16")).setSequence(c); ++ throw new UTFException("Encoding an invalid code point in UTF-16").setSequence(c); + } + + unittest + { ++ assertCTFEable!( ++ { + wchar[2] buf; + + assert(encode(buf, '\u0000') == 1 && buf[0 .. 1] == "\u0000"); +@@ -1497,6 +1651,7 @@ unittest + assertThrown!UTFException(encode(buf, cast(dchar)0xDC00)); + assertThrown!UTFException(encode(buf, cast(dchar)0xDFFF)); + assertThrown!UTFException(encode(buf, cast(dchar)0x110000)); ++ }); + } + + +@@ -1530,7 +1685,7 @@ void encode(ref char[] str, dchar c) @sa + else if (c <= 0xFFFF) + { + if (0xD800 <= c && c <= 0xDFFF) +- throw (new UTFException("Encoding a surrogate code point in UTF-8")).setSequence(c); ++ throw new UTFException("Encoding a surrogate code point in UTF-8").setSequence(c); + + assert(isValidDchar(c)); + buf[0] = cast(char)(0xE0 | (c >> 12)); +@@ -1550,7 +1705,7 @@ void encode(ref char[] str, dchar c) @sa + else + { + assert(!isValidDchar(c)); +- throw (new UTFException("Encoding an invalid code point in UTF-8")).setSequence(c); ++ throw new UTFException("Encoding an invalid code point in UTF-8").setSequence(c); + } + r ~= buf[0 .. L]; + } +@@ -1561,6 +1716,8 @@ unittest + { + debug(utf) printf("utf.encode.unittest\n"); + ++ assertCTFEable!( ++ { + char[] s = "abcd".dup; + encode(s, cast(dchar)'a'); + assert(s.length == 5); +@@ -1574,10 +1731,13 @@ unittest + encode(s, cast(dchar)'\u2260'); + assert(s.length == 10); + assert(s == "abcda\xC2\xA9\xE2\x89\xA0"); ++ }); + } + + unittest + { ++ assertCTFEable!( ++ { + char[] buf; + + encode(buf, '\u0000'); assert(buf[0 .. $] == "\u0000"); +@@ -1597,6 +1757,7 @@ unittest + assertThrown!UTFException(encode(buf, cast(dchar)0xDC00)); + assertThrown!UTFException(encode(buf, cast(dchar)0xDFFF)); + assertThrown!UTFException(encode(buf, cast(dchar)0x110000)); ++ }); + } + + /// ditto +@@ -1607,7 +1768,7 @@ void encode(ref wchar[] str, dchar c) @s + if (c <= 0xFFFF) + { + if (0xD800 <= c && c <= 0xDFFF) +- throw (new UTFException("Encoding an isolated surrogate code point in UTF-16")).setSequence(c); ++ throw new UTFException("Encoding an isolated surrogate code point in UTF-16").setSequence(c); + + assert(isValidDchar(c)); + r ~= cast(wchar)c; +@@ -1624,7 +1785,7 @@ void encode(ref wchar[] str, dchar c) @s + else + { + assert(!isValidDchar(c)); +- throw (new UTFException("Encoding an invalid code point in UTF-16")).setSequence(c); ++ throw new UTFException("Encoding an invalid code point in UTF-16").setSequence(c); + } + + str = r; +@@ -1632,6 +1793,8 @@ void encode(ref wchar[] str, dchar c) @s + + unittest + { ++ assertCTFEable!( ++ { + wchar[] buf; + + encode(buf, '\u0000'); assert(buf[0] == '\u0000'); +@@ -1647,13 +1810,14 @@ unittest + assertThrown!UTFException(encode(buf, cast(dchar)0xDC00)); + assertThrown!UTFException(encode(buf, cast(dchar)0xDFFF)); + assertThrown!UTFException(encode(buf, cast(dchar)0x110000)); ++ }); + } + + /// ditto + void encode(ref dchar[] str, dchar c) @safe pure + { + if ((0xD800 <= c && c <= 0xDFFF) || 0x10FFFF < c) +- throw (new UTFException("Encoding an invalid code point in UTF-32")).setSequence(c); ++ throw new UTFException("Encoding an invalid code point in UTF-32").setSequence(c); + + assert(isValidDchar(c)); + str ~= c; +@@ -1661,6 +1825,8 @@ void encode(ref dchar[] str, dchar c) @s + + unittest + { ++ assertCTFEable!( ++ { + dchar[] buf; + + encode(buf, '\u0000'); assert(buf[0] == '\u0000'); +@@ -1675,26 +1841,16 @@ unittest + assertThrown!UTFException(encode(buf, cast(dchar)0xDC00)); + assertThrown!UTFException(encode(buf, cast(dchar)0xDFFF)); + assertThrown!UTFException(encode(buf, cast(dchar)0x110000)); ++ }); + } + + + /++ + Returns the number of code units that are required to encode the code point + $(D c) when $(D C) is the character type used to encode it. +- +-Examples: +------- +-assert(codeLength!char('a') == 1); +-assert(codeLength!wchar('a') == 1); +-assert(codeLength!dchar('a') == 1); +- +-assert(codeLength!char('\U0010FFFF') == 4); +-assert(codeLength!wchar('\U0010FFFF') == 2); +-assert(codeLength!dchar('\U0010FFFF') == 1); +------- + +/ + ubyte codeLength(C)(dchar c) @safe pure nothrow +- if(isSomeChar!C) ++ if (isSomeChar!C) + { + static if (C.sizeof == 1) + { +@@ -1716,7 +1872,7 @@ ubyte codeLength(C)(dchar c) @safe pure + } + } + +-//Verify Examples. ++/// + unittest + { + assert(codeLength!char('a') == 1); +@@ -1734,48 +1890,25 @@ unittest + in a string whose character type is $(D C). This is particularly useful + when slicing one string with the length of another and the two string + types use different character types. +- +-Examples: +------- +-assert(codeLength!char("hello world") == +- to!string("hello world").length); +-assert(codeLength!wchar("hello world") == +- to!wstring("hello world").length); +-assert(codeLength!dchar("hello world") == +- to!dstring("hello world").length); +- +-assert(codeLength!char(`プログラミング`) == +- to!string(`プログラミング`).length); +-assert(codeLength!wchar(`プログラミング`) == +- to!wstring(`プログラミング`).length); +-assert(codeLength!dchar(`プログラミング`) == +- to!dstring(`プログラミング`).length); +- +-string haystack = `Être sans la verité, ça, ce ne serait pas bien.`; +-wstring needle = `Être sans la verité`; +-assert(haystack[codeLength!char(needle) .. $] == +- `, ça, ce ne serait pas bien.`); +------- + +/ + size_t codeLength(C, InputRange)(InputRange input) +- if(isInputRange!InputRange && is(ElementType!InputRange : dchar)) ++ if (isInputRange!InputRange && is(ElementType!InputRange : dchar)) + { +- alias Unqual!(ElementEncodingType!InputRange) EncType; +- static if(isSomeString!InputRange && is(EncType == C) && is(typeof(input.length))) +- return input.length; +- else +- { ++ alias EncType = Unqual!(ElementEncodingType!InputRange); ++ static if (isSomeString!InputRange && is(EncType == C) && is(typeof(input.length))) ++ return input.length; ++ else ++ { + size_t total = 0; + +- foreach(dchar c; input) ++ foreach (dchar c; input) + total += codeLength!C(c); + + return total; +- } ++ } + } +- + +-//Verify Examples. ++/// + unittest + { + assert(codeLength!char("hello world") == +@@ -1800,20 +1933,23 @@ unittest + + unittest + { +- foreach(S; TypeTuple!(char[], const char[], string, +- wchar[], const wchar[], wstring, +- dchar[], const dchar[], dstring)) ++ assertCTFEable!( ++ { ++ foreach (S; TypeTuple!( char[], const char[], string, ++ wchar[], const wchar[], wstring, ++ dchar[], const dchar[], dstring)) + { +- foreach(C; TypeTuple!(char, wchar, dchar)) ++ foreach (C; TypeTuple!(char, wchar, dchar)) + { + assert(codeLength!C(to!S("Walter Bright")) == to!(C[])("Walter Bright").length); + assert(codeLength!C(to!S(`言語`)) == to!(C[])(`言語`).length); + assert(codeLength!C(to!S(`ウェブサイト@La_Verité.com`)) == + to!(C[])(`ウェブサイト@La_Verité.com`).length); +- assert(codeLength!C(to!S(`ウェブサイト@La_Verité.com`).filter!(x => true)()) == ++ assert(codeLength!C(to!S(`ウェブサイト@La_Verité.com`).filter!(x => true)()) == + to!(C[])(`ウェブサイト@La_Verité.com`).length); + } + } ++ }); + } + + +@@ -1826,7 +1962,7 @@ unittest + $(D UTFException) if $(D str) is not well-formed. + +/ + void validate(S)(in S str) @safe pure +- if(isSomeString!S) ++ if (isSomeString!S) + { + immutable len = str.length; + for (size_t i = 0; i < len; ) +@@ -2111,16 +2247,6 @@ dstring toUTF32(in dchar[] s) @safe + C function keeps it around for any reason, make sure that you keep a + reference to it in your D code. Otherwise, it may go away during a garbage + collection cycle and cause a nasty bug when the C code tries to use it. +- +- Examples: +--------------------- +-auto p1 = toUTFz!(char*)("hello world"); +-auto p2 = toUTFz!(const(char)*)("hello world"); +-auto p3 = toUTFz!(immutable(char)*)("hello world"); +-auto p4 = toUTFz!(char*)("hello world"d); +-auto p5 = toUTFz!(const(wchar)*)("hello world"); +-auto p6 = toUTFz!(immutable(dchar)*)("hello world"w); +--------------------- + +/ + template toUTFz(P) + { +@@ -2130,71 +2256,81 @@ template toUTFz(P) + } + } + +-/++ Ditto +/ +-template toUTFz(P, S) ++/// ++unittest + { +- P toUTFz(S str) @system +- { +- return toUTFzImpl!(P, S)(str); +- } ++ auto p1 = toUTFz!(char*)("hello world"); ++ auto p2 = toUTFz!(const(char)*)("hello world"); ++ auto p3 = toUTFz!(immutable(char)*)("hello world"); ++ auto p4 = toUTFz!(char*)("hello world"d); ++ auto p5 = toUTFz!(const(wchar)*)("hello world"); ++ auto p6 = toUTFz!(immutable(dchar)*)("hello world"w); + } + + private P toUTFzImpl(P, S)(S str) @system +- if(isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && +- is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S)) && +- is(immutable(Unqual!(ElementEncodingType!S)) == ElementEncodingType!S)) ++ if (isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && ++ is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S)) && ++ is(immutable(Unqual!(ElementEncodingType!S)) == ElementEncodingType!S)) + //immutable(C)[] -> C*, const(C)*, or immutable(C)* + { +- if(str.empty) ++ if (str.empty) + { + typeof(*P.init)[] retval = ['\0']; + + return retval.ptr; + } + +- alias Unqual!(ElementEncodingType!S) C; ++ alias C = Unqual!(ElementEncodingType!S); + + //If the P is mutable, then we have to make a copy. +- static if(is(Unqual!(typeof(*P.init)) == typeof(*P.init))) ++ static if (is(Unqual!(typeof(*P.init)) == typeof(*P.init))) ++ { + return toUTFzImpl!(P, const(C)[])(cast(const(C)[])str); ++ } + else + { +- immutable p = str.ptr + str.length; ++ if (!__ctfe) ++ { ++ immutable p = str.ptr + str.length; + +- // Peek past end of str, if it's 0, no conversion necessary. +- // Note that the compiler will put a 0 past the end of static +- // strings, and the storage allocator will put a 0 past the end +- // of newly allocated char[]'s. +- // Is p dereferenceable? A simple test: if the p points to an +- // address multiple of 4, then conservatively assume the pointer +- // might be pointing to a new block of memory, which might be +- // unreadable. Otherwise, it's definitely pointing to valid +- // memory. +- if((cast(size_t)p & 3) && *p == '\0') +- return str.ptr; ++ // Peek past end of str, if it's 0, no conversion necessary. ++ // Note that the compiler will put a 0 past the end of static ++ // strings, and the storage allocator will put a 0 past the end ++ // of newly allocated char[]'s. ++ // Is p dereferenceable? A simple test: if the p points to an ++ // address multiple of 4, then conservatively assume the pointer ++ // might be pointing to a new block of memory, which might be ++ // unreadable. Otherwise, it's definitely pointing to valid ++ // memory. ++ if ((cast(size_t)p & 3) && *p == '\0') ++ return str.ptr; ++ } + + return toUTFzImpl!(P, const(C)[])(cast(const(C)[])str); + } + } + + private P toUTFzImpl(P, S)(S str) @system +- if(isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && +- is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S)) && +- !is(immutable(Unqual!(ElementEncodingType!S)) == ElementEncodingType!S)) ++ if (isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && ++ is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S)) && ++ !is(immutable(Unqual!(ElementEncodingType!S)) == ElementEncodingType!S)) + //C[] or const(C)[] -> C*, const(C)*, or immutable(C)* + { +- alias ElementEncodingType!S InChar; +- alias typeof(*P.init) OutChar; ++ alias InChar = ElementEncodingType!S; ++ alias OutChar = typeof(*P.init); + + //const(C)[] -> const(C)* or + //C[] -> C* or const(C)* +- static if((is(const(Unqual!InChar) == InChar) && is(const(Unqual!OutChar) == OutChar)) || +- (!is(const(Unqual!InChar) == InChar) && !is(immutable(Unqual!OutChar) == OutChar))) ++ static if (( is(const(Unqual!InChar) == InChar) && is(const(Unqual!OutChar) == OutChar)) || ++ (!is(const(Unqual!InChar) == InChar) && !is(immutable(Unqual!OutChar) == OutChar))) + { +- auto p = str.ptr + str.length; ++ if (!__ctfe) ++ { ++ auto p = str.ptr + str.length; + +- if((cast(size_t)p & 3) && *p == '\0') +- return str.ptr; ++ if ((cast(size_t)p & 3) && *p == '\0') ++ return str.ptr; ++ } + + str ~= '\0'; + return str.ptr; +@@ -2212,42 +2348,28 @@ private P toUTFzImpl(P, S)(S str) @syste + } + + private P toUTFzImpl(P, S)(S str) +- if(isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && +- !is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S))) ++ if (isSomeString!S && isPointer!P && isSomeChar!(typeof(*P.init)) && ++ !is(Unqual!(typeof(*P.init)) == Unqual!(ElementEncodingType!S))) + //C1[], const(C1)[], or immutable(C1)[] -> C2*, const(C2)*, or immutable(C2)* + { + auto retval = appender!(typeof(*P.init)[])(); + +- foreach(dchar c; str) ++ foreach (dchar c; str) + retval.put(c); + retval.put('\0'); + + return cast(P)retval.data.ptr; + } + +-//Verify Examples. +-unittest +-{ +- auto p1 = toUTFz!(char*)("hello world"); +- auto p2 = toUTFz!(const(char)*)("hello world"); +- auto p3 = toUTFz!(immutable(char)*)("hello world"); +- auto p4 = toUTFz!(char*)("hello world"d); +- auto p5 = toUTFz!(const(wchar)*)("hello world"); +- auto p6 = toUTFz!(immutable(dchar)*)("hello world"w); +-} +- + unittest + { +- import core.exception; + import std.algorithm; +- import std.metastrings; +- import std.typetuple; + +- size_t zeroLen(C)(const(C)* ptr) ++ static size_t zeroLen(C)(const(C)* ptr) + { + size_t len = 0; + +- while(*ptr != '\0') ++ while (*ptr != '\0') + { + ++ptr; + ++len; +@@ -2256,9 +2378,11 @@ unittest + return len; + } + +- foreach(S; TypeTuple!(string, wstring, dstring)) ++ assertCTFEable!( + { +- alias Unqual!(ElementEncodingType!S) C; ++ foreach (S; TypeTuple!(string, wstring, dstring)) ++ { ++ alias C = Unqual!(ElementEncodingType!S); + + auto s1 = to!S("hello\U00010143\u0100\U00010143"); + auto temp = new C[](s1.length + 1); +@@ -2268,7 +2392,7 @@ unittest + auto s2 = assumeUnique(temp); + assert(s1 == s2); + +- foreach(P; TypeTuple!(C*, const(C)*, immutable(C)*)) ++ foreach (P; TypeTuple!(C*, const(C)*, immutable(C)*)) + { + auto p1 = toUTFz!P(s1); + assert(p1[0 .. s1.length] == s1); +@@ -2279,46 +2403,48 @@ unittest + assert(p2[s2.length] == '\0'); + } + } ++ }); + +- void test(P, S)(S s, size_t line = __LINE__) ++ static void test(P, S)(S s, size_t line = __LINE__) + { + auto p = toUTFz!P(s); + immutable len = zeroLen(p); + enforce(cmp(s, p[0 .. len]) == 0, +- new AssertError(Format!("Unit test failed: %s %s", P.stringof, S.stringof), ++ new AssertError(format("Unit test failed: %s %s", P.stringof, S.stringof), + __FILE__, line)); + } + +- foreach(P; TypeTuple!(wchar*, const(wchar)*, immutable(wchar)*, +- dchar*, const(dchar)*, immutable(dchar)*)) ++ assertCTFEable!( ++ { ++ foreach (P; TypeTuple!(wchar*, const(wchar)*, immutable(wchar)*, ++ dchar*, const(dchar)*, immutable(dchar)*)) + { + test!P("hello\U00010143\u0100\U00010143"); + } +- +- foreach(P; TypeTuple!(char*, const(char)*, immutable(char)*, +- dchar*, const(dchar)*, immutable(dchar)*)) ++ foreach (P; TypeTuple!( char*, const( char)*, immutable( char)*, ++ dchar*, const(dchar)*, immutable(dchar)*)) + { + test!P("hello\U00010143\u0100\U00010143"w); + } +- +- foreach(P; TypeTuple!(char*, const(char)*, immutable(char)*, +- wchar*, const(wchar)*, immutable(wchar)*)) ++ foreach (P; TypeTuple!( char*, const( char)*, immutable( char)*, ++ wchar*, const(wchar)*, immutable(wchar)*)) + { + test!P("hello\U00010143\u0100\U00010143"d); + } +- +- foreach(S; TypeTuple!(char[], wchar[], dchar[], +- const(char)[], const(wchar)[], const(dchar)[])) ++ foreach (S; TypeTuple!( char[], const( char)[], ++ wchar[], const(wchar)[], ++ dchar[], const(dchar)[])) + { + auto s = to!S("hello\U00010143\u0100\U00010143"); + +- foreach(P; TypeTuple!(char*, wchar*, dchar*, +- const(char)*, const(wchar)*, const(dchar)*, +- immutable(char)*, immutable(wchar)*, immutable(dchar)*)) ++ foreach (P; TypeTuple!( char*, const( char)*, immutable( char)*, ++ wchar*, const(wchar)*, immutable(wchar)*, ++ dchar*, const(dchar)*, immutable(dchar)*)) + { + test!P(s); + } + } ++ }); + } + + +@@ -2330,18 +2456,16 @@ unittest + that take an $(D LPWSTR) or $(D LPCWSTR) argument. + +/ + const(wchar)* toUTF16z(C)(const(C)[] str) +- if(isSomeChar!C) ++ if (isSomeChar!C) + { + return toUTFz!(const(wchar)*)(str); + } + + unittest + { +- import std.typetuple; +- + //toUTFz is already thoroughly tested, so this will just verify that + //toUTF16z compiles properly for the various string types. +- foreach(S; TypeTuple!(string, wstring, dstring)) ++ foreach (S; TypeTuple!(string, wstring, dstring)) + static assert(__traits(compiles, toUTF16z(to!S("hello world")))); + } + +@@ -2352,60 +2476,29 @@ unittest + { + debug(utf) printf("utf.toUTF.unittest\n"); + +- string c; +- wstring w; +- dstring d; +- +- c = "hello"; +- w = toUTF16(c); +- assert(w == "hello"); +- d = toUTF32(c); +- assert(d == "hello"); +- c = toUTF8(w); +- assert(c == "hello"); +- d = toUTF32(w); +- assert(d == "hello"); +- +- c = toUTF8(d); +- assert(c == "hello"); +- w = toUTF16(d); +- assert(w == "hello"); +- +- +- c = "hel\u1234o"; +- w = toUTF16(c); +- assert(w == "hel\u1234o"); +- d = toUTF32(c); +- assert(d == "hel\u1234o"); +- +- c = toUTF8(w); +- assert(c == "hel\u1234o"); +- d = toUTF32(w); +- assert(d == "hel\u1234o"); +- +- c = toUTF8(d); +- assert(c == "hel\u1234o"); +- w = toUTF16(d); +- assert(w == "hel\u1234o"); +- +- +- c = "he\U0010AAAAllo"; +- w = toUTF16(c); +- //foreach (wchar c; w) printf("c = x%x\n", c); +- //foreach (wchar c; cast(wstring)"he\U0010AAAAllo") printf("c = x%x\n", c); +- assert(w == "he\U0010AAAAllo"); +- d = toUTF32(c); +- assert(d == "he\U0010AAAAllo"); +- +- c = toUTF8(w); +- assert(c == "he\U0010AAAAllo"); +- d = toUTF32(w); +- assert(d == "he\U0010AAAAllo"); +- +- c = toUTF8(d); +- assert(c == "he\U0010AAAAllo"); +- w = toUTF16(d); +- assert(w == "he\U0010AAAAllo"); ++ assertCTFEable!( ++ { ++ assert(toUTF16("hello"c) == "hello"); ++ assert(toUTF32("hello"c) == "hello"); ++ assert(toUTF8 ("hello"w) == "hello"); ++ assert(toUTF32("hello"w) == "hello"); ++ assert(toUTF8 ("hello"d) == "hello"); ++ assert(toUTF16("hello"d) == "hello"); ++ ++ assert(toUTF16("hel\u1234o"c) == "hel\u1234o"); ++ assert(toUTF32("hel\u1234o"c) == "hel\u1234o"); ++ assert(toUTF8 ("hel\u1234o"w) == "hel\u1234o"); ++ assert(toUTF32("hel\u1234o"w) == "hel\u1234o"); ++ assert(toUTF8 ("hel\u1234o"d) == "hel\u1234o"); ++ assert(toUTF16("hel\u1234o"d) == "hel\u1234o"); ++ ++ assert(toUTF16("he\U0010AAAAllo"c) == "he\U0010AAAAllo"); ++ assert(toUTF32("he\U0010AAAAllo"c) == "he\U0010AAAAllo"); ++ assert(toUTF8 ("he\U0010AAAAllo"w) == "he\U0010AAAAllo"); ++ assert(toUTF32("he\U0010AAAAllo"w) == "he\U0010AAAAllo"); ++ assert(toUTF8 ("he\U0010AAAAllo"d) == "he\U0010AAAAllo"); ++ assert(toUTF16("he\U0010AAAAllo"d) == "he\U0010AAAAllo"); ++ }); + } + + +@@ -2420,17 +2513,20 @@ unittest + $(D UTFException) if $(D str) is not well-formed. + +/ + size_t count(C)(const(C)[] str) @trusted pure +- if(isSomeChar!C) ++ if (isSomeChar!C) + { + return walkLength(str); + } + + unittest + { ++ assertCTFEable!( ++ { + assert(count("") == 0); + assert(count("a") == 1); + assert(count("abc") == 3); + assert(count("\u20AC100") == 4); ++ }); + } + + +@@ -2459,6 +2555,7 @@ version(unittest) + @property C back() { return _str[$ - 1]; } + void popBack() { _str = _str[0 .. $ - 1]; } + @property auto save() { return BidirCU(_str); } ++ @property size_t length() { return _str.length; } + + this(inout(C)[] str) + { +@@ -2482,6 +2579,44 @@ version(unittest) + + this(inout(C)[] str) + { ++ _str = to!(C[])(str); ++ } ++ ++ C[] _str; ++ } ++ ++ class RefBidirCU(C) ++ { ++ @property bool empty() { return _str.empty; } ++ @property C front() { return _str[0]; } ++ void popFront() { _str = _str[1 .. $]; } ++ @property C back() { return _str[$ - 1]; } ++ void popBack() { _str = _str[0 .. $ - 1]; } ++ @property auto save() { return new RefBidirCU(_str); } ++ @property size_t length() { return _str.length; } ++ ++ this(inout(C)[] str) ++ { ++ _str = to!(C[])(str); ++ } ++ ++ C[] _str; ++ } ++ ++ class RefRandomCU(C) ++ { ++ @property bool empty() { return _str.empty; } ++ @property C front() { return _str[0]; } ++ void popFront() { _str = _str[1 .. $]; } ++ @property C back() { return _str[$ - 1]; } ++ void popBack() { _str = _str[0 .. $ - 1]; } ++ @property auto save() { return new RefRandomCU(_str); } ++ @property size_t length() { return _str.length; } ++ C opIndex(size_t i) { return _str[i]; } ++ auto opSlice(size_t i, size_t j) { return new RefRandomCU(_str[i .. j]); } ++ ++ this(inout(C)[] str) ++ { + _str = to!(C[])(str); + } + +--- a/src/libphobos/src/std/uuid.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/uuid.d 2014-04-01 16:32:51.000000000 +0100 +@@ -493,7 +493,7 @@ public struct UUID + + enum ctfeEmpty = UUID.init.empty; + assert(ctfeEmpty); +- ++ + bool ctfeTest() + { + for(size_t i = 0; i < 16; i++) +@@ -1396,7 +1396,7 @@ unittest + id = parseHelper!S("///8ab3060e2cba4f23b74cb52db3bdfb46||"); + enum ctfeId = parseHelper!S("8ab3060e-2cba-4f23-b74c-b52db3bdfb46"); + assert(parseHelper!S("8AB3060E-2cba-4f23-b74c-b52db3bdfb46") == ctfeId); +- ++ + //Test valid, working cases + assert(parseHelper!S("00000000-0000-0000-0000-000000000000").empty); + assert(parseHelper!S("8AB3060E-2CBA-4F23-b74c-B52Db3BDFB46").data +--- a/src/libphobos/src/std/variant.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/variant.d 2014-04-01 16:32:51.000000000 +0100 +@@ -29,7 +29,7 @@ + * a = 3.14; + * assert(a.type == typeid(double)); + * // Implicit conversions work just as with built-in types +- * assert(a > b); ++ * assert(a < b); + * // Check for convertibility + * assert(!a.convertsTo!(int)); // double not convertible to int + * // Strings and all other arrays are supported +@@ -211,7 +211,7 @@ private: + // no need to copy the data (it's garbage) + break; + case OpID.compare: +- auto rhs = cast(VariantN *) parm; ++ auto rhs = cast(const VariantN *) parm; + return rhs.peek!(A) + ? 0 // all uninitialized are equal + : ptrdiff_t.min; // uninitialized variant is not comparable otherwise +@@ -299,6 +299,12 @@ private: + case OpID.copyOut: + auto target = cast(VariantN *) parm; + assert(target); ++ ++ static if (target.size < A.sizeof) ++ { ++ if (target.type.tsize < A.sizeof) ++ *cast(A**)&target.store = new A; ++ } + tryPutting(zis, typeid(A), cast(void*) getPtr(&target.store)) + || assert(false); + target.fptr = &handler!(A); +@@ -595,7 +601,7 @@ public: + * assert(a == 6); + * ---- + */ +- @property T * peek(T)() ++ @property inout T * peek(T)() inout + { + static if (!is(T == void)) + static assert(allowed!(T), "Cannot store a " ~ T.stringof +@@ -752,7 +758,7 @@ public: + unittest + { + Variant a = "10"; +- assert(a.coerce!int == 10); ++ assert(a.coerce!int == 10); + } + + /** +@@ -771,13 +777,20 @@ public: + */ + + // returns 1 if the two are equal +- bool opEquals(T)(T rhs) ++ bool opEquals(T)(auto ref T rhs) const + { +- static if (is(T == VariantN)) ++ static if (is(Unqual!T == VariantN)) + alias rhs temp; + else + auto temp = VariantN(rhs); +- return fptr(OpID.compare, &store, &temp) == 0; ++ return !fptr(OpID.compare, cast(ubyte[size]*) &store, ++ cast(void*) &temp); ++ } ++ ++ // workaround for bug 10567 fix ++ int opCmp(ref const VariantN rhs) const ++ { ++ return (cast()this).opCmp!(VariantN)(cast()rhs); + } + + /** +@@ -898,7 +911,7 @@ public: + // Commenteed all _r versions for now because of ambiguities + // arising when two Variants are used + +- /////ditto ++ // ///ditto + // VariantN opSub_r(T)(T lhs) + // { + // return VariantN(lhs).opArithmetic!(VariantN, "-")(this); +@@ -1096,7 +1109,7 @@ unittest + int a; + long b; + string c; +- real d; ++ real d = 0.0; + bool e; + } + +@@ -1353,9 +1366,9 @@ unittest + assert( v.get!(string) == "Hello, World!" ); + + // Literal arrays are dynamically-typed +- v = cast(int[5]) [1,2,3,4,5]; +- assert( v.peek!(int[5]) ); +- assert( v.get!(int[5]) == [1,2,3,4,5] ); ++ v = cast(int[4]) [1,2,3,4]; ++ assert( v.peek!(int[4]) ); ++ assert( v.get!(int[4]) == [1,2,3,4] ); + + { + // @@@BUG@@@: array literals should have type T[], not T[5] (I guess) +@@ -1871,3 +1884,26 @@ private auto visitImpl(bool Strict, Vari + assert(false); + } + ++unittest ++{ ++ // http://d.puremagic.com/issues/show_bug.cgi?id=5310 ++ const Variant a; ++ assert(a == a); ++ Variant b; ++ assert(a == b); ++ assert(b == a); ++} ++ ++unittest ++{ ++ // http://d.puremagic.com/issues/show_bug.cgi?id=10017 ++ static struct S ++ { ++ ubyte[Variant.size + 1] s; ++ } ++ ++ Variant v1, v2; ++ v1 = S(); // the payload is allocated on the heap ++ v2 = v1; // AssertError: target must be non-null ++ assert(v1 == v2); ++} +--- a/src/libphobos/src/std/windows/charset.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/windows/charset.d 2014-04-01 16:32:51.000000000 +0100 +@@ -16,6 +16,7 @@ + * http://www.boost.org/LICENSE_1_0.txt) + */ + module std.windows.charset; ++version (Windows): + + private import std.conv; + private import std.c.windows.windows; +--- a/src/libphobos/src/std/windows/iunknown.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/windows/iunknown.d 2014-04-01 16:32:51.000000000 +0100 +@@ -1,6 +1,7 @@ + // Written in the D programming language. + + module std.windows.iunknown; ++version (Windows): + + // Replaced by: + public import std.c.windows.com; +--- a/src/libphobos/src/std/windows/registry.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/windows/registry.d 2014-04-01 16:32:51.000000000 +0100 +@@ -36,6 +36,7 @@ + * + * ////////////////////////////////////////////////////////////////////////// */ + module std.windows.registry; ++version (Windows): + + import std.array; + import std.system : Endian, endian; +@@ -68,11 +69,13 @@ class Win32Exception : Exception + { + int error; + ++ @safe pure nothrow + this(string message, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null) + { + super(message, fn, ln, next); + } + ++ @safe pure + this(string message, int errnum, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null) + { + super(text(message, " (", errnum, ")"), fn, ln, next); +@@ -116,6 +119,7 @@ public: + Params: + message = The message associated with the exception. + */ ++ @safe pure + this(string message, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null) + { + super(message, fn, ln, next); +@@ -128,6 +132,7 @@ public: + message = The message associated with the exception. + error = The Win32 error number associated with the exception. + */ ++ @safe pure + this(string message, int error, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null) + { + super(message, error, fn, ln, next); +@@ -520,6 +525,8 @@ in + } + body + { ++ import core.bitop : bswap; ++ + REG_VALUE_TYPE type; + + // See bugzilla 961 on this +@@ -631,6 +638,8 @@ in + } + body + { ++ import core.bitop : bswap; ++ + REG_VALUE_TYPE type; + + DWORD cbData = value.sizeof; +@@ -782,12 +791,14 @@ private void regProcessNthValue(HKEY hke + */ + class Key + { ++ @safe pure nothrow + invariant() + { + assert(m_hkey !is null); + } + + private: ++ @safe pure nothrow + this(HKEY hkey, string name, bool created) + in + { +@@ -1147,12 +1158,14 @@ private: + */ + class Value + { ++ @safe pure nothrow + invariant() + { + assert(m_key !is null); + } + + private: ++ @safe pure nothrow + this(Key key, string name, REG_VALUE_TYPE type) + in + { +@@ -1363,12 +1376,14 @@ foreach (string subkeyName; key.keyNames + */ + class KeyNameSequence + { ++ @safe pure nothrow + invariant() + { + assert(m_key !is null); + } + + private: ++ @safe pure nothrow + this(Key key) + { + m_key = key; +@@ -1458,12 +1473,14 @@ foreach (Key subkey; key.keys) + */ + class KeySequence + { ++ @safe pure nothrow + invariant() + { + assert(m_key !is null); + } + + private: ++ @safe pure nothrow + this(Key key) + { + m_key = key; +@@ -1565,12 +1582,14 @@ foreach (string valueName; key.valueName + */ + class ValueNameSequence + { ++ @safe pure nothrow + invariant() + { + assert(m_key !is null); + } + + private: ++ @safe pure nothrow + this(Key key) + { + m_key = key; +@@ -1659,12 +1678,14 @@ foreach (Value value; key.values) + */ + class ValueSequence + { ++ @safe pure nothrow + invariant() + { + assert(m_key !is null); + } + + private: ++ @safe pure nothrow + this(Key key) + { + m_key = key; +--- a/src/libphobos/src/std/windows/syserror.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/windows/syserror.d 2014-04-01 16:32:51.000000000 +0100 +@@ -14,11 +14,12 @@ + * http://www.boost.org/LICENSE_1_0.txt) + */ + module std.windows.syserror; ++version (Windows): + + private import std.windows.charset; + private import std.c.windows.windows; + +-string sysErrorString(uint errcode) ++string sysErrorString(uint errcode) @trusted + { + char[] result; + char* buffer; +@@ -46,8 +47,9 @@ string sysErrorString(uint errcode) + result[0 .. r] = buffer[0 .. r]; + result[r] = 0; + ++ LocalFree(cast(HLOCAL)buffer); ++ + auto res = std.windows.charset.fromMBSz(cast(immutable)result.ptr); + +- LocalFree(cast(HLOCAL)buffer); + return res; + } +--- a/src/libphobos/src/std/xml.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/xml.d 2014-04-01 16:32:51.000000000 +0100 +@@ -441,6 +441,8 @@ enum DecodeMode + */ + string decode(string s, DecodeMode mode=DecodeMode.LOOSE) + { ++ import std.utf : encode; ++ + if (mode == DecodeMode.NONE) return s; + + char[] buffer; +@@ -691,7 +693,7 @@ class Element : Item + * Constructs an Element from a Tag. + * + * Params: +- * tag = the start or empty tag of the element. ++ * tag_ = the start or empty tag of the element. + */ + this(const(Tag) tag_) + { +@@ -967,7 +969,7 @@ class Element : Item + * $(DDOC_ENUM_MEMBERS EMPTY) Used for empty tags + * + */ +-enum TagType { START, END, EMPTY }; ++enum TagType { START, END, EMPTY } + + /** + * Class representing an XML tag. +@@ -1115,9 +1117,10 @@ class Tag + override int opCmp(Object o) + { + const tag = toType!(const Tag)(o); ++ // Note that attr is an AA, so the comparison is nonsensical (bug 10381) + return + ((name != tag.name) ? ( name < tag.name ? -1 : 1 ) : +- ((attr != tag.attr) ? ( attr < tag.attr ? -1 : 1 ) : ++ ((attr != tag.attr) ? ( cast(void *)attr < cast(void*)tag.attr ? -1 : 1 ) : + ((type != tag.type) ? ( type < tag.type ? -1 : 1 ) : + 0 ))); + } +@@ -1154,7 +1157,7 @@ class Tag + { + string s = "<" ~ name; + foreach(key,val;attr) +- s ~= format(" %s=\"%s\"",key,decode(val,DecodeMode.LOOSE)); ++ s ~= format(" %s=\"%s\"",key,encode(val)); + return s; + } + +@@ -1653,7 +1656,7 @@ class DocumentParser : ElementParser + * This is enforced by the function's in contract. + * + * Params: +- * xmltext = the entire XML document as text ++ * xmlText_ = the entire XML document as text + * + */ + this(string xmlText_) +@@ -2729,6 +2732,13 @@ EOS"; + xml.parse(); + } + ++unittest ++{ ++ string s = ``; ++ auto doc = new Document(s); ++ assert(doc.toString() == s); ++} ++ + /** The base class for exceptions thrown by this module */ + class XMLException : Exception { this(string msg) { super(msg); } } + +--- a/src/libphobos/src/std/zip.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/zip.d 2014-04-01 16:32:51.000000000 +0100 +@@ -37,6 +37,7 @@ import std.datetime; + import core.bitop; + import std.conv; + import std.algorithm; ++import std.bitmanip : littleEndianToNative, nativeToLittleEndian; + + //debug=print; + +@@ -473,50 +474,24 @@ class ZipArchive + + ushort getUshort(int i) + { +- version (LittleEndian) +- { +- return *cast(ushort *)&data[i]; +- } +- else +- { +- ubyte b0 = data[i]; +- ubyte b1 = data[i + 1]; +- return (b1 << 8) | b0; +- } ++ ubyte[2] result = data[i .. i + 2]; ++ return littleEndianToNative!ushort(result); + } + + uint getUint(int i) + { +- version (LittleEndian) +- { +- return *cast(uint *)&data[i]; +- } +- else +- { +- return bswap(*cast(uint *)&data[i]); +- } ++ ubyte[4] result = data[i .. i + 4]; ++ return littleEndianToNative!uint(result); + } + + void putUshort(int i, ushort us) + { +- version (LittleEndian) +- { +- *cast(ushort *)&data[i] = us; +- } +- else +- { +- data[i] = cast(ubyte)us; +- data[i + 1] = cast(ubyte)(us >> 8); +- } ++ data[i .. i + 2] = nativeToLittleEndian(us); + } + + void putUint(int i, uint ui) + { +- version (BigEndian) +- { +- ui = bswap(ui); +- } +- *cast(uint *)&data[i] = ui; ++ data[i .. i + 4] = nativeToLittleEndian(ui); + } + } + +--- a/src/libphobos/src/std/zlib.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std/zlib.d 2014-04-01 16:32:51.000000000 +0100 +@@ -143,9 +143,12 @@ const(void)[] compress(const(void)[] buf + + /********************************************* + * Decompresses the data in srcbuf[]. +- * Params: destlen = size of the uncompressed data. +- * It need not be accurate, but the decompression will be faster if the exact +- * size is supplied. ++ * Params: ++ * srcbuf = buffer containing the compressed data. ++ * destlen = size of the uncompressed data. ++ * It need not be accurate, but the decompression will be faster ++ * if the exact size is supplied. ++ * winbits = the base two logarithm of the maximum window size. + * Returns: the decompressed data. + */ + +--- a/src/libphobos/src/std.ddoc 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/std.ddoc 1970-01-01 01:00:00.000000000 +0100 +@@ -1,298 +0,0 @@ +-BR =
+-DDOC_DITTO = $(BR)$0 +-DDOC_SUMMARY = $0$(P) +-DDOC_DESCRIPTION = $0$(P) +-DDOC_AUTHORS = $(B Authors:)$(BR)$0$(P) +-DDOC_BUGS = $(RED BUGS:)$(BR)$0$(P) +-DDOC_COPYRIGHT = $(B Copyright:)$(BR)$0$(P) +-DDOC_DATE = $(B Date:)$(BR)$0$(P) +-DDOC_DEPRECATED = $(RED Deprecated:)$(BR)$0$(P) +-DDOC_EXAMPLES = $(B Examples:)$(BR)$0$(P) +-DDOC_HISTORY = $(B History:)$(BR)$0$(P) +-DDOC_LICENSE = $(B License:)$(BR)$0$(P) +-DDOC_RETURNS = $(B Returns:)$(BR)$0$(P) +-DDOC_SEE_ALSO = $(B See Also:)$(BR)$0$(P) +-DDOC_STANDARDS = $(B Standards:)$(BR)$0$(P) +-DDOC_THROWS = $(B Throws:)$(BR)$0$(P) +-DDOC_VERSION = $(B Version:)$(BR)$0$(P) +-DDOC_SECTION_H = $(B $0)$(BR) +-DDOC_SECTION = $0$(P) +-DDOC_PARAMS = $(B Parameters:)$0
$(P) +-DDOC_BLANKLINE = $(P) +- +-DDOC = +- +- +- +- +- +- +-$(TITLE) - D Programming Language - Digital Mars +- +- +- +- +- +- +- +-
+- www.digitalmars.com +-

D Programming Language 2.0

+- +- +-
+- $(UL +- $(LI Comments) +- $(LI D) +- $(LI Search) +- $(LI Home) +- ) +-
+- +-
Last update $(DATETIME)
+-
+- +- +-
+-

$(TITLE)

+-
+- $(BODY) +- $(GOOGLE_FOOTER) +-
+- +- +- +- +- +- +- +-GOOGLE_FOOTER= +-

+-

+- +- +- +- +-TOP= +- +- +-NAVIGATION_PHOBOS= +- +- +-RED = $0 +-GREEN = $0 +-BLUE = $0 +-YELLOW = $0 +-BLACK = $0 +-WHITE = $0 +- +-D_COMMENT = $0 +-D_STRING = $0 +-D_KEYWORD = $0 +-D_PSYMBOL = $0 +-D_PARAM = $0 +-RPAREN = ) +-LPAREN = ( +-LESS = < +-GREATER = > +-WEB = $(LINK2 http://$1,$2) +-LUCKY = $(WEB +-google.com/search?btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8&q=$0,$0) +-D = $0 +-D = $0 +-BIGOH = Ο($(D $0)) +-GLOSSARY = $(LINK2 ../glossary.html#$0, $0) +- +-DDOC_PSYMBOL = $(U $0) +-DDOC_DECL = $(DT
$0
) +-XREF = $(D std.$1.$2) +-CXREF = $(D core.$1.$2) +-LREF = $(D $1) +-BUGZILLA = $(LINK2 http://d.puremagic.com/issues/show_bug.cgi?id=$0, Bugzilla $0) +-PRE =
$0
+-PHOBOSSRC=$(LINK2 https://github.com/D-Programming-Language/phobos/blob/master/$0, $0) +-DRUNTIMESRC=$(LINK2 https://github.com/D-Programming-Language/druntime/blob/master/src/$0, $0) +-SAMPLESRC=$(LINK2 https://github.com/D-Programming-Language/dmd/blob/master/samples/$0, /dmd/samples/d/$0) +- +-BOOKTABLE = $2
$1
+-TABLE = $2
$1
+-TD = $0 +-TDNW = $0 +-SUB = $0 +- +-COPYRIGHT= Copyright © 1999-$(YEAR) by Digital Mars, All Rights Reserved +- +--- a/src/libphobos/src/unittest.d 2013-06-01 16:19:09.000000000 +0100 ++++ b/src/libphobos/src/unittest.d 2014-04-01 16:32:51.000000000 +0100 +@@ -13,13 +13,14 @@ + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ ++version(Win64) {} ++else ++{ + public import std.base64; + public import std.compiler; + public import std.concurrency; + public import std.conv; +-public import std.cpuid; + public import std.cstream; +-public import std.ctype; + public import std.datetime; + public import std.demangle; + public import std.file; +@@ -33,10 +34,9 @@ public import std.mmfile; + public import std.outbuffer; + public import std.parallelism; + public import std.path; +-public import std.perf; + public import std.process; + public import std.random; +-public import std.regexp; ++public import std.regex; + public import std.signals; + //public import std.slist; + public import std.socket; +@@ -52,35 +52,44 @@ public import std.typetuple; + public import std.uni; + public import std.uri; + public import std.utf; ++public import std.uuid; + public import std.variant; + public import std.zip; + public import std.zlib; ++public import std.net.isemail; ++//public import std.net.curl; ++public import std.digest.digest; ++public import std.digest.crc; ++public import std.digest.sha; ++public import std.digest.md; ++ ++} + + int main(char[][] args) + { + +-version (all) ++version(Win64) {} ++else + { + // Bring in unit test for module by referencing function in it + + cmp("foo", "bar"); // string +- fncharmatch('a', 'b'); // path ++ filenameCharCmp('a', 'b'); // path + isNaN(1.0); // math + std.conv.to!double("1.0"); // std.conv + OutBuffer b = new OutBuffer(); // outbuffer +- std.ctype.tolower('A'); // ctype +- RegExp r = new RegExp(null, null); // regexp +- uint ranseed = std.random.unpredictableSeed(); +- thisTid(); ++ auto r = regex(""); // regex ++ uint ranseed = std.random.unpredictableSeed; ++ thisTid; + int a[]; + a.reverse; // adi + a.sort; // qsort + Clock.currTime(); // datetime + Exception e = new ReadException(""); // stream + din.eof(); // cstream +- isValidDchar(cast(dchar)0); // utf +- std.uri.ascii2hex(0); // uri +- std.zlib.adler32(0,null); // D.zlib ++ isValidDchar(cast(dchar)0); // utf ++ std.uri.ascii2hex(0); // uri ++ std.zlib.adler32(0,null); // D.zlib + auto t = task!cmp("foo", "bar"); // parallelism + + ubyte[16] buf; +@@ -109,7 +118,7 @@ version (all) + + std.demangle.demangle("hello"); + +- std.uni.isUniAlpha('A'); ++ std.uni.isAlpha('A'); + + std.file.exists("foo"); + +@@ -118,8 +127,15 @@ version (all) + + std.signals.linkin(); + +- writefln(std.cpuid.toString()); ++ bool isEmail = std.net.isemail.isEmail("abc"); ++ //auto http = std.net.curl.HTTP("dlang.org"); ++ auto uuid = randomUUID(); ++ ++ auto md5 = md5Of("hello"); ++ auto sha1 = sha1Of("hello"); ++ auto crc = crc32Of("hello"); ++ auto string = toHexString(crc); ++ puts("Success!"); + } +- printf("Success!\n"); + return 0; + } --- gcc-4.8-4.8.2.orig/debian/patches/gdc-versym-cpu.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-versym-cpu.diff @@ -0,0 +1,382 @@ +# DP: Implements D CPU version conditions. + +This implements the following versions: +* D_HardFloat +* D_SoftFloat + +for all supported architectures. And these where appropriate: +* ARM +** ARM_Thumb +** ARM_HardFloat +** ARM_SoftFloat +** ARM_SoftFP +* AArch64 +* Alpha +** Alpha_SoftFloat +** Alpha_HardFloat +* X86 +* X86_64 +** D_X32 +* IA64 +* MIPS32 +* MIPS64 +** MIPS_O32 +** MIPS_O64 +** MIPS_N32 +** MIPS_N64 +** MIPS_EABI +** MIPS_HardFloat +** MIPS_SoftFloat +* HPPA +* HPPA64 +* PPC +* PPC64 +** PPC_HardFloat +** PPC_SoftFloat +* S390 +* S390X +* SH +* SH64 +* SPARC +* SPARC64 +* SPARC_V8Plus +** SPARC_HardFloat +** SPARC_SoftFloat + +Index: b/src/gcc/config/aarch64/aarch64.h +=================================================================== +--- a/src/gcc/config/aarch64/aarch64.h ++++ b/src/gcc/config/aarch64/aarch64.h +@@ -51,6 +51,14 @@ + \ + } while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("AArch64"); \ ++ builtin_define ("D_HardFloat"); \ ++ } while (0) ++ + + + /* Target machine storage layout. */ +Index: b/src/gcc/config/alpha/alpha.h +=================================================================== +--- a/src/gcc/config/alpha/alpha.h ++++ b/src/gcc/config/alpha/alpha.h +@@ -72,6 +72,23 @@ + SUBTARGET_LANGUAGE_CPP_BUILTINS(); \ + } while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("Alpha"); \ ++ if (TARGET_SOFT_FP) \ ++ { \ ++ builtin_define ("D_SoftFloat"); \ ++ builtin_define ("Alpha_SoftFloat"); \ ++ } \ ++ else \ ++ { \ ++ builtin_define ("D_HardFloat"); \ ++ builtin_define ("Alpha_HardFloat"); \ ++ } \ ++} while (0) ++ + #ifndef SUBTARGET_LANGUAGE_CPP_BUILTINS + #define SUBTARGET_LANGUAGE_CPP_BUILTINS() \ + do \ +Index: b/src/gcc/config/arm/arm.h +=================================================================== +--- a/src/gcc/config/arm/arm.h ++++ b/src/gcc/config/arm/arm.h +@@ -158,6 +158,31 @@ + builtin_define ("__ARM_ARCH_EXT_IDIV__"); \ + } while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("ARM"); \ ++ \ ++ if (TARGET_THUMB || TARGET_THUMB2) \ ++ builtin_define ("ARM_Thumb"); \ ++ \ ++ if (TARGET_HARD_FLOAT_ABI) \ ++ builtin_define ("ARM_HardFloat"); \ ++ else \ ++ { \ ++ if(TARGET_SOFT_FLOAT) \ ++ builtin_define ("ARM_SoftFloat"); \ ++ else if(TARGET_HARD_FLOAT) \ ++ builtin_define ("ARM_SoftFP"); \ ++ } \ ++ \ ++ if(TARGET_SOFT_FLOAT) \ ++ builtin_define ("D_SoftFloat"); \ ++ else if(TARGET_HARD_FLOAT) \ ++ builtin_define ("D_HardFloat"); \ ++ } while (0) ++ + #include "config/arm/arm-opts.h" + + enum target_cpus +Index: b/src/gcc/config/i386/i386.h +=================================================================== +--- a/src/gcc/config/i386/i386.h ++++ b/src/gcc/config/i386/i386.h +@@ -588,6 +588,24 @@ + /* Target CPU builtins. */ + #define TARGET_CPU_CPP_BUILTINS() ix86_target_macros () + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do { \ ++ if (TARGET_64BIT) \ ++ { \ ++ builtin_define("X86_64"); \ ++ if (TARGET_X32) \ ++ builtin_define("D_X32"); \ ++ } \ ++ else \ ++ builtin_define("X86"); \ ++ \ ++ if (TARGET_80387) \ ++ builtin_define("D_HardFloat"); \ ++ else \ ++ builtin_define("D_SoftFloat"); \ ++ } while (0) ++ + /* Target Pragmas. */ + #define REGISTER_TARGET_PRAGMAS() ix86_register_pragmas () + +Index: b/src/gcc/config/ia64/ia64.h +=================================================================== +--- a/src/gcc/config/ia64/ia64.h ++++ b/src/gcc/config/ia64/ia64.h +@@ -40,6 +40,13 @@ + builtin_define("__BIG_ENDIAN__"); \ + } while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++do { \ ++ builtin_define ("IA64"); \ ++ builtin_define ("D_HardFloat"); \ ++} while (0) ++ + #ifndef SUBTARGET_EXTRA_SPECS + #define SUBTARGET_EXTRA_SPECS + #endif +Index: b/src/gcc/config/mips/mips.h +=================================================================== +--- a/src/gcc/config/mips/mips.h ++++ b/src/gcc/config/mips/mips.h +@@ -551,6 +551,54 @@ + } \ + while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ if (TARGET_64BIT) \ ++ builtin_define("MIPS64"); \ ++ else \ ++ builtin_define("MIPS32"); \ ++ \ ++ switch (mips_abi) \ ++ { \ ++ case ABI_32: \ ++ builtin_define("MIPS_O32"); \ ++ break; \ ++ \ ++ case ABI_O64: \ ++ builtin_define("MIPS_O64"); \ ++ break; \ ++ \ ++ case ABI_N32: \ ++ builtin_define("MIPS_N32"); \ ++ break; \ ++ \ ++ case ABI_64: \ ++ builtin_define("MIPS_N64"); \ ++ break; \ ++ \ ++ case ABI_EABI: \ ++ builtin_define("MIPS_EABI"); \ ++ break; \ ++ \ ++ default: \ ++ gcc_unreachable(); \ ++ } \ ++ \ ++ if (TARGET_HARD_FLOAT_ABI) \ ++ { \ ++ builtin_define("MIPS_HardFloat"); \ ++ builtin_define("D_HardFloat"); \ ++ } \ ++ else if (TARGET_SOFT_FLOAT_ABI) \ ++ { \ ++ builtin_define("MIPS_SoftFloat"); \ ++ builtin_define("D_SoftFloat"); \ ++ } \ ++ } \ ++ while (0) ++ + /* Default target_flags if no switches are specified */ + + #ifndef TARGET_DEFAULT +Index: b/src/gcc/config/pa/pa.h +=================================================================== +--- a/src/gcc/config/pa/pa.h ++++ b/src/gcc/config/pa/pa.h +@@ -185,6 +185,20 @@ + builtin_define("_PA_RISC1_0"); \ + } while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++do { \ ++ if(TARGET_64BIT) \ ++ builtin_define("HPPA64"); \ ++ else \ ++ builtin_define("HPPA"); \ ++ \ ++ if(TARGET_SOFT_FLOAT) \ ++ builtin_define ("D_SoftFloat"); \ ++ else \ ++ builtin_define ("D_HardFloat"); \ ++} while (0) ++ + /* An old set of OS defines for various BSD-like systems. */ + #define TARGET_OS_CPP_BUILTINS() \ + do \ +Index: b/src/gcc/config/rs6000/rs6000.h +=================================================================== +--- a/src/gcc/config/rs6000/rs6000.h ++++ b/src/gcc/config/rs6000/rs6000.h +@@ -613,6 +613,28 @@ + #define TARGET_CPU_CPP_BUILTINS() \ + rs6000_cpu_cpp_builtins (pfile) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ if (TARGET_64BIT) \ ++ builtin_define ("PPC64"); \ ++ else \ ++ builtin_define ("PPC"); \ ++ \ ++ if (TARGET_HARD_FLOAT) \ ++ { \ ++ builtin_define ("PPC_HardFloat"); \ ++ builtin_define ("D_HardFloat"); \ ++ } \ ++ else if (TARGET_SOFT_FLOAT) \ ++ { \ ++ builtin_define ("PPC_SoftFloat"); \ ++ builtin_define ("D_SoftFloat"); \ ++ } \ ++ } \ ++ while (0) ++ + /* This is used by rs6000_cpu_cpp_builtins to indicate the byte order + we're compiling for. Some configurations may need to override it. */ + #define RS6000_CPU_CPP_ENDIAN_BUILTINS() \ +Index: b/src/gcc/config/s390/s390.h +=================================================================== +--- a/src/gcc/config/s390/s390.h ++++ b/src/gcc/config/s390/s390.h +@@ -114,6 +114,22 @@ + } \ + while (0) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ if (TARGET_64BIT) \ ++ builtin_define ("S390X"); \ ++ else \ ++ builtin_define ("S390"); \ ++ \ ++ if(TARGET_SOFT_FLOAT) \ ++ builtin_define ("D_SoftFloat"); \ ++ else if(TARGET_HARD_FLOAT) \ ++ builtin_define ("D_HardFloat"); \ ++ } \ ++ while (0) ++ + #ifdef DEFAULT_TARGET_64BIT + #define TARGET_DEFAULT (MASK_64BIT | MASK_ZARCH | MASK_HARD_DFP | MASK_OPT_HTM) + #else +Index: b/src/gcc/config/sh/sh.h +=================================================================== +--- a/src/gcc/config/sh/sh.h ++++ b/src/gcc/config/sh/sh.h +@@ -31,6 +31,22 @@ + + #define TARGET_CPU_CPP_BUILTINS() sh_cpu_cpp_builtins (pfile) + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++ do \ ++ { \ ++ if (TARGET_SHMEDIA64) \ ++ builtin_define ("SH64"); \ ++ else \ ++ builtin_define ("SH"); \ ++ \ ++ if (TARGET_FPU_ANY) \ ++ builtin_define ("D_HardFloat"); \ ++ else \ ++ builtin_define ("D_SoftFloat"); \ ++ } \ ++ while (0) ++ + /* Value should be nonzero if functions must have frame pointers. + Zero means the frame pointer need not be set up (and parms may be accessed + via the stack pointer) in functions that seem suitable. */ +Index: b/src/gcc/config/sparc/sparc.h +=================================================================== +--- a/src/gcc/config/sparc/sparc.h ++++ b/src/gcc/config/sparc/sparc.h +@@ -27,6 +27,31 @@ + + #define TARGET_CPU_CPP_BUILTINS() sparc_target_macros () + ++/* Target CPU builtins for D. */ ++#define TARGET_CPU_D_BUILTINS() \ ++do \ ++ { \ ++ if (TARGET_64BIT) \ ++ builtin_define ("SPARC64"); \ ++ else \ ++ builtin_define ("SPARC"); \ ++ \ ++ if(TARGET_V8PLUS) \ ++ builtin_define ("SPARC_V8Plus"); \ ++ \ ++ if(TARGET_FPU) \ ++ { \ ++ builtin_define ("D_HardFloat"); \ ++ builtin_define ("SPARC_HardFloat"); \ ++ } \ ++ else \ ++ { \ ++ builtin_define ("D_SoftFloat"); \ ++ builtin_define ("SPARC_SoftFloat"); \ ++ } \ ++ } \ ++ while (0) ++ + /* Specify this in a cover file to provide bi-architecture (32/64) support. */ + /* #define SPARC_BI_ARCH */ + --- gcc-4.8-4.8.2.orig/debian/patches/gdc-versym-os.diff +++ gcc-4.8-4.8.2/debian/patches/gdc-versym-os.diff @@ -0,0 +1,422 @@ +# DP: Implements D OS version conditions. + +This implements the following official versions: +* Windows +** Win32 +** Win64 +** Cygwin +** MinGW +* linux +* OSX +* FreeBSD +* OpenBSD +* NetBSD +* Solaris +* Posix +* AIX +* SysV4 +* Hurd +* Android + +These gdc specific versions are also implemented: +* GNU_MinGW64 (for mingw-w64) +* GNU_OpenSolaris (for opensolaris) +* GNU_GLibc (implemented for linux & bsd & opensolaris) +* GNU_UCLibc (implemented for linux) +* GNU_Bionic (implemented for linux) + +These official OS versions are not implemented: +* DragonFlyBSD +* BSD (other BSDs) +* Haiku +* SkyOS +* SysV3 + +Index: b/src/gcc/config/alpha/linux.h +=================================================================== +--- a/src/gcc/config/alpha/linux.h ++++ b/src/gcc/config/alpha/linux.h +@@ -33,6 +33,16 @@ + builtin_define ("_GNU_SOURCE"); \ + } while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ if (OPTION_GLIBC) \ ++ builtin_define ("GNU_GLibc"); \ ++ \ ++ builtin_define ("linux"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + #undef LIB_SPEC + #define LIB_SPEC \ + "%{pthread:-lpthread} \ +Index: b/src/gcc/config/arm/linux-eabi.h +=================================================================== +--- a/src/gcc/config/arm/linux-eabi.h ++++ b/src/gcc/config/arm/linux-eabi.h +@@ -30,6 +30,15 @@ + } \ + while (false) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ TARGET_GENERIC_LINUX_OS_D_BUILTINS(); \ ++ ANDROID_TARGET_OS_D_BUILTINS(); \ ++ } \ ++ while (false) ++ + /* We default to a soft-float ABI so that binaries can run on all + target hardware. If you override this to use the hard-float ABI then + change the setting of GLIBC_DYNAMIC_LINKER_DEFAULT as well. */ +Index: b/src/gcc/config/darwin.h +=================================================================== +--- a/src/gcc/config/darwin.h ++++ b/src/gcc/config/darwin.h +@@ -921,4 +921,10 @@ + providing an osx-version-min of this unless overridden by the User. */ + #define DEF_MIN_OSX_VERSION "10.4" + ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ builtin_define ("OSX"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + #endif /* CONFIG_DARWIN_H */ +Index: b/src/gcc/config/freebsd.h +=================================================================== +--- a/src/gcc/config/freebsd.h ++++ b/src/gcc/config/freebsd.h +@@ -32,6 +32,13 @@ + #undef TARGET_OS_CPP_BUILTINS + #define TARGET_OS_CPP_BUILTINS() FBSD_TARGET_OS_CPP_BUILTINS() + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ builtin_define ("FreeBSD"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + #undef CPP_SPEC + #define CPP_SPEC FBSD_CPP_SPEC + +Index: b/src/gcc/config/gnu.h +=================================================================== +--- a/src/gcc/config/gnu.h ++++ b/src/gcc/config/gnu.h +@@ -39,3 +39,11 @@ + builtin_assert ("system=unix"); \ + builtin_assert ("system=posix"); \ + } while (0) ++ ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ \ ++ builtin_define ("Hurd"); \ ++ builtin_define ("Posix"); \ ++ } while (0) +Index: b/src/gcc/config/i386/cygwin.h +=================================================================== +--- a/src/gcc/config/i386/cygwin.h ++++ b/src/gcc/config/i386/cygwin.h +@@ -20,6 +20,13 @@ + + #define EXTRA_OS_CPP_BUILTINS() /* Nothing. */ + ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ builtin_define ("Windows"); \ ++ builtin_define ("Cygwin"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + #undef CPP_SPEC + #define CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \ + -D__CYGWIN32__ -D__CYGWIN__ %{!ansi:-Dunix} -D__unix__ -D__unix \ +Index: b/src/gcc/config/i386/linux-common.h +=================================================================== +--- a/src/gcc/config/i386/linux-common.h ++++ b/src/gcc/config/i386/linux-common.h +@@ -27,6 +27,15 @@ + } \ + while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ TARGET_GENERIC_LINUX_OS_D_BUILTINS(); \ ++ ANDROID_TARGET_OS_D_BUILTINS(); \ ++ } \ ++ while (0) ++ + #undef CC1_SPEC + #define CC1_SPEC \ + LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \ +Index: b/src/gcc/config/i386/mingw32.h +=================================================================== +--- a/src/gcc/config/i386/mingw32.h ++++ b/src/gcc/config/i386/mingw32.h +@@ -53,6 +53,18 @@ + } \ + while (0) + ++#define TARGET_OS_D_BUILTINS() TARGET_GENERIC_MINGW_OS_D_BUILTINS() ++#define TARGET_GENERIC_MINGW_OS_D_BUILTINS() \ ++ do { \ ++ builtin_define ("Windows"); \ ++ builtin_define ("MinGW"); \ ++ \ ++ if (TARGET_64BIT && ix86_abi == MS_ABI) \ ++ builtin_define ("Win64"); \ ++ else if (!TARGET_64BIT) \ ++ builtin_define ("Win32"); \ ++ } while (0) ++ + #ifndef TARGET_USE_PTHREAD_BY_DEFAULT + #define SPEC_PTHREAD1 "pthread" + #define SPEC_PTHREAD2 "!no-pthread" +Index: b/src/gcc/config/i386/mingw-w64.h +=================================================================== +--- a/src/gcc/config/i386/mingw-w64.h ++++ b/src/gcc/config/i386/mingw-w64.h +@@ -84,3 +84,10 @@ + %{static:-Bstatic} %{!static:-Bdynamic} \ + %{shared|mdll: " SUB_LINK_ENTRY " --enable-auto-image-base} \ + %(shared_libgcc_undefs)" ++ ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ TARGET_GENERIC_MINGW_OS_D_BUILTINS(); \ ++ builtin_define ("GNU_MinGW64"); \ ++ } while (0) +Index: b/src/gcc/config/kfreebsd-gnu.h +=================================================================== +--- a/src/gcc/config/kfreebsd-gnu.h ++++ b/src/gcc/config/kfreebsd-gnu.h +@@ -29,6 +29,14 @@ + } \ + while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ builtin_define ("FreeBSD"); \ ++ builtin_define ("Posix"); \ ++ builtin_define ("GNU_GLibc"); \ ++ } while (0) ++ + #define GNU_USER_DYNAMIC_LINKER GLIBC_DYNAMIC_LINKER + #define GNU_USER_DYNAMIC_LINKER32 GLIBC_DYNAMIC_LINKER32 + #define GNU_USER_DYNAMIC_LINKER64 GLIBC_DYNAMIC_LINKER64 +Index: b/src/gcc/config/knetbsd-gnu.h +=================================================================== +--- a/src/gcc/config/knetbsd-gnu.h ++++ b/src/gcc/config/knetbsd-gnu.h +@@ -30,6 +30,16 @@ + } \ + while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("NetBSD"); \ ++ builtin_define ("Posix"); \ ++ builtin_define ("GNU_GLibc"); \ ++ } \ ++ while (0) ++ + + #undef GNU_USER_DYNAMIC_LINKER + #define GNU_USER_DYNAMIC_LINKER "/lib/ld.so.1" +Index: b/src/gcc/config/kopensolaris-gnu.h +=================================================================== +--- a/src/gcc/config/kopensolaris-gnu.h ++++ b/src/gcc/config/kopensolaris-gnu.h +@@ -30,5 +30,15 @@ + } \ + while (0) + ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("Solaris"); \ ++ builtin_define ("Posix"); \ ++ builtin_define ("GNU_OpenSolaris"); \ ++ builtin_define ("GNU_GLibc"); \ ++ } \ ++ while (0) ++ + #undef GNU_USER_DYNAMIC_LINKER + #define GNU_USER_DYNAMIC_LINKER "/lib/ld.so.1" +Index: b/src/gcc/config/linux-android.h +=================================================================== +--- a/src/gcc/config/linux-android.h ++++ b/src/gcc/config/linux-android.h +@@ -25,6 +25,12 @@ + builtin_define ("__ANDROID__"); \ + } while (0) + ++#define ANDROID_TARGET_OS_D_BUILTINS() \ ++ do { \ ++ if (TARGET_ANDROID) \ ++ builtin_define ("Android"); \ ++ } while (0) ++ + #if ANDROID_DEFAULT + # define NOANDROID "mno-android" + #else +Index: b/src/gcc/config/linux.h +=================================================================== +--- a/src/gcc/config/linux.h ++++ b/src/gcc/config/linux.h +@@ -49,6 +49,20 @@ + builtin_assert ("system=posix"); \ + } while (0) + ++#define TARGET_OS_D_BUILTINS() TARGET_GENERIC_LINUX_OS_D_BUILTINS() ++#define TARGET_GENERIC_LINUX_OS_D_BUILTINS() \ ++ do { \ ++ if (OPTION_GLIBC) \ ++ builtin_define ("GNU_GLibc"); \ ++ else if (OPTION_UCLIBC) \ ++ builtin_define ("GNU_UCLibc"); \ ++ else if (OPTION_BIONIC) \ ++ builtin_define ("GNU_Bionic"); \ ++ \ ++ builtin_define ("linux"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + /* Determine which dynamic linker to use depending on whether GLIBC or + uClibc or Bionic is the default C library and whether + -muclibc or -mglibc or -mbionic has been passed to change the default. */ +Index: b/src/gcc/config/mips/linux-common.h +=================================================================== +--- a/src/gcc/config/mips/linux-common.h ++++ b/src/gcc/config/mips/linux-common.h +@@ -27,6 +27,15 @@ + ANDROID_TARGET_OS_CPP_BUILTINS(); \ + } while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ TARGET_GENERIC_LINUX_OS_D_BUILTINS(); \ ++ ANDROID_TARGET_OS_D_BUILTINS(); \ ++ } \ ++ while (0) ++ + #undef LINK_SPEC + #define LINK_SPEC \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LINK_SPEC, \ +Index: b/src/gcc/config/netbsd.h +=================================================================== +--- a/src/gcc/config/netbsd.h ++++ b/src/gcc/config/netbsd.h +@@ -29,6 +29,14 @@ + } \ + while (0) + ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("NetBSD"); \ ++ builtin_define ("Posix"); \ ++ } \ ++ while (0) ++ + /* CPP_SPEC parts common to all NetBSD targets. */ + #define NETBSD_CPP_SPEC \ + "%{posix:-D_POSIX_SOURCE} \ +Index: b/src/gcc/config/openbsd.h +=================================================================== +--- a/src/gcc/config/openbsd.h ++++ b/src/gcc/config/openbsd.h +@@ -84,6 +84,14 @@ + } \ + while (0) + ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("OpenBSD"); \ ++ builtin_define ("Posix"); \ ++ } \ ++ while (0) ++ + /* TARGET_OS_CPP_BUILTINS() common to all OpenBSD ELF targets. */ + #define OPENBSD_OS_CPP_BUILTINS_ELF() \ + do \ +Index: b/src/gcc/config/rs6000/aix.h +=================================================================== +--- a/src/gcc/config/rs6000/aix.h ++++ b/src/gcc/config/rs6000/aix.h +@@ -110,6 +110,13 @@ + } \ + while (0) + ++#define TARGET_OS_D_BUILTINS() \ ++ do { \ ++ \ ++ builtin_define ("AIX"); \ ++ builtin_define ("Posix"); \ ++ } while (0) ++ + /* Define appropriate architecture macros for preprocessor depending on + target switches. */ + +Index: b/src/gcc/config/rs6000/linux64.h +=================================================================== +--- a/src/gcc/config/rs6000/linux64.h ++++ b/src/gcc/config/rs6000/linux64.h +@@ -323,6 +323,17 @@ + } \ + while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("linux"); \ ++ builtin_define ("Posix"); \ ++ if (OPTION_GLIBC) \ ++ builtin_define ("GNU_GLibc"); \ ++ } \ ++ while (0) ++ + #undef CPP_OS_DEFAULT_SPEC + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + +Index: b/src/gcc/config/rs6000/linux.h +=================================================================== +--- a/src/gcc/config/rs6000/linux.h ++++ b/src/gcc/config/rs6000/linux.h +@@ -52,6 +52,17 @@ + } \ + while (0) + ++#undef TARGET_OS_D_BUILTINS ++#define TARGET_OS_D_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define ("linux"); \ ++ builtin_define ("Posix"); \ ++ if (OPTION_GLIBC) \ ++ builtin_define ("GNU_GLibc"); \ ++ } \ ++ while (0) ++ + #undef CPP_OS_DEFAULT_SPEC + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + --- gcc-4.8-4.8.2.orig/debian/patches/go-testsuite.diff +++ gcc-4.8-4.8.2/debian/patches/go-testsuite.diff @@ -0,0 +1,19 @@ +# DP: Skip Go testcase on AArch64 which hangs on the buildds. + +--- a/src/gcc/testsuite/go.test/go-test.exp ++++ b/src/gcc/testsuite/go.test/go-test.exp +@@ -318,6 +318,14 @@ + } + } + ++ # Hangs on the buildds ++ if { [istarget "aarch64*-*-*"] } { ++ if { [string match "*go.test/test/chan/select5.go" $test] } { ++ untested $test ++ continue ++ } ++ } ++ + if { [file tail $test] == "init1.go" } { + # This tests whether GC runs during init, which for gccgo + # it currently does not. --- gcc-4.8-4.8.2.orig/debian/patches/go-use-gold.diff +++ gcc-4.8-4.8.2/debian/patches/go-use-gold.diff @@ -0,0 +1,125 @@ +# DP: Pass -fuse-ld=gold to gccgo on targets supporting -fsplit-stack + +gcc/go/ + + * gospec.c (lang_specific_driver): Pass -fuse-ld=gold on targets + supporting -fsplit-stack, unless overwritten. + +gcc/ + * configure.ac: New define HAVE_GOLD_NON_DEFAULT. + * config.in: Regenerate. + +libgo/ + * configure.ac (libgo_cv_c_linker_supports_split_stack): Fix quoting. + Check the linker used by the gccgo driver. + +Index: b/src/gcc/go/gospec.c +=================================================================== +--- a/src/gcc/go/gospec.c ++++ b/src/gcc/go/gospec.c +@@ -117,6 +117,10 @@ + /* Whether the -S option was used. */ + bool saw_opt_S = false; + ++ /* "-fuse-ld=" if it appears on the command line. */ ++ bool saw_use_ld = false; ++ int need_gold = 0; ++ + /* The first input file with an extension of .go. */ + const char *first_go_file = NULL; + +@@ -217,6 +221,11 @@ + } + + break; ++ ++ case OPT_fuse_ld_bfd: ++ case OPT_fuse_ld_gold: ++ saw_use_ld = true; ++ break; + } + } + +@@ -226,8 +235,14 @@ + shared_libgcc = 0; + #endif + ++#if defined(TARGET_CAN_SPLIT_STACK) && defined(HAVE_GOLD_NON_DEFAULT) ++ if (!saw_use_ld) ++ need_gold = 1; ++#endif ++ + /* Make sure to have room for the trailing NULL argument. */ +- num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 10; ++ num_args = argc + need_math + shared_libgcc + need_gold + ++ (library > 0) * 5 + 10; + new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args); + + i = 0; +@@ -244,6 +259,14 @@ + &new_decoded_options[j]); + j++; + } ++#ifdef HAVE_GOLD_NON_DEFAULT ++ if (need_gold) ++ { ++ generate_option (OPT_fuse_ld_gold, NULL, 1, CL_DRIVER, ++ &new_decoded_options[j]); ++ j++; ++ } ++#endif + #endif + + /* NOTE: We start at 1 now, not 0. */ +Index: b/src/libgo/configure.ac +=================================================================== +--- a/src/libgo/configure.ac ++++ b/src/libgo/configure.ac +@@ -348,10 +348,10 @@ + dnl others. + AC_CACHE_CHECK([whether linker supports split stack], + [libgo_cv_c_linker_supports_split_stack], +-libgo_cv_c_linker_supports_split_stack=no +-if $LD --help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then ++[libgo_cv_c_linker_supports_split_stack=no ++if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then + libgo_cv_c_linker_supports_split_stack=yes +-fi) ++fi]) + if test "$libgo_cv_c_linker_supports_split_stack" = yes; then + AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1, + [Define if the linker support split stack adjustments]) +Index: b/src/gcc/config.in +=================================================================== +--- a/src/gcc/config.in ++++ b/src/gcc/config.in +@@ -1133,6 +1133,12 @@ + #endif + + ++/* Define if the gold linker is available as a non-default */ ++#ifndef USED_FOR_TARGET ++#undef HAVE_GOLD_NON_DEFAULT ++#endif ++ ++ + /* Define if you have the iconv() function. */ + #ifndef USED_FOR_TARGET + #undef HAVE_ICONV +Index: b/src/gcc/configure.ac +=================================================================== +--- a/src/gcc/configure.ac ++++ b/src/gcc/configure.ac +@@ -2059,6 +2059,12 @@ + fi + AC_MSG_RESULT($ld_is_gold) + ++# Check to see if ld is used, and gold is available ++if test x$ld_is_gold = xno && which ${gcc_cv_ld}.gold >/dev/null 2>&1; then ++ AC_DEFINE(HAVE_GOLD_NON_DEFAULT, 1, ++ [Define if the gold linker is available as a non-default]) ++fi ++ + ORIGINAL_LD_FOR_TARGET=$gcc_cv_ld + AC_SUBST(ORIGINAL_LD_FOR_TARGET) + case "$ORIGINAL_LD_FOR_TARGET" in --- gcc-4.8-4.8.2.orig/debian/patches/goarch-aarch64.diff +++ gcc-4.8-4.8.2/debian/patches/goarch-aarch64.diff @@ -0,0 +1,82 @@ +# DP: Introduce the arm64 goarch. + +--- a/src/gcc/testsuite/go.test/go-test.exp ++++ b/src/gcc/testsuite/go.test/go-test.exp +@@ -172,6 +172,9 @@ + global target_triplet + + switch -glob $target_triplet { ++ "aarch64*-*-*" { ++ set goarch "arm64" ++ } + "alpha*-*-*" { + set goarch "alpha" + } +--- a/src/libgo/configure.ac ++++ b/src/libgo/configure.ac +@@ -174,6 +174,7 @@ + is_386=no + is_alpha=no + is_arm=no ++is_arm64=no + is_m68k=no + mips_abi=unknown + is_ppc=no +@@ -187,6 +188,10 @@ + is_alpha=yes + GOARCH=alpha + ;; ++ aarch64-*-*) ++ is_arm64=yes ++ GOARCH=arm64 ++ ;; + arm*-*-* | strongarm*-*-* | ep9312*-*-* | xscale-*-*) + is_arm=yes + GOARCH=arm +@@ -267,6 +272,7 @@ + AM_CONDITIONAL(LIBGO_IS_386, test $is_386 = yes) + AM_CONDITIONAL(LIBGO_IS_ALPHA, test $is_alpha = yes) + AM_CONDITIONAL(LIBGO_IS_ARM, test $is_arm = yes) ++AM_CONDITIONAL(LIBGO_IS_ARM64, test $is_arm64 = yes) + AM_CONDITIONAL(LIBGO_IS_M68K, test $is_m68k = yes) + AM_CONDITIONAL(LIBGO_IS_MIPS, test $mips_abi != unknown) + AM_CONDITIONAL(LIBGO_IS_MIPSO32, test $mips_abi = o32) +--- a/src/libgo/go/go/build/build.go ++++ b/src/libgo/go/go/build/build.go +@@ -1211,6 +1211,8 @@ + return "6", nil + case "arm": + return "5", nil ++ case "arm64": ++ return "7", nil + } + return "", errors.New("unsupported GOARCH " + goarch) + } +--- a/src/libgo/go/go/build/deps_test.go ++++ b/src/libgo/go/go/build/deps_test.go +@@ -360,7 +360,7 @@ + + var bools = []bool{false, true} + var geese = []string{"darwin", "freebsd", "linux", "netbsd", "openbsd", "plan9", "windows"} +-var goarches = []string{"386", "amd64", "arm"} ++var goarches = []string{"386", "amd64", "arm", "arm64"} + + type osPkg struct { + goos, pkg string +--- a/src/libgo/go/go/build/syslist.go ++++ b/src/libgo/go/go/build/syslist.go +@@ -5,4 +5,4 @@ + package build + + const goosList = "darwin dragonfly freebsd linux netbsd openbsd plan9 windows solaris " +-const goarchList = "386 amd64 arm alpha m68k mipso32 mipsn32 mipsn64 mipso64 ppc ppc64 sparc sparc64 " ++const goarchList = "386 amd64 arm arm64 alpha m68k mipso32 mipsn32 mipsn64 mipso64 ppc ppc64 sparc sparc64 " +--- a/src/libgo/go/runtime/extern.go ++++ b/src/libgo/go/runtime/extern.go +@@ -185,5 +185,5 @@ + const GOOS string = theGoos + + // GOARCH is the running program's architecture target: +-// 386, amd64, or arm. ++// 386, amd64, arm or arm64. + const GOARCH string = theGoarch --- gcc-4.8-4.8.2.orig/debian/patches/gold-and-ld.diff +++ gcc-4.8-4.8.2/debian/patches/gold-and-ld.diff @@ -0,0 +1,482 @@ +# DP: Enable both gold and ld in a single toolchain. +# DP: New option -fuse-ld=ld.bfd, -fuse-ld=gold. + +--- a/src/gcc/doc/invoke.texi ++++ b/srcgcc/doc/invoke.texi +@@ -399,7 +399,7 @@ + -funit-at-a-time -funroll-all-loops -funroll-loops @gol + -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops @gol + -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol +--fwhole-program -fwpa -fuse-linker-plugin @gol ++-fwhole-program -fwpa -fuse-ld -fuse-linker-plugin @gol + --param @var{name}=@var{value} + -O -O0 -O1 -O2 -O3 -Os -Ofast} + +@@ -7689,6 +7689,16 @@ + Enabled by default when LTO support in GCC is enabled and GCC was compiled + with linker supporting plugins (GNU ld or @code{gold}). + ++@item -fuse-ld=gold ++Use the @command{gold} linker instead of the default linker. ++This option is only necessary if GCC has been configured with ++@option{--enable-gold} and @option{--enable-ld=default}. ++ ++@item -fuse-ld=bfd ++Use the @command{ld.bfd} linker instead of the default linker. ++This option is only necessary if GCC has been configured with ++@option{--enable-gold} and @option{--enable-ld}. ++ + @item -fcprop-registers + @opindex fcprop-registers + After register allocation and post-register allocation instruction splitting, +--- a/src/gcc/gcc.c ++++ b/srcgcc/gcc.c +@@ -656,6 +656,9 @@ + }"PLUGIN_COND_CLOSE" \ + %{flto|flto=*:%max_errors = value; + break; + ++ case OPT_fuse_ld_: + case OPT_fuse_linker_plugin: +- /* No-op. Used by the driver and passed to us because it starts with f.*/ ++ /* No-op. Used by the driver and passed to us because it starts with f. */ + break; + + default: +--- a/src/gcc/configure.ac ++++ b/srcgcc/configure.ac +@@ -1937,6 +1937,17 @@ + AC_PATH_PROG(gcc_cv_ld, $LD_FOR_TARGET) + fi]) + ++gcc_cv_ld_gold_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gold ++ ++AS_VAR_SET_IF(gcc_cv_gold,, [ ++if test -f $gcc_cv_ld_gold_srcdir/configure.ac \ ++ && test -f ../gold/Makefile \ ++ && test x$build = x$host; then ++ gcc_cv_gold=../gold/ld-new$build_exeext ++else ++ gcc_cv_gold='' ++fi]) ++ + ORIGINAL_PLUGIN_LD_FOR_TARGET=$gcc_cv_ld + PLUGIN_LD=`basename $gcc_cv_ld` + AC_ARG_WITH(plugin-ld, +@@ -1966,6 +1977,9 @@ + *) AC_CONFIG_FILES(collect-ld:exec-tool.in, [chmod +x collect-ld]) ;; + esac + ++ORIGINAL_GOLD_FOR_TARGET=$gcc_cv_gold ++AC_SUBST(ORIGINAL_GOLD_FOR_TARGET) ++ + AC_MSG_CHECKING(what linker to use) + if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then + # Single tree build which includes ld. We want to prefer it +--- a/src/gcc/exec-tool.in ++++ b/srcgcc/exec-tool.in +@@ -1,6 +1,6 @@ + #! /bin/sh + +-# Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc. ++# Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc. + # This file is part of GCC. + + # GCC is free software; you can redistribute it and/or modify +@@ -21,11 +21,13 @@ + + ORIGINAL_AS_FOR_TARGET="@ORIGINAL_AS_FOR_TARGET@" + ORIGINAL_LD_FOR_TARGET="@ORIGINAL_LD_FOR_TARGET@" ++ORIGINAL_GOLD_FOR_TARGET="@ORIGINAL_GOLD_FOR_TARGET@" + ORIGINAL_PLUGIN_LD_FOR_TARGET="@ORIGINAL_PLUGIN_LD_FOR_TARGET@" + ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@" + exeext=@host_exeext@ + fast_install=@enable_fast_install@ + objdir=@objdir@ ++version="1.1" + + invoked=`basename "$0"` + id=$invoked +@@ -36,15 +38,44 @@ + dir=gas + ;; + collect-ld) +- # when using a linker plugin, gcc will always pass '-plugin' as the +- # first or second option to the linker. +- if test x"$1" = "x-plugin" || test x"$2" = "x-plugin"; then +- original=$ORIGINAL_PLUGIN_LD_FOR_TARGET +- else +- original=$ORIGINAL_LD_FOR_TARGET ++ prog=ld-new$exeext ++ # Look for the a command line option ++ # specifying the linker to be used. ++ case " $* " in ++ *\ -use-gold\ *) ++ original=$ORIGINAL_GOLD_FOR_TARGET ++ dir=gold ++ ;; ++ *\ -use-ld\ * | *\ -use-ld.bfd\ *) ++ original=$ORIGINAL_LD_FOR_TARGET ++ dir=ld ++ ;; ++ *\ -plugin\ *) ++ original=$ORIGINAL_PLUGIN_LD_FOR_TARGET ++ dir=ld ++ ;; ++ *) ++ original=$ORIGINAL_LD_FOR_TARGET ++ dir=ld ++ ;; ++ esac ++ ++ # If the selected linker has not been configured then ++ # try using the others, in the order PLUGIN-LD, LD, GOLD. ++ if test x"$original" = x; then ++ if test x"$ORIGINAL_PLUGIN_LD_FOR_TARGET" != x; then ++ original=$ORIGINAL_PLUGIN_LD_FOR_TARGET ++ dir=ld ++ elif test x"$ORIGINAL_LD_FOR_TARGET" != x; then ++ original=$ORIGINAL_LD_FOR_TARGET ++ dir=ld ++ elif test x"$ORIGINAL_GOLD_FOR_TARGET" != x; then ++ original=$ORIGINAL_GOLD_FOR_TARGET ++ dir=gold ++ # Otherwise do nothing - the case statement below ++ # will issue an error message for us. ++ fi + fi +- prog=ld-new$exeext +- dir=ld + id=ld + ;; + nm) +@@ -61,29 +92,58 @@ + scriptdir=`cd "$tdir" && pwd` + + if test -x $scriptdir/../$dir/$prog; then +- test "$fast_install" = yes || exec $scriptdir/../$dir/$prog ${1+"$@"} ++ if test "$fast_install" = yes; then ++ # If libtool did everything it needs to do, there's a fast path. ++ lt_prog=$scriptdir/../$dir/$objdir/lt-$prog + +- # if libtool did everything it needs to do, there's a fast path +- lt_prog=$scriptdir/../$dir/$objdir/lt-$prog +- test -x $lt_prog && exec $lt_prog ${1+"$@"} +- +- # libtool has not relinked ld-new yet, but we cannot just use the +- # previous stage (because then the relinking would just never happen!). +- # So we take extra care to use prev-ld/ld-new *on recursive calls*. +- eval LT_RCU="\${LT_RCU_$id}" +- test x"$LT_RCU" = x"1" && exec $scriptdir/../prev-$dir/$prog ${1+"$@"} +- +- eval LT_RCU_$id=1 +- export LT_RCU_$id +- $scriptdir/../$dir/$prog ${1+"$@"} +- result=$? +- exit $result +- ++ if test -x $lt_prog; then ++ original=$lt_prog ++ else ++ # Libtool has not relinked ld-new yet, but we cannot just use the ++ # previous stage (because then the relinking would just never happen!). ++ # So we take extra care to use prev-ld/ld-new *on recursive calls*. ++ eval LT_RCU="\${LT_RCU_$id}" ++ if test x"$LT_RCU" = x"1"; then ++ original=$scriptdir/../prev-$dir/$prog ++ else ++ eval LT_RCU_$id=1 ++ export LT_RCU_$id ++ case " $* " in ++ *\ -v\ *) ++ echo "$invoked $version" ++ echo $scriptdir/../$dir/$prog $* ++ ;; ++ esac ++ $scriptdir/../$dir/$prog ${1+"$@"} ++ result=$? ++ exit $result ++ fi ++ fi ++ else ++ original=$scriptdir/../$dir/$prog ++ fi + else +- exec $scriptdir/../prev-$dir/$prog ${1+"$@"} ++ original=$scriptdir/../prev-$dir/$prog + fi + ;; +- *) +- exec $original ${1+"$@"} ++ "") ++ echo "$invoked: executable not configured" ++ exit 1 + ;; + esac ++ ++# If -v has been used then display our version number ++# and then echo the command we are about to invoke. ++case " $* " in ++ *\ -v\ *) ++ echo "$invoked $version" ++ echo $original $* ++ ;; ++esac ++ ++if test -x $original; then ++ exec "$original" ${1+"$@"} ++else ++ echo "$invoked: unable to locate executable: $original" ++ exit 1 ++fi +--- a/src/gcc/common.opt ++++ b/srcgcc/common.opt +@@ -1998,6 +1998,9 @@ + Common Report Var(flag_unwind_tables) Optimization + Just generate unwind tables for exception handling + ++fuse-ld= ++Common Joined Undocumented ++ + fuse-linker-plugin + Common Undocumented + +--- a/src/gcc/collect2.c ++++ b/srcgcc/collect2.c +@@ -1075,17 +1075,19 @@ + int + main (int argc, char **argv) + { +- static const char *const ld_suffix = "ld"; +- static const char *const plugin_ld_suffix = PLUGIN_LD; +- static const char *const real_ld_suffix = "real-ld"; ++ static const char *const ld_suffix = "ld"; ++ static const char *const gold_suffix = "gold"; ++ static const char *const bfd_ld_suffix = "ld.bfd"; ++ static const char *const plugin_ld_suffix = PLUGIN_LD; ++ static const char *const real_ld_suffix = "real-ld"; + static const char *const collect_ld_suffix = "collect-ld"; +- static const char *const nm_suffix = "nm"; +- static const char *const gnm_suffix = "gnm"; ++ static const char *const nm_suffix = "nm"; ++ static const char *const gnm_suffix = "gnm"; + #ifdef LDD_SUFFIX +- static const char *const ldd_suffix = LDD_SUFFIX; ++ static const char *const ldd_suffix = LDD_SUFFIX; + #endif +- static const char *const strip_suffix = "strip"; +- static const char *const gstrip_suffix = "gstrip"; ++ static const char *const strip_suffix = "strip"; ++ static const char *const gstrip_suffix = "gstrip"; + + #ifdef CROSS_DIRECTORY_STRUCTURE + /* If we look for a program in the compiler directories, we just use +@@ -1095,6 +1097,10 @@ + + const char *const full_ld_suffix = + concat(target_machine, "-", ld_suffix, NULL); ++ const char *const full_gold_suffix = ++ concat (target_machine, "-", gold_suffix, NULL); ++ const char *const full_bfd_ld_suffix = ++ concat (target_machine, "-", bfd_ld_suffix, NULL); + const char *const full_plugin_ld_suffix = + concat(target_machine, "-", plugin_ld_suffix, NULL); + const char *const full_nm_suffix = +@@ -1110,15 +1116,17 @@ + const char *const full_gstrip_suffix = + concat (target_machine, "-", gstrip_suffix, NULL); + #else +- const char *const full_ld_suffix = ld_suffix; ++ const char *const full_ld_suffix = ld_suffix; ++ const char *const full_gold_suffix = gold_suffix; ++ const char *const full_bfd_ld_suffix = bfd_ld_suffix; + const char *const full_plugin_ld_suffix = plugin_ld_suffix; +- const char *const full_nm_suffix = nm_suffix; +- const char *const full_gnm_suffix = gnm_suffix; ++ const char *const full_nm_suffix = nm_suffix; ++ const char *const full_gnm_suffix = gnm_suffix; + #ifdef LDD_SUFFIX +- const char *const full_ldd_suffix = ldd_suffix; ++ const char *const full_ldd_suffix = ldd_suffix; + #endif +- const char *const full_strip_suffix = strip_suffix; +- const char *const full_gstrip_suffix = gstrip_suffix; ++ const char *const full_strip_suffix = strip_suffix; ++ const char *const full_gstrip_suffix = gstrip_suffix; + #endif /* CROSS_DIRECTORY_STRUCTURE */ + + const char *arg; +@@ -1132,7 +1140,13 @@ + const char **c_ptr; + char **ld1_argv; + const char **ld1; +- bool use_plugin = false; ++ enum linker_select ++ { ++ DFLT_LINKER, ++ PLUGIN_LINKER, ++ GOLD_LINKER, ++ BFD_LINKER ++ } selected_linker = DFLT_LINKER; + + /* The kinds of symbols we will have to consider when scanning the + outcome of a first pass link. This is ALL to start with, then might +@@ -1209,15 +1223,21 @@ + else if (! strcmp (argv[i], "-flto-partition=none")) + no_partition = true; + else if ((! strncmp (argv[i], "-flto=", 6) +- || ! strcmp (argv[i], "-flto")) && ! use_plugin) ++ || ! strcmp (argv[i], "-flto")) ++ && selected_linker != PLUGIN_LINKER) + lto_mode = LTO_MODE_WHOPR; + else if (!strncmp (argv[i], "-fno-lto", 8)) + lto_mode = LTO_MODE_NONE; + else if (! strcmp (argv[i], "-plugin")) + { +- use_plugin = true; ++ selected_linker = PLUGIN_LINKER; + lto_mode = LTO_MODE_NONE; + } ++ else if (! strcmp (argv[i], "-use-gold")) ++ selected_linker = GOLD_LINKER; ++ else if (! strcmp (argv[i], "-use-ld")) ++ selected_linker = BFD_LINKER; ++ + #ifdef COLLECT_EXPORT_LIST + /* since -brtl, -bexport, -b64 are not position dependent + also check for them here */ +@@ -1299,36 +1319,109 @@ + /* Try to discover a valid linker/nm/strip to use. */ + + /* Maybe we know the right file to use (if not cross). */ +- ld_file_name = 0; ++ ld_file_name = NULL; + #ifdef DEFAULT_LINKER + if (access (DEFAULT_LINKER, X_OK) == 0) + ld_file_name = DEFAULT_LINKER; +- if (ld_file_name == 0) ++ if (ld_file_name == NULL) + #endif + #ifdef REAL_LD_FILE_NAME + ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME); +- if (ld_file_name == 0) ++ if (ld_file_name == NULL) + #endif + /* Search the (target-specific) compiler dirs for ld'. */ + ld_file_name = find_a_file (&cpath, real_ld_suffix); + /* Likewise for `collect-ld'. */ +- if (ld_file_name == 0) ++ if (ld_file_name == NULL) + ld_file_name = find_a_file (&cpath, collect_ld_suffix); + /* Search the compiler directories for `ld'. We have protection against + recursive calls in find_a_file. */ +- if (ld_file_name == 0) +- ld_file_name = find_a_file (&cpath, +- use_plugin +- ? plugin_ld_suffix +- : ld_suffix); ++ if (ld_file_name == NULL) ++ switch (selected_linker) ++ { ++ default: ++ case DFLT_LINKER: ++ ld_file_name = find_a_file (&cpath, ld_suffix); ++ break; ++ case PLUGIN_LINKER: ++ ld_file_name = find_a_file (&cpath, plugin_ld_suffix); ++ break; ++ case GOLD_LINKER: ++ ld_file_name = find_a_file (&cpath, gold_suffix); ++ break; ++ case BFD_LINKER: ++ ld_file_name = find_a_file (&cpath, bfd_ld_suffix); ++ break; ++ } + /* Search the ordinary system bin directories + for `ld' (if native linking) or `TARGET-ld' (if cross). */ +- if (ld_file_name == 0) +- ld_file_name = find_a_file (&path, +- use_plugin +- ? full_plugin_ld_suffix +- : full_ld_suffix); ++ if (ld_file_name == NULL) ++ switch (selected_linker) ++ { ++ default: ++ case DFLT_LINKER: ++ ld_file_name = find_a_file (&path, full_ld_suffix); ++ break; ++ case PLUGIN_LINKER: ++ ld_file_name = find_a_file (&path, full_plugin_ld_suffix); ++ break; ++ case GOLD_LINKER: ++ ld_file_name = find_a_file (&path, full_gold_suffix); ++ break; ++ case BFD_LINKER: ++ ld_file_name = find_a_file (&path, full_bfd_ld_suffix); ++ break; ++ } ++ /* If we failed to find a plugin-capable linker, try the ordinary one. */ ++ if (ld_file_name == NULL && selected_linker == PLUGIN_LINKER) ++ ld_file_name = find_a_file (&cpath, ld_suffix); + ++ if ((vflag || debug) && ld_file_name == NULL) ++ { ++ struct prefix_list * p; ++ const char * s; ++ ++ notice ("collect2: warning: unable to find linker.\n"); ++ ++#ifdef DEFAULT_LINKER ++ notice (" Searched for this absolute executable:\n"); ++ notice (" %s\n", DEFAULT_LINKER); ++#endif ++ ++ notice (" Searched in these paths:\n"); ++ for (p = cpath.plist; p != NULL; p = p->next) ++ notice (" %s\n", p->prefix); ++ notice (" For these executables:\n"); ++ notice (" %s\n", real_ld_suffix); ++ notice (" %s\n", collect_ld_suffix); ++ switch (selected_linker) ++ { ++ default: ++ case DFLT_LINKER: s = ld_suffix; break; ++ case PLUGIN_LINKER: s = plugin_ld_suffix; break; ++ case GOLD_LINKER: s = gold_suffix; break; ++ case BFD_LINKER: s = bfd_ld_suffix; break; ++ } ++ notice (" %s\n", s); ++ ++ notice (" And searched in these paths:\n"); ++ for (p = path.plist; p != NULL; p = p->next) ++ notice (" %s\n", p->prefix); ++ notice (" For these executables:\n"); ++#ifdef REAL_LD_FILE_NAME ++ notice (" %s\n", REAL_LD_FILE_NAME); ++#endif ++ switch (selected_linker) ++ { ++ default: ++ case DFLT_LINKER: s = full_ld_suffix; break; ++ case PLUGIN_LINKER: s = full_plugin_ld_suffix; break; ++ case GOLD_LINKER: s = full_gold_suffix; break; ++ case BFD_LINKER: s = full_bfd_ld_suffix; break; ++ } ++ notice (" %s\n", s); ++ } ++ + #ifdef REAL_NM_FILE_NAME + nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME); + if (nm_file_name == 0) --- gcc-4.8-4.8.2.orig/debian/patches/hurd-changes.diff +++ gcc-4.8-4.8.2/debian/patches/hurd-changes.diff @@ -0,0 +1,20 @@ +# DP: Traditional GNU systems don't have a /usr directory. However, Debian +# DP: systems do, and we support both having a /usr -> . symlink, and having a +# DP: /usr directory like the other ports. So this patch should NOT go +# DP: upstream. + +--- + config.gcc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/src/gcc/config.gcc (rvision 182461) ++++ b/src/gcc/config.gcc (copie de travail) +@@ -583,7 +583,7 @@ + *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu | *-*-kopensolaris*-gnu) + :;; + *-*-gnu*) +- native_system_header_dir=/include ++ # native_system_header_dir=/include + ;; + esac + # glibc / uclibc / bionic switch. --- gcc-4.8-4.8.2.orig/debian/patches/kfreebsd-boehm-gc.diff +++ gcc-4.8-4.8.2/debian/patches/kfreebsd-boehm-gc.diff @@ -0,0 +1,13 @@ +# DP: boehm-gc: use mmap instead of brk also on kfreebsd-*. + +--- a/src/boehm-gc/configure.host ++++ b/src/boehm-gc/configure.host +@@ -41,7 +41,7 @@ + fi + + case "${host}" in +- *-linux*) ++ *-linux*|*-kfreebsd*-gnu*) + gc_use_mmap=yes + ;; + esac --- gcc-4.8-4.8.2.orig/debian/patches/kfreebsd-unwind.diff +++ gcc-4.8-4.8.2/debian/patches/kfreebsd-unwind.diff @@ -0,0 +1,225 @@ +# DP: DWARF2 EH unwinding support for AMD x86-64 and x86 KFreeBSD. + +--- a/src/libgcc/config.host ++++ b/src/libgcc/config.host +@@ -523,7 +523,12 @@ + tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + md_unwind_header=i386/linux-unwind.h + ;; +-i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu) ++i[34567]86-*-kfreebsd*-gnu) ++ extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" ++ tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" ++ md_unwind_header=i386/freebsd-unwind.h ++ ;; ++i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu) + extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" + tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + ;; +@@ -532,7 +537,12 @@ + tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + md_unwind_header=i386/linux-unwind.h + ;; +-x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu) ++x86_64-*-kfreebsd*-gnu) ++ extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" ++ tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" ++ md_unwind_header=i386/freebsd-unwind.h ++ ;; ++x86_64-*-knetbsd*-gnu) + extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" + tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + ;; +--- a/src/libgcc/config/i386/freebsd-unwind.h ++++ b/src/libgcc/config/i386/freebsd-unwind.h +@@ -0,0 +1,190 @@ ++/* DWARF2 EH unwinding support for AMD x86-64 and x86. ++ Copyright (C) 2004-2013 Free Software Foundation, Inc. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 3, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++Under Section 7 of GPL version 3, you are granted additional ++permissions described in the GCC Runtime Library Exception, version ++3.1, as published by the Free Software Foundation. ++ ++You should have received a copy of the GNU General Public License and ++a copy of the GCC Runtime Library Exception along with this program; ++see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ++. */ ++ ++/* Do code reading to identify a signal frame, and set the frame ++ state data appropriately. See unwind-dw2.c for the structs. ++ Don't use this at all if inhibit_libc is used. */ ++ ++#ifndef inhibit_libc ++ ++#include ++#include ++#include ++ ++#ifdef __x86_64__ ++ ++#define MD_FALLBACK_FRAME_STATE_FOR x86_64_fb_fallback_frame_state ++ ++static _Unwind_Reason_Code ++x86_64_fb_fallback_frame_state (struct _Unwind_Context *context, ++ _Unwind_FrameState *fs) ++{ ++ unsigned int *pc = context->ra; ++ struct sigframe *sf; ++ long new_cfa; ++ ++/* sys/amd64/amd64/sigtramp.S: ++ ++ 48 8d 7c 24 10 lea 0x10(%rsp),%rdi ++ 6a 00 pushq $0x0 ++ 48 c7 c0 a1 01 00 00 mov $0x1a1,%rax ++ 0f 05 syscall ++*/ ++ ++ if ( (pc[0] == 0x247c8d48U) ++ && (pc[1] == 0x48006a10U) ++ && (pc[2] == 0x01a1c0c7U) ++ && (pc[3] == 0x050f0000U)) ++ { ++ sf = (struct sigframe *) context->cfa; ++ } ++ else ++ return _URC_END_OF_STACK; ++ ++ new_cfa = sf->sf_uc.uc_mcontext.mc_rsp; ++ fs->regs.cfa_how = CFA_REG_OFFSET; ++ /* Register 7 is rsp */ ++ fs->regs.cfa_reg = 7; ++ fs->regs.cfa_offset = new_cfa - (long) context->cfa; ++ ++ /* The SVR4 register numbering macros aren't usable in libgcc. */ ++ fs->regs.reg[0].how = REG_SAVED_OFFSET; ++ fs->regs.reg[0].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rax - new_cfa; ++ fs->regs.reg[1].how = REG_SAVED_OFFSET; ++ fs->regs.reg[1].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rdx - new_cfa; ++ fs->regs.reg[2].how = REG_SAVED_OFFSET; ++ fs->regs.reg[2].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rcx - new_cfa; ++ fs->regs.reg[3].how = REG_SAVED_OFFSET; ++ fs->regs.reg[3].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rbx - new_cfa; ++ fs->regs.reg[4].how = REG_SAVED_OFFSET; ++ fs->regs.reg[4].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rsi - new_cfa; ++ fs->regs.reg[5].how = REG_SAVED_OFFSET; ++ fs->regs.reg[5].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rdi - new_cfa; ++ fs->regs.reg[6].how = REG_SAVED_OFFSET; ++ fs->regs.reg[6].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rbp - new_cfa; ++ fs->regs.reg[8].how = REG_SAVED_OFFSET; ++ fs->regs.reg[8].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r8 - new_cfa; ++ fs->regs.reg[9].how = REG_SAVED_OFFSET; ++ fs->regs.reg[9].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r9 - new_cfa; ++ fs->regs.reg[10].how = REG_SAVED_OFFSET; ++ fs->regs.reg[10].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r10 - new_cfa; ++ fs->regs.reg[11].how = REG_SAVED_OFFSET; ++ fs->regs.reg[11].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r11 - new_cfa; ++ fs->regs.reg[12].how = REG_SAVED_OFFSET; ++ fs->regs.reg[12].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r12 - new_cfa; ++ fs->regs.reg[13].how = REG_SAVED_OFFSET; ++ fs->regs.reg[13].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r13 - new_cfa; ++ fs->regs.reg[14].how = REG_SAVED_OFFSET; ++ fs->regs.reg[14].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r14 - new_cfa; ++ fs->regs.reg[15].how = REG_SAVED_OFFSET; ++ fs->regs.reg[15].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_r15 - new_cfa; ++ fs->regs.reg[16].how = REG_SAVED_OFFSET; ++ fs->regs.reg[16].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_rip - new_cfa; ++ fs->retaddr_column = 16; ++ fs->signal_frame = 1; ++ return _URC_NO_REASON; ++} ++ ++#else /* ifdef __x86_64__ */ ++ ++#define MD_FALLBACK_FRAME_STATE_FOR x86_fb_fallback_frame_state ++ ++static _Unwind_Reason_Code ++x86_fb_fallback_frame_state (struct _Unwind_Context *context, ++ _Unwind_FrameState *fs) ++{ ++ unsigned int *pc = context->ra; ++ struct sigframe *sf; ++ long new_cfa; ++ ++/* sys/amd64/ia32/ia32_sigtramp.S ++ ++ 8d 44 24 20 lea 0x20(%esp),%eax ++ 50 push %eax ++ b8 a1 01 00 00 mov $0x1a1,%eax ++ 50 push %eax ++ cd 80 int $0x80 ++ eb fe jmp - ++*/ ++ ++/* sys/i386/i386/locore.s: sigcode() ++ ++ 8d 44 24 20 lea 0x20(%esp),%eax ++ 50 push %eax ++ f7 40 54 00 00 02 00 testl $0x20000,0x54(%eax) ++ 75 03 jne + ++ 8e 68 14 mov 0x14(%eax),%gs ++ b8 a1 01 00 00 mov $0x1a1,%eax ++ 50 push %eax ++ cd 80 int $0x80 ++ eb fe jmp - ++*/ ++ ++ if ((pc[0] == 0x2024448dU) ++ && (( ++ (pc[1] == 0x01a1b850U) ++ && (pc[2] == 0xcd500000U) ++ && ((pc[3] & 0xFF) == 0x80) ++ ) ++ ++ || ( ++ (pc[4] == 0x01a1b814U) ++ && (pc[5] == 0xcd500000U) ++ && ((pc[6] & 0xFF) == 0x80) ++ ))) ++ { ++ sf = (struct sigframe *) context->cfa; ++ } ++ else ++ return _URC_END_OF_STACK; ++ ++ new_cfa = sf->sf_uc.uc_mcontext.mc_esp; ++ fs->regs.cfa_how = CFA_REG_OFFSET; ++ fs->regs.cfa_reg = 4; ++ fs->regs.cfa_offset = new_cfa - (long) context->cfa; ++ ++ /* The SVR4 register numbering macros aren't usable in libgcc. */ ++ fs->regs.reg[0].how = REG_SAVED_OFFSET; ++ fs->regs.reg[0].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_eax - new_cfa; ++ fs->regs.reg[3].how = REG_SAVED_OFFSET; ++ fs->regs.reg[3].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_ebx - new_cfa; ++ fs->regs.reg[1].how = REG_SAVED_OFFSET; ++ fs->regs.reg[1].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_ecx - new_cfa; ++ fs->regs.reg[2].how = REG_SAVED_OFFSET; ++ fs->regs.reg[2].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_edx - new_cfa; ++ fs->regs.reg[6].how = REG_SAVED_OFFSET; ++ fs->regs.reg[6].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_esi - new_cfa; ++ fs->regs.reg[7].how = REG_SAVED_OFFSET; ++ fs->regs.reg[7].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_edi - new_cfa; ++ fs->regs.reg[5].how = REG_SAVED_OFFSET; ++ fs->regs.reg[5].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_ebp - new_cfa; ++ fs->regs.reg[8].how = REG_SAVED_OFFSET; ++ fs->regs.reg[8].loc.offset = (long)&sf->sf_uc.uc_mcontext.mc_eip - new_cfa; ++ fs->retaddr_column = 8; ++ fs->signal_frame = 1; ++ return _URC_NO_REASON; ++} ++ ++#endif /* ifdef __x86_64__ */ ++#endif /* ifdef inhibit_libc */ --- gcc-4.8-4.8.2.orig/debian/patches/libffi-m68k.diff +++ gcc-4.8-4.8.2/debian/patches/libffi-m68k.diff @@ -0,0 +1,141 @@ +# DP: Apply #660525 fix to in-tree libffi + +--- a/src/libffi/src/m68k/sysv.S ++++ b/src/libffi/src/m68k/sysv.S +@@ -2,9 +2,10 @@ + + sysv.S - Copyright (c) 2012 Alan Hourihane + Copyright (c) 1998, 2012 Andreas Schwab +- Copyright (c) 2008 Red Hat, Inc. +- +- m68k Foreign Function Interface ++ Copyright (c) 2008 Red Hat, Inc. ++ Copyright (c) 2012 Thorsten Glaser ++ ++ m68k Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the +@@ -168,8 +169,28 @@ retstruct1: + + retstruct2: + btst #7,%d2 +- jbeq noretval ++ jbeq retsint8 + move.w %d0,(%a1) ++ jbra epilogue ++ ++retsint8: ++ btst #8,%d2 ++ jbeq retsint16 ++ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. ++#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ++ ext.w %d0 ++ ext.l %d0 ++#else ++ extb.l %d0 ++#endif ++ move.l %d0,(%a1) ++ jbra epilogue ++ ++retsint16: ++ btst #9,%d2 ++ jbeq noretval ++ ext.l %d0 ++ move.l %d0,(%a1) + + noretval: + epilogue: +@@ -201,8 +222,10 @@ CALLFUNC(ffi_closure_SYSV): + lsr.l #1,%d0 + jne 1f + jcc .Lcls_epilogue ++ | CIF_FLAGS_INT + move.l -12(%fp),%d0 + .Lcls_epilogue: ++ | no CIF_FLAGS_* + unlk %fp + rts + 1: +@@ -210,6 +233,7 @@ CALLFUNC(ffi_closure_SYSV): + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_float ++ | CIF_FLAGS_DINT + move.l (%a0)+,%d0 + move.l (%a0),%d1 + jra .Lcls_epilogue +@@ -224,6 +248,7 @@ CALLFUNC(ffi_closure_SYSV): + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_ldouble ++ | CIF_FLAGS_DOUBLE + #if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.d (%a0),%fp0 + #else +@@ -242,17 +267,37 @@ CALLFUNC(ffi_closure_SYSV): + jra .Lcls_epilogue + 1: + lsr.l #2,%d0 +- jne .Lcls_ret_struct2 ++ jne 1f + jcs .Lcls_ret_struct1 ++ | CIF_FLAGS_POINTER + move.l (%a0),%a0 + move.l %a0,%d0 + jra .Lcls_epilogue + .Lcls_ret_struct1: + move.b (%a0),%d0 + jra .Lcls_epilogue +-.Lcls_ret_struct2: ++1: ++ lsr.l #2,%d0 ++ jne 1f ++ jcs .Lcls_ret_sint8 ++ | CIF_FLAGS_STRUCT2 + move.w (%a0),%d0 + jra .Lcls_epilogue ++.Lcls_ret_sint8: ++ move.l (%a0),%d0 ++ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. ++#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ++ ext.w %d0 ++ ext.l %d0 ++#else ++ extb.l %d0 ++#endif ++ jra .Lcls_epilogue ++1: ++ | CIF_FLAGS_SINT16 ++ move.l (%a0),%d0 ++ ext.l %d0 ++ jra .Lcls_epilogue + CFI_ENDPROC() + + .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) +--- a/src/libffi/src/m68k/ffi.c ++++ b/src/libffi/src/m68k/ffi.c +@@ -123,6 +123,8 @@ ffi_prep_args (void *stack, extended_cif + #define CIF_FLAGS_POINTER 32 + #define CIF_FLAGS_STRUCT1 64 + #define CIF_FLAGS_STRUCT2 128 ++#define CIF_FLAGS_SINT8 256 ++#define CIF_FLAGS_SINT16 512 + + /* Perform machine dependent cif processing */ + ffi_status +@@ -200,6 +202,14 @@ ffi_prep_cif_machdep (ffi_cif *cif) + cif->flags = CIF_FLAGS_DINT; + break; + ++ case FFI_TYPE_SINT16: ++ cif->flags = CIF_FLAGS_SINT16; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ cif->flags = CIF_FLAGS_SINT8; ++ break; ++ + default: + cif->flags = CIF_FLAGS_INT; + break; --- gcc-4.8-4.8.2.orig/debian/patches/libffi-ro-eh_frame_sect.diff +++ gcc-4.8-4.8.2/debian/patches/libffi-ro-eh_frame_sect.diff @@ -0,0 +1,15 @@ +# DP: PR libffi/47248, force a read only eh frame section. + +Index: b/src/libffi/configure.ac +=================================================================== +--- a/src/libffi/configure.ac ++++ b/src/libffi/configure.ac +@@ -411,6 +411,8 @@ + libffi_cv_ro_eh_frame=yes + fi + fi ++ # FIXME: see PR libffi/47248 ++ libffi_cv_ro_eh_frame=yes + rm -f conftest.* + ]) + if test "x$libffi_cv_ro_eh_frame" = xyes; then --- gcc-4.8-4.8.2.orig/debian/patches/libgcc-no-limits-h.diff +++ gcc-4.8-4.8.2/debian/patches/libgcc-no-limits-h.diff @@ -0,0 +1,67 @@ +# DP: Don't include in libgcc/libgcc2.c. + +2013-07-15 Matthias Klose + + * libgcc2.c: Don't include . + +Index: libgcc/libgcc2.c +=================================================================== +--- a/src/libgcc/libgcc2.c (revision 198927) ++++ b/src/libgcc/libgcc2.c (working copy) +@@ -1674,18 +1674,6 @@ + #endif + + #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE +-/* Reenable the normal types, in case limits.h needs them. */ +-#undef char +-#undef short +-#undef int +-#undef long +-#undef unsigned +-#undef float +-#undef double +-#undef MIN +-#undef MAX +-#include +- + UWtype + __fixunsxfSI (XFtype a) + { +@@ -1696,18 +1684,6 @@ + #endif + + #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE +-/* Reenable the normal types, in case limits.h needs them. */ +-#undef char +-#undef short +-#undef int +-#undef long +-#undef unsigned +-#undef float +-#undef double +-#undef MIN +-#undef MAX +-#include +- + UWtype + __fixunsdfSI (DFtype a) + { +@@ -1718,18 +1694,6 @@ + #endif + + #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE +-/* Reenable the normal types, in case limits.h needs them. */ +-#undef char +-#undef short +-#undef int +-#undef long +-#undef unsigned +-#undef float +-#undef double +-#undef MIN +-#undef MAX +-#include +- + UWtype + __fixunssfSI (SFtype a) + { --- gcc-4.8-4.8.2.orig/debian/patches/libgo-explicit-reservation.diff +++ gcc-4.8-4.8.2/debian/patches/libgo-explicit-reservation.diff @@ -0,0 +1,142 @@ +# DP: Fix statically linked gccgo binaries on AArch64. + +--- a/src/libgo/runtime/malloc.goc ++++ b/src/libgo/runtime/malloc.goc +@@ -339,12 +339,14 @@ runtime_mallocinit(void) + extern byte _end[]; + byte *want; + uintptr limit; ++ bool is_reserved; + + runtime_sizeof_C_MStats = sizeof(MStats); + + p = nil; + arena_size = 0; + bitmap_size = 0; ++ is_reserved = false; + + // for 64-bit build + USED(p); +@@ -389,7 +391,8 @@ runtime_mallocinit(void) + // If this fails we fall back to the 32 bit memory mechanism + arena_size = MaxMem; + bitmap_size = arena_size / (sizeof(void*)*8/4); +- p = runtime_SysReserve((void*)(0x00c0ULL<<32), bitmap_size + arena_size); ++ p = runtime_SysReserve((void*)(0x00c0ULL<<32), bitmap_size + arena_size, false); ++ is_reserved = false; + } + if (p == nil) { + // On a 32-bit machine, we can't typically get away +@@ -428,7 +431,8 @@ runtime_mallocinit(void) + want = (byte*)(((uintptr)_end + (1<<18) + (1<<20) - 1)&~((1<<20)-1)); + if(0xffffffff - (uintptr)want <= bitmap_size + arena_size) + want = 0; +- p = runtime_SysReserve(want, bitmap_size + arena_size); ++ p = runtime_SysReserve(want, bitmap_size + arena_size, true); ++ is_reserved = true; + if(p == nil) + runtime_throw("runtime: cannot reserve arena virtual address space"); + if((uintptr)p & (((uintptr)1<arena_start = p + bitmap_size; + runtime_mheap->arena_used = runtime_mheap->arena_start; + runtime_mheap->arena_end = runtime_mheap->arena_start + arena_size; ++ runtime_mheap->is_reserved = is_reserved; + + // Initialize the rest of the allocator. + runtime_MHeap_Init(runtime_mheap, runtime_SysAlloc); +@@ -462,12 +467,15 @@ runtime_MHeap_SysAlloc(MHeap *h, uintptr n) + byte *new_end; + uintptr needed; + ++ if (!h->is_reserved) { ++ runtime_throw("runtime: cannot allocate memory"); ++ } + needed = (uintptr)h->arena_used + n - (uintptr)h->arena_end; + // Round wanted arena size to a multiple of 256MB. + needed = (needed + (256<<20) - 1) & ~((256<<20)-1); + new_end = h->arena_end + needed; + if(new_end <= h->arena_start + MaxArena32) { +- p = runtime_SysReserve(h->arena_end, new_end - h->arena_end); ++ p = runtime_SysReserve(h->arena_end, new_end - h->arena_end, true); + if(p == h->arena_end) + h->arena_end = new_end; + } +@@ -475,7 +483,7 @@ runtime_MHeap_SysAlloc(MHeap *h, uintptr n) + if(n <= (uintptr)(h->arena_end - h->arena_used)) { + // Keep taking from our reservation. + p = h->arena_used; +- runtime_SysMap(p, n); ++ runtime_SysMap(p, n, h->is_reserved); + h->arena_used += n; + runtime_MHeap_MapBits(h); + if(raceenabled) +--- a/src/libgo/runtime/malloc.h ++++ b/src/libgo/runtime/malloc.h +@@ -177,8 +177,8 @@ struct MLink + void* runtime_SysAlloc(uintptr nbytes); + void runtime_SysFree(void *v, uintptr nbytes); + void runtime_SysUnused(void *v, uintptr nbytes); +-void runtime_SysMap(void *v, uintptr nbytes); +-void* runtime_SysReserve(void *v, uintptr nbytes); ++void runtime_SysMap(void *v, uintptr nbytes, bool do_reserve); ++void* runtime_SysReserve(void *v, uintptr nbytes, bool is_reserved); + + // FixAlloc is a simple free-list allocator for fixed size objects. + // Malloc uses a FixAlloc wrapped around SysAlloc to manages its +@@ -434,6 +434,7 @@ struct MHeap + + FixAlloc spanalloc; // allocator for Span* + FixAlloc cachealloc; // allocator for MCache* ++ bool is_reserved; // is the all the address space for this heap actually reserved by us? + }; + extern MHeap *runtime_mheap; + +--- a/src/libgo/runtime/mem.c ++++ b/src/libgo/runtime/mem.c +@@ -110,7 +110,7 @@ runtime_SysFree(void *v, uintptr n) + } + + void* +-runtime_SysReserve(void *v, uintptr n) ++runtime_SysReserve(void *v, uintptr n, bool do_reserve) + { + int fd = -1; + void *p; +@@ -130,7 +130,7 @@ runtime_SysReserve(void *v, uintptr n) + // much address space. Instead, assume that the reservation is okay + // if we can reserve at least 64K and check the assumption in SysMap. + // Only user-mode Linux (UML) rejects these requests. +- if(sizeof(void*) == 8 && (uintptr)v >= 0xffffffffU) { ++ if(!do_reserve) { + p = mmap_fixed(v, 64<<10, PROT_NONE, MAP_ANON|MAP_PRIVATE, fd, 0); + if (p != v) + return nil; +@@ -149,7 +149,7 @@ runtime_SysReserve(void *v, uintptr n) + } + + void +-runtime_SysMap(void *v, uintptr n) ++runtime_SysMap(void *v, uintptr n, bool is_reserved) + { + void *p; + int fd = -1; +@@ -168,7 +168,7 @@ runtime_SysMap(void *v, uintptr n) + #endif + + // On 64-bit, we don't actually have v reserved, so tread carefully. +- if(sizeof(void*) == 8 && (uintptr)v >= 0xffffffffU) { ++ if(!is_reserved) { + p = mmap_fixed(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, fd, 0); + if(p == MAP_FAILED && errno == ENOMEM) + runtime_throw("runtime: out of memory"); +--- a/src/libgo/runtime/mgc0.c ++++ b/src/libgo/runtime/mgc0.c +@@ -2483,6 +2483,6 @@ runtime_MHeap_MapBits(MHeap *h) + page_size = getpagesize(); + n = (n+page_size-1) & ~(page_size-1); + +- runtime_SysMap(h->arena_start - n, n - h->bitmap_mapped); ++ runtime_SysMap(h->arena_start - n, n - h->bitmap_mapped, h->is_reserved); + h->bitmap_mapped = n; + } --- gcc-4.8-4.8.2.orig/debian/patches/libgo-revert-timeout-exp.diff +++ gcc-4.8-4.8.2/debian/patches/libgo-revert-timeout-exp.diff @@ -0,0 +1,10 @@ +--- a/src/libgo/testsuite/lib/libgo.exp ++++ b/src/libgo/testsuite/lib/libgo.exp +@@ -43,7 +43,6 @@ + load_gcc_lib target-libpath.exp + load_gcc_lib wrapper.exp + load_gcc_lib gcc-defs.exp +-load_gcc_lib timeout.exp + load_gcc_lib go.exp + + proc libgo_init { args } { --- gcc-4.8-4.8.2.orig/debian/patches/libgo-setcontext-config.diff +++ gcc-4.8-4.8.2/debian/patches/libgo-setcontext-config.diff @@ -0,0 +1,20 @@ +# DP: libgo: Overwrite the setcontext_clobbers_tls check on mips* + +--- a/src/libgo/configure.ac ++++ b/src/libgo/configure.ac +@@ -752,7 +752,15 @@ + CFLAGS="$CFLAGS_hold" + LIBS="$LIBS_hold" + ]) ++dnl overwrite for the mips* 64bit multilibs, fails on some buildds + if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then ++ case "$target" in ++ mips*-linux-*) ++ AC_MSG_WARN([FIXME: overwrite setcontext_clobbers_tls for $target:$ptr_type_size]) ++ libgo_cv_lib_setcontext_clobbers_tls=no ;; ++ esac ++fi ++if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then + AC_DEFINE(SETCONTEXT_CLOBBERS_TLS, 1, + [Define if setcontext clobbers TLS variables]) + fi --- gcc-4.8-4.8.2.orig/debian/patches/libgo-testsuite.diff +++ gcc-4.8-4.8.2/debian/patches/libgo-testsuite.diff @@ -0,0 +1,52 @@ +# DP: Only run the libgo testsuite for flags configured in RUNTESTFLAGS + +Index: b/src/libgo/Makefile.am +=================================================================== +--- a/src/libgo/Makefile.am ++++ b/src/libgo/Makefile.am +@@ -1958,6 +1958,12 @@ + export LD_LIBRARY_PATH; \ + $(MKDIR_P) $(@D); \ + rm -f $@-testsum $@-testlog; \ ++ run_check=yes; \ ++ MULTILIBDIR="$(MULTILIBDIR)"; \ ++ case "$$MULTILIBDIR" in /64|/x32) \ ++ echo "$$RUNTESTFLAGS" | grep -q "$${MULTILIBDIR\#/*}" || run_check=; \ ++ esac; \ ++ if test "$$run_check" = "yes"; then \ + if test "$(USE_DEJAGNU)" = "yes"; then \ + $(SHELL) $(srcdir)/testsuite/gotest --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \ + else \ +@@ -1971,6 +1977,7 @@ + echo "FAIL: $(@D)" > $@-testsum; \ + exit 1; \ + fi; \ ++ fi; \ + fi + + # Build all packages before checking any. +Index: b/src/libgo/Makefile.in +=================================================================== +--- a/src/libgo/Makefile.in ++++ b/src/libgo/Makefile.in +@@ -2039,6 +2039,12 @@ + export LD_LIBRARY_PATH; \ + $(MKDIR_P) $(@D); \ + rm -f $@-testsum $@-testlog; \ ++ run_check=yes; \ ++ MULTILIBDIR="$(MULTILIBDIR)"; \ ++ case "$$MULTILIBDIR" in /64|/x32) \ ++ echo "$$RUNTESTFLAGS" | grep -q "$${MULTILIBDIR\#/*}" || run_check=; \ ++ esac; \ ++ if test "$$run_check" = "yes"; then \ + if test "$(USE_DEJAGNU)" = "yes"; then \ + $(SHELL) $(srcdir)/testsuite/gotest --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \ + else \ +@@ -2052,6 +2058,7 @@ + echo "FAIL: $(@D)" > $@-testsum; \ + exit 1; \ + fi; \ ++ fi; \ + fi + + --- gcc-4.8-4.8.2.orig/debian/patches/libgomp-kfreebsd-testsuite.diff +++ gcc-4.8-4.8.2/debian/patches/libgomp-kfreebsd-testsuite.diff @@ -0,0 +1,15 @@ +# DP: Disable lock-2.c test on kfreebsd-* + +--- a/src/libgomp/testsuite/libgomp.c/lock-2.c ++++ b/src/libgomp/testsuite/libgomp.c/lock-2.c +@@ -4,6 +4,9 @@ + int + main (void) + { ++#ifdef __FreeBSD_kernel__ ++ return 1; ++#endif + int l = 0; + omp_nest_lock_t lock; + omp_init_nest_lock (&lock); + --- gcc-4.8-4.8.2.orig/debian/patches/libgomp-omp_h-multilib.diff +++ gcc-4.8-4.8.2/debian/patches/libgomp-omp_h-multilib.diff @@ -0,0 +1,19 @@ +# DP: Fix up omp.h for multilibs. + +2008-06-09 Jakub Jelinek + + * omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs. + +--- a/src/libgomp/omp.h.in ++++ b/src/libgomp/omp.h.in +@@ -39,8 +39,8 @@ + + typedef struct + { +- unsigned char _x[@OMP_NEST_LOCK_SIZE@] +- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@))); ++ unsigned char _x[8 + sizeof (void *)] ++ __attribute__((__aligned__(sizeof (void *)))); + } omp_nest_lock_t; + #endif + --- gcc-4.8-4.8.2.orig/debian/patches/libjava-armel-unwind.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-armel-unwind.diff @@ -0,0 +1,19 @@ +# DP: On armel, apply kludge to fix unwinder infinitely looping 'til it runs out +# DP: of memory (http://gcc.gnu.org/ml/java/2008-06/msg00010.html). + +--- + libjava/stacktrace.cc | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +--- a/src/libjava/stacktrace.cc ++++ b/src/libjava/stacktrace.cc +@@ -115,6 +115,9 @@ _Jv_StackTrace::UnwindTraceFn (struct _Unwind_Context *context, void *state_ptr) + // Check if the trace buffer needs to be extended. + if (pos == state->length) + { ++ // http://gcc.gnu.org/ml/java/2008-06/msg00010.html ++ return _URC_END_OF_STACK; ++ + int newLength = state->length * 2; + void *newFrames = _Jv_AllocBytes (newLength * sizeof(_Jv_StackFrame)); + memcpy (newFrames, state->frames, state->length * sizeof(_Jv_StackFrame)); --- gcc-4.8-4.8.2.orig/debian/patches/libjava-disable-plugin.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-disable-plugin.diff @@ -0,0 +1,15 @@ +# DP: Don't build the gcjwebplugin, even when configured with --enable-plugin + +Index: b/src/libjava/configure.ac +=================================================================== +--- a/src/libjava/configure.ac ++++ b/src/libjava/configure.ac +@@ -67,6 +67,8 @@ + esac], + [browser_plugin_enabled=no] + ) ++# FIXME: don't build the plugin, this option collides with GCC plugin support ++plugin_enabled=no + + AC_ARG_ENABLE(gconf-peer, + AS_HELP_STRING([--enable-gconf-peer], --- gcc-4.8-4.8.2.orig/debian/patches/libjava-fixed-symlinks.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-fixed-symlinks.diff @@ -0,0 +1,28 @@ +# DP: Remove unneed '..' elements from symlinks in JAVA_HOME + +Index: b/src/libjava/Makefile.am +=================================================================== +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -828,7 +828,7 @@ + $(mkinstalldirs) $(DESTDIR)$(SDK_INCLUDE_DIR)/$(OS) + relative() { \ + $(PERL) -e 'use File::Spec; \ +- print File::Spec->abs2rel($$ARGV[0], $$ARGV[1])' $$1 $$2; \ ++ print File::Spec->abs2rel($$ARGV[0], $$ARGV[1])' $$1 $$2 | sed -r 's,(bin|lib)[^/]*/\.\./,,'; \ + }; \ + RELATIVE=$$(relative $(DESTDIR)$(bindir) $(DESTDIR)$(SDK_BIN_DIR)); \ + ln -sf $$RELATIVE/`echo gij | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'` \ +Index: b/src/libjava/Makefile.in +=================================================================== +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -12475,7 +12475,7 @@ + @CREATE_JAVA_HOME_TRUE@ $(mkinstalldirs) $(DESTDIR)$(SDK_INCLUDE_DIR)/$(OS) + @CREATE_JAVA_HOME_TRUE@ relative() { \ + @CREATE_JAVA_HOME_TRUE@ $(PERL) -e 'use File::Spec; \ +-@CREATE_JAVA_HOME_TRUE@ print File::Spec->abs2rel($$ARGV[0], $$ARGV[1])' $$1 $$2; \ ++@CREATE_JAVA_HOME_TRUE@ print File::Spec->abs2rel($$ARGV[0], $$ARGV[1])' $$1 $$2 | sed -r 's,(bin|lib)[^/]*/\.\./,,'; \ + @CREATE_JAVA_HOME_TRUE@ }; \ + @CREATE_JAVA_HOME_TRUE@ RELATIVE=$$(relative $(DESTDIR)$(bindir) $(DESTDIR)$(SDK_BIN_DIR)); \ + @CREATE_JAVA_HOME_TRUE@ ln -sf $$RELATIVE/`echo gij | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'` \ --- gcc-4.8-4.8.2.orig/debian/patches/libjava-jnipath.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-jnipath.diff @@ -0,0 +1,129 @@ +# DP: - Add /usr/lib/jni and /usr/lib//jni to java.library.path. +# DP: - When running the i386 binaries on amd64, look in +# DP: - /usr/lib32/gcj-x.y and /usr/lib32/jni instead. + +Index: b/src/libjava/configure.ac +=================================================================== +--- a/src/libjava/configure.ac ++++ b/src/libjava/configure.ac +@@ -1525,6 +1525,9 @@ + + AC_C_BIGENDIAN + ++MULTIARCH_DIR=$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null || true) ++AC_SUBST(MULTIARCH_DIR) ++ + ZLIBS= + SYS_ZLIBS= + ZINCS= +Index: b/src/libjava/Makefile.am +=================================================================== +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -362,6 +362,7 @@ + $(WARNINGS) \ + -D_GNU_SOURCE \ + -DPREFIX="\"$(prefix)\"" \ ++ -DMULTIARCH_DIR="\"$(MULTIARCH_DIR)\"" \ + -DTOOLEXECLIBDIR="\"$(toolexeclibdir)\"" \ + -DJAVA_HOME="\"$(JAVA_HOME_DIR)\"" \ + -DBOOT_CLASS_PATH="\"$(BOOT_CLASS_PATH_DIR)\"" \ +Index: b/src/libjava/Makefile.in +=================================================================== +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -631,6 +631,7 @@ + MAKE = @MAKE@ + MAKEINFO = @MAKEINFO@ + MKDIR_P = @MKDIR_P@ ++MULTIARCH_DIR = @MULTIARCH_DIR@ + NM = nm + NMEDIT = @NMEDIT@ + OBJDUMP = @OBJDUMP@ +@@ -1013,6 +1014,7 @@ + $(WARNINGS) \ + -D_GNU_SOURCE \ + -DPREFIX="\"$(prefix)\"" \ ++ -DMULTIARCH_DIR="\"$(MULTIARCH_DIR)\"" \ + -DTOOLEXECLIBDIR="\"$(toolexeclibdir)\"" \ + -DJAVA_HOME="\"$(JAVA_HOME_DIR)\"" \ + -DBOOT_CLASS_PATH="\"$(BOOT_CLASS_PATH_DIR)\"" \ +Index: b/src/libjava/gnu/classpath/natSystemProperties.cc +=================================================================== +--- a/src/libjava/gnu/classpath/natSystemProperties.cc ++++ b/src/libjava/gnu/classpath/natSystemProperties.cc +@@ -141,6 +141,44 @@ + return retval; + } + ++static char* ++AppendJniLibdir (char *path, struct utsname *u) ++{ ++ char* retval; ++ const char* jnilibdir = "/usr/lib/jni"; ++#ifdef MULTIARCH_DIR ++ const char* jnilibdir2 = "/usr/lib/" MULTIARCH_DIR "/jni"; ++ jsize len2 = strlen (jnilibdir2) + 2; ++#else ++ jsize len2 = 0; ++#endif ++ ++#if defined(__linux__) && defined (__i386__) ++ if (! strcmp ("x86_64", u->machine)) ++ jnilibdir = "/usr/lib32/jni"; ++#endif ++ ++ if (path) ++ { ++ jsize total = strlen (path) ++ + (sizeof (PATH_SEPARATOR) - 1) + strlen (jnilibdir) +len2 + 1; ++ retval = (char*) _Jv_Malloc (total); ++ strcpy (retval, path); ++ strcat (retval, PATH_SEPARATOR); ++ strcat (retval, jnilibdir); ++ } ++ else ++ { ++ retval = (char*) _Jv_Malloc (strlen (jnilibdir) + len2 + 1); ++ strcpy (retval, jnilibdir); ++ } ++#ifdef MULTIARCH_DIR ++ strcat (retval, PATH_SEPARATOR); ++ strcat (retval, jnilibdir2); ++#endif ++ return retval; ++} ++ + void + gnu::classpath::SystemProperties::insertSystemProperties (::java::util::Properties *newprops) + { +@@ -373,8 +411,13 @@ + // Prepend GCJ_VERSIONED_LIBDIR to the module load path so that + // libgcj will find its own JNI libraries, like libgtkpeer.so. + char* val = PrependVersionedLibdir (path); +- _Jv_SetDLLSearchPath (val); ++ ++ // Append jnilibdir ++ char* val2 = AppendJniLibdir (val, &u); ++ ++ _Jv_SetDLLSearchPath (val2); + _Jv_Free (val); ++ _Jv_Free (val2); + } + else + { +@@ -382,9 +425,12 @@ + #ifdef USE_LTDL + char *libpath = getenv (LTDL_SHLIBPATH_VAR); + char* val = _Jv_PrependVersionedLibdir (libpath); +- SET ("java.library.path", val); +- _Jv_SetDLLSearchPath (val); ++ // Append jnilibdir ++ char* val2 = AppendJniLibdir (val, &u); ++ SET ("java.library.path", val2); ++ _Jv_SetDLLSearchPath (val2); + _Jv_Free (val); ++ _Jv_Free (val2); + #else + SET ("java.library.path", ""); + #endif --- gcc-4.8-4.8.2.orig/debian/patches/libjava-multiarch.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-multiarch.diff @@ -0,0 +1,82 @@ +# DP: Install libjava libraries to multiarch location + +Index: b/src/libjava/configure.ac +=================================================================== +--- a/src/libjava/configure.ac ++++ b/src/libjava/configure.ac +@@ -1585,6 +1585,10 @@ + .) toolexeclibdir=$toolexecmainlibdir ;; # Avoid trailing /. + *) toolexeclibdir=$toolexecmainlibdir/$multi_os_directory ;; + esac ++ multiarch=`$CC -print-multiarch` ++ if test -n "$multiarch"; then ++ toolexeclibdir=$toolexecmainlibdir/$multiarch ++ fi + ;; + esac + AC_SUBST(toolexecdir) +@@ -1610,6 +1614,10 @@ + dbexecdir='$(libdir)/'$multi_os_directory/$gcjsubdir + ;; + esac ++multiarch=`$CC -print-multiarch` ++if test -n "$multiarch"; then ++ dbexecdir='$(libdir)/'$multiarch/$gcjsubdir ++fi + AC_SUBST(dbexecdir) + AC_SUBST(gcjsubdir) + +Index: b/src/libjava/Makefile.am +=================================================================== +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -371,7 +371,7 @@ + -DGCJ_VERSIONED_LIBDIR="\"$(dbexecdir)\"" \ + -DPATH_SEPARATOR="\"$(CLASSPATH_SEPARATOR)\"" \ + -DECJ_JAR_FILE="\"$(ECJ_JAR)\"" \ +- -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\"" \ ++ -DLIBGCJ_DEFAULT_DATABASE="\"/var/lib/$(MULTIARCH_DIR)/gcj-4.8/$(db_name)\"" \ + -DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL="\"$(db_pathtail)\"" + + AM_GCJFLAGS = \ +Index: b/src/libjava/Makefile.in +=================================================================== +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -1023,7 +1023,7 @@ + -DGCJ_VERSIONED_LIBDIR="\"$(dbexecdir)\"" \ + -DPATH_SEPARATOR="\"$(CLASSPATH_SEPARATOR)\"" \ + -DECJ_JAR_FILE="\"$(ECJ_JAR)\"" \ +- -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\"" \ ++ -DLIBGCJ_DEFAULT_DATABASE="\"/var/lib/$(MULTIARCH_DIR)/gcj-4.8/$(db_name)\"" \ + -DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL="\"$(db_pathtail)\"" + + AM_GCJFLAGS = \ +Index: b/src/libjava/classpath/m4/acinclude.m4 +=================================================================== +--- a/src/libjava/classpath/m4/acinclude.m4 ++++ b/src/libjava/classpath/m4/acinclude.m4 +@@ -254,6 +254,10 @@ + .) toolexeclibdir=${libdir} ;; # Avoid trailing /. + *) toolexeclibdir=${libdir}/${multi_os_directory} ;; + esac ++ multiarch=`$CC -print-multiarch` ++ if test -n "$multiarch"; then ++ toolexeclibdir=${libdir}/${multiarch} ++ fi + AC_SUBST(toolexeclibdir) + ]) + +Index: b/src/libjava/classpath/configure.ac +=================================================================== +--- a/src/libjava/classpath/configure.ac ++++ b/src/libjava/classpath/configure.ac +@@ -16,6 +16,8 @@ + + AC_CANONICAL_TARGET + ++dnl dummy change to run autoconf ++ + dnl GCJ LOCAL + AC_ARG_ENABLE(java-maintainer-mode, + AS_HELP_STRING([--enable-java-maintainer-mode], --- gcc-4.8-4.8.2.orig/debian/patches/libjava-nobiarch-check.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-nobiarch-check.diff @@ -0,0 +1,25 @@ +# DP: For biarch builds, disable the testsuite for the non-default architecture +# DP: for runtime libraries, which are not built by default (libjava). + +--- + libjava/testsuite/Makefile.in | 4 +++- + 2 files changed, 25 insertions(+), 1 deletions(-) + +--- a/src/libjava/testsuite/Makefile.in ++++ b/src/libjava/testsuite/Makefile.in +@@ -381,12 +381,14 @@ + + + check-DEJAGNU: site.exp ++ runtestflags="`echo '$(RUNTESTFLAGS)' | sed -r 's/,-m(32|64|x32)//g;s/,-mabi=(n32|64)//g'`"; \ ++ case "$$runtestflags" in *\\{\\}) runtestflags=; esac; \ + srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ +- if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ ++ if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $$runtestflags; \ + then :; else exit_status=1; fi; \ + done; \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ --- gcc-4.8-4.8.2.orig/debian/patches/libjava-rpath.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-rpath.diff @@ -0,0 +1,29 @@ +# DP: - Link ecjx with -rpath $(dbexecdir) + +--- + libjava/Makefile.am | 2 +- + libjava/Makefile.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/src/libjava/Makefile.am ++++ b/src/libjava/Makefile.am +@@ -888,7 +888,7 @@ else !ENABLE_SHARED + ecjx_LDFLAGS = $(ECJX_BASE_FLAGS) $(ECJ_BUILD_JAR) -fbootclasspath=$(BOOTCLASSPATH) + endif !ENABLE_SHARED + +-ecjx_LDADD = -L$(here)/.libs $(extra_ldflags) ++ecjx_LDADD = -L$(here)/.libs $(extra_ldflags) -rpath $(dbexecdir) + ecjx_DEPENDENCIES = libgcj.la libgcj.spec + if USE_LIBGCJ_BC + ecjx_DEPENDENCIES += libgcj_bc.la +--- a/src/libjava/Makefile.in ++++ b/src/libjava/Makefile.in +@@ -8360,7 +8360,7 @@ ECJX_BASE_FLAGS = -findirect-dispatch \ + @NATIVE_FALSE@ecjx_LDFLAGS = $(ECJX_BASE_FLAGS) $(ECJ_BUILD_JAR) + @NATIVE_FALSE@ecjx_LDADD = + @NATIVE_TRUE@ecjx_LDADD = -L$(here)/.libs $(extra_ldflags) \ +-@NATIVE_TRUE@ $(am__append_21) ++@NATIVE_TRUE@ $(am__append_21) -rpath $(dbexecdir) + @NATIVE_FALSE@ecjx_DEPENDENCIES = + @NATIVE_TRUE@ecjx_DEPENDENCIES = libgcj.la libgcj.spec \ + @NATIVE_TRUE@ $(am__append_20) --- gcc-4.8-4.8.2.orig/debian/patches/libjava-sjlj.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-sjlj.diff @@ -0,0 +1,40 @@ +# DP: Don't try to use _Unwind_Backtrace on SJLJ targets. +# DP: See bug #387875, #388505, GCC PR 29206. + +--- + libjava/sysdep/generic/backtrace.h | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +Index: b/src/libjava/sysdep/generic/backtrace.h +=================================================================== +--- a/src/libjava/sysdep/generic/backtrace.h ++++ b/src/libjava/sysdep/generic/backtrace.h +@@ -13,6 +13,20 @@ + + #include + ++#ifdef SJLJ_EXCEPTIONS ++ ++#undef _Unwind_GetIPInfo ++#define _Unwind_GetIPInfo(ctx,ip_before_insn) \ ++ (abort (), (void) (ctx), *ip_before_insn = 1, 0) ++ ++#undef _Unwind_GetRegionStart ++#define _Unwind_GetRegionStart(ctx) \ ++ (abort (), (void) (ctx), 0) ++ ++#undef _Unwind_Backtrace ++#define _Unwind_Backtrace(trace_fn,state_ptr) \ ++ (fallback_backtrace (trace_fn, state_ptr)) ++ + /* Unwind through the call stack calling TRACE_FN with STATE for every stack + frame. Returns the reason why the unwinding was stopped. */ + _Unwind_Reason_Code +@@ -20,4 +34,7 @@ + { + return _URC_NO_REASON; + } ++ ++#endif /* SJLJ_EXCEPTIONS */ ++ + #endif --- gcc-4.8-4.8.2.orig/debian/patches/libjava-stacktrace.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-stacktrace.diff @@ -0,0 +1,50 @@ +# DP: libgcj: Lookup source file name and line number in separated +# DP: debug files found in /usr/lib/debug + +--- + libjava/stacktrace.cc | 27 +++++++++++++++++++++++++++ + 1 files changed, 27 insertions(+), 0 deletions(-) + +--- a/src/libjava/stacktrace.cc ++++ b/src/libjava/stacktrace.cc +@@ -17,6 +17,11 @@ + #include + + #include ++#include ++#include ++#ifdef HAVE_UNISTD_H ++#include ++#endif + + #include + #include +@@ -260,6 +265,28 @@ + finder->lookup (binaryName, (jlong) offset); + *sourceFileName = finder->getSourceFile(); + *lineNum = finder->getLineNum(); ++ if (*lineNum == -1 && info.file_name[0] == '/') ++ { ++ const char *debugPrefix = "/usr/lib/debug"; ++ char *debugPath = (char *) malloc (strlen(debugPrefix) ++ + strlen(info.file_name) ++ + 2); ++ ++ if (debugPath) ++ { ++ strcpy (debugPath, debugPrefix); ++ strcat (debugPath, info.file_name); ++ //printf ("%s: 0x%x\n", debugPath, offset); ++ if (!access (debugPath, R_OK)) ++ { ++ binaryName = JvNewStringUTF (debugPath); ++ finder->lookup (binaryName, (jlong) offset); ++ *sourceFileName = finder->getSourceFile(); ++ *lineNum = finder->getLineNum(); ++ } ++ free (debugPath); ++ } ++ } + if (*lineNum == -1 && NameFinder::showRaw()) + { + gnu::gcj::runtime::StringBuffer *t = --- gcc-4.8-4.8.2.orig/debian/patches/libjava-testsuite.diff +++ gcc-4.8-4.8.2/debian/patches/libjava-testsuite.diff @@ -0,0 +1,6 @@ +# DP: Mark libjava sourcelocation test as failing. PR libjava/55637 + +--- a/src/libjava/testsuite/libjava.lang/sourcelocation.xfail ++++ b/src/libjava/testsuite/libjava.lang/sourcelocation.xfail +@@ -0,0 +1 @@ ++xfail-output --- gcc-4.8-4.8.2.orig/debian/patches/libstdc++-arm-wno-abi.diff +++ gcc-4.8-4.8.2/debian/patches/libstdc++-arm-wno-abi.diff @@ -0,0 +1,18 @@ +# DP: Temporary work around: +# DP: On arm-linux-gnueabi run the libstdc++v3 testsuite with -Wno-abi + +Index: b/src/libstdc++-v3/testsuite/lib/libstdc++.exp +=================================================================== +--- a/src/libstdc++-v3/testsuite/lib/libstdc++.exp ++++ b/src/libstdc++-v3/testsuite/lib/libstdc++.exp +@@ -288,6 +288,10 @@ + } + append cxxflags " " + append cxxflags [getenv CXXFLAGS] ++ # ARM C++ emits an ABI warning for varargs. ++ if [istarget "arm*"] { ++ append cxxflags " -Wno-abi" ++ } + v3track cxxflags 2 + + # Always use MO files built by this test harness. --- gcc-4.8-4.8.2.orig/debian/patches/libstdc++-doclink.diff +++ gcc-4.8-4.8.2/debian/patches/libstdc++-doclink.diff @@ -0,0 +1,63 @@ +# DP: adjust hrefs to point to the local documentation + +--- + libstdc++-v3/doc/doxygen/mainpage.html | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +Index: b/src/libstdc++-v3/doc/doxygen/mainpage.html +=================================================================== +--- a/src/libstdc++-v3/doc/doxygen/mainpage.html ++++ b/src/libstdc++-v3/doc/doxygen/mainpage.html +@@ -29,8 +29,8 @@ +

There are two types of documentation for libstdc++. One is the + distribution documentation, which can be read online + here +- or offline from the file doc/html/index.html in the library source +- directory. ++ or offline in the documentation directory ++ here. +

+ +

The other type is the source documentation, of which this is the first page. +@@ -81,9 +81,9 @@ + This style guide can also be viewed on the web. + +

License, Copyright, and Other Lawyerly Verbosity

+-

The libstdc++ documentation is released under +- +- these terms. ++

The libstdc++ documentation is released under these terms ++ (read online, or ++ read offline). +

+

Part of the generated documentation involved comments and notes from + SGI, who says we gotta say this: +Index: b/src/libstdc++-v3/doc/html/api.html +=================================================================== +--- a/src/libstdc++-v3/doc/html/api.html ++++ b/src/libstdc++-v3/doc/html/api.html +@@ -18,6 +18,8 @@ + member functions for the library classes, finding out what is in a + particular include file, looking at inheritance diagrams, etc. +

++ ++

+ The API documentation, rendered into HTML, can be viewed online: +

+-



Table of Contents

The GNU C++ Library Manual
I. + Introduction + +
1. Status
Implementation Status
C++ 1998/2003
Implementation Status
Implementation Specific Behavior
C++ 2011
Implementation Specific Behavior
C++ TR1
Implementation Specific Behavior
C++ TR 24733
License
The Code: GPL
The Documentation: GPL, FDL
Bugs
Implementation Bugs
Standard Bugs
2. Setup
Prerequisites
Configure
Make
3. Using
Command Options
Headers
Header Files
Mixing Headers
The C Headers and namespace std
Precompiled Headers
Macros
Namespaces
Available Namespaces
namespace std
Using Namespace Composition
Linking
Almost Nothing
Finding Dynamic or Shared Libraries
Concurrency
Prerequisites
Thread Safety
Atomics
IO
Structure
Defaults
Future
Alternatives
Containers
Exceptions
Exception Safety
Exception Neutrality
Doing without
Compatibility
With C
With POSIX thread cancellation
Debugging Support
Using g++
Debug Versions of Library Binary Files
Memory Leak Hunting
Data Race Hunting
Using gdb
Tracking uncaught exceptions
Debug Mode
Compile Time Checking
Profile-based Performance Analysis
II. +@@ -34,13 +34,13 @@ +
Exceptions
API Reference
Adding Data to exception
Concept Checking
6. + Utilities + +-
Functors
Pairs
Memory
Allocators
Requirements
Design Issues
Implementation
Interface Design
Selecting Default Allocation Policy
Disabling Memory Caching
Using a Specific Allocator
Custom Allocators
Extension Allocators
auto_ptr
Limitations
Use in Containers
shared_ptr
Requirements
Design Issues
Implementation
Class Hierarchy
Thread Safety
Selecting Lock Policy
Related functions and classes
Use
Examples
Unresolved Issues
Acknowledgments
Traits
7. ++
Functors
Pairs
Memory
Allocators
Requirements
Design Issues
Implementation
Interface Design
Selecting Default Allocation Policy
Disabling Memory Caching
Using a Specific Allocator
Custom Allocators
Extension Allocators
auto_ptr
Limitations
Use in Containers
shared_ptr
Requirements
Design Issues
Implementation
Class Hierarchy
Thread Safety
Selecting Lock Policy
Related functions and classes
Use
Examples
Unresolved Issues
Acknowledgments
Traits
7. + Strings + +
String Classes
Simple Transformations
Case Sensitivity
Arbitrary Character Types
Tokenizing
Shrink to Fit
CString (MFC)
8. + Localization + +-
Locales
locale
Requirements
Design
Implementation
Interacting with "C" locales
Future
Facets
ctype
Implementation
Specializations
Future
codecvt
Requirements
Design
wchar_t Size
Support for Unicode
Other Issues
Implementation
Use
Future
messages
Requirements
Design
Implementation
Models
The GNU Model
Use
Future
9. ++
Locales
locale
Requirements
Design
Implementation
Interacting with "C" locales
Future
Facets
ctype
Implementation
Specializations
Future
codecvt
Requirements
Design
wchar_t Size
Support for Unicode
Other Issues
Implementation
Use
Future
messages
Requirements
Design
Implementation
Models
The GNU Model
Use
Future
9. + Containers + +
Sequences
list
list::size() is O(n)
vector
Space Overhead Management
Associative
Insertion Hints
bitset
Size Variable
Type String
Unordered Associative
Hash Code
Hash Code Caching Policy
Interacting with C
Containers vs. Arrays
10. +Index: libstdc++-v3/doc/html/api.html +=================================================================== +--- a/src/libstdc++-v3/doc/html/api.html (.../tags/gcc_4_8_2_release) ++++ b/src/libstdc++-v3/doc/html/api.html (.../branches/gcc-4_8-branch) +@@ -1,5 +1,5 @@ + +-The GNU C++ Library API Reference

The GNU C++ Library API Reference

The GNU C++ Library API Reference

++


+Index: libstdc++-v3/doc/html/manual/dynamic_memory.html +=================================================================== +--- a/src/libstdc++-v3/doc/html/manual/dynamic_memory.html (.../tags/gcc_4_8_2_release) ++++ b/src/libstdc++-v3/doc/html/manual/dynamic_memory.html (.../branches/gcc-4_8-branch) +@@ -1,5 +1,5 @@ + +-Dynamic Memory